From 68a4f5af4446dd85658847071bac327a5a148f23 Mon Sep 17 00:00:00 2001 From: renchao_lu <renchao.lu@gmail.com> Date: Mon, 21 Sep 2020 11:20:56 +0200 Subject: [PATCH] [PL/BC] Pass process variable name to SolutionDependentDirichlet. --- .../t_property_name.md | 1 + ...ionDependentDirichletBoundaryCondition.cpp | 28 +++++++++---------- ...utionDependentDirichletBoundaryCondition.h | 4 +++ 3 files changed, 19 insertions(+), 14 deletions(-) create mode 100644 Documentation/ProjectFile/prj/process_variables/process_variable/boundary_conditions/boundary_condition/SolutionDependentDirichlet/t_property_name.md diff --git a/Documentation/ProjectFile/prj/process_variables/process_variable/boundary_conditions/boundary_condition/SolutionDependentDirichlet/t_property_name.md b/Documentation/ProjectFile/prj/process_variables/process_variable/boundary_conditions/boundary_condition/SolutionDependentDirichlet/t_property_name.md new file mode 100644 index 00000000000..4c9b21a8828 --- /dev/null +++ b/Documentation/ProjectFile/prj/process_variables/process_variable/boundary_conditions/boundary_condition/SolutionDependentDirichlet/t_property_name.md @@ -0,0 +1 @@ +A property name for output on the boundary mesh. diff --git a/ProcessLib/BoundaryCondition/SolutionDependentDirichletBoundaryCondition.cpp b/ProcessLib/BoundaryCondition/SolutionDependentDirichletBoundaryCondition.cpp index e13eed5062c..93a21442c0b 100644 --- a/ProcessLib/BoundaryCondition/SolutionDependentDirichletBoundaryCondition.cpp +++ b/ProcessLib/BoundaryCondition/SolutionDependentDirichletBoundaryCondition.cpp @@ -24,6 +24,7 @@ namespace ProcessLib { SolutionDependentDirichletBoundaryCondition:: SolutionDependentDirichletBoundaryCondition( + std::string property_name, ParameterLib::Parameter<double> const& parameter, MeshLib::Mesh const& bc_mesh, NumLib::LocalToGlobalIndexMap const& dof_table_bulk, @@ -41,7 +42,6 @@ SolutionDependentDirichletBoundaryCondition:: _dof_table_boundary.reset(dof_table_bulk.deriveBoundaryConstrainedMap( variable_id, {component_id}, std::move(bc_mesh_subset))); - std::string const property_name = "solution_dependent_bc"; if (bc_mesh.getProperties().existsPropertyVector<double>(property_name)) { OGS_FATAL( @@ -50,23 +50,23 @@ SolutionDependentDirichletBoundaryCondition:: property_name); } - auto& solution_dependent_bc = *MeshLib::getOrCreateMeshProperty<double>( + _solution_dependent_bc = MeshLib::getOrCreateMeshProperty<double>( const_cast<MeshLib::Mesh&>(bc_mesh), property_name, MeshLib::MeshItemType::Node, 1); - solution_dependent_bc.resize(bc_mesh.getNumberOfNodes()); + _solution_dependent_bc->resize(bc_mesh.getNumberOfNodes()); ParameterLib::SpatialPosition pos; auto const& nodes = bc_mesh.getNodes(); - for (std::size_t i = 0; i < solution_dependent_bc.size(); ++i) + for (std::size_t i = 0; i < _solution_dependent_bc->size(); ++i) { auto const id = nodes[i]->getID(); pos.setNodeID(id); - solution_dependent_bc[i] = parameter(0, pos)[0]; + (*_solution_dependent_bc)[i] = parameter(0, pos)[0]; } _parameter = std::make_unique<ParameterLib::MeshNodeParameter<double>>( - property_name, bc_mesh, solution_dependent_bc); + property_name, bc_mesh, *_solution_dependent_bc); } void SolutionDependentDirichletBoundaryCondition::getEssentialBCValues( @@ -82,12 +82,8 @@ void SolutionDependentDirichletBoundaryCondition::postTimestep( double const /*t*/, std::vector<GlobalVector*> const& x, int const process_id) { - auto& solution_dependent_bc = - *const_cast<MeshLib::Properties&>(_bc_mesh.getProperties()) - .getPropertyVector<double>("solution_dependent_bc"); - auto const& nodes = _bc_mesh.getNodes(); - for (std::size_t i = 0; i < solution_dependent_bc.size(); ++i) + for (std::size_t i = 0; i < _solution_dependent_bc->size(); ++i) { auto const id = nodes[i]->getID(); auto const global_index = _dof_table_boundary->getGlobalIndex( @@ -95,7 +91,7 @@ void SolutionDependentDirichletBoundaryCondition::postTimestep( _component_id); assert(global_index >= 0); - solution_dependent_bc[i] = x[process_id]->get(global_index); + (*_solution_dependent_bc)[i] = x[process_id]->get(global_index); } } @@ -112,6 +108,10 @@ createSolutionDependentDirichletBoundaryCondition( //! \ogs_file_param{prj__process_variables__process_variable__boundary_conditions__boundary_condition__type} config.checkConfigParameter("type", "SolutionDependentDirichlet"); + auto property_name = + //! \ogs_file_param{prj__process_variables__process_variable__boundary_conditions__boundary_condition__SolutionDependentDirichlet__property_name} + config.getConfigParameter<std::string>("property_name"); + auto& initial_value_parameter = ParameterLib::findParameter<double>( //! \ogs_file_param{prj__process_variables__process_variable__boundary_conditions__boundary_condition__SolutionDependentDirichlet__initial_value_parameter} config.getConfigParameter<std::string>("initial_value_parameter"), @@ -132,8 +132,8 @@ createSolutionDependentDirichletBoundaryCondition( #endif // USE_PETSC return std::make_unique<SolutionDependentDirichletBoundaryCondition>( - initial_value_parameter, bc_mesh, dof_table_bulk, variable_id, - component_id); + std::move(property_name), initial_value_parameter, bc_mesh, + dof_table_bulk, variable_id, component_id); } } // namespace ProcessLib diff --git a/ProcessLib/BoundaryCondition/SolutionDependentDirichletBoundaryCondition.h b/ProcessLib/BoundaryCondition/SolutionDependentDirichletBoundaryCondition.h index 4dec2bc19ff..ceaca073017 100644 --- a/ProcessLib/BoundaryCondition/SolutionDependentDirichletBoundaryCondition.h +++ b/ProcessLib/BoundaryCondition/SolutionDependentDirichletBoundaryCondition.h @@ -28,6 +28,7 @@ class SolutionDependentDirichletBoundaryCondition final { public: SolutionDependentDirichletBoundaryCondition( + std::string property_name, ParameterLib::Parameter<double> const& parameter, MeshLib::Mesh const& bc_mesh, NumLib::LocalToGlobalIndexMap const& dof_table_bulk, @@ -58,6 +59,9 @@ private: int const _component_id; std::unique_ptr<NumLib::LocalToGlobalIndexMap const> _dof_table_boundary; std::unique_ptr<ParameterLib::MeshNodeParameter<double>> _parameter; + // avoid repetitively retrieving the desired property from the boundary mesh + // over time steps + MeshLib::PropertyVector<double>* _solution_dependent_bc; }; std::unique_ptr<SolutionDependentDirichletBoundaryCondition> -- GitLab