File: N:\mfix\model\solve_pp_g.f
1
2
3
4
5
6
7
8
9
10 SUBROUTINE SOLVE_PP_G(NORMG, RESG, IER)
11
12
13
14 use ambm, only: a_m, b_m, lock_ambm, unlock_ambm
15 use geometry, only: ijkmax2
16 use leqsol, only: leq_it, leq_method, leq_sweep, leq_pc, leq_tol
17 use param, only: dimension_3, dimension_m
18 use param1, only: zero, one, undefined
19 use pgcor, only: pp_g
20 use physprop, only: mmax, ro_g0
21 use ps, only: point_source
22 use residual, only: resid, max_resid, ijk_resid
23 use residual, only: num_resid, den_resid
24 use residual, only: resid_p
25 use run, only: momentum_x_eq, momentum_y_eq
26 use usr_src, only: call_usr_source, calc_usr_source
27 use usr_src, only: pressure_correction
28 IMPLICIT NONE
29
30
31
32
33
34
35 DOUBLE PRECISION, PARAMETER :: DEN = 1.0D1
36
37
38
39
40
41
42
43
44 DOUBLE PRECISION, INTENT(IN) :: NORMg
45
46 DOUBLE PRECISION, INTENT(OUT) :: RESg
47
48 INTEGER, INTENT(INOUT) :: IER
49
50
51
52
53 INTEGER :: M
54
55 DOUBLE PRECISION :: NORMGloc
56
57 INTEGER :: LEQM, LEQI
58
59
60
61
62 DOUBLE PRECISION :: B_MMAX(DIMENSION_3, DIMENSION_M)
63
64
65
66
67
68 call lock_ambm
69
70
71 (:) = ZERO
72 DO M = 0, MMAX
73 CALL INIT_AB_M (A_M, B_M, IJKMAX2, M)
74 ENDDO
75
76
77 IF (.NOT.(MOMENTUM_X_EQ(0) .OR. MOMENTUM_Y_EQ(0)) .AND.&
78 RO_G0 .NE. UNDEFINED) THEN
79 call unlock_ambm
80 RETURN
81 ENDIF
82
83
84 CALL CONV_PP_G (A_M, B_M)
85 CALL SOURCE_PP_G (A_M, B_M, B_MMAX)
86 IF(POINT_SOURCE) CALL POINT_SOURCE_PP_G (B_M, B_MMAX)
87 IF(CALL_USR_SOURCE(1)) CALL CALC_USR_SOURCE(Pressure_correction,&
88 A_M, B_M, lB_MMAX=B_MMAX, lM=0)
89
90
91
92
93
94
95 = NORMG
96 IF(NORMG == ZERO) THEN
97
98
99 CALL CALC_RESID_PP (B_MMAX, ONE, NUM_RESID(RESID_P,0), &
100 DEN_RESID(RESID_P,0), RESID(RESID_P,0), MAX_RESID(RESID_P,0), &
101 IJK_RESID(RESID_P,0))
102 NORMGloc = RESID(RESID_P,0)/DEN
103 ENDIF
104 CALL CALC_RESID_PP (B_M, NORMGloc, NUM_RESID(RESID_P,0), &
105 DEN_RESID(RESID_P,0), RESID(RESID_P,0), MAX_RESID(RESID_P,0), &
106 IJK_RESID(RESID_P,0))
107 RESG = RESID(RESID_P,0)
108
109
110
111
112
113 = LEQ_IT(1)
114 LEQM = LEQ_METHOD(1)
115
116
117
118
119 CALL SOLVE_LIN_EQ ('Pp_g', 1, PP_G, A_M, B_M, 0, LEQI, LEQM, &
120 LEQ_SWEEP(1), LEQ_TOL(1), LEQ_PC(1), IER)
121
122
123
124 call unlock_ambm
125
126 RETURN
127 END SUBROUTINE SOLVE_PP_G
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142 SUBROUTINE POINT_SOURCE_PP_G(B_M, B_mmax)
143
144
145
146 use compar, only: dead_cell_at
147 use geometry, only: vol
148 use functions, only: fluid_at, funijk
149 use functions, only: is_on_myPe_plus2layers
150 use param, only: dimension_3, dimension_m
151 use param1, only: small_number
152 use ps, only: ps_defined, dimension_ps
153 use ps, only: ps_massflow_g, ps_volume
154 use ps, only: ps_k_b, ps_k_t
155 use ps, only: ps_j_s, ps_j_n
156 use ps, only: ps_i_w, ps_i_e
157 IMPLICIT NONE
158
159
160
161
162 DOUBLE PRECISION, INTENT(INOUT) :: B_m(DIMENSION_3, 0:DIMENSION_M)
163
164 DOUBLE PRECISION, INTENT(INOUT) :: B_mmax(DIMENSION_3, 0:DIMENSION_M)
165
166
167
168
169 INTEGER :: IJK, I, J, K
170 INTEGER :: PSV
171
172
173 DOUBLE PRECISION pSource
174
175
176 PS_LP: do PSV = 1, DIMENSION_PS
177
178 if(.NOT.PS_DEFINED(PSV)) cycle PS_LP
179 if(PS_MASSFLOW_G(PSV) < small_number) cycle PS_LP
180
181 do k = PS_K_B(PSV), PS_K_T(PSV)
182 do j = PS_J_S(PSV), PS_J_N(PSV)
183 do i = PS_I_W(PSV), PS_I_E(PSV)
184
185 if(.NOT.IS_ON_myPE_plus2layers(I,J,K)) cycle
186 IF (DEAD_CELL_AT(I,J,K)) CYCLE
187
188 = funijk(i,j,k)
189 if(fluid_at(ijk)) then
190 pSource = PS_MASSFLOW_G(PSV) * (VOL(IJK)/PS_VOLUME(PSV))
191
192 B_M(IJK,0) = B_M(IJK,0) - pSource
193 B_MMAX(IJK,0) = max(abs(B_MMAX(IJK,0)), abs(B_M(IJK,0)))
194 endif
195
196 enddo
197 enddo
198 enddo
199
200 enddo PS_LP
201
202 RETURN
203 END SUBROUTINE POINT_SOURCE_PP_G
204