From 8df4d40c150471e51f66bbcdcc6bc12c2cb3fd02 Mon Sep 17 00:00:00 2001 From: renchao_lu <renchao.lu@gmail.com> Date: Mon, 23 Nov 2020 16:54:18 +0100 Subject: [PATCH] [PL] Update postTimeStep interface for other processes. --- ProcessLib/HydroMechanics/HydroMechanicsFEM.h | 2 +- .../HydroMechanics/HydroMechanicsProcess.cpp | 16 ++++++++++++-- .../HydroMechanics/HydroMechanicsProcess.cpp | 21 +++++++++++++------ .../HydroMechanicsLocalAssemblerInterface.h | 8 +++---- ProcessLib/PhaseField/PhaseFieldFEM.h | 2 +- .../RichardsMechanics/RichardsMechanicsFEM.h | 2 +- .../RichardsMechanicsProcess.cpp | 14 +++++++++---- .../SmallDeformation/SmallDeformationFEM.h | 2 +- .../SmallDeformationProcess.cpp | 8 ++++--- .../SmallDeformationNonlocalFEM.h | 2 +- .../SmallDeformationNonlocalProcess.cpp | 8 ++++--- .../ThermoHydroMechanicsFEM.h | 2 +- .../ThermoHydroMechanicsProcess.cpp | 17 +++++++++++++-- .../ThermoMechanicalPhaseFieldFEM.h | 2 +- .../ThermoMechanicalPhaseFieldProcess.cpp | 16 +++++++++++--- .../ThermoMechanics/ThermoMechanicsFEM.h | 2 +- .../ThermoMechanicsProcess.cpp | 13 ++++++++---- 17 files changed, 97 insertions(+), 40 deletions(-) diff --git a/ProcessLib/HydroMechanics/HydroMechanicsFEM.h b/ProcessLib/HydroMechanics/HydroMechanicsFEM.h index 0c60ac50520..628493238d2 100644 --- a/ProcessLib/HydroMechanics/HydroMechanicsFEM.h +++ b/ProcessLib/HydroMechanics/HydroMechanicsFEM.h @@ -178,7 +178,7 @@ public: } } - void postTimestepConcrete(std::vector<double> const& /*local_x*/, + void postTimestepConcrete(Eigen::VectorXd const& /*local_x*/, double const /*t*/, double const /*dt*/) override { diff --git a/ProcessLib/HydroMechanics/HydroMechanicsProcess.cpp b/ProcessLib/HydroMechanics/HydroMechanicsProcess.cpp index 9a49750ad68..1de73f25004 100644 --- a/ProcessLib/HydroMechanics/HydroMechanicsProcess.cpp +++ b/ProcessLib/HydroMechanics/HydroMechanicsProcess.cpp @@ -492,12 +492,24 @@ void HydroMechanicsProcess<DisplacementDim>::postTimestepConcreteProcess( std::vector<GlobalVector*> const& x, double const t, double const dt, const int process_id) { + if (process_id != 0) + { + return; + } + DBUG("PostTimestep HydroMechanicsProcess."); + std::vector<NumLib::LocalToGlobalIndexMap const*> dof_tables; + auto const n_processes = x.size(); + dof_tables.reserve(n_processes); + for (std::size_t process_id = 0; process_id < n_processes; ++process_id) + { + dof_tables.push_back(&getDOFTable(process_id)); + } + ProcessLib::ProcessVariable const& pv = getProcessVariables(process_id)[0]; GlobalExecutor::executeSelectedMemberOnDereferenced( &LocalAssemblerIF::postTimestep, _local_assemblers, - pv.getActiveElementIDs(), getDOFTable(process_id), *x[process_id], t, - dt); + pv.getActiveElementIDs(), dof_tables, x, t, dt); } template <int DisplacementDim> diff --git a/ProcessLib/LIE/HydroMechanics/HydroMechanicsProcess.cpp b/ProcessLib/LIE/HydroMechanics/HydroMechanicsProcess.cpp index b28d2aeff66..3d36d63cfe9 100644 --- a/ProcessLib/LIE/HydroMechanics/HydroMechanicsProcess.cpp +++ b/ProcessLib/LIE/HydroMechanics/HydroMechanicsProcess.cpp @@ -459,19 +459,28 @@ void HydroMechanicsProcess<GlobalDim>::postTimestepConcreteProcess( std::vector<GlobalVector*> const& x, const double t, double const dt, int const process_id) { - DBUG("Compute the secondary variables for HydroMechanicsProcess."); - const auto& dof_table = getDOFTable(process_id); - + if (process_id == 0) { + DBUG("PostTimestep HydroMechanicsProcess."); + std::vector<NumLib::LocalToGlobalIndexMap const*> dof_tables; + auto const n_processes = x.size(); + dof_tables.reserve(n_processes); + for (std::size_t process_id = 0; process_id < n_processes; ++process_id) + { + dof_tables.push_back(&getDOFTable(process_id)); + } + ProcessLib::ProcessVariable const& pv = getProcessVariables(process_id)[0]; - GlobalExecutor::executeSelectedMemberOnDereferenced( &HydroMechanicsLocalAssemblerInterface::postTimestep, - _local_assemblers, pv.getActiveElementIDs(), dof_table, - *x[process_id], t, dt); + _local_assemblers, pv.getActiveElementIDs(), dof_tables, x, t, dt); } + DBUG("Compute the secondary variables for HydroMechanicsProcess."); + + const auto& dof_table = getDOFTable(process_id); + // Copy displacement jumps in a solution vector to mesh property // Remark: the copy is required because mesh properties for primary // variables are set during output and are not ready yet when this function diff --git a/ProcessLib/LIE/HydroMechanics/LocalAssembler/HydroMechanicsLocalAssemblerInterface.h b/ProcessLib/LIE/HydroMechanics/LocalAssembler/HydroMechanicsLocalAssemblerInterface.h index ae1a9a5f649..28b2b3057c9 100644 --- a/ProcessLib/LIE/HydroMechanics/LocalAssembler/HydroMechanicsLocalAssemblerInterface.h +++ b/ProcessLib/LIE/HydroMechanics/LocalAssembler/HydroMechanicsLocalAssemblerInterface.h @@ -100,13 +100,11 @@ public: } } - void postTimestepConcrete(std::vector<double> const& local_x_, - const double t, double const dt) override + void postTimestepConcrete(Eigen::VectorXd const& local_x_, const double t, + double const dt) override { - auto const local_dof_size = local_x_.size(); - _local_u.setZero(); - for (unsigned i = 0; i < local_dof_size; i++) + for (Eigen::Index i = 0; i < local_x_.rows(); i++) { _local_u[_dofIndex_to_localIndex[i]] = local_x_[i]; } diff --git a/ProcessLib/PhaseField/PhaseFieldFEM.h b/ProcessLib/PhaseField/PhaseFieldFEM.h index 99eb32c2e26..4cf82b832f9 100644 --- a/ProcessLib/PhaseField/PhaseFieldFEM.h +++ b/ProcessLib/PhaseField/PhaseFieldFEM.h @@ -240,7 +240,7 @@ public: } } - void postTimestepConcrete(std::vector<double> const& /*local_x*/, + void postTimestepConcrete(Eigen::VectorXd const& /*local_x*/, double const /*t*/, double const /*dt*/) override { unsigned const n_integration_points = diff --git a/ProcessLib/RichardsMechanics/RichardsMechanicsFEM.h b/ProcessLib/RichardsMechanics/RichardsMechanicsFEM.h index 1144d6202c3..21ee566a251 100644 --- a/ProcessLib/RichardsMechanics/RichardsMechanicsFEM.h +++ b/ProcessLib/RichardsMechanics/RichardsMechanicsFEM.h @@ -147,7 +147,7 @@ public: } } - void postTimestepConcrete(std::vector<double> const& /*local_x*/, + void postTimestepConcrete(Eigen::VectorXd const& /*local_x*/, double const /*t*/, double const /*dt*/) override { diff --git a/ProcessLib/RichardsMechanics/RichardsMechanicsProcess.cpp b/ProcessLib/RichardsMechanics/RichardsMechanicsProcess.cpp index eef023aebb2..9c25eb185a4 100644 --- a/ProcessLib/RichardsMechanics/RichardsMechanicsProcess.cpp +++ b/ProcessLib/RichardsMechanics/RichardsMechanicsProcess.cpp @@ -543,16 +543,22 @@ void RichardsMechanicsProcess<DisplacementDim>::postTimestepConcreteProcess( std::vector<GlobalVector*> const& x, double const t, double const dt, const int process_id) { - DBUG("PostTimestep RichardsMechanicsProcess."); - if (hasMechanicalProcess(process_id)) { + DBUG("PostTimestep RichardsMechanicsProcess."); + std::vector<NumLib::LocalToGlobalIndexMap const*> dof_tables; + auto const n_processes = x.size(); + dof_tables.reserve(n_processes); + for (std::size_t process_id = 0; process_id < n_processes; ++process_id) + { + dof_tables.push_back(&getDOFTable(process_id)); + } + ProcessLib::ProcessVariable const& pv = getProcessVariables(process_id)[0]; GlobalExecutor::executeSelectedMemberOnDereferenced( &LocalAssemblerIF::postTimestep, _local_assemblers, - pv.getActiveElementIDs(), *_local_to_global_index_map, - *x[process_id], t, dt); + pv.getActiveElementIDs(), dof_tables, x, t, dt); } } diff --git a/ProcessLib/SmallDeformation/SmallDeformationFEM.h b/ProcessLib/SmallDeformation/SmallDeformationFEM.h index 514af43e48c..364fbacea23 100644 --- a/ProcessLib/SmallDeformation/SmallDeformationFEM.h +++ b/ProcessLib/SmallDeformation/SmallDeformationFEM.h @@ -319,7 +319,7 @@ public: } } - void postTimestepConcrete(std::vector<double> const& /*local_x*/, + void postTimestepConcrete(Eigen::VectorXd const& /*local_x*/, double const t, double const dt) override { unsigned const n_integration_points = diff --git a/ProcessLib/SmallDeformation/SmallDeformationProcess.cpp b/ProcessLib/SmallDeformation/SmallDeformationProcess.cpp index 18ae3ae47e8..0dce94e2b84 100644 --- a/ProcessLib/SmallDeformation/SmallDeformationProcess.cpp +++ b/ProcessLib/SmallDeformation/SmallDeformationProcess.cpp @@ -245,13 +245,15 @@ void SmallDeformationProcess<DisplacementDim>::postTimestepConcreteProcess( int const process_id) { DBUG("PostTimestep SmallDeformationProcess."); + std::vector<NumLib::LocalToGlobalIndexMap const*> dof_tables; + dof_tables.reserve(x.size()); + std::generate_n(std::back_inserter(dof_tables), x.size(), + [&]() { return _local_to_global_index_map.get(); }); ProcessLib::ProcessVariable const& pv = getProcessVariables(process_id)[0]; - GlobalExecutor::executeSelectedMemberOnDereferenced( &LocalAssemblerInterface::postTimestep, _local_assemblers, - pv.getActiveElementIDs(), *_local_to_global_index_map, *x[process_id], - t, dt); + pv.getActiveElementIDs(), dof_tables, x, t, dt); std::unique_ptr<GlobalVector> material_forces; ProcessLib::SmallDeformation::writeMaterialForces( diff --git a/ProcessLib/SmallDeformationNonlocal/SmallDeformationNonlocalFEM.h b/ProcessLib/SmallDeformationNonlocal/SmallDeformationNonlocalFEM.h index a228f3314fa..1e3f34bde55 100644 --- a/ProcessLib/SmallDeformationNonlocal/SmallDeformationNonlocalFEM.h +++ b/ProcessLib/SmallDeformationNonlocal/SmallDeformationNonlocalFEM.h @@ -529,7 +529,7 @@ public: } } - void postTimestepConcrete(std::vector<double> const& /*local_x*/, + void postTimestepConcrete(Eigen::VectorXd const& /*local_x*/, double const /*t*/, double const /*dt*/) override { unsigned const n_integration_points = diff --git a/ProcessLib/SmallDeformationNonlocal/SmallDeformationNonlocalProcess.cpp b/ProcessLib/SmallDeformationNonlocal/SmallDeformationNonlocalProcess.cpp index 5b3db21887d..32e9cb34673 100644 --- a/ProcessLib/SmallDeformationNonlocal/SmallDeformationNonlocalProcess.cpp +++ b/ProcessLib/SmallDeformationNonlocal/SmallDeformationNonlocalProcess.cpp @@ -302,13 +302,15 @@ void SmallDeformationNonlocalProcess<DisplacementDim>:: int const process_id) { DBUG("PostTimestep SmallDeformationNonlocalProcess."); + std::vector<NumLib::LocalToGlobalIndexMap const*> dof_tables; + dof_tables.reserve(x.size()); + std::generate_n(std::back_inserter(dof_tables), x.size(), + [&]() { return _local_to_global_index_map.get(); }); ProcessLib::ProcessVariable const& pv = getProcessVariables(process_id)[0]; - GlobalExecutor::executeSelectedMemberOnDereferenced( &LocalAssemblerInterface::postTimestep, _local_assemblers, - pv.getActiveElementIDs(), *_local_to_global_index_map, *x[process_id], - t, dt); + pv.getActiveElementIDs(), dof_tables, x, t, dt); } template <int DisplacementDim> diff --git a/ProcessLib/ThermoHydroMechanics/ThermoHydroMechanicsFEM.h b/ProcessLib/ThermoHydroMechanics/ThermoHydroMechanicsFEM.h index e2815f5570b..e75c3f3f64f 100644 --- a/ProcessLib/ThermoHydroMechanics/ThermoHydroMechanicsFEM.h +++ b/ProcessLib/ThermoHydroMechanics/ThermoHydroMechanicsFEM.h @@ -109,7 +109,7 @@ public: } } - void postTimestepConcrete(std::vector<double> const& /*local_x*/, + void postTimestepConcrete(Eigen::VectorXd const& /*local_x*/, double const /*t*/, double const /*dt*/) override { diff --git a/ProcessLib/ThermoHydroMechanics/ThermoHydroMechanicsProcess.cpp b/ProcessLib/ThermoHydroMechanics/ThermoHydroMechanicsProcess.cpp index 541a9bd7185..f2005fef5eb 100644 --- a/ProcessLib/ThermoHydroMechanics/ThermoHydroMechanicsProcess.cpp +++ b/ProcessLib/ThermoHydroMechanics/ThermoHydroMechanicsProcess.cpp @@ -350,10 +350,23 @@ void ThermoHydroMechanicsProcess<DisplacementDim>::postTimestepConcreteProcess( std::vector<GlobalVector*> const& x, double const t, double const dt, const int process_id) { + if (process_id != 0) + { + return; + } + DBUG("PostTimestep ThermoHydroMechanicsProcess."); + std::vector<NumLib::LocalToGlobalIndexMap const*> dof_tables; + auto const n_processes = x.size(); + dof_tables.reserve(n_processes); + for (std::size_t process_id = 0; process_id < n_processes; ++process_id) + { + dof_tables.push_back(&getDOFTable(process_id)); + } + GlobalExecutor::executeMemberOnDereferenced( - &LocalAssemblerInterface::postTimestep, _local_assemblers, - getDOFTable(process_id), *x[process_id], t, dt); + &LocalAssemblerInterface::postTimestep, _local_assemblers, dof_tables, + x, t, dt); } template <int DisplacementDim> diff --git a/ProcessLib/ThermoMechanicalPhaseField/ThermoMechanicalPhaseFieldFEM.h b/ProcessLib/ThermoMechanicalPhaseField/ThermoMechanicalPhaseFieldFEM.h index e30adfb8d2a..0b96b2c5b2d 100644 --- a/ProcessLib/ThermoMechanicalPhaseField/ThermoMechanicalPhaseFieldFEM.h +++ b/ProcessLib/ThermoMechanicalPhaseField/ThermoMechanicalPhaseFieldFEM.h @@ -254,7 +254,7 @@ public: } } - void postTimestepConcrete(std::vector<double> const& /*local_x*/, + void postTimestepConcrete(Eigen::VectorXd const& /*local_x*/, double const /*t*/, double const /*dt*/) override { unsigned const n_integration_points = diff --git a/ProcessLib/ThermoMechanicalPhaseField/ThermoMechanicalPhaseFieldProcess.cpp b/ProcessLib/ThermoMechanicalPhaseField/ThermoMechanicalPhaseFieldProcess.cpp index be8b63c9ecb..c35d0d6e4a3 100644 --- a/ProcessLib/ThermoMechanicalPhaseField/ThermoMechanicalPhaseFieldProcess.cpp +++ b/ProcessLib/ThermoMechanicalPhaseField/ThermoMechanicalPhaseFieldProcess.cpp @@ -286,14 +286,24 @@ void ThermoMechanicalPhaseFieldProcess<DisplacementDim>:: double const dt, int const process_id) { + if (process_id != 0) + { + return; + } + DBUG("PostTimestep ThermoMechanicalPhaseFieldProcess."); + std::vector<NumLib::LocalToGlobalIndexMap const*> dof_tables; + auto const n_processes = x.size(); + dof_tables.reserve(n_processes); + for (std::size_t process_id = 0; process_id < n_processes; ++process_id) + { + dof_tables.push_back(&getDOFTable(process_id)); + } ProcessLib::ProcessVariable const& pv = getProcessVariables(process_id)[0]; - GlobalExecutor::executeSelectedMemberOnDereferenced( &ThermoMechanicalPhaseFieldLocalAssemblerInterface::postTimestep, - _local_assemblers, pv.getActiveElementIDs(), getDOFTable(process_id), - *x[process_id], t, dt); + _local_assemblers, pv.getActiveElementIDs(), dof_tables, x, t, dt); } template <int DisplacementDim> diff --git a/ProcessLib/ThermoMechanics/ThermoMechanicsFEM.h b/ProcessLib/ThermoMechanics/ThermoMechanicsFEM.h index 2e0a384c3e7..844c7512586 100644 --- a/ProcessLib/ThermoMechanics/ThermoMechanicsFEM.h +++ b/ProcessLib/ThermoMechanics/ThermoMechanicsFEM.h @@ -182,7 +182,7 @@ public: } } - void postTimestepConcrete(std::vector<double> const& /*local_x*/, + void postTimestepConcrete(Eigen::VectorXd const& /*local_x*/, double const /*t*/, double const /*dt*/) override { unsigned const n_integration_points = diff --git a/ProcessLib/ThermoMechanics/ThermoMechanicsProcess.cpp b/ProcessLib/ThermoMechanics/ThermoMechanicsProcess.cpp index 6b73b7bf16d..3be338663c5 100644 --- a/ProcessLib/ThermoMechanics/ThermoMechanicsProcess.cpp +++ b/ProcessLib/ThermoMechanics/ThermoMechanicsProcess.cpp @@ -415,19 +415,24 @@ void ThermoMechanicsProcess<DisplacementDim>::postTimestepConcreteProcess( std::vector<GlobalVector*> const& x, double const t, double const dt, int const process_id) { - if (process_id != _process_data.mechanics_process_id) + if (process_id != 0) { return; } DBUG("PostTimestep ThermoMechanicsProcess."); + std::vector<NumLib::LocalToGlobalIndexMap const*> dof_tables; + auto const n_processes = x.size(); + dof_tables.reserve(n_processes); + for (std::size_t process_id = 0; process_id < n_processes; ++process_id) + { + dof_tables.push_back(&getDOFTable(process_id)); + } ProcessLib::ProcessVariable const& pv = getProcessVariables(process_id)[0]; - GlobalExecutor::executeSelectedMemberOnDereferenced( &LocalAssemblerInterface::postTimestep, _local_assemblers, - pv.getActiveElementIDs(), *_local_to_global_index_map, *x[process_id], - t, dt); + pv.getActiveElementIDs(), dof_tables, x, t, dt); } template <int DisplacementDim> -- GitLab