35#include <boost/algorithm/string.hpp>
36#include <boost/core/ignore_unused.hpp>
61 return int(x > 0.0 ? x + 0.5 : x - 0.5);
68 int size = inarray.size();
69 ASSERTL1(outarray.size() >= size,
"Array sizes not compatible");
72 for (
int i = 0; i < size; i++)
75 outarray[i] = int(x > 0.0 ? x + 0.5 : x - 0.5);
83 : m_session(), m_comm(), m_hash(0), m_numLocalBndCoeffs(0),
84 m_numGlobalBndCoeffs(0), m_numLocalDirBndCoeffs(0),
85 m_numGlobalDirBndCoeffs(0), m_solnType(
eNoSolnType),
86 m_bndSystemBandWidth(0), m_successiveRHS(0),
87 m_linSysIterSolver(
"ConjugateGradient"), m_gsh(0), m_bndGsh(0)
93 const std::string variable)
94 : m_session(pSession), m_comm(comm), m_variable(variable), m_hash(0),
95 m_numLocalBndCoeffs(0), m_numGlobalBndCoeffs(0),
96 m_numLocalDirBndCoeffs(0), m_numGlobalDirBndCoeffs(0),
97 m_bndSystemBandWidth(0), m_successiveRHS(0),
98 m_linSysIterSolver(
"ConjugateGradient"), m_gsh(0), m_bndGsh(0)
105 if (pSession->DefinesGlobalSysSolnInfo(variable,
"GlobalSysSoln"))
107 std::string sysSoln =
108 pSession->GetGlobalSysSolnInfo(variable,
"GlobalSysSoln");
110 "GlobalSysSoln", sysSoln);
115 if (pSession->DefinesGlobalSysSolnInfo(variable,
"Preconditioner"))
118 pSession->GetGlobalSysSolnInfo(variable,
"Preconditioner");
120 else if (pSession->DefinesSolverInfo(
"Preconditioner"))
122 m_preconType = pSession->GetSolverInfo(
"Preconditioner");
130 if (pSession->DefinesGlobalSysSolnInfo(variable,
131 "IterativeSolverTolerance"))
134 pSession->GetGlobalSysSolnInfo(variable,
"IterativeSolverTolerance")
139 pSession->LoadParameter(
"IterativeSolverTolerance",
144 if (pSession->DefinesGlobalSysSolnInfo(variable,
"AbsoluteTolerance"))
147 pSession->GetGlobalSysSolnInfo(variable,
"AbsoluteTolerance");
149 boost::iequals(boost::to_upper_copy(abstol),
"TRUE");
156 if (pSession->DefinesGlobalSysSolnInfo(variable,
"MaxIterations"))
159 pSession->GetGlobalSysSolnInfo(variable,
"MaxIterations").c_str());
166 if (pSession->DefinesGlobalSysSolnInfo(variable,
"SuccessiveRHS"))
169 pSession->GetGlobalSysSolnInfo(variable,
"SuccessiveRHS").c_str());
176 if (pSession->DefinesGlobalSysSolnInfo(variable,
"LinSysIterSolver"))
179 pSession->GetGlobalSysSolnInfo(variable,
"LinSysIterSolver");
181 else if (pSession->DefinesSolverInfo(
"LinSysIterSolver"))
198 : m_session(oldLevelMap->m_session), m_comm(oldLevelMap->GetComm()),
199 m_hash(0), m_solnType(oldLevelMap->m_solnType),
200 m_preconType(oldLevelMap->m_preconType),
201 m_maxIterations(oldLevelMap->m_maxIterations),
202 m_iterativeTolerance(oldLevelMap->m_iterativeTolerance),
203 m_successiveRHS(oldLevelMap->m_successiveRHS),
204 m_linSysIterSolver(oldLevelMap->m_linSysIterSolver),
205 m_gsh(oldLevelMap->m_gsh), m_bndGsh(oldLevelMap->m_bndGsh),
206 m_lowestStaticCondLevel(oldLevelMap->m_lowestStaticCondLevel)
228 int newLevel = staticCondLevelOld + 1;
240 numGlobalDirBndCoeffsOld);
250 multiLevelGraph->MaskPatches(newLevel, globHomPatchMask);
258 locPatchMask_NekDouble);
270 int numPatchesWithIntNew =
271 multiLevelGraph->GetNpatchesWithInterior(newLevel);
272 int numPatchesNew = numPatchesWithIntNew;
276 std::map<int, int> numLocalBndCoeffsPerPatchNew;
277 for (
int i = 0; i < numPatchesNew; i++)
279 numLocalBndCoeffsPerPatchNew[i] = 0;
285 for (i = cnt = 0; i < numPatchesOld; i++)
299 *min_element(&locPatchMask[cnt],
300 &locPatchMask[cnt] + numLocalBndCoeffsPerPatchOld[i]);
302 *max_element(&locPatchMask[cnt],
303 &locPatchMask[cnt] + numLocalBndCoeffsPerPatchOld[i]);
304 ASSERTL0((minval == maxval) || (minval == -1),
305 "These values should never be the same");
309 curPatch = numPatchesNew;
310 numLocalBndCoeffsPerPatchNew[curPatch] = 0;
318 for (j = 0; j < numLocalBndCoeffsPerPatchOld[i]; j++)
320 ASSERTL0((locPatchMask[cnt] == maxval) ||
321 (locPatchMask[cnt] == minval),
322 "These values should never be the same");
323 if (locPatchMask[cnt] == -1)
325 ++numLocalBndCoeffsPerPatchNew[curPatch];
343 (
unsigned int)numLocalBndCoeffsPerPatchNew[i];
355 "This method should only be called for in "
356 "case of multi-level static condensation.");
401 numLocalBndCoeffsPerPatchOffset[i] +=
402 numLocalBndCoeffsPerPatchOffset[i - 1] +
403 numLocalBndCoeffsPerPatchNew[i - 1];
406 int additionalPatchCnt = numPatchesWithIntNew;
413 for (i = cnt = 0; i < numPatchesOld; i++)
416 *min_element(&locPatchMask[cnt],
417 &locPatchMask[cnt] + numLocalBndCoeffsPerPatchOld[i]);
419 *max_element(&locPatchMask[cnt],
420 &locPatchMask[cnt] + numLocalBndCoeffsPerPatchOld[i]);
421 ASSERTL0((minval == maxval) || (minval == -1),
422 "These values should never be the same");
426 curPatch = additionalPatchCnt;
427 additionalPatchCnt++;
434 for (j = 0; j < numLocalBndCoeffsPerPatchOld[i]; j++)
436 ASSERTL0((locPatchMask[cnt] == maxval) ||
437 (locPatchMask[cnt] == minval),
438 "These values should never be the same");
442 if (locPatchMask[cnt] == -1)
444 newid = numLocalBndCoeffsPerPatchOffset[curPatch];
454 blockid = bndDofPerPatchCnt[curPatch];
457 numLocalBndCoeffsPerPatchOffset[curPatch]++;
458 bndDofPerPatchCnt[curPatch]++;
468 multiLevelGraph->GetInteriorOffset(newLevel, curPatch);
530 for (j = 0; j < locSize; j++)
545 bwidth = (bwidth > (maxId - minId)) ? bwidth : (maxId - minId);
555 boost::ignore_unused(i);
562 boost::ignore_unused(i);
569 boost::ignore_unused(i);
597 boost::ignore_unused(i);
613 boost::ignore_unused(
loc, global, useComm);
621 boost::ignore_unused(
loc, global, useComm);
628 boost::ignore_unused(
loc, global);
635 boost::ignore_unused(
loc, global);
642 boost::ignore_unused(
loc, global);
649 boost::ignore_unused(
loc, global);
655 boost::ignore_unused(pGlobal);
662 boost::ignore_unused(pGlobal);
670 boost::ignore_unused(pGlobal, offset);
733 boost::ignore_unused(locexp, solnType);
735 static std::shared_ptr<AssemblyMap> result;
856 if (global.data() ==
loc.data())
876 if (global.data() ==
loc.data())
895 if (global.data() ==
loc.data())
1083 "Local vector is not of correct dimension");
1085 "Global vector is not of correct dimension");
1090 tmp.get() + offset, 1);
1108 "Local vector is not of correct dimension");
1110 "Global vector is not of correct dimension");
1113 if (global.data() ==
loc.data())
1139 "Local vector is not of correct dimension");
1141 "Global vector is not of correct dimension");
1171 "Local vector is not of correct dimension");
1173 "Global vector is not of correct dimension");
1195 "LocBnd vector is not of correct dimension");
1197 "Local vector is not of correct dimension");
1207 "Locint vector is not of correct dimension");
1209 "Local vector is not of correct dimension");
1219 "LocBnd vector is not of correct dimension");
1221 "Local vector is not of correct dimension");
1231 "LocBnd vector is not of correct dimension");
1233 "Local vector is not of correct dimension");
1255 "Local array is not of correct dimension");
1257 "Global array is not of correct dimension");
1279 "Local vector is not of correct dimension");
1281 "Global vector is not of correct dimension");
1406 "Local vector is not of correct dimension");
1408 "Global vector is not of correct dimension");
1415 bool printHeader)
const
1418 bool isRoot = vRowComm->GetRank() == 0;
1419 int n = vRowComm->GetSize();
1423 int globBndCnt = 0, globDirCnt = 0;
1448 int totGlobDof = globCnt;
1449 int totGlobBndDof = globBndCnt;
1450 int totGlobDirDof = globDirCnt;
1455 int meanValence = 0;
1457 int minValence = 10000000;
1465 if (tmpGlob[i] > maxValence)
1467 maxValence = tmpGlob[i];
1469 if (tmpGlob[i] < minValence)
1471 minValence = tmpGlob[i];
1473 meanValence += tmpGlob[i];
1486 meanValence /= totGlobBndDof;
1492 out <<
"Assembly map statistics for field " << variable <<
":"
1496 out <<
" - Number of local/global dof : " << totLocalDof
1497 <<
" " << totGlobDof << endl;
1498 out <<
" - Number of local/global boundary dof : " << totLocalBndDof
1499 <<
" " << totGlobBndDof << endl;
1500 out <<
" - Number of local/global Dirichlet dof : " << totLocalDirDof
1501 <<
" " << totGlobDirDof << endl;
1502 out <<
" - dof valency (min/max/mean) : " << minValence
1503 <<
" " << maxValence <<
" " << meanValence << endl;
1511 for (i = 1; i < n; ++i)
1513 vRowComm->Recv(i, tmp);
1515 mean2 += tmp[0] * tmp[0];
1517 if (tmp[0] > maxval)
1521 if (tmp[0] < minval)
1529 out <<
" - Local dof dist. (min/max/mean/dev) : " << minval
1530 <<
" " << maxval <<
" " << (mean / n) <<
" "
1531 <<
sqrt(mean2 / n - mean * mean / n / n) << endl;
1537 mean2 = mean * mean;
1539 for (i = 1; i < n; ++i)
1541 vRowComm->Recv(i, tmp);
1543 mean2 += tmp[0] * tmp[0];
1545 if (tmp[0] > maxval)
1549 if (tmp[0] < minval)
1555 out <<
" - Local bnd dof dist. (min/max/mean/dev) : " << minval
1556 <<
" " << maxval <<
" " << (mean / n) <<
" "
1557 <<
sqrt(mean2 / n - mean * mean / n / n) << endl;
1564 vRowComm->Send(0, tmp);
1567 vRowComm->Send(0, tmp);
1579 while (tmp->m_nextLevelLocalToGlobalMap)
1581 tmp = tmp->m_nextLevelLocalToGlobalMap;
1594 for (i = 1; i < n; ++i)
1596 vRowComm->Recv(i, tmpRecv);
1598 mean2 += tmpRecv[0] * tmpRecv[0];
1600 if (tmpRecv[0] > maxval)
1602 maxval = (int)(tmpRecv[0] + 0.5);
1604 if (tmpRecv[0] < minval)
1606 minval = (int)(tmpRecv[0] + 0.5);
1610 out <<
" - M-level sc. dist. (min/max/mean/dev) : " << minval
1611 <<
" " << maxval <<
" " << (mean / n) <<
" "
1612 <<
sqrt(mean2 / n - mean * mean / n / n) << endl;
1618 vRowComm->Send(0, tmpSend);
1623 out <<
" - Number of static cond. levels : " <<
level << endl;
1628 out <<
"Stats at lowest static cond. level:" << endl;
1630 tmp->PrintStats(out, variable,
false);
#define ASSERTL0(condition, msg)
#define NEKERROR(type, msg)
Assert Level 0 – Fundamental assert which is used whether in FULLDEBUG, DEBUG or OPT compilation mode...
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode....
#define sign(a, b)
return the sign(b)*a
static std::shared_ptr< DataType > AllocateSharedPtr(const Args &...args)
Allocate a shared pointer from the memory pool.
Base class for constructing local to global mapping of degrees of freedom.
void PatchLocalToGlobal(const Array< OneD, const NekDouble > &loc, Array< OneD, NekDouble > &global) const
const Array< OneD, const int > & GetExtraDirEdges()
GlobalSysSolnType m_solnType
The solution type of the global system.
int GetNumPatches() const
Returns the number of patches in this static condensation level.
const Array< OneD, const int > & GetGlobalToUniversalMapUnique()
int GetNumGlobalCoeffs() const
Returns the total number of global coefficients.
int m_numLocalCoeffs
Total number of local coefficients.
Array< OneD, int > m_bndCondCoeffsToLocalTraceMap
Integer map of bnd cond coeff to local trace coeff.
const Array< OneD, const unsigned int > & GetNumLocalBndCoeffsPerPatch()
Returns the number of local boundary coefficients in each patch.
Array< OneD, int > m_bndCondCoeffsToLocalCoeffsMap
Integer map of bnd cond coeffs to local coefficients.
virtual const Array< OneD, const int > & v_GetExtraDirEdges()
int GetNumDirFaces() const
int GetNumLocalCoeffs() const
Returns the total number of local coefficients.
std::string GetVariable()
Retrieves the variable string.
const Array< OneD, const unsigned int > & GetNumLocalIntCoeffsPerPatch()
Returns the number of local interior coefficients in each patch.
int GetNumNonDirFaceModes() const
bool IsAbsoluteTolerance() const
virtual void v_Assemble(const Array< OneD, const NekDouble > &loc, Array< OneD, NekDouble > &global) const
bool m_signChange
Flag indicating if modes require sign reversal.
void Assemble(const Array< OneD, const NekDouble > &loc, Array< OneD, NekDouble > &global) const
NekDouble GetLocalToGlobalBndSign(const int i) const
Retrieve the sign change of a given local boundary mode.
virtual std::shared_ptr< AssemblyMap > v_LinearSpaceMap(const ExpList &locexp, GlobalSysSolnType solnType)
Generate a linear space mapping from existing mapping.
void AssembleBnd(const NekVector< NekDouble > &loc, NekVector< NekDouble > &global, int offset) const
virtual void v_LocalToGlobal(const Array< OneD, const NekDouble > &loc, Array< OneD, NekDouble > &global, bool useComm) const
PatchMapSharedPtr m_patchMapFromPrevLevel
Mapping information for previous level in MultiLevel Solver.
int m_maxIterations
Maximum iterations for iterative solver.
Array< OneD, int > m_localToLocalIntMap
Integer map of local boundary coeffs to local interior system numbering.
virtual const Array< OneD, const int > & v_GetGlobalToUniversalMapUnique()
NekDouble m_iterativeTolerance
Tolerance for iterative solver.
NekDouble GetIterativeTolerance() const
int m_numGlobalCoeffs
Total number of global coefficients.
std::string m_linSysIterSolver
Iterative solver: Conjugate Gradient, GMRES.
bool AtLastLevel() const
Returns true if this is the last level in the multi-level static condensation.
void UniversalAssembleBnd(Array< OneD, NekDouble > &pGlobal) const
const Array< OneD, const int > & GetLocalToGlobalMap()
const Array< OneD, const int > & GetBndCondCoeffsToLocalTraceMap()
Retrieves the local indices corresponding to the boundary expansion modes to global trace.
int GetNumNonDirEdgeModes() const
virtual const Array< OneD, const int > & v_GetGlobalToUniversalMap()
Array< OneD, int > m_globalToUniversalBndMap
Integer map of process coeffs to universal space.
void PatchAssemble(const Array< OneD, const NekDouble > &loc, Array< OneD, NekDouble > &global) const
int m_successiveRHS
sucessive RHS for iterative solver
std::shared_ptr< AssemblyMap > LinearSpaceMap(const ExpList &locexp, GlobalSysSolnType solnType)
virtual int v_GetNumNonDirVertexModes() const
void CalculateBndSystemBandWidth()
Calculates the bandwidth of the boundary system.
void LocalToGlobal(const Array< OneD, const NekDouble > &loc, Array< OneD, NekDouble > &global, bool useComm=true) const
Array< OneD, NekDouble > m_localToGlobalBndSign
Integer sign of local boundary coeffs to global space.
int GetNumNonDirEdges() const
void UniversalAbsMaxBnd(Array< OneD, NekDouble > &bndvals)
Array< OneD, unsigned int > m_numLocalBndCoeffsPerPatch
The number of bnd dofs per patch.
virtual const Array< OneD, const int > & v_GetLocalToGlobalMap()
const Array< OneD, const int > & GetGlobalToUniversalMap()
int GetNumNonDirFaces() const
std::string GetLinSysIterSolver() const
virtual int v_GetNumNonDirEdgeModes() const
virtual int v_GetNumDirFaces() const
LibUtilities::SessionReaderSharedPtr m_session
Session object.
virtual const Array< OneD, NekDouble > & v_GetLocalToGlobalSign() const
int GetNumGlobalDirBndCoeffs() const
Returns the number of global Dirichlet boundary coefficients.
const Array< OneD, NekDouble > & GetBndCondCoeffsToLocalCoeffsSign()
Returns the modal sign associated with a given boundary expansion mode.
int m_numLocalBndCoeffs
Number of local boundary coefficients.
void LocalToLocalBnd(const Array< OneD, const NekDouble > &local, Array< OneD, NekDouble > &locbnd) const
const Array< OneD, const int > & GetBndCondCoeffsToLocalCoeffsMap()
Retrieves the local indices corresponding to the boundary expansion modes.
void PrintStats(std::ostream &out, std::string variable, bool printHeader=true) const
AssemblyMapSharedPtr m_nextLevelLocalToGlobalMap
Map from the patches of the previous level to the patches of the current level.
const Array< OneD, const int > & GetLocalToGlobalBndMap()
Retrieve the global indices of the local boundary modes.
int m_staticCondLevel
The level of recursion in the case of multi-level static condensation.
bool m_isAbsoluteTolerance
int GetSuccessiveRHS() const
int m_bndSystemBandWidth
The bandwith of the global bnd system.
const Array< OneD, const int > & GetGlobalToUniversalBndMapUnique()
void GlobalToLocal(const Array< OneD, const NekDouble > &global, Array< OneD, NekDouble > &loc) const
GlobalSysSolnType GetGlobalSysSolnType() const
Returns the method of solving global systems.
int GetMaxIterations() const
int m_numLocalDirBndCoeffs
Number of Local Dirichlet Boundary Coefficients.
bool GetSingularSystem() const
Retrieves if the system is singular (true) or not (false)
std::string m_variable
Variable string identifier.
virtual int v_GetNumNonDirFaceModes() const
void PatchGlobalToLocal(const Array< OneD, const NekDouble > &global, Array< OneD, NekDouble > &loc) const
virtual int v_GetFullSystemBandWidth() const
int m_numGlobalDirBndCoeffs
Number of Global Dirichlet Boundary Coefficients.
LibUtilities::CommSharedPtr GetComm()
Retrieves the communicator.
Array< OneD, unsigned int > m_numLocalIntCoeffsPerPatch
The number of int dofs per patch.
const AssemblyMapSharedPtr GetNextLevelLocalToGlobalMap() const
Returns the local to global mapping for the next level in the multi-level static condensation.
int GetBndSystemBandWidth() const
Returns the bandwidth of the boundary system.
virtual void v_UniversalAssemble(Array< OneD, NekDouble > &pGlobal) const
int GetStaticCondLevel() const
Returns the level of static condensation for this map.
void GlobalToLocalBndWithoutSign(const Array< OneD, const NekDouble > &global, Array< OneD, NekDouble > &loc)
int GetNumNonDirVertexModes() const
bool m_systemSingular
Flag indicating if the system is singular or not.
Array< OneD, int > m_localToGlobalBndMap
Integer map of local coeffs to global Boundary Dofs.
size_t GetHash() const
Retrieves the hash of this map.
int GetLocalToGlobalBndMap(const int i) const
Retrieve the global index of a given local boundary mode.
virtual ~AssemblyMap()
Destructor.
Gs::gs_data * m_dirBndGsh
gs gather communication to impose Dirhichlet BCs.
virtual void v_GlobalToLocal(const Array< OneD, const NekDouble > &global, Array< OneD, NekDouble > &loc) const
const Array< OneD, NekDouble > & GetLocalToGlobalSign() const
int GetNumLocalDirBndCoeffs() const
Returns the number of local Dirichlet boundary coefficients.
int GetNumDirEdges() const
size_t m_hash
Hash for map.
Array< OneD, const NekDouble > GetLocalToGlobalBndSign() const
Retrieve the sign change for all local boundary modes.
void LocalBndToLocal(const Array< OneD, const NekDouble > &locbnd, Array< OneD, NekDouble > &local) const
AssemblyMap()
Default constructor.
Array< OneD, int > m_globalToUniversalBndMapUnique
Integer map of unique process coeffs to universal space (signed)
virtual int v_GetNumNonDirEdges() const
virtual int v_GetNumDirEdges() const
const PatchMapSharedPtr & GetPatchMapFromPrevLevel(void) const
Returns the patch map from the previous level of the multi-level static condensation.
LibUtilities::CommSharedPtr m_comm
Communicator.
int GetNumGlobalBndCoeffs() const
Returns the total number of global boundary coefficients.
int GetFullSystemBandWidth() const
const Array< OneD, const int > & GetGlobalToUniversalBndMap()
Array< OneD, int > m_localToLocalBndMap
Integer map of local boundary coeffs to local boundary system numbering.
std::string GetPreconType() const
Array< OneD, NekDouble > m_bndCondCoeffsToLocalCoeffsSign
Integer map of sign of bnd cond coeffs to local coefficients.
const Array< OneD, const int > & GetBndCondIDToGlobalTraceID()
void LocalBndToGlobal(const Array< OneD, const NekDouble > &loc, Array< OneD, NekDouble > &global, int offset, bool UseComm=true) const
void UniversalAssemble(Array< OneD, NekDouble > &pGlobal) const
int m_numPatches
The number of patches (~elements) in the current level.
void LocalToLocalInt(const Array< OneD, const NekDouble > &local, Array< OneD, NekDouble > &locint) const
virtual int v_GetNumNonDirFaces() const
bool GetSignChange()
Returns true if using a modal expansion requiring a change of sign of some modes.
void LocalIntToLocal(const Array< OneD, const NekDouble > &locbnd, Array< OneD, NekDouble > &local) const
void GlobalToLocalBnd(const NekVector< NekDouble > &global, NekVector< NekDouble > &loc, int offset) const
std::string m_preconType
Type type of preconditioner to use in iterative solver.
int GetNumLocalBndCoeffs() const
Returns the total number of local boundary coefficients.
int m_numGlobalBndCoeffs
Total number of global boundary coefficients.
Array< OneD, int > m_bndCondIDToGlobalTraceID
Integer map of bnd cond trace number to global trace number.
Base class for all multi-elemental spectral/hp expansions.
Array< OneD, DataType > & GetPtr()
static void Gather(Nektar::Array< OneD, NekDouble > pU, gs_op pOp, gs_data *pGsh, Nektar::Array< OneD, NekDouble > pBuffer=NullNekDouble1DArray)
Performs a gather-scatter operation of the provided values.
std::shared_ptr< SessionReader > SessionReaderSharedPtr
std::shared_ptr< Comm > CommSharedPtr
Pointer to a Communicator object.
@ eIterativeMultiLevelStaticCond
@ eNoSolnType
No Solution type specified.
@ eDirectMultiLevelStaticCond
@ eXxtMultiLevelStaticCond
@ ePETScMultiLevelStaticCond
std::shared_ptr< BottomUpSubStructuredGraph > BottomUpSubStructuredGraphSharedPtr
std::shared_ptr< AssemblyMap > AssemblyMapSharedPtr
std::shared_ptr< PatchMap > PatchMapSharedPtr
int RoundNekDoubleToInt(NekDouble x)
Rounds a double precision number to an integer.
static const NekDouble kNekIterativeTol
The above copyright notice and this permission notice shall be included.
void Scatr(int n, const T *x, const int *y, T *z)
Scatter vector z[y[i]] = x[i].
void Gathr(int n, const T *sign, const T *x, const int *y, T *z)
Gather vector z[i] = sign[i]*x[y[i]].
void Assmb(int n, const T *x, const int *y, T *z)
Assemble z[y[i]] += x[i]; z should be zero'd first.
void Zero(int n, T *x, const int incx)
Zero vector.
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
scalarT< T > sqrt(scalarT< T > in)