64{
65#ifndef NIMBLE_HAVE_EXODUS
67#else
68
70
72
73
74 int word_size = sizeof(double);
75 int io_word_size = 0;
76 float exodus_version;
77 int exodus_file_id = ex_open(
file_name_.c_str(), EX_READ, &word_size, &io_word_size, &exodus_version);
78 if (exodus_file_id < 0) {
79 std::cout <<
"\n****Error: unable to open file: " <<
file_name_.c_str() <<
"\n" << std::endl;
81 }
82
83
84 int num_nodes, num_elem, num_blocks, num_node_sets, num_side_sets;
85 char title[MAX_LINE_LENGTH + 1];
86 int retval =
87 ex_get_init(exodus_file_id, title, &
dim_, &num_nodes, &num_elem, &num_blocks, &num_node_sets, &num_side_sets);
88 if (retval != 0)
ReportExodusError(retval,
"GenesisMesh::ReadFile()",
"ex_get_init");
89
90
95 if (retval != 0)
ReportExodusError(retval,
"GenesisMesh::ReadFile()",
"ex_get_coord");
96
97
99 retval = ex_get_id_map(exodus_file_id, EX_NODE_MAP, &
node_global_id_[0]);
100 if (retval != 0)
ReportExodusError(retval,
"GenesisMesh::ReadFile()",
"ex_get_id_map");
101 for (int i = 0; i < num_nodes; ++i) {
103 }
104
105
107 retval = ex_get_id_map(exodus_file_id, EX_ELEM_MAP, &
elem_global_id_[0]);
108 if (retval != 0)
ReportExodusError(retval,
"GenesisMesh::ReadFile()",
"ex_get_id_map");
109 for (int i = 0; i < num_elem; ++i) {
111 }
112
113
114 int num_node_maps, num_elem_maps;
115 retval = ex_get_map_param(exodus_file_id, &num_node_maps, &num_elem_maps);
116 if (retval != 0)
ReportExodusError(retval,
"GenesisMesh::ReadFile()",
"ex_get_map_param");
117 if (num_node_maps > 1 || num_elem_maps > 1) {
119 "GenesisMesh::ReadFile(), multiple auxiliary node/element maps not "
120 "supported!");
121 }
122
123
124
125
126 if (num_node_maps > 0) {
127 char map_name[MAX_STR_LENGTH + 1];
128 retval = ex_get_name(exodus_file_id, EX_NODE_MAP, 1, map_name);
129 if (retval != 0)
ReportExodusError(retval,
"GenesisMesh::ReadFile()",
"ex_get_name");
130 if (std::string(map_name) != std::string("original_global_id_map")) {
131 NIMBLE_ABORT(
"GenesisMesh::ReadFile(), unsupported auxiliary node map!");
132 }
133 retval = ex_get_num_map(exodus_file_id, EX_NODE_MAP, 1, &
node_global_id_[0]);
134 if (retval != 0)
ReportExodusError(retval,
"GenesisMesh::ReadFile()",
"ex_get_num_map");
135 for (int i = 0; i < num_nodes; ++i) {
137 }
138 }
139 if (num_elem_maps > 0) {
140 char map_name[MAX_STR_LENGTH + 1];
141 retval = ex_get_name(exodus_file_id, EX_ELEM_MAP, 1, map_name);
142 if (retval != 0)
ReportExodusError(retval,
"GenesisMesh::ReadFile()",
"ex_get_name");
143 if (std::string(map_name) != std::string("original_global_id_map")) {
144 NIMBLE_ABORT(
"GenesisMesh::ReadFile(), unsupported auxiliary element map!");
145 }
146 retval = ex_get_num_map(exodus_file_id, EX_ELEM_MAP, 1, &
elem_global_id_[0]);
147 if (retval != 0)
ReportExodusError(retval,
"GenesisMesh::ReadFile()",
"ex_get_num_map");
148 for (int i = 0; i < num_elem; ++i) {
150 }
151 }
152
153
154 if (num_node_sets > 0) {
156 retval = ex_get_ids(exodus_file_id, EX_NODE_SET, &
node_set_ids_[0]);
157 if (retval != 0)
ReportExodusError(retval,
"GenesisMesh::ReadFile()",
"ex_get_ids");
158 }
159 for (int i = 0; i < num_node_sets; ++i) {
161 char name[MAX_STR_LENGTH + 1];
162 retval = ex_get_name(exodus_file_id, EX_NODE_SET, id, name);
163 if (retval != 0)
ReportExodusError(retval,
"GenesisMesh::ReadFile()",
"ex_get_name");
164
165
166 std::string node_set_name(name);
167 if (node_set_name.size() == 0) {
168 std::stringstream ss;
169 ss << "nodelist_" << id;
170 node_set_name = ss.str();
171 }
173
174 int num_nodes_in_ns;
175 int num_dist_factors_in_ns;
176 retval = ex_get_set_param(exodus_file_id, EX_NODE_SET, id, &num_nodes_in_ns, &num_dist_factors_in_ns);
177 if (retval != 0)
ReportExodusError(retval,
"GenesisMesh::ReadFile()",
"ex_get_set_param");
179 if (num_nodes_in_ns > 0 && num_dist_factors_in_ns == num_nodes_in_ns) {
180 node_sets_[id] = std::vector<int>(num_nodes_in_ns);
181 retval = ex_get_set(exodus_file_id, EX_NODE_SET,
id, &
node_sets_[
id][0], NULL);
182 if (retval != 0)
ReportExodusError(retval,
"GenesisMesh::ReadFile()",
"ex_get_set");
183
185 }
187 if (num_nodes_in_ns > 0) {
190 if (retval != 0)
ReportExodusError(retval,
"GenesisMesh::ReadFile()",
"ex_get_set_dist_fact");
191 }
192 }
193
194
195 if (num_side_sets > 0) {
197 retval = ex_get_ids(exodus_file_id, EX_SIDE_SET, &
side_set_ids_[0]);
198 if (retval != 0)
ReportExodusError(retval,
"GenesisMesh::ReadFile()",
"ex_get_ids");
199 }
200 for (int i = 0; i < num_side_sets; ++i) {
202 char name[MAX_STR_LENGTH + 1];
203 retval = ex_get_name(exodus_file_id, EX_SIDE_SET, id, name);
204 if (retval != 0)
ReportExodusError(retval,
"GenesisMesh::ReadFile()",
"ex_get_name");
205
206
207 std::string side_set_name(name);
208 if (side_set_name.size() == 0) {
209 std::stringstream ss;
210 ss << "sideset_" << id;
211 side_set_name = ss.str();
212 }
214
215 int num_nodes_in_ss;
216 int num_dist_factors_in_ss;
217 retval = ex_get_set_param(exodus_file_id, EX_SIDE_SET, id, &num_nodes_in_ss, &num_dist_factors_in_ss);
218 if (retval != 0)
ReportExodusError(retval,
"GenesisMesh::ReadFile()",
"ex_get_set_param");
220 if (num_nodes_in_ss > 0 && num_dist_factors_in_ss == num_nodes_in_ss) {
221 side_sets_[id] = std::vector<int>(num_nodes_in_ss);
222 retval = ex_get_set(exodus_file_id, EX_SIDE_SET,
id, &
side_sets_[
id][0], NULL);
223 if (retval != 0)
ReportExodusError(retval,
"GenesisMesh::ReadFile()",
"ex_get_set");
224
226 }
228 if (num_nodes_in_ss > 0) {
231 if (retval != 0)
ReportExodusError(retval,
"GenesisMesh::ReadFile()",
"ex_get_set_dist_fact");
232 }
233 }
234
235
236 std::vector<int> all_block_ids(num_blocks);
237 retval = ex_get_ids(exodus_file_id, EX_ELEM_BLOCK, &all_block_ids[0]);
238 if (retval != 0)
ReportExodusError(retval,
"GenesisMesh::ReadFile()",
"ex_get_ids");
239
240
241 for (auto block_id : all_block_ids) {
242 int num_elem_this_block(0), num_nodes_per_elem(0), num_edges_per_elem(0), num_faces_per_elem(0), num_attributes(0);
243 char elem_type[MAX_STR_LENGTH + 1];
244 retval = ex_get_block(
245 exodus_file_id,
246 EX_ELEM_BLOCK,
247 block_id,
248 elem_type,
249 &num_elem_this_block,
250 &num_nodes_per_elem,
251 &num_edges_per_elem,
252 &num_faces_per_elem,
253 &num_attributes);
254 if (retval != 0)
ReportExodusError(retval,
"GenesisMesh::ReadFile()",
"ex_get_block");
255 if (num_elem_this_block > 0) {
block_ids_.push_back(block_id); }
257
258
259 char exodus_block_name[MAX_STR_LENGTH + 1];
260 retval = ex_get_name(exodus_file_id, EX_ELEM_BLOCK, block_id, exodus_block_name);
261 if (retval != 0)
ReportExodusError(retval,
"GenesisMesh::ReadFile()",
"ex_get_name");
262
263
264 std::string block_name(exodus_block_name);
265 if (block_name.size() == 0) {
266 std::stringstream ss;
267 ss << "block_" << block_id;
268 block_name = ss.str();
269 }
270 if (num_elem_this_block > 0) {
block_names_[block_id] = block_name; }
272 }
273
274 num_blocks =
static_cast<int>(
block_ids_.size());
275
276 int elem_local_index = 0;
277
278 for (int i_block = 0; i_block < num_blocks; i_block++) {
280
281
282 int num_elem_this_block(0), num_nodes_per_elem(0), num_edges_per_elem(0), num_faces_per_elem(0), num_attributes(0);
283 char elem_type[MAX_STR_LENGTH + 1];
284 retval = ex_get_block(
285 exodus_file_id,
286 EX_ELEM_BLOCK,
287 block_id,
288 elem_type,
289 &num_elem_this_block,
290 &num_nodes_per_elem,
291 &num_edges_per_elem,
292 &num_faces_per_elem,
293 &num_attributes);
294 if (retval != 0)
ReportExodusError(retval,
"GenesisMesh::ReadFile()",
"ex_get_block");
296
297
299 for (int i = 0; i < num_elem_this_block; i++) {
301 }
302
303
306 if (retval != 0)
ReportExodusError(retval,
"GenesisMesh::ReadFile()",
"ex_get_conn");
307
310 }
311 }
312
313 retval = ex_close(exodus_file_id);
314 if (retval != 0)
ReportExodusError(retval,
"GenesisMesh::ReadFile()",
"ex_close");
315#endif
316}
bool IsValid() const
Definition nimble_genesis_mesh.h:77
void ReportExodusError(int error_code, const char *method_name, const char *exodus_method_name) const
Definition nimble_genesis_mesh.cc:614
void ReadTextFile(std::string file_name)
Definition nimble_genesis_mesh.cc:319
#define NIMBLE_ABORT(...)
Definition nimble_macros.h:87