diff --git a/ProcessLib/BoundaryCondition/DeactivatedSubdomainDirichlet.cpp b/ProcessLib/BoundaryCondition/DeactivatedSubdomainDirichlet.cpp index cfa16eb3179d09f08f9f7ba9e081eb864e62f489..2090ec8e7f0b24e5067f9fb589253f4ba8bed1c1 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 bbdd987f0d50b63020e2357569e6e2b2e49570d5..6b06c6aac666801d146a8495fba2bde62658d14c 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 7d48d033c841e71947222897bcc7ded31a77e69b..745d04a82ad6165d3e5c5645ff2307a321ff80ed 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);