MFIX  2016-1
conv_dif_w_g.f
Go to the documentation of this file.
1 !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvC
2 ! C
3 ! Subroutine: CONV_DIF_W_g C
4 ! Purpose: Determine convection diffusion terms for w_g momentum eqs C
5 ! The off-diagonal coefficients calculated here must be positive. The C
6 ! center coefficient and the source vector are negative; C
7 ! See source_w_g C
8 ! C
9 ! Author: M. Syamlal Date: 24-DEC-96 C
10 ! C
11 ! C
12 !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^C
13  SUBROUTINE conv_dif_w_g(A_M, B_M)
14 
15 ! Modules
16 !---------------------------------------------------------------------//
17  USE param, only: dimension_3, dimension_m
18  USE run, only: momentum_z_eq
19  USE run, only: discretize
20  USE run, only: def_cor
21  USE visc_g, only: epmu_gt
22  IMPLICIT NONE
23 
24 ! Dummy arguments
25 !---------------------------------------------------------------------//
26 ! Septadiagonal matrix A_m
27  DOUBLE PRECISION, INTENT(INOUT) :: A_m(dimension_3, -3:3, 0:dimension_m)
28 ! Vector b_m
29  DOUBLE PRECISION, INTENT(INOUT) :: B_m(dimension_3, 0:dimension_m)
30 !---------------------------------------------------------------------//
31 
32  IF (.NOT.momentum_z_eq(0)) RETURN
33 
34  IF (def_cor) THEN
35 ! USE DEFERRED CORRECTION TO SOLVE W_G
36  CALL store_a_w_g0 (a_m)
37  IF (discretize(5) > 1) CALL store_a_w_gdc(b_m(1,0))
38 
39  ELSE
40 ! DO NOT USE DEFERRED CORRECTOIN TO SOLVE FOR W_G
41  IF (discretize(5) == 0) THEN ! 0 & 1 => FOUP
42  CALL store_a_w_g0 (a_m)
43  ELSE
44  CALL store_a_w_g1 (a_m)
45  ENDIF
46  ENDIF
47 
48  CALL dif_w_is(epmu_gt, a_m, 0)
49 
50  RETURN
51  END SUBROUTINE conv_dif_w_g
52 
53 
54 !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvC
55 ! C
56 ! Purpose: Calculate the components of velocity on the east, north, C
57 ! and top face of a w-momentum cell C
58 ! C
59 !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^C
60  SUBROUTINE get_wcell_gvterms(U, V, WW)
61 
62 ! Modules
63 !---------------------------------------------------------------------//
64  USE compar, only: ijkstart3, ijkend3
65 
66  USE cutcell, only: cut_w_treatment_at
67  USE cutcell, only: theta_wt, theta_wt_bar
68  USE cutcell, only: theta_w_be, theta_w_te
69  USE cutcell, only: theta_w_bn, theta_w_tn
71 
72  USE fldvar, only: u_g, v_g, w_g
73 
74  USE fun_avg, only: avg_z_t, avg_z
75  USE functions, only: kp_of
76  USE indices, only: k_of
77 
78  USE param, only: dimension_3
79  IMPLICIT NONE
80 
81 ! Dummy arguments
82 !---------------------------------------------------------------------//
83  DOUBLE PRECISION, INTENT(OUT) :: U(dimension_3)
84  DOUBLE PRECISION, INTENT(OUT) :: V(dimension_3)
85  DOUBLE PRECISION, INTENT(OUT) :: WW(dimension_3)
86 
87 ! Local variables
88 !---------------------------------------------------------------------//
89 ! indices
90  INTEGER :: IJK, K, IJKP
91 ! for cartesian grid
92  DOUBLE PRECISION :: AW, HW, VELW
93 !---------------------------------------------------------------------//
94 
95 
96 !!!$omp parallel do private(IJK,K,IJKT,IJKP)
97  DO ijk = ijkstart3, ijkend3
98  k = k_of(ijk)
99  ijkp = kp_of(ijk)
100 
101  IF(cut_w_treatment_at(ijk)) THEN
102 
103 ! East face (i+1/2, j, k+1/2)
104  u(ijk) = (theta_w_be(ijk) * u_g(ijk) + &
105  theta_w_te(ijk) * u_g(ijkp))
106  CALL get_interpolation_terms_g(ijk,'W_MOMENTUM', &
107  alpha_we_c(ijk), aw, hw, velw)
108  u(ijk) = u(ijk) * aw
109 
110 ! North face (i, j+1/2, k+1/2)
111  v(ijk) = (theta_w_bn(ijk) * v_g(ijk) + &
112  theta_w_tn(ijk) * v_g(ijkp))
113  CALL get_interpolation_terms_g(ijk,'W_MOMENTUM', &
114  alpha_wn_c(ijk), aw, hw, velw)
115  v(ijk) = v(ijk) * aw
116 
117 ! Top face (i, j, k+1)
118  ww(ijk) = (theta_wt_bar(ijk) * w_g(ijk) + &
119  theta_wt(ijk) * w_g(ijkp))
120  CALL get_interpolation_terms_g(ijk,'W_MOMENTUM', &
121  alpha_wt_c(ijk), aw, hw, velw)
122  ww(ijk) = ww(ijk) * aw
123 
124  ELSE
125  u(ijk) = avg_z(u_g(ijk),u_g(ijkp),k)
126  v(ijk) = avg_z(v_g(ijk),v_g(ijkp),k)
127  ww(ijk) = avg_z_t(w_g(ijk),w_g(ijkp))
128  ENDIF ! end if/else cut_w_treatment_at
129  ENDDO ! end do ijk
130 
131  RETURN
132  END SUBROUTINE get_wcell_gvterms
133 
134 
135 !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvC
136 ! C
137 ! Purpose: Calculate the convective fluxes through the faces of a C
138 ! w-momentum cell. Note the fluxes are calculated at all faces of C
139 ! regardless of flow_at_t of condition of the west, south, or C
140 ! bottom face. C
141 ! C
142 !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^C
143  SUBROUTINE get_wcell_gcflux_terms(FLUX_E, FLUX_W, FLUX_N, &
144  flux_s, flux_t, flux_b, ijk)
146 ! Modules
147 !---------------------------------------------------------------------//
148  USE cutcell, only: cut_w_treatment_at
149  USE cutcell, only: theta_wt, theta_wt_bar
150  USE cutcell, only: theta_w_be, theta_w_te
151  USE cutcell, only: theta_w_bn, theta_w_tn
153 
154  USE functions, only: kp_of, im_of, jm_of, km_of
155 
156  USE mflux, only: flux_ge, flux_gn, flux_gt
157 
158  USE param1, only: half
159  IMPLICIT NONE
160 
161 ! Dummy arguments
162 !---------------------------------------------------------------------//
163 ! fluxes through faces of given ijk u-momentum cell
164  DOUBLE PRECISION, INTENT(OUT) :: flux_e, flux_w
165  DOUBLE PRECISION, INTENT(OUT) :: flux_n, flux_s
166  DOUBLE PRECISION, INTENT(OUT) :: flux_t, flux_b
167 ! ijk index
168  INTEGER, INTENT(IN) :: ijk
169 
170 ! Local variables
171 !---------------------------------------------------------------------//
172 ! indices
173  INTEGER :: imjk, ijmk, ijkm
174  INTEGER :: ijkp, imjkp, ijmkp
175 
176 ! for cartesian grid
177  DOUBLE PRECISION :: AW, HW, VELW
178 !---------------------------------------------------------------------//
179 
180  ijkp = kp_of(ijk)
181  imjk = im_of(ijk)
182  ijmk = jm_of(ijk)
183  ijkm = km_of(ijk)
184  imjkp = kp_of(imjk)
185  ijmkp = kp_of(ijmk)
186 
187  IF(cut_w_treatment_at(ijk)) THEN
188 ! East face (i+1/2, j, k+1/2)
189  flux_e = (theta_w_be(ijk) * flux_ge(ijk) + &
190  theta_w_te(ijk) * flux_ge(ijkp))
191  CALL get_interpolation_terms_g(ijk,'W_MOMENTUM',&
192  alpha_we_c(ijk), aw, hw, velw)
193  flux_e = flux_e * aw
194 ! West face (i-1/2, j, k+1/2)
195  flux_w = (theta_w_be(imjk) * flux_ge(imjk) + &
196  theta_w_te(imjk) * flux_ge(imjkp))
197  CALL get_interpolation_terms_g(ijk,'W_MOMENTUM',&
198  alpha_we_c(imjk), aw, hw, velw)
199  flux_w = flux_w * aw
200 
201 
202 ! North face (i, j+1/2, k+1/2)
203  flux_n = (theta_w_bn(ijk) * flux_gn(ijk) + &
204  theta_w_tn(ijk) * flux_gn(ijkp))
205  CALL get_interpolation_terms_g(ijk,'W_MOMENTUM',&
206  alpha_wn_c(ijk), aw, hw, velw)
207  flux_n = flux_n * aw
208 ! South face (i, j-1/2, k+1/2)
209  flux_s = (theta_w_bn(ijmk) * flux_gn(ijmk) + &
210  theta_w_tn(ijmk) * flux_gn(ijmkp))
211  CALL get_interpolation_terms_g(ijk,'W_MOMENTUM',&
212  alpha_wn_c(ijmk), aw, hw, velw)
213  flux_s = flux_s * aw
214 
215 
216 ! Top face (i, j, k+1)
217  flux_t = (theta_wt_bar(ijk) * flux_gt(ijk) + &
218  theta_wt(ijk) * flux_gt(ijkp))
219  CALL get_interpolation_terms_g(ijk,'W_MOMENTUM',&
220  alpha_wt_c(ijk),aw,hw,velw)
221  flux_t = flux_t * aw
222 ! Bottom face (i, j, k)
223  flux_b = (theta_wt_bar(ijkm) * flux_gt(ijkm) + &
224  theta_wt(ijkm) * flux_gt(ijk))
225  CALL get_interpolation_terms_g(ijk,'W_MOMENTUM',&
226  alpha_wt_c(ijkm), aw, hw, velw)
227  flux_b = flux_b * aw
228  ELSE
229  flux_e = half * (flux_ge(ijk) + flux_ge(ijkp))
230  flux_w = half * (flux_ge(imjk) + flux_ge(imjkp))
231  flux_n = half * (flux_gn(ijk) + flux_gn(ijkp))
232  flux_s = half * (flux_gn(ijmk) + flux_gn(ijmkp))
233  flux_t = half * (flux_gt(ijk) + flux_gt(ijkp))
234  flux_b = half * (flux_gt(ijkm) + flux_gt(ijk))
235  ENDIF ! end if/else cut_w_treatment_at
236 
237  RETURN
238  END SUBROUTINE get_wcell_gcflux_terms
239 
240 
241 !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvC
242 ! C
243 ! Purpose: Calculate the components of diffusive flux through the C
244 ! faces of a w-momentum cell. Note the fluxes are calculated at C
245 ! all faces regardless of flow_at_t condition of the west, south C
246 ! or bottom face. C
247 ! C
248 !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^C
249  SUBROUTINE get_wcell_gdiff_terms(D_FE, D_FW, D_FN, D_FS, &
250  d_ft, d_fb, ijk)
252 ! Modules
253 !---------------------------------------------------------------------//
254  USE cutcell, only: cut_w_treatment_at
256 
257  USE fldvar, only: epg_jfac
258 
259  USE functions, only: wall_at
260  USE functions, only: east_of, north_of, top_of
261  USE functions, only: west_of, south_of
262  USE functions, only: im_of, jm_of, km_of
263 
264  USE geometry, only: odx_e, ody_n, odz
265  USE geometry, only: ox
266  USE geometry, only: ayz_w, axz_w, axy_w
267 
268  USE indices, only: i_of, j_of, k_of
269  USE indices, only: kp1, im1, jm1
270 
271  USE visc_g, only: epmu_gt, df_gw
272  USE param
273  IMPLICIT NONE
274 
275 ! Dummy arguments
276 !---------------------------------------------------------------------//
277 ! diffusion through faces of given ijk w-momentum cell
278  DOUBLE PRECISION, INTENT(OUT) :: d_fe, d_fw
279  DOUBLE PRECISION, INTENT(OUT) :: d_fn, d_fs
280  DOUBLE PRECISION, INTENT(OUT) :: d_ft, d_fb
281 ! ijk idnex
282  INTEGER, INTENT(IN) :: ijk
283 
284 ! Local variables
285 !---------------------------------------------------------------------//
286 ! indices
287  INTEGER :: imjk, ijmk, ijkm
288  INTEGER :: i, j, k, kp, im, jm
289  INTEGER :: ijkc, ijkt, ijke, ijkte, ijkw, ijkwt
290  INTEGER :: ijkn, ijktn, ijks, ijkst
291 ! length terms
292  DOUBLE PRECISION :: C_AE, C_AW, C_AN, C_AS, C_AT, C_AB
293 ! average voidage
294  DOUBLE PRECISION :: EPGA
295 !---------------------------------------------------------------------//
296 
297  imjk = im_of(ijk)
298  ijmk = jm_of(ijk)
299  ijkm = km_of(ijk)
300 
301  i = i_of(ijk)
302  j = j_of(ijk)
303  k = k_of(ijk)
304  kp = kp1(k)
305  im = im1(i)
306  jm = jm1(j)
307 
308  ijkt = top_of(ijk)
309  IF (wall_at(ijk)) THEN
310  ijkc = ijkt
311  ELSE
312  ijkc = ijk
313  ENDIF
314  ijke = east_of(ijk)
315  ijkte = east_of(ijkt)
316  ijkn = north_of(ijk)
317  ijktn = north_of(ijkt)
318  ijkw = west_of(ijk)
319  ijkwt = top_of(ijkw)
320  ijks = south_of(ijk)
321  ijkst = top_of(ijks)
322 
323  IF(cut_w_treatment_at(ijk)) THEN
324  c_ae = oneodx_e_w(ijk)
325  c_aw = oneodx_e_w(imjk)
326  c_an = oneody_n_w(ijk)
327  c_as = oneody_n_w(ijmk)
328  c_at = oneodz_t_w(ijk)
329  c_ab = oneodz_t_w(ijkm)
330  ELSE
331  c_ae = odx_e(i)
332  c_aw = odx_e(im)
333  c_an = ody_n(j)
334  c_as = ody_n(jm)
335  c_at = odz(kp)
336  c_ab = odz(k)
337  ENDIF
338 
339 ! East face (i+1/2, j, k+1/2)
340  d_fe = avg_z_h(avg_x_h(epmu_gt(ijkc),epmu_gt(ijke),i),&
341  avg_x_h(epmu_gt(ijkt),epmu_gt(ijkte),i),k)*&
342  c_ae*ayz_w(ijk)
343 ! West face (i-1/2, j, k+1/2)
344  d_fw = avg_z_h(avg_x_h(epmu_gt(ijkw),epmu_gt(ijkc),im),&
345  avg_x_h(epmu_gt(ijkwt),epmu_gt(ijkt),im),k)*&
346  c_aw*ayz_w(imjk)
347 
348 ! North face (i, j+1/2, k+1/2)
349  d_fn = avg_z_h(avg_y_h(epmu_gt(ijkc),epmu_gt(ijkn),j),&
350  avg_y_h(epmu_gt(ijkt),epmu_gt(ijktn),j),k)*&
351  c_an*axz_w(ijk)
352 ! South face (i, j-1/2, k+1/2)
353  d_fs = avg_z_h(avg_y_h(epmu_gt(ijks),epmu_gt(ijkc),jm),&
354  avg_y_h(epmu_gt(ijkst),epmu_gt(ijkt),jm),k)*&
355  c_as*axz_w(ijmk)
356 
357 ! Top face (i, j, k+1)
358  d_ft = epmu_gt(ijkt)*ox(i)*c_at*axy_w(ijk)
359 ! Bottom face (i, j, k)
360  d_fb = epmu_gt(ijk)*ox(i)*c_ab*axy_w(ijkm)
361 
362  df_gw(ijk,east) = d_fe
363  df_gw(ijk,west) = d_fw
364  df_gw(ijk,north) = d_fn
365  df_gw(ijk,south) = d_fs
366  df_gw(ijk,top) = d_ft
367  df_gw(ijk,bottom) = d_fb
368 
369 ! if jackson, implement jackson style governing equations: multiply by
370 ! the void fraction otherwise multiply by 1
371  epga = avg_z(epg_jfac(ijkc), epg_jfac(ijkt), k)
372  d_fe = epga*d_fe
373  d_fw = epga*d_fw
374  d_fn = epga*d_fn
375  d_fs = epga*d_fs
376  d_ft = epga*d_ft
377  d_fb = epga*d_fb
378 
379  RETURN
380 
381  CONTAINS
382 
383  include 'fun_avg.inc'
384 
385  END SUBROUTINE get_wcell_gdiff_terms
386 
387 !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvC
388 ! C
389 ! Subroutine: STORE_A_W_g0 C
390 ! Purpose: Determine convection diffusion terms for W_g momentum eqs. C
391 ! The off-diagonal coefficients calculated here must be positive. C
392 ! The center coefficient and the source vector are negative. See C
393 ! source_w_g. C
394 ! Implement FOUP discretization C
395 ! C
396 ! Author: M. Syamlal Date: 29-APR-96 C
397 ! C
398 ! Revision Number: 1 C
399 ! Purpose: To incorporate Cartesian grid modifications C
400 ! Author: Jeff Dietiker Date: 01-Jul-09 C
401 ! C
402 ! C
403 !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^C
404  SUBROUTINE store_a_w_g0(A_W_G)
406 ! Modules
407 !---------------------------------------------------------------------//
408  USE compar, only: ijkstart3, ijkend3
409 
410  USE functions, only: flow_at_t
411  USE functions, only: ip_of, jp_of, kp_of
412  USE functions, only: im_of, jm_of, km_of
413 
414  USE param
415  USE param1, only: zero
416 
417  IMPLICIT NONE
418 
419 ! Dummy arguments
420 !---------------------------------------------------------------------//
421 ! Septadiagonal matrix A_U_g
422  DOUBLE PRECISION, INTENT(INOUT) :: A_W_g(dimension_3, -3:3, 0:dimension_m)
423 ! Local variables
424 !---------------------------------------------------------------------//
425 ! Indices
426  INTEGER :: IJK
427  INTEGER :: IMJK, IPJK, IJMK, IJPK, IJKM, IJKP
428 ! Face mass flux
429  DOUBLE PRECISION :: flux_e, flux_w, flux_n, flux_s
430  DOUBLE PRECISION :: flux_t, flux_b
431 ! Diffusion parameter
432  DOUBLE PRECISION :: D_fe, d_fw, d_fn, d_fs, d_ft, d_fb
433 
434 !---------------------------------------------------------------------//
435 
436 !$omp parallel do default(none) &
437 !$omp private(IJK, IPJK, IJPK, IJKP, IMJK, IJMK, IJKM, &
438 !$omp D_fe, d_fw, d_fn, d_fs, d_ft, d_fb, &
439 !$omp flux_e, flux_w, flux_n, flux_s, flux_t, flux_b) &
440 !$omp shared(ijkstart3, ijkend3, a_w_g)
441 
442  DO ijk = ijkstart3, ijkend3
443 
444  IF (flow_at_t(ijk)) THEN
445 
446 ! Calculate convection-diffusion fluxes through each of the faces
447  CALL get_wcell_gcflux_terms(flux_e, flux_w, flux_n, &
448  flux_s, flux_t, flux_b, ijk)
449 
450  CALL get_wcell_gdiff_terms(d_fe, d_fw, d_fn, d_fs, &
451  d_ft, d_fb, ijk)
452 
453  ipjk = ip_of(ijk)
454  ijpk = jp_of(ijk)
455  ijkp = kp_of(ijk)
456  imjk = im_of(ijk)
457  ijmk = jm_of(ijk)
458  ijkm = km_of(ijk)
459 
460 ! East face (i+1/2, j, k+1/2)
461  IF (flux_e >= zero) THEN
462  a_w_g(ijk,east,0) = d_fe
463  a_w_g(ipjk,west,0) = d_fe + flux_e
464  ELSE
465  a_w_g(ijk,east,0) = d_fe - flux_e
466  a_w_g(ipjk,west,0) = d_fe
467  ENDIF
468 ! West face (i-1/2, j, k+1/2)
469  IF (.NOT.flow_at_t(imjk)) THEN
470  IF (flux_w >= zero) THEN
471  a_w_g(ijk,west,0) = d_fw + flux_w
472  ELSE
473  a_w_g(ijk,west,0) = d_fw
474  ENDIF
475  ENDIF
476 
477 
478 ! North face (i, j+1/2, k+1/2)
479  IF (flux_n >= zero) THEN
480  a_w_g(ijk,north,0) = d_fn
481  a_w_g(ijpk,south,0) = d_fn + flux_n
482  ELSE
483  a_w_g(ijk,north,0) = d_fn - flux_n
484  a_w_g(ijpk,south,0) = d_fn
485  ENDIF
486 ! South face (i, j-1/2, k+1/2)
487  IF (.NOT.flow_at_t(ijmk)) THEN
488  IF (flux_s >= zero) THEN
489  a_w_g(ijk,south,0) = d_fs + flux_s
490  ELSE
491  a_w_g(ijk,south,0) = d_fs
492  ENDIF
493  ENDIF
494 
495 
496 ! Top face (i, j, k+1)
497  IF (flux_t >= zero) THEN
498  a_w_g(ijk,top,0) = d_ft
499  a_w_g(ijkp,bottom,0) = d_ft + flux_t
500  ELSE
501  a_w_g(ijk,top,0) = d_ft - flux_t
502  a_w_g(ijkp,bottom,0) = d_ft
503  ENDIF
504 ! Bottom face (i, j, k)
505  IF (.NOT.flow_at_t(ijkm)) THEN
506  IF (flux_b >= zero) THEN
507  a_w_g(ijk,bottom,0) = d_fb + flux_b
508  ELSE
509  a_w_g(ijk,bottom,0) = d_fb
510  ENDIF
511  ENDIF
512  ENDIF ! end if (flow_at_t)
513  ENDDO ! end do (ijk)
514 !$omp end parallel do
515 
516  RETURN
517  END SUBROUTINE store_a_w_g0
518 
519 
520 !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvC
521 ! C
522 ! Subroutine: STORE_A_W_GDC C
523 ! Purpose: Use deferred correction method to solve the w-momentum C
524 ! equation. This method combines first order upwind and a user C
525 ! specified higher order method C
526 ! C
527 ! Author: C. GUENTHER Date: 8-APR-99 C
528 ! C
529 ! Revision Number: 1 C
530 ! Purpose: To incorporate Cartesian grid modifications C
531 ! Author: Jeff Dietiker Date: 01-Jul-09 C
532 ! C
533 ! C
534 !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^C
535  SUBROUTINE store_a_w_gdc(B_M)
537 ! Modules
538 !---------------------------------------------------------------------//
539  USE compar, only: ijkstart3, ijkend3
540 
541  USE discretization, only: fpfoi_of
542 
543  USE fldvar, only: w_g
544 
545  USE function3, only: funijk3
546  USE functions, only: flow_at_t
547  USE functions, only: ip_of, jp_of, kp_of
548  USE functions, only: im_of, jm_of, km_of
549 
550  USE indices, only: i_of, j_of, k_of
551 
552  USE param, only: dimension_3, dimension_4
553  USE param1, only: zero
554 
555  USE run, only: discretize, fpfoi
556  USE sendrecv3, only: send_recv3
557  USE xsi, only: calc_xsi
558 
559  IMPLICIT NONE
560 
561 ! Dummy arguments
562 !---------------------------------------------------------------------//
563 ! Vector b_m
564  DOUBLE PRECISION, INTENT(INOUT) :: B_m(dimension_3)
565 
566 ! Local variables
567 !---------------------------------------------------------------------//
568 ! Indices
569  INTEGER :: I, J, K, IJK
570  INTEGER :: IPJK, IMJK, IJMK, IJPK, IJKM, IJKP
571  INTEGER :: IJK4, IPPP, IPPP4, JPPP, JPPP4, KPPP, KPPP4
572  INTEGER :: IMMM, IMMM4, JMMM, JMMM4, KMMM, KMMM4
573 ! indication for shear
574  INTEGER :: incr
575 ! deferred corrction contribution form high order method
576  DOUBLE PRECISION :: MOM_HO
577 ! low order approximation
578  DOUBLE PRECISION :: MOM_LO
579 ! convection factor at each face
580  DOUBLE PRECISION :: flux_e, flux_w, flux_n, flux_s
581  DOUBLE PRECISION :: flux_t, flux_b
582 ! deferred correction contributions from each face
583  DOUBLE PRECISION :: EAST_DC
584  DOUBLE PRECISION :: WEST_DC
585  DOUBLE PRECISION :: NORTH_DC
586  DOUBLE PRECISION :: SOUTH_DC
587  DOUBLE PRECISION :: TOP_DC
588  DOUBLE PRECISION :: BOTTOM_DC
589 
590 ! temporary use of global arrays:
591 ! array1 (locally u) - the x directional velocity
592  DOUBLE PRECISION :: U(dimension_3)
593 ! array2 (locally v) - the y directional velocity
594  DOUBLE PRECISION :: V(dimension_3)
595 ! array3 (locally ww) - the z directional velocity
596  DOUBLE PRECISION :: WW(dimension_3)
597 !---------------------------------------------------------------------//
598  DOUBLE PRECISION :: TMP4(dimension_4)
599  DOUBLE PRECISION, DIMENSION(DIMENSION_3) :: XSI_e, XSI_n, XSI_t
600 
601  CALL get_wcell_gvterms(u, v, ww)
602 
603 ! Send recv the third ghost layer
604  IF (fpfoi) THEN
605  Do ijk = ijkstart3, ijkend3
606  i = i_of(ijk)
607  j = j_of(ijk)
608  k = k_of(ijk)
609  ijk4 = funijk3(i,j,k)
610  tmp4(ijk4) = w_g(ijk)
611  ENDDO
612  CALL send_recv3(tmp4)
613  ENDIF
614 
615 ! shear indicator:
616  incr=0
617  CALL calc_xsi (discretize(5), w_g, u, v, ww, xsi_e, xsi_n,&
618  xsi_t, incr)
619 
620 
621 !!!$omp parallel do &
622 !!!$omp& private( I, J, K, IJK, IPJK, IMJK, IJPK, IJMK, &
623 !!!$omp& flux_e, flux_w, flux_n, flux_s, flux_b, flux_t, &
624 !!!$omp& MOM_HO, MOM_LO, EAST_DC, WEST_DC, NORTH_DC, &
625 !!!$omp& SOUTH_DC, TOP_DC, BOTTOM_DC)
626  DO ijk = ijkstart3, ijkend3
627 
628  IF (flow_at_t(ijk)) THEN
629 
630 ! Calculate convection fluxes through each of the faces
631  CALL get_wcell_gcflux_terms(flux_e, flux_w, flux_n, &
632  flux_s, flux_t, flux_b, ijk)
633 
634  ipjk = ip_of(ijk)
635  imjk = im_of(ijk)
636  ijpk = jp_of(ijk)
637  ijmk = jm_of(ijk)
638  ijkp = kp_of(ijk)
639  ijkm = km_of(ijk)
640 
641 ! Third Ghost layer information
642  ippp = ip_of(ip_of(ipjk))
643  ippp4 = funijk3(i_of(ippp), j_of(ippp), k_of(ippp))
644  immm = im_of(im_of(imjk))
645  immm4 = funijk3(i_of(immm), j_of(immm), k_of(immm))
646  jppp = jp_of(jp_of(ijpk))
647  jppp4 = funijk3(i_of(jppp), j_of(jppp), k_of(jppp))
648  jmmm = jm_of(jm_of(ijmk))
649  jmmm4 = funijk3(i_of(jmmm), j_of(jmmm), k_of(jmmm))
650  kppp = kp_of(kp_of(ijkp))
651  kppp4 = funijk3(i_of(kppp), j_of(kppp), k_of(kppp))
652  kmmm = km_of(km_of(ijkm))
653  kmmm4 = funijk3(i_of(kmmm), j_of(kmmm), k_of(kmmm))
654 
655 
656 ! East face (i+1/2, j, k+1/2)
657  IF(u(ijk) >= zero)THEN
658  mom_lo = w_g(ijk)
659  IF (fpfoi) mom_ho = fpfoi_of(w_g(ipjk), w_g(ijk), &
660  w_g(imjk), w_g(im_of(imjk)))
661  ELSE
662  mom_lo = w_g(ipjk)
663  IF (fpfoi) mom_ho = fpfoi_of(w_g(ijk), w_g(ipjk), &
664  w_g(ip_of(ipjk)), tmp4(ippp4))
665  ENDIF
666  IF (.NOT. fpfoi) mom_ho = xsi_e(ijk)*w_g(ipjk)+ &
667  (1.0-xsi_e(ijk))*w_g(ijk)
668  east_dc = flux_e*(mom_lo-mom_ho)
669 
670 
671 ! North face (i, j+1/2, k+1/2)
672  IF(v(ijk) >= zero)THEN
673  mom_lo = w_g(ijk)
674  IF (fpfoi) mom_ho = fpfoi_of(w_g(ijpk), w_g(ijk), &
675  w_g(ijmk), w_g(jm_of(ijmk)))
676  ELSE
677  mom_lo = w_g(ijpk)
678  IF (fpfoi) mom_ho = fpfoi_of(w_g(ijk), w_g(ijpk), &
679  w_g(jp_of(ijpk)), tmp4(jppp4))
680  ENDIF
681  IF (.NOT. fpfoi) mom_ho = xsi_n(ijk)*w_g(ijpk)+ &
682  (1.0-xsi_n(ijk))*w_g(ijk)
683  north_dc = flux_n*(mom_lo-mom_ho)
684 
685 
686 ! Top face (i, j, k+1)
687  IF(ww(ijk) >= zero)THEN
688  mom_lo = w_g(ijk)
689  IF (fpfoi) mom_ho = fpfoi_of(w_g(ijkp), w_g(ijk), &
690  w_g(ijkm), w_g(km_of(ijkm)))
691  ELSE
692  mom_lo = w_g(ijkp)
693  IF (fpfoi) mom_ho = fpfoi_of(w_g(ijk), w_g(ijkp), &
694  w_g(kp_of(ijkp)), tmp4(kppp4))
695  ENDIF
696  IF (.NOT. fpfoi) mom_ho = xsi_t(ijk)*w_g(ijkp)+ &
697  (1.0-xsi_t(ijk))*w_g(ijk)
698  top_dc = flux_t*(mom_lo-mom_ho)
699 
700 
701 ! West face (i-1/2, j, k+1/2)
702  IF(u(imjk) >= zero)THEN
703  mom_lo = w_g(imjk)
704  IF (fpfoi) mom_ho = fpfoi_of(w_g(ijk), w_g(imjk), &
705  w_g(im_of(imjk)), tmp4(immm4))
706  ELSE
707  mom_lo = w_g(ijk)
708  IF (fpfoi) mom_ho = fpfoi_of(w_g(imjk), w_g(ijk), &
709  w_g(ipjk), w_g(ip_of(ipjk)))
710  ENDIF
711  IF (.NOT. fpfoi) mom_ho = xsi_e(imjk)*w_g(ijk)+ &
712  (1.0-xsi_e(imjk))*w_g(imjk)
713  west_dc = flux_w*(mom_lo-mom_ho)
714 
715 
716 ! South face (i, j-1/2, k+1/2)
717  IF(v(ijmk) >= zero)THEN
718  mom_lo = w_g(ijmk)
719  IF (fpfoi) mom_ho = fpfoi_of(w_g(ijk), w_g(ijmk), &
720  w_g(jm_of(ijmk)), tmp4(jmmm4))
721  ELSE
722  mom_lo = w_g(ijk)
723  IF (fpfoi) mom_ho = fpfoi_of(w_g(ijmk), w_g(ijk), &
724  w_g(ijpk), w_g(jp_of(ijpk)))
725  ENDIF
726  IF (.NOT. fpfoi) mom_ho = xsi_n(ijmk)*w_g(ijk)+ &
727  (1.0-xsi_n(ijmk))*w_g(ijmk)
728  south_dc = flux_s*(mom_lo-mom_ho)
729 
730 
731 ! Bottom face (i, j, k)
732  IF(ww(ijk) >= zero)THEN
733  mom_lo = w_g(ijkm)
734  IF (fpfoi) mom_ho = fpfoi_of(w_g(ijk), w_g(ijkm), &
735  w_g(km_of(ijkm)), tmp4(kmmm4))
736  ELSE
737  mom_lo = w_g(ijk)
738  IF (fpfoi) mom_ho = fpfoi_of(w_g(ijkm), w_g(ijk), &
739  w_g(ijkp), w_g(kp_of(ijkp)))
740  ENDIF
741  IF (.NOT. fpfoi) mom_ho = xsi_t(ijkm)*w_g(ijk)+ &
742  (1.0-xsi_t(ijkm))*w_g(ijkm)
743  bottom_dc = flux_b*(mom_lo-mom_ho)
744 
745 
746 ! CONTRIBUTION DUE TO DEFERRED CORRECTION
747  b_m(ijk) = b_m(ijk)+west_dc-east_dc+south_dc-north_dc&
748  +bottom_dc-top_dc
749 
750  ENDIF ! end if flow_at_t
751  ENDDO ! end do ijk
752 
753  RETURN
754  END SUBROUTINE store_a_w_gdc
755 
756 !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvC
757 ! C
758 ! Subroutine: STORE_A_W_g1 C
759 ! Purpose: Determine convection diffusion terms for W_g momentum eqs C
760 ! The off-diagonal coefficients calculated here must be positive. C
761 ! The center coefficient and the source vector are negative. C
762 ! Implements higher order discretization. C
763 ! See source_w_g C
764 ! C
765 ! Author: M. Syamlal Date: 20-MAR-97 C
766 ! C
767 ! Revision Number: 1 C
768 ! Purpose: To incorporate Cartesian grid modifications C
769 ! Author: Jeff Dietiker Date: 01-Jul-09 C
770 ! C
771 ! C
772 !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^C
773  SUBROUTINE store_a_w_g1(A_W_G)
775 ! Modules
776 !---------------------------------------------------------------------//
777  USE compar, only: ijkstart3, ijkend3
778  USE fldvar, only: w_g
779 
780  USE functions, only: flow_at_t
781  USE functions, only: ip_of, jp_of, kp_of
782  USE functions, only: im_of, jm_of, km_of
783 
784  USE param
785  USE param1, only: one
786 
787  USE run, only: discretize
788  USE xsi, only: calc_xsi
789 
790  IMPLICIT NONE
791 
792 ! Dummy arguments
793 !---------------------------------------------------------------------//
794 ! Septadiagonal matrix A_W_g
795  DOUBLE PRECISION, INTENT(INOUT) :: A_W_g(dimension_3, -3:3, 0:dimension_m)
796 
797 ! Local variables
798 !---------------------------------------------------------------------//
799 ! Indices
800  INTEGER :: IJK, IPJK, IMJK, IJPK, IJMK, IJKP, IJKM
801 ! indicator for shear
802  INTEGER :: incr
803 ! Diffusion parameter
804  DOUBLE PRECISION :: d_fe, d_fw, d_fn, d_fs, d_ft, d_fb
805 ! Face mass flux
806  DOUBLE PRECISION :: Flux_e, flux_w, flux_n, flux_s
807  DOUBLE PRECISION :: flux_t, flux_b
808 
809 ! temporary use of global arrays:
810 ! array1 (locally u) - the x directional velocity
811  DOUBLE PRECISION :: U(dimension_3)
812 ! array2 (locally v) - the y directional velocity
813  DOUBLE PRECISION :: V(dimension_3)
814 ! array3 (locally ww) - the z directional velocity
815  DOUBLE PRECISION :: WW(dimension_3)
816 !---------------------------------------------------------------------//
817  DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE :: TMP4
818  DOUBLE PRECISION, DIMENSION(DIMENSION_3) :: XSI_e, XSI_n, XSI_t
819 
820  CALL get_wcell_gvterms(u, v, ww)
821 
822 ! shear indicator:
823  incr=0
824  CALL calc_xsi (discretize(5), w_g, u, v, ww, xsi_e, xsi_n,&
825  xsi_t, incr)
826 
827 !!!$omp parallel do &
828 !!!$omp& private(IJK, IPJK, IJPK, IJKP, IMJK, IJMK, IJKM, &
829 !!!$omp& d_fe, d_fw, d_fn, d_fs, d_ft, d_fb, &
830 !!!$omp& flux_e, flux_w, flux_n, flux_s, flux_t, flux_b)
831  DO ijk = ijkstart3, ijkend3
832 
833  IF (flow_at_t(ijk)) THEN
834 
835 ! Calculate convection-diffusion fluxes through each of the faces
836  CALL get_wcell_gcflux_terms(flux_e, flux_w, flux_n, &
837  flux_s, flux_t, flux_b, ijk)
838  CALL get_wcell_gdiff_terms(d_fe, d_fw, d_fn, d_fs, &
839  d_ft, d_fb, ijk)
840 
841  ipjk = ip_of(ijk)
842  ijpk = jp_of(ijk)
843  ijkp = kp_of(ijk)
844  imjk = im_of(ijk)
845  ijmk = jm_of(ijk)
846  ijkm = km_of(ijk)
847 
848 ! East face (i+1/2, j, k+1/2)
849  a_w_g(ijk,east,0) = d_fe - xsi_e(ijk)*flux_e
850  a_w_g(ipjk,west,0) = d_fe + (one - xsi_e(ijk))*flux_e
851 ! West face (i-1/2, j, k+1/2)
852  IF (.NOT.flow_at_t(imjk)) THEN
853  a_w_g(ijk,west,0) = d_fw + (one - xsi_e(imjk))*flux_w
854  ENDIF
855 
856 
857 ! North face (i, j+1/2, k+1/2)
858  a_w_g(ijk,north,0) = d_fn - xsi_n(ijk)*flux_n
859  a_w_g(ijpk,south,0) = d_fn + (one - xsi_n(ijk))*flux_n
860 ! South face (i, j-1/2, k+1/2)
861  IF (.NOT.flow_at_t(ijmk)) THEN
862  a_w_g(ijk,south,0) = d_fs + (one - xsi_n(ijmk))*flux_s
863  ENDIF
864 
865 
866 ! Top face (i, j, k+1)
867  a_w_g(ijk,top,0) = d_ft - xsi_t(ijk)*flux_t
868  a_w_g(ijkp,bottom,0) = d_ft + (one - xsi_t(ijk))*flux_t
869 ! Bottom face (i, j, k)
870  IF (.NOT.flow_at_t(ijkm)) THEN
871  a_w_g(ijk,bottom,0) = d_fb + (one - xsi_t(ijkm))*flux_b
872  ENDIF
873 
874  ENDIF ! end if flow_at_t
875  ENDDO ! end do ijk
876 
877  RETURN
878  END SUBROUTINE store_a_w_g1
double precision, dimension(:), allocatable flux_ge
Definition: mflux_mod.f:13
double precision, dimension(:), allocatable theta_w_tn
Definition: cutcell_mod.f:290
subroutine get_wcell_gdiff_terms(D_FE, D_FW, D_FN, D_FS, D_FT, D_FB, IJK)
Definition: conv_dif_w_g.f:251
integer, dimension(:), allocatable i_of
Definition: indices_mod.f:45
double precision, dimension(:), allocatable oneodx_e_w
Definition: cutcell_mod.f:324
integer ijkend3
Definition: compar_mod.f:80
subroutine conv_dif_w_g(A_M, B_M)
Definition: conv_dif_w_g.f:14
double precision, dimension(:,:), allocatable df_gw
Definition: visc_g_mod.f:33
double precision, parameter one
Definition: param1_mod.f:29
integer dimension_3
Definition: param_mod.f:11
subroutine get_interpolation_terms_g(IJK, TYPE_OF_CELL, ALPHA_CUT, AW, HW, VELW)
double precision, dimension(:), allocatable oneodz_t_w
Definition: cutcell_mod.f:326
integer, dimension(:), allocatable im1
Definition: indices_mod.f:50
double precision, dimension(:), allocatable epg_jfac
Definition: fldvar_mod.f:18
double precision, dimension(:), allocatable theta_w_bn
Definition: cutcell_mod.f:291
subroutine get_wcell_gvterms(U, V, WW)
Definition: conv_dif_w_g.f:61
logical, dimension(0:dim_m) momentum_z_eq
Definition: run_mod.f:80
double precision, dimension(:), allocatable theta_wt
Definition: cutcell_mod.f:293
subroutine calc_xsi(DISCR, PHI, U, V, W, XSI_E, XSI_N, XSI_T, incr)
Definition: xsi_mod.f:23
subroutine get_wcell_gcflux_terms(FLUX_E, FLUX_W, FLUX_N, FLUX_S, FLUX_T, FLUX_B, IJK)
Definition: conv_dif_w_g.f:145
integer east
Definition: param_mod.f:29
subroutine store_a_w_g0(A_W_G)
Definition: conv_dif_w_g.f:405
subroutine store_a_w_g1(A_W_G)
Definition: conv_dif_w_g.f:774
Definition: xsi_mod.f:15
double precision, dimension(:), allocatable alpha_wt_c
Definition: cutcell_mod.f:308
double precision, dimension(:), allocatable theta_wt_bar
Definition: cutcell_mod.f:294
integer, dimension(:), allocatable k_of
Definition: indices_mod.f:47
double precision function fpfoi_of(PHI_D, PHI_C, PHI_U, PHI_UU)
double precision, dimension(:), allocatable ody_n
Definition: geometry_mod.f:123
double precision, dimension(:), allocatable alpha_wn_c
Definition: cutcell_mod.f:305
integer, dimension(:), allocatable j_of
Definition: indices_mod.f:46
double precision, dimension(:), allocatable odx_e
Definition: geometry_mod.f:121
integer, dimension(:), allocatable jm1
Definition: indices_mod.f:51
double precision, dimension(:), allocatable flux_gn
Definition: mflux_mod.f:15
double precision, dimension(:), allocatable ox
Definition: geometry_mod.f:140
integer dimension_4
Definition: param_mod.f:16
double precision, dimension(:), allocatable epmu_gt
Definition: visc_g_mod.f:13
double precision, dimension(:), allocatable alpha_we_c
Definition: cutcell_mod.f:299
integer north
Definition: param_mod.f:37
double precision, dimension(:), allocatable v_g
Definition: fldvar_mod.f:99
subroutine dif_w_is(DIF, A_M, M)
Definition: dif_w_is.f:12
integer south
Definition: param_mod.f:41
integer, dimension(:), allocatable kp1
Definition: indices_mod.f:52
double precision, dimension(:), allocatable w_g
Definition: fldvar_mod.f:111
double precision, parameter half
Definition: param1_mod.f:28
Definition: run_mod.f:13
double precision, dimension(:), allocatable ayz_w
Definition: geometry_mod.f:236
Definition: param_mod.f:2
logical def_cor
Definition: run_mod.f:103
logical, dimension(:), allocatable cut_w_treatment_at
Definition: cutcell_mod.f:352
double precision, dimension(:), allocatable flux_gt
Definition: mflux_mod.f:17
double precision, dimension(:), allocatable axz_w
Definition: geometry_mod.f:238
double precision, dimension(:), allocatable odz
Definition: geometry_mod.f:118
integer ijkstart3
Definition: compar_mod.f:80
integer west
Definition: param_mod.f:33
double precision, dimension(:), allocatable axy_w
Definition: geometry_mod.f:240
double precision, dimension(:), allocatable theta_w_te
Definition: cutcell_mod.f:287
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 theta_w_be
Definition: cutcell_mod.f:288
double precision, dimension(:), allocatable oneody_n_w
Definition: cutcell_mod.f:325
subroutine store_a_w_gdc(B_M)
Definition: conv_dif_w_g.f:536
integer dimension_m
Definition: param_mod.f:18
integer function funijk3(LI3, LJ3, LK3)
Definition: function3_mod.f:49
logical fpfoi
Definition: run_mod.f:106
integer bottom
Definition: param_mod.f:49
double precision, parameter zero
Definition: param1_mod.f:27