source: trunk/LMDZ.COMMON/libf/dyn3dpar/leapfrog_p.F @ 2527

Last change on this file since 2527 was 2507, checked in by romain.vande, 4 years ago

For LMDZ MARS: Update of day_ini, time and hour_ini in restart and retstartfi.
Hour_ini is obsolete. If we write one restart file: day_ini is the last day
of the simulation and the remaining time is in Time (often=0), if we write
multiple restart nothing changes

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