From b66281563813691317fbc473324dc98bbddd577d Mon Sep 17 00:00:00 2001 From: Thomas Witkowski <thomas.witkowski@gmx.de> Date: Fri, 29 Aug 2008 09:09:52 +0000 Subject: [PATCH] * Error computation --- AMDiS/src/DOFVector.h | 7 +- AMDiS/src/DOFVector.hh | 7 ++ AMDiS/src/ProblemVec.cc | 9 +-- AMDiS/src/Recovery.cc | 148 +++++++++++++++++++--------------------- 4 files changed, 87 insertions(+), 84 deletions(-) diff --git a/AMDiS/src/DOFVector.h b/AMDiS/src/DOFVector.h index aad09fe7..572887ab 100644 --- a/AMDiS/src/DOFVector.h +++ b/AMDiS/src/DOFVector.h @@ -568,7 +568,12 @@ namespace AMDiS { /** \brief * Returns maximum of DOFVector */ - T max() const; + T max() const; + + /** \brief + * Returns absolute maximum of DOFVector + */ + T absMax() const; /** \brief * Used by interpol while mesh traversal diff --git a/AMDiS/src/DOFVector.hh b/AMDiS/src/DOFVector.hh index 5361890c..93a2bb43 100644 --- a/AMDiS/src/DOFVector.hh +++ b/AMDiS/src/DOFVector.hh @@ -1,4 +1,5 @@ #include <list> +#include <algorithm> #include "FixVec.h" #include "Boundary.h" @@ -277,6 +278,12 @@ namespace AMDiS { return m; } + template<typename T> + T DOFVector<T>::absMax() const + { + return std::max(abs(max()), abs(min())); + } + template<typename T> void gemv(MatrixTranspose transpose, T alpha, const DOFMatrix& a, const DOFVector<T>& x, diff --git a/AMDiS/src/ProblemVec.cc b/AMDiS/src/ProblemVec.cc index f0be8cca..36104a09 100644 --- a/AMDiS/src/ProblemVec.cc +++ b/AMDiS/src/ProblemVec.cc @@ -552,12 +552,13 @@ namespace AMDiS { for (int i = 0; i < nComponents; i++) { DOFVector<double> *tmp = NEW DOFVector<double>(componentSpaces[i], "tmp"); tmp->interpol(exactSolutionFcts[i]); - double t = tmp->max(); + // double t = max(abs(tmp->max()), abs(tmp->min())); + double t = tmp->absMax(); *tmp -= *(solution_->getDOFVector(i)); double l2Error = tmp->L2Norm(); - double maxError = tmp->max() / t; - MSG("L2 error = %.8e\n", l2Error); - MSG("Max error = %.8e\n", maxError); + double maxError = tmp->absMax() / t; + MSG("L2 error = %.8e\n", l2Error); + MSG("L-inf error = %.8e\n", maxError); DELETE tmp; } } else { diff --git a/AMDiS/src/Recovery.cc b/AMDiS/src/Recovery.cc index cdadc23d..b3f69172 100644 --- a/AMDiS/src/Recovery.cc +++ b/AMDiS/src/Recovery.cc @@ -4,35 +4,33 @@ RecoveryStructure& RecoveryStructure::operator=(const RecoveryStructure& rhs) { if (rhs.coords) { - if (!coords) - coords=NEW WorldVector<double>; - *coords=*rhs.coords; - } - else { + if (!coords) { + coords = NEW WorldVector<double>; + } + *coords = *rhs.coords; + } else { if (coords) { DELETE coords; - coords=NULL; + coords = NULL; } } if (rhs.A) { if (!A) - A=NEW Matrix<double>(rhs.A->getNumRows(), rhs.A->getNumCols()); - *A=*rhs.A; - } - else { + A = NEW Matrix<double>(rhs.A->getNumRows(), rhs.A->getNumCols()); + *A = *rhs.A; + } else { if (A) { DELETE A; - A=NULL; + A = NULL; } } if (rhs.rec_uh) { if (!rec_uh) - rec_uh=NEW Vector<double>(rhs.rec_uh->getSize()); - *rec_uh=*rhs.rec_uh; - } - else { + rec_uh = NEW Vector<double>(rhs.rec_uh->getSize()); + *rec_uh = *rhs.rec_uh; + } else { if (rec_uh) { DELETE rec_uh; rec_uh=NULL; @@ -42,24 +40,22 @@ RecoveryStructure& RecoveryStructure::operator=(const RecoveryStructure& rhs) { if (rhs.rec_grdUh) { if (!rec_grdUh) rec_grdUh = NEW Vector<WorldVector<double> >(rhs.rec_grdUh->getSize()); - *rec_grdUh=*rhs.rec_grdUh; - } - else { + *rec_grdUh = *rhs.rec_grdUh; + } else { if (rec_grdUh) { DELETE rec_grdUh; - rec_grdUh=NULL; + rec_grdUh = NULL; } } if (rhs.neighbors) { if (!neighbors) neighbors = NEW std::set<DegreeOfFreedom>; - *neighbors=*rhs.neighbors ; - } - else { + *neighbors = *rhs.neighbors ; + } else { if (neighbors) { DELETE neighbors; - neighbors=NULL; + neighbors = NULL; } } @@ -903,7 +899,7 @@ Recovery::recovery(DOFVector<double> *uh, const FiniteElemSpace *fe_space, AbstractFunction<double, double> *f_scal, DOFVector<double> *aux_vec) { - FUNCNAME("Recovery::recovery"); + FUNCNAME("Recovery::recovery()"); clear(); @@ -916,55 +912,52 @@ Recovery::recovery(DOFVector<double> *uh, const FiniteElemSpace *fe_space, DOFVector<RecoveryStructure>::Iterator SV_it(struct_vec, USED_DOFS); // Solving local systems. - for (SV_it.reset(); !SV_it.end(); ++SV_it) - { - if ((*SV_it).A) { - int error = Cholesky::solve((*SV_it).A, - (*SV_it).rec_grdUh, - (*SV_it).rec_grdUh); - TEST_EXIT_DBG(error) - ("There must be some error, matrix is not positive definite.\n"); - } + for (SV_it.reset(); !SV_it.end(); ++SV_it) { + if ((*SV_it).A) { + int error = Cholesky::solve((*SV_it).A, + (*SV_it).rec_grdUh, + (*SV_it).rec_grdUh); + TEST_EXIT_DBG(error) + ("There must be some error, matrix is not positive definite.\n"); } + } // define result vector static DOFVector<WorldVector<double> > *vec = NULL; - DOFVector<WorldVector<double> > *result = NULL; + DOFVector<WorldVector<double> > *result = NULL; // Allocate memory for result vector - if (vec && vec->getFESpace() != feSpace) - { - DELETE vec; - vec = NULL; - } - if (!vec) + if (vec && vec->getFESpace() != feSpace) { + DELETE vec; + vec = NULL; + } + + if (!vec) { vec = NEW DOFVector<WorldVector<double> >(feSpace, "gradient"); + } + result = vec; result->set(WorldVector<double>(DEFAULT_VALUE, 0.0)); DOFVector<WorldVector<double> >::Iterator grdIt(result, USED_DOFS); std::set<DegreeOfFreedom>::const_iterator setIterator; - int i; - for (SV_it.reset(), grdIt.reset(); !grdIt.end(); ++SV_it, ++grdIt) - { - if ((*SV_it).rec_grdUh) - *grdIt = (*(*SV_it).rec_grdUh)[0]; - else - { - for (setIterator = (*SV_it).neighbors->begin(); - setIterator != (*SV_it).neighbors->end(); - ++setIterator) - { - for (i=0; i<n_monomials; i++) - *grdIt = *grdIt + (*(*struct_vec)[*setIterator].rec_grdUh)[i] * - (*(*matrix_fcts)[0][i])(*(*SV_it).coords, - *(*struct_vec)[*setIterator].coords); - } - *grdIt = *grdIt * (1.0/(*SV_it).neighbors->size()); - } + for (SV_it.reset(), grdIt.reset(); !grdIt.end(); ++SV_it, ++grdIt) { + if ((*SV_it).rec_grdUh) { + *grdIt = (*(*SV_it).rec_grdUh)[0]; + } else { + for (setIterator = (*SV_it).neighbors->begin(); + setIterator != (*SV_it).neighbors->end(); + ++setIterator) { + for (int i = 0; i < n_monomials; i++) + *grdIt = *grdIt + (*(*struct_vec)[*setIterator].rec_grdUh)[i] * + (*(*matrix_fcts)[0][i])(*(*SV_it).coords, + *(*struct_vec)[*setIterator].coords); + } + *grdIt = *grdIt * (1.0 / (*SV_it).neighbors->size()); } + } return result; } @@ -975,7 +968,7 @@ Recovery::recovery(DOFVector<double> *uh, AbstractFunction<double, double> *f_scal, DOFVector<double> *aux_vec) { - FUNCNAME("Recovery::simpleAveraging"); + FUNCNAME("Recovery::simpleAveraging()"); TEST_EXIT_DBG(!(f_vec && f_scal))("Only one diffusion function, please!\n"); @@ -983,16 +976,16 @@ Recovery::recovery(DOFVector<double> *uh, // define result vector static DOFVector<WorldVector<double> > *vec = NULL; - DOFVector<WorldVector<double> > *result = NULL; + DOFVector<WorldVector<double> > *result = NULL; // Allocate memory for result vector - if (vec && vec->getFESpace() != fe_space) - { - DELETE vec; - vec = NULL; - } - if (!vec) + if (vec && vec->getFESpace() != fe_space) { + DELETE vec; + vec = NULL; + } + if (!vec) { vec = NEW DOFVector<WorldVector<double> >(fe_space, "gradient"); + } result = vec; result->set(WorldVector<double>(DEFAULT_VALUE, 0.0)); @@ -1000,13 +993,11 @@ Recovery::recovery(DOFVector<double> *uh, DOFVector<double> volume(fe_space, "volume"); volume.set(0.0); - int i; - Mesh *mesh = fe_space->getMesh(); - int dim = mesh->getDim(); + int dim = mesh->getDim(); const BasisFunction *basFcts = fe_space->getBasisFcts(); - DOFAdmin *admin = fe_space->getAdmin(); + DOFAdmin *admin = fe_space->getAdmin(); int numPreDOFs = admin->getNumberOfPreDOFs(0); @@ -1044,7 +1035,7 @@ Recovery::recovery(DOFVector<double> *uh, fAtBary = (*f_scal)(fAtBary); } - for (i = 0; i < dim + 1; i++) { + for (int i = 0; i < dim + 1; i++) { DegreeOfFreedom dofIndex = dof[i][numPreDOFs]; (*result)[dofIndex] += grd * fAtBary * det; volume[dofIndex] += det; @@ -1065,7 +1056,7 @@ Recovery::recovery(DOFVector<double> *uh, void Recovery::test(DOFVector<double> *uh, const FiniteElemSpace *fe_space) { - FUNCNAME("Recovery::test"); + FUNCNAME("Recovery::test()"); clear(); @@ -1078,13 +1069,12 @@ void Recovery::test(DOFVector<double> *uh, const FiniteElemSpace *fe_space) WorldVector<double> coord; // for every DOFs - for (LM_iterator.reset(); !LM_iterator.end(); ++LM_iterator) - { - position = LM_iterator.getDOFIndex(); - MSG("Node: "); - std::cout << position << std::endl; - (*struct_vec)[position].print(); - } + for (LM_iterator.reset(); !LM_iterator.end(); ++LM_iterator) { + position = LM_iterator.getDOFIndex(); + MSG("Node: "); + std::cout << position << std::endl; + (*struct_vec)[position].print(); + } return; } -- GitLab