moab
|
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