-
Gaelle TANGUY authoredGaelle TANGUY authored
read_pgd_isban.F90 15.14 KiB
!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
!SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence
!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
!SFX_LIC for details. version 1.
! #########
SUBROUTINE READ_PGD_ISBA_n (CHI, DTCO, DTI, DTZ, DGU, GB, IG, I, &
UG, U, SV,GCP, &
HPROGRAM,OLAND_USE)
! #########################################
!
!!**** *READ_PGD_ISBA_n* - routine to initialise ISBA physiographic variables
!!
!! PURPOSE
!! -------
!!
!!** METHOD
!! ------
!!
!! EXTERNAL
!! --------
!!
!!
!! IMPLICIT ARGUMENTS
!! ------------------
!!
!! REFERENCE
!! ---------
!!
!!
!! AUTHOR
!! ------
!! V. Masson *Meteo France*
!!
!! MODIFICATIONS
!! -------------
!! Original 01/2003
!! P. Le Moigne 12/2004 : add type of photosynthesis
!! B. Decharme 2008 : add XWDRAIN
!! B. Decharme 06/2009 : add topographic index statistics
!! A.L. Gibelin 04/2009 : dimension NBIOMASS for ISBA-A-gs
!! B. Decharme 07/2012 : files of data for permafrost area and for SOC top and sub soil
!! 11/2013 : same for groundwater distribution
!! 11/2014 : Read XSOILGRID as a series of real
!! P. Samuelsson 10/2014 : MEB
!-------------------------------------------------------------------------------
!
!* 0. DECLARATIONS
! ------------
!
!
USE MODD_CH_ISBA_n, ONLY : CH_ISBA_t
USE MODD_DATA_COVER_n, ONLY : DATA_COVER_t
USE MODD_DATA_ISBA_n, ONLY : DATA_ISBA_t
USE MODD_DATA_TSZ0_n, ONLY : DATA_TSZ0_t
USE MODD_DIAG_SURF_ATM_n, ONLY : DIAG_SURF_ATM_t
USE MODD_GR_BIOG_n, ONLY : GR_BIOG_t
USE MODD_ISBA_GRID_n, ONLY : ISBA_GRID_t
USE MODD_ISBA_n, ONLY : ISBA_t
USE MODD_SURF_ATM_GRID_n, ONLY : SURF_ATM_GRID_t
USE MODD_SURF_ATM_n, ONLY : SURF_ATM_t
USE MODD_SV_n, ONLY : SV_t
USE MODD_GRID_CONF_PROJ, ONLY : GRID_CONF_PROJ_t
!
USE MODD_TYPE_DATE_SURF
!
USE MODD_DATA_COVER_PAR, ONLY : JPCOVER
!
USE MODD_SURF_PAR, ONLY : XUNDEF
USE MODD_ISBA_PAR, ONLY : XOPTIMGRID
!
USE MODE_READ_SURF_COV, ONLY : READ_SURF_COV
!
USE MODI_INIT_IO_SURF_n
USE MODI_END_IO_SURF_n
!
USE MODI_READ_SURF
USE MODI_READ_GRID
USE MODI_READ_LCOVER
USE MODI_READ_PGD_ISBA_PAR_n
USE MODI_READ_PGD_TSZ0_PAR_n
!
USE YOMHOOK ,ONLY : LHOOK, DR_HOOK
USE PARKIND1 ,ONLY : JPRB
!
USE MODI_GET_TYPE_DIM_n
USE MODI_READ_LECOCLIMAP
!
USE MODI_ABOR1_SFX
!
USE MODI_GET_LUOUT
USE MODI_PACK_SAME_RANK
USE MODI_GET_SURF_MASK_n
!
IMPLICIT NONE
!
!* 0.1 Declarations of arguments
! -------------------------
!
!
TYPE(CH_ISBA_t), INTENT(INOUT) :: CHI
TYPE(DATA_COVER_t), INTENT(INOUT) :: DTCO
TYPE(DATA_ISBA_t), INTENT(INOUT) :: DTI
TYPE(DATA_TSZ0_t), INTENT(INOUT) :: DTZ
TYPE(DIAG_SURF_ATM_t), INTENT(INOUT) :: DGU
TYPE(GR_BIOG_t), INTENT(INOUT) :: GB
TYPE(ISBA_GRID_t), INTENT(INOUT) :: IG
TYPE(ISBA_t), INTENT(INOUT) :: I
TYPE(SURF_ATM_GRID_t), INTENT(INOUT) :: UG
TYPE(SURF_ATM_t), INTENT(INOUT) :: U
TYPE(SV_t), INTENT(INOUT) :: SV
TYPE(GRID_CONF_PROJ_t),INTENT(INOUT) :: GCP
!
CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! calling program
LOGICAL, INTENT(IN) :: OLAND_USE !
!
!* 0.2 Declarations of local variables
! -------------------------------
!
INTEGER, DIMENSION(:), POINTER :: IMASK ! mask for packing from complete field to nature field
!
REAL, DIMENSION(:,:), ALLOCATABLE :: ZWORK
!
CHARACTER(LEN=12) :: YRECFM ! Name of the article to be read
CHARACTER(LEN=4 ) :: YLVL
!
INTEGER :: ILU ! expected physical size of full surface array
INTEGER :: ILUOUT ! output listing logical unit
INTEGER :: IRESP ! Error code after redding
INTEGER :: JLAYER ! loop counter on layers
INTEGER :: IVERSION, IBUGFIX ! surface version
!
INTEGER :: ISIZE_LMEB_PATCH ! Number of patches with MEB=true
!
REAL(KIND=JPRB) :: ZHOOK_HANDLE
!
!-------------------------------------------------------------------------------
!
!* 1D physical dimension
!
IF (LHOOK) CALL DR_HOOK('READ_PGD_ISBA_N',0,ZHOOK_HANDLE)
YRECFM='SIZE_NATURE'
CALL GET_TYPE_DIM_n(DTCO, U, &
'NATURE',IG%NDIM)
!
YRECFM='VERSION'
CALL READ_SURF(&
HPROGRAM,YRECFM,IVERSION,IRESP)
!
YRECFM='BUG'
CALL READ_SURF(&
HPROGRAM,YRECFM,IBUGFIX,IRESP)
!
!* 2. Dimension initializations:
! -------------------------
!
!* soil scheme
!
YRECFM='ISBA'
CALL READ_SURF(&
HPROGRAM,YRECFM,I%CISBA,IRESP)
!
IF (IVERSION>=7) THEN
!
!* Pedo-transfert function
!
YRECFM='PEDOTF'
CALL READ_SURF(&
HPROGRAM,YRECFM,I%CPEDOTF,IRESP)
!
ELSE
I%CPEDOTF = 'CH78'
ENDIF
!
!* type of photosynthesis
!
YRECFM='PHOTO'
CALL READ_SURF(&
HPROGRAM,YRECFM,I%CPHOTO,IRESP)
!
!* new radiative transfert
!
IF (IVERSION>7 .OR. IVERSION==7 .AND. IBUGFIX>=2) THEN
!
YRECFM='TR_ML'
CALL READ_SURF(&
HPROGRAM,YRECFM,I%LTR_ML,IRESP)
!
ELSE
I%LTR_ML = .FALSE.
ENDIF
!
!* threshold to remove little fractions of patches
!
IF (IVERSION>7 .OR. IVERSION==7 .AND. IBUGFIX>=3) THEN
!
YRECFM='RM_PATCH'
CALL READ_SURF(&
HPROGRAM,YRECFM,I%XRM_PATCH,IRESP)
!
ELSE
I%XRM_PATCH = 0.0
ENDIF
!
!* number of soil layers
!
YRECFM='GROUND_LAYER'
CALL READ_SURF(&
HPROGRAM,YRECFM,I%NGROUND_LAYER,IRESP)
!
!* Reference grid for DIF
!
IF(I%CISBA=='DIF') THEN
ALLOCATE(I%XSOILGRID(I%NGROUND_LAYER))
I%XSOILGRID=XUNDEF
IF (IVERSION>=8) THEN
DO JLAYER=1,I%NGROUND_LAYER
WRITE(YLVL,'(I4)') JLAYER
YRECFM='SOILGRID'//ADJUSTL(YLVL(:LEN_TRIM(YLVL)))
CALL READ_SURF(&
HPROGRAM,YRECFM,I%XSOILGRID(JLAYER),IRESP)
ENDDO
ELSEIF (IVERSION==7 .AND. IBUGFIX>=2) THEN
YRECFM='SOILGRID'
CALL READ_SURF(&
HPROGRAM,YRECFM,I%XSOILGRID,IRESP,HDIR='-')
ELSE
I%XSOILGRID(1:I%NGROUND_LAYER)=XOPTIMGRID(1:I%NGROUND_LAYER)
ENDIF
ELSE
ALLOCATE(I%XSOILGRID(0))
ENDIF
!
!* number of biomass pools
!
IF (IVERSION>=6) THEN
YRECFM='NBIOMASS'
CALL READ_SURF(&
HPROGRAM,YRECFM,I%NNBIOMASS,IRESP)
ELSE
SELECT CASE (I%CPHOTO)
CASE ('AGS','LAI','AST','LST')
I%NNBIOMASS = 1
CASE ('NIT')
I%NNBIOMASS = 3
CASE ('NCB')
I%NNBIOMASS = 6
END SELECT
ENDIF
!
!* number of tiles
!
YRECFM='PATCH_NUMBER'
CALL READ_SURF(&
HPROGRAM,YRECFM,I%NPATCH,IRESP)
!
!* logical vector indicating for which patches MEB should be applied
!
ALLOCATE(I%LMEB_PATCH(I%NPATCH))
!
IF (IVERSION>=8) THEN
!
YRECFM='MEB_PATCH'
CALL READ_SURF(HPROGRAM,YRECFM,I%LMEB_PATCH(:),IRESP,HDIR='-')
!
ISIZE_LMEB_PATCH = COUNT(I%LMEB_PATCH(:))
!
IF (ISIZE_LMEB_PATCH>0)THEN
YRECFM='FORC_MEASURE'
CALL READ_SURF(HPROGRAM,YRECFM,I%LFORC_MEASURE,IRESP)
YRECFM='MEB_LITTER'
CALL READ_SURF(HPROGRAM,YRECFM,I%LMEB_LITTER,IRESP)
YRECFM='MEB_GNDRES'
CALL READ_SURF(HPROGRAM,YRECFM,I%LMEB_GNDRES,IRESP)
ELSE
I%LFORC_MEASURE=.FALSE.
I%LMEB_LITTER =.FALSE.
I%LMEB_GNDRES =.FALSE.
ENDIF
!
ELSE
I%LMEB_PATCH(:)=.FALSE.
I%LFORC_MEASURE=.FALSE.
I%LMEB_LITTER =.FALSE.
I%LMEB_GNDRES =.FALSE.
ENDIF
!
!
!* 3. Physiographic data fields:
! -------------------------
!
!
!* 3.1 Cover classes :
! -------------
!
ALLOCATE(I%LCOVER(JPCOVER))
CALL READ_LCOVER(&
HPROGRAM,I%LCOVER)
!
ALLOCATE(I%XCOVER(IG%NDIM,COUNT(I%LCOVER)))
#ifdef MNH_PARALLEL
CALL READ_SURF_COV(&
HPROGRAM,'COVER',I%XCOVER(:,:),I%LCOVER,IRESP,HDIR='H')
#else
CALL READ_SURF_COV(&
HPROGRAM,'COVER',I%XCOVER(:,:),I%LCOVER,IRESP)
#endif
!
!* 3.2 Orography :
! ---------
!
!
ALLOCATE(I%XZS(IG%NDIM))
YRECFM='ZS'
CALL READ_SURF(&
HPROGRAM,YRECFM,I%XZS(:),IRESP)
!
!
!* latitude, longitude, mesh size, and heading of JP axis (deg from N clockwise)
!
ALLOCATE(IG%XLAT (IG%NDIM))
ALLOCATE(IG%XLON (IG%NDIM))
ALLOCATE(IG%XMESH_SIZE (IG%NDIM))
ALLOCATE(I%XZ0EFFJPDIR(IG%NDIM))
CALL READ_GRID(&
HPROGRAM,IG%CGRID,IG%XGRID_PAR,IG%XLAT,IG%XLON,IG%XMESH_SIZE,IRESP,I%XZ0EFFJPDIR)
!
!* clay fraction : attention, seul un niveau est present dans le fichier
!* on rempli tout les niveaux de XCLAY avec les valeurs du fichiers
!
ALLOCATE(I%XCLAY(IG%NDIM,I%NGROUND_LAYER))
YRECFM='CLAY'
CALL READ_SURF(&
HPROGRAM,YRECFM,I%XCLAY(:,1),IRESP)
DO JLAYER=2,I%NGROUND_LAYER
I%XCLAY(:,JLAYER)=I%XCLAY(:,1)
END DO
!
!* sand fraction
!
ALLOCATE(I%XSAND(IG%NDIM,I%NGROUND_LAYER))
YRECFM='SAND'
CALL READ_SURF(&
HPROGRAM,YRECFM,I%XSAND(:,1),IRESP)
DO JLAYER=2,I%NGROUND_LAYER
I%XSAND(:,JLAYER)=I%XSAND(:,1)
END DO
!
!* Soil organic carbon profile
!
IF (IVERSION>7 .OR. (IVERSION==7 .AND. IBUGFIX>=3)) THEN
YRECFM='SOCP'
CALL READ_SURF(&
HPROGRAM,YRECFM,I%LSOCP,IRESP)
ELSE
I%LSOCP=.FALSE.
ENDIF
!
IF(I%LSOCP)THEN
!
ALLOCATE(I%XSOC (IG%NDIM,I%NGROUND_LAYER))
!
YRECFM='SOC_TOP'
CALL READ_SURF(&
HPROGRAM,YRECFM,I%XSOC(:,1),IRESP)
YRECFM='SOC_SUB'
CALL READ_SURF(&
HPROGRAM,YRECFM,I%XSOC(:,2),IRESP)
!
DO JLAYER=2,I%NGROUND_LAYER
I%XSOC (:,JLAYER)=I%XSOC (:,2)
END DO
!
ELSE
!
ALLOCATE(I%XSOC (0,1))
!
ENDIF
!
!* permafrost distribution
!
IF (IVERSION>7 .OR. (IVERSION==7 .AND. IBUGFIX>=3)) THEN
YRECFM='PERMAFROST'
CALL READ_SURF(&
HPROGRAM,YRECFM,I%LPERM,IRESP)
ELSE
I%LPERM=.FALSE.
ENDIF
!
IF(I%LPERM)THEN
!
ALLOCATE(I%XPERM (IG%NDIM))
!
YRECFM='PERM'
CALL READ_SURF(&
HPROGRAM,YRECFM,I%XPERM(:),IRESP)
!
ELSE
!
ALLOCATE(I%XPERM (0))
!
ENDIF
!
!* groundwater distribution
!
IF (IVERSION>=8) THEN
YRECFM='GWKEY'
CALL READ_SURF(&
HPROGRAM,YRECFM,I%LGW,IRESP)
ELSE
I%LGW=.FALSE.
ENDIF
!
IF(I%LGW)THEN
!
ALLOCATE(I%XGW (IG%NDIM))
!
YRECFM='GWFRAC'
CALL READ_SURF(&
HPROGRAM,YRECFM,I%XGW(:),IRESP)
WHERE(I%XGW(:)==XUNDEF)I%XGW(:)=0.0
!
ELSE
!
ALLOCATE(I%XGW (0))
!
ENDIF
!
IF (IVERSION>7 .OR. (IVERSION==7 .AND. IBUGFIX>=3)) THEN
YRECFM='NO'
CALL READ_SURF(&
HPROGRAM,YRECFM,I%LNOF,IRESP)
ELSE
I%LNOF = .FALSE.
ENDIF
!
!SOILNOX
!
IF (CHI%LCH_NO_FLUX) THEN
!
IF (I%LNOF) THEN
!
ALLOCATE(I%XPH(IG%NDIM))
YRECFM='PH'
CALL READ_SURF(&
HPROGRAM,YRECFM,I%XPH(:),IRESP)
!
ALLOCATE(I%XFERT(IG%NDIM))
YRECFM='FERT'
CALL READ_SURF(&
HPROGRAM,YRECFM,I%XFERT(:),IRESP)
!
ELSE
CALL ABOR1_SFX("READ_PGD_ISBAn: WITH LCH_NO_FLUX=T, PH AND FERT FIELDS ARE GIVEN AT PGD STEP")
ENDIF
!
ELSE
ALLOCATE(I%XPH (0))
ALLOCATE(I%XFERT(0))
END IF
!
!* subgrid-scale orography parameters to compute dynamical roughness length
!
ALLOCATE(I%XAOSIP(IG%NDIM))
YRECFM='AOSIP'
CALL READ_SURF(&
HPROGRAM,YRECFM,I%XAOSIP,IRESP)
!
ALLOCATE(I%XAOSIM(IG%NDIM))
YRECFM='AOSIM'
CALL READ_SURF(&
HPROGRAM,YRECFM,I%XAOSIM,IRESP)
ALLOCATE(I%XAOSJP(IG%NDIM))
YRECFM='AOSJP'
CALL READ_SURF(&
HPROGRAM,YRECFM,I%XAOSJP,IRESP)
!
ALLOCATE(I%XAOSJM(IG%NDIM))
YRECFM='AOSJM'
CALL READ_SURF(&
HPROGRAM,YRECFM,I%XAOSJM,IRESP)
!
ALLOCATE(I%XHO2IP(IG%NDIM))
YRECFM='HO2IP'
CALL READ_SURF(&
HPROGRAM,YRECFM,I%XHO2IP,IRESP)
!
ALLOCATE(I%XHO2IM(IG%NDIM))
YRECFM='HO2IM'
CALL READ_SURF(&
HPROGRAM,YRECFM,I%XHO2IM,IRESP)
!
ALLOCATE(I%XHO2JP(IG%NDIM))
YRECFM='HO2JP'
CALL READ_SURF(&
HPROGRAM,YRECFM,I%XHO2JP,IRESP)
!
ALLOCATE(I%XHO2JM(IG%NDIM))
YRECFM='HO2JM'
CALL READ_SURF(&
HPROGRAM,YRECFM,I%XHO2JM,IRESP)
!
!* orographic parameter to compute effective surface of energy exchanges
!
ALLOCATE(I%XSSO_SLOPE(IG%NDIM))
YRECFM='SSO_SLOPE'
CALL READ_SURF(&
HPROGRAM,YRECFM,I%XSSO_SLOPE,IRESP)
!
!* orographic standard deviation for subgrid-scale orographic drag
!
ALLOCATE(I%XSSO_STDEV(IG%NDIM))
YRECFM='SSO_STDEV'
CALL READ_SURF(&
HPROGRAM,YRECFM,I%XSSO_STDEV(:),IRESP)
!
!* orographic runoff coefficient
!
ALLOCATE(I%XRUNOFFB(IG%NDIM))
YRECFM='RUNOFFB'
CALL READ_SURF(&
HPROGRAM,YRECFM,I%XRUNOFFB,IRESP)
!
!* subgrid drainage coefficient
!
ALLOCATE(I%XWDRAIN(IG%NDIM))
IF (IVERSION<=3) THEN
I%XWDRAIN = 0.
ELSE
YRECFM='WDRAIN'
CALL READ_SURF(&
HPROGRAM,YRECFM,I%XWDRAIN,IRESP)
ENDIF
!
!* topographic index statistics
!
IF(I%CRUNOFF=='SGH ' .AND. IVERSION>=5) THEN
!
YRECFM='CTI'
CALL READ_SURF(&
HPROGRAM,YRECFM,I%LCTI,IRESP)
!
IF (.NOT.I%LCTI) CALL ABOR1_SFX("READ_PGD_ISBA_n:WITH CRUNOFF=SGH, CTI MAPS MUST BE GIVEN TO PGD")
!
ALLOCATE(I%XTI_MIN(IG%NDIM))
ALLOCATE(I%XTI_MAX(IG%NDIM))
ALLOCATE(I%XTI_MEAN(IG%NDIM))
ALLOCATE(I%XTI_STD(IG%NDIM))
ALLOCATE(I%XTI_SKEW(IG%NDIM))
!
YRECFM='TI_MIN'
CALL READ_SURF(&
HPROGRAM,YRECFM,I%XTI_MIN,IRESP)
!
YRECFM='TI_MAX'
CALL READ_SURF(&
HPROGRAM,YRECFM,I%XTI_MAX,IRESP)
!
YRECFM='TI_MEAN'
CALL READ_SURF(&
HPROGRAM,YRECFM,I%XTI_MEAN,IRESP)
!
YRECFM='TI_STD'
CALL READ_SURF(&
HPROGRAM,YRECFM,I%XTI_STD,IRESP)
!
YRECFM='TI_SKEW'
CALL READ_SURF(&
HPROGRAM,YRECFM,I%XTI_SKEW,IRESP)
!
ELSE
!
ALLOCATE(I%XTI_MIN(0))
ALLOCATE(I%XTI_MAX(0))
ALLOCATE(I%XTI_MEAN(0))
ALLOCATE(I%XTI_STD(0))
ALLOCATE(I%XTI_SKEW(0))
!
ENDIF
!
!-------------------------------------------------------------------------------
!
!* biogenic chemical emissions
!
IF (CHI%LCH_BIO_FLUX) THEN
ALLOCATE(ZWORK(U%NSIZE_FULL,1))
!
CALL END_IO_SURF_n(HPROGRAM)
CALL INIT_IO_SURF_n(DTCO, DGU, U, &
HPROGRAM,'FULL ','SURF ','READ ')
!
CALL GET_LUOUT(HPROGRAM,ILUOUT)
ALLOCATE(IMASK(IG%NDIM))
ILU=0
CALL GET_SURF_MASK_n(DTCO, U, &
'NATURE',IG%NDIM,IMASK,ILU,ILUOUT)
ALLOCATE(GB%XISOPOT(IG%NDIM))
ALLOCATE(GB%XMONOPOT(IG%NDIM))
!
ZWORK(:,:) = 0.
YRECFM='E_ISOPOT'
CALL READ_SURF(&
HPROGRAM,YRECFM,ZWORK,IRESP)
CALL PACK_SAME_RANK(IMASK,ZWORK(:,1),GB%XISOPOT(:))
!
ZWORK(:,:) = 0.
YRECFM='E_MONOPOT'
CALL READ_SURF(&
HPROGRAM,YRECFM,ZWORK,IRESP)
CALL PACK_SAME_RANK(IMASK,ZWORK(:,1),GB%XMONOPOT(:))
!
CALL END_IO_SURF_n(HPROGRAM)
CALL INIT_IO_SURF_n(DTCO, DGU, U, &
HPROGRAM,'NATURE','ISBA ','READ ')
!
DEALLOCATE(ZWORK)
ELSE
ALLOCATE(GB%XISOPOT (0))
ALLOCATE(GB%XMONOPOT(0))
END IF
!
!-------------------------------------------------------------------------------
!
!* 4. Physiographic data fields not to be computed by ecoclimap
! ---------------------------------------------------------
!
CALL READ_LECOCLIMAP(&
HPROGRAM,I%LECOCLIMAP)
!
CALL READ_PGD_ISBA_PAR_n(DTCO, U, &
DTI, IG, I,GCP, &
HPROGRAM,IG%NDIM,OLAND_USE)
IF (U%CNATURE == 'TSZ0') CALL READ_PGD_TSZ0_PAR_n(&
DTZ, &
HPROGRAM)
!
IF (LHOOK) CALL DR_HOOK('READ_PGD_ISBA_N',1,ZHOOK_HANDLE)
!-------------------------------------------------------------------------------
!
END SUBROUTINE READ_PGD_ISBA_n