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

1     ! -*- f90 -*-
2     MODULE residual
3     
4           Use param, only: dim_n, dim_m
5     
6     !     residual.inc
7     
8           INTEGER, PARAMETER :: MAX_RESID_INDEX = 8    !for printing; don't change this
9     
10           INTEGER, PARAMETER :: RESID_p  = 1     !pressure
11           INTEGER, PARAMETER :: RESID_ro = 2     !density, volume fraction
12           INTEGER, PARAMETER :: RESID_u  = 3     !u-velocity
13           INTEGER, PARAMETER :: RESID_v  = 4     !v-velocity
14           INTEGER, PARAMETER :: RESID_w  = 5     !w-velocity
15           INTEGER, PARAMETER :: RESID_t  = 6     !temperature
16           INTEGER, PARAMETER :: RESID_th = 7     !granular temperature
17           INTEGER, PARAMETER :: RESID_sc = 8     !user-defined scalar
18           INTEGER, PARAMETER :: NRESID   = 8 + DIM_N
19           INTEGER, PARAMETER :: RESID_ke = 9     !k-epsilon equations
20           INTEGER, PARAMETER :: RESID_x  = 10    !mass fraction (keep this the last)
21           INTEGER, PARAMETER :: NPREFIX  = 10
22     !
23     !    Group Resisuals by equation
24           INTEGER, PARAMETER :: HYDRO_GRP   = 1     !hydrodynamics
25           INTEGER, PARAMETER :: THETA_GRP   = 2     !Granular Energy
26           INTEGER, PARAMETER :: ENERGY_GRP  = 3     !Energy
27           INTEGER, PARAMETER :: SPECIES_GRP = 4     !Species
28           INTEGER, PARAMETER :: SCALAR_GRP  = 5     !Scalars
29           INTEGER, PARAMETER :: KE_GRP      = 6     !K-Epsilon
30     
31     !                      prefix of Residuals string
32           CHARACTER, PARAMETER, DIMENSION(NPREFIX) :: RESID_PREFIX = &
33             (/ 'P', 'R', 'U', 'V', 'W', 'T', 'G', 'S', 'K', 'X' /)
34     
35     !
36     !                      Average residual
37           DOUBLE PRECISION, DIMENSION(:,:), ALLOCATABLE :: RESID
38     !
39     !                      Maximum residual
40           DOUBLE PRECISION, DIMENSION(:,:), ALLOCATABLE ::  MAX_RESID
41     !
42     !                      sum of residuals every 5 iterations
43           DOUBLE PRECISION SUM5_RESID
44     !
45     !                      IJK location of maximum residual
46           INTEGER, DIMENSION(:,:), ALLOCATABLE :: IJK_RESID
47     
48     !                      Residual Numerator
49           DOUBLE PRECISION, DIMENSION(:,:), ALLOCATABLE :: NUM_RESID
50     !
51     !                      Residual Denominator
52           DOUBLE PRECISION, DIMENSION(:,:), ALLOCATABLE :: DEN_RESID
53     !
54     !                      Residual Packing for Global Operations
55           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE :: RESID_PACK
56     !
57     !                      Residual sum within a group of equations
58           LOGICAL          :: GROUP_RESID
59           DOUBLE PRECISION :: RESID_GRP(6)
60     !
61     !                      Residuals to be printed out
62           CHARACTER(LEN=4)      RESID_STRING(MAX_RESID_INDEX)
63           CHARACTER(LEN=8)      RESID_GRP_STRING(6)
64     !
65     !                      Indices of residuals to be printed out
66           INTEGER          RESID_INDEX(MAX_RESID_INDEX, 2)
67     !
68     
69     !                        fluid and solids accumulation, for checking the over-all fluid mass balance
70           DOUBLE PRECISION accum_resid_g, accum_resid_s(DIM_M)
71     
72        CONTAINS
73     
74           FUNCTION GET_RESID_STRING(INDEX)
75              IMPLICIT NONE
76              CHARACTER(LEN=4) :: GET_RESID_STRING
77              INTEGER, INTENT(IN) :: INDEX
78     
79              GET_RESID_STRING = RESID_STRING(INDEX)
80     
81           END FUNCTION GET_RESID_STRING
82     
83           FUNCTION GET_RESID_GRP_STRING(INDEX)
84              IMPLICIT NONE
85              CHARACTER(LEN=8) :: GET_RESID_GRP_STRING
86              INTEGER, INTENT(IN) :: INDEX
87     
88              GET_RESID_GRP_STRING = RESID_GRP_STRING(INDEX)
89     
90           END FUNCTION GET_RESID_GRP_STRING
91     
92           FUNCTION GET_RESID(INDEX)
93              IMPLICIT NONE
94              DOUBLE PRECISION :: GET_RESID
95              INTEGER, INTENT(IN) :: INDEX
96              INTEGER :: RI, RI2
97     
98              IF (INDEX > SIZE(RESID_INDEX,1)) THEN
99                 ! PRINT *,__FILE__," INVALID VALUE FOR INDEX ",INDEX
100                 GET_RESID = 0.0
101                 RETURN
102              ENDIF
103              RI = RESID_INDEX(INDEX,1)
104              RI2 = RESID_INDEX(INDEX,2)
105              IF (RI > SIZE(RESID,1)) THEN
106                 ! PRINT *,__FILE__," INVALID VALUE FOR RESID_INDEX 1 ",RI
107                 GET_RESID = 0.0
108                 RETURN
109              ENDIF
110              IF (RI2 > SIZE(RESID,1)) THEN
111                 ! PRINT *,__FILE__," INVALID VALUE FOR RESID_INDEX 2 ",RI2
112                 GET_RESID = 0.0
113                 RETURN
114              ENDIF
115              GET_RESID = RESID(RI,RI2)
116     
117           END FUNCTION GET_RESID
118     
119           FUNCTION GET_RESID_GRP(INDEX)
120              IMPLICIT NONE
121              DOUBLE PRECISION :: GET_RESID_GRP
122              INTEGER, INTENT(IN) :: INDEX
123     
124               GET_RESID_GRP = RESID_GRP(INDEX)
125     
126           END FUNCTION GET_RESID_GRP
127     
128           END MODULE residual
129