97struct CoarseningRuntime
102 void* handle =
nullptr;
104 explicit CoarseningRuntime(params prm = params())
105 : c(prm.get(
"type", eCoarserningType::smoothed_aggregation))
107 if (!prm.erase(
"type"))
108 ARCCORE_ALINA_PARAM_MISSING(
"type");
110 typedef typename backend::value_type<Backend>::type value_type;
113 as_scalar = (block_value_type &&
114 c != eCoarserningType::ruge_stuben &&
115 prm.get(
"nullspace.cols", 0) > 0);
116 std::cout <<
"PreconditionerCoarseningType=" << c <<
"\n";
119#define ARCCORE_ALINA_RUNTIME_COARSENING(t) \
120 case eCoarserningType::t: \
122 handle = call_constructor<AsScalarCoarsening<t>::type>(prm); \
125 handle = call_constructor<t>(prm); \
134#undef ARCCORE_ALINA_RUNTIME_COARSENING
137 throw std::invalid_argument(
"Unsupported coarsening type");
145#define ARCCORE_ALINA_RUNTIME_COARSENING(t) \
146 case eCoarserningType::t: \
148 call_destructor<AsScalarCoarsening<t>::type>(); \
151 call_destructor<t>(); \
160#undef ARCCORE_ALINA_RUNTIME_COARSENING
164 template <
class Matrix>
165 std::tuple<std::shared_ptr<Matrix>, std::shared_ptr<Matrix>>
166 transfer_operators(
const Matrix& A)
170#define ARCCORE_ALINA_RUNTIME_COARSENING(t) \
171 case eCoarserningType::t: \
173 return make_operators<AsScalarCoarsening<t>::type>(A); \
175 return make_operators<t>(A)
182#undef ARCCORE_ALINA_RUNTIME_COARSENING
185 throw std::invalid_argument(
"Unsupported coarsening type");
189 template <
class Matrix> std::shared_ptr<Matrix>
194#define ARCCORE_ALINA_RUNTIME_COARSENING(t) \
195 case eCoarserningType::t: \
197 return make_coarse<AsScalarCoarsening<t>::type>(A, P, R); \
199 return make_coarse<t>(A, P, R)
206#undef ARCCORE_ALINA_RUNTIME_COARSENING
209 throw std::invalid_argument(
"Unsupported coarsening type");
213 template <
template <
class>
class Coarsening>
214 std::enable_if_t<backend::coarsening_is_supported<Backend, Coarsening>::value,
void*>
215 call_constructor(
const params& prm)
217 return static_cast<void*
>(
new Coarsening<Backend>(prm));
220 template <
template <
class>
class Coarsening>
221 std::enable_if_t<!backend::coarsening_is_supported<Backend, Coarsening>::value,
void*>
222 call_constructor(
const params&)
224 throw std::logic_error(
"The coarsening is not supported by the backend");
227 template <
template <
class>
class Coarsening>
228 std::enable_if_t<backend::coarsening_is_supported<Backend, Coarsening>::value,
void>
231 delete static_cast<Coarsening<Backend>*
>(handle);
234 template <
template <
class>
class Coarsening>
235 std::enable_if_t<!backend::coarsening_is_supported<Backend, Coarsening>::value,
void>
240 template <
template <
class>
class Coarsening,
class Matrix>
241 std::enable_if_t<backend::coarsening_is_supported<Backend, Coarsening>::value,
242 std::tuple<std::shared_ptr<Matrix>, std::shared_ptr<Matrix>>>
243 make_operators(
const Matrix& A)
const
245 return static_cast<Coarsening<Backend>*
>(handle)->transfer_operators(A);
248 template <
template <
class>
class Coarsening,
class Matrix>
249 std::enable_if_t<!backend::coarsening_is_supported<Backend, Coarsening>::value,
251 std::shared_ptr<Matrix>,
252 std::shared_ptr<Matrix>>>
253 make_operators(
const Matrix&)
255 throw std::logic_error(
"The coarsening is not supported by the backend");
258 template <
template <
class>
class Coarsening,
class Matrix>
259 std::enable_if_t<backend::coarsening_is_supported<Backend, Coarsening>::value,
260 std::shared_ptr<Matrix>>
263 return static_cast<Coarsening<Backend>*
>(handle)->coarse_operator(A, P, R);
266 template <
template <
class>
class Coarsening,
class Matrix>
267 std::enable_if_t<!backend::coarsening_is_supported<Backend, Coarsening>::value,
268 std::shared_ptr<Matrix>>
271 throw std::logic_error(
"The coarsening is not supported by the backend");