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
 
2284 jroman 24
#include <private/svdimpl.h>      /*I "slepcsvd.h" I*/
1249 slepc 25
 
2317 jroman 26
PetscFList       SVDList = 0;
27
PetscClassId     SVD_CLASSID = 0;
2331 jroman 28
PetscLogEvent    SVD_SetUp = 0,SVD_Solve = 0,SVD_Dense = 0;
2216 jroman 29
static PetscBool SVDPackageInitialized = PETSC_FALSE;
1249 slepc 30
 
31
#undef __FUNCT__  
1851 antodo 32
#define __FUNCT__ "SVDFinalizePackage"
33
/*@C
2317 jroman 34
   SVDFinalizePackage - This function destroys everything in the Slepc interface
35
   to the SVD package. It is called from SlepcFinalize().
1851 antodo 36
 
2317 jroman 37
   Level: developer
1851 antodo 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
2317 jroman 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.
1249 slepc 55
 
2317 jroman 56
   Input Parameter:
57
.  path - The dynamic library path, or PETSC_NULL
1249 slepc 58
 
2317 jroman 59
   Level: developer
1249 slepc 60
 
61
.seealso: SlepcInitialize()
62
@*/
2212 jroman 63
PetscErrorCode SVDInitializePackage(const char *path)
1249 slepc 64
{
2317 jroman 65
  char           logList[256];
66
  char           *className;
67
  PetscBool      opt;
68
  PetscErrorCode ierr;
1249 slepc 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 */
2331 jroman 82
  ierr = PetscOptionsGetString(PETSC_NULL,"-info_exclude",logList,256,&opt);CHKERRQ(ierr);
1249 slepc 83
  if (opt) {
2331 jroman 84
    ierr = PetscStrstr(logList,"svd",&className);CHKERRQ(ierr);
1249 slepc 85
    if (className) {
2213 jroman 86
      ierr = PetscInfoDeactivateClass(SVD_CLASSID);CHKERRQ(ierr);
1249 slepc 87
    }
88
  }
89
  /* Process summary exclusions */
2331 jroman 90
  ierr = PetscOptionsGetString(PETSC_NULL,"-log_summary_exclude",logList,256,&opt);CHKERRQ(ierr);
1249 slepc 91
  if (opt) {
2331 jroman 92
    ierr = PetscStrstr(logList,"svd",&className);CHKERRQ(ierr);
1249 slepc 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;
2216 jroman 133
  PetscBool      isascii;
1249 slepc 134
 
135
  PetscFunctionBegin;
2213 jroman 136
  PetscValidHeaderSpecific(svd,SVD_CLASSID,1);
1422 slepc 137
  if (!viewer) viewer = PETSC_VIEWER_STDOUT_(((PetscObject)svd)->comm);
2213 jroman 138
  PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2);
1249 slepc 139
  PetscCheckSameComm(svd,1,viewer,2);
140
 
2215 jroman 141
  ierr = PetscTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&isascii);CHKERRQ(ierr);
1249 slepc 142
  if (isascii) {
2224 jroman 143
    ierr = PetscObjectPrintClassNamePrefixType((PetscObject)svd,viewer,"SVD Object");CHKERRQ(ierr);
2367 jroman 144
    if (svd->ops->view) {
145
      ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
146
      ierr = (*svd->ops->view)(svd,viewer);CHKERRQ(ierr);
147
      ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
148
    }
1268 slepc 149
    switch (svd->transmode) {
150
      case SVD_TRANSPOSE_EXPLICIT:
151
        ierr = PetscViewerASCIIPrintf(viewer,"  transpose mode: explicit\n");CHKERRQ(ierr);
2316 jroman 152
        break;
1283 slepc 153
      case SVD_TRANSPOSE_IMPLICIT:
154
        ierr = PetscViewerASCIIPrintf(viewer,"  transpose mode: implicit\n");CHKERRQ(ierr);
2316 jroman 155
        break;
1268 slepc 156
      default:
157
        ierr = PetscViewerASCIIPrintf(viewer,"  transpose mode: not yet set\n");CHKERRQ(ierr);
158
    }
1283 slepc 159
    if (svd->which == SVD_LARGEST) {
160
      ierr = PetscViewerASCIIPrintf(viewer,"  selected portion of the spectrum: largest\n");CHKERRQ(ierr);
161
    } else {
162
      ierr = PetscViewerASCIIPrintf(viewer,"  selected portion of the spectrum: smallest\n");CHKERRQ(ierr);
163
    }  
164
    ierr = PetscViewerASCIIPrintf(viewer,"  number of singular values (nsv): %d\n",svd->nsv);CHKERRQ(ierr);
165
    ierr = PetscViewerASCIIPrintf(viewer,"  number of column vectors (ncv): %d\n",svd->ncv);CHKERRQ(ierr);
1575 slepc 166
    ierr = PetscViewerASCIIPrintf(viewer,"  maximum dimension of projected problem (mpd): %d\n",svd->mpd);CHKERRQ(ierr);
1283 slepc 167
    ierr = PetscViewerASCIIPrintf(viewer,"  maximum number of iterations: %d\n",svd->max_it);
168
    ierr = PetscViewerASCIIPrintf(viewer,"  tolerance: %g\n",svd->tol);CHKERRQ(ierr);
1952 jroman 169
    if (svd->nini!=0) {
170
      ierr = PetscViewerASCIIPrintf(viewer,"  dimension of user-provided initial space: %d\n",PetscAbs(svd->nini));CHKERRQ(ierr);
171
    }
1249 slepc 172
  } else {
173
    if (svd->ops->view) {
174
      ierr = (*svd->ops->view)(svd,viewer);CHKERRQ(ierr);
175
    }
176
  }
2367 jroman 177
  ierr = IPView(svd->ip,viewer);CHKERRQ(ierr);
1249 slepc 178
  PetscFunctionReturn(0);
179
}
180
 
181
#undef __FUNCT__  
182
#define __FUNCT__ "SVDCreate"
183
/*@C
184
   SVDCreate - Creates the default SVD context.
185
 
186
   Collective on MPI_Comm
187
 
188
   Input Parameter:
189
.  comm - MPI communicator
190
 
191
   Output Parameter:
192
.  svd - location to put the SVD context
193
 
194
   Note:
1405 slepc 195
   The default SVD type is SVDCROSS
1249 slepc 196
 
197
   Level: beginner
198
 
199
.seealso: SVDSetUp(), SVDSolve(), SVDDestroy(), SVD
200
@*/
201
PetscErrorCode SVDCreate(MPI_Comm comm,SVD *outsvd)
202
{
203
  PetscErrorCode ierr;
204
  SVD            svd;
205
 
206
  PetscFunctionBegin;
207
  PetscValidPointer(outsvd,2);
2350 jroman 208
  *outsvd = 0;
2213 jroman 209
  ierr = PetscHeaderCreate(svd,_p_SVD,struct _SVDOps,SVD_CLASSID,-1,"SVD",comm,SVDDestroy,SVDView);CHKERRQ(ierr);
1249 slepc 210
 
2350 jroman 211
  svd->OP             = PETSC_NULL;
212
  svd->A              = PETSC_NULL;
213
  svd->AT             = PETSC_NULL;
214
  svd->transmode      = (SVDTransposeMode)PETSC_DECIDE;
215
  svd->sigma          = PETSC_NULL;
216
  svd->perm           = PETSC_NULL;
217
  svd->U              = PETSC_NULL;
218
  svd->V              = PETSC_NULL;
219
  svd->IS             = PETSC_NULL;
220
  svd->rand           = PETSC_NULL;
221
  svd->which          = SVD_LARGEST;
222
  svd->n              = 0;
223
  svd->nconv          = 0;
224
  svd->nsv            = 1;    
225
  svd->ncv            = 0;    
226
  svd->mpd            = 0;    
227
  svd->nini           = 0;
228
  svd->its            = 0;
229
  svd->max_it         = 0;  
230
  svd->tol            = 1e-7;    
231
  svd->errest         = PETSC_NULL;
232
  svd->data           = PETSC_NULL;
233
  svd->setupcalled    = 0;
234
  svd->reason         = SVD_CONVERGED_ITERATING;
1288 slepc 235
  svd->numbermonitors = 0;
2350 jroman 236
  svd->matvecs        = 0;
237
  svd->trackall       = PETSC_FALSE;
1249 slepc 238
 
2350 jroman 239
  ierr = PetscRandomCreate(comm,&svd->rand);CHKERRQ(ierr);
240
  ierr = PetscLogObjectParent(svd,svd->rand);CHKERRQ(ierr);
1302 slepc 241
  ierr = IPCreate(comm,&svd->ip);CHKERRQ(ierr);
2327 jroman 242
  ierr = PetscLogObjectParent(svd,svd->ip);CHKERRQ(ierr);
2350 jroman 243
  *outsvd = svd;
1249 slepc 244
  PetscFunctionReturn(0);
245
}
246
 
247
#undef __FUNCT__  
2350 jroman 248
#define __FUNCT__ "SVDReset"
249
/*@
250
   SVDReset - Resets the SVD context to the setupcalled=0 state and removes any
251
   allocated objects.
252
 
253
   Collective on SVD
254
 
255
   Input Parameter:
256
.  svd - singular value solver context obtained from SVDCreate()
257
 
258
   Level: advanced
259
 
260
.seealso: SVDDestroy()
261
@*/
262
PetscErrorCode SVDReset(SVD svd)
263
{
264
  PetscErrorCode ierr;
265
 
266
  PetscFunctionBegin;
267
  PetscValidHeaderSpecific(svd,SVD_CLASSID,1);
268
  if (svd->ops->reset) { ierr = (svd->ops->reset)(svd);CHKERRQ(ierr); }
269
  if (svd->ip) { ierr = IPReset(svd->ip);CHKERRQ(ierr); }
270
  ierr = MatDestroy(&svd->OP);CHKERRQ(ierr);
271
  ierr = MatDestroy(&svd->A);CHKERRQ(ierr);
272
  ierr = MatDestroy(&svd->AT);CHKERRQ(ierr);
273
  if (svd->n) {
274
    ierr = PetscFree(svd->sigma);CHKERRQ(ierr);
275
    ierr = PetscFree(svd->perm);CHKERRQ(ierr);
276
    ierr = PetscFree(svd->errest);CHKERRQ(ierr);
277
    ierr = SlepcVecDestroyVecs(svd->n,&svd->U);CHKERRQ(ierr);
278
    ierr = SlepcVecDestroyVecs(svd->n,&svd->V);CHKERRQ(ierr);
279
  }
280
  svd->transmode   = PETSC_DECIDE;
281
  svd->matvecs     = 0;
282
  svd->setupcalled = 0;
283
  PetscFunctionReturn(0);
284
}
285
 
286
#undef __FUNCT__  
1249 slepc 287
#define __FUNCT__ "SVDDestroy"
2312 jroman 288
/*@C
1249 slepc 289
   SVDDestroy - Destroys the SVD context.
290
 
291
   Collective on SVD
292
 
293
   Input Parameter:
1320 slepc 294
.  svd - singular value solver context obtained from SVDCreate()
1249 slepc 295
 
296
   Level: beginner
297
 
298
.seealso: SVDCreate(), SVDSetUp(), SVDSolve()
299
@*/
2312 jroman 300
PetscErrorCode SVDDestroy(SVD *svd)
1249 slepc 301
{
302
  PetscErrorCode ierr;
1251 slepc 303
 
1249 slepc 304
  PetscFunctionBegin;
2312 jroman 305
  if (!*svd) PetscFunctionReturn(0);
306
  PetscValidHeaderSpecific(*svd,SVD_CLASSID,1);
307
  if (--((PetscObject)(*svd))->refct > 0) { *svd = 0; PetscFunctionReturn(0); }
2350 jroman 308
  ierr = SVDReset(*svd);CHKERRQ(ierr);
2312 jroman 309
  ierr = PetscObjectDepublish(*svd);CHKERRQ(ierr);
2350 jroman 310
  if ((*svd)->ops->destroy) { ierr = (*(*svd)->ops->destroy)(*svd);CHKERRQ(ierr); }
2312 jroman 311
  ierr = IPDestroy(&(*svd)->ip);CHKERRQ(ierr);
312
  ierr = PetscRandomDestroy(&(*svd)->rand);CHKERRQ(ierr);
2350 jroman 313
  ierr = SVDMonitorCancel(*svd);CHKERRQ(ierr);
2312 jroman 314
  ierr = PetscHeaderDestroy(svd);CHKERRQ(ierr);
1249 slepc 315
  PetscFunctionReturn(0);
316
}
317
 
318
#undef __FUNCT__  
319
#define __FUNCT__ "SVDSetType"
320
/*@C
321
   SVDSetType - Selects the particular solver to be used in the SVD object.
322
 
2328 jroman 323
   Logically Collective on SVD
1249 slepc 324
 
325
   Input Parameters:
1260 slepc 326
+  svd      - the singular value solver context
1249 slepc 327
-  type     - a known method
328
 
329
   Options Database Key:
330
.  -svd_type <method> - Sets the method; use -help for a list
331
    of available methods
332
 
333
   Notes:  
334
   See "slepc/include/slepcsvd.h" for available methods. The default
1404 slepc 335
   is SVDCROSS.
1249 slepc 336
 
337
   Normally, it is best to use the SVDSetFromOptions() command and
338
   then set the SVD type from the options database rather than by using
339
   this routine.  Using the options database provides the user with
340
   maximum flexibility in evaluating the different available methods.
341
   The SVDSetType() routine is provided for those situations where it
342
   is necessary to set the iterative solver independently of the command
343
   line or options database.
344
 
345
   Level: intermediate
346
 
347
.seealso: SVDType
348
@*/
1502 slepc 349
PetscErrorCode SVDSetType(SVD svd,const SVDType type)
1249 slepc 350
{
351
  PetscErrorCode ierr,(*r)(SVD);
2216 jroman 352
  PetscBool      match;
1249 slepc 353
 
354
  PetscFunctionBegin;
2213 jroman 355
  PetscValidHeaderSpecific(svd,SVD_CLASSID,1);
1249 slepc 356
  PetscValidCharPointer(type,2);
357
 
358
  ierr = PetscTypeCompare((PetscObject)svd,type,&match);CHKERRQ(ierr);
359
  if (match) PetscFunctionReturn(0);
360
 
2300 jroman 361
  ierr = PetscFListFind(SVDList,((PetscObject)svd)->comm,type,PETSC_TRUE,(void (**)(void)) &r);CHKERRQ(ierr);
2350 jroman 362
  if (!r) SETERRQ1(((PetscObject)svd)->comm,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown SVD type given: %s",type);
1249 slepc 363
 
2350 jroman 364
  if (svd->ops->destroy) { ierr = (*svd->ops->destroy)(svd);CHKERRQ(ierr); }
365
  ierr = PetscMemzero(svd->ops,sizeof(struct _SVDOps));CHKERRQ(ierr);
1249 slepc 366
 
367
  svd->setupcalled = 0;
2350 jroman 368
  ierr = PetscObjectChangeTypeName((PetscObject)svd,type);CHKERRQ(ierr);
2330 jroman 369
  ierr = (*r)(svd);CHKERRQ(ierr);
1249 slepc 370
  PetscFunctionReturn(0);
371
}
372
 
373
#undef __FUNCT__  
374
#define __FUNCT__ "SVDGetType"
375
/*@C
376
   SVDGetType - Gets the SVD type as a string from the SVD object.
377
 
378
   Not Collective
379
 
380
   Input Parameter:
1260 slepc 381
.  svd - the singular value solver context
1249 slepc 382
 
383
   Output Parameter:
384
.  name - name of SVD method
385
 
386
   Level: intermediate
387
 
388
.seealso: SVDSetType()
389
@*/
1501 slepc 390
PetscErrorCode SVDGetType(SVD svd,const SVDType *type)
1249 slepc 391
{
392
  PetscFunctionBegin;
2213 jroman 393
  PetscValidHeaderSpecific(svd,SVD_CLASSID,1);
1501 slepc 394
  PetscValidPointer(type,2);
1422 slepc 395
  *type = ((PetscObject)svd)->type_name;
1249 slepc 396
  PetscFunctionReturn(0);
397
}
398
 
399
/*MC
1260 slepc 400
   SVDRegisterDynamic - Adds a method to the singular value solver package.
1249 slepc 401
 
402
   Synopsis:
1504 slepc 403
   SVDRegisterDynamic(char *name_solver,char *path,char *name_create,PetscErrorCode (*routine_create)(SVD))
1249 slepc 404
 
405
   Not Collective
406
 
407
   Input Parameters:
408
+  name_solver - name of a new user-defined solver
409
.  path - path (either absolute or relative) the library containing this solver
410
.  name_create - name of routine to create the solver context
411
-  routine_create - routine to create the solver context
412
 
413
   Notes:
414
   SVDRegisterDynamic() may be called multiple times to add several user-defined solvers.
415
 
416
   If dynamic libraries are used, then the fourth input argument (routine_create)
417
   is ignored.
418
 
419
   Sample usage:
420
.vb
421
   SVDRegisterDynamic("my_solver",/home/username/my_lib/lib/libO/solaris/mylib.a,
422
               "MySolverCreate",MySolverCreate);
423
.ve
424
 
425
   Then, your solver can be chosen with the procedural interface via
426
$     SVDSetType(svd,"my_solver")
427
   or at runtime via the option
428
$     -svd_type my_solver
429
 
430
   Level: advanced
431
 
432
   Environmental variables such as ${PETSC_ARCH}, ${SLEPC_DIR},
433
   and others of the form ${any_environmental_variable} occuring in pathname will be
434
   replaced with appropriate values.
435
 
1389 slepc 436
.seealso: SVDRegisterDestroy(), SVDRegisterAll()
1249 slepc 437
 
438
M*/
439
 
440
#undef __FUNCT__  
441
#define __FUNCT__ "SVDRegister"
1389 slepc 442
/*@C
2317 jroman 443
   SVDRegister - See SVDRegisterDynamic()
1389 slepc 444
 
2317 jroman 445
   Level: advanced
1389 slepc 446
@*/
1504 slepc 447
PetscErrorCode SVDRegister(const char *sname,const char *path,const char *name,PetscErrorCode (*function)(SVD))
1249 slepc 448
{
449
  PetscErrorCode ierr;
2374 jroman 450
  char           fullname[PETSC_MAX_PATH_LEN];
1249 slepc 451
 
452
  PetscFunctionBegin;
453
  ierr = PetscFListConcat(path,name,fullname);CHKERRQ(ierr);
454
  ierr = PetscFListAdd(&SVDList,sname,fullname,(void (*)(void))function);CHKERRQ(ierr);
455
  PetscFunctionReturn(0);
456
}
1345 slepc 457
 
458
#undef __FUNCT__  
1389 slepc 459
#define __FUNCT__ "SVDRegisterDestroy"
460
/*@
461
   SVDRegisterDestroy - Frees the list of SVD methods that were
462
   registered by SVDRegisterDynamic().
463
 
464
   Not Collective
465
 
466
   Level: advanced
467
 
468
.seealso: SVDRegisterDynamic(), SVDRegisterAll()
469
@*/
470
PetscErrorCode SVDRegisterDestroy(void)
471
{
472
  PetscErrorCode ierr;
473
 
474
  PetscFunctionBegin;
475
  ierr = PetscFListDestroy(&SVDList);CHKERRQ(ierr);
476
  ierr = SVDRegisterAll(PETSC_NULL);CHKERRQ(ierr);
477
  PetscFunctionReturn(0);
478
}
479
 
480
#undef __FUNCT__  
1345 slepc 481
#define __FUNCT__ "SVDSetIP"
482
/*@
1349 slepc 483
   SVDSetIP - Associates an inner product object to the
1345 slepc 484
   singular value solver.
485
 
486
   Collective on SVD
487
 
488
   Input Parameters:
489
+  svd - singular value solver context obtained from SVDCreate()
490
-  ip  - the inner product object
491
 
492
   Note:
493
   Use SVDGetIP() to retrieve the inner product context (for example,
494
   to free it at the end of the computations).
495
 
496
   Level: advanced
497
 
498
.seealso: SVDGetIP()
499
@*/
500
PetscErrorCode SVDSetIP(SVD svd,IP ip)
501
{
502
  PetscErrorCode ierr;
503
 
504
  PetscFunctionBegin;
2213 jroman 505
  PetscValidHeaderSpecific(svd,SVD_CLASSID,1);
506
  PetscValidHeaderSpecific(ip,IP_CLASSID,2);
1345 slepc 507
  PetscCheckSameComm(svd,1,ip,2);
508
  ierr = PetscObjectReference((PetscObject)ip);CHKERRQ(ierr);
2317 jroman 509
  ierr = IPDestroy(&svd->ip);CHKERRQ(ierr);
1345 slepc 510
  svd->ip = ip;
2327 jroman 511
  ierr = PetscLogObjectParent(svd,svd->ip);CHKERRQ(ierr);
1345 slepc 512
  PetscFunctionReturn(0);
513
}
514
 
515
#undef __FUNCT__  
516
#define __FUNCT__ "SVDGetIP"
517
/*@C
518
   SVDGetIP - Obtain the inner product object associated
519
   to the singular value solver object.
520
 
521
   Not Collective
522
 
523
   Input Parameters:
524
.  svd - singular value solver context obtained from SVDCreate()
525
 
526
   Output Parameter:
527
.  ip - inner product context
528
 
1349 slepc 529
   Level: advanced
1345 slepc 530
 
531
.seealso: SVDSetIP()
532
@*/
533
PetscErrorCode SVDGetIP(SVD svd,IP *ip)
534
{
535
  PetscFunctionBegin;
2213 jroman 536
  PetscValidHeaderSpecific(svd,SVD_CLASSID,1);
1345 slepc 537
  PetscValidPointer(ip,2);
538
  *ip = svd->ip;
539
  PetscFunctionReturn(0);
540
}