`ALLOCATABLE或POINTER属性在ABAQUS子程序中指示延迟形状数组`
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了`ALLOCATABLE或POINTER属性在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
然后在可执行代码中做allocate(h(w))
您的问题中没有任何内容表明这与abaqus有任何关系。
这里有很多混乱。你说这是一个子程序,但你没有显示子程序头。我不知道这三个数组是否是伪参数,这将使它们成为“可调整数组”,维度(可能)也作为伪参数传递,或者它们都是本地数组,其中w是唯一的虚拟数据,这使得他们是“自动”阵列。在任何一种情况下,ALLOCATABLE或POINTER属性都是冲突。
你也谈到“静态变量汉”,但没有什么可以暗示为什么它应该是静态的(并且它不是。)
如果您希望一个或多个数组可以分配,则使用(:)作为边界,然后将它们分配到所需的大小。请注意,如果这些是局部变量,则子例程返回时将自动释放它们,除非它们也被赋予SAVE属性。 (如果它们是伪参数,你不能说SAVE,如果从ABAQUS调用它也可能是ALLOCATABLE和(:)也不合适。
我的猜测是这些数组中至少有一些是伪参数,也许一个或多个是局部变量。如果是这样,只需删除ALLOCATABLE应该是正确的解决方案。但正如其他人所指出的那样,你已经遗漏了很多东西,这是不可能确定的。
以上是关于`ALLOCATABLE或POINTER属性在ABAQUS子程序中指示延迟形状数组`的主要内容,如果未能解决你的问题,请参考以下文章