source: LMDZ4/branches/LMDZ4-dev/libf/dyn3dpar/leapfrog_p.F @ 1143

Last change on this file since 1143 was 1143, checked in by jghattas, 15 years ago

Recuperation des developpements fait uniquement sur la branche LMDZ4_V4_patches :

  • ajoute de la nouvelle flag ok_dynzon
  • ajoute du parametre aer_type
  • optimisation : isccp_cloud_types.F

+ bug pour le slab dans conf_phys.F90

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