File: /nfs/home/0/users/jenkins/mfix.git/model/check_convergence.f

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, IER)
20     
21     !-----------------------------------------------
22     ! Modules
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     ! Local parameters
37     !-----------------------------------------------
38     ! Maximum % error allowed in fluid continuity
39     !      DOUBLE PRECISION, PARAMETER :: MaxErrorPercent = 1.0E-6
40     !-----------------------------------------------
41     ! Dummy arguments
42     !-----------------------------------------------
43     ! Iteration number
44           INTEGER, INTENT(IN) :: NIT
45     ! %error in fluid mass balance
46           DOUBLE PRECISION, INTENT(IN) :: errorpercent
47     ! value tells whether to iterate (1) or not (0).
48           INTEGER, INTENT(INOUT) :: MUSTIT
49     ! Error index
50           INTEGER, INTENT(INOUT) :: IER
51     !-----------------------------------------------
52     ! Local variables
53     !-----------------------------------------------
54     ! sum of residuals
55           DOUBLE PRECISION :: SUM, SUM_T, SUM_X, SUM_Th
56     ! max of residuals
57           DOUBLE PRECISION :: maxres
58     ! index
59           INTEGER :: L, M, maxL, maxM, N, maxN
60     ! to indicate undefined residual in species eq at the
61     ! beginning of iterations
62           LOGICAL :: NO_RESID
63     ! to check upper bound (speed of sound) limit for gas and
64     ! solids velocity components
65           LOGICAL :: CHECK_VEL_BOUND
66     !-----------------------------------------------
67     
68     ! sum the residuals from correction equation (pressure and/or
69     ! solids), continuity equations (gas and/or solids) and momentum
70     ! equations (gas and solids)
71     
72     ! add pressure correction residual
73     !      if(abs(errorpercent) > MaxErrorPercent)then
74             SUM = RESID(RESID_P,0)
75     !      else
76     !        SUM = zero
77     !      endif
78     
79     
80     ! add solids correction residual
81           IF(MMAX > 0) SUM = SUM + RESID(RESID_P,1)
82     
83     ! add continuity equation residuals
84           DO M = 0, MMAX
85              SUM = SUM + RESID(RESID_RO,M)
86           ENDDO
87     ! add momentum equation residuals
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     !      call global_all_sum(SUM)
100     
101     
102     ! sum the granular energy equation residuals
103           SUM_Th = 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     ! sum the energy equation residuals
112           SUM_T = 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     !      call global_all_sum(SUM_T)
119     
120     ! sum the species equation residuals
121           SUM_X = 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     !      call global_all_sum(SUM_X)
132           IF (NO_RESID) SUM_X = TOL_RESID_X + ONE
133     
134     
135     ! find the variable with maximum residual
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     ! detect whether the run is stalled :  every 5 iterations check whether
172     ! the total residual has decreased
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                     !stalled
178                       RETURN
179                    ENDIF
180                 ENDIF
181                 SUM5_RESID = SUM
182              ENDIF
183           ENDIF
184     
185     ! total residual
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                              !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     ! only check velocity if any of the momentum equations are solved
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     !divergence
216                 EXIT  ! only need to call check_vel_bound once
217              ENDIF
218           ENDDO
219     
220     
221           RETURN
222           END SUBROUTINE CHECK_CONVERGENCE
223     
224     
225