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

Annotation of /trunk/dyn3d/advtrac.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 167 - (hide annotations)
Mon Aug 24 16:30:33 2015 UTC (8 years, 9 months ago) by guez
Original Path: trunk/Sources/dyn3d/advtrac.f
File size: 8025 byte(s)
Added program test_inifilr.

Encapsulated ppm3d into a module and added implicit none. Removed
unused argument dum.

Encountered a problem in procedure invert_zoom_x. With grossismx=2.9,
DZOOMX=0.3, taux=5, for xuv = -0.25, for i = 1, rtsafe fails because
fval is about 1e-16 instead of 0 at xval = pi. So distinguished the
cases abs_y = 0 or pi. Needed then to add argument beta to
invert_zoom_x.

Moved the output of eignvalues of differentiation matrix from inifilr
to inifgn, where they are computed.

Simpler definition of j1 in inifilr.

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 167 use ppm3d_m, only: ppm3d
21 guez 157 use vlsplt_m, only: vlsplt
22 guez 108 use vlspltqs_m, only: vlspltqs
23 guez 31
24 guez 71 REAL, intent(in):: pbaru(ip1jmp1, llm), pbarv(ip1jm, llm)
25     REAL, intent(in):: p(ip1jmp1, llmp1)
26     real, intent(in):: masse(ip1jmp1, llm)
27 guez 40 REAL, intent(inout):: q(ip1jmp1, llm, nqmx)
28 guez 71 INTEGER, intent(out):: iapptrac
29 guez 44 real, intent(in):: teta(ip1jmp1, llm)
30 guez 71 REAL, intent(in):: pk(ip1jmp1, llm)
31 guez 3
32 guez 40 ! Variables locales
33 guez 3
34 guez 40 REAL massebx(ip1jmp1, llm), masseby(ip1jm, llm)
35     REAL, save:: pbaruc(ip1jmp1, llm), pbarvc(ip1jm, llm)
36     REAL, save:: massem(ip1jmp1, llm)
37     real zdp(ip1jmp1)
38     REAL pbarug(ip1jmp1, llm), pbarvg(ip1jm, llm), wg(ip1jmp1, llm)
39 guez 31
40 guez 40 INTEGER:: iadvtr = 0
41     INTEGER ij, l, iq
42     REAL zdpmin, zdpmax
43     EXTERNAL minmax
44 guez 31
45 guez 40 ! Rajouts pour PPM
46 guez 3
47 guez 40 INTEGER indice, n
48     ! Pas de temps adaptatif pour que CFL < 1
49     REAL dtbon
50     REAL cflmaxz ! CFL maximum
51     real aaa, bbb
52     REAL psppm(iim, jjp1) ! pression au sol
53     REAL unatppm(iim, jjp1, llm), vnatppm(iim, jjp1, llm)
54     REAL qppm(iim*jjp1, llm, nqmx)
55     REAL fluxwppm(iim, jjp1, llm)
56     REAL apppm(llmp1), bpppm(llmp1)
57     LOGICAL:: dum = .TRUE., fill = .TRUE.
58 guez 3
59 guez 40 !-----------------------------------------------------------
60 guez 3
61 guez 40 IF (iadvtr==0) THEN
62     CALL initial0(ijp1llm, pbaruc)
63     CALL initial0(ijmllm, pbarvc)
64     END IF
65 guez 3
66 guez 40 ! accumulation des flux de masse horizontaux
67     DO l = 1, llm
68     DO ij = 1, ip1jmp1
69     pbaruc(ij, l) = pbaruc(ij, l) + pbaru(ij, l)
70     END DO
71     DO ij = 1, ip1jm
72     pbarvc(ij, l) = pbarvc(ij, l) + pbarv(ij, l)
73     END DO
74     END DO
75 guez 3
76 guez 40 ! selection de la masse instantannee des mailles avant le transport.
77 guez 71 IF (iadvtr==0) massem = masse
78 guez 3
79 guez 40 iadvtr = iadvtr + 1
80     iapptrac = iadvtr
81 guez 3
82 guez 40 ! Test pour savoir si on advecte a ce pas de temps
83 guez 71 IF (iadvtr == iapp_tracvl) THEN
84 guez 40 ! traitement des flux de masse avant advection.
85     ! 1. calcul de w
86     ! 2. groupement des mailles pres du pole.
87 guez 3
88 guez 150 CALL groupe(pbaruc, pbarvc, pbarug, pbarvg, wg)
89 guez 3
90 guez 40 ! 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 guez 3
101 guez 40 CALL minmax(ip1jm-iip1, zdp(iip2), zdpmin, zdpmax)
102 guez 3
103 guez 40 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 guez 3
108 guez 40 ! Advection proprement dite
109 guez 3
110 guez 150 ! Calcul des moyennes bas\'ees sur la masse
111 guez 40 CALL massbar(massem, massebx, masseby)
112 guez 31
113 guez 40 ! Appel des sous programmes d'advection
114 guez 31
115 guez 40 DO iq = 1, nqmx
116 guez 157 select case (iadv(iq))
117     case (10)
118     ! Schema de Van Leer I MUSCL
119 guez 40 CALL vlsplt(q(:, :, iq), 2., massem, wg, pbarug, pbarvg, dtvr)
120 guez 157 case (14)
121 guez 40 ! Schema "pseudo amont" + test sur humidite specifique
122     ! pour la vapeur d'eau. F. Codron
123     CALL vlspltqs(q(1, 1, 1), 2., massem, wg, pbarug, pbarvg, dtvr, &
124     p, pk, teta)
125 guez 157 case (12)
126 guez 40 ! Schema de Frederic Hourdin
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 guez 157 case (13)
137 guez 40 ! 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 guez 157 case (20)
147 guez 40 ! Schema de pente SLOPES
148     CALL pentes_ini(q(1, 1, iq), wg, massem, pbarug, pbarvg, 0)
149 guez 157 case (30)
150 guez 40 ! Schema de Prather
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 guez 157 case (11, 16:18)
159 guez 40 ! Schemas PPM Lin et Rood
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 guez 167 llm, apppm, bpppm, 0.01, 6400000, fill, 220.)
193 guez 40 ! 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 guez 167 llm, apppm, bpppm, 0.01, 6400000, fill, 220.)
199 guez 40 ! 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 guez 167 llm, apppm, bpppm, 0.01, 6400000, fill, 220.)
205 guez 40 ! 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 guez 167 llm, apppm, bpppm, 0.01, 6400000, fill, 220.)
211 guez 40 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 guez 157 END select
217 guez 40 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