22 #ifndef _aspect_stokes_matrix_free_h 23 #define _aspect_stokes_matrix_free_h 29 #include <deal.II/matrix_free/matrix_free.h> 30 #include <deal.II/matrix_free/operators.h> 31 #include <deal.II/matrix_free/fe_evaluation.h> 33 #include <deal.II/multigrid/mg_constrained_dofs.h> 34 #include <deal.II/multigrid/multigrid.h> 35 #include <deal.II/multigrid/mg_transfer_matrix_free.h> 36 #include <deal.II/multigrid/mg_transfer_global_coarsening.templates.h> 37 #include <deal.II/multigrid/mg_tools.h> 38 #include <deal.II/multigrid/mg_coarse.h> 39 #include <deal.II/multigrid/mg_smoother.h> 40 #include <deal.II/multigrid/mg_matrix.h> 42 #include <deal.II/lac/vector.h> 43 #include <deal.II/lac/block_vector.h> 44 #include <deal.II/lac/la_parallel_vector.h> 45 #include <deal.II/lac/la_parallel_block_vector.h> 61 namespace ChangeVectorTypes
64 const ::LinearAlgebra::ReadWriteVector<double> &rwv,
65 const VectorOperation::values operation);
68 const ::LinearAlgebra::distributed::Vector<double> &in);
70 void copy(::LinearAlgebra::distributed::Vector<double> &out,
74 const ::LinearAlgebra::distributed::BlockVector<double> &in);
76 void copy(::LinearAlgebra::distributed::BlockVector<double> &out,
84 namespace MatrixFreeStokesOperators
97 template <
int dim,
typename number>
154 Table<2, SymmetricTensor<2, dim, VectorizedArray<number>>>
174 memory_consumption()
const;
185 template <
int dim,
int degree_v,
typename number>
187 :
public MatrixFreeOperators::Base<dim, ::LinearAlgebra::distributed::BlockVector<number>>
199 void clear ()
override;
211 void compute_diagonal ()
override;
219 void apply_add (::LinearAlgebra::distributed::BlockVector<number> &dst,
220 const ::LinearAlgebra::distributed::BlockVector<number> &src)
const override;
225 void local_apply (const ::MatrixFree<dim, number> &data,
226 ::LinearAlgebra::distributed::BlockVector<number> &dst,
227 const ::LinearAlgebra::distributed::BlockVector<number> &src,
228 const std::pair<unsigned int, unsigned int> &cell_range)
const;
233 void local_apply_face (const ::MatrixFree<dim, number> &data,
234 ::LinearAlgebra::distributed::BlockVector<number> &dst,
235 const ::LinearAlgebra::distributed::BlockVector<number> &src,
236 const std::pair<unsigned int, unsigned int> &face_range)
const;
241 void local_apply_boundary_face (const ::MatrixFree<dim, number> &data,
242 ::LinearAlgebra::distributed::BlockVector<number> &dst,
243 const ::LinearAlgebra::distributed::BlockVector<number> &src,
244 const std::pair<unsigned int, unsigned int> &face_range)
const;
255 template <
int dim,
int degree_p,
typename number>
257 :
public MatrixFreeOperators::Base<dim, ::LinearAlgebra::distributed::Vector<number>>
269 void clear ()
override;
281 void compute_diagonal ()
override;
289 void apply_add (::LinearAlgebra::distributed::Vector<number> &dst,
290 const ::LinearAlgebra::distributed::Vector<number> &src)
const override;
295 void local_apply (const ::MatrixFree<dim, number> &data,
296 ::LinearAlgebra::distributed::Vector<number> &dst,
297 const ::LinearAlgebra::distributed::Vector<number> &src,
298 const std::pair<unsigned int, unsigned int> &cell_range)
const;
303 void inner_cell_operation(FEEvaluation<dim,
319 template <
int dim,
int degree_v,
typename number>
321 :
public MatrixFreeOperators::Base<dim, ::LinearAlgebra::distributed::Vector<number>>
333 void clear ()
override;
345 void compute_diagonal ()
override;
352 void set_diagonal (const ::LinearAlgebra::distributed::Vector<number> &diag);
359 void inner_cell_operation(FEEvaluation<dim,
363 number> &velocity)
const;
369 void cell_operation(FEEvaluation<dim,
373 number> &velocity)
const;
380 void apply_add (::LinearAlgebra::distributed::Vector<number> &dst,
381 const ::LinearAlgebra::distributed::Vector<number> &src)
const override;
386 void local_apply (const ::MatrixFree<dim, number> &data,
387 ::LinearAlgebra::distributed::Vector<number> &dst,
388 const ::LinearAlgebra::distributed::Vector<number> &src,
389 const std::pair<unsigned int, unsigned int> &cell_range)
const;
426 virtual void setup_dofs()=0;
435 virtual void assemble()=0;
442 virtual void build_preconditioner()=0;
454 virtual const DoFHandler<dim> &
455 get_dof_handler_v ()
const = 0;
461 virtual const DoFHandler<dim> &
462 get_dof_handler_p ()
const = 0;
468 virtual const DoFHandler<dim> &
469 get_dof_handler_projection ()
const = 0;
475 virtual const AffineConstraints<double> &
476 get_constraints_v ()
const = 0;
482 virtual const AffineConstraints<double> &
483 get_constraints_p ()
const = 0;
490 get_mg_transfer_A ()
const = 0;
497 get_mg_transfer_S ()
const = 0;
503 virtual std::size_t get_cell_data_memory_consumption()
const = 0;
516 template <
int dim,
int velocity_degree>
548 void setup_dofs()
override;
557 void assemble()
override;
563 void build_preconditioner()
override;
575 const DoFHandler<dim> &
576 get_dof_handler_v ()
const override;
582 const DoFHandler<dim> &
583 get_dof_handler_p ()
const override;
589 const DoFHandler<dim> &
590 get_dof_handler_projection ()
const override;
596 const AffineConstraints<double> &
597 get_constraints_v ()
const override;
603 const AffineConstraints<double> &
604 get_constraints_p ()
const override;
611 get_mg_transfer_A ()
const override;
618 get_mg_transfer_S ()
const override;
625 std::size_t get_cell_data_memory_consumption()
const override;
631 void parse_parameters (ParameterHandler &prm);
638 void evaluate_material_model();
644 void correct_stokes_rhs();
679 MGLevelObject<MatrixFreeStokesOperators::OperatorCellData<dim, GMGNumberType>>
level_cell_data;
const OperatorCellData< dim, number > * cell_data
std::set< types::boundary_id > free_surface_boundary_indicators
MGLevelObject< MatrixFreeStokesOperators::OperatorCellData< dim, GMGNumberType > > level_cell_data
DoFHandler< dim > dof_handler_p
::TrilinosWrappers::MPI::BlockVector BlockVector
MatrixFreeStokesOperators::OperatorCellData< dim, GMGNumberType > active_cell_data
MGLevelObject< GMGSchurComplementMatrixType > mg_matrices_Schur_complement
AffineConstraints< double > constraints_v
bool apply_stabilization_free_surface_faces
DoFHandler< dim > dof_handler_projection
MGLevelObject< GMGABlockMatrixType > mg_matrices_A_block
const OperatorCellData< dim, number > * cell_data
bool symmetrize_newton_system
MGConstrainedDoFs mg_constrained_dofs_A_block
MGConstrainedDoFs mg_constrained_dofs_projection
Table< 2, Tensor< 1, dim, VectorizedArray< number > > > free_surface_stabilization_term_table
::TrilinosWrappers::MPI::Vector Vector
StokesMatrixType stokes_matrix
const OperatorCellData< dim, number > * cell_data
void declare_parameters(ParameterHandler &prm)
Table< 2, SymmetricTensor< 2, dim, VectorizedArray< number > > > strain_rate_table
MGTransferMF< dim, GMGNumberType > mg_transfer_A_block
AffineConstraints< double > constraints_p
MGTransferMatrixFree< dim, NumberType > MGTransferMF
std::vector< std::shared_ptr< MatrixFree< dim, double > > > matrix_free_objects
MGTransferMF< dim, GMGNumberType > mg_transfer_Schur_complement
FESystem< dim > fe_projection
Table< 2, VectorizedArray< number > > viscosity
Table< 2, SymmetricTensor< 2, dim, VectorizedArray< number > > > newton_factor_wrt_strain_rate_table
SchurComplementMatrixType Schur_complement_block_matrix
DoFHandler< dim > dof_handler_v
bool enable_newton_derivatives
void copy(TrilinosWrappers::MPI::Vector &out, const ::LinearAlgebra::distributed::Vector< double > &in)
Table< 2, VectorizedArray< number > > newton_factor_wrt_pressure_table
MGConstrainedDoFs mg_constrained_dofs_Schur_complement
ABlockMatrixType A_block_matrix