MFIX  2016-1
test_lin_eq.f
Go to the documentation of this file.
1 !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvC
2 ! C
3 ! Module name: TEST_LIN_EQ(A_m, LEQIT, LEQMETHOD, LEQSWEEP, LEQTOL, LEQPC, TEST, IER)
4 ! Purpose: Routine for testing the accuracy of linear equation solver C
5 ! C
6 ! C
7 ! Author: M. Syamlal Date: 4-JUN-96 C
8 ! Reviewer: Date: C
9 ! C
10 ! **** See Solve_energy_eq.f for an example **** C
11 !
12 ! Literature/Document References: C
13 ! C
14 ! Variables referenced: C
15 ! Variables modified: C
16 ! C
17 ! Local variables: C
18 ! C
19 !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^C
20 !
21 !
22  SUBROUTINE test_lin_eq(A_M, LEQIT, LEQMETHOD, LEQSWEEP, LEQTOL, LEQPC, TEST, IER)
23 !...Translated by Pacific-Sierra Research VAST-90 2.06G5 12:17:31 12/09/98
24 !...Switches: -xf
25 !-----------------------------------------------
26 ! M o d u l e s
27 !-----------------------------------------------
28  USE param
29  USE param1
30  USE geometry
31  USE indices
32  USE compar
33  USE functions
34  IMPLICIT NONE
35 !-----------------------------------------------
36 ! D u m m y A r g u m e n t s
37 !-----------------------------------------------
38  INTEGER TEST !=0 use the passed A_m; =1 construct a random A_m
39  INTEGER IER
40  DOUBLE PRECISION, DIMENSION(DIMENSION_3,-3:3) :: A_M
41 !-----------------------------------------------
42 ! L o c a l P a r a m e t e r s
43 !-----------------------------------------------
44 !-----------------------------------------------
45 ! L o c a l V a r i a b l e s
46 !-----------------------------------------------
47  INTEGER :: IJKERR
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
53 !
54 ! linear equation solver method and iterations
55  INTEGER LEQMETHOD, LEQIT
56  CHARACTER(LEN=4) :: LEQSWEEP
57  DOUBLE PRECISION LEQTOL
58  CHARACTER(LEN=4) :: LEQPC
59  REAL :: Harvest
60 
61 ! Initialize the random number generator
62 !
63  CALL random_seed
64 !
65 ! Fill the A and x arrays with random numbers, but ensuring that
66 ! the matrix is diagonally dominant
67 !
68  DO ijk = ijkstart3, ijkend3
69  CALL random_number(harvest)
70  x_act(ijk) = dble(harvest) + 1.e-5
71  x_sol(ijk) = 0.0
72  IF (test == 0) THEN
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)
80  ELSE
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)
95  ENDIF
96  END DO
97 
98 
99 !
100 !!!$omp parallel do private( IJK, IpJK, ImJK, IJpK, IJmK, IJKp, IJKm)
101  DO ijk = ijkstart3, ijkend3
102 
103  imjk = im_of(ijk)
104  ijmk = jm_of(ijk)
105  ipjk = ip_of(ijk)
106  ijpk = jp_of(ijk)
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)
111  IF(j_of(ijk) < jmax2) bm(ijk) = bm(ijk) + am(ijk,north)*x_act(ijpk)
112  IF (do_k) THEN
113  ijkm = km_of(ijk)
114  ijkp = kp_of(ijk)
115  IF(k_of(ijk) > 1) bm(ijk) = bm(ijk) + am(ijk,bottom)*x_act(ijkm)
116  IF(k_of(ijk) < kmax2) bm(ijk) = bm(ijk) + am(ijk,top)*x_act(ijkp)
117  ENDIF
118  END DO
119 
120 !
121 ! Solve the linear equation
122 !
123  CALL solve_lin_eq ('Test', 1, x_sol, am, bm, 0, leqit, leqmethod, leqsweep, leqtol, leqpc, ier)
124 !
125 ! Check the solution
126 !
127  errsum = 0.0
128  xsum = 0.0
129  errmax = 0.0
130  ijkerr = 0
131  DO ijk = ijkstart3, ijkend3
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
135  err = 0.0
136  ELSE
137  err = 1.0d32
138  ENDIF
139  IF (err > errmax) THEN
140  errmax = err
141  ijkerr = ijk
142  ENDIF
143  errsum = errsum + abs(x_sol(ijk)-x_act(ijk))
144  xsum = xsum + abs(x_act(ijk))
145 ! print *, ijk, i_of(ijk), j_of(ijk), nint(err * 100.)
146  END DO
147  IF (xsum /= 0.0) THEN
148  err = errsum/xsum
149  ELSE IF (errsum == 0.0) THEN
150  err = 0.0
151  ELSE
152  err = 1.0d32
153  ENDIF
154 !
155  IF (err < leqtol) THEN
156  ier = 0
157  line(1) = 'Message: Lin equation solution satisfies tolerance.'
158  ELSE
159  ier = 1
160  line(1) = 'Error: Lin equation solution does not satisfy tolerance!'
161  ENDIF
162 !
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(ijkerr)
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)=', &
169  x_act(1), ' Xa(', ijkmax2/2, ')=', x_act(ijkmax2/2), ' Xa(', ijkmax2, ')=', &
170  x_act(ijkmax2)
171  WRITE (line(8), '(A,G12.5, A, I6, A, G12.5, A, I6, A, G12.5)') 'Xs(1)=', &
172  x_sol(1), ' Xs(', ijkmax2/2, ')=', x_sol(ijkmax2/2), ' Xs(', ijkmax2&
173  , ')=', x_sol(ijkmax2)
174 !
175  CALL write_error ('TEST_LIN_EQ', line, 8)
176 !
177  RETURN
178  END SUBROUTINE test_lin_eq
179 
180 
181 
182 
integer imax2
Definition: geometry_mod.f:61
integer, dimension(:), allocatable i_of
Definition: indices_mod.f:45
integer ijkend3
Definition: compar_mod.f:80
subroutine write_error(NAME, LINE, LMAX)
Definition: write_error.f:21
integer ijkmax2
Definition: geometry_mod.f:80
subroutine test_lin_eq(A_M, LEQIT, LEQMETHOD, LEQSWEEP, LEQTOL, LE
Definition: test_lin_eq.f:23
integer east
Definition: param_mod.f:29
integer, dimension(:), allocatable k_of
Definition: indices_mod.f:47
integer, dimension(:), allocatable j_of
Definition: indices_mod.f:46
integer jmax2
Definition: geometry_mod.f:63
integer north
Definition: param_mod.f:37
integer south
Definition: param_mod.f:41
integer kmax2
Definition: geometry_mod.f:65
Definition: param_mod.f:2
logical do_k
Definition: geometry_mod.f:30
integer ijkstart3
Definition: compar_mod.f:80
integer west
Definition: param_mod.f:33
integer top
Definition: param_mod.f:45
integer bottom
Definition: param_mod.f:49
subroutine solve_lin_eq(VNAME, Vno, VAR, A_M, B_M, M, ITMAX, METHOD, SWEEP, TOL1, PC, IER)
Definition: solve_lin_eq.f:19