/[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

trunk/libf/dyn3d/leapfrog.f90 revision 18 by guez, Thu Aug 7 12:29:13 2008 UTC trunk/dyn3d/leapfrog.f revision 128 by guez, Thu Feb 12 16:23:33 2015 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, time_0)    SUBROUTINE leapfrog(ucov, vcov, teta, ps, masse, phis, q)
   
     ! 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 revision 616
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 comconst, ONLY: daysec, dtvr
19        USE comgeom, ONLY: aire_2d, apoln, apols
20        USE disvert_m, ONLY: ap, bp
21        USE conf_gcm_m, ONLY: day_step, iconser, iperiod, iphysiq, nday, offline, &
22             iflag_phys, iecri
23        USE conf_guide_m, ONLY: ok_guide
24        USE dimens_m, ONLY: iim, jjm, llm, nqmx
25        use dissip_m, only: dissip
26        USE dynetat0_m, ONLY: day_ini
27        use dynredem1_m, only: dynredem1
28        USE exner_hyb_m, ONLY: exner_hyb
29        use filtreg_m, only: filtreg
30        use fluxstokenc_m, only: fluxstokenc
31        use geopot_m, only: geopot
32        USE guide_m, ONLY: guide
33        use inidissip_m, only: idissip
34        use integrd_m, only: integrd
35        use nr_util, only: assert
36        USE pressure_var, ONLY: p3d
37        USE temps, ONLY: itau_dyn
38        use writedynav_m, only: writedynav
39        use writehist_m, only: writehist
40    
41      ! Auteur: P. Le Van /L. Fairhead/F.Hourdin      ! Variables dynamiques:
42      ! Objet:      REAL, intent(inout):: ucov(:, :, :) ! (iim + 1, jjm + 1, llm) vent covariant
43      ! 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, iflag_phys  
     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  
44    
45      integer, intent(in):: nq      REAL, intent(inout):: teta(:, :, :) ! (iim + 1, jjm + 1, llm)
46        ! potential temperature
47    
48      ! Variables dynamiques:      REAL, intent(inout):: ps(:, :) ! (iim + 1, jjm + 1) pression au sol, en Pa
49      REAL vcov(ip1jm, llm), ucov(ip1jmp1, llm) ! vents covariants      REAL, intent(inout):: masse(:, :, :) ! (iim + 1, jjm + 1, llm) masse d'air
50      REAL teta(ip1jmp1, llm) ! temperature potentielle      REAL, intent(in):: phis(:, :) ! (iim + 1, jjm + 1) surface geopotential
     REAL q(ip1jmp1, llm, nqmx) ! mass fractions of advected fields  
     REAL ps(ip1jmp1) ! pression au sol, en Pa  
     REAL masse(ip1jmp1, llm) ! masse d'air  
     REAL phis(ip1jmp1) ! geopotentiel au sol  
51    
52      REAL time_0      REAL, intent(inout):: q(:, :, :, :) ! (iim + 1, jjm + 1, llm, nqmx)
53        ! mass fractions of advected fields
54    
55      ! Variables local to the procedure:      ! Local:
56    
57      ! Variables dynamiques:      ! Variables dynamiques:
58    
59      REAL pks(ip1jmp1) ! exner au sol      REAL pks(iim + 1, jjm + 1) ! exner au sol
60      REAL pk(ip1jmp1, llm) ! exner au milieu des couches      REAL pk(iim + 1, jjm + 1, llm) ! exner au milieu des couches
61      REAL pkf(ip1jmp1, llm) ! exner filt.au milieu des couches      REAL pkf(iim + 1, jjm + 1, llm) ! exner filtr\'e au milieu des couches
62      REAL phi(ip1jmp1, llm) ! geopotential      REAL phi(iim + 1, jjm + 1, llm) ! geopotential
63      REAL w(ip1jmp1, llm) ! vitesse verticale      REAL w(iim + 1, jjm + 1, llm) ! vitesse verticale
64    
65      ! variables dynamiques intermediaire pour le transport      ! Variables dynamiques intermediaire pour le transport
66      REAL pbaru(ip1jmp1, llm), pbarv(ip1jm, llm) !flux de masse      ! Flux de masse :
67        REAL pbaru(iim + 1, jjm + 1, llm), pbarv(iim + 1, jjm, llm)
68      ! variables dynamiques au pas - 1  
69      REAL vcovm1(ip1jm, llm), ucovm1(ip1jmp1, llm)      ! Variables dynamiques au pas - 1
70      REAL tetam1(ip1jmp1, llm), psm1(ip1jmp1)      REAL vcovm1(iim + 1, jjm, llm), ucovm1(iim + 1, jjm + 1, llm)
71      REAL massem1(ip1jmp1, llm)      REAL tetam1(iim + 1, jjm + 1, llm), psm1(iim + 1, jjm + 1)
72        REAL massem1(iim + 1, jjm + 1, llm)
73      ! tendances dynamiques  
74      REAL dv(ip1jm, llm), du(ip1jmp1, llm)      ! Tendances dynamiques
75      REAL dteta(ip1jmp1, llm), dq(ip1jmp1, llm, nqmx), dp(ip1jmp1)      REAL dv((iim + 1) * jjm, llm), dudyn(iim + 1, jjm + 1, llm)
76        REAL dteta(iim + 1, jjm + 1, llm)
77      ! tendances de la dissipation      real dp((iim + 1) * (jjm + 1))
78      REAL dvdis(ip1jm, llm), dudis(ip1jmp1, llm)  
79      REAL dtetadis(ip1jmp1, llm)      ! Tendances de la dissipation :
80        REAL dvdis(iim + 1, jjm, llm), dudis(iim + 1, jjm + 1, llm)
81      ! tendances physiques      REAL dtetadis(iim + 1, jjm + 1, llm)
82      REAL dvfi(ip1jm, llm), dufi(ip1jmp1, llm)  
83      REAL dtetafi(ip1jmp1, llm), dqfi(ip1jmp1, llm, nqmx), dpfi(ip1jmp1)      ! Tendances physiques
84        REAL dvfi(iim + 1, jjm, llm), dufi(iim + 1, jjm + 1, llm)
85      ! variables pour le fichier histoire      REAL dtetafi(iim + 1, jjm + 1, llm), dqfi(iim + 1, jjm + 1, llm, nqmx)
86    
87      REAL tppn(iim), tpps(iim), tpn, tps      ! Variables pour le fichier histoire
88        INTEGER itau ! index of the time step of the dynamics, starts at 0
89      INTEGER itau, itaufinp1      INTEGER itaufin
90      INTEGER iday ! jour julien      REAL time ! time of day, as a fraction of day length
91      REAL time ! Heure de la journee en fraction d'1 jour      real finvmaold(iim + 1, jjm + 1, llm)
92        INTEGER l
93      REAL SSUM  
94      real finvmaold(ip1jmp1, llm)      ! Variables test conservation \'energie
95        REAL ecin(iim + 1, jjm + 1, llm), ecin0(iim + 1, jjm + 1, llm)
96      LOGICAL :: lafin=.false.  
97      INTEGER ij, l      REAL vcont((iim + 1) * jjm, llm), ucont((iim + 1) * (jjm + 1), llm)
98        logical leapf
99      REAL rdayvrai, rdaym_ini      real dt ! time step, in s
     LOGICAL:: callinigrads = .true.  
   
     !+jld variables test conservation energie  
     REAL ecin(ip1jmp1, llm), ecin0(ip1jmp1, 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.  
   
     logical:: dissip_conservative = .true.  
     LOGICAL:: prem = .true.  
     logical forward, leapf, apphys, conser, apdiss  
100    
101      !---------------------------------------------------      !---------------------------------------------------
102    
103      print *, "Call sequence information: leapfrog"      print *, "Call sequence information: leapfrog"
104        call assert(shape(ucov) == (/iim + 1, jjm + 1, llm/), "leapfrog")
105    
106      itaufin = nday * day_step      itaufin = nday * day_step
107      itaufinp1 = itaufin + 1      ! "day_step" is a multiple of "iperiod", therefore so is "itaufin".
   
     itau = 0  
     iday = day_ini  
     time = time_0  
     IF (time > 1.) THEN  
        time = time - 1.  
        iday = iday + 1  
     ENDIF  
108    
109      ! On initialise la pression et la fonction d'Exner :      ! On initialise la pression et la fonction d'Exner :
110      dq=0.      forall (l = 1: llm + 1) p3d(:, :, l) = ap(l) + bp(l) * ps
     CALL pression(ip1jmp1, ap, bp, ps, p3d)  
111      CALL exner_hyb(ps, p3d, pks, pk, pkf)      CALL exner_hyb(ps, p3d, pks, pk, pkf)
112    
113      ! Debut de l'integration temporelle:      time_integration: do itau = 0, itaufin - 1
114      outer_loop:do         leapf = mod(itau, iperiod) /= 0
115         if (ok_guide.and.(itaufin - itau - 1) * dtvr > 21600) then         if (leapf) then
116            call guide(itau, ucov, vcov, teta, q, masse, ps)            dt = 2 * dtvr
117         else         else
118            IF (prt_level > 9) print *, &            ! Matsuno
119                 'Attention : on ne guide pas les 6 dernieres heures.'            dt = dtvr
120         endif            if (ok_guide) call guide(itau, ucov, vcov, teta, q(:, :, :, 1), ps)
121              vcovm1 = vcov
122         CALL SCOPY(ijmllm, vcov, 1, vcovm1, 1)            ucovm1 = ucov
123         CALL SCOPY(ijp1llm, ucov, 1, ucovm1, 1)            tetam1 = teta
124         CALL SCOPY(ijp1llm, teta, 1, tetam1, 1)            massem1 = masse
125         CALL SCOPY(ijp1llm, masse, 1, massem1, 1)            psm1 = ps
126         CALL SCOPY(ip1jmp1, ps, 1, psm1, 1)            finvmaold = masse
127              CALL filtreg(finvmaold, direct = .false., intensive = .false.)
128         forward = .TRUE.         end if
129         leapf = .FALSE.  
130         dt = dtvr         ! Calcul des tendances dynamiques:
131           CALL geopot(teta, pk, pks, phis, phi)
132         CALL SCOPY(ijp1llm, masse, 1, finvmaold, 1)         CALL caldyn(itau, ucov, vcov, teta, ps, masse, pk, pkf, phis, phi, &
133         CALL filtreg(finvmaold, jjp1, llm, - 2, 2, .TRUE., 1)              dudyn, dv, dteta, dp, w, pbaru, pbarv, &
134                conser = MOD(itau, iconser) == 0)
135         do  
136            ! gestion des appels de la physique et des dissipations:         CALL caladvtrac(q, pbaru, pbarv, p3d, masse, teta, pk)
137    
138            apphys = .FALSE.         ! Stokage du flux de masse pour traceurs offline:
139            conser = .FALSE.         IF (offline) CALL fluxstokenc(pbaru, pbarv, masse, teta, phi, phis, &
140            apdiss = .FALSE.              dtvr, itau)
141    
142            IF (MOD(itau, iconser) == 0) conser = .TRUE.         ! Int\'egrations dynamique et traceurs:
143            IF (MOD(itau + 1, idissip) == 0) apdiss = .TRUE.         CALL integrd(vcovm1, ucovm1, tetam1, psm1, massem1, dv, dudyn, dteta, &
144            IF (MOD(itau + 1, iphysiq) == 0 .AND. iflag_phys /= 0) apphys=.TRUE.              dp, vcov, ucov, teta, q(:, :, :, :2), ps, masse, finvmaold, dt, &
145                leapf)
146            ! calcul des tendances dynamiques:  
147           forall (l = 1: llm + 1) p3d(:, :, l) = ap(l) + bp(l) * ps
148            CALL geopot(ip1jmp1, teta, pk, pks, phis, phi)         CALL exner_hyb(ps, p3d, pks, pk, pkf)
149    
150            CALL caldyn(itau, ucov, vcov, teta, ps, masse, pk, pkf, phis, phi, &         if (.not. leapf) then
151                 conser, du, dv, dteta, dp, w, pbaru, pbarv, &            ! Matsuno backward
152                 time + iday - day_ini)            ! Calcul des tendances dynamiques:
153              CALL geopot(teta, pk, pks, phis, phi)
154            ! calcul des tendances advection des traceurs (dont l'humidite)            CALL caldyn(itau + 1, ucov, vcov, teta, ps, masse, pk, pkf, phis, &
155                   phi, dudyn, dv, dteta, dp, w, pbaru, pbarv, conser = .false.)
           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  
156    
157            ! integrations dynamique et traceurs:            ! integrations dynamique et traceurs:
158            CALL integrd(2, vcovm1, ucovm1, tetam1, psm1, massem1, dv, du, &            CALL integrd(vcovm1, ucovm1, tetam1, psm1, massem1, dv, dudyn, &
159                 dteta, dq, dp, vcov, ucov, teta, q, ps, masse, phis, &                 dteta, dp, vcov, ucov, teta, q(:, :, :, :2), ps, masse, &
160                 finvmaold, leapf)                 finvmaold, dtvr, leapf=.false.)
   
           ! calcul des tendances physiques:  
   
           IF (apphys) THEN  
              IF (itau + 1 == itaufin) lafin = .TRUE.  
   
              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  
   
              ! Interface avec les routines de phylmd (phymars ...)  
   
              ! Diagnostique de conservation de l'énergie : initialisation  
              IF (ip_ebil_dyn >= 1) THEN  
                 ztit='bil dyn'  
                 CALL diagedyn(ztit, 2, 1, 1, dtphys, ucov, vcov, ps, p3d, pk, &  
                      teta, q(:, :, 1), q(:, :, 2))  
              ENDIF  
   
              CALL calfis(nq, lafin, rdayvrai, time, ucov, vcov, teta, q, &  
                   masse, ps, pk, phis, phi, du, dv, dteta, dq, w, &  
                   dufi, dvfi, dtetafi, dqfi, dpfi)  
   
              ! 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  
161    
162            CALL pression(ip1jmp1, ap, bp, ps, p3d)            forall (l = 1: llm + 1) p3d(:, :, l) = ap(l) + bp(l) * ps
163            CALL exner_hyb(ps, p3d, pks, pk, pkf)            CALL exner_hyb(ps, p3d, pks, pk, pkf)
164           end if
165    
166            ! dissipation horizontale et verticale des petites echelles:         IF (MOD(itau + 1, iphysiq) == 0 .AND. iflag_phys /= 0) THEN
167              ! Calcul des tendances physiques :
168            IF (apdiss) THEN            time = REAL(mod(itau, day_step)) / day_step
169               ! calcul de l'energie cinetique avant dissipation            IF (time > 1.) time = time - 1.
170               call covcont(llm, ucov, vcov, ucont, vcont)            CALL calfis(itau * dtvr / daysec + day_ini, time, ucov, vcov, teta, &
171               call enercin(vcov, ucov, vcont, ucont, ecin0)                 q, pk, phis, phi, w, dufi, dvfi, dtetafi, dqfi, &
172                   lafin = itau + 1 == itaufin)
173               ! dissipation  
174               CALL dissip(vcov, ucov, teta, p3d, dvdis, dudis, dtetadis)            CALL addfi(ucov, vcov, teta, q, dufi, dvfi, dtetafi, dqfi)
175               ucov=ucov + dudis         ENDIF
176               vcov=vcov + dvdis  
177           IF (MOD(itau + 1, idissip) == 0) THEN
178               if (dissip_conservative) then            ! Dissipation horizontale et verticale des petites \'echelles
179                  ! On rajoute la tendance due a la transform. Ec -> E  
180                  ! therm. cree lors de la dissipation            ! calcul de l'\'energie cin\'etique avant dissipation
181                  call covcont(llm, ucov, vcov, ucont, vcont)            call covcont(llm, ucov, vcov, ucont, vcont)
182                  call enercin(vcov, ucov, vcont, ucont, ecin)            call enercin(vcov, ucov, vcont, ucont, ecin0)
183                  dtetaecdt= (ecin0 - ecin) / pk  
184                  dtetadis=dtetadis + dtetaecdt            ! dissipation
185               endif            CALL dissip(vcov, ucov, teta, p3d, dvdis, dudis, dtetadis)
186               teta=teta + dtetadis            ucov = ucov + dudis
187              vcov = vcov + dvdis
188               ! Calcul de la valeur moyenne, unique de h aux poles .....  
189              ! On ajoute la tendance due \`a la transformation \'energie
190               DO l = 1, llm            ! cin\'etique en \'energie thermique par la dissipation
191                  DO ij = 1, iim            call covcont(llm, ucov, vcov, ucont, vcont)
192                     tppn(ij) = aire(ij) * teta(ij, l)            call enercin(vcov, ucov, vcont, ucont, ecin)
193                     tpps(ij) = aire(ij + ip1jm) * teta(ij + ip1jm, l)            dtetadis = dtetadis + (ecin0 - ecin) / pk
194                  ENDDO            teta = teta + dtetadis
195                  tpn = SSUM(iim, tppn, 1) / apoln  
196                  tps = SSUM(iim, tpps, 1) / apols            ! Calcul de la valeur moyenne aux p\^oles :
197              forall (l = 1: llm)
198                  DO ij = 1, iip1               teta(:, 1, l) = SUM(aire_2d(:iim, 1) * teta(:iim, 1, l)) &
199                     teta(ij, l) = tpn                    / apoln
200                     teta(ij + ip1jm, l) = tps               teta(:, jjm + 1, l) = SUM(aire_2d(:iim, jjm+1) &
201                  ENDDO                    * teta(:iim, jjm + 1, l)) / apols
202               ENDDO            END forall
203           END IF
204               DO ij = 1, iim  
205                  tppn(ij) = aire(ij) * ps(ij)         IF (MOD(itau + 1, iperiod) == 0) THEN
206                  tpps(ij) = aire(ij + ip1jm) * ps(ij + ip1jm)            ! \'Ecriture du fichier histoire moyenne:
207               ENDDO            CALL writedynav(vcov, ucov, teta, pk, phi, q, masse, ps, phis, &
208               tpn = SSUM(iim, tppn, 1) / apoln                 time = itau + 1)
209               tps = SSUM(iim, tpps, 1) / apols            call bilan_dyn(ps, masse, pk, pbaru, pbarv, teta, phi, ucov, vcov, &
210                   q(:, :, :, 1))
211               DO ij = 1, iip1         ENDIF
212                  ps(ij) = tpn  
213                  ps(ij + ip1jm) = tps         IF (MOD(itau + 1, iecri * day_step) == 0) THEN
214               ENDDO            CALL geopot(teta, pk, pks, phis, phi)
215              CALL writehist(itau, vcov, ucov, teta, phi, q, masse, ps)
216            END IF         END IF
217        end do time_integration
218            ! fin de l'intégration dynamique et physique pour le pas "itau"  
219            ! préparation du pas d'intégration suivant      CALL dynredem1("restart.nc", vcov, ucov, teta, q, masse, ps, &
220             itau = itau_dyn + itaufin)
221            ! schema matsuno + leapfrog  
222            IF (forward .OR. leapf) THEN      ! Calcul des tendances dynamiques:
223               itau = itau + 1      CALL geopot(teta, pk, pks, phis, phi)
224               iday = day_ini + itau / day_step      CALL caldyn(itaufin, ucov, vcov, teta, ps, masse, pk, pkf, phis, phi, &
225               time = REAL(itau - (iday - day_ini) * day_step) / day_step &           dudyn, dv, dteta, dp, w, pbaru, pbarv, &
226                    + time_0           conser = MOD(itaufin, iconser) == 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  
227    
228    END SUBROUTINE leapfrog    END SUBROUTINE leapfrog
229    

Legend:
Removed from v.18  
changed lines
  Added in v.128

  ViewVC Help
Powered by ViewVC 1.1.21