Memosa-FVM  0.2
DirectSolver Class Reference

#include <DirectSolver.h>

Inheritance diagram for DirectSolver:
Collaboration diagram for DirectSolver:

Public Member Functions

 DirectSolver ()
 
virtual ~DirectSolver ()
 
virtual void cleanup ()
 
virtual MFRPtr solve (LinearSystem &ls)
 
virtual void smooth (LinearSystem &ls)
 
- Public Member Functions inherited from LinearSolver
 LinearSolver ()
 

Private Member Functions

 DirectSolver (const DirectSolver &)
 

Additional Inherited Members

- Public Attributes inherited from LinearSolver
int nMaxIterations
 
int verbosity
 
double relativeTolerance
 
double absoluteTolerance
 

Detailed Description

Solve a linear system using UMFPack

Definition at line 22 of file DirectSolver.h.

Constructor & Destructor Documentation

DirectSolver::DirectSolver ( )

Definition at line 11 of file DirectSolver.cpp.

12 {}
DirectSolver::~DirectSolver ( )
virtual

Definition at line 14 of file DirectSolver.cpp.

15 {}
DirectSolver::DirectSolver ( const DirectSolver )
private

Member Function Documentation

void DirectSolver::cleanup ( )
virtual

Implements LinearSolver.

Definition at line 18 of file DirectSolver.cpp.

19 {}
void DirectSolver::smooth ( LinearSystem ls)
virtual

Implements LinearSolver.

Definition at line 108 of file DirectSolver.cpp.

109 {
110  throw CException("cannot use DirectSolver as preconditioner");
111 }
MFRPtr DirectSolver::solve ( LinearSystem ls)
virtual

Implements LinearSolver.

Definition at line 23 of file DirectSolver.cpp.

References MultiFieldMatrix::computeResidual(), MultiField::getArrayIndex(), LinearSystem::getB(), Matrix::getConnectivity(), ArrayBase::getData(), Array< T >::getData(), ArrayBase::getDataSize(), LinearSystem::getDelta(), MultiField::getLength(), ArrayBase::getLength(), LinearSystem::getMatrix(), MultiFieldMatrix::getMatrix(), CRConnectivity::getMultiTranspose(), MultiField::getOneNorm(), LinearSystem::getResidual(), Matrix::setFlatMatrix(), and LinearSolver::verbosity.

24 {
25 
26  typedef CRMatrix<double,double,double> FlatMatrix;
27 
28  const MultiFieldMatrix& mfMatrix = ls.getMatrix();
29  const MultiField& bField = ls.getB();
30  MultiField& deltaField = ls.getDelta();
31 
32  if (bField.getLength() != 1)
33  throw CException("direct solver only works for single matrix");
34 
35  const MultiField::ArrayIndex rowIndex = bField.getArrayIndex(0);
36 
37  const Matrix& origMatrix = mfMatrix.getMatrix(rowIndex,rowIndex);
38  const CRConnectivity& origConn = origMatrix.getConnectivity();
39 
40  const ArrayBase& origB = bField[rowIndex];
41  const int blockSize = origB.getDataSize()/(sizeof(double)*origB.getLength());
42 
43  shared_ptr<CRConnectivity> flatConnPtr = origConn.getMultiTranspose(blockSize);
44 
45  FlatMatrix flatMatrix(*flatConnPtr);
46 
47  origMatrix.setFlatMatrix(flatMatrix);
48 
49  Array<double>& flatCoeffs = flatMatrix.getOffDiag();
50  const Array<int>& flatRow = flatConnPtr->getRow();
51  const Array<int>& flatCol = flatConnPtr->getCol();
52  const ArrayBase& flatB = origB;
53 
54  ArrayBase& flatDelta = deltaField[rowIndex];
55 
56  const int nFlatEqs = flatConnPtr->getRowDim();
57 
58  // original system is in delta form
59 
60  mfMatrix.computeResidual(deltaField,bField,ls.getResidual());
61 
62  MFRPtr rNorm0(ls.getResidual().getOneNorm());
63 
64  if (verbosity >0)
65  cout << 0 << ": " << *rNorm0 << endl;
66 
67 
68  double *null = (double *) NULL ;
69 
70  void *Symbolic, *Numeric ;
71  (void) umfpack_di_symbolic (nFlatEqs, nFlatEqs,
72  (int*)flatRow.getData(),
73  (int*)flatCol.getData(),
74  (double*) flatCoeffs.getData(),
75  &Symbolic, null, null) ;
76  (void) umfpack_di_numeric ( (int*)flatRow.getData(),
77  (int*)flatCol.getData(),
78  (double*) flatCoeffs.getData(),
79 
80  Symbolic, &Numeric, null, null) ;
81  umfpack_di_free_symbolic (&Symbolic) ;
82  (void) umfpack_di_solve (UMFPACK_A,
83  (int*)flatRow.getData(),
84  (int*)flatCol.getData(),
85  (double*) flatCoeffs.getData(),
86  (double*) flatDelta.getData(),
87  (double*) flatB.getData(),
88  Numeric, null, null) ;
89  umfpack_di_free_numeric (&Numeric) ;
90 
91  // umfpack solves ax=b, we want ax+b=0;
92  double *flatDeltaData = (double*) flatDelta.getData();
93  for(int n=0; n<nFlatEqs; n++)
94  flatDeltaData[n] *= -1.0;
95 
96  mfMatrix.computeResidual(deltaField,bField,ls.getResidual());
97 
98  MFRPtr rNormN(ls.getResidual().getOneNorm());
99 
100  if (verbosity >0)
101  cout << "Final : " << *rNormN << endl;
102 
103 
104  return rNorm0;
105 }
shared_ptr< CRConnectivity > getMultiTranspose(const int varSize) const
virtual int getDataSize() const =0
Matrix & getMatrix(const Index &rowIndex, const Index &colIndex)
virtual int getLength() const =0
MultiField & getResidual()
Definition: LinearSystem.h:35
virtual void setFlatMatrix(Matrix &fmg) const
Definition: Matrix.h:59
virtual const CRConnectivity & getConnectivity() const
Definition: Matrix.h:48
MultiField & getDelta()
Definition: LinearSystem.h:34
virtual void * getData() const
Definition: Array.h:275
pair< const Field *, const StorageSite * > ArrayIndex
Definition: MultiField.h:21
shared_ptr< MultiFieldReduction > getOneNorm() const
Definition: MultiField.cpp:216
virtual void computeResidual(const IContainer &xB, const IContainer &bB, IContainer &rB) const
Definition: Matrix.h:16
int getLength() const
Definition: MultiField.h:54
virtual void * getData() const =0
MultiField & getB()
Definition: LinearSystem.h:33
shared_ptr< MultiFieldReduction > MFRPtr
const ArrayIndex getArrayIndex(const int i) const
Definition: MultiField.h:55
MultiFieldMatrix & getMatrix()
Definition: LinearSystem.h:37

The documentation for this class was generated from the following files: