23 type(
tcontact),
intent(inout) :: contact
24 real(kind=kreal),
intent(in) :: diag(:)
25 integer(kind=kint),
intent(in) :: ndof
26 type(hecmwst_local_mesh),
intent(in) :: hecmesh
28 integer(kind=kint) :: j, slave_node, master_node, nnode, ctsurf
29 integer(kind=kint) :: idx_start, idx_end
30 real(kind=kreal) :: maxv
35 do j = 1,
size(contact%slave)
36 slave_node = contact%slave(j)
37 idx_start = ndof * (slave_node - 1) + 1
38 idx_end = ndof * slave_node
39 maxv = max(maxv, maxval(diag(idx_start:idx_end)))
43 do ctsurf = 1,
size(contact%master)
44 nnode =
size(contact%master(ctsurf)%nodes)
46 master_node = contact%master(ctsurf)%nodes(j)
47 idx_start = ndof * (master_node - 1) + 1
48 idx_end = ndof * master_node
49 maxv = max(maxv, maxval(diag(idx_start:idx_end)))
54 call hecmw_allreduce_r1(hecmesh, maxv, hecmw_max)
57 contact%refStiff = maxv
60 if (hecmw_comm_get_rank() == 0)
then
61 write(*,
'(A,A,A,1pE12.3,A,1pE12.3,A,1pE12.3)')
" Contact [", &
62 trim(contact%pair_name),
"] set penalty: normal & tied ", &
63 contact%nPenalty * contact%refStiff,
", tangential ", &
64 contact%tPenalty * contact%refStiff,
", refStiff ", contact%refStiff
71 integer(kind=kint),
intent(in) :: nnode
72 integer(kind=kint),
intent(in) :: ndLocal(nnode + 1)
73 integer(kind=kint),
intent(in) :: id_lagrange
74 real(kind=kreal),
intent(in) :: ctnforce((nnode+1)*3+1)
75 real(kind=kreal),
intent(in) :: cttforce((nnode+1)*3+1)
76 type(hecmwst_matrix),
intent(inout) :: conmat
78 integer(kind=kint) :: i, inod, idx
83 conmat%B(idx:idx+2) = conmat%B(idx:idx+2) + ctnforce((i-1)*3+1:(i-1)*3+3) + cttforce((i-1)*3+1:(i-1)*3+3)
86 if( id_lagrange > 0 )
then
87 conmat%B(conmat%NP*conmat%NDOF+id_lagrange) = ctnforce((nnode+1)*3+1) + cttforce((nnode+1)*3+1)
94 integer(kind=kint),
intent(in) :: nnode
95 integer(kind=kint),
intent(in) :: ndlocal(nnode + 1)
96 real(kind=kreal),
intent(in) :: ctnforce((nnode+1)*3+1)
97 real(kind=kreal),
intent(in) :: cttforce((nnode+1)*3+1)
98 real(kind=kreal),
pointer,
intent(inout) :: cont_nforce(:)
99 real(kind=kreal),
pointer,
optional,
intent(inout) :: cont_fric(:)
101 integer(kind=kint) :: i, inod, idx
106 cont_nforce(idx:idx+2) = cont_nforce(idx:idx+2) + ctnforce((i-1)*3+1:(i-1)*3+3)
107 if(
present(cont_fric) ) cont_fric(idx:idx+2) = cont_fric(idx:idx+2) + cttforce((i-1)*3+1:(i-1)*3+3)
115 hecMESH, hecLagMAT, gnt, ctchanged )
116 integer(kind=kint),
intent(in) :: ctAlgo
117 type(
tcontact ),
intent(inout) :: contact
118 real(kind=kreal),
intent(in) :: coord(:)
119 real(kind=kreal),
intent(in) :: disp(:)
120 real(kind=kreal),
intent(in) :: ddisp(:)
121 real(kind=kreal),
intent(in) :: fcoeff
122 type(hecmwst_local_mesh),
intent(in) :: hecmesh
123 type(hecmwst_matrix_lagrange),
intent(in) :: hecLagMAT
124 real(kind=kreal),
intent(out) ::
gnt(2)
125 logical,
intent(inout) :: ctchanged
127 integer(kind=kint) :: slave, etype, master
128 integer(kind=kint) :: nn, i, cnt
129 real(kind=kreal) :: lgnt(2)
130 integer(kind=kint) :: ndLocal(l_max_elem_node+1)
131 real(kind=kreal) :: ctnforce(l_max_elem_node*3+3)
132 real(kind=kreal) :: cttforce(l_max_elem_node*3+3)
133 real(kind=kreal) :: max_jump_ratio, jump_ratio_local
134 real(kind=kreal) :: mut_old, mut_new, threthold
138 max_jump_ratio = 0.0d0
140 do i = 1,
size(contact%slave)
143 slave = contact%slave(i)
144 master = contact%states(i)%surface
145 nn =
size(contact%master(master)%nodes)
146 etype = contact%master(master)%etype
149 ndlocal(2:nn+1) = contact%master(master)%nodes(1:nn)
153 contact%nPenalty * contact%refStiff, contact%tPenalty * contact%refStiff, &
154 fcoeff, contact%master(master), lgnt, ctchanged, ctnforce, cttforce, jump_ratio_local, contact%smoothing)
157 max_jump_ratio = max(max_jump_ratio, jump_ratio_local)
162 if(cnt > 0) lgnt(:) = lgnt(:) / cnt
165 call hecmw_allreduce_r1(hecmesh, max_jump_ratio, hecmw_max)
169 if (max_jump_ratio > threthold)
then
170 mut_old = contact%tPenalty * contact%refStiff
171 contact%tPenalty = contact%tPenalty * max(1.d0/dsqrt(threthold), 1.0d0/dsqrt(max_jump_ratio))
172 mut_new = contact%tPenalty * contact%refStiff
173 if (hecmw_comm_get_rank() == 0)
then
174 write(*,
'(A,A,A,1pE12.3,A,1pE12.3,A)')
" Contact [", trim(contact%pair_name), &
175 "] tangential penalty adjusted: ", mut_old,
" -> ", mut_new,
" (friction jump)"
184 type(
tcontact ),
intent(inout) :: contact
185 real(kind=kreal),
intent(in) :: disp(:)
186 real(kind=kreal),
intent(in) :: ddisp(:)
187 logical,
intent(inout) :: ctchanged
189 integer(kind=kint) :: slave, etype, master
190 integer(kind=kint) :: nn, i, j, iss
191 real(kind=kreal) :: dg(3), dgmax
192 real(kind=kreal) :: shapefunc(l_max_surface_node)
193 real(kind=kreal) :: edisp(3*l_max_elem_node+3)
194 real(kind=kreal) :: mu
197 mu = contact%nPenalty * contact%refStiff
199 do i= 1,
size(contact%slave)
201 slave = contact%slave(i)
202 edisp(1:3) = disp(3*slave-2:3*slave)+ddisp(3*slave-2:3*slave)
203 master = contact%states(i)%surface
205 nn =
size( contact%master(master)%nodes )
206 etype = contact%master(master)%etype
208 iss = contact%master(master)%nodes(j)
209 edisp(3*j+1:3*j+3) = disp(3*iss-2:3*iss)+ddisp(3*iss-2:3*iss)
211 call getshapefunc( etype, contact%states(i)%lpos(1:2), shapefunc )
216 dg(1:3) = dg(1:3)-shapefunc(j)*edisp(3*j+1:3*j+3)
219 contact%states(i)%multiplier(1:3) = contact%states(i)%multiplier(1:3) + mu*dg(1:3)
224 dgmax = dgmax + dabs(edisp(j))
226 dgmax = dgmax/dble((nn+1)*3)
228 if( dabs(dg(j))/dmax1(1.d0,dgmax) > 1.d-3 ) ctchanged = .true.
235 type(
tcontact ),
intent(inout) :: contact
237 integer(kind=kint) :: i
239 do i= 1,
size(contact%slave)
241 contact%states(i)%tangentForce(1:3) = 0.d0
242 contact%states(i)%tangentForce_trial(1:3) = 0.d0
243 contact%states(i)%tangentForce_final(1:3) = 0.d0
245 contact%states(i)%tangentForce(1:3) = contact%states(i)%tangentForce_final(1:3)
247 contact%states(i)%tangentForce1(1:3) = contact%states(i)%tangentForce(1:3)
255 integer(kind=kint),
intent(in) :: ctalgo
256 type(
tcontact),
intent(inout) :: contact
257 real(kind=kreal),
intent(in) :: coord(:)
258 real(kind=kreal),
intent(in) :: disp(:)
259 real(kind=kreal),
intent(in) :: ddisp(:)
260 integer(kind=kint),
intent(in) :: iter
261 real(kind=kreal),
intent(in) :: lagrange_array(:)
262 type(hecmwst_matrix),
intent(inout) :: conmat
263 type(hecmwst_matrix_lagrange),
intent(inout) :: hecLagMAT
265 integer(kind=kint) :: ctsurf, nnode, ndLocal(21), etype
266 integer(kind=kint) :: j, k, algtype, id_lagrange
267 real(kind=kreal) :: lagrange
268 real(kind=kreal) :: stiffness((l_max_surface_node+1)*3+1, (l_max_surface_node+1)*3+1)
269 real(kind=kreal) :: elecoord(3, l_max_surface_node)
270 real(kind=kreal) :: eledisp(l_max_surface_node*3+3)
271 real(kind=kreal) :: force(l_max_surface_node*3+3)
272 logical :: is_contact_active_flag, is_damping_active_flag
274 algtype = contact%algtype
276 do j = 1,
size(contact%slave)
281 is_damping_active_flag = contact%states(j)%state ==
contactnear .and. &
284 if( .not. is_contact_active_flag .and. .not. is_damping_active_flag ) cycle
286 ctsurf = contact%states(j)%surface
287 etype = contact%master(ctsurf)%etype
288 nnode =
size(contact%master(ctsurf)%nodes)
289 ndlocal(1) = contact%slave(j)
290 ndlocal(2:nnode+1) = contact%master(ctsurf)%nodes(1:nnode)
294 elecoord(1:3, k) = coord(3*ndlocal(k+1)-2:3*ndlocal(k+1)) + disp(3*ndlocal(k+1)-2:3*ndlocal(k+1))
297 if( is_contact_active_flag )
then
302 id_lagrange = heclagmat%lag_node_table(ndlocal(1)) - 1
303 id_lagrange = id_lagrange + 1
304 lagrange = lagrange_array(id_lagrange)
305 call getcontactstiffness_slag(contact%states(j), contact%master(ctsurf), iter, &
306 contact%tPenalty, contact%fcoeff, lagrange, stiffness, smoothing_type=contact%smoothing)
309 call hecmw_mat_ass_contactlag(nnode, ndlocal, id_lagrange, contact%fcoeff, stiffness, conmat, heclagmat)
313 eledisp(1:3) = ddisp(3*ndlocal(1)-2:3*ndlocal(1))
315 eledisp(k*3+1:k*3+3) = ddisp(3*ndlocal(k+1)-2:3*ndlocal(k+1))
318 contact%nPenalty * contact%refStiff, contact%tPenalty * contact%refStiff, &
319 contact%fcoeff, contact%symmetric, stiffness, force, &
320 smoothing_type=contact%smoothing, edisp=eledisp(1:nnode*3+3), iter=iter)
323 call hecmw_mat_ass_elem(conmat, nnode+1, ndlocal, stiffness)
330 id_lagrange = heclagmat%lag_node_table(ndlocal(1)) - 1
332 id_lagrange = id_lagrange + 1
333 lagrange = lagrange_array(id_lagrange)
335 call gettiedstiffness_slag(contact%states(j), contact%master(ctsurf), k, stiffness, &
338 call hecmw_mat_ass_contactlag(nnode, ndlocal, id_lagrange, 0.d0, stiffness, conmat, heclagmat)
343 contact%nPenalty * contact%refStiff, stiffness, force)
346 call hecmw_mat_ass_elem(conmat, nnode+1, ndlocal, stiffness)
352 else if( is_damping_active_flag )
then
354 contact%damp_alpha * contact%refStiff, contact%damp_gact, &
355 stiffness, smoothing_type=contact%smoothing)
358 call hecmw_mat_ass_elem(conmat, nnode+1, ndlocal, stiffness)
371 conMAT, CONT_NFORCE, CONT_FRIC, hecLagMAT )
372 integer(kind=kint),
intent(in) :: purpose
373 integer(kind=kint),
intent(in) :: ctAlgo
374 type(
tcontact ),
intent(inout) :: contact
375 real(kind=kreal),
intent(in) :: coord(:)
376 real(kind=kreal),
intent(in) :: disp(:)
377 real(kind=kreal),
intent(in) :: ddisp(:)
378 real(kind=kreal),
intent(in) :: lagrange_array(:)
379 type(hecmwst_matrix),
intent(inout) :: conmat
380 real(kind=kreal),
pointer :: cont_nforce(:)
381 real(kind=kreal),
pointer :: cont_fric(:)
382 type(hecmwst_matrix_lagrange),
intent(in) :: heclagmat
384 integer(kind=kint) :: ctsurf, nnode, ndlocal(21)
385 integer(kind=kint) :: j, k, algtype, id_lagrange
386 real(kind=kreal) :: ndcoord(21*3)
387 real(kind=kreal) :: ndu(21*3), nddu(21*3)
388 real(kind=kreal) :: lagrange
389 real(kind=kreal) :: ctnforce(21*3+1)
390 real(kind=kreal) :: cttforce(21*3+1)
391 real(kind=kreal) :: mu_n, mu_t
393 logical :: is_contact_active_flag, is_damping_active_flag
394 real(kind=kreal) :: ctime,
etime
395 integer(kind=kint) :: if_type
397 algtype = contact%algtype
398 if_flag = (contact%if_type /= 0)
400 ctime = contact%ctime
401 etime = contact%if_etime
402 if_type = contact%if_type
405 do j = 1,
size(contact%slave)
413 if( .not. is_contact_active_flag .and. .not. is_damping_active_flag ) cycle
415 ctsurf = contact%states(j)%surface
416 nnode =
size(contact%master(ctsurf)%nodes)
417 ndlocal(1) = contact%slave(j)
418 ndlocal(2:nnode+1) = contact%master(ctsurf)%nodes(1:nnode)
420 nddu((k-1)*3+1:(k-1)*3+3) = ddisp((ndlocal(k)-1)*3+1:(ndlocal(k)-1)*3+3)
421 ndu((k-1)*3+1:(k-1)*3+3) = disp((ndlocal(k)-1)*3+1:(ndlocal(k)-1)*3+3) + nddu((k-1)*3+1:(k-1)*3+3)
422 ndcoord((k-1)*3+1:(k-1)*3+3) = coord((ndlocal(k)-1)*3+1:(ndlocal(k)-1)*3+3) + ndu((k-1)*3+1:(k-1)*3+3)
425 if( is_contact_active_flag )
then
434 mu_n = contact%nPenalty * contact%refStiff
435 mu_t = contact%tPenalty * contact%refStiff
443 id_lagrange = heclagmat%lag_node_table(ndlocal(1)) - 1
444 id_lagrange = id_lagrange + 1
445 lagrange = lagrange_array(id_lagrange)
446 call getcontactnodalforce_slag(contact%states(j),contact%master(ctsurf),ndcoord,nddu, &
447 contact%tPenalty,contact%fcoeff,lagrange,ctnforce,cttforce,.true.,contact%smoothing)
453 mu_n, mu_t, contact%fcoeff,lagrange,ctnforce,cttforce,.true.,contact%smoothing)
467 id_lagrange = heclagmat%lag_node_table(ndlocal(1)) - 1
469 id_lagrange = id_lagrange + 1
470 lagrange = lagrange_array(id_lagrange)
471 contact%states(j)%multiplier(k) = lagrange
473 call gettiednodalforce_slag(contact%states(j),contact%master(ctsurf),k,ndu, &
474 & lagrange,ctnforce,cttforce,contact%smoothing)
485 mu_n, ctnforce,cttforce)
496 else if( is_damping_active_flag )
then
499 contact%damp_alpha * contact%refStiff, contact%damp_gact, &
500 ctnforce, cttforce, smoothing_type=contact%smoothing)
This module defines common data and basic structures for analysis.
integer(kind=kint), parameter kcaslagrange
contact analysis algorithm
integer(kind=kint), parameter kcaalagrange