Subversion Repositories slepc-dev

Rev

Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
290 dsic.upv.es!antodo 1
 
302 dsic.upv.es!antodo 2
static char help[] = "Computes the smallest nonzero eigenvalue of the Laplacian of a graph.\n\n"
3
  "This example illustrates EPSAttachDeflationSpace(). The example graph corresponds to a "
1156 slepc 4
  "2-D regular mesh. The command line options are:\n"
5
  "  -n <n>, where <n> = number of grid subdivisions in x dimension.\n"
302 dsic.upv.es!antodo 6
  "  -m <m>, where <m> = number of grid subdivisions in y dimension.\n\n";
290 dsic.upv.es!antodo 7
 
8
#include "slepceps.h"
9
 
10
#undef __FUNCT__
11
#define __FUNCT__ "main"
12
int main( int argc, char **argv )
13
{
983 slepc 14
  Mat            A;               /* operator matrix */
15
  Vec            x;
16
  EPS            eps;             /* eigenproblem solver context */
17
  EPSType        type;
18
  PetscReal      error, tol, re, im;
19
  PetscScalar    kr, ki;
20
  PetscErrorCode ierr;
21
  int            nev, maxit, its, nconv;
1210 slepc 22
  PetscInt       N, n=10, m, i, j, II, J, Istart, Iend;
983 slepc 23
  PetscScalar    v, w;
24
  PetscTruth     flag;
290 dsic.upv.es!antodo 25
 
26
  SlepcInitialize(&argc,&argv,(char*)0,help);
27
 
28
  ierr = PetscOptionsGetInt(PETSC_NULL,"-n",&n,PETSC_NULL);CHKERRQ(ierr);
302 dsic.upv.es!antodo 29
  ierr = PetscOptionsGetInt(PETSC_NULL,"-m",&m,&flag);CHKERRQ(ierr);
30
  if( flag==PETSC_FALSE ) m=n;
31
  N = n*m;
305 dsic.upv.es!jroman 32
  ierr = PetscPrintf(PETSC_COMM_WORLD,"\nFiedler vector of a 2-D regular mesh, N=%d (%dx%d grid)\n\n",N,n,m);CHKERRQ(ierr);
290 dsic.upv.es!antodo 33
 
34
  /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
35
     Compute the operator matrix that defines the eigensystem, Ax=kx
305 dsic.upv.es!jroman 36
     In this example, A = L(G), where L is the Laplacian of graph G, i.e.
37
     Lii = degree of node i, Lij = -1 if edge (i,j) exists in G
290 dsic.upv.es!antodo 38
     - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
39
 
828 dsic.upv.es!antodo 40
  ierr = MatCreate(PETSC_COMM_WORLD,&A);CHKERRQ(ierr);
41
  ierr = MatSetSizes(A,PETSC_DECIDE,PETSC_DECIDE,N,N);CHKERRQ(ierr);
290 dsic.upv.es!antodo 42
  ierr = MatSetFromOptions(A);CHKERRQ(ierr);
43
 
44
  ierr = MatGetOwnershipRange(A,&Istart,&Iend);CHKERRQ(ierr);
1210 slepc 45
  for( II=Istart; II<Iend; II++ ) {
46
    v = -1.0; i = II/n; j = II-i*n;
302 dsic.upv.es!antodo 47
    w = 0.0;
1210 slepc 48
    if(i>0) { J=II-n; MatSetValues(A,1,&II,1,&J,&v,INSERT_VALUES);CHKERRQ(ierr); w=w+1.0; }
49
    if(i<m-1) { J=II+n; MatSetValues(A,1,&II,1,&J,&v,INSERT_VALUES);CHKERRQ(ierr); w=w+1.0; }
50
    if(j>0) { J=II-1; MatSetValues(A,1,&II,1,&J,&v,INSERT_VALUES);CHKERRQ(ierr); w=w+1.0; }
51
    if(j<n-1) { J=II+1; MatSetValues(A,1,&II,1,&J,&v,INSERT_VALUES);CHKERRQ(ierr); w=w+1.0; }
52
    MatSetValues(A,1,&II,1,&II,&w,INSERT_VALUES);CHKERRQ(ierr);
290 dsic.upv.es!antodo 53
  }
54
 
55
  ierr = MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
56
  ierr = MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
57
 
58
  /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
59
                Create the eigensolver and set various options
60
     - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
61
 
62
  /*
63
     Create eigensolver context
64
  */
65
  ierr = EPSCreate(PETSC_COMM_WORLD,&eps);CHKERRQ(ierr);
66
 
67
  /*
68
     Set operators. In this case, it is a standard eigenvalue problem
69
  */
70
  ierr = EPSSetOperators(eps,A,PETSC_NULL);CHKERRQ(ierr);
408 dsic.upv.es!antodo 71
  ierr = EPSSetProblemType(eps,EPS_HEP);CHKERRQ(ierr);
302 dsic.upv.es!antodo 72
 
73
  /*
943 dsic.upv.es!jroman 74
     Select portion of spectrum
302 dsic.upv.es!antodo 75
  */
943 dsic.upv.es!jroman 76
  ierr = EPSSetWhichEigenpairs(eps,EPS_SMALLEST_REAL);CHKERRQ(ierr);
290 dsic.upv.es!antodo 77
 
78
  /*
79
     Set solver parameters at runtime
80
  */
81
  ierr = EPSSetFromOptions(eps);CHKERRQ(ierr);
82
 
302 dsic.upv.es!antodo 83
  /*
305 dsic.upv.es!jroman 84
     Attach deflation space: in this case, the matrix has a constant
85
     nullspace, [1 1 ... 1]^T is the eigenvector of the zero eigenvalue
302 dsic.upv.es!antodo 86
  */
87
  ierr = MatGetVecs(A,&x,PETSC_NULL);CHKERRQ(ierr);
828 dsic.upv.es!antodo 88
  ierr = VecSet(x,1.0);CHKERRQ(ierr);
302 dsic.upv.es!antodo 89
  ierr = EPSAttachDeflationSpace(eps,1,&x,PETSC_FALSE);CHKERRQ(ierr);
90
  ierr = VecDestroy(x);
91
 
290 dsic.upv.es!antodo 92
  /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
93
                      Solve the eigensystem
94
     - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
95
 
96
  ierr = EPSSolve(eps);CHKERRQ(ierr);
97
  ierr = EPSGetIterationNumber(eps, &its);CHKERRQ(ierr);
302 dsic.upv.es!antodo 98
  ierr = PetscPrintf(PETSC_COMM_WORLD," Number of iterations of the method: %d\n",its);CHKERRQ(ierr);
290 dsic.upv.es!antodo 99
 
100
  /*
101
     Optional: Get some information from the solver and display it
102
  */
103
  ierr = EPSGetType(eps,&type);CHKERRQ(ierr);
104
  ierr = PetscPrintf(PETSC_COMM_WORLD," Solution method: %s\n\n",type);CHKERRQ(ierr);
105
  ierr = EPSGetDimensions(eps,&nev,PETSC_NULL);CHKERRQ(ierr);
302 dsic.upv.es!antodo 106
  ierr = PetscPrintf(PETSC_COMM_WORLD," Number of requested eigenvalues: %d\n",nev);CHKERRQ(ierr);
290 dsic.upv.es!antodo 107
  ierr = EPSGetTolerances(eps,&tol,&maxit);CHKERRQ(ierr);
302 dsic.upv.es!antodo 108
  ierr = PetscPrintf(PETSC_COMM_WORLD," Stopping condition: tol=%.4g, maxit=%d\n",tol,maxit);CHKERRQ(ierr);
290 dsic.upv.es!antodo 109
 
110
  /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
111
                    Display solution and clean up
112
     - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
113
 
114
  /*
115
     Get number of converged approximate eigenpairs
116
  */
117
  ierr = EPSGetConverged(eps,&nconv);CHKERRQ(ierr);
302 dsic.upv.es!antodo 118
  ierr = PetscPrintf(PETSC_COMM_WORLD," Number of converged approximate eigenpairs: %d\n\n",nconv);
290 dsic.upv.es!antodo 119
         CHKERRQ(ierr);
120
 
121
  if (nconv>0) {
122
    /*
123
       Display eigenvalues and relative errors
124
    */
125
    ierr = PetscPrintf(PETSC_COMM_WORLD,
126
         "           k          ||Ax-kx||/||kx||\n"
127
         "   ----------------- ------------------\n" );CHKERRQ(ierr);
128
 
129
    for( i=0; i<nconv; i++ ) {
130
      /*
131
        Get converged eigenpairs: i-th eigenvalue is stored in kr (real part) and
132
        ki (imaginary part)
133
      */
134
      ierr = EPSGetEigenpair(eps,i,&kr,&ki,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr);
135
      /*
136
         Compute the relative error associated to each eigenpair
137
      */
138
      ierr = EPSComputeRelativeError(eps,i,&error);CHKERRQ(ierr);
139
 
140
#ifdef PETSC_USE_COMPLEX
141
      re = PetscRealPart(kr);
142
      im = PetscImaginaryPart(kr);
143
#else
144
      re = kr;
145
      im = ki;
146
#endif
147
      if (im!=0.0) {
1162 slepc 148
        ierr = PetscPrintf(PETSC_COMM_WORLD," %9f%+9f j %12g\n",re,im,error);CHKERRQ(ierr);
290 dsic.upv.es!antodo 149
      } else {
1162 slepc 150
        ierr = PetscPrintf(PETSC_COMM_WORLD,"   %12f       %12g\n",re,error);CHKERRQ(ierr);
290 dsic.upv.es!antodo 151
      }
152
    }
153
    ierr = PetscPrintf(PETSC_COMM_WORLD,"\n" );CHKERRQ(ierr);
154
  }
155
 
156
  /*
157
     Free work space
158
  */
159
  ierr = EPSDestroy(eps);CHKERRQ(ierr);
160
  ierr = MatDestroy(A);CHKERRQ(ierr);
161
  ierr = SlepcFinalize();CHKERRQ(ierr);
162
  return 0;
163
}
164