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

1     !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvC
2     !                                                                      C
3     !  Module name: tolerance                                              C
4     !  Purpose: Specify all tolerance parameters                           C
5     !                                                                      C
6     !  Author: M. Syamlal                                 Date: 24-JUL-92  C
7     !                                                                      C
8     !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^C
9     
10           MODULE toleranc
11     
12           use param1, only: one
13     
14     ! Minimum value of solids volume fraction tracked
15           DOUBLE PRECISION, PARAMETER :: ZERO_EP_s = 1.0D-8
16     
17     ! Small value for species mass fraction for disregarding residual
18     ! calculation
19           DOUBLE PRECISION, PARAMETER :: ZERO_X_gs = 1.0D-7
20     
21     ! Dilute flow threshold. When the volume fraction of a certain phase
22     ! in a cell is smaller than this value the momentum equation for that
23     ! phase is not solved in the cell.
24           DOUBLE PRECISION, PARAMETER :: DIL_EP_s = 1.0D-4
25     
26     ! Tolerance used for comparing two numbers for equality in function
27     ! compare(a, b)
28           DOUBLE PRECISION, PARAMETER :: TOL_COM = 1.0D-4
29     
30     ! Upper bound for temperatures
31           DOUBLE PRECISION, PARAMETER :: TMAX = 4000.D0
32     
33     ! Lower bound for temperatures
34           DOUBLE PRECISION, PARAMETER :: TMIN = 250.D0
35     
36     ! Reciprocal of a maximum molecular weight
37           DOUBLE PRECISION, PARAMETER :: oMW_MAX = (ONE/500.D0)
38     
39     ! Maximum value of velocities set to avoid divergence problems.
40           DOUBLE PRECISION :: MAX_INLET_VEL
41     
42     ! User definable factor used to scale MAX_INLET_VEL. Default value is 1.
43           DOUBLE PRECISION :: MAX_INLET_VEL_FAC
44     
45     ! Maximum allowed velocity of gas or solids in case no inlet velocities
46     ! (or zero velocities) are defined at inlet (see function
47     ! check_vel_bound)
48           DOUBLE PRECISION, PARAMETER :: MAX_ALLOWED_VEL = 500.0D+2
49     
50     ! The following quantities can be specified through the input data
51     ! file, with namelist inputs of the same name.
52     ! ------------------------------------------------------------------->>
53     ! Tolerance in residuals allowed for convergence
54           DOUBLE PRECISION :: TOL_RESID
55     
56     ! Tolerance in energy eq residuals allowed for convergence
57           DOUBLE PRECISION :: TOL_RESID_T
58     
59     ! Tolerance in species eq residuals allowed for convergence
60           DOUBLE PRECISION :: TOL_RESID_X
61     
62     ! Tolerance in scalr eq residuals allowed for convergence
63           DOUBLE PRECISION :: TOL_RESID_Scalar
64     
65     ! Tolerance in K & Epsilon eq residuals allowed for convergence
66           DOUBLE PRECISION :: TOL_RESID_K_Epsilon
67     
68     ! Tolerance in Granular Temperature eq residuals allowed for convergence
69           DOUBLE PRECISION :: TOL_RESID_Th
70     
71     ! Minimum residual for declaring divergence
72           DOUBLE PRECISION :: TOL_DIVERGE
73     
74     ! Factor for normalizing the residual of gas cont. eq.
75           DOUBLE PRECISION :: NORM_g
76     
77     ! Factor for normalizing the residual of solids cont. eq.
78           DOUBLE PRECISION :: NORM_s
79     ! -------------------------------------------------------------------<<
80     
81     ! Detect negative Rho_g in physical_prop to reduce DT in iterate
82           LOGICAL :: Neg_RHO_G = .FALSE.
83     
84           CONTAINS
85     
86     
87     !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv!
88     !                                                                      !
89     !  Purpose: Test if two small values are nearly equal                  !
90     !                                                                      !
91     !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^!
92     
93           LOGICAL FUNCTION COMPARE (V1, V2)
94     
95           use param1, only: small_number, one
96           IMPLICIT NONE
97     
98     ! Dummy arguments
99     ! -------------------------------------------------------------------//
100     ! Values to be compared
101           DOUBLE PRECISION, INTENT(IN) :: V1, V2
102     
103           IF (ABS(V1) <= SMALL_NUMBER) THEN
104              IF (ABS(V2) <= SMALL_NUMBER) THEN
105                 COMPARE = .TRUE.
106              ELSE
107                 COMPARE = .FALSE.
108              ENDIF
109           ELSE
110              IF (ABS(V2/V1 - ONE) <= TOL_COM) THEN
111                 COMPARE = .TRUE.
112              ELSE
113                 COMPARE = .FALSE.
114              ENDIF
115           ENDIF
116           RETURN
117           END FUNCTION COMPARE
118     
119     
120     !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv!
121     !                                                                      !
122     !  Purpose: Test if given variable is smaller than specified tolerance !
123     !                                                                      !
124     !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^!
125     
126           LOGICAL FUNCTION IS_SMALL (V, TOL)
127     
128           use compar, only: ijkstart3, ijkend3
129           use functions, only: fluid_at
130           use param, only: dimension_3
131           IMPLICIT NONE
132     
133     ! Dummy arguments
134     !--------------------------------------------------------------------//
135     ! Tolerance value for small
136           DOUBLE PRECISION, INTENT(IN) :: TOL
137     ! Field variable array
138           DOUBLE PRECISION, INTENT(IN), DIMENSION(DIMENSION_3) :: V
139     
140     ! Local variables
141     !--------------------------------------------------------------------//
142           INTEGER :: IJK
143     
144           IS_SMALL = .FALSE.
145           DO IJK = ijkstart3, ijkend3
146              IF (FLUID_AT(IJK)) THEN
147                 IF (ABS(V(IJK)) > TOL) RETURN
148              ENDIF
149           END DO
150           IS_SMALL = .TRUE.
151     
152           RETURN
153           END FUNCTION IS_SMALL
154     
155           END MODULE toleranc
156