SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/SURFEX/prep_snow_grib.F90
Go to the documentation of this file.
00001 !     #########
00002 SUBROUTINE PREP_SNOW_GRIB(HPROGRAM,HSURF,HFILE,KLUOUT,PFIELD)
00003 !     #################################################################################
00004 !
00005 !!****  *PREP_SNOW_GRIB* - prepares snow field from operational GRIB
00006 !!
00007 !!    PURPOSE
00008 !!    -------
00009 !
00010 !!**  METHOD
00011 !!    ------
00012 !!
00013 !!    REFERENCE
00014 !!    ---------
00015 !!      
00016 !!
00017 !!    AUTHOR
00018 !!    ------
00019 !!     V. Masson 
00020 !!
00021 !!    MODIFICATIONS
00022 !!    -------------
00023 !!      Original    01/2004
00024 !!------------------------------------------------------------------
00025 !
00026 !
00027 USE MODE_READ_GRIB
00028 !
00029 USE MODD_TYPE_DATE_SURF
00030 !
00031 USE MODI_PREP_GRIB_GRID
00032 USE MODI_SNOW_T_WLIQ_TO_HEAT
00033 !
00034 USE MODD_PREP,           ONLY : CINGRID_TYPE, CINTERP_TYPE
00035 USE MODD_PREP_SNOW,      ONLY : XGRID_SNOW
00036 USE MODD_DATA_COVER_PAR, ONLY : NVEGTYPE
00037 USE MODD_SURF_PAR,       ONLY : XUNDEF
00038 USE MODD_GRID_GRIB,      ONLY : CGRIB_FILE, NNI
00039 USE MODD_SNOW_PAR,       ONLY : XANSMIN, XANSMAX, XRHOSMAX
00040 USE MODD_CSTS,           ONLY : XTT
00041 !
00042 !
00043 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00044 USE PARKIND1  ,ONLY : JPRB
00045 !
00046 IMPLICIT NONE
00047 !
00048 !*      0.1    declarations of arguments
00049 !
00050  CHARACTER(LEN=6),   INTENT(IN)  :: HPROGRAM  ! program calling surf. schemes
00051  CHARACTER(LEN=10),   INTENT(IN) :: HSURF     ! type of field
00052  CHARACTER(LEN=28),  INTENT(IN)  :: HFILE     ! name of file
00053 INTEGER,            INTENT(IN)  :: KLUOUT    ! logical unit of output listing
00054 REAL,DIMENSION(:,:,:), POINTER    :: PFIELD    ! field to interpolate horizontally
00055 !
00056 !*      0.2    declarations of local variables
00057 !
00058 TYPE (DATE_TIME)                :: TZTIME_GRIB    ! current date and time
00059  CHARACTER(LEN=6)                :: YINMODEL       ! model from which GRIB file originates
00060 REAL, DIMENSION(:)  , POINTER   :: ZMASK => NULL()          ! Land mask
00061 REAL, DIMENSION(:),   POINTER   :: ZFIELD1D => NULL()       ! field read
00062 REAL, DIMENSION(:),   POINTER   :: ZHEAT => NULL()          ! heat in snow
00063 REAL, DIMENSION(:),   POINTER   :: ZRHO => NULL()          ! density of snow
00064 INTEGER                         :: JVEGTYPE       ! loop counter on vegtypes
00065 INTEGER                         :: JLAYER         ! loop on snow fine grid
00066 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00067 !
00068 !-------------------------------------------------------------------------------------
00069 !
00070 !*      1.     Reading of grid
00071 !              ---------------
00072 !
00073 IF (LHOOK) CALL DR_HOOK('PREP_SNOW_GRIB',0,ZHOOK_HANDLE)
00074 !
00075 IF (TRIM(HFILE).NE.CGRIB_FILE) CGRIB_FILE=""
00076 !
00077  CALL PREP_GRIB_GRID(HFILE,KLUOUT,YINMODEL,CINGRID_TYPE,TZTIME_GRIB)
00078 !
00079  CALL READ_GRIB_LAND_MASK(HFILE,KLUOUT,YINMODEL,ZMASK)
00080 !
00081 !-------------------------------------------------------------------------------------
00082 !
00083 !*      2.     Reading of the physical field for urban areas
00084 !              ---------------------------------------------
00085 !
00086 IF (HSURF(7:8)=='RO') THEN
00087   ! 
00088   SELECT CASE(HSURF(1:3))
00089     CASE('DEP','ALB','WWW')
00090       ALLOCATE(PFIELD(NNI,1,1))
00091     CASE('HEA','RHO')
00092       ALLOCATE(PFIELD(NNI,SIZE(XGRID_SNOW),1))
00093   END SELECT
00094   !
00095   PFIELD(:,:,:) = 0.
00096 !
00097 !-------------------------------------------------------------------------------------
00098 !
00099 !*      3.     Reading of the physical field for vegetated areas
00100 !              -------------------------------------------------
00101 !
00102 ELSE
00103 !
00104   SELECT CASE(HSURF(1:3))
00105 !
00106 !*      3.1    Total snow content (kg/m2)
00107 !
00108   CASE('WWW')
00109      CALL READ_GRIB_SNOW_VEG_AND_DEPTH(HFILE,KLUOUT,YINMODEL,ZMASK,PSNV=ZFIELD1D)
00110      !
00111      ALLOCATE(PFIELD(SIZE(ZFIELD1D),1,NVEGTYPE))
00112      DO JVEGTYPE=1,NVEGTYPE
00113        PFIELD(:,1,JVEGTYPE)=ZFIELD1D(:)
00114      END DO
00115      DEALLOCATE(ZFIELD1D)
00116 !
00117 !
00118 !*      3.2    Total snow depth (m)
00119 !
00120   CASE('DEP')
00121      CALL READ_GRIB_SNOW_VEG_AND_DEPTH(HFILE,KLUOUT,YINMODEL,ZMASK,PSNVD=ZFIELD1D)
00122      !
00123      ALLOCATE(PFIELD(SIZE(ZFIELD1D),1,NVEGTYPE))
00124      DO JVEGTYPE=1,NVEGTYPE
00125        PFIELD(:,1,JVEGTYPE)=ZFIELD1D(:)
00126      END DO
00127      DEALLOCATE(ZFIELD1D)
00128 !
00129 !
00130 !*      3.3    Profile of heat in the snow
00131 !
00132   CASE('HEA')
00133      !* read temperature
00134      CALL READ_GRIB_TS(HFILE,KLUOUT,YINMODEL,ZMASK,ZFIELD1D)
00135      WHERE (ZFIELD1D/=XUNDEF) ZFIELD1D(:) = MIN(ZFIELD1D,XTT)
00136      !* assumes no liquid water in the snow
00137      ALLOCATE(ZHEAT(SIZE(ZFIELD1D)))
00138      ALLOCATE(ZRHO (SIZE(ZFIELD1D)))
00139      ZRHO(:) = XRHOSMAX
00140      !
00141      CALL SNOW_T_WLIQ_TO_HEAT(ZHEAT,ZRHO,ZFIELD1D)
00142      !
00143      ALLOCATE(PFIELD(SIZE(ZFIELD1D),SIZE(XGRID_SNOW),NVEGTYPE))
00144      DO JVEGTYPE=1,NVEGTYPE
00145        DO JLAYER=1,SIZE(XGRID_SNOW)
00146          PFIELD(:,JLAYER,JVEGTYPE)=ZHEAT(:)
00147        END DO
00148      END DO
00149      DEALLOCATE(ZFIELD1D)
00150      DEALLOCATE(ZHEAT   )
00151      DEALLOCATE(ZRHO    )
00152 !
00153 !*      3.4    Albedo
00154 !
00155   CASE('ALB')    
00156     ALLOCATE(PFIELD(NNI,1,NVEGTYPE))
00157     PFIELD = 0.5 * ( XANSMIN + XANSMAX )
00158 !
00159 !*      3.5    Density
00160 !
00161   CASE('RHO')    
00162     ALLOCATE(PFIELD(NNI,SIZE(XGRID_SNOW),NVEGTYPE))
00163     PFIELD = XRHOSMAX
00164 !
00165 !*      3.6    SG1: initial grain is partially rounded
00166 !
00167   CASE('SG1')
00168     ALLOCATE(PFIELD(NNI,SIZE(XGRID_SNOW),NVEGTYPE))
00169     PFIELD = -20
00170 !
00171 !*      3.7    SG2: initial grain is partially rounded
00172 !
00173   CASE('SG2')
00174     ALLOCATE(PFIELD(NNI,SIZE(XGRID_SNOW),NVEGTYPE))
00175     PFIELD = 80
00176 !
00177 !*      3.8    AGE: snow is 3-days old
00178 !
00179   CASE('AGE')
00180     ALLOCATE(PFIELD(NNI,SIZE(XGRID_SNOW),NVEGTYPE))
00181     PFIELD = 3
00182 !
00183 !*      3.9    HIS: 0 by default
00184 !
00185   CASE('HIS')
00186     ALLOCATE(PFIELD(NNI,SIZE(XGRID_SNOW),NVEGTYPE))
00187     PFIELD = 0
00188 !
00189   END SELECT
00190 !
00191 END IF
00192 !
00193 DEALLOCATE(ZMASK)
00194 !
00195 !-------------------------------------------------------------------------------------
00196 !
00197 !*      4.     Interpolation method
00198 !              --------------------
00199 !
00200 CINTERP_TYPE='HORIBL'
00201 !
00202 IF (LHOOK) CALL DR_HOOK('PREP_SNOW_GRIB',1,ZHOOK_HANDLE)
00203 !
00204 !-------------------------------------------------------------------------------------
00205 END SUBROUTINE PREP_SNOW_GRIB