diff --git a/src/language/modules/MeshModule.cpp b/src/language/modules/MeshModule.cpp index d898b658bfe1960707a0dc341c854203cd901cfc..0803f1420724fefa167bc51ed2b8e7bb101a9a73 100644 --- a/src/language/modules/MeshModule.cpp +++ b/src/language/modules/MeshModule.cpp @@ -9,6 +9,7 @@ #include <language/utils/TypeDescriptor.hpp> #include <mesh/CartesianMeshBuilder.hpp> #include <mesh/Connectivity.hpp> +#include <mesh/DiamondDualMeshBuilder.hpp> #include <mesh/GmshReader.hpp> #include <mesh/Mesh.hpp> #include <utils/Exceptions.hpp> @@ -177,5 +178,16 @@ MeshModule::MeshModule() return builder.mesh(); } + )); + + this->_addBuiltinFunction("diamondDual", + std::make_shared<BuiltinFunctionEmbedder<std::shared_ptr<const IMesh>( + const std::shared_ptr<const IMesh>&)>>( + + [](const std::shared_ptr<const IMesh>& p_mesh) -> std::shared_ptr<const IMesh> { + DiamondDualMeshBuilder builder{p_mesh}; + return builder.mesh(); + } + )); } diff --git a/src/mesh/DiamondDualMeshBuilder.cpp b/src/mesh/DiamondDualMeshBuilder.cpp new file mode 100644 index 0000000000000000000000000000000000000000..2c5108775b3d9d0bc0d956da6958dec3018fbb0f --- /dev/null +++ b/src/mesh/DiamondDualMeshBuilder.cpp @@ -0,0 +1,38 @@ +#include <mesh/DiamondDualMeshBuilder.hpp> + +#include <mesh/Connectivity.hpp> +#include <mesh/ConnectivityDescriptor.hpp> +#include <mesh/ConnectivityDispatcher.hpp> +#include <mesh/RefId.hpp> +#include <utils/Array.hpp> +#include <utils/Messenger.hpp> + +template <size_t Dimension> +void +DiamondDualMeshBuilder::_buildDiamondMeshFrom(const std::shared_ptr<const IMesh>& p_mesh) +{ + static_assert(Dimension <= 3, "invalid dimension"); + + m_mesh = p_mesh; +} + +DiamondDualMeshBuilder::DiamondDualMeshBuilder(const std::shared_ptr<const IMesh>& p_mesh) +{ + switch (p_mesh->dimension()) { + case 1: { + this->_buildDiamondMeshFrom<1>(p_mesh); + break; + } + case 2: { + this->_buildDiamondMeshFrom<2>(p_mesh); + break; + } + case 3: { + this->_buildDiamondMeshFrom<3>(p_mesh); + break; + } + default: { + throw UnexpectedError("invalid mesh dimension: " + std::to_string(p_mesh->dimension())); + } + } +} diff --git a/src/mesh/DiamondDualMeshBuilder.hpp b/src/mesh/DiamondDualMeshBuilder.hpp new file mode 100644 index 0000000000000000000000000000000000000000..16b2a107dc4be921746ff0b1fe5e94a63c276fc5 --- /dev/null +++ b/src/mesh/DiamondDualMeshBuilder.hpp @@ -0,0 +1,20 @@ +#ifndef DIAMOND_DUAL_MESH_BUILDER_HPP +#define DIAMOND_DUAL_MESH_BUILDER_HPP + +#include <mesh/IMesh.hpp> +#include <mesh/MeshBuilderBase.hpp> + +#include <memory> + +class DiamondDualMeshBuilder : public MeshBuilderBase +{ + private: + template <size_t Dimension> + void _buildDiamondMeshFrom(const std::shared_ptr<const IMesh>& mesh); + + public: + DiamondDualMeshBuilder(const std::shared_ptr<const IMesh>& mesh); + ~DiamondDualMeshBuilder() = default; +}; + +#endif // DIAMOND_DUAL_MESH_BUILDER_HPP