0

代码:

  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。

我需要做什么?

4

2 回答 2

2

显而易见的答案是删除该allocatable属性,因为显示的代码中没有任何内容表明为什么han应该是可分配的。还要注意dimension(:)是多余的和被忽略的。做就是了:

  real, save :: han(w)

(大概w是一个整数参数)

交替执行:

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

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

您的问题中没有任何内容表明这与 abaqus 有任何关系。

于 2017-12-27T16:13:40.850 回答
1

这里有很多混乱。你说这是一个子程序,但你没有显示子程序头。我不知道这三个数组是否是虚拟参数,这将使它们成为“可调整数组”,其维度(大概)也作为虚拟参数传递,或者它们都是本地数组,其中 w 是唯一的虚拟参数,这使得它们是“自动”数组。在任何一种情况下,ALLOCATABLE 或 POINTER 属性都会发生冲突。

您还谈到了“静态变量 han”,但没有什么可以说明为什么它应该是静态的(事实并非如此。)

如果您希望一个或多个数组是可分配的,则使用 (:) 作为边界,然后将它们分配到所需的大小。请注意,如果这些是局部变量,它们将在子例程返回时自动释放,除非它们也被赋予了 SAVE 属性。(如果它们是虚拟参数,则不能说 SAVE,如果从 ABAQUS 调用,则 ALLOCATABLE 和 (:) 也可能不合适。

我的猜测是这些数组中至少有一些是虚拟参数,并且可能有一个或多个是局部变量。如果是这样,简单地删除 ALLOCATABLE 应该是正确的解决方案。但正如其他人所指出的那样,您遗漏了太多,无法确定。

于 2017-12-27T22:50:09.847 回答