簡體   English   中英

錯誤#6366:數組表達式的形狀不符合

[英]error #6366: The shapes of the array expressions do not conform

我創建了一個通過runge-kutt方法解決兩體問題的程序。 我遇到了一個問題:當我調用從表達式返回二維數組的ELEMENT的函數時,該函數也必須給出二維數組的ELEMENT(很抱歉與術語混淆),我得到以下消息:

 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。 Runge-Kutta方法可以簡寫為:我們有初值問題

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;

請幫忙,看來,我對使用函數不了解!

MSB處在正確的軌道上,但我認為這里已經足夠找出問題所在。 如前所述,函數K1返回二維數組。 但是表達式中的所有其他操作數都是標量(好吧,我不知道H是什么,但是可能沒關系。)最終發生的事情是表達式的值是一個數組,標量隨着需要配合。 然后,您最終將數組分配給標量,這就是錯誤的原因。

我對Runge-Kutta不夠熟悉,無法提出您想要的建議。 但是您可能希望函數返回標量,而不是數組。

您正在計算潔牙機嗎? 如果我了解您要執行的操作,該函數將返回一個2D數組,但是您只能分配給它的一個元素。 為什么不讓該函數返回縮放器值而不是數組?

數組消息涉及表達式中數組形狀之間的不一致。 您尚未顯示所有聲明,因此我們無法弄清楚。

編碼樣式提示:0)是否有錯字? 應該是Function K1嗎? 1)每行的末尾不需要分號。 Fortran不是C。2)至少對我來說,如果將與每個變量相關的所有聲明放在一行上,而不是在類型,意圖和維度上單獨一行,則代碼將更具可讀性。 例如:

real, dimension (NDIM,ORD), intent (in) :: X1

編輯問題后進行編輯:

機器編寫的代碼很難看。

顯然,您需要對所有尺寸進行計算。 問題是在哪里。 該代碼顯示了包含函數調用的循環,而不是包含循環的函數。 通過這種總體設計,有意義的是您計算輸出數組的單個元素(即縮放器變量),並將其作為函數返回,而不是讓函數返回數組。 對於此設計,返回僅包含一個已使用元素的2D數組幾乎沒有意義。 並且由於主程序中的語句需要定標器,因此您從編譯器獲取錯誤消息。 因此,請重新設計函數以返回縮放器。

並且看起來您在調用K1時,實際參數是期望數組時的單個元素。 例如,當函數期望數組大小為X1(NDIM,ORD)時,將X1(DIM,i-1)作為第三個參數。 這也是一個問題,因為實際參數(即調用)和偽參數(即函數)不一致。 如果功能K1負責選擇適當的數組元素,則需要將整個數組傳遞給它。 如果調用是為了選擇適當的數組元素,則重寫K1以使用縮放器而不是數組作為輸入參數。 您需要一致的設計。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM