/[lmdze]/trunk/libf/dyn3d/leapfrog.f90
ViewVC logotype

Contents of /trunk/libf/dyn3d/leapfrog.f90

Parent Directory Parent Directory | Revision Log Revision Log


Revision 27 - (show annotations)
Thu Mar 25 14:29:07 2010 UTC (14 years, 1 month ago) by guez
File size: 9168 byte(s)
"dyn3d" and "filtrez" do not contain any included file so make rules
have been updated.

"comdissip.f90" was useless, removed it.

"dynredem0" wrote undefined value in "controle(31)", that was
overwritten by "dynredem1". Now "dynredem0" just writes 0 to
"controle(31)".

Removed arguments of "inidissip". "inidissip" now accesses the
variables by use association.

In program "etat0_lim", "itaufin" is not defined so "dynredem1" wrote
undefined value to "controle(31)". Added argument "itau" of
"dynredem1" to correct that.

"itaufin" does not need to be a module variable (of "temps"), made it
a local variable of "leapfrog".

Removed calls to "diagedyn" from "leapfrog".

1 module leapfrog_m
2
3 IMPLICIT NONE
4
5 contains
6
7 SUBROUTINE leapfrog(ucov, vcov, teta, ps, masse, phis, q, time_0)
8
9 ! From dyn3d/leapfrog.F, version 1.6, 2005/04/13 08:58:34
10 ! Authors: P. Le Van, L. Fairhead, F. Hourdin
11
12 USE calfis_m, ONLY: calfis
13 USE com_io_dyn, ONLY: histaveid
14 USE comconst, ONLY: daysec, dtphys, dtvr
15 USE comgeom, ONLY: aire, apoln, apols
16 USE comvert, ONLY: ap, bp
17 USE conf_gcm_m, ONLY: day_step, iconser, iperiod, iphysiq, nday, offline, &
18 periodav
19 USE dimens_m, ONLY: iim, llm, nqmx
20 USE dynetat0_m, ONLY: day_ini
21 use dynredem1_m, only: dynredem1
22 USE exner_hyb_m, ONLY: exner_hyb
23 use filtreg_m, only: filtreg
24 USE guide_m, ONLY: guide
25 use inidissip_m, only: idissip
26 USE logic, ONLY: iflag_phys, ok_guide
27 USE paramet_m, ONLY: iip1, ip1jm, ip1jmp1, jjp1
28 USE pression_m, ONLY: pression
29 USE pressure_var, ONLY: p3d
30 USE temps, ONLY: dt, itau_dyn
31
32 ! Variables dynamiques:
33 REAL vcov(ip1jm, llm), ucov(ip1jmp1, llm) ! vents covariants
34 REAL teta(ip1jmp1, llm) ! temperature potentielle
35 REAL ps(ip1jmp1) ! pression au sol, en Pa
36
37 REAL masse(ip1jmp1, llm) ! masse d'air
38 REAL phis(ip1jmp1) ! geopotentiel au sol
39 REAL q(ip1jmp1, llm, nqmx) ! mass fractions of advected fields
40 REAL, intent(in):: time_0
41
42 ! Variables local to the procedure:
43
44 ! Variables dynamiques:
45
46 REAL pks(ip1jmp1) ! exner au sol
47 REAL pk(ip1jmp1, llm) ! exner au milieu des couches
48 REAL pkf(ip1jmp1, llm) ! exner filt.au milieu des couches
49 REAL phi(ip1jmp1, llm) ! geopotential
50 REAL w(ip1jmp1, llm) ! vitesse verticale
51
52 ! variables dynamiques intermediaire pour le transport
53 REAL pbaru(ip1jmp1, llm), pbarv(ip1jm, llm) !flux de masse
54
55 ! variables dynamiques au pas - 1
56 REAL vcovm1(ip1jm, llm), ucovm1(ip1jmp1, llm)
57 REAL tetam1(ip1jmp1, llm), psm1(ip1jmp1)
58 REAL massem1(ip1jmp1, llm)
59
60 ! tendances dynamiques
61 REAL dv(ip1jm, llm), du(ip1jmp1, llm)
62 REAL dteta(ip1jmp1, llm), dq(ip1jmp1, llm, nqmx), dp(ip1jmp1)
63
64 ! tendances de la dissipation
65 REAL dvdis(ip1jm, llm), dudis(ip1jmp1, llm)
66 REAL dtetadis(ip1jmp1, llm)
67
68 ! tendances physiques
69 REAL dvfi(ip1jm, llm), dufi(ip1jmp1, llm)
70 REAL dtetafi(ip1jmp1, llm), dqfi(ip1jmp1, llm, nqmx), dpfi(ip1jmp1)
71
72 ! variables pour le fichier histoire
73
74 REAL tppn(iim), tpps(iim), tpn, tps
75
76 INTEGER itau ! index of the time step of the dynamics, starts at 0
77 INTEGER itaufin
78 INTEGER iday ! jour julien
79 REAL time ! time of day, as a fraction of day length
80 real finvmaold(ip1jmp1, llm)
81 LOGICAL:: lafin=.false.
82 INTEGER ij, l
83
84 REAL rdayvrai, rdaym_ini
85
86 ! Variables test conservation energie
87 REAL ecin(ip1jmp1, llm), ecin0(ip1jmp1, llm)
88 ! Tendance de la temp. potentiel d (theta) / d t due a la
89 ! tansformation d'energie cinetique en energie thermique
90 ! cree par la dissipation
91 REAL dtetaecdt(ip1jmp1, llm)
92 REAL vcont(ip1jm, llm), ucont(ip1jmp1, llm)
93 logical forward, leapf
94
95 !---------------------------------------------------
96
97 print *, "Call sequence information: leapfrog"
98
99 itaufin = nday * day_step
100 itau = 0
101 iday = day_ini
102 time = time_0
103 dq = 0.
104 ! On initialise la pression et la fonction d'Exner :
105 CALL pression(ip1jmp1, ap, bp, ps, p3d)
106 CALL exner_hyb(ps, p3d, pks, pk, pkf)
107
108 ! Début de l'integration temporelle :
109 outer_loop:do
110 if (ok_guide .and. (itaufin - itau - 1) * dtvr > 21600.) &
111 call guide(itau, ucov, vcov, teta, q, masse, ps)
112 vcovm1 = vcov
113 ucovm1 = ucov
114 tetam1 = teta
115 massem1 = masse
116 psm1 = ps
117 forward = .TRUE.
118 leapf = .FALSE.
119 dt = dtvr
120 finvmaold = masse
121 CALL filtreg(finvmaold, jjp1, llm, - 2, 2, .TRUE., 1)
122
123 do
124 ! Calcul des tendances dynamiques:
125 CALL geopot(ip1jmp1, teta, pk, pks, phis, phi)
126 CALL caldyn(itau, ucov, vcov, teta, ps, masse, pk, pkf, phis, phi, &
127 MOD(itau, iconser) == 0, du, dv, dteta, dp, w, pbaru, pbarv, &
128 time + iday - day_ini)
129
130 IF (forward .OR. leapf) THEN
131 ! Calcul des tendances advection des traceurs (dont l'humidité)
132 CALL caladvtrac(q, pbaru, pbarv, p3d, masse, dq, teta, pk)
133 IF (offline) THEN
134 ! Stokage du flux de masse pour traceurs off-line
135 CALL fluxstokenc(pbaru, pbarv, masse, teta, phi, phis, dtvr, &
136 itau)
137 ENDIF
138 ENDIF
139
140 ! integrations dynamique et traceurs:
141 CALL integrd(2, vcovm1, ucovm1, tetam1, psm1, massem1, dv, du, &
142 dteta, dq, dp, vcov, ucov, teta, q, ps, masse, phis, &
143 finvmaold, leapf)
144
145 IF (MOD(itau + 1, iphysiq) == 0 .AND. iflag_phys /= 0) THEN
146 ! calcul des tendances physiques:
147 IF (itau + 1 == itaufin) lafin = .TRUE.
148
149 CALL pression(ip1jmp1, ap, bp, ps, p3d)
150 CALL exner_hyb(ps, p3d, pks, pk, pkf)
151
152 rdaym_ini = itau * dtvr / daysec
153 rdayvrai = rdaym_ini + day_ini
154
155 CALL calfis(nqmx, lafin, rdayvrai, time, ucov, vcov, teta, q, &
156 masse, ps, pk, phis, phi, du, dv, dteta, dq, w, &
157 dufi, dvfi, dtetafi, dqfi, dpfi)
158
159 ! ajout des tendances physiques:
160 CALL addfi(nqmx, dtphys, &
161 ucov, vcov, teta, q, ps, &
162 dufi, dvfi, dtetafi, dqfi, dpfi)
163 ENDIF
164
165 CALL pression(ip1jmp1, ap, bp, ps, p3d)
166 CALL exner_hyb(ps, p3d, pks, pk, pkf)
167
168 IF (MOD(itau + 1, idissip) == 0) THEN
169 ! dissipation horizontale et verticale des petites echelles:
170
171 ! calcul de l'energie cinetique avant dissipation
172 call covcont(llm, ucov, vcov, ucont, vcont)
173 call enercin(vcov, ucov, vcont, ucont, ecin0)
174
175 ! dissipation
176 CALL dissip(vcov, ucov, teta, p3d, dvdis, dudis, dtetadis)
177 ucov=ucov + dudis
178 vcov=vcov + dvdis
179
180 ! On rajoute la tendance due a la transform. Ec -> E
181 ! therm. cree lors de la dissipation
182 call covcont(llm, ucov, vcov, ucont, vcont)
183 call enercin(vcov, ucov, vcont, ucont, ecin)
184 dtetaecdt= (ecin0 - ecin) / pk
185 dtetadis=dtetadis + dtetaecdt
186 teta=teta + dtetadis
187
188 ! Calcul de la valeur moyenne, unique de h aux poles .....
189 DO l = 1, llm
190 DO ij = 1, iim
191 tppn(ij) = aire(ij) * teta(ij, l)
192 tpps(ij) = aire(ij + ip1jm) * teta(ij + ip1jm, l)
193 ENDDO
194 tpn = SUM(tppn) / apoln
195 tps = SUM(tpps) / apols
196
197 DO ij = 1, iip1
198 teta(ij, l) = tpn
199 teta(ij + ip1jm, l) = tps
200 ENDDO
201 ENDDO
202
203 DO ij = 1, iim
204 tppn(ij) = aire(ij) * ps(ij)
205 tpps(ij) = aire(ij + ip1jm) * ps(ij + ip1jm)
206 ENDDO
207 tpn = SUM(tppn) / apoln
208 tps = SUM(tpps) / apols
209
210 DO ij = 1, iip1
211 ps(ij) = tpn
212 ps(ij + ip1jm) = tps
213 ENDDO
214 END IF
215
216 ! fin de l'intégration dynamique et physique pour le pas "itau"
217 ! préparation du pas d'intégration suivant
218
219 ! schema matsuno + leapfrog
220 IF (forward .OR. leapf) THEN
221 itau = itau + 1
222 iday = day_ini + itau / day_step
223 time = REAL(itau - (iday - day_ini) * day_step) / day_step &
224 + time_0
225 IF (time > 1.) THEN
226 time = time - 1.
227 iday = iday + 1
228 ENDIF
229 ENDIF
230
231 IF (itau == itaufin + 1) exit outer_loop
232
233 IF (MOD(itau, iperiod) == 0 .OR. itau == itaufin) THEN
234 ! ecriture du fichier histoire moyenne:
235 CALL writedynav(histaveid, nqmx, itau, vcov, &
236 ucov, teta, pk, phi, q, masse, ps, phis)
237 call bilan_dyn(2, dtvr * iperiod, dtvr * day_step * periodav, &
238 ps, masse, pk, pbaru, pbarv, teta, phi, ucov, vcov, q)
239 ENDIF
240
241 IF (itau == itaufin) THEN
242 CALL dynredem1("restart.nc", vcov, ucov, teta, q, masse, ps, &
243 itau=itau_dyn+itaufin)
244 ENDIF
245
246 ! gestion de l'integration temporelle:
247 IF (MOD(itau, iperiod) == 0) exit
248 IF (MOD(itau - 1, iperiod) == 0) THEN
249 IF (forward) THEN
250 ! fin du pas forward et debut du pas backward
251 forward = .FALSE.
252 leapf = .FALSE.
253 ELSE
254 ! fin du pas backward et debut du premier pas leapfrog
255 leapf = .TRUE.
256 dt = 2. * dtvr
257 END IF
258 ELSE
259 ! pas leapfrog
260 leapf = .TRUE.
261 dt = 2. * dtvr
262 END IF
263 end do
264 end do outer_loop
265
266 END SUBROUTINE leapfrog
267
268 end module leapfrog_m

  ViewVC Help
Powered by ViewVC 1.1.21