2016-06-21 3 views
0

私はFortranに特定のコードを持っています。コードは、ユーザーからの入力として 'pq'をとり、単一のポイントです。これを行うのではなく、ファイルpoints.txtからポイント 'pq'のセットを読み込み、ただ1つのユーザー入力ではなく、それらのポイント数で実行したいと思います。出来ますか?コードは以下の通りである:単一のポイントの代わりにポイントのリストのサブルーチンを呼び出します。

program prop 

     use module 

     implicit none 

     character(len=80) :: ErrorMsg 
     character(2)   :: xy 
     real(8)    :: Conc(20) = 0.d0 
     character(len=20)  :: fn, fl 
     real(8)    :: Mmolar, Tcritical, Pcritical, Tmininimum, Tmaximum, x, y 

call Init_module() 

    write(*,*) 'Insert the gas name:' 
    read(*,*) fn 
    write(*,*) 'Insert the gas library:' 
    read(*,*) fl 


    write(*,*) 'Insert the copule pq:' 
    read(*,*) pq 
    write(*,*) 'Insert the value of ', pq(1:1) 
    read(*,*) x 
    write(*,*) 'Insert the value of ', pq(2:2) 
    read(*,*) y 

write(*,*) 'Pres  = ', Pres(pq, x, y, ErrorMsg) 
    write(*,*) 'Temp = ', Temperature(pq, x, y, ErrorMsg) 

call ReleaseObjects() 

end program prop 

の代わりに上記のコードにおいてユーザからY単一点x、としてPQを読み出し、Iはfile.txtをから点の集合を読みたい、例えば50ポイントとPresとTemperatureのサブルーチンを実行します。 ファイルの各行は1つの点x、yを含み、各行のxとyはいくつかの空白文字で区切られています。 file.txtなどの最初の数行である:長さとフローティング番号の符号が変化し得ることに留意しなければならない

Ts 
500 
0.04781564 159.81587875 
0.20396084 165.46398084 
0.08159885 166.81382894 
0.03879184 164.17497877 
0.12585959 165.37000305 
0.09895530 165.95997769 
0.10389518 170.74235496 

。 file.txtはもともとpythonで書かれ、x、yの書式は'%-12.8f %-12.8f\n'%です。私が試してみて、ファイルを読み取るために、次のコードを持っていますが、以降3行目から読み取ることができないです:ユーザーのために尋ねる最初の引数としてアスタリスク(*)でREADステートメントを使用する代わりに

real, allocatable  :: x(:),y(:) 
     integer :: np 

     open(12,file=trim('file.txt'),status='old', & 
      access='sequential', form='formatted', action='read') 

      read(12,*)pq 
      write(*,*)'pq:', pq 

      read(12,*)np 
      write(*,*)'number of points:',np 

      allocate (x(np)) 
      allocate (y(np)) 
      do i=1,np   
      read(12,*)x(i),y(i) 
      write(*,*)x(i),y(i) 
      enddo 
+0

最近のプログラミング言語でループと配列と呼ばれるものがあるかもしれません。それらはそのようなもののあなたの友人です。しかし、一方、 'module'はfortran90以上のキーワードなので、あなた自身のモジュールモジュールの名前を付けたくありません。 – innoSPG

+1

@innoSPG Dulyが指摘した。しかし、私は配列とループに精通しており、fortranのためにそれらを実装する方法が不明であったため、私はFortranを初めて使用しています。情報をありがとう。 – Aspro

答えて

0

入力、ファイル識別子を使用します。あなたはそれがASCIIであると仮定すると、点の集合を含むファイルをOPENする必要があります。

OPEN(UNIT=10,FILE=file.txt,ACTION='read',STATUS='old') 

私は、このコマンドの引数は、非常に説明されていると思います。 は、その後、あなたのファイルを仮定すると、xとyの値を持つ複数の行が含まれている、あなたが実行して、ファイルの各行を読むことができます:あなたが読むために複数のポイントを持っている場合は、数を知っていれば、ちょうどDOを使用

READ(10,*) x,y 

読み取るポイント、それ以外の場合はDO WHILEです。 50ポイントであなたの例を取るために、このようなものは動作するはずです:

OPEN(UNIT=10,FILE=file.txt,ACTION='read',STATUS='old') ! Open file 
DO i=1,50 
    READ(10,*) x,y 
    write(*,*) 'Pres  = ', Pres(pq, x, y, ErrorMsg) 
    write(*,*) 'Temp = ', Temperature(pq, x, y, ErrorMsg) 
END DO 
CLOSE(10) ! Close file 

EDIT

あなたの提案がほとんど正しいです。 pqcharacter(len=2)と忘れてしまった。そのため、行1を渡すことはできませんでした。 私が言ったように、アスタリスクによって自然にフォーマットとして扱われるスペース区切りがあります。とにかく、フォーマットに正確に一致させる場合は、データを書き込んだフォーマットと同じフォーマットを使用します。あなたの形式のPythonを読むと、私はあなたがスペース区切りで2つのfloatを書いたと仮定し、そして実際にあなたの数字の文字の数をカウントした場合:

read(12,'(f12.8,1X,f12.8)') x(i),y(i) 
:Fortranで次の形式を与える

0.04781564 159.81587875 
^^^^^^^^^^^^|^^^^^^^^^^^^ 
1   12|1   12 
      | 
      space 

Xは、Fortran形式のスペース区切り文字を意味します。

次に、あなたがチェックするために同じ形式で画面上のあなたのデータを書き込むことができます。それが与える

write(*,'(f12.8,1X,f12.8)') x(i),y(i) 

pq:Ts 
number of points:   500 
0.04781564 159.81587219 
0.20396084 165.46397400 
0.08159885 166.81382751 
0.03879184 164.17497253 
0.12585959 165.37001038 
0.09895530 165.95997620 
0.10389518 170.74235535 

あなたが最後の桁上の精度を失ったことに気づいたかもしれません。あなたが単純な実数(4バイト)を宣言したからです。あなたのコンパイラに応じてreal(kind=8)またはreal*8であなたのreal 8バイトを切り替えます(あなたのケースでは、ポータブルが、十分ではない、それを行うための正しい方法、気づいていないこと)

あなたが扱って行われたときに、あなたのファイルを閉じることを忘れないでください。

close(12) 
+0

また、最新のFortran(2008+)コンパイラにアクセスできるほど幸運な場合は、 'newunit'指定子を使用してください。 – jlokimlin

+0

@Coriolisファイル内のポイントは、カンマの代わりにスペースで区切られていますが、この場合はどうしたらいいですか? – Aspro

+0

@Aspro 'read'文の2番目のアスタリスクでは、書式を定義できます。アスタリスクが使用されると、プログラムはあなたのデータを "必要に応じて"読み込みますが、実際にはこれはスペース区切り文字を扱うのに十分なはずです。データの読み方を確認したい場合は、フォーマットを定義する必要があります。私はそれについてのチュートリアルを読むことをお勧めします、ここで定義するにはあまりにも複雑です。 – Coriolis

関連する問題