source: LMDZ5/trunk/libf/dyn3dpar/leapfrog_p.F @ 2175

Last change on this file since 2175 was 2171, checked in by acozic, 11 years ago

There are some commits that we must not do just before holiday .... so be back to rev 2168

  • Property copyright set to
    Name of program: LMDZ
    Creation date: 1984
    Version: LMDZ5
    License: CeCILL version 2
    Holder: Laboratoire de m\'et\'eorologie dynamique, CNRS, UMR 8539
    See the license file in the root directory
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 55.8 KB
RevLine 
[764]1!
[1279]2! $Id: leapfrog_p.F 2171 2014-12-19 15:21:08Z jescribano $
[630]3!
4c
5c
6
[1146]7      SUBROUTINE leapfrog_p(ucov,vcov,teta,ps,masse,phis,q,clesphy0,
[630]8     &                    time_0)
9
[2021]10      use exner_hyb_m, only: exner_hyb
11      use exner_milieu_m, only: exner_milieu
12      use exner_hyb_p_m, only: exner_hyb_p
13      use exner_milieu_p_m, only: exner_milieu_p
[630]14       USE misc_mod
[1823]15       USE parallel_lmdz
[630]16       USE times
17       USE mod_hallo
18       USE Bands
19       USE Write_Field
20       USE Write_Field_p
21       USE vampir
[985]22       USE timer_filtre, ONLY : print_filtre_timer
[1987]23       USE infotrac, ONLY: nqtot
[1279]24       USE guide_p_mod, ONLY : guide_main
25       USE getparam
[1987]26       USE control_mod, ONLY: nday, day_step, planet_type, offline,
27     &                       iconser, iphysiq, iperiod, dissip_period,
28     &                       iecri, ip_ebil_dyn, ok_dynzon, ok_dyn_ins,
29     &                       periodav, ok_dyn_ave, output_grads_dyn,
30     &                       iapp_tracvl
[630]31      IMPLICIT NONE
32
33c      ......   Version  du 10/01/98    ..........
34
35c             avec  coordonnees  verticales hybrides
36c   avec nouveaux operat. dissipation * ( gradiv2,divgrad2,nxgraro2 )
37
38c=======================================================================
39c
40c   Auteur:  P. Le Van /L. Fairhead/F.Hourdin
41c   -------
42c
43c   Objet:
44c   ------
45c
46c   GCM LMD nouvelle grille
47c
48c=======================================================================
49c
50c  ... Dans inigeom , nouveaux calculs pour les elongations  cu , cv
51c      et possibilite d'appeler une fonction f(y)  a derivee tangente
52c      hyperbolique a la  place de la fonction a derivee sinusoidale.
53
54c  ... Possibilite de choisir le shema pour l'advection de
55c        q  , en modifiant iadv dans traceur.def  (10/02) .
56c
57c      Pour Van-Leer + Vapeur d'eau saturee, iadv(1)=4. (F.Codron,10/99)
58c      Pour Van-Leer iadv=10
59c
60c-----------------------------------------------------------------------
61c   Declarations:
62c   -------------
63
64#include "dimensions.h"
65#include "paramet.h"
66#include "comconst.h"
67#include "comdissnew.h"
68#include "comvert.h"
69#include "comgeom.h"
70#include "logic.h"
71#include "temps.h"
72#include "ener.h"
73#include "description.h"
74#include "serre.h"
[1403]75!#include "com_io_dyn.h"
[630]76#include "iniprint.h"
77#include "academic.h"
78     
[1987]79      INTEGER,PARAMETER :: longcles = 20
80      REAL,INTENT(IN) :: clesphy0( longcles ) ! not used
81      REAL,INTENT(IN) :: time_0 ! not used
[630]82
[1987]83c   dynamical variables:
84      REAL,INTENT(INOUT) :: ucov(ip1jmp1,llm)    ! zonal covariant wind
85      REAL,INTENT(INOUT) :: vcov(ip1jm,llm)      ! meridional covariant wind
86      REAL,INTENT(INOUT) :: teta(ip1jmp1,llm)    ! potential temperature
87      REAL,INTENT(INOUT) :: ps(ip1jmp1)          ! surface pressure (Pa)
88      REAL,INTENT(INOUT) :: masse(ip1jmp1,llm)   ! air mass
89      REAL,INTENT(INOUT) :: phis(ip1jmp1)        ! geopotentiat at the surface
90      REAL,INTENT(INOUT) :: q(ip1jmp1,llm,nqtot) ! advected tracers
91
92      REAL,SAVE :: p (ip1jmp1,llmp1  )       ! interlayer pressure
93      REAL,SAVE :: pks(ip1jmp1)              ! exner at the surface
94      REAL,SAVE :: pk(ip1jmp1,llm)           ! exner at mid-layer
95      REAL,SAVE :: pkf(ip1jmp1,llm)          ! filtered exner at mid-layer
96      REAL,SAVE :: phi(ip1jmp1,llm)          ! geopotential
97      REAL,SAVE :: w(ip1jmp1,llm)            ! vertical velocity
98
[630]99      real zqmin,zqmax
100
101c variables dynamiques intermediaire pour le transport
[774]102      REAL,SAVE :: pbaru(ip1jmp1,llm),pbarv(ip1jm,llm) !flux de masse
[630]103
104c   variables dynamiques au pas -1
[774]105      REAL,SAVE :: vcovm1(ip1jm,llm),ucovm1(ip1jmp1,llm)
106      REAL,SAVE :: tetam1(ip1jmp1,llm),psm1(ip1jmp1)
107      REAL,SAVE :: massem1(ip1jmp1,llm)
[630]108
109c   tendances dynamiques
[774]110      REAL,SAVE :: dv(ip1jm,llm),du(ip1jmp1,llm)
[1146]111      REAL,SAVE :: dteta(ip1jmp1,llm),dp(ip1jmp1)
112      REAL,DIMENSION(:,:,:), ALLOCATABLE, SAVE :: dq
[630]113
114c   tendances de la dissipation
[774]115      REAL,SAVE :: dvdis(ip1jm,llm),dudis(ip1jmp1,llm)
116      REAL,SAVE :: dtetadis(ip1jmp1,llm)
[630]117
118c   tendances physiques
[774]119      REAL,SAVE :: dvfi(ip1jm,llm),dufi(ip1jmp1,llm)
120      REAL,SAVE :: dtetafi(ip1jmp1,llm)
[1146]121      REAL,SAVE :: dpfi(ip1jmp1)
122      REAL,DIMENSION(:,:,:),ALLOCATABLE,SAVE :: dqfi
[630]123
124c   variables pour le fichier histoire
125      REAL dtav      ! intervalle de temps elementaire
126
127      REAL tppn(iim),tpps(iim),tpn,tps
128c
129      INTEGER itau,itaufinp1,iav
[1279]130!      INTEGER  iday ! jour julien
131      REAL       time
[630]132
133      REAL  SSUM
[1616]134!      REAL,SAVE :: finvmaold(ip1jmp1,llm)
[630]135
136cym      LOGICAL  lafin
[774]137      LOGICAL :: lafin
[630]138      INTEGER ij,iq,l
139      INTEGER ik
140
141      real time_step, t_wrt, t_ops
142
[1279]143! jD_cur: jour julien courant
144! jH_cur: heure julienne courante
145      REAL :: jD_cur, jH_cur
146      INTEGER :: an, mois, jour
147      REAL :: secondes
148
[1671]149      logical :: physic
[630]150      LOGICAL first,callinigrads
151
152      data callinigrads/.true./
153      character*10 string10
154
[960]155      REAL,SAVE :: flxw(ip1jmp1,llm) ! flux de masse verticale
[630]156
157c+jld variables test conservation energie
[774]158      REAL,SAVE :: ecin(ip1jmp1,llm),ecin0(ip1jmp1,llm)
[630]159C     Tendance de la temp. potentiel d (theta)/ d t due a la
160C     tansformation d'energie cinetique en energie thermique
161C     cree par la dissipation
[774]162      REAL,SAVE :: dtetaecdt(ip1jmp1,llm)
163      REAL,SAVE :: vcont(ip1jm,llm),ucont(ip1jmp1,llm)
164      REAL,SAVE :: vnat(ip1jm,llm),unat(ip1jmp1,llm)
[630]165      REAL      d_h_vcol, d_qt, d_qw, d_ql, d_ec
166      CHARACTER*15 ztit
[764]167!      INTEGER   ip_ebil_dyn  ! PRINT level for energy conserv. diag.
168!      SAVE      ip_ebil_dyn
169!      DATA      ip_ebil_dyn/0/
[630]170c-jld
171
172      character*80 dynhist_file, dynhistave_file
[1520]173      character(len=*),parameter :: modname="leapfrog"
[630]174      character*80 abort_message
175
176
[774]177      logical,PARAMETER :: dissip_conservative=.TRUE.
178 
[630]179      INTEGER testita
180      PARAMETER (testita = 9)
[1286]181
182      logical , parameter :: flag_verif = .false.
[630]183     
[764]184c declaration liees au parallelisme
[630]185      INTEGER :: ierr
[774]186      LOGICAL :: FirstCaldyn
187      LOGICAL :: FirstPhysic
[630]188      INTEGER :: ijb,ije,j,i
189      type(Request) :: TestRequest
190      type(Request) :: Request_Dissip
191      type(Request) :: Request_physic
[774]192      REAL,SAVE :: dvfi_tmp(iip1,llm),dufi_tmp(iip1,llm)
[1146]193      REAL,SAVE :: dtetafi_tmp(iip1,llm)
194      REAL,DIMENSION(:,:,:),ALLOCATABLE,SAVE :: dqfi_tmp
[774]195      REAL,SAVE :: dpfi_tmp(iip1)
196
197      INTEGER :: true_itau
198      INTEGER :: iapptrac
199      INTEGER :: AdjustCount
[1279]200!      INTEGER :: var_time
[774]201      LOGICAL :: ok_start_timer=.FALSE.
[1146]202      LOGICAL, SAVE :: firstcall=.TRUE.
[774]203
204c$OMP MASTER
[630]205      ItCount=0
[774]206c$OMP END MASTER     
207      true_itau=0
208      FirstCaldyn=.TRUE.
209      FirstPhysic=.TRUE.
210      iapptrac=0
211      AdjustCount = 0
212      lafin=.false.
[630]213     
[2038]214      if (nday>=0) then
215         itaufin   = nday*day_step
216      else
217         itaufin   = -nday
218      endif
219
[630]220      itaufinp1 = itaufin +1
221
222      itau = 0
[1671]223      physic=.true.
224      if (iflag_phys==0.or.iflag_phys==2) physic=.false.
[1279]225!      iday = day_ini+itau/day_step
[1403]226!      time = REAL(itau-(iday-day_ini)*day_step)/day_step+time_0
[1279]227!         IF(time.GT.1.) THEN
228!          time = time-1.
229!          iday = iday+1
230!         ENDIF
[630]231
[1146]232c Allocate variables depending on dynamic variable nqtot
233c$OMP MASTER
234         IF (firstcall) THEN
235            firstcall=.FALSE.
236            ALLOCATE(dq(ip1jmp1,llm,nqtot))
237            ALLOCATE(dqfi(ip1jmp1,llm,nqtot))
238            ALLOCATE(dqfi_tmp(iip1,llm,nqtot))
239         END IF
240c$OMP END MASTER     
241c$OMP BARRIER
242
[630]243c-----------------------------------------------------------------------
244c   On initialise la pression et la fonction d'Exner :
245c   --------------------------------------------------
246
[774]247c$OMP MASTER
[1454]248      dq(:,:,:)=0.
[630]249      CALL pression ( ip1jmp1, ap, bp, ps, p       )
[1625]250      if (pressure_exner) then
[2021]251        CALL exner_hyb( ip1jmp1, ps, p, pks, pk, pkf )
[1625]252      else
[2021]253        CALL exner_milieu( ip1jmp1, ps, p, pks, pk, pkf )
[1520]254      endif
[774]255c$OMP END MASTER
[630]256c-----------------------------------------------------------------------
257c   Debut de l'integration temporelle:
258c   ----------------------------------
[764]259c et du parallelisme !!
[630]260
[1614]261   1  CONTINUE ! Matsuno Forward step begins here
[630]262
[1577]263      jD_cur = jD_ref + day_ini - day_ref +                             &
[1626]264     &          itau/day_step
[1577]265      jH_cur = jH_ref + start_time +                                    &
[1626]266     &         mod(itau,day_step)/float(day_step)
[1577]267      if (jH_cur > 1.0 ) then
268        jD_cur = jD_cur +1.
269        jH_cur = jH_cur -1.
270      endif
[985]271
[630]272
273#ifdef CPP_IOIPSL
[1279]274      if (ok_guide) then
275!$OMP MASTER
276        call guide_main(itau,ucov,vcov,teta,q,masse,ps)
277!$OMP END MASTER
278!$OMP BARRIER
[630]279      endif
280#endif
[1279]281
[630]282c
283c     IF( MOD( itau, 10* day_step ).EQ.0 )  THEN
284c       CALL  test_period ( ucov,vcov,teta,q,p,phis )
285c       PRINT *,' ----   Test_period apres continue   OK ! -----', itau
286c     ENDIF
287c
288cym      CALL SCOPY( ijmllm ,vcov , 1, vcovm1 , 1 )
289cym      CALL SCOPY( ijp1llm,ucov , 1, ucovm1 , 1 )
290cym      CALL SCOPY( ijp1llm,teta , 1, tetam1 , 1 )
291cym      CALL SCOPY( ijp1llm,masse, 1, massem1, 1 )
292cym      CALL SCOPY( ip1jmp1, ps  , 1,   psm1 , 1 )
293
294       if (FirstCaldyn) then
[774]295c$OMP MASTER
[630]296         ucovm1=ucov
297         vcovm1=vcov
298         tetam1= teta
299         massem1= masse
300         psm1= ps
[1616]301
302! Ehouarn: finvmaold is actually not used       
303!         finvmaold = masse
304!         CALL filtreg ( finvmaold ,jjp1, llm, -2,2, .TRUE., 1 )
[774]305c$OMP END MASTER
306c$OMP BARRIER
[630]307       else
[1146]308! Save fields obtained at previous time step as '...m1'
[630]309         ijb=ij_begin
310         ije=ij_end
[774]311
312c$OMP MASTER           
[630]313         psm1     (ijb:ije) = ps    (ijb:ije)
[774]314c$OMP END MASTER
315
316c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)         
[949]317         DO l=1,llm     
[774]318           ije=ij_end
[949]319           ucovm1   (ijb:ije,l) = ucov  (ijb:ije,l)
[774]320           tetam1   (ijb:ije,l) = teta  (ijb:ije,l)
321           massem1  (ijb:ije,l) = masse (ijb:ije,l)
[1616]322!           finvmaold(ijb:ije,l)=masse(ijb:ije,l)
[949]323                 
[774]324           if (pole_sud) ije=ij_end-iip1
325           vcovm1(ijb:ije,l) = vcov  (ijb:ije,l)
[630]326       
[774]327
328         ENDDO
[985]329c$OMP ENDDO 
[774]330
[1616]331! Ehouarn: finvmaold not used
332!          CALL filtreg_p ( finvmaold ,jj_begin,jj_end,jjp1,
333!     .                    llm, -2,2, .TRUE., 1 )
[774]334
[1146]335       endif ! of if (FirstCaldyn)
[630]336       
337      forward = .TRUE.
338      leapf   = .FALSE.
339      dt      =  dtvr
340
341c   ...    P.Le Van .26/04/94  ....
342
343cym      CALL SCOPY   ( ijp1llm,   masse, 1, finvmaold,     1 )
344cym      CALL filtreg ( finvmaold ,jjp1, llm, -2,2, .TRUE., 1 )
345
[764]346cym  ne sert a rien
[630]347cym      call minmax(ijp1llm,q(:,:,3),zqmin,zqmax)
348
[1614]349   2  CONTINUE ! Matsuno backward or leapfrog step begins here
[630]350
[774]351c$OMP MASTER
[630]352      ItCount=ItCount+1
[995]353      if (MOD(ItCount,1)==1) then
[630]354        debug=.true.
355      else
356        debug=.false.
357      endif
[774]358c$OMP END MASTER
[630]359c-----------------------------------------------------------------------
360
361c   date:
362c   -----
363
364
365c   gestion des appels de la physique et des dissipations:
366c   ------------------------------------------------------
367c
368c   ...    P.Le Van  ( 6/02/95 )  ....
369
370      apphys = .FALSE.
371      statcl = .FALSE.
372      conser = .FALSE.
373      apdiss = .FALSE.
[1502]374
[630]375      IF( purmats ) THEN
[1403]376      ! Purely Matsuno time stepping
[630]377         IF( MOD(itau,iconser) .EQ.0.AND.  forward    ) conser = .TRUE.
[1502]378         IF( MOD(itau,dissip_period ).EQ.0.AND..NOT.forward )
379     s        apdiss = .TRUE.
[630]380         IF( MOD(itau,iphysiq ).EQ.0.AND..NOT.forward
[1671]381     s          .and. physic                        ) apphys = .TRUE.
[630]382      ELSE
[1403]383      ! Leapfrog/Matsuno time stepping
[630]384         IF( MOD(itau   ,iconser) .EQ. 0              ) conser = .TRUE.
[1502]385         IF( MOD(itau+1,dissip_period).EQ.0 .AND. .NOT. forward )
386     s        apdiss = .TRUE.
[1671]387         IF( MOD(itau+1,iphysiq).EQ.0.AND.physic) apphys=.TRUE.
[630]388      END IF
389
[1403]390! Ehouarn: for Shallow Water case (ie: 1 vertical layer),
391!          supress dissipation step
392      if (llm.eq.1) then
393        apdiss=.false.
394      endif
395
[630]396cym    ---> Pour le moment     
397cym      apphys = .FALSE.
398      statcl = .FALSE.
[1403]399      conser = .FALSE. ! ie: no output of control variables to stdout in //
[630]400     
401      if (firstCaldyn) then
[774]402c$OMP MASTER
[630]403          call SetDistrib(jj_Nb_Caldyn)
[774]404c$OMP END MASTER
405c$OMP BARRIER
[630]406          firstCaldyn=.FALSE.
407cym          call InitTime
[774]408c$OMP MASTER
[630]409          call Init_timer
[774]410c$OMP END MASTER
[630]411      endif
[774]412
413c$OMP MASTER     
414      IF (ok_start_timer) THEN
415        CALL InitTime
[949]416        ok_start_timer=.FALSE.
[774]417      ENDIF     
418c$OMP END MASTER     
419     
[630]420      if (Adjust) then
[774]421c$OMP MASTER
422        AdjustCount=AdjustCount+1
423        if (iapptrac==iapp_tracvl .and. (forward. OR . leapf)
424     &         .and. itau/iphysiq>2 .and. Adjustcount>30) then
[630]425           AdjustCount=0
426           call allgather_timer_average
427
[1575]428        if (prt_level > 9) then
[630]429       
[949]430        print *,'*********************************'
431        print *,'******    TIMER CALDYN     ******'
432        do i=0,mpi_size-1
433          print *,'proc',i,' :   Nb Bandes  :',jj_nb_caldyn(i),
[630]434     &            '  : temps moyen :',
435     &             timer_average(jj_nb_caldyn(i),timer_caldyn,i),
436     &            '+-',timer_delta(jj_nb_caldyn(i),timer_caldyn,i)
437        enddo
438     
439        print *,'*********************************'
[949]440        print *,'******    TIMER VANLEER    ******'
441        do i=0,mpi_size-1
442          print *,'proc',i,' :   Nb Bandes  :',jj_nb_vanleer(i),
[630]443     &            '  : temps moyen :',
444     &             timer_average(jj_nb_vanleer(i),timer_vanleer,i),
445     &            '+-',timer_delta(jj_nb_vanleer(i),timer_vanleer,i)
446        enddo
447     
448        print *,'*********************************'
[949]449        print *,'******    TIMER DISSIP    ******'
450        do i=0,mpi_size-1
451          print *,'proc',i,' :   Nb Bandes  :',jj_nb_dissip(i),
[630]452     &            '  : temps moyen :',
453     &             timer_average(jj_nb_dissip(i),timer_dissip,i),
454     &             '+-',timer_delta(jj_nb_dissip(i),timer_dissip,i)
455        enddo
456       
[949]457        if (mpi_rank==0) call WriteBands
458       
[630]459       endif
460       
[949]461         call AdjustBands_caldyn
[630]462         if (mpi_rank==0) call WriteBands
[949]463         
464         call Register_SwapFieldHallo(ucov,ucov,ip1jmp1,llm,
[630]465     &                                jj_Nb_caldyn,0,0,TestRequest)
466         call Register_SwapFieldHallo(ucovm1,ucovm1,ip1jmp1,llm,
467     &                                jj_Nb_caldyn,0,0,TestRequest)
468         call Register_SwapFieldHallo(vcov,vcov,ip1jm,llm,
469     &                                jj_Nb_caldyn,0,0,TestRequest)
470         call Register_SwapFieldHallo(vcovm1,vcovm1,ip1jm,llm,
471     &                                jj_Nb_caldyn,0,0,TestRequest)
472         call Register_SwapFieldHallo(teta,teta,ip1jmp1,llm,
473     &                                jj_Nb_caldyn,0,0,TestRequest)
474         call Register_SwapFieldHallo(tetam1,tetam1,ip1jmp1,llm,
475     &                                jj_Nb_caldyn,0,0,TestRequest)
476         call Register_SwapFieldHallo(masse,masse,ip1jmp1,llm,
477     &                                jj_Nb_caldyn,0,0,TestRequest)
478         call Register_SwapFieldHallo(massem1,massem1,ip1jmp1,llm,
479     &                                jj_Nb_caldyn,0,0,TestRequest)
480         call Register_SwapFieldHallo(ps,ps,ip1jmp1,1,
481     &                                jj_Nb_caldyn,0,0,TestRequest)
482         call Register_SwapFieldHallo(psm1,psm1,ip1jmp1,1,
483     &                                jj_Nb_caldyn,0,0,TestRequest)
484         call Register_SwapFieldHallo(pkf,pkf,ip1jmp1,llm,
485     &                                jj_Nb_caldyn,0,0,TestRequest)
486         call Register_SwapFieldHallo(pk,pk,ip1jmp1,llm,
487     &                                jj_Nb_caldyn,0,0,TestRequest)
488         call Register_SwapFieldHallo(pks,pks,ip1jmp1,1,
489     &                                jj_Nb_caldyn,0,0,TestRequest)
490         call Register_SwapFieldHallo(phis,phis,ip1jmp1,1,
491     &                                jj_Nb_caldyn,0,0,TestRequest)
[774]492         call Register_SwapFieldHallo(phi,phi,ip1jmp1,llm,
[630]493     &                                jj_Nb_caldyn,0,0,TestRequest)
[1616]494!         call Register_SwapFieldHallo(finvmaold,finvmaold,ip1jmp1,llm,
495!     &                                jj_Nb_caldyn,0,0,TestRequest)
[630]496 
[1146]497        do j=1,nqtot
[764]498         call Register_SwapFieldHallo(q(1,1,j),q(1,1,j),ip1jmp1,llm,
499     &                                jj_nb_caldyn,0,0,TestRequest)
500        enddo
501
[630]502         call SetDistrib(jj_nb_caldyn)
503         call SendRequest(TestRequest)
504         call WaitRequest(TestRequest)
505         
[949]506        call AdjustBands_dissip
507        call AdjustBands_physic
[774]508
[630]509      endif
[774]510c$OMP END MASTER 
[630]511      endif       
[774]512     
[630]513     
514     
515c-----------------------------------------------------------------------
516c   calcul des tendances dynamiques:
517c   --------------------------------
[774]518c$OMP BARRIER
519c$OMP MASTER
[630]520       call VTb(VThallo)
[985]521c$OMP END MASTER
522
[630]523       call Register_Hallo(ucov,ip1jmp1,llm,1,1,1,1,TestRequest)
524       call Register_Hallo(vcov,ip1jm,llm,1,1,1,1,TestRequest)
525       call Register_Hallo(teta,ip1jmp1,llm,1,1,1,1,TestRequest)
526       call Register_Hallo(ps,ip1jmp1,1,1,2,2,1,TestRequest)
527       call Register_Hallo(pkf,ip1jmp1,llm,1,1,1,1,TestRequest)
528       call Register_Hallo(pk,ip1jmp1,llm,1,1,1,1,TestRequest)
529       call Register_Hallo(pks,ip1jmp1,1,1,1,1,1,TestRequest)
530       call Register_Hallo(p,ip1jmp1,llmp1,1,1,1,1,TestRequest)
531       
[1146]532c       do j=1,nqtot
[630]533c         call Register_Hallo(q(1,1,j),ip1jmp1,llm,1,1,1,1,
534c     *                       TestRequest)
535c        enddo
536
537       call SendRequest(TestRequest)
[985]538c$OMP BARRIER
[630]539       call WaitRequest(TestRequest)
[985]540
541c$OMP MASTER
[630]542       call VTe(VThallo)
[985]543c$OMP END MASTER
544c$OMP BARRIER
[764]545     
[949]546      if (debug) then       
[985]547!$OMP BARRIER
548!$OMP MASTER
[630]549        call WriteField_p('ucov',reshape(ucov,(/iip1,jmp1,llm/)))
550        call WriteField_p('vcov',reshape(vcov,(/iip1,jjm,llm/)))
551        call WriteField_p('teta',reshape(teta,(/iip1,jmp1,llm/)))
552        call WriteField_p('ps',reshape(ps,(/iip1,jmp1/)))
553        call WriteField_p('masse',reshape(masse,(/iip1,jmp1,llm/)))
[949]554        call WriteField_p('pk',reshape(pk,(/iip1,jmp1,llm/)))
[630]555        call WriteField_p('pks',reshape(pks,(/iip1,jmp1/)))
556        call WriteField_p('pkf',reshape(pkf,(/iip1,jmp1,llm/)))
557        call WriteField_p('phis',reshape(phis,(/iip1,jmp1/)))
[1146]558        do j=1,nqtot
[764]559          call WriteField_p('q'//trim(int2str(j)),
560     .                reshape(q(:,:,j),(/iip1,jmp1,llm/)))
[985]561        enddo
562!$OMP END MASTER       
563c$OMP BARRIER
[630]564      endif
[985]565
[630]566     
567      True_itau=True_itau+1
[774]568
569c$OMP MASTER
[1146]570      IF (prt_level>9) THEN
571        WRITE(lunout,*)"leapfrog_p: Iteration No",True_itau
572      ENDIF
[630]573
574
575      call start_timer(timer_caldyn)
576
[1614]577      ! compute geopotential phi()
[630]578      CALL geopot_p  ( ip1jmp1, teta  , pk , pks,  phis  , phi   )
579
580     
581      call VTb(VTcaldyn)
[774]582c$OMP END MASTER
[1279]583!      var_time=time+iday-day_ini
[764]584
[985]585c$OMP BARRIER
586!      CALL FTRACE_REGION_BEGIN("caldyn")
[1279]587      time = jD_cur + jH_cur
[630]588      CALL caldyn_p
589     $  ( itau,ucov,vcov,teta,ps,masse,pk,pkf,phis ,
[1279]590     $    phi,conser,du,dv,dteta,dp,w, pbaru,pbarv, time )
[764]591
[985]592!      CALL FTRACE_REGION_END("caldyn")
[1279]593
[774]594c$OMP MASTER
[630]595      call VTe(VTcaldyn)
[774]596c$OMP END MASTER     
[985]597
598cc$OMP BARRIER
599cc$OMP MASTER
[1279]600!      call WriteField_p('du',reshape(du,(/iip1,jmp1,llm/)))
601!      call WriteField_p('dv',reshape(dv,(/iip1,jjm,llm/)))
602!      call WriteField_p('dteta',reshape(dteta,(/iip1,jmp1,llm/)))
603!      call WriteField_p('dp',reshape(dp,(/iip1,jmp1/)))
604!      call WriteField_p('w',reshape(w,(/iip1,jmp1,llm/)))
605!      call WriteField_p('pbaru',reshape(pbaru,(/iip1,jmp1,llm/)))
606!      call WriteField_p('pbarv',reshape(pbarv,(/iip1,jjm,llm/)))
607!      call WriteField_p('p',reshape(p,(/iip1,jmp1,llmp1/)))
608!      call WriteField_p('masse',reshape(masse,(/iip1,jmp1,llm/)))
609!      call WriteField_p('pk',reshape(pk,(/iip1,jmp1,llm/)))
[985]610cc$OMP END MASTER
[630]611
612c-----------------------------------------------------------------------
613c   calcul des tendances advection des traceurs (dont l'humidite)
614c   -------------------------------------------------------------
615
616      IF( forward. OR . leapf )  THEN
[1987]617! Ehouarn: NB: fields sent to advtrac are those at the beginning of the time step
[960]618         CALL caladvtrac_p(q,pbaru,pbarv,
619     *        p, masse, dq,  teta,
620     .        flxw,pk, iapptrac)
[985]621
[1454]622C        Stokage du flux de masse pour traceurs OFF-LINE
623         IF (offline .AND. .NOT. adjust) THEN
624            CALL fluxstokenc_p(pbaru,pbarv,masse,teta,phi,phis,
625     .           dtvr, itau)
626         ENDIF
[985]627
[1146]628      ENDIF ! of IF( forward. OR . leapf )
[630]629
630c-----------------------------------------------------------------------
631c   integrations dynamique et traceurs:
632c   ----------------------------------
[774]633
634c$OMP MASTER
[630]635       call VTb(VTintegre)
[774]636c$OMP END MASTER
[764]637c      call WriteField_p('ucovm1',reshape(ucovm1,(/iip1,jmp1,llm/)))
638c      call WriteField_p('vcovm1',reshape(vcovm1,(/iip1,jjm,llm/)))
639c      call WriteField_p('tetam1',reshape(tetam1,(/iip1,jmp1,llm/)))
640c      call WriteField_p('psm1',reshape(psm1,(/iip1,jmp1/)))
641c      call WriteField_p('ucov',reshape(ucov,(/iip1,jmp1,llm/)))
642c      call WriteField_p('vcov',reshape(vcov,(/iip1,jjm,llm/)))
643c      call WriteField_p('teta',reshape(teta,(/iip1,jmp1,llm/)))
644c      call WriteField_p('ps',reshape(ps,(/iip1,jmp1/)))
[774]645cc$OMP PARALLEL DEFAULT(SHARED)
[985]646c$OMP BARRIER
647!       CALL FTRACE_REGION_BEGIN("integrd")
[1146]648
[630]649       CALL integrd_p ( 2,vcovm1,ucovm1,tetam1,psm1,massem1 ,
[1616]650     $         dv,du,dteta,dq,dp,vcov,ucov,teta,q,ps,masse,phis )
651!     $              finvmaold                                    )
[630]652
[985]653!       CALL FTRACE_REGION_END("integrd")
654c$OMP BARRIER
655cc$OMP MASTER
[764]656c      call WriteField_p('ucovm1',reshape(ucovm1,(/iip1,jmp1,llm/)))
657c      call WriteField_p('vcovm1',reshape(vcovm1,(/iip1,jjm,llm/)))
658c      call WriteField_p('tetam1',reshape(tetam1,(/iip1,jmp1,llm/)))
659c      call WriteField_p('psm1',reshape(psm1,(/iip1,jmp1/)))
660c      call WriteField_p('ucov',reshape(ucov,(/iip1,jmp1,llm/)))
661c      call WriteField_p('vcov',reshape(vcov,(/iip1,jjm,llm/)))
662c      call WriteField_p('teta',reshape(teta,(/iip1,jmp1,llm/)))
663c      call WriteField_p('dteta',reshape(dteta,(/iip1,jmp1,llm/)))
[985]664c
665c      call WriteField_p('ps',reshape(ps,(/iip1,jmp1/)))
[1146]666c      do j=1,nqtot
[985]667c        call WriteField_p('q'//trim(int2str(j)),
668c     .                reshape(q(:,:,j),(/iip1,jmp1,llm/)))
669c        call WriteField_p('dq'//trim(int2str(j)),
670c     .                reshape(dq(:,:,j),(/iip1,jmp1,llm/)))
671c      enddo
672cc$OMP END MASTER
[764]673
[985]674
[774]675c$OMP MASTER
[630]676       call VTe(VTintegre)
[774]677c$OMP END MASTER
[630]678c .P.Le Van (26/04/94  ajout de  finvpold dans l'appel d'integrd)
679c
680c-----------------------------------------------------------------------
681c   calcul des tendances physiques:
682c   -------------------------------
683c    ########   P.Le Van ( Modif le  6/02/95 )   ###########
684c
685       IF( purmats )  THEN
686          IF( itau.EQ.itaufin.AND..NOT.forward ) lafin = .TRUE.
687       ELSE
688          IF( itau+1. EQ. itaufin )              lafin = .TRUE.
689       ENDIF
[774]690
691cc$OMP END PARALLEL
692
[630]693c
694c
695       IF( apphys )  THEN
696c
697c     .......   Ajout   P.Le Van ( 17/04/96 )   ...........
698c
[774]699cc$OMP PARALLEL DEFAULT(SHARED)
700cc$OMP+         PRIVATE(rdaym_ini,rdayvrai,ijb,ije)
[764]701
702c$OMP MASTER
[630]703         call suspend_timer(timer_caldyn)
[1146]704
[1403]705        if (prt_level >= 10) then
[1146]706         write(lunout,*)
707     &   'leapfrog_p: Entree dans la physique : Iteration No ',true_itau
[1403]708        endif
[764]709c$OMP END MASTER
710
[630]711         CALL pression_p (  ip1jmp1, ap, bp, ps,  p      )
[764]712
[985]713c$OMP BARRIER
[1625]714         if (pressure_exner) then
[2021]715           CALL exner_hyb_p(  ip1jmp1, ps, p,pks, pk, pkf )
[1625]716         else
[2021]717           CALL exner_milieu_p( ip1jmp1, ps, p, pks, pk, pkf )
[1520]718         endif
[2083]719c$OMP BARRIER
[2039]720! Appel a geopot ajoute le 2014/05/08 pour garantir la convergence numerique
721! avec dyn3dmem
[2083]722      CALL geopot_p  ( ip1jmp1, teta  , pk , pks,  phis  , phi   )
723
[1279]724           jD_cur = jD_ref + day_ini - day_ref
[1626]725     $        + itau/day_step
[1676]726
727           IF (planet_type .eq."generic") THEN
728              ! AS: we make jD_cur to be pday
729              jD_cur = int(day_ini + itau/day_step)
730           ENDIF
731
[1577]732           jH_cur = jH_ref + start_time +                                &
[1626]733     &              mod(itau,day_step)/float(day_step)
[1279]734!         call ju2ymds(jD_cur+jH_cur, an, mois, jour, secondes)
[1577]735           if (jH_cur > 1.0 ) then
736             jD_cur = jD_cur +1.
737             jH_cur = jH_cur -1.
738           endif
[630]739
740c rajout debug
741c       lafin = .true.
742
743
744c   Inbterface avec les routines de phylmd (phymars ... )
745c   -----------------------------------------------------
746
747c+jld
748
[764]749c  Diagnostique de conservation de l'energie : initialisation
[630]750      IF (ip_ebil_dyn.ge.1 ) THEN
751          ztit='bil dyn'
[1146]752! Ehouarn: be careful, diagedyn is Earth-specific (includes ../phylmd/..)!
753           IF (planet_type.eq."earth") THEN
[1615]754#ifdef CPP_EARTH
[1146]755            CALL diagedyn(ztit,2,1,1,dtphys
756     &    , ucov    , vcov , ps, p ,pk , teta , q(:,:,1), q(:,:,2))
[1615]757#endif
[1146]758           ENDIF
[630]759      ENDIF
760c-jld
[764]761c$OMP BARRIER
762c$OMP MASTER
[630]763        call VTb(VThallo)
[985]764c$OMP END MASTER
765
[630]766        call SetTag(Request_physic,800)
[949]767       
[630]768        call Register_SwapFieldHallo(ucov,ucov,ip1jmp1,llm,
769     *                               jj_Nb_physic,2,2,Request_physic)
770       
771        call Register_SwapFieldHallo(vcov,vcov,ip1jm,llm,
772     *                               jj_Nb_physic,2,2,Request_physic)
773       
774        call Register_SwapFieldHallo(teta,teta,ip1jmp1,llm,
775     *                               jj_Nb_physic,2,2,Request_physic)
776       
[1279]777        call Register_SwapFieldHallo(masse,masse,ip1jmp1,llm,
778     *                               jj_Nb_physic,1,2,Request_physic)
779
[1988]780        call Register_SwapFieldHallo(ps,ps,ip1jmp1,1,
781     *                               jj_Nb_physic,2,2,Request_physic)
782
[630]783        call Register_SwapFieldHallo(p,p,ip1jmp1,llmp1,
784     *                               jj_Nb_physic,2,2,Request_physic)
785       
786        call Register_SwapFieldHallo(pk,pk,ip1jmp1,llm,
787     *                               jj_Nb_physic,2,2,Request_physic)
788       
789        call Register_SwapFieldHallo(phis,phis,ip1jmp1,1,
790     *                               jj_Nb_physic,2,2,Request_physic)
791       
792        call Register_SwapFieldHallo(phi,phi,ip1jmp1,llm,
793     *                               jj_Nb_physic,2,2,Request_physic)
794       
795        call Register_SwapFieldHallo(w,w,ip1jmp1,llm,
796     *                               jj_Nb_physic,2,2,Request_physic)
797       
[949]798c        call SetDistrib(jj_nb_vanleer)
[1146]799        do j=1,nqtot
[630]800 
801          call Register_SwapFieldHallo(q(1,1,j),q(1,1,j),ip1jmp1,llm,
802     *                               jj_Nb_physic,2,2,Request_physic)
803        enddo
[960]804
[630]805        call Register_SwapFieldHallo(flxw,flxw,ip1jmp1,llm,
806     *                               jj_Nb_physic,2,2,Request_physic)
[949]807       
[630]808        call SendRequest(Request_Physic)
[985]809c$OMP BARRIER
[630]810        call WaitRequest(Request_Physic)       
[985]811
812c$OMP BARRIER
813c$OMP MASTER
814        call SetDistrib(jj_nb_Physic)
[949]815        call VTe(VThallo)
816       
817        call VTb(VTphysiq)
[764]818c$OMP END MASTER
819c$OMP BARRIER
820
[949]821cc$OMP MASTER       
[764]822c      call WriteField_p('ucovfi',reshape(ucov,(/iip1,jmp1,llm/)))
823c      call WriteField_p('vcovfi',reshape(vcov,(/iip1,jjm,llm/)))
824c      call WriteField_p('tetafi',reshape(teta,(/iip1,jmp1,llm/)))
825c      call WriteField_p('pfi',reshape(p,(/iip1,jmp1,llmp1/)))
826c      call WriteField_p('pkfi',reshape(pk,(/iip1,jmp1,llm/)))
827cc$OMP END MASTER
828cc$OMP BARRIER
[985]829!        CALL FTRACE_REGION_BEGIN("calfis")
[1279]830        CALL calfis_p(lafin ,jD_cur, jH_cur,
[630]831     $               ucov,vcov,teta,q,masse,ps,p,pk,phis,phi ,
[960]832     $               du,dv,dteta,dq,
[630]833     $               flxw,
834     $               clesphy0, dufi,dvfi,dtetafi,dqfi,dpfi  )
[985]835!        CALL FTRACE_REGION_END("calfis")
[630]836        ijb=ij_begin
837        ije=ij_end 
838        if ( .not. pole_nord) then
[764]839c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
840          DO l=1,llm
841          dufi_tmp(1:iip1,l)   = dufi(ijb:ijb+iim,l)
842          dvfi_tmp(1:iip1,l)   = dvfi(ijb:ijb+iim,l) 
843          dtetafi_tmp(1:iip1,l)= dtetafi(ijb:ijb+iim,l) 
844          dqfi_tmp(1:iip1,l,:) = dqfi(ijb:ijb+iim,l,:) 
845          ENDDO
846c$OMP END DO NOWAIT
847
848c$OMP MASTER
[630]849          dpfi_tmp(1:iip1)     = dpfi(ijb:ijb+iim) 
[764]850c$OMP END MASTER
[1146]851        endif ! of if ( .not. pole_nord)
[764]852
853c$OMP BARRIER
854c$OMP MASTER
[949]855        call SetDistrib(jj_nb_Physic_bis)
[630]856
857        call VTb(VThallo)
[985]858c$OMP END MASTER
859c$OMP BARRIER
[630]860 
861        call Register_Hallo(dufi,ip1jmp1,llm,
862     *                      1,0,0,1,Request_physic)
863       
864        call Register_Hallo(dvfi,ip1jm,llm,
865     *                      1,0,0,1,Request_physic)
866       
867        call Register_Hallo(dtetafi,ip1jmp1,llm,
868     *                      1,0,0,1,Request_physic)
869
870        call Register_Hallo(dpfi,ip1jmp1,1,
871     *                      1,0,0,1,Request_physic)
872
[1146]873        do j=1,nqtot
[630]874          call Register_Hallo(dqfi(1,1,j),ip1jmp1,llm,
875     *                        1,0,0,1,Request_physic)
876        enddo
877       
878        call SendRequest(Request_Physic)
[985]879c$OMP BARRIER
[630]880        call WaitRequest(Request_Physic)
881             
[985]882c$OMP BARRIER
883c$OMP MASTER
[630]884        call VTe(VThallo)
885 
886        call SetDistrib(jj_nb_Physic)
[764]887c$OMP END MASTER
[949]888c$OMP BARRIER       
889                ijb=ij_begin
890        if (.not. pole_nord) then
891       
[764]892c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
893          DO l=1,llm
894            dufi(ijb:ijb+iim,l) = dufi(ijb:ijb+iim,l)+dufi_tmp(1:iip1,l)
895            dvfi(ijb:ijb+iim,l) = dvfi(ijb:ijb+iim,l)+dvfi_tmp(1:iip1,l)
896            dtetafi(ijb:ijb+iim,l) = dtetafi(ijb:ijb+iim,l)
897     &                              +dtetafi_tmp(1:iip1,l)
898            dqfi(ijb:ijb+iim,l,:) = dqfi(ijb:ijb+iim,l,:)
899     &                              + dqfi_tmp(1:iip1,l,:)
900          ENDDO
901c$OMP END DO NOWAIT
902
903c$OMP MASTER
[630]904          dpfi(ijb:ijb+iim)   = dpfi(ijb:ijb+iim)+ dpfi_tmp(1:iip1)
[764]905c$OMP END MASTER
[949]906         
[1146]907        endif ! of if (.not. pole_nord)
[764]908c$OMP BARRIER
[949]909cc$OMP MASTER       
[630]910c      call WriteField_p('dufi',reshape(dufi,(/iip1,jmp1,llm/)))
911c      call WriteField_p('dvfi',reshape(dvfi,(/iip1,jjm,llm/)))
912c      call WriteField_p('dtetafi',reshape(dtetafi,(/iip1,jmp1,llm/)))
913c      call WriteField_p('dpfi',reshape(dpfi,(/iip1,jmp1/)))
[764]914cc$OMP END MASTER
[630]915c     
[1146]916c      do j=1,nqtot
[630]917c        call WriteField_p('dqfi'//trim(int2str(j)),
918c     .                reshape(dqfi(:,:,j),(/iip1,jmp1,llm/)))
919c      enddo
920
921c      ajout des tendances physiques:
922c      ------------------------------
[1146]923          CALL addfi_p( dtphys, leapf, forward   ,
[630]924     $                  ucov, vcov, teta , q   ,ps ,
925     $                 dufi, dvfi, dtetafi , dqfi ,dpfi  )
[1987]926          ! since addfi updates ps(), also update p(), masse() and pk()
927          CALL pression_p(ip1jmp1,ap,bp,ps,p)
928c$OMP BARRIER
929          CALL massdair_p(p,masse)
930c$OMP BARRIER
931          if (pressure_exner) then
[2021]932            CALL exner_hyb_p(ip1jmp1,ps,p,pks,pk,pkf)
[1987]933          else
[2021]934            CALL exner_milieu_p(ip1jmp1,ps,p,pks,pk,pkf)
[1987]935          endif
936c$OMP BARRIER
937         
[1793]938         IF (ok_strato) THEN
939           CALL top_bound_p(vcov,ucov,teta,masse,dtphys)
940         ENDIF
941       
[764]942c$OMP BARRIER
943c$OMP MASTER
[630]944        call VTe(VTphysiq)
945
946        call VTb(VThallo)
[985]947c$OMP END MASTER
[630]948
949        call SetTag(Request_physic,800)
950        call Register_SwapField(ucov,ucov,ip1jmp1,llm,
951     *                               jj_Nb_caldyn,Request_physic)
952       
953        call Register_SwapField(vcov,vcov,ip1jm,llm,
954     *                               jj_Nb_caldyn,Request_physic)
955       
956        call Register_SwapField(teta,teta,ip1jmp1,llm,
957     *                               jj_Nb_caldyn,Request_physic)
958       
[1279]959        call Register_SwapField(masse,masse,ip1jmp1,llm,
960     *                               jj_Nb_caldyn,Request_physic)
961
[1988]962        call Register_SwapField(ps,ps,ip1jmp1,1,
963     *                               jj_Nb_caldyn,Request_physic)
964
[630]965        call Register_SwapField(p,p,ip1jmp1,llmp1,
966     *                               jj_Nb_caldyn,Request_physic)
967       
968        call Register_SwapField(pk,pk,ip1jmp1,llm,
969     *                               jj_Nb_caldyn,Request_physic)
970       
971        call Register_SwapField(phis,phis,ip1jmp1,1,
972     *                               jj_Nb_caldyn,Request_physic)
973       
974        call Register_SwapField(phi,phi,ip1jmp1,llm,
975     *                               jj_Nb_caldyn,Request_physic)
976       
977        call Register_SwapField(w,w,ip1jmp1,llm,
978     *                               jj_Nb_caldyn,Request_physic)
979
[1146]980        do j=1,nqtot
[630]981       
982          call Register_SwapField(q(1,1,j),q(1,1,j),ip1jmp1,llm,
983     *                               jj_Nb_caldyn,Request_physic)
984       
985        enddo
986
987        call SendRequest(Request_Physic)
[985]988c$OMP BARRIER
[630]989        call WaitRequest(Request_Physic)     
990
[985]991c$OMP BARRIER
992c$OMP MASTER
993       call VTe(VThallo)
994       call SetDistrib(jj_Nb_caldyn)
[764]995c$OMP END MASTER
996c$OMP BARRIER
[630]997c
[764]998c  Diagnostique de conservation de l'energie : difference
[630]999      IF (ip_ebil_dyn.ge.1 ) THEN
1000          ztit='bil phys'
1001          CALL diagedyn(ztit,2,1,1,dtphys
1002     e  , ucov    , vcov , ps, p ,pk , teta , q(:,:,1), q(:,:,2))
1003      ENDIF
[764]1004
1005cc$OMP MASTER     
1006c      if (debug) then
1007c       call WriteField_p('ucovfi',reshape(ucov,(/iip1,jmp1,llm/)))
1008c       call WriteField_p('vcovfi',reshape(vcov,(/iip1,jjm,llm/)))
1009c       call WriteField_p('tetafi',reshape(teta,(/iip1,jmp1,llm/)))
1010c      endif
1011cc$OMP END MASTER
1012
[630]1013
[1146]1014c-jld
1015c$OMP MASTER
1016         call resume_timer(timer_caldyn)
1017         if (FirstPhysic) then
1018           ok_start_timer=.TRUE.
1019           FirstPhysic=.false.
1020         endif
1021c$OMP END MASTER
1022       ENDIF ! of IF( apphys )
1023
1024      IF(iflag_phys.EQ.2) THEN ! "Newtonian" case
[1454]1025!   Academic case : Simple friction and Newtonan relaxation
1026!   -------------------------------------------------------
[1845]1027c$OMP MASTER
1028         if (FirstPhysic) then
1029           ok_start_timer=.TRUE.
1030           FirstPhysic=.false.
1031         endif
1032c$OMP END MASTER
1033
[630]1034       ijb=ij_begin
1035       ije=ij_end
[1403]1036!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
1037       do l=1,llm
[1454]1038        teta(ijb:ije,l)=teta(ijb:ije,l)-dtvr*
1039     &         (teta(ijb:ije,l)-tetarappel(ijb:ije,l))*
1040     &                  (knewt_g+knewt_t(l)*clat4(ijb:ije))
1041       enddo ! of do l=1,llm
[1403]1042!$OMP END DO
[630]1043
[1505]1044!$OMP MASTER
1045       if (planet_type.eq."giant") then
1046         ! add an intrinsic heat flux at the base of the atmosphere
1047         teta(ijb:ije,1) = teta(ijb:ije,1)
1048     &        + dtvr * aire(ijb:ije) * ihf / cpp / masse(ijb:ije,1)
1049       endif
1050!$OMP END MASTER
1051!$OMP BARRIER
1052
[630]1053       call Register_Hallo(ucov,ip1jmp1,llm,0,1,1,0,Request_Physic)
1054       call Register_Hallo(vcov,ip1jm,llm,1,1,1,1,Request_Physic)
1055       call SendRequest(Request_Physic)
[1279]1056c$OMP BARRIER
[630]1057       call WaitRequest(Request_Physic)     
[1403]1058c$OMP BARRIER
[1454]1059       call friction_p(ucov,vcov,dtvr)
[1403]1060!$OMP BARRIER
[1454]1061
1062        ! Sponge layer (if any)
1063        IF (ok_strato) THEN
[1793]1064          CALL top_bound_p(vcov,ucov,teta,masse,dtvr)
[1454]1065!$OMP BARRIER
1066        ENDIF ! of IF (ok_strato)
[1146]1067      ENDIF ! of IF(iflag_phys.EQ.2)
[630]1068
1069
[985]1070        CALL pression_p ( ip1jmp1, ap, bp, ps, p                  )
[774]1071c$OMP BARRIER
[1625]1072        if (pressure_exner) then
[2021]1073          CALL exner_hyb_p( ip1jmp1, ps, p, pks, pk, pkf )
[1625]1074        else
[2021]1075          CALL exner_milieu_p( ip1jmp1, ps, p, pks, pk, pkf )
[1520]1076        endif
[774]1077c$OMP BARRIER
[1987]1078        CALL massdair_p(p,masse)
1079c$OMP BARRIER
[630]1080
[774]1081cc$OMP END PARALLEL
[630]1082
1083c-----------------------------------------------------------------------
1084c   dissipation horizontale et verticale  des petites echelles:
1085c   ----------------------------------------------------------
1086
1087      IF(apdiss) THEN
[774]1088cc$OMP  PARALLEL DEFAULT(SHARED)
1089cc$OMP+          PRIVATE(ijb,ije,tppn,tpn,tpps,tps)
[764]1090c$OMP MASTER
[630]1091        call suspend_timer(timer_caldyn)
[949]1092       
1093c       print*,'Entree dans la dissipation : Iteration No ',true_itau
[630]1094c   calcul de l'energie cinetique avant dissipation
[949]1095c       print *,'Passage dans la dissipation'
[630]1096
1097        call VTb(VThallo)
[764]1098c$OMP END MASTER
[630]1099
[764]1100c$OMP BARRIER
[985]1101
[630]1102        call Register_SwapFieldHallo(ucov,ucov,ip1jmp1,llm,
1103     *                          jj_Nb_dissip,1,1,Request_dissip)
1104
1105        call Register_SwapFieldHallo(vcov,vcov,ip1jm,llm,
1106     *                          jj_Nb_dissip,1,1,Request_dissip)
1107
1108        call Register_SwapField(teta,teta,ip1jmp1,llm,
1109     *                          jj_Nb_dissip,Request_dissip)
1110
1111        call Register_SwapField(p,p,ip1jmp1,llmp1,
1112     *                          jj_Nb_dissip,Request_dissip)
1113
1114        call Register_SwapField(pk,pk,ip1jmp1,llm,
1115     *                          jj_Nb_dissip,Request_dissip)
1116
1117        call SendRequest(Request_dissip)       
[985]1118c$OMP BARRIER
[630]1119        call WaitRequest(Request_dissip)       
[985]1120
1121c$OMP BARRIER
1122c$OMP MASTER
[630]1123        call SetDistrib(jj_Nb_dissip)
[949]1124        call VTe(VThallo)
[630]1125        call VTb(VTdissipation)
[949]1126        call start_timer(timer_dissip)
[764]1127c$OMP END MASTER
1128c$OMP BARRIER
1129
[630]1130        call covcont_p(llm,ucov,vcov,ucont,vcont)
1131        call enercin_p(vcov,ucov,vcont,ucont,ecin0)
1132
1133c   dissipation
1134
[985]1135!        CALL FTRACE_REGION_BEGIN("dissip")
[630]1136        CALL dissip_p(vcov,ucov,teta,p,dvdis,dudis,dtetadis)
[985]1137!        CALL FTRACE_REGION_END("dissip")
[764]1138         
[949]1139        ijb=ij_begin
1140        ije=ij_end
1141c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)       
1142        DO l=1,llm
1143          ucov(ijb:ije,l)=ucov(ijb:ije,l)+dudis(ijb:ije,l)
[764]1144        ENDDO
[949]1145c$OMP END DO NOWAIT       
1146        if (pole_sud) ije=ije-iip1
1147c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)       
1148        DO l=1,llm
1149          vcov(ijb:ije,l)=vcov(ijb:ije,l)+dvdis(ijb:ije,l)
[764]1150        ENDDO
[949]1151c$OMP END DO NOWAIT       
[764]1152
[630]1153c       teta=teta+dtetadis
1154
1155
1156c------------------------------------------------------------------------
1157        if (dissip_conservative) then
1158C       On rajoute la tendance due a la transform. Ec -> E therm. cree
1159C       lors de la dissipation
[764]1160c$OMP BARRIER
1161c$OMP MASTER
[630]1162            call suspend_timer(timer_dissip)
[949]1163            call VTb(VThallo)
[985]1164c$OMP END MASTER
[630]1165            call Register_Hallo(ucov,ip1jmp1,llm,1,1,1,1,Request_Dissip)
1166            call Register_Hallo(vcov,ip1jm,llm,1,1,1,1,Request_Dissip)
1167            call SendRequest(Request_Dissip)
[985]1168c$OMP BARRIER
[630]1169            call WaitRequest(Request_Dissip)
[985]1170c$OMP MASTER
[630]1171            call VTe(VThallo)
1172            call resume_timer(timer_dissip)
[764]1173c$OMP END MASTER
[949]1174c$OMP BARRIER           
[630]1175            call covcont_p(llm,ucov,vcov,ucont,vcont)
1176            call enercin_p(vcov,ucov,vcont,ucont,ecin)
1177           
[949]1178            ijb=ij_begin
1179            ije=ij_end
1180c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)           
1181            do l=1,llm
1182              do ij=ijb,ije
1183                dtetaecdt(ij,l)= (ecin0(ij,l)-ecin(ij,l))/ pk(ij,l)
1184                dtetadis(ij,l)=dtetadis(ij,l)+dtetaecdt(ij,l)
[630]1185              enddo
[949]1186            enddo
1187c$OMP END DO NOWAIT           
[1403]1188       endif ! of if (dissip_conservative)
[630]1189
1190       ijb=ij_begin
1191       ije=ij_end
[949]1192c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)           
1193         do l=1,llm
1194           do ij=ijb,ije
[630]1195              teta(ij,l)=teta(ij,l)+dtetadis(ij,l)
[949]1196           enddo
1197         enddo
1198c$OMP END DO NOWAIT         
[630]1199c------------------------------------------------------------------------
1200
1201
1202c    .......        P. Le Van (  ajout  le 17/04/96  )   ...........
1203c   ...      Calcul de la valeur moyenne, unique de h aux poles  .....
1204c
1205
1206        ijb=ij_begin
1207        ije=ij_end
1208         
1209        if (pole_nord) then
[764]1210c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
[630]1211          DO l  =  1, llm
1212            DO ij =  1,iim
1213             tppn(ij)  = aire(  ij    ) * teta(  ij    ,l)
1214            ENDDO
1215             tpn  = SSUM(iim,tppn,1)/apoln
1216
1217            DO ij = 1, iip1
1218             teta(  ij    ,l) = tpn
1219            ENDDO
1220          ENDDO
[764]1221c$OMP END DO NOWAIT
1222
[1614]1223         if (1 == 0) then
1224!!! Ehouarn: lines here 1) kill 1+1=2 in the dynamics
1225!!!                     2) should probably not be here anyway
1226!!! but are kept for those who would want to revert to previous behaviour
[764]1227c$OMP MASTER               
[630]1228          DO ij =  1,iim
1229            tppn(ij)  = aire(  ij    ) * ps (  ij    )
1230          ENDDO
1231            tpn  = SSUM(iim,tppn,1)/apoln
1232 
1233          DO ij = 1, iip1
1234            ps(  ij    ) = tpn
1235          ENDDO
[764]1236c$OMP END MASTER
[1614]1237         endif ! of if (1 == 0)
1238        endif ! of of (pole_nord)
[630]1239       
1240        if (pole_sud) then
[764]1241c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
[630]1242          DO l  =  1, llm
1243            DO ij =  1,iim
1244             tpps(ij)  = aire(ij+ip1jm) * teta(ij+ip1jm,l)
1245            ENDDO
1246             tps  = SSUM(iim,tpps,1)/apols
1247
1248            DO ij = 1, iip1
1249             teta(ij+ip1jm,l) = tps
1250            ENDDO
1251          ENDDO
[764]1252c$OMP END DO NOWAIT
1253
[1614]1254         if (1 == 0) then
1255!!! Ehouarn: lines here 1) kill 1+1=2 in the dynamics
1256!!!                     2) should probably not be here anyway
1257!!! but are kept for those who would want to revert to previous behaviour
[764]1258c$OMP MASTER               
[630]1259          DO ij =  1,iim
1260            tpps(ij)  = aire(ij+ip1jm) * ps (ij+ip1jm)
1261          ENDDO
1262            tps  = SSUM(iim,tpps,1)/apols
1263 
1264          DO ij = 1, iip1
1265            ps(ij+ip1jm) = tps
1266          ENDDO
[764]1267c$OMP END MASTER
[1614]1268         endif ! of if (1 == 0)
1269        endif ! of if (pole_sud)
[630]1270
[764]1271
1272c$OMP BARRIER
1273c$OMP MASTER
[630]1274        call VTe(VTdissipation)
1275
1276        call stop_timer(timer_dissip)
[949]1277       
[630]1278        call VTb(VThallo)
[985]1279c$OMP END MASTER
[630]1280        call Register_SwapField(ucov,ucov,ip1jmp1,llm,
1281     *                          jj_Nb_caldyn,Request_dissip)
1282
1283        call Register_SwapField(vcov,vcov,ip1jm,llm,
1284     *                          jj_Nb_caldyn,Request_dissip)
1285
1286        call Register_SwapField(teta,teta,ip1jmp1,llm,
1287     *                          jj_Nb_caldyn,Request_dissip)
1288
1289        call Register_SwapField(p,p,ip1jmp1,llmp1,
1290     *                          jj_Nb_caldyn,Request_dissip)
1291
1292        call Register_SwapField(pk,pk,ip1jmp1,llm,
1293     *                          jj_Nb_caldyn,Request_dissip)
1294
1295        call SendRequest(Request_dissip)       
[985]1296c$OMP BARRIER
[630]1297        call WaitRequest(Request_dissip)       
[985]1298
1299c$OMP BARRIER
1300c$OMP MASTER
[630]1301        call SetDistrib(jj_Nb_caldyn)
1302        call VTe(VThallo)
1303        call resume_timer(timer_caldyn)
[961]1304c        print *,'fin dissipation'
[764]1305c$OMP END MASTER
[985]1306c$OMP BARRIER
[1403]1307      END IF ! of IF(apdiss)
[630]1308
[774]1309cc$OMP END PARALLEL
1310
[630]1311c ajout debug
1312c              IF( lafin ) then 
1313c                abort_message = 'Simulation finished'
1314c                call abort_gcm(modname,abort_message,0)
1315c              ENDIF
1316       
1317c   ********************************************************************
1318c   ********************************************************************
1319c   .... fin de l'integration dynamique  et physique pour le pas itau ..
1320c   ********************************************************************
1321c   ********************************************************************
1322
1323c   preparation du pas d'integration suivant  ......
1324cym      call WriteField('ucov',reshape(ucov,(/iip1,jmp1,llm/)))
1325cym      call WriteField('vcov',reshape(vcov,(/iip1,jjm,llm/)))
[774]1326c$OMP MASTER     
[630]1327      call stop_timer(timer_caldyn)
[774]1328c$OMP END MASTER
[630]1329      IF (itau==itaumax) then
[774]1330c$OMP MASTER
[630]1331            call allgather_timer_average
1332
1333      if (mpi_rank==0) then
1334       
1335        print *,'*********************************'
[949]1336        print *,'******    TIMER CALDYN     ******'
1337        do i=0,mpi_size-1
1338          print *,'proc',i,' :   Nb Bandes  :',jj_nb_caldyn(i),
[630]1339     &            '  : temps moyen :',
1340     &             timer_average(jj_nb_caldyn(i),timer_caldyn,i)
1341        enddo
1342     
1343        print *,'*********************************'
[949]1344        print *,'******    TIMER VANLEER    ******'
1345        do i=0,mpi_size-1
1346          print *,'proc',i,' :   Nb Bandes  :',jj_nb_vanleer(i),
[630]1347     &            '  : temps moyen :',
1348     &             timer_average(jj_nb_vanleer(i),timer_vanleer,i)
1349        enddo
1350     
1351        print *,'*********************************'
[949]1352        print *,'******    TIMER DISSIP    ******'
1353        do i=0,mpi_size-1
1354          print *,'proc',i,' :   Nb Bandes  :',jj_nb_dissip(i),
[630]1355     &            '  : temps moyen :',
1356     &             timer_average(jj_nb_dissip(i),timer_dissip,i)
1357        enddo
[949]1358       
1359        print *,'*********************************'
1360        print *,'******    TIMER PHYSIC    ******'
1361        do i=0,mpi_size-1
1362          print *,'proc',i,' :   Nb Bandes  :',jj_nb_physic(i),
[630]1363     &            '  : temps moyen :',
1364     &             timer_average(jj_nb_physic(i),timer_physic,i)
1365        enddo
[949]1366       
[630]1367      endif 
1368     
1369      print *,'Taille du Buffer MPI (REAL*8)',MaxBufferSize
1370      print *,'Taille du Buffer MPI utilise (REAL*8)',MaxBufferSize_Used
1371      print *, 'Temps total ecoule sur la parallelisation :',DiffTime()
1372      print *, 'Temps CPU ecoule sur la parallelisation :',DiffCpuTime()
[985]1373      CALL print_filtre_timer
[1279]1374      call fin_getparam
[630]1375        call finalize_parallel
[774]1376c$OMP END MASTER
[985]1377c$OMP BARRIER
[949]1378        RETURN
[1885]1379      ENDIF ! of IF (itau==itaumax)
[630]1380     
1381      IF ( .NOT.purmats ) THEN
1382c       ........................................................
1383c       ..............  schema matsuno + leapfrog  ..............
1384c       ........................................................
1385
1386            IF(forward. OR. leapf) THEN
1387              itau= itau + 1
[1279]1388!              iday= day_ini+itau/day_step
[1403]1389!              time= REAL(itau-(iday-day_ini)*day_step)/day_step+time_0
[1279]1390!                IF(time.GT.1.) THEN
1391!                  time = time-1.
1392!                  iday = iday+1
1393!                ENDIF
[630]1394            ENDIF
1395
1396
[1286]1397            IF( itau. EQ. itaufinp1 ) then
[630]1398
[1286]1399              if (flag_verif) then
1400                write(79,*) 'ucov',ucov
1401                write(80,*) 'vcov',vcov
1402                write(81,*) 'teta',teta
1403                write(82,*) 'ps',ps
1404                write(83,*) 'q',q
1405                WRITE(85,*) 'q1 = ',q(:,:,1)
1406                WRITE(86,*) 'q3 = ',q(:,:,3)
1407              endif
1408 
1409
[774]1410c$OMP MASTER
[1279]1411              call fin_getparam
[2171]1412              call finalize_parallel
[774]1413c$OMP END MASTER
[630]1414              abort_message = 'Simulation finished'
1415              call abort_gcm(modname,abort_message,0)
[985]1416              RETURN
[630]1417            ENDIF
1418c-----------------------------------------------------------------------
1419c   ecriture du fichier histoire moyenne:
1420c   -------------------------------------
1421
1422            IF(MOD(itau,iperiod).EQ.0 .OR. itau.EQ.itaufin) THEN
[774]1423c$OMP BARRIER
[630]1424               IF(itau.EQ.itaufin) THEN
1425                  iav=1
1426               ELSE
1427                  iav=0
1428               ENDIF
1429#ifdef CPP_IOIPSL
[1146]1430             IF (ok_dynzon) THEN
1431              CALL bilan_dyn_p(2,dtvr*iperiod,dtvr*day_step*periodav,
1432     ,             ps,masse,pk,pbaru,pbarv,teta,phi,ucov,vcov,q)
1433              ENDIF !ok_dynzon
[630]1434#endif
[1403]1435               IF (ok_dyn_ave) THEN
1436!$OMP MASTER
1437#ifdef CPP_IOIPSL
1438! Ehouarn: Gather fields and make master send to output
1439                call Gather_Field(vcov,ip1jm,llm,0)
1440                call Gather_Field(ucov,ip1jmp1,llm,0)
1441                call Gather_Field(teta,ip1jmp1,llm,0)
1442                call Gather_Field(pk,ip1jmp1,llm,0)
1443                call Gather_Field(phi,ip1jmp1,llm,0)
1444                do iq=1,nqtot
1445                  call Gather_Field(q(1,1,iq),ip1jmp1,llm,0)
1446                enddo
1447                call Gather_Field(masse,ip1jmp1,llm,0)
1448                call Gather_Field(ps,ip1jmp1,1,0)
1449                call Gather_Field(phis,ip1jmp1,1,0)
1450                if (mpi_rank==0) then
1451                 CALL writedynav(itau,vcov,
1452     &                 ucov,teta,pk,phi,q,masse,ps,phis)
1453                endif
1454#endif
1455!$OMP END MASTER
1456               ENDIF ! of IF (ok_dyn_ave)
1457            ENDIF ! of IF((MOD(itau,iperiod).EQ.0).OR.(itau.EQ.itaufin))
[630]1458
1459c-----------------------------------------------------------------------
1460c   ecriture de la bande histoire:
1461c   ------------------------------
1462
[1403]1463            IF( MOD(itau,iecri).EQ.0) THEN
1464             ! Ehouarn: output only during LF or Backward Matsuno
1465             if (leapf.or.(.not.leapf.and.(.not.forward))) then
[774]1466c$OMP BARRIER
1467c$OMP MASTER
[1146]1468              CALL geopot_p(ip1jmp1,teta,pk,pks,phis,phi)
[774]1469       
[949]1470cym        unat=0.
1471       
[1146]1472              ijb=ij_begin
1473              ije=ij_end
[949]1474       
[1146]1475              if (pole_nord) then
1476                ijb=ij_begin+iip1
1477                unat(1:iip1,:)=0.
1478              endif
[949]1479       
[1146]1480              if (pole_sud) then
1481                ije=ij_end-iip1
1482                unat(ij_end-iip1+1:ij_end,:)=0.
1483              endif
[949]1484           
[1146]1485              do l=1,llm
1486                unat(ijb:ije,l)=ucov(ijb:ije,l)/cu(ijb:ije)
1487              enddo
[630]1488
[1146]1489              ijb=ij_begin
1490              ije=ij_end
1491              if (pole_sud) ije=ij_end-iip1
[949]1492       
[1146]1493              do l=1,llm
1494                vnat(ijb:ije,l)=vcov(ijb:ije,l)/cv(ijb:ije)
1495              enddo
[949]1496       
[630]1497#ifdef CPP_IOIPSL
[1403]1498              if (ok_dyn_ins) then
1499! Ehouarn: Gather fields and make master write to output
1500                call Gather_Field(vcov,ip1jm,llm,0)
1501                call Gather_Field(ucov,ip1jmp1,llm,0)
1502                call Gather_Field(teta,ip1jmp1,llm,0)
1503                call Gather_Field(phi,ip1jmp1,llm,0)
1504                do iq=1,nqtot
1505                  call Gather_Field(q(1,1,iq),ip1jmp1,llm,0)
1506                enddo
1507                call Gather_Field(masse,ip1jmp1,llm,0)
1508                call Gather_Field(ps,ip1jmp1,1,0)
1509                call Gather_Field(phis,ip1jmp1,1,0)
1510                if (mpi_rank==0) then
1511                 CALL writehist(itau,vcov,ucov,teta,phi,q,masse,ps,phis)
1512                endif
[1279]1513!              CALL writehist_p(histid,histvid, itau,vcov,
1514!     &                         ucov,teta,phi,q,masse,ps,phis)
[1403]1515! or use writefield_p
1516!      call WriteField_p('ucov',reshape(ucov,(/iip1,jmp1,llm/)))
1517!      call WriteField_p('vcov',reshape(vcov,(/iip1,jjm,llm/)))
1518!      call WriteField_p('teta',reshape(teta,(/iip1,jmp1,llm/)))
1519!      call WriteField_p('ps',reshape(ps,(/iip1,jmp1/)))
1520              endif ! of if (ok_dyn_ins)
[630]1521#endif
[1146]1522! For some Grads outputs of fields
1523              if (output_grads_dyn) then
1524! Ehouarn: hope this works the way I think it does:
1525                  call Gather_Field(unat,ip1jmp1,llm,0)
1526                  call Gather_Field(vnat,ip1jm,llm,0)
1527                  call Gather_Field(teta,ip1jmp1,llm,0)
1528                  call Gather_Field(ps,ip1jmp1,1,0)
1529                  do iq=1,nqtot
1530                    call Gather_Field(q(1,1,iq),ip1jmp1,llm,0)
1531                  enddo
1532                  if (mpi_rank==0) then
1533#include "write_grads_dyn.h"
1534                  endif
1535              endif ! of if (output_grads_dyn)
[774]1536c$OMP END MASTER
[1403]1537             endif ! of if (leapf.or.(.not.leapf.and.(.not.forward)))
[1146]1538            ENDIF ! of IF(MOD(itau,iecri).EQ.0)
[630]1539
1540            IF(itau.EQ.itaufin) THEN
1541
[774]1542c$OMP BARRIER
1543c$OMP MASTER
[630]1544
[1454]1545!              if (planet_type.eq."earth") then
[1146]1546! Write an Earth-format restart file
1547                CALL dynredem1_p("restart.nc",0.0,
1548     &                           vcov,ucov,teta,q,masse,ps)
[1454]1549!              endif ! of if (planet_type.eq."earth")
[630]1550
[1279]1551!              CLOSE(99)
[774]1552c$OMP END MASTER
[1146]1553            ENDIF ! of IF (itau.EQ.itaufin)
[630]1554
1555c-----------------------------------------------------------------------
1556c   gestion de l'integration temporelle:
1557c   ------------------------------------
1558
1559            IF( MOD(itau,iperiod).EQ.0 )    THEN
1560                    GO TO 1
1561            ELSE IF ( MOD(itau-1,iperiod). EQ. 0 ) THEN
1562
1563                   IF( forward )  THEN
1564c      fin du pas forward et debut du pas backward
1565
1566                      forward = .FALSE.
1567                        leapf = .FALSE.
1568                           GO TO 2
1569
1570                   ELSE
1571c      fin du pas backward et debut du premier pas leapfrog
1572
1573                        leapf =  .TRUE.
1574                        dt  =  2.*dtvr
1575                        GO TO 2
1576                   END IF
1577            ELSE
1578
1579c      ......   pas leapfrog  .....
1580
1581                 leapf = .TRUE.
1582                 dt  = 2.*dtvr
1583                 GO TO 2
[1146]1584            END IF ! of IF (MOD(itau,iperiod).EQ.0)
1585                   !    ELSEIF (MOD(itau-1,iperiod).EQ.0)
[630]1586
1587
[1146]1588      ELSE ! of IF (.not.purmats)
1589
[630]1590c       ........................................................
1591c       ..............       schema  matsuno        ...............
1592c       ........................................................
1593            IF( forward )  THEN
1594
1595             itau =  itau + 1
[1279]1596!             iday = day_ini+itau/day_step
[1403]1597!             time = REAL(itau-(iday-day_ini)*day_step)/day_step+time_0
[1279]1598!
1599!                  IF(time.GT.1.) THEN
1600!                   time = time-1.
1601!                   iday = iday+1
1602!                  ENDIF
[630]1603
1604               forward =  .FALSE.
1605               IF( itau. EQ. itaufinp1 ) then 
[774]1606c$OMP MASTER
[1279]1607                 call fin_getparam
[949]1608                 call finalize_parallel
[774]1609c$OMP END MASTER
[630]1610                 abort_message = 'Simulation finished'
1611                 call abort_gcm(modname,abort_message,0)
[985]1612                 RETURN
[630]1613               ENDIF
1614               GO TO 2
1615
[1403]1616            ELSE ! of IF(forward) i.e. backward step
[630]1617
[1146]1618              IF(MOD(itau,iperiod).EQ.0 .OR. itau.EQ.itaufin) THEN
[630]1619               IF(itau.EQ.itaufin) THEN
1620                  iav=1
1621               ELSE
1622                  iav=0
1623               ENDIF
1624#ifdef CPP_IOIPSL
[1146]1625               IF (ok_dynzon) THEN
1626               CALL bilan_dyn_p(2,dtvr*iperiod,dtvr*day_step*periodav,
[985]1627     ,           ps,masse,pk,pbaru,pbarv,teta,phi,ucov,vcov,q)
[1146]1628               END IF !ok_dynzon
[630]1629#endif
[1403]1630               IF (ok_dyn_ave) THEN
1631!$OMP MASTER
1632#ifdef CPP_IOIPSL
1633! Ehouarn: Gather fields and make master send to output
1634                call Gather_Field(vcov,ip1jm,llm,0)
1635                call Gather_Field(ucov,ip1jmp1,llm,0)
1636                call Gather_Field(teta,ip1jmp1,llm,0)
1637                call Gather_Field(pk,ip1jmp1,llm,0)
1638                call Gather_Field(phi,ip1jmp1,llm,0)
1639                do iq=1,nqtot
1640                  call Gather_Field(q(1,1,iq),ip1jmp1,llm,0)
1641                enddo
1642                call Gather_Field(masse,ip1jmp1,llm,0)
1643                call Gather_Field(ps,ip1jmp1,1,0)
1644                call Gather_Field(phis,ip1jmp1,1,0)
1645                if (mpi_rank==0) then
1646                 CALL writedynav(itau,vcov,
1647     &                 ucov,teta,pk,phi,q,masse,ps,phis)
1648                endif
1649#endif
1650!$OMP END MASTER
1651               ENDIF ! of IF (ok_dyn_ave)
1652
[1146]1653              ENDIF ! of IF(MOD(itau,iperiod).EQ.0 .OR. itau.EQ.itaufin)
[630]1654
[1146]1655
[1403]1656               IF(MOD(itau,iecri         ).EQ.0) THEN
1657c              IF(MOD(itau,iecri*day_step).EQ.0) THEN
[774]1658c$OMP BARRIER
1659c$OMP MASTER
[1146]1660                CALL geopot_p(ip1jmp1,teta,pk,pks,phis,phi)
[630]1661
1662cym        unat=0.
[1146]1663                ijb=ij_begin
1664                ije=ij_end
[949]1665       
[1146]1666                if (pole_nord) then
1667                  ijb=ij_begin+iip1
1668                  unat(1:iip1,:)=0.
1669                endif
[949]1670       
[1146]1671                if (pole_sud) then
1672                  ije=ij_end-iip1
1673                  unat(ij_end-iip1+1:ij_end,:)=0.
1674                endif
[949]1675           
[1146]1676                do l=1,llm
1677                  unat(ijb:ije,l)=ucov(ijb:ije,l)/cu(ijb:ije)
1678                enddo
[630]1679
[1146]1680                ijb=ij_begin
1681                ije=ij_end
1682                if (pole_sud) ije=ij_end-iip1
[949]1683       
[1146]1684                do l=1,llm
1685                  vnat(ijb:ije,l)=vcov(ijb:ije,l)/cv(ijb:ije)
1686                enddo
[630]1687
1688#ifdef CPP_IOIPSL
[1403]1689              if (ok_dyn_ins) then
1690! Ehouarn: Gather fields and make master send to output
1691                call Gather_Field(vcov,ip1jm,llm,0)
1692                call Gather_Field(ucov,ip1jmp1,llm,0)
1693                call Gather_Field(teta,ip1jmp1,llm,0)
1694                call Gather_Field(phi,ip1jmp1,llm,0)
1695                do iq=1,nqtot
1696                  call Gather_Field(q(1,1,iq),ip1jmp1,llm,0)
1697                enddo
1698                call Gather_Field(masse,ip1jmp1,llm,0)
1699                call Gather_Field(ps,ip1jmp1,1,0)
1700                call Gather_Field(phis,ip1jmp1,1,0)
1701                if (mpi_rank==0) then
1702                 CALL writehist(itau,vcov,ucov,teta,phi,q,masse,ps,phis)
1703                endif
[1279]1704!                CALL writehist_p(histid, histvid, itau,vcov ,
1705!     &                           ucov,teta,phi,q,masse,ps,phis)
[1403]1706              endif ! of if (ok_dyn_ins)
[1146]1707#endif
1708! For some Grads output (but does it work?)
1709                if (output_grads_dyn) then
1710                  call Gather_Field(unat,ip1jmp1,llm,0)
1711                  call Gather_Field(vnat,ip1jm,llm,0)
1712                  call Gather_Field(teta,ip1jmp1,llm,0)
1713                  call Gather_Field(ps,ip1jmp1,1,0)
1714                  do iq=1,nqtot
1715                    call Gather_Field(q(1,1,iq),ip1jmp1,llm,0)
1716                  enddo
[630]1717c     
[1146]1718                  if (mpi_rank==0) then
1719#include "write_grads_dyn.h"
1720                  endif
1721                endif ! of if (output_grads_dyn)
[630]1722
[774]1723c$OMP END MASTER
[1403]1724              ENDIF ! of IF(MOD(itau,iecri).EQ.0)
[630]1725
[1146]1726              IF(itau.EQ.itaufin) THEN
[1454]1727!                if (planet_type.eq."earth") then
[774]1728c$OMP MASTER
1729                   CALL dynredem1_p("restart.nc",0.0,
[1146]1730     .                               vcov,ucov,teta,q,masse,ps)
[774]1731c$OMP END MASTER
[1454]1732!                endif ! of if (planet_type.eq."earth")
[1146]1733              ENDIF ! of IF(itau.EQ.itaufin)
[630]1734
[1146]1735              forward = .TRUE.
1736              GO TO  1
[630]1737
[1146]1738            ENDIF ! of IF (forward)
1739
1740      END IF ! of IF(.not.purmats)
[774]1741c$OMP MASTER
[1279]1742      call fin_getparam
[1146]1743      call finalize_parallel
[774]1744c$OMP END MASTER
[1146]1745      RETURN
[630]1746      END
Note: See TracBrowser for help on using the repository browser.