我有一个基于直线网格进行计算的代码。我打算将Catalyst用于现场可视化。我想出了如何设置网格定义以及如何添加字段的方法,但我一直在努力正确处理鬼单元。在下面的代码部分中,我标记了受CxxGhostCellsExample启发的鬼单元。
vtkNew<vtkUnsignedCharArray> ghostCells;
ghostCells->SetNumberOfTuples(grid->GetNumberOfCells());
ghostCells->SetName(vtkDataSetAttributes::GhostArrayName());
ghostCells->Fill(0);
grid->GetCellData()->AddArray(ghostCells);
vtkIdType cellId = 0;
for (int k = *ks; k < *ke+1; k++)
{
bool zGhosts = (k == *ks) || (k == *ke);
for (int j = *js; j < *je+1; j++)
{
bool yGhosts = (j == *js) || (j == *je);
for (int i = *is; i < *ie+1; i++)
{
bool xGhosts = (i == *is) || (i == *ie);
if (xGhosts || yGhosts || zGhosts)
{
ghostCells->SetValue(cellId, ghostCells->GetValue(cellId) | vtkDataSetAttributes::DUPLICATECELL);
}
cellId++;
}
}
}
出于验证目的,我正在编写一个使用Paraview查看的vtk文件。 在以下示例中,我使用了两个过程,总共有7×6×5个单元。第一个过程得到5×6×5个单元格,第二个过程得到4×6×5个单元格。由于每个进程的单元在所有六个侧面上都包含一层幻影单元,因此它们在x方向上重叠了两层。
在这里,我正在看垂直于y轴的切片。淡蓝色的细胞属于等级0。我希望看到3×3的单元格,这很好。由于某种原因,rank1写入的单元格不是完全可见。这里缺少垂直于x轴的第一层细胞。
有人知道为什么会这样吗?
由催化剂写入的pvtr
文件读取
<VTKFile type="PRectilinearGrid" version="1.0" byte_order="LittleEndian" header_type="UInt64">
<PRectilinearGrid WholeExtent="0 7 0 6 0 5" GhostLevel="0">
<PCellData>
<PDataArray type="UInt8" Name="vtkGhostType"/>
<PDataArray type="Float64" Name="pressure"/>
</PCellData>
<PCoordinates>
<PDataArray type="Float64"/>
<PDataArray type="Float64"/>
<PDataArray type="Float64"/>
</PCoordinates>
<Piece Extent="0 5 0 6 0 5" Source="pressure_20/pressure_20_0.vtr"/>
<Piece Extent="3 7 0 6 0 5" Source="pressure_20/pressure_20_1.vtr"/>
</PRectilinearGrid>
</VTKFile>
确认两个部分包含正确数量的单元格。我的代码仅将每侧的一层单元格标记为幻像单元格,因此我看不出为什么应该有间隙。 我还在打印i,j和k的单元格ID和值,但那里没有异常。
你们中的每个人都知道发生了什么吗