Compare commits
95
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
19ce2ae7ae | ||
|
|
15528aab92 | ||
|
|
7ddf970839 | ||
|
|
394fc7752a | ||
|
|
2d13ff1b55 | ||
|
|
c2996e371f | ||
|
|
85d5c16d2d | ||
|
|
41bd81dde6 | ||
|
|
fc61580ce9 | ||
|
|
647721158b | ||
|
|
49905582a4 | ||
|
|
88532305ee | ||
|
|
a2bc150e07 | ||
|
|
0be7c747d2 | ||
|
|
76274ae97e | ||
|
|
e141cda81e | ||
|
|
faf3b4aa0e | ||
|
|
bb202161ca | ||
|
|
64958e87cf | ||
|
|
4d3954b55f | ||
|
|
ecfc46899d | ||
|
|
bcd6642def | ||
|
|
5f0f47a74e | ||
|
|
338f0871f8 | ||
|
|
92bed9fb79 | ||
|
|
0ad8e9baeb | ||
|
|
e03ac32a45 | ||
|
|
c52d78cfba | ||
|
|
053714172d | ||
|
|
9aafe2359c | ||
|
|
b073699823 | ||
|
|
ab583da367 | ||
|
|
e364280499 | ||
|
|
b16d912a1c | ||
|
|
c9bdcb6123 | ||
|
|
d9e44fe045 | ||
|
|
9134b4a852 | ||
|
|
1189596e43 | ||
|
|
0e21c9c4b0 | ||
|
|
8bb16b0789 | ||
|
|
65f7701dd7 | ||
|
|
4e4a06f029 | ||
|
|
ac628bbf90 | ||
|
|
6ec073b11d | ||
|
|
0b98e6f60d | ||
|
|
6e5cb10eb8 | ||
|
|
04b45a754e | ||
|
|
bc9a6f2452 | ||
|
|
bdf757e611 | ||
|
|
30d92e799c | ||
|
|
f53e668305 | ||
|
|
aa5a18d32d | ||
|
|
172c50d117 | ||
|
|
35ef4f981d | ||
|
|
954607032a | ||
|
|
6a1b8d8c74 | ||
|
|
65c63619ec | ||
|
|
90e4be3cb5 | ||
|
|
084e415793 | ||
|
|
4060712ac9 | ||
|
|
a630a42413 | ||
|
|
44da879029 | ||
|
|
54e9d983f9 | ||
|
|
e368c9fc0f | ||
|
|
3bfcce4423 | ||
|
|
d494a1fb26 | ||
|
|
242a121538 | ||
|
|
c976e7e291 | ||
|
|
0d2ae842be | ||
|
|
9b8ce93b2f | ||
|
|
24d7f9d091 | ||
|
|
a15dfc7eb9 | ||
|
|
3208151873 | ||
|
|
5615e68dad | ||
|
|
3f59a4e587 | ||
|
|
87ce6cc007 | ||
|
|
09d75174dd | ||
|
|
9c83c0b7a5 | ||
|
|
77ec6aca54 | ||
|
|
382c86adfe | ||
|
|
c18af85f8b | ||
|
|
06de29029a | ||
|
|
9a59db9629 | ||
|
|
b56f4573d7 | ||
|
|
42c763d38b | ||
|
|
4a40591684 | ||
|
|
b5da6d92c1 | ||
|
|
6337adffbe | ||
|
|
5b5657d387 | ||
|
|
3195a20695 | ||
|
|
35418e1bae | ||
|
|
428aa7b1a1 | ||
|
|
825181ea5b | ||
|
|
204fe6fa02 | ||
|
|
488babc78c |
@@ -35,6 +35,9 @@ Meshing improvements
|
||||
|
||||
- Added support for internal boundary elements in nonconforming meshes.
|
||||
|
||||
- Added ExodusII output capability. The writer can handle first-order (Pyramid5,
|
||||
Wedge6, Hex8, Tet4) and second-order FE types (Pyramid14, Wedge18, Hex27, Tet10).
|
||||
|
||||
- The ReadCubit Genesis mesh importer has been rewritten to improve readability.
|
||||
|
||||
Discretization improvements
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
set(SRCS
|
||||
attribute_sets.cpp
|
||||
element.cpp
|
||||
exodus_writer.cpp
|
||||
face_nbr_geom.cpp
|
||||
gmsh.cpp
|
||||
hexahedron.cpp
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -2331,6 +2331,11 @@ public:
|
||||
bool high_order_output=false,
|
||||
int compression_level=0);
|
||||
|
||||
#ifdef MFEM_USE_NETCDF
|
||||
/// @brief Export a mesh to an Exodus II file.
|
||||
void PrintExodusII(const std::string fpath);
|
||||
#endif
|
||||
|
||||
/** @brief Prints the mesh with boundary elements given by the boundary of
|
||||
the subdomains, so that the boundary of subdomain i has boundary
|
||||
attribute i+1. */
|
||||
|
||||
@@ -386,6 +386,9 @@ int main (int argc, char *argv[])
|
||||
"S) Save in MFEM serial format\n"
|
||||
"T) Save in MFEM parallel format using the current partitioning\n"
|
||||
"V) Save in VTK format (only linear and quadratic meshes)\n"
|
||||
#ifdef MFEM_USE_NETCDF
|
||||
"X) Save in Exodus II format (only linear and quadratic meshes)\n"
|
||||
#endif
|
||||
"D) Save as a DataCollection\n"
|
||||
"q) Quit\n"
|
||||
#ifdef MFEM_USE_ZLIB
|
||||
@@ -1288,6 +1291,15 @@ int main (int argc, char *argv[])
|
||||
cout << "New VTK mesh file: " << omesh_file << endl;
|
||||
}
|
||||
|
||||
#ifdef MFEM_USE_NETCDF
|
||||
if (mk == 'X')
|
||||
{
|
||||
const char omesh_file[] = "mesh-explorer.e";
|
||||
mesh->PrintExodusII(omesh_file);
|
||||
cout << "New Exodus II mesh file: " << omesh_file << endl;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (mk == 'D')
|
||||
{
|
||||
cout << "What type of DataCollection?\n"
|
||||
|
||||
@@ -56,6 +56,7 @@ set(UNIT_TESTS_SRCS
|
||||
mesh/test_submesh.cpp
|
||||
mesh/test_vtu.cpp
|
||||
mesh/test_nurbs.cpp
|
||||
mesh/test_exodus_writer.cpp
|
||||
fem/test_1d_bilininteg.cpp
|
||||
fem/test_2d_bilininteg.cpp
|
||||
fem/test_3d_bilininteg.cpp
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,273 @@
|
||||
// Copyright (c) 2010-2024, Lawrence Livermore National Security, LLC. Produced
|
||||
// at the Lawrence Livermore National Laboratory. All Rights reserved. See files
|
||||
// LICENSE and NOTICE for details. LLNL-CODE-806117.
|
||||
//
|
||||
// This file is part of the MFEM library. For more information and source code
|
||||
// availability visit https://mfem.org.
|
||||
//
|
||||
// MFEM is free software; you can redistribute it and/or modify it under the
|
||||
// terms of the BSD-3 license. We welcome feedback and contributions, see file
|
||||
// CONTRIBUTING.md for details.
|
||||
|
||||
#include "mfem.hpp"
|
||||
#include "unit_tests.hpp"
|
||||
|
||||
using namespace mfem;
|
||||
|
||||
#ifdef MFEM_USE_NETCDF
|
||||
static void CompareMeshes(Mesh & mesh1, Mesh & mesh2)
|
||||
{
|
||||
REQUIRE(mesh1.GetNE() == mesh2.GetNE());
|
||||
REQUIRE(mesh1.GetNV() == mesh2.GetNV());
|
||||
REQUIRE(mesh1.GetNBE() == mesh2.GetNBE());
|
||||
REQUIRE(mesh1.GetNFaces() == mesh2.GetNFaces());
|
||||
|
||||
const FiniteElementSpace * fespace1 = mesh1.GetNodalFESpace();
|
||||
const FiniteElementSpace * fespace2 = mesh2.GetNodalFESpace();
|
||||
|
||||
// Check elements.
|
||||
Array<int> element_faces1, element_faces2;
|
||||
Array<int> element_orient1, element_orient2;
|
||||
Array<int> dofs1, dofs2;
|
||||
|
||||
for (int ielement = 0; ielement < mesh1.GetNE(); ielement++)
|
||||
{
|
||||
int attr1 = mesh1.GetAttribute(ielement);
|
||||
int attr2 = mesh2.GetAttribute(ielement);
|
||||
|
||||
REQUIRE(attr1 == attr2);
|
||||
|
||||
Element::Type type1 = mesh1.GetElementType(ielement);
|
||||
Element::Type type2 = mesh2.GetElementType(ielement);
|
||||
|
||||
REQUIRE(type1 == type2);
|
||||
|
||||
mesh1.GetElementFaces(ielement, element_faces1, element_orient1);
|
||||
mesh2.GetElementFaces(ielement, element_faces2, element_orient2);
|
||||
|
||||
REQUIRE(element_faces1 == element_faces2);
|
||||
REQUIRE(element_orient1 == element_orient2);
|
||||
|
||||
if (fespace1 && fespace2)
|
||||
{
|
||||
fespace1->GetElementDofs(ielement, dofs1);
|
||||
fespace2->GetElementDofs(ielement, dofs2);
|
||||
}
|
||||
else
|
||||
{
|
||||
mesh1.GetElementVertices(ielement, dofs1);
|
||||
mesh2.GetElementVertices(ielement, dofs2);
|
||||
}
|
||||
|
||||
REQUIRE(dofs1 == dofs2);
|
||||
}
|
||||
|
||||
// Check bdr elements.
|
||||
for (int ibdr_element = 0; ibdr_element < mesh1.GetNBE(); ibdr_element++)
|
||||
{
|
||||
int attr1 = mesh1.GetBdrAttribute(ibdr_element);
|
||||
int attr2 = mesh2.GetBdrAttribute(ibdr_element);
|
||||
|
||||
REQUIRE(attr1 == attr2);
|
||||
|
||||
Element::Type type1 = mesh1.GetBdrElementType(ibdr_element);
|
||||
Element::Type type2 = mesh2.GetBdrElementType(ibdr_element);
|
||||
|
||||
REQUIRE(type1 == type2);
|
||||
|
||||
int face_index1 = mesh1.GetBdrElementFaceIndex(ibdr_element);
|
||||
int face_index2 = mesh2.GetBdrElementFaceIndex(ibdr_element);
|
||||
|
||||
REQUIRE(face_index1 == face_index2);
|
||||
}
|
||||
|
||||
// Check face vertices.
|
||||
Array<int> face_vertices1, face_vertices2;
|
||||
for (int iface_index = 0; iface_index < mesh1.GetNFaces(); iface_index++)
|
||||
{
|
||||
mesh1.GetFaceVertices(iface_index, face_vertices1);
|
||||
mesh2.GetFaceVertices(iface_index, face_vertices2);
|
||||
|
||||
REQUIRE(face_vertices1 == face_vertices2);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
TEST_CASE("ExodusII Write Hex8", "[Mesh]")
|
||||
{
|
||||
#ifdef MFEM_USE_NETCDF
|
||||
// Load Exodus II mesh from file.
|
||||
std::string fpath_original = "data/simple-cube-hex8.e";
|
||||
Mesh original_mesh = Mesh::LoadFromFile(fpath_original, 0, 0, true);
|
||||
|
||||
// Write generated Exodus II mesh to file.
|
||||
std::string fpath_generated = "simple-cube-hex8-out.e";
|
||||
original_mesh.PrintExodusII(fpath_generated);
|
||||
|
||||
// Load generated Exodus II mesh.
|
||||
Mesh generated_mesh = Mesh::LoadFromFile(fpath_generated, 0, 0, true);
|
||||
|
||||
CompareMeshes(original_mesh, generated_mesh);
|
||||
|
||||
// Remove temporary file.
|
||||
REQUIRE(remove(fpath_generated.c_str()) == 0);
|
||||
#endif
|
||||
}
|
||||
|
||||
TEST_CASE("ExodusII Write Hex27", "[Mesh]")
|
||||
{
|
||||
#ifdef MFEM_USE_NETCDF
|
||||
// Load Exodus II mesh from file.
|
||||
std::string fpath_original = "data/simple-cube-hex27.e";
|
||||
Mesh original_mesh = Mesh::LoadFromFile(fpath_original, 0, 0, true);
|
||||
|
||||
// Write generated Exodus II mesh to file.
|
||||
std::string fpath_generated = "simple-cube-hex27-out.e";
|
||||
original_mesh.PrintExodusII(fpath_generated);
|
||||
|
||||
// Load generated Exodus II mesh.
|
||||
Mesh generated_mesh = Mesh::LoadFromFile(fpath_generated, 0, 0, true);
|
||||
|
||||
CompareMeshes(original_mesh, generated_mesh);
|
||||
|
||||
REQUIRE(remove(fpath_generated.c_str()) == 0);
|
||||
#endif
|
||||
}
|
||||
|
||||
TEST_CASE("ExodusII Write Tet4", "[Mesh]")
|
||||
{
|
||||
#ifdef MFEM_USE_NETCDF
|
||||
// Load Exodus II mesh from file. NB: - Do NOT refine as this changes vertex ordering!
|
||||
std::string fpath_original = "data/simple-cube-tet4.e";
|
||||
Mesh original_mesh = Mesh::LoadFromFile(fpath_original, 0, 0, true);
|
||||
|
||||
// Write generated Exodus II mesh to file.
|
||||
std::string fpath_generated = "simple-cube-tet4-out.e";
|
||||
original_mesh.PrintExodusII(fpath_generated);
|
||||
|
||||
// Load generated Exodus II mesh.
|
||||
Mesh generated_mesh = Mesh::LoadFromFile(fpath_generated, 0, 0, true);
|
||||
|
||||
CompareMeshes(original_mesh, generated_mesh);
|
||||
|
||||
REQUIRE(remove(fpath_generated.c_str()) == 0);
|
||||
#endif
|
||||
}
|
||||
|
||||
TEST_CASE("ExodusII Write Tet10", "[Mesh]")
|
||||
{
|
||||
#ifdef MFEM_USE_NETCDF
|
||||
// Load Exodus II mesh from file.
|
||||
std::string fpath_original = "data/simple-cube-tet10.e";
|
||||
Mesh original_mesh = Mesh::LoadFromFile(fpath_original, 0, 0, true);
|
||||
|
||||
// Write generated Exodus II mesh to file.
|
||||
std::string fpath_generated = "simple-cube-tet10-out.e";
|
||||
original_mesh.PrintExodusII(fpath_generated);
|
||||
|
||||
// Load generated Exodus II mesh.
|
||||
Mesh generated_mesh = Mesh::LoadFromFile(fpath_generated, 0, 0, true);
|
||||
|
||||
CompareMeshes(original_mesh, generated_mesh);
|
||||
|
||||
REQUIRE(remove(fpath_generated.c_str()) == 0);
|
||||
#endif
|
||||
}
|
||||
|
||||
// TEST_CASE("ExodusII Write Wedge6", "[Mesh]")
|
||||
// {
|
||||
// #ifdef MFEM_USE_NETCDF
|
||||
// std::string fpath_original = "data/simple-cube-wedge6.e";
|
||||
// Mesh original_mesh = Mesh::LoadFromFile(fpath_original, 0, 0, true);
|
||||
|
||||
// std::string fpath_generated = "simple-cube-wedge6-out.e";
|
||||
// original_mesh.PrintExodusII(fpath_generated);
|
||||
|
||||
// Mesh generated_mesh = Mesh::LoadFromFile(fpath_generated, 0, 0, true);
|
||||
// CompareMeshes(original_mesh, generated_mesh);
|
||||
//
|
||||
// REQUIRE(remove(fpath_generated.c_str()) == 0);
|
||||
// #endif
|
||||
// }
|
||||
|
||||
// TEST_CASE("ExodusII Write Wedge18", "[Mesh]")
|
||||
// {
|
||||
// #ifdef MFEM_USE_NETCDF
|
||||
// std::string fpath_original = "data/simple-cube-wedge18.e";
|
||||
// Mesh original_mesh = Mesh::LoadFromFile(fpath_original, 0, 0, true);
|
||||
|
||||
// std::string fpath_generated = "simple-cube-wedge18-out.e";
|
||||
// original_mesh.PrintExodusII(fpath_generated);
|
||||
|
||||
// Mesh generated_mesh = Mesh::LoadFromFile(fpath_generated, 0, 0, true);
|
||||
// CompareMeshes(original_mesh, generated_mesh);
|
||||
|
||||
// REQUIRE(remove(fpath_generated.c_str()) == 0);
|
||||
// #endif
|
||||
// }
|
||||
|
||||
// TEST_CASE("ExodusII Write Pyramid5", "[Mesh]")
|
||||
// {
|
||||
// #ifdef MFEM_USE_NETCDF
|
||||
// std::string fpath_original = "data/simple-cube-pyramid5.e";
|
||||
// Mesh original_mesh = Mesh::LoadFromFile(fpath_original, 0, 0, true);
|
||||
|
||||
// std::string fpath_generated = "simple-cube-pyramid5-out.e";
|
||||
// original_mesh.PrintExodusII(fpath_generated);
|
||||
|
||||
// Mesh generated_mesh = Mesh::LoadFromFile(fpath_generated, 0, 0, true);
|
||||
// CompareMeshes(original_mesh, generated_mesh);
|
||||
|
||||
// REQUIRE(remove(fpath_generated.c_str()) == 0);
|
||||
// #endif
|
||||
// }
|
||||
|
||||
// TEST_CASE("ExodusII Write Pyramid14", "[Mesh]")
|
||||
// {
|
||||
// #ifdef MFEM_USE_NETCDF
|
||||
// std::string fpath_original = "data/simple-cube-pyramid14.e";
|
||||
// Mesh original_mesh = Mesh::LoadFromFile(fpath_original, 0, 0, true);
|
||||
|
||||
// std::string fpath_generated = "simple-cube-pyramid14-out.e";
|
||||
// original_mesh.PrintExodusII(fpath_generated);
|
||||
|
||||
// Mesh generated_mesh = Mesh::LoadFromFile(fpath_generated, 0, 0, true);
|
||||
// CompareMeshes(original_mesh, generated_mesh);
|
||||
|
||||
// REQUIRE(remove(fpath_generated.c_str()) == 0);
|
||||
// #endif
|
||||
// }
|
||||
|
||||
// TEST_CASE("ExodusII Write Mixed First-Order", "[Mesh]")
|
||||
// {
|
||||
// #ifdef MFEM_USE_NETCDF
|
||||
// // Contains Hex8, Tet4, Wedge6, Pyramid5 elements.
|
||||
// std::string fpath_original = "data/simple-cube-multi-element-order1.e";
|
||||
// Mesh original_mesh = Mesh::LoadFromFile(fpath_original, 0, 0, true);
|
||||
|
||||
// std::string fpath_generated = "simple-cube-multi-element-order1-out.e";
|
||||
// original_mesh.PrintExodusII(fpath_generated);
|
||||
|
||||
// Mesh generated_mesh = Mesh::LoadFromFile(fpath_generated, 0, 0, true);
|
||||
// CompareMeshes(original_mesh, generated_mesh);
|
||||
|
||||
// REQUIRE(remove(fpath_generated.c_str()) == 0);
|
||||
// #endif
|
||||
// }
|
||||
|
||||
// TEST_CASE("ExodusII Write Mixed Second-Order", "[Mesh]")
|
||||
// {
|
||||
// #ifdef MFEM_USE_NETCDF
|
||||
// // Contains Hex27 and Tet10 elements.
|
||||
// std::string fpath_original = "data/simple-cube-multi-element-order2.e";
|
||||
// Mesh original_mesh = Mesh::LoadFromFile(fpath_original, 0, 0, true);
|
||||
|
||||
// std::string fpath_generated = "simple-cube-multi-element-order2-out.e";
|
||||
// original_mesh.PrintExodusII(fpath_generated);
|
||||
|
||||
// Mesh generated_mesh = Mesh::LoadFromFile(fpath_generated, 0, 0, true);
|
||||
// CompareMeshes(original_mesh, generated_mesh);
|
||||
|
||||
// REQUIRE(remove(fpath_generated.c_str()) == 0);
|
||||
// #endif
|
||||
// }
|
||||
Reference in New Issue
Block a user