Arrays 错误#6366:数组表达式的形状不一致
我创建了一个程序来解决两体问题的龙格库特方法。我遇到了一个问题:当我调用从表达式返回二维数组元素的函数时,该函数也必须给出二维数组的元素(很抱歉与术语混淆),我得到以下消息:Arrays 错误#6366:数组表达式的形状不一致,arrays,function,fortran,Arrays,Function,Fortran,我创建了一个程序来解决两体问题的龙格库特方法。我遇到了一个问题:当我调用从表达式返回二维数组元素的函数时,该函数也必须给出二维数组的元素(很抱歉与术语混淆),我得到以下消息: error #6366: The shapes of the array expressions do not conform. [X1] X1(DIM,i)=X1(DIM,i-1)+0.5D0*ABS(i/2)*H*K1(DIM,i-1,X1(DIM,i-1),X2(DIM,i-1),V1(DIM,i-1)
error #6366: The shapes of the array expressions do not conform.
[X1]
X1(DIM,i)=X1(DIM,i-1)+0.5D0*ABS(i/2)*H*K1(DIM,i-1,X1(DIM,i-1),X2(DIM,i-1),V1(DIM,i-1),V2(DIM,i-1),NDIM,ORD,2,maxnu)
我有这个函数的外部接口,显然编译器认为这是一个函数。
我必须澄清一些事情: 是的,它不完全是Fortran,它是预处理器Trefor,莫斯科大学的天文学家使用它(我只是个学生)。这种语言与fortran非常相似,但更接近C语言(例如分号),许多学生都在学习C语言。 龙格-库塔法可以简单地写成: 我们有初值问题dy/dt=f(t,y), y(t0)=y0
y是未知向量,在我的例子中包含12个分量(每个物体有3个坐标和3个速度)
下一步是
y(n+1)=y(n)+1/6*h*(k1+2k2+2k3+k4), t(n+1)=t(n)+h
where
k1=f(tn,yn),
k2=f(tn+1/2h,yn+h/2*k1)
k3=f(tn+1/2h,yn+h/2*k2)
k4=f(tn+1/2h,yn+k3)
也就是说,在我的代码X1,2和V1,2和K_1,2应该是向量,因为它们每个都必须有3个空间分量,每个方法的“顺序”必须有4个分量。
完整代码:
FUNCTION K1(DIM,i,X1,X2,V1,V2,NDIM,ORD,nu,maxnu)RESULT (K_1);
integer,intent(in) :: i,DIM,nu;
real(8) :: K_1;
real(8) :: B1;
real(8) :: R;
real(8),intent(in) :: X1,X2,V1,V2;
COMMON/A/M1,M2,Fgauss,H;
integer,intent(in) :: NDIM,ORD,maxnu;
Dimension :: B1(NDIM, ORD);
Dimension :: X1(NDIM,ORD),X2(NDIM,ORD),V1(NDIM,ORD),V2(NDIM,ORD);
Dimension :: K_1(NDIM,ORD);
IF (nu>=2) THEN;
B1(DIM,i)=V1(DIM,i);
ELSE;
R=((X1(1,i)-X2(1,i))**2.D0+(X1(2,i)-X2(2,i))**2.D0+(X1(3,i)-X2(3,i))**2.D0)**0.5D0;
B1(DIM,i)=Fgauss*M2*(X2(DIM,i)-X1(DIM,i))/((R)**3.D0);
END IF;
K_1(DIM,i)=B1(DIM,i);
RETURN;
END FUNCTION K1;
FUNCTION K2(DIM,i,X1,X2,V1,V2,NDIM,ORD,nu,maxnu)RESULT (K_2);
integer,intent(in) :: i,DIM,nu;
real(8) :: K_2;
real(8) :: B2;
real(8) :: R;
real(8),intent(in) :: X1,X2,V1,V2;
COMMON/A/M1,M2,Fgauss,H;
integer,intent(in) :: NDIM,ORD,maxnu;
Dimension :: B2(NDIM,ORD);
Dimension :: X1(NDIM,ORD),X2(NDIM,ORD),V1(NDIM,ORD),V2(NDIM,ORD);
Dimension :: K_2(NDIM,ORD);
IF (nu>=2) THEN;
B2(DIM, i)=V2(DIM,i);
ELSE;
R=((X1(1,i)-X2(1,i))**2.D0+(X1(2,i)-X2(2,i))**2.D0+(X1(3,i)-X2(3,i))**2.D0)**0.5D0;
B2(DIM, i)=Fgauss*M1*(X2(DIM,i)-X1(DIM,i))/((R)**3.D0);
END IF;
K_2(DIM,i)=B2(DIM, i);
RETURN;
END FUNCTION K2;
PROGRAM RUNGEKUTT;
IMPLICIT NONE;
Character*80 STRING;
real(8) :: M1,M2,Fgauss,H;
real(8) :: R,X1,X2,V1,V2;
integer :: N,i,DIM,NDIM,maxnu,ORD;
integer :: nu;
PARAMETER(NDIM=3,ORD=4,maxnu=2);
Dimension :: X1(NDIM,ORD),X2(NDIM,ORD);
Dimension :: V1(NDIM,ORD),V2(NDIM,ORD);
INTERFACE;
FUNCTION K1(DIM,i,X1,X2,V1,V2,NDIM,ORD,nu,maxnu)RESULT (K_1);
integer,intent(in) :: i,DIM,nu;
real(8) :: K_1;
real(8) :: R;
real(8) :: B1;
real(8),intent(in) :: X1,X2,V1,V2;
COMMON/A/M1,M2,Fgauss,H;
integer,intent(in) :: NDIM,ORD,maxnu;
Dimension :: B1(NDIM, ORD);
Dimension :: X1(NDIM,ORD),X2(NDIM,ORD),V1(NDIM,ORD),V2(NDIM,ORD);
Dimension :: K_1(NDIM,ORD);
END FUNCTION K1;
FUNCTION K2(DIM,i,X1,X2,V1,V2,NDIM,ORD,nu,maxnu)RESULT (K_2);
integer,intent(in) :: i,DIM,nu;
real(8) :: K_2;
real(8) :: R;
real(8) :: B2;
real(8),intent(in) :: X1,X2,V1,V2;
COMMON/A/M1,M2,Fgauss,H;
integer,intent(in) :: NDIM,ORD,maxnu;
Dimension :: B2(NDIM,ORD);
Dimension :: X1(NDIM,ORD),X2(NDIM,ORD),V1(NDIM,ORD),V2(NDIM,ORD);
Dimension :: K_2(NDIM,ORD);
END FUNCTION K2;
END INTERFACE;
open(1,file='input.dat');
open(2,file='result.res');
open(3,file='mid.dat');
READ(1,'(A)') STRING;
READ(1,*) Fgauss,H;
READ(1,*) M1,M2;
READ(1,*) X1(1,1),X1(2,1),X1(3,1),V1(1,1),V1(2,1),V1(3,1);
READ(1,*) X2(1,1),X2(2,1),X2(3,1),V2(1,1),V2(2,1),V2(3,1);
WRITE(*,'(A)') STRING;
WRITE(3,'(A)') STRING;
WRITE(3,'(A,2G14.6)')' Fgauss,H:',Fgauss,H;
WRITE(3,'(A,2G14.6)')' M1,M2:',M1,M2;
WRITE(3,'(A,6G17.10)')' X1(1,1),X1(2,1),X1(3,1),V1(1,1),V1(2,1),V1(3,1):',X1(1,1),X1(2,1),X1(3,1),V1(1,1),V1(2,1),V1(3,1);
WRITE(3,'(A,6G17.10)')' X2(1,1),X2(2,1),X2(3,1),V2(1,1),V2(2,1),V2(3,1):',X2(1,1),X2(2,1),X2(3,1),V2(1,1),V2(2,1),V2(3,1);
R=((X1(1,1)-X2(1,1))**2.D0+(X1(2,1)-X2(2,1))**2.D0+(X1(3,1)-X2(3,1))**2.D0)**0.5D0;
N=0;
_WHILE N<=100 _DO;
i=2;
_WHILE i<=ORD _DO;
DIM=1;
_WHILE DIM<=NDIM _DO;
X1(DIM,i)=X1(DIM,i-1)+0.5D0*ABS(i/2)*H*K1(DIM,i-1,X1(DIM,i-1),X2(DIM,i-1),V1(DIM,i-1),V2(DIM,i-1),NDIM,ORD,2,maxnu);
X2(DIM,i)=X2(DIM,i-1)+0.5D0*H*ABS(i/2)*K2(DIM,i-1,X1(DIM,i-1),X2(DIM,i-1),V1(DIM,i-1),V2(DIM,i-1),NDIM,ORD,2,maxnu);
V1(DIM,i)=V1(DIM,i-1)+0.5D0*H*ABS(i/2)*K1(DIM,i-1,X1(DIM,i-1),X2(DIM,i-1),V1(DIM,i-1),V2(DIM,i-1),NDIM,ORD,1,maxnu);
V2(DIM,i)=V2(DIM,i-1)+0.5D0*H*ABS(i/2)*K2(DIM,i-1,X1(DIM,i-1),X2(DIM,i-1),V1(DIM,i-1),V2(DIM,i-1),NDIM,ORD,1,maxnu);
DIM=DIM+1;
_OD;
i=i+1;
_OD;
_WHILE DIM<=NDIM _DO;
X1(DIM,1)=X1(DIM,1)+1.D0/6.D0*H*(K1(DIM,1,X1(DIM,1),X2(DIM,1),V1(DIM,1),V2(DIM,1),NDIM,ORD,2,maxnu)+2.D0*K1(DIM,2,X1(DIM,2),X2(DIM,2),V1(DIM,2),V2(DIM,2),NDIM,ORD,2,maxnu)+2.D0*K1(DIM,3,X1(DIM,3),X2(DIM,3),V1(DIM,3),V2(DIM,3),NDIM,ORD,2,maxnu)+K1(DIM,4,X1(DIM,4),X2(DIM,4),V1(DIM,4),V2(DIM,4),NDIM,ORD,2,maxnu));
X2(DIM,1)=X2(DIM,1)+1.D0/6.D0*H*(K2(DIM,1,X1(DIM,1),X2(DIM,1),V1(DIM,1),V2(DIM,1),NDIM,ORD,2,maxnu)+2.D0*K2(DIM,2,X1(DIM,2),X2(DIM,2),V1(DIM,2),V2(DIM,2),NDIM,ORD,2,maxnu)+2.D0*K2(DIM,3,X1(DIM,3),X2(DIM,3),V1(DIM,3),V2(DIM,3),NDIM,ORD,2,maxnu)+K2(DIM,4,X1(DIM,4),X2(DIM,4),V1(DIM,4),V2(DIM,4),NDIM,ORD,2,maxnu));
V1(DIM,1)=V1(DIM,1)+1.D0/6.D0*H*(K1(DIM,1,X1(DIM,1),X2(DIM,1),V1(DIM,1),V2(DIM,1),NDIM,ORD,1,maxnu)+2.D0*K1(DIM,2,X1(DIM,2),X2(DIM,2),V1(DIM,2),V2(DIM,2),NDIM,ORD,2,maxnu)+2.D0*K2(DIM,3,X1(DIM,3),X2(DIM,3),V1(DIM,3),V2(DIM,3),NDIM,ORD,2,maxnu)+K2(DIM,4,X1(DIM,4),X2(DIM,4),V1(DIM,4),V2(DIM,4),NDIM,ORD,2,maxnu));
V2(DIM,1)=V2(DIM,1)+1.D0/6.D0*H*(K2(DIM,1,X1(DIM,1),X2(DIM,1),V1(DIM,1),V2(DIM,1),NDIM,ORD,1,maxnu)+2.D0*K2(DIM,2,X1(DIM,2),X2(DIM,2),V1(DIM,2),V2(DIM,2),NDIM,ORD,1,maxnu)+2.D0*K2(DIM,3,X1(DIM,3),X2(DIM,3),V1(DIM,3),V2(DIM,3),NDIM,ORD,1,maxnu)+K2(DIM,4,X1(DIM,4),X2(DIM,4),V1(DIM,4),V2(DIM,4),NDIM,ORD,1,maxnu));
_OD;
R=((X1(1,5)-X2(1,5))**2.D0+(X1(2,5)-X2(2,5))**2.D0+(X1(3,5)-X2(3,5))**2.D0)**0.5D0;
N=N+1;
write(2,'(A,1i5,6g12.5)')' N,X1(1,1),X1(2,1),X1(3,1),X2(1,1),X2(2,1),X2(3,1):',N,X1(1,1),X1(2,1),X1(3,1),X2(1,1),X2(2,1),X2(1,1),X2(2,1),X2(3,1);
_OD;
END PROGRAM RUNGEKUTT;
函数K1(DIM、i、X1、X2、V1、V2、NDIM、ORD、nu、maxnu)结果(K_1);
整数,意图(in)::i,DIM,nu;
实数(8):K_1;
真实(8):B1;
实数(8):R;
真实(8),意图(in):X1,X2,V1,V2;
普通/A/M1、M2、FGAUS、H;
整数,意图(in)::NDIM、ORD、maxnu;
尺寸:B1(NDIM、ORD);
维度:X1(NDIM,作战需求)、X2(NDIM,作战需求)、V1(NDIM,作战需求)、V2(NDIM,作战需求);
维度:K_1(NDIM,ORD);
如果(nu>=2),则;
B1(尺寸,i)=V1(尺寸,i);
其他的
R=((X1(1,i)-X2(1,i))**2.D0+(X1(2,i)-X2(2,i))**2.D0+(X1(3,i)-X2(3,i))**2.D0)**0.5D0;
B1(DIM,i)=Fgauss*M2*(X2(DIM,i)-X1(DIM,i))/((R)**3.D0);
如果结束;
K_1(DIM,i)=B1(DIM,i);
回来
端功能K1;
函数K2(DIM、i、X1、X2、V1、V2、NDIM、ORD、nu、maxnu)结果(K_2);
整数,意图(in)::i,DIM,nu;
真实(8):K_2;
真实(8):B2;
实数(8):R;
真实(8),意图(in):X1,X2,V1,V2;
普通/A/M1、M2、FGAUS、H;
整数,意图(in)::NDIM、ORD、maxnu;
维度:B2(NDIM,ORD);
维度:X1(NDIM,作战需求)、X2(NDIM,作战需求)、V1(NDIM,作战需求)、V2(NDIM,作战需求);
维度:K_2(NDIM,ORD);
如果(nu>=2),则;
B2(尺寸,i)=V2(尺寸,i);
其他的
R=((X1(1,i)-X2(1,i))**2.D0+(X1(2,i)-X2(2,i))**2.D0+(X1(3,i)-X2(3,i))**2.D0)**0.5D0;
B2(DIM,i)=Fgauss*M1*(X2(DIM,i)-X1(DIM,i))/(R)**3.D0);
如果结束;
K_2(DIM,i)=B2(DIM,i);
回来
端功能K2;
程序RUNGEKUTT;
隐式无;
字符*80字符串;
实数(8):M1,M2,fgaus,H;
实数(8):R,X1,X2,V1,V2;
整数:N,i,DIM,NDIM,maxnu,ORD;
整数::nu;
参数(NDIM=3,ORD=4,maxnu=2);
尺寸:X1(NDIM,ORD),X2(NDIM,ORD);
维度:V1(NDIM,作战需求),V2(NDIM,作战需求);
界面
函数K1(DIM、i、X1、X2、V1、V2、NDIM、ORD、nu、maxnu)结果(K_1);
整数,意图(in)::i,DIM,nu;
实数(8):K_1;
实数(8):R;
真实(8):B1;
真实(8),意图(in):X1,X2,V1,V2;
普通/A/M1、M2、FGAUS、H;
整数,意图(in)::NDIM、ORD、maxnu;
尺寸:B1(NDIM、ORD);
维度:X1(NDIM,作战需求)、X2(NDIM,作战需求)、V1(NDIM,作战需求)、V2(NDIM,作战需求);
维度:K_1(NDIM,ORD);
端功能K1;
函数K2(DIM、i、X1、X2、V1、V2、NDIM、ORD、nu、maxnu)结果(K_2);
整数,意图(in)::i,DIM,nu;
真实(8):K_2;
实数(8):R;
真实(8):B2;
真实(8),意图(in):X1,X2,V1,V2;
普通/A/M1、M2、FGAUS、H;
整数,意图(in)::NDIM、ORD、maxnu;
维度:B2(NDIM,ORD);
维度:X1(NDIM,作战需求)、X2(NDIM,作战需求)、V1(NDIM,作战需求)、V2(NDIM,作战需求);
维度:K_2(NDIM,ORD);
端功能K2;
终端接口;
打开(1,file='input.dat');
打开(2,file='result.res');
打开(3,file='mid.dat');
读取(1),(A)’字符串;
读(1,*)Fgauss,H;
读取(1,*)M1,M2;
读取(1,*)X1(1,1),X1(2,1),X1(3,1),V1(1,1),V1(2,1),V1(3,1);
读取(1,*)X2(1,1),X2(2,1),X2(3,1),V2(1,1),V2(2,1),V2(3,1);
写入(*,‘(A)’字符串;
写入(3),(A)’字符串;
写(3),(A,2G14.6)‘Fgauss,H:’,Fgauss,H;
写(3),(A,2G14.6)‘M1,M2:’,M1,M2;
写(3),(A,6G17.10)‘X1(1,1),X1(2,1),X1(3,1),V1(1,1),V1(2,1),V1(3,1):’,X1(1,1),X1(2,1),X1(3,1),V1(1,1),V1(2,1),V1(3,1);
写下(3),(A,6G17.10)“X2(1,1),X2(2,1),X2(3,1),V2(1,1),V2(2,1),V2(3,1):”,X2(1,1),X2(2,1),X2(3,1),V2(1,1),V2(2,1),V2(3,1);
R=((X1(1,1)-X2(1,1))**2.D0+(X1(2,1)-X2(2,1))**2.D0+(X1(3,1)-X2(3,1))**2.D0)**0.5D0;
N=0;
_当N时,您正在计算定标器吗?如果我理解您试图执行的操作,那么该函数将返回一个2D数组,但您只为其中的一个元素赋值。为什么不让函数返回一个定标器值而不是数组
数组消息是关于表达式中数组形状之间的不一致。您还没有显示所有的声明,所以我们无法解决这个问题
编码风格提示:0)是否有输入错误?是否应该是功能K1
?1) 每行末尾不需要分号。至少对我来说,Fortran不是C.2),如果您将与每个变量相关的所有声明放在一行上,而不是将类型、意图和维度单独放在一行上,那么代码的可读性会更好。例如:
real, dimension (NDIM,ORD), intent (in) :: X1
编辑问题后进行编辑:
机器编写的代码很难看
很明显,您需要对所有尺寸进行计算。问题是在哪里。代码显示包含函数调用的循环,而不是包含循环的函数。通过这种总体设计,您可以计算输出数组的单个元素(即scaler变量),并将其作为函数返回,而不是函数返回数组。对于这种设计,返回仅包含单个已使用元素的二维数组没有什么意义。由于主程序中的语句需要一个定标器,因此您将从编译器获得错误消息。因此,重新设计函数以返回一个定标器。