57 DOUBLE PRECISION :: DP_BAR
59 DOUBLE PRECISION :: ENp1
61 DOUBLE PRECISION :: VEL(3)
63 DOUBLE PRECISION :: DELUP(3)
65 DOUBLE PRECISION :: UPRIMETAU(3)
67 DOUBLE PRECISION :: SLIPVEL(3)
69 DOUBLE PRECISION :: DIST(3), DIST_MAG
71 DOUBLE PRECISION :: MAX_VEL
73 DOUBLE PRECISION :: DXYZ_MIN
75 DOUBLE PRECISION :: l3SQT2
77 DOUBLE PRECISION :: EPg_MFP
79 DOUBLE PRECISION :: MFP
81 DOUBLE PRECISION :: EPs
85 DOUBLE PRECISION :: GRAV_NORM(3)
95 l3sqt2 = merge(3.0d0, 2.0d0,
do_k)*sqrt(2.0d0)
97 lc_bnd = merge(2,3,
no_k)
106 IF(is_nonexistent(np)) cycle
113 IF(is_entering(np))
THEN 116 fc(np,:) = fc(np,:)/pmass(np) + grav(:)
125 dp_bar = f_gp(np)/pmass(np)
133 vel(:) = (des_vel_new(np,:) + &
134 fc(np,:)*dtsolid)/(1.d0+dp_bar*dtsolid)
138 delup(:) = -(dtsolid*
ps_grad(:,np)) / &
139 (eps*
ro_s0(1)*(1.d0+dp_bar*dtsolid))
149 uprimetau(lc) = min(delup(lc), enp1*slipvel(lc))
150 uprimetau(lc) = max(uprimetau(lc),
zero)
153 uprimetau(lc) = max(delup(lc), enp1*slipvel(lc))
154 uprimetau(lc) = min(uprimetau(lc),
zero)
160 des_vel_new(np,:) = vel + uprimetau
162 dist(:) = des_vel_new(np,:)*dtsolid
165 IF(
epg_p(np) < epg_mfp)
THEN 166 IF(dot_product(des_vel_new(np,:),
ps_grad(:,np)) >
zero)
THEN 168 dist_mag = dot_product(dist, dist)
170 mfp = 3.7d0*des_radius(np)/(l3sqt2*eps)
172 IF(mfp**2 < dist_mag)
THEN 173 dist = mfp*dist/sqrt(dist_mag)
174 des_vel_new(np,:) = dist/dtsolid
181 des_pos_new(np,:) = des_pos_new(np,:) + dist
186 dist_mag = dot_product(des_vel_new(np,:),des_vel_new(np,:))
187 max_vel = max(max_vel, dist_mag)
192 dxyz_min = min(minval(dx(imin1:imax1)),minval(dy(jmin1:jmax1)))
193 IF(
do_k) dxyz_min = min(dxyz_min,minval(dz(kmin1:kmax1)))
224 INTEGER,
INTENT(IN) :: lNP
226 DOUBLE PRECISION,
INTENT(IN) :: lVEL(3)
228 DOUBLE PRECISION :: aVEL(3)
230 DOUBLE PRECISION :: tDP1, tDP2
236 tdp1 = dot_product(grav_norm,avel)
238 IF(dot_product(avel,lvel) >
zero)
THEN 239 tdp2 = dot_product(avel, avel)
240 IF(tdp1**2 > 0.99*tdp2) avel = &
241 (50.75d0- 50.0d0*tdp1/sqrt(tdp2))*avel
306 INTEGER I, J, K, IJK, IJK_OLD
308 DOUBLE PRECISION DD(3), DIST, &
309 DP_BAR, MEANVEL(3), D_GRIDUNITS(3)
311 DOUBLE PRECISION MEAN_FREE_PATH
316 LOGICAL DES_LOC_DEBUG
319 DOUBLE PRECISION UPRIMEMOD
323 DOUBLE PRECISION :: DTPIC_TMPX, DTPIC_TMPY , DTPIC_TMPZ
324 DOUBLE PRECISION :: THREEINTOSQRT2, RAD_EFF, POS_Z
325 DOUBLE PRECISION :: VELP_INT(3)
327 LOGICAL :: DELETE_PART, INSIDE_DOMAIN
328 INTEGER :: PIP_DEL_COUNT
330 INTEGER :: LPIP_DEL_COUNT_ALL(0:numpes-1), PIJK_OLD(5)
332 double precision sig_u, mean_u
333 DOUBLE PRECISION :: DTPIC_MIN_X, DTPIC_MIN_Y, DTPIC_MIN_Z
334 double precision,
allocatable,
dimension(:,:) :: rand_vel
336 double precision :: norm1, norm2, norm3
337 Logical :: OUTER_STABILITY_COND, DES_FIXED_BED
340 outer_stability_cond = .false.
341 des_fixed_bed = .false.
348 if(no_k) threeintosqrt2 = 2.d0*sqrt(2.d0)
349 if(do_k) threeintosqrt2 = 3.d0*sqrt(2.d0)
350 threeintosqrt2 = 3.d0*sqrt(2.d0)
356 allocate(rand_vel(3, max_pip))
357 do lc = 1, merge(2,3,no_k)
360 CALL nor_rno(rand_vel(lc, 1:max_pip), mean_u, sig_u)
366 delete_part = .false.
369 if(is_nonexistent(np)) cycle
371 if(is_ghost(np) .or. is_entering_ghost(np) .or. is_exiting_ghost
375 IF(.NOT.is_entering(np))
THEN 376 fc(np,:) = fc(np,:)/pmass(np) + grav(:)
381 IF(des_fixed_bed) fc(np,:) =
zero 388 dp_bar = f_gp(np)/(pmass(np))
389 IF(.NOT.des_continuum_coupled) dp_bar =
zero 395 pijk_old(:) = pijk(np,:)
401 des_vel_new(np,:) = (des_vel_new(np,:) + &
402 & fc(np,:)*dtsolid)/(1.d0+dp_bar*dtsolid)
404 IF(des_fixed_bed) des_vel_new(np,:) =
zero 408 velp_int(:) = des_vel_new(np,:)
410 meanvel(1) =
u_s(ijk_old,m)
411 meanvel(2) =
v_s(ijk_old,m)
412 IF(do_k) meanvel(3) =
w_s(ijk_old,m)
414 rad_eff = des_radius(np)
416 IF(.not.des_oneway_coupled)
then 417 mean_free_path = max(1.d0/(1.d0-
ep_star), 1.d0/(1.d0-
ep_g(ijk_old
421 DO lc = 1, merge(2,3,no_k)
426 rand_vel(lc, np) = sig_u*rand_vel(lc, np)*des_vel_new(np,lc
427 IF(des_fixed_bed) rand_vel(lc,np) =
zero 430 des_vel_new(np,lc) = des_vel_new(np,lc) + rand_vel(lc, np)
441 IF(des_fixed_bed)
THEN 444 dd(:) = des_vel_new(np,:)*dtsolid
453 inside_domain = .true.
454 inside_domain = fluid_at(ijk)
458 IF(do_k) pos_z = des_pos_new(np,3)
460 & des_pos_new(np,1), des_pos_new(np,2), &
462 & dist, norm1, norm2, norm3, .true.)
464 IF(dist.LE.
zero) inside_domain = .false.
469 IF(1.d0 -
ep_g(ijk).GT. 1.3d0*(1.d0 -
ep_star).and.inside_domain.and.ijk.NE.ijk_old.and.outer_stability_cond
then 471 des_vel_new(np,:) = 0.8d0*des_vel_new(np,:)
474 pijk(np,:) = pijk_old(:)
476 des_pos_new(np,:) = des_pos_new(np,:) + dd(:)
478 dist = sqrt(dot_product(dd,dd))
480 d_gridunits(1) = abs(dd(1))/dx(pijk(np,1))
481 d_gridunits(2) = abs(dd(2))/dy(pijk(np,2))
482 d_gridunits(3) = 1.d0
483 IF(do_k) d_gridunits(3) = abs(dd(3))/dz(pijk(np,3))
485 dist = sqrt(dot_product(dd,dd))
489 IF(do_k) dtpic_tmpz = (
cfl_pic*dz(pijk(np,3)))/(abs(des_vel_new
495 DO lc = 1, merge(2,3,no_k)
496 IF(d_gridunits(lc).GT.
one)
THEN 497 IF(dmp_log.OR.mype.eq.pe_io)
THEN 499 WRITE(unit_log, 2001) np, d_gridunits(:), des_vel_new(np
500 WRITE(unit_log,
'(A,2x,3(g17.8))')
'rand_vel = ', rand_vel
501 IF (do_old)
WRITE(unit_log,
'(A,2x,3(g17.8))')
'des_pos_old = ' 502 WRITE(unit_log,
'(A,2x,3(g17.8))')
'des_pos_new = ', des_pos_new
503 WRITE(unit_log,
'(A,2x,3(g17.8))')
'FC = ', fc
505 WRITE(*, 2001) np, d_gridunits(:), des_vel_new(np,:)
507 WRITE(*,
'(A,2x,3(g17.8))')
'rand_vel = ', rand_vel(:,np
508 IF (do_old)
WRITE(*,
'(A,2x,3(g17.8))')
'des_pos_old = ' 509 WRITE(*,
'(A,2x,3(g17.8))')
'des_pos_new = ', des_pos_new
510 WRITE(*,
'(A,2x,3(g17.8))')
'FC = ', fc(np,:)
520 IF(.not.delete_part)
then 529 CALL set_nonexistent(np)
530 pip_del_count = pip_del_count + 1
532 IF (des_loc_debug)
WRITE(*,1001)
539 pip = pip - pip_del_count
541 lpip_del_count_all(:) = 0
542 lpip_del_count_all(mype) = pip_del_count
544 IF((dmp_log).AND.sum(lpip_del_count_all(:)).GT.0)
THEN 545 IF(print_des_screen)
THEN 546 WRITE(*,
'(/,2x,A,2x,i10,/,A)') &
547 'TOTAL NUMBER OF PARTS STEPPING MORE THAN ONE GRID SPACE = ' 549 'THIS SHOULD NOT HAPPEN FREQUENTLY: MONITOR THIS MESSAGE' 552 WRITE(unit_log,
'(/,2x,A,2x,i10,/,A)') &
553 'TOTAL NUMBER OF PARTS STEPPING MORE THAN ONE GRID SPACEC=' 555 'THIS SHOULD NOT HAPPEN FREQUENTLY: MONITOR THIS MESSAGE' 568 IF(mype.eq.pe_io)
WRITE(*, 2004) dtsolid
572 IF(mype.eq.pe_io)
WRITE(*, 2002)
dtpic_max 578 WRITE(unit_log,
'(10x,A,2x,3(g17.8))')&
579 'DTPIC MINS IN EACH DIRECTION = ', dtpic_min_x, &
580 dtpic_min_y, dtpic_min_z
581 WRITE(*,
'(10x,A,2x,3(g17.8))')
'DTPIC MINS IN EACH DIRECTION = ',&
582 dtpic_min_x, dtpic_min_y, dtpic_min_z
584 1001
FORMAT(3x,
'<---------- END INTEGRATE_TIME_PIC ----------')
586 2001
FORMAT(/1x,70(
'*'),//,10x, &
587 &
'MOVEMENT UNDESIRED IN INTEGRATE_TIME_PIC: PARTICLE', i5, /
588 ' MOVED MORE THAN A GRID SPACING IN ONE TIME STEP', /,10x,
589 'MOVEMENT IN GRID UNITS = ', 3(2x, g17.8),/,10x, &
590 &
'TERMINAL ERROR: NOT STOPPING, BUT DELETING THE PARTICLE',
592 &
'DES_VEL_NEW = ', 3(2x, g17.8))
595 &
'DTSOLID SHUD BE REDUCED TO', g17.8)
598 &
'DTSOLID CAN BE INCREASED TO', g17.8)
628 INTEGER,
INTENT(IN) :: pstart,pend
629 INTEGER,
INTENT(IN),
OPTIONAL :: pfreq
634 integer,
save :: lfcount = 0 ,lfreq =0
635 character(255) :: filename
637 if (
present(pfreq))
then 639 if (lfreq .ne. pfreq)
return 642 lfcount = lfcount + 1
643 write(filename,
'("debug",I3.3)') lfcount
644 open (unit=100,file=filename)
646 if (is_normal(lp) .or. is_entering(lp) .or. is_exiting(lp))
then 648 write(100,*)
"positon =",lijk,pijk(lp,1),pijk(lp,2), &
650 write(100,*)
"forces =", fc(lp,2),tow(lp,1)
682 INTEGER,
INTENT(IN) :: pstart,pend
683 INTEGER,
INTENT(IN),
OPTIONAL :: pfreq
688 integer,
save :: lfcount = 0 ,lfreq =0
689 character(255) :: filename
692 if (
present(pfreq))
then 694 if (lfreq .ne. pfreq)
return 697 lfcount = lfcount + 1
698 write(filename,
'("new_tec",I3.3,".dat")') lfcount
699 open (unit=100,file=filename)
700 write(100,
'(9(A,3X),A)') &
701 'VARIABLES = ',
'"ijk"',
'"x"',
'"y"',
'"vx"',
'"vy"', &
702 '"ep_g"',
'"FCX"' ,
'"FCY"',
'"TOW"' 703 write(100,
'(A,F14.7,A)')
'zone T = "' , s_time ,
'"' 705 if (.not.is_nonexistent(lp))
then 707 write(100,*)lijk,des_pos_new(lp,1),des_pos_new(lp,2), &
708 des_vel_new(lp,1),des_vel_new(lp,2),
ep_g(lijk),&
709 fc(lp,1),fc(lp,2),tow(1,lp)
double precision dtpic_cfl
double precision, dimension(:,:), allocatable v_s
double precision, dimension(:), allocatable ep_g
double precision, dimension(:,:), allocatable avgsolvel_p
double precision, dimension(:,:), allocatable ps_grad
double precision, parameter one
logical mppic_solid_stress_snider
logical mppic_pdrag_implicit
subroutine, public nor_rno(Y, mean, sigma)
double precision function, dimension(3) avg_vel_wgrav(lNP, lVEL)
double precision, dimension(:,:), allocatable w_s
double precision, parameter undefined
double precision, dimension(:,:), allocatable u_s
subroutine pic_find_new_cell(LL)
double precision, parameter small_number
subroutine integrate_time_pic_snider
double precision, parameter large_number
double precision dtpic_taup
logical, dimension(:), allocatable cut_cell_at
double precision, dimension(:), allocatable epg_p
subroutine integrate_time_pic_garg
subroutine get_del_h_des(IJK, TYPE_OF_CELL, X0, Y0, Z0, Del_H, Nx, Ny, Nz, allow_neg_dist)
double precision dtpic_max
double precision mppic_coeff_en1
subroutine mppic_apply_ps_grad_part(L)
double precision, dimension(dim_m) ro_s0
subroutine des_dbgpic(pstart, pend, pfreq)
subroutine integrate_time_pic
double precision, parameter zero
subroutine des_dbgtecplot(pstart, pend, pfreq)