Discontinuous Galerkin Library
#include "dg/algorithm.h"
dg::Elliptic1d< Geometry, Matrix, Container > Class Template Reference

A 1d negative elliptic differential operator \( -\partial_x ( \chi \partial_x ) \). More...

Public Types

using geometry_type = Geometry
 
using matrix_type = Matrix
 
using container_type = Container
 
using value_type = get_value_type< Container >
 

Public Member Functions

 Elliptic1d ()=default
 empty object ( no memory allocation) More...
 
 Elliptic1d (const Geometry &g, direction dir=forward, value_type jfactor=1.)
 Construct from Grid. More...
 
 Elliptic1d (const Geometry &g, bc bcx, direction dir=forward, value_type jfactor=1.)
 Construct from grid and boundary conditions. More...
 
template<class ... Params>
void construct (Params &&...ps)
 Perfect forward parameters to one of the constructors. More...
 
template<class ContainerType0 >
void set_chi (const ContainerType0 &sigma)
 Change scalar part Chi. More...
 
const Container & weights () const
 Return the weights making the operator self-adjoint. More...
 
const Container & precond () const
 Return the default preconditioner to use in conjugate gradient. More...
 
void set_jfactor (value_type new_jfactor)
 Set the currently used jfactor ( \( \alpha \)) More...
 
value_type get_jfactor () const
 Get the currently used jfactor ( \( \alpha \)) More...
 
template<class ContainerType0 , class ContainerType1 >
void operator() (const ContainerType0 &x, ContainerType1 &y)
 Compute elliptic term and store in output. More...
 
template<class ContainerType0 , class ContainerType1 >
void symv (const ContainerType0 &x, ContainerType1 &y)
 Compute elliptic term and store in output. More...
 
template<class ContainerType0 , class ContainerType1 >
void symv (value_type alpha, const ContainerType0 &x, value_type beta, ContainerType1 &y)
 Compute elliptic term and add to output. More...
 

Detailed Description

template<class Geometry, class Matrix, class Container>
class dg::Elliptic1d< Geometry, Matrix, Container >

A 1d negative elliptic differential operator \( -\partial_x ( \chi \partial_x ) \).

The term discretized is

\[ -\partial_x ( \chi \partial_x ) \]

where \( \partial_x \) is the one-dimensional derivative and \(\chi\) is a scalar function Per default, \( \chi = 1\) but you can set it to any value you like (in order for the operator to be invertible \(\chi\) should be strictly positive though).

See also
Our theory guide Introduction to dg methods on overleaf holds a detailed derivation

Note that the local discontinuous Galerkin discretization adds so-called jump terms

\[ D^\dagger \chi D + \alpha\chi_{on/off} J \]

where \(\alpha\) is a scale factor ( = jfactor), \( D \) contains the discretizations of the above derivatives, and \( J\) is a self-adjoint matrix. ( \(J\) is added before the volume element is divided). The adjoint of a matrix is defined with respect to the volume element including dG weights. Usually the default \( \alpha=1 \) is a good choice. However, in some cases, e.g. when \( \sigma \) exhibits very large variations \( \alpha=0.1\) or \( \alpha=0.01\) might be better values. In a time dependent problem the value of \(\alpha\) determines the numerical diffusion, i.e. for too low values numerical oscillations may appear. The \( \chi_{on/off} \) in the jump term serves to weight the jump term with \( \chi \). This can be switched either on or off with off being the default. Also note that a forward discretization has more diffusion than a centered discretization.

Template Parameters
GeometryA type that is or derives from one of the abstract geometry base classes ( aGeometry2d, aGeometry3d, aMPIGeometry2d, ...). Geometry determines which Matrix and Container types can be used:
MatrixA class for which the dg::blas2::symv functions are callable in connection with the Container class and to which the return type of dg::create::dx() can be converted using dg::blas2::transfer. The Matrix type can be one of:
ContainerA data container class for which the blas1 functionality is overloaded and to which the return type of blas1::subroutine() can be converted using dg::assign. We assume that Container is copyable/assignable and has a swap member function. In connection with Geometry this is one of
Note
The constructors initialize \( \chi=1\) so that a negative laplacian operator results
The inverse of \( \chi\) makes a good general purpose preconditioner
Attention
Pay attention to the negative sign which is necessary to make the matrix positive definite

Member Typedef Documentation

◆ container_type

template<class Geometry , class Matrix , class Container >
using dg::Elliptic1d< Geometry, Matrix, Container >::container_type = Container

◆ geometry_type

template<class Geometry , class Matrix , class Container >
using dg::Elliptic1d< Geometry, Matrix, Container >::geometry_type = Geometry

◆ matrix_type

template<class Geometry , class Matrix , class Container >
using dg::Elliptic1d< Geometry, Matrix, Container >::matrix_type = Matrix

◆ value_type

template<class Geometry , class Matrix , class Container >
using dg::Elliptic1d< Geometry, Matrix, Container >::value_type = get_value_type<Container>

Constructor & Destructor Documentation

◆ Elliptic1d() [1/3]

template<class Geometry , class Matrix , class Container >
dg::Elliptic1d< Geometry, Matrix, Container >::Elliptic1d ( )
default

empty object ( no memory allocation)

◆ Elliptic1d() [2/3]

template<class Geometry , class Matrix , class Container >
dg::Elliptic1d< Geometry, Matrix, Container >::Elliptic1d ( const Geometry &  g,
direction  dir = forward,
value_type  jfactor = 1. 
)
inline

Construct from Grid.

Parameters
gThe Grid, boundary conditions are taken from here
dirDirection of the right first derivative in x (i.e. dg::forward, dg::backward or dg::centered),
jfactor( \( = \alpha \) ) scale jump terms (1 is a good value but in some cases 0.1 or 0.01 might be better)
Note
chi is one by default

◆ Elliptic1d() [3/3]

template<class Geometry , class Matrix , class Container >
dg::Elliptic1d< Geometry, Matrix, Container >::Elliptic1d ( const Geometry &  g,
bc  bcx,
direction  dir = forward,
value_type  jfactor = 1. 
)
inline

Construct from grid and boundary conditions.

Parameters
gThe Grid
bcxboundary condition in x
dirDirection of the right first derivative in x (i.e. dg::forward, dg::backward or dg::centered),
jfactor( \( = \alpha \) ) scale jump terms (1 is a good value but in some cases 0.1 or 0.01 might be better)
Note
chi is one by default

Member Function Documentation

◆ construct()

template<class Geometry , class Matrix , class Container >
template<class ... Params>
void dg::Elliptic1d< Geometry, Matrix, Container >::construct ( Params &&...  ps)
inline

Perfect forward parameters to one of the constructors.

Template Parameters
Paramsdeduced by the compiler
Parameters
psparameters forwarded to constructors

◆ get_jfactor()

template<class Geometry , class Matrix , class Container >
value_type dg::Elliptic1d< Geometry, Matrix, Container >::get_jfactor ( ) const
inline

Get the currently used jfactor ( \( \alpha \))

Returns
The current scale factor for jump terms

◆ operator()()

template<class Geometry , class Matrix , class Container >
template<class ContainerType0 , class ContainerType1 >
void dg::Elliptic1d< Geometry, Matrix, Container >::operator() ( const ContainerType0 &  x,
ContainerType1 &  y 
)
inline

Compute elliptic term and store in output.

i.e. y=M*x

Parameters
xleft-hand-side
yresult
Template Parameters
ContainerTypesmust be usable with Container in The dg dispatch system

◆ precond()

template<class Geometry , class Matrix , class Container >
const Container & dg::Elliptic1d< Geometry, Matrix, Container >::precond ( ) const
inline

Return the default preconditioner to use in conjugate gradient.

Currently returns 1 divided by the scalar part \( \sigma\). This is especially good when \( \sigma\) exhibits large amplitudes or variations

Returns
the inverse of \(\sigma\).

◆ set_chi()

template<class Geometry , class Matrix , class Container >
template<class ContainerType0 >
void dg::Elliptic1d< Geometry, Matrix, Container >::set_chi ( const ContainerType0 &  sigma)
inline

Change scalar part Chi.

Parameters
sigmaThe new scalar part \(\chi\)
Attention
If some or all elements of sigma are zero the preconditioner is invalidated and the operator can no longer be inverted (due to divide by zero) until set_chi is called with a positive sigma again. The symv function can always be called, however, if sigma is zero you likely also want to set the jfactor to 0 because the jumps in phi may not vanish and then pollute the result.
Template Parameters
ContainerType0must be usable with Container in The dg dispatch system

◆ set_jfactor()

template<class Geometry , class Matrix , class Container >
void dg::Elliptic1d< Geometry, Matrix, Container >::set_jfactor ( value_type  new_jfactor)
inline

Set the currently used jfactor ( \( \alpha \))

Parameters
new_jfactorThe new scale factor for jump terms

◆ symv() [1/2]

template<class Geometry , class Matrix , class Container >
template<class ContainerType0 , class ContainerType1 >
void dg::Elliptic1d< Geometry, Matrix, Container >::symv ( const ContainerType0 &  x,
ContainerType1 &  y 
)
inline

Compute elliptic term and store in output.

i.e. y=M*x

Parameters
xleft-hand-side
yresult
Template Parameters
ContainerTypesmust be usable with Container in The dg dispatch system

◆ symv() [2/2]

template<class Geometry , class Matrix , class Container >
template<class ContainerType0 , class ContainerType1 >
void dg::Elliptic1d< Geometry, Matrix, Container >::symv ( value_type  alpha,
const ContainerType0 &  x,
value_type  beta,
ContainerType1 &  y 
)
inline

Compute elliptic term and add to output.

i.e. y=alpha*M*x+beta*y

Parameters
alphaa scalar
xleft-hand-side
betaa scalar
yresult
Template Parameters
ContainerTypesmust be usable with Container in The dg dispatch system

◆ weights()

template<class Geometry , class Matrix , class Container >
const Container & dg::Elliptic1d< Geometry, Matrix, Container >::weights ( ) const
inline

Return the weights making the operator self-adjoint.

Returns
weights

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