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
1249 slepc 1
/*
2
     The basic SVD routines, Create, View, etc. are here.
1376 slepc 3
 
4
   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1672 slepc 5
   SLEPc - Scalable Library for Eigenvalue Problem Computations
2116 eromero 6
   Copyright (c) 2002-2010, Universidad 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
   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1249 slepc 22
*/
1376 slepc 23
 
1521 slepc 24
#include "private/svdimpl.h"      /*I "slepcsvd.h" I*/
1249 slepc 25
 
26
PetscFList SVDList = 0;
2213 jroman 27
PetscClassId SVD_CLASSID = 0;
1493 slepc 28
PetscLogEvent SVD_SetUp = 0, SVD_Solve = 0, SVD_Dense = 0;
1851 antodo 29
static PetscTruth SVDPackageInitialized = PETSC_FALSE;
1249 slepc 30
 
31
#undef __FUNCT__  
1851 antodo 32
#define __FUNCT__ "SVDFinalizePackage"
33
/*@C
1853 antodo 34
  SVDFinalizePackage - This function destroys everything in the Slepc interface to the SVD package. It is
35
  called from SlepcFinalize().
1851 antodo 36
 
37
  Level: developer
38
 
1853 antodo 39
.seealso: SlepcFinalize()
1851 antodo 40
@*/
41
PetscErrorCode SVDFinalizePackage(void)
42
{
43
  PetscFunctionBegin;
44
  SVDPackageInitialized = PETSC_FALSE;
45
  SVDList               = 0;
46
  PetscFunctionReturn(0);
47
}
48
 
49
#undef __FUNCT__  
1249 slepc 50
#define __FUNCT__ "SVDInitializePackage"
51
/*@C
52
  SVDInitializePackage - This function initializes everything in the SVD package. It is called
53
  from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to SVDCreate()
54
  when using static libraries.
55
 
56
  Input Parameter:
57
  path - The dynamic library path, or PETSC_NULL
58
 
59
  Level: developer
60
 
61
.seealso: SlepcInitialize()
62
@*/
2212 jroman 63
PetscErrorCode SVDInitializePackage(const char *path)
1249 slepc 64
{
65
  char              logList[256];
66
  char              *className;
67
  PetscTruth        opt;
68
  PetscErrorCode    ierr;
69
 
70
  PetscFunctionBegin;
1851 antodo 71
  if (SVDPackageInitialized) PetscFunctionReturn(0);
72
  SVDPackageInitialized = PETSC_TRUE;
1249 slepc 73
  /* Register Classes */
2213 jroman 74
  ierr = PetscClassIdRegister("Singular Value Solver",&SVD_CLASSID);CHKERRQ(ierr);
1249 slepc 75
  /* Register Constructors */
76
  ierr = SVDRegisterAll(path);CHKERRQ(ierr);
77
  /* Register Events */
2213 jroman 78
  ierr = PetscLogEventRegister("SVDSetUp",SVD_CLASSID,&SVD_SetUp);CHKERRQ(ierr);
79
  ierr = PetscLogEventRegister("SVDSolve",SVD_CLASSID,&SVD_Solve);CHKERRQ(ierr);
80
  ierr = PetscLogEventRegister("SVDDense",SVD_CLASSID,&SVD_Dense);CHKERRQ(ierr);
1249 slepc 81
  /* Process info exclusions */
2213 jroman 82
  ierr = PetscOptionsGetString(PETSC_NULL, "-info_exclude", logList, 256, &opt);CHKERRQ(ierr);
1249 slepc 83
  if (opt) {
84
    ierr = PetscStrstr(logList, "svd", &className);CHKERRQ(ierr);
85
    if (className) {
2213 jroman 86
      ierr = PetscInfoDeactivateClass(SVD_CLASSID);CHKERRQ(ierr);
1249 slepc 87
    }
88
  }
89
  /* Process summary exclusions */
90
  ierr = PetscOptionsGetString(PETSC_NULL, "-log_summary_exclude", logList, 256, &opt);CHKERRQ(ierr);
91
  if (opt) {
92
    ierr = PetscStrstr(logList, "svd", &className);CHKERRQ(ierr);
93
    if (className) {
2213 jroman 94
      ierr = PetscLogEventDeactivateClass(SVD_CLASSID);CHKERRQ(ierr);
1249 slepc 95
    }
96
  }
1851 antodo 97
  ierr = PetscRegisterFinalize(SVDFinalizePackage);CHKERRQ(ierr);
1249 slepc 98
  PetscFunctionReturn(0);
99
}
100
 
101
#undef __FUNCT__  
102
#define __FUNCT__ "SVDView"
103
/*@C
104
   SVDView - Prints the SVD data structure.
105
 
106
   Collective on SVD
107
 
108
   Input Parameters:
1260 slepc 109
+  svd - the singular value solver context
1249 slepc 110
-  viewer - optional visualization context
111
 
112
   Options Database Key:
113
.  -svd_view -  Calls SVDView() at end of SVDSolve()
114
 
115
   Note:
116
   The available visualization contexts include
117
+     PETSC_VIEWER_STDOUT_SELF - standard output (default)
118
-     PETSC_VIEWER_STDOUT_WORLD - synchronized standard
119
         output where only the first processor opens
120
         the file.  All other processors send their
121
         data to the first processor to print.
122
 
123
   The user can open an alternative visualization context with
124
   PetscViewerASCIIOpen() - output to a specified file.
125
 
126
   Level: beginner
127
 
128
.seealso: STView(), PetscViewerASCIIOpen()
129
@*/
130
PetscErrorCode SVDView(SVD svd,PetscViewer viewer)
131
{
132
  PetscErrorCode ierr;
1507 slepc 133
  const SVDType  type;
1249 slepc 134
  PetscTruth     isascii;
135
 
136
  PetscFunctionBegin;
2213 jroman 137
  PetscValidHeaderSpecific(svd,SVD_CLASSID,1);
1422 slepc 138
  if (!viewer) viewer = PETSC_VIEWER_STDOUT_(((PetscObject)svd)->comm);
2213 jroman 139
  PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2);
1249 slepc 140
  PetscCheckSameComm(svd,1,viewer,2);
141
 
142
  ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&isascii);CHKERRQ(ierr);
143
  if (isascii) {
144
    ierr = PetscViewerASCIIPrintf(viewer,"SVD Object:\n");CHKERRQ(ierr);
145
    ierr = SVDGetType(svd,&type);CHKERRQ(ierr);
146
    if (type) {
1257 slepc 147
      ierr = PetscViewerASCIIPrintf(viewer,"  method: %s\n",type);CHKERRQ(ierr);
1249 slepc 148
    } else {
149
      ierr = PetscViewerASCIIPrintf(viewer,"  method: not yet set\n");CHKERRQ(ierr);
150
    }
1268 slepc 151
    switch (svd->transmode) {
152
      case SVD_TRANSPOSE_EXPLICIT:
153
        ierr = PetscViewerASCIIPrintf(viewer,"  transpose mode: explicit\n");CHKERRQ(ierr);
154
        break;
1283 slepc 155
      case SVD_TRANSPOSE_IMPLICIT:
156
        ierr = PetscViewerASCIIPrintf(viewer,"  transpose mode: implicit\n");CHKERRQ(ierr);
1268 slepc 157
        break;
158
      default:
159
        ierr = PetscViewerASCIIPrintf(viewer,"  transpose mode: not yet set\n");CHKERRQ(ierr);
160
    }
1283 slepc 161
    if (svd->which == SVD_LARGEST) {
162
      ierr = PetscViewerASCIIPrintf(viewer,"  selected portion of the spectrum: largest\n");CHKERRQ(ierr);
163
    } else {
164
      ierr = PetscViewerASCIIPrintf(viewer,"  selected portion of the spectrum: smallest\n");CHKERRQ(ierr);
165
    }  
166
    ierr = PetscViewerASCIIPrintf(viewer,"  number of singular values (nsv): %d\n",svd->nsv);CHKERRQ(ierr);
167
    ierr = PetscViewerASCIIPrintf(viewer,"  number of column vectors (ncv): %d\n",svd->ncv);CHKERRQ(ierr);
1575 slepc 168
    ierr = PetscViewerASCIIPrintf(viewer,"  maximum dimension of projected problem (mpd): %d\n",svd->mpd);CHKERRQ(ierr);
1283 slepc 169
    ierr = PetscViewerASCIIPrintf(viewer,"  maximum number of iterations: %d\n",svd->max_it);
170
    ierr = PetscViewerASCIIPrintf(viewer,"  tolerance: %g\n",svd->tol);CHKERRQ(ierr);
1952 jroman 171
    if (svd->nini!=0) {
172
      ierr = PetscViewerASCIIPrintf(viewer,"  dimension of user-provided initial space: %d\n",PetscAbs(svd->nini));CHKERRQ(ierr);
173
    }
1249 slepc 174
    if (svd->ops->view) {
175
      ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
176
      ierr = (*svd->ops->view)(svd,viewer);CHKERRQ(ierr);
177
      ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
178
    }
1327 slepc 179
    ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
180
    ierr = IPView(svd->ip,viewer);CHKERRQ(ierr);
181
    ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
1249 slepc 182
  } else {
183
    if (svd->ops->view) {
184
      ierr = (*svd->ops->view)(svd,viewer);CHKERRQ(ierr);
185
    }
186
  }
187
  PetscFunctionReturn(0);
188
}
189
 
190
#undef __FUNCT__  
191
#define __FUNCT__ "SVDCreate"
192
/*@C
193
   SVDCreate - Creates the default SVD context.
194
 
195
   Collective on MPI_Comm
196
 
197
   Input Parameter:
198
.  comm - MPI communicator
199
 
200
   Output Parameter:
201
.  svd - location to put the SVD context
202
 
203
   Note:
1405 slepc 204
   The default SVD type is SVDCROSS
1249 slepc 205
 
206
   Level: beginner
207
 
208
.seealso: SVDSetUp(), SVDSolve(), SVDDestroy(), SVD
209
@*/
210
PetscErrorCode SVDCreate(MPI_Comm comm,SVD *outsvd)
211
{
212
  PetscErrorCode ierr;
213
  SVD            svd;
214
 
215
  PetscFunctionBegin;
216
  PetscValidPointer(outsvd,2);
217
 
2213 jroman 218
  ierr = PetscHeaderCreate(svd,_p_SVD,struct _SVDOps,SVD_CLASSID,-1,"SVD",comm,SVDDestroy,SVDView);CHKERRQ(ierr);
1249 slepc 219
  *outsvd = svd;
220
 
221
  ierr = PetscMemzero(svd->ops,sizeof(struct _SVDOps));CHKERRQ(ierr);
222
 
1314 slepc 223
  svd->OP          = PETSC_NULL;
1249 slepc 224
  svd->A           = PETSC_NULL;
1255 slepc 225
  svd->AT          = PETSC_NULL;
1327 slepc 226
  svd->transmode   = (SVDTransposeMode)PETSC_DECIDE;
1249 slepc 227
  svd->sigma       = PETSC_NULL;
1603 slepc 228
  svd->perm        = PETSC_NULL;
1251 slepc 229
  svd->U           = PETSC_NULL;
230
  svd->V           = PETSC_NULL;
1952 jroman 231
  svd->IS          = PETSC_NULL;
1272 slepc 232
  svd->which       = SVD_LARGEST;
1263 slepc 233
  svd->n           = 0;
1283 slepc 234
  svd->nconv       = 0;
1272 slepc 235
  svd->nsv         = 1;    
1594 slepc 236
  svd->ncv         = 0;    
237
  svd->mpd         = 0;    
1952 jroman 238
  svd->nini        = 0;
1283 slepc 239
  svd->its         = 0;
1594 slepc 240
  svd->max_it      = 0;  
1272 slepc 241
  svd->tol         = 1e-7;    
1288 slepc 242
  svd->errest      = PETSC_NULL;
1249 slepc 243
  svd->data        = PETSC_NULL;
244
  svd->setupcalled = 0;
1283 slepc 245
  svd->reason      = SVD_CONVERGED_ITERATING;
1288 slepc 246
  svd->numbermonitors = 0;
1305 slepc 247
  svd->matvecs = 0;
2054 eromero 248
  svd->trackall    = PETSC_FALSE;
1249 slepc 249
 
1302 slepc 250
  ierr = IPCreate(comm,&svd->ip);CHKERRQ(ierr);
1422 slepc 251
  ierr = IPSetOptionsPrefix(svd->ip,((PetscObject)svd)->prefix);
1316 slepc 252
  ierr = IPAppendOptionsPrefix(svd->ip,"svd_");
1302 slepc 253
  PetscLogObjectParent(svd,svd->ip);
254
 
1249 slepc 255
  ierr = PetscPublishAll(svd);CHKERRQ(ierr);
256
  PetscFunctionReturn(0);
257
}
258
 
259
#undef __FUNCT__  
260
#define __FUNCT__ "SVDDestroy"
261
/*@
262
   SVDDestroy - Destroys the SVD context.
263
 
264
   Collective on SVD
265
 
266
   Input Parameter:
1320 slepc 267
.  svd - singular value solver context obtained from SVDCreate()
1249 slepc 268
 
269
   Level: beginner
270
 
271
.seealso: SVDCreate(), SVDSetUp(), SVDSolve()
272
@*/
273
PetscErrorCode SVDDestroy(SVD svd)
274
{
275
  PetscErrorCode ierr;
1504 slepc 276
  PetscInt       i;
1605 slepc 277
  PetscScalar    *p;
1251 slepc 278
 
1249 slepc 279
  PetscFunctionBegin;
2213 jroman 280
  PetscValidHeaderSpecific(svd,SVD_CLASSID,1);
1422 slepc 281
  if (--((PetscObject)svd)->refct > 0) PetscFunctionReturn(0);
1249 slepc 282
 
283
  /* if memory was published with AMS then destroy it */
284
  ierr = PetscObjectDepublish(svd);CHKERRQ(ierr);
285
 
286
  if (svd->ops->destroy) {
287
    ierr = (*svd->ops->destroy)(svd); CHKERRQ(ierr);
288
  }
1251 slepc 289
 
1314 slepc 290
  if (svd->OP) { ierr = MatDestroy(svd->OP);CHKERRQ(ierr); }
1283 slepc 291
  if (svd->A) { ierr = MatDestroy(svd->A);CHKERRQ(ierr); }
292
  if (svd->AT) { ierr = MatDestroy(svd->AT);CHKERRQ(ierr); }
1263 slepc 293
  if (svd->n) {
294
    ierr = PetscFree(svd->sigma);CHKERRQ(ierr);
1603 slepc 295
    ierr = PetscFree(svd->perm);CHKERRQ(ierr);
1288 slepc 296
    ierr = PetscFree(svd->errest);CHKERRQ(ierr);
1314 slepc 297
    if (svd->U) {
1605 slepc 298
      ierr = VecGetArray(svd->U[0],&p);CHKERRQ(ierr);
1314 slepc 299
      for (i=0;i<svd->n;i++) {
300
        ierr = VecDestroy(svd->U[i]); CHKERRQ(ierr);
301
      }
1605 slepc 302
      ierr = PetscFree(p);CHKERRQ(ierr);
1314 slepc 303
      ierr = PetscFree(svd->U);CHKERRQ(ierr);
1251 slepc 304
    }
1605 slepc 305
    ierr = VecGetArray(svd->V[0],&p);CHKERRQ(ierr);
1263 slepc 306
    for (i=0;i<svd->n;i++) {
1251 slepc 307
      ierr = VecDestroy(svd->V[i]);CHKERRQ(ierr);
308
    }
1605 slepc 309
    ierr = PetscFree(p);CHKERRQ(ierr);
1251 slepc 310
    ierr = PetscFree(svd->V);CHKERRQ(ierr);
1249 slepc 311
  }
1331 slepc 312
  ierr = SVDMonitorCancel(svd);CHKERRQ(ierr);
1249 slepc 313
 
1302 slepc 314
  ierr = IPDestroy(svd->ip);CHKERRQ(ierr);
2130 jroman 315
  if (svd->rand) {
316
    ierr = PetscRandomDestroy(svd->rand);CHKERRQ(ierr);
317
  }
1302 slepc 318
 
1570 slepc 319
  ierr = PetscHeaderDestroy(svd);CHKERRQ(ierr);
1249 slepc 320
  PetscFunctionReturn(0);
321
}
322
 
323
#undef __FUNCT__  
1391 slepc 324
#define __FUNCT__ "SVDDestroy_Default"
325
PetscErrorCode SVDDestroy_Default(SVD svd)
326
{
327
  PetscErrorCode ierr;
328
 
329
  PetscFunctionBegin;
2213 jroman 330
  PetscValidHeaderSpecific(svd,SVD_CLASSID,1);
1391 slepc 331
  ierr = PetscFree(svd->data);CHKERRQ(ierr);
332
  PetscFunctionReturn(0);
333
}
334
 
335
#undef __FUNCT__  
1249 slepc 336
#define __FUNCT__ "SVDSetType"
337
/*@C
338
   SVDSetType - Selects the particular solver to be used in the SVD object.
339
 
340
   Collective on SVD
341
 
342
   Input Parameters:
1260 slepc 343
+  svd      - the singular value solver context
1249 slepc 344
-  type     - a known method
345
 
346
   Options Database Key:
347
.  -svd_type <method> - Sets the method; use -help for a list
348
    of available methods
349
 
350
   Notes:  
351
   See "slepc/include/slepcsvd.h" for available methods. The default
1404 slepc 352
   is SVDCROSS.
1249 slepc 353
 
354
   Normally, it is best to use the SVDSetFromOptions() command and
355
   then set the SVD type from the options database rather than by using
356
   this routine.  Using the options database provides the user with
357
   maximum flexibility in evaluating the different available methods.
358
   The SVDSetType() routine is provided for those situations where it
359
   is necessary to set the iterative solver independently of the command
360
   line or options database.
361
 
362
   Level: intermediate
363
 
364
.seealso: SVDType
365
@*/
1502 slepc 366
PetscErrorCode SVDSetType(SVD svd,const SVDType type)
1249 slepc 367
{
368
  PetscErrorCode ierr,(*r)(SVD);
369
  PetscTruth match;
370
 
371
  PetscFunctionBegin;
2213 jroman 372
  PetscValidHeaderSpecific(svd,SVD_CLASSID,1);
1249 slepc 373
  PetscValidCharPointer(type,2);
374
 
375
  ierr = PetscTypeCompare((PetscObject)svd,type,&match);CHKERRQ(ierr);
376
  if (match) PetscFunctionReturn(0);
377
 
378
  if (svd->data) {
379
    /* destroy the old private SVD context */
380
    ierr = (*svd->ops->destroy)(svd); CHKERRQ(ierr);
381
    svd->data = 0;
382
  }
383
 
1422 slepc 384
  ierr = PetscFListFind(SVDList,((PetscObject)svd)->comm,type,(void (**)(void)) &r);CHKERRQ(ierr);
1249 slepc 385
 
2214 jroman 386
  if (!r) SETERRQ1(((PetscObject)svd)->comm,1,"Unknown SVD type given: %s",type);
1249 slepc 387
 
388
  svd->setupcalled = 0;
389
  ierr = PetscMemzero(svd->ops,sizeof(struct _SVDOps));CHKERRQ(ierr);
390
  ierr = (*r)(svd); CHKERRQ(ierr);
391
 
392
  ierr = PetscObjectChangeTypeName((PetscObject)svd,type);CHKERRQ(ierr);
393
  PetscFunctionReturn(0);
394
}
395
 
396
#undef __FUNCT__  
397
#define __FUNCT__ "SVDGetType"
398
/*@C
399
   SVDGetType - Gets the SVD type as a string from the SVD object.
400
 
401
   Not Collective
402
 
403
   Input Parameter:
1260 slepc 404
.  svd - the singular value solver context
1249 slepc 405
 
406
   Output Parameter:
407
.  name - name of SVD method
408
 
409
   Level: intermediate
410
 
411
.seealso: SVDSetType()
412
@*/
1501 slepc 413
PetscErrorCode SVDGetType(SVD svd,const SVDType *type)
1249 slepc 414
{
415
  PetscFunctionBegin;
2213 jroman 416
  PetscValidHeaderSpecific(svd,SVD_CLASSID,1);
1501 slepc 417
  PetscValidPointer(type,2);
1422 slepc 418
  *type = ((PetscObject)svd)->type_name;
1249 slepc 419
  PetscFunctionReturn(0);
420
}
421
 
422
/*MC
1260 slepc 423
   SVDRegisterDynamic - Adds a method to the singular value solver package.
1249 slepc 424
 
425
   Synopsis:
1504 slepc 426
   SVDRegisterDynamic(char *name_solver,char *path,char *name_create,PetscErrorCode (*routine_create)(SVD))
1249 slepc 427
 
428
   Not Collective
429
 
430
   Input Parameters:
431
+  name_solver - name of a new user-defined solver
432
.  path - path (either absolute or relative) the library containing this solver
433
.  name_create - name of routine to create the solver context
434
-  routine_create - routine to create the solver context
435
 
436
   Notes:
437
   SVDRegisterDynamic() may be called multiple times to add several user-defined solvers.
438
 
439
   If dynamic libraries are used, then the fourth input argument (routine_create)
440
   is ignored.
441
 
442
   Sample usage:
443
.vb
444
   SVDRegisterDynamic("my_solver",/home/username/my_lib/lib/libO/solaris/mylib.a,
445
               "MySolverCreate",MySolverCreate);
446
.ve
447
 
448
   Then, your solver can be chosen with the procedural interface via
449
$     SVDSetType(svd,"my_solver")
450
   or at runtime via the option
451
$     -svd_type my_solver
452
 
453
   Level: advanced
454
 
455
   Environmental variables such as ${PETSC_ARCH}, ${SLEPC_DIR},
456
   and others of the form ${any_environmental_variable} occuring in pathname will be
457
   replaced with appropriate values.
458
 
1389 slepc 459
.seealso: SVDRegisterDestroy(), SVDRegisterAll()
1249 slepc 460
 
461
M*/
462
 
463
#undef __FUNCT__  
464
#define __FUNCT__ "SVDRegister"
1389 slepc 465
/*@C
466
  SVDRegister - See SVDRegisterDynamic()
467
 
468
  Level: advanced
469
@*/
1504 slepc 470
PetscErrorCode SVDRegister(const char *sname,const char *path,const char *name,PetscErrorCode (*function)(SVD))
1249 slepc 471
{
472
  PetscErrorCode ierr;
473
  char           fullname[256];
474
 
475
  PetscFunctionBegin;
476
  ierr = PetscFListConcat(path,name,fullname);CHKERRQ(ierr);
477
  ierr = PetscFListAdd(&SVDList,sname,fullname,(void (*)(void))function);CHKERRQ(ierr);
478
  PetscFunctionReturn(0);
479
}
1345 slepc 480
 
481
#undef __FUNCT__  
1389 slepc 482
#define __FUNCT__ "SVDRegisterDestroy"
483
/*@
484
   SVDRegisterDestroy - Frees the list of SVD methods that were
485
   registered by SVDRegisterDynamic().
486
 
487
   Not Collective
488
 
489
   Level: advanced
490
 
491
.seealso: SVDRegisterDynamic(), SVDRegisterAll()
492
@*/
493
PetscErrorCode SVDRegisterDestroy(void)
494
{
495
  PetscErrorCode ierr;
496
 
497
  PetscFunctionBegin;
498
  ierr = PetscFListDestroy(&SVDList);CHKERRQ(ierr);
499
  ierr = SVDRegisterAll(PETSC_NULL);CHKERRQ(ierr);
500
  PetscFunctionReturn(0);
501
}
502
 
503
#undef __FUNCT__  
1345 slepc 504
#define __FUNCT__ "SVDSetIP"
505
/*@
1349 slepc 506
   SVDSetIP - Associates an inner product object to the
1345 slepc 507
   singular value solver.
508
 
509
   Collective on SVD
510
 
511
   Input Parameters:
512
+  svd - singular value solver context obtained from SVDCreate()
513
-  ip  - the inner product object
514
 
515
   Note:
516
   Use SVDGetIP() to retrieve the inner product context (for example,
517
   to free it at the end of the computations).
518
 
519
   Level: advanced
520
 
521
.seealso: SVDGetIP()
522
@*/
523
PetscErrorCode SVDSetIP(SVD svd,IP ip)
524
{
525
  PetscErrorCode ierr;
526
 
527
  PetscFunctionBegin;
2213 jroman 528
  PetscValidHeaderSpecific(svd,SVD_CLASSID,1);
529
  PetscValidHeaderSpecific(ip,IP_CLASSID,2);
1345 slepc 530
  PetscCheckSameComm(svd,1,ip,2);
531
  ierr = PetscObjectReference((PetscObject)ip);CHKERRQ(ierr);
532
  ierr = IPDestroy(svd->ip); CHKERRQ(ierr);
533
  svd->ip = ip;
534
  PetscFunctionReturn(0);
535
}
536
 
537
#undef __FUNCT__  
538
#define __FUNCT__ "SVDGetIP"
539
/*@C
540
   SVDGetIP - Obtain the inner product object associated
541
   to the singular value solver object.
542
 
543
   Not Collective
544
 
545
   Input Parameters:
546
.  svd - singular value solver context obtained from SVDCreate()
547
 
548
   Output Parameter:
549
.  ip - inner product context
550
 
1349 slepc 551
   Level: advanced
1345 slepc 552
 
553
.seealso: SVDSetIP()
554
@*/
555
PetscErrorCode SVDGetIP(SVD svd,IP *ip)
556
{
557
  PetscFunctionBegin;
2213 jroman 558
  PetscValidHeaderSpecific(svd,SVD_CLASSID,1);
1345 slepc 559
  PetscValidPointer(ip,2);
560
  *ip = svd->ip;
561
  PetscFunctionReturn(0);
562
}