26 use,
intrinsic :: iso_fortran_env
44 type(namespace_t),
intent(in) :: namespace
47 real(real64),
parameter :: tol = 1.0e-12_real64
48 integer,
parameter :: n = 2
49 real(real64) :: factor
50 real(real64),
dimension(n, n) :: A, funA, expected
51 complex(real64),
dimension(n, n) :: zA, zfunA, zexpected
53 integer,
parameter :: n3 = 3
54 complex(real64),
dimension(n3, n3) :: A3, funA3, ident3, product
55 complex(real64) :: zfactor
65 a = reshape([1.0_real64, 0.0_real64, 0.0_real64, 2.0_real64], shape(a))
72 expected(1, 1) =
exp(1.0_real64)
73 expected(2, 2) =
exp(2.0_real64)
75 message(1) =
"Testing real diagonal matrix exponential..."
76 if ( maxval( abs(funa - expected) ) < tol )
then
77 message(2) =
"Diagonal matrix test passed."
79 message(2) =
"Diagonal matrix test failed."
96 message(1) =
"Testing complex diagonal matrix exponential..."
97 if ( maxval( abs(zfuna - zexpected) ) < tol )
then
98 message(2) =
"Diagonal matrix test passed."
100 message(2) =
"Diagonal matrix test failed."
108 message(1) =
"Testing complex diagonal Hermitian matrix exponential..."
109 if ( maxval( abs(zfuna - zexpected) ) < tol )
then
110 message(2) =
"Diagonal matrix test passed."
112 message(2) =
"Diagonal matrix test failed."
128 zexpected = (0.0_real64, 0.0_real64)
129 zexpected(1,1) = (1.0_real64, 0.0_real64)
130 zexpected(2,2) = (1.0_real64, 0.0_real64)
131 zexpected(1,2) = (1.0_real64, 1.0_real64)
133 message(1) =
"Testing nilpotent matrix exponential..."
134 if ( maxval( abs(zfuna - zexpected) ) < tol )
then
135 message(2) =
"Nilpotent matrix test passed."
137 message(2) =
"Nilpotent matrix test failed."
153 a3 = (0.0_real64, 0.0_real64)
155 a3(1,1) = (2.0_real64, 0.0_real64)
156 a3(2,2) = (2.0_real64, 0.0_real64)
157 a3(3,3) = (2.0_real64, 0.0_real64)
159 a3(1,2) = (1.0_real64, 0.0_real64); a3(2,1) = (1.0_real64, 0.0_real64)
160 a3(2,3) = (1.0_real64, 0.0_real64); a3(3,2) = (1.0_real64, 0.0_real64)
165 ident3 = (0.0_real64, 0.0_real64)
166 ident3(1,1) = (1.0_real64, 0.0_real64)
167 ident3(2,2) = (1.0_real64, 0.0_real64)
168 ident3(3,3) = (1.0_real64, 0.0_real64)
171 product = matmul(funa3, transpose(conjg(funa3)))
173 message(1) =
"Testing tridiagonal matrix exp(iA) for unitarity..."
174 if ( maxval( abs(product - ident3) ) < tol )
then
175 message(2) =
"Tridiagonal matrix exp(iA) test passed."
177 message(2) =
"Tridiagonal matrix exp(iA) test failed."
186 real(real64) function
expfun(z)
188 real(real64),
intent(in) :: z
194 complex(real64) function zexpfun(z)
196 complex(real64),
intent(in) :: z
double exp(double __x) __attribute__((__nothrow__
real(real64), parameter, public m_two
real(real64), parameter, public m_zero
complex(real64), parameter, public m_z0
complex(real64), parameter, public m_zi
complex(real64), parameter, public m_z1
real(real64), parameter, public m_one
This modules takes care of testing some linear algebra routines.
real(real64) function expfun(z)
Scalar exponential function for real arguments.
complex(real64) function zexpfun(z)
Scalar exponential function for complex arguments.
subroutine, public test_exponential_matrix(namespace)
Unit tests for the exponential of a matrix.
character(len=256), dimension(max_lines), public message
to be output by fatal, warning
subroutine, public messages_info(no_lines, iunit, debug_only, stress, all_nodes, namespace)