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

Contents of /trunk/dyn3d/leapfrog.f90

Parent Directory Parent Directory | Revision Log Revision Log


Revision 25 - (show annotations)
Fri Mar 5 16:43:45 2010 UTC (14 years, 2 months ago) by guez
Original Path: trunk/libf/dyn3d/leapfrog.f90
File size: 10037 byte(s)
Simplified "etat0_lim.sh" and "gcm.sh" because the full versions
depended on personal arrangements for directories and machines.

Translated included files into modules. Encapsulated procedures into modules.

Moved variables from module "comgeom" to local variables of
"inigeom". Deleted some unused variables in "comgeom".

Moved variable "day_ini" from module "temps" to module "dynetat0_m".

Removed useless test on variable "time" and useless "close" statement
in procedure "leapfrog".

Removed useless call to "inigeom" in procedure "limit".

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 dimens_m, ONLY : iim, llm, nqmx
13 USE paramet_m, ONLY : iip1, ip1jm, ip1jmp1, jjp1
14 USE comconst, ONLY : daysec, dtphys, dtvr
15 USE comvert, ONLY : ap, bp
16 USE conf_gcm_m, ONLY : day_step, iconser, idissip, iperiod, iphysiq, &
17 nday, offline, periodav
18 USE logic, ONLY : iflag_phys, ok_guide
19 USE comgeom, ONLY : aire, apoln, apols
20 USE temps, ONLY : dt, itaufin
21 USE dynetat0_m, ONLY : day_ini
22 USE iniprint, ONLY : prt_level
23 USE com_io_dyn, ONLY : histaveid
24 USE calfis_m, ONLY : calfis
25 USE exner_hyb_m, ONLY : exner_hyb
26 USE guide_m, ONLY : guide
27 USE pression_m, ONLY : pression
28 USE pressure_var, ONLY : p3d
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