Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
2ca27c7
Fixes warnings in release llvm config
kennyweiss Dec 29, 2025
c85496a
Updates to [email protected] which already has our path patch
kennyweiss Dec 29, 2025
78abe25
Updates README to set up svg2contours venv through uv
kennyweiss Dec 29, 2025
057ae91
Improves logic to reverse y-axis in svg2contours script
kennyweiss Dec 29, 2025
f7b11f8
Use MFEMReader in quest's winding number example
kennyweiss Dec 30, 2025
e4a8a6f
Check is curve is actually rational in segment_to_curve_impl used by …
kennyweiss Dec 30, 2025
4d7304c
Refactors MFEMReader to support multispan NURBS curves
kennyweiss Dec 30, 2025
e9fb135
Refactors accessing of query_points in quest_winding_number example
kennyweiss Dec 30, 2025
a268f85
Refactors mesh setup in quest_winding_number
kennyweiss Dec 30, 2025
d9e594c
Adds caliper option to winding number example
kennyweiss Dec 30, 2025
ac75356
Moves query code into its own function in quest winding number example
kennyweiss Dec 30, 2025
7f33ffa
Adds an option to quest_winding_number example to enable/disable memo…
kennyweiss Dec 31, 2025
5090db9
Bugfix when reading in weights from MFEM mesh
kennyweiss Dec 31, 2025
3f91676
In SamplingShaper, log an error and exit if we cannot read in an mfem…
kennyweiss Dec 31, 2025
0537f58
Check return code from other filetypes in Shaping query and log error…
kennyweiss Dec 31, 2025
a2bdcec
Improvement for MPIWrapper -- check if we need to init MPI and only f…
kennyweiss Dec 31, 2025
6a5d477
Adds tests for missing files in shaping application
kennyweiss Dec 31, 2025
0fceea2
Adds slic::ScopedAbortToThrow RAII class
kennyweiss Dec 31, 2025
4d3084d
Bugfix in mfem reader for array of curves
kennyweiss Dec 31, 2025
aa226cf
MFEMReader: We can now also get the attributes associated with the NU…
kennyweiss Jan 1, 2026
c5eaa0c
MFEMReader: Fixes loading polynomial curves in Bernstein basis
kennyweiss Jan 1, 2026
1bfba9f
Applies some suggestions from PR review
kennyweiss Jan 8, 2026
26dc2a9
Updates RELEASE-NOTES
kennyweiss Jan 8, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 27 additions & 22 deletions RELEASE-NOTES.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,8 @@ The Axom project release numbers follow [Semantic Versioning](http://semver.org/
- Adds a `conduit` spack variant. Conduit was previously a required dependency in our spack package, and is now enabled by default.
- Adds spack variants for `adiak` and `caliper`. These replace the previous `profiling` variant which enabled both at the same time.
- Adds the `AXOM_TEST_NUM_OMP_THREADS` configuration variable to control the default OpenMP thread count for tests.
- Slic: Adds `slic::getAbortFunction()` to return a function pointer to the abort handler called during logging functions


### Changed
- Evaluation methods for line integrals in `axom::primal` have been generalized, and
Expand Down Expand Up @@ -79,12 +81,15 @@ The Axom project release numbers follow [Semantic Versioning](http://semver.org/
Refer to the new `StoragePolicy` interface for substitute functionality.
- The `axom::bump::clipping` namespace was renamed to `axom::bump::extraction` since it now
contains additional algorithms.
- Updates to [mfem version 4.9][https://github.com/mfem/mfem/releases/tag/v4.9].
Also updates mfem's hypre dependency to [hypre version 2.27][https://github.com/hypre-space/hypre/releases/tag/v2.27.0].
- Updates to [mfem version 4.9](https://github.com/mfem/mfem/releases/tag/v4.9).
Also updates mfem's hypre dependency to [hypre version 2.27](https://github.com/hypre-space/hypre/releases/tag/v2.27.0).
- Quest: MFEMReader can now read in multispan 1D NURBS meshes

### Fixed
- Sina's Fortran tests are now running (instead of silently failing)
- Optimized `Array::push_back()` and `Array::emplace_back()` operations.
- Quest: In Shaping applications, we now check return code after attempting to load a mesh
and throw an error for unsuccessful loads.

### Deprecated

Expand Down Expand Up @@ -140,11 +145,11 @@ The Axom project release numbers follow [Semantic Versioning](http://semver.org/
- Adds Axom-native Gauss-Legendre quadrature rules that can be used without an MFEM dependency

### Changed
- Updates blt submodule to [BLT version 0.7.1][https://github.com/LLNL/blt/releases/tag/v0.7.1]
- Updates to [Conduit version 0.9.5][https://github.com/LLNL/conduit/releases/tag/v0.9.5]
- Updates to [RAJA version 2025.09.0][https://github.com/LLNL/RAJA/releases/tag/v2025.09.0]
- Updates to [camp version 2025.09.2][https://github.com/LLNL/camp/releases/tag/v2025.09.2]
- Updates to [Umpire version 2025.09.0][https://github.com/LLNL/Umpire/releases/tag/v2025.09.0]
- Updates blt submodule to [BLT version 0.7.1](https://github.com/LLNL/blt/releases/tag/v0.7.1)
- Updates to [Conduit version 0.9.5](https://github.com/LLNL/conduit/releases/tag/v0.9.5)
- Updates to [RAJA version 2025.09.0](https://github.com/LLNL/RAJA/releases/tag/v2025.09.0)
- Updates to [camp version 2025.09.2](https://github.com/LLNL/camp/releases/tag/v2025.09.2)
- Updates to [Umpire version 2025.09.0](https://github.com/LLNL/Umpire/releases/tag/v2025.09.0)
- Axom now requires `C++17` and will default to that if not specified via `BLT_CXX_STD`.
- Fixed `Timer::elapsed*()` methods so they properly report the sum of all start/stop cycles
since the last `reset()`.
Expand All @@ -154,7 +159,7 @@ The Axom project release numbers follow [Semantic Versioning](http://semver.org/
- Primal: Adds a method to determine if a point is contained within a Tetrahedron.
- The `primal::BoundingBox` class' `expand()` and `shift()` methods were modified so they do
nothing when called on invalid bounding boxes.
- Updates to [MFEM version 4.8.0][https://github.com/mfem/mfem/releases/tag/v4.8]
- Updates to [MFEM version 4.8.0](https://github.com/mfem/mfem/releases/tag/v4.8)
- Readers in Quest were moved from a `quest/readers` directory to `quest/io`.
- Sina: Renames a Fortran module to `sina_hdf5_config` (from `hdf5_config`)
- Spin: Uses `axom::FlatMap` in `SparseOctreeLevel` implementation. We have observed a performance regression
Expand Down Expand Up @@ -224,13 +229,13 @@ to use Open Cascade's file I/O capabilities in support of Quest applications.
- Adds initial support for 2D shaping in `quest::IntersectionShaper`, using a c2c contour as input. The contour cannot overlap, and is expected to be entirely above the x-axis.

### Changed
- Updates blt submodule to [BLT version 0.7.0][https://github.com/LLNL/blt/releases/tag/v0.7.0]
- Updates to [MFEM version 4.7.0][https://github.com/mfem/mfem/releases/tag/v4.7]
- Updates to [Caliper version 2.12.1][https://github.com/LLNL/Caliper/releases/tag/v2.12.1]
- Updates to [Conduit version 0.9.3][https://github.com/LLNL/conduit/releases/tag/v0.9.3]
- Updates to [RAJA version 2025.03.0][https://github.com/LLNL/RAJA/releases/tag/v2025.03.0]
- Updates to [camp version 2025.03.0][https://github.com/LLNL/camp/releases/tag/v2025.03.0]
- Updates to [Umpire version 2025.03.0][https://github.com/LLNL/Umpire/releases/tag/v2025.03.0]
- Updates blt submodule to [BLT version 0.7.0](https://github.com/LLNL/blt/releases/tag/v0.7.0)
- Updates to [MFEM version 4.7.0](https://github.com/mfem/mfem/releases/tag/v4.7)
- Updates to [Caliper version 2.12.1](https://github.com/LLNL/Caliper/releases/tag/v2.12.1)
- Updates to [Conduit version 0.9.3](https://github.com/LLNL/conduit/releases/tag/v0.9.3)
- Updates to [RAJA version 2025.03.0](https://github.com/LLNL/RAJA/releases/tag/v2025.03.0)
- Updates to [camp version 2025.03.0](https://github.com/LLNL/camp/releases/tag/v2025.03.0)
- Updates to [Umpire version 2025.03.0](https://github.com/LLNL/Umpire/releases/tag/v2025.03.0)
- `primal::NumericArray` has been moved to `core`. The header is `core/NumericArray.hpp`.
- `quest::Shaper` and `quest::IntersectionShaper` constructors require a runtime policy.
Changing the policy after construction is no longer supported.
Expand Down Expand Up @@ -304,10 +309,10 @@ to use Open Cascade's file I/O capabilities in support of Quest applications.
- Quest: Adds an example to query winding numbers on an MFEM NURBS mesh

### Changed
- Updates to [Conduit version 0.9.2][https://github.com/LLNL/conduit/releases/tag/v0.9.2]
- Updates to [RAJA version 2024.07.0][https://github.com/LLNL/RAJA/releases/tag/v2024.07.0]
- Updates to [camp version 2024.07.0][https://github.com/LLNL/camp/releases/tag/v2024.07.0]
- Updates to [Umpire version 2024.07.0][https://github.com/LLNL/Umpire/releases/tag/v2024.07.0]
- Updates to [Conduit version 0.9.2](https://github.com/LLNL/conduit/releases/tag/v0.9.2)
- Updates to [RAJA version 2024.07.0](https://github.com/LLNL/RAJA/releases/tag/v2024.07.0)
- Updates to [camp version 2024.07.0](https://github.com/LLNL/camp/releases/tag/v2024.07.0)
- Updates to [Umpire version 2024.07.0](https://github.com/LLNL/Umpire/releases/tag/v2024.07.0)
- `axom::CLI::ExitCodes::Success` has been changed to `axom::CLI::ExitCodes::CLI11_Success`
to avoid conflict when X11 `#define`s `Success`.
- `MarchingCubes` masking now uses the mask field's integer values instead of
Expand Down Expand Up @@ -407,9 +412,9 @@ to use Open Cascade's file I/O capabilities in support of Quest applications.
## [Version 0.8.1] - Release date 2023-08-16

### Changed
- Updates to [RAJA version 2023.06.0][https://github.com/LLNL/RAJA/releases/tag/v2023.06.0]
- Updates to [camp version 2023.06.0][https://github.com/LLNL/camp/releases/tag/v2023.06.0]
- Updates to [Umpire version 2023.06.0][https://github.com/LLNL/Umpire/releases/tag/v2023.06.0]
- Updates to [RAJA version 2023.06.0](https://github.com/LLNL/RAJA/releases/tag/v2023.06.0)
- Updates to [camp version 2023.06.0](https://github.com/LLNL/camp/releases/tag/v2023.06.0)
- Updates to [Umpire version 2023.06.0](https://github.com/LLNL/Umpire/releases/tag/v2023.06.0)

### Fixed
- Fixed MFEMSidreDataCollection finite element space bug
Expand Down
13 changes: 11 additions & 2 deletions src/axom/core/utilities/RAII.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,15 @@ class MPIWrapper
MPIWrapper(int argc, char** argv)
{
#ifdef AXOM_USE_MPI
MPI_Init(&argc, &argv);
int mpi_initialized = 0;
MPI_Initialized(&mpi_initialized);

if(mpi_initialized == 0)
{
MPI_Init(&argc, &argv);
m_should_finalize = true;
}

MPI_Comm_rank(MPI_COMM_WORLD, &m_rank);
MPI_Comm_size(MPI_COMM_WORLD, &m_numranks);
#else
Expand All @@ -53,7 +61,7 @@ class MPIWrapper
~MPIWrapper()
{
#ifdef AXOM_USE_MPI
if(is_initialized())
if(m_should_finalize)
{
MPI_Finalize();
}
Expand Down Expand Up @@ -81,6 +89,7 @@ class MPIWrapper
private:
int m_rank {0};
int m_numranks {1};
bool m_should_finalize {false};
};

/**
Expand Down
8 changes: 5 additions & 3 deletions src/axom/primal/geometry/CoordinateTransformer.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -266,9 +266,11 @@ class CoordinateTransformer
*/
void applyRotation(const axom::primal::Vector<T, 3>& u, T sinT, T cosT)
{
const T EPS = 10 * axom::numerics::floating_point_limits<T>::epsilon();
SLIC_ASSERT(axom::utilities::isNearlyEqual(u.squared_norm(), 1.0, EPS));
T ccosT = 1 - cosT;
SLIC_ASSERT(
axom::utilities::isNearlyEqual(u.squared_norm(),
1.0,
10 * axom::numerics::floating_point_limits<T>::epsilon()));
const T ccosT = 1 - cosT;

Matrx P; // 3D rotation matrix.
P[0][0] = u[0] * u[0] * ccosT + cosT;
Expand Down
113 changes: 84 additions & 29 deletions src/axom/quest/DiscreteShape.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -168,10 +168,15 @@ std::shared_ptr<mint::Mesh> DiscreteShape::createMeshRepresentation()

axom::mint::Mesh* meshRep = nullptr;
#ifdef AXOM_USE_MPI
quest::internal::read_stl_mesh(shapePath, meshRep, m_comm);
const int rc = quest::internal::read_stl_mesh(shapePath, meshRep, m_comm);
#else
quest::internal::read_stl_mesh(shapePath, meshRep);
const int rc = quest::internal::read_stl_mesh(shapePath, meshRep);
#endif
SLIC_ERROR_ROOT_IF(rc != quest::internal::READ_SUCCESS,
axom::fmt::format("Failed to read STL shape '{}' from file '{}'.",
m_shape.getName(),
shapePath));

m_meshRep.reset(meshRep);
// Transform the coordinates of the linearized mesh.
applyTransforms();
Expand All @@ -183,10 +188,15 @@ std::shared_ptr<mint::Mesh> DiscreteShape::createMeshRepresentation()

axom::mint::Mesh* meshRep = nullptr;
#ifdef AXOM_USE_MPI
quest::internal::read_pro_e_mesh(shapePath, meshRep, m_comm);
const int rc = quest::internal::read_pro_e_mesh(shapePath, meshRep, m_comm);
#else
quest::internal::read_pro_e_mesh(shapePath, meshRep);
const int rc = quest::internal::read_pro_e_mesh(shapePath, meshRep);
#endif
SLIC_ERROR_ROOT_IF(rc != quest::internal::READ_SUCCESS,
axom::fmt::format("Failed to read Pro/E shape '{}' from file '{}'.",
m_shape.getName(),
shapePath));

m_meshRep.reset(meshRep);
}
#ifdef AXOM_USE_C2C
Expand All @@ -204,25 +214,65 @@ std::shared_ptr<mint::Mesh> DiscreteShape::createMeshRepresentation()
const bool uniform = !(m_refinementType == DiscreteShape::RefinementDynamic &&
m_percentError > MINIMUM_PERCENT_ERROR);
#ifdef AXOM_USE_MPI
quest::internal::read_c2c_mesh(shapePath,
uniform,
transform,
m_samplesPerKnotSpan,
m_vertexWeldThreshold,
m_percentError,
meshRep,
m_revolvedVolume, // output arg
m_comm);
int rc = quest::internal::READ_FAILED;
try
{
rc = quest::internal::read_c2c_mesh(shapePath,
uniform,
transform,
m_samplesPerKnotSpan,
m_vertexWeldThreshold,
m_percentError,
meshRep,
m_revolvedVolume, // output arg
m_comm);
}
catch(const std::exception& e)
{
SLIC_ERROR_ROOT(
axom::fmt::format("Failed to read C2C shape '{}' from file '{}'. Exception: {}",
m_shape.getName(),
shapePath,
e.what()));
}
catch(...)
{
SLIC_ERROR_ROOT(axom::fmt::format("Failed to read C2C shape '{}' from file '{}'.",
m_shape.getName(),
shapePath));
}
#else
quest::internal::read_c2c_mesh(shapePath,
uniform,
transform,
m_samplesPerKnotSpan,
m_vertexWeldThreshold,
m_percentError,
meshRep,
m_revolvedVolume); // output arg
int rc = quest::internal::READ_FAILED;
try
{
rc = quest::internal::read_c2c_mesh(shapePath,
uniform,
transform,
m_samplesPerKnotSpan,
m_vertexWeldThreshold,
m_percentError,
meshRep,
m_revolvedVolume); // output arg
}
catch(const std::exception& e)
{
SLIC_ERROR_ROOT(
axom::fmt::format("Failed to read C2C shape '{}' from file '{}'. Exception: {}",
m_shape.getName(),
shapePath,
e.what()));
}
catch(...)
{
SLIC_ERROR_ROOT(axom::fmt::format("Failed to read C2C shape '{}' from file '{}'.",
m_shape.getName(),
shapePath));
}
#endif
SLIC_ERROR_ROOT_IF(rc != quest::internal::READ_SUCCESS,
axom::fmt::format("Failed to read C2C shape '{}' from file '{}'.",
m_shape.getName(),
shapePath));

m_meshRep.reset(meshRep);

Expand All @@ -243,14 +293,19 @@ std::shared_ptr<mint::Mesh> DiscreteShape::createMeshRepresentation()
axom::mint::Mesh* meshRep = nullptr;
const bool uniform = !(m_refinementType == DiscreteShape::RefinementDynamic &&
m_percentError > MINIMUM_PERCENT_ERROR);
quest::internal::read_mfem_mesh(shapePath,
uniform,
transform,
m_samplesPerKnotSpan,
m_vertexWeldThreshold,
m_percentError,
meshRep,
m_revolvedVolume); // output arg
const int rc = quest::internal::read_mfem_mesh(shapePath,
uniform,
transform,
m_samplesPerKnotSpan,
m_vertexWeldThreshold,
m_percentError,
meshRep,
m_revolvedVolume); // output arg

SLIC_ERROR_ROOT_IF(rc != quest::internal::READ_SUCCESS,
axom::fmt::format("Failed to read MFEM shape '{}' from file '{}'.",
m_shape.getName(),
shapePath));

m_meshRep.reset(meshRep);

Expand Down
7 changes: 6 additions & 1 deletion src/axom/quest/SamplingShaper.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -246,7 +246,12 @@ class SamplingShaper : public Shaper
// Read the MFEM file as curved polygon contours for winding number intersection.
quest::MFEMReader reader;
reader.setFileName(shapePath);
reader.read(m_contours);
const int rc = reader.read(m_contours);

SLIC_ERROR_IF(rc != quest::MFEMReader::READ_SUCCESS,
axom::fmt::format("Failed to read MFEM shape '{}' from file '{}'.",
shape.getName(),
shapePath));
}
else
{
Expand Down
35 changes: 18 additions & 17 deletions src/axom/quest/detail/inout/InOutOctreeMeshDumper.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -725,26 +725,27 @@ class InOutOctreeMeshDumper<3> : public InOutOctreeMeshDumperBase<3, InOutOctree
}

// Add fields to the triangle mesh
const auto numTris = tris.size();

// Index of each triangle within the mesh
axom::IndexType* triIdx = addIntField(debugMesh, "triangle_index");
{
// Index of each triangle within the mesh
axom::IndexType* triIdx = addIntField(debugMesh, "triangle_index");

// Indices of the three boundary vertices of this triangle
axom::IndexType* vertIdx[DIM];
vertIdx[0] = addIntField(debugMesh, "vertex_index_0");
vertIdx[1] = addIntField(debugMesh, "vertex_index_1");
vertIdx[2] = addIntField(debugMesh, "vertex_index_2");
// Indices of the three boundary vertices of this triangle
axom::IndexType* vertIdx[DIM];
vertIdx[0] = addIntField(debugMesh, "vertex_index_0");
vertIdx[1] = addIntField(debugMesh, "vertex_index_1");
vertIdx[2] = addIntField(debugMesh, "vertex_index_2");

for(int i = 0; i < numTris; ++i)
{
CellIndex tIdx = tris[i];
triIdx[i] = tIdx;
const int numTris = static_cast<int>(tris.size());
for(int i = 0; i < numTris; ++i)
{
CellIndex tIdx = tris[i];
triIdx[i] = tIdx;

CellVertIndices tv = m_octree.m_meshWrapper.cellVertexIndices(tIdx);
vertIdx[0][i] = tv[0];
vertIdx[1][i] = tv[1];
vertIdx[2][i] = tv[2];
CellVertIndices tv = m_octree.m_meshWrapper.cellVertexIndices(tIdx);
vertIdx[0][i] = tv[0];
vertIdx[1][i] = tv[1];
vertIdx[2][i] = tv[2];
}
}

// other possible fields on triangles
Expand Down
1 change: 0 additions & 1 deletion src/axom/quest/examples/quest_marching_cubes_example.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1785,7 +1785,6 @@ int main(int argc, char** argv)

#ifdef AXOM_USE_MPI
MPI_Bcast(&retval, 1, MPI_INT, 0, MPI_COMM_WORLD);
MPI_Finalize();
#endif

exit(retval);
Expand Down
1 change: 0 additions & 1 deletion src/axom/quest/examples/quest_shape_in_memory.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1535,7 +1535,6 @@ int main(int argc, char** argv)

#ifdef AXOM_USE_MPI
MPI_Bcast(&retval, 1, MPI_INT, 0, MPI_COMM_WORLD);
MPI_Finalize();
#endif
exit(retval);
}
Expand Down
Loading