PRISMS-PF Manual
Loading...
Searching...
No Matches
MFOperator< dim, degree, number > Class Template Reference

This class exists to evaluate a single user-defined operator for the matrix-free implementation of some PDE. More...

#include <mf_operator.h>

Inheritance diagram for MFOperator< dim, degree, number >:
[legend]
Collaboration diagram for MFOperator< dim, degree, number >:
[legend]

Public Types

using ScalarValue = dealii::VectorizedArray<number>
 
using VectorValue = dealii::Tensor<1, dim, ScalarValue>
 
using Operator
 
template<TensorRank Rank>
using Value
 

Public Member Functions

 MFOperator ()=default
 Constructor.
 
void init (const PDEOperatorBase< dim, degree, number > &operator_owner, Operator oper, std::vector< FieldAttributes > _field_attributes, const SolutionIndexer< dim, number > &_solution_indexer, const MatrixFreeManager< dim, number > &_matrix_free_manager, const SimulationTimer &_sim_timer, SolveBlock _solve_block, DependencyMap _dependency_map)
 Initialize.
 
void set_relative_level (unsigned int _relative_level)
 
void compute_operator (BlockVector< number > &dst, const BlockVector< number > &src=BlockVector< number >()) const
 Calls cell_loop on function that calls user-defined operator.
 
void compute_diagonal (BlockVector< number > &dst, const BlockVector< number > &src) const
 Compute the diagonal of this operator.
 
void set_scaling_diagonal (bool scale, const std::vector< const SolutionVector< number > * > &diagonal)
 Set scaling diagonal.
 
dealii::types::global_dof_index m () const
 Return the number of DoFs.
 
number el (const unsigned int &row, const unsigned int &col) const
 Return the value of the matrix entry. This function is only valid when row == col and when the diagonal is initialized. Additionally, this is only used so that we may compile. Trying to use this function will throw an error.
 
void clear ()
 Release all memory and return to state like having called the default constructor.
 
const MatrixFree< dim, number > * get_matrix_free () const
 Get read access to the MatrixFree<dim, number> object stored with this operator.
 
const std::shared_ptr< dealii::DiagonalMatrix< BlockVector< number > > > & get_matrix_diagonal_inverse () const
 Get read access to the inverse diagonal of this operator.
 
void vmult (BlockVector< number > &dst, const BlockVector< number > &src) const
 Matrix-vector multiplication.
 
void Tvmult (BlockVector< number > &dst, const BlockVector< number > &src) const
 Transpose matrix-vector multiplication.
 
void reinit_matrix_diagonal ()
 Reinit diagonal matrix to have the correct shape.
 
void eval_matrix_diagonal ()
 Evaluate matrix diagonal (and inverse).
 

Static Public Member Functions

template<TensorRank Rank>
static Value< Rank > identity ()
 
template<TensorRank Rank>
static Value< Rank > zero ()
 

Public Attributes

bool read_plain = false
 Whether to read plain dof values from src, otherwise applies homogeneous part of constraints to the read of src.
 

Private Member Functions

void compute_local_operator (const MatrixFree< dim, number > &_data, BlockVector< number > &dst, const BlockVector< number > &src, const std::pair< unsigned int, unsigned int > &cell_range) const
 Calls user-defined operator.
 
void compute_local_diagonal (const MatrixFree< dim, number > &_data, BlockVector< number > &diagonal, const BlockVector< number > &dummy_src, const std::pair< unsigned int, unsigned int > &cell_range) const
 Local computation of the diagonal of the operator.
 
template<TensorRank Rank>
void compute_local_field_diagonal (FieldContainer< dim, degree, number > &variable_list, BlockVector< number > &diagonal, unsigned int field_index) const
 

Private Attributes

std::vector< FieldAttributesfield_attributes
 The attribute list of the relevant variables.
 
SolveBlock solve_block
 The block being solved.
 
const PDEOperatorBase< dim, degree, number > * pde_operator = nullptr
 PDE operator object (owning class instance of pde_op) for user defined PDEs.
 
Operator pde_op = nullptr
 The actual PDE operator function ptr (eg. compute_rhs) for user defined PDEs.
 
const SolutionIndexer< dim, number > * solution_indexer = nullptr
 Read-access to fields.
 
const MatrixFreeManager< dim, number > * matrix_free_manager = nullptr
 Matrix-free manager.
 
const MatrixFree< dim, number > * data = nullptr
 Matrix-free object.
 
unsigned int relative_level = -1
 Level so that correct fields are read from indexer.
 
DependencyMap dependency_map
 Which fields should be available to the solve.
 
const SimulationTimersim_timer = nullptr
 Simulation timer.
 
std::vector< const SolutionVector< number > * > scaling_diagonal
 Result of operator gets scaled by this (invm for explicit fields)
 
bool scale_by_diagonal = false
 Whether or not to scale after operator result.
 
std::vector< unsigned int > field_to_block_index
 Mapping from field index to block index (only for dst).
 
std::vector< std::vector< unsigned int > > edge_constrained_indices
 Indices of DoFs on edge in case the operator is used in GMG context.
 
std::shared_ptr< dealii::DiagonalMatrix< BlockVector< number > > > diagonal_entries
 The diagonal matrix.
 
std::shared_ptr< dealii::DiagonalMatrix< BlockVector< number > > > inverse_diagonal_entries
 The inverse diagonal matrix.
 

Detailed Description

template<unsigned int dim, unsigned int degree, typename number>
class MFOperator< dim, degree, number >

This class exists to evaluate a single user-defined operator for the matrix-free implementation of some PDE.

Note
Information such as the pde operator are passed in at construction/initialization rather than being passed in during function calls because in certain contexts (eg. GMG,) the operator gets called by a dealii function, rather than by prismspf, so it needs to act as a standalone operator.
Template Parameters
dimThe number of dimensions in the problem.
degreeThe polynomial degree of the shape functions.
numberDatatype to use for LinearAlgebra::distributed::Vector<number>. Either double or float.

Member Typedef Documentation

◆ Operator

template<unsigned int dim, unsigned int degree, typename number>
using MFOperator< dim, degree, number >::Operator
Initial value:
const SimulationTimer &,
unsigned int
) const
This class permits the access of a subset of indexed fields and gives an error if any non-allowed fie...
Definition field_container.h:47
This class contains the user implementation of each PDE operator.
Definition pde_operator_base.h:27
Definition simulation_timer.h:13

◆ ScalarValue

template<unsigned int dim, unsigned int degree, typename number>
using MFOperator< dim, degree, number >::ScalarValue = dealii::VectorizedArray<number>

◆ Value

template<unsigned int dim, unsigned int degree, typename number>
template<TensorRank Rank>
using MFOperator< dim, degree, number >::Value
Initial value:
std::conditional_t<Rank == TensorRank::Scalar || dim == 1,
dealii::Tensor<int(Rank), dim, ScalarValue>>
dealii::VectorizedArray< number > ScalarValue
Typedef for the basic value that the user manipulates.
Definition field_container.h:52
@ Scalar
Definition type_enums.h:54

◆ VectorValue

template<unsigned int dim, unsigned int degree, typename number>
using MFOperator< dim, degree, number >::VectorValue = dealii::Tensor<1, dim, ScalarValue>

Constructor & Destructor Documentation

◆ MFOperator()

template<unsigned int dim, unsigned int degree, typename number>
MFOperator< dim, degree, number >::MFOperator ( )
default

Constructor.

Member Function Documentation

◆ clear()

template<unsigned int dim, unsigned int degree, typename number>
void MFOperator< dim, degree, number >::clear ( )

Release all memory and return to state like having called the default constructor.

◆ compute_diagonal()

template<unsigned int dim, unsigned int degree, typename number>
void MFOperator< dim, degree, number >::compute_diagonal ( BlockVector< number > & dst,
const BlockVector< number > & src ) const

Compute the diagonal of this operator.

◆ compute_local_diagonal()

template<unsigned int dim, unsigned int degree, typename number>
void MFOperator< dim, degree, number >::compute_local_diagonal ( const MatrixFree< dim, number > & _data,
BlockVector< number > & diagonal,
const BlockVector< number > & dummy_src,
const std::pair< unsigned int, unsigned int > & cell_range ) const
private

Local computation of the diagonal of the operator.

◆ compute_local_field_diagonal()

template<unsigned int dim, unsigned int degree, typename number>
template<TensorRank Rank>
void MFOperator< dim, degree, number >::compute_local_field_diagonal ( FieldContainer< dim, degree, number > & variable_list,
BlockVector< number > & diagonal,
unsigned int field_index ) const
private

◆ compute_local_operator()

template<unsigned int dim, unsigned int degree, typename number>
void MFOperator< dim, degree, number >::compute_local_operator ( const MatrixFree< dim, number > & _data,
BlockVector< number > & dst,
const BlockVector< number > & src,
const std::pair< unsigned int, unsigned int > & cell_range ) const
private

Calls user-defined operator.

Precondition
dst is not ghosted

◆ compute_operator()

template<unsigned int dim, unsigned int degree, typename number>
PRISMS_PF_BEGIN_NAMESPACE void MFOperator< dim, degree, number >::compute_operator ( BlockVector< number > & dst,
const BlockVector< number > & src = BlockVector<number>() ) const

Calls cell_loop on function that calls user-defined operator.

Precondition
dst is not ghosted

◆ el()

template<unsigned int dim, unsigned int degree, typename number>
number MFOperator< dim, degree, number >::el ( const unsigned int & row,
const unsigned int & col ) const

Return the value of the matrix entry. This function is only valid when row == col and when the diagonal is initialized. Additionally, this is only used so that we may compile. Trying to use this function will throw an error.

◆ eval_matrix_diagonal()

template<unsigned int dim, unsigned int degree, typename number>
void MFOperator< dim, degree, number >::eval_matrix_diagonal ( )

Evaluate matrix diagonal (and inverse).

◆ get_matrix_diagonal_inverse()

template<unsigned int dim, unsigned int degree, typename number>
const std::shared_ptr< dealii::DiagonalMatrix< BlockVector< number > > > & MFOperator< dim, degree, number >::get_matrix_diagonal_inverse ( ) const

Get read access to the inverse diagonal of this operator.

◆ get_matrix_free()

template<unsigned int dim, unsigned int degree, typename number>
const MatrixFree< dim, number > * MFOperator< dim, degree, number >::get_matrix_free ( ) const

Get read access to the MatrixFree<dim, number> object stored with this operator.

◆ identity()

template<unsigned int dim, unsigned int degree, typename number>
template<TensorRank Rank>
static Value< Rank > MFOperator< dim, degree, number >::identity ( )
inlinestatic

◆ init()

template<unsigned int dim, unsigned int degree, typename number>
void MFOperator< dim, degree, number >::init ( const PDEOperatorBase< dim, degree, number > & operator_owner,
Operator oper,
std::vector< FieldAttributes > _field_attributes,
const SolutionIndexer< dim, number > & _solution_indexer,
const MatrixFreeManager< dim, number > & _matrix_free_manager,
const SimulationTimer & _sim_timer,
SolveBlock _solve_block,
DependencyMap _dependency_map )
inline

Initialize.

Precondition
MatrixFreeManager and SolutionIndexer have been initialized.

◆ m()

template<unsigned int dim, unsigned int degree, typename number>
dealii::types::global_dof_index MFOperator< dim, degree, number >::m ( ) const

Return the number of DoFs.

◆ reinit_matrix_diagonal()

template<unsigned int dim, unsigned int degree, typename number>
void MFOperator< dim, degree, number >::reinit_matrix_diagonal ( )

Reinit diagonal matrix to have the correct shape.

◆ set_relative_level()

template<unsigned int dim, unsigned int degree, typename number>
void MFOperator< dim, degree, number >::set_relative_level ( unsigned int _relative_level)
inline

◆ set_scaling_diagonal()

template<unsigned int dim, unsigned int degree, typename number>
void MFOperator< dim, degree, number >::set_scaling_diagonal ( bool scale,
const std::vector< const SolutionVector< number > * > & diagonal )
inline

Set scaling diagonal.

◆ Tvmult()

template<unsigned int dim, unsigned int degree, typename number>
void MFOperator< dim, degree, number >::Tvmult ( BlockVector< number > & dst,
const BlockVector< number > & src ) const

Transpose matrix-vector multiplication.

◆ vmult()

template<unsigned int dim, unsigned int degree, typename number>
void MFOperator< dim, degree, number >::vmult ( BlockVector< number > & dst,
const BlockVector< number > & src ) const

Matrix-vector multiplication.

Note
requires dst is not ghosted

◆ zero()

template<unsigned int dim, unsigned int degree, typename number>
template<TensorRank Rank>
static Value< Rank > MFOperator< dim, degree, number >::zero ( )
inlinestatic

Member Data Documentation

◆ data

template<unsigned int dim, unsigned int degree, typename number>
const MatrixFree<dim, number>* MFOperator< dim, degree, number >::data = nullptr
private

Matrix-free object.

◆ dependency_map

template<unsigned int dim, unsigned int degree, typename number>
DependencyMap MFOperator< dim, degree, number >::dependency_map
private

Which fields should be available to the solve.

◆ diagonal_entries

template<unsigned int dim, unsigned int degree, typename number>
std::shared_ptr<dealii::DiagonalMatrix<BlockVector<number> > > MFOperator< dim, degree, number >::diagonal_entries
private
Initial value:
=
std::make_shared<dealii::DiagonalMatrix<BlockVector<number>>>()

The diagonal matrix.

◆ edge_constrained_indices

template<unsigned int dim, unsigned int degree, typename number>
std::vector<std::vector<unsigned int> > MFOperator< dim, degree, number >::edge_constrained_indices
private

Indices of DoFs on edge in case the operator is used in GMG context.

◆ field_attributes

template<unsigned int dim, unsigned int degree, typename number>
std::vector<FieldAttributes> MFOperator< dim, degree, number >::field_attributes
private

The attribute list of the relevant variables.

◆ field_to_block_index

template<unsigned int dim, unsigned int degree, typename number>
std::vector<unsigned int> MFOperator< dim, degree, number >::field_to_block_index
private

Mapping from field index to block index (only for dst).

◆ inverse_diagonal_entries

template<unsigned int dim, unsigned int degree, typename number>
std::shared_ptr<dealii::DiagonalMatrix<BlockVector<number> > > MFOperator< dim, degree, number >::inverse_diagonal_entries
private
Initial value:
=
std::make_shared<dealii::DiagonalMatrix<BlockVector<number>>>()

The inverse diagonal matrix.

◆ matrix_free_manager

template<unsigned int dim, unsigned int degree, typename number>
const MatrixFreeManager<dim, number>* MFOperator< dim, degree, number >::matrix_free_manager = nullptr
private

Matrix-free manager.

◆ pde_op

template<unsigned int dim, unsigned int degree, typename number>
Operator MFOperator< dim, degree, number >::pde_op = nullptr
private

The actual PDE operator function ptr (eg. compute_rhs) for user defined PDEs.

◆ pde_operator

template<unsigned int dim, unsigned int degree, typename number>
const PDEOperatorBase<dim, degree, number>* MFOperator< dim, degree, number >::pde_operator = nullptr
private

PDE operator object (owning class instance of pde_op) for user defined PDEs.

◆ read_plain

template<unsigned int dim, unsigned int degree, typename number>
bool MFOperator< dim, degree, number >::read_plain = false

Whether to read plain dof values from src, otherwise applies homogeneous part of constraints to the read of src.

◆ relative_level

template<unsigned int dim, unsigned int degree, typename number>
unsigned int MFOperator< dim, degree, number >::relative_level = -1
private

Level so that correct fields are read from indexer.

◆ scale_by_diagonal

template<unsigned int dim, unsigned int degree, typename number>
bool MFOperator< dim, degree, number >::scale_by_diagonal = false
private

Whether or not to scale after operator result.

◆ scaling_diagonal

template<unsigned int dim, unsigned int degree, typename number>
std::vector<const SolutionVector<number> *> MFOperator< dim, degree, number >::scaling_diagonal
private

Result of operator gets scaled by this (invm for explicit fields)

◆ sim_timer

template<unsigned int dim, unsigned int degree, typename number>
const SimulationTimer* MFOperator< dim, degree, number >::sim_timer = nullptr
private

Simulation timer.

◆ solution_indexer

template<unsigned int dim, unsigned int degree, typename number>
const SolutionIndexer<dim, number>* MFOperator< dim, degree, number >::solution_indexer = nullptr
private

Read-access to fields.

◆ solve_block

template<unsigned int dim, unsigned int degree, typename number>
SolveBlock MFOperator< dim, degree, number >::solve_block
private

The block being solved.


The documentation for this class was generated from the following files: