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

Contents of /trunk/Sources/dyn3d/advtrac.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 150 - (show annotations)
Thu Jun 18 13:49:26 2015 UTC (8 years, 10 months ago) by guez
File size: 8133 byte(s)
Removed unused arguments of groupe, cv3_undilute2, cv_undilute2,
interfsur_lim, drag_noro, orodrag, gwprofil

Chickened out of revision 148: back to double precision in
invert_zoom_x (and overloaded rtsafe).

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

  ViewVC Help
Powered by ViewVC 1.1.21