37 #include <tests/myratest.h>    44 std::vector<int> random_rows(
int I, 
int N)
    46   std::vector<int> answer;
    47   for (
int n = 0; n < N; ++n)
    48     answer.push_back( random_int(0,I) );
    56   int J = Bv.
size().second;
    58   for (
int j = 0; j < J; ++j)
    59     for (
int i = 0; i < Bi.size(); ++i)
    60       B_builder(Bi[i],j) = Bv(i,j);
    61   return B_builder.make_SparseMatrix();
    65 template<
class Precision> 
void test(Precision tolerance)
    78   for (
int n = 0; n < N; ++n)
    84   Options options = Options::create().set_blocksize(4).set_globsize(4).set_nthreads(4);
    97     Precision S_error = frobenius(S1.
make_Matrix(
'T')-S2)/frobenius(S2);
    98     myra::out() << 
"|B'*inv(A)*B [dense] - B'*inv(A)*B [sparse]| = " << S_error << std::endl;
    99     REQUIRE(S_error < tolerance);
   105     auto Bi = random_rows(N,10);
   107     auto B = fill(N,Bi,Bv);
   108     auto S1 = solver.schur(Bi,Bv,options);
   110     auto S2 = gemm(B.make_Matrix(),
'T',gemm(inverse(A.
make_Matrix()),B.make_Matrix()));       
   111     Precision S_error = frobenius(S1.
make_Matrix(
'T')-S2)/frobenius(S2);
   112     myra::out() << 
"|schur(B)-schur(BiBv)| = " << S_error << std::endl;
   113     REQUIRE(S_error < tolerance);
   119     auto Bi = ilinspace(0,N);
   121     Number S1 = solver.schur(Bi,Bv,options)(0,0);
   126     Number S2 = dotu(Bv.
vector(0),Cv.vector(0));
   127     Precision S_error = std::abs(S1-S2)/std::abs(S2);
   128     myra::out() << 
"|schur(Bi,Bv)-dot(L\\Bv,L\\Bv))| = " << S_error << std::endl;
   129     REQUIRE(S_error < tolerance);
   140     Precision S_error = frobenius(S1-S2)/frobenius(S2);
   141     myra::out() << 
"|C'*inv(A)*D [dense] - C'*inv(A)*D [sparse]| = " << S_error << std::endl;
   142     REQUIRE(S_error < tolerance);
   148     auto Bi = random_rows(N,10);
   150     auto Ci = random_rows(N,10);
   152     auto S1 = solver.schur(Bi,Bv,Ci,Cv,options);
   154     auto B = fill(N,Bi,Bv);
   155     auto C = fill(N,Ci,Cv);
   156     auto S2 = gemm(B.make_Matrix(),
'T',gemm(inverse(A.
make_Matrix()),C.make_Matrix()));   
   157     Precision S_error = frobenius(S1-S2)/frobenius(S2);
   158     myra::out() << 
"|schur(B,C)-schur(BiBv,CiCv)| = " << S_error << std::endl;
   159     REQUIRE(S_error < tolerance);
   164     auto Bi = ilinspace(0,N);
   166     auto Ci = ilinspace(0,N);
   168     Number S1 = solver.schur(Bi,Bv,Ci,Cv,options)(0,0);
   173     Number S2 = dotu(Bv.
vector(0),Cv.vector(0));
   174     Precision S_error = std::abs(S1-S2)/std::abs(S2);
   175     myra::out() << 
"|schur(Bi,Bv)-dot(L\\Bv,L\\Bv))| = " << S_error << std::endl;
   176     REQUIRE(S_error < tolerance);
   183 ADD_TEST(
"zldlt2_schur",
"[multifrontal][parallel]")
   185   test<double>(1.0e-8);
 Sparse direct solver suitable for complex symmetric systems. 
Definition: SparseZLDLTSolver.h:61
Interface class for representing subranges of dense Matrix's. 
Options pack for routines in /multifrontal. 
Definition: Options.h:24
Represents a Permutation matrix, used to reorder rows/columns/etc of various numeric containers...
Definition: Permutation.h:34
Tabulates an IxJ matrix. Allows random access, has column major layout to be compatible with BLAS/LAP...
Definition: bdsqr.h:20
Matrix< Number > make_Matrix(char op='N') const
Accumulates *this onto the lower triangle of a Matrix<Number> 
Definition: LowerMatrix.cpp:152
Routines for computing Frobenius norms of various algebraic containers. 
static Matrix< Number > random(int I, int J)
Generates a random Matrix of specified size. 
Definition: Matrix.cpp:353
Sparse direct solver suitable for complex symmetric systems. 
static SparseMatrix< Number > random(int I, int J, int N)
Generates a random SparseMatrix with size IxJ and (approximately) N nonzeros. 
Definition: SparseMatrix.cpp:493
Reduces a std::vector to its unique entries, and sorts it. 
General purpose compressed-sparse-column (CSC) container. 
Range construct for a lower triangular matrix stored in rectangular packed format. 
void sortunique(std::vector< T > &v)
Reduces a std::vector to its unique entries, and sorts it. 
Definition: sortunique.h:20
Specialized container for a lower triangular matrix, O(N^2/2) storage. Used by symmetry exploiting ma...
Reflects a Precision type into a complex type. 
Definition: Number.h:46
Routines for inner products of Vector's / VectorRange's. 
Various utility functions/classes related to scalar Number types. 
Returns a vector of int's, over [min,max) 
General purpose dense matrix container, O(i*j) storage. 
Overwrites a LowerMatrix, DiagonalMatrix, or square Matrix with its own inverse. Or, returns it as a copy. 
Aggregates a (perm, iperm, swaps) triple into a vocabulary type. 
Convenience type for building SparseMatrix's, uses coordinate/triplet format. 
Definition: SparseMatrix.h:32
std::pair< int, int > size() const
Size inspector. 
Definition: Matrix.cpp:116
Convenience type for building SparseMatrix's, uses coordinate/triplet format. Note that SparseMatrixB...
CVectorRange< Number > vector(int j) const
Returns the j'th column as a VectorRange. 
Definition: Matrix.cpp:154
Stores a lower triangular matrix in rectangular packed format. 
Definition: conjugate.h:22
Stores an IxJ matrix A in compressed sparse column format. 
Definition: bothcat.h:23
Helper routines for reordering/filling 2D structured grids. Used by many unit tests. 
Variety of routines all for dense Matrix*Matrix multiplies. Delegates to the BLAS. 
Applies random phase shifts to a complex square SparseMatrix. 
Range/Iterator types associated with SparseMatrix. 
Matrix< Number > make_Matrix() const
Accumulates *this onto a Matrix<Number>. 
Definition: SparseMatrix.cpp:581
Interface class for representing subranges of contiguous int's. 
|B'*inv(A)*B [dense] - B'*inv(A)*B [sparse]| = 3.71176e-14
|schur(B)-schur(BiBv)| = 3.44232e-14
|schur(Bi,Bv)-dot(L\Bv,L\Bv))| = 1.52267e-14
|C'*inv(A)*D [dense] - C'*inv(A)*D [sparse]| = 3.44319e-14
|schur(B,C)-schur(BiBv,CiCv)| = 3.54289e-14
|schur(Bi,Bv)-dot(L\Bv,L\Bv))| = 1.60637e-15