Subversion Repositories slepc-dev

Rev

Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1376 slepc 1
/*
2
   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1672 slepc 3
   SLEPc - Scalable Library for Eigenvalue Problem Computations
2575 eromero 4
   Copyright (c) 2002-2011, Universitat Politecnica de Valencia, Spain
6 dsic.upv.es!jroman 5
 
1672 slepc 6
   This file is part of SLEPc.
7
 
8
   SLEPc is free software: you can redistribute it and/or modify it under  the
9
   terms of version 3 of the GNU Lesser General Public License as published by
10
   the Free Software Foundation.
11
 
12
   SLEPc  is  distributed in the hope that it will be useful, but WITHOUT  ANY
13
   WARRANTY;  without even the implied warranty of MERCHANTABILITY or  FITNESS
14
   FOR  A  PARTICULAR PURPOSE. See the GNU Lesser General Public  License  for
15
   more details.
16
 
17
   You  should have received a copy of the GNU Lesser General  Public  License
18
   along with SLEPc. If not, see <http://www.gnu.org/licenses/>.
1376 slepc 19
   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
20
*/
21
 
2451 eromero 22
static char help[] = "Test the solution of a HEP without calling EPSSetFromOptions (based on ex1.c).\n\n"
1156 slepc 23
  "The command line options are:\n"
2451 eromero 24
  "  -n <n>, where <n> = number of grid subdivisions = matrix dimension.\n"
25
  "  -type <eps_type> = eps type to test.\n\n";
6 dsic.upv.es!jroman 26
 
2283 jroman 27
#include <slepceps.h>
6 dsic.upv.es!jroman 28
 
29
#undef __FUNCT__
30
#define __FUNCT__ "main"
2331 jroman 31
int main(int argc,char **argv)
6 dsic.upv.es!jroman 32
{
1571 slepc 33
  Mat            A;           /* problem matrix */
1202 slepc 34
  EPS            eps;         /* eigenproblem solver context */
1507 slepc 35
  const EPSType  type;
2539 jroman 36
  PetscReal      tol=1000*PETSC_MACHINE_EPSILON;
2508 jroman 37
  PetscScalar    value[3];
2539 jroman 38
  PetscInt       n=30,i,Istart,Iend,col[3],nev;
2331 jroman 39
  PetscBool      FirstBlock=PETSC_FALSE,LastBlock=PETSC_FALSE;
2451 eromero 40
  char           epstype[30] = "krylovschur";
2317 jroman 41
  PetscErrorCode ierr;
6 dsic.upv.es!jroman 42
 
43
  SlepcInitialize(&argc,&argv,(char*)0,help);
44
 
45
  ierr = PetscOptionsGetInt(PETSC_NULL,"-n",&n,PETSC_NULL);CHKERRQ(ierr);
2451 eromero 46
  ierr = PetscOptionsGetString(PETSC_NULL,"-type",epstype,30,PETSC_NULL);CHKERRQ(ierr);
2508 jroman 47
  ierr = PetscPrintf(PETSC_COMM_WORLD,"\n1-D Laplacian Eigenproblem, n=%D",n);CHKERRQ(ierr);
2451 eromero 48
  ierr = PetscPrintf(PETSC_COMM_WORLD,"\nEPS type: %s\n\n",epstype);CHKERRQ(ierr);
6 dsic.upv.es!jroman 49
 
50
  /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
51
     Compute the operator matrix that defines the eigensystem, Ax=kx
52
     - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
53
 
828 dsic.upv.es!antodo 54
  ierr = MatCreate(PETSC_COMM_WORLD,&A);CHKERRQ(ierr);
55
  ierr = MatSetSizes(A,PETSC_DECIDE,PETSC_DECIDE,n,n);CHKERRQ(ierr);
6 dsic.upv.es!jroman 56
  ierr = MatSetFromOptions(A);CHKERRQ(ierr);
57
 
58
  ierr = MatGetOwnershipRange(A,&Istart,&Iend);CHKERRQ(ierr);
59
  if (Istart==0) FirstBlock=PETSC_TRUE;
60
  if (Iend==n) LastBlock=PETSC_TRUE;
61
  value[0]=-1.0; value[1]=2.0; value[2]=-1.0;
2331 jroman 62
  for (i=(FirstBlock? Istart+1: Istart); i<(LastBlock? Iend-1: Iend); i++) {
6 dsic.upv.es!jroman 63
    col[0]=i-1; col[1]=i; col[2]=i+1;
64
    ierr = MatSetValues(A,1,&i,3,col,value,INSERT_VALUES);CHKERRQ(ierr);
65
  }
66
  if (LastBlock) {
67
    i=n-1; col[0]=n-2; col[1]=n-1;
68
    ierr = MatSetValues(A,1,&i,2,col,value,INSERT_VALUES);CHKERRQ(ierr);
69
  }
70
  if (FirstBlock) {
71
    i=0; col[0]=0; col[1]=1; value[0]=2.0; value[1]=-1.0;
72
    ierr = MatSetValues(A,1,&i,2,col,value,INSERT_VALUES);CHKERRQ(ierr);
73
  }
74
 
75
  ierr = MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
76
  ierr = MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
77
 
78
  /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
79
                Create the eigensolver and set various options
80
     - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
81
  /*
82
     Create eigensolver context
83
  */
84
  ierr = EPSCreate(PETSC_COMM_WORLD,&eps);CHKERRQ(ierr);
85
 
86
  /*
87
     Set operators. In this case, it is a standard eigenvalue problem
88
  */
89
  ierr = EPSSetOperators(eps,A,PETSC_NULL);CHKERRQ(ierr);
408 dsic.upv.es!antodo 90
  ierr = EPSSetProblemType(eps,EPS_HEP);CHKERRQ(ierr);
2516 jroman 91
  ierr = EPSSetDimensions(eps,4,PETSC_DEFAULT,PETSC_DEFAULT);CHKERRQ(ierr);
2539 jroman 92
  ierr = EPSSetTolerances(eps,tol,PETSC_DEFAULT);CHKERRQ(ierr);
6 dsic.upv.es!jroman 93
 
94
  /*
95
     Set solver parameters at runtime
96
  */
2451 eromero 97
  ierr = EPSSetType(eps,epstype);CHKERRQ(ierr);
6 dsic.upv.es!jroman 98
 
99
  /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
100
                      Solve the eigensystem
101
     - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
102
 
78 dsic.upv.es!antodo 103
  ierr = EPSSolve(eps);CHKERRQ(ierr);
6 dsic.upv.es!jroman 104
  /*
105
     Optional: Get some information from the solver and display it
106
  */
107
  ierr = EPSGetType(eps,&type);CHKERRQ(ierr);
108
  ierr = PetscPrintf(PETSC_COMM_WORLD," Solution method: %s\n\n",type);CHKERRQ(ierr);
1575 slepc 109
  ierr = EPSGetDimensions(eps,&nev,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr);
2508 jroman 110
  ierr = PetscPrintf(PETSC_COMM_WORLD," Number of requested eigenvalues: %D\n",nev);CHKERRQ(ierr);
6 dsic.upv.es!jroman 111
 
112
  /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
113
                    Display solution and clean up
114
     - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
115
 
2508 jroman 116
  ierr = EPSPrintSolution(eps,PETSC_NULL);CHKERRQ(ierr);
2308 jroman 117
  ierr = EPSDestroy(&eps);CHKERRQ(ierr);
2305 jroman 118
  ierr = MatDestroy(&A);CHKERRQ(ierr);
6 dsic.upv.es!jroman 119
  ierr = SlepcFinalize();CHKERRQ(ierr);
120
  return 0;
121
}