77class DistributedDirectSolverRuntime
83 template <
class Matrix>
85 : s(prm.get(
"type", eDistributedDirectSolverType::skyline_lu))
87 if (!prm.erase(
"type"))
88 ARCCORE_ALINA_PARAM_MISSING(
"type");
91 case eDistributedDirectSolverType::skyline_lu: {
93 handle =
static_cast<void*
>(
new S(comm, A, prm));
100 static size_t coarse_enough()
105 template <
class Vec1,
class Vec2>
106 void operator()(
const Vec1& rhs, Vec2& x)
const
109 case eDistributedDirectSolverType::skyline_lu: {
111 static_cast<const S*
>(handle)->
operator()(rhs, x);
118 ~DistributedDirectSolverRuntime()
121 case eDistributedDirectSolverType::skyline_lu: {
123 delete static_cast<S*
>(handle);
132 eDistributedDirectSolverType type()
const {
return s; }
136 eDistributedDirectSolverType s;
137 void* handle =
nullptr;
139 template <
class S,
class V,
class Matrix>
140 typename std::enable_if<std::is_same<V, float>::value || std::is_same<V, double>::value,
void>::type
143 handle =
static_cast<void*
>(
new S(comm, A, prm));
146 template <
class S,
class V,
class Matrix>
147 typename std::enable_if<!std::is_same<V, float>::value && !std::is_same<V, double>::value,
void>::type
150 throw std::logic_error(
"The direct solver does not support the value type");
153 template <
class S,
class V,
class Vec1,
class Vec2>
154 typename std::enable_if<std::is_same<V, float>::value || std::is_same<V, double>::value,
void>::type
155 do_solve(
const Vec1& rhs, Vec2& x)
const
157 static_cast<const S*
>(handle)->
operator()(rhs, x);
160 template <
class S,
class V,
class Vec1,
class Vec2>
161 typename std::enable_if<!std::is_same<V, float>::value && !std::is_same<V, double>::value,
void>::type
162 do_solve(
const Vec1&, Vec2&)
const
164 throw std::logic_error(
"The direct solver does not support the value type");
167 template <
class S,
class V>
168 typename std::enable_if<std::is_same<V, float>::value || std::is_same<V, double>::value,
void>::type
171 delete static_cast<S*
>(handle);
174 template <
class S,
class V>
175 typename std::enable_if<!std::is_same<V, float>::value && !std::is_same<V, double>::value,
void>::type