diff --git a/ProcessLib/HydroMechanics/HydroMechanicsFEM.h b/ProcessLib/HydroMechanics/HydroMechanicsFEM.h index 0c60ac50520bf997681217d80d47cac36b5de8b3..628493238d2bd822cab9f16ac05d62b33b7561fd 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 9a49750ad6840d5dd8bd3cc6d0a9d15169de4efa..1de73f250041b5514280d9724eecc94f1942f710 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 b28d2aeff669450cb386b5698c2b214927eb4c0e..3d36d63cfe9b9838297b6fbd0ac9eb6c1339b28e 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 ae1a9a5f6494eec677e1bee9d83ff6320a18fef8..28b2b3057c900de0d6336f891f0dcb2af1059b29 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 99eb32c2e26fb6950aeb548f82167e6e98196cab..4cf82b832f9ba6f7e61b364aa762b638b283ff9c 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 1144d6202c37c5146bf159223ecbda90875155a9..21ee566a251de7abc052890cb0de1f61b43467b8 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 eef023aebb2cd2f19e575344fd56d47e0fd89b7f..9c25eb185a482c75f1e4c859ac543c9f095b4001 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 514af43e48c11c1b1be6971a23db0de8ec7a0e11..364fbacea231b2efbd0a29de5db57d8dfc214f9e 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 18ae3ae47e86f42be2466022e419922e0006f96e..0dce94e2b844eb3bdf3be0ed451a5ae5bde16c0a 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 a228f3314fa1d213837f9fedeb5c44443762ddb3..1e3f34bde55e9cc8c36465a83afffa183ae652e5 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 5b3db21887d70511abb53b9eb6a7ddfb4542d40a..32e9cb34673974af51c30389cf037ee4a23285a6 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 e2815f5570b3dda44c1cf4eec6354f6a44cdf7b5..e75c3f3f64fa6c910c614a653594c7854d9ebed5 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 541a9bd71850b93e1cfb204d8117fbcf8815ee52..f2005fef5eb65e052e483425c4d97386862e70b7 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 e30adfb8d2a70957b9582bf952a62a717da3fd05..0b96b2c5b2d5bac157b8a647fd1ff9319b7aabdd 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 be8b63c9ecb4869a7a066b5ab88bd59a594d9d53..c35d0d6e4a363d85320099d1b6f4419dcbfb30d4 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 2e0a384c3e729fdf25d00ae0bab236263aac6cbb..844c751258678d4d8f39cd6da9b9da567bfd0993 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 6b73b7bf16dbbfde35fad0db54f1cdd0cfe4ce0e..3be338663c5ea9edd4bf37335adba480a2ca6ade 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>