17 #include <deal.II/base/std_cxx14/memory.h>
19 #include <deal.II/fe/fe_p1nc.h>
21 DEAL_II_NAMESPACE_OPEN
27 std::vector<bool>(1, false),
52 UpdateFlags out = update_default;
54 if (flags & update_values)
55 out |= update_values | update_quadrature_points;
56 if (flags & update_gradients)
57 out |= update_gradients;
58 if (flags & update_cell_normal_vectors)
59 out |= update_cell_normal_vectors | update_JxW_values;
60 if (flags & update_hessians)
61 out |= update_hessians;
68 std::unique_ptr<FiniteElement<2, 2>>
71 return std_cxx14::make_unique<FE_P1NC>(*
this);
76 std::vector<unsigned int>
79 std::vector<unsigned int> dpo(3);
88 std::array<std::array<double, 3>, 4>
93 const Point<2> mpt[4] = {(cell->vertex(0) + cell->vertex(2)) / 2,
94 (cell->vertex(1) + cell->vertex(3)) / 2,
95 (cell->vertex(0) + cell->vertex(1)) / 2,
96 (cell->vertex(2) + cell->vertex(3)) / 2};
100 (cell->vertex(0) + cell->vertex(1) + cell->vertex(2) + cell->vertex(3)) / 4;
102 const double det = (mpt[0](0) - mpt[1](0)) * (mpt[2](1) - mpt[3](1)) -
103 (mpt[2](0) - mpt[3](0)) * (mpt[0](1) - mpt[1](1));
105 std::array<std::array<double, 3>, 4> coeffs;
107 ((mpt[2](1) - mpt[3](1)) * (0.5) - (mpt[0](1) - mpt[1](1)) * (0.5)) / det;
109 ((mpt[2](1) - mpt[3](1)) * (-0.5) - (mpt[0](1) - mpt[1](1)) * (0.5)) / det;
111 ((mpt[2](1) - mpt[3](1)) * (0.5) - (mpt[0](1) - mpt[1](1)) * (-0.5)) / det;
113 ((mpt[2](1) - mpt[3](1)) * (-0.5) - (mpt[0](1) - mpt[1](1)) * (-0.5)) / det;
116 (-(mpt[2](0) - mpt[3](0)) * (0.5) + (mpt[0](0) - mpt[1](0)) * (0.5)) / det;
118 (-(mpt[2](0) - mpt[3](0)) * (-0.5) + (mpt[0](0) - mpt[1](0)) * (0.5)) / det;
120 (-(mpt[2](0) - mpt[3](0)) * (0.5) + (mpt[0](0) - mpt[1](0)) * (-0.5)) / det;
122 (-(mpt[2](0) - mpt[3](0)) * (-0.5) + (mpt[0](0) - mpt[1](0)) * (-0.5)) /
125 coeffs[0][2] = 0.25 - cpt(0) * coeffs[0][0] - cpt(1) * coeffs[0][1];
126 coeffs[1][2] = 0.25 - cpt(0) * coeffs[1][0] - cpt(1) * coeffs[1][1];
127 coeffs[2][2] = 0.25 - cpt(0) * coeffs[2][0] - cpt(1) * coeffs[2][1];
128 coeffs[3][2] = 0.25 - cpt(0) * coeffs[3][0] - cpt(1) * coeffs[3][1];
135 std::unique_ptr<FiniteElement<2, 2>::InternalDataBase>
137 const UpdateFlags update_flags,
144 std_cxx14::make_unique<FiniteElement<2, 2>::InternalDataBase>();
148 const unsigned int n_q_points = quadrature.
size();
152 if (data_ptr->update_each & update_hessians)
160 std::unique_ptr<FiniteElement<2, 2>::InternalDataBase>
161 FE_P1NC::get_face_data(
162 const UpdateFlags update_flags,
169 std_cxx14::make_unique<FiniteElement<2, 2>::InternalDataBase>();
173 const unsigned int n_q_points = quadrature.
size();
177 if (data_ptr->update_each & update_hessians)
185 std::unique_ptr<FiniteElement<2, 2>::InternalDataBase>
186 FE_P1NC::get_subface_data(
187 const UpdateFlags update_flags,
194 std_cxx14::make_unique<FiniteElement<2, 2>::InternalDataBase>();
198 const unsigned int n_q_points = quadrature.
size();
202 if (data_ptr->update_each & update_hessians)
223 const UpdateFlags flags(fe_internal.update_each);
228 std::array<std::array<double, 3>, 4> coeffs =
232 if (flags & update_values)
233 for (
unsigned int i = 0; i < n_q_points; ++i)
239 if (flags & update_gradients)
240 for (
unsigned int i = 0; i < n_q_points; ++i)
243 Point<2>(coeffs[k][0], coeffs[k][1]);
251 const unsigned int face_no,
255 const ::internal::FEValuesImplementation::MappingRelatedData<2, 2> &,
256 const InternalDataBase &fe_internal,
260 const UpdateFlags flags(fe_internal.update_each);
263 const std::array<std::array<double, 3>, 4> coeffs =
270 if (flags & update_values)
271 for (
unsigned int i = 0; i < quadrature_on_face.
size(); ++i)
276 quadrature_on_face.
point(i));
279 (coeffs[k][0] * quadrature_point(0) +
280 coeffs[k][1] * quadrature_point(1) + coeffs[k][2]);
283 if (flags & update_gradients)
284 for (
unsigned int i = 0; i < quadrature_on_face.
size(); ++i)
287 Point<2>(coeffs[k][0], coeffs[k][1]);
295 const unsigned int face_no,
296 const unsigned int sub_no,
300 const ::internal::FEValuesImplementation::MappingRelatedData<2, 2> &,
301 const InternalDataBase &fe_internal,
305 const UpdateFlags flags(fe_internal.update_each);
308 const std::array<std::array<double, 3>, 4> coeffs =
315 if (flags & update_values)
316 for (
unsigned int i = 0; i < quadrature_on_subface.
size(); ++i)
322 cell, quadrature_on_subface.
point(i));
325 (coeffs[k][0] * quadrature_point(0) +
326 coeffs[k][1] * quadrature_point(1) + coeffs[k][2]);
330 if (flags & update_gradients)
331 for (
unsigned int i = 0; i < quadrature_on_subface.
size(); ++i)
334 Point<2>(coeffs[k][0], coeffs[k][1]);
351 DEAL_II_NAMESPACE_CLOSE