/[lmdze]/trunk/phylmd/nflxtr.f
ViewVC logotype

Annotation of /trunk/phylmd/nflxtr.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 82 - (hide annotations)
Wed Mar 5 14:57:53 2014 UTC (10 years, 2 months ago) by guez
File size: 4788 byte(s)
Changed all ".f90" suffixes to ".f".
1 guez 78 module nflxtr_m
2 guez 62
3 guez 78 IMPLICIT NONE
4 guez 62
5 guez 78 contains
6 guez 3
7 guez 78 SUBROUTINE nflxtr(pdtime, pmfu, pmfd, pde_u, pen_d, paprs, x, dx)
8 guez 3
9 guez 78 ! From LMDZ4/libf/phylmd/nflxtr.F, version 1.1.1.1 2004/05/19 12:53:08
10 guez 3
11 guez 78 ! Objet : mélange convectif de traceurs à partir des flux de masse
12     ! Date : 13/12/1996 -- 13/01/97
13 guez 3
14 guez 78 ! Auteur : O. Boucher (LOA) sur inspiration de Z. X. Li (LMD),
15     ! Brinkop et Sausen (1996) et Boucher et al. (1996).
16 guez 3
17 guez 78 ! Attention, même si cette routine se veut la plus générale
18     ! possible, elle a herité de certaines notations et conventions du
19     ! schéma de Tiedtke (1993) :
20 guez 63
21 guez 78 ! -- les couches sont numerotées de haut en bas pour les flux mais
22     ! pas pour les entrées x, paprs ;
23 guez 63
24 guez 78 ! -- pmfu est positif, pmfd est négatif ;
25 guez 63
26 guez 78 ! -- tous les flux d'entraînement et de détraînement sont positifs
27     ! contrairement au schéma de Tiedtke, d'où les changements de
28     ! signe.
29 guez 63
30 guez 78 USE dimphy, ONLY: klev, klon
31     USE suphec_m, ONLY: rg
32    
33     REAL, intent(in):: pdtime
34    
35     ! les flux sont définis aux demi-niveaux
36     ! pmfu(klev+1) et pmfd(klev+1) sont implicitement nuls
37    
38     REAL, intent(in):: pmfu(klon, klev) ! flux de masse dans le panache montant
39    
40     REAL, intent(in):: pmfd(klon, klev)
41     ! flux de masse dans le panache descendant
42    
43     REAL, intent(in):: pde_u(klon, klev) ! flux detraine dans le panache montant
44    
45     REAL, intent(in):: pen_d(klon, klev)
46     ! flux entraine dans le panache descendant
47    
48     REAL, intent(in):: paprs(klon, klev+1)
49     ! pression aux 1/2 couches (bas en haut)
50    
51     REAL, intent(in):: x(klon, klev) ! q de traceur (bas en haut)
52     REAL, intent(out):: dx(klon, klev) ! tendance de traceur (bas en haut)
53    
54     ! Local:
55    
56     ! flux convectifs mais en variables locales
57     REAL zmfu(klon, klev+1)
58     REAL zmfd(klon, klev+1)
59     REAL zen_u(klon, klev)
60     REAL zde_u(klon, klev)
61     REAL zen_d(klon, klev)
62     REAL zde_d(klon, klev)
63     real zmfe
64    
65     ! les flux de x sont definis aux 1/2 niveaux
66     ! xu et xd sont definis aux niveaux complets
67     REAL xu(klon, klev) ! q de traceurs dans le panache montant
68     REAL xd(klon, klev) ! q de traceurs dans le panache descendant
69     REAL zmfux(klon, klev+1) ! flux de x dans le panache montant
70     REAL zmfdx(klon, klev+1) ! flux de x dans le panache descendant
71     REAL zmfex(klon, klev+1) ! flux de x dans l'environnement
72     INTEGER i, k
73     REAL zmfmin
74     PARAMETER (zmfmin=1.E-10)
75    
76     ! -----------------------------------------------------------------
77    
78     ! Extension des flux UP et DN sur klev+1 niveaux
79    
80     do k=1, klev
81     do i=1, klon
82     zmfu(i, k)=pmfu(i, k)
83     zmfd(i, k)=pmfd(i, k)
84     enddo
85     enddo
86     do i=1, klon
87     zmfu(i, klev+1)=0.
88     zmfd(i, klev+1)=0.
89     enddo
90    
91     ! modif pour diagnostiquer les detrainements
92    
93     ! on privilegie l'ajustement de l'entrainement dans l'ascendance.
94    
95     do k=1, klev
96     do i=1, klon
97     zen_d(i, k)=pen_d(i, k)
98     zde_u(i, k)=pde_u(i, k)
99     zde_d(i, k) =-zmfd(i, k+1)+zmfd(i, k)+zen_d(i, k)
100     zen_u(i, k) = zmfu(i, k+1)-zmfu(i, k)+zde_u(i, k)
101     enddo
102     enddo
103    
104     ! calcul des flux dans le panache montant
105    
106     ! Dans la premiere couche, on prend q comme valeur de qu
107    
108     do i=1, klon
109     zmfux(i, 1)=0.0
110     enddo
111    
112     ! Autres couches
113     do k=1, klev
114     do i=1, klon
115     if ((zmfu(i, k+1)+zde_u(i, k)).lt.zmfmin) THEN
116     xu(i, k)=x(i, k)
117     else
118     xu(i, k)=(zmfux(i, k)+zen_u(i, k)*x(i, k)) &
119     /(zmfu(i, k+1)+zde_u(i, k))
120     endif
121     zmfux(i, k+1)=zmfu(i, k+1)*xu(i, k)
122     enddo
123     enddo
124    
125     ! calcul des flux dans le panache descendant
126    
127     do i=1, klon
128     zmfdx(i, klev+1)=0.0
129     enddo
130    
131     do k=klev, 1, -1
132     do i=1, klon
133     if ((zde_d(i, k)-zmfd(i, k)).lt.zmfmin) THEN
134     xd(i, k)=x(i, k)
135     else
136     xd(i, k)=(zmfdx(i, k+1)-zen_d(i, k)*x(i, k)) / &
137     (zmfd(i, k)-zde_d(i, k))
138     endif
139     zmfdx(i, k)=zmfd(i, k)*xd(i, k)
140     enddo
141     enddo
142    
143     ! introduction du flux de retour dans l'environnement
144    
145     do k=2, klev
146     do i=1, klon
147     zmfe=-zmfu(i, k)-zmfd(i, k)
148     if (zmfe.le.0.) then
149     zmfex(i, k)= zmfe*x(i, k)
150     else
151     zmfex(i, k)= zmfe*x(i, k-1)
152     endif
153     enddo
154     enddo
155    
156     do i=1, klon
157     zmfex(i, 1)=0.
158     zmfex(i, klev+1)=0.
159     enddo
160    
161     ! calcul final des tendances
162    
163     do k=1, klev
164     do i=1, klon
165     dx(i, k)=RG/(paprs(i, k)-paprs(i, k+1))*pdtime* &
166     ( zmfux(i, k) - zmfux(i, k+1) + &
167     zmfdx(i, k) - zmfdx(i, k+1) + &
168     zmfex(i, k) - zmfex(i, k+1) )
169     enddo
170     enddo
171    
172     end SUBROUTINE nflxtr
173    
174     end module nflxtr_m

  ViewVC Help
Powered by ViewVC 1.1.21