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.
The calculate
method must be called prior to use.
Type | Visibility | Attributes | Name | Initial | |||
---|---|---|---|---|---|---|---|
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. |
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 | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
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
|
Specifies the time at which to calculate the boundary conditions.
Sets the time at which boundary conditions are to be calculated.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(plume_boundary), | intent(inout) | :: | this | |||
real(kind=r8), | intent(in) | :: | time |
Indicates the type and depth of the thickness boundary at different locations.
Indicates that the lower boundary is Dirichlet and the upper boundary is free.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
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
|
||
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. |
Indicates the type and depth of the thickness boundary at different locations.
Indicates that the lower boundary is Dirichlet and the upper boundary is Neumann.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
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
|
||
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. |
Indicates the type and depth of the thickness boundary at different locations.
Indicates that the lower boundary is Dirichlet and the upper boundary is Neumann.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
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
|
||
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. |
Indicates the type and depth of the thickness boundary at different locations.
Indicates that the lower boundary is Dirichlet and the upper boundary is Neumann.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
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
|
||
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. |
Produces a field containing the boundary conditions for plume thickness at the specified location.
Returns a field containing the thickness boundary values for the specified boundary location.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
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
|
Produces a field containing the boundary conditions for plume velocity at the specified location.
Returns a field containing the velocity boundary values for the specified boundary location.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
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
|
Produces a field containing the boundary conditions for plume temperature at the specified location.
Returns a field containing the temperature boundary values for the specified boundary location.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
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
|
Produces a field containing the boundary conditions for plume salinity at the specified location.
Returns a field containing the salinity boundary values for the specified boundary location.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
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
|
Calculates the upstreamed boundary conditions for the given time and ice thickness.
Calculates the boundary values to use at the current time with the current ice thickness.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
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. |
type, extends(plume_boundary), public :: upstream_plume_boundary
!* Author: Chris MacMackin
! Date: July 2017
!
! 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.
!
! @Warning The `calculate` method __must__ be called prior to use.
!
private
procedure(bound_vals), nopass, pointer :: get_boundaries => null()
!! Calculate the "actual" boundary values, used to initiate the
!! integration, for the specified time.
real(r8) :: distance = 0.05_r8
!! The distance upstream which the plume should be integrated
real(r8) :: thickness = 0.1_r8
!! The thickness of the plume at the inflowing boundary
real(r8), dimension(:), allocatable :: velocity
!! The velocity of the plume at the inflowing boundary
real(r8) :: temperature = 0.0_r8
!! The tempreature of the plume at the inflowing boundary
real(r8) :: salinity = 1.0_r8
!! The salinity of the plume at the inflowing boundary
real(r8) :: boundary_time
!! The time at which the boundaries were most recently
!! calculated
real(r8), dimension(:), allocatable :: thresholds
!! Thresholds to use when calculating error in the integration.
contains
procedure :: thickness_bound_info => upstream_thickness_info
!! Indicates the type and depth of the thickness boundary at
!! different locations.
procedure :: velocity_bound_info => upstream_info
!! Indicates the type and depth of the thickness boundary at
!! different locations.
procedure :: temperature_bound_info => upstream_info
!! Indicates the type and depth of the thickness boundary at
!! different locations.
procedure :: salinity_bound_info => upstream_info
!! Indicates the type and depth of the thickness boundary at
!! different locations.
procedure :: thickness_bound => upstream_thickness_bound
!! Produces a field containing the boundary conditions for plume
!! thickness at the specified location.
procedure :: velocity_bound => upstream_velocity_bound
!! Produces a field containing the boundary conditions for plume
!! velocity at the specified location.
procedure :: temperature_bound => upstream_temperature_bound
!! Produces a field containing the boundary conditions for plume
!! temperature at the specified location.
procedure :: salinity_bound => upstream_salinity_bound
!! Produces a field containing the boundary conditions for plume
!! salinity at the specified location.
procedure :: calculate => upstream_calculate
!! Calculates the upstreamed boundary conditions for the given
!! time and ice thickness.
end type upstream_plume_boundary