17 SUBROUTINE solve_lin_eq(VNAME, Vno, VAR, A_M, B_M, M, ITMAX,&
18 method, sweep, tol1, pc, ier)
35 CHARACTER(LEN=*),
INTENT(IN) :: Vname
49 INTEGER,
INTENT(IN) :: Vno
60 INTEGER,
INTENT(IN) :: M
62 INTEGER,
INTENT(IN) :: ITMAX
68 INTEGER,
INTENT(IN) :: METHOD
71 CHARACTER(LEN=4),
INTENT(IN) :: SWEEP
73 DOUBLE PRECISION,
INTENT(IN) :: TOL1
76 CHARACTER(LEN=4),
INTENT(IN) :: PC
78 INTEGER,
INTENT(INOUT) :: IER
83 LOGICAL,
PARAMETER :: adjust_leq_tol = .false.
84 LOGICAL,
PARAMETER :: leq_tol_scheme1 = .false.
86 INTEGER,
PARAMETER :: MAX_IT = 1
91 DOUBLE PRECISION :: max_resid_local, tol_resid_max
93 DOUBLE PRECISION :: TOL
95 DOUBLE PRECISION,
ALLOCATABLE,
DIMENSION(:,:) :: A_MT
99 CHARACTER(LEN=80) :: LINE0, LINE1
105 IF(adjust_leq_tol)
THEN 106 max_resid_local = maxval(
resid(:,m),1)
108 IF(leq_tol_scheme1.AND.
resid(vno,m).LT.1.0d-1)
THEN 111 elseif (vno.eq.6)
then 113 elseif (vno.eq.7)
then 115 elseif (vno.eq.8)
then 118 Write(*,*)
'Adjusting LEQ_Tolerance', vname, tol,
resid(vno,m
119 ELSEIF(max_resid_local.LT.1.0d-1)
THEN 120 tol = max(tol1,tol1*max_resid_local/tol_resid_max)
121 Write(*,*)
'Adjusting LEQ_Tolerance', vname, tol, max_resid_local
134 CALL leq_sor (vname, vno, var, a_m(:,:,m), b_m(:,m), &
144 a_mt(ii,ijk) = a_m(ijk,ii,m)
147 call leq_bicgst(vname, vno, var, a_mt(:,:), b_m(:,m), &
148 sweep, tol, pc, itmax, ier)
151 call leq_bicgs(vname, vno, var, a_m(:,:,m), b_m(:,m),&
152 sweep, tol, pc, itmax, ier)
158 call leq_gmres(vname, vno, var, a_m(:,:,m), b_m(:,m),&
159 sweep, tol, itmax, max_it, ier)
164 call leq_bicgs(vname,vno, var, a_m(:,:,m), b_m(:,m), sweep,&
166 IF (ier .eq. -2)
THEN 168 print*,
'calling leq_gmres', vname
169 call leq_gmres(vname, vno, var, a_m(:,:,m), b_m(:,m),&
170 sweep, tol, itmax, max_it, ier)
176 call leq_cg(vname, vno, var, a_m(:,:,m), b_m(:,m), sweep,&
185 line0(1:14) =
'SOLVE_LIN_EQ: ' 187 WRITE(line1,
'(A, I2, A)') &
188 'Error: LEQ_METHOD = ', method,
' is invalid'
subroutine write_error(NAME, LINE, LMAX)
double precision tol_resid_t
subroutine leq_gmres(VNAME, VNO, VAR, A_M, B_M, cmethod, TOL, ITMAX, MAX_IT, IER)
double precision tol_resid_th
subroutine leq_bicgst(VNAME, VNO, VAR, A_M, B_m, cmethod, TOL, PC
double precision tol_resid
double precision tol_resid_x
subroutine leq_cg(VNAME, VNO, VAR, A_M, B_m, cmethod, TOL, PC, ITMAX, IER)
double precision, dimension(:,:), allocatable resid
subroutine leq_sor(VNAME, VNO, VAR, A_M, B_M, ITMAX, IER)
subroutine leq_bicgs(VNAME, VNO, VAR, A_M, B_m, cmethod, TOL, PC, ITMAX, IER)
subroutine solve_lin_eq(VNAME, Vno, VAR, A_M, B_M, M, ITMAX, METHOD, SWEEP, TOL1, PC, IER)