21 template <
typename Solutions,
typename Vector>
30 for (
auto const& bc : *known_solutions)
32 for (std::size_t i = 0; i < bc.ids.size(); ++i)
47 TimeDiscretizedODESystem(
const int process_id,
ODE& ode,
50 _time_disc(time_discretization),
54 _ode.getMatrixSpecifications(process_id), _Jac_id);
56 _ode.getMatrixSpecifications(process_id), _M_id);
58 _ode.getMatrixSpecifications(process_id), _K_id);
60 _ode.getMatrixSpecifications(process_id), _b_id);
75 assemble(std::vector<GlobalVector*>
const& x_new_timestep,
76 std::vector<GlobalVector*>
const& x_prev,
81 auto const t = _time_disc.getCurrentTime();
82 auto const dt = _time_disc.getCurrentTimeIncrement();
83 auto const& x_curr = *x_new_timestep[process_id];
84 auto const dxdot_dx = _time_disc.getNewXWeight();
86 std::vector<GlobalVector*> xdot(x_new_timestep.size());
87 _xdot_ids.resize(x_new_timestep.size());
88 for (std::size_t i = 0; i < xdot.size(); i++)
92 _time_disc.getXdot(*x_new_timestep[i], *x_prev[i], *xdot[i]);
100 _ode.preAssemble(t, dt, x_curr);
103 _ode.assembleWithJacobian(t, dt, x_new_timestep, xdot, dxdot_dx, 1.0,
104 process_id, *_M, *_K, *_b, *_Jac);
136 _time_disc.getXdot(x_new_timestep, x_prev, xdot);
138 _mat_trans->computeResidual(*_M, *_K, *_b, x_new_timestep, xdot, res);
147 _mat_trans->computeJacobian(*_Jac, Jac);
153 int const process_id)
156 _ode.getKnownSolutions(_time_disc.getCurrentTime(), x, process_id);
171 if (!_known_solutions)
177 std::vector<IndexType> ids;
178 for (
auto const& bc : *_known_solutions)
180 ids.insert(end(ids), begin(bc.ids), end(bc.ids));
184 std::vector<double> values(ids.size(), 0);
190 TimeDiscretizedODESystem(
const int process_id,
ODE& ode,
193 _time_disc(time_discretization),
197 ode.getMatrixSpecifications(process_id), _M_id);
199 ode.getMatrixSpecifications(process_id), _K_id);
201 ode.getMatrixSpecifications(process_id), _b_id);
215 assemble(std::vector<GlobalVector*>
const& x_new_timestep,
216 std::vector<GlobalVector*>
const& x_prev,
217 int const process_id)
221 auto const t = _time_disc.getCurrentTime();
222 auto const dt = _time_disc.getCurrentTimeIncrement();
223 auto const& x_curr = *x_new_timestep[process_id];
224 std::vector<GlobalVector*> xdot(x_new_timestep.size());
225 _xdot_ids.resize(x_new_timestep.size());
227 for (std::size_t i = 0; i < xdot.size(); i++)
231 _time_disc.getXdot(*x_new_timestep[i], *x_prev[i], *xdot[i]);
238 _ode.preAssemble(t, dt, x_curr);
239 _ode.assemble(t, dt, x_new_timestep, xdot, process_id, *_M, *_K, *_b);
254 int const process_id)
257 _ode.getKnownSolutions(_time_disc.getCurrentTime(), x, process_id);
273 if (!_known_solutions)
279 std::vector<IndexType> ids;
280 std::vector<double> values;
281 for (
auto const& bc : *_known_solutions)
283 ids.insert(end(ids), begin(bc.ids), end(bc.ids));
284 values.insert(end(values), begin(bc.values), end(bc.values));
Global vector based on Eigen vector.
virtual GlobalMatrix & getMatrix(std::size_t &id)=0
Get an uninitialized matrix with the given id.
virtual void releaseMatrix(GlobalMatrix const &A)=0
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
std::array< double, 3 > Vector
void finalizeAssembly(PETScMatrix &A)
void setVector(PETScVector &v, std::initializer_list< double > values)
void applyKnownSolution(EigenMatrix &A, EigenVector &b, EigenVector &, const std::vector< EigenMatrix::IndexType > &vec_knownX_id, const std::vector< double > &vec_knownX_x, double)
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