35#include <boost/core/ignore_unused.hpp>
41namespace SpatialDomains
47 "Partitioning using the Scotch library.");
51 "use-scotch",
"",
"Use Scotch for mesh partitioning.");
73 boost::ignore_unused(nVertConds, edgeWgt);
78 if (vertWgt.size() > 0)
83 if (vertSize.size() > 0)
90 PartGraphVKway(&nVerts, &xadj[0], &adjcy[0], vwgt, vsize, &wgtflag,
91 &numflag, &nparts, &volume, &part[0]);
95 const SCOTCH_Num *
const n,
const SCOTCH_Num *
const xadj,
96 const SCOTCH_Num *
const adjncy,
const SCOTCH_Num *
const vwgt,
97 const SCOTCH_Num *
const vsize,
const SCOTCH_Num *
const wgtflag,
98 const SCOTCH_Num *
const numflag,
const SCOTCH_Num *
const nparts,
99 SCOTCH_Num *
const volume, SCOTCH_Num *
const part)
102 const SCOTCH_Num *vwgt2;
103 const SCOTCH_Num *vsize2;
108 const SCOTCH_Num *edgetax;
109 const SCOTCH_Num *parttax;
113 vsize2 = ((*wgtflag & 1) != 0) ? vsize : NULL;
114 vwgt2 = ((*wgtflag & 2) != 0) ? vwgt : NULL;
117 edgetax = adjncy - baseval;
122 if (
PartGraph2(n, xadj, adjncy, vwgt2, NULL, numflag, nparts, part,
123 SCOTCH_STRATQUALITY, 0.01) != 0)
130 const SCOTCH_Num *vsiztax;
135 edgenbr = xadj[vertnbr] - baseval;
136 if ((edlotax = (SCOTCH_Num *)malloc(edgenbr *
sizeof(SCOTCH_Num))) ==
143 vsiztax = vsize2 - baseval;
146 for (vertnum = 0, edgenum = baseval; vertnum < vertnbr; vertnum++)
151 vsizval = vsize2[vertnum];
153 for (edgennd = xadj[vertnum + 1]; edgenum < edgennd; edgenum++)
158 vertend = edgetax[edgenum];
159 edlotax[edgenum] = vsizval + vsiztax[vertend];
163 o =
PartGraph2(n, xadj, adjncy, vwgt2, edlotax + baseval, numflag,
164 nparts, part, SCOTCH_STRATQUALITY, 0.01);
166 free(edlotax + baseval);
172 if ((nghbtab = (SCOTCH_Num *)malloc(*nparts *
sizeof(SCOTCH_Num))) == NULL)
177 memset(nghbtab, ~0, *nparts *
sizeof(SCOTCH_Num));
179 parttax = part - baseval;
183 for (vertnum = 0, edgenum = baseval, commvol = 0; vertnum < vertnbr;
189 partval = part[vertnum];
190 nghbtab[partval] = vertnum;
193 vsizval = vsize2[vertnum];
196 for (edgennd = xadj[vertnum + 1]; edgenum < edgennd; edgenum++)
201 vertend = edgetax[edgenum];
202 partend = parttax[vertend];
205 if (nghbtab[partend] != vertnum)
207 nghbtab[partend] = vertnum;
218 const SCOTCH_Num *
const n,
const SCOTCH_Num *
const xadj,
219 const SCOTCH_Num *
const adjncy,
const SCOTCH_Num *
const vwgt,
220 const SCOTCH_Num *
const adjwgt,
const SCOTCH_Num *
const numflag,
221 const SCOTCH_Num *
const nparts, SCOTCH_Num *
const part, SCOTCH_Num flagval,
225 SCOTCH_Graph *grafdat = SCOTCH_graphAlloc();
227 "Failed to allocate Scotch graph for partitioning.");
229 SCOTCH_Strat stradat;
234 ASSERTL0(SCOTCH_graphInit(grafdat) == 0,
235 "Failed to initialise Scotch graph for partitioning.");
241 if (SCOTCH_graphBuild(grafdat, baseval, vertnbr, xadj, xadj + 1, vwgt, NULL,
242 xadj[vertnbr] - baseval, adjncy, adjwgt) == 0)
244 SCOTCH_stratInit(&stradat);
245 SCOTCH_stratGraphMapBuild(&stradat, flagval, *nparts, kbalval);
246#ifdef SCOTCH_DEBUG_ALL
248 if (SCOTCH_graphCheck(grafdat) == 0)
250 o = SCOTCH_graphPart(grafdat, *nparts, &stradat, part);
251 SCOTCH_stratExit(&stradat);
253 SCOTCH_graphExit(grafdat);
262 for (vertnum = 0; vertnum < vertnbr; vertnum++)
263 part[vertnum] += baseval;
#define ASSERTL0(condition, msg)
tKey RegisterCreatorFunction(tKey idKey, CreatorFunction classCreator, std::string pDesc="")
Register a class with the factory.
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.
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.
virtual ~MeshPartitionScotch()
static std::string className
Name of class.
MeshPartitionScotch(const LibUtilities::SessionReaderSharedPtr session, LibUtilities::CommSharedPtr comm, int meshDim, std::map< int, MeshEntity > element, CompositeDescriptor compMap)
virtual void v_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) override final
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)
static std::string cmdSwitch
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)
std::shared_ptr< SessionReader > SessionReaderSharedPtr
std::shared_ptr< Comm > CommSharedPtr
Pointer to a Communicator object.
std::map< int, std::pair< LibUtilities::ShapeType, std::vector< int > > > CompositeDescriptor
MeshPartitionFactory & GetMeshPartitionFactory()
The above copyright notice and this permission notice shall be included.