b2api
B2000++ API Reference Manual, VERSION 4.6
 
Loading...
Searching...
No Matches
b2super_element_properties.H
1//------------------------------------------------------------------------
2// b2super_element_properties.H --
3//
4// written by doreille
5//
6// Copyright (c) 2010-2012 SMR Engineering & Development SA
7// 2502 Bienne, Switzerland
8//
9// All Rights Reserved. Proprietary source code. The contents of
10// this file may not be disclosed to third parties, copied or
11// duplicated in any form, in whole or in part, without the prior
12// written permission of SMR.
13//------------------------------------------------------------------------
14
15#ifndef B2SUPER_ELEMENT_PROPERTIES_H_
16#define B2SUPER_ELEMENT_PROPERTIES_H_
17
18#include "model/b2element.H"
19#include "utils/b2linear_algebra.H"
20
21namespace b2000 {
22
25class SuperElementProperty : virtual public ElementProperty {
26public:
27 virtual size_t get_number_of_nodes() { return nb_nodes; }
28
29 virtual size_t get_number_of_internal_dof() { return nb_internal_dof; }
30
31 virtual size_t get_number_of_external_dof() { return nb_external_dof; }
32
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);
36 }
37
38 virtual int get_order() { return d_value_d_dof.size() - 1; }
39
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()) {
44 if (!value.empty()) {
45 value_ = value;
46 } else {
47 value_.resize(nb_external_dof + nb_internal_dof);
48 value_.set_zero();
49 }
50 }
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();
57 } else {
58 d_value_d_dof_[i] = d_value_d_dof[i];
59 }
60 }
61 }
62 }
63 }
64
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);
68 }
69
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);
73 }
74
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);
82 }
83
84 virtual void face_geom(
85 const int face_id,
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);
91 }
92
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) {
103 }
104
105protected:
106 size_t nb_nodes;
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;
112
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 "
116 << get_object_name() << THROW;
117 }
118 return list_faces[face_id - 1];
119 }
120 std::vector<std::pair<int, Element*> > list_faces;
121};
122
123} // namespace b2000
124
125#endif /* B2SUPER_ELEMENT_PROPERTIES_H_ */
#define THROW
Definition b2exception.H:198
Definition b2element.H:71
const std::string & get_object_name() const override
Definition b2element.H:83
Definition b2exception.H:131
Definition b2super_element_properties.H:25
Contains the base classes for implementing Finite Elements.
Definition b2boundary_condition.H:32
GenericException< UnimplementedError_name > UnimplementedError
Definition b2exception.H:314