SURFEX v8.1
General documentation of Surfex
read_seafluxn.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 read_seaflux_n (DTCO, G, S, U, HPROGRAM,KLUOUT)
7 ! #########################################
8 !
9 !!**** *READ_SEAFLUX_n* - read SEAFLUX varaibles
10 !!
11 !!
12 !! PURPOSE
13 !! -------
14 !!
15 !!** METHOD
16 !! ------
17 !!
18 !! EXTERNAL
19 !! --------
20 !!
21 !!
22 !! IMPLICIT ARGUMENTS
23 !! ------------------
24 !!
25 !! REFERENCE
26 !! ---------
27 !!
28 !!
29 !! AUTHOR
30 !! ------
31 !! V. Masson *Meteo France*
32 !!
33 !! MODIFICATIONS
34 !! -------------
35 !! Original 01/2003
36 !! Modified 02/2008 Add oceanic variables initialisation
37 !! S. Belamari 04/2014 Suppress LMERCATOR
38 !! R. Séférian 01/2015 introduce new ocean surface albedo
39 !-------------------------------------------------------------------------------
40 !
41 !* 0. DECLARATIONS
42 ! ------------
43 !
44 !
45 !
46 !
48 USE modd_sfx_grid_n, ONLY : grid_t
49 USE modd_seaflux_n, ONLY : seaflux_t
50 USE modd_surf_atm_n, ONLY : surf_atm_t
51 !
52 USE modd_surf_par, ONLY : xundef
53 !
55 USE modi_interpol_sst_mth
56 !
57 USE modi_get_type_dim_n
58 USE modi_abor1_sfx
59 !
60 USE yomhook ,ONLY : lhook, dr_hook
61 USE parkind1 ,ONLY : jprb
62 !
63 IMPLICIT NONE
64 !
65 !* 0.1 Declarations of arguments
66 ! -------------------------
67 !
68 !
69 TYPE(data_cover_t), INTENT(INOUT) :: DTCO
70 TYPE(grid_t), INTENT(INOUT) :: G
71 TYPE(seaflux_t), INTENT(INOUT) :: S
72 TYPE(surf_atm_t), INTENT(INOUT) :: U
73 !
74  CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! calling program
75 INTEGER, INTENT(IN) :: KLUOUT
76 !
77 !* 0.2 Declarations of local variables
78 ! -------------------------------
79 !
80 INTEGER :: JMTH, INMTH
81  CHARACTER(LEN=2 ) :: YMTH
82 !
83 INTEGER :: ILU ! 1D physical dimension
84 !
85 INTEGER :: IRESP ! Error code after redding
86 !
87  CHARACTER(LEN=12) :: YRECFM ! Name of the article to be read
88 !
89 INTEGER :: IVERSION ! surface version
90 !
91 REAL(KIND=JPRB) :: ZHOOK_HANDLE
92 !
93 !-------------------------------------------------------------------------------
94 !
95 !* 1D physical dimension
96 !
97 IF (lhook) CALL dr_hook('READ_SEAFLUX_N',0,zhook_handle)
98 !
99 yrecfm='SIZE_SEA'
100  CALL get_type_dim_n(dtco, u, 'SEA ',ilu)
101 !
102 !* 2. Prognostic fields:
103 ! -----------------
104 !
105 !* water temperature
106 !
107 ALLOCATE(s%XSST(ilu))
108 !
109 IF(s%LINTERPOL_SST)THEN
110 !
111 ! Precedent, Current, Next, and Second-next Monthly SST
112  inmth=4
113 !
114  ALLOCATE(s%XSST_MTH(SIZE(s%XSST),inmth))
115  DO jmth=1,inmth
116  WRITE(ymth,'(I2)') (jmth-1)
117  yrecfm='SST_MTH'//adjustl(ymth(:len_trim(ymth)))
118  CALL read_surf(hprogram,yrecfm,s%XSST_MTH(:,jmth),iresp)
119  ENDDO
120 !
121  CALL interpol_sst_mth(s,'T')
122 !
123 ELSE
124 !
125  ALLOCATE(s%XSST_MTH(0,0))
126 !
127  yrecfm='SST'
128  CALL read_surf(hprogram,yrecfm,s%XSST(:),iresp)
129 !
130 ENDIF
131 !
132 !* stochastic flux perturbation pattern
133 !
134 ALLOCATE(s%XPERTFLUX(ilu))
135 IF( s%LPERTFLUX ) THEN
136  CALL read_surf(hprogram,'PERTSEAFLUX',s%XPERTFLUX(:),iresp)
137 ELSE
138  s%XPERTFLUX(:) = 0.
139 ENDIF
140 !
141 !-------------------------------------------------------------------------------
142 !
143 !* 3. Semi-prognostic fields:
144 ! ----------------------
145 !
146 !* roughness length
147 !
148 ALLOCATE(s%XZ0(ilu))
149 yrecfm='Z0SEA'
150 s%XZ0(:) = 0.001
151  CALL read_surf(hprogram,yrecfm,s%XZ0(:),iresp)
152 !
153 !* flag to use or not the SeaIce model
154 !
155  CALL read_surf(hprogram,'VERSION',iversion,iresp)
156 IF (iversion <8) THEN
157  s%LHANDLE_SIC=.false.
158 ELSE
159  CALL read_surf(hprogram,'HANDLE_SIC',s%LHANDLE_SIC,iresp)
160 ENDIF
161 !
162 !
163 ! * sea surface salinity
164 !
165 ALLOCATE(s%XSSS(ilu))
166 s%XSSS(:)=0.0
167 !
168 !* Sea surface salinity nudging data
169 !
170 IF(s%LINTERPOL_SSS)THEN
171  !
172  ! Precedent, Current, Next, and Second-next Monthly SSS
173  inmth=4
174  !
175  ALLOCATE(s%XSSS_MTH(ilu,inmth))
176  DO jmth=1,inmth
177  WRITE(ymth,'(I2)') (jmth-1)
178  yrecfm='SSS_MTH'//adjustl(ymth(:len_trim(ymth)))
179  CALL read_surf(hprogram,yrecfm,s%XSSS_MTH(:,jmth),iresp)
180  CALL check_sea(yrecfm,s%XSSS_MTH(:,jmth))
181  ENDDO
182  !
183  CALL interpol_sst_mth(s,'S')
184  !
185 ELSEIF (iversion>=8) THEN
186  !
187  ALLOCATE(s%XSSS_MTH(0,0))
188  !
189  yrecfm='SSS'
190  CALL read_surf(hprogram,yrecfm,s%XSSS,iresp)
191  IF(s%LHANDLE_SIC)THEN
192  CALL check_sea(yrecfm,s%XSSS(:))
193  ENDIF
194  !
195 ENDIF
196 !
197 !* ocean surface albedo (direct and diffuse fraction)
198 !
199 ALLOCATE(s%XDIR_ALB (ilu))
200 ALLOCATE(s%XSCA_ALB (ilu))
201 !
202 IF(s%CSEA_ALB=='RS14')THEN
203 !
204  yrecfm='OSA_DIR'
205  CALL read_surf(hprogram,yrecfm,s%XDIR_ALB(:),iresp)
206 !
207  yrecfm='OSA_SCA'
208  CALL read_surf(hprogram,yrecfm,s%XSCA_ALB(:),iresp)
209 !
210 ELSE
211 !
212  s%XDIR_ALB(:)=0.065
213  s%XSCA_ALB(:)=0.065
214 !
215 ENDIF
216 !
217 IF (lhook) CALL dr_hook('READ_SEAFLUX_N',1,zhook_handle)
218 !
219 !-------------------------------------------------------------------------------
220 CONTAINS
221 !-------------------------------------------------------------------------------
222 !
223 SUBROUTINE check_sea(HFIELD,PFIELD)
224 !
225 !
226 IMPLICIT NONE
227 !
228  CHARACTER(LEN=12), INTENT(IN) :: HFIELD
229 REAL, DIMENSION(:), INTENT(IN) :: PFIELD
230 !
231 REAL :: ZMAX,ZMIN
232 INTEGER :: JI, IERRC
233 !
234 REAL(KIND=JPRB) :: ZHOOK_HANDLE
235 !
236 IF (lhook) CALL dr_hook('READ_SEAFLUX_N:CHECK_SEA',0,zhook_handle)
237 !
238 zmin=-1.0e10
239 zmax=1.0e10
240 !
241 ierrc=0
242 !
243 DO ji=1,ilu
244  IF(pfield(ji)>zmax.OR.pfield(ji)<zmin)THEN
245  ierrc=ierrc+1
246  WRITE(kluout,*)'PROBLEM FIELD '//trim(hfield)//' =',pfield(ji),&
247  'NOT REALISTIC AT LOCATION (LAT/LON)',g%XLAT(ji),g%XLON(ji)
248  ENDIF
249 ENDDO
250 !
251 IF(ierrc>0) CALL abor1_sfx('READ_SEAFLUX_N: FIELD '//trim(hfield)//' NOT REALISTIC')
252 !
253 IF (lhook) CALL dr_hook('READ_SEAFLUX_N:CHECK_SEA',1,zhook_handle)
254 
255 END SUBROUTINE check_sea
256 !
257 !------------------------------------------------------------------------------
258 END SUBROUTINE read_seaflux_n
subroutine get_type_dim_n(DTCO, U, HTYPE, KDIM)
static const char * trim(const char *name, int *n)
Definition: drhook.c:2383
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:7
real, parameter xundef
subroutine read_seaflux_n(DTCO, G, S, U, HPROGRAM, KLUOUT)
subroutine interpol_sst_mth(S, HFLAG)
integer, parameter jprb
Definition: parkind1.F90:32
subroutine check_sea(HCOMMENT, PFIELD)
logical lhook
Definition: yomhook.F90:15