source: LMDZ4/branches/LMDZ4-dev/libf/dyn3d/gcm.F @ 1209

Last change on this file since 1209 was 1201, checked in by Laurent Fairhead, 15 years ago

Modifications nécessaires a l'inclusion d'un calendrier réaliste.
La date courante est calculée dans leapfrog.F et exprimée en Jour Julien
(modifié). On en a profité pour faire un peu de ménage dans la gestion des dates
du modèle.
Dans la physique, on utilise les routines de passages entre calendrier Julien et
Gregorien incluses dans IOIPSL pour calculer le nombre de jours écoulés depuis le
1er janvier (pour les conditions aux limites) ou l'equinoxe (pour le calcul de
la longitude solaire). Le calcul de l'orbite reprend celui du gcm planétaire
(codé par FH)
On décide du calendrier à utiliser à l'aide du paramètre calend du run.def. Par
défaut celui-ci est à earth_360d
LF

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 14.3 KB
Line 
1!
2! $Id: gcm.F 1201 2009-07-07 14:01:00Z fairhead $
3!
4c
5c
6      PROGRAM gcm
7
8#ifdef CPP_IOIPSL
9      USE IOIPSL
10#else
11! if not using IOIPSL, we still need to use (a local version of) getin
12      USE ioipsl_getincom
13#endif
14
15      USE filtreg_mod
16      USE infotrac
17
18!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
19! FH 2008/05/09 On elimine toutes les clefs physiques dans la dynamique
20! A nettoyer. On ne veut qu'une ou deux routines d'interface
21! dynamique -> physique pour l'initialisation
22! Ehouarn: for now these only apply to Earth:
23#ifdef CPP_EARTH
24      USE dimphy
25      USE comgeomphy
26      USE mod_phys_lmdz_para, ONLY : klon_mpi_para_nb
27#endif
28!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
29
30      IMPLICIT NONE
31
32c      ......   Version  du 10/01/98    ..........
33
34c             avec  coordonnees  verticales hybrides
35c   avec nouveaux operat. dissipation * ( gradiv2,divgrad2,nxgraro2 )
36
37c=======================================================================
38c
39c   Auteur:  P. Le Van /L. Fairhead/F.Hourdin
40c   -------
41c
42c   Objet:
43c   ------
44c
45c   GCM LMD nouvelle grille
46c
47c=======================================================================
48c
49c  ... Dans inigeom , nouveaux calculs pour les elongations  cu , cv
50c      et possibilite d'appeler une fonction f(y)  a derivee tangente
51c      hyperbolique a la  place de la fonction a derivee sinusoidale.
52c  ... Possibilite de choisir le schema pour l'advection de
53c        q  , en modifiant iadv dans traceur.def  (MAF,10/02) .
54c
55c      Pour Van-Leer + Vapeur d'eau saturee, iadv(1)=4. (F.Codron,10/99)
56c      Pour Van-Leer iadv=10
57c
58c-----------------------------------------------------------------------
59c   Declarations:
60c   -------------
61
62#include "dimensions.h"
63#include "paramet.h"
64#include "comconst.h"
65#include "comdissnew.h"
66#include "comvert.h"
67#include "comgeom.h"
68#include "logic.h"
69#include "temps.h"
70#include "control.h"
71#include "ener.h"
72#include "description.h"
73#include "serre.h"
74#include "com_io_dyn.h"
75#include "iniprint.h"
76#include "tracstoke.h"
77
78      INTEGER         longcles
79      PARAMETER     ( longcles = 20 )
80      REAL  clesphy0( longcles )
81      SAVE  clesphy0
82
83
84
85      REAL zdtvr
86      INTEGER nbetatmoy, nbetatdem,nbetat
87
88c   variables dynamiques
89      REAL vcov(ip1jm,llm),ucov(ip1jmp1,llm) ! vents covariants
90      REAL teta(ip1jmp1,llm)                 ! temperature potentielle
91      REAL, ALLOCATABLE, DIMENSION(:,:,:):: q! champs advectes
92      REAL ps(ip1jmp1)                       ! pression  au sol
93      REAL p (ip1jmp1,llmp1  )               ! pression aux interfac.des couches
94      REAL pks(ip1jmp1)                      ! exner au  sol
95      REAL pk(ip1jmp1,llm)                   ! exner au milieu des couches
96      REAL pkf(ip1jmp1,llm)                  ! exner filt.au milieu des couches
97      REAL masse(ip1jmp1,llm)                ! masse d'air
98      REAL phis(ip1jmp1)                     ! geopotentiel au sol
99      REAL phi(ip1jmp1,llm)                  ! geopotentiel
100      REAL w(ip1jmp1,llm)                    ! vitesse verticale
101
102c variables dynamiques intermediaire pour le transport
103
104c   variables pour le fichier histoire
105      REAL dtav      ! intervalle de temps elementaire
106
107      REAL time_0
108
109      LOGICAL lafin
110      INTEGER ij,iq,l,i,j
111
112
113      real time_step, t_wrt, t_ops
114
115      LOGICAL first
116
117      LOGICAL call_iniphys
118      data call_iniphys/.true./
119
120      REAL alpha(ip1jmp1,llm),beta(ip1jmp1,llm)
121c+jld variables test conservation energie
122c      REAL ecin(ip1jmp1,llm),ecin0(ip1jmp1,llm)
123C     Tendance de la temp. potentiel d (theta)/ d t due a la
124C     tansformation d'energie cinetique en energie thermique
125C     cree par la dissipation
126      REAL dhecdt(ip1jmp1,llm)
127c      REAL vcont(ip1jm,llm),ucont(ip1jmp1,llm)
128c      REAL      d_h_vcol, d_qt, d_qw, d_ql, d_ec
129      CHARACTER (len=15) :: ztit
130c-jld
131
132
133      character (len=80) :: dynhist_file, dynhistave_file
134      character (len=20) :: modname
135      character (len=80) :: abort_message
136! locales pour gestion du temps
137      INTEGER :: an, mois, jour
138      REAL :: heure
139
140
141c-----------------------------------------------------------------------
142c    variables pour l'initialisation de la physique :
143c    ------------------------------------------------
144      INTEGER ngridmx
145      PARAMETER( ngridmx = 2+(jjm-1)*iim - 1/jjm   )
146      REAL zcufi(ngridmx),zcvfi(ngridmx)
147      REAL latfi(ngridmx),lonfi(ngridmx)
148      REAL airefi(ngridmx)
149      SAVE latfi, lonfi, airefi
150
151c-----------------------------------------------------------------------
152c   Initialisations:
153c   ----------------
154
155      abort_message = 'last timestep reached'
156      modname = 'gcm'
157      descript = 'Run GCM LMDZ'
158      lafin    = .FALSE.
159      dynhist_file = 'dyn_hist.nc'
160      dynhistave_file = 'dyn_hist_ave.nc'
161
162
163
164c----------------------------------------------------------------------
165c  lecture des fichiers gcm.def ou run.def
166c  ---------------------------------------
167c
168! Ehouarn: dump possibility of using defrun
169!#ifdef CPP_IOIPSL
170      CALL conf_gcm( 99, .TRUE. , clesphy0 )
171!#else
172!      CALL defrun( 99, .TRUE. , clesphy0 )
173!#endif
174
175!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
176! FH 2008/05/02
177! A nettoyer. On ne veut qu'une ou deux routines d'interface
178! dynamique -> physique pour l'initialisation
179! Ehouarn : temporarily (?) keep this only for Earth
180      if (planet_type.eq."earth") then
181#ifdef CPP_EARTH
182      CALL Init_Phys_lmdz(iim,jjp1,llm,1,(jjm-1)*iim+2)
183      call InitComgeomphy
184#endif
185      endif
186!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
187c-----------------------------------------------------------------------
188c   Choix du calendrier
189c   -------------------
190
191c      calend = 'earth_365d'
192
193#ifdef CPP_IOIPSL
194      if (calend == 'earth_360d') then
195        call ioconf_calendar('360d')
196        write(lunout,*)'CALENDRIER CHOISI: Terrestre a 360 jours/an'
197      else if (calend == 'earth_365d') then
198        call ioconf_calendar('noleap')
199        write(lunout,*)'CALENDRIER CHOISI: Terrestre a 365 jours/an'
200      else if (calend == 'earth_366d') then
201        call ioconf_calendar('gregorian')
202        write(lunout,*)'CALENDRIER CHOISI: Terrestre bissextile'
203      else
204        abort_message = 'Mauvais choix de calendrier'
205        call abort_gcm(modname,abort_message,1)
206      endif
207#endif
208c-----------------------------------------------------------------------
209
210      IF (config_inca /= 'none') THEN
211#ifdef INCA
212      call init_const_lmdz(nbtr,anneeref,dayref,iphysiq,day_step,nday)
213      call init_inca_para(iim,jjm+1,klon,1,klon_mpi_para_nb,0)
214#endif
215      END IF
216c
217c
218c------------------------------------
219c   Initialisation partie parallele
220c------------------------------------
221
222c
223c
224c-----------------------------------------------------------------------
225c   Initialisation des traceurs
226c   ---------------------------
227c  Choix du nombre de traceurs et du schema pour l'advection
228c  dans fichier traceur.def, par default ou via INCA
229      call infotrac_init
230
231c Allocation de la tableau q : champs advectes   
232      allocate(q(ip1jmp1,llm,nqtot))
233
234c-----------------------------------------------------------------------
235c   Lecture de l'etat initial :
236c   ---------------------------
237
238c  lecture du fichier start.nc
239      if (read_start) then
240      ! we still need to run iniacademic to initialize some
241      ! constants & fields, if we run the 'newtonian' case:
242        if (iflag_phys.eq.2) then
243          CALL iniacademic(vcov,ucov,teta,q,masse,ps,phis,time_0)
244        endif
245!#ifdef CPP_IOIPSL
246        if (planet_type.eq."earth") then
247#ifdef CPP_EARTH
248! Load an Earth-format start file
249         CALL dynetat0("start.nc",vcov,ucov,
250     .              teta,q,masse,ps,phis, time_0)
251#endif
252        endif ! of if (planet_type.eq."earth")
253c       write(73,*) 'ucov',ucov
254c       write(74,*) 'vcov',vcov
255c       write(75,*) 'teta',teta
256c       write(76,*) 'ps',ps
257c       write(77,*) 'q',q
258
259      endif ! of if (read_start)
260
261      IF (config_inca /= 'none') THEN
262#ifdef INCA
263         call init_inca_dim(klon,llm,iim,jjm,
264     $        rlonu,rlatu,rlonv,rlatv)
265#endif
266      END IF
267
268
269c le cas echeant, creation d un etat initial
270      IF (prt_level > 9) WRITE(lunout,*)
271     .              'GCM: AVANT iniacademic AVANT AVANT AVANT AVANT'
272      if (.not.read_start) then
273         CALL iniacademic(vcov,ucov,teta,q,masse,ps,phis,time_0)
274      endif
275
276
277c-----------------------------------------------------------------------
278c   Lecture des parametres de controle pour la simulation :
279c   -------------------------------------------------------
280c  on recalcule eventuellement le pas de temps
281
282      IF(MOD(day_step,iperiod).NE.0) THEN
283        abort_message =
284     .  'Il faut choisir un nb de pas par jour multiple de iperiod'
285        call abort_gcm(modname,abort_message,1)
286      ENDIF
287
288      IF(MOD(day_step,iphysiq).NE.0) THEN
289        abort_message =
290     * 'Il faut choisir un nb de pas par jour multiple de iphysiq'
291        call abort_gcm(modname,abort_message,1)
292      ENDIF
293
294      zdtvr    = daysec/FLOAT(day_step)
295        IF(dtvr.NE.zdtvr) THEN
296         WRITE(lunout,*)
297     .    'WARNING!!! changement de pas de temps',dtvr,'>',zdtvr
298        ENDIF
299
300C
301C on remet le calendrier à zero si demande
302c
303      if (annee_ref .ne. anneeref .or. day_ref .ne. dayref) then
304        write(lunout,*)
305     .  'GCM: Attention les dates initiales lues dans le fichier'
306        write(lunout,*)
307     .  ' restart ne correspondent pas a celles lues dans '
308        write(lunout,*)' gcm.def'
309        if (raz_date .ne. 1) then
310          write(lunout,*)
311     .    'GCM: On garde les dates du fichier restart'
312        else
313          annee_ref = anneeref
314          day_ref = dayref
315          day_ini = 1
316          itau_dyn = 0
317          itau_phy = 0
318          time_0 = 0.
319          write(lunout,*)
320     .   'GCM: On reinitialise a la date lue dans gcm.def'
321        endif
322      ELSE
323        raz_date = 0
324      endif
325
326      mois = 1
327      heure = 0.
328      call ymds2ju(annee_ref, mois, day_ref, heure, jD_ref)
329      jH_ref = jD_ref - int(jD_ref)
330      jD_ref = int(jD_ref)
331
332#ifdef CPP_IOIPSL
333      call ioconf_startdate(annee_ref,0,day_ref, 0.)
334#endif
335
336      write(lunout,*)'DEBUG'
337      write(lunout,*)'annee_ref, mois, day_ref, heure, jD_ref'
338      write(lunout,*)annee_ref, mois, day_ref, heure, jD_ref
339      call ju2ymds(jD_ref+jH_ref,an, mois, jour, heure)
340      write(lunout,*)'jD_ref+jH_ref,an, mois, jour, heure'
341      write(lunout,*)jD_ref+jH_ref,an, mois, jour, heure
342
343c  nombre d'etats dans les fichiers demarrage et histoire
344      nbetatdem = nday / iecri
345      nbetatmoy = nday / periodav + 1
346
347c-----------------------------------------------------------------------
348c   Initialisation des constantes dynamiques :
349c   ------------------------------------------
350      dtvr = zdtvr
351      CALL iniconst
352
353c-----------------------------------------------------------------------
354c   Initialisation de la geometrie :
355c   --------------------------------
356      CALL inigeom
357
358c-----------------------------------------------------------------------
359c   Initialisation du filtre :
360c   --------------------------
361      CALL inifilr
362c
363c-----------------------------------------------------------------------
364c   Initialisation de la dissipation :
365c   ----------------------------------
366
367      CALL inidissip( lstardis, nitergdiv, nitergrot, niterh   ,
368     *                tetagdiv, tetagrot , tetatemp              )
369
370c-----------------------------------------------------------------------
371c   Initialisation de la physique :
372c   -------------------------------
373
374      IF (call_iniphys.and.(iflag_phys.eq.1)) THEN
375         latfi(1)=rlatu(1)
376         lonfi(1)=0.
377         zcufi(1) = cu(1)
378         zcvfi(1) = cv(1)
379         DO j=2,jjm
380            DO i=1,iim
381               latfi((j-2)*iim+1+i)= rlatu(j)
382               lonfi((j-2)*iim+1+i)= rlonv(i)
383               zcufi((j-2)*iim+1+i) = cu((j-1)*iip1+i)
384               zcvfi((j-2)*iim+1+i) = cv((j-1)*iip1+i)
385            ENDDO
386         ENDDO
387         latfi(ngridmx)= rlatu(jjp1)
388         lonfi(ngridmx)= 0.
389         zcufi(ngridmx) = cu(ip1jm+1)
390         zcvfi(ngridmx) = cv(ip1jm-iim)
391         CALL gr_dyn_fi(1,iip1,jjp1,ngridmx,aire,airefi)
392         WRITE(lunout,*)
393     .       'GCM: WARNING!!! vitesse verticale nulle dans la physique'
394! Earth:
395         if (planet_type.eq."earth") then
396#ifdef CPP_EARTH
397         CALL iniphysiq(ngridmx,llm,daysec,day_ini,dtphys ,
398     ,                latfi,lonfi,airefi,zcufi,zcvfi,rad,g,r,cpp     )
399#endif
400         endif ! of if (planet_type.eq."earth")
401         call_iniphys=.false.
402      ENDIF ! of IF (call_iniphys.and.(iflag_phys.eq.1))
403!#endif
404
405c  numero de stockage pour les fichiers de redemarrage:
406
407c-----------------------------------------------------------------------
408c   Initialisation des I/O :
409c   ------------------------
410
411
412      day_end = day_ini + nday
413      WRITE(lunout,300)day_ini,day_end
414 300  FORMAT('1'/,15x,'run du jour',i7,2x,'au jour',i7//)
415      call ju2ymds(jD_ref+day_ini-1,an, mois, jour, heure)
416      write (lunout,301)jour, mois, an
417      call ju2ymds(jD_ref+day_end-1,an, mois, jour, heure)
418      write (lunout,302)jour, mois, an
419 301  FORMAT('1'/,15x,'run du ', i2,'/',i2,'/',i4)
420 302  FORMAT('1'/,15x,'    au ', i2,'/',i2,'/',i4)
421
422      if (planet_type.eq."earth") then
423#ifdef CPP_EARTH
424      CALL dynredem0("restart.nc", day_end, phis)
425#endif
426      endif
427
428      ecripar = .TRUE.
429
430#ifdef CPP_IOIPSL
431      if ( 1.eq.1) then
432      time_step = zdtvr
433      t_ops = iecri * daysec
434      t_wrt = iecri * daysec
435      CALL inithist(dynhist_file,day_ref,annee_ref,time_step,
436     .              t_ops, t_wrt, histid, histvid)
437
438      IF (ok_dynzon) THEN
439         t_ops = iperiod * time_step
440         t_wrt = periodav * daysec
441         CALL initdynav(dynhistave_file,day_ref,annee_ref,time_step,
442     .        t_ops, t_wrt, histaveid)
443      END IF
444      dtav = iperiod*dtvr/daysec
445      endif
446
447
448#endif
449! #endif of #ifdef CPP_IOIPSL
450
451c  Choix des frequences de stokage pour le offline
452c      istdyn=day_step/4     ! stockage toutes les 6h=1jour/4
453c      istdyn=day_step/12     ! stockage toutes les 2h=1jour/12
454      istdyn=day_step/4     ! stockage toutes les 6h=1jour/12
455      istphy=istdyn/iphysiq     
456
457
458c
459c-----------------------------------------------------------------------
460c   Integration temporelle du modele :
461c   ----------------------------------
462
463c       write(78,*) 'ucov',ucov
464c       write(78,*) 'vcov',vcov
465c       write(78,*) 'teta',teta
466c       write(78,*) 'ps',ps
467c       write(78,*) 'q',q
468
469
470      CALL leapfrog(ucov,vcov,teta,ps,masse,phis,q,clesphy0,
471     .              time_0)
472
473      END
474
Note: See TracBrowser for help on using the repository browser.