From 869d35d6991d5c7350b2283bb4620e189a9098e5 Mon Sep 17 00:00:00 2001 From: Thomas Witkowski <thomas.witkowski@gmx.de> Date: Mon, 12 Apr 2010 12:36:45 +0000 Subject: [PATCH] Bugfix in usage of FOT operators in multi-mesh method. --- AMDiS/src/Assembler.cc | 6 ++++-- AMDiS/src/ElInfo1d.cc | 2 +- AMDiS/src/ElInfo2d.cc | 22 ++++++++++++++++++++-- AMDiS/src/FirstOrderAssembler.cc | 16 ++++++++-------- AMDiS/src/FirstOrderTerm.cc | 11 ++++++++++- AMDiS/src/FirstOrderTerm.h | 6 ++++++ 6 files changed, 49 insertions(+), 14 deletions(-) diff --git a/AMDiS/src/Assembler.cc b/AMDiS/src/Assembler.cc index 03e16e3e..b9470a61 100644 --- a/AMDiS/src/Assembler.cc +++ b/AMDiS/src/Assembler.cc @@ -120,9 +120,11 @@ namespace AMDiS { } if (firstOrderAssemblerGrdPsi) { + // std::cout << "PSI!" << std::endl; + firstOrderAssemblerGrdPsi->calculateElementMatrix(smallElInfo, mat); - if (largeElInfo == colElInfo) { + if (largeElInfo == rowElInfo) { ElementMatrix &m = smallElInfo->getSubElemGradCoordsMat(rowFESpace->getBasisFcts()->getDegree()); @@ -140,7 +142,7 @@ namespace AMDiS { if (firstOrderAssemblerGrdPhi) { firstOrderAssemblerGrdPhi->calculateElementMatrix(smallElInfo, mat); - if (largeElInfo == rowElInfo) { + if (largeElInfo == colElInfo) { ElementMatrix &m = smallElInfo->getSubElemGradCoordsMat(rowFESpace->getBasisFcts()->getDegree()); diff --git a/AMDiS/src/ElInfo1d.cc b/AMDiS/src/ElInfo1d.cc index 5c80ac11..2ddefba0 100644 --- a/AMDiS/src/ElInfo1d.cc +++ b/AMDiS/src/ElInfo1d.cc @@ -353,7 +353,7 @@ namespace AMDiS { using namespace mtl; - if (subElemMatrices[degree].count(refinementPath) == 0) { + if (subElemGradMatrices[degree].count(refinementPath) == 0) { dense2D<double> mat(mat_d1); for (int i = 0; i < refinementPathLength; i++) diff --git a/AMDiS/src/ElInfo2d.cc b/AMDiS/src/ElInfo2d.cc index 795a3b6b..01360e11 100644 --- a/AMDiS/src/ElInfo2d.cc +++ b/AMDiS/src/ElInfo2d.cc @@ -731,11 +731,29 @@ namespace AMDiS { using namespace mtl; - if (subElemMatrices[degree].count(refinementPath) == 0) { + if (subElemGradMatrices[degree].count(refinementPath) == 0) { dense2D<double> mat(mat_d1); + dense2D<double> tmpMat(num_rows(mat), num_rows(mat)); + + double test_left[3][3] = {{0.0, 0.0, 0.5}, + {-0.5, -0.5, 0.0}, + {1.0, 0.0, 0.0}}; + double test_right[3][3] = {{0.0, 0.0, 0.5}, + {0.5, -0.5, 0.0}, + {0.0, 1.0, 0.0}}; + + mtl::dense2D<double> mat_left(test_left); + mtl::dense2D<double> mat_right(test_right); + for (int i = 0; i < refinementPathLength; i++) - mat *= 0.5; + if (refinementPath & (1 << i)) { + tmpMat = mat_right * mat; + mat = tmpMat; + } else { + tmpMat = mat_left * mat; + mat = tmpMat; + } subElemGradMatrices[1][refinementPath] = mat; } diff --git a/AMDiS/src/FirstOrderAssembler.cc b/AMDiS/src/FirstOrderAssembler.cc index f07620c2..e876ab19 100644 --- a/AMDiS/src/FirstOrderAssembler.cc +++ b/AMDiS/src/FirstOrderAssembler.cc @@ -85,15 +85,15 @@ namespace AMDiS { dynamic_cast<FirstOrderAssembler*>(new Stand01(op, assembler, quad)); } else { if (pwConst) { - newAssembler = - (type == GRD_PSI) ? - dynamic_cast<FirstOrderAssembler*>(new Pre10(op, assembler, quad)) : - dynamic_cast<FirstOrderAssembler*>(new Pre01(op, assembler, quad)); + newAssembler = + (type == GRD_PSI) ? + dynamic_cast<FirstOrderAssembler*>(new Pre10(op, assembler, quad)) : + dynamic_cast<FirstOrderAssembler*>(new Pre01(op, assembler, quad)); } else { - newAssembler = - (type == GRD_PSI) ? - dynamic_cast<FirstOrderAssembler*>(new Quad10(op, assembler, quad)) : - dynamic_cast<FirstOrderAssembler*>(new Quad01(op, assembler, quad)); + newAssembler = + (type == GRD_PSI) ? + dynamic_cast<FirstOrderAssembler*>(new Quad10(op, assembler, quad)) : + dynamic_cast<FirstOrderAssembler*>(new Quad01(op, assembler, quad)); } } diff --git a/AMDiS/src/FirstOrderTerm.cc b/AMDiS/src/FirstOrderTerm.cc index d8680438..0217373e 100644 --- a/AMDiS/src/FirstOrderTerm.cc +++ b/AMDiS/src/FirstOrderTerm.cc @@ -33,6 +33,14 @@ namespace AMDiS { vecAtQPs = getVectorAtQPs(vec, elInfo, subAssembler, quad); } + void VecAtQP_FOT::initElement(const ElInfo* smallElInfo, + const ElInfo* largeElInfo, + SubAssembler* subAssembler, + Quadrature *quad) + { + vecAtQPs = getVectorAtQPs(vec, smallElInfo, largeElInfo, subAssembler, quad); + } + void VecAtQP_FOT::getLb(const ElInfo *elInfo, int nPoints, VectorOfFixVecs<DimVec<double> >& Lb) const { @@ -64,7 +72,8 @@ namespace AMDiS { double factor = (*f)(vecAtQPs[iq]); double resultQP = 0.0; for (int i = 0; i < dow; i++) - resultQP += grdUhAtQP[iq][i]; + resultQP += grdUhAtQP[iq][i]; + result[iq] += fac * factor * resultQP; } } diff --git a/AMDiS/src/FirstOrderTerm.h b/AMDiS/src/FirstOrderTerm.h index cd119438..3d99e78b 100644 --- a/AMDiS/src/FirstOrderTerm.h +++ b/AMDiS/src/FirstOrderTerm.h @@ -266,6 +266,12 @@ namespace AMDiS { void initElement(const ElInfo* elInfo, SubAssembler* subAssembler, Quadrature *quad = NULL); + /// Implementation of \ref OperatorTerm::initElement() for multilpe meshes. + void initElement(const ElInfo* smallElInfo, + const ElInfo* largeElInfo, + SubAssembler* subAssembler, + Quadrature *quad = NULL); + /// Implements FirstOrderTerm::getLb(). void getLb(const ElInfo *elInfo, int nPoints, VectorOfFixVecs<DimVec<double> >& Lb) const; -- GitLab