LMDZ
plevel.F90
Go to the documentation of this file.
1 
2 ! $Id: plevel.F90 2346 2015-08-21 15:13:46Z emillour $
3 
4 ! ================================================================
5 ! ================================================================
6 SUBROUTINE plevel(ilon, ilev, lnew, pgcm, pres, qgcm, qpres)
7  ! ================================================================
8  ! ================================================================
9  USE netcdf
10  USE dimphy
11 #ifdef CPP_IOIPSL
13 #endif
14 #ifdef CPP_XIOS
15  USE wxios, ONLY: missing_val
16 #endif
17  IMPLICIT NONE
18 
19  ! ================================================================
20 
21  ! Interpoler des champs 3-D u, v et g du modele a un niveau de
22  ! pression donnee (pres)
23 
24  ! INPUT: ilon ----- nombre de points
25  ! ilev ----- nombre de couches
26  ! lnew ----- true si on doit reinitialiser les poids
27  ! pgcm ----- pressions modeles
28  ! pres ----- pression vers laquelle on interpolle
29  ! Qgcm ----- champ GCM
30  ! Qpres ---- champ interpolle au niveau pres
31 
32  ! ================================================================
33 
34  ! arguments :
35  ! -----------
36 
37  INTEGER ilon, ilev
38  LOGICAL lnew
39 
40  REAL pgcm(ilon, ilev)
41  REAL qgcm(ilon, ilev)
42  REAL pres
43  REAL qpres(ilon)
44 
45  ! local :
46  ! -------
47 
48  ! ym INTEGER lt(klon), lb(klon)
49  ! ym REAL ptop, pbot, aist(klon), aisb(klon)
50 
51  ! ym save lt,lb,ptop,pbot,aist,aisb
52  INTEGER, ALLOCATABLE, SAVE, DIMENSION (:) :: lt, lb
53  REAL, ALLOCATABLE, SAVE, DIMENSION (:) :: aist, aisb
54  !$OMP THREADPRIVATE(lt,lb,aist,aisb)
55  REAL, SAVE :: ptop, pbot
56  !$OMP THREADPRIVATE(ptop, pbot)
57  LOGICAL, SAVE :: first = .true.
58  !$OMP THREADPRIVATE(first)
59  INTEGER i, k
60 
61 ! REAL missing_val
62 #ifndef CPP_XIOS
63  REAL :: missing_val
64 #endif
65 
66 ! missing_val = nf90_fill_real
67 
68 #ifndef CPP_XIOS
69  missing_val=missing_val_nf90
70 #endif
71 
72  IF (first) THEN
73  ALLOCATE (lt(klon), lb(klon), aist(klon), aisb(klon))
74  first = .false.
75  END IF
76 
77  ! =====================================================================
78  IF (lnew) THEN
79  ! on r�nitialise les r�ndicages et les poids
80  ! =====================================================================
81 
82 
83  ! Chercher les 2 couches les plus proches du niveau a obtenir
84 
85  ! Eventuellement, faire l'extrapolation a partir des deux couches
86  ! les plus basses ou les deux couches les plus hautes:
87  DO i = 1, klon
88  IF (abs(pres-pgcm(i,ilev))<abs(pres-pgcm(i,1))) THEN
89  lt(i) = ilev ! 2
90  lb(i) = ilev - 1 ! 1
91  ELSE
92  lt(i) = 2
93  lb(i) = 1
94  END IF
95  END DO
96  DO k = 1, ilev - 1
97  DO i = 1, klon
98  pbot = pgcm(i, k)
99  ptop = pgcm(i, k+1)
100  IF (ptop<=pres .AND. pbot>=pres) THEN
101  lt(i) = k + 1
102  lb(i) = k
103  END IF
104  END DO
105  END DO
106 
107  ! Interpolation lineaire:
108 
109  DO i = 1, klon
110  ! interpolation en logarithme de pression:
111 
112  ! ... Modif . P. Le Van ( 20/01/98) ....
113  ! Modif Fr��ic Hourdin (3/01/02)
114 
115  aist(i) = log(pgcm(i,lb(i))/pres)/log(pgcm(i,lb(i))/pgcm(i,lt(i)))
116  aisb(i) = log(pres/pgcm(i,lt(i)))/log(pgcm(i,lb(i))/pgcm(i,lt(i)))
117  END DO
118 
119 
120  END IF ! lnew
121 
122  ! ======================================================================
123  ! inteprollation
124  ! ======================================================================
125 
126  DO i = 1, klon
127  qpres(i) = qgcm(i, lb(i))*aisb(i) + qgcm(i, lt(i))*aist(i)
128  END DO
129 
130  ! Je mets les vents a zero quand je rencontre une montagne
131  DO i = 1, klon
132  IF (pgcm(i,1)<pres) THEN
133  qpres(i) = missing_val
134  END IF
135  END DO
136 
137 
138  RETURN
139 END SUBROUTINE plevel
integer, save klon
Definition: dimphy.F90:3
real, parameter missing_val_nf90
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL false
Definition: calcul_STDlev.h:26
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL ulevSTD CALL &zphi philevSTD CALL &zx_rh rhlevSTD!DO klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon du jour ou toutes les read_climoz CALL true
Definition: dimphy.F90:1
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL ulevSTD CALL &zphi philevSTD CALL &zx_rh rhlevSTD!DO klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon du jour ou toutes les read_climoz CALL &zphi geo500!IM on interpole a chaque pas de temps le SWdn200clr CALL plevel(klon, klevp1,.false., paprs, 20000.,&swdn, SWdn200) CALL plevel(klon