source: trunk/libf/dyn3d/leapfrog.F @ 6

Last change on this file since 6 was 6, checked in by slebonnois, 14 years ago

cf commit_v6.log :

  • manipulation traceurs
  • homogeneisation .def
  • bilan_dyn
  • etats initiaux start.nc
  • appels specifiques pour physique
File size: 25.8 KB
Line 
1!
2! $Id: leapfrog.F 1437 2010-09-30 08:29:10Z emillour $
3!
4c
5c
6      SUBROUTINE leapfrog(ucov,vcov,teta,ps,masse,phis,q,clesphy0,
7     &                    time_0)
8
9
10cIM : pour sortir les param. du modele dans un fis. netcdf 110106
11#ifdef CPP_IOIPSL
12      use IOIPSL
13#endif
14      USE infotrac
15      USE guide_mod, ONLY : guide_main
16      USE write_field
17      USE control_mod
18      IMPLICIT NONE
19
20c      ......   Version  du 10/01/98    ..........
21
22c             avec  coordonnees  verticales hybrides
23c   avec nouveaux operat. dissipation * ( gradiv2,divgrad2,nxgraro2 )
24
25c=======================================================================
26c
27c   Auteur:  P. Le Van /L. Fairhead/F.Hourdin
28c   -------
29c
30c   Objet:
31c   ------
32c
33c   GCM LMD nouvelle grille
34c
35c=======================================================================
36c
37c  ... Dans inigeom , nouveaux calculs pour les elongations  cu , cv
38c      et possibilite d'appeler une fonction f(y)  a derivee tangente
39c      hyperbolique a la  place de la fonction a derivee sinusoidale.
40
41c  ... Possibilite de choisir le shema pour l'advection de
42c        q  , en modifiant iadv dans traceur.def  (10/02) .
43c
44c      Pour Van-Leer + Vapeur d'eau saturee, iadv(1)=4. (F.Codron,10/99)
45c      Pour Van-Leer iadv=10
46c
47c-----------------------------------------------------------------------
48c   Declarations:
49c   -------------
50
51#include "dimensions.h"
52#include "paramet.h"
53#include "comconst.h"
54#include "comdissnew.h"
55#include "comvert.h"
56#include "comgeom.h"
57#include "logic.h"
58#include "temps.h"
59#include "ener.h"
60#include "description.h"
61#include "serre.h"
62!#include "com_io_dyn.h"
63#include "iniprint.h"
64#include "academic.h"
65
66! FH 2008/05/09 On elimine toutes les clefs physiques dans la dynamique
67! #include "clesphys.h"
68
69      INTEGER         longcles
70      PARAMETER     ( longcles = 20 )
71      REAL  clesphy0( longcles )
72
73      real zqmin,zqmax
74      INTEGER nbetatmoy, nbetatdem,nbetat
75
76c   variables dynamiques
77      REAL vcov(ip1jm,llm),ucov(ip1jmp1,llm) ! vents covariants
78      REAL teta(ip1jmp1,llm)                 ! temperature potentielle
79      REAL q(ip1jmp1,llm,nqtot)               ! champs advectes
80      REAL ps(ip1jmp1)                       ! pression  au sol
81      REAL p (ip1jmp1,llmp1  )               ! pression aux interfac.des couches
82      REAL pks(ip1jmp1)                      ! exner au  sol
83      REAL pk(ip1jmp1,llm)                   ! exner au milieu des couches
84      REAL pkf(ip1jmp1,llm)                  ! exner filt.au milieu des couches
85      REAL masse(ip1jmp1,llm)                ! masse d'air
86      REAL phis(ip1jmp1)                     ! geopotentiel au sol
87      REAL phi(ip1jmp1,llm)                  ! geopotentiel
88      REAL w(ip1jmp1,llm)                    ! vitesse verticale
89! ADAPTATION GCM POUR CP(T)
90      REAL temp(ip1jmp1,llm)                 ! temperature 
91      REAL tsurpk(ip1jmp1,llm)               ! cpp*T/pk 
92
93c variables dynamiques intermediaire pour le transport
94      REAL pbaru(ip1jmp1,llm),pbarv(ip1jm,llm) !flux de masse
95
96c   variables dynamiques au pas -1
97      REAL vcovm1(ip1jm,llm),ucovm1(ip1jmp1,llm)
98      REAL tetam1(ip1jmp1,llm),psm1(ip1jmp1)
99      REAL massem1(ip1jmp1,llm)
100
101c   tendances dynamiques en */s
102      REAL dv(ip1jm,llm),du(ip1jmp1,llm)
103      REAL dteta(ip1jmp1,llm),dq(ip1jmp1,llm,nqtot),dp(ip1jmp1)
104
105c   tendances de la dissipation en */s
106      REAL dvdis(ip1jm,llm),dudis(ip1jmp1,llm)
107      REAL dtetadis(ip1jmp1,llm)
108
109c   tendances de la couche superieure */s
110      REAL dvtop(ip1jm,llm),dutop(ip1jmp1,llm)
111      REAL dtetatop(ip1jmp1,llm)
112      REAL dqtop(ip1jmp1,llm,nqtot),dptop(ip1jmp1)
113
114c   tendances physiques */s
115      REAL dvfi(ip1jm,llm),dufi(ip1jmp1,llm)
116      REAL dtetafi(ip1jmp1,llm),dqfi(ip1jmp1,llm,nqtot),dpfi(ip1jmp1)
117
118c   variables pour le fichier histoire
119      REAL dtav      ! intervalle de temps elementaire
120
121      REAL tppn(iim),tpps(iim),tpn,tps
122c
123      INTEGER itau,itaufinp1,iav
124!      INTEGER  iday ! jour julien
125      REAL       time
126
127      REAL  SSUM
128      REAL time_0 , finvmaold(ip1jmp1,llm)
129
130cym      LOGICAL  lafin
131      LOGICAL :: lafin=.false.
132      INTEGER ij,iq,l
133      INTEGER ik
134
135      real time_step, t_wrt, t_ops
136
137!      REAL rdayvrai,rdaym_ini
138! jD_cur: jour julien courant
139! jH_cur: heure julienne courante
140      REAL :: jD_cur, jH_cur
141      INTEGER :: an, mois, jour
142      REAL :: secondes
143
144      LOGICAL first,callinigrads
145cIM : pour sortir les param. du modele dans un fis. netcdf 110106
146      save first
147      data first/.true./
148      real dt_cum
149      character*10 infile
150      integer zan, tau0, thoriid
151      integer nid_ctesGCM
152      save nid_ctesGCM
153      real degres
154      real rlong(iip1), rlatg(jjp1)
155      real zx_tmp_2d(iip1,jjp1)
156      integer ndex2d(iip1*jjp1)
157      logical ok_sync
158      parameter (ok_sync = .true.)
159
160      data callinigrads/.true./
161      character*10 string10
162
163      REAL alpha(ip1jmp1,llm),beta(ip1jmp1,llm)
164      REAL :: flxw(ip1jmp1,llm)  ! flux de masse verticale
165
166c+jld variables test conservation energie
167      REAL ecin(ip1jmp1,llm),ecin0(ip1jmp1,llm)
168C     Tendance de la temp. potentiel d (theta)/ d t due a la
169C     tansformation d'energie cinetique en energie thermique
170C     cree par la dissipation
171      REAL dtetaecdt(ip1jmp1,llm)
172      REAL vcont(ip1jm,llm),ucont(ip1jmp1,llm)
173      REAL vnat(ip1jm,llm),unat(ip1jmp1,llm)
174      REAL      d_h_vcol, d_qt, d_qw, d_ql, d_ec
175      CHARACTER*15 ztit
176!IM   INTEGER   ip_ebil_dyn  ! PRINT level for energy conserv. diag.
177!IM   SAVE      ip_ebil_dyn
178!IM   DATA      ip_ebil_dyn/0/
179c-jld
180
181      character*80 dynhist_file, dynhistave_file
182      character(len=20) :: modname
183      character*80 abort_message
184
185      logical dissip_conservative
186      save dissip_conservative
187      data dissip_conservative/.true./
188
189      INTEGER testita
190      PARAMETER (testita = 9)
191
192      logical , parameter :: flag_verif = .false.
193     
194
195      itaufin   = nday*day_step
196      itaufinp1 = itaufin +1
197      modname="leapfrog"
198     
199c INITIALISATIONS
200        dudis(:,:)   =0.
201        dvdis(:,:)   =0.
202        dtetadis(:,:)=0.
203        dutop(:,:)   =0.
204        dvtop(:,:)   =0.
205        dtetatop(:,:)=0.
206        dqtop(:,:,:) =0.
207        dptop(:)     =0.
208        dufi(:,:)   =0.
209        dvfi(:,:)   =0.
210        dtetafi(:,:)=0.
211        dqfi(:,:,:) =0.
212        dpfi(:)     =0.
213
214      itau = 0
215c      iday = day_ini+itau/day_step
216c      time = REAL(itau-(iday-day_ini)*day_step)/day_step+time_0
217c         IF(time.GT.1.) THEN
218c          time = time-1.
219c          iday = iday+1
220c         ENDIF
221
222
223c-----------------------------------------------------------------------
224c   On initialise la pression et la fonction d'Exner :
225c   --------------------------------------------------
226
227      dq=0.
228      CALL pression ( ip1jmp1, ap, bp, ps, p       )
229      CALL exner_hyb( ip1jmp1, ps, p,alpha,beta, pks, pk, pkf )
230
231c-----------------------------------------------------------------------
232c   Debut de l'integration temporelle:
233c   ----------------------------------
234
235   1  CONTINUE
236
237      jD_cur = jD_ref + day_ini - day_ref + int (itau * dtvr / daysec)
238      jH_cur = jH_ref +                                                 &
239     &          (itau * dtvr / daysec - int(itau * dtvr / daysec))
240
241
242#ifdef CPP_IOIPSL
243      if (ok_guide) then
244        call guide_main(itau,ucov,vcov,teta,q,masse,ps)
245      endif
246#endif
247
248
249c
250c     IF( MOD( itau, 10* day_step ).EQ.0 )  THEN
251c       CALL  test_period ( ucov,vcov,teta,q,p,phis )
252c       PRINT *,' ----   Test_period apres continue   OK ! -----', itau
253c     ENDIF
254c
255
256! Save fields obtained at previous time step as '...m1'
257      CALL SCOPY( ijmllm ,vcov , 1, vcovm1 , 1 )
258      CALL SCOPY( ijp1llm,ucov , 1, ucovm1 , 1 )
259      CALL SCOPY( ijp1llm,teta , 1, tetam1 , 1 )
260      CALL SCOPY( ijp1llm,masse, 1, massem1, 1 )
261      CALL SCOPY( ip1jmp1, ps  , 1,   psm1 , 1 )
262
263      forward = .TRUE.
264      leapf   = .FALSE.
265      dt      =  dtvr
266
267c   ...    P.Le Van .26/04/94  ....
268
269      CALL SCOPY   ( ijp1llm,   masse, 1, finvmaold,     1 )
270      CALL filtreg ( finvmaold ,jjp1, llm, -2,2, .TRUE., 1 )
271
272! Ehouarn: what is this for? zqmin & zqmax are not used anyway ...
273!      call minmax(ijp1llm,q(:,:,3),zqmin,zqmax)
274
275   2  CONTINUE
276
277c-----------------------------------------------------------------------
278
279c   date:
280c   -----
281
282
283c   gestion des appels de la physique et des dissipations:
284c   ------------------------------------------------------
285c
286c   ...    P.Le Van  ( 6/02/95 )  ....
287
288      apphys = .FALSE.
289      statcl = .FALSE.
290      conser = .FALSE.
291      apdiss = .FALSE.
292
293      IF( purmats ) THEN
294      ! Purely Matsuno time stepping
295         IF( MOD(itau,iconser) .EQ.0.AND.  forward    ) conser = .TRUE.
296         IF( MOD(itau,idissip ).EQ.0.AND..NOT.forward ) apdiss = .TRUE.
297         IF( MOD(itau,iphysiq ).EQ.0.AND..NOT.forward
298     s          .and. iflag_phys.EQ.1                 ) apphys = .TRUE.
299      ELSE
300      ! Leapfrog/Matsuno time stepping
301         IF( MOD(itau   ,iconser) .EQ. 0              ) conser = .TRUE.
302         IF( MOD(itau+1,idissip)  .EQ. 0              ) apdiss = .TRUE.
303         IF( MOD(itau+1,iphysiq).EQ.0.AND.iflag_phys.EQ.1) apphys=.TRUE.
304      END IF
305
306! Ehouarn: for Shallow Water case (ie: 1 vertical layer),
307!          supress dissipation step
308      if (llm.eq.1) then
309        apdiss=.false.
310      endif
311
312c-----------------------------------------------------------------------
313c   calcul des tendances dynamiques:
314c   --------------------------------
315
316! ADAPTATION GCM POUR CP(T)
317      call tpot2t(ijp1llm,teta,temp,pk)
318      tsurpk = cpp*temp/pk
319      CALL geopot  ( ip1jmp1, tsurpk  , pk , pks,  phis  , phi   )
320
321      time = jD_cur + jH_cur
322      CALL caldyn
323     $  ( itau,ucov,vcov,teta,ps,masse,pk,pkf,tsurpk,phis ,
324     $    phi,conser,du,dv,dteta,dp,w, pbaru,pbarv, time )
325
326
327c-----------------------------------------------------------------------
328c   calcul des tendances advection des traceurs (dont l'humidite)
329c   -------------------------------------------------------------
330
331      IF( forward. OR . leapf )  THEN
332
333         CALL caladvtrac(q,pbaru,pbarv,
334     *        p, masse, dq,  teta,
335     .        flxw, pk)
336         
337         IF (offline) THEN
338Cmaf stokage du flux de masse pour traceurs OFF-LINE
339
340#ifdef CPP_IOIPSL
341           CALL fluxstokenc(pbaru,pbarv,masse,teta,phi,phis,
342     .   dtvr, itau)
343#endif
344
345
346         ENDIF ! of IF (offline)
347c
348      ENDIF ! of IF( forward. OR . leapf )
349
350
351c-----------------------------------------------------------------------
352c   integrations dynamique et traceurs:
353c   ----------------------------------
354
355
356       CALL integrd ( 2,vcovm1,ucovm1,tetam1,psm1,massem1 ,
357     $         dv,du,dteta,dq,dp,vcov,ucov,teta,q,ps,masse,phis ,
358     $              finvmaold                                    )
359
360
361c .P.Le Van (26/04/94  ajout de  finvpold dans l'appel d'integrd)
362c
363c-----------------------------------------------------------------------
364c   calcul des tendances physiques:
365c   -------------------------------
366c    ########   P.Le Van ( Modif le  6/02/95 )   ###########
367c
368       IF( purmats )  THEN
369          IF( itau.EQ.itaufin.AND..NOT.forward ) lafin = .TRUE.
370       ELSE
371          IF( itau+1. EQ. itaufin )              lafin = .TRUE.
372       ENDIF
373c
374c
375       IF( apphys )  THEN
376c
377c     .......   Ajout   P.Le Van ( 17/04/96 )   ...........
378c
379
380         CALL pression (  ip1jmp1, ap, bp, ps,  p      )
381         CALL exner_hyb(  ip1jmp1, ps, p,alpha,beta,pks, pk, pkf )
382
383!           rdaym_ini  = itau * dtvr / daysec
384!           rdayvrai   = rdaym_ini  + day_ini
385           jD_cur = jD_ref + day_ini - day_ref
386     $        + int (itau * dtvr / daysec)
387           jH_cur = jH_ref +                                            &
388     &              (itau * dtvr / daysec - int(itau * dtvr / daysec))
389!         write(lunout,*)'itau, jD_cur = ', itau, jD_cur, jH_cur
390!         call ju2ymds(jD_cur+jH_cur, an, mois, jour, secondes)
391!         write(lunout,*)'current date = ',an, mois, jour, secondes
392
393c rajout debug
394c       lafin = .true.
395
396
397c   Interface avec les routines de phylmd (phymars ... )
398c   -----------------------------------------------------
399
400c+jld
401
402c  Diagnostique de conservation de l'énergie : initialisation
403         IF (ip_ebil_dyn.ge.1 ) THEN
404          ztit='bil dyn'
405! Ehouarn: be careful, diagedyn is Earth-specific (includes ../phylmd/..)!
406           IF (planet_type.eq."earth") THEN
407            CALL diagedyn(ztit,2,1,1,dtphys
408     &    , ucov    , vcov , ps, p ,pk , teta , q(:,:,1), q(:,:,2))
409           ENDIF
410         ENDIF ! of IF (ip_ebil_dyn.ge.1 )
411c-jld
412#ifdef CPP_IOIPSL
413cIM : pour sortir les param. du modele dans un fis. netcdf 110106
414         IF (first) THEN
415#include "ini_paramLMDZ_dyn.h"
416         ENDIF
417c
418#include "write_paramLMDZ_dyn.h"
419c
420#endif
421! #endif of #ifdef CPP_IOIPSL
422
423         CALL calfis( lafin , jD_cur, jH_cur,
424     $               ucov,vcov,teta,q,masse,ps,p,pk,phis,phi ,
425     $               du,dv,dteta,dq,
426     $               flxw,
427     $               clesphy0, dufi,dvfi,dtetafi,dqfi,dpfi  )
428
429c      ajout des tendances physiques:
430c      ------------------------------
431          CALL addfi( dtphys, leapf, forward   ,
432     $                  ucov, vcov, teta , q   ,ps ,
433     $                 dufi, dvfi, dtetafi , dqfi ,dpfi  )
434
435c      Couche superieure :
436c      -------------------
437         IF (ok_strato) THEN
438           CALL top_bound( vcov,ucov,teta,masse,dutop,dvtop,dtetatop)
439         ENDIF
440c dqtop=0, dptop=0
441       
442c      ajout des tendances physiques:
443c      ------------------------------
444          CALL addfi( dtphys, leapf, forward   ,
445     $                  ucov, vcov, teta , q   ,ps ,
446     $                 dutop, dvtop, dtetatop , dqtop ,dptop  )
447c
448c  Diagnostique de conservation de l'énergie : difference
449         IF (ip_ebil_dyn.ge.1 ) THEN
450          ztit='bil phys'
451          IF (planet_type.eq."earth") THEN
452           CALL diagedyn(ztit,2,1,1,dtphys
453     &     , ucov    , vcov , ps, p ,pk , teta , q(:,:,1), q(:,:,2))
454          ENDIF
455         ENDIF ! of IF (ip_ebil_dyn.ge.1 )
456
457       ENDIF ! of IF( apphys )
458
459      IF(iflag_phys.EQ.2) THEN ! "Newtonian" case
460!   Academic case : Simple friction and Newtonan relaxation
461!   -------------------------------------------------------
462        DO l=1,llm   
463          DO ij=1,ip1jmp1
464           teta(ij,l)=teta(ij,l)-dtvr*
465     &      (teta(ij,l)-tetarappel(ij,l))*(knewt_g+knewt_t(l)*clat4(ij))
466          ENDDO
467        ENDDO ! of DO l=1,llm
468          call friction(ucov,vcov,dtvr)
469       
470        ! Sponge layer (if any)
471        IF (ok_strato) THEN
472          CALL top_bound(vcov,ucov,teta,masse,dutop,dvtop,dtetatop)
473          CALL addfi( dtvr, leapf, forward   ,
474     $                  ucov, vcov, teta , q   ,ps ,
475     $                 dutop, dvtop, dtetatop , dqtop ,dptop  )
476        ENDIF ! of IF (ok_strato)
477      ENDIF ! of IF (iflag_phys.EQ.2)
478
479
480c-jld
481
482        CALL pression ( ip1jmp1, ap, bp, ps, p                  )
483        CALL exner_hyb( ip1jmp1, ps, p,alpha,beta, pks, pk, pkf )
484
485
486c-----------------------------------------------------------------------
487c   dissipation horizontale et verticale  des petites echelles:
488c   ----------------------------------------------------------
489
490      IF(apdiss) THEN
491
492
493c   calcul de l'energie cinetique avant dissipation
494        call covcont(llm,ucov,vcov,ucont,vcont)
495        call enercin(vcov,ucov,vcont,ucont,ecin0)
496
497c   dissipation
498! ADAPTATION GCM POUR CP(T)
499        call tpot2t(ijp1llm,teta,temp,pk)
500
501        CALL dissip(vcov,ucov,teta,p,dvdis,dudis,dtetadis)
502        ucov=ucov+dudis
503        vcov=vcov+dvdis
504        dudis=dudis/dtdiss   ! passage en (m/s)/s
505        dvdis=dvdis/dtdiss   ! passage en (m/s)/s
506
507c------------------------------------------------------------------------
508        if (dissip_conservative) then
509C       On rajoute la tendance due a la transform. Ec -> E therm. cree
510C       lors de la dissipation
511            call covcont(llm,ucov,vcov,ucont,vcont)
512            call enercin(vcov,ucov,vcont,ucont,ecin)
513! ADAPTATION GCM POUR CP(T)
514            do ij=1,ip1jmp1
515              do l=1,llm
516                dtec = (ecin0(ij,l)-ecin(ij,l))/cpdet(temp(ij,l))
517                temp(ij,l) = temp(ij,l) + dtec
518              enddo
519            enddo
520            call t2tpot(ijp1llm,temp,ztetaec,pk)
521            dtetaecdt=ztetaec-teta
522            dtetadis=dtetadis+dtetaecdt
523        endif
524        teta=teta+dtetadis
525        dtetadis=dtetadis/dtdiss   ! passage en K/s
526c------------------------------------------------------------------------
527
528
529c    .......        P. Le Van (  ajout  le 17/04/96  )   ...........
530c   ...      Calcul de la valeur moyenne, unique de h aux poles  .....
531c
532
533        DO l  =  1, llm
534          DO ij =  1,iim
535           tppn(ij)  = aire(  ij    ) * teta(  ij    ,l)
536           tpps(ij)  = aire(ij+ip1jm) * teta(ij+ip1jm,l)
537          ENDDO
538           tpn  = SSUM(iim,tppn,1)/apoln
539           tps  = SSUM(iim,tpps,1)/apols
540
541          DO ij = 1, iip1
542           teta(  ij    ,l) = tpn
543           teta(ij+ip1jm,l) = tps
544          ENDDO
545        ENDDO
546
547        DO ij =  1,iim
548          tppn(ij)  = aire(  ij    ) * ps (  ij    )
549          tpps(ij)  = aire(ij+ip1jm) * ps (ij+ip1jm)
550        ENDDO
551          tpn  = SSUM(iim,tppn,1)/apoln
552          tps  = SSUM(iim,tpps,1)/apols
553
554        DO ij = 1, iip1
555          ps(  ij    ) = tpn
556          ps(ij+ip1jm) = tps
557        ENDDO
558
559
560      END IF ! of IF(apdiss)
561
562c ajout debug
563c              IF( lafin ) then 
564c                abort_message = 'Simulation finished'
565c                call abort_gcm(modname,abort_message,0)
566c              ENDIF
567       
568c   ********************************************************************
569c   ********************************************************************
570c   .... fin de l'integration dynamique  et physique pour le pas itau ..
571c   ********************************************************************
572c   ********************************************************************
573
574c   preparation du pas d'integration suivant  ......
575
576      IF ( .NOT.purmats ) THEN
577c       ........................................................
578c       ..............  schema matsuno + leapfrog  ..............
579c       ........................................................
580
581            IF(forward. OR. leapf) THEN
582              itau= itau + 1
583c              iday= day_ini+itau/day_step
584c              time= REAL(itau-(iday-day_ini)*day_step)/day_step+time_0
585c                IF(time.GT.1.) THEN
586c                  time = time-1.
587c                  iday = iday+1
588c                ENDIF
589            ENDIF
590
591
592            IF( itau. EQ. itaufinp1 ) then 
593              if (flag_verif) then
594                write(79,*) 'ucov',ucov
595                write(80,*) 'vcov',vcov
596                write(81,*) 'teta',teta
597                write(82,*) 'ps',ps
598                write(83,*) 'q',q
599                WRITE(85,*) 'q1 = ',q(:,:,1)
600                WRITE(86,*) 'q3 = ',q(:,:,3)
601              endif
602
603              abort_message = 'Simulation finished'
604
605              call abort_gcm(modname,abort_message,0)
606            ENDIF
607c-----------------------------------------------------------------------
608c   ecriture du fichier histoire moyenne:
609c   -------------------------------------
610
611            IF(MOD(itau,iperiod).EQ.0 .OR. itau.EQ.itaufin) THEN
612               IF(itau.EQ.itaufin) THEN
613                  iav=1
614               ELSE
615                  iav=0
616               ENDIF
617               
618               IF (ok_dynzon) THEN
619#ifdef CPP_IOIPSL
620c les traceurs ne sont pas sortis, trop lourd.
621c Peut changer eventuellement si besoin.
622                 CALL bilan_dyn(dtvr*iperiod,dtvr*day_step*periodav,
623     &                 ps,masse,pk,pbaru,pbarv,teta,phi,ucov,vcov,
624     &                 du,dudis,duspg,dufi)
625#endif
626               END IF
627               IF (ok_dyn_ave) THEN
628#ifdef CPP_IOIPSL
629                 CALL writedynav(itau,vcov,
630     &                 ucov,teta,pk,phi,q,masse,ps,phis)
631#endif
632               ENDIF
633
634            ENDIF ! of IF((MOD(itau,iperiod).EQ.0).OR.(itau.EQ.itaufin))
635
636c-----------------------------------------------------------------------
637c   ecriture de la bande histoire:
638c   ------------------------------
639
640            IF( MOD(itau,iecri).EQ.0) THEN
641             ! Ehouarn: output only during LF or Backward Matsuno
642             if (leapf.or.(.not.leapf.and.(.not.forward))) then
643              nbetat = nbetatdem
644! ADAPTATION GCM POUR CP(T)
645              call tpot2t(ijp1llm,teta,temp,pk)
646              tsurpk = cpp*temp/pk
647              CALL geopot(ip1jmp1,tsurpk,pk,pks,phis,phi)
648              unat=0.
649              do l=1,llm
650                unat(iip2:ip1jm,l)=ucov(iip2:ip1jm,l)/cu(iip2:ip1jm)
651                vnat(:,l)=vcov(:,l)/cv(:)
652              enddo
653#ifdef CPP_IOIPSL
654              if (ok_dyn_ins) then
655!               write(lunout,*) "leapfrog: call writehist, itau=",itau
656               CALL writehist(itau,vcov,ucov,teta,phi,q,masse,ps,phis)
657!               call WriteField('ucov',reshape(ucov,(/iip1,jmp1,llm/)))
658!               call WriteField('vcov',reshape(vcov,(/iip1,jjm,llm/)))
659!              call WriteField('teta',reshape(teta,(/iip1,jmp1,llm/)))
660!               call WriteField('ps',reshape(ps,(/iip1,jmp1/)))
661!               call WriteField('masse',reshape(masse,(/iip1,jmp1,llm/)))
662              endif ! of if (ok_dyn_ins)
663#endif
664! For some Grads outputs of fields
665              if (output_grads_dyn) then
666#include "write_grads_dyn.h"
667              endif
668             endif ! of if (leapf.or.(.not.leapf.and.(.not.forward)))
669            ENDIF ! of IF(MOD(itau,iecri).EQ.0)
670
671            IF(itau.EQ.itaufin) THEN
672
673
674              if (planet_type.eq."mars") then
675! POUR MARS, METTRE UNE FONCTION A PART, genre dynredem1_mars
676                abort_message = 'dynredem1_mars A FAIRE'
677                call abort_gcm(modname,abort_message,0)
678              else
679                CALL dynredem1("restart.nc",0.0,
680     &                         vcov,ucov,teta,q,masse,ps)
681              endif ! of if (planet_type.eq."mars")
682
683              CLOSE(99)
684            ENDIF ! of IF (itau.EQ.itaufin)
685
686c-----------------------------------------------------------------------
687c   gestion de l'integration temporelle:
688c   ------------------------------------
689
690            IF( MOD(itau,iperiod).EQ.0 )    THEN
691                    GO TO 1
692            ELSE IF ( MOD(itau-1,iperiod). EQ. 0 ) THEN
693
694                   IF( forward )  THEN
695c      fin du pas forward et debut du pas backward
696
697                      forward = .FALSE.
698                        leapf = .FALSE.
699                           GO TO 2
700
701                   ELSE
702c      fin du pas backward et debut du premier pas leapfrog
703
704                        leapf =  .TRUE.
705                        dt  =  2.*dtvr
706                        GO TO 2
707                   END IF ! of IF (forward)
708            ELSE
709
710c      ......   pas leapfrog  .....
711
712                 leapf = .TRUE.
713                 dt  = 2.*dtvr
714                 GO TO 2
715            END IF ! of IF (MOD(itau,iperiod).EQ.0)
716                   !    ELSEIF (MOD(itau-1,iperiod).EQ.0)
717
718      ELSE ! of IF (.not.purmats)
719
720c       ........................................................
721c       ..............       schema  matsuno        ...............
722c       ........................................................
723            IF( forward )  THEN
724
725             itau =  itau + 1
726c             iday = day_ini+itau/day_step
727c             time = REAL(itau-(iday-day_ini)*day_step)/day_step+time_0
728c
729c                  IF(time.GT.1.) THEN
730c                   time = time-1.
731c                   iday = iday+1
732c                  ENDIF
733
734               forward =  .FALSE.
735               IF( itau. EQ. itaufinp1 ) then 
736                 abort_message = 'Simulation finished'
737                 call abort_gcm(modname,abort_message,0)
738               ENDIF
739               GO TO 2
740
741            ELSE ! of IF(forward) i.e. backward step
742
743              IF(MOD(itau,iperiod).EQ.0 .OR. itau.EQ.itaufin) THEN
744               IF(itau.EQ.itaufin) THEN
745                  iav=1
746               ELSE
747                  iav=0
748               ENDIF
749
750               IF (ok_dynzon) THEN
751#ifdef CPP_IOIPSL
752c les traceurs ne sont pas sortis, trop lourd.
753c Peut changer eventuellement si besoin.
754                 CALL bilan_dyn(dtvr*iperiod,dtvr*day_step*periodav,
755     &                 ps,masse,pk,pbaru,pbarv,teta,phi,ucov,vcov,
756     &                 du,dudis,duspg,dufi)
757#endif
758               ENDIF
759               IF (ok_dyn_ave) THEN
760#ifdef CPP_IOIPSL
761                 CALL writedynav(itau,vcov,
762     &                 ucov,teta,pk,phi,q,masse,ps,phis)
763#endif
764               ENDIF
765
766              ENDIF ! of IF(MOD(itau,iperiod).EQ.0 .OR. itau.EQ.itaufin)
767
768              IF(MOD(itau,iecri         ).EQ.0) THEN
769c              IF(MOD(itau,iecri*day_step).EQ.0) THEN
770                nbetat = nbetatdem
771! ADAPTATION GCM POUR CP(T)
772                call tpot2t(ijp1llm,teta,temp,pk)
773                tsurpk = cpp*temp/pk
774                CALL geopot(ip1jmp1,tsurpk,pk,pks,phis,phi)
775                unat=0.
776                do l=1,llm
777                  unat(iip2:ip1jm,l)=ucov(iip2:ip1jm,l)/cu(iip2:ip1jm)
778                  vnat(:,l)=vcov(:,l)/cv(:)
779                enddo
780#ifdef CPP_IOIPSL
781              if (ok_dyn_ins) then
782!                write(lunout,*) "leapfrog: call writehist (b)",
783!     &                        itau,iecri
784                CALL writehist(itau,vcov,ucov,teta,phi,q,masse,ps,phis)
785              endif ! of if (ok_dyn_ins)
786#endif
787! For some Grads outputs
788                if (output_grads_dyn) then
789#include "write_grads_dyn.h"
790                endif
791
792              ENDIF ! of IF(MOD(itau,iecri         ).EQ.0)
793
794              IF(itau.EQ.itaufin) THEN
795                if (planet_type.eq."mars") then
796! POUR MARS, METTRE UNE FONCTION A PART, genre dynredem1_mars
797                  abort_message = 'dynredem1_mars A FAIRE'
798                  call abort_gcm(modname,abort_message,0)
799                else
800                  CALL dynredem1("restart.nc",0.0,
801     &                         vcov,ucov,teta,q,masse,ps)
802                endif ! of if (planet_type.eq."mars")
803              ENDIF ! of IF(itau.EQ.itaufin)
804
805              forward = .TRUE.
806              GO TO  1
807
808            ENDIF ! of IF (forward)
809
810      END IF ! of IF(.not.purmats)
811
812      first=.false.
813
814      STOP
815      END
Note: See TracBrowser for help on using the repository browser.