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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 5 - (hide 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 guez 3 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 guez 5 CALL dynredem1("restart.nc", 0., vcov, ucov, teta, q, masse, ps)
336 guez 3 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