source: trunk/LMDZ.GENERIC/libf/dyn3d/gcm.F @ 1422

Last change on this file since 1422 was 1422, checked in by milmd, 10 years ago

In GENERIC, MARS and COMMON models replace some include files by modules (usefull for decoupling physics with dynamics).

File size: 21.5 KB
Line 
1      PROGRAM gcm
2
3      use infotrac, only: iniadvtrac, nqtot, iadv
4      use sponge_mod,only: callsponge,mode_sponge,sponge
5      use control_mod, only: nday, day_step, iperiod, iphysiq,
6     &                       iconser, ecritphy, idissip
7!      use comgeomphy, only: initcomgeomphy
8      use filtreg_mod, only: inifilr
9      USE comvert_mod, ONLY: ap,bp
10      USE comconst_mod, ONLY: daysec,dtvr,dtphys,dtdiss,rad,g,r,cpp
11      USE logic_mod, ONLY: ecripar,forward,leapf,apphys,statcl,conser,
12     .          apdiss,purmats,physic,apphys
13      USE temps_mod, ONLY: day_ini,day_end,itaufin,dt
14      IMPLICIT NONE
15
16c      ......   Version  du 10/01/98    ..........
17
18c             avec  coordonnees  verticales hybrides
19c   avec nouveaux operat. dissipation * ( gradiv2,divgrad2,nxgraro2 )
20
21c=======================================================================
22c
23c   Auteur:  P. Le Van /L. Fairhead/F.Hourdin
24c   -------
25c
26c   Objet:
27c   ------
28c
29c   GCM LMD nouvelle grille
30c
31c=======================================================================
32c
33c  ... Dans inigeom , nouveaux calculs pour les elongations  cu , cv
34c      et possibilite d'appeler une fonction f(y)  a derivee tangente
35c      hyperbolique a la  place de la fonction a derivee sinusoidale.
36
37c  ... Possibilite de choisir le shema de Van-leer pour l'advection de
38c        q  , en faisant iadv = 3  dans   traceur  (29/04/97) .
39c
40c      Pour Van-Leer + Vapeur d'eau saturee, iadv(1)=4. (F.Codron,10/99)
41c
42c-----------------------------------------------------------------------
43c   Declarations:
44c   -------------
45
46#include "dimensions.h"
47#include "paramet.h"
48#include "comdissnew.h"
49#include "comgeom.h"
50!#include "control.h"
51#include "netcdf.inc"
52#include "tracstoke.h"
53!#include"advtrac.h"
54
55      INTEGER*4  iday ! jour julien
56      REAL       time ! Heure de la journee en fraction d''1 jour
57      REAL zdtvr
58
59c   variables dynamiques
60      REAL vcov(ip1jm,llm),ucov(ip1jmp1,llm) ! vents covariants
61      real, dimension(ip1jmp1,llm) :: teta   ! temperature potentielle
62      REAL,allocatable :: q(:,:,:)           ! champs advectes
63      REAL ps(ip1jmp1)                       ! pression  au sol
64      REAL pext(ip1jmp1)                     ! pression  extensive
65      REAL p (ip1jmp1,llmp1  )               ! pression aux interfac.des couches
66      REAL pks(ip1jmp1)                      ! exner au  sol
67      REAL pk(ip1jmp1,llm)                   ! exner au milieu des couches
68      REAL pkf(ip1jmp1,llm)                  ! exner filt.au milieu des couches
69      REAL masse(ip1jmp1,llm)                ! masse d''air
70      REAL phis(ip1jmp1)                     ! geopotentiel au sol
71      REAL phi(ip1jmp1,llm)                  ! geopotentiel
72      REAL w(ip1jmp1,llm)                    ! vitesse verticale
73
74c variables dynamiques intermediaire pour le transport
75      REAL pbaru(ip1jmp1,llm),pbarv(ip1jm,llm) !flux de masse
76
77c   variables dynamiques au pas -1
78      REAL vcovm1(ip1jm,llm),ucovm1(ip1jmp1,llm)
79
80      REAL tetam1(ip1jmp1,llm),psm1(ip1jmp1)
81      REAL massem1(ip1jmp1,llm)
82
83c   tendances dynamiques
84      REAL dv(ip1jm,llm),du(ip1jmp1,llm)
85      REAL dteta(ip1jmp1,llm),dp(ip1jmp1)
86      REAL,ALLOCATABLE :: dq(:,:,:)
87
88c   tendances de la dissipation
89      REAL dvdis(ip1jm,llm),dudis(ip1jmp1,llm)
90      REAL dhdis(ip1jmp1,llm)
91
92c   tendances physiques
93      REAL dvfi(ip1jm,llm),dufi(ip1jmp1,llm)
94      REAL dhfi(ip1jmp1,llm),dpfi(ip1jmp1)
95      REAL,ALLOCATABLE :: dqfi(:,:,:)
96
97c   variables pour le fichier histoire
98      REAL dtav      ! intervalle de temps elementaire
99
100      REAL tppn(iim),tpps(iim),tpn,tps
101c
102!      INTEGER iadv(nqmx) ! indice schema de transport pour le traceur iq
103
104      INTEGER itau,itaufinp1,iav
105
106
107      EXTERNAL caldyn, traceur
108      EXTERNAL dissip,geopot,iniconst
109      EXTERNAL integrd,SCOPY
110      EXTERNAL inigeom
111      EXTERNAL exner_hyb
112      EXTERNAL defrun_new, test_period
113      REAL  SSUM
114      REAL time_0 , finvmaold(ip1jmp1,llm)
115
116      LOGICAL lafin
117      INTEGER ij,iq,l,ierr,numvanle,iapp_tracvl
118
119      REAL rdayvrai,rdaym_ini,rday_ecri
120!      LOGICAL first
121      REAL beta(ip1jmp1,llm)
122
123      LOGICAL offline  ! Controle du stockage ds "fluxmass"
124      PARAMETER (offline=.false.)
125
126      character*20 modname
127      character*80 abort_message
128
129      LOGICAL tracer
130          data tracer/.true./
131!      INTEGER nq
132
133C Calendrier
134      LOGICAL true_calendar
135      PARAMETER (true_calendar = .false.)
136
137! flag to set/remove calls to groupeun
138      logical callgroupeun
139      parameter (callgroupeun = .false.)
140
141!     added by RDW for tests without dynamics
142      logical calldyn
143      parameter (calldyn = .true.)
144
145!     added by RW for test
146!      real pmean,airetot
147
148!     added by FF for dissipation / energy conservation tests
149      logical dissip_conservative
150      parameter (dissip_conservative = .false.)
151      REAL ecin(ip1jmp1,llm),ecin0(ip1jmp1,llm)
152!     d (theta)/ d t (pot. temperature) due to the creation
153!     of thermal energy by dissipation
154      REAL dtetaecdt(ip1jmp1,llm)
155      REAL vcont(ip1jm,llm),ucont(ip1jmp1,llm)
156      REAL vnat(ip1jm,llm),unat(ip1jmp1,llm)
157
158c-----------------------------------------------------------------------
159c    variables pour l'initialisation de la physique :
160c    ------------------------------------------------
161!      INTEGER ngridmx
162!      PARAMETER( ngridmx = 2+(jjm-1)*iim - 1/jjm   )
163!      REAL zcufi(ngridmx),zcvfi(ngridmx)
164!      REAL latfi(ngridmx),lonfi(ngridmx)
165!      REAL airefi(ngridmx)
166!      SAVE latfi, lonfi, airefi
167!      INTEGER i,j
168
169c-----------------------------------------------------------------------
170c   Initialisations:
171c   ----------------
172
173      modname = 'gcm'
174      lafin    = .FALSE.
175
176c-----------------------------------------------------------------------
177      CALL defrun_new( 99, .TRUE. )
178
179!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
180! FH 2008/05/02
181! A nettoyer. On ne veut qu'une ou deux routines d'interface
182! dynamique -> physique pour l'initialisation
183!#ifdef CPP_PHYS
184      CALL init_phys_lmdz(iim,jjp1,llm,1,(/(jjm-1)*iim+2/))
185!      call initcomgeomphy ! now done in iniphysiq
186!#endif
187!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
188
189! Initialize tracers
190      CALL iniadvtrac(nqtot,numvanle)
191! Allocation de la tableau q : champs advectes   
192      allocate(q(ip1jmp1,llm,nqtot))
193      allocate(dq(ip1jmp1,llm,nqtot))
194      allocate(dqfi(ip1jmp1,llm,nqtot))
195
196      CALL dynetat0("start.nc",vcov,ucov,
197     .              teta,q,masse,ps,phis, time_0)
198
199c  on recalcule eventuellement le pas de temps
200
201      IF(MOD(day_step,iperiod).NE.0)
202     * STOP'Il faut choisir un nb de pas par jour multiple de iperiod'
203
204      IF(MOD(day_step,iphysiq).NE.0)
205     * STOP'Il faut choisir un nb de pas par jour multiple de iphysiq'
206
207      zdtvr    = daysec/FLOAT(day_step)
208
209        IF(dtvr.NE.zdtvr) THEN
210         PRINT*,'WARNING!!! changement de pas de temps',dtvr,'>',zdtvr
211        ENDIF
212
213c  nombre d'etats dans les fichiers demarrage et histoire
214
215      dtvr = zdtvr
216      CALL iniconst
217      CALL inigeom
218      CALL inifilr
219
220c
221c   ......    P.Le Van    ( modif  le 29/04/97 )   ......... 
222c
223
224      CALL inidissip ( lstardis, nitergdiv, nitergrot, niterh   ,
225     *                tetagdiv, tetagrot , tetatemp              )
226c
227
228c-----------------------------------------------------------------------
229c   Initialisation de la physique :
230c   -------------------------------
231
232!      IF (call_iniphys.and.(iflag_phys==1.or.iflag_phys>=100)) THEN
233!         latfi(1)=rlatu(1)
234!         lonfi(1)=0.
235!         zcufi(1) = cu(1)
236!         zcvfi(1) = cv(1)
237!         DO j=2,jjm
238!            DO i=1,iim
239!               latfi((j-2)*iim+1+i)= rlatu(j)
240!               lonfi((j-2)*iim+1+i)= rlonv(i)
241!               zcufi((j-2)*iim+1+i) = cu((j-1)*iip1+i)
242!               zcvfi((j-2)*iim+1+i) = cv((j-1)*iip1+i)
243!            ENDDO
244!         ENDDO
245!         latfi(ngridmx)= rlatu(jjp1)
246!         lonfi(ngridmx)= 0.
247!         zcufi(ngridmx) = cu(ip1jm+1)
248!         zcvfi(ngridmx) = cv(ip1jm-iim)
249!
250!         ! build airefi(), mesh area on physics grid
251!         CALL gr_dyn_fi(1,iip1,jjp1,ngridmx,aire,airefi)
252!         ! Poles are single points on physics grid
253!         airefi(1)=airefi(1)*iim
254!         airefi(ngridmx)=airefi(ngridmx)*iim
255
256! Initialisation de la physique: pose probleme quand on tourne
257! SANS physique, car iniphysiq.F est dans le repertoire phy[]...
258! Il faut une cle CPP_PHYS
259!#ifdef CPP_PHYS
260!         CALL iniphysiq(iim,jjm,llm,daysec,day_ini,dtphys/nsplit_phys,
261         CALL iniphysiq(iim,jjm,llm,daysec,day_ini,dtphys,
262     &                rlatu,rlonv,aire,cu,cv,rad,g,r,cpp,
263     &                1)
264!     &                iflag_phys)
265!#endif
266!         call_iniphys=.false.
267!      ENDIF ! of IF (call_iniphys.and.(iflag_phys.eq.1))
268
269      CALL pression ( ip1jmp1, ap, bp, ps, p       )
270
271      call dump2d(iip1,jjp1,ps,'PRESSION SURFACE')
272      CALL exner_hyb( ip1jmp1, ps, p,beta, pks, pk, pkf )
273
274
275c  numero de stockage pour les fichiers de redemarrage:
276
277c-----------------------------------------------------------------------
278c   temps de depart et de fin:
279c   --------------------------
280
281      itau = 0
282      iday = day_ini+itau/day_step
283      time = FLOAT(itau-(iday-day_ini)*day_step)/day_step+time_0
284
285
286         IF(time.GT.1.) THEN
287          time = time-1.
288          iday = iday+1
289         ENDIF
290      itaufin   = nday*day_step
291c ********************************
292c      itaufin = 120   ! temporaire !!
293c ********************************
294      itaufinp1 = itaufin +1
295
296      day_end = day_ini + nday
297      PRINT 300, itau,itaufin,day_ini,day_end
298 300  FORMAT('1'/,15x,'run du pas',i7,2x,'au pas',i7,2x, 
299     . 'c''est a dire du jour',i7,3x,'au jour',i7//)
300
301      CALL dynredem0("restart.nc",day_end,phis)
302
303      ecripar = .TRUE.
304
305      dtav = iperiod*dtvr/daysec
306
307
308c   Quelques initialisations pour les traceurs
309      call initial0(ijp1llm*nqtot,dq)
310c     istdyn=day_step/4     ! stockage toutes les 6h=1jour/4
311c     istphy=istdyn/iphysiq
312
313      write(*,*) "gcm: callgroupeun set to:",callgroupeun
314c-----------------------------------------------------------------------
315c   Debut de l'integration temporelle:
316c   ----------------------------------
317
318   1  CONTINUE
319c
320      IF( MOD( itau, 10* day_step ).EQ.0 )  THEN
321        CALL test_period ( ucov,vcov,teta,q,p,phis )
322        PRINT *,' ----   Test_period apres continue   OK ! -----', itau
323      ENDIF
324
325      if (callgroupeun) then
326        call groupeun(jjp1,llm,ucov,.true.)
327        call groupeun(jjm,llm,vcov,.true.)
328        call groupeun(jjp1,llm,teta,.true.)
329        call groupeun(jjp1,llm,masse,.true.)
330        call groupeun(jjp1,1,ps,.false.)
331      endif
332
333      CALL SCOPY( ijmllm ,vcov , 1, vcovm1 , 1 )
334      CALL SCOPY( ijp1llm,ucov , 1, ucovm1 , 1 )
335      CALL SCOPY( ijp1llm,teta , 1, tetam1 , 1 )
336      CALL SCOPY( ijp1llm,masse, 1, massem1, 1 )
337      CALL SCOPY( ip1jmp1, ps  , 1,   psm1 , 1 )
338
339      forward = .TRUE.
340      leapf   = .FALSE.
341      dt      =  dtvr
342
343c   ...    P.Le Van .26/04/94  ....
344
345      CALL SCOPY   ( ijp1llm,   masse, 1, finvmaold,     1 )
346      CALL filtreg ( finvmaold ,jjp1, llm, -2,2, .TRUE., 1 )
347
348
349   2  CONTINUE
350
351c-----------------------------------------------------------------------
352
353c   date:
354c   -----
355
356!      write(*,*) 'GCM: itau=',itau
357
358c   gestion des appels de la physique et des dissipations:
359c   ------------------------------------------------------
360c
361c   ...    P.Le Van  ( 6/02/95 )  ....
362
363      apphys = .FALSE.
364      statcl = .FALSE.
365      conser = .FALSE.
366      apdiss = .FALSE.
367
368      IF( purmats ) THEN
369         IF( MOD(itau,iconser) .EQ.0.AND.  forward    ) conser = .TRUE.
370         IF( MOD(itau,idissip ).EQ.0.AND..NOT.forward ) apdiss = .TRUE.
371         IF( MOD(itau,iphysiq ).EQ.0.AND..NOT.forward
372     $                              .AND.   physic    ) apphys = .TRUE.
373      ELSE
374         IF( MOD(itau   ,iconser) .EQ. 0              ) conser = .TRUE.
375         IF( MOD(itau+1,idissip)  .EQ. 0              ) apdiss = .TRUE.
376         IF( MOD(itau+1,iphysiq).EQ.0. AND. physic    ) apphys = .TRUE.
377      END IF
378
379c-----------------------------------------------------------------------
380c   calcul des tendances dynamiques:
381c   --------------------------------
382
383      CALL geopot  ( ip1jmp1, teta  , pk , pks,  phis  , phi   )
384
385      if(calldyn)then
386         CALL caldyn
387     $        ( itau,ucov,vcov,teta,ps,masse,pk,pkf,phis ,
388     $        phi,conser,du,dv,dteta,dp,w,pbaru,pbarv,time+iday-day_ini)
389      endif
390
391c-----------------------------------------------------------------------
392c   calcul des tendances advection des traceurs (dont l'humidite)
393c   -------------------------------------------------------------
394
395
396
397      if (tracer) then
398       IF( forward. OR . leapf )  THEN
399
400        DO iq = 1, nqtot
401c
402         IF ( iadv(iq).EQ.1.OR.iadv(iq).EQ.2 )  THEN
403            CALL traceur( iq,iadv,q,teta,pk,w, pbaru, pbarv, dq )
404
405         ELSE IF( iq.EQ. nqtot )   THEN
406c
407            iapp_tracvl = 5
408c
409cccc     iapp_tracvl est la frequence en pas du groupement des flux
410cccc      de masse pour  Van-Leer dans la routine  tracvl  .
411c
412
413            CALL vanleer(numvanle,iapp_tracvl,nqtot,q,pbaru,pbarv,
414     *                      p, masse, dq,  iadv(1), teta, pk     )
415
416c
417c                   ...  Modif  F.Codron  ....
418c
419         ENDIF
420c
421        ENDDO
422C
423c        IF (offline) THEN
424C maf stokage du flux de masse pour traceurs OFF-LINE
425
426c           CALL fluxstokenc(pbaru,pbarv,masse,teta,phi,phis,
427c    .   time_step, itau)
428
429c        ENDIF
430c
431      ENDIF
432          END IF   ! tracer
433
434
435c-----------------------------------------------------------------------
436c   integrations dynamique et traceurs:
437c   ----------------------------------
438
439          if(calldyn)then
440             CALL integrd(2,vcovm1,ucovm1,tetam1,psm1,massem1,
441     $            dv,du,dteta,dq,dp,vcov,ucov,teta,q,ps,masse,phis,
442     $            finvmaold)
443          else
444             print*,'Currently no dynamics in this GCM...'
445          endif
446
447
448
449
450
451c .P.Le Van (26/04/94  ajout de  finvpold dans l'appel d'integrd)
452c
453c-----------------------------------------------------------------------
454c   calcul des tendances physiques:
455c   -------------------------------
456c    ########   P.Le Van ( Modif le  6/02/95 )   ###########
457c
458       IF( purmats )  THEN
459          IF( itau.EQ.itaufin.AND..NOT.forward ) lafin = .TRUE.
460       ELSE
461          IF( itau+1. EQ. itaufin )              lafin = .TRUE.
462       ENDIF
463c
464c
465       IF( apphys )  THEN
466c
467c     .......   Ajout   P.Le Van ( 17/04/96 )   ...........
468c
469
470         CALL pression (  ip1jmp1, ap, bp, ps,  p      )
471         CALL exner_hyb(  ip1jmp1, ps, p,beta,pks, pk, pkf )
472
473           rdaym_ini  = itau * dtvr / daysec
474           rdayvrai   = rdaym_ini  + day_ini
475
476           IF ( ecritphy.LT.1. )  THEN
477             rday_ecri = rdaym_ini
478           ELSE
479             rday_ecri = INT(rdaym_ini)+INT(day_ini)
480           ENDIF
481c
482
483
484
485        CALL calfis( nqtot, lafin ,rdayvrai,rday_ecri,time  ,
486     $                 ucov,vcov,teta,q,masse,ps,p,pk,phis,phi ,
487     $     du,dv,dteta,dq,w, dufi,dvfi,dhfi,dqfi,dpfi,tracer)
488
489
490c      ajout des tendances physiques:
491c      ------------------------------
492!        if(1.eq.2)then
493          CALL addfi( nqtot, dtphys, leapf, forward   ,
494     $                  ucov, vcov, teta , q   ,ps , masse,
495     $                 dufi, dvfi, dhfi , dqfi ,dpfi  )
496!       else
497!          print*,'Currently no physics in this GCM...'
498!       endif
499c
500       ENDIF
501
502       CALL pression ( ip1jmp1, ap, bp, ps, p                  )
503
504       CALL exner_hyb( ip1jmp1, ps, p,beta, pks, pk, pkf )
505c   ----------------------------------------------------------
506
507c
508c
509c   dissipation horizontale et verticale  des petites echelles:
510c   ----------------------------------------------------------
511
512      IF(apdiss) THEN
513
514c        Sponge layer
515c        ~~~~~~~~~~~~
516
517         IF (callsponge) THEN
518           pext(1:ip1jmp1)=ps(1:ip1jmp1)*aire(1:ip1jmp1)
519           CALL sponge(ucov,vcov,teta,pext,dtdiss,mode_sponge)
520         ENDIF
521
522c        Dissipation horizontale
523c        ~~~~~~~~~~~~~~~~~~~~~~~
524
525
526         if(dissip_conservative) then
527!     calculate kinetic energy before dissipation
528            call covcont(llm,ucov,vcov,ucont,vcont)
529            call enercin(vcov,ucov,vcont,ucont,ecin0)
530         end if
531
532         CALL dissip(vcov,ucov,teta,p,dvdis,dudis,dhdis)
533
534         ucov(:,:)=ucov(:,:)+dudis(:,:)
535         vcov(:,:)=vcov(:,:)+dvdis(:,:)
536
537
538         if (dissip_conservative) then
539C           On rajoute la tendance due a la transform. Ec -> E therm. cree
540C           lors de la dissipation
541            call covcont(llm,ucov,vcov,ucont,vcont)
542            call enercin(vcov,ucov,vcont,ucont,ecin)
543            dtetaecdt(:,:) = (ecin0(:,:)-ecin(:,:))/ pk(:,:)
544            dhdis(:,:)     = dhdis(:,:) + dtetaecdt(:,:)
545         endif
546
547         teta(:,:)=teta(:,:)+dhdis(:,:)
548
549
550c    .......        P. Le Van (  ajout  le 17/04/96  )   ...........
551c   ...      Calcul de la valeur moyenne, unique de h aux poles  .....
552c
553
554        DO l  =  1, llm
555          DO ij =  1,iim
556           tppn(ij)  = aire(  ij    ) * teta(  ij    ,l)
557           tpps(ij)  = aire(ij+ip1jm) * teta(ij+ip1jm,l)
558          ENDDO
559
560           tpn  = SSUM(iim,tppn,1)/apoln
561           tps  = SSUM(iim,tpps,1)/apols
562
563          DO ij = 1, iip1
564           teta(  ij    ,l) = tpn
565           teta(ij+ip1jm,l) = tps
566          ENDDO
567        ENDDO
568
569        DO ij =  1,iim
570          tppn(ij)  = aire(  ij    ) * ps (  ij    )
571          tpps(ij)  = aire(ij+ip1jm) * ps (ij+ip1jm)
572        ENDDO
573          tpn  = SSUM(iim,tppn,1)/apoln
574
575          tps  = SSUM(iim,tpps,1)/apols
576
577        DO ij = 1, iip1
578          ps(  ij    ) = tpn
579          ps(ij+ip1jm) = tps
580        ENDDO
581
582
583
584
585
586
587
588      END IF
589       
590c   ********************************************************************
591c   ********************************************************************
592c   .... fin de l'integration dynamique  et physique pour le pas itau ..
593c   ********************************************************************
594c   ********************************************************************
595
596c   preparation du pas d'integration suivant  ......
597
598      IF ( .NOT.purmats ) THEN
599c       ........................................................
600c       ..............  schema matsuno + leapfrog  ..............
601c       ........................................................
602
603            IF(forward. OR. leapf) THEN
604              itau= itau + 1
605              iday= day_ini+itau/day_step
606              time= FLOAT(itau-(iday-day_ini)*day_step)/day_step+time_0
607                IF(time.GT.1.) THEN
608                  time = time-1.
609                  iday = iday+1
610                ENDIF
611            ENDIF
612
613
614            IF( itau. EQ. itaufinp1 ) then 
615              abort_message = 'Simulation finished'
616              call abort_gcm(modname,abort_message,0)
617            ENDIF
618c-----------------------------------------------------------------------
619c   ecriture du fichier histoire moyenne:
620c   -------------------------------------
621
622c           IF(MOD(itau,iperiod).EQ.0 .OR. itau.EQ.itaufin) THEN
623c              IF(itau.EQ.itaufin) THEN
624c                 iav=1
625c              ELSE
626c                 iav=0
627c              ENDIF
628c              CALL writedynav(histaveid, nqtot, itau,vcov ,
629c    ,                          ucov,teta,pk,phi,q,masse,ps,phis)
630c           ENDIF
631
632c-----------------------------------------------------------------------
633
634
635            IF(itau.EQ.itaufin) THEN
636
637
638       PRINT *,' Appel test_period avant redem ', itau
639       CALL test_period ( ucov,vcov,teta,q,p,phis )
640       CALL dynredem1("restart.nc",0.0,
641     .                     vcov,ucov,teta,q,masse,ps)
642
643              CLOSE(99)
644            ENDIF
645
646c-----------------------------------------------------------------------
647c   gestion de l'integration temporelle:
648c   ------------------------------------
649
650            IF( MOD(itau,iperiod).EQ.0 )    THEN
651                    GO TO 1
652            ELSE IF ( MOD(itau-1,iperiod). EQ. 0 ) THEN
653
654                   IF( forward )  THEN
655c      fin du pas forward et debut du pas backward
656
657                      forward = .FALSE.
658                        leapf = .FALSE.
659                           GO TO 2
660
661                   ELSE
662c      fin du pas backward et debut du premier pas leapfrog
663
664                        leapf =  .TRUE.
665                        dt  =  2.*dtvr
666                        GO TO 2
667                   END IF
668            ELSE
669
670c      ......   pas leapfrog  .....
671
672                 leapf = .TRUE.
673                 dt  = 2.*dtvr
674                 GO TO 2
675            END IF
676
677      ELSE
678
679c       ........................................................
680c       ..............       schema  matsuno        ...............
681c       ........................................................
682            IF( forward )  THEN
683
684             itau =  itau + 1
685             iday = day_ini+itau/day_step
686             time = FLOAT(itau-(iday-day_ini)*day_step)/day_step+time_0
687
688                  IF(time.GT.1.) THEN
689                   time = time-1.
690                   iday = iday+1
691                  ENDIF
692
693               forward =  .FALSE.
694               IF( itau. EQ. itaufinp1 ) then 
695                 abort_message = 'Simulation finished'
696                 call abort_gcm(modname,abort_message,0)
697               ENDIF
698               GO TO 2
699
700            ELSE
701
702            IF(MOD(itau,iperiod).EQ.0 .OR. itau.EQ.itaufin) THEN
703               IF(itau.EQ.itaufin) THEN
704                  iav=1
705               ELSE
706                  iav=0
707               ENDIF
708c              CALL writedynav(histaveid, nqtot, itau,vcov ,
709c    ,                          ucov,teta,pk,phi,q,masse,ps,phis)
710
711            ENDIF
712
713
714                 IF(itau.EQ.itaufin)
715     . CALL dynredem1("restart.nc",0.0,
716     .                     vcov,ucov,teta,q,nqtot,masse,ps)
717
718                 forward = .TRUE.
719                 GO TO  1
720
721
722            ENDIF
723
724      END IF
725
726      STOP
727      END
Note: See TracBrowser for help on using the repository browser.