非構造化メッシュでのローカル適応メッシュ細分割(ローカルAMR)の戦略は何ですか?


8

非構造化メッシュのローカルAMRに興味があります。現在、OpenFOAMライブラリを使用しています-完全に構造化されていないローカルAMRをサポートしています。

  • セル絞り込み条件は、切り取られるセルのリストを決定します
  • 選択したセルがリファインされます:メッシュ全体が再構築されます
  • 古いメッシュから新しいメッシュにマップが作成されます
  • 接続性が再計算されます(フェースセル、エッジフェースなど)
  • フィールドは新しいメッシュにマッピングされます

関係するデータ構造は基本的にC ++ベクトルであるため、メッシュは膨張してコピーされます。

静的データ構造を使用するメッシュ上に構築できる代替アプローチについて学ぶ必要があります。それらの一つは、中に存在する並列オクツリーフォレストローカルAMR、あるp4estデンドロ

誰かが非構造化メッシュのローカル適応AMR戦略に関する最近のレビューペーパーを私に指摘できますか?

経験に基づくアドバイスはさらに優れています。どのローカルAMRエンジンが、固定データ構造ベースの非構造化メッシュに最適ですか?

論文の最初のページでツリー間の通信のバランスについて読む前に、概要が必要です。:)


「静的データ構造」とは正確にはどういう意味ですか?メッシュの細分割中はもちろんセルの数が増えるため、一部のデータ構造は確実に拡大する必要があります(「膨張、コピー」)。あなたの質問が正確には何なのかよくわかりませんが、私は恐れています。
Wolfgang Bangerth 2012年

まあ、メッシュがデータ構造のようなstd :: vectorに基づいている場合は、単一のセルでも追加すると、新しいstd :: vector(新しいセル、そのポイントと面のサイズが大きくなります)が作成され、古い未精製データから新しい構造へ。Octree Forrestでは、私がそれを正しく理解していれば、メッシュを定義するデータ構造を拡張せず、Octree Forrestはリファインに必要なすべての情報を保持し、オクツリーは単一のセルを変更するという意味で動的データ構造ですツリー全体をコピーして単一の要素に展開することはありません。
tmaric

もう1つのメモ:高度に分散されたフロー(多くの気泡)の場合でも、2フェーズフローになるので、セルの総数の最大25%を調整する必要があります。つまり、完全に構造化されていないローカルAMRでは、リファインするたびに、リファインでアクティブなセルの25%のメッシュ全体をコピーします。
tmaric 2012年

2
Θ(n)nΘ(1)

2
他のライブラリが何を使用しているかはわかりませんが、deal.IIでは静的データ構造と動的データ構造の組み合わせがあります。階層メッシュの各レベルにstd :: vectorがあります。セルが粗くなった場合、ベクターの要素を未使用としてマークします。セルが洗練されている場合、子は次のレベルのstd :: vectorに入れられ、最初に未使用の要素に入れられ、最後に追加されます。要素が追加されたために再割り当てが必要な場合は、最初に調整中に必要になる新しい要素の数を数え、単一の割り当てを行います。このスキームでは、割り当て/コピーのコストはごくわずかです。
Wolfgang Bangerth 2012年

回答:


4

上記のコメントから、セルを追加するときにベクターをコピーしないようにすることを理解しています。最も簡単な方法は、必要なセルの最大数のためにスペースを予約することです。

std::vector<YourCellType> myVectorOfCells;
vectorOfCells.reserve(maxNoCells);

ベクトルはmaxNoCellsセルを作成するためのスペースを割り当てましたが、まだセルは作成されていません。これでO(1)、ベクター自体をコピーすることなく、maxNoCellsをベクターに追加できます。ただし、C ++標準では、push_backオペレーションを償却 する必要がありO(1)ます。maxNoCellsを超える数を追加すると、ベクターはそれ自体をコピーし、以前のk倍の数のセルのスペースを予約します(通常の実装では、1.4から2の間でkを選択します)。これにより、ベクターをセルに追加し続けることができますO(1)。このサイズ変更操作はそうで はありませんO(1)

O(1)n/2n/2O(1)時間...最初にメモリを予約する限り、O(1)時間で要素を追加することもできます。バンガース教授が前述したように、ツリーのような階層的なデータ構造も、データを格納するために内部的にベクトルを使用します。

ただし、シミュレーションの最初にメモリを割り当てることをお勧めします。十分なメモリがあるかどうかを確認するには、必要なセルの数を把握する必要があります。200.000プロセッサでのシミュレーションでは、データ構造を再割り当てしたり、メモリを使い果たしたり、ディスクにスワップしたりする必要はありません。それが起こった場合、私の意見は、ユーザーの入力エラーのためにプログラムが大声で失敗するはずだということです。


ありがとうございました!:) OpenFOAMで動的ベクトルデータ構造の予約操作の機能を確認します...操作は、ディスクから読み込まれたメッシュデータに基づいて実行され、データ構造を最後まで埋めると思います。
tmaric 2012
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.