43 namespace MultiRegions
56 string GlobalLinSysIterativeFull::className =
58 "IterativeFull", GlobalLinSysIterativeFull::create,
59 "Iterative solver for full matrix system.");
68 GlobalLinSysIterativeFull::GlobalLinSysIterativeFull(
70 const std::shared_ptr<AssemblyMap> &pLocToGloMap)
75 "This routine should only be used when using an Iterative "
76 "conjugate gradient matrix solve.");
110 std::shared_ptr<MultiRegions::ExpList> expList =
m_expList.lock();
114 if (std::dynamic_pointer_cast<AssemblyMapCG>(pLocToGloMap))
118 else if (std::dynamic_pointer_cast<AssemblyMapDG>(pLocToGloMap))
127 bool dirForcCalculated = (bool)pDirForcing.size();
128 int nDirDofs = pLocToGloMap->GetNumGlobalDirBndCoeffs();
129 int nGlobDofs = pLocToGloMap->GetNumGlobalCoeffs();
130 int nLocDofs = pLocToGloMap->GetNumLocalCoeffs();
132 int nDirTotal = nDirDofs;
133 expList->GetComm()->GetRowComm()->AllReduce(nDirTotal,
144 if (dirForcCalculated)
146 Vmath::Vsub(nLocDofs, pLocInput, 1, pDirForcing, 1, tmp1, 1);
152 expList->GeneralMatrixOp(
m_linSysKey, pLocOutput, tmp);
162 int offset = expList->GetCoeff_Offset(n);
166 for (rBC = r.second; rBC; rBC = rBC->next)
168 vExp->AddRobinTraceContribution(
169 rBC->m_robinID, rBC->m_robinPrimitiveCoeffs,
170 pLocOutput + offset, tmploc = tmp + offset);
174 Vmath::Vsub(nLocDofs, pLocInput, 1, tmp, 1, tmp1, 1);
178 pLocToGloMap->Assemble(tmp1, tmp);
183 pLocToGloMap->GlobalToLocal(global, tmp);
186 Vmath::Vadd(nLocDofs, tmp, 1, pLocOutput, 1, pLocOutput, 1);
190 ASSERTL0(
false,
"Need DG solve if using Dir BCs");
195 pLocToGloMap->Assemble(pLocInput, tmp);
197 pLocToGloMap->GlobalToLocal(global, pLocOutput);
207 std::shared_ptr<MultiRegions::ExpList> expList =
m_expList.lock();
211 int ncoeffs = expList->GetNcoeffs();
215 asmMap->GlobalToLocal(pInput, InputLoc);
218 expList->GeneralMatrixOp(
m_linSysKey, InputLoc, OutputLoc);
228 int offset = expList->GetCoeff_Offset(n);
232 for (rBC = r.second; rBC; rBC = rBC->next)
234 vExp->AddRobinTraceContribution(
235 rBC->m_robinID, rBC->m_robinPrimitiveCoeffs, InputLoc + offset,
236 tmp = OutputLoc + offset);
241 asmMap->Assemble(OutputLoc, pOutput);
#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....
tKey RegisterCreatorFunction(tKey idKey, CreatorFunction classCreator, std::string pDesc="")
Register a class with the factory.
const std::weak_ptr< ExpList > m_expList
Local Matrix System.
const std::map< int, RobinBCInfoSharedPtr > m_robinBCInfo
Robin boundary info.
void SolveLinearSystem(const int pNumRows, const Array< OneD, const NekDouble > &pInput, Array< OneD, NekDouble > &pOutput, const AssemblyMapSharedPtr &locToGloMap, const int pNumDir=0)
Solve the linear system for given input and output vectors.
const GlobalLinSysKey m_linSysKey
Key associated with this linear system.
virtual ~GlobalLinSysIterativeFull()
virtual void v_UniqueMap() override
virtual void v_DoMatrixMultiply(const Array< OneD, NekDouble > &pInput, Array< OneD, NekDouble > &pOutput) override
std::weak_ptr< AssemblyMap > m_locToGloMap
virtual void v_Solve(const Array< OneD, const NekDouble > &in, Array< OneD, NekDouble > &out, const AssemblyMapSharedPtr &locToGloMap, const Array< OneD, const NekDouble > &dirForcing=NullNekDouble1DArray) override
Solve the linear system for given input and output vectors using a specified local to global map.
Array< OneD, int > m_map
Global to universal unique map.
Describe a linear system.
GlobalSysSolnType GetGlobalSysSolnType() const
Return the associated solution type.
std::shared_ptr< Expansion > ExpansionSharedPtr
std::shared_ptr< RobinBCInfo > RobinBCInfoSharedPtr
GlobalLinSysFactory & GetGlobalLinSysFactory()
std::shared_ptr< AssemblyMap > AssemblyMapSharedPtr
The above copyright notice and this permission notice shall be included.
void Vadd(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Add vector z = x+y.
void Vsub(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Subtract vector z = x-y.