13#include <range/v3/numeric/accumulate.hpp>
14#include <range/v3/view/transform.hpp>
24template <
typename Solutions,
typename Vector>
33 for (
auto const& bc : *known_solutions)
35 for (std::size_t i = 0; i < bc.ids.size(); ++i)
50 TimeDiscretizedODESystem(
const int process_id,
ODE& ode,
53 _time_disc(time_discretization),
57 _ode.getMatrixSpecifications(process_id), _Jac_id);
59 _ode.getMatrixSpecifications(process_id), _b_id);
72 assemble(std::vector<GlobalVector*>
const& x_new_timestep,
73 std::vector<GlobalVector*>
const& x_prev,
76 auto const t = _time_disc.getCurrentTime();
77 auto const dt = _time_disc.getCurrentTimeIncrement();
78 auto const& x_curr = *x_new_timestep[process_id];
83 _ode.preAssemble(t, dt, x_curr);
84 _ode.assembleWithJacobian(t, dt, x_new_timestep, x_prev, process_id, *_b,
105 _mat_trans->computeJacobian(*_Jac, Jac);
111 int const process_id)
114 _ode.getKnownSolutions(_time_disc.getCurrentTime(), x, process_id);
130 if (!_known_solutions)
136 std::size_t
const size = ranges::accumulate(
137 *_known_solutions | ranges::views::transform([](
auto const& bc)
138 {
return bc.ids.size(); }),
140 std::vector<IndexType> ids;
142 std::vector<double> values;
143 values.reserve(size);
145 for (
auto const& bc : *_known_solutions)
147 for (std::size_t i = 0; i < bc.ids.size(); ++i)
149 auto const id = bc.ids[i];
153 values.push_back(x[
id] - bc.values[i]);
165 if (!_known_solutions)
171 std::vector<IndexType> ids;
172 for (
auto const& bc : *_known_solutions)
174 ids.insert(end(ids), begin(bc.ids), end(bc.ids));
178 std::vector<double> values(ids.size(), 0);
184 TimeDiscretizedODESystem(
const int process_id,
ODE& ode,
187 _time_disc(time_discretization),
191 ode.getMatrixSpecifications(process_id), _M_id);
193 ode.getMatrixSpecifications(process_id), _K_id);
195 ode.getMatrixSpecifications(process_id), _b_id);
209 assemble(std::vector<GlobalVector*>
const& x_new_timestep,
210 std::vector<GlobalVector*>
const& x_prev,
211 int const process_id)
215 auto const t = _time_disc.getCurrentTime();
216 auto const dt = _time_disc.getCurrentTimeIncrement();
217 auto const& x_curr = *x_new_timestep[process_id];
223 _ode.preAssemble(t, dt, x_curr);
224 _ode.assemble(t, dt, x_new_timestep, x_prev, process_id, *_M, *_K, *_b);
234 int const process_id)
237 _ode.getKnownSolutions(_time_disc.getCurrentTime(), x, process_id);
253 if (!_known_solutions)
259 std::vector<IndexType> ids;
260 std::vector<double> values;
261 for (
auto const& bc : *_known_solutions)
263 ids.insert(end(ids), begin(bc.ids), end(bc.ids));
264 values.insert(end(values), begin(bc.values), end(bc.values));
Global vector based on Eigen vector.
virtual void releaseMatrix(GlobalMatrix const &A)=0
virtual GlobalMatrix & getMatrix(std::size_t &id)=0
Get an uninitialized matrix with the given id.
virtual GlobalVector & getVector(std::size_t &id)=0
Get an uninitialized vector with the given id.
virtual void releaseVector(GlobalVector const &x)=0
std::unique_ptr< MatrixTranslator< ODETag > > createMatrixTranslator(TimeDiscretization const &timeDisc)
@ FirstOrderImplicitQuasilinear
void finalizeAssembly(PETScMatrix &A)
void copy(PETScVector const &x, PETScVector &y)
void scale(PETScVector &x, PetscScalar const a)
void applyKnownSolution(EigenMatrix &A, EigenVector &b, EigenVector &, const std::vector< EigenMatrix::IndexType > &vec_knownX_id, const std::vector< double > &vec_knownX_x)
void setVector(PETScVector &v, std::initializer_list< double > values)
void applyKnownSolutions(std::vector< Solutions > const *const known_solutions, Vector &x)
Applies known solutions to the solution vector x.
static NUMLIB_EXPORT MatrixProvider & provider
static NUMLIB_EXPORT VectorProvider & provider