Subversion Repositories slepc-dev

Rev

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

Rev Author Line No. Line
1921 jroman 1
/*
2
   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
3
   SLEPc - Scalable Library for Eigenvalue Problem Computations
2575 eromero 4
   Copyright (c) 2002-2011, Universitat Politecnica de Valencia, Spain
1921 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[] = "Solves a quadratic eigenproblem (l^2*M + l*C + K)*x = 0 with matrices loaded from a file.\n\n"
23
  "The command line options are:\n"
24
  "  -M <filename>, where <filename> = matrix (M) file in PETSc binary form.\n"
25
  "  -C <filename>, where <filename> = matrix (C) file in PETSc binary form.\n"
26
  "  -K <filename>, where <filename> = matrix (K) file in PETSc binary form.\n\n";
27
 
2283 jroman 28
#include <slepcqep.h>
1921 jroman 29
 
30
#undef __FUNCT__
31
#define __FUNCT__ "main"
2331 jroman 32
int main(int argc,char **argv)
1921 jroman 33
{
2331 jroman 34
  Mat            M,C,K;           /* problem matrices */
2316 jroman 35
  QEP            qep;             /* quadratic eigenproblem solver context */
1921 jroman 36
  const QEPType  type;
2513 jroman 37
  PetscReal      tol;
38
  PetscInt       nev,maxit,its;
2374 jroman 39
  char           filename[PETSC_MAX_PATH_LEN];
2316 jroman 40
  PetscViewer    viewer;
41
  PetscBool      flg;
2317 jroman 42
  PetscErrorCode ierr;
1921 jroman 43
 
44
  SlepcInitialize(&argc,&argv,(char*)0,help);
45
 
46
  /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
47
        Load the matrices that define the quadratic eigenproblem
48
     - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
49
 
50
  ierr = PetscPrintf(PETSC_COMM_WORLD,"\nQuadratic eigenproblem stored in file.\n\n");CHKERRQ(ierr);
51
#if defined(PETSC_USE_COMPLEX)
52
  ierr = PetscPrintf(PETSC_COMM_WORLD," Reading COMPLEX matrices from binary files...\n");CHKERRQ(ierr);
53
#else
54
  ierr = PetscPrintf(PETSC_COMM_WORLD," Reading REAL matrices from binary files...\n");CHKERRQ(ierr);
55
#endif
56
 
2374 jroman 57
  ierr = PetscOptionsGetString(PETSC_NULL,"-M",filename,PETSC_MAX_PATH_LEN,&flg);CHKERRQ(ierr);
2762 jroman 58
  if (!flg) SETERRQ(PETSC_COMM_WORLD,1,"Must indicate a file name for matrix M with the -M option.");
1921 jroman 59
  ierr = PetscViewerBinaryOpen(PETSC_COMM_WORLD,filename,FILE_MODE_READ,&viewer);CHKERRQ(ierr);
2246 eromero 60
  ierr = MatCreate(PETSC_COMM_WORLD,&M);CHKERRQ(ierr);
61
  ierr = MatSetFromOptions(M);CHKERRQ(ierr);
62
  ierr = MatLoad(M,viewer);CHKERRQ(ierr);
2305 jroman 63
  ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
1921 jroman 64
 
2374 jroman 65
  ierr = PetscOptionsGetString(PETSC_NULL,"-C",filename,PETSC_MAX_PATH_LEN,&flg);CHKERRQ(ierr);
2762 jroman 66
  if (!flg) SETERRQ(PETSC_COMM_WORLD,1,"Must indicate a file name for matrix C with the -C option.");
1921 jroman 67
  ierr = PetscViewerBinaryOpen(PETSC_COMM_WORLD,filename,FILE_MODE_READ,&viewer);CHKERRQ(ierr);
2246 eromero 68
  ierr = MatCreate(PETSC_COMM_WORLD,&C);CHKERRQ(ierr);
69
  ierr = MatSetFromOptions(C);CHKERRQ(ierr);
70
  ierr = MatLoad(C,viewer);CHKERRQ(ierr);
2305 jroman 71
  ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
1921 jroman 72
 
2374 jroman 73
  ierr = PetscOptionsGetString(PETSC_NULL,"-K",filename,PETSC_MAX_PATH_LEN,&flg);CHKERRQ(ierr);
2762 jroman 74
  if (!flg) SETERRQ(PETSC_COMM_WORLD,1,"Must indicate a file name for matrix K with the -K option.");
1921 jroman 75
  ierr = PetscViewerBinaryOpen(PETSC_COMM_WORLD,filename,FILE_MODE_READ,&viewer);CHKERRQ(ierr);
2246 eromero 76
  ierr = MatCreate(PETSC_COMM_WORLD,&K);CHKERRQ(ierr);
77
  ierr = MatSetFromOptions(K);CHKERRQ(ierr);
78
  ierr = MatLoad(K,viewer);CHKERRQ(ierr);
2305 jroman 79
  ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
1921 jroman 80
 
81
  /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
82
                Create the eigensolver and set various options
83
     - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
84
 
85
  /*
86
     Create eigensolver context
87
  */
88
  ierr = QEPCreate(PETSC_COMM_WORLD,&qep);CHKERRQ(ierr);
89
 
90
  /*
91
     Set matrices
92
  */
93
  ierr = QEPSetOperators(qep,M,C,K);CHKERRQ(ierr);
94
 
95
  /*
96
     Set solver parameters at runtime
97
  */
98
  ierr = QEPSetFromOptions(qep);CHKERRQ(ierr);
99
 
100
  /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
101
                      Solve the eigensystem
102
     - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
103
 
104
  ierr = QEPSolve(qep);CHKERRQ(ierr);
2331 jroman 105
  ierr = QEPGetIterationNumber(qep,&its);CHKERRQ(ierr);
2513 jroman 106
  ierr = PetscPrintf(PETSC_COMM_WORLD," Number of iterations of the method: %D\n",its);CHKERRQ(ierr);
1921 jroman 107
 
108
  /*
109
     Optional: Get some information from the solver and display it
110
  */
111
  ierr = QEPGetType(qep,&type);CHKERRQ(ierr);
112
  ierr = PetscPrintf(PETSC_COMM_WORLD," Solution method: %s\n\n",type);CHKERRQ(ierr);
113
  ierr = QEPGetDimensions(qep,&nev,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr);
2513 jroman 114
  ierr = PetscPrintf(PETSC_COMM_WORLD," Number of requested eigenvalues: %D\n",nev);CHKERRQ(ierr);
1921 jroman 115
  ierr = QEPGetTolerances(qep,&tol,&maxit);CHKERRQ(ierr);
2513 jroman 116
  ierr = PetscPrintf(PETSC_COMM_WORLD," Stopping condition: tol=%.4G, maxit=%D\n",tol,maxit);CHKERRQ(ierr);
1921 jroman 117
 
118
  /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
119
                    Display solution and clean up
120
     - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
121
 
2513 jroman 122
  ierr = QEPPrintSolution(qep,PETSC_NULL);CHKERRQ(ierr);
2312 jroman 123
  ierr = QEPDestroy(&qep);CHKERRQ(ierr);
2305 jroman 124
  ierr = MatDestroy(&M);CHKERRQ(ierr);
125
  ierr = MatDestroy(&C);CHKERRQ(ierr);
126
  ierr = MatDestroy(&K);CHKERRQ(ierr);
1921 jroman 127
  ierr = SlepcFinalize();CHKERRQ(ierr);
128
  return 0;
129
}
130