带有重影单元的域分解RectilinearGrid数据中的意外间隙

时间:2019-04-01 13:42:15

标签: catalyst paraview

我有一个基于直线网格进行计算的代码。我打算将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轴的第一层细胞。

demo slice

有人知道为什么会这样吗?

由催化剂写入的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和值,但那里没有异常。

你们中的每个人都知道发生了什么吗

0 个答案:

没有答案