source: trunk/LMDZ.COMMON/libf/dyn3d/leapfrog.F @ 781

Last change on this file since 781 was 776, checked in by emillour, 12 years ago

Common dynamics: updates to keep up with LMDZ5 Earth (rev 1649)
See file "DOC/chantiers/commit_importants.log" for details.
EM

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