File: RELATIVE:/../../../mfix.git/model/des/particles_in_cell.f
1
2
3
4
5
6
7
8
9
10
11
12
13
14 SUBROUTINE PARTICLES_IN_CELL
15
16
17 use discretelement, only: PIP, MAX_PIP
18
19 use discretelement, only: PIJK
20
21 use discretelement, only: PINC, PIC
22
23 use discretelement, only: XE, YN, ZT
24
25 use geometry, only: NO_K
26
27 use tmp_array, only: PARTICLE_COUNT => ARRAY1
28
29 use compar, only: IJKStart3, IJKEnd3
30
31 use compar, only: ISTART3, IEND3
32 use compar, only: JSTART3, JEND3
33 use compar, only: KSTART3, KEND3
34
35 USE geometry, only: IMIN2, IMAX2
36 USE geometry, only: JMIN2, JMAX2
37 USE geometry, only: KMIN2, KMAX2
38
39 use param, only: DIMENSION_I, DIMENSION_J, DIMENSION_K
40
41 use functions, only: FUNIJK
42
43 use discretelement, only: DES_POS_NEW
44 use functions, only: IS_NONEXISTENT, IS_GHOST, IS_ENTERING_GHOST, IS_EXITING_GHOST
45
46 IMPLICIT NONE
47
48
49
50
51 INTEGER L
52
53 INTEGER PC
54
55 INTEGER I, J, K, IJK
56
57 INTEGER:: npic, pos
58
59
60
61 (:) = 0
62
63
64
65
66
67
68 DO L = 1, MAX_PIP
69
70 IF(IS_NONEXISTENT(L)) CYCLE
71
72 I = PIJK(L,1)
73 IF(I <= ISTART3 .OR. I >= IEND3) THEN
74 CALL PIC_SEARCH(I, DES_POS_NEW(1,L), XE, &
75 DIMENSION_I, IMIN2, IMAX2)
76 ELSE
77 IF((DES_POS_NEW(1,L) >= XE(I-1)) .AND. &
78 (DES_POS_NEW(1,L) < XE(I))) THEN
79 I = I
80 ELSEIF((DES_POS_NEW(1,L) >= XE(I)) .AND. &
81 (DES_POS_NEW(1,L) < XE(I+1))) THEN
82 I = I+1
83 ELSEIF((DES_POS_NEW(1,L) >= XE(I-2)) .AND. &
84 (DES_POS_NEW(1,L) < XE(I-1))) THEN
85 I = I-1
86 ELSE
87 CALL PIC_SEARCH(I, DES_POS_NEW(1,L), XE, &
88 DIMENSION_I, IMIN2, IMAX2)
89 ENDIF
90 ENDIF
91
92 J = PIJK(L,2)
93 IF(J <= JSTART3 .OR. J >= JEND3) THEN
94 CALL PIC_SEARCH(J, DES_POS_NEW(2,L), YN, &
95 DIMENSION_J, JMIN2, JMAX2)
96 ELSE
97 IF((DES_POS_NEW(2,L) >= YN(J-1)) .AND. &
98 (DES_POS_NEW(2,L) < YN(J))) THEN
99 J = J
100 ELSEIF((DES_POS_NEW(2,L) >= YN(J)) .AND. &
101 (DES_POS_NEW(2,L) < YN(J+1))) THEN
102 J = J+1
103 ELSEIF((DES_POS_NEW(2,L) >= YN(J-2)) .AND. &
104 (DES_POS_NEW(2,L) < YN(J-1)))THEN
105 J = J-1
106 ELSE
107 CALL PIC_SEARCH(J, DES_POS_NEW(2,L), YN, &
108 DIMENSION_J, JMIN2, JMAX2)
109 ENDIF
110 ENDIF
111
112
113 IF(NO_K) THEN
114 K = 1
115 ELSE
116 K = PIJK(L,3)
117 IF(K <= KSTART3 .OR. K >= KEND3) THEN
118 CALL PIC_SEARCH(K, DES_POS_NEW(3,L), ZT, &
119 DIMENSION_K, KMIN2, KMAX2)
120 ELSE
121 IF((DES_POS_NEW(3,L) >= ZT(K-1)) .AND. &
122 (DES_POS_NEW(3,L) < ZT(K))) THEN
123 K = K
124 ELSEIF((DES_POS_NEW(3,L) >= ZT(K)) .AND. &
125 (DES_POS_NEW(3,L) < ZT(K+1))) THEN
126 K = K+1
127 ELSEIF((DES_POS_NEW(3,L) >= ZT(K-2)) .AND. &
128 (DES_POS_NEW(3,L) < ZT(K-1))) THEN
129 K = K-1
130 ELSE
131 CALL PIC_SEARCH(K, DES_POS_NEW(3,L), ZT, &
132 DIMENSION_K, KMIN2, KMAX2)
133 ENDIF
134 ENDIF
135 ENDIF
136
137
138 = FUNIJK(I,J,K)
139
140
141 (L,1) = I
142 PIJK(L,2) = J
143 PIJK(L,3) = K
144 PIJK(L,4) = IJK
145
146
147 IF(.NOT.IS_GHOST(L) .AND. .NOT.IS_ENTERING_GHOST(L) .AND. .NOT.IS_EXITING_GHOST(L)) PINC(IJK) = PINC(IJK) + 1
148
149 ENDDO
150
151
152 CALL CHECK_CELL_MOVEMENT
153
154
155
156
157
158
159
160
161 DO IJK = IJKSTART3, IJKEND3
162
163
164
165 = PINC(IJK)
166 IF (ASSOCIATED(PIC(IJK)%p)) THEN
167 IF (NPIC.NE.SIZE(PIC(IJK)%p)) THEN
168 DEALLOCATE(PIC(IJK)%p)
169 IF (NPIC.GT.0) ALLOCATE(PIC(IJK)%p(NPIC))
170 ENDIF
171 ELSE
172 IF (NPIC.GT.0) ALLOCATE(PIC(IJK)%p(NPIC))
173 ENDIF
174 ENDDO
175
176
177 (:) = 1
178 PC = 1
179 DO L = 1, MAX_PIP
180
181 IF(PC.GT.PIP) exit
182
183 IF(IS_NONEXISTENT(L)) CYCLE
184
185 = PC+1
186
187 IF(IS_GHOST(L) .OR. IS_ENTERING_GHOST(L) .OR. IS_EXITING_GHOST(L)) CYCLE
188 IJK = PIJK(L,4)
189 POS = PARTICLE_COUNT(IJK)
190 PIC(IJK)%P(POS) = L
191 PARTICLE_COUNT(IJK) = PARTICLE_COUNT(IJK) + 1
192 ENDDO
193
194 RETURN
195 END SUBROUTINE PARTICLES_IN_CELL
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211 SUBROUTINE INIT_PARTICLES_IN_CELL
212
213 use discretelement, only: PIJK, PINC
214 USE discretelement, only: DES_POS_NEW
215 USE discretelement, only: MAX_PIP
216 USE discretelement, only: XE, YN, ZT
217 USE functions, only: IS_NONEXISTENT, IS_GHOST, IS_ENTERING_GHOST, IS_EXITING_GHOST
218 use mpi_funs_des, only: des_par_exchange
219
220
221 use param, only: DIMENSION_I, DIMENSION_J, DIMENSION_K
222
223 use mpi_utility
224 use sendrecv
225
226 USE error_manager
227 USE desgrid, only: desgrid_pic
228
229 IMPLICIT NONE
230
231
232
233
234 INTEGER :: L
235
236 INTEGER :: I, J, K, IJK
237
238 CALL INIT_ERR_MSG("INIT_PARTICLES_IN_CELL")
239
240
241 (:) = 0
242
243
244 CALL DESGRID_PIC(.TRUE.)
245
246
247 CALL DES_PAR_EXCHANGE
248
249
250
251
252
253
254 DO L = 1, MAX_PIP
255
256 IF(IS_NONEXISTENT(L)) CYCLE
257
258
259
260
261 CALL PIC_SEARCH(I, DES_POS_NEW(1,L), XE, &
262 DIMENSION_I, IMIN2, IMAX2)
263 PIJK(L,1) = I
264
265 CALL PIC_SEARCH(J, DES_POS_NEW(2,L), YN, &
266 DIMENSION_J, JMIN2, JMAX2)
267 PIJK(L,2) = J
268
269 IF(NO_K) THEN
270 K=1
271 PIJK(L,3) = 1
272 ELSE
273 CALL PIC_SEARCH(K, DES_POS_NEW(3,L), ZT, &
274 DIMENSION_K, KMIN2, KMAX2)
275 PIJK(L,3) = K
276 ENDIF
277
278
279 = FUNIJK(I,J,K)
280 PIJK(L,4) = IJK
281
282
283 IF(.NOT.IS_GHOST(L) .AND. .NOT.IS_ENTERING_GHOST(L) .AND. .NOT.IS_EXITING_GHOST(L)) PINC(IJK) = PINC(IJK) + 1
284 ENDDO
285
286
287 CALL DESGRID_PIC(.TRUE.)
288
289
290
291 CALL DES_PAR_EXCHANGE
292
293 CALL FINL_ERR_MSG
294
295 RETURN
296 END SUBROUTINE INIT_PARTICLES_IN_CELL
297
298
299
300
301
302
303
304
305
306 SUBROUTINE PIC_SEARCH(IDX, lPOS, ENT_POS, lDIMN, lSTART, lEND)
307
308 IMPLICIT NONE
309
310
311
312
313 INTEGER, INTENT(OUT) :: IDX
314
315 DOUBLE PRECISION, INTENT(IN) :: lPOS
316
317 INTEGER, INTENT(IN) :: lDIMN
318
319 DOUBLE PRECISION, INTENT(IN) :: ENT_POS(0:lDIMN)
320
321 INTEGER, INTENT(IN) :: lSTART, lEND
322
323 DO IDX = lSTART,lEND
324 IF(lPOS >= ENT_POS(IDX-1) .AND. lPOS < ENT_POS(IDX)) EXIT
325 ENDDO
326
327 RETURN
328 END SUBROUTINE PIC_SEARCH
329