UMAT实现混凝土粘弹性徐变变形提问? 100

浏览:680 回答: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


邀请回答 我来回答

全部回答

(1)
默认 最新
汴京抓鱼人
内容太多,可以找老师单独咨询下
8月31日
评论 点赞

没解决?试试专家一对一服务

换一批