20 integer,
pointer :: istatus(:) =>null()
21 real(kind=
kreal),
pointer :: fstatus(:) => null()
23 real(kind=
kreal) :: strain_bak(6)
24 real(kind=
kreal) :: stress_bak(6)
26 real(kind=
kreal) :: strain_out(6)
27 real(kind=
kreal) :: stress_out(6)
28 real(kind=
kreal) :: strain_energy
29 real(kind=
kreal) :: strain_energy_bak
38 real(kind=
kreal),
pointer :: equiforces(:) => null()
41 integer(kind=kint) :: shell_nlayer = 0
42 integer(kind=kint) :: shell_nthick = 0
43 real(kind=
kreal),
pointer :: aux(:,:) => null()
44 integer :: elemact_flag
45 real(kind=
kreal) :: elemact_coeff
56 gauss%strain=0.d0; gauss%stress=0.d0
57 gauss%strain_bak=0.d0; gauss%stress_bak=0.d0
58 gauss%strain_out=0.d0; gauss%stress_out=0.d0
61 gauss%strain_energy =0.d0
62 gauss%strain_energy_bak =0.d0
64 if( gauss%pMaterial%nfstatus> 0 )
then
65 allocate( gauss%fstatus(gauss%pMaterial%nfstatus) )
66 gauss%fstatus(:) = 0.d0
69 allocate( gauss%istatus(1) )
72 if( n>0 )
allocate( gauss%fstatus(n) )
74 allocate( gauss%fstatus(7+6) )
76 allocate( gauss%fstatus(2) )
83 allocate( gauss%fstatus(12*n+6) )
86 stop
"Viscoelastic properties not defined"
88 else if( gauss%pMaterial%mtype==
norton )
then
89 allocate( gauss%fstatus(2) )
98 if(
associated( gauss%istatus ) )
deallocate( gauss%istatus )
99 if(
associated( gauss%fstatus ) )
deallocate( gauss%fstatus )
104 integer(kind=kint),
intent(in) :: etype
118 type(
telement ),
intent(inout) :: element
119 integer(kind=kint),
intent(in) :: ng, nlayer, nthick
120 integer(kind=kint) :: i, nstatus
122 if( ng <= 0 .or. nlayer <= 0 .or. nthick <= 0 )
return
123 if( .not.
associated( element%gausses ) )
return
124 if(
associated( element%shell_layer_gausses ) )
return
126 nstatus = ng*nlayer*nthick
127 allocate( element%shell_layer_gausses( nstatus ) )
128 element%shell_nlayer = nlayer
129 element%shell_nthick = nthick
132 element%shell_layer_gausses(i)%pMaterial => element%gausses(1)%pMaterial
139 type(
telement ),
intent(in) :: element
140 integer(kind=kint),
intent(in) :: ig, ilayer, ithick
141 integer(kind=kint) :: ngauss
144 if( .not.
associated( element%gausses ) )
return
145 if( .not.
associated( element%shell_layer_gausses ) )
return
146 if( element%shell_nlayer <= 0 .or. element%shell_nthick <= 0 )
return
147 if( ilayer < 1 .or. ilayer > element%shell_nlayer )
return
148 if( ithick < 1 .or. ithick > element%shell_nthick )
return
150 ngauss =
size( element%gausses )
151 if( ig < 1 .or. ig > ngauss )
return
152 if(
size( element%shell_layer_gausses ) < ngauss*element%shell_nlayer*element%shell_nthick )
return
155 *element%shell_nthick + ithick
160 integer(kind=kint),
intent(in) :: etype, ithick
161 real(kind=
kreal),
intent(out) :: zeta, weight
162 integer(kind=kint),
intent(out) :: ierr
170 if( ithick < 1 .or. ithick > 2 )
then
177 if( ithick < 1 .or. ithick > 3 )
then
190 type(
telement ),
intent(in) :: element
191 integer(kind=kint),
intent(in) :: ilayer, ithick
192 real(kind=
kreal),
intent(out) :: zeta_layer, weight
193 integer(kind=kint),
intent(out) :: ierr
199 if( .not.
associated( element%gausses ) )
then
205 zeta_layer, weight, ierr )
210 integer(kind=kint),
intent(in) :: etype, ilayer, ithick
212 real(kind=
kreal),
intent(out) :: zeta_layer, weight
213 integer(kind=kint),
intent(out) :: ierr
214 real(kind=
kreal) :: zeta
221 if( ierr /= 0 )
return
228 integer(kind=kint),
intent(in) :: ilayer
229 real(kind=
kreal),
intent(in) :: zeta
230 real(kind=
kreal),
intent(out) :: zeta_layer
231 integer(kind=kint),
intent(out) :: ierr
232 integer(kind=kint) :: i
233 real(kind=
kreal) :: sumlyr
238 if( .not.
associated( gauss%pMaterial ) )
then
242 if( ilayer < 1 .or. ilayer > gauss%pMaterial%totallyr )
then
249 sumlyr = sumlyr + 2.0d0*gauss%pMaterial%shell_var(i)%weight
251 zeta_layer = -1.0d0 + sumlyr - gauss%pMaterial%shell_var(ilayer)%weight*(1.0d0-zeta)
256 type(
telement ),
intent(inout) :: element
257 integer(kind=kint) :: i
259 if(
associated( element%shell_layer_gausses ) )
then
260 do i = 1,
size( element%shell_layer_gausses )
263 deallocate( element%shell_layer_gausses )
265 element%shell_nlayer = 0
266 element%shell_nthick = 0
274 gauss2%strain = gauss1%strain
275 gauss2%stress = gauss1%stress
276 gauss2%strain_bak = gauss1%strain_bak
277 gauss2%stress_bak = gauss1%stress_bak
278 gauss2%nqm = gauss1%nqm
279 gauss2%strain_out = gauss1%strain_out
280 gauss2%stress_out = gauss1%stress_out
281 gauss2%plstrain = gauss1%plstrain
282 gauss2%strain_energy = gauss1%strain_energy
283 gauss2%strain_energy_bak = gauss1%strain_energy_bak
284 gauss2%plpotential = gauss1%plpotential
286 if(
associated(gauss1%istatus) .and.
associated(gauss2%istatus) )
then
287 gauss2%istatus = gauss1%istatus
289 if(
associated(gauss1%fstatus) .and.
associated(gauss2%fstatus) )
then
290 gauss2%fstatus = gauss1%fstatus
296 type(
telement ),
intent(in) :: element1
297 type(
telement ),
intent(inout) :: element2
298 integer(kind=kint) :: i
300 if( .not.
associated( element1%shell_layer_gausses ) )
return
301 if( .not.
associated( element2%shell_layer_gausses ) )
return
302 if(
size( element1%shell_layer_gausses ) /=
size( element2%shell_layer_gausses ) )
return
304 do i = 1,
size( element1%shell_layer_gausses )
305 call fstr_copy_gauss( element1%shell_layer_gausses(i), element2%shell_layer_gausses(i) )
This module encapsulate the basic functions of all elements provide by this software.
integer, parameter fe_mitc3_shell361
integer, parameter fe_mitc4_shell
integer, parameter fe_mitc9_shell
integer, parameter fe_mitc4_shell361
integer, parameter fe_mitc3_shell
integer(kind=4), parameter kreal
This module summarizes all information of material properties.
integer function getyieldfunction(mtype)
Get type of yield function.
character(len=dict_key_length) mc_viscoelastic
integer(kind=kint), parameter norton
logical function iskinematicharden(mtype)
If it is a kinematic hardening material?
integer(kind=kint), parameter usermaterial
logical function isviscoelastic(mtype)
If it is an viscoelastic material?
logical function iselastoplastic(mtype)
If it is an elastoplastic material?
This modules defines a structure to record history dependent parameter in static analysis.
integer(kind=kint) function fstr_shell_num_thickness_points(etype)
Number of through-thickness quadrature points used by shell stiffness.
subroutine fstr_shell_layer_zeta(gauss, ilayer, zeta, zeta_layer, ierr)
Map layer-local zeta to the whole shell thickness coordinate.
subroutine fstr_init_gauss(gauss)
Initializer.
subroutine fstr_shell_layer_quadrature_gauss(etype, gauss, ilayer, ithick, zeta_layer, weight, ierr)
Layer-local shell thickness coordinate and quadrature weight from material status.
subroutine fstr_init_shell_layer_gausses(element, ng, nlayer, nthick)
Allocate shell history for every surface Gauss point, layer, and thickness point.
integer(kind=kint) function fstr_shell_layer_gauss_index(element, ig, ilayer, ithick)
Convert surface Gauss/layer/thickness indices to shell_layer_gausses index.
subroutine fstr_finalize_gauss(gauss)
Finializer.
subroutine fstr_shell_thickness_quadrature(etype, ithick, zeta, weight, ierr)
Through-thickness quadrature point and weight used by shell elements.
subroutine fstr_shell_layer_quadrature(element, ilayer, ithick, zeta_layer, weight, ierr)
Layer-local shell thickness coordinate and quadrature weight.
subroutine fstr_finalize_shell_layer_gausses(element)
Release shell layer/thickness history.
subroutine fstr_copy_gauss(gauss1, gauss2)
Copy.
subroutine fstr_copy_shell_layer_gausses(element1, element2)
Copy shell layer/thickness history.
This subroutine read in used-defined material properties tangent.
integer(kind=kint) function, public uelastoplasticnumstatus(matl)
This function returns the number of real state variables.
This module contains Gauss point information.
real(kind=kreal), dimension(2) weight1d2
real(kind=kreal), dimension(1, 2) gauss1d2
real(kind=kreal), dimension(1, 3) gauss1d3
real(kind=kreal), dimension(3) weight1d3
Structure to manage all material related data.
All data should be recorded in every elements.
All data should be recorded in every quadrature points.