MFIX  2016-1
interpolate_pic.f
Go to the documentation of this file.
1 !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv!
2 ! Subroutine: CALC_PS_GRAD_PIC !
3 ! Author: R. Garg !
4 ! !
5 ! Purpose: !
6 !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^!
7  SUBROUTINE interpolate_pic
8 
11 
12  IMPLICIT NONE
13 
14  SELECT CASE(des_interp_scheme_enum)
16  CASE DEFAULT; CALL interpolate_pic1
17  END SELECT
18 
19  RETURN
20  END SUBROUTINE interpolate_pic
21 
22 
23 
24 !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv!
25 ! Subroutine: INTERPOLATE_PIC_NONE !
26 ! Author: R. Garg !
27 ! !
28 ! Purpose: !
29 !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^!
30  SUBROUTINE interpolate_pic1
31 
32  use discretelement, only: max_pip, pijk
33  USE geometry, only: do_k
34  use fldvar, only: ep_g, u_s, v_s, w_s
35  use functions, only: fluid_at
36  use functions, only: is_nonexistent
37  use mfix_pic, only: avgvel => avgsolvel_p
38  use mfix_pic, only: ps_grad, ps_force_pic
39  use mfix_pic, only: epg_p
40 ! Flag to use interpolation
42 ! Interpolation cells and weights
44  use physprop, only: mmax
45 
46  implicit none
47 
48 ! Local Variables
49 !---------------------------------------------------------------------//
50 ! Interpolation weight
51  DOUBLE PRECISION :: WEIGHT
52 ! temporary variables used to calculate pressure at scalar cell edge
53  INTEGER :: IJK, NP, LC
54 ! Loop bound for filter
55  INTEGER :: LP_BND
56 !......................................................................!
57 
58 ! Loop bounds for interpolation.
59  lp_bnd = merge(27,9,do_k)
60 
61 
62  DO np=1,max_pip
63 
64 ! Skip parcels that don't exist or are in a non-fluid cell.
65  IF(is_nonexistent(np) .OR. .NOT.fluid_at(pijk(np,4))) THEN
66  avgvel(:,np) = 0.0d0
67  ps_grad(:,np) = 0.0d0
68  epg_p(np) = 1.0d0
69 
70 ! Interpolated solids pressure and average solids velocity.
71  ELSEIF(des_interp_on) THEN
72  avgvel(:,np) = 0.0d0
73  ps_grad(:,np) = 0.0d0
74  epg_p(np) = 0.0d0
75  DO lc=1,lp_bnd
76  ijk = filter_cell(lc,np)
77  weight = filter_weight(lc,np)
78 ! Gas phase velocity.
79  avgvel(1,np) = avgvel(1,np) + u_s(ijk,mmax+1)*weight
80  avgvel(2,np) = avgvel(2,np) + v_s(ijk,mmax+1)*weight
81  avgvel(3,np) = avgvel(3,np) + w_s(ijk,mmax+1)*weight
82 ! Particle normal stress.
83  ps_grad(:,np) = ps_grad(:,np)+ps_force_pic(:,ijk)*weight
84 ! TO BE REMOVED
85  epg_p(np) = epg_p(np) + ep_g(ijk)*weight
86  ENDDO
87 
88 ! Centroid method.
89  ELSE
90  ijk = pijk(np,4)
91 ! Gas phase velocity.
92  avgvel(1,np) = u_s(ijk,mmax+1)
93  avgvel(2,np) = v_s(ijk,mmax+1)
94  avgvel(3,np) = w_s(ijk,mmax+1)
95 ! Particle normal stress.
96  ps_grad(:,np) = ps_force_pic(:,ijk)
97 ! TO BE REMOVED
98  epg_p(np) = ep_g(ijk)
99  ENDIF
100  ENDDO
101 
102  RETURN
103  END SUBROUTINE interpolate_pic1
104 
105 
106 !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv!
107 ! Subroutine: CALC_PS_GRAD_PIC !
108 ! Author: R. Garg !
109 ! !
110 ! Purpose: !
111 !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^!
112  SUBROUTINE interpolate_pic0
114  USE bc
115  USE compar
116  USE constant
117  USE cutcell
118  USE derived_types, only: pic
119  USE discretelement
120  USE fldvar, only: ep_g, u_g, v_g, w_g
121  USE fun_avg
122  USE functions
123  USE geometry
124  USE indices
125  USE interpolation
126  USE mfix_pic
127  USE parallel
128  USE param
129  USE param1
130  USE physprop
131  USE run
132  USE sendrecv
133 
134  implicit none
135 
136  ! general i, j, k indices
137  INTEGER I, J, K, IJK, IPJK, IJPK, IJKP, IDIM, M
138 
139  ! temporary variables used to calculate pressure at scalar cell edge
140  DOUBLE PRECISION avg_factor, VOL_TOT_VEC(3), VOL_TOT_SCAL
141 
142  integer :: korder, iw,ie,js,jn,kb,ktp, onew, pcell(3), cur_ijk, NP, nindx
143 
144  integer :: ii,jj,kk, ipjpk, ijpkp, ipjkp, ipjpkp
145 
146  double precision :: vol_ijk, vol_ipjk, vol_ijpk, vol_ipjpk
147  double precision :: vol_ijkp, vol_ipjkp, vol_ijpkp, vol_ipjpkp
148 
149 
151 
152  korder = merge( 1, 2, no_k) !1+(DIMN-2)
153 
154 ! avg_factor=0.25 (in 3D) or =0.5 (in 2D)
155  !avg_factor = 0.25d0*(dimn-2) + 0.5d0*(3-dimn)
156  avg_factor = merge(0.5d0, 0.25d0, no_k)
157 
158  do ijk = ijkstart3,ijkend3
159 
160  if(.not.fluid_at(ijk) .or. pinc(ijk).eq.0) cycle
161  i = i_of(ijk)
162  j = j_of(ijk)
163  k = k_of(ijk)
164 
165  pcell(1) = i-1
166  pcell(2) = j-1
167  pcell(3) = merge(1, k-1, no_k) ! =k-1 (in 3d) or =1 (in 2d)
168 
169  CALL set_interpolation_stencil(pcell,iw,ie,js,jn,kb, &
170  ktp,interp_scheme,merge(2,3,no_k),ordernew = onew)
171 
172 ! Compute velocity at grid nodes and set the geometric stencil
173  DO k = 1, merge(1, onew, no_k)! (3-DIMN)*1+(DIMN-2)*ONEW
174  DO j = 1,onew
175  DO i = 1,onew
176 
177  ii = iw + i-1
178  jj = js + j-1
179  kk = kb + k-1
180 
181  cur_ijk = funijk_map_c(ii,jj,kk)
182 
183  ipjk = funijk_map_c(ii+1,jj,kk)
184  ijpk = funijk_map_c(ii,jj+1,kk)
185  ipjpk = funijk_map_c(ii+1,jj+1,kk)
186 
187  vol_ijk = zero
188  vol_ipjk = zero
189  vol_ijpk = zero
190  vol_ipjpk = zero
191 
192  vol_ijkp = zero
193  vol_ipjkp = zero
194  vol_ijpkp = zero
195  vol_ipjpkp = zero
196 
197  IF(fluid_at(cur_ijk)) vol_ijk = vol(cur_ijk)
198  IF(fluid_at(ipjk)) vol_ipjk = vol(ipjk)
199  IF(fluid_at(ijpk)) vol_ijpk = vol(ijpk)
200  IF(fluid_at(ipjpk)) vol_ipjpk = vol(ipjpk)
201 
202  IF(do_k) THEN
203  ijkp = funijk_map_c(ii,jj,kk+1)
204  ijpkp = funijk_map_c(ii,jj+1,kk+1)
205  ipjkp = funijk_map_c(ii+1,jj,kk+1)
206  ipjpkp = funijk_map_c(ii+1,jj+1,kk+1)
207 
208  IF(fluid_at(ijkp)) vol_ijkp = vol(ijkp)
209  IF(fluid_at(ipjkp)) vol_ipjkp = vol(ipjkp)
210  IF(fluid_at(ijpkp)) vol_ijpkp = vol(ijpkp)
211  IF(fluid_at(ipjpkp)) vol_ipjpkp = vol(ipjpkp)
212  ENDIF
213 
214  gstencil(i,j,k,1) = xe(ii)
215  gstencil(i,j,k,2) = yn(jj)
216  gstencil(i,j,k,3) = merge(dz(1), zt(kk), no_k)
217 
218  vol_tot_scal = zero
219 
220  vol_tot_scal = vol_ijk + vol_ipjk + vol_ijpk + vol_ipjpk + &
221  vol_ijkp + vol_ipjkp + vol_ijpkp + vol_ipjpkp
222 
223  vol_tot_vec = zero
224 
225  vol_tot_vec(1) = vol(cur_ijk) + vol(ijpk)
226  vol_tot_vec(2) = vol(cur_ijk) + vol(ipjk)
227 
228  DO m = mmax+1,des_mmax+mmax
229  vel_sol_stencil(i,j,k,1,m) = &
230  pic_u_s(cur_ijk,m)*vol(cur_ijk) + &
231  pic_u_s(ijpk,m)*vol(ijpk)
232 
233  vel_sol_stencil(i,j,k,2,m) = &
234  pic_v_s(cur_ijk,m)*vol(cur_ijk) + &
235  pic_v_s(ipjk,m)*vol(ipjk)
236  ENDDO
237 
238  sstencil(i,j,k) = ep_g(cur_ijk)*vol_ijk + &
239  ep_g(ipjk)*vol_ipjk + ep_g(ijpk)*vol_ijpk + &
240  ep_g(ipjpk)*vol_ipjpk
241 
242  psgradstencil(i,j,k,1) = &
243  ps_force_pic(1,cur_ijk)*vol(cur_ijk) + &
244  ps_force_pic(1,ijpk)*vol(ijpk)
245 
246  psgradstencil(i,j,k,2) = &
247  ps_force_pic(2,cur_ijk)*vol(cur_ijk) + &
248  ps_force_pic(2,ipjk)*vol(ipjk)
249 
250  vstencil(i,j,k,1) = &
251  u_g(cur_ijk)*vol(cur_ijk) + u_g(ijpk)*vol(ijpk)
252 
253  vstencil(i,j,k,2) = &
254  v_g(cur_ijk)*vol(cur_ijk) + v_g(ipjk)*vol(ipjk)
255 
256  IF(do_k) THEN
257  vol_tot_vec(1) = vol_tot_vec(1) + vol(ijkp) + vol(ijpkp)
258  vol_tot_vec(2) = vol_tot_vec(2) + vol(ijkp) + vol(ipjkp)
259  vol_tot_vec(3) = &
260  vol(cur_ijk) + vol(ipjk) + vol(ijpk) + vol(ipjpk)
261 
262  sstencil(i,j,k) = sstencil(i,j,k) + &
263  ep_g(ijkp)*vol_ijkp + ep_g(ipjkp)*vol_ipjkp + &
264  ep_g(ijpkp)*vol_ijpkp + ep_g(ipjpkp)*vol_ipjpkp
265 
266  psgradstencil(i,j,k,1) = psgradstencil(i,j,k,1) + &
267  ps_force_pic(1,ijkp)*vol(ijkp) + &
268  ps_force_pic(1,ijpkp)*vol(ijpkp)
269 
270  psgradstencil(i,j,k,2) = psgradstencil(i,j,k,2) + &
271  ps_force_pic(2,ijkp)*vol(ijkp) + &
272  ps_force_pic(2,ipjkp)*vol(ipjkp)
273 
274  psgradstencil(i,j,k,3) = &
275  ps_force_pic(3,cur_ijk)*vol(cur_ijk)+ &
276  ps_force_pic(3,ijpk)*vol(ijpk)+ &
277  ps_force_pic(3,ipjk)*vol(ipjk)+ &
278  ps_force_pic(3,ipjpk)*vol(ipjpk)
279 
280  vstencil(i,j,k,1) = vstencil(i,j,k,1) + &
281  u_g(ijkp)*vol(ijkp) + u_g(ijpkp)*vol(ijpkp)
282 
283  vstencil(i,j,k,2) = vstencil(i,j,k,2) + &
284  v_g(ijkp)*vol(ijkp) + v_g(ipjkp)*vol(ipjkp)
285 
286  vstencil(i,j,k,3) = w_g(cur_ijk)*vol(cur_ijk)+&
287  w_g(ijpk)*vol(ijpk) + w_g(ipjk)*vol(ipjk) + &
288  w_g(ipjpk)*vol(ipjpk)
289 
290  DO m = mmax+1, des_mmax+mmax
291  vel_sol_stencil(i,j,k,1,m) = &
292  vel_sol_stencil(i,j,k,1,m) + &
293  pic_u_s(ijkp,m)*vol(ijkp) + &
294  pic_u_s(ijpkp,m)*vol(ijpkp)
295 
296  vel_sol_stencil(i,j,k,2, m) = &
297  vel_sol_stencil(i,j,k,2,m) + &
298  pic_v_s(ijkp,m)*vol(ijkp) +&
299  pic_v_s(ipjkp,m)*vol(ipjkp)
300 
301  vel_sol_stencil(i,j,k,3, m) = &
302  pic_w_s(cur_ijk,m)*vol(cur_ijk) + &
303  pic_w_s(ijpk,m)*vol(ijpk) + &
304  pic_w_s(ipjk,m)*vol(ipjk) + &
305  pic_w_s(ipjpk,m)*vol(ipjpk)
306  ENDDO
307  ELSE
308  psgradstencil(i,j,k,3) = 0.d0
309  vel_sol_stencil(i,j,k,3, mmax+1:des_mmax+mmax) = 0.d0
310  vstencil(i,j,k,3) = 0.d0
311  ENDIF
312 
313 
314 
315 
316  DO idim = 1, merge(2,3,no_k)
317  IF(vol_tot_vec(idim).GT.zero) THEN
318  psgradstencil(i,j,k,idim) = &
319  psgradstencil(i,j,k,idim)/vol_tot_vec(idim)
320 
321  vel_sol_stencil(i,j,k,idim, mmax+1:des_mmax+mmax) = &
322  vel_sol_stencil(i,j,k,idim, mmax+1:des_mmax+mmax)/&
323  vol_tot_vec(idim)
324 
325  vstencil(i,j,k,idim) = &
326  vstencil(i,j,k,idim)/vol_tot_vec(idim)
327  ENDIF
328  ENDDO
329 
330 
331  IF(vol_tot_scal.GT.zero) &
332  sstencil(i,j,k) = sstencil(i,j,k)/vol_tot_scal
333 
334  enddo
335  enddo
336  enddo
337 
338 
339 
340 ! Loop through particles in the cell
341  do nindx = 1,pinc(ijk)
342  np = pic(ijk)%p(nindx)
343  m = pijk(np,5)
344 
345 ! Interpolate particle stress to particle position
346  if(no_k) then !2-D
347  call interpolator(gstencil(1:onew,1:onew,1,1:dimn), &
348  psgradstencil(1:onew,1:onew,1,1:dimn), &
349  des_pos_new(np,1:dimn),ps_grad(1:dimn,np), &
350  onew,interp_scheme,weightp)
351  else !3-D, diff in psgradstencil size
352  call interpolator(gstencil(1:onew,1:onew,1:onew,1:dimn), &
353  psgradstencil(1:onew,1:onew,1:onew,1:dimn), &
354  des_pos_new(np,1:dimn),ps_grad(1:dimn,np), &
355  onew,interp_scheme,weightp)
356  endif
357 
358  do idim = 1, merge(2,3,no_k)
359  avgsolvel_p(idim,np) = array_dot_product( &
360  vel_sol_stencil(:,:,:,idim,m),weightp(:,:,:))
361  ENDDO
362 
363  epg_p(np) = array_dot_product(sstencil(:,:,:),weightp(:,:,:))
364 
365  ENDDO
366  ENDDO
367 
368 
369  END SUBROUTINE interpolate_pic0
double precision, dimension(:,:), allocatable v_s
Definition: fldvar_mod.f:105
integer, dimension(:), allocatable i_of
Definition: indices_mod.f:45
integer ijkend3
Definition: compar_mod.f:80
integer, dimension(:,:), allocatable filter_cell
double precision, dimension(:), allocatable ep_g
Definition: fldvar_mod.f:15
double precision, dimension(:,:), allocatable avgsolvel_p
Definition: mfix_pic_mod.f:28
double precision, dimension(:,:), allocatable ps_grad
Definition: mfix_pic_mod.f:74
integer, parameter des_interp_garg
double precision, dimension(:,:), allocatable w_s
Definition: fldvar_mod.f:117
subroutine interpolate_pic
subroutine, public set_interpolation_stencil(PC, IW, IE, JS, JN, KB, KTP, isch, dimprob, ordernew)
double precision, dimension(:,:), allocatable pic_v_s
Definition: mfix_pic_mod.f:85
double precision, dimension(:,:), allocatable u_s
Definition: fldvar_mod.f:93
integer, dimension(:), allocatable k_of
Definition: indices_mod.f:47
double precision, dimension(:,:), allocatable filter_weight
integer mmax
Definition: physprop_mod.f:19
integer, dimension(:), allocatable j_of
Definition: indices_mod.f:46
double precision, dimension(:), allocatable v_g
Definition: fldvar_mod.f:99
double precision, dimension(:), allocatable w_g
Definition: fldvar_mod.f:111
Definition: run_mod.f:13
double precision, dimension(:,:), allocatable pic_w_s
Definition: mfix_pic_mod.f:87
Definition: param_mod.f:2
logical no_k
Definition: geometry_mod.f:28
integer des_interp_scheme_enum
subroutine interpolate_pic0
subroutine, public set_interpolation_scheme(choice)
logical do_k
Definition: geometry_mod.f:30
integer ijkstart3
Definition: compar_mod.f:80
double precision, dimension(:), allocatable epg_p
Definition: mfix_pic_mod.f:31
double precision, dimension(:), allocatable u_g
Definition: fldvar_mod.f:87
subroutine interpolate_pic1
double precision, dimension(:,:), allocatable pic_u_s
Definition: mfix_pic_mod.f:83
type(iap1), dimension(:), allocatable pic
double precision, dimension(:), allocatable vol
Definition: geometry_mod.f:212
double precision, dimension(:,:), allocatable ps_force_pic
Definition: mfix_pic_mod.f:25
double precision, parameter zero
Definition: param1_mod.f:27
Definition: bc_mod.f:23