Memosa-FVM  0.2
DirectSolver.cpp
Go to the documentation of this file.
1 // This file os part of FVM
2 // Copyright (c) 2012 FVM Authors
3 // See LICENSE file for terms.
4 
5 
6 #include <umfpack.h>
7 
8 #include "DirectSolver.h"
9 #include "CRMatrix.h"
10 
12 {}
13 
15 {}
16 
17 void
19 {}
20 
21 
22 MFRPtr
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 }
106 
107 void
109 {
110  throw CException("cannot use DirectSolver as preconditioner");
111 }
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 MFRPtr solve(LinearSystem &ls)
virtual const CRConnectivity & getConnectivity() const
Definition: Matrix.h:48
MultiField & getDelta()
Definition: LinearSystem.h:34
virtual void smooth(LinearSystem &ls)
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
virtual ~DirectSolver()
MultiField & getB()
Definition: LinearSystem.h:33
shared_ptr< MultiFieldReduction > MFRPtr
const ArrayIndex getArrayIndex(const int i) const
Definition: MultiField.h:55
virtual void cleanup()
MultiFieldMatrix & getMatrix()
Definition: LinearSystem.h:37