VTK笔记-PLOT3D格式及探查-vtkProbeFilter
作者:互联网
PLOT3D格式
PLOT3D数据格式源于NASA,广泛用于规则网格的CFD数据文件。PLOT3D文件可以是ASCII, 也可是Fortran unformatted 或 C binary形式。
PLOT3D文件分为网格文件(XYZ 文件), 空气动力学结果文件 (Q 文件)和通用结果文件(函数文件 + 函数名称文件)。网格文件中可加入所谓的IBlank参数。
IBlank参数的定义:
IBlank是在每一网格点上给出的一个正数值,定义如下:
数值 | 意义 |
---|---|
0 | 计算域之外,非流体点 |
1 | 正常点 |
2 | 固面边界点 |
负数 | 分块网格界面点,其数值为相邻网格块的块号 |
详细的PLOT3D格式见PLOT3D 数据格式 ;
VTK中的PLOT3D
vtkMultiBlockPLOT3DReader
读取PLOT3D数据文件;
vtkMultiBlockPLOT3DReader是一个读取器对象,用于读取PLOT3D格式的文件并在输出时生成结构化网格。PLOT3D是一个计算机图形程序,旨在可视化计算流体力学的网格和解决方案。该读取器还支持NASA的OVERFLOW CFD软件使用的PLOT3D格式的变体,包括对所有Q变量的完全支持。请参阅美国宇航局艾姆斯研究中心(加利福尼亚州莫菲特)提供的“PLOT3D用户手册”。
PLOT3D文件由栅格文件(也称为XYZ文件)、可选解决方案文件(也称为Q文件)和包含用户创建数据的可选函数文件(当前不支持)组成。Q文件包含如下解决方案信息:四个参数自由流马赫数(Fsmach)、攻角(Alpha)、雷诺数(Re)和总积分时间(time)。这些信息存储在每个输出的FieldData中名为Properties的数组中(元组0:fsmach,元组1:alpha,元组2:re,元组3:time)。此外,解决方案文件还包含流密度(标量)、流动量(矢量)和流能量(标量)。
此读取器支持有限形式的时间序列数据,这些数据存储为一系列Q文件。使用超类提供的AddFileName()方法,可以定义一个文件系列。对于其他情况,例如XYZ或函数文件随时间变化,请使用vtkPlot3DMetaReader。
vtkMPIMultiBlockPLOT3DReader
vtkMPIMultiBlockPLOT3DReader类继承自vtkMultiBlockPLOT3DReader类,使用MPI-IO高效地并行读取三维域的二进制文件,使用MPI-IO取代普通的POSIX IO读取PLOT3D文件;
MPI(Message Passing Interface),是开发者们在高性能计算程序中,用于在参与计算的不同CPU、或服务器节点之间进行消息传递的一组规范或接口,通过这组接口,能帮助开发工程师们在不同的计算平台上快速编写可跨平台移植的并行计算程序,提升开发效率。设计的初衷是:让IO能够像消息传递(MPI)那样,通过标准的接口实现并行的数据读写访问。
vtkPlot3DMetaReader
读取元文件指向PLOT3D文件;
本读取器的主要目标是使PLOT3D文件的读取变得容易,特别是PLOT3D文件的时间序列。PLOT3D文件可以根据其内容采用多种不同的形式。不幸的是,它不是一种自我描述的格式,因此用户需要将有关文件内容的信息传递给读取器。通常,这是通过设置一些成员变量来实现的。本读取器的目标是提供一种简单的格式,使PLOT3D文件的编写器能够描述其设置,并将多个文件分组为一个时间序列。请注意,对于二进制文件,“自动检测格式”选项(默认情况下处于启用状态)不需要指定大多数其他选项。但是,当试图读取文件序列(即使是二进制文件)时,该读取器仍然非常有用。这个元文件的格式非常简单,并且基于JSON(不需要了解JSON就可以理解这个格式)。下面是一个示例,其中包含描述格式的注释(后跟//)。请注意,PLOT3D文件名相对于元文件的位置,除非它们以前导/开头。
#include <vtkActor.h>
#include <vtkCamera.h>
#include <vtkMultiBlockDataSet.h>
#include <vtkMultiBlockPLOT3DReader.h>
#include <vtkNamedColors.h>
#include <vtkNew.h>
#include <vtkPolyData.h>
#include <vtkPolyDataMapper.h>
#include <vtkProperty.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkStructuredGridGeometryFilter.h>
class Test_Probing
{
public:
static void Test()
{
std::string xyzFile = "G:\\Data\\VTK\\combxyz.bin";
std::string qFile = "G:\\Data\\VTK\\combq.bin";
vtkNew<vtkNamedColors> colors;
vtkNew<vtkMultiBlockPLOT3DReader> reader;
reader->SetXYZFileName(xyzFile.c_str());
reader->SetQFileName(qFile.c_str());
reader->SetScalarFunctionNumber(100);
reader->SetVectorFunctionNumber(202);
reader->Update();
vtkNew<vtkStructuredGridGeometryFilter> geometryFilter;
geometryFilter->SetInputData(reader->GetOutput()->GetBlock(0));
geometryFilter->Update();
// Visualize
vtkNew<vtkPolyDataMapper> mapper;
mapper->SetInputConnection(geometryFilter->GetOutputPort());
mapper->ScalarVisibilityOff();
vtkNew<vtkActor> actor;
actor->SetMapper(mapper);
actor->GetProperty()->SetColor(colors->GetColor3d("MistyRose").GetData());
vtkNew<vtkRenderer> renderer;
vtkNew<vtkRenderWindow> renderWindow;
renderWindow->AddRenderer(renderer);
vtkNew<vtkRenderWindowInteractor> renderWindowInteractor;
renderWindowInteractor->SetRenderWindow(renderWindow);
renderer->AddActor(actor);
renderer->SetBackground(colors->GetColor3d("DarkSlateGray").GetData());
renderer->ResetCamera();
renderer->GetActiveCamera()->SetClippingRange(3.95297, 50);
renderer->GetActiveCamera()->SetFocalPoint(8.88908, 0.595038, 29.3342);
renderer->GetActiveCamera()->SetPosition(-12.3332, 31.7479, 41.2387);
renderer->GetActiveCamera()->SetViewUp(0.060772, -0.319905, 0.945498);
renderWindow->SetWindowName("ReadPLOT3D");
renderWindow->SetSize(640, 480);
renderWindow->Render();
renderWindowInteractor->Start();
}
};
探测通过用一组点(探测)对一个数据集(输入)进行采样来获得数据集属性。探测也被称为“重采样”,例如用一条直线、一个平面或一个体积上的点序列探测输入数据集。探测的结果是一个新的数据集(输出),具有探测数据集的拓扑和几何结构,并从输入数据集中插入点属性。一旦探测操作完成,就可以使用VTK中的任何适当技术来可视化输出数据集。
这个例子说明了探测过程的细节。对于探测数据集中的每个点,确定输入数据集中的位置(即单元、子单元和参数坐标)和插值权重。然后将单元中的数据值插值到探测点。输入数据集之外的探测点被指定为nil(或适当的)值。此过程对探测数据集中的所有点重复。
#include <vtkActor.h>
#include <vtkAppendPolyData.h>
#include <vtkCamera.h>
#include <vtkContourFilter.h>
#include <vtkMultiBlockDataSet.h>
#include <vtkMultiBlockPLOT3DReader.h>
#include <vtkNamedColors.h>
#include <vtkNew.h>
#include <vtkOutlineFilter.h>
#include <vtkPlaneSource.h>
#include <vtkPolyDataMapper.h>
#include <vtkProbeFilter.h>
#include <vtkProperty.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkStructuredGrid.h>
#include <vtkStructuredGridOutlineFilter.h>
#include <vtkTransform.h>
#include <vtkTransformPolyDataFilter.h>
class Test_Probing
{
public:
static void Test()
{
std::string xyzFile = "G:\\Data\\VTK\\combxyz.bin";
std::string qFile = "G:\\Data\\VTK\\combq.bin";
vtkNew<vtkNamedColors> colors;
// create pipeline
//
vtkNew<vtkMultiBlockPLOT3DReader> pl3d;
pl3d->SetXYZFileName(xyzFile.c_str());
pl3d->SetQFileName(qFile.c_str());
pl3d->SetScalarFunctionNumber(100);
pl3d->SetVectorFunctionNumber(202);
pl3d->Update();
vtkStructuredGrid* sg = dynamic_cast<vtkStructuredGrid*>(pl3d->GetOutput()->GetBlock(0));
// We create three planes and position them in the correct position
// using transform filters. They are then appended together and used as
// a probe.
vtkNew<vtkPlaneSource> plane;
plane->SetResolution(50, 50);
vtkNew<vtkTransform> transP1;
transP1->Translate(3.7, 0.0, 28.37);
transP1->Scale(5, 5, 5);
transP1->RotateY(90);
vtkNew<vtkTransformPolyDataFilter> tpd1;
tpd1->SetInputConnection(plane->GetOutputPort());
tpd1->SetTransform(transP1);
vtkNew<vtkOutlineFilter> outTpd1;
outTpd1->SetInputConnection(tpd1->GetOutputPort());
vtkNew<vtkPolyDataMapper> mapTpd1;
mapTpd1->SetInputConnection(outTpd1->GetOutputPort());
vtkNew<vtkActor> tpd1Actor;
tpd1Actor->SetMapper(mapTpd1);
tpd1Actor->GetProperty()->SetColor(0, 0, 0);
tpd1Actor->GetProperty()->SetLineWidth(2.0);
vtkNew<vtkTransform> transP2;
transP2->Translate(9.2, 0.0, 31.20);
transP2->Scale(5, 5, 5);
transP2->RotateY(90);
vtkNew<vtkTransformPolyDataFilter> tpd2;
tpd2->SetInputConnection(plane->GetOutputPort());
tpd2->SetTransform(transP2);
vtkNew<vtkOutlineFilter> outTpd2;
outTpd2->SetInputConnection(tpd2->GetOutputPort());
vtkNew<vtkPolyDataMapper> mapTpd2;
mapTpd2->SetInputConnection(outTpd2->GetOutputPort());
vtkNew<vtkActor> tpd2Actor;
tpd2Actor->SetMapper(mapTpd2);
tpd2Actor->GetProperty()->SetColor(0, 0, 0);
tpd2Actor->GetProperty()->SetLineWidth(2.0);
vtkNew<vtkTransform> transP3;
transP3->Translate(13.27, 0.0, 33.30);
transP3->Scale(5, 5, 5);
transP3->RotateY(90);
vtkNew<vtkTransformPolyDataFilter> tpd3;
tpd3->SetInputConnection(plane->GetOutputPort());
tpd3->SetTransform(transP3);
vtkNew<vtkOutlineFilter> outTpd3;
outTpd3->SetInputConnection(tpd3->GetOutputPort());
vtkNew<vtkPolyDataMapper> mapTpd3;
mapTpd3->SetInputConnection(outTpd3->GetOutputPort());
vtkNew<vtkActor> tpd3Actor;
tpd3Actor->SetMapper(mapTpd3);
tpd3Actor->GetProperty()->SetColor(0, 0, 0);
tpd3Actor->GetProperty()->SetLineWidth(2.0);
vtkNew<vtkAppendPolyData> appendF;
appendF->AddInputConnection(tpd1->GetOutputPort());
appendF->AddInputConnection(tpd2->GetOutputPort());
appendF->AddInputConnection(tpd3->GetOutputPort());
// The vtkProbeFilter takes two inputs. One is a dataset to use as the probe
// geometry (SetInputConnection); the other is the data to probe
// (SetSourceConnection). The output dataset structure (geometry and
// topology) of the probe is the same as the structure of the input. The
// probing process generates new data values resampled from the source.
vtkNew<vtkProbeFilter> probe;
probe->SetInputConnection(appendF->GetOutputPort());
probe->SetSourceData(sg);
vtkNew<vtkContourFilter> contour;
contour->SetInputConnection(probe->GetOutputPort());
contour->GenerateValues(50, sg->GetScalarRange());
vtkNew<vtkPolyDataMapper> contourMapper;
contourMapper->SetInputConnection(contour->GetOutputPort());
contourMapper->SetScalarRange(sg->GetScalarRange());
vtkNew<vtkActor> planeActor;
planeActor->SetMapper(contourMapper);
vtkNew<vtkStructuredGridOutlineFilter> outline;
outline->SetInputData(sg);
vtkNew<vtkPolyDataMapper> outlineMapper;
outlineMapper->SetInputConnection(outline->GetOutputPort());
vtkNew<vtkActor> outlineActor;
outlineActor->SetMapper(outlineMapper);
outlineActor->GetProperty()->SetColor(0, 0, 0);
outlineActor->GetProperty()->SetLineWidth(2.0);
// Create the RenderWindow, Renderer and both Actors
//
vtkNew<vtkRenderer> ren1;
vtkNew<vtkRenderWindow> renWin;
renWin->AddRenderer(ren1);
vtkNew<vtkRenderWindowInteractor> iren;
iren->SetRenderWindow(renWin);
ren1->AddActor(outlineActor);
ren1->AddActor(planeActor);
ren1->AddActor(tpd1Actor);
ren1->AddActor(tpd2Actor);
ren1->AddActor(tpd3Actor);
ren1->SetBackground(colors->GetColor3d("Gainsboro").GetData());
renWin->SetSize(640, 480);
renWin->SetWindowName("ProbeCombustor");
ren1->ResetCamera();
ren1->GetActiveCamera()->SetClippingRange(3.95297, 50);
ren1->GetActiveCamera()->SetFocalPoint(8.88908, 0.595038, 29.3342);
ren1->GetActiveCamera()->SetPosition(-12.3332, 31.7479, 41.2387);
ren1->GetActiveCamera()->SetViewUp(0.060772, -0.319905, 0.945498);
renWin->Render();
iren->Start();
}
};
使用的数据文件位置:
参考资料
1.PLOT3D 数据格式
2.关于MPI-IO,你该知道的
标签:文件,GetOutputPort,VTK,SetInputConnection,PLOT3D,include,vtkProbeFilter,vtkNew 来源: https://blog.csdn.net/liushao1031177/article/details/117073760