source: LMDZ4/branches/LMDZ4_par_0/libf/dyn3dpar/gcm.F @ 5456

Last change on this file since 5456 was 630, checked in by Laurent Fairhead, 20 years ago

Import d'une version parallele de la dynamique YM
LF

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 12.3 KB
Line 
1!
2! $Header$
3!
4c
5c
6      PROGRAM gcm
7
8#ifdef CPP_IOIPSL
9      USE IOIPSL
10#endif
11      USE parallel
12      USE dimphy
13      USE comgeomphy
14      USE mod_hallo
15      USE Bands
16#ifdef INCA
17      USE inca_dim
18#endif
19      IMPLICIT NONE
20
21c      ......   Version  du 10/01/98    ..........
22
23c             avec  coordonnees  verticales hybrides
24c   avec nouveaux operat. dissipation * ( gradiv2,divgrad2,nxgraro2 )
25
26c=======================================================================
27c
28c   Auteur:  P. Le Van /L. Fairhead/F.Hourdin
29c   -------
30c
31c   Objet:
32c   ------
33c
34c   GCM LMD nouvelle grille
35c
36c=======================================================================
37c
38c  ... Dans inigeom , nouveaux calculs pour les elongations  cu , cv
39c      et possibilite d'appeler une fonction f(y)  a derivee tangente
40c      hyperbolique a la  place de la fonction a derivee sinusoidale.
41c  ... Possibilite de choisir le schema pour l'advection de
42c        q  , en modifiant iadv dans traceur.def  (MAF,10/02) .
43c
44c      Pour Van-Leer + Vapeur d'eau saturee, iadv(1)=4. (F.Codron,10/99)
45c      Pour Van-Leer iadv=10
46c
47c-----------------------------------------------------------------------
48c   Declarations:
49c   -------------
50      include 'mpif.h'
51#include "dimensions.h"
52#include "paramet.h"
53#include "comconst.h"
54#include "comdissnew.h"
55#include "comvert.h"
56#include "comgeom.h"
57#include "logic.h"
58#include "temps.h"
59#include "control.h"
60#include "ener.h"
61#include "description.h"
62#include "serre.h"
63#include "com_io_dyn.h"
64#include "iniprint.h"
65#include "tracstoke.h"
66
67
68      INTEGER         longcles
69      PARAMETER     ( longcles = 20 )
70      REAL  clesphy0( longcles )
71      SAVE  clesphy0
72
73
74
75      REAL zdtvr
76      INTEGER nbetatmoy, nbetatdem,nbetat
77
78c   variables dynamiques
79      REAL vcov(ip1jm,llm),ucov(ip1jmp1,llm) ! vents covariants
80      REAL teta(ip1jmp1,llm)                 ! temperature potentielle
81      REAL q(ip1jmp1,llm,nqmx)               ! champs advectes
82      REAL ps(ip1jmp1)                       ! pression  au sol
83      REAL p (ip1jmp1,llmp1  )               ! pression aux interfac.des couches
84      REAL pks(ip1jmp1)                      ! exner au  sol
85      REAL pk(ip1jmp1,llm)                   ! exner au milieu des couches
86      REAL pkf(ip1jmp1,llm)                  ! exner filt.au milieu des couches
87      REAL masse(ip1jmp1,llm)                ! masse d'air
88      REAL phis(ip1jmp1)                     ! geopotentiel au sol
89      REAL phi(ip1jmp1,llm)                  ! geopotentiel
90      REAL w(ip1jmp1,llm)                    ! vitesse verticale
91
92c variables dynamiques intermediaire pour le transport
93
94c   variables pour le fichier histoire
95      REAL dtav      ! intervalle de temps elementaire
96
97      REAL time_0
98
99      LOGICAL lafin
100      INTEGER ij,iq,l,i,j
101
102
103      real time_step, t_wrt, t_ops
104
105      REAL rdayvrai,rdaym_ini,rday_ecri
106      LOGICAL first
107
108      LOGICAL call_iniphys
109      data call_iniphys/.true./
110
111      REAL alpha(ip1jmp1,llm),beta(ip1jmp1,llm)
112c+jld variables test conservation energie
113      REAL ecin(ip1jmp1,llm),ecin0(ip1jmp1,llm)
114C     Tendance de la temp. potentiel d (theta)/ d t due a la
115C     tansformation d'energie cinetique en energie thermique
116C     cree par la dissipation
117      REAL dhecdt(ip1jmp1,llm)
118      REAL vcont(ip1jm,llm),ucont(ip1jmp1,llm)
119      REAL      d_h_vcol, d_qt, d_qw, d_ql, d_ec
120      CHARACTER*15 ztit
121      INTEGER   ip_ebil_dyn  ! PRINT level for energy conserv. diag.
122      SAVE      ip_ebil_dyn
123      DATA      ip_ebil_dyn/0/
124c-jld
125
126
127      character*80 dynhist_file, dynhistave_file
128      character*20 modname
129      character*80 abort_message
130
131C Calendrier
132      LOGICAL true_calendar
133      PARAMETER (true_calendar = .false.)
134
135c-----------------------------------------------------------------------
136c    variables pour l'initialisation de la physique :
137c    ------------------------------------------------
138      INTEGER ngridmx,nq
139      PARAMETER( ngridmx = 2+(jjm-1)*iim - 1/jjm   )
140      REAL zcufi(ngridmx),zcvfi(ngridmx)
141      REAL latfi(ngridmx),lonfi(ngridmx)
142      REAL airefi(ngridmx)
143      SAVE latfi, lonfi, airefi
144     
145c varaiable pour l'allocation du Buffer MPI (sur NEC)     
146      pointer (Pbuffer,MPI_Buffer(MaxBufferSize))
147      REAL :: MPI_Buffer
148      INTEGER(KIND=MPI_ADDRESS_KIND) :: BS
149      INTEGER :: ierr
150
151
152c-----------------------------------------------------------------------
153c   Initialisations:
154c   ----------------
155
156      abort_message = 'last timestep reached'
157      modname = 'gcm'
158      descript = 'Run GCM LMDZ'
159      lafin    = .FALSE.
160      dynhist_file = 'dyn_hist'
161      dynhistave_file = 'dyn_hist_ave'
162
163c--------------------------------------------------------------------------
164c   Iflag_phys controle l'appel a la physique :
165c   -------------------------------------------
166c      0 : pas de physique
167c      1 : Normale (appel a phylmd, phymars ...)
168c      2 : rappel Newtonien pour la temperature + friction au sol
169      iflag_phys=1
170
171c--------------------------------------------------------------------------
172c   Lecture de l'etat initial :
173c   ---------------------------
174c     T : on lit start.nc
175c     F : le modele s'autoinitialise avec un cas academique (iniacademic)
176#ifdef CPP_IOIPSL
177      read_start=.true.
178#else
179      read_start=.false.
180#endif
181
182c-----------------------------------------------------------------------
183c   Choix du calendrier
184c   -------------------
185
186#ifdef CPP_IOIPSL
187      if (true_calendar) then
188        call ioconf_calendar('gregorian')
189      else
190        call ioconf_calendar('360d')
191      endif
192#endif
193c----------------------------------------------------------------------
194c  lecture des fichiers gcm.def ou run.def
195c  ---------------------------------------
196c
197#ifdef CPP_IOIPSL
198      CALL conf_gcm( 99, .TRUE. , clesphy0 )
199#else
200      CALL defrun( 99, .TRUE. , clesphy0 )
201#endif
202c
203c
204c------------------------------------
205c   Initialisation partie parallele
206c------------------------------------
207      call init_parallel
208      call InitDimphy
209      call InitBands
210      if (mpi_rank==0) call WriteBands
211      call SetDistrib(jj_Nb_Caldyn)
212c  Allocation du buffer MPI
213      Bs=8*MaxBufferSize
214      call MPI_ALLOC_MEM(BS,MPI_INFO_NULL,Pbuffer,ierr)
215      print *,'ierr',ierr
216      do i=1,MaxBufferSize
217        MPI_Buffer(i)=i
218      enddo
219      call Init_Mod_hallo(MPI_Buffer)
220
221      call InitComgeomphy
222
223#ifdef INCA
224      call init_inca_dim
225#endif
226
227c-----------------------------------------------------------------------
228c   Initialisation des traceurs
229c   ---------------------------
230c  Choix du schema pour l'advection
231c  dans fichier trac.def ou via INCA
232
233       call iniadvtrac(nq)
234c
235c-----------------------------------------------------------------------
236c   Lecture de l'etat initial :
237c   ---------------------------
238
239c  lecture du fichier start.nc
240      if (read_start) then
241#ifdef CPP_IOIPSL
242         CALL dynetat0("start.nc",nqmx,vcov,ucov,
243     .              teta,q,masse,ps,phis, time_0)
244c       write(73,*) 'ucov',ucov
245c       write(74,*) 'vcov',vcov
246c       write(75,*) 'teta',teta
247c       write(76,*) 'ps',ps
248c       write(77,*) 'q',q
249
250#endif
251      endif
252
253
254
255c le cas echeant, creation d un etat initial
256      IF (prt_level > 9) WRITE(lunout,*)
257     .                 'AVANT iniacademic AVANT AVANT AVANT AVANT'
258      if (.not.read_start) then
259         CALL iniacademic(nqmx,vcov,ucov,teta,q,masse,ps,phis,time_0)
260      endif
261
262
263c-----------------------------------------------------------------------
264c   Lecture des parametres de controle pour la simulation :
265c   -------------------------------------------------------
266c  on recalcule eventuellement le pas de temps
267
268      IF(MOD(day_step,iperiod).NE.0) THEN
269        abort_message =
270     .  'Il faut choisir un nb de pas par jour multiple de iperiod'
271        call abort_gcm(modname,abort_message,1)
272      ENDIF
273
274      IF(MOD(day_step,iphysiq).NE.0) THEN
275        abort_message =
276     * 'Il faut choisir un nb de pas par jour multiple de iphysiq'
277        call abort_gcm(modname,abort_message,1)
278      ENDIF
279
280      zdtvr    = daysec/FLOAT(day_step)
281        IF(dtvr.NE.zdtvr) THEN
282         WRITE(lunout,*)
283     .    'WARNING!!! changement de pas de temps',dtvr,'>',zdtvr
284        ENDIF
285
286C
287C on remet le calendrier à zero si demande
288c
289      if (annee_ref .ne. anneeref .or. day_ref .ne. dayref) then
290        write(lunout,*)
291     .  ' Attention les dates initiales lues dans le fichier'
292        write(lunout,*)
293     .  ' restart ne correspondent pas a celles lues dans '
294        write(lunout,*)' gcm.def'
295        if (raz_date .ne. 1) then
296          write(lunout,*)
297     .    ' On garde les dates du fichier restart'
298        else
299          annee_ref = anneeref
300          day_ref = dayref
301          day_ini = dayref
302          itau_dyn = 0
303          itau_phy = 0
304          time_0 = 0.
305          write(lunout,*)
306     .   ' On reinitialise a la date lue dans gcm.def'
307        endif
308      ELSE
309        raz_date = 0
310      endif
311
312
313c  nombre d'etats dans les fichiers demarrage et histoire
314      nbetatdem = nday / iecri
315      nbetatmoy = nday / periodav + 1
316
317c-----------------------------------------------------------------------
318c   Initialisation des constantes dynamiques :
319c   ------------------------------------------
320      dtvr = zdtvr
321      CALL iniconst
322
323c-----------------------------------------------------------------------
324c   Initialisation de la geometrie :
325c   --------------------------------
326      CALL inigeom
327
328c-----------------------------------------------------------------------
329c   Initialisation du filtre :
330c   --------------------------
331      CALL inifilr
332c
333c-----------------------------------------------------------------------
334c   Initialisation de la dissipation :
335c   ----------------------------------
336
337      CALL inidissip( lstardis, nitergdiv, nitergrot, niterh   ,
338     *                tetagdiv, tetagrot , tetatemp              )
339
340c-----------------------------------------------------------------------
341c   Initialisation de la physique :
342c   -------------------------------
343#ifdef CPP_PHYS
344      IF (call_iniphys.and.iflag_phys.eq.1) THEN
345         latfi(1)=rlatu(1)
346         lonfi(1)=0.
347         zcufi(1) = cu(1)
348         zcvfi(1) = cv(1)
349         DO j=2,jjm
350            DO i=1,iim
351               latfi((j-2)*iim+1+i)= rlatu(j)
352               lonfi((j-2)*iim+1+i)= rlonv(i)
353               zcufi((j-2)*iim+1+i) = cu((j-1)*iip1+i)
354               zcvfi((j-2)*iim+1+i) = cv((j-1)*iip1+i)
355            ENDDO
356         ENDDO
357         latfi(ngridmx)= rlatu(jjp1)
358         lonfi(ngridmx)= 0.
359         zcufi(ngridmx) = cu(ip1jm+1)
360         zcvfi(ngridmx) = cv(ip1jm-iim)
361         CALL gr_dyn_fi(1,iip1,jjp1,ngridmx,aire,airefi)
362         WRITE(lunout,*)
363     .           'WARNING!!! vitesse verticale nulle dans la physique'
364         CALL iniphysiq(ngridmx,llm,daysec,day_ini,dtphys ,
365     ,                latfi,lonfi,airefi,zcufi,zcvfi,rad,g,r,cpp     )
366         call_iniphys=.false.
367      ENDIF
368#endif
369
370c  numero de stockage pour les fichiers de redemarrage:
371
372c-----------------------------------------------------------------------
373c   Initialisation des I/O :
374c   ------------------------
375
376
377      day_end = day_ini + nday
378      WRITE(lunout,300)day_ini,day_end
379
380#ifdef CPP_IOIPSL
381      CALL dynredem0_p("restart.nc", day_end, phis, nqmx)
382
383      ecripar = .TRUE.
384
385      if ( 1.eq.1) then
386      time_step = zdtvr
387      t_ops = iecri * daysec
388      t_wrt = iecri * daysec
389      CALL inithist_p(dynhist_file,day_ref,annee_ref,time_step,
390     .              t_ops, t_wrt, nqmx, histid, histvid)
391
392      t_ops = iperiod * time_step
393      t_wrt = periodav * daysec
394      CALL initdynav_p(dynhistave_file,day_ref,annee_ref,time_step,
395     .              t_ops, t_wrt, nqmx, histaveid)
396
397      dtav = iperiod*dtvr/daysec
398      endif
399
400
401#endif
402
403c  Choix des frequences de stokage pour le offline
404c      istdyn=day_step/4     ! stockage toutes les 6h=1jour/4
405c      istdyn=day_step/12     ! stockage toutes les 2h=1jour/12
406      istdyn=day_step/4     ! stockage toutes les 6h=1jour/12
407      istphy=istdyn/iphysiq     
408
409
410c
411c-----------------------------------------------------------------------
412c   Integration temporelle du modele :
413c   ----------------------------------
414
415c       write(78,*) 'ucov',ucov
416c       write(78,*) 'vcov',vcov
417c       write(78,*) 'teta',teta
418c       write(78,*) 'ps',ps
419c       write(78,*) 'q',q
420
421
422      CALL leapfrog_p(ucov,vcov,teta,ps,masse,phis,nq,q,clesphy0,
423     .              time_0)
424
425
426
427 300  FORMAT('1'/,15x,'run du pas',i7,2x,'au pas',i7,2x,
428     . 'c''est a dire du jour',i7,3x,'au jour',i7//)
429      END
430
Note: See TracBrowser for help on using the repository browser.