`ALLOCATABLE或POINTER属性在ABAQUS子程序中指示延迟形状数组`

时间:2017-12-27 06:20:34

标签: fortran save static-variables abaqus allocatable-array

代码:

  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会发生。

我需要做什么?

2 个答案:

答案 0 :(得分:1)

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

  real, save :: han(w)

(推测w是整数参数)

交替做:

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

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

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

答案 1 :(得分:1)

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

你也谈到“静态变量汉”,但没有什么可以暗示为什么它应该是静态的(并且它不是。)

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

我的猜测是这些数组中至少有一些是伪参数,也许一个或多个是局部变量。如果是这样,只需删除ALLOCATABLE应该是正确的解决方案。但正如其他人所指出的那样,你已经遗漏了很多东西,这是不可能确定的。