A type in which procedures for getting the boundary conditions of glaciers are to be specified. The descendent types can contain whatever data is needed to compute the result. It provides the routine boundary_residuals to return an array with the residuals representing deviation from satisfying the conditions. This can then be appended to a glacier's residual array.
When specifying boundary conditions in this way, it becomes necessary not to include the residual of the plume data at some location(s). Typically this would be adjacent to the boundaries being prescribed. In order to accomplish this, routines are provided which return arrays indicating at which boundaries data should be omitted and how much. These should be passed as arguments for the field methods to get and set the field's raw data.
This class effectively provides free boundary conditions. It's type-bound procedures should be overridden to provide case-specific conditions.
Returns a 1D array which should be passed as the
exclude_lower_bound
/provide_lower_bound
argument when
getting or setting the raw representation of the thickness
field.
Default implementation of the method getting lower and upper boundary information, which is then passed to the methods for getting and setting raw representations of fields. It returns a 1D array of length 2, indicating free boundaries (the raw data should represent all cells contained in the field, not excluding any near the boundaries).
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(glacier_boundary), | intent(in) | :: | this |
Returns a 1D array which should be passed as the
exclude_upper_bound
/provide_upper_bound
argument when
getting or setting the raw representation of the thickness
field.
Default implementation of the method getting lower and upper boundary information, which is then passed to the methods for getting and setting raw representations of fields. It returns a 1D array of length 2, indicating free boundaries (the raw data should represent all cells contained in the field, not excluding any near the boundaries).
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(glacier_boundary), | intent(in) | :: | this |
Returns a 1D array which should be passed as the
exclude_lower_bound
/provide_lower_bound
argument when
getting or setting the raw representation of the velocity
field.
Default implementation of the method getting lower and upper boundary information, which is then passed to the methods for getting and setting raw representations of fields. It returns a 1D array of length 2, indicating free boundaries (the raw data should represent all cells contained in the field, not excluding any near the boundaries).
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(glacier_boundary), | intent(in) | :: | this |
Returns a 1D array which should be passed as the
exclude_upper_bound
/provide_upper_bound
argument when
getting or setting the raw representation of the velocity
field.
Default implementation of the method getting lower and upper boundary information, which is then passed to the methods for getting and setting raw representations of fields. It returns a 1D array of length 2, indicating free boundaries (the raw data should represent all cells contained in the field, not excluding any near the boundaries).
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(glacier_boundary), | intent(in) | :: | this |
Returns an array indicating what type of boundary conditions apply for thickness at the lower boundary of each dimension. The types are specified using the parameters in [boundary_types_mod].
Default implementation of the methods getting the boundary types for a glacier. It returns an array which indicates free boundaries.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(glacier_boundary), | intent(in) | :: | this |
Returns an array indicating what type of boundary conditions apply for thickness at the upper boundary of each dimension. The types are specified using the parameters in [boundary_types_mod].
Default implementation of the methods getting the boundary types for a glacier. It returns an array which indicates free boundaries.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(glacier_boundary), | intent(in) | :: | this |
Returns an array indicating what type of boundary conditions apply for velocity at the lower boundary of each dimension. The types are specified using the parameters in [boundary_types_mod].
Default implementation of the methods getting the boundary types for a glacier. It returns an array which indicates free boundaries.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(glacier_boundary), | intent(in) | :: | this |
Returns an array indicating what type of boundary conditions apply for velocity at the upper boundary of each dimension. The types are specified using the parameters in [boundary_types_mod].
Default implementation of the methods getting the boundary types for a glacier. It returns an array which indicates free boundaries.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(glacier_boundary), | intent(in) | :: | this |
Returns an array consisting of the difference between the required boundary values and those which actually exist. The order in which these are listed is as follows: lower thickness boundary, upper thickness boundary, lower velocity boundary, and upper velocity boundary.
Default implementation of the boundary_residuals method. It returns a zero-length array, effectively indicating free boundaries.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(glacier_boundary), | intent(in) | :: | this | |||
class(scalar_field), | intent(in) | :: | thickness | A field containing the thickness of the glacier |
||
class(vector_field), | intent(in) | :: | velocity | A field containing the flow velocity of the glacier |
||
class(scalar_field), | intent(in) | :: | viscosity | A field containing the viscosity of the ice in the glacier. |
||
real(kind=r8), | intent(in) | :: | t | The time at which the boundary conditions are to be calculated. |
An array containing the difference between the required boundary values and those which are actually present. They are stored in the order: lower thickness boundary, upper thickness boundary, lower velocity boundary, and upper velocity boundary.
type, public :: glacier_boundary
!* Author: Chris MacMackin
! Date: September 2016
!
! A type in which procedures for getting the boundary conditions
! of glaciers are to be specified. The descendent types can
! contain whatever data is needed to compute the result. It
! provides the routine
! [[glacier_boundary(type):boundary_residuals]] to return an
! array with the residuals representing deviation from satisfying
! the conditions. This can then be appended to a
! [[glacier(type)]]'s residual array.
!
! When specifying boundary conditions in this way, it becomes
! necessary not to include the residual of the plume data at some
! location(s). Typically this would be adjacent to the boundaries
! being prescribed. In order to accomplish this, routines are
! provided which return arrays indicating at which boundaries data
! should be omitted and how much. These should be passed as
! arguments for the field methods to get and set the field's raw
! data.
!
! This class effectively provides free boundary conditions. It's
! type-bound procedures should be overridden to provide case-specific
! conditions.
!
contains
procedure :: thickness_lower_bound => bound_array
!! Returns a 1D array which should be passed as the
!! `exclude_lower_bound`/`provide_lower_bound` argument when
!! getting or setting the raw representation of the thickness
!! field.
procedure :: thickness_upper_bound => bound_array
!! Returns a 1D array which should be passed as the
!! `exclude_upper_bound`/`provide_upper_bound` argument when
!! getting or setting the raw representation of the thickness
!! field.
procedure :: velocity_lower_bound => bound_array
!! Returns a 1D array which should be passed as the
!! `exclude_lower_bound`/`provide_lower_bound` argument when
!! getting or setting the raw representation of the velocity
!! field.
procedure :: velocity_upper_bound => bound_array
!! Returns a 1D array which should be passed as the
!! `exclude_upper_bound`/`provide_upper_bound` argument when
!! getting or setting the raw representation of the velocity
!! field.
procedure :: thickness_lower_type => bound_type
!! Returns an array indicating what type of boundary conditions
!! apply for thickness at the lower boundary of each
!! dimension. The types are specified using the parameters in
!! [boundary_types_mod].
procedure :: thickness_upper_type => bound_type
!! Returns an array indicating what type of boundary conditions
!! apply for thickness at the upper boundary of each
!! dimension. The types are specified using the parameters in
!! [boundary_types_mod].
procedure :: velocity_lower_type => bound_type
!! Returns an array indicating what type of boundary conditions
!! apply for velocity at the lower boundary of each
!! dimension. The types are specified using the parameters in
!! [boundary_types_mod].
procedure :: velocity_upper_type => bound_type
!! Returns an array indicating what type of boundary conditions
!! apply for velocity at the upper boundary of each
!! dimension. The types are specified using the parameters in
!! [boundary_types_mod].
procedure :: boundary_residuals
!! Returns an array consisting of the difference between the
!! required boundary values and those which actually exist. The
!! order in which these are listed is as follows: lower
!! thickness boundary, upper thickness boundary, lower velocity
!! boundary, and upper velocity boundary.
end type glacier_boundary