SURFEX v8.1
General documentation of Surfex
snowcro_diag.F90
Go to the documentation of this file.
1 ! #########
2 
3 SUBROUTINE snowcro_diag(HSNOWMETAMO, &
4  PSNOWDZ, PSNOWSWE, PSNOWRHO, PSNOWGRAN1, PSNOWGRAN2, PSNOWAGE, &
5  PSNOWHIST, PSNOWTEMP, PSNOWLIQ, PDIRCOSZW, PSNOWDEND, PSNOWSPHER, &
6  PSNOWSIZE, PSNOWSSA, PSNOWTYPEMEPRA, PSNOWRAM, PSNOWSHEAR, &
7  PSNOWDEPTH_1DAYS, PSNOWDEPTH_3DAYS, PSNOWDEPTH_5DAYS, &
8  PSNOWDEPTH_7DAYS, PSNOWSWE_1DAYS, PSNOWSWE_3DAYS, PSNOWSWE_5DAYS,&
9  PSNOWSWE_7DAYS, PSNOWRAM_SONDE, PSNOW_WETTHICKNESS, PSNOW_REFROZENTHICKNESS)
10 
11 ! Diagnostics of Crocus snowpack model
12 ! Author: M. Lafaysse, Meteo-France, October 2015
13 
14 USE modd_surf_par, ONLY : xundef
15 
16 USE modd_csts,ONLY : xrholi, xrholw
17 
18 USE modd_snow_par,ONLY : icris_dend1d, icris_nondend1d, &
19  ifr, ifr_lb, ilb, ilb_fin, ilb_ang, iroul, ifin, ifin_ar, ifin_ang, &
20  ipl, ipl_gob, igob, igel, igob_fon, iron_ang, xx, xd1, xd2, xd3
21 
22 IMPLICIT NONE
23 
24  CHARACTER(3), INTENT(IN) :: HSNOWMETAMO ! metamorphism option
25 REAL, DIMENSION(:,:), INTENT(INOUT) :: PSNOWDZ
26 REAL, DIMENSION(:,:), INTENT(IN) :: PSNOWSWE
27 REAL, DIMENSION(:,:), INTENT(IN) :: PSNOWRHO
28 REAL, DIMENSION(:,:), INTENT(IN) :: PSNOWGRAN1
29 REAL, DIMENSION(:,:), INTENT(IN) :: PSNOWGRAN2
30 REAL, DIMENSION(:,:), INTENT(IN) :: PSNOWAGE
31 REAL, DIMENSION(:,:), INTENT(IN) :: PSNOWHIST
32 REAL, DIMENSION(:,:), INTENT(IN) :: PSNOWTEMP
33 REAL, DIMENSION(:,:), INTENT(IN) :: PSNOWLIQ
34 REAL, DIMENSION(:), INTENT(IN) :: PDIRCOSZW !cosine of slope
35 REAL, DIMENSION(:,:), INTENT(OUT) :: PSNOWDEND
36 REAL, DIMENSION(:,:), INTENT(OUT) :: PSNOWSPHER
37 REAL, DIMENSION(:,:), INTENT(OUT) :: PSNOWSIZE
38 REAL, DIMENSION(:,:), INTENT(OUT) :: PSNOWSSA
39 REAL, DIMENSION(:,:), INTENT(OUT) :: PSNOWTYPEMEPRA
40 REAL, DIMENSION(:,:), INTENT(OUT) :: PSNOWRAM
41 REAL, DIMENSION(:,:), INTENT(OUT) :: PSNOWSHEAR
42 REAL, DIMENSION(:), INTENT(OUT) :: PSNOWDEPTH_1DAYS
43 REAL, DIMENSION(:), INTENT(OUT) :: PSNOWDEPTH_3DAYS
44 REAL, DIMENSION(:), INTENT(OUT) :: PSNOWDEPTH_5DAYS
45 REAL, DIMENSION(:), INTENT(OUT) :: PSNOWDEPTH_7DAYS
46 REAL, DIMENSION(:), INTENT(OUT) :: PSNOWSWE_1DAYS
47 REAL, DIMENSION(:), INTENT(OUT) :: PSNOWSWE_3DAYS
48 REAL, DIMENSION(:), INTENT(OUT) :: PSNOWSWE_5DAYS
49 REAL, DIMENSION(:), INTENT(OUT) :: PSNOWSWE_7DAYS
50 REAL, DIMENSION(:), INTENT(OUT) :: PSNOWRAM_SONDE
51 REAL, DIMENSION(:), INTENT(OUT) :: PSNOW_WETTHICKNESS
52 REAL, DIMENSION(:), INTENT(OUT) :: PSNOW_REFROZENTHICKNESS
53 
54 REAL :: ZG1, ZG2, ZRFIN, ZRDEN, ZRFGF
55 
56 REAL :: ZDIAM
57 
58 LOGICAL,DIMENSION(SIZE(PSNOWSWE,1)) :: GRAM, GWET, GREFROZEN
59 
60 INTEGER :: ICLASS_DEND, ICLASS_SPHER, ICLASS_SIZE, ICLASS_HIST
61 INTEGER :: ICLASS
62 LOGICAL :: LTHERM
63 
64 INTEGER :: JJ,JST
65 
66 ! PRINT*,ASSOCIATED(PSNOWDEPTH_1DAYS),ASSOCIATED(PSNOWDEPTH_3DAYS)
67 ! PRINT*,ASSOCIATED(PSNOWDEPTH_5DAYS),ASSOCIATED(PSNOWDEPTH_7DAYS)
68 ! PRINT*,"in snowcrodiag"
69 ! PRINT*,ALLOCATED(PSNOWDEPTH_1DAYS),ALLOCATED(PSNOWDEPTH_3DAYS)
70 ! PRINT*,ALLOCATED(PSNOWDEPTH_5DAYS),ALLOCATED(PSNOWDEPTH_7DAYS)
71 ! PRINT*,SIZE(PSNOWDEPTH_1DAYS),SIZE(PSNOWDEPTH_3DAYS)
72 ! PRINT*,SIZE(PSNOWDEPTH_5DAYS),SIZE(PSNOWDEPTH_7DAYS)
73 
74 ! Initializations
75 
76 psnowdend = xundef
77 psnowspher = xundef
78 psnowsize = xundef
79 psnowssa = xundef
80 psnowtypemepra = xundef
81 psnowram = xundef
82 psnowshear = xundef
83 
84 psnowdepth_1days = 0.
85 psnowdepth_3days = 0.
86 psnowdepth_5days = 0.
87 psnowdepth_7days = 0.
88 psnowswe_1days = 0.
89 psnowswe_3days = 0.
90 psnowswe_5days = 0.
91 psnowswe_7days = 0.
92 psnowram_sonde = 0.
93 psnow_wetthickness = 0.
94 psnow_refrozenthickness = 0.
95 gram = .true.
96 gwet = .true.
97 grefrozen = .true.
98 
99 
100 DO jst=1,SIZE(psnowswe,2)
101  DO jj=1,SIZE(psnowswe,1)
102 
103  IF (psnowswe(jj,jst)>0) THEN
104 
105  ! In this routine Crocus diagnostics are perpendicular to the slope.
106  ! The projection is done in diag_misc_isban
107 
108  zg1 = psnowgran1(jj,jst)/99.
109  zrfin = 0.17*psnowrho(jj,jst)-31
110 
111  IF (psnowgran1(jj,jst)>=0) THEN
112  !Non dendritic case
113 
114  !Dendricity,sphericty and grain size
115  psnowsize(jj,jst) = psnowgran2(jj,jst)
116  psnowdend(jj,jst) = 0
117  psnowspher(jj,jst) = psnowgran1(jj,jst) / xx
118 
119  !Optical diameter for SSA diagnostic
120  zdiam = psnowsize(jj,jst) * psnowspher(jj,jst) + &
121  max( 0.0004, 0.5*psnowsize(jj,jst) ) * ( 1.-psnowspher(jj,jst) )
122 
123  !10 classes of sphericity 0:[0,0.05[, 1:[0.05,0.15[, ..., 9:[0.85,1.0]
124  !###########Strange way of defining sphericity classes -> Check with very old versions
125  !###########ICLASS_SPHER = MIN(NINT(10 * PSNOWSPHER(JJ,JST)),9) Not exactly the same
126  iclass_spher = min(int(10 * psnowspher(jj,jst) + 0.05),9)
127 
128 
129  !6 classes of historical variable {0,1,...,5}
130  !##########Why is PSNOWHIST stored as float64. It always takes only 6 integer values
131  iclass_hist = nint(psnowhist(jj,jst))
132 
133  !3 classes of grain size in mm 0:[0,0.55[, 1:[0.55,1.05[, 2:[1.05, +inf[
134  !#########Strange +0.05
135  IF (psnowsize(jj,jst) < 0.00055) THEN
136  iclass_size = 0
137  ELSEIF (psnowsize(jj,jst) < 0.00105) THEN
138  iclass_size = 1
139  ELSE
140  iclass_size = 2
141  ENDIF
142 
143  !Overall 10x3x6 classes from 1 to 180 (included)
144  iclass = 1 + iclass_spher + iclass_size*10 + iclass_hist*30
145 
146  !Snow type obtained in table ICRIS_NONDEND1D
147  psnowtypemepra(jj,jst) = icris_nondend1d(iclass)
148 
149 
150  ! Ram resistance (non dendritic case)
151  ! PSNOWLIQ tel massique en m
152  ! PSNOWLIQ*XHROLW/PSNOWDZ tel volumique en kg m-3
153  ! PSNOWLIQ/PSNOWDZ : rapport sans unité
154  ! Seuil à 0.5% soit 0.005
155  ltherm=((psnowtemp(jj,jst)<272.96).OR.(psnowliq(jj,jst)/psnowdz(jj,jst)<=0.005))
156 
157  SELECT CASE (nint(psnowtypemepra(jj,jst)))
158  CASE (ifin)
159  psnowram(jj,jst)=max(3.,zrfin)
160  CASE (ifin_ang)
161  IF (psnowrho(jj,jst)<200) THEN
162  psnowram(jj,jst)=zrfin*psnowspher(jj,jst)+&
163  (1- psnowspher(jj,jst))*(zrfin*(0.8-psnowsize(jj,jst))+2*psnowsize(jj,jst))
164  ELSE
165  psnowram(jj,jst)=2
166  ENDIF
167  CASE (ifin_ar,igel,igob_fon,iron_ang)
168 
169  IF (ltherm) THEN
170  psnowram(jj,jst)=max(10.,0.103*psnowrho(jj,jst)-19.666)
171  ELSE
172  IF (psnowrho(jj,jst)<250) THEN
173  psnowram(jj,jst)=1
174  ELSE
175  psnowram(jj,jst)=max(2.,0.16*psnowrho(jj,jst)-54)
176  ENDIF
177  END IF
178 
179  CASE (ipl,ipl_gob)
180  IF (psnowsize(jj,jst)>0.8) THEN
181  psnowram(jj,jst)=max(3.,zrfin)*(0.8-psnowsize(jj,jst))+2*psnowsize(jj,jst)
182  ELSE
183  psnowram(jj,jst)=2
184  ENDIF
185  CASE DEFAULT
186  END SELECT
187 
188  ELSE
189  !Dendritic case
190 
191  !Dendricity,sphericty and grain size
192  psnowsize(jj,jst) = xundef !Grain size not defined for dendritic snow
193  psnowdend(jj,jst) = -psnowgran1(jj,jst) / xx
194  psnowspher(jj,jst) = psnowgran2(jj,jst) / xx
195 
196  !Optical diameter for SSA diagnostic
197  zdiam = psnowdend(jj,jst) * xd1 + (1 - psnowdend(jj,jst)) * &
198  (psnowspher(jj,jst) * xd2 + (1 - psnowspher(jj,jst)) * xd3)
199  !ZDIAM = -PSNOWGRAN1(JJ,JST)*XD1/XX + (1.+PSNOWGRAN1(JJ,JST)/XX) * &
200  ! ( PSNOWGRAN2(JJ,JST)*XD2/XX + (1.-PSNOWGRAN2(JJ,JST)/XX) * XD3 )
201  zdiam = zdiam/10000.
202 
203  !10 classes of dendricity 0:[0,0.1[, ..., 9:[0.9,1.0[ (value 1.0 does not exist)
204  iclass_dend = int(10 * psnowdend(jj,jst))
205 
206  !10 classes of sphericity 0:[0,0.05[, 1:[0.05,0.15[, ..., 9:[0.85,1.0]
207  !###########Strange way of defining sphericity classes -> Check with very old versions
208  !###########ICLASS_SPHER = MIN(NINT(10 * PSNOWSPHER(JJ,JST)),9) Not exactly the same
209  iclass_spher = min(int(10 * psnowspher(jj,jst) + 0.05),9)
210 
211  !Overall 10x10 classes from 1 to 100 (included)
212  iclass = 1 + iclass_dend + iclass_spher*10
213 
214  !Snow type obtained in table ICRIS_DEND1D
215  psnowtypemepra(jj,jst) = icris_dend1d(iclass)
216 
217  ENDIF
218 
219  ! All cases
220  ! Compute depth and SWE of recent snow
221  IF(psnowage(jj,jst)<=1)THEN
222  psnowdepth_1days(jj) = psnowdepth_1days(jj) + psnowdz(jj,jst)
223  psnowswe_1days(jj) = psnowswe_1days(jj) + psnowswe(jj,jst)
224  ENDIF
225 
226  IF(psnowage(jj,jst)<=3)THEN
227  psnowdepth_3days(jj) = psnowdepth_3days(jj) + psnowdz(jj,jst)
228  psnowswe_3days(jj) = psnowswe_3days(jj) + psnowswe(jj,jst)
229  ENDIF
230 
231  IF(psnowage(jj,jst)<=5)THEN
232  psnowdepth_5days(jj) = psnowdepth_5days(jj) + psnowdz(jj,jst)
233  psnowswe_5days(jj) = psnowswe_5days(jj) + psnowswe(jj,jst)
234  ENDIF
235 
236  IF(psnowage(jj,jst)<=7)THEN
237  psnowdepth_7days(jj) = psnowdepth_7days(jj) + psnowdz(jj,jst)
238  psnowswe_7days(jj) = psnowswe_7days(jj) + psnowswe(jj,jst)
239  END IF
240 
241  ! Ram sonde penetration
242  IF ((gram(jj)).AND.(psnowram(jj,jst)<=2.)) THEN
243  psnowram_sonde(jj)=psnowram_sonde(jj)+psnowdz(jj,jst)
244  ELSE
245  gram(jj)=.false.
246  ENDIF
247 
248  ! Depth of wet snow
249  IF ((gwet(jj)).AND.(psnowliq(jj,jst)>0.)) THEN
250  psnow_wetthickness(jj)=psnow_wetthickness(jj)+psnowdz(jj,jst)
251  ELSE
252  gwet(jj)=.false.
253  ENDIF
254  ! Depth of refrozen snow
255  IF ((grefrozen(jj)).AND.(psnowhist(jj,jst)>=2).AND.(psnowtemp(jj,jst)<273.15)) THEN
256  psnow_refrozenthickness(jj)=psnow_refrozenthickness(jj)+psnowdz(jj,jst)
257  ELSE
258  grefrozen(jj)=.false.
259  ENDIF
260 
261  ! Specific surface area
262  IF ( hsnowmetamo=='B92' ) THEN
263  psnowssa(jj,jst) = 6. / (xrholi*zdiam)
264  ELSE
265  psnowssa(jj,jst) = 6. / (xrholi*psnowgran1(jj,jst))
266  END IF
267 
268  END IF
269  END DO
270 END DO
271 
272 END SUBROUTINE snowcro_diag
subroutine snowcro_diag(HSNOWMETAMO, PSNOWDZ, PSNOWSWE, PSNOWRHO, PSNOWGRAN1, PSNOWGRAN2, PSNOWAGE, PSNOWHIST, PSNOWTEMP, PSNOWLIQ, PDIRCOSZW, PSNOWDEND, PSNOWSPHER, PSNOWSIZE, PSNOWSSA, PSNOWTYPEMEPRA, PSNOWRAM, PSNOWSHEAR, PSNOWDEPTH_1DAYS, PSNOWDEPTH_3DAYS, PSNOWDEPTH_5DAYS, PSNOWDEPTH_7DAYS, PSNOWSWE_1DAYS, PSNOWSWE_3DAYS, PSNOWSWE_5DAYS, PSNOWSWE_7DAYS, PSNOWRAM_SONDE, PSNOW_WETTHICKNESS, PSNOW_REFROZENTHICKNESS)
real, parameter xundef
real, save xrholi
Definition: modd_csts.F90:81
real, save xrholw
Definition: modd_csts.F90:64