File: RELATIVE:/../../../mfix.git/model/des/mass_inflow_dem.f
1
2
3
4
5
6
7
8
9
10 SUBROUTINE MASS_INFLOW_DEM
11
12 use bc
13 use des_allocate
14 use des_bc
15 use discretelement
16 use functions
17
18 use mpi_utility, only: BCAST
19
20 implicit none
21
22 INTEGER :: IP, LS, M, NP, IJK, LC
23 INTEGER :: BCV, BCV_I
24 LOGICAL :: CHECK_FOR_ERRORS, OWNS
25
26
27 INTEGER :: IJKP(3)
28
29 DOUBLE PRECISION :: DIST, POS(3)
30
31 DOUBLE PRECISION :: RAND(3)
32
33 CHECK_FOR_ERRORS = .FALSE.
34
35 DO BCV_I = 1, DEM_BCMI
36 BCV = DEM_BCMI_MAP(BCV_I)
37
38 DO LC=DEM_BCMI_IJKSTART(BCV_I), DEM_BCMI_IJKEND(BCV_I)
39 IJK = DEM_BCMI_IJK(LC)
40
41 DO LS= 1,DG_PIC(IJK)%ISIZE
42 NP = DG_PIC(IJK)%P(LS)
43 IF(IS_EXITING(NP) .or. IS_EXITING_GHOST(NP)) CYCLE
44 SELECT CASE (BC_PLANE(BCV))
45 CASE('N'); DIST = DES_POS_NEW(2,NP) - YN(BC_J_s(BCV))
46 CASE('S'); DIST = YN(BC_J_s(BCV)-1) - DES_POS_NEW(2,NP)
47 CASE('E'); DIST = DES_POS_NEW(1,NP) - XE(BC_I_w(BCV))
48 CASE('W'); DIST = XE(BC_I_w(BCV)-1) - DES_POS_NEW(1,NP)
49 CASE('T'); DIST = DES_POS_NEW(3,NP) - ZT(BC_K_b(BCV))
50 CASE('B'); DIST = ZT(BC_K_b(BCV)-1) - DES_POS_NEW(3,NP)
51 END SELECT
52
53 IF(DIST > DES_RADIUS(NP)) CALL SET_NORMAL(NP)
54 ENDDO
55 ENDDO
56
57
58
59 CALL RANDOM_NUMBER(RAND)
60 CALL BCAST(RAND)
61
62
63 IF(DEM_MI_TIME(BCV_I) > S_TIME) CYCLE
64
65 LS = 1
66
67
68 PLoop: DO IP = 1, PI_COUNT(BCV_I)
69
70
71 = iMAX_GLOBAL_ID + 1
72
73
74 CALL SEED_NEW_PARTICLE(BCV, BCV_I, RAND, M, POS, IJKP, OWNS)
75
76
77 IF(.NOT.OWNS) CYCLE PLoop
78
79
80
81 = PIP + 1
82 CALL PARTICLE_GROW(PIP)
83
84
85 NP_LP: DO NP = LS, MAX_PIP
86 IF(IS_NONEXISTENT(NP)) THEN
87 LS = NP
88 EXIT NP_LP
89 ENDIF
90 ENDDO NP_LP
91
92
93 (LS) = iMAX_GLOBAL_ID
94
95
96 CALL SET_NEW_PARTICLE_PROPS(BCV, M, LS, POS, IJKP)
97
98 ENDDO PLoop
99
100
101 (BCV_I) = S_TIME + PI_FACTOR(BCV_I)*DTSOLID
102
103 = .TRUE.
104 ENDDO
105
106 IF(CHECK_FOR_ERRORS) THEN
107 ENDIF
108
109 RETURN
110 END SUBROUTINE MASS_INFLOW_DEM
111
112
113
114
115
116
117
118
119
120
121
122
123 SUBROUTINE SEED_NEW_PARTICLE(lBCV, lBCV_I, lRAND, lM, lPOS, &
124 lIJKP, lOWNS)
125
126
127
128
129 USE compar
130 USE bc
131 USE des_bc
132 USE desgrid
133 USE discretelement
134 USE funits
135 USE geometry
136 USE param1
137 USE physprop
138 IMPLICIT NONE
139
140
141
142
143 INTEGER, INTENT(IN) :: lBCV, lBCV_I
144
145 DOUBLE PRECISION, INTENT(IN) :: lRAND(3)
146
147 INTEGER, INTENT(OUT) :: lM
148
149 DOUBLE PRECISION, INTENT(OUT) :: lPOS(3)
150
151 INTEGER, INTENT(OUT) :: lIJKP(3)
152
153 LOGICAL, INTENT(OUT) :: lOWNS
154
155
156
157
158
159
160
161 DOUBLE PRECISION RAND1, RAND2
162
163 INTEGER :: VACANCY
164
165 INTEGER :: OCCUPANTS
166
167 INTEGER :: RAND_I
168 INTEGER :: lI, lJ, lK
169
170 DOUBLE PRECISION :: WINDOW
171
172
173 = DEM_MI(lBCV_I)%VACANCY
174 OCCUPANTS = DEM_MI(lBCV_I)%OCCUPANTS
175 DEM_MI(lBCV_I)%VACANCY = MOD(VACANCY,OCCUPANTS) + 1
176
177
178
179
180
181
182
183
184 IF(DEM_MI(lBCV_I)%POLYDISPERSE) THEN
185 RAND_I = ceiling(dble(NUMFRAC_LIMIT)*lRAND(1))
186 lM = DEM_BC_POLY_LAYOUT(lBCV_I, RAND_I)
187 ELSE
188 lM = DEM_BC_POLY_LAYOUT(lBCV_I,1)
189 ENDIF
190
191 WINDOW = DEM_MI(lBCV_I)%WINDOW
192 RAND1 = HALF*DES_D_p0(lM) + (WINDOW - DES_D_p0(lM))*lRAND(1)
193 RAND2 = HALF*DES_D_p0(lM) + (WINDOW - DES_D_p0(lM))*lRAND(2)
194
195
196
197 SELECT CASE(BC_PLANE(lBCV))
198 CASE('N','S')
199
200 lPOS(1) = DEM_MI(lBCV_I)%P(VACANCY) + RAND1
201 lPOS(3) = DEM_MI(lBCV_I)%Q(VACANCY) + RAND2
202 lPOS(2) = DEM_MI(lBCV_I)%OFFSET
203
204 lIJKP(1) = DEM_MI(lBCV_I)%W(VACANCY)
205 lIJKP(3) = DEM_MI(lBCV_I)%H(VACANCY)
206 lIJKP(2) = DEM_MI(lBCV_I)%L
207
208 CASE('E','W')
209
210 lPOS(2) = DEM_MI(lBCV_I)%P(VACANCY) + RAND1
211 lPOS(3) = DEM_MI(lBCV_I)%Q(VACANCY) + RAND2
212 lPOS(1) = DEM_MI(lBCV_I)%OFFSET
213
214 lIJKP(2) = DEM_MI(lBCV_I)%W(VACANCY)
215 lIJKP(3) = DEM_MI(lBCV_I)%H(VACANCY)
216 lIJKP(1) = DEM_MI(lBCV_I)%L
217
218 CASE('T','B')
219
220 lPOS(1) = DEM_MI(lBCV_I)%P(VACANCY) + RAND1
221 lPOS(2) = DEM_MI(lBCV_I)%Q(VACANCY) + RAND2
222 lPOS(3) = DEM_MI(lBCV_I)%OFFSET
223
224 lIJKP(1) = DEM_MI(lBCV_I)%W(VACANCY)
225 lIJKP(2) = DEM_MI(lBCV_I)%H(VACANCY)
226 lIJKP(3) = DEM_MI(lBCV_I)%L
227
228 END SELECT
229
230
231 IF(NO_K) lPOS(3) = ZERO
232
233 lI = IofPOS(lPOS(1))
234 lJ = JofPOS(lPOS(2))
235 lK = KofPOS(lPOS(3))
236
237 lOWNS = ((DG_ISTART <= lI) .AND. (lI <= DG_IEND) .AND. &
238 (DG_JSTART <= lJ) .AND. (lJ <= DG_JEND))
239
240 IF(DO_K) lOWNS = lOWNS .AND. (DG_KSTART<=lK) .AND. (lK<=DG_KEND)
241
242 RETURN
243 END SUBROUTINE SEED_NEW_PARTICLE
244
245
246
247
248
249
250
251
252
253
254 SUBROUTINE SET_NEW_PARTICLE_PROPS(lBCV, lM, lNP, lPOS, lIJKP)
255
256 USE compar
257 USE bc
258 USE des_bc
259 USE discretelement
260 USE funits
261 USE geometry
262 USE param1
263 USE physprop
264 USE des_thermo
265 use des_rxns
266
267 use run, only: ENERGY_EQ
268 use run, only: ANY_SPECIES_EQ
269 use constant, only: PI
270
271 use desgrid
272 use indices
273 use functions
274
275 IMPLICIT NONE
276
277
278
279
280 INTEGER, INTENT(IN) :: lBCV
281
282 INTEGER, INTENT(IN) :: lM
283
284 INTEGER, INTENT(IN) :: lNP
285
286 DOUBLE PRECISION, INTENT(IN) :: lPOS(3)
287
288 INTEGER, INTENT(IN) :: lIJKP(3)
289
290 INTEGER :: lI, lJ, lK
291
292
293 INTEGER :: BC_M
294
295
296 = lM + SMAX
297
298
299 IF (IS_GHOST(lNP)) THEN
300 CALL SET_ENTERING_GHOST(lNP)
301 ELSE
302 CALL SET_ENTERING(lNP)
303 ENDIF
304
305
306 (:,lNP) = lPOS(:)
307 PPOS(:,lNP) = lPOS(:)
308 DES_VEL_NEW(1,lNP) = BC_U_s(lBCV,BC_M)
309 DES_VEL_NEW(2,lNP) = BC_V_s(lBCV,BC_M)
310 DES_VEL_NEW(3,lNP) = BC_W_s(lBCV,BC_M)
311
312
313 IF (DO_OLD) THEN
314 DES_POS_OLD(:,lNP) = lPOS(:)
315 DES_VEL_OLD(:,lNP) = DES_VEL_NEW(:,lNP)
316 OMEGA_OLD(:,lNP) = 0
317 ENDIF
318
319
320 (:,lNP) = 0
321
322
323 IF(PARTICLE_ORIENTATION) ORIENTATION(1:3,lNP) = INIT_ORIENTATION
324
325
326 (lNP) = HALF * DES_D_P0(lM)
327
328
329 (lNP) = DES_RO_S(lM)
330
331
332 (lNP,1:3) = lIJKP(:)
333 PIJK(lNP,4) = FUNIJK(lIJKP(1), lIJKP(2), lIJKP(3))
334
335
336 (lNP,5) = lM
337
338
339 = min(DG_IEND2,max(DG_ISTART2,IOFPOS(DES_POS_NEW(1,lNP))))
340 lJ = min(DG_JEND2,max(DG_JSTART2,JOFPOS(DES_POS_NEW(2,lNP))))
341 IF(NO_K) THEN
342 lK = 1
343 ELSE
344 lK = min(DG_KEND2,max(DG_KSTART2,KOFPOS(DES_POS_NEW(3,lNP))))
345 ENDIF
346
347 (lNP) = DG_FUNIJK(lI,lJ,lK)
348
349
350 (lNP) = (4.0d0/3.0d0) * PI * DES_RADIUS(lNP)**3
351 PMASS(lNP) = PVOL(lNP) * RO_Sol(lNP)
352 OMOI(lNP) = 5.d0 / (2.d0 * PMASS(lNP) * DES_RADIUS(lNP)**2)
353
354
355 IF(DES_EXPLICITLY_COUPLED) DRAG_FC(:,lNP) = ZERO
356
357
358 IF(ANY_SPECIES_EQ .OR. ENERGY_EQ ) THEN
359 DES_T_s_NEW(lNP) = BC_T_s(lBCV,BC_M)
360 DES_T_s_OLD(lNP) = DES_T_s_NEW(lNP)
361 ENDIF
362
363
364 IF((ENERGY_EQ .AND. C_PS0(BC_M)/=UNDEFINED) .OR. ANY_SPECIES_EQ)&
365 DES_X_s(lNP,1:NMAX(BC_M)) = BC_X_s(lBCV,BC_M,1:NMAX(BC_M))
366
367
368 CALL DES_PHYSICAL_PROP(lNP, .FALSE.)
369
370
371 RETURN
372 END SUBROUTINE SET_NEW_PARTICLE_PROPS
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394 SUBROUTINE DES_NEW_PARTICLE_TEST(BCV_I,ppar_rad,ppar_pos,TOUCHING)
395
396 USE compar
397 USE constant
398 USE des_bc
399 USE discretelement
400 USE funits
401 USE geometry
402 USE indices
403 USE param1
404 USE physprop
405 USE functions
406
407 IMPLICIT NONE
408
409
410
411
412 INTEGER, INTENT(IN) :: BCV_I
413 DOUBLE PRECISION, INTENT(IN) :: ppar_pos(DIMN)
414 DOUBLE PRECISION, INTENT(IN) :: ppar_rad
415 LOGICAL, INTENT(INOUT) :: TOUCHING
416
417
418
419
420 INTEGER NP2
421
422 INTEGER NPG, LL
423
424 INTEGER I, J, K, IJK
425
426 integer listart,liend,ljstart,ljend,lkstart,lkend
427
428 DOUBLE PRECISION DISTVEC(DIMN), DIST, R_LM
429
430
431 = .FALSE.
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458 DO k = lkstart,lkend
459 DO j = ljstart,ljend
460 DO i = listart,liend
461
462
463
464 = FUNIJK(I,J,K)
465 IF(ASSOCIATED(PIC(IJK)%P)) THEN
466 NPG = SIZE(PIC(IJK)%P)
467 DO LL = 1, NPG
468 NP2 = PIC(IJK)%P(LL)
469 DISTVEC(:) = ppar_pos(:) - DES_POS_NEW(:,NP2)
470 DIST = DOT_PRODUCT(DISTVEC,DISTVEC)
471 R_LM = ppar_rad + DES_RADIUS(NP2)
472 IF(DIST .LE. R_LM*R_LM) TOUCHING = .TRUE.
473 ENDDO
474 ENDIF
475 ENDDO
476 ENDDO
477 ENDDO
478
479 RETURN
480 END SUBROUTINE DES_NEW_PARTICLE_TEST
481