MFIX  2016-1
source_phi.f
Go to the documentation of this file.
1 !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvC
2 ! C
3 ! Subroutine: SOURCE_phi C
4 ! Purpose: Determine source terms for phi eq. The terms C
5 ! appear in the center coefficient and RHS vector. The center C
6 ! coefficient and source vector are negative. The off-diagonal C
7 ! coefficients are positive. S_p must be positive. C
8 ! C
9 ! Note: This routine is now restricted to Non-Negative scalers when C
10 ! using deferred correction. C
11 ! C
12 ! C
13 ! Author: M. Syamlal Date: 30-APR-97 C
14 ! Reviewer: Date: C
15 ! C
16 ! C
17 ! Literature/Document References: C
18 ! C
19 ! Variables referenced: C
20 ! Variables modified: C
21 ! Local variables: C
22 ! C
23 !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^C
24 
25  SUBROUTINE source_phi(S_P, S_C, EP, PHI, M, A_M, B_M)
26 
27 !-----------------------------------------------
28 ! Modules
29 !-----------------------------------------------
30  USE param
31  USE param1
32  USE parallel
33  USE scales
34  USE physprop
35  USE fldvar
36  USE visc_s
37  USE rxns
38  USE run
39  USE toleranc
40  USE geometry
41  USE indices
42  USE is
43  USE tau_s
44  USE compar
45  USE fun_avg
46  USE functions
47  IMPLICIT NONE
48 !-----------------------------------------------
49 ! Dummy Arguments
50 !-----------------------------------------------
51 ! Source term on LHS. Must be positive.
52  DOUBLE PRECISION, INTENT(IN) :: S_p(dimension_3)
53 ! Source term on RHS
54  DOUBLE PRECISION, INTENT(IN) :: S_C(dimension_3)
55 ! Phase volume fraction
56  DOUBLE PRECISION, INTENT(IN) :: EP(dimension_3)
57 ! Phi
58  DOUBLE PRECISION, INTENT(IN) :: Phi(dimension_3)
59 ! phase index
60  INTEGER, INTENT(IN) :: M
61 ! Septadiagonal matrix A_m
62  DOUBLE PRECISION, INTENT(INOUT) :: A_m(dimension_3, -3:3, 0:dimension_m)
63 ! Vector b_m
64  DOUBLE PRECISION, INTENT(INOUT) :: B_m(dimension_3, 0:dimension_m)
65 !-----------------------------------------------
66 ! Local variables
67 !-----------------------------------------------
68 ! Indices
69  INTEGER :: IJK, IMJK, IJMK, IJKM
70 !-----------------------------------------------
71 
72  DO ijk = ijkstart3, ijkend3
73 
74  IF (fluid_at(ijk)) THEN
75 
76 ! dilute flow
77  IF (ep(ijk) <= dil_ep_s) THEN
78  a_m(ijk,east,m) = zero
79  a_m(ijk,west,m) = zero
80  a_m(ijk,north,m) = zero
81  a_m(ijk,south,m) = zero
82  a_m(ijk,top,m) = zero
83  a_m(ijk,bottom,m) = zero
84  a_m(ijk,0,m) = -one
85  b_m(ijk,m) = zero
86 
87 ! use the average boundary cell values to compute phi (sof, Aug 23 2005)
88  imjk = im_of(ijk)
89  ijmk = jm_of(ijk)
90  ijkm = km_of(ijk)
91  IF (ep(west_of(ijk)) > dil_ep_s .AND. &
92  .NOT.is_at_e(imjk)) a_m(ijk,west,m) = one
93  IF (ep(east_of(ijk)) > dil_ep_s .AND. &
94  .NOT.is_at_e(ijk)) a_m(ijk,east,m) = one
95  IF (ep(south_of(ijk)) > dil_ep_s .AND. &
96  .NOT.is_at_n(ijmk)) a_m(ijk,south,m) = one
97  IF (ep(north_of(ijk)) > dil_ep_s .AND. &
98  .NOT.is_at_n(ijk)) a_m(ijk,north,m) = one
99  IF(.NOT. no_k) THEN
100  IF (ep(bottom_of(ijk)) > dil_ep_s .AND. &
101  .NOT.is_at_t(ijkm)) a_m(ijk,bottom,m) = one
102  IF (ep(top_of(ijk)) > dil_ep_s .AND. &
103  .NOT.is_at_t(ijk)) a_m(ijk,top,m) = one
104  ENDIF
105 
106  IF((a_m(ijk,west,m)+a_m(ijk,east,m)+&
107  a_m(ijk,south,m)+a_m(ijk,north,m)+ &
108  a_m(ijk,bottom,m)+a_m(ijk,top,m)) == zero) THEN
109  b_m(ijk,m) = -phi(ijk)
110  ELSE
111  a_m(ijk,0,m) = -(a_m(ijk,east,m) + a_m(ijk,west,m) +&
112  a_m(ijk,north,m) + a_m(ijk,south,m) + &
113  a_m(ijk,top,m)+a_m(ijk,bottom,m))
114  ENDIF
115 
116 ! Normal case
117  ELSE
118 
119 ! Collect the terms
120  a_m(ijk,0,m) = -(a_m(ijk,east,m)+a_m(ijk,west,m)+&
121  a_m(ijk,north,m)+a_m(ijk,south,m)+&
122  a_m(ijk,top,m)+a_m(ijk,bottom,m)+s_p(ijk))
123 
124 ! B_m and A_m are corrected in case deferred corrections computes B_m > S_c
125 ! see CONV_DIF_PHI_DC.
126  IF(b_m(ijk,m) < s_c(ijk) .OR. phi(ijk) == zero) THEN
127  b_m(ijk,m) = -s_c(ijk)+b_m(ijk,m)
128  ELSE ! disable ELSE statememt if PHI can be negative
129  a_m(ijk,0,m) = a_m(ijk,0,m) - b_m(ijk,m)/phi(ijk)
130  b_m(ijk,m) = -s_c(ijk)
131  ENDIF
132 
133  ENDIF ! end if/else (ep_g(ijk)<=dil_ep_s)
134  ENDIF ! end if (fluid_at(ijk))
135  ENDDO ! end do (ijk=ijkstart3,ijkend3)
136 
137 
138  RETURN
139  END SUBROUTINE source_phi
140 
141 
142 
143 !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvC
144 ! C
145 ! Subroutine: POINT_SOURCE_PHI C
146 ! C
147 ! Purpose: Adds point sources to the scalar equations. C
148 ! C
149 ! Author: J. Musser Date: 10-JUN-13 C
150 ! Reviewer: Date: C
151 ! C
152 !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^C
153  SUBROUTINE point_source_phi(PHI, PS_PHI, PS_FLOW, &
154  m, a_m, b_m)
156  use compar
157  use geometry
158  use indices
159  use physprop
160  use ps
161  use run
162 
163 ! To be removed upon complete integration of point source routines.
164  use bc
165  use usr
166  use functions
167  use param, only: dimension_3, dimension_m
168  use param1, only: one, small_number
169 
170  IMPLICIT NONE
171 !-----------------------------------------------
172 ! Dummy arguments
173 !-----------------------------------------------
174 
175 ! Vector b_m
176  DOUBLE PRECISION, INTENT(IN) :: PHI(dimension_3)
177 
178 
179 ! maximum term in b_m expression
180  DOUBLE PRECISION, INTENT(IN) :: PS_PHI(dimension_bc)
181 
182 ! maximum term in b_m expression
183  DOUBLE PRECISION, INTENT(IN) :: PS_FLOW(dimension_bc)
184 
185  INTEGER, intent(in) :: M
186 
187 ! Septadiagonal matrix A_m
188  DOUBLE PRECISION, INTENT(INOUT) :: A_m(dimension_3, -3:3, 0:dimension_m)
189 
190 ! Vector b_m
191  DOUBLE PRECISION, intent(INOUT) :: B_M(dimension_3, 0:dimension_m)
192 
193 !-----------------------------------------------
194 ! Local Variables
195 !-----------------------------------------------
196 
197 ! Indices
198  INTEGER :: IJK, I, J, K
199  INTEGER :: PSV
200 
201 ! terms of bm expression
202  DOUBLE PRECISION pSource
203 
204 !-----------------------------------------------
205 
206  psv_lp: do psv = 1, dimension_ps
207 
208  if(.NOT.ps_defined(psv)) cycle psv_lp
209  if(abs(ps_flow(psv)) < small_number) cycle psv_lp
210 
211  do k = ps_k_b(psv), ps_k_t(psv)
212  do j = ps_j_s(psv), ps_j_n(psv)
213  do i = ps_i_w(psv), ps_i_e(psv)
214 
215  if(.NOT.is_on_mype_plus2layers(i,j,k)) cycle
216  IF (dead_cell_at(i,j,k)) cycle ! skip dead cells
217 
218  ijk = funijk(i,j,k)
219  if(.NOT.fluid_at(ijk)) cycle
220 
221  if(a_m(ijk,0,m) == -one .AND. b_m(ijk,m) == -phi(ijk)) then
222  b_m(ijk,m) = -ps_phi(psv)
223  else
224 
225 ! Calculate the mass flow rate for this cell. (mass/time)
226  psource = ps_flow(psv) * (vol(ijk)/ps_volume(psv))
227 
228  a_m(ijk,0,m) = a_m(ijk,0,m) - psource
229  b_m(ijk,m) = b_m(ijk,m) - ps_phi(psv) * psource
230 
231  endif
232 
233  enddo
234  enddo
235  enddo
236 
237  enddo psv_lp
238 
239  RETURN
240  END SUBROUTINE point_source_phi
integer, dimension(dimension_ps) ps_i_w
Definition: ps_mod.f:40
integer ijkend3
Definition: compar_mod.f:80
double precision, parameter one
Definition: param1_mod.f:29
integer dimension_3
Definition: param_mod.f:11
Definition: rxns_mod.f:1
Definition: tau_s_mod.f:1
integer, dimension(dimension_ps) ps_j_n
Definition: ps_mod.f:43
integer east
Definition: param_mod.f:29
logical, dimension(dimension_ps) ps_defined
Definition: ps_mod.f:29
Definition: is_mod.f:11
double precision, dimension(dimension_ps) ps_volume
Definition: ps_mod.f:84
integer, dimension(dimension_ps) ps_k_b
Definition: ps_mod.f:44
logical, dimension(:,:,:), allocatable dead_cell_at
Definition: compar_mod.f:127
double precision, parameter small_number
Definition: param1_mod.f:24
integer north
Definition: param_mod.f:37
integer south
Definition: param_mod.f:41
integer, dimension(dimension_ps) ps_k_t
Definition: ps_mod.f:45
Definition: run_mod.f:13
Definition: param_mod.f:2
double precision, parameter dil_ep_s
Definition: toleranc_mod.f:24
Definition: usr_mod.f:1
logical no_k
Definition: geometry_mod.f:28
integer ijkstart3
Definition: compar_mod.f:80
integer west
Definition: param_mod.f:33
subroutine point_source_phi(PHI, PS_PHI, PS_FLOW, M, A_M, B_M)
Definition: source_phi.f:155
integer top
Definition: param_mod.f:45
Definition: ps_mod.f:22
subroutine source_phi(S_P, S_C, EP, PHI, M, A_M, B_M)
Definition: source_phi.f:26
integer, dimension(dimension_ps) ps_j_s
Definition: ps_mod.f:42
double precision, dimension(:), allocatable vol
Definition: geometry_mod.f:212
integer dimension_m
Definition: param_mod.f:18
integer, dimension(dimension_ps) ps_i_e
Definition: ps_mod.f:41
integer bottom
Definition: param_mod.f:49
double precision, parameter zero
Definition: param1_mod.f:27
Definition: bc_mod.f:23