동일한 구조를 가진 두 개의 서로 다른 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.