1

私は有限要素システムを開発しています。いつものように、シミュレーションはメッシュノードのセットで構成され、それぞれがプロパティのセット(フローティングポイント)を持ちます。たとえば、時間内に変化するいくつかの材料プロパティ、座標、または物理量などです。

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

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

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

  • エントリ単位:各配列が構造体である単一の配列を維持します

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

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

一方では、プログラムのパフォーマンスとコードの保守性に関して、これらのアプローチ(およびそれらの組み合わせ)のどれが科学計算に最適であるかという古典的な質問があります。一方で、異なるアプローチ間の移行が容易になるようにコードを実装するにはどうすればよいのでしょうか。さらに、プログラムのさまざまな部分のさまざまなメモリレイアウト間で移行することも解決策になる可能性があります。

要点を言えば:

  • これらの異なるアプローチでのあなたの経験は何でしたか?
  • これらの違いはどれほど重要でしたか?
  • これら2つのレイアウト間での移行の経験を積んでいますか?
4

1 に答える 1

3

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

  1. そこにはたくさんのFEフレームワークとグリッドマネージャーがあります-それらの1つを使用してください!

  2. グリッドマネージャーは、多くの人が考えるよりも複雑です。1台のコンピューターで3Dのテットのみである限り、管理可能である可能性があります。ローカルリファインメントと並列負荷分散を備えた3Dの混合要素タイプを備えたグリッドマネージャーは、非常に大きなタスクです。すぐに利用できるものよりも改善したいことがわかっている場合にのみ、独自のグリッドマネージャーを開発してください。

  3. メモリレイアウト:ここで実際の質問に行きます:)
    グリッドデータと問題データを分離します。これにより、コードがより保守しやすくなります。グリッドマネージャーはさまざまな種類の問題に使用でき、各問題には各要素に関連付けられた独自のデータセットがあります。

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

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

  6. 未知数のベクトルの内部構造は、グループ化またはブロック単位である可能性があります(基本的には自分で説明した2つのアプローチ)未知数の番号付けに選択するこれら2つのアプローチは、解く偏微分方程式のタイプや使用する線形ソルバーの一種。この問題だけでも多くの科学出版物があります。

于 2010-10-31T22:30:48.347 に答える