source: LMDZ4/tags/LF_20080728/libf/dyn3dpar/leapfrog_p.F @ 1596

Last change on this file since 1596 was 961, checked in by Laurent Fairhead, 16 years ago

Un peu de menage pour avoir moins de sorties a l'execution
LF

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