SURFEX v7.3
General documentation of Surfex
|
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