upstream_plume_mod Module

Provides a derived type which specifies the boundary conditions for a 1-D plume model. In order to avoid boundary layer effects, an ODE solver is used to integrate the plume a little way upstream, past the boundary layer.


Uses

  • module~~upstream_plume_mod~~UsesGraph module~upstream_plume_mod upstream_plume_mod logger_mod logger_mod module~upstream_plume_mod->logger_mod factual_mod factual_mod module~upstream_plume_mod->factual_mod module~plume_boundary_mod plume_boundary_mod module~upstream_plume_mod->module~plume_boundary_mod module~rksuite_90 rksuite_90 module~upstream_plume_mod->module~rksuite_90 module~uniform_gradient_field_mod uniform_gradient_field_mod module~upstream_plume_mod->module~uniform_gradient_field_mod iso_fortran_env iso_fortran_env module~upstream_plume_mod->iso_fortran_env penf penf module~upstream_plume_mod->penf module~boundary_types_mod boundary_types_mod module~upstream_plume_mod->module~boundary_types_mod module~plume_boundary_mod->factual_mod module~plume_boundary_mod->iso_fortran_env module~plume_boundary_mod->module~boundary_types_mod module~rksuite_90_prec rksuite_90_prec module~rksuite_90->module~rksuite_90_prec module~uniform_gradient_field_mod->factual_mod module~uniform_gradient_field_mod->iso_fortran_env utils_mod utils_mod module~uniform_gradient_field_mod->utils_mod module~rksuite_90_prec->iso_fortran_env

Used by

  • module~~upstream_plume_mod~~UsedByGraph module~upstream_plume_mod upstream_plume_mod module~asymmetric_plume_mod asymmetric_plume_mod module~asymmetric_plume_mod->module~upstream_plume_mod module~static_plume_mod static_plume_mod module~static_plume_mod->module~upstream_plume_mod module~plume_mod plume_mod module~plume_mod->module~upstream_plume_mod

Contents


Variables

TypeVisibility AttributesNameInitial
type(uniform_scalar_field), private :: dummy

Interfaces

public interface upstream_plume_boundary

  • private pure function constructor(bound_calculator, distance, thresholds) result(this)

    Author
    Chris MacMackin
    Date
    July 2017

    Constructs a boundary condition object which integrates an IVP from actual boundary values to calculate the staet of the plume a little upstream. This can be used to avoid boundary layers.

    Arguments

    Type IntentOptional AttributesName
    procedure(bound_vals) :: bound_calculator

    Calculates the "actual" inflow boundary conditions, used to initiate the integration to find the values to use in the simulation.

    real(kind=r8), intent(in) :: distance

    The distance upstream which the plume should be integrated.

    real(kind=r8), intent(in), optional dimension(:):: thresholds

    The thresholds to use when evaluating the error of the integration. This is done according to the formula abs(e) / max(magnitude_y, THRESHOLDS) <= TOLERANCE.

    Return Value type(upstream_plume_boundary)


Abstract Interfaces

abstract interface

  • private pure subroutine bound_vals(time, D, U, T, S)

    Arguments

    Type IntentOptional AttributesName
    real(kind=r8), intent(in) :: time

    The time at which the boundary values are being calculated

    real(kind=r8), intent(out) :: D

    Plume thickness boundary condition

    real(kind=r8), intent(out), dimension(:), allocatable:: U

    Plume velocity boundary condition

    real(kind=r8), intent(out) :: T

    Plume temperature boundary condition

    real(kind=r8), intent(out) :: S

    Plume salinity boundary condition

abstract interface

  • private subroutine non_diff(D, U, T, S, b, DU_x, DUU_x, DUT_x, DUS_x)

    Arguments

    Type IntentOptional AttributesName
    class(scalar_field), intent(in) :: D

    The plume thickness

    class(vector_field), intent(in) :: U

    The plume velocity

    class(scalar_field), intent(in) :: T

    The plume temperature

    class(scalar_field), intent(in) :: S

    The plume salinity

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

    The debth of the base of the ice shelf

    class(scalar_field), intent(out) :: DU_x

    The derivative of the product DU

    class(vector_field), intent(out) :: DUU_x

    The derivative of the product DUU

    class(scalar_field), intent(out) :: DUT_x

    The derivative of the product DUT

    class(scalar_field), intent(out) :: DUS_x

    The derivative of the product DUS


Derived Types

type, public, extends(plume_boundary) :: upstream_plume_boundary

A type with procedures for getting the boundary conditions of the plume model. For given boundary conditions, it integrates the plume upstream slightly and then returns these when asked for boundary values. This allows boundary layers, which can cause numerical difficulties, to be avoided. Inflow boundaries must be Dirichlet, while outflow boundaries for velocity, salinity, and temperature are set to have a gradient of zero.

Read more…

Components

TypeVisibility AttributesNameInitial
procedure(bound_vals), private, nopass, pointer:: get_boundaries=> null()

Calculate the "actual" boundary values, used to initiate the integration, for the specified time.

real(kind=r8), private :: distance =0.05_r8

The distance upstream which the plume should be integrated

real(kind=r8), private :: thickness =0.1_r8

The thickness of the plume at the inflowing boundary

real(kind=r8), private, dimension(:), allocatable:: velocity

The velocity of the plume at the inflowing boundary

real(kind=r8), private :: temperature =0.0_r8

The tempreature of the plume at the inflowing boundary

real(kind=r8), private :: salinity =1.0_r8

The salinity of the plume at the inflowing boundary

real(kind=r8), private :: boundary_time

The time at which the boundaries were most recently calculated

real(kind=r8), private, dimension(:), allocatable:: thresholds

Thresholds to use when calculating error in the integration.

Constructor

private pure function constructor(bound_calculator, distance, thresholds)

Constructs a boundary condition object which integrates an IVP from actual boundary values to calculate the staet of the plume a little upstream. This can be used to avoid boundary layers.

Type-Bound Procedures

procedure, public :: set_time

Specifies the time at which to calculate the boundary conditions.

procedure, public :: thickness_bound_info => upstream_thickness_info

Indicates the type and depth of the thickness boundary at different locations.

procedure, public :: velocity_bound_info => upstream_info

Indicates the type and depth of the thickness boundary at different locations.

procedure, public :: temperature_bound_info => upstream_info

Indicates the type and depth of the thickness boundary at different locations.

procedure, public :: salinity_bound_info => upstream_info

Indicates the type and depth of the thickness boundary at different locations.

procedure, public :: thickness_bound => upstream_thickness_bound

Produces a field containing the boundary conditions for plume thickness at the specified location.

procedure, public :: velocity_bound => upstream_velocity_bound

Produces a field containing the boundary conditions for plume velocity at the specified location.

procedure, public :: temperature_bound => upstream_temperature_bound

Produces a field containing the boundary conditions for plume temperature at the specified location.

procedure, public :: salinity_bound => upstream_salinity_bound

Produces a field containing the boundary conditions for plume salinity at the specified location.

procedure, public :: calculate => upstream_calculate

Calculates the upstreamed boundary conditions for the given time and ice thickness.


Functions

private pure function constructor(bound_calculator, distance, thresholds) result(this)

Author
Chris MacMackin
Date
July 2017

Constructs a boundary condition object which integrates an IVP from actual boundary values to calculate the staet of the plume a little upstream. This can be used to avoid boundary layers.

Arguments

Type IntentOptional AttributesName
procedure(bound_vals) :: bound_calculator

Calculates the "actual" inflow boundary conditions, used to initiate the integration to find the values to use in the simulation.

real(kind=r8), intent(in) :: distance

The distance upstream which the plume should be integrated.

real(kind=r8), intent(in), optional dimension(:):: thresholds

The thresholds to use when evaluating the error of the integration. This is done according to the formula abs(e) / max(magnitude_y, THRESHOLDS) <= TOLERANCE.

Return Value type(upstream_plume_boundary)

private function upstream_thickness_bound(this, location) result(bound)

Author
Chris MacMackin
Date
July 2017

Returns a field containing the thickness boundary values for the specified boundary location.

Arguments

Type IntentOptional AttributesName
class(upstream_plume_boundary), intent(in) :: this
integer, intent(in) :: location

Which boundary information is to be provided for. The boundary will be the one normal to dimension of number abs(boundary). If the argument is negative, then the lower boundary is returned. If positive, then the upper boundary is returned.

Return Value class(scalar_field), pointer

private function upstream_velocity_bound(this, location) result(bound)

Author
Chris MacMackin
Date
July 2017

Returns a field containing the velocity boundary values for the specified boundary location.

Arguments

Type IntentOptional AttributesName
class(upstream_plume_boundary), intent(in) :: this
integer, intent(in) :: location

Which boundary information is to be provided for. The boundary will be the one normal to dimension of number abs(boundary). If the argument is negative, then the lower boundary is returned. If positive, then the upper boundary is returned.

Return Value class(vector_field), pointer

private function upstream_temperature_bound(this, location) result(bound)

Author
Chris MacMackin
Date
July 2017

Returns a field containing the temperature boundary values for the specified boundary location.

Arguments

Type IntentOptional AttributesName
class(upstream_plume_boundary), intent(in) :: this
integer, intent(in) :: location

Which boundary information is to be provided for. The boundary will be the one normal to dimension of number abs(boundary). If the argument is negative, then the lower boundary is returned. If positive, then the upper boundary is returned.

Return Value class(scalar_field), pointer

private function upstream_salinity_bound(this, location) result(bound)

Author
Chris MacMackin
Date
July 2017

Returns a field containing the salinity boundary values for the specified boundary location.

Arguments

Type IntentOptional AttributesName
class(upstream_plume_boundary), intent(in) :: this
integer, intent(in) :: location

Which boundary information is to be provided for. The boundary will be the one normal to dimension of number abs(boundary). If the argument is negative, then the lower boundary is returned. If positive, then the upper boundary is returned.

Return Value class(scalar_field), pointer


Subroutines

private subroutine upstream_thickness_info(this, location, bound_type, bound_depth)

Author
Chris MacMackin
Date
July 2017

Indicates that the lower boundary is Dirichlet and the upper boundary is free.

Arguments

Type IntentOptional AttributesName
class(upstream_plume_boundary), intent(in) :: this
integer, intent(in) :: location

Which boundary information is to be provided for. The boundary will be the one normal to dimension of number abs(boundary). If the argument is negative, then the lower boundary is returned. If positive, then the upper boundary is returned.

integer, intent(out) :: bound_type

An integer representing what sort of boundary condition is used. The integer value corresponding to each boundary type is specified in the boundary_types_mod.

integer, intent(out) :: bound_depth

The number of layers of data-points needed to specify the boundary condition.

private subroutine upstream_info(this, location, bound_type, bound_depth)

Author
Chris MacMackin
Date
July 2017

Indicates that the lower boundary is Dirichlet and the upper boundary is Neumann.

Arguments

Type IntentOptional AttributesName
class(upstream_plume_boundary), intent(in) :: this
integer, intent(in) :: location

Which boundary information is to be provided for. The boundary will be the one normal to dimension of number abs(boundary). If the argument is negative, then the lower boundary is returned. If positive, then the upper boundary is returned.

integer, intent(out) :: bound_type

An integer representing what sort of boundary condition is used. The integer value corresponding to each boundary type is specified in the boundary_types_mod.

integer, intent(out) :: bound_depth

The number of layers of data-points needed to specify the boundary condition.

private subroutine upstream_calculate(this, t, func, b)

Author
Chris MacMackin
Date
July 2017

Calculates the boundary values to use at the current time with the current ice thickness.

Arguments

Type IntentOptional AttributesName
class(upstream_plume_boundary), intent(inout) :: this
real(kind=r8), intent(in) :: t

The time at which to calculate the boundary values.

procedure(non_diff) :: func

A function which returns the non-diffusive, non-inertial components of the ODEs describing the plume.

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

The depth of the ice shelf base.