00001 #pragma once 00002 #include <algorithm> 00003 #include <assert.h> 00004 00005 namespace concepts { 00006 namespace gfem { 00007 00008 struct GfemOverlapCondition { 00009 GfemOverlapCondition() 00010 { 00011 for(int i=0; i < 4; ++i) { 00012 stateVert[i] = 0; 00013 stateEdge[i] = 0; 00014 } 00015 optimize(); 00016 } 00017 00018 void disableVertex(int i) { 00019 stateVert[i] = 1; 00020 optimize(); 00021 } 00022 00023 void disableEdge(int i, int pEdge) { 00024 assert(pEdge > 0); 00025 stateEdge[i] = pEdge; 00026 optimize(); 00027 } 00028 00029 bool vertDisabled(int i) const { 00030 return stateVert[i] > 0; 00031 } 00032 00033 int vertP(int i) const { 00034 return (stateVert[i] != 0 ? 1:0); 00035 } 00036 00037 bool edgeDisabled(int i) const { 00038 return stateEdge[i] != 0; 00039 } 00040 00041 int edgeP(int i) const { 00042 return stateEdge[i]; 00043 } 00044 00048 int edgeDofs(int i) const { 00049 return edgeP(i) - 1; 00050 } 00051 00055 void optimize() { 00056 for(int i=0; i < 4; ++i) { 00057 if(edgeDisabled(i)) { 00058 #if 0 00059 stateVert[ i ] = -1; 00060 stateVert[(i+1)%4] = -1; 00061 #endif 00062 } 00063 } 00064 n_disabledVert = 0; 00065 n_disabledEdges = 0; 00066 n_vertPs = 0; 00067 maxP = 1; 00068 for(int i=0; i < 4; ++i) { 00069 if(vertDisabled(i)) 00070 ++n_disabledVert; 00071 if(edgeDisabled(i)) 00072 ++n_disabledEdges; 00073 00074 n_vertPs += vertP(i); 00075 00076 cum_disabledEdge[i] = (i > 0 ? cum_disabledEdge[i-1] : 0); 00077 if(edgeDisabled(i)) 00078 cum_disabledEdge[i] += edgeP(i)-1; 00079 maxP = std::max(edgeP(i), maxP); 00080 } 00081 } 00082 00084 int nMicro() const { 00085 //return n_disabledVert + n_disabledEdges; 00086 return nDofs(); 00087 } 00088 00089 int nDofs() const { 00090 return n_disabledVert + cum_disabledEdge[3]; 00091 } 00092 00093 void print() const; 00094 00095 int nVertDofs() const { 00096 return n_disabledVert; 00097 } 00098 00099 int nEdgeDofs() const { 00100 return cum_disabledEdge[3]; 00101 } 00102 00103 int disabledVertDof(int i_vert) const { 00104 int i_t = 0; 00105 for(int i=0; i < i_vert; ++i) { 00106 if(stateVert[i] != 0) { 00107 ++i_t; 00108 } 00109 } 00110 return i_t; 00111 } 00112 00113 int disabledVertIdx(int i_t) const { 00114 for(int i=0; i < 4; ++i) { 00115 if(stateVert[i] != 0) { 00116 if(i_t == 0) 00117 return i; 00118 --i_t; 00119 } 00120 } 00121 assert(false); 00122 return -1; 00123 } 00124 00125 #if 0 00126 int cumEdgeDisabled(int i) const { 00127 return cum_disabledEdge[i]; 00128 } 00129 #endif 00130 00131 private: 00132 int n_disabledVert; 00133 int n_vertPs; 00134 int n_disabledEdges; 00135 int maxP; 00136 int cum_disabledEdge[4]; 00137 int stateVert[4]; 00138 int stateEdge[4]; 00139 }; 00140 00141 } // namespace 00142 } // namespace