16 #ifndef dealii_packaged_operation_h 17 #define dealii_packaged_operation_h 19 #include <deal.II/base/config.h> 21 #include <deal.II/base/exceptions.h> 23 #include <deal.II/lac/vector_memory.h> 27 DEAL_II_NAMESPACE_OPEN
30 template <
typename Number>
32 template <
typename Range,
typename Domain,
typename Payload>
34 template <
typename Range = Vector<
double>>
100 template <
typename Range>
111 apply = [](Range &) {
114 "Uninitialized PackagedOperation<Range>::apply called"));
120 "Uninitialized PackagedOperation<Range>::apply_add called"));
125 ExcMessage(
"Uninitialized PackagedOperation<Range>::reinit_vector " 167 apply = [&u](Range &v) { v = u; };
172 v.reinit(u, omit_zeroing_entries);
184 operator Range()
const 189 apply(result_vector);
191 return result_vector;
205 *
this = *
this + second_comp;
216 *
this = *
this - second_comp;
248 *
this = *
this * number;
257 std::function<void(Range &v)>
apply;
289 template <
typename Range>
301 return_comp.
apply = [first_comp, second_comp](Range &v) {
306 return_comp.
apply_add = [first_comp, second_comp](Range &v) {
322 template <
typename Range>
334 return_comp.
apply = [first_comp, second_comp](Range &v) {
335 second_comp.
apply(v);
340 return_comp.
apply_add = [first_comp, second_comp](Range &v) {
358 template <
typename Range>
360 typename Range::value_type number)
369 return_comp.
apply = [](Range &v) { v = 0.; };
375 return_comp.
apply = [comp, number](Range &v) {
380 return_comp.
apply_add = [comp, number](Range &v) {
398 template <
typename Range>
402 return comp * number;
413 template <
typename Range>
428 template <
typename Range>
443 template <
typename Range>
460 template <
typename Range>
477 namespace PackagedOperationImplementation
483 template <
typename T>
484 class has_vector_interface
486 template <
typename C>
487 static std::false_type
490 template <
typename C>
491 static std::true_type
492 test(decltype(&C::operator+=),
493 decltype(&C::operator-=),
494 decltype(&C::l2_norm));
500 using type = decltype(test<T>(
nullptr,
nullptr,
nullptr));
520 template <
typename Range,
521 typename =
typename std::enable_if<
522 internal::PackagedOperationImplementation::has_vector_interface<
523 Range>::type::value>::type>
532 return_comp.
reinit_vector = [&u](Range &x,
bool omit_zeroing_entries) {
533 x.reinit(u, omit_zeroing_entries);
536 return_comp.
apply = [&u, &v](Range &x) {
541 return_comp.
apply_add = [&u, &v](Range &x) {
565 template <
typename Range,
566 typename =
typename std::enable_if<
567 internal::PackagedOperationImplementation::has_vector_interface<
568 Range>::type::value>::type>
577 return_comp.
reinit_vector = [&u](Range &x,
bool omit_zeroing_entries) {
578 x.reinit(u, omit_zeroing_entries);
581 return_comp.
apply = [&u, &v](Range &x) {
586 return_comp.
apply_add = [&u, &v](Range &x) {
609 template <
typename Range,
610 typename =
typename std::enable_if<
611 internal::PackagedOperationImplementation::has_vector_interface<
612 Range>::type::value>::type>
614 typename Range::value_type number)
634 template <
typename Range,
635 typename =
typename std::enable_if<
636 internal::PackagedOperationImplementation::has_vector_interface<
637 Range>::type::value>::type>
661 template <
typename Range,
typename Domain,
typename Payload>
672 return_comp.
apply = [op, &u](Range &v) { op.
vmult(v, u); };
696 template <
typename Range,
typename Domain,
typename Payload>
707 return_comp.
apply = [op, &u](Domain &v) { op.
Tvmult(v, u); };
723 template <
typename Range,
typename Domain,
typename Payload>
735 return_comp.
apply = [op, comp](Domain &v) {
745 return_comp.
apply_add = [op, comp](Domain &v) {
767 template <
typename Range,
typename Domain,
typename Payload>
779 return_comp.
apply = [op, comp](Domain &v) {
789 return_comp.
apply_add = [op, comp](Domain &v) {
804 DEAL_II_NAMESPACE_CLOSE
PackagedOperation< Range > & operator+=(const PackagedOperation< Range > &second_comp)
PackagedOperation(const Range &u)
std::function< void(Range &v)> apply
std::function< void(Range &v, bool omit_zeroing_entries)> reinit_vector
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(Domain &v, const Range &u)> Tvmult
PackagedOperation< Range > & operator-=(const PackagedOperation< Range > &second_comp)
PackagedOperation< Range > & operator=(const PackagedOperation< Range > &)=default
static::ExceptionBase & ExcMessage(std::string arg1)
PackagedOperation< Range > & operator=(const Range &u)
#define Assert(cond, exc)
std::function< void(Range &v, const Domain &u)> vmult
PackagedOperation< Range > operator-(const PackagedOperation< Range > &first_comp, const PackagedOperation< Range > &second_comp)
std::function< void(Domain &v, bool omit_zeroing_entries)> reinit_domain_vector
PackagedOperation< Range > & operator*=(typename Range::value_type number)
std::function< void(Range &v)> apply_add
std::function< void(Range &v, const Domain &u)> vmult_add
PackagedOperation< Range > & operator+=(const Range &offset)
PackagedOperation< Range > operator*(const PackagedOperation< Range > &comp, typename Range::value_type number)
PackagedOperation< Range > operator+(const PackagedOperation< Range > &first_comp, const PackagedOperation< Range > &second_comp)
PackagedOperation< Range > & operator-=(const Range &offset)