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