구조화되지 않은 셀 중심 FVM CFD 코드에 적합한 데이터 유형은 무엇입니까?


12

비정형 셀 기반 유한 체적 CFD에서 셀 탐색을위한 효율적인 데이터 구조에 대한 조언에 관심이 있습니다.

( dolfyn CFD 코드에서) 발생한 한 가지 예 는 다음과 같습니다 (관련 세그먼트 표시) 따라서 각 셀의면 수가 저장되는 배열 NFace가 있습니다. 그런 다음 CFace 배열은 로컬-셀 얼굴 번호를 전역 얼굴 번호로 매핑합니다.

\begin{listing}do ip=1,Ncel         ...         do j=1,NFaces(ip)           k   = CFace(ip,j)           ipp = Face(k)%cell1           inn = Face(k)%cell2           if( inn > 0 )then             ! internal\end{listing}

이 코드는 얼굴 기반이므로 Face (k) % cell1과 Face (k) % cell2 사이에있는 두 셀의 일련 번호를 저장하는 Face 데이터 유형이 있습니다.

이에 대한 의견이나 대체 접근법에 대한 제안은 환영합니다.

답변:


9

표시하는 구조는 일반적인 선택이며 경계 고스트 셀을 특수한 위치에두고 CSR 매트릭스 형식으로 셀면 인접성을 저장하는 것과 같습니다. 그러나 FV 방법은 각면이 한 번만 방문하는 경우 전체 또는 거의 전체적으로 얼굴 순회로 구성 될 수 있습니다 (양쪽에서 중심 / 구면 점을 향하도록 재구성, 리만 문제 해결, 셀에 잔류 물로 다시 플럭스 분산) ). 셀 기반 순회를 사용하고 희소 행렬에서 "대각선"아래에있는 두 개의 셀을 건너 뛰어 "가짜"수는 있지만 일반적인 대안은 저장하는 것입니다.(leftCell, rightCell) = support(face)이 경우면이 일류 엔티티가됩니다. 일반적으로면 직교 점 (중심점),면 법선을 저장할 장소가 필요하기 때문에 유용합니다. 또한 얼굴 기반 데이터 구조에 재구성 부품 (최소 사각형)을 넣을 수도 있습니다. 페이스 트래버스는 모든 크기가 규칙적이기 때문에 벡터화에 친숙해 보이지만 출력이 겹치므로 트래버스를 구성하여 내부 루프에 배치하지 않도록해야합니다. 이보다면 지향적 인 데이터 구조를 사용하면 각 경계 조건 유형을 인접한면의 순회를 사용하여 적용 할 수 있도록면 번호를 정렬하는 것이 당연합니다 (벡터화도 가능).

이 데이터 구조를 선택하는 경우 순회가 가능한 한 캐시에서 셀 데이터를 재사용 할 수 있도록면을 정렬해야합니다. 얼굴 순서 및 관련 최적화의 성능 분석에 대해서는 PETSc-FUN3D 용지를 참조하십시오.


면을 반복하는 경우면 1이 leftCell 1 및 rightCell 10,면 2가 leftCell 6 및 rightCell 31과 같이 플럭스를 계산하려면 leftCell 및 rightCell에서 정보를 가져와야합니다. . 이것이 벡터화에 어떻습니까?
chris

위에서 언급 한대로 (PETSc-FUN3D 논문에서 논의한 바와 같이) 캐시를 재사용하기 위해면을 주문합니다. 결과는 각면을 한 번만 방문하는 "단면"셀 순회와 같습니다.
Jed Brown

3

나는이 질문에 이미 답을 알고 있지만 OpenFOAM C ++ 라이브러리에서 구현되는 비슷한 단일 얼굴 기반 루핑 스토리지가 있습니다.

각 셀은 cellList에 색인 (ID)이 있습니다. 모든 얼굴에 대해 "얼굴 내부 소유자"및 "얼굴 이웃"의 두 목록이 정의됩니다. 두면리스트의 길이는 메쉬의 내부면 수에 해당합니다. 얼굴 소유자는 cellList에서 ID가 더 낮은 셀입니다 (얼굴 이웃의 반대). 경계면은 마지막에 작성되며 외형 지향 법선 (솔루션 도메인)과 물론 하나의 소유자 셀만 있습니다. 면 영역 법선은 소유자 셀에서 이웃 셀로 바깥 쪽을 향하도록 방향이 정해져 있습니다.

이것은 예를 들어 플럭스 계산에 효과적입니다. 플럭스는 면당 한 번 평가되고 소유자 셀의 총면 합계에 합산되고 인접 셀에서 공제됩니다 (합계 / 공제는면 영역 법선의 방향에 따라 결정됩니다). 경계면은면리스트의 맨 아래에 정렬되어 저장되어 경계 조건을면리스트의 조각 (시작 레이블, 경계 패치의 끝 레이블)으로 정의 할 수 있으므로 경계 조건의 구현도 단순화됩니다. 경계면 조건에 대한 업데이트 프로세스의 효율성을 높이는 것은 내부면의 작업에서 제공하는 솔루션에 의존하기 때문입니다.

경계면이 패치로 통합되기 때문에 프로세스 간 통신은 결합 된 (프로세서) 패치에 대해 정의되고 미리 정의됩니다. 이것은 경계 메시에 루프가 발생하자마자 최상위 레벨 액세스 함수가 ​​랩핑 된 MPI 호출을 불러내 어 위에서 설명한면 기반 연결에 의존하는 경우 이러한 코드를 "자동으로"병렬화합니다.


문제 없습니다.이 설명이 누군가에게 유용하다는 것을 알게되어 기쁩니다 .. :) OpenFOAM과 함께 일하고 있습니까?
tmaric

나는 과거에 조금 사용했었다. 나는 일반적으로 받아 들여지는 트렌드를 피하고 바퀴를 재발 명하려고 시도합니다. 내 타오 야
Johntra Volta

1
귀하의 Tao는 컴퓨터 과학의 Tao와 반대입니다 : "바퀴를 다시 발명하지 마십시오". 그러나 나는 그것을 이해할 수 있습니다. 처음부터 일을하는 것이 매력적입니다! :)
tmaric December
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.