19 integer,
pointer :: istatus(:) =>null()
20 real(kind=
kreal),
pointer :: fstatus(:) => null()
22 real(kind=
kreal) :: strain_bak(6)
23 real(kind=
kreal) :: stress_bak(6)
25 real(kind=
kreal) :: strain_out(6)
26 real(kind=
kreal) :: stress_out(6)
27 real(kind=
kreal) :: strain_energy
28 real(kind=
kreal) :: strain_energy_bak
37 real(kind=
kreal),
pointer :: equiforces(:) => null()
40 integer(kind=kint) :: shell_nlayer = 0
41 integer(kind=kint) :: shell_nthick = 0
42 real(kind=
kreal),
pointer :: aux(:,:) => null()
43 integer :: elemact_flag
44 real(kind=
kreal) :: elemact_coeff
52 type(
telement),
intent(in) :: element
55 if(
associated(element%shell_layer_gausses) )
then
56 npoint =
size(element%shell_layer_gausses)
59 select case(element%etype)
61 if( .not.
associated(element%gausses) )
return
62 if( element%gausses(1)%pMaterial%nlgeom_flag /=
infinitesimal )
return
63 if( .not.
iselastic(element%gausses(1)%pMaterial%mtype) )
return
64 npoint =
size(element%gausses)*element%gausses(1)%pMaterial%totallyr &
72 integer(kind=kint),
intent(in) :: etype
73 integer(kind=kint),
intent(in) :: nn
83 if( abs(material%variables(
m_plconst2)) > tiny(1.0d0) )
return
92 gauss%strain=0.d0; gauss%stress=0.d0
93 gauss%strain_bak=0.d0; gauss%stress_bak=0.d0
94 gauss%strain_out=0.d0; gauss%stress_out=0.d0
96 gauss%plpotential =0.d0
98 gauss%strain_energy =0.d0
99 gauss%strain_energy_bak =0.d0
101 if( gauss%pMaterial%nfstatus> 0 )
then
102 allocate( gauss%fstatus(gauss%pMaterial%nfstatus) )
103 gauss%fstatus(:) = 0.d0
106 allocate( gauss%istatus(1) )
109 if( n>0 )
allocate( gauss%fstatus(n) )
112 allocate( gauss%fstatus(7+6) )
114 allocate( gauss%fstatus(2) )
122 allocate( gauss%fstatus(12*n+6) )
125 stop
"Viscoelastic properties not defined"
127 else if( gauss%pMaterial%mtype==
norton )
then
128 allocate( gauss%fstatus(2) )
130 gauss%plstrain = 0.d0
137 if(
associated( gauss%istatus ) )
deallocate( gauss%istatus )
138 if(
associated( gauss%fstatus ) )
deallocate( gauss%fstatus )
144 integer(kind=kint),
intent(in) :: etype
151 type(
telement ),
intent(inout) :: element
152 integer(kind=kint),
intent(in) :: ng, nlayer, nthick
153 integer(kind=kint) :: i, nstatus
155 if( ng <= 0 .or. nlayer <= 0 .or. nthick <= 0 )
return
156 if( .not.
associated( element%gausses ) )
return
157 if(
associated( element%shell_layer_gausses ) )
return
159 nstatus = ng*nlayer*nthick
160 allocate( element%shell_layer_gausses( nstatus ) )
161 element%shell_nlayer = nlayer
162 element%shell_nthick = nthick
165 element%shell_layer_gausses(i)%pMaterial => element%gausses(1)%pMaterial
172 type(
telement ),
intent(in) :: element
173 integer(kind=kint),
intent(in) :: ig, ilayer, ithick
174 integer(kind=kint) :: ngauss
177 if( .not.
associated( element%gausses ) )
return
178 if( .not.
associated( element%shell_layer_gausses ) )
return
179 if( element%shell_nlayer <= 0 .or. element%shell_nthick <= 0 )
return
180 if( ilayer < 1 .or. ilayer > element%shell_nlayer )
return
181 if( ithick < 1 .or. ithick > element%shell_nthick )
return
183 ngauss =
size( element%gausses )
184 if( ig < 1 .or. ig > ngauss )
return
185 if(
size( element%shell_layer_gausses ) < ngauss*element%shell_nlayer*element%shell_nthick )
return
188 *element%shell_nthick + ithick
194 type(
telement ),
intent(in) :: element
195 integer(kind=kint) :: i, ig, ilayer, ithick, ishell
196 real(kind=
kreal) :: weight, total_weight
199 if(
associated(element%shell_layer_gausses) )
then
200 if( .not.
associated(element%gausses) )
return
201 if( element%shell_nlayer <= 0 .or. element%shell_nthick <= 0 )
return
202 if(
size(element%gausses) <= 0 )
return
203 if( .not.
associated(element%gausses(1)%pMaterial) )
return
204 if( .not.
associated(element%gausses(1)%pMaterial%shell_var) )
return
205 if( element%shell_nlayer >
size(element%gausses(1)%pMaterial%shell_var) )
return
207 do ig = 1,
size(element%gausses)
208 do ilayer = 1, element%shell_nlayer
209 weight = element%gausses(1)%pMaterial%shell_var(ilayer)%weight
210 do ithick = 1, element%shell_nthick
212 if( ishell <= 0 ) cycle
214 + element%shell_layer_gausses(ishell)%plstrain * weight
215 total_weight = total_weight + weight
220 else if(
associated(element%gausses) )
then
221 if(
size(element%gausses) <= 0 )
return
222 do i = 1,
size(element%gausses)
231 integer(kind=kint),
intent(in) :: etype, ithick
232 real(kind=
kreal),
intent(out) :: zeta, weight
233 integer(kind=kint),
intent(out) :: ierr
250 type(
telement ),
intent(in) :: element
251 integer(kind=kint),
intent(in) :: ilayer, ithick
252 real(kind=
kreal),
intent(out) :: zeta_layer, weight
253 integer(kind=kint),
intent(out) :: ierr
259 if( .not.
associated( element%gausses ) )
then
265 zeta_layer, weight, ierr )
270 integer(kind=kint),
intent(in) :: etype, ilayer, ithick
272 real(kind=
kreal),
intent(out) :: zeta_layer, weight
273 integer(kind=kint),
intent(out) :: ierr
274 real(kind=
kreal) :: zeta
281 if( ierr /= 0 )
return
288 integer(kind=kint),
intent(in) :: ilayer
289 real(kind=
kreal),
intent(in) :: zeta
290 real(kind=
kreal),
intent(out) :: zeta_layer
291 integer(kind=kint),
intent(out) :: ierr
292 integer(kind=kint) :: i
293 real(kind=
kreal) :: sumlyr
298 if( .not.
associated( gauss%pMaterial ) )
then
302 if( ilayer < 1 .or. ilayer > gauss%pMaterial%totallyr )
then
309 sumlyr = sumlyr + 2.0d0*gauss%pMaterial%shell_var(i)%weight
311 zeta_layer = -1.0d0 + sumlyr - gauss%pMaterial%shell_var(ilayer)%weight*(1.0d0-zeta)
316 type(
telement ),
intent(inout) :: element
317 integer(kind=kint) :: i
319 if(
associated( element%shell_layer_gausses ) )
then
320 do i = 1,
size( element%shell_layer_gausses )
323 deallocate( element%shell_layer_gausses )
325 element%shell_nlayer = 0
326 element%shell_nthick = 0
334 gauss2%strain = gauss1%strain
335 gauss2%stress = gauss1%stress
336 gauss2%strain_bak = gauss1%strain_bak
337 gauss2%stress_bak = gauss1%stress_bak
338 gauss2%nqm = gauss1%nqm
339 gauss2%strain_out = gauss1%strain_out
340 gauss2%stress_out = gauss1%stress_out
341 gauss2%plstrain = gauss1%plstrain
342 gauss2%strain_energy = gauss1%strain_energy
343 gauss2%strain_energy_bak = gauss1%strain_energy_bak
344 gauss2%plpotential = gauss1%plpotential
346 if(
associated(gauss1%istatus) .and.
associated(gauss2%istatus) )
then
347 gauss2%istatus = gauss1%istatus
349 if(
associated(gauss1%fstatus) .and.
associated(gauss2%fstatus) )
then
350 gauss2%fstatus = gauss1%fstatus
356 type(
telement ),
intent(in) :: element1
357 type(
telement ),
intent(inout) :: element2
358 integer(kind=kint) :: i
360 if( .not.
associated( element1%shell_layer_gausses ) )
return
361 if( .not.
associated( element2%shell_layer_gausses ) )
return
362 if(
size( element1%shell_layer_gausses ) /=
size( element2%shell_layer_gausses ) )
return
364 do i = 1,
size( element1%shell_layer_gausses )
365 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.
subroutine getshellthicknessquadpoint(etype, np, zeta)
Fetch the through-thickness quadrature coordinate of a shell element.
integer function numofshellthicknessquadpoints(etype)
Obtains the number of through-thickness quadrature points of a shell element.
integer, parameter fe_mitc4_shell
integer, parameter fe_mitc9_shell
integer, parameter fe_mitc3_shell
real(kind=kreal) function getshellthicknessweight(etype, np)
Fetch the through-thickness quadrature weight of a shell element.
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 function getelastictype(mtype)
Get elastic type.
integer function gethardentype(mtype)
Get type of hardening.
integer(kind=kint), parameter m_plconst2
integer(kind=kint), parameter norton
integer(kind=kint), parameter infinitesimal
logical function iskinematicharden(mtype)
If it is a kinematic hardening material?
integer(kind=kint), parameter usermaterial
logical function iselastic(mtype)
If it is an elastic material?
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)
Compatibility accessor for shell history allocation. The quadrature rule itself is defined in element...
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.
logical function fstr_uses_plane_stress_j2_shell(etype, nn, material)
Return whether the element and material are supported by the plane-stress J2 shell path.
integer(kind=kint) function fstr_shell_output_point_count(element)
Number of shell thickness-point tensors available for result output.
subroutine fstr_copy_gauss(gauss1, gauss2)
Copy.
subroutine fstr_copy_shell_layer_gausses(element1, element2)
Copy shell layer/thickness history.
real(kind=kreal) function fstr_element_average_plstrain(element)
Average equivalent plastic strain over the active quadrature history. Average shell history points eq...
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.
Structure to manage all material related data.
All data should be recorded in every elements.
All data should be recorded in every quadrature points.