Subversion Repositories slepc-dev

Rev

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

Rev Author Line No. Line
1887 jroman 1
/*
2
   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
3
   SLEPc - Scalable Library for Eigenvalue Problem Computations
2575 eromero 4
   Copyright (c) 2002-2011, Universitat Politecnica de Valencia, Spain
1887 jroman 5
 
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/>.
19
   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
20
*/
21
 
22
static char help[] = "Quadratic eigenproblem for testing the QEP object.\n\n"
23
  "The command line options are:\n"
24
  "  -n <n>, where <n> = number of grid subdivisions in x dimension.\n"
25
  "  -m <m>, where <m> = number of grid subdivisions in y dimension.\n\n";
26
 
2283 jroman 27
#include <slepcqep.h>
1887 jroman 28
 
29
#undef __FUNCT__
30
#define __FUNCT__ "main"
2331 jroman 31
int main(int argc,char **argv)
1887 jroman 32
{
2331 jroman 33
  Mat            M,C,K;           /* problem matrices */
2316 jroman 34
  QEP            qep;             /* quadratic eigenproblem solver context */
1887 jroman 35
  const QEPType  type;
2513 jroman 36
  PetscReal      tol;
2542 jroman 37
  PetscInt       N,n=10,m,Istart,Iend,II,nev,maxit,i,j;
2316 jroman 38
  PetscBool      flag;
2317 jroman 39
  PetscErrorCode ierr;
1887 jroman 40
 
41
  SlepcInitialize(&argc,&argv,(char*)0,help);
42
 
43
  ierr = PetscOptionsGetInt(PETSC_NULL,"-n",&n,PETSC_NULL);CHKERRQ(ierr);
44
  ierr = PetscOptionsGetInt(PETSC_NULL,"-m",&m,&flag);CHKERRQ(ierr);
2177 jroman 45
  if(!flag) m=n;
1887 jroman 46
  N = n*m;
2513 jroman 47
  ierr = PetscPrintf(PETSC_COMM_WORLD,"\nQuadratic Eigenproblem, N=%D (%Dx%D grid)\n\n",N,n,m);CHKERRQ(ierr);
1887 jroman 48
 
49
  /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
50
     Compute the matrices that define the eigensystem, (k^2*K+k*X+M)x=0
51
     - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
52
 
53
  /* K is the 2-D Laplacian */
54
  ierr = MatCreate(PETSC_COMM_WORLD,&K);CHKERRQ(ierr);
55
  ierr = MatSetSizes(K,PETSC_DECIDE,PETSC_DECIDE,N,N);CHKERRQ(ierr);
56
  ierr = MatSetFromOptions(K);CHKERRQ(ierr);
57
 
58
  ierr = MatGetOwnershipRange(K,&Istart,&Iend);CHKERRQ(ierr);
2331 jroman 59
  for (II=Istart;II<Iend;II++) {
1961 antodo 60
    i = II/n; j = II-i*n;  
61
    if(i>0) { ierr = MatSetValue(K,II,II-n,-1.0,INSERT_VALUES);CHKERRQ(ierr); }
62
    if(i<m-1) { ierr = MatSetValue(K,II,II+n,-1.0,INSERT_VALUES);CHKERRQ(ierr); }
63
    if(j>0) { ierr = MatSetValue(K,II,II-1,-1.0,INSERT_VALUES);CHKERRQ(ierr); }
64
    if(j<n-1) { ierr = MatSetValue(K,II,II+1,-1.0,INSERT_VALUES);CHKERRQ(ierr); }
65
    ierr = MatSetValue(K,II,II,4.0,INSERT_VALUES);CHKERRQ(ierr);
1887 jroman 66
  }
67
 
68
  ierr = MatAssemblyBegin(K,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
69
  ierr = MatAssemblyEnd(K,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
70
 
71
  /* C is the zero matrix */
72
  ierr = MatCreate(PETSC_COMM_WORLD,&C);CHKERRQ(ierr);
73
  ierr = MatSetSizes(C,PETSC_DECIDE,PETSC_DECIDE,N,N);CHKERRQ(ierr);
74
  ierr = MatSetFromOptions(C);CHKERRQ(ierr);
75
  ierr = MatAssemblyBegin(C,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
76
  ierr = MatAssemblyEnd(C,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
77
 
78
  /* M is the identity matrix */
79
  ierr = MatCreate(PETSC_COMM_WORLD,&M);CHKERRQ(ierr);
80
  ierr = MatSetSizes(M,PETSC_DECIDE,PETSC_DECIDE,N,N);CHKERRQ(ierr);
81
  ierr = MatSetFromOptions(M);CHKERRQ(ierr);
82
  ierr = MatAssemblyBegin(M,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
83
  ierr = MatAssemblyEnd(M,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
84
  ierr = MatShift(M,1.0);CHKERRQ(ierr);
85
 
86
  /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
87
                Create the eigensolver and set various options
88
     - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
89
 
90
  /*
91
     Create eigensolver context
92
  */
93
  ierr = QEPCreate(PETSC_COMM_WORLD,&qep);CHKERRQ(ierr);
94
 
95
  /*
2101 jroman 96
     Set matrices and problem type
1887 jroman 97
  */
1890 jroman 98
  ierr = QEPSetOperators(qep,M,C,K);CHKERRQ(ierr);
2101 jroman 99
  ierr = QEPSetProblemType(qep,QEP_GENERAL);CHKERRQ(ierr);
1887 jroman 100
 
101
  /*
102
     Set solver parameters at runtime
103
  */
104
  ierr = QEPSetFromOptions(qep);CHKERRQ(ierr);
105
 
106
  /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
107
                      Solve the eigensystem
108
     - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
109
 
110
  ierr = QEPSolve(qep);CHKERRQ(ierr);
111
 
112
  /*
113
     Optional: Get some information from the solver and display it
114
  */
115
  ierr = QEPGetType(qep,&type);CHKERRQ(ierr);
116
  ierr = PetscPrintf(PETSC_COMM_WORLD," Solution method: %s\n\n",type);CHKERRQ(ierr);
117
  ierr = QEPGetDimensions(qep,&nev,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr);
2513 jroman 118
  ierr = PetscPrintf(PETSC_COMM_WORLD," Number of requested eigenvalues: %D\n",nev);CHKERRQ(ierr);
1887 jroman 119
  ierr = QEPGetTolerances(qep,&tol,&maxit);CHKERRQ(ierr);
2513 jroman 120
  ierr = PetscPrintf(PETSC_COMM_WORLD," Stopping condition: tol=%.4G, maxit=%D\n",tol,maxit);CHKERRQ(ierr);
1887 jroman 121
 
122
  /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
123
                    Display solution and clean up
124
     - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
125
 
2513 jroman 126
  ierr = QEPPrintSolution(qep,PETSC_NULL);CHKERRQ(ierr);
2312 jroman 127
  ierr = QEPDestroy(&qep);CHKERRQ(ierr);
2305 jroman 128
  ierr = MatDestroy(&M);CHKERRQ(ierr);
129
  ierr = MatDestroy(&C);CHKERRQ(ierr);
130
  ierr = MatDestroy(&K);CHKERRQ(ierr);
1887 jroman 131
  ierr = SlepcFinalize();CHKERRQ(ierr);
132
  return 0;
133
}
134