30 INTEGER :: WDIR, IDIM, IPCOUNT, LAST_EMPTY_SPOT, NEW_SPOT
31 INTEGER :: BCV, BCV_I, L, LC, PIP_ADD_COUNT, IPROC
32 INTEGER :: IFLUID, JFLUID, KFLUID, IJK, M
33 DOUBLE PRECISION :: CORD_START(3), DOML(3),WALL_NORM(3)
34 DOUBLE PRECISION :: AREA_INFLOW, VEL_INFLOW(dimn), STAT_WT
36 LOGICAL :: DELETE_PART
40 DOUBLE PRECISION :: VEL_NORM_MAG, VOL_INFLOW, VOL_IJK
43 LOGICAL :: CONST_NPC, CONST_STATWT
45 DOUBLE PRECISION,
DIMENSION(:),
ALLOCATABLE :: RANDPOS
46 INTEGER :: CNP_CELL_COUNT
47 DOUBLE PRECISION :: RNP_CELL_COUNT
49 integer,
dimension(0:numpes-1) :: add_count_all
51 LOGICAL,
parameter :: setDBG = .true.
56 type(ty_spotlist),
pointer :: next => null()
59 type(ty_spotlist),
pointer :: &
60 cur_spotlist => null(), &
61 prev_spotlist => null(), &
62 temp_spotlist => null()
68 dflag = (dmp_log .AND. setdbg)
72 ALLOCATE(cur_spotlist); cur_spotlist%spot = -1
82 wdir = wdir + abs(wall_norm(idim))*idim
88 IF(.NOT.fluid_at(ijk)) cycle
113 DO m = 1, des_mmax+
mmax 118 vel_inflow(1) =
bc_u_s(bcv, m)
119 vel_inflow(2) =
bc_v_s(bcv, m)
120 vel_inflow(3) =
bc_w_s(bcv, m)
122 vel_norm_mag = abs(dot_product(vel_inflow(1:dimn), wall_norm
132 IF(eps_inflow(m).GT.
zero) &
135 ELSEIF(const_statwt)
THEN 136 comp_parts(m) = real_parts(m)/ &
153 stat_wt = rnp_cell_count/
REAL(cnp_cell_count)
154 ALLOCATE(randpos(cnp_cell_count*dimn))
157 DO ipcount = 1, cnp_cell_count
162 des_pos_old( new_spot,1:dimn) = cord_start(1:dimn)
189 (des_pos_new( new_spot,1:dimn), &
192 IF(.NOT.delete_part)
THEN 195 pip_add_count = pip_add_count + 1
196 CALL set_normal(new_spot)
198 ALLOCATE(temp_spotlist)
199 temp_spotlist%spot = new_spot
200 temp_spotlist%next => cur_spotlist
201 cur_spotlist => temp_spotlist
202 nullify(temp_spotlist)
205 CALL set_nonexistent(new_spot)
206 last_empty_spot = new_spot - 1
225 add_count_all(mype) = pip_add_count
227 lglobal_id = imax_global_id + sum(add_count_all(0:mype-1))
229 do l = 1,pip_add_count
230 lglobal_id = lglobal_id + 1
231 iglobal_id(cur_spotlist%spot)= lglobal_id
232 prev_spotlist=> cur_spotlist
233 cur_spotlist => cur_spotlist%next
234 deallocate(prev_spotlist)
236 deallocate(cur_spotlist)
237 imax_global_id = imax_global_id + sum(add_count_all(0:numpes-1))
241 IF(sum(add_count_all(:)).GT.0)
THEN 242 WRITE(
err_msg,
'(/,2x,A,2x,i10)') &
243 'TOTAL NUMBER OF PARCELS ADDED GLOBALLY = ',&
244 sum(add_count_all(:))
248 DO iproc = 0, numpes-1
249 IF(dmp_log)
WRITE(unit_log,
'(/,A,i4,2x,A,2x,i5)') &
250 'PARCELS ADDED ON PROC:', iproc,&
251 ' EQUAL TO', add_count_all(iproc)
276 USE discretelement
, only: max_pip
282 INTEGER,
INTENT(INOUT) :: LAST_INDEX
283 INTEGER,
INTENT(OUT) :: EMPTY_SPOT
287 LOGICAL :: SPOT_FOUND
293 IF(last_index.EQ.max_pip)
THEN 301 DO ll = last_index+1, max_pip
303 if(is_nonexistent(ll))
THEN 311 IF(.NOT.spot_found)
THEN 317 &
'ERROR IN PIC_FIND_EMPTY_SPOT', /5x, &
318 &
'NO MORE EMPTY SPOT IN THE PARTICLE ARRAY TO ADD A NEW PARTICLE' 319 'TERMINAL ERROR: STOPPING')
322 &
'ERROR IN PIC_FIND_EMPTY_SPOT', /5x, &
323 &
'COULD NOT FIND A SPOT FOR ADDING NEW PARTICLE',/5x, &
324 &
'INCREASE THE SIZE OF THE INITIAL ARRAYS', 5x, &
325 &
'TERMINAL ERROR: STOPPING')
352 INTEGER,
INTENT(IN) :: LL
356 DOUBLE PRECISION :: XPOS, YPOS, ZPOS
363 xpos = des_pos_new(ll,1)
364 ypos = des_pos_new(ll,2)
365 IF (dimn .EQ. 3)
THEN 366 zpos = des_pos_new(ll,3)
369 IF(xpos >= xe(i-1) .AND. xpos < xe(i))
THEN 371 ELSEIF(xpos >= xe(i))
THEN 377 IF(ypos >= yn(j-1) .AND. ypos < yn(j))
THEN 379 ELSEIF(ypos >= yn(j))
THEN 388 IF(zpos >= zt(k-1) .AND. zpos < zt(k))
THEN 390 ELSEIF(zpos >= zt(k))
THEN 401 IF(i.EQ.iend1+1)
then 402 IF(xpos>=xe(iend1-1) .AND. xpos<=xe(iend1)) pijk(ll,1) = iend1
405 IF(j.EQ.jend1+1)
then 406 IF(ypos>=yn(jend1-1) .AND. ypos<=yn(jend1)) pijk(ll,2) = jend1
409 IF(dimn.EQ.3.AND.k.EQ.kend1+1)
THEN 410 IF(zpos>=zt(kend1-1) .AND. zpos<=zt(kend1)) pijk(ll,3) = kend1
413 pijk(ll,4) = funijk(pijk(ll,1), pijk(ll,2),pijk(ll,3))
double precision, dimension(dim_m) d_p0
subroutine pic_find_empty_spot(LAST_INDEX, EMPTY_SPOT)
integer, dimension(:), allocatable pic_bcmi_ijkstart
double precision, dimension(dimension_bc, dim_m) bc_w_s
double precision, dimension(:,:), allocatable pic_bcmi_cnp
double precision, dimension(0:dim_j) dy
logical, dimension(:), allocatable pic_bcmi_incl_cutcell
integer, dimension(:), allocatable pic_bcmi_ijk
character(len=3), dimension(dim_m) solids_model
double precision, dimension(0:dim_k) dz
integer, dimension(dimension_bc, dim_m) bc_pic_mi_const_npc
subroutine pic_find_new_cell(LL)
subroutine check_if_parcel_overlaps_stl(POS, OVERLAP_EXISTS)
subroutine init_err_msg(CALLER)
integer, dimension(:,:), allocatable pic_bcmi_normdir
double precision, dimension(0:dim_i) dx
double precision, parameter half
double precision, dimension(dimension_bc, dim_m) bc_v_s
subroutine mass_inflow_pic
double precision, dimension(dimension_bc, dim_m) bc_pic_mi_const_statwt
double precision, dimension(dimension_bc, dim_m) bc_u_s
integer, dimension(:), allocatable pic_bcmi_ijkend
character(len=line_length), dimension(line_count) err_msg
double precision, dimension(dim_m) ro_s0
subroutine, public uni_rno(Y)
double precision, parameter pi
integer, dimension(:,:), allocatable pic_bcmi_offset
double precision, dimension(:), allocatable des_stat_wt
logical pic_report_seeding_stats
double precision, dimension(:,:), allocatable pic_bcmi_rnp
double precision, parameter zero
subroutine flush_err_msg(DEBUG, HEADER, FOOTER, ABORT, LOG, CALL_TREE)
double precision, dimension(dimension_bc, dim_m) bc_rop_s
integer, dimension(dimension_bc) pic_bcmi_map