我可以很好地构建我的项目(IA-32 OS,Windows 7.与Microsoft Visual Studio 2008集成的Intel Visual Fortran 11.1.048)。当我运行.exe文件时,它会出现以下错误:
forrtl: severe (408): fort(2): Subscript #1 of the array dProductIDev has value 5 which is greater than the upper bound of 4
它还表示在最后一行中计算clcMatA
时,函数clcMatA
中发生了错误(我已标记如下所示)。功能代码是:
function clcMatA(cStress,D,I_dev,dtime,props,ndi,ntens)
implicit none
integer :: ndi,ntens
real*8 :: Z(2,ntens), dProductIDev(ntens,ntens), &
clcMatA(ntens,ntens),D(ntens,ntens),I_dev(ntens,ntens),&
cStress(ntens),dProductSigmadev2(ntens,ntens),&
sigmaDevDyadicProduct(ntens,ntens),identity(ntens,ntens),&
sigmaDev(ntens),props(5),alpha, beta,dtime,coeff_1,coeff_2,coeff_3
call identityMatrix(identity,ntens)
if (normm(cStress,ntens)==0) then
clcMatA = identity
else
alpha = expValVolume/(2*expValDStran)
beta = (6*expValVolume/(pi*expValPStran))**(1/props(4))*props(3)
sigmaDev = dev(cStress,I_dev,ntens)
dProductIDev = matmul(D,I_dev)
do i=1,ntens
do j=1,ntens
sigmaDevDyadicProduct(i,j)= sigmaDev(j)*sigmaDev(i)
end do
end do
dProductSigmadev2 = matmul(D,sigmaDevDyadicProduct)
call zVals(Z,sigmaDev,props,ntens)
do i=1,ntens
do j=1,ntens
clcMatA(i,j) = identity(i,j) + dtime*( (alpha+beta* &
normm(sigmaDev,ntens)**(1./props(4)-1.))*dProductIDev(i,j) + & ! The line causing the error
beta*(1./props(4)-1.)*normm(sigmaDev,ntens)**(1./props(4)-3.)* &
dProductSigmadev2(i,j) )
end do
end do
end if
end function
变量i
,j
,expValVolume
,expValDStran
和expValPStran
在函数clcMatA
,{{包含1}},dev
和identityMatrix
。
normm
值,下标的上限,传递给值为4的函数。我还在中断模式下检查它并检出。我还用ntens
替换了ntens
!在计算4
但我得到了同样的错误。
我打印了传递给函数的参数,我遇到了一些奇怪的事情。 clcMatA
应该是对称矩阵,并具有以下组件:
D
所以我也把D改成了它应该是什么,但又得到了同样的错误。
(我必须使用这种类型的变量,因为这个函数是由商业有限元软件(ABAQUS)间接调用的,并且交换变量的类型应该匹配。我也试过real(8),但是没有改变。)
我不知道那里发生了什么。有什么想法吗?
答案 0 :(得分:1)
总结:应该是本地的变量被声明为模块变量。这导致在使用模块的不同范围中使用相同的变量(使用关联)或者在模块内部(主机关联)。
应在该特定范围内声明对特定范围(例如程序)独立的变量。否则,调用的其他过程可能会无意中更改调用范围中使用的值。