16 #ifndef __H2D_RUNGE_KUTTA_H
17 #define __H2D_RUNGE_KUTTA_H
20 #include "weakform/weakform.h"
21 #include "function/filter.h"
22 #include "exceptions.h"
73 template<
typename Scalar>
80 RungeKutta(
const WeakForm<Scalar>* wf, Hermes::vector<
const Space<Scalar> *> spaces, ButcherTable* bt);
83 RungeKutta(
const WeakForm<Scalar>* wf,
const Space<Scalar>* space, ButcherTable* bt);
86 void use_local_projections();
88 void set_start_from_zero_K_vector();
89 void set_residual_as_solutions();
90 void set_block_diagonal_jacobian();
106 void rk_time_step_newton(Hermes::vector<Solution<Scalar>*> slns_time_prev, Hermes::vector<Solution<Scalar>*> slns_time_new, Hermes::vector<Solution<Scalar>*> error_fns);
107 void rk_time_step_newton(Solution<Scalar>* slns_time_prev, Solution<Scalar>* slns_time_new, Solution<Scalar>* error_fn);
111 void rk_time_step_newton(Hermes::vector<Solution<Scalar>*> slns_time_prev, Hermes::vector<Solution<Scalar>*> slns_time_new);
112 void rk_time_step_newton(Solution<Scalar>* sln_time_prev, Solution<Scalar>* sln_time_new);
114 void set_freeze_jacobian();
115 void set_newton_tol(
double newton_tol);
116 void set_newton_max_iter(
int newton_max_iter);
117 void set_newton_damping_coeff(
double newton_damping_coeff);
118 void set_newton_max_allowed_residual_norm(
double newton_max_allowed_residual_norm);
120 virtual void set_spaces(Hermes::vector<
const Space<Scalar>*> spaces);
121 virtual void set_space(
const Space<Scalar>* space);
122 virtual Hermes::vector<const Space<Scalar>*> get_spaces()
const;
135 void set_filters_to_reinit(Hermes::vector<Filter<Scalar>*> filters_to_reinit);
147 void multiply_as_diagonal_block_matrix(SparseMatrix<Scalar>* matrix_left,
int num_stages,
148 Scalar* stage_coeff_vec, Scalar* vector_left);
155 void create_stage_wf(
unsigned int size,
bool block_diagonal_jacobian);
158 void update_stage_wf(Hermes::vector<Solution<Scalar>*> slns_time_prev);
161 void prepare_u_ext_vec();
164 SparseMatrix<Scalar>* matrix_left;
167 SparseMatrix<Scalar>* matrix_right;
168 Vector<Scalar>* vector_right;
171 LinearMatrixSolver<Scalar>* solver;
174 const WeakForm<Scalar>* wf;
177 Hermes::vector<const Space<Scalar>*> spaces;
178 Hermes::vector<Space<Scalar>*> spaces_mutable;
179 Hermes::vector<unsigned int> spaces_seqs;
185 unsigned int num_stages;
190 WeakForm<Scalar> stage_wf_right;
191 DiscreteProblem<Scalar>* stage_dp_right;
194 WeakForm<Scalar> stage_wf_left;
195 DiscreteProblem<Scalar>* stage_dp_left;
197 bool start_from_zero_K_vector;
198 bool block_diagonal_jacobian;
199 bool residual_as_vector;
202 unsigned int iteration;
204 bool do_global_projections;
205 bool freeze_jacobian;
208 double newton_damping_coeff;
209 double newton_max_allowed_residual_norm;
211 Hermes::vector<Solution<Scalar>*> residuals_vector;
224 Hermes::vector<Filter<Scalar>*> filters_to_reinit;