SURFEX v8.1
General documentation of Surfex
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, IO, S, NP, NPE, PCLAY, U, HPROGRAM)
7 ! ##################################
8 !
9 !!**** *READ_ISBA_n* - routine to initialise ISBA variables
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 !!
37 !! READ_SURF for general reading : 08/2003 (S.Malardel)
38 !! B. Decharme 2008 : Floodplains
39 !! B. Decharme 01/2009 : Optional Arpege deep soil temperature read
40 !! A.L. Gibelin 03/09 : modifications for CENTURY model
41 !! A.L. Gibelin 04/2009 : BIOMASS and RESP_BIOMASS arrays
42 !! A.L. Gibelin 06/2009 : Soil carbon variables for CNT option
43 !! B. Decharme 09/2012 : suppress NWG_LAYER (parallelization problems)
44 !! T. Aspelien 08/2013 : Read diagnostics for assimilation
45 !! P. Samuelsson 10/2014 : MEB
46 !!
47 !-------------------------------------------------------------------------------
48 !
49 !* 0. DECLARATIONS
50 ! ------------
51 !
55 USE modd_surf_atm_n, ONLY : surf_atm_t
56 !
57 USE modd_co2v_par, ONLY : xanfminit, xcondctmin
58 !
59 USE modd_assim, ONLY : lassim,cassim_isba,xat2m_isba,xahu2m_isba,&
60  xazon10m_isba,xamer10m_isba,nific,nvar, &
61  cobs,nobstype,cvar,lprt,xtprt,nivar,cbio, &
62  xaddinfl,nens,xsigma,nie
63 !
64 USE modd_surf_par, ONLY : xundef, nundef
65 USE modd_snow_par, ONLY : xz0sn
66 USE modd_isba_par, ONLY : xwgmin
67 !
69 !
71 USE modi_make_choice_array
73 !
74 USE modi_read_gr_snow
75 USE modi_abor1_sfx
76 USE modi_io_buff
77 !
78 USE yomhook ,ONLY : lhook, dr_hook
79 USE parkind1 ,ONLY : jprb
80 !
81 USE modi_io_buff_clean
82 USE modi_get_type_dim_n
83 USE mode_random
84 USE mode_ekf
85 !
86 IMPLICIT NONE
87 !
88 !* 0.1 Declarations of arguments
89 ! -------------------------
90 !
91 !
92 TYPE(data_cover_t), INTENT(INOUT) :: DTCO
93 TYPE(isba_options_t), INTENT(INOUT) :: IO
94 TYPE(isba_s_t), INTENT(INOUT) :: S
95 TYPE(isba_np_t), INTENT(INOUT) :: NP
96 TYPE(isba_npe_t), INTENT(INOUT) :: NPE
97 REAL, DIMENSION(:,:), INTENT(IN) :: PCLAY
98 TYPE(surf_atm_t), INTENT(INOUT) :: U
99 !
100  CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! calling program
101 !
102 !* 0.2 Declarations of local variables
103 ! -------------------------------
104 !
105 TYPE(isba_p_t), POINTER :: PK
106 TYPE(isba_pe_t), POINTER :: PEK
107 !
108 INTEGER :: ILU ! 1D physical dimension
109 !
110 INTEGER :: IRESP ! Error code after redding
111 !
112  CHARACTER(LEN=12) :: YRECFM ! Name of the article to be read
113  CHARACTER(LEN=12) :: YCBIO ! Name of biomass variable
114 !
115  CHARACTER(LEN=4) :: YLVL
116 !
117 REAL, DIMENSION(:,:,:),ALLOCATABLE :: ZLAI
118 REAL, DIMENSION(:,:,:),ALLOCATABLE :: ZWORK3D ! 2D array to write data in file
119 REAL, DIMENSION(:,:),ALLOCATABLE :: ZWORK ! 2D array to write data in file
120 REAL, DIMENSION(:), ALLOCATABLE :: ZCOFSWI
121 !
122 REAL,DIMENSION(IO%NPATCH) :: ZVLAIMIN
123 REAL :: ZCOEF
124 !
125 INTEGER :: IWORK ! Work integer
126 !
127 INTEGER :: JP, JL, JNB, JNLITTER, JNSOILCARB, JNLITTLEVS ! loop counter on layers
128 INTEGER :: JVAR, JI
129 !
130 INTEGER :: IVERSION ! surface version
131 INTEGER :: IBUGFIX
132 INTEGER :: IIVAR
133 INTEGER :: IOBS
134 INTEGER :: IBSUP
135 INTEGER :: ISIZE_LMEB_PATCH, IMASK
136 !
137 LOGICAL :: GKNOWN, GDIM
138 !
139 REAL(KIND=JPRB) :: ZHOOK_HANDLE
140 !
141 !-------------------------------------------------------------------------------
142 !
143 !
144 !* 1D physical dimension
145 !
146 IF (lhook) CALL dr_hook('READ_ISBA_N',0,zhook_handle)
147 yrecfm='SIZE_NATURE'
148  CALL get_type_dim_n(dtco, u, 'NATURE',ilu)
149 !
150 yrecfm='VERSION'
151  CALL read_surf(hprogram,yrecfm,iversion,iresp)
152 !
153 yrecfm='BUG'
154  CALL read_surf(hprogram,yrecfm,ibugfix,iresp)
155 !
156 gdim = (iversion>8 .OR. iversion==8 .AND. ibugfix>0)
157 IF (gdim) CALL read_surf(hprogram,'SPLIT_PATCH',gdim,iresp)
158 !
159 yrecfm='BUG'
160  CALL read_surf(hprogram,yrecfm,ibugfix,iresp)
161 
162 !* 2. Prognostic fields:
163 ! -----------------
164 !
165 ALLOCATE(zwork(ilu,io%NPATCH))
166 !* soil temperatures
167 !
168 IF(io%LTEMP_ARP)THEN
169  iwork=io%NTEMPLAYER_ARP
170 ELSEIF(io%CISBA=='DIF')THEN
171  iwork=io%NGROUND_LAYER
172 ELSE
173  iwork=2 !Only 2 temperature layer in ISBA-FR
174 ENDIF
175 !
176 IF ( trim(cassim_isba)=="ENKF") THEN
177  DO jp = 1,io%NPATCH
178  pk => np%AL(jp)
179  ALLOCATE(pk%XRED_NOISE(pk%NSIZE_P,nvar))
180  pk%XRED_NOISE(:,:) = 0.
181  ENDDO
182 ELSE
183  DO jp = 1,io%NPATCH
184  ALLOCATE(np%AL(jp)%XRED_NOISE(0,0))
185  ENDDO
186 ENDIF
187 !
188 IF ( trim(cassim_isba)=="ENKF" .OR. (trim(cassim_isba)=="EKF" .AND. lprt) ) THEN
189  ALLOCATE(zcofswi(ilu))
190  CALL cofswi(pclay(:,1),zcofswi)
191 ELSE
192  ALLOCATE(zcofswi(0))
193 ENDIF
194 !
195 DO jp = 1,io%NPATCH
196  pek => npe%AL(jp)
197  pk => np%AL(jp)
198  !
199  ALLOCATE(pek%XTG(pk%NSIZE_P,iwork))
200  !
201  ALLOCATE(pek%XWG (pk%NSIZE_P,io%NGROUND_LAYER))
202  ALLOCATE(pek%XWGI(pk%NSIZE_P,io%NGROUND_LAYER))
203  !
204  pek%XTG (:,:) = xundef
205  pek%XWG (:,:) = xundef
206  pek%XWGI(:,:) = xundef
207  !
208  ALLOCATE(pek%XWR(pk%NSIZE_P))
209  !
210 ENDDO
211 !
212 ALLOCATE(zwork3d(ilu,iwork,io%NPATCH))
213  CALL read_surf_layers(hprogram,'TG',gdim,zwork3d,iresp)
214 DO jl=1,iwork
215  DO jp = 1,io%NPATCH
216  CALL pack_same_rank(np%AL(jp)%NR_P,zwork3d(:,jl,jp),npe%AL(jp)%XTG(:,jl))
217  ENDDO
218 ENDDO
219 DEALLOCATE(zwork3d)
220 !
221 ! Perturb value if requested
222 IF ( trim(cassim_isba)=="EKF" .AND. lprt ) THEN
223  !
224  DO jl=1,iwork
225  ! read in control variable
226  IF ( (trim(cvar(nivar))=="TG1" .AND. jl==1) .OR. (trim(cvar(nivar))=="TG2" .AND. jl==2) ) THEN
227  DO jp = 1,io%NPATCH
228  pek => npe%AL(jp)
229  WHERE ( pek%XTG(:,jl)/=xundef )
230  pek%XTG(:,jl) = pek%XTG(:,jl) + xtprt(nivar)*pek%XTG(:,jl)
231  ENDWHERE
232  ENDDO
233  ENDIF
234  END DO
235  !
236 ELSEIF ( trim(cassim_isba)=="ENKF" .AND. nie<nens+1 ) THEN
237  !
238  CALL make_ens_enkf(iwork,ilu,"TG ",zcofswi,np)
239  !
240 ENDIF
241 !
242 !
243 !* soil liquid and ice water contents
244 !
245 ALLOCATE(zwork3d(ilu,io%NGROUND_LAYER,io%NPATCH))
246  CALL read_surf_layers(hprogram,'WG',gdim,zwork3d,iresp)
247 DO jl=1,io%NGROUND_LAYER
248  DO jp = 1,io%NPATCH
249  CALL pack_same_rank(np%AL(jp)%NR_P,zwork3d(:,jl,jp),npe%AL(jp)%XWG(:,jl))
250  ENDDO
251 ENDDO
252 DEALLOCATE(zwork3d)
253 !
254 ! Perturb value if requested
255 IF ( trim(cassim_isba)=="EKF" .AND. lprt ) THEN
256  !
257  DO jl=1,io%NGROUND_LAYER
258  ! read in control variable
259  IF ( (trim(cvar(nivar))=="WG1" .AND. jl==1) .OR. &
260  (trim(cvar(nivar))=="WG2" .AND. jl==2) .OR. &
261  (trim(cvar(nivar))=="WG3" .AND. jl==3) .OR. &
262  (trim(cvar(nivar))=="WG4" .AND. jl==4) .OR. &
263  (trim(cvar(nivar))=="WG5" .AND. jl==5) .OR. &
264  (trim(cvar(nivar))=="WG6" .AND. jl==6) .OR. &
265  (trim(cvar(nivar))=="WG7" .AND. jl==7) .OR. &
266  (trim(cvar(nivar))=="WG8" .AND. jl==8) ) THEN
267 
268  DO jp = 1,io%NPATCH
269  pek => npe%AL(jp)
270  pk => np%AL(jp)
271  DO ji = 1,pk%NSIZE_P
272  imask = pk%NR_P(ji)
273  IF (pek%XWG(ji,jl)/=xundef ) THEN
274  pek%XWG(ji,jl) = pek%XWG(ji,jl) + xtprt(nivar) * zcofswi(imask)
275  ENDIF
276  ENDDO
277  END DO
278  !
279  ENDIF
280  !
281  END DO
282  !
283 ELSEIF ( trim(cassim_isba)=="ENKF" .AND. nie<nens+1 ) THEN
284  !
285  CALL make_ens_enkf(iwork,ilu,"WG ",zcofswi,np)
286  !
287 ENDIF
288 !
289 IF(io%CISBA=='DIF')THEN
290  iwork=io%NGROUND_LAYER
291 ELSE
292  iwork=2 !Only 2 soil ice layer in ISBA-FR
293 ENDIF
294 !
295 ALLOCATE(zwork3d(ilu,iwork,io%NPATCH))
296  CALL read_surf_layers(hprogram,'WGI',gdim,zwork3d,iresp)
297 DO jl=1,iwork
298  DO jp = 1,io%NPATCH
299  CALL pack_same_rank(np%AL(jp)%NR_P,zwork3d(:,jl,jp),npe%AL(jp)%XWGI(:,jl))
300  ENDDO
301 ENDDO
302 DEALLOCATE(zwork3d)
303 !
304 !* water intercepted on leaves
305 !
306 !
307 yrecfm = 'WR'
308  CALL make_choice_array(hprogram, io%NPATCH, gdim, yrecfm, zwork)
309 DO jp = 1,io%NPATCH
310  CALL pack_same_rank(np%AL(jp)%NR_P,zwork(:,jp),npe%AL(jp)%XWR(:))
311 ENDDO
312 !
313 !* Leaf Area Index
314 !
315 IF (io%CPHOTO=='NIT' .OR. io%CPHOTO=='NCB') THEN
316 
317  yrecfm = 'LAI'
318  CALL make_choice_array(hprogram, io%NPATCH, gdim, yrecfm, zwork)
319  DO jp = 1,io%NPATCH
320  CALL pack_same_rank(np%AL(jp)%NR_P,zwork(:,jp),npe%AL(jp)%XLAI(:))
321  ENDDO
322 
323  IF ( trim(cassim_isba)=="EKF" .AND. lprt ) THEN
324  !
325  ! read in control variable
326  IF ( trim(cvar(nivar))=="LAI" ) THEN
327  DO jp = 1,io%NPATCH
328  pek => npe%AL(jp)
329  WHERE ( pek%XLAI(:)/=xundef )
330  pek%XLAI(:) = pek%XLAI(:) + xtprt(nivar)* pek%XLAI(:)
331  ENDWHERE
332  ENDDO
333  ENDIF
334  !
335  ELSEIF ( trim(cassim_isba)=="ENKF" .AND. nie<nens+1 ) THEN
336  !
337  IF (io%NPATCH==12) THEN
338  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/)
339  ELSE
340  zvlaimin = (/0.3/)
341  ENDIF
342  !
343  ALLOCATE(zlai(ilu,1,io%NPATCH))
344  zlai(:,:,:) = 0.
345  DO jp = 1,io%NPATCH
346  zlai(1:np%AL(jp)%NSIZE_P,1,jp) = npe%AL(jp)%XLAI(:)
347  ENDDO
348  CALL make_ens_enkf(1,ilu,"LAI",zcofswi,np,zlai)
349  DO jp = 1,io%NPATCH
350  npe%AL(jp)%XLAI(:) = max(zvlaimin(jp),zlai(1:np%AL(jp)%NSIZE_P,1,jp))
351  ENDDO
352  DEALLOCATE(zlai)
353  !
354  ENDIF
355 END IF
356 !
357 !* snow mantel
358 !
359 DO jp = 1,io%NPATCH
360  IF (jp>1) THEN
361  npe%AL(jp)%TSNOW%SCHEME = npe%AL(1)%TSNOW%SCHEME
362  npe%AL(jp)%TSNOW%NLAYER = npe%AL(1)%TSNOW%NLAYER
363  ENDIF
364  CALL read_gr_snow(hprogram,'VEG',' ',ilu,np%AL(jp)%NSIZE_P,np%AL(jp)%NR_P,jp,&
365  npe%AL(jp)%TSNOW,knpatch=io%NPATCH )
366  CALL io_buff_clean
367 ENDDO
368 !
369 IF(io%LGLACIER)THEN
370  DO jp = 1,io%NPATCH
371  ALLOCATE(npe%AL(jp)%XICE_STO(np%AL(jp)%NSIZE_P))
372  ENDDO
373  IF (iversion>7 .OR. iversion==7 .AND. ibugfix>=2) THEN
374  yrecfm = 'ICE_STO'
375  CALL make_choice_array(hprogram, io%NPATCH, gdim, yrecfm, zwork)
376  DO jp = 1,io%NPATCH
377  CALL pack_same_rank(np%AL(jp)%NR_P,zwork(:,jp),npe%AL(jp)%XICE_STO(:))
378  ENDDO
379  ELSE
380  DO jp = 1,io%NPATCH
381  npe%AL(jp)%XICE_STO(:) = 0.0
382  ENDDO
383  ENDIF
384 ELSE
385  DO jp = 1,io%NPATCH
386  ALLOCATE(npe%AL(jp)%XICE_STO(0))
387  ENDDO
388 ENDIF
389 !
390 !-------------------------------------------------------------------------------
391 !
392 !* 3. MEB Prognostic or Semi-prognostic variables
393 ! -------------------------------------------
394 !
395 isize_lmeb_patch=count(io%LMEB_PATCH(:))
396 !
397 IF (isize_lmeb_patch>0) THEN
398 !
399  DO jp = 1,io%NPATCH
400  pk => np%AL(jp)
401  pek => npe%AL(jp)
402  ALLOCATE(pek%XWRL (pk%NSIZE_P))
403  ALLOCATE(pek%XWRLI(pk%NSIZE_P))
404  ALLOCATE(pek%XWRVN(pk%NSIZE_P))
405  ALLOCATE(pek%XTV (pk%NSIZE_P))
406  ALLOCATE(pek%XTL (pk%NSIZE_P))
407  ALLOCATE(pek%XTC (pk%NSIZE_P))
408  ALLOCATE(pek%XQC (pk%NSIZE_P))
409  ENDDO
410 
411 !* water intercepted on litter
412 
413  yrecfm = 'WRL'
414  CALL make_choice_array(hprogram, io%NPATCH, gdim, yrecfm, zwork)
415 DO jp = 1,io%NPATCH
416  CALL pack_same_rank(np%AL(jp)%NR_P,zwork(:,jp),npe%AL(jp)%XWRL(:))
417 ENDDO
418 
419  yrecfm = 'WRLI'
420  CALL make_choice_array(hprogram, io%NPATCH, gdim, yrecfm, zwork)
421 DO jp = 1,io%NPATCH
422  CALL pack_same_rank(np%AL(jp)%NR_P,zwork(:,jp),npe%AL(jp)%XWRLI(:))
423 ENDDO
424 !
425 !* snow intercepted on vegetation canopy leaves
426 !
427  yrecfm = 'WRVN'
428  CALL make_choice_array(hprogram, io%NPATCH, gdim, yrecfm, zwork)
429 DO jp = 1,io%NPATCH
430  CALL pack_same_rank(np%AL(jp)%NR_P,zwork(:,jp),npe%AL(jp)%XWRVN(:))
431 ENDDO
432 !
433 !* vegetation canopy temperature
434 !
435  yrecfm = 'TV'
436  CALL make_choice_array(hprogram, io%NPATCH, gdim, yrecfm, zwork)
437 DO jp = 1,io%NPATCH
438  CALL pack_same_rank(np%AL(jp)%NR_P,zwork(:,jp),npe%AL(jp)%XTV(:))
439 ENDDO
440 !
441 !* litter temperature
442 !
443  yrecfm = 'TL'
444  CALL make_choice_array(hprogram, io%NPATCH, gdim, yrecfm, zwork)
445 DO jp = 1,io%NPATCH
446  CALL pack_same_rank(np%AL(jp)%NR_P,zwork(:,jp),npe%AL(jp)%XTL(:))
447 ENDDO
448 !
449 !* vegetation canopy air temperature
450 !
451  yrecfm = 'TC'
452  CALL make_choice_array(hprogram, io%NPATCH, gdim, yrecfm, zwork)
453 DO jp = 1,io%NPATCH
454  CALL pack_same_rank(np%AL(jp)%NR_P,zwork(:,jp),npe%AL(jp)%XTC(:))
455 ENDDO
456 !
457 !* vegetation canopy air specific humidity
458 !
459  yrecfm = 'QC'
460  CALL make_choice_array(hprogram, io%NPATCH, gdim, yrecfm, zwork)
461 DO jp = 1,io%NPATCH
462  CALL pack_same_rank(np%AL(jp)%NR_P,zwork(:,jp),npe%AL(jp)%XQC(:))
463 ENDDO
464 !
465 ENDIF
466 !
467 !-------------------------------------------------------------------------------
468 !
469 !* 4. Semi-prognostic variables
470 ! -------------------------
471 !
472 DO jp = 1,io%NPATCH
473  pk => np%AL(jp)
474  pek => npe%AL(jp)
475 
476  ALLOCATE(pek%XRESA(pk%NSIZE_P))
477  ALLOCATE(pek%XLE (pk%NSIZE_P))
478  pek%XRESA(:) = 100.
479  pek%XLE(:) = 0.
480 
481  IF (io%CPHOTO/='NON') THEN
482  ALLOCATE(pek%XANFM (pk%NSIZE_P))
483  ALLOCATE(pek%XAN (pk%NSIZE_P))
484  ALLOCATE(pek%XANDAY (pk%NSIZE_P))
485  pek%XANFM (:) = xanfminit
486  pek%XAN (:) = 0.
487  pek%XANDAY(:) = 0.
488  !
489  ALLOCATE(pek%XBIOMASS (pk%NSIZE_P,io%NNBIOMASS))
490  ALLOCATE(pek%XRESP_BIOMASS (pk%NSIZE_P,io%NNBIOMASS))
491  pek%XBIOMASS(:,:) = 0.
492  pek%XRESP_BIOMASS(:,:) = 0.
493  END IF
494 
495 ENDDO
496 !
497 !
498 !* aerodynamical resistance
499 !
500 yrecfm = 'RESA'
501  CALL make_choice_array(hprogram, io%NPATCH, gdim, yrecfm, zwork)
502 DO jp = 1,io%NPATCH
503  CALL pack_same_rank(np%AL(jp)%NR_P,zwork(:,jp),npe%AL(jp)%XRESA(:))
504 ENDDO
505 !
506 !* patch averaged radiative temperature (K)
507 !
508 ALLOCATE(s%XTSRAD_NAT(ilu))
509 IF (iversion<6) THEN
510  s%XTSRAD_NAT(:)=0.
511  DO jp=1,io%NPATCH
512  DO ji = 1,np%AL(jp)%NSIZE_P
513  imask = np%AL(jp)%NR_P(ji)
514  s%XTSRAD_NAT(imask) = s%XTSRAD_NAT(imask)+npe%AL(jp)%XTG(ji,1)
515  ENDDO
516  ENDDO
517  s%XTSRAD_NAT(:)=s%XTSRAD_NAT(:)/io%NPATCH
518 ELSE
519  yrecfm='TSRAD_NAT'
520  CALL read_surf(hprogram,yrecfm,s%XTSRAD_NAT(:),iresp)
521 ENDIF
522 !
523 DO jp = 1,io%NPATCH
524  npe%AL(jp)%XLE(:) = xundef
525 ENDDO
526 !
527 !* 5. ISBA-AGS variables
528 !
529 IF (io%CPHOTO/='NON') THEN
530  yrecfm = 'AN'
531  CALL make_choice_array(hprogram, io%NPATCH, gdim, yrecfm, zwork)
532  DO jp = 1,io%NPATCH
533  CALL pack_same_rank(np%AL(jp)%NR_P,zwork(:,jp),npe%AL(jp)%XAN(:))
534  ENDDO
535  !
536  yrecfm = 'ANDAY'
537  CALL make_choice_array(hprogram, io%NPATCH, gdim, yrecfm, zwork)
538  DO jp = 1,io%NPATCH
539  CALL pack_same_rank(np%AL(jp)%NR_P,zwork(:,jp),npe%AL(jp)%XANDAY(:))
540  ENDDO
541  !
542  yrecfm = 'ANFM'
543  CALL make_choice_array(hprogram, io%NPATCH, gdim, yrecfm, zwork)
544  DO jp = 1,io%NPATCH
545  CALL pack_same_rank(np%AL(jp)%NR_P,zwork(:,jp),npe%AL(jp)%XANFM(:))
546  ENDDO
547  !
548  yrecfm = 'LE_AGS'
549  CALL make_choice_array(hprogram, io%NPATCH, gdim, yrecfm, zwork)
550  DO jp = 1,io%NPATCH
551  CALL pack_same_rank(np%AL(jp)%NR_P,zwork(:,jp),npe%AL(jp)%XLE(:))
552  ENDDO
553 END IF
554 !
555 IF (io%CPHOTO=='NIT'.OR.io%CPHOTO=='NCB') THEN
556  !
557  ALLOCATE(zwork3d(ilu,io%NNBIOMASS,io%NPATCH))
558  IF (iversion>7 .OR. iversion==7 .AND. ibugfix>=3) THEN
559  yrecfm='BIOMA'
560  ELSE
561  yrecfm='BIOMASS'
562  ENDIF
563  CALL read_surf_layers(hprogram,yrecfm,gdim,zwork3d,iresp)
564  DO jnb=1,io%NNBIOMASS
565  WRITE(ylvl,'(I1)') jnb
566  IF ( trim(cassim_isba)=="EKF" .AND. lprt ) THEN
567  ycbio = yrecfm(:len_trim(yrecfm))//adjustl(ylvl(:len_trim(ylvl)))
568  ! read in control variable
569  IF ( trim(cvar(nivar)) == "LAI" .AND. trim(cbio)==trim(ycbio) ) THEN
570  WHERE ( zwork3d(:,jnb,:)/=xundef )
571  zwork3d(:,jnb,:) = zwork3d(:,jnb,:) * ( 1. + xtprt(nivar) )
572  ENDWHERE
573  ENDIF
574  ELSEIF ( trim(cassim_isba)=="ENKF" .AND. nie<nens+1 .AND. .NOT.lassim ) THEN
575  !
576  IF ( trim(cbio)==trim(yrecfm) ) THEN
577  DO jvar = 1,nvar
578  IF (trim(cvar(jvar)) == "LAI") THEN
579  DO ji = 1,ilu
580  DO jp = 1,io%NPATCH
581  zwork3d(ji,jnb,jp) = zwork3d(ji,jnb,jp) + xaddinfl(jvar)*random_normal()
582  ENDDO
583  ENDDO
584  EXIT
585  ENDIF
586  ENDDO
587  ENDIF
588  !
589  ENDIF
590  DO jp = 1,io%NPATCH
591  CALL pack_same_rank(np%AL(jp)%NR_P,zwork3d(:,jnb,jp),npe%AL(jp)%XBIOMASS(:,jnb))
592  ENDDO
593  END DO
594  DEALLOCATE(zwork3d)
595 !
596  iwork=0
597  IF(io%CPHOTO=='NCB'.OR.iversion<8)iwork=2
598 !
599  DO jnb=2,io%NNBIOMASS-iwork
600  WRITE(ylvl,'(I1)') jnb
601  IF (iversion>7 .OR. (iversion==7 .AND. ibugfix>=3)) THEN
602  yrecfm='RESPI'//adjustl(ylvl(:len_trim(ylvl)))
603  ELSE
604  yrecfm='RESP_BIOM'//adjustl(ylvl(:len_trim(ylvl)))
605  ENDIF
606  CALL make_choice_array(hprogram, io%NPATCH, gdim, yrecfm, zwork)
607  IF ( trim(cassim_isba)=="EKF" .AND. lprt ) THEN
608  ! read in control variable
609  IF ( trim(cvar(nivar)) == "LAI" .AND. trim(cbio)==trim(yrecfm) ) THEN
610  WHERE ( zwork(:,:)/=xundef )
611  zwork(:,:) = zwork(:,:) + xtprt(nivar)*zwork(:,:)
612  ENDWHERE
613  ELSEIF ( trim(cassim_isba)=="ENKF" .AND. nie<nens+1 .AND. .NOT.lassim ) THEN
614  !
615  IF ( trim(cbio)==trim(yrecfm) ) THEN
616  DO jvar = 1,nvar
617  IF (trim(cvar(jvar)) == "LAI") THEN
618  DO ji = 1,ilu
619  DO jp = 1,io%NPATCH
620  zwork(ji,jp) = zwork(ji,jp) + xaddinfl(jvar)*random_normal()
621  ENDDO
622  ENDDO
623  EXIT
624  ENDIF
625  ENDDO
626  ENDIF
627  !
628  ENDIF
629  ENDIF
630  DO jp = 1,io%NPATCH
631  CALL pack_same_rank(np%AL(jp)%NR_P,zwork(:,jp),npe%AL(jp)%XRESP_BIOMASS(:,jnb))
632  ENDDO
633  END DO
634  !
635 ENDIF
636 !
637 DEALLOCATE(zcofswi)
638 !
639 !* 6. Soil carbon
640 !
641 !
642 IF (io%CRESPSL=='CNT') THEN
643  !
644  DO jp = 1,io%NPATCH
645  pk => np%AL(jp)
646  pek => npe%AL(jp)
647  ALLOCATE(pek%XLITTER (pk%NSIZE_P,io%NNLITTER,io%NNLITTLEVS))
648  ALLOCATE(pek%XSOILCARB (pk%NSIZE_P,io%NNSOILCARB))
649  ALLOCATE(pek%XLIGNIN_STRUC(pk%NSIZE_P,io%NNLITTLEVS))
650  !
651  pek%XLITTER(:,:,:) = 0.
652  pek%XSOILCARB(:,:) = 0.
653  pek%XLIGNIN_STRUC(:,:) = 0.
654  !
655  ENDDO
656  !
657  DO jnlitter=1,io%NNLITTER
658  DO jnlittlevs=1,io%NNLITTLEVS
659  WRITE(ylvl,'(I1,A1,I1)') jnlitter,'_',jnlittlevs
660  yrecfm='LITTER'//adjustl(ylvl(:len_trim(ylvl)))
661  CALL make_choice_array(hprogram, io%NPATCH, gdim, yrecfm, zwork)
662  DO jp = 1,io%NPATCH
663  CALL pack_same_rank(np%AL(jp)%NR_P,zwork(:,jp),npe%AL(jp)%XLITTER(:,jnlitter,jnlittlevs))
664  ENDDO
665  END DO
666  END DO
667 
668  DO jnsoilcarb=1,io%NNSOILCARB
669  WRITE(ylvl,'(I4)') jnsoilcarb
670  yrecfm='SOILCARB'//adjustl(ylvl(:len_trim(ylvl)))
671  CALL make_choice_array(hprogram, io%NPATCH, gdim, yrecfm, zwork)
672  DO jp = 1,io%NPATCH
673  CALL pack_same_rank(np%AL(jp)%NR_P,zwork(:,jp),npe%AL(jp)%XSOILCARB(:,jnsoilcarb))
674  ENDDO
675  END DO
676 !
677  DO jnlittlevs=1,io%NNLITTLEVS
678  WRITE(ylvl,'(I4)') jnlittlevs
679  yrecfm='LIGN_STR'//adjustl(ylvl(:len_trim(ylvl)))
680  CALL make_choice_array(hprogram, io%NPATCH, gdim, yrecfm, zwork)
681  DO jp = 1,io%NPATCH
682  CALL pack_same_rank(np%AL(jp)%NR_P,zwork(:,jp),npe%AL(jp)%XSOILCARB(:,jnlittlevs))
683  ENDDO
684  END DO
685 !
686 ENDIF
687 
688 IF ( lassim ) THEN
689  IF ( trim(cassim_isba) == "OI" ) THEN
690  IF ( io%NPATCH /= 1 ) CALL abor1_sfx ('Reading of diagnostical values for'&
691  & //'assimilation at the moment only works for one patch for OI')
692  ! Diagnostic fields for assimilation
693  IF ( .NOT. ALLOCATED(xat2m_isba)) ALLOCATE(xat2m_isba(ilu,1))
694  xat2m_isba=xundef
695  yrecfm='T2M'
696  CALL io_buff(yrecfm,'R',gknown)
697  CALL read_surf(hprogram,yrecfm,xat2m_isba(:,1),iresp)
698 
699  IF ( .NOT. ALLOCATED(xahu2m_isba)) ALLOCATE(xahu2m_isba(ilu,1))
700  xahu2m_isba=xundef
701  yrecfm='HU2M'
702  CALL io_buff(yrecfm,'R',gknown)
703  CALL read_surf(hprogram,yrecfm,xahu2m_isba(:,1),iresp)
704 
705  IF ( .NOT. ALLOCATED(xazon10m_isba)) ALLOCATE(xazon10m_isba(ilu,1))
706  xazon10m_isba=xundef
707  yrecfm='ZON10M'
708  CALL io_buff(yrecfm,'R',gknown)
709  CALL read_surf(hprogram,yrecfm,xazon10m_isba(:,1),iresp)
710 
711  IF ( .NOT. ALLOCATED(xamer10m_isba)) ALLOCATE(xamer10m_isba(ilu,1))
712  xamer10m_isba=xundef
713  yrecfm='MER10M'
714  CALL io_buff(yrecfm,'R',gknown)
715  CALL read_surf(hprogram,yrecfm,xamer10m_isba(:,1),iresp)
716  ELSEIF ( nific/=nvar+2 ) THEN
717  ! Diagnostic fields for EKF assimilation ("observations")
718  DO iobs = 1,nobstype
719  SELECT CASE (trim(cobs(iobs)))
720  CASE("T2M")
721  IF ( .NOT. ALLOCATED(xat2m_isba)) ALLOCATE(xat2m_isba(ilu,1))
722  xat2m_isba=xundef
723  yrecfm='T2M'
724  CALL io_buff(yrecfm,'R',gknown)
725  CALL read_surf(hprogram,yrecfm,xat2m_isba(:,1),iresp)
726  CASE("HU2M")
727  IF ( .NOT. ALLOCATED(xahu2m_isba)) ALLOCATE(xahu2m_isba(ilu,1))
728  xahu2m_isba=xundef
729  yrecfm='HU2M'
730  CALL io_buff(yrecfm,'R',gknown)
731  CALL read_surf(hprogram,yrecfm,xahu2m_isba(:,1),iresp)
732  CASE("WG1")
733  ! This is already read above
734  CASE("WG2")
735  ! This is already read above
736  CASE("LAI")
737  ! This is already read above
738  CASE("SWE")
739  ! This is handled independently
740  CASE DEFAULT
741  CALL abor1_sfx("Mapping of "//trim(cobs(iobs))//" is not defined in READ_ISBA_n!")
742  END SELECT
743  ENDDO
744  ENDIF
745 ENDIF
746 !
747 DEALLOCATE(zwork)
748 !
749 DO jp = 1,io%NPATCH
750  pk => np%AL(jp)
751  pek => npe%AL(jp)
752  ALLOCATE(pek%XSNOWFREE_ALB (pk%NSIZE_P))
753  ALLOCATE(pek%XSNOWFREE_ALB_VEG (pk%NSIZE_P))
754  ALLOCATE(pek%XSNOWFREE_ALB_SOIL(pk%NSIZE_P))
755 ENDDO
756 !
757 IF (lhook) CALL dr_hook('READ_ISBA_N',1,zhook_handle)
758 !
759 CONTAINS
760 !
761 SUBROUTINE make_ens_enkf(KWORK,KLU,HREC,PCOFSWI,NP,PVAR)
762 !
763 USE modd_assim, ONLY : lens_gen, xaddtimecorr, xaddinfl, xassim_winh
764 !
765 USE modi_add_noise
766 USE mode_random
767 !
768 IMPLICIT NONE
769 !
770 INTEGER, INTENT(IN) :: KWORK
771 INTEGER, INTENT(IN) :: KLU
772  CHARACTER(LEN=3), INTENT(IN) :: HREC
773 REAL, DIMENSION(:), INTENT(IN) :: PCOFSWI
774 TYPE(isba_np_t), INTENT(INOUT) :: NP
775 REAL, DIMENSION(:,:,:), INTENT(INOUT), OPTIONAL :: PVAR
776 !
777  CHARACTER(LEN=12) :: YRECFM ! Name of the article to be read
778  CHARACTER(LEN=4) :: YLVL
779  CHARACTER(LEN=3) :: YVAR
780 REAL, DIMENSION(KLU) :: ZVAR
781 REAL :: ZWHITE_NOISE, ZVAR0
782 INTEGER :: JL, JI, JP, IVAR
783 LOGICAL :: GPASS
784 !
785 REAL(KIND=JPRB) :: ZHOOK_HANDLE
786 !
787 IF (lhook) CALL dr_hook('READ_ISBA_N:MAKE_ENS_ENKF',0,zhook_handle)
788 !
789 !
790 DO jl=1,kwork
791  !
792  IF (kwork>1) THEN
793  WRITE(ylvl,'(I4)') jl
794  yrecfm = trim(hrec)//adjustl(ylvl(:len_trim(ylvl)))
795  ELSE
796  yrecfm = trim(hrec)
797  ENDIF
798  !
799  ivar = 0
800  DO jvar = 1,nvar
801  gpass = ( trim(cvar(jvar))==trim(yrecfm) )
802  IF (gpass) THEN
803  ivar = jvar
804  EXIT
805  ENDIF
806  ENDDO
807  !
808  IF ( gpass ) THEN
809  !
810  IF (xaddinfl(ivar)>0.) THEN
811  !
812  IF (lassim .OR. (.NOT.lens_gen .AND. xaddtimecorr(ivar)>0.)) THEN
813  !
814  WRITE(yvar,'(I3)') ivar
815  yrecfm='RD_NS'//adjustl(yvar(:len_trim(yvar)))
816  CALL make_choice_array(hprogram, io%NPATCH, gdim, yrecfm, zwork)
817  DO jp = 1,io%NPATCH
818  CALL pack_same_rank(np%AL(jp)%NR_P,zwork(:,jp),np%AL(jp)%XRED_NOISE(:,ivar))
819  ENDDO
820  !
821  IF (.NOT.lassim) THEN
822  !
823  DO jp = 1,io%NPATCH
824  pk => np%AL(jp)
825  DO ji = 1,np%AL(jp)%NSIZE_P
826  imask = pk%NR_P(ji)
827  zwhite_noise = xaddinfl(ivar)*pcofswi(imask)*random_normal()
828  CALL add_noise(xaddtimecorr(ivar),xassim_winh,zwhite_noise,pk%XRED_NOISE(ji,ivar))
829  ENDDO
830  ENDDO
831  !
832  zcoef = xassim_winh/24.
833  !
834  ENDIF
835  !
836  ELSE
837  !
838  DO jp = 1,io%NPATCH
839  pk => np%AL(jp)
840  DO ji = 1,np%AL(jp)%NSIZE_P
841  imask = pk%NR_P(ji)
842  np%AL(jp)%XRED_NOISE(ji,ivar) = xaddinfl(ivar)*pcofswi(imask)*random_normal()
843  ENDDO
844  ENDDO
845  !
846  zcoef = 1.
847  !
848  ENDIF
849  !
850  IF (.NOT.lassim) THEN
851  !
852  DO jp = 1,io%NPATCH
853  !
854  zvar(:) = 0.
855  IF (trim(hrec)=='TG') THEN
856  zvar(1:np%AL(jp)%NSIZE_P) = npe%AL(jp)%XTG(:,jl)
857  ELSEIF (trim(hrec)=='WG') THEN
858  zvar(1:np%AL(jp)%NSIZE_P) = npe%AL(jp)%XWG(:,jl)
859  ELSEIF (trim(hrec)=='LAI' .AND. PRESENT(pvar)) THEN
860  zvar(1:np%AL(jp)%NSIZE_P) = pvar(1:np%AL(jp)%NSIZE_P,jl,jp)
861  ELSE
862  CALL abor1_sfx("READ_ISBAn: HREC "//hrec//" not permitted")
863  ENDIF
864  !
865  DO ji = 1,np%AL(jp)%NSIZE_P
866  IF ( zvar(ji)/=xundef ) THEN
867  !
868  zvar0 = zvar(ji)
869  !
870  zvar(ji) = zvar(ji) + zcoef * np%AL(jp)%XRED_NOISE(ji,ivar)
871  !
872  IF (zvar(ji) < 0.) THEN
873  IF (lens_gen) THEN
874  zvar(ji) = abs(zvar(ji))
875  ELSE
876  zvar(ji) = zvar0
877  ENDIF
878  ENDIF
879  ENDIF
880  ENDDO
881  !
882  IF (trim(hrec)=='TG') THEN
883  npe%AL(jp)%XTG(:,jl) = zvar(1:np%AL(jp)%NSIZE_P)
884  ELSEIF (trim(hrec)=='WG') THEN
885  npe%AL(jp)%XWG(:,jl) = zvar(1:np%AL(jp)%NSIZE_P)
886  ELSEIF (trim(hrec)=='LAI') THEN
887  pvar(1:np%AL(jp)%NSIZE_P,jl,jp) = zvar(1:np%AL(jp)%NSIZE_P)
888  ENDIF
889  !
890  ENDDO
891  !
892  ENDIF
893  !
894  ENDIF
895  !
896  ENDIF
897  !
898 ENDDO
899 !
900 IF (lhook) CALL dr_hook('READ_ISBA_N:MAKE_ENS_ENKF',1,zhook_handle)
901 !
902 END SUBROUTINE make_ens_enkf
903 !
904 !-------------------------------------------------------------------------------
905 !
906 END SUBROUTINE read_isba_n
subroutine get_type_dim_n(DTCO, U, HTYPE, KDIM)
static const char * trim(const char *name, int *n)
Definition: drhook.c:2383
subroutine read_isba_n(DTCO, IO, S, NP, NPE, PCLAY, U, HPROGRAM)
Definition: read_isban.F90:7
subroutine make_choice_array(HPROGRAM, KNPATCH, ODIM, HRECFM, PWORK, HDIR, KPATCH)
subroutine io_buff_clean
subroutine read_surf_layers(HPROGRAM, HREC, ODIM, PFIELD, KRESP, HCOMMENT, HDIR, KPATCH)
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:7
real, parameter xundef
integer, parameter jprb
Definition: parkind1.F90:32
integer, parameter nundef
logical lhook
Definition: yomhook.F90:15
subroutine make_ens_enkf(KWORK, KLU, HREC, PCOFSWI, NP, PVAR)
Definition: read_isban.F90:762
subroutine io_buff(HREC, HACTION, OKNOWN)
Definition: io_buff.F90:8
subroutine read_gr_snow(HPROGRAM, HSURFTYPE, HPREFIX, KLU, KSIZE_P, KMASK_P, KPATCH, TPSNOW, HDI
Definition: read_gr_snow.F90:8
static int count
Definition: memory_hook.c:21