39 static std::vector<DirectLinearSolverImpl> ret = {
40#ifdef WITH_MNASOLVERPLUGIN
41 DirectLinearSolverImpl::Plugin,
44 DirectLinearSolverImpl::CUDADense,
45#ifdef WITH_CUDA_SPARSE
47 DirectLinearSolverImpl::CUDASparse,
49 DirectLinearSolverImpl::CUDAMagma,
52 DirectLinearSolverImpl::DenseLU, DirectLinearSolverImpl::SparseLU,
54 DirectLinearSolverImpl::KLU
62 static std::shared_ptr<MnaSolver<VarType>>
factory(
63 String name, CPS::Domain domain = CPS::Domain::DP,
64 CPS::Logger::Level logLevel = CPS::Logger::Level::info,
66 String pluginName =
"plugin.so") {
68 if (implementation == DirectLinearSolverImpl::Undef) {
70 implementation = DirectLinearSolverImpl::KLU;
75 CPS::Logger::Log log = CPS::Logger::get(
76 "MnaSolverFactory", CPS::Logger::Level::info, CPS::Logger::Level::info);
78 switch (implementation) {
83 case DirectLinearSolverImpl::SparseLU: {
84 SPDLOG_LOGGER_INFO(log,
"creating SparseLUAdapter solver implementation");
85 std::shared_ptr<MnaSolverDirect<VarType>> sparseSolver =
86 std::make_shared<MnaSolverDirect<VarType>>(name, domain, logLevel);
87 sparseSolver->setDirectLinearSolverImplementation(
88 DirectLinearSolverImpl::SparseLU);
91 case DirectLinearSolverImpl::DenseLU: {
92 SPDLOG_LOGGER_INFO(log,
"creating DenseLUAdapter solver implementation");
93 std::shared_ptr<MnaSolverDirect<VarType>> denseSolver =
94 std::make_shared<MnaSolverDirect<VarType>>(name, domain, logLevel);
95 denseSolver->setDirectLinearSolverImplementation(
96 DirectLinearSolverImpl::DenseLU);
100 case DirectLinearSolverImpl::KLU: {
101 SPDLOG_LOGGER_INFO(log,
"creating KLUAdapter solver implementation");
102 std::shared_ptr<MnaSolverDirect<VarType>> kluSolver =
103 std::make_shared<MnaSolverDirect<VarType>>(name, domain, logLevel);
104 kluSolver->setDirectLinearSolverImplementation(
105 DirectLinearSolverImpl::KLU);
110 case DirectLinearSolverImpl::CUDADense: {
111 SPDLOG_LOGGER_INFO(log,
"creating GpuDenseAdapter solver implementation");
112 std::shared_ptr<MnaSolverDirect<VarType>> gpuDenseSolver =
113 std::make_shared<MnaSolverDirect<VarType>>(name, domain, logLevel);
114 gpuDenseSolver->setDirectLinearSolverImplementation(
115 DirectLinearSolverImpl::CUDADense);
116 return gpuDenseSolver;
118#ifdef WITH_CUDA_SPARSE
119 case DirectLinearSolverImpl::CUDASparse: {
120 SPDLOG_LOGGER_INFO(log,
121 "creating GpuSparseAdapter solver implementation");
122 std::shared_ptr<MnaSolverDirect<VarType>> gpuSparseSolver =
123 std::make_shared<MnaSolverDirect<VarType>>(name, domain, logLevel);
124 gpuSparseSolver->setDirectLinearSolverImplementation(
125 DirectLinearSolverImpl::CUDASparse);
126 return gpuSparseSolver;
130 case DirectLinearSolverImpl::CUDAMagma: {
131 SPDLOG_LOGGER_INFO(log,
"creating GpuMagmaAdapter solver implementation");
132 std::shared_ptr<MnaSolverDirect<VarType>> gpuMagmaSolver =
133 std::make_shared<MnaSolverDirect<VarType>>(name, domain, logLevel);
134 gpuMagmaSolver->setDirectLinearSolverImplementation(
135 DirectLinearSolverImpl::CUDAMagma);
136 return gpuMagmaSolver;
140#ifdef WITH_MNASOLVERPLUGIN
141 case DirectLinearSolverImpl::Plugin:
142 SPDLOG_LOGGER_INFO(log,
"creating Plugin solver implementation");
143 return std::make_shared<MnaSolverPlugin<VarType>>(pluginName, name,