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

Contents of /trunk/dyn3d/advtrac.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 168 - (show annotations)
Wed Sep 9 10:41:47 2015 UTC (8 years, 8 months ago) by guez
Original Path: trunk/Sources/dyn3d/advtrac.f
File size: 8011 byte(s)
In order to be able to choose finer resolutions, set large memory
model in compiler options and use dynamic libraries.

Variables rlatd, rlond, cuphy and cvphy of module comgeomphy were
never used. (In LMDZ, they are used only for Orchid.)

There is a bug in PGI Fortran 13.10 that does not accept the
combination of forall, pack and spread in regr_pr_av and
regr_pr_int. In order to circumvent this bug, created the function
gr_dyn_phy.

In program test_inifilr, use a single latitude coordinate for north
and south.

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 ppm3d_m, only: ppm3d
21 use vlsplt_m, only: vlsplt
22 use vlspltqs_m, only: vlspltqs
23
24 REAL, intent(in):: pbaru(ip1jmp1, llm), pbarv(ip1jm, llm)
25 REAL, intent(in):: p(ip1jmp1, llmp1)
26 real, intent(in):: masse(ip1jmp1, llm)
27 REAL, intent(inout):: q(ip1jmp1, llm, nqmx)
28 INTEGER, intent(out):: iapptrac
29 real, intent(in):: teta(ip1jmp1, llm)
30 REAL, intent(in):: pk(ip1jmp1, llm)
31
32 ! Variables locales
33
34 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
40 INTEGER:: iadvtr = 0
41 INTEGER ij, l, iq
42 REAL zdpmin, zdpmax
43 EXTERNAL minmax
44
45 ! Rajouts pour PPM
46
47 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:: fill = .TRUE.
58
59 !-----------------------------------------------------------
60
61 IF (iadvtr==0) THEN
62 CALL initial0(ijp1llm, pbaruc)
63 CALL initial0(ijmllm, pbarvc)
64 END IF
65
66 ! 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
76 ! selection de la masse instantannee des mailles avant le transport.
77 IF (iadvtr==0) massem = masse
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(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\'ees sur la masse
111 CALL massbar(massem, massebx, masseby)
112
113 ! Appel des sous programmes d'advection
114
115 DO iq = 1, nqmx
116 select case (iadv(iq))
117 case (10)
118 ! Schema de Van Leer I MUSCL
119 CALL vlsplt(q(:, :, iq), 2., massem, wg, pbarug, pbarvg, dtvr)
120 case (14)
121 ! 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 case (12)
126 ! Schema de Frederic Hourdin
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 case (13)
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 case (20)
147 ! Schema de pente SLOPES
148 CALL pentes_ini(q(1, 1, iq), wg, massem, pbarug, pbarvg, 0)
149 case (30)
150 ! Schema de Prather
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 case (11, 16:18)
159 ! Schemas PPM Lin et Rood
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, 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, 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, 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, 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 select
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