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;