ProductsAbaqus/Standard Enumeration of invariantsTo facilitate coding and provide easy access to the array of invariants passed to user subroutine UANISOHYPER_INV, an enumerated representation of each invariant is introduced. Any scalar invariant can, therefore, be represented uniquely by an enumerated invariant, , where the subscript n denotes the order of the invariant according to the enumeration scheme in the following table:
For example, in the case of three families of fibers there are a total of 15 invariants: , , , six invariants of type , and six invariants of type , with . The following correspondence exists between each of these invariants and their enumerated counterpart:
A similar scheme is used for the array ZETA of terms . Each term can be represented uniquely by an enumerated counterpart , as shown below:
As an example, for the case of three families of fibers there are three terms: , , and . These are stored in the ZETA array as . Storage of arrays of derivatives of the energy functionThe components of the array UI1 of first derivatives of the strain energy potential with respect to the scalar invariants, , are stored using the enumeration scheme discussed above for the scalar invariants. The elements of the array UI2 of second derivatives of the strain energy function, , are laid out in memory using triangular storage: if denotes the component in this array corresponding to the term , then . For example, the term is stored in component in the UI2 array. Special considerations for various element typesThere are several special considerations that need to be noted. Shells that calculate transverse shear energyWhen UANISOHYPER_INV 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_INV 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_INV (AINV, UA, ZETA, NFIBERS, NINV,
1 UI1, UI2, UI3, TEMP, NOEL, CMNAME, INCMPFLAG, IHYBFLAG,
2 NUMSTATEV, STATEV, NUMFIELDV, FIELDV, FIELDVINC,
3 NUMPROPS, PROPS)
C
INCLUDE 'ABA_PARAM.INC'
C
CHARACTER*80 CMNAME
DIMENSION AINV(NINV), UA(2),
2 ZETA(NFIBERS*(NFIBERS-1)/2)), UI1(NINV),
3 UI2(NINV*(NINV+1)/2), UI3(NINV*(NINV+1)/2),
4 STATEV(NUMSTATEV), FIELDV(NUMFIELDV),
5 FIELDVINC(NUMFIELDV), PROPS(NUMPROPS)
user coding to define UA,UI1,UI2,UI3,STATEV
RETURN
END
Variables to be defined
Variables passed in for information
Example: Anisotropic hyperelastic model of Kaliske and SchmidtAs an example of the coding of user subroutine UANISOHYPER_INV, consider the model proposed by Kaliske and Schmidt (2005) for nonlinear anisotropic elasticity with two families of fibers. The strain energy function is given by a polynomial series expansion in the form The code in user subroutine UANISOHYPER_INV must return the derivatives of the strain energy function with respect to the scalar invariants, which are readily computed from the above expression. In this example auxiliary functions are used to facilitate enumeration of pseudo-invariants of type and , as well as for indexing into the array of second derivatives using symmetric storage. The user subroutine would be coded as follows: subroutine uanisohyper_inv (aInv, ua, zeta, nFibers, nInv, * ui1, ui2, ui3, temp, noel, * cmname, incmpFlag, ihybFlag, * numStatev, statev, * numFieldv, fieldv, fieldvInc, * numProps, props) C include 'aba_param.inc' C character *80 cmname dimension aInv(nInv), ua(2), zeta(nFibers*(nFibers-1)/2) dimension ui1(nInv), ui2(nInv*(nInv+1)/2) dimension ui3(nInv*(nInv+1)/2), statev(numStatev) dimension fieldv(numFieldv), fieldvInc(numFieldv) dimension props(numProps) C parameter ( zero = 0.d0, * one = 1.d0, * two = 2.d0, * three = 3.d0, * four = 4.d0, * five = 5.d0, * six = 6.d0 ) C C Kaliske-Schmidtt energy function (3D) C C Read material properties d=props(1) dInv = one / d a1=props(2) a2=props(3) a3=props(4) b1=props(5) b2=props(6) b3=props(7) c2=props(8) c3=props(9) c4=props(10) c5=props(11) c6=props(12) d2=props(13) d3=props(14) d4=props(15) d5=props(16) d6=props(17) e2=props(18) e3=props(19) e4=props(20) e5=props(21) e6=props(22) f2=props(23) f3=props(24) f4=props(25) f5=props(26) f6=props(27) g2=props(28) g3=props(29) g4=props(30) g5=props(31) g6=props(32) C C Compute Udev and 1st and 2nd derivatives w.r.t invariants C - I1 bi1 = aInv(1) term = bi1-three ua(2) = a1*term + a2*term**2 + a3*term**3 ui1(1) = a1 + two*a2*term + three*a3*term**2 ui2(indx(1,1)) = two*a2 + three*two*a3*term C - I2 bi2 = aInv(2) term = bi2-three ua(2) = ua(2) + b1*term + b2*term**2 + b3*term**3 ui1(2) = b1 + two*b2*term + three*b3*term**2 ui2(indx(2,2)) = two*b2 + three*two*b3*term C - I3 (=J) bi3 = aInv(3) term = bi3-one ui1(3) = two*dInv*term ui2(indx(3,3)) = two*dInv C - I4(11) nI411 = indxInv4(1,1) bi411 = aInv(nI411) term = bi411-one ua(2) = ua(2) * + c2*term**2 + c3*term**3 + c4*term**4 * + c5*term**5 + c6*term**6 ui1(nI411) = * two*c2*term * + three*c3*term**2 * + four*c4*term**3 * + five*c5*term**4 * + six*c6*term**5 ui2(indx(nI411,nI411)) = * two*c2 * + three*two*c3*term * + four*three*c4*term**2 * + five*four*c5*term**3 * + six*five*c6*term**4 C - I5(11) nI511 = indxInv5(1,1) bi511 = aInv(nI511) term = bi511-one ua(2) = ua(2) * + d2*term**2 + d3*term**3 + d4*term**4 * + d5*term**5 + d6*term**6 ui1(nI511) = * two*d2*term * + three*d3*term**2 * + four*d4*term**3 * + five*d5*term**4 * + six*d6*term**5 ui2(indx(nI511,nI511)) = * two*d2 * + three*two*d3*term * + four*three*d4*term**2 * + five*four*d5*term**3 * + six*five*d6*term**4 C - I4(22) nI422 = indxInv4(2,2) bi422 = aInv(nI422) term = bi422-one ua(2) = ua(2) * + e2*term**2 + e3*term**3 + e4*term**4 * + e5*term**5 + e6*term**6 ui1(nI422) = * two*e2*term * + three*e3*term**2 * + four*e4*term**3 * + five*e5*term**4 * + six*e6*term**5 ui2(indx(nI422,nI422)) = * two*e2 * + three*two*e3*term * + four*three*e4*term**2 * + five*four*e5*term**3 * + six*five*e6*term**4 C - I5(22) nI522 = indxInv5(2,2) bi522 = aInv(nI522) term = bi522-one ua(2) = ua(2) * + f2*term**2 + f3*term**3 + f4*term**4 * + f5*term**5 + f6*term**6 ui1(nI522) = * two*f2*term * + three*f3*term**2 * + four*f4*term**3 * + five*f5*term**4 * + six*f6*term**5 ui2(indx(nI522,nI522)) = * two*f2 * + three*two*f3*term * + four*three*f4*term**2 * + five*four*f5*term**3 * + six*five*f6*term**4 C - I4(12) nI412 = indxInv4(1,2) bi412 = aInv(nI412) term = zeta(1)*(bi412-zeta(1)) ua(2) = ua(2) * + g2*term**2 + g3*term**3 * + g4*term**4 + g5*term**5 * + g6*term**6 ui1(nI412) = zeta(1) * ( * two*g2*term * + three*g3*term**2 * + four*g4*term**3 * + five*g5*term**4 * + six*g6*term**5 ) ui2(indx(nI412,nI412)) = zeta(1)**2 * ( * two*g2 * + three*two*g3*term * + four*three*g4*term**2 * + five*four*g5*term**3 * + six*five*g6*term**4 ) C C Add volumetric energy C term = aInv(3) - one ua(1) = ua(2) + dInv*term*term C return end C C Maps index from Square to Triangular storage of symmetric C matrix C integer function indx( i, j ) C include 'aba_param.inc' C ii = min(i,j) jj = max(i,j) C indx = ii + jj*(jj-1)/2 C return end C C C Generate enumeration of Anisotropic Pseudo Invariants of C type 4 C integer function indxInv4( i, j ) C include 'aba_param.inc' C ii = min(i,j) jj = max(i,j) C indxInv4 = 4 + jj*(jj-1) + 2*(ii-1) C return end C C C Generate enumeration of Anisotropic Pseudo Invariants of C type 5 C integer function indxInv5( i, j ) C include 'aba_param.inc' C ii = min(i,j) jj = max(i,j) C indxInv5 = 5 + jj*(jj-1) + 2*(ii-1) C return end Additional reference
|