diff --git a/ProcessLib/BoundaryCondition/UniformNeumannBoundaryCondition.cpp b/ProcessLib/BoundaryCondition/UniformNeumannBoundaryCondition.cpp index 7217de499329c5d9257fec0332ea8ba13dcf64fe..7d85001af525317e243e890564e250fe27993c0e 100644 --- a/ProcessLib/BoundaryCondition/UniformNeumannBoundaryCondition.cpp +++ b/ProcessLib/BoundaryCondition/UniformNeumannBoundaryCondition.cpp @@ -8,6 +8,7 @@ */ #include "UniformNeumannBoundaryCondition.h" +#include "ProcessLib/Utils/ProcessUtils.h" namespace ProcessLib { @@ -17,20 +18,23 @@ createUniformNeumannBoundaryCondition( std::vector<MeshLib::Element*>&& elements, NumLib::LocalToGlobalIndexMap const& dof_table, int const variable_id, int const component_id, unsigned const integration_order, - unsigned const global_dim) + unsigned const global_dim, + std::vector<std::unique_ptr<ParameterBase>> const& parameters) { DBUG("Constructing NeumannBcConfig from config."); //! \ogs_file_param{boundary_condition__type} config.checkConfigParameter("type", "UniformNeumann"); - //! \ogs_file_param{boundary_condition__UniformNeumann__value} - double const value = config.getConfigParameter<double>("value"); - DBUG("Using value %g", value); + //! \ogs_file_param{boundary_condition__UniformNeumann__parameter} + auto const param_name = config.getConfigParameter<std::string>("parameter"); + DBUG("Using parameter %g", param_name); + + auto& param = findParameter<double>(param_name, parameters, 1); return std::unique_ptr<UniformNeumannBoundaryCondition>( new UniformNeumannBoundaryCondition( integration_order, dof_table, variable_id, component_id, - global_dim, std::move(elements), value)); + global_dim, std::move(elements), param)); } } // ProcessLib diff --git a/ProcessLib/BoundaryCondition/UniformNeumannBoundaryCondition.h b/ProcessLib/BoundaryCondition/UniformNeumannBoundaryCondition.h index 1504b0768d50e4dec551326a07f01af436991fc0..312d438b9f6f5fb7955cf72b29ef2be3b40f7f1b 100644 --- a/ProcessLib/BoundaryCondition/UniformNeumannBoundaryCondition.h +++ b/ProcessLib/BoundaryCondition/UniformNeumannBoundaryCondition.h @@ -10,13 +10,14 @@ #ifndef PROCESSLIB_UNIFORMNEUMANNBOUNDARYCONDITION_H #define PROCESSLIB_UNIFORMNEUMANNBOUNDARYCONDITION_H +#include "ProcessLib/Parameter/Parameter.h" #include "GenericNaturalBoundaryCondition.h" #include "UniformNeumannBoundaryConditionLocalAssembler.h" namespace ProcessLib { using UniformNeumannBoundaryCondition = GenericNaturalBoundaryCondition< - double, UniformNeumannBoundaryConditionLocalAssembler>; + Parameter<double> const&, UniformNeumannBoundaryConditionLocalAssembler>; std::unique_ptr<UniformNeumannBoundaryCondition> createUniformNeumannBoundaryCondition( @@ -24,7 +25,8 @@ createUniformNeumannBoundaryCondition( std::vector<MeshLib::Element*>&& elements, NumLib::LocalToGlobalIndexMap const& dof_table, int const variable_id, int const component_id, unsigned const integration_order, - unsigned const global_dim); + unsigned const global_dim, + std::vector<std::unique_ptr<ParameterBase>> const& parameters); } // ProcessLib diff --git a/ProcessLib/BoundaryCondition/UniformNeumannBoundaryConditionLocalAssembler.h b/ProcessLib/BoundaryCondition/UniformNeumannBoundaryConditionLocalAssembler.h index 2256c5d448567fffb3163a436f1b4ae7fae6b2cb..7b254d78ad3a1cd0a877358bc1e3aea4eb6c45bf 100644 --- a/ProcessLib/BoundaryCondition/UniformNeumannBoundaryConditionLocalAssembler.h +++ b/ProcessLib/BoundaryCondition/UniformNeumannBoundaryConditionLocalAssembler.h @@ -11,6 +11,8 @@ #define PROCESSLIB_UNIFORMNEUMANNBOUNDARYCONDITIONLOCALASSEMBLER_H #include "NumLib/DOF/DOFTableUtil.h" +#include "ProcessLib/Parameter/Parameter.h" +#include "GenericNaturalBoundaryConditionLocalAssembler.h" namespace ProcessLib { @@ -30,7 +32,7 @@ public: MeshLib::Element const& e, std::size_t const local_matrix_size, unsigned const integration_order, - double neumann_bc_value) + Parameter<double> const& neumann_bc_value) : Base(e, integration_order), _neumann_bc_value(neumann_bc_value), _local_rhs(local_matrix_size) @@ -42,19 +44,23 @@ public: double const t, const GlobalVector& /*x*/, GlobalMatrix& /*K*/, GlobalVector& b) override { - (void)t; // TODO time-dependent Neumann BCs - _local_rhs.setZero(); IntegrationMethod integration_method(Base::_integration_order); std::size_t const n_integration_points = integration_method.getNumberOfPoints(); - for (std::size_t ip(0); ip < n_integration_points; ip++) { + SpatialPosition pos; + pos.setElementID(id); + + for (std::size_t ip(0); ip < n_integration_points; ip++) + { + pos.setIntegrationPoint(ip); auto const& sm = Base::_shape_matrices[ip]; auto const& wp = integration_method.getWeightedPoint(ip); - _local_rhs.noalias() += - sm.N * _neumann_bc_value * sm.detJ * wp.getWeight(); + _local_rhs.noalias() += sm.N * + _neumann_bc_value.getTuple(t, pos).front() * + sm.detJ * wp.getWeight(); } auto const indices = NumLib::getIndices(id, dof_table_boundary); @@ -62,7 +68,7 @@ public: } private: - double const _neumann_bc_value; + Parameter<double> const& _neumann_bc_value; typename Base::NodalVectorType _local_rhs; };