You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
123 lines
5.1 KiB
C
123 lines
5.1 KiB
C
3 weeks ago
|
/*=========================================================================
|
||
|
|
||
|
Program: Visualization Toolkit
|
||
|
Module: vtkHyperTreeGridGhostCellsGenerator.h
|
||
|
|
||
|
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
|
||
|
All rights reserved.
|
||
|
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
|
||
|
|
||
|
This software is distributed WITHOUT ANY WARRANTY; without even
|
||
|
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||
|
PURPOSE. See the above copyright notice for more information.
|
||
|
|
||
|
=========================================================================*/
|
||
|
/**
|
||
|
* @class vtkHyperTreeGridGhostCellsGenerator
|
||
|
* @brief Generated ghost cells (HyperTree's distributed).
|
||
|
*
|
||
|
* This filter generates ghost cells for vtkHyperTreeGrid type data. The input vtkHyperTreeGrid
|
||
|
* should have hyper trees distributed to a single process. This filter produces ghost hyper trees
|
||
|
* at the interfaces between different processes, only composed of the nodes and leafs at this
|
||
|
* interface to avoid data waste.
|
||
|
*
|
||
|
* This filter should be used in a multi-processes environment, and is only required if wanting to
|
||
|
* filter a vtkHyperTreeGrid with algorithms using Von Neumann or Moore supercursors afterwards.
|
||
|
*
|
||
|
* @par Thanks:
|
||
|
* This class was written by Jacques-Bernard Lekien, 2019
|
||
|
* This work was supported by Commissariat a l'Energie Atomique
|
||
|
* CEA, DAM, DIF, F-91297 Arpajon, France.
|
||
|
*/
|
||
|
|
||
|
#ifndef vtkHyperTreeGridGhostCellsGenerator_h
|
||
|
#define vtkHyperTreeGridGhostCellsGenerator_h
|
||
|
|
||
|
#include "vtkFiltersParallelModule.h" // For export macro
|
||
|
#include "vtkHyperTreeGridAlgorithm.h"
|
||
|
|
||
|
#include <vector> // For vtkHypertreeGridGhostCellsGenerator::ExtractInterface
|
||
|
|
||
|
class vtkBitArray;
|
||
|
class vtkHyperTreeGrid;
|
||
|
class vtkHyperTreeGridNonOrientedCursor;
|
||
|
class vtkPointData;
|
||
|
|
||
|
class VTKFILTERSPARALLEL_EXPORT vtkHyperTreeGridGhostCellsGenerator
|
||
|
: public vtkHyperTreeGridAlgorithm
|
||
|
{
|
||
|
public:
|
||
|
static vtkHyperTreeGridGhostCellsGenerator* New();
|
||
|
vtkTypeMacro(vtkHyperTreeGridGhostCellsGenerator, vtkHyperTreeGridAlgorithm);
|
||
|
void PrintSelf(ostream&, vtkIndent) override;
|
||
|
|
||
|
protected:
|
||
|
vtkHyperTreeGridGhostCellsGenerator();
|
||
|
~vtkHyperTreeGridGhostCellsGenerator() override;
|
||
|
|
||
|
struct vtkInternals;
|
||
|
|
||
|
/**
|
||
|
* For this algorithm the output is a vtkHyperTreeGrid instance
|
||
|
*/
|
||
|
int FillOutputPortInformation(int, vtkInformation*) override;
|
||
|
|
||
|
/**
|
||
|
* Main routine to extract cells based on thresholded value
|
||
|
*/
|
||
|
int ProcessTrees(vtkHyperTreeGrid*, vtkDataObject*) override;
|
||
|
|
||
|
/**
|
||
|
* Copies the input to the output, filling memory gaps if present.
|
||
|
*/
|
||
|
void CopyInputTreeToOutput(vtkHyperTreeGridNonOrientedCursor* inCursor,
|
||
|
vtkHyperTreeGridNonOrientedCursor* outCursor, vtkPointData* inPointData,
|
||
|
vtkPointData* outPointData, vtkBitArray* inMask, vtkBitArray* outMask);
|
||
|
|
||
|
/**
|
||
|
* Reads the input interface with neighbor processes.
|
||
|
* This method is built in mirror with vtkHyperTreeGridGhostCellsGenerator::CreateGhostTree
|
||
|
*
|
||
|
* @param inCursor Cursor on the current tree to read from the input
|
||
|
* @param isParent A bit array being produced by this filter,
|
||
|
* telling if the corresponding node is parent or not. A node is
|
||
|
* a parent if it is not a leaf. The map of the tracking is stored in indices.
|
||
|
* For example, if the data array of the input is called inArray,
|
||
|
* isParent->GetValue(m) equals one if inArray->GetTuple1(indices[m]) is not a leaf.
|
||
|
* @param indices An array produced by this filter mapping the nodes of the interface with their
|
||
|
* location in the input data array.
|
||
|
* @param grid Input vtkHyperTreeGrid used to have the neighborhood profile. This neighborhood
|
||
|
* profile is tested with the mask parameter to know wether to descend or not in the current hyper
|
||
|
* tree.
|
||
|
* @param mask Input parameter which should be shaped as vtkHyperTreeGrid::GetChildMask() of the
|
||
|
* input. This parameter is used to only descend on the interface with the other processes.
|
||
|
* @param pos This parameter will be equal to the number of nodes in the hyper tree to send to the
|
||
|
* other processes.
|
||
|
*/
|
||
|
void ExtractInterface(vtkHyperTreeGridNonOrientedCursor* inCursor, vtkBitArray* isParent,
|
||
|
std::vector<vtkIdType>& indices, vtkHyperTreeGrid* grid, unsigned int mask, vtkIdType& pos);
|
||
|
|
||
|
/**
|
||
|
* Creates a ghost tree in the output. It is built in mirror with
|
||
|
* vtkHyperTreeGridGhostCellsGenerator::ExtractInterface.
|
||
|
*
|
||
|
* @param outCursor Cursor on the output tree that will create the hyper tree.
|
||
|
* @param isParent Input vtkBitArray produced by a neighbor process to tell if the current node is
|
||
|
* a leaf or not.
|
||
|
* @param indices Output array mapping the created nodes to their position in the output data
|
||
|
* arrays.
|
||
|
* @param pos Parameter which should be left untouched, it is used to keep track of the number of
|
||
|
* inserted data.
|
||
|
*/
|
||
|
vtkIdType CreateGhostTree(vtkHyperTreeGridNonOrientedCursor* outCursor, vtkBitArray* isParent,
|
||
|
vtkIdType* indices, vtkIdType&& pos = 0);
|
||
|
|
||
|
vtkInternals* Internals;
|
||
|
|
||
|
private:
|
||
|
vtkHyperTreeGridGhostCellsGenerator(const vtkHyperTreeGridGhostCellsGenerator&) = delete;
|
||
|
void operator=(const vtkHyperTreeGridGhostCellsGenerator&) = delete;
|
||
|
};
|
||
|
|
||
|
#endif /* vtkHyperTreeGridGhostCellsGenerator */
|