00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #ifndef MA_MESH_H
00011 #define MA_MESH_H
00012
00016 #include <apfMesh2.h>
00017 #include <apfMatrix.h>
00018 #include <set>
00019
00020 namespace ma {
00021
00023 typedef apf::Vector3 Vector;
00025 typedef apf::Matrix3x3 Matrix;
00027 typedef apf::Mesh2 Mesh;
00029 typedef apf::MeshEntity Entity;
00031 typedef apf::MeshIterator Iterator;
00033 typedef apf::MeshTag Tag;
00035 typedef apf::DynamicArray<Entity*> EntityArray;
00037 typedef std::set<Entity*> EntitySet;
00039 typedef EntityArray Upward;
00041 typedef apf::Downward Downward;
00043 typedef apf::ModelEntity Model;
00044
00046 Vector getPosition(Mesh* m, Entity* vertex);
00047
00049 typedef apf::Copies Remotes;
00051 typedef apf::Parts Parts;
00052
00053 void rotateTri(Entity** iv, int n, Entity** ov);
00054 void rotateQuad(Entity** iv, int n, Entity** ov);
00055 void rotateTet(Entity** iv, int n, Entity** ov);
00056 void rotatePrism(Entity** iv, int n, Entity** ov);
00057 void rotatePyramid(Entity** iv, int n, Entity** ov);
00058 void rotateEntity(int type, Entity** iv, int n, Entity** ov);
00059 void rotateEntity(apf::Mesh* m, Entity* e, int n, Entity** v);
00060
00061 int findTetRotation(Mesh* m, Entity* tet, Entity** v);
00062 void unrotateTetXi(Vector& xi, int rotation);
00063
00064 void rotateOct(Entity** iv, int n, Entity** ov);
00065
00066 int getDownIndex(Mesh* m, Entity* e, Entity* de);
00067 Entity* getTriEdgeOppositeVert(Mesh* m, Entity* tri, Entity* v);
00068 Entity* getTriVertOppositeEdge(Mesh* m, Entity* tri, Entity* v);
00069 Entity* getTetVertOppositeTri(Mesh* m, Entity* tet, Entity* tri);
00070 Entity* getQuadEdgeOppositeEdge(Mesh* m, Entity* q, Entity* e);
00071
00072 Entity* findTetByTwoTris(Mesh* m, Entity** tris);
00073
00074 void getVertPoints(apf::Mesh* m, Entity* e, Vector* p);
00075
00076 struct RebuildCallback {
00077 virtual void rebuilt(Entity* e, Entity* original) = 0;
00078 };
00079
00083 Entity* rebuildElement(
00084 Mesh* m,
00085 Entity* original,
00086 Entity* oldVert,
00087 Entity* newVert,
00088 apf::BuildCallback* cb,
00089 RebuildCallback* rcb = 0);
00090
00091 bool isInClosure(Mesh* m, Entity* parent, Entity* e);
00092
00093 void getBoundingBox(Mesh* m, Vector& lower, Vector& upper);
00094 Vector getCentroid(Mesh* m);
00095
00096 void ensureParallelConsistency(Mesh* m);
00097
00098 Entity* findTriFromVerts(Mesh* m, Entity** v);
00099
00100 bool isOnModelEdge(Mesh* m, Entity* e);
00101 bool isOnModelFace(Mesh* m, Entity* e);
00102
00103 Vector getTriNormal(Mesh* m, Entity** v);
00104 Vector getTriNormal(Mesh* m, Entity* e);
00105 bool isTwoTriAngleAcute(Mesh* m, Entity** va, Entity** vb);
00106 bool isTwoTriAngleAcute(Mesh* m, Entity* a, Entity* b);
00107
00111 double getInsphere(Mesh* m, Entity* e);
00112
00113 double getAverageElementSize(Mesh* m);
00114 double getMinimumElementSize(Mesh* m);
00115
00116 void getFaceEdgesAndDirections(
00117 Mesh* m,
00118 Entity* face,
00119 Entity** edges,
00120 int* directions);
00121
00122 Entity* findEdge(Mesh* m, Entity* v0, Entity* v1);
00123 bool edgeExists(Mesh* m, Entity* v0, Entity* v1);
00124
00125
00126
00127 bool isTriEdgeAligned(Mesh* m, Entity* tri, Entity* edge);
00128
00129 }
00130
00131 #endif