Add unitary tests for arnoldi 37/10037/5
Sylvestre Ledru [Mon, 17 Dec 2012 13:42:11 +0000 (14:42 +0100)]
Change-Id: Id95d6c22b1067709edcee170187ab9c1c1a2dd50

12 files changed:
scilab/modules/arnoldi/tests/unit_tests/dnaupd.dia.ref [new file with mode: 0644]
scilab/modules/arnoldi/tests/unit_tests/dnaupd.tst [new file with mode: 0644]
scilab/modules/arnoldi/tests/unit_tests/dneupd.dia.ref [new file with mode: 0644]
scilab/modules/arnoldi/tests/unit_tests/dneupd.tst [new file with mode: 0644]
scilab/modules/arnoldi/tests/unit_tests/dsaupd.dia.ref [new file with mode: 0644]
scilab/modules/arnoldi/tests/unit_tests/dsaupd.tst [new file with mode: 0644]
scilab/modules/arnoldi/tests/unit_tests/dseupd.dia.ref [new file with mode: 0644]
scilab/modules/arnoldi/tests/unit_tests/dseupd.tst [new file with mode: 0644]
scilab/modules/arnoldi/tests/unit_tests/znaupd.dia.ref [new file with mode: 0644]
scilab/modules/arnoldi/tests/unit_tests/znaupd.tst [new file with mode: 0644]
scilab/modules/arnoldi/tests/unit_tests/zneupd.dia.ref [new file with mode: 0644]
scilab/modules/arnoldi/tests/unit_tests/zneupd.tst [new file with mode: 0644]

diff --git a/scilab/modules/arnoldi/tests/unit_tests/dnaupd.dia.ref b/scilab/modules/arnoldi/tests/unit_tests/dnaupd.dia.ref
new file mode 100644 (file)
index 0000000..5addde5
--- /dev/null
@@ -0,0 +1,70 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2012 - SE - Sylvestre Ledru
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+nx    = 10;
+nev   = 3;
+ncv   = 6;
+bmat  = 'I';
+which = 'LM';
+// Local Arrays
+iparam  = zeros(11, 1);
+ipntr   = zeros(14, 1);
+_select = zeros(ncv, 1);
+dr       = zeros(nev + 1, 1);
+di      = zeros(nev + 1, 1);
+z       = zeros(nx, nev + 1);
+resid   = zeros(nx, 1);
+v       = zeros(nx, ncv);
+workd   = zeros(3 * nx, 1);
+workev  = zeros(3 * ncv, 1);
+workl   = zeros(3 * ncv * ncv + 6 * ncv, 1);
+// Build the test matrix
+A            = diag(10 * ones(nx, 1));
+A(1:$-1,2:$) = A(1:$-1,2:$) + diag(6 * ones(nx-1,1));
+A(2:$,1:$-1) = A(2:$,1:$-1) + diag(-6 * ones(nx-1,1));
+tol    = 0;
+ido    = 0;
+ishfts = 1;
+maxitr = 300;
+mode1  = 1;
+iparam(1) = ishfts;
+iparam(3) = maxitr;
+iparam(7) = mode1;
+sigmar = 0; // the real part of the shift
+sigmai = 0; // the imaginary part of the shift
+info_dnaupd = 0;
+// M A I N   L O O P (Reverse communication)
+while(ido <> 99)
+    // Repeatedly call the routine DNAUPD and take actions indicated by parameter IDO until
+    // either convergence is indicated or maxitr has been exceeded.
+    [ido, resid, v, iparam, ipntr, workd, workl, info_dnaupd] = dnaupd(ido, bmat, nx, which, nev, tol, resid, ncv, v, iparam, ipntr, workd, workl, info_dnaupd);
+    if(info_dnaupd < 0)
+        printf('\nError with dnaupd, info = %d\n',info_dnaupd);
+        printf('Check the documentation of dnaupd\n\n');
+    end
+    if(ido == -1 | ido == 1)
+        // Perform matrix vector multiplication 
+        workd(ipntr(2):ipntr(2) + nx -1) = A * workd(ipntr(1):ipntr(1) + nx - 1);
+    end
+end
+// Post-Process using DNEUPD.
+rvec    = 1;
+howmany = 'A';
+info_dneupd = 0;
+[dr, di, z, resid, v, iparam, ipntr, workd, workl, info_dneupd] = dneupd(rvec, howmany, _select, dr, di, z, sigmar, sigmai, workev, ...
+bmat, nx, which, nev, tol, resid, ncv, v, ...
+iparam, ipntr, workd, workl, info_dneupd);
+d = complex(dr, di);
+d(nev+1) = [];
+d = diag(d);
+c1 = 1:2:nev + 1;
+c2 = 2:2:nev + 1;
+if(modulo(nev + 1, 2) == 1)
+    c1($) = [];
+end
+z(:,[c1, c2]) = [z(:,c1) + z(:,c2) * %i z(:,c1) - z(:,c2) * %i];
+z(:,$) = [];
+assert_checkalmostequal(A * z, z * d, sqrt(%eps), 1.e-10);
diff --git a/scilab/modules/arnoldi/tests/unit_tests/dnaupd.tst b/scilab/modules/arnoldi/tests/unit_tests/dnaupd.tst
new file mode 100644 (file)
index 0000000..b78a2ed
--- /dev/null
@@ -0,0 +1,91 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2012 - SE - Sylvestre Ledru
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+nx    = 10;
+
+nev   = 3;
+ncv   = 6;
+bmat  = 'I';
+which = 'LM';
+
+// Local Arrays
+
+iparam  = zeros(11, 1);
+ipntr   = zeros(14, 1);
+_select = zeros(ncv, 1);
+dr       = zeros(nev + 1, 1);
+di      = zeros(nev + 1, 1);
+z       = zeros(nx, nev + 1);
+resid   = zeros(nx, 1);
+v       = zeros(nx, ncv);
+workd   = zeros(3 * nx, 1);
+workev  = zeros(3 * ncv, 1);
+workl   = zeros(3 * ncv * ncv + 6 * ncv, 1);
+
+// Build the test matrix
+
+A            = diag(10 * ones(nx, 1));
+A(1:$-1,2:$) = A(1:$-1,2:$) + diag(6 * ones(nx-1,1));
+A(2:$,1:$-1) = A(2:$,1:$-1) + diag(-6 * ones(nx-1,1));
+
+tol    = 0;
+ido    = 0;
+
+ishfts = 1;
+maxitr = 300;
+mode1  = 1;
+
+iparam(1) = ishfts;
+iparam(3) = maxitr;
+iparam(7) = mode1;
+
+sigmar = 0; // the real part of the shift
+sigmai = 0; // the imaginary part of the shift
+info_dnaupd = 0;
+
+// M A I N   L O O P (Reverse communication)
+
+while(ido <> 99)
+    // Repeatedly call the routine DNAUPD and take actions indicated by parameter IDO until
+    // either convergence is indicated or maxitr has been exceeded.
+
+    [ido, resid, v, iparam, ipntr, workd, workl, info_dnaupd] = dnaupd(ido, bmat, nx, which, nev, tol, resid, ncv, v, iparam, ipntr, workd, workl, info_dnaupd);
+
+    if(info_dnaupd < 0)
+        printf('\nError with dnaupd, info = %d\n',info_dnaupd);
+        printf('Check the documentation of dnaupd\n\n');
+    end
+
+    if(ido == -1 | ido == 1)
+        // Perform matrix vector multiplication 
+        workd(ipntr(2):ipntr(2) + nx -1) = A * workd(ipntr(1):ipntr(1) + nx - 1);
+    end
+end
+
+// Post-Process using DNEUPD.
+rvec    = 1;
+howmany = 'A';
+info_dneupd = 0;
+
+[dr, di, z, resid, v, iparam, ipntr, workd, workl, info_dneupd] = dneupd(rvec, howmany, _select, dr, di, z, sigmar, sigmai, workev, ...
+bmat, nx, which, nev, tol, resid, ncv, v, ...
+iparam, ipntr, workd, workl, info_dneupd);
+
+d = complex(dr, di);
+d(nev+1) = [];
+d = diag(d);
+
+c1 = 1:2:nev + 1;
+c2 = 2:2:nev + 1;
+if(modulo(nev + 1, 2) == 1)
+    c1($) = [];
+end
+z(:,[c1, c2]) = [z(:,c1) + z(:,c2) * %i z(:,c1) - z(:,c2) * %i];
+z(:,$) = [];
+
+assert_checkalmostequal(A * z, z * d, sqrt(%eps), 1.e-10);
+
diff --git a/scilab/modules/arnoldi/tests/unit_tests/dneupd.dia.ref b/scilab/modules/arnoldi/tests/unit_tests/dneupd.dia.ref
new file mode 100644 (file)
index 0000000..bc265f2
--- /dev/null
@@ -0,0 +1,71 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2012 - SE - Sylvestre Ledru
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// The following sets dimensions for this problem.
+nx    = 10;
+nev   = 3;
+ncv   = 6;
+bmat  = 'I';
+which = 'LM';
+// Local Arrays
+iparam  = zeros(11, 1);
+ipntr   = zeros(14, 1);
+_select = zeros(ncv, 1);
+dr       = zeros(nev + 1, 1);
+di      = zeros(nev + 1, 1);
+z       = zeros(nx, nev + 1);
+resid   = zeros(nx, 1);
+v       = zeros(nx, ncv);
+workd   = zeros(3 * nx, 1);
+workev  = zeros(3 * ncv, 1);
+workl   = zeros(3 * ncv * ncv + 6 * ncv, 1);
+// Build the test matrix
+A            = diag(10 * ones(nx, 1));
+A(1:$-1,2:$) = A(1:$-1,2:$) + diag(6 * ones(nx-1,1));
+A(2:$,1:$-1) = A(2:$,1:$-1) + diag(-6 * ones(nx-1,1));
+tol    = 0;
+ido    = 0;
+ishfts = 1;
+maxitr = 300;
+mode1  = 1;
+iparam(1) = ishfts;
+iparam(3) = maxitr;
+iparam(7) = mode1;
+sigmar = 0; // the real part of the shift
+sigmai = 0; // the imaginary part of the shift
+info_dnaupd = 0;
+// M A I N   L O O P (Reverse communication)
+while(ido <> 99)
+  // Repeatedly call the routine DNAUPD and take actions indicated by parameter IDO until
+  // either convergence is indicated or maxitr has been exceeded.
+  [ido, resid, v, iparam, ipntr, workd, workl, info_dnaupd] = dnaupd(ido, bmat, nx, which, nev, tol, resid, ncv, v, iparam, ipntr, workd, workl, info_dnaupd);
+  if(info_dnaupd < 0)
+    printf('\nError with dnaupd, info = %d\n',info_dnaupd);
+    printf('Check the documentation of dnaupd\n\n');
+  end
+  if(ido == -1 | ido == 1)
+    // Perform matrix vector multiplication 
+    workd(ipntr(2):ipntr(2) + nx -1) = A * workd(ipntr(1):ipntr(1) + nx - 1);
+  end
+end
+// Post-Process using DNEUPD.
+rvec    = 1;
+howmany = 'A';
+info_dneupd = 0;
+[dr, di, z, resid, v, iparam, ipntr, workd, workl, info_dneupd] = dneupd(rvec, howmany, _select, dr, di, z, sigmar, sigmai, workev, ...
+                                                                       bmat, nx, which, nev, tol, resid, ncv, v, ...
+                                                                       iparam, ipntr, workd, workl, info_dneupd);
+d = complex(dr, di);
+d(nev+1) = [];
+d = diag(d);
+c1 = 1:2:nev + 1;
+c2 = 2:2:nev + 1;
+if(modulo(nev + 1, 2) == 1)
+    c1($) = [];
+end
+z(:,[c1, c2]) = [z(:,c1) + z(:,c2) * %i z(:,c1) - z(:,c2) * %i];
+z(:,$) = [];
+assert_checkalmostequal(A * z, z * d, sqrt(%eps), 1.e-10); 
diff --git a/scilab/modules/arnoldi/tests/unit_tests/dneupd.tst b/scilab/modules/arnoldi/tests/unit_tests/dneupd.tst
new file mode 100644 (file)
index 0000000..7aee6a8
--- /dev/null
@@ -0,0 +1,93 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2012 - SE - Sylvestre Ledru
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+// The following sets dimensions for this problem.
+
+nx    = 10;
+
+nev   = 3;
+ncv   = 6;
+bmat  = 'I';
+which = 'LM';
+
+// Local Arrays
+
+iparam  = zeros(11, 1);
+ipntr   = zeros(14, 1);
+_select = zeros(ncv, 1);
+dr       = zeros(nev + 1, 1);
+di      = zeros(nev + 1, 1);
+z       = zeros(nx, nev + 1);
+resid   = zeros(nx, 1);
+v       = zeros(nx, ncv);
+workd   = zeros(3 * nx, 1);
+workev  = zeros(3 * ncv, 1);
+workl   = zeros(3 * ncv * ncv + 6 * ncv, 1);
+
+// Build the test matrix
+
+A            = diag(10 * ones(nx, 1));
+A(1:$-1,2:$) = A(1:$-1,2:$) + diag(6 * ones(nx-1,1));
+A(2:$,1:$-1) = A(2:$,1:$-1) + diag(-6 * ones(nx-1,1));
+
+tol    = 0;
+ido    = 0;
+
+ishfts = 1;
+maxitr = 300;
+mode1  = 1;
+
+iparam(1) = ishfts;
+iparam(3) = maxitr;
+iparam(7) = mode1;
+
+sigmar = 0; // the real part of the shift
+sigmai = 0; // the imaginary part of the shift
+info_dnaupd = 0;
+
+// M A I N   L O O P (Reverse communication)
+
+while(ido <> 99)
+  // Repeatedly call the routine DNAUPD and take actions indicated by parameter IDO until
+  // either convergence is indicated or maxitr has been exceeded.
+
+  [ido, resid, v, iparam, ipntr, workd, workl, info_dnaupd] = dnaupd(ido, bmat, nx, which, nev, tol, resid, ncv, v, iparam, ipntr, workd, workl, info_dnaupd);
+  
+  if(info_dnaupd < 0)
+    printf('\nError with dnaupd, info = %d\n',info_dnaupd);
+    printf('Check the documentation of dnaupd\n\n');
+  end
+  
+  if(ido == -1 | ido == 1)
+    // Perform matrix vector multiplication 
+    workd(ipntr(2):ipntr(2) + nx -1) = A * workd(ipntr(1):ipntr(1) + nx - 1);
+  end
+end
+
+// Post-Process using DNEUPD.
+rvec    = 1;
+howmany = 'A';
+info_dneupd = 0;
+
+[dr, di, z, resid, v, iparam, ipntr, workd, workl, info_dneupd] = dneupd(rvec, howmany, _select, dr, di, z, sigmar, sigmai, workev, ...
+                                                                       bmat, nx, which, nev, tol, resid, ncv, v, ...
+                                                                       iparam, ipntr, workd, workl, info_dneupd);
+
+d = complex(dr, di);
+d(nev+1) = [];
+d = diag(d);
+
+c1 = 1:2:nev + 1;
+c2 = 2:2:nev + 1;
+if(modulo(nev + 1, 2) == 1)
+    c1($) = [];
+end
+z(:,[c1, c2]) = [z(:,c1) + z(:,c2) * %i z(:,c1) - z(:,c2) * %i];
+z(:,$) = [];
+
+assert_checkalmostequal(A * z, z * d, sqrt(%eps), 1.e-10); 
+
diff --git a/scilab/modules/arnoldi/tests/unit_tests/dsaupd.dia.ref b/scilab/modules/arnoldi/tests/unit_tests/dsaupd.dia.ref
new file mode 100644 (file)
index 0000000..232574a
--- /dev/null
@@ -0,0 +1,60 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2012 - SE - Sylvestre Ledru
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+nx    = 10;
+nev   = 3;
+ncv   = 6;
+bmat  = 'I';
+which = 'LM';
+// Local Arrays
+iparam  = zeros(11, 1);
+ipntr   = zeros(14, 1);
+_select = zeros(ncv, 1);
+d       = zeros(nev, 1);
+z       = zeros(nx, nev);
+resid   = zeros(nx, 1); 
+v       = zeros(nx, ncv);
+workd   = zeros(3 * nx, 1); 
+workl   = zeros(ncv * ncv + 8 * ncv, 1);
+// Build the symmetric test matrix
+A            = diag(10 * ones(nx,1));
+A(1:$-1,2:$) = A(1:$-1,2:$) + diag(6 * ones(nx-1,1));
+A(2:$,1:$-1) = A(2:$,1:$-1) + diag(6 * ones(nx-1,1));
+tol    = 0;
+ido    = 0;
+ishfts = 1;
+maxitr = 300;
+mode1  = 1;
+iparam(1) = ishfts;
+iparam(3) = maxitr;
+iparam(7) = mode1;
+sigma = 0; // the real part of the shift
+info_dsaupd = 0;
+// M A I N   L O O P (Reverse communication)
+while(ido <> 99)
+  // Repeatedly call the routine DSAUPD and take actions indicated by parameter IDO until
+  // either convergence is indicated or maxitr has been exceeded.
+  [ido, resid, v, iparam, ipntr, workd, workl, info_dsaupd] = dsaupd(ido, bmat, nx, which, nev, tol, resid, ncv, v, iparam, ipntr, workd, workl, info_dsaupd);
+  if(info_dsaupd < 0)
+    printf('\nError with dsaupd, info = %d\n',info_dsaupd);
+    printf('Check the documentation of dsaupd\n\n');
+  end
+  if(ido == -1 | ido == 1)
+    // Perform matrix vector multiplication 
+    workd(ipntr(2):ipntr(2) + nx - 1) = A * workd(ipntr(1):ipntr(1) + nx - 1);
+  end
+end
+// Post-Process using DSEUPD.
+rvec    = 1;
+howmany = 'A';
+info_dseupd = 0;
+[d, z, resid, v, iparam, ipntr, workd, workl, info_dseupd] = dseupd(rvec, howmany, _select, d, z, sigma, bmat, nx, which, nev, tol, resid, ncv, v, ...
+                                                                    iparam, ipntr, workd, workl, info_dseupd);
+if(info_dseupd < 0)
+  printf('\nError with dseupd, info = %d\n', info_dseupd);
+  printf('Check the documentation of dseupd.\n\n');
+end
+assert_checkalmostequal(A * z, z * diag(d), sqrt(%eps), 1.e-10); 
diff --git a/scilab/modules/arnoldi/tests/unit_tests/dsaupd.tst b/scilab/modules/arnoldi/tests/unit_tests/dsaupd.tst
new file mode 100644 (file)
index 0000000..e475269
--- /dev/null
@@ -0,0 +1,80 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2012 - SE - Sylvestre Ledru
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+nx    = 10;
+
+nev   = 3;
+ncv   = 6;
+bmat  = 'I';
+which = 'LM';
+
+// Local Arrays
+
+iparam  = zeros(11, 1);
+ipntr   = zeros(14, 1);
+_select = zeros(ncv, 1);
+d       = zeros(nev, 1);
+z       = zeros(nx, nev);
+resid   = zeros(nx, 1); 
+v       = zeros(nx, ncv);
+workd   = zeros(3 * nx, 1); 
+workl   = zeros(ncv * ncv + 8 * ncv, 1);
+
+// Build the symmetric test matrix
+
+A            = diag(10 * ones(nx,1));
+A(1:$-1,2:$) = A(1:$-1,2:$) + diag(6 * ones(nx-1,1));
+A(2:$,1:$-1) = A(2:$,1:$-1) + diag(6 * ones(nx-1,1));
+
+tol    = 0;
+ido    = 0;
+
+ishfts = 1;
+maxitr = 300;
+mode1  = 1;
+
+iparam(1) = ishfts;
+iparam(3) = maxitr;
+iparam(7) = mode1;
+
+sigma = 0; // the real part of the shift
+info_dsaupd = 0;
+
+// M A I N   L O O P (Reverse communication)
+
+while(ido <> 99)
+  // Repeatedly call the routine DSAUPD and take actions indicated by parameter IDO until
+  // either convergence is indicated or maxitr has been exceeded.
+
+  [ido, resid, v, iparam, ipntr, workd, workl, info_dsaupd] = dsaupd(ido, bmat, nx, which, nev, tol, resid, ncv, v, iparam, ipntr, workd, workl, info_dsaupd);
+  
+  if(info_dsaupd < 0)
+    printf('\nError with dsaupd, info = %d\n',info_dsaupd);
+    printf('Check the documentation of dsaupd\n\n');
+  end
+  
+  if(ido == -1 | ido == 1)
+    // Perform matrix vector multiplication 
+    workd(ipntr(2):ipntr(2) + nx - 1) = A * workd(ipntr(1):ipntr(1) + nx - 1);
+  end
+end
+
+// Post-Process using DSEUPD.
+rvec    = 1;
+howmany = 'A';
+info_dseupd = 0;
+
+[d, z, resid, v, iparam, ipntr, workd, workl, info_dseupd] = dseupd(rvec, howmany, _select, d, z, sigma, bmat, nx, which, nev, tol, resid, ncv, v, ...
+                                                                    iparam, ipntr, workd, workl, info_dseupd);
+
+if(info_dseupd < 0)
+  printf('\nError with dseupd, info = %d\n', info_dseupd);
+  printf('Check the documentation of dseupd.\n\n');
+end
+
+
+assert_checkalmostequal(A * z, z * diag(d), sqrt(%eps), 1.e-10); 
diff --git a/scilab/modules/arnoldi/tests/unit_tests/dseupd.dia.ref b/scilab/modules/arnoldi/tests/unit_tests/dseupd.dia.ref
new file mode 100644 (file)
index 0000000..2401b22
--- /dev/null
@@ -0,0 +1,56 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2012 - SE - Sylvestre Ledru
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+nx    = 10;
+nev   = 3;
+ncv   = 6;
+bmat  = 'I';
+which = 'LM';
+// Local Arrays
+iparam  = zeros(11, 1);
+ipntr   = zeros(14, 1);
+_select = zeros(ncv, 1);
+d       = zeros(nev, 1);
+z       = zeros(nx, nev);
+resid   = zeros(nx, 1); 
+v       = zeros(nx, ncv);
+workd   = zeros(3 * nx, 1); 
+workl   = zeros(ncv * ncv + 8 * ncv, 1);
+// Build the symmetric test matrix
+A            = diag(10 * ones(nx,1));
+A(1:$-1,2:$) = A(1:$-1,2:$) + diag(6 * ones(nx-1,1));
+A(2:$,1:$-1) = A(2:$,1:$-1) + diag(6 * ones(nx-1,1));
+tol    = 0;
+ido    = 0;
+ishfts = 1;
+maxitr = 300;
+mode1  = 1;
+iparam(1) = ishfts;
+iparam(3) = maxitr;
+iparam(7) = mode1;
+sigma = 0; // the real part of the shift
+info_dsaupd = 0;
+// M A I N   L O O P (Reverse communication)
+while(ido <> 99)
+  // Repeatedly call the routine DSAUPD and take actions indicated by parameter IDO until
+  // either convergence is indicated or maxitr has been exceeded.
+  [ido, resid, v, iparam, ipntr, workd, workl, info_dsaupd] = dsaupd(ido, bmat, nx, which, nev, tol, resid, ncv, v, iparam, ipntr, workd, workl, info_dsaupd);
+  if(info_dsaupd < 0)
+    printf('\nError with dsaupd, info = %d\n',info_dsaupd);
+    printf('Check the documentation of dsaupd\n\n');
+  end
+  if(ido == -1 | ido == 1)
+    // Perform matrix vector multiplication 
+    workd(ipntr(2):ipntr(2) + nx - 1) = A * workd(ipntr(1):ipntr(1) + nx - 1);
+  end
+end
+// Post-Process using DSEUPD.
+rvec    = 1;
+howmany = 'A';
+info_dseupd = 0;
+[d, z, resid, v, iparam, ipntr, workd, workl, info_dseupd] = dseupd(rvec, howmany, _select, d, z, sigma, bmat, nx, which, nev, tol, resid, ncv, v, ...
+                                                                    iparam, ipntr, workd, workl, info_dseupd);
+assert_checkalmostequal(A * z, z * diag(d), sqrt(%eps), 1.e-10); 
diff --git a/scilab/modules/arnoldi/tests/unit_tests/dseupd.tst b/scilab/modules/arnoldi/tests/unit_tests/dseupd.tst
new file mode 100644 (file)
index 0000000..e8fa73e
--- /dev/null
@@ -0,0 +1,74 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2012 - SE - Sylvestre Ledru
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+nx    = 10;
+
+nev   = 3;
+ncv   = 6;
+bmat  = 'I';
+which = 'LM';
+
+// Local Arrays
+
+iparam  = zeros(11, 1);
+ipntr   = zeros(14, 1);
+_select = zeros(ncv, 1);
+d       = zeros(nev, 1);
+z       = zeros(nx, nev);
+resid   = zeros(nx, 1); 
+v       = zeros(nx, ncv);
+workd   = zeros(3 * nx, 1); 
+workl   = zeros(ncv * ncv + 8 * ncv, 1);
+
+// Build the symmetric test matrix
+
+A            = diag(10 * ones(nx,1));
+A(1:$-1,2:$) = A(1:$-1,2:$) + diag(6 * ones(nx-1,1));
+A(2:$,1:$-1) = A(2:$,1:$-1) + diag(6 * ones(nx-1,1));
+
+tol    = 0;
+ido    = 0;
+
+ishfts = 1;
+maxitr = 300;
+mode1  = 1;
+
+iparam(1) = ishfts;
+iparam(3) = maxitr;
+iparam(7) = mode1;
+
+sigma = 0; // the real part of the shift
+info_dsaupd = 0;
+
+// M A I N   L O O P (Reverse communication)
+
+while(ido <> 99)
+  // Repeatedly call the routine DSAUPD and take actions indicated by parameter IDO until
+  // either convergence is indicated or maxitr has been exceeded.
+
+  [ido, resid, v, iparam, ipntr, workd, workl, info_dsaupd] = dsaupd(ido, bmat, nx, which, nev, tol, resid, ncv, v, iparam, ipntr, workd, workl, info_dsaupd);
+  
+  if(info_dsaupd < 0)
+    printf('\nError with dsaupd, info = %d\n',info_dsaupd);
+    printf('Check the documentation of dsaupd\n\n');
+  end
+  
+  if(ido == -1 | ido == 1)
+    // Perform matrix vector multiplication 
+    workd(ipntr(2):ipntr(2) + nx - 1) = A * workd(ipntr(1):ipntr(1) + nx - 1);
+  end
+end
+
+// Post-Process using DSEUPD.
+rvec    = 1;
+howmany = 'A';
+info_dseupd = 0;
+
+[d, z, resid, v, iparam, ipntr, workd, workl, info_dseupd] = dseupd(rvec, howmany, _select, d, z, sigma, bmat, nx, which, nev, tol, resid, ncv, v, ...
+                                                                    iparam, ipntr, workd, workl, info_dseupd);
+
+assert_checkalmostequal(A * z, z * diag(d), sqrt(%eps), 1.e-10); 
diff --git a/scilab/modules/arnoldi/tests/unit_tests/znaupd.dia.ref b/scilab/modules/arnoldi/tests/unit_tests/znaupd.dia.ref
new file mode 100644 (file)
index 0000000..c6c211f
--- /dev/null
@@ -0,0 +1,58 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2012 - SE - Sylvestre Ledru
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+nx    = 10;
+nev   = 3;
+ncv   = 6;
+bmat  = 'I';
+which = 'LM';
+// Local Arrays
+iparam  = zeros(11, 1);
+ipntr   = zeros(14, 1);
+_select = zeros(ncv, 1);
+d       = zeros(nev + 1, 1) + 0 * %i;
+z       = zeros(nx, nev) + 0* %i;
+resid   = zeros(nx, 1) + 0 * %i; 
+v       = zeros(nx, ncv) + 0 * %i;
+workd   = zeros(3 * nx, 1) + 0 * %i; 
+workev  = zeros(2 * ncv, 1) + 0 * %i;
+rwork   = zeros(ncv, 1);
+workl   = zeros(3 * ncv * ncv + 5 *ncv, 1) + 0 * %i;
+// Build the complex test matrix
+A            = diag(10 * ones(nx,1) + %i * ones(nx,1));
+A(1:$-1,2:$) = A(1:$-1,2:$) + diag(6 * ones(nx - 1,1));
+A(2:$,1:$-1) = A(2:$,1:$-1) + diag(-6 * ones(nx - 1,1));
+tol    = 0;
+ido    = 0;
+ishfts = 1;
+maxitr = 300;
+mode1  = 1;
+iparam(1) = ishfts;
+iparam(3) = maxitr;
+iparam(7) = mode1;
+sigma = complex(0); 
+info_znaupd = 0;
+// M A I N   L O O P (Reverse communication)
+while(ido <> 99)
+  // Repeatedly call the routine ZNAUPD and take actions indicated by parameter IDO until
+  // either convergence is indicated or maxitr has been exceeded.
+  [ido, resid, v, iparam, ipntr, workd, workl, info_znaupd] = znaupd(ido, bmat, nx, which, nev, tol, resid, ncv, v, iparam, ipntr, workd, workl, rwork, info_znaupd);
+  if(info_znaupd < 0)
+    printf('\nError with znaupd, info = %d\n', info_znaupd);
+    printf('Check the documentation of znaupd\n\n');
+  end
+  if(ido == -1 | ido == 1)
+    // Perform matrix vector multiplication 
+    workd(ipntr(2):ipntr(2) + nx - 1) = A * workd(ipntr(1):ipntr(1) + nx - 1);
+  end
+end
+// Post-Process using ZNEUPD.
+rvec    = 1;
+howmany = 'A';
+info_zneupd = 0;
+[d, z, resid, iparam, ipntr, workd, workl, rwork, info_zneupd] = zneupd(rvec, howmany, _select, d, z, sigma, workev, bmat, nx, which, nev, tol, resid, ncv, v, ...
+                                                                    iparam, ipntr, workd, workl, rwork, info_zneupd);
+assert_checkalmostequal(A * z, z * diag(d(1:3)), sqrt(%eps), 1.e-10); 
diff --git a/scilab/modules/arnoldi/tests/unit_tests/znaupd.tst b/scilab/modules/arnoldi/tests/unit_tests/znaupd.tst
new file mode 100644 (file)
index 0000000..4fb1815
--- /dev/null
@@ -0,0 +1,74 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2012 - SE - Sylvestre Ledru
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+nx    = 10;
+
+nev   = 3;
+ncv   = 6;
+bmat  = 'I';
+which = 'LM';
+
+// Local Arrays
+
+iparam  = zeros(11, 1);
+ipntr   = zeros(14, 1);
+_select = zeros(ncv, 1);
+d       = zeros(nev + 1, 1) + 0 * %i;
+z       = zeros(nx, nev) + 0* %i;
+resid   = zeros(nx, 1) + 0 * %i; 
+v       = zeros(nx, ncv) + 0 * %i;
+workd   = zeros(3 * nx, 1) + 0 * %i; 
+workev  = zeros(2 * ncv, 1) + 0 * %i;
+rwork   = zeros(ncv, 1);
+workl   = zeros(3 * ncv * ncv + 5 *ncv, 1) + 0 * %i;
+
+// Build the complex test matrix
+A            = diag(10 * ones(nx,1) + %i * ones(nx,1));
+A(1:$-1,2:$) = A(1:$-1,2:$) + diag(6 * ones(nx - 1,1));
+A(2:$,1:$-1) = A(2:$,1:$-1) + diag(-6 * ones(nx - 1,1));
+
+tol    = 0;
+ido    = 0;
+
+ishfts = 1;
+maxitr = 300;
+mode1  = 1;
+
+iparam(1) = ishfts;
+iparam(3) = maxitr;
+iparam(7) = mode1;
+
+sigma = complex(0); 
+info_znaupd = 0;
+// M A I N   L O O P (Reverse communication)
+while(ido <> 99)
+  // Repeatedly call the routine ZNAUPD and take actions indicated by parameter IDO until
+  // either convergence is indicated or maxitr has been exceeded.
+
+  [ido, resid, v, iparam, ipntr, workd, workl, info_znaupd] = znaupd(ido, bmat, nx, which, nev, tol, resid, ncv, v, iparam, ipntr, workd, workl, rwork, info_znaupd);
+  
+  if(info_znaupd < 0)
+    printf('\nError with znaupd, info = %d\n', info_znaupd);
+    printf('Check the documentation of znaupd\n\n');
+  end
+  
+  if(ido == -1 | ido == 1)
+    // Perform matrix vector multiplication 
+    workd(ipntr(2):ipntr(2) + nx - 1) = A * workd(ipntr(1):ipntr(1) + nx - 1);
+  end
+end
+  
+// Post-Process using ZNEUPD.
+
+rvec    = 1;
+howmany = 'A';
+info_zneupd = 0;
+
+[d, z, resid, iparam, ipntr, workd, workl, rwork, info_zneupd] = zneupd(rvec, howmany, _select, d, z, sigma, workev, bmat, nx, which, nev, tol, resid, ncv, v, ...
+                                                                    iparam, ipntr, workd, workl, rwork, info_zneupd);
+
+assert_checkalmostequal(A * z, z * diag(d(1:3)), sqrt(%eps), 1.e-10); 
diff --git a/scilab/modules/arnoldi/tests/unit_tests/zneupd.dia.ref b/scilab/modules/arnoldi/tests/unit_tests/zneupd.dia.ref
new file mode 100644 (file)
index 0000000..c6c211f
--- /dev/null
@@ -0,0 +1,58 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2012 - SE - Sylvestre Ledru
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+nx    = 10;
+nev   = 3;
+ncv   = 6;
+bmat  = 'I';
+which = 'LM';
+// Local Arrays
+iparam  = zeros(11, 1);
+ipntr   = zeros(14, 1);
+_select = zeros(ncv, 1);
+d       = zeros(nev + 1, 1) + 0 * %i;
+z       = zeros(nx, nev) + 0* %i;
+resid   = zeros(nx, 1) + 0 * %i; 
+v       = zeros(nx, ncv) + 0 * %i;
+workd   = zeros(3 * nx, 1) + 0 * %i; 
+workev  = zeros(2 * ncv, 1) + 0 * %i;
+rwork   = zeros(ncv, 1);
+workl   = zeros(3 * ncv * ncv + 5 *ncv, 1) + 0 * %i;
+// Build the complex test matrix
+A            = diag(10 * ones(nx,1) + %i * ones(nx,1));
+A(1:$-1,2:$) = A(1:$-1,2:$) + diag(6 * ones(nx - 1,1));
+A(2:$,1:$-1) = A(2:$,1:$-1) + diag(-6 * ones(nx - 1,1));
+tol    = 0;
+ido    = 0;
+ishfts = 1;
+maxitr = 300;
+mode1  = 1;
+iparam(1) = ishfts;
+iparam(3) = maxitr;
+iparam(7) = mode1;
+sigma = complex(0); 
+info_znaupd = 0;
+// M A I N   L O O P (Reverse communication)
+while(ido <> 99)
+  // Repeatedly call the routine ZNAUPD and take actions indicated by parameter IDO until
+  // either convergence is indicated or maxitr has been exceeded.
+  [ido, resid, v, iparam, ipntr, workd, workl, info_znaupd] = znaupd(ido, bmat, nx, which, nev, tol, resid, ncv, v, iparam, ipntr, workd, workl, rwork, info_znaupd);
+  if(info_znaupd < 0)
+    printf('\nError with znaupd, info = %d\n', info_znaupd);
+    printf('Check the documentation of znaupd\n\n');
+  end
+  if(ido == -1 | ido == 1)
+    // Perform matrix vector multiplication 
+    workd(ipntr(2):ipntr(2) + nx - 1) = A * workd(ipntr(1):ipntr(1) + nx - 1);
+  end
+end
+// Post-Process using ZNEUPD.
+rvec    = 1;
+howmany = 'A';
+info_zneupd = 0;
+[d, z, resid, iparam, ipntr, workd, workl, rwork, info_zneupd] = zneupd(rvec, howmany, _select, d, z, sigma, workev, bmat, nx, which, nev, tol, resid, ncv, v, ...
+                                                                    iparam, ipntr, workd, workl, rwork, info_zneupd);
+assert_checkalmostequal(A * z, z * diag(d(1:3)), sqrt(%eps), 1.e-10); 
diff --git a/scilab/modules/arnoldi/tests/unit_tests/zneupd.tst b/scilab/modules/arnoldi/tests/unit_tests/zneupd.tst
new file mode 100644 (file)
index 0000000..4fb1815
--- /dev/null
@@ -0,0 +1,74 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2012 - SE - Sylvestre Ledru
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+nx    = 10;
+
+nev   = 3;
+ncv   = 6;
+bmat  = 'I';
+which = 'LM';
+
+// Local Arrays
+
+iparam  = zeros(11, 1);
+ipntr   = zeros(14, 1);
+_select = zeros(ncv, 1);
+d       = zeros(nev + 1, 1) + 0 * %i;
+z       = zeros(nx, nev) + 0* %i;
+resid   = zeros(nx, 1) + 0 * %i; 
+v       = zeros(nx, ncv) + 0 * %i;
+workd   = zeros(3 * nx, 1) + 0 * %i; 
+workev  = zeros(2 * ncv, 1) + 0 * %i;
+rwork   = zeros(ncv, 1);
+workl   = zeros(3 * ncv * ncv + 5 *ncv, 1) + 0 * %i;
+
+// Build the complex test matrix
+A            = diag(10 * ones(nx,1) + %i * ones(nx,1));
+A(1:$-1,2:$) = A(1:$-1,2:$) + diag(6 * ones(nx - 1,1));
+A(2:$,1:$-1) = A(2:$,1:$-1) + diag(-6 * ones(nx - 1,1));
+
+tol    = 0;
+ido    = 0;
+
+ishfts = 1;
+maxitr = 300;
+mode1  = 1;
+
+iparam(1) = ishfts;
+iparam(3) = maxitr;
+iparam(7) = mode1;
+
+sigma = complex(0); 
+info_znaupd = 0;
+// M A I N   L O O P (Reverse communication)
+while(ido <> 99)
+  // Repeatedly call the routine ZNAUPD and take actions indicated by parameter IDO until
+  // either convergence is indicated or maxitr has been exceeded.
+
+  [ido, resid, v, iparam, ipntr, workd, workl, info_znaupd] = znaupd(ido, bmat, nx, which, nev, tol, resid, ncv, v, iparam, ipntr, workd, workl, rwork, info_znaupd);
+  
+  if(info_znaupd < 0)
+    printf('\nError with znaupd, info = %d\n', info_znaupd);
+    printf('Check the documentation of znaupd\n\n');
+  end
+  
+  if(ido == -1 | ido == 1)
+    // Perform matrix vector multiplication 
+    workd(ipntr(2):ipntr(2) + nx - 1) = A * workd(ipntr(1):ipntr(1) + nx - 1);
+  end
+end
+  
+// Post-Process using ZNEUPD.
+
+rvec    = 1;
+howmany = 'A';
+info_zneupd = 0;
+
+[d, z, resid, iparam, ipntr, workd, workl, rwork, info_zneupd] = zneupd(rvec, howmany, _select, d, z, sigma, workev, bmat, nx, which, nev, tol, resid, ncv, v, ...
+                                                                    iparam, ipntr, workd, workl, rwork, info_zneupd);
+
+assert_checkalmostequal(A * z, z * diag(d(1:3)), sqrt(%eps), 1.e-10);