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
55 gauss%strain=0.d0; gauss%stress=0.d0
56 gauss%strain_bak=0.d0; gauss%stress_bak=0.d0
57 gauss%strain_out=0.d0; gauss%stress_out=0.d0
59 gauss%plpotential =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 )
105 integer(kind=kint),
intent(in) :: etype
112 type(
telement ),
intent(inout) :: element
113 integer(kind=kint),
intent(in) :: ng, nlayer, nthick
114 integer(kind=kint) :: i, nstatus
116 if( ng <= 0 .or. nlayer <= 0 .or. nthick <= 0 )
return
117 if( .not.
associated( element%gausses ) )
return
118 if(
associated( element%shell_layer_gausses ) )
return
120 nstatus = ng*nlayer*nthick
121 allocate( element%shell_layer_gausses( nstatus ) )
122 element%shell_nlayer = nlayer
123 element%shell_nthick = nthick
126 element%shell_layer_gausses(i)%pMaterial => element%gausses(1)%pMaterial
133 type(
telement ),
intent(in) :: element
134 integer(kind=kint),
intent(in) :: ig, ilayer, ithick
135 integer(kind=kint) :: ngauss
138 if( .not.
associated( element%gausses ) )
return
139 if( .not.
associated( element%shell_layer_gausses ) )
return
140 if( element%shell_nlayer <= 0 .or. element%shell_nthick <= 0 )
return
141 if( ilayer < 1 .or. ilayer > element%shell_nlayer )
return
142 if( ithick < 1 .or. ithick > element%shell_nthick )
return
144 ngauss =
size( element%gausses )
145 if( ig < 1 .or. ig > ngauss )
return
146 if(
size( element%shell_layer_gausses ) < ngauss*element%shell_nlayer*element%shell_nthick )
return
149 *element%shell_nthick + ithick
154 integer(kind=kint),
intent(in) :: etype, ithick
155 real(kind=
kreal),
intent(out) :: zeta, weight
156 integer(kind=kint),
intent(out) :: ierr
173 type(
telement ),
intent(in) :: element
174 integer(kind=kint),
intent(in) :: ilayer, ithick
175 real(kind=
kreal),
intent(out) :: zeta_layer, weight
176 integer(kind=kint),
intent(out) :: ierr
182 if( .not.
associated( element%gausses ) )
then
188 zeta_layer, weight, ierr )
193 integer(kind=kint),
intent(in) :: etype, ilayer, ithick
195 real(kind=
kreal),
intent(out) :: zeta_layer, weight
196 integer(kind=kint),
intent(out) :: ierr
197 real(kind=
kreal) :: zeta
204 if( ierr /= 0 )
return
211 integer(kind=kint),
intent(in) :: ilayer
212 real(kind=
kreal),
intent(in) :: zeta
213 real(kind=
kreal),
intent(out) :: zeta_layer
214 integer(kind=kint),
intent(out) :: ierr
215 integer(kind=kint) :: i
216 real(kind=
kreal) :: sumlyr
221 if( .not.
associated( gauss%pMaterial ) )
then
225 if( ilayer < 1 .or. ilayer > gauss%pMaterial%totallyr )
then
232 sumlyr = sumlyr + 2.0d0*gauss%pMaterial%shell_var(i)%weight
234 zeta_layer = -1.0d0 + sumlyr - gauss%pMaterial%shell_var(ilayer)%weight*(1.0d0-zeta)
239 type(
telement ),
intent(inout) :: element
240 integer(kind=kint) :: i
242 if(
associated( element%shell_layer_gausses ) )
then
243 do i = 1,
size( element%shell_layer_gausses )
246 deallocate( element%shell_layer_gausses )
248 element%shell_nlayer = 0
249 element%shell_nthick = 0
257 gauss2%strain = gauss1%strain
258 gauss2%stress = gauss1%stress
259 gauss2%strain_bak = gauss1%strain_bak
260 gauss2%stress_bak = gauss1%stress_bak
261 gauss2%nqm = gauss1%nqm
262 gauss2%strain_out = gauss1%strain_out
263 gauss2%stress_out = gauss1%stress_out
264 gauss2%plstrain = gauss1%plstrain
265 gauss2%strain_energy = gauss1%strain_energy
266 gauss2%strain_energy_bak = gauss1%strain_energy_bak
267 gauss2%plpotential = gauss1%plpotential
269 if(
associated(gauss1%istatus) .and.
associated(gauss2%istatus) )
then
270 gauss2%istatus = gauss1%istatus
272 if(
associated(gauss1%fstatus) .and.
associated(gauss2%fstatus) )
then
273 gauss2%fstatus = gauss1%fstatus
279 type(
telement ),
intent(in) :: element1
280 type(
telement ),
intent(inout) :: element2
281 integer(kind=kint) :: i
283 if( .not.
associated( element1%shell_layer_gausses ) )
return
284 if( .not.
associated( element2%shell_layer_gausses ) )
return
285 if(
size( element1%shell_layer_gausses ) /=
size( element2%shell_layer_gausses ) )
return
287 do i = 1,
size( element1%shell_layer_gausses )
288 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.
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(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)
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.
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.
Structure to manage all material related data.
All data should be recorded in every elements.
All data should be recorded in every quadrature points.