0

ファイルに配列を書き込む fortran90 で書かれたプログラムがありますが、何らかの理由でアスタリスクを使用して複数の列を表しています。

8*9,  4,  2*9,  4

後でファイルから読み取ると、I/O エラーが発生します。

lib-4190 : 回復不能なライブラリ エラー

数値入力フィールドに無効な文字が含まれています。

ユニット 10 からのリスト指定の READ 中に発生 Fortran ユニット 10 は、順次フォーマットされたテキスト ファイルに接続されています。

なぜこれが起こっているのか、それを防ぐためにコンパイラにフィードするフラグがあるかどうか、誰にも分かりますか? Cray fortran コンパイラを使用していますが、書き込みステートメントは次のようになります。

write (lun,*) nsf_species(bundle%species(1:bundle%n_prim))

アップデート:

データ ファイルを読み取る行は次のようになります。

read (lun,*) Info(ifile)%alpha_i(1:size)

この行が問題の原因であることを確認しました。

4

3 に答える 3

2

このリスト出力の圧縮は、大量のデータを書き出すときに Cray Compilation Environment の非常に便利な機能です。ただし、ご指摘のとおり、この圧縮された出力は正しく読み込まれません (あまり役に立ちません)。

この動作は、コンパイラ フラグを使用するのではなく、"assign" コマンドを使用して変更できます。

次のサンプル コードを検討してください。

PROGRAM test
IMPLICIT NONE

INTEGER :: u

OPEN(UNIT=u,FILE="f1",FORM="FORMATTED",STATUS="UNKNOWN")
WRITE(u,*) 0,0,0
CLOSE(u)

OPEN(UNIT=u,FILE="f2",FORM="FORMATTED",STATUS="UNKNOWN")
WRITE(u,*) 0,0,0
CLOSE(u)

END PROGRAM test

最初に CCE でビルドして実行します。ファイル f1 と f2 の両方に、圧縮された出力形式が含まれています。

$ ftn -o test.x test.F90 
$ ./test.x 
$ cat f1
 3*0
$ cat f2
 3*0

次に、"assign" を使用して、ファイル f2 の形式を変更します。最初に、割り当て情報を保持するファイル名を定義する必要があります。

$ export FILENV=my_filenenv

次に、assign を使用して、ファイル f2 の圧縮出力をオフにします。

$ assign -y on f:f2

次に、実験を再実行します (再コンパイルする必要はありません)。

$ ./test.x 
$ cat f1
 3*0
$ cat f2
 0,  0,  0

すべてのファイル、特定のファイル名パターン、またはその他の多くの場合にこれを行うオプションがあります。

assign でできることは他にもあります。詳細については、PrgEnv-cray をロードした「man assign」を参照してください。

于 2015-07-30T13:19:37.537 に答える
1

*書き込みステートメントは、ステートメントの括弧で囲まれた部分の内側で指定されているように、リスト指向の書式設定を使用しています (これはまだ書式設定された出力ステートメントです。「書式設定されている」とは、「人間が読み取れるように書式設定されている」ことを意味します) 。リスト指示出力の規則は、コンパイラーに大きな自由を与えます。通常、実際に出力の詳細を気にする場合は、明示的な形式を指定する必要があります。

適用される規則の 1 つは、結果として得られる出力は、通常、リストによる入力に適している必要があるということです。しかし、リスト指示フォーマットの入力として許可されるものについては、かなり驚くべき規則がいくつかあります。そのような機能の 1 つは、構文 を使用して、入力テキストで入力値の繰り返し回数を指定できることですrepeat*value

コンパイラは、出力に繰り返し値があることに気付いたので、この繰り返しカウント機能を使用しました。

リスト指示入力でファイルを読み取るときにエラーメッセージが表示される理由がわかりません-表示されている行はリスト指示入力の有効な入力行であるためです。エラーの原因となっている行が実際に表示されている行であることを確認してください。

于 2015-07-28T08:03:32.250 に答える
1

簡単な回避策は、圧縮形式を使用しないように書き込みステートメントを変更することです。たとえば、次のように変更します。

write (lun,'(*(I5))') nsf_species(bundle%species(1:bundle%n_prim))

「*」は、指定された形式の任意の回数の繰り返しを許可し、圧縮された出力形式を抑制する必要があります。

ただし、コンパイラが圧縮形式で出力する場合は、同じ圧縮形式で読み戻すことができるはずです。うまくいけば、ヘルプデスクはそれがうまくいかない理由の根本にたどり着くことができます.

于 2015-07-31T08:38:52.893 に答える