Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support Blueprint mesh in shaping #1455

Draft
wants to merge 103 commits into
base: develop
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
103 commits
Select commit Hold shift + click to select a range
0b42e2f
Transitioning to support blueprint mesh in conduit::Node.
gunney1 Sep 25, 2024
cc80862
Remove obsolete GridFunctionView utility class.
gunney1 Sep 25, 2024
0017bfc
Add missing IntersectionShaper for using blueprint mesh in conduit::N…
gunney1 Sep 25, 2024
280fc5b
Support shaping even without MFEM.
gunney1 Sep 25, 2024
56bad3d
Avoid using removed util function getUmpireDeviceId.
gunney1 Oct 3, 2024
3238825
Make private function populateHexesFromMesh public because NVCC compl…
gunney1 Oct 3, 2024
6603742
Revert to GridFunctionView because of bugs in TempArrayAccess utility.
gunney1 Oct 3, 2024
deaa200
Merge remote-tracking branch 'dvl/feature/gunney/construct-shapes-in-…
gunney1 Oct 7, 2024
aaec48d
Simplify include guards in shaping code.
gunney1 Oct 7, 2024
f38509a
Minor comment and white-space change.
gunney1 Oct 9, 2024
5c6b1a4
Remove support for reading in MFEM mesh in the new test.
gunney1 Oct 14, 2024
9e983fe
Remove unused code (for sampling shaping) in the new test.
gunney1 Oct 14, 2024
09056da
Autoformat.
gunney1 Oct 15, 2024
4b00511
Add ability to generate cartesian mesh as an unstructured hex mesh.
gunney1 Oct 15, 2024
d5e23b4
Progress toward using blueprint mesh.
gunney1 Oct 15, 2024
ccf29b0
Remove code for MFEM mesh that's been replaced by more general code.
gunney1 Oct 16, 2024
add072e
Further progress toward using Blueprint mesh in test.
gunney1 Oct 16, 2024
6d3baf1
Debug new code supporting blueprint mesh.
gunney1 Oct 17, 2024
9205f47
Remove overly restrictive requirements for Mesh object.
gunney1 Oct 17, 2024
dede781
Debug scalar field generation with blueprint mesh (add missing bluepr…
gunney1 Oct 17, 2024
a8114fd
Autoformat.
gunney1 Oct 17, 2024
f4c54cc
Allow reshaping sidre::View holding array data.
gunney1 Oct 17, 2024
71e3fdb
More progress toward Blueprint support in IntersectionShaper.
gunney1 Oct 17, 2024
12e8ea0
More progress toward testing Blueprint support.
gunney1 Oct 18, 2024
8c7efef
Slight refactor for readability.
gunney1 Oct 18, 2024
8d0c269
Add missing matsets data to blueprint mesh.
gunney1 Oct 18, 2024
6dd0dcc
Debug test code. First largely working version.
gunney1 Oct 18, 2024
5edb0cb
Fix bug in new structured box mesh generator utility.
gunney1 Oct 20, 2024
8c7a75b
Fix non-MFEM builds and add switch to toggle MFEM mesh.
gunney1 Oct 21, 2024
fea24a1
Remove debug code.
gunney1 Oct 21, 2024
54548b3
Autoformat.
gunney1 Oct 21, 2024
6c6b7db
Fix bugs in handling meshType intput.
gunney1 Oct 22, 2024
9925815
Fix error in guards against using MFEM when it's not there.
gunney1 Oct 22, 2024
fa99f5b
Fix scope of MFEM variable.
gunney1 Oct 22, 2024
78914f8
Fix error setting up tet geometry.
gunney1 Oct 22, 2024
c0d566a
Tweak shapes to center them and reduce resolution-related bumps.
gunney1 Oct 22, 2024
b1d84e1
Test non-grid-aligned VOR directin.
gunney1 Oct 22, 2024
a02fc77
Fix a weird numerical error, maybe caused by large floating point val…
gunney1 Oct 22, 2024
a26dc9b
Tilt the plane shape away from the axes.
gunney1 Oct 23, 2024
10f97fc
Don't test MFEM mesh if no MFEM.
gunney1 Oct 23, 2024
00a3074
Autoformat.
gunney1 Oct 23, 2024
ec2e1d0
Debug device runtime policies in shaper and test code.
gunney1 Oct 24, 2024
6f745d4
Add conduit::Node mesh support, not tested yet.
gunney1 Oct 25, 2024
12f0c83
Add utilities to check memory spaces against execution spaces.
gunney1 Oct 27, 2024
2ff4ac0
Importing Conduit array into View should use the parent Group's memor…
gunney1 Oct 27, 2024
5d08506
Fix mesh_helper inconsistencies in mixing host and device data.
gunney1 Oct 27, 2024
34debeb
Fix IntersectionShaper to work in a single memory space.
gunney1 Oct 27, 2024
64c0c31
Fix bug in populating vertices array with cuda + mfem.
gunney1 Oct 28, 2024
8ea5baa
Autoformat.
gunney1 Oct 28, 2024
58d0d6d
Silence warnings.
gunney1 Oct 28, 2024
4092122
Silence more warnings.
gunney1 Oct 28, 2024
6affea0
Mods and guards for building without RAJA or Umpire.
gunney1 Oct 28, 2024
af8ba2b
Autoformat.
gunney1 Oct 28, 2024
13b8f91
Add guards for non-sidre builds.
gunney1 Oct 29, 2024
3dcd78d
Merge remote-tracking branch 'gh/feature/gunney/construct-shapes-in-m…
gunney1 Nov 7, 2024
8fbb4b4
Silence compiler warnings: unused variables and shadow declarations.
gunney1 Nov 8, 2024
fd9fa7a
Support external BP mesh as a Conduit Node.
gunney1 Nov 14, 2024
512591c
Don't create vol frac data unless/until it's needed in applyReplaceme…
gunney1 Nov 15, 2024
6528a57
More informative handling of missing fields in conduit mesh.
gunney1 Nov 15, 2024
7ee5a7e
Allow access to individual shape results for apps that have their own…
gunney1 Nov 15, 2024
5d13366
Add notes for future code clean-up.
gunney1 Nov 15, 2024
81363e6
Set the directory path from the ShapeSet when constructing Shaper.
gunney1 Nov 21, 2024
1eb49ad
Remove ShapeSet's obsolete path resolution code.
gunney1 Nov 21, 2024
eb6b86c
Remove resolvePath in favor of using the file utilities.
gunney1 Nov 21, 2024
1c723ba
Add utility to return the parent path from a filesystem path.
gunney1 Nov 21, 2024
2f577e3
Fix missing and unneeded #includes.
gunney1 Nov 22, 2024
e0e09e6
Replace kernel to set array values with calls to fill.
gunney1 Nov 23, 2024
6c660f6
Add logic to avoid unnecessarily recomputing some arrays when
gunney1 Nov 23, 2024
edd924b
Merge remote-tracking branch 'dvl/feature/gunney/construct-shapes-in-…
gunney1 Nov 26, 2024
92b33ed
Fix bug accessing existing field in blueprint mesh.
gunney1 Nov 26, 2024
703b0be
Autoformat and remove unused code.
gunney1 Nov 26, 2024
f8c7d7d
Add timers and make other changes.
gunney1 Dec 6, 2024
b0998b4
Fix new code that work on Conduit mesh. This broke the MFEM tests.
gunney1 Dec 11, 2024
5218ddd
remove obsolete code.
gunney1 Dec 12, 2024
0e1c249
Don't test MFEM mesh if not configured with MFEM.
gunney1 Dec 13, 2024
383ea19
Guess allocator directly from external data's pointer.
gunney1 Dec 13, 2024
fe6e758
Fix bug that put some blueprint mesh data in the wrong memspace.
gunney1 Dec 14, 2024
9ca000a
Remove vestige of 2D support that was copied from another example.
gunney1 Dec 14, 2024
e3b553c
Convert structured to unstructured Blueprint mesh in Axom.
gunney1 Jan 3, 2025
51bcc63
Merge remote-tracking branch 'gh/feature/gunney/construct-shapes-in-m…
gunney1 Jan 3, 2025
0c77c09
Fix non-C2C build.
gunney1 Jan 4, 2025
9d6eacc
Fix non-Conduit build.
gunney1 Jan 4, 2025
1d2abe3
Always use axom::IndexType for Blueprint connectivity data.
gunney1 Jan 6, 2025
310f1ad
Autoformat.
gunney1 Jan 6, 2025
e4ab7ae
Timer for Shaper::loadShapeInternal.
gunney1 Jan 7, 2025
9921031
Remove a check that unintentionally requires user data to be Umpire-a…
gunney1 Jan 8, 2025
5d2372e
Fix breakage that occurs when user data isn't Umpire-allocated.
gunney1 Jan 8, 2025
2b11975
Merge remote-tracking branch 'gh/develop' into feature/gunney/bluepri…
gunney1 Jan 14, 2025
1fe19a2
Autoformat.
gunney1 Jan 15, 2025
91fceda
Less confusing variable name.
gunney1 Jan 15, 2025
fead20d
Merge remote-tracking branch 'gh/develop' into feature/gunney/bluepri…
gunney1 Jan 15, 2025
ff0236c
Silence warning about unreachable instruction.
gunney1 Jan 16, 2025
92fb7af
Fix crash in usesAllocId when the id is not from Umpire.
gunney1 Jan 16, 2025
6b84ee7
Add missing methods in ASYNC versions of device execution spaces.
gunney1 Jan 16, 2025
5fce87d
Update RELEASE-NOTES for interface changes.
gunney1 Jan 16, 2025
d810dd6
Changes to comments.
gunney1 Jan 16, 2025
d14f583
Update IntersectionShaper dox comments.
gunney1 Jan 16, 2025
7e7c141
Autoformat.
gunney1 Jan 16, 2025
68b0808
Change "volume of revolution" to "surface of revolution."
gunney1 Jan 16, 2025
a765335
Dox comment changes and remove an unused method.
gunney1 Jan 17, 2025
2c2a370
Avoid unneccesarily re-allocating memory.
gunney1 Jan 17, 2025
2a9d6f9
Add convenience method to get default allocator id for a runtime exec…
gunney1 Jan 18, 2025
8ab007a
Let user specify allocator ID for shapers.
gunney1 Jan 18, 2025
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
4 changes: 4 additions & 0 deletions RELEASE-NOTES.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ The Axom project release numbers follow [Semantic Versioning](http://semver.org/
## [Unreleased] - Release date yyyy-mm-dd

### Added
- Support in `quest::IntersectionShaper` for Blueprint mesh stored in a `conduit::Node`
or `sidre::Group`.
- A number of new `klee::Geometry` constructors are added, for the different shapes now supported.
This is a temporary change. The class will be subclassed in the future to support a diversity of geometries.
- Support some analytical shapes in `IntersectionShaper`.
Expand All @@ -32,6 +34,8 @@ to use Open Cascade's file I/O capabilities in support of Quest applications.
- Adds a Quest example that reads in a STEP file using Open Cascade and processes its geometry

### Changed
- `quest::Shaper` and `quest::IntersectionShaper` constructors require a runtime policy.
Changing the policy after construction is no longer supported.
- Importing Conduit array data into `sidre::View` now allocates destination
data using the `View`'s parent's allocator ID, instead of always using
host memory. This is consistent with the behavior of deep-copying data
Expand Down
1 change: 1 addition & 0 deletions src/axom/core/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,7 @@ blt_list_append( TO core_depends ELEMENTS caliper IF CALIPER_FOUND )
blt_list_append( TO core_depends ELEMENTS camp IF CAMP_FOUND )
blt_list_append( TO core_depends ELEMENTS umpire IF UMPIRE_FOUND )
blt_list_append( TO core_depends ELEMENTS RAJA IF RAJA_FOUND )
blt_list_append( TO core_depends ELEMENTS conduit::conduit IF CONDUIT_FOUND )
blt_list_append( TO core_depends ELEMENTS mpi IF AXOM_ENABLE_MPI )

# HACK: RAJA's dependencies are not getting added to core due to a bug in
Expand Down
12 changes: 12 additions & 0 deletions src/axom/core/Types.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,10 @@
// Axom includes
#include "axom/config.hpp"

#if defined(AXOM_USE_CONDUIT)
#include "conduit/conduit_data_type.hpp"
#endif

// C/C++ includes
#include <cstdint>

Expand Down Expand Up @@ -62,8 +66,16 @@ using uint64 = std::uint64_t; /*!< 64-bit unsigned integer type */

#if defined(AXOM_USE_64BIT_INDEXTYPE) && !defined(AXOM_NO_INT64_T)
using IndexType = std::int64_t;
#if defined(AXOM_USE_CONDUIT)
static constexpr conduit::DataType::TypeID conduitDataIdOfAxomIndexType =
conduit::DataType::INT64_ID;
#endif
#else
using IndexType = std::int32_t;
#if defined(AXOM_USE_CONDUIT)
static constexpr conduit::DataType::TypeID conduitDataIdOfAxomIndexType =
conduit::DataType::INT32_ID;
#endif
#endif

static constexpr IndexType InvalidIndex = -1;
Expand Down
46 changes: 46 additions & 0 deletions src/axom/core/execution/execution_space.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

#include "axom/config.hpp"
#include "axom/core/memory_management.hpp"
#include "axom/core/execution/runtime_policy.hpp"

/*!
* \file execution_space.hpp
Expand Down Expand Up @@ -88,6 +89,19 @@ struct execution_space
static constexpr bool onDevice() noexcept { return false; }
static constexpr char* name() noexcept { return (char*)"[UNDEFINED]"; }
static int allocatorID() noexcept { return axom::INVALID_ALLOCATOR_ID; }
static constexpr runtime_policy::Policy runtimePolicy() noexcept
{
return runtime_policy::Policy::seq;
}
static bool usesMemorySpace(axom::MemorySpace m) noexcept
{
return m == memory_space;
}
static bool usesAllocId(int allocId) noexcept
{
return allocId == 0 ||
usesMemorySpace(axom::detail::getAllocatorSpace(allocId));
}
};

} // namespace axom
Expand All @@ -109,4 +123,36 @@ struct execution_space
#include "axom/core/execution/internal/hip_exec.hpp"
#endif

namespace axom
{

/// \brief Return default allocator id for a runtime policy.
static const std::map<axom::runtime_policy::Policy, int> s_policyToDefaultAllocatorID {
{axom::runtime_policy::Policy::seq,
axom::execution_space<axom::SEQ_EXEC>::allocatorID()}
#if defined(AXOM_RUNTIME_POLICY_USE_OPENMP)
,
{axom::runtime_policy::Policy::omp,
axom::execution_space<axom::OMP_EXEC>::allocatorID()}
#endif
#if defined(AXOM_RUNTIME_POLICY_USE_CUDA)
,
{axom::runtime_policy::Policy::cuda,
axom::execution_space<axom::CUDA_EXEC<256>>::allocatorID()}
#endif
#if defined(AXOM_RUNTIME_POLICY_USE_HIP)
,
{axom::runtime_policy::Policy::hip,
axom::execution_space<axom::HIP_EXEC<256>>::allocatorID()}
#endif
};

/// \brief Return default allocator id for a runtime policy.
inline int policyToDefaultAllocatorID(axom::runtime_policy::Policy policy)
{
return s_policyToDefaultAllocatorID.find(policy)->second;
}

} // namespace axom

#endif // AXOM_EXECUTIONSPACE_HPP_
26 changes: 26 additions & 0 deletions src/axom/core/execution/internal/cuda_exec.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,19 @@ struct execution_space<CUDA_EXEC<BLOCK_SIZE, SYNCHRONOUS>>
{
return axom::getUmpireResourceAllocatorID(umpire::resource::Device);
}
static constexpr runtime_policy::Policy runtimePolicy() noexcept
{
return runtime_policy::Policy::cuda;
}
static bool usesMemorySpace(axom::MemorySpace m) noexcept
{
return m == memory_space || m == MemorySpace::Unified;
}
static bool usesAllocId(int allocId) noexcept
{
return allocId == 0 ||
usesMemorySpace(axom::detail::getAllocatorSpace(allocId));
}
};

/*!
Expand Down Expand Up @@ -95,6 +108,19 @@ struct execution_space<CUDA_EXEC<BLOCK_SIZE, ASYNC>>
{
return axom::getUmpireResourceAllocatorID(umpire::resource::Device);
}
static constexpr runtime_policy::Policy runtimePolicy() noexcept
{
return runtime_policy::Policy::cuda;
}
static bool usesMemorySpace(axom::MemorySpace m) noexcept
{
return m == memory_space || m == MemorySpace::Unified;
}
static bool usesAllocId(int allocId) noexcept
{
return allocId == 0 ||
usesMemorySpace(axom::detail::getAllocatorSpace(allocId));
}
};
} // namespace axom

Expand Down
26 changes: 26 additions & 0 deletions src/axom/core/execution/internal/hip_exec.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,19 @@ struct execution_space<HIP_EXEC<BLOCK_SIZE, SYNCHRONOUS>>
{
return axom::getUmpireResourceAllocatorID(umpire::resource::Device);
}
static constexpr runtime_policy::Policy runtimePolicy() noexcept
{
return runtime_policy::Policy::hip;
}
static bool usesMemorySpace(axom::MemorySpace m) noexcept
{
return m == memory_space || m == MemorySpace::Unified;
}
static bool usesAllocId(int allocId) noexcept
{
return allocId == 0 ||
usesMemorySpace(axom::detail::getAllocatorSpace(allocId));
}
};

/*!
Expand Down Expand Up @@ -90,6 +103,19 @@ struct execution_space<HIP_EXEC<BLOCK_SIZE, ASYNC>>
{
return axom::getUmpireResourceAllocatorID(umpire::resource::Device);
}
static constexpr runtime_policy::Policy runtimePolicy() noexcept
{
return runtime_policy::Policy::hip;
}
static bool usesMemorySpace(axom::MemorySpace m) noexcept
{
return m == memory_space || m == MemorySpace::Unified;
}
static bool usesAllocId(int allocId) noexcept
{
return allocId == 0 ||
usesMemorySpace(axom::detail::getAllocatorSpace(allocId));
}
};
} // namespace axom

Expand Down
17 changes: 17 additions & 0 deletions src/axom/core/execution/internal/omp_exec.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,23 @@ struct execution_space<OMP_EXEC>
return axom::getDefaultAllocatorID();
#endif
}
static constexpr runtime_policy::Policy runtimePolicy() noexcept
{
return runtime_policy::Policy::omp;
}
static bool usesMemorySpace(axom::MemorySpace m) noexcept
{
return m == memory_space
#ifdef AXOM_USE_UMPIRE
|| m == MemorySpace::Unified
#endif
;
}
static bool usesAllocId(int allocId) noexcept
{
return allocId == 0 ||
usesMemorySpace(axom::detail::getAllocatorSpace(allocId));
}
};

} // namespace axom
Expand Down
17 changes: 17 additions & 0 deletions src/axom/core/execution/internal/seq_exec.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,23 @@ struct execution_space<SEQ_EXEC>
return axom::getDefaultAllocatorID();
#endif
}
static constexpr runtime_policy::Policy runtimePolicy() noexcept
{
return runtime_policy::Policy::seq;
}
static bool usesMemorySpace(axom::MemorySpace m) noexcept
{
return m == memory_space
#ifdef AXOM_USE_UMPIRE
|| m == MemorySpace::Unified
#endif
;
}
static bool usesAllocId(int allocId) noexcept
{
return allocId == 0 ||
usesMemorySpace(axom::detail::getAllocatorSpace(allocId));
}
};

} // namespace axom
Expand Down
3 changes: 2 additions & 1 deletion src/axom/core/execution/runtime_policy.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@
#ifndef AXOM_CORE_EXECUTION_RUNTIME_POLICY_HPP_
#define AXOM_CORE_EXECUTION_RUNTIME_POLICY_HPP_

#include "axom/config.hpp" /* for compile time defs. */
#include "axom/config.hpp" /* for compile time defs. */
#include <string>
#include "axom/fmt/format.h" /* for axom::fmt */

#include <map>
Expand Down
21 changes: 21 additions & 0 deletions src/axom/core/memory_management.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,27 @@ inline int getDefaultAllocatorID()
#endif
}

/*!
* \brief Get the allocator id from which data has been allocated.
* \return Allocator id. If Umpire doesn't have an allocator for
* the pointer, or Axom wasn't configured with Umpire, return 0.
*
* \pre ptr has a valid pointer value.
*/
inline int getAllocatorIDFromPointer(const void* ptr)
{
#ifdef AXOM_USE_UMPIRE
umpire::ResourceManager& rm = umpire::ResourceManager::getInstance();
if(rm.hasAllocator(const_cast<void*>(ptr)))
{
umpire::Allocator allocator = rm.getAllocator(const_cast<void*>(ptr));
return allocator.getId();
}
#endif
AXOM_UNUSED_VAR(ptr);
return 0;
}

/*!
* \brief Allocates a chunk of memory of type T.
*
Expand Down
26 changes: 26 additions & 0 deletions src/axom/core/utilities/FileUtilities.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,32 @@ int makeDirsForPath(const std::string& path)
return err;
}

//-----------------------------------------------------------------------------
std::string prefixRelativePath(const std::string& path, const std::string& prefix)
{
if(path[0] == '/' || prefix.empty())
{
return path;
}
return utilities::filesystem::joinPath(prefix, path);
}

//-----------------------------------------------------------------------------
std::string getParentPath(const std::string& path)
{
char separator = '/';
std::size_t found = path.rfind(separator);

std::string parent;

if(found != std::string::npos)
{
parent = path.substr(0, found);
}

return parent;
}

//-----------------------------------------------------------------------------
void getDirName(std::string& dir, const std::string& path)
{
Expand Down
22 changes: 22 additions & 0 deletions src/axom/core/utilities/FileUtilities.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,28 @@ std::string joinPath(const std::string& fileDir,
*/
int makeDirsForPath(const std::string& path);

/*!
* \brief Add a prefix to a path if it is relative.
*
* \param [in] path string representing an absolute or relative path
* \param [in] prefix string representing a directory path
*
* \return \c prefix + \c path (with delimiter) if the path is
* relative or \c prefix is empty, or just \c path otherwise.
*/
std::string prefixRelativePath(const std::string& path,
const std::string& prefix);

/*!
* \brief Get parent path name from a filesystem path.
*
* \param [in] path an absolute or relative filesystem path
*
* \return a directory path formed by removing the last part of the
* input path
*/
std::string getParentPath(const std::string& path);

/*!
* \brief Get directory name from a path that contains a file name
*
Expand Down
10 changes: 5 additions & 5 deletions src/axom/klee/Geometry.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -86,19 +86,19 @@ Geometry::Geometry(const TransformableGeometryProperties& startProperties,

Geometry::Geometry(const TransformableGeometryProperties& startProperties,
const axom::Array<double, 2>& discreteFunction,
const Point3D& vorBase,
const Vector3D& vorDirection,
const Point3D& sorBase,
const Vector3D& sorDirection,
axom::IndexType levelOfRefinement,
std::shared_ptr<GeometryOperator const> operator_)
: m_startProperties(startProperties)
, m_format("vor3D")
, m_format("sor3D")
, m_path()
, m_meshGroup(nullptr)
, m_topology()
, m_sphere()
, m_discreteFunction(discreteFunction)
, m_vorBase(vorBase)
, m_vorDirection(vorDirection)
, m_sorBase(sorBase)
, m_sorDirection(sorDirection)
, m_levelOfRefinement(levelOfRefinement)
, m_operator(std::move(operator_))
{ }
Expand Down
Loading