00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef __CHARM_FEM_ADAPT_H
00010 #define __CHARM_FEM_ADAPT_H
00011
00012 #include "charm-api.h"
00013 #include "ckvector3d.h"
00014 #include "fem.h"
00015 #include "fem_mesh.h"
00016
00017 class femMeshModify;
00018
00019 class FEM_Adapt {
00020 protected:
00021 FEM_Mesh *theMesh;
00022 femMeshModify *theMod;
00023
00025
00027 int check_orientation(int e1, int e3, int n, int n1, int n2);
00028 public:
00031
00034 int get_edge_index(int local_node1, int local_node2);
00036
00038 int find_local_node_index(int e, int n);
00040
00042 int findAdjData(int n1, int n2, int *e1, int *e2, int *e1n1, int *e1n2,
00043 int *e1n3, int *e2n1, int *e2n2, int *e2n3, int *n3,
00044 int *n4);
00045 int e2n_getNot(int e, int n1, int n2) {
00046 int eConn[3];
00047 theMesh->e2n_getAll(e, eConn);
00048 for (int i=0; i<3; i++)
00049 if ((eConn[i] != n2) && (eConn[i] != n1)) return eConn[i];
00050 return -1;
00051 }
00052 int n2e_exists(int n, int e) {
00053 int *nConn, nSz;
00054 theMesh->n2e_getAll(n, &nConn, &nSz);
00055 for (int i=0; i<nSz; i++) {
00056 if (nConn[i] == e) {
00057 if(nSz!=0) free(nConn);
00058 return 1;
00059 }
00060 }
00061 if(nSz!=0) free(nConn);
00062 return 0;
00063 }
00064 int findElementWithNodes(int n1, int n2, int n3) {
00065 int *nConn, nSz;
00066 int ret = -1;
00067 theMesh->n2e_getAll(n1, &nConn, &nSz);
00068 for (int i=0; i<nSz; i++) {
00069 if ((n2e_exists(n2, nConn[i])) && (n2e_exists(n3, nConn[i]))) {
00070 ret = nConn[i];
00071 break;
00072 }
00073 }
00074 if(nSz!=0) free(nConn);
00075 return ret;
00076 }
00077 int getSharedNodeIdxl(int n, int chk);
00078 int getGhostNodeIdxl(int n, int chk);
00079 int getGhostElementIdxl(int e, int chk);
00080
00081 FEM_Adapt() {
00082 theMesh = NULL; theMod = NULL;
00083 }
00084
00086 FEM_Adapt(FEM_Mesh *m, femMeshModify *fm) { theMesh = m; theMod = fm; }
00088
00093
00094 int edge_flip_help(int e1, int e2, int n1, int n2, int e1_n1,
00095 int e1_n2, int e1_n3, int n3, int n4,int *locknodes);
00096
00098
00101
00102 int edge_bisect_help(int e1, int e2, int n1, int n2, int e1_n1,
00103 int e1_n2, int e1_n3, int e2_n1, int e2_n2,
00104 int e2_n3, int n3, int n4);
00105
00107
00111
00112 int vertex_remove_help(int e1, int e2, int n1, int n2, int e1_n1,
00113 int e1_n2, int e1_n3, int e2_n1, int e2_n2,
00114 int e2_n3, int n3, int n4, int n5);
00115
00117
00122
00123
00124
00126
00130 virtual int vertex_split(int n, int n1, int n2);
00131 int vertex_split_help(int n, int n1, int n2, int e1, int e3);
00132
00133 virtual void printAdjacencies(int *nodes, int numNodes, int *elems, int numElems);
00134
00135 virtual bool isFixedNode(int n1);
00136 virtual bool isCorner(int n1);
00137 virtual bool isEdgeBoundary(int n1, int n2);
00138 };
00139
00140
00141 #endif