diff --git a/ProcessLib/HydroMechanics/HydroMechanicsFEM-impl.h b/ProcessLib/HydroMechanics/HydroMechanicsFEM-impl.h index ba3483150693c14010cfa4d91c82773ed9f65ca5..482f6e97247414111ec56f24e98d643a42b44359 100644 --- a/ProcessLib/HydroMechanics/HydroMechanicsFEM-impl.h +++ b/ProcessLib/HydroMechanics/HydroMechanicsFEM-impl.h @@ -874,8 +874,8 @@ template <typename ShapeFunctionDisplacement, typename ShapeFunctionPressure, int DisplacementDim> void HydroMechanicsLocalAssembler<ShapeFunctionDisplacement, ShapeFunctionPressure, DisplacementDim>:: - postNonLinearSolverConcrete(std::vector<double> const& local_x, - std::vector<double> const& local_x_prev, + postNonLinearSolverConcrete(Eigen::VectorXd const& local_x, + Eigen::VectorXd const& local_x_prev, double const t, double const dt, int const process_id) { @@ -894,14 +894,9 @@ void HydroMechanicsLocalAssembler<ShapeFunctionDisplacement, if (!staggered_scheme_ptr->fixed_stress_over_time_step) { auto const p = - Eigen::Map<typename ShapeMatricesTypePressure:: - template VectorType<pressure_size> const>( - local_x.data(), pressure_size); - + local_x.template segment<pressure_size>(pressure_index); auto const p_prev = - Eigen::Map<typename ShapeMatricesTypePressure:: - template VectorType<pressure_size> const>( - local_x_prev.data(), pressure_size); + local_x_prev.template segment<pressure_size>(pressure_index); for (int ip = 0; ip < n_integration_points; ip++) { @@ -928,12 +923,8 @@ void HydroMechanicsLocalAssembler<ShapeFunctionDisplacement, .template value<double>(MPL::EmptyVariableArray, x_position, t, dt); - const int displacement_offset = - (!staggered_scheme_ptr) ? displacement_index : 0; - - auto u = Eigen::Map<typename ShapeMatricesTypeDisplacement:: - template VectorType<displacement_size> const>( - local_x.data() + displacement_offset, displacement_size); + auto const u = + local_x.template segment<displacement_size>(displacement_index); MPL::VariableArray vars; vars.temperature = T_ref; diff --git a/ProcessLib/HydroMechanics/HydroMechanicsFEM.h b/ProcessLib/HydroMechanics/HydroMechanicsFEM.h index 0f6ce91936e04e7cff3c035aca7d9bf8fe5856e7..45dcdc49d94aaabf990bb8ee22e77e5b847233d6 100644 --- a/ProcessLib/HydroMechanics/HydroMechanicsFEM.h +++ b/ProcessLib/HydroMechanics/HydroMechanicsFEM.h @@ -271,8 +271,8 @@ public: double const t, double const dt, Eigen::VectorXd const& local_xs, Eigen::VectorXd const& local_x_prev) override; - void postNonLinearSolverConcrete(std::vector<double> const& local_x, - std::vector<double> const& local_x_prev, + void postNonLinearSolverConcrete(Eigen::VectorXd const& local_x, + Eigen::VectorXd const& local_x_prev, double const t, double const dt, int const process_id) override; diff --git a/ProcessLib/HydroMechanics/HydroMechanicsProcess.cpp b/ProcessLib/HydroMechanics/HydroMechanicsProcess.cpp index 03816784d57288a3d5bd1f992bffc829bc4479c9..7219b8596b6d804ea3c1ef8251f77197743532c6 100644 --- a/ProcessLib/HydroMechanics/HydroMechanicsProcess.cpp +++ b/ProcessLib/HydroMechanics/HydroMechanicsProcess.cpp @@ -412,7 +412,7 @@ void HydroMechanicsProcess<DisplacementDim>::postNonLinearSolverConcreteProcess( // Calculate strain, stress or other internal variables of mechanics. GlobalExecutor::executeSelectedMemberOnDereferenced( &LocalAssemblerIF::postNonLinearSolver, _local_assemblers, - getActiveElementIDs(), getDOFTable(process_id), x, x_prev, t, dt, + getActiveElementIDs(), getDOFTables(x.size()), x, x_prev, t, dt, process_id); } diff --git a/ProcessLib/LocalAssemblerInterface.cpp b/ProcessLib/LocalAssemblerInterface.cpp index 36452f0777248bdc4b0ddf330251df2f6238e182..fdd5d1a9107c1269d336bdaf14f1e4cffb5715a9 100644 --- a/ProcessLib/LocalAssemblerInterface.cpp +++ b/ProcessLib/LocalAssemblerInterface.cpp @@ -130,14 +130,14 @@ void LocalAssemblerInterface::postTimestep( void LocalAssemblerInterface::postNonLinearSolver( std::size_t const mesh_item_id, - NumLib::LocalToGlobalIndexMap const& dof_table, + std::vector<NumLib::LocalToGlobalIndexMap const*> const& dof_tables, std::vector<GlobalVector*> const& x, std::vector<GlobalVector*> const& x_prev, double const t, double const dt, int const process_id) { - auto const indices = NumLib::getIndices(mesh_item_id, dof_table); - auto const local_x = x[process_id]->get(indices); - auto const local_x_prev = x_prev[process_id]->get(indices); + auto const local_x = NumLib::getLocalX(mesh_item_id, dof_tables, x); + auto const local_x_prev = + NumLib::getLocalX(mesh_item_id, dof_tables, x_prev); postNonLinearSolverConcrete(local_x, local_x_prev, t, dt, process_id); } diff --git a/ProcessLib/LocalAssemblerInterface.h b/ProcessLib/LocalAssemblerInterface.h index 0b05ce8697feaa64b98210e80294d8e84404ba8d..e1296def8a07626ad3aa48ff99e9f558504bc387 100644 --- a/ProcessLib/LocalAssemblerInterface.h +++ b/ProcessLib/LocalAssemblerInterface.h @@ -22,7 +22,6 @@ class LocalToGlobalIndexMap; namespace ProcessLib { - /*! Common interface for local assemblers * NumLib::ODESystemTag::FirstOrderImplicitQuasilinear ODE systems. * @@ -92,12 +91,12 @@ public: std::vector<GlobalVector*> const& x_prev, double const t, double const dt, int const process_id); - void postNonLinearSolver(std::size_t const mesh_item_id, - NumLib::LocalToGlobalIndexMap const& dof_table, - std::vector<GlobalVector*> const& x, - std::vector<GlobalVector*> const& x_prev, - double const t, double const dt, - int const process_id); + void postNonLinearSolver( + std::size_t const mesh_item_id, + std::vector<NumLib::LocalToGlobalIndexMap const*> const& dof_tables, + std::vector<GlobalVector*> const& x, + std::vector<GlobalVector*> const& x_prev, double const t, + double const dt, int const process_id); /// Computes the flux in the point \c p_local_coords that is given in local /// coordinates using the values from \c local_x. @@ -127,7 +126,6 @@ private: } virtual void initializeConcrete() {} - virtual void preTimestepConcrete(std::vector<double> const& /*local_x*/, double const /*t*/, double const /*dt*/) { @@ -141,8 +139,8 @@ private: } virtual void postNonLinearSolverConcrete( - std::vector<double> const& /*local_x*/, - std::vector<double> const& /*local_x_prev*/, double const /*t*/, + Eigen::VectorXd const& /*local_x*/, + Eigen::VectorXd const& /*local_x_prev*/, double const /*t*/, double const /*dt*/, int const /*process_id*/) { } diff --git a/ProcessLib/ThermoMechanicalPhaseField/ThermoMechanicalPhaseFieldProcess.cpp b/ProcessLib/ThermoMechanicalPhaseField/ThermoMechanicalPhaseFieldProcess.cpp index 7d817d6c0cd9420ae312b1fc3dcfd1970dec0845..2000e1411f7887cf42148aec11f4fb712a8aaabd 100644 --- a/ProcessLib/ThermoMechanicalPhaseField/ThermoMechanicalPhaseFieldProcess.cpp +++ b/ProcessLib/ThermoMechanicalPhaseField/ThermoMechanicalPhaseFieldProcess.cpp @@ -315,7 +315,7 @@ void ThermoMechanicalPhaseFieldProcess<DisplacementDim>:: GlobalExecutor::executeSelectedMemberOnDereferenced( &LocalAssemblerInterface::postNonLinearSolver, _local_assemblers, - pv.getActiveElementIDs(), getDOFTable(process_id), x, x_prev, t, dt, + pv.getActiveElementIDs(), getDOFTables(x.size()), x, x_prev, t, dt, process_id); }