SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
read_isban.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_isba_n (DTCO, I, U, &
7  hprogram)
8 ! ##################################
9 !
10 !!**** *READ_ISBA_n* - routine to initialise ISBA variables
11 !!
12 !!
13 !! PURPOSE
14 !! -------
15 !!
16 !!** METHOD
17 !! ------
18 !!
19 !! EXTERNAL
20 !! --------
21 !!
22 !!
23 !! IMPLICIT ARGUMENTS
24 !! ------------------
25 !!
26 !! REFERENCE
27 !! ---------
28 !!
29 !!
30 !! AUTHOR
31 !! ------
32 !! V. Masson *Meteo France*
33 !!
34 !! MODIFICATIONS
35 !! -------------
36 !! Original 01/2003
37 !!
38 !! READ_SURF for general reading : 08/2003 (S.Malardel)
39 !! B. Decharme 2008 : Floodplains
40 !! B. Decharme 01/2009 : Optional Arpege deep soil temperature read
41 !! A.L. Gibelin 03/09 : modifications for CENTURY model
42 !! A.L. Gibelin 04/2009 : BIOMASS and RESP_BIOMASS arrays
43 !! A.L. Gibelin 06/2009 : Soil carbon variables for CNT option
44 !! B. Decharme 09/2012 : suppress NWG_LAYER (parallelization problems)
45 !! T. Aspelien 08/2013 : Read diagnostics for assimilation
46 !! P. Samuelsson 10/2014 : MEB
47 !!
48 !-------------------------------------------------------------------------------
49 !
50 !* 0. DECLARATIONS
51 ! ------------
52 !
53 !
54 !
55 !
56 !
58 USE modd_isba_n, ONLY : isba_t
59 USE modd_surf_atm_n, ONLY : surf_atm_t
60 !
61 USE modd_co2v_par, ONLY : xanfminit, xcondctmin
62 !
63 USE modd_assim, ONLY : lassim,cassim_isba,xat2m_isba,xahu2m_isba,&
64  xazon10m_isba,xamer10m_isba,nific,nvar, &
65  cobs,nobstype,cvar,lprt,xtprt,nivar,cbio, &
66  xaddinfl,nens,xsigma,nie
67 !
68 USE modd_surf_par, ONLY : xundef, nundef
69 USE modd_snow_par, ONLY : xz0sn
70 !
72 !
73 USE modi_read_gr_snow
74 USE modi_abor1_sfx
75 USE modi_io_buff
76 !
77 USE yomhook ,ONLY : lhook, dr_hook
78 USE parkind1 ,ONLY : jprb
79 !
80 USE modi_get_type_dim_n
81 USE mode_random
82 USE mode_ekf
83 !
84 IMPLICIT NONE
85 !
86 !* 0.1 Declarations of arguments
87 ! -------------------------
88 !
89 !
90 TYPE(data_cover_t), INTENT(INOUT) :: dtco
91 TYPE(isba_t), INTENT(INOUT) :: i
92 TYPE(surf_atm_t), INTENT(INOUT) :: u
93 !
94  CHARACTER(LEN=6), INTENT(IN) :: hprogram ! calling program
95 !
96 !* 0.2 Declarations of local variables
97 ! -------------------------------
98 INTEGER :: ilu ! 1D physical dimension
99 !
100 INTEGER :: iresp ! Error code after redding
101 !
102  CHARACTER(LEN=12) :: yrecfm ! Name of the article to be read
103 !
104  CHARACTER(LEN=4) :: ylvl
105 !
106 REAL, DIMENSION(:,:,:),ALLOCATABLE :: zlai
107 REAL, DIMENSION(:,:),ALLOCATABLE :: zwork ! 2D array to write data in file
108 REAL, DIMENSION(:), ALLOCATABLE :: zcofswi
109 !
110 REAL,DIMENSION(I%NPATCH) :: zvlaimin
111 REAL :: zcoef
112 !
113 INTEGER :: iwork ! Work integer
114 !
115 INTEGER :: jp, jl, jnbiomass, jnlitter, jnsoilcarb, jnlittlevs ! loop counter on layers
116 INTEGER :: jvar, ji
117 !
118 INTEGER :: iversion ! surface version
119 INTEGER :: ibugfix
120 INTEGER :: iivar
121 INTEGER :: iobs
122 INTEGER :: ibsup
123 INTEGER :: isize_lmeb_patch
124 !
125 LOGICAL :: gknown
126 !
127 REAL(KIND=JPRB) :: zhook_handle
128 !
129 !-------------------------------------------------------------------------------
130 !
131 !
132 !* 1D physical dimension
133 !
134 IF (lhook) CALL dr_hook('READ_ISBA_N',0,zhook_handle)
135 yrecfm='SIZE_NATURE'
136  CALL get_type_dim_n(dtco, u, &
137  'NATURE',ilu)
138 !
139 !
140 !* 2. Prognostic fields:
141 ! -----------------
142 !
143 ALLOCATE(zwork(ilu,i%NPATCH))
144 !* soil temperatures
145 !
146 IF(i%LTEMP_ARP)THEN
147  iwork=i%NTEMPLAYER_ARP
148 ELSEIF(i%CISBA=='DIF')THEN
149  iwork=i%NGROUND_LAYER
150 ELSE
151  iwork=2 !Only 2 temperature layer in ISBA-FR
152 ENDIF
153 !
154 IF ( trim(cassim_isba)=="ENKF") THEN
155  ALLOCATE(i%XRED_NOISE(ilu,i%NPATCH,nvar))
156  i%XRED_NOISE(:,:,:) = 0.
157  ALLOCATE(zcofswi(ilu))
158  CALL cofswi(i%XCLAY(:,1),zcofswi)
159 ELSE
160  ALLOCATE(i%XRED_NOISE(0,0,0))
161  ALLOCATE(zcofswi(0))
162 ENDIF
163 !
164 ALLOCATE(i%XTG(ilu,iwork,i%NPATCH))
165 i%XTG(:,:,:)=xundef
166 !
167 DO jl=1,iwork
168  WRITE(ylvl,'(I4)') jl
169  yrecfm='TG'//adjustl(ylvl(:len_trim(ylvl)))
170  CALL read_surf(&
171  hprogram,yrecfm,zwork(:,:),iresp)
172  i%XTG(:,jl,:)=zwork(:,:)
173 END DO
174 !
175 ! Perturb value if requested
176 IF ( trim(cassim_isba)=="EKF" .AND. lprt ) THEN
177  !
178  DO jl=1,iwork
179  ! read in control variable
180  IF ( (trim(cvar(nivar))=="TG1" .AND. jl==1) .OR. &
181  (trim(cvar(nivar))=="TG2" .AND. jl==2) ) THEN
182  WHERE ( i%XTG(:,jl,:)/=xundef )
183  i%XTG(:,jl,:) = i%XTG(:,jl,:) + xtprt(nivar)*i%XTG(:,jl,:)
184  ENDWHERE
185  ENDIF
186  END DO
187  !
188 ELSEIF ( trim(cassim_isba)=="ENKF" .AND. nie<nens+1 ) THEN
189  !
190  CALL make_ens_enkf(iwork,ilu,"TG ",zcofswi,i%XTG,i%XRED_NOISE)
191  !
192 ENDIF
193 !
194 !
195 !* soil liquid and ice water contents
196 !
197 ALLOCATE(i%XWG (ilu,i%NGROUND_LAYER,i%NPATCH))
198 ALLOCATE(i%XWGI(ilu,i%NGROUND_LAYER,i%NPATCH))
199 !
200 i%XWG (:,:,:)=xundef
201 i%XWGI(:,:,:)=xundef
202 !
203 DO jl=1,i%NGROUND_LAYER
204  WRITE(ylvl,'(I4)') jl
205  yrecfm='WG'//adjustl(ylvl(:len_trim(ylvl)))
206  CALL read_surf(&
207  hprogram,yrecfm,zwork(:,:),iresp)
208  i%XWG(:,jl,:)=zwork(:,:)
209 END DO
210 !
211 ! Perturb value if requested
212 IF ( trim(cassim_isba)=="EKF" .AND. lprt ) THEN
213  !
214  DO jl=1,i%NGROUND_LAYER
215  ! read in control variable
216  IF ( (trim(cvar(nivar))=="WG1" .AND. jl==1) .OR. &
217  (trim(cvar(nivar))=="WG2" .AND. jl==2) ) THEN
218  WHERE ( i%XWG(:,jl,:)/=xundef )
219  i%XWG(:,jl,:) = i%XWG(:,jl,:) + xtprt(nivar)*i%XWG(:,jl,:)
220  ENDWHERE
221  ENDIF
222  END DO
223  !
224 ELSEIF ( trim(cassim_isba)=="ENKF" .AND. nie<nens+1 ) THEN
225  !
226  CALL make_ens_enkf(iwork,ilu,"WG ",zcofswi,i%XWG,i%XRED_NOISE)
227  !
228 ENDIF
229 !
230 IF(i%CISBA=='DIF')THEN
231  iwork=i%NGROUND_LAYER
232 ELSE
233  iwork=2 !Only 2 soil ice layer in ISBA-FR
234 ENDIF
235 !
236 DO jl=1,iwork
237  WRITE(ylvl,'(I4)') jl
238  yrecfm='WGI'//adjustl(ylvl(:len_trim(ylvl)))
239  CALL read_surf(&
240  hprogram,yrecfm,zwork(:,:),iresp)
241  i%XWGI(:,jl,:)=zwork(:,:)
242 END DO
243 !
244 !* water intercepted on leaves
245 !
246 ALLOCATE(i%XWR(ilu,i%NPATCH))
247 !
248 yrecfm = 'WR'
249  CALL read_surf(&
250  hprogram,yrecfm,i%XWR(:,:),iresp)
251 !
252 !* Leaf Area Index
253 !
254 IF (i%CPHOTO=='LAI' .OR. i%CPHOTO=='LST' .OR. i%CPHOTO=='NIT' .OR. i%CPHOTO=='NCB') THEN
255  yrecfm = 'LAI'
256  CALL read_surf(&
257  hprogram,yrecfm,i%XLAI(:,:),iresp)
258  IF ( trim(cassim_isba)=="EKF" .AND. lprt ) THEN
259  !
260  ! read in control variable
261  IF ( trim(cvar(nivar))=="LAI" ) THEN
262  WHERE ( i%XLAI(:,:)/=xundef )
263  i%XLAI(:,:) = i%XLAI(:,:) + xtprt(nivar)*i%XLAI(:,:)
264  ENDWHERE
265  ENDIF
266  !
267  ELSEIF ( trim(cassim_isba)=="ENKF" .AND. nie<nens+1 ) THEN
268  !
269  IF (i%NPATCH==12) THEN
270  zvlaimin = (/0.3,0.3,0.3,0.3,1.0,1.0,0.3,0.3,0.3,0.3,0.3,0.3/)
271  ELSE
272  zvlaimin = (/0.3/)
273  ENDIF
274  !
275  ALLOCATE(zlai(ilu,1,i%NPATCH))
276  zlai(:,1,:) = i%XLAI(:,:)
277  CALL make_ens_enkf(1,ilu,"LAI",zcofswi,zlai,i%XRED_NOISE)
278  DO jp = 1,i%NPATCH
279  i%XLAI(:,jp) = max(zvlaimin(jp),zlai(:,1,jp))
280  ENDDO
281  DEALLOCATE(zlai)
282  !
283  ENDIF
284 END IF
285 !
286 !* snow mantel
287 !
288  CALL read_gr_snow(&
289  hprogram,'VEG',' ',ilu,i%NPATCH,i%TSNOW )
290 !
291 yrecfm='VERSION'
292  CALL read_surf(&
293  hprogram,yrecfm,iversion,iresp)
294 !
295 yrecfm='BUG'
296  CALL read_surf(&
297  hprogram,yrecfm,ibugfix,iresp)
298 !
299 IF(i%LGLACIER)THEN
300  ALLOCATE(i%XICE_STO(ilu,i%NPATCH))
301  IF (iversion>7 .OR. iversion==7 .AND. ibugfix>=2) THEN
302  yrecfm = 'ICE_STO'
303  CALL read_surf(&
304  hprogram,yrecfm,i%XICE_STO(:,:),iresp)
305  ELSE
306  i%XICE_STO(:,:) = 0.0
307  ENDIF
308 ELSE
309  ALLOCATE(i%XICE_STO(0,0))
310 ENDIF
311 !
312 !-------------------------------------------------------------------------------
313 !
314 !* 3. MEB Prognostic or Semi-prognostic variables
315 ! -------------------------------------------
316 !
317 isize_lmeb_patch=count(i%LMEB_PATCH(:))
318 !
319 IF (isize_lmeb_patch>0) THEN
320 !
321 !* water intercepted on litter
322 
323  ALLOCATE(i%XWRL(ilu,i%NPATCH))
324  yrecfm = 'WRL'
325  CALL read_surf(hprogram,yrecfm,i%XWRL(:,:),iresp)
326 
327  ALLOCATE(i%XWRLI(ilu,i%NPATCH))
328  yrecfm = 'WRLI'
329  CALL read_surf(hprogram,yrecfm,i%XWRLI(:,:),iresp)
330 !
331 !* snow intercepted on vegetation canopy leaves
332 !
333  ALLOCATE(i%XWRVN(ilu,i%NPATCH))
334  yrecfm = 'WRVN'
335  CALL read_surf(&
336  hprogram,yrecfm,i%XWRVN(:,:),iresp)
337 !
338 !* vegetation canopy temperature
339 !
340  ALLOCATE(i%XTV(ilu,i%NPATCH))
341  yrecfm = 'TV'
342  CALL read_surf(hprogram,yrecfm,i%XTV(:,:),iresp)
343 !
344 !* litter temperature
345 !
346  ALLOCATE(i%XTL(ilu,i%NPATCH))
347  yrecfm = 'TL'
348  CALL read_surf(hprogram,yrecfm,i%XTL(:,:),iresp)
349 !
350 !* vegetation canopy air temperature
351 !
352  ALLOCATE(i%XTC(ilu,i%NPATCH))
353  yrecfm = 'TC'
354  CALL read_surf(&
355  hprogram,yrecfm,i%XTC(:,:),iresp)
356 !
357 !* vegetation canopy air specific humidity
358 !
359  ALLOCATE(i%XQC(ilu,i%NPATCH))
360  yrecfm = 'QC'
361  CALL read_surf(&
362  hprogram,yrecfm,i%XQC(:,:),iresp)
363 !
364 ENDIF
365 !
366 !-------------------------------------------------------------------------------
367 !
368 !* 4. Semi-prognostic variables
369 ! -------------------------
370 !
371 ALLOCATE(i%XRESA(ilu,i%NPATCH))
372 ALLOCATE(i%XLE (ilu,i%NPATCH))
373 IF (i%CPHOTO/='NON') THEN
374  ALLOCATE(i%XANFM (ilu,i%NPATCH))
375  ALLOCATE(i%XAN (ilu,i%NPATCH))
376  ALLOCATE(i%XANDAY (ilu,i%NPATCH))
377 END IF
378 !
379 IF(i%CPHOTO/='NON') THEN
380  ALLOCATE(i%XBIOMASS (ilu,i%NNBIOMASS,i%NPATCH))
381  ALLOCATE(i%XRESP_BIOMASS (ilu,i%NNBIOMASS,i%NPATCH))
382 END IF
383 !
384 !
385 !* aerodynamical resistance
386 !
387 yrecfm = 'RESA'
388 i%XRESA(:,:) = 100.
389  CALL read_surf(&
390  hprogram,yrecfm,i%XRESA(:,:),iresp)
391 !
392 !* patch averaged radiative temperature (K)
393 !
394 ALLOCATE(i%XTSRAD_NAT(ilu))
395 IF (iversion<6) THEN
396  i%XTSRAD_NAT(:)=0.
397  DO jp=1,i%NPATCH
398  i%XTSRAD_NAT(:)=i%XTSRAD_NAT(:)+i%XTG(:,1,jp)
399  ENDDO
400  i%XTSRAD_NAT(:)=i%XTSRAD_NAT(:)/i%NPATCH
401 ELSE
402  yrecfm='TSRAD_NAT'
403  CALL read_surf(&
404  hprogram,yrecfm,i%XTSRAD_NAT(:),iresp)
405 ENDIF
406 !
407 i%XLE(:,:) = xundef
408 !
409 !* 5. ISBA-AGS variables
410 !
411 IF (i%CPHOTO/='NON') THEN
412  yrecfm = 'AN'
413  i%XAN(:,:) = 0.
414  CALL read_surf(&
415  hprogram,yrecfm,i%XAN(:,:),iresp)
416  !
417  yrecfm = 'ANDAY'
418  i%XANDAY(:,:) = 0.
419  CALL read_surf(&
420  hprogram,yrecfm,i%XANDAY(:,:),iresp)
421  !
422  yrecfm = 'ANFM'
423  i%XANFM(:,:) = xanfminit
424  CALL read_surf(&
425  hprogram,yrecfm,i%XANFM(:,:),iresp)
426  !
427  yrecfm = 'LE_AGS'
428  i%XLE(:,:) = 0.
429  CALL read_surf(&
430  hprogram,yrecfm,i%XLE(:,:),iresp)
431 END IF
432 !
433 IF (i%CPHOTO=='AGS' .OR. i%CPHOTO=='AST') THEN
434  !
435  i%XBIOMASS(:,:,:) = 0.
436  i%XRESP_BIOMASS(:,:,:) = 0.
437 
438 ELSEIF (i%CPHOTO=='LAI' .OR. i%CPHOTO=='LST') THEN
439  !
440  i%XBIOMASS(:,1,:) = i%XBSLAI(:,:) * i%XLAI(:,:)
441  i%XRESP_BIOMASS(:,:,:) = 0.
442 
443 ELSEIF (i%CPHOTO=='NIT'.OR.i%CPHOTO=='NCB') THEN
444  !
445  i%XBIOMASS(:,:,:) = 0.
446  DO jnbiomass=1,i%NNBIOMASS
447  WRITE(ylvl,'(I1)') jnbiomass
448  IF (iversion>7 .OR. iversion==7 .AND. ibugfix>=3) THEN
449  yrecfm='BIOMA'//adjustl(ylvl(:len_trim(ylvl)))
450  ELSE
451  yrecfm='BIOMASS'//adjustl(ylvl(:len_trim(ylvl)))
452  ENDIF
453  CALL read_surf(&
454  hprogram,yrecfm,zwork(:,:),iresp)
455  IF ( trim(cassim_isba)=="EKF" .AND. lprt ) THEN
456  ! read in control variable
457  IF ( trim(cvar(nivar)) == "LAI" .AND. trim(cbio)==trim(yrecfm) ) THEN
458  WHERE ( zwork(:,:)/=xundef )
459  zwork(:,:) = zwork(:,:) + xtprt(nivar)*zwork(:,:)
460  ENDWHERE
461  ENDIF
462  ELSEIF ( trim(cassim_isba)=="ENKF" .AND. nie<nens+1 .AND. .NOT.lassim ) THEN
463  !
464  IF ( trim(cbio)==trim(yrecfm) ) THEN
465  DO jvar = 1,nvar
466  IF (trim(cvar(jvar)) == "LAI") THEN
467  DO ji = 1,ilu
468  DO jp = 1,i%NPATCH
469  zwork(ji,jp) = zwork(ji,jp) + xaddinfl(jvar)*random_normal()
470  ENDDO
471  ENDDO
472  EXIT
473  ENDIF
474  ENDDO
475  ENDIF
476  !
477  ENDIF
478  i%XBIOMASS(:,jnbiomass,:)=zwork
479  END DO
480 !
481  iwork=0
482  IF(i%CPHOTO=='NCB'.OR.iversion<8)iwork=2
483 !
484  i%XRESP_BIOMASS(:,:,:) = 0.
485  DO jnbiomass=2,i%NNBIOMASS-iwork
486  WRITE(ylvl,'(I1)') jnbiomass
487  IF (iversion>7 .OR. (iversion==7 .AND. ibugfix>=3)) THEN
488  yrecfm='RESPI'//adjustl(ylvl(:len_trim(ylvl)))
489  ELSE
490  yrecfm='RESP_BIOM'//adjustl(ylvl(:len_trim(ylvl)))
491  ENDIF
492  CALL read_surf(&
493  hprogram,yrecfm,zwork(:,:),iresp)
494  IF ( trim(cassim_isba)=="EKF" .AND. lprt ) THEN
495  ! read in control variable
496  IF ( trim(cvar(nivar)) == "LAI" .AND. trim(cbio)==trim(yrecfm) ) THEN
497  WHERE ( zwork(:,:)/=xundef )
498  zwork(:,:) = zwork(:,:) + xtprt(nivar)*zwork(:,:)
499  ENDWHERE
500  ELSEIF ( trim(cassim_isba)=="ENKF" .AND. nie<nens+1 .AND. .NOT.lassim ) THEN
501  !
502  IF ( trim(cbio)==trim(yrecfm) ) THEN
503  DO jvar = 1,nvar
504  IF (trim(cvar(jvar)) == "LAI") THEN
505  DO ji = 1,ilu
506  DO jp = 1,i%NPATCH
507  zwork(ji,jp) = zwork(ji,jp) + xaddinfl(jvar)*random_normal()
508  ENDDO
509  ENDDO
510  EXIT
511  ENDIF
512  ENDDO
513  ENDIF
514  !
515  ENDIF
516  ENDIF
517  i%XRESP_BIOMASS(:,jnbiomass,:)=zwork
518  END DO
519  !
520 ENDIF
521 !
522 DEALLOCATE(zcofswi)
523 !
524 !* 6. Soil carbon
525 !
526 !
527 IF (i%CRESPSL=='CNT') THEN
528  !
529  ALLOCATE(i%XLITTER (ilu,i%NNLITTER,i%NNLITTLEVS,i%NPATCH))
530  ALLOCATE(i%XSOILCARB (ilu,i%NNSOILCARB,i%NPATCH))
531  ALLOCATE(i%XLIGNIN_STRUC (ilu,i%NNLITTLEVS,i%NPATCH))
532  !
533  i%XLITTER(:,:,:,:) = 0.
534  DO jnlitter=1,i%NNLITTER
535  DO jnlittlevs=1,i%NNLITTLEVS
536  WRITE(ylvl,'(I1,A1,I1)') jnlitter,'_',jnlittlevs
537  yrecfm='LITTER'//adjustl(ylvl(:len_trim(ylvl)))
538  CALL read_surf(&
539  hprogram,yrecfm,zwork(:,:),iresp)
540  i%XLITTER(:,jnlitter,jnlittlevs,:)=zwork
541  END DO
542  END DO
543 
544  i%XSOILCARB(:,:,:) = 0.
545  DO jnsoilcarb=1,i%NNSOILCARB
546  WRITE(ylvl,'(I4)') jnsoilcarb
547  yrecfm='SOILCARB'//adjustl(ylvl(:len_trim(ylvl)))
548  CALL read_surf(&
549  hprogram,yrecfm,zwork(:,:),iresp)
550  i%XSOILCARB(:,jnsoilcarb,:)=zwork
551  END DO
552 !
553  i%XLIGNIN_STRUC(:,:,:) = 0.
554  DO jnlittlevs=1,i%NNLITTLEVS
555  WRITE(ylvl,'(I4)') jnlittlevs
556  yrecfm='LIGNIN_STR'//adjustl(ylvl(:len_trim(ylvl)))
557  CALL read_surf(&
558  hprogram,yrecfm,zwork(:,:),iresp)
559  i%XLIGNIN_STRUC(:,jnlittlevs,:)=zwork
560  END DO
561 !
562 ENDIF
563 
564 IF ( lassim ) THEN
565  IF ( trim(cassim_isba) == "OI" ) THEN
566  IF ( i%NPATCH /= 1 ) CALL abor1_sfx('Reading of diagnostical values for'&
567  & //'assimilation at the moment only works for one patch for OI')
568  ! Diagnostic fields for assimilation
569  IF ( .NOT. ALLOCATED(xat2m_isba)) ALLOCATE(xat2m_isba(ilu,1))
570  xat2m_isba=xundef
571  yrecfm='T2M'
572  CALL io_buff(yrecfm,'R',gknown)
573  CALL read_surf(&
574  hprogram,yrecfm,xat2m_isba(:,1),iresp)
575 
576  IF ( .NOT. ALLOCATED(xahu2m_isba)) ALLOCATE(xahu2m_isba(ilu,1))
577  xahu2m_isba=xundef
578  yrecfm='HU2M'
579  CALL io_buff(yrecfm,'R',gknown)
580  CALL read_surf(&
581  hprogram,yrecfm,xahu2m_isba(:,1),iresp)
582 
583  IF ( .NOT. ALLOCATED(xazon10m_isba)) ALLOCATE(xazon10m_isba(ilu,1))
584  xazon10m_isba=xundef
585  yrecfm='ZON10M'
586  CALL io_buff(yrecfm,'R',gknown)
587  CALL read_surf(&
588  hprogram,yrecfm,xazon10m_isba(:,1),iresp)
589 
590  IF ( .NOT. ALLOCATED(xamer10m_isba)) ALLOCATE(xamer10m_isba(ilu,1))
591  xamer10m_isba=xundef
592  yrecfm='MER10M'
593  CALL io_buff(yrecfm,'R',gknown)
594  CALL read_surf(&
595  hprogram,yrecfm,xamer10m_isba(:,1),iresp)
596  ELSEIF ( nific/=nvar+2 ) THEN
597  ! Diagnostic fields for EKF assimilation ("observations")
598  DO iobs = 1,nobstype
599  SELECT CASE (trim(cobs(iobs)))
600  CASE("T2M")
601  IF ( .NOT. ALLOCATED(xat2m_isba)) ALLOCATE(xat2m_isba(ilu,1))
602  xat2m_isba=xundef
603  yrecfm='T2M'
604  CALL io_buff(yrecfm,'R',gknown)
605  CALL read_surf(&
606  hprogram,yrecfm,xat2m_isba(:,1),iresp)
607  CASE("HU2M")
608  IF ( .NOT. ALLOCATED(xahu2m_isba)) ALLOCATE(xahu2m_isba(ilu,1))
609  xahu2m_isba=xundef
610  yrecfm='HU2M'
611  CALL io_buff(yrecfm,'R',gknown)
612  CALL read_surf(&
613  hprogram,yrecfm,xahu2m_isba(:,1),iresp)
614  CASE("WG1")
615  ! This is already read above
616  CASE("LAI")
617  ! This is already read above
618  CASE("SWE")
619  ! This is handled independently
620  CASE default
621  CALL abor1_sfx("Mapping of "//trim(cobs(iobs))//" is not defined in READ_ISBA_n!")
622  END SELECT
623  ENDDO
624  ENDIF
625 ENDIF
626 !
627 DEALLOCATE(zwork)
628 !
629 IF (lhook) CALL dr_hook('READ_ISBA_N',1,zhook_handle)
630 !
631  CONTAINS
632 !
633 SUBROUTINE make_ens_enkf(KWORK,KLU,HREC,PCOFSWI,PVAR,PRED_NOISE)
634 !
635 USE modd_assim, ONLY : lens_gen, xaddtimecorr, xaddinfl, xassim_winh
636 !
637 USE modi_add_noise
638 USE mode_random
639 !
640 IMPLICIT NONE
641 !
642 INTEGER, INTENT(IN) :: kwork
643 INTEGER, INTENT(IN) :: klu
644  CHARACTER(LEN=3), INTENT(IN) :: hrec
645 REAL, DIMENSION(:), INTENT(IN) :: pcofswi
646 REAL, DIMENSION(:,:,:), INTENT(INOUT) :: pvar
647 REAL, DIMENSION(:,:,:), INTENT(INOUT) :: pred_noise
648 !
649  CHARACTER(LEN=12) :: yrecfm ! Name of the article to be read
650  CHARACTER(LEN=4) :: ylvl
651  CHARACTER(LEN=3) :: yvar
652 REAL :: zwhite_noise, zvar0
653 INTEGER :: jl, ji, jp, ivar
654 LOGICAL :: gpass
655 !
656 REAL(KIND=JPRB) :: zhook_handle
657 !
658 IF (lhook) CALL dr_hook('READ_ISBA_N:MAKE_ENS_ENKF',0,zhook_handle)
659 !
660 !
661 DO jl=1,kwork
662  !
663  IF (kwork>1) THEN
664  WRITE(ylvl,'(I4)') jl
665  yrecfm = trim(hrec)//adjustl(ylvl(:len_trim(ylvl)))
666  ELSE
667  yrecfm = trim(hrec)
668  ENDIF
669  !
670  ivar = 0
671  DO jvar = 1,nvar
672  gpass = ( trim(cvar(jvar))==trim(yrecfm) )
673  IF (gpass) THEN
674  ivar = jvar
675  EXIT
676  ENDIF
677  ENDDO
678  !
679  IF ( gpass ) THEN
680  !
681  IF (xaddinfl(ivar)>0.) THEN
682  !
683  IF (lassim) THEN
684  !
685  WRITE(yvar,'(I3)') ivar
686  yrecfm='RED_NOISE'//adjustl(yvar(:len_trim(yvar)))
687  CALL read_surf(hprogram,yrecfm,pred_noise(:,:,ivar),iresp)
688  !
689  ELSEIF (.NOT.lens_gen .AND. xaddtimecorr(ivar)>0. ) THEN
690  !
691  WRITE(yvar,'(I3)') ivar
692  yrecfm='RED_NOISE'//adjustl(yvar(:len_trim(yvar)))
693  CALL read_surf(hprogram,yrecfm,pred_noise(:,:,ivar),iresp)
694  !
695  DO ji = 1,klu
696  DO jp = 1,i%NPATCH
697  zwhite_noise = xaddinfl(ivar)*pcofswi(ji)*random_normal()
698  CALL add_noise(xaddtimecorr(ivar),xassim_winh,zwhite_noise,pred_noise(ji,jp,ivar))
699  ENDDO
700  ENDDO
701  !
702  zcoef = xassim_winh/24.
703  !
704  ELSE
705  !
706  DO ji = 1,ilu
707  DO jp = 1,i%NPATCH
708  pred_noise(ji,jp,ivar) = xaddinfl(ivar)*pcofswi(ji)*random_normal()
709  ENDDO
710  ENDDO
711  !
712  zcoef = 1.
713  !
714  ENDIF
715  !
716  IF (.NOT.lassim) THEN
717  !
718  DO ji = 1,ilu
719  DO jp = 1,i%NPATCH
720  IF ( pvar(ji,jl,jp)/=xundef ) THEN
721  !
722  zvar0 = pvar(ji,jl,jp)
723  !
724  pvar(ji,jl,jp) = pvar(ji,jl,jp) + zcoef * pred_noise(ji,jp,ivar)
725  !
726  IF (pvar(ji,jl,jp) < 0.) THEN
727  IF (lens_gen) THEN
728  pvar(ji,jl,jp) = abs(pvar(ji,jl,jp))
729  ELSE
730  pvar(ji,jl,jp) = zvar0
731  ENDIF
732  ENDIF
733  ENDIF
734  ENDDO
735  ENDDO
736  !
737  ENDIF
738  !
739  ENDIF
740  !
741  ENDIF
742  !
743 ENDDO
744 !
745 IF (lhook) CALL dr_hook('READ_ISBA_N:MAKE_ENS_ENKF',1,zhook_handle)
746 !
747 END SUBROUTINE make_ens_enkf
748 !
749 !-------------------------------------------------------------------------------
750 !
751 END SUBROUTINE read_isba_n
subroutine get_type_dim_n(DTCO, U, HTYPE, KDIM)
subroutine add_noise(PADDTIMECORR, PASSIM_WINH, PWHITE_NOISE, PRED_NOISE)
Definition: add_noise.F90:5
subroutine read_isba_n(DTCO, I, U, HPROGRAM)
Definition: read_isban.F90:6
real function random_normal()
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:6
subroutine make_ens_enkf(KWORK, KLU, HREC, PCOFSWI, PVAR, PRED_NOISE)
Definition: read_isban.F90:633
subroutine io_buff(HREC, HACTION, OKNOWN)
Definition: io_buff.F90:6
subroutine read_gr_snow(HPROGRAM, HSURFTYPE, HPREFIX, KLU, KPATCH, TPSNOW, HDIR, KVERSION, KBUGFIX)
Definition: read_gr_snow.F90:6