43 "Partitioning using the Scotch library.");
47 "use-scotch",
"",
"Use Scotch for mesh partitioning.");
58 int &nVerts, [[maybe_unused]]
int &nVertConds,
69 if (vertWgt.size() > 0)
74 if (vertSize.size() > 0)
81 PartGraphVKway(&nVerts, &xadj[0], &adjcy[0], vwgt, vsize, &wgtflag,
82 &numflag, &nparts, &volume, &part[0]);
86 const SCOTCH_Num *
const n,
const SCOTCH_Num *
const xadj,
87 const SCOTCH_Num *
const adjncy,
const SCOTCH_Num *
const vwgt,
88 const SCOTCH_Num *
const vsize,
const SCOTCH_Num *
const wgtflag,
89 const SCOTCH_Num *
const numflag,
const SCOTCH_Num *
const nparts,
90 SCOTCH_Num *
const volume, SCOTCH_Num *
const part)
93 const SCOTCH_Num *vwgt2;
94 const SCOTCH_Num *vsize2;
99 const SCOTCH_Num *edgetax;
100 const SCOTCH_Num *parttax;
104 vsize2 = ((*wgtflag & 1) != 0) ? vsize :
nullptr;
105 vwgt2 = ((*wgtflag & 2) != 0) ? vwgt :
nullptr;
108 edgetax = adjncy - baseval;
111 if (vsize2 ==
nullptr)
113 if (
PartGraph2(n, xadj, adjncy, vwgt2,
nullptr, numflag, nparts, part,
114 SCOTCH_STRATQUALITY, 0.01) != 0)
123 const SCOTCH_Num *vsiztax;
128 edgenbr = xadj[vertnbr] - baseval;
129 if ((edlotax = (SCOTCH_Num *)malloc(edgenbr *
sizeof(SCOTCH_Num))) ==
136 vsiztax = vsize2 - baseval;
139 for (vertnum = 0, edgenum = baseval; vertnum < vertnbr; vertnum++)
144 vsizval = vsize2[vertnum];
146 for (edgennd = xadj[vertnum + 1]; edgenum < edgennd; edgenum++)
151 vertend = edgetax[edgenum];
152 edlotax[edgenum] = vsizval + vsiztax[vertend];
156 o =
PartGraph2(n, xadj, adjncy, vwgt2, edlotax + baseval, numflag,
157 nparts, part, SCOTCH_STRATQUALITY, 0.01);
159 free(edlotax + baseval);
167 if ((nghbtab = (SCOTCH_Num *)malloc(*nparts *
sizeof(SCOTCH_Num))) ==
173 memset(nghbtab, ~0, *nparts *
sizeof(SCOTCH_Num));
175 parttax = part - baseval;
179 for (vertnum = 0, edgenum = baseval, commvol = 0; vertnum < vertnbr;
185 partval = part[vertnum];
186 nghbtab[partval] = vertnum;
188 if (vsize2 !=
nullptr)
190 vsizval = vsize2[vertnum];
194 for (edgennd = xadj[vertnum + 1]; edgenum < edgennd; edgenum++)
199 vertend = edgetax[edgenum];
200 partend = parttax[vertend];
203 if (nghbtab[partend] != vertnum)
205 nghbtab[partend] = vertnum;
216 const SCOTCH_Num *
const n,
const SCOTCH_Num *
const xadj,
217 const SCOTCH_Num *
const adjncy,
const SCOTCH_Num *
const vwgt,
218 const SCOTCH_Num *
const adjwgt,
const SCOTCH_Num *
const numflag,
219 const SCOTCH_Num *
const nparts, SCOTCH_Num *
const part, SCOTCH_Num flagval,
223 SCOTCH_Graph *grafdat = SCOTCH_graphAlloc();
225 "Failed to allocate Scotch graph for partitioning.");
227 SCOTCH_Strat stradat;
232 ASSERTL0(SCOTCH_graphInit(grafdat) == 0,
233 "Failed to initialise Scotch graph for partitioning.");
239 if (SCOTCH_graphBuild(grafdat, baseval, vertnbr, xadj, xadj + 1, vwgt,
240 nullptr, xadj[vertnbr] - baseval, adjncy,
243 SCOTCH_stratInit(&stradat);
244 SCOTCH_stratGraphMapBuild(&stradat, flagval, *nparts, kbalval);
245#ifdef SCOTCH_DEBUG_ALL
247 if (SCOTCH_graphCheck(grafdat) == 0)
249 o = SCOTCH_graphPart(grafdat, *nparts, &stradat, part);
250 SCOTCH_stratExit(&stradat);
252 SCOTCH_graphExit(grafdat);
263 for (vertnum = 0; vertnum < vertnbr; vertnum++)
265 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.
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) final
static std::string className
Name of class.
MeshPartitionScotch(const LibUtilities::SessionReaderSharedPtr session, LibUtilities::CommSharedPtr comm, int meshDim, std::map< int, MeshEntity > element, CompositeDescriptor compMap)
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()