60 const FieldLazy& expr0,
61 const SetPlusOp& my_set_plus_op,
64 using size_type =
typename FieldWdof::size_type;
65 using scalar_type =
typename FieldWdof::scalar_type;
66 using memory_type =
typename FieldWdof::memory_type;
67 using geo_type =
typename FieldWdof::geo_type;
68 using space_type =
typename FieldWdof::space_type;
70 FieldLazy expr = expr0;
74 const space_type& Xh = expr.get_space();
75 check_macro (uh.get_space() == Xh,
"invalid spaces");
76 geo_type omega = expr.get_geo();
77 expr.initialize (omega);
78 std::vector<size_type> dis_idx;
79 Eigen::Matrix<scalar_type,Eigen::Dynamic,1> lk;
82 if (Xh.get_constitution().is_discontinuous()) {
83 Xh.get_constitution().neighbour_guard();
85 bool is_on_band = expr.is_on_band();
87 if (is_on_band)
gh = expr.get_band();
91 for (
size_type ie = 0, ne = omega.size(map_d); ie < ne; ie++) {
92 const geo_element& K = omega.get_geo_element (map_d, ie);
97 Xh.get_constitution().assembly_dis_idof (omega, K, dis_idx);
101 Xh.dis_idof (L, dis_idx);
106 expr.evaluate (omega, K, lk);
111 "incompatible sizes dis_idx("<<dis_idx.size()<<
") and lk("<<lk.size()<<
")");
112 for (
size_type loc_idof = 0, loc_ndof = lk.size(); loc_idof < loc_ndof; loc_idof++) {
113 const scalar_type& value = lk [loc_idof];
115 my_set_plus_op (uh.dis_dof_entry (dis_idof), value);
121 uh.dis_dof_update (generic_set_plus_op());
check_macro(expr1.have_homogeneous_space(Xh1), "dual(expr1,expr2); expr1 should have homogeneous space. HINT: use dual(interpolate(Xh, expr1),expr2)")