Skip to content
Snippets Groups Projects
Commit 85ed7b57 authored by Dmitri Naumov's avatar Dmitri Naumov
Browse files

Merge branch 'HeatTransportBHE_MassLumping' into 'master'

Enable Mass Lumping in Heat Transport BHE

See merge request ogs/ogs!5121
parents 8baabb1b 6236375f
No related branches found
No related tags found
No related merge requests found
The default setting is false.
If set, mass lumping is applied to the BHE connected soil elements.
With mass lumping, the non-physical oscillation of temperatures in the direct vicinity of the BHE can be improved.
......@@ -176,6 +176,10 @@ std::unique_ptr<Process> createHeatTransportBHEProcess(
//! \ogs_file_param{prj__processes__process__HEAT_TRANSPORT_BHE__use_server_communication}
config.getConfigParameter<bool>("use_server_communication", false);
auto const mass_lumping =
//! \ogs_file_param{prj__processes__process__HEAT_TRANSPORT_BHE__mass_lumping}
config.getConfigParameter<bool>("mass_lumping", false);
auto const using_algebraic_bc =
//! \ogs_file_param{prj__processes__process__HEAT_TRANSPORT_BHE__use_algebraic_bc}
config.getConfigParameter<bool>("use_algebraic_bc", false);
......@@ -331,7 +335,7 @@ std::unique_ptr<Process> createHeatTransportBHEProcess(
HeatTransportBHEProcessData process_data(
std::move(media_map), std::move(bhes), py_object, using_tespy,
using_server_communication,
using_server_communication, mass_lumping,
{using_algebraic_bc, weighting_factor, is_linear});
SecondaryVariableCollection secondary_variables;
......
......@@ -14,6 +14,7 @@
#include "BoundaryConditions/BHEBottomDirichletBoundaryCondition.h"
#include "BoundaryConditions/BHEInflowDirichletBoundaryCondition.h"
#include "MeshLib/MeshSearch/ElementSearch.h"
#include "ProcessLib/BoundaryConditionAndSourceTerm/Python/BHEInflowPythonBoundaryCondition.h"
#include "ProcessLib/HeatTransportBHE/BHE/MeshUtils.h"
#include "ProcessLib/HeatTransportBHE/LocalAssemblers/CreateLocalAssemblers.h"
......@@ -157,6 +158,27 @@ void HeatTransportBHEProcess::initializeConcreteProcess(
// Create BHE boundary conditions for each of the BHEs
createBHEBoundaryConditionTopBottom(_bheMeshData.BHE_nodes);
if (_process_data._mass_lumping)
{
std::vector<std::size_t> const bhes_node_ids =
_bheMeshData.BHE_nodes | ranges::views::join |
ranges::views::transform([](auto const* const node)
{ return node->getID(); }) |
ranges::to<std::vector>;
// all connected soil elements and also the BHE elements.
MeshLib::ElementSearch es{mesh};
es.searchByNodeIDs(bhes_node_ids);
assert(_process_data.mass_lumping_soil_elements.empty());
_process_data.mass_lumping_soil_elements.resize(
mesh.getNumberOfElements(), false);
for (auto const id : es.getSearchedElementIDs())
{
_process_data.mass_lumping_soil_elements[id] = true;
}
}
}
void HeatTransportBHEProcess::assembleConcreteProcess(
......
......@@ -41,12 +41,14 @@ struct HeatTransportBHEProcessData final
nullptr,
const bool use_tespy = false,
const bool use_server_communication = false,
const bool mass_lumping = false,
AlgebraicBCSetting algebraicBCSetting = {false, 100.0, false})
: media_map(media_map_),
_vec_BHE_property(std::move(vec_BHEs_)),
py_bc_object(py_bc_object_),
_use_tespy(use_tespy),
_use_server_communication(use_server_communication),
_mass_lumping(mass_lumping),
_algebraic_BC_Setting(algebraicBCSetting)
{
}
......@@ -64,6 +66,10 @@ struct HeatTransportBHEProcessData final
const bool _use_server_communication;
const bool _mass_lumping;
std::vector<bool> mass_lumping_soil_elements;
AlgebraicBCSetting const _algebraic_BC_Setting;
};
} // namespace ProcessLib::HeatTransportBHE
......@@ -19,6 +19,7 @@
#include "NumLib/Fem/InitShapeMatrices.h"
#include "NumLib/Fem/Interpolation.h"
#include "NumLib/Fem/ShapeMatrixPolicy.h"
#include "ProcessLib/HeatTransportBHE/HeatTransportBHEProcess.h"
#include "ProcessLib/HeatTransportBHE/HeatTransportBHEProcessData.h"
#include "SecondaryData.h"
......@@ -184,11 +185,20 @@ void HeatTransportBHELocalAssemblerSoil<ShapeFunction>::assemble(
density_f * heat_capacity_f * porosity);
}
// debugging
// std::string sep = "\n----------------------------------------\n";
// Eigen::IOFormat CleanFmt(4, 0, ", ", "\n", "[", "]");
// std::cout << local_K.format(CleanFmt) << sep;
// std::cout << local_M.format(CleanFmt) << sep;
if (_process_data._mass_lumping)
{
// only mass lumping at the BHE connected soil elements
if (_process_data.mass_lumping_soil_elements[_element_id])
{
local_M = local_M.colwise().sum().eval().asDiagonal();
}
}
// debugging
// std::string sep = "\n----------------------------------------\n";
// Eigen::IOFormat CleanFmt(4, 0, ", ", "\n", "[", "]");
// std::cout << local_K.format(CleanFmt) << sep;
// std::cout << local_M.format(CleanFmt) << sep;
}
template <typename ShapeFunction>
......
......@@ -124,6 +124,20 @@ AddTest(
beier_sandbox_ts_10_t_600.000000.vtu beier_sandbox_algebraic_bc_ts_10_t_600.000000.vtu temperature_soil temperature_soil 0 5e-10
)
AddTest(
NAME HeatTransportBHE_1U_3D_MassLumping
PATH Parabolic/T/3D_Beier_sandbox
EXECUTABLE ogs
EXECUTABLE_ARGS beier_sandbox_MassLumping.xml
WRAPPER time
TESTER vtkdiff
REQUIREMENTS NOT OGS_USE_MPI
RUNTIME 20
DIFF_DATA
beier_sandbox_ts_10_t_600.000000.vtu beier_sandbox_mass_lumping_ts_10_t_600.000000.vtu temperature_BHE1 temperature_BHE1 0 1e-6
beier_sandbox_ts_10_t_600.000000.vtu beier_sandbox_mass_lumping_ts_10_t_600.000000.vtu temperature_soil temperature_soil 0 1e-4
)
AddTest(
NAME HeatTransportBHE_1U_beier_sandbox_fixed_power_constant_flow
PATH Parabolic/T/3D_Beier_sandbox
......
<?xml version="1.0" encoding="ISO-8859-1"?>
<OpenGeoSysProjectDiff base_file="beier_sandbox.prj">
<add sel="/*/processes/process">
<mass_lumping>true</mass_lumping>
</add>
<replace sel="/*/time_loop/output/prefix/text()">beier_sandbox_mass_lumping</replace>
</OpenGeoSysProjectDiff>
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment