diff --git a/src/language/modules/SchemeModule.cpp b/src/language/modules/SchemeModule.cpp index 86a0f706642af7b5f4c5a63e5d7e38b546a69f57..c04f29ad41df122df252cdc9e7009b49241e8ed2 100644 --- a/src/language/modules/SchemeModule.cpp +++ b/src/language/modules/SchemeModule.cpp @@ -116,7 +116,7 @@ struct GlaceScheme UnknownsType unknowns(*m_mesh); { - MeshDataType mesh_data(*m_mesh); + MeshDataType& mesh_data = MeshDataManager::instance().getMeshData(*m_mesh); unknowns.rhoj() = InterpolateItemValue<double(TinyVector<Dimension>)>::template interpolate<ItemType::cell>(rho_id, @@ -152,7 +152,7 @@ struct GlaceScheme block_eos.updateEandCFromRhoP(); { - MeshDataType mesh_data(*m_mesh); + MeshDataType& mesh_data = MeshDataManager::instance().getMeshData(*m_mesh); const CellValue<const double> Vj = mesh_data.Vj(); @@ -169,7 +169,7 @@ struct GlaceScheme VTKWriter vtk_writer("mesh_" + std::to_string(Dimension), 0.01); while ((t < tmax) and (iteration < itermax)) { - MeshDataType mesh_data(*m_mesh); + MeshDataType& mesh_data = MeshDataManager::instance().getMeshData(*m_mesh); vtk_writer.write(m_mesh, {NamedItemValue{"density", rhoj}, NamedItemValue{"velocity", unknowns.uj()}, @@ -198,7 +198,7 @@ struct GlaceScheme << rang::fgB::cyan << iteration << rang::style::reset << rang::style::bold << " iterations" << rang::style::reset << '\n'; { - MeshDataType mesh_data(*m_mesh); + MeshDataType& mesh_data = MeshDataManager::instance().getMeshData(*m_mesh); vtk_writer.write(m_mesh, {NamedItemValue{"density", rhoj}, NamedItemValue{"velocity", unknowns.uj()}, diff --git a/src/mesh/MeshData.hpp b/src/mesh/MeshData.hpp index b924ae30221150228d4b5a105cb372213f4fc771..86e78f5f7fde25656882535258f6fb3779855d01 100644 --- a/src/mesh/MeshData.hpp +++ b/src/mesh/MeshData.hpp @@ -73,7 +73,6 @@ class MeshData : public IMeshData }); m_xj = std::make_shared<CellValue<const Rd>>(xj); } - std::cout << "- computed xj for mesh " << &m_mesh << '\n'; } PUGS_INLINE @@ -97,8 +96,6 @@ class MeshData : public IMeshData Vj[j] = inv_Dimension * sum_cjr_xr; }); m_Vj = std::make_shared<CellValue<const double>>(Vj); - - std::cout << "- computed Vj for mesh " << &m_mesh << '\n'; } PUGS_INLINE @@ -275,7 +272,8 @@ class MeshData : public IMeshData void _checkCellVolume() { - auto Vj = this->Vj(); + Assert(m_Vj); + auto& Vj = *m_Vj; bool is_valid = [&] { for (CellId j = 0; j < m_mesh.numberOfCells(); ++j) { @@ -360,17 +358,18 @@ class MeshData : public IMeshData return *m_Vj; } + private: + // MeshData **must** be constructed through MeshDataManager + friend class MeshDataManager; MeshData(const MeshType& mesh) : m_mesh(mesh) {} + public: MeshData() = delete; - MeshData(const MeshData&) = default; - MeshData(MeshData&&) = default; + MeshData(const MeshData&) = delete; + MeshData(MeshData&&) = delete; - ~MeshData() - { - ; - } + ~MeshData() {} }; #endif // MESH_DATA_HPP diff --git a/src/mesh/MeshDataManager.cpp b/src/mesh/MeshDataManager.cpp index ae77ee8255f62447f8d49cd8f9a85a7aec6ddd10..281e7517aa704e6c4352769e88f854b86cbc7366 100644 --- a/src/mesh/MeshDataManager.cpp +++ b/src/mesh/MeshDataManager.cpp @@ -25,8 +25,8 @@ MeshDataManager::destroy() if (m_instance->m_mesh_mesh_data_map.size() > 0) { std::stringstream error; error << ": some mesh data is still registered\n"; - for (const auto& i_connectivity_synchronizer : m_instance->m_mesh_mesh_data_map) { - error << " - mesh data " << rang::fgB::magenta << i_connectivity_synchronizer.first << rang::style::reset << '\n'; + for (const auto& i_mesh_data : m_instance->m_mesh_mesh_data_map) { + error << " - mesh data " << rang::fgB::magenta << i_mesh_data.first << rang::style::reset << '\n'; } throw UnexpectedError(error.str()); } @@ -46,11 +46,12 @@ MeshDataManager::getMeshData(const Mesh<Connectivity<Dimension>>& mesh) { const IMesh* p_mesh = &mesh; - if (auto connectivity_synchronizer = m_mesh_mesh_data_map.find(p_mesh); - connectivity_synchronizer != m_mesh_mesh_data_map.end()) { - return dynamic_cast<MeshData<Dimension>&>(*connectivity_synchronizer->second); + if (auto i_mesh_data = m_mesh_mesh_data_map.find(p_mesh); i_mesh_data != m_mesh_mesh_data_map.end()) { + return dynamic_cast<MeshData<Dimension>&>(*i_mesh_data->second); } else { - std::shared_ptr mesh_data = std::make_shared<MeshData<Dimension>>(mesh); + // **cannot** use make_shared since MeshData constructor is **private** + std::shared_ptr<MeshData<Dimension>> mesh_data{new MeshData<Dimension>(mesh)}; + m_mesh_mesh_data_map[p_mesh] = mesh_data; return *mesh_data; }