MFIX  2016-1
check_convergence.f
Go to the documentation of this file.
1 !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvC
2 ! C
3 ! Subroutine: CHECK_CONVERGENCE C
4 ! Purpose: Monitor convergence C
5 ! C
6 ! C
7 ! Author: M. Syamlal Date: 8-JUL-96 C
8 ! Reviewer: Date: C
9 ! C
10 ! C
11 ! Literature/Document References: C
12 ! C
13 ! Variables referenced: C
14 ! Variables modified: C
15 ! Local variables: C
16 ! C
17 !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^C
18 
19  SUBROUTINE check_convergence(NIT, errorpercent, MUSTIT)
20 
21 !-----------------------------------------------
22 ! Modules
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 ! Local parameters
38 !-----------------------------------------------
39 ! Maximum % error allowed in fluid continuity
40 ! DOUBLE PRECISION, PARAMETER :: MaxErrorPercent = 1.0E-6
41 !-----------------------------------------------
42 ! Dummy arguments
43 !-----------------------------------------------
44 ! Iteration number
45  INTEGER, INTENT(IN) :: NIT
46 ! %error in fluid mass balance
47  DOUBLE PRECISION, INTENT(IN) :: errorpercent
48 ! value tells whether to iterate (1) or not (0).
49  INTEGER, INTENT(INOUT) :: MUSTIT
50 !-----------------------------------------------
51 ! Local variables
52 !-----------------------------------------------
53 ! sum of residuals
54  DOUBLE PRECISION :: SUM, SUM_T, SUM_X, SUM_Th
55 ! max of residuals
56  DOUBLE PRECISION :: maxres
57 ! index
58  INTEGER :: L, M, maxL, maxM, NN, maxN
59 ! to indicate undefined residual in species eq at the
60 ! beginning of iterations
61  LOGICAL :: NO_RESID
62 !-----------------------------------------------
63 
64 ! sum the residuals from correction equation (pressure and/or
65 ! solids), continuity equations (gas and/or solids) and momentum
66 ! equations (gas and solids)
67 
68 ! add pressure correction residual
69 ! if(abs(errorpercent) > MaxErrorPercent)then
70  sum = resid(resid_p,0)
71 ! else
72 ! SUM = zero
73 ! endif
74 
75 
76 ! add solids correction residual
77  IF(mmax > 0) sum = sum + resid(resid_p,1)
78 
79 ! add continuity equation residuals
80  DO m = 0, mmax
81  sum = sum + resid(resid_ro,m)
82  ENDDO
83 ! add momentum equation residuals
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 ! call global_all_sum(SUM)
96 
97 
98 ! sum the granular energy equation residuals
99  sum_th = 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 ! sum the energy equation residuals
108  sum_t = 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 ! call global_all_sum(SUM_T)
115 
116 ! sum the species equation residuals
117  sum_x = zero
118  no_resid = .false.
119  DO m = 0, mmax
120  IF (species_eq(m)) THEN
121  DO nn = 1, nmax(m)
122  IF (resid(resid_x+(nn-1),m) == undefined) no_resid = .true.
123  sum_x = sum_x + resid(resid_x+(nn-1),m)
124  ENDDO
125  ENDIF
126  ENDDO
127 ! call global_all_sum(SUM_X)
128  IF (no_resid) sum_x = tol_resid_x + one
129 
130 
131 ! find the variable with maximum residual
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
164  ENDIF
165 
166 ! Every 5 iterations detect whether the run is stalled by checking
167 ! that the total residual has decreased.
168  IF(detect_stall .AND. mod(nit,5) == 0) THEN
169  IF(nit > 10) THEN
170  IF(sum5_resid <= sum) THEN
171 ! The run is stalled. Reduce the time step.
172  IF(.NOT.persistent_mode) THEN
173  mustit = 2
174  RETURN
175 ! Forces the max number of iterations for DT=DT_MIN
176  ELSEIF(dt > dt_min) THEN
177  mustit = 1
178  RETURN
179  ENDIF
180  ENDIF
181  ENDIF
182  sum5_resid = sum
183  ENDIF
184 
185 ! Require at least two iterations.
186  IF(nit == 1) THEN
187  mustit = 1
188  RETURN
189  ENDIF
190 
191 ! total residual
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 &
195  .AND. sum_th <=tol_resid_th)THEN
196  mustit = 0 !converged
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 !diverged
203  ELSE
204  mustit = 1 !not converged
205  ENDIF
206  ELSE
207  mustit = 1 !not converged
208  ENDIF
209 
210 
211 ! to check upper bound (speed of sound) limit for gas and
212 ! solids velocity components
213 ! only check velocity if any of the momentum equations are solved
214  DO m = 0,mmax
215  IF (momentum_x_eq(m) .OR. momentum_y_eq(m) .OR. &
216  momentum_z_eq(m)) THEN
217  IF(check_vel_bound()) mustit = 2 !divergence
218  EXIT ! only need to call check_vel_bound once
219  ENDIF
220  ENDDO
221 
222 
223  RETURN
224  END SUBROUTINE check_convergence
225 
226 
integer, parameter resid_t
Definition: residual_mod.f:15
logical, dimension(0:dim_m) momentum_y_eq
Definition: run_mod.f:77
integer, parameter resid_ro
Definition: residual_mod.f:11
integer, parameter hydro_grp
Definition: residual_mod.f:24
double precision, parameter one
Definition: param1_mod.f:29
integer, parameter resid_p
Definition: residual_mod.f:10
double precision, dimension(6) resid_grp
Definition: residual_mod.f:59
logical, dimension(0:dim_m) momentum_x_eq
Definition: run_mod.f:74
logical, dimension(0:dim_m) species_eq
Definition: run_mod.f:115
integer, parameter scalar_grp
Definition: residual_mod.f:28
double precision tol_resid_t
Definition: toleranc_mod.f:57
double precision tol_resid_scalar
Definition: toleranc_mod.f:63
logical, dimension(0:dim_m) momentum_z_eq
Definition: run_mod.f:80
double precision dt
Definition: run_mod.f:51
logical group_resid
Definition: residual_mod.f:58
integer, parameter nresid
Definition: residual_mod.f:18
character, dimension(nprefix), parameter resid_prefix
Definition: residual_mod.f:32
logical detect_stall
Definition: run_mod.f:240
integer, parameter species_grp
Definition: residual_mod.f:27
double precision, parameter undefined
Definition: param1_mod.f:18
double precision tol_resid_k_epsilon
Definition: toleranc_mod.f:66
integer, parameter resid_sc
Definition: residual_mod.f:17
double precision sum5_resid
Definition: residual_mod.f:43
integer, dimension(max_resid_index, 2) resid_index
Definition: residual_mod.f:66
logical function check_vel_bound()
integer, parameter resid_w
Definition: residual_mod.f:14
integer, parameter resid_th
Definition: residual_mod.f:16
integer mmax
Definition: physprop_mod.f:19
integer, parameter resid_v
Definition: residual_mod.f:13
double precision tol_resid_th
Definition: toleranc_mod.f:69
logical persistent_mode
Definition: run_mod.f:124
subroutine check_convergence(NIT, errorpercent, MUSTIT)
logical any_species_eq
Definition: run_mod.f:118
double precision tol_diverge
Definition: toleranc_mod.f:72
integer, parameter max_resid_index
Definition: residual_mod.f:8
Definition: run_mod.f:13
Definition: param_mod.f:2
integer, parameter energy_grp
Definition: residual_mod.f:26
integer, parameter theta_grp
Definition: residual_mod.f:25
integer, dimension(0:dim_m) nmax
Definition: physprop_mod.f:119
integer, parameter resid_u
Definition: residual_mod.f:12
logical do_k
Definition: geometry_mod.f:30
logical k_epsilon
Definition: run_mod.f:97
character(len=4), dimension(max_resid_index) resid_string
Definition: residual_mod.f:62
logical energy_eq
Definition: run_mod.f:100
double precision tol_resid
Definition: toleranc_mod.f:54
integer, parameter undefined_i
Definition: param1_mod.f:19
double precision tol_resid_x
Definition: toleranc_mod.f:60
integer nscalar
Definition: scalars_mod.f:7
integer, parameter resid_ke
Definition: residual_mod.f:19
double precision dt_min
Definition: run_mod.f:223
double precision, dimension(:,:), allocatable resid
Definition: residual_mod.f:37
logical granular_energy
Definition: run_mod.f:112
integer, parameter resid_x
Definition: residual_mod.f:20
double precision, parameter zero
Definition: param1_mod.f:27
integer, parameter ke_grp
Definition: residual_mod.f:29