From 0e2727113e8d48d0f161eac3f1b662c2a8b098c8 Mon Sep 17 00:00:00 2001 From: Thomas Witkowski <thomas.witkowski@gmx.de> Date: Fri, 20 Nov 2009 13:51:58 +0000 Subject: [PATCH] Small changes in interface to make new solver possible. --- AMDiS/src/OEMSolver.h | 32 +++++++++--------- AMDiS/src/Operator.cc | 34 +++---------------- AMDiS/src/Operator.h | 35 ++++++++++++++----- AMDiS/src/SolverMatrix.h | 73 +++++++++++++++++++++++----------------- 4 files changed, 90 insertions(+), 84 deletions(-) diff --git a/AMDiS/src/OEMSolver.h b/AMDiS/src/OEMSolver.h index ad4fb7aa..a80dc29a 100644 --- a/AMDiS/src/OEMSolver.h +++ b/AMDiS/src/OEMSolver.h @@ -145,35 +145,35 @@ namespace AMDiS { } /// Solve a linear system for a vectorial problem. - int solveSystem(const SolverMatrix<Matrix<DOFMatrix*> >& A, - SystemVector& x, - SystemVector& b) + virtual int solveSystem(const SolverMatrix<Matrix<DOFMatrix*> >& A, + SystemVector& x, + SystemVector& b) { - int ns= x.getSize(), // Number of systems. - size= x.getUsedSize(); // Size of all DOFVectors + int ns = x.getSize(), // Number of systems. + size = x.getUsedSize(); // Size of all DOFVectors // Copy vectors mtl::dense_vector<value_type> xx(size), bb(size); for (int i = 0, counter = 0; i < ns; i++) { - DOFVector<double>::Iterator it_b(b.getDOFVector(i), USED_DOFS); - DOFVector<double>::Iterator it_x(x.getDOFVector(i), USED_DOFS); - - for (it_b.reset(), it_x.reset(); !it_b.end(); ++it_b, ++it_x) { - bb[counter] = *it_b; - xx[counter] = *it_x; - counter++; - } + DOFVector<double>::Iterator it_b(b.getDOFVector(i), USED_DOFS); + DOFVector<double>::Iterator it_x(x.getDOFVector(i), USED_DOFS); + + for (it_b.reset(), it_x.reset(); !it_b.end(); ++it_b, ++it_x) { + bb[counter] = *it_b; + xx[counter] = *it_x; + counter++; + } } - + // Solver on DOFVector for single system int r = solveSystem(A.getMatrix(), xx, bb); - + for (int i = 0, counter = 0; i < ns; i++) { DOFVector<double>::Iterator it(x.getDOFVector(i), USED_DOFS); for (it.reset(); !it.end(); ++it) *it = xx[counter++]; } - + return r; } diff --git a/AMDiS/src/Operator.cc b/AMDiS/src/Operator.cc index a5757ecf..459c90d2 100644 --- a/AMDiS/src/Operator.cc +++ b/AMDiS/src/Operator.cc @@ -214,30 +214,6 @@ namespace AMDiS { LALt[i][j] += factor * Lambda[i][k] * Lambda[j][l]; } - void OperatorTerm::l1lt(const DimVec<WorldVector<double> >& Lambda, - DimMat<double>& LALt, - double factor) const - { - const int dimOfWorld = Global::getGeo(WORLD); - int dim = LALt.getNumRows() - 1; - - for (int i = 0; i <= dim; i++) { - double val = 0.0; - for (int k = 0; k < dimOfWorld; k++) - val += Lambda[i][k] * Lambda[i][k]; - val *= factor; - LALt[i][i] += val; - for (int j = i + 1; j <= dim; j++) { - val = 0.0; - for (int k = 0; k < dimOfWorld; k++) - val += Lambda[i][k] * Lambda[j][k]; - val *= factor; - LALt[i][j] += val; - LALt[j][i] += val; - } - } - } - Operator::Operator(Flag operatorType, const FiniteElemSpace *row, const FiniteElemSpace *col) @@ -740,7 +716,7 @@ namespace AMDiS { Vec2AndGradAtQP_FOT::Vec2AndGradAtQP_FOT(DOFVectorBase<double> *dv1, DOFVectorBase<double> *dv2, TertiaryAbstractFunction<double, double, double, WorldVector<double> > *f_, WorldVector<double> *b_) - : FirstOrderTerm(8), + : FirstOrderTerm(f_->getDegree()), vec1(dv1), vec2(dv2), f(f_), @@ -829,7 +805,7 @@ namespace AMDiS { Vec2AtQP_FOT::Vec2AtQP_FOT(DOFVectorBase<double> *dv1, DOFVectorBase<double> *dv2, WorldVector<double> *b_) - : FirstOrderTerm(8), vec1(dv1), vec2(dv2), b(b_) + : FirstOrderTerm(0), vec1(dv1), vec2(dv2), b(b_) { auxFESpaces.push_back(dv1->getFESpace()); auxFESpaces.push_back(dv2->getFESpace()); @@ -837,7 +813,7 @@ namespace AMDiS { Vec2AtQP_FOT::Vec2AtQP_FOT(DOFVectorBase<double> *dv1, DOFVectorBase<double> *dv2, int bIdx) - : FirstOrderTerm(8), vec1(dv1), vec2(dv2) + : FirstOrderTerm(0), vec1(dv1), vec2(dv2) { bOne = bIdx; auxFESpaces.push_back(dv1->getFESpace()); @@ -884,7 +860,7 @@ namespace AMDiS { Vec3FctAtQP_FOT::Vec3FctAtQP_FOT(DOFVectorBase<double> *dv1, DOFVectorBase<double> *dv2,DOFVectorBase<double> *dv3, BinaryAbstractFunction<double, double, double> *f_, WorldVector<double> *bvec) - : FirstOrderTerm(10), + : FirstOrderTerm(f_->getDegree()), vec1(dv1), vec2(dv2), vec3(dv3), @@ -899,7 +875,7 @@ namespace AMDiS { Vec3FctAtQP_FOT::Vec3FctAtQP_FOT(DOFVectorBase<double> *dv1, DOFVectorBase<double> *dv2,DOFVectorBase<double> *dv3, BinaryAbstractFunction<double, double, double> *f_, int b) - : FirstOrderTerm(10), + : FirstOrderTerm(f_->getDegree()), vec1(dv1), vec2(dv2), vec3(dv3), diff --git a/AMDiS/src/Operator.h b/AMDiS/src/Operator.h index c274d643..00eb5f39 100644 --- a/AMDiS/src/Operator.h +++ b/AMDiS/src/Operator.h @@ -166,9 +166,28 @@ namespace AMDiS { double factor); /// Evaluation of \f$ \Lambda \cdot A \cdot \Lambda^t\f$ for A equal to the identity. - void l1lt(const DimVec<WorldVector<double> >& Lambda, - DimMat<double>& LALt, - double factor) const; + inline void l1lt(const DimVec<WorldVector<double> >& Lambda, + DimMat<double>& LALt, + double factor) const + { + const int dim = LALt.getNumRows(); + + for (int i = 0; i < dim; i++) { + double val = 0.0; + for (int k = 0; k < dimOfWorld; k++) + val += Lambda[i][k] * Lambda[i][k]; + val *= factor; + LALt[i][i] += val; + for (int j = i + 1; j < dim; j++) { + val = 0.0; + for (int k = 0; k < dimOfWorld; k++) + val += Lambda[i][k] * Lambda[j][k]; + val *= factor; + LALt[i][j] += val; + LALt[j][i] += val; + } + } + } /// Evaluation of \f$ \Lambda \cdot b\f$. inline void lb(const DimVec<WorldVector<double> >& Lambda, @@ -176,9 +195,9 @@ namespace AMDiS { DimVec<double>& Lb, double factor) const { - const int dim = Lambda.size() - 1; + const int dim = Lambda.getSize(); - for (int i = 0; i <= dim; i++) { + for (int i = 0; i < dim; i++) { double val = 0.0; for (int j = 0; j < dimOfWorld; j++) @@ -193,7 +212,7 @@ namespace AMDiS { DimVec<double>& Lb, double factor) const { - const int dim = Lambda.size(); + const int dim = Lambda.getSize(); for (int i = 0; i < dim; i++) Lb[i] += Lambda[i][bOne] * factor; @@ -207,9 +226,9 @@ namespace AMDiS { DimVec<double>& Lb, double factor) const { - const int dim = Lambda.size() - 1; + const int dim = Lambda.getSize(); - for (int i = 0; i <= dim; i++) { + for (int i = 0; i < dim; i++) { double val = 0.0; for (int j = 0; j < dimOfWorld; j++) diff --git a/AMDiS/src/SolverMatrix.h b/AMDiS/src/SolverMatrix.h index 43077aa7..f090a3ba 100644 --- a/AMDiS/src/SolverMatrix.h +++ b/AMDiS/src/SolverMatrix.h @@ -61,38 +61,49 @@ namespace AMDiS { template <> class SolverMatrix<Matrix<DOFMatrix*> > { - public : - void setMatrix(const Matrix<DOFMatrix*>& A) - { - int ns= A.getSize(); - std::vector<int> block_starts(ns+1); - block_starts[0]= 0; - for (int i= 0; i < ns; ++i) - block_starts[i+1]= block_starts[i] + A[i][i]->getFESpace()->getAdmin()->getUsedSize(); - - matrix.change_dim(block_starts[ns], block_starts[ns]); - set_to_zero(matrix); - - int nnz= 0; - for (int rb= 0; rb < ns; ++rb) - for (int cb= 0; cb < ns; ++cb) - if (A[rb][cb]) - nnz+= A[rb][cb]->getBaseMatrix().nnz(); + public : + void setMatrix(const Matrix<DOFMatrix*>& A) + { + int ns = A.getSize(); + std::vector<int> block_starts(ns + 1); + + block_starts[0] = 0; + for (int i= 0; i < ns; ++i) + block_starts[i+1]= block_starts[i] + A[i][i]->getFESpace()->getAdmin()->getUsedSize(); - DOFMatrix::inserter_type ins(matrix, int(1.2 * nnz / matrix.dim1())); - for (int rb= 0; rb < ns; ++rb) - for (int cb= 0; cb < ns; ++cb) - if (A[rb][cb]) - ins[block_starts[rb]][block_starts[cb]] << A[rb][cb]->getBaseMatrix(); - } - - const DOFMatrix::base_matrix_type& getMatrix() const - { - return matrix; - } - - private: - DOFMatrix::base_matrix_type matrix; + matrix.change_dim(block_starts[ns], block_starts[ns]); + set_to_zero(matrix); + + int nnz= 0; + for (int rb= 0; rb < ns; ++rb) + for (int cb= 0; cb < ns; ++cb) + if (A[rb][cb]) + nnz+= A[rb][cb]->getBaseMatrix().nnz(); + + DOFMatrix::inserter_type ins(matrix, int(1.2 * nnz / matrix.dim1())); + for (int rb= 0; rb < ns; ++rb) + for (int cb= 0; cb < ns; ++cb) + if (A[rb][cb]) + ins[block_starts[rb]][block_starts[cb]] << A[rb][cb]->getBaseMatrix(); + + originalMat = &A; + } + + const DOFMatrix::base_matrix_type& getMatrix() const + { + return matrix; + } + + const Matrix<DOFMatrix*>* getOriginalMat() const + { + return originalMat; + } + + private: + DOFMatrix::base_matrix_type matrix; + + const Matrix<DOFMatrix*>* originalMat; + }; -- GitLab