23 SUBROUTINE leq_bicgs(VNAME, VNO, VAR, A_M, B_m, cmethod, &
41 CHARACTER(LEN=*),
INTENT(IN) :: Vname
43 INTEGER,
INTENT(IN) :: VNO
49 DOUBLE PRECISION,
DIMENSION(DIMENSION_3),
INTENT(INOUT) :: Var
52 DOUBLE PRECISION,
DIMENSION(DIMENSION_3,-3:3),
INTENT(INOUT) :: A_m
56 DOUBLE PRECISION,
DIMENSION(DIMENSION_3),
INTENT(INOUT) :: B_m
60 CHARACTER(LEN=*),
INTENT(IN) :: CMETHOD
62 DOUBLE PRECISION,
INTENT(IN) :: TOL
65 CHARACTER(LEN=4),
INTENT(IN) :: PC
67 INTEGER,
INTENT(IN) :: ITMAX
69 INTEGER,
INTENT(INOUT) :: IER
77 elseif(pc.eq.
'DIAG')
then 80 elseif(pc.eq.
'NONE')
then 85 'preconditioner option not found - check mfix.dat and readme' 107 SUBROUTINE leq_bicgs0(VNAME, VNO, VAR, A_M, B_m, cmethod, &
108 tol, itmax, matvec, msolve, use_pc, ier )
129 CHARACTER(LEN=*),
INTENT(IN) :: Vname
131 INTEGER,
INTENT(IN) :: VNO
137 DOUBLE PRECISION,
DIMENSION(DIMENSION_3),
INTENT(INOUT) :: Var
140 DOUBLE PRECISION,
DIMENSION(DIMENSION_3,-3:3),
INTENT(INOUT) :: A_m
143 DOUBLE PRECISION,
DIMENSION(DIMENSION_3),
INTENT(INOUT) :: B_m
146 CHARACTER(LEN=*),
INTENT(IN) :: CMETHOD
148 DOUBLE PRECISION,
INTENT(IN) :: TOL
150 INTEGER,
INTENT(IN) :: ITMAX
152 LOGICAL,
INTENT(IN) :: USE_PC
154 INTEGER,
INTENT(INOUT) :: IER
164 INTEGER,
PARAMETER :: idebugl = 0
165 DOUBLE PRECISION,
PARAMETER :: ratiotol = 0.2
166 LOGICAL,
PARAMETER :: do_unit_scaling = .true.
171 DOUBLE PRECISION,
DIMENSION(:),
allocatable :: R,Rtilde, Tvec,V
172 DOUBLE PRECISION,
DIMENSION(:),
allocatable,
target :: P, P_preconditioned
173 DOUBLE PRECISION,
DIMENSION(:),
allocatable,
target :: Svec, Svec_preconditioned
176 DOUBLE PRECISION,
POINTER :: Phat(:), Shat(:)
178 DOUBLE PRECISION,
DIMENSION(0:ITMAX+1) :: &
179 alpha, beta, omega, rho
180 DOUBLE PRECISION :: TxS, TxT, RtildexV, &
182 DOUBLE PRECISION :: Rnorm, Rnorm0, Snorm, TOLMIN, pnorm
183 LOGICAL :: isconverged
184 INTEGER :: i, j, k, ijk
186 DOUBLE PRECISION,
DIMENSION(2) :: TxS_TxT
194 if (do_unit_scaling)
then 199 aijmax = maxval(abs(a_m(ijk,:)) )
200 if (aijmax > 0.0)
then 202 a_m(ijk,:) = a_m(ijk,:)*oam
203 b_m(ijk) = b_m(ijk)*oam
216 aijmax = maxval(abs(a_m(ijk,:)) )
217 if (aijmax > 0.0)
then 219 a_m(ijk,:) = a_m(ijk,:)*oam
220 b_m(ijk) = b_m(ijk)*oam
266 p_preconditioned(:) =
zero 270 svec_preconditioned(:) =
zero 277 tolmin = epsilon(
one )
283 call matvec(vname, var, a_m, r)
298 call random_number(rtilde(:))
304 rtilde(:) = r(:) + (2.0d0*rtilde(:)-1.0d0)*1.0d-6*rnorm0
307 if (idebugl >= 1)
then 308 if(
mype.eq.0) print*,
'leq_bicgs, initial: ', vname,
' resid ', rnorm0
320 if (rho(i-1) .eq.
zero)
then 339 beta(i-1) = ( rho(i-1)/rho(i-2) )*( alpha(i-1) / omega(i-1)
341 p(:) = r(:) + beta(i-1)*( p(:) - omega(i-1)*v(:) )
349 call msolve(vname, p, a_m, p_preconditioned, cmethod)
350 phat => p_preconditioned
355 call matvec(vname, phat, a_m, v)
361 alpha(i) = rho(i-1) / rtildexv
366 svec(:) = r(:) - alpha(i) * v(:)
375 if (snorm <= tolmin)
then 377 var(:) = var(:) + alpha(i)*phat(:)
382 if (idebugl >= 1)
then 383 call matvec(vname, var, a_m, r)
403 call msolve(vname, svec, a_m, svec_preconditioned, cmethod)
404 shat => svec_preconditioned
409 call matvec( vname, shat, a_m, tvec )
433 var(:) = var(:) + alpha(i)*phat(:) + omega(i)*shat(:)
435 r(:) = svec(:) - omega(i)*tvec(:)
442 if (idebugl.ge.1)
then 444 print*,
'iter, Rnorm ', iter, rnorm, snorm
445 print*,
'alpha(i), omega(i) ', alpha(i), omega(i)
446 print*,
'TxS, TxT ', txs, txt
447 print*,
'RtildexV, rho(i-1) ', rtildexv, rho(i-1)
455 isconverged = (rnorm <= tol*rnorm0)
457 if (isconverged)
then 470 if (idebugl >= 1)
then 471 call matvec(vname, var, a_m, r)
479 if(
mype.eq.0) print*,
'leq_bicgs: final Rnorm ', rnorm
481 if(
mype.eq.0) print*,
'leq_bicgs ratio : ', vname,
' ',iter, &
486 if(.NOT.isconverged) isconverged = (
real(Rnorm) <= tol*rnorm0);
489 if (.not.isconverged)
then 492 if (
real(Rnorm) >= ratiotol*
real(rnorm0)) then
502 deallocate(p_preconditioned)
504 deallocate(svec_preconditioned)
subroutine leq_matvec(VNAME, VAR, A_M, Avar)
double precision, parameter one
integer, dimension(dim_eqs) iter_tot
subroutine leq_msolve(VNAME, B_m, A_M, Var, CMETHOD)
subroutine shift_dp_array(ARRAY)
subroutine leq_msolve0(VNAME, B_m, A_M, Var, CMETHOD)
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)
integer, parameter unit_log
subroutine leq_msolve1(VNAME, B_m, A_M, Var, CMETHOD)
logical minimize_dotproducts
double precision, parameter zero
subroutine leq_bicgs0(VNAME, VNO, VAR, A_M, B_m, cmethod, TOL, ITMAX, MATVEC, MSOLVE, USE_PC, IER)
subroutine leq_bicgs(VNAME, VNO, VAR, A_M, B_m, cmethod, TOL, PC, ITMAX, IER)