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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 128 - (hide annotations)
Thu Feb 12 16:23:33 2015 UTC (9 years, 3 months ago) by guez
Original Path: trunk/dyn3d/leapfrog.f
File size: 8496 byte(s)
The variable temps of file restart.nc is always 0. So we remove the
possibility that it can be something else. So removed argument time_0
of caldyn, dynetat0, leapfrog.

1 guez 3 module leapfrog_m
2    
3     IMPLICIT NONE
4    
5     contains
6    
7 guez 128 SUBROUTINE leapfrog(ucov, vcov, teta, ps, masse, phis, q)
8 guez 3
9 guez 67 ! From dyn3d/leapfrog.F, version 1.6, 2005/04/13 08:58:34 revision 616
10 guez 27 ! Authors: P. Le Van, L. Fairhead, F. Hourdin
11 guez 36 ! Matsuno-leapfrog scheme.
12 guez 3
13 guez 37 use addfi_m, only: addfi
14 guez 40 use bilan_dyn_m, only: bilan_dyn
15     use caladvtrac_m, only: caladvtrac
16 guez 43 use caldyn_m, only: caldyn
17 guez 26 USE calfis_m, ONLY: calfis
18 guez 103 USE comconst, ONLY: daysec, dtvr
19 guez 29 USE comgeom, ONLY: aire_2d, apoln, apols
20 guez 66 USE disvert_m, ONLY: ap, bp
21 guez 57 USE conf_gcm_m, ONLY: day_step, iconser, iperiod, iphysiq, nday, offline, &
22 guez 115 iflag_phys, iecri
23     USE conf_guide_m, ONLY: ok_guide
24 guez 29 USE dimens_m, ONLY: iim, jjm, llm, nqmx
25 guez 47 use dissip_m, only: dissip
26 guez 26 USE dynetat0_m, ONLY: day_ini
27 guez 27 use dynredem1_m, only: dynredem1
28 guez 26 USE exner_hyb_m, ONLY: exner_hyb
29 guez 27 use filtreg_m, only: filtreg
30 guez 69 use fluxstokenc_m, only: fluxstokenc
31 guez 43 use geopot_m, only: geopot
32 guez 26 USE guide_m, ONLY: guide
33     use inidissip_m, only: idissip
34 guez 32 use integrd_m, only: integrd
35 guez 55 use nr_util, only: assert
36 guez 26 USE pressure_var, ONLY: p3d
37 guez 28 USE temps, ONLY: itau_dyn
38 guez 56 use writedynav_m, only: writedynav
39 guez 69 use writehist_m, only: writehist
40 guez 3
41 guez 10 ! Variables dynamiques:
42 guez 55 REAL, intent(inout):: ucov(:, :, :) ! (iim + 1, jjm + 1, llm) vent covariant
43     REAL, intent(inout):: vcov(:, :, :) ! (iim + 1, jjm, llm) ! vent covariant
44 guez 43
45     REAL, intent(inout):: teta(:, :, :) ! (iim + 1, jjm + 1, llm)
46     ! potential temperature
47    
48 guez 45 REAL, intent(inout):: ps(:, :) ! (iim + 1, jjm + 1) pression au sol, en Pa
49 guez 70 REAL, intent(inout):: masse(:, :, :) ! (iim + 1, jjm + 1, llm) masse d'air
50 guez 69 REAL, intent(in):: phis(:, :) ! (iim + 1, jjm + 1) surface geopotential
51 guez 40
52     REAL, intent(inout):: q(:, :, :, :) ! (iim + 1, jjm + 1, llm, nqmx)
53     ! mass fractions of advected fields
54    
55 guez 91 ! Local:
56 guez 10
57     ! Variables dynamiques:
58    
59 guez 70 REAL pks(iim + 1, jjm + 1) ! exner au sol
60 guez 29 REAL pk(iim + 1, jjm + 1, llm) ! exner au milieu des couches
61 guez 90 REAL pkf(iim + 1, jjm + 1, llm) ! exner filtr\'e au milieu des couches
62 guez 47 REAL phi(iim + 1, jjm + 1, llm) ! geopotential
63 guez 91 REAL w(iim + 1, jjm + 1, llm) ! vitesse verticale
64 guez 3
65 guez 55 ! Variables dynamiques intermediaire pour le transport
66     ! Flux de masse :
67 guez 91 REAL pbaru(iim + 1, jjm + 1, llm), pbarv(iim + 1, jjm, llm)
68 guez 3
69 guez 56 ! Variables dynamiques au pas - 1
70 guez 55 REAL vcovm1(iim + 1, jjm, llm), ucovm1(iim + 1, jjm + 1, llm)
71 guez 29 REAL tetam1(iim + 1, jjm + 1, llm), psm1(iim + 1, jjm + 1)
72 guez 67 REAL massem1(iim + 1, jjm + 1, llm)
73 guez 3
74 guez 56 ! Tendances dynamiques
75 guez 88 REAL dv((iim + 1) * jjm, llm), dudyn(iim + 1, jjm + 1, llm)
76 guez 71 REAL dteta(iim + 1, jjm + 1, llm)
77 guez 55 real dp((iim + 1) * (jjm + 1))
78 guez 3
79 guez 56 ! Tendances de la dissipation :
80 guez 55 REAL dvdis(iim + 1, jjm, llm), dudis(iim + 1, jjm + 1, llm)
81 guez 29 REAL dtetadis(iim + 1, jjm + 1, llm)
82 guez 3
83 guez 56 ! Tendances physiques
84 guez 91 REAL dvfi(iim + 1, jjm, llm), dufi(iim + 1, jjm + 1, llm)
85     REAL dtetafi(iim + 1, jjm + 1, llm), dqfi(iim + 1, jjm + 1, llm, nqmx)
86 guez 3
87 guez 56 ! Variables pour le fichier histoire
88 guez 22 INTEGER itau ! index of the time step of the dynamics, starts at 0
89 guez 27 INTEGER itaufin
90 guez 20 REAL time ! time of day, as a fraction of day length
91 guez 67 real finvmaold(iim + 1, jjm + 1, llm)
92 guez 33 INTEGER l
93 guez 3
94 guez 90 ! Variables test conservation \'energie
95 guez 29 REAL ecin(iim + 1, jjm + 1, llm), ecin0(iim + 1, jjm + 1, llm)
96 guez 43
97 guez 55 REAL vcont((iim + 1) * jjm, llm), ucont((iim + 1) * (jjm + 1), llm)
98 guez 33 logical leapf
99 guez 91 real dt ! time step, in s
100 guez 3
101     !---------------------------------------------------
102    
103     print *, "Call sequence information: leapfrog"
104 guez 55 call assert(shape(ucov) == (/iim + 1, jjm + 1, llm/), "leapfrog")
105 guez 3
106     itaufin = nday * day_step
107 guez 62 ! "day_step" is a multiple of "iperiod", therefore so is "itaufin".
108 guez 30
109 guez 3 ! On initialise la pression et la fonction d'Exner :
110 guez 37 forall (l = 1: llm + 1) p3d(:, :, l) = ap(l) + bp(l) * ps
111 guez 10 CALL exner_hyb(ps, p3d, pks, pk, pkf)
112 guez 3
113 guez 40 time_integration: do itau = 0, itaufin - 1
114 guez 33 leapf = mod(itau, iperiod) /= 0
115     if (leapf) then
116     dt = 2 * dtvr
117     else
118     ! Matsuno
119     dt = dtvr
120 guez 108 if (ok_guide) call guide(itau, ucov, vcov, teta, q(:, :, :, 1), ps)
121 guez 33 vcovm1 = vcov
122     ucovm1 = ucov
123     tetam1 = teta
124     massem1 = masse
125     psm1 = ps
126     finvmaold = masse
127 guez 107 CALL filtreg(finvmaold, direct = .false., intensive = .false.)
128 guez 33 end if
129 guez 30
130     ! Calcul des tendances dynamiques:
131 guez 70 CALL geopot(teta, pk, pks, phis, phi)
132 guez 30 CALL caldyn(itau, ucov, vcov, teta, ps, masse, pk, pkf, phis, phi, &
133 guez 128 dudyn, dv, dteta, dp, w, pbaru, pbarv, &
134 guez 78 conser = MOD(itau, iconser) == 0)
135 guez 30
136 guez 71 CALL caladvtrac(q, pbaru, pbarv, p3d, masse, teta, pk)
137 guez 33
138 guez 30 ! Stokage du flux de masse pour traceurs offline:
139     IF (offline) CALL fluxstokenc(pbaru, pbarv, masse, teta, phi, phis, &
140     dtvr, itau)
141    
142 guez 90 ! Int\'egrations dynamique et traceurs:
143 guez 47 CALL integrd(vcovm1, ucovm1, tetam1, psm1, massem1, dv, dudyn, dteta, &
144     dp, vcov, ucov, teta, q(:, :, :, :2), ps, masse, finvmaold, dt, &
145     leapf)
146 guez 30
147 guez 97 forall (l = 1: llm + 1) p3d(:, :, l) = ap(l) + bp(l) * ps
148     CALL exner_hyb(ps, p3d, pks, pk, pkf)
149    
150 guez 33 if (.not. leapf) then
151     ! Matsuno backward
152 guez 27 ! Calcul des tendances dynamiques:
153 guez 70 CALL geopot(teta, pk, pks, phis, phi)
154 guez 33 CALL caldyn(itau + 1, ucov, vcov, teta, ps, masse, pk, pkf, phis, &
155 guez 128 phi, dudyn, dv, dteta, dp, w, pbaru, pbarv, conser = .false.)
156 guez 3
157     ! integrations dynamique et traceurs:
158 guez 47 CALL integrd(vcovm1, ucovm1, tetam1, psm1, massem1, dv, dudyn, &
159     dteta, dp, vcov, ucov, teta, q(:, :, :, :2), ps, masse, &
160     finvmaold, dtvr, leapf=.false.)
161 guez 97
162     forall (l = 1: llm + 1) p3d(:, :, l) = ap(l) + bp(l) * ps
163     CALL exner_hyb(ps, p3d, pks, pk, pkf)
164 guez 33 end if
165 guez 3
166 guez 33 IF (MOD(itau + 1, iphysiq) == 0 .AND. iflag_phys /= 0) THEN
167 guez 128 ! Calcul des tendances physiques :
168     time = REAL(mod(itau, day_step)) / day_step
169 guez 33 IF (time > 1.) time = time - 1.
170 guez 128 CALL calfis(itau * dtvr / daysec + day_ini, time, ucov, vcov, teta, &
171     q, pk, phis, phi, w, dufi, dvfi, dtetafi, dqfi, &
172     lafin = itau + 1 == itaufin)
173 guez 3
174 guez 91 CALL addfi(ucov, vcov, teta, q, dufi, dvfi, dtetafi, dqfi)
175 guez 33 ENDIF
176 guez 3
177 guez 33 IF (MOD(itau + 1, idissip) == 0) THEN
178 guez 90 ! Dissipation horizontale et verticale des petites \'echelles
179 guez 3
180 guez 90 ! calcul de l'\'energie cin\'etique avant dissipation
181 guez 33 call covcont(llm, ucov, vcov, ucont, vcont)
182     call enercin(vcov, ucov, vcont, ucont, ecin0)
183 guez 3
184 guez 33 ! dissipation
185     CALL dissip(vcov, ucov, teta, p3d, dvdis, dudis, dtetadis)
186 guez 55 ucov = ucov + dudis
187     vcov = vcov + dvdis
188 guez 3
189 guez 90 ! On ajoute la tendance due \`a la transformation \'energie
190     ! cin\'etique en \'energie thermique par la dissipation
191 guez 33 call covcont(llm, ucov, vcov, ucont, vcont)
192     call enercin(vcov, ucov, vcont, ucont, ecin)
193 guez 56 dtetadis = dtetadis + (ecin0 - ecin) / pk
194 guez 55 teta = teta + dtetadis
195 guez 3
196 guez 90 ! Calcul de la valeur moyenne aux p\^oles :
197 guez 33 forall (l = 1: llm)
198     teta(:, 1, l) = SUM(aire_2d(:iim, 1) * teta(:iim, 1, l)) &
199     / apoln
200     teta(:, jjm + 1, l) = SUM(aire_2d(:iim, jjm+1) &
201     * teta(:iim, jjm + 1, l)) / apols
202     END forall
203     END IF
204 guez 3
205 guez 33 IF (MOD(itau + 1, iperiod) == 0) THEN
206 guez 90 ! \'Ecriture du fichier histoire moyenne:
207 guez 61 CALL writedynav(vcov, ucov, teta, pk, phi, q, masse, ps, phis, &
208     time = itau + 1)
209 guez 40 call bilan_dyn(ps, masse, pk, pbaru, pbarv, teta, phi, ucov, vcov, &
210 guez 57 q(:, :, :, 1))
211 guez 33 ENDIF
212 guez 68
213     IF (MOD(itau + 1, iecri * day_step) == 0) THEN
214 guez 70 CALL geopot(teta, pk, pks, phis, phi)
215 guez 69 CALL writehist(itau, vcov, ucov, teta, phi, q, masse, ps)
216 guez 68 END IF
217 guez 40 end do time_integration
218 guez 3
219 guez 30 CALL dynredem1("restart.nc", vcov, ucov, teta, q, masse, ps, &
220 guez 67 itau = itau_dyn + itaufin)
221 guez 30
222     ! Calcul des tendances dynamiques:
223 guez 70 CALL geopot(teta, pk, pks, phis, phi)
224 guez 30 CALL caldyn(itaufin, ucov, vcov, teta, ps, masse, pk, pkf, phis, phi, &
225 guez 128 dudyn, dv, dteta, dp, w, pbaru, pbarv, &
226 guez 67 conser = MOD(itaufin, iconser) == 0)
227 guez 56
228 guez 3 END SUBROUTINE leapfrog
229    
230     end module leapfrog_m

  ViewVC Help
Powered by ViewVC 1.1.21