source: LMDZ5/trunk/libf/dyn3d/gcm.F @ 2222

Last change on this file since 2222 was 2222, checked in by Ehouarn Millour, 10 years ago

Bug fix: Poles are single points on physics grid. True mesh area there is thus the sum of corresponding dynamics "polar meshes" areas.
Note that this also implies that some extra work is needed in physics to generate correct areas at "polar points" for outputs (especially for zoomed grids).
EM

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