ply_split_element_module Module

This module provides the methods to project the polynomial representation in elements onto the representations in their halves in each dimension.

To perform the projection for Legendre polynomials we will use the computed coefficients for the Clenshaw algorithm from ply_split_legendre_module. With those the transformation is just a simple triangular matrix multiplication, but we need to take care of the orthogonal degrees of freedom as we want to handle all of them at the same time. Further we want to allow the transformation to be performed for multiple elements at once.

In each dimension we need to perform the following coordinate transformation:

Where refers to the coordinate in the original (coarse) element, and to the coordinates in the two (left and right) halves of the element.


Uses

  • module~~ply_split_element_module~~UsesGraph module~ply_split_element_module ply_split_element_module env_module env_module module~ply_split_element_module->env_module module~ply_modg_basis_module ply_modg_basis_module module~ply_split_element_module->module~ply_modg_basis_module module~ply_split_legendre_module ply_split_legendre_module module~ply_split_element_module->module~ply_split_legendre_module module~ply_modg_basis_module->env_module module~ply_dof_module ply_dof_module module~ply_modg_basis_module->module~ply_dof_module module~ply_space_integration_module ply_space_integration_module module~ply_modg_basis_module->module~ply_space_integration_module module~ply_split_legendre_module->env_module module~ply_dof_module->env_module module~ply_space_integration_module->env_module tem_param_module tem_param_module module~ply_space_integration_module->tem_param_module

Used by

  • module~~ply_split_element_module~~UsedByGraph module~ply_split_element_module ply_split_element_module module~ply_sampling_adaptive_module ply_sampling_adaptive_module module~ply_sampling_adaptive_module->module~ply_split_element_module program~ply_split_element_test_prog ply_split_element_test_prog program~ply_split_element_test_prog->module~ply_split_element_module module~ply_sampling_module ply_sampling_module module~ply_sampling_module->module~ply_sampling_adaptive_module module~ply_sampled_tracking_module ply_sampled_tracking_module module~ply_sampled_tracking_module->module~ply_sampling_module module~atl_initialize_module atl_initialize_module module~atl_initialize_module->module~ply_sampled_tracking_module module~atl_program_module atl_program_module module~atl_program_module->module~ply_sampled_tracking_module module~atl_solver_param_module atl_solver_param_module module~atl_solver_param_module->module~ply_sampled_tracking_module program~atl_harvesting atl_harvesting program~atl_harvesting->module~ply_sampled_tracking_module

Variables

Type Visibility Attributes Name Initial
real(kind=rk), private, allocatable :: split_legendre(:,:)

Precomputed matrix to hold the transformation operation to project Legendre polynomials to its two half intervals.

This is computed by ply_split_legendre_matrix, see there for details. There are two triangular matrices stored in this array, one for the projection to the left half (-1,0) , and one for the projection to the right half (0,1).

This is a module variable, as it is only needed to be computed once with sufficient size. All lower orders are just subarrays out of the larger one.


Abstract Interfaces

abstract interface

  • public subroutine ply_split_element(parent_degree, child_degree, parent_data, child_data, ignore_highmodes)

    Split elements of degree parent_degree into elements with polynomials of degree child_degree.

    Arguments

    Type IntentOptional Attributes Name
    integer, intent(in) :: parent_degree

    Polynomial degree in the parent element.

    integer, intent(in) :: child_degree

    Polynomial degree in the child elements.

    real(kind=rk), intent(in) :: parent_data(:,:)

    Polynomial data in the parent element. The first index describes the degrees of freedom. The second index refers to the elements to split.

    real(kind=rk), intent(out) :: child_data(:,:)

    Polynomial data in the child elements. The first index describes the degrees of freedom. The second index refers to the elements, there needs to be four times as many elements than in the parent_data.

    Elements follow the ordering of the Z space filling curve.

    logical, intent(in), optional :: ignore_highmodes

    Whether to ignore high modes from the parent element.

    This can be used as a simple lowpass filter by ignoring all higher modes from the parent element, that exceed the target polynomial degree. Thus, the polynomials are filtered before projection, instead of cutting them only of after refinement. Defaults to false (no filtering).


Subroutines

public subroutine ply_split_element_init(nMaxModes)

Initialization of the module. This needs to be performed before any call of the actual transformation ply_split_element_1D.

Read more…

Arguments

Type IntentOptional Attributes Name
integer, intent(in) :: nMaxModes

Maximal number of expected modes to perform the splitting for.

public subroutine ply_split_element_singleD(nDims, inLen, outLen, parent_data, child_data, ignore)

Project a polynomial representation in elements in one dimension to its two halves in that direction.

Read more…

Arguments

Type IntentOptional Attributes Name
integer, intent(in) :: nDims

Number of dimensions of the polynomial data.

integer, intent(in) :: inLen(nDims)

Number degrees of freedom for each direction in parent_Data.

Read more…
integer, intent(in) :: outLen(nDims)

Number degrees of freedom for each direction in child_Data.

Read more…
real(kind=rk), intent(in) :: parent_data(:,:)

Polynomial representation in the parent elements.

Read more…
real(kind=rk), intent(out) :: child_data(:,:)

Computed projection of the polynomial representation in the child elements.

Read more…
logical, intent(in) :: ignore

Whether to ignore high modes that exceed the target maximal polynomial degree.

Read more…

public subroutine ply_split_element_1D(parent_degree, child_degree, parent_data, child_data, ignore_highmodes)

Split one-dimensional elements of degree parent_degree into two elements with polynomials of degree child_degree.

Arguments

Type IntentOptional Attributes Name
integer, intent(in) :: parent_degree

Polynomial degree in the parent element.

integer, intent(in) :: child_degree

Polynomial degree in the child elements.

real(kind=rk), intent(in) :: parent_data(:,:)

Polynomial data in the parent element. The first index describes the degrees of freedom. The second index refers to the elements to split.

real(kind=rk), intent(out) :: child_data(:,:)

Polynomial data in the child elements. The first index describes the degrees of freedom. The second index refers to the elements, there needs to be four times as many elements than in the parent_data.

Read more…
logical, intent(in), optional :: ignore_highmodes

Whether to ignore high modes from the parent element.

Read more…

public subroutine ply_split_element_2D(parent_degree, child_degree, parent_data, child_data, ignore_highmodes)

Split two-dimensional elements of degree parent_degree into four elements with polynomials of degree child_degree.

Arguments

Type IntentOptional Attributes Name
integer, intent(in) :: parent_degree

Polynomial degree in the parent element.

integer, intent(in) :: child_degree

Polynomial degree in the child elements.

real(kind=rk), intent(in) :: parent_data(:,:)

Polynomial data in the parent element. The first index describes the degrees of freedom. The second index refers to the elements to split.

real(kind=rk), intent(out) :: child_data(:,:)

Polynomial data in the child elements. The first index describes the degrees of freedom. The second index refers to the elements, there needs to be four times as many elements than in the parent_data.

Read more…
logical, intent(in), optional :: ignore_highmodes

Whether to ignore high modes from the parent element.

Read more…

public subroutine ply_split_element_3D(parent_degree, child_degree, parent_data, child_data, ignore_highmodes)

Split three-dimensional elements of degree parent_degree into eight elements with polynomials of degree child_degree.

Arguments

Type IntentOptional Attributes Name
integer, intent(in) :: parent_degree

Polynomial degree in the parent element.

integer, intent(in) :: child_degree

Polynomial degree in the child elements.

real(kind=rk), intent(in) :: parent_data(:,:)

Polynomial data in the parent element. The first index describes the degrees of freedom. The second index refers to the elements to split.

real(kind=rk), intent(out) :: child_data(:,:)

Polynomial data in the child elements. The first index describes the degrees of freedom. The second index refers to the elements, there needs to be four times as many elements than in the parent_data.

Read more…
logical, intent(in), optional :: ignore_highmodes

Whether to ignore high modes from the parent element.

Read more…

public subroutine ply_split_element_test(success)

Testing routine for the functions of this module.

Arguments

Type IntentOptional Attributes Name
logical, intent(out) :: success

Indication whether the tests were completed successfully.

private subroutine ply_split_element_1D_test(nModes, success)

Testing the 1D splitting.

Read more…

Arguments

Type IntentOptional Attributes Name
integer, intent(in) :: nModes

Number of modes in the (1D) polynomials to use in the check.

logical, intent(out) :: success

Indication whether the tests were completed successfully.

private subroutine ply_split_element_2D_test(nModes, success)

Testing the 2D splitting.

Read more…

Arguments

Type IntentOptional Attributes Name
integer, intent(in) :: nModes

Number of modes in the (1D) polynomials to use in the check.

logical, intent(out) :: success

Indication whether the tests were completed successfully.

private subroutine ply_split_element_3D_test(nModes, success)

Testing the 3D splitting.

Read more…

Arguments

Type IntentOptional Attributes Name
integer, intent(in) :: nModes

Number of modes in the (1D) polynomials to use in the check.

logical, intent(out) :: success

Indication whether the tests were completed successfully.