UMAT实现混凝土粘弹性徐变变形提问? 100
浏览:853 回答:1
小白计划采用UMAT实现混凝土徐变粘弹性变形计算,其中一部分代码已编好(详见附件),现遇到以下问题:
1.直接运算可以计算,但无法查看结果,提示如下:
The selected Primary Variable is not availablein the current frame for any elements inthe current display group.
2.初步判断问题出现在Taomiu上,这个值在K=1,10循环中从10的-5次方变化到10的5次方,每次循环×10。更改程序直接给定这个值可以计算并显示结果,但是当给定的值小于0.1时,计算非常慢且卡死;给定值大于等于0.1时正常计算并显示结果;直接给定10的-5或-6次方如图1且计算很快(怀疑没算)。
我想知道为什么会出现这种问题?请大家不吝赐教
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,KSTEP,KINC)
C
INCLUDE 'ABA_PARAM.INC'
C
CHARACTER*80 CMNAME
C
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 DSTRS(NDI),DSTSA(NTENS),SHRSTRN(NTENS),t(1000),INNCREMENT(1),
5 nc1(NTENS),DSTSA1(NTENS)
integer i, j, k
real(8) :: ZERO, ONE, TWO, THREE, Amiu, Cnv, A0, n, q1, q2, v,
1 t0, tk, pivot, Cnf, k0, q4, Smid, S0, DTIME1, k1, DSTRE
real(8) :: Taomiu
parameter(ZERO=0.0d0, TWO=2.0d0, ONE=1.0d0,
1 THREE=3.0d0, n=1.0d-1, A0=0.0d0)
real, dimension(ntens) :: dstrainv
real, dimension(ntens) :: dstrainf
real, dimension(ntens) :: gamamiu
real, dimension(ntens,ntens) :: Iddsdde
real, dimension(ntens,2*ntens) :: aug
real, dimension(ntens) :: DSTRESS1
real, dimension(ntens) :: STRESS1
C 调试专用
C logical :: firstrun = .true.
C integer tempvar
C if(firstrun)then
C write(*,*)"please input an integer;"
C read(*,*)tempvar
C firstrun = .false.
C endif
C tempvar =1234 !断点
C material properties
q1 = props(1)
v = props(2)
q2 = props(3)
t0 = props(4)
tk = props(5)
k0 = props(6)
q4 = props(7)
S0 = props(8)
C
if (KINC.EQ.ONE) then
DTIME1 = ZERO
do i = 1, ntens
DSTRESS1(i) = ZERO
STRESS1(i) = ZERO
end do
else
k1 = ZERO
DTIME1 = STATEV(k1+1)
do i = 1, ntens
k1 = 1
k1 = k1 + 1
STRESS1(i) = STATEV(k1)
end do
do i = 1, ntens
k1 = k1 + 1
DSTRESS1(i) = STATEV(k1)
end do
end if
C G matrix
do i = 1, ntens
do j = 1, ntens
Iddsdde(i,j) = 0.0d0
end do
end do
do i = 1, ndi
do j = 1, ndi
Iddsdde(i,j) = -v
end do
Iddsdde(i,i) = 1.0d0
end do
do i = ndi+1, ntens
Iddsdde(i,i) = TWO * (ONE + v)
end do
C viscoelastic, no aging!!!!
do i = 1, ntens
dstrainv(i) = 0.0d0
end do
Cnv = ZERO
Cnv1 = ZERO
Taomiu = 1.0d-6
do k = 1.0d0, 1.0d1
Taomiu = Taomiu * 1.0d1
Amiu = q2 * n * (ONE - n) * ((THREE * Taomiu) ** n) / (ONE
1 + ((THREE * Taomiu) ** n))
if (KINC.EQ.ONE) then
do i = 1, ntens
gamamiu(i) = ZERO
end do
do i = 1, ntens
dstrainv(i) = dstrainv(i) + (ONE - exp(-dtime /
1 Taomiu)) * (Amiu * stress(i) - gamamiu(i))
end do
else
do i = 1, ntens
gamamiu(i) = Amiu * (ONE - exp(-DTIME1 / Taomiu))
1 * STRESS1(i) + Amiu * (ONE - (ONE - exp(-DTIME1 /
2 Taomiu)) / (DTIME1 / Taomiu)) * DSTRESS1(i) + gamamiu(i) * exp
3 (-DTIME1 / Taomiu)
end do
do i = 1, ntens
dstrainv(i) = dstrainv(i) + (ONE - exp(-dtime /
1 Taomiu)) * (Amiu * stress(i) - gamamiu(i))
end do
end if
if (KINC.EQ.ONE) then
Cnv1 = ZERO
else
Cnv1 = Cnv1 + Amiu * (ONE - (ONE - exp(dtime /
1 Taomiu)) / (dtime / Taomiu))
end if
end do
Cnv = Cnv1 + A0
C Dve
do i = 1, ntens
do j = 1, ntens
Iddsdde(i,j) = Iddsdde(i,j) * (Cnv + q1)
end do
end do
C Inversion of the matrix
aug(:,1:TWO*ntens) = 0.0d0
aug(:,1:ntens) = Iddsdde(:,1:ntens)
aug(:,ntens+1:TWO*ntens) = 0.0d0
do i = 1, ntens
aug(i,i+ntens) = 1.0d0
end do
do i = 1, ntens
pivot = aug(i,i)
do j = 1, 2*ntens
aug(i,j) = aug(i,j) / pivot
end do
do j = 1, ntens
if (j /= i) then
pivot = aug(j,i)
do k = 1, 2*ntens
aug(j,k) = aug(j,k) - pivot * aug(i,k)
end do
end if
end do
end do
ddsdde(:,1:ntens) = aug(:,ntens+1:TWO*ntens)
C STATEV
k1 = 0
STATEV(k1+1) = dtime
do i = 1, ntens
k1 = 1
k1 = k1 + 1
STATEV(k1) = stress(i)
end do
DSTRE = 0
do i = 1, ntens
k1 = k1 + 1
do j = 1, ntens
DSTRE = DSTRE + ddsdde(i,j) * (dstran(j) -
1 dstrainv(j))
STATEV(k1) = DSTRE
end do
end do
C Stress increment evaluation
do i = 1, ntens
do j = 1, ntens
stress(i) = stress(i) + ddsdde(i,j) * (dstran(j) -
1 dstrainv(j))
end do
end do
C
return
end