SURFEX v8.1
General documentation of Surfex
hydro_glacier.F90
Go to the documentation of this file.
1 !SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
2 !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence
3 !SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
4 !SFX_LIC for details. version 1.
5 ! #########
6  SUBROUTINE hydro_glacier (PTSTEP, PSR, PEK, PICEFLUX)
7 ! ########################################################################
8 !
9 !!**** *HYDRO_GLACIER*
10 !!
11 !! PURPOSE
12 !! -------
13 !
14 ! Calculate the ice runoff fluxes over permanent snow area with LGLACIER
15 ! option
16 !
17 !!** METHOD
18 !! ------
19 !
20 ! Direct calculation
21 !
22 !! EXTERNAL
23 !! --------
24 !
25 ! None
26 !!
27 !! IMPLICIT ARGUMENTS
28 !! ------------------
29 !!
30 !!
31 !! REFERENCE
32 !! ---------
33 !!
34 !! AUTHOR
35 !! ------
36 !! B. Decharme
37 !!
38 !! MODIFICATIONS
39 !! -------------
40 !! Original 09/09
41 !-------------------------------------------------------------------------------
42 !
43 !* 0. DECLARATIONS
44 ! ------------
45 !
46 USE modd_isba_n, ONLY : isba_pe_t
47 !
48 USE modd_csts, ONLY : xday
49 USE modd_snow_par, ONLY : xrhosmax, xhgla, xsnowdmin, xrhosmax_es
50 !
51 !
52 USE yomhook ,ONLY : lhook, dr_hook
53 USE parkind1 ,ONLY : jprb
54 !
55 IMPLICIT NONE
56 !
57 !* 0.1 declarations of arguments
58 !
59 REAL, INTENT(IN) :: PTSTEP
60 ! KTSTEP = timestep [s]
61 !
62 REAL, DIMENSION(:), INTENT(IN) :: PSR
63 ! PSR = Snowfall [kg/m²s]
64 !
65 TYPE(isba_pe_t), INTENT(INOUT) :: PEK
66 !
67 REAL, DIMENSION(:), INTENT(OUT) :: PICEFLUX
68 ! PICEFLUX = Ice flux from the Snowfall reservoir [kg/m²s]
69 !
70 !
71 !* 0.2 declarations of local variables
72 !
73 REAL, PARAMETER :: ZTAU=365.25 !days
74 !
75 REAL, DIMENSION(SIZE(PSR)) :: ZGLASTO,ZSTOMAX,ZFLUX,ZSR,ZSWE
76 REAL, DIMENSION(SIZE(PSR)) :: ZSNOWD
77 !
78 REAL ::ZRHOSMAX
79 !
80 INTEGER :: JWRK
81 REAL(KIND=JPRB) :: ZHOOK_HANDLE
82 !
83 !-------------------------------------------------------------------------------
84 !
85 !-------------------------------------------------------------------------------
86 !
87 IF (lhook) CALL dr_hook('HYDRO_GLACIER',0,zhook_handle)
88 !
89 zglasto(:) = pek%XICE_STO(:)
90 zstomax(:) = 0.0
91 zflux(:) = 0.0
92 zsr(:) = 0.0
93 zswe(:) = 0.0
94 !
95 piceflux(:) = 0.0
96 !
97 !-------------------------------------------------------------------------------
98 !Ice accumulation only if snow amount is > to 33.3 meters of aged snow
99 !
100 IF(pek%TSNOW%SCHEME/='3-L' .AND. pek%TSNOW%SCHEME/='CRO')THEN
101  zrhosmax = xrhosmax
102  zswe(:) = pek%TSNOW%WSNOW(:,1)
103 ELSE
104  zrhosmax=xrhosmax_es
105  DO jwrk=1,SIZE(pek%TSNOW%WSNOW,2)
106  zswe(:) = zswe(:) + pek%TSNOW%WSNOW(:,jwrk)
107  END DO
108 ENDIF
109 !
110 WHERE(zswe(:)>xhgla*zrhosmax)
111  zsr(:) = psr(:)
112 ELSEWHERE
113  zsr(:) = 0.0
114 ENDWHERE
115 !
116 !Snow storage calculation
117 !
118 pek%XICE_STO(:) = (zglasto(:)+ptstep*zsr(:))/(1.0+ptstep/(ztau*xday))
119 !
120 !supress numerical artifacs
121 !
122 zstomax(:) = zsr(:)*ptstep+zglasto(:)
123 !
124 pek%XICE_STO(:) = min(zstomax(:),pek%XICE_STO(:))
125 !
126 !Ice flux calculation
127 !
128 zflux(:) = (zglasto(:)-pek%XICE_STO(:))/ptstep+zsr(:)
129 !
130 !supress numerical artifacs
131 !
132 piceflux(:) = max(0.0,zflux(:))
133 pek%XICE_STO(:) = pek%XICE_STO(:) + piceflux(:)-zflux(:)
134 !
135 WHERE(pek%XICE_STO(:)<=1.e-10)pek%XICE_STO(:)=0.0
136 !
137 !-------------------------------------------------------------------------------
138 !Snow pack update
139 !
140 IF(pek%TSNOW%SCHEME/='3-L' .AND. pek%TSNOW%SCHEME/='CRO')THEN
141 !
142  WHERE(pek%TSNOW%WSNOW(:,1)<=xhgla*zrhosmax)piceflux(:)=0.0
143  pek%TSNOW%WSNOW(:,1)=pek%TSNOW%WSNOW(:,1)-piceflux(:)*ptstep
144 !
145 ELSE
146 !
147  WHERE(zswe(:)<=xhgla*zrhosmax)piceflux(:)=0.0
148 !
149 ! Snow total depth
150  zsnowd(:) = 0.
151  DO jwrk=1,SIZE(pek%TSNOW%WSNOW,2)
152  zsnowd(:) = zsnowd(:) + pek%TSNOW%WSNOW(:,jwrk)/pek%TSNOW%RHO(:,jwrk)
153  END DO
154 !
155 ! Flux
156  DO jwrk=1,SIZE(pek%TSNOW%WSNOW,2)
157  zflux(:) = piceflux(:)*(pek%TSNOW%WSNOW(:,jwrk)/pek%TSNOW%RHO(:,jwrk)) &
158  /max(zsnowd(:),0.0001)
159  pek%TSNOW%WSNOW(:,jwrk)=pek%TSNOW%WSNOW(:,jwrk)-zflux(:)*ptstep
160  END DO
161 !
162 ENDIF
163 !-------------------------------------------------------------------------------
164 IF (lhook) CALL dr_hook('HYDRO_GLACIER',1,zhook_handle)
165 !-------------------------------------------------------------------------------
166 END SUBROUTINE hydro_glacier
subroutine hydro_glacier(PTSTEP, PSR, PEK, PICEFLUX)
integer, parameter jprb
Definition: parkind1.F90:32
real, save xday
Definition: modd_csts.F90:45
logical lhook
Definition: yomhook.F90:15