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

Contents of /trunk/dyn3d/leapfrog.f90

Parent Directory Parent Directory | Revision Log Revision Log


Revision 26 - (show annotations)
Tue Mar 9 15:27:15 2010 UTC (14 years, 2 months ago) by guez
Original Path: trunk/libf/dyn3d/leapfrog.f90
File size: 10011 byte(s)
Moved variable "dtdiss" from module "comconst", variable "idissip"
from module "conf_gcm_m" and all variables from module "comdissipn" to
module "inidissip_m". "inidissip" creates file
"inidissip.csv". "idissip" is no longer read from a namelist. Removed
useless computation of "dtdiss" in procedure "iniconst".

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

  ViewVC Help
Powered by ViewVC 1.1.21