25 std::unique_ptr<AbstractJacobianAssembler>&& jacobian_assembler)
26 : _jacobian_assembler(std::move(jacobian_assembler))
36 auto const local_x = x.
get(indices);
43 std::vector<std::reference_wrapper<NumLib::LocalToGlobalIndexMap>>
const&
45 const double t,
double const dt, std::vector<GlobalVector*>
const& x,
46 std::vector<GlobalVector*>
const& xdot,
int const process_id,
49 std::vector<std::vector<GlobalIndexType>> indices_of_processes;
50 indices_of_processes.reserve(dof_tables.size());
51 transform(cbegin(dof_tables), cend(dof_tables),
52 back_inserter(indices_of_processes),
53 [&](
auto const& dof_table)
56 auto const& indices = indices_of_processes[process_id];
61 std::size_t
const number_of_processes = x.size();
63 if (number_of_processes == 1)
65 auto const local_x = x[process_id]->get(indices);
66 auto const local_xdot = xdot[process_id]->get(indices);
72 auto local_coupled_xs =
76 auto local_coupled_xdots =
85 auto const num_r_c = indices.size();
86 auto const r_c_indices =
92 M.
add(r_c_indices, local_M);
97 K.
add(r_c_indices, local_K);
108 std::vector<std::reference_wrapper<NumLib::LocalToGlobalIndexMap>>
const&
110 const double t,
double const dt, std::vector<GlobalVector*>
const& x,
111 std::vector<GlobalVector*>
const& xdot,
const double dxdot_dx,
115 std::vector<std::vector<GlobalIndexType>> indices_of_processes;
116 indices_of_processes.reserve(dof_tables.size());
117 transform(cbegin(dof_tables), cend(dof_tables),
118 back_inserter(indices_of_processes),
119 [&](
auto const& dof_table)
122 auto const& indices = indices_of_processes[process_id];
129 std::size_t
const number_of_processes = x.size();
131 if (number_of_processes == 1)
133 auto const local_x = x[process_id]->get(indices);
134 auto const local_xdot = xdot[process_id]->get(indices);
136 local_assembler, t, dt, local_x, local_xdot, dxdot_dx, dx_dx,
141 auto local_coupled_xs =
145 auto local_coupled_xdots =
150 local_assembler, t, dt, local_x, local_xdot, dxdot_dx, dx_dx,
155 auto const num_r_c = indices.size();
156 auto const r_c_indices =
162 M.
add(r_c_indices, local_M);
167 K.
add(r_c_indices, local_K);
176 auto const local_Jac =
178 Jac.
add(r_c_indices, local_Jac);
183 "No Jacobian has been assembled! This might be due to programming "
184 "errors in the local assembler of the current process.");
int add(IndexType row, IndexType col, double val)
Global vector based on Eigen vector.
void add(IndexType rowId, double v)
add entry
double get(IndexType rowId) const
get entry
MathLib::RowColumnIndices< GlobalIndexType > RowColumnIndices
virtual void assembleForStaggeredScheme(double const t, double const dt, Eigen::VectorXd const &local_x, Eigen::VectorXd const &local_xdot, int const process_id, std::vector< double > &local_M_data, std::vector< double > &local_K_data, std::vector< double > &local_b_data)
virtual void preAssemble(double const, double const, std::vector< double > const &)
virtual void assemble(double const t, double const dt, std::vector< double > const &local_x, std::vector< double > const &local_xdot, std::vector< double > &local_M_data, std::vector< double > &local_K_data, std::vector< double > &local_b_data)
std::unique_ptr< AbstractJacobianAssembler > _jacobian_assembler
Used to assemble the Jacobian.
std::vector< double > _local_b_data
std::vector< double > _local_K_data
std::vector< double > _local_Jac_data
VectorMatrixAssembler(std::unique_ptr< AbstractJacobianAssembler > &&jacobian_assembler)
void preAssemble(const std::size_t mesh_item_id, LocalAssemblerInterface &local_assembler, const NumLib::LocalToGlobalIndexMap &dof_table, const double t, double const dt, const GlobalVector &x)
std::vector< double > _local_M_data
void assembleWithJacobian(std::size_t const mesh_item_id, LocalAssemblerInterface &local_assembler, std::vector< std::reference_wrapper< NumLib::LocalToGlobalIndexMap >> const &dof_tables, const double t, double const dt, std::vector< GlobalVector * > const &x, std::vector< GlobalVector * > const &xdot, const double dxdot_dx, const double dx_dx, int const process_id, GlobalMatrix &M, GlobalMatrix &K, GlobalVector &b, GlobalMatrix &Jac)
void assemble(std::size_t const mesh_item_id, LocalAssemblerInterface &local_assembler, std::vector< std::reference_wrapper< NumLib::LocalToGlobalIndexMap >> const &dof_tables, double const t, double const dt, std::vector< GlobalVector * > const &x, std::vector< GlobalVector * > const &xdot, int const process_id, GlobalMatrix &M, GlobalMatrix &K, GlobalVector &b)
Eigen::Map< const Vector > toVector(std::vector< double > const &data, Eigen::VectorXd::Index size)
Creates an Eigen mapped vector from the given data vector.
Eigen::Map< const Matrix > toMatrix(std::vector< double > const &data, Eigen::MatrixXd::Index rows, Eigen::MatrixXd::Index cols)
std::vector< GlobalIndexType > getIndices(std::size_t const mesh_item_id, NumLib::LocalToGlobalIndexMap const &dof_table)
std::vector< double > getCoupledLocalSolutions(std::vector< GlobalVector * > const &global_solutions, std::vector< std::vector< GlobalIndexType >> const &indices)