zengziw
Mechanical
- Feb 4, 2015
- 2
Hi,
I am trying to use VUMAT to generate heat, using enerInelasNew(k), I just set enerInelasNew(k) to constant, but it turns out it doesn't have any impact on the temperature of the model.
I wonder how to generate heat using VUMAT?
subroutine vumat(
C Read only
1 nblock, ndir, nshr, nstatev, nfieldv, nprops, lanneal,
2 stepTime, totalTime, dt, 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.inc'
C All arrays dimensioned by (*) are not used in this algorithm
dimension props(nprops), density(nblock),
1 coordMp(nblock,*),
2 charLength(*), 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),
1 enerInternNew(nblock), enerInelasNew(nblock)
C
character*80 cmname
C
parameter( zero = 0., one = 1., two = 2., three = 3.,
1 third = one/three, half = .5, twoThirds = two/three,
2 threeHalfs = 1.5 )
C
C
e=props(1)
xnu=props(2)
twomu = e / ( one + xnu )
sixmu = three * twomu
alamda = twomu * ( e - twomu ) / ( sixmu - two * e )
omega=20000.0
alpha=1.0
c eps=stateNew(k,7)
c sigma=stateNew(k,8)
c lomod=sigma/eps
C
if ( stepTime .eq. zero ) then
do i = 1,nblock
C
C update stress
trace = strainInc(i,1) + strainInc(i,2) + strainInc(i,3)
stressNew(i,1) = stressOld(i,1) + alamda*trace
1 + twomu*strainInc(i,1)
stressNew(i,2) = stressOld(i,2) + alamda*trace
2 + twomu*strainInc(i,2)
stressNew(i,3) = stressOld(i,3) + alamda*trace
3 + twomu*strainInc(i,3)
stressNew(i,4) = stressOld(i,4) + twomu*strainInc(i,4)
stressNew(i,5) = stressOld(i,5) + twomu*strainInc(i,5)
stressNew(i,6) = stressOld(i,6) + twomu*strainInc(i,6)
eps=abs(stateNew(k,1))
sigma=abs(stateNew(k,2))
lomod=sigma/eps
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) )
enerInternNew(i) = enerInternOld(i)
1 + stressPower / density(i)
C Update the dissipated inelastic specific energy -
plasticWorkInc = 0
enerInelasNew(i) = 1000000000000000000000000000000000000
* + enerInelasOld (i)
c write(*,*) stateNew(k,7)
C
end do
C
else
do i = 1,nblock
C
C update stress
trace = strainInc(i,1) + strainInc(i,2) + strainInc(i,3)
stressNew(i,1) = stressOld(i,1) + alamda*trace
1 + twomu*strainInc(i,1)
stressNew(i,2) = stressOld(i,2) + alamda*trace
2 + twomu*strainInc(i,2)
stressNew(i,3) = stressOld(i,3) + alamda*trace
1 + twomu*strainInc(i,3)
stressNew(i,4) = stressOld(i,4) + twomu*strainInc(i,4)
stressNew(i,5) = stressOld(i,5) + twomu*strainInc(i,5)
stressNew(i,6) = stressOld(i,6) + twomu*strainInc(i,6)
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 Update the dissipated inelastic specific energy -
eps=abs(stateNew(k,1))
sigma=abs(stateNew(k,2))
lomod=sigma/eps
enerInelasNew(i) = 1000000000000000000000000000000000000
* + enerInelasOld (i)
c write(*,*) eps
end do
C
endif
return
end
I am trying to use VUMAT to generate heat, using enerInelasNew(k), I just set enerInelasNew(k) to constant, but it turns out it doesn't have any impact on the temperature of the model.
I wonder how to generate heat using VUMAT?
subroutine vumat(
C Read only
1 nblock, ndir, nshr, nstatev, nfieldv, nprops, lanneal,
2 stepTime, totalTime, dt, 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.inc'
C All arrays dimensioned by (*) are not used in this algorithm
dimension props(nprops), density(nblock),
1 coordMp(nblock,*),
2 charLength(*), 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),
1 enerInternNew(nblock), enerInelasNew(nblock)
C
character*80 cmname
C
parameter( zero = 0., one = 1., two = 2., three = 3.,
1 third = one/three, half = .5, twoThirds = two/three,
2 threeHalfs = 1.5 )
C
C
e=props(1)
xnu=props(2)
twomu = e / ( one + xnu )
sixmu = three * twomu
alamda = twomu * ( e - twomu ) / ( sixmu - two * e )
omega=20000.0
alpha=1.0
c eps=stateNew(k,7)
c sigma=stateNew(k,8)
c lomod=sigma/eps
C
if ( stepTime .eq. zero ) then
do i = 1,nblock
C
C update stress
trace = strainInc(i,1) + strainInc(i,2) + strainInc(i,3)
stressNew(i,1) = stressOld(i,1) + alamda*trace
1 + twomu*strainInc(i,1)
stressNew(i,2) = stressOld(i,2) + alamda*trace
2 + twomu*strainInc(i,2)
stressNew(i,3) = stressOld(i,3) + alamda*trace
3 + twomu*strainInc(i,3)
stressNew(i,4) = stressOld(i,4) + twomu*strainInc(i,4)
stressNew(i,5) = stressOld(i,5) + twomu*strainInc(i,5)
stressNew(i,6) = stressOld(i,6) + twomu*strainInc(i,6)
eps=abs(stateNew(k,1))
sigma=abs(stateNew(k,2))
lomod=sigma/eps
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) )
enerInternNew(i) = enerInternOld(i)
1 + stressPower / density(i)
C Update the dissipated inelastic specific energy -
plasticWorkInc = 0
enerInelasNew(i) = 1000000000000000000000000000000000000
* + enerInelasOld (i)
c write(*,*) stateNew(k,7)
C
end do
C
else
do i = 1,nblock
C
C update stress
trace = strainInc(i,1) + strainInc(i,2) + strainInc(i,3)
stressNew(i,1) = stressOld(i,1) + alamda*trace
1 + twomu*strainInc(i,1)
stressNew(i,2) = stressOld(i,2) + alamda*trace
2 + twomu*strainInc(i,2)
stressNew(i,3) = stressOld(i,3) + alamda*trace
1 + twomu*strainInc(i,3)
stressNew(i,4) = stressOld(i,4) + twomu*strainInc(i,4)
stressNew(i,5) = stressOld(i,5) + twomu*strainInc(i,5)
stressNew(i,6) = stressOld(i,6) + twomu*strainInc(i,6)
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 Update the dissipated inelastic specific energy -
eps=abs(stateNew(k,1))
sigma=abs(stateNew(k,2))
lomod=sigma/eps
enerInelasNew(i) = 1000000000000000000000000000000000000
* + enerInelasOld (i)
c write(*,*) eps
end do
C
endif
return
end