У меня есть код, который выполняет вычисления на основе прямолинейной сетки. Я намерен использовать 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, отсутствует.
У кого-нибудь есть идея, почему это так?
Файл 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, и не вижу там нарушений.
Кто-нибудь из вас имеет представление о том, что происходит.