在 vumat 中确定 element 的编号

如何在 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 编号的真不是一般的厉害。©

本文发表于水景一页。永久链接:<http://cnzhx.net/fe/2015/02/02/determine-number-of-element-in-vumat/>。转载请保留此信息及相应链接。

雁过留声,人过留名

电子邮件地址不会被公开。 必填项已用*标注

特别提示:与当前文章主题无关的讨论相关但需要较多讨论求助信息请发布到水景一页讨论区的相应版块,谢谢您的理解与合作!请参考本站互助指南