Branch data Line data Source code
1 : : /**
2 : : * MOAB, a Mesh-Oriented datABase, is a software component for creating,
3 : : * storing and accessing finite element mesh data.
4 : : *
5 : : * Copyright 2004 Sandia Corporation. Under the terms of Contract
6 : : * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
7 : : * retains certain rights in this software.
8 : : *
9 : : * This library is free software; you can redistribute it and/or
10 : : * modify it under the terms of the GNU Lesser General Public
11 : : * License as published by the Free Software Foundation; either
12 : : * version 2.1 of the License, or (at your option) any later version.
13 : : *
14 : : */
15 : :
16 : : #include "SweptElementData.hpp"
17 : : #include "SweptVertexData.hpp"
18 : : #include "moab/Interface.hpp"
19 : : #include "moab/ReadUtilIface.hpp"
20 : : #include "moab/CN.hpp"
21 : : #include "Internals.hpp"
22 : : #include <assert.h>
23 : :
24 : : namespace moab
25 : : {
26 : :
27 : 0 : EntityID SweptElementData::calc_num_entities( EntityHandle start_handle, int irange, int jrange, int krange )
28 : : {
29 : 0 : size_t result = 1;
30 [ # # # # ]: 0 : switch( CN::Dimension( TYPE_FROM_HANDLE( start_handle ) ) )
31 : : {
32 : : default:
33 : 0 : result = 0;
34 : 0 : assert( false );
35 : : break;
36 : : case 3:
37 : 0 : result *= krange;
38 : : case 2:
39 : 0 : result *= jrange;
40 : : case 1:
41 : 0 : result *= irange;
42 : : }
43 : 0 : return result;
44 : : }
45 : :
46 : 0 : SweptElementData::SweptElementData( EntityHandle shandle, const int imin, const int jmin, const int kmin,
47 : : const int imax, const int jmax, const int kmax, const int* /*Cq*/ )
48 [ # # ][ # # ]: 0 : : SequenceData( 0, shandle, shandle + calc_num_entities( shandle, imax - imin, jmax - jmin, kmax - kmin ) - 1 )
[ # # ]
49 : : {
50 : : // need to have meaningful parameters
51 [ # # ][ # # ]: 0 : assert( imax >= imin && jmax >= jmin && kmax >= kmin );
[ # # ]
52 : :
53 [ # # ][ # # ]: 0 : elementParams[0] = HomCoord( imin, jmin, kmin );
54 [ # # ][ # # ]: 0 : elementParams[1] = HomCoord( imax, jmax, kmax );
55 [ # # ][ # # ]: 0 : elementParams[2] = HomCoord( 1, 1, 1 );
56 : :
57 : : // assign and compute parameter stuff
58 [ # # ][ # # ]: 0 : dIJK[0] = elementParams[1][0] - elementParams[0][0] + 1;
59 [ # # ][ # # ]: 0 : dIJK[1] = elementParams[1][1] - elementParams[0][1] + 1;
60 [ # # ][ # # ]: 0 : dIJK[2] = elementParams[1][2] - elementParams[0][2] + 1;
61 : 0 : dIJKm1[0] = dIJK[0] - 1;
62 : 0 : dIJKm1[1] = dIJK[1] - 1;
63 : 0 : dIJKm1[2] = dIJK[2] - 1;
64 : 0 : }
65 : :
66 [ # # ]: 0 : SweptElementData::~SweptElementData() {}
67 : :
68 : 0 : bool SweptElementData::boundary_complete() const
69 : : {
70 : : // test the bounding vertex sequences to see if they fully define the
71 : : // vertex parameter space for this rectangular block of elements
72 : :
73 : : int p;
74 [ # # ][ # # ]: 0 : std::vector< VertexDataRef > minlist, maxlist;
75 : :
76 : : // pseudo code:
77 : : // for each vertex sequence v:
78 [ # # ][ # # ]: 0 : for( std::vector< VertexDataRef >::const_iterator vseq = vertexSeqRefs.begin(); vseq != vertexSeqRefs.end();
[ # # ]
79 : : ++vseq )
80 : : {
81 : : // test min corner mincorner:
82 : 0 : bool mincorner = true;
83 : : // for each p = (i-1,j,k), (i,j-1,k), (i,j,k-1):
84 [ # # ]: 0 : for( p = 0; p < 3; p++ )
85 : : {
86 : :
87 : : // for each vsequence v' != v:
88 [ # # # # ]: 0 : for( std::vector< VertexDataRef >::const_iterator othervseq = vertexSeqRefs.begin();
[ # # ]
89 : 0 : othervseq != vertexSeqRefs.end(); ++othervseq )
90 : : {
91 [ # # ][ # # ]: 0 : if( othervseq == vseq ) continue;
92 : : // if v.min-p contained in v'
93 [ # # ][ # # ]: 0 : if( ( *othervseq ).contains( ( *vseq ).minmax[0] - HomCoord::unitv[p] ) )
[ # # ][ # # ]
[ # # ]
94 : : {
95 : : // mincorner = false
96 : 0 : mincorner = false;
97 : 0 : break;
98 : : }
99 : : }
100 [ # # ]: 0 : if( !mincorner ) break;
101 : : }
102 : :
103 : 0 : bool maxcorner = true;
104 : : // for each p = (i-1,j,k), (i,j-1,k), (i,j,k-1):
105 [ # # ]: 0 : for( p = 0; p < 3; p++ )
106 : : {
107 : :
108 : : // for each vsequence v' != v:
109 [ # # # # ]: 0 : for( std::vector< VertexDataRef >::const_iterator othervseq = vertexSeqRefs.begin();
[ # # ]
110 : 0 : othervseq != vertexSeqRefs.end(); ++othervseq )
111 : : {
112 [ # # ][ # # ]: 0 : if( othervseq == vseq ) continue;
113 : : // if v.max+p contained in v'
114 [ # # ][ # # ]: 0 : if( ( *othervseq ).contains( ( *vseq ).minmax[1] + HomCoord::unitv[p] ) )
[ # # ][ # # ]
[ # # ]
115 : : {
116 : : // maxcorner = false
117 : 0 : maxcorner = false;
118 : 0 : break;
119 : : }
120 : : }
121 [ # # ]: 0 : if( !maxcorner ) break;
122 : : }
123 : :
124 : : // if mincorner add to min corner list minlist
125 [ # # ][ # # ]: 0 : if( mincorner ) minlist.push_back( *vseq );
[ # # ]
126 : : // if maxcorner add to max corner list maxlist
127 [ # # ][ # # ]: 0 : if( maxcorner ) maxlist.push_back( *vseq );
[ # # ]
128 : : }
129 : :
130 : : //
131 : : // if minlist.size = 1 & maxlist.size = 1 & minlist[0] = esequence.min &
132 : : // maxlist[0] = esequence.max+(1,1,1)
133 [ # # ][ # # ]: 0 : if( minlist.size() == 1 && maxlist.size() == 1 && minlist[0].minmax[0] == elementParams[0] &&
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ]
134 [ # # ][ # # ]: 0 : maxlist[0].minmax[1] == elementParams[1] )
135 : : // complete
136 : 0 : return true;
137 : : // else
138 : :
139 : 0 : return false;
140 : : }
141 : :
142 : 0 : SequenceData* SweptElementData::subset( EntityHandle /*start*/, EntityHandle /*end*/,
143 : : const int* /*sequence_data_sizes*/, const int* /*tag_data_sizes*/ ) const
144 : : {
145 : 0 : return 0;
146 : : }
147 : :
148 : 0 : unsigned long SweptElementData::get_memory_use() const
149 : : {
150 : 0 : return sizeof( *this ) + vertexSeqRefs.capacity() * sizeof( VertexDataRef );
151 : : }
152 : :
153 [ + - ][ + - ]: 228 : } // namespace moab
|