`分配或指针属性在Abaqus子例程中决定了延期形状阵列



代码:

  double precision maxstress(w)
  real, dimension(:), allocatable, save :: han(w)
  integer jang(w)

  do i=1,nblock
     if(maxstress(i) . gt. 1000) then
        jang(i) =1
        han(i) = han(i) + 1
     else
        jang(i) =0
     endif
     write(*,*) "jang", i, jang(i)
     write(*,*) "han", i, han(i)
  enddo

给出错误消息:

findnode2.for(47): error #6646: ALLOCATABLE or POINTER attribute dictates a deferred-shape-array   [HAN]
      real, dimension(:), allocatable, save :: han(w)
-----------------------------------------------^

在此代码中,我需要制作静态变量han,但发生错误#6646。

我需要做什么?

显而易见的答案是删除allocatable属性,因为所示的代码中没有任何内容可以指示han为什么应分配。注意dimension(:)也是多余的,并且被忽略了。只是做:

  real, save :: han(w)

(大概w是整数参数)

交替做:

  real, dimension(:), allocatable, save :: han

然后在可执行代码中do allocate(h(w))

您的问题中没有什么可以表明这与Abaqus有关。

这里有很多混乱。您说这是一个子例程,但您没有显示子例程标头。我不知道这三个阵列是否是虚拟论点,这会使它们的"可调阵列"(大概是)也是一个假人参数,或者也许它们都是局部阵列,W是唯一的假人,这使得它们是唯一的假人它们"自动"阵列。无论哪种情况,可分配或指针属性都是冲突。

您还谈论"静态变量han",但没有什么可以暗示为什么它应该是静态的(而且不是。)

如果您希望一个或多个阵列可分配,则使用(:)作为边界,然后将它们分配到所需的大小。请注意,如果这些是局部变量,则在子例程返回时将自动划分它们,除非它们还获得了保存属性。(如果它们是虚拟论点,您不能说保存,并且如果从Abaqus调用这一点,也可能是可分配的,并且(:)是不合适的。

我的猜测是至少其中一些数组是虚拟论点,也许一个或多个是本地变量。如果是这样,则简单地删除可分配的解决方案应该是正确的解决方案。但是正如其他人所指出的那样,您已经遗漏了很多东西,因此无法确定。

最新更新