|
SURFEX v7.3
General documentation of Surfex
|
00001 ! ######### 00002 SUBROUTINE HYDRO_GLACIER (PTSTEP,PSR,PSNOWRHO,PSNOWSWE,PGLASTO,PICEFLUX) 00003 ! ######################################################################## 00004 ! 00005 !!**** *HYDRO_GLACIER* 00006 !! 00007 !! PURPOSE 00008 !! ------- 00009 ! 00010 ! Calculate the ice runoff fluxes over permanent snow area with LGLACIER 00011 ! option 00012 ! 00013 !!** METHOD 00014 !! ------ 00015 ! 00016 ! Direct calculation 00017 ! 00018 !! EXTERNAL 00019 !! -------- 00020 ! 00021 ! None 00022 !! 00023 !! IMPLICIT ARGUMENTS 00024 !! ------------------ 00025 !! 00026 !! 00027 !! REFERENCE 00028 !! --------- 00029 !! 00030 !! AUTHOR 00031 !! ------ 00032 !! B. Decharme 00033 !! 00034 !! MODIFICATIONS 00035 !! ------------- 00036 !! Original 09/09 00037 !------------------------------------------------------------------------------- 00038 ! 00039 !* 0. DECLARATIONS 00040 ! ------------ 00041 ! 00042 USE MODD_CSTS, ONLY : XDAY 00043 USE MODD_ISBA_n, ONLY : TSNOW 00044 USE MODD_SNOW_PAR, ONLY : XRHOSMAX, XHGLA, XSNOWDMIN, XRHOSMAX_ES 00045 ! 00046 ! 00047 USE YOMHOOK ,ONLY : LHOOK, DR_HOOK 00048 USE PARKIND1 ,ONLY : JPRB 00049 ! 00050 IMPLICIT NONE 00051 ! 00052 !* 0.1 declarations of arguments 00053 ! 00054 REAL, INTENT(IN) :: PTSTEP 00055 ! KTSTEP = timestep [s] 00056 ! 00057 REAL, DIMENSION(:), INTENT(IN) :: PSR 00058 ! PSR = Snowfall [kg/mēs] 00059 ! 00060 REAL, DIMENSION(:,:), INTENT(INOUT) :: PSNOWRHO 00061 ! PSNOWRHO = Snow density [kg/m3] 00062 ! 00063 REAL, DIMENSION(:,:), INTENT(INOUT) :: PSNOWSWE 00064 ! PSNOWSWE = Snow water equivalent [kg/mē] 00065 ! 00066 REAL, DIMENSION(:), INTENT(INOUT) :: PGLASTO 00067 ! PGLASTO = Glacier storage [kg/mē] 00068 ! 00069 REAL, DIMENSION(:), INTENT(OUT) :: PICEFLUX 00070 ! PICEFLUX = Ice flux from the Snowfall reservoir [kg/mēs] 00071 ! 00072 ! 00073 !* 0.2 declarations of local variables 00074 ! 00075 REAL, PARAMETER :: ZTAU=365.25 !days 00076 ! 00077 REAL, DIMENSION(SIZE(PSR)) :: ZGLASTO,ZSTOMAX,ZFLUX,ZSR,ZSWE 00078 REAL, DIMENSION(SIZE(PSR)) :: ZSNOWD 00079 ! 00080 REAL ::ZRHOSMAX 00081 ! 00082 INTEGER :: JWRK 00083 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00084 ! 00085 !------------------------------------------------------------------------------- 00086 ! 00087 !------------------------------------------------------------------------------- 00088 ! 00089 IF (LHOOK) CALL DR_HOOK('HYDRO_GLACIER',0,ZHOOK_HANDLE) 00090 ! 00091 ZGLASTO (:) = PGLASTO(:) 00092 ZSTOMAX (:) = 0.0 00093 ZFLUX (:) = 0.0 00094 ZSR (:) = 0.0 00095 ZSWE (:) = 0.0 00096 ! 00097 PICEFLUX(:) = 0.0 00098 ! 00099 !------------------------------------------------------------------------------- 00100 !Ice accumulation only if snow amount is > to 33.3 meters of aged snow 00101 ! 00102 IF(TSNOW%SCHEME/='3-L' .AND. TSNOW%SCHEME/='CRO')THEN 00103 ZRHOSMAX=XRHOSMAX 00104 ZSWE(:)=PSNOWSWE(:,1) 00105 ELSE 00106 ZRHOSMAX=XRHOSMAX_ES 00107 DO JWRK=1,SIZE(PSNOWSWE,2) 00108 ZSWE (:) = ZSWE (:) + PSNOWSWE(:,JWRK) 00109 END DO 00110 ENDIF 00111 ! 00112 WHERE(ZSWE(:)>XHGLA*ZRHOSMAX) 00113 ZSR(:) = PSR(:) 00114 ELSEWHERE 00115 ZSR(:) = 0.0 00116 ENDWHERE 00117 ! 00118 !Snow storage calculation 00119 ! 00120 PGLASTO(:)=(ZGLASTO(:)+PTSTEP*ZSR(:))/(1.0+PTSTEP/(ZTAU*XDAY)) 00121 ! 00122 !supress numerical artifacs 00123 ! 00124 ZSTOMAX(:)=ZSR(:)*PTSTEP+ZGLASTO(:) 00125 ! 00126 PGLASTO(:)=MIN(ZSTOMAX(:),PGLASTO(:)) 00127 ! 00128 !Ice flux calculation 00129 ! 00130 ZFLUX(:)=(ZGLASTO(:)-PGLASTO(:))/PTSTEP+ZSR(:) 00131 ! 00132 !supress numerical artifacs 00133 ! 00134 PICEFLUX(:) = MAX(0.0,ZFLUX(:)) 00135 PGLASTO (:) = PGLASTO(:) + PICEFLUX(:)-ZFLUX(:) 00136 ! 00137 WHERE(PGLASTO(:)<=1.E-10)PGLASTO(:)=0.0 00138 ! 00139 !------------------------------------------------------------------------------- 00140 !Snow pack update 00141 ! 00142 IF(TSNOW%SCHEME/='3-L' .AND. TSNOW%SCHEME/='CRO')THEN 00143 ! 00144 WHERE(PSNOWSWE(:,1)<=XHGLA*ZRHOSMAX)PICEFLUX(:)=0.0 00145 PSNOWSWE(:,1)=PSNOWSWE(:,1)-PICEFLUX(:)*PTSTEP 00146 ! 00147 ELSE 00148 ! 00149 WHERE(ZSWE(:)<=XHGLA*ZRHOSMAX)PICEFLUX(:)=0.0 00150 ! 00151 ! Snow total depth 00152 ZSNOWD(:) = 0. 00153 DO JWRK=1,SIZE(PSNOWSWE,2) 00154 ZSNOWD(:) = ZSNOWD(:) + PSNOWSWE(:,JWRK)/PSNOWRHO(:,JWRK) 00155 END DO 00156 ! 00157 ! Flux 00158 DO JWRK=1,SIZE(PSNOWSWE,2) 00159 ZFLUX(:) = PICEFLUX(:)*(PSNOWSWE(:,JWRK)/PSNOWRHO(:,JWRK)) & 00160 /MAX(ZSNOWD(:),0.0001) 00161 PSNOWSWE(:,JWRK)=PSNOWSWE(:,JWRK)-ZFLUX(:)*PTSTEP 00162 END DO 00163 ! 00164 ENDIF 00165 !------------------------------------------------------------------------------- 00166 IF (LHOOK) CALL DR_HOOK('HYDRO_GLACIER',1,ZHOOK_HANDLE) 00167 !------------------------------------------------------------------------------- 00168 END SUBROUTINE HYDRO_GLACIER
1.8.0