[arpack++] 08/09: Add autopkgtest.
Anton Gladky
gladk at moszumanska.debian.org
Thu Sep 11 19:52:22 UTC 2014
This is an automated email from the git hooks/post-receive script.
gladk pushed a commit to branch master
in repository arpack++.
commit ee90eafbb65b1d3af9427afcc696885b639968ad
Author: Anton Gladky <gladk at debian.org>
Date: Thu Sep 11 20:23:03 2014 +0200
Add autopkgtest.
---
debian/control | 1 +
debian/tests/build1 | 263 +++++++++++++++++++++++++++++++++++++++++++++++++++
debian/tests/control | 2 +
3 files changed, 266 insertions(+)
diff --git a/debian/control b/debian/control
index d70c161..4d8be9a 100644
--- a/debian/control
+++ b/debian/control
@@ -13,6 +13,7 @@ Uploaders:
Christophe Prud'homme <prudhomm at debian.org>,
Anton Gladky <gladk at debian.org>
Standards-Version: 3.9.5
+XS-Testsuite: autopkgtest
Vcs-Git: git://anonscm.debian.org/debian-science/packages/arpack++.git
Vcs-Browser: http://anonscm.debian.org/gitweb/?p=debian-science/packages/arpack++.git
diff --git a/debian/tests/build1 b/debian/tests/build1
new file mode 100755
index 0000000..97ac946
--- /dev/null
+++ b/debian/tests/build1
@@ -0,0 +1,263 @@
+#!/bin/sh
+# autopkgtest for arpack++
+# 2014/09/11
+#
+# (C) 2014 Anton Gladky
+
+set -e
+
+WORKDIR=$(mktemp -d)
+trap "rm -rf $WORKDIR" 0 INT QUIT ABRT PIPE TERM
+cd $WORKDIR
+
+cat <<EOF > demo.cc
+/*
+ ARPACK++ v1.2 2/18/2000
+ c++ interface to ARPACK code.
+
+ MODULE SymSimp.cc.
+ Example program that illustrates how to solve a very simple
+ real symmetric standard eigenvalue problem in regular mode
+ using the ARSymStdEig class.
+
+ 1) Problem description:
+
+ In this example we try to solve A*x = x*lambda in regular mode
+ where A is the one dimensional discrete Laplacian on the interval
+ [0,1] with zero Dirichlet boundary conditions.
+
+ 2) Data structure used to represent matrices A and B:
+
+ When using ARSymGenEig, the user is required to provide a
+ class that contain as member function the matrix-vector
+ product w = Av. In this example, this class is called SymMatrix.
+
+ 3) Included header files:
+
+ File Contents
+ ----------- -------------------------------------------
+ arssym.h The ARSymStdEig class definition.
+ blas1.h Some blas 1 routines.
+
+ 4) ARPACK Authors:
+
+ Richard Lehoucq
+ Kristyn Maschhoff
+ Danny Sorensen
+ Chao Yang
+ Dept. of Computational & Applied Mathematics
+ Rice University
+ Houston, Texas
+*/
+
+#include "blas1c.h"
+#include "arssym.h"
+
+template<class T>
+class SymMatrix {
+/*
+
+ This simple class exemplifies how to create a matrix class
+ that can be used by ARPACK++.
+ Basically, SymMatrix is required to have a member function
+ that calculates the matrix-vector product SymMatrix*v,
+ where v is a vector with elements of type T.
+
+*/
+
+ private:
+
+ int n;
+
+ public:
+
+ int ncols() { return n; }
+
+ void MultMv(T* v, T* w)
+
+ /*
+ Matrix vector subroutine
+ where the matrix is the one dimensional discrete Laplacian on
+ the interval [0,1] with zero Dirichlet boundary conditions.
+ */
+
+ {
+
+ int j;
+ T h2;
+
+ const T two = 2.0;
+
+ w[0] = two*v[0] - v[1];
+ for (j=1; j<n-1; j++) {
+ w[j] = - v[j-1] + two*v[j] - v[j+1];
+ }
+ w[n-1] = - v[n-2] + two*v[n-1];
+
+ // Scaling the vector w by (1 / h^2) using fortran blas routine scal.
+
+ h2 = T((n+1)*(n+1));
+ scal(n, h2, w, 1L);
+
+ } // MultMv
+
+ SymMatrix(int nval) { n = nval; }
+
+}; // SymMatrix.
+
+
+template<class FLOAT, class EIGPROB>
+void Solution(SymMatrix<FLOAT> &A, EIGPROB &Prob)
+/*
+ This function prints eigenvalues and eigenvetors on standard "cout"
+ stream and exemplifies how to retrieve information from ARPACK++ classes.
+*/
+
+{
+
+ int i, n, nconv, mode;
+ FLOAT *Ax;
+ FLOAT *ResNorm;
+
+ /*
+ ARPACK++ includes some functions that provide information
+ about the problem. For example, GetN furnishes the dimension
+ of the problem and ConvergedEigenvalues the number of
+ eigenvalues that attained the required accuracy. GetMode
+ indicates if the problem was solved in regular,
+ shift-and-invert or other mode.
+ */
+
+ n = Prob.GetN();
+ nconv = Prob.ConvergedEigenvalues();
+ mode = Prob.GetMode();
+
+ std::cout << std::endl << std::endl << "Testing ARPACK++ class ARSymEig \n";
+ std::cout << "Real symmetric eigenvalue problem: A*x - lambda*x" << std::endl;
+ switch (mode) {
+ case 1:
+ std::cout << "Regular mode" << std::endl << std::endl;
+ break;
+ case 3:
+ std::cout << "Shift and invert mode" << std::endl << std::endl;
+ }
+
+ std::cout << "Dimension of the system : " << n << std::endl;
+ std::cout << "Number of 'requested' eigenvalues : " << Prob.GetNev() << std::endl;
+ std::cout << "Number of 'converged' eigenvalues : " << nconv << std::endl;
+ std::cout << "Number of Arnoldi vectors generated: " << Prob.GetNcv() << std::endl;
+ std::cout << std::endl;
+
+ /*
+ EigenvaluesFound is a boolean function that indicates
+ if the eigenvalues were found or not. Eigenvalue can be
+ used to obtain one of the "converged" eigenvalues. There
+ are other functions that return eigenvectors elements,
+ Schur vectors elements, residual vector elements, etc.
+ */
+
+ if (Prob.EigenvaluesFound()) {
+ std::cout << "Eigenvalues:" << std::endl;
+ for (i=0; i<nconv; i++) {
+ std::cout << " lambda[" << (i+1) << "]: " << Prob.Eigenvalue(i) << std::endl;
+ }
+ std::cout << std::endl;
+ }
+
+ /*
+ EigenvectorsFound indicates if the eigenvectors are
+ available. RawEigenvector is one of the functions that
+ provide raw access to ARPACK++ output data. Other functions
+ of this type include RawEigenvalues, RawEigenvectors,
+ RawSchurVector, RawResidualVector, etc.
+ */
+
+ if (Prob.EigenvectorsFound()) {
+
+ // Printing the residual norm || A*x - lambda*x ||
+ // for the nconv accurately computed eigenvectors.
+
+ Ax = new FLOAT[n];
+ ResNorm = new FLOAT[nconv];
+
+ for (i=0; i<nconv; i++) {
+ A.MultMv(Prob.RawEigenvector(i),Ax);
+ axpy(n, -Prob.Eigenvalue(i), Prob.RawEigenvector(i), 1, Ax, 1);
+ ResNorm[i] = nrm2(n, Ax, 1) / fabs(Prob.Eigenvalue(i));
+ }
+
+ for (i=0; i<nconv; i++) {
+ std::cout << "||A*x(" << (i+1) << ") - lambda(" << (i+1);
+ std::cout << ")*x(" << (i+1) << ")||: " << ResNorm[i] << "\n";
+ }
+ std::cout << "\n";
+
+ delete[] Ax;
+ delete[] ResNorm;
+
+ }
+
+} // Solution
+
+
+void SimpleTest()
+{
+
+ int nconv;
+
+ // Creating a double precision 100x100 matrix.
+
+ SymMatrix<double> A(100);
+
+ // Defining what we need: the four eigenvectors of A with smallest magnitude.
+
+ ARSymStdEig<double, SymMatrix<double> >
+ dprob(A.ncols(), 4, &A, &SymMatrix<double>::MultMv, "SM");
+
+ /*
+ It is possible to pass other parameters directly to the constructor
+ of class ARSymStdEig in order to define a problem. The list
+ of parameters includes, among other values, the maximum number of
+ iterations allowed and the the relative accuracy used to define the
+ stopping criterion. Alternatively, it is also possible to use function
+ DefineParameters to set ARPACK++ variables after declaring dprob as an
+ object of ARSymStdEig class using the default constructor.
+ */
+
+ // Finding eigenvectors.
+
+ nconv = dprob.FindEigenvectors();
+
+ /*
+ FindEigenvalues, FindArnoldiBasis and FindSchurVectors
+ are alternatives for FindEigenvectors. However, FindSchurVectors
+ can only be used with non-symmetric real and complex problems.
+ Some other functions like Eigenvectors, Eigenvalues and
+ EigenValVectors could also be used. These functions store the
+ desired data in user supplied vectors and matrices.
+ */
+
+ // Printing solution.
+
+ Solution(A, dprob);
+
+} // SimpleTest
+
+
+int main()
+{
+
+ // Solving a double precision problem with n = 100.
+
+ SimpleTest();
+
+} // main
+
+
+EOF
+
+g++ -o demo demo.cc -I/usr/include/arpack++ -Wno-write-strings -lblas -larpack -larpack++
+echo "build: OK"
+[ -x demo ]
+./demo
+echo "run: OK"
diff --git a/debian/tests/control b/debian/tests/control
new file mode 100644
index 0000000..43c9b73
--- /dev/null
+++ b/debian/tests/control
@@ -0,0 +1,2 @@
+Tests: build1
+Depends: libarpack++2-dev, libopenblas-dev, libarpack2-dev, build-essential
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/arpack++.git
More information about the debian-science-commits
mailing list