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

问题描述 投票:0回答:2

码:

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

我需要做什么?

fortran save static-variables abaqus allocatable-array
2个回答
1
投票

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

  real, save :: han(w)

(据推测w是一个整数参数)

交替做:

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

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

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


1
投票

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.