SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/SURFEX/hydro_glacier.F90
Go to the documentation of this file.
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