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