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