3

私は Fortran に少し慣れていませんが、何度も何度も使用するモジュールに多くの関数とサブルーチンを収集し始めています。私が書いた新しいソース コードからこれらの関数とサブルーチンのいくつかを呼び出すことができるように、私は独自のライブラリを構築しようとしています。これまでのところ、サブルーチンを動作させることができましたが、関数は動作しませんでした。コード内から関数を呼び出す方法がわかりません。

これが例です。次の関数は、整数を受け取り、恒等行列を返します。

module test
contains
function IDENTITY(rows) !RETURNS THE IDENTITY MATRIX                                 
    real, dimension(rows,rows)    :: IDENTITY                                        
    integer, intent(in)           :: rows                                      
    integer                       :: i, j                                                                  
    !f2py intent(in) rows                                                             
    !f2py intent(out) IDENTITY                                                        
    !f2py depend(rows) IDENTITY                                                       
    IDENTITY = ZEROS(rows,rows)                                                      
    do i = 1, rows                                                                   
        do j = 1, rows                                                               
            if (i == j) then                                                         
               IDENTITY(i,j) = 1                                                     
            endif                                                                    
        enddo                                                                        
    enddo                                                                            
end function IDENTITY
end module                       

これをオブジェクト ファイルにコンパイルし、ライブラリにアーカイブします。次に、この関数を使用したい小さなプログラムを作成します。ここに、回避したい問題があります。モジュールが使用されるように、ソースに \use\ ステートメントを配置する必要があると考えました。次に、コンパイル時に .mod へのパスを含める必要があります。しかし最終的には、セクション全体が use ステートメントでいっぱいになる予定です。これらすべてを行う必要はなく、すべてをきれいに整えたいと思います。方法はありますか?どんな助けでも素晴らしいでしょう、

ありがとうございました

4

1 に答える 1

4

1つのモジュールのcontainsセクションに多くのサブルーチンと関数を入れることができます。それぞれに個別のモジュールは必要ありません。関連するプロシージャ(サブルーチンと関数)のモジュール/ファイルを作成して、コードを整理することは理にかなっています。

ライブラリは、私が以前使用していた優れた戦略です。この時代、私は通常、図書館を気にしません。コンパイラは非常に高速なので、プログラムに必要なモジュールを使用してファイルをコンパイルするだけです。コードの大きさによって異なります。

callステートメントを使用してサブルーチンを呼び出します。関数は、割り当てステートメントなどの式で使用して呼び出します。

x = sin (y)
matrix = identity (n)

PSの代わりに:

do i = 1, rows
   do j = 1, rows
      if (i == j) then
         IDENTITY(i,j) = 1
      endif
   enddo
enddo

なぜだめですか:

do i = 1, rows
   IDENTITY(i,i) = 1
enddo

行列をゼロにする関数ZEROSはありますか?言語は、割り当てステートメントでそれを行います。

IDENTITY = 0.0
于 2012-12-21T07:05:10.950 に答える