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

Contents of /trunk/dyn3d/advtrac.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 108 - (show annotations)
Tue Sep 16 14:00:41 2014 UTC (9 years, 7 months ago) by guez
File size: 8139 byte(s)
Imported writefield from LMDZ. Close at the end of gcm the files which
were created by writefiled (not done in LMDZ).

Removed procedures for the output of Grads files. Removed calls to
dump2d. In guide, replaced calls to wrgrads by calls to writefield.

In vlspltqs, removed redundant programming of saturation
pressure. Call foeew from module FCTTRE instead.

Bug fix in interpre: size of w exceeding size of correponding actual
argument wg in advtrac.

In leapfrog, call guide until the end of the run, instead of six hours
before the end.

Bug fix in readsulfate_preind: type of arguments.

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(massem, 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ées 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