SURFEX v8.1
General documentation of Surfex
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_data_cover_par, ONLY : nvegtype
46 !
47 USE yomhook ,ONLY : lhook, dr_hook
48 USE parkind1 ,ONLY : jprb
49 !
50 USE modi_abor1_sfx
51 !
52 IMPLICIT NONE
53 !
54 !* 0.1 declarations of arguments
55 !
56 INTEGER, INTENT(IN) :: KLUOUT ! output listing logical unit
57  CHARACTER(LEN=10), INTENT(IN) :: HSURF ! type of field
58 REAL, POINTER, DIMENSION(:,:,:) :: PFIELD ! field to interpolate horizontally
59 TYPE(date_time), INTENT(IN) :: TPTIME ! date and time
60 LOGICAL, INTENT(IN) :: OSNOW_IDEAL
61 REAL, DIMENSION(:), INTENT(IN) :: PUNIF_WSNOW ! prescribed snow content (kg/m2)
62 REAL, DIMENSION(:), INTENT(IN) :: PUNIF_RSNOW ! prescribed density (kg/m3)
63 REAL, DIMENSION(:), INTENT(IN) :: PUNIF_TSNOW ! prescribed temperature (K)
64 REAL, DIMENSION(:), INTENT(IN) :: PUNIF_LWCSNOW ! prescribed snow liquid water content (kg/m3)
65 REAL, INTENT(IN) :: PUNIF_ASNOW ! prescribed albedo (-)
66 REAL, DIMENSION(:), INTENT(IN) :: PUNIF_SG1SNOW !
67 REAL, DIMENSION(:), INTENT(IN) :: PUNIF_SG2SNOW !
68 REAL, DIMENSION(:), INTENT(IN) :: PUNIF_HISTSNOW !
69 REAL, DIMENSION(:), INTENT(IN) :: PUNIF_AGESNOW !
70 INTEGER, INTENT(IN) :: KLAYER ! Number of layer of output snow scheme
71 !
72 !* 0.2 declarations of local variables
73 !
74 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTSNOW, ZRSNOW
75 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZLWCSNOW !(kg/m2)
76 !
77 REAL, DIMENSION(1) :: ZD
78 INTEGER :: JVEGTYPE ! loop counter on vegtypes
79 !
80 REAL(KIND=JPRB) :: ZHOOK_HANDLE
81 !
82 !-------------------------------------------------------------------------------------
83 !
84 !
85 IF (lhook) CALL dr_hook('PREP_SNOW_UNIF',0,zhook_handle)
86 !
87 IF (osnow_ideal) THEN
88  ALLOCATE(pfield(1,SIZE(punif_wsnow),1))
89  ALLOCATE(ztsnow(1,SIZE(punif_wsnow),1))
90  ALLOCATE(zrsnow(1,SIZE(punif_wsnow),1))
91  ALLOCATE(zlwcsnow(1,SIZE(punif_wsnow),1))
92 ELSE
93  ALLOCATE(pfield(1,1,1))
94  ALLOCATE(ztsnow(1,1,1))
95  ALLOCATE(zrsnow(1,1,1))
96  ALLOCATE(zlwcsnow(1,1,1))
97 ENDIF
98 !
99 !* 1. No snow
100 ! -------
101 !
102 IF (any(punif_rsnow(:)==0. .AND. punif_wsnow(:)/=0.)) THEN
103  WRITE(kluout,*)'XWSNOW/=0. AND RSNOW=0.'
104  CALL abor1_sfx('PREP_SNOW_UNIF: WITH XWSNOW/=0., RSNOW MUST NOT BE 0.')
105 END IF
106 !
107 !* 2. Snow prescribed
108 ! ---------------
109 !
110 SELECT CASE(hsurf(1:3))
111 !
112  CASE('WWW')
113  IF (osnow_ideal) THEN
114  pfield(1,:,1) = punif_wsnow(:)
115  ELSE
116  pfield(1,:,1) = punif_wsnow(1)
117  ENDIF
118 !
119  CASE('DEP')
120  IF (osnow_ideal) THEN
121  pfield(1,:,1) = punif_wsnow(:)/punif_rsnow(:)
122  ELSE
123  IF(punif_rsnow(1)>0.0)THEN
124  zd(1)=punif_wsnow(1)/punif_rsnow(1)
125  ELSE
126  zd(1)=0.0
127  ENDIF
128  CALL snow3lgrid(pfield(:,:,1),zd(:))
129  ENDIF
130 !
131  CASE('RHO')
132  IF (osnow_ideal) THEN
133  pfield(1,:,1) = punif_rsnow(:)
134  ELSE
135  pfield(1,:,1) = punif_rsnow(1)
136  ENDIF
137 !
138  CASE('ALB')
139  pfield(1,:,1) = punif_asnow
140 !n
141  CASE('HEA')
142  IF (osnow_ideal) THEN
143  pfield(1,:,1) = punif_tsnow(:)
144  ELSE
145  pfield(1,:,1) = punif_tsnow(1)
146  ENDIF
147 
148 !
149  CASE('SG1')
150  IF (osnow_ideal) THEN
151  pfield(1,:,1) = punif_sg1snow(:)
152  ELSE
153  pfield(1,:,1) = punif_sg1snow(1)
154  ENDIF
155 !
156  CASE('SG2')
157  IF (osnow_ideal) THEN
158  pfield(1,:,1) = punif_sg2snow(:)
159  ELSE
160  pfield(1,:,1) = punif_sg2snow(1)
161  ENDIF
162 !
163  CASE('HIS')
164  IF (osnow_ideal) THEN
165  pfield(1,:,1) = punif_histsnow(:)
166  ELSE
167  pfield(1,:,1) = punif_histsnow(1)
168  ENDIF
169 !
170  CASE('AGE')
171  IF (osnow_ideal) THEN
172  pfield(1,:,1) = punif_agesnow(:)
173  ELSE
174  pfield(1,:,1) = punif_agesnow(1)
175  ENDIF
176  !
177 END SELECT
178 !
179 !* 2. Interpolation method
180 ! --------------------
181 !
182 cinterp_type='UNIF '
183 DEALLOCATE(ztsnow)
184 DEALLOCATE(zrsnow)
185 DEALLOCATE(zlwcsnow)
186 IF (lhook) CALL dr_hook('PREP_SNOW_UNIF',1,zhook_handle)
187 !
188 !-------------------------------------------------------------------------------------
189 END SUBROUTINE prep_snow_unif
character(len=6) cinterp_type
Definition: modd_prep.F90:40
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:7
real, parameter xundef
integer, parameter jprb
Definition: parkind1.F90:32
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)
logical lhook
Definition: yomhook.F90:15