6 SUBROUTINE read_isba_n (DTCO, IO, S, NP, NPE, PCLAY, U, HPROGRAM)
57 USE modd_co2v_par
, ONLY : xanfminit, xcondctmin
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
65 USE modd_snow_par
, ONLY : xz0sn
66 USE modd_isba_par
, ONLY : xwgmin
71 USE modi_make_choice_array
81 USE modi_io_buff_clean
82 USE modi_get_type_dim_n
97 REAL,
DIMENSION(:,:),
INTENT(IN) :: PCLAY
100 CHARACTER(LEN=6),
INTENT(IN) :: HPROGRAM
112 CHARACTER(LEN=12) :: YRECFM
113 CHARACTER(LEN=12) :: YCBIO
115 CHARACTER(LEN=4) :: YLVL
117 REAL,
DIMENSION(:,:,:),
ALLOCATABLE :: ZLAI
118 REAL,
DIMENSION(:,:,:),
ALLOCATABLE :: ZWORK3D
119 REAL,
DIMENSION(:,:),
ALLOCATABLE :: ZWORK
120 REAL,
DIMENSION(:),
ALLOCATABLE :: ZCOFSWI
122 REAL,
DIMENSION(IO%NPATCH) :: ZVLAIMIN
127 INTEGER :: JP, JL, JNB, JNLITTER, JNSOILCARB, JNLITTLEVS
135 INTEGER :: ISIZE_LMEB_PATCH, IMASK
137 LOGICAL :: GKNOWN, GDIM
139 REAL(KIND=JPRB) :: ZHOOK_HANDLE
151 CALL read_surf(hprogram,yrecfm,iversion,iresp)
154 CALL read_surf(hprogram,yrecfm,ibugfix,iresp)
156 gdim = (iversion>8 .OR. iversion==8 .AND. ibugfix>0)
157 IF (gdim)
CALL read_surf(hprogram,
'SPLIT_PATCH',gdim,iresp)
160 CALL read_surf(hprogram,yrecfm,ibugfix,iresp)
165 ALLOCATE(zwork(ilu,io%NPATCH))
169 iwork=io%NTEMPLAYER_ARP
170 ELSEIF(io%CISBA==
'DIF')
THEN 171 iwork=io%NGROUND_LAYER
176 IF (
trim(cassim_isba)==
"ENKF")
THEN 179 ALLOCATE(pk%XRED_NOISE(pk%NSIZE_P,nvar))
180 pk%XRED_NOISE(:,:) = 0.
184 ALLOCATE(np%AL(jp)%XRED_NOISE(0,0))
188 IF (
trim(cassim_isba)==
"ENKF" .OR. (
trim(cassim_isba)==
"EKF" .AND. lprt
THEN 189 ALLOCATE(zcofswi(ilu))
190 CALL cofswi(pclay(:,1),zcofswi)
199 ALLOCATE(pek%XTG(pk%NSIZE_P,iwork))
201 ALLOCATE(pek%XWG (pk%NSIZE_P,io%NGROUND_LAYER))
202 ALLOCATE(pek%XWGI(pk%NSIZE_P,io%NGROUND_LAYER))
208 ALLOCATE(pek%XWR(pk%NSIZE_P))
212 ALLOCATE(zwork3d(ilu,iwork,io%NPATCH))
216 CALL pack_same_rank(np%AL(jp)%NR_P,zwork3d(:,jl,jp),npe%AL(jp)%XTG(:
222 IF (
trim(cassim_isba)==
"EKF" .AND. lprt )
THEN 226 IF ( (
trim(cvar(nivar))==
"TG1" .AND. jl==1) .OR. (
trim(cvar(nivar))=
"TG2"THEN 229 WHERE ( pek%XTG(:,jl)/=
xundef )
230 pek%XTG(:,jl) = pek%XTG(:,jl) + xtprt(nivar)*pek%XTG(:,jl)
236 ELSEIF (
trim(cassim_isba)==
"ENKF" .AND. nie<nens+1 )
THEN 245 ALLOCATE(zwork3d(ilu,io%NGROUND_LAYER,io%NPATCH))
247 DO jl=1,io%NGROUND_LAYER
249 CALL pack_same_rank(np%AL(jp)%NR_P,zwork3d(:,jl,jp),npe%AL(jp)%XWG(:
255 IF (
trim(cassim_isba)==
"EKF" .AND. lprt )
THEN 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 273 IF (pek%XWG(ji,jl)/=
xundef )
THEN 274 pek%XWG(ji,jl) = pek%XWG(ji,jl) + xtprt(nivar) * zcofswi(imask
283 ELSEIF (
trim(cassim_isba)==
"ENKF" .AND. nie<nens+1 )
THEN 289 IF(io%CISBA==
'DIF')
THEN 290 iwork=io%NGROUND_LAYER
295 ALLOCATE(zwork3d(ilu,iwork,io%NPATCH))
299 CALL pack_same_rank(np%AL(jp)%NR_P,zwork3d(:,jl,jp),npe%AL(jp)%XWGI(
315 IF (io%CPHOTO==
'NIT' .OR. io%CPHOTO==
'NCB')
THEN 320 CALL pack_same_rank(np%AL(jp)%NR_P,zwork(:,jp),npe%AL(jp)%XLAI(:))
323 IF (
trim(cassim_isba)==
"EKF" .AND. lprt )
THEN 326 IF (
trim(cvar(nivar))==
"LAI" )
THEN 329 WHERE ( pek%XLAI(:)/=
xundef )
330 pek%XLAI(:) = pek%XLAI(:) + xtprt(nivar)* pek%XLAI(:)
335 ELSEIF (
trim(cassim_isba)==
"ENKF" .AND. nie<nens+1 )
THEN 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/)
343 ALLOCATE(zlai(ilu,1,io%NPATCH))
346 zlai(1:np%AL(jp)%NSIZE_P,1,jp) = npe%AL(jp)%XLAI(:)
350 npe%AL(jp)%XLAI(:) = max(zvlaimin(jp),zlai(1:np%AL(jp)%NSIZE_P,1,jp
361 npe%AL(jp)%TSNOW%SCHEME = npe%AL(1)%TSNOW%SCHEME
362 npe%AL(jp)%TSNOW%NLAYER = npe%AL(1)%TSNOW%NLAYER
364 CALL read_gr_snow(hprogram,
'VEG',
' ',ilu,np%AL(jp)%NSIZE_P,np%AL(jp
371 ALLOCATE(npe%AL(jp)%XICE_STO(np%AL(jp)%NSIZE_P))
373 IF (iversion>7 .OR. iversion==7 .AND. ibugfix>=2)
THEN 377 CALL pack_same_rank(np%AL(jp)%NR_P,zwork(:,jp),npe%AL(jp)%XICE_STO
381 npe%AL(jp)%XICE_STO(:) = 0.0
386 ALLOCATE(npe%AL(jp)%XICE_STO(0))
395 isize_lmeb_patch=
count(io%LMEB_PATCH(:))
397 IF (isize_lmeb_patch>0)
THEN 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))
416 CALL pack_same_rank(np%AL(jp)%NR_P,zwork(:,jp),npe%AL(jp)%XWRL(:))
422 CALL pack_same_rank(np%AL(jp)%NR_P,zwork(:,jp),npe%AL(jp)%XWRLI(:))
430 CALL pack_same_rank(np%AL(jp)%NR_P,zwork(:,jp),npe%AL(jp)%XWRVN(:))
476 ALLOCATE(pek%XRESA(pk%NSIZE_P))
477 ALLOCATE(pek%XLE (pk%NSIZE_P))
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
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.
503 CALL pack_same_rank(np%AL(jp)%NR_P,zwork(:,jp),npe%AL(jp)%XRESA(:))
508 ALLOCATE(s%XTSRAD_NAT(ilu))
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)
517 s%XTSRAD_NAT(:)=s%XTSRAD_NAT(:)/io%NPATCH
520 CALL read_surf(hprogram,yrecfm,s%XTSRAD_NAT(:),iresp)
524 npe%AL(jp)%XLE(:) =
xundef 529 IF (io%CPHOTO/=
'NON')
THEN 539 CALL pack_same_rank(np%AL(jp)%NR_P,zwork(:,jp),npe%AL(jp)%XANDAY(:))
545 CALL pack_same_rank(np%AL(jp)%NR_P,zwork(:,jp),npe%AL(jp)%XANFM(:))
555 IF (io%CPHOTO==
'NIT'.OR.io%CPHOTO==
'NCB')
THEN 557 ALLOCATE(zwork3d(ilu,io%NNBIOMASS,io%NPATCH))
558 IF (iversion>7 .OR. iversion==7 .AND. ibugfix>=3)
THEN 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)))
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) )
574 ELSEIF (
trim(cassim_isba)==
"ENKF" .AND. nie<nens+1 .AND. .NOT.lassim
THEN 576 IF (
trim(cbio)==
trim(yrecfm) )
THEN 578 IF (
trim(cvar(jvar)) ==
"LAI")
THEN 581 zwork3d(ji,jnb,jp) = zwork3d(ji,jnb,jp) + xaddinfl(jvar)
591 CALL pack_same_rank(np%AL(jp)%NR_P,zwork3d(:,jnb,jp),npe%AL(jp)%XBIOMASS
597 IF(io%CPHOTO==
'NCB'.OR.iversion<8)iwork=2
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)))
604 yrecfm=
'RESP_BIOM'//adjustl(ylvl(:len_trim(ylvl)))
607 IF (
trim(cassim_isba)==
"EKF" .AND. lprt )
THEN 609 IF (
trim(cvar(nivar)) ==
"LAI" .AND.
trim(cbio)==
trim(yrecfm) )
THEN 610 WHERE ( zwork(:,:)/=
xundef )
611 zwork(:,:) = zwork(:,:) + xtprt(nivar)*zwork(:,:)
613 ELSEIF (
trim(cassim_isba)==
"ENKF" .AND. nie<nens+1 .AND. .NOT.lassim
THEN 615 IF (
trim(cbio)==
trim(yrecfm) )
THEN 617 IF (
trim(cvar(jvar)) ==
"LAI")
THEN 620 zwork(ji,jp) = zwork(ji,jp) + xaddinfl(jvar)*random_normal
631 CALL pack_same_rank(np%AL(jp)%NR_P,zwork(:,jp),npe%AL(jp)%XRESP_BIOMASS
642 IF (io%CRESPSL==
'CNT')
THEN 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))
651 pek%XLITTER(:,:,:) = 0.
652 pek%XSOILCARB(:,:) = 0.
653 pek%XLIGNIN_STRUC(:,:) = 0.
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)))
668 DO jnsoilcarb=1,io%NNSOILCARB
669 WRITE(ylvl,
'(I4)') jnsoilcarb
670 yrecfm=
'SOILCARB'//adjustl(ylvl(:len_trim(ylvl)))
673 CALL pack_same_rank(np%AL(jp)%NR_P,zwork(:,jp),npe%AL(jp)%XSOILCARB
677 DO jnlittlevs=1,io%NNLITTLEVS
678 WRITE(ylvl,
'(I4)') jnlittlevs
679 yrecfm=
'LIGN_STR'//adjustl(ylvl(:len_trim(ylvl)))
682 CALL pack_same_rank(np%AL(jp)%NR_P,zwork(:,jp),npe%AL(jp)%XSOILCARB
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' 693 IF ( .NOT.
ALLOCATED(xat2m_isba))
ALLOCATE(xat2m_isba(ilu,1))
696 CALL io_buff(yrecfm,
'R',gknown)
697 CALL read_surf(hprogram,yrecfm,xat2m_isba(:,1),iresp)
699 IF ( .NOT.
ALLOCATED(xahu2m_isba))
ALLOCATE(xahu2m_isba(ilu,1))
702 CALL io_buff(yrecfm,
'R',gknown)
703 CALL read_surf(hprogram,yrecfm,xahu2m_isba(:,1),iresp)
705 IF ( .NOT.
ALLOCATED(xazon10m_isba))
ALLOCATE(xazon10m_isba(ilu,1))
708 CALL io_buff(yrecfm,
'R',gknown)
709 CALL read_surf(hprogram,yrecfm,xazon10m_isba(:,1),iresp)
711 IF ( .NOT.
ALLOCATED(xamer10m_isba))
ALLOCATE(xamer10m_isba(ilu,1))
714 CALL io_buff(yrecfm,
'R',gknown)
715 CALL read_surf(hprogram,yrecfm,xamer10m_isba(:,1),iresp)
716 ELSEIF ( nific/=nvar+2 )
THEN 719 SELECT CASE (
trim(cobs(iobs)))
721 IF ( .NOT.
ALLOCATED(xat2m_isba))
ALLOCATE(xat2m_isba(ilu,1))
724 CALL io_buff(yrecfm,
'R',gknown)
725 CALL read_surf(hprogram,yrecfm,xat2m_isba(:,1),iresp)
727 IF ( .NOT.
ALLOCATED(xahu2m_isba))
ALLOCATE(xahu2m_isba(ilu,1))
730 CALL io_buff(yrecfm,
'R',gknown)
731 CALL read_surf(hprogram,yrecfm,xahu2m_isba(:,1),iresp)
741 CALL abor1_sfx(
"Mapping of "//
trim(cobs(iobs))//
" is not defined in READ_ISBA_n!" 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))
763 USE modd_assim
, ONLY : lens_gen, xaddtimecorr, xaddinfl, xassim_winh
770 INTEGER,
INTENT(IN) :: KWORK
771 INTEGER,
INTENT(IN) :: KLU
772 CHARACTER(LEN=3),
INTENT(IN) :: HREC
773 REAL,
DIMENSION(:),
INTENT(IN) :: PCOFSWI
775 REAL,
DIMENSION(:,:,:),
INTENT(INOUT),
OPTIONAL :: PVAR
777 CHARACTER(LEN=12) :: YRECFM
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
785 REAL(KIND=JPRB) :: ZHOOK_HANDLE
787 IF (
lhook)
CALL dr_hook(
'READ_ISBA_N:MAKE_ENS_ENKF',0,zhook_handle)
793 WRITE(ylvl,
'(I4)') jl
794 yrecfm =
trim(hrec)//adjustl(ylvl(:len_trim(ylvl)))
801 gpass = (
trim(cvar(jvar))==
trim(yrecfm) )
810 IF (xaddinfl(ivar)>0.)
THEN 812 IF (lassim .OR. (.NOT.lens_gen .AND. xaddtimecorr(ivar)>0.))
THEN 814 WRITE(yvar,
'(I3)') ivar
815 yrecfm=
'RD_NS'//adjustl(yvar(:len_trim(yvar)))
818 CALL pack_same_rank(np%AL(jp)%NR_P,zwork(:,jp),np%AL(jp)%XRED_NOISE
821 IF (.NOT.lassim)
THEN 825 DO ji = 1,np%AL(jp)%NSIZE_P
827 zwhite_noise = xaddinfl(ivar)*pcofswi(imask)*random_normal
828 CALL add_noise(xaddtimecorr(ivar),xassim_winh,zwhite_noise
832 zcoef = xassim_winh/24.
840 DO ji = 1,np%AL(jp)%NSIZE_P
842 np%AL(jp)%XRED_NOISE(ji,ivar) = xaddinfl(ivar)*pcofswi(imask
850 IF (.NOT.lassim)
THEN 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)
862 CALL abor1_sfx(
"READ_ISBAn: HREC "//hrec//
" not permitted")
865 DO ji = 1,np%AL(jp)%NSIZE_P
866 IF ( zvar(ji)/=
xundef )
THEN 870 zvar(ji) = zvar(ji) + zcoef * np%AL(jp)%XRED_NOISE(ji,ivar
872 IF (zvar(ji) < 0.)
THEN 874 zvar(ji) = abs(zvar(ji))
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)
900 IF (
lhook)
CALL dr_hook(
'READ_ISBA_N:MAKE_ENS_ENKF',1,zhook_handle)
subroutine get_type_dim_n(DTCO, U, HTYPE, KDIM)
static const char * trim(const char *name, int *n)
subroutine read_isba_n(DTCO, IO, S, NP, NPE, PCLAY, U, HPROGRAM)
subroutine make_choice_array(HPROGRAM, KNPATCH, ODIM, HRECFM, PWORK, HDIR, KPATCH)
subroutine read_surf_layers(HPROGRAM, HREC, ODIM, PFIELD, KRESP, HCOMMENT, HDIR, KPATCH)
subroutine abor1_sfx(YTEXT)
integer, parameter nundef
subroutine make_ens_enkf(KWORK, KLU, HREC, PCOFSWI, NP, PVAR)
subroutine io_buff(HREC, HACTION, OKNOWN)
subroutine read_gr_snow(HPROGRAM, HSURFTYPE, HPREFIX, KLU, KSIZE_P, KMASK_P, KPATCH, TPSNOW, HDI