source: LMDZ4/branches/V3_test/libf/dyn3dpar/leapfrog_p.F @ 726

Last change on this file since 726 was 726, checked in by Laurent Fairhead, 18 years ago

Modifications pour rendre INCA plus independant de LMDZ ACo
LF

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