FrontISTR  6.0.0
Large-scale structural analysis program with finit element method
static_LIB_Fbar.f90
Go to the documentation of this file.
1 !-------------------------------------------------------------------------------
2 ! Copyright (c) 2019 FrontISTR Commons
3 ! This software is released under the MIT License, see LICENSE.txt
4 !-------------------------------------------------------------------------------
8 
9  use hecmw, only : kint, kreal
10  use elementinfo
11 
12  implicit none
13 
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/) )
16 
17 contains
18 
19 
21  !----------------------------------------------------------------------*
22  subroutine stf_c3d8fbar &
23  (etype, nn, ecoord, gausses, stiff, cdsys_id, coords, &
24  time, tincr, u, temperature)
25  !----------------------------------------------------------------------*
26 
27  use mmechgauss
28  use m_matmatrix
29  use m_common_struct
30  use m_static_lib_3d, only: geomat_c3
31  use m_utilities
32 
33  !---------------------------------------------------------------------
34 
35  integer(kind=kint), intent(in) :: etype
36  integer(kind=kint), intent(in) :: nn
37  real(kind=kreal), intent(in) :: ecoord(3, nn)
38  type(tgaussstatus), intent(in) :: gausses(:)
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)
46 
47  !---------------------------------------------------------------------
48 
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)
61 
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)
66 
67  !---------------------------------------------------------------------
68 
69  stiff(:, :) = 0.0d0
70  ! we suppose the same material type in the element
71  flag = gausses(1)%pMaterial%nlgeom_flag
72  if( .not. present(u) ) flag = infinitesimal ! enforce to infinitesimal deformation analysis
73  elem(:, :) = ecoord(:, :)
74  elem0(:, :) = ecoord(:, :)
75  if( flag == updatelag ) elem(:, :) = ecoord(:, :)+u(:, :)
76  elem1(:, :) = ecoord(:, :)+u(:, :)
77 
78  !cal volumetric average of J=detF and dN/dx
79  v0 = 0.d0
80  jacob_ave = 0.d0
81  gderiv1_ave(1:nn,1:ndof) = 0.d0
82  gderiv2_ave(1:ndof*nn,1:ndof*nn) = 0.d0
83  do lx = 1, numofquadpoints(etype)
84  call getquadpoint( etype, lx, naturalcoord(:) )
85  call getglobalderiv( etype, nn, naturalcoord, elem0, det, gderiv)
86  wg = getweight(etype, lx)*det
87  if( flag == infinitesimal ) then
88  jacob = 1.d0
89  jratio(lx) = 1.d0
90  gderiv1_ave(1:nn,1:ndof) = gderiv1_ave(1:nn,1:ndof) + jacob*wg*gderiv(1:nn, 1:ndof)
91  else
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)
95  call getglobalderiv( etype, nn, naturalcoord, elem1, det, gderiv1)
96  gderiv1_ave(1:nn,1:ndof) = gderiv1_ave(1:nn,1:ndof) + jacob*wg*gderiv1(1:nn, 1:ndof)
97  do p=1,nn
98  do q=1,nn
99  do i=1,ndof
100  do j=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))
103  end do
104  end do
105  end do
106  end do
107  endif
108  v0 = v0 + wg
109  jacob_ave = jacob_ave + jacob*wg
110  enddo
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) !Jratio(1:8) = (jacob_ave**(1.d0/3.d0))*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)
117  else
118  stop 'Error in Update_C3D8Fbar: too small element volume'
119  end if
120 
121  do lx = 1, numofquadpoints(etype)
122 
123  call getquadpoint( etype, lx, naturalcoord(:) )
124  call getglobalderiv(etype, nn, naturalcoord, elem, det, gderiv)
125 
126  if( cdsys_id > 0 ) then
127  call set_localcoordsys( coords, g_localcoordsys(cdsys_id), coordsys(:, :), serr )
128  if( serr == -1 ) stop "Fail to setup local coordinate"
129  if( serr == -2 ) then
130  !$omp critical
131  write(*, *) "WARNING! Cannot setup local coordinate, it is modified automatically"
132  !$omp end critical
133  end if
134  end if
135 
136  call getshapefunc( etype, naturalcoord, spfunc )
137  temp = dot_product( temperature, spfunc )
138  call matlmatrix( gausses(lx), d3, d, time, tincr, coordsys, temp )
139 
140  if( flag == updatelag ) then
141  call geomat_c3( gausses(lx)%stress, mat )
142  d(:, :) = d(:, :)-mat
143  endif
144 
145  wg = getweight(etype, lx)*det
146  b(1:6, 1:nn*ndof) = 0.0d0
147  do j = 1, nn
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)
157  end do
158 
159  ! calculate the BL1 matrix ( TOTAL LAGRANGE METHOD )
160  if( flag == infinitesimal ) then
161  b2(1:6, 1:nn*ndof) = 0.0d0
162  do j = 1, nn
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)
167  end do
168 
169  ! BL = Jratio*(BL0 + BL1)+BL2
170  do j = 1, nn*ndof
171  b(1:3, j) = b(1:3,j)+b2(1:3,j)
172  end do
173 
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)
178 
179  ! ---dudx(i,j) ==> gdispderiv(i,j)
180  b1(1:6, 1:nn*ndof) = 0.0d0
181  do j = 1, nn
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)
200  end do
201 
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))
208 
209  b2(1:6, 1:nn*ndof) = 0.0d0
210  do j = 1, nn
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)
218  end do
219 
220  ! BL = Jratio*(BL0 + BL1)+BL2
221  do j = 1, nn*ndof
222  b(:, j) = jratio(lx)*jratio(lx)*(b(:,j)+b1(:,j))+b2(:,j)
223  end do
224 
225  else if( flag == updatelag ) then
226  wg = (jratio(lx)**3.d0)*getweight(etype, lx)*det
227 
228  b2(1:3, 1:nn*ndof) = 0.0d0
229  do j = 1, nn
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)
234  end do
235 
236  do j = 1, nn*ndof
237  b(1:3, j) = b(1:3,j)+b2(1:3,j)
238  end do
239 
240  end if
241 
242  db(1:6, 1:nn*ndof) = matmul( d, b(1:6, 1:nn*ndof) )
243  do j=1,nn*ndof
244  do i=1,nn*ndof
245  stiff(i, j) = stiff(i, j)+dot_product( b(:, i), db(:, j) )*wg
246  end do
247  end do
248 
249  ! calculate the initial stress matrix(1): dFbar*dFbar*Stress
250  if( flag == totallag .or. flag == updatelag ) then
251  stress(1:6) = gausses(lx)%stress
252  if( flag == totallag ) then
253  coeff = jratio(lx)
254  sff = dot_product(stress(1:6),dstrain(1:6))
255  else if( flag == updatelag ) then
256  coeff = 1.d0
257  sff = stress(1)+stress(2)+stress(3)
258  gderiv1 = gderiv
259  fbar(1:3,1:3) = i33(1:3,1:3)
260  end if
261 
262  bn(1:9, 1:nn*ndof) = 0.0d0
263  do j = 1, nn
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)
283  end do
284  smat(:, :) = 0.0d0
285  do j= 1, 3
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)
295  end do
296  sbn(1:9, 1:nn*ndof) = matmul( smat(1:9, 1:9), bn(1:9, 1:nn*ndof) )
297  do j=1,nn*ndof
298  do i=1,nn*ndof
299  stiff(i, j) = stiff(i, j)+dot_product( bn(:, i), sbn(:, j) )*wg
300  end do
301  end do
302 
303  ! calculate the initial stress matrix(2): d(dFbar)*Stress
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)
313  do i=1,nn
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))
316  do j=1,nn
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))
319  do p=1,ndof
320  do q=1,ndof
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
326  end do
327  end do
328  end do
329  end do
330  end if
331 
332 
333  end do ! gauss roop
334 
335  end subroutine stf_c3d8fbar
336 
337 
339  !----------------------------------------------------------------------*
340  subroutine update_c3d8fbar &
341  (etype, nn, ecoord, u, du, cdsys_id, coords, &
342  qf, gausses, iter, time, tincr, tt, t0, tn )
343  !----------------------------------------------------------------------*
344 
345  use m_fstr
346  use mmaterial
347  use mmechgauss
348  use m_matmatrix
349  use m_elastoplastic
350  use mhyperelastic
351  use m_utilities
352  use m_static_lib_3d
353 
354  !---------------------------------------------------------------------
355 
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)
364  type(tgaussstatus), intent(inout) :: gausses(:)
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)
371 
372  !---------------------------------------------------------------------
373 
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
385 
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)
390 
391  !---------------------------------------------------------------------
392 
393  qf(:) = 0.0d0
394  ! we suppose the same material type in the element
395  flag = gausses(1)%pMaterial%nlgeom_flag
396  elem0(1:ndof,1:nn) = ecoord(1:ndof,1:nn)
397  totaldisp(:, :) = u(:, :)+du(:, :)
398  if( flag == infinitesimal ) then
399  elem(:, :) = ecoord(:, :)
400  elem1(:, :) = ecoord(:, :)
401  else if( flag == totallag ) then
402  elem(:, :) = ecoord(:, :)
403  elem1(:, :) = ( du(:, :)+u(:, :) )+ecoord(:, :)
404  else if( flag == updatelag ) then
405  elem(:, :) = ( 0.5d0*du(:, :)+u(:, :) )+ecoord(:, :)
406  elem1(:, :) = ( du(:, :)+u(:, :) )+ecoord(:, :)
407  totaldisp(:, :) = du(:, :)
408  end if
409 
410  matlaniso = .false.
411  ina = tt(1)
412  call fetch_tabledata( mc_orthoexp, gausses(1)%pMaterial%dict, alpo(:), ierr, ina )
413  if( .not. ierr ) matlaniso = .true.
414 
415  !cal volumetric average of J=detF and dN/dx
416  v0 = 0.d0
417  jacob_ave = 0.d0
418  gderiv1_ave(1:nn,1:ndof) = 0.d0
419  if( flag == updatelag ) then
420  jacob_ave05 = 0.d0
421  gderiv05_ave(1:nn,1:ndof) = 0.d0
422  endif
423  do lx = 1, numofquadpoints(etype)
424  call getquadpoint( etype, lx, naturalcoord(:) )
425  call getglobalderiv( etype, nn, naturalcoord, elem0, det, gderiv)
426  wg = getweight(etype, lx)*det
427  if( flag == infinitesimal ) then
428  jacob = 1.d0
429  jratio(lx) = 1.d0
430  gderiv1(1:nn, 1:ndof) = gderiv(1:nn, 1:ndof)
431  else
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) ! Jratio(LX) = jacob**(-1.d0/3.d0)
435 
436  call getglobalderiv( etype, nn, naturalcoord, elem1, det, gderiv1)
437  endif
438  v0 = v0 + wg
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)
441  if( flag == updatelag ) then
442  call getglobalderiv( etype, nn, naturalcoord, elem, det, gderiv1)
443  wg = getweight(etype, lx)*det
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)
446  endif
447  enddo
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) !Jratio(1:8) = (jacob_ave**(1.d0/3.d0))*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
454  else
455  stop 'Error in Update_C3D8Fbar: too small element volume'
456  end if
457 
458  do lx = 1, numofquadpoints(etype)
459 
460  call getquadpoint( etype, lx, naturalcoord(:) )
461  call getglobalderiv(etype, nn, naturalcoord, elem, det, gderiv)
462 
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
467  !$omp critical
468  write(*, *) "WARNING! Cannot setup local coordinate, it is modified automatically"
469  !$omp end critical
470  end if
471  end if
472 
473  gdispderiv(1:ndof, 1:ndof) = matmul( totaldisp(1:ndof, 1:nn), gderiv(1:nn, 1:ndof) )
474 
475  ! ========================================================
476  ! UPDATE STRAIN and STRESS
477  ! ========================================================
478 
479  ! Thermal Strain
480  call getshapefunc(etype, naturalcoord, spfunc)
481  ttc = dot_product(tt, spfunc)
482  tt0 = dot_product(t0, spfunc)
483  ttn = dot_product(tn, spfunc)
484  call cal_thermal_expansion_c3( tt0, ttc, gausses(lx)%pMaterial, coordsys, matlaniso, epsth )
485 
486  ! Update strain
487  if( flag == infinitesimal ) then
488  dvol = dot_product( totaldisp(1,1:nn), gderiv1_ave(1:nn,1) ) !du1/dx1
489  dvol = dvol + dot_product( totaldisp(2,1:nn), gderiv1_ave(1:nn,2) ) !du2/dx2
490  dvol = dvol + dot_product( totaldisp(3,1:nn), gderiv1_ave(1:nn,3) ) !du3/dx3
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(:)
499 
500  gausses(lx)%strain(1:6) = dstrain(1:6)+epsth(:)
501 
502  else if( flag == totallag ) then
503  fbar(1:ndof, 1:ndof) = jratio(lx)*(i33(1:ndof,1:ndof) + gdispderiv(1:ndof, 1:ndof))
504 
505  ! Green-Lagrange strain
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(:)
513 
514  gausses(lx)%strain(1:6) = dstrain(1:6)+epsth(:)
515 
516  else if( flag == updatelag ) then
517  dvol = dot_product( totaldisp(1,1:nn), gderiv05_ave(1:nn,1) ) !du1/dx1
518  dvol = dvol + dot_product( totaldisp(2,1:nn), gderiv05_ave(1:nn,2) ) !du2/dx2
519  dvol = dvol + dot_product( totaldisp(3,1:nn), gderiv05_ave(1:nn,3) ) !du3/dx3
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(:)
528 
529  rot = 0.0d0
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)
533 
534  gausses(lx)%strain(1:6) = gausses(lx)%strain_bak(1:6)+dstrain(1:6)+epsth(:)
535 
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))
539 
540  end if
541 
542  ! Update stress
543  call update_stress3d( flag, gausses(lx), rot, dstrain, fbar, coordsys, time, tincr, ttc, tt0, ttn )
544 
545  ! ========================================================
546  ! calculate the internal force ( equivalent nodal force )
547  ! ========================================================
548  ! Small strain
549  b(1:6, 1:nn*ndof) = 0.0d0
550  do j = 1, nn
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)
560  end do
561 
562  wg=getweight( etype, lx )*det
563  if( flag == infinitesimal ) then
564  gderiv1(1:nn, 1:ndof) = gderiv(1:nn, 1:ndof)
565 
566  b2(1:6, 1:nn*ndof) = 0.0d0
567  do j = 1, nn
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)
572  end do
573 
574  ! BL = BL0 + BL2
575  do j = 1, nn*ndof
576  b(:, j) = b(:,j)+b2(:,j)
577  end do
578 
579  else if( flag == totallag ) then
580 
581  b1(1:6, 1:nn*ndof) = 0.0d0
582  do j = 1, nn
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)
601  end do
602 
603  call getglobalderiv(etype, nn, naturalcoord, elem1, det, gderiv1)
604 
605  b2(1:6, 1:nn*ndof) = 0.0d0
606  do j = 1, nn
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)
614  end do
615 
616  ! BL = R^2*(BL0 + BL1)+BL2
617  do j = 1, nn*ndof
618  b(:, j) = jratio(lx)*jratio(lx)*(b(:,j)+b1(:,j))+b2(:,j)
619  end do
620 
621  else if( flag == updatelag ) then
622 
623  call getglobalderiv(etype, nn, naturalcoord, elem1, det, gderiv)
624  wg = (jratio(lx)**3.d0)*getweight(etype, lx)*det
625  b(1:6, 1:nn*ndof) = 0.0d0
626  do j = 1, nn
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)
636  end do
637 
638  b2(1:3, 1:nn*ndof) = 0.0d0
639  do j = 1, nn
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)
644  end do
645 
646  do j = 1, nn*ndof
647  b(1:3, j) = b(1:3,j)+b2(1:3,j)
648  end do
649 
650  end if
651 
652  qf(1:nn*ndof) &
653  = qf(1:nn*ndof)+matmul( gausses(lx)%stress(1:6), b(1:6,1:nn*ndof) )*wg
654 
655  ! integrate strain energy
656  gausses(lx)%strain_energy = gausses(lx)%strain_energy*wg
657  end do
658 
659  end subroutine update_c3d8fbar
660 
662  !----------------------------------------------------------------------*
663  subroutine tload_c3d8fbar &
664  (etype, nn, xx, yy, zz, tt, t0, &
665  gausses, vect, cdsys_id, coords)
666  !----------------------------------------------------------------------*
667 
668  use m_fstr
669  use mmechgauss
670  use m_matmatrix
671  use m_utilities
672 
673  !---------------------------------------------------------------------
674 
675  integer(kind=kint), parameter :: ndof = 3
676  integer(kind=kint), intent(in) :: etype, nn
677  type(tgaussstatus), intent(in) :: gausses(:)
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)
683 
684  !---------------------------------------------------------------------
685 
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
694 
695  !---------------------------------------------------------------------
696 
697  matlaniso = .false.
698 
699  if( cdsys_id > 0 ) then ! cannot define aniso expansion when no local coord defined
700  ina = tt(1)
701  call fetch_tabledata( mc_orthoexp, gausses(1)%pMaterial%dict, alpo(:), ierr, ina )
702  if( .not. ierr ) matlaniso = .true.
703  end if
704 
705  vect(:) = 0.0d0
706 
707  ecoord(1, :) = xx(:)
708  ecoord(2, :) = yy(:)
709  ecoord(3, :) = zz(:)
710 
711  !cal volumetric average of J=detF and dN/dx
712  v0 = 0.d0
713  jacob_ave = 0.d0
714  gderiv1_ave(1:nn,1:ndof) = 0.d0
715  do lx = 1, numofquadpoints(etype)
716  call getquadpoint( etype, lx, naturalcoord(:) )
717  call getglobalderiv( etype, nn, naturalcoord, ecoord, det, gderiv)
718  wg = getweight(etype, lx)*det
719  v0 = v0 + wg
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)
722  enddo
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)
727  else
728  stop 'Error in TLOAD_C3D8Fbar: too small element volume'
729  end if
730 
731  ! LOOP FOR INTEGRATION POINTS
732  do lx = 1, numofquadpoints(etype)
733 
734  call getquadpoint( etype, lx, naturalcoord(:) )
735  call getshapefunc( etype, naturalcoord, h(1:nn) )
736  call getglobalderiv(etype, nn, naturalcoord, ecoord, det, gderiv)
737 
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"
743  end if
744  end if
745 
746  ! WEIGHT VALUE AT GAUSSIAN POINT
747  wg = getweight(etype, lx)*det
748  b(1:6, 1:nn*ndof) = 0.0d0
749  do j = 1, nn
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)
759  end do
760 
761  do j = 1, nn
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)
766  end do
767 
768  tempc = dot_product( h(1:nn),tt(1:nn) )
769  temp0 = dot_product( h(1:nn),t0(1:nn) )
770 
771  call matlmatrix( gausses(lx), d3, d, 1.d0, 0.0d0, coordsys, tempc )
772 
773  ina(1) = tempc
774  if( matlaniso ) then
775  call fetch_tabledata( mc_orthoexp, gausses(lx)%pMaterial%dict, alpo(:), ierr, ina )
776  if( ierr ) stop "Fails in fetching orthotropic expansion coefficient!"
777  else
778  call fetch_tabledata( mc_themoexp, gausses(lx)%pMaterial%dict, outa(:), ierr, ina )
779  if( ierr ) outa(1) = gausses(lx)%pMaterial%variables(m_expansion)
780  alp = outa(1)
781  end if
782  ina(1) = temp0
783  if( matlaniso ) then
784  call fetch_tabledata( mc_orthoexp, gausses(lx)%pMaterial%dict, alpo0(:), ierr, ina )
785  if( ierr ) stop "Fails in fetching orthotropic expansion coefficient!"
786  else
787  call fetch_tabledata( mc_themoexp, gausses(lx)%pMaterial%dict, outa(:), ierr, ina )
788  if( ierr ) outa(1) = gausses(lx)%pMaterial%variables(m_expansion)
789  alp0 = outa(1)
790  end if
791 
792  !**
793  !** THERMAL strain
794  !**
795  if( matlaniso ) then
796  do j = 1, 3
797  estrain(j) = alpo(j)*(tempc-ref_temp)-alpo0(j)*(temp0-ref_temp)
798  end do
799  estrain(4:6) = 0.0d0
800  call transformation(coordsys, tm)
801  estrain(:) = matmul( estrain(:), tm ) ! to global coord
802  estrain(4:6) = estrain(4:6)*2.0d0
803  else
804  thermal_eps = alp*(tempc-ref_temp)-alp0*(temp0-ref_temp)
805  estrain(1:3) = thermal_eps
806  estrain(4:6) = 0.0d0
807  end if
808 
809  !**
810  !** SET SGM {s}=[D]{e}
811  !**
812  sgm(:) = matmul( d(:, :), estrain(:) )
813 
814  !**
815  !** CALCULATE LOAD {F}=[B]T{e}
816  !**
817  vect(1:nn*ndof) = vect(1:nn*ndof)+matmul( sgm(:), b(:, :) )*wg
818 
819  end do
820 
821  end subroutine tload_c3d8fbar
822 
823 
824 end module m_static_lib_fbar
This module encapsulate the basic functions of all elements provide by this software.
Definition: element.f90:43
subroutine getshapefunc(fetype, localcoord, func)
Calculate the shape function in natural coordinate system.
Definition: element.f90:754
subroutine getquadpoint(fetype, np, pos)
Fetch the coordinate of gauss point.
Definition: element.f90:539
subroutine getglobalderiv(fetype, nn, localcoord, elecoord, det, gderiv)
Calculate shape derivative in global coordinate system.
Definition: element.f90:848
real(kind=kreal) function getweight(fetype, np)
Fetch the weight value in given gauss point.
Definition: element.f90:585
integer function numofquadpoints(fetype)
Obtains the number of quadrature points of the element.
Definition: element.f90:451
Definition: hecmw.f90:6
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.
Definition: m_fstr.F90:15
real(kind=kreal), pointer ref_temp
REFTEMP.
Definition: m_fstr.F90:147
This module manages calculation relates with materials.
Definition: calMatMatrix.f90:6
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.
Definition: utilities.f90:6
real(kind=kreal) function determinant33(XJ)
Compute determinant for 3*3 matrix.
Definition: utilities.f90:245
subroutine transformation(jacob, tm)
Definition: utilities.f90:392
This module provides functions for hyperelastic calculation.
Definition: Hyperelastic.f90:6
This module summarizes all information of material properties.
Definition: material.f90:6
integer(kind=kint), parameter totallag
Definition: material.f90:14
character(len=dict_key_length) mc_orthoexp
Definition: material.f90:143
integer(kind=kint), parameter infinitesimal
Definition: material.f90:13
integer(kind=kint), parameter updatelag
Definition: material.f90:15
This modules defines a structure to record history dependent parameter in static analysis.
Definition: mechgauss.f90:6
All data should be recorded in every quadrature points.
Definition: mechgauss.f90:15