41 static std::vector<DirectLinearSolverImpl> ret = {
42#ifdef WITH_MNASOLVERPLUGIN
43 DirectLinearSolverImpl::Plugin,
46 DirectLinearSolverImpl::CUDADense,
47#ifdef WITH_CUDA_SPARSE
49 DirectLinearSolverImpl::CUDASparse,
51 DirectLinearSolverImpl::CUDAMagma,
54 DirectLinearSolverImpl::DenseLU,
56 DirectLinearSolverImpl::SparseLU,
59 DirectLinearSolverImpl::KLU
67 static std::shared_ptr<MnaSolver<VarType>>
factory(
68 String name, CPS::Domain domain = CPS::Domain::DP,
69 CPS::Logger::Level logLevel = CPS::Logger::Level::info,
71 String pluginName =
"plugin.so") {
73 if (implementation == DirectLinearSolverImpl::Undef) {
75 implementation = DirectLinearSolverImpl::KLU;
80 CPS::Logger::Log log = CPS::Logger::get(
81 "MnaSolverFactory", CPS::Logger::Level::info, CPS::Logger::Level::info);
83 switch (implementation) {
89 case DirectLinearSolverImpl::SparseLU: {
90 SPDLOG_LOGGER_INFO(log,
"creating SparseLUAdapter solver implementation");
91 std::shared_ptr<MnaSolverDirect<VarType>> sparseSolver =
92 std::make_shared<MnaSolverDirect<VarType>>(name, domain, logLevel);
93 sparseSolver->setDirectLinearSolverImplementation(
94 DirectLinearSolverImpl::SparseLU);
98 case DirectLinearSolverImpl::DenseLU: {
99 SPDLOG_LOGGER_INFO(log,
"creating DenseLUAdapter solver implementation");
100 std::shared_ptr<MnaSolverDirect<VarType>> denseSolver =
101 std::make_shared<MnaSolverDirect<VarType>>(name, domain, logLevel);
102 denseSolver->setDirectLinearSolverImplementation(
103 DirectLinearSolverImpl::DenseLU);
107 case DirectLinearSolverImpl::KLU: {
108 SPDLOG_LOGGER_INFO(log,
"creating KLUAdapter solver implementation");
109 std::shared_ptr<MnaSolverDirect<VarType>> kluSolver =
110 std::make_shared<MnaSolverDirect<VarType>>(name, domain, logLevel);
111 kluSolver->setDirectLinearSolverImplementation(
112 DirectLinearSolverImpl::KLU);
117 case DirectLinearSolverImpl::CUDADense: {
118 SPDLOG_LOGGER_INFO(log,
"creating GpuDenseAdapter solver implementation");
119 std::shared_ptr<MnaSolverDirect<VarType>> gpuDenseSolver =
120 std::make_shared<MnaSolverDirect<VarType>>(name, domain, logLevel);
121 gpuDenseSolver->setDirectLinearSolverImplementation(
122 DirectLinearSolverImpl::CUDADense);
123 return gpuDenseSolver;
125#ifdef WITH_CUDA_SPARSE
126 case DirectLinearSolverImpl::CUDASparse: {
127 SPDLOG_LOGGER_INFO(log,
128 "creating GpuSparseAdapter solver implementation");
129 std::shared_ptr<MnaSolverDirect<VarType>> gpuSparseSolver =
130 std::make_shared<MnaSolverDirect<VarType>>(name, domain, logLevel);
131 gpuSparseSolver->setDirectLinearSolverImplementation(
132 DirectLinearSolverImpl::CUDASparse);
133 return gpuSparseSolver;
137 case DirectLinearSolverImpl::CUDAMagma: {
138 SPDLOG_LOGGER_INFO(log,
"creating GpuMagmaAdapter solver implementation");
139 std::shared_ptr<MnaSolverDirect<VarType>> gpuMagmaSolver =
140 std::make_shared<MnaSolverDirect<VarType>>(name, domain, logLevel);
141 gpuMagmaSolver->setDirectLinearSolverImplementation(
142 DirectLinearSolverImpl::CUDAMagma);
143 return gpuMagmaSolver;
147#ifdef WITH_MNASOLVERPLUGIN
148 case DirectLinearSolverImpl::Plugin:
149 SPDLOG_LOGGER_INFO(log,
"creating Plugin solver implementation");
150 return std::make_shared<MnaSolverPlugin<VarType>>(pluginName, name,