44 internal_dof_index = index;
45 return index +
property->get_number_of_internal_dof();
49 return std::pair<size_t, size_t>(
50 internal_dof_index, internal_dof_index + property->get_number_of_internal_dof());
53 std::pair<size_t, size_t> get_interface_reduction_internal_dof() {
54 std::pair<size_t, size_t> r =
property->get_interface_reduction_internal_dof();
55 r.first += internal_dof_index;
56 r.second += internal_dof_index;
60 void set_nodes(std::pair<int, Node* const*> nodes_) {
61 nodes.assign(nodes_.second, nodes_.second + nodes_.first);
65 return std::pair<int, Node* const*>(nodes.size(), &nodes[0]);
70 if (property ==
nullptr) {
71 TypeError() <<
"Super element has wrong property type " <<
typeid(*property_) <<
THROW;
79 assert(property !=
nullptr);
80 return std::vector<Element::VariableInfo>(property->get_order(),
Element::linear);
85 const double time,
const double delta_time,
86 const b2linalg::Matrix<T, b2linalg::Mrectangle_constref>& dof,
88 b2linalg::Index& dof_numbering, b2linalg::Vector<T, b2linalg::Vdense>& value,
89 const std::vector<bool>& d_value_d_dof_flags,
90 std::vector<b2linalg::Matrix<T, MATRIX_TYPE> >& d_value_d_dof,
91 b2linalg::Vector<T, b2linalg::Vdense>& d_value_d_time) {
92 if (!dof_numbering.is_null()) {
93 const size_t id =
property->get_number_of_internal_dof();
94 const size_t ed =
property->get_number_of_external_dof();
95 dof_numbering.resize(
id + ed);
96 size_t* ptr = &dof_numbering[0];
97 for (
size_t k = 0; k != nodes.size(); ++k) {
98 std::pair<size_t, size_t> dn = nodes[k]->get_global_dof_numbering();
99 while (dn.first != dn.second) {
100 if (ptr == &dof_numbering[0] + ed) {
101 Exception() <<
"Number of degree of freedom mismatch in super element "
107 if (ptr != &dof_numbering[0] + ed) {
108 Exception() <<
"Number of degree of freedom mismatch in super element "
111 size_t is = internal_dof_index;
113 for (; is != ie; ++is, ++ptr) { *ptr = is; }
115 if (dof.is_null() || value.is_null()) {
116 property->get_value(value, d_value_d_dof_flags, d_value_d_dof);
119 std::vector<b2linalg::Matrix<T, MATRIX_TYPE> > d_value_d_dof_tmp;
120 std::vector<bool> d_value_d_dof_flags(dof.size2(),
true);
122 value, d_value_d_dof_flags,
123 d_value_d_dof.empty() ? d_value_d_dof_tmp : d_value_d_dof);
124 for (
size_t k = 0; k != d_value_d_dof.size(); ++k) {
125 value += (d_value_d_dof.empty() ? d_value_d_dof_tmp : d_value_d_dof)[k]
126 * dof[k](dof_numbering);
132 return property->face_field_order(face_id, field_name);
136 return property->face_field_linear_on_dof(face_id, field_name);
140 const int face_id,
const std::string& field_name,
141 b2linalg::Matrix<double, b2linalg::Mrectangle>& sub_nodes,
142 std::vector<Element::Triangle>& sub_faces) {
143 return property->face_field_polynomial_sub_face(face_id, field_name, sub_nodes, sub_faces);
148 const b2linalg::Vector<double, b2linalg::Vdense_constref>& internal_coor,
149 b2linalg::Vector<double>& geom,
150 b2linalg::Matrix<double, b2linalg::Mrectangle>& d_geom_d_icoor) {
151 property->face_geom(face_id, internal_coor, geom, d_geom_d_icoor);
154 void face_field_value(
155 const int face_id,
const std::string& field_name,
156 const b2linalg::Vector<double, b2linalg::Vdense_constref>& internal_coor,
157 const b2linalg::Matrix<double, b2linalg::Mrectangle_constref>& dof,
const double time,
158 b2linalg::Vector<double, b2linalg::Vdense>& value,
159 b2linalg::Matrix<double, b2linalg::Mrectangle>& d_value_d_icoor,
160 b2linalg::Index& dof_numbering,
161 b2linalg::Matrix<double, b2linalg::Mrectangle>& d_value_d_dof,
162 b2linalg::Index& d_value_d_dof_dep_col) {
163 property->face_field_value(
164 face_id, field_name, internal_coor, dof, time, value, d_value_d_icoor, dof_numbering,
165 d_value_d_dof, d_value_d_dof_dep_col);
166 if (!dof_numbering.is_null()) {
167 for (
size_t i = 0; i != dof_numbering.size(); ++i) {
168 dof_numbering[i] += internal_dof_index;
176 size_t internal_dof_index;
177 std::vector<Node*> nodes;
178 property_type* property;
void face_geom(const int face_id, const b2linalg::Vector< double, b2linalg::Vdense_constref > &internal_coor, b2linalg::Vector< double > &geom, b2linalg::Matrix< double, b2linalg::Mrectangle > &d_geom_d_icoor)
Definition b2super_element.H:146