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

Last change on this file since 37 was 37, checked in by emillour, 14 years ago

Remise en route chantier compilation -- Ehouarn

  • Modifs et corrections pour pouvoir compiler le gcm (en séentiel, avec

makelmdz_fcm pour l'instant):

  • ajout de fichiers 'arch' pour linux-64 (pour Bellonzi, avec ioipsl et en r8)
  • modification de makelmdz_fcm, ajout de la cléPP_PHYS si on compile avec une physique
  • correction de quelques typos/bugs réléàa compilation:
  • infotrac.F90 : supression des appels àlnblnk' (remplacépar len_trim)
  • bilan_dyn.F : déaration des variables znom3,znom3l,zunites3, planet_type
  • cpdet.F : "use control_mod, ONLY: planet_type" mis aux bons endroits

(idem sur cpdet.F dans dyn3dpar)

  • leapfrog.F : declaration de ztetaec(), dtec, cpdet , itau_w, duspg()
  • diagedyn.F : correction typo; attention dans diagedyn.F il y a du

include "../phylmd/YOMCST.h"
Ca va poser problè qd on change de physique....

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