Files
ThirdParty-6/ParaView-5.0.1/VTK/Infovis/Parallel/vtkPBGLDistributedGraphHelper.h

224 lines
8.6 KiB
C++

/*=========================================================================
Program: Visualization Toolkit
Module: vtkPBGLDistributedGraphHelper.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.
=========================================================================*/
/*
* Copyright (C) 2008 The Trustees of Indiana University.
* Use, modification and distribution is subject to the Boost Software
* License, Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt)
*/
// .NAME vtkPBGLDistributedGraphHelper - helper for the vtkGraph class that provides support for the Parallel Boost Graph Library
//
// .SECTION Description
// vtkPBGLDistributedGraphHelper is a helper class that allows a
// vtkGraph object to be distributed across several different
// processors using the Parallel Boost Graph Library (Parallel BGL, or
// PBGL). When attached to a vtkGraph instance,
// vtkPBGLDistributedGraphHelper provides the necessary communication
// support to build and manipulate distributed graphs. To enable the
// use of this class, you will need to configure VTK with the
// VTK_USE_PARALLEL_BGL option.
// @deprecated Not maintained as of VTK 6.2 and will be removed eventually.
//
// .SEEALSO
// vtkGraph vtkDistributedGraphHelper
#ifndef vtkPBGLDistributedGraphHelper_h
#define vtkPBGLDistributedGraphHelper_h
#include "vtkInfovisParallelModule.h" // For export macro
#include "vtkDistributedGraphHelper.h"
class vtkPBGLDistributedGraphHelperInternals;
//BTX
namespace boost { namespace graph { namespace distributed {
class mpi_process_group;
} } } /// end namespace boost::graph::distributed
//ETX
#if !defined(VTK_LEGACY_REMOVE)
class VTKINFOVISPARALLEL_EXPORT vtkPBGLDistributedGraphHelper : public vtkDistributedGraphHelper
{
public:
vtkTypeMacro(vtkPBGLDistributedGraphHelper,vtkDistributedGraphHelper);
// Description:
// Creates an empty Parallel BGL distributed graph helper
static vtkPBGLDistributedGraphHelper* New();
// Description:
// Synchronizes all of the processors involved in this distributed
// graph, so that all processors have a consistent view of the
// distributed graph for the computation that follows. This routine
// should be invoked after adding new edges into the distributed
// graph, so that other processors will see those edges (or their
// corresponding back-edges).
void Synchronize();
// Description:
// Clones this distributed graph helper.
vtkDistributedGraphHelper *Clone();
//BTX
// Description:
// Return the process group associated with this distributed graph.
boost::graph::distributed::mpi_process_group GetProcessGroup();
//ETX
// Description:
// The Parallel BGL-specific internal information for this distributed
// graph. TODO: Make this protected
vtkPBGLDistributedGraphHelperInternals *Internals;
void PrintSelf(ostream& os, vtkIndent indent);
protected:
vtkPBGLDistributedGraphHelper();
~vtkPBGLDistributedGraphHelper();
//BTX
enum Tags
{
// Find a vertex by pedigree ID. This always has a reply.
FIND_VERTEX_TAG,
// Find the source and target by edge ID. This always has a reply.
FIND_EDGE_SOURCE_TARGET_TAG,
// Add a vertex with the given pedigree ID.
ADD_VERTEX_NO_REPLY_TAG,
ADD_VERTEX_WITH_REPLY_TAG,
// Add a vertex with the given property array.
ADD_VERTEX_PROPS_NO_REPLY_TAG,
ADD_VERTEX_PROPS_WITH_REPLY_TAG,
// Add a back edge; the forward edge has already been added.
ADD_DIRECTED_BACK_EDGE_TAG,
ADD_UNDIRECTED_BACK_EDGE_TAG,
// Add an edge; don't reply.
ADD_DIRECTED_EDGE_NO_REPLY_TAG,
ADD_UNDIRECTED_EDGE_NO_REPLY_TAG,
// Add an edge; return the edge ID.
ADD_DIRECTED_EDGE_WITH_REPLY_TAG,
ADD_UNDIRECTED_EDGE_WITH_REPLY_TAG,
// Add an edge via (pedigree, id); don't reply.
ADD_DIRECTED_EDGE_NI_NO_REPLY_TAG,
ADD_UNDIRECTED_EDGE_NI_NO_REPLY_TAG,
// Add an edge via (pedigree, id); return the edge ID.
ADD_DIRECTED_EDGE_NI_WITH_REPLY_TAG,
ADD_UNDIRECTED_EDGE_NI_WITH_REPLY_TAG,
// Add an edge via (id, pedigree); don't reply.
ADD_DIRECTED_EDGE_IN_NO_REPLY_TAG,
ADD_UNDIRECTED_EDGE_IN_NO_REPLY_TAG,
// Add an edge via (pedigree, pedigree); don't reply.
ADD_DIRECTED_EDGE_NN_NO_REPLY_TAG,
ADD_UNDIRECTED_EDGE_NN_NO_REPLY_TAG
};
// Description:
// Add a vertex, optionally with properties, to the distributed graph.
// If vertex is non-NULL, it will be set
// to the newly-added (or found) vertex. Note that if propertyArr is
// non-NULL and the vertex data contains pedigree IDs, a vertex will
// only be added if there is no vertex with that pedigree ID.
void AddVertexInternal(vtkVariantArray *propertyArr,
vtkIdType *vertex);
// Description:
// Add a vertex with the given pedigree ID to the distributed graph. If
// vertex is non-NULL, it will receive the newly-created vertex.
void AddVertexInternal(const vtkVariant& pedigreeId, vtkIdType *vertex);
// Description:
// Add an edge (u, v) to the distributed graph. The edge may be directed
// undirected. If edge is non-null, it will receive the newly-created edge.
// If propertyArr is non-null, it specifies the properties that will be
// attached to the newly-created edge.
void AddEdgeInternal(vtkIdType u, vtkIdType v, bool directed,
vtkVariantArray *propertyArr,
vtkEdgeType *edge);
// Description:
// Adds an edge (u, v) and returns the new edge. The graph edge may
// or may not be directed, depending on the given flag. If edge is
// non-null, it will receive the newly-created edge. uPedigreeId is
// the pedigree ID of vertex u, which will be added if no vertex by
// that pedigree ID exists. If propertyArr is non-null, it specifies
// the properties that will be attached to the newly-created edge.
void AddEdgeInternal(const vtkVariant& uPedigreeId, vtkIdType v,
bool directed, vtkVariantArray *propertyArr,
vtkEdgeType *edge);
// Description:
// Adds an edge (u, v) and returns the new edge. The graph edge may
// or may not be directed, depending on the given flag. If edge is
// non-null, it will receive the newly-created edge. vPedigreeId is
// the pedigree ID of vertex u, which will be added if no vertex
// with that pedigree ID exists. If propertyArr is non-null, it specifies
// the properties that will be attached to the newly-created edge.
void AddEdgeInternal(vtkIdType u, const vtkVariant& vPedigreeId,
bool directed, vtkVariantArray *propertyArr,
vtkEdgeType *edge);
// Description:
// Adds an edge (u, v) and returns the new edge. The graph edge may
// or may not be directed, depending on the given flag. If edge is
// non-null, it will receive the newly-created edge. uPedigreeId is
// the pedigree ID of vertex u and vPedigreeId is the pedigree ID of
// vertex u, each of which will be added if no vertex by that
// pedigree ID exists. If propertyArr is non-null, it specifies
// the properties that will be attached to the newly-created edge.
void AddEdgeInternal(const vtkVariant& uPedigreeId,
const vtkVariant& vPedigreeId,
bool directed, vtkVariantArray *propertyArr,
vtkEdgeType *edge);
// Description:
// Try to find the vertex with the given pedigree ID. Returns true and
// fills in the vertex ID if the vertex is found, and returns false
// otherwise;
vtkIdType FindVertex(const vtkVariant& pedigreeId);
// Description:
// Determine the source and target of the edge with the given
// ID. Used internally by vtkGraph::GetSourceVertex and
// vtkGraph::GetTargetVertex.
void FindEdgeSourceAndTarget(vtkIdType id,
vtkIdType *source, vtkIdType *target);
// Description:
// Attach this distributed graph helper to the given graph. This will
// be called as part of vtkGraph::SetDistributedGraphHelper.
void AttachToGraph(vtkGraph *graph);
//ETX
private:
vtkPBGLDistributedGraphHelper(const vtkPBGLDistributedGraphHelper&); // Not implemented
void operator=(const vtkPBGLDistributedGraphHelper&); // Not implemented
//BTX
friend class vtkPBGLDistributedGraphHelperInternals;
//ETX
};
#endif //VTK_LEGACY_REMOVE
#endif // vtkPBGLDistributedGraphHelper_h