1 | ! |
---|
2 | ! $Header: /home/cvsroot/LMDZ4/libf/phylmd/phytrac.F,v 1.16 2006/03/24 15:06:23 lmdzadmin Exp $ |
---|
3 | ! |
---|
4 | c |
---|
5 | c |
---|
6 | SUBROUTINE phytrac_relax (debutphy,lafin, |
---|
7 | I nqmax, |
---|
8 | I nlon, |
---|
9 | I nlev, |
---|
10 | I pdtphys, |
---|
11 | I pplay, |
---|
12 | O tr_seri) |
---|
13 | |
---|
14 | c====================================================================== |
---|
15 | c Auteur(s) FH |
---|
16 | c Objet: Moniteur general des tendances traceurs |
---|
17 | c |
---|
18 | cAA Remarques en vrac: |
---|
19 | cAA-------------------- |
---|
20 | cAA 1/ le call phytrac se fait avec nqmax |
---|
21 | c |
---|
22 | c SL: Janvier 2014 |
---|
23 | c Version developed by E. Marcq for pseudo-chemistry relaxation |
---|
24 | c See Marcq&Lebonnois 2013. |
---|
25 | c |
---|
26 | c====================================================================== |
---|
27 | USE infotrac_phy, ONLY: nqtot, tname |
---|
28 | use dimphy |
---|
29 | USE chemparam_mod,only:M_tr |
---|
30 | IMPLICIT none |
---|
31 | #include "YOMCST.h" |
---|
32 | #include "clesphys.h" |
---|
33 | c====================================================================== |
---|
34 | |
---|
35 | c Arguments: |
---|
36 | |
---|
37 | c EN ENTREE: |
---|
38 | c ========== |
---|
39 | |
---|
40 | logical debutphy ! le flag de l'initialisation de la physique |
---|
41 | logical lafin ! le flag de la fin de la physique |
---|
42 | integer nqmax ! nombre de traceurs auxquels on applique la physique |
---|
43 | integer nlon ! nombre de points horizontaux |
---|
44 | integer nlev ! nombre de couches verticales |
---|
45 | real pdtphys ! pas d'integration pour la physique (seconde) |
---|
46 | real pplay(nlon,nlev) ! pression pour le mileu de chaque couche (en Pa) |
---|
47 | |
---|
48 | c EN ENTREE/SORTIE: |
---|
49 | c ================= |
---|
50 | |
---|
51 | real tr_seri(nlon,nlev,nqmax) ! traceur |
---|
52 | |
---|
53 | cAA ---------------------------- |
---|
54 | cAA VARIABLES LOCALES TRACEURS |
---|
55 | cAA ---------------------------- |
---|
56 | |
---|
57 | C les traceurs |
---|
58 | |
---|
59 | c=================== |
---|
60 | c it--------indice de traceur |
---|
61 | c k,i---------indices long, vert |
---|
62 | c=================== |
---|
63 | c Variables deja declarees dont on a besoin pour traceurs |
---|
64 | c k,i,it,tr_seri(nlon,nlev,nqmax),pplay(nlon,nlev), |
---|
65 | integer nqCO_OCS |
---|
66 | c real pzero,gamma |
---|
67 | c parameter (pzero=85000.) |
---|
68 | c parameter (gamma=5000.) |
---|
69 | REAL alpha |
---|
70 | real deltatr(nlon,nlev,nqtot) ! ecart au profil de ref zprof |
---|
71 | real,save,allocatable :: zprof(:,:) |
---|
72 | real,save,allocatable :: tau(:,:) ! temps de relaxation vers le profil (s) |
---|
73 | c====================================================================== |
---|
74 | |
---|
75 | INTEGER i, k, it |
---|
76 | |
---|
77 | c Variables liees a l'ecriture de la bande histoire physique |
---|
78 | |
---|
79 | c Variables locales pour effectuer les appels en serie |
---|
80 | c---------------------------------------------------- |
---|
81 | |
---|
82 | REAL d_tr(nlon,nlev) ! tendances de traceurs |
---|
83 | |
---|
84 | character*20 modname |
---|
85 | character*80 abort_message |
---|
86 | |
---|
87 | c====================================================================== |
---|
88 | |
---|
89 | modname = 'phytrac_relax' |
---|
90 | c TRACEURS TYPE CO ET OCS |
---|
91 | nqCO_OCS = 6 |
---|
92 | |
---|
93 | c !!!!!! ATTENTION: A REVOIR / A VERIFIER |
---|
94 | c les traceurs sont en mass mixing ratio dans la dyn |
---|
95 | c et convertis en frac mol avec M_tr dans les sorties... |
---|
96 | c Mettre le profil de rappel en mass mixing ratio !! |
---|
97 | |
---|
98 | print*,"METTRE A JOUR phytrac_relax" |
---|
99 | stop |
---|
100 | |
---|
101 | c--------- |
---|
102 | c debutphy |
---|
103 | c--------- |
---|
104 | if (debutphy) then |
---|
105 | print*,"DEBUT PHYTRAC" |
---|
106 | print*,"PHYTRAC: RELAXATION" |
---|
107 | allocate(zprof(nlev,nqtot),tau(nlev,nqtot)) |
---|
108 | |
---|
109 | ALLOCATE(M_tr(nqtot)) |
---|
110 | |
---|
111 | c============================================================= |
---|
112 | c============================================================= |
---|
113 | c============================================================= |
---|
114 | c Initialisation des traceurs |
---|
115 | c============================================================= |
---|
116 | c============================================================= |
---|
117 | c============================================================= |
---|
118 | |
---|
119 | C========================================================================= |
---|
120 | C========================================================================= |
---|
121 | |
---|
122 | c II) Declaration d'un profil vertical de traceur OK |
---|
123 | c |
---|
124 | c zprof = profil de rappel |
---|
125 | c |
---|
126 | c 1 -> CO ; 2 -> OCS |
---|
127 | c def des profils en log(a) = a * log(P) + b par morceaux, cf. pollack et al |
---|
128 | c tr_seri en ppm |
---|
129 | c (initialisation seulement si ceux-ci sont nuls) |
---|
130 | |
---|
131 | c ICI, ON UTILISE 3 CONSTANTES DE TEMPS DIFFERENTES POUR CHAQUE, |
---|
132 | c DONC TRACEURS 1 A 3 POUR CO ET 4 A 6 POUR OCS |
---|
133 | C========================================================================= |
---|
134 | |
---|
135 | |
---|
136 | c Constantes de rappel: |
---|
137 | |
---|
138 | print*,"INIT TAU" |
---|
139 | do k=1,nlev |
---|
140 | tau(k,1)=1.e6 |
---|
141 | tau(k,2)=1.e7 |
---|
142 | tau(k,3)=1.e8 |
---|
143 | tau(k,4)=1.e6 |
---|
144 | tau(k,5)=1.e7 |
---|
145 | tau(k,6)=1.e8 |
---|
146 | enddo |
---|
147 | |
---|
148 | c CO |
---|
149 | |
---|
150 | do it=1,3 |
---|
151 | print*,"INIT ZPROF ",tname(it) |
---|
152 | M_tr(it)=28. ! CO |
---|
153 | do k=1,nlev |
---|
154 | zprof(k,it)=0. |
---|
155 | c pour l'instant, tau fixe, mais possibilite de le faire varier avec z |
---|
156 | if (pplay(nlon/2,k) >= 4.8e6) then |
---|
157 | zprof(k,it)=14. |
---|
158 | endif |
---|
159 | if ((pplay(nlon/2,k)<=4.8e6).and.(pplay(nlon/2,k)>=1.9e6)) then |
---|
160 | alpha=(log(pplay(nlon/2,k))-log(1.9e6))/ |
---|
161 | . (log(4.8e6)-log(1.9e6)) |
---|
162 | zprof(k,it)=20.*(14./20.)**alpha |
---|
163 | endif |
---|
164 | if ((pplay(nlon/2,k)<=1.9e6).and.(pplay(nlon/2,k)>=1.5e5)) then |
---|
165 | alpha=(log(pplay(nlon/2,k))-log(1.5e5))/ |
---|
166 | . (log(1.9e6)-log(1.5e5)) |
---|
167 | zprof(k,it)=39.*(20./39.)**alpha |
---|
168 | endif |
---|
169 | if ((pplay(nlon/2,k)<=1.5e5).and.(pplay(nlon/2,k)>=1.1e4)) then |
---|
170 | alpha=(log(pplay(nlon/2,k))-log(1.1e4))/ |
---|
171 | . (log(2.73e5)-log(1.1e4)) |
---|
172 | zprof(k,it)=50.*(39./50.)**alpha |
---|
173 | endif |
---|
174 | if ((pplay(nlon/2,k)<=1.1e4).and.(pplay(nlon/2,k)>=1.3e3)) then |
---|
175 | alpha=(log(pplay(nlon/2,k))-log(1.3e3))/ |
---|
176 | . (log(1.1e4)-log(1.3e3)) |
---|
177 | zprof(k,it)=2.*(50./2.)**alpha |
---|
178 | endif |
---|
179 | if ((pplay(nlon/2,k)<=1.3e3).and.(pplay(nlon/2,k)>=2.4)) then |
---|
180 | alpha=(log(pplay(nlon/2,k))-log(2.4))/ |
---|
181 | . (log(1.3e3)-log(2.4)) |
---|
182 | zprof(k,it)=1000.*(2./1000.)**alpha |
---|
183 | endif |
---|
184 | if (pplay(nlon/2,k) <= 2.4) then |
---|
185 | zprof(k,it)=1000. |
---|
186 | endif |
---|
187 | enddo |
---|
188 | print*,zprof(:,it) |
---|
189 | |
---|
190 | c OCS |
---|
191 | print*,"INIT ZPROF ",tname(it+3) |
---|
192 | M_tr(it+3)=60. ! OCS |
---|
193 | do k=1,nlev |
---|
194 | zprof(k,it+3)=0. |
---|
195 | if (pplay(nlon/2,k) >= 4.8e6) then |
---|
196 | zprof(k,it+3)=30. |
---|
197 | endif |
---|
198 | if ((pplay(nlon/2,k)<=4.8e6).and.(pplay(nlon/2,k)>=9.4e5)) |
---|
199 | * then |
---|
200 | alpha=(log(pplay(nlon/2,k))-log(9.4e5))/ |
---|
201 | * (log(4.8e6)-log(9.4e5)) |
---|
202 | zprof(k,it+3)=20.*(30/20.)**alpha |
---|
203 | endif |
---|
204 | if ((pplay(nlon/2,k)<=9.4e5).and.(pplay(nlon/2,k)>=4.724e5)) |
---|
205 | * then |
---|
206 | alpha=(log(pplay(nlon/2,k))-log(4.724e5))/ |
---|
207 | * (log(9.4e5)-log(4.724e5)) |
---|
208 | zprof(k,it+3)=0.5*(20/0.5)**alpha |
---|
209 | endif |
---|
210 | if ((pplay(nlon/2,k)<=4.724e5).and.(pplay(nlon/2,k)>=1.1e4)) |
---|
211 | * then |
---|
212 | alpha=(log(pplay(nlon/2,k))-log(1.1e4))/ |
---|
213 | * (log(4.724e5)-log(1.1e4)) |
---|
214 | zprof(k,it+3)=0.005*(0.5/0.005)**alpha |
---|
215 | endif |
---|
216 | if (pplay(nlon/2,k)<=1.1e4) then |
---|
217 | zprof(k,it+3)=0. |
---|
218 | endif |
---|
219 | end do |
---|
220 | print*,zprof(:,it+3) |
---|
221 | enddo |
---|
222 | |
---|
223 | c Initialisation du traceur s'il est nul: |
---|
224 | do it=1,nqCO_OCS |
---|
225 | if ((tr_seri(nlon/2,1,it).eq.0.).and. |
---|
226 | . (tr_seri(nlon/2,nlev/2,it).eq.0.).and. |
---|
227 | . (tr_seri(nlon/2,nlev,it).eq.0.)) then |
---|
228 | print*,"INITIALISATION DE ",tname(it) |
---|
229 | do k=1,nlev |
---|
230 | do i=1,nlon |
---|
231 | tr_seri(i,k,it) = zprof(k,it) |
---|
232 | enddo |
---|
233 | enddo |
---|
234 | endif |
---|
235 | enddo |
---|
236 | |
---|
237 | C========================================================================= |
---|
238 | C========================================================================= |
---|
239 | |
---|
240 | c------------- |
---|
241 | c fin debutphy |
---|
242 | c------------- |
---|
243 | ENDIF ! fin debutphy |
---|
244 | |
---|
245 | c====================================================================== |
---|
246 | c Rappel vers un profil |
---|
247 | c====================================================================== |
---|
248 | do it=1,nqCO_OCS |
---|
249 | do k=1,nlev |
---|
250 | do i=1,nlon |
---|
251 | c VERIF |
---|
252 | if (tr_seri(i,k,it).lt.0) then |
---|
253 | print*,"Traceur negatif AVANT rappel:",i,k,it |
---|
254 | stop |
---|
255 | endif |
---|
256 | c FIN VERIF |
---|
257 | |
---|
258 | deltatr(i,k,it) = (-tr_seri(i,k,it)+zprof(k,it))/tau(k,it) |
---|
259 | tr_seri(i,k,it) = tr_seri(i,k,it) + deltatr(i,k,it)*pdtphys |
---|
260 | |
---|
261 | c VERIF |
---|
262 | if (tr_seri(i,k,it).lt.0) then |
---|
263 | print*,"APRES rappel:",i,k,it, |
---|
264 | . deltatr(i,k,it),zprof(k,it),tr_seri(i,k,it),pdtphys/tau(k,it) |
---|
265 | stop |
---|
266 | endif |
---|
267 | c FIN VERIF |
---|
268 | enddo |
---|
269 | enddo |
---|
270 | enddo |
---|
271 | |
---|
272 | c====================================================================== |
---|
273 | c====================================================================== |
---|
274 | |
---|
275 | |
---|
276 | RETURN |
---|
277 | END |
---|
278 | |
---|
279 | |
---|