16 #ifndef projection_operator_h
17 #define projection_operator_h
78 const Range &range_exemplar,
79 const std::vector<std::reference_wrapper<const Domain>> &local_basis,
80 const Domain *domain_exemplar =
nullptr,
81 const Payload &payload = Payload())
86 static const auto id = range_exemplar.locally_owned_elements();
89 for (
const auto j :
id)
90 dst[j] = local_basis[i++].get() * src;
94 local_basis](Range &dst,
const Domain &src) {
95 static const auto id = range_exemplar.locally_owned_elements();
98 for (
const auto j :
id)
99 dst[j] += local_basis[i++].get() * src;
104 static const auto id = range_exemplar.locally_owned_elements();
108 for (
const auto j :
id)
109 dst.sadd(1.0, src[j], local_basis[i++]);
114 local_basis](Domain &dst,
const Range &src) {
115 static const auto id = range_exemplar.locally_owned_elements();
118 for (
const auto j :
id)
119 dst.sadd(1.0, src[j], local_basis[i++]);
125 dst.reinit(range_exemplar, fast);
128 if (domain_exemplar !=
nullptr)
131 dst.reinit(*domain_exemplar, fast);
135 Assert(local_basis.size() > 0,
136 ExcMessage(
"If domain_exemplar is not provided, "
137 "local_basis must contain at least one element."));
140 dst.reinit(local_basis[0].get(), fast);
#define Assert(cond, exc)
#define AssertDimension(dim1, dim2)
static ::ExceptionBase & ExcMessage(std::string arg1)
LinearOperator< Range, Domain, TrilinosWrappers::internal::LinearOperatorImplementation::TrilinosPayload > linear_operator(const TrilinosWrappers::SparseMatrix &operator_exemplar, const Matrix &matrix)
LinearOperator< Range, Domain, Payload > projection_operator(const Range &range_exemplar, const std::vector< std::reference_wrapper< const Domain >> &local_basis, const Domain *domain_exemplar=nullptr, const Payload &payload=Payload())
Construct a LinearOperator object that projects a vector onto a basis.