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

Annotation of /trunk/Sources/dyn3d/advtrac.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 104 - (hide annotations)
Thu Sep 4 10:05:52 2014 UTC (9 years, 8 months ago) by guez
Original Path: trunk/dyn3d/advtrac.f
File size: 8069 byte(s)
Removed procedure sortvarc0. Called sortvarc with an additional
argument resetvarc instead. (Following LMDZ.) Moved current time
computations and some printing statements from sortvarc to
caldyn. Could then remove arguments itau and time_0 of sortvarc, and
could remove "use dynetat0". Better to keep "dynetat0.f" as a gcm-only
file.

Moved some variables from module ener to module sortvarc.

Split file "mathelp.f" into single-procedure files.

Removed unused argument nadv of adaptdt. Removed dimension arguments
of bernoui.

Removed unused argument nisurf of interfoce_lim. Changed the size of
argument lmt_sst of interfoce_lim from klon to knon. Removed case when
newlmt is false.

dynredem1 is called only once in each run, either ce0l or gcm. So
variable nb in call to nf95_put_var was always 1. Removed variable nb.

Removed dimension arguments of calcul_fluxs. Removed unused arguments
precip_rain, precip_snow, snow of calcul_fluxs. Changed the size of
all the arrays in calcul_fluxs from klon to knon.

Removed dimension arguments of fonte_neige. Changed the size of all
the arrays in fonte_neige from klon to knon.

Changed the size of arguments tsurf and tsurf_new of interfsurf_hq
from klon to knon. Changed the size of argument ptsrf of soil from
klon to knon.

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 91 use massbar_m, only: massbar
17 guez 40 USE paramet_m, ONLY : iip1, iip2, ijmllm, ijp1llm, ip1jm, ip1jmp1, jjp1, &
18     llmp1
19 guez 31
20 guez 71 REAL, intent(in):: pbaru(ip1jmp1, llm), pbarv(ip1jm, llm)
21     REAL, intent(in):: p(ip1jmp1, llmp1)
22     real, intent(in):: masse(ip1jmp1, llm)
23 guez 40 REAL, intent(inout):: q(ip1jmp1, llm, nqmx)
24 guez 71 INTEGER, intent(out):: iapptrac
25 guez 44 real, intent(in):: teta(ip1jmp1, llm)
26 guez 71 REAL, intent(in):: pk(ip1jmp1, llm)
27 guez 3
28 guez 40 ! Variables locales
29 guez 3
30 guez 40 REAL massebx(ip1jmp1, llm), masseby(ip1jm, llm)
31     REAL, save:: pbaruc(ip1jmp1, llm), pbarvc(ip1jm, llm)
32     REAL, save:: massem(ip1jmp1, llm)
33     real zdp(ip1jmp1)
34     REAL pbarug(ip1jmp1, llm), pbarvg(ip1jm, llm), wg(ip1jmp1, llm)
35 guez 31
36 guez 40 INTEGER:: iadvtr = 0
37     INTEGER ij, l, iq
38     REAL zdpmin, zdpmax
39     EXTERNAL minmax
40 guez 31
41 guez 40 ! Rajouts pour PPM
42 guez 3
43 guez 40 INTEGER indice, n
44     ! Pas de temps adaptatif pour que CFL < 1
45     REAL dtbon
46     REAL cflmaxz ! CFL maximum
47     real aaa, bbb
48     REAL psppm(iim, jjp1) ! pression au sol
49     REAL unatppm(iim, jjp1, llm), vnatppm(iim, jjp1, llm)
50     REAL qppm(iim*jjp1, llm, nqmx)
51     REAL fluxwppm(iim, jjp1, llm)
52     REAL apppm(llmp1), bpppm(llmp1)
53     LOGICAL:: dum = .TRUE., fill = .TRUE.
54 guez 3
55 guez 40 !-----------------------------------------------------------
56 guez 3
57 guez 40 IF (iadvtr==0) THEN
58     CALL initial0(ijp1llm, pbaruc)
59     CALL initial0(ijmllm, pbarvc)
60     END IF
61 guez 3
62 guez 40 ! accumulation des flux de masse horizontaux
63     DO l = 1, llm
64     DO ij = 1, ip1jmp1
65     pbaruc(ij, l) = pbaruc(ij, l) + pbaru(ij, l)
66     END DO
67     DO ij = 1, ip1jm
68     pbarvc(ij, l) = pbarvc(ij, l) + pbarv(ij, l)
69     END DO
70     END DO
71 guez 3
72 guez 40 ! selection de la masse instantannee des mailles avant le transport.
73 guez 71 IF (iadvtr==0) massem = masse
74 guez 3
75 guez 40 iadvtr = iadvtr + 1
76     iapptrac = iadvtr
77 guez 3
78 guez 40 ! Test pour savoir si on advecte a ce pas de temps
79 guez 71 IF (iadvtr == iapp_tracvl) THEN
80 guez 40 ! traitement des flux de masse avant advection.
81     ! 1. calcul de w
82     ! 2. groupement des mailles pres du pole.
83 guez 3
84 guez 40 CALL groupe(massem, pbaruc, pbarvc, pbarug, pbarvg, wg)
85 guez 3
86 guez 40 ! test sur l'eventuelle creation de valeurs negatives de la masse
87     DO l = 1, llm - 1
88     DO ij = iip2 + 1, ip1jm
89     zdp(ij) = pbarug(ij-1, l) - pbarug(ij, l) - pbarvg(ij-iip1, l) + &
90     pbarvg(ij, l) + wg(ij, l+1) - wg(ij, l)
91     END DO
92     CALL scopy(jjm-1, zdp(iip1+iip1), iip1, zdp(iip2), iip1)
93     DO ij = iip2, ip1jm
94     zdp(ij) = zdp(ij)*dtvr/massem(ij, l)
95     END DO
96 guez 3
97 guez 40 CALL minmax(ip1jm-iip1, zdp(iip2), zdpmin, zdpmax)
98 guez 3
99 guez 40 IF (max(abs(zdpmin), abs(zdpmax))>0.5) THEN
100     PRINT *, 'WARNING DP/P l=', l, ' MIN:', zdpmin, ' MAX:', zdpmax
101     END IF
102     END DO
103 guez 3
104 guez 40 ! Advection proprement dite
105 guez 3
106 guez 40 ! Calcul des moyennes basées sur la masse
107     CALL massbar(massem, massebx, masseby)
108 guez 31
109 guez 40 ! Appel des sous programmes d'advection
110 guez 31
111 guez 40 DO iq = 1, nqmx
112     IF (iadv(iq)==0) CYCLE
113 guez 31
114 guez 40 ! Schema de Van Leer I MUSCL
115 guez 3
116 guez 40 IF (iadv(iq)==10) THEN
117     CALL vlsplt(q(:, :, iq), 2., massem, wg, pbarug, pbarvg, dtvr)
118     ! Schema "pseudo amont" + test sur humidite specifique
119     ! pour la vapeur d'eau. F. Codron
120     ELSE IF (iadv(iq)==14) THEN
121     CALL vlspltqs(q(1, 1, 1), 2., massem, wg, pbarug, pbarvg, dtvr, &
122     p, pk, teta)
123     ! Schema de Frederic Hourdin
124     ELSE IF (iadv(iq)==12) THEN
125     ! Pas de temps adaptatif
126 guez 104 CALL adaptdt(dtbon, n, pbarug, massem)
127 guez 40 IF (n>1) THEN
128     WRITE (*, *) 'WARNING horizontal dt=', dtbon, 'dtvr=', dtvr, &
129     'n=', n
130     END IF
131     DO indice = 1, n
132     CALL advn(q(1, 1, iq), massem, wg, pbarug, pbarvg, dtbon, 1)
133     END DO
134     ELSE IF (iadv(iq)==13) THEN
135     ! Pas de temps adaptatif
136 guez 104 CALL adaptdt(dtbon, n, pbarug, massem)
137 guez 40 IF (n>1) THEN
138     WRITE (*, *) 'WARNING horizontal dt=', dtbon, 'dtvr=', dtvr, &
139     'n=', n
140     END IF
141     DO indice = 1, n
142     CALL advn(q(1, 1, iq), massem, wg, pbarug, pbarvg, dtbon, 2)
143     END DO
144     ! Schema de pente SLOPES
145     ELSE IF (iadv(iq)==20) THEN
146     CALL pentes_ini(q(1, 1, iq), wg, massem, pbarug, pbarvg, 0)
147     ! Schema de Prather
148     ELSE IF (iadv(iq)==30) THEN
149     ! Pas de temps adaptatif
150 guez 104 CALL adaptdt(dtbon, n, pbarug, massem)
151 guez 40 IF (n>1) THEN
152     WRITE (*, *) 'WARNING horizontal dt=', dtbon, 'dtvr=', dtvr, &
153     'n=', n
154     END IF
155     CALL prather(q(1, 1, iq), wg, massem, pbarug, pbarvg, n, dtbon)
156     ! Schemas PPM Lin et Rood
157     ELSE IF (iadv(iq)==11 .OR. (iadv(iq)>=16 .AND. iadv(iq)<=18)) THEN
158     ! Test sur le flux horizontal
159     ! Pas de temps adaptatif
160 guez 104 CALL adaptdt(dtbon, n, pbarug, massem)
161 guez 40 IF (n>1) THEN
162     WRITE (*, *) 'WARNING horizontal dt=', dtbon, 'dtvr=', dtvr, &
163     'n=', n
164     END IF
165     ! Test sur le flux vertical
166     cflmaxz = 0.
167     DO l = 2, llm
168     DO ij = iip2, ip1jm
169     aaa = wg(ij, l)*dtvr/massem(ij, l)
170     cflmaxz = max(cflmaxz, aaa)
171     bbb = -wg(ij, l)*dtvr/massem(ij, l-1)
172     cflmaxz = max(cflmaxz, bbb)
173     END DO
174     END DO
175     IF (cflmaxz>=1) THEN
176     WRITE (*, *) 'WARNING vertical', 'CFLmaxz=', cflmaxz
177     END IF
178 guez 3
179 guez 40 ! Ss-prg interface LMDZ.4->PPM3d
180     CALL interpre(q(1, 1, iq), qppm(1, 1, iq), wg, fluxwppm, massem, &
181     apppm, bpppm, massebx, masseby, pbarug, pbarvg, unatppm, &
182     vnatppm, psppm)
183 guez 31
184 guez 40 DO indice = 1, n
185     ! VL (version PPM) horiz. et PPM vert.
186     IF (iadv(iq)==11) THEN
187     ! Ss-prg PPM3d de Lin
188     CALL ppm3d(1, qppm(1, 1, iq), psppm, psppm, unatppm, &
189     vnatppm, fluxwppm, dtbon, 2, 2, 2, 1, iim, jjp1, 2, &
190     llm, apppm, bpppm, 0.01, 6400000, fill, dum, 220.)
191     ! Monotonic PPM
192     ELSE IF (iadv(iq)==16) THEN
193     ! Ss-prg PPM3d de Lin
194     CALL ppm3d(1, qppm(1, 1, iq), psppm, psppm, unatppm, &
195     vnatppm, fluxwppm, dtbon, 3, 3, 3, 1, iim, jjp1, 2, &
196     llm, apppm, bpppm, 0.01, 6400000, fill, dum, 220.)
197     ! Semi Monotonic PPM
198     ELSE IF (iadv(iq)==17) THEN
199     ! Ss-prg PPM3d de Lin
200     CALL ppm3d(1, qppm(1, 1, iq), psppm, psppm, unatppm, &
201     vnatppm, fluxwppm, dtbon, 4, 4, 4, 1, iim, jjp1, 2, &
202     llm, apppm, bpppm, 0.01, 6400000, fill, dum, 220.)
203     ! Positive Definite PPM
204     ELSE IF (iadv(iq)==18) THEN
205     ! Ss-prg PPM3d de Lin
206     CALL ppm3d(1, qppm(1, 1, iq), psppm, psppm, unatppm, &
207     vnatppm, fluxwppm, dtbon, 5, 5, 5, 1, iim, jjp1, 2, &
208     llm, apppm, bpppm, 0.01, 6400000, fill, dum, 220.)
209     END IF
210     END DO
211 guez 3
212 guez 40 ! Ss-prg interface PPM3d-LMDZ.4
213     CALL interpost(q(1, 1, iq), qppm(1, 1, iq))
214     END IF
215     END DO
216 guez 3
217 guez 40 ! on reinitialise a zero les flux de masse cumules
218     iadvtr = 0
219     END IF
220    
221     END SUBROUTINE advtrac
222    
223     end module advtrac_m

  ViewVC Help
Powered by ViewVC 1.1.21