File: /nfs/home/0/users/jenkins/mfix.git/model/check_convergence.f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 SUBROUTINE CHECK_CONVERGENCE(NIT, errorpercent, MUSTIT, IER)
20
21
22
23
24 USE param
25 USE param1
26 USE geometry
27 USE indices
28 USE physprop
29 USE run
30 USE residual
31 USE toleranc
32 USE mpi_utility
33 USE scalars, only :NScalar
34 IMPLICIT NONE
35
36
37
38
39
40
41
42
43
44 INTEGER, INTENT(IN) :: NIT
45
46 DOUBLE PRECISION, INTENT(IN) :: errorpercent
47
48 INTEGER, INTENT(INOUT) :: MUSTIT
49
50 INTEGER, INTENT(INOUT) :: IER
51
52
53
54
55 DOUBLE PRECISION :: SUM, SUM_T, SUM_X, SUM_Th
56
57 DOUBLE PRECISION :: maxres
58
59 INTEGER :: L, M, maxL, maxM, N, maxN
60
61
62 LOGICAL :: NO_RESID
63
64
65 LOGICAL :: CHECK_VEL_BOUND
66
67
68
69
70
71
72
73
74 = RESID(RESID_P,0)
75
76
77
78
79
80
81 IF(MMAX > 0) SUM = SUM + RESID(RESID_P,1)
82
83
84 DO M = 0, MMAX
85 SUM = SUM + RESID(RESID_RO,M)
86 ENDDO
87
88 DO M = 0, MMAX
89 SUM = SUM + RESID(RESID_U,M)
90 ENDDO
91 DO M = 0, MMAX
92 SUM = SUM + RESID(RESID_V,M)
93 ENDDO
94 IF (DO_K) THEN
95 DO M = 0, MMAX
96 SUM = SUM + RESID(RESID_W,M)
97 ENDDO
98 ENDIF
99
100
101
102
103 = zero
104 IF (GRANULAR_ENERGY) THEN
105 DO M = 1, MMAX
106 SUM_Th = SUM_Th + RESID(RESID_TH,M)
107 ENDDO
108 ENDIF
109
110
111
112 = ZERO
113 IF (ENERGY_EQ) THEN
114 DO M = 0, MMAX
115 SUM_T = SUM_T + RESID(RESID_T,M)
116 END DO
117 ENDIF
118
119
120
121 = ZERO
122 NO_RESID = .FALSE.
123 DO M = 0, MMAX
124 IF (SPECIES_EQ(M)) THEN
125 DO N = 1, NMAX(M)
126 IF (RESID(RESID_X+(N-1),M) == UNDEFINED) NO_RESID = .TRUE.
127 SUM_X = SUM_X + RESID(RESID_X+(N-1),M)
128 ENDDO
129 ENDIF
130 ENDDO
131
132 IF (NO_RESID) SUM_X = TOL_RESID_X + ONE
133
134
135
136 IF (RESID_INDEX(MAX_RESID_INDEX,1) == UNDEFINED_I) THEN
137 MAXRES = ZERO
138 DO L = 1, NRESID
139 DO M = 0, MMAX
140 IF (RESID(L,M) >= MAXRES) THEN
141 MAXRES = RESID(L,M)
142 MAXL = L
143 MAXM = M
144 IF (L >= RESID_X) THEN
145 MAXN = L - RESID_X + 1
146 ELSE
147 MAXN = UNDEFINED_I
148 ENDIF
149 ENDIF
150 END DO
151 END DO
152 IF (MAXN == UNDEFINED_I) THEN
153 WRITE (RESID_STRING(MAX_RESID_INDEX), '(A1,I1)') RESID_PREFIX(MAXL)&
154 , MAXM
155 ELSE
156 WRITE (RESID_STRING(MAX_RESID_INDEX), '(A1,I1,I2.0)') 'X', MAXM, &
157 MAXN
158 ENDIF
159 ENDIF
160
161 IF (GROUP_RESID) THEN
162 RESID_GRP(HYDRO_GRP) = SUM
163 IF(GRANULAR_ENERGY) RESID_GRP(THETA_GRP) = SUM_TH
164 IF(ENERGY_EQ) RESID_GRP(ENERGY_GRP) = SUM_T
165 IF(ANY_SPECIES_EQ) RESID_GRP(SPECIES_GRP) = SUM_X
166 IF(NScalar > 0) RESID_GRP(SCALAR_GRP) = RESID(RESID_sc,0)
167 IF(K_EPSILON) RESID_GRP(KE_GRP) = RESID(RESID_ke,0)
168 ENDIF
169
170
171
172
173 IF (DETECT_STALL) THEN
174 IF (MOD(NIT,5) == 0) THEN
175 IF (NIT > 10) THEN
176 IF (SUM5_RESID <= SUM) THEN
177 MUSTIT = 2
178 RETURN
179 ENDIF
180 ENDIF
181 SUM5_RESID = SUM
182 ENDIF
183 ENDIF
184
185
186 IF(NIT == 1) THEN
187 MUSTIT = 1
188 RETURN
189 ENDIF
190
191
192 IF(SUM<=TOL_RESID .AND. SUM_T<=TOL_RESID_T .AND. &
193 RESID(RESID_sc,0)<=TOL_RESID_Scalar .AND. SUM_X<=TOL_RESID_X &
194 .AND. RESID(RESID_ke,0)<=TOL_RESID_K_Epsilon &
195 .AND. SUM_Th <=TOL_RESID_Th)THEN
196 MUSTIT = 0
197 ELSEIF (SUM>=TOL_DIVERGE .OR. SUM_T>=TOL_DIVERGE .OR.&
198 RESID(RESID_sc,0)>= TOL_DIVERGE .OR. SUM_X>=TOL_DIVERGE&
199 .OR. RESID(RESID_ke,0)>= TOL_DIVERGE &
200 .OR. SUM_Th >= TOL_DIVERGE ) THEN
201 IF (NIT /= 1) THEN
202 MUSTIT = 2
203 ELSE
204 MUSTIT = 1
205 ENDIF
206 ELSE
207 MUSTIT = 1
208 ENDIF
209
210
211
212 DO M = 0,MMAX
213 IF (MOMENTUM_X_EQ(M) .OR. MOMENTUM_Y_EQ(M) .OR. &
214 MOMENTUM_Z_EQ(M)) THEN
215 IF(CHECK_VEL_BOUND()) MUSTIT = 2
216 EXIT
217 ENDIF
218 ENDDO
219
220
221 RETURN
222 END SUBROUTINE CHECK_CONVERGENCE
223
224
225