source: LMDZ6/trunk/libf/dyn3dmem/leapfrog_loc.f90 @ 5669

Last change on this file since 5669 was 5659, checked in by lfalletti, 6 months ago

REPROBUS: bug fix for the new usage of CPP key (wrapper)

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