20 SUBROUTINE leq_bicgst(VNAME, VNO, VAR, A_M, B_m, cmethod, TOL, PC, ITMAX,IER)
45 DOUBLE PRECISION :: TOL
47 CHARACTER(LEN=4) :: PC
49 DOUBLE PRECISION,
DIMENSION(-3:3,ijkstart3:ijkend3) :: A_m
51 DOUBLE PRECISION,
DIMENSION(ijkstart3:ijkend3) :: B_m
53 CHARACTER(LEN=*) :: Vname
55 DOUBLE PRECISION,
DIMENSION(ijkstart3:ijkend3) :: Var
57 CHARACTER(LEN=*) :: CMETHOD
66 elseif(pc.eq.
'DIAG')
then 69 elseif(pc.eq.
'NONE')
then 73 IF(
dmp_log)
WRITE (
unit_log,*)
'preconditioner option not found - check mfix.dat and readme' 102 SUBROUTINE leq_bicgs0t(VNAME, VNO, VAR, A_M, B_m, cmethod, TOL, ITMAX, &
103 matvect, msolvet, ier )
130 DOUBLE PRECISION :: TOL
132 DOUBLE PRECISION,
DIMENSION(-3:3,ijkstart3:ijkend3) :: A_m
134 DOUBLE PRECISION,
DIMENSION(ijkstart3:ijkend3) :: B_m
136 CHARACTER(LEN=*) :: Vname
138 DOUBLE PRECISION,
DIMENSION(ijkstart3:ijkend3) :: Var
140 CHARACTER(LEN=*) :: CMETHOD
145 INTEGER,
PARAMETER :: idebugl = 1
146 DOUBLE PRECISION :: ratiotol = 0.2
148 DOUBLE PRECISION,
DIMENSION(ijkstart3:ijkend3) ::
150 DOUBLE PRECISION,
DIMENSION(0:ITMAX+1) :: alpha,beta,omega,rho
151 DOUBLE PRECISION :: TxS, TxT, oam,RtildexV, &
152 RtildexR, aijmax, Rnorm=0, rnorm0, snorm, tolmin
153 LOGICAL :: isconverged
154 INTEGER :: i, j, k, iter
157 DOUBLE PRECISION,
DIMENSION(2) :: TxS_TxT
162 EXTERNAL matvect, msolvet
164 logical,
parameter :: do_unit_scaling = .true.
207 tolmin = epsilon(
one )
209 if (do_unit_scaling)
then 221 aijmax = maxval(abs(a_m(:,ijk2)) )
225 a_m(:,ijk2) = a_m(:,ijk2)*oam
227 b_m(ijk2) = b_m(ijk2)*oam
240 call matvect( vname, var, a_m, r )
248 r(ijk2) = b_m(ijk2) - r(ijk2)
261 rnorm0 = rnorm0 + r(ijk2)*r(ijk2)
264 rnorm0 = dot_product(r,r)
266 rnorm0 = sqrt( rnorm0 )
271 call random_number(rtilde(:))
277 rtilde(ijk2) = r(ijk2) + (2.0d0*rtilde(ijk2)-1.0d0)*1.0d-6*rnorm0
280 rtilde(:) = r(:) + (2.0d0*rtilde(:)-1.0d0)*1.0d-6*rnorm0
283 if (idebugl >= 1)
then 284 if(
mype.eq.0) print*,
'leq_bicgs, initial: ', vname,
' resid ', rnorm0
298 rtildexr = rtildexr + rtilde(ijk2) * r(ijk2)
302 rho(i-1) = dot_product( rtilde, r )
310 if (rho(i-1) .eq.
zero)
then 338 beta(i-1) = ( rho(i-1)/rho(i-2) )*( alpha(i-1) / omega(i-1)
343 p(ijk2) = r(ijk2) + beta(i-1)*( p(ijk2) - omega(i-1)*v
346 p(:) = r(:) + beta(i-1)*( p(:) - omega(i-1)*v(:) )
355 call msolvet( vname, p, a_m, phat, cmethod)
357 call matvect( vname, phat, a_m, v )
365 rtildexv = rtildexv + rtilde(ijk2) * v(ijk2)
368 rtildexv = dot_product( rtilde, v )
376 alpha(i) = rho(i-1) / rtildexv
382 svec(ijk2) = r(ijk2) - alpha(i) * v(ijk2)
385 svec(:) = r(:) - alpha(i) * v(:)
399 snorm = snorm + svec(ijk2) * svec(ijk2)
402 snorm = dot_product( svec, svec )
404 snorm = sqrt( snorm )
411 if (snorm <= tolmin)
then 416 var(ijk2) = var(ijk2) + alpha(i)*phat(ijk2)
419 var(:) = var(:) + alpha(i)*phat(:)
422 if (idebugl >= 1)
then 426 call matvect( vname, var, a_m, r )
435 r(ijk2) = b_m(ijk2) - r(ijk2)
447 rnorm = rnorm + r(ijk2)*r(ijk2)
450 rnorm = dot_product( r, r )
452 rnorm = sqrt( rnorm )
468 call msolvet( vname, svec, a_m, shat, cmethod)
470 call matvect( vname, shat, a_m, tvec )
479 txs = txs + tvec(ijk2) * svec(ijk2)
480 txt = txt + tvec(ijk2) * tvec(ijk2)
483 txs = dot_product( tvec, svec )
484 txt = dot_product( tvec, tvec )
504 var(ijk2) = var(ijk2) + &
505 alpha(i)*phat(ijk2) + omega(i)*shat(ijk2)
506 r(ijk2) = svec(ijk2) - omega(i)*tvec(ijk2)
510 alpha(i)*phat(:) + omega(i)*shat(:)
511 r(:) = svec(:) - omega(i)*tvec(:)
521 rnorm = rnorm + r(ijk2) * r(ijk2)
524 rnorm = dot_product(r, r )
526 rnorm = sqrt( rnorm )
531 if (idebugl.ge.1)
then 533 print*,
'iter, Rnorm ', iter, rnorm, snorm
534 print*,
'alpha(i), omega(i) ', alpha(i), omega(i)
535 print*,
'TxS, TxT ', txs, txt
536 print*,
'RtildexV, rho(i-1) ', rtildexv, rho(i-1)
545 isconverged = (rnorm <= tol*rnorm0)
547 if (isconverged)
then 559 if (idebugl >= 1)
then 560 call matvect( vname, var, a_m, r )
565 r(ijk2) = r(ijk2) - b_m(ijk2)
577 rnorm = rnorm + r(ijk2) * r(ijk2)
580 rnorm = dot_product( r,r)
582 rnorm = sqrt( rnorm )
587 if(
mype.eq.0) print*,
'leq_bicgs: final Rnorm ', rnorm
589 if(
mype.eq.0) print*,
'leq_bicgs ratio : ', vname,
' ',iter,
593 isconverged = (
real(Rnorm) <= tol*rnorm0);
596 if (.not.isconverged)
then 599 if (
real(Rnorm) >= ratiotol*
real(rnorm0)) then
660 CHARACTER(LEN=*) Vname
676 INTEGER :: NSTART, NEND
677 DOUBLE PRECISION,
DIMENSION (JSTART:JEND) :: CC,DD,EE,BB
678 INTEGER :: INFO, IJK, J, K, IM1JK, IP1JK
693 bb(j) = b_m(ijk) - a_m(-1, ijk) * var( im1jk ) &
694 - a_m(1, ijk) * var( ip1jk )
765 CHARACTER(LEN=*) Vname
782 DOUBLE PRECISION,
DIMENSION (JSTART:JEND) :: CC,DD,EE, BB
783 INTEGER :: NSTART, NEND, INFO, IJK, J, IM1JK, IP1JK, IJKM1, IJKP1
801 bb(j) = b_m(ijk) - a_m(-1, ijk) * var( im1jk ) &
802 - a_m(1, ijk) * var( ip1jk ) &
803 - a_m(-3, ijk) * var( ijkm1 ) &
804 - a_m(3, ijk) * var( ijkp1 )
815 write(*,*)
'leq_iksweep',info,
mype 877 CHARACTER(LEN=*) Vname
891 INTEGER I, J, K, IJK2
893 integer :: im1jk,ip1jk, ijm1k,ijp1k, ijkm1,ijkp1
918 avar(ijk2) = a_m(-3, ijk2) * var(ijkm1) &
919 + a_m(-2, ijk2) * var(ijm1k) &
920 + a_m(-1, ijk2) * var(im1jk) &
921 + a_m(0, ijk2) * var(ijk2) &
922 + a_m(1, ijk2) * var(ip1jk) &
923 + a_m(2, ijk2) * var(ijp1k) &
924 + a_m(3, ijk2) * var(ijkp1)
946 avar(ijk2) = a_m(-2, ijk2) * var(ijm1k) &
947 + a_m(-1, ijk2) * var(im1jk) &
948 + a_m(0, ijk2) * var(ijk2) &
949 + a_m(1, ijk2) * var(ip1jk) &
950 + a_m(2, ijk2) * var(ijp1k)
978 SUBROUTINE leq_msolvet(VNAME, B_m, A_M, Var, CMETHOD)
1005 CHARACTER(LEN=*) Vname
1020 INTEGER :: I, J, K, ITER, NITER, IJK2
1021 INTEGER :: I1 , K1 , I2, K2, IK, ISIZE, KSIZE
1026 CHARACTER(LEN=4) :: CMETHOD
1028 LOGICAL :: DO_ISWEEP, DO_JSWEEP, DO_KSWEEP
1029 LOGICAL :: DO_SENDRECV, DO_REDBLACK
1030 LOGICAL,
PARAMETER :: USE_IKLOOP = .false.
1032 LOGICAL,
PARAMETER :: SETGUESS = .true.
1048 ijk2 = funijk(i,j,k)
1050 var(ijk2) = b_m(ijk2)
1060 niter = len( cmethod )
1066 ch = cmethod( iter:iter )
1067 do_isweep = (ch .EQ.
'I') .OR. (ch .EQ.
'i')
1068 do_jsweep = (ch .EQ.
'J') .OR. (ch .EQ.
'j')
1069 do_ksweep = (ch .EQ.
'K') .OR. (ch .EQ.
'k')
1070 do_sendrecv = (ch .EQ.
'S') .OR. (ch .EQ.
's')
1071 do_redblack = (ch .EQ.
'R') .OR. (ch .EQ.
'r')
1075 IF ( do_isweep )
THEN 1084 IF(do_redblack)
THEN 1095 DO ik=icase, ksize*isize, 2
1096 if (mod(ik,isize).ne.0)
then 1097 k = int( ik/isize ) + k1
1099 k = int( ik/isize ) + k1 -1
1101 i = (ik-1-(k-k1)*isize) + i1 + mod(k,2)
1102 if(i.gt.i2) i=i-i2 + i1 -1
1121 DO ik=1, ksize*isize
1122 if (mod(ik,isize).ne.0)
then 1123 k = int( ik/isize ) + k1
1125 k = int( ik/isize ) + k1 -1
1127 i = (ik-1-(k-k1)*isize) + i1
1134 DO ik=1, ksize*isize
1135 if (mod(ik,ksize).ne.0)
then 1136 i = int( ik/ksize ) + i1
1138 i = int( ik/ksize ) + i1 -1
1140 k = (ik-1-(i-i1)*ksize) + k1
1228 CHARACTER(LEN=*) Vname
1242 DOUBLE PRECISION,
DIMENSION (IMAX2) :: CC,DD,EE,BB
1243 INTEGER :: NN, INFO, IJK, I
1251 cc(i) = a_m(-1, ijk)
1253 bb(i) = b_m(ijk) - a_m(-2,ijk) * var( jm_of(ijk) )
1264 CALL dgtsl( nn, cc, dd, ee, bb, info )
1329 CHARACTER(LEN=*) Vname
1344 DOUBLE PRECISION,
DIMENSION (KMAX2) :: CC,DD,EE,BB
1345 INTEGER :: NN, INFO, IJK, K
1355 bb(k) = b_m(ijk) - a_m(-2,ijk) * var( jm_of(ijk) )
1366 CALL dgtsl( nn, cc, dd, ee, bb, info )
1384 SUBROUTINE leq_msolve0t(VNAME, B_m, A_M, Var, CMETHOD )
1413 CHARACTER(LEN=*) Vname
1419 CHARACTER(LEN=4) :: CMETHOD
1438 SUBROUTINE leq_msolve1t(VNAME, B_m, A_M, Var, CMETHOD )
1468 CHARACTER(LEN=*) Vname
1473 CHARACTER(LEN=4) :: CMETHOD
1475 integer :: i,j,k, ijk2
1497 ijk2 = funijk( i,j,k )
1498 var(ijk2) = b_m(ijk2)/a_m(0,ijk2)
subroutine leq_msolvet(VNAME, B_m, A_M, Var, CMETHOD)
subroutine leq_msolve0t(VNAME, B_m, A_M, Var, CMETHOD)
subroutine leq_isweept(I, Vname, VAR, A_M, B_M)
subroutine leq_msolve1t(VNAME, B_m, A_M, Var, CMETHOD)
double precision, parameter one
integer, dimension(dim_eqs) iter_tot
subroutine leq_jksweept(J, K, Vname, VAR, A_M, B_M)
subroutine mfix_exit(myID, normal_termination)
double precision function dot_product_par(r1, r2)
double precision, parameter small_number
double precision function, dimension(2) dot_product_par2(r1, r2, r3, r4)
subroutine dgtsv(N, NRHS, DL, D, DU, B, LDB, INFO)
integer, parameter unit_log
subroutine leq_matvect(VNAME, VAR, A_M, Avar)
subroutine leq_bicgst(VNAME, VNO, VAR, A_M, B_m, cmethod, TOL, PC
logical minimize_dotproducts
subroutine leq_bicgs0t(VNAME, VNO, VAR, A_M, B_m, cmethod, TOL, I
subroutine dgtsl(n, c, d, e, b, info)
subroutine leq_ijsweept(I, J, Vname, VAR, A_M, B_M)
subroutine leq_iksweept(I, K, Vname, VAR, A_M, B_M)
double precision, parameter zero