Ignore:
Timestamp:
Sep 11, 2024, 6:03:07 PM (4 months ago)
Author:
abarral
Message:

Encapsulate files in modules

Location:
LMDZ6/branches/Amaury_dev/libf/dyn3dmem
Files:
1 edited
1 moved

Legend:

Unmodified
Added
Removed
  • LMDZ6/branches/Amaury_dev/libf/dyn3dmem/gcm.F90

    r5182 r5186  
    1 
    21! $Id$
    32
     
    1413  USE control_mod
    1514
    16 
    1715  USE iniphysiq_mod, ONLY: iniphysiq
    1816  USE lmdz_cppkeys_wrapper, ONLY: CPPKEY_PHYS
     
    2018  USE comconst_mod, ONLY: cpp, daysec, dtphys, dtvr, g, r, rad
    2119  USE logic_mod ! all of it, because of copyin clause when calling leapfrog
    22   USE temps_mod, ONLY: calend,start_time,annee_ref,day_ref, &
    23                        itau_dyn,itau_phy,day_ini,jD_ref,jH_ref,day_end, &
    24                        dt,hour_ini,itaufin
     20  USE temps_mod, ONLY: calend, start_time, annee_ref, day_ref, &
     21          itau_dyn, itau_phy, day_ini, jD_ref, jH_ref, day_end, &
     22          dt, hour_ini, itaufin
    2523  USE mod_xios_dyn3dmem, ONLY: xios_dyn3dmem_init
    2624  USE lmdz_filtreg, ONLY: inifilr
     
    3432  USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm
    3533  USE lmdz_paramet
     34  USE lmdz_conf_gcm, ONLY: conf_gcm
     35
    3636  IMPLICIT NONE
    3737
     
    6666  !   -------------
    6767
    68 
    69 
    7068  REAL zdtvr
    7169
    7270  !   variables dynamiques
    73   REAL,ALLOCATABLE,SAVE  :: vcov(:,:),ucov(:,:) ! vents covariants
    74   REAL,ALLOCATABLE,SAVE  :: teta(:,:)     ! temperature potentielle
    75   REAL, ALLOCATABLE,SAVE :: q(:,:,:)      ! champs advectes
    76   REAL,ALLOCATABLE,SAVE :: ps(:)         ! pression  au sol
     71  REAL, ALLOCATABLE, SAVE :: vcov(:, :), ucov(:, :) ! vents covariants
     72  REAL, ALLOCATABLE, SAVE :: teta(:, :)     ! temperature potentielle
     73  REAL, ALLOCATABLE, SAVE :: q(:, :, :)      ! champs advectes
     74  REAL, ALLOCATABLE, SAVE :: ps(:)         ! pression  au sol
    7775  !      REAL p (ip1jmp1,llmp1  )               ! pression aux interfac.des couches
    78   REAL,ALLOCATABLE,SAVE  :: masse(:,:)    ! masse d'air
    79   REAL,ALLOCATABLE,SAVE :: phis(:)       ! geopotentiel au sol
     76  REAL, ALLOCATABLE, SAVE :: masse(:, :)    ! masse d'air
     77  REAL, ALLOCATABLE, SAVE :: phis(:)       ! geopotentiel au sol
    8078  !      REAL phi(ip1jmp1,llm)                  ! geopotentiel
    8179  !      REAL w(ip1jmp1,llm)                    ! vitesse verticale
     
    103101  !-jld
    104102
    105 
    106   CHARACTER (LEN=80) :: dynhist_file, dynhistave_file
    107   CHARACTER (LEN=20) :: modname
    108   CHARACTER (LEN=80) :: abort_message
     103  CHARACTER (LEN = 80) :: dynhist_file, dynhistave_file
     104  CHARACTER (LEN = 20) :: modname
     105  CHARACTER (LEN = 80) :: abort_message
    109106  ! locales pour gestion du temps
    110107  INTEGER :: an, mois, jour
    111108  REAL :: heure
    112109  ! needed for xios interface
    113   CHARACTER (LEN=10) :: xios_cal_type
     110  CHARACTER (LEN = 10) :: xios_cal_type
    114111  INTEGER :: anref, moisref, jourref
    115112  REAL :: heureref
    116  
     113
    117114
    118115
     
    124121  modname = 'gcm'
    125122  descript = 'Run GCM LMDZ'
    126   lafin    = .FALSE.
     123  lafin = .FALSE.
    127124  dynhist_file = 'dyn_hist'
    128125  dynhistave_file = 'dyn_hist_ave'
     
    134131  !  ---------------------------------------
    135132
    136   CALL conf_gcm( 99, .TRUE. )
     133  CALL conf_gcm(99, .TRUE.)
    137134  IF (mod(iphysiq, iperiod) /= 0) CALL abort_gcm("conf_gcm", &
    138        "iphysiq must be a multiple of iperiod", 1)
     135          "iphysiq must be a multiple of iperiod", 1)
    139136
    140137
     
    147144  CALL Read_Distrib
    148145
    149 !#ifdef CPP_PHYS
    150 !  CALL Init_Phys_lmdz(iim,jjp1,llm,mpi_size,distrib_phys)
     146  !#ifdef CPP_PHYS
     147  !  CALL Init_Phys_lmdz(iim,jjp1,llm,mpi_size,distrib_phys)
    151148  !#endif
    152149  !      CALL set_bands
    153150  !#ifdef CPP_PHYS
    154 !  CALL Init_interface_dyn_phys
    155 !#endif
     151  !  CALL Init_interface_dyn_phys
     152  !#endif
    156153  CALL barrier
    157154
     
    177174
    178175  IF (calend == 'earth_360d') THEN
    179      CALL ioconf_calendar('360_day')
    180      WRITE(lunout,*)'CALENDRIER CHOISI: Terrestre a 360 jours/an'
    181      xios_cal_type='d360'
     176    CALL ioconf_calendar('360_day')
     177    WRITE(lunout, *)'CALENDRIER CHOISI: Terrestre a 360 jours/an'
     178    xios_cal_type = 'd360'
    182179  ELSE IF (calend == 'earth_365d') THEN
    183      CALL ioconf_calendar('noleap')
    184      WRITE(lunout,*)'CALENDRIER CHOISI: Terrestre a 365 jours/an'
    185      xios_cal_type='noleap'
     180    CALL ioconf_calendar('noleap')
     181    WRITE(lunout, *)'CALENDRIER CHOISI: Terrestre a 365 jours/an'
     182    xios_cal_type = 'noleap'
    186183  ELSE IF (calend == 'gregorian') THEN
    187      CALL ioconf_calendar('gregorian')
    188      WRITE(lunout,*)'CALENDRIER CHOISI: Terrestre bissextile'
    189      xios_cal_type='gregorian'
     184    CALL ioconf_calendar('gregorian')
     185    WRITE(lunout, *)'CALENDRIER CHOISI: Terrestre bissextile'
     186    xios_cal_type = 'gregorian'
    190187  else
    191      abort_message = 'Mauvais choix de calendrier'
    192      CALL abort_gcm(modname,abort_message,1)
     188    abort_message = 'Mauvais choix de calendrier'
     189    CALL abort_gcm(modname, abort_message, 1)
    193190  ENDIF
    194191
     
    202199
    203200  ! Allocation de la tableau q : champs advectes   
    204   ALLOCATE(ucov(ijb_u:ije_u,llm))
    205   ALLOCATE(vcov(ijb_v:ije_v,llm))
    206   ALLOCATE(teta(ijb_u:ije_u,llm))
    207   ALLOCATE(masse(ijb_u:ije_u,llm))
     201  ALLOCATE(ucov(ijb_u:ije_u, llm))
     202  ALLOCATE(vcov(ijb_v:ije_v, llm))
     203  ALLOCATE(teta(ijb_u:ije_u, llm))
     204  ALLOCATE(masse(ijb_u:ije_u, llm))
    208205  ALLOCATE(ps(ijb_u:ije_u))
    209206  ALLOCATE(phis(ijb_u:ije_u))
    210   ALLOCATE(q(ijb_u:ije_u,llm,nqtot))
     207  ALLOCATE(q(ijb_u:ije_u, llm, nqtot))
    211208
    212209  !-----------------------------------------------------------------------
     
    216213  !  lecture du fichier start.nc
    217214  IF (read_start) THEN
    218      ! we still need to run iniacademic to initialize some
    219      ! constants & fields, if we run the 'newtonian' or 'SW' cases:
    220      IF (iflag_phys/=1) THEN
    221         CALL iniacademic_loc(vcov,ucov,teta,q,masse,ps,phis,time_0)
    222      endif
    223 
    224      !        if (planet_type.EQ."earth") THEN
    225      ! Load an Earth-format start file
    226      CALL dynetat0_loc("start.nc",vcov,ucov, &
    227           teta,q,masse,ps,phis, time_0)
    228      !        endif ! of if (planet_type.EQ."earth")
    229 
    230      !       WRITE(73,*) 'ucov',ucov
    231      !       WRITE(74,*) 'vcov',vcov
    232      !       WRITE(75,*) 'teta',teta
    233      !       WRITE(76,*) 'ps',ps
    234      !       WRITE(77,*) 'q',q
     215    ! we still need to run iniacademic to initialize some
     216    ! constants & fields, if we run the 'newtonian' or 'SW' cases:
     217    IF (iflag_phys/=1) THEN
     218      CALL iniacademic_loc(vcov, ucov, teta, q, masse, ps, phis, time_0)
     219    endif
     220
     221    !        if (planet_type.EQ."earth") THEN
     222    ! Load an Earth-format start file
     223    CALL dynetat0_loc("start.nc", vcov, ucov, &
     224            teta, q, masse, ps, phis, time_0)
     225    !        endif ! of if (planet_type.EQ."earth")
     226
     227    !       WRITE(73,*) 'ucov',ucov
     228    !       WRITE(74,*) 'vcov',vcov
     229    !       WRITE(75,*) 'teta',teta
     230    !       WRITE(76,*) 'ps',ps
     231    !       WRITE(77,*) 'q',q
    235232
    236233  ENDIF ! of if (read_start)
    237234
    238235  ! le cas echeant, creation d un etat initial
    239   IF (prt_level > 9) WRITE(lunout,*) &
    240        'GCM: AVANT iniacademic AVANT AVANT AVANT AVANT'
     236  IF (prt_level > 9) WRITE(lunout, *) &
     237          'GCM: AVANT iniacademic AVANT AVANT AVANT AVANT'
    241238  IF (.NOT.read_start) THEN
    242      start_time=0.
    243      annee_ref=anneeref
    244      CALL iniacademic_loc(vcov,ucov,teta,q,masse,ps,phis,time_0)
     239    start_time = 0.
     240    annee_ref = anneeref
     241    CALL iniacademic_loc(vcov, ucov, teta, q, masse, ps, phis, time_0)
    245242  ENDIF
    246243
     
    250247  !  on recalcule eventuellement le pas de temps
    251248
    252   IF(MOD(day_step,iperiod)/=0) THEN
    253      abort_message = &
    254           'Il faut choisir un nb de pas par jour multiple de iperiod'
    255      CALL abort_gcm(modname,abort_message,1)
    256   ENDIF
    257 
    258   IF(MOD(day_step,iphysiq)/=0) THEN
    259      abort_message = &
    260           'Il faut choisir un nb de pas par jour multiple de iphysiq'
    261      CALL abort_gcm(modname,abort_message,1)
    262   ENDIF
    263 
    264   zdtvr    = daysec/REAL(day_step)
     249  IF(MOD(day_step, iperiod)/=0) THEN
     250    abort_message = &
     251            'Il faut choisir un nb de pas par jour multiple de iperiod'
     252    CALL abort_gcm(modname, abort_message, 1)
     253  ENDIF
     254
     255  IF(MOD(day_step, iphysiq)/=0) THEN
     256    abort_message = &
     257            'Il faut choisir un nb de pas par jour multiple de iphysiq'
     258    CALL abort_gcm(modname, abort_message, 1)
     259  ENDIF
     260
     261  zdtvr = daysec / REAL(day_step)
    265262  IF(dtvr/=zdtvr) THEN
    266      WRITE(lunout,*) &
    267           'WARNING!!! changement de pas de temps',dtvr,'>',zdtvr
     263    WRITE(lunout, *) &
     264            'WARNING!!! changement de pas de temps', dtvr, '>', zdtvr
    268265  ENDIF
    269266
     
    271268
    272269  IF (start_time /= starttime) THEN
    273      WRITE(lunout,*)' GCM: Attention l''heure de depart lue dans le' &
    274           ,' fichier restart ne correspond pas a celle lue dans le run.def'
    275      IF (raz_date == 1) THEN
    276         WRITE(lunout,*)'Je prends l''heure lue dans run.def'
    277         start_time = starttime
    278      ELSE
    279         WRITE(lunout,*)'Je m''arrete'
    280         CALL abort
    281      ENDIF
     270    WRITE(lunout, *)' GCM: Attention l''heure de depart lue dans le' &
     271            , ' fichier restart ne correspond pas a celle lue dans le run.def'
     272    IF (raz_date == 1) THEN
     273      WRITE(lunout, *)'Je prends l''heure lue dans run.def'
     274      start_time = starttime
     275    ELSE
     276      WRITE(lunout, *)'Je m''arrete'
     277      CALL abort
     278    ENDIF
    282279  ENDIF
    283280  IF (raz_date == 1) THEN
    284      annee_ref = anneeref
    285      day_ref = dayref
    286      day_ini = dayref
    287      itau_dyn = 0
    288      itau_phy = 0
    289      time_0 = 0.
    290      WRITE(lunout,*) &
    291           'GCM: On reinitialise a la date lue dans gcm.def'
     281    annee_ref = anneeref
     282    day_ref = dayref
     283    day_ini = dayref
     284    itau_dyn = 0
     285    itau_phy = 0
     286    time_0 = 0.
     287    WRITE(lunout, *) &
     288            'GCM: On reinitialise a la date lue dans gcm.def'
    292289  ELSE IF (annee_ref /= anneeref .OR. day_ref /= dayref) THEN
    293      WRITE(lunout,*) &
    294           'GCM: Attention les dates initiales lues dans le fichier'
    295      WRITE(lunout,*) &
    296           ' restart ne correspondent pas a celles lues dans '
    297      WRITE(lunout,*)' gcm.def'
    298      WRITE(lunout,*)' annee_ref=',annee_ref," anneeref=",anneeref
    299      WRITE(lunout,*)' day_ref=',day_ref," dayref=",dayref
    300      WRITE(lunout,*)' Pas de remise a zero'
     290    WRITE(lunout, *) &
     291            'GCM: 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    WRITE(lunout, *)' annee_ref=', annee_ref, " anneeref=", anneeref
     296    WRITE(lunout, *)' day_ref=', day_ref, " dayref=", dayref
     297    WRITE(lunout, *)' Pas de remise a zero'
    301298  ENDIF
    302299  !      if (annee_ref .NE. anneeref .OR. day_ref .NE. dayref) THEN
     
    333330  CALL ioconf_startdate(INT(jD_ref), jH_ref)
    334331
    335   WRITE(lunout,*)'DEBUG'
    336   WRITE(lunout,*)'annee_ref, mois, day_ref, heure, jD_ref'
    337   WRITE(lunout,*)annee_ref, mois, day_ref, heure, jD_ref
    338   CALL ju2ymds(jD_ref+jH_ref,anref, moisref, jourref, heureref)
    339   WRITE(lunout,*)'jD_ref+jH_ref,an, mois, jour, heure'
    340   WRITE(lunout,*)jD_ref+jH_ref,anref, moisref, jourref, heureref
     332  WRITE(lunout, *)'DEBUG'
     333  WRITE(lunout, *)'annee_ref, mois, day_ref, heure, jD_ref'
     334  WRITE(lunout, *)annee_ref, mois, day_ref, heure, jD_ref
     335  CALL ju2ymds(jD_ref + jH_ref, anref, moisref, jourref, heureref)
     336  WRITE(lunout, *)'jD_ref+jH_ref,an, mois, jour, heure'
     337  WRITE(lunout, *)jD_ref + jH_ref, anref, moisref, jourref, heureref
    341338
    342339  IF (iflag_phys==1) THEN
    343      ! these initialisations have already been done (via iniacademic)
    344      ! if running in SW or Newtonian mode
    345      !-----------------------------------------------------------------------
    346      !   Initialisation des constantes dynamiques :
    347      !   ------------------------------------------
    348      dtvr = zdtvr
    349      CALL iniconst
    350 
    351      !-----------------------------------------------------------------------
    352      !   Initialisation de la geometrie :
    353      !   --------------------------------
    354      CALL inigeom
    355 
    356      !-----------------------------------------------------------------------
    357      !   Initialisation du filtre :
    358      !   --------------------------
    359      CALL inifilr
     340    ! these initialisations have already been done (via iniacademic)
     341    ! if running in SW or Newtonian mode
     342    !-----------------------------------------------------------------------
     343    !   Initialisation des constantes dynamiques :
     344    !   ------------------------------------------
     345    dtvr = zdtvr
     346    CALL iniconst
     347
     348    !-----------------------------------------------------------------------
     349    !   Initialisation de la geometrie :
     350    !   --------------------------------
     351    CALL inigeom
     352
     353    !-----------------------------------------------------------------------
     354    !   Initialisation du filtre :
     355    !   --------------------------
     356    CALL inifilr
    360357  ENDIF ! of if (iflag_phys.EQ.1)
    361358
     
    364361  !   ----------------------------------
    365362
    366   CALL inidissip( lstardis, nitergdiv, nitergrot, niterh   , &
    367        tetagdiv, tetagrot , tetatemp, vert_prof_dissip)
     363  CALL inidissip(lstardis, nitergdiv, nitergrot, niterh, &
     364          tetagdiv, tetagrot, tetatemp, vert_prof_dissip)
    368365
    369366  !-----------------------------------------------------------------------
     
    371368  !   ------------------------
    372369
    373 
    374370  IF (nday>=0) THEN
    375      day_end = day_ini + nday
     371    day_end = day_ini + nday
    376372  else
    377      day_end = day_ini - nday/day_step
    378   ENDIF
    379 
    380   WRITE(lunout,300)day_ini,day_end
    381 300 FORMAT('1'/,15x,'run du jour',i7,2x,'au jour',i7//)
     373    day_end = day_ini - nday / day_step
     374  ENDIF
     375
     376  WRITE(lunout, 300)day_ini, day_end
     377  300 FORMAT('1'/, 15x, 'run du jour', i7, 2x, 'au jour', i7//)
    382378
    383379  CALL ju2ymds(jD_ref + day_ini - day_ref, an, mois, jour, heure)
    384   write (lunout,301)jour, mois, an
     380  write (lunout, 301)jour, mois, an
    385381  CALL ju2ymds(jD_ref + day_end - day_ref, an, mois, jour, heure)
    386   write (lunout,302)jour, mois, an
    387 301 FORMAT('1'/,15x,'run du ', i2,'/',i2,'/',i4)
    388 302 FORMAT('1'/,15x,'    au ', i2,'/',i2,'/',i4)
     382  write (lunout, 302)jour, mois, an
     383  301 FORMAT('1'/, 15x, 'run du ', i2, '/', i2, '/', i4)
     384  302 FORMAT('1'/, 15x, '    au ', i2, '/', i2, '/', i4)
    389385
    390386  !-----------------------------------------------------------------------
     
    395391  !      istdyn=day_step/4     ! stockage toutes les 6h=1jour/4
    396392  !      istdyn=day_step/12     ! stockage toutes les 2h=1jour/12
    397   istdyn=day_step/8     ! stockage toutes les 6h=1jour/12
    398   istphy=istdyn/iphysiq
     393  istdyn = day_step / 8     ! stockage toutes les 6h=1jour/12
     394  istphy = istdyn / iphysiq
    399395
    400396  IF ((iflag_phys==1).OR.(iflag_phys>=100)) THEN
    401      ! Physics:
     397    ! Physics:
    402398    IF (CPPKEY_PHYS) THEN
    403       CALL iniphysiq(iim,jjm,llm, &
    404             distrib_phys(mpi_rank),comm_lmdz, &
    405             daysec,day_ini,dtphys/nsplit_phys, &
    406             rlatu,rlatv,rlonu,rlonv,aire,cu,cv,rad,g,r,cpp, &
    407             iflag_phys)
     399      CALL iniphysiq(iim, jjm, llm, &
     400              distrib_phys(mpi_rank), comm_lmdz, &
     401              daysec, day_ini, dtphys / nsplit_phys, &
     402              rlatu, rlatv, rlonu, rlonv, aire, cu, cv, rad, g, r, cpp, &
     403              iflag_phys)
    408404    END IF
    409405  ENDIF ! of IF ((iflag_phys==1).OR.(iflag_phys>=100))
     
    418414
    419415  time_step = zdtvr
    420      IF (ok_dyn_ins) THEN
    421         ! initialize output file for instantaneous outputs
    422         ! t_ops = iecri * daysec ! do operations every t_ops
    423         t_ops =((1.0*iecri)/day_step) * daysec
    424         t_wrt = daysec ! iecri * daysec ! write output every t_wrt
    425         CALL inithist_loc(day_ref,annee_ref,time_step, &
    426              t_ops,t_wrt)
    427      endif
    428 
    429      IF (ok_dyn_ave) THEN
    430         ! initialize output file for averaged outputs
    431         t_ops = iperiod * time_step ! do operations every t_ops
    432         t_wrt = periodav * daysec   ! write output every t_wrt
    433         CALL initdynav_loc(day_ref,annee_ref,time_step,t_ops,t_wrt)
    434      END IF
    435   dtav = iperiod*dtvr/daysec
    436 
    437 ! setting up DYN3D/XIOS inerface
     416  IF (ok_dyn_ins) THEN
     417    ! initialize output file for instantaneous outputs
     418    ! t_ops = iecri * daysec ! do operations every t_ops
     419    t_ops = ((1.0 * iecri) / day_step) * daysec
     420    t_wrt = daysec ! iecri * daysec ! write output every t_wrt
     421    CALL inithist_loc(day_ref, annee_ref, time_step, &
     422            t_ops, t_wrt)
     423  endif
     424
     425  IF (ok_dyn_ave) THEN
     426    ! initialize output file for averaged outputs
     427    t_ops = iperiod * time_step ! do operations every t_ops
     428    t_wrt = periodav * daysec   ! write output every t_wrt
     429    CALL initdynav_loc(day_ref, annee_ref, time_step, t_ops, t_wrt)
     430  END IF
     431  dtav = iperiod * dtvr / daysec
     432
     433  ! setting up DYN3D/XIOS inerface
    438434  IF (ok_dyn_xios) THEN
    439       CALL xios_dyn3dmem_init(xios_cal_type, anref, moisref, jourref,heureref, an,  &
    440           mois, jour, heure, zdtvr)
     435    CALL xios_dyn3dmem_init(xios_cal_type, anref, moisref, jourref, heureref, an, &
     436            mois, jour, heure, zdtvr)
    441437  ENDIF
    442438
     
    460456  !$OMP COPYIN(ok_strato,ok_gradsfile,ok_limit,ok_etat0) &
    461457  !$OMP COPYIN(iflag_phys,iflag_trac,adv_qsat_liq)
    462   CALL leapfrog_loc(ucov,vcov,teta,ps,masse,phis,q,time_0)
     458  CALL leapfrog_loc(ucov, vcov, teta, ps, masse, phis, q, time_0)
    463459  !$OMP END PARALLEL
    464460
  • LMDZ6/branches/Amaury_dev/libf/dyn3dmem/lmdz_conf_gcm.f90

    r5185 r5186  
    1 
    2 ! $Id$
    3 
    4 SUBROUTINE conf_gcm( tapedef, etatinit )
    5 
    6   USE control_mod
    7   USE IOIPSL
    8   USE misc_mod
    9   USE lmdz_filtre_fft, ONLY: use_filtre_fft
    10   USE lmdz_filtre_fft_loc, ONLY: use_filtre_fft_loc=>use_filtre_fft
    11   USE mod_hallo, ONLY: use_mpi_alloc
    12   USE lmdz_infotrac, ONLY: type_trac
    13   USE lmdz_assert, ONLY: assert
    14   USE comconst_mod, ONLY: dissip_deltaz, dissip_factz, dissip_zref, &
    15                           iflag_top_bound, mode_top_bound, tau_top_bound, &
    16                           ngroup, maxlatfilter
    17   USE logic_mod, ONLY: fxyhypb, iflag_phys, ok_etat0, ok_gradsfile, &
    18                        ok_guide, ok_limit, ok_strato, purmats, read_start, &
    19                        ysinus, read_orop, adv_qsat_liq
    20   USE serre_mod, ONLY: clon,clat,grossismx,grossismy,dzoomx,dzoomy, &
    21                        alphax,alphay,taux,tauy
    22   USE temps_mod, ONLY: calend, year_len, offline_time
    23   USE lmdz_iniprint, ONLY: lunout, prt_level
    24   USE lmdz_comdissnew, ONLY: lstardis, nitergdiv, nitergrot, niterh, tetagdiv, &
    25           tetagrot, tetatemp, coefdis, vert_prof_dissip
    26 
    27   USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm
    28   USE lmdz_paramet
    29   IMPLICIT NONE
    30   !-----------------------------------------------------------------------
    31   !     Auteurs :   L. Fairhead , P. Le Van  .
    32 
    33   !     Arguments :
    34 
    35   !     tapedef   :
    36   !     etatinit  :     = TRUE   , on ne  compare pas les valeurs des para-
    37   !     -metres  du zoom  avec  celles lues sur le fichier start .
    38 
    39   LOGICAL,INTENT(IN) :: etatinit
    40   INTEGER,INTENT(IN) :: tapedef
    41 
    42   !   Declarations :
    43   !   --------------
    44 
    45 
    46 
    47   !   local:
    48   !   ------
    49 
    50   CHARACTER ch1*72,ch2*72,ch3*72,ch4*12
    51   REAL clonn,clatt,grossismxx,grossismyy
    52   REAL dzoomxx,dzoomyy, tauxx,tauyy
    53   LOGICAL  fxyhypbb, ysinuss
    54   INTEGER i
    55   CHARACTER(len=*), PARAMETER :: modname="conf_gcm"
    56   CHARACTER(len=80) :: abort_message
     1MODULE lmdz_conf_gcm
     2  IMPLICIT NONE; PRIVATE
     3  PUBLIC conf_gcm
     4
     5CONTAINS
     6
     7  SUBROUTINE conf_gcm(tapedef, etatinit)
     8
     9    USE control_mod
     10    USE IOIPSL
     11    USE misc_mod
     12    USE lmdz_filtre_fft, ONLY: use_filtre_fft
     13    USE lmdz_filtre_fft_loc, ONLY: use_filtre_fft_loc => use_filtre_fft
     14    USE mod_hallo, ONLY: use_mpi_alloc
     15    USE lmdz_infotrac, ONLY: type_trac
     16    USE lmdz_assert, ONLY: assert
     17    USE comconst_mod, ONLY: dissip_deltaz, dissip_factz, dissip_zref, &
     18            iflag_top_bound, mode_top_bound, tau_top_bound, &
     19            ngroup, maxlatfilter
     20    USE logic_mod, ONLY: fxyhypb, iflag_phys, ok_etat0, ok_gradsfile, &
     21            ok_guide, ok_limit, ok_strato, purmats, read_start, &
     22            ysinus, read_orop, adv_qsat_liq
     23    USE serre_mod, ONLY: clon, clat, grossismx, grossismy, dzoomx, dzoomy, &
     24            alphax, alphay, taux, tauy
     25    USE temps_mod, ONLY: calend, year_len, offline_time
     26    USE lmdz_iniprint, ONLY: lunout, prt_level
     27    USE lmdz_comdissnew, ONLY: lstardis, nitergdiv, nitergrot, niterh, tetagdiv, &
     28            tetagrot, tetatemp, coefdis, vert_prof_dissip
     29
     30    USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm
     31    USE lmdz_paramet
     32    IMPLICIT NONE
     33    !-----------------------------------------------------------------------
     34    !     Auteurs :   L. Fairhead , P. Le Van  .
     35
     36    !     Arguments :
     37
     38    !     tapedef   :
     39    !     etatinit  :     = TRUE   , on ne  compare pas les valeurs des para-
     40    !     -metres  du zoom  avec  celles lues sur le fichier start .
     41
     42    LOGICAL, INTENT(IN) :: etatinit
     43    INTEGER, INTENT(IN) :: tapedef
     44
     45    !   Declarations :
     46    !   --------------
     47
     48
     49
     50    !   local:
     51    !   ------
     52
     53    CHARACTER ch1*72, ch2*72, ch3*72, ch4*12
     54    REAL clonn, clatt, grossismxx, grossismyy
     55    REAL dzoomxx, dzoomyy, tauxx, tauyy
     56    LOGICAL  fxyhypbb, ysinuss
     57    INTEGER i
     58    CHARACTER(len = *), PARAMETER :: modname = "conf_gcm"
     59    CHARACTER(len = 80) :: abort_message
    5760#ifdef CPP_OMP
    5861  INTEGER, EXTERNAL :: OMP_GET_NUM_THREADS
    5962#endif
    6063
    61   !  -------------------------------------------------------------------
    62 
    63   !       .........     Version  du 29/04/97       ..........
    64 
    65   !   Nouveaux parametres nitergdiv,nitergrot,niterh,tetagdiv,tetagrot,
    66   !      tetatemp   ajoutes  pour la dissipation   .
    67 
    68   !   Autre parametre ajoute en fin de liste de tapedef : ** fxyhypb **
    69 
    70   !  Si fxyhypb = .TRUE. , choix de la fonction a derivee tangente hyperb.
    71   !    Sinon , choix de fxynew  , a derivee sinusoidale  ..
    72 
    73   !   ......  etatinit = . TRUE. si defrun  est appele dans ETAT0_LMD  ou
    74   !         LIMIT_LMD  pour l'initialisation de start.dat (dic) et
    75   !                de limit.dat ( dic)                        ...........
    76   !           Sinon  etatinit = . FALSE .
    77 
    78   !   Donc etatinit = .F.  si on veut comparer les valeurs de  grossismx ,
    79   !    grossismy,clon,clat, fxyhypb  lues sur  le fichier  start  avec
    80   !   celles passees  par run.def ,  au debut du gcm, apres l'appel a
    81   !    lectba . 
    82   !   Ces parmetres definissant entre autres la grille et doivent etre
    83   !   pareils et coherents , sinon il y aura  divergence du gcm .
    84 
    85   !-----------------------------------------------------------------------
    86   !   initialisations:
    87   !   ----------------
    88 
    89   !Config  Key  = lunout
    90   !Config  Desc = unite de fichier pour les impressions
    91   !Config  Def  = 6
    92   !Config  Help = unite de fichier pour les impressions
    93   !Config         (defaut sortie standard = 6)
    94   lunout=6
    95   CALL getin('lunout', lunout)
    96   IF (lunout /= 5 .AND. lunout /= 6) THEN
    97      OPEN(UNIT=lunout,FILE='lmdz.out_0000',ACTION='write', &
    98           STATUS='unknown',FORM='formatted')
    99   ENDIF
    100 
    101   adjust=.FALSE.
    102   CALL getin('adjust',adjust)
     64    !  -------------------------------------------------------------------
     65
     66    !       .........     Version  du 29/04/97       ..........
     67
     68    !   Nouveaux parametres nitergdiv,nitergrot,niterh,tetagdiv,tetagrot,
     69    !      tetatemp   ajoutes  pour la dissipation   .
     70
     71    !   Autre parametre ajoute en fin de liste de tapedef : ** fxyhypb **
     72
     73    !  Si fxyhypb = .TRUE. , choix de la fonction a derivee tangente hyperb.
     74    !    Sinon , choix de fxynew  , a derivee sinusoidale  ..
     75
     76    !   ......  etatinit = . TRUE. si defrun  est appele dans ETAT0_LMD  ou
     77    !         LIMIT_LMD  pour l'initialisation de start.dat (dic) et
     78    !                de limit.dat ( dic)                        ...........
     79    !           Sinon  etatinit = . FALSE .
     80
     81    !   Donc etatinit = .F.  si on veut comparer les valeurs de  grossismx ,
     82    !    grossismy,clon,clat, fxyhypb  lues sur  le fichier  start  avec
     83    !   celles passees  par run.def ,  au debut du gcm, apres l'appel a
     84    !    lectba .
     85    !   Ces parmetres definissant entre autres la grille et doivent etre
     86    !   pareils et coherents , sinon il y aura  divergence du gcm .
     87
     88    !-----------------------------------------------------------------------
     89    !   initialisations:
     90    !   ----------------
     91
     92    !Config  Key  = lunout
     93    !Config  Desc = unite de fichier pour les impressions
     94    !Config  Def  = 6
     95    !Config  Help = unite de fichier pour les impressions
     96    !Config         (defaut sortie standard = 6)
     97    lunout = 6
     98    CALL getin('lunout', lunout)
     99    IF (lunout /= 5 .AND. lunout /= 6) THEN
     100      OPEN(UNIT = lunout, FILE = 'lmdz.out_0000', ACTION = 'write', &
     101              STATUS = 'unknown', FORM = 'formatted')
     102    ENDIF
     103
     104    adjust = .FALSE.
     105    CALL getin('adjust', adjust)
    103106
    104107#ifdef CPP_OMP
     
    114117#endif
    115118
    116   itaumax=0
    117   CALL getin('itaumax',itaumax);
    118   IF (itaumax<=0) itaumax=HUGE(itaumax)
    119 
    120   !Config  Key  = prt_level
    121   !Config  Desc = niveau d'impressions de débogage
    122   !Config  Def  = 0
    123   !Config  Help = Niveau d'impression pour le débogage
    124   !Config         (0 = minimum d'impression)
    125   prt_level = 0
    126   CALL getin('prt_level',prt_level)
    127 
    128   !-----------------------------------------------------------------------
    129   !  Parametres de controle du run:
    130   !-----------------------------------------------------------------------
    131   !Config  Key  = planet_type
    132   !Config  Desc = planet type ("earth", "mars", "venus", ...)
    133   !Config  Def  = earth
    134   !Config  Help = this flag sets the type of atymosphere that is considered
    135   planet_type="earth"
    136   CALL getin('planet_type',planet_type)
    137 
    138   !Config  Key  = calend
    139   !Config  Desc = type de calendrier utilise
    140   !Config  Def  = earth_360d
    141   !Config  Help = valeur possible: earth_360d, earth_365d, earth_366d
    142   !Config         
    143   calend = 'earth_360d'
    144 ! initialize year_len for aquaplanets and 1D
    145   CALL getin('calend', calend)
    146   IF (calend == 'earth_360d') THEN
    147     year_len=360
    148   ELSE IF (calend == 'earth_365d') THEN
    149     year_len=365
    150   ELSE IF (calend == 'earth_366d') THEN
    151     year_len=366
    152   ELSE
    153     year_len=1
    154   ENDIF
    155 
    156   !Config  Key  = dayref
    157   !Config  Desc = Jour de l'etat initial
    158   !Config  Def  = 1
    159   !Config  Help = Jour de l'etat initial ( = 350  si 20 Decembre ,
    160   !Config         par expl. ,comme ici ) ... A completer
    161   dayref=1
    162   CALL getin('dayref', dayref)
    163 
    164   !Config  Key  = anneeref
    165   !Config  Desc = Annee de l'etat initial
    166   !Config  Def  = 1998
    167   !Config  Help = Annee de l'etat  initial
    168   !Config         (   avec  4  chiffres   ) ... A completer
    169   anneeref = 1998
    170   CALL getin('anneeref',anneeref)
    171 
    172   !Config  Key  = raz_date
    173   !Config  Desc = Remise a zero de la date initiale
    174   !Config  Def  = 0 (pas de remise a zero)
    175   !Config  Help = Remise a zero de la date initiale
    176   !Config         0 pas de remise a zero, on garde la date du fichier restart
    177   !Config         1 prise en compte de la date de gcm.def avec remise a zero
    178   !Config         des compteurs de pas de temps
    179   raz_date = 0
    180   CALL getin('raz_date', raz_date)
    181 
    182   !Config  Key  = resetvarc
    183   !Config  Desc = Reinit des variables de controle
    184   !Config  Def  = n
    185   !Config  Help = Reinit des variables de controle
    186   resetvarc = .FALSE.
    187   CALL getin('resetvarc',resetvarc)
    188 
    189   !Config  Key  = nday
    190   !Config  Desc = Nombre de jours d'integration
    191   !Config  Def  = 10
    192   !Config  Help = Nombre de jours d'integration
    193   !Config         ... On pourait aussi permettre des mois ou des annees !
    194   nday = 10
    195   CALL getin('nday',nday)
    196 
    197   !Config  Key  = starttime
    198   !Config  Desc = Heure de depart de la simulation
    199   !Config  Def  = 0
    200   !Config  Help = Heure de depart de la simulation
    201   !Config         en jour
    202   starttime = 0
    203   CALL getin('starttime',starttime)
    204 
    205   !Config  Key  = day_step
    206   !Config  Desc = nombre de pas par jour
    207   !Config  Def  = 240
    208   !Config  Help = nombre de pas par jour (multiple de iperiod) (
    209   !Config          ici pour  dt = 1 min )
    210   day_step = 240
    211   CALL getin('day_step',day_step)
    212 
    213   !Config  Key  = nsplit_phys
    214   nsplit_phys = 1
    215   CALL getin('nsplit_phys',nsplit_phys)
    216 
    217   !Config  Key  = iperiod
    218   !Config  Desc = periode pour le pas Matsuno
    219   !Config  Def  = 5
    220   !Config  Help = periode pour le pas Matsuno (en pas de temps)
    221   iperiod = 5
    222   CALL getin('iperiod',iperiod)
    223 
    224   !Config  Key  = iapp_tracvl
    225   !Config  Desc = frequence du groupement des flux
    226   !Config  Def  = iperiod
    227   !Config  Help = frequence du groupement des flux (en pas de temps)
    228   iapp_tracvl = iperiod
    229   CALL getin('iapp_tracvl',iapp_tracvl)
    230 
    231   !Config  Key  = iconser
    232   !Config  Desc = periode de sortie des variables de controle
    233   !Config  Def  = 240 
    234   !Config  Help = periode de sortie des variables de controle
    235   !Config         (En pas de temps)
    236   iconser = 240 
    237   CALL getin('iconser', iconser)
    238 
    239   !Config  Key  = iecri
    240   !Config  Desc = periode d'ecriture du fichier histoire
    241   !Config  Def  = 1
    242   !Config  Help = periode d'ecriture du fichier histoire (en jour)
    243   iecri = 1
    244   CALL getin('iecri',iecri)
    245 
    246   !Config  Key  = periodav
    247   !Config  Desc = periode de stockage fichier histmoy
    248   !Config  Def  = 1
    249   !Config  Help = periode de stockage fichier histmoy (en jour)
    250   periodav = 1.
    251   CALL getin('periodav',periodav)
    252 
    253   !Config  Key  = output_grads_dyn
    254   !Config  Desc = output dynamics diagnostics in 'dyn.dat' file
    255   !Config  Def  = n
    256   !Config  Help = output dynamics diagnostics in Grads-readable 'dyn.dat' file
    257   output_grads_dyn=.FALSE.
    258   CALL getin('output_grads_dyn',output_grads_dyn)
    259 
    260   !Config  Key  = dissip_period
    261   !Config  Desc = periode de la dissipation
    262   !Config  Def  = 0
    263   !Config  Help = periode de la dissipation
    264   !Config  dissip_period=0 => la valeur sera calcule dans inidissip       
    265   !Config  dissip_period>0 => on prend cette valeur
    266   dissip_period = 0
    267   CALL getin('dissip_period',dissip_period)
    268 
    269   !cc  ....   P. Le Van , modif le 29/04/97 .pour la dissipation  ...
    270   !cc
    271 
    272   !Config  Key  = lstardis
    273   !Config  Desc = choix de l'operateur de dissipation
    274   !Config  Def  = y
    275   !Config  Help = choix de l'operateur de dissipation
    276   !Config         'y' si on veut star et 'n' si on veut non-start !
    277   !Config         Moi y en a pas comprendre !
    278   lstardis = .TRUE.
    279   CALL getin('lstardis',lstardis)
    280 
    281   !Config  Key  = nitergdiv
    282   !Config  Desc = Nombre d'iteration de gradiv
    283   !Config  Def  = 1
    284   !Config  Help = nombre d'iterations de l'operateur de dissipation
    285   !Config         gradiv
    286   nitergdiv = 1
    287   CALL getin('nitergdiv',nitergdiv)
    288 
    289   !Config  Key  = nitergrot
    290   !Config  Desc = nombre d'iterations de nxgradrot
    291   !Config  Def  = 2
    292   !Config  Help = nombre d'iterations de l'operateur de dissipation 
    293   !Config         nxgradrot
    294   nitergrot = 2
    295   CALL getin('nitergrot',nitergrot)
    296 
    297   !Config  Key  = niterh
    298   !Config  Desc = nombre d'iterations de divgrad
    299   !Config  Def  = 2
    300   !Config  Help = nombre d'iterations de l'operateur de dissipation
    301   !Config         divgrad
    302   niterh = 2
    303   CALL getin('niterh',niterh)
    304 
    305   !Config  Key  = tetagdiv
    306   !Config  Desc = temps de dissipation pour div
    307   !Config  Def  = 7200
    308   !Config  Help = temps de dissipation des plus petites longeur
    309   !Config         d'ondes pour u,v (gradiv)
    310   tetagdiv = 7200.
    311   CALL getin('tetagdiv',tetagdiv)
    312 
    313   !Config  Key  = tetagrot
    314   !Config  Desc = temps de dissipation pour grad
    315   !Config  Def  = 7200
    316   !Config  Help = temps de dissipation des plus petites longeur
    317   !Config         d'ondes pour u,v (nxgradrot)
    318   tetagrot = 7200.
    319   CALL getin('tetagrot',tetagrot)
    320 
    321   !Config  Key  = tetatemp
    322   !Config  Desc = temps de dissipation pour h
    323   !Config  Def  = 7200
    324   !Config  Help =  temps de dissipation des plus petites longeur
    325   !Config         d'ondes pour h (divgrad)   
    326   tetatemp = 7200.
    327   CALL getin('tetatemp',tetatemp )
    328 
    329   ! Parametres controlant la variation sur la verticale des constantes de
    330   ! dissipation.
    331   ! Pour le moment actifs uniquement dans la version a 39 niveaux
    332   ! avec ok_strato=y
    333 
    334   dissip_factz=4.
    335   dissip_deltaz=10.
    336   dissip_zref=30.
    337   CALL getin('dissip_factz',dissip_factz )
    338   CALL getin('dissip_deltaz',dissip_deltaz )
    339   CALL getin('dissip_zref',dissip_zref )
    340 
    341 
    342   !maxlatfilter
    343   maxlatfilter = -1.0
    344   CALL getin('maxlatfilter',maxlatfilter)
    345   IF (maxlatfilter > 90) &
    346        CALL abort_gcm("conf_gcm", 'maxlatfilter should be <=90', 1)
    347  
    348 
    349   ! ngroup
    350   ngroup=3
    351   CALL getin('ngroup',ngroup)
    352   IF (mod(iim, 2**ngroup) /= 0) &
    353        CALL abort_gcm("conf_gcm", 'iim must be multiple of 2**ngroup', 1)
    354   IF (2**ngroup > jjm + 1) &
    355        CALL abort_gcm("conf_gcm", '2**ngroup must be <= jjm + 1', 1)
    356 
    357   ! mode_top_bound : fields towards which sponge relaxation will be done:
    358   ! top_bound sponge: only active if ok_strato=.TRUE. and iflag_top_bound!=0
    359   !                   iflag_top_bound=0 for no sponge
    360   !                   iflag_top_bound=1 for sponge over 4 topmost layers
    361   !                   iflag_top_bound=2 for sponge from top to ~1% of top layer pressure
    362   iflag_top_bound=1
    363   CALL getin('iflag_top_bound',iflag_top_bound)
    364   IF (iflag_top_bound < 0 .OR. iflag_top_bound > 2) &
    365        CALL abort_gcm("conf_gcm", 'iflag_top_bound must be 0, 1 or 2', 1)
    366 
    367   ! mode_top_bound : fields towards which sponge relaxation will be done:
    368   !                  mode_top_bound=0: no relaxation
    369   !                  mode_top_bound=1: u and v relax towards 0
    370   !                  mode_top_bound=2: u and v relax towards their zonal mean
    371   !                  mode_top_bound=3: u,v and pot. temp. relax towards their zonal mean
    372   mode_top_bound=3
    373   CALL getin('mode_top_bound',mode_top_bound)
    374 
    375   ! top_bound sponge : inverse of charactericstic relaxation time scale for sponge
    376   tau_top_bound=1.e-5
    377   CALL getin('tau_top_bound',tau_top_bound)
    378 
    379   !Config  Key  = coefdis
    380   !Config  Desc = coefficient pour gamdissip
    381   !Config  Def  = 0
    382   !Config  Help = coefficient pour gamdissip 
    383   coefdis = 0.
    384   CALL getin('coefdis',coefdis)
    385 
    386   !Config  Key  = purmats
    387   !Config  Desc = Schema d'integration
    388   !Config  Def  = n
    389   !Config  Help = Choix du schema d'integration temporel.
    390   !Config         y = pure Matsuno sinon c'est du Matsuno-leapfrog
    391   purmats = .FALSE.
    392   CALL getin('purmats',purmats)
    393 
    394   !Config  Key  = ok_guide
    395   !Config  Desc = Guidage
    396   !Config  Def  = n
    397   !Config  Help = Guidage
    398   ok_guide = .FALSE.
    399   CALL getin('ok_guide',ok_guide)
    400 
    401   IF (ok_guide .AND. adjust) CALL abort_gcm("conf_gcm", &
    402        "adjust does not work with ok_guide", 1)
    403 
    404   !Config  Key  =  read_start
    405   !Config  Desc = Initialize model using a 'start.nc' file
    406   !Config  Def  = y
    407   !Config  Help = y: intialize dynamical fields using a 'start.nc' file
    408   !               n: fields are initialized by 'iniacademic' routine
    409   read_start= .TRUE.
    410   CALL getin('read_start',read_start)
    411 
    412   !Config  Key  = iflag_phys
    413   !Config  Desc = Avec ls physique
    414   !Config  Def  = 1
    415   !Config  Help = Permet de faire tourner le modele sans
    416   !Config         physique.
    417   iflag_phys = 1
    418   CALL getin('iflag_phys',iflag_phys)
    419 
    420   !Config  Key  =  iphysiq
    421   !Config  Desc = Periode de la physique
    422   !Config  Def  = 5
    423   !Config  Help = Periode de la physique en pas de temps de la dynamique.
    424   iphysiq = 5
    425   CALL getin('iphysiq', iphysiq)
    426 
    427   !Config  Key  = ip_ebil_dyn
    428   !Config  Desc = PRINT level for energy conserv. diag.
    429   !Config  Def  = 0
    430   !Config  Help = PRINT level for energy conservation diag. ;
    431   !               les options suivantes existent :
    432   !Config         0 pas de print
    433   !Config         1 pas de print
    434   !Config         2 print,
    435   ip_ebil_dyn = 0
    436   CALL getin('ip_ebil_dyn',ip_ebil_dyn)
    437 
    438   !cc  ....   P. Le Van , ajout  le 7/03/95 .pour le zoom ...
    439   !     .........   (  modif  le 17/04/96 )   .........
    440 
    441   test_etatinit: IF (.NOT. etatinit) THEN
    442      !Config  Key  = clon
    443      !Config  Desc = centre du zoom, longitude
    444      !Config  Def  = 0
    445      !Config  Help = longitude en degres du centre
    446      !Config         du zoom
    447      clonn = 0.
    448      CALL getin('clon',clonn)
    449 
    450      !Config  Key  = clat
    451      !Config  Desc = centre du zoom, latitude
    452      !Config  Def  = 0
    453      !Config  Help = latitude en degres du centre du zoom
    454      !Config         
    455      clatt = 0.
    456      CALL getin('clat',clatt)
    457 
    458      IF( ABS(clat - clatt)>= 0.001 )  THEN
    459         WRITE(lunout,*)'conf_gcm: La valeur de clat passee par run.def', &
    460              ' est differente de celle lue sur le fichier  start '
    461         CALL abort_gcm("conf_gcm","stopped",1)
    462      ENDIF
    463 
    464      !Config  Key  = grossismx
    465      !Config  Desc = zoom en longitude
    466      !Config  Def  = 1.0
    467      !Config  Help = facteur de grossissement du zoom,
    468      !Config         selon la longitude
    469      grossismxx = 1.0
    470      CALL getin('grossismx',grossismxx)
    471 
    472      IF( ABS(grossismx - grossismxx)>= 0.001 )  THEN
    473         WRITE(lunout,*)'conf_gcm: La valeur de grossismx passee par ', &
    474              'run.def est differente de celle lue sur le fichier  start '
    475         CALL abort_gcm("conf_gcm","stopped",1)
    476       ENDIF
    477 
    478      !Config  Key  = grossismy
    479      !Config  Desc = zoom en latitude
    480      !Config  Def  = 1.0
    481      !Config  Help = facteur de grossissement du zoom,
    482      !Config         selon la latitude
    483      grossismyy = 1.0
    484      CALL getin('grossismy',grossismyy)
    485 
    486      IF( ABS(grossismy - grossismyy)>= 0.001 )  THEN
    487         WRITE(lunout,*)'conf_gcm: La valeur de grossismy passee par ', &
    488              'run.def est differente de celle lue sur le fichier  start '
    489         CALL abort_gcm("conf_gcm","stopped",1)
    490      ENDIF
    491 
    492      IF( grossismx<1. )  THEN
    493         WRITE(lunout,*) &
    494              'conf_gcm: ***  ATTENTION !! grossismx < 1 .   *** '
    495         CALL abort_gcm("conf_gcm","stopped",1)
    496      ELSE
    497         alphax = 1. - 1./ grossismx
    498      ENDIF
    499 
    500      IF( grossismy<1. )  THEN
    501         WRITE(lunout,*) &
    502              'conf_gcm: ***  ATTENTION !! grossismy < 1 .   *** '
    503         CALL abort_gcm("conf_gcm","stopped",1)
    504      ELSE
    505         alphay = 1. - 1./ grossismy
    506      ENDIF
    507 
    508      WRITE(lunout,*)'conf_gcm: alphax alphay',alphax,alphay
    509 
    510      !    alphax et alphay sont les anciennes formulat. des grossissements
    511 
    512      !Config  Key  = fxyhypb
    513      !Config  Desc = Fonction  hyperbolique
    514      !Config  Def  = y
    515      !Config  Help = Fonction  f(y)  hyperbolique  si = .TRUE.
    516      !Config         sinon  sinusoidale
    517      fxyhypbb = .TRUE.
    518      CALL getin('fxyhypb',fxyhypbb)
    519 
    520      IF( .NOT.fxyhypb )  THEN
    521         IF( fxyhypbb )     THEN
    522            WRITE(lunout,*)' ********  PBS DANS  CONF_GCM  ******** '
    523            WRITE(lunout,*)' *** fxyhypb lu sur le fichier start est ', &
    524                 'F alors  qu il est  T  sur  run.def  ***'
    525            CALL abort_gcm("conf_gcm","stopped",1)
     119    itaumax = 0
     120    CALL getin('itaumax', itaumax);
     121    IF (itaumax<=0) itaumax = HUGE(itaumax)
     122
     123    !Config  Key  = prt_level
     124    !Config  Desc = niveau d'impressions de débogage
     125    !Config  Def  = 0
     126    !Config  Help = Niveau d'impression pour le débogage
     127    !Config         (0 = minimum d'impression)
     128    prt_level = 0
     129    CALL getin('prt_level', prt_level)
     130
     131    !-----------------------------------------------------------------------
     132    !  Parametres de controle du run:
     133    !-----------------------------------------------------------------------
     134    !Config  Key  = planet_type
     135    !Config  Desc = planet type ("earth", "mars", "venus", ...)
     136    !Config  Def  = earth
     137    !Config  Help = this flag sets the type of atymosphere that is considered
     138    planet_type = "earth"
     139    CALL getin('planet_type', planet_type)
     140
     141    !Config  Key  = calend
     142    !Config  Desc = type de calendrier utilise
     143    !Config  Def  = earth_360d
     144    !Config  Help = valeur possible: earth_360d, earth_365d, earth_366d
     145    !Config
     146    calend = 'earth_360d'
     147    ! initialize year_len for aquaplanets and 1D
     148    CALL getin('calend', calend)
     149    IF (calend == 'earth_360d') THEN
     150      year_len = 360
     151    ELSE IF (calend == 'earth_365d') THEN
     152      year_len = 365
     153    ELSE IF (calend == 'earth_366d') THEN
     154      year_len = 366
     155    ELSE
     156      year_len = 1
     157    ENDIF
     158
     159    !Config  Key  = dayref
     160    !Config  Desc = Jour de l'etat initial
     161    !Config  Def  = 1
     162    !Config  Help = Jour de l'etat initial ( = 350  si 20 Decembre ,
     163    !Config         par expl. ,comme ici ) ... A completer
     164    dayref = 1
     165    CALL getin('dayref', dayref)
     166
     167    !Config  Key  = anneeref
     168    !Config  Desc = Annee de l'etat initial
     169    !Config  Def  = 1998
     170    !Config  Help = Annee de l'etat  initial
     171    !Config         (   avec  4  chiffres   ) ... A completer
     172    anneeref = 1998
     173    CALL getin('anneeref', anneeref)
     174
     175    !Config  Key  = raz_date
     176    !Config  Desc = Remise a zero de la date initiale
     177    !Config  Def  = 0 (pas de remise a zero)
     178    !Config  Help = Remise a zero de la date initiale
     179    !Config         0 pas de remise a zero, on garde la date du fichier restart
     180    !Config         1 prise en compte de la date de gcm.def avec remise a zero
     181    !Config         des compteurs de pas de temps
     182    raz_date = 0
     183    CALL getin('raz_date', raz_date)
     184
     185    !Config  Key  = resetvarc
     186    !Config  Desc = Reinit des variables de controle
     187    !Config  Def  = n
     188    !Config  Help = Reinit des variables de controle
     189    resetvarc = .FALSE.
     190    CALL getin('resetvarc', resetvarc)
     191
     192    !Config  Key  = nday
     193    !Config  Desc = Nombre de jours d'integration
     194    !Config  Def  = 10
     195    !Config  Help = Nombre de jours d'integration
     196    !Config         ... On pourait aussi permettre des mois ou des annees !
     197    nday = 10
     198    CALL getin('nday', nday)
     199
     200    !Config  Key  = starttime
     201    !Config  Desc = Heure de depart de la simulation
     202    !Config  Def  = 0
     203    !Config  Help = Heure de depart de la simulation
     204    !Config         en jour
     205    starttime = 0
     206    CALL getin('starttime', starttime)
     207
     208    !Config  Key  = day_step
     209    !Config  Desc = nombre de pas par jour
     210    !Config  Def  = 240
     211    !Config  Help = nombre de pas par jour (multiple de iperiod) (
     212    !Config          ici pour  dt = 1 min )
     213    day_step = 240
     214    CALL getin('day_step', day_step)
     215
     216    !Config  Key  = nsplit_phys
     217    nsplit_phys = 1
     218    CALL getin('nsplit_phys', nsplit_phys)
     219
     220    !Config  Key  = iperiod
     221    !Config  Desc = periode pour le pas Matsuno
     222    !Config  Def  = 5
     223    !Config  Help = periode pour le pas Matsuno (en pas de temps)
     224    iperiod = 5
     225    CALL getin('iperiod', iperiod)
     226
     227    !Config  Key  = iapp_tracvl
     228    !Config  Desc = frequence du groupement des flux
     229    !Config  Def  = iperiod
     230    !Config  Help = frequence du groupement des flux (en pas de temps)
     231    iapp_tracvl = iperiod
     232    CALL getin('iapp_tracvl', iapp_tracvl)
     233
     234    !Config  Key  = iconser
     235    !Config  Desc = periode de sortie des variables de controle
     236    !Config  Def  = 240
     237    !Config  Help = periode de sortie des variables de controle
     238    !Config         (En pas de temps)
     239    iconser = 240
     240    CALL getin('iconser', iconser)
     241
     242    !Config  Key  = iecri
     243    !Config  Desc = periode d'ecriture du fichier histoire
     244    !Config  Def  = 1
     245    !Config  Help = periode d'ecriture du fichier histoire (en jour)
     246    iecri = 1
     247    CALL getin('iecri', iecri)
     248
     249    !Config  Key  = periodav
     250    !Config  Desc = periode de stockage fichier histmoy
     251    !Config  Def  = 1
     252    !Config  Help = periode de stockage fichier histmoy (en jour)
     253    periodav = 1.
     254    CALL getin('periodav', periodav)
     255
     256    !Config  Key  = output_grads_dyn
     257    !Config  Desc = output dynamics diagnostics in 'dyn.dat' file
     258    !Config  Def  = n
     259    !Config  Help = output dynamics diagnostics in Grads-readable 'dyn.dat' file
     260    output_grads_dyn = .FALSE.
     261    CALL getin('output_grads_dyn', output_grads_dyn)
     262
     263    !Config  Key  = dissip_period
     264    !Config  Desc = periode de la dissipation
     265    !Config  Def  = 0
     266    !Config  Help = periode de la dissipation
     267    !Config  dissip_period=0 => la valeur sera calcule dans inidissip
     268    !Config  dissip_period>0 => on prend cette valeur
     269    dissip_period = 0
     270    CALL getin('dissip_period', dissip_period)
     271
     272    !cc  ....   P. Le Van , modif le 29/04/97 .pour la dissipation  ...
     273    !cc
     274
     275    !Config  Key  = lstardis
     276    !Config  Desc = choix de l'operateur de dissipation
     277    !Config  Def  = y
     278    !Config  Help = choix de l'operateur de dissipation
     279    !Config         'y' si on veut star et 'n' si on veut non-start !
     280    !Config         Moi y en a pas comprendre !
     281    lstardis = .TRUE.
     282    CALL getin('lstardis', lstardis)
     283
     284    !Config  Key  = nitergdiv
     285    !Config  Desc = Nombre d'iteration de gradiv
     286    !Config  Def  = 1
     287    !Config  Help = nombre d'iterations de l'operateur de dissipation
     288    !Config         gradiv
     289    nitergdiv = 1
     290    CALL getin('nitergdiv', nitergdiv)
     291
     292    !Config  Key  = nitergrot
     293    !Config  Desc = nombre d'iterations de nxgradrot
     294    !Config  Def  = 2
     295    !Config  Help = nombre d'iterations de l'operateur de dissipation
     296    !Config         nxgradrot
     297    nitergrot = 2
     298    CALL getin('nitergrot', nitergrot)
     299
     300    !Config  Key  = niterh
     301    !Config  Desc = nombre d'iterations de divgrad
     302    !Config  Def  = 2
     303    !Config  Help = nombre d'iterations de l'operateur de dissipation
     304    !Config         divgrad
     305    niterh = 2
     306    CALL getin('niterh', niterh)
     307
     308    !Config  Key  = tetagdiv
     309    !Config  Desc = temps de dissipation pour div
     310    !Config  Def  = 7200
     311    !Config  Help = temps de dissipation des plus petites longeur
     312    !Config         d'ondes pour u,v (gradiv)
     313    tetagdiv = 7200.
     314    CALL getin('tetagdiv', tetagdiv)
     315
     316    !Config  Key  = tetagrot
     317    !Config  Desc = temps de dissipation pour grad
     318    !Config  Def  = 7200
     319    !Config  Help = temps de dissipation des plus petites longeur
     320    !Config         d'ondes pour u,v (nxgradrot)
     321    tetagrot = 7200.
     322    CALL getin('tetagrot', tetagrot)
     323
     324    !Config  Key  = tetatemp
     325    !Config  Desc = temps de dissipation pour h
     326    !Config  Def  = 7200
     327    !Config  Help =  temps de dissipation des plus petites longeur
     328    !Config         d'ondes pour h (divgrad)
     329    tetatemp = 7200.
     330    CALL getin('tetatemp', tetatemp)
     331
     332    ! Parametres controlant la variation sur la verticale des constantes de
     333    ! dissipation.
     334    ! Pour le moment actifs uniquement dans la version a 39 niveaux
     335    ! avec ok_strato=y
     336
     337    dissip_factz = 4.
     338    dissip_deltaz = 10.
     339    dissip_zref = 30.
     340    CALL getin('dissip_factz', dissip_factz)
     341    CALL getin('dissip_deltaz', dissip_deltaz)
     342    CALL getin('dissip_zref', dissip_zref)
     343
     344
     345    !maxlatfilter
     346    maxlatfilter = -1.0
     347    CALL getin('maxlatfilter', maxlatfilter)
     348    IF (maxlatfilter > 90) &
     349            CALL abort_gcm("conf_gcm", 'maxlatfilter should be <=90', 1)
     350
     351
     352    ! ngroup
     353    ngroup = 3
     354    CALL getin('ngroup', ngroup)
     355    IF (mod(iim, 2**ngroup) /= 0) &
     356            CALL abort_gcm("conf_gcm", 'iim must be multiple of 2**ngroup', 1)
     357    IF (2**ngroup > jjm + 1) &
     358            CALL abort_gcm("conf_gcm", '2**ngroup must be <= jjm + 1', 1)
     359
     360    ! mode_top_bound : fields towards which sponge relaxation will be done:
     361    ! top_bound sponge: only active if ok_strato=.TRUE. and iflag_top_bound!=0
     362    !                   iflag_top_bound=0 for no sponge
     363    !                   iflag_top_bound=1 for sponge over 4 topmost layers
     364    !                   iflag_top_bound=2 for sponge from top to ~1% of top layer pressure
     365    iflag_top_bound = 1
     366    CALL getin('iflag_top_bound', iflag_top_bound)
     367    IF (iflag_top_bound < 0 .OR. iflag_top_bound > 2) &
     368            CALL abort_gcm("conf_gcm", 'iflag_top_bound must be 0, 1 or 2', 1)
     369
     370    ! mode_top_bound : fields towards which sponge relaxation will be done:
     371    !                  mode_top_bound=0: no relaxation
     372    !                  mode_top_bound=1: u and v relax towards 0
     373    !                  mode_top_bound=2: u and v relax towards their zonal mean
     374    !                  mode_top_bound=3: u,v and pot. temp. relax towards their zonal mean
     375    mode_top_bound = 3
     376    CALL getin('mode_top_bound', mode_top_bound)
     377
     378    ! top_bound sponge : inverse of charactericstic relaxation time scale for sponge
     379    tau_top_bound = 1.e-5
     380    CALL getin('tau_top_bound', tau_top_bound)
     381
     382    !Config  Key  = coefdis
     383    !Config  Desc = coefficient pour gamdissip
     384    !Config  Def  = 0
     385    !Config  Help = coefficient pour gamdissip
     386    coefdis = 0.
     387    CALL getin('coefdis', coefdis)
     388
     389    !Config  Key  = purmats
     390    !Config  Desc = Schema d'integration
     391    !Config  Def  = n
     392    !Config  Help = Choix du schema d'integration temporel.
     393    !Config         y = pure Matsuno sinon c'est du Matsuno-leapfrog
     394    purmats = .FALSE.
     395    CALL getin('purmats', purmats)
     396
     397    !Config  Key  = ok_guide
     398    !Config  Desc = Guidage
     399    !Config  Def  = n
     400    !Config  Help = Guidage
     401    ok_guide = .FALSE.
     402    CALL getin('ok_guide', ok_guide)
     403
     404    IF (ok_guide .AND. adjust) CALL abort_gcm("conf_gcm", &
     405            "adjust does not work with ok_guide", 1)
     406
     407    !Config  Key  =  read_start
     408    !Config  Desc = Initialize model using a 'start.nc' file
     409    !Config  Def  = y
     410    !Config  Help = y: intialize dynamical fields using a 'start.nc' file
     411    !               n: fields are initialized by 'iniacademic' routine
     412    read_start = .TRUE.
     413    CALL getin('read_start', read_start)
     414
     415    !Config  Key  = iflag_phys
     416    !Config  Desc = Avec ls physique
     417    !Config  Def  = 1
     418    !Config  Help = Permet de faire tourner le modele sans
     419    !Config         physique.
     420    iflag_phys = 1
     421    CALL getin('iflag_phys', iflag_phys)
     422
     423    !Config  Key  =  iphysiq
     424    !Config  Desc = Periode de la physique
     425    !Config  Def  = 5
     426    !Config  Help = Periode de la physique en pas de temps de la dynamique.
     427    iphysiq = 5
     428    CALL getin('iphysiq', iphysiq)
     429
     430    !Config  Key  = ip_ebil_dyn
     431    !Config  Desc = PRINT level for energy conserv. diag.
     432    !Config  Def  = 0
     433    !Config  Help = PRINT level for energy conservation diag. ;
     434    !               les options suivantes existent :
     435    !Config         0 pas de print
     436    !Config         1 pas de print
     437    !Config         2 print,
     438    ip_ebil_dyn = 0
     439    CALL getin('ip_ebil_dyn', ip_ebil_dyn)
     440
     441    !cc  ....   P. Le Van , ajout  le 7/03/95 .pour le zoom ...
     442    !     .........   (  modif  le 17/04/96 )   .........
     443
     444    test_etatinit: IF (.NOT. etatinit) THEN
     445      !Config  Key  = clon
     446      !Config  Desc = centre du zoom, longitude
     447      !Config  Def  = 0
     448      !Config  Help = longitude en degres du centre
     449      !Config         du zoom
     450      clonn = 0.
     451      CALL getin('clon', clonn)
     452
     453      !Config  Key  = clat
     454      !Config  Desc = centre du zoom, latitude
     455      !Config  Def  = 0
     456      !Config  Help = latitude en degres du centre du zoom
     457      !Config
     458      clatt = 0.
     459      CALL getin('clat', clatt)
     460
     461      IF(ABS(clat - clatt)>= 0.001)  THEN
     462        WRITE(lunout, *)'conf_gcm: La valeur de clat passee par run.def', &
     463                ' est differente de celle lue sur le fichier  start '
     464        CALL abort_gcm("conf_gcm", "stopped", 1)
     465      ENDIF
     466
     467      !Config  Key  = grossismx
     468      !Config  Desc = zoom en longitude
     469      !Config  Def  = 1.0
     470      !Config  Help = facteur de grossissement du zoom,
     471      !Config         selon la longitude
     472      grossismxx = 1.0
     473      CALL getin('grossismx', grossismxx)
     474
     475      IF(ABS(grossismx - grossismxx)>= 0.001)  THEN
     476        WRITE(lunout, *)'conf_gcm: La valeur de grossismx passee par ', &
     477                'run.def est differente de celle lue sur le fichier  start '
     478        CALL abort_gcm("conf_gcm", "stopped", 1)
     479      ENDIF
     480
     481      !Config  Key  = grossismy
     482      !Config  Desc = zoom en latitude
     483      !Config  Def  = 1.0
     484      !Config  Help = facteur de grossissement du zoom,
     485      !Config         selon la latitude
     486      grossismyy = 1.0
     487      CALL getin('grossismy', grossismyy)
     488
     489      IF(ABS(grossismy - grossismyy)>= 0.001)  THEN
     490        WRITE(lunout, *)'conf_gcm: La valeur de grossismy passee par ', &
     491                'run.def est differente de celle lue sur le fichier  start '
     492        CALL abort_gcm("conf_gcm", "stopped", 1)
     493      ENDIF
     494
     495      IF(grossismx<1.)  THEN
     496        WRITE(lunout, *) &
     497                'conf_gcm: ***  ATTENTION !! grossismx < 1 .   *** '
     498        CALL abort_gcm("conf_gcm", "stopped", 1)
     499      ELSE
     500        alphax = 1. - 1. / grossismx
     501      ENDIF
     502
     503      IF(grossismy<1.)  THEN
     504        WRITE(lunout, *) &
     505                'conf_gcm: ***  ATTENTION !! grossismy < 1 .   *** '
     506        CALL abort_gcm("conf_gcm", "stopped", 1)
     507      ELSE
     508        alphay = 1. - 1. / grossismy
     509      ENDIF
     510
     511      WRITE(lunout, *)'conf_gcm: alphax alphay', alphax, alphay
     512
     513      !    alphax et alphay sont les anciennes formulat. des grossissements
     514
     515      !Config  Key  = fxyhypb
     516      !Config  Desc = Fonction  hyperbolique
     517      !Config  Def  = y
     518      !Config  Help = Fonction  f(y)  hyperbolique  si = .TRUE.
     519      !Config         sinon  sinusoidale
     520      fxyhypbb = .TRUE.
     521      CALL getin('fxyhypb', fxyhypbb)
     522
     523      IF(.NOT.fxyhypb)  THEN
     524        IF(fxyhypbb)     THEN
     525          WRITE(lunout, *)' ********  PBS DANS  CONF_GCM  ******** '
     526          WRITE(lunout, *)' *** fxyhypb lu sur le fichier start est ', &
     527                  'F alors  qu il est  T  sur  run.def  ***'
     528          CALL abort_gcm("conf_gcm", "stopped", 1)
    526529        ENDIF
    527      ELSE
    528         IF( .NOT.fxyhypbb )   THEN
    529            WRITE(lunout,*)' ********  PBS DANS  CONF_GCM  ******** '
    530            WRITE(lunout,*)' ***  fxyhypb lu sur le fichier start est ', &
    531                 'T alors  qu il est  F  sur  run.def  ****  '
    532            CALL abort_gcm("conf_gcm","stopped",1)
     530      ELSE
     531        IF(.NOT.fxyhypbb)   THEN
     532          WRITE(lunout, *)' ********  PBS DANS  CONF_GCM  ******** '
     533          WRITE(lunout, *)' ***  fxyhypb lu sur le fichier start est ', &
     534                  'T alors  qu il est  F  sur  run.def  ****  '
     535          CALL abort_gcm("conf_gcm", "stopped", 1)
    533536        ENDIF
    534      ENDIF
    535 
    536      !Config  Key  = dzoomx
    537      !Config  Desc = extension en longitude
    538      !Config  Def  = 0
    539      !Config  Help = extension en longitude  de la zone du zoom 
    540      !Config         ( fraction de la zone totale)
    541      dzoomxx = 0.0
    542      CALL getin('dzoomx',dzoomxx)
    543 
    544      IF( fxyhypb )  THEN
    545         IF( ABS(dzoomx - dzoomxx)>= 0.001 )  THEN
    546            WRITE(lunout,*)'conf_gcm: La valeur de dzoomx passee par ', &
    547                 'run.def est differente de celle lue sur le fichier  start '
    548            CALL abort_gcm("conf_gcm","stopped",1)
     537      ENDIF
     538
     539      !Config  Key  = dzoomx
     540      !Config  Desc = extension en longitude
     541      !Config  Def  = 0
     542      !Config  Help = extension en longitude  de la zone du zoom
     543      !Config         ( fraction de la zone totale)
     544      dzoomxx = 0.0
     545      CALL getin('dzoomx', dzoomxx)
     546
     547      IF(fxyhypb)  THEN
     548        IF(ABS(dzoomx - dzoomxx)>= 0.001)  THEN
     549          WRITE(lunout, *)'conf_gcm: La valeur de dzoomx passee par ', &
     550                  'run.def est differente de celle lue sur le fichier  start '
     551          CALL abort_gcm("conf_gcm", "stopped", 1)
    549552        ENDIF
    550      ENDIF
    551 
    552      !Config  Key  = dzoomy
    553      !Config  Desc = extension en latitude
    554      !Config  Def  = 0
    555      !Config  Help = extension en latitude de la zone  du zoom 
    556      !Config         ( fraction de la zone totale)
    557      dzoomyy = 0.0
    558      CALL getin('dzoomy',dzoomyy)
    559 
    560      IF( fxyhypb )  THEN
    561         IF( ABS(dzoomy - dzoomyy)>= 0.001 )  THEN
    562            WRITE(lunout,*)'conf_gcm: La valeur de dzoomy passee par ', &
    563                 'run.def est differente de celle lue sur le fichier  start '
    564            CALL abort_gcm("conf_gcm","stopped",1)
     553      ENDIF
     554
     555      !Config  Key  = dzoomy
     556      !Config  Desc = extension en latitude
     557      !Config  Def  = 0
     558      !Config  Help = extension en latitude de la zone  du zoom
     559      !Config         ( fraction de la zone totale)
     560      dzoomyy = 0.0
     561      CALL getin('dzoomy', dzoomyy)
     562
     563      IF(fxyhypb)  THEN
     564        IF(ABS(dzoomy - dzoomyy)>= 0.001)  THEN
     565          WRITE(lunout, *)'conf_gcm: La valeur de dzoomy passee par ', &
     566                  'run.def est differente de celle lue sur le fichier  start '
     567          CALL abort_gcm("conf_gcm", "stopped", 1)
    565568        ENDIF
    566      ENDIF
    567 
    568      !Config  Key  = taux
    569      !Config  Desc = raideur du zoom en  X
    570      !Config  Def  = 3
    571      !Config  Help = raideur du zoom en  X
    572      tauxx = 3.0
    573      CALL getin('taux',tauxx)
    574 
    575      IF( fxyhypb )  THEN
    576         IF( ABS(taux - tauxx)>= 0.001 )  THEN
    577            WRITE(lunout,*)'conf_gcm: La valeur de taux passee par ', &
    578                 'run.def est differente de celle lue sur le fichier  start '
    579            CALL abort_gcm("conf_gcm","stopped",1)
     569      ENDIF
     570
     571      !Config  Key  = taux
     572      !Config  Desc = raideur du zoom en  X
     573      !Config  Def  = 3
     574      !Config  Help = raideur du zoom en  X
     575      tauxx = 3.0
     576      CALL getin('taux', tauxx)
     577
     578      IF(fxyhypb)  THEN
     579        IF(ABS(taux - tauxx)>= 0.001)  THEN
     580          WRITE(lunout, *)'conf_gcm: La valeur de taux passee par ', &
     581                  'run.def est differente de celle lue sur le fichier  start '
     582          CALL abort_gcm("conf_gcm", "stopped", 1)
    580583        ENDIF
    581      ENDIF
    582 
    583      !Config  Key  = tauyy
    584      !Config  Desc = raideur du zoom en  Y
    585      !Config  Def  = 3
    586      !Config  Help = raideur du zoom en  Y
    587      tauyy = 3.0
    588      CALL getin('tauy',tauyy)
    589 
    590      IF( fxyhypb )  THEN
    591         IF( ABS(tauy - tauyy)>= 0.001 )  THEN
    592            WRITE(lunout,*)'conf_gcm: La valeur de tauy passee par ', &
    593                 'run.def est differente de celle lue sur le fichier  start '
    594         CALL abort_gcm("conf_gcm","stopped",1)
     584      ENDIF
     585
     586      !Config  Key  = tauyy
     587      !Config  Desc = raideur du zoom en  Y
     588      !Config  Def  = 3
     589      !Config  Help = raideur du zoom en  Y
     590      tauyy = 3.0
     591      CALL getin('tauy', tauyy)
     592
     593      IF(fxyhypb)  THEN
     594        IF(ABS(tauy - tauyy)>= 0.001)  THEN
     595          WRITE(lunout, *)'conf_gcm: La valeur de tauy passee par ', &
     596                  'run.def est differente de celle lue sur le fichier  start '
     597          CALL abort_gcm("conf_gcm", "stopped", 1)
    595598        ENDIF
    596      ENDIF
    597 
    598      !c
    599      IF( .NOT.fxyhypb  )  THEN
     599      ENDIF
     600
     601      !c
     602      IF(.NOT.fxyhypb)  THEN
    600603
    601604        !Config  Key  = ysinus
     
    606609        !Config         sinon y = latit.
    607610        ysinuss = .TRUE.
    608         CALL getin('ysinus',ysinuss)
    609 
    610         IF( .NOT.ysinus )  THEN
    611            IF( ysinuss )     THEN
    612               WRITE(lunout,*)' ********  PBS DANS  CONF_GCM  ******** '
    613               WRITE(lunout,*)' *** ysinus lu sur le fichier start est F', &
    614                    ' alors  qu il est  T  sur  run.def  ***'
    615               CALL abort_gcm("conf_gcm","stopped",1)
    616            ENDIF
     611        CALL getin('ysinus', ysinuss)
     612
     613        IF(.NOT.ysinus)  THEN
     614          IF(ysinuss)     THEN
     615            WRITE(lunout, *)' ********  PBS DANS  CONF_GCM  ******** '
     616            WRITE(lunout, *)' *** ysinus lu sur le fichier start est F', &
     617                    ' alors  qu il est  T  sur  run.def  ***'
     618            CALL abort_gcm("conf_gcm", "stopped", 1)
     619          ENDIF
    617620        ELSE
    618            IF( .NOT.ysinuss )   THEN
    619               WRITE(lunout,*)' ********  PBS DANS  CONF_GCM  ******** '
    620               WRITE(lunout,*)' *** ysinus lu sur le fichier start est T', &
    621                    ' alors  qu il est  F  sur  run.def  ****  '
    622               CALL abort_gcm("conf_gcm","stopped",1)
    623            ENDIF
     621          IF(.NOT.ysinuss)   THEN
     622            WRITE(lunout, *)' ********  PBS DANS  CONF_GCM  ******** '
     623            WRITE(lunout, *)' *** ysinus lu sur le fichier start est T', &
     624                    ' alors  qu il est  F  sur  run.def  ****  '
     625            CALL abort_gcm("conf_gcm", "stopped", 1)
     626          ENDIF
    624627        ENDIF
    625      ENDIF ! of IF( .NOT.fxyhypb  )
    626 
    627      !Config  Key  = offline
    628      !Config  Desc = ecriture des flux de masse
    629      !Config  Def  = n
    630      !Config  Help = Permet de sortir les flux de masse sur la grille plev
    631      offline = .FALSE.
    632      CALL getin('offline',offline)
    633 
    634      !Config Key  = offline_time
    635      !Config Desc =  Choix des frequences de stockage pour le offline
    636      !Config Def  = 8
    637      !Config Help = offline_time=12     ! stockage toutes les 2h=1jour/12
    638      !Config Help = offline_time=8      ! stockage toutes les 3h=1jour/8
    639      offline_time = 8
    640      CALL getin('offline_time',offline_time)
    641 
    642      IF (offline .AND. adjust) THEN
    643         WRITE(lunout,*)  &
    644              'WARNING : option offline does not work with adjust=y :'
    645         WRITE(lunout,*) 'the files defstoke.nc, fluxstoke.nc ',  &
    646              'and fluxstokev.nc will not be created'
    647         WRITE(lunout,*)  &
    648              'only the file phystoke.nc will still be created '
    649      ENDIF
    650 
    651      !Config  Key  = type_trac
    652      !Config  Desc = Choix de couplage avec model de chimie INCA ou REPROBUS
    653      !Config  Def  = lmdz
    654      !Config  Help =
    655      !Config         'lmdz' = pas de couplage, pur LMDZ
    656      !Config         'inca' = model de chime INCA
    657      !Config         'repr' = model de chime REPROBUS
    658      type_trac = 'lmdz'
    659      CALL getin('type_trac',type_trac)
    660 
    661 
    662      !Config  Key  = adv_qsat_liq
    663      !Config  Desc = option for qsat calculation in the dynamics
    664      !Config  Def  = n
    665      !Config  Help = controls which phase is considered for qsat calculation
    666      !Config         
    667      adv_qsat_liq = .FALSE.
    668      CALL getin('adv_qsat_liq',adv_qsat_liq)
    669 
    670      !Config  Key  = ok_dynzon
    671      !Config  Desc = calcul et sortie des transports
    672      !Config  Def  = n
    673      !Config  Help = Permet de mettre en route le calcul des transports
    674      !Config         
    675      ok_dynzon = .FALSE.
    676      CALL getin('ok_dynzon',ok_dynzon)
    677 
    678      !Config  Key  = ok_dyn_ins
    679      !Config  Desc = sorties instantanees dans la dynamique
    680      !Config  Def  = n
    681      !Config  Help =
    682      !Config         
    683      ok_dyn_ins = .FALSE.
    684      CALL getin('ok_dyn_ins',ok_dyn_ins)
    685 
    686      !Config  Key  = ok_dyn_ave
    687      !Config  Desc = sorties moyennes dans la dynamique
    688      !Config  Def  = n
    689      !Config  Help =
    690      !Config         
    691      ok_dyn_ave = .FALSE.
    692      CALL getin('ok_dyn_ave',ok_dyn_ave)
    693 
    694      !Config  Key  = ok_dyn_xios
    695      !Config  Desc = sorties moyennes dans la dynamique
    696      !Config  Def  = n
    697      !Config  Help =
    698      !Config         
    699      ok_dyn_xios = .FALSE.
    700      CALL getin('ok_dyn_xios',ok_dyn_xios)
    701 
    702      WRITE(lunout,*)' #########################################'
    703      WRITE(lunout,*)' Configuration des parametres du gcm: '
    704      WRITE(lunout,*)' planet_type = ', planet_type
    705      WRITE(lunout,*)' calend = ', calend
    706      WRITE(lunout,*)' dayref = ', dayref
    707      WRITE(lunout,*)' anneeref = ', anneeref
    708      WRITE(lunout,*)' nday = ', nday
    709      WRITE(lunout,*)' day_step = ', day_step
    710      WRITE(lunout,*)' iperiod = ', iperiod
    711      WRITE(lunout,*)' nsplit_phys = ', nsplit_phys
    712      WRITE(lunout,*)' iconser = ', iconser
    713      WRITE(lunout,*)' iecri = ', iecri
    714      WRITE(lunout,*)' periodav = ', periodav
    715      WRITE(lunout,*)' output_grads_dyn = ', output_grads_dyn
    716      WRITE(lunout,*)' dissip_period = ', dissip_period
    717      WRITE(lunout,*)' lstardis = ', lstardis
    718      WRITE(lunout,*)' nitergdiv = ', nitergdiv
    719      WRITE(lunout,*)' nitergrot = ', nitergrot
    720      WRITE(lunout,*)' niterh = ', niterh
    721      WRITE(lunout,*)' tetagdiv = ', tetagdiv
    722      WRITE(lunout,*)' tetagrot = ', tetagrot
    723      WRITE(lunout,*)' tetatemp = ', tetatemp
    724      WRITE(lunout,*)' coefdis = ', coefdis
    725      WRITE(lunout,*)' purmats = ', purmats
    726      WRITE(lunout,*)' read_start = ', read_start
    727      WRITE(lunout,*)' iflag_phys = ', iflag_phys
    728      WRITE(lunout,*)' iphysiq = ', iphysiq
    729      WRITE(lunout,*)' clonn = ', clonn
    730      WRITE(lunout,*)' clatt = ', clatt
    731      WRITE(lunout,*)' grossismx = ', grossismx
    732      WRITE(lunout,*)' grossismy = ', grossismy
    733      WRITE(lunout,*)' fxyhypbb = ', fxyhypbb
    734      WRITE(lunout,*)' dzoomxx = ', dzoomxx
    735      WRITE(lunout,*)' dzoomy = ', dzoomyy
    736      WRITE(lunout,*)' tauxx = ', tauxx
    737      WRITE(lunout,*)' tauyy = ', tauyy
    738      WRITE(lunout,*)' offline = ', offline
    739      WRITE(lunout,*)' offline_time = ', offline_time
    740      WRITE(lunout,*)' type_trac = ', type_trac
    741      WRITE(lunout,*)' ok_dynzon = ', ok_dynzon
    742      WRITE(lunout,*)' ok_dyn_ins = ', ok_dyn_ins
    743      WRITE(lunout,*)' ok_dyn_ave = ', ok_dyn_ave
    744      WRITE(lunout,*)' ok_dyn_xios = ', ok_dyn_xios
    745      WRITE(lunout,*)' adv_qsat_liq = ', adv_qsat_liq
    746   else
    747      !Config  Key  = clon
    748      !Config  Desc = centre du zoom, longitude
    749      !Config  Def  = 0
    750      !Config  Help = longitude en degres du centre
    751      !Config         du zoom
    752      clon = 0.
    753      CALL getin('clon',clon)
    754 
    755      !Config  Key  = clat
    756      !Config  Desc = centre du zoom, latitude
    757      !Config  Def  = 0
    758      !Config  Help = latitude en degres du centre du zoom
    759      !Config         
    760      clat = 0.
    761      CALL getin('clat',clat)
    762 
    763      !Config  Key  = grossismx
    764      !Config  Desc = zoom en longitude
    765      !Config  Def  = 1.0
    766      !Config  Help = facteur de grossissement du zoom,
    767      !Config         selon la longitude
    768      grossismx = 1.0
    769      CALL getin('grossismx',grossismx)
    770 
    771      !Config  Key  = grossismy
    772      !Config  Desc = zoom en latitude
    773      !Config  Def  = 1.0
    774      !Config  Help = facteur de grossissement du zoom,
    775      !Config         selon la latitude
    776      grossismy = 1.0
    777      CALL getin('grossismy',grossismy)
    778 
    779      IF( grossismx<1. )  THEN
    780         WRITE(lunout,*) 'conf_gcm: ***ATTENTION !! grossismx < 1 . *** '
    781         CALL abort_gcm("conf_gcm","stopped",1)
    782      ELSE
    783         alphax = 1. - 1./ grossismx
    784      ENDIF
    785 
    786      IF( grossismy<1. )  THEN
    787         WRITE(lunout,*) 'conf_gcm: ***ATTENTION !! grossismy < 1 . *** '
    788         CALL abort_gcm("conf_gcm","stopped",1)
    789      ELSE
    790         alphay = 1. - 1./ grossismy
    791      ENDIF
    792 
    793      WRITE(lunout,*) 'conf_gcm: alphax alphay ',alphax,alphay
    794 
    795      !    alphax et alphay sont les anciennes formulat. des grossissements
    796 
    797      !Config  Key  = fxyhypb
    798      !Config  Desc = Fonction  hyperbolique
    799      !Config  Def  = y
    800      !Config  Help = Fonction  f(y)  hyperbolique  si = .TRUE.
    801      !Config         sinon  sinusoidale
    802      fxyhypb = .TRUE.
    803      CALL getin('fxyhypb',fxyhypb)
    804 
    805      !Config  Key  = dzoomx
    806      !Config  Desc = extension en longitude
    807      !Config  Def  = 0
    808      !Config  Help = extension en longitude  de la zone du zoom 
    809      !Config         ( fraction de la zone totale)
    810      dzoomx = 0.2
    811      CALL getin('dzoomx',dzoomx)
    812      CALL assert(dzoomx < 1, "conf_gcm: dzoomx must be < 1")
    813 
    814      !Config  Key  = dzoomy
    815      !Config  Desc = extension en latitude
    816      !Config  Def  = 0
    817      !Config  Help = extension en latitude de la zone  du zoom 
    818      !Config         ( fraction de la zone totale)
    819      dzoomy = 0.2
    820      CALL getin('dzoomy',dzoomy)
    821      CALL assert(dzoomy < 1, "conf_gcm: dzoomy must be < 1")
    822 
    823      !Config  Key  = taux
    824      !Config  Desc = raideur du zoom en  X
    825      !Config  Def  = 3
    826      !Config  Help = raideur du zoom en  X
    827      taux = 3.0
    828      CALL getin('taux',taux)
    829 
    830      !Config  Key  = tauy
    831      !Config  Desc = raideur du zoom en  Y
    832      !Config  Def  = 3
    833      !Config  Help = raideur du zoom en  Y
    834      tauy = 3.0
    835      CALL getin('tauy',tauy)
    836 
    837      !Config  Key  = ysinus
    838      !Config  IF   = !fxyhypb
    839      !Config  Desc = Fonction en Sinus
    840      !Config  Def  = y
    841      !Config  Help = Fonction  f(y) avec y = Sin(latit.) si = .TRUE.
    842      !Config         sinon y = latit.
    843      ysinus = .TRUE.
    844      CALL getin('ysinus',ysinus)
    845 
    846      !Config  Key  = offline
    847      !Config  Desc = Nouvelle eau liquide
    848      !Config  Def  = n
    849      !Config  Help = Permet de mettre en route la
    850      !Config         nouvelle parametrisation de l'eau liquide !
    851      offline = .FALSE.
    852      CALL getin('offline',offline)
    853      IF (offline .AND. adjust) THEN
    854         WRITE(lunout,*)  &
    855              'WARNING : option offline does not work with adjust=y :'
    856         WRITE(lunout,*) 'the files defstoke.nc, fluxstoke.nc ',  &
    857              'and fluxstokev.nc will not be created'
    858         WRITE(lunout,*)  &
    859              'only the file phystoke.nc will still be created '
    860      ENDIF
    861 
    862      !Config  Key  = type_trac
    863      !Config  Desc = Choix de couplage avec model de chimie INCA ou REPROBUS
    864      !Config  Def  = lmdz
    865      !Config  Help =
    866      !Config         'lmdz' = pas de couplage, pur LMDZ
    867      !Config         'inca' = model de chime INCA
    868      !Config         'repr' = model de chime REPROBUS
    869      type_trac = 'lmdz'
    870      CALL getin('type_trac',type_trac)
    871 
    872      !Config  Key  = ok_dynzon
    873      !Config  Desc = sortie des transports zonaux dans la dynamique
    874      !Config  Def  = n
    875      !Config  Help = Permet de mettre en route le calcul des transports
    876      !Config         
    877      ok_dynzon = .FALSE.
    878      CALL getin('ok_dynzon',ok_dynzon)
    879 
    880      !Config  Key  = ok_dyn_ins
    881      !Config  Desc = sorties instantanees dans la dynamique
    882      !Config  Def  = n
    883      !Config  Help =
    884      !Config         
    885      ok_dyn_ins = .FALSE.
    886      CALL getin('ok_dyn_ins',ok_dyn_ins)
    887 
    888      !Config  Key  = ok_dyn_ave
    889      !Config  Desc = sorties moyennes dans la dynamique
    890      !Config  Def  = n
    891      !Config  Help =
    892      !Config         
    893      ok_dyn_ave = .FALSE.
    894      CALL getin('ok_dyn_ave',ok_dyn_ave)
    895 
    896      !Config  Key  = ok_dyn_xios
    897      !Config  Desc = sorties moyennes dans la dynamique
    898      !Config  Def  = n
    899      !Config  Help =
    900      !Config         
    901      ok_dyn_xios = .FALSE.
    902      CALL getin('ok_dyn_xios',ok_dyn_xios)
    903 
    904      !Config  Key  = use_filtre_fft
    905      !Config  Desc = flag to activate FFTs for the filter
    906      !Config  Def  = false
    907      !Config  Help = enables to use FFts to do the longitudinal polar
    908      !Config         filtering around the poles.
    909      use_filtre_fft=.FALSE.
    910      CALL getin('use_filtre_fft',use_filtre_fft)
    911      IF (use_filtre_fft .AND. grossismx /= 1.0) THEN
    912         WRITE(lunout,*)'WARNING !!! '
    913         WRITE(lunout,*)"A zoom in longitude is not compatible", &
    914              " with the FFT filter ", &
    915              "---> FFT filter deactivated"
    916         use_filtre_fft=.FALSE.
    917      ENDIF
    918      use_filtre_fft_loc=use_filtre_fft
    919 
    920      !Config  Key  = use_mpi_alloc
    921      !Config  Desc = Utilise un buffer MPI en mémoire globale
    922      !Config  Def  = false
    923      !Config  Help = permet d'activer l'utilisation d'un buffer MPI
    924      !Config         en mémoire globale a l'aide de la fonction MPI_ALLOC.
    925      !Config         Cela peut améliorer la bande passante des transferts MPI
    926      !Config         d'un facteur 2 
    927      use_mpi_alloc=.FALSE.
    928      CALL getin('use_mpi_alloc',use_mpi_alloc)
    929 
    930      !Config key = ok_strato
    931      !Config  Desc = activation de la version strato
    932      !Config  Def  = .FALSE.
    933      !Config  Help = active la version stratosphérique de LMDZ de F. Lott
    934 
    935      ok_strato=.FALSE.
    936      CALL getin('ok_strato',ok_strato)
    937 
    938      vert_prof_dissip = merge(1, 0, ok_strato .AND. llm==39)
    939      CALL getin('vert_prof_dissip', vert_prof_dissip)
    940      CALL assert(vert_prof_dissip == 0 .OR. vert_prof_dissip ==  1, &
    941           "bad value for vert_prof_dissip")
    942 
    943      !Config  Key  = ok_gradsfile
    944      !Config  Desc = activation des sorties grads du guidage
    945      !Config  Def  = n
    946      !Config  Help = active les sorties grads du guidage
    947 
    948      ok_gradsfile = .FALSE.
    949      CALL getin('ok_gradsfile',ok_gradsfile)
    950 
    951      !Config  Key  = ok_limit
    952      !Config  Desc = creation des fichiers limit dans create_etat0_limit
    953      !Config  Def  = y
    954      !Config  Help = production du fichier limit.nc requise
    955 
    956      ok_limit = .TRUE.
    957      CALL getin('ok_limit',ok_limit)
    958 
    959      !Config  Key  = ok_etat0
    960      !Config  Desc = creation des fichiers etat0 dans create_etat0_limit
    961      !Config  Def  = y
    962      !Config  Help = production des fichiers start.nc, startphy.nc requise
    963 
    964      ok_etat0 = .TRUE.
    965      CALL getin('ok_etat0',ok_etat0)
    966 
    967      !Config  Key  = read_orop
    968      !Config  Desc = lecture du fichier de params orographiques sous maille
    969      !Config  Def  = f
    970      !Config  Help = lecture fichier plutot que grid_noro
    971 
    972      read_orop = .FALSE.
    973      CALL getin('read_orop',read_orop)
    974 
    975      WRITE(lunout,*)' #########################################'
    976      WRITE(lunout,*)' Configuration des parametres de cel0_limit: '
    977      WRITE(lunout,*)' planet_type = ', planet_type
    978      WRITE(lunout,*)' calend = ', calend
    979      WRITE(lunout,*)' dayref = ', dayref
    980      WRITE(lunout,*)' anneeref = ', anneeref
    981      WRITE(lunout,*)' nday = ', nday
    982      WRITE(lunout,*)' day_step = ', day_step
    983      WRITE(lunout,*)' iperiod = ', iperiod
    984      WRITE(lunout,*)' iconser = ', iconser
    985      WRITE(lunout,*)' iecri = ', iecri
    986      WRITE(lunout,*)' periodav = ', periodav
    987      WRITE(lunout,*)' output_grads_dyn = ', output_grads_dyn
    988      WRITE(lunout,*)' dissip_period = ', dissip_period
    989      WRITE(lunout,*)' lstardis = ', lstardis
    990      WRITE(lunout,*)' nitergdiv = ', nitergdiv
    991      WRITE(lunout,*)' nitergrot = ', nitergrot
    992      WRITE(lunout,*)' niterh = ', niterh
    993      WRITE(lunout,*)' tetagdiv = ', tetagdiv
    994      WRITE(lunout,*)' tetagrot = ', tetagrot
    995      WRITE(lunout,*)' tetatemp = ', tetatemp
    996      WRITE(lunout,*)' coefdis = ', coefdis
    997      WRITE(lunout,*)' purmats = ', purmats
    998      WRITE(lunout,*)' read_start = ', read_start
    999      WRITE(lunout,*)' iflag_phys = ', iflag_phys
    1000      WRITE(lunout,*)' iphysiq = ', iphysiq
    1001      WRITE(lunout,*)' clon = ', clon
    1002      WRITE(lunout,*)' clat = ', clat
    1003      WRITE(lunout,*)' grossismx = ', grossismx
    1004      WRITE(lunout,*)' grossismy = ', grossismy
    1005      WRITE(lunout,*)' fxyhypb = ', fxyhypb
    1006      WRITE(lunout,*)' dzoomx = ', dzoomx
    1007      WRITE(lunout,*)' dzoomy = ', dzoomy
    1008      WRITE(lunout,*)' taux = ', taux
    1009      WRITE(lunout,*)' tauy = ', tauy
    1010      WRITE(lunout,*)' offline = ', offline
    1011      WRITE(lunout,*)' type_trac = ', type_trac
    1012      WRITE(lunout,*)' ok_dynzon = ', ok_dynzon
    1013      WRITE(lunout,*)' ok_dyn_ins = ', ok_dyn_ins
    1014      WRITE(lunout,*)' ok_dyn_ave = ', ok_dyn_ave
    1015      WRITE(lunout,*)' ok_dyn_xios = ', ok_dyn_xios
    1016      WRITE(lunout,*)' use_filtre_fft = ', use_filtre_fft
    1017      WRITE(lunout,*)' use_mpi_alloc = ', use_mpi_alloc
    1018      WRITE(lunout,*)' ok_strato = ', ok_strato
    1019      WRITE(lunout,*)' ok_gradsfile = ', ok_gradsfile
    1020      WRITE(lunout,*)' ok_limit = ', ok_limit
    1021      WRITE(lunout,*)' ok_etat0 = ', ok_etat0
    1022      WRITE(lunout,*)' ok_guide = ', ok_guide
    1023      WRITE(lunout,*)' read_orop = ', read_orop
    1024   ENDIF test_etatinit
    1025 
    1026 END SUBROUTINE conf_gcm
     628      ENDIF ! of IF( .NOT.fxyhypb  )
     629
     630      !Config  Key  = offline
     631      !Config  Desc = ecriture des flux de masse
     632      !Config  Def  = n
     633      !Config  Help = Permet de sortir les flux de masse sur la grille plev
     634      offline = .FALSE.
     635      CALL getin('offline', offline)
     636
     637      !Config Key  = offline_time
     638      !Config Desc =  Choix des frequences de stockage pour le offline
     639      !Config Def  = 8
     640      !Config Help = offline_time=12     ! stockage toutes les 2h=1jour/12
     641      !Config Help = offline_time=8      ! stockage toutes les 3h=1jour/8
     642      offline_time = 8
     643      CALL getin('offline_time', offline_time)
     644
     645      IF (offline .AND. adjust) THEN
     646        WRITE(lunout, *)  &
     647                'WARNING : option offline does not work with adjust=y :'
     648        WRITE(lunout, *) 'the files defstoke.nc, fluxstoke.nc ', &
     649                'and fluxstokev.nc will not be created'
     650        WRITE(lunout, *)  &
     651                'only the file phystoke.nc will still be created '
     652      ENDIF
     653
     654      !Config  Key  = type_trac
     655      !Config  Desc = Choix de couplage avec model de chimie INCA ou REPROBUS
     656      !Config  Def  = lmdz
     657      !Config  Help =
     658      !Config         'lmdz' = pas de couplage, pur LMDZ
     659      !Config         'inca' = model de chime INCA
     660      !Config         'repr' = model de chime REPROBUS
     661      type_trac = 'lmdz'
     662      CALL getin('type_trac', type_trac)
     663
     664
     665      !Config  Key  = adv_qsat_liq
     666      !Config  Desc = option for qsat calculation in the dynamics
     667      !Config  Def  = n
     668      !Config  Help = controls which phase is considered for qsat calculation
     669      !Config
     670      adv_qsat_liq = .FALSE.
     671      CALL getin('adv_qsat_liq', adv_qsat_liq)
     672
     673      !Config  Key  = ok_dynzon
     674      !Config  Desc = calcul et sortie des transports
     675      !Config  Def  = n
     676      !Config  Help = Permet de mettre en route le calcul des transports
     677      !Config
     678      ok_dynzon = .FALSE.
     679      CALL getin('ok_dynzon', ok_dynzon)
     680
     681      !Config  Key  = ok_dyn_ins
     682      !Config  Desc = sorties instantanees dans la dynamique
     683      !Config  Def  = n
     684      !Config  Help =
     685      !Config
     686      ok_dyn_ins = .FALSE.
     687      CALL getin('ok_dyn_ins', ok_dyn_ins)
     688
     689      !Config  Key  = ok_dyn_ave
     690      !Config  Desc = sorties moyennes dans la dynamique
     691      !Config  Def  = n
     692      !Config  Help =
     693      !Config
     694      ok_dyn_ave = .FALSE.
     695      CALL getin('ok_dyn_ave', ok_dyn_ave)
     696
     697      !Config  Key  = ok_dyn_xios
     698      !Config  Desc = sorties moyennes dans la dynamique
     699      !Config  Def  = n
     700      !Config  Help =
     701      !Config
     702      ok_dyn_xios = .FALSE.
     703      CALL getin('ok_dyn_xios', ok_dyn_xios)
     704
     705      WRITE(lunout, *)' #########################################'
     706      WRITE(lunout, *)' Configuration des parametres du gcm: '
     707      WRITE(lunout, *)' planet_type = ', planet_type
     708      WRITE(lunout, *)' calend = ', calend
     709      WRITE(lunout, *)' dayref = ', dayref
     710      WRITE(lunout, *)' anneeref = ', anneeref
     711      WRITE(lunout, *)' nday = ', nday
     712      WRITE(lunout, *)' day_step = ', day_step
     713      WRITE(lunout, *)' iperiod = ', iperiod
     714      WRITE(lunout, *)' nsplit_phys = ', nsplit_phys
     715      WRITE(lunout, *)' iconser = ', iconser
     716      WRITE(lunout, *)' iecri = ', iecri
     717      WRITE(lunout, *)' periodav = ', periodav
     718      WRITE(lunout, *)' output_grads_dyn = ', output_grads_dyn
     719      WRITE(lunout, *)' dissip_period = ', dissip_period
     720      WRITE(lunout, *)' lstardis = ', lstardis
     721      WRITE(lunout, *)' nitergdiv = ', nitergdiv
     722      WRITE(lunout, *)' nitergrot = ', nitergrot
     723      WRITE(lunout, *)' niterh = ', niterh
     724      WRITE(lunout, *)' tetagdiv = ', tetagdiv
     725      WRITE(lunout, *)' tetagrot = ', tetagrot
     726      WRITE(lunout, *)' tetatemp = ', tetatemp
     727      WRITE(lunout, *)' coefdis = ', coefdis
     728      WRITE(lunout, *)' purmats = ', purmats
     729      WRITE(lunout, *)' read_start = ', read_start
     730      WRITE(lunout, *)' iflag_phys = ', iflag_phys
     731      WRITE(lunout, *)' iphysiq = ', iphysiq
     732      WRITE(lunout, *)' clonn = ', clonn
     733      WRITE(lunout, *)' clatt = ', clatt
     734      WRITE(lunout, *)' grossismx = ', grossismx
     735      WRITE(lunout, *)' grossismy = ', grossismy
     736      WRITE(lunout, *)' fxyhypbb = ', fxyhypbb
     737      WRITE(lunout, *)' dzoomxx = ', dzoomxx
     738      WRITE(lunout, *)' dzoomy = ', dzoomyy
     739      WRITE(lunout, *)' tauxx = ', tauxx
     740      WRITE(lunout, *)' tauyy = ', tauyy
     741      WRITE(lunout, *)' offline = ', offline
     742      WRITE(lunout, *)' offline_time = ', offline_time
     743      WRITE(lunout, *)' type_trac = ', type_trac
     744      WRITE(lunout, *)' ok_dynzon = ', ok_dynzon
     745      WRITE(lunout, *)' ok_dyn_ins = ', ok_dyn_ins
     746      WRITE(lunout, *)' ok_dyn_ave = ', ok_dyn_ave
     747      WRITE(lunout, *)' ok_dyn_xios = ', ok_dyn_xios
     748      WRITE(lunout, *)' adv_qsat_liq = ', adv_qsat_liq
     749    else
     750      !Config  Key  = clon
     751      !Config  Desc = centre du zoom, longitude
     752      !Config  Def  = 0
     753      !Config  Help = longitude en degres du centre
     754      !Config         du zoom
     755      clon = 0.
     756      CALL getin('clon', clon)
     757
     758      !Config  Key  = clat
     759      !Config  Desc = centre du zoom, latitude
     760      !Config  Def  = 0
     761      !Config  Help = latitude en degres du centre du zoom
     762      !Config
     763      clat = 0.
     764      CALL getin('clat', clat)
     765
     766      !Config  Key  = grossismx
     767      !Config  Desc = zoom en longitude
     768      !Config  Def  = 1.0
     769      !Config  Help = facteur de grossissement du zoom,
     770      !Config         selon la longitude
     771      grossismx = 1.0
     772      CALL getin('grossismx', grossismx)
     773
     774      !Config  Key  = grossismy
     775      !Config  Desc = zoom en latitude
     776      !Config  Def  = 1.0
     777      !Config  Help = facteur de grossissement du zoom,
     778      !Config         selon la latitude
     779      grossismy = 1.0
     780      CALL getin('grossismy', grossismy)
     781
     782      IF(grossismx<1.)  THEN
     783        WRITE(lunout, *) 'conf_gcm: ***ATTENTION !! grossismx < 1 . *** '
     784        CALL abort_gcm("conf_gcm", "stopped", 1)
     785      ELSE
     786        alphax = 1. - 1. / grossismx
     787      ENDIF
     788
     789      IF(grossismy<1.)  THEN
     790        WRITE(lunout, *) 'conf_gcm: ***ATTENTION !! grossismy < 1 . *** '
     791        CALL abort_gcm("conf_gcm", "stopped", 1)
     792      ELSE
     793        alphay = 1. - 1. / grossismy
     794      ENDIF
     795
     796      WRITE(lunout, *) 'conf_gcm: alphax alphay ', alphax, alphay
     797
     798      !    alphax et alphay sont les anciennes formulat. des grossissements
     799
     800      !Config  Key  = fxyhypb
     801      !Config  Desc = Fonction  hyperbolique
     802      !Config  Def  = y
     803      !Config  Help = Fonction  f(y)  hyperbolique  si = .TRUE.
     804      !Config         sinon  sinusoidale
     805      fxyhypb = .TRUE.
     806      CALL getin('fxyhypb', fxyhypb)
     807
     808      !Config  Key  = dzoomx
     809      !Config  Desc = extension en longitude
     810      !Config  Def  = 0
     811      !Config  Help = extension en longitude  de la zone du zoom
     812      !Config         ( fraction de la zone totale)
     813      dzoomx = 0.2
     814      CALL getin('dzoomx', dzoomx)
     815      CALL assert(dzoomx < 1, "conf_gcm: dzoomx must be < 1")
     816
     817      !Config  Key  = dzoomy
     818      !Config  Desc = extension en latitude
     819      !Config  Def  = 0
     820      !Config  Help = extension en latitude de la zone  du zoom
     821      !Config         ( fraction de la zone totale)
     822      dzoomy = 0.2
     823      CALL getin('dzoomy', dzoomy)
     824      CALL assert(dzoomy < 1, "conf_gcm: dzoomy must be < 1")
     825
     826      !Config  Key  = taux
     827      !Config  Desc = raideur du zoom en  X
     828      !Config  Def  = 3
     829      !Config  Help = raideur du zoom en  X
     830      taux = 3.0
     831      CALL getin('taux', taux)
     832
     833      !Config  Key  = tauy
     834      !Config  Desc = raideur du zoom en  Y
     835      !Config  Def  = 3
     836      !Config  Help = raideur du zoom en  Y
     837      tauy = 3.0
     838      CALL getin('tauy', tauy)
     839
     840      !Config  Key  = ysinus
     841      !Config  IF   = !fxyhypb
     842      !Config  Desc = Fonction en Sinus
     843      !Config  Def  = y
     844      !Config  Help = Fonction  f(y) avec y = Sin(latit.) si = .TRUE.
     845      !Config         sinon y = latit.
     846      ysinus = .TRUE.
     847      CALL getin('ysinus', ysinus)
     848
     849      !Config  Key  = offline
     850      !Config  Desc = Nouvelle eau liquide
     851      !Config  Def  = n
     852      !Config  Help = Permet de mettre en route la
     853      !Config         nouvelle parametrisation de l'eau liquide !
     854      offline = .FALSE.
     855      CALL getin('offline', offline)
     856      IF (offline .AND. adjust) THEN
     857        WRITE(lunout, *)  &
     858                'WARNING : option offline does not work with adjust=y :'
     859        WRITE(lunout, *) 'the files defstoke.nc, fluxstoke.nc ', &
     860                'and fluxstokev.nc will not be created'
     861        WRITE(lunout, *)  &
     862                'only the file phystoke.nc will still be created '
     863      ENDIF
     864
     865      !Config  Key  = type_trac
     866      !Config  Desc = Choix de couplage avec model de chimie INCA ou REPROBUS
     867      !Config  Def  = lmdz
     868      !Config  Help =
     869      !Config         'lmdz' = pas de couplage, pur LMDZ
     870      !Config         'inca' = model de chime INCA
     871      !Config         'repr' = model de chime REPROBUS
     872      type_trac = 'lmdz'
     873      CALL getin('type_trac', type_trac)
     874
     875      !Config  Key  = ok_dynzon
     876      !Config  Desc = sortie des transports zonaux dans la dynamique
     877      !Config  Def  = n
     878      !Config  Help = Permet de mettre en route le calcul des transports
     879      !Config
     880      ok_dynzon = .FALSE.
     881      CALL getin('ok_dynzon', ok_dynzon)
     882
     883      !Config  Key  = ok_dyn_ins
     884      !Config  Desc = sorties instantanees dans la dynamique
     885      !Config  Def  = n
     886      !Config  Help =
     887      !Config
     888      ok_dyn_ins = .FALSE.
     889      CALL getin('ok_dyn_ins', ok_dyn_ins)
     890
     891      !Config  Key  = ok_dyn_ave
     892      !Config  Desc = sorties moyennes dans la dynamique
     893      !Config  Def  = n
     894      !Config  Help =
     895      !Config
     896      ok_dyn_ave = .FALSE.
     897      CALL getin('ok_dyn_ave', ok_dyn_ave)
     898
     899      !Config  Key  = ok_dyn_xios
     900      !Config  Desc = sorties moyennes dans la dynamique
     901      !Config  Def  = n
     902      !Config  Help =
     903      !Config
     904      ok_dyn_xios = .FALSE.
     905      CALL getin('ok_dyn_xios', ok_dyn_xios)
     906
     907      !Config  Key  = use_filtre_fft
     908      !Config  Desc = flag to activate FFTs for the filter
     909      !Config  Def  = false
     910      !Config  Help = enables to use FFts to do the longitudinal polar
     911      !Config         filtering around the poles.
     912      use_filtre_fft = .FALSE.
     913      CALL getin('use_filtre_fft', use_filtre_fft)
     914      IF (use_filtre_fft .AND. grossismx /= 1.0) THEN
     915        WRITE(lunout, *)'WARNING !!! '
     916        WRITE(lunout, *)"A zoom in longitude is not compatible", &
     917                " with the FFT filter ", &
     918                "---> FFT filter deactivated"
     919        use_filtre_fft = .FALSE.
     920      ENDIF
     921      use_filtre_fft_loc = use_filtre_fft
     922
     923      !Config  Key  = use_mpi_alloc
     924      !Config  Desc = Utilise un buffer MPI en mémoire globale
     925      !Config  Def  = false
     926      !Config  Help = permet d'activer l'utilisation d'un buffer MPI
     927      !Config         en mémoire globale a l'aide de la fonction MPI_ALLOC.
     928      !Config         Cela peut améliorer la bande passante des transferts MPI
     929      !Config         d'un facteur 2
     930      use_mpi_alloc = .FALSE.
     931      CALL getin('use_mpi_alloc', use_mpi_alloc)
     932
     933      !Config key = ok_strato
     934      !Config  Desc = activation de la version strato
     935      !Config  Def  = .FALSE.
     936      !Config  Help = active la version stratosphérique de LMDZ de F. Lott
     937
     938      ok_strato = .FALSE.
     939      CALL getin('ok_strato', ok_strato)
     940
     941      vert_prof_dissip = merge(1, 0, ok_strato .AND. llm==39)
     942      CALL getin('vert_prof_dissip', vert_prof_dissip)
     943      CALL assert(vert_prof_dissip == 0 .OR. vert_prof_dissip ==  1, &
     944              "bad value for vert_prof_dissip")
     945
     946      !Config  Key  = ok_gradsfile
     947      !Config  Desc = activation des sorties grads du guidage
     948      !Config  Def  = n
     949      !Config  Help = active les sorties grads du guidage
     950
     951      ok_gradsfile = .FALSE.
     952      CALL getin('ok_gradsfile', ok_gradsfile)
     953
     954      !Config  Key  = ok_limit
     955      !Config  Desc = creation des fichiers limit dans create_etat0_limit
     956      !Config  Def  = y
     957      !Config  Help = production du fichier limit.nc requise
     958
     959      ok_limit = .TRUE.
     960      CALL getin('ok_limit', ok_limit)
     961
     962      !Config  Key  = ok_etat0
     963      !Config  Desc = creation des fichiers etat0 dans create_etat0_limit
     964      !Config  Def  = y
     965      !Config  Help = production des fichiers start.nc, startphy.nc requise
     966
     967      ok_etat0 = .TRUE.
     968      CALL getin('ok_etat0', ok_etat0)
     969
     970      !Config  Key  = read_orop
     971      !Config  Desc = lecture du fichier de params orographiques sous maille
     972      !Config  Def  = f
     973      !Config  Help = lecture fichier plutot que grid_noro
     974
     975      read_orop = .FALSE.
     976      CALL getin('read_orop', read_orop)
     977
     978      WRITE(lunout, *)' #########################################'
     979      WRITE(lunout, *)' Configuration des parametres de cel0_limit: '
     980      WRITE(lunout, *)' planet_type = ', planet_type
     981      WRITE(lunout, *)' calend = ', calend
     982      WRITE(lunout, *)' dayref = ', dayref
     983      WRITE(lunout, *)' anneeref = ', anneeref
     984      WRITE(lunout, *)' nday = ', nday
     985      WRITE(lunout, *)' day_step = ', day_step
     986      WRITE(lunout, *)' iperiod = ', iperiod
     987      WRITE(lunout, *)' iconser = ', iconser
     988      WRITE(lunout, *)' iecri = ', iecri
     989      WRITE(lunout, *)' periodav = ', periodav
     990      WRITE(lunout, *)' output_grads_dyn = ', output_grads_dyn
     991      WRITE(lunout, *)' dissip_period = ', dissip_period
     992      WRITE(lunout, *)' lstardis = ', lstardis
     993      WRITE(lunout, *)' nitergdiv = ', nitergdiv
     994      WRITE(lunout, *)' nitergrot = ', nitergrot
     995      WRITE(lunout, *)' niterh = ', niterh
     996      WRITE(lunout, *)' tetagdiv = ', tetagdiv
     997      WRITE(lunout, *)' tetagrot = ', tetagrot
     998      WRITE(lunout, *)' tetatemp = ', tetatemp
     999      WRITE(lunout, *)' coefdis = ', coefdis
     1000      WRITE(lunout, *)' purmats = ', purmats
     1001      WRITE(lunout, *)' read_start = ', read_start
     1002      WRITE(lunout, *)' iflag_phys = ', iflag_phys
     1003      WRITE(lunout, *)' iphysiq = ', iphysiq
     1004      WRITE(lunout, *)' clon = ', clon
     1005      WRITE(lunout, *)' clat = ', clat
     1006      WRITE(lunout, *)' grossismx = ', grossismx
     1007      WRITE(lunout, *)' grossismy = ', grossismy
     1008      WRITE(lunout, *)' fxyhypb = ', fxyhypb
     1009      WRITE(lunout, *)' dzoomx = ', dzoomx
     1010      WRITE(lunout, *)' dzoomy = ', dzoomy
     1011      WRITE(lunout, *)' taux = ', taux
     1012      WRITE(lunout, *)' tauy = ', tauy
     1013      WRITE(lunout, *)' offline = ', offline
     1014      WRITE(lunout, *)' type_trac = ', type_trac
     1015      WRITE(lunout, *)' ok_dynzon = ', ok_dynzon
     1016      WRITE(lunout, *)' ok_dyn_ins = ', ok_dyn_ins
     1017      WRITE(lunout, *)' ok_dyn_ave = ', ok_dyn_ave
     1018      WRITE(lunout, *)' ok_dyn_xios = ', ok_dyn_xios
     1019      WRITE(lunout, *)' use_filtre_fft = ', use_filtre_fft
     1020      WRITE(lunout, *)' use_mpi_alloc = ', use_mpi_alloc
     1021      WRITE(lunout, *)' ok_strato = ', ok_strato
     1022      WRITE(lunout, *)' ok_gradsfile = ', ok_gradsfile
     1023      WRITE(lunout, *)' ok_limit = ', ok_limit
     1024      WRITE(lunout, *)' ok_etat0 = ', ok_etat0
     1025      WRITE(lunout, *)' ok_guide = ', ok_guide
     1026      WRITE(lunout, *)' read_orop = ', read_orop
     1027    ENDIF test_etatinit
     1028
     1029  END SUBROUTINE conf_gcm
     1030
     1031
     1032END MODULE lmdz_conf_gcm
Note: See TracChangeset for help on using the changeset viewer.