27 USE modd_assim, ONLY : nobstype, xerrobs, nvar, nprintlev, cvar, &
28 xf_patch, xf,cobs,cfile_format_obs,nens, &
29 nechgu, nboutput, nobs, xyo, lenkf, ldenkf, &
30 lpb_correlations, lperturbation_run, &
31 lbias_correction, xinfl
38 USE yommp0
, ONLY : myproc
41 USE yomhook
, ONLY : lhook,dr_hook
42 USE parkind1
, ONLY : jprb
45 USE modi_add_forecast_to_date_surf
47 USE modi_outer_product
55 TYPE(isba_t
),
INTENT(INOUT) :: i
57 CHARACTER(LEN=6),
INTENT(IN) :: hprogram
58 INTEGER,
INTENT(IN) :: ki
59 REAL,
DIMENSION(:),
INTENT(IN) :: pt2m
60 REAL,
DIMENSION(:),
INTENT(IN) :: phu2m
61 CHARACTER(LEN=2),
INTENT(IN) :: htest
65 CHARACTER(LEN=30) :: ybgfile
66 CHARACTER(LEN=17) :: ylfname
67 CHARACTER(LEN=9) :: yfname
68 CHARACTER(LEN=7) :: ymyproc
69 CHARACTER(LEN=1) :: ychar
80 REAL,
DIMENSION(KI) :: zcofswi
82 REAL,
DIMENSION(NENS+1,NOBSTYPE*NBOUTPUT) :: zyf
84 REAL,
DIMENSION(NOBSTYPE*NBOUTPUT,NENS) :: zinnov
86 REAL,
DIMENSION(NVAR,NOBSTYPE*NBOUTPUT) :: zbht
87 REAL,
DIMENSION(NOBSTYPE*NBOUTPUT,NOBSTYPE*NBOUTPUT) :: zr
88 REAL,
DIMENSION(NOBSTYPE*NBOUTPUT,NOBSTYPE*NBOUTPUT) :: zk1, zk2, zhbht
89 REAL,
DIMENSION(NOBSTYPE*NBOUTPUT) :: zp, zx
91 REAL,
DIMENSION(I%NPATCH,NVAR,NENS) :: zxincr
92 REAL,
DIMENSION(I%NPATCH,NVAR,NENS) :: za, zf
93 REAL,
DIMENSION(I%NPATCH,NOBSTYPE*NBOUTPUT,NENS) :: zf_patch
94 REAL,
DIMENSION(I%NPATCH,NVAR) :: zf_mean, za_mean
95 REAL,
DIMENSION(NVAR) :: zf_agg, za_agg
97 REAL,
DIMENSION(:,:,:),
ALLOCATABLE :: zf_mean0, zf_patch_mean
109 INTEGER :: iobs, iens
110 INTEGER :: istat, icpt, iunit
112 INTEGER :: ii,j,k,jj,l,k1,l1
116 REAL(KIND=JPRB) :: zhook_handle
119 IF (lhook) CALL dr_hook(
'ASSIM_NATURE_ISBA_ENKF',0,zhook_handle)
126 IF (htest/=
'OK')
THEN
127 CALL
abor1_sfx(
'ASSIM_NATURE_ISBA_ENKF: FATAL ERROR DURING ARGUMENT TRANSFER')
130 IF ( nprintlev>0 .AND. nrank==npio)
THEN
132 WRITE(*,*)
' --------------------------'
133 WRITE(*,*)
' | ENTERING VARASSIM |'
134 WRITE(*,*)
' --------------------------'
139 IF ( myproc > 0 )
THEN
148 WRITE(ymyproc(1:7),
'(I7.7)') imyproc
150 IF ( nprintlev > 0 .AND. nrank==npio )
WRITE(*,*)
'number of patches =',i%NPATCH
159 CALL
cofswi(i%XCLAY(:,1),zcofswi)
172 iyear = i%TTIME%TDATE%YEAR
173 imonth = i%TTIME%TDATE%MONTH
174 iday = i%TTIME%TDATE%DAY
177 ztime = float(nechgu) * 3600.
184 IF ( trim(cfile_format_obs) ==
"FA" )
THEN
187 SELECT CASE (trim(cobs(iobs)))
189 xyo(:,iobs) = pt2m(:)
191 xyo(:,iobs) = phu2m(:)
193 CALL
abor1_sfx(
"Mapping of "//cobs(iobs)//
" is not defined in ASSIM_NATURE_ISBA_EKF!")
200 IF ( nprintlev > 0 )
OPEN (unit=111,file=
'OBSout.'//ymyproc,status=
'unknown',iostat=istat)
202 IF ( minval(i%XWGI(ii,1,:))>0. )
THEN
204 IF ( nprintlev > 1 )
WRITE(*,*)
'OBSERVATION FOR POINT ',ii,
' REMOVED'
206 IF ( nprintlev > 0 )
WRITE (111,*) xyo(ii,:)
208 IF ( nprintlev > 0 )
CLOSE(111)
212 IF ( lbias_correction )
THEN
214 ALLOCATE(zf_mean0(ki,i%NPATCH,nvar))
215 ALLOCATE(zf_patch_mean(ki,i%NPATCH,nobs))
220 zf_mean0(ii,j,l) = sum(xf(ii,j,1:nens,l))/
REAL(nens)
223 zf_patch_mean(ii,j,k) = sum(xf_patch(ii,j,1:nens,k))/
REAL(nens)
233 IF ( xf(ii,j,iens,l) - zf_mean0(ii,j,l) + xf(ii,j,nens+1,l)>0.0 )
THEN
234 xf(ii,j,iens,l) = xf(ii,j,iens,l) - zf_mean0(ii,j,l) + xf(ii,j,nens+1,l)
239 IF ( xf_patch(ii,j,iens,k) - zf_patch_mean(ii,j,k) + xf_patch(ii,j,nens+1,k)>0.0 )
THEN
240 xf_patch(ii,j,iens,k) = xf_patch(ii,j,iens,k) - zf_patch_mean(ii,j,k) + xf_patch(ii,j,nens+1,k)
248 DEALLOCATE(zf_mean0,zf_patch_mean)
254 IF ( nprintlev > 0 )
THEN
255 IF (nrank==npio)
THEN
256 WRITE(*,*)
'calculating jacobians',nobs
257 WRITE(*,*)
' and then PERFORMING ANALYSIS'
262 OPEN (unit=111,file=
'OBSERRORout.'//ymyproc,status=
'unknown',iostat=istat)
264 OPEN (unit=112,file=
'INNOV.'//ymyproc,status=
'unknown',iostat=istat)
266 OPEN (unit=113,file=
'ANAL_INCR.'//ymyproc,status=
'unknown',iostat=istat)
268 OPEN (unit=114,file=
'K1.'//ymyproc,status=
'unknown',iostat=istat)
269 OPEN (unit=115,file=
'F_AGG.'//ymyproc,status=
'unknown',iostat=istat)
270 OPEN (unit=116,file=
'A_AGG.'//ymyproc,status=
'unknown',iostat=istat)
283 IF (i%XPATCH(ii,j) > 0.0)
THEN
284 WHERE ( xf_patch(ii,j,:,:)/=xundef )
285 zyf(:,:) = zyf(:,:) + i%XPATCH(ii,j)*xf_patch(ii,j,:,:)
289 IF ( nprintlev > 1 )
WRITE(*,*)
'read in sim obs yf', zyf(:,1)
307 k1 = (istep-1)*nobstype + k
310 zr(k1,k1) = xerrobs(k)*xerrobs(k)
311 IF ( cobs(k) .EQ.
"LAI" )
THEN
312 zr(k1,k1) = zr(k1,k1) * xyo(ii,k1)*xyo(ii,k1)
313 ELSEIF (cobs(k) .EQ.
"WG1")
THEN
315 zr(k1,k1) = zr(k1,k1) * zcofswi(ii)*zcofswi(ii)
319 IF ( abs(xyo(ii,k1)-zyf(nens+1,k1)) > 0.5 .OR. zr(k1,k1) < 0. ) xyo(ii,k1) = xundef
321 IF( xyo(ii,k1).NE.xundef .AND. xyo(ii,k1).NE.999.0 )
THEN
325 zinnov(k1,iens) = xyo(ii,k1) - zyf(iens,k1)
327 zinnov(k1,iens) = zinnov(k1,iens) +
random_normal() * (xerrobs(k)*zcofswi(ii))
332 iobscount = iobscount + 1
338 IF ( nprintlev > 0 )
THEN
341 WRITE(112,*) (sum(zinnov(k,:))/(nens*1.0)), xyo(ii,k)
347 IF (nprintlev > 0)
WRITE(*,*)
'PERFORMING ANALYSIS'
352 zf(:,:,iens) = xf(ii,:,iens,:)
353 zf_patch(:,:,iens) = xf_patch(ii,:,iens,:)
357 zf_mean(:,:) = sum(zf(:,:,:),dim=3)/
REAL(nens)
359 IF (.NOT.lperturbation_run)
THEN
363 CALL
outer_product(nens,nvar,nobs,zf(j,:,:),i%XPATCH(ii,j)*zf_patch(j,:,:),&
364 zbht(:,:),zhbht(:,:),lpb_correlations,cvar,cobs)
366 zk1(:,:) = zhbht(:,:) + zr(:,:)
367 zk2(:,:) = zk2(:,:) + zhbht(:,:)
368 CALL
choldc(nobs,zk1(:,:),zp(:))
372 CALL
cholsl(nobs,zk1(:,:),zp(:),zinnov(:,iens),zx(:))
373 zxincr(j,:,iens) = matmul(zbht(:,:),zx(:))
376 za(j,l,iens) = zf(j,l,iens)
377 IF (cvar(l)/=
"WG3" .AND. cvar(l)/=
"TG3")
THEN
378 za(j,l,iens) = za(j,l,iens) + zxincr(j,l,iens)
386 za_mean(:,:) = sum(za(:,:,:),dim=3)/
REAL(nens)
388 IF (nprintlev>1)
WRITE(114,*) (zk2(:,:) + zr(:,:))
396 IF ( ldenkf .AND. cvar(l)/=
"WG3" .AND. cvar(l)/=
"TG3" )
THEN
399 zalpha = 1.0 / ( 1.0 + sqrt( zr(k,k)/(zk2(k,k) + zr(k,k)) ) )
400 za(j,l,iens) = za_mean(j,l) + (1.0-zalpha) * ( zf(j,l,iens)-zf_mean(j,l) ) &
401 + zalpha * ( za(j,l,iens)-za_mean(j,l))
406 za(j,l,iens) = za_mean(j,l) + xinfl(l) * (za(j,l,iens) - za_mean(j,l))
414 WHERE (za(:,:,:)<0.0)
415 za(:,:,:) = zf(:,:,:)
421 za(:,:,:) = zf(:,:,:)
425 za_mean(:,:) = sum(za(:,:,:),dim=3)/
REAL(nens)
431 IF (za_mean(j,l)/=xundef .AND. zf_mean(j,l)/=xundef)
THEN
432 zf_agg(l) = zf_agg(l) + i%XPATCH(ii,j) * zf_mean(j,l)
433 za_agg(l) = za_agg(l) + i%XPATCH(ii,j) * za_mean(j,l)
438 IF (nprintlev>1)
THEN
439 WRITE(115,*) (zf_agg(l), l=1,nvar)
440 WRITE(116,*) (za_agg(l), l=1,nvar)
446 xf(ii,:,iens,:) = za(:,:,iens)
449 IF (lbias_correction) xf(ii,:,nens+1,:) = za_mean(:,:)
453 IF ( nprintlev > 0 )
THEN
462 IF (lhook) CALL dr_hook(
'ASSIM_NATURE_ISBA_ENKF',1,zhook_handle)
real function random_normal()
subroutine abor1_sfx(YTEXT)
subroutine assim_nature_isba_enkf(I, HPROGRAM, KI, PT2M, PHU2M, HTEST)
subroutine outer_product(KENS, KX, KY, PX, PY, PA, PC, OPB_CORRELATIONS, HVAR, HOBS)
subroutine init_random_seed()