SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
oi_control.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 oi_control (YSC, &
6  & ldinline, &
7  & p__surftemperature, &
8  & p__surfprec_eau_con, &
9  & p__surfprec_eau_gec, &
10  & p__surfprec_nei_con, &
11  & p__surfprec_nei_gec, &
12  & p__atmonebul_basse, &
13  & p__surfxevapotransp, &
14  & p__surfflu_lat_meva, &
15  & p__surfaccpluie, &
16  & p__surfaccneige, &
17  & p__surfaccgraupel, &
18  & p__clstemperature, &
19  & p__clshumi_relative, &
20  & p__clsvent_zonal, &
21  & p__clsvent_meridien, &
22  & p__surfind_terremer, &
23  & p__surfreserv_neige, &
24  & p__lon, &
25  & p__lat, &
26  & ld_maskext)
27 
28 ! ------------------------------------------------------------------------------------------
29 ! *****************************************************************************************
30 !
31 ! Program to perform within SURFEX
32 ! a soil analysis for water content and temperature
33 ! using the Meteo-France optimum interpolation technique of Giard and Bazile (2000)
34 !
35 ! Derived from CANARI subroutines externalized by Lora Taseva (Dec. 2007)
36 !
37 ! Author : Jean-Francois Mahfouf (01/2008)
38 !
39 ! Modifications :
40 ! (05/2008) : The I/O of this version follow the newly available LFI format in SURFEX
41 ! (01/2009) : Read directly atmospheric FA files using XRD library instead of using "edf"
42 ! (06/2009) : Modifications to allow the assimilation of ASCAT superficial soil moisture
43 ! (09/2010) : More parameters to goto_surfex
44 ! (03/2011) : Initialization of ZEVAPTR (F.Bouyssel)
45 ! (03/2013) : Use 10m wind from upperair instead surfex one (F.Taillefer)
46 !
47 ! ******************************************************************************************
48 ! ------------------------------------------------------------------------------------------
49 !
50 !
51 !
52 !
53 USE modd_surfex_n, ONLY : surfex_t
55 !
57 USE modd_csts, ONLY : xday, xpi, xrholw, xlvtt, ndaysec
58 USE modd_surf_par, ONLY : xundef
59 USE modd_assim
61 
62 USE modd_surfex_mpi, ONLY : nrank, npio
63 USE modd_surfex_omp, ONLY : nindx2sfx, nwork, nwork2, xwork, xwork2, xwork3, &
64  nwork_full, nwork2_full, xwork_full, xwork2_full
65 
66 USE modn_io_offline, ONLY : nam_io_offline, cnamelist, csurf_filetype
67 
68 
69 #ifdef SFX_LFI
70 USE modd_io_surf_lfi,ONLY : cfilein_lfi, cfileout_lfi, cfilepgd_lfi, cfilein_lfi_save
71 #endif
72 #ifdef SFX_FA
73 USE modd_io_surf_fa, ONLY : cfilein_fa, cfilein_fa_save, cdnomc, &
74  ndgux, ndlux, perpk, pelon0, pelat0, &
75  pedelx, pedely, pelon1, pelat1, pebeta
76 #endif
77 #ifdef SFX_ARO
78 USE modd_io_surf_aro,ONLY : ngptot, ngptot_cap, nproma, nindx1, nindx2, nblock, nkproma, &
79  ysurfex_cache_out, &
80  surfex_field_buf_prealloc, surfex_field_buf_set_record
81 USE modd_surfex_aro, ONLY : ysurfex_aro_all, ysurfex_aro_cur
82 #endif
83 
84 USE mode_pos_surf, ONLY : posnam
85 
86 USE modi_open_namelist
87 USE modi_close_namelist
88 USE modi_read_all_namelists
89 USE modi_ini_data_cover
90 USE modi_init_io_surf_n
92 USE modi_set_surfex_filein
93 USE modi_get_size_full_n
94 USE modi_read_cover_n
95 USE modi_convert_cover_frac
96 USE modi_get_1d_mask
97 USE modi_end_io_surf_n
98 USE modi_io_buff_clean
99 USE modi_oi_bc_soil_moisture
100 USE modi_oi_latlon_conf_proj
101 USE modi_oi_cacsts
102 USE modi_oi_hor_extrapol_surf
103 USE modi_flag_update
104 USE modi_write_surf
105 
106 USE yomhook ,ONLY : lhook, dr_hook
107 USE parkind1 ,ONLY : jprb
108 
109 IMPLICIT NONE
110 !
111 TYPE(surfex_t), INTENT(INOUT) :: ysc
112 !
113 LOGICAL, INTENT (IN) :: ldinline
114 REAL(KIND=JPRB), OPTIONAL, DIMENSION (:) :: p__surftemperature
115 REAL(KIND=JPRB), OPTIONAL, DIMENSION (:) :: p__surfprec_eau_con
116 REAL(KIND=JPRB), OPTIONAL, DIMENSION (:) :: p__surfprec_eau_gec
117 REAL(KIND=JPRB), OPTIONAL, DIMENSION (:) :: p__surfprec_nei_con
118 REAL(KIND=JPRB), OPTIONAL, DIMENSION (:) :: p__surfprec_nei_gec
119 REAL(KIND=JPRB), OPTIONAL, DIMENSION (:) :: p__atmonebul_basse
120 REAL(KIND=JPRB), OPTIONAL, DIMENSION (:) :: p__surfxevapotransp
121 REAL(KIND=JPRB), OPTIONAL, DIMENSION (:) :: p__surfflu_lat_meva
122 REAL(KIND=JPRB), OPTIONAL, DIMENSION (:) :: p__surfaccpluie
123 REAL(KIND=JPRB), OPTIONAL, DIMENSION (:) :: p__surfaccneige
124 REAL(KIND=JPRB), OPTIONAL, DIMENSION (:) :: p__surfaccgraupel
125 REAL(KIND=JPRB), OPTIONAL, DIMENSION (:) :: p__clstemperature
126 REAL(KIND=JPRB), OPTIONAL, DIMENSION (:) :: p__clshumi_relative
127 REAL(KIND=JPRB), OPTIONAL, DIMENSION (:) :: p__clsvent_zonal
128 REAL(KIND=JPRB), OPTIONAL, DIMENSION (:) :: p__clsvent_meridien
129 REAL(KIND=JPRB), OPTIONAL, DIMENSION (:) :: p__surfind_terremer
130 REAL(KIND=JPRB), OPTIONAL, DIMENSION (:) :: p__surfreserv_neige
131 REAL(KIND=JPRB), OPTIONAL, DIMENSION (:) :: p__lon
132 REAL(KIND=JPRB), OPTIONAL, DIMENSION (:) :: p__lat
133 LOGICAL, OPTIONAL, DIMENSION (:) :: ld_maskext
134 
135 INTEGER :: igpcomp
136 INTEGER :: idat
137 
138  CHARACTER(LEN=28) :: ynamelist = 'OPTIONS.nam '
139 
140 ! Declarations of local variables
141 
142  CHARACTER(LEN=6) :: yprogram
143  CHARACTER(LEN=6), PARAMETER :: yprogram2 = 'FA '
144  CHARACTER(LEN=2) :: cmonth
145 INTEGER :: iyear ! current year (UTC)
146 INTEGER :: imonth ! current month (UTC)
147 INTEGER :: iday ! current day (UTC)
148 INTEGER :: nsssss ! current time since start of the run (s)
149 INTEGER :: iresp ! return code
150 TYPE (date_time) :: ttime ! Current date and time
151 INTEGER :: isize
152 INTEGER :: isize1
153 LOGICAL :: llkeepextzone
154 
155 ! Arrays for soil OI analysis
156 REAL, DIMENSION (:,:), ALLOCATABLE :: pws, pwp, pts, ptp, ptl, psns, prsmin, pd2, plai, pveg
157 REAL, DIMENSION (:), ALLOCATABLE :: psst, psab, parg, plat, plon, ptcls, phcls, pucls, pvcls, &
158  & PEVAP, PEVAPTR, PT2M_O, PHU2M_O, PTS_O, ZT2INC, ZH2INC, &
159  & ZWS, ZWP, ZTL, ZTS, ZTP, ZTCLS, ZHCLS, ZUCLS, ZVCLS, &
160  & PSSTC, PWPINC1, PWPINC2, PWPINC3, PT2MBIAS, PH2MBIAS, &
161  & PRRCN, PRRCL, PRRSN, PRRSL, PATMNEB, PITM, PALBF, PEMISF, &
162  & PZ0F, PIVEG, PZ0H, PTSC, PTPC, PWSC, PWPC, PSNC, ZEVAP, &
163  & ZEVAPTR, PGELAT, PGELAM, PGEMU, ZWSINC, ZWPINC, ZTSINC, &
164  & ZTPINC, ZTLINC, ZSNINC, ZSNS, ZPX, ZPY, PSM_O, PSIG_SMO, &
165  & PLSM_O, PWS_O, ZWGINC, PLST, PTRD3, ZSST, ZLST, ZALT
166 REAL, DIMENSION (:), ALLOCATABLE :: zsst1, zlst1, psst1, plst1, plat1, plon1, zalt1
167 
168 INTEGER :: iversion, ibugfix
169 INTEGER :: jj,j1
170  CHARACTER(LEN=10) :: yvar ! Name of the prognostic variable (in LFI file)
171  CHARACTER(LEN=100) :: yprefix ! Prefix of the prognostic variable (in LFI file)
172 INTEGER :: iluout ! ascii output unit number
173 INTEGER :: inobs ! number of observations
174 INTEGER :: ilunam
175 LOGICAL :: gfound
176 
177 REAL :: plat0,plon0,prpk,plator,plonor,delx,dely,pbeta,zthres
178 REAL(KIND=JPRB) :: z1s2pi, zpis180
179 
180 LOGICAL, DIMENSION(:), ALLOCATABLE :: ointerp_lst, ointerp_sst
181 LOGICAL, DIMENSION(:), ALLOCATABLE :: ointerp_lst1, ointerp_sst1
182 
183 REAL(KIND=JPRB) :: zhook_handle
184 ! ----------------------------------------------------------------------------------
185 IF (lhook) CALL dr_hook('OI_CONTROL', 0, zhook_handle)
186 
187 print *,'--------------------------------------------------------------------------'
188 print *,'| |'
189 print *,'| ENTER OI_ASSIM |'
190 print *,'| |'
191 print *,'--------------------------------------------------------------------------'
192 
193  CALL open_namelist('ASCII ',ilunam,cnamelist)
194  CALL posnam(ilunam,'NAM_IO_OFFLINE',gfound)
195 IF (gfound) READ (unit=ilunam,nml=nam_io_offline)
196  CALL close_namelist('ASCII ',ilunam)
197 
198 !
199  CALL read_all_namelists(ysc,csurf_filetype,'ALL',.false.)
200 !
201 IF (ldinline) THEN
202 
203  yprogram = 'AROME'
204 #ifdef SFX_ARO
205  igpcomp = min(ngptot, ngptot_cap)
206 
207  nblock = 1
208  nindx1 = 1 + (nblock - 1) * nproma
209  nindx2 = min(nblock * nproma, igpcomp)
210  nkproma = nindx2 - nindx1 + 1
211  ysurfex_aro_cur => ysurfex_aro_all(nblock)
212 #endif
213 
214 ELSE
215 
216  yprogram = 'LFI'
217 
218 ENDIF
219 
220 icurrent_model = 1
221 
222 iluout = 111
223 llkeepextzone = .false.
224 
225 z1s2pi=1.0_jprb/(2.0_jprb*xpi)
226 zpis180=xpi/180.0_jprb
227 
228 ! Update some constants dependant from NACVEG
229 
230 ! scaling of soil moisture increments when assimilation window is different from 6 hours
231 xrscaldw = REAL(nechgu)/6.0_jprb
232 ! half assimilation window in sec
233 nitrad = nechgu*1800
234 
235  CALL ini_data_cover(ysc%DTCO, ysc%U)
236 
237 ! File handling definition
238 
239 IF (.NOT. ldinline) THEN
240 #ifdef SFX_LFI
241  cfilepgd_lfi = 'PGD'
242  cfilein_lfi = 'PREP' ! input PREP file (surface fields)
243  cfilein_lfi_save = cfilein_lfi
244 #endif
245 ENDIF
246 
247 ! Read grid dimension for allocation
248 
249  CALL init_io_surf_n(ysc%DTCO, ysc%DGU, ysc%U, &
250  yprogram,'FULL ','SURF ','READ ')
251 
252 ! Find current time
253 
254  CALL read_surf(&
255  yprogram,'DTCUR',ttime,iresp)
256 
257 ! Time initializations
258 
259 iyear = ttime%TDATE%YEAR
260 imonth = ttime%TDATE%MONTH
261 iday = ttime%TDATE%DAY
262 nsssss = ttime%TIME
263 IF (nsssss > ndaysec) nsssss = nsssss - ndaysec
264 
265 ! Reading grid characteristics to perform nature mask
266 
267  CALL end_io_surf_n(yprogram)
268  CALL set_surfex_filein(yprogram,'PGD ') ! change input file name to pgd name
269  CALL init_io_surf_n(ysc%DTCO, ysc%DGU, ysc%U, &
270  yprogram,'FULL ','SURF ','READ ')
271 
272  CALL read_surf(&
273  yprogram,'SEA ',ysc%U%CSEA ,iresp)
274  CALL read_surf(&
275  yprogram,'WATER ',ysc%U%CWATER ,iresp)
276  CALL read_surf(&
277  yprogram,'NATURE',ysc%U%CNATURE,iresp)
278  CALL read_surf(&
279  yprogram,'TOWN ',ysc%U%CTOWN ,iresp)
280 
281  CALL read_surf(&
282  yprogram,'DIM_FULL ',ysc%U%NDIM_FULL, iresp)
283 nindx2sfx = ysc%U%NDIM_FULL
284  CALL end_io_surf_n(yprogram)
285  CALL init_io_surf_n(ysc%DTCO, ysc%DGU, ysc%U, &
286  yprogram,'FULL ','SURF ','READ ')
287 
288  CALL read_surf(&
289  yprogram,'DIM_SEA ',ysc%U%NDIM_SEA, iresp)
290  CALL read_surf(&
291  yprogram,'DIM_NATURE',ysc%U%NDIM_NATURE,iresp)
292  CALL read_surf(&
293  yprogram,'DIM_WATER ',ysc%U%NDIM_WATER, iresp)
294  CALL read_surf(&
295  yprogram,'DIM_TOWN ',ysc%U%NDIM_TOWN, iresp)
296 
297 ALLOCATE(nwork(ysc%U%NDIM_FULL))
298 ALLOCATE(xwork(ysc%U%NDIM_FULL))
299 ALLOCATE(nwork2(ysc%U%NDIM_FULL,10))
300 ALLOCATE(xwork2(ysc%U%NDIM_FULL,10))
301 ALLOCATE(xwork3(ysc%U%NDIM_FULL,10,10))
302 IF (nrank==npio) THEN
303  ALLOCATE(nwork_full(ysc%U%NDIM_FULL))
304  ALLOCATE(xwork_full(ysc%U%NDIM_FULL))
305  ALLOCATE(nwork2_full(ysc%U%NDIM_FULL,10))
306  ALLOCATE(xwork2_full(ysc%U%NDIM_FULL,10))
307 ELSE
308  ALLOCATE(nwork_full(0))
309  ALLOCATE(xwork_full(0))
310  ALLOCATE(nwork2_full(0,0))
311  ALLOCATE(xwork2_full(0,0))
312 ENDIF
313 !
314 ! Get total dimension of domain (excluding extension zone)
315 
316  CALL get_size_full_n(ysc%U, &
317  yprogram,ysc%U%NDIM_FULL,ysc%U%NSIZE_FULL)
318 
319 IF (ldinline) THEN
320  isize = ysc%U%NSIZE_FULL
321 ELSE
322  isize = ysc%U%NDIM_FULL
323 ENDIF
324 
325 ALLOCATE (psab(isize))
326 ALLOCATE (parg(isize))
327 ALLOCATE (zalt(isize))
328 
329  CALL read_surf(&
330  yprogram,'SAND', psab, iresp)
331  CALL read_surf(&
332  yprogram,'CLAY', parg, iresp)
333  CALL read_surf(&
334  yprogram,'ZS', zalt, iresp)
335 
336  CALL read_cover_n(ysc%DTCO, ysc%U, &
337  yprogram)
338 
339 ! Perform masks (only nature used)
340 
341 ALLOCATE(ysc%U%XSEA (isize))
342 ALLOCATE(ysc%U%XNATURE(isize))
343 ALLOCATE(ysc%U%XWATER (isize))
344 ALLOCATE(ysc%U%XTOWN (isize))
345 
346  CALL convert_cover_frac(ysc%DTCO, &
347  ysc%U%XCOVER,ysc%U%LCOVER,ysc%U%XSEA,ysc%U%XNATURE,ysc%U%XTOWN,ysc%U%XWATER)
348 
349 ysc%U%NSIZE_NATURE = count(ysc%U%XNATURE(:) > 0.0)
350 ysc%U%NSIZE_TOWN = count(ysc%U%XTOWN(:) > 0.0)
351 ysc%U%NSIZE_WATER = count(ysc%U%XWATER(:) > 0.0)
352 ysc%U%NSIZE_SEA = count(ysc%U%XSEA(:) > 0.0)
353 
354 ALLOCATE(ysc%U%NR_NATURE (ysc%U%NSIZE_NATURE))
355 ALLOCATE(ysc%U%NR_TOWN (ysc%U%NSIZE_TOWN ))
356 ALLOCATE(ysc%U%NR_WATER (ysc%U%NSIZE_WATER ))
357 ALLOCATE(ysc%U%NR_SEA (ysc%U%NSIZE_SEA ))
358 
359  CALL get_1d_mask( ysc%U%NSIZE_SEA, isize, ysc%U%XSEA , ysc%U%NR_SEA )
360  CALL get_1d_mask( ysc%U%NSIZE_WATER, isize, ysc%U%XWATER , ysc%U%NR_WATER )
361  CALL get_1d_mask( ysc%U%NSIZE_TOWN, isize, ysc%U%XTOWN , ysc%U%NR_TOWN )
362  CALL get_1d_mask( ysc%U%NSIZE_NATURE, isize, ysc%U%XNATURE, ysc%U%NR_NATURE)
363 
364 ! Allocate arrays
365 
366 ysc%IM%I%NPATCH = 1
367 
368 ALLOCATE (pws(isize,1))
369 ALLOCATE (pwp(isize,1))
370 ALLOCATE (pts(isize,1))
371 ALLOCATE (ptp(isize,1))
372 ALLOCATE (ptl(isize,1))
373 ALLOCATE (psst(isize))
374 ALLOCATE (psns(isize,1))
375 ALLOCATE (plai(isize,1))
376 ALLOCATE (pveg(isize,1))
377 ALLOCATE (prsmin(isize,1))
378 ALLOCATE (pd2(isize,1))
379 ALLOCATE (ptcls(isize))
380 ALLOCATE (phcls(isize))
381 ALLOCATE (pucls(isize))
382 ALLOCATE (pvcls(isize))
383 ALLOCATE (pevap(isize))
384 ALLOCATE (plst(isize))
385 ALLOCATE (ptrd3(isize))
386 
387 ALLOCATE (ointerp_lst(isize))
388 ALLOCATE (ointerp_sst(isize))
389 ALLOCATE (zlst(isize))
390 ALLOCATE (zsst(isize))
391 
392 ! Read prognostic variables
393 
394  CALL end_io_surf_n(yprogram)
395  CALL set_surfex_filein(yprogram,'PREP') ! change input file name to pgd name
396  CALL init_io_surf_n(ysc%DTCO, ysc%DGU, ysc%U, &
397  yprogram,'FULL ','SURF ','READ ')
398 
399 IF (ysc%U%NSIZE_NATURE>0 .AND. ysc%U%CNATURE/='NONE') THEN
400  CALL read_surf(&
401  yprogram,'WG1', pws, iresp)
402  CALL read_surf(&
403  yprogram,'WG2', pwp, iresp)
404  CALL read_surf(&
405  yprogram,'TG1', pts, iresp)
406  CALL read_surf(&
407  yprogram,'TG2', ptp, iresp)
408  CALL read_surf(&
409  yprogram,'WGI2', ptl, iresp)
410 
411  CALL read_surf(&
412  yprogram,'VERSION',iversion,iresp)
413  CALL read_surf(&
414  yprogram,'BUG',ibugfix,iresp)
415  IF (iversion>7 .OR. iversion==7 .AND. ibugfix>=3) THEN
416  CALL read_surf(&
417  yprogram,'WSN_VEG1',psns, iresp)
418  ELSE
419  CALL read_surf(&
420  yprogram,'WSNOW_VEG1',psns, iresp)
421  ENDIF
422 ENDIF
423 
424 IF (ysc%U%NSIZE_SEA>0 .AND. ysc%U%CSEA/='NONE') THEN
425  CALL read_surf(&
426  yprogram,'SST', psst, iresp)
427 ENDIF
428 
429 IF (ysc%U%NSIZE_WATER>0 .AND. ysc%U%CWATER/='NONE') THEN
430  CALL read_surf(&
431  yprogram,'TS_WATER', plst, iresp)
432 ENDIF
433 
434 IF (ysc%U%NSIZE_TOWN>0 .AND. ysc%U%CTOWN/='NONE' .AND. larome) THEN
435  CALL read_surf(&
436  yprogram,'VERSION',iversion,iresp)
437  CALL read_surf(&
438  yprogram,'BUG',ibugfix,iresp)
439  IF (iversion>7 .OR. iversion==7 .AND. ibugfix>=3) THEN
440  CALL read_surf(&
441  yprogram,'TROAD3', ptrd3, iresp)
442  ELSE
443  CALL read_surf(&
444  yprogram,'T_ROAD3', ptrd3, iresp)
445  ENDIF
446 ELSE
447  ptrd3(:) = xundef
448 ENDIF
449 
450  CALL read_surf(&
451  yprogram,'T2M', ptcls, iresp)
452  CALL read_surf(&
453  yprogram,'HU2M', phcls, iresp)
454 
455 ! Read constant surface fields
456 
457  CALL read_surf(&
458  yprogram,'RSMIN', prsmin,iresp)
459  CALL read_surf(&
460  yprogram,'DG2', pd2, iresp)
461  CALL read_surf(&
462  yprogram,'LAI', plai, iresp)
463  CALL read_surf(&
464  yprogram,'VEG', pveg, iresp)
465 
466 IF (nprintlev>0) THEN
467  jj = ysc%U%NR_NATURE(1)
468  print *,'value in PREP file => WG1 ',pws(jj,1)
469  print *,'value in PREP file => WG2 ',pwp(jj,1)
470  print *,'value in PREP file => TG1 ',pts(jj,1)
471  print *,'value in PREP file => TG2 ',ptp(jj,1)
472  print *,'value in PREP file => WGI2 ',ptl(jj,1)
473  print *,'value in PREP file => WSNOW_VEG1',psns(jj,1)
474  print *,'value in PREP file => SST ',psst(jj)
475  print *,'value in PREP file => LAI ',plai(jj,1)
476  print *,'value in PREP file => VEG ',pveg(jj,1)
477  print *,'value in PREP file => RSMIN ',prsmin(jj,1)
478  print *,'value in PREP file => DATA_DG2 ',pd2(jj,1)
479  print *,'value in PREP file => SAND ',psab(jj)
480  print *,'value in PREP file => CLAY ',parg(jj)
481  print *,'value in PREP file => ZS ',zalt(jj)
482 ENDIF
483 
484  CALL end_io_surf_n(yprogram)
485  CALL io_buff_clean
486 
487 ! Interface (allocate arrays)
488 
489 ALLOCATE (plat(isize))
490 ALLOCATE (plon(isize))
491 ALLOCATE (zpx(isize))
492 ALLOCATE (zpy(isize))
493 ALLOCATE (pevaptr(isize))
494 ALLOCATE (zwp(isize))
495 ALLOCATE (zws(isize))
496 ALLOCATE (ztl(isize))
497 ALLOCATE (zts(isize))
498 ALLOCATE (ztp(isize))
499 ALLOCATE (zsns(isize))
500 ALLOCATE (ztcls(isize))
501 ALLOCATE (zhcls(isize))
502 ALLOCATE (zucls(isize))
503 ALLOCATE (zvcls(isize))
504 ALLOCATE (psstc(isize))
505 ALLOCATE (pwpinc1(isize))
506 ALLOCATE (pwpinc2(isize))
507 ALLOCATE (pwpinc3(isize))
508 ALLOCATE (pt2mbias(isize))
509 ALLOCATE (ph2mbias(isize))
510 ALLOCATE (prrcn(isize))
511 ALLOCATE (prrcl(isize))
512 ALLOCATE (prrsn(isize))
513 ALLOCATE (prrsl(isize))
514 ALLOCATE (patmneb(isize))
515 ALLOCATE (pitm(isize))
516 ALLOCATE (palbf(isize))
517 ALLOCATE (pemisf(isize))
518 ALLOCATE (pz0f(isize))
519 ALLOCATE (piveg(isize))
520 ALLOCATE (pz0h(isize))
521 ALLOCATE (ptsc(isize))
522 ALLOCATE (ptpc(isize))
523 ALLOCATE (pwsc(isize))
524 ALLOCATE (pwpc(isize))
525 ALLOCATE (psnc(isize))
526 ALLOCATE (zevap(isize))
527 ALLOCATE (zevaptr(isize))
528 ALLOCATE (pgelat(isize))
529 ALLOCATE (pgelam(isize))
530 ALLOCATE (pgemu(isize))
531 ALLOCATE (pt2m_o(isize))
532 ALLOCATE (phu2m_o(isize))
533 ALLOCATE (pts_o(isize))
534 ALLOCATE (psm_o(isize))
535 ALLOCATE (psig_smo(isize))
536 ALLOCATE (plsm_o(isize))
537 ALLOCATE (pws_o(isize))
538 ALLOCATE (zwginc(isize))
539 
540 IF (.NOT. ldinline) THEN
541 
542 ! Read atmospheric forecast fields from FA files
543 #ifdef SFX_FA
544  cfilein_fa = 'FG_OI_MAIN' ! input forecast
545  cfilein_fa_save = cfilein_fa
546 #endif
547 ! Open FA file (LAM version with extension zone)
548  CALL init_io_surf_n(ysc%DTCO, ysc%DGU, ysc%U, &
549  yprogram2,'EXTZON','SURF ','READ ')
550 ENDIF
551 
552 ! Read model forecast quantities
553 
554 IF (larome) THEN
555  IF (ldinline) THEN
556  prrsl(:) = p__surfaccpluie(1:isize)
557  prrsn(:) = p__surfaccneige(1:isize)
558  prrcn(:) = p__surfaccgraupel(1:isize)
559  ELSE
560  CALL read_surf(&
561  yprogram2,'SURFACCPLUIE', prrsl ,iresp)
562  CALL read_surf(&
563  yprogram2,'SURFACCNEIGE', prrsn ,iresp)
564  CALL read_surf(&
565  yprogram2,'SURFACCGRAUPEL', prrcn ,iresp)
566  ENDIF
567  prrcl(:) = 0.0
568 ! CALL READ_SURF(YPROGRAM2,'SURFIND.VEG.DOMI',PIVEG ,IRESP)
569  piveg(:) = 0.0
570 ELSE
571  IF (ldinline) THEN
572  prrcl(:) = p__surfprec_eau_con(1:isize)
573  prrsl(:) = p__surfprec_eau_gec(1:isize)
574  prrcn(:) = p__surfprec_nei_con(1:isize)
575  prrsn(:) = p__surfprec_nei_gec(1:isize)
576  ELSE
577  CALL read_surf(&
578  yprogram2,'SURFPREC.EAU.CON',prrcl ,iresp)
579  CALL read_surf(&
580  yprogram2,'SURFPREC.EAU.GEC',prrsl ,iresp)
581  CALL read_surf(&
582  yprogram2,'SURFPREC.NEI.CON',prrcn ,iresp)
583  CALL read_surf(&
584  yprogram2,'SURFPREC.NEI.GEC',prrsn ,iresp)
585  ENDIF
586  piveg(:) = 0.0
587 ENDIF
588 IF (ldinline) THEN
589  patmneb(:) = p__atmonebul_basse(1:isize)
590  pitm(:) = p__surfind_terremer(1:isize)
591  pevap(:) = p__surfflu_lat_meva(1:isize)
592 ELSE
593  CALL read_surf(&
594  yprogram2,'ATMONEBUL.BASSE ',patmneb,iresp)
595  CALL read_surf(&
596  yprogram2,'SURFIND.TERREMER',pitm ,iresp)
597  CALL read_surf(&
598  yprogram2,'SURFFLU.LAT.MEVA',pevap ,iresp) ! accumulated fluxes (not available in LFI)
599 ENDIF
600 IF (.NOT.laladsurf) THEN
601  IF (ldinline) THEN
602  pevaptr(:) = p__surfxevapotransp(1:isize)
603  ELSE
604  CALL read_surf(&
605  yprogram2,'SURFXEVAPOTRANSP',pevaptr,iresp) ! not in ALADIN SURFEX
606  ENDIF
607 ELSE
608  pevaptr(:) = 0.0
609 ENDIF
610 
611 IF (.NOT. ldinline) THEN
612 ! Close FA file
613  CALL end_io_surf_n(yprogram2)
614  CALL io_buff_clean
615  print *,'READ FG_OI_MAIN OK'
616 ENDIF
617 
618 IF (.NOT. ldinline) THEN
619 ! Define FA file name for CANARI analysis
620 #ifdef SFX_FA
621  cfilein_fa = 'CANARI' ! input CANARI analysis
622  cfilein_fa_save = cfilein_fa
623 #endif
624 ! Open FA file
625  CALL init_io_surf_n(ysc%DTCO, ysc%DGU, ysc%U, &
626  yprogram2,'EXTZON','SURF ','READ ')
627 ENDIF
628 
629 IF (ldinline) THEN
630  pt2m_o(:) = p__clstemperature(1:isize)
631  phu2m_o(:) = p__clshumi_relative(1:isize)
632  pts_o(:) = p__surftemperature(1:isize)
633  pucls(:) = p__clsvent_zonal(1:isize)
634  pvcls(:) = p__clsvent_meridien(1:isize)
635 ELSE
636 ! Read CANARI analysis
637  CALL read_surf(&
638  yprogram2,'CLSTEMPERATURE ',pt2m_o ,iresp)
639  CALL read_surf(&
640  yprogram2,'CLSHUMI.RELATIVE',phu2m_o,iresp)
641  CALL read_surf(&
642  yprogram2,'SURFTEMPERATURE ',pts_o ,iresp)
643  CALL read_surf(&
644  yprogram2,'CLSVENT.ZONAL ',pucls ,iresp)
645  CALL read_surf(&
646  yprogram2,'CLSVENT.MERIDIEN',pvcls ,iresp)
647 ENDIF
648 
649 IF (.NOT. ldinline) THEN
650 ! Close CANARI file
651  CALL end_io_surf_n(yprogram2)
652  CALL io_buff_clean
653  print *,'READ CANARI OK'
654 ENDIF
655 
656 ! Read ASCAT SM observations (in percent)
657 
658 inobs = 0
659 IF (lobswg) THEN
660  OPEN(unit=111,file='ASCAT_SM.DAT')
661  DO jj=1,ysc%U%NDIM_FULL
662  READ(111,*,end=990) psm_o(jj),psig_smo(jj),plsm_o(jj)
663  IF (plsm_o(jj) < 1.0) psm_o(jj) = 999.0 ! data rejection if not on land
664  IF (psig_smo(jj) > xsigwgo_max) psm_o(jj) = 999.0 ! data rejection of error too large
665  IF (psm_o(jj) /= 999.0) inobs = inobs + 1
666  ENDDO
667 990 CONTINUE
668  CLOSE(unit=111)
669  print *,'READ ASCAT SM OK'
670 ELSE
671  psm_o(:) = 999.0
672  psig_smo(:) = 999.0
673  plsm_o(:) = 0.0
674 ENDIF
675 print *,' NUMBER OF ASCAT OBSERVATIONS AFTER INITIAL CHECKS :: ',inobs
676 inobs = 0
677 
678 ! Perform bias correction of SM observations
679 
680  CALL oi_bc_soil_moisture(isize,psm_o,psab,pws_o)
681 
682 IF (.NOT. ldinline) THEN
683 ! Define FA file name for surface climatology
684 #ifdef SFX_FA
685  cfilein_fa = 'clim_isba' ! input climatology
686  cfilein_fa_save = cfilein_fa
687  cdnomc = 'climat' ! new frame name
688 #endif
689 ! Open FA file
690  CALL init_io_surf_n(ysc%DTCO, ysc%DGU, ysc%U, &
691  yprogram2,'EXTZON','SURF ','READ ')
692 ENDIF
693 
694 IF (ldinline) THEN
695  psnc(:) = p__surfreserv_neige(1:isize)
696 ELSE
697 ! Read climatology file (snow water equivalent)
698  CALL read_surf(&
699  yprogram2,'SURFRESERV.NEIGE',psnc ,iresp)
700 ENDIF
701 
702 IF (.NOT. ldinline) THEN
703 ! Close climatology file
704  CALL end_io_surf_n(yprogram2)
705  CALL io_buff_clean
706  print *,'READ CLIMATOLOGY OK'
707 ENDIF
708 
709 IF (.NOT. ldinline) THEN
710 #ifdef SFX_FA
711  plat0 = pelat0
712  plon0 = pelon0
713  plator = pelat1
714  plonor = pelon1
715  prpk = perpk
716  pbeta = pebeta
717  delx = pedelx
718  dely = pedely
719  IF (plonor > 180.0) plonor = plonor - 360.0
720  IF (plon0 > 180.0) plon0 = plon0 - 360.0
721  DO jj=1,ndgux
722  DO j1=1,ndlux
723  zpx((jj-1)*ndlux + j1) = delx*REAL(j1-1)
724  zpy((jj-1)*ndlux + j1) = dely*REAL(jj-1)
725  ENDDO
726  ENDDO
727 #endif
728  CALL oi_latlon_conf_proj(isize,plat0,plon0,prpk,pbeta,plator,plonor,zpx,zpy,plat,plon)
729 ELSE
730  plat(:) = p__lat(1:isize)
731  plon(:) = p__lon(1:isize)
732 ENDIF
733 
734 ! Allocate arrays to produce analysis increments
735 
736 ALLOCATE (zt2inc(isize))
737 ALLOCATE (zh2inc(isize))
738 ALLOCATE (zwsinc(isize))
739 ALLOCATE (zwpinc(isize))
740 ALLOCATE (ztlinc(isize))
741 ALLOCATE (ztsinc(isize))
742 ALLOCATE (ztpinc(isize))
743 ALLOCATE (zsninc(isize))
744 
745 ! Screen-level innovations
746 
747 zt2inc(:) = pt2m_o(:) - ptcls(:)
748 zh2inc(:) = phu2m_o(:) - phcls(:)
749 
750 ! Threshold for background check
751 
752 zthres=xrthr_qc*sqrt(xsigwgo**2 + xsigwgb**2)
753 
754 ! Superficial soil moisture innovations in (m3/m3)
755 
756 DO jj = 1, isize
757  IF (pws_o(jj) /= 999.0) THEN
758  zwginc(jj) = pws_o(jj) - pws(jj,1)
759  IF (abs(zwginc(jj)) > zthres) THEN
760  zwginc(jj) = 0.0 ! background check
761  ELSE
762  inobs = inobs + 1
763  ENDIF
764  ELSE
765  zwginc(jj) = 0.0
766  ENDIF
767 ENDDO
768 print *,' NUMBER OF ASCAT OBSERVATIONS AFTER BACKGROUND CHECK :: ',inobs
769 
770 ! Interface (define arrays and perform unit conversions)
771 
772 parg(:) = parg(:)*100.0
773 psab(:) = psab(:)*100.0
774 
775 zws(:) = xundef
776 zwp(:) = xundef
777 ztl(:) = xundef
778 
779 WHERE (pws(:,1)/=xundef)
780  zws(:) = pws(:,1)*xrd1*xrholw ! conversion of m3/m3 -> mm
781  zwp(:) = pwp(:,1)*pd2(:,1)*xrholw ! conversion of m3/m3 -> mm
782  ztl(:) = ptl(:,1)*pd2(:,1)*xrholw ! conversion of m3/m3 -> mm
783 END WHERE
784 
785 ztcls(:) = ptcls(:)
786 zhcls(:) = phcls(:)
787 zucls(:) = pucls(:)
788 zvcls(:) = pvcls(:)
789 psstc(:) = pts_o(:)
790 pwpinc1(:) = xundef
791 pwpinc2(:) = xundef
792 pwpinc3(:) = xundef
793 pt2mbias(:) = xundef
794 ph2mbias(:) = xundef
795 
796 ! Sea-ice surface properties
797 
798 palbf(:) = xundef
799 pemisf(:) = xundef
800 pz0f(:) = xundef
801 pz0h(:) = xundef
802 
803 ! Climatological arrays set to missing values
804 
805 psnc(:) = psns(:,1) ! need to read the snow climatology
806 pwsc(:) = xundef
807 pwpc(:) = xundef
808 ptsc(:) = xundef
809 ptpc(:) = xundef
810 
811 DO jj = 1, isize
812  pgelat(jj) = plat(jj)
813  pgelam(jj) = plon(jj)
814  pgemu(jj) = sin(plat(jj)*zpis180)
815 ENDDO
816 
817 zevap(:) = (pevap(:)/xlvtt*xday)/(nechgu*3600.) ! conversion W/m2 -> mm/day
818 zevaptr(:) = pevaptr(:)*xday
819 zsns(:) = psns(:,1)
820 
821 DO jj = 1, isize
822  zts(jj) = pts(jj,1)
823  ztp(jj) = ptp(jj,1)
824 ENDDO
825 
826 idat = iyear*10000. + imonth*100. + iday
827 
828 IF (ldinline) THEN
829 ! Avoid division by zero in next WHERE statement;
830 ! this may occur in the extension zone
831  WHERE (ld_maskext(1:isize))
832  pd2(:,1) = 1.0
833  zt2inc(:) = 0.0_jprb
834  zh2inc(:) = 0.0_jprb
835  END WHERE
836 ENDIF
837 
838 print *,' '
839 print *,'Mean T2m increments ',sum(zt2inc)/ysc%U%NDIM_FULL
840 print *,'Mean HU2m increments ',sum(zh2inc)/ysc%U%NDIM_FULL
841 print *,' '
842 
843 ! Soil analysis based on optimal interpolation
844 
845  CALL oi_cacsts(isize,zt2inc,zh2inc,zwginc,pws_o, &
846  idat,nsssss, &
847  ztp,zwp,ztl,zsns,zts,zws, &
848  ztcls,zhcls,zucls,zvcls,psstc,pwpinc1,pwpinc2,pwpinc3, &
849  pt2mbias,ph2mbias, &
850  prrcl,prrsl,prrcn,prrsn,patmneb,zevap,zevaptr, &
851  pitm,pveg(:,1),palbf,pemisf,pz0f, &
852  piveg,parg,pd2(:,1),psab,plai(:,1),prsmin(:,1),pz0h, &
853  ptsc,ptpc,pwsc,pwpc,psnc, &
854  pgelat,pgelam,pgemu)
855 
856 ! Store increments
857 
858 zwsinc(:) = 0.0_jprb
859 zwpinc(:) = 0.0_jprb
860 ztlinc(:) = 0.0_jprb
861 zsninc(:) = 0.0_jprb
862 
863 WHERE (pws(:,1)/=xundef)
864  zwsinc(:) = zws(:) - pws(:,1)*(xrd1*xrholw)
865  zwpinc(:) = zwp(:) - pwp(:,1)*(pd2(:,1)*xrholw)
866  ztlinc(:) = ztl(:) - ptl(:,1)*(pd2(:,1)*xrholw)
867  zsninc(:) = zsns(:) - psns(:,1)
868 END WHERE
869 
870 IF (ldinline) THEN
871 ! Avoid division by zero in next WHERE statement;
872 ! this may occur in the extension zone
873  WHERE (ld_maskext(1:isize))
874  pd2(:,1) = 1.0
875  END WHERE
876 ENDIF
877 
878 ! Define soil moiture analyses over NATURE points
879 
880 WHERE (pws(:,1)/=xundef)
881  pws(:,1) = zws(:)/(xrd1*xrholw)
882  pwp(:,1) = zwp(:)/(pd2(:,1)*xrholw)
883  ptl(:,1) = ztl(:)/(pd2(:,1)*xrholw)
884  psns(:,1) = zsns(:)
885 END WHERE
886 
887 ! Perform temperature analysis according to surface types
888 
889 ointerp_lst(:) = .false.
890 ointerp_sst(:) = .false.
891 
892 ztsinc(:) = 0.0_jprb
893 ztpinc(:) = 0.0_jprb
894 
895 ! a) Temperature analysis of NATURE points
896 
897 WHERE (pts(:,1)/=xundef)
898  ztsinc(:) = zts(:) - pts(:,1)
899  ztpinc(:) = ztp(:) - ptp(:,1)
900  pts(:,1) = zts(:)
901  ptp(:,1) = ztp(:)
902 END WHERE
903 
904 ! b) Temperature analysis of SEA and LAKE points
905 
906 DO jj = 1, isize
907  IF (pitm(jj) < 0.5_jprb) THEN
908  IF (psst(jj)/=xundef) THEN
909  ztsinc(jj) = pts_o(jj) - psst(jj)
910  psst(jj) = pts_o(jj) ! canari
911  ENDIF
912  IF (plst(jj)/=xundef) THEN
913  plst(jj) = pts_o(jj) ! canari
914  ENDIF
915  ELSE
916  IF (psst(jj)/=xundef) THEN
917  psst(jj) = xundef
918  ointerp_sst(jj) = .true.
919  ENDIF
920  IF (plst(jj)/=xundef) THEN
921  plst(jj) = xundef
922  ointerp_lst(jj) = .true.
923  ENDIF
924  ENDIF
925 ENDDO
926 
927 ! c) Temperature analysis of TOWN points
928 
929 WHERE (ptrd3(:)/=xundef)
930  ptrd3(:) = ptrd3(:) + zt2inc(:)*z1s2pi
931 END WHERE
932 
933 ! Search for the nearest grid point values for lake and sea points
934 ! at locations where the water fraction is less than 50 %
935 ! and therefore no useful information is given from the SST analysis
936 ! A standard temperature gradient is applied to account for the atitude differences
937 
938 IF (ldinline) THEN
939 
940  IF (llkeepextzone) THEN
941 
942  zlst(:) = plst(:)
943 
944  IF (ldinline) THEN
945  WHERE (ld_maskext(1:isize))
946  zlst = xundef
947  END WHERE
948  ENDIF
949 
950  CALL oi_hor_extrapol_surf(isize,plat,plon,zlst,plat,plon,plst,ointerp_lst,zalt)
951 
952  zsst(:) = psst(:)
953 
954  IF (ldinline) THEN
955  WHERE (ld_maskext(1:isize))
956  zsst = xundef
957  END WHERE
958  ENDIF
959 
960  CALL oi_hor_extrapol_surf(isize,plat,plon,zsst,plat,plon,psst,ointerp_sst,zalt)
961 
962  ELSE
963 
964  isize1 = count(.NOT. ld_maskext)
965 
966  ALLOCATE (psst1(isize1), plst1(isize1), zsst1(isize1), zlst1(isize1), plat1(isize1), &
967  & plon1(isize1), zalt1(isize1), ointerp_lst1(isize1), ointerp_sst1(isize1))
968 
969  ! remove extension zone
970  jj = 1
971  DO j1 = 1, isize
972  IF (.NOT. ld_maskext(j1)) THEN
973  psst1(jj) = psst(j1)
974  plst1(jj) = plst(j1)
975  plat1(jj) = plat(j1)
976  plon1(jj) = plon(j1)
977  zalt1(jj) = zalt(j1)
978  ointerp_lst1(jj) = ointerp_lst(j1)
979  ointerp_sst1(jj) = ointerp_sst(j1)
980  jj = jj + 1
981  ENDIF
982  ENDDO
983 
984  zlst1(:) = plst1(:)
985  CALL oi_hor_extrapol_surf(isize1,plat1,plon1,zlst1,plat1,plon1,plst1,ointerp_lst1,zalt1)
986 
987  zsst1(:) = psst1(:)
988  CALL oi_hor_extrapol_surf(isize1,plat1,plon1,zsst1,plat1,plon1,psst1,ointerp_sst1,zalt1)
989 
990  ! copy back
991  jj = 1
992  DO j1 = 1, isize
993  IF (.NOT. ld_maskext(j1)) THEN
994  psst(j1) = psst1(jj)
995  plst(j1) = plst1(jj)
996  jj = jj + 1
997  ENDIF
998  ENDDO
999 
1000  DEALLOCATE (psst1, plst1, zsst1, zlst1, plat1, plon1, &
1001  & zalt1, ointerp_lst1, ointerp_sst1)
1002 
1003  ENDIF
1004 
1005 ELSE
1006 
1007  zlst(:) = plst(:)
1008  CALL oi_hor_extrapol_surf(isize,plat,plon,zlst,plat,plon,plst,ointerp_lst,zalt)
1009 
1010  zsst(:) = psst(:)
1011  CALL oi_hor_extrapol_surf(isize,plat,plon,zsst,plat,plon,psst,ointerp_sst,zalt)
1012 
1013 ENDIF
1014 
1015 ! PRINT values produced by OI_HO_EXTRAPOL_SURF
1016 
1017 IF (nprintlev>0) THEN
1018  DO jj = 1, isize
1019  IF (ointerp_lst(jj)) THEN
1020  print *,'Lake surface temperature set to ',plst(jj),'from nearest neighbour at J=',jj
1021  ENDIF
1022  IF (ointerp_sst(jj)) THEN
1023  print *,'Sea surface temperature set to ',psst(jj),'from nearest neighbour at J=',jj
1024  ENDIF
1025  ENDDO
1026 ENDIF
1027 
1028 ! PRINT statistics of the soil analysis
1029 
1030 print *,'---------------------------------------------------------------'
1031 print *,'Mean WS increments over NATURE ',sum(zwsinc,ysc%U%XNATURE > 0.)/ysc%U%NDIM_NATURE
1032 print *,'Mean WP increments over NATURE ',sum(zwpinc,ysc%U%XNATURE > 0.)/ysc%U%NDIM_NATURE
1033 print *,'Mean TS increments over NATURE ',sum(ztsinc,ysc%U%XNATURE > 0.)/ysc%U%NDIM_NATURE
1034 print *,'Mean TP increments over NATURE ',sum(ztpinc,ysc%U%XNATURE > 0.)/ysc%U%NDIM_NATURE
1035 print *,'Mean TL increments over NATURE ',sum(ztlinc,ysc%U%XNATURE > 0.)/ysc%U%NDIM_NATURE
1036 print *,'Mean SN increments over NATURE ',sum(zsninc,ysc%U%XNATURE > 0.)/ysc%U%NDIM_NATURE
1037 print *,'---------------------------------------------------------------'
1038 print *,'Mean WS increments over SEA ',sum(zwsinc,ysc%U%XSEA > 0.)/ysc%U%NDIM_SEA
1039 print *,'Mean WP increments over SEA ',sum(zwpinc,ysc%U%XSEA > 0.)/ysc%U%NDIM_SEA
1040 print *,'Mean TS increments over SEA ',sum(ztsinc,ysc%U%XSEA > 0.)/ysc%U%NDIM_SEA
1041 print *,'Mean TP increments over SEA ',sum(ztpinc,ysc%U%XSEA > 0.)/ysc%U%NDIM_SEA
1042 print *,'Mean TL increments over SEA ',sum(ztlinc,ysc%U%XSEA > 0.)/ysc%U%NDIM_SEA
1043 print *,'Mean SN increments over SEA ',sum(zsninc,ysc%U%XSEA > 0.)/ysc%U%NDIM_SEA
1044 print *,'---------------------------------------------------------------'
1045 
1046 IF (.NOT. ldinline) THEN
1047 ! Write analysis in LFI file PREP
1048 #ifdef SFX_LFI
1049  cfileout_lfi='PREP'
1050 #endif
1051 ENDIF
1052 
1053  CALL flag_update(ysc%IM%DGI, ysc%DGU, &
1054  .false.,.false.,.true.,.false.)
1055  CALL init_io_surf_n(ysc%DTCO, ysc%DGU, ysc%U, &
1056  yprogram,'FULL ','SURF ','WRITE')
1057 
1058 IF (ldinline) THEN
1059 #ifdef SFX_ARO
1060 ! Count 2D fields in MSE
1061 ! NINDX1, NINDX2, NKPROMA already set
1062  CALL surfex_field_buf_set_record(ysurfex_cache_out, .false.)
1063 
1064  CALL WRITE
1065 
1066  CALL surfex_field_buf_prealloc(ysurfex_cache_out)
1067  CALL surfex_field_buf_set_record(ysurfex_cache_out, .true.)
1068 
1069 #endif
1070 
1071 ENDIF
1072 
1073  CALL WRITE
1074 
1075  CALL end_io_surf_n(yprogram)
1076  CALL io_buff_clean
1077 
1078 DEALLOCATE(nwork)
1079 DEALLOCATE(xwork)
1080 DEALLOCATE(nwork2)
1081 DEALLOCATE(xwork2)
1082 DEALLOCATE(xwork3)
1083 DEALLOCATE(nwork_full)
1084 DEALLOCATE(xwork_full)
1085 DEALLOCATE(nwork2_full)
1086 DEALLOCATE(xwork2_full)
1087 
1088 IF (.NOT. ldinline) THEN
1089  print *,'after write in PREP file'
1090 ENDIF
1091 
1092 ! -------------------------------------------------------------------------------------
1093 IF (lhook) CALL dr_hook('OI_CONTROL', 1, zhook_handle)
1094 
1095  CONTAINS
1096 
1097 SUBROUTINE write
1098 
1099 REAL(KIND=JPRB) :: zhook_handle
1100 
1101 IF (lhook) CALL dr_hook('OI_CONTROL:WRITE', 0, zhook_handle)
1102 
1103  CALL dd('WG1', pws(:,1))
1104 
1105 yvar='WG1'
1106 yprefix='X_Y_WG1 (m3/m3) '
1107  CALL write_surf(ysc%DGU, ysc%U, &
1108  yprogram,yvar,pws,iresp,hcomment=yprefix)
1109 
1110  CALL dd('WG2', pwp(:,1))
1111 
1112 yvar='WG2'
1113 yprefix='X_Y_WG2 (m3/m3) '
1114  CALL write_surf(ysc%DGU, ysc%U, &
1115  yprogram,yvar,pwp,iresp,hcomment=yprefix)
1116 
1117  CALL dd('WGI2', ptl(:,1))
1118 
1119 yvar='WGI2'
1120 yprefix='X_Y_WGI2 (m3/m3) '
1121  CALL write_surf(ysc%DGU, ysc%U, &
1122  yprogram,yvar,ptl,iresp,hcomment=yprefix)
1123 
1124  CALL dd('TG1', pts(:,1))
1125 
1126 yvar='TG1'
1127 yprefix='X_Y_TG1 (K) '
1128  CALL write_surf(ysc%DGU, ysc%U, &
1129  yprogram,yvar,pts,iresp,hcomment=yprefix)
1130 
1131  CALL dd('TG2', ptp(:,1))
1132 
1133 yvar='TG2'
1134 yprefix='X_Y_TG2 (K) '
1135  CALL write_surf(ysc%DGU, ysc%U, &
1136  yprogram,yvar,ptp,iresp,hcomment=yprefix)
1137 
1138  CALL dd('SST', psst)
1139 
1140 yvar='SST'
1141 yprefix='X_Y_SST (K) '
1142  CALL write_surf(ysc%DGU, ysc%U, &
1143  yprogram,yvar,psst,iresp,hcomment=yprefix)
1144 
1145  CALL dd('TS_WATER', plst)
1146 
1147 yvar='TS_WATER'
1148 yprefix='X_Y_TS_WATER (K) '
1149  CALL write_surf(ysc%DGU, ysc%U, &
1150  yprogram,yvar,plst,iresp,hcomment=yprefix)
1151 
1152 IF (ysc%U%NSIZE_TOWN > 0 .AND. larome) THEN
1153  CALL dd('T_ROAD3', ptrd3)
1154 
1155  yvar='TROAD3'
1156  yprefix='X_Y_T_ROAD3 (K) '
1157  CALL write_surf(ysc%DGU, ysc%U, &
1158  yprogram,yvar,ptrd3,iresp,hcomment=yprefix)
1159 ENDIF
1160 
1161  CALL dd('WSNOW_VEG1', psns(:,1))
1162 
1163 yvar='WSN_VEG1'
1164 yprefix='X_Y_WSNOW_VEG1 (kg/m2) '
1165  CALL write_surf(ysc%DGU, ysc%U, &
1166  yprogram,yvar,psns,iresp,hcomment=yprefix)
1167 
1168 IF (lhook) CALL dr_hook('OI_CONTROL:WRITE', 1, zhook_handle)
1169 
1170 END SUBROUTINE write
1171 
1172 SUBROUTINE dd (CDN, PX)
1173  CHARACTER(LEN=*), INTENT (IN) :: cdn
1174 REAL, INTENT (IN) :: px (:)
1175 
1176 REAL :: zx (size (px))
1177 INTEGER :: ji, jn
1178 REAL(KIND=JPRB) :: zhook_handle
1179 
1180 IF (lhook) CALL dr_hook('OI_CONTROL:DD', 0, zhook_handle)
1181 
1182 IF (ldinline) THEN
1183 #ifdef SFX_ARO
1184  IF (lhook) CALL dr_hook('OI_CONTROL:DD', 1, zhook_handle)
1185  RETURN
1186 #endif
1187  jn = count(.NOT. ld_maskext)
1188  zx(1:jn) = pack(px, .NOT. ld_maskext)
1189 ELSE
1190  zx = px
1191  jn = SIZE (px)
1192 ENDIF
1193 
1194 WRITE (0, *) trim(cdn)//" = "
1195 WRITE (0, *) jn, minval(zx(1:jn)), maxval(zx(1:jn))
1196 !WRITE (0, '(10(E14.6,", "))') ZX (1:N)
1197 
1198 IF (lhook) CALL dr_hook('OI_CONTROL:DD', 1, zhook_handle)
1199 
1200 END SUBROUTINE dd
1201 
1202 END SUBROUTINE oi_control
subroutine init_io_surf_n(DTCO, DGU, U, HPROGRAM, HMASK, HSCHEME, HACTION)
subroutine set_surfex_filein(HPROGRAM, HMASK)
subroutine oi_bc_soil_moisture(KNBPT,
subroutine read_cover_n(DTCO, U, HPROGRAM)
Definition: read_covern.F90:6
subroutine oi_control(YSC, LDINLINE, P__SURFTEMPERATURE, P__SURFPREC_EAU_CON, P__SURFPREC_EAU_GEC, P__SURFPREC_NEI_CON, P__SURFPREC_NEI_GEC, P__ATMONEBUL_BASSE, P__SURFXEVAPOTRANSP, P__SURFFLU_LAT_MEVA, P__SURFACCPLUIE, P__SURFACCNEIGE, P__SURFACCGRAUPEL, P__CLSTEMPERATURE, P__CLSHUMI_RELATIVE, P__CLSVENT_ZONAL, P__CLSVENT_MERIDIEN, P__SURFIND_TERREMER, P__SURFRESERV_NEIGE, P__LON, P__LAT, LD_MASKEXT)
Definition: oi_control.F90:5
subroutine io_buff_clean
subroutine flag_update(DGI, DGU, ONOWRITE_CANOPY, OPGD, OPROVAR_TO_DIAG, OSELECT)
Definition: flag_update.F90:6
subroutine write
subroutine oi_latlon_conf_proj(NDIM, PLAT0, PLON0, PRPK, PBETA, PLATOR, PLONOR, PX, PY, PLAT, PLON)
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 close_namelist(HPROGRAM, KLUNAM)
subroutine read_all_namelists(YSC, HPROGRAM, HINIT, ONAM_READ)
subroutine posnam(KULNAM, HDNAML, OFOUND, KLUOUT)
subroutine end_io_surf_n(HPROGRAM)
Definition: end_io_surfn.F90:6
subroutine get_1d_mask(KSIZE, KFRAC, PFRAC, KMASK)
Definition: get_1d_mask.F90:5
subroutine oi_hor_extrapol_surf(NDIM, PLAT_IN, PLON_IN, PFIELD_IN, PLAT, PLON, PFIELD, OINTERP, PZS, NDIM2)
subroutine get_size_full_n(U, HPROGRAM, KDIM_FULL, KSIZE_FULL)
subroutine open_namelist(HPROGRAM, KLUNAM, HFILE)
subroutine dd(CDN, PX)
subroutine ini_data_cover(DTCO, U)
subroutine convert_cover_frac(DTCO, PCOVER, OCOVER, PSEA, PNATURE, PTOWN, PWATER)