20 real(kind=kreal),
intent(in) :: xyz(3)
21 integer,
intent(in) :: etype
22 integer,
intent(in) :: nn
23 real(kind=kreal),
intent(in) :: elemt(:,:)
24 real(kind=kreal),
intent(in) :: reflen
26 logical,
intent(out) :: isin
27 real(kind=kreal),
intent(in) :: distclr
28 real(kind=kreal),
optional :: ctpos(2)
29 real(kind=kreal),
optional :: localclr
31 integer :: count,order
32 real(kind=kreal) :: determ, inverse(2,2)
33 real(kind=kreal) :: sfunc(nn), curv(3,2,2)
34 real(kind=kreal) :: r(2), dr(2), r_tmp(2)
35 real(kind=kreal) :: xyz_out(3)
36 real(kind=kreal) :: dist_last,dist_now, dxyz(3)
37 real(kind=kreal) :: tangent(3,2)
38 real(kind=kreal) :: df(2),d2f(2,2),normal(3)
39 real(kind=kreal),
parameter :: eps = 1.0d-8
40 real(kind=kreal) :: clr, tol, factor
43 if(
present( localclr ) ) clr=localclr
44 if(
present( ctpos ) )
then
53 xyz_out = matmul( elemt(1:3,1:nn), sfunc )
54 dxyz(1:3) = xyz_out(1:3) - xyz(1:3)
55 dist_last = dot_product( dxyz, dxyz(:) )
57 call tangentbase( etype, nn, r, elemt(1:3,1:nn), tangent )
58 call curvature( etype, nn, r, elemt(1:3,1:nn), curv )
61 df(1:2) = -matmul( dxyz(:), tangent(:,:) )
63 d2f(1,1)= dot_product( tangent(:,1), tangent(:,1) ) - dot_product( dxyz, curv(:,1,1) )
64 d2f(1,2)= dot_product( tangent(:,1), tangent(:,2) ) - dot_product( dxyz, curv(:,1,2) )
65 d2f(2,1)= dot_product( tangent(:,2), tangent(:,1) ) - dot_product( dxyz, curv(:,2,1) )
66 d2f(2,2)= dot_product( tangent(:,2), tangent(:,2) ) - dot_product( dxyz, curv(:,2,2) )
69 determ = d2f(1,1)*d2f(2,2) - d2f(1,2)*d2f(2,1)
70 if( determ==0.d0 ) stop
"Math error in contact searching"
71 inverse(1,1) = d2f(2,2) / determ
72 inverse(2,2) = d2f(1,1) / determ
73 inverse(1,2) = -d2f(1,2) / determ
74 inverse(2,1) = -d2f(2,1) / determ
77 tol=dot_product(dr,dr)
78 if( dsqrt(tol)> 3.d0 )
then
84 r_tmp(1:2) = r(1:2) + factor*dr(1:2)
86 xyz_out(1:3) = matmul( elemt(1:3,1:nn), sfunc(:) )
87 dxyz(1:3) = xyz(1:3)-xyz_out(:)
88 dist_now = dot_product( dxyz, dxyz )
89 if(dist_now <= dist_last)
exit
102 dxyz(:)=xyz_out(:)-xyz(:)
104 normal(:) = normal(:)/dsqrt( dot_product(normal, normal) )
106 if( dabs(normal(count))<1.d-10 ) normal(count) =0.d0
107 if( dabs(1.d0-dabs(normal(count)))<1.d-10 ) normal(count) =sign(1.d0, normal(count))
109 cstate%distance = dot_product( dxyz, normal )
111 if( cstate%interference_flag ==
c_if_slave)
then
112 if( cstate%init_pos == 0.d0 .and. cstate%distance < cstate%end_pos)
then
113 cstate%init_pos = cstate%distance
114 cstate%time_factor = (cstate%end_pos - cstate%distance) / cstate%time_factor
115 cstate%shrink_factor = cstate%distance
119 if( cstate%interference_flag == 0)
then
120 if( cstate%distance < distclr*reflen .and. cstate%distance > -5.0d-01*reflen ) isin = .true.
122 if( cstate%distance < cstate%shrink_factor + distclr*reflen ) isin = .true.
127 cstate%gpos(:)=xyz_out(:)
128 cstate%lpos(1:2)=r(:)
129 cstate%direction(:) = normal(:)
130 cstate%wkdist = cstate%distance
138 real(kind=kreal),
intent(in) :: xyz(3)
139 integer,
intent(in) :: etype
140 integer,
intent(in) :: nn
141 real(kind=kreal),
intent(in) :: elemt(:,:)
142 real(kind=kreal),
intent(in) :: reflen
144 logical,
intent(out) :: isin
145 real(kind=kreal),
intent(in) :: distclr
146 real(kind=kreal),
optional :: ctpos(3)
147 real(kind=kreal),
optional :: localclr
149 integer :: count,order
150 real(kind=kreal) :: inverse(3,3)
151 real(kind=kreal) :: sfunc(nn), deriv(nn,3)
152 real(kind=kreal) :: r(3), dr(3), r_tmp(3)
153 real(kind=kreal) :: xyz_out(3)
154 real(kind=kreal) :: dist_last,dist_now, dxyz(3)
155 real(kind=kreal),
parameter :: eps = 1.0d-8
156 real(kind=kreal) :: clr, tol, factor
159 if(
present( localclr ) ) clr=localclr
160 if(
present( ctpos ) )
then
169 xyz_out = matmul( elemt(1:3,1:nn), sfunc(1:nn) )
170 dxyz(1:3) = xyz_out(1:3) - xyz(1:3)
171 dist_last = dot_product( dxyz, dxyz(:) )
174 inverse(1:3,1:3) = matmul(elemt(1:3,1:nn),deriv(1:nn,1:3))
176 dr(1:3) = -matmul(inverse(1:3,1:3),dxyz(1:3))
178 tol=dot_product(dr,dr)
179 if( count > 1 .and. dsqrt(tol)> 3.d0 )
then
185 r_tmp(1:3) = r(1:3) + factor*dr(1:3)
187 xyz_out(1:3) = matmul( elemt(1:3,1:nn), sfunc(1:nn) )
188 dxyz(1:3) = xyz(1:3)-xyz_out(1:3)
189 dist_now = dot_product( dxyz, dxyz )
190 if(dist_now <= dist_last)
exit
191 factor = factor*0.7d0
200 dxyz(:)=xyz_out(:)-xyz(:)
201 cstate%distance = dsqrt(dot_product( dxyz, dxyz ))
203 if( cstate%distance < distclr ) isin = .true.
207 cstate%gpos(:)=xyz_out(:)
208 cstate%direction(:) = (/1.d0,0.d0,0.d0/)
209 cstate%lpos(1:3)=r(:)
217 real(kind=kreal),
intent(in) :: xyz(3)
218 type(tsurfelement),
intent(in) :: surf
219 real(kind=kreal),
intent(in) :: currpos(:)
221 logical,
intent(out) :: isin
222 real(kind=kreal),
intent(in) :: distclr
223 real(kind=kreal),
optional,
intent(in) :: ctpos(2)
224 real(kind=kreal),
optional,
intent(in) :: localclr
225 integer(kind=kint),
intent(in) :: smoothing
227 integer(kind=kint) :: nn, j, iss, etype_use, nn_use
228 real(kind=kreal) :: elem(3, l_max_elem_node)
229 real(kind=kreal) :: elem_tri3n(3, 3)
232 nn =
size(surf%nodes)
235 elem(1:3, j) = currpos(3*iss-2:3*iss)
240 elem_tri3n = elem(1:3, 1:3)
246 elem(1:3, nn+j) = surf%intermediate_points(1:3, j)
251 etype_use = surf%etype
255 etype_use = surf%etype
260 isin, distclr, ctpos, localclr)
266 real(kind=kreal),
intent(in) :: pos(2)
267 integer,
intent(in) :: etype
268 real(kind=kreal),
intent(in) :: ele(:,:)
269 real(kind=kreal),
intent(out) :: tensor(2,2)
272 real(kind=kreal) :: tangent(3,2)
275 tensor(1,1)= dot_product( tangent(:,1), tangent(:,1) )
276 tensor(1,2)= dot_product( tangent(:,1), tangent(:,2) )
277 tensor(2,1)= dot_product( tangent(:,2), tangent(:,1) )
278 tensor(2,2)= dot_product( tangent(:,2), tangent(:,2) )
284 real(kind=kreal),
intent(in) :: pos(2)
285 integer,
intent(in) :: etype
286 integer,
intent(in) :: nnode
287 real(kind=kreal),
intent(in) :: ele(3,nnode)
288 real(kind=kreal),
intent(out) :: tangent(3,2)
289 real(kind=kreal),
intent(out) :: tensor(2,2)
290 real(kind=kreal),
intent(out) :: matrix(2,nnode*3+3)
293 real(kind=kreal) :: det
294 real(kind=kreal) :: shapefunc(nnode), t1(nnode*3+3), t2(nnode*3+3)
295 call tangentbase( etype, nnode, pos, ele, tangent )
296 tensor(1,1)= dot_product( tangent(:,1), tangent(:,1) )
297 tensor(1,2)= dot_product( tangent(:,1), tangent(:,2) )
298 tensor(2,1)= dot_product( tangent(:,2), tangent(:,1) )
299 tensor(2,2)= dot_product( tangent(:,2), tangent(:,2) )
300 det = tensor(1,1)*tensor(2,2)-tensor(1,2)*tensor(2,1)
301 if( det==0.d0 ) stop
"Error in calculate DispIncreMatrix"
309 t1( j ) = tangent(j,1)
310 t2( j ) = tangent(j,2)
312 forall( i=1:nnode, j=1:3 )
313 t1( i*3+j ) = -tangent(j,1)*shapefunc(i)
314 t2( i*3+j ) = -tangent(j,2)*shapefunc(i)
317 matrix(1,:) = (tensor(2,2)*t1(:)-tensor(1,2)*t2(:))/det
318 matrix(2,:) = (tensor(1,1)*t2(:)-tensor(2,1)*t1(:))/det
319 tangent(:,1) = tangent(:,1)/dsqrt(dot_product(tangent(:,1),tangent(:,1)))
320 tangent(:,2) = tangent(:,2)/dsqrt(dot_product(tangent(:,2),tangent(:,2)))
325 integer,
intent(in) :: nslave
326 type(
tcontact ),
intent(inout) :: contact
327 real(kind=kreal),
intent(in) :: currpos(:)
329 integer(kind=kint) :: slave, sid0, etype, iSS
330 real(kind=kreal) :: coord(3)
334 slave = contact%slave(nslave)
335 coord(:) = currpos(3*slave-2:3*slave)
337 sid0 = contact%states(nslave)%surface
339 cstate_tmp = contact%states(nslave)
341 cstate_tmp, isin, contact%cparam%DISTCLR_NOCHECK, &
342 contact%states(nslave)%lpos, contact%cparam%CLR_SAME_ELEM, &
343 smoothing=contact%smoothing )
346 etype = contact%master(sid0)%etype
347 iss =
isinsideelement( etype, cstate_tmp%lpos, contact%cparam%CLR_CAL_NORM )
348 if( iss>0 .and. contact%smoothing /=
kcsnagata ) &
349 call cal_node_normal( cstate_tmp%surface, iss, contact%master, currpos, &
350 cstate_tmp%lpos, cstate_tmp%direction(:) )
353 contact%states(nslave)%direction = cstate_tmp%direction
360 integer,
intent(in) :: csurf
361 integer,
intent(in) :: isin
362 type(tsurfelement),
intent(in) :: surf(:)
363 real(kind=kreal),
intent(in) :: currpos(:)
364 real(kind=kreal),
intent(in) :: lpos(:)
365 real(kind=kreal),
intent(out) :: normal(3)
366 integer(kind=kint) :: cnode, i, j, cnt, nd1, gn, etype, iss, nn,
cgn
367 real(kind=kreal) :: cnpos(2), elem(3, l_max_elem_node)
368 integer(kind=kint) :: cnode1, cnode2, gn1, gn2, nsurf, cgn1, cgn2, isin_n
369 real(kind=kreal) :: x, normal_n(3), lpos_n(2)
371 if( 1 <= isin .and. isin <= 4 )
then
373 gn = surf(csurf)%nodes(cnode)
374 etype = surf(csurf)%etype
376 nn =
size( surf(csurf)%nodes )
378 iss = surf(csurf)%nodes(j)
379 elem(1:3,j)=currpos(3*iss-2:3*iss)
383 do i=1,surf(csurf)%n_neighbor
384 nd1 = surf(csurf)%neighbor(i)
385 nn =
size( surf(nd1)%nodes )
386 etype = surf(nd1)%etype
389 iss = surf(nd1)%nodes(j)
390 elem(1:3,j)=currpos(3*iss-2:3*iss)
397 normal = normal+normal_n
402 elseif( 12 <= isin .and. isin <= 41 )
then
404 cnode2 = mod(isin, 10)
405 gn1 = surf(csurf)%nodes(cnode1)
406 gn2 = surf(csurf)%nodes(cnode2)
407 etype = surf(csurf)%etype
408 nn =
size( surf(csurf)%nodes )
410 iss = surf(csurf)%nodes(j)
411 elem(1:3,j)=currpos(3*iss-2:3*iss)
415 case (fe_tri3n, fe_tri6n, fe_tri6nc)
416 if ( isin==12 ) then; x=lpos(2)-lpos(1)
417 elseif( isin==23 ) then; x=1.d0-2.d0*lpos(2)
418 elseif( isin==31 ) then; x=2.d0*lpos(1)-1.d0
419 else; stop
"Error: cal_node_normal: invalid isin"
421 case (fe_quad4n, fe_quad8n)
422 if ( isin==12 ) then; x=lpos(1)
423 elseif( isin==23 ) then; x=lpos(2)
424 elseif( isin==34 ) then; x=-lpos(1)
425 elseif( isin==41 ) then; x=-lpos(2)
426 else; stop
"Error: cal_node_normal: invalid isin"
431 neib_loop:
do i=1, surf(csurf)%n_neighbor
432 nd1 = surf(csurf)%neighbor(i)
433 nn =
size( surf(nd1)%nodes )
434 etype = surf(nd1)%etype
438 iss = surf(nd1)%nodes(j)
439 elem(1:3,j)=currpos(3*iss-2:3*iss)
440 if( iss==gn1 ) cgn1=j
441 if( iss==gn2 ) cgn2=j
443 if( cgn1>0 .and. cgn2>0 )
then
445 isin_n = 10*cgn2 + cgn1
448 case (fe_tri3n, fe_tri6n, fe_tri6nc)
449 if ( isin_n==12 ) then; lpos_n(1)=0.5d0*(1.d0-x); lpos_n(2)=0.5d0*(1.d0+x)
450 elseif( isin_n==23 ) then; lpos_n(1)=0.d0; lpos_n(2)=0.5d0*(1.d0-x)
451 elseif( isin_n==31 ) then; lpos_n(1)=0.5d0*(1.d0+x); lpos_n(2)=0.d0
452 else; stop
"Error: cal_node_normal: invalid isin_n"
454 case (fe_quad4n, fe_quad8n)
455 if ( isin_n==12 ) then; lpos_n(1)= x; lpos_n(2)=-1.d0
456 elseif( isin_n==23 ) then; lpos_n(1)= 1.d0; lpos_n(2)= x
457 elseif( isin_n==34 ) then; lpos_n(1)=-x; lpos_n(2)= 1.d0
458 elseif( isin_n==41 ) then; lpos_n(1)=-1.d0; lpos_n(2)=-x
459 else; stop
"Error: cal_node_normal: invalid isin_n"
464 normal = normal+normal_n
471 normal = normal/ dsqrt( dot_product( normal, normal ) )
This module encapsulate the basic functions of all elements provide by this software.
subroutine getshapefunc(fetype, localcoord, func)
Calculate the shape function in natural coordinate system.
integer(kind=kind(2)) function getnumberofnodes(etype)
Obtain number of nodes of the element.
integer function isinside3delement(fetype, localcoord, clearance)
if a point is inside a surface element -1: No; 0: Yes; >0: Node's (vertex) number
subroutine getelementcenter(fetype, localcoord)
Return natural coordinate of the center of element.
integer, parameter fe_tri6n
subroutine getshapederiv(fetype, localcoord, shapederiv)
Calculate derivatives of shape function in natural coordinate system.
subroutine getvertexcoord(fetype, cnode, localcoord)
Get the natural coord of a vertex node.
integer, parameter fe_tri3n
subroutine tangentbase(fetype, nn, localcoord, elecoord, tangent)
Calculate base vector of tangent space of 3d surface.
integer, parameter fe_quad4n
integer function isinsideelement(fetype, localcoord, clearance)
if a point is inside a surface element -1: No; 0: Yes; >0: Node's (vertex) number
real(kind=kreal) function, dimension(3) surfacenormal(fetype, nn, localcoord, elecoord)
Calculate normal of 3d-surface.
subroutine curvature(fetype, nn, localcoord, elecoord, l2ndderiv, normal, curv)
Calculate curvature tensor at a point along 3d surface.
integer, parameter fe_quad8n
This module provides aux functions.
subroutine calinverse(NN, A)
calculate inverse of matrix a