MFIX  2016-1
dif_u_is.f
Go to the documentation of this file.
1 !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvC
2 ! C
3 ! Subroutine: DIF_U_IS C
4 ! Purpose: Remove diffusive fluxes across internal surfaces. C
5 ! (Make user defined internal surfaces non-conducting) C
6 ! C
7 ! Author: M. Syamlal Date: 30-APR-97 C
8 ! C
9 ! C
10 !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^C
11  SUBROUTINE dif_u_is(DIF, A_M, M)
12 
13 ! Modules
14 !---------------------------------------------------------------------//
15  USE param
16  USE geometry, only: do_k
17  USE geometry, only: ody_n, ox_e, odz_t, axz_u, axy_u
18 
19  USE is, only: is_defined, is_plane
20  USE is, only: is_i_w, is_i_e, is_j_s, is_j_n, is_k_t, is_k_b
21 
22  USE fun_avg, only: avg_x_h, avg_y_h, avg_z_h
23 
24  USE functions, only: funijk, jp_of, kp_of
25  USE functions, only: east_of, north_of, top_of
26  USE functions, only: is_on_mype_plus2layers
27 
28  USE compar, only: dead_cell_at
29  USE compar, only: istart2, jstart2, kstart2
30  USE compar, only: iend2, jend2, kend2
31  IMPLICIT NONE
32 
33 ! Dummy arguments
34 !---------------------------------------------------------------------//
35 ! Gamma -- diffusion coefficient
36  DOUBLE PRECISION, INTENT(IN) :: Dif(dimension_3)
37 ! Septadiagonal matrix A_m
38  DOUBLE PRECISION, INTENT(INOUT) :: A_m(dimension_3, -3:3, 0:dimension_m)
39 ! Solids phase
40  INTEGER, INTENT(IN) :: M
41 
42 ! Local variables
43 !---------------------------------------------------------------------//
44 ! Internal surface
45  INTEGER :: L
46 ! Indices
47  INTEGER :: I, J, K, I1, I2, J1, J2, K1, K2, IJK
48  INTEGER :: IJKE, IJKN, IJKT, IJPK, IJKP, IJKNE, IJKTE
49 ! Diffusion parameter
50  DOUBLE PRECISION :: D_f
51 !---------------------------------------------------------------------//
52 
53  DO l = 1, dimension_is
54  IF (is_defined(l)) THEN
55  i1 = is_i_w(l)
56  i2 = is_i_e(l)
57  j1 = is_j_s(l)
58  j2 = is_j_n(l)
59  k1 = is_k_b(l)
60  k2 = is_k_t(l)
61 
62 ! Limit I1, I2 and all to local processor first ghost layer
63  IF(i1.LE.iend2) i1 = max(i1, istart2)
64  IF(j1.LE.jend2) j1 = max(j1, jstart2)
65  IF(k1.LE.kend2) k1 = max(k1, kstart2)
66  IF(i2.GE.istart2) i2 = min(i2, iend2)
67  IF(j2.GE.jstart2) j2 = min(j2, jend2)
68  IF(k2.GE.kstart2) k2 = min(k2, kend2)
69 
70  IF (is_plane(l) == 'N') THEN
71  DO k = k1, k2
72  DO j = j1, j2
73  DO i = i1, i2
74  IF (.NOT.is_on_mype_plus2layers(i,j,k)) cycle
75  IF (dead_cell_at(i,j,k)) cycle ! skip dead cells
76  ijk = funijk(i,j,k)
77  ijke = east_of(ijk)
78  ijkn = north_of(ijk)
79  ijkne = east_of(ijkn)
80  ijpk = jp_of(ijk)
81 
82  d_f = avg_x_h(avg_y_h(dif(ijk),dif(ijkn),j),&
83  avg_y_h(dif(ijke),dif(ijkne),j),i)*&
84  ody_n(j)*axz_u(ijk)
85 
86  a_m(ijk,north,m) = a_m(ijk,north,m) - d_f
87  a_m(ijpk,south,m) = a_m(ijpk,south,m) - d_f
88  ENDDO
89  ENDDO
90  ENDDO
91 
92  ELSEIF (is_plane(l) == 'T') THEN
93  IF (do_k) THEN
94  DO k = k1, k2
95  DO j = j1, j2
96  DO i = i1, i2
97  IF (.NOT.is_on_mype_plus2layers(i,j,k)) cycle
98  IF (dead_cell_at(i,j,k)) cycle ! skip dead cells
99  ijk = funijk(i,j,k)
100  ijke = east_of(ijk)
101  ijkt = top_of(ijk)
102  ijkte = east_of(ijkt)
103  ijkp = kp_of(ijk)
104 
105  d_f = avg_x_h(avg_z_h(dif(ijk),dif(ijkt),k),&
106  avg_z_h(dif(ijke),dif(ijkte),k),i)*&
107  ox_e(i)*odz_t(k)*axy_u(ijk)
108 
109  a_m(ijk,top,m) = a_m(ijk,top,m) - d_f
110  a_m(ijkp,bottom,m) = a_m(ijkp,bottom,m) - d_f
111  ENDDO
112  ENDDO
113  ENDDO
114  ENDIF
115  ENDIF
116 
117  ENDIF ! end if is_defined
118  ENDDO ! end do dimension_is
119 
120 
121  RETURN
122  END SUBROUTINE dif_u_is
123 
integer jend2
Definition: compar_mod.f:80
integer, parameter dimension_is
Definition: param_mod.f:63
double precision, dimension(:), allocatable ox_e
Definition: geometry_mod.f:143
integer dimension_3
Definition: param_mod.f:11
integer, dimension(dimension_is) is_i_w
Definition: is_mod.f:45
integer istart2
Definition: compar_mod.f:80
integer iend2
Definition: compar_mod.f:80
subroutine dif_u_is(DIF, A_M, M)
Definition: dif_u_is.f:12
integer kend2
Definition: compar_mod.f:80
character, dimension(dimension_is) is_plane
Definition: is_mod.f:80
Definition: is_mod.f:11
integer kstart2
Definition: compar_mod.f:80
double precision, dimension(:), allocatable axz_u
Definition: geometry_mod.f:220
double precision, dimension(:), allocatable ody_n
Definition: geometry_mod.f:123
logical, dimension(:,:,:), allocatable dead_cell_at
Definition: compar_mod.f:127
integer, dimension(dimension_is) is_k_b
Definition: is_mod.f:61
integer jstart2
Definition: compar_mod.f:80
integer north
Definition: param_mod.f:37
integer south
Definition: param_mod.f:41
Definition: param_mod.f:2
logical, dimension(dimension_is) is_defined
Definition: is_mod.f:73
logical do_k
Definition: geometry_mod.f:30
integer, dimension(dimension_is) is_j_s
Definition: is_mod.f:53
integer top
Definition: param_mod.f:45
integer, dimension(dimension_is) is_j_n
Definition: is_mod.f:57
integer, dimension(dimension_is) is_i_e
Definition: is_mod.f:49
double precision, dimension(:), allocatable axy_u
Definition: geometry_mod.f:222
integer dimension_m
Definition: param_mod.f:18
double precision, dimension(:), allocatable odz_t
Definition: geometry_mod.f:125
integer bottom
Definition: param_mod.f:49
integer, dimension(dimension_is) is_k_t
Definition: is_mod.f:65