Subversion Repositories slepc-dev

Rev

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

Rev Author Line No. Line
6 dsic.upv.es!jroman 1
/*
2
    Routines to set ST methods and options.
1376 slepc 3
 
4
   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1672 slepc 5
   SLEPc - Scalable Library for Eigenvalue Problem Computations
2575 eromero 6
   Copyright (c) 2002-2011, Universitat Politecnica de Valencia, Spain
1376 slepc 7
 
1672 slepc 8
   This file is part of SLEPc.
9
 
10
   SLEPc is free software: you can redistribute it and/or modify it under  the
11
   terms of version 3 of the GNU Lesser General Public License as published by
12
   the Free Software Foundation.
13
 
14
   SLEPc  is  distributed in the hope that it will be useful, but WITHOUT  ANY
15
   WARRANTY;  without even the implied warranty of MERCHANTABILITY or  FITNESS
16
   FOR  A  PARTICULAR PURPOSE. See the GNU Lesser General Public  License  for
17
   more details.
18
 
19
   You  should have received a copy of the GNU Lesser General  Public  License
20
   along with SLEPc. If not, see <http://www.gnu.org/licenses/>.
1376 slepc 21
   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
6 dsic.upv.es!jroman 22
*/
23
 
2283 jroman 24
#include <private/stimpl.h>      /*I "slepcst.h" I*/
6 dsic.upv.es!jroman 25
 
2376 jroman 26
PetscBool  STRegisterAllCalled = PETSC_FALSE;
6 dsic.upv.es!jroman 27
PetscFList STList = 0;
28
 
29
#undef __FUNCT__  
30
#define __FUNCT__ "STSetType"
31
/*@C
32
   STSetType - Builds ST for a particular spectral transformation.
33
 
2328 jroman 34
   Logically Collective on ST
6 dsic.upv.es!jroman 35
 
36
   Input Parameter:
37
+  st   - the spectral transformation context.
38
-  type - a known type
39
 
40
   Options Database Key:
41
.  -st_type <type> - Sets ST type
42
 
172 dsic.upv.es!jroman 43
   Use -help for a list of available transformations
6 dsic.upv.es!jroman 44
 
45
   Notes:
172 dsic.upv.es!jroman 46
   See "slepc/include/slepcst.h" for available transformations
6 dsic.upv.es!jroman 47
 
48
   Normally, it is best to use the EPSSetFromOptions() command and
49
   then set the ST type from the options database rather than by using
50
   this routine.  Using the options database provides the user with
51
   maximum flexibility in evaluating the many different transformations.
52
 
53
   Level: intermediate
54
 
55
.seealso: EPSSetType()
56
 
57
@*/
1502 slepc 58
PetscErrorCode STSetType(ST st,const STType type)
6 dsic.upv.es!jroman 59
{
476 dsic.upv.es!antodo 60
  PetscErrorCode ierr,(*r)(ST);
2216 jroman 61
  PetscBool      match;
6 dsic.upv.es!jroman 62
 
63
  PetscFunctionBegin;
2213 jroman 64
  PetscValidHeaderSpecific(st,ST_CLASSID,1);
25 dsic.upv.es!jroman 65
  PetscValidCharPointer(type,2);
6 dsic.upv.es!jroman 66
 
67
  ierr = PetscTypeCompare((PetscObject)st,type,&match);CHKERRQ(ierr);
68
  if (match) PetscFunctionReturn(0);
69
 
2348 jroman 70
  ierr =  PetscFListFind(STList,((PetscObject)st)->comm,type,PETSC_TRUE,(void (**)(void))&r);CHKERRQ(ierr);
71
  if (!r) SETERRQ1(((PetscObject)st)->comm,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unable to find requested ST type %s",type);
6 dsic.upv.es!jroman 72
 
2348 jroman 73
  if (st->ops->destroy) { ierr = (*st->ops->destroy)(st);CHKERRQ(ierr); }
337 dsic.upv.es!antodo 74
  ierr = PetscMemzero(st->ops,sizeof(struct _STOps));CHKERRQ(ierr);
6 dsic.upv.es!jroman 75
 
2348 jroman 76
  st->setupcalled = 0;
6 dsic.upv.es!jroman 77
  ierr = PetscObjectChangeTypeName((PetscObject)st,type);CHKERRQ(ierr);
2348 jroman 78
  ierr = (*r)(st);CHKERRQ(ierr);
6 dsic.upv.es!jroman 79
  PetscFunctionReturn(0);
80
}
81
 
82
#undef __FUNCT__  
83
#define __FUNCT__ "STGetType"
84
/*@C
172 dsic.upv.es!jroman 85
   STGetType - Gets the ST type name (as a string) from the ST context.
6 dsic.upv.es!jroman 86
 
87
   Not Collective
88
 
89
   Input Parameter:
90
.  st - the spectral transformation context
91
 
92
   Output Parameter:
93
.  name - name of the spectral transformation
94
 
95
   Level: intermediate
96
 
97
.seealso: STSetType()
98
 
99
@*/
1501 slepc 100
PetscErrorCode STGetType(ST st,const STType *type)
6 dsic.upv.es!jroman 101
{
102
  PetscFunctionBegin;
2213 jroman 103
  PetscValidHeaderSpecific(st,ST_CLASSID,1);
1501 slepc 104
  PetscValidPointer(type,2);
105
  *type = ((PetscObject)st)->type_name;
6 dsic.upv.es!jroman 106
  PetscFunctionReturn(0);
107
}
108
 
109
#undef __FUNCT__  
110
#define __FUNCT__ "STSetFromOptions"
111
/*@
112
   STSetFromOptions - Sets ST options from the options database.
113
   This routine must be called before STSetUp() if the user is to be
114
   allowed to set the type of transformation.
115
 
116
   Collective on ST
117
 
118
   Input Parameter:
119
.  st - the spectral transformation context
120
 
121
   Level: beginner
122
@*/
476 dsic.upv.es!antodo 123
PetscErrorCode STSetFromOptions(ST st)
6 dsic.upv.es!jroman 124
{
476 dsic.upv.es!antodo 125
  PetscErrorCode ierr;
982 slepc 126
  PetscInt       i;
2074 jroman 127
  PetscScalar    s;
476 dsic.upv.es!antodo 128
  char           type[256];
2216 jroman 129
  PetscBool      flg;
2331 jroman 130
  const char     *mode_list[3] = {"copy","inplace","shell"};
131
  const char     *structure_list[3] = {"same","different","subset"};
6 dsic.upv.es!jroman 132
 
133
  PetscFunctionBegin;
2213 jroman 134
  PetscValidHeaderSpecific(st,ST_CLASSID,1);
2376 jroman 135
  if (!STRegisterAllCalled) { ierr = STRegisterAll(PETSC_NULL);CHKERRQ(ierr); }
1422 slepc 136
  ierr = PetscOptionsBegin(((PetscObject)st)->comm,((PetscObject)st)->prefix,"Spectral Transformation (ST) Options","ST");CHKERRQ(ierr);
137
    ierr = PetscOptionsList("-st_type","Spectral Transformation type","STSetType",STList,(char*)(((PetscObject)st)->type_name?((PetscObject)st)->type_name:STSHIFT),type,256,&flg);CHKERRQ(ierr);
6 dsic.upv.es!jroman 138
    if (flg) {
139
      ierr = STSetType(st,type);CHKERRQ(ierr);
140
    }
141
    /*
142
      Set the type if it was never set.
143
    */
1422 slepc 144
    if (!((PetscObject)st)->type_name) {
106 dsic.upv.es!antodo 145
      ierr = STSetType(st,STSHIFT);CHKERRQ(ierr);
6 dsic.upv.es!jroman 146
    }
147
 
2074 jroman 148
    ierr = PetscOptionsScalar("-st_shift","Value of the shift","STSetShift",st->sigma,&s,&flg);CHKERRQ(ierr);
149
    if (flg) { ierr = STSetShift(st,s);CHKERRQ(ierr); }
6 dsic.upv.es!jroman 150
 
2331 jroman 151
    ierr = PetscOptionsEList("-st_matmode","Shift matrix mode","STSetMatMode",mode_list,3,mode_list[st->shift_matrix],&i,&flg);CHKERRQ(ierr);
356 dsic.upv.es!antodo 152
    if (flg) { st->shift_matrix = (STMatMode)i; }
344 dsic.upv.es!antodo 153
 
2331 jroman 154
    ierr = PetscOptionsEList("-st_matstructure","Shift nonzero pattern","STSetMatStructure",structure_list,3,structure_list[st->str],&i,&flg);CHKERRQ(ierr);
2446 jroman 155
    if (flg) {
156
      switch (i) {
157
        case 0: ierr = STSetMatStructure(st,SAME_NONZERO_PATTERN);CHKERRQ(ierr); break;
158
        case 1: ierr = STSetMatStructure(st,DIFFERENT_NONZERO_PATTERN);CHKERRQ(ierr); break;
159
        case 2: ierr = STSetMatStructure(st,SUBSET_NONZERO_PATTERN);CHKERRQ(ierr); break;
160
      }
161
    }
344 dsic.upv.es!antodo 162
 
6 dsic.upv.es!jroman 163
    if (st->ops->setfromoptions) {
164
      ierr = (*st->ops->setfromoptions)(st);CHKERRQ(ierr);
165
    }
2384 jroman 166
    ierr = PetscObjectProcessOptionsHandlers((PetscObject)st);CHKERRQ(ierr);
6 dsic.upv.es!jroman 167
  ierr = PetscOptionsEnd();CHKERRQ(ierr);
2005 eromero 168
  ierr = KSPSetFromOptions(st->ksp);CHKERRQ(ierr);
6 dsic.upv.es!jroman 169
  PetscFunctionReturn(0);
170
}
171
 
344 dsic.upv.es!antodo 172
#undef __FUNCT__  
173
#define __FUNCT__ "STSetMatStructure"
174
/*@
175
   STSetMatStructure - Sets an internal MatStructure attribute to
176
   indicate which is the relation of the sparsity pattern of the two matrices
2328 jroman 177
   A and B constituting the generalized eigenvalue problem.
344 dsic.upv.es!antodo 178
 
2328 jroman 179
   Logically Collective on ST
344 dsic.upv.es!antodo 180
 
181
   Input Parameters:
182
+  st  - the spectral transformation context
183
-  str - either SAME_NONZERO_PATTERN, DIFFERENT_NONZERO_PATTERN or
184
         SUBSET_NONZERO_PATTERN
185
 
186
   Options Database Key:
354 dsic.upv.es!jroman 187
.  -st_matstructure <str> - Indicates the structure flag, where <str> is one
188
         of 'same' (A and B have the same nonzero pattern), 'different' (A
2316 jroman 189
         and B have different nonzero pattern) or 'subset' (B's nonzero
190
         pattern is a subset of A's).
344 dsic.upv.es!antodo 191
 
2328 jroman 192
   Notes:
344 dsic.upv.es!antodo 193
   By default, the sparsity patterns are assumed to be different. If the
194
   patterns are equal or a subset then it is recommended to set this attribute
195
   for efficiency reasons (in particular, for internal MatAXPY() operations).
2328 jroman 196
 
197
   This function has no effect in the case of standard eigenproblems.
344 dsic.upv.es!antodo 198
 
199
   Level: advanced
200
 
201
.seealso: STSetOperators(), MatAXPY()
202
@*/
476 dsic.upv.es!antodo 203
PetscErrorCode STSetMatStructure(ST st,MatStructure str)
344 dsic.upv.es!antodo 204
{
205
  PetscFunctionBegin;
2213 jroman 206
  PetscValidHeaderSpecific(st,ST_CLASSID,1);
2326 jroman 207
  PetscValidLogicalCollectiveEnum(st,str,2);
1241 slepc 208
  switch (str) {
209
    case SAME_NONZERO_PATTERN:
210
    case DIFFERENT_NONZERO_PATTERN:
211
    case SUBSET_NONZERO_PATTERN:
212
      st->str = str;
213
      break;
214
    default:
2214 jroman 215
      SETERRQ(((PetscObject)st)->comm,PETSC_ERR_ARG_OUTOFRANGE,"Invalid matrix structure flag");
1241 slepc 216
  }
344 dsic.upv.es!antodo 217
  PetscFunctionReturn(0);
218
}
219
 
220
#undef __FUNCT__  
2107 eromero 221
#define __FUNCT__ "STGetMatStructure"
222
/*@
223
   STGetMatStructure - Gets the internal MatStructure attribute to
224
   indicate which is the relation of the sparsity pattern of the two matrices
2328 jroman 225
   A and B constituting the generalized eigenvalue problem.
2107 eromero 226
 
2328 jroman 227
   Not Collective
2107 eromero 228
 
229
   Input Parameters:
230
.  st  - the spectral transformation context
231
 
232
   Output Parameters:
233
.  str - either SAME_NONZERO_PATTERN, DIFFERENT_NONZERO_PATTERN or
234
         SUBSET_NONZERO_PATTERN
235
 
2328 jroman 236
   Note:
237
   This function has no effect in the case of standard eigenproblems.
238
 
2107 eromero 239
   Level: advanced
240
 
241
.seealso: STSetMatStructure(), STSetOperators(), MatAXPY()
242
@*/
243
PetscErrorCode STGetMatStructure(ST st,MatStructure *str)
244
{
245
  PetscFunctionBegin;
2213 jroman 246
  PetscValidHeaderSpecific(st,ST_CLASSID,1);
2107 eromero 247
  PetscValidPointer(str,2);
248
  *str = st->str;
249
  PetscFunctionReturn(0);
250
}
251
 
252
#undef __FUNCT__  
344 dsic.upv.es!antodo 253
#define __FUNCT__ "STSetMatMode"
254
/*@
255
   STSetMatMode - Sets a flag to indicate how the matrix is
256
   being shifted in the shift-and-invert and Cayley spectral transformations.
257
 
2328 jroman 258
   Logically Collective on ST
344 dsic.upv.es!antodo 259
 
260
   Input Parameters:
261
+  st - the spectral transformation context
1940 jroman 262
-  mode - the mode flag, one of ST_MATMODE_COPY,
263
          ST_MATMODE_INPLACE or ST_MATMODE_SHELL
344 dsic.upv.es!antodo 264
 
265
   Options Database Key:
354 dsic.upv.es!jroman 266
.  -st_matmode <mode> - Indicates the mode flag, where <mode> is one of
267
          'copy', 'inplace' or 'shell' (see explanation below).
344 dsic.upv.es!antodo 268
 
354 dsic.upv.es!jroman 269
   Notes:
1940 jroman 270
   By default (ST_MATMODE_COPY), a copy of matrix A is made and then
344 dsic.upv.es!antodo 271
   this copy is shifted explicitly, e.g. A <- (A - s B).
272
 
1940 jroman 273
   With ST_MATMODE_INPLACE, the original matrix A is shifted at
344 dsic.upv.es!antodo 274
   STSetUp() and unshifted at the end of the computations. With respect to
275
   the previous one, this mode avoids a copy of matrix A. However, a
276
   backdraw is that the recovered matrix might be slightly different
277
   from the original one (due to roundoff).
278
 
1940 jroman 279
   With ST_MATMODE_SHELL, the solver works with an implicit shell
344 dsic.upv.es!antodo 280
   matrix that represents the shifted matrix. This mode is the most efficient
281
   in creating the shifted matrix but it places serious limitations to the
282
   linear solves performed in each iteration of the eigensolver (typically,
283
   only interative solvers with Jacobi preconditioning can be used).
284
 
285
   In the case of generalized problems, in the two first modes the matrix
286
   A - s B has to be computed explicitly. The efficiency of this computation
354 dsic.upv.es!jroman 287
   can be controlled with STSetMatStructure().
344 dsic.upv.es!antodo 288
 
289
   Level: intermediate
290
 
1364 slepc 291
.seealso: STSetOperators(), STSetMatStructure(), STGetMatMode(), STMatMode
344 dsic.upv.es!antodo 292
@*/
476 dsic.upv.es!antodo 293
PetscErrorCode STSetMatMode(ST st,STMatMode mode)
344 dsic.upv.es!antodo 294
{
295
  PetscFunctionBegin;
2213 jroman 296
  PetscValidHeaderSpecific(st,ST_CLASSID,1);
2326 jroman 297
  PetscValidLogicalCollectiveEnum(st,mode,2);
344 dsic.upv.es!antodo 298
  st->shift_matrix = mode;
299
  PetscFunctionReturn(0);
300
}
301
 
382 dsic.upv.es!antodo 302
#undef __FUNCT__  
444 dsic.upv.es!antodo 303
#define __FUNCT__ "STGetMatMode"
707 dsic.upv.es!antodo 304
/*@C
547 dsic.upv.es!jroman 305
   STGetMatMode - Gets a flag that indicates how the matrix is being
306
   shifted in the shift-and-invert and Cayley spectral transformations.
307
 
2328 jroman 308
   Not Collective
547 dsic.upv.es!jroman 309
 
310
   Input Parameter:
311
.  st - the spectral transformation context
312
 
313
   Output Parameter:
314
.  mode - the mode flag
315
 
316
   Level: intermediate
317
 
1364 slepc 318
.seealso: STSetMatMode(), STMatMode
547 dsic.upv.es!jroman 319
@*/
476 dsic.upv.es!antodo 320
PetscErrorCode STGetMatMode(ST st,STMatMode *mode)
444 dsic.upv.es!antodo 321
{
322
  PetscFunctionBegin;
2213 jroman 323
  PetscValidHeaderSpecific(st,ST_CLASSID,1);
2319 jroman 324
  PetscValidPointer(mode,2);
444 dsic.upv.es!antodo 325
  *mode = st->shift_matrix;
326
  PetscFunctionReturn(0);
327
}
328