Skip to content
Snippets Groups Projects
Commit f38904e3 authored by Stéphane Del Pino's avatar Stéphane Del Pino
Browse files

Fix MeshData and MeshDataManager

MeshData constructor can now only be called by MeshDataManager! This
ensures only one construction of the data storage for each mesh

Also fix following issues
- volume calculation and checking was dangerously nested
- few iterators were poorly named (due to copy/paste in MeshDataManager)
parent 3b3c19da
No related branches found
No related tags found
1 merge request!39Issue/mesh data
...@@ -116,7 +116,7 @@ struct GlaceScheme ...@@ -116,7 +116,7 @@ struct GlaceScheme
UnknownsType unknowns(*m_mesh); UnknownsType unknowns(*m_mesh);
{ {
MeshDataType mesh_data(*m_mesh); MeshDataType& mesh_data = MeshDataManager::instance().getMeshData(*m_mesh);
unknowns.rhoj() = unknowns.rhoj() =
InterpolateItemValue<double(TinyVector<Dimension>)>::template interpolate<ItemType::cell>(rho_id, InterpolateItemValue<double(TinyVector<Dimension>)>::template interpolate<ItemType::cell>(rho_id,
...@@ -152,7 +152,7 @@ struct GlaceScheme ...@@ -152,7 +152,7 @@ struct GlaceScheme
block_eos.updateEandCFromRhoP(); block_eos.updateEandCFromRhoP();
{ {
MeshDataType mesh_data(*m_mesh); MeshDataType& mesh_data = MeshDataManager::instance().getMeshData(*m_mesh);
const CellValue<const double> Vj = mesh_data.Vj(); const CellValue<const double> Vj = mesh_data.Vj();
...@@ -169,7 +169,7 @@ struct GlaceScheme ...@@ -169,7 +169,7 @@ struct GlaceScheme
VTKWriter vtk_writer("mesh_" + std::to_string(Dimension), 0.01); VTKWriter vtk_writer("mesh_" + std::to_string(Dimension), 0.01);
while ((t < tmax) and (iteration < itermax)) { while ((t < tmax) and (iteration < itermax)) {
MeshDataType mesh_data(*m_mesh); MeshDataType& mesh_data = MeshDataManager::instance().getMeshData(*m_mesh);
vtk_writer.write(m_mesh, vtk_writer.write(m_mesh,
{NamedItemValue{"density", rhoj}, NamedItemValue{"velocity", unknowns.uj()}, {NamedItemValue{"density", rhoj}, NamedItemValue{"velocity", unknowns.uj()},
...@@ -198,7 +198,7 @@ struct GlaceScheme ...@@ -198,7 +198,7 @@ struct GlaceScheme
<< rang::fgB::cyan << iteration << rang::style::reset << rang::style::bold << " iterations" << rang::fgB::cyan << iteration << rang::style::reset << rang::style::bold << " iterations"
<< rang::style::reset << '\n'; << rang::style::reset << '\n';
{ {
MeshDataType mesh_data(*m_mesh); MeshDataType& mesh_data = MeshDataManager::instance().getMeshData(*m_mesh);
vtk_writer.write(m_mesh, vtk_writer.write(m_mesh,
{NamedItemValue{"density", rhoj}, NamedItemValue{"velocity", unknowns.uj()}, {NamedItemValue{"density", rhoj}, NamedItemValue{"velocity", unknowns.uj()},
......
...@@ -73,7 +73,6 @@ class MeshData : public IMeshData ...@@ -73,7 +73,6 @@ class MeshData : public IMeshData
}); });
m_xj = std::make_shared<CellValue<const Rd>>(xj); m_xj = std::make_shared<CellValue<const Rd>>(xj);
} }
std::cout << "- computed xj for mesh " << &m_mesh << '\n';
} }
PUGS_INLINE PUGS_INLINE
...@@ -97,8 +96,6 @@ class MeshData : public IMeshData ...@@ -97,8 +96,6 @@ class MeshData : public IMeshData
Vj[j] = inv_Dimension * sum_cjr_xr; Vj[j] = inv_Dimension * sum_cjr_xr;
}); });
m_Vj = std::make_shared<CellValue<const double>>(Vj); m_Vj = std::make_shared<CellValue<const double>>(Vj);
std::cout << "- computed Vj for mesh " << &m_mesh << '\n';
} }
PUGS_INLINE PUGS_INLINE
...@@ -275,7 +272,8 @@ class MeshData : public IMeshData ...@@ -275,7 +272,8 @@ class MeshData : public IMeshData
void void
_checkCellVolume() _checkCellVolume()
{ {
auto Vj = this->Vj(); Assert(m_Vj);
auto& Vj = *m_Vj;
bool is_valid = [&] { bool is_valid = [&] {
for (CellId j = 0; j < m_mesh.numberOfCells(); ++j) { for (CellId j = 0; j < m_mesh.numberOfCells(); ++j) {
...@@ -360,17 +358,18 @@ class MeshData : public IMeshData ...@@ -360,17 +358,18 @@ class MeshData : public IMeshData
return *m_Vj; return *m_Vj;
} }
private:
// MeshData **must** be constructed through MeshDataManager
friend class MeshDataManager;
MeshData(const MeshType& mesh) : m_mesh(mesh) {} MeshData(const MeshType& mesh) : m_mesh(mesh) {}
public:
MeshData() = delete; MeshData() = delete;
MeshData(const MeshData&) = default; MeshData(const MeshData&) = delete;
MeshData(MeshData&&) = default; MeshData(MeshData&&) = delete;
~MeshData() ~MeshData() {}
{
;
}
}; };
#endif // MESH_DATA_HPP #endif // MESH_DATA_HPP
...@@ -25,8 +25,8 @@ MeshDataManager::destroy() ...@@ -25,8 +25,8 @@ MeshDataManager::destroy()
if (m_instance->m_mesh_mesh_data_map.size() > 0) { if (m_instance->m_mesh_mesh_data_map.size() > 0) {
std::stringstream error; std::stringstream error;
error << ": some mesh data is still registered\n"; error << ": some mesh data is still registered\n";
for (const auto& i_connectivity_synchronizer : m_instance->m_mesh_mesh_data_map) { for (const auto& i_mesh_data : m_instance->m_mesh_mesh_data_map) {
error << " - mesh data " << rang::fgB::magenta << i_connectivity_synchronizer.first << rang::style::reset << '\n'; error << " - mesh data " << rang::fgB::magenta << i_mesh_data.first << rang::style::reset << '\n';
} }
throw UnexpectedError(error.str()); throw UnexpectedError(error.str());
} }
...@@ -46,11 +46,12 @@ MeshDataManager::getMeshData(const Mesh<Connectivity<Dimension>>& mesh) ...@@ -46,11 +46,12 @@ MeshDataManager::getMeshData(const Mesh<Connectivity<Dimension>>& mesh)
{ {
const IMesh* p_mesh = &mesh; const IMesh* p_mesh = &mesh;
if (auto connectivity_synchronizer = m_mesh_mesh_data_map.find(p_mesh); if (auto i_mesh_data = m_mesh_mesh_data_map.find(p_mesh); i_mesh_data != m_mesh_mesh_data_map.end()) {
connectivity_synchronizer != m_mesh_mesh_data_map.end()) { return dynamic_cast<MeshData<Dimension>&>(*i_mesh_data->second);
return dynamic_cast<MeshData<Dimension>&>(*connectivity_synchronizer->second);
} else { } 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; m_mesh_mesh_data_map[p_mesh] = mesh_data;
return *mesh_data; return *mesh_data;
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment