1

abaqus サブルーチンを使用して複数のプロセッサ (cpus) でファイルを読み取るときにエラーが発生しました。このエラーに対処するのを手伝ってくれませんか。どうもありがとう

ファイルから変数を読み取りたいのですが、1 つの CPU を使用している場合はすべて問題ありませんが、複数の CPU を使用している場合はエラーが発生し、すべての CPU が同じコマンドを繰り返しているようです。

たとえば、次は読み取るファイルの内容で、ファイル名は data.dat です。

*matID ,2,1

131000.000、8880.000、8180.000

   0.324,       0.324,       0.300

3990.000,    5320.000,    5320.000

1871.000,      59.700,      59.700

1291.000,     215.000,     215.000

  90.000,     102.000,     102.000

私のサブルーチンは次のように表示されます: character*12 check1 integer check2,error OPEN(10,file='data.dat',status='old',iostat=error)
if (error.EQ.0) then read(10, *,iostat=error) check1,Nm end if
close(10)
print *,'Nm=',nm,error print *,'**'

2 つの CPU を使用すると、出力結果は次のようになります。

Nm= 2 0

Nm= 8880 0

**

**

4

1 に答える 1

2

ファイルからデータを読み取る理由に応じて、この問題を回避する方法がいくつかあります。

一度だけデータにアクセスする必要がある場合: 常にシリアルで呼び出されるサブルーチンでデータを読み込みます。UEXTERNALDB は良い例であり、必要に応じて分析の開始時またはインクリメントの開始時にのみファイルを開くように使用できます。その後、情報を共通ブロックに慎重に保存できます。並列の共通ブロックからの読み取りは問題なく動作するはずですが、並列サブルーチンからそれらに書き込んではいけません。

より少量のデータを取得する別の方法は、代わりに入力ファイルでソリューション変数を定義することです。

このファイルを各並列スレッド内でローカルに開く必要がある場合(理由はわかりませんが、修正する必要があります)、GETNUMCPUS と GETRANK を使用して、各スレッド内でファイルの異なるコピーを開くことができます。GETRANK は、プロセスのランク/ID を示す整数を返します。ただし、この方法には反対することをお勧めします。問題が並列の使用を正当化するのに十分な大きさである場合は、ファイルの読み取りで速度を落とさないようにする必要があります。

詳細については、Abaqus 6.14 ドキュメントのセクション 1.1.31 および 2.1.4 を参照してください。

于 2015-05-13T11:05:33.517 に答える