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
00034 #ifndef __EDGE_H
00035 #define __EDGE_H
00036
00037 #include <stdlib.h>
00038 #include <string>
00039
00040 #include "OFELI_Config.h"
00041 #include "Node.h"
00042 #include "output.h"
00043
00044 using std::string;
00045
00046 namespace OFELI {
00047
00052 class Element;
00053 class Edge;
00054
00065 #ifndef DOXYGEN_SHOULD_SKIP_THIS
00066 struct ErrorInEdge {
00067 void Message(const char *file, size_t line, int code, int p1=0);
00068 };
00069 #endif
00070
00071 class Edge
00072 {
00073
00074 public:
00075
00076
00077
00080 Edge();
00081
00084 Edge(size_t label);
00085
00087 Edge(const Edge &ed);
00088
00090 ~Edge()
00091 {
00092 #ifdef _OFELI_DEBUG
00093 std::clog << "An instance of class Edge is destructed.\n";
00094 std::clog << "File : " << __FILE__ << ", Line : " << __LINE__ << endl;
00095 #endif
00096 }
00097
00098
00099
00101 void Add(size_t n, Node *node);
00102
00104 void setLabel(size_t i) { _label = i; }
00105
00107 void setFirstDOF(size_t n) { _first_dof = n; }
00108
00110 void setNbDOF(size_t nb_dof) { _nb_dof = nb_dof; }
00111
00113 void setDOF(size_t i, size_t dof) { _dof[i-1] = dof; }
00114
00119 void setCode(size_t dof, int code) { _code[dof-1] = code; }
00120
00122 void AddNeighbor(Side *sd) { _sd[_neig_sd++] = sd; }
00123
00124
00125
00127 size_t getLabel() const { return _label; }
00128
00130 size_t getNbEq() const { return _nb_eq; }
00131
00133 size_t getNbDOF() const { return _nb_dof; }
00134
00136 int getCode(size_t dof) const { return _code[dof-1]; }
00137
00139 size_t getDOF(size_t i) const { return _dof[i-1]; }
00140
00142 size_t getFirstDOF() const { return _first_dof; }
00143
00145 Node *getPtrNode(size_t i) const { return _node[i-1]; }
00146
00148 size_t getNodeLabel(size_t i) const { return _node[i-1]->getLabel(); }
00149
00151 Side *getNeighborSide(size_t i) const { if (_sd[i-1]) return _sd[i-1]; else return NULL; }
00152
00157 int isOnBoundary() const
00158 {
00159 _on_boundary = -1;
00160 if ((_sd[0] && !_sd[1]) || (!_sd[0] && _sd[1]))
00161 _on_boundary = 1;
00162 if (_sd[0] && _sd[1])
00163 _on_boundary = 0;
00164 return _on_boundary;
00165 }
00166
00168 void setOnBoundary();
00169
00172 Node *operator()(size_t i) { return getPtrNode(i); }
00173
00174 private:
00175
00176 valarray<int> _code;
00177 valarray<size_t> _dof;
00178 mutable int _on_boundary;
00179 size_t _nb_dof, _label, _nb_eq, _first_dof, _neig_sd;
00180 Node *_node[2];
00181 Side *_sd[2];
00182 ErrorInEdge _e;
00183 };
00184
00185
00189 ostream& operator<<(ostream& s, const Edge &ed);
00190
00191 }
00192
00193
00194 #endif