]> https://gitweb.dealii.org/ - dealii.git/commitdiff
scalapack: split _06 test into four
authorDenis Davydov <davydden@gmail.com>
Sat, 17 Feb 2018 22:18:39 +0000 (23:18 +0100)
committerDenis Davydov <davydden@gmail.com>
Sun, 18 Feb 2018 14:06:32 +0000 (15:06 +0100)
20 files changed:
tests/scalapack/scalapack_06.cc
tests/scalapack/scalapack_06.mpirun=1.output
tests/scalapack/scalapack_06.mpirun=11.output
tests/scalapack/scalapack_06.mpirun=4.output
tests/scalapack/scalapack_06.mpirun=9.output
tests/scalapack/scalapack_06a.cc [new file with mode: 0644]
tests/scalapack/scalapack_06a.mpirun=1.output [new file with mode: 0644]
tests/scalapack/scalapack_06a.mpirun=11.output [new file with mode: 0644]
tests/scalapack/scalapack_06a.mpirun=4.output [new file with mode: 0644]
tests/scalapack/scalapack_06a.mpirun=9.output [new file with mode: 0644]
tests/scalapack/scalapack_06b.cc [new file with mode: 0644]
tests/scalapack/scalapack_06b.mpirun=1.output [new file with mode: 0644]
tests/scalapack/scalapack_06b.mpirun=11.output [new file with mode: 0644]
tests/scalapack/scalapack_06b.mpirun=4.output [new file with mode: 0644]
tests/scalapack/scalapack_06b.mpirun=9.output [new file with mode: 0644]
tests/scalapack/scalapack_06c.cc [new file with mode: 0644]
tests/scalapack/scalapack_06c.mpirun=1.output [new file with mode: 0644]
tests/scalapack/scalapack_06c.mpirun=11.output [new file with mode: 0644]
tests/scalapack/scalapack_06c.mpirun=4.output [new file with mode: 0644]
tests/scalapack/scalapack_06c.mpirun=9.output [new file with mode: 0644]

index 461ae55d86cfa7868af75e57aa5adfe64ba6b5ee..28fcef22243c6230e3c824c452a241cdd61d63ce 100644 (file)
@@ -17,6 +17,7 @@
 #include "../lapack/create_matrix.h"
 
 // test eigenpairs_symmetric_by_index(const std::pair<unsigned int,unsigned int> &, const bool)
+// for all eigenvalues with eigenvectors
 
 #include <deal.II/base/logstream.h>
 #include <deal.II/base/utilities.h>
@@ -49,18 +50,29 @@ void test(const unsigned int size, const unsigned int block_size, const NumberTy
 
   pcout << size << " " << block_size << " " << grid->get_process_grid_rows() << " " << grid->get_process_grid_columns() << std::endl;
 
+  const unsigned int n_eigenvalues = size;
+  const unsigned int max_n_eigenvalues = 5;
+
   // Create SPD matrices of requested size:
   FullMatrix<NumberType> full_A(size);
-  std::vector<NumberType> lapack_A(size*size);
+  std::vector<NumberType> eigenvalues_Lapack(size);
+  std::vector<Vector<NumberType>> s_eigenvectors_ (max_n_eigenvalues,Vector<NumberType>(size));
+  std::vector<Vector<NumberType>> p_eigenvectors_ (max_n_eigenvalues,Vector<NumberType>(size));
+  FullMatrix<NumberType> p_eigenvectors (size,size);
+
+  ScaLAPACKMatrix<NumberType> scalapack_syev (size, grid, block_size);
+  scalapack_syev.set_property(LAPACKSupport::Property::symmetric);
 
   create_spd (full_A);
-  for (unsigned int i = 0; i < size; ++i)
-    for (unsigned int j = 0; j < size; ++j)
-      lapack_A[i*size+j] = full_A(i,j);
+  scalapack_syev = full_A;
 
-  std::vector<NumberType> eigenvalues_Lapack(size);
   //Lapack as reference
   {
+    std::vector<NumberType> lapack_A(size*size);
+    for (unsigned int i = 0; i < size; ++i)
+      for (unsigned int j = 0; j < size; ++j)
+        lapack_A[i*size+j] = full_A(i,j);
+
     int info; //Variable containing information about the successfull exit of the lapack routine
     char jobz = 'V';  //'V': all eigenpairs of A are computed
     char uplo = 'U';  //storage format of the matrix A; not so important as matrix is symmetric
@@ -77,86 +89,36 @@ void test(const unsigned int size, const unsigned int block_size, const NumberTy
     syev(&jobz, &uplo, &LDA, & *lapack_A.begin(), &LDA, & *eigenvalues_Lapack.begin(), & *work.begin(), &lwork, &info);
 
     AssertThrow (info==0, LAPACKSupport::ExcErrorCode("syev", info));
+    for (int i=0; i<max_n_eigenvalues; ++i)
+      for (int j=0; j<size; ++j)
+        s_eigenvectors_[i][j] = lapack_A[(size-1-i)*size+j];
+
   }
-  unsigned int n_eigenvalues = eigenvalues_Lapack.size(), max_n_eigenvalues=5;
 
-  std::vector<Vector<NumberType>> s_eigenvectors_ (max_n_eigenvalues,Vector<NumberType>(size));
-  for (int i=0; i<max_n_eigenvalues; ++i)
-    for (int j=0; j<size; ++j)
-      s_eigenvectors_[i][j] = lapack_A[(size-1-i)*size+j];
+  // the actual test:
 
   pcout << "comparing " << max_n_eigenvalues << " eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pdsyev:" << std::endl;
-  std::vector<NumberType> eigenvalues_psyev;
-  ScaLAPACKMatrix<NumberType> scalapack_syev (size, grid, block_size);
-  scalapack_syev.set_property(LAPACKSupport::Property::symmetric);
-  scalapack_syev = full_A;
-  eigenvalues_psyev = scalapack_syev.eigenpairs_symmetric_by_index(std::make_pair(0,size-1),true);
-  FullMatrix<NumberType> p_eigenvectors (size,size);
+  const std::vector<NumberType> eigenvalues_psyev = scalapack_syev.eigenpairs_symmetric_by_index(std::make_pair(0,size-1),true);
   scalapack_syev.copy_to(p_eigenvectors);
   for (unsigned int i=0; i<max_n_eigenvalues; ++i)
-    {
-      AssertThrow ( std::abs(eigenvalues_psyev[n_eigenvalues-i-1]-eigenvalues_Lapack[n_eigenvalues-i-1]) / std::abs(eigenvalues_Lapack[n_eigenvalues-i-1]) < tol,
-                    dealii::ExcInternalError());
-    }
-  pcout << "   with respect to the given tolerance the eigenvalues coincide" << std::endl;
+    AssertThrow ( std::abs(eigenvalues_psyev[n_eigenvalues-i-1]-eigenvalues_Lapack[n_eigenvalues-i-1]) / std::abs(eigenvalues_Lapack[n_eigenvalues-i-1]) < tol,
+                  ExcInternalError());
 
-  std::vector<Vector<NumberType>> p_eigenvectors_ (max_n_eigenvalues,Vector<NumberType>(size));
-  for (unsigned int i=0; i<max_n_eigenvalues; ++i)
-    for (unsigned int j=0; j<size; ++j)
-      p_eigenvectors_[i][j] = p_eigenvectors(j,size-1-i);
-
-  //product of eigenvectors computed using Lapack and ScaLapack has to be either 1 or -1
-  for (unsigned int i=0; i<max_n_eigenvalues; ++i)
-    {
-      NumberType product = p_eigenvectors_[i] * s_eigenvectors_[i];
-
-      //the requirement for alignment of the eigenvectors has to be released (primarily for floats)
-      AssertThrow (std::abs(std::abs(product)-1) < tol*10, dealii::ExcInternalError());
-    }
-  pcout << "   with respect to the given tolerance also the eigenvectors coincide" << std::endl << std::endl;
-
-  pcout << "comparing " << max_n_eigenvalues << " eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pdsyevx:" << std::endl;
-  std::vector<NumberType> eigenvalues_psyevx_partial;
-  ScaLAPACKMatrix<NumberType> scalapack_syevx_partial (size, grid, block_size);
-  scalapack_syevx_partial.set_property(LAPACKSupport::Property::symmetric);
-  scalapack_syevx_partial = full_A;
-  eigenvalues_psyevx_partial = scalapack_syevx_partial.eigenpairs_symmetric_by_index(std::make_pair(size-max_n_eigenvalues,size-1),true);
-  scalapack_syevx_partial.copy_to(p_eigenvectors);
-  for (unsigned int i=eigenvalues_psyevx_partial.size()-1; i>0; --i)
-    {
-      if ( !(std::abs(eigenvalues_psyevx_partial[i]-eigenvalues_Lapack[size-eigenvalues_psyevx_partial.size()+i]) /
-             std::abs(eigenvalues_Lapack[size-eigenvalues_psyevx_partial.size()+i]) < tol))
-        {
-          std::cout << "process #" << this_mpi_process << ": eigenvalues do not fit: "
-                    << eigenvalues_psyevx_partial[i] << " <--> " << eigenvalues_Lapack[size-eigenvalues_psyevx_partial.size()+i] << std::endl;
-        }
-
-      AssertThrow ( std::abs(eigenvalues_psyevx_partial[i]-eigenvalues_Lapack[size-eigenvalues_psyevx_partial.size()+i]) /
-                    std::abs(eigenvalues_Lapack[size-eigenvalues_psyevx_partial.size()+i]) < tol,
-                    dealii::ExcInternalError());
-    }
   pcout << "   with respect to the given tolerance the eigenvalues coincide" << std::endl;
 
   for (unsigned int i=0; i<max_n_eigenvalues; ++i)
     for (unsigned int j=0; j<size; ++j)
-      p_eigenvectors_[i][j] = p_eigenvectors(j,max_n_eigenvalues-1-i);
+      p_eigenvectors_[i][j] = p_eigenvectors(j,size-1-i);
 
   //product of eigenvectors computed using Lapack and ScaLapack has to be either 1 or -1
   for (unsigned int i=0; i<max_n_eigenvalues; ++i)
     {
-      NumberType product = p_eigenvectors_[i] * s_eigenvectors_[i];
-
-      if (!(std::abs(std::abs(product)-1) < tol*10))
-        {
-          std::cout << "process #" << this_mpi_process << ": eigenvectors do not coincide: abs(" << product << ") != 1" << std::endl;
-        }
-
+      const NumberType product = p_eigenvectors_[i] * s_eigenvectors_[i];
       //the requirement for alignment of the eigenvectors has to be released (primarily for floats)
-      AssertThrow (std::abs(std::abs(product)-1) < tol*10, dealii::ExcInternalError());
+      AssertThrow (std::abs(std::abs(product)-1) < tol*10,
+                   ExcInternalError());
     }
   pcout << "   with respect to the given tolerance also the eigenvectors coincide" << std::endl << std::endl;
-
-  pcout << std::endl;
 }
 
 
index c4d61c891c474279e49332a5d7df3fb461810efd..b22a60a90ae247cb3da56a30b18afac9b1b4e2b2 100644 (file)
@@ -3,58 +3,28 @@ comparing 5 eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pds
    with respect to the given tolerance the eigenvalues coincide
    with respect to the given tolerance also the eigenvectors coincide
 
-comparing 5 eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pdsyevx:
-   with respect to the given tolerance the eigenvalues coincide
-   with respect to the given tolerance also the eigenvectors coincide
-
-
 200 64 1 1
 comparing 5 eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pdsyev:
    with respect to the given tolerance the eigenvalues coincide
    with respect to the given tolerance also the eigenvectors coincide
 
-comparing 5 eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pdsyevx:
-   with respect to the given tolerance the eigenvalues coincide
-   with respect to the given tolerance also the eigenvectors coincide
-
-
 400 32 1 1
 comparing 5 eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pdsyev:
    with respect to the given tolerance the eigenvalues coincide
    with respect to the given tolerance also the eigenvectors coincide
 
-comparing 5 eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pdsyevx:
-   with respect to the given tolerance the eigenvalues coincide
-   with respect to the given tolerance also the eigenvectors coincide
-
-
 400 64 1 1
 comparing 5 eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pdsyev:
    with respect to the given tolerance the eigenvalues coincide
    with respect to the given tolerance also the eigenvectors coincide
 
-comparing 5 eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pdsyevx:
-   with respect to the given tolerance the eigenvalues coincide
-   with respect to the given tolerance also the eigenvectors coincide
-
-
 600 32 1 1
 comparing 5 eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pdsyev:
    with respect to the given tolerance the eigenvalues coincide
    with respect to the given tolerance also the eigenvectors coincide
 
-comparing 5 eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pdsyevx:
-   with respect to the given tolerance the eigenvalues coincide
-   with respect to the given tolerance also the eigenvectors coincide
-
-
 600 64 1 1
 comparing 5 eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pdsyev:
    with respect to the given tolerance the eigenvalues coincide
    with respect to the given tolerance also the eigenvectors coincide
 
-comparing 5 eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pdsyevx:
-   with respect to the given tolerance the eigenvalues coincide
-   with respect to the given tolerance also the eigenvectors coincide
-
-
index da927e1d1936da824961d5ac08a57865e65b2e1a..c3b5a17201c6d78da3a253b645daaa47e3a6d2ee 100644 (file)
@@ -3,58 +3,28 @@ comparing 5 eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pds
    with respect to the given tolerance the eigenvalues coincide
    with respect to the given tolerance also the eigenvectors coincide
 
-comparing 5 eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pdsyevx:
-   with respect to the given tolerance the eigenvalues coincide
-   with respect to the given tolerance also the eigenvectors coincide
-
-
 200 64 3 3
 comparing 5 eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pdsyev:
    with respect to the given tolerance the eigenvalues coincide
    with respect to the given tolerance also the eigenvectors coincide
 
-comparing 5 eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pdsyevx:
-   with respect to the given tolerance the eigenvalues coincide
-   with respect to the given tolerance also the eigenvectors coincide
-
-
 400 32 3 3
 comparing 5 eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pdsyev:
    with respect to the given tolerance the eigenvalues coincide
    with respect to the given tolerance also the eigenvectors coincide
 
-comparing 5 eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pdsyevx:
-   with respect to the given tolerance the eigenvalues coincide
-   with respect to the given tolerance also the eigenvectors coincide
-
-
 400 64 3 3
 comparing 5 eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pdsyev:
    with respect to the given tolerance the eigenvalues coincide
    with respect to the given tolerance also the eigenvectors coincide
 
-comparing 5 eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pdsyevx:
-   with respect to the given tolerance the eigenvalues coincide
-   with respect to the given tolerance also the eigenvectors coincide
-
-
 600 32 3 3
 comparing 5 eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pdsyev:
    with respect to the given tolerance the eigenvalues coincide
    with respect to the given tolerance also the eigenvectors coincide
 
-comparing 5 eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pdsyevx:
-   with respect to the given tolerance the eigenvalues coincide
-   with respect to the given tolerance also the eigenvectors coincide
-
-
 600 64 3 3
 comparing 5 eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pdsyev:
    with respect to the given tolerance the eigenvalues coincide
    with respect to the given tolerance also the eigenvectors coincide
 
-comparing 5 eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pdsyevx:
-   with respect to the given tolerance the eigenvalues coincide
-   with respect to the given tolerance also the eigenvectors coincide
-
-
index 98129f132b318a8d4cf0698f50e8fe26913fb2cc..6114bf4936bd7d8b60d2d3f9e43ac72884981b07 100644 (file)
@@ -3,58 +3,28 @@ comparing 5 eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pds
    with respect to the given tolerance the eigenvalues coincide
    with respect to the given tolerance also the eigenvectors coincide
 
-comparing 5 eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pdsyevx:
-   with respect to the given tolerance the eigenvalues coincide
-   with respect to the given tolerance also the eigenvectors coincide
-
-
 200 64 2 2
 comparing 5 eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pdsyev:
    with respect to the given tolerance the eigenvalues coincide
    with respect to the given tolerance also the eigenvectors coincide
 
-comparing 5 eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pdsyevx:
-   with respect to the given tolerance the eigenvalues coincide
-   with respect to the given tolerance also the eigenvectors coincide
-
-
 400 32 2 2
 comparing 5 eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pdsyev:
    with respect to the given tolerance the eigenvalues coincide
    with respect to the given tolerance also the eigenvectors coincide
 
-comparing 5 eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pdsyevx:
-   with respect to the given tolerance the eigenvalues coincide
-   with respect to the given tolerance also the eigenvectors coincide
-
-
 400 64 2 2
 comparing 5 eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pdsyev:
    with respect to the given tolerance the eigenvalues coincide
    with respect to the given tolerance also the eigenvectors coincide
 
-comparing 5 eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pdsyevx:
-   with respect to the given tolerance the eigenvalues coincide
-   with respect to the given tolerance also the eigenvectors coincide
-
-
 600 32 2 2
 comparing 5 eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pdsyev:
    with respect to the given tolerance the eigenvalues coincide
    with respect to the given tolerance also the eigenvectors coincide
 
-comparing 5 eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pdsyevx:
-   with respect to the given tolerance the eigenvalues coincide
-   with respect to the given tolerance also the eigenvectors coincide
-
-
 600 64 2 2
 comparing 5 eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pdsyev:
    with respect to the given tolerance the eigenvalues coincide
    with respect to the given tolerance also the eigenvectors coincide
 
-comparing 5 eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pdsyevx:
-   with respect to the given tolerance the eigenvalues coincide
-   with respect to the given tolerance also the eigenvectors coincide
-
-
index da927e1d1936da824961d5ac08a57865e65b2e1a..c3b5a17201c6d78da3a253b645daaa47e3a6d2ee 100644 (file)
@@ -3,58 +3,28 @@ comparing 5 eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pds
    with respect to the given tolerance the eigenvalues coincide
    with respect to the given tolerance also the eigenvectors coincide
 
-comparing 5 eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pdsyevx:
-   with respect to the given tolerance the eigenvalues coincide
-   with respect to the given tolerance also the eigenvectors coincide
-
-
 200 64 3 3
 comparing 5 eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pdsyev:
    with respect to the given tolerance the eigenvalues coincide
    with respect to the given tolerance also the eigenvectors coincide
 
-comparing 5 eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pdsyevx:
-   with respect to the given tolerance the eigenvalues coincide
-   with respect to the given tolerance also the eigenvectors coincide
-
-
 400 32 3 3
 comparing 5 eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pdsyev:
    with respect to the given tolerance the eigenvalues coincide
    with respect to the given tolerance also the eigenvectors coincide
 
-comparing 5 eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pdsyevx:
-   with respect to the given tolerance the eigenvalues coincide
-   with respect to the given tolerance also the eigenvectors coincide
-
-
 400 64 3 3
 comparing 5 eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pdsyev:
    with respect to the given tolerance the eigenvalues coincide
    with respect to the given tolerance also the eigenvectors coincide
 
-comparing 5 eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pdsyevx:
-   with respect to the given tolerance the eigenvalues coincide
-   with respect to the given tolerance also the eigenvectors coincide
-
-
 600 32 3 3
 comparing 5 eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pdsyev:
    with respect to the given tolerance the eigenvalues coincide
    with respect to the given tolerance also the eigenvectors coincide
 
-comparing 5 eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pdsyevx:
-   with respect to the given tolerance the eigenvalues coincide
-   with respect to the given tolerance also the eigenvectors coincide
-
-
 600 64 3 3
 comparing 5 eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pdsyev:
    with respect to the given tolerance the eigenvalues coincide
    with respect to the given tolerance also the eigenvectors coincide
 
-comparing 5 eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pdsyevx:
-   with respect to the given tolerance the eigenvalues coincide
-   with respect to the given tolerance also the eigenvectors coincide
-
-
diff --git a/tests/scalapack/scalapack_06a.cc b/tests/scalapack/scalapack_06a.cc
new file mode 100644 (file)
index 0000000..2d67f81
--- /dev/null
@@ -0,0 +1,119 @@
+// ---------------------------------------------------------------------
+//
+// Copyright (C) 2017 - 2018 by the deal.II authors
+//
+// This file is part of the deal.II library.
+//
+// The deal.II library is free software; you can use it, redistribute
+// it, and/or modify it under the terms of the GNU Lesser General
+// Public License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// The full text of the license can be found in the file LICENSE at
+// the top level of the deal.II distribution.
+//
+// ---------------------------------------------------------------------
+
+#include "../tests.h"
+#include "../lapack/create_matrix.h"
+
+// test eigenpairs_symmetric_by_index(const std::pair<unsigned int,unsigned int> &, const bool)
+// for all eigenvalues without eigenvectors
+
+
+#include <deal.II/base/logstream.h>
+#include <deal.II/base/utilities.h>
+#include <deal.II/base/conditional_ostream.h>
+#include <deal.II/base/timer.h>
+#include <deal.II/base/multithread_info.h>
+#include <deal.II/base/process_grid.h>
+
+#include <deal.II/lac/vector.h>
+#include <deal.II/lac/lapack_full_matrix.h>
+#include <deal.II/lac/lapack_templates.h>
+#include <deal.II/lac/scalapack.h>
+
+#include <fstream>
+#include <iostream>
+#include <algorithm>
+#include <memory>
+
+
+template <typename NumberType>
+void test(const unsigned int size, const unsigned int block_size, const NumberType tol)
+{
+  MPI_Comm mpi_communicator(MPI_COMM_WORLD);
+  const unsigned int n_mpi_processes(Utilities::MPI::n_mpi_processes(mpi_communicator));
+  const unsigned int this_mpi_process(Utilities::MPI::this_mpi_process(mpi_communicator));
+
+  ConditionalOStream pcout (std::cout, (this_mpi_process ==0));
+
+  std::shared_ptr<Utilities::MPI::ProcessGrid> grid = std::make_shared<Utilities::MPI::ProcessGrid>(mpi_communicator,size,size,block_size,block_size);
+
+  pcout << size << " " << block_size << " " << grid->get_process_grid_rows() << " " << grid->get_process_grid_columns() << std::endl;
+
+  const unsigned int n_eigenvalues = size;
+  const unsigned int max_n_eigenvalues = 5;
+
+  // Create SPD matrices of requested size:
+  FullMatrix<NumberType> full_A(size);
+  std::vector<NumberType> eigenvalues_Lapack(size);
+
+  ScaLAPACKMatrix<NumberType> scalapack_syev (size, grid, block_size);
+  scalapack_syev.set_property(LAPACKSupport::Property::symmetric);
+
+  create_spd (full_A);
+  scalapack_syev = full_A;
+
+  //Lapack as reference
+  {
+    std::vector<NumberType> lapack_A(size*size);
+    for (unsigned int i = 0; i < size; ++i)
+      for (unsigned int j = 0; j < size; ++j)
+        lapack_A[i*size+j] = full_A(i,j);
+
+    int info; //Variable containing information about the successfull exit of the lapack routine
+    char jobz = 'V';  //'V': all eigenpairs of A are computed
+    char uplo = 'U';  //storage format of the matrix A; not so important as matrix is symmetric
+    int LDA = size;   //leading dimension of the matrix A
+    int lwork;      //length of vector/array work
+    std::vector<NumberType> work (1);
+
+    //by setting lwork to -1 a workspace query for work is done
+    //as matrix is symmetric: LDA == size of matrix
+    lwork = -1;
+    syev(&jobz, &uplo, &LDA, & *lapack_A.begin(), &LDA, & *eigenvalues_Lapack.begin(), & *work.begin(), &lwork, &info);
+    lwork=work[0];
+    work.resize (lwork);
+    syev(&jobz, &uplo, &LDA, & *lapack_A.begin(), &LDA, & *eigenvalues_Lapack.begin(), & *work.begin(), &lwork, &info);
+
+    AssertThrow (info==0, LAPACKSupport::ExcErrorCode("syev", info));
+  }
+
+  // the actual test:
+
+  pcout << "comparing " << max_n_eigenvalues << " eigenvalues computed using LAPACK and ScaLAPACK pdsyev:" << std::endl;
+  const std::vector<NumberType> eigenvalues_psyev = scalapack_syev.eigenpairs_symmetric_by_index(std::make_pair(0,size-1),false);
+  for (unsigned int i=0; i<max_n_eigenvalues; ++i)
+    AssertThrow ( std::abs(eigenvalues_psyev[n_eigenvalues-i-1]-eigenvalues_Lapack[n_eigenvalues-i-1]) / std::abs(eigenvalues_Lapack[n_eigenvalues-i-1]) < tol,
+                  ExcInternalError());
+
+  pcout << "   with respect to the given tolerance the eigenvalues coincide" << std::endl;
+}
+
+
+
+int main (int argc,char **argv)
+{
+
+  Utilities::MPI::MPI_InitFinalize mpi_initialization(argc, argv, numbers::invalid_unsigned_int);
+
+  const std::vector<unsigned int> sizes = {{200,400,600}};
+  const std::vector<unsigned int> blocks = {{32,64}};
+
+  const double tol = 1e-10;
+
+  for (const auto &s : sizes)
+    for (const auto &b : blocks)
+      if (b <= s)
+        test<double>(s,b,tol);
+}
diff --git a/tests/scalapack/scalapack_06a.mpirun=1.output b/tests/scalapack/scalapack_06a.mpirun=1.output
new file mode 100644 (file)
index 0000000..07c225d
--- /dev/null
@@ -0,0 +1,18 @@
+200 32 1 1
+comparing 5 eigenvalues computed using LAPACK and ScaLAPACK pdsyev:
+   with respect to the given tolerance the eigenvalues coincide
+200 64 1 1
+comparing 5 eigenvalues computed using LAPACK and ScaLAPACK pdsyev:
+   with respect to the given tolerance the eigenvalues coincide
+400 32 1 1
+comparing 5 eigenvalues computed using LAPACK and ScaLAPACK pdsyev:
+   with respect to the given tolerance the eigenvalues coincide
+400 64 1 1
+comparing 5 eigenvalues computed using LAPACK and ScaLAPACK pdsyev:
+   with respect to the given tolerance the eigenvalues coincide
+600 32 1 1
+comparing 5 eigenvalues computed using LAPACK and ScaLAPACK pdsyev:
+   with respect to the given tolerance the eigenvalues coincide
+600 64 1 1
+comparing 5 eigenvalues computed using LAPACK and ScaLAPACK pdsyev:
+   with respect to the given tolerance the eigenvalues coincide
diff --git a/tests/scalapack/scalapack_06a.mpirun=11.output b/tests/scalapack/scalapack_06a.mpirun=11.output
new file mode 100644 (file)
index 0000000..aa55a5f
--- /dev/null
@@ -0,0 +1,18 @@
+200 32 3 3
+comparing 5 eigenvalues computed using LAPACK and ScaLAPACK pdsyev:
+   with respect to the given tolerance the eigenvalues coincide
+200 64 3 3
+comparing 5 eigenvalues computed using LAPACK and ScaLAPACK pdsyev:
+   with respect to the given tolerance the eigenvalues coincide
+400 32 3 3
+comparing 5 eigenvalues computed using LAPACK and ScaLAPACK pdsyev:
+   with respect to the given tolerance the eigenvalues coincide
+400 64 3 3
+comparing 5 eigenvalues computed using LAPACK and ScaLAPACK pdsyev:
+   with respect to the given tolerance the eigenvalues coincide
+600 32 3 3
+comparing 5 eigenvalues computed using LAPACK and ScaLAPACK pdsyev:
+   with respect to the given tolerance the eigenvalues coincide
+600 64 3 3
+comparing 5 eigenvalues computed using LAPACK and ScaLAPACK pdsyev:
+   with respect to the given tolerance the eigenvalues coincide
diff --git a/tests/scalapack/scalapack_06a.mpirun=4.output b/tests/scalapack/scalapack_06a.mpirun=4.output
new file mode 100644 (file)
index 0000000..8b3571e
--- /dev/null
@@ -0,0 +1,18 @@
+200 32 2 2
+comparing 5 eigenvalues computed using LAPACK and ScaLAPACK pdsyev:
+   with respect to the given tolerance the eigenvalues coincide
+200 64 2 2
+comparing 5 eigenvalues computed using LAPACK and ScaLAPACK pdsyev:
+   with respect to the given tolerance the eigenvalues coincide
+400 32 2 2
+comparing 5 eigenvalues computed using LAPACK and ScaLAPACK pdsyev:
+   with respect to the given tolerance the eigenvalues coincide
+400 64 2 2
+comparing 5 eigenvalues computed using LAPACK and ScaLAPACK pdsyev:
+   with respect to the given tolerance the eigenvalues coincide
+600 32 2 2
+comparing 5 eigenvalues computed using LAPACK and ScaLAPACK pdsyev:
+   with respect to the given tolerance the eigenvalues coincide
+600 64 2 2
+comparing 5 eigenvalues computed using LAPACK and ScaLAPACK pdsyev:
+   with respect to the given tolerance the eigenvalues coincide
diff --git a/tests/scalapack/scalapack_06a.mpirun=9.output b/tests/scalapack/scalapack_06a.mpirun=9.output
new file mode 100644 (file)
index 0000000..aa55a5f
--- /dev/null
@@ -0,0 +1,18 @@
+200 32 3 3
+comparing 5 eigenvalues computed using LAPACK and ScaLAPACK pdsyev:
+   with respect to the given tolerance the eigenvalues coincide
+200 64 3 3
+comparing 5 eigenvalues computed using LAPACK and ScaLAPACK pdsyev:
+   with respect to the given tolerance the eigenvalues coincide
+400 32 3 3
+comparing 5 eigenvalues computed using LAPACK and ScaLAPACK pdsyev:
+   with respect to the given tolerance the eigenvalues coincide
+400 64 3 3
+comparing 5 eigenvalues computed using LAPACK and ScaLAPACK pdsyev:
+   with respect to the given tolerance the eigenvalues coincide
+600 32 3 3
+comparing 5 eigenvalues computed using LAPACK and ScaLAPACK pdsyev:
+   with respect to the given tolerance the eigenvalues coincide
+600 64 3 3
+comparing 5 eigenvalues computed using LAPACK and ScaLAPACK pdsyev:
+   with respect to the given tolerance the eigenvalues coincide
diff --git a/tests/scalapack/scalapack_06b.cc b/tests/scalapack/scalapack_06b.cc
new file mode 100644 (file)
index 0000000..98591a2
--- /dev/null
@@ -0,0 +1,156 @@
+// ---------------------------------------------------------------------
+//
+// Copyright (C) 2017 - 2018 by the deal.II authors
+//
+// This file is part of the deal.II library.
+//
+// The deal.II library is free software; you can use it, redistribute
+// it, and/or modify it under the terms of the GNU Lesser General
+// Public License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// The full text of the license can be found in the file LICENSE at
+// the top level of the deal.II distribution.
+//
+// ---------------------------------------------------------------------
+
+#include "../tests.h"
+#include "../lapack/create_matrix.h"
+
+// test eigenpairs_symmetric_by_index(const std::pair<unsigned int,unsigned int> &, const bool)
+// for some eigenvalues with eigenvectors
+
+
+#include <deal.II/base/logstream.h>
+#include <deal.II/base/utilities.h>
+#include <deal.II/base/conditional_ostream.h>
+#include <deal.II/base/timer.h>
+#include <deal.II/base/multithread_info.h>
+#include <deal.II/base/process_grid.h>
+
+#include <deal.II/lac/vector.h>
+#include <deal.II/lac/lapack_full_matrix.h>
+#include <deal.II/lac/lapack_templates.h>
+#include <deal.II/lac/scalapack.h>
+
+#include <fstream>
+#include <iostream>
+#include <algorithm>
+#include <memory>
+
+
+template <typename NumberType>
+void test(const unsigned int size, const unsigned int block_size, const NumberType tol)
+{
+  MPI_Comm mpi_communicator(MPI_COMM_WORLD);
+  const unsigned int n_mpi_processes(Utilities::MPI::n_mpi_processes(mpi_communicator));
+  const unsigned int this_mpi_process(Utilities::MPI::this_mpi_process(mpi_communicator));
+
+  ConditionalOStream pcout (std::cout, (this_mpi_process ==0));
+
+  std::shared_ptr<Utilities::MPI::ProcessGrid> grid = std::make_shared<Utilities::MPI::ProcessGrid>(mpi_communicator,size,size,block_size,block_size);
+
+  pcout << size << " " << block_size << " " << grid->get_process_grid_rows() << " " << grid->get_process_grid_columns() << std::endl;
+
+  const unsigned int n_eigenvalues = size;
+  const unsigned int max_n_eigenvalues = 5;
+
+  // Create SPD matrices of requested size:
+  FullMatrix<NumberType> full_A(size);
+  std::vector<NumberType> eigenvalues_Lapack(size);
+  std::vector<Vector<NumberType>> s_eigenvectors_ (max_n_eigenvalues,Vector<NumberType>(size));
+  std::vector<Vector<NumberType>> p_eigenvectors_ (max_n_eigenvalues,Vector<NumberType>(size));
+  FullMatrix<NumberType> p_eigenvectors (size,size);
+
+  ScaLAPACKMatrix<NumberType> scalapack_syevx (size, grid, block_size);
+  scalapack_syevx.set_property(LAPACKSupport::Property::symmetric);
+
+  create_spd (full_A);
+  scalapack_syevx = full_A;
+
+  //Lapack as reference
+  {
+    std::vector<NumberType> lapack_A(size*size);
+    for (unsigned int i = 0; i < size; ++i)
+      for (unsigned int j = 0; j < size; ++j)
+        lapack_A[i*size+j] = full_A(i,j);
+
+    int info; //Variable containing information about the successfull exit of the lapack routine
+    char jobz = 'V';  //'V': all eigenpairs of A are computed
+    char uplo = 'U';  //storage format of the matrix A; not so important as matrix is symmetric
+    int LDA = size;   //leading dimension of the matrix A
+    int lwork;      //length of vector/array work
+    std::vector<NumberType> work (1);
+
+    //by setting lwork to -1 a workspace query for work is done
+    //as matrix is symmetric: LDA == size of matrix
+    lwork = -1;
+    syev(&jobz, &uplo, &LDA, & *lapack_A.begin(), &LDA, & *eigenvalues_Lapack.begin(), & *work.begin(), &lwork, &info);
+    lwork=work[0];
+    work.resize (lwork);
+    syev(&jobz, &uplo, &LDA, & *lapack_A.begin(), &LDA, & *eigenvalues_Lapack.begin(), & *work.begin(), &lwork, &info);
+
+    AssertThrow (info==0, LAPACKSupport::ExcErrorCode("syev", info));
+    for (int i=0; i<max_n_eigenvalues; ++i)
+      for (int j=0; j<size; ++j)
+        s_eigenvectors_[i][j] = lapack_A[(size-1-i)*size+j];
+
+  }
+
+  // the actual test:
+
+  pcout << "comparing " << max_n_eigenvalues << " eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pdsyevx:" << std::endl;
+  const std::vector<NumberType> eigenvalues_psyevx = scalapack_syevx.eigenpairs_symmetric_by_index(std::make_pair(size-max_n_eigenvalues,size-1),true);
+  scalapack_syevx.copy_to(p_eigenvectors);
+  for (unsigned int i=eigenvalues_psyevx.size()-1; i>0; --i)
+    {
+      if ( !(std::abs(eigenvalues_psyevx[i]-eigenvalues_Lapack[size-eigenvalues_psyevx.size()+i]) /
+             std::abs(eigenvalues_Lapack[size-eigenvalues_psyevx.size()+i]) < tol))
+        {
+          std::cout << "process #" << this_mpi_process << ": eigenvalues do not fit: "
+                    << eigenvalues_psyevx[i] << " <--> " << eigenvalues_Lapack[size-eigenvalues_psyevx.size()+i] << std::endl;
+        }
+
+      AssertThrow ( std::abs(eigenvalues_psyevx[i]-eigenvalues_Lapack[size-eigenvalues_psyevx.size()+i]) /
+                    std::abs(eigenvalues_Lapack[size-eigenvalues_psyevx.size()+i]) < tol,
+                    ExcInternalError());
+    }
+  pcout << "   with respect to the given tolerance the eigenvalues coincide" << std::endl;
+
+  // FIXME: run-time error on macOS if code between "pcout << comparing" and this line is executed.
+  // Happens at the end of the program run while freeing the MPI communicator.
+
+  for (unsigned int i=0; i<max_n_eigenvalues; ++i)
+    for (unsigned int j=0; j<size; ++j)
+      p_eigenvectors_[i][j] = p_eigenvectors(j,max_n_eigenvalues-1-i);
+
+  //product of eigenvectors computed using Lapack and ScaLapack has to be either 1 or -1
+  for (unsigned int i=0; i<max_n_eigenvalues; ++i)
+    {
+      const NumberType product = p_eigenvectors_[i] * s_eigenvectors_[i];
+      if (!(std::abs(std::abs(product)-1) < tol*10))
+        std::cout << "process #" << this_mpi_process << ": eigenvectors do not coincide: abs(" << product << ") != 1" << std::endl;
+
+      //the requirement for alignment of the eigenvectors has to be released (primarily for floats)
+      AssertThrow (std::abs(std::abs(product)-1) < tol*10,
+                   ExcInternalError());
+    }
+  pcout << "   with respect to the given tolerance also the eigenvectors coincide" << std::endl << std::endl;
+}
+
+
+
+int main (int argc,char **argv)
+{
+
+  Utilities::MPI::MPI_InitFinalize mpi_initialization(argc, argv, numbers::invalid_unsigned_int);
+
+  const std::vector<unsigned int> sizes = {{200,400,600}};
+  const std::vector<unsigned int> blocks = {{32,64}};
+
+  const double tol = 1e-10;
+
+  for (const auto &s : sizes)
+    for (const auto &b : blocks)
+      if (b <= s)
+        test<double>(s,b,tol);
+}
diff --git a/tests/scalapack/scalapack_06b.mpirun=1.output b/tests/scalapack/scalapack_06b.mpirun=1.output
new file mode 100644 (file)
index 0000000..1dc6a7a
--- /dev/null
@@ -0,0 +1,30 @@
+200 32 1 1
+comparing 5 eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pdsyevx:
+   with respect to the given tolerance the eigenvalues coincide
+   with respect to the given tolerance also the eigenvectors coincide
+
+200 64 1 1
+comparing 5 eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pdsyevx:
+   with respect to the given tolerance the eigenvalues coincide
+   with respect to the given tolerance also the eigenvectors coincide
+
+400 32 1 1
+comparing 5 eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pdsyevx:
+   with respect to the given tolerance the eigenvalues coincide
+   with respect to the given tolerance also the eigenvectors coincide
+
+400 64 1 1
+comparing 5 eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pdsyevx:
+   with respect to the given tolerance the eigenvalues coincide
+   with respect to the given tolerance also the eigenvectors coincide
+
+600 32 1 1
+comparing 5 eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pdsyevx:
+   with respect to the given tolerance the eigenvalues coincide
+   with respect to the given tolerance also the eigenvectors coincide
+
+600 64 1 1
+comparing 5 eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pdsyevx:
+   with respect to the given tolerance the eigenvalues coincide
+   with respect to the given tolerance also the eigenvectors coincide
+
diff --git a/tests/scalapack/scalapack_06b.mpirun=11.output b/tests/scalapack/scalapack_06b.mpirun=11.output
new file mode 100644 (file)
index 0000000..42d11a5
--- /dev/null
@@ -0,0 +1,30 @@
+200 32 3 3
+comparing 5 eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pdsyevx:
+   with respect to the given tolerance the eigenvalues coincide
+   with respect to the given tolerance also the eigenvectors coincide
+
+200 64 3 3
+comparing 5 eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pdsyevx:
+   with respect to the given tolerance the eigenvalues coincide
+   with respect to the given tolerance also the eigenvectors coincide
+
+400 32 3 3
+comparing 5 eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pdsyevx:
+   with respect to the given tolerance the eigenvalues coincide
+   with respect to the given tolerance also the eigenvectors coincide
+
+400 64 3 3
+comparing 5 eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pdsyevx:
+   with respect to the given tolerance the eigenvalues coincide
+   with respect to the given tolerance also the eigenvectors coincide
+
+600 32 3 3
+comparing 5 eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pdsyevx:
+   with respect to the given tolerance the eigenvalues coincide
+   with respect to the given tolerance also the eigenvectors coincide
+
+600 64 3 3
+comparing 5 eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pdsyevx:
+   with respect to the given tolerance the eigenvalues coincide
+   with respect to the given tolerance also the eigenvectors coincide
+
diff --git a/tests/scalapack/scalapack_06b.mpirun=4.output b/tests/scalapack/scalapack_06b.mpirun=4.output
new file mode 100644 (file)
index 0000000..317fc67
--- /dev/null
@@ -0,0 +1,30 @@
+200 32 2 2
+comparing 5 eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pdsyevx:
+   with respect to the given tolerance the eigenvalues coincide
+   with respect to the given tolerance also the eigenvectors coincide
+
+200 64 2 2
+comparing 5 eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pdsyevx:
+   with respect to the given tolerance the eigenvalues coincide
+   with respect to the given tolerance also the eigenvectors coincide
+
+400 32 2 2
+comparing 5 eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pdsyevx:
+   with respect to the given tolerance the eigenvalues coincide
+   with respect to the given tolerance also the eigenvectors coincide
+
+400 64 2 2
+comparing 5 eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pdsyevx:
+   with respect to the given tolerance the eigenvalues coincide
+   with respect to the given tolerance also the eigenvectors coincide
+
+600 32 2 2
+comparing 5 eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pdsyevx:
+   with respect to the given tolerance the eigenvalues coincide
+   with respect to the given tolerance also the eigenvectors coincide
+
+600 64 2 2
+comparing 5 eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pdsyevx:
+   with respect to the given tolerance the eigenvalues coincide
+   with respect to the given tolerance also the eigenvectors coincide
+
diff --git a/tests/scalapack/scalapack_06b.mpirun=9.output b/tests/scalapack/scalapack_06b.mpirun=9.output
new file mode 100644 (file)
index 0000000..42d11a5
--- /dev/null
@@ -0,0 +1,30 @@
+200 32 3 3
+comparing 5 eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pdsyevx:
+   with respect to the given tolerance the eigenvalues coincide
+   with respect to the given tolerance also the eigenvectors coincide
+
+200 64 3 3
+comparing 5 eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pdsyevx:
+   with respect to the given tolerance the eigenvalues coincide
+   with respect to the given tolerance also the eigenvectors coincide
+
+400 32 3 3
+comparing 5 eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pdsyevx:
+   with respect to the given tolerance the eigenvalues coincide
+   with respect to the given tolerance also the eigenvectors coincide
+
+400 64 3 3
+comparing 5 eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pdsyevx:
+   with respect to the given tolerance the eigenvalues coincide
+   with respect to the given tolerance also the eigenvectors coincide
+
+600 32 3 3
+comparing 5 eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pdsyevx:
+   with respect to the given tolerance the eigenvalues coincide
+   with respect to the given tolerance also the eigenvectors coincide
+
+600 64 3 3
+comparing 5 eigenvalues and eigenvectors computed using LAPACK and ScaLAPACK pdsyevx:
+   with respect to the given tolerance the eigenvalues coincide
+   with respect to the given tolerance also the eigenvectors coincide
+
diff --git a/tests/scalapack/scalapack_06c.cc b/tests/scalapack/scalapack_06c.cc
new file mode 100644 (file)
index 0000000..c9632b7
--- /dev/null
@@ -0,0 +1,127 @@
+// ---------------------------------------------------------------------
+//
+// Copyright (C) 2017 - 2018 by the deal.II authors
+//
+// This file is part of the deal.II library.
+//
+// The deal.II library is free software; you can use it, redistribute
+// it, and/or modify it under the terms of the GNU Lesser General
+// Public License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// The full text of the license can be found in the file LICENSE at
+// the top level of the deal.II distribution.
+//
+// ---------------------------------------------------------------------
+
+#include "../tests.h"
+#include "../lapack/create_matrix.h"
+
+// test eigenpairs_symmetric_by_index(const std::pair<unsigned int,unsigned int> &, const bool)
+// for some eigenvalues without eigenvectors
+
+
+#include <deal.II/base/logstream.h>
+#include <deal.II/base/utilities.h>
+#include <deal.II/base/conditional_ostream.h>
+#include <deal.II/base/timer.h>
+#include <deal.II/base/multithread_info.h>
+#include <deal.II/base/process_grid.h>
+
+#include <deal.II/lac/vector.h>
+#include <deal.II/lac/lapack_full_matrix.h>
+#include <deal.II/lac/lapack_templates.h>
+#include <deal.II/lac/scalapack.h>
+
+#include <fstream>
+#include <iostream>
+#include <algorithm>
+#include <memory>
+
+
+template <typename NumberType>
+void test(const unsigned int size, const unsigned int block_size, const NumberType tol)
+{
+  MPI_Comm mpi_communicator(MPI_COMM_WORLD);
+  const unsigned int n_mpi_processes(Utilities::MPI::n_mpi_processes(mpi_communicator));
+  const unsigned int this_mpi_process(Utilities::MPI::this_mpi_process(mpi_communicator));
+
+  ConditionalOStream pcout (std::cout, (this_mpi_process ==0));
+
+  std::shared_ptr<Utilities::MPI::ProcessGrid> grid = std::make_shared<Utilities::MPI::ProcessGrid>(mpi_communicator,size,size,block_size,block_size);
+
+  pcout << size << " " << block_size << " " << grid->get_process_grid_rows() << " " << grid->get_process_grid_columns() << std::endl;
+
+  const unsigned int n_eigenvalues = size;
+  const unsigned int max_n_eigenvalues = 5;
+
+  // Create SPD matrices of requested size:
+  FullMatrix<NumberType> full_A(size);
+  std::vector<NumberType> eigenvalues_Lapack(size);
+
+  ScaLAPACKMatrix<NumberType> scalapack_syevx (size, grid, block_size);
+  scalapack_syevx.set_property(LAPACKSupport::Property::symmetric);
+
+  create_spd (full_A);
+  scalapack_syevx = full_A;
+
+  //Lapack as reference
+  {
+    std::vector<NumberType> lapack_A(size*size);
+    for (unsigned int i = 0; i < size; ++i)
+      for (unsigned int j = 0; j < size; ++j)
+        lapack_A[i*size+j] = full_A(i,j);
+
+    int info; //Variable containing information about the successfull exit of the lapack routine
+    char jobz = 'V';  //'V': all eigenpairs of A are computed
+    char uplo = 'U';  //storage format of the matrix A; not so important as matrix is symmetric
+    int LDA = size;   //leading dimension of the matrix A
+    int lwork;      //length of vector/array work
+    std::vector<NumberType> work (1);
+
+    //by setting lwork to -1 a workspace query for work is done
+    //as matrix is symmetric: LDA == size of matrix
+    lwork = -1;
+    syev(&jobz, &uplo, &LDA, & *lapack_A.begin(), &LDA, & *eigenvalues_Lapack.begin(), & *work.begin(), &lwork, &info);
+    lwork=work[0];
+    work.resize (lwork);
+    syev(&jobz, &uplo, &LDA, & *lapack_A.begin(), &LDA, & *eigenvalues_Lapack.begin(), & *work.begin(), &lwork, &info);
+    AssertThrow (info==0, LAPACKSupport::ExcErrorCode("syev", info));
+  }
+
+  // the actual test:
+
+  pcout << "comparing " << max_n_eigenvalues << " eigenvalues computed using LAPACK and ScaLAPACK pdsyevx:" << std::endl;
+  const std::vector<NumberType> eigenvalues_psyevx = scalapack_syevx.eigenpairs_symmetric_by_index(std::make_pair(size-max_n_eigenvalues,size-1),false);
+  for (unsigned int i=eigenvalues_psyevx.size()-1; i>0; --i)
+    {
+      if ( !(std::abs(eigenvalues_psyevx[i]-eigenvalues_Lapack[size-eigenvalues_psyevx.size()+i]) /
+             std::abs(eigenvalues_Lapack[size-eigenvalues_psyevx.size()+i]) < tol))
+        {
+          std::cout << "process #" << this_mpi_process << ": eigenvalues do not fit: "
+                    << eigenvalues_psyevx[i] << " <--> " << eigenvalues_Lapack[size-eigenvalues_psyevx.size()+i] << std::endl;
+        }
+
+      AssertThrow ( std::abs(eigenvalues_psyevx[i]-eigenvalues_Lapack[size-eigenvalues_psyevx.size()+i]) /
+                    std::abs(eigenvalues_Lapack[size-eigenvalues_psyevx.size()+i]) < tol,
+                    ExcInternalError());
+    }
+  pcout << "   with respect to the given tolerance the eigenvalues coincide" << std::endl;
+}
+
+
+
+int main (int argc,char **argv)
+{
+
+  Utilities::MPI::MPI_InitFinalize mpi_initialization(argc, argv, numbers::invalid_unsigned_int);
+
+  const std::vector<unsigned int> sizes = {{200,400,600}};
+  const std::vector<unsigned int> blocks = {{32,64}};
+
+  const double tol = 1e-10;
+
+  for (const auto &s : sizes)
+    for (const auto &b : blocks)
+      if (b <= s)
+        test<double>(s,b,tol);
+}
diff --git a/tests/scalapack/scalapack_06c.mpirun=1.output b/tests/scalapack/scalapack_06c.mpirun=1.output
new file mode 100644 (file)
index 0000000..a305d9c
--- /dev/null
@@ -0,0 +1,18 @@
+200 32 1 1
+comparing 5 eigenvalues computed using LAPACK and ScaLAPACK pdsyevx:
+   with respect to the given tolerance the eigenvalues coincide
+200 64 1 1
+comparing 5 eigenvalues computed using LAPACK and ScaLAPACK pdsyevx:
+   with respect to the given tolerance the eigenvalues coincide
+400 32 1 1
+comparing 5 eigenvalues computed using LAPACK and ScaLAPACK pdsyevx:
+   with respect to the given tolerance the eigenvalues coincide
+400 64 1 1
+comparing 5 eigenvalues computed using LAPACK and ScaLAPACK pdsyevx:
+   with respect to the given tolerance the eigenvalues coincide
+600 32 1 1
+comparing 5 eigenvalues computed using LAPACK and ScaLAPACK pdsyevx:
+   with respect to the given tolerance the eigenvalues coincide
+600 64 1 1
+comparing 5 eigenvalues computed using LAPACK and ScaLAPACK pdsyevx:
+   with respect to the given tolerance the eigenvalues coincide
diff --git a/tests/scalapack/scalapack_06c.mpirun=11.output b/tests/scalapack/scalapack_06c.mpirun=11.output
new file mode 100644 (file)
index 0000000..e309d4e
--- /dev/null
@@ -0,0 +1,18 @@
+200 32 3 3
+comparing 5 eigenvalues computed using LAPACK and ScaLAPACK pdsyevx:
+   with respect to the given tolerance the eigenvalues coincide
+200 64 3 3
+comparing 5 eigenvalues computed using LAPACK and ScaLAPACK pdsyevx:
+   with respect to the given tolerance the eigenvalues coincide
+400 32 3 3
+comparing 5 eigenvalues computed using LAPACK and ScaLAPACK pdsyevx:
+   with respect to the given tolerance the eigenvalues coincide
+400 64 3 3
+comparing 5 eigenvalues computed using LAPACK and ScaLAPACK pdsyevx:
+   with respect to the given tolerance the eigenvalues coincide
+600 32 3 3
+comparing 5 eigenvalues computed using LAPACK and ScaLAPACK pdsyevx:
+   with respect to the given tolerance the eigenvalues coincide
+600 64 3 3
+comparing 5 eigenvalues computed using LAPACK and ScaLAPACK pdsyevx:
+   with respect to the given tolerance the eigenvalues coincide
diff --git a/tests/scalapack/scalapack_06c.mpirun=4.output b/tests/scalapack/scalapack_06c.mpirun=4.output
new file mode 100644 (file)
index 0000000..d514730
--- /dev/null
@@ -0,0 +1,18 @@
+200 32 2 2
+comparing 5 eigenvalues computed using LAPACK and ScaLAPACK pdsyevx:
+   with respect to the given tolerance the eigenvalues coincide
+200 64 2 2
+comparing 5 eigenvalues computed using LAPACK and ScaLAPACK pdsyevx:
+   with respect to the given tolerance the eigenvalues coincide
+400 32 2 2
+comparing 5 eigenvalues computed using LAPACK and ScaLAPACK pdsyevx:
+   with respect to the given tolerance the eigenvalues coincide
+400 64 2 2
+comparing 5 eigenvalues computed using LAPACK and ScaLAPACK pdsyevx:
+   with respect to the given tolerance the eigenvalues coincide
+600 32 2 2
+comparing 5 eigenvalues computed using LAPACK and ScaLAPACK pdsyevx:
+   with respect to the given tolerance the eigenvalues coincide
+600 64 2 2
+comparing 5 eigenvalues computed using LAPACK and ScaLAPACK pdsyevx:
+   with respect to the given tolerance the eigenvalues coincide
diff --git a/tests/scalapack/scalapack_06c.mpirun=9.output b/tests/scalapack/scalapack_06c.mpirun=9.output
new file mode 100644 (file)
index 0000000..e309d4e
--- /dev/null
@@ -0,0 +1,18 @@
+200 32 3 3
+comparing 5 eigenvalues computed using LAPACK and ScaLAPACK pdsyevx:
+   with respect to the given tolerance the eigenvalues coincide
+200 64 3 3
+comparing 5 eigenvalues computed using LAPACK and ScaLAPACK pdsyevx:
+   with respect to the given tolerance the eigenvalues coincide
+400 32 3 3
+comparing 5 eigenvalues computed using LAPACK and ScaLAPACK pdsyevx:
+   with respect to the given tolerance the eigenvalues coincide
+400 64 3 3
+comparing 5 eigenvalues computed using LAPACK and ScaLAPACK pdsyevx:
+   with respect to the given tolerance the eigenvalues coincide
+600 32 3 3
+comparing 5 eigenvalues computed using LAPACK and ScaLAPACK pdsyevx:
+   with respect to the given tolerance the eigenvalues coincide
+600 64 3 3
+comparing 5 eigenvalues computed using LAPACK and ScaLAPACK pdsyevx:
+   with respect to the given tolerance the eigenvalues coincide

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.

Douglas Adams


Typeset in Trocchi and Trocchi Bold Sans Serif.