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