23 use discretelement
, only: pip, particles
48 IF(.NOT.ic_defined(icv)) cycle
62 1004
FORMAT(/,
'Total number of particles in the system: ',i15)
88 use discretelement
, only: des_radius, ro_sol
90 use discretelement
, only: des_pos_new, des_pos_old
92 use discretelement
, only: des_vel_new, des_vel_old
94 use discretelement
, only: dimn
96 use discretelement
, only: pip
98 use discretelement
, only: des_mmax
100 use discretelement
, only: do_old
102 use discretelement
, only: omega_old, omega_new, pijk
141 use discretelement
, only: max_pip, max_radius, xe, yn, zt
151 INTEGER,
INTENT(IN) :: ICV
156 DOUBLE PRECISION :: xINIT, yINIT, zINIT
158 DOUBLE PRECISION :: lFAC
160 DOUBLE PRECISION :: POS(3), VEL(3)
162 INTEGER :: SEED_X, SEED_Y, SEED_Z
164 INTEGER :: M, MM, I, J, K, IJK, LB, UB
166 INTEGER :: II, JJ, KK
168 DOUBLE PRECISION :: IC_START(3), IC_END(3)
170 DOUBLE PRECISION :: DOM_VOL, DOML(3)
174 DOUBLE PRECISION :: ADJ_DIA
176 INTEGER :: rPARTS(dim_m), tPARTS
178 DOUBLE PRECISION :: lDEL, lDX, lDY, lDZ
180 LOGICAL :: FIT_FAILED
182 INTEGER :: pCOUNT(dim_m), tCOUNT
184 DOUBLE PRECISION :: SOLIDS_DATA(0:dim_m)
187 DOUBLE PRECISION :: VEL_SIG
188 DOUBLE PRECISION,
ALLOCATABLE :: randVEL(:,:)
190 logical :: report = .true.
197 WRITE(
err_msg,
"(2/,'Generating initial particle configuration:')")
208 ic_start(1)=ic_x_w(icv); ic_end(1)=ic_x_e(icv)
209 ic_start(2)=ic_y_s(icv); ic_end(2)=ic_y_n(icv)
210 ic_start(3)=ic_z_b(icv); ic_end(3)=ic_z_t(icv)
212 doml = ic_end-ic_start
213 IF(no_k) doml(3)=dz(1)
216 dom_vol = doml(1)*doml(2)*doml(3)
223 floor((6.0d0*ic_ep_s(icv,m)*dom_vol)/(
pi*(
d_p0(m)**3)))
229 IF(tparts == 0)
RETURN 231 adj_dia = 2.0d0*max_radius*lfac
237 ldel = (doml(1)-adj_dia)*(doml(2)-adj_dia)
238 ldel = (ldel/dble(tparts))**(1.0/2.0)
239 seed_x = max(1,ceiling((doml(1)-adj_dia)/ldel))
240 seed_y = max(1,ceiling((doml(2)-adj_dia)/ldel))
243 ldel = (doml(1)-adj_dia)*(doml(2)-adj_dia)*(doml(3)-adj_dia)
244 ldel = (ldel/dble(tparts))**(1.0/3.0)
245 seed_x = max(1,ceiling((doml(1)-adj_dia)/ldel))
246 seed_y = max(1,ceiling((doml(2)-adj_dia)/ldel))
247 seed_z = max(1,ceiling((doml(3)-adj_dia)/ldel))
249 fit_failed=(dble(seed_x*seed_y*seed_z) < tparts)
254 seed_x = max(1,floor((ic_end(1)-ic_start(1)-adj_dia)/adj_dia))
255 seed_y = max(1,floor((ic_end(2)-ic_start(2)-adj_dia)/adj_dia))
256 seed_z = max(1,floor((ic_end(3)-ic_start(3)-adj_dia)/adj_dia))
259 ldx = doml(1)/dble(seed_x)
260 ldy = doml(2)/dble(seed_y)
262 ldz = doml(3)/dble(seed_z)
267 xinit = ic_start(1)+half*ldx
268 yinit = ic_start(2)+half*ldy
269 zinit = ic_start(3)+half*ldz
277 jj_lp:
DO jj=1, seed_y
278 pos(2) = yinit + (jj-1)*ldy
282 kk_lp:
DO kk=1, seed_z
283 pos(3) = zinit + (kk-1)*ldz
289 ii_lp:
DO ii=1, seed_x
290 pos(1) = xinit + (ii-1)*ldx
295 IF(tcount > int(tparts))
THEN 298 ELSEIF(pcount(m) > int(rparts(m)))
THEN 299 mm_lp:
DO mm=m+1,
mmax+des_mmax
300 IF(rparts(mm) > 0.0)
THEN 305 IF(m >
mmax+des_mmax)
EXIT jj_lp
309 pcount(m) = pcount(m) + 1
314 jofpos(pos(2)),kofpos(pos(3)))) cycle
323 IF(dead_cell_at(i,j,k)) cycle
327 IF(.NOT.fluid_at(ijk)) cycle
336 max_pip = max(pip,max_pip)
341 vel(1) = randvel(pcount(m),1)
342 vel(2) = randvel(pcount(m),2)
343 vel(3) = randvel(pcount(m),3)
345 vel(1) = ic_u_s(icv,m)
346 vel(2) = ic_v_s(icv,m)
347 vel(3) = ic_w_s(icv,m)
349 IF(no_k) vel(3) = 0.0d0
352 des_pos_new(pip,:) = pos(:)
353 des_vel_new(pip,:) = vel(:)
354 omega_new(pip,:) = 0.0d0
356 des_radius(pip) =
d_p0(m)*half
357 ro_sol(pip) =
ro_s0(m)
366 des_vel_old(pip,:) = des_vel_new(pip,:)
367 des_pos_old(pip,:) = des_pos_new(pip,:)
368 omega_old(pip,:) = zero
371 solids_data(m) = solids_data(m) + 1.0
381 IF(solids_data(0) <= 0.0d0)
THEN 382 WRITE(
err_msg,1000) icv, solids_data(0)
386 1000
FORMAT(
'Error 1000: Invalid IC region volume: IC=',i3,
' VOL=',&
387 es15.4,/
'Please correct the mfix.dat file.')
394 WRITE(
err_msg,2010) m, int(solids_data(m)), ic_ep_s(icv,m), &
395 (dble(solids_data(m))*(
pi/6.0d0)*
d_p0(m)**3)/solids_data(0)
399 IF(
allocated(randvel))
deallocate(randvel)
405 2000
FORMAT(/2x,
'|',43(
'-'),
'|',/2x,
'| IC Region: ',i3,28x,
'|',/2x, &
406 '|',43(
'-'),
'|',/2x,
'| Phase | Number of | EPs | EP',&
407 's |',/2x,
'| ID | Particles | Specified | Actual |', &
408 /2x,
'|-------|',3(11(
'-'),
'|'))
410 2010
FORMAT(2x,
'| ',i3,
' |',1x,i9,1x,
'|',2(1x,es9.2,1x,
'|'),/2x, &
411 '|-------|',3(11(
'-'),
'|'))
422 INTEGER,
INTENT(IN) :: lICV, lM
423 DOUBLE PRECISION :: VEL_SIG
426 if(
allocated(randvel))
deallocate(randvel)
427 allocate(randvel(100+int(rparts(lm)),3))
428 vel_sig = sqrt(ic_theta_m(licv,lm))
429 CALL nor_rno(randvel(:,1), ic_u_s(licv,lm),vel_sig)
430 CALL nor_rno(randvel(:,2), ic_v_s(licv,lm),vel_sig)
431 IF(do_k)
CALL nor_rno(randvel(:,3),ic_w_s(licv,lm),vel_sig)
454 use discretelement
, only: des_mmax
481 INTEGER,
INTENT(IN) :: ICV
488 DOUBLE PRECISION :: IC_VOL
490 DOUBLE PRECISION :: SOLIDS_DATA(0:4*
dim_m)
495 WRITE(
err_msg,
"(2/,'Generating initial parcel configuration:')")
508 IF(ic_rop_s(icv,m) ==
zero) cycle
511 solids_data((4*m-3):(4*m)))
519 IF(solids_data(0) <= 0.0d0)
THEN 520 WRITE(
err_msg,1000) icv, solids_data(0)
524 1000
FORMAT(
'Error 1000: Invalid IC region volume: IC=',i3,
' VOL=',&
525 es15.4,/
'Please correct the mfix.dat file.')
530 WRITE(
err_msg,2010) m, int(solids_data(4*m-3)),&
531 int(solids_data(4*m-3)*solids_data(4*m-2)), &
532 solids_data(4*m-2), solids_data(4*m-1), &
533 solids_data(4*m)/solids_data(0)
542 2000
FORMAT(/2x,
'|',67(
'-'),
'|',/2x,
'| IC Region: ',i3,52x,
'|',/2x, &
543 '|',67(
'-'),
'|',/2x,
'| Phase | Num. Comp | Num. Real ', &
544 '| Stastical | EPs | EPs |',/2x,
'| ID | ', &
545 'Parcels | Particles | Weight | Specified | Actual |', &
546 /2x,
'|-------|',5(11(
'-'),
'|'))
548 2010
FORMAT(2x,
'| ',i3,
' |',2(1x,i9,1x,
'|'),3(1x,es9.2,1x,
'|'),/2x,&
549 '|-------|',5(11(
'-'),
'|'))
572 use discretelement
, only: xe, yn, zt
611 INTEGER,
INTENT(IN) :: ICV, M
613 DOUBLE PRECISION,
INTENT(IN) :: IC_VOL
615 DOUBLE PRECISION,
INTENT(OUT) :: sDATA(4)
619 DOUBLE PRECISION :: EP_SM
622 DOUBLE PRECISION :: rPARTS
624 DOUBLE PRECISION :: DOML(3), IC_START(3)
626 DOUBLE PRECISION :: POS(3)
628 DOUBLE PRECISION :: IC_VEL(3), VEL_SIG
632 DOUBLE PRECISION,
ALLOCATABLE :: randVEL(:,:)
633 DOUBLE PRECISION :: RAND(3)
635 DOUBLE PRECISION :: STAT_WT, SUM_STAT_WT
637 DOUBLE PRECISION :: sVOL, sVOL_TOT
641 INTEGER :: I, J, K, IJK, LC, LC_MAX
647 allocate(randvel(maxparts,3))
649 ic_vel(1) = ic_u_s(icv,m)
650 ic_vel(2) = ic_v_s(icv,m)
651 ic_vel(3) = merge(ic_w_s(icv,m),0.0d0,do_k)
653 vel_sig = sqrt(ic_theta_m(icv,m))
656 svol = (
pi/6.0d0)*(
d_p0(m)**3.d0)
662 DO k = ic_k_b(icv), ic_k_t(icv)
663 DO j = ic_j_s(icv), ic_j_n(icv)
664 DO i = ic_i_w(icv), ic_i_e(icv)
666 IF(.not.is_on_mype_wobnd(i,j,k)) cycle
667 IF(dead_cell_at(i,j,k)) cycle
670 IF(.not.fluid_at(ijk)) cycle
672 rparts = ic_ep_s(icv,m)*vol(ijk)/svol
677 lc_max = int(rparts/stat_wt)
680 ELSEIF(ic_pic_const_npc(icv,m) /= 0)
THEN 681 lc_max = ic_pic_const_npc(icv,m)
682 stat_wt = rparts/dble(lc_max)
683 IF(cut_cell_at(ijk)) lc_max = max(1,int(vol(ijk)*dble(&
684 ic_pic_const_npc(icv,m))/(dx(i)*dy(j)*dz(k))))
688 IF(lc_max > maxparts)
THEN 690 if(
allocated(randvel))
deallocate(randvel)
691 allocate(randvel(maxparts,3))
694 DO lc=1, merge(2,3,no_k)
695 IF(vel_sig >
zero)
THEN 696 CALL nor_rno(randvel(1:lc_max,lc), ic_vel(lc), vel_sig)
698 randvel(1:lc_max,lc) = ic_vel(lc)
701 IF(no_k) randvel(1:lc_max,3) = 0.0d0
703 ic_start(1) = xe(i-1)
704 ic_start(2) = yn(j-1)
705 ic_start(3) =
zero;
IF(do_k) ic_start(3) = zt(k-1)
709 doml(3) =
zero;
IF(do_k) doml(3) = dz(k)
713 CALL random_number(rand)
714 pos(:) = ic_start + doml*rand
719 CALL random_number(rand)
720 pos(:) = ic_start + doml*rand
727 max_pip = max(pip,max_pip)
729 des_pos_new(pip,:) = pos(:)
730 des_vel_new(pip,:) = randvel(lc,:)
733 ro_sol(pip) =
ro_s0(m)
741 sum_stat_wt = sum_stat_wt + stat_wt
744 svol_tot = svol_tot + svol*stat_wt
756 IF(
allocated(randvel))
deallocate(randvel)
758 sdata(1) = dble(seeded)
759 sdata(2) = sum_stat_wt/dble(seeded)
760 sdata(3) = ic_ep_s(icv,m)
794 INTEGER,
INTENT(IN) :: ICV
796 DOUBLE PRECISION,
INTENT(OUT) :: IC_VOL
800 INTEGER :: I, J, K, IJK
806 DO j = ic_j_s(icv), ic_j_n(icv)
807 DO i = ic_i_w(icv), ic_i_e(icv)
809 IF(.NOT.is_on_mype_wobnd(i,j,k)) cycle
813 IF(fluid_at(ijk)) ic_vol = ic_vol +
vol(ijk)
double precision dg_xstart
integer, parameter dimension_ic
integer, dimension(dimension_ic, dim_m) ic_pic_const_npc
double precision, dimension(dimension_ic, dim_m) ic_rop_s
double precision, dimension(dim_m) d_p0
logical function compare(V1, V2)
integer, dimension(dimension_ic) ic_j_s
double precision, dimension(dimension_ic, dim_m) ic_theta_m
double precision, parameter one
subroutine check_if_particle_overlaps_stl(POS, fI, fJ, fK, REMOVE)
subroutine, public nor_rno(Y, mean, sigma)
integer, dimension(dimension_ic) ic_j_n
subroutine get_ic_volume(ICV, IC_VOL)
logical function set_vel_fluct(lICV, lM)
double precision dg_zstart
logical, dimension(dimension_ic) ic_defined
double precision, dimension(dimension_ic) ic_z_b
double precision, dimension(dimension_ic) ic_x_w
subroutine generate_particle_config_dem(ICV)
character(len=3), dimension(dim_m) solids_model
double precision, parameter undefined
subroutine check_if_parcel_overlaps_stl(POS, OVERLAP_EXISTS)
subroutine init_err_msg(CALLER)
double precision, dimension(dimension_ic) ic_z_t
double precision, dimension(dimension_ic, dim_m) ic_w_s
integer, dimension(dimension_ic) ic_i_w
logical, dimension(:,:,:), allocatable dead_cell_at
integer function iofpos(fpos)
double precision, parameter small_number
integer, dimension(dimension_ic) ic_i_e
integer, dimension(dimension_ic) ic_k_b
double precision, dimension(dimension_ic) ic_y_n
subroutine gpc_mppic_const_npc(ICV, M, IC_VOL, sDATA)
double precision, parameter half
integer function kofpos(fpos)
double precision, parameter large_number
double precision dg_ystart
integer, dimension(dimension_ic) ic_k_t
double precision, dimension(dimension_ic, dim_m) ic_v_s
double precision, dimension(dimension_ic, dim_m) ic_pic_const_statwt
subroutine generate_particle_config_mppic(ICV)
logical, dimension(:), allocatable cut_cell_at
double precision, dimension(dimension_ic) ic_x_e
integer, parameter undefined_i
subroutine pic_search(IDX, lPOS, ENT_POS, lDIMN, lSTART, lEND)
character(len=line_length), dimension(line_count) err_msg
double precision, dimension(dimension_ic, dim_m) ic_u_s
logical, dimension(dimension_ic) ic_des_fit_to_region
double precision, dimension(:), allocatable particle_count
double precision, dimension(dimension_ic) ic_ep_g
logical function dg_is_on_mype_owns(lI, lJ, lK)
integer function jofpos(fpos)
double precision, dimension(dim_m) ro_s0
subroutine, public particle_grow(new_max_pip)
subroutine generate_particle_config
double precision, parameter pi
double precision, dimension(:), allocatable vol
double precision, dimension(dimension_ic) ic_y_s
double precision, dimension(:), allocatable des_stat_wt
double precision, dimension(dimension_ic, dim_m) ic_ep_s
double precision, parameter zero
subroutine flush_err_msg(DEBUG, HEADER, FOOTER, ABORT, LOG, CALL_TREE)