From 346108c97daf70e3825eef097879eb767388b546 Mon Sep 17 00:00:00 2001 From: Drouard <axelle.drouard@orange.fr> Date: Tue, 13 Sep 2022 15:03:37 +0200 Subject: [PATCH] Change hybridheat for 3D --- src/language/modules/SchemeModule.cpp | 24 +++++++--------- src/scheme/ScalarHybridScheme.cpp | 41 ++++++++++++--------------- src/scheme/ScalarHybridScheme.hpp | 2 +- 3 files changed, 30 insertions(+), 37 deletions(-) diff --git a/src/language/modules/SchemeModule.cpp b/src/language/modules/SchemeModule.cpp index d1fa4bf7c..2e72192ea 100644 --- a/src/language/modules/SchemeModule.cpp +++ b/src/language/modules/SchemeModule.cpp @@ -639,17 +639,16 @@ SchemeModule::SchemeModule() })); this->_addBuiltinFunction("hybridheat", - std::make_shared<BuiltinFunctionEmbedder<std::tuple< - std::shared_ptr<const IDiscreteFunction>, - std::shared_ptr<const IDiscreteFunction>>(const std::shared_ptr<const IDiscreteFunction>&, - const std::shared_ptr<const IDiscreteFunction>&, - const std::shared_ptr<const IDiscreteFunction>&, - const std::vector<std::shared_ptr< - const IBoundaryConditionDescriptor>>&, - const std::vector<std::shared_ptr< - const IBoundaryConditionDescriptor>>&, - const std::shared_ptr<const IDiscreteFunction>&, - const double&, const double&, const double&)>>( + std::make_shared<BuiltinFunctionEmbedder<std::shared_ptr< + const IDiscreteFunction>(const std::shared_ptr<const IDiscreteFunction>&, + const std::shared_ptr<const IDiscreteFunction>&, + const std::shared_ptr<const IDiscreteFunction>&, + const std::vector< + std::shared_ptr<const IBoundaryConditionDescriptor>>&, + const std::vector< + std::shared_ptr<const IBoundaryConditionDescriptor>>&, + const std::shared_ptr<const IDiscreteFunction>&, const double&, + const double&, const double&)>>( [](const std::shared_ptr<const IDiscreteFunction>& kappa, const std::shared_ptr<const IDiscreteFunction>& f, @@ -660,8 +659,7 @@ SchemeModule::SchemeModule() bc_prev_descriptor_list, const std::shared_ptr<const IDiscreteFunction>& P, const double& dt, const double& cn_coeff, - const double& lambda) -> const std::tuple<std::shared_ptr<const IDiscreteFunction>, - std::shared_ptr<const IDiscreteFunction>> { + const double& lambda) -> const std::shared_ptr<const IDiscreteFunction> { return ScalarHybridSchemeHandler{kappa, f, f_prev, diff --git a/src/scheme/ScalarHybridScheme.cpp b/src/scheme/ScalarHybridScheme.cpp index 187d452b6..f0c4414e9 100644 --- a/src/scheme/ScalarHybridScheme.cpp +++ b/src/scheme/ScalarHybridScheme.cpp @@ -6,8 +6,7 @@ class ScalarHybridSchemeHandler::IScalarHybridScheme { public: - virtual std::tuple<std::shared_ptr<const IDiscreteFunction>, std::shared_ptr<const IDiscreteFunction>> getSolution() - const = 0; + virtual std::shared_ptr<const IDiscreteFunction> getSolution() const = 0; // virtual std::shared_ptr<const IDiscreteFunction> getSolution() const = 0; @@ -24,7 +23,6 @@ class ScalarHybridSchemeHandler::ScalarHybridScheme : public ScalarHybridSchemeH using MeshDataType = MeshData<Dimension>; std::shared_ptr<const DiscreteFunctionP0<Dimension, double>> m_cell_temperature; - std::shared_ptr<const DiscreteFunctionP0<Dimension, double>> m_node_temperature; // std::shared_ptr<const DiscreteFunctionP0<Dimension, double>> m_solution; class DirichletBoundaryCondition @@ -153,10 +151,10 @@ class ScalarHybridSchemeHandler::ScalarHybridScheme : public ScalarHybridSchemeH }; public: - std::tuple<std::shared_ptr<const IDiscreteFunction>, std::shared_ptr<const IDiscreteFunction>> + std::shared_ptr<const IDiscreteFunction> getSolution() const { - return {m_cell_temperature, m_node_temperature}; + return {m_cell_temperature}; } // std::shared_ptr<const IDiscreteFunction> // getSolution() const final @@ -337,11 +335,6 @@ class ScalarHybridSchemeHandler::ScalarHybridScheme : public ScalarHybridSchemeH MeshDataType& mesh_data = MeshDataManager::instance().getMeshData(*mesh); - std::shared_ptr dual_mesh = DualMeshManager::instance().getMedianDualMesh(*mesh); - - std::shared_ptr mapper = - DualConnectivityManager::instance().getPrimalToMedianDualConnectivityDataMapper(mesh->connectivity()); - const NodeValue<const TinyVector<Dimension>>& xr = mesh->xr(); const FaceValue<const TinyVector<Dimension>>& xl = mesh_data.xl(); @@ -1496,23 +1489,13 @@ class ScalarHybridSchemeHandler::ScalarHybridScheme : public ScalarHybridSchemeH return compute_primal_node_temperature; }(); - const CellValue<const double> dual_node_temperature = [=] { - CellValue<double> my_dual_temperature{dual_mesh->connectivity()}; - mapper->toDualCell(primal_node_temperature, my_dual_temperature); - return my_dual_temperature; - }(); - // m_solution = std::make_shared<DiscreteFunctionP0<Dimension, double>>(mesh); m_cell_temperature = std::make_shared<DiscreteFunctionP0<Dimension, double>>(mesh); - m_node_temperature = std::make_shared<DiscreteFunctionP0<Dimension, double>>(dual_mesh); // auto& solution = *m_solution; auto& cell_temperature = *m_cell_temperature; - auto& node_temperature = *m_node_temperature; + parallel_for( mesh->numberOfCells(), PUGS_LAMBDA(CellId cell_id) { cell_temperature[cell_id] = T[cell_id]; }); - parallel_for( - dual_mesh->numberOfCells(), - PUGS_LAMBDA(CellId cell_id) { node_temperature[cell_id] = dual_node_temperature[cell_id]; }); } }; @@ -1521,7 +1504,7 @@ class ScalarHybridSchemeHandler::ScalarHybridScheme : public ScalarHybridSchemeH // { // return m_scheme->getSolution(); // } -std::tuple<std::shared_ptr<const IDiscreteFunction>, std::shared_ptr<const IDiscreteFunction>> +std::shared_ptr<const IDiscreteFunction> ScalarHybridSchemeHandler::solution() const { return m_scheme->getSolution(); @@ -1567,7 +1550,19 @@ ScalarHybridSchemeHandler::ScalarHybridSchemeHandler( break; } case 3: { - throw NormalError("The scheme is not implemented in dimension 3"); + using MeshType = Mesh<Connectivity<3>>; + using DiscreteTensorFunctionType = DiscreteFunctionP0<3, TinyMatrix<3>>; + using DiscreteScalarFunctionType = DiscreteFunctionP0<3, double>; + + std::shared_ptr mesh = std::dynamic_pointer_cast<const MeshType>(i_mesh); + + m_scheme = + std::make_unique<ScalarHybridScheme<3>>(mesh, std::dynamic_pointer_cast<const DiscreteTensorFunctionType>(cell_k), + std::dynamic_pointer_cast<const DiscreteScalarFunctionType>(f), + std::dynamic_pointer_cast<const DiscreteScalarFunctionType>(f_prev), + bc_descriptor_list, bc_prev_descriptor_list, + std::dynamic_pointer_cast<const DiscreteScalarFunctionType>(P), dt, + cn_coeff, lambda); break; } default: { diff --git a/src/scheme/ScalarHybridScheme.hpp b/src/scheme/ScalarHybridScheme.hpp index b110887d7..9de2c37cd 100644 --- a/src/scheme/ScalarHybridScheme.hpp +++ b/src/scheme/ScalarHybridScheme.hpp @@ -40,7 +40,7 @@ class ScalarHybridSchemeHandler std::unique_ptr<IScalarHybridScheme> m_scheme; // std::shared_ptr<const IDiscreteFunction> solution() const; - std::tuple<std::shared_ptr<const IDiscreteFunction>, std::shared_ptr<const IDiscreteFunction>> solution() const; + std::shared_ptr<const IDiscreteFunction> solution() const; ScalarHybridSchemeHandler( const std::shared_ptr<const IDiscreteFunction>& cell_k, -- GitLab