21 #ifndef _aspect_simulator_stokes_matrix_free_operators_h 22 #define _aspect_simulator_stokes_matrix_free_operators_h 28 #include <deal.II/matrix_free/matrix_free.h> 29 #include <deal.II/matrix_free/operators.h> 30 #include <deal.II/matrix_free/fe_evaluation.h> 32 #include <deal.II/multigrid/mg_constrained_dofs.h> 33 #include <deal.II/multigrid/multigrid.h> 34 #include <deal.II/multigrid/mg_transfer_matrix_free.h> 35 #include <deal.II/multigrid/mg_transfer_global_coarsening.templates.h> 36 #include <deal.II/multigrid/mg_tools.h> 37 #include <deal.II/multigrid/mg_coarse.h> 38 #include <deal.II/multigrid/mg_smoother.h> 39 #include <deal.II/multigrid/mg_matrix.h> 41 #include <deal.II/lac/vector.h> 42 #include <deal.II/lac/block_vector.h> 43 #include <deal.II/lac/la_parallel_vector.h> 44 #include <deal.II/lac/la_parallel_block_vector.h> 55 namespace ChangeVectorTypes
58 const ::LinearAlgebra::ReadWriteVector<double> &rwv,
59 const VectorOperation::values operation);
62 const ::LinearAlgebra::distributed::Vector<double> &in);
64 void copy(::LinearAlgebra::distributed::Vector<double> &out,
68 const ::LinearAlgebra::distributed::BlockVector<double> &in);
70 void copy(::LinearAlgebra::distributed::BlockVector<double> &out,
78 namespace MatrixFreeStokesOperators
91 template <
int dim,
typename number>
158 Table<2, SymmetricTensor<2, dim, VectorizedArray<number>>>
175 Table<2, VectorizedArray<number>>
182 Table<2, SymmetricTensor<2, dim, VectorizedArray<number>>>
202 memory_consumption()
const;
217 template <
int dim,
typename number>
219 const DoFHandler<dim> &dof_handler_projection,
221 const Quadrature<dim> &quadrature_formula,
224 const Mapping<dim> &mapping,
225 const MatrixFree<dim, double> &matrix_free,
226 const MatrixFree<dim, double> &matrix_free_schur,
227 const MatrixFree<dim, double> &matrix_free_A,
229 const MPI_Comm &mpi_comm,
230 ::LinearAlgebra::distributed::Vector<double> &active_viscosity_vector,
232 double &minimum_viscosity,
233 double &maximum_viscosity);
238 template <
int dim,
int degree_v,
typename number>
240 :
public MatrixFreeOperators::Base<dim, ::LinearAlgebra::distributed::BlockVector<number>>
252 void clear ()
override;
264 void compute_diagonal ()
override;
272 void apply_add (::LinearAlgebra::distributed::BlockVector<number> &dst,
273 const ::LinearAlgebra::distributed::BlockVector<number> &src)
const override;
278 void local_apply (const ::MatrixFree<dim, number> &data,
279 ::LinearAlgebra::distributed::BlockVector<number> &dst,
280 const ::LinearAlgebra::distributed::BlockVector<number> &src,
281 const std::pair<unsigned int, unsigned int> &cell_range)
const;
286 void local_apply_face (const ::MatrixFree<dim, number> &data,
287 ::LinearAlgebra::distributed::BlockVector<number> &dst,
288 const ::LinearAlgebra::distributed::BlockVector<number> &src,
289 const std::pair<unsigned int, unsigned int> &face_range)
const;
294 void local_apply_boundary_face (const ::MatrixFree<dim, number> &data,
295 ::LinearAlgebra::distributed::BlockVector<number> &dst,
296 const ::LinearAlgebra::distributed::BlockVector<number> &src,
297 const std::pair<unsigned int, unsigned int> &face_range)
const;
310 template <
int dim,
int degree_v,
typename number>
312 :
public MatrixFreeOperators::Base<dim, ::LinearAlgebra::distributed::BlockVector<number>>
324 void clear ()
override;
336 void compute_diagonal ()
override;
344 void apply_add (::LinearAlgebra::distributed::BlockVector<number> &dst,
345 const ::LinearAlgebra::distributed::BlockVector<number> &src)
const override;
350 void local_apply (const ::MatrixFree<dim, number> &data,
351 ::LinearAlgebra::distributed::BlockVector<number> &dst,
352 const ::LinearAlgebra::distributed::BlockVector<number> &src,
353 const std::pair<unsigned int, unsigned int> &cell_range)
const;
358 void local_apply_face (const ::MatrixFree<dim, number> &data,
359 ::LinearAlgebra::distributed::BlockVector<number> &dst,
360 const ::LinearAlgebra::distributed::BlockVector<number> &src,
361 const std::pair<unsigned int, unsigned int> &face_range)
const;
374 template <
int dim,
int degree_p,
typename number>
376 :
public MatrixFreeOperators::Base<dim, ::LinearAlgebra::distributed::Vector<number>>
388 void clear ()
override;
394 void reinit(
const Mapping<dim> &mapping,
395 const DoFHandler<dim> &dof_handler_v,
396 const DoFHandler<dim> &dof_handler_p,
397 const AffineConstraints<number> &constraints_v,
398 const AffineConstraints<number> &constraints_p,
399 std::shared_ptr<MatrixFree<dim,double>> mf_storage,
400 const unsigned int level = numbers::invalid_unsigned_int);
412 void compute_diagonal ()
override;
420 void apply_add (::LinearAlgebra::distributed::Vector<number> &dst,
421 const ::LinearAlgebra::distributed::Vector<number> &src)
const override;
426 void local_apply (const ::MatrixFree<dim, number> &data,
427 ::LinearAlgebra::distributed::Vector<number> &dst,
428 const ::LinearAlgebra::distributed::Vector<number> &src,
429 const std::pair<unsigned int, unsigned int> &cell_range)
const;
434 void inner_cell_operation(FEEvaluation<dim,
450 template <
int dim,
int degree_v,
typename number>
452 :
public MatrixFreeOperators::Base<dim, ::LinearAlgebra::distributed::Vector<number>>
464 void clear ()
override;
470 void reinit(
const Mapping<dim> &mapping,
471 const DoFHandler<dim> &dof_handler_v,
472 const DoFHandler<dim> &dof_handler_p,
473 const AffineConstraints<number> &constraints_v,
474 const AffineConstraints<number> &constraints_p,
475 std::shared_ptr<MatrixFree<dim,double>> mf_storage,
476 const unsigned int level = numbers::invalid_unsigned_int);
487 void compute_diagonal ()
override;
494 void set_diagonal (const ::LinearAlgebra::distributed::Vector<number> &diag);
501 void inner_cell_operation(FEEvaluation<dim,
505 number> &velocity)
const;
511 void cell_operation(FEEvaluation<dim,
515 number> &velocity)
const;
522 void apply_add (::LinearAlgebra::distributed::Vector<number> &dst,
523 const ::LinearAlgebra::distributed::Vector<number> &src)
const override;
528 void local_apply (const ::MatrixFree<dim, number> &data,
529 ::LinearAlgebra::distributed::Vector<number> &dst,
530 const ::LinearAlgebra::distributed::Vector<number> &src,
531 const std::pair<unsigned int, unsigned int> &cell_range)
const;
Table< 2, VectorizedArray< number > > dilation_derivative_wrt_pressure_table
const OperatorCellData< dim, number > * cell_data
std::set< types::boundary_id > free_surface_boundary_indicators
::TrilinosWrappers::MPI::BlockVector BlockVector
bool apply_stabilization_free_surface_faces
const OperatorCellData< dim, number > * cell_data
bool symmetrize_newton_system
void copy(aspect::LinearAlgebra::Vector &out, const ::LinearAlgebra::distributed::Vector< double > &in)
Table< 2, Tensor< 1, dim, VectorizedArray< number > > > free_surface_stabilization_term_table
::TrilinosWrappers::MPI::Vector Vector
const OperatorCellData< dim, number > * cell_data
Table< 2, SymmetricTensor< 2, dim, VectorizedArray< number > > > strain_rate_table
const OperatorCellData< dim, number > * cell_data
Table< 2, SymmetricTensor< 2, dim, VectorizedArray< number > > > dilation_derivative_wrt_strain_rate_table
Table< 2, VectorizedArray< number > > dilation_lhs_term_table
bool enable_prescribed_dilation
bool average_newton_factors
Table< 2, VectorizedArray< number > > viscosity
Table< 2, SymmetricTensor< 2, dim, VectorizedArray< number > > > newton_factor_wrt_strain_rate_table
bool enable_newton_derivatives
Table< 2, VectorizedArray< number > > newton_factor_wrt_pressure_table
void fill_active_cell_data(const DoFHandler< dim > &dof_handler, const DoFHandler< dim > &dof_handler_projection, const Introspection< dim > &introspection, const Quadrature< dim > &quadrature_formula, const MaterialModel::Interface< dim > &material_model, const MaterialModel::MaterialAveraging::AveragingOperation &material_averaging, const Mapping< dim > &mapping, const MatrixFree< dim, double > &matrix_free, const MatrixFree< dim, double > &matrix_free_schur, const MatrixFree< dim, double > &matrix_free_A, const LinearAlgebra::BlockVector ¤t_linearization_point, const MPI_Comm &mpi_comm, ::LinearAlgebra::distributed::Vector< double > &active_viscosity_vector, OperatorCellData< dim, number > &active_cell_data, double &minimum_viscosity, double &maximum_viscosity)