6 & dt,fxbor,hnp1mt,fbor,smh,yasmh,fscexp,
7 & nseg,npoin,nptfr,gloseg,sizglo,nbor,limtra,kdir,kddl,optsou,
8 & iopt2,flbortra,surnit,mesh,sf,rain,pluie,train,tetaf,infogt,
9 & volu2d,sm,psiexp,am2,bb,slvpsi,
10 & predictor,corrector,icor,ncor,massou)
94 INTEGER,
INTENT(IN) :: NSEG,NPOIN,NPTFR,KDIR,KDDL
95 INTEGER,
INTENT(IN) :: SIZGLO,OPTSOU,IOPT2
96 INTEGER,
INTENT(IN) :: ICOR,NCOR
97 INTEGER,
INTENT(IN) :: GLOSEG(sizglo,2)
98 INTEGER,
INTENT(IN) :: NBOR(nptfr),LIMTRA(nptfr)
99 DOUBLE PRECISION,
INTENT(IN) :: DT,SURNIT,TRAIN,TETAF(npoin)
100 DOUBLE PRECISION,
INTENT(INOUT) :: FLBORTRA(nptfr),MASSOU
101 DOUBLE PRECISION,
INTENT(INOUT) :: F(npoin)
102 DOUBLE PRECISION,
INTENT(IN) :: FXBOR(nptfr)
103 DOUBLE PRECISION,
INTENT(IN) :: FC(npoin)
104 DOUBLE PRECISION,
INTENT(IN) :: HNP1MT(npoin)
105 DOUBLE PRECISION,
INTENT(IN) :: SMH(*)
106 DOUBLE PRECISION,
INTENT(IN) :: VOLU2D(npoin)
107 DOUBLE PRECISION,
INTENT(IN) :: PLUIE(*),PSIEXP(npoin)
108 DOUBLE PRECISION,
INTENT(IN) :: FSCEXP(*)
109 DOUBLE PRECISION,
INTENT(IN) :: FBOR(nptfr)
110 DOUBLE PRECISION,
INTENT(IN) :: FXMAT(nseg),FXMATPAR(nseg)
111 LOGICAL,
INTENT(IN) :: YASMH,RAIN,INFOGT
112 LOGICAL,
INTENT(IN) :: PREDICTOR,CORRECTOR
113 TYPE(bief_obj),
INTENT(INOUT) :: SF,SM,AM2,BB
114 TYPE(bief_mesh),
INTENT(INOUT) :: MESH
115 TYPE(slvcfg),
INTENT(INOUT) :: SLVPSI
120 DOUBLE PRECISION NORMR,NORMB,FMIN,FMAX
121 TYPE(bief_obj),
POINTER :: BB1,SURDIAG,R
145 IF(limtra(i).EQ.kdir)
THEN 146 fmin=min(fmin,fbor(i))
147 fmax=max(fmax,fbor(i))
152 fmin=min(fmin,fscexp(i))
153 fmax=max(fmax,fscexp(i))
175 WRITE(
lu,*)
'TVF_IMP: UNKNOWN OPTION' 197 am2%D%R(i)=hnp1mt(i)*volu2d(i)
205 sm%R(i)=am2%D%R(i)*fc(i)
207 ELSEIF(corrector)
THEN 210 sm%R(i)=am2%D%R(i)*f(i)
213 WRITE(
lu,*)
'TVF_IMP, CHECK ARGUMENTS PREDICTOR, CORRECTOR' 222 IF(limtra(i).EQ.kdir)
THEN 223 am2%D%R(n)=am2%D%R(n)-dt*tetaf(n)*fxbor(i)
229 IF(icor.LT.ncor)
THEN 236 IF(fxmatpar(i).LT.0.d0)
THEN 237 am2%D%R(i1) = am2%D%R(i1) - dt*tetaf(i1)*fxmat(i)
239 am2%D%R(i2) = am2%D%R(i2) + dt*tetaf(i2)*fxmat(i)
247 IF(fxmatpar(i).LT.0.d0)
THEN 248 am2%D%R(i1) = am2%D%R(i1) - dt*tetaf(i1)*fxmat(i)
249 am2%X%R(i)=dt*tetaf(i2)*fxmat(i)
252 am2%D%R(i2) = am2%D%R(i2) + dt*tetaf(i2)*fxmat(i)
254 am2%X%R(i+nseg)=-dt*tetaf(i1)*fxmat(i)
266 am2%D%R(i)=am2%D%R(i)
267 & +dt*tetaf(i)*volu2d(i)*max(smh(i),0.d0)
268 sm%R(i)=sm%R(i)+(fscexp(i)-(1.d0-tetaf(i))*fc(i))
269 & *volu2d(i)*dt*max(smh(i),0.d0)
271 ELSEIF(optsou.EQ.2)
THEN 273 am2%D%R(i)=am2%D%R(i)+dt*tetaf(i)*max(smh(i),0.d0)
274 sm%R(i)=sm%R(i)+(fscexp(i)-(1.d0-tetaf(i))*fc(i))
275 & *dt*max(smh(i),0.d0)
285 sm%R(i)=sm%R(i)-dt*psiexp(i)
291 IF(limtra(i).EQ.kdir)
THEN 293 sm%R(n)=sm%R(n)+dt*fxbor(i)*((1.d0-tetaf(n))*fc(n)-fbor(i))
301 IF(pluie(i).GT.0.d0)
THEN 303 sm%R(i)=sm%R(i)+dt*volu2d(i)*pluie(i)
304 & *(train-(1.d0-tetaf(i))*fc(i))
307 sm%R(i)=sm%R(i)+dt*volu2d(i)*pluie(i)
308 & *( -(1.d0-tetaf(i))*fc(i))
310 am2%D%R(i)=am2%D%R(i)+dt*tetaf(i)*volu2d(i)*pluie(i)
316 CALL os(
'X=Y ',x=bb1,y=am2%D)
317 IF(ncsize.GT.1)
CALL parcom(bb1,2,mesh)
322 IF(bb1%R(i).LT.1.d-15)
THEN 326 sm%R(i) =volu2d(i)*fc(i)
332 IF(icor.LT.ncor)
THEN 337 IF(fxmatpar(i).LT.0.d0)
THEN 338 sm%R(i1)=sm%R(i1)-dt*tetaf(i2)*fxmat(i)*f(i2)
340 sm%R(i2)=sm%R(i2)+dt*tetaf(i1)*fxmat(i)*f(i1)
348 f(i)=sm%R(i)/am2%D%R(i)
351 IF(slvpsi%SLV.EQ.7.OR.slvpsi%SLV.EQ.8)
THEN 353 CALL ad_solve(sf,am2,sm,bb,slvpsi,infogt,mesh,am2)
355 CALL solve(sf,am2,sm,bb,slvpsi,infogt,mesh,am2)
360 CALL os(
'X=Y ',x=bb1,y=sm)
361 CALL os(
'X=Y ',x=surdiag,y=am2%D)
363 CALL parcom(surdiag,2,mesh)
366 CALL os(
'X=1/Y ',x=surdiag,y=surdiag)
367 normb=sqrt(
p_dots(bb1,bb1,mesh))
371 CALL os(
'X=Y ',x=bb1,y=sm)
375 IF(fxmatpar(i).LT.0.d0)
THEN 376 bb1%R(i1)=bb1%R(i1)-am2%X%R(i )*f(i2)
378 bb1%R(i2)=bb1%R(i2)-am2%X%R(i+nseg)*f(i1)
381 IF(ncsize.GT.1)
CALL parcom(bb1,2,mesh)
384 bb1%R(i)=bb1%R(i)*surdiag%R(i)
392 IF(fxmatpar(i).LT.0.d0)
THEN 393 r%R(i1)=r%R(i1)-am2%X%R(i )*(f(i2)-bb1%R(i2))
395 r%R(i2)=r%R(i2)-am2%X%R(i+nseg)*(f(i1)-bb1%R(i1))
398 IF(ncsize.GT.1)
CALL parcom(r,2,mesh)
399 normr=sqrt(
p_dots(r,r,mesh))
410 f(i)=max(min(bb1%R(i),fmax),fmin)
413 IF(n.LT.slvpsi%NITMAX.AND.normr.GT.slvpsi%EPS*normb)
THEN 418 IF(normr.GT.slvpsi%EPS*normb)
THEN 419 IF(normb.GT.1.d0)
THEN 421 &
'JACOBI: MAXIMUM ITERATIONS REACHED ',n,
422 &
' ITERATIONS, RELATIVE PRECISION = ',normr/normb
425 &
'JACOBI: MAXIMUM ITERATIONS REACHED ',n,
426 &
' ITERATIONS, ABSOLUTE PRECISION = ',normr
429 IF(normb.GT.1.d0)
THEN 430 WRITE(
lu,*)
'JACOBI:',n,
431 &
' ITERATIONS, RELATIVE PRECISION = ',normr/normb
433 WRITE(
lu,*)
'JACOBI:',n,
434 &
' ITERATIONS, ABSOLUTE PRECISION = ',normr
447 IF(icor.EQ.ncor)
THEN 450 IF(limtra(i).EQ.kdir)
THEN 451 flbortra(i)=flbortra(i)+fxbor(i)*fbor(i)*surnit
452 ELSEIF(limtra(i).EQ.kddl)
THEN 454 flbortra(i)=flbortra(i)
455 & +fxbor(i)*(tetaf(n)*f(n)+(1.d0-tetaf(n))*fc(n))*surnit
463 IF(smh(i).GE.0.d0)
THEN 464 massou=massou+volu2d(i)*fscexp(i)*dt*smh(i)
466 massou=massou+volu2d(i)*
467 & (tetaf(i)*f(i)+(1.d0-tetaf(i))*fc(i))*dt*smh(i)
470 ELSEIF(optsou.EQ.2)
THEN 472 IF(smh(i).GE.0.d0)
THEN 473 massou=massou+fscexp(i)*dt*smh(i)
476 & (tetaf(i)*f(i)+(1.d0-tetaf(i))*fc(i))*dt*smh(i)
subroutine ad_solve(X, A, B, TB, CFG, INFOGR, MESH, AUX)
subroutine solve(X, A, B, TB, CFG, INFOGR, MESH, AUX)
subroutine tvf_imp(F, FC, FXMAT, FXMATPAR, DT, FXBOR, HNP1MT, FBOR, SMH, YASMH, FSCEXP, NSEG, NPOIN, NPTFR, GLOSEG, SIZGLO, NBOR, LIMTRA, KDIR, KDDL, OPTSOU, IOPT2, FLBORTRA, SURNIT, MESH, SF, RAIN, PLUIE, TRAIN, TETAF, INFOGT, VOLU2D, SM, PSIEXP, AM2, BB, SLVPSI, PREDICTOR, CORRECTOR, ICOR, NCOR, MASSOU)
subroutine os(OP, X, Y, Z, C, IOPT, INFINI, ZERO)
subroutine parcom(X, ICOM, MESH)
double precision function p_dots(X, Y, MESH)