/[lmdze]/trunk/dyn3d/advtrac.f
ViewVC logotype

Annotation of /trunk/dyn3d/advtrac.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: 8098 byte(s)
Changed all ".f90" suffixes to ".f".
1 guez 40 module advtrac_m
2 guez 3
3 guez 40 IMPLICIT NONE
4 guez 3
5 guez 40 contains
6 guez 23
7 guez 40 SUBROUTINE advtrac(pbaru, pbarv, p, masse, q, iapptrac, teta, pk)
8 guez 3
9 guez 40 ! From dyn3d/advtrac.F, version 1.4 2005/04/13 08:58:34
10     ! Author: F. Hourdin
11 guez 3
12 guez 71 USE comconst, ONLY : dtvr
13     USE conf_gcm_m, ONLY : iapp_tracvl
14 guez 40 USE dimens_m, ONLY : iim, jjm, llm, nqmx
15 guez 71 USE iniadvtrac_m, ONLY : iadv
16 guez 40 USE paramet_m, ONLY : iip1, iip2, ijmllm, ijp1llm, ip1jm, ip1jmp1, jjp1, &
17     llmp1
18 guez 31
19 guez 71 REAL, intent(in):: pbaru(ip1jmp1, llm), pbarv(ip1jm, llm)
20     REAL, intent(in):: p(ip1jmp1, llmp1)
21     real, intent(in):: masse(ip1jmp1, llm)
22 guez 40 REAL, intent(inout):: q(ip1jmp1, llm, nqmx)
23 guez 71 INTEGER, intent(out):: iapptrac
24 guez 44 real, intent(in):: teta(ip1jmp1, llm)
25 guez 71 REAL, intent(in):: pk(ip1jmp1, llm)
26 guez 3
27 guez 40 ! Variables locales
28 guez 3
29 guez 40 REAL massebx(ip1jmp1, llm), masseby(ip1jm, llm)
30     REAL, save:: pbaruc(ip1jmp1, llm), pbarvc(ip1jm, llm)
31     REAL, save:: massem(ip1jmp1, llm)
32     real zdp(ip1jmp1)
33     REAL pbarug(ip1jmp1, llm), pbarvg(ip1jm, llm), wg(ip1jmp1, llm)
34     REAL cpuadv(nqmx)
35 guez 31
36 guez 40 INTEGER:: iadvtr = 0
37     INTEGER ij, l, iq
38     REAL zdpmin, zdpmax
39     EXTERNAL minmax
40 guez 31
41 guez 40 ! Rajouts pour PPM
42 guez 3
43 guez 40 INTEGER indice, n
44     ! Pas de temps adaptatif pour que CFL < 1
45     REAL dtbon
46     REAL cflmaxz ! CFL maximum
47     real aaa, bbb
48     REAL psppm(iim, jjp1) ! pression au sol
49     REAL unatppm(iim, jjp1, llm), vnatppm(iim, jjp1, llm)
50     REAL qppm(iim*jjp1, llm, nqmx)
51     REAL fluxwppm(iim, jjp1, llm)
52     REAL apppm(llmp1), bpppm(llmp1)
53     LOGICAL:: dum = .TRUE., fill = .TRUE.
54 guez 3
55 guez 40 !-----------------------------------------------------------
56 guez 3
57 guez 40 IF (iadvtr==0) THEN
58     CALL initial0(ijp1llm, pbaruc)
59     CALL initial0(ijmllm, pbarvc)
60     END IF
61 guez 3
62 guez 40 ! accumulation des flux de masse horizontaux
63     DO l = 1, llm
64     DO ij = 1, ip1jmp1
65     pbaruc(ij, l) = pbaruc(ij, l) + pbaru(ij, l)
66     END DO
67     DO ij = 1, ip1jm
68     pbarvc(ij, l) = pbarvc(ij, l) + pbarv(ij, l)
69     END DO
70     END DO
71 guez 3
72 guez 40 ! selection de la masse instantannee des mailles avant le transport.
73 guez 71 IF (iadvtr==0) massem = masse
74 guez 3
75 guez 40 iadvtr = iadvtr + 1
76     iapptrac = iadvtr
77 guez 3
78 guez 40 ! Test pour savoir si on advecte a ce pas de temps
79 guez 71 IF (iadvtr == iapp_tracvl) THEN
80 guez 40 ! traitement des flux de masse avant advection.
81     ! 1. calcul de w
82     ! 2. groupement des mailles pres du pole.
83 guez 3
84 guez 40 CALL groupe(massem, pbaruc, pbarvc, pbarug, pbarvg, wg)
85 guez 3
86 guez 40 ! test sur l'eventuelle creation de valeurs negatives de la masse
87     DO l = 1, llm - 1
88     DO ij = iip2 + 1, ip1jm
89     zdp(ij) = pbarug(ij-1, l) - pbarug(ij, l) - pbarvg(ij-iip1, l) + &
90     pbarvg(ij, l) + wg(ij, l+1) - wg(ij, l)
91     END DO
92     CALL scopy(jjm-1, zdp(iip1+iip1), iip1, zdp(iip2), iip1)
93     DO ij = iip2, ip1jm
94     zdp(ij) = zdp(ij)*dtvr/massem(ij, l)
95     END DO
96 guez 3
97 guez 40 CALL minmax(ip1jm-iip1, zdp(iip2), zdpmin, zdpmax)
98 guez 3
99 guez 40 IF (max(abs(zdpmin), abs(zdpmax))>0.5) THEN
100     PRINT *, 'WARNING DP/P l=', l, ' MIN:', zdpmin, ' MAX:', zdpmax
101     END IF
102     END DO
103 guez 3
104 guez 40 ! Advection proprement dite
105 guez 3
106 guez 40 ! Calcul des moyennes basées sur la masse
107     CALL massbar(massem, massebx, masseby)
108 guez 31
109 guez 40 ! Appel des sous programmes d'advection
110 guez 31
111 guez 40 DO iq = 1, nqmx
112     IF (iadv(iq)==0) CYCLE
113 guez 31
114 guez 40 ! Schema de Van Leer I MUSCL
115 guez 3
116 guez 40 IF (iadv(iq)==10) THEN
117     CALL vlsplt(q(:, :, iq), 2., massem, wg, pbarug, pbarvg, dtvr)
118     ! Schema "pseudo amont" + test sur humidite specifique
119     ! pour la vapeur d'eau. F. Codron
120     ELSE IF (iadv(iq)==14) THEN
121     CALL vlspltqs(q(1, 1, 1), 2., massem, wg, pbarug, pbarvg, dtvr, &
122     p, pk, teta)
123     ! Schema de Frederic Hourdin
124     ELSE IF (iadv(iq)==12) THEN
125     ! Pas de temps adaptatif
126     CALL adaptdt(iadv(iq), dtbon, n, pbarug, massem)
127     IF (n>1) THEN
128     WRITE (*, *) 'WARNING horizontal dt=', dtbon, 'dtvr=', dtvr, &
129     'n=', n
130     END IF
131     DO indice = 1, n
132     CALL advn(q(1, 1, iq), massem, wg, pbarug, pbarvg, dtbon, 1)
133     END DO
134     ELSE IF (iadv(iq)==13) THEN
135     ! Pas de temps adaptatif
136     CALL adaptdt(iadv(iq), dtbon, n, pbarug, massem)
137     IF (n>1) THEN
138     WRITE (*, *) 'WARNING horizontal dt=', dtbon, 'dtvr=', dtvr, &
139     'n=', n
140     END IF
141     DO indice = 1, n
142     CALL advn(q(1, 1, iq), massem, wg, pbarug, pbarvg, dtbon, 2)
143     END DO
144     ! Schema de pente SLOPES
145     ELSE IF (iadv(iq)==20) THEN
146     CALL pentes_ini(q(1, 1, iq), wg, massem, pbarug, pbarvg, 0)
147     ! Schema de Prather
148     ELSE IF (iadv(iq)==30) THEN
149     ! Pas de temps adaptatif
150     CALL adaptdt(iadv(iq), dtbon, n, pbarug, massem)
151     IF (n>1) THEN
152     WRITE (*, *) 'WARNING horizontal dt=', dtbon, 'dtvr=', dtvr, &
153     'n=', n
154     END IF
155     CALL prather(q(1, 1, iq), wg, massem, pbarug, pbarvg, n, dtbon)
156     ! Schemas PPM Lin et Rood
157     ELSE IF (iadv(iq)==11 .OR. (iadv(iq)>=16 .AND. iadv(iq)<=18)) THEN
158     ! Test sur le flux horizontal
159     ! Pas de temps adaptatif
160     CALL adaptdt(iadv(iq), dtbon, n, pbarug, massem)
161     IF (n>1) THEN
162     WRITE (*, *) 'WARNING horizontal dt=', dtbon, 'dtvr=', dtvr, &
163     'n=', n
164     END IF
165     ! Test sur le flux vertical
166     cflmaxz = 0.
167     DO l = 2, llm
168     DO ij = iip2, ip1jm
169     aaa = wg(ij, l)*dtvr/massem(ij, l)
170     cflmaxz = max(cflmaxz, aaa)
171     bbb = -wg(ij, l)*dtvr/massem(ij, l-1)
172     cflmaxz = max(cflmaxz, bbb)
173     END DO
174     END DO
175     IF (cflmaxz>=1) THEN
176     WRITE (*, *) 'WARNING vertical', 'CFLmaxz=', cflmaxz
177     END IF
178 guez 3
179 guez 40 ! Ss-prg interface LMDZ.4->PPM3d
180     CALL interpre(q(1, 1, iq), qppm(1, 1, iq), wg, fluxwppm, massem, &
181     apppm, bpppm, massebx, masseby, pbarug, pbarvg, unatppm, &
182     vnatppm, psppm)
183 guez 31
184 guez 40 DO indice = 1, n
185     ! VL (version PPM) horiz. et PPM vert.
186     IF (iadv(iq)==11) THEN
187     ! Ss-prg PPM3d de Lin
188     CALL ppm3d(1, qppm(1, 1, iq), psppm, psppm, unatppm, &
189     vnatppm, fluxwppm, dtbon, 2, 2, 2, 1, iim, jjp1, 2, &
190     llm, apppm, bpppm, 0.01, 6400000, fill, dum, 220.)
191     ! Monotonic PPM
192     ELSE IF (iadv(iq)==16) THEN
193     ! Ss-prg PPM3d de Lin
194     CALL ppm3d(1, qppm(1, 1, iq), psppm, psppm, unatppm, &
195     vnatppm, fluxwppm, dtbon, 3, 3, 3, 1, iim, jjp1, 2, &
196     llm, apppm, bpppm, 0.01, 6400000, fill, dum, 220.)
197     ! Semi Monotonic PPM
198     ELSE IF (iadv(iq)==17) THEN
199     ! Ss-prg PPM3d de Lin
200     CALL ppm3d(1, qppm(1, 1, iq), psppm, psppm, unatppm, &
201     vnatppm, fluxwppm, dtbon, 4, 4, 4, 1, iim, jjp1, 2, &
202     llm, apppm, bpppm, 0.01, 6400000, fill, dum, 220.)
203     ! Positive Definite PPM
204     ELSE IF (iadv(iq)==18) THEN
205     ! Ss-prg PPM3d de Lin
206     CALL ppm3d(1, qppm(1, 1, iq), psppm, psppm, unatppm, &
207     vnatppm, fluxwppm, dtbon, 5, 5, 5, 1, iim, jjp1, 2, &
208     llm, apppm, bpppm, 0.01, 6400000, fill, dum, 220.)
209     END IF
210     END DO
211 guez 3
212 guez 40 ! Ss-prg interface PPM3d-LMDZ.4
213     CALL interpost(q(1, 1, iq), qppm(1, 1, iq))
214     END IF
215     END DO
216 guez 3
217 guez 40 ! on reinitialise a zero les flux de masse cumules
218     iadvtr = 0
219     END IF
220    
221     END SUBROUTINE advtrac
222    
223     end module advtrac_m

  ViewVC Help
Powered by ViewVC 1.1.21