Hello,
I'm using the C++ API in an external application. I have successfully compiled the code to be able to open and read data from several odb's, but I recently run into a specific odb that I wasn't able to read.
This Odb is created through an Abaqus/Explicit simulation using Abaqus 2022 and contain a VUMAT.
When the openODB command is called, the error message is as follow :
OdbError: Cannot open file C:/temp/TestUMAT/TEST_ODB_VMAT.odb. ValueError: omu_PrimEnum(const cow_String&) - str not allowed: NONE Permissible: {INCREMENTAL: 0, TOTAL: 1, INCOMPRESSIBLE: 2}
The inp is :
*Heading
** Job name: TEST_ODB Model name: Model-1
** Generated by: Abaqus/CAE 6.11-2
*Preprint, echo=NO, model=NO, history=NO, contact=NO
**
** PARTS
**
*Part, name=Part-1
*Node
1, 1., 1., 1.
2, 1., 0., 1.
3, 1., 1., 0.
4, 1., 0., 0.
5, 0., 1., 1.
6, 0., 0., 1.
7, 0., 1., 0.
8, 0., 0., 0.
*Element, type=C3D8
1, 2, 1, 3, 4, 6, 5, 7, 8
*Nset, nset=_PickedSet2, internal, generate
1, 8, 1
*Elset, elset=_PickedSet2, internal
1,
** Section: Section-1
*Solid Section, elset=_PickedSet2, material=STOLKEN
,
*End Part
**
**
** ASSEMBLY
**
*Assembly, name=Assembly
**
*Instance, name=Part-1-1, part=Part-1
*End Instance
**
*Nset, nset=_PickedSet5, internal, instance=Part-1-1, generate
5, 8, 1
*Elset, elset=_PickedSet5, internal, instance=Part-1-1
1,
*Nset, nset=_PickedSet6, internal, instance=Part-1-1, generate
2, 8, 2
*Elset, elset=_PickedSet6, internal, instance=Part-1-1
1,
*Nset, nset=_PickedSet7, internal, instance=Part-1-1
3, 4, 7, 8
*Elset, elset=_PickedSet7, internal, instance=Part-1-1
1,
*Nset, nset=_PickedSet8, internal, instance=Part-1-1, generate
1, 4, 1
*Elset, elset=_PickedSet8, internal, instance=Part-1-1
1,
*Nset, nset=_PickedSet9, internal, instance=Part-1-1, generate
1, 7, 2
*Elset, elset=_PickedSet9, internal, instance=Part-1-1
1,
*Nset, nset=_PickedSet10, internal, instance=Part-1-1
1, 2, 5, 6
*Elset, elset=_PickedSet10, internal, instance=Part-1-1
1,
*End Assembly
**
** MATERIALS
**
*MATERIAL, NAME=STOLKEN
*DENSITY
1, 25
*USER MATERIAL,CONSTANTS=4
4E6,0.3,0,0
*DEPVAR
5
**
** BOUNDARY CONDITIONS
**
** Name: BC-1 Type: Symmetry/Antisymmetry/Encastre
*Boundary
_PickedSet5, XSYMM
** Name: BC-2 Type: Symmetry/Antisymmetry/Encastre
*Boundary
_PickedSet6, YSYMM
** Name: BC-3 Type: Symmetry/Antisymmetry/Encastre
*Boundary
_PickedSet7, ZSYMM
** ----------------------------------------------------------------
**
** STEP: Step-1
**
*Step, name=Step-1
*Dynamic, EXPLICIT
, 1.,, 1.
**
** BOUNDARY CONDITIONS
**
** Name: BC-4 Type: Displacement/Rotation
*Boundary, TYPE=VELOCITY
_PickedSet8, 1, 1, 0.1
** Name: BC-5 Type: Displacement/Rotation
*Boundary, TYPE=VELOCITY
_PickedSet9, 2, 2, 0.2
** Name: BC-6 Type: Displacement/Rotation
*Boundary, TYPE=VELOCITY
_PickedSet10, 3, 3, 0.3
**
** OUTPUT REQUESTS
**
*Restart, write
**
** FIELD OUTPUT: F-Output-1
**
*Output, field, variable=PRESELECT
**
** HISTORY OUTPUT: H-Output-1
**
*Output, history, variable=PRESELECT
*End Stepand the VUMAT is (corresponding the example in the documentation) :
subroutine vumat(
C Read only -
1 nblock, ndir, nshr, nstatev, nfieldv, nprops, jInfoArray,
2 stepTime, totalTime, dtArray, 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
include 'vaba_param_dp.inc'
C
C J2 Mises Plasticity with kinematic hardening for plane
C strain case.
C Elastic predictor, radial corrector algorithm.
C
C The state variables are stored as:
C STATE(*,1) = back stress component 11
C STATE(*,2) = back stress component 22
C STATE(*,3) = back stress component 33
C STATE(*,4) = back stress component 12
C STATE(*,5) = equivalent plastic strain
C
C
C All arrays dimensioned by (*) are not used in this algorithm
dimension props(nprops), density(nblock),
1 coordMp(nblock,*),
2 charLength(*), dtArray(*), strainInc(nblock,ndir+nshr),
3 relSpinInc(*), tempOld(*),
4 stretchOld(*), defgradOld(*),
5 fieldOld(*), stressOld(nblock,ndir+nshr),
6 stateOld(nblock,nstatev), enerInternOld(nblock),
7 enerInelasOld(nblock), tempNew(*),
8 stretchNew(*), defgradNew(*), fieldNew(*),
9 stressNew(nblock,ndir+nshr), stateNew(nblock,nstatev),
2 enerInternNew(nblock), enerInelasNew(nblock), jInfoArray(*)
C
parameter (i_info_AnnealFlag = 1,
* i_info_Intpt = 2, ! Integration station number
* i_info_layer = 3, ! Layer number
* i_info_kspt = 4, ! Section point number in current layer
* i_info_effModDefn = 5, ! =1 if Bulk/ShearMod need to be defined
* i_info_ElemNumStartLoc = 6) ! Start loc of user element number
C
parameter( zero = 0., one = 1., two = 2., three = 3.,
1 third = one/three, half = .5, twoThirds = two/three,
2 threeHalfs = 1.5 )
C
character*80 cmname
C
pointer (ptrjElemNum, jElemNum)
dimension jElemNum(nblock)
C
lAnneal = jInfoArray(i_info_AnnealFlag)
iLayer = jInfoArray(i_info_layer)
kspt = jInfoArray(i_info_kspt)
intPt = jInfoArray(i_info_Intpt)
iUpdateEffMod = jInfoArray(i_info_effModDefn)
iElemNumStartLoc = jInfoArray(i_info_ElemNumStartLoc)
ptrjElemNum = loc(jInfoArray(iElemNumStartLoc))
c
e = props(1)
xnu = props(2)
yield = props(3)
hard = props(4)
C
twomu = e / ( one + xnu )
thremu = threeHalfs * twomu
sixmu = three * twomu
alamda = twomu * ( e - twomu ) / ( sixmu - two * e )
term = one / ( twomu * ( one + hard/thremu ) )
con1 = sqrt( twoThirds )
C
do 100 i = 1,nblock
C
C Trial stress
trace = strainInc(i,1) + strainInc(i,2) + strainInc(i,3)
sig1 = stressOld(i,1) + alamda*trace + twomu*strainInc(i,1)
sig2 = stressOld(i,2) + alamda*trace + twomu*strainInc(i,2)
sig3 = stressOld(i,3) + alamda*trace + twomu*strainInc(i,3)
sig4 = stressOld(i,4) + twomu*strainInc(i,4)
C
C Trial stress measured from the back stress
s1 = sig1 - stateOld(i,1)
s2 = sig2 - stateOld(i,2)
s3 = sig3 - stateOld(i,3)
s4 = sig4 - stateOld(i,4)
C
C Deviatoric part of trial stress measured from the back stress
smean = third * ( s1 + s2 + s3 )
ds1 = s1 - smean
ds2 = s2 - smean
ds3 = s3 - smean
C
C Magnitude of the deviatoric trial stress difference
dsmag = sqrt( ds1**2 + ds2**2 + ds3**2 + 2.*s4**2 )
C
C Check for yield by determining the factor for plasticity,
C zero for elastic, one for yield
radius = con1 * yield
facyld = zero
if( dsmag - radius .ge. zero ) facyld = one
C
C Add a protective addition factor to prevent a divide by zero
C when dsmag is zero. If dsmag is zero, we will not have exceeded
C the yield stress and facyld will be zero.
dsmag = dsmag + ( one - facyld )
C
C Calculated increment in gamma (this explicitly includes the
C time step)
diff = dsmag - radius
dgamma = facyld * term * diff
C
C Update equivalent plastic strain
deqps = con1 * dgamma
stateNew(i,5) = stateOld(i,5) + deqps
C
C Divide dgamma by dsmag so that the deviatoric stresses are
C explicitly converted to tensors of unit magnitude in the
C following calculations
dgamma = dgamma / dsmag
C
C Update back stress
factor = hard * dgamma * twoThirds
stateNew(i,1) = stateOld(i,1) + factor * ds1
stateNew(i,2) = stateOld(i,2) + factor * ds2
stateNew(i,3) = stateOld(i,3) + factor * ds3
stateNew(i,4) = stateOld(i,4) + factor * s4
C
C Update the stress
factor = twomu * dgamma
stressNew(i,1) = sig1 - factor * ds1
stressNew(i,2) = sig2 - factor * ds2
stressNew(i,3) = sig3 - factor * ds3
stressNew(i,4) = sig4 - factor * s4
C
C Update the specific internal energy -
stressPower = half * (
1 ( stressOld(i,1)+stressNew(i,1) )*strainInc(i,1)
1 + ( stressOld(i,2)+stressNew(i,2) )*strainInc(i,2)
1 + ( stressOld(i,3)+stressNew(i,3) )*strainInc(i,3)
1 + two*( stressOld(i,4)+stressNew(i,4) )*strainInc(i,4) )
C
enerInternNew(i) = enerInternOld(i)
1 + stressPower / density(i)
C
C Update the dissipated inelastic specific energy -
plasticWorkInc = dgamma * half * (
1 ( stressOld(i,1)+stressNew(i,1) )*ds1
1 + ( stressOld(i,2)+stressNew(i,2) )*ds2
1 + ( stressOld(i,3)+stressNew(i,3) )*ds3
1 + two*( stressOld(i,4)+stressNew(i,4) )*s4 )
enerInelasNew(i) = enerInelasOld(i)
1 + plasticWorkInc / density(i)
100 continue
C
return
end
What I understand from the documentation is that the error comes from the parameter HYBRID FORMULATION of the *User Material keyword. But this parameter is not applied in an explicit simulation and is only relevant for Hybrid elements.
Can anyone help me and tell me why I get this error ?
Thanks a lot
