MFIX  2016-1
check_ab_m.f
Go to the documentation of this file.
1 !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvC
2 ! C
3 ! Module name: Check_Ab_m(A_m, b_m, M, src, IER) C C
4 ! Purpose: Check the entries of the sparse matrix coefficients and theC
5 ! source vector, if src is set true. C
6 ! C
7 ! C
8 ! Author: M. Syamlal Date: 16-MAY-96 C
9 ! Reviewer: Date: C
10 ! C
11 ! C
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  SUBROUTINE check_ab_m(A_M, B_M, M, SRC, IER)
21 !...Translated by Pacific-Sierra Research VAST-90 2.06G5 12:17:31 12/09/98
22 !...Switches: -xf
23 !
24 ! Include param.inc file to specify parameter values
25 !
26 !-----------------------------------------------
27 ! M o d u l e s
28 !-----------------------------------------------
29  USE compar
30  USE exit, ONLY: mfix_exit
31  USE functions
32  USE geometry
33  USE indices
34  USE param
35  USE param1
36  IMPLICIT NONE
37 !-----------------------------------------------
38 ! G l o b a l P a r a m e t e r s
39 !-----------------------------------------------
40 !-----------------------------------------------
41 ! D u m m y A r g u m e n t s
42 !-----------------------------------------------
43 !
44 ! Error index
45  INTEGER IER
46 !
47 ! Phase index
48  INTEGER M
49 !
50 ! Check source. Check source term only for
51 ! variables, such as temperatures and
52 ! mass fractions, that are always positive.
53  LOGICAL SRC
54 !
55 ! Error message
56  CHARACTER(LEN=80) :: LINE(1)
57 !
58 ! cell index
59  INTEGER IJK
60 !
61 ! Septadiagonal matrix A_m
62  DOUBLE PRECISION A_m(dimension_3, -3:3, 0:dimension_m)
63 !
64 ! Source vector
65  DOUBLE PRECISION b_m(dimension_3, 0:dimension_m)
66 !-----------------------------------------------
67 
68  ier = 0
69  DO ijk = ijkstart3, ijkend3
70  IF (.NOT.wall_at(ijk)) THEN
71  IF (a_m(ijk,bottom,m) < zero) THEN
72  IF (abs(a_m(ijk,bottom,m)) > small_number) THEN
73  WRITE (line(1), *) 'Error: Diagonal-b < 0. Phase = ', m, &
74  ' IJK = ', ijk
75  CALL write_error ('CHECK_Ab_m', line, 1)
76  GO TO 500
77  ELSE
78  a_m(ijk,bottom,m) = zero
79  ENDIF
80  ENDIF
81  IF (a_m(ijk,south,m) < zero) THEN
82  IF (abs(a_m(ijk,south,m)) > small_number) THEN
83  WRITE (line(1), *) 'Error: Diagonal-s < 0. Phase = ', m, &
84  ' IJK = ', ijk
85  CALL write_error ('CHECK_Ab_m', line, 1)
86  GO TO 500
87  ELSE
88  a_m(ijk,south,m) = zero
89  ENDIF
90  ENDIF
91  IF (a_m(ijk,west,m) < zero) THEN
92  IF (abs(a_m(ijk,west,m)) > small_number) THEN
93  WRITE (line(1), *) 'Error: Diagonal-w < 0. Phase = ', m, &
94  ' IJK = ', ijk
95  CALL write_error ('CHECK_Ab_m', line, 1)
96  GO TO 500
97  ELSE
98  a_m(ijk,west,m) = zero
99  ENDIF
100  ENDIF
101  IF (a_m(ijk,east,m) < zero) THEN
102  IF (abs(a_m(ijk,east,m)) > small_number) THEN
103  WRITE (line(1), *) 'Error: Diagonal-e < 0. Phase = ', m, &
104  ' IJK = ', ijk
105  CALL write_error ('CHECK_Ab_m', line, 1)
106  GO TO 500
107  ELSE
108  a_m(ijk,east,m) = zero
109  ENDIF
110  ENDIF
111  IF (a_m(ijk,north,m) < zero) THEN
112  IF (abs(a_m(ijk,north,m)) > small_number) THEN
113  WRITE (line(1), *) 'Error: Diagonal-n < 0. Phase = ', m, &
114  ' IJK = ', ijk
115  CALL write_error ('CHECK_Ab_m', line, 1)
116  GO TO 500
117  ELSE
118  a_m(ijk,north,m) = zero
119  ENDIF
120  ENDIF
121  IF (a_m(ijk,top,m) < zero) THEN
122  IF (abs(a_m(ijk,top,m)) > small_number) THEN
123  WRITE (line(1), *) 'Error: Diagonal-t < 0. Phase = ', m, &
124  ' IJK = ', ijk
125  CALL write_error ('CHECK_Ab_m', line, 1)
126  GO TO 500
127  ELSE
128  a_m(ijk,top,m) = zero
129  ENDIF
130  ENDIF
131  IF (a_m(ijk,0,m) >= zero) THEN
132  WRITE (line(1), *) 'Error: Main Diagonal >= 0. Phase = ', m, &
133  ' IJK = ', ijk
134  CALL write_error ('CHECK_Ab_m', line, 1)
135  GO TO 500
136  ENDIF
137  IF (src) THEN
138  IF (b_m(ijk,m) > zero) THEN
139  IF (b_m(ijk,m) > small_number) THEN
140  WRITE (line(1), *) 'Error: Source term >0. Phase = ', m, &
141  ' IJK = ', ijk
142  CALL write_error ('CHECK_Ab_m', line, 1)
143  GO TO 500
144  ELSE
145  b_m(ijk,m) = zero
146  ENDIF
147  ENDIF
148  ENDIF
149  ENDIF
150  END DO
151  RETURN
152 !
153 ! error condition
154  500 CONTINUE
155  ier = 1
156  CALL write_ab_m (a_m, b_m, ijkmax2, m, ier)
157  call mfix_exit(mype)
158  END SUBROUTINE check_ab_m
159 
160 
161 !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvC
162 ! C
163 ! Module name: Check_symmetry(A_m, M, IER)
164 ! Purpose: Check whether the A_m matrix is symmetric
165 ! C
166 ! Author: M. Syamlal Date: 19-JUL-07 C
167 ! Reviewer: Date: C
168 ! C
169 ! C
170 ! Literature/Document References: C
171 ! C
172 ! Variables referenced: C
173 ! Variables modified: C
174 ! C
175 ! Local variables: C
176 ! C
177 !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^C
178  SUBROUTINE check_symmetry(A_M, M, IER)
179 !
180 !-----------------------------------------------
181 ! M o d u l e s
182 !-----------------------------------------------
183  USE param
184  USE param1
185  USE geometry
186  USE indices
187  USE compar
188  USE functions
189  IMPLICIT NONE
190 !-----------------------------------------------
191 ! G l o b a l P a r a m e t e r s
192 !-----------------------------------------------
193 !-----------------------------------------------
194 ! D u m m y A r g u m e n t s
195 !-----------------------------------------------
196 !
197 ! Error index
198  INTEGER IER
199 !
200 ! Phase index
201  INTEGER M
202 
203 ! cell index
204  INTEGER IJK, ipjk, ijpk, ijkp, i, j, k
205 !
206 ! Septadiagonal matrix A_m
207  DOUBLE PRECISION A_m(dimension_3, -3:3, 0:dimension_m)
208 !-----------------------------------------------
209  ier = 0
210  DO ijk = ijkstart3, ijkend3
211  !No need to check the matrix entries for cyclic
212  ! cells as they are not used during the linear solve.
213  if(.not. cyclic_at(ijk))then
214  ipjk = ip_of(ijk)
215  ijpk = jp_of(ijk)
216  ijkp = kp_of(ijk)
217  i = i_of(ijk)
218  j = j_of(ijk)
219  k = k_of(ijk)
220  IF(a_m(ijk, east, m) .ne. a_m(ipjk, west, m))then
221  print *, i,j,k, 'east-west asymmetry', a_m(ijk,east,m), a_m(ipjk,west,m)
222  ier = ier + 1
223  endif
224  IF(a_m(ijk, north, m) .ne. a_m(ijpk, south, m))then
225  print *, i,j,k, 'north-south asymmetry', a_m(ijk,north,m), a_m(ijpk,south,m)
226  ier = ier + 1
227  endif
228  IF(a_m(ijk, top, m) .ne. a_m(ijkp, bottom, m))then
229  print *, i,j,k, 'top-bottom asymmetry', a_m(ijk,top,m), a_m(ijkp,bottom,m)
230  ier = ier + 1
231  endif
232  endif
233  enddo
234  if(ier > 0) print *, 'Asymmetry in ', ier, ' instances'
235  RETURN
236  END SUBROUTINE check_symmetry
subroutine check_ab_m(A_M, B_M, M, SRC, IER)
Definition: check_ab_m.f:21
integer, dimension(:), allocatable i_of
Definition: indices_mod.f:45
integer ijkend3
Definition: compar_mod.f:80
integer dimension_3
Definition: param_mod.f:11
subroutine write_error(NAME, LINE, LMAX)
Definition: write_error.f:21
integer ijkmax2
Definition: geometry_mod.f:80
subroutine write_ab_m(A_M, B_M, M)
Definition: write_ab_m.f:22
integer east
Definition: param_mod.f:29
integer, dimension(:), allocatable k_of
Definition: indices_mod.f:47
subroutine mfix_exit(myID, normal_termination)
Definition: exit.f:5
integer, dimension(:), allocatable j_of
Definition: indices_mod.f:46
double precision, parameter small_number
Definition: param1_mod.f:24
Definition: exit.f:2
integer north
Definition: param_mod.f:37
subroutine check_symmetry(A_M, M, IER)
Definition: check_ab_m.f:179
integer south
Definition: param_mod.f:41
Definition: param_mod.f:2
integer mype
Definition: compar_mod.f:24
integer ijkstart3
Definition: compar_mod.f:80
integer west
Definition: param_mod.f:33
integer top
Definition: param_mod.f:45
integer dimension_m
Definition: param_mod.f:18
integer bottom
Definition: param_mod.f:49
double precision, parameter zero
Definition: param1_mod.f:27