8 use hecmw,
only : kint, kreal
13 real(kind=kreal),
parameter,
private :: i3(3,3) = reshape((/ &
14 & 1.d0, 0.d0, 0.d0, 0.d0, 1.d0, 0.d0, 0.d0, 0.d0, 1.d0/), (/3,3/))
21 real(kind=kreal),
intent(in) :: stress(6)
22 real(kind=kreal),
intent(out) :: mat(6, 6)
26 mat(1, 1) = 2.0d0*stress(1); mat(1, 2) = 0.0d0; mat(1, 3) = 0.0d0
27 mat(1, 4) = stress(4); mat(1, 5) = 0.0d0; mat(1, 6) = stress(6)
28 mat(2, 1) = mat(1, 2); mat(2, 2) = 2.0d0*stress(2); mat(2, 3) = 0.0d0
29 mat(2, 4) = stress(4); mat(2, 5) = stress(5); mat(2, 6) = 0.0d0
30 mat(3, 1) = mat(1, 3); mat(3, 2) = mat(2, 3); mat(3, 3) = 2.0d0*stress(3)
31 mat(3, 4) = 0.0d0; mat(3, 5) = stress(5); mat(3, 6) = stress(6)
33 mat(4, 1) = mat(1, 4); mat(4, 2) = mat(2, 4); mat(4, 3) = mat(3, 4)
34 mat(4, 4) = 0.5d0*( stress(1)+stress(2) ); mat(4, 5) = 0.5d0*stress(6); mat(4, 6) = 0.5d0*stress(5)
35 mat(5, 1) = mat(1, 5); mat(5, 2) = mat(2, 5); mat(5, 3) = mat(3, 5)
36 mat(5, 4) = mat(4, 5); mat(5, 5) = 0.5d0*( stress(3)+stress(2) ); mat(5, 6) = 0.5d0*stress(4)
37 mat(6, 1) = mat(1, 6); mat(6, 2) = mat(2, 6); mat(6, 3) = mat(3, 6)
38 mat(6, 4) = mat(4, 6); mat(6, 5) = mat(5, 6); mat(6, 6) = 0.5d0*( stress(1)+stress(3) );
51 (etype, nn, ecoord, gausses, stiff, cdsys_id, coords, &
52 time, tincr, u ,temperature)
61 integer(kind=kint),
intent(in) :: etype
62 integer(kind=kint),
intent(in) :: nn
63 real(kind=kreal),
intent(in) :: ecoord(3,nn)
65 real(kind=kreal),
intent(out) :: stiff(:,:)
66 integer(kind=kint),
intent(in) :: cdsys_id
67 real(kind=kreal),
intent(inout) :: coords(3,3)
68 real(kind=kreal),
intent(in) :: time
69 real(kind=kreal),
intent(in) :: tincr
70 real(kind=kreal),
intent(in) :: temperature(nn)
71 real(kind=kreal),
intent(in),
optional :: u(:,:)
75 integer(kind=kint) :: flag
76 integer(kind=kint),
parameter :: ndof = 3
77 real(kind=kreal) :: d(6, 6), b(6, ndof*nn), db(6, ndof*nn)
78 real(kind=kreal) :: gderiv(nn, 3), stress(6), mat(6, 6)
79 real(kind=kreal) :: det, wg
80 integer(kind=kint) :: i, j, lx, serr
81 real(kind=kreal) :: temp, naturalcoord(3)
82 real(kind=kreal) :: spfunc(nn), gdispderiv(3, 3)
83 real(kind=kreal) :: b1(6, ndof*nn), coordsys(3, 3)
84 real(kind=kreal) :: smat(9, 9), elem(3, nn)
85 real(kind=kreal) :: bn(9, ndof*nn), sbn(9, ndof*nn)
91 flag = gausses(1)%pMaterial%nlgeom_flag
92 if( .not.
present(u) ) flag = infinitesimal
93 elem(:, :) = ecoord(:, :)
94 if( flag == updatelag ) elem(:, :) = ecoord(:, :)+u(:, :)
101 if( cdsys_id > 0 )
then
103 if( serr == -1 ) stop
"Fail to setup local coordinate"
104 if( serr == -2 )
then
106 write(*, *)
"WARNING! Cannot setup local coordinate, it is modified automatically"
112 temp = dot_product(temperature, spfunc)
113 call matlmatrix( gausses(lx), d3, d, time, tincr, coordsys, temp )
115 if( flag == updatelag )
then
116 call geomat_c3( gausses(lx)%stress, mat )
117 d(:, :) = d(:, :)-mat
121 b(1:6, 1:nn*ndof) = 0.0d0
123 b(1, 3*j-2)=gderiv(j, 1)
124 b(2, 3*j-1)=gderiv(j, 2)
125 b(3, 3*j )=gderiv(j, 3)
126 b(4, 3*j-2)=gderiv(j, 2)
127 b(4, 3*j-1)=gderiv(j, 1)
128 b(5, 3*j-1)=gderiv(j, 3)
129 b(5, 3*j )=gderiv(j, 2)
130 b(6, 3*j-2)=gderiv(j, 3)
131 b(6, 3*j )=gderiv(j, 1)
135 if( flag == totallag )
then
137 gdispderiv(1:ndof, 1:ndof) = matmul( u(1:ndof, 1:nn), gderiv(1:nn, 1:ndof) )
138 b1(1:6, 1:nn*ndof)=0.0d0
140 b1(1, 3*j-2) = gdispderiv(1, 1)*gderiv(j, 1)
141 b1(1, 3*j-1) = gdispderiv(2, 1)*gderiv(j, 1)
142 b1(1, 3*j ) = gdispderiv(3, 1)*gderiv(j, 1)
143 b1(2, 3*j-2) = gdispderiv(1, 2)*gderiv(j, 2)
144 b1(2, 3*j-1) = gdispderiv(2, 2)*gderiv(j, 2)
145 b1(2, 3*j ) = gdispderiv(3, 2)*gderiv(j, 2)
146 b1(3, 3*j-2) = gdispderiv(1, 3)*gderiv(j, 3)
147 b1(3, 3*j-1) = gdispderiv(2, 3)*gderiv(j, 3)
148 b1(3, 3*j ) = gdispderiv(3, 3)*gderiv(j, 3)
149 b1(4, 3*j-2) = gdispderiv(1, 2)*gderiv(j, 1)+gdispderiv(1, 1)*gderiv(j, 2)
150 b1(4, 3*j-1) = gdispderiv(2, 2)*gderiv(j, 1)+gdispderiv(2, 1)*gderiv(j, 2)
151 b1(4, 3*j ) = gdispderiv(3, 2)*gderiv(j, 1)+gdispderiv(3, 1)*gderiv(j, 2)
152 b1(5, 3*j-2) = gdispderiv(1, 2)*gderiv(j, 3)+gdispderiv(1, 3)*gderiv(j, 2)
153 b1(5, 3*j-1) = gdispderiv(2, 2)*gderiv(j, 3)+gdispderiv(2, 3)*gderiv(j, 2)
154 b1(5, 3*j ) = gdispderiv(3, 2)*gderiv(j, 3)+gdispderiv(3, 3)*gderiv(j, 2)
155 b1(6, 3*j-2) = gdispderiv(1, 3)*gderiv(j, 1)+gdispderiv(1, 1)*gderiv(j, 3)
156 b1(6, 3*j-1) = gdispderiv(2, 3)*gderiv(j, 1)+gdispderiv(2, 1)*gderiv(j, 3)
157 b1(6, 3*j ) = gdispderiv(3, 3)*gderiv(j, 1)+gdispderiv(3, 1)*gderiv(j, 3)
161 b(:, j) = b(:, j)+b1(:, j)
165 db(1:6, 1:nn*ndof) = matmul( d, b(1:6, 1:nn*ndof) )
168 stiff(i, j) = stiff(i, j)+dot_product( b(:, i), db(:, j) )*wg
173 if( flag == totallag .OR. flag==updatelag )
then
174 stress(1:6) = gausses(lx)%stress
175 bn(1:9, 1:nn*ndof) = 0.0d0
177 bn(1, 3*j-2) = gderiv(j, 1)
178 bn(2, 3*j-1) = gderiv(j, 1)
179 bn(3, 3*j ) = gderiv(j, 1)
180 bn(4, 3*j-2) = gderiv(j, 2)
181 bn(5, 3*j-1) = gderiv(j, 2)
182 bn(6, 3*j ) = gderiv(j, 2)
183 bn(7, 3*j-2) = gderiv(j, 3)
184 bn(8, 3*j-1) = gderiv(j, 3)
185 bn(9, 3*j ) = gderiv(j, 3)
189 smat(j , j ) = stress(1)
190 smat(j , j+3) = stress(4)
191 smat(j , j+6) = stress(6)
192 smat(j+3, j ) = stress(4)
193 smat(j+3, j+3) = stress(2)
194 smat(j+3, j+6) = stress(5)
195 smat(j+6, j ) = stress(6)
196 smat(j+6, j+3) = stress(5)
197 smat(j+6, j+6) = stress(3)
199 sbn(1:9, 1:nn*ndof) = matmul( smat(1:9, 1:9), bn(1:9, 1:nn*ndof) )
202 stiff(i, j) = stiff(i, j)+dot_product( bn(:, i), sbn(:, j) )*wg
215 subroutine dl_c3(etype, nn, XX, YY, ZZ, RHO, LTYPE, PARAMS, VECT, NSIZE)
232 integer(kind=kint),
intent(in) :: etype, nn
233 real(kind=kreal),
intent(in) :: xx(:),yy(:),zz(:)
234 real(kind=kreal),
intent(in) :: params(0:6)
235 real(kind=kreal),
intent(inout) :: vect(:)
237 integer(kind=kint) ltype,nsize
240 integer(kind=kint) ndof
242 real(kind=kreal) h(nn)
243 real(kind=kreal) plx(nn), ply(nn), plz(nn)
244 real(kind=kreal) xj(3, 3), det, wg
245 integer(kind=kint) ivol, isuf
246 integer(kind=kint) nod(nn)
247 integer(kind=kint) IG2, LX, I , SURTYPE, NSUR
248 real(kind=kreal) vx, vy, vz, xcod, ycod, zcod
249 real(kind=kreal) ax, ay, az, rx, ry, rz, hx, hy, hz, val
250 real(kind=kreal) phx, phy, phz
251 real(kind=kreal) coefx, coefy, coefz
252 real(kind=kreal) normal(3), localcoord(3), elecoord(3, nn), deriv(nn, 3)
254 ax = 0.0d0; ay = 0.0d0; az = 0.0d0; rx = 0.0d0; ry = 0.0d0; rz = 0.0d0;
264 if( ltype.LT.10 )
then
266 if( ltype.EQ.5 )
then
274 else if( ltype.GE.10 )
then
276 call getsubface( etype, ltype/10, surtype, nod )
286 elecoord(1,i)=xx(nod(i))
287 elecoord(2,i)=yy(nod(i))
288 elecoord(3,i)=zz(nod(i))
292 call getshapefunc( surtype, localcoord(1:2), h(1:nsur) )
295 normal=
surfacenormal( surtype, nsur, localcoord(1:2), elecoord(:,1:nsur) )
297 vect(3*nod(i)-2)=vect(3*nod(i)-2)+val*wg*h(i)*normal(1)
298 vect(3*nod(i)-1)=vect(3*nod(i)-1)+val*wg*h(i)*normal(2)
299 vect(3*nod(i) )=vect(3*nod(i) )+val*wg*h(i)*normal(3)
314 xj(1,1:3)= matmul( xx(1:nn), deriv(1:nn,1:3) )
315 xj(2,1:3)= matmul( yy(1:nn), deriv(1:nn,1:3) )
316 xj(3,1:3)= matmul( zz(1:nn), deriv(1:nn,1:3) )
318 det=xj(1,1)*xj(2,2)*xj(3,3) &
319 +xj(2,1)*xj(3,2)*xj(1,3) &
320 +xj(3,1)*xj(1,2)*xj(2,3) &
321 -xj(3,1)*xj(2,2)*xj(1,3) &
322 -xj(2,1)*xj(1,2)*xj(3,3) &
323 -xj(1,1)*xj(3,2)*xj(2,3)
330 xcod=dot_product( h(1:nn),xx(1:nn) )
331 ycod=dot_product( h(1:nn),yy(1:nn) )
332 zcod=dot_product( h(1:nn),zz(1:nn) )
333 hx=ax+((xcod-ax)*rx+(ycod-ay)*ry+(zcod-az)*rz)/(rx**2+ry**2+rz**2)*rx
334 hy=ay+((xcod-ax)*rx+(ycod-ay)*ry+(zcod-az)*rz)/(rx**2+ry**2+rz**2)*ry
335 hz=az+((xcod-ax)*rx+(ycod-ay)*ry+(zcod-az)*rz)/(rx**2+ry**2+rz**2)*rz
339 coefx=rho*val*dabs(val)*phx
340 coefy=rho*val*dabs(val)*phy
341 coefz=rho*val*dabs(val)*phz
346 plx(i)=plx(i)+h(i)*wg*coefx
347 ply(i)=ply(i)+h(i)*wg*coefy
348 plz(i)=plz(i)+h(i)*wg*coefz
353 vect(3*i-2)=val*plx(i)
355 else if( ltype.EQ.2 )
then
357 vect(3*i-1)=val*ply(i)
359 else if( ltype.EQ.3 )
then
361 vect(3*i )=val*plz(i)
363 else if( ltype.EQ.4 )
then
367 vx=vx/sqrt(params(1)**2+params(2)**2+params(3)**2)
368 vy=vy/sqrt(params(1)**2+params(2)**2+params(3)**2)
369 vz=vz/sqrt(params(1)**2+params(2)**2+params(3)**2)
371 vect(3*i-2)=val*plx(i)*rho*vx
372 vect(3*i-1)=val*ply(i)*rho*vy
373 vect(3*i )=val*plz(i)*rho*vz
375 else if( ltype.EQ.5 )
then
389 (etype, nn, xx, yy, zz, tt, t0, gausses, &
390 vect, cdsys_id, coords)
400 integer(kind=kint),
parameter :: ndof = 3
401 integer(kind=kint),
intent(in) :: etype, nn
403 real(kind=kreal),
intent(in) :: xx(nn), yy(nn), zz(nn)
404 real(kind=kreal),
intent(in) :: tt(nn),t0(nn)
405 real(kind=kreal),
intent(out) :: vect(nn*ndof)
406 integer(kind=kint),
intent(in) :: cdsys_ID
407 real(kind=kreal),
intent(inout) :: coords(3, 3)
411 real(kind=kreal) :: alp, alp0, d(6, 6), b(6, ndof*nn)
412 real(kind=kreal) :: det, ecoord(3, nn)
413 integer(kind=kint) :: j, LX, serr
414 real(kind=kreal) :: epsth(6),sgm(6), h(nn), alpo(3), alpo0(3), coordsys(3, 3)
415 real(kind=kreal) :: naturalcoord(3), gderiv(nn, 3)
416 real(kind=kreal) :: wg, outa(1), ina(1)
417 real(kind=kreal) :: tempc, temp0, thermal_eps, tm(6, 6)
418 logical :: ierr, matlaniso
424 if( cdsys_id > 0 )
then
426 call fetch_tabledata( mc_orthoexp, gausses(1)%pMaterial%dict, alpo(:), ierr, ina )
427 if( .not. ierr ) matlaniso = .true.
441 call getglobalderiv( etype, nn, naturalcoord, ecoord, det, gderiv )
443 if( cdsys_id > 0 )
then
444 call set_localcoordsys( coords, g_localcoordsys(cdsys_id), coordsys, serr )
445 if( serr == -1 ) stop
"Fail to setup local coordinate"
446 if( serr == -2 )
then
447 write(*, *)
"WARNING! Cannot setup local coordinate, it is modified automatically"
453 b(1:6,1:nn*ndof)=0.0d0
455 b(1,3*j-2)=gderiv(j,1)
456 b(2,3*j-1)=gderiv(j,2)
457 b(3,3*j )=gderiv(j,3)
458 b(4,3*j-2)=gderiv(j,2)
459 b(4,3*j-1)=gderiv(j,1)
460 b(5,3*j-1)=gderiv(j,3)
461 b(5,3*j )=gderiv(j,2)
462 b(6,3*j-2)=gderiv(j,3)
463 b(6,3*j )=gderiv(j,1)
466 tempc = dot_product( h(1:nn), tt(1:nn) )
467 temp0 = dot_product( h(1:nn), t0(1:nn) )
469 call matlmatrix( gausses(lx), d3, d, 1.d0, 0.0d0, coordsys, tempc )
473 call fetch_tabledata( mc_orthoexp, gausses(lx)%pMaterial%dict, alpo(:), ierr, ina )
474 if( ierr ) stop
"Fails in fetching orthotropic expansion coefficient!"
476 call fetch_tabledata( mc_themoexp, gausses(lx)%pMaterial%dict, outa(:), ierr, ina )
477 if( ierr ) outa(1) = gausses(lx)%pMaterial%variables(m_expansion)
482 call fetch_tabledata( mc_orthoexp, gausses(lx)%pMaterial%dict, alpo0(:), ierr, ina )
483 if( ierr ) stop
"Fails in fetching orthotropic expansion coefficient!"
485 call fetch_tabledata( mc_themoexp, gausses(lx)%pMaterial%dict, outa(:), ierr, ina )
486 if( ierr ) outa(1) = gausses(lx)%pMaterial%variables(m_expansion)
499 epsth(:) = matmul( epsth(:), tm )
500 epsth(4:6) = epsth(4:6)*2.0d0
503 epsth(1:3) = thermal_eps
510 sgm(:) = matmul( d(:, :), epsth(:) )
514 vect(1:nn*ndof) = vect(1:nn*ndof)+matmul( sgm(:),b(:, :) )*wg
523 real(kind=kreal),
INTENT(IN) :: tt0
524 real(kind=kreal),
INTENT(IN) :: ttc
525 type( tmaterial ),
INTENT(IN) :: material
526 real(kind=kreal),
INTENT(IN) :: coordsys(3,3)
527 logical,
INTENT(IN) :: matlaniso
528 real(kind=kreal),
INTENT(OUT) :: epsth(6)
530 integer(kind=kint) :: j
531 real(kind=kreal) :: ina(1), outa(1)
533 real(kind=kreal) :: alp, alp0, alpo(3), alpo0(3), tm(6,6)
536 if( dabs(ttc-tt0) < 1.d-14 )
return
540 call fetch_tabledata( mc_orthoexp, material%dict, alpo(:), ierr, ina )
541 if( ierr ) stop
"Fails in fetching orthotropic expansion coefficient!"
543 call fetch_tabledata( mc_themoexp, material%dict, outa(:), ierr, ina )
544 if( ierr ) outa(1) = material%variables(m_expansion)
549 call fetch_tabledata( mc_orthoexp, material%dict, alpo0(:), ierr, ina )
550 if( ierr ) stop
"Fails in fetching orthotropic expansion coefficient!"
552 call fetch_tabledata( mc_themoexp, material%dict, outa(:), ierr, ina )
553 if( ierr ) outa(1) = material%variables(m_expansion)
561 epsth(:) = matmul( epsth(:), tm )
562 epsth(4:6) = epsth(4:6)*2.0d0
573 real(kind=kreal),
intent(in) :: rot(3,3)
574 real(kind=kreal),
intent(in) :: stress_in(3,3)
575 real(kind=kreal),
intent(out) :: stress_out(3,3)
577 real(kind=kreal) :: dr(3,3)
582 dr = matmul(dr,i3+0.5d0*rot)
584 stress_out = matmul(dr,stress_in)
585 stress_out = matmul(stress_out,transpose(dr))
588 subroutine update_stress3d( flag, gauss, rot, dstrain, F, coordsys, time, tincr, ttc, tt0, ttn, hdflag )
595 integer(kind=kint),
intent(in) :: flag
596 real(kind=kreal),
intent(in) :: rot(3,3)
597 real(kind=kreal),
intent(in) :: dstrain(6)
598 real(kind=kreal),
intent(in) :: f(3,3)
599 real(kind=kreal),
intent(in) :: coordsys(3,3)
600 real(kind=kreal),
intent(in) :: time
601 real(kind=kreal),
intent(in) :: tincr
602 real(kind=kreal),
intent(in) :: ttc
603 real(kind=kreal),
intent(in) :: tt0
604 real(kind=kreal),
intent(in) :: ttn
605 integer(kind=kint),
intent(in),
optional :: hdflag
607 integer(kind=kint) :: mtype, i, j, k
608 integer(kind=kint) :: isep, hdflag_in, log_valid
609 real(kind=kreal) :: d(6,6), dstress(6), dumstress(3,3), dum(3,3), trd, det
610 real(kind=kreal) :: tensor(6)
611 real(kind=kreal) :: eigval(3)
612 real(kind=kreal) :: princ(3,3), norm
614 mtype = gauss%pMaterial%mtype
616 if( iselastoplastic(mtype) .OR. iscreep(mtype) )
then
623 if(
present(hdflag) ) hdflag_in = hdflag
625 call matlmatrix( gauss, d3, d, time, tincr, coordsys, ttc, isep, hdflag=hdflag_in )
629 if( flag == infinitesimal .OR. ( flag == totallag .AND. isep == 1 ) )
then
632 dstress(1:6) = matmul( d(1:6, 1:6), dstrain(1:6)-gauss%strain_bak(1:6) )
633 gauss%stress(1:6) = gauss%stress_bak(1:6) + dstress(1:6)
634 gauss%strain_energy = gauss%strain_energy_bak+dot_product(gauss%stress_bak(1:6),dstrain(1:6)-gauss%strain_bak(1:6))
635 gauss%strain_energy = gauss%strain_energy+0.5d0*dot_product(dstress,dstrain(1:6)-gauss%strain_bak(1:6))
637 gauss%stress(1:6) = matmul( d(1:6, 1:6), dstrain(1:6) )
638 gauss%strain_energy = 0.5d0*dot_product(gauss%stress(1:6),dstrain(1:6))
640 if( isviscoelastic(mtype) .AND. tincr /= 0.0d0 )
then
641 call stressupdate( gauss, d3, dstrain, gauss%stress, coordsys, time, tincr, ttc, ttn, hdflag=hdflag_in )
642 else if( mtype == norton .AND. tincr /= 0.0d0 .AND. any( gauss%stress /= 0.0d0 ) )
then
643 call stressupdate( gauss, d3, dstrain, gauss%stress, coordsys, time, tincr, ttc, ttn, hdflag=hdflag_in )
646 else if( flag == totallag )
then
648 if( ishyperelastic(mtype) .OR. mtype == userelastic .OR. mtype == usermaterial )
then
649 call stressupdate( gauss, d3, dstrain, gauss%stress, coordsys, temp=0.d0, tempn=0.d0, hdflag=hdflag_in )
650 else if( isviscoelastic(mtype) .AND. tincr /= 0.0d0 )
then
651 call stressupdate( gauss, d3, dstrain, gauss%stress, coordsys, time, tincr, ttc, ttn, hdflag=hdflag_in )
653 gauss%stress(1:6) = matmul( d(1:6, 1:6), dstrain(1:6) )
654 gauss%strain_energy = 0.5d0*dot_product(gauss%stress(1:6),dstrain(1:6))
657 else if( flag == updatelag )
then
661 if( isviscoelastic(mtype) .AND. tincr /= 0.0d0 )
then
662 call stressupdate( gauss, d3, dstrain, gauss%stress, coordsys, time, tincr, ttc, tt0, hdflag=hdflag_in )
664 dstress = matmul( d(1:6,1:6), dstrain(1:6) )
665 dumstress(1,1) = gauss%stress_bak(1)
666 dumstress(2,2) = gauss%stress_bak(2)
667 dumstress(3,3) = gauss%stress_bak(3)
668 dumstress(1,2) = gauss%stress_bak(4); dumstress(2,1)=dumstress(1,2)
669 dumstress(2,3) = gauss%stress_bak(5); dumstress(3,2)=dumstress(2,3)
670 dumstress(3,1) = gauss%stress_bak(6); dumstress(1,3)=dumstress(3,1)
673 trd = dstrain(1)+dstrain(2)+dstrain(3)
674 dum(:,:) = dumstress + matmul( rot,dumstress ) - matmul( dumstress, rot ) - dumstress*trd
677 gauss%stress(1) = dum(1,1) + dstress(1)
678 gauss%stress(2) = dum(2,2) + dstress(2)
679 gauss%stress(3) = dum(3,3) + dstress(3)
680 gauss%stress(4) = dum(1,2) + dstress(4)
681 gauss%stress(5) = dum(2,3) + dstress(5)
682 gauss%stress(6) = dum(3,1) + dstress(6)
684 if( mtype == usermaterial )
then
685 call stressupdate( gauss, d3, dstrain, gauss%stress, coordsys, temp=0.d0, tempn=0.d0, hdflag=hdflag_in )
686 else if( mtype == norton )
then
688 if( tincr /= 0.0d0 .AND. any( gauss%stress /= 0.0d0 ) )
then
690 call stressupdate( gauss, d3, gauss%strain, gauss%stress, coordsys, time, tincr, ttc, ttn, hdflag=hdflag_in )
694 gauss%strain_energy = gauss%strain_energy_bak+dot_product(gauss%stress(1:6),dstrain(1:6))
695 gauss%strain_energy = gauss%strain_energy-0.5d0*dot_product(dstress(1:6),dstrain(1:6))
699 if( iselastoplastic(mtype) )
then
700 call stressupdate( gauss, d3, dstrain, gauss%stress, coordsys, time, tincr, ttc, ttn, hdflag=hdflag_in )
701 gauss%strain_energy = gauss%strain_energy+gauss%plpotential
707 if( flag == infinitesimal )
then
708 gauss%stress_out(1:6) = gauss%stress(1:6)
709 gauss%strain_out(1:6) = gauss%strain(1:6)
712 if( flag == totallag )
then
713 dumstress(1,1) = gauss%stress(1)
714 dumstress(2,2) = gauss%stress(2)
715 dumstress(3,3) = gauss%stress(3)
716 dumstress(1,2) = gauss%stress(4); dumstress(2,1)=dumstress(1,2)
717 dumstress(2,3) = gauss%stress(5); dumstress(3,2)=dumstress(2,3)
718 dumstress(3,1) = gauss%stress(6); dumstress(1,3)=dumstress(3,1)
721 if( det == 0.d0 ) stop
"Fail to convert stress: detF=0"
723 dumstress(1:3,1:3) = matmul(dumstress(1:3,1:3),transpose(f(1:3,1:3)))
724 dumstress(1:3,1:3) = (1.d0/det)*matmul(f(1:3,1:3),dumstress(1:3,1:3))
726 gauss%stress_out(1) = dumstress(1,1)
727 gauss%stress_out(2) = dumstress(2,2)
728 gauss%stress_out(3) = dumstress(3,3)
729 gauss%stress_out(4) = dumstress(1,2)
730 gauss%stress_out(5) = dumstress(2,3)
731 gauss%stress_out(6) = dumstress(3,1)
732 else if( flag == updatelag )
then
733 gauss%stress_out(1:6) = gauss%stress(1:6)
737 dum(1:3,1:3) = matmul(f(1:3,1:3),transpose(f(1:3,1:3)))
746 if( any(eigval(1:3) <= 0.d0) )
then
747 gauss%strain_out(1:6) = gauss%strain(1:6)
751 norm = dsqrt(dot_product(princ(1:3,k),princ(1:3,k)))
752 if( norm <= 1.0d-15 )
then
756 eigval(k) = 0.5d0*dlog(eigval(k))
757 princ(1:3,k) = princ(1:3,k)/norm
759 if( log_valid == 0 )
then
760 gauss%strain_out(1:6) = gauss%strain(1:6)
766 dum(i,j) = dum(i,j) + eigval(k)*princ(i,k)*princ(j,k)
770 gauss%strain_out(1) = dum(1,1)
771 gauss%strain_out(2) = dum(2,2)
772 gauss%strain_out(3) = dum(3,3)
773 gauss%strain_out(4) = 2.d0*dum(1,2)
774 gauss%strain_out(5) = 2.d0*dum(2,3)
775 gauss%strain_out(6) = 2.d0*dum(3,1)
781 gauss%stress_out(1:6) = gauss%stress(1:6)
782 gauss%strain_out(1:6) = gauss%strain(1:6)
790 (etype,nn,ecoord, u, ddu, cdsys_id, coords, qf, &
791 gausses, iter, time, tincr, tt, t0, tn)
801 integer(kind=kint),
intent(in) :: etype
802 integer(kind=kint),
intent(in) :: nn
803 real(kind=kreal),
intent(in) :: ecoord(3, nn)
804 real(kind=kreal),
intent(in) :: u(3, nn)
805 real(kind=kreal),
intent(in) :: ddu(3, nn)
806 integer(kind=kint),
intent(in) :: cdsys_id
807 real(kind=kreal),
intent(inout) :: coords(3, 3)
808 real(kind=kreal),
intent(out) :: qf(nn*3)
810 integer,
intent(in) :: iter
811 real(kind=kreal),
intent(in) :: time
812 real(kind=kreal),
intent(in) :: tincr
813 real(kind=kreal),
intent(in) :: tt(nn)
814 real(kind=kreal),
intent(in) :: t0(nn)
815 real(kind=kreal),
intent(in) :: tn(nn)
818 integer(kind=kint) :: flag
819 integer(kind=kint),
parameter :: ndof = 3
820 real(kind=kreal) :: b(6,ndof*nn), b1(6,ndof*nn), spfunc(nn), ina(1)
821 real(kind=kreal) :: gderiv(nn,3), gderiv1(nn,3), gdispderiv(3,3), f(3,3), det, det1, wg, ttc, tt0, ttn
822 integer(kind=kint) :: j, lx, serr
823 real(kind=kreal) :: naturalcoord(3), rot(3,3), epsth(6)
824 real(kind=kreal) :: totaldisp(3,nn), elem(3,nn), elem1(3,nn), coordsys(3,3)
825 real(kind=kreal) :: dstrain(6)
826 real(kind=kreal) :: alpo(3)
827 logical :: ierr, matlaniso
831 flag = gausses(1)%pMaterial%nlgeom_flag
832 elem(:,:) = ecoord(:,:)
833 totaldisp(:,:) = u(:,:)+ ddu(:,:)
835 elem(:,:) = (0.5d0*ddu(:,:)+u(:,:) ) +ecoord(:,:)
836 elem1(:,:) = (ddu(:,:)+u(:,:) ) +ecoord(:,:)
838 totaldisp(:,:) = ddu(:,:)
843 call fetch_tabledata(
mc_orthoexp, gausses(1)%pMaterial%dict, alpo(:), ierr, ina )
844 if( .not. ierr ) matlaniso = .true.
851 if( cdsys_id > 0 )
then
852 call set_localcoordsys( coords, g_localcoordsys(cdsys_id), coordsys(:,:), serr )
853 if( serr == -1 ) stop
"Fail to setup local coordinate"
854 if( serr == -2 )
then
856 write(*, *)
"WARNING! Cannot setup local coordinate, it is modified automatically"
868 ttc = dot_product(tt, spfunc)
869 tt0 = dot_product(t0, spfunc)
870 ttn = dot_product(tn, spfunc)
875 gdispderiv(1:ndof, 1:ndof) = matmul( totaldisp(1:ndof, 1:nn), gderiv(1:nn, 1:ndof) )
876 dstrain(1) = gdispderiv(1, 1)
877 dstrain(2) = gdispderiv(2, 2)
878 dstrain(3) = gdispderiv(3, 3)
879 dstrain(4) = ( gdispderiv(1, 2)+gdispderiv(2, 1) )
880 dstrain(5) = ( gdispderiv(2, 3)+gdispderiv(3, 2) )
881 dstrain(6) = ( gdispderiv(3, 1)+gdispderiv(1, 3) )
882 dstrain(:) = dstrain(:)-epsth(:)
884 f(1:3,1:3) = 0.d0; f(1,1)=1.d0; f(2,2)=1.d0; f(3,3)=1.d0;
886 gausses(lx)%strain(1:6) = dstrain(1:6)+epsth(1:6)
890 dstrain(1) = dstrain(1)+0.5d0*dot_product( gdispderiv(:, 1), gdispderiv(:, 1) )
891 dstrain(2) = dstrain(2)+0.5d0*dot_product( gdispderiv(:, 2), gdispderiv(:, 2) )
892 dstrain(3) = dstrain(3)+0.5d0*dot_product( gdispderiv(:, 3), gdispderiv(:, 3) )
893 dstrain(4) = dstrain(4)+( gdispderiv(1, 1)*gdispderiv(1, 2) &
894 +gdispderiv(2, 1)*gdispderiv(2, 2)+gdispderiv(3, 1)*gdispderiv(3, 2) )
895 dstrain(5) = dstrain(5)+( gdispderiv(1, 2)*gdispderiv(1, 3) &
896 +gdispderiv(2, 2)*gdispderiv(2, 3)+gdispderiv(3, 2)*gdispderiv(3, 3) )
897 dstrain(6) = dstrain(6)+( gdispderiv(1, 1)*gdispderiv(1, 3) &
898 +gdispderiv(2, 1)*gdispderiv(2, 3)+gdispderiv(3, 1)*gdispderiv(3, 3) )
900 gausses(lx)%strain(1:6) = dstrain(1:6)+epsth(:)
901 f(1:3,1:3) = f(1:3,1:3) + gdispderiv(1:3,1:3)
905 rot(1, 2)= 0.5d0*(gdispderiv(1, 2)-gdispderiv(2, 1) ); rot(2, 1) = -rot(1, 2)
906 rot(2, 3)= 0.5d0*(gdispderiv(2, 3)-gdispderiv(3, 2) ); rot(3, 2) = -rot(2, 3)
907 rot(1, 3)= 0.5d0*(gdispderiv(1, 3)-gdispderiv(3, 1) ); rot(3, 1) = -rot(1, 3)
909 gausses(lx)%strain(1:6) = gausses(lx)%strain_bak(1:6)+dstrain(1:6)+epsth(:)
911 call getglobalderiv(etype, nn, naturalcoord, ecoord, det1, gderiv1)
912 f(1:3,1:3) = f(1:3,1:3) + matmul( u(1:ndof, 1:nn)+ddu(1:ndof, 1:nn), gderiv1(1:nn, 1:ndof) )
917 call update_stress3d( flag, gausses(lx), rot, dstrain, f, coordsys, time, tincr, ttc, tt0, ttn )
923 b(1:6, 1:nn*ndof) = 0.0d0
925 b(1,3*j-2) = gderiv(j, 1)
926 b(2,3*j-1) = gderiv(j, 2)
927 b(3,3*j ) = gderiv(j, 3)
928 b(4,3*j-2) = gderiv(j, 2)
929 b(4,3*j-1) = gderiv(j, 1)
930 b(5,3*j-1) = gderiv(j, 3)
931 b(5,3*j ) = gderiv(j, 2)
932 b(6,3*j-2) = gderiv(j, 3)
933 b(6,3*j ) = gderiv(j, 1)
941 gdispderiv(1:ndof, 1:ndof) = matmul( totaldisp(1:ndof, 1:nn), gderiv(1:nn, 1:ndof) )
942 b1(1:6, 1:nn*ndof)=0.0d0
944 b1(1, 3*j-2) = gdispderiv(1, 1)*gderiv(j, 1)
945 b1(1, 3*j-1) = gdispderiv(2, 1)*gderiv(j, 1)
946 b1(1, 3*j ) = gdispderiv(3, 1)*gderiv(j, 1)
947 b1(2, 3*j-2) = gdispderiv(1, 2)*gderiv(j, 2)
948 b1(2, 3*j-1) = gdispderiv(2, 2)*gderiv(j, 2)
949 b1(2, 3*j ) = gdispderiv(3, 2)*gderiv(j, 2)
950 b1(3, 3*j-2) = gdispderiv(1, 3)*gderiv(j, 3)
951 b1(3, 3*j-1) = gdispderiv(2, 3)*gderiv(j, 3)
952 b1(3, 3*j ) = gdispderiv(3, 3)*gderiv(j, 3)
953 b1(4, 3*j-2) = gdispderiv(1, 2)*gderiv(j, 1)+gdispderiv(1, 1)*gderiv(j, 2)
954 b1(4, 3*j-1) = gdispderiv(2, 2)*gderiv(j, 1)+gdispderiv(2, 1)*gderiv(j, 2)
955 b1(4, 3*j ) = gdispderiv(3, 2)*gderiv(j, 1)+gdispderiv(3, 1)*gderiv(j, 2)
956 b1(5, 3*j-2) = gdispderiv(1, 2)*gderiv(j, 3)+gdispderiv(1, 3)*gderiv(j, 2)
957 b1(5, 3*j-1) = gdispderiv(2, 2)*gderiv(j, 3)+gdispderiv(2, 3)*gderiv(j, 2)
958 b1(5, 3*j ) = gdispderiv(3, 2)*gderiv(j, 3)+gdispderiv(3, 3)*gderiv(j, 2)
959 b1(6, 3*j-2) = gdispderiv(1, 3)*gderiv(j, 1)+gdispderiv(1, 1)*gderiv(j, 3)
960 b1(6, 3*j-1) = gdispderiv(2, 3)*gderiv(j, 1)+gdispderiv(2, 1)*gderiv(j, 3)
961 b1(6, 3*j ) = gdispderiv(3, 3)*gderiv(j, 1)+gdispderiv(3, 1)*gderiv(j, 3)
965 b(:,j) = b(:,j)+b1(:,j)
971 b(1:6, 1:nn*ndof) = 0.0d0
973 b(1, 3*j-2) = gderiv(j, 1)
974 b(2, 3*j-1) = gderiv(j, 2)
975 b(3, 3*j ) = gderiv(j, 3)
976 b(4, 3*j-2) = gderiv(j, 2)
977 b(4, 3*j-1) = gderiv(j, 1)
978 b(5, 3*j-1) = gderiv(j, 3)
979 b(5, 3*j ) = gderiv(j, 2)
980 b(6, 3*j-2) = gderiv(j, 3)
981 b(6, 3*j ) = gderiv(j, 1)
989 = qf(1:nn*ndof)+matmul( gausses(lx)%stress(1:6), b(1:6,1:nn*ndof) )*wg
992 gausses(lx)%strain_energy = gausses(lx)%strain_energy*wg
1007 integer(kind=kint),
intent(in) :: etype, nn
1009 real(kind=kreal),
intent(out) :: ndstrain(nn,6)
1010 real(kind=kreal),
intent(out) :: ndstress(nn,6)
1015 real(kind=kreal) :: temp(12)
1024 temp(1:6) = temp(1:6) +gausses(i)%strain_out(1:6)
1025 temp(7:12) = temp(7:12)+gausses(i)%stress_out(1:6)
1028 temp(1:12) = temp(1:12)/ic
1031 ndstrain(i, 1:6) = temp(1:6)
1032 ndstress(i, 1:6) = temp(7:12)
1048 integer(kind=kint),
intent(in) :: etype
1050 real(kind=kreal),
intent(out) :: strain(6)
1051 real(kind=kreal),
intent(out) :: stress(6)
1059 strain(:) = 0.0d0; stress(:) = 0.0d0
1064 strain(:) = strain(:)+gausses(i)%strain_out(1:6)
1065 stress(:) = stress(:)+gausses(i)%stress_out(1:6)
1068 strain(:) = strain(:)/ic
1069 stress(:) = stress(:)/ic
1079 integer(kind=kint),
intent(in) :: etype, nn
1080 real(kind=kreal),
intent(in) :: xx(:), yy(:), zz(:)
1084 real(kind=kreal) :: xj(3, 3), det
1085 integer(kind=kint) :: lx
1086 real(kind=kreal) :: localcoord(3), deriv(nn, 3)
1099 xj(1, 1:3)= matmul( xx(1:nn), deriv(1:nn,1:3) )
1100 xj(2, 1:3)= matmul( yy(1:nn), deriv(1:nn,1:3) )
1101 xj(3, 1:3)= matmul( zz(1:nn), deriv(1:nn,1:3) )
1104 det = xj(1, 1)*xj(2, 2)*xj(3, 3) &
1105 +xj(2, 1)*xj(3, 2)*xj(1, 3) &
1106 +xj(3, 1)*xj(1, 2)*xj(2, 3) &
1107 -xj(3, 1)*xj(2, 2)*xj(1, 3) &
1108 -xj(2, 1)*xj(1, 2)*xj(3, 3) &
1109 -xj(1, 1)*xj(3, 2)*xj(2, 3)
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.
integer(kind=kind(2)) function getnumberofnodes(etype)
Obtain number of nodes of the element.
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.
subroutine getsubface(intype, innumber, outtype, nodes)
Find the definition of surface of the element.
subroutine getshapederiv(fetype, localcoord, shapederiv)
Calculate derivatives of shape function in natural 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.
real(kind=kreal) function, dimension(3) surfacenormal(fetype, nn, localcoord, elecoord)
Calculate normal of 3d-surface.
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.
integer(kind=kint), parameter kopss_solution
integer(kind=kint) opsstype
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.
subroutine stressupdate(gauss, sectType, strain, stress, cdsys, time, dtime, temp, tempn, hdflag)
Update strain and stress for elastic and hyperelastic materials.
This module provides common functions of Solid elements.
subroutine elementstress_c3(etype, gausses, strain, stress)
subroutine tload_c3(etype, nn, XX, YY, ZZ, TT, T0, gausses, VECT, cdsys_ID, coords)
This subroutien calculate thermal loading.
subroutine dl_c3(etype, nn, XX, YY, ZZ, RHO, LTYPE, PARAMS, VECT, NSIZE)
Distributed external load.
subroutine hughes_winget_rotation_3d(rot, stress_in, stress_out)
subroutine geomat_c3(stress, mat)
subroutine update_c3(etype, nn, ecoord, u, ddu, cdsys_ID, coords, qf, gausses, iter, time, tincr, TT, T0, TN)
Update strain and stress inside element.
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)
subroutine stf_c3(etype, nn, ecoord, gausses, stiff, cdsys_ID, coords, time, tincr, u, temperature)
This subroutine calculate stiff matrix of general solid elements.
real(kind=kreal) function volume_c3(etype, nn, XX, YY, ZZ)
Volume of element.
subroutine nodalstress_c3(etype, nn, gausses, ndstrain, ndstress)
This module provides aux functions.
real(kind=kreal) function determinant33(XJ)
Compute determinant for 3*3 matrix.
subroutine get_principal(tensor, eigval, princmatrix)
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 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.