ProductsAbaqus/Explicit Component ordering in tensorsThe component ordering depends upon whether the tensor is symmetric or nonsymmetric. Symmetric tensorsFor symmetric tensors such as the stress and strain tensors, there are ndir+nshr components, and the component order is given as a natural permutation of the indices of the tensor. The direct components are first and then the indirect components, beginning with the 12-component. For example, a stress tensor contains ndir direct stress components and nshr shear stress components, which are passed in as
The shear strain components in user subroutine VUMAT are stored as tensor components and not as engineering components; this is different from user subroutine UMAT in Abaqus/Standard, which uses engineering components. Nonsymmetric tensorsFor nonsymmetric tensors there are ndir+2*nshr components, and the component order is given as a natural permutation of the indices of the tensor. The direct components are first and then the indirect components, beginning with the 12-component. For example, the deformation gradient is passed as
Initial calculations and checksIn the data check phase of the analysis Abaqus/Explicit calls user subroutine VUMAT with a set of fictitious strains and a totalTime and stepTime both equal to 0.0. This is done as a check on your constitutive relation and to calculate the equivalent initial material properties, based upon which the initial elastic wave speeds are computed. Defining local orientationsAll stresses, strains, stretches, and state variables are in the orientation of the local material axes. These local material axes form a basis system in which stress and strain components are stored. This represents a corotational coordinate system in which the basis system rotates with the material. If a user-specified coordinate system (Orientations) is used, it defines the local material axes in the undeformed configuration. Special considerations for various element typesThe use of user subroutine VUMAT requires special consideration for various element types. Shell and plane stress elementsYou must define the stresses and internal state variables. In the case of shell or plane stress elements, NDIR=3 and NSHR=1; you must define strainInc(*,3), the thickness strain increment. The internal energies can be defined if desired. If they are not defined, the energy balance provided by Abaqus/Explicit will not be meaningful. Shell elementsWhen VUMAT is used to define the material response of shell elements, Abaqus/Explicit cannot calculate a default value for the transverse shear stiffness of the element. Hence, you must define the element's transverse shear stiffness. See Shell section behavior for guidelines on choosing this stiffness. Beam elementsFor beam elements the stretch tensor and the deformation gradient tensor are not available. For beams in space you must define the thickness strains, strainInc(*,2) and strainInc(*,3). strainInc(*,4) is the shear strain associated with twist. Thickness stresses, stressNew(*,2) and stressNew(*,3), are assumed to be zero, and any values you assign are ignored. Pipe elementsFor pipe elements the stretch tensor and the deformation gradient tensor are not available. The axial strain, strainInc(*,1), and the shear strain, strainInc(*,4), associated with twist are provided along with the hoop stress, stressNew(*,2). The hoop stress is predefined based on your pipe internal and external pressure load definitions (PE, PI, HPE, HPI, PENU, and PINU), and it should not be modified here. The thickness stress, stressNew(*,3), is assumed to be zero and any value you assign is ignored. You must define the axial stress, stressNew(*,1), and the shear stress, stressNew(*,4). You must also define hoop strain, strainInc(*,2), and the pipe thickness strain, strainInc(*,3). Deformation gradientThe polar decomposition of the deformation gradient is written as $\mathbf{F}=\mathbf{R}\cdot \mathbf{U}=\mathbf{V}\cdot \mathbf{R}$, where $\mathbf{U}$ and $\mathbf{V}$ are the right and left symmetric stretch tensors, respectively. The constitutive model is defined in a corotational coordinate system in which the basis system rotates with the material. All stress and strain tensor quantities are defined with respect to the corotational basis system. The right stretch tensor, $\mathbf{U}$, is used. The relative spin tensor $\mathbf{W}-\mathbf{\Omega}$ represents the spin (the antisymmetric part of the velocity gradient) defined with respect to the corotational basis system. Special considerations for hyperelasticityHyperelastic constitutive models in VUMAT should be defined in a corotational coordinate system in which the basis system rotates with the material. This is most effectively accomplished by formulating the hyperelastic constitutive model in terms of the stretch tensor, $\mathbf{U}$, instead of in terms of the deformation gradient, $\mathbf{F}=\mathbf{R}\cdot \mathbf{U}$. Using the deformation gradient can present some difficulties because the deformation gradient includes the rotation tensor and the resulting stresses would need to be rotated back to the corotational basis. Objective stress ratesThe Green-Naghdi stress rate is used when the mechanical behavior of the material is defined using user subroutine VUMAT. The stress rate obtained with user subroutine VUMAT may differ from that obtained with a built-in Abaqus material model. For example, most material models used with solid (continuum) elements in Abaqus/Explicit employ the Jaumann stress rate. This difference in the formulation will cause significant differences in the results only if finite rotation of a material point is accompanied by finite shear. For a discussion of the objective stress rates used in Abaqus, see Stress rates. Material point deletionMaterial points that satisfy a user-defined failure criterion can be deleted from the model (see User-defined mechanical material behavior). You must specify the state variable number controlling the element deletion flag when you allocate space for the solution-dependent state variables, as explained in User-defined mechanical material behavior. The deletion state variable should be set to a value of one or zero in VUMAT. A value of one indicates that the material point is active, while a value of zero indicates that Abaqus/Explicit should delete the material point from the model by setting the stresses to zero. The structure of the block of material points passed to user subroutine VUMAT remains unchanged during the analysis; deleted material points are not removed from the block. Abaqus/Explicit will pass zero stresses and strain increments for all deleted material points. Once a material point has been flagged as deleted, it cannot be reactivated. User subroutine interface subroutine vumat(
C Read only (unmodifiable)variables -
1 nblock, ndir, nshr, nstatev, nfieldv, nprops, lanneal,
2 stepTime, totalTime, dt, cmname, coordMp, charLength,
3 props, density, strainInc, relSpinInc,
4 tempOld, stretchOld, defgradOld, fieldOld,
5 stressOld, stateOld, enerInternOld, enerInelasOld,
6 tempNew, stretchNew, defgradNew, fieldNew,
C Write only (modifiable) variables -
7 stressNew, stateNew, enerInternNew, enerInelasNew )
C
include 'vaba_param.inc'
C
dimension props(nprops), density(nblock), coordMp(nblock,*),
1 charLength(nblock), strainInc(nblock,ndir+nshr),
2 relSpinInc(nblock,nshr), tempOld(nblock),
3 stretchOld(nblock,ndir+nshr),
4 defgradOld(nblock,ndir+nshr+nshr),
5 fieldOld(nblock,nfieldv), stressOld(nblock,ndir+nshr),
6 stateOld(nblock,nstatev), enerInternOld(nblock),
7 enerInelasOld(nblock), tempNew(nblock),
8 stretchNew(nblock,ndir+nshr),
8 defgradNew(nblock,ndir+nshr+nshr),
9 fieldNew(nblock,nfieldv),
1 stressNew(nblock,ndir+nshr), stateNew(nblock,nstatev),
2 enerInternNew(nblock), enerInelasNew(nblock)
C
character*80 cmname
C
do 100 km = 1,nblock
user coding
100 continue
return
end Variables to be defined
Variables that can be updated
Variables passed in for information
Example: Using more than one user-defined material modelTo use more than one user-defined material model, the variable cmname can be tested for different material names inside user subroutine VUMAT, as illustrated below: if (cmname(1:4) .eq. 'MAT1') then call VUMAT_MAT1(argument_list) else if (cmname(1:4) .eq. 'MAT2') then call VUMAT_MAT2(argument_list) end if VUMAT_MAT1 and VUMAT_MAT2 are the actual user material subroutines containing the constitutive material models for each material MAT1 and MAT2, respectively. Subroutine VUMAT merely acts as a directory here. The argument list can be the same as that used in subroutine VUMAT. The material names must be in uppercase characters since cmname is passed in as an uppercase character string. Example: Elastic/plastic material with kinematic hardeningAs a simple example of the coding of subroutine VUMAT, consider the generalized plane strain case for an elastic/plastic material with kinematic hardening. The basic assumptions and definitions of the model are as follows. Let $\mathit{\sigma}$ be the current value of the stress, and define $\mathbf{S}$ to be the deviatoric part of the stress. The center of the yield surface in deviatoric stress space is given by the tensor $\mathit{\alpha}$, which has initial values of zero. The stress difference, $\mathit{\xi}$, is the stress measured from the center of the yield surface and is given by $$\mathit{\xi}=\mathbf{S}-\mathit{\alpha}.$$
The von Mises yield surface is defined as $$f\left(\mathit{\sigma}\right)=\frac{1}{2}\mathit{\xi}:\mathit{\xi}-\frac{1}{3}{\sigma}_{0}^{2},$$
where ${\sigma}_{0}$ is the uniaxial equivalent yield stress. The von Mises yield surface is a cylinder in deviatoric stress space with a radius of $$R=\sqrt{\frac{2}{3}}{\sigma}_{0}.$$
For the kinematic hardening model, R is a constant. The normal to the Mises yield surface can be written as $$\mathbf{Q}=\sqrt{\frac{3}{2}}\frac{\mathit{\xi}}{{\sigma}_{0}}\mathit{}.$$
We decompose the strain rate into an elastic and plastic part using an additive decomposition: $$\dot{\mathit{\u03f5}}={\dot{\mathit{\u03f5}}}^{el}+{\dot{\mathit{\u03f5}}}^{pl}.$$
The plastic part of the strain rate is given by a normality condition $${\dot{\mathit{\u03f5}}}^{pl}=\dot{\gamma}\mathbf{Q},$$
where the scalar multiplier $\dot{\gamma}$ must be determined. A scalar measure of equivalent plastic strain rate is defined by $${\dot{\overline{\u03f5}}}^{pl}=\sqrt{\frac{2}{3}{\dot{\mathit{\u03f5}}}^{pl}:{\dot{\mathit{\u03f5}}}^{pl}}\mathit{}.$$
The stress rate is assumed to be purely due to the elastic part of the strain rate and is expressed in terms of Hooke's law by $$\dot{\mathit{\sigma}}=\lambda \mathrm{trace}\left({\dot{\mathit{\u03f5}}}^{el}\right)\mathbf{I}+2\mu {\dot{\mathit{\u03f5}}}^{el},$$
where $\lambda $ and $2\mu $ are the Lamés constants for the material. The evolution law for $\mathit{\alpha}$ is given as $$\dot{\mathit{\alpha}}=\frac{2}{3}\dot{\gamma}H\mathbf{Q},$$
where H is the slope of the uniaxial yield stress versus plastic strain curve. During active plastic loading the stress must remain on the yield surface, so that $$\sqrt{\mathbf{Q}:\mathbf{Q}}=1.$$
The equivalent plastic strain rate is related to $\dot{\gamma}$ by $${\dot{\overline{\u03f5}}}^{pl}=\sqrt{\frac{2}{3}}\dot{\gamma}.$$
The kinematic hardening constitutive model is integrated in a rate form as follows. A trial elastic stress is computed as $${\mathit{\sigma}}_{new}^{trial}={\mathit{\sigma}}_{old}+\lambda \mathrm{trace}\left(\mathbf{\Delta}\mathit{\u03f5}\right)\mathbf{I}+2\mu \mathbf{\Delta}\mathit{\u03f5},$$
where the subscripts $old$ and $new$ refer to the beginning and end of the increment, respectively. If the trial stress does not exceed the yield stress, the new stress is set equal to the trial stress. If the yield stress is exceeded, plasticity occurs in the increment. We then write the incremental analogs of the rate equations as $${\mathit{\sigma}}_{new}={\mathit{\sigma}}_{new}^{trial}-2\mu \mathbf{\Delta}{\mathit{\u03f5}}^{pl}={\mathit{\sigma}}_{new}^{trial}-2\mu \mathrm{\Delta}\gamma \mathbf{Q},$$
$${\mathit{\alpha}}_{new}={\mathit{\alpha}}_{old}+\frac{2}{3}H\mathrm{\Delta}\gamma \mathbf{Q},$$
$${\overline{\u03f5}}_{new}^{pl}={\overline{\u03f5}}_{old}^{pl}+\sqrt{\frac{2}{3}}\mathrm{\Delta}\gamma ,$$
where $$\mathrm{\Delta}\gamma =\dot{\gamma}\mathrm{\Delta}t.$$
From the definition of the normal to the yield surface at the end of the increment, $\mathbf{Q}$, $${\mathit{\alpha}}_{new}+\sqrt{\frac{2}{3}}{\sigma}_{0}\mathbf{Q}={\mathbf{S}}_{new}.$$
This can be expanded using the incremental equations as $${\mathit{\alpha}}_{old}+\frac{2}{3}H\mathrm{\Delta}\gamma \mathbf{Q}+\sqrt{\frac{2}{3}}{\sigma}_{0}\mathbf{Q}={\mathbf{S}}_{new}^{trial}-\mathrm{\Delta}\gamma 2\mu \mathbf{Q}.$$
Taking the tensor product of this equation with $\mathbf{Q}$, using the yield condition at the end of the increment, and solving for $\mathrm{\Delta}\gamma $: $$\mathrm{\Delta}\gamma =\frac{1}{2\mu \left(1+H/3\mu \right)}({({\mathit{\xi}}_{new}^{trial}:{\mathit{\xi}}_{new}^{trial})}^{1/2}-\sqrt{\frac{2}{3}}{\sigma}_{0}).$$
The value for $\mathrm{\Delta}\gamma $ is used in the incremental equations to determine ${\mathit{\sigma}}_{new}$, ${\mathit{\alpha}}_{new}$, and ${\overline{\u03f5}}_{new}^{pl}$. This algorithm is often referred to as an elastic predictor, radial return algorithm because the correction to the trial stress under the active plastic loading condition returns the stress state to the yield surface along the direction defined by the vector from the center of the yield surface to the elastic trial stress. The subroutine would be coded as follows: subroutine vumat( C Read only - 1 nblock, ndir, nshr, nstatev, nfieldv, nprops, lanneal, 2 stepTime, totalTime, dt, cmname, coordMp, charLength, 3 props, density, strainInc, relSpinInc, 4 tempOld, stretchOld, defgradOld, fieldOld, 3 stressOld, stateOld, enerInternOld, enerInelasOld, 6 tempNew, stretchNew, defgradNew, fieldNew, C Write only - 5 stressNew, stateNew, enerInternNew, enerInelasNew ) C include 'vaba_param.inc' C C J2 Mises Plasticity with kinematic hardening for plane C strain case. C Elastic predictor, radial corrector algorithm. C C The state variables are stored as: C STATE(*,1) = back stress component 11 C STATE(*,2) = back stress component 22 C STATE(*,3) = back stress component 33 C STATE(*,4) = back stress component 12 C STATE(*,5) = equivalent plastic strain C C C All arrays dimensioned by (*) are not used in this algorithm dimension props(nprops), density(nblock), 1 coordMp(nblock,*), 2 charLength(*), strainInc(nblock,ndir+nshr), 3 relSpinInc(*), tempOld(*), 4 stretchOld(*), defgradOld(*), 5 fieldOld(*), stressOld(nblock,ndir+nshr), 6 stateOld(nblock,nstatev), enerInternOld(nblock), 7 enerInelasOld(nblock), tempNew(*), 8 stretchNew(*), defgradNew(*), fieldNew(*), 9 stressNew(nblock,ndir+nshr), stateNew(nblock,nstatev), 1 enerInternNew(nblock), enerInelasNew(nblock) C character*80 cmname C parameter( zero = 0., one = 1., two = 2., three = 3., 1 third = one/three, half = .5, twoThirds = two/three, 2 threeHalfs = 1.5 ) C e = props(1) xnu = props(2) yield = props(3) hard = props(4) C twomu = e / ( one + xnu ) thremu = threeHalfs * twomu sixmu = three * twomu alamda = twomu * ( e - twomu ) / ( sixmu - two * e ) term = one / ( twomu * ( one + hard/thremu ) ) con1 = sqrt( twoThirds ) C do 100 i = 1,nblock C C Trial stress trace = strainInc(i,1) + strainInc(i,2) + strainInc(i,3) sig1 = stressOld(i,1) + alamda*trace + twomu*strainInc(i,1) sig2 = stressOld(i,2) + alamda*trace + twomu*strainInc(i,2) sig3 = stressOld(i,3) + alamda*trace + twomu*strainInc(i,3) sig4 = stressOld(i,4) + twomu*strainInc(i,4) C C Trial stress measured from the back stress s1 = sig1 - stateOld(i,1) s2 = sig2 - stateOld(i,2) s3 = sig3 - stateOld(i,3) s4 = sig4 - stateOld(i,4) C C Deviatoric part of trial stress measured from the back stress smean = third * ( s1 + s2 + s3 ) ds1 = s1 - smean ds2 = s2 - smean ds3 = s3 - smean C C Magnitude of the deviatoric trial stress difference dsmag = sqrt( ds1**2 + ds2**2 + ds3**2 + 2.*s4**2 ) C C Check for yield by determining the factor for plasticity, C zero for elastic, one for yield radius = con1 * yield facyld = zero if( dsmag - radius .ge. zero ) facyld = one C C Add a protective addition factor to prevent a divide by zero C when dsmag is zero. If dsmag is zero, we will not have exceeded C the yield stress and facyld will be zero. dsmag = dsmag + ( one - facyld ) C C Calculated increment in gamma (this explicitly includes the C time step) diff = dsmag - radius dgamma = facyld * term * diff C C Update equivalent plastic strain deqps = con1 * dgamma stateNew(i,5) = stateOld(i,5) + deqps C C Divide dgamma by dsmag so that the deviatoric stresses are C explicitly converted to tensors of unit magnitude in the C following calculations dgamma = dgamma / dsmag C C Update back stress factor = hard * dgamma * twoThirds stateNew(i,1) = stateOld(i,1) + factor * ds1 stateNew(i,2) = stateOld(i,2) + factor * ds2 stateNew(i,3) = stateOld(i,3) + factor * ds3 stateNew(i,4) = stateOld(i,4) + factor * s4 C C Update the stress factor = twomu * dgamma stressNew(i,1) = sig1 - factor * ds1 stressNew(i,2) = sig2 - factor * ds2 stressNew(i,3) = sig3 - factor * ds3 stressNew(i,4) = sig4 - factor * s4 C C Update the specific internal energy - stressPower = half * ( 1 ( stressOld(i,1)+stressNew(i,1) )*strainInc(i,1) 1 + ( stressOld(i,2)+stressNew(i,2) )*strainInc(i,2) 1 + ( stressOld(i,3)+stressNew(i,3) )*strainInc(i,3) 1 + two*( stressOld(i,4)+stressNew(i,4) )*strainInc(i,4) ) C enerInternNew(i) = enerInternOld(i) 1 + stressPower / density(i) C C Update the dissipated inelastic specific energy - plasticWorkInc = dgamma * half * ( 1 ( stressOld(i,1)+stressNew(i,1) )*ds1 1 + ( stressOld(i,2)+stressNew(i,2) )*ds2 1 + ( stressOld(i,3)+stressNew(i,3) )*ds3 1 + two*( stressOld(i,4)+stressNew(i,4) )*s4 ) enerInelasNew(i) = enerInelasOld(i) 1 + plasticWorkInc / density(i) 100 continue C return end |