-
Notifications
You must be signed in to change notification settings - Fork 14
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
10 changed files
with
216 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,73 @@ | ||
// Copyright (c) 2017-2023, University of Tennessee. All rights reserved. | ||
// SPDX-License-Identifier: BSD-3-Clause | ||
// This program is free software: you can redistribute it and/or modify it under | ||
// the terms of the BSD 3-Clause license. See the accompanying LICENSE file. | ||
|
||
#include "lapack.hh" | ||
#include "lapack/fortran.h" | ||
|
||
#include <vector> | ||
|
||
namespace lapack { | ||
|
||
//------------------------------------------------------------------------------ | ||
/// @ingroup heev_computational | ||
void lae2( | ||
float a, float b, float c, | ||
float* rt1, | ||
float* rt2 ) | ||
{ | ||
LAPACK_slae2( | ||
&a, &b, &c, rt1, rt2 ); | ||
} | ||
|
||
//------------------------------------------------------------------------------ | ||
/// Computes the eigenvalues of a 2-by-2 symmetric matrix | ||
/// [ a b ] | ||
/// [ b c ]. | ||
/// On return, rt1 is the eigenvalue of larger absolute value, and rt2 | ||
/// is the eigenvalue of smaller absolute value. | ||
/// | ||
/// Overloaded versions are available for | ||
/// `float`, `double`. | ||
/// | ||
/// @param[in] a | ||
/// The (1, 1) element of the 2-by-2 matrix. | ||
/// | ||
/// @param[in] b | ||
/// The (1, 2) and (2, 1) elements of the 2-by-2 matrix. | ||
/// | ||
/// @param[in] c | ||
/// The (2, 2) element of the 2-by-2 matrix. | ||
/// | ||
/// @param[out] rt1 | ||
/// The eigenvalue of larger absolute value. | ||
/// | ||
/// @param[out] rt2 | ||
/// The eigenvalue of smaller absolute value. | ||
/// | ||
//------------------------------------------------------------------------------ | ||
/// @par Further Details | ||
/// | ||
/// rt1 is accurate to a few ulps barring over/underflow. | ||
/// | ||
/// rt2 may be inaccurate if there is massive cancellation in the | ||
/// determinant a*c-b*b; higher precision or correctly rounded or | ||
/// correctly truncated arithmetic would be needed to compute rt2 | ||
/// accurately in all cases. | ||
/// | ||
/// Overflow is possible only if rt1 is within a factor of 5 of overflow. | ||
/// Underflow is harmless if the input data is 0 or exceeds | ||
/// underflow_threshold / macheps. | ||
/// | ||
/// @ingroup heev_computational | ||
void lae2( | ||
double a, double b, double c, | ||
double* rt1, | ||
double* rt2 ) | ||
{ | ||
LAPACK_dlae2( | ||
&a, &b, &c, rt1, rt2 ); | ||
} | ||
|
||
} // namespace lapack |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,108 @@ | ||
// Copyright (c) 2017-2023, University of Tennessee. All rights reserved. | ||
// SPDX-License-Identifier: BSD-3-Clause | ||
// This program is free software: you can redistribute it and/or modify it under | ||
// the terms of the BSD 3-Clause license. See the accompanying LICENSE file. | ||
|
||
#include "test.hh" | ||
#include "lapack.hh" | ||
#include "lapack/flops.hh" | ||
#include "print_matrix.hh" | ||
#include "error.hh" | ||
#include "lapacke_wrappers.hh" | ||
|
||
#include <vector> | ||
|
||
//------------------------------------------------------------------------------ | ||
template< typename scalar_t > | ||
void test_lae2_work( Params& params, bool run ) | ||
{ | ||
using real_t = blas::real_type< scalar_t >; | ||
using blas::conj; | ||
using lapack::Job, lapack::Uplo; | ||
|
||
// Constants | ||
const real_t eps = std::numeric_limits< real_t >::epsilon(); | ||
|
||
// get & mark input values | ||
params.dim.m() = 2; | ||
params.dim.n() = 2; | ||
real_t tol = params.tol() * eps; | ||
int verbose = params.verbose(); | ||
params.matrix.mark(); | ||
|
||
// mark non-standard output values | ||
params.error.name( "Lambda" ); | ||
|
||
if (! run) | ||
return; | ||
|
||
//---------- setup | ||
int64_t n = 2; | ||
int64_t lda = 2; | ||
std::vector< scalar_t > A( lda*n ); | ||
|
||
lapack::generate_matrix( params.matrix, n, n, &A[0], lda ); | ||
|
||
// A = [ a b ], stored column-wise. | ||
// [ conj(b) c ] | ||
scalar_t a = A[ 0 ]; | ||
scalar_t b = A[ 2 ]; | ||
scalar_t c = A[ 3 ]; | ||
A[ 1 ] = conj( b ); | ||
|
||
real_t rt1, rt2, rt1_ref, rt2_ref, cs1; | ||
scalar_t sn1; | ||
|
||
if (verbose >= 2) { | ||
printf( "A = " ); print_matrix( n, n, &A[0], lda ); | ||
} | ||
|
||
//---------- run test | ||
testsweeper::flush_cache( params.cache() ); | ||
double time = testsweeper::get_wtime(); | ||
// no info returned | ||
lapack::lae2( a, b, c, &rt1, &rt2 ); | ||
time = testsweeper::get_wtime() - time; | ||
|
||
params.time() = time; | ||
|
||
std::vector< real_t > Lambda{ rt1, rt2 }; | ||
|
||
if (verbose >= 2) { | ||
printf( "Lambda = " ); print_vector( n, &Lambda[0], 1 ); | ||
} | ||
|
||
if (params.check() == 'y') { | ||
//---------- run reference, using laev2 | ||
testsweeper::flush_cache( params.cache() ); | ||
time = testsweeper::get_wtime(); | ||
lapack::laev2( a, b, c, &rt1_ref, &rt2_ref, &cs1, &sn1 ); | ||
time = testsweeper::get_wtime() - time; | ||
|
||
params.ref_time() = time; | ||
|
||
//---------- check error compared to reference | ||
std::vector< real_t > Lambda_ref{ rt1_ref, rt2_ref }; | ||
real_t error = rel_error( Lambda, Lambda_ref ); | ||
params.error() = error; | ||
params.okay() = (error < tol); | ||
} | ||
} | ||
|
||
//------------------------------------------------------------------------------ | ||
void test_lae2( Params& params, bool run ) | ||
{ | ||
switch (params.datatype()) { | ||
case testsweeper::DataType::Single: | ||
test_lae2_work< float >( params, run ); | ||
break; | ||
|
||
case testsweeper::DataType::Double: | ||
test_lae2_work< double >( params, run ); | ||
break; | ||
|
||
default: | ||
throw std::runtime_error( "unknown datatype" ); | ||
break; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters