46 DOUBLE PRECISION ::OVERLAP_N, SQRT_OVERLAP
48 DOUBLE PRECISION :: V_REL_TRANS_NORM, DISTSQ, RADSQ, CLOSEST_PT(dimn)
50 DOUBLE PRECISION :: NORMAL(dimn), VREL_T(dimn), DIST(dimn), DISTMOD
51 DOUBLE PRECISION,
DIMENSION(DIMN) :: FTAN, FNORM, OVERLAP_T
53 LOGICAL :: DES_LOC_DEBUG
54 INTEGER :: CELL_ID, cell_count
57 DOUBLE PRECISION :: TANGENT(dimn)
58 DOUBLE PRECISION :: FTMD, FNMD
60 DOUBLE PRECISION ETAN_DES_W, ETAT_DES_W, KN_DES_W, KT_DES_W
62 double precision :: MAG_OVERLAP_T
64 double precision :: line_t
68 DOUBLE PRECISION :: MAX_DISTSQ, DISTAPART, FORCE_COH, R_LM
69 INTEGER :: MAX_NF, axis
70 DOUBLE PRECISION,
DIMENSION(3) :: PARTICLE_MIN, PARTICLE_MAX, POS_TMP
72 des_loc_debug = .false. ; debug_des = .false.
92 IF(ll.EQ.focus_particle) debug_des = .true.
97 IF(.NOT.is_normal(ll)) cycle
103 wall_collision_facet_id(:,ll) = -1
104 wall_collision_pft(:,:,ll) = 0.0d0
109 radsq = des_radius(ll)*des_radius(ll)
111 particle_max(:) = des_pos_new( ll,:) + des_radius(ll)
112 particle_min(:) = des_pos_new( ll,:) - des_radius(ll)
121 IF(use_cohesion .AND. van_der_waals)
THEN 124 vertex(:,:,nf), closest_pt(:))
126 dist(:) = closest_pt(:) - des_pos_new(ll,:)
127 distsq = dot_product(dist, dist)
128 r_lm = 2*des_radius(ll)
130 IF(distsq < (r_lm+wall_vdw_outer_cutoff)**2)
THEN 131 IF(distsq > (wall_vdw_inner_cutoff+r_lm)**2)
THEN 132 distapart = (sqrt(distsq)-r_lm)
133 force_coh = wall_hamaker_constant*des_radius(ll) /&
134 (12d0*distapart**2)*(asperities/(asperities + &
135 des_radius(ll)) +
one/(
one+asperities/ &
138 force_coh = 2d0*
pi*surface_energy*des_radius(ll)* &
139 (asperities/(asperities+des_radius(ll)) +
one/ &
140 (
one+asperities/wall_vdw_inner_cutoff)**2 )
142 fc(ll,:) = fc(ll,:) + dist(:)*force_coh/sqrt(distsq)
147 particle_max(axis))
then 153 particle_min(axis))
then 191 line_t = dot_product(
vertex(1,:,nf) - des_pos_new(ll,:),&
203 if((line_t.le.-1.0001d0*des_radius(ll)))
then 208 pos_tmp = des_pos_new(ll,:)
210 vertex(:,:,nf), closest_pt(:))
212 dist(:) = closest_pt(:) - des_pos_new(ll,:)
213 distsq = dot_product(dist, dist)
225 normal(:) = dist(:)/sqrt(distsq)
234 distmod = sqrt(max_distsq)
235 overlap_n = des_radius(ll) - distmod
245 IF (des_coll_model_enum .EQ. hertzian)
THEN 246 sqrt_overlap = sqrt(overlap_n)
247 kn_des_w = hert_kwn(phasell)*sqrt_overlap
248 kt_des_w = hert_kwt(phasell)*sqrt_overlap
249 sqrt_overlap = sqrt(sqrt_overlap)
250 etan_des_w = des_etan_wall(phasell)*sqrt_overlap
251 etat_des_w = des_etat_wall(phasell)*sqrt_overlap
255 etan_des_w = des_etan_wall(phasell)
256 etat_des_w = des_etat_wall(phasell)
260 fnorm(:) = -(kn_des_w * overlap_n * normal(:) + &
261 etan_des_w * v_rel_trans_norm * normal(:))
265 nf, wall_collision_facet_id, wall_collision_pft)
266 mag_overlap_t = sqrt(dot_product(overlap_t, overlap_t))
270 IF(mag_overlap_t > 0.0)
THEN 272 ftmd = kt_des_w*mag_overlap_t
274 fnmd = mew_w*sqrt(dot_product(fnorm,fnorm))
276 tangent = overlap_t/mag_overlap_t
278 ftan = -ftmd * tangent
280 ftan = -fnmd * tangent
281 overlap_t = (fnmd/kt_des_w) * tangent
287 ftan = ftan - etat_des_w*vrel_t(:)
291 wall_collision_facet_id, wall_collision_pft)
294 fc(ll,:) = fc(ll,:) + fnorm(:) + ftan(:)
297 tow(ll,:) = tow(ll,:) + distmod*des_crossprdct(normal,ftan)
314 FUNCTION get_collision(LLL,FACET_ID,WALL_COLLISION_FACET_ID, &
324 DOUBLE PRECISION :: GET_COLLISION(dimn)
325 INTEGER,
INTENT(IN) :: LLL,FACET_ID
326 INTEGER,
INTENT(INOUT) :: WALL_COLLISION_FACET_ID(:,:)
327 DOUBLE PRECISION,
INTENT(INOUT) :: WALL_COLLISION_PFT(:,:,:)
328 INTEGER :: CC, FREE_INDEX, LC, dgIJK
330 INTEGER :: lSIZE1, lSIZE2, lSIZE3
331 INTEGER,
ALLOCATABLE :: tmpI2(:,:)
332 DOUBLE PRECISION,
ALLOCATABLE :: tmpR3(:,:,:)
336 do cc = 1, collision_array_max
337 if (facet_id == wall_collision_facet_id(cc,lll))
then 338 get_collision(:) = wall_collision_pft(:,cc,lll)
340 else if (-1 == wall_collision_facet_id(cc,lll))
then 349 if(-1 == free_index)
then 351 cc_lp:
do cc=1, collision_array_max
353 if(wall_collision_facet_id(cc,lll) == &
362 if(-1 == free_index)
then 363 free_index=collision_array_max+1
364 collision_array_max = 2*collision_array_max
368 wall_collision_facet_id(free_index,lll) = facet_id
369 wall_collision_pft(:,free_index,lll) =
zero 370 get_collision(:) = wall_collision_pft(:,free_index,lll)
392 INTEGER,
INTENT(IN) :: NEW_SIZE
393 INTEGER :: lSIZE1, lSIZE2, lSIZE3
394 INTEGER,
ALLOCATABLE :: tmpI2(:,:)
395 DOUBLE PRECISION,
ALLOCATABLE :: tmpR3(:,:,:)
397 lsize1 =
size(wall_collision_facet_id,1)
398 lsize2 =
size(wall_collision_facet_id,2)
400 allocate(tmpi2(new_size, lsize2))
401 tmpi2(1:lsize1,:) = wall_collision_facet_id(1:lsize1,:)
402 call move_alloc(tmpi2, wall_collision_facet_id)
403 wall_collision_facet_id(lsize1+1:new_size,:) = -1
405 lsize1 =
size(wall_collision_pft,1)
406 lsize2 =
size(wall_collision_pft,2)
407 lsize3 =
size(wall_collision_pft,3)
409 allocate(tmpr3(lsize1, new_size, lsize3))
410 tmpr3(:,1:lsize2,:) = wall_collision_pft(:,1:lsize2,:)
411 call move_alloc(tmpr3, wall_collision_pft)
425 wall_collision_facet_id, wall_collision_pft)
430 DOUBLE PRECISION,
INTENT(IN) :: PFT(dimn)
431 INTEGER,
INTENT(IN) :: LLL,FACET_ID
432 INTEGER,
INTENT(IN) :: WALL_COLLISION_FACET_ID(:,:)
433 DOUBLE PRECISION,
INTENT(INOUT) :: WALL_COLLISION_PFT(:,:,:)
436 do cc = 1, collision_array_max
437 if (facet_id == wall_collision_facet_id(cc,lll))
then 438 wall_collision_pft(:,cc,lll) = pft(:)
443 CALL init_err_msg(
"CALC_COLLISION_WALL_MOD: UPDATE_COLLISION")
447 1100
FORMAT(
'Error: COLLISION_ARRAY_MAX too small. ')
463 INTEGER,
INTENT(IN) :: LLL,FACET_ID
464 INTEGER,
INTENT(INOUT) :: WALL_COLLISION_FACET_ID(:,:)
467 DO cc = 1, collision_array_max
468 IF (facet_id == wall_collision_facet_id(cc,lll))
THEN 469 wall_collision_facet_id(cc,lll) = -1
492 use discretelement
, only: des_vel_new
494 use discretelement
, only: omega_new
496 use discretelement
, only: dimn
498 use discretelement
, only: des_crossprdct
505 INTEGER,
INTENT(IN) :: LL
507 DOUBLE PRECISION,
INTENT(OUT):: VRN
509 DOUBLE PRECISION,
DIMENSION(DIMN),
INTENT(OUT):: VRT
511 DOUBLE PRECISION,
DIMENSION(DIMN),
INTENT(IN) :: NORM
513 DOUBLE PRECISION,
INTENT(IN) :: DIST
518 DOUBLE PRECISION,
DIMENSION(DIMN) :: V_ROT
520 DOUBLE PRECISION,
DIMENSION(DIMN) :: VRELTRANS
523 v_rot = dist*omega_new(ll,:)
524 vreltrans(:) = des_vel_new(ll,:) + des_crossprdct(v_rot, norm)
527 vrn = dot_product(vreltrans,norm)
531 vrt(:) = vreltrans(:) - vrn*norm(:)
569 INTEGER :: CELL_COUNT
571 INTEGER :: I_FLUID, J_FLUID, K_FLUID
572 INTEGER :: I_Facet, J_Facet, K_Facet, IJK_Facet
576 INTEGER,
PARAMETER :: MAX_CONTACTS = 12
578 INTEGER :: count_Facets
579 DOUBLE PRECISION,
DIMENSION(3,MAX_CONTACTS) :: NORM_FAC_CONTACT
581 LOGICAL :: DOMAIN_BDRY
585 DOUBLE PRECISION :: RLENS_SQ
586 DOUBLE PRECISION :: RLENS
587 DOUBLE PRECISION :: RPART
590 DOUBLE PRECISION,
DIMENSION(3) :: PARTPOS_MIN, PARTPOS_MAX
591 DOUBLE PRECISION,
DIMENSION(3) :: POS_TMP
592 DOUBLE PRECISION,
DIMENSION(3) :: DIST, NORMAL
594 DOUBLE PRECISION,
DIMENSION(3) :: CLOSEST_PT
596 DOUBLE PRECISION :: line_t
597 DOUBLE PRECISION :: DISTSQ
598 DOUBLE PRECISION :: PROJ
603 DOUBLE PRECISION :: TWALL
604 DOUBLE PRECISION :: K_gas
605 DOUBLE PRECISION :: TPART
606 DOUBLE PRECISION :: OVERLAP
607 DOUBLE PRECISION :: QSWALL, AREA
609 LOGICAL,
SAVE :: OUTPUT_WARNING = .true.
618 IF (.NOT.is_normal(ll)) cycle
619 phase_ll = pijk(ll,5)
622 cell_id = dg_pijk(ll)
628 rlens = (
one+
flpc)*des_radius(ll)
629 rlens_sq = rlens*rlens
631 rpart = des_radius(ll)
634 partpos_max(:) = des_pos_new(ll,:) + rlens
635 partpos_min(:) = des_pos_new(ll,:) - rlens
641 ijk_fluid = pijk(ll,4)
648 IF(.NOT.des_continuum_coupled.or.des_explicitly_coupled)
THEN 650 CALL pic_search(i_fluid, des_pos_new(ll,1), xe, &
653 IF((des_pos_new(ll,1) >= xe(i_fluid-1)) .AND. &
654 (des_pos_new(ll,1) < xe(i_fluid)))
THEN 656 ELSEIF((des_pos_new(ll,1) >= xe(i_fluid)) .AND. &
657 (des_pos_new(ll,1) < xe(i_fluid+1)))
THEN 659 ELSEIF((des_pos_new(ll,1) >= xe(i_fluid-2)) .AND. &
660 (des_pos_new(ll,1) < xe(i_fluid-1)))
THEN 663 CALL pic_search(i_fluid, des_pos_new(ll,1), xe, &
668 CALL pic_search(j_fluid, des_pos_new(ll,2), yn, &
671 IF((des_pos_new(ll,2) >= yn(j_fluid-1)) .AND. &
672 (des_pos_new(ll,2) < yn(j_fluid)))
THEN 674 ELSEIF((des_pos_new(ll,2) >= yn(j_fluid)) .AND. &
675 (des_pos_new(ll,2) < yn(j_fluid+1)))
THEN 677 ELSEIF((des_pos_new(ll,2) >= yn(j_fluid-2)) .AND. &
678 (des_pos_new(ll,2) < yn(j_fluid-1)))
THEN 681 CALL pic_search(j_fluid, des_pos_new(ll,2), yn, &
690 CALL pic_search(k_fluid, des_pos_new(ll,3), zt, &
693 IF((des_pos_new(ll,3) >= zt(k_fluid-1)) .AND. &
694 (des_pos_new(ll,3) < zt(k_fluid)))
THEN 696 ELSEIF((des_pos_new(ll,3) >= zt(k_fluid)) .AND. &
697 (des_pos_new(ll,3) < zt(k_fluid+1)))
THEN 699 ELSEIF((des_pos_new(ll,3) >= zt(k_fluid-2)) .AND. &
700 (des_pos_new(ll,3) < zt(k_fluid-1)))
THEN 703 CALL pic_search(k_fluid, des_pos_new(ll,3), zt, &
708 ijk_fluid = pijk(ll,4)
723 partpos_max(axis))
then 727 partpos_min(axis))
then 732 line_t = dot_product(
vertex(1,:,nf) - des_pos_new(ll,:),&
736 if((line_t.lt.-rlens))cycle
739 pos_tmp(:) = des_pos_new(ll,:)
743 dist(:) = closest_pt(:)-pos_tmp(:)
744 distsq = dot_product(dist,dist)
754 normal(:)=-dist(:)/sqrt(distsq)
755 proj = sqrt(abs(dot_product(normal,
norm_face(:,nf))))
756 IF(abs(
one-proj).gt.1.0d-6)cycle
759 overlap = rpart - sqrt(distsq)
765 domain_bdry = .false.
781 area =
dy(j_fluid)*
dz(k_fluid)
783 area =
dy(j_fluid)*zlength
789 area =
dy(j_fluid)*
dz(k_fluid)
791 area =
dy(j_fluid)*zlength
797 area =
dx(i_fluid)*
dz(k_fluid)
799 area =
dx(i_fluid)*zlength
805 area =
dx(i_fluid)*
dz(k_fluid)
807 area =
dx(i_fluid)*zlength
812 area =
dx(i_fluid)*
dy(j_fluid)
817 area =
dx(i_fluid)*
dy(j_fluid)
819 WRITE( *,*)
'PROBLEM, COULD NOT FIND DOMAIN BOUNDARY' 820 WRITE(*,*)
' In calc_thermo_des_wall_stl' 827 DO ibc = 1, dimension_bc
837 IF(output_warning)
THEN 838 write(*,*)
'WARNING: Could not find BC' 839 write(*,*)
'Check input deck to make sure domain boundaries & 841 write(*,*)
'SUPPRESSING FUTURE OUTPUT' 842 write(*,*)
'DES_POS_NEW' 843 write(*,
'(3(F12.5, 3X))')(des_pos_new(ll,ibc),ibc=1
846 write(*,*)
'CLOSEST PT' 847 write(*,
'(3(F12.5, 3X))')(closest_pt(ibc),ibc=1,3)
848 write(*,*)
'NORM_FACE' 849 write(*,
'(3(F12.5, 3X))')(
norm_face(ibc,nf),ibc=1,3
868 DO ifacet=1,count_facets
870 proj = sqrt(abs(dot_product(normal, norm_fac_contact(:
871 IF(abs(
one-proj).gt.1.0d-6)
THEN 876 IF(.NOT.use_facet)cycle
879 count_facets=count_facets+1
880 norm_fac_contact(:,count_facets)=normal(:)
884 twall =
bc_tw_s(bc_id,phase_ll)
891 k_gas = 6.02d-5*sqrt(
half*(twall+tpart)/300.d0)
893 IF (
units ==
'SI') k_gas = 418.3925d0*k_gas
899 &
k_s0(phase_ll),k_gas,twall, tpart, rpart, &
916 IF(.NOT.domain_bdry)
THEN 917 IF(closest_pt(1) >= xe(i_fluid))
THEN 918 i_facet = min(imax1, i_fluid+1)
919 ELSEIF(closest_pt(1) < xe(i_fluid-1))
THEN 920 i_facet = max(imin1, i_fluid-1)
923 IF(closest_pt(2) >= yn(j_fluid))
THEN 924 j_facet = min(jmax1, j_fluid+1)
925 ELSEIF(closest_pt(2) < yn(j_fluid-1))
THEN 926 j_facet = max(jmin1, j_fluid-1)
929 IF(closest_pt(3) >= zt(k_fluid))
THEN 930 k_facet = min(kmax1, k_fluid+1)
931 ELSEIF(closest_pt(3) < zt(k_fluid-1))
THEN 932 k_facet = max(kmin1, k_fluid-1)
935 ijk_facet=funijk(i_facet,j_facet,k_facet)
939 IF (area.eq.
zero)
then 943 ijk_facet=funijk(i_facet,j_facet,k_facet)
947 area =
dy(j_facet)*
dz(k_facet)
949 area =
dy(j_facet)*zlength
954 area =
dy(j_facet)*
dz(k_facet)
956 area =
dy(j_facet)*zlength
961 area =
dx(i_facet)*
dz(k_facet)
963 area =
dx(i_facet)*zlength
968 area =
dx(i_facet)*
dz(k_facet)
970 area =
dx(i_facet)*zlength
974 area =
dx(i_facet)*
dy(j_facet)
977 area =
dx(i_facet)*
dy(j_facet)
981 ijk_facet = funijk(i_facet,j_facet,k_facet)
983 IF(.NOT.fluid_at(ijk_facet).AND. &
985 write(*,*)
'ERROR: Cell containing facet is not a fluid & 986 & cell or a blocked cell' 988 write(*,*)
'PART POS',(des_pos_new(ll,ibc),ibc=1,3)
989 write(*,*)
'FACET NORM',(
norm_face(ibc,nf),ibc=1,3)
990 write(*,*)
'BC_ID', bc_id
991 write(*,*)
'I,J,K (Facet)', i_facet,j_facet,k_facet
996 IF(fluid_at(ijk_facet))
THEN integer, dimension(dimension_bc) bc_k_b
type(facets_to_dg), dimension(:), allocatable facets_at_dg
subroutine closestptpointtriangle(pointp, points, closest_point)
double precision, dimension(:), allocatable des_t_s
double precision, parameter one
double precision, dimension(3, 3, dim_stl) vertex
logical, dimension(dim_m) calc_cond_des
integer, dimension(dimension_bc) bc_i_w
integer, dimension(dimension_bc) bc_j_n
double precision, dimension(dimension_bc, dim_m) bc_tw_s
logical, dimension(:), allocatable small_cell_at
double precision, dimension(0:dim_j) dy
integer, dimension(dimension_bc) bc_type_enum
double precision, parameter undefined
double precision, dimension(0:dim_k) dz
integer, dimension(dim_stl) bc_id_stl_face
subroutine init_err_msg(CALLER)
subroutine mfix_exit(myID, normal_termination)
integer, dimension(dimension_bc) bc_k_t
subroutine write_this_stl(this)
subroutine, public calc_dem_thermo_with_wall_stl
double precision, parameter small_number
integer, dimension(dimension_bc) bc_j_s
subroutine remove_collision(LLL, FACET_ID, WALL_COLLISION_FACET_ID)
double precision, dimension(dim_m) k_s0
double precision, dimension(3, dim_stl) norm_face
logical, dimension(dimension_bc) bc_defined
double precision, dimension(0:dim_i) dx
subroutine update_collision(PFT, LLL, FACET_ID, WALL_COLLISION_FACET_ID, WALL_COLLISION_PFT)
double precision, parameter half
logical, dimension(:), allocatable cut_cell_at
double precision function des_conduction_wall(OLAP, K_sol, K_wall, K_gas, TWall, TPart, Rpart, RLens, M)
double precision, dimension(:), allocatable area_cut
subroutine pic_search(IDX, lPOS, ENT_POS, lDIMN, lSTART, lEND)
character(len=line_length), dimension(line_count) err_msg
double precision, dimension(:), allocatable q_source
double precision, dimension(:,:), allocatable des_qw_cond
double precision function, dimension(dimn) get_collision(LLL, FACET_ID, WALL_COLLISION_FACET_ID, WALL_COLLISION_PFT)
subroutine write_stls_this_dg(DG, STL_TYPE)
subroutine grow_wall_collision(NEW_SIZE)
subroutine, public calc_dem_force_with_wall_stl
double precision, parameter pi
logical, dimension(:), allocatable blocked_cell_at
integer, dimension(dimension_bc) bc_i_e
double precision, parameter zero
subroutine flush_err_msg(DEBUG, HEADER, FOOTER, ABORT, LOG, CALL_TREE)
subroutine cfrelvel_wall(LL, VRN, VRT, NORM, DIST)