| /* |
| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
| SLEPc - Scalable Library for Eigenvalue Problem Computations |
| Copyright (c) 2002-2011, Universitat Politecnica de Valencia, Spain |
| |
| This file is part of SLEPc. |
| |
| SLEPc is free software: you can redistribute it and/or modify it under the |
| terms of version 3 of the GNU Lesser General Public License as published by |
| the Free Software Foundation. |
| |
| SLEPc is distributed in the hope that it will be useful, but WITHOUT ANY |
| WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS |
| FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for |
| more details. |
| |
| You should have received a copy of the GNU Lesser General Public License |
| along with SLEPc. If not, see <http://www.gnu.org/licenses/>. |
| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
| */ |
| |
| static char help[] = "Diagonal eigenproblem.\n\n" |
| "The command line options are:\n" |
| " -n <n>, where <n> = number of grid subdivisions = matrix dimension.\n" |
| " -seed <s>, where <s> = seed for random number generation.\n\n"; |
| |
| #include <slepceps.h> |
| |
| #undef __FUNCT__ |
| #define __FUNCT__ "MyPCApply" |
| PetscErrorCode MyPCApply(PC pc,Vec x,Vec y) |
| { |
| PetscErrorCode ierr; |
| PetscFunctionBegin; |
| ierr = VecCopy(x,y);CHKERRQ(ierr); |
| PetscFunctionReturn(0); |
| } |
| |
| #undef __FUNCT__ |
| #define __FUNCT__ "main" |
| int main(int argc,char **argv) |
| { |
| Mat A; /* problem matrix */ |
| EPS eps; /* eigenproblem solver context */ |
| Vec v0; /* initial vector */ |
| PetscRandom rand; |
| PetscReal tol=1000*PETSC_MACHINE_EPSILON; |
| PetscInt n=30,i,Istart,Iend,seed=0x12345678; |
| PetscErrorCode ierr; |
| ST st; |
| KSP ksp; |
| PC pc; |
| |
| SlepcInitialize(&argc,&argv,(char*)0,help); |
| |
| ierr = PetscOptionsGetInt(PETSC_NULL,"-n",&n,PETSC_NULL);CHKERRQ(ierr); |
| ierr = PetscPrintf(PETSC_COMM_WORLD,"\nDiagonal Eigenproblem, n=%d\n\n",n);CHKERRQ(ierr); |
| |
| ierr = MatCreate(PETSC_COMM_WORLD,&A);CHKERRQ(ierr); |
| ierr = MatSetSizes(A,PETSC_DECIDE,PETSC_DECIDE,n,n);CHKERRQ(ierr); |
| ierr = MatSetFromOptions(A);CHKERRQ(ierr); |
| ierr = MatSetUp(A);CHKERRQ(ierr); |
| ierr = MatGetOwnershipRange(A,&Istart,&Iend);CHKERRQ(ierr); |
| for (i=Istart;i<Iend;i++) { |
| ierr = MatSetValue(A,i,i,i+1,INSERT_VALUES);CHKERRQ(ierr); |
| } |
| ierr = MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); |
| ierr = MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); |
| |
| /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
| Solve the eigensystem |
| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ |
| ierr = EPSCreate(PETSC_COMM_WORLD,&eps);CHKERRQ(ierr); |
| ierr = EPSSetOperators(eps,A,PETSC_NULL);CHKERRQ(ierr); |
| ierr = EPSSetProblemType(eps,EPS_HEP);CHKERRQ(ierr); |
| ierr = EPSSetTolerances(eps,tol,PETSC_DECIDE);CHKERRQ(ierr); |
| ierr = EPSSetFromOptions(eps);CHKERRQ(ierr); |
| ierr = EPSGetST(eps,&st);CHKERRQ(ierr); |
| ierr = STGetKSP(st,&ksp);CHKERRQ(ierr); |
| ierr = KSPGetPC(ksp,&pc);CHKERRQ(ierr); |
| ierr = PCSetType(pc,PCSHELL);CHKERRQ(ierr); |
| ierr = PCShellSetApply(pc,MyPCApply);CHKERRQ(ierr); |
| ierr = STPrecondSetMatForPC(st,A);CHKERRQ(ierr); |
| |
| /* set random initial vector */ |
| ierr = MatGetVecs(A,&v0,PETSC_NULL);CHKERRQ(ierr); |
| ierr = PetscRandomCreate(PETSC_COMM_WORLD,&rand);CHKERRQ(ierr); |
| ierr = PetscRandomSetFromOptions(rand);CHKERRQ(ierr); |
| ierr = PetscOptionsGetInt(PETSC_NULL,"-seed",&seed,PETSC_NULL);CHKERRQ(ierr); |
| ierr = PetscRandomSetSeed(rand,seed);CHKERRQ(ierr); |
| ierr = PetscRandomSeed(rand);CHKERRQ(ierr); |
| ierr = VecSetRandom(v0,rand);CHKERRQ(ierr); |
| ierr = EPSSetInitialSpace(eps,1,&v0);CHKERRQ(ierr); |
| /* call the solver */ |
| ierr = EPSSolve(eps);CHKERRQ(ierr); |
| |
| /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
| Display solution and clean up |
| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ |
| ierr = EPSPrintSolution(eps,PETSC_NULL);CHKERRQ(ierr); |
| ierr = EPSDestroy(&eps);CHKERRQ(ierr); |
| ierr = MatDestroy(&A);CHKERRQ(ierr); |
| ierr = VecDestroy(&v0);CHKERRQ(ierr); |
| ierr = PetscRandomDestroy(&rand);CHKERRQ(ierr); |
| ierr = SlepcFinalize();CHKERRQ(ierr); |
| return 0; |
| } |