Module matrix_mod
module matrix_mod
! Uses
use precision_mod
! Variables
logical, public :: MatrixFail
! Interfaces
public interface OPERATOR (.TIMES.)
public interface OPERATOR (.TRANSPOSE.)
public interface OPERATOR (.INVERT.)
! Subroutines and functions
public function R4MatrixTranspose (A) result (Atranspose)
public function R8MatrixTranspose (A) result (Atranspose)
public function R4MatrixMultiply (A, B) result (AB)
public function R8MatrixMultiply (A, B) result (AB)
public function R4MatrixInvert (A) result (Ainverse)
public function R8MatrixInvert (A) result (Ainverse)
public function MatSolv (A, B, x) result (iStat)
public recursive subroutine Triangulate (Aug, iStat)
end module matrix_mod
Description of Variables
MatrixFail
logical, public :: MatrixFail
Description of Interfaces
OPERATOR (.TIMES.)
public interface OPERATOR (.TIMES.)
module procedure R4MatrixMultiply
module procedure R8MatrixMultiply
end interface OPERATOR (.TIMES.)
OPERATOR (.TRANSPOSE.)
public interface OPERATOR (.TRANSPOSE.)
module procedure R4MatrixTranspose
module procedure R8MatrixTranspose
end interface OPERATOR (.TRANSPOSE.)
OPERATOR (.INVERT.)
public interface OPERATOR (.INVERT.)
module procedure R4MatrixInvert
module procedure R8MatrixInvert
end interface OPERATOR (.INVERT.)
Description of Subroutines and Functions
R4MatrixTranspose
public function R4MatrixTranspose (A) result (Atranspose)
real (kind=R4), DIMENSION(:,:), INTENT(IN) :: A
real (kind=R4), DIMENSION(SIZE(A,2),SIZE(A,1)) :: Atranspose
end function R4MatrixTranspose
R8MatrixTranspose
public function R8MatrixTranspose (A) result (Atranspose)
real (kind=R8), DIMENSION(:,:), INTENT(IN) :: A
real (kind=R8), DIMENSION(SIZE(A,2),SIZE(A,1)) :: Atranspose
end function R8MatrixTranspose
R4MatrixMultiply
public function R4MatrixMultiply (A, B) result (AB)
real (kind=R4), DIMENSION(:,:), INTENT(IN) :: A
real (kind=R4), DIMENSION(:,:), INTENT(IN) :: B
real (kind=R4), DIMENSION(SIZE(A,1),SIZE(B,2)) :: AB
end function R4MatrixMultiply
R8MatrixMultiply
public function R8MatrixMultiply (A, B) result (AB)
real (kind=R8), DIMENSION(:,:), INTENT(IN) :: A
real (kind=R8), DIMENSION(:,:), INTENT(IN) :: B
real (kind=R8), DIMENSION(SIZE(A,1),SIZE(B,2)) :: AB
end function R8MatrixMultiply
R4MatrixInvert
public function R4MatrixInvert (A) result (Ainverse)
real (kind=R4), DIMENSION(:,:), INTENT(IN) :: A
real (kind=R4), DIMENSION(SIZE(A,1),SIZE(A,2)) :: Ainverse
! Calls: kerror
end function R4MatrixInvert
R8MatrixInvert
public function R8MatrixInvert (A) result (Ainverse)
real (kind=R8), DIMENSION(:,:), INTENT(IN) :: A
real (kind=R8), DIMENSION(SIZE(A,1),SIZE(A,2)) :: Ainverse
! Calls: kerror
end function R8MatrixInvert
MatSolv
public function MatSolv (A, B, x) result (iStat)
real (kind=R8), DIMENSION(:, :), INTENT(in) :: A
real (kind=R8), DIMENSION(:), INTENT(in) :: B
real (kind=R8), DIMENSION(SIZE(A, 2)), INTENT(out) :: x
integer (kind=I4) :: iStat
! Calls: Triangulate
end function MatSolv
$ SUBROUTINE test_matrix
$
$ REAL, DIMENSION(3,3):: B
$ REAL, DIMENSION(SIZE(B,2),SIZE(B,1)):: Btranspose
$ REAL, DIMENSION(SIZE(B,1),SIZE(B,2)):: Binverse
$ REAL, DIMENSION(SIZE(B,1),SIZE(B,2)):: BBinv
$
$ B(1,1) = 1; B(1,2) = 2; B(1,3) = 5
$ B(2,1) = 2; B(2,2) = 3; B(2,3) = 8
$ B(3,1) =-1; B(3,2) = 1; B(3,3) = 2
$
$ Btranspose = .transpose.B
$
$ print*, 'Transpose:'
$ Print*, Btranspose(1,1), Btranspose(1,2), Btranspose(1,3)
$ Print*, Btranspose(2,1), Btranspose(2,2), Btranspose(2,3)
$ Print*, Btranspose(3,1), Btranspose(3,2), Btranspose(3,3)
$
$ Binverse = .invert.B
$
$ print*, 'Inverse:'
$ Print*, Binverse(1,1), Binverse(1,2), Binverse(1,3)
$ Print*, Binverse(2,1), Binverse(2,2), Binverse(2,3)
$ Print*, Binverse(3,1), Binverse(3,2), Binverse(3,3)
$
$ BBinv = B.times.(.invert.B)
$ print*, 'Mult'
$ Print*, BBinv(1,1), BBinv(1,2), BBinv(1,3)
$ Print*, BBinv(2,1), BBinv(2,2), BBinv(2,3)
$ Print*, BBinv(3,1), BBinv(3,2), BBinv(3,3)
$
$ END SUBROUTINE test_matrix
------------------------------------------------------------------------------
MatSolv solves a matrix equation of the type Ax = B.
Triangulate
public recursive subroutine Triangulate (Aug, iStat)
real (kind=R8), DIMENSION(:, :), INTENT(inout) :: Aug
integer (kind=I4), INTENT(inout) :: iStat
! Calls: Triangulate
end subroutine Triangulate
------------------------------------------------------------------------------
Triangulate produces a triangular augmented matrix equivalent to the input
augmented matrix.
------------------------------------------------------------------------------