File: N:\mfix\model\residual_mod.f
1
2 MODULE residual
3
4 Use param, only: dim_n, dim_m
5
6
7
8 INTEGER, PARAMETER :: MAX_RESID_INDEX = 8
9
10 INTEGER, PARAMETER :: RESID_p = 1
11 INTEGER, PARAMETER :: RESID_ro = 2
12 INTEGER, PARAMETER :: RESID_u = 3
13 INTEGER, PARAMETER :: RESID_v = 4
14 INTEGER, PARAMETER :: RESID_w = 5
15 INTEGER, PARAMETER :: RESID_t = 6
16 INTEGER, PARAMETER :: RESID_th = 7
17 INTEGER, PARAMETER :: RESID_sc = 8
18 INTEGER, PARAMETER :: NRESID = 8 + DIM_N
19 INTEGER, PARAMETER :: RESID_ke = 9
20 INTEGER, PARAMETER :: RESID_x = 10
21 INTEGER, PARAMETER :: NPREFIX = 10
22
23
24 INTEGER, PARAMETER :: HYDRO_GRP = 1
25 INTEGER, PARAMETER :: THETA_GRP = 2
26 INTEGER, PARAMETER :: ENERGY_GRP = 3
27 INTEGER, PARAMETER :: SPECIES_GRP = 4
28 INTEGER, PARAMETER :: SCALAR_GRP = 5
29 INTEGER, PARAMETER :: KE_GRP = 6
30
31
32 CHARACTER, PARAMETER, DIMENSION(NPREFIX) :: RESID_PREFIX = &
33 (/ 'P', 'R', 'U', 'V', 'W', 'T', 'G', 'S', 'K', 'X' /)
34
35
36
37 DOUBLE PRECISION, DIMENSION(:,:), ALLOCATABLE :: RESID
38
39
40 DOUBLE PRECISION, DIMENSION(:,:), ALLOCATABLE :: MAX_RESID
41
42
43 DOUBLE PRECISION SUM5_RESID
44
45
46 INTEGER, DIMENSION(:,:), ALLOCATABLE :: IJK_RESID
47
48
49 DOUBLE PRECISION, DIMENSION(:,:), ALLOCATABLE :: NUM_RESID
50
51
52 DOUBLE PRECISION, DIMENSION(:,:), ALLOCATABLE :: DEN_RESID
53
54
55 DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE :: RESID_PACK
56
57
58 LOGICAL :: GROUP_RESID
59 DOUBLE PRECISION :: RESID_GRP(6)
60
61
62 CHARACTER(LEN=4) RESID_STRING(MAX_RESID_INDEX)
63 CHARACTER(LEN=8) RESID_GRP_STRING(6)
64
65
66 INTEGER RESID_INDEX(MAX_RESID_INDEX, 2)
67
68
69
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
100 = 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
107 = 0.0
108 RETURN
109 ENDIF
110 IF (RI2 > SIZE(RESID,1)) THEN
111
112 = 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