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