![]() |
Mesh Oriented datABase
(version 5.4.1)
Array-based unstructured mesh datastructure
|
00001 /**
00002 * MOAB, a Mesh-Oriented datABase, is a software component for creating,
00003 * storing and accessing finite element mesh data.
00004 *
00005 * Copyright 2004 Sandia Corporation. Under the terms of Contract
00006 * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
00007 * retains certain rights in this software.
00008 *
00009 * This library is free software; you can redistribute it and/or
00010 * modify it under the terms of the GNU Lesser General Public
00011 * License as published by the Free Software Foundation; either
00012 * version 2.1 of the License, or (at your option) any later version.
00013 *
00014 */
00015
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
00023
00024 namespace moab
00025 {
00026
00027 EntityID ScdElementData::calc_num_entities( EntityHandle start_handle,
00028 int irange,
00029 int jrange,
00030 int krange,
00031 int* is_periodic )
00032 {
00033 size_t result = 1;
00034 auto dim = CN::Dimension( TYPE_FROM_HANDLE( start_handle ) );
00035 switch( dim )
00036 {
00037 case 3:
00038 result *= krange;
00039 // fall through
00040 case 2:
00041 result *= ( is_periodic && is_periodic[1] ? ( jrange + 1 ) : jrange );
00042 // fall through
00043 case 1:
00044 result *= ( is_periodic && is_periodic[0] ? ( irange + 1 ) : irange );
00045 break;
00046 default:
00047 result = 0;
00048 assert( false );
00049 break;
00050 }
00051 return result;
00052 }
00053
00054 ScdElementData::ScdElementData( EntityHandle shandle,
00055 const int imin,
00056 const int jmin,
00057 const int kmin,
00058 const int imax,
00059 const int jmax,
00060 const int kmax,
00061 int* is_p )
00062 : SequenceData( 0,
00063 shandle,
00064 shandle + calc_num_entities( shandle, imax - imin, jmax - jmin, kmax - kmin, is_p ) - 1 )
00065 {
00066 // need to have meaningful parameters
00067 assert( imax >= imin && jmax >= jmin && kmax >= kmin );
00068
00069 isPeriodic[0] = ( is_p ? is_p[0] : 0 );
00070 isPeriodic[1] = ( is_p ? is_p[1] : 0 );
00071
00072 boxParams[0] = HomCoord( imin, jmin, kmin );
00073 boxParams[1] = HomCoord( imax, jmax, kmax );
00074 boxParams[2] = HomCoord( 1, 1, 1 );
00075
00076 // assign and compute parameter stuff
00077 dIJK[0] = boxParams[1][0] - boxParams[0][0] + 1;
00078 dIJK[1] = boxParams[1][1] - boxParams[0][1] + 1;
00079 dIJK[2] = boxParams[1][2] - boxParams[0][2] + 1;
00080 dIJKm1[0] = dIJK[0] - ( isPeriodic[0] ? 0 : 1 );
00081 dIJKm1[1] = dIJK[1] - ( isPeriodic[1] ? 0 : 1 );
00082 dIJKm1[2] = dIJK[2] - 1;
00083 }
00084
00085 ScdElementData::~ScdElementData() {}
00086
00087 bool ScdElementData::boundary_complete() const
00088 {
00089 // test the bounding vertex sequences to see if they fully define the
00090 // vertex parameter space for this rectangular block of elements
00091
00092 int p;
00093 std::vector< VertexDataRef > minlist, maxlist;
00094
00095 // pseudo code:
00096 // for each vertex sequence v:
00097 for( std::vector< VertexDataRef >::const_iterator vseq = vertexSeqRefs.begin(); vseq != vertexSeqRefs.end();
00098 ++vseq )
00099 {
00100 // test min corner mincorner:
00101 bool mincorner = true;
00102 // for each p = (i-1,j,k), (i,j-1,k), (i,j,k-1):
00103 for( p = 0; p < 3; p++ )
00104 {
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.min-p contained in v'
00112 if( ( *othervseq ).contains( ( *vseq ).minmax[0] - HomCoord::unitv[p] ) )
00113 {
00114 // mincorner = false
00115 mincorner = false;
00116 break;
00117 }
00118 }
00119 if( !mincorner ) break;
00120 }
00121
00122 bool maxcorner = true;
00123 // for each p = (i-1,j,k), (i,j-1,k), (i,j,k-1):
00124 for( p = 0; p < 3; p++ )
00125 {
00126
00127 // for each vsequence v' != v:
00128 for( std::vector< VertexDataRef >::const_iterator othervseq = vertexSeqRefs.begin();
00129 othervseq != vertexSeqRefs.end(); ++othervseq )
00130 {
00131 if( othervseq == vseq ) continue;
00132 // if v.max+p contained in v'
00133 if( ( *othervseq ).contains( ( *vseq ).minmax[1] + HomCoord::unitv[p] ) )
00134 {
00135 // maxcorner = false
00136 maxcorner = false;
00137 break;
00138 }
00139 }
00140 if( !maxcorner ) break;
00141 }
00142
00143 // if mincorner add to min corner list minlist
00144 if( mincorner ) minlist.push_back( *vseq );
00145 // if maxcorner add to max corner list maxlist
00146 if( maxcorner ) maxlist.push_back( *vseq );
00147 }
00148
00149 //
00150 // if minlist.size = 1 & maxlist.size = 1 & minlist[0] = esequence.min &
00151 // maxlist[0] = esequence.max+(1,1,1)
00152 if( minlist.size() == 1 && maxlist.size() == 1 && minlist[0].minmax[0] == boxParams[0] &&
00153 maxlist[0].minmax[1] == boxParams[1] )
00154 // complete
00155 return true;
00156 // else
00157
00158 return false;
00159 }
00160
00161 SequenceData* ScdElementData::subset( EntityHandle /*start*/,
00162 EntityHandle /*end*/,
00163 const int* /*sequence_data_sizes*/,
00164 const int* /*tag_data_sizes*/ ) const
00165 {
00166 return 0;
00167 }
00168
00169 unsigned long ScdElementData::get_memory_use() const
00170 {
00171 return sizeof( *this ) + vertexSeqRefs.capacity() * sizeof( VertexDataRef );
00172 }
00173
00174 } // namespace moab