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

Last change on this file since 1206 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
RevLine 
[524]1!
[1200]2! $Id: gcm.F 1201 2009-07-07 14:01:00Z emillour $
[524]3!
4c
5c
6      PROGRAM gcm
7
8#ifdef CPP_IOIPSL
9      USE IOIPSL
[1140]10#else
11! if not using IOIPSL, we still need to use (a local version of) getin
12      USE ioipsl_getincom
[524]13#endif
[956]14
[1108]15      USE filtreg_mod
[1114]16      USE infotrac
[1086]17
[956]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
[1140]22! Ehouarn: for now these only apply to Earth:
23#ifdef CPP_EARTH
[762]24      USE dimphy
25      USE comgeomphy
[863]26      USE mod_phys_lmdz_para, ONLY : klon_mpi_para_nb
[956]27#endif
28!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
29
[524]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"
[541]76#include "tracstoke.h"
[524]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
[1114]91      REAL, ALLOCATABLE, DIMENSION(:,:,:):: q! champs advectes
[524]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
[962]122c      REAL ecin(ip1jmp1,llm),ecin0(ip1jmp1,llm)
[524]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)
[962]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
[524]130c-jld
131
132
[962]133      character (len=80) :: dynhist_file, dynhistave_file
134      character (len=20) :: modname
135      character (len=80) :: abort_message
[1201]136! locales pour gestion du temps
137      INTEGER :: an, mois, jour
138      REAL :: heure
[524]139
140
141c-----------------------------------------------------------------------
142c    variables pour l'initialisation de la physique :
143c    ------------------------------------------------
[1114]144      INTEGER ngridmx
[524]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
[762]162
[524]163
164c----------------------------------------------------------------------
165c  lecture des fichiers gcm.def ou run.def
166c  ---------------------------------------
167c
[1140]168! Ehouarn: dump possibility of using defrun
169!#ifdef CPP_IOIPSL
[524]170      CALL conf_gcm( 99, .TRUE. , clesphy0 )
[1140]171!#else
172!      CALL defrun( 99, .TRUE. , clesphy0 )
173!#endif
[762]174
[956]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
[1140]179! Ehouarn : temporarily (?) keep this only for Earth
180      if (planet_type.eq."earth") then
181#ifdef CPP_EARTH
[1114]182      CALL Init_Phys_lmdz(iim,jjp1,llm,1,(jjm-1)*iim+2)
[762]183      call InitComgeomphy
[956]184#endif
[1140]185      endif
[956]186!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
[1201]187c-----------------------------------------------------------------------
188c   Choix du calendrier
189c   -------------------
[762]190
[1201]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
[960]210      IF (config_inca /= 'none') THEN
[762]211#ifdef INCA
[1114]212      call init_const_lmdz(nbtr,anneeref,dayref,iphysiq,day_step,nday)
[863]213      call init_inca_para(iim,jjm+1,klon,1,klon_mpi_para_nb,0)
[762]214#endif
[960]215      END IF
[524]216c
217c
[762]218c------------------------------------
219c   Initialisation partie parallele
220c------------------------------------
221
222c
223c
[524]224c-----------------------------------------------------------------------
225c   Initialisation des traceurs
226c   ---------------------------
[1114]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
[524]230
[1114]231c Allocation de la tableau q : champs advectes   
232      allocate(q(ip1jmp1,llm,nqtot))
233
[524]234c-----------------------------------------------------------------------
235c   Lecture de l'etat initial :
236c   ---------------------------
237
238c  lecture du fichier start.nc
239      if (read_start) then
[1140]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
[1114]249         CALL dynetat0("start.nc",vcov,ucov,
[524]250     .              teta,q,masse,ps,phis, time_0)
[1140]251#endif
252        endif ! of if (planet_type.eq."earth")
[524]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
[1140]259      endif ! of if (read_start)
[524]260
[960]261      IF (config_inca /= 'none') THEN
[762]262#ifdef INCA
[960]263         call init_inca_dim(klon,llm,iim,jjm,
264     $        rlonu,rlatu,rlonv,rlatv)
[762]265#endif
[960]266      END IF
[524]267
268
269c le cas echeant, creation d un etat initial
270      IF (prt_level > 9) WRITE(lunout,*)
[1140]271     .              'GCM: AVANT iniacademic AVANT AVANT AVANT AVANT'
[524]272      if (.not.read_start) then
[1114]273         CALL iniacademic(vcov,ucov,teta,q,masse,ps,phis,time_0)
[524]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,*)
[1140]305     .  'GCM: Attention les dates initiales lues dans le fichier'
[524]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,*)
[1140]311     .    'GCM: On garde les dates du fichier restart'
[524]312        else
313          annee_ref = anneeref
314          day_ref = dayref
[1201]315          day_ini = 1
[524]316          itau_dyn = 0
317          itau_phy = 0
318          time_0 = 0.
319          write(lunout,*)
[1140]320     .   'GCM: On reinitialise a la date lue dans gcm.def'
[524]321        endif
322      ELSE
323        raz_date = 0
324      endif
325
[1201]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
[1200]332#ifdef CPP_IOIPSL
333      call ioconf_startdate(annee_ref,0,day_ref, 0.)
334#endif
[524]335
[1201]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
[1200]342
[524]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   -------------------------------
[1140]373
374      IF (call_iniphys.and.(iflag_phys.eq.1)) THEN
[524]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,*)
[1140]393     .       'GCM: WARNING!!! vitesse verticale nulle dans la physique'
394! Earth:
395         if (planet_type.eq."earth") then
396#ifdef CPP_EARTH
[524]397         CALL iniphysiq(ngridmx,llm,daysec,day_ini,dtphys ,
398     ,                latfi,lonfi,airefi,zcufi,zcvfi,rad,g,r,cpp     )
[1140]399#endif
400         endif ! of if (planet_type.eq."earth")
[524]401         call_iniphys=.false.
[1140]402      ENDIF ! of IF (call_iniphys.and.(iflag_phys.eq.1))
403!#endif
[524]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
[1140]414 300  FORMAT('1'/,15x,'run du jour',i7,2x,'au jour',i7//)
[1201]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)
[524]421
[1140]422      if (planet_type.eq."earth") then
423#ifdef CPP_EARTH
[1114]424      CALL dynredem0("restart.nc", day_end, phis)
[1140]425#endif
426      endif
[524]427
428      ecripar = .TRUE.
429
[1140]430#ifdef CPP_IOIPSL
[524]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,
[1114]436     .              t_ops, t_wrt, histid, histvid)
[524]437
[1143]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
[524]444      dtav = iperiod*dtvr/daysec
445      endif
446
447
448#endif
[1140]449! #endif of #ifdef CPP_IOIPSL
[524]450
[541]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
[524]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
[1114]470      CALL leapfrog(ucov,vcov,teta,ps,masse,phis,q,clesphy0,
[550]471     .              time_0)
[524]472
473      END
474
Note: See TracBrowser for help on using the repository browser.