12 #include <deal.II/algorithms/any_data.h> 13 #include <deal.II/base/logstream.h> 14 #include <deal.II/base/utilities.h> 15 #include <deal.II/lac/vector.h> 17 #include <amandus/amandus.h> 22 DeclException1(ExcErrorTooLarge,
double, <<
"error " << arg1 <<
" is too large");
38 dealii::Algorithms::OperatorBase& solver,
41 dealii::Vector<double> res;
42 dealii::Vector<double> sol;
44 solver.notify(dealii::Algorithms::Events::remesh);
49 dealii::AnyData solution_data;
50 dealii::Vector<double>* p = /
51 solution_data.add(p,
"solution");
54 dealii::Vector<double>* rhs = &res;
56 dealii::AnyData residual_data;
57 residual(data, residual_data);
58 dealii::deallog <<
"Residual " << res.l2_norm() << std::endl;
59 solver(solution_data, data);
62 app.
error(errors, solution_data, error);
79 dealii::Algorithms::OperatorBase& solver,
81 const dealii::Function<dim>* initial_function = 0,
82 unsigned int n_qpoints = 0)
84 dealii::Vector<double> solution;
90 n_qpoints = app.
dofs().get_fe().tensor_degree() + 1;
92 dealii::QGauss<dim> quadrature(n_qpoints);
93 if (initial_function != 0)
95 dealii::VectorTools::project(
99 solver.notify(dealii::Algorithms::Events::remesh);
101 dealii::AnyData solution_data;
102 dealii::Vector<double>* p = &solution;
103 solution_data.add(p,
"solution");
105 dealii::AnyData data;
106 solver(solution_data, data);
107 app.
error(errors, solution_data, error);
137 unsigned int n_qpoints)
139 , exact_solution(&exact_solution)
144 virtual void operator()(dealii::AnyData& out,
const dealii::AnyData& in)
146 dealii::LogStream::Prefix p(
"ExactResidual");
148 if (this->notifications.test(dealii::Algorithms::Events::initial) ||
149 this->notifications.test(dealii::Algorithms::Events::remesh))
151 dealii::deallog <<
"Projecting exact solution." << std::endl;
153 dealii::VectorTools::project(this->
application->dofs(),
158 this->notifications.clear();
163 dealii::AnyData exact_residual_out;
164 dealii::AnyData exact_residual_in;
166 dealii::Vector<double> exact_residual;
172 exact_residual_in.add<
const dealii::Vector<double>*>(&
projection,
"Newton iterate");
173 exact_residual_in.merge(in);
174 exact_residual_out.add<dealii::Vector<double>*>(&exact_residual,
"Residual");
178 out.entry<dealii::Vector<double>*>(
"Residual")->add(-1.0, exact_residual);
200 unsigned int n_components = 1)
201 :
dealii::Function<dim>(n_components)
203 , derivative(pol.derivative())
204 , derivative2(derivative.derivative())
205 , derivative3(derivative2.derivative())
210 value(
const dealii::Point<dim>& p,
const unsigned int )
const 213 for (std::size_t d = 0; d < dim; ++d)
215 value *= polynomial->value(p(d));
220 virtual dealii::Tensor<1, dim>
221 gradient(
const dealii::Point<dim>& p,
const unsigned int )
const 223 dealii::Tensor<1, dim> grad;
224 for (std::size_t d = 0; d < dim; ++d)
227 for (std::size_t i = 0; i < dim; ++i)
229 grad[d] *= (i != d) ? polynomial->value(p(i)) : derivative.value(p(d));
237 laplacian(
const dealii::Point<dim>& p,
const unsigned int )
const 239 double laplace = 0.0;
240 for (std::size_t d = 0; d < dim; ++d)
243 for (std::size_t i = 0; i < dim; ++i)
245 factor *= (i != d) ? polynomial->value(p(i)) : derivative2.value(p(d));
252 dealii::Tensor<1, dim>
255 dealii::Tensor<1, dim> grad;
256 for (std::size_t d = 0; d < dim; ++d)
260 for (std::size_t i = 0; i < dim; ++i)
262 grad1 *= (i != d) ? polynomial->value(p(i)) : derivative3.value(p(d));
264 for (std::size_t j = 0; j < dim; ++j)
268 double grad2factor = 1.0;
269 for (std::size_t i = 0; i < dim; ++i)
271 if (i != j && i != d)
273 grad2factor *= polynomial->value(p(i));
277 grad2factor *= derivative.value(p(i));
281 grad2factor *= derivative2.value(p(i));
284 grad2 += grad2factor;
287 grad[d] = grad1 + grad2;
309 dealii::Vector<double> seed;
310 dealii::Vector<double> diff;
312 for (
unsigned int s = 0; s < n_refinements; ++s)
320 for (
unsigned int i = 0; i < seed.size(); ++i)
321 seed(i) = dealii::Utilities::generate_normal_random_number(0., 1.);
323 dealii::AnyData diff_data;
324 dealii::Vector<double>* p = &diff;
325 diff_data.add(p,
"diff");
327 dealii::AnyData data;
328 dealii::Vector<double>* rhs = &seed;
329 data.add(rhs,
"Newton iterate");
335 dealii::deallog <<
"Difference " << diff.l2_norm() << std::endl;
348 dealii::Vector<double> seed;
349 dealii::Vector<double> prev;
350 dealii::Vector<double> diff;
352 for (
unsigned int s = 0; s < n_refinements; ++s)
361 for (
unsigned int i = 0; i < seed.size(); ++i)
362 seed(i) = dealii::Utilities::generate_normal_random_number(0., 1.);
363 for (
unsigned int i = 0; i < prev.size(); ++i)
364 prev(i) = dealii::Utilities::generate_normal_random_number(0., 1.);
368 dealii::AnyData diff_data;
369 diff_data.add(&diff,
"diff");
371 dealii::AnyData data;
372 data.add(&dt,
"Timestep");
373 data.add(&seed,
"Newton iterate");
382 dealii::deallog <<
"Difference " << diff.l2_norm() << std::endl;
const dealii::ConstraintMatrix & hanging_nodes() const
The object describing the constraints for hanging nodes, not for the boundary.
Definition: amandus.h:592
Definition: integrator.h:137
dealii::SmartPointer< AmandusIntegrator< dim >, AmandusResidual< dim > > integrator
Pointer to the local integrator defining the model.
Definition: amandus.h:539
const dealii::DoFHandler< dim > & dofs() const
The object describing the finite element space.
Definition: amandus.h:578
virtual void operator()(dealii::AnyData &out, const dealii::AnyData &in)
Definition: amandus.cc:40
void verify_residual(unsigned int n_refinements, AmandusApplicationSparse< dim > &app, AmandusIntegrator< dim > &matrix_integrator, AmandusIntegrator< dim > &residual_integrator)
Definition: tests.h:305
dealii::SmartPointer< const AmandusApplicationSparse< dim >, AmandusResidual< dim > > application
Pointer to the application computing the residual.
Definition: amandus.h:537
const dealii::Polynomials::Polynomial< double > * polynomial
Definition: tests.h:294
void verify_theta_residual(unsigned int n_refinements, AmandusApplicationSparse< dim > &app, AmandusIntegrator< dim > &matrix_integrator, AmandusIntegrator< dim > &residual_integrator)
Definition: tests.h:344
virtual void setup_vector(dealii::Vector< double > &v) const
Definition: amandus_sparse.cc:148
virtual void operator()(dealii::AnyData &out, const dealii::AnyData &in)
Definition: tests.h:144
void assemble_matrix(const dealii::AnyData &in, const AmandusIntegrator< dim > &integrator)
Definition: amandus_sparse.cc:245
void refine_mesh(const bool global=false)
Definition: amandus_sparse.cc:598
virtual dealii::Tensor< 1, dim > gradient(const dealii::Point< dim > &p, const unsigned int) const
Definition: tests.h:221
const dealii::Polynomials::Polynomial< double > derivative
Definition: tests.h:295
DeclException1(ExcErrorTooLarge, double,<< "error "<< arg1<< " is too large")
void output_results(unsigned int refinement_cycle, const dealii::AnyData *data=0) const
Definition: amandus_sparse.cc:697
virtual double value(const dealii::Point< dim > &p, const unsigned int) const
Definition: tests.h:210
ExactResidual(const AmandusApplicationSparse< dim > &application, AmandusIntegrator< dim > &integrator, const dealii::Function< dim > &exact_solution, unsigned int n_qpoints)
Definition: tests.h:135
Definition: amandus.h:115
virtual void setup_system()
Definition: amandus_sparse.cc:182
dealii::Vector< double > projection
Definition: tests.h:184
const dealii::Function< dim > * exact_solution
Definition: tests.h:182
const dealii::QGauss< dim > quadrature
Definition: tests.h:183
dealii::Tensor< 1, dim > gradient_laplacian(const dealii::Point< dim > &p, const unsigned int) const
Definition: tests.h:253
const dealii::Polynomials::Polynomial< double > derivative2
Definition: tests.h:296
void iterative_solve_and_error(dealii::BlockVector< double > &errors, AmandusApplicationSparse< dim > &app, dealii::Algorithms::OperatorBase &solver, const ErrorIntegrator< dim > &error, const dealii::Function< dim > *initial_function=0, unsigned int n_qpoints=0)
Definition: tests.h:78
void error(dealii::BlockVector< double > &out, const dealii::AnyData &in, const AmandusIntegrator< dim > &integrator)
const dealii::Polynomials::Polynomial< double > derivative3
Definition: tests.h:297
virtual double laplacian(const dealii::Point< dim > &p, const unsigned int) const
Definition: tests.h:237
virtual void extract_data(const dealii::AnyData &data)
Extract data independent of the cell.
Definition: integrator.h:468
TensorProductPolynomial(const dealii::Polynomials::Polynomial< double > &pol, unsigned int n_components=1)
Definition: tests.h:199
Definition: amandus.h:513
void verify_residual(dealii::AnyData &out, const dealii::AnyData &in, const AmandusIntegrator< dim > &integrator) const
Definition: amandus_sparse.cc:374
void solve_and_error(dealii::BlockVector< double > &errors, AmandusApplicationSparse< dim > &app, dealii::Algorithms::OperatorBase &solver, dealii::Algorithms::OperatorBase &residual, const AmandusIntegrator< dim > &error)
Definition: tests.h:37
Definition: integrator.h:29