# tem_coordinate_module Module

## Variables

Type Visibility Attributes Name Initial
integer, public, parameter :: xToXAxes = 1

Identity transformation

integer, public, parameter :: yToXAxes = 2

Transformation to transform a y axis into an x axis

integer, public, parameter :: zToXAxes = 3

Transformation to transform a z axis into an x axis

integer, private, parameter :: xDir = 1

constant representing the x direction

integer, private, parameter :: yDir = 2

constant representing the y direction

integer, private, parameter :: zDir = 3

constant representing the z direction

## Derived Types

### type, public ::  coordRotation_type

datatype to transform varibales given in one coordinate

#### Components

Type Visibility Attributes Name Initial
integer, public :: rotationType

The type of the rotation, see parameters above.

integer, public, allocatable :: varTransformIndices(:)

Array of integers defining how to transform the variables of your state vector. Therefore the size of this array is the number of scalar variables of your equation system.

integer, public, allocatable :: derTransformIndices(:)

Array of integers defining how to transform the derivatives of your state vector. Therefore the size of this array is the total number of derivatives you store in your state vector.

## Functions

### public function dirToString(direction) result(dirAsChar)

function to convert a direction to a string.

#### Arguments

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

direction to convert

#### Return Value character(len=1)

direction as string

### private function rotateVector3(coordTrans) result(rotationIndices)

rotate a vector in 3D by a given rotation.

#### Arguments

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

The coordinate transformation you apply.

#### Return Value integer, (3)

Rotation indices for the given transformation

### private function rotateTensor3(coordTrans) result(rotationIndices)

rotate a tensor in 3D by a given rotation.

#### Arguments

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

The coordinate transformation you apply.

#### Return Value integer, (9)

Rotation indices for the given transformation

### private function rotateVector2(coordTrans) result(rotationIndices)

rotate a vector in 2D by a given rotation.

#### Arguments

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

The coordinate transformation you apply.

#### Return Value integer, (2)

Rotation indices for the given transformation

### private function rotateScalar() result(rotationIndices)

rotate a scalar?

None

#### Return Value integer, (1)

The coordinate transformation you apply. Rotation indices for the given transformation

## Subroutines

### public subroutine initCoordinateRotation(varSys, coordTrans, derivatives, rotation, dimen)

routine to specify a coordinate transformation for the state

#### Arguments

Type IntentOptional Attributes Name
type(tem_varSys_type), intent(in) :: varSys

The variables to build the permutations for.

integer, intent(in) :: coordTrans

The rotation you want to obtain. Please have a look at the parameters of this module to find a valid input argument.

integer, intent(in) :: derivatives

The number of derivatives (already multidimensional) you need for your equation. Zero means that we calculate cell values only, one means all first derivatives and so on.

type(coordRotation_type), intent(out) :: rotation

The coordinate rotation you want to initialize.

integer, intent(in) :: dimen

The spatial dimension of the system

### private subroutine appendDerivative(derivatives, coordTrans, rotation, dimen)

subroutine to append a rotated derivative to coordRotation type.

#### Arguments

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

The number of derivatives of your equation (inclunding the zeroth order derivative).

integer, intent(in) :: coordTrans

The coordinate transformation you apply.

type(coordRotation_type), intent(inout) :: rotation

The coordinate rotation you want to initialize.

integer, intent(in) :: dimen

The spatial dimension of the system

### private subroutine appendRotatedVariable(nComponents, prevScalarVars, coordTrans, rotation)

routine to append a rotated varibale to corrdRoation type.

#### Arguments

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

nComponents of variable you want to append.

integer, intent(in) :: prevScalarVars

The number of scalar variable you append before you append this variable.

integer, intent(in) :: coordTrans

The coordinate transformation you apply.

type(coordRotation_type), intent(inout) :: rotation

The coordinate rotation you want to initialize.