00001
00002
00003
00004
00005
00006
00007 #ifndef __CHARM_FEM_ADAPT_H
00008 #define __CHARM_FEM_ADAPT_H
00009
00010 #include "charm-api.h"
00011 #include "ckvector3d.h"
00012 #include "fem.h"
00013 #include "fem_mesh.h"
00014
00015 class FEM_Adapt {
00016 FEM_Mesh *theMesh;
00018 int cid;
00020 FEM_DataAttribute *nodeValid, *elemValid;
00022 FEM_DataAttribute *validDataFor(int entityNumber);
00023
00024
00026
00028 int check_orientation(int e1, int e3, int n, int n1, int n2);
00030
00038 void adj_traverse(int n, int startNode, int stopNode, int startElem,
00039 int stopElem, int *nn, int *ne, int *nodeList,
00040 int *elemList);
00045 int newSlot(FEM_DataAttribute *validData);
00046 void invalidateSlot(FEM_DataAttribute *validData,int slotNumber);
00047 void printValidArray(FEM_DataAttribute *validData);
00048 public:
00051
00054 int get_edge_index(int local_node1, int local_node2);
00056
00058 int find_local_node_index(int e, int n);
00059 void findAdjData(int n1, int n2, int *e1, int *e2, int *en1, int *en2,
00060 int *en3, int *n3, int *edge, int *nbr);
00061 void findAdjData(int n1, int n2, int e2, int *en1, int *en2, int *en3,
00062 int *n4, int *edge, int *nbr);
00063
00065 FEM_Adapt(FEM_Mesh *m) {
00066 cid = -1;
00067 theMesh = m;
00068 nodeValid = validDataFor(FEM_NODE);
00069 elemValid = validDataFor(FEM_ELEM);
00070 }
00072 FEM_Adapt(FEM_Mesh *m, int chunkId) {
00073 cid = chunkId;
00074 theMesh = m;
00075 nodeValid = validDataFor(FEM_NODE);
00076 elemValid = validDataFor(FEM_ELEM);
00077 }
00079
00086 virtual int edge_flip(int n1, int n2);
00088 virtual int edge_flip_help(int e1, int e2, int n1, int n2, int e1_n1,
00089 int e1_n2, int e1_n3, int n3, int edge1,
00090 int e1nbr);
00091
00093
00097 virtual int edge_bisect(int n1, int n2);
00099 virtual int edge_bisect_help(int e1, int e2, int n1, int n2, int e1_n1,
00100 int e1_n2, int e1_n3, int n3, int edge1,
00101 int e1nbr);
00102 void localEdgeBisect(int n1, int n2, int e1, int e2, int e3, int e1n1,
00103 int e1n2, int e1n3, int e1nbr, int n3, int n5);
00104
00106
00110 virtual int vertex_remove(int n1, int n2);
00112 virtual int vertex_remove_help(int e1, int e2, int n1, int n2, int e1_n1,
00113 int e1_n2, int e1_n3, int n3, int edge1,
00114 int e1nbr);
00115
00117
00121 virtual int edge_contraction(int n1, int n2);
00122 virtual int edge_contraction(int e1, int n1, int n2);
00123 virtual int edge_contraction_help(int e1, int e2, int n1, int n2, int e1_n1,
00124 int e1_n2);
00125
00127
00131 virtual int vertex_split(int n, int n1, int n2);
00132 virtual int vertex_split(int n, int n1, int n2, int e1, int e3);
00133
00134
00135
00136
00138
00145
00146 int newNode();
00148 int newElement();
00150 void deleteNode(int n);
00152 void deleteElement(int e);
00153
00154
00156
00158
00159
00162 void addSharedNodeInstance(int n, int someIdx, int someChunk) {}
00163 void removeSharedNodeInstance(int n, int someIdx, int someChunk) {}
00164 int lookupSharedNodeInstance(int someIdx, int someChunk) {return -1;}
00165
00167
00168 int newGhostNode() {return -1;}
00169 int newGhostNode(int remoteChunk, int remoteIdx) {return -1;}
00170 void updateGhostNode(int n, int remoteChunk, int remoteIdx) {}
00171 void deleteGhostNode(int n) {}
00173 int newGhostElement() {return -1;}
00174 int newGhostElement(int remoteChunk, int remoteIdx) {return -1;}
00175 void updateGhostElement(int e, int remoteChunk, int remoteIdx) {}
00176 void deleteGhostElement(int e) {}
00177 int getRemoteChunkID(int e) {return -1;}
00178 int getRemoteIndex(int e) {return -1;}
00179
00181 int isSharedNode(int n) {return 0;}
00182 int isGhostNode(int n) {return 0;}
00183 int isGhostElement(int e) {return 0;}
00184 int getGhostNode(int remoteChunk, int remoteIdx) {return -1;}
00185 int getGhostElement(int remoteChunk, int remoteIdx) {return -1;}
00186 };
00187
00188 #endif