19 #include "mesh_reader_exodusii.h"
30 MeshReaderExodusII::MeshReaderExodusII()
34 throw Hermes::Exceptions::Exception(
"hermes2d was not compiled with ExodusII support");
38 MeshReaderExodusII::~MeshReaderExodusII()
52 if(a.x < b.x)
return true;
53 else if(a.x > b.x)
return false;
56 if(a.y < b.y)
return true;
66 int cpu_ws =
sizeof(double);
69 int exoid = ex_open(file_name, EX_READ, &cpu_ws, &io_ws, &version);
72 int n_dims, n_nodes, n_elems, n_eblocks, n_nodesets, n_sidesets;
73 char title[MAX_LINE_LENGTH + 1];
74 err = ex_get_init(exoid, title, &n_dims, &n_nodes, &n_elems, &n_eblocks, &n_nodesets, &n_sidesets);
77 throw Hermes::Exceptions::Exception(
"File '%s' does not contain 2D mesh", file_name);
82 double *x =
new double[n_nodes];
83 double *y =
new double[n_nodes];
84 err = ex_get_coord(exoid, x, y, NULL);
87 std::map<Vertex, int, VCompare> vtx_list;
88 std::map<int, int> vmap;
89 Hermes::vector<Vertex> vtx_arr;
91 for (
int i = 0; i < n_nodes; i++)
95 if(vtx_list.count(v) == 0)
109 int n_vtx = vtx_arr.size();
110 double2 *vtx =
new double2[n_vtx];
111 for (
int i = 0; i < n_vtx; i++)
113 vtx[i][0] = vtx_arr[i].x;
114 vtx[i][1] = vtx_arr[i].y;
121 int *eid_blocks =
new int[n_eblocks];
122 err = ex_get_elem_blk_ids(exoid, eid_blocks);
124 for (
int i = 0; i < n_eblocks; i++)
126 int id = eid_blocks[i];
129 char elem_type[MAX_STR_LENGTH + 1];
130 int n_elems_in_blk, n_elem_nodes, n_attrs;
131 err = ex_get_elem_block(exoid,
id, elem_type, &n_elems_in_blk, &n_elem_nodes, &n_attrs);
133 if(n_elem_nodes == 3) n_tri += n_elems_in_blk;
134 else if(n_elem_nodes == 4) n_quad += n_elems_in_blk;
138 throw Hermes::Exceptions::Exception(
"Unknown type of element");
142 int3 *tri = n_tri > 0 ?
new int3[n_tri] : NULL;
144 int4 *quad = n_quad > 0 ?
new int4[n_quad] : NULL;
147 int n_els = n_tri + n_quad;
148 int **els = n_els > 0 ?
new int *[n_els] : NULL;
149 int *el_nv = n_els > 0 ?
new int[n_els] : NULL;
151 int it = 0, iq = 0, iel = 0;
152 for (
int i = 0; i < n_eblocks; i++)
154 int id = eid_blocks[i];
157 char elem_type[MAX_STR_LENGTH + 1];
158 int n_elems_in_blk, n_elem_nodes, n_attrs;
159 err = ex_get_elem_block(exoid,
id, elem_type, &n_elems_in_blk, &n_elem_nodes, &n_attrs);
162 int *connect =
new int[n_elem_nodes * n_elems_in_blk];
163 err = ex_get_elem_conn(exoid,
id, connect);
166 std::ostringstream string_stream;
172 mesh->element_markers_conversion.insert_marker(mesh->element_markers_conversion.min_marker_unused, el_marker);
175 for (
int j = 0; j < n_elems_in_blk; j++)
177 el_nv[iel] = n_elem_nodes;
178 if(n_elem_nodes == 3)
180 tri[it][0] = vmap[connect[ic++]];
181 tri[it][1] = vmap[connect[ic++]];
182 tri[it][2] = vmap[connect[ic++]];
183 tri_markers[it] = el_marker;
187 else if(n_elem_nodes == 4)
189 quad[iq][0] = vmap[connect[ic++]];
190 quad[iq][1] = vmap[connect[ic++]];
191 quad[iq][2] = vmap[connect[ic++]];
192 quad[iq][3] = vmap[connect[ic++]];
193 quad_markers[iq] = el_marker;
200 throw Hermes::Exceptions::Exception(
"Unknown type of element");
207 delete [] eid_blocks;
210 int *sid_blocks =
new int[n_sidesets];
211 err = ex_get_side_set_ids(exoid, sid_blocks);
215 for (
int i = 0; i < n_sidesets; i++)
217 int sid = sid_blocks[i];
218 int n_sides_in_set, n_df_in_set;
219 err = ex_get_side_set_param(exoid, sid, &n_sides_in_set, &n_df_in_set);
220 n_mark += n_sides_in_set;
222 int2 *marks =
new int2[n_mark];
226 for (
int i = 0; i < n_sidesets; i++)
228 int sid = sid_blocks[i];
229 int n_sides_in_set, n_df_in_set;
230 err = ex_get_side_set_param(exoid, sid, &n_sides_in_set, &n_df_in_set);
231 int num_elem_in_set = n_sides_in_set;
233 int *elem_list =
new int[num_elem_in_set];
234 int *side_list =
new int[n_sides_in_set];
235 err = ex_get_side_set(exoid, sid, elem_list, side_list);
238 std::ostringstream string_stream;
239 string_stream << sid;
244 mesh->boundary_markers_conversion.insert_marker(mesh->boundary_markers_conversion.min_marker_unused, bnd_marker);
246 for (
int j = 0; j < num_elem_in_set; j++)
248 int nv = el_nv[side_list[j] - 1];
249 int vt = side_list[j] - 1;
250 marks[im][0] = els[elem_list[j] - 1][vt];
251 marks[im][1] = els[elem_list[j] - 1][(vt + 1) % nv];
252 bnd_markers[im] = bnd_marker;
259 delete [] sid_blocks;
262 err = ex_close(exoid);
264 mesh->
create(n_vtx, vtx, n_tri, tri, tri_markers, n_quad, quad, quad_markers, n_mark, marks, bnd_markers);
270 delete [] tri_markers;
271 delete [] quad_markers;
272 delete [] bnd_markers;