Nektar++
Public Member Functions | Static Public Member Functions | Static Public Attributes | Private Member Functions | List of all members
Nektar::SpatialDomains::MeshPartitionScotch Class Reference

#include <MeshPartitionScotch.h>

Inheritance diagram for Nektar::SpatialDomains::MeshPartitionScotch:
[legend]

Public Member Functions

 MeshPartitionScotch (const LibUtilities::SessionReaderSharedPtr session, LibUtilities::CommSharedPtr comm, int meshDim, std::map< int, MeshEntity > element, CompositeDescriptor compMap)
 
virtual ~MeshPartitionScotch ()
 
- Public Member Functions inherited from Nektar::SpatialDomains::MeshPartition
 MeshPartition (const LibUtilities::SessionReaderSharedPtr session, LibUtilities::CommSharedPtr comm, int meshDim, std::map< int, MeshEntity > element, CompositeDescriptor compMap)
 
virtual ~MeshPartition ()
 
void PartitionMesh (int nParts, bool shared=false, bool overlapping=false, int nLocal=0)
 
void PrintPartInfo (std::ostream &out)
 
void GetElementIDs (const int procid, std::vector< unsigned int > &tmp)
 

Static Public Member Functions

static MeshPartitionSharedPtr create (const LibUtilities::SessionReaderSharedPtr session, LibUtilities::CommSharedPtr comm, int meshDim, std::map< int, MeshEntity > element, CompositeDescriptor compMap)
 Creates an instance of this class. More...
 

Static Public Attributes

static std::string className
 Name of class. More...
 
static std::string cmdSwitch
 

Private Member Functions

virtual void PartitionGraphImpl (int &nVerts, int &nVertConds, Nektar::Array< Nektar::OneD, int > &xadj, Nektar::Array< Nektar::OneD, int > &adjcy, Nektar::Array< Nektar::OneD, int > &vertWgt, Nektar::Array< Nektar::OneD, int > &vertSize, Nektar::Array< Nektar::OneD, int > &edgeWgt, int &nparts, int &volume, Nektar::Array< Nektar::OneD, int > &part)
 
void PartGraphVKway (const SCOTCH_Num *const n, const SCOTCH_Num *const xadj, const SCOTCH_Num *const adjncy, const SCOTCH_Num *const vwgt, const SCOTCH_Num *const vsize, const SCOTCH_Num *const wgtflag, const SCOTCH_Num *const numflag, const SCOTCH_Num *const nparts, SCOTCH_Num *const volume, SCOTCH_Num *const part)
 
int PartGraph2 (const SCOTCH_Num *const n, const SCOTCH_Num *const xadj, const SCOTCH_Num *const adjncy, const SCOTCH_Num *const vwgt, const SCOTCH_Num *const adjwgt, const SCOTCH_Num *const numflag, const SCOTCH_Num *const nparts, SCOTCH_Num *const part, SCOTCH_Num flagval, double kbalval)
 

Additional Inherited Members

- Protected Types inherited from Nektar::SpatialDomains::MeshPartition
typedef std::vector< unsigned int > MultiWeight
 
typedef boost::adjacency_list< boost::setS, boost::vecS, boost::undirectedS, GraphVertexProperties, boost::property< boost::edge_index_t, unsigned int, GraphEdgeProperties > > BoostGraph
 
typedef boost::graph_traits< BoostGraph >::vertex_descriptor BoostVertex
 
typedef boost::graph_traits< BoostGraph >::edge_descriptor BoostEdge
 
typedef boost::graph_traits< BoostGraph >::edge_iterator BoostEdgeIterator
 
typedef boost::graph_traits< BoostGraph >::vertex_iterator BoostVertexIterator
 
typedef boost::graph_traits< BoostGraph >::adjacency_iterator BoostAdjacencyIterator
 
typedef std::vector< unsigned int > NumModes
 
typedef std::map< std::string, NumModesNummodesPerField
 
- Protected Member Functions inherited from Nektar::SpatialDomains::MeshPartition
void ReadExpansions ()
 
void ReadConditions ()
 
void WeightElements ()
 
void CreateGraph ()
 
void PartitionGraph (int nParts, bool overlapping=false)
 Partition the graph. More...
 
void CheckPartitions (int nParts, Array< OneD, int > &pPart)
 
int CalculateElementWeight (LibUtilities::ShapeType elmtType, bool bndWeight, int na, int nb, int nc)
 
int CalculateEdgeWeight (LibUtilities::ShapeType elmtType, int na, int nb, int nc)
 
- Protected Attributes inherited from Nektar::SpatialDomains::MeshPartition
LibUtilities::SessionReaderSharedPtr m_session
 
LibUtilities::CommSharedPtr m_comm
 
int m_dim
 
int m_numFields
 
std::map< int, MeshEntitym_elements
 
std::map< int, MeshEntitym_ghostElmts
 
CompositeDescriptor m_compMap
 
std::map< int, NummodesPerFieldm_expansions
 
std::map< int, LibUtilities::ShapeTypem_shape
 
std::map< std::string, int > m_fieldNameToId
 
std::map< int, MultiWeightm_vertWeights
 
std::map< int, MultiWeightm_vertBndWeights
 
std::map< int, MultiWeightm_edgeWeights
 
BoostGraph m_graph
 
std::map< int, std::vector< unsigned int > > m_localPartition
 
bool m_weightingRequired
 
bool m_weightBnd
 
bool m_weightDofs
 
bool m_shared
 
bool m_parallel
 

Detailed Description

Definition at line 51 of file MeshPartitionScotch.h.

Constructor & Destructor Documentation

◆ MeshPartitionScotch()

Nektar::SpatialDomains::MeshPartitionScotch::MeshPartitionScotch ( const LibUtilities::SessionReaderSharedPtr  session,
LibUtilities::CommSharedPtr  comm,
int  meshDim,
std::map< int, MeshEntity element,
CompositeDescriptor  compMap 
)

Definition at line 54 of file MeshPartitionScotch.cpp.

60  : MeshPartition(session, comm, meshDim, element, compMap)
61  {
62  }
MeshPartition(const LibUtilities::SessionReaderSharedPtr session, LibUtilities::CommSharedPtr comm, int meshDim, std::map< int, MeshEntity > element, CompositeDescriptor compMap)

◆ ~MeshPartitionScotch()

Nektar::SpatialDomains::MeshPartitionScotch::~MeshPartitionScotch ( )
virtual

Definition at line 64 of file MeshPartitionScotch.cpp.

65  {
66 
67  }

Member Function Documentation

◆ create()

static MeshPartitionSharedPtr Nektar::SpatialDomains::MeshPartitionScotch::create ( const LibUtilities::SessionReaderSharedPtr  session,
LibUtilities::CommSharedPtr  comm,
int  meshDim,
std::map< int, MeshEntity element,
CompositeDescriptor  compMap 
)
inlinestatic

Creates an instance of this class.

Definition at line 55 of file MeshPartitionScotch.h.

61  {
63  session, comm, meshDim, element, compMap);
64  }
static std::shared_ptr< DataType > AllocateSharedPtr(const Args &...args)
Allocate a shared pointer from the memory pool.

References Nektar::MemoryManager< DataType >::AllocateSharedPtr().

◆ PartGraph2()

int Nektar::SpatialDomains::MeshPartitionScotch::PartGraph2 ( const SCOTCH_Num *const  n,
const SCOTCH_Num *const  xadj,
const SCOTCH_Num *const  adjncy,
const SCOTCH_Num *const  vwgt,
const SCOTCH_Num *const  adjwgt,
const SCOTCH_Num *const  numflag,
const SCOTCH_Num *const  nparts,
SCOTCH_Num *const  part,
SCOTCH_Num  flagval,
double  kbalval 
)
private

Definition at line 229 of file MeshPartitionScotch.cpp.

240  {
241  // Scotch graph object to interface with libScotch
242  SCOTCH_Graph * grafdat = SCOTCH_graphAlloc();
243  SCOTCH_Strat stradat;
244  SCOTCH_Num baseval;
245  SCOTCH_Num vertnbr;
246  int o;
247 
248  SCOTCH_graphInit (grafdat);
249 
250  baseval = *numflag;
251  vertnbr = *n;
252 
253  o = 1; // Assume something will go wrong
254  if (SCOTCH_graphBuild (grafdat, baseval, vertnbr, xadj, xadj + 1,
255  vwgt, NULL, xadj[vertnbr] - baseval, adjncy,
256  adjwgt) == 0) {
257  SCOTCH_stratInit (&stradat);
258  SCOTCH_stratGraphMapBuild (&stradat, flagval, *nparts, kbalval);
259 #ifdef SCOTCH_DEBUG_ALL
260  // TRICK: next instruction called only if graph is consistent
261  if (SCOTCH_graphCheck (grafdat) == 0)
262 #endif /* SCOTCH_DEBUG_ALL */
263  o = SCOTCH_graphPart (grafdat, *nparts, &stradat, part);
264  SCOTCH_stratExit (&stradat);
265  }
266  SCOTCH_graphExit (grafdat);
267 
268  if (o != 0)
269  return (1);
270 
271  if (baseval != 0) { // MeTiS part array is based, Scotch is not
272  SCOTCH_Num vertnum;
273 
274  for (vertnum = 0; vertnum < vertnbr; vertnum ++)
275  part[vertnum] += baseval;
276  }
277 
278  return (0);
279  }

Referenced by PartGraphVKway().

◆ PartGraphVKway()

void Nektar::SpatialDomains::MeshPartitionScotch::PartGraphVKway ( const SCOTCH_Num *const  n,
const SCOTCH_Num *const  xadj,
const SCOTCH_Num *const  adjncy,
const SCOTCH_Num *const  vwgt,
const SCOTCH_Num *const  vsize,
const SCOTCH_Num *const  wgtflag,
const SCOTCH_Num *const  numflag,
const SCOTCH_Num *const  nparts,
SCOTCH_Num *const  volume,
SCOTCH_Num *const  part 
)
private

Communication volume of current vertex

Definition at line 104 of file MeshPartitionScotch.cpp.

115  {
116  SCOTCH_Num baseval;
117  const SCOTCH_Num * vwgt2;
118  const SCOTCH_Num * vsize2;
119  SCOTCH_Num vsizval; /// Communication volume of current vertex
120  SCOTCH_Num vertnbr;
121  SCOTCH_Num vertnum;
122  SCOTCH_Num edgenum;
123  const SCOTCH_Num * edgetax;
124  const SCOTCH_Num * parttax;
125  SCOTCH_Num * nghbtab;
126  SCOTCH_Num commvol;
127 
128  vsize2 = ((*wgtflag & 1) != 0) ? vsize : NULL;
129  vwgt2 = ((*wgtflag & 2) != 0) ? vwgt : NULL;
130  baseval = *numflag;
131  vertnbr = *n;
132  edgetax = adjncy - baseval;
133 
134  // If no communication load data provided
135  if (vsize2 == NULL) {
136  if (PartGraph2 (n, xadj, adjncy, vwgt2, NULL, numflag, nparts,
137  part, SCOTCH_STRATQUALITY, 0.01) != 0)
138  return;
139  }
140 
141  // Will have to turn communication volumes into edge loads
142  else {
143  const SCOTCH_Num * vsiztax;
144  SCOTCH_Num edgenbr;
145  SCOTCH_Num * edlotax;
146  int o;
147 
148  edgenbr = xadj[vertnbr] - baseval;
149  if ((edlotax =
150  (SCOTCH_Num*) malloc (edgenbr * sizeof (SCOTCH_Num))) == NULL)
151  {
152  return;
153  }
154 
155  edlotax -= baseval; // Base access to edlotax
156  vsiztax = vsize2 - baseval;
157 
158  // Un-based scan of vertex array xadj
159  for (vertnum = 0, edgenum = baseval;
160  vertnum < vertnbr; vertnum ++) {
161  SCOTCH_Num vsizval; // Communication size of current vertex
162  SCOTCH_Num edgennd;
163 
164  vsizval = vsize2[vertnum];
165  // Based traversal of edge array adjncy
166  for (edgennd = xadj[vertnum + 1];
167  edgenum < edgennd;
168  edgenum ++) {
169 
170  SCOTCH_Num vertend; // Based end vertex number
171 
172  vertend = edgetax[edgenum];
173  edlotax[edgenum] = vsizval + vsiztax[vertend];
174  }
175  }
176 
177  o = PartGraph2 (n, xadj, adjncy, vwgt2, edlotax + baseval, numflag,
178  nparts, part, SCOTCH_STRATQUALITY, 0.01);
179 
180  free (edlotax + baseval);
181 
182  if (o != 0)
183  return;
184  }
185 
186  if ((nghbtab =
187  (SCOTCH_Num*) malloc (*nparts * sizeof (SCOTCH_Num))) == NULL)
188  {
189  return;
190  }
191 
192  memset (nghbtab, ~0, *nparts * sizeof (SCOTCH_Num));
193 
194  parttax = part - baseval;
195  vsizval = 1; // Assume no vertex communication sizes
196 
197  // Un-based scan of vertex array xadj
198  for (vertnum = 0, edgenum = baseval, commvol = 0;
199  vertnum < vertnbr; vertnum ++) {
200  SCOTCH_Num partval;
201  SCOTCH_Num edgennd;
202 
203  partval = part[vertnum];
204  nghbtab[partval] = vertnum; // Do not count local neighbors in
205  // communication volume
206  if (vsize2 != NULL)
207  vsizval = vsize2[vertnum];
208 
209  // Based traversal of edge array adjncy
210  for (edgennd = xadj[vertnum + 1]; edgenum < edgennd; edgenum ++) {
211  SCOTCH_Num vertend; // Based end vertex number
212  SCOTCH_Num partend;
213 
214  vertend = edgetax[edgenum];
215  partend = parttax[vertend];
216 
217  // If first neighbor in this part set part as accounted for
218  if (nghbtab[partend] != vertnum) {
219  nghbtab[partend] = vertnum;
220  commvol += vsizval;
221  }
222  }
223  }
224  *volume = commvol;
225 
226  free (nghbtab);
227  }
int PartGraph2(const SCOTCH_Num *const n, const SCOTCH_Num *const xadj, const SCOTCH_Num *const adjncy, const SCOTCH_Num *const vwgt, const SCOTCH_Num *const adjwgt, const SCOTCH_Num *const numflag, const SCOTCH_Num *const nparts, SCOTCH_Num *const part, SCOTCH_Num flagval, double kbalval)

References PartGraph2().

Referenced by PartitionGraphImpl().

◆ PartitionGraphImpl()

void Nektar::SpatialDomains::MeshPartitionScotch::PartitionGraphImpl ( int &  nVerts,
int &  nVertConds,
Nektar::Array< Nektar::OneD, int > &  xadj,
Nektar::Array< Nektar::OneD, int > &  adjcy,
Nektar::Array< Nektar::OneD, int > &  vertWgt,
Nektar::Array< Nektar::OneD, int > &  vertSize,
Nektar::Array< Nektar::OneD, int > &  edgeWgt,
int &  nparts,
int &  volume,
Nektar::Array< Nektar::OneD, int > &  part 
)
privatevirtual

Implements Nektar::SpatialDomains::MeshPartition.

Definition at line 69 of file MeshPartitionScotch.cpp.

80  {
81  boost::ignore_unused(nVertConds, edgeWgt);
82 
83  int wgtflag = 0;
84  int *vwgt = 0;
85  int *vsize = 0;
86  if (vertWgt.size() > 0)
87  {
88  wgtflag += 1;
89  vwgt = &vertWgt[0];
90  }
91  if (vertSize.size() > 0)
92  {
93  wgtflag += 2;
94  vsize = &vertSize[0];
95  }
96  int numflag = 0;
97 
98  PartGraphVKway(&nVerts, &xadj[0], &adjcy[0], vwgt, vsize,
99  &wgtflag, &numflag, &nparts, &volume,
100  &part[0]);
101  }
void PartGraphVKway(const SCOTCH_Num *const n, const SCOTCH_Num *const xadj, const SCOTCH_Num *const adjncy, const SCOTCH_Num *const vwgt, const SCOTCH_Num *const vsize, const SCOTCH_Num *const wgtflag, const SCOTCH_Num *const numflag, const SCOTCH_Num *const nparts, SCOTCH_Num *const volume, SCOTCH_Num *const part)

References PartGraphVKway().

Member Data Documentation

◆ className

std::string Nektar::SpatialDomains::MeshPartitionScotch::className
static
Initial value:
"Scotch",
"Partitioning using the Scotch library.")
tKey RegisterCreatorFunction(tKey idKey, CreatorFunction classCreator, std::string pDesc="")
Register a class with the factory.
Definition: NekFactory.hpp:200
static MeshPartitionSharedPtr create(const LibUtilities::SessionReaderSharedPtr session, LibUtilities::CommSharedPtr comm, int meshDim, std::map< int, MeshEntity > element, CompositeDescriptor compMap)
Creates an instance of this class.
MeshPartitionFactory & GetMeshPartitionFactory()

Name of class.

Definition at line 67 of file MeshPartitionScotch.h.

◆ cmdSwitch

std::string Nektar::SpatialDomains::MeshPartitionScotch::cmdSwitch
static
Initial value:
"use-scotch","","Use Scotch for mesh partitioning.")
static std::string RegisterCmdLineFlag(const std::string &pName, const std::string &pShortName, const std::string &pDescription)
Registers a command-line flag with the session reader.

Definition at line 68 of file MeshPartitionScotch.h.