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 "ScdElementData.hpp"
17 : : #include "ScdVertexData.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 : 56 : EntityID ScdElementData::calc_num_entities( EntityHandle start_handle, int irange, int jrange, int krange,
28 : : int* is_periodic )
29 : : {
30 : 56 : size_t result = 1;
31 [ - + + + ]: 56 : switch( CN::Dimension( TYPE_FROM_HANDLE( start_handle ) ) )
32 : : {
33 : : default:
34 : 0 : result = 0;
35 : 0 : assert( false );
36 : : break;
37 : : case 3:
38 : 24 : result *= krange;
39 : : case 2:
40 [ + + ][ + + ]: 46 : result *= ( is_periodic && is_periodic[1] ? ( jrange + 1 ) : jrange );
41 : : case 1:
42 [ + + ][ + + ]: 56 : result *= ( is_periodic && is_periodic[0] ? ( irange + 1 ) : irange );
43 : : }
44 : 56 : return result;
45 : : }
46 : :
47 : 28 : ScdElementData::ScdElementData( EntityHandle shandle, const int imin, const int jmin, const int kmin, const int imax,
48 : : const int jmax, const int kmax, int* is_p )
49 : : : SequenceData( 0, shandle,
50 [ + - ][ + + ]: 112 : shandle + calc_num_entities( shandle, imax - imin, jmax - jmin, kmax - kmin, is_p ) - 1 )
[ + - ]
51 : : {
52 : : // need to have meaningful parameters
53 [ + - ][ + - ]: 28 : assert( imax >= imin && jmax >= jmin && kmax >= kmin );
[ - + ]
54 : :
55 [ + + ]: 28 : isPeriodic[0] = ( is_p ? is_p[0] : 0 );
56 [ + + ]: 28 : isPeriodic[1] = ( is_p ? is_p[1] : 0 );
57 : :
58 [ + - ][ + - ]: 28 : boxParams[0] = HomCoord( imin, jmin, kmin );
59 [ + - ][ + - ]: 28 : boxParams[1] = HomCoord( imax, jmax, kmax );
60 [ + - ][ + - ]: 28 : boxParams[2] = HomCoord( 1, 1, 1 );
61 : :
62 : : // assign and compute parameter stuff
63 [ + - ][ + - ]: 28 : dIJK[0] = boxParams[1][0] - boxParams[0][0] + 1;
64 [ + - ][ + - ]: 28 : dIJK[1] = boxParams[1][1] - boxParams[0][1] + 1;
65 [ + - ][ + - ]: 28 : dIJK[2] = boxParams[1][2] - boxParams[0][2] + 1;
66 : 28 : dIJKm1[0] = dIJK[0] - ( isPeriodic[0] ? 0 : 1 );
67 : 28 : dIJKm1[1] = dIJK[1] - ( isPeriodic[1] ? 0 : 1 );
68 : 28 : dIJKm1[2] = dIJK[2] - 1;
69 : 28 : }
70 : :
71 [ - + ]: 112 : ScdElementData::~ScdElementData() {}
72 : :
73 : 1415717 : bool ScdElementData::boundary_complete() const
74 : : {
75 : : // test the bounding vertex sequences to see if they fully define the
76 : : // vertex parameter space for this rectangular block of elements
77 : :
78 : : int p;
79 [ + - ][ + - ]: 2831434 : std::vector< VertexDataRef > minlist, maxlist;
80 : :
81 : : // pseudo code:
82 : : // for each vertex sequence v:
83 [ + - ][ + - ]: 2837679 : for( std::vector< VertexDataRef >::const_iterator vseq = vertexSeqRefs.begin(); vseq != vertexSeqRefs.end();
[ + + ]
84 : : ++vseq )
85 : : {
86 : : // test min corner mincorner:
87 : 1421962 : bool mincorner = true;
88 : : // for each p = (i-1,j,k), (i,j-1,k), (i,j,k-1):
89 [ + + ]: 5671181 : for( p = 0; p < 3; p++ )
90 : : {
91 : :
92 : : // for each vsequence v' != v:
93 [ + - + - ]: 17059296 : for( std::vector< VertexDataRef >::const_iterator othervseq = vertexSeqRefs.begin();
[ + + ]
94 : 8529648 : othervseq != vertexSeqRefs.end(); ++othervseq )
95 : : {
96 [ + - ][ + + ]: 4280429 : if( othervseq == vseq ) continue;
97 : : // if v.min-p contained in v'
98 [ + - ][ + - ]: 29129 : if( ( *othervseq ).contains( ( *vseq ).minmax[0] - HomCoord::unitv[p] ) )
[ + - ][ + - ]
[ + + ]
99 : : {
100 : : // mincorner = false
101 : 6245 : mincorner = false;
102 : 6245 : break;
103 : : }
104 : : }
105 [ + + ]: 4255464 : if( !mincorner ) break;
106 : : }
107 : :
108 : 1421962 : bool maxcorner = true;
109 : : // for each p = (i-1,j,k), (i,j-1,k), (i,j,k-1):
110 [ + + ]: 5671181 : for( p = 0; p < 3; p++ )
111 : : {
112 : :
113 : : // for each vsequence v' != v:
114 [ + - + - ]: 17075896 : for( std::vector< VertexDataRef >::const_iterator othervseq = vertexSeqRefs.begin();
[ + + ]
115 : 8537948 : othervseq != vertexSeqRefs.end(); ++othervseq )
116 : : {
117 [ + - ][ + + ]: 4288729 : if( othervseq == vseq ) continue;
118 : : // if v.max+p contained in v'
119 [ + - ][ + - ]: 33278 : if( ( *othervseq ).contains( ( *vseq ).minmax[1] + HomCoord::unitv[p] ) )
[ + - ][ + - ]
[ + + ]
120 : : {
121 : : // maxcorner = false
122 : 6245 : maxcorner = false;
123 : 6245 : break;
124 : : }
125 : : }
126 [ + + ]: 4255464 : if( !maxcorner ) break;
127 : : }
128 : :
129 : : // if mincorner add to min corner list minlist
130 [ + + ][ + - ]: 1421962 : if( mincorner ) minlist.push_back( *vseq );
[ + - ]
131 : : // if maxcorner add to max corner list maxlist
132 [ + + ][ + - ]: 1421962 : if( maxcorner ) maxlist.push_back( *vseq );
[ + - ]
133 : : }
134 : :
135 : : //
136 : : // if minlist.size = 1 & maxlist.size = 1 & minlist[0] = esequence.min &
137 : : // maxlist[0] = esequence.max+(1,1,1)
138 [ + - ][ + - ]: 2831434 : if( minlist.size() == 1 && maxlist.size() == 1 && minlist[0].minmax[0] == boxParams[0] &&
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ]
139 [ + - ][ + - ]: 1415717 : maxlist[0].minmax[1] == boxParams[1] )
140 : : // complete
141 : 1415717 : return true;
142 : : // else
143 : :
144 : 1415717 : return false;
145 : : }
146 : :
147 : 0 : SequenceData* ScdElementData::subset( EntityHandle /*start*/, EntityHandle /*end*/, const int* /*sequence_data_sizes*/,
148 : : const int* /*tag_data_sizes*/ ) const
149 : : {
150 : 0 : return 0;
151 : : }
152 : :
153 : 0 : unsigned long ScdElementData::get_memory_use() const
154 : : {
155 : 0 : return sizeof( *this ) + vertexSeqRefs.capacity() * sizeof( VertexDataRef );
156 : : }
157 : :
158 [ + - ][ + - ]: 228 : } // namespace moab
|