mod_banded_matrix Module

Contains types and routines to handle banded matrices. We use the same conventions as explained in the LAPACK guide http://www.netlib.org/lapack/lug/node124.html.



Contents


Derived Types

type, public :: banded_matrix_t

type to represent a complex banded matrix

Components

TypeVisibilityAttributesNameInitial
integer, public :: m

number of rows

integer, public :: n

number of columns

integer, public :: kl

number of subdiagonals

integer, public :: ku

number of superdiagonals

complex(kind=dp), public, allocatable:: AB(:,:)

array containing the banded storage

Type-Bound Procedures

procedure, public :: get_element
procedure, public :: set_element
procedure, public :: get_total_nb_elements
procedure, public :: get_total_nb_nonzero_elements
procedure, public :: is_compatible_with
procedure, public :: destroy

Functions

public function new_banded_matrix(rows, cols, subdiags, superdiags) result(matrix)

Constructor for a new banded matrix with a given number of rows, columns, subdiagonals and superdiagonals. Allocates and initialises the datatype.

Arguments

TypeIntentOptionalAttributesName
integer, intent(in) :: rows

number of rows

integer, intent(in) :: cols

number of columns

integer, intent(in) :: subdiags

number of subdiagonals

integer, intent(in) :: superdiags

number of superdiagonals

Return Value type(banded_matrix_t)

banded matrix datatype

private pure function get_element(this, row, col) result(element)

Retrieves the element at position (row, col) of the original matrix. See the LAPACK documentation, element $a_{ij}$ of the original matrix is stored at position $(ku + 1 + i - j, j)$ (with $ku$ the number of superdiagonals).

Arguments

TypeIntentOptionalAttributesName
class(banded_matrix_t), intent(in) :: this

type instance

integer, intent(in) :: row

the row index of the original position

integer, intent(in) :: col

the column index of the original position

Return Value complex(kind=dp)

the element at original position (row, col)

private pure function get_total_nb_elements(this)

Returns the total number of elements inside the banded matrix.

Arguments

TypeIntentOptionalAttributesName
class(banded_matrix_t), intent(in) :: this

type instance

Return Value integer

private pure function get_total_nb_nonzero_elements(this)

Returns the total number of nonzero elements inside the banded matrix.

Arguments

TypeIntentOptionalAttributesName
class(banded_matrix_t), intent(in) :: this

type instance

Return Value integer

private pure function is_within_band(matrix, row, col)

Checks if a given position (row, col) is within the banded structure, i.e. with $ku$ the number of superdiagonals and $kl$ the number of subdiagonals.

Arguments

TypeIntentOptionalAttributesName
type(banded_matrix_t), intent(in) :: matrix

the banded matrix structure

integer, intent(in) :: row

row index

integer, intent(in) :: col

column index

Return Value logical

private pure function is_compatible_with(this, other)

Checks if a banded matrix is compatibe with another banded matrix. This implies that the following attributes should be equal: - dimensions of the original matrices - number of superdiagonals and subdiagonals - dimensions of the banded matrices themselves Returns .true. if these three criteria are satisfied, .false. otherwise.

Arguments

TypeIntentOptionalAttributesName
class(banded_matrix_t), intent(in) :: this

type instance

type(banded_matrix_t), intent(in) :: other

other banded matrix

Return Value logical

private pure function dimensions_are_valid(rows, cols)

Checks if the given matrix dimensions are valid. For now, we only accept square matrices. Returns .true. if rows equals cols, .false. otherwise.

Arguments

TypeIntentOptionalAttributesName
integer, intent(in) :: rows

number of rows in the original matrix

integer, intent(in) :: cols

number of columns in the original matrix

Return Value logical


Subroutines

private pure subroutine set_element(this, row, col, element)

Sets the element $a_{ij}$ of the original array into the banded structure. The row and col arguments refer to the row and column indices of the element in the original array. This routine has no effect if the location falls outside of the banded structure.

Arguments

TypeIntentOptionalAttributesName
class(banded_matrix_t), intent(inout) :: this

type instance

integer, intent(in) :: row

row index of element

integer, intent(in) :: col

column index of element

complex(kind=dp), intent(in) :: element

value for the element at (row, col)

private pure subroutine destroy(this)

Destructor, deallocates the datastructure.

Arguments

TypeIntentOptionalAttributesName
class(banded_matrix_t), intent(inout) :: this

type instance