mus_gradData_module Module

This module contains data types, function and routines for gradient computation.

author: Gregorio Gerardo Spinelli



Abstract Interfaces

abstract interface

  • public pure function getGradU(auxField, gradData, velPos, nAuxScalars, nDims, nSolve, elemOffset) result(gradU)

    function pointers to obtain full gradient of U along all directions

    Arguments

    Type IntentOptional Attributes Name
    real(kind=rk), intent(in) :: auxField(:)

    auxField

    type(mus_gradData_type), intent(in) :: gradData

    gradient data

    integer, intent(in) :: velPos(3)

    Position of velocity field in auxField

    integer, intent(in) :: nAuxScalars

    Number of scalars in auxField array

    integer, intent(in) :: nDims

    Dimensions

    integer, intent(in) :: nSolve

    Number of element to solve in this level

    integer, intent(in) :: elemOffset

    Offset for elements when computing chunkwise

    Return Value real(kind=rk), (nDims,nDims,nSolve)

    output is gradient of velocity

abstract interface

  • public pure function getGradXXU(auxField, gradData, velPos, nAuxScalars, nDims, nSolve, elemOffset) result(gradXXU)

    function pointers to obtain full gradient of U along main directions derived two times d^2U/dx^2

    Arguments

    Type IntentOptional Attributes Name
    real(kind=rk), intent(in) :: auxField(:)

    auxField

    type(mus_gradData_type), intent(in) :: gradData

    gradient data

    integer, intent(in) :: velPos(3)

    Position of velocity field in auxField

    integer, intent(in) :: nAuxScalars

    Number of scalars in auxField array

    integer, intent(in) :: nDims

    Dimensions

    integer, intent(in) :: nSolve

    Number of element to solve in this level

    integer, intent(in) :: elemOffset

    Offset for elements when computing chunkwise

    Return Value real(kind=rk), (nDims,nSolve)

    output is gradient of velocity:

abstract interface

  • public pure function getGradRhoU3(auxField, gradData, velPos, densPos, nAuxScalars, nDims, nSolve, elemOffset) result(gradRhoU3)

    function pointers to obtain grad Rho * U^3 along main directions

    Arguments

    Type IntentOptional Attributes Name
    real(kind=rk), intent(in) :: auxField(:)

    auxField

    type(mus_gradData_type), intent(in) :: gradData

    gradient data

    integer, intent(in) :: velPos(3)

    Position of velocity field in auxField

    integer, intent(in) :: densPos

    Position of velocity field in auxField

    integer, intent(in) :: nAuxScalars

    Number of scalars in auxField array

    integer, intent(in) :: nDims

    Dimensions

    integer, intent(in) :: nSolve

    Number of element to solve in this level

    integer, intent(in) :: elemOffset

    Offset for elements when computing chunkwise

    Return Value real(kind=rk), (nDims,nSolve)

    output is gradient of velocity

abstract interface

  • public pure function getGradRhoUVZ(auxField, gradData, velPos, densPos, nDims, nAuxScalars, nSolve, elemOffset) result(gradRhoUVZ)

    function pointers to obtain grad Rho * u_x * u_y * u_z along main directions

    Arguments

    Type IntentOptional Attributes Name
    real(kind=rk), intent(in) :: auxField(:)

    auxField

    type(mus_gradData_type), intent(in) :: gradData

    gradient data

    integer, intent(in) :: velPos(3)

    Position of velocity field in auxField

    integer, intent(in) :: densPos

    Position of velocity field in auxField

    integer, intent(in) :: nDims

    Dimensions

    integer, intent(in) :: nAuxScalars

    Number of scalars in auxField array

    integer, intent(in) :: nSolve

    Number of element to solve in this level

    integer, intent(in) :: elemOffset

    Offset for elements when computing chunkwise

    Return Value real(kind=rk), (nDims,nSolve)

    output is gradient of velocity


Derived Types

type, public ::  mus_Grad_type

collection of properties of the Gradient type

Components

Type Visibility Attributes Name Initial
procedure(getGradU), public, nopass, pointer :: U_ptr => null()

function pointer to get Gradient U

procedure(getGradXXU), public, nopass, pointer :: XXU_ptr => null()

function pointer to get Gradient XX U

procedure(getGradRhoU3), public, nopass, pointer :: RhoU3_ptr => null()

function pointer to get Gradient rho U^3

procedure(getGradRhoUVZ), public, nopass, pointer :: RhoUVZ_ptr => null()

function pointer to get Gradient Rho u_x u_y u_z

type, public ::  mus_gradData_type

Contains information required to compute gradient like position of six direct neigbors in the state array and coeff for the gradient operation

Components

Type Visibility Attributes Name Initial
integer, public, allocatable :: neighPos(:,:,:)

Stores position of 6 direct face neighbors in the state array for each element Size: nSize, stencil%nDims, 2 last index refers to left and right side 1 is left/negative side and 2 is right/positive side

real(kind=rk), public, allocatable :: FDcoeff(:,:)

coeff to calculate 1st order derivative use forward difference for element with boundary (coeff = 1.0) and central difference for inner fluid element (coeff=0.5) size: nSize, stencil%nDims


Functions

public function mus_assign_GradCalculation_ptr(label) result(Grad)

This function returns function pointer of nonEquilibrium scaling for interpolation according to scheme definition

Arguments

Type IntentOptional Attributes Name
character(len=labelLen), intent(in) :: label

Scheme header information

Return Value type(mus_Grad_type)

GradRhoU3 function

private pure function getGradU_1D(auxField, gradData, velPos, nAuxScalars, nDims, nSolve, elemOffset) result(gradU)

This function computes gradient of velocity from gradient and veleocity data. Gradient is computed using central difference. if an element has an boundary then neighbor refers to current element then forward difference is used

Arguments

Type IntentOptional Attributes Name
real(kind=rk), intent(in) :: auxField(:)

auxField

type(mus_gradData_type), intent(in) :: gradData

gradient data

integer, intent(in) :: velPos(3)

Position of velocity field in auxField

integer, intent(in) :: nAuxScalars

Number of scalars in auxField array

integer, intent(in) :: nDims

Dimensions

integer, intent(in) :: nSolve

Number of element to solve in this level

integer, intent(in) :: elemOffset

Offset for elements when computing chunkwise

Return Value real(kind=rk), (nDims,nDims,nSolve)

output is gradient of velocity

private pure function getGradU_2D(auxField, gradData, velPos, nAuxScalars, nDims, nSolve, elemOffset) result(gradU)

This function computes gradient of velocity from gradient and veleocity data. Gradient is computed using central difference. if an element has an boundary then neighbor refers to current element then forward difference is used

Arguments

Type IntentOptional Attributes Name
real(kind=rk), intent(in) :: auxField(:)

auxField

type(mus_gradData_type), intent(in) :: gradData

gradient data

integer, intent(in) :: velPos(3)

Position of velocity field in auxField

integer, intent(in) :: nAuxScalars

Number of scalars in auxField array

integer, intent(in) :: nDims

Dimensions

integer, intent(in) :: nSolve

Number of element to solve in this level

integer, intent(in) :: elemOffset

Offset for elements when computing chunkwise

Return Value real(kind=rk), (nDims,nDims,nSolve)

output is gradient of velocity

private pure function getGradU_3D(auxField, gradData, velPos, nAuxScalars, nDims, nSolve, elemOffset) result(gradU)

This function computes gradient of velocity from gradient and veleocity data. Gradient is computed using central difference. if an element has an boundary then neighbor refers to current element then forward difference is used

Arguments

Type IntentOptional Attributes Name
real(kind=rk), intent(in) :: auxField(:)

auxField

type(mus_gradData_type), intent(in) :: gradData

gradient data

integer, intent(in) :: velPos(3)

Position of velocity field in auxField

integer, intent(in) :: nAuxScalars

Number of scalars in auxField array

integer, intent(in) :: nDims

Dimensions

integer, intent(in) :: nSolve

Number of element to solve in this level

integer, intent(in) :: elemOffset

Offset for elements when computing chunkwise

Return Value real(kind=rk), (nDims,nDims,nSolve)

output is gradient of velocity

private pure function getGradXXU_1D(auxField, gradData, velPos, nAuxScalars, nDims, nSolve, elemOffset) result(gradXXU)

This function computes gradient of velocity from gradient and veleocity data. Gradient is computed using central difference. if an element has an boundary then neighbor refers to current element then forward difference is used

Arguments

Type IntentOptional Attributes Name
real(kind=rk), intent(in) :: auxField(:)

auxField

type(mus_gradData_type), intent(in) :: gradData

gradient data

integer, intent(in) :: velPos(3)

Position of velocity field in auxField

integer, intent(in) :: nAuxScalars

Number of scalars in auxField array

integer, intent(in) :: nDims

Dimensions

integer, intent(in) :: nSolve

Number of element to solve in this level

integer, intent(in) :: elemOffset

Offset for elements when computing chunkwise

Return Value real(kind=rk), (nDims,nSolve)

output is gradient of velocity:

private pure function getGradXXU_2D(auxField, gradData, velPos, nAuxScalars, nDims, nSolve, elemOffset) result(gradXXU)

This function computes gradient of velocity from gradient and veleocity data. Gradient is computed using central difference. if an element has an boundary then neighbor refers to current element then forward difference is used

Arguments

Type IntentOptional Attributes Name
real(kind=rk), intent(in) :: auxField(:)

auxField

type(mus_gradData_type), intent(in) :: gradData

gradient data

integer, intent(in) :: velPos(3)

Position of velocity field in auxField

integer, intent(in) :: nAuxScalars

Number of scalars in auxField array

integer, intent(in) :: nDims

Dimensions

integer, intent(in) :: nSolve

Number of element to solve in this level

integer, intent(in) :: elemOffset

Offset for elements when computing chunkwise

Return Value real(kind=rk), (nDims,nSolve)

output is gradient of velocity:

private pure function getGradXXU_3D(auxField, gradData, velPos, nAuxScalars, nDims, nSolve, elemOffset) result(gradXXU)

This function computes gradient of velocity from gradient and veleocity data. Gradient is computed using central difference. if an element has an boundary then neighbor refers to current element then forward difference is used

Arguments

Type IntentOptional Attributes Name
real(kind=rk), intent(in) :: auxField(:)

auxField

type(mus_gradData_type), intent(in) :: gradData

gradient data

integer, intent(in) :: velPos(3)

Position of velocity field in auxField

integer, intent(in) :: nAuxScalars

Number of scalars in auxField array

integer, intent(in) :: nDims

Dimensions

integer, intent(in) :: nSolve

Number of element to solve in this level

integer, intent(in) :: elemOffset

Offset for elements when computing chunkwise

Return Value real(kind=rk), (nDims,nSolve)

output is gradient of velocity:

private pure function getGradRhoU3_1D(auxField, gradData, velPos, densPos, nAuxScalars, nDims, nSolve, elemOffset) result(gradRhoU3)

This function computes gradient of rho * velocity^3 from gradient, density and veleocity data. Just derivatives u_x, v_y and w_z. Gradient is computed using central difference. if an element has an boundary then neighbor refers to current element then forward difference is used.

Arguments

Type IntentOptional Attributes Name
real(kind=rk), intent(in) :: auxField(:)

auxField

type(mus_gradData_type), intent(in) :: gradData

gradient data

integer, intent(in) :: velPos(3)

Position of velocity field in auxField

integer, intent(in) :: densPos

Position of velocity field in auxField

integer, intent(in) :: nAuxScalars

Number of scalars in auxField array

integer, intent(in) :: nDims

Dimensions

integer, intent(in) :: nSolve

Number of element to solve in this level

integer, intent(in) :: elemOffset

Offset for elements when computing chunkwise

Return Value real(kind=rk), (nDims,nSolve)

output is gradient of velocity

private pure function getGradRhoU3_2D(auxField, gradData, velPos, densPos, nAuxScalars, nDims, nSolve, elemOffset) result(gradRhoU3)

This function computes gradient of rho * velocity^3 from gradient, density and veleocity data. Just derivatives u_x, v_y and w_z. Gradient is computed using central difference. if an element has an boundary then neighbor refers to current element then forward difference is used.

Arguments

Type IntentOptional Attributes Name
real(kind=rk), intent(in) :: auxField(:)

auxField

type(mus_gradData_type), intent(in) :: gradData

gradient data

integer, intent(in) :: velPos(3)

Position of velocity field in auxField

integer, intent(in) :: densPos

Position of velocity field in auxField

integer, intent(in) :: nAuxScalars

Number of scalars in auxField array

integer, intent(in) :: nDims

Dimensions

integer, intent(in) :: nSolve

Number of element to solve in this level

integer, intent(in) :: elemOffset

Offset for elements when computing chunkwise

Return Value real(kind=rk), (nDims,nSolve)

output is gradient of velocity

private pure function getGradRhoU3_3D(auxField, gradData, velPos, densPos, nAuxScalars, nDims, nSolve, elemOffset) result(gradRhoU3)

This function computes gradient of rho * velocity^3 from gradient, density and veleocity data. Just derivatives u_x, v_y and w_z. Gradient is computed using central difference. if an element has an boundary then neighbor refers to current element then forward difference is used.

Arguments

Type IntentOptional Attributes Name
real(kind=rk), intent(in) :: auxField(:)

auxField

type(mus_gradData_type), intent(in) :: gradData

gradient data

integer, intent(in) :: velPos(3)

Position of velocity field in auxField

integer, intent(in) :: densPos

Position of velocity field in auxField

integer, intent(in) :: nAuxScalars

Number of scalars in auxField array

integer, intent(in) :: nDims

Dimensions

integer, intent(in) :: nSolve

Number of element to solve in this level

integer, intent(in) :: elemOffset

Offset for elements when computing chunkwise

Return Value real(kind=rk), (nDims,nSolve)

output is gradient of velocity

private pure function getGradRhoUVZ_3D(auxField, gradData, velPos, densPos, nDims, nAuxScalars, nSolve, elemOffset) result(gradRhoUVZ)

This function computes gradient of rho * velocity^3 from gradient, density and veleocity data. Just derivatives u_x, v_y and w_z. Gradient is computed using central difference. if an element has an boundary then neighbor refers to current element then forward difference is used.

Arguments

Type IntentOptional Attributes Name
real(kind=rk), intent(in) :: auxField(:)

auxField

type(mus_gradData_type), intent(in) :: gradData

gradient data

integer, intent(in) :: velPos(3)

Position of velocity field in auxField

integer, intent(in) :: densPos

Position of velocity field in auxField

integer, intent(in) :: nDims

Dimensions

integer, intent(in) :: nAuxScalars

Number of scalars in auxField array

integer, intent(in) :: nSolve

Number of element to solve in this level

integer, intent(in) :: elemOffset

Offset for elements when computing chunkwise

Return Value real(kind=rk), (nDims,nSolve)

output is gradient of velocity


Subroutines

public subroutine mus_init_gradData(me, neigh, stencil, nSize, nSolve, nScalars)

This routine initialize gradData with direct neighbors in state and finite difference coefficients.

Arguments

Type IntentOptional Attributes Name
type(mus_gradData_type), intent(out) :: me

Gradient type

integer, intent(in) :: neigh(:)

neighbor connectivity array

Read more…
type(tem_stencilHeader_type), intent(in) :: stencil

stencil header

integer, intent(in) :: nSize

Number of elements in state array

integer, intent(in) :: nSolve

Number of elements solved in compute kernel i.e. excluding halos

integer, intent(in) :: nScalars

number of scalars in state array