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