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 log->info(
"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 log->info(
"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 log->info(
"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 log->info(
"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 log->info(
"creating GpuSparseAdapter solver implementation");
121 std::shared_ptr<MnaSolverDirect<VarType>> gpuSparseSolver =
122 std::make_shared<MnaSolverDirect<VarType>>(name, domain, logLevel);
123 gpuSparseSolver->setDirectLinearSolverImplementation(
124 DirectLinearSolverImpl::CUDASparse);
125 return gpuSparseSolver;
129 case DirectLinearSolverImpl::CUDAMagma: {
130 log->info(
"creating GpuMagmaAdapter solver implementation");
131 std::shared_ptr<MnaSolverDirect<VarType>> gpuMagmaSolver =
132 std::make_shared<MnaSolverDirect<VarType>>(name, domain, logLevel);
133 gpuMagmaSolver->setDirectLinearSolverImplementation(
134 DirectLinearSolverImpl::CUDAMagma);
135 return gpuMagmaSolver;
139#ifdef WITH_MNASOLVERPLUGIN
140 case DirectLinearSolverImpl::Plugin:
141 log->info(
"creating Plugin solver implementation");
142 return std::make_shared<MnaSolverPlugin<VarType>>(pluginName, name,