diff --git a/src/language/modules/SchemeModule.cpp b/src/language/modules/SchemeModule.cpp index 0b661076230b1c4822ec3e3ce051548e82687f8c..b4022d660475cf93eb9f9e1cb291622de22dba22 100644 --- a/src/language/modules/SchemeModule.cpp +++ b/src/language/modules/SchemeModule.cpp @@ -6,12 +6,16 @@ #include <language/utils/BinaryOperatorProcessorBuilder.hpp> #include <language/utils/BuiltinFunctionEmbedder.hpp> #include <language/utils/TypeDescriptor.hpp> +#include <mesh/Connectivity.hpp> #include <mesh/Mesh.hpp> +#include <mesh/MeshData.hpp> +#include <mesh/MeshDataManager.hpp> #include <scheme/AcousticSolver.hpp> #include <scheme/DirichletBoundaryConditionDescriptor.hpp> #include <scheme/DiscreteFunctionDescriptorP0.hpp> #include <scheme/DiscreteFunctionDescriptorP0Vector.hpp> #include <scheme/DiscreteFunctionInterpoler.hpp> +#include <scheme/DiscreteFunctionP0.hpp> #include <scheme/DiscreteFunctionUtils.hpp> #include <scheme/DiscreteFunctionVectorInterpoler.hpp> #include <scheme/FourierBoundaryConditionDescriptor.hpp> @@ -240,6 +244,48 @@ SchemeModule::SchemeModule() )); + this + ->_addBuiltinFunction("cell_volume", + std::make_shared<BuiltinFunctionEmbedder<std::shared_ptr<const IDiscreteFunction>( + const std::shared_ptr<const IMesh>&)>>( + + [](const std::shared_ptr<const IMesh>& i_mesh) -> std::shared_ptr<const IDiscreteFunction> { + switch (i_mesh->dimension()) { + case 1: { + constexpr size_t Dimension = 1; + using MeshType = Mesh<Connectivity<Dimension>>; + std::shared_ptr<const MeshType> mesh = + std::dynamic_pointer_cast<const Mesh<Connectivity<Dimension>>>(i_mesh); + + return std::make_shared<const DiscreteFunctionP0< + Dimension, double>>(mesh, copy(MeshDataManager::instance().getMeshData(*mesh).Vj())); + } + case 2: { + constexpr size_t Dimension = 2; + using MeshType = Mesh<Connectivity<Dimension>>; + std::shared_ptr<const MeshType> mesh = + std::dynamic_pointer_cast<const Mesh<Connectivity<Dimension>>>(i_mesh); + + return std::make_shared<const DiscreteFunctionP0< + Dimension, double>>(mesh, copy(MeshDataManager::instance().getMeshData(*mesh).Vj())); + } + case 3: { + constexpr size_t Dimension = 3; + using MeshType = Mesh<Connectivity<Dimension>>; + std::shared_ptr<const MeshType> mesh = + std::dynamic_pointer_cast<const Mesh<Connectivity<Dimension>>>(i_mesh); + + return std::make_shared<const DiscreteFunctionP0< + Dimension, double>>(mesh, copy(MeshDataManager::instance().getMeshData(*mesh).Vj())); + } + default: { + throw UnexpectedError("invalid mesh dimension"); + } + } + } + + )); + MathFunctionRegisterForVh{*this}; }