SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
prep_snow_unif.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 prep_snow_unif(KLUOUT,HSURF,PFIELD, TPTIME, &
7  osnow_ideal, &
8  punif_wsnow, punif_rsnow, &
9  punif_tsnow, punif_lwcsnow, &
10  punif_asnow, &
11  punif_sg1snow, punif_sg2snow, &
12  punif_histsnow,punif_agesnow, &
13  klayer )
14 ! #################################################################################
15 !
16 !!**** *PREP_SNOW_UNIF* - prepares snow field from prescribed values
17 !!
18 !! PURPOSE
19 !! -------
20 !
21 !!** METHOD
22 !! ------
23 !!
24 !! REFERENCE
25 !! ---------
26 !!
27 !!
28 !! AUTHOR
29 !! ------
30 !! V. Masson
31 !!
32 !! MODIFICATIONS
33 !! -------------
34 !! Original 01/2004
35 !! M. Lafaysse adaptation with new snow age
36 !! 2012-11-19 M. Lafaysse initialization of liquid water content
37 !!------------------------------------------------------------------
38 !
39 USE mode_snow3l
40 !
42 !
43 USE modd_surf_par, ONLY : xundef
44 USE modd_prep, ONLY : cinterp_type
45 USE modd_prep_snow, ONLY : ngrid_level
46 USE modd_data_cover_par, ONLY : nvegtype
47 !
49 !
50 USE yomhook ,ONLY : lhook, dr_hook
51 USE parkind1 ,ONLY : jprb
52 !
53 USE modi_abor1_sfx
54 !
55 IMPLICIT NONE
56 !
57 !* 0.1 declarations of arguments
58 !
59 INTEGER, INTENT(IN) :: kluout ! output listing logical unit
60  CHARACTER(LEN=10), INTENT(IN) :: hsurf ! type of field
61 REAL, POINTER, DIMENSION(:,:,:) :: pfield ! field to interpolate horizontally
62 TYPE(date_time), INTENT(IN) :: tptime ! date and time
63 LOGICAL, INTENT(IN) :: osnow_ideal
64 REAL, DIMENSION(:), INTENT(IN) :: punif_wsnow ! prescribed snow content (kg/m2)
65 REAL, DIMENSION(:), INTENT(IN) :: punif_rsnow ! prescribed density (kg/m3)
66 REAL, DIMENSION(:), INTENT(IN) :: punif_tsnow ! prescribed temperature (K)
67 REAL, DIMENSION(:), INTENT(IN) :: punif_lwcsnow ! prescribed snow liquid water content (kg/m3)
68 REAL, INTENT(IN) :: punif_asnow ! prescribed albedo (-)
69 REAL, DIMENSION(:), INTENT(IN) :: punif_sg1snow !
70 REAL, DIMENSION(:), INTENT(IN) :: punif_sg2snow !
71 REAL, DIMENSION(:), INTENT(IN) :: punif_histsnow !
72 REAL, DIMENSION(:), INTENT(IN) :: punif_agesnow !
73 INTEGER, INTENT(IN) :: klayer ! Number of layer of output snow scheme
74 !
75 !* 0.2 declarations of local variables
76 !
77 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ztsnow, zrsnow
78 REAL, DIMENSION(:,:,:), ALLOCATABLE :: zlwcsnow !(kg/m2)
79 !
80 REAL, DIMENSION(1) :: zd
81 INTEGER :: jvegtype ! loop counter on vegtypes
82 !
83 REAL(KIND=JPRB) :: zhook_handle
84 !
85 !-------------------------------------------------------------------------------------
86 !
87 !
88 IF (lhook) CALL dr_hook('PREP_SNOW_UNIF',0,zhook_handle)
89 !
90 IF (osnow_ideal) THEN
91  ALLOCATE(pfield(1,SIZE(punif_wsnow),nvegtype))
92  ALLOCATE(ztsnow(1,SIZE(punif_wsnow),nvegtype))
93  ALLOCATE(zrsnow(1,SIZE(punif_wsnow),nvegtype))
94  ALLOCATE(zlwcsnow(1,SIZE(punif_wsnow),nvegtype))
95 ELSE
96  IF(hsurf(1:3)=='DEP')THEN
97  ALLOCATE(pfield(1,klayer,nvegtype))
98  ELSE
99  ALLOCATE(pfield(1,ngrid_level,nvegtype))
100  ENDIF
101  ALLOCATE(ztsnow(1,ngrid_level,nvegtype))
102  ALLOCATE(zrsnow(1,ngrid_level,nvegtype))
103  ALLOCATE(zlwcsnow(1,ngrid_level,nvegtype))
104 ENDIF
105 !
106 !* 1. No snow
107 ! -------
108 !
109 IF (any(punif_rsnow(:)==0. .AND. punif_wsnow(:)/=0.)) THEN
110  WRITE(kluout,*)'XWSNOW/=0. AND RSNOW=0.'
111  CALL abor1_sfx('PREP_SNOW_UNIF: WITH XWSNOW/=0., RSNOW MUST NOT BE 0.')
112 END IF
113 !
114 !* 2. Snow prescribed
115 ! ---------------
116 !
117 SELECT CASE(hsurf(1:3))
118 !
119  CASE('WWW')
120  IF (osnow_ideal) THEN
121  DO jvegtype=1,nvegtype
122  pfield(1,:,jvegtype) = punif_wsnow(:)
123  ENDDO
124  ELSE
125  DO jvegtype=1,nvegtype
126  pfield(1,:,jvegtype) = punif_wsnow(1)
127  ENDDO
128  ENDIF
129 !
130  CASE('DEP')
131  IF (osnow_ideal) THEN
132  DO jvegtype=1,nvegtype
133  pfield(1,:,jvegtype) = punif_wsnow(:)/punif_rsnow(:)
134  ENDDO
135  ELSE
136  IF(punif_rsnow(1)>0.0)THEN
137  zd(1)=punif_wsnow(1)/punif_rsnow(1)
138  ELSE
139  zd(1)=0.0
140  ENDIF
141  DO jvegtype=1,nvegtype
142  CALL snow3lgrid(pfield(:,:,jvegtype),zd(:))
143  ENDDO
144  ENDIF
145 !
146  CASE('RHO')
147  IF (osnow_ideal) THEN
148  DO jvegtype=1,nvegtype
149  pfield(1,:,jvegtype) = punif_rsnow(:)
150  ENDDO
151  ELSE
152  DO jvegtype=1,nvegtype
153  pfield(1,:,jvegtype) = punif_rsnow(1)
154  ENDDO
155  ENDIF
156 !
157  CASE('ALB')
158  DO jvegtype=1,nvegtype
159  pfield(1,:,jvegtype) = punif_asnow
160  ENDDO
161 !
162  CASE('HEA')
163  IF (osnow_ideal) THEN
164  DO jvegtype=1,nvegtype
165  zrsnow(1,:,jvegtype) = punif_rsnow(:)
166  ztsnow(1,:,jvegtype) = punif_tsnow(:)
167  zlwcsnow(1,:,jvegtype) = punif_lwcsnow(:) ! kg/m3
168  ENDDO
169  ELSE
170  DO jvegtype=1,nvegtype
171  zrsnow(1,:,jvegtype) = punif_rsnow(1)
172  ztsnow(1,:,jvegtype) = punif_tsnow(1)
173  zlwcsnow(1,:,jvegtype) = punif_lwcsnow(1) ! kg/m3
174  ENDDO
175  ENDIF
176  CALL snow_t_wliq_to_heat(pfield,zrsnow,ztsnow,zlwcsnow)
177 !
178  CASE('SG1')
179  IF (osnow_ideal) THEN
180  DO jvegtype=1,nvegtype
181  pfield(1,:,jvegtype) = punif_sg1snow(:)
182  ENDDO
183  ELSE
184  DO jvegtype=1,nvegtype
185  pfield(1,:,jvegtype) = punif_sg1snow(1)
186  ENDDO
187  ENDIF
188 !
189  CASE('SG2')
190  IF (osnow_ideal) THEN
191  DO jvegtype=1,nvegtype
192  pfield(1,:,jvegtype) = punif_sg2snow(:)
193  ENDDO
194  ELSE
195  DO jvegtype=1,nvegtype
196  pfield(1,:,jvegtype) = punif_sg2snow(1)
197  ENDDO
198  ENDIF
199 !
200  CASE('HIS')
201  IF (osnow_ideal) THEN
202  DO jvegtype=1,nvegtype
203  pfield(1,:,jvegtype) = punif_histsnow(:)
204  ENDDO
205  ELSE
206  DO jvegtype=1,nvegtype
207  pfield(1,:,jvegtype) = punif_histsnow(1)
208  ENDDO
209  ENDIF
210 !
211  CASE('AGE')
212  IF (osnow_ideal) THEN
213  DO jvegtype=1,nvegtype
214  pfield(1,:,jvegtype) = punif_agesnow(:)
215  ENDDO
216  ELSE
217  DO jvegtype=1,nvegtype
218  pfield(1,:,jvegtype) = punif_agesnow(1)
219  ENDDO
220  ENDIF
221  !
222 END SELECT
223 !
224 !* 2. Interpolation method
225 ! --------------------
226 !
227  cinterp_type='UNIF '
228 DEALLOCATE(ztsnow)
229 DEALLOCATE(zrsnow)
230 DEALLOCATE(zlwcsnow)
231 IF (lhook) CALL dr_hook('PREP_SNOW_UNIF',1,zhook_handle)
232 !
233 !-------------------------------------------------------------------------------------
234 END SUBROUTINE prep_snow_unif
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:6
subroutine prep_snow_unif(KLUOUT, HSURF, PFIELD, TPTIME, OSNOW_IDEAL, PUNIF_WSNOW, PUNIF_RSNOW, PUNIF_TSNOW, PUNIF_LWCSNOW, PUNIF_ASNOW, PUNIF_SG1SNOW, PUNIF_SG2SNOW, PUNIF_HISTSNOW, PUNIF_AGESNOW, KLAYER)