ASPECT
matrix_free_operators.h
Go to the documentation of this file.
1 /*
2  Copyright (C) 2018 - 2024 by the authors of the ASPECT code.
3 
4  This file is part of ASPECT.
5 
6  ASPECT is free software; you can redistribute it and/or modify
7  it under the terms of the GNU General Public License as published by
8  the Free Software Foundation; either version 2, or (at your option)
9  any later version.
10 
11  ASPECT is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  GNU General Public License for more details.
15 
16  You should have received a copy of the GNU General Public License
17  along with ASPECT; see the file LICENSE. If not see
18  <http://www.gnu.org/licenses/>.
19 */
20 
21 #ifndef _aspect_simulator_stokes_matrix_free_operators_h
22 #define _aspect_simulator_stokes_matrix_free_operators_h
23 
24 #include <aspect/global.h>
26 #include <aspect/simulator.h>
27 
31 
35 #include <deal.II/multigrid/mg_transfer_global_coarsening.templates.h>
40 
41 #include <deal.II/lac/vector.h>
45 
46 namespace aspect
47 {
48  namespace internal
49  {
55  namespace ChangeVectorTypes
56  {
58  const ::LinearAlgebra::ReadWriteVector<double> &rwv,
59  const VectorOperation::values operation);
60 
62  const ::LinearAlgebra::distributed::Vector<double> &in);
63 
66 
68  const ::LinearAlgebra::distributed::BlockVector<double> &in);
69 
72  }
73  }
74 
78  namespace MatrixFreeStokesOperators
79  {
80 
91  template <int dim, typename number>
93  {
98 
103 
108 
113 
119 
124 
129 
137 
143 
150 
160 
167 
177 
184 
191 
195  std::set<types::boundary_id> free_surface_boundary_indicators;
196 
201  std::size_t
203 
207  void clear();
208  };
209 
217  template <int dim, typename number>
218  void fill_active_cell_data(const DoFHandler<dim> &dof_handler,
219  const DoFHandler<dim> &dof_handler_projection,
220  const Introspection<dim> &introspection,
221  const Quadrature<dim> &quadrature_formula,
222  const MaterialModel::Interface<dim> &material_model,
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,
228  const LinearAlgebra::BlockVector &current_linearization_point,
229  const MPI_Comm &mpi_comm,
230  ::LinearAlgebra::distributed::Vector<double> &active_viscosity_vector,
231  OperatorCellData<dim, number> &active_cell_data,
232  double &minimum_viscosity,
233  double &maximum_viscosity);
234 
238  template <int dim, int degree_v, typename number>
240  : public MatrixFreeOperators::Base<dim, ::LinearAlgebra::distributed::BlockVector<number>>
241  {
242  public:
243 
248 
252  void clear () override;
253 
258 
264  void compute_diagonal () override;
265 
266  private:
267 
273  const ::LinearAlgebra::distributed::BlockVector<number> &src) const override;
274 
278  void local_apply (const ::MatrixFree<dim, number> &data,
280  const ::LinearAlgebra::distributed::BlockVector<number> &src,
281  const std::pair<unsigned int, unsigned int> &cell_range) const;
282 
286  void local_apply_face (const ::MatrixFree<dim, number> &data,
288  const ::LinearAlgebra::distributed::BlockVector<number> &src,
289  const std::pair<unsigned int, unsigned int> &face_range) const;
290 
294  void local_apply_boundary_face (const ::MatrixFree<dim, number> &data,
296  const ::LinearAlgebra::distributed::BlockVector<number> &src,
297  const std::pair<unsigned int, unsigned int> &face_range) const;
298 
303  };
304 
305 
306 
310  template <int dim, int degree_v, typename number>
312  : public MatrixFreeOperators::Base<dim, ::LinearAlgebra::distributed::BlockVector<number>>
313  {
314  public:
315 
320 
324  void clear () override;
325 
330 
336  void compute_diagonal () override;
337 
338  private:
339 
345  const ::LinearAlgebra::distributed::BlockVector<number> &src) const override;
346 
350  void local_apply (const ::MatrixFree<dim, number> &data,
352  const ::LinearAlgebra::distributed::BlockVector<number> &src,
353  const std::pair<unsigned int, unsigned int> &cell_range) const;
354 
358  void local_apply_face (const ::MatrixFree<dim, number> &data,
360  const ::LinearAlgebra::distributed::BlockVector<number> &src,
361  const std::pair<unsigned int, unsigned int> &face_range) const;
362 
367  };
368 
369 
370 
374  template <int dim, int degree_p, typename number>
376  : public MatrixFreeOperators::Base<dim, ::LinearAlgebra::distributed::Vector<number>>
377  {
378  public:
379 
384 
388  void clear () override;
389 
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);
401 
406 
412  void compute_diagonal () override;
413 
414  private:
415 
421  const ::LinearAlgebra::distributed::Vector<number> &src) const override;
422 
426  void local_apply (const ::MatrixFree<dim, number> &data,
428  const ::LinearAlgebra::distributed::Vector<number> &src,
429  const std::pair<unsigned int, unsigned int> &cell_range) const;
430 
435  degree_p,
436  degree_p+2,
437  1,
438  number> &pressure) const;
439 
444  };
445 
450  template <int dim, int degree_v, typename number>
452  : public MatrixFreeOperators::Base<dim, ::LinearAlgebra::distributed::Vector<number>>
453  {
454  public:
455 
460 
464  void clear () override;
465 
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);
481 
487  void compute_diagonal () override;
488 
494  void set_diagonal (const ::LinearAlgebra::distributed::Vector<number> &diag);
495 
496  private:
502  degree_v,
503  degree_v+1,
504  dim,
505  number> &velocity) const;
506 
512  degree_v,
513  degree_v+1,
514  dim,
515  number> &velocity) const;
516 
523  const ::LinearAlgebra::distributed::Vector<number> &src) const override;
524 
528  void local_apply (const ::MatrixFree<dim, number> &data,
530  const ::LinearAlgebra::distributed::Vector<number> &src,
531  const std::pair<unsigned int, unsigned int> &cell_range) const;
532 
537  };
538  }
539 
540 }
541 
542 #endif
std::shared_ptr< const MatrixFree< dim, value_type, VectorizedArrayType > > data
void apply_add(::LinearAlgebra::distributed::Vector< number > &dst, const ::LinearAlgebra::distributed::Vector< number > &src) const override
const OperatorCellData< dim, number > * cell_data
void cell_operation(FEEvaluation< dim, degree_v, degree_v+1, dim, number > &velocity) const
void set_cell_data(const OperatorCellData< dim, number > &data)
void reinit(const Mapping< dim > &mapping, const DoFHandler< dim > &dof_handler_v, const DoFHandler< dim > &dof_handler_p, const AffineConstraints< number > &constraints_v, const AffineConstraints< number > &constraints_p, std::shared_ptr< MatrixFree< dim, double >> mf_storage, const unsigned int level=numbers::invalid_unsigned_int)
void set_diagonal(const ::LinearAlgebra::distributed::Vector< number > &diag)
void inner_cell_operation(FEEvaluation< dim, degree_v, degree_v+1, dim, number > &velocity) const
void local_apply(const ::MatrixFree< dim, number > &data, ::LinearAlgebra::distributed::Vector< number > &dst, const ::LinearAlgebra::distributed::Vector< number > &src, const std::pair< unsigned int, unsigned int > &cell_range) const
void local_apply(const ::MatrixFree< dim, number > &data, ::LinearAlgebra::distributed::BlockVector< number > &dst, const ::LinearAlgebra::distributed::BlockVector< number > &src, const std::pair< unsigned int, unsigned int > &cell_range) const
void set_cell_data(const OperatorCellData< dim, number > &data)
const OperatorCellData< dim, number > * cell_data
void local_apply_face(const ::MatrixFree< dim, number > &data, ::LinearAlgebra::distributed::BlockVector< number > &dst, const ::LinearAlgebra::distributed::BlockVector< number > &src, const std::pair< unsigned int, unsigned int > &face_range) const
void apply_add(::LinearAlgebra::distributed::BlockVector< number > &dst, const ::LinearAlgebra::distributed::BlockVector< number > &src) const override
void apply_add(::LinearAlgebra::distributed::Vector< number > &dst, const ::LinearAlgebra::distributed::Vector< number > &src) const override
void reinit(const Mapping< dim > &mapping, const DoFHandler< dim > &dof_handler_v, const DoFHandler< dim > &dof_handler_p, const AffineConstraints< number > &constraints_v, const AffineConstraints< number > &constraints_p, std::shared_ptr< MatrixFree< dim, double >> mf_storage, const unsigned int level=numbers::invalid_unsigned_int)
void inner_cell_operation(FEEvaluation< dim, degree_p, degree_p+2, 1, number > &pressure) const
void set_cell_data(const OperatorCellData< dim, number > &data)
void local_apply(const ::MatrixFree< dim, number > &data, ::LinearAlgebra::distributed::Vector< number > &dst, const ::LinearAlgebra::distributed::Vector< number > &src, const std::pair< unsigned int, unsigned int > &cell_range) const
const OperatorCellData< dim, number > * cell_data
void apply_add(::LinearAlgebra::distributed::BlockVector< number > &dst, const ::LinearAlgebra::distributed::BlockVector< number > &src) const override
void set_cell_data(const OperatorCellData< dim, number > &data)
void local_apply_face(const ::MatrixFree< dim, number > &data, ::LinearAlgebra::distributed::BlockVector< number > &dst, const ::LinearAlgebra::distributed::BlockVector< number > &src, const std::pair< unsigned int, unsigned int > &face_range) const
void local_apply_boundary_face(const ::MatrixFree< dim, number > &data, ::LinearAlgebra::distributed::BlockVector< number > &dst, const ::LinearAlgebra::distributed::BlockVector< number > &src, const std::pair< unsigned int, unsigned int > &face_range) const
void local_apply(const ::MatrixFree< dim, number > &data, ::LinearAlgebra::distributed::BlockVector< number > &dst, const ::LinearAlgebra::distributed::BlockVector< number > &src, const std::pair< unsigned int, unsigned int > &cell_range) const
const OperatorCellData< dim, number > * cell_data
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)
void copy(aspect::LinearAlgebra::Vector &out, const ::LinearAlgebra::distributed::Vector< double > &in)
constexpr unsigned int invalid_unsigned_int
Table< 2, SymmetricTensor< 2, dim, VectorizedArray< number > > > dilation_derivative_wrt_strain_rate_table
std::set< types::boundary_id > free_surface_boundary_indicators
Table< 2, SymmetricTensor< 2, dim, VectorizedArray< number > > > newton_factor_wrt_strain_rate_table
Table< 2, Tensor< 1, dim, VectorizedArray< number > > > free_surface_stabilization_term_table
Table< 2, SymmetricTensor< 2, dim, VectorizedArray< number > > > strain_rate_table
Table< 2, VectorizedArray< number > > dilation_lhs_term_table
Table< 2, VectorizedArray< number > > dilation_derivative_wrt_pressure_table
Table< 2, VectorizedArray< number > > newton_factor_wrt_pressure_table