MFIX  2016-1
source_pp_g.f
Go to the documentation of this file.
1 !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvC
2 ! C
3 ! Subroutine: SOURCE_Pp_g C
4 ! Purpose: Determine source terms for pressure correction equation. C
5 ! C
6 ! Notes: The off-diagonal coefficients are positive. The center C
7 ! coefficient and the source vector are negative. See C
8 ! conv_Pp_g C
9 ! C
10 ! Author: M. Syamlal Date: 21-JUN-96 C
11 ! C
12 ! Revision Number: 1 C
13 ! Purpose: To incorporate Cartesian grid modifications C
14 ! Author: Jeff Dietiker Date: 01-Jul-09 C
15 ! C
16 ! C
17 !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^C
18  SUBROUTINE source_pp_g(A_M, B_M, B_MMAX)
19 
20 ! Modules
21 !---------------------------------------------------------------------//
22  USE bc, ONLY: ijk_p_g
23  USE compar, ONLY: ijkstart3, ijkend3
25  USE fldvar, ONLY: u_g, v_g, w_g, u_s, v_s, w_s, rop_g, rop_s
26  USE fldvar, only: rop_go, rop_so, ro_g
27  USE geometry, ONLY: vol
28  USE param, only: dimension_3, dimension_m
29  USE param, only: east, west, south, north, top, bottom
30  USE param1, ONLY: small_number, one, zero, undefined
31  USE pgcor, ONLY: d_e, d_n, d_t
32  USE physprop, ONLY: close_packed, mmax, ro_g0
33  USE run, ONLY: shear, odt, undefined_i
34  USE rxns, ONLY: sum_r_g, sum_r_s
35  USE vshear, ONLY: vsh
36  IMPLICIT NONE
37 
38 ! Dummy arguments
39 !---------------------------------------------------------------------//
40 ! Septadiagonal matrix A_m
41  DOUBLE PRECISION, INTENT(INOUT) :: A_m(dimension_3, -3:3, 0:dimension_m)
42 ! Vector b_m
43  DOUBLE PRECISION, INTENT(INOUT) :: B_m(dimension_3, 0:dimension_m)
44 ! maximum term in b_m expression
45  DOUBLE PRECISION, INTENT(INOUT) :: B_mmax(dimension_3, 0:dimension_m)
46 
47 ! Local Variables
48 !---------------------------------------------------------------------//
49 ! solids phase index
50  INTEGER :: M
51 ! Indices
52  INTEGER :: IJK, IMJK, IPJK, IJMK, IJPK, IJKM, IJKP
53 ! terms of bm expression
54  DOUBLE PRECISION bma, bme, bmw, bmn, bms, bmt, bmb, bmr
55 ! error message
56  CHARACTER(LEN=80) :: LINE(1)
57 !---------------------------------------------------------------------//
58 ! loezos
59 ! update to true velocity
60  IF (shear) THEN
61 !!$omp parallel do private(IJK)
62  DO ijk = ijkstart3, ijkend3
63  IF (fluid_at(ijk)) THEN
64  v_g(ijk)=v_g(ijk)+vsh(ijk)
65  ENDIF
66  ENDDO
67  ENDIF
68 
69 ! Calculate convection-diffusion fluxes through each of the faces
70 
71 !$omp parallel default(none) &
72 !$omp private(IJK, IMJK, IJMK, IJKM, M, bma,bme,bmw,bmn,&
73 !$omp bms,bmt,bmb,bmr,line) &
74 !$omp shared(ijkstart3,ijkend3,cartesian_grid,rop_g,rop_go,&
75 !$omp rop_s,rop_so,vol,odt,u_g,v_g,w_g,u_s,v_s,w_s,b_m, &
76 !$omp b_mmax,d_e,d_n,d_t,a_m,a_upg_e,a_vpg_n,a_wpg_t,&
77 !$omp mmax,close_packed,sum_r_s,sum_r_g,ro_g0)
78 !$omp do
79  DO ijk = ijkstart3, ijkend3
80  IF (fluid_at(ijk)) THEN
81  imjk = im_of(ijk)
82  ijmk = jm_of(ijk)
83  ijkm = km_of(ijk)
84 
85  bma = (rop_g(ijk)-rop_go(ijk))*vol(ijk)*odt
86  bme = a_m(ijk,east,0)*u_g(ijk)
87  bmw = a_m(ijk,west,0)*u_g(imjk)
88  bmn = a_m(ijk,north,0)*v_g(ijk)
89  bms = a_m(ijk,south,0)*v_g(ijmk)
90  bmt = a_m(ijk,top,0)*w_g(ijk)
91  bmb = a_m(ijk,bottom,0)*w_g(ijkm)
92  bmr = sum_r_g(ijk)*vol(ijk)
93  b_m(ijk,0) = -((-(bma + bme - bmw + &
94  bmn - bms + bmt - bmb ))+ bmr )
95  b_mmax(ijk,0) = max(abs(bma),abs(bme),abs(bmw),&
96  abs(bmn),abs(bms),abs(bmt),abs(bmb),abs(bmr) )
97 
98  a_m(ijk,east,0) = a_m(ijk,east,0)*d_e(ijk,0)
99  a_m(ijk,west,0) = a_m(ijk,west,0)*d_e(imjk,0)
100  a_m(ijk,north,0) = a_m(ijk,north,0)*d_n(ijk,0)
101  a_m(ijk,south,0) = a_m(ijk,south,0)*d_n(ijmk,0)
102  a_m(ijk,top,0) = a_m(ijk,top,0)*d_t(ijk,0)
103  a_m(ijk,bottom,0) = a_m(ijk,bottom,0)*d_t(ijkm,0)
104 
105  IF(cartesian_grid) THEN
106  a_m(ijk,east,0) = a_m(ijk,east,0) * a_upg_e(ijk)
107  a_m(ijk,west,0) = a_m(ijk,west,0) * a_upg_e(imjk)
108  a_m(ijk,north,0) = a_m(ijk,north,0) * a_vpg_n(ijk)
109  a_m(ijk,south,0) = a_m(ijk,south,0) * a_vpg_n(ijmk)
110  a_m(ijk,top,0) = a_m(ijk,top,0) * a_wpg_t(ijk)
111  a_m(ijk,bottom,0) = a_m(ijk,bottom,0) * a_wpg_t(ijkm)
112  ENDIF
113 
114 ! solids phase terms are needed for those solids phases that do not
115 ! become close packed. these terms are used to essentially make the
116 ! matrix equation for gas pressure correction a mixture pressure
117 ! correction equation by adding solids phases that do not become
118 ! close packed
119  DO m = 1, mmax
120  IF (.NOT.close_packed(m)) THEN
121  b_m(ijk,0) = b_m(ijk,0) - &
122  ((-((rop_s(ijk,m)-rop_so(ijk,m))*vol(ijk)*odt+&
123  a_m(ijk,east,m)*u_s(ijk,m)-a_m(ijk,west,m)*u_s(imjk,m)+&
124  a_m(ijk,north,m)*v_s(ijk,m)-a_m(ijk,south,m)*v_s(ijmk,m)+&
125  a_m(ijk,top,m)*w_s(ijk,m)-a_m(ijk,bottom,m)*w_s(ijkm,m)))+&
126  sum_r_s(ijk,m)*vol(ijk))
127 
128  IF(.NOT.cartesian_grid) THEN
129  a_m(ijk,east,0) = a_m(ijk,east,0) + a_m(ijk,east,m)*d_e(ijk,m)
130  a_m(ijk,west,0) = a_m(ijk,west,0) + a_m(ijk,west,m)*d_e(imjk,m)
131  a_m(ijk,north,0) = a_m(ijk,north,0) + a_m(ijk,north,m)*d_n(ijk,m)
132  a_m(ijk,south,0) = a_m(ijk,south,0) + a_m(ijk,south,m)*d_n(ijmk,m)
133  a_m(ijk,top,0) = a_m(ijk,top,0) + a_m(ijk,top,m)*d_t(ijk,m)
134  a_m(ijk,bottom,0) = a_m(ijk,bottom,0) + a_m(ijk,bottom,m)*d_t(ijkm,m)
135  ELSE
136  a_m(ijk,east,0) = a_m(ijk,east,0) + a_m(ijk,east,m)*d_e(ijk,m) * a_upg_e(ijk)
137  a_m(ijk,west,0) = a_m(ijk,west,0) + a_m(ijk,west,m)*d_e(imjk,m) * a_upg_e(imjk)
138  a_m(ijk,north,0) = a_m(ijk,north,0) + a_m(ijk,north,m)*d_n(ijk,m) * a_vpg_n(ijk)
139  a_m(ijk,south,0) = a_m(ijk,south,0) + a_m(ijk,south,m)*d_n(ijmk,m) * a_vpg_n(ijmk)
140  a_m(ijk,top,0) = a_m(ijk,top,0) + a_m(ijk,top,m)*d_t(ijk,m) * a_wpg_t(ijk)
141  a_m(ijk,bottom,0) = a_m(ijk,bottom,0) + a_m(ijk,bottom,m)*d_t(ijkm,m) * a_wpg_t(ijkm)
142  ENDIF
143  ENDIF
144  ENDDO
145 
146  a_m(ijk,0,0) = -(a_m(ijk,east,0)+a_m(ijk,west,0)+&
147  a_m(ijk,north,0)+a_m(ijk,south,0)+&
148  a_m(ijk,top,0)+a_m(ijk,bottom,0))
149 
150  IF (abs(a_m(ijk,0,0)) < small_number) THEN
151  IF (abs(b_m(ijk,0)) < small_number) THEN
152  a_m(ijk,0,0) = -one
153  b_m(ijk,0) = zero
154  ELSEIF (ro_g0 .NE. undefined) THEN !This is an error only in incompressible flow
155 !!$omp critical
156  WRITE (line, '(A,I6,A,I1,A,G12.5)') 'Error: At IJK = ', ijk, &
157  ' M = ', 0, ' A = 0 and b = ', b_m(ijk,0)
158  CALL write_error ('SOURCE_Pp_g', line, 1)
159 !!$omp end critical
160  ENDIF
161  ENDIF
162 
163 
164  ELSE ! if/else branch .not.fluid_at(ijk)
165 ! set the value (correction) in all wall and flow boundary cells to zero
166 ! note the matrix coefficients and source vector should already be zero
167 ! from the initialization of A and B but the following ensures the zero
168 ! value.
169  a_m(ijk,east,0) = zero
170  a_m(ijk,west,0) = zero
171  a_m(ijk,north,0) = zero
172  a_m(ijk,south,0) = zero
173  a_m(ijk,top,0) = zero
174  a_m(ijk,bottom,0) = zero
175  a_m(ijk,0,0) = -one
176  b_m(ijk,0) = zero
177  ENDIF ! end if/else branch fluid_at(ijk)
178  ENDDO ! end do loop (ijk=ijkstart3,ijkend3)
179 !$omp end parallel
180 
181 
182 ! loezos
183  IF (shear) THEN
184 !!$omp parallel do private(IJK)
185  DO ijk = ijkstart3, ijkend3
186  IF (fluid_at(ijk)) THEN
187  v_g(ijk)=v_g(ijk)-vsh(ijk)
188  ENDIF
189  ENDDO
190  ENDIF
191 
192 ! Modification for compressibility
193  IF (ro_g0 == undefined) CALL compressible_pp_g(a_m)
194 
195 ! Remove the asymmetry in matrix caused by the pressure outlet or inlet
196 ! boundaries. Because the P' at such boundaries is zero we may set the
197 ! coefficient in the neighboring fluid cell to zero without affecting
198 ! the linear equation set.
199 !!$omp parallel do &
200 !!$omp& private(IJK,IMJK, IPJK, IJMK, IJPK, IJKM, IJKP)
201  DO ijk = ijkstart3, ijkend3
202  IF (fluid_at(ijk)) THEN
203  imjk = im_of(ijk)
204  ipjk = ip_of(ijk)
205  ijmk = jm_of(ijk)
206  ijpk = jp_of(ijk)
207  ijkm = km_of(ijk)
208  ijkp = kp_of(ijk)
209 ! Cutting the neighbor link between fluid cell and adjacent p_flow_at cell
210  if(p_flow_at(imjk)) a_m(ijk, west, 0) = zero
211  if(p_flow_at(ipjk)) a_m(ijk, east, 0) = zero
212  if(p_flow_at(ijmk)) a_m(ijk, south, 0) = zero
213  if(p_flow_at(ijpk)) a_m(ijk, north, 0) = zero
214  if(p_flow_at(ijkm)) a_m(ijk, bottom, 0) = zero
215  if(p_flow_at(ijkp)) a_m(ijk, top, 0) = zero
216  ENDIF
217  ENDDO
218 
219 ! Specify P' to zero for incompressible flows. Check set_bc0
220 ! for details on selection of IJK_P_g.
221  IF (ijk_p_g /= undefined_i) THEN
222  b_m(ijk_p_g,0) = zero
223  a_m(ijk_p_g,:,0) = zero
224  a_m(ijk_p_g,0,0) = -one
225  ENDIF
226 
227  RETURN
228 
229 CONTAINS
230 
231  include 'functions.inc'
232 
233 END SUBROUTINE source_pp_g
234 
235 
236 !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvC
237 ! C
238 ! Subroutine: COMPRESSIBLE_PP_G C
239 ! Purpose: Correction for incompressible flows. C
240 ! C
241 ! Notes: A HS_CORRECT option is available as a better approximation C
242 ! for high speed flows because it considers density changes in the C
243 ! neighboring C cells. However, the code runs faster without it for C
244 ! low speed flows. The gas phase mass balance cannot be maintained C
245 ! to machine precision with this approximation. C
246 ! C
247 ! C
248 !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^C
249  SUBROUTINE compressible_pp_g(A_M)
251 ! Modules
252 !---------------------------------------------------------------------//
253  use compar, only: ijkstart3, ijkend3
254  use eos, only: droodp_g
255  use fldvar, only: ep_g, u_g, v_g, w_g, rop_g, ro_g, p_g
256  use functions, only: fluid_at, im_of, jm_of, km_of
257  use functions, only: east_of, west_of, north_of, south_of
258  use functions, only: top_of, bottom_of
259  use geometry, only: vol, ayz, axz, axy, do_k
260  use param, only: dimension_3, dimension_m
261  use param, only: east, west, south, north, top, bottom
262  use param1, only: one
263  use run, only: discretize, odt
264  use ur_facs, only: ur_fac
265  use xsi
266  IMPLICIT NONE
267 
268 ! Parameters
269 !---------------------------------------------------------------------//
270  LOGICAL, PARAMETER :: HS_CORRECT = .false.
271 
272 ! Dummy arguments
273 !---------------------------------------------------------------------//
274 ! Septadiagonal matrix A_m
275  DOUBLE PRECISION, INTENT(INOUT) :: A_m(dimension_3, -3:3, 0:dimension_m)
276 
277 ! Local variables
278 !---------------------------------------------------------------------//
279 ! loezos: used for including shearing
280  integer :: incr
281 ! temporary use of global arrays:
282 ! xsi_array: convection weighting factors
283  DOUBLE PRECISION :: XSI_e(dimension_3)
284  DOUBLE PRECISION :: XSI_n(dimension_3)
285  DOUBLE PRECISION :: XSI_t(dimension_3)
286 ! under relaxation factor for pressure
287  double precision :: fac
288 ! Indices
289  INTEGER :: IJK, IMJK, IPJK, IJMK, IJPK, IJKM, IJKP
290  INTEGER :: IJKE, IJKW, IJKN, IJKS, IJKT, IJKB
291 !---------------------------------------------------------------------//
292 
293 ! since p_g = p_g* + ur_fac * pp_g
294  fac = ur_fac(1)
295 
296  IF (.NOT.hs_correct) THEN
297 !!$omp parallel do &
298 !!$omp& private(IJK)
299  DO ijk = ijkstart3, ijkend3
300  IF (fluid_at(ijk)) THEN
301 ! account for change in density w.r.t. pressure
302  a_m(ijk,0,0) = a_m(ijk,0,0) - ur_fac(1)*&
303  droodp_g(ro_g(ijk),p_g(ijk))*ep_g(ijk)*vol(ijk)*odt
304  ENDIF
305  ENDDO
306  ENDIF
307 
308  IF (hs_correct) THEN
309 ! since p_g = p_g* + ur_fac * pp_g
310 ! loezos
311  incr=0
312  CALL calc_xsi(discretize(1),rop_g,u_g,v_g,w_g,xsi_e,xsi_n,xsi_t,incr)
313 
314 !!$omp parallel do &
315 !!$omp& private(IJK,I,J,K, &
316 !!$omp& IMJK,IJMK,IJKM,IJKE,IJKW,IJKN,IJKS,IJKT,IJKB)
317  DO ijk = ijkstart3, ijkend3
318  IF (fluid_at(ijk)) THEN
319  imjk = im_of(ijk)
320  ijmk = jm_of(ijk)
321  ijkm = km_of(ijk)
322  ijke = east_of(ijk)
323  ijkw = west_of(ijk)
324  ijkn = north_of(ijk)
325  ijks = south_of(ijk)
326  ijkt = top_of(ijk)
327  ijkb = bottom_of(ijk)
328  a_m(ijk,0,0) = a_m(ijk,0,0) - fac*droodp_g(ro_g(ijk),p_g(ijk))*&
329  ep_g(ijk)*((one - xsi_e(ijk))*u_g(ijk)*ayz(ijk)-&
330  xsi_e(imjk)*u_g(imjk)*ayz(imjk)+&
331  (one-xsi_n(ijk))*v_g(ijk)*axz(ijk)-&
332  xsi_n(ijmk)*v_g(ijmk)*axz(ijmk))
333 
334  a_m(ijk,east,0) = a_m(ijk,east,0) - ep_g(ijke)*fac*&
335  droodp_g(ro_g(ijke),p_g(ijke))*xsi_e(ijk)*u_g(ijk)*ayz(ijk)
336  a_m(ijk,west,0) = a_m(ijk,west,0) + ep_g(ijkw)*fac*&
337  droodp_g(ro_g(ijkw),p_g(ijkw))*(one - xsi_e(imjk))*u_g(imjk)*ayz(imjk)
338  a_m(ijk,north,0) = a_m(ijk,north,0) - ep_g(ijkn)*fac*&
339  droodp_g(ro_g(ijkn),p_g(ijkn))*xsi_n(ijk)*v_g(ijk)*axz(ijk)
340  a_m(ijk,south,0) = a_m(ijk,south,0) + ep_g(ijks)*fac*&
341  droodp_g(ro_g(ijks),p_g(ijks))*(one - xsi_n(ijmk))*v_g(ijmk)*axz(ijmk)
342  IF (do_k) THEN
343  a_m(ijk,0,0) = a_m(ijk,0,0) - fac*droodp_g(ro_g(ijk),p_g(ijk))*&
344  ep_g(ijk)*((one - xsi_t(ijk))*w_g(ijk)*axy(ijk)-&
345  xsi_t(ijkm)*w_g(ijkm)*axy(ijkm))
346  a_m(ijk,top,0) = a_m(ijk,top,0) - ep_g(ijkt)*fac*&
347  droodp_g(ro_g(ijkt),p_g(ijkt))*xsi_t(ijk)*w_g(ijk)*axy(ijk)
348  a_m(ijk,bottom,0) = a_m(ijk,bottom,0) + ep_g(ijkb)*fac*&
349  droodp_g(ro_g(ijkb),p_g(ijkb))*(one - xsi_t(ijkm))*w_g(ijkm)*axy(ijkm)
350  ENDIF
351 
352  ENDIF !end if (fluid_at(ijk))
353  ENDDO ! end do (ijk=ijkstart3,ijkend3)
354  ENDIF ! end if (hs_correct)
355 
356  RETURN
357  END SUBROUTINE compressible_pp_g
358 
359 
double precision, dimension(:,:), allocatable v_s
Definition: fldvar_mod.f:105
double precision, dimension(dim_eqs) ur_fac
Definition: ur_facs_mod.f:6
integer ijkend3
Definition: compar_mod.f:80
double precision, dimension(:), allocatable ep_g
Definition: fldvar_mod.f:15
double precision, dimension(:,:), allocatable d_n
Definition: pgcor_mod.f:14
logical shear
Definition: run_mod.f:175
Definition: pgcor_mod.f:1
double precision, parameter one
Definition: param1_mod.f:29
integer dimension_3
Definition: param_mod.f:11
subroutine write_error(NAME, LINE, LMAX)
Definition: write_error.f:21
double precision, dimension(:), allocatable a_wpg_t
Definition: cutcell_mod.f:311
double precision, dimension(:), allocatable axy
Definition: geometry_mod.f:210
double precision, dimension(:,:), allocatable w_s
Definition: fldvar_mod.f:117
Definition: rxns_mod.f:1
double precision, dimension(:,:), allocatable d_e
Definition: pgcor_mod.f:12
double precision, dimension(:), allocatable sum_r_g
Definition: rxns_mod.f:28
double precision, dimension(:,:), allocatable sum_r_s
Definition: rxns_mod.f:35
double precision, dimension(:), allocatable p_g
Definition: fldvar_mod.f:26
subroutine calc_xsi(DISCR, PHI, U, V, W, XSI_E, XSI_N, XSI_T, incr)
Definition: xsi_mod.f:23
double precision, parameter undefined
Definition: param1_mod.f:18
double precision, dimension(:,:), allocatable d_t
Definition: pgcor_mod.f:16
integer east
Definition: param_mod.f:29
double precision, dimension(:), allocatable ayz
Definition: geometry_mod.f:206
logical, dimension(dim_m) close_packed
Definition: physprop_mod.f:56
Definition: xsi_mod.f:15
double precision, dimension(:,:), allocatable u_s
Definition: fldvar_mod.f:93
double precision, dimension(:), allocatable vsh
Definition: vshear_mod.f:3
subroutine source_pp_g(A_M, B_M, B_MMAX)
Definition: source_pp_g.f:19
integer mmax
Definition: physprop_mod.f:19
double precision ro_g0
Definition: physprop_mod.f:59
double precision function droodp_g(ROG, PG)
Definition: eos_mod.f:47
double precision, parameter small_number
Definition: param1_mod.f:24
Definition: eos_mod.f:10
double precision odt
Definition: run_mod.f:54
integer ijk_p_g
Definition: bc_mod.f:304
integer north
Definition: param_mod.f:37
double precision, dimension(:), allocatable v_g
Definition: fldvar_mod.f:99
subroutine compressible_pp_g(A_M)
Definition: source_pp_g.f:250
integer south
Definition: param_mod.f:41
double precision, dimension(:), allocatable w_g
Definition: fldvar_mod.f:111
double precision, dimension(:,:), allocatable rop_so
Definition: fldvar_mod.f:54
Definition: run_mod.f:13
double precision, dimension(:), allocatable axz
Definition: geometry_mod.f:208
Definition: param_mod.f:2
logical cartesian_grid
Definition: cutcell_mod.f:13
double precision, dimension(:), allocatable rop_go
Definition: fldvar_mod.f:41
logical do_k
Definition: geometry_mod.f:30
integer ijkstart3
Definition: compar_mod.f:80
integer west
Definition: param_mod.f:33
double precision, dimension(:), allocatable u_g
Definition: fldvar_mod.f:87
integer top
Definition: param_mod.f:45
integer, dimension(dim_eqs) discretize
Definition: run_mod.f:67
double precision, dimension(:,:), allocatable rop_s
Definition: fldvar_mod.f:51
double precision, dimension(:), allocatable a_vpg_n
Definition: cutcell_mod.f:272
double precision, dimension(:), allocatable vol
Definition: geometry_mod.f:212
integer dimension_m
Definition: param_mod.f:18
double precision, dimension(:), allocatable ro_g
Definition: fldvar_mod.f:32
double precision, dimension(:), allocatable rop_g
Definition: fldvar_mod.f:38
integer bottom
Definition: param_mod.f:49
double precision, parameter zero
Definition: param1_mod.f:27
Definition: bc_mod.f:23
double precision, dimension(:), allocatable a_upg_e
Definition: cutcell_mod.f:234