Неожиданный разрыв в доменных данных RectilinearGrid с ячейками-призраками - PullRequest
0 голосов
/ 01 апреля 2019

У меня есть код, который выполняет вычисления на основе прямолинейной сетки. Я намерен использовать 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++;
        } 
      }   
    }

В целях проверки я пишу vtk-файл, который я смотрю, используя Paraview. В следующем примере я использовал два процесса, и у меня всего 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, и не вижу там нарушений.

Кто-нибудь из вас имеет представление о том, что происходит.

...