ASPECT
matrix_free_operators.h
Go to the documentation of this file.
1 // ------------------------------------------------------
2 //
3 // SPDX-License-Identifier: GPL-2.0-or-later
4 //
5 // SPDX-FileCopyrightText: Copyright (C) 2018-2026 by the ASPECT authors.
6 //
7 // This file is part of ASPECT.
8 //
9 // Detailed license information governing the source code and
10 // contributions can be found in the folder LICENSES and in
11 // LICENSE and CONTRIBUTING.md at the top level directory.
12 //
13 // ------------------------------------------------------
14 
15 #ifndef _aspect_simulator_stokes_matrix_free_operators_h
16 #define _aspect_simulator_stokes_matrix_free_operators_h
17 
18 #include <aspect/global.h>
20 #include <aspect/simulator.h>
21 
25 
29 #include <deal.II/multigrid/mg_transfer_global_coarsening.templates.h>
34 
35 #include <deal.II/lac/vector.h>
39 
40 namespace aspect
41 {
42  namespace internal
43  {
49  namespace ChangeVectorTypes
50  {
51  void import(aspect::LinearAlgebra::Vector &out,
52  const ::LinearAlgebra::ReadWriteVector<double> &rwv,
53  const VectorOperation::values operation);
54 
56  const ::LinearAlgebra::distributed::Vector<double> &in);
57 
60 
62  const ::LinearAlgebra::distributed::BlockVector<double> &in);
63 
66  }
67  }
68 
72  namespace MatrixFreeStokesOperators
73  {
74 
85  template <int dim, typename number>
87  {
92 
97 
102 
107 
113 
118 
123 
131 
137 
144 
154 
161 
171 
178 
185 
189  std::set<types::boundary_id> free_surface_boundary_indicators;
190 
195  std::size_t
196  memory_consumption() const;
197 
201  void clear();
202  };
203 
211  template <int dim, typename number>
212  void fill_active_cell_data(const DoFHandler<dim> &dof_handler,
213  const DoFHandler<dim> &dof_handler_projection,
214  const Introspection<dim> &introspection,
215  const Quadrature<dim> &quadrature_formula,
216  const MaterialModel::Interface<dim> &material_model,
218  const Mapping<dim> &mapping,
219  const MatrixFree<dim, double> &matrix_free,
220  const MatrixFree<dim, double> &matrix_free_schur,
221  const MatrixFree<dim, double> &matrix_free_A,
222  const LinearAlgebra::BlockVector &current_linearization_point,
223  const MPI_Comm &mpi_comm,
224  ::LinearAlgebra::distributed::Vector<double> &active_viscosity_vector,
225  OperatorCellData<dim, number> &active_cell_data,
226  double &minimum_viscosity,
227  double &maximum_viscosity);
228 
232  template <int dim, int degree_v, typename number>
234  : public MatrixFreeOperators::Base<dim, ::LinearAlgebra::distributed::BlockVector<number>>
235  {
236  public:
237 
241  StokesOperator ();
242 
246  void clear () override;
247 
251  void set_cell_data (const OperatorCellData<dim,number> &data);
252 
258  void compute_diagonal () override;
259 
260  private:
261 
267  const ::LinearAlgebra::distributed::BlockVector<number> &src) const override;
268 
272  void local_apply (const ::MatrixFree<dim, number> &data,
274  const ::LinearAlgebra::distributed::BlockVector<number> &src,
275  const std::pair<unsigned int, unsigned int> &cell_range) const;
276 
280  void local_apply_face (const ::MatrixFree<dim, number> &data,
282  const ::LinearAlgebra::distributed::BlockVector<number> &src,
283  const std::pair<unsigned int, unsigned int> &face_range) const;
284 
288  void local_apply_boundary_face (const ::MatrixFree<dim, number> &data,
290  const ::LinearAlgebra::distributed::BlockVector<number> &src,
291  const std::pair<unsigned int, unsigned int> &face_range) const;
292 
297  };
298 
299 
300 
304  template <int dim, int degree_v, typename number>
306  : public MatrixFreeOperators::Base<dim, ::LinearAlgebra::distributed::BlockVector<number>>
307  {
308  public:
309 
313  BTBlockOperator ();
314 
318  void clear () override;
319 
323  void set_cell_data (const OperatorCellData<dim,number> &data);
324 
330  void compute_diagonal () override;
331 
332  private:
333 
339  const ::LinearAlgebra::distributed::BlockVector<number> &src) const override;
340 
344  void local_apply (const ::MatrixFree<dim, number> &data,
346  const ::LinearAlgebra::distributed::BlockVector<number> &src,
347  const std::pair<unsigned int, unsigned int> &cell_range) const;
348 
352  void local_apply_face (const ::MatrixFree<dim, number> &data,
354  const ::LinearAlgebra::distributed::BlockVector<number> &src,
355  const std::pair<unsigned int, unsigned int> &face_range) const;
356 
361  };
362 
363 
364 
368  template <int dim, int degree_p, typename number>
370  : public MatrixFreeOperators::Base<dim, ::LinearAlgebra::distributed::Vector<number>>
371  {
372  public:
373 
378 
382  void clear () override;
383 
388  void reinit(const Mapping<dim> &mapping,
389  const DoFHandler<dim> &dof_handler_v,
390  const DoFHandler<dim> &dof_handler_p,
391  const AffineConstraints<number> &constraints_v,
392  const AffineConstraints<number> &constraints_p,
393  std::shared_ptr<MatrixFree<dim,double>> mf_storage,
394  const unsigned int level = numbers::invalid_unsigned_int);
395 
399  void set_cell_data (const OperatorCellData<dim,number> &data);
400 
406  void compute_diagonal () override;
407 
408  private:
409 
414  void apply_add (::LinearAlgebra::distributed::Vector<number> &dst,
415  const ::LinearAlgebra::distributed::Vector<number> &src) const override;
416 
420  void local_apply (const ::MatrixFree<dim, number> &data,
422  const ::LinearAlgebra::distributed::Vector<number> &src,
423  const std::pair<unsigned int, unsigned int> &cell_range) const;
424 
428  void inner_cell_operation(FEEvaluation<dim,
429  degree_p,
430  degree_p+2,
431  1,
432  number> &pressure) const;
433 
438  };
439 
444  template <int dim, int degree_v, typename number>
446  : public MatrixFreeOperators::Base<dim, ::LinearAlgebra::distributed::Vector<number>>
447  {
448  public:
449 
453  ABlockOperator ();
454 
458  void clear () override;
459 
464  void reinit(const Mapping<dim> &mapping,
465  const DoFHandler<dim> &dof_handler_v,
466  const DoFHandler<dim> &dof_handler_p,
467  const AffineConstraints<number> &constraints_v,
468  const AffineConstraints<number> &constraints_p,
469  std::shared_ptr<MatrixFree<dim,double>> mf_storage,
470  const unsigned int level = numbers::invalid_unsigned_int);
474  void set_cell_data (const OperatorCellData<dim,number> &data);
475 
481  void compute_diagonal () override;
482 
488  void set_diagonal (const ::LinearAlgebra::distributed::Vector<number> &diag);
489 
490  private:
495  void inner_cell_operation(FEEvaluation<dim,
496  degree_v,
497  degree_v+1,
498  dim,
499  number> &velocity) const;
500 
505  void cell_operation(FEEvaluation<dim,
506  degree_v,
507  degree_v+1,
508  dim,
509  number> &velocity) const;
510 
516  void apply_add (::LinearAlgebra::distributed::Vector<number> &dst,
517  const ::LinearAlgebra::distributed::Vector<number> &src) const override;
518 
522  void local_apply (const ::MatrixFree<dim, number> &data,
524  const ::LinearAlgebra::distributed::Vector<number> &src,
525  const std::pair<unsigned int, unsigned int> &cell_range) const;
526 
531  };
532  }
533 
534 }
535 
536 #endif
Table< 2, VectorizedArray< number > > dilation_derivative_wrt_pressure_table
const OperatorCellData< dim, number > * cell_data
constexpr unsigned int invalid_unsigned_int
std::set< types::boundary_id > free_surface_boundary_indicators
std::vector< index_type > data
const OperatorCellData< dim, number > * cell_data
void copy(aspect::LinearAlgebra::Vector &out, const ::LinearAlgebra::distributed::Vector< double > &in)
Table< 2, Tensor< 1, dim, VectorizedArray< number > > > free_surface_stabilization_term_table
const OperatorCellData< dim, number > * cell_data
Table< 2, SymmetricTensor< 2, dim, VectorizedArray< number > > > strain_rate_table
const OperatorCellData< dim, number > * cell_data
unsigned int level
Table< 2, SymmetricTensor< 2, dim, VectorizedArray< number > > > dilation_derivative_wrt_strain_rate_table
Table< 2, VectorizedArray< number > > dilation_lhs_term_table
Table< 2, SymmetricTensor< 2, dim, VectorizedArray< number > > > newton_factor_wrt_strain_rate_table
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 &current_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)