Ignore:
Timestamp:
Feb 23, 2010, 10:29:54 PM (14 years ago)
Author:
Laurent Fairhead
Message:
  • Modifications to the start and limit creation routines to account for different

calendars

  • Modification to phyetat0 to force the mask read in the start files to match the

surface fractions read in the limit file

  • Force readaerosol.F90 to read in aerosols file with 12 timesteps

  • Modifications aux routines de créations des fichiers start et limit pour prendre

en compte différents calendriers

  • Modification à phyetat0 pour forcer le masque lu dans le fichier start à être

compatible avec les fractions de surface lu dans le fichier limit

  • Forcer readaerosol à ne lire que des fichiers à 12 pas de temps
File:
1 moved

Legend:

Unmodified
Added
Removed
  • LMDZ4/trunk/libf/dyn3dpar/etat0_netcdf.F90

    r1318 r1319  
    11!
    2 ! $Header$
     2! $Id$
    33!
    4 c
    5 c
    6       SUBROUTINE etat0_netcdf (interbar, masque)
    7 #ifdef CPP_EARTH       
    8       USE startvar
    9       USE ioipsl
    10       USE dimphy
    11       USE infotrac
    12       USE fonte_neige_mod
    13       USE pbl_surface_mod
    14       USE phys_state_var_mod
    15       USE filtreg_mod
    16       use regr_lat_time_climoz_m, only: regr_lat_time_climoz
    17       use conf_phys_m, only: conf_phys
     4!-------------------------------------------------------------------------------
     5!
     6SUBROUTINE etat0_netcdf(ib, masque, letat0)
     7!
     8!-------------------------------------------------------------------------------
     9! Purpose: Creates initial states
     10!-------------------------------------------------------------------------------
     11! Note: This routine is designed to work for Earth
     12!-------------------------------------------------------------------------------
     13#ifdef CPP_EARTH
     14  USE startvar
     15  USE ioipsl
     16  USE dimphy
     17  USE infotrac
     18  USE fonte_neige_mod
     19  USE pbl_surface_mod
     20  USE phys_state_var_mod
     21  USE filtreg_mod
     22  USE regr_lat_time_climoz_m, ONLY: regr_lat_time_climoz
     23  USE conf_phys_m,            ONLY: conf_phys
     24  USE netcdf, ONLY : NF90_OPEN, NF90_NOWRITE, NF90_CLOSE, NF90_NOERR
    1825#endif
    19 !#endif of #ifdef CPP_EARTH
    20       use netcdf, only: nf90_open, NF90_NOWRITE, nf90_close
    21       !
    22       IMPLICIT NONE
    23       !
     26  IMPLICIT NONE
     27!-------------------------------------------------------------------------------
     28! Arguments:
    2429#include "dimensions.h"
    2530#include "paramet.h"
    26       !
    27       !
    28 !      INTEGER, PARAMETER :: KIDIA=1, KFDIA=iim*(jjm-1)+2,
    29 !     .KLON=KFDIA-KIDIA+1,KLEV=llm
    30       !
    31 #ifdef CPP_EARTH   
     31#include "iniprint.h"
     32  LOGICAL,                    INTENT(IN)    :: ib     ! barycentric interpolat.
     33  REAL, DIMENSION(iip1,jjp1), INTENT(INOUT) :: masque ! land mask
     34  LOGICAL,                    INTENT(IN)    :: letat0 ! F: masque only required
     35#ifndef CPP_EARTH
     36  WRITE(lunout,*)'limit_netcdf: Earth-specific routine, needs Earth physics'
     37#else
     38!-------------------------------------------------------------------------------
     39! Local variables:
    3240#include "comgeom2.h"
    3341#include "comvert.h"
     
    3644#include "dimsoil.h"
    3745#include "temps.h"
    38 #endif
    39 !#endif of #ifdef CPP_EARTH
    40       ! arguments:
    41       LOGICAL interbar
    42       REAL :: masque(iip1,jjp1)
    43 
    44 #ifdef CPP_EARTH
    45       ! local variables:
    46       REAL :: latfi(klon), lonfi(klon)
    47       REAL :: orog(iip1,jjp1), rugo(iip1,jjp1)
    48       REAL :: psol(iip1, jjp1), phis(iip1, jjp1)
    49       REAL :: p3d(iip1, jjp1, llm+1)
    50       REAL :: uvent(iip1, jjp1, llm)
    51       REAL :: vvent(iip1, jjm, llm)
    52       REAL :: t3d(iip1, jjp1, llm), tpot(iip1, jjp1, llm)
    53       REAL :: qsat(iip1, jjp1, llm)
    54       REAL,ALLOCATABLE :: q3d(:, :, :,:)
    55       REAL :: tsol(klon), qsol(klon), sn(klon)
    56 !!      REAL :: tsolsrf(klon,nbsrf)
    57       real qsolsrf(klon,nbsrf),snsrf(klon,nbsrf)
    58       REAL :: albe(klon,nbsrf), evap(klon,nbsrf)
    59       REAL :: alblw(klon,nbsrf)
    60       REAL :: tsoil(klon,nsoilmx,nbsrf)
    61       REAL :: frugs(klon,nbsrf), agesno(klon,nbsrf)
    62       REAL :: rugmer(klon)
    63       REAL :: qd(iip1, jjp1, llm)
    64       REAL :: run_off_lic_0(klon)
    65       ! declarations pour lecture glace de mer
    66       REAL :: rugv(klon)
    67       INTEGER :: iml_lic, jml_lic, llm_tmp, ttm_tmp, iret
    68       INTEGER :: itaul(1), fid
    69       REAL :: lev(1), date
    70       REAL, ALLOCATABLE, DIMENSION(:,:) :: lon_lic, lat_lic
    71       REAL, ALLOCATABLE, DIMENSION(:)  :: dlon_lic, dlat_lic
    72       REAL, ALLOCATABLE, DIMENSION (:,:) :: fraclic
    73       REAL :: flic_tmp(iip1, jjp1)
    74       REAL :: champint(iim, jjp1)
    75       !
    76 
    77       CHARACTER(len=80) :: varname
    78       !
    79       INTEGER :: i,j, ig, l, ji,ii1,ii2
    80       REAL :: xpi
    81       !
    82       REAL :: alpha(iip1,jjp1,llm),beta(iip1,jjp1,llm)
    83       REAL :: pk(iip1,jjp1,llm), pls(iip1,jjp1,llm), pks(ip1jmp1)
    84       REAL :: workvar(iip1,jjp1,llm)
    85       !
    86       REAL ::  prefkap, unskap
    87       !
    88       real :: time_step,t_ops,t_wrt
     46  REAL,    DIMENSION(klon)                 :: tsol, qsol
     47  REAL,    DIMENSION(klon)                 :: sn, rugmer, run_off_lic_0
     48  REAL,    DIMENSION(iip1,jjp1)            :: orog, rugo, psol, phis
     49  REAL,    DIMENSION(iip1,jjp1,llm+1)      :: p3d
     50  REAL,    DIMENSION(iip1,jjp1,llm)        :: uvent, t3d, tpot, qsat, qd
     51  REAL,    DIMENSION(iip1,jjm ,llm)        :: vvent
     52  REAL,    DIMENSION(:,:,:,:), ALLOCATABLE :: q3d
     53  REAL,    DIMENSION(klon,nbsrf)           :: qsolsrf, snsrf, evap
     54  REAL,    DIMENSION(klon,nbsrf)           :: frugs, agesno
     55  REAL,    DIMENSION(klon,nsoilmx,nbsrf)   :: tsoil
     56
     57!--- Local variables for sea-ice reading:
     58  INTEGER                                  :: iml_lic, jml_lic, llm_tmp
     59  INTEGER                                  :: ttm_tmp, iret, fid
     60  INTEGER, DIMENSION(1)                    :: itaul
     61  REAL,    DIMENSION(1)                    :: lev
     62  REAL                                     :: date
     63  REAL,    DIMENSION(:,:),   ALLOCATABLE   ::  lon_lic,  lat_lic, fraclic
     64  REAL,    DIMENSION(:),     ALLOCATABLE   :: dlon_lic, dlat_lic
     65  REAL,    DIMENSION(iip1,jjp1)            :: flic_tmp
     66
     67!--- Misc
     68  CHARACTER(LEN=80)                        :: x, fmt
     69  INTEGER                                  :: i, j, l, ji
     70  REAL,    DIMENSION(iip1,jjp1,llm)        :: alpha, beta, pk, pls, y
     71  REAL,    DIMENSION(ip1jmp1)              :: pks
    8972
    9073#include "comdissnew.h"
     
    9376#include "clesphys.h"
    9477
    95       INTEGER  ::        longcles
    96       PARAMETER      ( longcles  = 20 )
    97       REAL :: clesphy0 ( longcles       )
    98       REAL :: p(iip1,jjp1,llm)
    99       INTEGER :: itau, iday
    100       REAL :: masse(iip1,jjp1,llm)
    101       REAL :: xpn,xps,xppn(iim),xpps(iim)
    102       real :: time
    103       REAL :: phi(ip1jmp1,llm)
    104       REAL :: pbaru(ip1jmp1,llm),pbarv(ip1jm,llm)
    105       REAL :: w(ip1jmp1,llm)
    106       REAL ::phystep
    107 CC      REAL :: rugsrel(iip1*jjp1)
    108       REAL :: fder(klon)
    109 !!      real zrel(iip1*jjp1),chmin,chmax
    110 
    111 !!      CHARACTER(len=80) :: visu_file
    112       INTEGER :: visuid
    113 
    114 ! pour la lecture du fichier masque ocean
    115       integer :: nid_o2a
    116       logical :: couple = .false.
    117       INTEGER :: iml_omask, jml_omask
    118       REAL, ALLOCATABLE, DIMENSION(:,:) :: lon_omask, lat_omask
    119       REAL, ALLOCATABLE, DIMENSION(:)  :: dlon_omask, dlat_omask
    120       REAL, ALLOCATABLE, DIMENSION (:,:) :: ocemask, ocetmp
    121       real, dimension(klon) :: ocemask_fi
    122       integer :: isst(klon-2)
    123       real zx_tmp_2d(iim,jjp1)
    124 
    125       REAL :: dummy
    126 
    127       logical              :: ok_newmicro
    128       integer              :: iflag_radia
    129       logical              :: ok_journe, ok_mensuel, ok_instan, ok_hf
    130       logical              :: ok_LES
    131       LOGICAL              :: ok_ade, ok_aie, aerosol_couple, new_aod
    132       INTEGER              :: flag_aerosol
    133       REAL                 :: bl95_b0, bl95_b1
    134       real                 :: fact_cldcon, facttemps,ratqsbas,ratqshaut
    135       real                 :: tau_ratqs
    136       integer              :: iflag_cldcon
    137       integer              :: iflag_ratqs
    138       integer :: iflag_coupl
    139       integer :: iflag_clos
    140       integer :: iflag_wake
    141       integer :: iflag_thermals,nsplit_thermals
    142       real    :: tau_thermals
    143       integer :: iflag_thermals_ed,iflag_thermals_optflux
    144       REAL      :: solarlong0
    145       real :: seuil_inversion
    146 
    147       integer  read_climoz ! read ozone climatology
    148 C     Allowed values are 0, 1 and 2
    149 C     0: do not read an ozone climatology
    150 C     1: read a single ozone climatology that will be used day and night
    151 C     2: read two ozone climatologies, the average day and night
    152 C     climatology and the daylight climatology
    153 
    154       !
    155       !   Constantes
    156       !
    157       pi     = 4. * ATAN(1.)
    158       rad    = 6371229.
    159       omeg   = 4.* ASIN(1.)/(24.*3600.)
    160       g      = 9.8
    161       daysec = 86400.
    162       kappa  = 0.2857143
    163       cpp    = 1004.70885
    164       !
    165       preff     = 101325.
    166       pa        =  50000.
    167       unskap = 1./kappa
    168       !
    169       jmp1    = jjm + 1
    170       !
    171       !    Construct a grid
    172       !
    173 
    174 !      CALL defrun_new(99,.TRUE.,clesphy0)
    175       CALL conf_gcm( 99, .TRUE. , clesphy0 )
    176       call conf_phys(  ok_journe, ok_mensuel, ok_instan, ok_hf, ok_LES, &
    177      &                 solarlong0,seuil_inversion,                      &
    178      &                 fact_cldcon, facttemps,ok_newmicro,iflag_radia,  &
    179      &                 iflag_cldcon,                                    &
    180      &                 iflag_ratqs,ratqsbas,ratqshaut,tau_ratqs,        &
    181      &                 ok_ade, ok_aie, aerosol_couple,                  &
    182      &                 flag_aerosol, new_aod,                           &
    183      &                 bl95_b0, bl95_b1,                                &
    184      &                 iflag_thermals,nsplit_thermals,tau_thermals,     &
    185      &                 iflag_thermals_ed,iflag_thermals_optflux,        &
    186      &                 iflag_coupl,iflag_clos,iflag_wake, read_climoz )
     78  REAL,    DIMENSION(iip1,jjp1,llm)        :: masse
     79  INTEGER :: itau, iday
     80  REAL    :: xpn, xps, time, phystep
     81  REAL,    DIMENSION(iim)                  :: xppn, xpps
     82  REAL,    DIMENSION(ip1jmp1,llm)          :: pbaru, phi, w
     83  REAL,    DIMENSION(ip1jm  ,llm)          :: pbarv
     84  REAL,    DIMENSION(klon)                 :: fder
     85
     86!--- Local variables for ocean mask reading:
     87  INTEGER :: nid_o2a, iml_omask, jml_omask
     88  LOGICAL :: couple=.FALSE.
     89  REAL,    DIMENSION(:,:), ALLOCATABLE ::  lon_omask, lat_omask, ocemask, ocetmp
     90  REAL,    DIMENSION(:),   ALLOCATABLE :: dlon_omask,dlat_omask
     91  REAL,    DIMENSION(klon)             :: ocemask_fi
     92  INTEGER, DIMENSION(klon-2)           :: isst
     93  REAL,    DIMENSION(iim,jjp1)         :: zx_tmp_2d
     94  REAL    :: dummy
     95  LOGICAL :: ok_newmicro, ok_journe, ok_mensuel, ok_instan, ok_hf
     96  LOGICAL :: ok_LES, ok_ade, ok_aie, aerosol_couple, new_aod
     97  INTEGER :: iflag_radia, flag_aerosol
     98  REAL    :: bl95_b0, bl95_b1, fact_cldcon, facttemps, ratqsbas, ratqshaut
     99  REAL    :: tau_ratqs
     100  INTEGER :: iflag_cldcon, iflag_ratqs, iflag_coupl, iflag_clos, iflag_wake
     101  INTEGER :: iflag_thermals, nsplit_thermals
     102  INTEGER :: iflag_thermals_ed, iflag_thermals_optflux
     103  REAL    :: tau_thermals, solarlong0,  seuil_inversion
     104  INTEGER :: read_climoz ! read ozone climatology
     105!  Allowed values are 0, 1 and 2
     106!     0: do not read an ozone climatology
     107!     1: read a single ozone climatology that will be used day and night
     108!     2: read two ozone climatologies, the average day and night
     109!     climatology and the daylight climatology
     110!-------------------------------------------------------------------------------
     111!--- Constants
     112  pi     = 4. * ATAN(1.)
     113  rad    = 6371229.
     114  daysec = 86400.
     115  omeg   = 2.*pi/daysec
     116  g      = 9.8
     117  kappa  = 0.2857143
     118  cpp    = 1004.70885
     119  preff  = 101325.
     120  pa     = 50000.
     121  jmp1   = jjm + 1
     122
     123!--- CONSTRUCT A GRID
     124  CALL conf_phys(  ok_journe, ok_mensuel, ok_instan, ok_hf, ok_LES,     &
     125                   solarlong0,seuil_inversion,                          &
     126                   fact_cldcon, facttemps,ok_newmicro,iflag_radia,      &
     127                   iflag_cldcon,                                        &
     128                   iflag_ratqs,ratqsbas,ratqshaut,tau_ratqs,            &
     129                   ok_ade, ok_aie, aerosol_couple,                      &
     130                   flag_aerosol, new_aod,                               &
     131                   bl95_b0, bl95_b1,                                    &
     132                   iflag_thermals,nsplit_thermals,tau_thermals,         &
     133                   iflag_thermals_ed,iflag_thermals_optflux,            &
     134                   iflag_coupl,iflag_clos,iflag_wake, read_climoz )
    187135
    188136! co2_ppm0 : initial value of atmospheric CO2 from .def file (co2_ppm value)
    189       co2_ppm0 = co2_ppm
    190 
    191       dtvr   = daysec/FLOAT(day_step)
    192       print*,'dtvr',dtvr
    193 
    194       CALL iniconst()
    195       CALL inigeom()
    196 
    197 ! Initialisation pour traceurs
    198       call infotrac_init
    199       ALLOCATE(q3d(iip1, jjp1, llm, nqtot))
    200 
    201       CALL inifilr()
    202       CALL phys_state_var_init(read_climoz)
    203       !
    204       latfi(1) = ASIN(1.0)
    205       DO j = 2, jjm
    206         DO i = 1, iim
    207           latfi((j-2)*iim+1+i)=  rlatu(j)
    208         ENDDO
    209       ENDDO
    210       latfi(klon) = - ASIN(1.0)
    211       !
    212       lonfi(1) = 0.0
    213       DO j = 2, jjm
    214         DO i = 1, iim
    215           lonfi((j-2)*iim+1+i) =  rlonv(i)
    216         ENDDO
    217       ENDDO
    218       lonfi(klon) = 0.0
    219       !
    220       xpi = 2.0 * ASIN(1.0)
    221       DO ig = 1, klon
    222         latfi(ig) = latfi(ig) * 180.0 / xpi
    223         lonfi(ig) = lonfi(ig) * 180.0 / xpi
    224       ENDDO
    225       !
    226       rlat(1) = ASIN(1.0)
    227       DO j = 2, jjm
    228         DO i = 1, iim
    229           rlat((j-2)*iim+1+i)=  rlatu(j)
    230         ENDDO
    231       ENDDO
    232       rlat(klon) = - ASIN(1.0)
    233       !
    234       rlon(1) = 0.0
    235       DO j = 2, jjm
    236         DO i = 1, iim
    237           rlon((j-2)*iim+1+i) =  rlonv(i)
    238         ENDDO
    239       ENDDO
    240       rlon(klon) = 0.0
    241       !
    242       xpi = 2.0 * ASIN(1.0)
    243       DO ig = 1, klon
    244         rlat(ig) = rlat(ig) * 180.0 / xpi
    245         rlon(ig) = rlon(ig) * 180.0 / xpi
    246       ENDDO
    247       !
    248      
    249 
    250 
    251 C
    252 C En cas de simulation couplee, lecture du masque ocean issu du modele ocean
    253 C utilise pour calculer les poids et pour assurer l'adequation entre les
    254 C fractions d'ocean vu par l'atmosphere et l'ocean. Sinon, on cree le masque
    255 C a partir du fichier relief
    256 C
    257 
    258       write(*,*)'Essai de lecture masque ocean'
    259       iret = nf90_open("o2a.nc", NF90_NOWRITE, nid_o2a)
    260       if (iret .ne. 0) then
    261         write(*,*)'ATTENTION!! pas de fichier o2a.nc trouve'
    262         write(*,*)'Run force'
    263         varname = 'masque'
    264         masque(:,:) = 0.0
    265         CALL startget(varname, iip1, jjp1, rlonv, rlatu, masque, 0.0,
    266      ,  jjm ,rlonu,rlatv , interbar )
    267         WRITE(*,*) 'MASQUE construit : Masque'
    268         WRITE(*,'(97I1)') nINT(masque(:,:))
    269         call gr_dyn_fi(1, iip1, jjp1, klon, masque, zmasq)
    270         WHERE (zmasq(1 : klon) .LT. EPSFRA)
    271             zmasq(1 : klon) = 0.
    272         END WHERE
    273         WHERE (1. - zmasq(1 : klon) .LT. EPSFRA)
    274             zmasq(1 : klon) = 1.
    275         END WHERE
    276       else
    277         couple = .true.
    278         iret = nf90_close(nid_o2a)
    279         call flininfo("o2a.nc", iml_omask, jml_omask, llm_tmp, ttm_tmp
    280      $    , nid_o2a)
    281         if (iml_omask /= iim .or. jml_omask /= jjp1) then
    282           write(*,*)'Dimensions non compatibles pour masque ocean'
    283           write(*,*)'iim = ',iim,' iml_omask = ',iml_omask
    284           write(*,*)'jjp1 = ',jjp1,' jml_omask = ',jml_omask
    285           stop
    286         endif
    287         ALLOCATE(lat_omask(iml_omask, jml_omask), stat=iret)
    288         ALLOCATE(lon_omask(iml_omask, jml_omask), stat=iret)
    289         ALLOCATE(dlon_omask(iml_omask), stat=iret)
    290         ALLOCATE(dlat_omask(jml_omask), stat=iret)
    291         ALLOCATE(ocemask(iml_omask, jml_omask), stat=iret)
    292         ALLOCATE(ocetmp(iml_omask, jml_omask), stat=iret)
    293         CALL flinopen("o2a.nc", .FALSE., iml_omask, jml_omask, llm_tmp
    294      $    , lon_omask, lat_omask, lev, ttm_tmp, itaul, date, dt, fid)
    295         CALL flinget(fid, 'OceMask', iml_omask, jml_omask, llm_tmp,
    296      $      ttm_tmp, 1, 1, ocetmp)
    297         CALL flinclo(fid)
    298         dlon_omask(1 : iml_omask) = lon_omask(1 : iml_omask, 1)
    299         dlat_omask(1 : jml_omask) = lat_omask(1 , 1 : jml_omask)
    300         ocemask = ocetmp
    301         if (dlat_omask(1) < dlat_omask(jml_omask)) then
    302           do j = 1, jml_omask
    303             ocemask(:,j) = ocetmp(:,jml_omask-j+1)
    304           enddo
    305         endif
    306 C
    307 C passage masque ocean a la grille physique
    308 C
    309         write(*,*)'ocemask '
    310         write(*,'(96i1)')int(ocemask)
    311         ocemask_fi(1) = ocemask(1,1)
    312         do j = 2, jjm
    313           do i = 1, iim
    314             ocemask_fi((j-2)*iim + i + 1) = ocemask(i,j)
    315           enddo
    316         enddo
    317         ocemask_fi(klon) = ocemask(1,jjp1)
    318         zmasq = 1. - ocemask_fi
    319       endif
    320 
    321       call gr_fi_dyn(1, klon, iip1, jjp1, zmasq, masque)
    322 
    323       varname = 'relief'
    324       ! This line needs to be replaced by a call to restget to get the values in the restart file
    325       orog(:,:) = 0.0
    326        CALL startget(varname, iip1, jjp1, rlonv, rlatu, orog, 0.0 ,
    327      , jjm ,rlonu,rlatv , interbar, masque )
    328       !
    329       WRITE(*,*) 'OUT OF GET VARIABLE : Relief'
    330 !      WRITE(*,'(49I1)') INT(orog(:,:))
    331       !
    332       varname = 'rugosite'
    333       ! This line needs to be replaced by a call to restget to get the values in the restart file
    334       rugo(:,:) = 0.0
    335        CALL startget(varname, iip1, jjp1, rlonv, rlatu, rugo, 0.0 ,
    336      , jjm, rlonu,rlatv , interbar )
    337       !
    338       WRITE(*,*) 'OUT OF GET VARIABLE : Rugosite'
    339 !      WRITE(*,'(49I1)') INT(rugo(:,:)*10)
    340       !
    341 C
    342 C on initialise les sous surfaces
    343 C
    344       pctsrf=0.
    345 c
    346       varname = 'psol'
    347       psol(:,:) = 0.0
    348       CALL startget(varname, iip1, jjp1, rlonv, rlatu, psol, 0.0 ,
    349      , jjm ,rlonu,rlatv , interbar )
    350       !
    351       !  Compute here the pressure on the intermediate levels. One would expect that this is available in the GCM
    352       !  anyway.
    353       !
    354 !      WRITE(*,*) 'PSOL :', psol(10,20)
    355 !      WRITE(*,*) ap(:), bp(:)
    356       CALL pression(ip1jmp1, ap, bp, psol, p3d)
    357 !      WRITE(*,*) 'P3D :', p3d(10,20,:)
    358       CALL exner_hyb(ip1jmp1, psol, p3d, alpha, beta, pks, pk, workvar)
    359 !      WRITE(*,*) 'PK:', pk(10,20,:)
    360       !
    361       !
    362       !
    363       prefkap =  preff  ** kappa
    364 !      WRITE(*,*) 'unskap, cpp,  preff :', unskap, cpp,  preff
    365       DO l = 1, llm
    366         DO j=1,jjp1
    367           DO i =1, iip1
    368             pls(i,j,l) = preff * ( pk(i,j,l)/cpp) ** unskap
    369            ENDDO
    370         ENDDO
    371       ENDDO
    372       !
    373 !      WRITE(*,*) 'PLS :', pls(10,20,:)
    374       !
    375       varname = 'surfgeo'
    376       phis(:,:) = 0.0
    377       CALL startget(varname, iip1, jjp1, rlonv, rlatu, phis, 0.0 ,
    378      , jjm ,rlonu,rlatv, interbar )
    379       !
    380       varname = 'u'
    381       uvent(:,:,:) = 0.0
    382       CALL startget(varname, iip1, jjp1, rlonu, rlatu, llm, pls,
    383      . workvar, uvent, 0.0, jjm ,rlonv, rlatv, interbar )
    384       ! 
    385       varname = 'v'
    386       vvent(:,:,:) = 0.0
    387       CALL startget(varname, iip1, jjm, rlonv, rlatv, llm, pls,
    388      . workvar, vvent, 0.0, jjp1, rlonu, rlatu, interbar )
    389       !
    390       varname = 't'
    391       t3d(:,:,:) = 0.0
    392       CALL startget(varname, iip1, jjp1, rlonv, rlatu, llm, pls,
    393      . workvar, t3d, 0.0 , jjm, rlonu, rlatv , interbar )
    394       !
    395       WRITE(*,*) 'T3D min,max:',minval(t3d(:,:,:)),
    396      .                          maxval(t3d(:,:,:))
    397       varname = 'tpot'
    398       tpot(:,:,:) = 0.0
    399       CALL startget(varname, iip1, jjp1, rlonv, rlatu, llm, pls,
    400      . pk, tpot, 0.0 , jjm, rlonu, rlatv , interbar )
    401       !
    402       WRITE(*,*) 'T3D min,max:',minval(t3d(:,:,:)),
    403      .                          maxval(t3d(:,:,:))
    404       WRITE(*,*) 'PLS min,max:',minval(pls(:,:,:)),
    405      .                          maxval(pls(:,:,:))
    406 
    407 c Calcul de l'humidite a saturation
    408       print*,'avant q_sat'
    409       call q_sat(llm*jjp1*iip1,t3d,pls,qsat)
    410       print*,'apres q_sat'
    411 
    412       WRITE(*,*) 'QSAT min,max:',minval(qsat(:,:,:)),
    413      .                           maxval(qsat(:,:,:))
    414       !
    415 CC      WRITE(*,*) 'QSAT :', qsat(10,20,:)
    416       !
    417       varname = 'q'
    418       qd(:,:,:) = 0.0
    419       q3d(:,:,:,:) = 0.0
    420       WRITE(*,*) 'QSAT min,max:',minval(qsat(:,:,:)),
    421      .                           maxval(qsat(:,:,:))
    422       CALL startget(varname, iip1, jjp1, rlonv, rlatu, llm, pls,
    423      . qsat, qd, 0.0, jjm, rlonu, rlatv , interbar )
    424       q3d(:,:,:,1) = qd(:,:,:)
    425       !
    426 
    427 !     Ozone climatology:
    428       if (read_climoz >= 1) call regr_lat_time_climoz(read_climoz)
    429 
    430       varname = 'tsol'
    431       ! This line needs to be replaced by a call to restget to get the values in the restart file
    432       tsol(:) = 0.0
    433       CALL startget(varname, iip1, jjp1, rlonv, rlatu, klon, tsol, 0.0,
    434      .    jjm, rlonu, rlatv , interbar )
    435       !
    436       WRITE(*,*) 'TSOL construit :'
    437 !      WRITE(*,'(48I3)') INT(TSOL(2:klon)-273)
    438       !
    439       varname = 'qsol'
    440       qsol(:) = 0.0
    441       CALL startget(varname, iip1, jjp1, rlonv, rlatu, klon, qsol, 0.0,
    442      .   jjm, rlonu, rlatv , interbar )
    443       !
    444       varname = 'snow'
    445       sn(:) = 0.0
    446       CALL startget(varname, iip1, jjp1, rlonv, rlatu, klon, sn, 0.0,
    447      .    jjm, rlonu, rlatv , interbar )
    448       !
    449       varname = 'rads'
    450       radsol(:) = 0.0
    451       CALL startget(varname,iip1,jjp1,rlonv,rlatu,klon,radsol,0.0,
    452      .    jjm, rlonu, rlatv , interbar )
    453       !
    454       varname = 'rugmer'
    455       rugmer(:) = 0.0
    456       CALL startget(varname,iip1,jjp1,rlonv,rlatu,klon,rugmer,0.0,
    457      .     jjm, rlonu, rlatv , interbar )
    458       !
    459 !      varname = 'agesno'
    460 !      agesno(:) = 0.0
    461 !      CALL startget(varname,iip1,jjp1,rlonv,rlatu,klon,agesno,0.0,
    462 !     .     jjm, rlonu, rlatv , interbar )
    463 
    464       varname = 'zmea'
    465       zmea(:) = 0.0
    466       CALL startget(varname,iip1,jjp1,rlonv,rlatu,klon,zmea,0.0,
    467      .     jjm, rlonu, rlatv , interbar )
    468 
    469       varname = 'zstd'
    470       zstd(:) = 0.0
    471       CALL startget(varname,iip1,jjp1,rlonv,rlatu,klon,zstd,0.0,
    472      .     jjm, rlonu, rlatv , interbar )
    473       varname = 'zsig'
    474       zsig(:) = 0.0
    475       CALL startget(varname,iip1,jjp1,rlonv,rlatu,klon,zsig,0.0,
    476      .     jjm, rlonu, rlatv , interbar )
    477       varname = 'zgam'
    478       zgam(:) = 0.0
    479       CALL startget(varname,iip1,jjp1,rlonv,rlatu,klon,zgam,0.0,
    480      .     jjm, rlonu, rlatv , interbar )
    481       varname = 'zthe'
    482       zthe(:) = 0.0
    483       CALL startget(varname,iip1,jjp1,rlonv,rlatu,klon,zthe,0.0,
    484      .     jjm, rlonu, rlatv , interbar )
    485       varname = 'zpic'
    486       zpic(:) = 0.0
    487       CALL startget(varname,iip1,jjp1,rlonv,rlatu,klon,zpic,0.0,
    488      .     jjm, rlonu, rlatv , interbar )
    489       varname = 'zval'
    490       zval(:) = 0.0
    491       CALL startget(varname,iip1,jjp1,rlonv,rlatu,klon,zval,0.0,
    492      .     jjm, rlonu, rlatv , interbar )
    493 c
    494 cc      rugsrel(:) = 0.0
    495 cc      IF(ok_orodr)  THEN
    496 cc        DO i = 1, iip1* jjp1
    497 cc         rugsrel(i) = MAX( 1.e-05, zstd(i)* zsig(i) /2. )
    498 cc        ENDDO
    499 cc      ENDIF
    500 
    501 
    502 C
    503 C lecture du fichier glace de terre pour fixer la fraction de terre
    504 C et de glace de terre
    505 C
    506       CALL flininfo("landiceref.nc", iml_lic, jml_lic,llm_tmp, ttm_tmp
    507      $    , fid)
    508       ALLOCATE(lat_lic(iml_lic, jml_lic), stat=iret)
    509       ALLOCATE(lon_lic(iml_lic, jml_lic), stat=iret)
    510       ALLOCATE(dlon_lic(iml_lic), stat=iret)
    511       ALLOCATE(dlat_lic(jml_lic), stat=iret)
    512       ALLOCATE(fraclic(iml_lic, jml_lic), stat=iret)
    513       CALL flinopen("landiceref.nc", .FALSE., iml_lic, jml_lic, llm_tmp
    514      $    , lon_lic, lat_lic, lev, ttm_tmp, itaul, date, dt, fid)
    515       CALL flinget(fid, 'landice', iml_lic, jml_lic, llm_tmp, ttm_tmp
    516      $    , 1, 1, fraclic)
    517       CALL flinclo(fid)
    518 C
    519 C interpolation sur la grille T du modele
    520 C
    521       WRITE(*,*) 'dimensions de landice iml_lic, jml_lic : ',
    522      $    iml_lic, jml_lic
    523 c
    524 C sil les coordonnees sont en degres, on les transforme
    525 C
    526       IF( MAXVAL( lon_lic(:,:) ) .GT. 2.0 * asin(1.0) )  THEN
    527           lon_lic(:,:) = lon_lic(:,:) * 2.0* ASIN(1.0) / 180.
    528       ENDIF
    529       IF( maxval( lat_lic(:,:) ) .GT. 2.0 * asin(1.0)) THEN
    530           lat_lic(:,:) = lat_lic(:,:) * 2.0 * asin(1.0) / 180.
    531       ENDIF
    532 
    533       dlon_lic(1 : iml_lic) = lon_lic(1 : iml_lic, 1)
    534       dlat_lic(1 : jml_lic) = lat_lic(1 , 1 : jml_lic)
    535 C
    536       CALL grille_m(iml_lic, jml_lic, dlon_lic, dlat_lic, fraclic
    537      $    ,iim, jjp1,
    538      $    rlonv, rlatu, flic_tmp(1 : iim, 1 : jjp1))
    539 cx$$$      flic_tmp(1 : iim, 1 : jjp1) = champint(1: iim, 1 : jjp1)
    540       flic_tmp(iip1, 1 : jjp1) = flic_tmp(1 , 1 : jjp1)
    541 C
    542 C passage sur la grille physique
    543 C
    544       CALL gr_dyn_fi(1, iip1, jjp1, klon, flic_tmp,
    545      $    pctsrf(1:klon, is_lic))
    546 C adequation avec le maque terre/mer
    547 c      zmasq(157) = 0.
    548       WHERE (pctsrf(1 : klon, is_lic) .LT. EPSFRA )
    549           pctsrf(1 : klon, is_lic) = 0.
    550       END WHERE
    551       WHERE (zmasq( 1 : klon) .LT. EPSFRA)
    552           pctsrf(1 : klon, is_lic) = 0.
    553       END WHERE
    554       pctsrf(1 : klon, is_ter) = zmasq(1 : klon)
    555       DO ji = 1, klon
    556         IF (zmasq(ji) .GT. EPSFRA) THEN
    557             IF ( pctsrf(ji, is_lic) .GE. zmasq(ji)) THEN
    558                 pctsrf(ji, is_lic) = zmasq(ji)
    559                 pctsrf(ji, is_ter) = 0.
    560             ELSE
    561                 pctsrf(ji,is_ter) = zmasq(ji) - pctsrf(ji, is_lic)
    562                 IF (pctsrf(ji,is_ter) .LT. EPSFRA) THEN
    563                     pctsrf(ji,is_ter) = 0.
    564                     pctsrf(ji, is_lic) = zmasq(ji)
    565                 ENDIF
    566             ENDIF
    567         ENDIF
    568       END DO
    569 C
    570 C sous surface ocean et glace de mer (pour demarrer on met glace de mer a 0)
    571 C
    572       pctsrf(1 : klon, is_oce) = (1. - zmasq(1 : klon))
    573 
    574 
    575       WHERE (pctsrf(1 : klon, is_oce) .LT. EPSFRA)
    576           pctsrf(1 : klon, is_oce) = 0.
    577       END WHERE
    578 
    579       if (couple) pctsrf(1 : klon, is_oce) = ocemask_fi(1 : klon)
    580 
    581       isst = 0
    582       where (pctsrf(2:klon-1,is_oce) >0.) isst = 1
    583 C
    584 C verif que somme des sous surface = 1
    585 C
    586       ji=count( (abs( sum(pctsrf(1 : klon, 1 : nbsrf),dim=2))-1.0)
    587      $    .GT. EPSFRA)
    588       IF (ji .NE. 0) THEN
    589           WRITE(*,*) 'pb repartition sous maille pour ',ji,' points'
    590       ENDIF
    591 
    592 !      where (pctsrf(1:klon, is_ter) >= .5)
    593 !        pctsrf(1:klon, is_ter) = 1.
    594 !        pctsrf(1:klon, is_oce) = 0.
    595 !        pctsrf(1:klon, is_sic) = 0.
    596 !        pctsrf(1:klon, is_lic) = 0.
    597 !        zmasq = 1.
    598 !      endwhere
    599 !      where (pctsrf(1:klon, is_lic) >= .5)
    600 !        pctsrf(1:klon, is_ter) = 0.
    601 !        pctsrf(1:klon, is_oce) = 0.
    602 !        pctsrf(1:klon, is_sic) = 0.
    603 !        pctsrf(1:klon, is_lic) = 1.
    604 !        zmasq = 1.
    605 !      endwhere
    606 !      where (pctsrf(1:klon, is_oce) >= .5)
    607 !        pctsrf(1:klon, is_ter) = 0.
    608 !        pctsrf(1:klon, is_oce) = 1.
    609 !        pctsrf(1:klon, is_sic) = 0.
    610 !        pctsrf(1:klon, is_lic) = 0.
    611 !        zmasq = 0.
    612 !      endwhere
    613 !      where (pctsrf(1:klon, is_sic) >= .5)
    614 !        pctsrf(1:klon, is_ter) = 0.
    615 !        pctsrf(1:klon, is_oce) = 0.
    616 !        pctsrf(1:klon, is_sic) = 1.
    617 !        pctsrf(1:klon, is_lic) = 0.
    618 !        zmasq = 0.
    619 !      endwhere
    620 !      call gr_fi_dyn(1, klon, iip1, jjp1, zmasq, masque)
    621 C
    622 C verif que somme des sous surface = 1
    623 C
    624 !      ji=count( (abs( sum(pctsrf(1 : klon, 1 : nbsrf), dim = 2)) - 1.0 )
    625 !     $    .GT. EPSFRA)
    626 !      IF (ji .NE. 0) THEN
    627 !          WRITE(*,*) 'pb repartition sous maille pour ',ji,' points'
    628 !     ENDIF
    629 
    630       CALL gr_fi_ecrit(1,klon,iim,jjp1,zmasq,zx_tmp_2d)
    631       write(*,*)'zmasq = '
    632       write(*,'(96i1)')nint(zx_tmp_2d)
    633       call gr_fi_dyn(1, klon, iip1, jjp1, zmasq, masque)
    634       WRITE(*,*) 'MASQUE construit : Masque'
    635       WRITE(*,'(97I1)') nINT(masque(:,:))
    636 
    637 
    638 
    639 C Calcul intermediaire
    640 c
    641       CALL massdair( p3d, masse  )
    642 c
    643 
    644       print *,' ALPHAX ',alphax
    645 
    646       DO  l = 1, llm
    647         DO  i    = 1, iim
    648           xppn(i) = aire( i, 1   ) * masse(  i     ,  1   , l )
    649           xpps(i) = aire( i,jjp1 ) * masse(  i     , jjp1 , l )
    650         ENDDO
    651           xpn      = SUM(xppn)/apoln
    652           xps      = SUM(xpps)/apols
    653         DO i   = 1, iip1
    654           masse(   i   ,   1     ,  l )   = xpn
    655           masse(   i   ,   jjp1  ,  l )   = xps
    656         ENDDO
    657       ENDDO
    658       q3d(iip1,:,:,:) = q3d(1,:,:,:)
    659       phis(iip1,:) = phis(1,:)
    660 
    661 C Ecriture
    662       CALL inidissip( lstardis, nitergdiv, nitergrot, niterh   ,
    663      *                tetagdiv, tetagrot , tetatemp              )
    664       print*,'sortie inidissip'
    665       itau = 0
    666       itau_dyn = 0
    667       itau_phy = 0
    668       iday = dayref +itau/day_step
    669       time = real(itau-(iday-dayref)*day_step)/day_step
    670 c     
    671       IF(time.GT.1)  THEN
    672        time = time - 1
    673        iday = iday + 1
    674       ENDIF
    675       day_ref = dayref
    676       annee_ref = anneeref
    677 
    678       CALL geopot  ( ip1jmp1, tpot  , pk , pks,  phis  , phi   )
    679       print*,'sortie geopot'
    680      
    681       CALL caldyn0 ( itau,uvent,vvent,tpot,psol,masse,pk,phis ,
    682      *                phi,w, pbaru,pbarv,time+iday-dayref   )
    683        print*,'sortie caldyn0'     
    684       CALL dynredem0("start.nc",dayref,phis)
    685       print*,'sortie dynredem0'
    686       CALL dynredem1("start.nc",0.0,vvent,uvent,tpot,q3d,masse ,
    687      .                            psol)
    688       print*,'sortie dynredem1'
    689 C
    690 C Ecriture etat initial physique
    691 C
    692       write(*,*)'phystep ',dtvr,iphysiq,nbapp_rad
    693       phystep   = dtvr * FLOAT(iphysiq)
    694       radpas    = NINT (86400./phystep/ FLOAT(nbapp_rad) )
    695       write(*,*)'phystep =', phystep, radpas
    696 cIM : lecture de co2_ppm & solaire ds physiq.def
    697 c     co2_ppm   = 348.0
    698 c     solaire   = 1365.0
    699 
    700 c
    701 c Initialisation
    702 c tsol, qsol, sn,albe, evap,tsoil,rain_fall, snow_fall,solsw, sollw,frugs
    703 c
    704       ftsol(:,is_ter) = tsol
    705       ftsol(:,is_lic) = tsol
    706       ftsol(:,is_oce) = tsol
    707       ftsol(:,is_sic) = tsol
    708       snsrf(:,is_ter) = sn
    709       snsrf(:,is_lic) = sn
    710       snsrf(:,is_oce) = sn
    711       snsrf(:,is_sic) = sn
    712       falb1(:,is_ter) = 0.08
    713       falb1(:,is_lic) = 0.6
    714       falb1(:,is_oce) = 0.5
    715       falb1(:,is_sic) = 0.6
    716       falb2 = falb1
    717       evap(:,:) = 0.
    718       qsolsrf(:,is_ter) = 150
    719       qsolsrf(:,is_lic) = 150
    720       qsolsrf(:,is_oce) = 150.
    721       qsolsrf(:,is_sic) = 150.
    722       do i = 1, nbsrf
    723         do j = 1, nsoilmx
    724           tsoil(:,j,i) = tsol
    725         enddo
    726       enddo
    727       rain_fall = 0.; snow_fall = 0.
    728       solsw = 165.
    729       sollw = -53.
    730       t_ancien = 273.15
    731       q_ancien = 0.
    732       agesno = 0.
    733 c
    734       frugs(1:klon,is_oce) = rugmer(1:klon)
    735       frugs(1:klon,is_ter) = MAX(1.0e-05, zstd(1:klon)*zsig(1:klon)/2.0)
    736       frugs(1:klon,is_lic) = MAX(1.0e-05, zstd(1:klon)*zsig(1:klon)/2.0)
    737       frugs(1:klon,is_sic) = 0.001
    738       fder = 0.0
    739       clwcon = 0.0
    740       rnebcon = 0.0
    741       ratqs = 0.0
    742       run_off_lic_0 = 0.0
    743       rugoro = 0.0
    744 
    745 c
    746 c Avant l'appel a phyredem, on initialize les modules de surface
    747 c avec les valeurs qui vont etre ecrit dans startphy.nc
    748 c
    749       dummy = 1.0
    750       pbl_tke(:,:,:) = 1.e-8
    751       zmax0(:) = 40.
    752       f0(:) = 1.e-5
    753       ema_work1(:,:) = 0.
    754       ema_work2(:,:) = 0.
    755       wake_deltat(:,:) = 0.
    756       wake_deltaq(:,:) = 0.
    757       wake_s(:) = 0.
    758       wake_cstar(:) = 0.
    759       wake_fip(:) = 0.
    760 
    761       call fonte_neige_init(run_off_lic_0)
    762       call pbl_surface_init(qsol, fder, snsrf, qsolsrf,
    763      $     evap, frugs, agesno, tsoil)
    764 
    765       call phyredem("startphy.nc")
    766 
    767 
    768 
    769 C     Sortie Visu pour les champs dynamiques
    770 cc      if (1.eq.0 ) then
    771 cc      print*,'sortie visu'
    772 cc      time_step = 1.
    773 cc      t_ops = 2.
    774 cc      t_wrt = 2.
    775 cc      itau = 2.
    776 cc      visu_file='Etat0_visu.nc'
    777 cc      CALL initdynav(visu_file,dayref,anneeref,time_step,
    778 cc     .              t_ops, t_wrt, visuid)
    779 cc      CALL writedynav(visuid, itau,vvent ,
    780 cc     .                uvent,tpot,pk,phi,q3d,masse,psol,phis)
    781 cc      else
    782          print*,'CCCCCCCCCCCCCCCCCC REACTIVER SORTIE VISU DANS ETAT0'
    783 cc      endif
    784       print*,'entree histclo'
    785       CALL histclo
     137  co2_ppm0 = co2_ppm
     138
     139  dtvr   = daysec/FLOAT(day_step)
     140  WRITE(lunout,*)'dtvr',dtvr
     141
     142  CALL iniconst()
     143  CALL inigeom()
     144
     145!--- Initializations for tracers
     146  CALL infotrac_init
     147  ALLOCATE(q3d(iip1,jjp1,llm,nqtot))
     148
     149  CALL inifilr()
     150  CALL phys_state_var_init(read_climoz)
     151
     152  rlat(1) = ASIN(1.0)
     153  DO j=2,jjm; rlat((j-2)*iim+2:(j-1)*iim+1)=rlatu(j);     END DO
     154  rlat(klon) = - ASIN(1.0)
     155  rlat(:)=rlat(:)*(180.0/pi)
     156
     157  rlon(1) = 0.0
     158  DO j=2,jjm; rlon((j-2)*iim+2:(j-1)*iim+1)=rlonv(1:iim); END DO
     159  rlon(klon) = 0.0
     160  rlon(:)=rlon(:)*(180.0/pi)
     161
     162! For a coupled simulation, the ocean mask from ocean model is used to compute
     163! the weights an to insure ocean fractions are the same for atmosphere and ocean
     164! Otherwise, mask is created using Relief file.
     165
     166  WRITE(lunout,*)'Essai de lecture masque ocean'
     167  iret = NF90_OPEN("o2a.nc", NF90_NOWRITE, nid_o2a)
     168  IF(iret/=NF90_NOERR) THEN
     169    WRITE(lunout,*)'ATTENTION!! pas de fichier o2a.nc trouve'
     170    WRITE(lunout,*)'Run force'
     171    x='masque'
     172    masque(:,:)=0.0
     173    CALL startget(x, iip1, jjp1, rlonv, rlatu, masque, 0.0, jjm, rlonu,    &
     174                  rlatv, ib)
     175    WRITE(lunout,*)'MASQUE construit : Masque'
     176    WRITE(lunout,'(97I1)') nINT(masque)
     177    CALL gr_dyn_fi(1, iip1, jjp1, klon, masque, zmasq)
     178    WHERE(   zmasq(:)<EPSFRA) zmasq(:)=0.
     179    WHERE(1.-zmasq(:)<EPSFRA) zmasq(:)=1.
     180  ELSE
     181    couple=.true.
     182    iret=NF90_CLOSE(nid_o2a)
     183    CALL flininfo("o2a.nc", iml_omask, jml_omask, llm_tmp, ttm_tmp, nid_o2a)
     184    IF(iml_omask/=iim .OR.jml_omask/=jjp1) THEN
     185      WRITE(lunout,*)'Dimensions non compatibles pour masque ocean'
     186      WRITE(lunout,*)'iim = ',iim,' iml_omask = ',iml_omask
     187      WRITE(lunout,*)'jjp1 = ',jjp1,' jml_omask = ',jml_omask
     188      CALL abort_gcm('etat0_netcdf','Dimensions non compatibles pour masque oc&
     189     &ean',1)
     190    END IF
     191    ALLOCATE(  ocemask(iml_omask,jml_omask),   ocetmp(iml_omask,jml_omask))
     192    ALLOCATE(lon_omask(iml_omask,jml_omask),lat_omask(iml_omask,jml_omask))
     193    ALLOCATE(dlon_omask(iml_omask),dlat_omask(jml_omask))
     194    CALL flinopen("o2a.nc", .FALSE., iml_omask, jml_omask, llm_tmp,            &
     195                   lon_omask, lat_omask, lev, ttm_tmp, itaul, date, dt, fid)
     196    CALL flinget(fid,'OceMask',iml_omask,jml_omask,llm_tmp,ttm_tmp,1,1,ocetmp)
     197    CALL flinclo(fid)
     198    dlon_omask(:)=lon_omask(:,1)
     199    dlat_omask(:)=lat_omask(1,:)
     200    ocemask=ocetmp
     201    IF(dlat_omask(1)<dlat_omask(jml_omask)) THEN
     202      DO j=1,jml_omask
     203        ocemask(:,j) = ocetmp(:,jml_omask-j+1)
     204      END DO
     205    END IF
     206    ALLOCATE(   ocemask(iml_omask,jml_omask),   ocetmp(iml_omask,jml_omask))
     207    ALLOCATE( lon_omask(iml_omask,jml_omask),lat_omask(iml_omask,jml_omask))
     208    ALLOCATE(dlon_omask(iml_omask),         dlat_omask(jml_omask))
     209    CALL flinopen("o2a.nc", .FALSE., iml_omask, jml_omask, llm_tmp, lon_omask, &
     210                  lat_omask, lev, ttm_tmp, itaul, date, dt, fid)
     211    CALL flinget(fid, 'OceMask', iml_omask, jml_omask, llm_tmp, ttm_tmp,       &
     212                  1, 1, ocetmp)
     213    CALL flinclo(fid)
     214    dlon_omask(1:iml_omask) = lon_omask(1:iml_omask,1)
     215    dlat_omask(1:jml_omask) = lat_omask(1,1:jml_omask)
     216    ocemask = ocetmp
     217    IF(dlat_omask(1)<dlat_omask(jml_omask)) THEN
     218      DO j=1,jml_omask
     219        ocemask(:,j) = ocetmp(:,jml_omask-j+1)
     220      END DO
     221    END IF
     222!
     223! Ocean mask to physical grid
     224!*******************************************************************************
     225    WRITE(lunout,*)'ocemask '
     226    WRITE(fmt,"(i4,'i1)')")iml_omask ; fmt='('//ADJUSTL(fmt)
     227    WRITE(lunout,fmt)int(ocemask)
     228    ocemask_fi(1)=ocemask(1,1)
     229    DO j=2,jjm; ocemask_fi((j-2)*iim+1:iim+1)=ocemask(1:iim,j); END DO
     230    ocemask_fi(klon)=ocemask(1,jjp1)
     231    zmasq=1.-ocemask_fi
     232  END IF
     233
     234  CALL gr_fi_dyn(1,klon,iip1,jjp1,zmasq,masque)
     235
     236  ! The startget calls need to be replaced by a call to restget to get the
     237  ! values in the restart file
     238  x = 'relief'; orog(:,:) = 0.0
     239  CALL startget(x,iip1,jjp1,rlonv,rlatu,          orog, 0.0,jjm,rlonu,rlatv,ib,&
     240                masque)
     241
     242  x = 'rugosite'; rugo(:,:) = 0.0
     243  CALL startget(x,iip1,jjp1,rlonv,rlatu,          rugo, 0.0,jjm, rlonu,rlatv,ib)
     244!  WRITE(lunout,'(49I1)') INT(orog(:,:)*10)
     245!  WRITE(lunout,'(49I1)') INT(rugo(:,:)*10)
     246
     247! Sub-surfaces initialization
     248!*******************************************************************************
     249  pctsrf=0.
     250  x = 'psol'; psol(:,:) = 0.0
     251  CALL startget(x,iip1,jjp1,rlonv,rlatu,psol,0.0,jjm,rlonu,rlatv,ib)
     252!  WRITE(lunout,*) 'PSOL :', psol(10,20)
     253!  WRITE(lunout,*) ap(:), bp(:)
     254
     255! Mid-levels pressure computation
     256!*******************************************************************************
     257  CALL pression(ip1jmp1, ap, bp, psol, p3d)
     258  CALL exner_hyb(ip1jmp1, psol, p3d, alpha, beta, pks, pk, y)
     259  pls(:,:,:)=preff*(pk(:,:,:)/cpp)**(1./kappa)
     260!  WRITE(lunout,*) 'P3D :', p3d(10,20,:)
     261!  WRITE(lunout,*) 'PK:',    pk(10,20,:)
     262!  WRITE(lunout,*) 'PLS :', pls(10,20,:)
     263
     264  x = 'surfgeo'; phis(:,:) = 0.0
     265  CALL startget(x,iip1,jjp1,rlonv,rlatu,          phis, 0.0,jjm, rlonu,rlatv,ib)
     266
     267  x = 'u';    uvent(:,:,:) = 0.0
     268  CALL startget(x,iip1,jjp1,rlonu,rlatu,llm,pls,y,uvent,0.0,jjm, rlonv,rlatv,ib)
     269
     270  x = 'v';    vvent(:,:,:) = 0.0
     271  CALL startget(x,iip1,jjm, rlonv,rlatv,llm,pls,y,vvent,0.0,jjp1,rlonu,rlatu,ib)
     272
     273  x = 't';    t3d(:,:,:) = 0.0
     274  CALL startget(x,iip1,jjp1,rlonv,rlatu,llm,pls,y,t3d,  0.0,jjm, rlonu,rlatv,ib)
     275
     276  x = 'tpot'; tpot(:,:,:) = 0.0
     277  CALL startget(x,iip1,jjp1,rlonv,rlatu,llm,pls,pk,tpot,0.0,jjm, rlonu,rlatv,ib)
     278
     279  WRITE(lunout,*) 'T3D min,max:',minval(t3d(:,:,:)),maxval(t3d(:,:,:))
     280  WRITE(lunout,*) 'PLS min,max:',minval(pls(:,:,:)),maxval(pls(:,:,:))
     281
     282! Humidity at saturation computation
     283!*******************************************************************************
     284  WRITE(lunout,*) 'avant q_sat'
     285  CALL q_sat(llm*jjp1*iip1, t3d, pls, qsat)
     286  WRITE(lunout,*) 'apres q_sat'
     287  WRITE(lunout,*) 'QSAT min,max:',minval(qsat(:,:,:)),maxval(qsat(:,:,:))
     288!  WRITE(lunout,*) 'QSAT :',qsat(10,20,:)
     289
     290  x = 'q';    qd (:,:,:) = 0.0
     291  CALL startget(x,iip1,jjp1,rlonv,rlatu,llm,pls,qsat,qd,0.0,jjm, rlonu,rlatv,ib)
     292  q3d(:,:,:,:) = 0.0 ; q3d(:,:,:,1) = qd(:,:,:)
     293
     294!--- OZONE CLIMATOLOGY
     295  IF(read_climoz>=1) CALL regr_lat_time_climoz(read_climoz)
     296
     297  x = 'tsol'; tsol(:) = 0.0
     298  CALL startget(x,iip1,jjp1,rlonv,rlatu,klon,tsol,  0.0,jjm,rlonu,rlatv,ib)
     299
     300  x = 'qsol';  qsol(:) = 0.0
     301  CALL startget(x,iip1,jjp1,rlonv,rlatu,klon,qsol,  0.0,jjm,rlonu,rlatv,ib)
     302
     303  x = 'snow';  sn(:) = 0.0
     304  CALL startget(x,iip1,jjp1,rlonv,rlatu,klon,sn,    0.0,jjm,rlonu,rlatv,ib)
     305
     306  x = 'rads';  radsol(:) = 0.0
     307  CALL startget(x,iip1,jjp1,rlonv,rlatu,klon,radsol,0.0,jjm,rlonu,rlatv,ib)
     308
     309  x = 'rugmer'; rugmer(:) = 0.0
     310  CALL startget(x,iip1,jjp1,rlonv,rlatu,klon,rugmer,0.0,jjm,rlonu,rlatv,ib)
     311
     312  x = 'zmea';  zmea(:) = 0.0
     313  CALL startget(x,iip1,jjp1,rlonv,rlatu,klon,zmea,  0.0,jjm,rlonu,rlatv,ib)
     314
     315  x = 'zstd';  zstd(:) = 0.0
     316  CALL startget(x,iip1,jjp1,rlonv,rlatu,klon,zstd,  0.0,jjm,rlonu,rlatv,ib)
     317
     318  x = 'zsig';  zsig(:) = 0.0
     319  CALL startget(x,iip1,jjp1,rlonv,rlatu,klon,zsig,  0.0,jjm,rlonu,rlatv,ib)
     320
     321  x = 'zgam';  zgam(:) = 0.0
     322  CALL startget(x,iip1,jjp1,rlonv,rlatu,klon,zgam,  0.0,jjm,rlonu,rlatv,ib)
     323
     324  x = 'zthe';  zthe(:) = 0.0
     325  CALL startget(x,iip1,jjp1,rlonv,rlatu,klon,zthe,  0.0,jjm,rlonu,rlatv,ib)
     326
     327  x = 'zpic';  zpic(:) = 0.0
     328  CALL startget(x,iip1,jjp1,rlonv,rlatu,klon,zpic,  0.0,jjm,rlonu,rlatv,ib)
     329
     330  x = 'zval';  zval(:) = 0.0
     331  CALL startget(x,iip1,jjp1,rlonv,rlatu,klon,zval,  0.0,jjm,rlonu,rlatv,ib)
     332
     333!  WRITE(lunout,'(48I3)') 'TSOL :', INT(tsol(2:klon)-273)
     334
     335! Soil ice file reading for soil fraction and soil ice fraction
     336!*******************************************************************************
     337  CALL flininfo("landiceref.nc", iml_lic, jml_lic, llm_tmp, ttm_tmp, fid)
     338  ALLOCATE( lat_lic(iml_lic,jml_lic),lon_lic(iml_lic, jml_lic))
     339  ALLOCATE(dlat_lic(jml_lic),       dlon_lic(iml_lic))
     340  ALLOCATE( fraclic(iml_lic,jml_lic))
     341  CALL flinopen("landiceref.nc", .FALSE., iml_lic, jml_lic, llm_tmp,           &
     342                lon_lic, lat_lic, lev, ttm_tmp, itaul, date, dt, fid)
     343  CALL flinget(fid, 'landice', iml_lic, jml_lic, llm_tmp, ttm_tmp, 1,1, fraclic)
     344  CALL flinclo(fid)
     345
     346! Interpolation on model T-grid
     347!*******************************************************************************
     348  WRITE(lunout,*)'dimensions de landice iml_lic, jml_lic : ',iml_lic,jml_lic
     349! conversion if coordinates are in degrees
     350  IF(MAXVAL(lon_lic)>pi) lon_lic=lon_lic*pi/180.
     351  IF(MAXVAL(lat_lic)>pi) lat_lic=lat_lic*pi/180.
     352  dlon_lic(:)=lon_lic(:,1)
     353  dlat_lic(:)=lat_lic(1,:)
     354  CALL grille_m( iml_lic, jml_lic, dlon_lic, dlat_lic, fraclic, iim,jjp1,      &
     355                 rlonv, rlatu, flic_tmp(1:iim,:) )
     356  flic_tmp(iip1,:)=flic_tmp(1,:)
     357
     358!--- To the physical grid
     359  CALL gr_dyn_fi(1, iip1, jjp1, klon, flic_tmp, pctsrf(:,is_lic))
     360
     361!--- Adequation with soil/sea mask
     362  WHERE(pctsrf(:,is_lic)<EPSFRA) pctsrf(:,is_lic)=0.
     363  WHERE(zmasq(:)<EPSFRA)         pctsrf(:,is_lic)=0.
     364  pctsrf(:,is_ter)=zmasq(:)
     365  DO ji=1,klon
     366    IF(zmasq(ji)>EPSFRA) THEN
     367      IF(pctsrf(ji,is_lic)>=zmasq(ji)) THEN
     368        pctsrf(ji,is_lic)=zmasq(ji)
     369        pctsrf(ji,is_ter)=0.
     370      ELSE
     371        pctsrf(ji,is_ter)=zmasq(ji)-pctsrf(ji,is_lic)
     372        IF(pctsrf(ji,is_ter)<EPSFRA) THEN
     373          pctsrf(ji,is_ter)=0.
     374          pctsrf(ji,is_lic)=zmasq(ji)
     375        END IF
     376      END IF
     377    END IF
     378  END DO
     379
     380! sub-surface ocean and sea ice (sea ice set to zero for start)
     381!*******************************************************************************
     382  pctsrf(:,is_oce)=(1.-zmasq(:))
     383  WHERE(pctsrf(:,is_oce)<EPSFRA) pctsrf(:,is_oce)=0.
     384  IF(couple) pctsrf(:,is_oce)=ocemask_fi(:)
     385  isst=0
     386  WHERE(pctsrf(2:klon-1,is_oce)>0.) isst=1
     387
     388! It is checked that the sub-surfaces sum is equal to 1
     389!*******************************************************************************
     390  ji=COUNT((ABS(SUM(pctsrf(:,:),dim=2))-1.0)>EPSFRA)
     391  IF(ji/=0) WRITE(lunout,*) 'pb repartition sous maille pour ',ji,' points'
     392  CALL gr_fi_ecrit(1, klon, iim, jjp1, zmasq, zx_tmp_2d)
     393!  WRITE(fmt,"(i3,')')")iim; fmt='(i'//ADJUSTL(fmt)
     394!  WRITE(lunout,*)'zmasq = '
     395!  WRITE(lunout,TRIM(fmt))NINT(zx_tmp_2d)
     396  CALL gr_fi_dyn(1, klon, iip1, jjp1, zmasq, masque)
     397  WRITE(fmt,"(i4,'i1)')")iip1 ; fmt='('//ADJUSTL(fmt)
     398  WRITE(lunout,*) 'MASQUE construit : Masque'
     399  WRITE(lunout,TRIM(fmt))NINT(masque(:,:))
     400
     401! Intermediate computation
     402!*******************************************************************************
     403  CALL massdair(p3d,masse)
     404  WRITE(lunout,*)' ALPHAX ',alphax
     405  DO l=1,llm
     406    xppn(:)=aire(1:iim,1   )*masse(1:iim,1   ,l)
     407    xpps(:)=aire(1:iim,jjp1)*masse(1:iim,jjp1,l)
     408    xpn=SUM(xppn)/apoln
     409    xps=SUM(xpps)/apols
     410    masse(:,1   ,l)=xpn
     411    masse(:,jjp1,l)=xps
     412  END DO
     413  q3d(iip1,:,:,:)=q3d(1,:,:,:)
     414  phis(iip1,:) = phis(1,:)
     415
     416  IF(.NOT.letat0) RETURN
     417
     418! Writing
     419!*******************************************************************************
     420  CALL inidissip(lstardis,nitergdiv,nitergrot,niterh,tetagdiv,tetagrot,tetatemp)
     421  WRITE(lunout,*)'sortie inidissip'
     422  itau=0
     423  itau_dyn=0
     424  itau_phy=0
     425  iday=dayref+itau/day_step
     426  time=FLOAT(itau-(iday-dayref)*day_step)/day_step
     427  IF(time>1.) THEN
     428   time=time-1
     429   iday=iday+1
     430  END IF
     431  day_ref=dayref
     432  annee_ref=anneeref
     433
     434  CALL geopot( ip1jmp1, tpot, pk, pks, phis, phi )
     435  WRITE(lunout,*)'sortie geopot'
     436
     437  CALL caldyn0( itau, uvent, vvent, tpot, psol, masse, pk, phis,               &
     438                phi,  w, pbaru, pbarv, time+iday-dayref)
     439  WRITE(lunout,*)'sortie caldyn0'     
     440  CALL dynredem0( "start.nc", dayref, phis)
     441  WRITE(lunout,*)'sortie dynredem0'
     442  CALL dynredem1( "start.nc", 0.0, vvent, uvent, tpot, q3d, masse, psol)
     443  WRITE(lunout,*)'sortie dynredem1'
     444
     445! Physical initial state writting
     446!*******************************************************************************
     447  WRITE(lunout,*)'phystep ',dtvr,iphysiq,nbapp_rad
     448  phystep   = dtvr * FLOAT(iphysiq)
     449  radpas    = NINT (86400./phystep/ FLOAT(nbapp_rad) )
     450  WRITE(lunout,*)'phystep =', phystep, radpas
     451
     452! Init: tsol, qsol, sn, evap, tsoil, rain_fall, snow_fall, solsw, sollw, frugs
     453!*******************************************************************************
     454  DO i=1,nbsrf; ftsol(:,i) = tsol; END DO
     455  DO i=1,nbsrf; snsrf(:,i) = sn;   END DO
     456  falb1(:,is_ter) = 0.08; falb1(:,is_lic) = 0.6
     457  falb1(:,is_oce) = 0.5;  falb1(:,is_sic) = 0.6
     458  falb2 = falb1
     459  evap(:,:) = 0.
     460  DO i=1,nbsrf; qsolsrf(:,i)=150.; END DO
     461  DO i=1,nbsrf; DO j=1,nsoilmx; tsoil(:,j,i) = tsol; END DO; END DO
     462  rain_fall = 0.; snow_fall = 0.
     463  solsw = 165.;   sollw = -53.
     464  t_ancien = 273.15
     465  q_ancien = 0.
     466  agesno = 0.
     467  frugs(:,is_oce) = rugmer(:)
     468  frugs(:,is_ter) = MAX(1.0e-05,zstd(:)*zsig(:)/2.0)
     469  frugs(:,is_lic) = MAX(1.0e-05,zstd(:)*zsig(:)/2.0)
     470  frugs(:,is_sic) = 0.001
     471  fder = 0.0
     472  clwcon = 0.0
     473  rnebcon = 0.0
     474  ratqs = 0.0
     475  run_off_lic_0 = 0.0
     476  rugoro = 0.0
     477
     478! Before phyredem calling, surface modules and values to be saved in startphy.nc
     479! are initialized
     480!*******************************************************************************
     481  dummy = 1.0
     482  pbl_tke(:,:,:) = 1.e-8
     483  zmax0(:) = 40.
     484  f0(:) = 1.e-5
     485  ema_work1(:,:) = 0.
     486  ema_work2(:,:) = 0.
     487  wake_deltat(:,:) = 0.
     488  wake_deltaq(:,:) = 0.
     489  wake_s(:) = 0.
     490  wake_cstar(:) = 0.
     491  wake_fip(:) = 0.
     492  CALL fonte_neige_init(run_off_lic_0)
     493  CALL pbl_surface_init( qsol, fder, snsrf, qsolsrf, evap, frugs, agesno, tsoil )
     494  CALL phyredem( "startphy.nc" )
     495
     496  WRITE(lunout,*)'CCCCCCCCCCCCCCCCCC REACTIVER SORTIE VISU DANS ETAT0'
     497  WRITE(lunout,*)'entree histclo'
     498  CALL histclo()
    786499
    787500#endif
    788501!#endif of #ifdef CPP_EARTH
    789       RETURN
    790       !
    791       END SUBROUTINE etat0_netcdf
     502  RETURN
     503
     504END SUBROUTINE etat0_netcdf
     505!
     506!-------------------------------------------------------------------------------
Note: See TracChangeset for help on using the changeset viewer.