ProductsAbaqus/Explicit User subroutine interfaceSUBROUTINE VUEL(nblock,rhs,amass,dtimeStable,svars,nsvars, 1 energy, 2 nnode,ndofel,props,nprops,jprops,njprops, 3 coords,mcrd,u,du,v,a, 4 jtype,jElem, 5 time,period,dtimeCur,dtimePrev,kstep,kinc, 6 lflags, 7 dMassScaleFactor, 8 predef,npredef, 9 jdltyp, adlmag) C include 'vaba_param.inc' C operational code keys parameter ( jMassCalc = 1, * jIntForceAndDtStable = 2, * jExternForce = 3) C flag indices parameter (iProcedure = 1, * iNlgeom = 2, * iOpCode = 3, * nFlags = 3) C energy array indices parameter ( iElPd = 1, * iElCd = 2, * iElIe = 3, * iElTs = 4, * iElDd = 5, * iElBv = 6, * iElDe = 7, * iElHe = 8, * iElKe = 9, * iElTh = 10, * iElDmd = 11, * iElDc = 12, * nElEnergy = 12) C predefined variables indices parameter ( iPredValueNew = 1, * iPredValueOld = 2, * nPred = 2) C time indices parameter (iStepTime = 1, * iTotalTime = 2, * nTime = 2) dimension rhs(nblock,ndofel),amass(nblock,ndofel,ndofel), 1 dtimeStable(nblock), 2 svars(nblock,nsvars),energy(nblock,nElEnergy), 3 props(nprops),jprops(njprops), 4 jElem(nblock),time(nTime),lflags(nFlags), 5 coords(nblock,nnode,mcrd), 6 u(nblock,ndofel), du(nblock,ndofel), 7 v(nblock,ndofel), a(nblock, ndofel), 8 dMassScaleFactor(nblock), 9 predef(nblock,nnode,npredef,nPred), * adlmag(nblock) do kblock = 1,nblock user coding to define rhs, amass, dtimeStable, svars and energy end do RETURN END Variables to be definedSome of the following arrays depend on the value of the lflags array.
Variables passed in for information
VUEL conventionsThe solution variables (displacement, velocity, etc.) are arranged on a node/degree of freedom basis. The degrees of freedom of the first node are first, followed by the degrees of freedom of the second node, etc. The degrees of freedom that will be updated automatically in Abaqus/Explicit are: 1–3 (displacements), 4–6 (rotations), 8 (pressure), and 11 (temperature). Depending on the procedure type (see below), only some of the degrees of freedom listed above will be updated. Other degrees of freedom will not be updated by the time integration procedure in Abaqus/Explicit and, hence, should not be used. The mass matrix defined in user subroutine VUEL must be symmetric. In addition, the following requirements apply:
You must be using appropriate lumping techniques to provide a mass matrix that follows these requirements. For the rotational degrees of freedom at a particular node in three-dimensional analyses, you can specify a fully populated symmetric 3 × 3 inertia tensor. Usage with general nonlinear proceduresThe following illustrates the use in explicit dynamic procedures: Direct-integration explicit dynamic analysis (lflags(iProcedure)=17)
Transient fully coupled thermal-stress analysis (lflags(iProcedure)=74)
Example: Structural user elementA structural user element has been created to demonstrate the usage of subroutine VUEL. These user-defined elements are applied in a number of analyses. The following excerpt is from the verification problem that invokes the structural user element in an explicit dynamic procedure: USER ELEMENT, NODES=2, TYPE=VU1, PROPERTIES=4, COORDINATES=3, VARIABLES=12 1, 2, 3 ELEMENT, TYPE=VU1 101, 101, 102 ELGEN, ELSET=VUTRUSS 101, 5 UEL PROPERTY, ELSET=VUTRUSS 0.002, 2.1E11, 0.3, 7200. The user element consists of two nodes that are assumed to lie parallel to the x-axis. The element behaves similarly to a linear truss element. The supplied element properties are the cross-sectional area, Young's modulus, Poisson's ratio, and density, respectively. The next excerpt shows the listing of the subroutine. The user subroutine has been coded for use in an explicit dynamic analysis. The names of the verification input files associated with the subroutine and these procedures can be found in VUEL. subroutine vuel( * nblock, * rhs,amass,dtimeStable, * svars,nsvars, * energy, * nnode,ndofel, * props,nprops, * jprops,njprops, * coords,ncrd, * u,du,v,a, * jtype,jElem, * time,period,dtimeCur,dtimePrev,kstep,kinc,lflags, * dMassScaleFactor, * predef,npredef, * ndload,adlmag) include 'vaba_param.inc' c operation code parameter ( jMassCalc = 1, * jIntForceAndDtStable = 4) c flags parameter (iProcedure = 1, * iNlgeom = 2, * iOpCode = 3, * nFlags = 3) c procedure flags parameter ( jDynExplicit = 17 ) c time parameter (iStepTime = 1, * iTotalTime = 2, * nTime = 2) c energies parameter ( iElPd = 1, * iElCd = 2, * iElIe = 3, * iElTs = 4, * iElDd = 5, * iElBv = 6, * iElDe = 7, * iElHe = 8, * iElKe = 9, * iElTh = 10, * iElDmd = 11, * iElDc = 12, * nElEnergy = 12) parameter (factorStable = 0.99d0) parameter (zero = 0.d0, half = 0.5d0, one = 1.d0, two=2.d0) C dimension rhs(nblock,ndofel), amass(nblock,ndofel,ndofel), * dtimeStable(nblock), * svars(nblock,nsvars), energy(nblock,nElEnergy), * props(nprops), jprops(njprops), * jElem(nblock), time(nTime), l(nFlags), * coords(nblock,nnode,ncrd), u(nblock,ndofel), * du(nblock,ndofel), v(nblock,ndofel), a(nblock, ndofel), * predef(nblock, nnode, npredef, nPred), adlmag(nblock), * dMassScaleFactor(nblock) c Notes: c Define only nonzero entries; the arrays to be defined c have been zeroed out just before this call if (jtype .eq. 1001 .and. * lflags(iProcedure).eq.jDynExplicit) then area0 = props(1) eMod = props(2) anu = props(3) rho = props(4) eDampTra = zero amassFact0 = half*area0*rho if ( lflags(iOpCode).eq.jMassCalc ) then do kblock = 1, nblock c use original distance to compute mass alenX0 = (coords(kblock,2,1) - coords(kblock,1,1)) alenY0 = (coords(kblock,2,2) - coords(kblock,1,2)) alenZ0 = (coords(kblock,2,3) - coords(kblock,1,3)) alen0 = sqrt(alenX0*alenX0 + alenY0*alenY0 + * alenZ0*alenZ0) am0 = amassFact0*alen0 amass(kblock,1,1) = am0 amass(kblock,2,2) = am0 amass(kblock,3,3) = am0 amass(kblock,4,4) = am0 amass(kblock,5,5) = am0 amass(kblock,6,6) = am0 end do else if ( lflags(iOpCode) .eq. * jIntForceAndDtStable) then do kblock = 1, nblock alenX0 = (coords(kblock,2,1) - coords(kblock,1,1)) alenY0 = (coords(kblock,2,2) - coords(kblock,1,2)) alenZ0 = (coords(kblock,2,3) - coords(kblock,1,3)) alen0 = sqrt(alenX0*alenX0 + alenY0*alenY0 + * alenZ0*alenZ0) vol0 = area0*alen0 amElem0 = two*amassFact0*alen0 alenX = alenX0 * + (u(kblock,4) - u(kblock,1)) alenY = alenY0 * + (u(kblock,5) - u(kblock,2)) alenZ = alenZ0 * + (u(kblock,6) - u(kblock,3)) alen = sqrt(alenX*alenX + alenY*alenY + alenZ*alenZ) area = vol0/alen ak = area*eMod/alen c stable time increment for translations dtimeStable(kblock) = factorStable*sqrt(amElem0/ak) c force = E * logarithmic strain *current area strainLog = log(alen/alen0) fElasTra = eMod*strainLog*area forceTra = fElasTra c assemble internal load in RHS rhs(kblock,1) = -forceTra rhs(kblock,4) = forceTra c internal energy calculation alenOld = svars(kblock,1) fElasTraOld = svars(kblock,2) energy(kblock, iElIe) = energy(kblock, iElIe) + * half*(fElasTra+fElasTraOld)*(alen - alenOld) c update state variables svars(kblock,1) = alen svars(kblock,2) = fElasTra end do end if end if c return end |