diff --git a/ProcessLib/BoundaryCondition/GenericNaturalBoundaryConditionLocalAssembler.h b/ProcessLib/BoundaryCondition/GenericNaturalBoundaryConditionLocalAssembler.h index 7247be1bc1585493954e3fc5a5589d2e9d5d3a4b..e0c086be69b49f61b365eddc79b4a278fad46705 100644 --- a/ProcessLib/BoundaryCondition/GenericNaturalBoundaryConditionLocalAssembler.h +++ b/ProcessLib/BoundaryCondition/GenericNaturalBoundaryConditionLocalAssembler.h @@ -9,6 +9,7 @@ #pragma once +#include "MeshLib/Elements/Element.h" #include "NumLib/DOF/LocalToGlobalIndexMap.h" #include "NumLib/Fem/ShapeMatrixPolicy.h" #include "ProcessLib/Utils/InitShapeMatrices.h" @@ -44,7 +45,8 @@ public: : _integration_method(integration_order), _shape_matrices(initShapeMatrices<ShapeFunction, ShapeMatricesType, IntegrationMethod, GlobalDim>( - e, is_axially_symmetric, _integration_method)) + e, is_axially_symmetric, _integration_method)), + _element(e) { } @@ -54,6 +56,7 @@ protected: Eigen::aligned_allocator< typename ShapeMatricesType::ShapeMatrices>> const _shape_matrices; + MeshLib::Element const& _element; }; } // namespace ProcessLib diff --git a/ProcessLib/BoundaryCondition/NeumannBoundaryConditionLocalAssembler.h b/ProcessLib/BoundaryCondition/NeumannBoundaryConditionLocalAssembler.h index 0683ed93eafe8ada9f3c9e4b11caa63404596de9..23f74a4c4e70fb9870392f11e9fc07fce3d563cd 100644 --- a/ProcessLib/BoundaryCondition/NeumannBoundaryConditionLocalAssembler.h +++ b/ProcessLib/BoundaryCondition/NeumannBoundaryConditionLocalAssembler.h @@ -11,7 +11,9 @@ #include "GenericNaturalBoundaryConditionLocalAssembler.h" #include "NumLib/DOF/DOFTableUtil.h" +#include "NumLib/Fem/ShapeMatrixPolicy.h" #include "ProcessLib/Parameter/Parameter.h" +#include "ProcessLib/Utils/InitShapeMatrices.h" namespace ProcessLib { @@ -23,6 +25,7 @@ class NeumannBoundaryConditionLocalAssembler final { using Base = GenericNaturalBoundaryConditionLocalAssembler< ShapeFunction, IntegrationMethod, GlobalDim>; + using ShapeMatricesType = ShapeMatrixPolicyType<ShapeFunction, GlobalDim>; public: /// The neumann_bc_value factor is directly integrated into the local @@ -53,11 +56,20 @@ public: SpatialPosition pos; pos.setElementID(id); + using FemType = + NumLib::TemplateIsoparametric<ShapeFunction, ShapeMatricesType>; + FemType fe( + static_cast<const typename ShapeFunction::MeshElement&>(Base::_element)); + for (unsigned ip = 0; ip < n_integration_points; ip++) { pos.setIntegrationPoint(ip); auto const& sm = Base::_shape_matrices[ip]; auto const& wp = Base::_integration_method.getWeightedPoint(ip); + + MathLib::TemplatePoint<double, 3> coords_ip(fe.interpolateCoordinates(sm.N)); + pos.setCoordinates(coords_ip); + _local_rhs.noalias() += sm.N * _neumann_bc_parameter(t, pos)[0] * sm.detJ * wp.getWeight() * sm.integralMeasure;