2017-05-22 12 views
0

私はAbaqusのユーザサブルーチンファイルを作成しています。 しかし、ファイルを読む際に、私は難しかった。 Fortran 77ベースのため、正確な解決策を見つけるのは難しいです。 私の意図は、1X1配列が含まれているファイルを読むことです。次に、配列内の値のインデックスを検索します。私はminlocは右、Fortran 90のためだと思うファイルを読み込み、Fortranで配列の値のインデックスを見つけます

loc=minloc(abs(dist-1),1) 

open (unit=99,file='D:\SIMULATION\dist.txt',status='old') 
read (99,*) dist 
close (99) 

、配列内の値のインデックスを見つけるためのコードは次のとおりです。ファイルを読み込むための

私のコードはありますか? Fortran 77には、minlocに似た関数がありますか?

+0

「minloc」はf95ですが、f77専用のコンパイラでabaqusを使用する方法はありません。 – agentp

+0

distとは何ですか?もっとコードを表示してください!宣言を表示します。 'read(99、*)dist 'もFortran 90です。Fortran 90を避ける必要はありません。 –

+0

ありがとうございました。私はFortran 90または95を使用して試してみます。 – Kim

答えて

2

表示されているコードは、期待通りにコンパイルして実行する必要があります。私はあなたが実際に1xNの配列を読んでいると仮定しています。そして、あなたが "1X1"と言ったときにそれはタイプミスでした。そうでなければ、minlocを使用しても意味がありません。

ただし、コメント内で報告したエラーメッセージ(An array-valued argument is required in this context)は、スカラー値のminloc組み込み関数を使用した場合にのみ発生します。したがって、私の推測では、distを配列として宣言していないと考えられます。ここで私が何を意味するかの簡単な例です:

read(funit1,*) x
! The contents of 'values.txt' are: -3.1, 4.1, 5.9, 2.6, -5.4 
! Values may be separated by commas or blanks. 

program get_min_dist 
    implicit none 
    real :: x     ! <-- Cannot be used to represent an array. 
    real, dimension(5) :: a  ! <-- An array of 5 reals. Do this instead. 
    integer :: loc, funit1 

    open(newunit=funit1, file="values.txt", status="old") 
    read(funit1,*) x 
    rewind(funit1) 
    read(funit1,*) a 
    close(funit1) 

    loc = minloc(abs(a-1),1) ! <-- I'm assuming there is a reason to 
           ! subtract 1 from all values in the array 

    ! loc = minloc(abs(x-1),1) ! <-- Error 'An array-valued arg is required` 
    print*, "x=",x 
    print*, "a=",a 
    print*, "index=", loc 
    print*, "value=", a(loc) 
end program get_min_dist 

ファイルが読み込まれたとき、最初の値は、あなたが見ているエラーメッセージが得られ、割り当てられます。ただし、配列aを使用すると、予想される出力が得られます。

のAbaqusはF77スタイルの固定フォーマットでの例とドキュメントを提供し続け、およびFortranのソースコードを必要とするという事実によるかもしれF77互換性のあるコードを使用する必要もありますのでご混乱を与えられることに.F。for extension 。既定では、この拡張子はifortに固定形式のコードを期待するように指示しますです。ただし、使用するコンパイラのバージョンでサポートされているFortranの機能は、固定フォーマットであっても有効です。異なるFortranバージョンの機能の利用可能性の詳細については、ご使用の(Intel Fortran)のマニュアルを参照してください。これは、例えば、何らかの形で変更することができる場合

私が知って喜んでいると思います拡張子は.f90です。

この設定は、少なくとも私が使用したバージョン(6.9から6.14)のために、Abaqusの環境ファイルで変更することができます。私はそれが新しいリリースでは変わったとは思わないが、多分。特に初心者の方には、同意なしに他のユーザーと環境を共有する場合は、変更することをお勧めしません。

+1

ディレクティブをローカルの 'abaqus_v6.env'ファイルに置くことができ、他のユーザを気にすることはありません。 ( 'compile_fortran = compile_fortran + [" - free "、]'はうまくいくようです。) – agentp

+0

@agentp良い点もあります。固定書式を避けるためのもの。 –

+0

ありがとうございます。私はあなたのアドバイスに従って自分の問題を解決しました。 – Kim

関連する問題