11 use hecmw,
only : kint, kreal
22 (etype, nn, ecoord, gausses, stiff, cdsys_id, coords, &
23 time, tincr, u, aux, temperature)
33 integer(kind=kint),
intent(in) :: etype
34 integer(kind=kint),
intent(in) :: nn
35 real(kind=kreal),
intent(in) :: ecoord(3, nn)
37 real(kind=kreal),
intent(out) :: stiff(:, :)
38 integer(kind=kint),
intent(in) :: cdsys_id
39 real(kind=kreal),
intent(inout) :: coords(3, 3)
40 real(kind=kreal),
intent(in) :: time
41 real(kind=kreal),
intent(in) :: tincr
42 real(kind=kreal),
intent(in),
optional :: u(3, nn)
43 real(kind=kreal),
intent(in),
optional :: aux(3, 3)
44 real(kind=kreal),
intent(in) :: temperature(nn)
48 integer(kind=kint) :: flag
49 integer(kind=kint),
parameter :: ndof = 3
50 real(kind=kreal) :: d(6, 6), b(6, ndof*(nn+3)), db(6, ndof*(nn+3))
51 real(kind=kreal) :: gderiv(nn+3, 3), stress(6)
52 real(kind=kreal) :: xj(9, 9), jacobian(3, 3), inverse(3, 3)
53 real(kind=kreal) :: tmpstiff((nn+3)*3, (nn+3)*3), tmpk(nn*3, 9)
54 real(kind=kreal) :: det, wg, elem(3, nn), mat(6, 6)
55 integer(kind=kint) :: i, j, lx
56 integer(kind=kint) :: serr
57 real(kind=kreal) :: naturalcoord(3), unode(3, nn+3)
58 real(kind=kreal) :: gdispderiv(3, 3), coordsys(3, 3)
59 real(kind=kreal) :: b1(6, ndof*(nn+3))
60 real(kind=kreal) :: smat(9, 9)
61 real(kind=kreal) :: bn(9, ndof*(nn+3)), sbn(9, ndof*(nn+3))
62 real(kind=kreal) :: spfunc(nn), temp
66 if(
present(u) .AND.
present(aux) )
then
67 unode(:, 1:nn) = u(:, :)
68 unode(:, nn+1:nn+3) = aux(:, :)
72 flag = gausses(1)%pMaterial%nlgeom_flag
73 if( .not.
present(u) ) flag = infinitesimal
74 elem(:, :) = ecoord(:, :)
75 if( flag == updatelag ) elem(:, :) = ecoord(:, :)+unode(:, 1:nn)
78 naturalcoord(:) = 0.0d0
79 call getjacobian(etype, nn, naturalcoord, elem, det, jacobian, inverse)
80 inverse(:, :)= inverse(:, :)*det
84 tmpstiff(:, :) = 0.0d0
85 b1(1:6, 1:(nn+3)*ndof) = 0.0d0
86 bn(1:9, 1:(nn+3)*ndof) = 0.0d0
91 call getglobalderiv( etype, nn, naturalcoord, elem, det, gderiv(1:nn, 1:3) )
93 if( cdsys_id > 0 )
then
95 if( serr == -1 ) stop
"Fail to setup local coordinate"
98 write(*, *)
"WARNING! Cannot setup local coordinate, it is modified automatically"
104 temp = dot_product( temperature, spfunc )
105 call matlmatrix( gausses(lx), d3, d, time, tincr, coordsys, temp )
107 if( flag == updatelag )
then
108 call geomat_c3( gausses(lx)%stress, mat )
109 d(:, :) = d(:, :)-mat
117 gderiv(nn+1, :) = -2.0d0*naturalcoord(1)*inverse(1, :)/det
118 gderiv(nn+2, :) = -2.0d0*naturalcoord(2)*inverse(2, :)/det
119 gderiv(nn+3, :) = -2.0d0*naturalcoord(3)*inverse(3, :)/det
122 b(1:6, 1:(nn+3)*ndof)=0.0d0
124 b(1, 3*j-2) = gderiv(j, 1)
125 b(2, 3*j-1) = gderiv(j, 2)
126 b(3, 3*j ) = gderiv(j, 3)
127 b(4, 3*j-2) = gderiv(j, 2)
128 b(4, 3*j-1) = gderiv(j, 1)
129 b(5, 3*j-1) = gderiv(j, 3)
130 b(5, 3*j ) = gderiv(j, 2)
131 b(6, 3*j-2) = gderiv(j, 3)
132 b(6, 3*j ) = gderiv(j, 1)
136 if( flag == totallag )
then
138 gdispderiv(1:ndof,1:ndof) = matmul( unode(1:ndof, 1:nn+3), gderiv(1:nn+3, 1:ndof) )
141 b1(1, 3*j-2) = gdispderiv(1, 1)*gderiv(j, 1)
142 b1(1, 3*j-1) = gdispderiv(2, 1)*gderiv(j, 1)
143 b1(1, 3*j ) = gdispderiv(3, 1)*gderiv(j, 1)
144 b1(2, 3*j-2) = gdispderiv(1, 2)*gderiv(j, 2)
145 b1(2, 3*j-1) = gdispderiv(2, 2)*gderiv(j, 2)
146 b1(2, 3*j ) = gdispderiv(3, 2)*gderiv(j, 2)
147 b1(3, 3*j-2) = gdispderiv(1, 3)*gderiv(j, 3)
148 b1(3, 3*j-1) = gdispderiv(2, 3)*gderiv(j, 3)
149 b1(3, 3*j ) = gdispderiv(3, 3)*gderiv(j, 3)
150 b1(4, 3*j-2) = gdispderiv(1, 2)*gderiv(j, 1)+gdispderiv(1, 1)*gderiv(j, 2)
151 b1(4, 3*j-1) = gdispderiv(2, 2)*gderiv(j, 1)+gdispderiv(2, 1)*gderiv(j, 2)
152 b1(4, 3*j ) = gdispderiv(3, 2)*gderiv(j, 1)+gdispderiv(3, 1)*gderiv(j, 2)
153 b1(5, 3*j-2) = gdispderiv(1, 2)*gderiv(j, 3)+gdispderiv(1, 3)*gderiv(j, 2)
154 b1(5, 3*j-1) = gdispderiv(2, 2)*gderiv(j, 3)+gdispderiv(2, 3)*gderiv(j, 2)
155 b1(5, 3*j ) = gdispderiv(3, 2)*gderiv(j, 3)+gdispderiv(3, 3)*gderiv(j, 2)
156 b1(6, 3*j-2) = gdispderiv(1, 3)*gderiv(j, 1)+gdispderiv(1, 1)*gderiv(j, 3)
157 b1(6, 3*j-1) = gdispderiv(2, 3)*gderiv(j, 1)+gdispderiv(2, 1)*gderiv(j, 3)
158 b1(6, 3*j ) = gdispderiv(3, 3)*gderiv(j, 1)+gdispderiv(3, 1)*gderiv(j, 3)
162 do j = 1, (nn+3)*ndof
163 b(:, j) = b(:, j)+b1(:, j)
168 db(1:6, 1:(nn+3)*ndof) = matmul( d, b(1:6, 1:(nn+3)*ndof) )
171 tmpstiff(i, j) = tmpstiff(i, j)+dot_product( b(:, i), db(:, j) )*wg
176 if( flag == totallag .OR. flag == updatelag )
then
177 stress(1:6) = gausses(lx)%stress
179 bn(1, 3*j-2) = gderiv(j, 1)
180 bn(2, 3*j-1) = gderiv(j, 1)
181 bn(3, 3*j ) = gderiv(j, 1)
182 bn(4, 3*j-2) = gderiv(j, 2)
183 bn(5, 3*j-1) = gderiv(j, 2)
184 bn(6, 3*j ) = gderiv(j, 2)
185 bn(7, 3*j-2) = gderiv(j, 3)
186 bn(8, 3*j-1) = gderiv(j, 3)
187 bn(9, 3*j ) = gderiv(j, 3)
191 smat(j , j ) = stress(1)
192 smat(j , j+3) = stress(4)
193 smat(j , j+6) = stress(6)
194 smat(j+3, j ) = stress(4)
195 smat(j+3, j+3) = stress(2)
196 smat(j+3, j+6) = stress(5)
197 smat(j+6, j ) = stress(6)
198 smat(j+6, j+3) = stress(5)
199 smat(j+6, j+6) = stress(3)
201 sbn(1:9, 1:(nn+3)*ndof) = matmul( smat(1:9, 1:9), bn(1:9, 1:(nn+3)*ndof) )
204 tmpstiff(i, j) = tmpstiff(i, j)+dot_product( bn(:, i), sbn(:, j) )*wg
212 xj(1:9, 1:9)= tmpstiff(nn*ndof+1:(nn+3)*ndof, nn*ndof+1:(nn+3)*ndof)
214 tmpk = matmul( tmpstiff( 1:nn*ndof, nn*ndof+1:(nn+3)*ndof ), xj )
215 stiff(1:nn*ndof, 1:nn*ndof) = tmpstiff(1:nn*ndof, 1:nn*ndof)-matmul( tmpk, tmpstiff(nn*ndof+1:(nn+3)*ndof, 1:nn*ndof) )
223 (etype,nn,ecoord, u, du, ddu, cdsys_id, coords, &
224 qf, gausses, iter, time, tincr, aux, ddaux, tt, t0, tn )
235 integer(kind=kint),
intent(in) :: etype
236 integer(kind=kint),
intent(in) :: nn
237 real(kind=kreal),
intent(in) :: ecoord(3, nn)
238 real(kind=kreal),
intent(in) :: u(3, nn)
239 real(kind=kreal),
intent(in) :: du(3, nn)
240 real(kind=kreal),
intent(in) :: ddu(3, nn)
241 integer(kind=kint),
intent(in) :: cdsys_id
242 real(kind=kreal),
intent(inout) :: coords(3, 3)
243 real(kind=kreal),
intent(out) :: qf(nn*3)
245 integer,
intent(in) :: iter
246 real(kind=kreal),
intent(in) :: time
247 real(kind=kreal),
intent(in) :: tincr
248 real(kind=kreal),
intent(inout) :: aux(3, 3)
249 real(kind=kreal),
intent(out) :: ddaux(3, 3)
250 real(kind=kreal),
intent(in) :: tt(nn)
251 real(kind=kreal),
intent(in) :: t0(nn)
252 real(kind=kreal),
intent(in) :: tn(nn)
255 integer(kind=kint) :: flag
256 integer(kind=kint),
parameter :: ndof = 3
257 real(kind=kreal) :: d(6,6), b(6,ndof*(nn+3)), b1(6,ndof*(nn+3)), spfunc(nn), ina(1)
258 real(kind=kreal) :: bn(9,ndof*(nn+3)), db(6, ndof*(nn+3)), stress(6), smat(9, 9), sbn(9, ndof*(nn+3))
259 real(kind=kreal) :: gderiv(nn+3,3), gderiv0(nn+3,3), gdispderiv(3,3), f(3,3), det, det0, wg, ttc, tt0, ttn
260 integer(kind=kint) :: i, j, lx, mtype, serr
261 real(kind=kreal) :: naturalcoord(3), rot(3,3), mat(6,6), epsth(6)
262 real(kind=kreal) :: totaldisp(3,nn+3), elem(3,nn), elem1(3,nn), coordsys(3,3)
263 real(kind=kreal) :: dstrain(6)
264 real(kind=kreal) :: alpo(3)
265 logical :: ierr, matlaniso
266 real(kind=kreal) :: stiff_ad(9, nn*3), stiff_aa(9, 9), qf_a(9)
267 real(kind=kreal) :: xj(9, 9)
268 real(kind=kreal) :: tmpforce(9), tmpdisp(9), tmp_d(nn*3), tmp_a(9)
269 real(kind=kreal) :: jacobian(3, 3), inverse(3, 3), inverse1(3, 3), inverse0(3, 3)
273 totaldisp(:, 1:nn) = u(:, :) + du(:, :) - ddu(:, :)
274 totaldisp(:, nn+1:nn+3) = aux(:, :)
277 flag = gausses(1)%pMaterial%nlgeom_flag
278 elem(:, :) = ecoord(:, :)
279 if( flag ==
updatelag ) elem(:, :) = ecoord(:, :)+totaldisp(:, 1:nn)
282 naturalcoord(:) = 0.0d0
283 call getjacobian(etype, nn, naturalcoord, elem, det, jacobian, inverse)
284 inverse(:, :)= inverse(:, :)*det
288 stiff_ad(:, :) = 0.0d0
289 stiff_aa(:, :) = 0.0d0
290 b1(1:6, 1:(nn+3)*ndof) = 0.0d0
291 bn(1:9, 1:(nn+3)*ndof) = 0.0d0
296 call getglobalderiv( etype, nn, naturalcoord, elem, det, gderiv(1:nn, 1:3) )
298 if( cdsys_id > 0 )
then
299 call set_localcoordsys( coords, g_localcoordsys(cdsys_id), coordsys(:, :), serr )
300 if( serr == -1 ) stop
"Fail to setup local coordinate"
301 if( serr == -2 )
then
303 write(*, *)
"WARNING! Cannot setup local coordinate, it is modified automatically"
309 ttc = dot_product( tt, spfunc )
310 call matlmatrix( gausses(lx),
d3, d, time, tincr, coordsys, ttc )
313 call geomat_c3( gausses(lx)%stress, mat )
314 d(:, :) = d(:, :)-mat
322 gderiv(nn+1, :) = -2.0d0*naturalcoord(1)*inverse(1, :)/det
323 gderiv(nn+2, :) = -2.0d0*naturalcoord(2)*inverse(2, :)/det
324 gderiv(nn+3, :) = -2.0d0*naturalcoord(3)*inverse(3, :)/det
327 b(1:6, 1:(nn+3)*ndof)=0.0d0
329 b(1, 3*j-2) = gderiv(j, 1)
330 b(2, 3*j-1) = gderiv(j, 2)
331 b(3, 3*j ) = gderiv(j, 3)
332 b(4, 3*j-2) = gderiv(j, 2)
333 b(4, 3*j-1) = gderiv(j, 1)
334 b(5, 3*j-1) = gderiv(j, 3)
335 b(5, 3*j ) = gderiv(j, 2)
336 b(6, 3*j-2) = gderiv(j, 3)
337 b(6, 3*j ) = gderiv(j, 1)
343 gdispderiv(1:ndof,1:ndof) = matmul( totaldisp(1:ndof, 1:nn+3), gderiv(1:nn+3, 1:ndof) )
346 b1(1, 3*j-2) = gdispderiv(1, 1)*gderiv(j, 1)
347 b1(1, 3*j-1) = gdispderiv(2, 1)*gderiv(j, 1)
348 b1(1, 3*j ) = gdispderiv(3, 1)*gderiv(j, 1)
349 b1(2, 3*j-2) = gdispderiv(1, 2)*gderiv(j, 2)
350 b1(2, 3*j-1) = gdispderiv(2, 2)*gderiv(j, 2)
351 b1(2, 3*j ) = gdispderiv(3, 2)*gderiv(j, 2)
352 b1(3, 3*j-2) = gdispderiv(1, 3)*gderiv(j, 3)
353 b1(3, 3*j-1) = gdispderiv(2, 3)*gderiv(j, 3)
354 b1(3, 3*j ) = gdispderiv(3, 3)*gderiv(j, 3)
355 b1(4, 3*j-2) = gdispderiv(1, 2)*gderiv(j, 1)+gdispderiv(1, 1)*gderiv(j, 2)
356 b1(4, 3*j-1) = gdispderiv(2, 2)*gderiv(j, 1)+gdispderiv(2, 1)*gderiv(j, 2)
357 b1(4, 3*j ) = gdispderiv(3, 2)*gderiv(j, 1)+gdispderiv(3, 1)*gderiv(j, 2)
358 b1(5, 3*j-2) = gdispderiv(1, 2)*gderiv(j, 3)+gdispderiv(1, 3)*gderiv(j, 2)
359 b1(5, 3*j-1) = gdispderiv(2, 2)*gderiv(j, 3)+gdispderiv(2, 3)*gderiv(j, 2)
360 b1(5, 3*j ) = gdispderiv(3, 2)*gderiv(j, 3)+gdispderiv(3, 3)*gderiv(j, 2)
361 b1(6, 3*j-2) = gdispderiv(1, 3)*gderiv(j, 1)+gdispderiv(1, 1)*gderiv(j, 3)
362 b1(6, 3*j-1) = gdispderiv(2, 3)*gderiv(j, 1)+gdispderiv(2, 1)*gderiv(j, 3)
363 b1(6, 3*j ) = gdispderiv(3, 3)*gderiv(j, 1)+gdispderiv(3, 1)*gderiv(j, 3)
367 do j = 1, (nn+3)*ndof
368 b(:, j) = b(:, j)+b1(:, j)
373 db(1:6, 1:(nn+3)*ndof) = matmul( d, b(1:6, 1:(nn+3)*ndof) )
376 stiff_ad(i, j) = stiff_ad(i, j)+dot_product( b(:, nn*ndof+i), db(:, j) )*wg
382 stiff_aa(i, j) = stiff_aa(i, j)+dot_product( b(:, nn*ndof+i), db(:, nn*ndof+j) )*wg
388 stress(1:6) = gausses(lx)%stress
390 bn(1, 3*j-2) = gderiv(j, 1)
391 bn(2, 3*j-1) = gderiv(j, 1)
392 bn(3, 3*j ) = gderiv(j, 1)
393 bn(4, 3*j-2) = gderiv(j, 2)
394 bn(5, 3*j-1) = gderiv(j, 2)
395 bn(6, 3*j ) = gderiv(j, 2)
396 bn(7, 3*j-2) = gderiv(j, 3)
397 bn(8, 3*j-1) = gderiv(j, 3)
398 bn(9, 3*j ) = gderiv(j, 3)
402 smat(j , j ) = stress(1)
403 smat(j , j+3) = stress(4)
404 smat(j , j+6) = stress(6)
405 smat(j+3, j ) = stress(4)
406 smat(j+3, j+3) = stress(2)
407 smat(j+3, j+6) = stress(5)
408 smat(j+6, j ) = stress(6)
409 smat(j+6, j+3) = stress(5)
410 smat(j+6, j+6) = stress(3)
412 sbn(1:9, 1:(nn+3)*ndof) = matmul( smat(1:9, 1:9), bn(1:9, 1:(nn+3)*ndof) )
416 stiff_ad(i, j) = stiff_ad(i, j)+dot_product( bn(:, nn*ndof+i), sbn(:, j) )*wg
421 stiff_aa(i, j) = stiff_aa(i, j)+dot_product( bn(:, nn*ndof+i), sbn(:, nn*ndof+j) )*wg
429 xj(1:3*ndof, 1:3*ndof)= stiff_aa(1:3*ndof, 1:3*ndof)
433 tmp_d((i-1)*ndof+1:i*ndof) = ddu(1:ndof, i)
435 tmpforce(1:3*ndof) = matmul( stiff_ad(1:3*ndof, 1:nn*ndof), tmp_d(1:nn*ndof) )
437 tmp_a(1:3*ndof) = -matmul( xj(1:3*ndof, 1:3*ndof), tmpforce(1:3*ndof) )
439 ddaux(1:ndof, i) = tmp_a((i-1)*ndof+1:i*ndof)
445 totaldisp(:,1:nn) = u(:,:)+ du(:,:)
446 totaldisp(:,nn+1:nn+3) = aux(:,:) + ddaux(:,:)
453 stiff_ad(:, :) = 0.0d0
454 stiff_aa(:, :) = 0.0d0
459 elem(:,:) = (0.5d0*du(:,:)+u(:,:) ) +ecoord(:,:)
460 elem1(:,:) = (du(:,:)+u(:,:) ) +ecoord(:,:)
462 totaldisp(:,1:nn) = du(:,:)
463 if( iter == 1 ) aux(:,:) = 0.0d0
464 totaldisp(:,nn+1:nn+3) = aux(:,:)
469 call fetch_tabledata(
mc_orthoexp, gausses(1)%pMaterial%dict, alpo(:), ierr, ina )
470 if( .not. ierr ) matlaniso = .true.
473 naturalcoord(:) = 0.0d0
474 call getjacobian(etype, nn, naturalcoord, elem, det, jacobian, inverse)
475 inverse(:, :)= inverse(:, :)*det
477 call getjacobian(etype, nn, naturalcoord, elem1, det, jacobian, inverse1)
478 inverse1(:, :)= inverse1(:, :)*det
479 call getjacobian(etype, nn, naturalcoord, ecoord, det, jacobian, inverse0)
480 inverse0(:, :)= inverse0(:, :)*det
485 mtype = gausses(lx)%pMaterial%mtype
490 if( cdsys_id > 0 )
then
491 call set_localcoordsys( coords, g_localcoordsys(cdsys_id), coordsys(:,:), serr )
492 if( serr == -1 ) stop
"Fail to setup local coordinate"
493 if( serr == -2 )
then
495 write(*, *)
"WARNING! Cannot setup local coordinate, it is modified automatically"
507 ttc = dot_product(tt, spfunc)
508 tt0 = dot_product(t0, spfunc)
509 ttn = dot_product(tn, spfunc)
517 gderiv(nn+1, :) = -2.0d0*naturalcoord(1)*inverse(1, :)/det
518 gderiv(nn+2, :) = -2.0d0*naturalcoord(2)*inverse(2, :)/det
519 gderiv(nn+3, :) = -2.0d0*naturalcoord(3)*inverse(3, :)/det
522 gdispderiv(1:ndof, 1:ndof) = matmul( totaldisp(1:ndof, 1:nn+3), gderiv(1:nn+3, 1:ndof) )
523 dstrain(1) = gdispderiv(1, 1)
524 dstrain(2) = gdispderiv(2, 2)
525 dstrain(3) = gdispderiv(3, 3)
526 dstrain(4) = ( gdispderiv(1, 2)+gdispderiv(2, 1) )
527 dstrain(5) = ( gdispderiv(2, 3)+gdispderiv(3, 2) )
528 dstrain(6) = ( gdispderiv(3, 1)+gdispderiv(1, 3) )
529 dstrain(:) = dstrain(:)-epsth(:)
531 f(1:3,1:3) = 0.d0; f(1,1)=1.d0; f(2,2)=1.d0; f(3,3)=1.d0;
533 gausses(lx)%strain(1:6) = dstrain(1:6)+epsth(:)
534 f(1:3,1:3) = f(1:3,1:3) + gdispderiv(1:3,1:3)
538 dstrain(1) = dstrain(1)+0.5d0*dot_product( gdispderiv(:, 1), gdispderiv(:, 1) )
539 dstrain(2) = dstrain(2)+0.5d0*dot_product( gdispderiv(:, 2), gdispderiv(:, 2) )
540 dstrain(3) = dstrain(3)+0.5d0*dot_product( gdispderiv(:, 3), gdispderiv(:, 3) )
541 dstrain(4) = dstrain(4)+( gdispderiv(1, 1)*gdispderiv(1, 2) &
542 +gdispderiv(2, 1)*gdispderiv(2, 2)+gdispderiv(3, 1)*gdispderiv(3, 2) )
543 dstrain(5) = dstrain(5)+( gdispderiv(1, 2)*gdispderiv(1, 3) &
544 +gdispderiv(2, 2)*gdispderiv(2, 3)+gdispderiv(3, 2)*gdispderiv(3, 3) )
545 dstrain(6) = dstrain(6)+( gdispderiv(1, 1)*gdispderiv(1, 3) &
546 +gdispderiv(2, 1)*gdispderiv(2, 3)+gdispderiv(3, 1)*gdispderiv(3, 3) )
548 gausses(lx)%strain(1:6) = dstrain(1:6)+epsth(:)
554 rot(1, 2)= 0.5d0*(gdispderiv(1, 2)-gdispderiv(2, 1) ); rot(2, 1) = -rot(1, 2)
555 rot(2, 3)= 0.5d0*(gdispderiv(2, 3)-gdispderiv(3, 2) ); rot(3, 2) = -rot(2, 3)
556 rot(1, 3)= 0.5d0*(gdispderiv(1, 3)-gdispderiv(3, 1) ); rot(3, 1) = -rot(1, 3)
558 gausses(lx)%strain(1:6) = gausses(lx)%strain_bak(1:6)+ dstrain(1:6)+epsth(:)
559 call getglobalderiv(etype, nn, naturalcoord, ecoord, det0, gderiv0)
560 gderiv0(nn+1, :) = -2.0d0*naturalcoord(1)*inverse0(1, :)/det0
561 gderiv0(nn+2, :) = -2.0d0*naturalcoord(2)*inverse0(2, :)/det0
562 gderiv0(nn+3, :) = -2.0d0*naturalcoord(3)*inverse0(3, :)/det0
563 f(1:3,1:3) = f(1:3,1:3) + matmul( totaldisp(1:ndof, 1:nn+3), gderiv0(1:nn+3, 1:ndof) )
568 call update_stress3d( flag, gausses(lx), rot, dstrain, f, coordsys, time, tincr, ttc, tt0, ttn )
574 b(1:6, 1:(nn+3)*ndof) = 0.0d0
576 b(1,3*j-2) = gderiv(j, 1)
577 b(2,3*j-1) = gderiv(j, 2)
578 b(3,3*j ) = gderiv(j, 3)
579 b(4,3*j-2) = gderiv(j, 2)
580 b(4,3*j-1) = gderiv(j, 1)
581 b(5,3*j-1) = gderiv(j, 3)
582 b(5,3*j ) = gderiv(j, 2)
583 b(6,3*j-2) = gderiv(j, 3)
584 b(6,3*j ) = gderiv(j, 1)
592 gdispderiv(1:ndof, 1:ndof) = matmul( totaldisp(1:ndof, 1:nn+3), gderiv(1:nn+3, 1:ndof) )
593 b1(1:6, 1:(nn+3)*ndof)=0.0d0
595 b1(1, 3*j-2) = gdispderiv(1, 1)*gderiv(j, 1)
596 b1(1, 3*j-1) = gdispderiv(2, 1)*gderiv(j, 1)
597 b1(1, 3*j ) = gdispderiv(3, 1)*gderiv(j, 1)
598 b1(2, 3*j-2) = gdispderiv(1, 2)*gderiv(j, 2)
599 b1(2, 3*j-1) = gdispderiv(2, 2)*gderiv(j, 2)
600 b1(2, 3*j ) = gdispderiv(3, 2)*gderiv(j, 2)
601 b1(3, 3*j-2) = gdispderiv(1, 3)*gderiv(j, 3)
602 b1(3, 3*j-1) = gdispderiv(2, 3)*gderiv(j, 3)
603 b1(3, 3*j ) = gdispderiv(3, 3)*gderiv(j, 3)
604 b1(4, 3*j-2) = gdispderiv(1, 2)*gderiv(j, 1)+gdispderiv(1, 1)*gderiv(j, 2)
605 b1(4, 3*j-1) = gdispderiv(2, 2)*gderiv(j, 1)+gdispderiv(2, 1)*gderiv(j, 2)
606 b1(4, 3*j ) = gdispderiv(3, 2)*gderiv(j, 1)+gdispderiv(3, 1)*gderiv(j, 2)
607 b1(5, 3*j-2) = gdispderiv(1, 2)*gderiv(j, 3)+gdispderiv(1, 3)*gderiv(j, 2)
608 b1(5, 3*j-1) = gdispderiv(2, 2)*gderiv(j, 3)+gdispderiv(2, 3)*gderiv(j, 2)
609 b1(5, 3*j ) = gdispderiv(3, 2)*gderiv(j, 3)+gdispderiv(3, 3)*gderiv(j, 2)
610 b1(6, 3*j-2) = gdispderiv(1, 3)*gderiv(j, 1)+gdispderiv(1, 1)*gderiv(j, 3)
611 b1(6, 3*j-1) = gdispderiv(2, 3)*gderiv(j, 1)+gdispderiv(2, 1)*gderiv(j, 3)
612 b1(6, 3*j ) = gdispderiv(3, 3)*gderiv(j, 1)+gdispderiv(3, 1)*gderiv(j, 3)
616 b(:,j) = b(:,j)+b1(:,j)
621 call getglobalderiv(etype, nn, naturalcoord, elem1, det, gderiv(1:nn,1:3))
628 gderiv(nn+1, :) = -2.0d0*naturalcoord(1)*inverse1(1, :)/det
629 gderiv(nn+2, :) = -2.0d0*naturalcoord(2)*inverse1(2, :)/det
630 gderiv(nn+3, :) = -2.0d0*naturalcoord(3)*inverse1(3, :)/det
632 b(1:6, 1:(nn+3)*ndof) = 0.0d0
634 b(1, 3*j-2) = gderiv(j, 1)
635 b(2, 3*j-1) = gderiv(j, 2)
636 b(3, 3*j ) = gderiv(j, 3)
637 b(4, 3*j-2) = gderiv(j, 2)
638 b(4, 3*j-1) = gderiv(j, 1)
639 b(5, 3*j-1) = gderiv(j, 3)
640 b(5, 3*j ) = gderiv(j, 2)
641 b(6, 3*j-2) = gderiv(j, 3)
642 b(6, 3*j ) = gderiv(j, 1)
649 db(1:6, 1:(nn+3)*ndof) = matmul( d, b(1:6, 1:(nn+3)*ndof) )
653 stiff_ad(i, j) = stiff_ad(i, j)+dot_product( b(:, nn*ndof+i), db(:, j) )*wg
658 stiff_aa(i, j) = stiff_aa(i, j)+dot_product( b(:, nn*ndof+i), db(:, nn*ndof+j) )*wg
664 = qf(1:nn*ndof)+matmul( gausses(lx)%stress(1:6), b(1:6,1:nn*ndof) )*wg
666 = qf_a(1:3*ndof)+matmul( gausses(lx)%stress(1:6), b(1:6,nn*ndof+1:(nn+3)*ndof) )*wg
669 gausses(lx)%strain_energy = gausses(lx)%strain_energy*wg
673 xj(1:9, 1:9)= stiff_aa(1:3*ndof, 1:3*ndof)
675 tmpdisp(:) = matmul( xj(:,:), qf_a(:) )
677 qf(i) = qf(i) - dot_product( stiff_ad(:,i), tmpdisp(:) )
685 (etype, nn, xx, yy, zz, tt, t0, &
686 gausses, vect, cdsys_id, coords)
696 integer(kind=kint),
parameter :: ndof=3
697 integer(kind=kint),
intent(in) :: etype
698 integer(kind=kint),
intent(in) :: nn
699 real(kind=kreal),
intent(in) :: xx(nn), yy(nn), zz(nn)
700 real(kind=kreal),
intent(in) :: tt(nn), t0(nn)
702 real(kind=kreal),
intent(out) :: vect(nn*ndof)
703 integer(kind=kint),
intent(in) :: cdsys_id
704 real(kind=kreal),
intent(inout) :: coords(3, 3)
708 real(kind=kreal) :: alp, alp0
709 real(kind=kreal) :: d(6, 6), b(6, ndof*(nn+3)), db_a(6, ndof*3)
710 real(kind=kreal) :: det, wg, ecoord(3, nn)
711 integer(kind=kint) :: i, j, ic, serr
712 real(kind=kreal) :: epsth(6), sgm(6), h(nn), alpo(3), alpo0(3), coordsys(3, 3), xj(9, 9)
713 real(kind=kreal) :: naturalcoord(3), gderiv(nn+3, 3)
714 real(kind=kreal) :: jacobian(3, 3),inverse(3, 3)
715 real(kind=kreal) :: stiff_da(nn*3, 3*3), stiff_aa(3*3, 3*3)
716 real(kind=kreal) :: vect_a(3*3)
717 real(kind=kreal) :: icdisp(9)
718 real(kind=kreal) :: tempc, temp0, thermal_eps, tm(6, 6), outa(1), ina(1)
719 logical :: ierr, matlaniso
724 if( cdsys_id > 0 )
then
726 call fetch_tabledata( mc_orthoexp, gausses(1)%pMaterial%dict, alpo(:), ierr, ina )
727 if( .not. ierr ) matlaniso = .true.
735 naturalcoord(:) = 0.0d0
736 call getjacobian(etype, nn, naturalcoord, ecoord, det, jacobian, inverse)
737 inverse(:, :) = inverse(:, :)*det
741 stiff_da(:, :) = 0.0d0
742 stiff_aa(:, :) = 0.0d0
743 b(1:6, 1:(nn+3)*ndof) = 0.0d0
744 vect(1:nn*ndof) = 0.0d0
745 vect_a(1:3*ndof) = 0.0d0
750 call getglobalderiv( etype, nn, naturalcoord, ecoord, det, gderiv(1:nn, 1:3) )
752 if( cdsys_id > 0 )
then
754 if( serr == -1 ) stop
"Fail to setup local coordinate"
755 if( serr == -2 )
then
756 write(*,*)
"WARNING! Cannot setup local coordinate, it is modified automatically"
761 tempc = dot_product( h(1:nn), tt(1:nn) )
762 temp0 = dot_product( h(1:nn), t0(1:nn) )
763 call matlmatrix( gausses(ic), d3, d, 1.d0, 1.0d0, coordsys, tempc )
770 gderiv(nn+1, :) = -2.0d0*naturalcoord(1)*inverse(1, :)/det
771 gderiv(nn+2, :) = -2.0d0*naturalcoord(2)*inverse(2, :)/det
772 gderiv(nn+3, :) = -2.0d0*naturalcoord(3)*inverse(3, :)/det
776 b(1, 3*j-2) = gderiv(j, 1)
777 b(2, 3*j-1) = gderiv(j, 2)
778 b(3, 3*j ) = gderiv(j, 3)
779 b(4, 3*j-2) = gderiv(j, 2)
780 b(4, 3*j-1) = gderiv(j, 1)
781 b(5, 3*j-1) = gderiv(j, 3)
782 b(5, 3*j ) = gderiv(j, 2)
783 b(6, 3*j-2) = gderiv(j, 3)
784 b(6, 3*j ) = gderiv(j, 1)
787 db_a(1:6, 1:3*ndof) = matmul( d, b(1:6, nn*ndof+1:(nn+3)*ndof) )
790 stiff_da(i, j) = stiff_da(i, j) + dot_product( b(1:6, i), db_a(1:6, j) ) * wg
795 stiff_aa(i, j) = stiff_aa(i, j) + dot_product( b(1:6, nn*ndof+i), db_a(1:6, j) ) * wg
801 call fetch_tabledata( mc_orthoexp, gausses(ic)%pMaterial%dict, alpo(:), ierr, ina )
802 if( ierr ) stop
"Fails in fetching orthotropic expansion coefficient!"
804 call fetch_tabledata( mc_themoexp, gausses(ic)%pMaterial%dict, outa(:), ierr, ina )
805 if( ierr ) outa(1) = gausses(ic)%pMaterial%variables(m_expansion)
810 call fetch_tabledata( mc_orthoexp, gausses(ic)%pMaterial%dict, alpo0(:), ierr, ina )
811 if( ierr ) stop
"Fails in fetching orthotropic expansion coefficient!"
813 call fetch_tabledata( mc_themoexp, gausses(ic)%pMaterial%dict, outa(:), ierr, ina )
814 if( ierr ) outa(1) = gausses(ic)%pMaterial%variables(m_expansion)
827 epsth(:) = matmul( epsth(:), tm )
828 epsth(4:6) = epsth(4:6)*2.0d0
831 epsth(1:3) = thermal_eps
838 sgm(:) = matmul( d(:, :), epsth(:) )
843 vect(1:nn*ndof) = vect(1:nn*ndof)+matmul( sgm(1:6), b(1:6, 1:nn*ndof) )*wg
844 vect_a(1:3*ndof) = vect_a(1:3*ndof)+matmul( sgm(1:6), b(1:6, nn*ndof+1:(nn+3)*ndof) )*wg
849 xj(1:9,1:9)= stiff_aa(1:9, 1:9)
852 icdisp(1:9) = matmul( xj(:, :), vect_a(1:3*ndof) )
854 vect(1:nn*ndof) = vect(1:nn*ndof) - matmul( stiff_da(1:nn*ndof, 1:3*ndof), icdisp(1:3*ndof) )
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.
subroutine getjacobian(fetype, nn, localcoord, elecoord, det, jacobian, inverse)
calculate Jacobian matrix, its determinant and inverse
subroutine getquadpoint(fetype, np, pos)
Fetch the coordinate of gauss point.
subroutine getglobalderiv(fetype, nn, localcoord, elecoord, det, gderiv)
Calculate shape derivative in global coordinate system.
real(kind=kreal) function getweight(fetype, np)
Fetch the weight value in given gauss point.
integer function numofquadpoints(fetype)
Obtains the number of quadrature points of the element.
This modules defines common structures for fem analysis.
type(tlocalcoordsys), dimension(:), pointer, save g_localcoordsys
subroutine set_localcoordsys(coords, coordsys, outsys, ierr)
setup of coordinate system
This module provide functions for elastoplastic calculation.
This module defines common data and basic structures for analysis.
real(kind=kreal), pointer ref_temp
REFTEMP.
This module manages calculation relates with materials.
subroutine matlmatrix(gauss, sectType, matrix, time, dtime, cdsys, temperature, isEp, hdflag)
Calculate constituive matrix.
This module provides common functions of Solid elements.
subroutine geomat_c3(stress, mat)
subroutine cal_thermal_expansion_c3(tt0, ttc, material, coordsys, matlaniso, EPSTH)
subroutine update_stress3d(flag, gauss, rot, dstrain, F, coordsys, time, tincr, ttc, tt0, ttn, hdflag)
Eight-node hexagonal element with incompatible mode.
subroutine stf_c3d8ic(etype, nn, ecoord, gausses, stiff, cdsys_ID, coords, time, tincr, u, aux, temperature)
CALCULATION STIFF Matrix for C3D8IC ELEMENT.
subroutine update_c3d8ic(etype, nn, ecoord, u, du, ddu, cdsys_ID, coords, qf, gausses, iter, time, tincr, aux, ddaux, TT, T0, TN)
Update strain and stress inside element.
subroutine tload_c3d8ic(etype, nn, xx, yy, zz, tt, t0, gausses, VECT, cdsys_ID, coords)
This subroutine calculates thermal loading.
This module provides aux functions.
subroutine transformation(jacob, tm)
subroutine calinverse(NN, A)
calculate inverse of matrix a
This module summarizes all information of material properties.
integer(kind=kint), parameter d3
integer(kind=kint), parameter totallag
character(len=dict_key_length) mc_orthoexp
integer(kind=kint), parameter infinitesimal
integer(kind=kint), parameter updatelag
This modules defines a structure to record history dependent parameter in static analysis.
All data should be recorded in every quadrature points.