SELF_Lagrange Module


Uses

  • module~~self_lagrange~3~~UsesGraph module~self_lagrange~3 SELF_Lagrange module~self_gpu SELF_GPU module~self_lagrange~3->module~self_gpu module~self_lagrange_t SELF_Lagrange_t module~self_lagrange~3->module~self_lagrange_t iso_fortran_env iso_fortran_env module~self_lagrange~3->iso_fortran_env iso_c_binding iso_c_binding module~self_lagrange~3->iso_c_binding module~self_constants SELF_Constants module~self_lagrange~3->module~self_constants module~self_gpu->iso_c_binding module~self_gpu_enums SELF_GPU_enums module~self_gpu->module~self_gpu_enums module~self_lagrange_t->iso_fortran_env module~self_lagrange_t->iso_c_binding module~self_lagrange_t->module~self_constants module~self_hdf5 SELF_HDF5 module~self_lagrange_t->module~self_hdf5 module~self_quadrature SELF_Quadrature module~self_lagrange_t->module~self_quadrature HDF5 HDF5 module~self_lagrange_t->HDF5 module~self_supportroutines SELF_SupportRoutines module~self_lagrange_t->module~self_supportroutines module~self_constants->iso_fortran_env module~self_constants->iso_c_binding module~self_gpu_enums->iso_c_binding module~self_hdf5->iso_fortran_env module~self_hdf5->module~self_constants module~self_hdf5->HDF5 mpi mpi module~self_hdf5->mpi module~self_quadrature->iso_fortran_env module~self_quadrature->module~self_constants module~self_supportroutines->iso_fortran_env module~self_supportroutines->module~self_constants

Used by

  • module~~self_lagrange~3~~UsedByGraph module~self_lagrange~3 SELF_Lagrange module~self_mappedscalar_3d_t SELF_MappedScalar_3D_t module~self_mappedscalar_3d_t->module~self_lagrange~3 module~self_geometry_3d SELF_Geometry_3D module~self_mappedscalar_3d_t->module~self_geometry_3d module~self_tensor_3d~2 SELF_Tensor_3D module~self_mappedscalar_3d_t->module~self_tensor_3d~2 module~self_mesh_3d~2 SELF_Mesh_3D module~self_mappedscalar_3d_t->module~self_mesh_3d~2 module~self_domaindecomposition~2 SELF_DomainDecomposition module~self_mappedscalar_3d_t->module~self_domaindecomposition~2 module~self_scalar_3d SELF_Scalar_3D module~self_mappedscalar_3d_t->module~self_scalar_3d module~self_mesh_3d_t SELF_Mesh_3D_t module~self_mesh_3d_t->module~self_lagrange~3 module~self_mesh_3d_t->module~self_domaindecomposition~2 module~self_mesh SELF_Mesh module~self_mesh_3d_t->module~self_mesh module~self_tensor_3d_t SELF_Tensor_3D_t module~self_tensor_3d_t->module~self_lagrange~3 module~self_data SELF_Data module~self_tensor_3d_t->module~self_data module~self_mesh_2d_t SELF_Mesh_2D_t module~self_mesh_2d_t->module~self_lagrange~3 module~self_mesh_2d_t->module~self_domaindecomposition~2 module~self_mesh_2d_t->module~self_mesh module~self_domaindecomposition_t SELF_DomainDecomposition_t module~self_domaindecomposition_t->module~self_lagrange~3 module~self_geometry_1d SELF_Geometry_1D module~self_geometry_1d->module~self_lagrange~3 module~self_mesh_1d SELF_Mesh_1D module~self_geometry_1d->module~self_mesh_1d module~self_geometry_1d->module~self_data module~self_scalar_1d~3 SELF_Scalar_1D module~self_geometry_1d->module~self_scalar_1d~3 module~self_scalar_3d_t SELF_Scalar_3D_t module~self_scalar_3d_t->module~self_lagrange~3 module~self_scalar_3d_t->module~self_data module~self_geometry_2d SELF_Geometry_2D module~self_geometry_2d->module~self_lagrange~3 module~self_geometry_2d->module~self_data module~self_mesh_2d SELF_Mesh_2D module~self_geometry_2d->module~self_mesh_2d module~self_scalar_2d SELF_Scalar_2D module~self_geometry_2d->module~self_scalar_2d module~self_vector_2d~2 SELF_Vector_2D module~self_geometry_2d->module~self_vector_2d~2 module~self_tensor_2d SELF_Tensor_2D module~self_geometry_2d->module~self_tensor_2d module~self_mappedscalar_2d_t SELF_MappedScalar_2D_t module~self_mappedscalar_2d_t->module~self_lagrange~3 module~self_mappedscalar_2d_t->module~self_geometry_2d module~self_mappedscalar_2d_t->module~self_domaindecomposition~2 module~self_mappedscalar_2d_t->module~self_mesh_2d module~self_mappedscalar_2d_t->module~self_scalar_2d module~self_mappedscalar_2d_t->module~self_tensor_2d module~self_vector_3d_t SELF_Vector_3D_t module~self_vector_3d_t->module~self_lagrange~3 module~self_vector_3d_t->module~self_data module~self_geometry_3d->module~self_lagrange~3 module~self_geometry_3d->module~self_data module~self_geometry_3d->module~self_tensor_3d~2 module~self_geometry_3d->module~self_mesh_3d~2 module~self_vector_3d~2 SELF_Vector_3D module~self_geometry_3d->module~self_vector_3d~2 module~self_geometry_3d->module~self_scalar_3d module~self_scalar_1d_t SELF_Scalar_1D_t module~self_scalar_1d_t->module~self_lagrange~3 module~self_scalar_1d_t->module~self_data module~self_mesh_1d->module~self_lagrange~3 module~self_mesh_1d->module~self_data module~self_mesh_1d->module~self_scalar_1d~3 module~self_mesh_1d->module~self_mesh module~self_mappedvector_2d_t SELF_MappedVector_2D_t module~self_mappedvector_2d_t->module~self_lagrange~3 module~self_mappedvector_2d_t->module~self_geometry_2d module~self_mappedvector_2d_t->module~self_domaindecomposition~2 module~self_mappedvector_2d_t->module~self_mesh_2d module~self_mappedvector_2d_t->module~self_vector_2d~2 module~self_mappedvector_2d_t->module~self_tensor_2d module~self_scalar_2d_t SELF_Scalar_2D_t module~self_scalar_2d_t->module~self_lagrange~3 module~self_scalar_2d_t->module~self_data module~self_vector_2d_t SELF_Vector_2D_t module~self_vector_2d_t->module~self_lagrange~3 module~self_vector_2d_t->module~self_data module~self_mappedvector_3d_t SELF_MappedVector_3D_t module~self_mappedvector_3d_t->module~self_lagrange~3 module~self_mappedvector_3d_t->module~self_geometry_3d module~self_mappedvector_3d_t->module~self_mesh_3d~2 module~self_mappedvector_3d_t->module~self_domaindecomposition~2 module~self_data->module~self_lagrange~3 module~self_tensor_2d_t SELF_Tensor_2D_t module~self_tensor_2d_t->module~self_lagrange~3 module~self_tensor_2d_t->module~self_data module~self_mappedscalar_1d_t SELF_MappedScalar_1D_t module~self_mappedscalar_1d_t->module~self_lagrange~3 module~self_mappedscalar_1d_t->module~self_geometry_1d module~self_mappedscalar_1d_t->module~self_mesh_1d module~self_mappedscalar_1d_t->module~self_scalar_1d~3 module~self_tensor_3d~2->module~self_tensor_3d_t module~self_mesh_3d~2->module~self_mesh_3d_t module~self_domaindecomposition~2->module~self_domaindecomposition_t module~self_dgmodel1d_t SELF_DGModel1D_t module~self_dgmodel1d_t->module~self_mesh_1d module~self_mappedscalar_1d SELF_MappedScalar_1D module~self_dgmodel1d_t->module~self_mappedscalar_1d module~self_mappedvector_2d SELF_MappedVector_2D module~self_mappedvector_2d->module~self_mappedvector_2d_t module~self_mappedvector_2d~2 SELF_MappedVector_2D module~self_mappedvector_2d~2->module~self_mappedvector_2d_t module~self_mappedvector_3d~2 SELF_MappedVector_3D module~self_mappedvector_3d~2->module~self_mappedvector_3d_t module~self_mesh_2d->module~self_mesh_2d_t module~self_mappedscalar_2d~2 SELF_MappedScalar_2D module~self_mappedscalar_2d~2->module~self_mappedscalar_2d_t module~self_vector_3d~2->module~self_vector_3d_t module~self_dgmodel3d_t SELF_DGModel3D_t module~self_dgmodel3d_t->module~self_geometry_3d module~self_dgmodel3d_t->module~self_mesh_3d~2 module~self_mappedscalar_3d~2 SELF_MappedScalar_3D module~self_dgmodel3d_t->module~self_mappedscalar_3d~2 module~self_mappedvector_3d SELF_MappedVector_3D module~self_dgmodel3d_t->module~self_mappedvector_3d module~self_vector_2d SELF_Vector_2D module~self_vector_2d->module~self_vector_2d_t module~self_domaindecomposition SELF_DomainDecomposition module~self_domaindecomposition->module~self_domaindecomposition_t module~self_scalar_1d~2 SELF_Scalar_1D module~self_scalar_1d~2->module~self_scalar_1d_t module~self_scalar_2d->module~self_scalar_2d_t module~self_mappedscalar_1d~2 SELF_MappedScalar_1D module~self_mappedscalar_1d~2->module~self_mappedscalar_1d_t module~self_mesh_2d~2 SELF_Mesh_2D module~self_mesh_2d~2->module~self_mesh_2d_t module~self_scalar_1d SELF_Scalar_1D module~self_scalar_1d->module~self_scalar_1d_t module~self_vector_2d~2->module~self_vector_2d_t module~self_mesh_3d SELF_Mesh_3D module~self_mesh_3d->module~self_mesh_3d_t module~self_tensor_3d SELF_Tensor_3D module~self_tensor_3d->module~self_tensor_3d_t module~self_dgmodel2d_t SELF_DGModel2D_t module~self_dgmodel2d_t->module~self_geometry_2d module~self_dgmodel2d_t->module~self_mappedvector_2d module~self_dgmodel2d_t->module~self_mesh_2d module~self_dgmodel2d_t->module~self_mappedscalar_2d~2 module~self_scalar_1d~3->module~self_scalar_1d_t module~self_mappedscalar_3d SELF_MappedScalar_3D module~self_mappedscalar_3d->module~self_mappedscalar_3d_t module~self_scalar_3d->module~self_scalar_3d_t module~self_mappedscalar_2d SELF_MappedScalar_2D module~self_mappedscalar_2d->module~self_mappedscalar_2d_t module~self_vector_3d SELF_Vector_3D module~self_vector_3d->module~self_vector_3d_t module~self_tensor_2d->module~self_tensor_2d_t module~self_mappedscalar_1d->module~self_mappedscalar_1d_t module~self_mappedscalar_3d~2->module~self_mappedscalar_3d_t module~self_scalar_2d~2 SELF_Scalar_2D module~self_scalar_2d~2->module~self_scalar_2d_t module~self_tensor_2d~2 SELF_Tensor_2D module~self_tensor_2d~2->module~self_tensor_2d_t module~self_scalar_3d~2 SELF_Scalar_3D module~self_scalar_3d~2->module~self_scalar_3d_t module~self_dgmodel1d~2 SELF_DGModel1D module~self_dgmodel1d~2->module~self_mesh_1d module~self_dgmodel1d~2->module~self_dgmodel1d_t module~self_dgmodel1d~2->module~self_mappedscalar_1d module~self_mappedvector_3d->module~self_mappedvector_3d_t module~self_dgmodel1d SELF_DGModel1D module~self_dgmodel1d->module~self_dgmodel1d_t module~self_dgmodel3d SELF_DGModel3D module~self_dgmodel3d->module~self_dgmodel3d_t module~self_nulldgmodel1d_t self_NullDGModel1D_t module~self_nulldgmodel1d_t->module~self_dgmodel1d~2 module~self_nulldgmodel1d_t->module~self_mesh module~self_burgers1d_t self_Burgers1D_t module~self_burgers1d_t->module~self_dgmodel1d~2 module~self_burgers1d_t->module~self_mesh module~self_mesh->module~self_domaindecomposition~2 module~self_dgmodel2d SELF_DGModel2D module~self_dgmodel2d->module~self_dgmodel2d_t module~self_dgmodel3d~2 SELF_DGModel3D module~self_dgmodel3d~2->module~self_dgmodel3d_t module~self_dgmodel2d~2 SELF_DGModel2D module~self_dgmodel2d~2->module~self_dgmodel2d_t module~self_advection_diffusion_1d_t self_advection_diffusion_1d_t module~self_advection_diffusion_1d_t->module~self_dgmodel1d~2 module~self_advection_diffusion_1d_t->module~self_mesh module~self_advection_diffusion_1d self_advection_diffusion_1d module~self_advection_diffusion_1d->module~self_dgmodel1d~2 module~self_advection_diffusion_1d->module~self_advection_diffusion_1d_t module~self_nulldgmodel1d~2 self_NullDGModel1D module~self_nulldgmodel1d~2->module~self_nulldgmodel1d_t module~self_lineareuler3d_t self_LinearEuler3D_t module~self_lineareuler3d_t->module~self_mesh module~self_lineareuler3d_t->module~self_dgmodel3d~2 module~self_burgers1d~2 self_Burgers1D module~self_burgers1d~2->module~self_burgers1d_t module~self_advection_diffusion_2d_t self_advection_diffusion_2d_t module~self_advection_diffusion_2d_t->module~self_mesh module~self_advection_diffusion_2d_t->module~self_dgmodel2d module~self_nulldgmodel3d_t self_NullDGModel3D_t module~self_nulldgmodel3d_t->module~self_mesh module~self_nulldgmodel3d_t->module~self_dgmodel3d~2 module~self_lineareuler2d_t self_LinearEuler2D_t module~self_lineareuler2d_t->module~self_mesh module~self_lineareuler2d_t->module~self_dgmodel2d module~self_nulldgmodel1d self_NullDGModel1D module~self_nulldgmodel1d->module~self_nulldgmodel1d_t module~self_burgers1d self_Burgers1D module~self_burgers1d->module~self_burgers1d_t module~self_linearshallowwater2d_t self_LinearShallowWater2D_t module~self_linearshallowwater2d_t->module~self_mesh module~self_linearshallowwater2d_t->module~self_dgmodel2d module~self_advection_diffusion_3d_t self_advection_diffusion_3d_t module~self_advection_diffusion_3d_t->module~self_mesh module~self_advection_diffusion_3d_t->module~self_dgmodel3d~2 module~self_nulldgmodel2d_t self_NullDGModel2D_t module~self_nulldgmodel2d_t->module~self_mesh module~self_nulldgmodel2d_t->module~self_dgmodel2d module~self_advection_diffusion_1d~2 self_advection_diffusion_1d module~self_advection_diffusion_1d~2->module~self_advection_diffusion_1d_t module~self_lineareuler2d~2 self_LinearEuler2D module~self_lineareuler2d~2->module~self_lineareuler2d_t module~self_linearshallowwater2d self_LinearShallowWater2D module~self_linearshallowwater2d->module~self_linearshallowwater2d_t module~self_linearshallowwater2d~2 self_LinearShallowWater2D module~self_linearshallowwater2d~2->module~self_linearshallowwater2d_t module~self_nulldgmodel2d self_NullDGModel2D module~self_nulldgmodel2d->module~self_nulldgmodel2d_t module~self_lineareuler3d self_LinearEuler3D module~self_lineareuler3d->module~self_lineareuler3d_t module~self_advection_diffusion_2d self_advection_diffusion_2d module~self_advection_diffusion_2d->module~self_advection_diffusion_2d_t module~self_lineareuler3d~2 self_LinearEuler3D module~self_lineareuler3d~2->module~self_lineareuler3d_t module~self_advection_diffusion_2d~2 self_advection_diffusion_2d module~self_advection_diffusion_2d~2->module~self_advection_diffusion_2d_t module~self_nulldgmodel3d self_NullDGModel3D module~self_nulldgmodel3d->module~self_nulldgmodel3d_t module~self_nulldgmodel3d~2 self_NullDGModel3D module~self_nulldgmodel3d~2->module~self_nulldgmodel3d_t module~self_lineareuler2d self_LinearEuler2D module~self_lineareuler2d->module~self_lineareuler2d_t module~self_advection_diffusion_3d~2 self_advection_diffusion_3d module~self_advection_diffusion_3d~2->module~self_advection_diffusion_3d_t module~self_advection_diffusion_3d self_advection_diffusion_3d module~self_advection_diffusion_3d->module~self_advection_diffusion_3d_t module~self_nulldgmodel2d~2 self_NullDGModel2D module~self_nulldgmodel2d~2->module~self_nulldgmodel2d_t

Contents


Derived Types

type, public, extends(Lagrange_t) :: Lagrange

Components

TypeVisibilityAttributesNameInitial
integer, public :: M

The number of target points.

integer, public :: N

The number of control points.

real(kind=prec), public, pointer, contiguous, dimension(:,:):: bMatrix

The boundary interpolation matrix that is used to map a grid of nodal values at the control points to the element boundaries.

type(c_ptr), public :: bMatrix_gpu
real(kind=prec), public, pointer, contiguous, dimension(:):: bWeights

The barycentric weights that are calculated from the controlPoints and used for interpolation.

character(len=3), public :: backend ='gpu'
type(c_ptr), public :: blas_handle =c_null_ptr

A handle for working with hipblas

integer, public :: controlNodeType
real(kind=prec), public, pointer, contiguous, dimension(:):: controlPoints

The set of nodes in one dimension where data is known. To create higher dimension interpolation and differentiation operators, structured grids in two and three dimensions are created by tensor products of the controlPoints. This design decision implies that all spectral element methods supported by the Lagrange class have the same polynomial degree in each computational/spatial dimension. In practice, the controlPoints are the Legendre-Gauss, Legendre-Gauss-Lobatto, Legendre-Gauss-Radau, Chebyshev-Gauss, Chebyshev-Gauss-Lobatto, or Chebyshev-Gauss-Radau quadrature points over the domain [-1,1] (computational space). The Init routine for this class restricts controlPoints to one of these quadrature types or uniform points on [-1,1].

real(kind=prec), public, pointer, contiguous, dimension(:,:):: dMatrix

The derivative matrix for mapping function nodal values to a nodal values of the derivative estimate. The dMatrix is based on a strong form of the derivative.

type(c_ptr), public :: dMatrix_gpu
real(kind=prec), public, pointer, contiguous, dimension(:,:):: dgMatrix

The derivative matrix for mapping function nodal values to a nodal values of the derivative estimate. The dgMatrix is based on a weak form of the derivative. It must be used with bMatrix to account for boundary contributions in the weak form.

type(c_ptr), public :: dgMatrix_gpu
real(kind=prec), public, pointer, contiguous, dimension(:,:):: iMatrix

The interpolation matrix (transpose) for mapping data from the control grid to the target grid.

type(c_ptr), public :: iMatrix_gpu
real(kind=prec), public, pointer, contiguous, dimension(:):: qWeights

The quadrature weights for discrete integration. The quadradture weights depend on the type of controlPoints provided; one of Legendre-Gauss, Legendre-Gauss-Lobatto, Legendre-Gauss-Radau, Chebyshev-Gauss, Chebyshev-Gauss-Lobatto, Chebyshev-Gauss Radau, or Uniform. If Uniform, the quadrature weights are constant .

type(c_ptr), public :: qWeights_gpu
integer, public :: targetNodeType
real(kind=prec), public, pointer, contiguous, dimension(:):: targetPoints

The set of nodes in one dimension where data is to be interpolated to. To create higher dimension interpolation and differentiation operators, structured grids in two and three dimensions are created by tensor products of the targetPoints. In practice, the targetPoints are set to a uniformly distributed set of points between [-1,1] (computational space) to allow for interpolation from unevenly spaced quadrature points to a plotting grid.

Type-Bound Procedures

procedure, public :: CalculateBarycentricWeights
procedure, public :: CalculateDerivativeMatrix
procedure, public :: CalculateInterpolationMatrix
procedure, public :: CalculateLagrangePolynomials
procedure, public :: Free => Free_Lagrange
procedure, public :: Init => Init_Lagrange
procedure, public :: WriteHDF5 => WriteHDF5_Lagrange_t

Subroutines

public subroutine Free_Lagrange(this)

Frees all memory (host and device) associated with an instance of the Lagrange class

Arguments

TypeIntentOptionalAttributesName
class(Lagrange), intent(inout) :: this

Lagrange class instance

public subroutine Init_Lagrange(this, N, controlNodeType, M, targetNodeType)

Initialize an instance of the Lagrange class On output, all of the attributes for the Lagrange class are allocated and values are initialized according to the number of control points, number of target points, and the types for the control and target nodes. If a GPU is available, device pointers for the Lagrange attributes are allocated and initialized.

Arguments

TypeIntentOptionalAttributesName
class(Lagrange), intent(out) :: this

Lagrange class instance

integer, intent(in) :: N

The number of control points for interpolant

integer, intent(in) :: controlNodeType

The integer code specifying the type of control points. Parameters are defined in SELF_Constants.f90. One of GAUSS(=1), GAUSS_LOBATTO(=2), or UNIFORM(=3)

integer, intent(in) :: M

The number of target points for the interpolant

integer, intent(in) :: targetNodeType

The integer code specifying the type of target points. Parameters are defined in SELF_Constants.f90. One of GAUSS(=1), GAUSS_LOBATTO(=2), or UNIFORM(=3)