Skip to content
Snippets Groups Projects
read_field.f90 58 KiB
Newer Older
  • Learn to ignore specific revisions
  • !MNH_LIC Copyright 1994-2023 CNRS, Meteo-France and Universite Paul Sabatier
    
    !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
    
    !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
    
    !MNH_LIC for details. version 1.
    
    !-----------------------------------------------------------------
    
    Gaelle TANGUY's avatar
    Gaelle TANGUY committed
    !     ######################
    
          MODULE MODI_READ_FIELD
    !     ######################
    !
    INTERFACE 
    !
    
          SUBROUTINE READ_FIELD(KOCEMI,TPINIFILE,KIU,KJU,KKU,                    &
    
                HGETTKET,HGETRVT,HGETRCT,HGETRRT,HGETRIT,HGETCIT,HGETZWS,        &
    
                HGETRST,HGETRGT,HGETRHT,HGETSVT,HGETSRCT,HGETSIGS,HGETCLDFR,     &
    
                HGETBL_DEPTH,HGETSBL_DEPTH,HGETPHC,HGETPHR,HUVW_ADV_SCHEME,      &
    
                HTEMP_SCHEME,KSIZELBX_ll,KSIZELBXU_ll,KSIZELBY_ll,KSIZELBYV_ll,  &
    
                KSIZELBXTKE_ll,KSIZELBYTKE_ll,                                   &
                KSIZELBXR_ll,KSIZELBYR_ll,KSIZELBXSV_ll,KSIZELBYSV_ll,           &
    
                PUM,PVM,PWM,PDUM,PDVM,PDWM,                                      &
    
                PRT,PSVT,PZWS,PCIT,PDRYMASST,PDRYMASSS,                          &            
    
                PSIGS,PSRCT,PCLDFR,PBL_DEPTH,PSBL_DEPTH,PWTHVMF,PPHC,PPHR,       &
    
                PLSUM,PLSVM,PLSWM,PLSTHM,PLSRVM, PLSZWSM,                        &
    
                PLBXUM,PLBXVM,PLBXWM,PLBXTHM,PLBXTKEM,PLBXRM,PLBXSVM,            &
                PLBYUM,PLBYVM,PLBYWM,PLBYTHM,PLBYTKEM,PLBYRM,PLBYSVM,            &
                KFRC,TPDTFRC,PUFRC,PVFRC,PWFRC,PTHFRC,PRVFRC,                    &
                PTENDTHFRC,PTENDRVFRC,PGXTHFRC,PGYTHFRC,PPGROUNDFRC,PATC,        &
    
                KADVFRC,TPDTADVFRC,PDTHFRC,PDRVFRC,                              &
                KRELFRC,TPDTRELFRC, PTHREL, PRVREL,                              &
    
                PVTH_FLUX_M,PWTH_FLUX_M,PVU_FLUX_M,                              &
    
                PRUS_PRES,PRVS_PRES,PRWS_PRES,PRTHS_CLD,PRRS_CLD,PRSVS_CLD,      &
                PIBM_LSF,PIBM_XMUT,PUMEANW,PVMEANW,PWMEANW,PUMEANN,PVMEANN,      &
                PWMEANN,PUMEANE,PVMEANE,PWMEANE,PUMEANS,PVMEANS,PWMEANS          )
    
    USE MODD_TIME ! for type DATE_TIME
    !
    !
    
    INTEGER,                   INTENT(IN)  :: KOCEMI !Ocan model index
    
    TYPE(TFILEDATA),           INTENT(IN)  :: TPINIFILE    !Initial file
    
                                 ! array sizes in x, y and z  directions
    ! 
    CHARACTER (LEN=*),         INTENT(IN)  :: HGETTKET,                          &
                                              HGETRVT,HGETRCT,HGETRRT,           &
                                              HGETRIT,HGETRST,HGETRGT,HGETRHT,   & 
    
                                              HGETSIGS,HGETCLDFR,HGETBL_DEPTH,   &
                                              HGETSBL_DEPTH,HGETPHC,HGETPHR
    CHARACTER (LEN=*), DIMENSION(:),INTENT(IN)  :: HGETSVT
    !
    ! GET indicators to know wether a given  variable should or not be read in the
    ! FM file at time t-deltat and t
    
    CHARACTER(LEN=6),         INTENT(IN)    :: HUVW_ADV_SCHEME ! advection scheme for wind
    
    CHARACTER(LEN=4),         INTENT(IN)    :: HTEMP_SCHEME ! advection scheme for wind
    
    !
    ! sizes of the West-east total LB area
    INTEGER, INTENT(IN) :: KSIZELBX_ll,KSIZELBXU_ll      ! for T,V,W and u 
    INTEGER, INTENT(IN) :: KSIZELBXTKE_ll                ! for TKE 
    INTEGER, INTENT(IN) :: KSIZELBXR_ll,KSIZELBXSV_ll    ! for Rx and SV    
    ! sizes of the North-south total LB area
    INTEGER, INTENT(IN) :: KSIZELBY_ll,KSIZELBYV_ll      ! for T,U,W  and v
    
    INTEGER, INTENT(IN) :: KSIZELBYTKE_ll                ! for TKE
    
    INTEGER, INTENT(IN) :: KSIZELBYR_ll,KSIZELBYSV_ll    ! for Rx and SV 
    REAL, DIMENSION(:,:,:),    INTENT(OUT) :: PUM,PVM,PWM     ! U,V,W at t-dt
    
    REAL, DIMENSION(:,:,:),    INTENT(OUT) :: PDUM,PDVM,PDWM  ! Difference on U,V,W 
                                                              ! between t+dt and t-dt
    
    REAL, DIMENSION(:,:),      INTENT(OUT) :: PBL_DEPTH       ! BL depth
    REAL, DIMENSION(:,:),      INTENT(OUT) :: PSBL_DEPTH      ! SBL depth
    REAL, DIMENSION(:,:,:),    INTENT(OUT) :: PWTHVMF         ! MassFlux buoyancy flux
    !
    REAL, DIMENSION(:,:,:),    INTENT(OUT) :: PUT,PVT,PWT     ! U,V,W at t
    REAL, DIMENSION(:,:,:),    INTENT(OUT) :: PTHT,PTKET      ! theta, tke and
    
    REAL, DIMENSION(:,:,:),    INTENT(OUT) :: PRTKEMS         ! tke adv source
    
    REAL, DIMENSION(:,:,:),    INTENT(OUT) :: PPABST          ! pressure at t
    REAL, DIMENSION(:,:,:,:),  INTENT(OUT) :: PRT,PSVT        ! moist and scalar
                                                              ! variables at t
    
    REAL, DIMENSION(:,:),      INTENT(INOUT) :: PZWS
    
    REAL, DIMENSION(:,:,:),    INTENT(OUT) :: PSRCT           ! turbulent flux
                                                              !  <s'Rc'> at t 
    REAL, DIMENSION(:,:,:),    INTENT(OUT) :: PCIT            ! ice conc. at t
    REAL,                      INTENT(OUT) :: PDRYMASST       ! Md(t)
    
    REAL,                      INTENT(OUT) :: PDRYMASSS       ! d Md(t) / dt
    
    REAL, DIMENSION(:,:,:),    INTENT(OUT) :: PSIGS           ! =sqrt(<s's'>) for the
                                                              ! Subgrid Condensation
    REAL, DIMENSION(:,:,:),    INTENT(OUT) :: PCLDFR          ! cloud fraction  
    REAL, DIMENSION(:,:,:),    INTENT(OUT) :: PPHC            ! pH value in cloud water  
    REAL, DIMENSION(:,:,:),    INTENT(OUT) :: PPHR            ! pH value in rainwater  
    ! Larger Scale fields
    REAL, DIMENSION(:,:,:),          INTENT(OUT) :: PLSUM,PLSVM,PLSWM    ! Wind
    REAL, DIMENSION(:,:,:),          INTENT(OUT) :: PLSTHM,  PLSRVM      ! Mass
    ! LB fields
    
    REAL, DIMENSION(:,:),            INTENT(OUT) :: PLSZWSM              ! significant height of sea waves
    
    REAL, DIMENSION(:,:,:),          INTENT(OUT) :: PLBXUM,PLBXVM,PLBXWM ! Wind
    REAL, DIMENSION(:,:,:),          INTENT(OUT) :: PLBXTHM              ! Mass
    REAL, DIMENSION(:,:,:),          INTENT(OUT) :: PLBYUM,PLBYVM,PLBYWM ! Wind
    REAL, DIMENSION(:,:,:),          INTENT(OUT) :: PLBYTHM              ! Mass
    REAL, DIMENSION(:,:,:),          INTENT(OUT) :: PLBXTKEM          ! TKE
    REAL, DIMENSION(:,:,:),          INTENT(OUT) :: PLBYTKEM
    REAL, DIMENSION(:,:,:,:),        INTENT(OUT) :: PLBXRM  ,PLBXSVM  ! Moisture and SV
    REAL, DIMENSION(:,:,:,:),        INTENT(OUT) :: PLBYRM  ,PLBYSVM  ! in x and y-dir.
    ! Forcing fields
    
    INTEGER,                        INTENT(IN)    :: KFRC              ! number of forcing
    TYPE (DATE_TIME), DIMENSION(:), INTENT(OUT)   :: TPDTFRC           ! date of forcing profs.
    REAL, DIMENSION(:,:),           INTENT(OUT)   :: PUFRC,PVFRC,PWFRC ! forcing variables
    REAL, DIMENSION(:,:),           INTENT(OUT)   :: PTHFRC,PRVFRC
    
    REAL, DIMENSION(:,:),           INTENT(OUT) :: PTENDUFRC,PTENDVFRC
    
    REAL, DIMENSION(:,:),           INTENT(OUT)   :: PTENDTHFRC,PTENDRVFRC,PGXTHFRC,PGYTHFRC
    REAL, DIMENSION(:),             INTENT(OUT)   :: PPGROUNDFRC
    REAL, DIMENSION(:,:,:,:),       INTENT(OUT)   :: PATC
    INTEGER,                        INTENT(IN)    :: KADVFRC           ! number of forcing
    TYPE (DATE_TIME), DIMENSION(:), INTENT(OUT)   :: TPDTADVFRC        ! date of forcing profs.
    REAL, DIMENSION(:,:,:,:),       INTENT(OUT)   :: PDTHFRC, PDRVFRC
    INTEGER,                        INTENT(IN)    :: KRELFRC           ! number of forcing
    TYPE (DATE_TIME), DIMENSION(:), INTENT(OUT)   :: TPDTRELFRC        ! date of forcing profs.
    REAL, DIMENSION(:,:,:,:),       INTENT(OUT)   :: PTHREL, PRVREL
    REAL, DIMENSION(:,:,:),         INTENT(OUT)   :: PVTH_FLUX_M,PWTH_FLUX_M,PVU_FLUX_M ! Eddy fluxes
    REAL, DIMENSION(:,:,:),         INTENT(INOUT) :: PRUS_PRES, PRVS_PRES, PRWS_PRES
    REAL, DIMENSION(:,:,:),         INTENT(INOUT) :: PRTHS_CLD
    REAL, DIMENSION(:,:,:,:),       INTENT(INOUT) :: PRRS_CLD, PRSVS_CLD
    
    REAL, DIMENSION(:,:,:),         INTENT(INOUT) :: PIBM_LSF,PIBM_XMUT
    REAL, DIMENSION(:,:,:),         INTENT(INOUT) :: PUMEANW,PVMEANW,PWMEANW
    REAL, DIMENSION(:,:,:),         INTENT(INOUT) :: PUMEANN,PVMEANN,PWMEANN
    REAL, DIMENSION(:,:,:),         INTENT(INOUT) :: PUMEANE,PVMEANE,PWMEANE
    REAL, DIMENSION(:,:,:),         INTENT(INOUT) :: PUMEANS,PVMEANS,PWMEANS
    
    !
    !
    END SUBROUTINE READ_FIELD
    !
    END INTERFACE
    !
    END MODULE MODI_READ_FIELD
    
    !
    !     ########################################################################
    
          SUBROUTINE READ_FIELD(KOCEMI,TPINIFILE,KIU,KJU,KKU,                    &
    
                HGETTKET,HGETRVT,HGETRCT,HGETRRT,HGETRIT,HGETCIT,HGETZWS,        &
    
                HGETRST,HGETRGT,HGETRHT,HGETSVT,HGETSRCT,HGETSIGS,HGETCLDFR,     &
    
                HGETBL_DEPTH,HGETSBL_DEPTH,HGETPHC,HGETPHR,HUVW_ADV_SCHEME,      &
    
                HTEMP_SCHEME,KSIZELBX_ll,KSIZELBXU_ll,KSIZELBY_ll,KSIZELBYV_ll,  &
    
                KSIZELBXTKE_ll,KSIZELBYTKE_ll,                                   &
                KSIZELBXR_ll,KSIZELBYR_ll,KSIZELBXSV_ll,KSIZELBYSV_ll,           &
    
                PUM,PVM,PWM,PDUM,PDVM,PDWM,                                      &
    
                PRT,PSVT,PZWS,PCIT,PDRYMASST,PDRYMASSS,                          &
    
                PSIGS,PSRCT,PCLDFR,PBL_DEPTH,PSBL_DEPTH,PWTHVMF,PPHC,PPHR,       &
    
                PLSUM,PLSVM,PLSWM,PLSTHM,PLSRVM,PLSZWSM,                         &
    
                PLBXUM,PLBXVM,PLBXWM,PLBXTHM,PLBXTKEM,PLBXRM,PLBXSVM,            &
                PLBYUM,PLBYVM,PLBYWM,PLBYTHM,PLBYTKEM,PLBYRM,PLBYSVM,            &
                KFRC,TPDTFRC,PUFRC,PVFRC,PWFRC,PTHFRC,PRVFRC,                    &
                PTENDTHFRC,PTENDRVFRC,PGXTHFRC,PGYTHFRC,PPGROUNDFRC,PATC,        &
    
                KADVFRC,TPDTADVFRC,PDTHFRC,PDRVFRC,                              &
                KRELFRC,TPDTRELFRC, PTHREL, PRVREL,                              &
    
                PVTH_FLUX_M,PWTH_FLUX_M,PVU_FLUX_M,                              &
    
                PRUS_PRES,PRVS_PRES,PRWS_PRES,PRTHS_CLD,PRRS_CLD,PRSVS_CLD,      &
                PIBM_LSF,PIBM_XMUT,PUMEANW,PVMEANW,PWMEANW,PUMEANN,PVMEANN,      &
                PWMEANN,PUMEANE,PVMEANE,PWMEANE,PUMEANS,PVMEANS,PWMEANS          )
    
    !     ########################################################################
    !
    !!****  *READ_FIELD* - routine to read prognostic and surface fields
    !!
    !!    PURPOSE
    !!    -------
    !       The purpose of this routine is to initialize  prognostic and 
    !     surface fields by reading their  value in initial file or by setting 
    !     them to a fixed value.
    !
    !!**  METHOD
    !!    ------
    !!      According to the get indicators, the prognostics fields are :
    !!          - initialized by reading their value in the LFIFM file 
    !!    if the corresponding indicators are equal to 'READ'  
    !!          - initialized to zero if the corresponding indicators 
    !!    are equal to 'INIT'
    !!          -  not initialized if their corresponding indicators 
    !!    are equal to 'SKIP'
    !!
    !!      In case of time step change, all fields at t-dt are (linearly)
    !!    interpolated to get a consistant initial state before the segment 
    !!    integration  
    !!
    !!    EXTERNAL
    !!    --------
    !!      FMREAD   : to read data in LFIFM file
    !!      INI_LS   : to initialize larger scale fields
    !!      INI_LB   : to initialize "2D" surfacic LB fields 
    !!       
    !!    IMPLICIT ARGUMENTS
    !!    ------------------ 
    !!      Module MODD_CONF   : NVERB,CCONF,CPROGRAM
    !!
    !!      Module MODD_CTURB :  XTKEMIN
    !!
    !!    REFERENCE
    !!    ---------
    !!      Book2 of the documentation (routine READ_FIELD)
    !!      
    !!
    !!    AUTHOR
    !!    ------
    !!  	V. Ducrocq       * Meteo France *
    !!
    !!    MODIFICATIONS
    !!    -------------
    !!      Original        15/06/94 
    !!      modification    22/11/94  add the pressure function (J.Stein)
    !!      modification    22/11/94  add the LS fields         (J.Stein)
    !!      modification    06/01/95  add Md(t)                 (J.P.Lafore)
    !!                      26/03/95  add EPS var               (J. Cuxart)
    !!                      30/06/95  add var related to the Subgrid condensation
    !!                                                                   (J.Stein)
    !!                      18/08/95  time step change case     (J.P.Lafore)
    !!                      01/03/96  add the cloud fraction    (J. Stein)
    !!     modification     13/12/95  add fmread of the forcing variables 
    !!                                                          (M.Georgelin)
    !!     modification     13/02/96  external control of the forcing (J.-P. Pinty)
    !!                      11/04/96  add the ice concentration (J.-P. Pinty)
    !!                      27/01/97  read ISVR 3D fields of SV (J.-P. Pinty)
    !!                      26/02/97  "surfacic" LS fieds  introduction (J.P.Lafore)
    !!          (V MASSON)  03/03/97  positivity control for time step change 
    !!                      10/04/97  proper treatment of minima for LS-fields (J.P.Lafore)
    !!           J. Stein   22/06/97  use the absolute pressure
    !!           J. Stein   22/10/97  cleaning + add the LB fields for u,v,w,theta,Rv
    !!          P. Bechtold 22/01/98  add SST and surface pressure forcing
    !!          V. Ducrocq  14/08/98  //,  remove KIINF,KJINF,KISUP,KJSUP,
    !!                                     and introduce INI_LS and INI_LB
    !!          J. Stein    22/01/99  add the reading of STORAGE_TYPE to improve
    !!                                the START case when the file contains 2
    !!                                instants MT
    !!          D. Gazen    22/01/01  use MODD_NSV to handle NSV floating indices
    !!                                for the current model
    !!          V. Masson   01/2004   removes surface (externalization)
    !!       J.-P. Pinty    06/05/04  treat NSV_* for C1R3 and ELEC
    !!                      05/06     Remove EPS
    !!          M. Leriche  04/10     add pH in cloud water and rainwater
    !!          M. Leriche  07/10     treat NSV_* for ice phase chemical species
    
    !!          C.Lac       11/11     Suppress all the t-Dt fields
    
    !!          M.Tomasini, 
    !!          P. Peyrille   06/12   2D west african monsoon : add reading of ADV forcing and addy fluxes 
    !!          C.Lac       03/13     add prognostic supersaturation for C2R2/KHKO
    
    !!          Bosseur & Filippi 07/13 Adds Forefire
    
    !!          M. Leriche  11/14     correct bug in pH initialization
    
    !!          C.Lac       12/14     correction for reproducibility START/RESTA
    
    Gaelle TANGUY's avatar
    Gaelle TANGUY committed
    !!      Modification    01/2016  (JP Pinty) Add LIMA
    
    !!          M. Leriche  02/16     treat gas and aq. chemicals separately
    
    !!          C.Lac        10/16 CEN4TH with RKC4 + Correction on RK loop
    
    !!                   09/2017 Q.Rodier add LTEND_UV_FRC
    
    !!  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
    
    !  V. Vionnet       07/17:   add blowing snow scheme
    !  P. Wautelet    01/2019:  corrected intent of PDUM,PDVM,PDWM (OUT->INOUT)
    
    !  P. Wautelet 13/02/2019: removed PPABSM and PTSTEP dummy arguments (bugfix: PPABSM was intent(OUT))
    
    !  S. Bielli      02/2019:  Sea salt : significant sea wave height influences salt emission; 5 salt modes
    
    !  P. Wautelet 14/03/2019: correct ZWS when variable not present in file
    
    !  M. Leriche  10/06/2019: in restart case read all immersion modes for LIMA
    
    !  B. Vie         06/2020: Add prognostic supersaturation for LIMA
    !  F. Auguste     02/2021: add fields necessary for IBM
    !  T. Nagel       02/2021: add fields necessary for turbulence recycling
    !  JL. Redelsperger 03/2021:  add necessary variables for Ocean LES case
    !  P. Wautelet 04/02/2022: use TSVLIST to manage metadata of scalar variables
    
    !!-------------------------------------------------------------------------------
    
    !
    !*       0.    DECLARATIONS
    !              ------------
    !
    
    USE MODD_2D_FRC,          ONLY: L2D_ADV_FRC, L2D_REL_FRC
    USE MODD_ADV_n,           ONLY: CTEMP_SCHEME, LSPLIT_CFL
    USE MODD_BLOWSNOW_n,      ONLY: XSNWCANO
    USE MODD_CONF,            ONLY: CCONF, CPROGRAM, L1D, LFORCING, NVERB
    USE MODD_CONF_n,          ONLY: IDX_RVT, IDX_RCT, IDX_RRT, IDX_RIT, IDX_RST, IDX_RGT, IDX_RHT
    USE MODD_CST,             ONLY: XALPW, XBETAW, XCPD, XGAMW, XMD, XMV, XP00, XRD
    USE MODD_CTURB,           ONLY: XTKEMIN
    
    use modd_field,           only: tfieldmetadata, tfieldlist, TYPEDATE, TYPEREAL, TYPELOG, TYPEINT
    
    USE MODD_FIELD_n,         only: XZWS_DEFAULT
    
    USE MODD_LATZ_EDFLX,      ONLY: LTH_FLX, LUV_FLX
    
    USE MODD_LUNIT_N,         ONLY: TLUOUT
    
    USE MODD_NSV,             ONLY: NSV, NSV_C2R2BEG, NSV_C2R2END, NSV_CSBEG, NSV_CSEND, &
    #ifdef MNH_FOREFIRE
                                    NSV_FFBEG, NSV_FFEND,                                &
    #endif
                                    NSV_PPBEG, NSV_PPEND, NSV_SNW, NSV_USER, TSVLIST
    USE MODD_OCEANH,          ONLY: NFRCLT, NINFRT, XSSOLA_T, XSSUFL_T, XSSTFL_T, XSSVFL_T
    
    USE MODD_PARAM_C2R2,      ONLY: LSUPSAT
    
    USE MODD_RECYCL_PARAM_n,  ONLY: LRECYCLE, LRECYCLN, LRECYCLS, LRECYCLW, NR_COUNT
    
    Gaelle TANGUY's avatar
    Gaelle TANGUY committed
    !
    
    use mode_field,           only: Find_field_id_from_mnhname
    
    USE MODE_TOOLS,           ONLY: UPCASE
    
    !
    IMPLICIT NONE
    !
    !*       0.1   declarations of arguments
    !
    !
    !
    
    INTEGER,                   INTENT(IN)  :: KOCEMI !Ocan model index
    
    TYPE(TFILEDATA),           INTENT(IN)  :: TPINIFILE    !Initial file
    
                                 ! array sizes in x, y and z  directions
    ! 
    CHARACTER (LEN=*),         INTENT(IN)  :: HGETTKET,                          &
                                              HGETRVT,HGETRCT,HGETRRT,           &
                                              HGETRIT,HGETRST,HGETRGT,HGETRHT,   & 
    
                                              HGETSIGS,HGETCLDFR,HGETBL_DEPTH,   &
                                              HGETSBL_DEPTH,HGETPHC,HGETPHR
    CHARACTER (LEN=*), DIMENSION(:),INTENT(IN)  :: HGETSVT
    !
    ! GET indicators to know wether a given  variable should or not be read in the
    ! FM file at time t-deltat and t
    !
    
    CHARACTER(LEN=6),         INTENT(IN)    :: HUVW_ADV_SCHEME ! advection scheme for wind
    
    CHARACTER(LEN=4),         INTENT(IN)    :: HTEMP_SCHEME ! advection scheme for wind
    
    ! sizes of the West-east total LB area
    INTEGER, INTENT(IN) :: KSIZELBX_ll,KSIZELBXU_ll      ! for T,V,W and u 
    INTEGER, INTENT(IN) :: KSIZELBXTKE_ll                ! for TKE 
    INTEGER, INTENT(IN) :: KSIZELBXR_ll,KSIZELBXSV_ll    ! for Rx and SV    
    ! sizes of the North-south total LB area
    INTEGER, INTENT(IN) :: KSIZELBY_ll,KSIZELBYV_ll      ! for T,U,W  and v
    
    INTEGER, INTENT(IN) :: KSIZELBYTKE_ll                ! for TKE
    
    INTEGER, INTENT(IN) :: KSIZELBYR_ll,KSIZELBYSV_ll    ! for Rx and SV 
    !
    
    REAL, DIMENSION(:,:,:),    INTENT(OUT) :: PUM,PVM,PWM     ! U,V,W at t-dt
    
    REAL, DIMENSION(:,:,:),    INTENT(INOUT) :: PDUM,PDVM,PDWM  ! Difference on U,V,W
    
                                                              ! between t+dt and t-dt
    
    REAL, DIMENSION(:,:),      INTENT(OUT) :: PBL_DEPTH       ! BL depth
    REAL, DIMENSION(:,:),      INTENT(OUT) :: PSBL_DEPTH      ! SBL depth
    REAL, DIMENSION(:,:,:),    INTENT(OUT) :: PWTHVMF         ! MassFlux buoyancy flux
    !
    REAL, DIMENSION(:,:,:),    INTENT(OUT) :: PUT,PVT,PWT     ! U,V,W at t
    REAL, DIMENSION(:,:,:),    INTENT(OUT) :: PTHT,PTKET      ! theta, tke and
    
    REAL, DIMENSION(:,:,:),    INTENT(OUT) :: PRTKEMS         ! tke adv source
    
    REAL, DIMENSION(:,:,:),    INTENT(OUT) :: PPABST          ! pressure at t
    REAL, DIMENSION(:,:,:,:),  INTENT(OUT) :: PRT,PSVT        ! moist and scalar
                                                              ! variables at t
    
    REAL, DIMENSION(:,:),      INTENT(INOUT) :: PZWS
    
    REAL, DIMENSION(:,:,:),    INTENT(OUT) :: PSRCT           ! turbulent flux
                                                              !  <s'Rc'> at t 
    REAL, DIMENSION(:,:,:),    INTENT(OUT) :: PCIT            ! ice conc. at t
    REAL,                      INTENT(OUT) :: PDRYMASST       ! Md(t)
    
    REAL,                      INTENT(OUT) :: PDRYMASSS       ! d Md(t) / dt
    
    REAL, DIMENSION(:,:,:),    INTENT(OUT) :: PSIGS           ! =sqrt(<s's'>) for the
                                                              ! Subgrid Condensation
    REAL, DIMENSION(:,:,:),    INTENT(OUT) :: PCLDFR          ! cloud fraction  
    REAL, DIMENSION(:,:,:),    INTENT(OUT) :: PPHC            ! pH value in cloud water  
    REAL, DIMENSION(:,:,:),    INTENT(OUT) :: PPHR            ! pH value in rainwater  
    !
    !
    ! Larger Scale fields
    
    REAL, DIMENSION(:,:),            INTENT(OUT) :: PLSZWSM              ! significant height of sea waves
    
    REAL, DIMENSION(:,:,:),          INTENT(OUT) :: PLSUM,PLSVM,PLSWM    ! Wind
    REAL, DIMENSION(:,:,:),          INTENT(OUT) :: PLSTHM,  PLSRVM      ! Mass
    REAL, DIMENSION(:,:,:),          INTENT(OUT) :: PLBXUM,PLBXVM,PLBXWM ! Wind
    REAL, DIMENSION(:,:,:),          INTENT(OUT) :: PLBXTHM              ! Mass
    REAL, DIMENSION(:,:,:),          INTENT(OUT) :: PLBYUM,PLBYVM,PLBYWM ! Wind
    REAL, DIMENSION(:,:,:),          INTENT(OUT) :: PLBYTHM              ! Mass
    REAL, DIMENSION(:,:,:),          INTENT(OUT) :: PLBXTKEM          ! TKE
    REAL, DIMENSION(:,:,:),          INTENT(OUT) :: PLBYTKEM
    REAL, DIMENSION(:,:,:,:),        INTENT(OUT) :: PLBXRM  ,PLBXSVM  ! Moisture and SV
    REAL, DIMENSION(:,:,:,:),        INTENT(OUT) :: PLBYRM  ,PLBYSVM  ! in x and y-dir.
    !
    !       
    ! Forcing fields
    
    INTEGER,                        INTENT(IN)    :: KFRC              ! number of forcing
    TYPE (DATE_TIME), DIMENSION(:), INTENT(OUT)   :: TPDTFRC           ! date of forcing profs.
    REAL, DIMENSION(:,:),           INTENT(OUT)   :: PUFRC,PVFRC,PWFRC ! forcing variables
    REAL, DIMENSION(:,:),           INTENT(OUT)   :: PTHFRC,PRVFRC
    
    REAL, DIMENSION(:,:),           INTENT(OUT) :: PTENDUFRC,PTENDVFRC
    
    REAL, DIMENSION(:,:),           INTENT(OUT)   :: PTENDTHFRC,PTENDRVFRC,PGXTHFRC,PGYTHFRC
    REAL, DIMENSION(:),             INTENT(OUT)   :: PPGROUNDFRC
    REAL, DIMENSION(:,:,:,:),       INTENT(OUT)   :: PATC
    INTEGER,                        INTENT(IN)    :: KADVFRC           ! number of forcing
    TYPE (DATE_TIME), DIMENSION(:), INTENT(OUT)   :: TPDTADVFRC        ! date of forcing profs.
    REAL, DIMENSION(:,:,:,:),       INTENT(OUT)   :: PDTHFRC, PDRVFRC
    INTEGER,                        INTENT(IN)    :: KRELFRC           ! number of forcing
    TYPE (DATE_TIME), DIMENSION(:), INTENT(OUT)   :: TPDTRELFRC        ! date of forcing profs.
    REAL, DIMENSION(:,:,:,:),       INTENT(OUT)   :: PTHREL, PRVREL
    REAL, DIMENSION(:,:,:),         INTENT(OUT)   :: PVTH_FLUX_M,PWTH_FLUX_M,PVU_FLUX_M ! Eddy fluxes
    REAL, DIMENSION(:,:,:),         INTENT(INOUT) :: PRUS_PRES, PRVS_PRES, PRWS_PRES
    REAL, DIMENSION(:,:,:),         INTENT(INOUT) :: PRTHS_CLD
    REAL, DIMENSION(:,:,:,:),       INTENT(INOUT) :: PRRS_CLD, PRSVS_CLD
    
    REAL, DIMENSION(:,:,:),         INTENT(INOUT) :: PIBM_LSF          ! LSF for IBM
    REAL, DIMENSION(:,:,:),         INTENT(INOUT) :: PIBM_XMUT         ! Turbulent viscosity
    REAL, DIMENSION(:,:,:),         INTENT(INOUT) :: PUMEANW,PVMEANW,PWMEANW ! Velocity average at West boundary
    REAL, DIMENSION(:,:,:),         INTENT(INOUT) :: PUMEANN,PVMEANN,PWMEANN ! Velocity average at North boundary
    REAL, DIMENSION(:,:,:),         INTENT(INOUT) :: PUMEANE,PVMEANE,PWMEANE ! Velocity average at East boundary
    REAL, DIMENSION(:,:,:),         INTENT(INOUT) :: PUMEANS,PVMEANS,PWMEANS ! Velocity average at South boundary
    
    !
    !*       0.2   declarations of local variables
    !
    
    INTEGER                      :: ILUOUT       ! Unit number for prints
    INTEGER                      :: IRESP
    INTEGER                      :: ISV          ! total number of  scalar variables
    INTEGER                      :: JSV          ! Loop index for additional scalar variables
    INTEGER                      :: JKLOOP,JRR   ! Loop indexes
    INTEGER                      :: IIUP,IJUP    ! size  of working window arrays
    INTEGER                      :: JT           ! loop index
    LOGICAL                      :: GLSOURCE     ! switch for the source term (for ini_ls and ini_lb)
    
    LOGICAL                      :: ZLRECYCL     ! switch if turbulence recycling is activated
    
    CHARACTER(LEN=3)             :: YFRC         ! To mark the different forcing dates
    
    REAL, DIMENSION(KIU,KJU,KKU) :: ZWORK        ! to compute supersaturation
    
    Gaelle TANGUY's avatar
    Gaelle TANGUY committed
    !
    
    !-------------------------------------------------------------------------------
    !
    !*       1.    INITIALIZATION
    !              ---------------
    !
    GLSOURCE=.FALSE.
    ZWORK = 0.0
    !
    
    !If TPINIFILE file was written with a MesoNH version < 5.6, some variables had different names or were not available
    GOLDFILEFORMAT = (        TPINIFILE%NMNHVERSION(1) < 5                                       &
                       .OR. ( TPINIFILE%NMNHVERSION(1) == 5 .AND. TPINIFILE%NMNHVERSION(2) < 6 ) )
    
    !-------------------------------------------------------------------------------
    !
    !*       2.    READ PROGNOSTIC VARIABLES
    !              -------------------------
    !
    
    !*       2.1  Time t:
    
      CALL FIND_FIELD_ID_FROM_MNHNAME('UT',IID,IRESP)
    
      TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
    
      TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
    
      TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
    
      TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
    
      !
      CALL FIND_FIELD_ID_FROM_MNHNAME('PABST',IID,IRESP)
    
      TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
    
    ELSE
    
      CALL IO_Field_read(TPINIFILE,'UT',PUT)
      CALL IO_Field_read(TPINIFILE,'VT',PVT)
      CALL IO_Field_read(TPINIFILE,'WT',PWT)
      CALL IO_Field_read(TPINIFILE,'THT',PTHT)
      CALL IO_Field_read(TPINIFILE,'PABST',PPABST)
    
    ENDIF
    
    SELECT CASE(HGETTKET)                   
      CASE('READ')
    
          CALL FIND_FIELD_ID_FROM_MNHNAME('TKET',IID,IRESP)
    
          TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
    
        ELSE
    
        END IF
    
        IF ( ( (TPINIFILE%NMNHVERSION(1)==5 .AND. TPINIFILE%NMNHVERSION(2)>0) .OR. TPINIFILE%NMNHVERSION(1)>5 ) &
            .AND. (CCONF == 'RESTA') .AND. LSPLIT_CFL) THEN
    
      CASE('INIT')
    
        PTKET(:,:,:)   = XTKEMIN
        PRTKEMS(:,:,:) = 0.
    
        CALL IO_Field_read(TPINIFILE,'ZWS',PZWS,IRESP)
    
        !If the field ZWS is not in the file, set its value to XZWS_DEFAULT
        !ZWS is present in files since MesoNH 5.4.2
        IF ( IRESP/=0 ) THEN
          WRITE (YVAL,'( E15.8 )') XZWS_DEFAULT
          CALL PRINT_MSG(NVERB_WARNING,'IO','READ_FIELD','ZWS not found in file: using default value: '//TRIM(YVAL)//' m')
          PZWS(:,:) = XZWS_DEFAULT
        END IF
    
    
    SELECT CASE(HGETRVT)             ! vapor
    
      CASE('READ')
    
          CALL FIND_FIELD_ID_FROM_MNHNAME('RVT',IID,IRESP)
    
          TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
    
          CALL IO_Field_read(TPINIFILE,TZFIELD,PRT(:,:,:,IDX_RVT))
    
        ELSE
    
          CALL IO_Field_read(TPINIFILE,'RVT',PRT(:,:,:,IDX_RVT))
    
        END IF
    
      CASE('INIT')
    
    SELECT CASE(HGETRCT)             ! cloud 
    
      CASE('READ') 
    
          CALL FIND_FIELD_ID_FROM_MNHNAME('RCT',IID,IRESP)
    
          TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
    
          CALL IO_Field_read(TPINIFILE,TZFIELD,PRT(:,:,:,IDX_RCT))
    
          CALL IO_Field_read(TPINIFILE,'RCT',PRT(:,:,:,IDX_RCT))
    
        END IF
      CASE('INIT')
    
        PRT(:,:,:,IDX_RCT) = 0.
    
    SELECT CASE(HGETRRT)             ! rain 
      CASE('READ') 
    
          CALL FIND_FIELD_ID_FROM_MNHNAME('RRT',IID,IRESP)
    
          TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
    
          CALL IO_Field_read(TPINIFILE,TZFIELD,PRT(:,:,:,IDX_RRT))
    
        ELSE
    
          CALL IO_Field_read(TPINIFILE,'RRT',PRT(:,:,:,IDX_RRT))
    
        END IF 
    
      CASE('INIT')
    
        PRT(:,:,:,IDX_RRT) = 0.
    
    END SELECT
    !
    SELECT CASE(HGETRIT)             ! cloud ice
    
      CASE('READ') 
    
          CALL FIND_FIELD_ID_FROM_MNHNAME('RIT',IID,IRESP)
    
          TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
    
          CALL IO_Field_read(TPINIFILE,TZFIELD,PRT(:,:,:,IDX_RIT))
    
        ELSE
    
          CALL IO_Field_read(TPINIFILE,'RIT',PRT(:,:,:,IDX_RIT))
    
        END IF 
    
      CASE('INIT')
    
    END SELECT
    !
    SELECT CASE(HGETRST)             ! snow
    
      CASE('READ')
    
          CALL FIND_FIELD_ID_FROM_MNHNAME('RST',IID,IRESP)
    
          TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
    
          CALL IO_Field_read(TPINIFILE,TZFIELD,PRT(:,:,:,IDX_RST))
    
        ELSE
    
          CALL IO_Field_read(TPINIFILE,'RST',PRT(:,:,:,IDX_RST))
    
        END IF 
    
      CASE('INIT')
    
    END SELECT
    !
    SELECT CASE(HGETRGT)             ! graupel
      CASE('READ') 
    
          CALL FIND_FIELD_ID_FROM_MNHNAME('RGT',IID,IRESP)
    
          TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
    
          CALL IO_Field_read(TPINIFILE,TZFIELD,PRT(:,:,:,IDX_RGT))
    
        ELSE
    
          CALL IO_Field_read(TPINIFILE,'RGT',PRT(:,:,:,IDX_RGT))
    
        END IF 
    
      CASE('INIT')
    
    SELECT CASE(HGETRHT)             ! hail
      CASE('READ') 
    
          CALL FIND_FIELD_ID_FROM_MNHNAME('RHT',IID,IRESP)
    
          TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
    
          CALL IO_Field_read(TPINIFILE,TZFIELD,PRT(:,:,:,IDX_RHT))
    
        ELSE
    
          CALL IO_Field_read(TPINIFILE,'RHT',PRT(:,:,:,IDX_RHT))
    
        END IF 
    
      CASE('INIT')
    
    END SELECT
    !
    SELECT CASE(HGETCIT)             ! ice concentration
      CASE('READ')
    
        IF (SIZE(PCIT) /= 0 ) CALL IO_Field_read(TPINIFILE,'CIT',PCIT)
    
      CASE('INIT')
        PCIT(:,:,:)=0.
    END SELECT
    !
    
    IF (LIBM .AND. CPROGRAM=='MESONH') THEN
       !
       TZFIELD%CMNHNAME  = 'LSFP'
       TZFIELD%CLONGNAME = 'LSFP'
       TZFIELD%CSTDNAME  = ''
       TZFIELD%CUNITS    = 'm'
       TZFIELD%CDIR      = 'XY'
       TZFIELD%NGRID     = 1
       TZFIELD%NTYPE     = TYPEREAL
       TZFIELD%NDIMS     = 3
       TZFIELD%LTIMEDEP  = .TRUE.
       !
       CALL IO_Field_read(TPINIFILE,TZFIELD,PIBM_LSF)
       !
       TZFIELD%CMNHNAME  = 'XMUT'
       TZFIELD%CLONGNAME = 'XMUT'
       TZFIELD%CSTDNAME  = ''
    
       TZFIELD%CUNITS    = 'm2 s-1'
    
       TZFIELD%CDIR      = 'XY'
       TZFIELD%NGRID     = 1
       TZFIELD%NTYPE     = TYPEREAL
       TZFIELD%NDIMS     = 3
       TZFIELD%LTIMEDEP  = .TRUE.
       !
       CALL IO_Field_read(TPINIFILE,TZFIELD,PIBM_XMUT)
       !
    ENDIF
    !
    TZFIELD%CMNHNAME   = 'RECYCLING'
    TZFIELD%CLONGNAME  = 'RECYCLING'
    TZFIELD%CSTDNAME   = ''
    TZFIELD%CUNITS     = ''
    
    TZFIELD%CDIR       = '--'
    
    TZFIELD%NGRID      = 1
    TZFIELD%NTYPE      = TYPELOG
    TZFIELD%NDIMS      = 0
    TZFIELD%LTIMEDEP   = .FALSE. 
    
    CALL IO_Field_read(TPINIFILE,TZFIELD,ZLRECYCL,IRESP)
    !If field not found (file from older version of MesoNH) => set ZLRECYCL to false
    IF ( IRESP /= 0 ) ZLRECYCL = .FALSE.
    
    
    IF (ZLRECYCL) THEN
      !
      TZFIELD%CMNHNAME   = 'RCOUNT'
      TZFIELD%CLONGNAME  = 'RCOUNT'
      TZFIELD%CSTDNAME   = ''
      TZFIELD%CUNITS     = ''
    
      TZFIELD%CDIR       = '--'
    
      TZFIELD%NGRID      = 1
      TZFIELD%NTYPE      = TYPEINT
      TZFIELD%NDIMS      = 0
      TZFIELD%LTIMEDEP   = .TRUE.
    
      CALL IO_Field_read(TPINIFILE,TZFIELD,NR_COUNT)
    
        IF (LRECYCLW) THEN 
          TZFIELD%CMNHNAME   = 'URECYCLW'
          TZFIELD%CLONGNAME  = 'URECYCLW'
          TZFIELD%CSTDNAME   = ''
    
          TZFIELD%CUNITS     = 'm s-1'
          TZFIELD%CDIR       = 'XY'
    
          TZFIELD%NGRID      = 2
          TZFIELD%NTYPE      = TYPEREAL
          TZFIELD%NDIMS      = 3
          TZFIELD%LTIMEDEP   = .TRUE.
          CALL IO_Field_read(TPINIFILE,TZFIELD,PUMEANW)
          !
          TZFIELD%CMNHNAME   = 'VRECYCLW'
          TZFIELD%CLONGNAME  = 'VRECYCLW'
          TZFIELD%CSTDNAME   = ''
    
          TZFIELD%CUNITS     = 'm s-1'
          TZFIELD%CDIR       = 'XY'
    
          TZFIELD%NGRID      = 3
          TZFIELD%NTYPE      = TYPEREAL
          TZFIELD%NDIMS      = 3
          TZFIELD%LTIMEDEP   = .TRUE.
          CALL IO_Field_read(TPINIFILE,TZFIELD,PVMEANW)
          !
          TZFIELD%CMNHNAME   = 'WRECYCLW'
          TZFIELD%CLONGNAME  = 'WRECYCLW'
          TZFIELD%CSTDNAME   = ''
    
          TZFIELD%CUNITS     = 'm s-1'
          TZFIELD%CDIR       = 'XY'
    
          TZFIELD%NGRID      = 4
          TZFIELD%NTYPE      = TYPEREAL
          TZFIELD%NDIMS      = 3
          TZFIELD%LTIMEDEP   = .TRUE.
          CALL IO_Field_read(TPINIFILE,TZFIELD,PWMEANW)
          !
        ENDIF  
        IF (LRECYCLN) THEN
          TZFIELD%CMNHNAME   = 'URECYCLN'
          TZFIELD%CLONGNAME  = 'URECYCLN'
          TZFIELD%CSTDNAME   = ''
    
          TZFIELD%CUNITS     = 'm s-1'
          TZFIELD%CDIR       = 'XY'
    
          TZFIELD%NGRID      = 2
          TZFIELD%NTYPE      = TYPEREAL
          TZFIELD%NDIMS      = 3
          TZFIELD%LTIMEDEP   = .TRUE.
          CALL IO_Field_read(TPINIFILE,TZFIELD,PUMEANN)
          !
          TZFIELD%CMNHNAME   = 'VRECYCLN'
          TZFIELD%CLONGNAME  = 'VRECYCLN'
          TZFIELD%CSTDNAME   = ''
    
          TZFIELD%CUNITS     = 'm s-1'
          TZFIELD%CDIR       = 'XY'
    
          TZFIELD%NGRID      = 3
          TZFIELD%NTYPE      = TYPEREAL
          TZFIELD%NDIMS      = 3
          TZFIELD%LTIMEDEP   = .TRUE.
          CALL IO_Field_read(TPINIFILE,TZFIELD,PVMEANN)
          !
          TZFIELD%CMNHNAME   = 'WRECYCLN'
          TZFIELD%CLONGNAME  = 'WRECYCLN'
          TZFIELD%CSTDNAME   = ''
    
          TZFIELD%CUNITS     = 'm s-1'
          TZFIELD%CDIR       = 'XY'
    
          TZFIELD%NGRID      = 4
          TZFIELD%NTYPE      = TYPEREAL
          TZFIELD%NDIMS      = 3
          TZFIELD%LTIMEDEP   = .TRUE.
          CALL IO_Field_read(TPINIFILE,TZFIELD,PWMEANN)
          !
        ENDIF
        IF (LRECYCLE) THEN  
          TZFIELD%CMNHNAME   = 'URECYCLE'
          TZFIELD%CLONGNAME  = 'URECYCLE'
          TZFIELD%CSTDNAME   = ''
    
          TZFIELD%CUNITS     = 'm s-1'
          TZFIELD%CDIR       = 'XY'
    
          TZFIELD%NGRID      = 2
          TZFIELD%NTYPE      = TYPEREAL
          TZFIELD%NDIMS      = 3
          TZFIELD%LTIMEDEP   = .TRUE.
          CALL IO_Field_read(TPINIFILE,TZFIELD,PUMEANE)
          !
          TZFIELD%CMNHNAME   = 'VRECYCLE'
          TZFIELD%CLONGNAME  = 'VRECYCLE'
          TZFIELD%CSTDNAME   = ''
    
          TZFIELD%CUNITS     = 'm s-1'
          TZFIELD%CDIR       = 'XY'
    
          TZFIELD%NGRID      = 3
          TZFIELD%NTYPE      = TYPEREAL
          TZFIELD%NDIMS      = 3
          TZFIELD%LTIMEDEP   = .TRUE.
          CALL IO_Field_read(TPINIFILE,TZFIELD,PVMEANE)
          !
          TZFIELD%CMNHNAME   = 'WRECYCLE'
          TZFIELD%CLONGNAME  = 'WRECYCLE'
          TZFIELD%CSTDNAME   = ''
    
          TZFIELD%CUNITS     = 'm s-1'
          TZFIELD%CDIR       = 'XY'
    
          TZFIELD%NGRID      = 4
          TZFIELD%NTYPE      = TYPEREAL
          TZFIELD%NDIMS      = 3
          TZFIELD%LTIMEDEP   = .TRUE.
          CALL IO_Field_read(TPINIFILE,TZFIELD,PWMEANE)
          !
        ENDIF  
        IF (LRECYCLS) THEN
          TZFIELD%CMNHNAME   = 'URECYCLS'
          TZFIELD%CLONGNAME  = 'URECYCLS'
          TZFIELD%CSTDNAME   = ''
    
          TZFIELD%CUNITS     = 'm s-1'
          TZFIELD%CDIR       = 'XY'
    
          TZFIELD%NGRID      = 2
          TZFIELD%NTYPE      = TYPEREAL
          TZFIELD%NDIMS      = 3
          TZFIELD%LTIMEDEP   = .TRUE.
          CALL IO_Field_read(TPINIFILE,TZFIELD,PUMEANS)
          !
          TZFIELD%CMNHNAME   = 'VRECYCLS'
          TZFIELD%CLONGNAME  = 'VRECYCLS'
          TZFIELD%CSTDNAME   = ''
    
          TZFIELD%CUNITS     = 'm s-1'
          TZFIELD%CDIR       = 'XY'
    
          TZFIELD%NGRID      = 3
          TZFIELD%NTYPE      = TYPEREAL
          TZFIELD%NDIMS      = 3
          TZFIELD%LTIMEDEP   = .TRUE.
          CALL IO_Field_read(TPINIFILE,TZFIELD,PVMEANS)
          !
          TZFIELD%CMNHNAME   = 'WRECYCLS'
          TZFIELD%CLONGNAME  = 'WRECYCLS'
          TZFIELD%CSTDNAME   = ''
    
          TZFIELD%CUNITS     = 'm s-1'
          TZFIELD%CDIR       = 'XY'
    
          TZFIELD%NGRID      = 4
          TZFIELD%NTYPE      = TYPEREAL
          TZFIELD%NDIMS      = 3
          TZFIELD%LTIMEDEP   = .TRUE.
          CALL IO_Field_read(TPINIFILE,TZFIELD,PWMEANS)
        ENDIF
      ENDIF  
    ENDIF
    !
    
    Gaelle TANGUY's avatar
    Gaelle TANGUY committed
    !  Scalar Variables Reading : Users, C2R2, C1R3, LIMA, ELEC, Chemical SV
    
    ISV= SIZE(PSVT,4)
    !
    
    DO JSV = 1, NSV              ! initialize according to the get indicators
      SELECT CASE( HGETSVT(JSV) )
        CASE ('READ')
          TZFIELD = TSVLIST(JSV)
    
    
          IF ( GOLDFILEFORMAT ) THEN
            IF ( ( JSV >= 1         .AND. JSV <= NSV_USER  ) .OR. &
    
                 ( JSV >= NSV_PPBEG .AND. JSV <= NSV_PPEND ) .OR. &
    #ifdef MNH_FOREFIRE
                 ( JSV >= NSV_FFBEG .AND. JSV <= NSV_FFEND ) .OR. &
    #endif
    
                 ( JSV >= NSV_CSBEG .AND. JSV <= NSV_CSEND )      ) THEN
    
              !Some variables were written with an other name in MesoNH < 5.6
    
              WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'SVT',JSV
              TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
              TZFIELD%CSTDNAME   = ''
              TZFIELD%CCOMMENT   = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME)
            ELSE
              !Scalar variables were written with a T suffix in older versions
              TZFIELD%CMNHNAME  = TRIM( TZFIELD%CMNHNAME )  // 'T'
              TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T'
            END IF
    
          END IF
    
          CALL IO_Field_read( TPINIFILE, TZFIELD, PSVT(:,:,:,JSV), IRESP )
    
          IF ( IRESP /= 0 ) THEN
            CALL PRINT_MSG( NVERB_WARNING, 'IO', 'READ_FIELD', 'PSVT set to 0 for ' // TRIM( TZFIELD%CMNHNAME ) )
    
          END IF
    
        CASE ('INIT')
          PSVT(:,:,:,JSV) = 0.
    
          IF ( JSV == NSV_C2R2END ) THEN
            IF ( LSUPSAT .AND. (HGETRVT == 'READ') ) THEN
    
              ZWORK(:,:,:) = (PPABST(:,:,:)/XP00 )**(XRD/XCPD)
              ZWORK(:,:,:) = PTHT(:,:,:)*ZWORK(:,:,:)
    
              ZWORK(:,:,:) = EXP(XALPW-XBETAW/ZWORK(:,:,:)-XGAMW*LOG(ZWORK(:,:,:)))
    
              !rvsat
              ZWORK(:,:,:) = (XMV / XMD)*ZWORK(:,:,:)/(PPABST(:,:,:)-ZWORK(:,:,:))
    
              ZWORK(:,:,:) = PRT(:,:,:,IDX_RVT)/ZWORK(:,:,:)
    
    Gaelle TANGUY's avatar
    Gaelle TANGUY committed
      END SELECT
    END DO
    
    
    DO JSV = NSV_PPBEG, NSV_PPEND
      SELECT CASE( HGETSVT(JSV) )
        CASE ('READ')
          WRITE( YNUM3, '( I3.3 )' ) JSV
    
          TZFIELD = TFIELDMETADATA(            &
            CMNHNAME   = 'ATC' // YNUM3,       &
            CSTDNAME   = '',                   &
            CLONGNAME  = 'ATC' // YNUM3,       &
            CCOMMENT   = 'X_Y_Z_ATC' // YNUM3, &
            CUNITS     = 'm-3',                &
            CDIR       = 'XY',                 &
            NGRID      = 1,                    &
            NTYPE      = TYPEREAL,             &
            NDIMS      = 3,                    &
            LTIMEDEP   = .TRUE.                )
    
          CALL IO_Field_read( TPINIFILE, TZFIELD, PATC(:,:,:,JSV-NSV_PPBEG+1), IRESP )
    
          IF ( IRESP /= 0 ) THEN
    
            PATC(:,:,:,JSV-NSV_PPBEG+1) = 0.
    
          ENDIF
    
        CASE ('INIT')
          PATC(:,:,:,JSV-NSV_PPBEG+1) = 0.
    
      END SELECT
    END DO
    
    IF ( NSV_SNW >= 1 ) THEN
    
      TZFIELD%CDIR       = 'XY'
      TZFIELD%NGRID      = 1
      TZFIELD%NTYPE      = TYPEREAL
      TZFIELD%NDIMS      = 2
      TZFIELD%LTIMEDEP   = .TRUE.
    
        SELECT CASE(HGETSVT(JSV))
          CASE ('READ')
    
            WRITE(TZFIELD%CMNHNAME,'(A10,I3.3)')'SNOWCANO_M',JSV
    
            TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
            WRITE(TZFIELD%CCOMMENT,'(A6,A8,I3.3)') 'X_Y_Z_','SNOWCANO',JSV
    
            CALL IO_Field_read( TPINIFILE, TZFIELD, XSNWCANO(:,:,JSV) )
    
          CASE ('INIT')
            XSNWCANO(:,:,JSV) = 0.
        END SELECT
      END DO
    END IF
    
    IF (CCONF == 'RESTA') THEN
    
        CALL IO_Field_read(TPINIFILE,'US_PRES',PRUS_PRES)
        CALL IO_Field_read(TPINIFILE,'VS_PRES',PRVS_PRES)
        CALL IO_Field_read(TPINIFILE,'WS_PRES',PRWS_PRES)
    
        CALL IO_Field_read(TPINIFILE,'THS_CLD',PRTHS_CLD)
    
              CALL IO_Field_read(TPINIFILE,'RVS_CLD',PRRS_CLD(:,:,:,JRR))
    
              CALL IO_Field_read(TPINIFILE,'RCS_CLD',PRRS_CLD(:,:,:,JRR))
    
              CALL IO_Field_read(TPINIFILE,'RRS_CLD',PRRS_CLD(:,:,:,JRR))
    
              CALL IO_Field_read(TPINIFILE,'RIS_CLD',PRRS_CLD(:,:,:,JRR))
    
              CALL IO_Field_read(TPINIFILE,'RSS_CLD',PRRS_CLD(:,:,:,JRR))
    
              CALL IO_Field_read(TPINIFILE,'RGS_CLD',PRRS_CLD(:,:,:,JRR))
    
              CALL IO_Field_read(TPINIFILE,'RHS_CLD',PRRS_CLD(:,:,:,JRR))
    
            CASE DEFAULT
              CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_FIELD','PRT is too big')
          END SELECT
        END DO
        DO JSV = NSV_C2R2BEG,NSV_C2R2END
          IF (JSV == NSV_C2R2BEG ) THEN
            TZFIELD%CMNHNAME   = 'RSVS_CLD1'
            TZFIELD%CSTDNAME   = ''
            TZFIELD%CLONGNAME  = 'RSVS_CLD1'
            TZFIELD%CUNITS     = '1'
            TZFIELD%CDIR       = 'XY'
            TZFIELD%CCOMMENT   = 'X_Y_Z_RHS_CLD'
            TZFIELD%NGRID      = 1
            TZFIELD%NTYPE      = TYPEREAL
            TZFIELD%NDIMS      = 3
            TZFIELD%LTIMEDEP   = .TRUE.
    
            CALL IO_Field_read(TPINIFILE,TZFIELD,PRSVS_CLD(:,:,:,JSV))
    
          END IF
          IF (JSV == NSV_C2R2BEG ) THEN
            TZFIELD%CMNHNAME   = 'RSVS_CLD2'
            TZFIELD%CSTDNAME   = ''
            TZFIELD%CLONGNAME  = 'RSVS_CLD2'
            TZFIELD%CUNITS     = '1'
            TZFIELD%CDIR       = 'XY'
            TZFIELD%CCOMMENT   = 'X_Y_Z_RHS_CLD'
            TZFIELD%NGRID      = 1
            TZFIELD%NTYPE      = TYPEREAL
            TZFIELD%NDIMS      = 3
            TZFIELD%LTIMEDEP   = .TRUE.
    
            CALL IO_Field_read(TPINIFILE,TZFIELD,PRSVS_CLD(:,:,:,JSV))
    
    END IF
    !
    !*       2.1  Time t-dt:
    !
    
    IF (CPROGRAM=='MESONH' .AND. HUVW_ADV_SCHEME(1:3)=='CEN' .AND. &
            HTEMP_SCHEME == 'LEFR' ) THEN
    
      IF (CCONF=='RESTA') THEN
    
        CALL IO_Field_read(TPINIFILE,'UM', PUM)
        CALL IO_Field_read(TPINIFILE,'VM', PVM)
        CALL IO_Field_read(TPINIFILE,'WM', PWM)
        CALL IO_Field_read(TPINIFILE,'DUM',PDUM)
        CALL IO_Field_read(TPINIFILE,'DVM',PDVM)
        CALL IO_Field_read(TPINIFILE,'DWM',PDWM)
    
      ELSE
        PUM = PUT
        PVM = PVT
        PWM = PWT
      END IF
    END IF
    !
    !*       2.2a  3D LS fields  
    !
    !
    
    CALL INI_LS(TPINIFILE,HGETRVT,GLSOURCE,PLSUM,PLSVM,PLSWM,PLSTHM,PLSRVM,PLSZWSM)
    
    !
    !
    !*       2.2b  2D "surfacic" LB fields   
    !
    !
    
    CALL INI_LB(TPINIFILE,GLSOURCE,ISV,                                   &
    
         KSIZELBX_ll,KSIZELBXU_ll,KSIZELBY_ll,KSIZELBYV_ll,               &
         KSIZELBXTKE_ll,KSIZELBYTKE_ll,                                   &
         KSIZELBXR_ll,KSIZELBYR_ll,KSIZELBXSV_ll,KSIZELBYSV_ll,           &
         HGETTKET,HGETRVT,HGETRCT,HGETRRT,HGETRIT,HGETRST,                &