86 auto expList = ((
m_linsys.lock())->GetLocMat()).lock();
88 std::shared_ptr<LibUtilities::SessionReader> session =
89 expList->GetSession();
91 m_nsplit = expList->GetExp(0)->GetBasisNumModes(0) - 1;
96 if (session->DefinesGlobalSysSolnInfo(var,
"LORPointDistribution"))
98 if (boost::iequals(
"GLL", session->GetGlobalSysSolnInfo(
99 var,
"LORPointDistribution")))
103 else if (boost::iequals(
"Equispaced", session->GetGlobalSysSolnInfo(
104 var,
"LORPointDistribution")))
111 if (session->DefinesGlobalSysSolnInfo(var,
"LORSimplex"))
113 if (boost::iequals(
"True",
114 session->GetGlobalSysSolnInfo(var,
"LORSimplex")))
121 std::map<int, std::pair<int, std::vector<int>>> coeffmap;
126 std::string preconType;
128 if (session->DefinesGlobalSysSolnInfo(var,
"LORSolverType"))
130 m_slvType = session->GetGlobalSysSolnInfo(var,
"LORSolverType");
136 "Need to define LORSolverType "
137 "(DirectFull, IterativeFull, Preconditioner, PETScFull, XxtFull)"
138 "with LOR Preconditioner");
141 if (session->GetComm()->GetRank() == 0)
143 std::cout <<
"LOR Solve Type: " <<
m_slvType << std::endl;
147 if (session->DefinesGlobalSysSolnInfo(var,
"LORLinSysIterSolver"))
150 session->GetGlobalSysSolnInfo(var,
"LORLinSysIterSolver");
157 if (session->DefinesGlobalSysSolnInfo(var,
"LORPreconditioner"))
159 preconType = session->GetGlobalSysSolnInfo(var,
"LORPreconditioner");
163 preconType =
"Diagonal";
166 if (boost::iequals(
m_slvType,
"Preconditioner"))
168 session->SetGlobalSysSolnInfo(var,
"GlobalSysSoln",
"IterativeFull");
172 session->SetGlobalSysSolnInfo(var,
"GlobalSysSoln",
m_slvType.c_str());
174 if (boost::iequals(
m_slvType,
"IterativeFull"))
177 expList->GetSession()->DefinesCmdLineArgument(
"verbose");
181 session->SetGlobalSysSolnInfo(var,
"Preconditioner", preconType.c_str());
184 std::string prevFixedIter;
185 if (session->DefinesGlobalSysSolnInfo(var,
"LORFixedIterations"))
188 if (session->DefinesGlobalSysSolnInfo(var,
"NekLinSysFixedIterations"))
191 session->GetGlobalSysSolnInfo(var,
"NekLinSysFixedIterations");
194 session->SetGlobalSysSolnInfo(
195 var,
"NekLinSysFixedIterations",
196 session->GetGlobalSysSolnInfo(var,
"LORFixedIterations"));
199 std::string prevIterTol;
200 if (session->DefinesGlobalSysSolnInfo(var,
"LORIterativeTolerance"))
203 if (session->DefinesGlobalSysSolnInfo(var,
"IterativeSolverTolerance"))
206 session->GetGlobalSysSolnInfo(var,
"IterativeSolverTolerance");
209 session->SetGlobalSysSolnInfo(
210 var,
"IterativeSolverTolerance",
211 session->GetGlobalSysSolnInfo(var,
"LORIterativeTolerance"));
214 session->SetGlobalSysSolnInfo(var,
"LinSysIterSolver",
223 std::map<int, int> offset;
226 for (
int e = 0; e < expList->GetNumElmts(); ++e)
228 offset[expList->GetExp(e)->GetGeom()->GetGlobalID()] =
229 expList->GetCoeff_Offset(e);
233 for (
int e = 0; e <
m_lor_field->GetNumElmts(); ++e)
235 int gid =
m_lor_field->GetExp(e)->GetGeom()->GetGlobalID();
236 int id = coeffmap[gid].first;
238 for (
int i = 0; i < coeffmap[gid].second.size(); ++i)
240 m_ho2lor[cnt++] = offset[id] + coeffmap[gid].second[i];
244 "Error in setting up high order to lower order map");
252 m_linsys.lock()->GetKey().GetConstFactors());
254 if (boost::iequals(
m_slvType,
"DirectFull"))
259 else if (boost::iequals(
m_slvType,
"XxtFull"))
265 ASSERTL0(
false,
"Nektar++ has not been compiled with MPI support.");
268 else if (boost::iequals(
m_slvType,
"IterativeFull"))
274 else if (boost::iequals(
m_slvType,
"PETScFull"))
276#ifdef NEKTAR_USING_PETSC
280 ASSERTL0(
false,
"Nektar++ has not been compiled with PETSc support.");
283 else if (boost::iequals(
m_slvType,
"Preconditioner"))
291 std::dynamic_pointer_cast<GlobalLinSysIterativeFull>(
m_LORLinSys)
292 ->Initialise(l2gmap->GetNumGlobalCoeffs(), l2gmap,
293 l2gmap->GetNumGlobalDirBndCoeffs());
298 "LORSlvType must be specified as one of "
299 "DirectFull, IterativeFull, Preconditioner, PETScFull");
303 session->SetGlobalSysSolnInfo(var,
"GlobalSysSoln",
307 if (prevFixedIter.size())
309 session->SetGlobalSysSolnInfo(var,
"NekLinSysFixedIterations",
314 if (prevIterTol.size())
316 session->SetGlobalSysSolnInfo(var,
"IterativeSolverTolerance",
333 auto expList = ((
m_linsys.lock())->GetLocMat()).lock();
335 int nLocal = expList->GetNcoeffs();
354 expList->GlobalToLocal(solve, Local);
363 expList->GlobalToLocal(solve, Local);
370 m_linsys.lock()->GetKey().GetConstFactors());
373 expList->MultiplyByBlockMatrix(key, Local, solve,
true);
386 if (boost::iequals(
m_slvType,
"DirectFull") ||
387 boost::iequals(
m_slvType,
"IterativeFull") ||
391 m_LORLinSys->SolveLinearSystem(l2gmap->GetNumGlobalCoeffs(), fce, solve,
393 l2gmap->GetNumGlobalDirBndCoeffs());
397 std::dynamic_pointer_cast<GlobalLinSysIterativeFull>(
m_LORLinSys)
398 ->DoPreconditionerFlag(fce, solve,
true);
408 expList->MultiplyByBlockMatrix(key, Local, pOutput);
411 expList->LocalToGlobal(pOutput, solve);
413 expList->GlobalToLocal(solve, pOutput);
418 expList->MultiplyByBlockMatrix(key, Local, solve);
419 expList->LocalToGlobal(solve, Local);
SpatialDomains::MeshGraphSharedPtr GetLinearGraph()
SpatialDomains::MeshGraphSharedPtr CreateLinearGraph(int nsplit, std::map< int, std::pair< int, std::vector< int > > > &LinCoeffMap, bool UseGLL, bool useSimplex)