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

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

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

revision 10 by guez, Fri Apr 18 14:45:53 2008 UTC revision 45 by guez, Wed Apr 27 13:00:12 2011 UTC
# Line 1  Line 1 
1  module leapfrog_m  module leapfrog_m
2    
   ! This module is clean: no C preprocessor directive, no include line.  
   
3    IMPLICIT NONE    IMPLICIT NONE
4    
5  contains  contains
6    
7    SUBROUTINE leapfrog(ucov, vcov, teta, ps, masse, phis, nq, q, clesphy0, &    SUBROUTINE leapfrog(ucov, vcov, teta, ps, masse, phis, q, time_0)
        time_0)  
   
     ! From dyn3d/leapfrog.F, version 1.6 2005/04/13 08:58:34  
8    
9      ! Version du 10/01/98, avec coordonnees verticales hybrides, avec      ! From dyn3d/leapfrog.F, version 1.6, 2005/04/13 08:58:34
10      ! nouveaux operat. dissipation * (gradiv2, divgrad2, nxgraro2)      ! Authors: P. Le Van, L. Fairhead, F. Hourdin
11        ! Matsuno-leapfrog scheme.
12    
13        use addfi_m, only: addfi
14        use bilan_dyn_m, only: bilan_dyn
15        use caladvtrac_m, only: caladvtrac
16        use caldyn_m, only: caldyn
17        USE calfis_m, ONLY: calfis
18        USE com_io_dyn, ONLY: histaveid
19        USE comconst, ONLY: daysec, dtphys, dtvr
20        USE comgeom, ONLY: aire_2d, apoln, apols
21        USE comvert, ONLY: ap, bp
22        USE conf_gcm_m, ONLY: day_step, iconser, iperiod, iphysiq, nday, offline, &
23             periodav
24        USE dimens_m, ONLY: iim, jjm, llm, nqmx
25        USE dynetat0_m, ONLY: day_ini
26        use dynredem1_m, only: dynredem1
27        USE exner_hyb_m, ONLY: exner_hyb
28        use filtreg_m, only: filtreg
29        use geopot_m, only: geopot
30        USE guide_m, ONLY: guide
31        use inidissip_m, only: idissip
32        use integrd_m, only: integrd
33        USE logic, ONLY: iflag_phys, ok_guide
34        USE paramet_m, ONLY: ip1jmp1
35        USE pressure_var, ONLY: p3d
36        USE temps, ONLY: itau_dyn
37    
38      ! Auteur: P. Le Van /L. Fairhead/F.Hourdin      ! Variables dynamiques:
39      ! Objet:      REAL, intent(inout):: ucov(ip1jmp1, llm) ! vent covariant
40      ! GCM LMD nouvelle grille      REAL, intent(inout):: vcov((iim + 1) * jjm, llm) ! vent covariant
   
     ! ... Dans inigeom, nouveaux calculs pour les elongations cu, cv  
     ! et possibilite d'appeler une fonction f(y) a derivee tangente  
     ! hyperbolique a la place de la fonction a derivee sinusoidale.  
   
     ! ... Possibilité de choisir le schéma pour l'advection de  
     ! q, en modifiant iadv dans "traceur.def" (10/02) .  
   
     ! Pour Van-Leer + Vapeur d'eau saturee, iadv(1)=4. (F.Codron, 10/99)  
     ! Pour Van-Leer iadv=10  
   
     use dimens_m, only: iim, jjm, llm, nqmx  
     use paramet_m, only: ip1jmp1, ip1jm, ijmllm, ijp1llm, jjp1, iip1, iip2  
     use comconst, only: dtvr, daysec, dtphys  
     use comvert, only: ap, bp  
     use conf_gcm_m, only: day_step, iconser, idissip, iphysiq, iperiod, nday, &  
          offline, periodav  
     use logic, only: ok_guide, apdiss, apphys, conser, forward, iflag_phys, &  
          leapf, statcl  
     use comgeom  
     use serre  
     use temps, only: itaufin, day_ini, dt  
     use iniprint, only: prt_level  
     use com_io_dyn  
     use ener  
     use calfis_m, only: calfis  
     use exner_hyb_m, only: exner_hyb  
     use guide_m, only: guide  
     use pression_m, only: pression  
     use pressure_var, only: p3d  
41    
42      integer nq      REAL, intent(inout):: teta(:, :, :) ! (iim + 1, jjm + 1, llm)
43      REAL clesphy0(:)      ! potential temperature
44    
45      ! Variables dynamiques:      REAL, intent(inout):: ps(:, :) ! (iim + 1, jjm + 1) pression au sol, en Pa
     REAL vcov(ip1jm, llm), ucov(ip1jmp1, llm) ! vents covariants  
     REAL teta(ip1jmp1, llm) ! temperature potentielle  
     REAL q(ip1jmp1, llm, nqmx) ! mass fractions of advected fields  
     REAL ps(ip1jmp1) ! pression au sol, en Pa  
46      REAL masse(ip1jmp1, llm) ! masse d'air      REAL masse(ip1jmp1, llm) ! masse d'air
47      REAL phis(ip1jmp1) ! geopotentiel au sol      REAL phis(ip1jmp1) ! geopotentiel au sol
48    
49      REAL time_0      REAL, intent(inout):: q(:, :, :, :) ! (iim + 1, jjm + 1, llm, nqmx)
50        ! mass fractions of advected fields
51    
52        REAL, intent(in):: time_0
53    
54      ! Variables local to the procedure:      ! Variables local to the procedure:
55    
56      ! Variables dynamiques:      ! Variables dynamiques:
57    
58      REAL pks(ip1jmp1) ! exner au sol      REAL pks(ip1jmp1) ! exner au sol
59      REAL pk(ip1jmp1, llm) ! exner au milieu des couches      REAL pk(iim + 1, jjm + 1, llm) ! exner au milieu des couches
60      REAL pkf(ip1jmp1, llm) ! exner filt.au milieu des couches      REAL pkf(ip1jmp1, llm) ! exner filt.au milieu des couches
61      REAL phi(ip1jmp1, llm) ! geopotential      REAL phi(ip1jmp1, llm) ! geopotential
62      REAL w(ip1jmp1, llm) ! vitesse verticale      REAL w(ip1jmp1, llm) ! vitesse verticale
63    
64      ! variables dynamiques intermediaire pour le transport      ! variables dynamiques intermediaire pour le transport
65      REAL pbaru(ip1jmp1, llm), pbarv(ip1jm, llm) !flux de masse      REAL pbaru(ip1jmp1, llm), pbarv((iim + 1) * jjm, llm) !flux de masse
66    
67      ! variables dynamiques au pas - 1      ! variables dynamiques au pas - 1
68      REAL vcovm1(ip1jm, llm), ucovm1(ip1jmp1, llm)      REAL vcovm1((iim + 1) * jjm, llm), ucovm1(ip1jmp1, llm)
69      REAL tetam1(ip1jmp1, llm), psm1(ip1jmp1)      REAL tetam1(iim + 1, jjm + 1, llm), psm1(iim + 1, jjm + 1)
70      REAL massem1(ip1jmp1, llm)      REAL massem1(ip1jmp1, llm)
71    
72      ! tendances dynamiques      ! tendances dynamiques
73      REAL dv(ip1jm, llm), du(ip1jmp1, llm)      REAL dv((iim + 1) * jjm, llm), du(ip1jmp1, llm)
74      REAL dteta(ip1jmp1, llm), dq(ip1jmp1, llm, nqmx), dp(ip1jmp1)      REAL dteta(iim + 1, jjm + 1, llm), dq(ip1jmp1, llm, nqmx), dp(ip1jmp1)
75    
76      ! tendances de la dissipation      ! tendances de la dissipation
77      REAL dvdis(ip1jm, llm), dudis(ip1jmp1, llm)      REAL dvdis((iim + 1) * jjm, llm), dudis(ip1jmp1, llm)
78      REAL dtetadis(ip1jmp1, llm)      REAL dtetadis(iim + 1, jjm + 1, llm)
79    
80      ! tendances physiques      ! tendances physiques
81      REAL dvfi(ip1jm, llm), dufi(ip1jmp1, llm)      REAL dvfi((iim + 1) * jjm, llm), dufi(ip1jmp1, llm)
82      REAL dtetafi(ip1jmp1, llm), dqfi(ip1jmp1, llm, nqmx), dpfi(ip1jmp1)      REAL dtetafi(iim + 1, jjm + 1, llm), dqfi(ip1jmp1, llm, nqmx), dpfi(ip1jmp1)
83    
84      ! variables pour le fichier histoire      ! variables pour le fichier histoire
85    
86      REAL tppn(iim), tpps(iim), tpn, tps      INTEGER itau ! index of the time step of the dynamics, starts at 0
87        INTEGER itaufin
88      INTEGER itau, itaufinp1      REAL time ! time of day, as a fraction of day length
     INTEGER iday ! jour julien  
     REAL time ! Heure de la journee en fraction d'1 jour  
   
     REAL SSUM  
89      real finvmaold(ip1jmp1, llm)      real finvmaold(ip1jmp1, llm)
90        INTEGER l
     LOGICAL :: lafin=.false.  
     INTEGER ij, l  
   
91      REAL rdayvrai, rdaym_ini      REAL rdayvrai, rdaym_ini
     LOGICAL:: callinigrads = .true.  
92    
93      !+jld variables test conservation energie      ! Variables test conservation energie
94      REAL ecin(ip1jmp1, llm), ecin0(ip1jmp1, llm)      REAL ecin(iim + 1, jjm + 1, llm), ecin0(iim + 1, jjm + 1, llm)
     ! Tendance de la temp. potentiel d (theta) / d t due a la  
     ! tansformation d'energie cinetique en energie thermique  
     ! cree par la dissipation  
     REAL dtetaecdt(ip1jmp1, llm)  
     REAL vcont(ip1jm, llm), ucont(ip1jmp1, llm)  
     CHARACTER*15 ztit  
     INTEGER:: ip_ebil_dyn = 0 ! PRINT level for energy conserv. diag.  
95    
96      logical:: dissip_conservative = .true.      REAL dtetaecdt(iim + 1, jjm + 1, llm)
97      LOGICAL:: prem = .true.      ! tendance de la température potentielle due à la tansformation
98        ! d'énergie cinétique en énergie thermique créée par la dissipation
99    
100        REAL vcont((iim + 1) * jjm, llm), ucont(ip1jmp1, llm)
101        logical leapf
102        real dt
103    
104      !---------------------------------------------------      !---------------------------------------------------
105    
106      print *, "Call sequence information: leapfrog"      print *, "Call sequence information: leapfrog"
107    
108      itaufin = nday * day_step      itaufin = nday * day_step
109      itaufinp1 = itaufin + 1      ! "day_step" is a multiple of "iperiod", therefore "itaufin" is one too
110    
111      itau = 0      dq = 0.
     iday = day_ini  
     time = time_0  
     IF (time > 1.) THEN  
        time = time - 1.  
        iday = iday + 1  
     ENDIF  
112    
113      ! On initialise la pression et la fonction d'Exner :      ! On initialise la pression et la fonction d'Exner :
114      dq=0.      forall (l = 1: llm + 1) p3d(:, :, l) = ap(l) + bp(l) * ps
     CALL pression(ip1jmp1, ap, bp, ps, p3d)  
115      CALL exner_hyb(ps, p3d, pks, pk, pkf)      CALL exner_hyb(ps, p3d, pks, pk, pkf)
116    
117      ! Debut de l'integration temporelle:      time_integration: do itau = 0, itaufin - 1
118      outer_loop:do         leapf = mod(itau, iperiod) /= 0
119         if (ok_guide.and.(itaufin - itau - 1) * dtvr > 21600) then         if (leapf) then
120            call guide(itau, ucov, vcov, teta, q, masse, ps)            dt = 2 * dtvr
121         else         else
122            IF (prt_level > 9) print *, &            ! Matsuno
123                 'Attention : on ne guide pas les 6 dernieres heures.'            dt = dtvr
124         endif            if (ok_guide .and. (itaufin - itau - 1) * dtvr > 21600.) &
125                   call guide(itau, ucov, vcov, teta, q, masse, ps)
126         CALL SCOPY(ijmllm, vcov, 1, vcovm1, 1)            vcovm1 = vcov
127         CALL SCOPY(ijp1llm, ucov, 1, ucovm1, 1)            ucovm1 = ucov
128         CALL SCOPY(ijp1llm, teta, 1, tetam1, 1)            tetam1 = teta
129         CALL SCOPY(ijp1llm, masse, 1, massem1, 1)            massem1 = masse
130         CALL SCOPY(ip1jmp1, ps, 1, psm1, 1)            psm1 = ps
131              finvmaold = masse
132         forward = .TRUE.            CALL filtreg(finvmaold, jjm + 1, llm, - 2, 2, .TRUE., 1)
133         leapf = .FALSE.         end if
134         dt = dtvr  
135           ! Calcul des tendances dynamiques:
136         CALL SCOPY(ijp1llm, masse, 1, finvmaold, 1)         CALL geopot(ip1jmp1, teta, pk, pks, phis, phi)
137         CALL filtreg(finvmaold, jjp1, llm, - 2, 2, .TRUE., 1)         CALL caldyn(itau, ucov, vcov, teta, ps, masse, pk, pkf, phis, phi, &
138                MOD(itau, iconser) == 0, du, dv, dteta, dp, w, pbaru, pbarv, &
139         do              time_0)
140            ! gestion des appels de la physique et des dissipations:  
141           ! Calcul des tendances advection des traceurs (dont l'humidité)
142            apphys = .FALSE.         CALL caladvtrac(q, pbaru, pbarv, p3d, masse, dq, teta, pk)
143            statcl = .FALSE.  
144            conser = .FALSE.         ! Stokage du flux de masse pour traceurs offline:
145            apdiss = .FALSE.         IF (offline) CALL fluxstokenc(pbaru, pbarv, masse, teta, phi, phis, &
146                dtvr, itau)
147            IF (MOD(itau, iconser) == 0) conser = .TRUE.  
148            IF (MOD(itau + 1, idissip) == 0) apdiss = .TRUE.         ! integrations dynamique et traceurs:
149            IF (MOD(itau + 1, iphysiq) == 0 .AND. iflag_phys /= 0) apphys=.TRUE.         CALL integrd(vcovm1, ucovm1, tetam1, psm1, massem1, dv, du, dteta, dp, &
150                vcov, ucov, teta, q(:, :, :, :2), ps, masse, finvmaold, dt, leapf)
151            ! calcul des tendances dynamiques:  
152           if (.not. leapf) then
153              ! Matsuno backward
154              forall (l = 1: llm + 1) p3d(:, :, l) = ap(l) + bp(l) * ps
155              CALL exner_hyb(ps, p3d, pks, pk, pkf)
156    
157              ! Calcul des tendances dynamiques:
158            CALL geopot(ip1jmp1, teta, pk, pks, phis, phi)            CALL geopot(ip1jmp1, teta, pk, pks, phis, phi)
159              CALL caldyn(itau + 1, ucov, vcov, teta, ps, masse, pk, pkf, phis, &
160            CALL caldyn(itau, ucov, vcov, teta, ps, masse, pk, pkf, phis, phi, &                 phi, .false., du, dv, dteta, dp, w, pbaru, pbarv, time_0)
                conser, du, dv, dteta, dp, w, pbaru, pbarv, &  
                time + iday - day_ini)  
   
           ! calcul des tendances advection des traceurs (dont l'humidite)  
   
           IF (forward .OR. leapf) THEN  
              CALL caladvtrac(q, pbaru, pbarv, p3d, masse, dq, teta, pk)  
              IF (offline) THEN  
                 !maf stokage du flux de masse pour traceurs OFF-LINE  
                 CALL fluxstokenc(pbaru, pbarv, masse, teta, phi, phis, dtvr, &  
                      itau)  
              ENDIF  
           ENDIF  
161    
162            ! integrations dynamique et traceurs:            ! integrations dynamique et traceurs:
163            CALL integrd(2, vcovm1, ucovm1, tetam1, psm1, massem1, dv, du, &            CALL integrd(vcovm1, ucovm1, tetam1, psm1, massem1, dv, du, dteta, &
164                 dteta, dq, dp, vcov, ucov, teta, q, ps, masse, phis, finvmaold)                 dp, vcov, ucov, teta, q(:, :, :, :2), ps, masse, finvmaold, &
165                   dtvr, leapf=.false.)
166           end if
167    
168           IF (MOD(itau + 1, iphysiq) == 0 .AND. iflag_phys /= 0) THEN
169            ! calcul des tendances physiques:            ! calcul des tendances physiques:
170    
171            IF (apphys) THEN            forall (l = 1: llm + 1) p3d(:, :, l) = ap(l) + bp(l) * ps
172               IF (itau + 1 == itaufin) lafin = .TRUE.            CALL exner_hyb(ps, p3d, pks, pk, pkf)
   
              CALL pression(ip1jmp1, ap, bp, ps, p3d)  
              CALL exner_hyb(ps, p3d, pks, pk, pkf)  
   
              rdaym_ini = itau * dtvr / daysec  
              rdayvrai = rdaym_ini + day_ini  
173    
174               ! Interface avec les routines de phylmd (phymars ...)            rdaym_ini = itau * dtvr / daysec
175              rdayvrai = rdaym_ini + day_ini
176               ! Diagnostique de conservation de l'énergie : initialisation            time = REAL(mod(itau, day_step)) / day_step + time_0
177               IF (ip_ebil_dyn >= 1) THEN            IF (time > 1.) time = time - 1.
178                  ztit='bil dyn'  
179                  CALL diagedyn(ztit, 2, 1, 1, dtphys, ucov, vcov, ps, p3d, pk, &            CALL calfis(rdayvrai, time, ucov, vcov, teta, q, masse, ps, pk, &
180                       teta, q(:, :, 1), q(:, :, 2))                 phis, phi, du, dv, dq, w, dufi, dvfi, dtetafi, dqfi, dpfi, &
181               ENDIF                 lafin=itau+1==itaufin)
182    
183               CALL calfis(nq, lafin, rdayvrai, time, ucov, vcov, teta, q, &            ! ajout des tendances physiques:
184                    masse, ps, pk, phis, phi, du, dv, dteta, dq, w, &            CALL addfi(nqmx, dtphys, ucov, vcov, teta, q, ps, dufi, dvfi, &
185                    clesphy0, dufi, dvfi, dtetafi, dqfi, dpfi)                 dtetafi, dqfi, dpfi)
186           ENDIF
              ! ajout des tendances physiques:  
              CALL addfi(nqmx, dtphys, &  
                   ucov, vcov, teta, q, ps, &  
                   dufi, dvfi, dtetafi, dqfi, dpfi)  
   
              ! Diagnostique de conservation de l'énergie : difference  
              IF (ip_ebil_dyn >= 1) THEN  
                 ztit = 'bil phys'  
                 CALL diagedyn(ztit, 2, 1, 1, dtphys, ucov, vcov, ps, p3d, pk, &  
                      teta, q(:, :, 1), q(:, :, 2))  
              ENDIF  
           ENDIF  
187    
188            CALL pression(ip1jmp1, ap, bp, ps, p3d)         forall (l = 1: llm + 1) p3d(:, :, l) = ap(l) + bp(l) * ps
189            CALL exner_hyb(ps, p3d, pks, pk, pkf)         CALL exner_hyb(ps, p3d, pks, pk, pkf)
190    
191           IF (MOD(itau + 1, idissip) == 0) THEN
192            ! dissipation horizontale et verticale des petites echelles:            ! dissipation horizontale et verticale des petites echelles:
193    
194            IF (apdiss) THEN            ! calcul de l'energie cinetique avant dissipation
195               ! calcul de l'energie cinetique avant dissipation            call covcont(llm, ucov, vcov, ucont, vcont)
196               call covcont(llm, ucov, vcov, ucont, vcont)            call enercin(vcov, ucov, vcont, ucont, ecin0)
197               call enercin(vcov, ucov, vcont, ucont, ecin0)  
198              ! dissipation
199               ! dissipation            CALL dissip(vcov, ucov, teta, p3d, dvdis, dudis, dtetadis)
200               CALL dissip(vcov, ucov, teta, p3d, dvdis, dudis, dtetadis)            ucov=ucov + dudis
201               ucov=ucov + dudis            vcov=vcov + dvdis
202               vcov=vcov + dvdis  
203              ! On rajoute la tendance due à la transformation Ec -> E
204               if (dissip_conservative) then            ! thermique créée lors de la dissipation
205                  ! On rajoute la tendance due a la transform. Ec -> E            call covcont(llm, ucov, vcov, ucont, vcont)
206                  ! therm. cree lors de la dissipation            call enercin(vcov, ucov, vcont, ucont, ecin)
207                  call covcont(llm, ucov, vcov, ucont, vcont)            dtetaecdt= (ecin0 - ecin) / pk
208                  call enercin(vcov, ucov, vcont, ucont, ecin)            dtetadis=dtetadis + dtetaecdt
209                  dtetaecdt= (ecin0 - ecin) / pk            teta=teta + dtetadis
210                  dtetadis=dtetadis + dtetaecdt  
211               endif            ! Calcul de la valeur moyenne aux pôles :
212               teta=teta + dtetadis            forall (l = 1: llm)
213                 teta(:, 1, l) = SUM(aire_2d(:iim, 1) * teta(:iim, 1, l)) &
214               ! Calcul de la valeur moyenne, unique de h aux poles .....                    / apoln
215                 teta(:, jjm + 1, l) = SUM(aire_2d(:iim, jjm+1) &
216               DO l = 1, llm                    * teta(:iim, jjm + 1, l)) / apols
217                  DO ij = 1, iim            END forall
218                     tppn(ij) = aire(ij) * teta(ij, l)  
219                     tpps(ij) = aire(ij + ip1jm) * teta(ij + ip1jm, l)            ps(:, 1) = SUM(aire_2d(:iim, 1) * ps(:iim, 1)) / apoln
220                  ENDDO            ps(:, jjm + 1) = SUM(aire_2d(:iim, jjm+1) * ps(:iim, jjm + 1)) &
221                  tpn = SSUM(iim, tppn, 1) / apoln                 / apols
222                  tps = SSUM(iim, tpps, 1) / apols         END IF
223    
224                  DO ij = 1, iip1         IF (MOD(itau + 1, iperiod) == 0) THEN
225                     teta(ij, l) = tpn            ! Écriture du fichier histoire moyenne:
226                     teta(ij + ip1jm, l) = tps            CALL writedynav(histaveid, nqmx, itau + 1, vcov, ucov, teta, pk, &
227                  ENDDO                 phi, q, masse, ps, phis)
228               ENDDO            call bilan_dyn(ps, masse, pk, pbaru, pbarv, teta, phi, ucov, vcov, &
229                   q(:, :, :, 1), dt_app = dtvr * iperiod, &
230               DO ij = 1, iim                 dt_cum = dtvr * day_step * periodav)
231                  tppn(ij) = aire(ij) * ps(ij)         ENDIF
232                  tpps(ij) = aire(ij + ip1jm) * ps(ij + ip1jm)      end do time_integration
233               ENDDO  
234               tpn = SSUM(iim, tppn, 1) / apoln      CALL dynredem1("restart.nc", vcov, ucov, teta, q, masse, ps, &
235               tps = SSUM(iim, tpps, 1) / apols           itau=itau_dyn+itaufin)
236    
237               DO ij = 1, iip1      ! Calcul des tendances dynamiques:
238                  ps(ij) = tpn      CALL geopot(ip1jmp1, teta, pk, pks, phis, phi)
239                  ps(ij + ip1jm) = tps      CALL caldyn(itaufin, ucov, vcov, teta, ps, masse, pk, pkf, phis, phi, &
240               ENDDO           MOD(itaufin, iconser) == 0, du, dv, dteta, dp, w, pbaru, pbarv, &
241             time_0)
           END IF  
   
           ! fin de l'intégration dynamique et physique pour le pas "itau"  
           ! préparation du pas d'intégration suivant  
   
           ! schema matsuno + leapfrog  
           IF (forward .OR. leapf) THEN  
              itau = itau + 1  
              iday = day_ini + itau / day_step  
              time = REAL(itau - (iday - day_ini) * day_step) / day_step &  
                   + time_0  
              IF (time > 1.) THEN  
                 time = time - 1.  
                 iday = iday + 1  
              ENDIF  
           ENDIF  
   
           IF (itau == itaufinp1) exit outer_loop  
   
           ! ecriture du fichier histoire moyenne:  
   
           ! Comment out the following calls when you do not want the output  
           ! files "dyn_hist_ave.nc" and "dynzon.nc"  
           IF (MOD(itau, iperiod) == 0 .OR. itau == itaufin) THEN  
              CALL writedynav(histaveid, nqmx, itau, vcov, &  
                   ucov, teta, pk, phi, q, masse, ps, phis)  
              call bilan_dyn(2, dtvr * iperiod, dtvr * day_step * periodav, &  
                   ps, masse, pk, pbaru, pbarv, teta, phi, ucov, vcov, q)  
           ENDIF  
   
           IF (itau == itaufin) THEN  
              CALL dynredem1("restart.nc", 0., vcov, ucov, teta, q, masse, ps)  
              CLOSE(99)  
           ENDIF  
   
           ! gestion de l'integration temporelle:  
   
           IF (MOD(itau, iperiod) == 0) exit  
           IF (MOD(itau - 1, iperiod) == 0) THEN  
              IF (forward) THEN  
                 ! fin du pas forward et debut du pas backward  
                 forward = .FALSE.  
                 leapf = .FALSE.  
              ELSE  
                 ! fin du pas backward et debut du premier pas leapfrog  
                 leapf = .TRUE.  
                 dt = 2. * dtvr  
              END IF  
           ELSE  
              ! ...... pas leapfrog .....  
              leapf = .TRUE.  
              dt = 2. * dtvr  
           END IF  
        end do  
     end do outer_loop  
242    
243    END SUBROUTINE leapfrog    END SUBROUTINE leapfrog
244    

Legend:
Removed from v.10  
changed lines
  Added in v.45

  ViewVC Help
Powered by ViewVC 1.1.21