File: N:\mfix\model\check_ab_m.f

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
237