Changeset 127


Ignore:
Timestamp:
May 24, 2011, 1:26:29 PM (14 years ago)
Author:
emillour
Message:

Ehouarn: suite de l'implementation de la discretisation verticale,
avec quelques mises a jour pour concorder avec la version terrestre.
-> Finalement, on met un flag "disvert_type" pour fixer la discretisation

disvert_type==1 (defaut si planet_type=="earth") pour cas terrestre
disvert_type==2 (defaut si planet_type!="earth") pour cas planeto (z2sig.def)

-> au passage, pour rester en phase avec modele terrestre on renomme

disvert_terre en disvert (le disvert "alternatif" demeure 'disvert_noterre')

Location:
trunk
Files:
23 edited
2 moved

Legend:

Unmodified
Added
Removed
  • trunk/chantiers/commit_importants.log

    r124 r127  
    882882
    883883*********************
    884 **** commit_v123 ****
     884**** commit_v124 ****
    885885*********************
    886886
     
    892892   pour atteindre la concordance entre versions séq. et //.
    893893   
     894*********************
     895**** commit_v126 ****
     896*********************
     897
     898Ehouarn: suite de l'implémentation de la discrétisation verticale, quelques
     899         mises à jour pour concorder avec la version terrestre.
     900-> Finalement, on met un flag "disvert_type" pour fixer la discrétisation
     901   disvert_type==1 (défaut si planet_type=="earth") pour cas terrestre
     902   disvert_type==2 (défaut si planet_type!="earth") pour cas planéto (z2sig.def)
     903-> au passage, pour rester en phase avec modèle terrestre on renomme
     904   disvert_terre en disvert (le disvert "alternatif" demeure 'disvert_noterre')
  • trunk/chantiers/meschantiers-Ehouarn.txt

    r124 r127  
    11>>> choses à faire:
    22
    3 - En priorité: faire qu'on puisse compiler un/des cas test (sans physique) pour pouvoir tester les modifs au fur et à mesure. OK, c'est fait, on peut compiler/tourner sans physique
     3- En priorité: faire qu'on puisse compiler un/des cas test (sans physique)
     4  pour pouvoir tester les modifs au fur et à mesure. OK, c'est fait, on
     5  peut compiler/tourner sans physique
    46
    57- Uniformiser les mises à jour dyn séq. et // (commencé avec la rev. 8)
     
    79- Peut-être revoir l'interface dynamique/physique ?
    810
    9 - Attention à la discrétisation verticale ...
     11- Attention à la discrétisation verticale ... ( débuté avec la r109 par Seb
     12  puis mes modifs en r124 et finalement r126) donc a priori
     13  OK maintenant
    1014
  • trunk/libf/dyn3d/comvert.h

    r124 r127  
    11!
    2 ! $Id: comvert.h 1279 2009-12-10 09:02:56Z fairhead $
     2! $Id: comvert.h 1520 2011-05-23 11:37:09Z emillour $
    33!
    44!-----------------------------------------------------------------------
    55!   INCLUDE 'comvert.h'
    66
    7       COMMON/comvert/ap(llm+1),bp(llm+1),presnivs(llm),dpres(llm),      &
     7      COMMON/comvertr/ap(llm+1),bp(llm+1),presnivs(llm),dpres(llm),     &
    88     &               pa,preff,nivsigs(llm),nivsig(llm+1),               &
    99     &               aps(llm),bps(llm),scaleheight
    1010
    11       REAL ap,bp,presnivs,dpres,pa,preff,nivsigs,nivsig,aps,bps
     11      common/comverti/disvert_type
     12
     13      real ap     ! hybrid pressure contribution at interlayers
     14      real bp     ! hybrid sigma contribution at interlayer
     15      real presnivs ! (reference) pressure at mid-layers
     16      real dpres
     17      real pa     ! reference pressure (Pa) at which hybrid coordinates
     18                  ! become purely pressure
     19      real preff  ! reference surface pressure (Pa)
     20      real nivsigs
     21      real nivsig
     22      real aps    ! hybrid pressure contribution at mid-layers
     23      real bps    ! hybrid sigma contribution at mid-layers
    1224      real scaleheight ! atmospheric (reference) scale height (km)
    1325
     26      integer disvert_type ! type of vertical discretization:
     27                           ! 1: Earth (default for planet_type==earth),
     28                           !     automatic generation
     29                           ! 2: Planets (default for planet_type!=earth),
     30                           !     using 'z2sig.def' (or 'esasig.def) file
     31
    1432 !-----------------------------------------------------------------------
  • trunk/libf/dyn3d/disvert.F90

    r126 r127  
    1 ! $Id: disvert.F90 1480 2011-01-31 21:29:58Z jghattas $
     1! $Id: disvert.F90 1520 2011-05-23 11:37:09Z emillour $
    22
    3 SUBROUTINE disvert_terre(pa, preff, ap, bp, dpres, presnivs, nivsigs, nivsig)
     3SUBROUTINE disvert(pa,preff,ap,bp,dpres,presnivs,nivsigs,nivsig,scaleheight)
    44
    55  ! Auteur : P. Le Van
     
    1717  ! ds(l) : distance entre les couches l et l-1 en coord.s
    1818
    19   REAL pa, preff
    20   REAL ap(llmp1), bp(llmp1), dpres(llm), nivsigs(llm), nivsig(llmp1)
    21   REAL presnivs(llm)
     19  real,intent(in) :: pa, preff
     20  real,intent(out) :: ap(llmp1), bp(llmp1)
     21  real,intent(out) :: dpres(llm), nivsigs(llm), nivsig(llmp1)
     22  real,intent(out) :: presnivs(llm)
     23  real,intent(out) :: scaleheight
    2224
    2325  REAL sig(llm+1), dsig(llm)
     
    2628  INTEGER l
    2729  REAL dsigmin
    28   REAL alpha, beta, deltaz, h
     30  REAL alpha, beta, deltaz,scaleheight
    2931  INTEGER iostat
    30   REAL pi, x
     32  REAL x
     33  character(len=*),parameter :: modname="disvert"
    3134
    3235  !-----------------------------------------------------------------------
    3336
    34   pi = 2 * ASIN(1.)
     37  ! default scaleheight is 8km for earth
     38  scaleheight=8.
    3539
    3640  OPEN(99, file='sigma.def', status='old', form='formatted', iostat=iostat)
     
    3842  IF (iostat == 0) THEN
    3943     ! cas 1 on lit les options dans sigma.def:
    40      READ(99, *) h ! hauteur d'echelle 8.
     44     READ(99, *) scaleheight ! hauteur d'echelle 8.
    4145     READ(99, *) deltaz ! epaiseur de la premiere couche 0.04
    4246     READ(99, *) beta ! facteur d'acroissement en haut 1.3
     
    4448     READ(99, *) k1 ! nombre de couches dans la transition haute
    4549     CLOSE(99)
    46      alpha=deltaz/(llm*h)
    47      write(lunout, *)'disvert: h, alpha, k0, k1, beta'
     50     alpha=deltaz/(llm*scaleheight)
     51     write(lunout, *)trim(modname),':scaleheight, alpha, k0, k1, beta', &
     52                               scaleheight, alpha, k0, k1, beta
    4853
    4954     alpha=deltaz/tanh(1./k0)*2.
     
    5156     sig(1)=1.
    5257     do l=1, llm
    53         sig(l+1)=(cosh(l/k0))**(-alpha*k0/h) &
    54              *exp(-alpha/h*tanh((llm-k1)/k0)*beta**(l-(llm-k1))/log(beta))
    55         zk=-h*log(sig(l+1))
     58        sig(l+1)=(cosh(l/k0))**(-alpha*k0/scaleheight) &
     59             *exp(-alpha/scaleheight*tanh((llm-k1)/k0) &
     60                  *beta**(l-(llm-k1))/log(beta))
     61        zk=-scaleheight*log(sig(l+1))
    5662
    5763        dzk1=alpha*tanh(l/k0)
     
    7379           dsigmin=1.
    7480        else
    75            WRITE(LUNOUT,*)'disvert: ATTENTION discretisation z a ajuster'
     81           write(lunout,*) trim(modname), &
     82           ' ATTENTION discretisation z a ajuster'
    7683           dsigmin=1.
    7784        endif
    78         WRITE(LUNOUT,*) 'disvert: Discretisation verticale DSIGMIN=',dsigmin
     85        write(lunout,*) trim(modname), &
     86        ' Discretisation verticale DSIGMIN=',dsigmin
    7987     endif
    8088
     
    119127  ap(llmp1) = pa * ( sig(llmp1) - bp(llmp1) )
    120128
    121   write(lunout, *)'disvert: BP '
     129  write(lunout, *)  trim(modname),': BP '
    122130  write(lunout, *) bp
    123   write(lunout, *)'disvert: AP '
     131  write(lunout, *)  trim(modname),': AP '
    124132  write(lunout, *) ap
    125133
    126134  write(lunout, *) 'Niveaux de pressions approximatifs aux centres des'
    127135  write(lunout, *)'couches calcules pour une pression de surface =', preff
    128   write(lunout, *) 'et altitudes equivalentes pour une hauteur d echelle de'
    129   write(lunout, *)'8km'
     136  write(lunout, *) 'et altitudes equivalentes pour une hauteur d echelle de '
     137  write(lunout, *) scaleheight,' km'
    130138  DO l = 1, llm
    131139     dpres(l) = bp(l) - bp(l+1)
    132140     presnivs(l) = 0.5 *( ap(l)+bp(l)*preff + ap(l+1)+bp(l+1)*preff )
    133141     write(lunout, *)'PRESNIVS(', l, ')=', presnivs(l), ' Z ~ ', &
    134           log(preff/presnivs(l))*8. &
    135           , ' DZ ~ ', 8.*log((ap(l)+bp(l)*preff)/ &
     142          log(preff/presnivs(l))*scaleheight &
     143          , ' DZ ~ ', scaleheight*log((ap(l)+bp(l)*preff)/ &
    136144          max(ap(l+1)+bp(l+1)*preff, 1.e-10))
    137145  ENDDO
    138146
    139   write(lunout, *) 'disvert: PRESNIVS '
     147  write(lunout, *) trim(modname),': PRESNIVS '
    140148  write(lunout, *) presnivs
    141149
    142 END SUBROUTINE disvert_terre
     150END SUBROUTINE disvert
  • trunk/libf/dyn3d/disvert_noterre.F

    r124 r127  
     1! $Id: $
    12      SUBROUTINE disvert_noterre
    23
     
    2223c
    2324c=======================================================================
    24 c    Discretisation verticale en coordonnée hybride
     25c    Discretisation verticale en coordonnée hybride (ou sigma)
    2526c
    2627c=======================================================================
     
    4950      integer iz
    5051      real z, ps,p
     52      character(len=*),parameter :: modname="disvert_noterre"
    5153
    5254c
     
    5456c
    5557! Initializations:
    56       pi=2.*ASIN(1.)
     58!      pi=2.*ASIN(1.) ! already done in iniconst
    5759     
    5860      hybrid=.true. ! default value for hybrid (ie: use hybrid coordinates)
    5961      CALL getin('hybrid',hybrid)
    60       write(lunout,*)'disvert_noterre: hybrid=',hybrid
     62      write(lunout,*) trim(modname),': hybrid=',hybrid
    6163
    6264! Ouverture possible de fichiers typiquement E.T.
     
    156158
    157159      DO l=1,llm
    158         nivsigs(l) = FLOAT(l)
     160        nivsigs(l) = REAL(l)
    159161      ENDDO
    160162
    161163      DO l=1,llmp1
    162         nivsig(l)= FLOAT(l)
     164        nivsig(l)= REAL(l)
    163165      ENDDO
    164166
     
    199201      bp(llmp1) =   0.
    200202
    201       write(lunout,*)' BP '
     203      write(lunout,*) trim(modname),': BP '
    202204      write(lunout,*)  bp
    203       write(lunout,*)' AP '
     205      write(lunout,*) trim(modname),': AP '
    204206      write(lunout,*)  ap
    205207
     
    225227      end if
    226228
    227       write(lunout,*)' BPs '
     229      write(lunout,*) trim(modname),': BPs '
    228230      write(lunout,*)  bps
    229       write(lunout,*)' APs'
     231      write(lunout,*) trim(modname),': APs'
    230232      write(lunout,*)  aps
    231233
     
    235237      ENDDO
    236238
    237       write(lunout,*)' PRESNIVS'
     239      write(lunout,*)trim(modname),' : PRESNIVS'
    238240      write(lunout,*)presnivs
    239241      write(lunout,*)'Pseudo altitude of Presnivs : (for a scale ',
  • trunk/libf/dyn3d/etat0_netcdf.F90

    r66 r127  
    11!
    2 ! $Id: etat0_netcdf.F90 1486 2011-02-11 12:07:39Z fairhead $
     2! $Id: etat0_netcdf.F90 1520 2011-05-23 11:37:09Z emillour $
    33!
    44!-------------------------------------------------------------------------------
    55!
    6 SUBROUTINE etat0_netcdf(ib, masque, letat0)
     6SUBROUTINE etat0_netcdf(ib, masque, phis, letat0)
    77!
    88!-------------------------------------------------------------------------------
     
    3737  LOGICAL,                    INTENT(IN)    :: ib     ! barycentric interpolat.
    3838  REAL, DIMENSION(iip1,jjp1), INTENT(INOUT) :: masque ! land mask
     39  REAL, DIMENSION(iip1,jjp1), INTENT(OUT)   :: phis   ! geopotentiel au sol
    3940  LOGICAL,                    INTENT(IN)    :: letat0 ! F: masque only required
    4041#ifndef CPP_EARTH
     
    5152  REAL,    DIMENSION(klon)                 :: tsol, qsol
    5253  REAL,    DIMENSION(klon)                 :: sn, rugmer, run_off_lic_0
    53   REAL,    DIMENSION(iip1,jjp1)            :: orog, rugo, psol, phis
     54  REAL,    DIMENSION(iip1,jjp1)            :: orog, rugo, psol
    5455  REAL,    DIMENSION(iip1,jjp1,llm+1)      :: p3d
    5556  REAL,    DIMENSION(iip1,jjp1,llm)        :: uvent, t3d, tpot, qsat, qd
     
    138139                   flag_aerosol, new_aod,                               &
    139140                   bl95_b0, bl95_b1,                                    &
    140                    iflag_thermals,nsplit_thermals,tau_thermals,         &
    141                    iflag_thermals_ed,iflag_thermals_optflux,            &
    142                    iflag_coupl,iflag_clos,iflag_wake, read_climoz,      &
     141                   read_climoz,                                         &
    143142                   alp_offset)
    144143
     
    252251!*******************************************************************************
    253252  CALL pression(ip1jmp1, ap, bp, psol, p3d)
    254   CALL exner_hyb(ip1jmp1, psol, p3d, alpha, beta, pks, pk, y)
     253  if (disvert_type.eq.1) then
     254    CALL exner_hyb(ip1jmp1, psol, p3d, alpha, beta, pks, pk, y)
     255  else ! we assume that we are in the disvert_type==2 case
     256    CALL exner_milieu(ip1jmp1,psol,p3d,beta,pks,pk,y)
     257  endif
    255258  pls(:,:,:)=preff*(pk(:,:,:)/cpp)**(1./kappa)
    256259!  WRITE(lunout,*) 'P3D :', p3d(10,20,:)
  • trunk/libf/dyn3d/exner_hyb.F

    r1 r127  
    5151      REAL SSUM
    5252c
     53      logical,save :: firstcall=.true.
     54      character(len=*),parameter :: modname="exner_hyb"
     55     
     56      ! Sanity check
     57      if (firstcall) then
     58        ! check that vertical discretization is compatible
     59        ! with this routine
     60        if (disvert_type.ne.1) then
     61          call abort_gcm(modname,
     62     &     "this routine should only be called if disvert_type==1",42)
     63        endif
     64       
     65        ! sanity checks for Shallow Water case (1 vertical layer)
     66        if (llm.eq.1) then
     67          if (kappa.ne.1) then
     68            call abort_gcm(modname,
     69     &      "kappa!=1 , but running in Shallow Water mode!!",42)
     70          endif
     71          if (cpp.ne.r) then
     72            call abort_gcm(modname,
     73     &      "cpp!=r , but running in Shallow Water mode!!",42)
     74          endif
     75        endif ! of if (llm.eq.1)
     76
     77        firstcall=.false.
     78      endif ! of if (firstcall)
    5379
    5480      if (llm.eq.1) then
    55         ! Specific behaviour for Shallow Water (1 vertical layer) case
    56      
    57         ! Sanity checks
    58         if (kappa.ne.1) then
    59           call abort_gcm("exner_hyb",
    60      &    "kappa!=1 , but running in Shallow Water mode!!",42)
    61         endif
    62         if (cpp.ne.r) then
    63         call abort_gcm("exner_hyb",
    64      &    "cpp!=r , but running in Shallow Water mode!!",42)
    65         endif
    6681       
    6782        ! Compute pks(:),pk(:),pkf(:)
     
    7792        ! our work is done, exit routine
    7893        return
     94
    7995      endif ! of if (llm.eq.1)
    8096
     97!!!! General case:
    8198     
    8299      unpl2k    = 1.+ 2.* kappa
  • trunk/libf/dyn3d/exner_milieu.F

    r124 r127  
    4848      REAL SSUM
    4949      EXTERNAL SSUM
     50      logical,save :: firstcall=.true.
     51      character(len=*),parameter :: modname="exner_milieu"
    5052
    51       if (llm.eq.1) then
    52         ! Specific behaviour for Shallow Water (1 vertical layer) case
    53      
    54         ! Sanity checks
    55         if (kappa.ne.1) then
    56           call abort_gcm("exner_hyb",
    57      &    "kappa!=1 , but running in Shallow Water mode!!",42)
    58         endif
    59         if (cpp.ne.r) then
    60         call abort_gcm("exner_hyb",
    61      &    "cpp!=r , but running in Shallow Water mode!!",42)
     53      ! Sanity check
     54      if (firstcall) then
     55        ! check that vertical discretization is compatible
     56        ! with this routine
     57        if (disvert_type.ne.2) then
     58          call abort_gcm(modname,
     59     &     "this routine should only be called if disvert_type==2",42)
    6260        endif
    6361       
     62        ! sanity checks for Shallow Water case (1 vertical layer)
     63        if (llm.eq.1) then
     64          if (kappa.ne.1) then
     65            call abort_gcm(modname,
     66     &      "kappa!=1 , but running in Shallow Water mode!!",42)
     67          endif
     68          if (cpp.ne.r) then
     69            call abort_gcm(modname,
     70     &      "cpp!=r , but running in Shallow Water mode!!",42)
     71          endif
     72        endif ! of if (llm.eq.1)
     73
     74        firstcall=.false.
     75      endif ! of if (firstcall)
     76
     77!!!! Specific behaviour for Shallow Water (1 vertical layer) case:
     78      if (llm.eq.1) then
     79     
    6480        ! Compute pks(:),pk(:),pkf(:)
    6581       
     
    7490        ! our work is done, exit routine
    7591        return
     92
    7693      endif ! of if (llm.eq.1)
    7794
    78      
     95!!!! General case:
     96
    7997c     -------------
    8098c     Calcul de pks
  • trunk/libf/dyn3d/guide_mod.F90

    r1 r127  
    644644! -----------------------------------------------------------------
    645645    CALL pression( ip1jmp1, ap, bp, psi, p )
    646     CALL exner_hyb(ip1jmp1,psi,p,alpha,beta,pks,pk,pkf)
    647 
     646    if (disvert_type==1) then
     647      CALL exner_hyb(ip1jmp1,psi,p,alpha,beta,pks,pk,pkf)
     648    else ! we assume that we are in the disvert_type==2 case
     649      CALL exner_milieu(ip1jmp1,psi,p,beta,pks,pk,pkf)
     650    endif
    648651!    ....  Calcul de pls , pression au milieu des couches ,en Pascals
    649652    unskap=1./kappa
  • trunk/libf/dyn3d/iniacademic.F90

    r124 r127  
    11!
    2 ! $Id: iniacademic.F90 1474 2011-01-14 11:04:45Z lguez $
     2! $Id: iniacademic.F90 1520 2011-05-23 11:37:09Z emillour $
    33!
    44SUBROUTINE iniacademic(vcov,ucov,teta,q,masse,ps,phis,time_0)
     
    7171
    7272  REAL alpha(ip1jmp1,llm),beta(ip1jmp1,llm),zdtvr
     73 
     74  character(len=*),parameter :: modname="iniacademic"
     75  character(len=80) :: abort_message
    7376
    7477  !-----------------------------------------------------------------------
     
    7679  ! --------------------------------------
    7780  !
    78  
    79   write(lunout,*) 'Iniacademic'
    80  
    8181  ! initialize planet radius, rotation rate,...
    8282  call conf_planete
     
    136136     teta0=315.     ! mean Teta (S.H. 315K)
    137137     CALL getin('teta0',teta0)
    138      write(lunout,*) 'Iniacademic - teta0 ',teta0
    139      write(lunout,*) 'Iniacademic - rad ',rad
    140138     ttp=200.       ! Tropopause temperature (S.H. 200K)
    141139     CALL getin('ttp',ttp)
     
    183181           tetajl(j,l)=teta0-delt_y*ddsin*ddsin+eps*ddsin &
    184182                -delt_z*(1.-ddsin*ddsin)*log(zsig)
    185            !! Aymeric -- tests particuliers
    186183           if (planet_type=="giant") then
    187184             tetajl(j,l)=teta0+(delt_y*                   &
     
    207204        enddo
    208205     enddo
    209 !     write(lunout,*) 'Iniacademic - check',tetajl(:,int(llm/2)),rlatu(:)
    210206
    211207     ! 3. Initialize fields (if necessary)
     
    217213
    218214        CALL pression ( ip1jmp1, ap, bp, ps, p       )
    219         if (planet_type=="earth") then
    220           CALL exner_hyb(ip1jmp1,ps,p,alpha,beta,pks,pk,pkf)
     215        if (disvert_type.eq.1) then
     216          CALL exner_hyb( ip1jmp1, ps, p,alpha,beta, pks, pk, pkf )
     217        elseif (disvert_type.eq.2) then
     218          call exner_milieu(ip1jmp1,ps,p,beta,pks,pk,pkf)
    221219        else
    222           call exner_milieu(ip1jmp1,ps,p,alpha,beta,pks,pk,pkf)
     220          write(abort_message,*) "Wrong value for disvert_type: ", &
     221                              disvert_type
     222          call abort_gcm(modname,abort_message,0)
    223223        endif
    224224        CALL massdair(p,masse)
  • trunk/libf/dyn3d/iniconst.F

    r109 r127  
    11!
    2 ! $Id: iniconst.F 1403 2010-07-01 09:02:53Z fairhead $
     2! $Id: iniconst.F 1520 2011-05-23 11:37:09Z emillour $
    33!
    44      SUBROUTINE iniconst
    55
    66      USE control_mod
     7#ifdef CPP_IOIPSL
     8      use IOIPSL
     9#else
     10! if not using IOIPSL, we still need to use (a local version of) getin
     11      use ioipsl_getincom
     12#endif
    713
    814      IMPLICIT NONE
     
    2228
    2329
     30      character(len=*),parameter :: modname="iniconst"
     31      character(len=80) :: abort_message
    2432c
    2533c
     
    4957      r       = cpp * kappa
    5058
    51       write(lunout,*)'iniconst: R  CP  Kappa ',  r , cpp,  kappa
     59      write(lunout,*) trim(modname),': R  CP  Kappa ',r,cpp,kappa
    5260c
    5361c-----------------------------------------------------------------------
    5462
    55       if (planet_type.eq."earth") then
    56        CALL disvert_terre(pa,preff,ap,bp,dpres,presnivs,nivsigs,nivsig)
     63! vertical discretization: default behavior depends on planet_type flag
     64      if (planet_type=="earth") then
     65        disvert_type=1
    5766      else
    58        CALL disvert_noterre
     67        disvert_type=2
    5968      endif
    60 c
    61        RETURN
    62        END
     69      ! but user can also specify using one or the other in run.def:
     70      call getin('disvert_type',disvert_type)
     71      write(lunout,*) trim(modname),': disvert_type=',disvert_type
     72     
     73      if (disvert_type==1) then
     74       ! standard case for Earth (automatic generation of levels)
     75       call disvert(pa,preff,ap,bp,dpres,presnivs,nivsigs,nivsig,
     76     &              scaleheight)
     77      else if (disvert_type==2) then
     78        ! standard case for planets (levels generated using z2sig.def file)
     79        call disvert_noterre
     80      else
     81        write(abort_message,*) "Wrong value for disvert_type: ",
     82     &                        disvert_type
     83        call abort_gcm(modname,abort_message,0)
     84      endif
     85
     86      END
  • trunk/libf/dyn3d/leapfrog.F

    r119 r127  
    178178
    179179      character*80 dynhist_file, dynhistave_file
    180       character(len=20) :: modname
     180      character(len=*),parameter :: modname="leapfrog"
    181181      character*80 abort_message
    182182
     
    206206      endif
    207207      itaufinp1 = itaufin +1
    208       modname="leapfrog"
    209208     
    210209c INITIALISATIONS
     
    238237      dq(:,:,:)=0.
    239238      CALL pression ( ip1jmp1, ap, bp, ps, p       )
    240       if (planet_type.eq."earth") then
     239      if (disvert_type==1) then
    241240        CALL exner_hyb( ip1jmp1, ps, p,alpha,beta, pks, pk, pkf )
    242       else
     241      else ! we assume that we are in the disvert_type==2 case
    243242        CALL exner_milieu( ip1jmp1, ps, p, beta, pks, pk, pkf )
    244243      endif
     
    409408
    410409         CALL pression (  ip1jmp1, ap, bp, ps,  p      )
    411          if (planet_type.eq."earth") then
    412            CALL exner_hyb( ip1jmp1, ps, p,alpha,beta, pks, pk, pkf )
    413          else
     410         if (disvert_type==1) then
     411           CALL exner_hyb(  ip1jmp1, ps, p,alpha,beta,pks, pk, pkf )
     412         else ! we assume that we are in the disvert_type==2 case
    414413           CALL exner_milieu( ip1jmp1, ps, p, beta, pks, pk, pkf )
    415414         endif
     
    531530
    532531        CALL pression ( ip1jmp1, ap, bp, ps, p                  )
    533         if (planet_type.eq."earth") then
     532        if (disvert_type==1) then
    534533          CALL exner_hyb( ip1jmp1, ps, p,alpha,beta, pks, pk, pkf )
    535         else
     534        else ! we assume that we are in the disvert_type==2 case
    536535          CALL exner_milieu( ip1jmp1, ps, p, beta, pks, pk, pkf )
    537536        endif
  • trunk/libf/dyn3d/logic.h

    r124 r127  
    11!
    2 ! $Id: logic.h 1319 2010-02-23 21:29:54Z fairhead $
     2! $Id: logic.h 1520 2011-05-23 11:37:09Z emillour $
    33!
    44!
     
    1111     &  statcl,conser,apdiss,apdelq,saison,ecripar,fxyhypb,ysinus       &
    1212     &  ,read_start,ok_guide,ok_strato,ok_gradsfile                     &
    13      &  ,ok_limit,ok_etat0,hybrid
     13     &  ,ok_limit,ok_etat0,grilles_gcm_netcdf,hybrid
    1414
    1515      COMMON/logici/ iflag_phys,iflag_trac
     
    1818     & apdiss,apdelq,saison,ecripar,fxyhypb,ysinus                      &
    1919     &  ,read_start,ok_guide,ok_strato,ok_gradsfile                     &
    20      &  ,ok_limit,ok_etat0
    21       logical hybrid ! vertcal coordinate is hybrid if true (sigma otherwise)
     20     &  ,ok_limit,ok_etat0,grilles_gcm_netcdf
     21      logical hybrid ! vertical coordinate is hybrid if true (sigma otherwise)
     22                     ! (only used if disvert_type==2)
    2223
    23       INTEGER iflag_phys,iflag_trac
     24      integer iflag_phys,iflag_trac
    2425!-----------------------------------------------------------------------
  • trunk/libf/dyn3dpar/comvert.h

    r124 r127  
    11!
    2 ! $Id: comvert.h 1279 2009-12-10 09:02:56Z fairhead $
     2! $Id: comvert.h 1520 2011-05-23 11:37:09Z emillour $
    33!
    44!-----------------------------------------------------------------------
    55!   INCLUDE 'comvert.h'
    66
    7       COMMON/comvert/ap(llm+1),bp(llm+1),presnivs(llm),dpres(llm),      &
     7      COMMON/comvertr/ap(llm+1),bp(llm+1),presnivs(llm),dpres(llm),     &
    88     &               pa,preff,nivsigs(llm),nivsig(llm+1),               &
    99     &               aps(llm),bps(llm),scaleheight
    1010
    11       REAL ap,bp,presnivs,dpres,pa,preff,nivsigs,nivsig,aps,bps
     11      common/comverti/disvert_type
     12
     13      real ap     ! hybrid pressure contribution at interlayers
     14      real bp     ! hybrid sigma contribution at interlayer
     15      real presnivs ! (reference) pressure at mid-layers
     16      real dpres
     17      real pa     ! reference pressure (Pa) at which hybrid coordinates
     18                  ! become purely pressure
     19      real preff  ! reference surface pressure (Pa)
     20      real nivsigs
     21      real nivsig
     22      real aps    ! hybrid pressure contribution at mid-layers
     23      real bps    ! hybrid sigma contribution at mid-layers
    1224      real scaleheight ! atmospheric (reference) scale height (km)
    1325
     26      integer disvert_type ! type of vertical discretization:
     27                           ! 1: Earth (default for planet_type==earth),
     28                           !     automatic generation
     29                           ! 2: Planets (default for planet_type!=earth),
     30                           !     using 'z2sig.def' (or 'esasig.def) file
     31
    1432 !-----------------------------------------------------------------------
  • trunk/libf/dyn3dpar/disvert.F90

    r126 r127  
    1 ! $Id: disvert.F90 1480 2011-01-31 21:29:58Z jghattas $
     1! $Id: disvert.F90 1520 2011-05-23 11:37:09Z emillour $
    22
    3 SUBROUTINE disvert_terre(pa, preff, ap, bp, dpres, presnivs, nivsigs, nivsig)
     3SUBROUTINE disvert(pa,preff,ap,bp,dpres,presnivs,nivsigs,nivsig,scaleheight)
    44
    55  ! Auteur : P. Le Van
     
    1717  ! ds(l) : distance entre les couches l et l-1 en coord.s
    1818
    19   REAL pa, preff
    20   REAL ap(llmp1), bp(llmp1), dpres(llm), nivsigs(llm), nivsig(llmp1)
    21   REAL presnivs(llm)
     19  real,intent(in) :: pa, preff
     20  real,intent(out) :: ap(llmp1), bp(llmp1)
     21  real,intent(out) :: dpres(llm), nivsigs(llm), nivsig(llmp1)
     22  real,intent(out) :: presnivs(llm)
     23  real,intent(out) :: scaleheight
    2224
    2325  REAL sig(llm+1), dsig(llm)
     
    2628  INTEGER l
    2729  REAL dsigmin
    28   REAL alpha, beta, deltaz, h
     30  REAL alpha, beta, deltaz,scaleheight
    2931  INTEGER iostat
    30   REAL pi, x
     32  REAL x
     33  character(len=*),parameter :: modname="disvert"
    3134
    3235  !-----------------------------------------------------------------------
    3336
    34   pi = 2 * ASIN(1.)
     37  ! default scaleheight is 8km for earth
     38  scaleheight=8.
    3539
    3640  OPEN(99, file='sigma.def', status='old', form='formatted', iostat=iostat)
     
    3842  IF (iostat == 0) THEN
    3943     ! cas 1 on lit les options dans sigma.def:
    40      READ(99, *) h ! hauteur d'echelle 8.
     44     READ(99, *) scaleheight ! hauteur d'echelle 8.
    4145     READ(99, *) deltaz ! epaiseur de la premiere couche 0.04
    4246     READ(99, *) beta ! facteur d'acroissement en haut 1.3
     
    4448     READ(99, *) k1 ! nombre de couches dans la transition haute
    4549     CLOSE(99)
    46      alpha=deltaz/(llm*h)
    47      write(lunout, *)'disvert: h, alpha, k0, k1, beta'
     50     alpha=deltaz/(llm*scaleheight)
     51     write(lunout, *)trim(modname),':scaleheight, alpha, k0, k1, beta', &
     52                               scaleheight, alpha, k0, k1, beta
    4853
    4954     alpha=deltaz/tanh(1./k0)*2.
     
    5156     sig(1)=1.
    5257     do l=1, llm
    53         sig(l+1)=(cosh(l/k0))**(-alpha*k0/h) &
    54              *exp(-alpha/h*tanh((llm-k1)/k0)*beta**(l-(llm-k1))/log(beta))
    55         zk=-h*log(sig(l+1))
     58        sig(l+1)=(cosh(l/k0))**(-alpha*k0/scaleheight) &
     59             *exp(-alpha/scaleheight*tanh((llm-k1)/k0) &
     60                  *beta**(l-(llm-k1))/log(beta))
     61        zk=-scaleheight*log(sig(l+1))
    5662
    5763        dzk1=alpha*tanh(l/k0)
     
    7379           dsigmin=1.
    7480        else
    75            WRITE(LUNOUT,*)'disvert: ATTENTION discretisation z a ajuster'
     81           write(lunout,*) trim(modname), &
     82           ' ATTENTION discretisation z a ajuster'
    7683           dsigmin=1.
    7784        endif
    78         WRITE(LUNOUT,*) 'disvert: Discretisation verticale DSIGMIN=',dsigmin
     85        write(lunout,*) trim(modname), &
     86        ' Discretisation verticale DSIGMIN=',dsigmin
    7987     endif
    8088
     
    119127  ap(llmp1) = pa * ( sig(llmp1) - bp(llmp1) )
    120128
    121   write(lunout, *)'disvert: BP '
     129  write(lunout, *)  trim(modname),': BP '
    122130  write(lunout, *) bp
    123   write(lunout, *)'disvert: AP '
     131  write(lunout, *)  trim(modname),': AP '
    124132  write(lunout, *) ap
    125133
    126134  write(lunout, *) 'Niveaux de pressions approximatifs aux centres des'
    127135  write(lunout, *)'couches calcules pour une pression de surface =', preff
    128   write(lunout, *) 'et altitudes equivalentes pour une hauteur d echelle de'
    129   write(lunout, *)'8km'
     136  write(lunout, *) 'et altitudes equivalentes pour une hauteur d echelle de '
     137  write(lunout, *) scaleheight,' km'
    130138  DO l = 1, llm
    131139     dpres(l) = bp(l) - bp(l+1)
    132140     presnivs(l) = 0.5 *( ap(l)+bp(l)*preff + ap(l+1)+bp(l+1)*preff )
    133141     write(lunout, *)'PRESNIVS(', l, ')=', presnivs(l), ' Z ~ ', &
    134           log(preff/presnivs(l))*8. &
    135           , ' DZ ~ ', 8.*log((ap(l)+bp(l)*preff)/ &
     142          log(preff/presnivs(l))*scaleheight &
     143          , ' DZ ~ ', scaleheight*log((ap(l)+bp(l)*preff)/ &
    136144          max(ap(l+1)+bp(l+1)*preff, 1.e-10))
    137145  ENDDO
    138146
    139   write(lunout, *) 'disvert: PRESNIVS '
     147  write(lunout, *) trim(modname),': PRESNIVS '
    140148  write(lunout, *) presnivs
    141149
    142 END SUBROUTINE disvert_terre
     150END SUBROUTINE disvert
  • trunk/libf/dyn3dpar/etat0_netcdf.F90

    r66 r127  
    11!
    2 ! $Id: etat0_netcdf.F90 1486 2011-02-11 12:07:39Z fairhead $
     2! $Id: etat0_netcdf.F90 1520 2011-05-23 11:37:09Z emillour $
    33!
    44!-------------------------------------------------------------------------------
    55!
    6 SUBROUTINE etat0_netcdf(ib, masque, letat0)
     6SUBROUTINE etat0_netcdf(ib, masque, phis, letat0)
    77!
    88!-------------------------------------------------------------------------------
     
    3737  LOGICAL,                    INTENT(IN)    :: ib     ! barycentric interpolat.
    3838  REAL, DIMENSION(iip1,jjp1), INTENT(INOUT) :: masque ! land mask
     39  REAL, DIMENSION(iip1,jjp1), INTENT(OUT)   :: phis   ! geopotentiel au sol
    3940  LOGICAL,                    INTENT(IN)    :: letat0 ! F: masque only required
    4041#ifndef CPP_EARTH
     
    5152  REAL,    DIMENSION(klon)                 :: tsol, qsol
    5253  REAL,    DIMENSION(klon)                 :: sn, rugmer, run_off_lic_0
    53   REAL,    DIMENSION(iip1,jjp1)            :: orog, rugo, psol, phis
     54  REAL,    DIMENSION(iip1,jjp1)            :: orog, rugo, psol
    5455  REAL,    DIMENSION(iip1,jjp1,llm+1)      :: p3d
    5556  REAL,    DIMENSION(iip1,jjp1,llm)        :: uvent, t3d, tpot, qsat, qd
     
    138139                   flag_aerosol, new_aod,                               &
    139140                   bl95_b0, bl95_b1,                                    &
    140                    iflag_thermals,nsplit_thermals,tau_thermals,         &
    141                    iflag_thermals_ed,iflag_thermals_optflux,            &
    142                    iflag_coupl,iflag_clos,iflag_wake, read_climoz,      &
     141                   read_climoz,                                         &
    143142                   alp_offset)
    144143
     
    252251!*******************************************************************************
    253252  CALL pression(ip1jmp1, ap, bp, psol, p3d)
    254   CALL exner_hyb(ip1jmp1, psol, p3d, alpha, beta, pks, pk, y)
     253  if (disvert_type.eq.1) then
     254    CALL exner_hyb(ip1jmp1, psol, p3d, alpha, beta, pks, pk, y)
     255  else ! we assume that we are in the disvert_type==2 case
     256    CALL exner_milieu(ip1jmp1,psol,p3d,beta,pks,pk,y)
     257  endif
    255258  pls(:,:,:)=preff*(pk(:,:,:)/cpp)**(1./kappa)
    256259!  WRITE(lunout,*) 'P3D :', p3d(10,20,:)
  • trunk/libf/dyn3dpar/exner_hyb.F

    r1 r127  
    5151      REAL SSUM
    5252c
     53      logical,save :: firstcall=.true.
     54      character(len=*),parameter :: modname="exner_hyb"
     55     
     56      ! Sanity check
     57      if (firstcall) then
     58        ! check that vertical discretization is compatible
     59        ! with this routine
     60        if (disvert_type.ne.1) then
     61          call abort_gcm(modname,
     62     &     "this routine should only be called if disvert_type==1",42)
     63        endif
     64       
     65        ! sanity checks for Shallow Water case (1 vertical layer)
     66        if (llm.eq.1) then
     67          if (kappa.ne.1) then
     68            call abort_gcm(modname,
     69     &      "kappa!=1 , but running in Shallow Water mode!!",42)
     70          endif
     71          if (cpp.ne.r) then
     72            call abort_gcm(modname,
     73     &      "cpp!=r , but running in Shallow Water mode!!",42)
     74          endif
     75        endif ! of if (llm.eq.1)
     76
     77        firstcall=.false.
     78      endif ! of if (firstcall)
    5379
    5480      if (llm.eq.1) then
    55         ! Specific behaviour for Shallow Water (1 vertical layer) case
    56      
    57         ! Sanity checks
    58         if (kappa.ne.1) then
    59           call abort_gcm("exner_hyb",
    60      &    "kappa!=1 , but running in Shallow Water mode!!",42)
    61         endif
    62         if (cpp.ne.r) then
    63         call abort_gcm("exner_hyb",
    64      &    "cpp!=r , but running in Shallow Water mode!!",42)
    65         endif
    6681       
    6782        ! Compute pks(:),pk(:),pkf(:)
     
    7792        ! our work is done, exit routine
    7893        return
     94
    7995      endif ! of if (llm.eq.1)
    8096
     97!!!! General case:
    8198     
    8299      unpl2k    = 1.+ 2.* kappa
  • trunk/libf/dyn3dpar/exner_hyb_p.F

    r1 r127  
    5353      EXTERNAL SSUM
    5454      INTEGER ije,ijb,jje,jjb
    55 c
    56 c$OMP BARRIER
    57 
    58       if (llm.eq.1) then
    59         ! Specific behaviour for Shallow Water (1 vertical layer) case
    60      
    61         ! Sanity checks
    62         if (kappa.ne.1) then
    63           call abort_gcm("exner_hyb",
    64      &    "kappa!=1 , but running in Shallow Water mode!!",42)
    65         endif
    66         if (cpp.ne.r) then
    67         call abort_gcm("exner_hyb",
    68      &    "cpp!=r , but running in Shallow Water mode!!",42)
     55      logical,save :: firstcall=.true.
     56!$OMP THREADPRIVATE(firstcall)
     57      character(len=*),parameter :: modname="exner_hyb_p"
     58c
     59
     60      ! Sanity check
     61      if (firstcall) then
     62        ! check that vertical discretization is compatible
     63        ! with this routine
     64        if (disvert_type.ne.1) then
     65          call abort_gcm(modname,
     66     &     "this routine should only be called if disvert_type==1",42)
    6967        endif
    7068       
     69        ! sanity checks for Shallow Water case (1 vertical layer)
     70        if (llm.eq.1) then
     71          if (kappa.ne.1) then
     72            call abort_gcm(modname,
     73     &      "kappa!=1 , but running in Shallow Water mode!!",42)
     74          endif
     75          if (cpp.ne.r) then
     76            call abort_gcm(modname,
     77     &      "cpp!=r , but running in Shallow Water mode!!",42)
     78          endif
     79        endif ! of if (llm.eq.1)
     80
     81        firstcall=.false.
     82      endif ! of if (firstcall)
     83
     84c$OMP BARRIER
     85
     86! Specific behaviour for Shallow Water (1 vertical layer) case
     87      if (llm.eq.1) then
     88     
    7189        ! Compute pks(:),pk(:),pkf(:)
    7290        ijb=ij_begin
     
    116134      endif ! of if (llm.eq.1)
    117135
     136!!!! General case:
    118137
    119138      unpl2k    = 1.+ 2.* kappa
  • trunk/libf/dyn3dpar/exner_milieu.F

    r124 r127  
    4848      REAL SSUM
    4949      EXTERNAL SSUM
     50      logical,save :: firstcall=.true.
     51      character(len=*),parameter :: modname="exner_milieu"
    5052
    51       if (llm.eq.1) then
    52         ! Specific behaviour for Shallow Water (1 vertical layer) case
    53      
    54         ! Sanity checks
    55         if (kappa.ne.1) then
    56           call abort_gcm("exner_hyb",
    57      &    "kappa!=1 , but running in Shallow Water mode!!",42)
    58         endif
    59         if (cpp.ne.r) then
    60         call abort_gcm("exner_hyb",
    61      &    "cpp!=r , but running in Shallow Water mode!!",42)
     53      ! Sanity check
     54      if (firstcall) then
     55        ! check that vertical discretization is compatible
     56        ! with this routine
     57        if (disvert_type.ne.2) then
     58          call abort_gcm(modname,
     59     &     "this routine should only be called if disvert_type==2",42)
    6260        endif
    6361       
     62        ! sanity checks for Shallow Water case (1 vertical layer)
     63        if (llm.eq.1) then
     64          if (kappa.ne.1) then
     65            call abort_gcm(modname,
     66     &      "kappa!=1 , but running in Shallow Water mode!!",42)
     67          endif
     68          if (cpp.ne.r) then
     69            call abort_gcm(modname,
     70     &      "cpp!=r , but running in Shallow Water mode!!",42)
     71          endif
     72        endif ! of if (llm.eq.1)
     73
     74        firstcall=.false.
     75      endif ! of if (firstcall)
     76
     77!!!! Specific behaviour for Shallow Water (1 vertical layer) case:
     78      if (llm.eq.1) then
     79     
    6480        ! Compute pks(:),pk(:),pkf(:)
    6581       
     
    7490        ! our work is done, exit routine
    7591        return
     92
    7693      endif ! of if (llm.eq.1)
    7794
    78      
     95!!!! General case:
     96
    7997c     -------------
    8098c     Calcul de pks
  • trunk/libf/dyn3dpar/exner_milieu_p.F

    r124 r127  
    5050      EXTERNAL SSUM
    5151      INTEGER ije,ijb,jje,jjb
    52      
    53 c$OMP BARRIER
    54 
    55       if (llm.eq.1) then
    56         ! Specific behaviour for Shallow Water (1 vertical layer) case
    57      
    58         ! Sanity checks
    59         if (kappa.ne.1) then
    60           call abort_gcm("exner_hyb",
    61      &    "kappa!=1 , but running in Shallow Water mode!!",42)
    62         endif
    63         if (cpp.ne.r) then
    64         call abort_gcm("exner_hyb",
    65      &    "cpp!=r , but running in Shallow Water mode!!",42)
     52      logical,save :: firstcall=.true.
     53!$OMP THREADPRIVATE(firstcall)
     54      character(len=*),parameter :: modname="exner_milieu_p"
     55
     56      ! Sanity check
     57      if (firstcall) then
     58        ! check that vertical discretization is compatible
     59        ! with this routine
     60        if (disvert_type.ne.2) then
     61          call abort_gcm(modname,
     62     &     "this routine should only be called if disvert_type==2",42)
    6663        endif
    6764       
     65        ! sanity checks for Shallow Water case (1 vertical layer)
     66        if (llm.eq.1) then
     67          if (kappa.ne.1) then
     68            call abort_gcm(modname,
     69     &      "kappa!=1 , but running in Shallow Water mode!!",42)
     70          endif
     71          if (cpp.ne.r) then
     72            call abort_gcm(modname,
     73     &      "cpp!=r , but running in Shallow Water mode!!",42)
     74          endif
     75        endif ! of if (llm.eq.1)
     76
     77        firstcall=.false.
     78      endif ! of if (firstcall)
     79     
     80c$OMP BARRIER
     81
     82! Specific behaviour for Shallow Water (1 vertical layer) case
     83      if (llm.eq.1) then
     84             
    6885        ! Compute pks(:),pk(:),pkf(:)
    6986        ijb=ij_begin
     
    113130      endif ! of if (llm.eq.1)
    114131
     132!!!! General case:
     133
    115134c     -------------
    116135c     Calcul de pks
  • trunk/libf/dyn3dpar/guide_p_mod.F90

    r1 r127  
    1919! ---------------------------------------------
    2020  INTEGER, PRIVATE, SAVE  :: iguide_read,iguide_int,iguide_sav
    21   INTEGER, PRIVATE, SAVE  :: nlevnc
     21  INTEGER, PRIVATE, SAVE  :: nlevnc, guide_plevs
    2222  LOGICAL, PRIVATE, SAVE  :: guide_u,guide_v,guide_T,guide_Q,guide_P
    2323  LOGICAL, PRIVATE, SAVE  :: guide_hr,guide_teta 
    2424  LOGICAL, PRIVATE, SAVE  :: guide_BL,guide_reg,guide_add,gamma4,guide_zon
    25   LOGICAL, PRIVATE, SAVE  :: guide_modele,invert_p,invert_y,ini_anal
    26   LOGICAL, PRIVATE, SAVE  :: guide_2D,guide_sav
     25  LOGICAL, PRIVATE, SAVE  :: invert_p,invert_y,ini_anal
     26  LOGICAL, PRIVATE, SAVE  :: guide_2D,guide_sav,guide_modele
    2727 
    2828  REAL, PRIVATE, SAVE     :: tau_min_u,tau_max_u
     
    4848  REAL, ALLOCATABLE, DIMENSION(:,:,:), PRIVATE, SAVE   :: tnat1,tnat2
    4949  REAL, ALLOCATABLE, DIMENSION(:,:,:), PRIVATE, SAVE   :: qnat1,qnat2
     50  REAL, ALLOCATABLE, DIMENSION(:,:,:), PRIVATE, SAVE   :: pnat1,pnat2
    5051  REAL, ALLOCATABLE, DIMENSION(:,:),   PRIVATE, SAVE   :: psnat1,psnat2
    5152  REAL, ALLOCATABLE, DIMENSION(:),     PRIVATE, SAVE   :: apnc,bpnc
     
    6566
    6667  SUBROUTINE guide_init
    67 
     68   
    6869    USE control_mod
    6970    IMPLICIT NONE
     
    127128! Parametres pour lecture des fichiers
    128129    CALL getpar('iguide_read',4,iguide_read,'freq. lecture guidage')
    129     CALL getpar('iguide_int',4,iguide_int,'freq. lecture guidage')
    130     IF (iguide_int.GT.0) THEN
     130    CALL getpar('iguide_int',4,iguide_int,'freq. interpolation vert')
     131    IF (iguide_int.EQ.0) THEN
     132        iguide_int=1
     133    ELSEIF (iguide_int.GT.0) THEN
    131134        iguide_int=day_step/iguide_int
    132135    ELSE
    133136        iguide_int=day_step*iguide_int
    134137    ENDIF
    135     CALL getpar('guide_modele',.false.,guide_modele,'guidage niveaux modele')
     138    CALL getpar('guide_plevs',0,guide_plevs,'niveaux pression fichiers guidage')
     139    ! Pour compatibilite avec ancienne version avec guide_modele
     140    CALL getpar('guide_modele',.false.,guide_modele,'niveaux pression ap+bp*psol')
     141    IF (guide_modele) THEN
     142        guide_plevs=1
     143    ENDIF
     144    ! Fin raccord
    136145    CALL getpar('ini_anal',.false.,ini_anal,'Etat initial = analyse')
    137146    CALL getpar('guide_invertp',.true.,invert_p,'niveaux p inverses')
     
    144153! ---------------------------------------------
    145154    ncidpl=-99
    146     if (guide_modele) then
     155    if (guide_plevs.EQ.1) then
    147156       if (ncidpl.eq.-99) rcod=nf90_open('apbp.nc',Nf90_NOWRITe, ncidpl)
    148     else
    149          if (guide_u) then
    150            if (ncidpl.eq.-99) rcod=nf90_open('u.nc',Nf90_NOWRITe,ncidpl)
    151          elseif (guide_v) then
    152            if (ncidpl.eq.-99) rcod=nf90_open('v.nc',nf90_nowrite,ncidpl)
    153          elseif (guide_T) then
    154            if (ncidpl.eq.-99) rcod=nf90_open('T.nc',nf90_nowrite,ncidpl)
    155          elseif (guide_Q) then
    156            if (ncidpl.eq.-99) rcod=nf90_open('hur.nc',nf90_nowrite, ncidpl)
    157          endif
     157    elseif (guide_plevs.EQ.2) then
     158       if (ncidpl.EQ.-99) rcod=nf90_open('P.nc',Nf90_NOWRITe,ncidpl)
     159    elseif (guide_u) then
     160       if (ncidpl.eq.-99) rcod=nf90_open('u.nc',Nf90_NOWRITe,ncidpl)
     161    elseif (guide_v) then
     162       if (ncidpl.eq.-99) rcod=nf90_open('v.nc',nf90_nowrite,ncidpl)
     163    elseif (guide_T) then
     164       if (ncidpl.eq.-99) rcod=nf90_open('T.nc',nf90_nowrite,ncidpl)
     165    elseif (guide_Q) then
     166       if (ncidpl.eq.-99) rcod=nf90_open('hur.nc',nf90_nowrite, ncidpl)
    158167    endif
    159168    error=NF_INQ_DIMID(ncidpl,'LEVEL',rid)
     
    240249    ENDIF
    241250
    242     IF (guide_P.OR.guide_modele) THEN
     251    IF (guide_plevs.EQ.2) THEN
     252        ALLOCATE(pnat1(iip1,jjp1,nlevnc), stat = error)
     253        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
     254        ALLOCATE(pnat2(iip1,jjp1,nlevnc), stat = error)
     255        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
     256        pnat1=0.;pnat2=0.;
     257    ENDIF
     258
     259    IF (guide_P.OR.guide_plevs.EQ.1) THEN
    243260        ALLOCATE(psnat1(iip1,jjp1), stat = error)
    244261        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
     
    267284    IF (guide_T) tnat1=tnat2
    268285    IF (guide_Q) qnat1=qnat2
    269     IF (guide_P.OR.guide_modele) psnat1=psnat2
     286    IF (guide_plevs.EQ.2) pnat1=pnat2
     287    IF (guide_P.OR.guide_plevs.EQ.1) psnat1=psnat2
    270288
    271289  END SUBROUTINE guide_init
     
    293311    LOGICAL       :: f_out ! sortie guidage
    294312    REAL, DIMENSION (ip1jmp1,llm) :: f_add ! var aux: champ de guidage
    295     REAL, DIMENSION (ip1jmp1,llm) :: p ! besoin si guide_P
     313    ! Variables pour fonction Exner (P milieu couche)
     314    REAL, DIMENSION (iip1,jjp1,llm)    :: pk, pkf
     315    REAL, DIMENSION (iip1,jjp1,llm)    :: alpha, beta
     316    REAL, DIMENSION (iip1,jjp1)        :: pks   
     317    REAL                               :: unskap
     318    REAL, DIMENSION (ip1jmp1,llmp1)    :: p ! besoin si guide_P
    296319    ! Compteurs temps:
    297320    INTEGER, SAVE :: step_rea,count_no_rea,itau_test ! lecture guidage
     
    300323    REAL, SAVE    :: factt ! pas de temps en fraction de jour
    301324   
    302     INTEGER       :: l
     325    INTEGER       :: i,j,l
    303326   
    304327    ijb_u=ij_begin ; ije_u=ij_end ; ijn_u=ije_u-ijb_u+1 
     
    313336    ENDIF
    314337     
    315    
    316    
    317338     PRINT *,'---> on rentre dans guide_main'
    318339!    CALL AllGather_Field(ucov,ip1jmp1,llm)
     
    380401      dday_step=real(day_step)
    381402      IF (iguide_read.LT.0) THEN
    382           tau=ditau/dday_step/ REAL(iguide_read)
     403          tau=ditau/dday_step/REAL(iguide_read)
    383404      ELSE
    384           tau= REAL(iguide_read)*ditau/dday_step
     405          tau=REAL(iguide_read)*ditau/dday_step
    385406      ENDIF
    386407      reste=tau-AINT(tau)
     
    394415              IF (guide_T) tnat1(:,jjb_u:jje_u,:)=tnat2(:,jjb_u:jje_u,:)
    395416              IF (guide_Q) qnat1(:,jjb_u:jje_u,:)=qnat2(:,jjb_u:jje_u,:)
    396               IF (guide_P.OR.guide_modele) psnat1(:,jjb_u:jje_u)=psnat2(:,jjb_u:jje_u)
     417              IF (guide_plevs.EQ.2) pnat1(:,jjb_u:jje_u,:)=pnat2(:,jjb_u:jje_u,:)
     418              IF (guide_P.OR.guide_plevs.EQ.1) psnat1(:,jjb_u:jje_u)=psnat2(:,jjb_u:jje_u)
    397419              step_rea=step_rea+1
    398420              itau_test=itau
     
    430452! Sauvegarde du guidage?
    431453    f_out=((MOD(itau,iguide_sav).EQ.0).AND.guide_sav) 
    432     IF (f_out) CALL guide_out("S",jjp1,1,ps)
     454    IF (f_out) THEN
     455!       Calcul niveaux pression milieu de couches
     456        CALL pression_p( ip1jmp1, ap, bp, ps, p )
     457        if (disvert_type==1) then
     458          CALL exner_hyb_p(ip1jmp1,ps,p,alpha,beta,pks,pk,pkf)
     459        else
     460          CALL exner_milieu_p(ip1jmp1,ps,p,beta,pks,pk,pkf)
     461        endif
     462        unskap=1./kappa
     463        DO l = 1, llm
     464            DO j=jjb_u,jje_u
     465                DO i =1, iip1
     466                    p(i+(j-1)*iip1,l) = preff * ( pk(i,j,l)/cpp) ** unskap
     467                ENDDO
     468            ENDDO
     469        ENDDO
     470        CALL guide_out("P",jjp1,llm,p(1:ip1jmp1,1:llm),1.)
     471    ENDIF
    433472   
    434473    if (guide_u) then
     
    441480        if (guide_zon) CALL guide_zonave(1,jjp1,llm,f_add)
    442481        CALL guide_addfield(ip1jmp1,llm,f_add,alpha_u)
    443         IF (f_out) CALL guide_out("U",jjp1,llm,f_add/factt)
     482        IF (f_out) CALL guide_out("U",jjp1,llm,f_add(:,:),factt)
    444483        ucov(ijb_u:ije_u,:)=ucov(ijb_u:ije_u,:)+f_add(ijb_u:ije_u,:)
    445484    endif
     
    453492        if (guide_zon) CALL guide_zonave(2,jjp1,llm,f_add)
    454493        CALL guide_addfield(ip1jmp1,llm,f_add,alpha_T)
    455         IF (f_out) CALL guide_out("T",jjp1,llm,f_add/factt)
     494        IF (f_out) CALL guide_out("T",jjp1,llm,f_add(:,:),factt)
    456495        teta(ijb_u:ije_u,:)=teta(ijb_u:ije_u,:)+f_add(ijb_u:ije_u,:)
    457496    endif
     
    465504        if (guide_zon) CALL guide_zonave(2,jjp1,1,f_add(1:ip1jmp1,1))
    466505        CALL guide_addfield(ip1jmp1,1,f_add(1:ip1jmp1,1),alpha_P)
    467         IF (f_out) CALL guide_out("P",jjp1,1,f_add(1:ip1jmp1,1)/factt)
     506        IF (f_out) CALL guide_out("SP",jjp1,1,f_add(1:ip1jmp1,1),factt)
    468507        ps(ijb_u:ije_u)=ps(ijb_u:ije_u)+f_add(ijb_u:ije_u,1)
    469508        CALL pression_p(ip1jmp1,ap,bp,ps,p)
     
    479518        if (guide_zon) CALL guide_zonave(2,jjp1,llm,f_add)
    480519        CALL guide_addfield(ip1jmp1,llm,f_add,alpha_Q)
    481         IF (f_out) CALL guide_out("Q",jjp1,llm,f_add/factt)
     520        IF (f_out) CALL guide_out("Q",jjp1,llm,f_add(:,:),factt)
    482521        q(ijb_u:ije_u,:)=q(ijb_u:ije_u,:)+f_add(ijb_u:ije_u,:)
    483522    endif
     
    492531        if (guide_zon) CALL guide_zonave(2,jjm,llm,f_add(1:ip1jm,:))
    493532        CALL guide_addfield(ip1jm,llm,f_add(1:ip1jm,:),alpha_v)
    494         IF (f_out) CALL guide_out("V",jjm,llm,f_add(1:ip1jm,:)/factt)
     533        IF (f_out) CALL guide_out("V",jjm,llm,f_add(1:ip1jm,:),factt)
    495534        vcov(ijb_v:ije_v,:)=vcov(ijb_v:ije_v,:)+f_add(ijb_v:ije_v,:)
    496535    endif
     
    580619              ENDDO
    581620          ENDDO
    582           fieldm(:,l)=fieldm(:,l)/ REAL(imax(typ)-imin(typ)+1)
     621          fieldm(:,l)=fieldm(:,l)/REAL(imax(typ)-imin(typ)+1)
    583622    ! Compute forcing
    584623          DO j=jjb_v,jje_v
     
    598637              ENDDO
    599638          ENDDO
    600           fieldm(:,l)=fieldm(:,l)/ REAL(imax(typ)-imin(typ)+1)
     639          fieldm(:,l)=fieldm(:,l)/REAL(imax(typ)-imin(typ)+1)
    601640    ! Compute forcing
    602641          DO j=jjb_u,jje_u
     
    640679  REAL, DIMENSION (iip1,jjp1,llm)    :: alpha, beta
    641680  REAL, DIMENSION (iip1,jjp1)        :: pks   
    642   REAL                               :: prefkap,unskap
     681  REAL                               :: unskap
    643682  ! Pression de vapeur saturante
    644683  REAL, DIMENSION (ip1jmp1,llm)      :: qsat
     
    652691    print *,'Guide: conversion variables guidage'
    653692! -----------------------------------------------------------------
    654 ! Calcul des niveaux de pression champs guidage
     693! Calcul des niveaux de pression champs guidage (pour T et Q)
    655694! -----------------------------------------------------------------
    656 if (guide_modele) then
    657     do i=1,iip1
    658         do j=jjb_u,jje_u
    659             do l=1,nlevnc
    660                 plnc2(i,j,l)=apnc(l)+bpnc(l)*psnat2(i,j)
    661                 plnc1(i,j,l)=apnc(l)+bpnc(l)*psnat1(i,j)
    662             enddo
    663         enddo
    664     enddo
    665 else
    666     do i=1,iip1
    667         do j=jjb_u,jje_u
    668             do l=1,nlevnc
    669                 plnc2(i,j,l)=apnc(l)
    670                 plnc1(i,j,l)=apnc(l)
    671            enddo
    672         enddo
    673     enddo
    674 
    675 endif
     695    IF (guide_plevs.EQ.0) THEN
     696        DO l=1,nlevnc
     697            DO j=jjb_u,jje_u
     698                DO i=1,iip1
     699                    plnc2(i,j,l)=apnc(l)
     700                    plnc1(i,j,l)=apnc(l)
     701               ENDDO
     702            ENDDO
     703        ENDDO
     704    ENDIF   
     705
    676706    if (first) then
    677707        first=.FALSE.
     
    683713        enddo
    684714        print*,'Fichiers guidage'
    685         do l=1,nlevnc
    686              print*,'PL(',l,')=',plnc2(1,jjb_u,l)
    687         enddo
     715        SELECT CASE (guide_plevs)
     716        CASE (0)
     717            do l=1,nlevnc
     718                 print*,'PL(',l,')=',plnc2(1,jjb_u,l)
     719            enddo
     720        CASE (1)
     721            DO l=1,nlevnc
     722                 print*,'PL(',l,')=',apnc(l)+bpnc(l)*psnat2(i,jjb_u)
     723             ENDDO
     724        CASE (2)
     725            do l=1,nlevnc
     726                 print*,'PL(',l,')=',pnat2(1,jjb_u,l)
     727            enddo
     728        END SELECT
    688729        print *,'inversion de l''ordre: invert_p=',invert_p
    689730        if (guide_u) then
     
    702743! Calcul niveaux pression modele
    703744! -----------------------------------------------------------------
    704     CALL pression_p( ip1jmp1, ap, bp, psi, p )
    705     CALL exner_hyb_p(ip1jmp1,psi,p,alpha,beta,pks,pk,pkf)
    706745
    707746!    ....  Calcul de pls , pression au milieu des couches ,en Pascals
    708     unskap=1./kappa
    709     prefkap =  preff  ** kappa
    710     DO l = 1, llm
    711         DO j=jjb_u,jje_u
    712             DO i =1, iip1
    713                 pls(i,j,l) = preff * ( pk(i,j,l)/cpp) ** unskap
    714             ENDDO
     747    IF (guide_plevs.EQ.1) THEN
     748        DO l=1,llm
     749            DO j=jjb_u,jje_u
     750                DO i =1, iip1
     751                    pls(i,j,l)=(ap(l)+ap(l+1))/2.+psi(i,j)*(bp(l)+bp(l+1))/2.
     752                ENDDO
     753            ENDDO
    715754        ENDDO
    716     ENDDO
     755    ELSE
     756        CALL pression_p( ip1jmp1, ap, bp, psi, p )
     757        if (disvert_type==1) then
     758          CALL exner_hyb_p(ip1jmp1,psi,p,alpha,beta,pks,pk,pkf)
     759        else ! we assume that we are in the disvert_type==2 case
     760          CALL exner_milieu_p(ip1jmp1,psi,p,beta,pks,pk,pkf)
     761        endif
     762        unskap=1./kappa
     763        DO l = 1, llm
     764            DO j=jjb_u,jje_u
     765                DO i =1, iip1
     766                    pls(i,j,l) = preff * ( pk(i,j,l)/cpp) ** unskap
     767                ENDDO
     768            ENDDO
     769        ENDDO
     770    ENDIF
    717771
    718772!   calcul des pressions pour les grilles u et v
     
    747801
    748802! -----------------------------------------------------------------
    749 ! Interpolation champs guidage sur niveaux modele (+inversion N/S)
     803! Interpolation verticale champs guidage sur niveaux modele
    750804! Conversion en variables gcm (ucov, vcov...)
    751805! -----------------------------------------------------------------
     
    762816    endif
    763817
     818    IF (guide_T) THEN
     819        ! Calcul des nouvelles valeurs des niveaux de pression du guidage
     820        IF (guide_plevs.EQ.1) THEN
     821            DO l=1,nlevnc
     822                DO j=jjb_u,jje_u
     823                    DO i=1,iip1
     824                        plnc2(i,j,l)=apnc(l)+bpnc(l)*psnat2(i,j)
     825                        plnc1(i,j,l)=apnc(l)+bpnc(l)*psnat1(i,j)
     826                    ENDDO
     827                ENDDO
     828            ENDDO
     829        ELSE IF (guide_plevs.EQ.2) THEN
     830            DO l=1,nlevnc
     831                DO j=jjb_u,jje_u
     832                    DO i=1,iip1
     833                        plnc2(i,j,l)=pnat2(i,j,l)
     834                        plnc1(i,j,l)=pnat1(i,j,l)
     835                    ENDDO
     836                ENDDO
     837            ENDDO
     838        ENDIF
     839
     840        ! Interpolation verticale
     841        CALL pres2lev(tnat1(:,jjb_u:jje_u,:),zu1(:,jjb_u:jje_u,:),nlevnc,llm,           &
     842                    plnc1(:,jjb_u:jje_u,:),plsnc(:,jjb_u:jje_u,:),iip1,jjn_u,invert_p)
     843        CALL pres2lev(tnat2(:,jjb_u:jje_u,:),zu2(:,jjb_u:jje_u,:),nlevnc,llm,           &
     844                    plnc2(:,jjb_u:jje_u,:),plsnc(:,jjb_u:jje_u,:),iip1,jjn_u,invert_p)
     845
     846        ! Conversion en variables GCM
     847        do l=1,llm
     848            do j=jjb_u,jje_u
     849                IF (guide_teta) THEN
     850                    do i=1,iim
     851                        ij=(j-1)*iip1+i
     852                        tgui1(ij,l)=zu1(i,j,l)
     853                        tgui2(ij,l)=zu2(i,j,l)
     854                    enddo
     855                ELSE
     856                    do i=1,iim
     857                        ij=(j-1)*iip1+i
     858                        tgui1(ij,l)=zu1(i,j,l)*cpp/pk(i,j,l)
     859                        tgui2(ij,l)=zu2(i,j,l)*cpp/pk(i,j,l)
     860                    enddo
     861                ENDIF
     862                tgui1(j*iip1,l)=tgui1((j-1)*iip1+1,l)   
     863                tgui2(j*iip1,l)=tgui2((j-1)*iip1+1,l)   
     864            enddo
     865            do i=1,iip1
     866                tgui1(i,l)=tgui1(1,l)
     867                tgui1(ip1jm+i,l)=tgui1(ip1jm+1,l)
     868                tgui2(i,l)=tgui2(1,l)
     869                tgui2(ip1jm+i,l)=tgui2(ip1jm+1,l)
     870            enddo
     871        enddo
     872    ENDIF
     873
     874    IF (guide_Q) THEN
     875        ! Calcul des nouvelles valeurs des niveaux de pression du guidage
     876        IF (guide_plevs.EQ.1) THEN
     877            DO l=1,nlevnc
     878                DO j=jjb_u,jje_u
     879                    DO i=1,iip1
     880                        plnc2(i,j,l)=apnc(l)+bpnc(l)*psnat2(i,j)
     881                        plnc1(i,j,l)=apnc(l)+bpnc(l)*psnat1(i,j)
     882                    ENDDO
     883                ENDDO
     884            ENDDO
     885        ELSE IF (guide_plevs.EQ.2) THEN
     886            DO l=1,nlevnc
     887                DO j=jjb_u,jje_u
     888                    DO i=1,iip1
     889                        plnc2(i,j,l)=pnat2(i,j,l)
     890                        plnc1(i,j,l)=pnat1(i,j,l)
     891                    ENDDO
     892                ENDDO
     893            ENDDO
     894        ENDIF
     895
     896        ! Interpolation verticale
     897        CALL pres2lev(qnat1(:,jjb_u:jje_u,:),zu1(:,jjb_u:jje_u,:),nlevnc,llm,             &
     898                      plnc1(:,jjb_u:jje_u,:),plsnc(:,jjb_u:jje_u,:),iip1,jjn_u,invert_p)
     899        CALL pres2lev(qnat2(:,jjb_u:jje_u,:),zu2(:,jjb_u:jje_u,:),nlevnc,llm,             &
     900                      plnc2(:,jjb_u:jje_u,:),plsnc(:,jjb_u:jje_u,:),iip1,jjn_u,invert_p)
     901
     902        ! Conversion en variables GCM
     903        ! On suppose qu'on a la bonne variable dans le fichier de guidage:
     904        ! Hum.Rel si guide_hr, Hum.Spec. sinon.
     905        do l=1,llm
     906            do j=jjb_u,jje_u
     907                do i=1,iim
     908                    ij=(j-1)*iip1+i
     909                    qgui1(ij,l)=zu1(i,j,l)
     910                    qgui2(ij,l)=zu2(i,j,l)
     911                enddo
     912                qgui1(j*iip1,l)=qgui1((j-1)*iip1+1,l)   
     913                qgui2(j*iip1,l)=qgui2((j-1)*iip1+1,l)   
     914            enddo
     915            do i=1,iip1
     916                qgui1(i,l)=qgui1(1,l)
     917                qgui1(ip1jm+i,l)=qgui1(ip1jm+1,l)
     918                qgui2(i,l)=qgui2(1,l)
     919                qgui2(ip1jm+i,l)=qgui2(ip1jm+1,l)
     920            enddo
     921        enddo
     922        IF (guide_hr) THEN
     923            CALL q_sat(iip1*jjn_u*llm,teta(:,jjb_u:jje_u,:)*pk(:,jjb_u:jje_u,:)/cpp,       &
     924                       plsnc(:,jjb_u:jje_u,:),qsat(ijb_u:ije_u,:))
     925            qgui1(ijb_u:ije_u,:)=qgui1(ijb_u:ije_u,:)*qsat(ijb_u:ije_u,:)*0.01 !hum. rel. en %
     926            qgui2(ijb_u:ije_u,:)=qgui2(ijb_u:ije_u,:)*qsat(ijb_u:ije_u,:)*0.01
     927        ENDIF
     928    ENDIF
     929
    764930    IF (guide_u) THEN
     931        ! Calcul des nouvelles valeurs des niveaux de pression du guidage
     932        IF (guide_plevs.EQ.1) THEN
     933            DO l=1,nlevnc
     934                DO j=jjb_u,jje_u
     935                    DO i=1,iim
     936                        plnc2(i,j,l)=apnc(l)+bpnc(l)*(psnat2(i,j)*aire(i,j)*alpha1p2(i,j) &
     937                       &           +psnat2(i+1,j)*aire(i+1,j)*alpha3p4(i+1,j))/aireu(i,j)
     938                        plnc1(i,j,l)=apnc(l)+bpnc(l)*(psnat1(i,j)*aire(i,j)*alpha1p2(i,j) &
     939                       &           +psnat1(i+1,j)*aire(i+1,j)*alpha3p4(i+1,j))/aireu(i,j)
     940                    ENDDO
     941                    plnc2(iip1,j,l)=plnc2(1,j,l)
     942                    plnc1(iip1,j,l)=plnc1(1,j,l)
     943                ENDDO
     944            ENDDO
     945        ELSE IF (guide_plevs.EQ.2) THEN
     946            DO l=1,nlevnc
     947                DO j=jjb_u,jje_u
     948                    DO i=1,iim
     949                        plnc2(i,j,l)=(pnat2(i,j,l)*aire(i,j)*alpha1p2(i,j) &
     950                       & +pnat2(i+1,j,l)*aire(i,j)*alpha3p4(i+1,j))/aireu(i,j)
     951                        plnc1(i,j,l)=(pnat1(i,j,l)*aire(i,j)*alpha1p2(i,j) &
     952                       & +pnat1(i+1,j,l)*aire(i,j)*alpha3p4(i+1,j))/aireu(i,j)
     953                    ENDDO
     954                    plnc2(iip1,j,l)=plnc2(1,j,l)
     955                    plnc1(iip1,j,l)=plnc1(1,j,l)
     956                ENDDO
     957            ENDDO
     958        ENDIF
     959       
     960        ! Interpolation verticale
    765961        CALL pres2lev(unat1(:,jjb_u:jje_u,:),zu1(:,jjb_u:jje_u,:),nlevnc,llm,            &
    766962                      plnc1(:,jjb_u:jje_u,:),plunc(:,jjb_u:jje_u,:),iip1,jjn_u,invert_p)
     
    768964                      plnc2(:,jjb_u:jje_u,:),plunc(:,jjb_u:jje_u,:),iip1,jjn_u,invert_p)
    769965
     966        ! Conversion en variables GCM
    770967        do l=1,llm
    771968            do j=jjb_u,jje_u
     
    787984    ENDIF
    788985   
    789     IF (guide_T) THEN
    790         CALL pres2lev(tnat1(:,jjb_u:jje_u,:),zu1(:,jjb_u:jje_u,:),nlevnc,llm,           &
    791                       plnc1(:,jjb_u:jje_u,:),plsnc(:,jjb_u:jje_u,:),iip1,jjn_u,invert_p)
    792         CALL pres2lev(tnat2(:,jjb_u:jje_u,:),zu2(:,jjb_u:jje_u,:),nlevnc,llm,           &
    793                       plnc2(:,jjb_u:jje_u,:),plsnc(:,jjb_u:jje_u,:),iip1,jjn_u,invert_p)
    794 
    795         do l=1,llm
    796             do j=jjb_u,jje_u
    797                 IF (guide_teta) THEN
    798                     do i=1,iim
    799                         ij=(j-1)*iip1+i
    800                         tgui1(ij,l)=zu1(i,j,l)
    801                         tgui2(ij,l)=zu2(i,j,l)
    802                     enddo
    803                 ELSE
    804                     do i=1,iim
    805                         ij=(j-1)*iip1+i
    806                         tgui1(ij,l)=zu1(i,j,l)*cpp/pk(i,j,l)
    807                         tgui2(ij,l)=zu2(i,j,l)*cpp/pk(i,j,l)
    808                     enddo
    809                 ENDIF
    810                 tgui1(j*iip1,l)=tgui1((j-1)*iip1+1,l)   
    811                 tgui2(j*iip1,l)=tgui2((j-1)*iip1+1,l)   
    812             enddo
    813             do i=1,iip1
    814                 tgui1(i,l)=tgui1(1,l)
    815                 tgui1(ip1jm+i,l)=tgui1(ip1jm+1,l)
    816                 tgui2(i,l)=tgui2(1,l)
    817                 tgui2(ip1jm+i,l)=tgui2(ip1jm+1,l)
    818             enddo
    819         enddo
    820     ENDIF
    821 
    822986    IF (guide_v) THEN
    823        
     987        ! Calcul des nouvelles valeurs des niveaux de pression du guidage
     988        IF (guide_plevs.EQ.1) THEN
     989         CALL Register_SwapFieldHallo(psnat1,psnat1,ip1jmp1,1,jj_Nb_caldyn,1,2,Req)
     990         CALL SendRequest(Req)
     991         CALL WaitRequest(Req)
     992         CALL Register_SwapFieldHallo(psnat2,psnat2,ip1jmp1,1,jj_Nb_caldyn,1,2,Req)
     993         CALL SendRequest(Req)
     994         CALL WaitRequest(Req)
     995            DO l=1,nlevnc
     996                DO j=jjb_v,jje_v
     997                    DO i=1,iip1
     998                        plnc2(i,j,l)=apnc(l)+bpnc(l)*(psnat2(i,j)*aire(i,j)*alpha2p3(i,j) &
     999                       &           +psnat2(i,j+1)*aire(i,j+1)*alpha1p4(i,j+1))/airev(i,j)
     1000                        plnc1(i,j,l)=apnc(l)+bpnc(l)*(psnat1(i,j)*aire(i,j)*alpha2p3(i,j) &
     1001                       &           +psnat1(i,j+1)*aire(i,j+1)*alpha1p4(i,j+1))/airev(i,j)
     1002                    ENDDO
     1003                ENDDO
     1004            ENDDO
     1005        ELSE IF (guide_plevs.EQ.2) THEN
     1006         CALL Register_SwapFieldHallo(pnat1,pnat1,ip1jmp1,llm,jj_Nb_caldyn,1,2,Req)
     1007         CALL SendRequest(Req)
     1008         CALL WaitRequest(Req)
     1009         CALL Register_SwapFieldHallo(pnat2,pnat2,ip1jmp1,llm,jj_Nb_caldyn,1,2,Req)
     1010         CALL SendRequest(Req)
     1011         CALL WaitRequest(Req)
     1012            DO l=1,nlevnc
     1013                DO j=jjb_v,jje_v
     1014                    DO i=1,iip1
     1015                        plnc2(i,j,l)=(pnat2(i,j,l)*aire(i,j)*alpha2p3(i,j) &
     1016                       & +pnat2(i,j+1,l)*aire(i,j)*alpha1p4(i,j+1))/airev(i,j)
     1017                        plnc1(i,j,l)=(pnat1(i,j,l)*aire(i,j)*alpha2p3(i,j) &
     1018                       & +pnat1(i,j+1,l)*aire(i,j)*alpha1p4(i,j+1))/airev(i,j)
     1019                    ENDDO
     1020                ENDDO
     1021            ENDDO
     1022        ENDIF
     1023        ! Interpolation verticale
    8241024        CALL pres2lev(vnat1(:,jjb_v:jje_v,:),zv1(:,jjb_v:jje_v,:),nlevnc,llm,             &
    8251025                      plnc1(:,jjb_v:jje_v,:),plvnc(:,jjb_v:jje_v,:),iip1,jjn_v,invert_p)
    8261026        CALL pres2lev(vnat2(:,jjb_v:jje_v,:),zv2(:,jjb_v:jje_v,:),nlevnc,llm,             &
    8271027                      plnc2(:,jjb_v:jje_v,:),plvnc(:,jjb_v:jje_v,:),iip1,jjn_v,invert_p)
    828 
     1028        ! Conversion en variables GCM
    8291029        do l=1,llm
    8301030            do j=jjb_v,jje_v
     
    8401040    ENDIF
    8411041   
    842     IF (guide_Q) THEN
    843         ! On suppose qu'on a la bonne variable dans le fichier de guidage:
    844         ! Hum.Rel si guide_hr, Hum.Spec. sinon.
    845         CALL pres2lev(qnat1(:,jjb_u:jje_u,:),zu1(:,jjb_u:jje_u,:),nlevnc,llm,             &
    846                       plnc1(:,jjb_u:jje_u,:),plsnc(:,jjb_u:jje_u,:),iip1,jjn_u,invert_p)
    847         CALL pres2lev(qnat2(:,jjb_u:jje_u,:),zu2(:,jjb_u:jje_u,:),nlevnc,llm,             &
    848                       plnc2(:,jjb_u:jje_u,:),plsnc(:,jjb_u:jje_u,:),iip1,jjn_u,invert_p)
    849 
    850         do l=1,llm
    851             do j=jjb_u,jjb_v
    852                 do i=1,iim
    853                     ij=(j-1)*iip1+i
    854                     qgui1(ij,l)=zu1(i,j,l)
    855                     qgui2(ij,l)=zu2(i,j,l)
    856                 enddo
    857                 qgui1(j*iip1,l)=qgui1((j-1)*iip1+1,l)   
    858                 qgui2(j*iip1,l)=qgui2((j-1)*iip1+1,l)   
    859             enddo
    860             do i=1,iip1
    861                 qgui1(i,l)=qgui1(1,l)
    862                 qgui1(ip1jm+i,l)=qgui1(ip1jm+1,l)
    863                 qgui2(i,l)=qgui2(1,l)
    864                 qgui2(ip1jm+i,l)=qgui2(ip1jm+1,l)
    865             enddo
    866         enddo
    867         IF (guide_hr) THEN
    868             CALL q_sat(iip1*jjn_u*llm,teta(:,jjb_u:jje_u,:)*pk(:,jjb_u:jje_u,:)/cpp,       &
    869                        plsnc(:,jjb_u:jje_u,:),qsat(ijb_u:ije_u,:))
    870             qgui1(ijb_u:ije_u,:)=qgui1(ijb_u:ije_u,:)*qsat(ijb_u:ije_u,:)*0.01 !hum. rel. en %
    871             qgui2(ijb_u:ije_u,:)=qgui2(ijb_u:ije_u,:)*qsat(ijb_u:ije_u,:)*0.01
    872         ENDIF
    873     ENDIF
    8741042
    8751043  END SUBROUTINE guide_interp
     
    10551223    LOGICAL, SAVE         :: first=.TRUE.
    10561224! Identification fichiers et variables NetCDF:
    1057     INTEGER, SAVE         :: ncidu,varidu,ncidv,varidv,ncidQ
    1058     INTEGER, SAVE         :: varidQ,ncidt,varidt,ncidps,varidps
     1225    INTEGER, SAVE         :: ncidu,varidu,ncidv,varidv,ncidp,varidp
     1226    INTEGER, SAVE         :: ncidQ,varidQ,ncidt,varidt,ncidps,varidps
    10591227    INTEGER               :: ncidpl,varidpl,varidap,varidbp
    10601228! Variables auxiliaires NetCDF:
     
    10681236         ncidpl=-99
    10691237         print*,'Guide: ouverture des fichiers guidage '
    1070 ! Niveaux de pression si non constants
    1071          if (guide_modele) then
    1072              print *,'Lecture du guidage sur niveaux modle'
     1238! Ap et Bp si Niveaux de pression hybrides
     1239         if (guide_plevs.EQ.1) then
     1240             print *,'Lecture du guidage sur niveaux modele'
    10731241             rcode = nf90_open('apbp.nc', nf90_nowrite, ncidpl)
    10741242             rcode = nf90_inq_varid(ncidpl, 'AP', varidap)
    10751243             rcode = nf90_inq_varid(ncidpl, 'BP', varidbp)
    10761244             print*,'ncidpl,varidap',ncidpl,varidap
     1245         endif
     1246! Pression si guidage sur niveaux P variables
     1247         if (guide_plevs.EQ.2) then
     1248             rcode = nf90_open('P.nc', nf90_nowrite, ncidp)
     1249             rcode = nf90_inq_varid(ncidp, 'PRES', varidp)
     1250             print*,'ncidp,varidp',ncidp,varidp
     1251             if (ncidpl.eq.-99) ncidpl=ncidp
    10771252         endif
    10781253! Vent zonal
     
    11051280         endif
    11061281! Pression de surface
    1107          if ((guide_P).OR.(guide_modele)) then
     1282         if ((guide_P).OR.(guide_plevs.EQ.1)) then
    11081283             rcode = nf90_open('ps.nc', nf90_nowrite, ncidps)
    11091284             rcode = nf90_inq_varid(ncidps, 'SP', varidps)
     
    11111286         endif
    11121287! Coordonnee verticale
    1113          if (.not.guide_modele) then
     1288         if (guide_plevs.EQ.0) then
    11141289              rcode = nf90_inq_varid(ncidpl, 'LEVEL', varidpl)
    11151290              IF (rcode.NE.0) rcode = nf90_inq_varid(ncidpl, 'PRESSURE', varidpl)
     
    11171292         endif
    11181293! Coefs ap, bp pour calcul de la pression aux differents niveaux
    1119          if (guide_modele) then
     1294         IF (guide_plevs.EQ.1) THEN
    11201295#ifdef NC_DOUBLE
    11211296             status=NF_GET_VARA_DOUBLE(ncidpl,varidap,1,nlevnc,apnc)
     
    11251300             status=NF_GET_VARA_REAL(ncidpl,varidbp,1,nlevnc,bpnc)
    11261301#endif
    1127          else
     1302         ELSEIF (guide_plevs.EQ.0) THEN
    11281303#ifdef NC_DOUBLE
    11291304             status=NF_GET_VARA_DOUBLE(ncidpl,varidpl,1,nlevnc,apnc)
     
    11331308             apnc=apnc*100.! conversion en Pascals
    11341309             bpnc(:)=0.
    1135          endif
     1310         ENDIF
    11361311         first=.FALSE.
    1137      endif ! (first)
     1312     ENDIF ! (first)
    11381313
    11391314! -----------------------------------------------------------------
     
    11521327     count(4)=1
    11531328
     1329! Pression
     1330     if (guide_plevs.EQ.2) then
     1331#ifdef NC_DOUBLE
     1332         status=NF_GET_VARA_DOUBLE(ncidp,varidp,start,count,pnat2)
     1333#else
     1334         status=NF_GET_VARA_REAL(ncidp,varidp,start,count,pnat2)
     1335#endif
     1336         IF (invert_y) THEN
     1337           CALL invert_lat(iip1,jjp1,nlevnc,pnat2)
     1338         ENDIF
     1339     endif
     1340
    11541341!  Vent zonal
    11551342     if (guide_u) then
     
    12041391
    12051392!  Pression de surface
    1206      if ((guide_P).OR.(guide_modele))  then
     1393     if ((guide_P).OR.(guide_plevs.EQ.1))  then
    12071394         start(3)=timestep
    12081395         start(4)=0
     
    12351422    LOGICAL, SAVE         :: first=.TRUE.
    12361423! Identification fichiers et variables NetCDF:
    1237     INTEGER, SAVE         :: ncidu,varidu,ncidv,varidv,ncidQ
    1238     INTEGER, SAVE         :: varidQ,ncidt,varidt,ncidps,varidps
     1424    INTEGER, SAVE         :: ncidu,varidu,ncidv,varidv,ncidp,varidp
     1425    INTEGER, SAVE         :: ncidQ,varidQ,ncidt,varidt,ncidps,varidps
    12391426    INTEGER               :: ncidpl,varidpl,varidap,varidbp
    12401427! Variables auxiliaires NetCDF:
     
    12521439         ncidpl=-99
    12531440         print*,'Guide: ouverture des fichiers guidage '
    1254 ! Niveaux de pression si non constants
    1255          if (guide_modele) then
     1441! Ap et Bp si niveaux de pression hybrides
     1442         if (guide_plevs.EQ.1) then
    12561443             print *,'Lecture du guidage sur niveaux mod�le'
    12571444             rcode = nf90_open('apbp.nc', nf90_nowrite, ncidpl)
     
    12591446             rcode = nf90_inq_varid(ncidpl, 'BP', varidbp)
    12601447             print*,'ncidpl,varidap',ncidpl,varidap
     1448         endif
     1449! Pression
     1450         if (guide_plevs.EQ.2) then
     1451             rcode = nf90_open('P.nc', nf90_nowrite, ncidp)
     1452             rcode = nf90_inq_varid(ncidp, 'PRES', varidp)
     1453             print*,'ncidp,varidp',ncidp,varidp
     1454             if (ncidpl.eq.-99) ncidpl=ncidp
    12611455         endif
    12621456! Vent zonal
     
    12891483         endif
    12901484! Pression de surface
    1291          if ((guide_P).OR.(guide_modele)) then
     1485         if ((guide_P).OR.(guide_plevs.EQ.1)) then
    12921486             rcode = nf90_open('ps.nc', nf90_nowrite, ncidps)
    12931487             rcode = nf90_inq_varid(ncidps, 'SP', varidps)
     
    12951489         endif
    12961490! Coordonnee verticale
    1297          if (.not.guide_modele) then
     1491         if (guide_plevs.EQ.0) then
    12981492              rcode = nf90_inq_varid(ncidpl, 'LEVEL', varidpl)
    12991493              IF (rcode.NE.0) rcode = nf90_inq_varid(ncidpl, 'PRESSURE', varidpl)
     
    13011495         endif
    13021496! Coefs ap, bp pour calcul de la pression aux differents niveaux
    1303          if (guide_modele) then
     1497         if (guide_plevs.EQ.1) then
    13041498#ifdef NC_DOUBLE
    13051499             status=NF_GET_VARA_DOUBLE(ncidpl,varidap,1,nlevnc,apnc)
     
    13091503             status=NF_GET_VARA_REAL(ncidpl,varidbp,1,nlevnc,bpnc)
    13101504#endif
    1311          else
     1505         elseif (guide_plevs.EQ.0) THEN
    13121506#ifdef NC_DOUBLE
    13131507             status=NF_GET_VARA_DOUBLE(ncidpl,varidpl,1,nlevnc,apnc)
     
    13361530     count(4)=1
    13371531
     1532!  Pression
     1533     if (guide_plevs.EQ.2) then
     1534#ifdef NC_DOUBLE
     1535         status=NF_GET_VARA_DOUBLE(ncidp,varidp,start,count,zu)
     1536#else
     1537         status=NF_GET_VARA_REAL(ncidp,varidp,start,count,zu)
     1538#endif
     1539         DO i=1,iip1
     1540             pnat2(i,:,:)=zu(:,:)
     1541         ENDDO
     1542
     1543         IF (invert_y) THEN
     1544           CALL invert_lat(iip1,jjp1,nlevnc,pnat2)
     1545         ENDIF
     1546     endif
    13381547!  Vent zonal
    13391548     if (guide_u) then
     
    13501559           CALL invert_lat(iip1,jjp1,nlevnc,unat2)
    13511560         ENDIF
    1352 
    13531561     endif
    13541562
     
    13671575           CALL invert_lat(iip1,jjp1,nlevnc,tnat2)
    13681576         ENDIF
    1369 
    13701577     endif
    13711578
     
    13841591           CALL invert_lat(iip1,jjp1,nlevnc,qnat2)
    13851592         ENDIF
    1386 
    13871593     endif
    13881594
     
    14021608           CALL invert_lat(iip1,jjm,nlevnc,vnat2)
    14031609         ENDIF
    1404 
    14051610     endif
    14061611
    14071612!  Pression de surface
    1408      if ((guide_P).OR.(guide_modele))  then
     1613     if ((guide_P).OR.(guide_plevs.EQ.1))  then
    14091614         start(3)=timestep
    14101615         start(4)=0
     
    14241629           CALL invert_lat(iip1,jjp1,1,psnat2)
    14251630         ENDIF
    1426 
    14271631     endif
    14281632
     
    14301634 
    14311635!=======================================================================
    1432   SUBROUTINE guide_out(varname,hsize,vsize,field)
     1636  SUBROUTINE guide_out(varname,hsize,vsize,field,factt)
    14331637    USE parallel
    14341638    IMPLICIT NONE
     
    14451649    INTEGER,   INTENT (IN)                         :: hsize,vsize
    14461650    REAL, DIMENSION (iip1,hsize,vsize), INTENT(IN) :: field
     1651    REAL, INTENT (IN)                              :: factt
    14471652
    14481653    ! Variables locales
     
    15071712! --------------------------------------------------------------------
    15081713        ierr = NF_REDEF(nid)
    1509 ! Surface pressure (GCM)
    1510         dim3=(/id_lonv,id_latu,id_tim/)
    1511         ierr = NF_DEF_VAR(nid,"SP",NF_FLOAT,3,dim3,varid)
     1714! Pressure (GCM)
     1715        dim4=(/id_lonv,id_latu,id_lev,id_tim/)
     1716        ierr = NF_DEF_VAR(nid,"P",NF_FLOAT,4,dim4,varid)
    15121717! Surface pressure (guidage)
    15131718        IF (guide_P) THEN
     
    15431748! Enregistrement du champ
    15441749! --------------------------------------------------------------------
     1750 
    15451751    ierr=NF_OPEN("guide_ins.nc",NF_WRITE,nid)
    15461752
    15471753    SELECT CASE (varname)
    1548     CASE ("S")
     1754    CASE ("P")
    15491755        timestep=timestep+1
    1550         ierr = NF_INQ_VARID(nid,"SP",varid)
    1551         start=(/1,1,timestep,0/)
    1552         count=(/iip1,jjp1,1,0/)
     1756        ierr = NF_INQ_VARID(nid,"P",varid)
     1757        start=(/1,1,1,timestep/)
     1758        count=(/iip1,jjp1,llm,1/)
    15531759#ifdef NC_DOUBLE
    15541760        ierr = NF_PUT_VARA_DOUBLE(nid,varid,start,count,field)
     
    15561762        ierr = NF_PUT_VARA_REAL(nid,varid,start,count,field)
    15571763#endif
    1558     CASE ("P")
     1764    CASE ("SP")
    15591765        ierr = NF_INQ_VARID(nid,"ps",varid)
    15601766        start=(/1,1,timestep,0/)
    15611767        count=(/iip1,jjp1,1,0/)
    15621768#ifdef NC_DOUBLE
    1563         ierr = NF_PUT_VARA_DOUBLE(nid,varid,start,count,field)
    1564 #else
    1565         ierr = NF_PUT_VARA_REAL(nid,varid,start,count,field)
     1769        ierr = NF_PUT_VARA_DOUBLE(nid,varid,start,count,field/factt)
     1770#else
     1771        ierr = NF_PUT_VARA_REAL(nid,varid,start,count,field/factt)
    15661772#endif
    15671773    CASE ("U")
     
    15701776        count=(/iip1,jjp1,llm,1/)
    15711777#ifdef NC_DOUBLE
    1572         ierr = NF_PUT_VARA_DOUBLE(nid,varid,start,count,field)
    1573 #else
    1574         ierr = NF_PUT_VARA_REAL(nid,varid,start,count,field)
     1778        ierr = NF_PUT_VARA_DOUBLE(nid,varid,start,count,field/factt)
     1779#else
     1780        ierr = NF_PUT_VARA_REAL(nid,varid,start,count,field/factt)
    15751781#endif
    15761782    CASE ("V")
     
    15791785        count=(/iip1,jjm,llm,1/)
    15801786#ifdef NC_DOUBLE
    1581         ierr = NF_PUT_VARA_DOUBLE(nid,varid,start,count,field)
    1582 #else
    1583         ierr = NF_PUT_VARA_REAL(nid,varid,start,count,field)
     1787        ierr = NF_PUT_VARA_DOUBLE(nid,varid,start,count,field/factt)
     1788#else
     1789        ierr = NF_PUT_VARA_REAL(nid,varid,start,count,field/factt)
    15841790#endif
    15851791    CASE ("T")
     
    15881794        count=(/iip1,jjp1,llm,1/)
    15891795#ifdef NC_DOUBLE
    1590         ierr = NF_PUT_VARA_DOUBLE(nid,varid,start,count,field)
    1591 #else
    1592         ierr = NF_PUT_VARA_REAL(nid,varid,start,count,field)
     1796        ierr = NF_PUT_VARA_DOUBLE(nid,varid,start,count,field/factt)
     1797#else
     1798        ierr = NF_PUT_VARA_REAL(nid,varid,start,count,field/factt)
    15931799#endif
    15941800    CASE ("Q")
     
    15971803        count=(/iip1,jjp1,llm,1/)
    15981804#ifdef NC_DOUBLE
    1599         ierr = NF_PUT_VARA_DOUBLE(nid,varid,start,count,field)
    1600 #else
    1601         ierr = NF_PUT_VARA_REAL(nid,varid,start,count,field)
     1805        ierr = NF_PUT_VARA_DOUBLE(nid,varid,start,count,field/factt)
     1806#else
     1807        ierr = NF_PUT_VARA_REAL(nid,varid,start,count,field/factt)
    16021808#endif
    16031809    END SELECT
  • trunk/libf/dyn3dpar/iniacademic.F90

    r124 r127  
    11!
    2 ! $Id: iniacademic.F90 1474 2011-01-14 11:04:45Z lguez $
     2! $Id: iniacademic.F90 1520 2011-05-23 11:37:09Z emillour $
    33!
    44SUBROUTINE iniacademic(vcov,ucov,teta,q,masse,ps,phis,time_0)
     
    7171
    7272  REAL alpha(ip1jmp1,llm),beta(ip1jmp1,llm),zdtvr
     73 
     74  character(len=*),parameter :: modname="iniacademic"
     75  character(len=80) :: abort_message
    7376
    7477  !-----------------------------------------------------------------------
     
    7679  ! --------------------------------------
    7780  !
    78  
    79   write(lunout,*) 'Iniacademic'
    80  
    8181  ! initialize planet radius, rotation rate,...
    8282  call conf_planete
     
    136136     teta0=315.     ! mean Teta (S.H. 315K)
    137137     CALL getin('teta0',teta0)
    138      write(lunout,*) 'Iniacademic - teta0 ',teta0
    139      write(lunout,*) 'Iniacademic - rad ',rad
    140138     ttp=200.       ! Tropopause temperature (S.H. 200K)
    141139     CALL getin('ttp',ttp)
     
    183181           tetajl(j,l)=teta0-delt_y*ddsin*ddsin+eps*ddsin &
    184182                -delt_z*(1.-ddsin*ddsin)*log(zsig)
    185            !! Aymeric -- tests particuliers
    186183           if (planet_type=="giant") then
    187184             tetajl(j,l)=teta0+(delt_y*                   &
     
    207204        enddo
    208205     enddo
    209 !     write(lunout,*) 'Iniacademic - check',tetajl(:,int(llm/2)),rlatu(:)
    210206
    211207     ! 3. Initialize fields (if necessary)
     
    217213
    218214        CALL pression ( ip1jmp1, ap, bp, ps, p       )
    219         if (planet_type=="earth") then
    220           CALL exner_hyb(ip1jmp1,ps,p,alpha,beta,pks,pk,pkf)
     215        if (disvert_type.eq.1) then
     216          CALL exner_hyb( ip1jmp1, ps, p,alpha,beta, pks, pk, pkf )
     217        elseif (disvert_type.eq.2) then
     218          call exner_milieu(ip1jmp1,ps,p,beta,pks,pk,pkf)
    221219        else
    222           call exner_milieu(ip1jmp1,ps,p,alpha,beta,pks,pk,pkf)
     220          write(abort_message,*) "Wrong value for disvert_type: ", &
     221                              disvert_type
     222          call abort_gcm(modname,abort_message,0)
    223223        endif
    224224        CALL massdair(p,masse)
  • trunk/libf/dyn3dpar/iniconst.F

    r109 r127  
    11!
    2 ! $Id: iniconst.F 1403 2010-07-01 09:02:53Z fairhead $
     2! $Id: iniconst.F 1520 2011-05-23 11:37:09Z emillour $
    33!
    44      SUBROUTINE iniconst
    55
    66      USE control_mod
     7#ifdef CPP_IOIPSL
     8      use IOIPSL
     9#else
     10! if not using IOIPSL, we still need to use (a local version of) getin
     11      use ioipsl_getincom
     12#endif
    713
    814      IMPLICIT NONE
     
    2228
    2329
     30      character(len=*),parameter :: modname="iniconst"
     31      character(len=80) :: abort_message
    2432c
    2533c
     
    4957      r       = cpp * kappa
    5058
    51       write(lunout,*)'iniconst: R  CP  Kappa ',  r , cpp,  kappa
     59      write(lunout,*) trim(modname),': R  CP  Kappa ',r,cpp,kappa
    5260c
    5361c-----------------------------------------------------------------------
    5462
    55       if (planet_type.eq."earth") then
    56        CALL disvert_terre(pa,preff,ap,bp,dpres,presnivs,nivsigs,nivsig)
     63! vertical discretization: default behavior depends on planet_type flag
     64      if (planet_type=="earth") then
     65        disvert_type=1
    5766      else
    58        CALL disvert_noterre
     67        disvert_type=2
    5968      endif
    60 c
    61        RETURN
    62        END
     69      ! but user can also specify using one or the other in run.def:
     70      call getin('disvert_type',disvert_type)
     71      write(lunout,*) trim(modname),': disvert_type=',disvert_type
     72     
     73      if (disvert_type==1) then
     74       ! standard case for Earth (automatic generation of levels)
     75       call disvert(pa,preff,ap,bp,dpres,presnivs,nivsigs,nivsig,
     76     &              scaleheight)
     77      else if (disvert_type==2) then
     78        ! standard case for planets (levels generated using z2sig.def file)
     79        call disvert_noterre
     80      else
     81        write(abort_message,*) "Wrong value for disvert_type: ",
     82     &                        disvert_type
     83        call abort_gcm(modname,abort_message,0)
     84      endif
     85
     86      END
  • trunk/libf/dyn3dpar/leapfrog_p.F

    r124 r127  
    271271
    272272      CALL pression ( ip1jmp1, ap, bp, ps, p       )
    273       if (planet_type.eq."earth") then
     273      if (disvert_type==1) then
    274274        CALL exner_hyb( ip1jmp1, ps, p,alpha,beta, pks, pk, pkf )
    275       else
     275      else ! we assume that we are in the disvert_type==2 case
    276276        CALL exner_milieu( ip1jmp1, ps, p, beta, pks, pk, pkf )
    277277      endif
     
    751751
    752752c$OMP BARRIER
    753          if (planet_type.eq."earth") then
    754           CALL exner_hyb_p( ip1jmp1, ps, p,alpha,beta, pks, pk, pkf )
    755          else
    756           CALL exner_milieu_p( ip1jmp1, ps, p, beta, pks, pk, pkf )
     753         if (disvert_type==1) then
     754           CALL exner_hyb_p(  ip1jmp1, ps, p,alpha,beta,pks, pk, pkf )
     755         else ! we assume that we are in the disvert_type==2 case
     756           CALL exner_milieu_p( ip1jmp1, ps, p, beta, pks, pk, pkf )
    757757         endif
    758758c$OMP BARRIER
     
    11051105        CALL pression_p ( ip1jmp1, ap, bp, ps, p                  )
    11061106c$OMP BARRIER
    1107         if (planet_type.eq."earth") then
     1107        if (disvert_type==1) then
    11081108          CALL exner_hyb_p( ip1jmp1, ps, p,alpha,beta, pks, pk, pkf )
    1109         else
     1109        else ! we assume that we are in the disvert_type==2 case
    11101110          CALL exner_milieu_p( ip1jmp1, ps, p, beta, pks, pk, pkf )
    11111111        endif
  • trunk/libf/dyn3dpar/logic.h

    r124 r127  
    11!
    2 ! $Id: logic.h 1319 2010-02-23 21:29:54Z fairhead $
     2! $Id: logic.h 1520 2011-05-23 11:37:09Z emillour $
    33!
    44!
     
    1111     &  statcl,conser,apdiss,apdelq,saison,ecripar,fxyhypb,ysinus       &
    1212     &  ,read_start,ok_guide,ok_strato,ok_gradsfile                     &
    13      &  ,ok_limit,ok_etat0,hybrid
     13     &  ,ok_limit,ok_etat0,grilles_gcm_netcdf,hybrid
    1414
    1515      COMMON/logici/ iflag_phys,iflag_trac
     
    1818     & apdiss,apdelq,saison,ecripar,fxyhypb,ysinus                      &
    1919     &  ,read_start,ok_guide,ok_strato,ok_gradsfile                     &
    20      &  ,ok_limit,ok_etat0
    21       logical hybrid ! vertcal coordinate is hybrid if true (sigma otherwise)
     20     &  ,ok_limit,ok_etat0,grilles_gcm_netcdf
     21      logical hybrid ! vertical coordinate is hybrid if true (sigma otherwise)
     22                     ! (only used if disvert_type==2)
    2223
    23       INTEGER iflag_phys,iflag_trac
     24      integer iflag_phys,iflag_trac
    2425!$OMP THREADPRIVATE(/logicl/)
    2526!$OMP THREADPRIVATE(/logici/)
Note: See TracChangeset for help on using the changeset viewer.