동일한 구조를 가진 두 개의 서로 다른 VTK 파일에 저장된 두 필드 간의 숫자 차이를 어떻게 계산합니까?


15

구조화 된 격자 형식의 두 개의 VTK 파일이 있다고 가정합니다. 구조화 된 그리드는 동일하며 (동일한 순서로 포인트 목록이 동일 함) 각 VTK 파일에서 필드를 "Phi"라고합니다. 동일한 구조화 된 그리드로 세 번째 VTK 파일을 다시 만들고 첫 번째 VTK 파일의 Phi와 두 번째 VTK 파일의 Phi의 차이 인 필드를 플로팅하려고합니다.

이 작업을 수동으로 수행하는 방법을 알고 있습니다. 두 개의 VTK 파일에서 원시 텍스트를 구문 분석하고 데이터를 배열로 복사하고 한 배열에서 다른 배열을 뺀 다음 올바른 형식의 데이터를 새 파일로 덤프 할 수 있습니다. 이 차이를 계산하고 VTK로 내보내는 더 좋은 방법이 있습니까? C ++과 같은 컴파일 된 언어를 사용하는 것보다 Python 또는 VisIt 또는 Paraview와 같은 시각화 소프트웨어의 솔루션이 선호됩니다.

이 차이를 계산하는 목적은 PDE의 솔루션을 계산하기 위해 다른 수치 방법을 비교하는 것입니다. 동일한 소프트웨어를 사용하여 솔루션을 생성하므로 Phi 필드를 제외한 모든 데이터가 내가 생성하는 각 파일에서 동일하다는 것을 보장 할 수 있습니다.


이 질문에 답을 찾기 위해 하루나 반 정도 걸렸기 때문에이 질문을 게시했습니다. 어제 그것을 찾지 못했다면 어쨌든 여기 에이 질문을했을 것입니다. 동일한 작업을 수행하는 다른 빠른 방법이 있는지 확인하고 싶습니다.
Geoff Oxberry

"원시 텍스트 구문 분석"이라고 말하면 파일에 그대로 들어가거나 파이썬 파서를 사용한다는 의미입니까?
SAAD

당시 필자는 손으로 파이썬 파서를 작성하는 것을 의미했다.
Geoff Oxberry

답변:


16

구조화 된 격자가 동일한 서로 다른 VTK 파일에서 두 개의 필드를 빼는 가장 쉬운 방법은 Paraview에서 프로그래밍 가능 필터를 사용하여 Python 스크립트를 사용하여 데이터를 조작하는 것입니다.

프로그램 가능 필터 대화 상자에서 두 배열을 빼고 코드를 사용하여 출력에 쓸 수 있습니다.

   phi_0 = inputs[0].CellData['Phi']
   phi_1 = inputs[1].CellData['Phi']
   output.CellData.append(phi_1 - phi_0, 'difference')

이 경우, 필드 Phi는 셀 데이터가된다. 필드가 포인트 데이터 인 CellData경우 스크립트의 모든 위치를로 바꿉니다 PointData. 자세한 내용은 http://public.kitware.com/pipermail/paraview/2010-April/016667.html 을 참조 하십시오.


4
두 개의 입력 (입력 [0] 및 입력 [1])을 가지려면 프로그램 가능 필터를 선택하기 전에 두 데이터 세트를 강조 표시해야합니다 (이것은 참조 된 링크 중 하나로 언급 됨).
toliveira jan

3

ParaView에는이를 위해 사용할 수있는 Append Attributes 필터가 있습니다. 포인트 데이터를 올바르게 추가하기 위해 데이터 세트에 동일한 수의 포인트가 있어야하고 셀 데이터를 올바르게 추가하기 위해 데이터 세트에 동일한 수의 셀이 있어야합니다. 같은 이름의 배열 (예 : Phi)에는 문제가 있습니다. Append Attributes 필터를 사용하기 전에 계산기 필터를 사용하여 해당 배열을 쉽게 복사 할 수 있습니다. 그런 다음 다른 계산기 필터를 사용하여 빼기를 수행 할 수 있습니다. 이것은 아마도 ParaView의 Python 프로그램 가능 필터를 사용하는 것보다 덜 효율적입니다. 게다가 그리드와 속성에 직접 액세스 할 수 있기 때문에 vtkpython 실행 파일을 사용하여 수동으로 수행 할 수 있습니다.


1

특히 좋은 접근 방법은 없지만 한 VTK 파일에서 다른 파일로 'phi'필드를 복사하고 이름을 'phiprime'또는 다른 이름으로 지정합니다. 조회 및 방문 모두에서 다른 필드의 값을 사용하는 수식으로 새 필드를 정의 할 수 있습니다. 그런 다음 필드 편집기에서 "error"필드를 "error = phi-phiprime"으로 정의하고이 필드 "error"를 표면, 등고선 플롯 또는 관심있는 대상으로 플롯 할 수 있습니다.

한 파일에서 다른 파일로 데이터 블록을 복사하는 단계는 분명히 어색하지만, 내가 얻을 수있는 최선의 방법입니다.


1

나는 이것이 조금 더 오래되었다는 것을 깨달았지만 VisIt 솔루션에 관심이있을 수도 있습니다.

VisIt에서 Connectively Based Cross Mesh Field Expression이라는 것을 사용하여이 작업을 수행 할 수 있습니다. 그것은 한 입이지만 기본적으로 데이터베이스 (필드의 경우 VTK 파일) 사이의 필드를 매핑하는 기계입니다.

"연결 기반"(conn_cmfe)은 사용자의 경우처럼 파일간에 토폴로지가 동일 할 때 사용됩니다.

토폴로지가 다른 메시 사이에서 샘플링하는 "위치 기반"(pos_cmfe)도 있습니다.

귀하의 경우 첫 번째 파일을 열고 표현식 창을 사용하여 표현식 (MyPhi_Diff)을 정의하십시오.

Phi - conn_cmfe(<file2.vtk:Phi>, mesh)

그런 다음 Pseudocolor 플롯으로 "MyPhi_Diff"를 플롯 할 수 있습니다.

식을 정의하는 데 도움이되는 마법사도 있습니다

(옵션 메뉴-> "데이터 수준 비교")

더 자세한 정보는 다음과 같습니다.

http://visitusers.org/index.php?title=Cmfe

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.