24 SUBROUTINE oi_cacsts(KNBPT,PT2INC,PH2INC,PWGINC,PWS_O, &
26 ptp,pwp,ptl,psns,pts,pws, &
27 ptcls,phcls,pucls,pvcls,psstc,pwpinc1,pwpinc2,pwpinc3, &
29 prrcl,prrsl,prrcn,prrsn,patmneb,pevap,pevaptr, &
30 pitm,pveg,palbf,pemisf,pz0f, &
31 piveg,parg,pd2,psab,plai,prsmin,pz0h, &
32 ptsc,ptpc,pwsc,pwpc,psnc,pgelat,pgelam,pgemu)
64 USE modd_csts, ONLY : xg, xtt, xrholw, xday
68 USE yomhook
,ONLY : lhook, dr_hook
69 USE parkind1
,ONLY : jprb
76 USE modi_oi_kalman_gain
80 INTEGER,
INTENT(IN) :: knbpt, kdat, ksssss
82 REAL ,
INTENT(IN) :: pt2inc(knbpt)
83 REAL ,
INTENT(IN) :: ph2inc(knbpt)
84 REAL ,
INTENT(IN) :: pwginc(knbpt)
85 REAL ,
INTENT(IN) :: pws_o(knbpt)
86 REAL ,
INTENT(INOUT) :: ptp(knbpt)
87 REAL ,
INTENT(INOUT) :: pwp(knbpt)
88 REAL ,
INTENT(INOUT) :: ptl(knbpt)
89 REAL ,
INTENT(INOUT) :: psns(knbpt)
90 REAL ,
INTENT(INOUT) :: pts(knbpt)
91 REAL ,
INTENT(INOUT) :: pws(knbpt)
92 REAL ,
INTENT(INOUT) :: ptcls(knbpt)
93 REAL ,
INTENT(INOUT) :: phcls(knbpt)
94 REAL ,
INTENT(INOUT) :: pucls(knbpt)
95 REAL ,
INTENT(INOUT) :: pvcls(knbpt)
96 REAL ,
INTENT(INOUT) :: psstc(knbpt)
97 REAL ,
INTENT(INOUT) :: pwpinc1(knbpt)
98 REAL ,
INTENT(INOUT) :: pwpinc2(knbpt)
99 REAL ,
INTENT(INOUT) :: pwpinc3(knbpt)
100 REAL ,
INTENT(INOUT) :: pt2mbias(knbpt)
101 REAL ,
INTENT(INOUT) :: ph2mbias(knbpt)
102 REAL ,
INTENT(IN) :: prrcl(knbpt)
103 REAL ,
INTENT(IN) :: prrsl(knbpt)
104 REAL ,
INTENT(IN) :: prrcn(knbpt)
105 REAL ,
INTENT(IN) :: prrsn(knbpt)
106 REAL ,
INTENT(IN) :: patmneb(knbpt)
107 REAL ,
INTENT(IN) :: pevap(knbpt)
108 REAL ,
INTENT(IN) :: pevaptr(knbpt)
109 REAL ,
INTENT(IN) :: pitm(knbpt)
110 REAL ,
INTENT(IN) :: pveg(knbpt)
111 REAL ,
INTENT(INOUT) :: palbf(knbpt)
112 REAL ,
INTENT(INOUT) :: pemisf(knbpt)
113 REAL ,
INTENT(INOUT) :: pz0f(knbpt)
114 REAL ,
INTENT(INOUT) :: piveg(knbpt)
115 REAL ,
INTENT(INOUT) :: parg(knbpt)
116 REAL ,
INTENT(INOUT) :: pd2(knbpt)
117 REAL ,
INTENT(INOUT) :: psab(knbpt)
118 REAL ,
INTENT(INOUT) :: plai(knbpt)
119 REAL ,
INTENT(INOUT) :: prsmin(knbpt)
120 REAL ,
INTENT(INOUT) :: pz0h(knbpt)
121 REAL ,
INTENT(IN) :: ptsc(knbpt)
122 REAL ,
INTENT(IN) :: ptpc(knbpt)
123 REAL ,
INTENT(IN) :: pwsc(knbpt)
124 REAL ,
INTENT(IN) :: pwpc(knbpt)
125 REAL ,
INTENT(IN) :: psnc(knbpt)
126 REAL ,
INTENT(IN) :: pgelat(knbpt)
127 REAL ,
INTENT(IN) :: pgelam(knbpt)
128 REAL ,
INTENT(IN) :: pgemu(knbpt)
130 REAL,
DIMENSION(24) :: zvgat1,zvgat2,zvgat3,zvgbt1,zvgbt2,zvgbt3,zvgct1,zvgct2
131 REAL,
DIMENSION(24) :: zvgah1,zvgah2,zvgah3,zvgbh1,zvgbh2,zvgbh3,zvgch1,zvgch2
132 REAL,
DIMENSION(24) :: zsigt2mp,zsighp2
134 REAL,
DIMENSION(KNBPT) :: ziveg
135 REAL,
DIMENSION(KNBPT) :: zwfc, zwpmx, zwsat, zwsmx, zwwilt
136 REAL,
DIMENSION(KNBPT) :: zdwg_dwg, zdwg_dw2
138 REAL :: zechgu, znei, zcli, zpd, zclimca
139 REAL :: ztsc, ztpc, zwsc, zwpc, zsnc
140 REAL :: zv10m, zprecip, zwpi, zdacw, zdacw2, zmu0, zmu0m
142 REAL :: zvgst,zvgsh,zvgpt1,zvgph1,zvgpt2,zvgph2,zg1,zg2,zg3,zg4
144 REAL :: zzt, zzh, zlaisrs, zteff, zheff
145 REAL :: zcwph, zcwpt, zt2d, zh2d
146 REAL :: zwsd, zwpd, zwpdx
148 REAL :: zwsa, zwsmin, zwpa, zwpmin
149 REAL :: zgel, zsna, zmsn, zk1, zk2
154 REAL(KIND=JPRB) :: zhook_handle
157 IF (lhook) CALL dr_hook(
'OI_CACSTS',0,zhook_handle)
159 zechgu =
REAL(NECHGU) * 3600.
163 CALL
oi_cavegi(zvgat1,zvgat2,zvgat3,zvgbt1,zvgbt2,zvgbt3,zvgct1,zvgct2, &
164 zvgah1,zvgah2,zvgah3,zvgbh1,zvgbh2,zvgbh3,zvgch1,zvgch2, &
165 zsigt2mp,zsighp2,gsgobs)
171 ziveg(jrof) = anint(piveg(jrof))
175 parg, pd2, pws, ziveg, psab, &
177 zwfc, zwpmx, zwsat, zwsmx, zwwilt)
181 CALL
oi_jacobians(knbpt,pws_o,psab,parg,pd2,pwp,zdwg_dwg,zdwg_dw2)
190 IF ( pws(jrof)/=xundef )
THEN
193 znei = max(0.0,psns(jrof)/(psns(jrof)+xwcrin))
195 zcli = xrclimca /(1.0+xrclimn*znei)
197 IF ( .NOT. lclim )
THEN
206 zwsc = pwsc(jrof) * zwsmx(jrof)
207 zwpc = pwpc(jrof) * zwpmx(jrof)
217 IF ( nneigt<=0 .OR. znei<xreps2 )
THEN
219 ELSEIF ( xsneigt<xreps3 )
THEN
222 zpd = (1.0-min(znei,xsneigt)/xsneigt)**nneigt
225 pts(jrof) = pts(jrof) + pt2inc(jrof)*zpd
226 ptp(jrof) = ptp(jrof) + pt2inc(jrof)*zpd/(xsodelx(1)/xsodelx(0))
229 zclimca = xrclimts * zcli
230 pts(jrof) = (1.0-zclimca)*pts(jrof) + zclimca*ztsc
233 zclimca = xrclimtp * xrclimca
234 ptp(jrof) = (1.0-zclimca)*ptp(jrof )+ zclimca*ztpc
243 CALL
oi_tsl(kdat,ksssss,pgelat(jrof),pgelam(jrof),zmu0,zmu0m,ih)
245 zv10m = sqrt(pucls(jrof)**2+pvcls(jrof)**2)
247 zprecip = max(0.,prrcl(jrof))+ max(0.,prrsl(jrof)) &
248 + max(0.,prrcn(jrof))+ max(0.,prrsn(jrof))
258 zdacw = min(1.0,max(0.0,abs(
REAL(nint(ziveg(jrof))-ntvgla))) ) &
259 * min(1.0,max(0.0,
REAL(ih))) &
260 * min(1.0,max(0.0,
REAL(nidj)/
REAL(nmindj))) &
261 * min(1.0,max(0.0,1.0-zv10m/(xv10mx+xreps3))) &
262 * min(1.0,max(0.0,1.0-zprecip/(xsprecip+xreps3))) &
263 * min(1.0,max(0.0,1.0-zwpi/xsice))
267 IF ( xsmu0>xreps3 )
THEN
268 zpd = 0.5 * (1.0+tanh(xsmu0*(zmu0m-0.5)))
277 IF ( xsevap>xreps3 )
THEN
278 zpd = min(1.0,max(0.0,pevap(jrof)/(-xsevap/xday)))
286 IF ( xanebul>xreps3 )
THEN
287 zpd = 1.0 - xanebul*(patmneb(jrof)/zechgu)**nnebul
295 IF ( nneigw<=0 .OR. znei<xreps2 )
THEN
297 ELSEIF ( xsneigw<xreps3 )
THEN
300 zpd = ( 1.0 - min(znei,xsneigw)/xsneigw)**nneigw
304 zdacw2 = min(1.0,max(0.0,1.0-(zprecip+abs(pevap(jrof)))/(xsprecip2+xreps3))) &
305 * min(1.0,max(0.0,1.0-zwpi/xsice))
307 zdacw2 = zdacw2 * zpd
319 zvgat1,zvgat2,zvgat3,zvgbt1,zvgbt2,zvgbt3,zvgct1,zvgct2, &
320 zvgah1,zvgah2,zvgah3,zvgbh1,zvgbh2,zvgbh3,zvgch1,zvgch2, &
323 zvgst,zvgsh,zvgpt1,zvgph1,zvgpt2,zvgph2)
338 zpd = (zwfc(jrof)-zwwilt(jrof))/xadwr
343 zzt = zzt * zpd * zdacw
344 zzh = zzh * zpd * zdacw
349 zlaisrs = plai(jrof)/max(1.0,prsmin(jrof))
350 zcwpt = ( zvgpt1 + zlaisrs*zvgpt2 ) * zzt
351 zcwph = ( zvgph1 + zlaisrs*zvgph2 ) * zzh
358 IF (xsigt2mo < 0.0) zt2d=max(xsigt2mo,min(-xsigt2mo,zt2d))
359 IF (xsigh2mo < 0.0) zh2d=max(xsigh2mo,min(-xsigh2mo,zh2d))
364 pt2mbias(jrof) = pt2mbias(jrof)*(1.0-xscoeft) + zt2d*xscoeft
365 ph2mbias(jrof) = ph2mbias(jrof)*(1.0-xscoefh) + zh2d*xscoefh
372 IF ( xscoeft/= 0.0 .OR. xscoefh/=0.0 )
THEN
373 zteff = zt2d - pt2mbias(jrof)
374 zheff = zh2d - ph2mbias(jrof)
375 IF (abs(zt2d) < abs(zteff)) zteff = zt2d
376 IF (abs(zh2d) < abs(zheff)) zheff = zh2d
383 IF ( lobs2m .AND. (.NOT.lobswg .OR. pwginc(jrof)==0.0) )
THEN
384 zwsd = xrscaldw * (zvgst*zt2d + zvgsh*zh2d)
385 zwpd = xrscaldw * (zcwpt*zt2d + zcwph*zh2d)
386 ELSEIF ( lobswg )
THEN
387 CALL
oi_kalman_gain(zdwg_dwg(jrof),zdwg_dw2(jrof),pd2(jrof),zk1,zk2)
388 zwsd = zk1*zdacw2*pwginc(jrof)
389 zwpd = zk2*zdacw2*pwginc(jrof)
398 IF (pevap(jrof)-pevaptr(jrof)>= 0.0 .AND. .NOT.lobswg) zwsd = 0.0
407 IF ( limveg ) CALL
get_zw(zwpd,pwp(jrof),pd2(jrof))
412 IF ( nlissew >= 3 )
THEN
413 zwpd = 0.25*(pwpinc3(jrof)+pwpinc2(jrof)+pwpinc1(jrof)+zwpdx)
417 IF ( nlissew >= 2 ) pwpinc3(jrof) = pwpinc2(jrof)
418 IF ( nlissew >= 1 ) pwpinc2(jrof) = pwpinc1(jrof)
419 pwpinc1(jrof) = zwpdx
423 IF ( limveg ) CALL
get_zw(zwsd,pws(jrof),xrd1)
427 zwsa = pws(jrof) + zwsd * xrd1 * xrholw
428 zwsmin = xreps1 * xrd1 * xrholw
429 pws(jrof) = max(zwsmin,min(zwsmx(jrof),zwsa))
433 zwpa = pwp(jrof) + zwpd * pd2(jrof) * xrholw
434 zwpmin = max(pws(jrof), xreps1 * pd2(jrof) * xrholw)
435 pwp(jrof) = max(zwpmin,min(zwpmx(jrof),zwpa))
438 zclimca = xrclimws * zcli
439 zclimca = zclimca*pveg(jrof) + min(1.0,xrclimv*zclimca)*(1.0-pveg(jrof))
440 pws(jrof) = (1.0-zclimca)*pws(jrof) + zclimca*zwsc
443 zclimca = xrclimwp * zcli
444 zclimca = zclimca*pveg(jrof) + min(1.0,xrclimv*zclimca)*(1.0-pveg(jrof))
446 zgel = zwpi / max(pwp(jrof)+zwpi,xreps3)
447 zwpc = zwpc * (1.0 - max(0.0,min(1.0,zgel)))
448 zwpc = max(zwpmin,zwpc)
450 pwp(jrof) = (1.0-zclimca)*pwp(jrof) + zclimca*zwpc
454 zsna = (1.0-xrclimca)*psns(jrof) + xrclimca*zsnc
455 zmsn = max(0.0, xrsnsa/21600.*zechgu*(ptcls(jrof)-xtt))**xrsnsb
456 psns(jrof) = max(zsna-zmsn,0.0)
459 zmsn = max(0.0, xrwpia/21600. * zechgu*(ptcls(jrof)-xtt))**xrwpib
460 ptl(jrof)=max(zwpi-zmsn ,0.0)
461 pwp(jrof)=pwp(jrof)-ptl(jrof)+zwpi
476 IF ( pitm(jrof) <= 0.5 )
THEN
477 IF ( pts(jrof) <= xtmergl )
THEN
479 pemisf(jrof) = xsemib
480 pz0f(jrof) = xszz0b*xg
481 pz0h(jrof) = xrzhz0g * xszz0b*xg
484 pemisf(jrof) = xsemim
490 IF (lhook) CALL dr_hook(
'OI_CACSTS',1,zhook_handle)
496 REAL,
INTENT(INOUT) :: pwd
497 REAL,
INTENT(IN) :: piw, pd
498 REAL :: zwr, zwd1, zwd2
500 zwr = piw / (pd*xrholw)
502 IF ( zwr > zwfc(jrof)*xswfc )
THEN
508 ELSEIF ( zwr < zwwilt(jrof)*pveg(jrof))
THEN
515 zwd1 = zwwilt(jrof)*pveg(jrof) - zwr
516 zwd2 = zwfc(jrof)*xswfc - zwr
517 pwd = max(zwd1,min(zwd2,pwd))
subroutine oi_acsolw(KST, KNBPT,
subroutine get_zw(PWD, PIW, PD)
subroutine oi_cavegi(PVGAT1, PVGAT2, PVGAT3, PVGBT1, PVGBT2, PVGBT3, PVGCT1, PVGCT2, PVGAH1, PVGAH2, PVGAH3, PVGBH1, PVGBH2, PVGBH3, PVGCH1, PVGCH2, PSIGT2MP, PSIGHP2, OSGOBS)
subroutine oi_fctveg(KH, PVEG, PVGAT1, PVGAT2, PVGAT3, PVGBT1, PVGBT2, PVGBT3, PVGCT1, PVGCT2, PVGAH1, PVGAH2, PVGAH3, PVGBH1, PVGBH2, PVGBH3, PVGCH1, PVGCH2, PSIGT2MP, PSIGHP2, PG1, PG2, PG3, PG4, PVGST, PVGSH, PVGPT1, PVGPH1, PVGPT2, PVGPH2)
subroutine oi_cacsts(KNBPT, PT2INC, PH2INC, PWGINC, PWS_O, KDAT, KSSSSS, PTP, PWP, PTL, PSNS, PTS, PWS, PTCLS, PHCLS, PUCLS, PVCLS, PSSTC, PWPINC1, PWPINC2, PWPINC3, PT2MBIAS, PH2MBIAS, PRRCL, PRRSL, PRRCN, PRRSN, PATMNEB, PEVAP, PEVAPTR, PITM, PVEG, PALBF, PEMISF, PZ0F, PIVEG, PARG, PD2, PSAB, PLAI, PRSMIN, PZ0H, PTSC, PTPC, PWSC, PWPC, PSNC, PGELAT, PGELAM, PGEMU)
subroutine oi_kalman_gain(PDWG_DWG, PDWG_DW2, PD2, PK1, PK2)
subroutine oi_jacobians(KNBPT,
subroutine oi_tsl(KDAT, KSSSSS, PLAT, PLON, PMU0, PMU0M, KH)