如何在 VUMAT 中确定处理的 Element 的序号?这是个有趣的问题。在 polymerfem.com 找到一个方法并附有解释。记录,暂无验证。
vumat 中有 nblock 这一参数,代表要处理的 material point。The V in VUMAT (and all other user defined explicit elements) stands for “vectorized”.
对于 C3D8R,也就是 Continuum 3D 8 noded Reduced integration,这种类型的减缩积分,其每个单元只有一个积分点(Integration Point)。因为积分点上应用的是高斯积分法,因而又叫 Gaussian Point,简称 GP。此时,nblock 的值等于 Element 的编号值 —— 但是只有在小模型中才可能会出现这样的“巧合”。因为,This means that abaqus passes chunks of data (i.e. nblock elements at once) to the user subroutine for calculation. That’s why you always have to loop over nblock: you need to determine the results for all elements abaqus passed to your routine. For small models, nblock may correspond to the number of elements in your model and subsequently kblock (current increment in nblock) corresponds to the element number. For larger models, there are multiple calls to your subroutine due to performance reasons, hence the number of elements differs from nblock and kblock has to be determined using nElement(kblock) (as mentioned before)…
获取 element 编号的 subroutine:
subroutine vumat ( c Read only - 1 jblock, 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 - 7 stressNew, stateNew, enerInternNew, enerInelasNew ) c include 'vaba_param.inc' c dimension jblock(*), props(nprops),density(*), coordMp(*), 1 charLength(*), strainInc(*), 2 relSpinInc(*), tempOld(*), 3 stretchOld(*), 4 defgradOld(*), 5 fieldOld(*), stressOld(*), 6 stateOld(*), enerInternOld(*), 7 enerInelasOld(*), tempNew(*), 8 stretchNew(*), 9 defgradNew(*), 1 fieldNew(*), 2 stressNew(*), stateNew(*), 3 enerInternNew(*), enerInelasNew(*) c character*80 cmname parameter ( 1 i_umt_nblock = 1, 2 i_umt_npt = 2, 3 i_umt_layer = 3, 4 i_umt_kspt = 4, 5 i_umt_noel = 5 ) call vumatXtrArg ( jblock(i_umt_nblock), 1 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, 7 stressNew, stateNew, enerInternNew, enerInelasNew, 8 jblock(i_umt_noel), jblock(i_umt_npt), 9 jblock(i_umt_layer), jblock(i_umt_kspt)) return end c ---------------------------------------------------------------------------------- subroutine vumatXtrArg ( c read only - 1 nblock, ndir, nshr, nstatev, nfieldv, nprops, lanneal, 2 stepTime, totalTime, timeinc, 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 read only extra arguments - 6 nElement, nMatPoint, nLayer, nSecPoint) c include 'vaba_param.inc' c c all arrays dimensioned by (*) are not used in this algorithm dimension props(nprops), density(nblock), 1 strainInc(nblock,ndir+nshr), 2 relSpinInc(nblock,nshr), defgradOld(nblock,9), 4 stressOld(nblock,ndir+nshr), 5 stateOld(nblock,nstatev), enerInternOld(nblock), 6 enerInelasOld(nblock), 7 stretchNew(nblock,ndir+nshr), defgradNew(nblock,9), 8 stressNew(nblock,ndir+nshr) dimension enerInelasNew(nblock),stateNew(nblock,nstatev), 1 enerInternNew(nblock) dimension nElement(nblock),nMatPoint(nblock),nLayer(nblock), 1 nSecPoint(nblock) character*80 cmname c make computations for every material point c ----------------------------------------------------------------------- do 1000 nblck = 1,nblock Nelem=nElement(nblck) ! here we go, c blah blah blah end do return end
不得不说,整出这么个 subroutine 来确定 element 编号的真不是一般的厉害。©
本文发表于水景一页。永久链接:<https://cnzhx.net/fe/2015/02/02/determine-number-of-element-in-vumat/>。转载请保留此信息及相应链接。
你好,请问有详细的代码吗,或者在哪里能找到呢,我最近刚好急需这样的的代码,研究卡在这里了,谢谢了
文中已经说明了,也给了来源链接。
nElement不是自己定义的空数组吗?这个循环感觉啥也没得到啊
nElement
是系统内部定义的吧。