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
77 USE yomhook
,ONLY : lhook, dr_hook
78 USE parkind1
,ONLY : jprb
80 USE modi_get_type_dim_n
91 TYPE(isba_t
),
INTENT(INOUT) :: i
94 CHARACTER(LEN=6),
INTENT(IN) :: hprogram
102 CHARACTER(LEN=12) :: yrecfm
104 CHARACTER(LEN=4) :: ylvl
106 REAL,
DIMENSION(:,:,:),
ALLOCATABLE :: zlai
107 REAL,
DIMENSION(:,:),
ALLOCATABLE :: zwork
108 REAL,
DIMENSION(:),
ALLOCATABLE :: zcofswi
110 REAL,
DIMENSION(I%NPATCH) :: zvlaimin
115 INTEGER :: jp, jl, jnbiomass, jnlitter, jnsoilcarb, jnlittlevs
123 INTEGER :: isize_lmeb_patch
127 REAL(KIND=JPRB) :: zhook_handle
134 IF (lhook) CALL dr_hook(
'READ_ISBA_N',0,zhook_handle)
143 ALLOCATE(zwork(ilu,i%NPATCH))
147 iwork=i%NTEMPLAYER_ARP
148 ELSEIF(i%CISBA==
'DIF')
THEN
149 iwork=i%NGROUND_LAYER
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)
160 ALLOCATE(i%XRED_NOISE(0,0,0))
164 ALLOCATE(i%XTG(ilu,iwork,i%NPATCH))
168 WRITE(ylvl,
'(I4)') jl
169 yrecfm=
'TG'//adjustl(ylvl(:len_trim(ylvl)))
171 hprogram,yrecfm,zwork(:,:),iresp)
172 i%XTG(:,jl,:)=zwork(:,:)
176 IF ( trim(cassim_isba)==
"EKF" .AND. lprt )
THEN
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,:)
188 ELSEIF ( trim(cassim_isba)==
"ENKF" .AND. nie<nens+1 )
THEN
190 CALL
make_ens_enkf(iwork,ilu,
"TG ",zcofswi,i%XTG,i%XRED_NOISE)
197 ALLOCATE(i%XWG (ilu,i%NGROUND_LAYER,i%NPATCH))
198 ALLOCATE(i%XWGI(ilu,i%NGROUND_LAYER,i%NPATCH))
203 DO jl=1,i%NGROUND_LAYER
204 WRITE(ylvl,
'(I4)') jl
205 yrecfm=
'WG'//adjustl(ylvl(:len_trim(ylvl)))
207 hprogram,yrecfm,zwork(:,:),iresp)
208 i%XWG(:,jl,:)=zwork(:,:)
212 IF ( trim(cassim_isba)==
"EKF" .AND. lprt )
THEN
214 DO jl=1,i%NGROUND_LAYER
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,:)
224 ELSEIF ( trim(cassim_isba)==
"ENKF" .AND. nie<nens+1 )
THEN
226 CALL
make_ens_enkf(iwork,ilu,
"WG ",zcofswi,i%XWG,i%XRED_NOISE)
230 IF(i%CISBA==
'DIF')
THEN
231 iwork=i%NGROUND_LAYER
237 WRITE(ylvl,
'(I4)') jl
238 yrecfm=
'WGI'//adjustl(ylvl(:len_trim(ylvl)))
240 hprogram,yrecfm,zwork(:,:),iresp)
241 i%XWGI(:,jl,:)=zwork(:,:)
246 ALLOCATE(i%XWR(ilu,i%NPATCH))
250 hprogram,yrecfm,i%XWR(:,:),iresp)
254 IF (i%CPHOTO==
'LAI' .OR. i%CPHOTO==
'LST' .OR. i%CPHOTO==
'NIT' .OR. i%CPHOTO==
'NCB')
THEN
257 hprogram,yrecfm,i%XLAI(:,:),iresp)
258 IF ( trim(cassim_isba)==
"EKF" .AND. lprt )
THEN
261 IF ( trim(cvar(nivar))==
"LAI" )
THEN
262 WHERE ( i%XLAI(:,:)/=xundef )
263 i%XLAI(:,:) = i%XLAI(:,:) + xtprt(nivar)*i%XLAI(:,:)
267 ELSEIF ( trim(cassim_isba)==
"ENKF" .AND. nie<nens+1 )
THEN
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/)
275 ALLOCATE(zlai(ilu,1,i%NPATCH))
276 zlai(:,1,:) = i%XLAI(:,:)
279 i%XLAI(:,jp) = max(zvlaimin(jp),zlai(:,1,jp))
289 hprogram,
'VEG',
' ',ilu,i%NPATCH,i%TSNOW )
293 hprogram,yrecfm,iversion,iresp)
297 hprogram,yrecfm,ibugfix,iresp)
300 ALLOCATE(i%XICE_STO(ilu,i%NPATCH))
301 IF (iversion>7 .OR. iversion==7 .AND. ibugfix>=2)
THEN
304 hprogram,yrecfm,i%XICE_STO(:,:),iresp)
306 i%XICE_STO(:,:) = 0.0
309 ALLOCATE(i%XICE_STO(0,0))
317 isize_lmeb_patch=count(i%LMEB_PATCH(:))
319 IF (isize_lmeb_patch>0)
THEN
323 ALLOCATE(i%XWRL(ilu,i%NPATCH))
325 CALL
read_surf(hprogram,yrecfm,i%XWRL(:,:),iresp)
327 ALLOCATE(i%XWRLI(ilu,i%NPATCH))
329 CALL
read_surf(hprogram,yrecfm,i%XWRLI(:,:),iresp)
333 ALLOCATE(i%XWRVN(ilu,i%NPATCH))
336 hprogram,yrecfm,i%XWRVN(:,:),iresp)
340 ALLOCATE(i%XTV(ilu,i%NPATCH))
342 CALL
read_surf(hprogram,yrecfm,i%XTV(:,:),iresp)
346 ALLOCATE(i%XTL(ilu,i%NPATCH))
348 CALL
read_surf(hprogram,yrecfm,i%XTL(:,:),iresp)
352 ALLOCATE(i%XTC(ilu,i%NPATCH))
355 hprogram,yrecfm,i%XTC(:,:),iresp)
359 ALLOCATE(i%XQC(ilu,i%NPATCH))
362 hprogram,yrecfm,i%XQC(:,:),iresp)
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))
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))
390 hprogram,yrecfm,i%XRESA(:,:),iresp)
394 ALLOCATE(i%XTSRAD_NAT(ilu))
398 i%XTSRAD_NAT(:)=i%XTSRAD_NAT(:)+i%XTG(:,1,jp)
400 i%XTSRAD_NAT(:)=i%XTSRAD_NAT(:)/i%NPATCH
404 hprogram,yrecfm,i%XTSRAD_NAT(:),iresp)
411 IF (i%CPHOTO/=
'NON')
THEN
415 hprogram,yrecfm,i%XAN(:,:),iresp)
420 hprogram,yrecfm,i%XANDAY(:,:),iresp)
423 i%XANFM(:,:) = xanfminit
425 hprogram,yrecfm,i%XANFM(:,:),iresp)
430 hprogram,yrecfm,i%XLE(:,:),iresp)
433 IF (i%CPHOTO==
'AGS' .OR. i%CPHOTO==
'AST')
THEN
435 i%XBIOMASS(:,:,:) = 0.
436 i%XRESP_BIOMASS(:,:,:) = 0.
438 ELSEIF (i%CPHOTO==
'LAI' .OR. i%CPHOTO==
'LST')
THEN
440 i%XBIOMASS(:,1,:) = i%XBSLAI(:,:) * i%XLAI(:,:)
441 i%XRESP_BIOMASS(:,:,:) = 0.
443 ELSEIF (i%CPHOTO==
'NIT'.OR.i%CPHOTO==
'NCB')
THEN
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)))
451 yrecfm=
'BIOMASS'//adjustl(ylvl(:len_trim(ylvl)))
454 hprogram,yrecfm,zwork(:,:),iresp)
455 IF ( trim(cassim_isba)==
"EKF" .AND. lprt )
THEN
457 IF ( trim(cvar(nivar)) ==
"LAI" .AND. trim(cbio)==trim(yrecfm) )
THEN
458 WHERE ( zwork(:,:)/=xundef )
459 zwork(:,:) = zwork(:,:) + xtprt(nivar)*zwork(:,:)
462 ELSEIF ( trim(cassim_isba)==
"ENKF" .AND. nie<nens+1 .AND. .NOT.lassim )
THEN
464 IF ( trim(cbio)==trim(yrecfm) )
THEN
466 IF (trim(cvar(jvar)) ==
"LAI")
THEN
478 i%XBIOMASS(:,jnbiomass,:)=zwork
482 IF(i%CPHOTO==
'NCB'.OR.iversion<8)iwork=2
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)))
490 yrecfm=
'RESP_BIOM'//adjustl(ylvl(:len_trim(ylvl)))
493 hprogram,yrecfm,zwork(:,:),iresp)
494 IF ( trim(cassim_isba)==
"EKF" .AND. lprt )
THEN
496 IF ( trim(cvar(nivar)) ==
"LAI" .AND. trim(cbio)==trim(yrecfm) )
THEN
497 WHERE ( zwork(:,:)/=xundef )
498 zwork(:,:) = zwork(:,:) + xtprt(nivar)*zwork(:,:)
500 ELSEIF ( trim(cassim_isba)==
"ENKF" .AND. nie<nens+1 .AND. .NOT.lassim )
THEN
502 IF ( trim(cbio)==trim(yrecfm) )
THEN
504 IF (trim(cvar(jvar)) ==
"LAI")
THEN
517 i%XRESP_BIOMASS(:,jnbiomass,:)=zwork
527 IF (i%CRESPSL==
'CNT')
THEN
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))
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)))
539 hprogram,yrecfm,zwork(:,:),iresp)
540 i%XLITTER(:,jnlitter,jnlittlevs,:)=zwork
544 i%XSOILCARB(:,:,:) = 0.
545 DO jnsoilcarb=1,i%NNSOILCARB
546 WRITE(ylvl,
'(I4)') jnsoilcarb
547 yrecfm=
'SOILCARB'//adjustl(ylvl(:len_trim(ylvl)))
549 hprogram,yrecfm,zwork(:,:),iresp)
550 i%XSOILCARB(:,jnsoilcarb,:)=zwork
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)))
558 hprogram,yrecfm,zwork(:,:),iresp)
559 i%XLIGNIN_STRUC(:,jnlittlevs,:)=zwork
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')
569 IF ( .NOT.
ALLOCATED(xat2m_isba))
ALLOCATE(xat2m_isba(ilu,1))
572 CALL
io_buff(yrecfm,
'R',gknown)
574 hprogram,yrecfm,xat2m_isba(:,1),iresp)
576 IF ( .NOT.
ALLOCATED(xahu2m_isba))
ALLOCATE(xahu2m_isba(ilu,1))
579 CALL
io_buff(yrecfm,
'R',gknown)
581 hprogram,yrecfm,xahu2m_isba(:,1),iresp)
583 IF ( .NOT.
ALLOCATED(xazon10m_isba))
ALLOCATE(xazon10m_isba(ilu,1))
586 CALL
io_buff(yrecfm,
'R',gknown)
588 hprogram,yrecfm,xazon10m_isba(:,1),iresp)
590 IF ( .NOT.
ALLOCATED(xamer10m_isba))
ALLOCATE(xamer10m_isba(ilu,1))
593 CALL
io_buff(yrecfm,
'R',gknown)
595 hprogram,yrecfm,xamer10m_isba(:,1),iresp)
596 ELSEIF ( nific/=nvar+2 )
THEN
599 SELECT CASE (trim(cobs(iobs)))
601 IF ( .NOT.
ALLOCATED(xat2m_isba))
ALLOCATE(xat2m_isba(ilu,1))
604 CALL
io_buff(yrecfm,
'R',gknown)
606 hprogram,yrecfm,xat2m_isba(:,1),iresp)
608 IF ( .NOT.
ALLOCATED(xahu2m_isba))
ALLOCATE(xahu2m_isba(ilu,1))
611 CALL
io_buff(yrecfm,
'R',gknown)
613 hprogram,yrecfm,xahu2m_isba(:,1),iresp)
621 CALL
abor1_sfx(
"Mapping of "//trim(cobs(iobs))//
" is not defined in READ_ISBA_n!")
629 IF (lhook) CALL dr_hook(
'READ_ISBA_N',1,zhook_handle)
635 USE modd_assim, ONLY : lens_gen, xaddtimecorr, xaddinfl, xassim_winh
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
649 CHARACTER(LEN=12) :: yrecfm
650 CHARACTER(LEN=4) :: ylvl
651 CHARACTER(LEN=3) :: yvar
652 REAL :: zwhite_noise, zvar0
653 INTEGER :: jl, ji, jp, ivar
656 REAL(KIND=JPRB) :: zhook_handle
658 IF (lhook) CALL dr_hook(
'READ_ISBA_N:MAKE_ENS_ENKF',0,zhook_handle)
664 WRITE(ylvl,
'(I4)') jl
665 yrecfm = trim(hrec)//adjustl(ylvl(:len_trim(ylvl)))
672 gpass = ( trim(cvar(jvar))==trim(yrecfm) )
681 IF (xaddinfl(ivar)>0.)
THEN
685 WRITE(yvar,
'(I3)') ivar
686 yrecfm=
'RED_NOISE'//adjustl(yvar(:len_trim(yvar)))
687 CALL
read_surf(hprogram,yrecfm,pred_noise(:,:,ivar),iresp)
689 ELSEIF (.NOT.lens_gen .AND. xaddtimecorr(ivar)>0. )
THEN
691 WRITE(yvar,
'(I3)') ivar
692 yrecfm=
'RED_NOISE'//adjustl(yvar(:len_trim(yvar)))
693 CALL
read_surf(hprogram,yrecfm,pred_noise(:,:,ivar),iresp)
698 CALL
add_noise(xaddtimecorr(ivar),xassim_winh,zwhite_noise,pred_noise(ji,jp,ivar))
702 zcoef = xassim_winh/24.
708 pred_noise(ji,jp,ivar) = xaddinfl(ivar)*pcofswi(ji)*
random_normal()
716 IF (.NOT.lassim)
THEN
720 IF ( pvar(ji,jl,jp)/=xundef )
THEN
722 zvar0 = pvar(ji,jl,jp)
724 pvar(ji,jl,jp) = pvar(ji,jl,jp) + zcoef * pred_noise(ji,jp,ivar)
726 IF (pvar(ji,jl,jp) < 0.)
THEN
728 pvar(ji,jl,jp) = abs(pvar(ji,jl,jp))
730 pvar(ji,jl,jp) = zvar0
745 IF (lhook) CALL dr_hook(
'READ_ISBA_N:MAKE_ENS_ENKF',1,zhook_handle)
subroutine get_type_dim_n(DTCO, U, HTYPE, KDIM)
subroutine add_noise(PADDTIMECORR, PASSIM_WINH, PWHITE_NOISE, PRED_NOISE)
subroutine read_isba_n(DTCO, I, U, HPROGRAM)
real function random_normal()
subroutine abor1_sfx(YTEXT)
subroutine make_ens_enkf(KWORK, KLU, HREC, PCOFSWI, PVAR, PRED_NOISE)
subroutine io_buff(HREC, HACTION, OKNOWN)
subroutine read_gr_snow(HPROGRAM, HSURFTYPE, HPREFIX, KLU, KPATCH, TPSNOW, HDIR, KVERSION, KBUGFIX)