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

Diff of /trunk/dyn3d/leapfrog.f

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

trunk/libf/dyn3d/leapfrog.f90 revision 55 by guez, Mon Dec 12 13:25:01 2011 UTC trunk/dyn3d/leapfrog.f90 revision 76 by guez, Fri Nov 15 18:45:49 2013 UTC
# Line 6  contains Line 6  contains
6    
7    SUBROUTINE leapfrog(ucov, vcov, teta, ps, masse, phis, q, time_0)    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      ! From dyn3d/leapfrog.F, version 1.6, 2005/04/13 08:58:34 revision 616
10      ! Authors: P. Le Van, L. Fairhead, F. Hourdin      ! Authors: P. Le Van, L. Fairhead, F. Hourdin
11      ! Matsuno-leapfrog scheme.      ! Matsuno-leapfrog scheme.
12    
# Line 15  contains Line 15  contains
15      use caladvtrac_m, only: caladvtrac      use caladvtrac_m, only: caladvtrac
16      use caldyn_m, only: caldyn      use caldyn_m, only: caldyn
17      USE calfis_m, ONLY: calfis      USE calfis_m, ONLY: calfis
     USE com_io_dyn, ONLY: histaveid  
18      USE comconst, ONLY: daysec, dtphys, dtvr      USE comconst, ONLY: daysec, dtphys, dtvr
19      USE comgeom, ONLY: aire_2d, apoln, apols      USE comgeom, ONLY: aire_2d, apoln, apols
20      USE comvert, ONLY: ap, bp      USE disvert_m, ONLY: ap, bp
21      USE conf_gcm_m, ONLY: day_step, iconser, iperiod, iphysiq, nday, offline, &      USE conf_gcm_m, ONLY: day_step, iconser, iperiod, iphysiq, nday, offline, &
22           periodav           iflag_phys, ok_guide, iecri
23      USE dimens_m, ONLY: iim, jjm, llm, nqmx      USE dimens_m, ONLY: iim, jjm, llm, nqmx
24      use dissip_m, only: dissip      use dissip_m, only: dissip
25      USE dynetat0_m, ONLY: day_ini      USE dynetat0_m, ONLY: day_ini
26      use dynredem1_m, only: dynredem1      use dynredem1_m, only: dynredem1
27      USE exner_hyb_m, ONLY: exner_hyb      USE exner_hyb_m, ONLY: exner_hyb
28      use filtreg_m, only: filtreg      use filtreg_m, only: filtreg
29        use fluxstokenc_m, only: fluxstokenc
30      use geopot_m, only: geopot      use geopot_m, only: geopot
31      USE guide_m, ONLY: guide      USE guide_m, ONLY: guide
32      use inidissip_m, only: idissip      use inidissip_m, only: idissip
33      use integrd_m, only: integrd      use integrd_m, only: integrd
     USE logic, ONLY: iflag_phys, ok_guide  
34      use nr_util, only: assert      use nr_util, only: assert
35      USE pressure_var, ONLY: p3d      USE pressure_var, ONLY: p3d
36      USE temps, ONLY: itau_dyn      USE temps, ONLY: itau_dyn
37        use writedynav_m, only: writedynav
38        use writehist_m, only: writehist
39    
40      ! Variables dynamiques:      ! Variables dynamiques:
41      REAL, intent(inout):: ucov(:, :, :) ! (iim + 1, jjm + 1, llm) vent covariant      REAL, intent(inout):: ucov(:, :, :) ! (iim + 1, jjm + 1, llm) vent covariant
# Line 44  contains Line 45  contains
45      ! potential temperature      ! potential temperature
46    
47      REAL, intent(inout):: ps(:, :) ! (iim + 1, jjm + 1) pression au sol, en Pa      REAL, intent(inout):: ps(:, :) ! (iim + 1, jjm + 1) pression au sol, en Pa
48      REAL masse((iim + 1) * (jjm + 1), llm) ! masse d'air      REAL, intent(inout):: masse(:, :, :) ! (iim + 1, jjm + 1, llm) masse d'air
49      REAL phis((iim + 1) * (jjm + 1)) ! geopotentiel au sol      REAL, intent(in):: phis(:, :) ! (iim + 1, jjm + 1) surface geopotential
50    
51      REAL, intent(inout):: q(:, :, :, :) ! (iim + 1, jjm + 1, llm, nqmx)      REAL, intent(inout):: q(:, :, :, :) ! (iim + 1, jjm + 1, llm, nqmx)
52      ! mass fractions of advected fields      ! mass fractions of advected fields
# Line 56  contains Line 57  contains
57    
58      ! Variables dynamiques:      ! Variables dynamiques:
59    
60      REAL pks((iim + 1) * (jjm + 1)) ! exner au sol      REAL pks(iim + 1, jjm + 1) ! exner au sol
61      REAL pk(iim + 1, jjm + 1, llm) ! exner au milieu des couches      REAL pk(iim + 1, jjm + 1, llm) ! exner au milieu des couches
62      REAL pkf((iim + 1) * (jjm + 1), llm) ! exner filt.au milieu des couches      REAL pkf(iim + 1, jjm + 1, llm) ! exner filtré au milieu des couches
63      REAL phi(iim + 1, jjm + 1, llm) ! geopotential      REAL phi(iim + 1, jjm + 1, llm) ! geopotential
64      REAL w((iim + 1) * (jjm + 1), llm) ! vitesse verticale      REAL w((iim + 1) * (jjm + 1), llm) ! vitesse verticale
65    
# Line 66  contains Line 67  contains
67      ! Flux de masse :      ! Flux de masse :
68      REAL pbaru((iim + 1) * (jjm + 1), llm), pbarv((iim + 1) * jjm, llm)      REAL pbaru((iim + 1) * (jjm + 1), llm), pbarv((iim + 1) * jjm, llm)
69    
70      ! variables dynamiques au pas - 1      ! Variables dynamiques au pas - 1
71      REAL vcovm1(iim + 1, jjm, llm), ucovm1(iim + 1, jjm + 1, llm)      REAL vcovm1(iim + 1, jjm, llm), ucovm1(iim + 1, jjm + 1, llm)
72      REAL tetam1(iim + 1, jjm + 1, llm), psm1(iim + 1, jjm + 1)      REAL tetam1(iim + 1, jjm + 1, llm), psm1(iim + 1, jjm + 1)
73      REAL massem1((iim + 1) * (jjm + 1), llm)      REAL massem1(iim + 1, jjm + 1, llm)
74    
75      ! tendances dynamiques      ! Tendances dynamiques
76      REAL dv((iim + 1) * jjm, llm), dudyn((iim + 1) * (jjm + 1), llm)      REAL dv((iim + 1) * jjm, llm), dudyn((iim + 1) * (jjm + 1), llm)
77      REAL dteta(iim + 1, jjm + 1, llm), dq((iim + 1) * (jjm + 1), llm, nqmx)      REAL dteta(iim + 1, jjm + 1, llm)
78      real dp((iim + 1) * (jjm + 1))      real dp((iim + 1) * (jjm + 1))
79    
80      ! tendances de la dissipation      ! Tendances de la dissipation :
81      REAL dvdis(iim + 1, jjm, llm), dudis(iim + 1, jjm + 1, llm)      REAL dvdis(iim + 1, jjm, llm), dudis(iim + 1, jjm + 1, llm)
82      REAL dtetadis(iim + 1, jjm + 1, llm)      REAL dtetadis(iim + 1, jjm + 1, llm)
83    
84      ! tendances physiques      ! Tendances physiques
85      REAL dvfi((iim + 1) * jjm, llm), dufi((iim + 1) * (jjm + 1), llm)      REAL dvfi((iim + 1) * jjm, llm), dufi((iim + 1) * (jjm + 1), llm)
86      REAL dtetafi(iim + 1, jjm + 1, llm), dqfi((iim + 1) * (jjm + 1), llm, nqmx)      REAL dtetafi(iim + 1, jjm + 1, llm), dqfi((iim + 1) * (jjm + 1), llm, nqmx)
87      real dpfi((iim + 1) * (jjm + 1))      real dpfi((iim + 1) * (jjm + 1))
88    
89      ! variables pour le fichier histoire      ! Variables pour le fichier histoire
90    
91      INTEGER itau ! index of the time step of the dynamics, starts at 0      INTEGER itau ! index of the time step of the dynamics, starts at 0
92      INTEGER itaufin      INTEGER itaufin
93      REAL time ! time of day, as a fraction of day length      REAL time ! time of day, as a fraction of day length
94      real finvmaold((iim + 1) * (jjm + 1), llm)      real finvmaold(iim + 1, jjm + 1, llm)
95      INTEGER l      INTEGER l
96      REAL rdayvrai, rdaym_ini      REAL rdayvrai, rdaym_ini
97    
98      ! Variables test conservation energie      ! Variables test conservation énergie
99      REAL ecin(iim + 1, jjm + 1, llm), ecin0(iim + 1, jjm + 1, llm)      REAL ecin(iim + 1, jjm + 1, llm), ecin0(iim + 1, jjm + 1, llm)
100    
     REAL dtetaecdt(iim + 1, jjm + 1, llm)  
     ! tendance de la température potentielle due à la transformation  
     ! d'énergie cinétique en énergie thermique par la dissipation  
   
101      REAL vcont((iim + 1) * jjm, llm), ucont((iim + 1) * (jjm + 1), llm)      REAL vcont((iim + 1) * jjm, llm), ucont((iim + 1) * (jjm + 1), llm)
102      logical leapf      logical leapf
103      real dt      real dt
# Line 111  contains Line 108  contains
108      call assert(shape(ucov) == (/iim + 1, jjm + 1, llm/), "leapfrog")      call assert(shape(ucov) == (/iim + 1, jjm + 1, llm/), "leapfrog")
109    
110      itaufin = nday * day_step      itaufin = nday * day_step
111      ! "day_step" is a multiple of "iperiod", therefore "itaufin" is one too      ! "day_step" is a multiple of "iperiod", therefore so is "itaufin".
   
     dq = 0.  
112    
113      ! On initialise la pression et la fonction d'Exner :      ! On initialise la pression et la fonction d'Exner :
114      forall (l = 1: llm + 1) p3d(:, :, l) = ap(l) + bp(l) * ps      forall (l = 1: llm + 1) p3d(:, :, l) = ap(l) + bp(l) * ps
# Line 134  contains Line 129  contains
129            massem1 = masse            massem1 = masse
130            psm1 = ps            psm1 = ps
131            finvmaold = masse            finvmaold = masse
132            CALL filtreg(finvmaold, jjm + 1, llm, - 2, 2, .TRUE., 1)            CALL filtreg(finvmaold, jjm + 1, llm, - 2, 2, .TRUE.)
133         end if         end if
134    
135         ! Calcul des tendances dynamiques:         ! Calcul des tendances dynamiques:
136         CALL geopot((iim + 1) * (jjm + 1), teta, pk, pks, phis, phi)         CALL geopot(teta, pk, pks, phis, phi)
137         CALL caldyn(itau, ucov, vcov, teta, ps, masse, pk, pkf, phis, phi, &         CALL caldyn(itau, ucov, vcov, teta, ps, masse, pk, pkf, phis, phi, &
138              dudyn, dv, dteta, dp, w, pbaru, pbarv, time_0, &              dudyn, dv, dteta, dp, w, pbaru, pbarv, time_0, &
139              conser=MOD(itau, iconser)==0)              conser=MOD(itau, iconser)==0)
140    
141         ! Calcul des tendances advection des traceurs (dont l'humidité)         CALL caladvtrac(q, pbaru, pbarv, p3d, masse, teta, pk)
        CALL caladvtrac(q, pbaru, pbarv, p3d, masse, dq, teta, pk)  
142    
143         ! Stokage du flux de masse pour traceurs offline:         ! Stokage du flux de masse pour traceurs offline:
144         IF (offline) CALL fluxstokenc(pbaru, pbarv, masse, teta, phi, phis, &         IF (offline) CALL fluxstokenc(pbaru, pbarv, masse, teta, phi, phis, &
145              dtvr, itau)              dtvr, itau)
146    
147         ! Integrations dynamique et traceurs:         ! Intégrations dynamique et traceurs:
148         CALL integrd(vcovm1, ucovm1, tetam1, psm1, massem1, dv, dudyn, dteta, &         CALL integrd(vcovm1, ucovm1, tetam1, psm1, massem1, dv, dudyn, dteta, &
149              dp, vcov, ucov, teta, q(:, :, :, :2), ps, masse, finvmaold, dt, &              dp, vcov, ucov, teta, q(:, :, :, :2), ps, masse, finvmaold, dt, &
150              leapf)              leapf)
# Line 161  contains Line 155  contains
155            CALL exner_hyb(ps, p3d, pks, pk, pkf)            CALL exner_hyb(ps, p3d, pks, pk, pkf)
156    
157            ! Calcul des tendances dynamiques:            ! Calcul des tendances dynamiques:
158            CALL geopot((iim + 1) * (jjm + 1), teta, pk, pks, phis, phi)            CALL geopot(teta, pk, pks, phis, phi)
159            CALL caldyn(itau + 1, ucov, vcov, teta, ps, masse, pk, pkf, phis, &            CALL caldyn(itau + 1, ucov, vcov, teta, ps, masse, pk, pkf, phis, &
160                 phi, dudyn, dv, dteta, dp, w, pbaru, pbarv, time_0, &                 phi, dudyn, dv, dteta, dp, w, pbaru, pbarv, time_0, &
161                 conser=.false.)                 conser=.false.)
# Line 173  contains Line 167  contains
167         end if         end if
168    
169         IF (MOD(itau + 1, iphysiq) == 0 .AND. iflag_phys /= 0) THEN         IF (MOD(itau + 1, iphysiq) == 0 .AND. iflag_phys /= 0) THEN
170            ! calcul des tendances physiques:            ! Calcul des tendances physiques:
171    
172            forall (l = 1: llm + 1) p3d(:, :, l) = ap(l) + bp(l) * ps            forall (l = 1: llm + 1) p3d(:, :, l) = ap(l) + bp(l) * ps
173            CALL exner_hyb(ps, p3d, pks, pk, pkf)            CALL exner_hyb(ps, p3d, pks, pk, pkf)
# Line 183  contains Line 177  contains
177            time = REAL(mod(itau, day_step)) / day_step + time_0            time = REAL(mod(itau, day_step)) / day_step + time_0
178            IF (time > 1.) time = time - 1.            IF (time > 1.) time = time - 1.
179    
180            CALL calfis(rdayvrai, time, ucov, vcov, teta, q, masse, ps, pk, &            CALL calfis(rdayvrai, time, ucov, vcov, teta, q, ps, pk, phis, phi, &
181                 phis, phi, dudyn, dv, dq, w, dufi, dvfi, dtetafi, dqfi, dpfi, &                 dudyn, dv, w, dufi, dvfi, dtetafi, dqfi, dpfi, &
182                 lafin=itau+1==itaufin)                 lafin = itau + 1 == itaufin)
183    
184            ! ajout des tendances physiques:            ! Ajout des tendances physiques:
185            CALL addfi(nqmx, dtphys, ucov, vcov, teta, q, ps, dufi, dvfi, &            CALL addfi(ucov, vcov, teta, q, ps, dufi, dvfi, dtetafi, dqfi, dpfi)
                dtetafi, dqfi, dpfi)  
186         ENDIF         ENDIF
187    
188         forall (l = 1: llm + 1) p3d(:, :, l) = ap(l) + bp(l) * ps         forall (l = 1: llm + 1) p3d(:, :, l) = ap(l) + bp(l) * ps
# Line 211  contains Line 204  contains
204            ! cinétique en énergie thermique par la dissipation            ! cinétique en énergie thermique par la dissipation
205            call covcont(llm, ucov, vcov, ucont, vcont)            call covcont(llm, ucov, vcov, ucont, vcont)
206            call enercin(vcov, ucov, vcont, ucont, ecin)            call enercin(vcov, ucov, vcont, ucont, ecin)
207            dtetaecdt= (ecin0 - ecin) / pk            dtetadis = dtetadis + (ecin0 - ecin) / pk
           dtetadis = dtetadis + dtetaecdt  
208            teta = teta + dtetadis            teta = teta + dtetadis
209    
210            ! Calcul de la valeur moyenne aux pôles :            ! Calcul de la valeur moyenne aux pôles :
# Line 230  contains Line 222  contains
222    
223         IF (MOD(itau + 1, iperiod) == 0) THEN         IF (MOD(itau + 1, iperiod) == 0) THEN
224            ! Écriture du fichier histoire moyenne:            ! Écriture du fichier histoire moyenne:
225            CALL writedynav(histaveid, nqmx, itau + 1, vcov, ucov, teta, pk, &            CALL writedynav(vcov, ucov, teta, pk, phi, q, masse, ps, phis, &
226                 phi, q, masse, ps, phis)                 time = itau + 1)
227            call bilan_dyn(ps, masse, pk, pbaru, pbarv, teta, phi, ucov, vcov, &            call bilan_dyn(ps, masse, pk, pbaru, pbarv, teta, phi, ucov, vcov, &
228                 q(:, :, :, 1), dt_app = dtvr * iperiod, &                 q(:, :, :, 1))
                dt_cum = dtvr * day_step * periodav)  
229         ENDIF         ENDIF
230    
231           IF (MOD(itau + 1, iecri * day_step) == 0) THEN
232              CALL geopot(teta, pk, pks, phis, phi)
233              CALL writehist(itau, vcov, ucov, teta, phi, q, masse, ps)
234           END IF
235      end do time_integration      end do time_integration
236    
237      CALL dynredem1("restart.nc", vcov, ucov, teta, q, masse, ps, &      CALL dynredem1("restart.nc", vcov, ucov, teta, q, masse, ps, &
238           itau=itau_dyn+itaufin)           itau = itau_dyn + itaufin)
239    
240      ! Calcul des tendances dynamiques:      ! Calcul des tendances dynamiques:
241      CALL geopot((iim + 1) * (jjm + 1), teta, pk, pks, phis, phi)      CALL geopot(teta, pk, pks, phis, phi)
242      CALL caldyn(itaufin, ucov, vcov, teta, ps, masse, pk, pkf, phis, phi, &      CALL caldyn(itaufin, ucov, vcov, teta, ps, masse, pk, pkf, phis, phi, &
243           dudyn, dv, dteta, dp, w, pbaru, pbarv, time_0, &           dudyn, dv, dteta, dp, w, pbaru, pbarv, time_0, &
244           conser=MOD(itaufin, iconser)==0)           conser = MOD(itaufin, iconser) == 0)
245    
246    END SUBROUTINE leapfrog    END SUBROUTINE leapfrog
247    
248  end module leapfrog_m  end module leapfrog_m

Legend:
Removed from v.55  
changed lines
  Added in v.76

  ViewVC Help
Powered by ViewVC 1.1.21