6 hprogram, ki, pt2m, phu2m, htest)
32 USE modd_assim, ONLY : lbev, lbfixed, nobstype, xerrobs, xqcobs, nnco, nvar, nncv, &
33 xscale_q, nprintlev, cvar, xsigma, cbio, xi, &
34 xf_patch, xf, cobs, xscale_qlai,cfile_format_obs, &
35 xalph,nechgu, nboutput, xtprt, xlai_pass, xbio_pass,&
42 USE yommp0
, ONLY : myproc
45 USE yomhook
, ONLY : lhook,dr_hook
46 USE parkind1
, ONLY : jprb
49 USE modi_add_forecast_to_date_surf
58 TYPE(isba_t
),
INTENT(INOUT) :: i
60 CHARACTER(LEN=6),
INTENT(IN) :: hprogram
61 INTEGER,
INTENT(IN) :: ki
62 REAL,
DIMENSION(:),
INTENT(IN) :: pt2m
63 REAL,
DIMENSION(:),
INTENT(IN) :: phu2m
64 CHARACTER(LEN=2),
INTENT(IN) :: htest
68 CHARACTER(LEN=30) :: ybgfile
69 CHARACTER(LEN=19) :: ylfname
70 CHARACTER(LEN=9) :: yfname
71 CHARACTER(LEN=7) :: ymyproc
72 CHARACTER(LEN=1) :: ychar
83 REAL,
DIMENSION(KI) :: zcofswi
87 REAL,
DIMENSION(KI,I%NPATCH,NVAR) :: zcoef
88 REAL,
DIMENSION(KI,I%NPATCH,NVAR) :: zeps
90 REAL,
DIMENSION(NVAR+1,NOBSTYPE) :: zyf
92 REAL,
DIMENSION(KI*I%NPATCH*NVAR*I%NPATCH*NVAR) :: zblong
93 REAL,
DIMENSION(KI,I%NPATCH*NVAR,I%NPATCH*NVAR) :: zb
95 REAL,
DIMENSION(I%NPATCH*NVAR,I%NPATCH*NVAR) :: zltm
96 REAL,
DIMENSION(I%NPATCH*NVAR,I%NPATCH*NVAR) :: zq
98 REAL,
DIMENSION(NOBSTYPE*NBOUTPUT,I%NPATCH*NVAR) :: zho, zhowr
99 REAL,
DIMENSION(I%NPATCH*NVAR,NOBSTYPE*NBOUTPUT) :: zhot
100 REAL,
DIMENSION(I%NPATCH*NVAR,NOBSTYPE*NBOUTPUT) :: zgain
102 REAL,
DIMENSION(NOBSTYPE*NBOUTPUT,NOBSTYPE*NBOUTPUT) :: zr
103 REAL,
DIMENSION(NOBSTYPE*NBOUTPUT,NOBSTYPE*NBOUTPUT) :: zk1
104 REAL,
DIMENSION(NOBSTYPE*NBOUTPUT) :: zx,zb2,zp
106 REAL,
DIMENSION(I%NPATCH*NVAR,I%NPATCH*NVAR) :: zkrk
107 REAL,
DIMENSION(I%NPATCH*NVAR,I%NPATCH*NVAR) :: zidkh
108 REAL,
DIMENSION(I%NPATCH*NVAR,I%NPATCH*NVAR) :: zident
110 REAL,
DIMENSION(I%NPATCH) :: zvlaimin
123 INTEGER :: istat, icpt, iunit
125 INTEGER :: ji,jj,jk,jjj,jl,k1,l1
129 REAL(KIND=JPRB) :: zhook_handle
132 IF (lhook) CALL dr_hook(
'ASSIM_NATURE_ISBA_EKF',0,zhook_handle)
139 IF (htest/=
'OK')
THEN
140 CALL
abor1_sfx(
'ASSIM_NATURE_ISBA_EKF: FATAL ERROR DURING ARGUMENT TRANSFER')
143 IF ( nprintlev>0 .AND. nrank==npio )
THEN
145 WRITE(*,*)
' --------------------------'
146 WRITE(*,*)
' | ENTERING VARASSIM |'
147 WRITE(*,*)
' --------------------------'
152 IF ( myproc > 0 )
THEN
161 WRITE(ymyproc(1:7),
'(I7.7)') imyproc
163 IF ( nprintlev > 0 .AND. nrank==npio )
WRITE(*,*)
'number of patches =',i%NPATCH
172 CALL
cofswi(i%XCLAY(:,1),zcofswi)
184 zident(jj+i%NPATCH*(jl-1),jj+i%NPATCH*(jl-1)) = 1.0
187 WHERE ( xi(:,:,jl)/=xundef )
188 zeps(:,:,jl) = xtprt(jl) * xi(:,:,jl)
193 IF ( trim(cvar(jl))==
'WG2' .OR. trim(cvar(jl))==
'WG1' )
THEN
196 zcoef(ji,:,jl) = zcofswi(ji)*zcofswi(ji)
199 ELSEIF ( trim(cvar(jl))==
'LAI' .AND. lbfixed )
THEN
203 IF ( xlai_pass(ji,jj)/=xundef .AND. xlai_pass(ji,jj)>=2. )
THEN
204 zcoef(ji,jj,jl) = xlai_pass(ji,jj)*xlai_pass(ji,jj)
206 zcoef(ji,jj,jl) = 0.4*0.4/(xsigma(jl)*xsigma(jl))
227 ybgfile =
"BGROUNDin."//trim(ymyproc)
228 INQUIRE (file=trim(ybgfile),exist=gbexists)
230 IF ( lbev .AND. gbexists )
THEN
235 IF ( nprintlev > 0 )
WRITE(*,*)
'read previous B matrix ==>',zb(1,1,1),nvar
237 ELSEIF ( lbev .OR. lbfixed )
THEN
245 l1 = jj + i%NPATCH *(jl-1)
246 zb(ji,l1,l1) = xsigma(jl)*xsigma(jl) * zcoef(ji,jj,jl)
264 l1 = jj + i%NPATCH * (jl-1)
267 zblong(icpt) = zb(ji,l1,l1)
278 IF ( nprintlev > 0 )
WRITE(*,*)
'Initialized B'
284 CALL
abor1_sfx(
"LBEV or LBFIXED should be .TRUE.!")
291 IF (nprintlev>0)
THEN
296 WRITE(ychar,
'(I1)') jk
297 ylfname=
'LTM_del'//trim(cvar(jk))//
'_del'//trim(cvar(jl))//
"."//trim(ymyproc)
298 OPEN(unit=iunit,file=ylfname,form=
'FORMATTED',status=
'UNKNOWN',position=
'APPEND')
313 l1 = jj + i%NPATCH*(jl-1)
314 k1 = jj + i%NPATCH*(jk-1)
316 IF ( i%XPATCH(ji,jj)>0.0 .AND. xf(ji,jj,jl+1,jk).NE.xundef .AND. xf(ji,jj,1,jk).NE.xundef )
THEN
319 zltm(l1,k1) = ( xf(ji,jj,jl+1,jk) - xf(ji,jj,1,jk) ) / zeps(ji,jj,jl)
321 zltm(l1,k1) = max(-0.1, zltm(l1,k1))
322 zltm(l1,k1) = min( 1.0, zltm(l1,k1))
326 IF (nprintlev>0)
WRITE (iunit,*) zltm(l1,k1)
333 IF (nprintlev>0)
THEN
342 WRITE(*,*)
'LTM d(wg2)/d(wg2)', zltm(1,1)
346 zb(ji,:,:) = matmul(zltm(:,:),matmul(zb(ji,:,:),transpose(zltm(:,:))))
354 l1 = jj+i%NPATCH*(jl-1)
356 zq(l1,l1) = xsigma(jl)*xsigma(jl)
358 IF (trim(cvar(jl)) ==
'LAI')
THEN
359 zq(l1,l1) = xscale_qlai*xscale_qlai * zq(l1,l1)
361 zq(l1,l1) = xscale_q*xscale_q * zq(l1,l1) * zcoef(ji,jj,jl)
368 IF ( nprintlev > 0 )
THEN
369 WRITE(*,*)
'B before wg2 wg2 ==> ',zb(ji,1,1)/zcofswi(ji),zb(ji,1,1)
370 WRITE(*,*)
'Q value wg2 wg2 ==> ',zq(1,1)/zcofswi(ji),zq(1,1)
373 zb(ji,:,:) = zb(ji,:,:) + zq(:,:)
375 IF ( nprintlev > 0 )
WRITE(*,*)
'B after wg2 wg2 ==>',zb(ji,1,1)/zcofswi(1),zb(ji,1,1)
381 IF (nprintlev>0)
THEN
382 ybgfile=
"BGROUNDout_LBEV."//trim(ymyproc)
385 WRITE(*,*)
'store B matrix after TL evolution ==>',zb(1,1,1)
386 WRITE(*,*)
'writing out B'
398 iyear = i%TTIME%TDATE%YEAR
399 imonth = i%TTIME%TDATE%MONTH
400 iday = i%TTIME%TDATE%DAY
403 ztime = float(nechgu) * 3600.
410 IF ( trim(cfile_format_obs) ==
"FA" )
THEN
413 SELECT CASE (trim(cobs(iobs)))
415 xyo(:,iobs) = pt2m(:)
417 xyo(:,iobs) = phu2m(:)
419 CALL
abor1_sfx(
"Mapping of "//cobs(iobs)//
" is not defined in ASSIM_NATURE_ISBA_EKF!")
427 IF ( nprintlev > 0 )
OPEN (unit=111,file=
'OBSout.'//trim(ymyproc),status=
'unknown',iostat=istat)
429 IF ( minval(i%XWGI(ji,1,:))>0. )
THEN
431 IF ( nprintlev > 0 )
WRITE(*,*)
'OBSERVATION FOR POINT ',ji,
' REMOVED'
433 IF ( nprintlev > 0 )
WRITE (111,*) xyo(ji,:)
435 IF ( nprintlev > 0 )
CLOSE(111)
440 IF ( nprintlev > 0 )
THEN
441 IF (nrank==npio)
THEN
442 WRITE(*,*)
'calculating jacobians',nobs
443 WRITE(*,*)
' and then PERFORMING ANALYSIS'
448 OPEN (unit=111,file=
'OBSERRORout.'//trim(ymyproc),status=
'unknown',iostat=istat)
450 OPEN (unit=112,file=
'INNOV.'//trim(ymyproc),status=
'unknown',iostat=istat)
452 OPEN (unit=113,file=
'ANAL_INCR.'//trim(ymyproc),status=
'unknown',iostat=istat)
458 WRITE(ychar,
'(I1)') jk
459 yfname=
'HO_'//trim(cvar(jl))//
'_v'//ychar
460 OPEN(unit=iunit,file=yfname,form=
'FORMATTED',status=
'UNKNOWN',iostat=istat)
466 IF (i%NPATCH==12)
THEN
467 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/)
472 ALLOCATE(i%XINCR(ki,i%NPATCH*nvar))
481 IF (i%XPATCH(ji,jj) > 0.0)
THEN
482 WHERE ( xf_patch(ji,jj,:,:)/=xundef )
483 zyf(:,:) = zyf(:,:) + i%XPATCH(ji,jj)*xf_patch(ji,jj,:,:)
487 IF ( nprintlev > 0 )
WRITE(*,*)
'read in sim obs yf', zyf(:,1)
500 k1 = (istep-1)*nobstype + jk
503 zr(k1,k1) = xerrobs(jk)*xerrobs(jk)
504 IF ( cobs(jk) .EQ.
"LAI" )
THEN
505 zr(k1,k1) = zr(k1,k1) * xyo(ji,k1)*xyo(ji,k1)
506 ELSEIF (cobs(jk) .EQ.
"WG1")
THEN
508 zr(k1,k1) = zr(k1,k1) * zcofswi(ji)*zcofswi(ji)
512 IF ( ( abs( xyo(ji,k1)-zyf(1,jk) ) > xqcobs(jk) ) .OR. (zr(k1,k1) .LT. 0 ) )
THEN
520 l1 = jj + i%NPATCH*(jl-1)
522 IF ( i%XPATCH(ji,jj)>0.0 .AND. xf_patch(ji,jj,jl+1,jk).NE.xundef .AND. xf_patch(ji,jj,1,jk).NE.xundef )
THEN
523 zhowr(k1,l1) = i%XPATCH(ji,jj)*(xf_patch(ji,jj,jl+1,jk) - xf_patch(ji,jj,1,jk))/zeps(ji,jj,jl)
526 IF( (xyo(ji,k1).NE.xundef) .AND. (xyo(ji,k1).NE.999.0) )
THEN
528 zho(k1,l1) = i%XPATCH(ji,jj)*(xf_patch(ji,jj,jl+1,jk) - xf_patch(ji,jj,1,jk))/zeps(ji,jj,jl)
530 zho(k1,l1) = max(-0.1, zho(k1,l1))
531 zho(k1,l1) = min( 1.0, zho(k1,l1))
533 zb2(k1) = xyo(ji,k1) - zyf(1,jk)
534 iobscount = iobscount + 1
548 IF ( nprintlev > 0 )
THEN
559 zhot(:,:) = transpose(zho(:,:))
560 zk1(:,:) = matmul(zho(:,:),matmul(zb(ji,:,:),zhot(:,:))) + zr(:,:)
561 CALL
choldc(nobstype,zk1(:,:),zp(:))
562 CALL
cholsl(nobstype,zk1(:,:),zp(:),zb2(:),zx(:))
563 i%XINCR(ji,:) = matmul(zb(ji,:,:),matmul(zhot(:,:),zx(:)))
567 l1 = jj+i%NPATCH*(jl-1)
570 IF ( trim(cvar(jl))==
"LAI" )
THEN
571 i%XINCR(ji,l1) = max( i%XINCR(ji,l1), zvlaimin(jj)-xf(ji,jj,1,jl) )
572 xbio_pass(ji,jj) = xbio_pass(ji,jj) + i%XINCR(ji,l1)*xalph(jj)
573 ELSEIF ( xf(ji,jj,1,jl)+i%XINCR(ji,l1)<0. )
THEN
577 xf(ji,jj,1,jl) = xf(ji,jj,1,jl) + i%XINCR(ji,l1)
580 IF ( nprintlev > 0 )
THEN
581 IF ( xf(ji,jj,1,jl) < 0. )
WRITE(*,*)
"WARNING X<0. for ",ji,jj,
" for variable ",trim(cvar(jl))
587 IF ( nprintlev > 0 )
THEN
589 WRITE(113,*) (xf(ji,jj,1,jl),jl=1,nvar), (i%XINCR(ji,jj+i%NPATCH*(jl-1)),jl=1,nvar)
604 zgain(:,:) = matmul(zb(ji,:,:),matmul(zhot(:,:),zk1(:,:)))
605 zidkh(:,:) = zident(:,:) - matmul(zgain(:,:),zho(:,:))
606 zkrk(:,:) = matmul(zgain(:,:),matmul(zr(:,:),transpose(zgain(:,:))))
607 IF (.NOT.lbfixed) zb(ji,:,:) = matmul(zidkh(:,:),matmul(zb(ji,:,:),transpose(zidkh(:,:)))) + zkrk(:,:)
609 IF ( nprintlev > 0 )
THEN
615 WRITE(iunit,*) zhowr(jk,jj+i%NPATCH*(jl-1)),zgain(jj+i%NPATCH*(jl-1),jk)
625 IF ( nprintlev > 0 )
THEN
639 IF (lbev .OR. nprintlev>0)
THEN
641 ybgfile =
"BGROUNDout_ASSIM."//trim(ymyproc)
646 IF ( nprintlev > 0 )
THEN
647 iobscount = iobscount / i%NPATCH / nvar
648 IF (nrank==npio)
THEN
650 WRITE(*,*)
' ---------------------------------------'
651 WRITE(*,*)
' | EXITING VARASSIM AFTER ANALYSIS |'
652 WRITE(*,*)
' ---------------------------------------'
655 WRITE(*,*)
'Number of assimilated observations =',iobscount
663 SELECT CASE (trim(cvar(jl)))
665 i%XTG(:,1,:) = xf(:,:,1,jl)
667 i%XTG(:,2,:) = xf(:,:,1,jl)
669 i%XWG(:,1,:) = xf(:,:,1,jl)
671 i%XWG(:,2,:) = xf(:,:,1,jl)
673 i%XLAI(:,:) = xf(:,:,1,jl)
674 SELECT CASE (trim(cbio))
675 CASE(
"BIOMA1",
"BIOMASS1")
676 i%XBIOMASS(:,1,:) = xbio_pass(:,:)
677 CASE(
"BIOMA2",
"BIOMASS2")
678 i%XBIOMASS(:,2,:) = xbio_pass(:,:)
679 CASE(
"RESPI1",
"RESP_BIOM1")
680 i%XRESP_BIOMASS(:,1,:) = xbio_pass(:,:)
681 CASE(
"RESPI2",
"RESP_BIOM2")
682 i%XRESP_BIOMASS(:,2,:) = xbio_pass(:,:)
684 i%XLAI(:,:) = xbio_pass(:,:)
686 CALL
abor1_sfx(
"Mapping of "//cbio//
" is not defined in EKF!")
689 CALL
abor1_sfx(
"Mapping of "//trim(cvar(jl))//
" is not defined in EKF!")
695 IF (lhook) CALL dr_hook(
'ASSIM_NATURE_ISBA_EKF',1,zhook_handle)
subroutine assim_nature_isba_ekf(I, HPROGRAM, KI, PT2M, PHU2M, HTEST)
subroutine abor1_sfx(YTEXT)