Home | Doxygen Documentation | Tutorials | Developer Tools (restricted)

app-bholger/gfem/gfemOverlapCondition.h
Go to the documentation of this file.
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

Home | Doxygen Documentation | Tutorials | Developer Tools (restricted)