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

Last change on this file since 1549 was 1549, checked in by emillour, 9 years ago

All GCMs:
Further adaptations to keep up with changes in LMDZ5 concerning
physics/dynamics separation (up to rev r2420 of LMDZ5)

  • all physics packages:
  • added module callphysiq_mod.F90 in dynphy_lonlat/phy* which contains the routine "call_physiq" which is called by calfis* and calls the physics. This way different "physiq" routine from different physics packages may be called: The calfis* routines now exposes all available fields that might be transmitted to physiq but which is actually send (ie: expected/needed by physiq) is decided in call_physiq.
  • turned "physiq.F[90]" into module "physiq_mod.F[90]" for better control of "physiq" arguments. for phyvenus/phytitan, extracted gr_fi_ecrit from physiq.F as gr_fi_ecrit.F90 (note that it can only work in serial).
  • misc:
  • updated wxios.F90 to keep up with LMDZ5 modifications.
  • dyn3d_common:
  • infotrac.F90 keep up with LMDZ5 modifications (cosmetics)
  • dyn3d:
  • gcm.F90: cosmetic cleanup.
  • leapfrog.F90: fix computation of date as function of itau.
  • dyn3dpar:
  • gcm.F: cosmetic cleanup.
  • leapfrog_p.F90: fix computation of date as function of itau.

NB: physics are given the date corresponding to the end of the
physics step.

  • dynphy_lonlat:
  • calfis.F : added computation of relative wind vorticity.
  • calfis_p.F: added computation of relative wind vorticity (input required by Earth physics)

EM

File size: 32.7 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
214c dummy: sinon cette routine n'est jamais compilee...
215      if(1.eq.0) then
216#ifdef CPP_PHYS
217        CALL init_phys_lmdz(iim,jjp1,llm,1,(/(jjm-1)*iim+2/))
218#endif
219      endif
220
221      if (nday>=0) then
222         itaufin   = nday*day_step
223      else
224         ! to run a given (-nday) number of dynamical steps
225         itaufin   = -nday
226      endif
227      if (less1day) then
228c MODIF VENUS: to run less than one day:
229        itaufin   = int(fractday*day_step)
230      endif
231      if (ndynstep.gt.0) then
232        ! running a given number of dynamical steps
233        itaufin=ndynstep
234      endif
235      itaufinp1 = itaufin +1
236     
237c INITIALISATIONS
238        dudis(:,:)   =0.
239        dvdis(:,:)   =0.
240        dtetadis(:,:)=0.
241        dutop(:,:)   =0.
242c        dvtop(:,:)   =0.
243c        dtetatop(:,:)=0.
244c        dqtop(:,:,:) =0.
245c        dptop(:)     =0.
246        dufi(:,:)   =0.
247        dvfi(:,:)   =0.
248        dtetafi(:,:)=0.
249        dqfi(:,:,:) =0.
250        dpfi(:)     =0.
251
252      itau = 0
253      physics=.true.
254      if (iflag_phys==0.or.iflag_phys==2) physics=.false.
255
256c      iday = day_ini+itau/day_step
257c      time = REAL(itau-(iday-day_ini)*day_step)/day_step+time_0
258c         IF(time.GT.1.) THEN
259c          time = time-1.
260c          iday = iday+1
261c         ENDIF
262
263
264c-----------------------------------------------------------------------
265c   On initialise la pression et la fonction d'Exner :
266c   --------------------------------------------------
267
268      dq(:,:,:)=0.
269      CALL pression ( ip1jmp1, ap, bp, ps, p       )
270      if (pressure_exner) then
271        CALL exner_hyb( ip1jmp1, ps, p, pks, pk, pkf )
272      else
273        CALL exner_milieu( ip1jmp1, ps, p, pks, pk, pkf )
274      endif
275
276c------------------
277c TEST PK MONOTONE
278c------------------
279      write(*,*) "Test PK"
280      do ij=1,ip1jmp1
281        do l=2,llm
282          if(pk(ij,l).gt.pk(ij,l-1)) then
283c           write(*,*) ij,l,pk(ij,l)
284            abort_message = 'PK non strictement decroissante'
285            call abort_gcm(modname,abort_message,1)
286c           write(*,*) "ATTENTION, Test PK deconnecté..."
287          endif
288        enddo
289      enddo
290      write(*,*) "Fin Test PK"
291c     stop
292c------------------
293
294c-----------------------------------------------------------------------
295c   Debut de l'integration temporelle:
296c   ----------------------------------
297
298   1  CONTINUE ! Matsuno Forward step begins here
299
300c   date: (NB: date remains unchanged for Backward step)
301c   -----
302
303      jD_cur = jD_ref + day_ini - day_ref +                             &
304     &          (itau+1)/day_step
305      jH_cur = jH_ref + start_time +                                    &
306     &          mod(itau+1,day_step)/float(day_step)
307      jD_cur = jD_cur + int(jH_cur)
308      jH_cur = jH_cur - int(jH_cur)
309
310        if (ok_iso_verif) then
311           call check_isotopes_seq(q,ip1jmp1,'leapfrog 321')
312        endif !if (ok_iso_verif) then
313
314#ifdef CPP_IOIPSL
315      IF (planet_type.eq."earth") THEN
316      if (ok_guide) then
317        call guide_main(itau,ucov,vcov,teta,q,masse,ps)
318      endif
319      ENDIF
320#endif
321
322
323c
324c     IF( MOD( itau, 10* day_step ).EQ.0 )  THEN
325c       CALL  test_period ( ucov,vcov,teta,q,p,phis )
326c       PRINT *,' ----   Test_period apres continue   OK ! -----', itau
327c     ENDIF
328c
329
330! Save fields obtained at previous time step as '...m1'
331      CALL SCOPY( ijmllm ,vcov , 1, vcovm1 , 1 )
332      CALL SCOPY( ijp1llm,ucov , 1, ucovm1 , 1 )
333      CALL SCOPY( ijp1llm,teta , 1, tetam1 , 1 )
334      CALL SCOPY( ijp1llm,masse, 1, massem1, 1 )
335      CALL SCOPY( ip1jmp1, ps  , 1,   psm1 , 1 )
336
337      forward = .TRUE.
338      leapf   = .FALSE.
339      dt      =  dtvr
340
341c   ...    P.Le Van .26/04/94  ....
342! Ehouarn: finvmaold is actually not used
343!      CALL SCOPY   ( ijp1llm,   masse, 1, finvmaold,     1 )
344!      CALL filtreg ( finvmaold ,jjp1, llm, -2,2, .TRUE., 1 )
345
346        if (ok_iso_verif) then
347           call check_isotopes_seq(q,ip1jmp1,'leapfrog 400')
348        endif !if (ok_iso_verif) then
349
350   2  CONTINUE ! Matsuno backward or leapfrog step begins here
351
352c-----------------------------------------------------------------------
353
354c   date: (NB: only leapfrog step requires recomputing date)
355c   -----
356
357      IF (leapf) THEN
358        jD_cur = jD_ref + day_ini - day_ref +
359     &            (itau+1)/day_step
360        jH_cur = jH_ref + start_time +
361     &            mod(itau+1,day_step)/float(day_step)
362        jD_cur = jD_cur + int(jH_cur)
363        jH_cur = jH_cur - int(jH_cur)
364      ENDIF
365
366
367c   gestion des appels de la physique et des dissipations:
368c   ------------------------------------------------------
369c
370c   ...    P.Le Van  ( 6/02/95 )  ....
371
372      apphys = .FALSE.
373      statcl = .FALSE.
374      conser = .FALSE.
375      apdiss = .FALSE.
376
377      IF( purmats ) THEN
378      ! Purely Matsuno time stepping
379         IF( MOD(itau,iconser) .EQ.0.AND.  forward    ) conser = .TRUE.
380         IF( MOD(itau,dissip_period ).EQ.0.AND..NOT.forward )
381     s        apdiss = .TRUE.
382         IF( MOD(itau,iphysiq ).EQ.0.AND..NOT.forward
383     s          .and. physics                        ) apphys = .TRUE.
384      ELSE
385      ! Leapfrog/Matsuno time stepping
386         IF( MOD(itau   ,iconser) .EQ. 0              ) conser = .TRUE.
387         IF( MOD(itau+1,dissip_period).EQ.0 .AND. .NOT. forward )
388     s        apdiss = .TRUE.
389         IF( MOD(itau+1,iphysiq).EQ.0.AND.physics       ) apphys=.TRUE.
390      END IF
391
392! Ehouarn: for Shallow Water case (ie: 1 vertical layer),
393!          supress dissipation step
394      if (llm.eq.1) then
395        apdiss=.false.
396      endif
397
398#ifdef NODYN
399      apdiss=.false.
400#endif
401
402        if (ok_iso_verif) then
403           call check_isotopes_seq(q,ip1jmp1,'leapfrog 589')
404        endif !if (ok_iso_verif) then
405
406c-----------------------------------------------------------------------
407c   calcul des tendances dynamiques:
408c   --------------------------------
409
410! ADAPTATION GCM POUR CP(T)
411      call tpot2t(ijp1llm,teta,temp,pk)
412      tsurpk = cpp*temp/pk
413      ! compute geopotential phi()
414      CALL geopot  ( ip1jmp1, tsurpk  , pk , pks,  phis  , phi   )
415
416           rdaym_ini  = itau * dtvr / daysec
417
418      time = jD_cur + jH_cur
419
420#ifdef NODYN
421      dv(:,:) = 0.D+0
422      du(:,:) = 0.D+0
423      dteta(:,:) = 0.D+0
424      dq(:,:,:) = 0.D+0
425      dp(:) = 0.D+0
426#else
427      CALL caldyn
428     $  ( itau,ucov,vcov,teta,ps,masse,pk,pkf,tsurpk,phis ,
429     $    phi,conser,du,dv,dteta,dp,w, pbaru,pbarv, time )
430
431      ! Simple zonal wind nudging for generic planetary model
432      ! AS 09/2013
433      ! ---------------------------------------------------
434      if (planet_type.eq."generic") then
435       if (ok_guide) then
436         du(:,:) = du(:,:) + ((uforc(:,:)-ucov(:,:)) / facwind)
437       endif
438      endif
439
440c-----------------------------------------------------------------------
441c   calcul des tendances advection des traceurs (dont l'humidite)
442c   -------------------------------------------------------------
443
444        if (ok_iso_verif) then
445           call check_isotopes_seq(q,ip1jmp1,
446     &           'leapfrog 686: avant caladvtrac')
447        endif !if (ok_iso_verif) then
448
449      IF( forward. OR . leapf )  THEN
450! Ehouarn: NB: fields sent to advtrac are those at the beginning of the time step
451         CALL caladvtrac(q,pbaru,pbarv,
452     *        p, masse, dq,  teta,
453     .        flxw, pk)
454         
455         IF (offline) THEN
456Cmaf stokage du flux de masse pour traceurs OFF-LINE
457
458#ifdef CPP_IOIPSL
459           CALL fluxstokenc(pbaru,pbarv,masse,teta,phi,phis,
460     .   dtvr, itau)
461#endif
462
463
464         ENDIF ! of IF (offline)
465c
466      ENDIF ! of IF( forward. OR . leapf )
467
468
469c-----------------------------------------------------------------------
470c   integrations dynamique et traceurs:
471c   ----------------------------------
472
473        if (ok_iso_verif) then
474           write(*,*) 'leapfrog 720'
475           call check_isotopes_seq(q,ip1jmp1,'leapfrog 756')
476        endif !if (ok_iso_verif) then
477       
478       CALL integrd ( nqtot,vcovm1,ucovm1,tetam1,psm1,massem1 ,
479     $         dv,du,dteta,dq,dp,vcov,ucov,teta,q,ps,masse,phis )
480!     $              finvmaold                                    )
481
482       if (ok_iso_verif) then
483          write(*,*) 'leapfrog 724'
484           call check_isotopes_seq(q,ip1jmp1,'leapfrog 762')
485        endif !if (ok_iso_verif) then
486
487       IF ((planet_type.eq."titan").and.(tidal)) then
488c-----------------------------------------------------------------------
489c   Marées gravitationnelles causées par Saturne
490c   B. Charnay (28/10/2010)
491c   ----------------------------------------------------------
492            CALL tidal_forces(rdaym_ini, dutidal, dvtidal)
493            ucov=ucov+dutidal*dt
494            vcov=vcov+dvtidal*dt
495       ENDIF
496
497! NODYN precompiling flag
498#endif
499
500c .P.Le Van (26/04/94  ajout de  finvpold dans l'appel d'integrd)
501c
502c-----------------------------------------------------------------------
503c   calcul des tendances physiques:
504c   -------------------------------
505c    ########   P.Le Van ( Modif le  6/02/95 )   ###########
506c
507       IF( purmats )  THEN
508          IF( itau.EQ.itaufin.AND..NOT.forward ) lafin = .TRUE.
509       ELSE
510          IF( itau+1. EQ. itaufin )              lafin = .TRUE.
511       ENDIF
512c
513c
514       IF( apphys )  THEN
515c
516c     .......   Ajout   P.Le Van ( 17/04/96 )   ...........
517c
518
519         CALL pression (  ip1jmp1, ap, bp, ps,  p      )
520         if (pressure_exner) then
521           CALL exner_hyb(  ip1jmp1, ps, p,pks, pk, pkf )
522         else
523           CALL exner_milieu( ip1jmp1, ps, p, pks, pk, pkf )
524         endif
525
526! Compute geopotential (physics might need it)
527         CALL geopot  ( ip1jmp1, teta  , pk , pks,  phis  , phi   )
528
529           jD_cur = jD_ref + day_ini - day_ref +                        &
530     &          (itau+1)/day_step
531
532           IF ((planet_type .eq."generic").or.
533     &         (planet_type .eq."mars")) THEN
534              ! AS: we make jD_cur to be pday
535              jD_cur = int(day_ini + itau/day_step)
536           ENDIF
537
538           jH_cur = jH_ref + start_time +                               &
539     &          mod(itau+1,day_step)/float(day_step)
540           IF ((planet_type .eq."generic").or.
541     &         (planet_type .eq."mars")) THEN
542             jH_cur = jH_ref + start_time +                               &
543     &          mod(itau,day_step)/float(day_step)
544           ENDIF
545           jD_cur = jD_cur + int(jH_cur)
546           jH_cur = jH_cur - int(jH_cur)
547!         write(lunout,*)'itau, jD_cur = ', itau, jD_cur, jH_cur
548!         call ju2ymds(jD_cur+jH_cur, an, mois, jour, secondes)
549!         write(lunout,*)'current date = ',an, mois, jour, secondes
550
551c rajout debug
552c       lafin = .true.
553
554
555c   Interface avec les routines de phylmd (phymars ... )
556c   -----------------------------------------------------
557
558c+jld
559
560c  Diagnostique de conservation de l'énergie : initialisation
561         IF (ip_ebil_dyn.ge.1 ) THEN
562          ztit='bil dyn'
563! Ehouarn: be careful, diagedyn is Earth-specific!
564           IF (planet_type.eq."earth") THEN
565            CALL diagedyn(ztit,2,1,1,dtphys
566     &    , ucov    , vcov , ps, p ,pk , teta , q(:,:,1), q(:,:,2))
567           ENDIF
568         ENDIF ! of IF (ip_ebil_dyn.ge.1 )
569c-jld
570#ifdef CPP_IOIPSL
571cIM decommenter les 6 lignes suivantes pour sortir quelques parametres dynamiques de LMDZ
572cIM uncomment next 6 lines to get some parameters for LMDZ dynamics
573c        IF (first) THEN
574c         first=.false.
575c#include "ini_paramLMDZ_dyn.h"
576c        ENDIF
577c
578c#include "write_paramLMDZ_dyn.h"
579c
580#endif
581! #endif of #ifdef CPP_IOIPSL
582
583c          call WriteField('pfi',reshape(p,(/iip1,jmp1,llmp1/)))
584
585         CALL calfis( lafin , jD_cur, jH_cur,
586     $               ucov,vcov,teta,q,masse,ps,p,pk,phis,phi ,
587     $               du,dv,dteta,dq,
588     $               flxw,
589     $               dufi,dvfi,dtetafi,dqfi,dpfi  )
590
591c          call WriteField('dufi',reshape(dufi,(/iip1,jmp1,llm/)))
592c          call WriteField('dvfi',reshape(dvfi,(/iip1,jjm,llm/)))
593c          call WriteField('dtetafi',reshape(dtetafi,(/iip1,jmp1,llm/)))
594
595c      ajout des tendances physiques:
596c      ------------------------------
597          CALL addfi( dtphys, leapf, forward   ,
598     $                  ucov, vcov, teta , q   ,ps ,
599     $                 dufi, dvfi, dtetafi , dqfi ,dpfi  )
600          ! since addfi updates ps(), also update p(), masse() and pk()
601          CALL pression (ip1jmp1,ap,bp,ps,p)
602          CALL massdair(p,masse)
603          if (pressure_exner) then
604            CALL exner_hyb( ip1jmp1, ps, p, pks, pk, pkf )
605          else
606            CALL exner_milieu( ip1jmp1, ps, p, pks, pk, pkf )
607          endif
608         
609c      Couche superieure :
610c      -------------------
611         IF (iflag_top_bound > 0) THEN
612           CALL top_bound(vcov,ucov,teta,masse,dtphys,dutop)
613           dutop(:,:)=dutop(:,:)/dtphys   ! convert to a tendency in (m/s)/s
614         ENDIF
615
616c  Diagnostique de conservation de l'énergie : difference
617         IF (ip_ebil_dyn.ge.1 ) THEN
618          ztit='bil phys'
619          IF (planet_type.eq."earth") THEN
620           CALL diagedyn(ztit,2,1,1,dtphys
621     &     , ucov    , vcov , ps, p ,pk , teta , q(:,:,1), q(:,:,2))
622          ENDIF
623         ENDIF ! of IF (ip_ebil_dyn.ge.1 )
624
625       ENDIF ! of IF( apphys )
626
627      IF(iflag_phys.EQ.2) THEN ! "Newtonian" case
628!   Academic case : Simple friction and Newtonan relaxation
629!   -------------------------------------------------------
630        DO l=1,llm   
631          DO ij=1,ip1jmp1
632           teta(ij,l)=teta(ij,l)-dtvr*
633     &      (teta(ij,l)-tetarappel(ij,l))*(knewt_g+knewt_t(l)*clat4(ij))
634          ENDDO
635        ENDDO ! of DO l=1,llm
636   
637        if (planet_type.eq."giant") then
638          ! add an intrinsic heat flux at the base of the atmosphere
639          teta(:,1)=teta(:,1)+dtvr*aire(:)*ihf/cpp/masse(:,1)
640        endif
641
642        call friction(ucov,vcov,dtvr)
643
644   
645        ! Sponge layer (if any)
646        IF (ok_strato) THEN
647           CALL top_bound(vcov,ucov,teta,masse,dtvr,dutop)
648           dutop(:,:)=dutop(:,:)/dtvr   ! convert to a tendency in (m/s)/s
649        ENDIF ! of IF (ok_strato)
650      ENDIF ! of IF (iflag_phys.EQ.2)
651
652
653c-jld
654
655        CALL pression ( ip1jmp1, ap, bp, ps, p                  )
656        if (pressure_exner) then
657          CALL exner_hyb( ip1jmp1, ps, p, pks, pk, pkf )
658        else
659          CALL exner_milieu( ip1jmp1, ps, p, pks, pk, pkf )
660        endif
661        CALL massdair(p,masse)
662
663        if (ok_iso_verif) then
664           call check_isotopes_seq(q,ip1jmp1,'leapfrog 1196')
665        endif !if (ok_iso_verif) then
666
667c-----------------------------------------------------------------------
668c   dissipation horizontale et verticale  des petites echelles:
669c   ----------------------------------------------------------
670
671      IF(apdiss) THEN
672
673        ! sponge layer
674        if (callsponge) then
675          CALL sponge(ucov,vcov,teta,ps,dtdiss,mode_sponge)
676        endif
677
678c   calcul de l'energie cinetique avant dissipation
679        call covcont(llm,ucov,vcov,ucont,vcont)
680        call enercin(vcov,ucov,vcont,ucont,ecin0)
681
682c   dissipation
683! ADAPTATION GCM POUR CP(T)
684        call tpot2t(ijp1llm,teta,temp,pk)
685
686        CALL dissip(vcov,ucov,teta,p,dvdis,dudis,dtetadis)
687        ucov=ucov+dudis
688        vcov=vcov+dvdis
689        dudis=dudis/dtdiss   ! passage en (m/s)/s
690        dvdis=dvdis/dtdiss   ! passage en (m/s)/s
691
692c------------------------------------------------------------------------
693        if (dissip_conservative) then
694C       On rajoute la tendance due a la transform. Ec -> E therm. cree
695C       lors de la dissipation
696            call covcont(llm,ucov,vcov,ucont,vcont)
697            call enercin(vcov,ucov,vcont,ucont,ecin)
698! ADAPTATION GCM POUR CP(T)
699            do ij=1,ip1jmp1
700              do l=1,llm
701                dtec = (ecin0(ij,l)-ecin(ij,l))/cpdet(temp(ij,l))
702                temp(ij,l) = temp(ij,l) + dtec
703              enddo
704            enddo
705            call t2tpot(ijp1llm,temp,ztetaec,pk)
706            dtetaecdt=ztetaec-teta
707            dtetadis=dtetadis+dtetaecdt
708        endif
709        teta=teta+dtetadis
710        dtetadis=dtetadis/dtdiss   ! passage en K/s
711c------------------------------------------------------------------------
712
713
714c    .......        P. Le Van (  ajout  le 17/04/96  )   ...........
715c   ...      Calcul de la valeur moyenne, unique de h aux poles  .....
716c
717
718        DO l  =  1, llm
719          DO ij =  1,iim
720           tppn(ij)  = aire(  ij    ) * teta(  ij    ,l)
721           tpps(ij)  = aire(ij+ip1jm) * teta(ij+ip1jm,l)
722          ENDDO
723           tpn  = SSUM(iim,tppn,1)/apoln
724           tps  = SSUM(iim,tpps,1)/apols
725
726          DO ij = 1, iip1
727           teta(  ij    ,l) = tpn
728           teta(ij+ip1jm,l) = tps
729          ENDDO
730        ENDDO
731
732        if (1 == 0) then
733!!! Ehouarn: lines here 1) kill 1+1=2 in the dynamics
734!!!                     2) should probably not be here anyway
735!!! but are kept for those who would want to revert to previous behaviour
736           DO ij =  1,iim
737             tppn(ij)  = aire(  ij    ) * ps (  ij    )
738             tpps(ij)  = aire(ij+ip1jm) * ps (ij+ip1jm)
739           ENDDO
740             tpn  = SSUM(iim,tppn,1)/apoln
741             tps  = SSUM(iim,tpps,1)/apols
742
743           DO ij = 1, iip1
744             ps(  ij    ) = tpn
745             ps(ij+ip1jm) = tps
746           ENDDO
747        endif ! of if (1 == 0)
748
749      END IF ! of IF(apdiss)
750
751c ajout debug
752c              IF( lafin ) then 
753c                abort_message = 'Simulation finished'
754c                call abort_gcm(modname,abort_message,0)
755c              ENDIF
756       
757c   ********************************************************************
758c   ********************************************************************
759c   .... fin de l'integration dynamique  et physique pour le pas itau ..
760c   ********************************************************************
761c   ********************************************************************
762
763c   preparation du pas d'integration suivant  ......
764
765        if (ok_iso_verif) then
766           call check_isotopes_seq(q,ip1jmp1,'leapfrog 1509')
767        endif !if (ok_iso_verif) then
768
769      IF ( .NOT.purmats ) THEN
770c       ........................................................
771c       ..............  schema matsuno + leapfrog  ..............
772c       ........................................................
773
774            IF(forward. OR. leapf) THEN
775              itau= itau + 1
776c              iday= day_ini+itau/day_step
777c              time= REAL(itau-(iday-day_ini)*day_step)/day_step+time_0
778c                IF(time.GT.1.) THEN
779c                  time = time-1.
780c                  iday = iday+1
781c                ENDIF
782            ENDIF
783
784
785            IF( itau. EQ. itaufinp1 ) then 
786              if (flag_verif) then
787                write(79,*) 'ucov',ucov
788                write(80,*) 'vcov',vcov
789                write(81,*) 'teta',teta
790                write(82,*) 'ps',ps
791                write(83,*) 'q',q
792                WRITE(85,*) 'q1 = ',q(:,:,1)
793                WRITE(86,*) 'q3 = ',q(:,:,3)
794              endif
795
796              abort_message = 'Simulation finished'
797
798              call abort_gcm(modname,abort_message,0)
799            ENDIF
800c-----------------------------------------------------------------------
801c   ecriture du fichier histoire moyenne:
802c   -------------------------------------
803
804            IF(MOD(itau,iperiod).EQ.0 .OR. itau.EQ.itaufin) THEN
805               IF(itau.EQ.itaufin) THEN
806                  iav=1
807               ELSE
808                  iav=0
809               ENDIF
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               IF (ok_dynzon) THEN
953#ifdef CPP_IOIPSL
954c les traceurs ne sont pas sortis, trop lourd.
955c Peut changer eventuellement si besoin.
956                 CALL bilan_dyn(dtvr*iperiod,dtvr*day_step*periodav,
957     &                 ps,masse,pk,pbaru,pbarv,teta,phi,ucov,vcov,
958     &                 du,dudis,dutop,dufi)
959#endif
960               ENDIF
961               IF (ok_dyn_ave) THEN
962#ifdef CPP_IOIPSL
963                 CALL writedynav(itau,vcov,
964     &                 ucov,teta,pk,phi,q,masse,ps,phis)
965#endif
966               ENDIF
967
968              ENDIF ! of IF(MOD(itau,iperiod).EQ.0 .OR. itau.EQ.itaufin)
969
970              IF(MOD(itau,iecri         ).EQ.0) THEN
971c              IF(MOD(itau,iecri*day_step).EQ.0) THEN
972! ADAPTATION GCM POUR CP(T)
973                call tpot2t(ijp1llm,teta,temp,pk)
974                tsurpk = cpp*temp/pk
975                CALL geopot(ip1jmp1,tsurpk,pk,pks,phis,phi)
976                unat=0.
977                do l=1,llm
978                  unat(iip2:ip1jm,l)=ucov(iip2:ip1jm,l)/cu(iip2:ip1jm)
979                  vnat(:,l)=vcov(:,l)/cv(:)
980                enddo
981#ifdef CPP_IOIPSL
982              if (ok_dyn_ins) then
983!                write(lunout,*) "leapfrog: call writehist (b)",
984!     &                        itau,iecri
985                CALL writehist(itau,vcov,ucov,teta,phi,q,masse,ps,phis)
986              endif ! of if (ok_dyn_ins)
987#endif
988! For some Grads outputs
989                if (output_grads_dyn) then
990#include "write_grads_dyn.h"
991                endif
992
993              ENDIF ! of IF(MOD(itau,iecri         ).EQ.0)
994
995              IF(itau.EQ.itaufin) THEN
996                if (planet_type=="mars") then
997                  CALL dynredem1("restart.nc",REAL(itau)/REAL(day_step),
998     &                         vcov,ucov,teta,q,masse,ps)
999                else
1000                  CALL dynredem1("restart.nc",start_time,
1001     &                         vcov,ucov,teta,q,masse,ps)
1002                endif
1003              ENDIF ! of IF(itau.EQ.itaufin)
1004
1005              forward = .TRUE.
1006              GO TO  1
1007
1008            ENDIF ! of IF (forward)
1009
1010      END IF ! of IF(.not.purmats)
1011
1012      STOP
1013      END
Note: See TracBrowser for help on using the repository browser.