22#ifndef INCLUDE_EXADG_GRID_MAPPING_DEFORMATION_STRUCTURE_H_
23#define INCLUDE_EXADG_GRID_MAPPING_DEFORMATION_STRUCTURE_H_
26#include <deal.II/base/timer.h>
29#include <exadg/grid/mapping_deformation_base.h>
30#include <exadg/structure/spatial_discretization/operator.h>
31#include <exadg/utilities/print_solver_results.h>
42template<
int dim,
typename Number>
46 typedef dealii::LinearAlgebra::distributed::Vector<Number> VectorType;
57 std::shared_ptr<MaterialDescriptor const> material_descriptor,
59 std::string
const & field,
60 MPI_Comm
const & mpi_comm)
63 pcout(std::cout, dealii::
Utilities::MPI::this_mpi_process(mpi_comm) == 0),
64 iterations({0, {0, 0}})
67 pde_operator = std::make_shared<Operator<dim, Number>>(grid,
69 multigrid_mappings_undeformed,
78 pde_operator->setup();
81 pde_operator->initialize_dof_vector(displacement);
84 std::shared_ptr<Operator<dim, Number>
const>
85 get_pde_operator()
const
90 dealii::MatrixFree<dim, Number>
const &
91 get_matrix_free()
const
93 return *pde_operator->get_matrix_free();
101 bool const print_solver_info,
102 types::time_step time_step_number)
override
107 if(param.large_deformation)
109 VectorType const_vector;
111 bool const update_preconditioner =
112 this->param.update_preconditioner &&
113 time_step_number % this->param.update_preconditioner_every_time_steps == 0;
115 auto const iter = pde_operator->solve_nonlinear(displacement,
120 update_preconditioner);
122 iterations.first += 1;
123 std::get<0>(iterations.second) += std::get<0>(iter);
124 std::get<1>(iterations.second) += std::get<1>(iter);
126 if(print_solver_info)
128 this->pcout << std::endl <<
"Solve moving mesh problem (nonlinear elasticity):";
129 print_solver_info_nonlinear(pcout, std::get<0>(iter), std::get<1>(iter), timer.wall_time());
136 pde_operator->initialize_dof_vector(rhs);
137 pde_operator->rhs(rhs, time);
139 auto const iter = pde_operator->solve_linear(displacement,
146 iterations.first += 1;
147 std::get<1>(iterations.second) += iter;
149 if(print_solver_info)
151 this->pcout << std::endl <<
"Solve moving mesh problem (linear elasticity):";
152 print_solver_info_linear(pcout, iter, timer.wall_time());
158 pde_operator->get_dof_handler());
167 std::vector<std::string> names;
168 std::vector<double> iterations_avg;
170 if(param.large_deformation)
172 names = {
"Nonlinear iterations",
173 "Linear iterations (accumulated)",
174 "Linear iterations (per nonlinear it.)"};
176 iterations_avg.resize(3);
178 (double)std::get<0>(iterations.second) / std::max(1., (
double)iterations.first);
180 (double)std::get<1>(iterations.second) / std::max(1., (
double)iterations.first);
181 if(iterations_avg[0] > std::numeric_limits<double>::min())
182 iterations_avg[2] = iterations_avg[1] / iterations_avg[0];
184 iterations_avg[2] = iterations_avg[1];
188 names = {
"Linear iterations"};
189 iterations_avg.resize(1);
191 (double)std::get<1>(iterations.second) / std::max(1., (
double)iterations.first);
194 print_list_of_iterations(pcout, names, iterations_avg);
199 std::shared_ptr<MatrixFreeData<dim, Number>> matrix_free_data;
200 std::shared_ptr<dealii::MatrixFree<dim, Number>> matrix_free;
203 std::shared_ptr<Operator<dim, Number>> pde_operator;
212 dealii::ConditionalOStream pcout;
216 std::tuple<unsigned long long, unsigned long long> >
void initialize_mapping_from_dof_vector(std::shared_ptr< dealii::Mapping< dim > const > mapping, VectorType const &displacement_vector, dealii::DoFHandler< dim > const &dof_handler)
Definition mapping_dof_vector.h:212
Definition parameters.h:41
Definition interpolate.h:32
Definition boundary_descriptor.h:48
Definition field_functions.h:32