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

Last change on this file since 1242 was 1189, checked in by emillour, 11 years ago

Common dynamics: a couple of bug fixes:

  • Correctly account for the change in pressure, mass, etc. after modifying surface pressure following a call to the physics.
  • Corrected tracer advection, which is computed using values at the beginning of the time step, so it is done at Matsuno forward step.

EM

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