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

Annotation of /trunk/dyn3d/advtrac.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 168 - (hide 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 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 guez 168 LOGICAL:: 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