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

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

Common dynamics: (and collateral adaptations in Venus physics)
Improved cpdet routines in and additional sponge mode:

  • Additionnal sponge mode (trigered with "callsponge" flag), in line with the one used in the Generic and Martian GCM. This sponge is called whenever there is a dissipation step.
  • Improvement of the cpdet routines : created routines tpot2t_glo_p and t2tpot_glo_p which handle fields on the whole dynamics (scaler) grid, which are more efficient than calling tpot2t_p or t2tpot_p with slabs of data (generated use of intermediate copies of these chunks of data at every call)
  • Turned cpdet.F into a module cpdet_mod.F90 (and correspondingly adapted all routines in the Venus physics).

EM

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