FEI Package Browser (Single Doxygen Collection)
Version of the Day
Toggle main menu visibility
Loading...
Searching...
No Matches
base
fei_Pattern.cpp
Go to the documentation of this file.
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::SIMPLE
@ SIMPLE
Definition
fei_Pattern.hpp:32
fei::Pattern::SINGLE_IDTYPE
@ SINGLE_IDTYPE
Definition
fei_Pattern.hpp:32
fei::Pattern::NO_FIELD
@ NO_FIELD
Definition
fei_Pattern.hpp:32
fei::Pattern::GENERAL
@ GENERAL
Definition
fei_Pattern.hpp:32
fei::Pattern::~Pattern
virtual ~Pattern()
Definition
fei_Pattern.cpp:224
fei::Pattern::totalNumFields_
int totalNumFields_
Definition
fei_Pattern.hpp:105
fei::Pattern::numIndices_
int numIndices_
Definition
fei_Pattern.hpp:106
fei::Pattern::numIndicesPerID_
const int * numIndicesPerID_
Definition
fei_Pattern.hpp:113
fei::Pattern::numFieldsPerID_
const int * numFieldsPerID_
Definition
fei_Pattern.hpp:111
fei::Pattern::type_
PatternType type_
Definition
fei_Pattern.hpp:103
fei::Pattern::recordCollections_
std::vector< snl_fei::RecordCollection * > recordCollections_
Definition
fei_Pattern.hpp:108
fei::Pattern::data_
std::vector< int > data_
Definition
fei_Pattern.hpp:107
fei::Pattern::operator!=
bool operator!=(const Pattern &rhs) const
Definition
fei_Pattern.cpp:239
fei::Pattern::numIDs_
int numIDs_
Definition
fei_Pattern.hpp:104
fei::Pattern::operator==
bool operator==(const Pattern &rhs) const
Definition
fei_Pattern.cpp:229
fei::Pattern::idTypes_
const int * idTypes_
Definition
fei_Pattern.hpp:110
fei::Pattern::Pattern
Pattern(int numIDs, int idType, snl_fei::RecordCollection *records)
Definition
fei_Pattern.cpp:12
fei::Pattern::fieldIDs_
const int * fieldIDs_
Definition
fei_Pattern.hpp:112
snl_fei::RecordCollection
Definition
snl_fei_RecordCollection.hpp:32
fei_Pattern.hpp
Generated by
1.17.0