/[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 5 by guez, Mon Mar 3 16:32:04 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, clesphy0, &    SUBROUTINE leapfrog(ucov, vcov, teta, ps, masse, phis, q)
        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 revision 616
10      ! nouveaux operat. dissipation * (gradiv2, divgrad2, nxgraro2)      ! Authors: P. Le Van, L. Fairhead, F. Hourdin
11        ! Matsuno-leapfrog scheme.
12      ! Auteur: P. Le Van /L. Fairhead/F.Hourdin  
13      ! Objet:      use addfi_m, only: addfi
14      ! GCM LMD nouvelle grille      use bilan_dyn_m, only: bilan_dyn
15        use caladvtrac_m, only: caladvtrac
16      ! ... Dans inigeom, nouveaux calculs pour les elongations cu, cv      use caldyn_m, only: caldyn
17      ! et possibilite d'appeler une fonction f(y) a derivee tangente      USE calfis_m, ONLY: calfis
18      ! hyperbolique a la place de la fonction a derivee sinusoidale.      USE comconst, ONLY: daysec, dtvr
19        USE comgeom, ONLY: aire_2d, apoln, apols
20      ! ... Possibilite de choisir le shema pour l'advection de      USE disvert_m, ONLY: ap, bp
21      ! q, en modifiant iadv dans "traceur.def" (10/02) .      USE conf_gcm_m, ONLY: day_step, iconser, iperiod, iphysiq, nday, offline, &
22             iflag_phys, iecri
23      ! Pour Van-Leer + Vapeur d'eau saturee, iadv(1)=4. (F.Codron, 10/99)      USE conf_guide_m, ONLY: ok_guide
24      ! Pour Van-Leer iadv=10      USE dimens_m, ONLY: iim, jjm, llm, nqmx
25        use dissip_m, only: dissip
26      use dimens_m, only: iim, llm, nqmx      USE dynetat0_m, ONLY: day_ini
27      use paramet_m, only: ip1jmp1, ip1jm, llmp1, ijmllm, ijp1llm, jjp1, iip1, &      use dynredem1_m, only: dynredem1
28           iip2      USE exner_hyb_m, ONLY: exner_hyb
29      use comconst, only: dtvr, daysec, dtphys      use filtreg_m, only: filtreg
30      use comvert, only: ap, bp      use fluxstokenc_m, only: fluxstokenc
31      use conf_gcm_m, only: day_step, iconser, idissip, iphysiq, iperiod, nday, &      use geopot_m, only: geopot
32           offline, periodav      USE guide_m, ONLY: guide
33      use logic, only: ok_guide, apdiss, apphys, conser, forward, iflag_phys, &      use inidissip_m, only: idissip
34           leapf, statcl      use integrd_m, only: integrd
35      use comgeom      use nr_util, only: assert
36      use serre      USE pressure_var, ONLY: p3d
37      use temps, only: itaufin, day_ini, dt      USE temps, ONLY: itau_dyn
38      use iniprint, only: prt_level      use writedynav_m, only: writedynav
39      use com_io_dyn      use writehist_m, only: writehist
40      use abort_gcm_m, only: abort_gcm  
41      use ener      ! Variables dynamiques:
42      use calfis_m, only: calfis      REAL, intent(inout):: ucov(:, :, :) ! (iim + 1, jjm + 1, llm) vent covariant
43      use exner_hyb_m, only: exner_hyb      REAL, intent(inout):: vcov(:, :, :) ! (iim + 1, jjm, llm) ! vent covariant
44      use guide_m, only: guide  
45      use pression_m, only: pression      REAL, intent(inout):: teta(:, :, :) ! (iim + 1, jjm + 1, llm)
46        ! potential temperature
47      integer nq  
48        REAL, intent(inout):: ps(:, :) ! (iim + 1, jjm + 1) pression au sol, en Pa
49      INTEGER longcles      REAL, intent(inout):: masse(:, :, :) ! (iim + 1, jjm + 1, llm) masse d'air
50      PARAMETER (longcles = 20)      REAL, intent(in):: phis(:, :) ! (iim + 1, jjm + 1) surface geopotential
51      REAL clesphy0(longcles)  
52        REAL, intent(inout):: q(:, :, :, :) ! (iim + 1, jjm + 1, llm, nqmx)
53      ! variables dynamiques      ! mass fractions of advected fields
54      REAL vcov(ip1jm, llm), ucov(ip1jmp1, llm) ! vents covariants  
55      REAL teta(ip1jmp1, llm) ! temperature potentielle      ! Local:
56      REAL q(ip1jmp1, llm, nqmx) ! mass fractions of advected fields  
57      REAL ps(ip1jmp1) ! pression au sol      ! Variables dynamiques:
58      REAL p(ip1jmp1, llmp1) ! pression aux interfac.des couches  
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 masse(ip1jmp1, llm) ! masse d'air      REAL phi(iim + 1, jjm + 1, llm) ! geopotential
63      REAL phis(ip1jmp1) ! geopotentiel au sol      REAL w(iim + 1, jjm + 1, llm) ! vitesse verticale
64      REAL phi(ip1jmp1, llm) ! geopotential  
65      REAL w(ip1jmp1, llm) ! vitesse verticale      ! Variables dynamiques intermediaire pour le transport
66        ! Flux de masse :
67      ! variables dynamiques intermediaire pour le transport      REAL pbaru(iim + 1, jjm + 1, llm), pbarv(iim + 1, jjm, llm)
68      REAL pbaru(ip1jmp1, llm), pbarv(ip1jm, llm) !flux de masse  
69        ! Variables dynamiques au pas - 1
70      ! variables dynamiques au pas - 1      REAL vcovm1(iim + 1, jjm, llm), ucovm1(iim + 1, jjm + 1, llm)
71      REAL vcovm1(ip1jm, llm), ucovm1(ip1jmp1, llm)      REAL tetam1(iim + 1, jjm + 1, llm), psm1(iim + 1, jjm + 1)
72      REAL tetam1(ip1jmp1, llm), psm1(ip1jmp1)      REAL massem1(iim + 1, jjm + 1, llm)
73      REAL massem1(ip1jmp1, llm)  
74        ! Tendances dynamiques
75      ! tendances dynamiques      REAL dv((iim + 1) * jjm, llm), dudyn(iim + 1, jjm + 1, llm)
76      REAL dv(ip1jm, llm), du(ip1jmp1, llm)      REAL dteta(iim + 1, jjm + 1, llm)
77      REAL dteta(ip1jmp1, llm), dq(ip1jmp1, llm, nqmx), dp(ip1jmp1)      real dp((iim + 1) * (jjm + 1))
78    
79      ! tendances de la dissipation      ! Tendances de la dissipation :
80      REAL dvdis(ip1jm, llm), dudis(ip1jmp1, llm)      REAL dvdis(iim + 1, jjm, llm), dudis(iim + 1, jjm + 1, llm)
81      REAL dtetadis(ip1jmp1, llm)      REAL dtetadis(iim + 1, jjm + 1, llm)
82    
83      ! tendances physiques      ! Tendances physiques
84      REAL dvfi(ip1jm, llm), dufi(ip1jmp1, llm)      REAL dvfi(iim + 1, jjm, llm), dufi(iim + 1, jjm + 1, llm)
85      REAL dtetafi(ip1jmp1, llm), dqfi(ip1jmp1, llm, nqmx), dpfi(ip1jmp1)      REAL dtetafi(iim + 1, jjm + 1, llm), dqfi(iim + 1, jjm + 1, llm, nqmx)
86    
87      ! variables pour le fichier histoire      ! Variables pour le fichier histoire
88        INTEGER itau ! index of the time step of the dynamics, starts at 0
89      REAL tppn(iim), tpps(iim), tpn, tps      INTEGER itaufin
90        REAL time ! time of day, as a fraction of day length
91      INTEGER itau, itaufinp1      real finvmaold(iim + 1, jjm + 1, llm)
92      INTEGER iday ! jour julien      INTEGER l
93      REAL time ! Heure de la journee en fraction d'1 jour  
94        ! Variables test conservation \'energie
95      REAL SSUM      REAL ecin(iim + 1, jjm + 1, llm), ecin0(iim + 1, jjm + 1, llm)
96      REAL time_0, finvmaold(ip1jmp1, llm)  
97        REAL vcont((iim + 1) * jjm, llm), ucont((iim + 1) * (jjm + 1), llm)
98      LOGICAL :: lafin=.false.      logical leapf
99      INTEGER ij, l      real dt ! time step, in s
   
     REAL rdayvrai, rdaym_ini  
     LOGICAL callinigrads  
   
     data 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 ! PRINT level for energy conserv. diag.  
     SAVE ip_ebil_dyn  
     DATA ip_ebil_dyn /0/  
   
     character(len=*), parameter:: modname = "leapfrog"  
     character*80 abort_message  
   
     logical dissip_conservative  
     save dissip_conservative  
     data dissip_conservative /.true./  
   
     LOGICAL prem  
     save prem  
     DATA prem /.true./  
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
111      CALL pression(ip1jmp1, ap, bp, ps, p)      CALL exner_hyb(ps, p3d, pks, pk, pkf)
112      CALL exner_hyb(ps, p, pks, pk, pkf)  
113        time_integration: do itau = 0, itaufin - 1
114      ! Debut de l'integration temporelle:         leapf = mod(itau, iperiod) /= 0
115      do         if (leapf) then
116         if (ok_guide.and.(itaufin - itau - 1) * dtvr > 21600) then            dt = 2 * dtvr
           call guide(itau, ucov, vcov, teta, q, masse, ps)  
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            statcl = .FALSE.         IF (offline) CALL fluxstokenc(pbaru, pbarv, masse, teta, phi, phis, &
140            conser = .FALSE.              dtvr, itau)
141            apdiss = .FALSE.  
142           ! Int\'egrations dynamique et traceurs:
143            IF (MOD(itau, iconser) == 0) conser = .TRUE.         CALL integrd(vcovm1, ucovm1, tetam1, psm1, massem1, dv, dudyn, dteta, &
144            IF (MOD(itau + 1, idissip) == 0) apdiss = .TRUE.              dp, vcov, ucov, teta, q(:, :, :, :2), ps, masse, finvmaold, dt, &
145            IF (MOD(itau + 1, iphysiq) == 0 .AND. iflag_phys /= 0) apphys=.TRUE.              leapf)
146    
147            ! calcul des tendances dynamiques:         forall (l = 1: llm + 1) p3d(:, :, l) = ap(l) + bp(l) * ps
148           CALL exner_hyb(ps, p3d, pks, pk, pkf)
149            CALL geopot(ip1jmp1, teta, pk, pks, phis, phi)  
150           if (.not. leapf) then
151            CALL caldyn(itau, ucov, vcov, teta, ps, masse, pk, pkf, phis, phi, &            ! Matsuno backward
152                 conser, du, dv, dteta, dp, w, pbaru, pbarv, &            ! Calcul des tendances dynamiques:
153                 time + iday - day_ini)            CALL geopot(teta, pk, pks, phis, phi)
154              CALL caldyn(itau + 1, ucov, vcov, teta, ps, masse, pk, pkf, phis, &
155            ! calcul des tendances advection des traceurs (dont l'humidite)                 phi, dudyn, dv, dteta, dp, w, pbaru, pbarv, conser = .false.)
   
           IF (forward .OR. leapf) THEN  
              CALL caladvtrac(q, pbaru, pbarv, p, 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, finvmaold)                 dteta, dp, vcov, ucov, teta, q(:, :, :, :2), ps, masse, &
160                   finvmaold, dtvr, leapf=.false.)
161            ! calcul des tendances physiques:  
162              forall (l = 1: llm + 1) p3d(:, :, l) = ap(l) + bp(l) * ps
163            IF (apphys) THEN            CALL exner_hyb(ps, p3d, pks, pk, pkf)
164               IF (itau + 1 == itaufin) lafin = .TRUE.         end if
165    
166               CALL pression(ip1jmp1, ap, bp, ps, p)         IF (MOD(itau + 1, iphysiq) == 0 .AND. iflag_phys /= 0) THEN
167               CALL exner_hyb(ps, p, pks, pk, pkf)            ! Calcul des tendances physiques :
168              time = REAL(mod(itau, day_step)) / day_step
169               rdaym_ini = itau * dtvr / daysec            IF (time > 1.) time = time - 1.
170               rdayvrai = rdaym_ini + day_ini            CALL calfis(itau * dtvr / daysec + day_ini, time, ucov, vcov, teta, &
171                   q, pk, phis, phi, w, dufi, dvfi, dtetafi, dqfi, &
172               ! Interface avec les routines de phylmd (phymars ...)                 lafin = itau + 1 == itaufin)
173    
174               ! Diagnostique de conservation de l'énergie : initialisation            CALL addfi(ucov, vcov, teta, q, dufi, dvfi, dtetafi, dqfi)
175               IF (ip_ebil_dyn >= 1) THEN         ENDIF
176                  ztit='bil dyn'  
177                  CALL diagedyn(ztit, 2, 1, 1, dtphys &         IF (MOD(itau + 1, idissip) == 0) THEN
178                       , ucov, vcov, ps, p, pk, teta, q(:, :, 1), q(:, :, 2))            ! Dissipation horizontale et verticale des petites \'echelles
179               ENDIF  
180              ! calcul de l'\'energie cin\'etique avant dissipation
181               CALL calfis(nq, lafin, rdayvrai, time, ucov, vcov, teta, q, &            call covcont(llm, ucov, vcov, ucont, vcont)
182                    masse, ps, p, pk, phis, phi, du, dv, dteta, dq, w, &            call enercin(vcov, ucov, vcont, ucont, ecin0)
183                    clesphy0, dufi, dvfi, dtetafi, dqfi, dpfi)  
184              ! dissipation
185               ! ajout des tendances physiques:            CALL dissip(vcov, ucov, teta, p3d, dvdis, dudis, dtetadis)
186               CALL addfi(nqmx, dtphys, &            ucov = ucov + dudis
187                    ucov, vcov, teta, q, ps, &            vcov = vcov + dvdis
188                    dufi, dvfi, dtetafi, dqfi, dpfi)  
189              ! On ajoute la tendance due \`a la transformation \'energie
190               ! Diagnostique de conservation de l'énergie : difference            ! cin\'etique en \'energie thermique par la dissipation
191               IF (ip_ebil_dyn >= 1) THEN            call covcont(llm, ucov, vcov, ucont, vcont)
192                  ztit = 'bil phys'            call enercin(vcov, ucov, vcont, ucont, ecin)
193                  CALL diagedyn(ztit, 2, 1, 1, dtphys, ucov, vcov, ps, p, pk, &            dtetadis = dtetadis + (ecin0 - ecin) / pk
194                       teta, q(:, :, 1), q(:, :, 2))            teta = teta + dtetadis
195               ENDIF  
196            ENDIF            ! Calcul de la valeur moyenne aux p\^oles :
197              forall (l = 1: llm)
198            CALL pression(ip1jmp1, ap, bp, ps, p)               teta(:, 1, l) = SUM(aire_2d(:iim, 1) * teta(:iim, 1, l)) &
199            CALL exner_hyb(ps, p, pks, pk, pkf)                    / apoln
200                 teta(:, jjm + 1, l) = SUM(aire_2d(:iim, jjm+1) &
201            ! dissipation horizontale et verticale des petites echelles:                    * teta(:iim, jjm + 1, l)) / apols
202              END forall
203            IF (apdiss) THEN         END IF
204               ! calcul de l'energie cinetique avant dissipation  
205               call covcont(llm, ucov, vcov, ucont, vcont)         IF (MOD(itau + 1, iperiod) == 0) THEN
206               call enercin(vcov, ucov, vcont, ucont, ecin0)            ! \'Ecriture du fichier histoire moyenne:
207              CALL writedynav(vcov, ucov, teta, pk, phi, q, masse, ps, phis, &
208               ! dissipation                 time = itau + 1)
209               CALL dissip(vcov, ucov, teta, p, dvdis, dudis, dtetadis)            call bilan_dyn(ps, masse, pk, pbaru, pbarv, teta, phi, ucov, vcov, &
210               ucov=ucov + dudis                 q(:, :, :, 1))
211               vcov=vcov + dvdis         ENDIF
212    
213               if (dissip_conservative) then         IF (MOD(itau + 1, iecri * day_step) == 0) THEN
214                  ! On rajoute la tendance due a la transform. Ec -> E            CALL geopot(teta, pk, pks, phis, phi)
215                  ! therm. cree lors de la dissipation            CALL writehist(itau, vcov, ucov, teta, phi, q, masse, ps)
216                  call covcont(llm, ucov, vcov, ucont, vcont)         END IF
217                  call enercin(vcov, ucov, vcont, ucont, ecin)      end do time_integration
218                  dtetaecdt= (ecin0 - ecin) / pk  
219                  dtetadis=dtetadis + dtetaecdt      CALL dynredem1("restart.nc", vcov, ucov, teta, q, masse, ps, &
220               endif           itau = itau_dyn + itaufin)
221               teta=teta + dtetadis  
222        ! Calcul des tendances dynamiques:
223               ! Calcul de la valeur moyenne, unique de h aux poles .....      CALL geopot(teta, pk, pks, phis, phi)
224        CALL caldyn(itaufin, ucov, vcov, teta, ps, masse, pk, pkf, phis, phi, &
225               DO l = 1, llm           dudyn, dv, dteta, dp, w, pbaru, pbarv, &
226                  DO ij = 1, iim           conser = MOD(itaufin, iconser) == 0)
                    tppn(ij) = aire(ij) * teta(ij, l)  
                    tpps(ij) = aire(ij + ip1jm) * teta(ij + ip1jm, l)  
                 ENDDO  
                 tpn = SSUM(iim, tppn, 1) / apoln  
                 tps = SSUM(iim, tpps, 1) / apols  
   
                 DO ij = 1, iip1  
                    teta(ij, l) = tpn  
                    teta(ij + ip1jm, l) = tps  
                 ENDDO  
              ENDDO  
   
              DO ij = 1, iim  
                 tppn(ij) = aire(ij) * ps(ij)  
                 tpps(ij) = aire(ij + ip1jm) * ps(ij + ip1jm)  
              ENDDO  
              tpn = SSUM(iim, tppn, 1) / apoln  
              tps = SSUM(iim, tpps, 1) / apols  
   
              DO ij = 1, iip1  
                 ps(ij) = tpn  
                 ps(ij + ip1jm) = tps  
              ENDDO  
   
           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) then  
              abort_message = 'Simulation finished'  
              call abort_gcm(modname, abort_message, 0)  
           ENDIF  
   
           ! 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  
227    
228    END SUBROUTINE leapfrog    END SUBROUTINE leapfrog
229    

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

  ViewVC Help
Powered by ViewVC 1.1.21