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

Last change on this file since 5 was 5, checked in by slebonnois, 14 years ago
  • Ajout des fichiers .def Venus et Titan (tels qu'ils sont utilisés

actuellement) dans les deftanks.

  • Ajout d'une doc sur Cp(T).
  • Modifications dans dyn3d concernant Cp(T), cf le log (v5) dans chantiers
  • Premières modifs de l'appel à la physique dans dyn3d/calfis, cf log (v5)
  • Elimination des cpdet.* dans phytitan et phyvenus (remplacés par cpdet.F

dans dyn3d).

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