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

Annotation of /trunk/dyn3d/advtrac.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 108 - (hide annotations)
Tue Sep 16 14:00:41 2014 UTC (9 years, 8 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 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 108 use interpre_m, only: interpre
17 guez 91 use massbar_m, only: massbar
18 guez 40 USE paramet_m, ONLY : iip1, iip2, ijmllm, ijp1llm, ip1jm, ip1jmp1, jjp1, &
19     llmp1
20 guez 108 use vlspltqs_m, only: vlspltqs
21 guez 31
22 guez 71 REAL, intent(in):: pbaru(ip1jmp1, llm), pbarv(ip1jm, llm)
23     REAL, intent(in):: p(ip1jmp1, llmp1)
24     real, intent(in):: masse(ip1jmp1, llm)
25 guez 40 REAL, intent(inout):: q(ip1jmp1, llm, nqmx)
26 guez 71 INTEGER, intent(out):: iapptrac
27 guez 44 real, intent(in):: teta(ip1jmp1, llm)
28 guez 71 REAL, intent(in):: pk(ip1jmp1, llm)
29 guez 3
30 guez 40 ! Variables locales
31 guez 3
32 guez 40 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 guez 31
38 guez 40 INTEGER:: iadvtr = 0
39     INTEGER ij, l, iq
40     REAL zdpmin, zdpmax
41     EXTERNAL minmax
42 guez 31
43 guez 40 ! Rajouts pour PPM
44 guez 3
45 guez 40 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 guez 3
57 guez 40 !-----------------------------------------------------------
58 guez 3
59 guez 40 IF (iadvtr==0) THEN
60     CALL initial0(ijp1llm, pbaruc)
61     CALL initial0(ijmllm, pbarvc)
62     END IF
63 guez 3
64 guez 40 ! 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 guez 3
74 guez 40 ! selection de la masse instantannee des mailles avant le transport.
75 guez 71 IF (iadvtr==0) massem = masse
76 guez 3
77 guez 40 iadvtr = iadvtr + 1
78     iapptrac = iadvtr
79 guez 3
80 guez 40 ! Test pour savoir si on advecte a ce pas de temps
81 guez 71 IF (iadvtr == iapp_tracvl) THEN
82 guez 40 ! traitement des flux de masse avant advection.
83     ! 1. calcul de w
84     ! 2. groupement des mailles pres du pole.
85 guez 3
86 guez 40 CALL groupe(massem, pbaruc, pbarvc, pbarug, pbarvg, wg)
87 guez 3
88 guez 40 ! 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 guez 3
99 guez 40 CALL minmax(ip1jm-iip1, zdp(iip2), zdpmin, zdpmax)
100 guez 3
101 guez 40 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 guez 3
106 guez 40 ! Advection proprement dite
107 guez 3
108 guez 40 ! Calcul des moyennes basées sur la masse
109     CALL massbar(massem, massebx, masseby)
110 guez 31
111 guez 40 ! Appel des sous programmes d'advection
112 guez 31
113 guez 40 DO iq = 1, nqmx
114     IF (iadv(iq)==0) CYCLE
115 guez 31
116 guez 40 ! Schema de Van Leer I MUSCL
117 guez 3
118 guez 40 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 guez 104 CALL adaptdt(dtbon, n, pbarug, massem)
129 guez 40 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 guez 104 CALL adaptdt(dtbon, n, pbarug, massem)
139 guez 40 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 guez 104 CALL adaptdt(dtbon, n, pbarug, massem)
153 guez 40 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 guez 104 CALL adaptdt(dtbon, n, pbarug, massem)
163 guez 40 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 guez 3
181 guez 40 ! 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 guez 31
186 guez 40 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 guez 3
214 guez 40 ! Ss-prg interface PPM3d-LMDZ.4
215     CALL interpost(q(1, 1, iq), qppm(1, 1, iq))
216     END IF
217     END DO
218 guez 3
219 guez 40 ! 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