ProductsAbaqus/Standard Storage of strain componentsIn the array of modified Green strain, EBAR, direct components are stored first, followed by shear components. There are NDI direct and NSHR tensor shear components. The order of the components is defined in Conventions. Since the number of active stress and strain components varies between element types, the routine must be coded to provide for all element types with which it will be used. Storage of arrays of derivatives of the energy functionThe array of first derivatives of the strain energy function, DU1, contains NTENS+1 components, with NTENS=NDI+NSHR. The first NTENS components correspond to the derivatives with respect to each component of the modified Green strain, . The last component contains the derivative with respect to the volume ratio, . The array of second derivatives of the strain energy function, DU2, contains (NTENS+1)*(NTENS+2)/2 components. These components are ordered using the following triangular storage scheme:
Finally, the array of third derivatives of the strain energy function, DU3, also contains (NTENS+1)*(NTENS+2)/2 components, each representing the derivative with respect to of the corresponding component of DU2. It follows the same triangular storage scheme as DU2. Special considerations for various element typesThere are several special considerations that need to be noted. Shells that calculate transverse shear energyWhen UANISOHYPER_STRAIN is used to define the material response of shell elements that calculate transverse shear energy, Abaqus/Standard 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. Elements with hourglassing modesWhen UANISOHYPER_STRAIN is used to define the material response of elements with hourglassing modes, you must define the hourglass stiffness for hourglass control based on the total stiffness approach. The hourglass stiffness is not required for enhanced hourglass control, but you can define a scaling factor for the stiffness associated with the drill degree of freedom (rotation about the surface normal). See Section controls. User subroutine interface SUBROUTINE UANISOHYPER_STRAIN (EBAR, AJ, UA, DU1, DU2, DU3,
1 TEMP, NOEL, CMNAME, INCMPFLAG, IHYBFLAG, NDI, NSHR, NTENS,
2 NUMSTATEV, STATEV, NUMFIELDV, FIELDV, FIELDVINC,
3 NUMPROPS, PROPS)
C
INCLUDE 'ABA_PARAM.INC'
C
CHARACTER*80 CMNAME
C
DIMENSION EBAR(NTENS), UA(2), DU1(NTENS+1),
2 DU2((NTENS+1)*(NTENS+2)/2),
3 DU3((NTENS+1)*(NTENS+2)/2),
4 STATEV(NUMSTATEV), FIELDV(NUMFIELDV),
5 FIELDVINC(NUMFIELDV), PROPS(NUMPROPS)
user coding to define UA,DU1,DU2,DU3,STATEV
RETURN
END Variables to be defined
Variables passed in for information
Example: Orthotropic Saint-Venant Kirchhoff modelAs a simple example of the coding of user subroutine UANISOHYPER_STRAIN, consider the generalization to anisotropic hyperelasticity of the Saint-Venant Kirchhoff model. The strain energy function of the Saint-Venant Kirchhoff model can be expressed as a quadratic function of the Green strain tensor, , as where is the fourth-order elasticity tensor. The derivatives of the strain energy function with respect to the Green strain are given as However, user subroutine UANISOHYPER_STRAIN must return the derivatives of the strain energy function with respect to the modified Green strain tensor, , and the volume ratio, J, which can be accomplished easily using the following relationship between , , and : where is the second-order identity tensor. Thus, using the chain rule we find where and In this example an auxiliary function is used to facilitate indexing into a fourth-order symmetric tensor. The user subroutine would be coded as follows: subroutine uanisohyper_strain ( * ebar, aj, ua, du1, du2, du3, temp, noel, cmname, * incmpFlag, ihybFlag, ndi, nshr, ntens, * numStatev, statev, numFieldv, fieldv, fieldvInc, * numProps, props) c include 'aba_param.inc' c dimension ebar(ntens), ua(2), du1(ntens+1) dimension du2((ntens+1)*(ntens+2)/2) dimension du3((ntens+1)*(ntens+2)/2) dimension statev(numStatev), fieldv(numFieldv) dimension fieldvInc(numFieldv), props(numProps) c character*80 cmname c parameter ( half = 0.5d0, $ one = 1.d0, $ two = 2.d0, $ third = 1.d0/3.d0, $ twothds = 2.d0/3.d0, $ four = 4.d0 ) * * Orthotropic Saint-Venant Kirchhoff strain energy function (3D) * D1111=props(1) D1122=props(2) D2222=props(3) D1133=props(4) D2233=props(5) D3333=props(6) D1212=props(7) D1313=props(8) D2323=props(9) * d2UdE11dE11 = D1111 d2UdE11dE22 = D1122 d2UdE11dE33 = D1133 * d2UdE22dE11 = d2UdE11dE22 d2UdE22dE22 = D2222 d2UdE22dE33 = D2233 * d2UdE33dE11 = d2UdE11dE33 d2UdE33dE22 = d2UdE22dE33 d2UdE33dE33 = D3333 * d2UdE12dE12 = D1212 * d2UdE13dE13 = D1313 * d2UdE23dE23 = D2323 * xpow = exp ( log(aj) * twothds ) detuInv = one / aj * E11 = xpow * ebar(1) + half * ( xpow - one ) E22 = xpow * ebar(2) + half * ( xpow - one ) E33 = xpow * ebar(3) + half * ( xpow - one ) E12 = xpow * ebar(4) E13 = xpow * ebar(5) E23 = xpow * ebar(6) * term1 = twothds * detuInv dE11Dj = term1 * ( E11 + half ) dE22Dj = term1 * ( E22 + half ) dE33Dj = term1 * ( E33 + half ) dE12Dj = term1 * E12 dE13Dj = term1 * E13 dE23Dj = term1 * E23 term2 = - third * detuInv d2E11DjDj = term2 * dE11Dj d2E22DjDj = term2 * dE22Dj d2E33DjDj = term2 * dE33Dj d2E12DjDj = term2 * dE12Dj d2E13DjDj = term2 * dE13Dj d2E23DjDj = term2 * dE23Dj * dUdE11 = d2UdE11dE11 * E11 * + d2UdE11dE22 * E22 * + d2UdE11dE33 * E33 dUdE22 = d2UdE22dE11 * E11 * + d2UdE22dE22 * E22 * + d2UdE22dE33 * E33 dUdE33 = d2UdE33dE11 * E11 * + d2UdE33dE22 * E22 * + d2UdE33dE33 * E33 dUdE12 = two * d2UdE12dE12 * E12 dUdE13 = two * d2UdE13dE13 * E13 dUdE23 = two * d2UdE23dE23 * E23 * U = half * ( E11*dUdE11 + E22*dUdE22 + E33*dUdE33 ) * + E12*dUdE12 + E13*dUdE13 + E23*dUdE23 * ua(2) = U ua(1) = ua(2) * du1(1) = xpow * dUdE11 du1(2) = xpow * dUdE22 du1(3) = xpow * dUdE33 du1(4) = xpow * dUdE12 du1(5) = xpow * dUdE13 du1(6) = xpow * dUdE23 du1(7) = dUdE11*dE11Dj + dUdE22*dE22Dj + dUdE33*dE33Dj * + two * ( dUdE12*dE12Dj * +dUdE13*dE13Dj * +dUdE23*dE23Dj ) * xpow2 = xpow * xpow * du2(indx(1,1)) = xpow2 * d2UdE11dE11 du2(indx(1,2)) = xpow2 * d2UdE11dE22 du2(indx(2,2)) = xpow2 * d2UdE22dE22 du2(indx(1,3)) = xpow2 * d2UdE11dE33 du2(indx(2,3)) = xpow2 * d2UdE22dE33 du2(indx(3,3)) = xpow2 * d2UdE33dE33 du2(indx(1,4)) = zero du2(indx(2,4)) = zero du2(indx(3,4)) = zero du2(indx(4,4)) = xpow2 * d2UdE12dE12 du2(indx(1,5)) = zero du2(indx(2,5)) = zero du2(indx(3,5)) = zero du2(indx(4,5)) = zero du2(indx(5,5)) = xpow2 * d2UdE13dE13 du2(indx(1,6)) = zero du2(indx(2,6)) = zero du2(indx(3,6)) = zero du2(indx(4,6)) = zero du2(indx(5,6)) = zero du2(indx(6,6)) = xpow2 * d2UdE23dE23 * du2(indx(1,7)) = xpow * ( term1 * dUdE11 * + d2UdE11dE11 * dE11Dj * + d2UdE11dE22 * dE22Dj * + d2UdE11dE33 * dE33Dj ) du2(indx(2,7)) = xpow * ( term1 * dUdE22 * + d2UdE22dE11 * dE11Dj * + d2UdE22dE22 * dE22Dj * + d2UdE22dE33 * dE33Dj ) du2(indx(3,7)) = xpow * ( term1 * dUdE33 * + d2UdE33dE11 * dE11Dj * + d2UdE33dE22 * dE22Dj * + d2UdE33dE33 * dE33Dj ) du2(indx(4,7)) = xpow * ( term1 * dUdE12 * + two * d2UdE12dE12 * dE12Dj ) du2(indx(5,7)) = xpow * ( term1 * dUdE13 * + two * d2UdE13dE13 * dE23Dj ) du2(indx(6,7)) = xpow * ( term1 * dUdE23 * + two * d2UdE23dE23 * dE13Dj ) du2(indx(7,7))= dUdE11*d2E11DjDj * +dUdE22*d2E22DjDj * +dUdE33*d2E33DjDj * + two*( dUdE12*d2E12DjDj * +dUdE13*d2E13DjDj * +dUdE23*d2E23DjDj) * + d2UdE11dE11 * dE11Dj * dE11Dj * + d2UdE22dE22 * dE22Dj * dE22Dj * + d2UdE33dE33 * dE33Dj * dE33Dj * + two * ( d2UdE11dE22 * dE11Dj * dE22Dj * +d2UdE11dE33 * dE11Dj * dE33Dj * +d2UdE22dE33 * dE22Dj * dE33Dj ) * + four * ( d2UdE12dE12 * dE12Dj * dE12Dj * +d2UdE13dE13 * dE13Dj * dE13Dj * +d2UdE23dE23 * dE23Dj * dE23Dj ) * return end * * Maps index from Square to Triangular storage * of symmetric matrix * integer function indx( i, j ) * include 'aba_param.inc' * ii = min(i,j) jj = max(i,j) * indx = ii + jj*(jj-1)/2 * return end |