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