96 {
97
98
99
101
102
103 MeshType
mesh(*TestCommWorld);
104
105
106
107
108
109
110
111
112
113 unsigned int elemset_index =
115 true);
116
117
118
120
122 5, 5,
123 -1., 1.,
124 -1., 1.,
126
127
128 std::set<dof_id_type> set1 = {3, 8, 14, 24};
129 std::set<dof_id_type> set2 = {3, 9, 15, 24};
130
131
132 for (
const auto & elem :
mesh.element_ptr_range())
133 {
134 bool
135 in1 = set1.count(elem->id()),
136 in2 = set2.count(elem->id());
137
139 if (in1)
140 val = 1;
141 if (in2)
142 val = 2;
143 if (in1 && in2)
144 val = 3;
145
146 elem->set_extra_integer(elemset_index, val);
147 }
148
149
153
154
155
156
157
158
159
160
161
162
163
164
165 std::vector<std::string> var_names = {"var1", "var2", "var3"};
166 std::vector<std::set<elemset_id_type>> elemset_ids =
167 {
168 {1},
169 {2},
170 {1,2}
171 };
172 std::vector<std::map<std::pair<dof_id_type, elemset_id_type>,
Real>> elemset_vals(var_names.size());
173
174
175 std::set<elemset_id_type> id_set_to_fill;
176
177 for (
const auto & elem :
mesh.element_ptr_range())
178 {
179
181
182 bool
183 in1 = id_set_to_fill.count(1),
184 in2 = id_set_to_fill.count(2);
185
186
187 if (in1)
188 elemset_vals[0].emplace( std::make_pair(elem->id(), 1), 1.0);
189
190
191 if (in2)
192 elemset_vals[1].emplace( std::make_pair(elem->id(), 2), 2.0);
193
194
195 if (in1 || in2)
196 for (const auto & id : id_set_to_fill)
197 elemset_vals[2].emplace(
std::make_pair(elem->id(), id), 3.0);
198 }
199
200
201 CPPUNIT_ASSERT_EQUAL(static_cast<std::size_t>(8), elemset_vals[2].size());
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224 {
225 IOClass writer(
mesh);
226 writer.write(filename);
227 writer.write_elemset_data(1, var_names, elemset_ids, elemset_vals);
228 }
229
230
232
233
234 MeshType read_mesh(*TestCommWorld);
235
236
237 read_mesh.allow_renumbering(false);
238
239 IOClass reader(read_mesh);
240
241 reader.read(filename);
242
243
244
245 read_mesh.prepare_for_use();
246
247
249
250
251
252
253 std::vector<std::string> read_in_var_names;
254 std::vector<std::set<elemset_id_type>> read_in_elemset_ids;
255 std::vector<std::map<std::pair<dof_id_type, elemset_id_type>,
Real>> read_in_elemset_vals;
256 reader.read_elemset_data(1, read_in_var_names, read_in_elemset_ids, read_in_elemset_vals);
257
258
259
260
261
262 CPPUNIT_ASSERT(read_in_var_names == var_names);
263 CPPUNIT_ASSERT(read_in_elemset_ids == elemset_ids);
264 CPPUNIT_ASSERT_EQUAL(static_cast<std::size_t>(8), read_in_elemset_vals[2].size());
265 CPPUNIT_ASSERT(read_in_elemset_vals == elemset_vals);
266
267
268 std::map<std::pair<dof_id_type, elemset_id_type>, unsigned int> elemset_array_indices;
269 reader.get_elemset_data_indices(elemset_array_indices);
270
271
272
273 std::vector<dof_id_type> elem_els1 = {4, 9, 15, 25};
274 std::vector<dof_id_type> elem_els2 = {4, 10, 16, 25};
275
277 CPPUNIT_ASSERT_EQUAL(static_cast<unsigned
int>(i),
278 elemset_array_indices[
std::make_pair(elem_els1[i] - 1,
279 1)]);
281 CPPUNIT_ASSERT_EQUAL(static_cast<unsigned
int>(i),
282 elemset_array_indices[
std::make_pair(elem_els2[i] - 1,
283 2)]);
284
285#ifdef LIBMESH_HAVE_XDR
286
287
288
289
290
291
292
293
294
295 read_mesh.write("write_elemset_data.xda");
296
297
299
300
301 Mesh read_mesh2(*TestCommWorld);
302
303
304 read_mesh2.allow_renumbering(false);
305 read_mesh2.read("write_elemset_data.xda");
307
308#endif
309 }
void ErrorVector unsigned int
void checkElemsetCodes(const MeshBase &mesh)
static constexpr dof_id_type invalid_id
An invalid id to distinguish an uninitialized DofObject.
void allow_renumbering(bool allow)
If false is passed in then this mesh will no longer be renumbered when being prepared for use.
unsigned int add_elem_integer(std::string name, bool allocate_data=true, dof_id_type default_value=DofObject::invalid_id)
Register an integer datum (of type dof_id_type) to be added to each element in the mesh.
void add_elemset_code(dof_id_type code, MeshBase::elemset_type id_set)
Tabulate a user-defined "code" for elements which belong to the element sets specified in id_set.
void get_elemsets(dof_id_type elemset_code, MeshBase::elemset_type &id_set_to_fill) const
Look up the element sets for a given elemset code and vice-versa.
The Mesh class is a thin wrapper, around the ReplicatedMesh class by default.
The ReplicatedMesh class is derived from the MeshBase class, and is used to store identical copies of...
Communicator * TestCommWorld
auto index_range(const T &sizable)
Helper function that returns an IntRange<std::size_t> representing all the indices of the passed-in v...
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real