27 USE discretelement
, only: dimn
33 double precision,
intent(in),
dimension(3,3) :: points
34 double precision,
intent(in),
dimension(dimn) :: pointp
35 double precision,
intent(out),
dimension(dimn) :: closest_point
37 double precision,
dimension(3) :: pointa, pointb, pointc
38 double precision,
dimension(dimn) :: ab, ac, ap, bp,cp
39 double precision :: d1, d2, d3, d4, vc, v, d5, d6, vb, w, va, denom
48 d1 = dot_product(ab, ap)
49 d2 = dot_product(ac, ap)
52 closest_point = pointa
58 d3 = dot_product(ab, bp);
59 d4 = dot_product(ac, bp);
60 if (d3 >=
zero .and. d4 <= d3)
then 61 closest_point = pointb
69 closest_point = pointa + v * ab;
75 d5 = dot_product(ab, cp)
76 d6 = dot_product(ac, cp)
77 if (d6 >=
zero .and. d5 <= d6)
then 78 closest_point = pointc
87 closest_point = pointa + w * ac
93 if (va <=
zero .and.(d4 - d3) >=
zero .and. (d5 - d6) >=
zero)
then 94 w = (d4 - d3) / ((d4 - d3) + (d5 - d6))
95 closest_point = pointb + w * (pointc - pointb)
101 denom =
one / (va + vb + vc)
104 closest_point = pointa + ab * v + ac * w;
119 norm_plane, line_param)
121 USE discretelement
, only: dimn
127 DOUBLE PRECISION,
INTENT(IN) :: REF_LINE(3), DIR_LINE(3)
129 DOUBLE PRECISION,
INTENT(IN) :: REF_PLANE(3), NORM_PLANE(3)
132 double precision,
intent(out) :: line_param
135 double precision :: denom
137 denom = dot_product(dir_line, norm_plane)
139 if(denom*denom.gt.
zero)
then 140 line_param = dot_product(ref_plane-ref_line, norm_plane)
141 line_param = line_param/denom
164 DOUBLE PRECISION,
INTENT(IN) :: pCENTER(3), pHALFSIZE(3)
165 DOUBLE PRECISION,
INTENT(IN) :: pVERTS(3,3)
166 LOGICAL,
INTENT(OUT) :: pOVERLAP
168 DOUBLE PRECISION :: v0(3), v1(3), v2(3)
169 DOUBLE PRECISION :: fex, fey, fez
170 DOUBLE PRECISION :: normal(3), e0(3), e1(3), e2(3)
174 v0 = pverts(1,:) - pcenter
175 v1 = pverts(2,:) - pcenter
176 v2 = pverts(3,:) - pcenter
186 if(
atest_x01(e0(3),e0(2),fez,fey))
return 187 if(
atest_y02(e0(3),e0(1),fez,fex))
return 188 if(
atest_z12(e0(2),e0(1),fey,fex))
return 194 if(
atest_x01(e1(3),e1(2),fez,fey))
return 195 if(
atest_y02(e1(3),e1(1),fez,fex))
return 196 if(
atest_z0(e1(2),e1(1),fey,fex))
return 202 if(
atest_x2(e2(3),e2(2),fez,fey))
return 203 if(
atest_y1(e2(3),e2(1),fez,fex))
return 204 if(
atest_z12(e2(2),e2(1),fey,fex))
return 206 if(
findmin(v0(1),v1(1),v2(1)) > phalfsize(1) .OR. &
207 findmax(v0(1),v1(1),v2(1)) <-phalfsize(1))
return 209 if(
findmin(v0(2),v1(2),v2(2)) > phalfsize(2) .OR. &
210 findmax(v0(2),v1(2),v2(2)) <-phalfsize(2))
return 212 if(
findmin(v0(3),v1(3),v2(3)) > phalfsize(3) .OR. &
213 findmax(v0(3),v1(3),v2(3)) <-phalfsize(3))
return 216 normal(1) = e0(2)*e1(3)-e0(3)*e1(2)
217 normal(2) = e0(3)*e1(1)-e0(1)*e1(3)
218 normal(3) = e0(1)*e1(2)-e0(2)*e1(1)
234 double precision :: norm(3), vert(3), maxbox(3)
237 double precision :: vmin(3), vmax(3), v
241 if(norm(lc) > 0.0d0)
then 242 vmin(lc) = -maxbox(lc) - v
243 vmax(lc) = maxbox(lc) - v
245 vmin(lc) = maxbox(lc) - v
246 vmax(lc) =-maxbox(lc) - v
250 if(dot_product(norm,vmin) > 0.0d0)
then 253 elseif(dot_product(norm,vmax) >= 0.0d0)
then 268 DOUBLE PRECISION FUNCTION findmin(x0,x1,x2)
270 double precision :: x0,x1,x2
284 DOUBLE PRECISION FUNCTION findmax(x0,x1,x2)
286 double precision :: x0,x1,x2
302 double precision :: a, b, fa, fb
303 double precision :: lMin, lMax, p0, p2, rad
305 p0 = a*v0(2) - b*v0(3)
306 p2 = a*v2(2) - b*v2(3)
308 if(p0<p2) then; lmin=p0; lmax=p2
309 else; lmin=p2; lmax=p0;
endif 311 rad=fa*phalfsize(2) + fb*phalfsize(3)
320 LOGICAL FUNCTION atest_x2(a,b,fa,fb)
322 double precision :: a, b, fa, fb
323 double precision :: lMin, lMax, p0, p1, rad
325 p0 = a*v0(2) - b*v0(3)
326 p1 = a*v1(2) - b*v1(3)
328 if(p0<p1) then; lmin=p0; lmax=p1
329 else; lmin=p1; lmax=p0;
endif 331 rad=fa*phalfsize(2) + fb*phalfsize(3)
342 double precision :: a, b, fa, fb
343 double precision :: lMin, lMax, p0, p2, rad
345 p0 = -a*v0(1) + b*v0(3)
346 p2 = -a*v2(1) + b*v2(3)
348 if(p0<p2) then; lmin=p0; lmax=p2
349 else; lmin=p2; lmax=p0;
endif 351 rad=fa*phalfsize(1) + fb*phalfsize(3)
360 LOGICAL FUNCTION atest_y1(a,b,fa,fb)
362 double precision :: a, b, fa, fb
363 double precision :: lMin, lMax, p0, p1, rad
365 p0 = -a*v0(1) + b*v0(3)
366 p1 = -a*v1(1) + b*v1(3)
368 if(p0<p1) then; lmin=p0; lmax=p1
369 else; lmin=p1; lmax=p0;
endif 371 rad=fa*phalfsize(1) + fb*phalfsize(3)
382 double precision :: a, b, fa, fb
383 double precision :: lMin, lMax, p1, p2, rad
385 p1 = a*v1(1) - b*v1(2)
386 p2 = a*v2(1) - b*v2(2)
388 if(p2<p1) then; lmin=p2; lmax=p1
389 else; lmin=p1; lmax=p2;
endif 391 rad=fa*phalfsize(1) + fb*phalfsize(2)
400 LOGICAL FUNCTION atest_z0(a,b,fa,fb)
402 double precision :: a, b, fa, fb
403 double precision :: lMin, lMax, p0, p1, rad
405 p0 = a*v0(1) - b*v0(2)
406 p1 = a*v1(1) - b*v1(2)
408 if(p0<p1) then; lmin=p0; lmax=p1
409 else; lmin=p1; lmax=p0;
endif 411 rad=fa*phalfsize(1) + fb*phalfsize(2)
437 USE discretelement
, ONLY: dimn, xe, yn, zt, max_radius
447 DOUBLE PRECISION,
INTENT(IN) :: POS(dimn)
448 INTEGER,
INTENT(IN) :: fI, fJ, fK
449 LOGICAL,
INTENT(OUT) :: REMOVE
452 INTEGER :: I1, I2, J1, J2, K1, K2
454 INTEGER I, J, K, IJK, NF, LC
456 DOUBLE PRECISION :: LINE_T
457 DOUBLE PRECISION :: RADSQ, DIST(3)
459 double precision :: vv(3)
472 radsq = (1.05d0*max_radius)**2
493 IF(line_t >
zero .OR. dot_product(dist,dist)<=radsq)
RETURN logical function planeboxoverlap(norm, vert, maxbox)
subroutine tri_box_overlap(pCENTER, pHALFSIZE, pVERTS, pOVERLAP)
type(facets_to_dg), dimension(:), allocatable facets_at_dg
logical function atest_y02(a, b, fa, fb)
subroutine closestptpointtriangle(pointp, points, closest_point)
logical function dg_is_on_mype_plus1layers(lI, lJ, lK)
double precision, parameter one
subroutine check_if_particle_overlaps_stl(POS, fI, fJ, fK, REMOVE)
logical function atest_x2(a, b, fa, fb)
double precision, dimension(3, 3, dim_stl) vertex
subroutine intersectlnplane(ref_line, dir_line, ref_plane, norm_plane, line_param)
logical function atest_z12(a, b, fa, fb)
logical function atest_z0(a, b, fa, fb)
integer function iofpos(fpos)
double precision, dimension(3, dim_stl) norm_face
double precision function findmin(x0, x1, x2)
integer function kofpos(fpos)
integer function dg_funijk(fi, fj, fk)
integer function jofpos(fpos)
logical function atest_x01(a, b, fa, fb)
double precision function findmax(x0, x1, x2)
double precision, parameter zero
logical function atest_y1(a, b, fa, fb)