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
89 gderiv1_ave(1:nn,1:ndof) = gderiv1_ave(1:nn,1:ndof) + jacob*wg*gderiv(1:nn, 1:ndof)
91 gdispderiv(1:3, 1:3) = matmul( u(1:ndof, 1:nn), gderiv(1:nn, 1:ndof) )
92 jacob =
determinant33( i33(1:ndof,1:ndof) + gdispderiv(1:ndof, 1:ndof) )
93 jratio(lx) = dsign(dabs(jacob)**(-1.d0/3.d0),jacob)
95 gderiv1_ave(1:nn,1:ndof) = gderiv1_ave(1:nn,1:ndof) + jacob*wg*gderiv1(1:nn, 1:ndof)
100 gderiv2_ave(3*p-3+i,3*q-3+j) = gderiv2_ave(3*p-3+i,3*q-3+j) &
101 & + jacob*wg*(gderiv1(p,i)*gderiv1(q,j)-gderiv1(q,i)*gderiv1(p,j))
108 jacob_ave = jacob_ave + jacob*wg
110 if( dabs(v0) > 1.d-12 )
then
111 if( dabs(jacob_ave) < 1.d-12 ) stop
'Error in Update_C3D8Fbar: too small average jacob'
112 jacob_ave = jacob_ave/v0
113 jratio(1:8) = (dsign(dabs(jacob_ave)**(1.d0/3.d0),jacob_ave))*jratio(1:8)
114 gderiv1_ave(1:nn,1:ndof) = gderiv1_ave(1:nn,1:ndof)/(v0*jacob_ave)
115 gderiv2_ave(1:ndof*nn,1:ndof*nn) = gderiv2_ave(1:ndof*nn,1:ndof*nn)/(v0*jacob_ave)
117 stop
'Error in Update_C3D8Fbar: too small element volume'
125 if( cdsys_id > 0 )
then
127 if( serr == -1 ) stop
"Fail to setup local coordinate"
128 if( serr == -2 )
then
129 write(*, *)
"WARNING! Cannot setup local coordinate, it is modified automatically"
134 temp = dot_product( temperature, spfunc )
135 call matlmatrix( gausses(lx), d3, d, time, tincr, coordsys, temp )
137 if( flag == updatelag )
then
138 call geomat_c3( gausses(lx)%stress, mat )
139 d(:, :) = d(:, :)-mat
143 b(1:6, 1:nn*ndof) = 0.0d0
145 b(1, 3*j-2) = gderiv(j, 1)
146 b(2, 3*j-1) = gderiv(j, 2)
147 b(3, 3*j ) = gderiv(j, 3)
148 b(4, 3*j-2) = gderiv(j, 2)
149 b(4, 3*j-1) = gderiv(j, 1)
150 b(5, 3*j-1) = gderiv(j, 3)
151 b(5, 3*j ) = gderiv(j, 2)
152 b(6, 3*j-2) = gderiv(j, 3)
153 b(6, 3*j ) = gderiv(j, 1)
157 if( flag == infinitesimal )
then
158 b2(1:6, 1:nn*ndof) = 0.0d0
160 z1(1:3,1) = (gderiv1_ave(j,1:3)-gderiv(j,1:3))/3.d0
161 b2(1,3*j-2:3*j) = z1(1:3,1)
162 b2(2,3*j-2:3*j) = z1(1:3,1)
163 b2(3,3*j-2:3*j) = z1(1:3,1)
168 b(1:3, j) = b(1:3,j)+b2(1:3,j)
171 else if( flag == totallag )
then
172 gdispderiv(1:ndof, 1:ndof) = matmul( u(1:ndof, 1:nn), gderiv(1:nn, 1:ndof) )
173 fbar(1:ndof, 1:ndof) = jratio(lx)*(i33(1:ndof,1:ndof) + gdispderiv(1:ndof, 1:ndof))
174 call getglobalderiv( etype, nn, naturalcoord, elem1, det, gderiv1)
177 b1(1:6, 1:nn*ndof) = 0.0d0
179 b1(1, 3*j-2) = gdispderiv(1, 1)*gderiv(j, 1)
180 b1(1, 3*j-1) = gdispderiv(2, 1)*gderiv(j, 1)
181 b1(1, 3*j ) = gdispderiv(3, 1)*gderiv(j, 1)
182 b1(2, 3*j-2) = gdispderiv(1, 2)*gderiv(j, 2)
183 b1(2, 3*j-1) = gdispderiv(2, 2)*gderiv(j, 2)
184 b1(2, 3*j ) = gdispderiv(3, 2)*gderiv(j, 2)
185 b1(3, 3*j-2) = gdispderiv(1, 3)*gderiv(j, 3)
186 b1(3, 3*j-1) = gdispderiv(2, 3)*gderiv(j, 3)
187 b1(3, 3*j ) = gdispderiv(3, 3)*gderiv(j, 3)
188 b1(4, 3*j-2) = gdispderiv(1, 2)*gderiv(j, 1)+gdispderiv(1, 1)*gderiv(j, 2)
189 b1(4, 3*j-1) = gdispderiv(2, 2)*gderiv(j, 1)+gdispderiv(2, 1)*gderiv(j, 2)
190 b1(4, 3*j ) = gdispderiv(3, 2)*gderiv(j, 1)+gdispderiv(3, 1)*gderiv(j, 2)
191 b1(5, 3*j-2) = gdispderiv(1, 2)*gderiv(j, 3)+gdispderiv(1, 3)*gderiv(j, 2)
192 b1(5, 3*j-1) = gdispderiv(2, 2)*gderiv(j, 3)+gdispderiv(2, 3)*gderiv(j, 2)
193 b1(5, 3*j ) = gdispderiv(3, 2)*gderiv(j, 3)+gdispderiv(3, 3)*gderiv(j, 2)
194 b1(6, 3*j-2) = gdispderiv(1, 3)*gderiv(j, 1)+gdispderiv(1, 1)*gderiv(j, 3)
195 b1(6, 3*j-1) = gdispderiv(2, 3)*gderiv(j, 1)+gdispderiv(2, 1)*gderiv(j, 3)
196 b1(6, 3*j ) = gdispderiv(3, 3)*gderiv(j, 1)+gdispderiv(3, 1)*gderiv(j, 3)
199 dstrain(1) = 0.5d0*(dot_product(fbar(1:3,1),fbar(1:3,1))-1.d0)
200 dstrain(2) = 0.5d0*(dot_product(fbar(1:3,2),fbar(1:3,2))-1.d0)
201 dstrain(3) = 0.5d0*(dot_product(fbar(1:3,3),fbar(1:3,3))-1.d0)
202 dstrain(4) = dot_product(fbar(1:3,1),fbar(1:3,2))
203 dstrain(5) = dot_product(fbar(1:3,2),fbar(1:3,3))
204 dstrain(6) = dot_product(fbar(1:3,3),fbar(1:3,1))
206 b2(1:6, 1:nn*ndof) = 0.0d0
208 z1(1:3,1) = (gderiv1_ave(j,1:3)-gderiv1(j,1:3))/3.d0
209 b2(1,3*j-2:3*j) = (2.d0*dstrain(1)+1.d0)*z1(1:3,1)
210 b2(2,3*j-2:3*j) = (2.d0*dstrain(2)+1.d0)*z1(1:3,1)
211 b2(3,3*j-2:3*j) = (2.d0*dstrain(3)+1.d0)*z1(1:3,1)
212 b2(4,3*j-2:3*j) = 2.d0*dstrain(4)*z1(1:3,1)
213 b2(5,3*j-2:3*j) = 2.d0*dstrain(5)*z1(1:3,1)
214 b2(6,3*j-2:3*j) = 2.d0*dstrain(6)*z1(1:3,1)
219 b(:, j) = jratio(lx)*jratio(lx)*(b(:,j)+b1(:,j))+b2(:,j)
222 else if( flag == updatelag )
then
223 wg = (jratio(lx)**3.d0)*
getweight(etype, lx)*det
225 b2(1:3, 1:nn*ndof) = 0.0d0
227 z1(1:3,1) = (gderiv1_ave(j,1:3)-gderiv(j,1:3))/3.d0
228 b2(1, 3*j-2:3*j) = z1(1:3,1)
229 b2(2, 3*j-2:3*j) = z1(1:3,1)
230 b2(3, 3*j-2:3*j) = z1(1:3,1)
234 b(1:3, j) = b(1:3,j)+b2(1:3,j)
239 db(1:6, 1:nn*ndof) = matmul( d, b(1:6, 1:nn*ndof) )
242 stiff(i, j) = stiff(i, j)+dot_product( b(:, i), db(:, j) )*wg
247 if( flag == totallag .or. flag == updatelag )
then
248 stress(1:6) = gausses(lx)%stress
249 if( flag == totallag )
then
251 sff = dot_product(stress(1:6),dstrain(1:6))
252 else if( flag == updatelag )
then
254 sff = stress(1)+stress(2)+stress(3)
256 fbar(1:3,1:3) = i33(1:3,1:3)
259 bn(1:9, 1:nn*ndof) = 0.0d0
261 bn(1, 3*j-2) = coeff*gderiv(j, 1)
262 bn(2, 3*j-1) = coeff*gderiv(j, 1)
263 bn(3, 3*j ) = coeff*gderiv(j, 1)
264 bn(4, 3*j-2) = coeff*gderiv(j, 2)
265 bn(5, 3*j-1) = coeff*gderiv(j, 2)
266 bn(6, 3*j ) = coeff*gderiv(j, 2)
267 bn(7, 3*j-2) = coeff*gderiv(j, 3)
268 bn(8, 3*j-1) = coeff*gderiv(j, 3)
269 bn(9, 3*j ) = coeff*gderiv(j, 3)
270 z1(1:3,1) = (gderiv1_ave(j,1:3)-gderiv1(j,1:3))/3.d0
271 bn(1, 3*j-2:3*j) = bn(1, 3*j-2:3*j) + fbar(1,1)*z1(1:3,1)
272 bn(2, 3*j-2:3*j) = bn(2, 3*j-2:3*j) + fbar(2,1)*z1(1:3,1)
273 bn(3, 3*j-2:3*j) = bn(3, 3*j-2:3*j) + fbar(3,1)*z1(1:3,1)
274 bn(4, 3*j-2:3*j) = bn(4, 3*j-2:3*j) + fbar(1,2)*z1(1:3,1)
275 bn(5, 3*j-2:3*j) = bn(5, 3*j-2:3*j) + fbar(2,2)*z1(1:3,1)
276 bn(6, 3*j-2:3*j) = bn(6, 3*j-2:3*j) + fbar(3,2)*z1(1:3,1)
277 bn(7, 3*j-2:3*j) = bn(7, 3*j-2:3*j) + fbar(1,3)*z1(1:3,1)
278 bn(8, 3*j-2:3*j) = bn(8, 3*j-2:3*j) + fbar(2,3)*z1(1:3,1)
279 bn(9, 3*j-2:3*j) = bn(9, 3*j-2:3*j) + fbar(3,3)*z1(1:3,1)
283 smat(j , j ) = stress(1)
284 smat(j , j+3) = stress(4)
285 smat(j , j+6) = stress(6)
286 smat(j+3, j ) = stress(4)
287 smat(j+3, j+3) = stress(2)
288 smat(j+3, j+6) = stress(5)
289 smat(j+6, j ) = stress(6)
290 smat(j+6, j+3) = stress(5)
291 smat(j+6, j+6) = stress(3)
293 sbn(1:9, 1:nn*ndof) = matmul( smat(1:9, 1:9), bn(1:9, 1:nn*ndof) )
296 stiff(i, j) = stiff(i, j)+dot_product( bn(:, i), sbn(:, j) )*wg
301 fs(1,1) = fbar(1,1)*stress(1)+fbar(1,2)*stress(4)+fbar(1,3)*stress(6)
302 fs(1,2) = fbar(1,1)*stress(4)+fbar(1,2)*stress(2)+fbar(1,3)*stress(5)
303 fs(1,3) = fbar(1,1)*stress(6)+fbar(1,2)*stress(5)+fbar(1,3)*stress(3)
304 fs(2,1) = fbar(2,1)*stress(1)+fbar(2,2)*stress(4)+fbar(2,3)*stress(6)
305 fs(2,2) = fbar(2,1)*stress(4)+fbar(2,2)*stress(2)+fbar(2,3)*stress(5)
306 fs(2,3) = fbar(2,1)*stress(6)+fbar(2,2)*stress(5)+fbar(2,3)*stress(3)
307 fs(3,1) = fbar(3,1)*stress(1)+fbar(3,2)*stress(4)+fbar(3,3)*stress(6)
308 fs(3,2) = fbar(3,1)*stress(4)+fbar(3,2)*stress(2)+fbar(3,3)*stress(5)
309 fs(3,3) = fbar(3,1)*stress(6)+fbar(3,2)*stress(5)+fbar(3,3)*stress(3)
311 z1(1:3,1) = (gderiv1_ave(i,1:3)-gderiv1(i,1:3))/3.d0
312 gfs(1:3,1) = coeff*matmul(fs,gderiv(i,1:3))
314 z1(1:3,2) = (gderiv1_ave(j,1:3)-gderiv1(j,1:3))/3.d0
315 gfs(1:3,2) = coeff*matmul(fs,gderiv(j,1:3))
318 ddfs = z1(p,1)*z1(q,2)
319 ddfs = ddfs + (gderiv2_ave(3*i-3+p,3*j-3+q)-gderiv1_ave(i,p)*gderiv1_ave(j,q))/3.d0
320 ddfs = ddfs + gderiv1(i,q)*gderiv1(j,p)/3.d0
321 ddfs = sff*ddfs + z1(p,1)*gfs(q,2)+z1(q,2)*gfs(p,1)
322 stiff(3*i-3+p, 3*j-3+q) = stiff(3*i-3+p, 3*j-3+q) + ddfs*wg
338 (etype, nn, ecoord, u, du, cdsys_id, coords, &
339 qf, gausses, iter, time, tincr, tt, t0, tn )
353 integer(kind=kint),
intent(in) :: etype
354 integer(kind=kint),
intent(in) :: nn
355 real(kind=kreal),
intent(in) :: ecoord(3, nn)
356 real(kind=kreal),
intent(in) :: u(3, nn)
357 real(kind=kreal),
intent(in) :: du(3, nn)
358 integer(kind=kint),
intent(in) :: cdsys_id
359 real(kind=kreal),
intent(inout) :: coords(3, 3)
360 real(kind=kreal),
intent(out) :: qf(nn*3)
362 integer,
intent(in) :: iter
363 real(kind=kreal),
intent(in) :: time
364 real(kind=kreal),
intent(in) :: tincr
365 real(kind=kreal),
intent(in) :: tt(nn)
366 real(kind=kreal),
intent(in) :: t0(nn)
367 real(kind=kreal),
intent(in) :: tn(nn)
371 integer(kind=kint) :: flag
372 integer(kind=kint),
parameter :: ndof = 3
373 real(kind=kreal) :: b(6, ndof*nn), b1(6, ndof*nn)
374 real(kind=kreal) :: gderiv(nn, 3), gdispderiv(3, 3), det, wg
375 integer(kind=kint) :: j, lx, serr
376 real(kind=kreal) :: naturalcoord(3), rot(3, 3), spfunc(nn)
377 real(kind=kreal) :: totaldisp(3, nn), elem(3, nn), elem1(3, nn), coordsys(3, 3)
378 real(kind=kreal) :: dstrain(6)
379 real(kind=kreal) :: dvol
380 real(kind=kreal) :: ttc, tt0, ttn, alpo(3), ina(1), epsth(6)
381 logical :: ierr, matlaniso
383 real(kind=kreal) :: elem0(3,nn), gderiv1(nn,ndof), b2(6, ndof*nn), z1(3)
384 real(kind=kreal) :: v0, jacob, jacob_ave, gderiv1_ave(nn,ndof)
385 real(kind=kreal) :: fbar(3,3), jratio(8)
386 real(kind=kreal) :: jacob_ave05, gderiv05_ave(nn,ndof)
392 flag = gausses(1)%pMaterial%nlgeom_flag
393 elem0(1:ndof,1:nn) = ecoord(1:ndof,1:nn)
394 totaldisp(:, :) = u(:, :)+du(:, :)
396 elem(:, :) = ecoord(:, :)
397 elem1(:, :) = ecoord(:, :)
399 elem(:, :) = ecoord(:, :)
400 elem1(:, :) = ( du(:, :)+u(:, :) )+ecoord(:, :)
402 elem(:, :) = ( 0.5d0*du(:, :)+u(:, :) )+ecoord(:, :)
403 elem1(:, :) = ( du(:, :)+u(:, :) )+ecoord(:, :)
404 totaldisp(:, :) = du(:, :)
409 call fetch_tabledata(
mc_orthoexp, gausses(1)%pMaterial%dict, alpo(:), ierr, ina )
410 if( .not. ierr ) matlaniso = .true.
415 gderiv1_ave(1:nn,1:ndof) = 0.d0
418 gderiv05_ave(1:nn,1:ndof) = 0.d0
426 gderiv1(1:nn, 1:ndof) = gderiv(1:nn, 1:ndof)
428 gdispderiv(1:3, 1:3) = matmul( du(1:ndof, 1:nn)+u(1:ndof, 1:nn), gderiv(1:nn, 1:ndof) )
429 jacob =
determinant33( i33(1:ndof,1:ndof) + gdispderiv(1:ndof, 1:ndof) )
430 jratio(lx) = dsign(dabs(jacob)**(-1.d0/3.d0),jacob)
432 call getglobalderiv( etype, nn, naturalcoord, elem1, det, gderiv1)
435 jacob_ave = jacob_ave + jacob*wg
436 gderiv1_ave(1:nn,1:ndof) = gderiv1_ave(1:nn,1:ndof) + jacob*wg*gderiv1(1:nn, 1:ndof)
440 jacob_ave05 = jacob_ave05 + wg
441 gderiv05_ave(1:nn,1:ndof) = gderiv05_ave(1:nn,1:ndof) + wg*gderiv1(1:nn, 1:ndof)
444 if( dabs(v0) > 1.d-12 )
then
445 if( dabs(jacob_ave) < 1.d-12 ) stop
'Error in Update_C3D8Fbar: too small average jacob'
446 jacob_ave = jacob_ave/v0
447 jratio(1:8) = (dsign(dabs(jacob_ave)**(1.d0/3.d0),jacob_ave))*jratio(1:8)
448 gderiv1_ave(1:nn,1:ndof) = gderiv1_ave(1:nn,1:ndof)/(v0*jacob_ave)
449 if( flag ==
updatelag ) gderiv05_ave(1:nn,1:ndof) = gderiv05_ave(1:nn,1:ndof)/jacob_ave05
451 stop
'Error in Update_C3D8Fbar: too small element volume'
459 if( cdsys_id > 0 )
then
460 call set_localcoordsys( coords, g_localcoordsys(cdsys_id), coordsys(:, :), serr )
461 if( serr == -1 ) stop
"Fail to setup local coordinate"
462 if( serr == -2 )
then
463 write(*, *)
"WARNING! Cannot setup local coordinate, it is modified automatically"
467 gdispderiv(1:ndof, 1:ndof) = matmul( totaldisp(1:ndof, 1:nn), gderiv(1:nn, 1:ndof) )
475 ttc = dot_product(tt, spfunc)
476 tt0 = dot_product(t0, spfunc)
477 ttn = dot_product(tn, spfunc)
482 dvol = dot_product( totaldisp(1,1:nn), gderiv1_ave(1:nn,1) )
483 dvol = dvol + dot_product( totaldisp(2,1:nn), gderiv1_ave(1:nn,2) )
484 dvol = dvol + dot_product( totaldisp(3,1:nn), gderiv1_ave(1:nn,3) )
485 dvol = (dvol-(gdispderiv(1,1)+gdispderiv(2,2)+gdispderiv(3,3)))/3.d0
486 dstrain(1) = gdispderiv(1, 1) + dvol
487 dstrain(2) = gdispderiv(2, 2) + dvol
488 dstrain(3) = gdispderiv(3, 3) + dvol
489 dstrain(4) = ( gdispderiv(1, 2)+gdispderiv(2, 1) )
490 dstrain(5) = ( gdispderiv(2, 3)+gdispderiv(3, 2) )
491 dstrain(6) = ( gdispderiv(3, 1)+gdispderiv(1, 3) )
492 dstrain(:) = dstrain(:)-epsth(:)
494 gausses(lx)%strain(1:6) = dstrain(1:6)+epsth(:)
497 fbar(1:ndof, 1:ndof) = jratio(lx)*(i33(1:ndof,1:ndof) + gdispderiv(1:ndof, 1:ndof))
500 dstrain(1) = 0.5d0*(dot_product(fbar(1:3,1),fbar(1:3,1))-1.d0)
501 dstrain(2) = 0.5d0*(dot_product(fbar(1:3,2),fbar(1:3,2))-1.d0)
502 dstrain(3) = 0.5d0*(dot_product(fbar(1:3,3),fbar(1:3,3))-1.d0)
503 dstrain(4) = dot_product(fbar(1:3,1),fbar(1:3,2))
504 dstrain(5) = dot_product(fbar(1:3,2),fbar(1:3,3))
505 dstrain(6) = dot_product(fbar(1:3,3),fbar(1:3,1))
506 dstrain(:) = dstrain(:)-epsth(:)
508 gausses(lx)%strain(1:6) = dstrain(1:6)+epsth(:)
511 dvol = dot_product( totaldisp(1,1:nn), gderiv05_ave(1:nn,1) )
512 dvol = dvol + dot_product( totaldisp(2,1:nn), gderiv05_ave(1:nn,2) )
513 dvol = dvol + dot_product( totaldisp(3,1:nn), gderiv05_ave(1:nn,3) )
514 dvol = (dvol-(gdispderiv(1,1)+gdispderiv(2,2)+gdispderiv(3,3)))/3.d0
515 dstrain(1) = gdispderiv(1, 1) + dvol
516 dstrain(2) = gdispderiv(2, 2) + dvol
517 dstrain(3) = gdispderiv(3, 3) + dvol
518 dstrain(4) = ( gdispderiv(1, 2)+gdispderiv(2, 1) )
519 dstrain(5) = ( gdispderiv(2, 3)+gdispderiv(3, 2) )
520 dstrain(6) = ( gdispderiv(3, 1)+gdispderiv(1, 3) )
521 dstrain(:) = dstrain(:)-epsth(:)
524 rot(1, 2)= 0.5d0*( gdispderiv(1, 2)-gdispderiv(2, 1) ); rot(2, 1) = -rot(1, 2)
525 rot(2, 3)= 0.5d0*( gdispderiv(2, 3)-gdispderiv(3, 2) ); rot(3, 2) = -rot(2, 3)
526 rot(1, 3)= 0.5d0*( gdispderiv(1, 3)-gdispderiv(3, 1) ); rot(3, 1) = -rot(1, 3)
528 gausses(lx)%strain(1:6) = gausses(lx)%strain_bak(1:6)+dstrain(1:6)+epsth(:)
530 call getglobalderiv( etype, nn, naturalcoord, elem0, det, gderiv1)
531 gdispderiv(1:ndof, 1:ndof) = matmul( du(1:ndof, 1:nn)+u(1:ndof, 1:nn), gderiv1(1:nn, 1:ndof) )
532 fbar(1:ndof, 1:ndof) = jratio(lx)*(i33(1:ndof,1:ndof) + gdispderiv(1:ndof, 1:ndof))
537 call update_stress3d( flag, gausses(lx), rot, dstrain, fbar, coordsys, time, tincr, ttc, tt0, ttn )
543 b(1:6, 1:nn*ndof) = 0.0d0
545 b(1,3*j-2) = gderiv(j, 1)
546 b(2,3*j-1) = gderiv(j, 2)
547 b(3,3*j ) = gderiv(j, 3)
548 b(4,3*j-2) = gderiv(j, 2)
549 b(4,3*j-1) = gderiv(j, 1)
550 b(5,3*j-1) = gderiv(j, 3)
551 b(5,3*j ) = gderiv(j, 2)
552 b(6,3*j-2) = gderiv(j, 3)
553 b(6,3*j ) = gderiv(j, 1)
558 gderiv1(1:nn, 1:ndof) = gderiv(1:nn, 1:ndof)
560 b2(1:6, 1:nn*ndof) = 0.0d0
562 z1(1:3) = (gderiv1_ave(j,1:3)-gderiv1(j,1:3))/3.d0
563 b2(1,3*j-2:3*j) = z1(1:3)
564 b2(2,3*j-2:3*j) = z1(1:3)
565 b2(3,3*j-2:3*j) = z1(1:3)
570 b(:, j) = b(:,j)+b2(:,j)
575 b1(1:6, 1:nn*ndof) = 0.0d0
577 b1(1, 3*j-2) = gdispderiv(1, 1)*gderiv(j, 1)
578 b1(1, 3*j-1) = gdispderiv(2, 1)*gderiv(j, 1)
579 b1(1, 3*j ) = gdispderiv(3, 1)*gderiv(j, 1)
580 b1(2, 3*j-2) = gdispderiv(1, 2)*gderiv(j, 2)
581 b1(2, 3*j-1) = gdispderiv(2, 2)*gderiv(j, 2)
582 b1(2, 3*j ) = gdispderiv(3, 2)*gderiv(j, 2)
583 b1(3, 3*j-2) = gdispderiv(1, 3)*gderiv(j, 3)
584 b1(3, 3*j-1) = gdispderiv(2, 3)*gderiv(j, 3)
585 b1(3, 3*j ) = gdispderiv(3, 3)*gderiv(j, 3)
586 b1(4, 3*j-2) = gdispderiv(1, 2)*gderiv(j, 1)+gdispderiv(1, 1)*gderiv(j, 2)
587 b1(4, 3*j-1) = gdispderiv(2, 2)*gderiv(j, 1)+gdispderiv(2, 1)*gderiv(j, 2)
588 b1(4, 3*j ) = gdispderiv(3, 2)*gderiv(j, 1)+gdispderiv(3, 1)*gderiv(j, 2)
589 b1(5, 3*j-2) = gdispderiv(1, 2)*gderiv(j, 3)+gdispderiv(1, 3)*gderiv(j, 2)
590 b1(5, 3*j-1) = gdispderiv(2, 2)*gderiv(j, 3)+gdispderiv(2, 3)*gderiv(j, 2)
591 b1(5, 3*j ) = gdispderiv(3, 2)*gderiv(j, 3)+gdispderiv(3, 3)*gderiv(j, 2)
592 b1(6, 3*j-2) = gdispderiv(1, 3)*gderiv(j, 1)+gdispderiv(1, 1)*gderiv(j, 3)
593 b1(6, 3*j-1) = gdispderiv(2, 3)*gderiv(j, 1)+gdispderiv(2, 1)*gderiv(j, 3)
594 b1(6, 3*j ) = gdispderiv(3, 3)*gderiv(j, 1)+gdispderiv(3, 1)*gderiv(j, 3)
599 b2(1:6, 1:nn*ndof) = 0.0d0
601 z1(1:3) = (gderiv1_ave(j,1:3)-gderiv1(j,1:3))/3.d0
602 b2(1,3*j-2:3*j) = (2.d0*dstrain(1)+1.d0)*z1(1:3)
603 b2(2,3*j-2:3*j) = (2.d0*dstrain(2)+1.d0)*z1(1:3)
604 b2(3,3*j-2:3*j) = (2.d0*dstrain(3)+1.d0)*z1(1:3)
605 b2(4,3*j-2:3*j) = 2.d0*dstrain(4)*z1(1:3)
606 b2(5,3*j-2:3*j) = 2.d0*dstrain(5)*z1(1:3)
607 b2(6,3*j-2:3*j) = 2.d0*dstrain(6)*z1(1:3)
612 b(:, j) = jratio(lx)*jratio(lx)*(b(:,j)+b1(:,j))+b2(:,j)
618 wg = (jratio(lx)**3.d0)*
getweight(etype, lx)*det
619 b(1:6, 1:nn*ndof) = 0.0d0
621 b(1, 3*j-2) = gderiv(j, 1)
622 b(2, 3*j-1) = gderiv(j, 2)
623 b(3, 3*j ) = gderiv(j, 3)
624 b(4, 3*j-2) = gderiv(j, 2)
625 b(4, 3*j-1) = gderiv(j, 1)
626 b(5, 3*j-1) = gderiv(j, 3)
627 b(5, 3*j ) = gderiv(j, 2)
628 b(6, 3*j-2) = gderiv(j, 3)
629 b(6, 3*j ) = gderiv(j, 1)
632 b2(1:3, 1:nn*ndof) = 0.0d0
634 z1(1:3) = (gderiv1_ave(j,1:3)-gderiv(j,1:3))/3.d0
635 b2(1, 3*j-2:3*j) = z1(1:3)
636 b2(2, 3*j-2:3*j) = z1(1:3)
637 b2(3, 3*j-2:3*j) = z1(1:3)
641 b(1:3, j) = b(1:3,j)+b2(1:3,j)
647 = qf(1:nn*ndof)+matmul( gausses(lx)%stress(1:6), b(1:6,1:nn*ndof) )*wg
650 gausses(lx)%strain_energy = gausses(lx)%strain_energy*wg
658 (etype, nn, xx, yy, zz, tt, t0, &
659 gausses, vect, cdsys_id, coords)
669 integer(kind=kint),
parameter :: ndof = 3
670 integer(kind=kint),
intent(in) :: etype, nn
672 real(kind=kreal),
intent(in) :: xx(nn), yy(nn), zz(nn)
673 real(kind=kreal),
intent(in) :: tt(nn), t0(nn)
674 real(kind=kreal),
intent(out) :: vect(nn*ndof)
675 integer(kind=kint),
intent(in) :: cdsys_ID
676 real(kind=kreal),
intent(inout) :: coords(3, 3)
680 real(kind=kreal) :: alp, alp0, d(6, 6), b(6, ndof*nn)
681 real(kind=kreal) :: z1(3), det, ecoord(3, nn)
682 integer(kind=kint) :: j, LX, serr
683 real(kind=kreal) :: estrain(6), sgm(6), h(nn)
684 real(kind=kreal) :: naturalcoord(3), gderiv(nn, 3)
685 real(kind=kreal) :: wg, outa(1), ina(1), gderiv1_ave(nn, 3), alpo(3), alpo0(3), coordsys(3, 3)
686 real(kind=kreal) :: tempc, temp0, v0, jacob_ave, thermal_eps, tm(6,6)
687 logical :: ierr, matlaniso
693 if( cdsys_id > 0 )
then
695 call fetch_tabledata( mc_orthoexp, gausses(1)%pMaterial%dict, alpo(:), ierr, ina )
696 if( .not. ierr ) matlaniso = .true.
708 gderiv1_ave(1:nn,1:ndof) = 0.d0
711 call getglobalderiv( etype, nn, naturalcoord, ecoord, det, gderiv)
714 jacob_ave = jacob_ave + wg
715 gderiv1_ave(1:nn,1:ndof) = gderiv1_ave(1:nn,1:ndof) + wg*gderiv(1:nn, 1:ndof)
717 if( dabs(v0) > 1.d-12 )
then
718 if( dabs(jacob_ave) < 1.d-12 ) stop
'Error in TLOAD_C3D8Fbar: too small average jacob'
719 jacob_ave = jacob_ave/v0
720 gderiv1_ave(1:nn,1:ndof) = gderiv1_ave(1:nn,1:ndof)/(v0*jacob_ave)
722 stop
'Error in TLOAD_C3D8Fbar: too small element volume'
732 if( cdsys_id > 0 )
then
733 call set_localcoordsys(coords, g_localcoordsys(cdsys_id), coordsys, serr)
734 if( serr == -1 ) stop
"Fail to setup local coordinate"
735 if( serr == -2 )
then
736 write(*, *)
"WARNING! Cannot setup local coordinate, it is modified automatically"
742 b(1:6, 1:nn*ndof) = 0.0d0
744 b(1,3*j-2) = gderiv(j, 1)
745 b(2,3*j-1) = gderiv(j, 2)
746 b(3,3*j ) = gderiv(j, 3)
747 b(4,3*j-2) = gderiv(j, 2)
748 b(4,3*j-1) = gderiv(j, 1)
749 b(5,3*j-1) = gderiv(j, 3)
750 b(5,3*j ) = gderiv(j, 2)
751 b(6,3*j-2) = gderiv(j, 3)
752 b(6,3*j ) = gderiv(j, 1)
756 z1(1:3) = (gderiv1_ave(j,1:3)-gderiv(j,1:3))/3.d0
757 b(1,3*j-2:3*j) = b(1,3*j-2:3*j)+z1(1:3)
758 b(2,3*j-2:3*j) = b(2,3*j-2:3*j)+z1(1:3)
759 b(3,3*j-2:3*j) = b(3,3*j-2:3*j)+z1(1:3)
762 tempc = dot_product( h(1:nn),tt(1:nn) )
763 temp0 = dot_product( h(1:nn),t0(1:nn) )
765 call matlmatrix( gausses(lx), d3, d, 1.d0, 0.0d0, coordsys, tempc )
769 call fetch_tabledata( mc_orthoexp, gausses(lx)%pMaterial%dict, alpo(:), ierr, ina )
770 if( ierr ) stop
"Fails in fetching orthotropic expansion coefficient!"
772 call fetch_tabledata( mc_themoexp, gausses(lx)%pMaterial%dict, outa(:), ierr, ina )
773 if( ierr ) outa(1) = gausses(lx)%pMaterial%variables(m_exapnsion)
778 call fetch_tabledata( mc_orthoexp, gausses(lx)%pMaterial%dict, alpo0(:), ierr, ina )
779 if( ierr ) stop
"Fails in fetching orthotropic expansion coefficient!"
781 call fetch_tabledata( mc_themoexp, gausses(lx)%pMaterial%dict, outa(:), ierr, ina )
782 if( ierr ) outa(1) = gausses(lx)%pMaterial%variables(m_exapnsion)
795 estrain(:) = matmul( estrain(:), tm )
796 estrain(4:6) = estrain(4:6)*2.0d0
799 estrain(1:3) = thermal_eps
806 sgm(:) = matmul( d(:, :), estrain(:) )
811 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.