46 auto key = dict.
get<std::string>(
"solver");
47 SolverFactory::keyExistsOrError(key);
48 return SolverFactory::table().at(key)(exec, dict);
51 static std::string
name() {
return "SolverFactory"; }
66 NF_THROW(
"solve(scalar matrix, Vec3 rhs) not implemented for this solver");
69#ifdef NF_WITH_MPI_SUPPORT
74 NF_THROW(
"solveDist not implemented for this solver");
80 NF_THROW(
"solveDist not implemented for this solver");
84 solveDist(
const LinearSystem<
scalar, Vec3, CSRMatrix<scalar, localIdx>, COOMatrix<scalar, localIdx>>&, Vector<Vec3>&)
87 NF_THROW(
"solveDist(scalar matrix, Vec3 rhs) not implemented for this solver");
92 virtual std::unique_ptr<SolverFactory>
clone()
const = 0;
105 : exec_(solver.exec_), solverInstance_(solver.solverInstance_->clone()) {};
108 : exec_(solver.exec_), solverInstance_(std::move(solver.solverInstance_)) {};
111 : exec_(exec), solverInstance_(std::move(solverInstance)) {};
114 : exec_(exec), solverInstance_(
SolverFactory::create(exec, dict)) {};
120#ifdef NF_WITH_MPI_SUPPORT
121 if (!ls.commPattern().sendCounts.empty())
return solverInstance_->solveDist(ls, field);
123 return solverInstance_->solve(ls, field);
129#ifdef NF_WITH_MPI_SUPPORT
130 if (!ls.commPattern().sendCounts.empty())
return solverInstance_->solveDist(ls, field);
132 return solverInstance_->solve(ls, field);
144#ifdef NF_WITH_MPI_SUPPORT
145 if (!ls.commPattern().sendCounts.empty())
return solverInstance_->solveDist(ls, field);
147 return solverInstance_->solve(ls, field);
153 std::unique_ptr<SolverFactory> solverInstance_;
A class representing a dictionary that stores key-value pairs.
T & get(const std::string &key)
Retrieves the value associated with the given key, casting it to the specified type.
A factory class for runtime selection of derived classes.
A class for the representation of a 3D Vec3.
A class to contain the data and executors for a field and define some basic operations.
A class representing a linear system of equations.
Sparse matrix class with compact storage by row (CSR) format.
static std::string name()
virtual SolverStats solve(const LinearSystem< scalar, Vec3, CSRMatrix< scalar, localIdx >, COOMatrix< scalar, localIdx > > &, Vector< Vec3 > &) const
virtual std::unique_ptr< SolverFactory > clone() const =0
virtual SolverStats solve(const LinearSystem< scalar, scalar, CSRMatrix< scalar, localIdx > > &, Vector< scalar > &) const =0
virtual SolverStats solve(const LinearSystem< Vec3, Vec3, CSRMatrix< Vec3, localIdx > > &, Vector< Vec3 > &) const =0
SolverFactory(const Executor &exec)
static std::unique_ptr< SolverFactory > create(const Executor &exec, const Dictionary &dict)
Solver(const Solver &solver)
Solver(const Executor &exec, std::unique_ptr< SolverFactory > solverInstance)
Solver(const Executor &exec, const Dictionary &dict)
SolverStats solve(const LinearSystem< scalar, Vec3, CSRMatrix< scalar, localIdx >, COOMatrix< scalar, localIdx > > &ls, Vector< Vec3 > &field) const
Solve a system with a scalar matrix and Vec3 right-hand side (segregated vector solve)....
SolverStats solve(const LinearSystem< Vec3, Vec3, CSRMatrix< Vec3, localIdx > > &ls, Vector< Vec3 > &field) const
SolverStats solve(const LinearSystem< scalar, scalar, CSRMatrix< scalar, localIdx > > &ls, Vector< scalar > &field) const
#define NF_THROW(message)
Macro for throwing a NeoNException with the specified error message.
std::variant< SerialExecutor, CPUExecutor, GPUExecutor > Executor
SolverStats(size_t numIter, scalar initResNorm, scalar finalResNorm, scalar solveTime)
SolverStats(SolverStatsEntry entry)
std::vector< SolverStatsEntry > entries