27 virtual size_t get_number_of_nodes() {
return nb_nodes; }
29 virtual size_t get_number_of_internal_dof() {
return nb_internal_dof; }
31 virtual size_t get_number_of_external_dof() {
return nb_external_dof; }
33 virtual std::pair<size_t, size_t> get_interface_reduction_internal_dof() {
34 return std::pair<size_t, size_t>(
35 nb_internal_dof - nb_interface_reduction_internal_dof, nb_internal_dof);
38 virtual int get_order() {
return d_value_d_dof.size() - 1; }
40 virtual void get_value(
41 b2linalg::Vector<double>& value_,
const std::vector<bool>& d_value_d_dof_flags,
42 std::vector<b2linalg::Matrix<double, b2linalg::Mpacked> >& d_value_d_dof_) {
43 if (!value_.is_null()) {
47 value_.resize(nb_external_dof + nb_internal_dof);
51 if (!d_value_d_dof_.empty()) {
52 for (
size_t i = 0; i != d_value_d_dof_flags.size(); ++i) {
53 if (d_value_d_dof_flags[i]) {
54 if (d_value_d_dof.size() <= i || d_value_d_dof[i].size1() == 0) {
55 d_value_d_dof_[i].resize(nb_external_dof + nb_internal_dof);
56 d_value_d_dof_[i].set_zero();
58 d_value_d_dof_[i] = d_value_d_dof[i];
65 virtual int face_field_order(
const int face_id,
const std::string& field_name) {
66 std::pair<int, Element*> face = get_face(face_id);
67 return face.second->face_field_order(face.first, field_name);
70 virtual bool face_field_linear_on_dof(
const int face_id,
const std::string& field_name) {
71 std::pair<int, Element*> face = get_face(face_id);
72 return face.second->face_field_linear_on_dof(face.first, field_name);
75 virtual int face_field_polynomial_sub_face(
76 const int face_id,
const std::string& field_name,
77 b2linalg::Matrix<double, b2linalg::Mrectangle>& sub_nodes,
78 std::vector<Element::Triangle>& sub_faces) {
79 std::pair<int, Element*> face = get_face(face_id);
80 return face.second->face_field_polynomial_sub_face(
81 face.first, field_name, sub_nodes, sub_faces);
84 virtual void face_geom(
86 const b2linalg::Vector<double, b2linalg::Vdense_constref>& internal_coor,
87 b2linalg::Vector<double>& geom,
88 b2linalg::Matrix<double, b2linalg::Mrectangle>& d_geom_d_icoor) {
89 std::pair<int, Element*> face = get_face(face_id);
90 face.second->face_geom(face.first, internal_coor, geom, d_geom_d_icoor);
93 virtual void face_field_value(
94 const int face_id,
const std::string& field_name,
95 const b2linalg::Vector<double, b2linalg::Vdense_constref>& internal_coor,
96 const b2linalg::Matrix<double, b2linalg::Mrectangle_constref>& dof,
const double time,
97 b2linalg::Vector<double, b2linalg::Vdense>& value,
98 b2linalg::Matrix<double, b2linalg::Mrectangle>& d_value_d_icoor,
99 b2linalg::Index& dof_numbering,
100 b2linalg::Matrix<double, b2linalg::Mrectangle>& d_value_d_dof,
101 b2linalg::Index& d_value_d_dof_dep_col) {
107 size_t nb_external_dof;
108 size_t nb_internal_dof;
109 size_t nb_interface_reduction_internal_dof;
110 b2linalg::Vector<double> value;
111 std::vector<b2linalg::Matrix<double, b2linalg::Mpacked> > d_value_d_dof;
113 std::pair<int, Element*>& get_face(
const int face_id) {
114 if (face_id > ssize_t(list_faces.size())) {
115 Exception() <<
"Unknown face id " << face_id <<
" in element property "
118 return list_faces[face_id - 1];
120 std::vector<std::pair<int, Element*> > list_faces;