비정형 그리드를위한 효율적인 보간법?


12

두 개의 비정형 그리드 사이에 데이터를 보간하는 좋은 방법을 알고 싶습니다. 한 그리드는 다른 그리드의 더 거친 버전입니다.

솔루션의 모든 시간 단계에서 그리드간에 데이터를 전송해야하는 일시적인 PDE 문제를 해결하기 때문에 효율성이 매우 중요합니다.

주어진 포인트의 가장 가까운 노드를 검색하기 위해 kd-tree를 사용하는 것에 대해 생각한 다음 해당 요소의 모양 함수 (FEM 시뮬레이션)를 사용하여 데이터를 보간합니다. 이것이 좋은 해결책입니까? 더 좋은 것이 있습니까?

이 작업을위한 C / C ++의 강력하고 안정적인 라이브러리도 알고 있습니까?

* 비슷한 질문이 있다는 것을 알고 있지만 구조화 된 그리드에서 가장 정확한 방법을 요구합니다.


이 Q & A를 참조하십시오. 나는 이것을위한 오픈 소스 메소드를 수집했습니다 : scicomp.stackexchange.com/questions/19137/…
denfromufa

답변:


6

구조화되지 않은 그리드가 그 자리에 있습니다.

지구 시스템 모델링 프레임 워크 (ESMF)를보고 싶을 수도 있습니다. 그들은 재 연삭을위한 코드, 특히이 목적을 위해 몇 가지 코드를 가지고 있으며, 병렬 코드로도 멋진 것들을 해냈습니다. 전체 시스템은 모델을 결합하도록 설계되었으므로 다른 유용한 자료도있을 수 있습니다.

다른 참고 사항 :

"어느 정도의 포인트라도 효율적으로 수행 할 수있는 방법은 없습니다"

글쎄, 효율적은 상대적입니다. 일단 트리 구조로 그리드를 가져 오면 O (logn)으로 검색 할 수 있습니다. O (1)는 아니지만 일반 그리드를 검색하는 것처럼 꽤 빠를 수 있습니다. 입니다.

또한 모든 시간 단계에서 보간을 수행 해야하는 것처럼 들립니다. 그리드가 적응하지 않으면 한 그리드에서 다른 그리드로의 매핑이 일정하게 유지됩니다. 따라서 편리한 방법으로 매핑 (즉, 각 그리드의 어떤 요소가 다른 요소의 어떤 요소에 해당하는지)을 계산하고 저장할 수 있으며 그리드가 변경 될 때까지 계산할 필요가 없습니다.

따라서 보간 코드 (정확도와 성능의 균형을 맞추고 싶은 위치)가 삼각형을 가로 지르는 간단한 선형 보간이 빠르며 충분할 수 있습니다.

"주어진 포인트의 가장 가까운 노드를 검색하기 위해 kd-tree를 사용하는 것에 대해 생각한 다음 해당 요소의 모양 함수를 사용합니다"

가장 가까운 노드는 요소를 얻지 못하므로 원하는 요소를 찾기 위해 조금 더 노력하고 싶을 것입니다. 한 가지 옵션은 경계 상자로 저장 / 검색하는 rtree를 대신 사용하는 것입니다. 각 검색마다 하나 이상의 요소를 얻게되지만 직접 올바른 요소를 확인할 수 있습니다.


좋아 보인다 메쉬를 조정할 필요가 없으므로 한 그리드에서 다른 그리드로의 매핑은 한 번만 수행됩니다. r-tree 데이터 구조에 대한 팁을 주셔서 감사합니다.
Bernardo MR

1
O(N)O(logN)

7

내가 당신을 올바르게 이해한다면, 더 거친 그리드에 보간하여 더 미세한 그리드의 값을 채우고 싶습니다. 구조화되지 않은 그리드에서 선형 보간을 수행하는 한 가지 방법은 들로네 삼각 분할 (Delaunay Triangulation)을 사용하는 것입니다 (이는 Matlab의 griddata 및 TriScatteredInterp 명령이 구현되는 방식입니다). 그리드 포인트의 삼각 측량을 구성한 후 보간은 대상 포인트를 포함하는 삼각형을 찾고, 무게 중심 좌표를 계산하고, 정점의 함수 값을 사용하여 보간 된 값을 계산합니다. CGAL 은 n 차원 삼각 분할 (매체 n의 경우)을 구성 할 수 있으며 2d 보간 모듈 이 내장되어 있습니다.


예. 그러나 나는 또한 미세 그리드의 값을 굵은 그리드로 "주입"하고 싶다.
Bernardo MR

3

이것은 노드가 아닌 직교 점에서 함수 값을 전송하는 것을 제외하고는 현재 내가하고있는 일입니다. 나는 내 질문에 대한 선택된 답변에 설명 된 기술을 구현하고 있습니다 :에 있는 삼각형 점 찾기 .

ABAB

  1. BpiA
  2. 평가 포인트 정렬pi
  3. AA
  4. Ap1p2p3A

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


2

이것은 많은 수의 포인트에 대해 효율적 으로이 작업을 수행 할 수있는 방법이 없기 때문에 구조화되지 않은 메쉬를 피하려고하는 종류의 작업입니다. 적어도 각각과 관련이있는 메시 사용을 고려해야합니다. 예를 들어, 둘 다 굵은 메쉬의 계층 적 다듬기에서 얻은 경우 한 메쉬의 보간 점이 다른 메쉬의 어느 위치에 있는지 비교적 쉽고 효율적으로 알 수 있습니다.


나는 이것이 최선의 선택 일 수 있다고 생각합니다 (격자 계층). 이 경우에 좋은 데이터 구조 또는 사용할 특정 방법을 알고 있습니까?
Bernardo MR

예. 계층 구조 메시는 모두 쿼드 / 옥트 트리 (단일 조잡한 셀에서 시작하는 경우) 또는 이러한 트리의 포레스트 (조 대한 메쉬에 셀이 두 개 이상있는 경우)로 저장됩니다.
Wolfgang Bangerth
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.