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

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

Sebastien Lebonnois: sponge layer et dissip horizontale.

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