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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 44 - (show annotations)
Wed Apr 13 12:29:18 2011 UTC (13 years, 1 month ago) by guez
File size: 8109 byte(s)
Removed argument "pdteta" of "calfis", because it was not used.

Created module "conf_guide_m", containing procedure
"conf_guide". Moved module variables from "guide_m" to "conf_guide_m".

In module "getparam", removed "ini_getparam" and "fin_getparam" from
generic interface "getpar".

Created module variables in "tau2alpha_m" to replace common "comdxdy".

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

  ViewVC Help
Powered by ViewVC 1.1.21