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