9 use hecmw,
only : kint, kreal
14 real(kind=kreal),
private,
parameter :: i33(3,3) = &
15 & reshape( (/1.d0, 0.d0, 0.d0, 0.d0, 1.d0, 0.d0, 0.d0, 0.d0, 1.d0/), (/3,3/) )
23 (etype, nn, ecoord, gausses, stiff, cdsys_id, coords, &
24 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, p, q, lx, serr
55 real(kind=kreal) :: naturalcoord(3)
56 real(kind=kreal) :: gdispderiv(3, 3)
57 real(kind=kreal) :: b1(6, ndof*nn)
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) :: coordsys(3, 3)
62 real(kind=kreal) :: elem0(3,nn), elem1(3, nn), gderiv1(nn,ndof), b2(6, ndof*nn), z1(3,2)
63 real(kind=kreal) :: v0, jacob, jacob_ave, gderiv1_ave(nn,ndof)
64 real(kind=kreal) :: gderiv2_ave(ndof*nn,ndof*nn)
65 real(kind=kreal) :: fbar(3,3), jratio(8), coeff, sff, dstrain(6), ddfs, fs(3,3), gfs(3,2)
71 flag = gausses(1)%pMaterial%nlgeom_flag
72 if( .not.
present(u) ) flag = infinitesimal
73 elem(:, :) = ecoord(:, :)
74 elem0(:, :) = ecoord(:, :)
75 if( flag == updatelag ) elem(:, :) = ecoord(:, :)+u(:, :)
76 elem1(:, :) = ecoord(:, :)+u(:, :)
81 gderiv1_ave(1:nn,1:ndof) = 0.d0
82 gderiv2_ave(1:ndof*nn,1:ndof*nn) = 0.d0
87 if( flag == infinitesimal )
then
90 gderiv1_ave(1:nn,1:ndof) = gderiv1_ave(1:nn,1:ndof) + jacob*wg*gderiv(1:nn, 1:ndof)
92 gdispderiv(1:3, 1:3) = matmul( u(1:ndof, 1:nn), gderiv(1:nn, 1:ndof) )
93 jacob =
determinant33( i33(1:ndof,1:ndof) + gdispderiv(1:ndof, 1:ndof) )
94 jratio(lx) = dsign(dabs(jacob)**(-1.d0/3.d0),jacob)
96 gderiv1_ave(1:nn,1:ndof) = gderiv1_ave(1:nn,1:ndof) + jacob*wg*gderiv1(1:nn, 1:ndof)
101 gderiv2_ave(3*p-3+i,3*q-3+j) = gderiv2_ave(3*p-3+i,3*q-3+j) &
102 & + jacob*wg*(gderiv1(p,i)*gderiv1(q,j)-gderiv1(q,i)*gderiv1(p,j))
109 jacob_ave = jacob_ave + jacob*wg
111 if( dabs(v0) > 1.d-12 )
then
112 if( dabs(jacob_ave) < 1.d-12 ) stop
'Error in Update_C3D8Fbar: too small average jacob'
113 jacob_ave = jacob_ave/v0
114 jratio(1:8) = (dsign(dabs(jacob_ave)**(1.d0/3.d0),jacob_ave))*jratio(1:8)
115 gderiv1_ave(1:nn,1:ndof) = gderiv1_ave(1:nn,1:ndof)/(v0*jacob_ave)
116 gderiv2_ave(1:ndof*nn,1:ndof*nn) = gderiv2_ave(1:ndof*nn,1:ndof*nn)/(v0*jacob_ave)
118 stop
'Error in Update_C3D8Fbar: too small element volume'
126 if( cdsys_id > 0 )
then
128 if( serr == -1 ) stop
"Fail to setup local coordinate"
129 if( serr == -2 )
then
131 write(*, *)
"WARNING! Cannot setup local coordinate, it is modified automatically"
137 temp = dot_product( temperature, spfunc )
138 call matlmatrix( gausses(lx), d3, d, time, tincr, coordsys, temp )
140 if( flag == updatelag )
then
141 call geomat_c3( gausses(lx)%stress, mat )
142 d(:, :) = d(:, :)-mat
146 b(1:6, 1:nn*ndof) = 0.0d0
148 b(1, 3*j-2) = gderiv(j, 1)
149 b(2, 3*j-1) = gderiv(j, 2)
150 b(3, 3*j ) = gderiv(j, 3)
151 b(4, 3*j-2) = gderiv(j, 2)
152 b(4, 3*j-1) = gderiv(j, 1)
153 b(5, 3*j-1) = gderiv(j, 3)
154 b(5, 3*j ) = gderiv(j, 2)
155 b(6, 3*j-2) = gderiv(j, 3)
156 b(6, 3*j ) = gderiv(j, 1)
160 if( flag == infinitesimal )
then
161 b2(1:6, 1:nn*ndof) = 0.0d0
163 z1(1:3,1) = (gderiv1_ave(j,1:3)-gderiv(j,1:3))/3.d0
164 b2(1,3*j-2:3*j) = z1(1:3,1)
165 b2(2,3*j-2:3*j) = z1(1:3,1)
166 b2(3,3*j-2:3*j) = z1(1:3,1)
171 b(1:3, j) = b(1:3,j)+b2(1:3,j)
174 else if( flag == totallag )
then
175 gdispderiv(1:ndof, 1:ndof) = matmul( u(1:ndof, 1:nn), gderiv(1:nn, 1:ndof) )
176 fbar(1:ndof, 1:ndof) = jratio(lx)*(i33(1:ndof,1:ndof) + gdispderiv(1:ndof, 1:ndof))
177 call getglobalderiv( etype, nn, naturalcoord, elem1, det, gderiv1)
180 b1(1:6, 1:nn*ndof) = 0.0d0
182 b1(1, 3*j-2) = gdispderiv(1, 1)*gderiv(j, 1)
183 b1(1, 3*j-1) = gdispderiv(2, 1)*gderiv(j, 1)
184 b1(1, 3*j ) = gdispderiv(3, 1)*gderiv(j, 1)
185 b1(2, 3*j-2) = gdispderiv(1, 2)*gderiv(j, 2)
186 b1(2, 3*j-1) = gdispderiv(2, 2)*gderiv(j, 2)
187 b1(2, 3*j ) = gdispderiv(3, 2)*gderiv(j, 2)
188 b1(3, 3*j-2) = gdispderiv(1, 3)*gderiv(j, 3)
189 b1(3, 3*j-1) = gdispderiv(2, 3)*gderiv(j, 3)
190 b1(3, 3*j ) = gdispderiv(3, 3)*gderiv(j, 3)
191 b1(4, 3*j-2) = gdispderiv(1, 2)*gderiv(j, 1)+gdispderiv(1, 1)*gderiv(j, 2)
192 b1(4, 3*j-1) = gdispderiv(2, 2)*gderiv(j, 1)+gdispderiv(2, 1)*gderiv(j, 2)
193 b1(4, 3*j ) = gdispderiv(3, 2)*gderiv(j, 1)+gdispderiv(3, 1)*gderiv(j, 2)
194 b1(5, 3*j-2) = gdispderiv(1, 2)*gderiv(j, 3)+gdispderiv(1, 3)*gderiv(j, 2)
195 b1(5, 3*j-1) = gdispderiv(2, 2)*gderiv(j, 3)+gdispderiv(2, 3)*gderiv(j, 2)
196 b1(5, 3*j ) = gdispderiv(3, 2)*gderiv(j, 3)+gdispderiv(3, 3)*gderiv(j, 2)
197 b1(6, 3*j-2) = gdispderiv(1, 3)*gderiv(j, 1)+gdispderiv(1, 1)*gderiv(j, 3)
198 b1(6, 3*j-1) = gdispderiv(2, 3)*gderiv(j, 1)+gdispderiv(2, 1)*gderiv(j, 3)
199 b1(6, 3*j ) = gdispderiv(3, 3)*gderiv(j, 1)+gdispderiv(3, 1)*gderiv(j, 3)
202 dstrain(1) = 0.5d0*(dot_product(fbar(1:3,1),fbar(1:3,1))-1.d0)
203 dstrain(2) = 0.5d0*(dot_product(fbar(1:3,2),fbar(1:3,2))-1.d0)
204 dstrain(3) = 0.5d0*(dot_product(fbar(1:3,3),fbar(1:3,3))-1.d0)
205 dstrain(4) = dot_product(fbar(1:3,1),fbar(1:3,2))
206 dstrain(5) = dot_product(fbar(1:3,2),fbar(1:3,3))
207 dstrain(6) = dot_product(fbar(1:3,3),fbar(1:3,1))
209 b2(1:6, 1:nn*ndof) = 0.0d0
211 z1(1:3,1) = (gderiv1_ave(j,1:3)-gderiv1(j,1:3))/3.d0
212 b2(1,3*j-2:3*j) = (2.d0*dstrain(1)+1.d0)*z1(1:3,1)
213 b2(2,3*j-2:3*j) = (2.d0*dstrain(2)+1.d0)*z1(1:3,1)
214 b2(3,3*j-2:3*j) = (2.d0*dstrain(3)+1.d0)*z1(1:3,1)
215 b2(4,3*j-2:3*j) = 2.d0*dstrain(4)*z1(1:3,1)
216 b2(5,3*j-2:3*j) = 2.d0*dstrain(5)*z1(1:3,1)
217 b2(6,3*j-2:3*j) = 2.d0*dstrain(6)*z1(1:3,1)
222 b(:, j) = jratio(lx)*jratio(lx)*(b(:,j)+b1(:,j))+b2(:,j)
225 else if( flag == updatelag )
then
226 wg = (jratio(lx)**3.d0)*
getweight(etype, lx)*det
228 b2(1:3, 1:nn*ndof) = 0.0d0
230 z1(1:3,1) = (gderiv1_ave(j,1:3)-gderiv(j,1:3))/3.d0
231 b2(1, 3*j-2:3*j) = z1(1:3,1)
232 b2(2, 3*j-2:3*j) = z1(1:3,1)
233 b2(3, 3*j-2:3*j) = z1(1:3,1)
237 b(1:3, j) = b(1:3,j)+b2(1:3,j)
242 db(1:6, 1:nn*ndof) = matmul( d, b(1:6, 1:nn*ndof) )
245 stiff(i, j) = stiff(i, j)+dot_product( b(:, i), db(:, j) )*wg
250 if( flag == totallag .or. flag == updatelag )
then
251 stress(1:6) = gausses(lx)%stress
252 if( flag == totallag )
then
254 sff = dot_product(stress(1:6),dstrain(1:6))
255 else if( flag == updatelag )
then
257 sff = stress(1)+stress(2)+stress(3)
259 fbar(1:3,1:3) = i33(1:3,1:3)
262 bn(1:9, 1:nn*ndof) = 0.0d0
264 bn(1, 3*j-2) = coeff*gderiv(j, 1)
265 bn(2, 3*j-1) = coeff*gderiv(j, 1)
266 bn(3, 3*j ) = coeff*gderiv(j, 1)
267 bn(4, 3*j-2) = coeff*gderiv(j, 2)
268 bn(5, 3*j-1) = coeff*gderiv(j, 2)
269 bn(6, 3*j ) = coeff*gderiv(j, 2)
270 bn(7, 3*j-2) = coeff*gderiv(j, 3)
271 bn(8, 3*j-1) = coeff*gderiv(j, 3)
272 bn(9, 3*j ) = coeff*gderiv(j, 3)
273 z1(1:3,1) = (gderiv1_ave(j,1:3)-gderiv1(j,1:3))/3.d0
274 bn(1, 3*j-2:3*j) = bn(1, 3*j-2:3*j) + fbar(1,1)*z1(1:3,1)
275 bn(2, 3*j-2:3*j) = bn(2, 3*j-2:3*j) + fbar(2,1)*z1(1:3,1)
276 bn(3, 3*j-2:3*j) = bn(3, 3*j-2:3*j) + fbar(3,1)*z1(1:3,1)
277 bn(4, 3*j-2:3*j) = bn(4, 3*j-2:3*j) + fbar(1,2)*z1(1:3,1)
278 bn(5, 3*j-2:3*j) = bn(5, 3*j-2:3*j) + fbar(2,2)*z1(1:3,1)
279 bn(6, 3*j-2:3*j) = bn(6, 3*j-2:3*j) + fbar(3,2)*z1(1:3,1)
280 bn(7, 3*j-2:3*j) = bn(7, 3*j-2:3*j) + fbar(1,3)*z1(1:3,1)
281 bn(8, 3*j-2:3*j) = bn(8, 3*j-2:3*j) + fbar(2,3)*z1(1:3,1)
282 bn(9, 3*j-2:3*j) = bn(9, 3*j-2:3*j) + fbar(3,3)*z1(1:3,1)
286 smat(j , j ) = stress(1)
287 smat(j , j+3) = stress(4)
288 smat(j , j+6) = stress(6)
289 smat(j+3, j ) = stress(4)
290 smat(j+3, j+3) = stress(2)
291 smat(j+3, j+6) = stress(5)
292 smat(j+6, j ) = stress(6)
293 smat(j+6, j+3) = stress(5)
294 smat(j+6, j+6) = stress(3)
296 sbn(1:9, 1:nn*ndof) = matmul( smat(1:9, 1:9), bn(1:9, 1:nn*ndof) )
299 stiff(i, j) = stiff(i, j)+dot_product( bn(:, i), sbn(:, j) )*wg
304 fs(1,1) = fbar(1,1)*stress(1)+fbar(1,2)*stress(4)+fbar(1,3)*stress(6)
305 fs(1,2) = fbar(1,1)*stress(4)+fbar(1,2)*stress(2)+fbar(1,3)*stress(5)
306 fs(1,3) = fbar(1,1)*stress(6)+fbar(1,2)*stress(5)+fbar(1,3)*stress(3)
307 fs(2,1) = fbar(2,1)*stress(1)+fbar(2,2)*stress(4)+fbar(2,3)*stress(6)
308 fs(2,2) = fbar(2,1)*stress(4)+fbar(2,2)*stress(2)+fbar(2,3)*stress(5)
309 fs(2,3) = fbar(2,1)*stress(6)+fbar(2,2)*stress(5)+fbar(2,3)*stress(3)
310 fs(3,1) = fbar(3,1)*stress(1)+fbar(3,2)*stress(4)+fbar(3,3)*stress(6)
311 fs(3,2) = fbar(3,1)*stress(4)+fbar(3,2)*stress(2)+fbar(3,3)*stress(5)
312 fs(3,3) = fbar(3,1)*stress(6)+fbar(3,2)*stress(5)+fbar(3,3)*stress(3)
314 z1(1:3,1) = (gderiv1_ave(i,1:3)-gderiv1(i,1:3))/3.d0
315 gfs(1:3,1) = coeff*matmul(fs,gderiv(i,1:3))
317 z1(1:3,2) = (gderiv1_ave(j,1:3)-gderiv1(j,1:3))/3.d0
318 gfs(1:3,2) = coeff*matmul(fs,gderiv(j,1:3))
321 ddfs = z1(p,1)*z1(q,2)
322 ddfs = ddfs + (gderiv2_ave(3*i-3+p,3*j-3+q)-gderiv1_ave(i,p)*gderiv1_ave(j,q))/3.d0
323 ddfs = ddfs + gderiv1(i,q)*gderiv1(j,p)/3.d0
324 ddfs = sff*ddfs + z1(p,1)*gfs(q,2)+z1(q,2)*gfs(p,1)
325 stiff(3*i-3+p, 3*j-3+q) = stiff(3*i-3+p, 3*j-3+q) + ddfs*wg
341 (etype, nn, ecoord, u, du, cdsys_id, coords, &
342 qf, gausses, iter, time, tincr, tt, t0, tn )
356 integer(kind=kint),
intent(in) :: etype
357 integer(kind=kint),
intent(in) :: nn
358 real(kind=kreal),
intent(in) :: ecoord(3, nn)
359 real(kind=kreal),
intent(in) :: u(3, nn)
360 real(kind=kreal),
intent(in) :: du(3, nn)
361 integer(kind=kint),
intent(in) :: cdsys_id
362 real(kind=kreal),
intent(inout) :: coords(3, 3)
363 real(kind=kreal),
intent(out) :: qf(nn*3)
365 integer,
intent(in) :: iter
366 real(kind=kreal),
intent(in) :: time
367 real(kind=kreal),
intent(in) :: tincr
368 real(kind=kreal),
intent(in) :: tt(nn)
369 real(kind=kreal),
intent(in) :: t0(nn)
370 real(kind=kreal),
intent(in) :: tn(nn)
374 integer(kind=kint) :: flag
375 integer(kind=kint),
parameter :: ndof = 3
376 real(kind=kreal) :: b(6, ndof*nn), b1(6, ndof*nn)
377 real(kind=kreal) :: gderiv(nn, 3), gdispderiv(3, 3), det, wg
378 integer(kind=kint) :: j, lx, serr
379 real(kind=kreal) :: naturalcoord(3), rot(3, 3), spfunc(nn)
380 real(kind=kreal) :: totaldisp(3, nn), elem(3, nn), elem1(3, nn), coordsys(3, 3)
381 real(kind=kreal) :: dstrain(6)
382 real(kind=kreal) :: dvol
383 real(kind=kreal) :: ttc, tt0, ttn, alpo(3), ina(1), epsth(6)
384 logical :: ierr, matlaniso
386 real(kind=kreal) :: elem0(3,nn), gderiv1(nn,ndof), b2(6, ndof*nn), z1(3)
387 real(kind=kreal) :: v0, jacob, jacob_ave, gderiv1_ave(nn,ndof)
388 real(kind=kreal) :: fbar(3,3), jratio(8)
389 real(kind=kreal) :: jacob_ave05, gderiv05_ave(nn,ndof)
395 flag = gausses(1)%pMaterial%nlgeom_flag
396 elem0(1:ndof,1:nn) = ecoord(1:ndof,1:nn)
397 totaldisp(:, :) = u(:, :)+du(:, :)
399 elem(:, :) = ecoord(:, :)
400 elem1(:, :) = ecoord(:, :)
402 elem(:, :) = ecoord(:, :)
403 elem1(:, :) = ( du(:, :)+u(:, :) )+ecoord(:, :)
405 elem(:, :) = ( 0.5d0*du(:, :)+u(:, :) )+ecoord(:, :)
406 elem1(:, :) = ( du(:, :)+u(:, :) )+ecoord(:, :)
407 totaldisp(:, :) = du(:, :)
412 call fetch_tabledata(
mc_orthoexp, gausses(1)%pMaterial%dict, alpo(:), ierr, ina )
413 if( .not. ierr ) matlaniso = .true.
418 gderiv1_ave(1:nn,1:ndof) = 0.d0
421 gderiv05_ave(1:nn,1:ndof) = 0.d0
430 gderiv1(1:nn, 1:ndof) = gderiv(1:nn, 1:ndof)
432 gdispderiv(1:3, 1:3) = matmul( du(1:ndof, 1:nn)+u(1:ndof, 1:nn), gderiv(1:nn, 1:ndof) )
433 jacob =
determinant33( i33(1:ndof,1:ndof) + gdispderiv(1:ndof, 1:ndof) )
434 jratio(lx) = dsign(dabs(jacob)**(-1.d0/3.d0),jacob)
436 call getglobalderiv( etype, nn, naturalcoord, elem1, det, gderiv1)
439 jacob_ave = jacob_ave + jacob*wg
440 gderiv1_ave(1:nn,1:ndof) = gderiv1_ave(1:nn,1:ndof) + jacob*wg*gderiv1(1:nn, 1:ndof)
444 jacob_ave05 = jacob_ave05 + wg
445 gderiv05_ave(1:nn,1:ndof) = gderiv05_ave(1:nn,1:ndof) + wg*gderiv1(1:nn, 1:ndof)
448 if( dabs(v0) > 1.d-12 )
then
449 if( dabs(jacob_ave) < 1.d-12 ) stop
'Error in Update_C3D8Fbar: too small average jacob'
450 jacob_ave = jacob_ave/v0
451 jratio(1:8) = (dsign(dabs(jacob_ave)**(1.d0/3.d0),jacob_ave))*jratio(1:8)
452 gderiv1_ave(1:nn,1:ndof) = gderiv1_ave(1:nn,1:ndof)/(v0*jacob_ave)
453 if( flag ==
updatelag ) gderiv05_ave(1:nn,1:ndof) = gderiv05_ave(1:nn,1:ndof)/jacob_ave05
455 stop
'Error in Update_C3D8Fbar: too small element volume'
463 if( cdsys_id > 0 )
then
464 call set_localcoordsys( coords, g_localcoordsys(cdsys_id), coordsys(:, :), serr )
465 if( serr == -1 ) stop
"Fail to setup local coordinate"
466 if( serr == -2 )
then
468 write(*, *)
"WARNING! Cannot setup local coordinate, it is modified automatically"
473 gdispderiv(1:ndof, 1:ndof) = matmul( totaldisp(1:ndof, 1:nn), gderiv(1:nn, 1:ndof) )
481 ttc = dot_product(tt, spfunc)
482 tt0 = dot_product(t0, spfunc)
483 ttn = dot_product(tn, spfunc)
488 dvol = dot_product( totaldisp(1,1:nn), gderiv1_ave(1:nn,1) )
489 dvol = dvol + dot_product( totaldisp(2,1:nn), gderiv1_ave(1:nn,2) )
490 dvol = dvol + dot_product( totaldisp(3,1:nn), gderiv1_ave(1:nn,3) )
491 dvol = (dvol-(gdispderiv(1,1)+gdispderiv(2,2)+gdispderiv(3,3)))/3.d0
492 dstrain(1) = gdispderiv(1, 1) + dvol
493 dstrain(2) = gdispderiv(2, 2) + dvol
494 dstrain(3) = gdispderiv(3, 3) + dvol
495 dstrain(4) = ( gdispderiv(1, 2)+gdispderiv(2, 1) )
496 dstrain(5) = ( gdispderiv(2, 3)+gdispderiv(3, 2) )
497 dstrain(6) = ( gdispderiv(3, 1)+gdispderiv(1, 3) )
498 dstrain(:) = dstrain(:)-epsth(:)
500 gausses(lx)%strain(1:6) = dstrain(1:6)+epsth(:)
503 fbar(1:ndof, 1:ndof) = jratio(lx)*(i33(1:ndof,1:ndof) + gdispderiv(1:ndof, 1:ndof))
506 dstrain(1) = 0.5d0*(dot_product(fbar(1:3,1),fbar(1:3,1))-1.d0)
507 dstrain(2) = 0.5d0*(dot_product(fbar(1:3,2),fbar(1:3,2))-1.d0)
508 dstrain(3) = 0.5d0*(dot_product(fbar(1:3,3),fbar(1:3,3))-1.d0)
509 dstrain(4) = dot_product(fbar(1:3,1),fbar(1:3,2))
510 dstrain(5) = dot_product(fbar(1:3,2),fbar(1:3,3))
511 dstrain(6) = dot_product(fbar(1:3,3),fbar(1:3,1))
512 dstrain(:) = dstrain(:)-epsth(:)
514 gausses(lx)%strain(1:6) = dstrain(1:6)+epsth(:)
517 dvol = dot_product( totaldisp(1,1:nn), gderiv05_ave(1:nn,1) )
518 dvol = dvol + dot_product( totaldisp(2,1:nn), gderiv05_ave(1:nn,2) )
519 dvol = dvol + dot_product( totaldisp(3,1:nn), gderiv05_ave(1:nn,3) )
520 dvol = (dvol-(gdispderiv(1,1)+gdispderiv(2,2)+gdispderiv(3,3)))/3.d0
521 dstrain(1) = gdispderiv(1, 1) + dvol
522 dstrain(2) = gdispderiv(2, 2) + dvol
523 dstrain(3) = gdispderiv(3, 3) + dvol
524 dstrain(4) = ( gdispderiv(1, 2)+gdispderiv(2, 1) )
525 dstrain(5) = ( gdispderiv(2, 3)+gdispderiv(3, 2) )
526 dstrain(6) = ( gdispderiv(3, 1)+gdispderiv(1, 3) )
527 dstrain(:) = dstrain(:)-epsth(:)
530 rot(1, 2)= 0.5d0*( gdispderiv(1, 2)-gdispderiv(2, 1) ); rot(2, 1) = -rot(1, 2)
531 rot(2, 3)= 0.5d0*( gdispderiv(2, 3)-gdispderiv(3, 2) ); rot(3, 2) = -rot(2, 3)
532 rot(1, 3)= 0.5d0*( gdispderiv(1, 3)-gdispderiv(3, 1) ); rot(3, 1) = -rot(1, 3)
534 gausses(lx)%strain(1:6) = gausses(lx)%strain_bak(1:6)+dstrain(1:6)+epsth(:)
536 call getglobalderiv( etype, nn, naturalcoord, elem0, det, gderiv1)
537 gdispderiv(1:ndof, 1:ndof) = matmul( du(1:ndof, 1:nn)+u(1:ndof, 1:nn), gderiv1(1:nn, 1:ndof) )
538 fbar(1:ndof, 1:ndof) = jratio(lx)*(i33(1:ndof,1:ndof) + gdispderiv(1:ndof, 1:ndof))
543 call update_stress3d( flag, gausses(lx), rot, dstrain, fbar, coordsys, time, tincr, ttc, tt0, ttn )
549 b(1:6, 1:nn*ndof) = 0.0d0
551 b(1,3*j-2) = gderiv(j, 1)
552 b(2,3*j-1) = gderiv(j, 2)
553 b(3,3*j ) = gderiv(j, 3)
554 b(4,3*j-2) = gderiv(j, 2)
555 b(4,3*j-1) = gderiv(j, 1)
556 b(5,3*j-1) = gderiv(j, 3)
557 b(5,3*j ) = gderiv(j, 2)
558 b(6,3*j-2) = gderiv(j, 3)
559 b(6,3*j ) = gderiv(j, 1)
564 gderiv1(1:nn, 1:ndof) = gderiv(1:nn, 1:ndof)
566 b2(1:6, 1:nn*ndof) = 0.0d0
568 z1(1:3) = (gderiv1_ave(j,1:3)-gderiv1(j,1:3))/3.d0
569 b2(1,3*j-2:3*j) = z1(1:3)
570 b2(2,3*j-2:3*j) = z1(1:3)
571 b2(3,3*j-2:3*j) = z1(1:3)
576 b(:, j) = b(:,j)+b2(:,j)
581 b1(1:6, 1:nn*ndof) = 0.0d0
583 b1(1, 3*j-2) = gdispderiv(1, 1)*gderiv(j, 1)
584 b1(1, 3*j-1) = gdispderiv(2, 1)*gderiv(j, 1)
585 b1(1, 3*j ) = gdispderiv(3, 1)*gderiv(j, 1)
586 b1(2, 3*j-2) = gdispderiv(1, 2)*gderiv(j, 2)
587 b1(2, 3*j-1) = gdispderiv(2, 2)*gderiv(j, 2)
588 b1(2, 3*j ) = gdispderiv(3, 2)*gderiv(j, 2)
589 b1(3, 3*j-2) = gdispderiv(1, 3)*gderiv(j, 3)
590 b1(3, 3*j-1) = gdispderiv(2, 3)*gderiv(j, 3)
591 b1(3, 3*j ) = gdispderiv(3, 3)*gderiv(j, 3)
592 b1(4, 3*j-2) = gdispderiv(1, 2)*gderiv(j, 1)+gdispderiv(1, 1)*gderiv(j, 2)
593 b1(4, 3*j-1) = gdispderiv(2, 2)*gderiv(j, 1)+gdispderiv(2, 1)*gderiv(j, 2)
594 b1(4, 3*j ) = gdispderiv(3, 2)*gderiv(j, 1)+gdispderiv(3, 1)*gderiv(j, 2)
595 b1(5, 3*j-2) = gdispderiv(1, 2)*gderiv(j, 3)+gdispderiv(1, 3)*gderiv(j, 2)
596 b1(5, 3*j-1) = gdispderiv(2, 2)*gderiv(j, 3)+gdispderiv(2, 3)*gderiv(j, 2)
597 b1(5, 3*j ) = gdispderiv(3, 2)*gderiv(j, 3)+gdispderiv(3, 3)*gderiv(j, 2)
598 b1(6, 3*j-2) = gdispderiv(1, 3)*gderiv(j, 1)+gdispderiv(1, 1)*gderiv(j, 3)
599 b1(6, 3*j-1) = gdispderiv(2, 3)*gderiv(j, 1)+gdispderiv(2, 1)*gderiv(j, 3)
600 b1(6, 3*j ) = gdispderiv(3, 3)*gderiv(j, 1)+gdispderiv(3, 1)*gderiv(j, 3)
605 b2(1:6, 1:nn*ndof) = 0.0d0
607 z1(1:3) = (gderiv1_ave(j,1:3)-gderiv1(j,1:3))/3.d0
608 b2(1,3*j-2:3*j) = (2.d0*dstrain(1)+1.d0)*z1(1:3)
609 b2(2,3*j-2:3*j) = (2.d0*dstrain(2)+1.d0)*z1(1:3)
610 b2(3,3*j-2:3*j) = (2.d0*dstrain(3)+1.d0)*z1(1:3)
611 b2(4,3*j-2:3*j) = 2.d0*dstrain(4)*z1(1:3)
612 b2(5,3*j-2:3*j) = 2.d0*dstrain(5)*z1(1:3)
613 b2(6,3*j-2:3*j) = 2.d0*dstrain(6)*z1(1:3)
618 b(:, j) = jratio(lx)*jratio(lx)*(b(:,j)+b1(:,j))+b2(:,j)
624 wg = (jratio(lx)**3.d0)*
getweight(etype, lx)*det
625 b(1:6, 1:nn*ndof) = 0.0d0
627 b(1, 3*j-2) = gderiv(j, 1)
628 b(2, 3*j-1) = gderiv(j, 2)
629 b(3, 3*j ) = gderiv(j, 3)
630 b(4, 3*j-2) = gderiv(j, 2)
631 b(4, 3*j-1) = gderiv(j, 1)
632 b(5, 3*j-1) = gderiv(j, 3)
633 b(5, 3*j ) = gderiv(j, 2)
634 b(6, 3*j-2) = gderiv(j, 3)
635 b(6, 3*j ) = gderiv(j, 1)
638 b2(1:3, 1:nn*ndof) = 0.0d0
640 z1(1:3) = (gderiv1_ave(j,1:3)-gderiv(j,1:3))/3.d0
641 b2(1, 3*j-2:3*j) = z1(1:3)
642 b2(2, 3*j-2:3*j) = z1(1:3)
643 b2(3, 3*j-2:3*j) = z1(1:3)
647 b(1:3, j) = b(1:3,j)+b2(1:3,j)
653 = qf(1:nn*ndof)+matmul( gausses(lx)%stress(1:6), b(1:6,1:nn*ndof) )*wg
656 gausses(lx)%strain_energy = gausses(lx)%strain_energy*wg
664 (etype, nn, xx, yy, zz, tt, t0, &
665 gausses, vect, cdsys_id, coords)
675 integer(kind=kint),
parameter :: ndof = 3
676 integer(kind=kint),
intent(in) :: etype, nn
678 real(kind=kreal),
intent(in) :: xx(nn), yy(nn), zz(nn)
679 real(kind=kreal),
intent(in) :: tt(nn), t0(nn)
680 real(kind=kreal),
intent(out) :: vect(nn*ndof)
681 integer(kind=kint),
intent(in) :: cdsys_ID
682 real(kind=kreal),
intent(inout) :: coords(3, 3)
686 real(kind=kreal) :: alp, alp0, d(6, 6), b(6, ndof*nn)
687 real(kind=kreal) :: z1(3), det, ecoord(3, nn)
688 integer(kind=kint) :: j, LX, serr
689 real(kind=kreal) :: estrain(6), sgm(6), h(nn)
690 real(kind=kreal) :: naturalcoord(3), gderiv(nn, 3)
691 real(kind=kreal) :: wg, outa(1), ina(1), gderiv1_ave(nn, 3), alpo(3), alpo0(3), coordsys(3, 3)
692 real(kind=kreal) :: tempc, temp0, v0, jacob_ave, thermal_eps, tm(6,6)
693 logical :: ierr, matlaniso
699 if( cdsys_id > 0 )
then
701 call fetch_tabledata( mc_orthoexp, gausses(1)%pMaterial%dict, alpo(:), ierr, ina )
702 if( .not. ierr ) matlaniso = .true.
714 gderiv1_ave(1:nn,1:ndof) = 0.d0
717 call getglobalderiv( etype, nn, naturalcoord, ecoord, det, gderiv)
720 jacob_ave = jacob_ave + wg
721 gderiv1_ave(1:nn,1:ndof) = gderiv1_ave(1:nn,1:ndof) + wg*gderiv(1:nn, 1:ndof)
723 if( dabs(v0) > 1.d-12 )
then
724 if( dabs(jacob_ave) < 1.d-12 ) stop
'Error in TLOAD_C3D8Fbar: too small average jacob'
725 jacob_ave = jacob_ave/v0
726 gderiv1_ave(1:nn,1:ndof) = gderiv1_ave(1:nn,1:ndof)/(v0*jacob_ave)
728 stop
'Error in TLOAD_C3D8Fbar: too small element volume'
738 if( cdsys_id > 0 )
then
739 call set_localcoordsys(coords, g_localcoordsys(cdsys_id), coordsys, serr)
740 if( serr == -1 ) stop
"Fail to setup local coordinate"
741 if( serr == -2 )
then
742 write(*, *)
"WARNING! Cannot setup local coordinate, it is modified automatically"
748 b(1:6, 1:nn*ndof) = 0.0d0
750 b(1,3*j-2) = gderiv(j, 1)
751 b(2,3*j-1) = gderiv(j, 2)
752 b(3,3*j ) = gderiv(j, 3)
753 b(4,3*j-2) = gderiv(j, 2)
754 b(4,3*j-1) = gderiv(j, 1)
755 b(5,3*j-1) = gderiv(j, 3)
756 b(5,3*j ) = gderiv(j, 2)
757 b(6,3*j-2) = gderiv(j, 3)
758 b(6,3*j ) = gderiv(j, 1)
762 z1(1:3) = (gderiv1_ave(j,1:3)-gderiv(j,1:3))/3.d0
763 b(1,3*j-2:3*j) = b(1,3*j-2:3*j)+z1(1:3)
764 b(2,3*j-2:3*j) = b(2,3*j-2:3*j)+z1(1:3)
765 b(3,3*j-2:3*j) = b(3,3*j-2:3*j)+z1(1:3)
768 tempc = dot_product( h(1:nn),tt(1:nn) )
769 temp0 = dot_product( h(1:nn),t0(1:nn) )
771 call matlmatrix( gausses(lx), d3, d, 1.d0, 0.0d0, coordsys, tempc )
775 call fetch_tabledata( mc_orthoexp, gausses(lx)%pMaterial%dict, alpo(:), ierr, ina )
776 if( ierr ) stop
"Fails in fetching orthotropic expansion coefficient!"
778 call fetch_tabledata( mc_themoexp, gausses(lx)%pMaterial%dict, outa(:), ierr, ina )
779 if( ierr ) outa(1) = gausses(lx)%pMaterial%variables(m_expansion)
784 call fetch_tabledata( mc_orthoexp, gausses(lx)%pMaterial%dict, alpo0(:), ierr, ina )
785 if( ierr ) stop
"Fails in fetching orthotropic expansion coefficient!"
787 call fetch_tabledata( mc_themoexp, gausses(lx)%pMaterial%dict, outa(:), ierr, ina )
788 if( ierr ) outa(1) = gausses(lx)%pMaterial%variables(m_expansion)
801 estrain(:) = matmul( estrain(:), tm )
802 estrain(4:6) = estrain(4:6)*2.0d0
805 estrain(1:3) = thermal_eps
812 sgm(:) = matmul( d(:, :), estrain(:) )
817 vect(1:nn*ndof) = vect(1:nn*ndof)+matmul( sgm(:), b(:, :) )*wg
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 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)
This module contains several strategy to free locking problem in Eight-node hexagonal element.
subroutine update_c3d8fbar(etype, nn, ecoord, u, du, cdsys_ID, coords, qf, gausses, iter, time, tincr, TT, T0, TN)
Update Strain stress of this element.
subroutine stf_c3d8fbar(etype, nn, ecoord, gausses, stiff, cdsys_ID, coords, time, tincr, u, temperature)
This subroutine calculate stiff matrix using F-bar method.
subroutine tload_c3d8fbar(etype, nn, XX, YY, ZZ, TT, T0, gausses, VECT, cdsys_ID, coords)
This subroutien calculate thermal loading.
This module provides aux functions.
real(kind=kreal) function determinant33(XJ)
Compute determinant for 3*3 matrix.
subroutine transformation(jacob, tm)
This module provides functions for hyperelastic calculation.
This module summarizes all information of material properties.
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.