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

Contents of /trunk/Sources/dyn3d/leapfrog.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 5 - (show annotations)
Mon Mar 3 16:32:04 2008 UTC (16 years, 2 months ago) by guez
Original Path: trunk/libf/dyn3d/leapfrog.f90
File size: 11934 byte(s)
Created module from included file parafilt.
Converted caldyn0 to free format.
Added a rule to create cross-references with NAG.
Added optional attribute in iniadvtrac.
Suppressed argument nq in dynredem0 and dynredem1, using nqmx instead.
Replaced some NetCDF calls by netcdf95 calls in dynredem0.
Added intent attribute in dynredem0 and dynredem1.
Annotated use statements with only clause, in dynredem1.
Suppressed variable nq and argument of iniadvtrac in etat0.
Added test on nqmx in etat0.
1 module leapfrog_m
2
3 ! This module is clean: no C preprocessor directive, no include line.
4
5 IMPLICIT NONE
6
7 contains
8
9 SUBROUTINE leapfrog(ucov, vcov, teta, ps, masse, phis, nq, q, clesphy0, &
10 time_0)
11
12 ! From dyn3d/leapfrog.F, version 1.6 2005/04/13 08:58:34
13
14 ! Version du 10/01/98, avec coordonnees verticales hybrides, avec
15 ! nouveaux operat. dissipation * (gradiv2, divgrad2, nxgraro2)
16
17 ! Auteur: P. Le Van /L. Fairhead/F.Hourdin
18 ! Objet:
19 ! GCM LMD nouvelle grille
20
21 ! ... Dans inigeom, nouveaux calculs pour les elongations cu, cv
22 ! et possibilite d'appeler une fonction f(y) a derivee tangente
23 ! hyperbolique a la place de la fonction a derivee sinusoidale.
24
25 ! ... Possibilite de choisir le shema pour l'advection de
26 ! q, en modifiant iadv dans "traceur.def" (10/02) .
27
28 ! Pour Van-Leer + Vapeur d'eau saturee, iadv(1)=4. (F.Codron, 10/99)
29 ! Pour Van-Leer iadv=10
30
31 use dimens_m, only: iim, llm, nqmx
32 use paramet_m, only: ip1jmp1, ip1jm, llmp1, ijmllm, ijp1llm, jjp1, iip1, &
33 iip2
34 use comconst, only: dtvr, daysec, dtphys
35 use comvert, only: ap, bp
36 use conf_gcm_m, only: day_step, iconser, idissip, iphysiq, iperiod, nday, &
37 offline, periodav
38 use logic, only: ok_guide, apdiss, apphys, conser, forward, iflag_phys, &
39 leapf, statcl
40 use comgeom
41 use serre
42 use temps, only: itaufin, day_ini, dt
43 use iniprint, only: prt_level
44 use com_io_dyn
45 use abort_gcm_m, only: abort_gcm
46 use ener
47 use calfis_m, only: calfis
48 use exner_hyb_m, only: exner_hyb
49 use guide_m, only: guide
50 use pression_m, only: pression
51
52 integer nq
53
54 INTEGER longcles
55 PARAMETER (longcles = 20)
56 REAL clesphy0(longcles)
57
58 ! variables dynamiques
59 REAL vcov(ip1jm, llm), ucov(ip1jmp1, llm) ! vents covariants
60 REAL teta(ip1jmp1, llm) ! temperature potentielle
61 REAL q(ip1jmp1, llm, nqmx) ! mass fractions of advected fields
62 REAL ps(ip1jmp1) ! pression au sol
63 REAL p(ip1jmp1, llmp1) ! pression aux interfac.des couches
64 REAL pks(ip1jmp1) ! exner au sol
65 REAL pk(ip1jmp1, llm) ! exner au milieu des couches
66 REAL pkf(ip1jmp1, llm) ! exner filt.au milieu des couches
67 REAL masse(ip1jmp1, llm) ! masse d'air
68 REAL phis(ip1jmp1) ! geopotentiel au sol
69 REAL phi(ip1jmp1, llm) ! geopotential
70 REAL w(ip1jmp1, llm) ! vitesse verticale
71
72 ! variables dynamiques intermediaire pour le transport
73 REAL pbaru(ip1jmp1, llm), pbarv(ip1jm, llm) !flux de masse
74
75 ! variables dynamiques au pas - 1
76 REAL vcovm1(ip1jm, llm), ucovm1(ip1jmp1, llm)
77 REAL tetam1(ip1jmp1, llm), psm1(ip1jmp1)
78 REAL massem1(ip1jmp1, llm)
79
80 ! tendances dynamiques
81 REAL dv(ip1jm, llm), du(ip1jmp1, llm)
82 REAL dteta(ip1jmp1, llm), dq(ip1jmp1, llm, nqmx), dp(ip1jmp1)
83
84 ! tendances de la dissipation
85 REAL dvdis(ip1jm, llm), dudis(ip1jmp1, llm)
86 REAL dtetadis(ip1jmp1, llm)
87
88 ! tendances physiques
89 REAL dvfi(ip1jm, llm), dufi(ip1jmp1, llm)
90 REAL dtetafi(ip1jmp1, llm), dqfi(ip1jmp1, llm, nqmx), dpfi(ip1jmp1)
91
92 ! variables pour le fichier histoire
93
94 REAL tppn(iim), tpps(iim), tpn, tps
95
96 INTEGER itau, itaufinp1
97 INTEGER iday ! jour julien
98 REAL time ! Heure de la journee en fraction d'1 jour
99
100 REAL SSUM
101 REAL time_0, finvmaold(ip1jmp1, llm)
102
103 LOGICAL :: lafin=.false.
104 INTEGER ij, l
105
106 REAL rdayvrai, rdaym_ini
107 LOGICAL callinigrads
108
109 data callinigrads/.true./
110
111 !+jld variables test conservation energie
112 REAL ecin(ip1jmp1, llm), ecin0(ip1jmp1, llm)
113 ! Tendance de la temp. potentiel d (theta) / d t due a la
114 ! tansformation d'energie cinetique en energie thermique
115 ! cree par la dissipation
116 REAL dtetaecdt(ip1jmp1, llm)
117 REAL vcont(ip1jm, llm), ucont(ip1jmp1, llm)
118 CHARACTER*15 ztit
119 INTEGER ip_ebil_dyn ! PRINT level for energy conserv. diag.
120 SAVE ip_ebil_dyn
121 DATA ip_ebil_dyn /0/
122
123 character(len=*), parameter:: modname = "leapfrog"
124 character*80 abort_message
125
126 logical dissip_conservative
127 save dissip_conservative
128 data dissip_conservative /.true./
129
130 LOGICAL prem
131 save prem
132 DATA prem /.true./
133
134 !---------------------------------------------------
135
136 print *, "Call sequence information: leapfrog"
137
138 itaufin = nday * day_step
139 itaufinp1 = itaufin + 1
140
141 itau = 0
142 iday = day_ini
143 time = time_0
144 IF (time > 1.) THEN
145 time = time - 1.
146 iday = iday + 1
147 ENDIF
148
149 ! On initialise la pression et la fonction d'Exner :
150 dq=0.
151 CALL pression(ip1jmp1, ap, bp, ps, p)
152 CALL exner_hyb(ps, p, pks, pk, pkf)
153
154 ! Debut de l'integration temporelle:
155 do
156 if (ok_guide.and.(itaufin - itau - 1) * dtvr > 21600) then
157 call guide(itau, ucov, vcov, teta, q, masse, ps)
158 else
159 IF (prt_level > 9) print *, &
160 'Attention : on ne guide pas les 6 dernieres heures.'
161 endif
162
163 CALL SCOPY(ijmllm, vcov, 1, vcovm1, 1)
164 CALL SCOPY(ijp1llm, ucov, 1, ucovm1, 1)
165 CALL SCOPY(ijp1llm, teta, 1, tetam1, 1)
166 CALL SCOPY(ijp1llm, masse, 1, massem1, 1)
167 CALL SCOPY(ip1jmp1, ps, 1, psm1, 1)
168
169 forward = .TRUE.
170 leapf = .FALSE.
171 dt = dtvr
172
173 CALL SCOPY(ijp1llm, masse, 1, finvmaold, 1)
174 CALL filtreg(finvmaold, jjp1, llm, - 2, 2, .TRUE., 1)
175
176 do
177 ! gestion des appels de la physique et des dissipations:
178
179 apphys = .FALSE.
180 statcl = .FALSE.
181 conser = .FALSE.
182 apdiss = .FALSE.
183
184 IF (MOD(itau, iconser) == 0) conser = .TRUE.
185 IF (MOD(itau + 1, idissip) == 0) apdiss = .TRUE.
186 IF (MOD(itau + 1, iphysiq) == 0 .AND. iflag_phys /= 0) apphys=.TRUE.
187
188 ! calcul des tendances dynamiques:
189
190 CALL geopot(ip1jmp1, teta, pk, pks, phis, phi)
191
192 CALL caldyn(itau, ucov, vcov, teta, ps, masse, pk, pkf, phis, phi, &
193 conser, du, dv, dteta, dp, w, pbaru, pbarv, &
194 time + iday - day_ini)
195
196 ! calcul des tendances advection des traceurs (dont l'humidite)
197
198 IF (forward .OR. leapf) THEN
199 CALL caladvtrac(q, pbaru, pbarv, p, masse, dq, teta, pk)
200 IF (offline) THEN
201 !maf stokage du flux de masse pour traceurs OFF-LINE
202 CALL fluxstokenc(pbaru, pbarv, masse, teta, phi, phis, dtvr, &
203 itau)
204 ENDIF
205 ENDIF
206
207 ! integrations dynamique et traceurs:
208 CALL integrd(2, vcovm1, ucovm1, tetam1, psm1, massem1, dv, du, &
209 dteta, dq, dp, vcov, ucov, teta, q, ps, masse, phis, finvmaold)
210
211 ! calcul des tendances physiques:
212
213 IF (apphys) THEN
214 IF (itau + 1 == itaufin) lafin = .TRUE.
215
216 CALL pression(ip1jmp1, ap, bp, ps, p)
217 CALL exner_hyb(ps, p, pks, pk, pkf)
218
219 rdaym_ini = itau * dtvr / daysec
220 rdayvrai = rdaym_ini + day_ini
221
222 ! Interface avec les routines de phylmd (phymars ...)
223
224 ! Diagnostique de conservation de l'énergie : initialisation
225 IF (ip_ebil_dyn >= 1) THEN
226 ztit='bil dyn'
227 CALL diagedyn(ztit, 2, 1, 1, dtphys &
228 , ucov, vcov, ps, p, pk, teta, q(:, :, 1), q(:, :, 2))
229 ENDIF
230
231 CALL calfis(nq, lafin, rdayvrai, time, ucov, vcov, teta, q, &
232 masse, ps, p, pk, phis, phi, du, dv, dteta, dq, w, &
233 clesphy0, dufi, dvfi, dtetafi, dqfi, dpfi)
234
235 ! ajout des tendances physiques:
236 CALL addfi(nqmx, dtphys, &
237 ucov, vcov, teta, q, ps, &
238 dufi, dvfi, dtetafi, dqfi, dpfi)
239
240 ! Diagnostique de conservation de l'énergie : difference
241 IF (ip_ebil_dyn >= 1) THEN
242 ztit = 'bil phys'
243 CALL diagedyn(ztit, 2, 1, 1, dtphys, ucov, vcov, ps, p, pk, &
244 teta, q(:, :, 1), q(:, :, 2))
245 ENDIF
246 ENDIF
247
248 CALL pression(ip1jmp1, ap, bp, ps, p)
249 CALL exner_hyb(ps, p, pks, pk, pkf)
250
251 ! dissipation horizontale et verticale des petites echelles:
252
253 IF (apdiss) THEN
254 ! calcul de l'energie cinetique avant dissipation
255 call covcont(llm, ucov, vcov, ucont, vcont)
256 call enercin(vcov, ucov, vcont, ucont, ecin0)
257
258 ! dissipation
259 CALL dissip(vcov, ucov, teta, p, dvdis, dudis, dtetadis)
260 ucov=ucov + dudis
261 vcov=vcov + dvdis
262
263 if (dissip_conservative) then
264 ! On rajoute la tendance due a la transform. Ec -> E
265 ! therm. cree lors de la dissipation
266 call covcont(llm, ucov, vcov, ucont, vcont)
267 call enercin(vcov, ucov, vcont, ucont, ecin)
268 dtetaecdt= (ecin0 - ecin) / pk
269 dtetadis=dtetadis + dtetaecdt
270 endif
271 teta=teta + dtetadis
272
273 ! Calcul de la valeur moyenne, unique de h aux poles .....
274
275 DO l = 1, llm
276 DO ij = 1, iim
277 tppn(ij) = aire(ij) * teta(ij, l)
278 tpps(ij) = aire(ij + ip1jm) * teta(ij + ip1jm, l)
279 ENDDO
280 tpn = SSUM(iim, tppn, 1) / apoln
281 tps = SSUM(iim, tpps, 1) / apols
282
283 DO ij = 1, iip1
284 teta(ij, l) = tpn
285 teta(ij + ip1jm, l) = tps
286 ENDDO
287 ENDDO
288
289 DO ij = 1, iim
290 tppn(ij) = aire(ij) * ps(ij)
291 tpps(ij) = aire(ij + ip1jm) * ps(ij + ip1jm)
292 ENDDO
293 tpn = SSUM(iim, tppn, 1) / apoln
294 tps = SSUM(iim, tpps, 1) / apols
295
296 DO ij = 1, iip1
297 ps(ij) = tpn
298 ps(ij + ip1jm) = tps
299 ENDDO
300
301 END IF
302
303 ! fin de l'intégration dynamique et physique pour le pas "itau"
304 ! préparation du pas d'intégration suivant
305
306 ! schema matsuno + leapfrog
307 IF (forward .OR. leapf) THEN
308 itau = itau + 1
309 iday = day_ini + itau / day_step
310 time = REAL(itau - (iday - day_ini) * day_step) / day_step &
311 + time_0
312 IF (time > 1.) THEN
313 time = time - 1.
314 iday = iday + 1
315 ENDIF
316 ENDIF
317
318 IF (itau == itaufinp1) then
319 abort_message = 'Simulation finished'
320 call abort_gcm(modname, abort_message, 0)
321 ENDIF
322
323 ! ecriture du fichier histoire moyenne:
324
325 ! Comment out the following calls when you do not want the output
326 ! files "dyn_hist_ave.nc" and "dynzon.nc"
327 IF (MOD(itau, iperiod) == 0 .OR. itau == itaufin) THEN
328 CALL writedynav(histaveid, nqmx, itau, vcov, &
329 ucov, teta, pk, phi, q, masse, ps, phis)
330 call bilan_dyn(2, dtvr * iperiod, dtvr * day_step * periodav, &
331 ps, masse, pk, pbaru, pbarv, teta, phi, ucov, vcov, q)
332 ENDIF
333
334 IF (itau == itaufin) THEN
335 CALL dynredem1("restart.nc", 0., vcov, ucov, teta, q, masse, ps)
336 CLOSE(99)
337 ENDIF
338
339 ! gestion de l'integration temporelle:
340
341 IF (MOD(itau, iperiod) == 0) exit
342 IF (MOD(itau - 1, iperiod) == 0) THEN
343 IF (forward) THEN
344 ! fin du pas forward et debut du pas backward
345 forward = .FALSE.
346 leapf = .FALSE.
347 ELSE
348 ! fin du pas backward et debut du premier pas leapfrog
349 leapf = .TRUE.
350 dt = 2. * dtvr
351 END IF
352 ELSE
353 ! ...... pas leapfrog .....
354 leapf = .TRUE.
355 dt = 2. * dtvr
356 END IF
357 end do
358 end do
359
360 END SUBROUTINE leapfrog
361
362 end module leapfrog_m

  ViewVC Help
Powered by ViewVC 1.1.21