質問

私は有限要素システムを開発しています。いつものように、シミュレーションはメッシュノードのセットで構成されており、それぞれが時間内に進化するいくつかの材料プロパティ、座標、または物理量など、プロパティのセット(浮動小数点)を備えています。

2つの極端なアプローチを使用できます。

  • プロパティごとに:各プロパティに単一の配列を維持します。

    double* x, *y, *z, *e_field, *b_field, *conductivity;

  • エントリーに関して:各配列がstructである1つの配列を1つ維持します

    struct { double x, y, z, e_field, b_field, conductivity; } *meshnodedata;

これらの間では、座標x、y、zにのみ2番目のアプローチを適用し、残りのプロパティの最初のアプローチを使用するなど、混合できます。各メッシュノードに対してシミュレーションが維持するプロパティが多いほど、混合する可能性があります。

一方では、プログラムのパフォーマンスとコードの保守性に関して、これらのアプローチ(およびそのミックス)のどれが科学的なコンピューティングに最適なのは、これらのアプローチ(およびそのミックス)のどれが最適なのかがあります。一方、さまざまなアプローチ間の移行が簡単になるようにコードを実装する方法を疑問に思います。さらに、プログラムのさまざまな部分の異なるメモリレイアウト間で移行する解決策でさえあるかもしれません。

ポイントに来る:

  • これらのさまざまなアプローチを盗むあなたの経験は何でしたか?
  • これらの違いはどれほど重要でしたか?
  • これら2つのレイアウト間の移行の経験を積んだことはありますか?
役に立ちましたか?

解決

あなたの質問は、実際には、アクティブな研究の分野である柔軟で高速の有限要素ソフトウェアを設計する方法の質問に要約されています。私はこの種のソフトウェアに取り組んできましたが、あなたの質問に対する答えは、どのような機能をサポートしたいかによって本当に依存していると思います。たとえば、適応グリッドの洗練と粗大化が必要ですか? PDEのシステムを解決しますか?コードはクラスターで実行する必要がありますか?未知数はいくつありますか?あなたの目標を知らずに、とにかくいくつかの一般的なポンを作ろうとします。

  1. FEフレームワークとグリッドマネージャーのOODLESがあります。そのうちの1つを使用してください!

  2. グリッドマネージャーは、多くの人が考えるよりも複雑です。単一のコンピューター上の3Dのテットのみである限り、それでも管理可能である可能性があります。 3Dの混合要素タイプを備えたグリッドマネージャーは、ローカルの改良と並列負荷バランスを備えた幅広い作業です。すぐに利用できるものよりも改善したいものを知っている場合にのみ、独自のグリッドマネージャーを開発してください。

  3. メモリレイアウト:実際の質問に到達しました:)
    個別のグリッドデータと問題データ。これにより、コードがより保守可能になります。グリッドマネージャーは、さまざまな種類の問題に使用でき、各問題には各要素に添付されている独自のデータセットがあります。

  4. グリッド内や外部内の導電率のようなものを保存する場合、パフォーマンスに関する限り、それほど重要ではありません。パフォーマンス上の理由ではなく、設計上の理由でそれを分離します。

  5. 未知のものを保管してください(おそらく e_fieldb_field あなたの例では)メモリの1つの連続したブロックで。これにより、線形ソルバーのパフォーマンスが大幅に向上します。通常、反復線形ソルバーは、大きなマトリックスのメモリ帯域幅によって制限されます。

  6. 未知のベクトルの内部構造は、グループ化またはブロックごとにグループ化される可能性があります(基本的に自分で説明した2つのアプローチ)未知の数字のために選択するこれら2つのアプローチのどれが、あなたが解くことや、使用する線形ソルバーの種類。この問題だけで多くの科学出版物があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top