9 use hecmw,
only : kint, kreal
24 (etype, nn, ecoord, gausses, stiff, cdsys_id, coords, &
25 time, tincr, u, temperature)
35 integer(kind=kint),
intent(in) :: etype
36 integer(kind=kint),
intent(in) :: nn
37 real(kind=kreal),
intent(in) :: ecoord(3, nn)
39 real(kind=kreal),
intent(out) :: stiff(:,:)
40 integer(kind=kint),
intent(in) :: cdsys_id
41 real(kind=kreal),
intent(inout) :: coords(3, 3)
42 real(kind=kreal),
intent(in) :: time
43 real(kind=kreal),
intent(in) :: tincr
44 real(kind=kreal),
intent(in),
optional :: u(:, :)
45 real(kind=kreal),
intent(in) :: temperature(nn)
49 integer(kind=kint) :: flag
50 integer(kind=kint),
parameter :: ndof = 3
51 real(kind=kreal) :: d(6, 6),b(6, ndof*nn),db(6, ndof*nn)
52 real(kind=kreal) :: gderiv(nn, 3),stress(6),mat(6, 6)
53 real(kind=kreal) :: det, wg, temp, spfunc(nn)
54 integer(kind=kint) :: i, j, lx, serr
55 real(kind=kreal) :: naturalcoord(3)
56 real(kind=kreal) :: gdispderiv(3, 3)
57 real(kind=kreal) :: b1(6, ndof*nn), bbar(nn, 3)
58 real(kind=kreal) :: smat(9, 9), elem(3, nn)
59 real(kind=kreal) :: bn(9, ndof*nn), sbn(9, ndof*nn)
60 real(kind=kreal) :: b4, b6, b8, coordsys(3, 3)
66 flag = gausses(1)%pMaterial%nlgeom_flag
67 if( .not.
present(u) ) flag = infinitesimal
68 elem(:, :) = ecoord(:, :)
69 if( flag == updatelag ) elem(:, :) = ecoord(:, :)+u(:, :)
80 if( cdsys_id > 0 )
then
82 if( serr == -1 ) stop
"Fail to setup local coordinate"
84 write(*, *)
"WARNING! Cannot setup local coordinate, it is modified automatically"
89 temp = dot_product( temperature, spfunc )
90 call matlmatrix( gausses(lx), d3, d, time, tincr, coordsys, temp )
92 if( flag == updatelag )
then
98 b(1:6, 1:nn*ndof) = 0.0d0
100 b4 = ( bbar(j, 1)-gderiv(j, 1) )/3.0d0
101 b6 = ( bbar(j, 2)-gderiv(j, 2) )/3.0d0
102 b8 = ( bbar(j, 3)-gderiv(j, 3) )/3.0d0
103 b(1, 3*j-2) = gderiv(j, 1)+b4
108 b(2, 3*j-1) = gderiv(j, 2)+b6
113 b(3, 3*j ) = gderiv(j, 3)+b8
115 b(4, 3*j-2) = gderiv(j, 2)
116 b(4, 3*j-1) = gderiv(j, 1)
117 b(5, 3*j-1) = gderiv(j, 3)
118 b(5, 3*j ) = gderiv(j, 2)
119 b(6, 3*j-2) = gderiv(j, 3)
120 b(6, 3*j ) = gderiv(j, 1)
124 if( flag == totallag )
then
126 gdispderiv(1:ndof, 1:ndof) = matmul( u(1:ndof, 1:nn), gderiv(1:nn, 1:ndof) )
127 b1(1:6, 1:nn*ndof) = 0.0d0
129 b1(1, 3*j-2) = gdispderiv(1, 1)*gderiv(j, 1)
130 b1(1, 3*j-1) = gdispderiv(2, 1)*gderiv(j, 1)
131 b1(1, 3*j ) = gdispderiv(3, 1)*gderiv(j, 1)
132 b1(2, 3*j-2) = gdispderiv(1, 2)*gderiv(j, 2)
133 b1(2, 3*j-1) = gdispderiv(2, 2)*gderiv(j, 2)
134 b1(2, 3*j ) = gdispderiv(3, 2)*gderiv(j, 2)
135 b1(3, 3*j-2) = gdispderiv(1, 3)*gderiv(j, 3)
136 b1(3, 3*j-1) = gdispderiv(2, 3)*gderiv(j, 3)
137 b1(3, 3*j ) = gdispderiv(3, 3)*gderiv(j, 3)
138 b1(4, 3*j-2) = gdispderiv(1, 2)*gderiv(j, 1)+gdispderiv(1, 1)*gderiv(j, 2)
139 b1(4, 3*j-1) = gdispderiv(2, 2)*gderiv(j, 1)+gdispderiv(2, 1)*gderiv(j, 2)
140 b1(4, 3*j ) = gdispderiv(3, 2)*gderiv(j, 1)+gdispderiv(3, 1)*gderiv(j, 2)
141 b1(5, 3*j-2) = gdispderiv(1, 2)*gderiv(j, 3)+gdispderiv(1, 3)*gderiv(j, 2)
142 b1(5, 3*j-1) = gdispderiv(2, 2)*gderiv(j, 3)+gdispderiv(2, 3)*gderiv(j, 2)
143 b1(5, 3*j ) = gdispderiv(3, 2)*gderiv(j, 3)+gdispderiv(3, 3)*gderiv(j, 2)
144 b1(6, 3*j-2) = gdispderiv(1, 3)*gderiv(j, 1)+gdispderiv(1, 1)*gderiv(j, 3)
145 b1(6, 3*j-1) = gdispderiv(2, 3)*gderiv(j, 1)+gdispderiv(2, 1)*gderiv(j, 3)
146 b1(6, 3*j ) = gdispderiv(3, 3)*gderiv(j, 1)+gdispderiv(3, 1)*gderiv(j, 3)
150 b(:, j) = b(:, j)+b1(:, j)
154 db(1:6, 1:nn*ndof) = matmul( d, b(1:6, 1:nn*ndof) )
157 stiff(i, j) = stiff(i, j)+dot_product( b(:, i), db(:, j) )*wg
162 if( flag == totallag .or. flag == updatelag )
then
163 stress(1:6) = gausses(lx)%stress
164 bn(1:9, 1:nn*ndof) = 0.0d0
166 bn(1, 3*j-2) = gderiv(j, 1)
167 bn(2, 3*j-1) = gderiv(j, 1)
168 bn(3, 3*j ) = gderiv(j, 1)
169 bn(4, 3*j-2) = gderiv(j, 2)
170 bn(5, 3*j-1) = gderiv(j, 2)
171 bn(6, 3*j ) = gderiv(j, 2)
172 bn(7, 3*j-2) = gderiv(j, 3)
173 bn(8, 3*j-1) = gderiv(j, 3)
174 bn(9, 3*j ) = gderiv(j, 3)
178 smat(j , j ) = stress(1)
179 smat(j , j+3) = stress(4)
180 smat(j , j+6) = stress(6)
181 smat(j+3, j ) = stress(4)
182 smat(j+3, j+3) = stress(2)
183 smat(j+3, j+6) = stress(5)
184 smat(j+6, j ) = stress(6)
185 smat(j+6, j+3) = stress(5)
186 smat(j+6, j+6) = stress(3)
188 sbn(1:9, 1:nn*ndof) = matmul( smat(1:9, 1:9), bn(1:9, 1:nn*ndof) )
191 stiff(i, j) = stiff(i, j)+dot_product( bn(:, i), sbn(:, j) )*wg
204 (etype, nn, ecoord, u, du, cdsys_id, coords, &
205 qf ,gausses, iter, time, tincr, tt,t0, tn )
219 integer(kind=kint),
intent(in) :: etype
220 integer(kind=kint),
intent(in) :: nn
221 real(kind=kreal),
intent(in) :: ecoord(3, nn)
222 real(kind=kreal),
intent(in) :: u(3, nn)
223 real(kind=kreal),
intent(in) :: du(3, nn)
224 integer(kind=kint),
intent(in) :: cdsys_id
225 real(kind=kreal),
intent(inout) :: coords(3, 3)
226 real(kind=kreal),
intent(out) :: qf(nn*3)
228 integer,
intent(in) :: iter
229 real(kind=kreal),
intent(in) :: time
230 real(kind=kreal),
intent(in) :: tincr
231 real(kind=kreal),
intent(in) :: tt(nn)
232 real(kind=kreal),
intent(in) :: t0(nn)
233 real(kind=kreal),
intent(in) :: tn(nn)
237 integer(kind=kint) :: flag
238 integer(kind=kint),
parameter :: ndof = 3
239 real(kind=kreal) :: b(6, ndof*nn), b1(6, ndof*nn)
240 real(kind=kreal) :: gderiv(nn, 3), gderiv1(nn,3), gdispderiv(3, 3), f(3,3), det, det1, wg
241 integer(kind=kint) :: j, lx, mtype, serr
242 real(kind=kreal) :: naturalcoord(3), rot(3, 3), spfunc(nn)
243 real(kind=kreal) :: totaldisp(3, nn), elem(3, nn), elem1(3, nn), coordsys(3, 3)
244 real(kind=kreal) :: dstrain(6)
245 real(kind=kreal) :: dvol, vol0, bbar(nn, 3), derivdum(1:ndof, 1:ndof), bbar2(nn, 3)
246 real(kind=kreal) :: b4, b6, b8, ttc, tt0, ttn, alpo(3), ina(1), epsth(6)
247 logical :: ierr, matlaniso
253 flag = gausses(1)%pMaterial%nlgeom_flag
254 elem(:, :) = ecoord(:, :)
255 totaldisp(:, :) = u(:, :)+du(:, :)
257 elem(:, :) = ( 0.5d0*du(:, :)+u(:, :) )+ecoord(:, :)
258 elem1(:, :) = ( du(:, :)+u(:, :) )+ecoord(:, :)
260 totaldisp(:, :) = du(:, :)
265 call fetch_tabledata(
mc_orthoexp, gausses(1)%pMaterial%dict, alpo(:), ierr, ina )
266 if( .not. ierr ) matlaniso = .true.
271 derivdum = matmul( totaldisp(1:ndof, 1:nn), bbar(1:nn, 1:ndof) )
272 vol0 = ( derivdum(1, 1)+derivdum(2, 2)+derivdum(3, 3) )/3.0d0
277 mtype = gausses(lx)%pMaterial%mtype
282 if( cdsys_id > 0 )
then
283 call set_localcoordsys( coords, g_localcoordsys(cdsys_id), coordsys(:, :), serr )
284 if( serr == -1 ) stop
"Fail to setup local coordinate"
285 if( serr == -2 )
then
286 write(*, *)
"WARNING! Cannot setup local coordinate, it is modified automatically"
290 gdispderiv(1:ndof, 1:ndof) = matmul( totaldisp(1:ndof, 1:nn), gderiv(1:nn, 1:ndof) )
291 dvol = vol0-( gdispderiv(1, 1)+gdispderiv(2, 2)+gdispderiv(3, 3) )/3.0d0
302 ttc = dot_product(tt, spfunc)
303 tt0 = dot_product(t0, spfunc)
304 ttn = dot_product(tn, spfunc)
309 dstrain(1) = gdispderiv(1, 1)+dvol
310 dstrain(2) = gdispderiv(2, 2)+dvol
311 dstrain(3) = gdispderiv(3, 3)+dvol
312 dstrain(4) = ( gdispderiv(1, 2)+gdispderiv(2, 1) )
313 dstrain(5) = ( gdispderiv(2, 3)+gdispderiv(3, 2) )
314 dstrain(6) = ( gdispderiv(3, 1)+gdispderiv(1, 3) )
315 dstrain(:) = dstrain(:)-epsth(:)
317 f(1:3,1:3) = 0.d0; f(1,1)=1.d0; f(2,2)=1.d0; f(3,3)=1.d0;
319 gausses(lx)%strain(1:6) = dstrain(1:6)+epsth(:)
323 dstrain(1) = dstrain(1)+0.5d0*dot_product( gdispderiv(:, 1), gdispderiv(:, 1) )
324 dstrain(2) = dstrain(2)+0.5d0*dot_product( gdispderiv(:, 2), gdispderiv(:, 2) )
325 dstrain(3) = dstrain(3)+0.5d0*dot_product( gdispderiv(:, 3), gdispderiv(:, 3) )
326 dstrain(4) = dstrain(4)+( gdispderiv(1, 1)*gdispderiv(1, 2) &
327 +gdispderiv(2, 1)*gdispderiv(2, 2)+gdispderiv(3, 1)*gdispderiv(3, 2) )
328 dstrain(5) = dstrain(5)+( gdispderiv(1, 2)*gdispderiv(1, 3) &
329 +gdispderiv(2, 2)*gdispderiv(2, 3)+gdispderiv(3, 2)*gdispderiv(3, 3) )
330 dstrain(6) = dstrain(6)+( gdispderiv(1, 1)*gdispderiv(1, 3) &
331 +gdispderiv(2, 1)*gdispderiv(2, 3)+gdispderiv(3, 1)*gdispderiv(3, 3) )
333 gausses(lx)%strain(1:6) = dstrain(1:6)+epsth(:)
334 f(1:3,1:3) = f(1:3,1:3) + gdispderiv(1:3,1:3)
338 rot(1, 2)= 0.5d0*( gdispderiv(1, 2)-gdispderiv(2, 1) ); rot(2, 1) = -rot(1, 2)
339 rot(2, 3)= 0.5d0*( gdispderiv(2, 3)-gdispderiv(3, 2) ); rot(3, 2) = -rot(2, 3)
340 rot(1, 3)= 0.5d0*( gdispderiv(1, 3)-gdispderiv(3, 1) ); rot(3, 1) = -rot(1, 3)
342 gausses(lx)%strain(1:6) = gausses(lx)%strain_bak(1:6)+dstrain(1:6)+epsth(:)
343 call getglobalderiv(etype, nn, naturalcoord, ecoord, det1, gderiv1)
344 f(1:3,1:3) = f(1:3,1:3) + matmul( u(1:ndof, 1:nn)+du(1:ndof, 1:nn), gderiv1(1:nn, 1:ndof) )
349 call update_stress3d( flag, gausses(lx), rot, dstrain, f, coordsys, time, tincr, ttc, tt0, ttn )
355 b(1:6, 1:nn*ndof) = 0.0d0
357 b4 = ( bbar(j, 1)-gderiv(j, 1) )/3.0d0
358 b6 = ( bbar(j, 2)-gderiv(j, 2) )/3.0d0
359 b8 = ( bbar(j, 3)-gderiv(j, 3) )/3.0d0
360 b(1, 3*j-2) = gderiv(j, 1)+b4
365 b(2, 3*j-1) = gderiv(j, 2)+b6
370 b(3, 3*j ) = gderiv(j, 3)+b8
372 b(4, 3*j-2) = gderiv(j, 2)
373 b(4, 3*j-1) = gderiv(j, 1)
374 b(5, 3*j-1) = gderiv(j, 3)
375 b(5, 3*j ) = gderiv(j, 2)
376 b(6, 3*j-2) = gderiv(j, 3)
377 b(6, 3*j ) = gderiv(j, 1)
384 b1(1:6, 1:nn*ndof) = 0.0d0
386 b1(1, 3*j-2) = gdispderiv(1, 1)*gderiv(j, 1)
387 b1(1, 3*j-1) = gdispderiv(2, 1)*gderiv(j, 1)
388 b1(1, 3*j ) = gdispderiv(3, 1)*gderiv(j, 1)
389 b1(2, 3*j-2) = gdispderiv(1, 2)*gderiv(j, 2)
390 b1(2, 3*j-1) = gdispderiv(2, 2)*gderiv(j, 2)
391 b1(2, 3*j ) = gdispderiv(3, 2)*gderiv(j, 2)
392 b1(3, 3*j-2) = gdispderiv(1, 3)*gderiv(j, 3)
393 b1(3, 3*j-1) = gdispderiv(2, 3)*gderiv(j, 3)
394 b1(3, 3*j ) = gdispderiv(3, 3)*gderiv(j, 3)
395 b1(4, 3*j-2) = gdispderiv(1, 2)*gderiv(j, 1)+gdispderiv(1, 1)*gderiv(j, 2)
396 b1(4, 3*j-1) = gdispderiv(2, 2)*gderiv(j, 1)+gdispderiv(2, 1)*gderiv(j, 2)
397 b1(4, 3*j ) = gdispderiv(3, 2)*gderiv(j, 1)+gdispderiv(3, 1)*gderiv(j, 2)
398 b1(5, 3*j-2) = gdispderiv(1, 2)*gderiv(j, 3)+gdispderiv(1, 3)*gderiv(j, 2)
399 b1(5, 3*j-1) = gdispderiv(2, 2)*gderiv(j, 3)+gdispderiv(2, 3)*gderiv(j, 2)
400 b1(5, 3*j ) = gdispderiv(3, 2)*gderiv(j, 3)+gdispderiv(3, 3)*gderiv(j, 2)
401 b1(6, 3*j-2) = gdispderiv(1, 3)*gderiv(j, 1)+gdispderiv(1, 1)*gderiv(j, 3)
402 b1(6, 3*j-1) = gdispderiv(2, 3)*gderiv(j, 1)+gdispderiv(2, 1)*gderiv(j, 3)
403 b1(6, 3*j ) = gdispderiv(3, 3)*gderiv(j, 1)+gdispderiv(3, 1)*gderiv(j, 3)
407 b(:, j) = b(:, j)+b1(:, j)
413 b(1:6, 1:nn*ndof) = 0.0d0
415 b4 = ( bbar2(j, 1)-gderiv(j, 1) )/3.0d0
416 b6 = ( bbar2(j, 2)-gderiv(j, 2) )/3.0d0
417 b8 = ( bbar2(j, 3)-gderiv(j, 3) )/3.0d0
418 b(1, 3*j-2) = gderiv(j, 1)+b4
423 b(2, 3*j-1) = gderiv(j, 2)+b6
428 b(3, 3*j ) = gderiv(j, 3)+b8
430 b(4, 3*j-2) = gderiv(j, 2)
431 b(4, 3*j-1) = gderiv(j, 1)
432 b(5, 3*j-1) = gderiv(j, 3)
433 b(5, 3*j ) = gderiv(j, 2)
434 b(6, 3*j-2) = gderiv(j, 3)
435 b(6, 3*j ) = gderiv(j, 1)
441 qf(1:nn*ndof) = qf(1:nn*ndof) &
442 +matmul( gausses(lx)%stress(1:6), b(1:6, 1:nn*ndof) )*wg
445 gausses(lx)%strain_energy = 0.5d0*dot_product(gausses(lx)%stress(1:6)+gausses(lx)%stress_bak(1:6), &
446 & gausses(lx)%strain(1:6)-gausses(lx)%strain_bak(1:6))*wg
454 (etype, nn, xx, yy, zz, tt, t0, &
455 gausses, vect, cdsys_id, coords)
465 integer(kind=kint),
parameter :: ndof = 3
466 integer(kind=kint),
intent(in) :: etype, nn
468 real(kind=kreal),
intent(in) :: xx(nn), yy(nn), zz(nn)
469 real(kind=kreal),
intent(in) :: tt(nn), t0(nn)
470 real(kind=kreal),
intent(out) :: vect(nn*ndof)
471 integer(kind=kint),
intent(in) :: cdsys_ID
472 real(kind=kreal),
intent(inout) :: coords(3, 3)
476 real(kind=kreal) :: alp, alp0, d(6, 6), b(6, ndof*nn)
477 real(kind=kreal) :: b4, b6, b8, det, ecoord(3, nn)
478 integer(kind=kint) :: j, LX, serr
479 real(kind=kreal) :: estrain(6), sgm(6), h(nn)
480 real(kind=kreal) :: naturalcoord(3), gderiv(nn, 3)
481 real(kind=kreal) :: wg, outa(1), ina(1), bbar(nn, 3), alpo(3), alpo0(3), coordsys(3, 3)
482 real(kind=kreal) :: tempc, temp0, tempc0, temp00, thermal_eps, tm(6,6)
483 logical :: ierr, matlaniso
489 if( cdsys_id > 0 )
then
491 call fetch_tabledata( mc_orthoexp, gausses(1)%pMaterial%dict, alpo(:), ierr, ina )
492 if( .not. ierr ) matlaniso = .true.
504 tempc0 = dot_product( h(1:nn), tt(1:nn) )
505 temp00 = dot_product( h(1:nn), t0(1:nn) )
514 if( cdsys_id > 0 )
then
515 call set_localcoordsys(coords, g_localcoordsys(cdsys_id), coordsys, serr)
516 if( serr == -1 ) stop
"Fail to setup local coordinate"
517 if( serr == -2 )
then
518 write(*, *)
"WARNING! Cannot setup local coordinate, it is modified automatically"
524 b(1:6, 1:nn*ndof) = 0.0d0
526 b4 = ( bbar(j, 1)-gderiv(j, 1) )/3.0d0
527 b6 = ( bbar(j, 2)-gderiv(j, 2) )/3.0d0
528 b8 = ( bbar(j, 3)-gderiv(j, 3) )/3.0d0
529 b(1, 3*j-2) = gderiv(j, 1)+b4
534 b(2, 3*j-1) = gderiv(j, 2)+b6
539 b(3, 3*j ) = gderiv(j, 3)+b8
541 b(4, 3*j-2) = gderiv(j, 2)
542 b(4, 3*j-1) = gderiv(j, 1)
543 b(5, 3*j-1) = gderiv(j, 3)
544 b(5, 3*j ) = gderiv(j, 2)
545 b(6, 3*j-2) = gderiv(j, 3)
546 b(6, 3*j ) = gderiv(j, 1)
549 tempc = dot_product( h(1:nn),tt(1:nn) )
550 temp0 = dot_product( h(1:nn),t0(1:nn) )
552 call matlmatrix( gausses(lx), d3, d, 1.d0, 0.0d0, coordsys, tempc )
556 call fetch_tabledata( mc_orthoexp, gausses(lx)%pMaterial%dict, alpo(:), ierr, ina )
557 if( ierr ) stop
"Fails in fetching orthotropic expansion coefficient!"
559 call fetch_tabledata( mc_themoexp, gausses(lx)%pMaterial%dict, outa(:), ierr, ina )
560 if( ierr ) outa(1) = gausses(lx)%pMaterial%variables(m_exapnsion)
565 call fetch_tabledata( mc_orthoexp, gausses(lx)%pMaterial%dict, alpo0(:), ierr, ina )
566 if( ierr ) stop
"Fails in fetching orthotropic expansion coefficient!"
568 call fetch_tabledata( mc_themoexp, gausses(lx)%pMaterial%dict, outa(:), ierr, ina )
569 if( ierr ) outa(1) = gausses(lx)%pMaterial%variables(m_exapnsion)
582 estrain(:) = matmul( estrain(:), tm )
583 estrain(4:6) = estrain(4:6)*2.0d0
586 estrain(1:3) = thermal_eps
593 sgm(:) = matmul( d(:, :), estrain(:) )
598 vect(1:nn*ndof) = vect(1:nn*ndof)+matmul( sgm(:), b(:, :) )*wg