From 33ecbe61b55a25c935cc8d79a47565f091805da0 Mon Sep 17 00:00:00 2001 From: Stephane Del Pino <stephane.delpino44@gmail.com> Date: Fri, 7 Aug 2020 09:14:41 +0200 Subject: [PATCH] Add treatment for given node lists for Dirichlet This is the case of corners for instance --- .../algorithms/HeatDiamondAlgorithm.cpp | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/language/algorithms/HeatDiamondAlgorithm.cpp b/src/language/algorithms/HeatDiamondAlgorithm.cpp index 0a6058e73..04df2737b 100644 --- a/src/language/algorithms/HeatDiamondAlgorithm.cpp +++ b/src/language/algorithms/HeatDiamondAlgorithm.cpp @@ -97,6 +97,35 @@ HeatDiamondScheme<Dimension>::HeatDiamondScheme( boundary_condition_list.push_back(DirichletBoundaryCondition{node_list, value_list}); } } + + if constexpr (Dimension > 1) { + for (size_t i_ref_node_list = 0; + i_ref_node_list < mesh->connectivity().template numberOfRefItemList<ItemType::node>(); ++i_ref_node_list) { + const auto& ref_node_list = mesh->connectivity().template refItemList<ItemType::node>(i_ref_node_list); + const RefId& ref = ref_node_list.refId(); + if (ref == dirichlet_bc_descriptor.boundaryDescriptor()) { + const FunctionSymbolId g_id = dirichlet_bc_descriptor.rhsSymbolId(); + + const auto& node_list = ref_node_list.list(); + + Array<const double> value_list = + InterpolateItemValue<double(TinyVector<Dimension>)>::template interpolate<ItemType::node>(g_id, + mesh->xr(), + node_list); + + for (size_t i_node = 0; i_node < node_list.size(); ++i_node) { + NodeId node_id = node_list[i_node]; + if (not is_dirichlet[node_id]) { + is_dirichlet[node_id] = true; + dirichlet_value[node_id] = value_list[i_node]; + } + } + + boundary_condition_list.push_back(DirichletBoundaryCondition{node_list, value_list}); + } + } + } + break; } case IBoundaryConditionDescriptor::Type::fourier: { -- GitLab