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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 23 - (hide 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 guez 3 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 guez 23 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 guez 3 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 guez 10 REAL, intent(in):: p(ip1jmp1,llmp1)
32     real teta(ip1jmp1,llm)
33 guez 3 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 guez 23 END IF
291 guez 3
292     END SUBROUTINE advtrac

  ViewVC Help
Powered by ViewVC 1.1.21