13#ifndef dealii_constrained_linear_operator_h
14#define dealii_constrained_linear_operator_h
71template <
typename Range,
typename Domain,
typename Payload>
79 return_op.
vmult_add = [&constraints](Range &v,
const Domain &u) {
81 ::ExcMessage(
"The domain and range vectors must be different "
82 "storage locations"));
88 const auto &locally_owned_elements = v.locally_owned_elements();
89 for (
const auto &line : constraints.
get_lines())
91 const auto i = line.index;
92 if (locally_owned_elements.is_element(i))
95 const auto &entries = line.entries;
98 const auto pos = entries[j].first;
99 v(i) += u(pos) * entries[j].second;
107 return_op.
Tvmult_add = [&constraints](Domain &v,
const Range &u) {
109 ::ExcMessage(
"The domain and range vectors must be different "
110 "storage locations"));
116 const auto &locally_owned_elements = v.locally_owned_elements();
117 for (
const auto &line : constraints.
get_lines())
119 const auto i = line.index;
121 if (locally_owned_elements.is_element(i))
126 const auto &entries = line.entries;
129 const auto pos = entries[j].first;
130 if (locally_owned_elements.is_element(pos))
131 v(pos) += u(i) * entries[j].second;
164template <
typename Range,
typename Domain,
typename Payload>
172 return_op.
vmult_add = [&constraints](Range &v,
const Domain &u) {
173 const auto &locally_owned_elements = v.locally_owned_elements();
174 for (
const auto &line : constraints.
get_lines())
176 const auto i = line.index;
177 if (locally_owned_elements.is_element(i))
186 return_op.
Tvmult_add = [&constraints](Domain &v,
const Range &u) {
187 const auto &locally_owned_elements = v.locally_owned_elements();
188 for (
const auto &line : constraints.
get_lines())
190 const auto i = line.index;
191 if (locally_owned_elements.is_element(i))
256template <
typename Range,
typename Domain,
typename Payload>
265 return Ct * linop * C + Id_c;
306template <
typename Range,
typename Domain,
typename Payload>
311 const Range &right_hand_side)
317 return_comp.
apply_add = [&constraints, &linop, &right_hand_side](Range &v) {
326 v += Ct * (right_hand_side - linop * *k);
329 return_comp.
apply = [apply_add = return_comp.
apply_add](Range &v) {
LineRange get_lines() const
void distribute(VectorType &vec) const
std::function< void(Range &v, const Domain &u)> vmult_add
std::function< void(Domain &v, const Range &u)> Tvmult
std::function< void(Domain &v, bool omit_zeroing_entries)> reinit_domain_vector
std::function< void(Range &v, const Domain &u)> vmult
std::function< void(Range &v, bool omit_zeroing_entries)> reinit_range_vector
std::function< void(Domain &v, const Range &u)> Tvmult_add
std::function< void(Range &v, bool omit_zeroing_entries)> reinit_vector
std::function< void(Range &v)> apply
std::function< void(Range &v)> apply_add
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
#define Assert(cond, exc)
static ::ExceptionBase & ExcMessage(std::string arg1)
LinearOperator< Domain, Range, Payload > transpose_operator(const LinearOperator< Range, Domain, Payload > &op)
PackagedOperation< Range > constrained_right_hand_side(const AffineConstraints< typename Range::value_type > &constraints, const LinearOperator< Range, Domain, Payload > &linop, const Range &right_hand_side)
LinearOperator< Range, Domain, Payload > constrained_linear_operator(const AffineConstraints< typename Range::value_type > &constraints, const LinearOperator< Range, Domain, Payload > &linop)
LinearOperator< Range, Domain, Payload > project_to_constrained_linear_operator(const AffineConstraints< typename Range::value_type > &constraints, const LinearOperator< Range, Domain, Payload > &exemplar)
LinearOperator< Range, Domain, Payload > distribute_constraints_linear_operator(const AffineConstraints< typename Range::value_type > &constraints, const LinearOperator< Range, Domain, Payload > &exemplar)
static bool equal(const T *p1, const T *p2)