vec4 Derived Type

type, public :: vec4

not fully implmented vec4 class


Components

Type Visibility Attributes Name Initial
real(kind=wp), public :: p

vec4 components

real(kind=wp), public :: x

vec4 components

real(kind=wp), public :: y

vec4 components

real(kind=wp), public :: z

vec4 components


Constructor

public interface vec4

Initalise a vec4 from a vec3 and a scalar

  • private function init_vec4_vector_real(vec, val) result(out)

    Initalise vec4 from a vec3 and Scalar e.g vec4 = [vec3%x, vec3%y, vec3%z, scalar]

    Arguments

    Type IntentOptional Attributes Name
    type(vector), intent(in) :: vec

    Input vec3

    real(kind=wp), intent(in) :: val

    Input Scalar

    Return Value type(vec4)


Type-Bound Procedures

procedure, public :: length

  • private pure elemental function length(this)

    Returns the length of a vec4

    Arguments

    Type IntentOptional Attributes Name
    class(vec4), intent(in) :: this

    Return Value real(kind=wp)

procedure, public :: magnitude => magnitude_fn

  • private pure elemental function magnitude_fn(this)

    Returns the magnitude of a vec4

    Arguments

    Type IntentOptional Attributes Name
    class(vec4), intent(in) :: this

    Return Value type(vec4)

generic, public :: operator(*) => vec_mult_vec, vec_mult_scal, scal_mult_vec

Overloaded Mulitiplication operator

  • private pure elemental function vec_mult_vec(a, b)

    Elementwise vec4 * vec4

    Arguments

    Type IntentOptional Attributes Name
    class(vec4), intent(in) :: a

    Input vec4

    type(vec4), intent(in) :: b

    vec4 to multiply by

    Return Value type(vec4)

  • private pure elemental function vec_mult_scal(a, b)

    Elementwise vec4 * Scalar

    Arguments

    Type IntentOptional Attributes Name
    class(vec4), intent(in) :: a

    Input vec4

    real(kind=wp), intent(in) :: b

    Scalar to multiply by

    Return Value type(vec4)

  • private pure elemental function scal_mult_vec(a, b)

    Elementwise Scalar * vec4

    Arguments

    Type IntentOptional Attributes Name
    real(kind=wp), intent(in) :: a

    Scalar to multiply by

    class(vec4), intent(in) :: b

    Input vec4

    Return Value type(vec4)

generic, public :: operator(+) => vec_add_vec, vec_add_scal, scal_add_vec

Overloaded Addition operator

  • private pure elemental function vec_add_vec(a, b)

    Elementwise vec4 + vec4

    Arguments

    Type IntentOptional Attributes Name
    class(vec4), intent(in) :: a

    Input vec4

    type(vec4), intent(in) :: b

    vec4 to add

    Return Value type(vec4)

  • private pure elemental function vec_add_scal(a, b)

    Elementwise vec4 + scalar

    Arguments

    Type IntentOptional Attributes Name
    class(vec4), intent(in) :: a

    Input vec4

    real(kind=wp), intent(in) :: b

    Scalar to add

    Return Value type(vec4)

  • private pure elemental function scal_add_vec(a, b)

    Elementwise scalar + vec4

    Arguments

    Type IntentOptional Attributes Name
    real(kind=wp), intent(in) :: a

    Scalar to add

    class(vec4), intent(in) :: b

    Input vec4

    Return Value type(vec4)

generic, public :: operator(-) => vec_minus_vec, vec_minus_scal, scal_minus_vec

Overloaded Subtraction operator

  • private pure elemental function vec_minus_vec(a, b)

    Elementwise vec4 - vec4

    Arguments

    Type IntentOptional Attributes Name
    class(vec4), intent(in) :: a

    Input vec4

    type(vec4), intent(in) :: b

    vec4 to subtract

    Return Value type(vec4)

  • private pure elemental function vec_minus_scal(a, b)

    Elementwise vec4 - scalar

    Arguments

    Type IntentOptional Attributes Name
    class(vec4), intent(in) :: a

    Input vec4

    real(kind=wp), intent(in) :: b

    Scalar to subtract

    Return Value type(vec4)

  • private pure elemental function scal_minus_vec(a, b)

    Elementwise Scalar - vec4

    Arguments

    Type IntentOptional Attributes Name
    real(kind=wp), intent(in) :: a

    Scalar to subtract

    class(vec4), intent(in) :: b

    Input vec4

    Return Value type(vec4)

generic, public :: operator(.dot.) => vec_dot_vec

.dot. operator

  • private pure elemental function vec_dot_vec(a, b) result(dot)

    dot product between two vec4s

    Arguments

    Type IntentOptional Attributes Name
    class(vec4), intent(in) :: a

    Input vec4

    type(vec4), intent(in) :: b

    vec4 to dot with

    Return Value real(kind=wp)

generic, public :: operator(/) => vec_div_scal_r4, vec_div_scal_r8, vec_div_scal_int

Overloaded Division operator

  • private pure elemental function vec_div_scal_r4(a, b)

    Elementwise vec4 / Scalar. Scalar is 32-bit float

    Arguments

    Type IntentOptional Attributes Name
    class(vec4), intent(in) :: a

    Input vec4

    real(kind=sp), intent(in) :: b

    Scalar to divide by

    Return Value type(vec4)

  • private pure elemental function vec_div_scal_r8(a, b)

    Elementwise vec4 / Scalar. Scalar is 32-bit float

    Arguments

    Type IntentOptional Attributes Name
    class(vec4), intent(in) :: a

    Input vec4

    real(kind=dp), intent(in) :: b

    Scalar to divide by

    Return Value type(vec4)

  • private pure elemental function vec_div_scal_int(a, b)

    Elementwise vec4 / Scalar. Scalar is an integer

    Arguments

    Type IntentOptional Attributes Name
    class(vec4), intent(in) :: a

    Input vec4

    integer, intent(in) :: b

    Scalar to divide by

    Return Value type(vec4)

procedure, private, pass(b) :: scal_add_vec

  • private pure elemental function scal_add_vec(a, b)

    Elementwise scalar + vec4

    Arguments

    Type IntentOptional Attributes Name
    real(kind=wp), intent(in) :: a

    Scalar to add

    class(vec4), intent(in) :: b

    Input vec4

    Return Value type(vec4)

procedure, private, pass(b) :: scal_minus_vec

  • private pure elemental function scal_minus_vec(a, b)

    Elementwise Scalar - vec4

    Arguments

    Type IntentOptional Attributes Name
    real(kind=wp), intent(in) :: a

    Scalar to subtract

    class(vec4), intent(in) :: b

    Input vec4

    Return Value type(vec4)

procedure, private, pass(b) :: scal_mult_vec

  • private pure elemental function scal_mult_vec(a, b)

    Elementwise Scalar * vec4

    Arguments

    Type IntentOptional Attributes Name
    real(kind=wp), intent(in) :: a

    Scalar to multiply by

    class(vec4), intent(in) :: b

    Input vec4

    Return Value type(vec4)

procedure, private, pass(a) :: vec_add_scal

  • private pure elemental function vec_add_scal(a, b)

    Elementwise vec4 + scalar

    Arguments

    Type IntentOptional Attributes Name
    class(vec4), intent(in) :: a

    Input vec4

    real(kind=wp), intent(in) :: b

    Scalar to add

    Return Value type(vec4)

procedure, private, pass(a) :: vec_add_vec

  • private pure elemental function vec_add_vec(a, b)

    Elementwise vec4 + vec4

    Arguments

    Type IntentOptional Attributes Name
    class(vec4), intent(in) :: a

    Input vec4

    type(vec4), intent(in) :: b

    vec4 to add

    Return Value type(vec4)

procedure, private, pass(a) :: vec_div_scal_int

  • private pure elemental function vec_div_scal_int(a, b)

    Elementwise vec4 / Scalar. Scalar is an integer

    Arguments

    Type IntentOptional Attributes Name
    class(vec4), intent(in) :: a

    Input vec4

    integer, intent(in) :: b

    Scalar to divide by

    Return Value type(vec4)

procedure, private, pass(a) :: vec_div_scal_r4

  • private pure elemental function vec_div_scal_r4(a, b)

    Elementwise vec4 / Scalar. Scalar is 32-bit float

    Arguments

    Type IntentOptional Attributes Name
    class(vec4), intent(in) :: a

    Input vec4

    real(kind=sp), intent(in) :: b

    Scalar to divide by

    Return Value type(vec4)

procedure, private, pass(a) :: vec_div_scal_r8

  • private pure elemental function vec_div_scal_r8(a, b)

    Elementwise vec4 / Scalar. Scalar is 32-bit float

    Arguments

    Type IntentOptional Attributes Name
    class(vec4), intent(in) :: a

    Input vec4

    real(kind=dp), intent(in) :: b

    Scalar to divide by

    Return Value type(vec4)

procedure, private, pass(a) :: vec_dot_vec

  • private pure elemental function vec_dot_vec(a, b) result(dot)

    dot product between two vec4s

    Arguments

    Type IntentOptional Attributes Name
    class(vec4), intent(in) :: a

    Input vec4

    type(vec4), intent(in) :: b

    vec4 to dot with

    Return Value real(kind=wp)

procedure, private, pass(a) :: vec_minus_scal

  • private pure elemental function vec_minus_scal(a, b)

    Elementwise vec4 - scalar

    Arguments

    Type IntentOptional Attributes Name
    class(vec4), intent(in) :: a

    Input vec4

    real(kind=wp), intent(in) :: b

    Scalar to subtract

    Return Value type(vec4)

procedure, private, pass(a) :: vec_minus_vec

  • private pure elemental function vec_minus_vec(a, b)

    Elementwise vec4 - vec4

    Arguments

    Type IntentOptional Attributes Name
    class(vec4), intent(in) :: a

    Input vec4

    type(vec4), intent(in) :: b

    vec4 to subtract

    Return Value type(vec4)

procedure, private, pass(a) :: vec_mult_scal

  • private pure elemental function vec_mult_scal(a, b)

    Elementwise vec4 * Scalar

    Arguments

    Type IntentOptional Attributes Name
    class(vec4), intent(in) :: a

    Input vec4

    real(kind=wp), intent(in) :: b

    Scalar to multiply by

    Return Value type(vec4)

procedure, private, pass(a) :: vec_mult_vec

  • private pure elemental function vec_mult_vec(a, b)

    Elementwise vec4 * vec4

    Arguments

    Type IntentOptional Attributes Name
    class(vec4), intent(in) :: a

    Input vec4

    type(vec4), intent(in) :: b

    vec4 to multiply by

    Return Value type(vec4)

Source Code

    type :: vec4
        !> vec4 components
        real(kind=wp) :: x, y, z, p
        contains

        procedure :: magnitude         => magnitude_fn
        procedure :: length            => length
        !> .dot. operator
        generic   :: operator(.dot.) => vec_dot_vec
        !> Overloaded Division operator
        generic   :: operator(/)     => vec_div_scal_r4, vec_div_scal_r8, vec_div_scal_int
        !> Overloaded Mulitiplication operator
        generic   :: operator(*)     => vec_mult_vec, vec_mult_scal, scal_mult_vec
        !> Overloaded Addition operator
        generic   :: operator(+)     => vec_add_vec, vec_add_scal, scal_add_vec
        !> Overloaded Subtraction operator
        generic   :: operator(-)     => vec_minus_vec, vec_minus_scal, scal_minus_vec

        procedure, pass(a), private :: vec_dot_vec

        procedure, pass(a), private :: vec_div_scal_r4
        procedure, pass(a), private :: vec_div_scal_r8
        procedure, pass(a), private :: vec_div_scal_int

        procedure, pass(a), private :: vec_mult_vec
        procedure, pass(a), private :: vec_mult_scal
        procedure, pass(b), private :: scal_mult_vec

        procedure, pass(a), private :: vec_add_vec
        procedure, pass(a), private :: vec_add_scal
        procedure, pass(b), private :: scal_add_vec

        procedure, pass(a), private :: vec_minus_vec
        procedure, pass(a), private :: vec_minus_scal
        procedure, pass(b), private :: scal_minus_vec

    end type vec4