Subversion Repositories slepc-dev

Rev

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

Rev Author Line No. Line
1263 slepc 1
/*                      
2
       This file implements a wrapper to the LAPACK SVD subroutines.
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
   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1263 slepc 22
*/
1376 slepc 23
 
2284 jroman 24
#include <private/svdimpl.h>      /*I "slepcsvd.h" I*/
25
#include <slepcblaslapack.h>
1263 slepc 26
 
27
#undef __FUNCT__  
1591 slepc 28
#define __FUNCT__ "SVDSetUp_LAPACK"
29
PetscErrorCode SVDSetUp_LAPACK(SVD svd)
1263 slepc 30
{
2317 jroman 31
  PetscErrorCode ierr;
2410 jroman 32
  PetscInt       N;
1263 slepc 33
 
34
  PetscFunctionBegin;
1314 slepc 35
  ierr = SVDMatGetSize(svd,PETSC_NULL,&N);CHKERRQ(ierr);
36
  svd->ncv = N;
1591 slepc 37
  if (svd->mpd) PetscInfo(svd,"Warning: parameter mpd ignored\n");
1272 slepc 38
  svd->max_it = 1;
1314 slepc 39
  if (svd->ncv!=svd->n) {  
2410 jroman 40
    ierr = VecDuplicateVecs(svd->tl,svd->ncv,&svd->U);CHKERRQ(ierr);
1314 slepc 41
  }
1263 slepc 42
  PetscFunctionReturn(0);
43
}
44
 
45
#undef __FUNCT__  
46
#define __FUNCT__ "SVDSolve_LAPACK"
47
PetscErrorCode SVDSolve_LAPACK(SVD svd)
48
{
2317 jroman 49
  PetscErrorCode ierr;
50
  PetscInt       M,N,n,i,j,k;
51
  Mat            mat;
52
  PetscScalar    *pU,*pVT,*pmat,*pu,*pv;
53
  PetscReal      *sigma;
1263 slepc 54
 
55
  PetscFunctionBegin;
1318 slepc 56
  ierr = MatConvert(svd->OP,MATSEQDENSE,MAT_INITIAL_MATRIX,&mat);CHKERRQ(ierr);
57
  ierr = MatGetArray(mat,&pmat);CHKERRQ(ierr);
58
  ierr = MatGetSize(mat,&M,&N);CHKERRQ(ierr);
59
  if (M>=N) {
60
     n = N;
61
     pU = PETSC_NULL;
62
     ierr = PetscMalloc(sizeof(PetscScalar)*N*N,&pVT);CHKERRQ(ierr);
1263 slepc 63
  } else {
1318 slepc 64
     n = M;
65
     ierr = PetscMalloc(sizeof(PetscScalar)*M*M,&pU);CHKERRQ(ierr);
66
     pVT = PETSC_NULL;
1263 slepc 67
  }
1318 slepc 68
  ierr = PetscMalloc(sizeof(PetscReal)*n,&sigma);CHKERRQ(ierr);
1263 slepc 69
 
1298 slepc 70
  ierr = SVDDense(M,N,pmat,sigma,pU,pVT);CHKERRQ(ierr);
71
 
1263 slepc 72
  /* copy singular vectors */
1318 slepc 73
  for (i=0;i<n;i++) {
74
    if (svd->which == SVD_SMALLEST) k = n - i - 1;
1289 slepc 75
    else k = i;
76
    svd->sigma[k] = sigma[i];
77
    ierr = VecGetArray(svd->U[k],&pu);CHKERRQ(ierr);
78
    ierr = VecGetArray(svd->V[k],&pv);CHKERRQ(ierr);
1318 slepc 79
    if (M>=N) {
80
      for (j=0;j<M;j++) pu[j] = pmat[i*M+j];
81
      for (j=0;j<N;j++) pv[j] = pVT[j*N+i];
82
    } else {
83
      for (j=0;j<N;j++) pu[j] = pmat[j*M+i];
84
      for (j=0;j<M;j++) pv[j] = pU[i*M+j];
85
    }
1289 slepc 86
    ierr = VecRestoreArray(svd->U[k],&pu);CHKERRQ(ierr);
87
    ierr = VecRestoreArray(svd->V[k],&pv);CHKERRQ(ierr);
1263 slepc 88
  }
89
 
1318 slepc 90
  svd->nconv = n;
1283 slepc 91
  svd->reason = SVD_CONVERGED_TOL;
92
 
1263 slepc 93
  ierr = MatRestoreArray(mat,&pmat);CHKERRQ(ierr);
2305 jroman 94
  ierr = MatDestroy(&mat);CHKERRQ(ierr);
1289 slepc 95
  ierr = PetscFree(sigma);CHKERRQ(ierr);
1318 slepc 96
  if (M>=N) {
97
     ierr = PetscFree(pVT);CHKERRQ(ierr);
98
  } else {
99
     ierr = PetscFree(pU);CHKERRQ(ierr);
100
  }
1263 slepc 101
  PetscFunctionReturn(0);
102
}
103
 
2350 jroman 104
#undef __FUNCT__  
105
#define __FUNCT__ "SVDReset_LAPACK"
106
PetscErrorCode SVDReset_LAPACK(SVD svd)
107
{
108
  PetscErrorCode ierr;
109
 
110
  PetscFunctionBegin;
2410 jroman 111
  ierr = VecDestroyVecs(svd->n,&svd->U);CHKERRQ(ierr);
2350 jroman 112
  PetscFunctionReturn(0);
113
}
114
 
115
#undef __FUNCT__  
116
#define __FUNCT__ "SVDDestroy_LAPACK"
117
PetscErrorCode SVDDestroy_LAPACK(SVD svd)
118
{
119
  PetscErrorCode ierr;
120
 
121
  PetscFunctionBegin;
122
  ierr = PetscFree(svd->data);CHKERRQ(ierr);
123
  PetscFunctionReturn(0);
124
}
125
 
1263 slepc 126
EXTERN_C_BEGIN
127
#undef __FUNCT__  
128
#define __FUNCT__ "SVDCreate_LAPACK"
129
PetscErrorCode SVDCreate_LAPACK(SVD svd)
130
{
131
  PetscFunctionBegin;
1591 slepc 132
  svd->ops->setup   = SVDSetUp_LAPACK;
1391 slepc 133
  svd->ops->solve   = SVDSolve_LAPACK;
2350 jroman 134
  svd->ops->destroy = SVDDestroy_LAPACK;
135
  svd->ops->reset   = SVDReset_LAPACK;
1283 slepc 136
  if (svd->transmode == PETSC_DECIDE)
137
    svd->transmode = SVD_TRANSPOSE_IMPLICIT; /* don't build the transpose */
1263 slepc 138
  PetscFunctionReturn(0);
139
}
140
EXTERN_C_END