2

特定のファイルからデータを読み取るためにさまざまなコードに含めることができるモジュールにサブルーチンを作成しようとしています。ファイルからデータを読み取るいくつかのコード (数値アルゴリズム) があります。

ファイルの形式は次のとおりです。

最初のエントリ: データ配列の行数と列数 (例: 720)

最初の n(=720) エントリ: 行列 A の最初の行全体 2 番目の n(=720) エントリ: 行列 A の 2 番目の行全体

最後の n(=720) エントリ: ベクトル b のすべての n エントリ

各エントリには 2 つの列があり、1 つは数値の REAL 部分用で、もう 1 つは COMPLEX 部分用です。

要約すると、基本的な入力ファイルの例:

  2
    -0.734192049E+00  0.711486186E+01
     0.274492957E+00  0.378855374E+01
     0.248391205E-01  0.412154039E+01
    -0.632557864E+00  0.195397735E+01
     0.289619736E+00  0.895562183E+00
    -0.284756160E+00 -0.892163111E+00

ここで、最初のエントリは 2x2 行列と 2x1 ベクトルを示します 最初の 4 行は行列 A の 4 つのエントリです (左の列は Real、右の列は Imag.) 最後の 2 行はベクトル b の 2 つのエントリです (左の列は Real) 、右列の画像。) これを実装するために次のコードを書きましたが、単に間違った結果を出力するだけです。

    n=           2
    A= (  0.0000000    , 1.08420217E-19) (-9.15983229E-16, 3.69024734E+19) ( 1.26116862E-43,  0.0000000    ) (  0.0000000    ,  0.0000000    )
    b= (  0.0000000    , 1.08420217E-19) (  0.0000000    , 1.08420217E-19)

コードで:

SUBROUTINE matrix_input(n,A,b) 
IMPLICIT NONE 
!
INTEGER, INTENT(OUT)                                  ::n !size of matrix to be read
COMPLEX, DIMENSION(:,:), INTENT(OUT), ALLOCATABLE     ::A !system matrix to be read
COMPLEX, DIMENSION(:), INTENT(OUT), ALLOCATABLE       ::b !RHS b vector to be read
DOUBLE PRECISION                                      ::A_Re,A_Im,b_Re,b_Im !
INTEGER                                               ::i,j
!----------------------------------------------------------   
! Subroutine outputs 'n'=size of matrix, 'A'=system matrix
! 'b'= RHS vector
!matrix194.txt
OPEN (UNIT = 24, FILE = "matrix_input_test.txt", STATUS="OLD", FORM="FORMATTED",     ACTION="READ")

!Read in size of matrix
READ(24,*) n  

ALLOCATE(A(n,n))
ALLOCATE(b(n))

!Read matrix A:
DO i=1,n
   DO j=1,n

    READ(24,*) A_Re, A_Im
    A(i,j)=CMPLX(A_Re,A_Im)

   END DO 
END DO 

!Read RHS vector b:
DO i=((n*n)+1),((n*n)+n)

   READ(24,*) b_Re, b_Im
   b(i)=CMPLX(b_Re,b_Im)

END DO 


CLOSE(UNIT=24)
DEALLOCATE(A,b)
END SUBROUTINE matrix_input

編集: HPC マークの洞察に従って、コードを編集しました。これにより正しい結果が得られますが、後で問題を引き起こす可能性のあるコマンドがある場合 (たとえば、使用する非常に大きな配列など)、彼らについて聞いてとても感謝しています!

   SUBROUTINE matrix_input(n,A,b) 
   IMPLICIT NONE 
   !
   INTEGER, INTENT(OUT)                                  ::n !size of matrix to be read
   COMPLEX, DIMENSION(:,:), INTENT(OUT), ALLOCATABLE     ::A !system matrix to be read
   COMPLEX, DIMENSION(:), INTENT(OUT), ALLOCATABLE       ::b !RHS b vector to be read
   !
   COMPLEX, DIMENSION(:), ALLOCATABLE                    ::temp,A_temp !temp vector of matrix A
   DOUBLE PRECISION                                      ::A_Re,A_Im,b_Re,b_Im 
   INTEGER                                               ::i,j,k
   !----------------------------------------------------------   
   ! Subroutine outputs 'n'=size of matrix, 'A'=system matrix
   ! 'b'= RHS vector
   !matrix194.txt
   OPEN (UNIT = 24, FILE = "matrix_input_test.txt", STATUS="OLD", FORM="FORMATTED", ACTION="READ")

   !Read in size of matrix
   READ(24,*) n  

   !Allocate arrays/vectors
   ALLOCATE(A(n,n))
   ALLOCATE(b(n))
   ALLOCATE(temp(n*n+n))
   ALLOCATE(A_temp(n*n))

   !Read matrix A & vector b: 
   !16 characters, 9 decimal places, exponent notation, 2 spaces
   DO i=1,(n*n)+n
       READ(24, FMT="(E16.9, 2X, E16.9)") A_Re, A_Im
       temp(i)=CMPLX(A_Re,A_Im)   
   END DO 

   !Select A:
   DO i=1,n*n
      A_temp(i)=temp(i)
   END DO 
   !Reshape
   A=RESHAPE(A_temp, (/n,n/))

   !Select b:
   k=0
   DO i=n*n+1,n*n+n
      k=k+1
      b(k)=temp(i)
   END DO 

   CLOSE(UNIT=24)
   !Do not deallocate A & b otherwise won't return anything properly
   DEALLOCATE(temp, A_temp)
   END SUBROUTINE matrix_input

編集されたコードの結果:

    n=           2
    A= (-0.73419207    ,  7.1148620    ) ( 0.27449295    ,  3.7885537    ) ( 0.24839121    ,  4.1215405    ) (-0.63255787    ,  1.9539773    )
    b= ( 0.28961974    , 0.89556217    ) (-0.28475615    ,-0.89216310    )
4

2 に答える 2

1

あなたのコードは私を混乱させます。 配列をSUBROUTINE matrix_input宣言し、 と一緒にします。ステートメントの直前に、すぐにそれらの割り当てを解除します。サブルーチンが呼び出し元のルーチンに何を返すと思いますか?Aballocatableintent(out)END SUBROUTINE

于 2013-02-17T18:28:16.090 に答える