!
! $Id: phys_state_var_mod.F90 5776 2025-07-15 12:13:19Z evignon $
!
      MODULE phys_state_var_mod
! Variables sauvegardees pour le startphy.nc
!======================================================================
!
!
!======================================================================
! Declaration des variables
      USE dimphy
      USE dimsoil_mod_h, ONLY: nsoilmx
      USE netcdf, only: nf90_fill_real
      INTEGER, PARAMETER :: nlevSTD=17
      INTEGER, PARAMETER :: nlevSTD8=8
      INTEGER, PARAMETER :: nlevSTD3=3
      INTEGER, PARAMETER :: nout=10
      INTEGER, PARAMETER :: napisccp=1
      INTEGER, SAVE :: radpas  ! radiation is called every "radpas" step
      INTEGER, SAVE :: cvpas   ! convection is called every "cvpas" step
      INTEGER, SAVE :: cvpas_0 = 1 ! reference value for cvpas
      INTEGER, SAVE :: wkpas   ! wake scheme is called every "wkpas" step
      REAL, PARAMETER :: missing_val_nf90=nf90_fill_real
!$OMP THREADPRIVATE(radpas)
!$OMP THREADPRIVATE(cvpas)
!$OMP THREADPRIVATE(cvpas_0)
!$OMP THREADPRIVATE(wkpas)
      REAL, SAVE :: phys_tstep=0, solaire_etat0
!$OMP THREADPRIVATE(phys_tstep, solaire_etat0)

      REAL, ALLOCATABLE, SAVE :: pctsrf(:,:)
!$OMP THREADPRIVATE(pctsrf)
      REAL, ALLOCATABLE, SAVE :: ftsol(:,:)
!$OMP THREADPRIVATE(ftsol)
      REAL, ALLOCATABLE, SAVE :: beta_aridity(:,:)
!$OMP THREADPRIVATE(beta_aridity)
      REAL,ALLOCATABLE,SAVE :: qsol(:),fevap(:,:),z0m(:,:),z0h(:,:),agesno(:,:)
!$OMP THREADPRIVATE(qsol,fevap,z0m,z0h,agesno)
!FC drag des arbres
      REAL, ALLOCATABLE, SAVE :: treedrg(:,:,:)
!$OMP THREADPRIVATE(treedrg)
!AM land surface heterogeneities 
      REAL, SAVE :: alpha_soil_tersrf
!$OMP THREADPRIVATE(alpha_soil_tersrf)
      REAL, SAVE :: period_tersrf
!$OMP THREADPRIVATE(period_tersrf)
      REAL, ALLOCATABLE, SAVE :: frac_tersrf(:,:)
!$OMP THREADPRIVATE(frac_tersrf)
      REAL, ALLOCATABLE, SAVE :: z0m_tersrf(:,:)
!$OMP THREADPRIVATE(z0m_tersrf)
      REAL, ALLOCATABLE, SAVE :: ratio_z0m_z0h_tersrf(:,:)
!$OMP THREADPRIVATE(ratio_z0m_z0h_tersrf)
      REAL, ALLOCATABLE, SAVE :: albedo_tersrf(:,:)
!$OMP THREADPRIVATE(albedo_tersrf)
      REAL, ALLOCATABLE, SAVE :: beta_tersrf(:,:)
!$OMP THREADPRIVATE(beta_tersrf)
      REAL, ALLOCATABLE, SAVE :: inertie_tersrf(:,:)
!$OMP THREADPRIVATE(inertie_tersrf)
      REAL, ALLOCATABLE, SAVE :: hcond_tersrf(:,:)
!$OMP THREADPRIVATE(hcond_tersrf)
      REAL, ALLOCATABLE, SAVE :: tsurfi_tersrf(:,:)
!$OMP THREADPRIVATE(tsurfi_tersrf)
      REAL, ALLOCATABLE, SAVE :: tsoili_tersrf(:,:,:)
!$OMP THREADPRIVATE(tsoili_tersrf)
      REAL, ALLOCATABLE, SAVE :: tsoil_depth(:,:,:)
!$OMP THREADPRIVATE(tsoil_depth)
      REAL, ALLOCATABLE, SAVE :: tsurf_tersrf(:,:)
!$OMP THREADPRIVATE(tsurf_tersrf)
     REAL, ALLOCATABLE, SAVE :: tsoil_tersrf(:,:,:)
!$OMP THREADPRIVATE(tsoil_tersrf)
      REAL, ALLOCATABLE, SAVE :: qsurf_tersrf(:,:)
!$OMP THREADPRIVATE(qsurf_tersrf)
      REAL, ALLOCATABLE, SAVE :: tsurf_new_tersrf(:,:)
!$OMP THREADPRIVATE(tsurf_new_tersrf)
      REAL, ALLOCATABLE, SAVE :: cdragm_tersrf(:,:)
!$OMP THREADPRIVATE(cdragm_tersrf)
      REAL, ALLOCATABLE, SAVE :: cdragh_tersrf(:,:)
!$OMP THREADPRIVATE(cdragh_tersrf)
      REAL, ALLOCATABLE, SAVE :: swnet_tersrf(:,:)
!$OMP THREADPRIVATE(swnet_tersrf)
      REAL, ALLOCATABLE, SAVE :: lwnet_tersrf(:,:)
!$OMP THREADPRIVATE(lwnet_tersrf)
      REAL, ALLOCATABLE, SAVE :: fluxsens_tersrf(:,:)
!$OMP THREADPRIVATE(fluxsens_tersrf)
      REAL, ALLOCATABLE, SAVE :: fluxlat_tersrf(:,:)
!$OMP THREADPRIVATE(fluxlat_tersrf)

!      character(len=6), SAVE :: ocean
!!!!!!$OMP THREADPRIVATE(ocean)
!      logical, SAVE :: ok_veget 
!!!!!!$OMP THREADPRIVATE(ok_veget)
      REAL, ALLOCATABLE, SAVE :: falb1(:,:), falb2(:,:)
!$OMP THREADPRIVATE(falb1, falb2)

!albedo SB >>>
      REAL, ALLOCATABLE, SAVE :: falb_dif(:,:,:), falb_dir(:,:,:)
      REAL, ALLOCATABLE, SAVE :: chl_con(:)
!$OMP THREADPRIVATE(falb_dir,falb_dif,chl_con)
!albedo SB <<<


      REAL, ALLOCATABLE, SAVE :: rain_fall(:), snow_fall(:), bs_fall(:)
!$OMP THREADPRIVATE( rain_fall, snow_fall, bs_fall)
      REAL, ALLOCATABLE, SAVE :: solsw(:), solswfdiff(:), sollw(:)
!$OMP THREADPRIVATE(solsw, solswfdiff, sollw)
      REAL, ALLOCATABLE, SAVE :: radsol(:)
!$OMP THREADPRIVATE(radsol)
      REAL, ALLOCATABLE, SAVE :: swradcorr(:)
!$OMP THREADPRIVATE(swradcorr)
#ifdef ISO
      REAL,ALLOCATABLE,SAVE :: xtsol(:,:),fxtevap(:,:,:)
!$OMP THREADPRIVATE(xtsol,fxtevap)
      REAL, ALLOCATABLE, SAVE :: xtrain_fall(:,:), xtsnow_fall(:,:)
!$OMP THREADPRIVATE(xtrain_fall,xtsnow_fall)
#endif

!clesphy0 param physiq
!
! Parametres de l'Orographie a l'Echelle Sous-Maille (OESM):
!
      REAL, ALLOCATABLE, SAVE :: zmea(:), zstd(:), zsig(:), zgam(:)
!$OMP THREADPRIVATE(zmea, zstd, zsig, zgam)
      REAL, ALLOCATABLE, SAVE :: zthe(:), zpic(:), zval(:)
!$OMP THREADPRIVATE(zthe, zpic, zval)
!     REAL tabcntr0(100)
      REAL, ALLOCATABLE, SAVE :: rugoro(:)
!$OMP THREADPRIVATE(rugoro)
      REAL, ALLOCATABLE, SAVE :: t_ancien(:,:), q_ancien(:,:)
!$OMP THREADPRIVATE(t_ancien, q_ancien)
      REAL, ALLOCATABLE, SAVE :: ql_ancien(:,:), qs_ancien(:,:), qbs_ancien(:,:)
!$OMP THREADPRIVATE(ql_ancien, qs_ancien, qbs_ancien)
      REAL, ALLOCATABLE, SAVE :: prw_ancien(:), prlw_ancien(:), prsw_ancien(:), prbsw_ancien(:)
!$OMP THREADPRIVATE(prw_ancien, prlw_ancien, prsw_ancien, prbsw_ancien)
#ifdef ISO
      REAL, ALLOCATABLE, SAVE :: xt_ancien(:,:,:),xtl_ancien(:,:,:),xts_ancien(:,:,:), xtbs_ancien(:,:,:)
!$OMP THREADPRIVATE(xt_ancien,xtl_ancien,xts_ancien,xtbs_ancien)
#endif
      REAL, ALLOCATABLE, SAVE :: u_ancien(:,:), v_ancien(:,:)
!$OMP THREADPRIVATE(u_ancien, v_ancien)
      REAL, ALLOCATABLE, SAVE :: cf_ancien(:,:), rvc_ancien(:,:)
!$OMP THREADPRIVATE(cf_ancien, rvc_ancien)
       REAL, ALLOCATABLE, SAVE :: tke_ancien(:,:)
!$OMP THREADPRIVATE(tke_ancien)
!!! RomP >>>
      REAL, ALLOCATABLE, SAVE :: tr_ancien(:,:,:)
!$OMP THREADPRIVATE(tr_ancien)
!!! RomP <<<
      LOGICAL, SAVE :: ancien_ok
!$OMP THREADPRIVATE(ancien_ok)
      REAL, ALLOCATABLE, SAVE :: clwcon(:,:),rnebcon(:,:)
!$OMP THREADPRIVATE(clwcon,rnebcon)
      REAL, ALLOCATABLE, SAVE :: qtc_cv(:,:),sigt_cv(:,:),detrain_cv(:,:),fm_cv(:,:)
!$OMP THREADPRIVATE(qtc_cv,sigt_cv,detrain_cv,fm_cv)
      REAL, ALLOCATABLE, SAVE :: ratqs(:,:)
!$OMP THREADPRIVATE(ratqs)
      REAL, ALLOCATABLE, SAVE :: pbl_tke(:,:,:) ! turb kinetic energy
      REAL, ALLOCATABLE, SAVE :: coefh(:,:,:) ! Kz enthalpie
      REAL, ALLOCATABLE, SAVE :: coefm(:,:,:) ! Kz momentum
!$OMP THREADPRIVATE(pbl_tke, coefh,coefm)
      REAL, ALLOCATABLE, SAVE :: zmax0(:), f0(:) ! 
!$OMP THREADPRIVATE(zmax0,f0)
      REAL, ALLOCATABLE, SAVE :: sig1(:,:), w01(:,:)
!$OMP THREADPRIVATE(sig1,w01)
      REAL, ALLOCATABLE, SAVE :: entr_therm(:,:), fm_therm(:,:)
!$OMP THREADPRIVATE(entr_therm,fm_therm)
      REAL, ALLOCATABLE, SAVE :: detr_therm(:,:)
!$OMP THREADPRIVATE(detr_therm)
!IM 150408
!     pour phsystoke avec thermiques
      REAL,ALLOCATABLE,SAVE :: clwcon0th(:,:),rnebcon0th(:,:)
!$OMP THREADPRIVATE(clwcon0th,rnebcon0th)
! radiation outputs
!FC
      REAL,ALLOCATABLE,SAVE :: lwtoab(:,:), lwtoa0b(:,:)
!$OMP THREADPRIVATE(lwtoab,lwtoa0b)
      REAL,ALLOCATABLE,SAVE :: lwtoabp(:,:), lwtoa0bp(:,:)
!$OMP THREADPRIVATE(lwtoabp,lwtoa0bp)
! FC
      REAL,ALLOCATABLE,SAVE :: swdnc0(:,:), swdn0(:,:), swdn(:,:)
!$OMP THREADPRIVATE(swdnc0,swdn0,swdn)
      REAL,ALLOCATABLE,SAVE :: swupc0(:,:), swup0(:,:), swup(:,:)
!$OMP THREADPRIVATE(swupc0, swup0,swup)
      REAL,ALLOCATABLE,SAVE :: SWdn200clr(:), SWdn200(:)
!$OMP THREADPRIVATE(SWdn200clr,SWdn200)
      REAL,ALLOCATABLE,SAVE :: SWup200clr(:), SWup200(:)
!$OMP THREADPRIVATE(SWup200clr,SWup200)
      REAL,ALLOCATABLE,SAVE :: lwdnc0(:,:), lwdn0(:,:), lwdn(:,:)
!$OMP THREADPRIVATE(lwdnc0,lwdn0,lwdn)
      REAL,ALLOCATABLE,SAVE :: lwupc0(:,:), lwup0(:,:), lwup(:,:)
!$OMP THREADPRIVATE(lwupc0,lwup0,lwup)
      REAL,ALLOCATABLE,SAVE :: LWdn200clr(:), LWdn200(:)
!$OMP THREADPRIVATE(LWdn200clr,LWdn200)
      REAL,ALLOCATABLE,SAVE :: LWup200clr(:), LWup200(:)
!$OMP THREADPRIVATE(LWup200clr,LWup200)
      REAL,ALLOCATABLE,SAVE :: LWdnTOA(:), LWdnTOAclr(:)
!$OMP THREADPRIVATE(LWdnTOA,LWdnTOAclr)
! pressure level
      REAL,ALLOCATABLE,SAVE :: tsumSTD(:,:,:)
!$OMP THREADPRIVATE(tsumSTD)
      REAL,ALLOCATABLE,SAVE :: usumSTD(:,:,:), vsumSTD(:,:,:)
!$OMP THREADPRIVATE(usumSTD,vsumSTD)
      REAL,ALLOCATABLE,SAVE :: wsumSTD(:,:,:), phisumSTD(:,:,:)
!$OMP THREADPRIVATE(wsumSTD,phisumSTD)
      REAL,ALLOCATABLE,SAVE :: qsumSTD(:,:,:), rhsumSTD(:,:,:)
!$OMP THREADPRIVATE(qsumSTD,rhsumSTD)
      REAL,ALLOCATABLE,SAVE :: tnondef(:,:,:) 
!$OMP THREADPRIVATE(tnondef)
      REAL,ALLOCATABLE,SAVE :: uvsumSTD(:,:,:)
!$OMP THREADPRIVATE(uvsumSTD)
      REAL,ALLOCATABLE,SAVE :: vqsumSTD(:,:,:)
!$OMP THREADPRIVATE(vqsumSTD)
      REAL,ALLOCATABLE,SAVE :: vTsumSTD(:,:,:)
!$OMP THREADPRIVATE(vTsumSTD)
      REAL,ALLOCATABLE,SAVE :: wqsumSTD(:,:,:)
!$OMP THREADPRIVATE(wqsumSTD)
      REAL,ALLOCATABLE,SAVE :: vphisumSTD(:,:,:)
!$OMP THREADPRIVATE(vphisumSTD)
      REAL,ALLOCATABLE,SAVE :: wTsumSTD(:,:,:)
!$OMP THREADPRIVATE(wTsumSTD)
      REAL,ALLOCATABLE,SAVE :: u2sumSTD(:,:,:)
!$OMP THREADPRIVATE(u2sumSTD)
      REAL,ALLOCATABLE,SAVE :: v2sumSTD(:,:,:)
!$OMP THREADPRIVATE(v2sumSTD)
      REAL,ALLOCATABLE,SAVE :: T2sumSTD(:,:,:)
!$OMP THREADPRIVATE(T2sumSTD)
      REAL,ALLOCATABLE,SAVE :: O3sumSTD(:,:,:), O3daysumSTD(:,:,:)
!$OMP THREADPRIVATE(O3sumSTD,O3daysumSTD) 
!GG
      REAL,ALLOCATABLE,SAVE :: hice(:)
!$OMP THREADPRIVATE(hice)
      REAL,ALLOCATABLE,SAVE :: tice(:)
!$OMP THREADPRIVATE(tice)
      REAL,ALLOCATABLE,SAVE :: bilg_cumul(:)
!$OMP THREADPRIVATE(bilg_cumul)
!GG
!IM begin
      REAL,ALLOCATABLE,SAVE :: wlevSTD(:,:), ulevSTD(:,:), vlevSTD(:,:)
!$OMP THREADPRIVATE(wlevSTD,ulevSTD,vlevSTD)
      REAL,ALLOCATABLE,SAVE :: tlevSTD(:,:), qlevSTD(:,:), rhlevSTD(:,:)
!$OMP THREADPRIVATE(tlevSTD,qlevSTD,rhlevSTD)
      REAL,ALLOCATABLE,SAVE :: philevSTD(:,:)
!$OMP THREADPRIVATE(philevSTD)
      REAL,ALLOCATABLE,SAVE :: uvSTD(:,:)
!$OMP THREADPRIVATE(uvSTD)
      REAL,ALLOCATABLE,SAVE :: vqSTD(:,:)
!$OMP THREADPRIVATE(vqSTD)
      REAL,ALLOCATABLE,SAVE :: vTSTD(:,:)
!$OMP THREADPRIVATE(vTSTD)
      REAL,ALLOCATABLE,SAVE :: wqSTD(:,:)
!$OMP THREADPRIVATE(wqSTD)
      REAL,ALLOCATABLE,SAVE :: vphiSTD(:,:)
!$OMP THREADPRIVATE(vphiSTD)
      REAL,ALLOCATABLE,SAVE :: wTSTD(:,:)
!$OMP THREADPRIVATE(wTSTD)
      REAL,ALLOCATABLE,SAVE :: u2STD(:,:)
!$OMP THREADPRIVATE(u2STD)
      REAL,ALLOCATABLE,SAVE :: v2STD(:,:) 
!$OMP THREADPRIVATE(v2STD)
      REAL,ALLOCATABLE,SAVE :: T2STD(:,:)
!$OMP THREADPRIVATE(T2STD)
      REAL,ALLOCATABLE,SAVE :: O3STD(:,:), O3daySTD(:,:)
!$OMP THREADPRIVATE(O3STD,O3daySTD)
!IM end
      INTEGER,ALLOCATABLE,SAVE :: seed_old(:,:)
!$OMP THREADPRIVATE(seed_old)
      REAL,ALLOCATABLE,SAVE :: zuthe(:),zvthe(:)
!$OMP THREADPRIVATE(zuthe,zvthe)
      REAL,ALLOCATABLE,SAVE :: alb_neig(:)
!$OMP THREADPRIVATE(alb_neig)
!cloud base mass flux
      REAL,ALLOCATABLE,SAVE :: ema_cbmf(:)
!$OMP THREADPRIVATE(ema_cbmf)
!cloud base pressure & cloud top pressure
      REAL,ALLOCATABLE,SAVE :: ema_pcb(:), ema_pct(:)
!$OMP THREADPRIVATE(ema_pcb,ema_pct)
      REAL,ALLOCATABLE,SAVE :: Mipsh(:,:)     ! mass flux shed from  adiab. ascents
!$OMP THREADPRIVATE(Mipsh)
      REAL,ALLOCATABLE,SAVE :: Ma(:,:)       ! undilute upward mass flux
!$OMP THREADPRIVATE(Ma)
      REAL,ALLOCATABLE,SAVE :: qcondc(:,:)    ! in-cld water content from convect
!$OMP THREADPRIVATE(qcondc)
      REAL,ALLOCATABLE,SAVE :: wd(:) ! sb
!$OMP THREADPRIVATE(wd)
      REAL,ALLOCATABLE,SAVE :: sigd(:)
!$OMP THREADPRIVATE(sigd)
!
      REAL,ALLOCATABLE,SAVE :: cin(:)
!$OMP THREADPRIVATE(cin)
! ftd : convective heating due to unsaturated downdraughts
      REAL,ALLOCATABLE,SAVE :: ftd(:,:)
!$OMP THREADPRIVATE(ftd)
! fqd : convective moistening due to unsaturated downdraughts
      REAL,ALLOCATABLE,SAVE :: fqd(:,:),fqcomp(:,:)     
!$OMP THREADPRIVATE(fqd,fqcomp)
#ifdef ISO
      REAL, ALLOCATABLE, SAVE :: fxtd(:,:,:)
!$OMP THREADPRIVATE(fxtd)
#endif
!34EK
! -- Variables de controle de ALE et ALP
!ALE : Energie disponible pour soulevement : utilisee par la 
!      convection d'Emanuel pour le declenchement et la regulation
      REAL,ALLOCATABLE,SAVE :: ALE(:)
!$OMP THREADPRIVATE(ALE)
!ALP : Puissance  disponible pour soulevement
      REAL,ALLOCATABLE,SAVE :: ALP(:)
!$OMP THREADPRIVATE(ALP)
!
! nouvelles variables pour le couplage convection-couche limite
      REAL,ALLOCATABLE,SAVE :: Ale_bl(:)
!$OMP THREADPRIVATE(Ale_bl)
      REAL,ALLOCATABLE,SAVE :: Alp_bl(:)
!$OMP THREADPRIVATE(Alp_bl)
      INTEGER,ALLOCATABLE,SAVE :: lalim_conv(:)
!$OMP THREADPRIVATE(lalim_conv)
      REAL,ALLOCATABLE,SAVE :: wght_th(:,:)
!$OMP THREADPRIVATE(wght_th)
      REAL,ALLOCATABLE,SAVE    :: ale_wake(:)
!$OMP THREADPRIVATE(ale_wake)
      REAL,ALLOCATABLE,SAVE    :: ale_bl_stat(:)
!$OMP THREADPRIVATE(ale_bl_stat)
!
! variables de la wake
! wake_deltat : ecart de temperature avec la zone non perturbee
! wake_deltaq : ecart d'humidite avec la zone non perturbee
! wake_s      : fraction surfacique occupee par la poche froide
! awake_s     : surface fraction covered by active wakes
! wake_dens   : number of wakes per unit area
! awake_dens  : number of active wakes per unit area
! cv_gen      : birth rate of cumulonimbus per unit area.
! wake_occ    : occurence of wakes (= 1 if wakes occur, =0 otherwise)
! wake_Cstar  : vitesse d'etalement de la poche
! wake_pe     : wake potential energy - WAPE
! wake_fip    : Gust Front Impinging power - ALP
      REAL,ALLOCATABLE,SAVE :: wake_deltat(:,:)
!$OMP THREADPRIVATE(wake_deltat)
      REAL,ALLOCATABLE,SAVE :: wake_deltaq(:,:)
!$OMP THREADPRIVATE(wake_deltaq)
#ifdef ISO
      REAL, ALLOCATABLE, SAVE :: wake_deltaxt(:,:,:)
!$OMP THREADPRIVATE(wake_deltaxt)
#endif
      REAL,ALLOCATABLE,SAVE :: wake_s(:), awake_s(:)
!$OMP THREADPRIVATE(wake_s, awake_s)
      REAL,ALLOCATABLE,SAVE :: wake_dens(:), awake_dens(:)
!$OMP THREADPRIVATE(wake_dens, awake_dens)
      REAL,ALLOCATABLE,SAVE :: cv_gen(:)
!$OMP THREADPRIVATE(cv_gen)
      REAL,ALLOCATABLE,SAVE :: wake_Cstar(:)
!$OMP THREADPRIVATE(wake_Cstar)
      REAL,ALLOCATABLE,SAVE :: wake_pe(:)
!$OMP THREADPRIVATE(wake_pe)
      REAL,ALLOCATABLE,SAVE :: wake_fip(:)
!$OMP THREADPRIVATE(wake_fip)
!
!jyg<
! variables related to the spitting of the PBL between wake and 
! off-wake regions.
! wake_delta_pbl_TKE : difference TKE_w - TKE_x
      REAL,ALLOCATABLE,SAVE :: wake_delta_pbl_TKE(:,:,:)
!$OMP THREADPRIVATE(wake_delta_pbl_TKE)
!nrlmd<
      REAL, ALLOCATABLE, SAVE :: delta_tsurf(:,:) ! Surface temperature difference inside-outside cold pool
!$OMP THREADPRIVATE(delta_tsurf)
!>nrlmd
!>jyg
!
! pfrac_impa : Produits des coefs lessivage impaction
! pfrac_nucl : Produits des coefs lessivage nucleation
! pfrac_1nucl: Produits des coefs lessi nucl (alpha = 1) 
      REAL,ALLOCATABLE,SAVE :: pfrac_impa(:,:), pfrac_nucl(:,:)
!$OMP THREADPRIVATE(pfrac_impa,pfrac_nucl)
      REAL,ALLOCATABLE,SAVE :: pfrac_1nucl(:,:)
!$OMP THREADPRIVATE(pfrac_1nucl)
!
      REAL,ALLOCATABLE,SAVE :: total_rain(:), nday_rain(:)  
!$OMP THREADPRIVATE(total_rain,nday_rain)
      REAL,ALLOCATABLE,SAVE :: ndayrain_mth(:)
!$OMP THREADPRIVATE(ndayrain_mth)
      REAL,ALLOCATABLE,SAVE :: paire_ter(:)
!$OMP THREADPRIVATE(paire_ter)
! albsol1: albedo du sol total pour SW visible
! albsol2: albedo du sol total pour SW proche IR
      REAL,ALLOCATABLE,SAVE :: albsol1(:), albsol2(:)
!$OMP THREADPRIVATE(albsol1,albsol2)

!albedo SB >>>
      REAL,ALLOCATABLE,SAVE :: albsol_dif(:,:),albsol_dir(:,:)
!$OMP THREADPRIVATE(albsol_dif,albsol_dir)
!albedo SB <<<


      REAL, ALLOCATABLE, SAVE:: wo(:, :, :)
      ! column-density of ozone in a layer, in kilo-Dobsons
      ! Third dimension has size 1 or 2.
      ! "wo(:, :, 1)" is for the average day-night field, 
      ! "wo(:, :, 2)" is for daylight time.
      !$OMP THREADPRIVATE(wo)

! heat : chauffage solaire
! heat0: chauffage solaire ciel clair
! cool : refroidissement infrarouge
! cool0 : refroidissement infrarouge ciel clair
! sollwdown : downward LW flux at surface
! sollwdownclr : downward CS LW flux at surface
! toplwdown : downward CS LW flux at TOA
! toplwdownclr : downward CS LW flux at TOA
! heat_volc : chauffage solaire du au volcanisme
! cool_volc : refroidissement infrarouge du au volcanisme
      REAL,ALLOCATABLE,SAVE :: clwcon0(:,:),rnebcon0(:,:)
!$OMP THREADPRIVATE(clwcon0,rnebcon0)
      REAL,ALLOCATABLE,SAVE :: heat(:,:)   
!$OMP THREADPRIVATE(heat)
      REAL,ALLOCATABLE,SAVE :: heat0(:,:)
!$OMP THREADPRIVATE(heat0)
      REAL,ALLOCATABLE,SAVE :: cool(:,:)
!$OMP THREADPRIVATE(cool)
      REAL,ALLOCATABLE,SAVE :: cool0(:,:)
!$OMP THREADPRIVATE(cool0)
      REAL,ALLOCATABLE,SAVE :: heat_volc(:,:)   
!$OMP THREADPRIVATE(heat_volc)
      REAL,ALLOCATABLE,SAVE :: cool_volc(:,:)
!$OMP THREADPRIVATE(cool_volc)
      REAL,ALLOCATABLE,SAVE :: topsw(:), toplw(:)
!$OMP THREADPRIVATE(topsw,toplw)
      REAL,ALLOCATABLE,SAVE :: sollwdown(:)
!$OMP THREADPRIVATE(sollwdown)
      REAL,ALLOCATABLE,SAVE :: gustiness(:)
!$OMP THREADPRIVATE(gustiness)
      REAL,ALLOCATABLE,SAVE :: sollwdownclr(:)
!$OMP THREADPRIVATE(sollwdownclr)
      REAL,ALLOCATABLE,SAVE :: toplwdown(:)
!$OMP THREADPRIVATE(toplwdown)
      REAL,ALLOCATABLE,SAVE :: toplwdownclr(:)
!$OMP THREADPRIVATE(toplwdownclr)
      REAL,ALLOCATABLE,SAVE :: topsw0(:),toplw0(:),solsw0(:),sollw0(:)
!$OMP THREADPRIVATE(topsw0,toplw0,solsw0,sollw0)
      REAL,ALLOCATABLE,SAVE :: albpla(:)
!$OMP THREADPRIVATE(albpla)

!IM ajout variables CFMIP2/CMIP5
      REAL,ALLOCATABLE,SAVE :: heatp(:,:), coolp(:,:)
!$OMP THREADPRIVATE(heatp, coolp)
      REAL,ALLOCATABLE,SAVE :: heat0p(:,:), cool0p(:,:)
!$OMP THREADPRIVATE(heat0p, cool0p)
      REAL,ALLOCATABLE,SAVE :: radsolp(:), topswp(:), toplwp(:)
!$OMP THREADPRIVATE(radsolp, topswp, toplwp)
      REAL,ALLOCATABLE,SAVE :: albplap(:)
!$OMP THREADPRIVATE(albplap)
      REAL,ALLOCATABLE,SAVE :: solswp(:), solswfdiffp(:), sollwp(:)
!$OMP THREADPRIVATE(solswp, solswfdiffp, sollwp)
      REAL,ALLOCATABLE,SAVE :: sollwdownp(:)
!$OMP THREADPRIVATE(sollwdownp)
      REAL,ALLOCATABLE,SAVE :: topsw0p(:),toplw0p(:)
      REAL,ALLOCATABLE,SAVE :: solsw0p(:),sollw0p(:)
!$OMP THREADPRIVATE(topsw0p,toplw0p,solsw0p,sollw0p)
      REAL,ALLOCATABLE,SAVE :: lwdnc0p(:,:), lwdn0p(:,:), lwdnp(:,:)
      REAL,ALLOCATABLE,SAVE :: lwupc0p(:,:), lwup0p(:,:), lwupp(:,:)
!$OMP THREADPRIVATE(lwdnc0p, lwdn0p, lwdnp, lwupc0p, lwup0p, lwupp)
      REAL,ALLOCATABLE,SAVE :: swdnc0p(:,:), swdn0p(:,:), swdnp(:,:)
      REAL,ALLOCATABLE,SAVE :: swupc0p(:,:), swup0p(:,:), swupp(:,:)
!$OMP THREADPRIVATE(swdnc0p, swdn0p, swdnp, swupc0p, swup0p, swupp)

!AI ajout variables double appel Ecrad (3Deffect)
      REAL,ALLOCATABLE,SAVE :: heat_s2(:,:), cool_s2(:,:)
!$OMP THREADPRIVATE(heat_s2, cool_s2)
      REAL,ALLOCATABLE,SAVE :: heat0_s2(:,:), cool0_s2(:,:)
!$OMP THREADPRIVATE(heat0_s2, cool0_s2)
      REAL,ALLOCATABLE,SAVE :: radsol_s2(:), topsw_s2(:), toplw_s2(:)
!$OMP THREADPRIVATE(radsol_s2, topsw_s2, toplw_s2)
      REAL,ALLOCATABLE,SAVE :: albpla_s2(:)
!$OMP THREADPRIVATE(albpla_s2)
      REAL,ALLOCATABLE,SAVE :: solsw_s2(:), solswfdiff_s2(:), sollw_s2(:)
!$OMP THREADPRIVATE(solsw_s2, solswfdiff_s2, sollw_s2)
      REAL,ALLOCATABLE,SAVE :: sollwdown_s2(:), sollwdownclr_s2(:)
!$OMP THREADPRIVATE(sollwdown_s2, sollwdownclr_s2)
      REAL,ALLOCATABLE,SAVE :: topsw0_s2(:),toplw0_s2(:)
      REAL,ALLOCATABLE,SAVE :: solsw0_s2(:),sollw0_s2(:)
!$OMP THREADPRIVATE(topsw0_s2,toplw0_s2,solsw0_s2,sollw0_s2)
      REAL,ALLOCATABLE,SAVE :: lwdnc0_s2(:,:), lwdn0_s2(:,:), lwdn_s2(:,:)
      REAL,ALLOCATABLE,SAVE :: lwupc0_s2(:,:), lwup0_s2(:,:), lwup_s2(:,:)
!$OMP THREADPRIVATE(lwdnc0_s2,lwdn0_s2,lwdn_s2,lwupc0_s2,lwup0_s2,lwup_s2)       
      REAL,ALLOCATABLE,SAVE :: swdnc0_s2(:,:), swdn0_s2(:,:), swdn_s2(:,:)
      REAL,ALLOCATABLE,SAVE :: swupc0_s2(:,:), swup0_s2(:,:), swup_s2(:,:)
!$OMP THREADPRIVATE(swdnc0_s2, swdn0_s2, swdn_s2 , swupc0_s2, swup0_s2, swup_s2)
!FC
      REAL,ALLOCATABLE,SAVE :: lwtoab_s2(:,:), lwtoa0b_s2(:,:)
!$OMP THREADPRIVATE(lwtoab_s2,lwtoa0b_s2)


! pbase : cloud base pressure
! bbase : cloud base buoyancy
      REAL,ALLOCATABLE,SAVE :: cape(:)
!$OMP THREADPRIVATE(cape)
      REAL,ALLOCATABLE,SAVE :: pbase(:)
!$OMP THREADPRIVATE(pbase)
      REAL,ALLOCATABLE,SAVE :: bbase(:)
!$OMP THREADPRIVATE(bbase)
!
      REAL,SAVE,ALLOCATABLE :: zqasc(:,:)
!$OMP THREADPRIVATE( zqasc)
      INTEGER,ALLOCATABLE,SAVE :: ibas_con(:), itop_con(:)
!$OMP THREADPRIVATE(ibas_con,itop_con)
      REAL,SAVE,ALLOCATABLE :: rain_con(:)
!$OMP THREADPRIVATE(rain_con)
      REAL,SAVE,ALLOCATABLE :: snow_con(:)
!$OMP THREADPRIVATE(snow_con)
!
#ifdef ISO
      REAL,SAVE,ALLOCATABLE :: xtrain_con(:,:)
!$OMP THREADPRIVATE(xtrain_con)
      REAL,SAVE,ALLOCATABLE :: xtsnow_con(:,:)
!$OMP THREADPRIVATE(xtsnow_con)
#endif
      REAL,SAVE,ALLOCATABLE :: rlonPOS(:)
!$OMP THREADPRIVATE(rlonPOS)
      REAL,SAVE,ALLOCATABLE :: newsst(:)
!$OMP THREADPRIVATE(newsst)
      REAL,SAVE,ALLOCATABLE :: ustar(:,:),u10m(:,:), v10m(:,:),wstar(:,:)
!$OMP THREADPRIVATE(ustar,u10m,v10m,wstar)
!
! ok_ade=T -ADE=topswad-topsw
! ok_aie=T ->
!       ok_ade=T -AIE=topswai-topswad
!       ok_ade=F -AIE=topswai-topsw
!
!topswad, solswad : Aerosol direct effect
      REAL,SAVE,ALLOCATABLE :: topswad(:), solswad(:)
!$OMP THREADPRIVATE(topswad,solswad)
!topswai, solswai : Aerosol indirect effect
      REAL,SAVE,ALLOCATABLE :: topswai(:), solswai(:)
!$OMP THREADPRIVATE(topswai,solswai)

      REAL,SAVE,ALLOCATABLE :: tau_aero(:,:,:,:), piz_aero(:,:,:,:), cg_aero(:,:,:,:)
!$OMP THREADPRIVATE(tau_aero, piz_aero, cg_aero)
      REAL,SAVE,ALLOCATABLE :: tau_aero_sw_rrtm(:,:,:,:), piz_aero_sw_rrtm(:,:,:,:), cg_aero_sw_rrtm(:,:,:,:)
!$OMP THREADPRIVATE(tau_aero_sw_rrtm, piz_aero_sw_rrtm, cg_aero_sw_rrtm)
      REAL,SAVE,ALLOCATABLE :: tau_aero_lw_rrtm(:,:,:,:), piz_aero_lw_rrtm(:,:,:,:), cg_aero_lw_rrtm(:,:,:,:)
!$OMP THREADPRIVATE(tau_aero_lw_rrtm, piz_aero_lw_rrtm, cg_aero_lw_rrtm)
      REAL,SAVE,ALLOCATABLE :: ccm(:,:,:)
!$OMP THREADPRIVATE(ccm)

      REAL,SAVE,ALLOCATABLE :: ale_bl_trig(:)
!$OMP THREADPRIVATE(ale_bl_trig)

      REAL,SAVE,ALLOCATABLE :: ratqs_inter_(:,:),sigma_qtherm(:,:)
!$OMP THREADPRIVATE(ratqs_inter_,sigma_qtherm)

#ifdef ISO
#ifdef ISOTRAC
      INTEGER,SAVE,ALLOCATABLE :: bassin_map(:)
!$OMP THREADPRIVATE(bassin_map)
      INTEGER,SAVE,ALLOCATABLE :: boite_map(:,:)
!$OMP THREADPRIVATE(boite_map)
#endif   
#endif
      REAL, ALLOCATABLE, SAVE:: du_gwd_rando(:, :), du_gwd_front(:, :)
      !$OMP THREADPRIVATE(du_gwd_rando, du_gwd_front)
      ! tendencies on wind due to gravity waves

      LOGICAL,SAVE :: is_initialized=.FALSE.
!$OMP THREADPRIVATE(is_initialized)    

      ! Ocean-atmosphere interface:

      REAL, ALLOCATABLE, SAVE:: ds_ns(:) ! (klon)
      ! "delta salinity near surface". Salinity variation in the
      ! near-surface turbulent layer. That is subskin salinity minus
      ! foundation salinity. In ppt.

      REAL, ALLOCATABLE, SAVE:: dt_ns(:) ! (klon)
      ! "delta temperature near surface". Temperature variation in the
      ! near-surface turbulent layer. That is subskin temperature
      ! minus foundation temperature. (Can be negative.) In K.
      
      REAL, ALLOCATABLE, SAVE:: delta_sst(:) ! (klon)
      ! Ocean-air interface temperature minus bulk SST, in
      ! K. Allocated and defined only if activate_ocean_skin >= 1.

      REAL, ALLOCATABLE, SAVE:: delta_sal(:) ! (klon)
      ! Ocean-air interface salinity minus bulk salinity, in ppt
      
      REAL, ALLOCATABLE, SAVE:: dter(:) ! (klon)
      ! Temperature variation in the diffusive microlayer, that is
      ! ocean-air interface temperature minus subskin temperature. In K.

      REAL, SAVE, ALLOCATABLE:: dser(:) ! (klon)
      ! Salinity variation in the diffusive microlayer, that is
      ! ocean-air interface salinity minus subskin salinity. In ppt.

      real, SAVE, ALLOCATABLE:: dt_ds(:) ! (klon)
      ! (tks / tkt) * dTer, in K

      !$OMP THREADPRIVATE(delta_sal, ds_ns, dt_ns, delta_sst, dter, dser, dt_ds)

    CONTAINS

!======================================================================
SUBROUTINE phys_state_var_init(read_climoz)
USE dimphy
USE aero_mod
USE infotrac_phy, ONLY : nbtr
#ifdef ISO
USE infotrac_phy, ONLY : ntraciso=>ntiso,niso
#endif
USE clesphys_mod_h
USE indice_sol_mod
use config_ocean_skin_m, only: activate_ocean_skin
use surface_data, only: type_ocean
IMPLICIT NONE

integer, intent(in)::  read_climoz
! read ozone climatology
! Allowed values are 0, 1 and 2
! 0: do not read an ozone climatology
! 1: read a single ozone climatology that will be used day and night
! 2: read two ozone climatologies, the average day and night
! climatology and the daylight climatology


      print*, 'is_initialized', is_initialized
      IF (is_initialized) RETURN
      is_initialized=.TRUE.
      ALLOCATE(pctsrf(klon,nbsrf))
      ALLOCATE(ftsol(klon,nbsrf))
      ALLOCATE(beta_aridity(klon,nbsrf))
      ALLOCATE(qsol(klon),fevap(klon,nbsrf))
      ALLOCATE(z0m(klon,nbsrf+1),z0h(klon,nbsrf+1),agesno(klon,nbsrf))
!FC
      ALLOCATE(treedrg(klon,klev,nbsrf))
!AM
      ALLOCATE(frac_tersrf(klon,nbtersrf))
      ALLOCATE(z0m_tersrf(klon,nbtersrf))
      ALLOCATE(ratio_z0m_z0h_tersrf(klon,nbtersrf))
      ALLOCATE(albedo_tersrf(klon,nbtersrf))
      ALLOCATE(beta_tersrf(klon,nbtersrf))
      ALLOCATE(inertie_tersrf(klon,nbtersrf))
      ALLOCATE(hcond_tersrf(klon,nbtersrf))
      ALLOCATE(tsurfi_tersrf(klon,nbtersrf))
      ALLOCATE(tsoili_tersrf(klon,nbtsoildepths,nbtersrf))
      ALLOCATE(tsoil_depth(klon,nbtsoildepths,nbtersrf))
      ALLOCATE(tsurf_tersrf(klon,nbtersrf))
      ALLOCATE(tsoil_tersrf(klon,nsoilmx,nbtersrf))
      ALLOCATE(qsurf_tersrf(klon,nbtersrf))
      ALLOCATE(tsurf_new_tersrf(klon,nbtersrf))
      ALLOCATE(cdragm_tersrf(klon,nbtersrf))
      ALLOCATE(cdragh_tersrf(klon,nbtersrf))
      ALLOCATE(swnet_tersrf(klon,nbtersrf))
      ALLOCATE(lwnet_tersrf(klon,nbtersrf))
      ALLOCATE(fluxsens_tersrf(klon,nbtersrf))
      ALLOCATE(fluxlat_tersrf(klon,nbtersrf))

      ALLOCATE(falb1(klon,nbsrf))
      ALLOCATE(falb2(klon,nbsrf))
!albedo SB >>> 
      print*, 'allocate falb'
      ALLOCATE(falb_dir(klon,nsw,nbsrf),falb_dif(klon,nsw,nbsrf))
!!      print*, 'allocate falb good', falb_dir(1,1,1)
      ALLOCATE(chl_con(klon))
!albedo SB <<<
      ALLOCATE(rain_fall(klon))
      ALLOCATE(snow_fall(klon))
      ALLOCATE(bs_fall(klon))
      ALLOCATE(solsw(klon), solswfdiff(klon), sollw(klon))
      sollw=0.0
      ALLOCATE(radsol(klon))
      ALLOCATE(swradcorr(klon))
      ALLOCATE(zmea(klon), zstd(klon), zsig(klon), zgam(klon))
      ALLOCATE(zthe(klon), zpic(klon), zval(klon))

      ALLOCATE(rugoro(klon))
      ALLOCATE(t_ancien(klon,klev), q_ancien(klon,klev))
      ALLOCATE(ql_ancien(klon,klev), qs_ancien(klon,klev), qbs_ancien(klon,klev))
      ALLOCATE(prw_ancien(klon), prlw_ancien(klon), prsw_ancien(klon), prbsw_ancien(klon))
      ALLOCATE(u_ancien(klon,klev), v_ancien(klon,klev))
      ALLOCATE(cf_ancien(klon,klev), rvc_ancien(klon,klev))
      ALLOCATE(tke_ancien(klon,klev+1))
!!! Rom P >>>
      ALLOCATE(tr_ancien(klon,klev,nbtr))
!!! Rom P <<<
      ALLOCATE(clwcon(klon,klev),rnebcon(klon,klev))
      ALLOCATE(qtc_cv(klon,klev),sigt_cv(klon,klev),detrain_cv(klon,klev),fm_cv(klon,klev))
      ALLOCATE(ratqs(klon,klev))
      ALLOCATE(pbl_tke(klon,klev+1,nbsrf+1))
!nrlmd<
      ALLOCATE(delta_tsurf(klon,nbsrf))
!>nrlmd
      ALLOCATE(coefh(klon,klev+1,nbsrf+1))
      ALLOCATE(coefm(klon,klev+1,nbsrf+1))
      ! initialize cleanly coefh,coefm
      ! (most of the time in the code these are assumed to be on klev levels)
      coefh(:,:,:)=0
      coefm(:,:,:)=0
      ALLOCATE(zmax0(klon), f0(klon))
      ALLOCATE(sig1(klon,klev), w01(klon,klev))
      ALLOCATE(entr_therm(klon,klev), fm_therm(klon,klev+1))
      ALLOCATE(detr_therm(klon,klev))
!     pour phsystoke avec thermiques
      ALLOCATE(clwcon0th(klon,klev),rnebcon0th(klon,klev))
! radiation outputs
!FC
      ALLOCATE(lwtoab(klon,nbands_lw_rrtm), lwtoa0b(klon,nbands_lw_rrtm))
      lwtoab(:,:)=0.0
      lwtoa0b(:,:)=0.0
      ALLOCATE(lwtoab_s2(klon,nbands_lw_rrtm), lwtoa0b_s2(klon,nbands_lw_rrtm))
      lwtoab_s2(:,:)=0.0
      lwtoa0b_s2(:,:)=0.0
      ALLOCATE(lwtoabp(klon,nbands_lw_rrtm), lwtoa0bp(klon,nbands_lw_rrtm))
      lwtoabp(:,:)=0.0
      lwtoa0bp(:,:)=0.0
!FC
      ALLOCATE(swdnc0(klon,klevp1), swdn0(klon,klevp1), swdn(klon,klevp1))
      ALLOCATE(swupc0(klon,klevp1), swup0(klon,klevp1), swup(klon,klevp1))
      ALLOCATE(lwdnc0(klon,klevp1), lwdn0(klon,klevp1), lwdn(klon,klevp1))
      ALLOCATE(lwupc0(klon,klevp1), lwup0(klon,klevp1), lwup(klon,klevp1))
      ALLOCATE(SWdn200clr(klon), SWdn200(klon))
      ALLOCATE(SWup200clr(klon), SWup200(klon))
      ALLOCATE(LWdn200clr(klon), LWdn200(klon))
      ALLOCATE(LWup200clr(klon), LWup200(klon))
      ALLOCATE(LWdnTOA(klon), LWdnTOAclr(klon))
! pressure level
      ALLOCATE(tsumSTD(klon,nlevSTD,nout))
      ALLOCATE(usumSTD(klon,nlevSTD,nout), vsumSTD(klon,nlevSTD,nout))
      ALLOCATE(wsumSTD(klon,nlevSTD,nout), phisumSTD(klon,nlevSTD,nout))
      ALLOCATE(qsumSTD(klon,nlevSTD,nout), rhsumSTD(klon,nlevSTD,nout))
      ALLOCATE(tnondef(klon,nlevSTD,nout))
      ALLOCATE(uvsumSTD(klon,nlevSTD,nout))
      ALLOCATE(vqsumSTD(klon,nlevSTD,nout))
      ALLOCATE(vTsumSTD(klon,nlevSTD,nout))
      ALLOCATE(wqsumSTD(klon,nlevSTD,nout))
      ALLOCATE(vphisumSTD(klon,nlevSTD,nout))
      ALLOCATE(wTsumSTD(klon,nlevSTD,nout))
      ALLOCATE(u2sumSTD(klon,nlevSTD,nout))
      ALLOCATE(v2sumSTD(klon,nlevSTD,nout))
      ALLOCATE(T2sumSTD(klon,nlevSTD,nout))
      ALLOCATE(O3sumSTD(klon,nlevSTD,nout))
      ALLOCATE(O3daysumSTD(klon,nlevSTD,nout))
!IM beg
      ALLOCATE(wlevSTD(klon,nlevSTD), ulevSTD(klon,nlevSTD), vlevSTD(klon,nlevSTD))
      ALLOCATE(tlevSTD(klon,nlevSTD), qlevSTD(klon,nlevSTD), rhlevSTD(klon,nlevSTD))
      ALLOCATE(philevSTD(klon,nlevSTD))
      ALLOCATE(uvSTD(klon,nlevSTD),vqSTD(klon,nlevSTD))
      ALLOCATE(vTSTD(klon,nlevSTD),wqSTD(klon,nlevSTD))
      ALLOCATE(vphiSTD(klon,nlevSTD),wTSTD(klon,nlevSTD))
      ALLOCATE(u2STD(klon,nlevSTD),v2STD(klon,nlevSTD))
      ALLOCATE(T2STD(klon,nlevSTD))
      ALLOCATE(O3STD(klon,nlevSTD))
      ALLOCATE(O3daySTD(klon,nlevSTD))
!IM end
      ALLOCATE(seed_old(klon,napisccp))
      ALLOCATE(zuthe(klon),zvthe(klon))
      ALLOCATE(alb_neig(klon))
!GG
      ALLOCATE(hice(klon))
      hice(:) = 0.
      ALLOCATE(tice(klon))
      tice(:) = 0.
      ALLOCATE(bilg_cumul(klon))
      bilg_cumul(:) = 0.
!GG
!cloud base mass flux
      ALLOCATE(ema_cbmf(klon))
!cloud base pressure & cloud top pressure
      ALLOCATE(ema_pcb(klon), ema_pct(klon))
!
      ALLOCATE(Mipsh(klon,klev))
      Mipsh(:,:)=0.0
      ALLOCATE(Ma(klon,klev))
      ALLOCATE(qcondc(klon,klev))
      ALLOCATE(wd(klon))
      ALLOCATE(sigd(klon))
      ALLOCATE(cin(klon), ALE(klon), ALP(klon))
      ALLOCATE(ftd(klon,klev), fqd(klon,klev),fqcomp(klon,klev))
      ALLOCATE(Ale_bl(klon))
      ALLOCATE(ale_wake(klon))
      ALLOCATE(ale_bl_stat(klon))
      ale_bl_stat(:)=0
      ALLOCATE(Alp_bl(klon))
      ALLOCATE(lalim_conv(klon))
      ALLOCATE(wght_th(klon,klev))
      ALLOCATE(wake_deltat(klon,klev), wake_deltaq(klon,klev))
      ALLOCATE(wake_s(klon), awake_s(klon), wake_dens(klon), awake_dens(klon))
!!      awake_dens = 0.  ! initialized in phyetat0
      ALLOCATE(cv_gen(klon))
      ALLOCATE(wake_Cstar(klon))
      ALLOCATE(wake_pe(klon), wake_fip(klon))
!jyg<
      ALLOCATE(wake_delta_pbl_TKE(klon,klev+1,nbsrf+1))
!>jyg
      ALLOCATE(pfrac_impa(klon,klev), pfrac_nucl(klon,klev))
      ALLOCATE(pfrac_1nucl(klon,klev))
      ALLOCATE(total_rain(klon), nday_rain(klon))
      ALLOCATE(ndayrain_mth(klon))
      ALLOCATE(paire_ter(klon))
      ALLOCATE(albsol1(klon), albsol2(klon))
!albedo SB >>>
      ALLOCATE(albsol_dir(klon,nsw),albsol_dif(klon,nsw))
!albedo SB <<<

      if (read_climoz <= 1) then
         ALLOCATE(wo(klon,klev, 1))
      else
         ! read_climoz == 2
         ALLOCATE(wo(klon,klev, 2))
      end if
      
      ALLOCATE(clwcon0(klon,klev),rnebcon0(klon,klev))
      ALLOCATE(heat(klon,klev), heat0(klon,klev)) 
      ALLOCATE(cool(klon,klev), cool0(klon,klev))
      ALLOCATE(heat_volc(klon,klev), cool_volc(klon,klev)) 
      ALLOCATE(topsw(klon), toplw(klon))
      ALLOCATE(sollwdown(klon), sollwdownclr(klon))
      sollwdown = 0.
      ALLOCATE(toplwdown(klon), toplwdownclr(klon))
      ALLOCATE(topsw0(klon),toplw0(klon),solsw0(klon),sollw0(klon))
      sollw0 = 0.
      ALLOCATE(albpla(klon))
!IM ajout variables CFMIP2/CMIP5
      ALLOCATE(heatp(klon,klev), coolp(klon,klev))
      ALLOCATE(heat0p(klon,klev), cool0p(klon,klev))
      ALLOCATE(radsolp(klon), topswp(klon), toplwp(klon))
      ALLOCATE(albplap(klon))
      ALLOCATE(solswp(klon), solswfdiffp(klon), sollwp(klon))
      ALLOCATE(gustiness(klon))
      ALLOCATE(sollwdownp(klon))
      ALLOCATE(topsw0p(klon),toplw0p(klon))
      ALLOCATE(solsw0p(klon),sollw0p(klon))
      ALLOCATE(lwdnc0p(klon,klevp1), lwdn0p(klon,klevp1), lwdnp(klon,klevp1))
      ALLOCATE(lwupc0p(klon,klevp1), lwup0p(klon,klevp1), lwupp(klon,klevp1))
      ALLOCATE(swdnc0p(klon,klevp1), swdn0p(klon,klevp1), swdnp(klon,klevp1))
      ALLOCATE(swupc0p(klon,klevp1), swup0p(klon,klevp1), swupp(klon,klevp1))

!AI Ajout pour Ecrad (3Deffect)       
      ALLOCATE(heat_s2(klon,klev), cool_s2(klon,klev))
      ALLOCATE(heat0_s2(klon,klev), cool0_s2(klon,klev))
      ALLOCATE(radsol_s2(klon), topsw_s2(klon), toplw_s2(klon))
      ALLOCATE(albpla_s2(klon))
      ALLOCATE(solsw_s2(klon), solswfdiff_s2(klon), sollw_s2(klon))
      ALLOCATE(sollwdown_s2(klon),sollwdownclr_s2(klon))
      ALLOCATE(topsw0_s2(klon),toplw0_s2(klon))
      ALLOCATE(solsw0_s2(klon),sollw0_s2(klon))
      ALLOCATE(lwdnc0_s2(klon,klevp1), lwdn0_s2(klon,klevp1), lwdn_s2(klon,klevp1))
      ALLOCATE(lwupc0_s2(klon,klevp1), lwup0_s2(klon,klevp1), lwup_s2(klon,klevp1))
      ALLOCATE(swdnc0_s2(klon,klevp1), swdn0_s2(klon,klevp1), swdn_s2(klon,klevp1))
      ALLOCATE(swupc0_s2(klon,klevp1), swup0_s2(klon,klevp1), swup_s2(klon,klevp1))

      ALLOCATE(cape(klon))
      ALLOCATE(pbase(klon),bbase(klon))
      ALLOCATE(zqasc(klon,klev))
      ALLOCATE(ibas_con(klon), itop_con(klon))
      ALLOCATE(rain_con(klon), snow_con(klon))
      ALLOCATE(rlonPOS(klon))
      ALLOCATE(newsst(klon))
      ALLOCATE(ustar(klon,nbsrf),u10m(klon,nbsrf), v10m(klon,nbsrf),wstar(klon,nbsrf+1))
      ALLOCATE(topswad(klon), solswad(klon))
      ALLOCATE(topswai(klon), solswai(klon))
      ALLOCATE(tau_aero(klon,klev,naero_grp,nbands),piz_aero(klon,klev,naero_grp,nbands),cg_aero(klon,klev,naero_grp,nbands))
      ALLOCATE(tau_aero_sw_rrtm(klon,klev,2,nbands_sw_rrtm),piz_aero_sw_rrtm(klon,klev,2,nbands_sw_rrtm))
      ALLOCATE(cg_aero_sw_rrtm(klon,klev,2,nbands_sw_rrtm))
      ALLOCATE(tau_aero_lw_rrtm(klon,klev,2,nbands_lw_rrtm),piz_aero_lw_rrtm(klon,klev,2,nbands_lw_rrtm))
      ALLOCATE(cg_aero_lw_rrtm(klon,klev,2,nbands_lw_rrtm))
      ALLOCATE(ccm(klon,klev,nbands))

#ifdef ISO
      ALLOCATE(xtsol(niso,klon),fxtevap(ntraciso,klon,nbsrf))
      ALLOCATE(fxtd(ntraciso,klon,klev))
      ALLOCATE(wake_deltaxt(ntraciso,klon,klev))
      ALLOCATE(xt_ancien(ntraciso,klon,klev))
      ALLOCATE(xtl_ancien(ntraciso,klon,klev))
      ALLOCATE(xts_ancien(ntraciso,klon,klev))
      ALLOCATE(xtbs_ancien(ntraciso,klon,klev))
      ALLOCATE(xtrain_fall(ntraciso,klon))
      ALLOCATE(xtsnow_fall(ntraciso,klon))
      ALLOCATE(xtrain_con(ntraciso,klon))
      ALLOCATE(xtsnow_con(ntraciso,klon))
#ifdef ISOTRAC
      ALLOCATE(bassin_map(klon))
      ALLOCATE(boite_map(klon,klev))  
#endif      
#endif

      ALLOCATE(ale_bl_trig(klon))
      ALLOCATE(ratqs_inter_(klon,klev),sigma_qtherm(klon,klev))
      IF (ok_gwd_rando) THEN
        ALLOCATE(du_gwd_rando(klon, klev))
        du_gwd_rando(:,:)=0.
      ENDIF
      IF (.not. ok_hines .and. ok_gwd_rando) THEN
        ALLOCATE(du_gwd_front(klon, klev))
        du_gwd_front(:,:) = 0 !ym missing init   
      ENDIF

      if (activate_ocean_skin >= 1) then
         ALLOCATE(delta_sal(klon), ds_ns(klon), dt_ns(klon), delta_sst(klon), &
              dter(klon), dser(klon))
         if (activate_ocean_skin == 2 .and. type_ocean == "couple") &
              allocate(dt_ds(klon))
      end if

    END SUBROUTINE phys_state_var_init

!======================================================================
    SUBROUTINE phys_state_var_end
      ! Useful only for lmdz1d.
      USE clesphys_mod_h
USE indice_sol_mod
use config_ocean_skin_m, only: activate_ocean_skin
use surface_data, only: type_ocean
IMPLICIT NONE

      DEALLOCATE(pctsrf, ftsol, falb1, falb2)
      DEALLOCATE(beta_aridity)
      DEALLOCATE(qsol,fevap,z0m,z0h,agesno)
!FC
      DEALLOCATE(treedrg)
!AM
      DEALLOCATE(frac_tersrf)
      DEALLOCATE(z0m_tersrf)
      DEALLOCATE(ratio_z0m_z0h_tersrf)
      DEALLOCATE(albedo_tersrf)
      DEALLOCATE(beta_tersrf)
      DEALLOCATE(inertie_tersrf)
      DEALLOCATE(hcond_tersrf)
      DEALLOCATE(tsurfi_tersrf)
      DEALLOCATE(tsoili_tersrf)
      DEALLOCATE(tsoil_depth)
      DEALLOCATE(tsurf_tersrf)
      DEALLOCATE(tsoil_tersrf)
      DEALLOCATE(qsurf_tersrf)
      DEALLOCATE(tsurf_new_tersrf)
      DEALLOCATE(cdragm_tersrf)
      DEALLOCATE(cdragh_tersrf)
      DEALLOCATE(swnet_tersrf)
      DEALLOCATE(lwnet_tersrf)
      DEALLOCATE(fluxsens_tersrf)
      DEALLOCATE(fluxlat_tersrf)
      DEALLOCATE(rain_fall, snow_fall, bs_fall,solsw, solswfdiff, sollw, radsol, swradcorr)
      DEALLOCATE(zmea, zstd, zsig, zgam)
      DEALLOCATE(zthe, zpic, zval)
      DEALLOCATE(rugoro, t_ancien, q_ancien, clwcon, rnebcon)
      DEALLOCATE(qs_ancien, ql_ancien, qbs_ancien)
      DEALLOCATE(prw_ancien, prlw_ancien, prsw_ancien, prbsw_ancien)
      DEALLOCATE(qtc_cv,sigt_cv,detrain_cv,fm_cv)
      DEALLOCATE(u_ancien, v_ancien)
      DEALLOCATE(cf_ancien, rvc_ancien)
      DEALLOCATE(tke_ancien)
      DEALLOCATE(tr_ancien)                           !RomP
      DEALLOCATE(ratqs, pbl_tke,coefh,coefm)
      DEALLOCATE(zmax0, f0)
      DEALLOCATE(sig1, w01)
      DEALLOCATE(entr_therm, fm_therm)
      DEALLOCATE(detr_therm)
      DEALLOCATE(clwcon0th, rnebcon0th)
! radiation outputs
!FC 
      DEALLOCATE(lwtoab, lwtoa0b)
      DEALLOCATE(lwtoab_s2, lwtoa0b_s2)
      DEALLOCATE(lwtoabp, lwtoa0bp)
!FC
      DEALLOCATE(swdnc0, swdn0, swdn)
      DEALLOCATE(swupc0, swup0, swup)
      DEALLOCATE(lwdnc0, lwdn0, lwdn)
      DEALLOCATE(lwupc0, lwup0, lwup)
      DEALLOCATE(SWdn200clr, SWdn200)
      DEALLOCATE(SWup200clr, SWup200)
      DEALLOCATE(LWdn200clr, LWdn200)
      DEALLOCATE(LWup200clr, LWup200)
      DEALLOCATE(LWdnTOA, LWdnTOAclr)
! pressure level
      DEALLOCATE(tsumSTD)
      DEALLOCATE(usumSTD, vsumSTD)
      DEALLOCATE(wsumSTD, phisumSTD)
      DEALLOCATE(tnondef)
      DEALLOCATE(qsumSTD, rhsumSTD)
      DEALLOCATE(uvsumSTD)
      DEALLOCATE(vqsumSTD)
      DEALLOCATE(vTsumSTD)
      DEALLOCATE(wqsumSTD)
      DEALLOCATE(vphisumSTD)
      DEALLOCATE(wTsumSTD)
      DEALLOCATE(u2sumSTD)
      DEALLOCATE(v2sumSTD)
      DEALLOCATE(T2sumSTD)
      DEALLOCATE(O3sumSTD)
      DEALLOCATE(O3daysumSTD)
!IM beg
      DEALLOCATE(wlevSTD,ulevSTD,vlevSTD,tlevSTD,qlevSTD,rhlevSTD,philevSTD)
      DEALLOCATE(uvSTD,vqSTD,vTSTD,wqSTD,vphiSTD,wTSTD,u2STD,v2STD,T2STD,O3STD,O3daySTD)
!IM end
      DEALLOCATE(seed_old)
      DEALLOCATE(zuthe, zvthe)
      DEALLOCATE(alb_neig)
!GG
      DEALLOCATE(hice)
      DEALLOCATE(tice)
      DEALLOCATE(bilg_cumul)
!GG
      DEALLOCATE(ema_cbmf)
      DEALLOCATE(ema_pcb, ema_pct)
      DEALLOCATE(Mipsh, Ma, qcondc)
      DEALLOCATE(wd, sigd)
      DEALLOCATE(cin, ALE, ALP)
      DEALLOCATE(ftd, fqd, fqcomp)
      DEALLOCATE(Ale_bl, Alp_bl)
      DEALLOCATE(ale_wake)
      DEALLOCATE(ale_bl_stat)
      DEALLOCATE(lalim_conv, wght_th)
      DEALLOCATE(wake_deltat, wake_deltaq)
      DEALLOCATE(wake_s, awake_s, wake_dens, awake_dens)
      DEALLOCATE(cv_gen)
      DEALLOCATE(wake_Cstar, wake_pe, wake_fip)
!jyg<
      DEALLOCATE(wake_delta_pbl_TKE)
!nrlmd<
      DEALLOCATE(delta_tsurf)
!>nrlmd
!>jyg
      DEALLOCATE(pfrac_impa, pfrac_nucl)
      DEALLOCATE(pfrac_1nucl)
      DEALLOCATE(total_rain, nday_rain)
      DEALLOCATE(ndayrain_mth)
      DEALLOCATE(paire_ter)
      DEALLOCATE(albsol1, albsol2)
!albedo SB >>>
      DEALLOCATE(albsol_dir,albsol_dif,falb_dir,falb_dif,chl_con)
!albedo SB <<<
      DEALLOCATE(wo)
      DEALLOCATE(clwcon0,rnebcon0)
      DEALLOCATE(heat, heat0) 
      DEALLOCATE(cool, cool0)
      DEALLOCATE(heat_volc, cool_volc) 
      DEALLOCATE(topsw, toplw)
      DEALLOCATE(sollwdown, sollwdownclr)
      DEALLOCATE(gustiness)
      DEALLOCATE(toplwdown, toplwdownclr)
      DEALLOCATE(topsw0,toplw0,solsw0,sollw0)
      DEALLOCATE(albpla)

!AI Ajout pour Ecrad (3Deffect)
      DEALLOCATE(heat_s2, cool_s2)
      DEALLOCATE(heat0_s2, cool0_s2)
      DEALLOCATE(radsol_s2, topsw_s2, toplw_s2)
      DEALLOCATE(albpla_s2)
      DEALLOCATE(solsw_s2, solswfdiff_s2, sollw_s2)
      DEALLOCATE(sollwdown_s2, sollwdownclr_s2)
      DEALLOCATE(topsw0_s2,toplw0_s2)
      DEALLOCATE(solsw0_s2,sollw0_s2)
      DEALLOCATE(lwdnc0_s2, lwdn0_s2, lwdn_s2)
      DEALLOCATE(lwupc0_s2, lwup0_s2, lwup_s2)
      DEALLOCATE(swdnc0_s2, swdn0_s2, swdn_s2)
      DEALLOCATE(swupc0_s2, swup0_s2, swup_s2)

!IM ajout variables CFMIP2/CMIP5
      DEALLOCATE(heatp, coolp)
      DEALLOCATE(heat0p, cool0p)
      DEALLOCATE(radsolp, topswp, toplwp)
      DEALLOCATE(albplap)
      DEALLOCATE(solswp, solswfdiffp, sollwp)
      DEALLOCATE(sollwdownp)
      DEALLOCATE(topsw0p,toplw0p)
      DEALLOCATE(solsw0p,sollw0p)
      DEALLOCATE(lwdnc0p, lwdn0p, lwdnp)
      DEALLOCATE(lwupc0p, lwup0p, lwupp)
      DEALLOCATE(swdnc0p, swdn0p, swdnp)
      DEALLOCATE(swupc0p, swup0p, swupp)
      DEALLOCATE(cape)
      DEALLOCATE(pbase,bbase)
      DEALLOCATE(zqasc)
      DEALLOCATE(ibas_con, itop_con)
      DEALLOCATE(rain_con, snow_con)
      DEALLOCATE(rlonPOS)
      DEALLOCATE(newsst)
      DEALLOCATE(ustar,u10m, v10m,wstar)
      DEALLOCATE(topswad, solswad)
      DEALLOCATE(topswai, solswai)
      DEALLOCATE(tau_aero,piz_aero,cg_aero)
      DEALLOCATE(tau_aero_sw_rrtm,piz_aero_sw_rrtm,cg_aero_sw_rrtm)
      DEALLOCATE(tau_aero_lw_rrtm,piz_aero_lw_rrtm,cg_aero_lw_rrtm)
      DEALLOCATE(ccm)
      if (ok_gwd_rando) DEALLOCATE(du_gwd_rando)
      if (.not. ok_hines .and. ok_gwd_rando) DEALLOCATE(du_gwd_front)
      DEALLOCATE(ale_bl_trig)
      DEALLOCATE(ratqs_inter_,sigma_qtherm)

      if (activate_ocean_skin >= 1) then
         deALLOCATE(delta_sal, ds_ns, dt_ns, delta_sst, dter, dser)
         if (activate_ocean_skin == 2 .and. type_ocean == "couple") &
              deALLOCATE(dt_ds)
      end if

#ifdef ISO    
      DEALLOCATE(xtsol,fxtevap)  
      DEALLOCATE(xt_ancien,xtl_ancien,xts_ancien,xtbs_ancien, fxtd, wake_deltaxt)
      DEALLOCATE(xtrain_fall, xtsnow_fall, xtrain_con, xtsnow_con)
#ifdef ISOTRAC 
      DEALLOCATE(bassin_map,boite_map) 
#endif        
#endif
      is_initialized=.FALSE.
      
END SUBROUTINE phys_state_var_end

      END MODULE phys_state_var_mod
