首先给大家说声抱歉,因为在之前发布关于切线刚度法的文章有点小错误,当时没发觉出来,这些天反复验证和翻阅相关书籍,才发现有个大大的漏洞。之前讲的是切线刚度法与常刚度法的差别就是雅可比矩阵的不同,还有一处区别就是切线刚度法用的是试应力判断屈服,当前应力计算更新雅可比矩阵。具体的体现见如下代码:
SUBROUTINE UMAT(STRESS,STATEV,DDSDDE,SSE,SPD,SCD,
1 RPL,DDSDDT,DRPLDE,DRPLDT,
2 STRAN,DSTRAN,TIME,DTIME,TEMP,DTEMP,PREDEF,DPRED,CMNAME,
3 NDI,NSHR,NTENS,NSTATV,PROPS,NPROPS,COORDS,DROT,PNEWDT,
4 CELENT,DFGRD0,DFGRD1,NOEL,NPT,LAYER,KSPT,JSTEP,KINC)
C
INCLUDE 'ABA_PARAM.INC'
C
CMNAME
DIMENSION STRESS(NTENS),STATEV(NSTATV),
1 DDSDDE(NTENS,NTENS),DDSDDT(NTENS),DRPLDE(NTENS),
2 STRAN(NTENS),DSTRAN(NTENS),TIME(2),PREDEF(1),DPRED(1),
3 PROPS(NPROPS),COORDS(3),DROT(3,3),DFGRD0(3,3),DFGRD1(3,3),
4 JSTEP(4)
double precision E,V,yield0,H,lamdba,G,STATEV,M,W,R
double precision hydroStaticPressure,misesEqualStress
double precision hydroStaticPressureTry
double precision dEqualPlasticStrain,misesEqualStressTry
double precision, DIMENSION(NTENS)::deviatoricStress,stressTry
double precision, DIMENSION(NTENS)::deviatoricStressTry
INTEGER i,j
C Elastic properties
E = PROPS(1)
V = PROPS(2)
yield0 = PROPS(3)
H = (PROPS(5)-PROPS(3))/(PROPS(6)-PROPS(4))
lamdba = E*V/((1+V)*(1-2*V))
G = E/(2*(1+V))
C Calculate the material jacobian matrix
do i=1, NTENS
do j=1, NTENS
0 =
end do
end do
do i=1,NDI
do j=1,NDI
lamdba =
end do
lamdba+2*G =
G =
end do
C Calculate stress-try
do i=1,ntens
stress(i) =
end do
do i=1,NTENS
do j=1,NTENS
stressTry(i)+DDSDDE(i,j)*DSTRAN(j) =
end do
end do
call GetMisesEqualStress(stressTry,NTENS,NDI,misesEqualStressTry
1 ,deviatoricStressTry,hydroStaticPressureTry)
C get the nth equalPlasticStrain from STATEV
equalPlasticStrain=STATEV(1)
C Calculate the nth yield
yieldn=yield0+H*equalPlasticStrain
if (misesEqualStressTry>yieldn) then
call GetMisesEqualStress(stress,NTENS,NDI,misesEqualStress
1 ,deviatoricStress,hydroStaticPressure)
if (yieldn==yield0) then
C if (NOEL==400) then
C if(NPT==1) then
C write(*,*) "misesEqualStress=",misesEqualStress
C write(*,*) "misesEqualStressTry=",misesEqualStressTry
C write(*,*) "yieldn=",yieldn
C write(*,*) "yield0=",yield0
C end if
C end if
R=(yieldn-misesEqualStress)/(misesEqualStressTry-misesEqualStress)
do i=1,NTENS
do j=1,NTENS
stress(i)+R*DDSDDE(i,j)*dstran(j) =
end do
end do
call GetMisesEqualStress(stress,NTENS,NDI,misesEqualStress
1 ,deviatoricStress,hydroStaticPressure)
do i=1,NTENS
(1-R)*dstran(i) =
end do
end if
dEqualPlasticStrain=0
M=3*G/(misesEqualStress*(H+3*G))
do i=1,NTENS
dEqualPlasticStrain=dEqualPlasticStrain+M*deviatoricStress(i)*dstran(i)
end do
C update jacobian matrix
w = 9*G**2/(misesEqualStress**2*(H+3*G))
do i = 1,NTENS
do j=1,ntens
DDSDDE(i,j)-w*deviatoricStress(i)* =
end do
end do
C Calculate stress-(n+1)
do i=1,NTENS
do j=1,NTENS
stress(i)+DDSDDE(i,j)*dstran(j) =
end do
end do
else
do i=1,NTENS
do j=1,NTENS
stress(i)+DDSDDE(i,j)*dstran(j) =
end do
end do
dEqualPlasticStrain=0
end if
equalPlasticStrain+dEqualPlasticStrain =
RETURN
END
SUBROUTINE GetMisesEqualStress(STRESS,NTENS,NDI,misesEqualStress
1 ,deviatoricStress,hydroStaticPressure)
INCLUDE 'ABA_PARAM.INC'
DIMENSION STRESS(NTENS)
double precision, DIMENSION(NTENS)::deviatoricStress
double precision misesEqualStress,hydroStaticPressure
INTEGER NTENS,NDI
hydroStaticPressure=0
do i=1,NDI
hydroStaticPressure=hydroStaticPressure+STRESS(i)
enddo
hydroStaticPressure=hydroStaticPressure/3
do i=1,NDI
STRESS(i)-hydroStaticPressure =
enddo
do i=1+NDI,NTENS
STRESS(i) =
enddo
misesEqualStress=0
do i=1,NDI
misesEqualStress=misesEqualStress+deviatoricStress(i)**2
enddo
do i=1+NDI,NTENS
misesEqualStress=misesEqualStress+2*deviatoricStress(i)**2
enddo
misesEqualStress=sqrt(1.5*misesEqualStress)
END
来源:易木木响叮当