00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #ifndef __ELEMENT_H
00034 #define __ELEMENT_H
00035
00036 #include <stdlib.h>
00037 #include <math.h>
00038
00039 #include <valarray>
00040 using std::valarray;
00041
00042 #include <string>
00043 using std::string;
00044
00045 #include "OFELI_Config.h"
00046 #include "Side.h"
00047 #include "Node.h"
00048 #include "Material.h"
00049
00050 namespace OFELI {
00051
00052
00053
00054
00059 #ifndef DOXYGEN_SHOULD_SKIP_THIS
00060 struct ErrorInElement {
00061 void Message(const char *file, size_t line, int code, int p1=0, const char *p2=" ") const;
00062 };
00063 #endif
00064
00077 class Element
00078 {
00079
00080 public:
00081
00082
00083
00085 Element();
00086
00091 Element(size_t label, const string &shape);
00092
00097 Element(size_t label, int shape);
00098
00104 Element(size_t label, const string &shape, int c);
00105
00111 Element(size_t label, int shape, int c);
00112
00114 Element(const Element &el);
00115
00117 ~Element();
00118
00119
00120
00123 void setLabel(size_t i) { _label = i; }
00124
00127 void setCode(int c) { _code = c; }
00128
00131 void setMaterial(Material &m) { _material = &m; }
00132
00135 void Add(Node *node);
00136
00140 void Add(Node *node, int n);
00141
00145 void Replace(size_t label, Node *node);
00146
00150 void Replace(size_t label, Side *side);
00151
00154 void Add(Side *sd);
00155
00158 void Add(Element *el) { _neig_el[_nb_neig_el++] = el; }
00159
00163 void setDOF(size_t i, size_t dof) { _dof[i-1] = dof; }
00164
00168 void setCode(size_t dof, int code) { _dof_code[dof-1] = code; }
00169
00171 void setNode(size_t i, Node *node);
00172
00173
00174
00176 int getShape() const { return _shape; }
00177
00179 size_t getLabel() const { return _label; }
00180
00182 int getCode() const { return _code; }
00183
00185 size_t getNbNodes() const { return _nb_nodes; }
00186
00188 size_t getNbVertices() const;
00189
00191 size_t getNbSides() const;
00192
00194 size_t getNbEq() const { return _nb_eq; }
00195
00197 size_t getNbDOF() const { return 1; }
00198
00200 size_t getDOF() const { return _label; }
00201
00203 Material *getMaterial() const { return _material; }
00204
00206 size_t getNodeLabel(size_t n) const { return _node[n-1]->getLabel(); }
00207
00209 size_t getSideLabel(size_t n) const { return _side[n-1]->getLabel(); }
00210
00212 Node *getPtrNode(size_t i) const { return _node[i-1]; }
00213
00215 Side *getPtrSide(size_t i) const { return _side[i-1]; }
00216
00219 int Contains(const Node *n) const;
00220
00223 int Contains(const Side *s) const;
00224
00230 Element *getNeighborElement(size_t i) const { return _neig_el[i-1]; }
00231
00235 size_t getNbNeigElements() const { return _nb_neig_el; }
00236
00242 double getMeasure() const;
00243
00246 Point<double> getUnitNormal(size_t i) const;
00247
00253 bool isOnBoundary() const
00254 {
00255 for (size_t i=0; i<_nb_sides; i++)
00256 if (_side[i]->isOnBoundary())
00257 return true;
00258 return false;
00259 }
00260
00262 Node *operator()(size_t i) { return getPtrNode(i); }
00263
00270 int setSide(size_t n, size_t *nd, int shape);
00271
00272 friend class Mesh;
00273 friend void Refine(Mesh &in_mesh, Mesh &out_mesh);
00274 friend ostream& operator<<(ostream& s, const Mesh &ms);
00275
00276 private :
00277
00278 size_t _nb_nodes, _nb_eq, _nb_sides, _label, _nbs, _nb_neig_el;
00279 int _code, _shape;
00280 int _dof_code[MAX_NBDOF_SIDE];
00281 size_t _dof[MAX_NBDOF_SIDE];
00282 Node* _node[MAX_NB_ELEMENT_NODES];
00283 Side* _side[MAX_NB_ELEMENT_SIDES];
00284 Element* _neig_el[MAX_NB_ELEMENT_SIDES];
00285 Element* _sub_el[4], *_in_el;
00286 ErrorInElement _e;
00287 Material *_material;
00288 bool _alive;
00289
00290 void calculate_nb_sides();
00291 void shape_index(const string &shape);
00292 void InElement(Element *e) { _in_el = e; }
00293 Element *InElement() const { return _in_el; }
00294 void SubDivide(size_t i, Element *e) { _sub_el[i-1] = e; }
00295 Element *SubElement(size_t i) const { return _sub_el[i-1]; }
00296
00297 };
00298
00300
00302
00306 ostream& operator<<(ostream& s, const Element & el);
00307
00308 }
00309
00310 #endif