/[lmdze]/trunk/libf/dyn3d/advtrac.f90
ViewVC logotype

Contents of /trunk/libf/dyn3d/advtrac.f90

Parent Directory Parent Directory | Revision Log Revision Log


Revision 23 - (show annotations)
Mon Dec 14 15:25:16 2009 UTC (14 years, 5 months ago) by guez
File size: 11342 byte(s)
Split "orografi.f": one file for each procedure. Put the created files
in new directory "Orography".

Removed argument "vcov" of procedure "sortvarc". Removed arguments
"itau" and "time" of procedure "caldyn0". Removed arguments "itau",
"time" and "vcov" of procedure "sortvarc0".

Removed argument "time" of procedure "dynredem1". Removed NetCDF
variable "temps" in files "start.nc" and "restart.nc", because its
value is always 0.

Removed argument "nq" of procedures "iniadvtrac" and "leapfrog". The
number of "tracers read in "traceur.def" must now be equal to "nqmx",
or "nqmx" must equal 4 if there is no file "traceur.def". Replaced
variable "nq" by constant "nqmx" in "leapfrog".

NetCDF variable for ozone field in "coefoz.nc" must now be called
"tro3" instead of "r".

Fixed bug in "zenang".

1 SUBROUTINE advtrac(pbaru,pbarv,p,masse,q,iapptrac,teta,pk)
2
3 ! From dyn3d/advtrac.F,v 1.4 2005/04/13 08:58:34
4 ! Auteur : F. Hourdin
5
6 ! Modif. P. Le Van (20/12/97)
7 ! F. Codron (10/99)
8 ! D. Le Croller (07/2001)
9 ! M.A Filiberti (04/2002)
10
11 USE dimens_m, ONLY : iim, jjm, llm, nqmx
12 USE paramet_m, ONLY : iip1, iip2, ijmllm, ijp1llm, ip1jm, ip1jmp1, jjp1, &
13 llmp1
14 USE comconst, ONLY : dtvr
15 USE conf_gcm_m, ONLY : iapp_tracvl
16 USE iniadvtrac_m, ONLY : iadv
17
18 IMPLICIT NONE
19
20
21 !-------------------------------------------------------------------
22 ! Arguments
23 !-------------------------------------------------------------------
24 ! Ajout PPM
25 !--------------------------------------------------------
26 REAL massebx(ip1jmp1,llm), masseby(ip1jm,llm)
27 !--------------------------------------------------------
28 INTEGER iapptrac
29 REAL pbaru(ip1jmp1,llm), pbarv(ip1jm,llm)
30 REAL q(ip1jmp1,llm,nqmx), masse(ip1jmp1,llm)
31 REAL, intent(in):: p(ip1jmp1,llmp1)
32 real teta(ip1jmp1,llm)
33 REAL pk(ip1jmp1,llm)
34
35 !-------------------------------------------------------------
36 ! Variables locales
37 !-------------------------------------------------------------
38
39 REAL pbaruc(ip1jmp1,llm), pbarvc(ip1jm,llm)
40 REAL massem(ip1jmp1,llm), zdp(ip1jmp1)
41 REAL pbarug(ip1jmp1,llm), pbarvg(ip1jm,llm), wg(ip1jmp1,llm)
42 REAL cpuadv(nqmx)
43 COMMON /cpuadv/cpuadv
44
45 INTEGER iadvtr
46 INTEGER ij, l, iq
47 REAL zdpmin, zdpmax
48 EXTERNAL minmax
49 SAVE iadvtr, massem, pbaruc, pbarvc
50 DATA iadvtr/0/
51 !----------------------------------------------------------
52 ! Rajouts pour PPM
53 !----------------------------------------------------------
54 INTEGER indice, n
55 ! Pas de temps adaptatif pour que CFL<1
56 REAL dtbon
57 REAL cflmaxz, aaa, & ! CFL maximum
58 bbb
59 REAL psppm(iim,jjp1) ! pression au sol
60 REAL unatppm(iim,jjp1,llm), vnatppm(iim,jjp1,llm)
61 REAL qppm(iim*jjp1,llm,nqmx)
62 REAL fluxwppm(iim,jjp1,llm)
63 REAL apppm(llmp1), bpppm(llmp1)
64 LOGICAL dum, fill
65 DATA fill/ .TRUE./
66 DATA dum/ .TRUE./
67
68
69 IF (iadvtr==0) THEN
70 CALL initial0(ijp1llm,pbaruc)
71 CALL initial0(ijmllm,pbarvc)
72 END IF
73
74 ! accumulation des flux de masse horizontaux
75 DO l = 1, llm
76 DO ij = 1, ip1jmp1
77 pbaruc(ij,l) = pbaruc(ij,l) + pbaru(ij,l)
78 END DO
79 DO ij = 1, ip1jm
80 pbarvc(ij,l) = pbarvc(ij,l) + pbarv(ij,l)
81 END DO
82 END DO
83
84 ! selection de la masse instantannee des mailles avant le transport.
85 IF (iadvtr==0) THEN
86
87 CALL scopy(ip1jmp1*llm,masse,1,massem,1)
88 !cc CALL filtreg ( massem ,jjp1, llm,-2, 2, .TRUE., 1 )
89
90 END IF
91
92 iadvtr = iadvtr + 1
93 iapptrac = iadvtr
94
95
96 ! Test pour savoir si on advecte a ce pas de temps
97 IF (iadvtr==iapp_tracvl) THEN
98
99 !c .. Modif P.Le Van ( 20/12/97 ) ....
100 !c
101
102 ! traitement des flux de masse avant advection.
103 ! 1. calcul de w
104 ! 2. groupement des mailles pres du pole.
105
106 CALL groupe(massem,pbaruc,pbarvc,pbarug,pbarvg,wg)
107
108
109 ! test sur l'eventuelle creation de valeurs negatives de la masse
110 DO l = 1, llm - 1
111 DO ij = iip2 + 1, ip1jm
112 zdp(ij) = pbarug(ij-1,l) - pbarug(ij,l) - pbarvg(ij-iip1,l) + &
113 pbarvg(ij,l) + wg(ij,l+1) - wg(ij,l)
114 END DO
115 CALL scopy(jjm-1,zdp(iip1+iip1),iip1,zdp(iip2),iip1)
116 DO ij = iip2, ip1jm
117 zdp(ij) = zdp(ij)*dtvr/massem(ij,l)
118 END DO
119
120
121 CALL minmax(ip1jm-iip1,zdp(iip2),zdpmin,zdpmax)
122
123 IF (max(abs(zdpmin),abs(zdpmax))>0.5) THEN
124 PRINT *, 'WARNING DP/P l=', l, ' MIN:', zdpmin, ' MAX:', zdpmax
125 END IF
126
127 END DO
128
129 !-------------------------------------------------------------------
130 ! Advection proprement dite (Modification Le Croller (07/2001)
131 !-------------------------------------------------------------------
132
133 !----------------------------------------------------
134 ! Calcul des moyennes basées sur la masse
135 !----------------------------------------------------
136 CALL massbar(massem,massebx,masseby)
137
138 !-----------------------------------------------------------
139 ! Appel des sous programmes d'advection
140 !-----------------------------------------------------------
141 DO iq = 1, nqmx
142 ! call clock(t_initial)
143 IF (iadv(iq)==0) CYCLE
144 ! ----------------------------------------------------------------
145 ! Schema de Van Leer I MUSCL
146 ! ----------------------------------------------------------------
147 IF (iadv(iq)==10) THEN
148 CALL vlsplt(q(1,1,iq),2.,massem,wg,pbarug,pbarvg,dtvr)
149
150
151 ! ----------------------------------------------------------------
152 ! Schema "pseudo amont" + test sur humidite specifique
153 ! pour la vapeur d'eau. F. Codron
154 ! ----------------------------------------------------------------
155 ELSE IF (iadv(iq)==14) THEN
156
157 CALL vlspltqs(q(1,1,1),2.,massem,wg,pbarug,pbarvg,dtvr,p,pk,teta)
158 ! ----------------------------------------------------------------
159 ! Schema de Frederic Hourdin
160 ! ----------------------------------------------------------------
161 ELSE IF (iadv(iq)==12) THEN
162 ! Pas de temps adaptatif
163 CALL adaptdt(iadv(iq),dtbon,n,pbarug,massem)
164 IF (n>1) THEN
165 WRITE (*,*) 'WARNING horizontal dt=', dtbon, 'dtvr=', dtvr, &
166 'n=', n
167 END IF
168 DO indice = 1, n
169 CALL advn(q(1,1,iq),massem,wg,pbarug,pbarvg,dtbon,1)
170 END DO
171 ELSE IF (iadv(iq)==13) THEN
172 ! Pas de temps adaptatif
173 CALL adaptdt(iadv(iq),dtbon,n,pbarug,massem)
174 IF (n>1) THEN
175 WRITE (*,*) 'WARNING horizontal dt=', dtbon, 'dtvr=', dtvr, &
176 'n=', n
177 END IF
178 DO indice = 1, n
179 CALL advn(q(1,1,iq),massem,wg,pbarug,pbarvg,dtbon,2)
180 END DO
181 ! ----------------------------------------------------------------
182 ! Schema de pente SLOPES
183 ! ----------------------------------------------------------------
184 ELSE IF (iadv(iq)==20) THEN
185 CALL pentes_ini(q(1,1,iq),wg,massem,pbarug,pbarvg,0)
186
187 ! ----------------------------------------------------------------
188 ! Schema de Prather
189 ! ----------------------------------------------------------------
190 ELSE IF (iadv(iq)==30) THEN
191 ! Pas de temps adaptatif
192 CALL adaptdt(iadv(iq),dtbon,n,pbarug,massem)
193 IF (n>1) THEN
194 WRITE (*,*) 'WARNING horizontal dt=', dtbon, 'dtvr=', dtvr, &
195 'n=', n
196 END IF
197 CALL prather(q(1,1,iq),wg,massem,pbarug,pbarvg,n,dtbon)
198 ! ----------------------------------------------------------------
199 ! Schemas PPM Lin et Rood
200 ! ----------------------------------------------------------------
201 ELSE IF (iadv(iq)==11 .OR. (iadv(iq)>=16 .AND. iadv(iq)<=18)) THEN
202
203 ! Test sur le flux horizontal
204 ! Pas de temps adaptatif
205 CALL adaptdt(iadv(iq),dtbon,n,pbarug,massem)
206 IF (n>1) THEN
207 WRITE (*,*) 'WARNING horizontal dt=', dtbon, 'dtvr=', dtvr, &
208 'n=', n
209 END IF
210 ! Test sur le flux vertical
211 cflmaxz = 0.
212 DO l = 2, llm
213 DO ij = iip2, ip1jm
214 aaa = wg(ij,l)*dtvr/massem(ij,l)
215 cflmaxz = max(cflmaxz,aaa)
216 bbb = -wg(ij,l)*dtvr/massem(ij,l-1)
217 cflmaxz = max(cflmaxz,bbb)
218 END DO
219 END DO
220 IF (cflmaxz>=1) THEN
221 WRITE (*,*) 'WARNING vertical', 'CFLmaxz=', cflmaxz
222 END IF
223
224 !-----------------------------------------------------------
225 ! Ss-prg interface LMDZ.4->PPM3d
226 !-----------------------------------------------------------
227
228 CALL interpre(q(1,1,iq),qppm(1,1,iq),wg,fluxwppm,massem,apppm, &
229 bpppm,massebx,masseby,pbarug,pbarvg,unatppm,vnatppm,psppm)
230
231 DO indice = 1, n
232 !----------------------------------------------------------------
233 ! VL (version PPM) horiz. et PPM vert.
234 !---------------------------------------------------------------
235 IF (iadv(iq)==11) THEN
236 ! Ss-prg PPM3d de Lin
237 CALL ppm3d(1,qppm(1,1,iq),psppm,psppm,unatppm,vnatppm, &
238 fluxwppm,dtbon,2,2,2,1,iim,jjp1,2,llm,apppm,bpppm,0.01, &
239 6400000,fill,dum,220.)
240
241 !-----------------------------------------------------------
242 ! Monotonic PPM
243 !-------------------------------------------------------
244 ELSE IF (iadv(iq)==16) THEN
245 ! Ss-prg PPM3d de Lin
246 CALL ppm3d(1,qppm(1,1,iq),psppm,psppm,unatppm,vnatppm, &
247 fluxwppm,dtbon,3,3,3,1,iim,jjp1,2,llm,apppm,bpppm,0.01, &
248 6400000,fill,dum,220.)
249 ! Semi Monotonic PPM
250 ELSE IF (iadv(iq)==17) THEN
251 ! Ss-prg PPM3d de Lin
252 CALL ppm3d(1,qppm(1,1,iq),psppm,psppm,unatppm,vnatppm, &
253 fluxwppm,dtbon,4,4,4,1,iim,jjp1,2,llm,apppm,bpppm,0.01, &
254 6400000,fill,dum,220.)
255 ! Positive Definite PPM
256 ELSE IF (iadv(iq)==18) THEN
257 ! Ss-prg PPM3d de Lin
258 CALL ppm3d(1,qppm(1,1,iq),psppm,psppm,unatppm,vnatppm, &
259 fluxwppm,dtbon,5,5,5,1,iim,jjp1,2,llm,apppm,bpppm,0.01, &
260 6400000,fill,dum,220.)
261 END IF
262 END DO
263 !-----------------------------------------------------------------
264 ! Ss-prg interface PPM3d-LMDZ.4
265 !-----------------------------------------------------------------
266 CALL interpost(q(1,1,iq),qppm(1,1,iq))
267 END IF
268 !----------------------------------------------------------------------
269
270 !-----------------------------------------------------------------
271 ! On impose une seule valeur du traceur au pôle Sud j=jjm+1=jjp1
272 ! et Nord j=1
273 !-----------------------------------------------------------------
274
275 ! call traceurpole(q(1,1,iq),massem)
276
277 ! calcul du temps cpu pour un schema donne
278
279 ! call clock(t_final)
280 !ym tps_cpu=t_final-t_initial
281 !ym cpuadv(iq)=cpuadv(iq)+tps_cpu
282
283 END DO
284
285
286 !------------------------------------------------------------------
287 ! on reinitialise a zero les flux de masse cumules
288 !---------------------------------------------------
289 iadvtr = 0
290 END IF
291
292 END SUBROUTINE advtrac

  ViewVC Help
Powered by ViewVC 1.1.21