diff --git a/ProcessLib/BoundaryCondition/DeactivatedSubdomainDirichlet.cpp b/ProcessLib/BoundaryCondition/DeactivatedSubdomainDirichlet.cpp index 1fcf4942d99640e55e75b50c95a86f8fbd595216..3a6a0e20b23909aa0beff840152028d9fe41f7f4 100644 --- a/ProcessLib/BoundaryCondition/DeactivatedSubdomainDirichlet.cpp +++ b/ProcessLib/BoundaryCondition/DeactivatedSubdomainDirichlet.cpp @@ -20,6 +20,7 @@ namespace ProcessLib { DeactivatedSubdomainDirichlet::DeactivatedSubdomainDirichlet( + std::vector<std::size_t> const* const active_element_ids, BaseLib::TimeInterval const& time_interval, ParameterLib::Parameter<double> const& parameter, DeactivatedSubdomainMesh const& subdomain, @@ -29,7 +30,8 @@ DeactivatedSubdomainDirichlet::DeactivatedSubdomainDirichlet( _subdomain(subdomain), _variable_id(variable_id), _component_id(component_id), - _time_interval(time_interval) + _time_interval(time_interval), + _active_element_ids(active_element_ids) { config(dof_table_bulk); } @@ -53,10 +55,30 @@ void DeactivatedSubdomainDirichlet::getEssentialBCValues( const double t, GlobalVector const& x, NumLib::IndexValueVector<GlobalIndexType>& bc_values) const { + auto const& bulk_element_ids = + *_subdomain.mesh->getProperties() + .template getPropertyVector<std::size_t>( + "bulk_element_ids", MeshLib::MeshItemType::Cell, 1); + + auto is_inactive = [&](MeshLib::Element const* const e) { + return none_of( + begin(*_active_element_ids), end(*_active_element_ids), + [&](auto const id) { return id == bulk_element_ids[e->getID()]; }); + }; + + std::vector<MeshLib::Node*> inactive_nodes_in_bc_mesh; + std::copy_if(begin(_subdomain.inner_nodes), end(_subdomain.inner_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); + }); if (_time_interval.contains(t)) { getEssentialBCValuesLocal(_parameter, *_subdomain.mesh, - _subdomain.inner_nodes, *_dof_table_boundary, + inactive_nodes_in_bc_mesh, *_dof_table_boundary, _variable_id, _component_id, t, x, bc_values); return; } diff --git a/ProcessLib/BoundaryCondition/DeactivatedSubdomainDirichlet.h b/ProcessLib/BoundaryCondition/DeactivatedSubdomainDirichlet.h index 7166e05e56f76853f70e3e4034546c3b08ffcc06..cadfba543ada14510b674c2581da5fc0bde4aa3f 100644 --- a/ProcessLib/BoundaryCondition/DeactivatedSubdomainDirichlet.h +++ b/ProcessLib/BoundaryCondition/DeactivatedSubdomainDirichlet.h @@ -41,6 +41,7 @@ class DeactivatedSubdomainDirichlet final : public BoundaryCondition { public: DeactivatedSubdomainDirichlet( + std::vector<std::size_t> const* active_element_ids, BaseLib::TimeInterval const& time_interval, ParameterLib::Parameter<double> const& parameter, DeactivatedSubdomainMesh const& subdomain, @@ -64,5 +65,6 @@ private: int const _component_id; BaseLib::TimeInterval const _time_interval; + std::vector<std::size_t> const* _active_element_ids = nullptr; }; } // namespace ProcessLib diff --git a/ProcessLib/ProcessVariable.cpp b/ProcessLib/ProcessVariable.cpp index 9d7e8b53a21fe49288a9ec651b1783d9abb184b7..310d9937d4f8d7abfad8fc3f919877d39769ec52 100644 --- a/ProcessLib/ProcessVariable.cpp +++ b/ProcessLib/ProcessVariable.cpp @@ -253,6 +253,7 @@ void ProcessVariable::createBoundaryConditionsForDeactivatedSubDomains( component_id++) { auto bc = std::make_unique<DeactivatedSubdomainDirichlet>( + &_ids_of_active_elements, deactivated_subdomain->time_interval, parameter, *deactivated_subdomain_mesh, dof_table, variable_id, component_id);