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