diff --git a/ProcessLib/LocalAssemblerInterface.cpp b/ProcessLib/LocalAssemblerInterface.cpp index 902c26fac05e3e0765e0c7731f18048c721a2b35..176abcf59bdf2b91fa4f488ca7b9b279ec512880 100644 --- a/ProcessLib/LocalAssemblerInterface.cpp +++ b/ProcessLib/LocalAssemblerInterface.cpp @@ -9,10 +9,12 @@ */ #include "LocalAssemblerInterface.h" + #include <cassert> -#include "NumLib/DOF/DOFTableUtil.h" #include "CoupledSolutionsForStaggeredScheme.h" +#include "MathLib/LinAlg/Eigen/EigenMapTools.h" +#include "NumLib/DOF/DOFTableUtil.h" namespace ProcessLib { @@ -71,12 +73,30 @@ void LocalAssemblerInterface::assembleWithJacobianForStaggeredScheme( void LocalAssemblerInterface::computeSecondaryVariable( std::size_t const mesh_item_id, - NumLib::LocalToGlobalIndexMap const& dof_table, double const t, - double const dt, GlobalVector const& x, GlobalVector const& x_dot) + std::vector<NumLib::LocalToGlobalIndexMap const*> const& dof_tables, + double const t, double const dt, std::vector<GlobalVector*> const& x, + GlobalVector const& x_dot, int const process_id) { - auto const indices = NumLib::getIndices(mesh_item_id, dof_table); - auto const local_x = x.get(indices); - auto const local_x_dot = x_dot.get(indices); + std::vector<double> local_x_vec; + + auto const n_processes = x.size(); + for (std::size_t process_id = 0; process_id < n_processes; ++process_id) + { + auto const indices = + NumLib::getIndices(mesh_item_id, *dof_tables[process_id]); + assert(!indices.empty()); + auto const local_solution = x[process_id]->get(indices); + local_x_vec.insert(std::end(local_x_vec), std::begin(local_solution), + std::end(local_solution)); + } + auto const local_x = MathLib::toVector(local_x_vec); + + // Todo: A more decent way is to directly pass x_dots as done for x + auto const indices = + NumLib::getIndices(mesh_item_id, *dof_tables[process_id]); + auto const local_x_dot_vec = x_dot.get(indices); + auto const local_x_dot = MathLib::toVector(local_x_dot_vec); + computeSecondaryVariableConcrete(t, dt, local_x, local_x_dot); } diff --git a/ProcessLib/LocalAssemblerInterface.h b/ProcessLib/LocalAssemblerInterface.h index 8148654e1c6c0a3538c09080b3dd61fbb560ff89..ced1e4d39c58833b9c88461abf5eab8e232ae5fe 100644 --- a/ProcessLib/LocalAssemblerInterface.h +++ b/ProcessLib/LocalAssemblerInterface.h @@ -80,9 +80,9 @@ public: virtual void computeSecondaryVariable( std::size_t const mesh_item_id, - NumLib::LocalToGlobalIndexMap const& dof_table, double const t, - double const dt, GlobalVector const& local_x, - GlobalVector const& local_x_dot); + std::vector<NumLib::LocalToGlobalIndexMap const*> const& dof_tables, + double const t, double const dt, std::vector<GlobalVector*> const& x, + GlobalVector const& x_dot, int const process_id); virtual void preTimestep(std::size_t const mesh_item_id, NumLib::LocalToGlobalIndexMap const& dof_table, @@ -157,8 +157,8 @@ private: virtual void computeSecondaryVariableConcrete( double const /*t*/, double const /*dt*/, - std::vector<double> const& /*local_x*/, - std::vector<double> const& /*local_x_dot*/) + Eigen::VectorXd const& /*local_x*/, + Eigen::VectorXd const& /*local_x_dot*/) { }