22 type(
tcontact),
intent(inout) :: contact
23 real(kind=kreal),
intent(in) :: diag(:)
24 integer(kind=kint),
intent(in) :: ndof
25 type(hecmwst_local_mesh),
intent(in) :: hecmesh
27 integer(kind=kint) :: j, slave_node, master_node, nnode, ctsurf
28 integer(kind=kint) :: idx_start, idx_end
29 real(kind=kreal) :: maxv
34 do j = 1,
size(contact%slave)
35 slave_node = contact%slave(j)
36 idx_start = ndof * (slave_node - 1) + 1
37 idx_end = ndof * slave_node
38 maxv = max(maxv, maxval(diag(idx_start:idx_end)))
42 do ctsurf = 1,
size(contact%master)
43 nnode =
size(contact%master(ctsurf)%nodes)
45 master_node = contact%master(ctsurf)%nodes(j)
46 idx_start = ndof * (master_node - 1) + 1
47 idx_end = ndof * master_node
48 maxv = max(maxv, maxval(diag(idx_start:idx_end)))
53 call hecmw_allreduce_r1(hecmesh, maxv, hecmw_max)
56 contact%refStiff = maxv
59 if (hecmw_comm_get_rank() == 0)
then
60 write(*,
'(A,A,A,1pE12.3,A,1pE12.3,A,1pE12.3)')
" Contact [", &
61 trim(contact%pair_name),
"] set penalty: normal & tied ", &
62 contact%nPenalty * contact%refStiff,
", tangential ", &
63 contact%tPenalty * contact%refStiff,
", refStiff ", contact%refStiff
70 integer(kind=kint),
intent(in) :: nnode
71 integer(kind=kint),
intent(in) :: ndLocal(nnode + 1)
72 integer(kind=kint),
intent(in) :: id_lagrange
73 real(kind=kreal),
intent(in) :: ctnforce((nnode+1)*3+1)
74 real(kind=kreal),
intent(in) :: cttforce((nnode+1)*3+1)
75 type(hecmwst_matrix),
intent(inout) :: conmat
77 integer(kind=kint) :: i, inod, idx
82 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)
85 if( id_lagrange > 0 )
then
86 conmat%B(conmat%NP*conmat%NDOF+id_lagrange) = ctnforce((nnode+1)*3+1) + cttforce((nnode+1)*3+1)
93 integer(kind=kint),
intent(in) :: nnode
94 integer(kind=kint),
intent(in) :: ndlocal(nnode + 1)
95 real(kind=kreal),
intent(in) :: ctnforce((nnode+1)*3+1)
96 real(kind=kreal),
intent(in) :: cttforce((nnode+1)*3+1)
97 real(kind=kreal),
pointer,
intent(inout) :: cont_nforce(:)
98 real(kind=kreal),
pointer,
optional,
intent(inout) :: cont_fric(:)
100 integer(kind=kint) :: i, inod, idx
105 cont_nforce(idx:idx+2) = cont_nforce(idx:idx+2) + ctnforce((i-1)*3+1:(i-1)*3+3)
106 if(
present(cont_fric) ) cont_fric(idx:idx+2) = cont_fric(idx:idx+2) + cttforce((i-1)*3+1:(i-1)*3+3)
114 hecMESH, hecLagMAT, gnt, ctchanged )
115 integer(kind=kint),
intent(in) :: ctAlgo
116 type(
tcontact ),
intent(inout) :: contact
117 real(kind=kreal),
intent(in) :: coord(:)
118 real(kind=kreal),
intent(in) :: disp(:)
119 real(kind=kreal),
intent(in) :: ddisp(:)
120 real(kind=kreal),
intent(in) :: fcoeff
121 type(hecmwst_local_mesh),
intent(in) :: hecmesh
122 type(hecmwst_matrix_lagrange),
intent(in) :: hecLagMAT
123 real(kind=kreal),
intent(out) ::
gnt(2)
124 logical,
intent(inout) :: ctchanged
126 integer(kind=kint) :: slave, etype, master
127 integer(kind=kint) :: nn, i, cnt
128 real(kind=kreal) :: lgnt(2)
129 integer(kind=kint) :: ndLocal(l_max_elem_node+1)
130 real(kind=kreal) :: ctnforce(l_max_elem_node*3+3)
131 real(kind=kreal) :: cttforce(l_max_elem_node*3+3)
132 real(kind=kreal) :: max_jump_ratio, jump_ratio_local
133 real(kind=kreal) :: mut_old, mut_new, threthold
137 max_jump_ratio = 0.0d0
139 do i = 1,
size(contact%slave)
142 slave = contact%slave(i)
143 master = contact%states(i)%surface
144 nn =
size(contact%master(master)%nodes)
145 etype = contact%master(master)%etype
148 ndlocal(2:nn+1) = contact%master(master)%nodes(1:nn)
152 contact%nPenalty * contact%refStiff, contact%tPenalty * contact%refStiff, &
153 fcoeff, etype, lgnt, ctchanged, ctnforce, cttforce, jump_ratio_local)
156 max_jump_ratio = max(max_jump_ratio, jump_ratio_local)
161 if(cnt > 0) lgnt(:) = lgnt(:) / cnt
164 call hecmw_allreduce_r1(hecmesh, max_jump_ratio, hecmw_max)
168 if (max_jump_ratio > threthold)
then
169 mut_old = contact%tPenalty * contact%refStiff
170 contact%tPenalty = contact%tPenalty * max(1.d0/dsqrt(threthold), 1.0d0/dsqrt(max_jump_ratio))
171 mut_new = contact%tPenalty * contact%refStiff
172 if (hecmw_comm_get_rank() == 0)
then
173 write(*,
'(A,A,A,1pE12.3,A,1pE12.3,A)')
" Contact [", trim(contact%pair_name), &
174 "] tangential penalty adjusted: ", mut_old,
" -> ", mut_new,
" (friction jump)"
183 type(
tcontact ),
intent(inout) :: contact
184 real(kind=kreal),
intent(in) :: disp(:)
185 real(kind=kreal),
intent(in) :: ddisp(:)
186 logical,
intent(inout) :: ctchanged
188 integer(kind=kint) :: slave, etype, master
189 integer(kind=kint) :: nn, i, j, iss
190 real(kind=kreal) :: dg(3), dgmax
191 real(kind=kreal) :: shapefunc(l_max_surface_node)
192 real(kind=kreal) :: edisp(3*l_max_elem_node+3)
193 real(kind=kreal) :: mu
196 mu = contact%nPenalty * contact%refStiff
198 do i= 1,
size(contact%slave)
200 slave = contact%slave(i)
201 edisp(1:3) = disp(3*slave-2:3*slave)+ddisp(3*slave-2:3*slave)
202 master = contact%states(i)%surface
204 nn =
size( contact%master(master)%nodes )
205 etype = contact%master(master)%etype
207 iss = contact%master(master)%nodes(j)
208 edisp(3*j+1:3*j+3) = disp(3*iss-2:3*iss)+ddisp(3*iss-2:3*iss)
210 call getshapefunc( etype, contact%states(i)%lpos(1:2), shapefunc )
215 dg(1:3) = dg(1:3)-shapefunc(j)*edisp(3*j+1:3*j+3)
218 contact%states(i)%multiplier(1:3) = contact%states(i)%multiplier(1:3) + mu*dg(1:3)
223 dgmax = dgmax + dabs(edisp(j))
225 dgmax = dgmax/dble((nn+1)*3)
227 if( dabs(dg(j))/dmax1(1.d0,dgmax) > 1.d-3 ) ctchanged = .true.
234 type(
tcontact ),
intent(inout) :: contact
236 integer(kind=kint) :: i
238 do i= 1,
size(contact%slave)
240 contact%states(i)%tangentForce(1:3) = 0.d0
241 contact%states(i)%tangentForce_trial(1:3) = 0.d0
242 contact%states(i)%tangentForce_final(1:3) = 0.d0
244 contact%states(i)%tangentForce(1:3) = contact%states(i)%tangentForce_final(1:3)
246 contact%states(i)%tangentForce1(1:3) = contact%states(i)%tangentForce(1:3)
254 integer(kind=kint),
intent(in) :: ctalgo
255 type(
tcontact),
intent(inout) :: contact
256 real(kind=kreal),
intent(in) :: coord(:)
257 real(kind=kreal),
intent(in) :: disp(:)
258 integer(kind=kint),
intent(in) :: iter
259 real(kind=kreal),
intent(in) :: lagrange_array(:)
260 type(hecmwst_matrix),
intent(inout) :: conmat
261 type(hecmwst_matrix_lagrange),
intent(inout) :: hecLagMAT
263 integer(kind=kint) :: ctsurf, nnode, ndLocal(21), etype
264 integer(kind=kint) :: j, k, algtype, id_lagrange
265 real(kind=kreal) :: lagrange
266 real(kind=kreal) :: stiffness((l_max_surface_node+1)*3+1, (l_max_surface_node+1)*3+1)
267 real(kind=kreal) :: elecoord(3, l_max_surface_node)
268 real(kind=kreal) :: force(l_max_surface_node*3+3)
270 algtype = contact%algtype
272 do j = 1,
size(contact%slave)
276 ctsurf = contact%states(j)%surface
277 etype = contact%master(ctsurf)%etype
278 nnode =
size(contact%master(ctsurf)%nodes)
279 ndlocal(1) = contact%slave(j)
280 ndlocal(2:nnode+1) = contact%master(ctsurf)%nodes(1:nnode)
284 elecoord(1:3, k) = coord(3*ndlocal(k+1)-2:3*ndlocal(k+1)) + disp(3*ndlocal(k+1)-2:3*ndlocal(k+1))
290 id_lagrange = heclagmat%lag_node_table(ndlocal(1)) - 1
291 id_lagrange = id_lagrange + 1
292 lagrange = lagrange_array(id_lagrange)
293 call getcontactstiffness_slag(contact%states(j), contact%master(ctsurf), iter, &
294 contact%tPenalty, contact%fcoeff, lagrange, stiffness)
297 call hecmw_mat_ass_contactlag(nnode, ndlocal, id_lagrange, contact%fcoeff, stiffness, conmat, heclagmat)
301 contact%nPenalty * contact%refStiff, contact%tPenalty * contact%refStiff, &
302 contact%fcoeff, contact%symmetric, stiffness, force)
305 call hecmw_mat_ass_elem(conmat, nnode+1, ndlocal, stiffness)
313 id_lagrange = heclagmat%lag_node_table(ndlocal(1)) - 1
315 id_lagrange = id_lagrange + 1
316 lagrange = lagrange_array(id_lagrange)
318 call gettiedstiffness_slag(contact%states(j), contact%master(ctsurf), k, stiffness)
320 call hecmw_mat_ass_contactlag(nnode, ndlocal, id_lagrange, 0.d0, stiffness, conmat, heclagmat)
325 contact%nPenalty * contact%refStiff, stiffness, force)
328 call hecmw_mat_ass_elem(conmat, nnode+1, ndlocal, stiffness)
343 conMAT, CONT_NFORCE, CONT_FRIC, hecLagMAT )
344 integer(kind=kint),
intent(in) :: purpose
345 integer(kind=kint),
intent(in) :: ctAlgo
346 type(
tcontact ),
intent(inout) :: contact
347 real(kind=kreal),
intent(in) :: coord(:)
348 real(kind=kreal),
intent(in) :: disp(:)
349 real(kind=kreal),
intent(in) :: ddisp(:)
350 real(kind=kreal),
intent(in) :: lagrange_array(:)
351 type(hecmwst_matrix),
intent(inout) :: conmat
352 real(kind=kreal),
pointer :: cont_nforce(:)
353 real(kind=kreal),
pointer :: cont_fric(:)
354 type(hecmwst_matrix_lagrange),
intent(in) :: heclagmat
356 integer(kind=kint) :: ctsurf, nnode, ndlocal(21)
357 integer(kind=kint) :: j, k, algtype, id_lagrange
358 real(kind=kreal) :: ndcoord(21*3)
359 real(kind=kreal) :: ndu(21*3), nddu(21*3)
360 real(kind=kreal) :: lagrange
361 real(kind=kreal) :: ctnforce(21*3+1)
362 real(kind=kreal) :: cttforce(21*3+1)
363 real(kind=kreal) :: mu_n, mu_t
365 real(kind=kreal) :: ctime,
etime
366 integer(kind=kint) :: if_type
368 algtype = contact%algtype
369 if_flag = (contact%if_type /= 0)
371 ctime = contact%ctime
372 etime = contact%if_etime
373 if_type = contact%if_type
376 do j = 1,
size(contact%slave)
381 ctsurf = contact%states(j)%surface
382 nnode =
size(contact%master(ctsurf)%nodes)
383 ndlocal(1) = contact%slave(j)
384 ndlocal(2:nnode+1) = contact%master(ctsurf)%nodes(1:nnode)
386 nddu((k-1)*3+1:(k-1)*3+3) = ddisp((ndlocal(k)-1)*3+1:(ndlocal(k)-1)*3+3)
387 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)
388 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)
396 mu_n = contact%nPenalty * contact%refStiff
397 mu_t = contact%tPenalty * contact%refStiff
405 id_lagrange = heclagmat%lag_node_table(ndlocal(1)) - 1
406 id_lagrange = id_lagrange + 1
407 lagrange = lagrange_array(id_lagrange)
408 call getcontactnodalforce_slag(contact%states(j),contact%master(ctsurf),ndcoord,nddu, &
409 contact%tPenalty,contact%fcoeff,lagrange,ctnforce,cttforce,.true.)
415 mu_n, mu_t, contact%fcoeff,lagrange,ctnforce,cttforce,.true.)
429 id_lagrange = heclagmat%lag_node_table(ndlocal(1)) - 1
431 id_lagrange = id_lagrange + 1
432 lagrange = lagrange_array(id_lagrange)
433 contact%states(j)%multiplier(k) = lagrange
435 call gettiednodalforce_slag(contact%states(j),contact%master(ctsurf),k,ndu, &
436 & lagrange,ctnforce,cttforce)
447 mu_n, ctnforce,cttforce)
This module defines common data and basic structures for analysis.
integer(kind=kint), parameter kcaslagrange
contact analysis algorithm
integer(kind=kint), parameter kcaalagrange