22 SUBROUTINE test_lin_eq(A_M, LEQIT, LEQMETHOD, LEQSWEEP, LEQTOL, LEQPC, TEST, IER)
40 DOUBLE PRECISION,
DIMENSION(DIMENSION_3,-3:3) :: A_M
48 INTEGER IJK, IpJK, ImJK, IJpK, IJmK, IJKp, IJKm
49 DOUBLE PRECISION,
DIMENSION(DIMENSION_3,-3:3) :: Am
50 DOUBLE PRECISION,
DIMENSION(DIMENSION_3) :: Bm, X_ACT, X_SOL
51 DOUBLE PRECISION :: ERR, ERRMAX, ERRSUM, XSUM
52 CHARACTER(LEN=80),
DIMENSION(8) :: LINE
55 INTEGER LEQMETHOD, LEQIT
56 CHARACTER(LEN=4) :: LEQSWEEP
57 DOUBLE PRECISION LEQTOL
58 CHARACTER(LEN=4) :: LEQPC
69 CALL random_number(harvest)
70 x_act(ijk) = dble(harvest) + 1.e-5
73 am(ijk,-3) = a_m(ijk,-3)
74 am(ijk,-2) = a_m(ijk,-2)
75 am(ijk,-1) = a_m(ijk,-1)
76 am(ijk,0) = a_m(ijk,0)
77 am(ijk,1) = a_m(ijk,1)
78 am(ijk,2) = a_m(ijk,2)
79 am(ijk,3) = a_m(ijk,3)
81 CALL random_number(harvest)
82 am(ijk,-3) = dble(harvest)
83 CALL random_number(harvest)
84 am(ijk,-2) = dble(harvest)
85 CALL random_number(harvest)
86 am(ijk,-1) = dble(harvest)
87 CALL random_number(harvest)
88 am(ijk,0) = -dble(max(harvest,0.1))*70.
89 CALL random_number(harvest)
90 am(ijk,1) = dble(harvest)
91 CALL random_number(harvest)
92 am(ijk,2) = dble(harvest)
93 CALL random_number(harvest)
94 am(ijk,3) = dble(harvest)
107 bm(ijk) = am(ijk,0)*x_act(ijk)
108 IF(
i_of(ijk) > 1) bm(ijk) = bm(ijk) + am(ijk,
west)*x_act(imjk
109 IF(
i_of(ijk) <
imax2) bm(ijk) = bm(ijk) +am(ijk,
east)*x_act(ipjk
110 IF(
j_of(ijk) > 1) bm(ijk) = bm(ijk) + am(ijk,
south)*x_act(ijmk
115 IF(
k_of(ijk) > 1) bm(ijk) = bm(ijk) + am(ijk,
bottom)*x_act
116 IF(
k_of(ijk) <
kmax2) bm(ijk) = bm(ijk) + am(ijk,
top)*x_act
123 CALL solve_lin_eq (
'Test', 1, x_sol, am, bm, 0, leqit, leqmethod, leqsweep
132 IF (x_act(ijk) /= 0.0)
THEN 133 err = abs(x_sol(ijk)-x_act(ijk))/x_act(ijk)
134 ELSE IF (x_sol(ijk) == 0.0)
THEN 139 IF (err > errmax)
THEN 143 errsum = errsum + abs(x_sol(ijk)-x_act(ijk))
144 xsum = xsum + abs(x_act(ijk))
147 IF (xsum /= 0.0)
THEN 149 ELSE IF (errsum == 0.0)
THEN 155 IF (err < leqtol)
THEN 157 line(1) =
'Message: Lin equation solution satisfies tolerance.' 160 line(1) =
'Error: Lin equation solution does not satisfy tolerance!' 163 WRITE (line(2), *)
'Average normalized error = ', err
164 WRITE (line(3), *)
'Max normalized error = ', errmax
165 WRITE (line(4), *)
'Location of max error = ', ijkerr
166 WRITE (line(5), *)
'Xa and Xs @ max error = ', x_act(ijkerr), x_sol
167 WRITE (line(6), *)
'Sample values of actual (Xa) and solution (Xs):' 168 WRITE (line(7),
'(A,G12.5, A, I6, A, G12.5, A, I6, A, G12.5)')
'Xa(1)=' 171 WRITE (line(8),
'(A,G12.5, A, I6, A, G12.5, A, I6, A, G12.5)')
'Xs(1)='
integer, dimension(:), allocatable i_of
subroutine write_error(NAME, LINE, LMAX)
subroutine test_lin_eq(A_M, LEQIT, LEQMETHOD, LEQSWEEP, LEQTOL, LE
integer, dimension(:), allocatable k_of
integer, dimension(:), allocatable j_of
subroutine solve_lin_eq(VNAME, Vno, VAR, A_M, B_M, M, ITMAX, METHOD, SWEEP, TOL1, PC, IER)