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