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

Last change on this file since 1702 was 1702, checked in by slebonnois, 8 years ago

SL: petit correctif sur makelmdz

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