File: RELATIVE:/../../../mfix.git/model/des/drag_gs_des0.f
1
2
3
4
5
6
7
8
9
10
11
12
13
14 SUBROUTINE DRAG_GS_DES0
15
16
17
18
19 USE param
20 USE param1
21 USE constant
22 USE physprop
23 USE fldvar
24 USE run
25 USE geometry
26 USE indices
27 USE bc
28 USE compar
29 USE sendrecv
30 USE discretelement
31 USE drag
32 USE interpolation
33 use desmpi
34 USE cutcell
35 USE mfix_pic
36 USE functions
37 IMPLICIT NONE
38
39
40
41
42 INTEGER :: I, J, K, IJK, cur_ijk
43 INTEGER :: II, JJ, KK
44 INTEGER :: IPJK, IJPK, IJKP,&
45 IPJPK, IPJKP, IJPKP, IPJPKP
46
47
48 INTEGER :: IW, IE, JS, JN, KB, KTP
49
50
51 INTEGER, DIMENSION(3) :: PCELL
52
53
54 INTEGER :: ONEW
55
56 INTEGER :: NP, nindx
57
58
59
60 DOUBLE PRECISION :: AVG_FACTOR
61
62
63 DOUBLE PRECISION, DIMENSION(2,2,2,3) :: gst_tmp,vst_tmp
64 DOUBLE PRECISION, DIMENSION(2,2,2) :: weight_ft
65 DOUBLE PRECISION :: velfp(3), desposnew(3)
66 DOUBLE PRECISION :: D_FORCE(3)
67 DOUBLE PRECISION, DIMENSION(3) :: VEL_NEW
68
69
70
71
72
73
74
75 = merge(0.50d0, 0.25d0, NO_K)
76
77
78
79 call set_interpolation_scheme(2)
80
81
82
83
84
85
86
87
88
89
90
91
92
93 DO ijk = ijkstart3,ijkend3
94 if(.not.fluid_at(ijk) .or. pinc(ijk).eq.0) cycle
95 i = i_of(ijk)
96 j = j_of(ijk)
97 k = k_of(ijk)
98
99
100
101
102
103 (1) = i-1
104 pcell(2) = j-1
105 pcell(3) = merge(1, k-1, NO_K)
106
107
108
109 call set_interpolation_stencil(pcell,iw,ie,js,jn,kb,&
110 ktp,interp_scheme,dimn,ordernew = onew)
111
112
113 DO k = 1,merge(1, ONEW, NO_K)
114 DO j = 1,onew
115 DO i = 1,onew
116 ii = iw + i-1
117 jj = js + j-1
118 kk = kb + k-1
119 cur_ijk = funijk_map_c(ii,jj,kk)
120 ipjk = funijk_map_c(ii+1,jj,kk)
121 ijpk = funijk_map_c(ii,jj+1,kk)
122 ipjpk = funijk_map_c(ii+1,jj+1,kk)
123
124 gst_tmp(i,j,k,1) = xe(ii)
125 gst_tmp(i,j,k,2) = yn(jj)
126 gst_tmp(i,j,k,3) = merge(DZ(1), zt(kk), NO_K)
127 vst_tmp(i,j,k,1) = avg_factor*(u_g(cur_ijk)+u_g(ijpk))
128 vst_tmp(i,j,k,2) = avg_factor*(v_g(cur_ijk)+v_g(ipjk))
129
130 if(DO_K) then
131 ijpkp = funijk_map_c(ii,jj+1,kk+1)
132 ipjkp = funijk_map_c(ii+1,jj,kk+1)
133 ipjpkp = funijk_map_c(ii+1,jj+1,kk+1)
134 ijkp = funijk_map_c(ii,jj,kk+1)
135 vst_tmp(i,j,k,1) = vst_tmp(i,j,k,1) + avg_factor*(u_g(ijkp) + u_g(ijpkp))
136 vst_tmp(i,j,k,2) = vst_tmp(i,j,k,2) + avg_factor*(v_g(ijkp) + v_g(ipjkp))
137 vst_tmp(i,j,k,3) = avg_factor*(w_g(cur_ijk)+&
138 w_g(ijpk)+w_g(ipjk)+w_g(ipjpk))
139 else
140 vst_tmp(i,j,k,3) = 0.d0
141 ENDIF
142 ENDDO
143 ENDDO
144 ENDDO
145
146
147 DO nindx = 1,PINC(IJK)
148 NP = PIC(ijk)%p(nindx)
149
150 if(is_nonexistent(np)) cycle
151 if(is_ghost(np).or.is_entering_ghost(np).or.is_exiting_ghost(np)) cycle
152
153 desposnew(:) = des_pos_new(:,np)
154 call DRAG_INTERPOLATION(gst_tmp,vst_tmp,desposnew,velfp,weight_ft)
155
156
157
158
159
160
161
162
163 (:) = DES_VEL_NEW(:,NP)
164 CALL DES_DRAG_GP(NP, VEL_NEW, VELFP, EP_G(IJK))
165
166
167 IF(MPPIC .AND. MPPIC_PDRAG_IMPLICIT) THEN
168
169 (1:3) = F_GP(NP)*(VELFP)
170 ELSE
171
172 (1:3) = F_GP(NP)*(VELFP-VEL_NEW)
173 ENDIF
174
175
176
177 (:3,NP) = FC(:3,NP) + D_FORCE(:3)
178
179 IF(.NOT.MODEL_B) THEN
180
181 (:3,NP) = FC(:3,NP) + P_FORCE(:,IJK)*PVOL(NP)
182 ENDIF
183 ENDDO
184
185 ENDDO
186
187
188 RETURN
189 END SUBROUTINE DRAG_GS_DES0
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205 SUBROUTINE DRAG_GS_GAS0
206
207
208
209
210 USE param
211 USE param1
212 USE constant
213 USE physprop
214 USE fldvar
215 USE run
216 USE geometry
217 USE indices
218 USE bc
219 USE compar
220 USE sendrecv
221 USE discretelement
222 USE drag
223 USE interpolation
224 use desmpi
225 USE cutcell
226 USE mfix_pic
227 USE functions
228 use mpi_node_des, only: des_addnodevalues
229
230 IMPLICIT NONE
231
232
233
234
235 LOGICAL :: FOCUS
236
237 INTEGER :: I, J, K, IJK, cur_ijk
238 INTEGER :: II, JJ, KK
239 INTEGER :: IPJK, IJPK, IJKP, IMJK, IJMK, IJKM,&
240 IPJPK, IPJKP, IJPKP, IPJPKP, &
241 IMJMK, IMJKM, IJMKM, IMJMKM
242
243
244 INTEGER :: IW, IE, JS, JN, KB, KTP
245
246
247 INTEGER, DIMENSION(3) :: PCELL
248
249
250 INTEGER :: ONEW
251
252 INTEGER :: M
253
254 INTEGER :: NP, nindx
255
256 DOUBLE PRECISION :: OVOL
257
258 DOUBLE PRECISION :: VCELL
259
260
261
262 DOUBLE PRECISION :: AVG_FACTOR
263
264 DOUBLE PRECISION :: WTP
265
266 DOUBLE PRECISION, DIMENSION(2,2,2,3) :: gst_tmp,vst_tmp
267 DOUBLE PRECISION, DIMENSION(2,2,2) :: weight_ft
268 DOUBLE PRECISION :: velfp(3), desposnew(3)
269 DOUBLE PRECISION, DIMENSION(3) :: VEL_NEW
270
271
272
273
274
275
276
277
278
279
280
281 = ZERO
282 drag_bm = ZERO
283
284
285 = merge(0.50d0, 0.25d0, NO_K)
286
287
288
289 call set_interpolation_scheme(2)
290
291
292
293
294
295
296
297
298
299
300
301 DO IJK = IJKSTART3,IJKEND3
302 IF(.NOT.FLUID_AT(IJK) .OR. PINC(IJK)==0) cycle
303 i = i_of(ijk)
304 j = j_of(ijk)
305 k = k_of(ijk)
306
307
308
309
310
311 (1) = i-1
312 pcell(2) = j-1
313 pcell(3) = merge(1, k-1, NO_K)
314
315
316
317 call set_interpolation_stencil(pcell,iw,ie,js,jn,kb,&
318 ktp,interp_scheme,dimn,ordernew = onew)
319
320
321 DO k = 1, merge(1, ONEW, NO_K)
322 DO j = 1,onew
323 DO i = 1,onew
324 ii = iw + i-1
325 jj = js + j-1
326 kk = kb + k-1
327 cur_ijk = funijk_map_c(ii,jj,kk)
328 ipjk = funijk_map_c(ii+1,jj,kk)
329 ijpk = funijk_map_c(ii,jj+1,kk)
330 ipjpk = funijk_map_c(ii+1,jj+1,kk)
331 GST_TMP(I,J,K,1) = XE(II)
332 GST_TMP(I,J,K,2) = YN(JJ)
333 GST_TMP(I,J,K,3) = merge(DZ(1), ZT(KK), NO_K)
334 VST_TMP(I,J,K,1) = AVG_FACTOR*(U_G(CUR_IJK)+U_G(IJPK))
335 VST_TMP(I,J,K,2) = AVG_FACTOR*(V_G(CUR_IJK)+V_G(IPJK))
336
337 IF(DO_K) THEN
338 IJPKP = FUNIJK_MAP_C(II,JJ+1,KK+1)
339 IPJKP = FUNIJK_MAP_C(II+1,JJ,KK+1)
340 IPJPKP = FUNIJK_MAP_C(II+1,JJ+1,KK+1)
341 IJKP = FUNIJK_MAP_C(II,JJ,KK+1)
342 VST_TMP(I,J,K,1) = VST_TMP(I,J,K,1) + &
343 AVG_FACTOR*(U_G(IJKP) + U_G(IJPKP))
344
345 VST_TMP(I,J,K,2) = VST_TMP(I,J,K,2) + &
346 AVG_FACTOR*(V_G(IJKP) + V_G(IPJKP))
347
348 VST_TMP(I,J,K,3) = AVG_FACTOR*(W_G(CUR_IJK)+&
349 W_G(IJPK)+W_G(IPJK)+W_G(IPJPK))
350 ELSE
351 VST_TMP(I,J,K,3) = 0.D0
352 ENDIF
353 ENDDO
354 ENDDO
355 ENDDO
356
357
358 DO nindx = 1,PINC(IJK)
359 NP = PIC(ijk)%p(nindx)
360
361 if(is_nonexistent(np)) cycle
362 if(is_ghost(np).or.is_entering_ghost(np).or.is_exiting_ghost(np)) cycle
363 desposnew(:) = des_pos_new(:,np)
364 call DRAG_INTERPOLATION(gst_tmp,vst_tmp,desposnew,velfp,weight_ft)
365
366
367
368
369
370
371
372
373 (:) = DES_VEL_NEW(:,NP)
374 CALL DES_DRAG_GP(NP, VEL_NEW, VELFP, EP_G(IJK))
375
376
377
378
379 = .false.
380 M = pijk(np,5)
381 WTP = ONE
382 IF(MPPIC) WTP = DES_STAT_WT(NP)
383
384 DO k = 1, merge(1, ONEW, NO_K)
385 DO j = 1, onew
386 DO i = 1, onew
387
388 = iw + i-1
389 jj = js + j-1
390 kk = kb + k-1
391
392
393
394 = funijk_map_c(ii, jj, kk)
395
396
397 = des_vol_node(cur_ijk)
398 ovol = one/vcell
399
400
401 (cur_ijk) = drag_am(cur_ijk) + &
402 f_gp(np)*weight_ft(i,j,k)*ovol*wtp
403
404 drag_bm(cur_ijk,1:3) = &
405 drag_bm(cur_ijk,1:3) + &
406 f_gp(np) * vel_new(1:3) * &
407 weight_ft(i,j,k)*ovol*wtp
408
409 ENDDO
410 ENDDO
411 ENDDO
412 ENDDO
413
414 ENDDO
415
416
417
418
419
420
421
422
423 call des_addnodevalues
424
425
426
427
428
429 = merge(0.25d0, 0.125D0, NO_K)
430
431
432
433
434
435 DO ijk = ijkstart3, ijkend3
436 IF(FLUID_AT(IJK)) THEN
437
438 i = i_of(ijk)
439 j = j_of(ijk)
440 k = k_of(ijk)
441 if (i.lt.istart2 .or. i.gt.iend2) cycle
442 if (j.lt.jstart2 .or. j.gt.jend2) cycle
443 if (k.lt.kstart2 .or. k.gt.kend2) cycle
444 imjk = funijk_map_c(i-1,j,k)
445 ijmk = funijk_map_c(i,j-1,k)
446 imjmk = funijk_map_c(i-1,j-1,k)
447
448 f_gds(ijk) = avg_factor*&
449 (drag_am(ijk) + drag_am(ijmk) +&
450 drag_am(imjmk) + drag_am(imjk))
451
452 IF(DO_K) THEN
453 ijkm = funijk_map_c(i,j,k-1)
454 imjkm = funijk_map_c(i-1,j,k-1)
455 ijmkm = funijk_map_c(i,j-1,k-1)
456 imjmkm = funijk_map_c(i-1,j-1,k-1)
457 f_gds(ijk) = f_gds(ijk) + avg_factor*&
458 (drag_am(ijkm) + drag_am(ijmkm) +&
459 drag_am(imjmkm)+drag_am(imjkm) )
460 ENDIF
461 ELSE
462 (IJK) = ZERO
463 ENDIF
464
465 ENDDO
466
467
468 RETURN
469 END SUBROUTINE DRAG_GS_GAS0
470
471
472
473
474
475
476
477
478
479
480 SUBROUTINE DRAG_INTERPOLATION(GSTEN,VSTEN,DESPOS,VELFP,WEIGHTFACTOR)
481
482 use geometry, only: NO_K
483
484 IMPLICIT NONE
485
486
487
488
489 DOUBLE PRECISION, DIMENSION(2,2,2,3), INTENT(IN):: GSTEN
490 DOUBLE PRECISION, DIMENSION(2,2,2,3), INTENT(IN):: VSTEN
491 DOUBLE PRECISION, DIMENSION(3), INTENT(IN):: DESPOS
492 DOUBLE PRECISION, DIMENSION(3), INTENT(OUT) :: VELFP
493 DOUBLE PRECISION, DIMENSION(2,2,2), INTENT(OUT) :: WEIGHTFACTOR
494 INTEGER :: II, JJ, KK
495
496 DOUBLE PRECISION, DIMENSION(2) :: XXVAL, YYVAL, ZZVAL
497 DOUBLE PRECISION :: DXX, DYY, DZZ
498 DOUBLE PRECISION, DIMENSION(3) :: ZETAA
499
500 DXX = GSTEN(2,1,1,1) - GSTEN(1,1,1,1)
501 DYY = GSTEN(1,2,1,2) - GSTEN(1,1,1,2)
502
503 ZETAA(1:2) = DESPOS(1:2) - GSTEN(1,1,1,1:2)
504
505 ZETAA(1) = ZETAA(1)/DXX
506 ZETAA(2) = ZETAA(2)/DYY
507
508 XXVAL(1)=1-ZETAA(1)
509 YYVAL(1)=1-ZETAA(2)
510 XXVAL(2)=ZETAA(1)
511 YYVAL(2)=ZETAA(2)
512
513 VELFP(:) = 0.D0
514
515 IF(NO_K) THEN
516 DO JJ=1,2
517 DO II=1,2
518 WEIGHTFACTOR(II,JJ,1) = XXVAL(II)*YYVAL(JJ)
519 VELFP(1:2) = VELFP(1:2) + VSTEN(II,JJ,1,1:2)*WEIGHTFACTOR(II,JJ,1)
520 ENDDO
521 ENDDO
522 ELSE
523 DZZ = GSTEN(1,1,2,3) - GSTEN(1,1,1,3)
524 ZETAA(3) = DESPOS(3) - GSTEN(1,1,1,3)
525 ZETAA(3) = ZETAA(3)/DZZ
526 ZZVAL(1)=1-ZETAA(3)
527 ZZVAL(2)=ZETAA(3)
528 DO KK=1,2
529 DO JJ=1,2
530 DO II=1,2
531 WEIGHTFACTOR(II,JJ,KK) = XXVAL(II)*YYVAL(JJ)*ZZVAL(KK)
532 VELFP(1:3) = VELFP(1:3) + VSTEN(II,JJ,KK,1:3)*WEIGHTFACTOR(II,JJ,KK)
533 ENDDO
534 ENDDO
535 ENDDO
536 ENDIF
537
538 END SUBROUTINE DRAG_INTERPOLATION
539