24 #ifndef NIHU_ASSEMBLY_HPP_INCLUDED
25 #define NIHU_ASSEMBLY_HPP_INCLUDED
29 #include "../util/matrix_block.hpp"
38 template <
class TestSpace,
class TrialSpace,
class OnSameMesh>
48 template <
class Operator,
class TestField,
class TrialField,
bool isTrivial =
50 !std::is_same<typename TestField::elem_t, typename TrialField::elem_t>::value
61 template <
class result_t>
69 for (
auto test_it = test_space.template field_begin<TestField>();
70 test_it != test_space.template field_end<TestField>(); ++test_it)
71 for (
auto trial_it = trial_space.template field_begin<TrialField>();
72 trial_it != trial_space.template field_end<TrialField>(); ++trial_it)
74 block(result, test_it->get_dofs(), trial_it->get_dofs())
81 auto test_it = test_space.template field_begin<TestField>();
82 auto test_end = test_space.template field_end<TestField>();
83 auto trial_it = trial_space.template field_begin<TrialField>();
84 auto trial_end = trial_space.template field_end<TrialField>();
86 for (; test_it != test_end; ++test_it)
88 auto test_id = test_it->get_elem().get_id();
89 for (; trial_it != trial_end && trial_it->get_elem().get_id() < test_id; ++trial_it);
90 if (trial_it->get_elem().get_id() == test_id)
92 block(result, test_it->get_dofs(), trial_it->get_dofs())
102 template <
class Operator,
class TestField,
class TrialField>
103 struct eval_on_impl<Operator, TestField, TrialField, true>
105 template <
class result_t>
121 template <
class Operator,
class TestField,
class TrialField>
122 struct eval_on : eval_on_impl<Operator, TestField, TrialField>
136 template <
class result_t,
class Operator>
149 eval_on<Operator, tmp::_1, tmp::_2>,
154 >(result, op, test_space, trial_space);