SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/SURFEX/prep_hor_snow_fields.F90
Go to the documentation of this file.
00001 !     #########
00002 SUBROUTINE PREP_HOR_SNOW_FIELDS(HPROGRAM,HSURF,              &
00003                                 HFILE,HFILETYPE,             &
00004                                 HFILEPGD,HFILEPGDTYPE,       &
00005                                 KLUOUT,OUNIF,KPATCH,         &
00006                                 KL,TPSNOW, TPTIME,           &
00007                                 PUNIF_WSNOW, PUNIF_RSNOW,    &
00008                                 PUNIF_TSNOW, PUNIF_ASNOW,    &
00009                                 OSNOW_IDEAL,                 &
00010                                 PUNIF_SG1SNOW, PUNIF_SG2SNOW,&
00011                                 PUNIF_HISTSNOW,PUNIF_AGESNOW,&
00012                                 PVEGTYPE_PATCH, PPATCH       )  
00013 !     #######################################################
00014 !
00015 !
00016 !!****  *PREP_HOR_SNOW_FIELDS* - prepares all snow fields for one surface scheme.
00017 !!
00018 !!    PURPOSE
00019 !!    -------
00020 !
00021 !!**  METHOD
00022 !!    ------
00023 !!
00024 !!    REFERENCE
00025 !!    ---------
00026 !!      
00027 !!
00028 !!    AUTHOR
00029 !!    ------
00030 !!     V. Masson 
00031 !!
00032 !!    MODIFICATIONS
00033 !!    -------------
00034 !!      Original    01/2004
00035 !!------------------------------------------------------------------
00036 !
00037 USE MODD_TYPE_SNOW
00038 USE MODD_TYPE_DATE_SURF, ONLY : DATE_TIME
00039 !
00040 USE MODD_SURF_PAR,       ONLY : XUNDEF
00041 !
00042 USE MODI_ALLOCATE_GR_SNOW
00043 USE MODI_PREP_HOR_SNOW_FIELD
00044 USE MODE_SNOW3L
00045 !
00046 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00047 USE PARKIND1  ,ONLY : JPRB
00048 !
00049 IMPLICIT NONE
00050 !
00051 !*      0.1    declarations of arguments
00052 !
00053  CHARACTER(LEN=6),   INTENT(IN)  :: HPROGRAM  ! program calling surf. schemes
00054  CHARACTER(LEN=7),   INTENT(IN)  :: HSURF     ! type of field
00055  CHARACTER(LEN=28),  INTENT(IN)  :: HFILE     ! file name
00056  CHARACTER(LEN=6),   INTENT(IN)  :: HFILETYPE ! file type
00057  CHARACTER(LEN=28),  INTENT(IN)  :: HFILEPGD     ! file name
00058  CHARACTER(LEN=6),   INTENT(IN)  :: HFILEPGDTYPE ! file type
00059 INTEGER,            INTENT(IN)  :: KLUOUT    ! logical unit of output listing
00060 LOGICAL,            INTENT(IN)  :: OUNIF     ! flag for prescribed uniform field
00061 INTEGER,            INTENT(IN)  :: KPATCH    ! patch number for output scheme
00062 INTEGER,            INTENT(IN)  :: KL        ! number of points
00063 TYPE(SURF_SNOW)                 :: TPSNOW    ! snow fields
00064 TYPE(DATE_TIME),    INTENT(IN)  :: TPTIME    ! date and time
00065 REAL, DIMENSION(:), INTENT(IN)  :: PUNIF_WSNOW ! prescribed snow content (kg/m2)
00066 REAL, DIMENSION(:), INTENT(IN)  :: PUNIF_RSNOW ! prescribed density (kg/m3)
00067 REAL, DIMENSION(:), INTENT(IN)  :: PUNIF_TSNOW ! prescribed temperature (K)
00068 REAL,               INTENT(IN)  :: PUNIF_ASNOW ! prescribed albedo (-)
00069 LOGICAL,            INTENT(IN)  :: OSNOW_IDEAL
00070 REAL, DIMENSION(:), INTENT(IN)  :: PUNIF_SG1SNOW ! 
00071 REAL, DIMENSION(:), INTENT(IN)  :: PUNIF_SG2SNOW ! 
00072 REAL, DIMENSION(:), INTENT(IN)  :: PUNIF_HISTSNOW ! 
00073 REAL, DIMENSION(:), INTENT(IN)  :: PUNIF_AGESNOW ! 
00074 
00075 REAL,DIMENSION(:,:,:),  INTENT(IN), OPTIONAL :: PVEGTYPE_PATCH ! fraction of each patch
00076 REAL,DIMENSION(:,:),INTENT(IN), OPTIONAL  :: PPATCH ! fraction of each patch
00077 !
00078 !
00079 !*      0.2    declarations of local variables
00080 !
00081  CHARACTER(LEN=10)                   :: YSNSURF   ! type of field
00082 REAL,ALLOCATABLE,DIMENSION(:,:,:)   :: ZW        ! total snow content
00083 REAL,ALLOCATABLE,DIMENSION(:,:)     :: ZWRHO     ! total snow content from rho profile alone
00084 REAL,ALLOCATABLE,DIMENSION(:,:,:)   :: ZD        ! total snow depth
00085 REAL,ALLOCATABLE,DIMENSION(:,:,:)   :: ZDEPTH    ! snow depth of each layer
00086 REAL,DIMENSION(KL,KPATCH)           :: ZPATCH    ! fraction of each patch
00087 REAL,DIMENSION(:,:,:), ALLOCATABLE  :: ZVEGTYPE_PATCH    ! fraction of each patch
00088 !
00089 INTEGER                             :: JPATCH    ! loop counter on patches
00090 INTEGER                             :: JLAYER    ! loop counter on layers
00091 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00092 !---------------------------------------------------------------------------
00093 !
00094 IF (LHOOK) CALL DR_HOOK('PREP_HOR_SNOW_FIELDS',0,ZHOOK_HANDLE)
00095 IF (PRESENT(PPATCH)) THEN
00096    ZPATCH = PPATCH
00097 ELSE
00098    ZPATCH = 1.
00099 ENDIF
00100 IF (PRESENT(PVEGTYPE_PATCH)) THEN
00101   ALLOCATE(ZVEGTYPE_PATCH(KL,SIZE(PVEGTYPE_PATCH,2),KPATCH))
00102   ZVEGTYPE_PATCH = PVEGTYPE_PATCH
00103 ELSE
00104   ALLOCATE(ZVEGTYPE_PATCH(KL,1,KPATCH))
00105   ZVEGTYPE_PATCH = 1.
00106 ENDIF
00107 !
00108 !*      1.     Allocation of output field
00109 !
00110  CALL ALLOCATE_GR_SNOW(TPSNOW,KL,KPATCH)
00111 !
00112 !---------------------------------------------------------------------------
00113 !
00114 !*      3.     Treatment of total snow content (kg/m2)
00115 !
00116 ALLOCATE(ZW(KL,TPSNOW%NLAYER,KPATCH))
00117 !
00118 YSNSURF='WWW'//HSURF
00119  CALL PREP_HOR_SNOW_FIELD(HPROGRAM, HFILE, HFILETYPE, HFILEPGD, HFILEPGDTYPE, &
00120                          KLUOUT, OUNIF, YSNSURF, KPATCH, KL, TPSNOW, TPTIME, &
00121                          PUNIF_WSNOW, PUNIF_RSNOW, PUNIF_TSNOW, PUNIF_ASNOW, &
00122                          OSNOW_IDEAL, PUNIF_SG1SNOW,                         &
00123                          PUNIF_SG2SNOW, PUNIF_HISTSNOW,PUNIF_AGESNOW,        &                      
00124                          PF=ZW,PVEGTYPE_PATCH=ZVEGTYPE_PATCH,PPATCH=ZPATCH   )  
00125 !
00126 !----------------------------------------------------------------------------
00127 !
00128 !*      4.     Treatment of total snow depth
00129 !
00130 ALLOCATE(ZD(KL,TPSNOW%NLAYER,KPATCH))
00131 !
00132 YSNSURF='DEP'//HSURF
00133  CALL PREP_HOR_SNOW_FIELD(HPROGRAM, HFILE, HFILETYPE, HFILEPGD, HFILEPGDTYPE, &
00134                          KLUOUT, OUNIF, YSNSURF, KPATCH, KL, TPSNOW, TPTIME, &
00135                          PUNIF_WSNOW, PUNIF_RSNOW, PUNIF_TSNOW, PUNIF_ASNOW, &
00136                          OSNOW_IDEAL, PUNIF_SG1SNOW,                         &
00137                          PUNIF_SG2SNOW, PUNIF_HISTSNOW,PUNIF_AGESNOW,        &
00138                          PF=ZD,PVEGTYPE_PATCH=ZVEGTYPE_PATCH,PPATCH=ZPATCH   )
00139 !
00140 !* snow layer thickness definition
00141 !
00142 ALLOCATE(ZDEPTH(SIZE(TPSNOW%WSNOW,1),TPSNOW%NLAYER,KPATCH))
00143 !
00144 IF (OSNOW_IDEAL) THEN
00145   ZDEPTH(:,:,:) = ZD(:,:,:)
00146 ELSE
00147   IF (TPSNOW%NLAYER==1) THEN
00148     DO JPATCH=1,KPATCH
00149       ZDEPTH(:,1,JPATCH) = ZD(:,1,JPATCH)
00150     END DO
00151   ELSEIF (TPSNOW%SCHEME=='3-L' .OR. TPSNOW%SCHEME=='CRO') THEN
00152     DO JPATCH=1,KPATCH
00153       CALL SNOW3LGRID(ZDEPTH(:,:,JPATCH),ZD(:,1,JPATCH))
00154     END DO
00155   ENDIF
00156 ENDIF
00157 !
00158 !----------------------------------------------------------------------------
00159 !
00160 !*      4.     Snow density profile
00161 !              --------------------
00162 !
00163 !* density profile
00164 YSNSURF='RHO'//HSURF
00165  CALL PREP_HOR_SNOW_FIELD(HPROGRAM,HFILE,HFILETYPE,HFILEPGD,HFILEPGDTYPE,     &
00166                          KLUOUT,OUNIF,YSNSURF, KPATCH, KL, TPSNOW, TPTIME,   &
00167                          PUNIF_WSNOW, PUNIF_RSNOW, PUNIF_TSNOW, PUNIF_ASNOW, &
00168                          OSNOW_IDEAL, PUNIF_SG1SNOW,                         &
00169                          PUNIF_SG2SNOW, PUNIF_HISTSNOW,PUNIF_AGESNOW,        &
00170                          PDEPTH=ZDEPTH,PVEGTYPE_PATCH=ZVEGTYPE_PATCH,PPATCH=ZPATCH )  
00171 !
00172 !----------------------------------------------------------------------------
00173 !
00174 !*      5.     Snow water content profile
00175 !              --------------------------
00176 
00177 IF (OSNOW_IDEAL) THEN
00178   !
00179   TPSNOW%WSNOW(:,:,:) = ZW(:,:,:)
00180   !
00181 ELSE
00182   !
00183   ALLOCATE(ZWRHO(SIZE(TPSNOW%WSNOW,1),KPATCH))
00184   ZWRHO(:,:) = 0.
00185   !
00186   !* snow depth estimated from rho profile
00187   DO JPATCH=1,KPATCH
00188     DO JLAYER=1,TPSNOW%NLAYER
00189       WHERE (ZPATCH(:,JPATCH)>0. .AND. TPSNOW%RHO(:,JLAYER,JPATCH)/=XUNDEF)
00190         ZWRHO(:,JPATCH) = ZWRHO(:,JPATCH) + TPSNOW%RHO(:,JLAYER,JPATCH) * ZDEPTH(:,JLAYER,JPATCH)
00191       ELSEWHERE
00192         ZWRHO(:,JPATCH) = XUNDEF
00193       END WHERE
00194     END DO
00195   END DO
00196   !
00197   !* modification of rho: coherence between rho profile, total snow and total depth
00198   DO JPATCH=1,KPATCH
00199     DO JLAYER=1,TPSNOW%NLAYER
00200       WHERE(ZPATCH(:,JPATCH)>0. .AND. ZWRHO(:,JPATCH)/=0. .AND. ZWRHO(:,JPATCH)/=XUNDEF)
00201         TPSNOW%RHO(:,JLAYER,JPATCH) = TPSNOW%RHO(:,JLAYER,JPATCH) * ZW(:,1,JPATCH) / ZWRHO(:,JPATCH)
00202       ELSEWHERE
00203         TPSNOW%RHO(:,JLAYER,JPATCH) = XUNDEF
00204       END WHERE
00205     END DO
00206   END DO
00207   !
00208   !* snow content profile for each grid level
00209   DO JPATCH=1,KPATCH
00210     DO JLAYER=1,TPSNOW%NLAYER
00211       WHERE(ZPATCH(:,JPATCH)>0.)
00212         TPSNOW%WSNOW(:,JLAYER,JPATCH) = TPSNOW%RHO(:,JLAYER,JPATCH) * ZDEPTH(:,JLAYER,JPATCH)
00213       ELSEWHERE
00214         TPSNOW%WSNOW(:,JLAYER,JPATCH) = XUNDEF
00215       END WHERE
00216     END DO
00217   END DO
00218   !
00219   DEALLOCATE(ZWRHO)
00220   !
00221 ENDIF
00222 !
00223 !----------------------------------------------------------------------------
00224 !
00225 !*      6.     Albedo and snow heat content
00226 !              ----------------------------
00227 !
00228 !* albedo
00229 YSNSURF='ALB'//HSURF
00230  CALL PREP_HOR_SNOW_FIELD(HPROGRAM,HFILE,HFILETYPE,HFILEPGD,HFILEPGDTYPE,     &
00231                          KLUOUT,OUNIF,YSNSURF, KPATCH, KL, TPSNOW, TPTIME,   &
00232                          PUNIF_WSNOW, PUNIF_RSNOW, PUNIF_TSNOW, PUNIF_ASNOW, &
00233                          OSNOW_IDEAL, PUNIF_SG1SNOW,                         &
00234                          PUNIF_SG2SNOW, PUNIF_HISTSNOW,PUNIF_AGESNOW,        &
00235                          PDEPTH=ZDEPTH,PVEGTYPE_PATCH=ZVEGTYPE_PATCH,PPATCH=ZPATCH) 
00236 !
00237 !* heat in snowpack profile
00238 YSNSURF='HEA'//HSURF
00239  CALL PREP_HOR_SNOW_FIELD(HPROGRAM,HFILE,HFILETYPE,HFILEPGD,HFILEPGDTYPE,     &
00240                          KLUOUT,OUNIF,YSNSURF, KPATCH, KL, TPSNOW, TPTIME,   &
00241                          PUNIF_WSNOW, PUNIF_RSNOW, PUNIF_TSNOW, PUNIF_ASNOW, &
00242                          OSNOW_IDEAL, PUNIF_SG1SNOW,                         &
00243                          PUNIF_SG2SNOW, PUNIF_HISTSNOW,PUNIF_AGESNOW,        &
00244                          PDEPTH=ZDEPTH,PVEGTYPE_PATCH=ZVEGTYPE_PATCH,PPATCH=ZPATCH)  
00245 !
00246 !----------------------------------------------------------------------------
00247 !
00248 !*      7.     Crocus specific parameters
00249 !              --------------------------
00250 !
00251 IF (TPSNOW%SCHEME=='CRO') THEN
00252   !
00253   YSNSURF='SG1'//HSURF
00254   CALL PREP_HOR_SNOW_FIELD(HPROGRAM,HFILE,HFILETYPE,HFILEPGD,HFILEPGDTYPE,   &
00255                          KLUOUT,OUNIF,YSNSURF, KPATCH, KL, TPSNOW, TPTIME,   &
00256                          PUNIF_WSNOW, PUNIF_RSNOW, PUNIF_TSNOW, PUNIF_ASNOW, &
00257                          OSNOW_IDEAL, PUNIF_SG1SNOW,                         &
00258                          PUNIF_SG2SNOW, PUNIF_HISTSNOW,PUNIF_AGESNOW,        &
00259                          PDEPTH=ZDEPTH,PVEGTYPE_PATCH=ZVEGTYPE_PATCH,PPATCH=ZPATCH)   
00260   !
00261   YSNSURF='SG2'//HSURF
00262   CALL PREP_HOR_SNOW_FIELD(HPROGRAM,HFILE,HFILETYPE,HFILEPGD,HFILEPGDTYPE,   &
00263                          KLUOUT,OUNIF,YSNSURF, KPATCH, KL, TPSNOW, TPTIME,   &
00264                          PUNIF_WSNOW, PUNIF_RSNOW, PUNIF_TSNOW, PUNIF_ASNOW, &
00265                          OSNOW_IDEAL, PUNIF_SG1SNOW,                         &
00266                          PUNIF_SG2SNOW, PUNIF_HISTSNOW,PUNIF_AGESNOW,        &
00267                          PDEPTH=ZDEPTH,PVEGTYPE_PATCH=ZVEGTYPE_PATCH,PPATCH=ZPATCH)   
00268   !
00269   YSNSURF='HIS'//HSURF
00270   CALL PREP_HOR_SNOW_FIELD(HPROGRAM,HFILE,HFILETYPE,HFILEPGD,HFILEPGDTYPE,   &
00271                          KLUOUT,OUNIF,YSNSURF, KPATCH, KL, TPSNOW, TPTIME,   &
00272                          PUNIF_WSNOW, PUNIF_RSNOW, PUNIF_TSNOW, PUNIF_ASNOW, &
00273                          OSNOW_IDEAL, PUNIF_SG1SNOW,                         &
00274                          PUNIF_SG2SNOW, PUNIF_HISTSNOW,PUNIF_AGESNOW,        &
00275                          PDEPTH=ZDEPTH,PVEGTYPE_PATCH=ZVEGTYPE_PATCH,PPATCH=ZPATCH)   
00276   !
00277   YSNSURF='AGE'//HSURF
00278   CALL PREP_HOR_SNOW_FIELD(HPROGRAM,HFILE,HFILETYPE,HFILEPGD,HFILEPGDTYPE,   &
00279                          KLUOUT,OUNIF,YSNSURF, KPATCH, KL, TPSNOW, TPTIME,   &
00280                          PUNIF_WSNOW, PUNIF_RSNOW, PUNIF_TSNOW, PUNIF_ASNOW, &
00281                          OSNOW_IDEAL, PUNIF_SG1SNOW,                         &
00282                          PUNIF_SG2SNOW, PUNIF_HISTSNOW,PUNIF_AGESNOW,        &
00283                          PDEPTH=ZDEPTH,PVEGTYPE_PATCH=ZVEGTYPE_PATCH,PPATCH=ZPATCH)   
00284   !  
00285 ENDIF
00286 !
00287 !*      8.     Deallocations
00288 !
00289 DEALLOCATE(ZD      )
00290 DEALLOCATE(ZW      )
00291 DEALLOCATE(ZDEPTH  )
00292 IF (LHOOK) CALL DR_HOOK('PREP_HOR_SNOW_FIELDS',1,ZHOOK_HANDLE)
00293 !
00294 !----------------------------------------------------------------------------
00295 !
00296 END SUBROUTINE PREP_HOR_SNOW_FIELDS