非構造化グリッドの効率的な補間方法?


12

2つの非構造化グリッド間でデータを補間するための良い方法を知りたいのですが、一方のグリッドは他方のグリッドよりも粗いバージョンです。

ソリューションのタイムステップごとにグリッド間でデータを転送する必要がある一時的なPDE問題を解決しているため、効率は非常に重要です。

与えられたポイントの最も近いノードを検索するためにkdツリーを使用することを考え、その要素の形状関数(FEMシミュレーション)を使用してデータを補間します。これは良い解決策ですか?より良いものはありますか?

また、このタスクのためのC / C ++の堅牢で信頼できるライブラリを知っていますか?

*同様の質問があることは知っていますが、構造化されたグリッドで最も正確な方法を求めています。


私はこのためにオープンソースのメソッドの束を収集し、このQ&Aを参照してください。scicomp.stackexchange.com/questions/19137/...を
denfromufa

回答:


6

非構造化グリッドには場所があります。

Earth System Modeling Framework(ESMF)をご覧ください。再グリッド用のコードがいくつかあります(特にこの目的のためです)。また、並列コードを使用して気の利いたことを行いました。システム全体はモデルを結合するように設計されているため、他にも有用なものがあるかもしれません。

その他の注意事項:

「かなりの数のポイントに対してこれを効率的に行う方法はありません」

まあ、効率的は相対的なものです-ツリー構造でグリッドを取得したら、O(logn)で検索できます。です。

また、タイムステップごとに補間を行う必要がありますが、グリッドが適応していない場合、あるグリッドから別のグリッドへのマッピングは一定のままです。したがって、そのマッピング(つまり、各グリッドのどの要素が他の要素に対応するか)を便利な方法で計算して保存し、それから(グリッドが変更されるまで)計算する必要はありません。

これにより、精度とパフォーマンスのバランスを取りたい補間コードが残ります。三角形を横切る単純な線形補間は高速であり、十分かもしれません。

「kd-treeを使用して特定のポイントの最も近いノードを検索することを考え、その要素の形状関数を使用します」

最も近いノードでは要素を取得できないことに注意してください。したがって、必要な要素を見つけるためにもう少しやりたいことがあります。1つのオプションは、バウンディングボックスによって保存/検索する代わりにrtreeを使用することです。各検索で複数の要素を取得できますが、それらのうちどれが直接正しいかを確認できます。


これはいいですね。メッシュを適合させる必要はないので、あるグリッドから他のグリッドへのマッピングは一度だけ行われます。r-treeデータ構造に関するヒントをありがとう。
ベルナルドMR

1
O(N)O(logN)

7

私があなたを正しく理解していれば、より粗いグリッドで補間することにより、より細かいグリッドの値を埋めたいと思うでしょう。非構造化グリッドで線形補間を行う1つの方法は、Delaunay三角形分割を使用することです(これは、MatlabのgriddataおよびTriScatteredInterpコマンドの実装方法です)。グリッドポイントの三角形分割を作成した後、補間は、ターゲットポイントを含む三角形の位置を特定し、その重心座標を計算し、頂点の関数値を使用して補間値を計算するまで続きます。 CGALは、n次元の三角形分割(中程度のnの場合)を構築でき、組み込みの2D補間モジュールも備えています。


はい。しかし、細かいグリッドの値を粗いグリッドにも「注入」したいので、転送と言いました。
ベルナルドMR

3

これは、ノードではなく求積点で関数値を転送することを除いて、私が現在行っていることです。ここで私の質問に対する選択された答えで説明されているテクニックを実装しています:どの三角形のポイントがにあるかを見つける

ABAB

  1. BpiA
  2. pi
  3. AA
  4. Ap1p2p3A

NMAO(NM)O(max(N,M))


2

これは、非常に多くのポイントに対して効率的にこれを行う方法がないため、非構造化メッシュを本当に避けたい種類の仕事です。少なくとも何らかの形でそれぞれに関連するメッシュの使用を検討する必要があります。たとえば、両方が粗いメッシュの階層的な改良から取得された場合、一方のメッシュの補間点が他方のメッシュのどこにあるかを比較的簡単かつ効率的に見つけることができます。


私はそれが最良の選択肢(グリッドの階層)かもしれないと思います。この場合、適切なデータ構造、または使用する特定の方法を知っていますか?
ベルナルドMR

はい、階層メッシュはすべてクアッド/オクトツリー(単一の粗いセルで開始する場合)またはそのようなツリーのフォレスト(粗いメッシュに複数のセルがある場合)として保存されます。
ウォルフガングバンガース
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.