33 throw CException(
"direct solver only works for single matrix");
40 const ArrayBase& origB = bField[rowIndex];
45 FlatMatrix flatMatrix(*flatConnPtr);
50 const Array<int>& flatRow = flatConnPtr->getRow();
51 const Array<int>& flatCol = flatConnPtr->getCol();
54 ArrayBase& flatDelta = deltaField[rowIndex];
56 const int nFlatEqs = flatConnPtr->getRowDim();
65 cout << 0 <<
": " << *rNorm0 << endl;
68 double *null = (
double *) NULL ;
70 void *Symbolic, *Numeric ;
71 (void) umfpack_di_symbolic (nFlatEqs, nFlatEqs,
75 &Symbolic, null, null) ;
76 (void) umfpack_di_numeric ( (
int*)flatRow.
getData(),
80 Symbolic, &Numeric, null, null) ;
81 umfpack_di_free_symbolic (&Symbolic) ;
82 (void) umfpack_di_solve (UMFPACK_A,
88 Numeric, null, null) ;
89 umfpack_di_free_numeric (&Numeric) ;
92 double *flatDeltaData = (
double*) flatDelta.
getData();
93 for(
int n=0; n<nFlatEqs; n++)
94 flatDeltaData[n] *= -1.0;
101 cout <<
"Final : " << *rNormN << endl;
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()
virtual void setFlatMatrix(Matrix &fmg) const
virtual const CRConnectivity & getConnectivity() const
virtual void * getData() const
pair< const Field *, const StorageSite * > ArrayIndex
shared_ptr< MultiFieldReduction > getOneNorm() const
virtual void computeResidual(const IContainer &xB, const IContainer &bB, IContainer &rB) const
virtual void * getData() const =0
shared_ptr< MultiFieldReduction > MFRPtr
const ArrayIndex getArrayIndex(const int i) const
MultiFieldMatrix & getMatrix()