SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
assim_nature_isba_oi.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 SUBROUTINE assim_nature_isba_oi (I, &
6  hprogram, ki, &
7  prrcl, prrsl, prrcn, prrsn, &
8  patmneb, pitm, pevaptr, pevap, &
9  psnc, ptsc, pucls, pvcls, &
10  pts_o, pt2m_o, phu2m_o, pswe, &
11  htest, od_maskext, &
12  plon_in, plat_in )
13 
14 ! ------------------------------------------------------------------------------------------
15 ! *****************************************************************************************
16 !
17 ! Routine to perform OI within SURFEX
18 ! a soil analysis for water content and temperature
19 ! using the Meteo-France optimum interpolation technique of Giard and Bazile (2000)
20 !
21 ! Derived from CANARI subroutines externalized by Lora Taseva (Dec. 2007)
22 !
23 ! Author : Jean-Francois Mahfouf (01/2008)
24 !
25 ! Modifications :
26 ! (05/2008) : The I/O of this version follow the newly available LFI format in SURFEX
27 ! (01/2009) : Read directly atmospheric FA files using XRD library instead of using "edf"
28 ! (06/2009) : Modifications to allow the assimilation of ASCAT superficial soil moisture
29 ! (09/2010) : More parameters to goto_surfex
30 ! (03/2011) : Initialization of ZEVAPTR (F.Bouyssel)
31 ! (07/2011) : Read pgd+prep (B. Decharme)
32 ! (04/2012) : Made as a subroutine (T. Aspelien)
33 ! (06/2013) : Separating IO (T. Aspelien)
34 ! ******************************************************************************************
35 ! ------------------------------------------------------------------------------------------
36 !
37 USE modd_isba_n, ONLY : isba_t
38 !
39 USE modd_csts, ONLY : xday, xpi, xrholw, xlvtt, ndaysec
40 USE modd_surf_par, ONLY : xundef
41 !
42 USE modd_assim, ONLY : lobswg, nitrad, nprintlev, nechgu, xrd1, xrscaldw, &
43  xrthr_qc, xsigwgb, xsigwgo, xsigwgo_max, xat2m_isba, &
44  xahu2m_isba, xazon10m_isba, xamer10m_isba
45 !
46 
47 USE yomhook, ONLY : lhook, dr_hook
48 USE parkind1, ONLY : jprb
49 !
50 USE modi_abor1_sfx
51 USE modi_oi_bc_soil_moisture
52 USE modi_oi_cacsts
53 !
54 IMPLICIT NONE
55 !
56 TYPE(isba_t), INTENT(INOUT) :: i
57 !
58  CHARACTER(LEN=6), INTENT(IN) :: hprogram ! program calling surf. schemes
59 INTEGER, INTENT(IN) :: ki
60 REAL, DIMENSION(KI), INTENT(IN) :: prrcl
61 REAL, DIMENSION(KI), INTENT(IN) :: prrsl
62 REAL, DIMENSION(KI), INTENT(IN) :: prrcn
63 REAL, DIMENSION(KI), INTENT(IN) :: prrsn
64 REAL, DIMENSION(KI), INTENT(IN) :: patmneb
65 REAL, DIMENSION(KI), INTENT(IN) :: pitm
66 REAL, DIMENSION(KI), INTENT(IN) :: pevaptr
67 REAL, DIMENSION(KI), INTENT(IN) :: pevap
68 REAL, DIMENSION(KI), INTENT(IN) :: psnc
69 REAL, DIMENSION(KI), INTENT(IN) :: ptsc
70 REAL, DIMENSION(KI), INTENT(IN) :: pucls
71 REAL, DIMENSION(KI), INTENT(IN) :: pvcls
72 REAL, DIMENSION(KI), INTENT(IN) :: pts_o
73 REAL, DIMENSION(KI), INTENT(IN) :: pt2m_o
74 REAL, DIMENSION(KI), INTENT(IN) :: phu2m_o
75 REAL, DIMENSION(KI), INTENT(OUT):: pswe
76  CHARACTER(LEN=2), INTENT(IN) :: htest ! must be equal to 'OK'
77 LOGICAL, DIMENSION (KI) :: od_maskext
78 REAL(KIND=JPRB), DIMENSION (:), INTENT(IN) :: plon_in
79 REAL(KIND=JPRB), DIMENSION (:), INTENT(IN) :: plat_in
80 
81 ! Declarations of local variables
82 !
83 ! Arrays for soil OI analysis
84 !
85 REAL, DIMENSION (KI) :: zsab, zarg, zws, zwp, ztl, zws0, zwp0, ztl0, &
86  zts, ztp, zsns, ztcls, zhcls, zd2, zucls, zvcls, &
87  zrsmin, zlai, zveg, zsns0, zts0, ztp0, &
88  ziveg, zsm_o, zsig_smo, zlsm_o, zws_o, zlon, zlat, &
89  zt2inc, zh2inc, zwginc, zwpinc1, zwpinc2, zwpinc3, &
90  zt2mbias, zh2mbias, zalbf, zemisf, zz0f, zz0h, &
91  zwsc, zwpc, ztpc, zevap, zevaptr, zsstc, &
92  zgelat, zgelam, zgemu, zwsinc, zwpinc, ztlinc, &
93  zsninc, ztsinc, ztpinc
94 !
95 REAL :: zthres
96 INTEGER :: idat
97 INTEGER :: iyear ! current year (UTC)
98 INTEGER :: imonth ! current month (UTC)
99 INTEGER :: iday ! current day (UTC)
100 INTEGER :: isssss ! current time since start of the run (s)
101 INTEGER :: ji, jj, jp, jl
102 INTEGER :: inobs ! number of observations
103 REAL(KIND=JPRB) :: zhook_handle
104 !
105 ! ----------------------------------------------------------------------------------
106 !
107 IF (lhook) CALL dr_hook('ASSIM_NATURE_ISBA_OI',0,zhook_handle)
108 
109 IF (htest/='OK') THEN
110  CALL abor1_sfx('ASSIM_NATURE_ISBA_OI: FATAL ERROR DURING ARGUMENT TRANSFER')
111 END IF
112 
113 IF ( nprintlev > 0 ) THEN
114  WRITE(*,*) '--------------------------------------------------------------------------'
115  WRITE(*,*) '| |'
116  WRITE(*,*) '| ENTER OI_ASSIM |'
117  WRITE(*,*) '| |'
118  WRITE(*,*) '--------------------------------------------------------------------------'
119 ENDIF
120 !
121 ! Update some constants dependant from NACVEG
122 !
123 ! scaling of soil moisture increments when assimilation window is different
124 ! from 6 hours
125 xrscaldw = REAL(nechgu)/6.0
126 ! half assimilation window in sec
127 nitrad = nechgu*1800
128 !
129 ! Time initializations
130 !
131 iyear = i%TTIME%TDATE%YEAR
132 imonth = i%TTIME%TDATE%MONTH
133 iday = i%TTIME%TDATE%DAY
134 isssss = i%TTIME%TIME
135 IF ( isssss>ndaysec ) isssss = isssss - ndaysec
136 idat = iyear*10000. + imonth*100. + iday
137 !
138 !
139 DO ji=1,ki
140  zgelam(ji) = plon_in(ji)
141  zgelat(ji) = plat_in(ji)
142 ENDDO
143 !
144 DO ji=1,ki
145  zgemu(ji) = sin(zgelat(ji)*xpi/180.)
146 ENDDO
147 !
148 !
149 jp = 1
150 jl = 1
151 !
152 !
153 zsab(:) = i%XSAND(:,jp)*100.
154 zarg(:) = i%XCLAY(:,jp)*100.
155 !
156 zts0(:) = i%XTG (:,1,jp)
157 ztp0(:) = i%XTG (:,2,jp)
158 !
159 zws0(:) = i%XWG (:,1,jp)
160 zwp0(:) = i%XWG (:,2,jp)
161 ztl0(:) = i%XWGI (:,2,jp)
162 !
163 zsns0(:) = i%TSNOW%WSNOW(:,jl,jp)
164 zsns(:) = zsns0(:)
165 !
166 ztcls(:) = xat2m_isba(:,jp)
167 zhcls(:) = xahu2m_isba(:,jp)
168 !
169 zd2(:) = i%XDG (:,2,jp)
170 zrsmin(:) = i%XRSMIN(:,jp)
171 zlai(:) = i%XLAI (:,jp)
172 zveg(:) = i%XVEG (:,jp)
173 !
174 zucls(:) = pucls(:)
175 zvcls(:) = pvcls(:)
176 !
177 zwpinc1(:) = xundef
178 zwpinc2(:) = xundef
179 zwpinc3(:) = xundef
180 zt2mbias(:) = xundef
181 zh2mbias(:) = xundef
182 !
183 ! Sea-ice surface properties
184 zalbf(:) = xundef
185 zemisf(:) = xundef
186 zz0f(:) = xundef
187 zz0h(:) = xundef
188 !
189 ! Climatological arrays set to missing values
190 zwsc(:) = xundef
191 zwpc(:) = xundef
192 ztpc(:) = xundef
193 !
194 ! PRINT
195 !
196 IF ( nprintlev > 1 ) THEN
197  WRITE(*,*) 'value in PREP file => WG1 ',sum(zws0)/ki
198  WRITE(*,*) 'value in PREP file => WG2 ',sum(zwp0)/ki
199  WRITE(*,*) 'value in PREP file => TG1 ',sum(zts0)/ki
200  WRITE(*,*) 'value in PREP file => TG2 ',sum(ztp0)/ki
201  WRITE(*,*) 'value in PREP file => WGI2 ',sum(ztl0)/ki
202  WRITE(*,*) 'value in PREP file => WSNOW_VEG1',sum(zsns)/ki
203  WRITE(*,*) 'value in PREP file => LAI ',sum(zlai)/ki
204  WRITE(*,*) 'value in PREP file => VEG ',sum(zveg)/ki
205  WRITE(*,*) 'value in PREP file => RSMIN ',sum(zrsmin)/ki
206  WRITE(*,*) 'value in PREP file => DATA_DG2 ',sum(zd2)/ki
207  WRITE(*,*) 'value in PREP file => SAND ',sum(zsab)/ki
208  WRITE(*,*) 'value in PREP file => CLAY ',sum(zarg)/ki
209 ENDIF
210 !
211 ! SST not used in cacsts
212 zsstc(:) = 0.
213 !
214 WHERE ( zws0(:)/=xundef )
215  zws(:) = zws0(:) * xrd1 * xrholw ! conversion of m3/m3 -> mm
216  zwp(:) = zwp0(:) * zd2(:) * xrholw ! conversion of m3/m3 -> mm
217  ztl(:) = ztl0(:) * zd2(:) * xrholw ! conversion of m3/m3 -> mm
218 ENDWHERE
219 !
220 zevap(:) = (pevap(:)/xlvtt*xday)/(nechgu*3600.) ! conversion W/m2 -> mm/day
221 zevaptr(:) = pevaptr(:)*xday
222 !
223 ! Set PIVEG (SURFIND.VEG.DOMI) since it is not available
224 ziveg(:) = 0.0
225 !
226 !
227 ! Read ASCAT SM observations (in percent)
228 !
229 inobs = 0
230 IF ( lobswg ) THEN
231  OPEN(unit=111,file='ASCAT_SM.DAT')
232  DO ji=1,ki
233  READ(111,*) zsm_o(ji),zsig_smo(ji),zlsm_o(ji)
234  ! data rejection if not on land
235  ! data rejection of error too large
236  IF ( zlsm_o(ji)<1.0 .OR. zsig_smo(ji)>xsigwgo_max ) zsm_o(ji) = 999.0
237  IF ( zsm_o(ji)/=999.0 ) inobs = inobs + 1
238  ENDDO
239  CLOSE(unit=111)
240  IF ( nprintlev > 0 ) WRITE(*,*) 'READ ASCAT SM OK'
241 ELSE
242  zsm_o(:) = 999.0
243  zsig_smo(:) = 999.0
244  zlsm_o(:) = 0.0
245 ENDIF
246 IF ( nprintlev > 0 ) WRITE(*,*) ' NUMBER OF ASCAT OBSERVATIONS AFTER INITIAL CHECKS :: ',inobs
247 !
248 ! Perform bias correction of SM observations
249  CALL oi_bc_soil_moisture(ki,zsm_o,zsab,zws_o)
250 !
251 !
252 ! Screen-level innovations
253 zt2inc=0.
254 WHERE ( pt2m_o(:) /= 999.0 )
255  zt2inc(:) = pt2m_o(:) - ztcls(:)
256 END WHERE
257 zh2inc=0.
258 WHERE ( phu2m_o(:) /= 999.0 )
259  zh2inc(:) = phu2m_o(:) - zhcls(:)
260 END WHERE
261 !
262 ! Avoid division by zero in next WHERE statement;
263 ! this may occur in the extension zone
264 WHERE (od_maskext(1:ki))
265  zd2(:) = 1.0
266  zt2inc(:) = 0.0
267  zh2inc(:) = 0.0
268 END WHERE
269 !
270 ! Threshold for background check
271 zthres = xrthr_qc*sqrt(xsigwgo**2 + xsigwgb**2)
272 ! Superficial soil moisture innovations in (m3/m3)
273 inobs = 0
274 DO ji=1,ki
275  IF ( zws_o(ji)/=999.0 ) THEN
276  zwginc(ji) = zws_o(ji) - zws(ji)
277  IF ( abs(zwginc(ji))>zthres ) THEN
278  zwginc(ji) = 0.0 ! background check
279  ELSE
280  inobs = inobs + 1
281  ENDIF
282  ELSE
283  zwginc(ji) = 0.0
284  ENDIF
285 ENDDO
286 IF ( nprintlev > 0 ) THEN
287  WRITE(*,*) ' NUMBER OF ASCAT OBSERVATIONS AFTER BACKGROUND CHECK :: ',inobs
288  WRITE(*,*) 'Mean T2m increments ',sum(zt2inc)/ki
289  WRITE(*,*) 'Mean HU2m increments ',sum(zh2inc)/ki
290 ENDIF
291 !
292 zts(:) = zts0(:)
293 ztp(:) = ztp0(:)
294 write(*,*) 'PERFORMING OI SOIL ANALYSIS'
295  CALL oi_cacsts(ki, zt2inc, zh2inc, zwginc, zws_o, &
296  idat, isssss, &
297  ztp, zwp, ztl, zsns, zts, zws, &
298  ztcls, zhcls, zucls, zvcls, zsstc, &
299  zwpinc1, zwpinc2, zwpinc3, zt2mbias, zh2mbias, &
300  prrcl, prrsl, prrcn, prrsn, patmneb, zevap, zevaptr, &
301  pitm, zveg, zalbf, zemisf, zz0f, &
302  ziveg, zarg, zd2, zsab, zlai, zrsmin, zz0h, &
303  ptsc, ztpc, zwsc, zwpc, psnc, zgelat, zgelam, zgemu )
304 !
305 ! Perform soil moiture analyses
306 pswe(:) = zsns(:)
307 !
308 zwsinc(:) = 0.0
309 zwpinc(:) = 0.0
310 ztlinc(:) = 0.0
311 zsninc(:) = 0.0
312 WHERE ( zws(:)/=xundef )
313  zwsinc(:) = zws(:) - zws0(:) * xrd1 * xrholw
314  zwpinc(:) = zwp(:) - zwp0(:) * zd2(:) * xrholw
315  ztlinc(:) = ztl(:) - ztl0(:) * zd2(:) * xrholw
316  zsninc(:) = zsns(:) - zsns0(:)
317 END WHERE
318 
319 ! Avoid division by zero in next WHERE statement;
320 ! this may occur in the extension zone
321 WHERE (od_maskext(1:ki)) zd2(:) = 1.0
322 !
323 WHERE (zws0(:)/=xundef)
324  zws0(:) = zws(:)/ (xrd1*xrholw)
325  zwp0(:) = zwp(:)/ (zd2(:)*xrholw)
326  ztl0(:) = ztl(:)/ (zd2(:)*xrholw)
327  zsns0(:) = zsns(:)
328 ENDWHERE
329 ! Perform temperature analyses
330 !
331 ztsinc(:) = 0.0
332 ztpinc(:) = 0.0
333 WHERE (zts(:)/=xundef)
334  ztsinc(:) = zts(:) - zts0(:)
335  ztpinc(:) = ztp(:) - ztp0(:)
336  zts0(:) = zts(:)
337  ztp0(:) = ztp(:)
338 END WHERE
339 
340 
341 ! PRINT statistics of the soil analysis
342 
343 WRITE(*,*) '---------------------------------------------------------------'
344 WRITE(*,*) 'Mean WS increments over NATURE ',sum(zwsinc)/ki
345 WRITE(*,*) 'Mean WP increments over NATURE ',sum(zwpinc)/ki
346 WRITE(*,*) 'Mean TS increments over NATURE ',sum(ztsinc)/ki
347 WRITE(*,*) 'Mean TP increments over NATURE ',sum(ztpinc)/ki
348 WRITE(*,*) 'Mean TL increments over NATURE ',sum(ztlinc)/ki
349 WRITE(*,*) '---------------------------------------------------------------'
350 
351 ! Update modified variables
352 i%XWG (:,1,jp) = zws0(:)
353 i%XWG (:,2,jp) = zwp0(:)
354 i%XTG (:,1,jp) = zts0(:)
355 i%XTG (:,2,jp) = ztp0(:)
356 i%XWGI(:,2,jp) = ztl0(:)
357 
358 !
359 ! -------------------------------------------------------------------------------------
360 IF (lhook) CALL dr_hook('ASSIM_NATURE_ISBA_OI',1,zhook_handle)
361 END SUBROUTINE assim_nature_isba_oi
subroutine oi_bc_soil_moisture(KNBPT,
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:6
subroutine oi_cacsts(KNBPT, PT2INC, PH2INC, PWGINC, PWS_O, KDAT, KSSSSS, PTP, PWP, PTL, PSNS, PTS, PWS, PTCLS, PHCLS, PUCLS, PVCLS, PSSTC, PWPINC1, PWPINC2, PWPINC3, PT2MBIAS, PH2MBIAS, PRRCL, PRRSL, PRRCN, PRRSN, PATMNEB, PEVAP, PEVAPTR, PITM, PVEG, PALBF, PEMISF, PZ0F, PIVEG, PARG, PD2, PSAB, PLAI, PRSMIN, PZ0H, PTSC, PTPC, PWSC, PWPC, PSNC, PGELAT, PGELAM, PGEMU)
Definition: oi_cacsts.F90:24
subroutine assim_nature_isba_oi(I, HPROGRAM, KI, PRRCL, PRRSL, PRRCN, PRRSN, PATMNEB, PITM, PEVAPTR, PEVAP, PSNC, PTSC, PUCLS, PVCLS, PTS_O, PT2M_O, PHU2M_O, PSWE, HTEST, OD_MASKEXT, PLON_IN, PLAT_IN)