Ignore:
Timestamp:
Jul 7, 2009, 4:01:00 PM (15 years ago)
Author:
Laurent Fairhead
Message:

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

Location:
LMDZ4/branches/LMDZ4-dev/libf/dyn3d
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • LMDZ4/branches/LMDZ4-dev/libf/dyn3d/calfis.F

    r1114 r1201  
    11!
    2 ! $Header$
     2! $Id$
    33!
    44C
    55C
    66      SUBROUTINE calfis(lafin,
    7      $                  rdayvrai,
    8      $                  heure,
     7     $                  jD_cur, jH_cur,
    98     $                  pucov,
    109     $                  pvcov,
     
    102101c    -----------
    103102      LOGICAL  lafin
    104       REAL heure
     103
    105104
    106105      REAL pvcov(iip1,jjm,llm)
     
    170169      DATA firstcal/.true./
    171170      SAVE firstcal,debut
    172       REAL rdayvrai
     171!      REAL rdayvrai
     172      REAL :: jD_cur, jH_cur
    173173c
    174174c-----------------------------------------------------------------------
     
    445445     .             debut,
    446446     .             lafin,
    447      .             rdayvrai,
    448      .             heure,
     447     .             jD_cur,
     448     .             jH_cur,
    449449     .             dtphys,
    450450     .             zplev,
  • LMDZ4/branches/LMDZ4-dev/libf/dyn3d/conf_gcm.F

    r1190 r1201  
    3838#include "serre.h"
    3939#include "comdissnew.h"
     40#include "temps.h"
    4041#include "comconst.h"
    4142
     
    111112      planet_type="earth"
    112113      CALL getin('planet_type',planet_type)
     114
     115!Config  Key  = calend
     116!Config  Desc = type de calendrier utilise
     117!Config  Def  = earth_360d
     118!Config  Help = valeur possible: earth_360d, earth_365d, earth_366d
     119!Config         
     120      calend = 'earth_360d'
     121      CALL getin('calend', calend)
    113122
    114123!Config  Key  = dayref
     
    576585      write(lunout,*)' Configuration des parametres du gcm: '
    577586      write(lunout,*)' planet_type = ', planet_type
     587      write(lunout,*)' calend = ', calend
    578588      write(lunout,*)' dayref = ', dayref
    579589      write(lunout,*)' anneeref = ', anneeref
     
    762772      write(lunout,*)' Configuration des parametres du gcm: '
    763773      write(lunout,*)' planet_type = ', planet_type
     774      write(lunout,*)' calend = ', calend
    764775      write(lunout,*)' dayref = ', dayref
    765776      write(lunout,*)' anneeref = ', anneeref
  • LMDZ4/branches/LMDZ4-dev/libf/dyn3d/gcm.F

    r1200 r1201  
    113113      real time_step, t_wrt, t_ops
    114114
    115       REAL rdayvrai,rdaym_ini,rday_ecri
    116115      LOGICAL first
    117116
     
    135134      character (len=20) :: modname
    136135      character (len=80) :: abort_message
    137 
    138 C Calendrier
    139       LOGICAL true_calendar
    140       PARAMETER (true_calendar = .false.)
     136! locales pour gestion du temps
     137      INTEGER :: an, mois, jour
     138      REAL :: heure
     139
    141140
    142141c-----------------------------------------------------------------------
     
    163162
    164163
    165 c-----------------------------------------------------------------------
    166 c   Choix du calendrier
    167 c   -------------------
    168 
    169 #ifdef CPP_IOIPSL
    170       if (true_calendar) then
    171         call ioconf_calendar('gregorian')
    172       else
    173         call ioconf_calendar('360d')
    174       endif
    175 #endif
    176164c----------------------------------------------------------------------
    177165c  lecture des fichiers gcm.def ou run.def
     
    197185      endif
    198186!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     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-----------------------------------------------------------------------
    199209
    200210      IF (config_inca /= 'none') THEN
     
    303313          annee_ref = anneeref
    304314          day_ref = dayref
    305           day_ini = dayref
     315          day_ini = 1
    306316          itau_dyn = 0
    307317          itau_phy = 0
     
    314324      endif
    315325
     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
    316332#ifdef CPP_IOIPSL
    317333      call ioconf_startdate(annee_ref,0,day_ref, 0.)
    318334#endif
    319335
     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
    320342
    321343c  nombre d'etats dans les fichiers demarrage et histoire
     
    391413      WRITE(lunout,300)day_ini,day_end
    392414 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)
    393421
    394422      if (planet_type.eq."earth") then
  • LMDZ4/branches/LMDZ4-dev/libf/dyn3d/ini_paramLMDZ_dyn.h

    r956 r1201  
    22      dt_cum = dtvr*day_step
    33
    4       zan = annee_ref
    5       dayref = day_ref
    6       CALL ymds2ju(zan, 1, dayref, 0.0, zjulian)
     4!      zan = annee_ref
     5!      dayref = day_ref
     6!      CALL ymds2ju(zan, 1, dayref, 0.0, zjulian)
    77      tau0 = itau_dyn
    88c
     
    1515     .                 iip1,rlong, jjp1,rlatg,
    1616     .                 1,1,1,1,
    17      .                 tau0, zjulian, dt_cum,
     17     .                 tau0, jD_ref+jH_ref , dt_cum,
    1818     .                 thoriid, nid_ctesGCM)
    1919c
     
    134134c
    135135         CALL histdef(nid_ctesGCM, "true_calendar",
    136      ."Choix du calendrier: 1=gregorien ,0=calen. a 360 j",
     136     ."Choix du calendrier",
    137137     .                "-",iip1,jjp1,thoriid, 1,1,1, -99, 32,
    138138     .                "once", dt_cum,dt_cum)
  • LMDZ4/branches/LMDZ4-dev/libf/dyn3d/leapfrog.F

    r1190 r1201  
     1!
     2! $Id$
    13!
    24c
     
    112114c
    113115      INTEGER itau,itaufinp1,iav
    114       INTEGER*4  iday ! jour julien
    115       REAL       time ! Heure de la journee en fraction d'1 jour
     116!      INTEGER  iday ! jour julien
     117      REAL       time
    116118
    117119      REAL  SSUM
     
    125127      real time_step, t_wrt, t_ops
    126128
    127       REAL rdayvrai,rdaym_ini
     129!      REAL rdayvrai,rdaym_ini
     130! jD_cur: jour julien courant
     131! jH_cur: heure julienne courante
     132      REAL :: jD_cur, jH_cur
     133      INTEGER :: an, mois, jour
     134      REAL :: secondes
     135
    128136      LOGICAL first,callinigrads
    129137cIM : pour sortir les param. du modele dans un fis. netcdf 110106
    130138      save first
    131139      data first/.true./
    132       real dt_cum, zjulian
     140      real dt_cum
    133141      character*10 infile
    134142      integer zan, tau0, thoriid
     
    167175      character*80 abort_message
    168176
    169 C Calendrier
    170       LOGICAL true_calendar
    171       PARAMETER (true_calendar = .false.)
    172 
    173177      logical dissip_conservative
    174178      save dissip_conservative
     
    193197
    194198      itau = 0
    195       iday = day_ini+itau/day_step
    196       time = FLOAT(itau-(iday-day_ini)*day_step)/day_step+time_0
    197          IF(time.GT.1.) THEN
    198           time = time-1.
    199           iday = iday+1
    200          ENDIF
     199c$$$      iday = day_ini+itau/day_step
     200c$$$      time = FLOAT(itau-(iday-day_ini)*day_step)/day_step+time_0
     201c$$$         IF(time.GT.1.) THEN
     202c$$$          time = time-1.
     203c$$$          iday = iday+1
     204c$$$         ENDIF
    201205
    202206
     
    214218
    215219   1  CONTINUE
     220
     221      jD_cur = jD_ref + (day_ini - 1) + int (itau * dtvr / daysec)
     222      jH_cur = jH_ref +                                                 &
     223     &          (itau * dtvr / daysec - int(itau * dtvr / daysec))
    216224
    217225
     
    284292      CALL geopot  ( ip1jmp1, teta  , pk , pks,  phis  , phi   )
    285293
     294      time = jD_cur + jH_cur
    286295      CALL caldyn
    287296     $  ( itau,ucov,vcov,teta,ps,masse,pk,pkf,phis ,
    288      $    phi,conser,du,dv,dteta,dp,w, pbaru,pbarv, time+iday-day_ini )
     297     $    phi,conser,du,dv,dteta,dp,w, pbaru,pbarv, time )
    289298
    290299
     
    345354         CALL exner_hyb(  ip1jmp1, ps, p,alpha,beta,pks, pk, pkf )
    346355
    347            rdaym_ini  = itau * dtvr / daysec
    348            rdayvrai   = rdaym_ini  + day_ini
    349 
     356!           rdaym_ini  = itau * dtvr / daysec
     357!           rdayvrai   = rdaym_ini  + day_ini
     358           jD_cur = jD_ref + (day_ini - 1) + int (itau * dtvr / daysec)
     359           jH_cur = jH_ref +                                            &
     360     &              (itau * dtvr / daysec - int(itau * dtvr / daysec))
     361!         write(lunout,*)'itau, jD_cur = ', itau, jD_cur, jH_cur
     362!         call ju2ymds(jD_cur+jH_cur, an, mois, jour, secondes)
     363!         write(lunout,*)'current date = ',an, mois, jour, secondes
    350364
    351365c rajout debug
     
    379393#endif
    380394! #endif of #ifdef CPP_IOIPSL
    381          CALL calfis( lafin ,rdayvrai,time  ,
     395         CALL calfis( lafin , jD_cur, jH_cur,
    382396     $               ucov,vcov,teta,q,masse,ps,p,pk,phis,phi ,
    383397     $               du,dv,dteta,dq,
     
    507521            IF(forward. OR. leapf) THEN
    508522              itau= itau + 1
    509               iday= day_ini+itau/day_step
    510               time= FLOAT(itau-(iday-day_ini)*day_step)/day_step+time_0
    511                 IF(time.GT.1.) THEN
    512                   time = time-1.
    513                   iday = iday+1
    514                 ENDIF
     523c$$$              iday= day_ini+itau/day_step
     524c$$$              time= FLOAT(itau-(iday-day_ini)*day_step)/day_step+time_0
     525c$$$                IF(time.GT.1.) THEN
     526c$$$                  time = time-1.
     527c$$$                  iday = iday+1
     528c$$$                ENDIF
    515529            ENDIF
    516530
     
    632646
    633647             itau =  itau + 1
    634              iday = day_ini+itau/day_step
    635              time = FLOAT(itau-(iday-day_ini)*day_step)/day_step+time_0
    636 
    637                   IF(time.GT.1.) THEN
    638                    time = time-1.
    639                    iday = iday+1
    640                   ENDIF
     648c$$$             iday = day_ini+itau/day_step
     649c$$$             time = FLOAT(itau-(iday-day_ini)*day_step)/day_step+time_0
     650c$$$
     651c$$$                  IF(time.GT.1.) THEN
     652c$$$                   time = time-1.
     653c$$$                   iday = iday+1
     654c$$$                  ENDIF
    641655
    642656               forward =  .FALSE.
  • LMDZ4/branches/LMDZ4-dev/libf/dyn3d/sortvarc.F

    r524 r1201  
    129129      ang   = SSUM(     llm,  angl, 1 )
    130130
    131       rday = FLOAT(INT ( day_ini + time ))
     131c      rday = FLOAT(INT ( day_ini + time ))
    132132c
     133       rday = FLOAT(INT(time-jD_ref-jH_ref))
    133134      IF(ptot0.eq.0.)  THEN
    134135         PRINT 3500, itau, rday, heure,time
     
    156157      RETURN
    157158
    158 3500   FORMAT('0'10(1h*),4x,'pas'i7,5x,'jour'f5.0,'heure'f5.1,4x
    159      *   ,'date',f10.5,4x,10(1h*))
     1593500   FORMAT('0'10(1h*),4x,'pas'i7,5x,'jour'f9.0,'heure'f5.1,4x
     160     *   ,'date',f14.4,4x,10(1h*))
    1601614000   FORMAT(10x,'masse',4x,'rmsdpdt',7x,'energie',2x,'enstrophie'
    161162     * ,2x,'entropie',3x,'rmsv',4x,'mt.ang',/,'GLOB  '
  • LMDZ4/branches/LMDZ4-dev/libf/dyn3d/temps.h

    r1154 r1201  
    11!
    2 ! $Header$
     2! $Id$
    33!
    44!  ATTENTION!!!!: ce fichier include est compatible format fixe/format libre
     
    88!
    99!
     10! jD_ref = jour julien de la date de reference (lancement de l'experience)
     11! hD_ref = "heure" julienne de la date de reference
    1012!-----------------------------------------------------------------------
    1113! INCLUDE 'temps.h'
    1214
    1315      COMMON/temps/itaufin, dt, day_ini, day_end, annee_ref, day_ref,   &
    14      &             itau_dyn, itau_phy
     16     &             itau_dyn, itau_phy, jD_ref, jH_ref, calend
    1517
    1618      INTEGER   itaufin
    17       INTEGER(kind=4) itau_dyn, itau_phy
    18       INTEGER(kind=4) day_ini, day_end, annee_ref, day_ref
    19       REAL      dt
     19      INTEGER itau_dyn, itau_phy
     20      INTEGER day_ini, day_end, annee_ref, day_ref
     21      REAL      dt, jD_ref, jH_ref
     22      CHARACTER (len=10) :: calend
    2023
    2124!-----------------------------------------------------------------------
  • LMDZ4/branches/LMDZ4-dev/libf/dyn3d/write_paramLMDZ_dyn.h

    r956 r1201  
    107107     .               zx_tmp_2d,iip1*jjp1,ndex2d)
    108108c
    109       IF(true_calendar) THEN
    110        zx_tmp_2d(1:iip1,1:jjp1)=1.
    111       ELSE
    112        zx_tmp_2d(1:iip1,1:jjp1)=0.
    113       ENDIF
     109      if (calend == 'earth_360d') then
     110        zx_tmp_2d(1:iip1,1:jjp1)=1.
     111      else if (calend == 'earth_365d') then
     112        zx_tmp_2d(1:iip1,1:jjp1)=2.
     113      else if (calend == 'earth_366d') then
     114        zx_tmp_2d(1:iip1,1:jjp1)=3.
     115      endif
     116
    114117      CALL histwrite(nid_ctesGCM, "true_calendar", itau_w,
    115118     .               zx_tmp_2d,iip1*jjp1,ndex2d)
Note: See TracChangeset for help on using the changeset viewer.