From 45d2aeb922bcd20ba7c76a85d4998536c0f9ad53 Mon Sep 17 00:00:00 2001 From: labourasse <labourassee@gmail.com> Date: Tue, 22 Dec 2020 10:11:25 +0100 Subject: [PATCH] Add an output frequency and cleaning --- src/language/algorithms/ParabolicHeat.cpp | 22 +++++++++++----- src/language/algorithms/ParabolicHeat.hpp | 3 ++- src/language/modules/SchemeModule.cpp | 11 ++++---- src/scheme/ScalarDiamondScheme.hpp | 32 +++-------------------- 4 files changed, 27 insertions(+), 41 deletions(-) diff --git a/src/language/algorithms/ParabolicHeat.cpp b/src/language/algorithms/ParabolicHeat.cpp index 4a0857bfa..e4527a682 100644 --- a/src/language/algorithms/ParabolicHeat.cpp +++ b/src/language/algorithms/ParabolicHeat.cpp @@ -32,7 +32,8 @@ ParabolicHeatScheme<Dimension>::ParabolicHeatScheme( const FunctionSymbolId& kappa_id, const FunctionSymbolId& f_id, const double& Tf, - const double& dt) + const double& dt, + const double& output_frequency) { using ConnectivityType = Connectivity<Dimension>; using MeshType = Mesh<ConnectivityType>; @@ -45,7 +46,7 @@ ParabolicHeatScheme<Dimension>::ParabolicHeatScheme( return ItemType::node; } }(); - // HERE build CLs, time loop, main outputs + using BoundaryCondition = std::variant<DirichletBoundaryCondition, FourierBoundaryCondition, NeumannBoundaryCondition, SymmetryBoundaryCondition>; @@ -244,7 +245,7 @@ ParabolicHeatScheme<Dimension>::ParabolicHeatScheme( InterpolateItemValue<double(TinyVector<Dimension>)>::template interpolate<ItemType::face>(T_id, mesh_data.xl()); NodeValue<double> Tr(mesh->connectivity()); { - VTKWriter vtk_writer("T_" + std::to_string(Dimension), 0.01); + VTKWriter vtk_writer("Tanalytic_" + std::to_string(Dimension), 0.01); vtk_writer.write(mesh, {NamedItemValue{"Tr", Tr}, NamedItemValue{"temperature", Tj}, @@ -256,12 +257,16 @@ ParabolicHeatScheme<Dimension>::ParabolicHeatScheme( double time = 0; Assert(dt > 0, "The time-step have to be positive!"); const CellValue<const double> primal_Vj = mesh_data.Vj(); + double output_time = 0; do { { - VTKWriter vtk_writer("Temperature_" + std::to_string(Dimension) + std::to_string(time), 0.01); + if (time >= output_time) { + VTKWriter vtk_writer("Temperature_" + std::to_string(Dimension) + "_time_" + std::to_string(time), 0.01); - vtk_writer.write(mesh, {NamedItemValue{"T", Temperature}, NamedItemValue{"Vj", primal_Vj}}, 0, - true); // forces last output + vtk_writer.write(mesh, {NamedItemValue{"T", Temperature}, NamedItemValue{"Vj", primal_Vj}}, 0, + true); // forces last output + output_time += output_frequency; + } } double deltat = std::min(dt, Tf - time); std::cout << "Current time = " << time << " time-step = " << deltat << " final time = " << Tf << "\n"; @@ -311,7 +316,7 @@ ParabolicHeatScheme<Dimension>::ParabolicHeatScheme( std::cout << "||Error||_2 (total)= " << std::sqrt((error, error)) + std::sqrt((face_error, face_error)) << "\n"; { - VTKWriter vtk_writer("Temperature_" + std::to_string(Dimension), 0.01); + VTKWriter vtk_writer("Temperature_" + std::to_string(Dimension) + "_final", 0.01); vtk_writer.write(mesh, {NamedItemValue{"T", Temperature}, NamedItemValue{"Vj", primal_Vj}, @@ -449,6 +454,7 @@ template ParabolicHeatScheme<1>::ParabolicHeatScheme( const FunctionSymbolId&, const FunctionSymbolId&, const double&, + const double&, const double&); template ParabolicHeatScheme<2>::ParabolicHeatScheme( @@ -458,6 +464,7 @@ template ParabolicHeatScheme<2>::ParabolicHeatScheme( const FunctionSymbolId&, const FunctionSymbolId&, const double&, + const double&, const double&); template ParabolicHeatScheme<3>::ParabolicHeatScheme( @@ -467,4 +474,5 @@ template ParabolicHeatScheme<3>::ParabolicHeatScheme( const FunctionSymbolId&, const FunctionSymbolId&, const double&, + const double&, const double&); diff --git a/src/language/algorithms/ParabolicHeat.hpp b/src/language/algorithms/ParabolicHeat.hpp index 92df71a53..b5a2db881 100644 --- a/src/language/algorithms/ParabolicHeat.hpp +++ b/src/language/algorithms/ParabolicHeat.hpp @@ -25,7 +25,8 @@ class ParabolicHeatScheme const FunctionSymbolId& kappa_id, const FunctionSymbolId& f_id, const double& final_time, - const double& dt); + const double& dt, + const double&); }; #endif // HEAT_DIAMOND_ALGORITHM_HPP diff --git a/src/language/modules/SchemeModule.cpp b/src/language/modules/SchemeModule.cpp index ef8474bf3..e32f667e7 100644 --- a/src/language/modules/SchemeModule.cpp +++ b/src/language/modules/SchemeModule.cpp @@ -267,27 +267,28 @@ SchemeModule::SchemeModule() void(std::shared_ptr<const IMesh>, const std::vector<std::shared_ptr<const IBoundaryConditionDescriptor>>&, const FunctionSymbolId&, const FunctionSymbolId&, const FunctionSymbolId&, - const double&, const double&)>>( + const double&, const double&, const double&)>>( [](std::shared_ptr<const IMesh> p_mesh, const std::vector<std::shared_ptr<const IBoundaryConditionDescriptor>>& bc_descriptor_list, const FunctionSymbolId& T_id, const FunctionSymbolId& kappa_id, - const FunctionSymbolId& f_id, const double& final_time, const double& dt) -> void { + const FunctionSymbolId& f_id, const double& final_time, const double& dt, + const double& output_frequency) -> void { switch (p_mesh->dimension()) { case 1: { ParabolicHeatScheme<1>{p_mesh, bc_descriptor_list, T_id, kappa_id, - f_id, final_time, dt}; + f_id, final_time, dt, output_frequency}; break; } case 2: { ParabolicHeatScheme<2>{p_mesh, bc_descriptor_list, T_id, kappa_id, - f_id, final_time, dt}; + f_id, final_time, dt, output_frequency}; break; } case 3: { ParabolicHeatScheme<3>{p_mesh, bc_descriptor_list, T_id, kappa_id, - f_id, final_time, dt}; + f_id, final_time, dt, output_frequency}; break; } default: { diff --git a/src/scheme/ScalarDiamondScheme.hpp b/src/scheme/ScalarDiamondScheme.hpp index 87e3ae320..7259c8442 100644 --- a/src/scheme/ScalarDiamondScheme.hpp +++ b/src/scheme/ScalarDiamondScheme.hpp @@ -15,7 +15,6 @@ #include <mesh/MeshDataManager.hpp> #include <mesh/MeshNodeBoundary.hpp> #include <mesh/SubItemValuePerItem.hpp> -#include <output/VTKWriter.hpp> #include <scheme/DirichletBoundaryConditionDescriptor.hpp> #include <scheme/FourierBoundaryConditionDescriptor.hpp> #include <scheme/NeumannBoundaryConditionDescriptor.hpp> @@ -139,11 +138,6 @@ class ScalarDiamondScheme ~SymmetryBoundaryCondition() = default; }; - // class DirichletBoundaryCondition; - // class FourierBoundaryCondition; - // class NeumannBoundaryCondition; - // class SymmetryBoundaryCondition; - public: ScalarDiamondScheme(std::shared_ptr<const IMesh> i_mesh, const std::vector<std::shared_ptr<const IBoundaryConditionDescriptor>>& bc_descriptor_list, @@ -173,7 +167,6 @@ class ScalarDiamondScheme BoundaryConditionList boundary_condition_list; - std::cout << "number of bc descr = " << bc_descriptor_list.size() << '\n'; std::shared_ptr mesh = std::dynamic_pointer_cast<const MeshType>(i_mesh); for (const auto& bc_descriptor : bc_descriptor_list) { @@ -457,13 +450,6 @@ class ScalarDiamondScheme diamond_mesh_data .xj()); - VTKWriter vtk_writer("D_" + std::to_string(Dimension), 0.01); - - vtk_writer.write(diamond_mesh, - {NamedItemValue{"kappaj", dual_kappaj}, NamedItemValue{"coords", diamond_mesh->xr()}, - NamedItemValue{"Vj", diamond_mesh_data.Vj()}, NamedItemValue{"xj", diamond_mesh_data.xj()}}, - 0, true); // forces last output - const CellValue<const double> dual_Vj = diamond_mesh_data.Vj(); const FaceValue<const double> mes_l = [&] { @@ -574,27 +560,18 @@ class ScalarDiamondScheme FaceValue<double> computed_alpha_l{mesh->connectivity()}; mapper->fromDualCell(alpha_j, computed_alpha_l); - VTKWriter vtk_writer("DD_" + std::to_string(Dimension), 0.01); - - vtk_writer.write(diamond_mesh, - {NamedItemValue{"alphaj", alpha_j}, NamedItemValue{"xj", diamond_mesh_data.xj()}, - NamedItemValue{"Vl", diamond_mesh_data.Vj()}, NamedItemValue{"|l|", dual_mes_l_j}}, - 0, - true); // forces last output - return computed_alpha_l; }(); double lambda = (Tf == 0) ? 0 : 1; double time_factor = (lambda == 0) ? 1 : dt; - std::cout << " lambda = " << lambda << " time_factor =" << time_factor << "\n"; + const CellValue<const double> primal_Vj = mesh_data.Vj(); SparseMatrixDescriptor S{number_of_dof}; for (FaceId face_id = 0; face_id < mesh->numberOfFaces(); ++face_id) { const auto& primal_face_to_cell = face_to_cell_matrix[face_id]; - // const double beta_l = 1. / Dimension * alpha_l[face_id] * mes_l[face_id]; - const double beta_l = l2Norm(dualClj[face_id]) * alpha_l[face_id] * mes_l[face_id]; + const double beta_l = l2Norm(dualClj[face_id]) * alpha_l[face_id] * mes_l[face_id]; for (size_t i_cell = 0; i_cell < primal_face_to_cell.size(); ++i_cell) { const CellId cell_id1 = primal_face_to_cell[i_cell]; for (size_t j_cell = 0; j_cell < primal_face_to_cell.size(); ++j_cell) { @@ -693,7 +670,7 @@ class ScalarDiamondScheme const auto& value_list = bc.valueList(); for (size_t i_face = 0; i_face < face_list.size(); ++i_face) { const FaceId face_id = face_list[i_face]; - b[face_dof_number[face_id]] += value_list[i_face]; // sign + b[face_dof_number[face_id]] += value_list[i_face]; } } }, @@ -711,8 +688,7 @@ class ScalarDiamondScheme const auto& value_list = bc.valueList(); for (size_t i_face = 0; i_face < face_list.size(); ++i_face) { FaceId face_id = face_list[i_face]; - b[face_dof_number[face_id]] += - mes_l[face_id] * value_list[i_face]; // + lambda * Temperature_face[face_id]); // sign + b[face_dof_number[face_id]] += mes_l[face_id] * value_list[i_face]; } } }, -- GitLab