moab
SweptElementData.cpp
Go to the documentation of this file.
00001 
00016 #include "SweptElementData.hpp"
00017 #include "SweptVertexData.hpp"
00018 #include "moab/Interface.hpp"
00019 #include "moab/ReadUtilIface.hpp"
00020 #include "moab/CN.hpp"
00021 #include "Internals.hpp"
00022 #include <assert.h>
00023 
00024 namespace moab {
00025 
00026 EntityID SweptElementData::calc_num_entities(EntityHandle start_handle,
00027                                 int irange, int jrange, int krange)
00028 {
00029   size_t result = 1;
00030   switch (CN::Dimension(TYPE_FROM_HANDLE(start_handle))) {
00031     default: result = 0; assert( false ); 
00032     case 3: result *= krange;
00033     case 2: result *= jrange;
00034     case 1: result *= irange;
00035   }
00036   return result;
00037 }
00038 
00039 SweptElementData::SweptElementData(
00040                              EntityHandle shandle,
00041                              const int imin, const int jmin, const int kmin,
00042                              const int imax, const int jmax, const int kmax,
00043                  const int* /*Cq*/ ) 
00044     : SequenceData(0, shandle,
00045                    shandle + 
00046                    calc_num_entities( shandle, imax-imin, jmax-jmin, kmax-kmin )
00047                    - 1)
00048 {
00049     // need to have meaningful parameters
00050   assert(imax >= imin && jmax >= jmin && kmax >= kmin);
00051     
00052   elementParams[0] = HomCoord(imin, jmin, kmin);
00053   elementParams[1] = HomCoord(imax, jmax, kmax);
00054   elementParams[2] = HomCoord(1, 1, 1);
00055   
00056     // assign and compute parameter stuff
00057   dIJK[0] = elementParams[1][0] - elementParams[0][0] + 1;
00058   dIJK[1] = elementParams[1][1] - elementParams[0][1] + 1;
00059   dIJK[2] = elementParams[1][2] - elementParams[0][2] + 1;
00060   dIJKm1[0] = dIJK[0] - 1;
00061   dIJKm1[1] = dIJK[1] - 1;
00062   dIJKm1[2] = dIJK[2] - 1;
00063 }
00064 
00065 SweptElementData::~SweptElementData() 
00066 {
00067 }
00068 
00069 bool SweptElementData::boundary_complete() const
00070 {
00071     // test the bounding vertex sequences to see if they fully define the
00072     // vertex parameter space for this rectangular block of elements
00073 
00074   int p;
00075   std::vector<VertexDataRef> minlist, maxlist;
00076 
00077     // pseudo code:
00078     // for each vertex sequence v:
00079   for (std::vector<VertexDataRef>::const_iterator vseq = vertexSeqRefs.begin();
00080        vseq != vertexSeqRefs.end(); vseq++)
00081   {
00082     //   test min corner mincorner:
00083     bool mincorner = true;
00084     //   for each p = (i-1,j,k), (i,j-1,k), (i,j,k-1):
00085     for (p = 0; p < 3; p++) {
00086 
00087     //     for each vsequence v' != v:
00088       for (std::vector<VertexDataRef>::const_iterator othervseq = vertexSeqRefs.begin();
00089            othervseq != vertexSeqRefs.end(); othervseq++) 
00090       {
00091         if (othervseq == vseq) continue;        
00092     //       if v.min-p contained in v'
00093         if ((*othervseq).contains((*vseq).minmax[0]-HomCoord::unitv[p])) {
00094     //         mincorner = false
00095           mincorner = false;
00096           break;
00097         }
00098       }
00099       if (!mincorner) break;
00100     }
00101   
00102     bool maxcorner = true;
00103     //   for each p = (i-1,j,k), (i,j-1,k), (i,j,k-1):
00104     for (p = 0; p < 3; p++) {
00105 
00106     //     for each vsequence v' != v:
00107       for (std::vector<VertexDataRef>::const_iterator othervseq = vertexSeqRefs.begin();
00108            othervseq != vertexSeqRefs.end(); othervseq++) 
00109       {
00110         if (othervseq == vseq) continue;        
00111     //       if v.max+p contained in v'
00112         if ((*othervseq).contains((*vseq).minmax[1]+HomCoord::unitv[p])) {
00113     //         maxcorner = false
00114           maxcorner = false;
00115           break;
00116         }
00117       }
00118       if (!maxcorner) break;
00119     }
00120 
00121     //   if mincorner add to min corner list minlist
00122     if (mincorner) minlist.push_back(*vseq);
00123     //   if maxcorner add to max corner list maxlist
00124     if (maxcorner) maxlist.push_back(*vseq);
00125   }
00126   
00127     // 
00128     // if minlist.size = 1 & maxlist.size = 1 & minlist[0] = esequence.min &
00129     //         maxlist[0] = esequence.max+(1,1,1)
00130   if (minlist.size() == 1 && maxlist.size() == 1 &&
00131       minlist[0].minmax[0] == elementParams[0] && 
00132       maxlist[0].minmax[1] == elementParams[1])
00133       //   complete
00134     return true;
00135     // else
00136 
00137   return false;
00138 }
00139 
00140 
00141 SequenceData* SweptElementData::subset( EntityHandle /*start*/, 
00142                                       EntityHandle /*end*/,
00143                                       const int* /*sequence_data_sizes*/,
00144                                       const int* /*tag_data_sizes*/ ) const
00145 {
00146   return 0;
00147 }
00148 
00149 unsigned long SweptElementData::get_memory_use() const
00150 {
00151   return sizeof(*this) + vertexSeqRefs.capacity() * sizeof(VertexDataRef);
00152 }
00153 
00154 } // namespace moab
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines