From f040c3f29d9af9cbe1ab50c19c0a25bb121d9516 Mon Sep 17 00:00:00 2001 From: Dmitri Naumov <github@naumov.de> Date: Mon, 29 Mar 2021 21:15:56 +0200 Subject: [PATCH] [PL/DS] Set outer nodes Dirichlet value. --- .../DeactivatedSubdomainDirichlet.cpp | 17 ++++++++++++++++- .../DeactivatedSubdomainDirichlet.h | 3 +++ ProcessLib/ProcessVariable.cpp | 15 +++++++++++---- 3 files changed, 30 insertions(+), 5 deletions(-) diff --git a/ProcessLib/BoundaryCondition/DeactivatedSubdomainDirichlet.cpp b/ProcessLib/BoundaryCondition/DeactivatedSubdomainDirichlet.cpp index cfa16eb3179..2090ec8e7f0 100644 --- a/ProcessLib/BoundaryCondition/DeactivatedSubdomainDirichlet.cpp +++ b/ProcessLib/BoundaryCondition/DeactivatedSubdomainDirichlet.cpp @@ -21,6 +21,7 @@ DeactivatedSubdomainDirichlet::DeactivatedSubdomainDirichlet( std::vector<std::size_t> const* const active_element_ids, MathLib::PiecewiseLinearInterpolation time_interval, ParameterLib::Parameter<double> const& parameter, + bool const set_outer_nodes_dirichlet_values, DeactivatedSubdomainMesh const& subdomain, NumLib::LocalToGlobalIndexMap const& dof_table_bulk, int const variable_id, int const component_id) @@ -29,7 +30,8 @@ DeactivatedSubdomainDirichlet::DeactivatedSubdomainDirichlet( _variable_id(variable_id), _component_id(component_id), _time_interval(std::move(time_interval)), - _active_element_ids(active_element_ids) + _active_element_ids(active_element_ids), + _set_outer_nodes_dirichlet_values(set_outer_nodes_dirichlet_values) { config(dof_table_bulk); } @@ -74,6 +76,19 @@ void DeactivatedSubdomainDirichlet::getEssentialBCValues( end(connected_elements), is_inactive); }); + if (_set_outer_nodes_dirichlet_values) + { + std::copy_if(begin(_subdomain.outer_nodes), end(_subdomain.outer_nodes), + back_inserter(inactive_nodes_in_bc_mesh), + [&](MeshLib::Node* const n) { + const auto& connected_elements = n->getElements(); + + return std::all_of(begin(connected_elements), + end(connected_elements), + is_inactive); + }); + } + auto time_interval_contains = [&](double const t) { return _time_interval.getSupportMin() <= t && t <= _time_interval.getSupportMax(); diff --git a/ProcessLib/BoundaryCondition/DeactivatedSubdomainDirichlet.h b/ProcessLib/BoundaryCondition/DeactivatedSubdomainDirichlet.h index bbdd987f0d5..6b06c6aac66 100644 --- a/ProcessLib/BoundaryCondition/DeactivatedSubdomainDirichlet.h +++ b/ProcessLib/BoundaryCondition/DeactivatedSubdomainDirichlet.h @@ -44,6 +44,7 @@ public: std::vector<std::size_t> const* active_element_ids, MathLib::PiecewiseLinearInterpolation time_interval, ParameterLib::Parameter<double> const& parameter, + bool const set_outer_nodes_dirichlet_values, DeactivatedSubdomainMesh const& subdomain, NumLib::LocalToGlobalIndexMap const& dof_table_bulk, int const variable_id, int const component_id); @@ -66,5 +67,7 @@ private: MathLib::PiecewiseLinearInterpolation const _time_interval; std::vector<std::size_t> const* _active_element_ids = nullptr; + + bool const _set_outer_nodes_dirichlet_values; }; } // namespace ProcessLib diff --git a/ProcessLib/ProcessVariable.cpp b/ProcessLib/ProcessVariable.cpp index 7d48d033c84..745d04a82ad 100644 --- a/ProcessLib/ProcessVariable.cpp +++ b/ProcessLib/ProcessVariable.cpp @@ -241,9 +241,6 @@ void ProcessVariable::createBoundaryConditionsForDeactivatedSubDomains( std::vector<std::unique_ptr<ParameterLib::ParameterBase>> const& parameters, std::vector<std::unique_ptr<BoundaryCondition>>& bcs) { - auto& parameter = ParameterLib::findParameter<double>( - DeactivatedSubdomain::zero_parameter_name, parameters, 1); - for (auto const& deactivated_subdomain : _deactivated_subdomains) { auto const& deactivated_subdomain_meshes = @@ -251,6 +248,15 @@ void ProcessVariable::createBoundaryConditionsForDeactivatedSubDomains( for (auto const& deactivated_subdomain_mesh : deactivated_subdomain_meshes) { + auto const* parameter = &ParameterLib::findParameter<double>( + DeactivatedSubdomain::zero_parameter_name, parameters, 1); + bool const set_outer_nodes_dirichlet_values = + deactivated_subdomain->boundary_value_parameter != nullptr; + if (set_outer_nodes_dirichlet_values) + { + parameter = deactivated_subdomain->boundary_value_parameter; + } + for (int component_id = 0; component_id < dof_table.getNumberOfVariableComponents(variable_id); @@ -258,7 +264,8 @@ void ProcessVariable::createBoundaryConditionsForDeactivatedSubDomains( { auto bc = std::make_unique<DeactivatedSubdomainDirichlet>( &_ids_of_active_elements, - deactivated_subdomain->time_interval, parameter, + deactivated_subdomain->time_interval, *parameter, + set_outer_nodes_dirichlet_values, *deactivated_subdomain_mesh, dof_table, variable_id, component_id); -- GitLab