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
1499 slepc 1
/*
2
   Modification of the *temp* implementation of the BLOPEX multivector in order
3
   to wrap created PETSc vectors as multivectors.
4
 
5
   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1672 slepc 6
   SLEPc - Scalable Library for Eigenvalue Problem Computations
7
   Copyright (c) 2002-2009, Universidad Politecnica de Valencia, Spain
1499 slepc 8
 
1672 slepc 9
   This file is part of SLEPc.
10
 
11
   SLEPc is free software: you can redistribute it and/or modify it under  the
12
   terms of version 3 of the GNU Lesser General Public License as published by
13
   the Free Software Foundation.
14
 
15
   SLEPc  is  distributed in the hope that it will be useful, but WITHOUT  ANY
16
   WARRANTY;  without even the implied warranty of MERCHANTABILITY or  FITNESS
17
   FOR  A  PARTICULAR PURPOSE. See the GNU Lesser General Public  License  for
18
   more details.
19
 
20
   You  should have received a copy of the GNU Lesser General  Public  License
21
   along with SLEPc. If not, see <http://www.gnu.org/licenses/>.
1499 slepc 22
   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
23
*/
24
 
25
#include "petscsys.h"
26
#include "petscvec.h"
27
#include "petscmat.h"
28
#include <assert.h>
1524 slepc 29
#include <stdlib.h>
1499 slepc 30
#include "petscblaslapack.h"
31
#include "interpreter.h"
32
#include "temp_multivector.h"
33
#include "slepc-interface.h"
34
 
35
static void* mv_TempMultiVectorCreateFromPETScVector( void* ii_, int n, void* sample )
36
{
37
  int i;
38
  Vec *vecs = (Vec*)sample;
39
 
40
  mv_TempMultiVector* x;
41
  mv_InterfaceInterpreter* ii = (mv_InterfaceInterpreter*)ii_;
42
 
43
  x = (mv_TempMultiVector*) malloc(sizeof(mv_TempMultiVector));
44
  assert( x != NULL );
45
 
46
  x->interpreter = ii;
47
  x->numVectors = n;
48
 
49
  x->vector = (void**) calloc( n, sizeof(void*) );
50
  assert( x->vector != NULL );
51
 
52
  x->ownsVectors = 1;
53
  x->mask = NULL;
54
  x->ownsMask = 0;
55
 
56
  for ( i = 0; i < n; i++ ) {
57
    x->vector[i] = (void*)vecs[i];
58
  }
59
 
60
  return x;
61
}
62
 
63
static void mv_TempMultiPETSCVectorDestroy( void* x_ )
64
{
65
  mv_TempMultiVector* x = (mv_TempMultiVector*)x_;
66
 
67
  if ( x == NULL )
68
    return;
69
 
70
  if ( x->ownsVectors && x->vector != NULL ) {
71
       free(x->vector);
72
  }
73
  if ( x->mask && x->ownsMask )
74
    free(x->mask);
75
  free(x);
76
}
77
 
78
 
79
/*
80
    Create an InterfaceInterpreter using the PETSc implementation
81
    but with a modified CreateMultiVector that doesn't create any
82
    new vector.
83
*/
84
int SLEPCSetupInterpreter( mv_InterfaceInterpreter *i )
85
{
86
 
87
  i->CreateVector = PETSC_MimicVector;
88
  i->DestroyVector = PETSC_DestroyVector;
89
  i->InnerProd = PETSC_InnerProd;
90
  i->CopyVector = PETSC_CopyVector;
91
  i->ClearVector = PETSC_ClearVector;
92
  i->SetRandomValues = PETSC_SetRandomValues;
93
  i->ScaleVector = PETSC_ScaleVector;
94
  i->Axpy = PETSC_Axpy;
95
 
96
  /* Multivector part */
97
 
98
  i->CreateMultiVector = mv_TempMultiVectorCreateFromPETScVector;
99
  i->CopyCreateMultiVector = mv_TempMultiVectorCreateCopy;
100
  i->DestroyMultiVector = mv_TempMultiVectorDestroy;
101
 
102
  i->Width = mv_TempMultiVectorWidth;
103
  i->Height = mv_TempMultiVectorHeight;
104
  i->SetMask = mv_TempMultiVectorSetMask;
105
  i->CopyMultiVector = mv_TempMultiVectorCopy;
106
  i->ClearMultiVector = mv_TempMultiVectorClear;
107
  i->SetRandomVectors = mv_TempMultiVectorSetRandom;
108
  i->MultiInnerProd = mv_TempMultiVectorByMultiVector;
109
  i->MultiInnerProdDiag = mv_TempMultiVectorByMultiVectorDiag;
110
  i->MultiVecMat = mv_TempMultiVectorByMatrix;
111
  i->MultiVecMatDiag = mv_TempMultiVectorByDiagonal;
112
  i->MultiAxpy = mv_TempMultiVectorAxpy;
113
  i->MultiXapy = mv_TempMultiVectorXapy;
114
  i->Eval = mv_TempMultiVectorEval;
115
 
116
  return 0;
117
}
118
 
119
/*
120
    Change the multivector destructor in order to destroy the multivector
121
    structure without destroy the PETSc vectors.
122
*/
123
void SLEPCSetupInterpreterForDignifiedDeath( mv_InterfaceInterpreter *i )
124
{
125
  i->DestroyMultiVector = mv_TempMultiPETSCVectorDestroy;
126
}
127