FEI
Version of the Day
Toggle main menu visibility
Loading...
Searching...
No Matches
base
fei_Pattern.cpp
1
/*--------------------------------------------------------------------*/
2
/* Copyright 2005 Sandia Corporation. */
3
/* Under the terms of Contract DE-AC04-94AL85000, there is a */
4
/* non-exclusive license for use of this work by or on behalf */
5
/* of the U.S. Government. Export of this program may require */
6
/* a license from the United States Government. */
7
/*--------------------------------------------------------------------*/
8
9
#include "fei_Pattern.hpp"
10
11
//-----------------------------------------------------------------------------
12
fei::Pattern::Pattern
(
int
numIDs,
int
idType,
snl_fei::RecordCollection
* recordCollection)
13
: type_(
Pattern
::NO_FIELD),
14
numIDs_(numIDs),
15
totalNumFields_(0),
16
numIndices_(numIDs),
17
data_(),
18
recordCollections_(numIDs, recordCollection)
19
{
20
int
i, len = numIDs_*4;
21
data_.resize(len);
22
int
offset = 0;
23
24
//set idTypes
25
for
(i=0; i<numIDs_; ++i) {
26
data_[offset++] = idType;
27
}
28
29
//set numFieldsPerID
30
for
(i=0; i<numIDs_; ++i) {
31
data_[offset++] = 0;
32
}
33
34
//set numIndicesPerID
35
for
(i=0; i<numIDs_; ++i) {
36
data_[offset++] = 1;
37
}
38
39
//set fieldIDs
40
for
(i=0; i<numIDs_; ++i) {
41
data_[offset++] = -1;
42
}
43
44
idTypes_ = &(data_[0]);
45
numFieldsPerID_ = idTypes_+numIDs_;
46
numIndicesPerID_= idTypes_+2*numIDs_;
47
fieldIDs_ = idTypes_+3*numIDs_;
48
}
49
50
//-----------------------------------------------------------------------------
51
fei::Pattern::Pattern
(
int
numIDs,
int
idType,
snl_fei::RecordCollection
* recordCollection,
52
int
fieldID,
int
fieldSize)
53
: type_(
Pattern
::SIMPLE),
54
numIDs_(numIDs),
55
totalNumFields_(numIDs),
56
numIndices_(0),
//numIndices_ to be calculated
57
data_(),
58
recordCollections_(numIDs, recordCollection)
59
{
60
int
i, len = numIDs_*4;
61
data_.resize(len);
62
int
offset = 0;
63
64
//set idTypes
65
for
(i=0; i<numIDs_; ++i) {
66
data_[offset++] = idType;
67
}
68
69
//set numFieldsPerID
70
for
(i=0; i<numIDs_; ++i) {
71
data_[offset++] = 1;
72
}
73
74
//set numIndicesPerID
75
for
(i=0; i<numIDs_; ++i) {
76
data_[offset++] = fieldSize;
77
}
78
79
//set fieldIDs
80
for
(i=0; i<numIDs_; ++i) {
81
data_[offset++] = fieldID;
82
}
83
84
numIndices_ = numIDs_*fieldSize;
85
86
idTypes_ = &(data_[0]);
87
numFieldsPerID_ = idTypes_+numIDs_;
88
numIndicesPerID_= idTypes_+2*numIDs_;
89
fieldIDs_ = idTypes_+3*numIDs_;
90
}
91
92
//-----------------------------------------------------------------------------
93
fei::Pattern::Pattern
(
int
numIDs,
int
idType,
snl_fei::RecordCollection
* recordCollection,
94
const
int
* numFieldsPerID,
95
const
int
* fieldIDs,
96
const
int
* fieldSizes)
97
: type_(
Pattern
::SINGLE_IDTYPE),
98
numIDs_(numIDs),
99
totalNumFields_(0),
//totalNumFields_ to be calculated
100
numIndices_(0),
//numIndices_ to be calculated
101
data_(),
102
recordCollections_(numIDs, recordCollection)
103
{
104
int
i, len = numIDs_*3;
105
int
maxNumFieldsPerID = 0;
106
bool
oneDistinctFieldID =
true
;
107
108
for
(i=0; i<numIDs; ++i) len += numFieldsPerID[i];
109
data_.resize(len);
110
111
int
offset = 0;
112
//set idTypes
113
for
(i=0; i<numIDs_; ++i) {
114
data_[offset++] = idType;
115
}
116
117
//set numFieldsPerID
118
for
(i=0; i<numIDs; ++i) {
119
data_[offset++] = numFieldsPerID[i];
120
if
(numFieldsPerID[i] > maxNumFieldsPerID) {
121
maxNumFieldsPerID = numFieldsPerID[i];
122
}
123
}
124
125
//next set numIndicesPerID and fieldIDs
126
int
firstFieldID = 0;
127
if
(numIDs > 0) firstFieldID = fieldIDs[0];
128
129
int
fieldIDOffset = offset + numIDs;
130
for
(i=0; i<numIDs; ++i) {
131
int
thisNumIndices = 0;
132
for
(
int
j=0; j<numFieldsPerID[i]; ++j) {
133
int
fieldSize = fieldSizes[totalNumFields_];
134
int
fieldID = fieldIDs[totalNumFields_++];
135
if
(fieldID != firstFieldID) oneDistinctFieldID =
false
;
136
data_[fieldIDOffset++] = fieldID;
137
numIndices_ += fieldSize;
138
thisNumIndices += fieldSize;
139
}
140
data_[offset+i] = thisNumIndices;
141
}
142
143
if
(oneDistinctFieldID ==
true
&& maxNumFieldsPerID < 2) {
144
type_ = Pattern::SIMPLE;
145
}
146
147
idTypes_ = &(data_[0]);
148
numFieldsPerID_ = idTypes_+numIDs_;
149
numIndicesPerID_= idTypes_+2*numIDs_;
150
fieldIDs_ = idTypes_+3*numIDs_;
151
}
152
153
//-----------------------------------------------------------------------------
154
fei::Pattern::Pattern
(
int
numIDs,
const
int
* idTypes,
snl_fei::RecordCollection
*
const
* recordCollections,
155
const
int
* numFieldsPerID,
156
const
int
* fieldIDs,
157
const
int
* fieldSizes)
158
: type_(
Pattern
::GENERAL),
159
numIDs_(numIDs),
160
totalNumFields_(0),
//totalNumFields_ to be calculated
161
numIndices_(0),
//numIndices_ to be calculated
162
data_(),
163
recordCollections_(recordCollections, recordCollections+numIDs)
164
{
165
int
i, len = numIDs*3;
166
int
maxNumFieldsPerID = 0;
167
bool
oneDistinctFieldID =
true
;
168
bool
oneDistinctIDType =
true
;
169
170
for
(i=0; i<numIDs; ++i) len += numFieldsPerID[i];
171
data_.resize(len);
172
173
int
firstIDType = 0;
174
if
(numIDs > 0) firstIDType = idTypes[0];
175
176
int
offset = 0;
177
//set idTypes
178
for
(i=0; i<numIDs; ++i) {
179
data_[offset++] = idTypes[i];
180
if
(idTypes[i] != firstIDType) oneDistinctIDType =
false
;
181
}
182
183
//set numFieldsPerID
184
for
(i=0; i<numIDs; ++i) {
185
data_[offset++] = numFieldsPerID[i];
186
if
(numFieldsPerID[i] > maxNumFieldsPerID) {
187
maxNumFieldsPerID = numFieldsPerID[i];
188
}
189
}
190
191
//next set numIndicesPerID and fieldIDs
192
int
firstFieldID = 0;
193
if
(numIDs > 0) firstFieldID = fieldIDs[0];
194
195
int
fieldIDOffset = offset + numIDs;
196
for
(i=0; i<numIDs; ++i) {
197
int
thisNumIndices = 0;
198
for
(
int
j=0; j<numFieldsPerID[i]; ++j) {
199
int
fieldSize = fieldSizes[totalNumFields_];
200
int
fieldID = fieldIDs[totalNumFields_++];
201
if
(fieldID != firstFieldID) oneDistinctFieldID =
false
;
202
data_[fieldIDOffset++] = fieldID;
203
numIndices_ += fieldSize;
204
thisNumIndices += fieldSize;
205
}
206
data_[offset+i] = thisNumIndices;
207
}
208
209
if
(oneDistinctFieldID ==
true
&& maxNumFieldsPerID < 2 &&
210
oneDistinctIDType ==
true
) {
211
type_ = Pattern::SIMPLE;
212
}
213
else
if
(oneDistinctIDType ==
true
) {
214
type_ = Pattern::SINGLE_IDTYPE;
215
}
216
217
idTypes_ = &(data_[0]);
218
numFieldsPerID_ = idTypes_+numIDs_;
219
numIndicesPerID_= idTypes_+2*numIDs_;
220
fieldIDs_ = idTypes_+3*numIDs_;
221
}
222
223
//-----------------------------------------------------------------------------
224
fei::Pattern::~Pattern()
225
{
226
}
227
228
//-----------------------------------------------------------------------------
229
bool
fei::Pattern::operator==
(
const
fei::Pattern
& rhs)
const
230
{
231
return
type_ == rhs.type_ &&
232
numIDs_ == rhs.numIDs_ &&
233
totalNumFields_ == rhs.totalNumFields_ &&
234
numIndices_ == rhs.numIndices_ &&
235
data_ == rhs.data_;
236
}
237
238
//-----------------------------------------------------------------------------
239
bool
fei::Pattern::operator!=
(
const
fei::Pattern
& rhs)
const
240
{
241
return
!(*
this
== rhs);
242
}
243
fei::Pattern
Definition
fei_Pattern.hpp:29
fei::Pattern::operator!=
bool operator!=(const Pattern &rhs) const
Definition
fei_Pattern.cpp:239
fei::Pattern::operator==
bool operator==(const Pattern &rhs) const
Definition
fei_Pattern.cpp:229
fei::Pattern::Pattern
Pattern(int numIDs, int idType, snl_fei::RecordCollection *records)
Definition
fei_Pattern.cpp:12
snl_fei::RecordCollection
Definition
snl_fei_RecordCollection.hpp:32
Generated by
1.17.0