From bbd936aa6e4a48ce0fb362e58fd24efa5c5966bc Mon Sep 17 00:00:00 2001 From: Thomas Witkowski <thomas.witkowski@gmx.de> Date: Wed, 14 Oct 2009 08:04:37 +0000 Subject: [PATCH] Fixed a bug for FOT operators when using 2d meshes in 3d. --- AMDiS/src/FixVec.h | 18 +- AMDiS/src/Operator.cc | 405 ++++++++++++++++++++---------------------- AMDiS/src/Operator.h | 87 +++------ 3 files changed, 226 insertions(+), 284 deletions(-) diff --git a/AMDiS/src/FixVec.h b/AMDiS/src/FixVec.h index c079aa8e..16e10025 100644 --- a/AMDiS/src/FixVec.h +++ b/AMDiS/src/FixVec.h @@ -277,7 +277,8 @@ namespace AMDiS { * VectorOfFixVecs constructors. */ MatrixOfFixVecs(int dim, int r, int c, InitType initType) - : rows(r), columns(c) + : rows(r), + columns(c) { TEST_EXIT_DBG(initType == NO_INIT)("wrong initType or wrong initializer\n"); vec = new VectorOfFixVecs<FixVecType>*[rows]; @@ -309,12 +310,14 @@ namespace AMDiS { } /// Returns \ref rows - inline int getNumberOfRows() const { + inline int getNumberOfRows() const + { return rows; } /// Returns \ref columns - inline int getNumberOfColumns() const { + inline int getNumberOfColumns() const + { return columns; } @@ -337,7 +340,8 @@ namespace AMDiS { * parts of an element. */ template<typename T> - class DimVec : public FixVec<T,PARTS> { + class DimVec : public FixVec<T,PARTS> + { public: DimVec() {} @@ -549,8 +553,7 @@ namespace AMDiS { return result; } - inline bool operator<(const WorldVector<double>& v1, - const WorldVector<double>& v2) + inline bool operator<(const WorldVector<double>& v1, const WorldVector<double>& v2) { int dow = Global::getGeo(WORLD); for (int i = 0; i < dow; i++) { @@ -561,8 +564,7 @@ namespace AMDiS { return false; } - inline bool operator==(const WorldVector<double>& v1, - const WorldVector<double>& v2) + inline bool operator==(const WorldVector<double>& v1, const WorldVector<double>& v2) { int dow = Global::getGeo(WORLD); for (int i = 0; i < dow; i++) diff --git a/AMDiS/src/Operator.cc b/AMDiS/src/Operator.cc index 92551535..fb8d01e5 100644 --- a/AMDiS/src/Operator.cc +++ b/AMDiS/src/Operator.cc @@ -53,11 +53,10 @@ namespace AMDiS { void OperatorTerm::setSymmetric(bool symm) { - if (symm) { + if (symm) properties.setFlag(SYMMETRIC); - } else { - properties.unsetFlag(SYMMETRIC); - } + else + properties.unsetFlag(SYMMETRIC); } bool OperatorTerm::isSymmetric() @@ -145,23 +144,20 @@ namespace AMDiS { // Both elements have the same size, so we can use the simple procedure // to determine the gradients. - if (vec->getFESpace()->getMesh() == smallElInfo->getMesh()) { + if (vec->getFESpace()->getMesh() == smallElInfo->getMesh()) return subAssembler->getGradientsAtQPs(vec, smallElInfo, quad); - } else { - return subAssembler->getGradientsAtQPs(vec, largeElInfo, quad); - } + else + return subAssembler->getGradientsAtQPs(vec, largeElInfo, quad); } else { // The two elements are different. If the vector is defined on the mesh of the // small element, we can still use the simple procedure to determine the gradients. - if (vec->getFESpace()->getMesh() == largeElInfo->getMesh()) { + if (vec->getFESpace()->getMesh() == largeElInfo->getMesh()) return subAssembler->getGradientsAtQPs(vec, smallElInfo, largeElInfo, quad); - } else { + else return subAssembler->getGradientsAtQPs(vec, smallElInfo, quad); - } - } } @@ -807,7 +803,7 @@ namespace AMDiS { if (b) lb(Lambda, *b, Lb[iq], (*f)(coordsAtQPs[iq]) * (vecAtQPs[iq])); else - l1(Lambda, Lb[iq], (*f)(coordsAtQPs[iq]) * (vecAtQPs[iq])); + l1(Lambda, Lb[iq], (*f)(coordsAtQPs[iq]) * (vecAtQPs[iq])); } } @@ -1423,143 +1419,164 @@ namespace AMDiS { void CoordsAtQP_ZOT::initElement(const ElInfo* elInfo, SubAssembler* subAssembler, - Quadrature *quad) { + Quadrature *quad) + { coordsAtQPs = subAssembler->getCoordsAtQPs(elInfo, quad); } - void MatrixFct_SOT::getLALt(const ElInfo *elInfo, int nPoints, DimMat<double> **LALt) const { + void MatrixFct_SOT::getLALt(const ElInfo *elInfo, int nPoints, + DimMat<double> **LALt) const + { const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); for (int iq = 0; iq < nPoints; iq++) lalt(Lambda, (*matrixFct)(vecAtQPs[iq]), *(LALt[iq]), symmetric, 1.0); } - void VecAtQP_SOT::getLALt(const ElInfo *elInfo, int nPoints, DimMat<double> **LALt) const { + void VecAtQP_SOT::getLALt(const ElInfo *elInfo, int nPoints, + DimMat<double> **LALt) const + { const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); for (int iq = 0; iq < nPoints; iq++) l1lt(Lambda, *(LALt[iq]), (*f)(vecAtQPs[iq])); } - void Vec2AtQP_SOT::getLALt(const ElInfo *elInfo, int nPoints, DimMat<double> **LALt) const { + void Vec2AtQP_SOT::getLALt(const ElInfo *elInfo, int nPoints, + DimMat<double> **LALt) const + { const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); for (int iq = 0; iq < nPoints; iq++) l1lt(Lambda, *(LALt[iq]), (*f)(vecAtQPs1[iq], vecAtQPs2[iq])); } - void CoordsAtQP_SOT::getLALt(const ElInfo *elInfo, int nPoints, DimMat<double> **LALt) const { + void CoordsAtQP_SOT::getLALt(const ElInfo *elInfo, int nPoints, + DimMat<double> **LALt) const + { const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); for (int iq = 0; iq < nPoints; iq++) l1lt(Lambda, (*LALt[iq]), (*g)(coordsAtQPs[iq])); } - void MatrixGradient_SOT::getLALt(const ElInfo *elInfo, int nPoints, DimMat<double> **LALt) const { + void MatrixGradient_SOT::getLALt(const ElInfo *elInfo, int nPoints, + DimMat<double> **LALt) const + { const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); - for (int iq = 0; iq < nPoints; iq++) { + for (int iq = 0; iq < nPoints; iq++) lalt(Lambda, (*f)(gradAtQPs[iq]), (*LALt[iq]), symmetric, 1.0); - } } - void FctGradient_SOT::getLALt(const ElInfo *elInfo, int nPoints, DimMat<double> **LALt) const { + void FctGradient_SOT::getLALt(const ElInfo *elInfo, int nPoints, + DimMat<double> **LALt) const + { const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); for (int iq = 0; iq < nPoints; iq++) l1lt(Lambda, *(LALt[iq]), (*f)(gradAtQPs[iq])); } void VecAndGradientAtQP_SOT::getLALt(const ElInfo *elInfo, int nPoints, - DimMat<double> **LALt) const { + DimMat<double> **LALt) const + { const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); for (int iq = 0; iq < nPoints; iq++) l1lt(Lambda, *(LALt[iq]), (*f)(vecAtQPs[iq], gradAtQPs[iq])); } void VecMatrixGradientAtQP_SOT::getLALt(const ElInfo *elInfo, int nPoints, - DimMat<double> **LALt) const { + DimMat<double> **LALt) const + { const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); for (int iq = 0; iq < nPoints; iq++) lalt(Lambda, (*f)(vecAtQPs[iq], gradAtQPs[iq]), (*LALt[iq]), symmetric, 1.0); } - void VecAndCoordsAtQP_SOT::getLALt(const ElInfo *elInfo, int nPoints, DimMat<double> **LALt) - const { const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); + void VecAndCoordsAtQP_SOT::getLALt(const ElInfo *elInfo, int nPoints, + DimMat<double> **LALt) const + { + const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); for (int iq = 0; iq < nPoints; iq++) l1lt(Lambda, *(LALt[iq]), (*f)(vecAtQPs[iq], coordsAtQPs[iq])); } void MatrixGradientAndCoords_SOT::getLALt(const ElInfo *elInfo, int nPoints, - DimMat<double> **LALt) const { + DimMat<double> **LALt) const + { const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); for (int iq = 0; iq < nPoints; iq++) lalt(Lambda, (*f)(gradAtQPs[iq], coordsAtQPs[iq]), (*LALt[iq]), symmetric, 1.0); } void VecGradCoordsAtQP_SOT::getLALt(const ElInfo *elInfo, int nPoints, - DimMat<double> **LALt) const { + DimMat<double> **LALt) const + { const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); for (int iq = 0; iq < nPoints; iq++) l1lt(Lambda, *(LALt[iq]), (*f)(vecAtQPs[iq], gradAtQPs[iq], coordsAtQPs[iq])); } - void VecAtQP_FOT::getLb(const ElInfo *elInfo, int nPoints, VectorOfFixVecs<DimVec<double> >& Lb) const { + void VecAtQP_FOT::getLb(const ElInfo *elInfo, int nPoints, + VectorOfFixVecs<DimVec<double> >& Lb) const + { const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); for (int iq = 0; iq < nPoints; iq++) { if (b) lb(Lambda, *b, Lb[iq], (*f)(vecAtQPs[iq])); else - l1(Lambda, Lb[iq], (*f)(vecAtQPs[iq])); + l1(Lambda, Lb[iq], (*f)(vecAtQPs[iq])); } } - void CoordsAtQP_FOT::getLb(const ElInfo *elInfo, int nPoints, VectorOfFixVecs<DimVec<double> >& Lb) const { + void CoordsAtQP_FOT::getLb(const ElInfo *elInfo, int nPoints, + VectorOfFixVecs<DimVec<double> >& Lb) const + { const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); - for (int iq = 0; iq < nPoints; iq++) { + for (int iq = 0; iq < nPoints; iq++) l1(Lambda, Lb[iq], (*g)(coordsAtQPs[iq])); - } } void VecCoordsAtQP_FOT::getLb(const ElInfo *elInfo, int nPoints, VectorOfFixVecs<DimVec<double> >& Lb) const { const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); - for (int iq = 0; iq < nPoints; iq++) { + for (int iq = 0; iq < nPoints; iq++) lb(Lambda, b, Lb[iq], (*g)(coordsAtQPs[iq])); - } } - void VectorGradient_FOT::getLb(const ElInfo *elInfo, int nPoints, VectorOfFixVecs<DimVec<double> >& Lb) const { + void VectorGradient_FOT::getLb(const ElInfo *elInfo, int nPoints, + VectorOfFixVecs<DimVec<double> >& Lb) const + { const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); if (f) { - for (int iq = 0; iq < nPoints; iq++) { - lb(Lambda, (*f)(gradAtQPs[iq]), Lb[iq], 1.0); - } + for (int iq = 0; iq < nPoints; iq++) + lb(Lambda, (*f)(gradAtQPs[iq]), Lb[iq], 1.0); } else { - for (int iq = 0; iq < nPoints; iq++) { - lb(Lambda, gradAtQPs[iq], Lb[iq], 1.0); - } + for (int iq = 0; iq < nPoints; iq++) + lb(Lambda, gradAtQPs[iq], Lb[iq], 1.0); } } - void VectorFct_FOT::getLb(const ElInfo *elInfo, int nPoints, VectorOfFixVecs<DimVec<double> >& Lb) const { + void VectorFct_FOT::getLb(const ElInfo *elInfo, int nPoints, + VectorOfFixVecs<DimVec<double> >& Lb) const + { const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); - for (int iq = 0; iq < nPoints; iq++) { - lb(Lambda, (*vecFct)(vecAtQPs[iq]), Lb[iq], 1.0); - } + for (int iq = 0; iq < nPoints; iq++) + lb(Lambda, (*vecFct)(vecAtQPs[iq]), Lb[iq], 1.0); } - void VecFctAtQP_FOT::getLb(const ElInfo *elInfo, int nPoints, VectorOfFixVecs<DimVec<double> >& Lb) const { + void VecFctAtQP_FOT::getLb(const ElInfo *elInfo, int nPoints, + VectorOfFixVecs<DimVec<double> >& Lb) const + { const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); - for (int iq = 0; iq < nPoints; iq++) { - lb(Lambda, (*g)(coordsAtQPs[iq]), Lb[iq], 1.0); - } + for (int iq = 0; iq < nPoints; iq++) + lb(Lambda, (*g)(coordsAtQPs[iq]), Lb[iq], 1.0); } - void VecAtQP_ZOT::getC(const ElInfo *, int nPoints, std::vector<double> &C) const { + void VecAtQP_ZOT::getC(const ElInfo *, int nPoints, std::vector<double> &C) const + { if (f) { - for (int iq = 0; iq < nPoints; iq++) { - C[iq] += (*f)(vecAtQPs[iq]); - } + for (int iq = 0; iq < nPoints; iq++) + C[iq] += (*f)(vecAtQPs[iq]); } else { - for (int iq = 0; iq < nPoints; iq++) { - C[iq] += vecAtQPs[iq]; - } + for (int iq = 0; iq < nPoints; iq++) + C[iq] += vecAtQPs[iq]; } } @@ -1571,21 +1588,19 @@ namespace AMDiS { double fac) const { if (f) { - for (int iq = 0; iq < nPoints; iq++) { - result[iq] += fac * (*f)(vecAtQPs[iq]) * uhAtQP[iq]; - } + for (int iq = 0; iq < nPoints; iq++) + result[iq] += fac * (*f)(vecAtQPs[iq]) * uhAtQP[iq]; } else { - for (int iq = 0; iq < nPoints; iq++) { + for (int iq = 0; iq < nPoints; iq++) result[iq] += fac * vecAtQPs[iq] * uhAtQP[iq]; - } } } - void MultVecAtQP_ZOT::getC(const ElInfo *, int nPoints, std::vector<double> &C) const { - for (int iq = 0; iq < nPoints; iq++) { - C[iq] += (*f1)(vecAtQPs1[iq]) * (*f2)(vecAtQPs2[iq]); - } + void MultVecAtQP_ZOT::getC(const ElInfo *, int nPoints, std::vector<double> &C) const + { + for (int iq = 0; iq < nPoints; iq++) + C[iq] += (*f1)(vecAtQPs1[iq]) * (*f2)(vecAtQPs2[iq]); } void MultVecAtQP_ZOT::eval(int nPoints, @@ -1595,16 +1610,14 @@ namespace AMDiS { double *result, double fac) const { - for (int iq = 0; iq < nPoints; iq++) { - result[iq] += fac * (*f1)(vecAtQPs1[iq]) * - (*f2)(vecAtQPs2[iq]) * uhAtQP[iq]; - } + for (int iq = 0; iq < nPoints; iq++) + result[iq] += fac * (*f1)(vecAtQPs1[iq]) * (*f2)(vecAtQPs2[iq]) * uhAtQP[iq]; } - void Vec2AtQP_ZOT::getC(const ElInfo *, int nPoints, std::vector<double> &C) const { - for (int iq = 0; iq < nPoints; iq++) { - C[iq] += (*f)(vecAtQPs1[iq], vecAtQPs2[iq]); - } + void Vec2AtQP_ZOT::getC(const ElInfo *, int nPoints, std::vector<double> &C) const + { + for (int iq = 0; iq < nPoints; iq++) + C[iq] += (*f)(vecAtQPs1[iq], vecAtQPs2[iq]); } void Vec2AtQP_ZOT::eval(int nPoints, @@ -1614,16 +1627,14 @@ namespace AMDiS { double *result, double fac) const { - for (int iq = 0; iq < nPoints; iq++) { - result[iq] += fac * (*f)(vecAtQPs1[iq], vecAtQPs2[iq]) * - uhAtQP[iq]; - } + for (int iq = 0; iq < nPoints; iq++) + result[iq] += fac * (*f)(vecAtQPs1[iq], vecAtQPs2[iq]) * uhAtQP[iq]; } - void Vec3AtQP_ZOT::getC(const ElInfo *, int nPoints, std::vector<double> &C) const { - for (int iq = 0; iq < nPoints; iq++) { - C[iq] += (*f)(vecAtQPs1[iq], vecAtQPs2[iq], vecAtQPs3[iq]); - } + void Vec3AtQP_ZOT::getC(const ElInfo *, int nPoints, std::vector<double> &C) const + { + for (int iq = 0; iq < nPoints; iq++) + C[iq] += (*f)(vecAtQPs1[iq], vecAtQPs2[iq], vecAtQPs3[iq]); } void Vec3AtQP_ZOT::eval(int nPoints, @@ -1633,20 +1644,17 @@ namespace AMDiS { double *result, double fac) const { - for (int iq = 0; iq < nPoints; iq++) { + for (int iq = 0; iq < nPoints; iq++) result[iq] += - fac * - (*f)(vecAtQPs1[iq], vecAtQPs2[iq], vecAtQPs3[iq]) * - uhAtQP[iq]; - } + fac * (*f)(vecAtQPs1[iq], vecAtQPs2[iq], vecAtQPs3[iq]) * uhAtQP[iq]; } void VecAndCoordsAtQP_ZOT::getC(const ElInfo *, int nPoints, - std::vector<double> &C) const { - for (int iq = 0; iq < nPoints; iq++) { - C[iq] += (*f)(vecAtQPs[iq], coordsAtQPs[iq]); - } + std::vector<double> &C) const + { + for (int iq = 0; iq < nPoints; iq++) + C[iq] += (*f)(vecAtQPs[iq], coordsAtQPs[iq]); } void VecAndCoordsAtQP_ZOT::eval(int nPoints, @@ -2302,9 +2310,9 @@ namespace AMDiS { for (int iq = 0; iq < nPoints; iq++) { double factor = (*g)(coordsAtQPs[iq]); double resultQP = 0.0; - for (int i = 0; i < dow; i++) { + for (int i = 0; i < dow; i++) resultQP += grdUhAtQP[iq][i]; - } + result[iq] += f * factor * resultQP; } } @@ -2324,9 +2332,8 @@ namespace AMDiS { result[iq] += b * grdUhAtQP[iq] * factor; } } else { - for (int iq = 0; iq < nPoints; iq++) { - result[iq] += gradAtQPs[iq] * grdUhAtQP[iq] * factor; - } + for (int iq = 0; iq < nPoints; iq++) + result[iq] += gradAtQPs[iq] * grdUhAtQP[iq] * factor; } } } @@ -2359,9 +2366,9 @@ namespace AMDiS { for (int iq = 0; iq < nPoints; iq++) { double resultQP = 0.0; const WorldVector<double> &b = (*g)(coordsAtQPs[iq]); - for (int i = 0; i < dow; i++) { + for (int i = 0; i < dow; i++) resultQP += b[i] * grdUhAtQP[iq][i]; - } + result[iq] += f * resultQP; } } @@ -2369,9 +2376,8 @@ namespace AMDiS { Assembler *Operator::getAssembler(int rank) { - if (!assembler[rank]) { - initAssembler(rank, NULL, NULL, NULL, NULL); - } + if (!assembler[rank]) + initAssembler(rank, NULL, NULL, NULL, NULL); return assembler[rank]; } @@ -2393,9 +2399,8 @@ namespace AMDiS { DimMat<double> **LALt) const { const DimVec<WorldVector<double> > Lambda = elInfo->getGrdLambda(); - for (int iq = 0; iq < nPoints; iq++) { + for (int iq = 0; iq < nPoints; iq++) lalt_kl(Lambda, xi, xj, *(LALt[iq]), (*g)(coordsAtQPs[iq])); - } } void CoordsAtQP_IJ_SOT::eval(int nPoints, @@ -2556,9 +2561,9 @@ namespace AMDiS { std::vector<WorldVector<double>*> arg(size); for (int iq = 0; iq < nPoints; iq++) { - for (int i = 0; i < size; i++) { + for (int i = 0; i < size; i++) arg[i] = &(gradsAtQPs[i][iq]); - } + result[iq] += fac * (*f)(arg) * uhAtQP[iq]; } } @@ -2624,7 +2629,9 @@ namespace AMDiS { } } - void VecAndGradAtQP_SOT::getLALt(const ElInfo *elInfo, int nPoints, DimMat<double> **LALt) const { + void VecAndGradAtQP_SOT::getLALt(const ElInfo *elInfo, int nPoints, + DimMat<double> **LALt) const + { const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); for (int iq = 0; iq < nPoints; iq++) l1lt(Lambda, *(LALt[iq]), (*f)(vecAtQPs[iq], gradAtQPs[iq])); @@ -2666,12 +2673,11 @@ namespace AMDiS { const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); for (int iq = 0; iq < nPoints; iq++) { - for (int i = 0; i < nVecs; i++) { - vecsArg[i] = vecsAtQPs_[i][iq]; - } - for (int i = 0; i < nGrads; i++) { - gradsArg[i] = gradsAtQPs_[i][iq]; - } + for (int i = 0; i < nVecs; i++) + vecsArg[i] = vecsAtQPs_[i][iq]; + for (int i = 0; i < nGrads; i++) + gradsArg[i] = gradsAtQPs_[i][iq]; + lalt(Lambda, (*f_)(coordsAtQPs_[iq], vecsArg, gradsArg), *(LALt[iq]), symmetric_, 1.0); } @@ -2694,26 +2700,21 @@ namespace AMDiS { for (int iq = 0; iq < nPoints; iq++) { double resultQP = 0.0; - for (int i = 0; i < nVecs; i++) { + for (int i = 0; i < nVecs; i++) vecsArg[i] = vecsAtQPs_[i][iq]; - } - for (int i = 0; i < nGrads; i++) { + for (int i = 0; i < nGrads; i++) gradsArg[i] = gradsAtQPs_[i][iq]; - } WorldMatrix<double> A = (*f_)(coordsAtQPs_[iq], vecsArg, gradsArg); if (D2UhAtQP) { - for (int i = 0; i < dow; i++) { - for (int j = 0; j < dow; j++) { + for (int i = 0; i < dow; i++) + for (int j = 0; j < dow; j++) resultQP += A[i][j] * D2UhAtQP[iq][j][i]; - } - } } - if (grdUhAtQP) { - resultQP += (*divFct_)(A) * grdUhAtQP[iq]; - } + if (grdUhAtQP) + resultQP += (*divFct_)(A) * grdUhAtQP[iq]; result[iq] += resultQP * factor; } @@ -2732,12 +2733,11 @@ namespace AMDiS { if (grdUhAtQP) { WorldMatrix<double> A; for (int iq = 0; iq < nPoints; iq++) { - for (int i = 0; i < nVecs; i++) { - vecsArg[i] = vecsAtQPs_[i][iq]; - } - for (int i = 0; i < nGrads; i++) { + for (int i = 0; i < nVecs; i++) + vecsArg[i] = vecsAtQPs_[i][iq]; + for (int i = 0; i < nGrads; i++) gradsArg[i] = gradsAtQPs_[i][iq]; - } + A = (*f_)(coordsAtQPs_[iq], vecsArg, gradsArg); result[iq] += A * grdUhAtQP[iq]; } @@ -2753,12 +2753,10 @@ namespace AMDiS { coordsAtQPs_ = subAssembler->getCoordsAtQPs(elInfo, quad); - for (int i = 0; i < nVecs; i++) { - vecsAtQPs_[i] = getVectorAtQPs(vecs_[i], elInfo, subAssembler, quad); - } - for (int i = 0; i < nGrads; i++) { - gradsAtQPs_[i] = getGradientsAtQPs(grads_[i], elInfo, subAssembler, quad); - } + for (int i = 0; i < nVecs; i++) + vecsAtQPs_[i] = getVectorAtQPs(vecs_[i], elInfo, subAssembler, quad); + for (int i = 0; i < nGrads; i++) + gradsAtQPs_[i] = getGradientsAtQPs(grads_[i], elInfo, subAssembler, quad); } void General_FOT::getLb(const ElInfo *elInfo, @@ -2774,12 +2772,11 @@ namespace AMDiS { const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); for (int iq = 0; iq < nPoints; iq++) { - for (int i = 0; i < nVecs; i++) { - vecsArg[i] = vecsAtQPs_[i][iq]; - } - for (int i = 0; i < nGrads; i++) { - gradsArg[i] = gradsAtQPs_[i][iq]; - } + for (int i = 0; i < nVecs; i++) + vecsArg[i] = vecsAtQPs_[i][iq]; + for (int i = 0; i < nGrads; i++) + gradsArg[i] = gradsAtQPs_[i][iq]; + lb(Lambda, (*f_)(coordsAtQPs_[iq], vecsArg, gradsArg), result[iq], 1.0); } @@ -2803,18 +2800,16 @@ namespace AMDiS { for (int iq = 0; iq < nPoints; iq++) { double resultQP = 0.0; - for (int i = 0; i < nVecs; i++) { - vecsArg[i] = vecsAtQPs_[i][iq]; - } - for (int i = 0; i < nGrads; i++) { - gradsArg[i] = gradsAtQPs_[i][iq]; - } + for (int i = 0; i < nVecs; i++) + vecsArg[i] = vecsAtQPs_[i][iq]; + for (int i = 0; i < nGrads; i++) + gradsArg[i] = gradsAtQPs_[i][iq]; const WorldVector<double> &b = (*f_)(coordsAtQPs_[iq], vecsArg, gradsArg); - for (int i = 0; i < dow; i++) { + for (int i = 0; i < dow; i++) resultQP += grdUhAtQP[iq][i] * b[i]; - } + result[iq] += factor * resultQP; } } @@ -2834,8 +2829,7 @@ namespace AMDiS { gradsAtQPs_[i] = getGradientsAtQPs(grads_[i], elInfo, subAssembler, quad); } - void General_ZOT::getC(const ElInfo *, int nPoints, - std::vector<double> &C) const + void General_ZOT::getC(const ElInfo *, int nPoints, std::vector<double> &C) const { int nVecs = static_cast<int>(vecs_.size()); int nGrads = static_cast<int>(grads_.size()); @@ -2847,7 +2841,6 @@ namespace AMDiS { for (int i = 0; i < nVecs; i++) vecsArg[i] = vecsAtQPs_[i][iq]; for (int i = 0; i < nGrads; i++) - gradsArg[i] = gradsAtQPs_[i][iq]; C[iq] += (*f_)(coordsAtQPs_[iq], vecsArg, gradsArg); @@ -2868,19 +2861,14 @@ namespace AMDiS { std::vector<WorldVector<double> > gradsArg(nGrads); for (int iq = 0; iq < nPoints; iq++) { - for (int i = 0; i < nVecs; i++) { - vecsArg[i] = vecsAtQPs_[i][iq]; - } - for (int i = 0; i < nGrads; i++) { - gradsArg[i] = gradsAtQPs_[i][iq]; - } + for (int i = 0; i < nVecs; i++) + vecsArg[i] = vecsAtQPs_[i][iq]; + for (int i = 0; i < nGrads; i++) + gradsArg[i] = gradsAtQPs_[i][iq]; result[iq] += fac * (*f_)(coordsAtQPs_[iq], vecsArg, gradsArg) * uhAtQP[iq]; } } - - - //************************************ parametric general Operatorterms ***************** void GeneralParametric_SOT::initElement(const ElInfo* elInfo, SubAssembler* subAssembler, Quadrature *quad) @@ -2891,16 +2879,13 @@ namespace AMDiS { elInfo->getElementNormal(elementNormal_); coordsAtQPs_ = subAssembler->getCoordsAtQPs(elInfo, quad); - for (int i = 0; i < nVecs; i++) { - vecsAtQPs_[i] = getVectorAtQPs(vecs_[i], elInfo, subAssembler, quad); - } - for (int i = 0; i < nGrads; i++) { - gradsAtQPs_[i] = getGradientsAtQPs(grads_[i], elInfo, subAssembler, quad); - } + for (int i = 0; i < nVecs; i++) + vecsAtQPs_[i] = getVectorAtQPs(vecs_[i], elInfo, subAssembler, quad); + for (int i = 0; i < nGrads; i++) + gradsAtQPs_[i] = getGradientsAtQPs(grads_[i], elInfo, subAssembler, quad); } - void GeneralParametric_SOT::getLALt(const ElInfo *elInfo, - int nPoints, + void GeneralParametric_SOT::getLALt(const ElInfo *elInfo, int nPoints, DimMat<double> **LALt) const { int nVecs = static_cast<int>(vecs_.size()); @@ -2912,12 +2897,10 @@ namespace AMDiS { const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); for (int iq = 0; iq < nPoints; iq++) { - for (int i = 0; i < nVecs; i++) { - vecsArg[i] = vecsAtQPs_[i][iq]; - } - for (int i = 0; i < nGrads; i++) { - gradsArg[i] = gradsAtQPs_[i][iq]; - } + for (int i = 0; i < nVecs; i++) + vecsArg[i] = vecsAtQPs_[i][iq]; + for (int i = 0; i < nGrads; i++) + gradsArg[i] = gradsAtQPs_[i][iq]; lalt(Lambda, (*f_)(coordsAtQPs_[iq], elementNormal_, vecsArg, gradsArg), *(LALt[iq]), symmetric_, 1.0); } @@ -2940,26 +2923,22 @@ namespace AMDiS { for (int iq = 0; iq < nPoints; iq++) { double resultQP = 0.0; - for (int i = 0; i < nVecs; i++) { - vecsArg[i] = vecsAtQPs_[i][iq]; - } - for (int i = 0; i < nGrads; i++) { - gradsArg[i] = gradsAtQPs_[i][iq]; - } + for (int i = 0; i < nVecs; i++) + vecsArg[i] = vecsAtQPs_[i][iq]; + for (int i = 0; i < nGrads; i++) + gradsArg[i] = gradsAtQPs_[i][iq]; - WorldMatrix<double> A = (*f_)(coordsAtQPs_[iq], elementNormal_, vecsArg, gradsArg); + WorldMatrix<double> A = + (*f_)(coordsAtQPs_[iq], elementNormal_, vecsArg, gradsArg); if (D2UhAtQP) { - for (int i = 0; i < dow; i++) { - for (int j = 0; j < dow; j++) { + for (int i = 0; i < dow; i++) + for (int j = 0; j < dow; j++) resultQP += A[i][j] * D2UhAtQP[iq][j][i]; - } - } } - if (grdUhAtQP) { - resultQP += (*divFct_)(A) * grdUhAtQP[iq]; - } + if (grdUhAtQP) + resultQP += (*divFct_)(A) * grdUhAtQP[iq]; result[iq] += resultQP * factor; } @@ -2978,12 +2957,11 @@ namespace AMDiS { if (grdUhAtQP) { WorldMatrix<double> A; for (int iq = 0; iq < nPoints; iq++) { - for (int i = 0; i < nVecs; i++) { - vecsArg[i] = vecsAtQPs_[i][iq]; - } - for (int i = 0; i < nGrads; i++) { + for (int i = 0; i < nVecs; i++) + vecsArg[i] = vecsAtQPs_[i][iq]; + for (int i = 0; i < nGrads; i++) gradsArg[i] = gradsAtQPs_[i][iq]; - } + A = (*f_)(coordsAtQPs_[iq], elementNormal_, vecsArg, gradsArg); result[iq] += A * grdUhAtQP[iq]; } @@ -3000,12 +2978,10 @@ namespace AMDiS { elInfo->getElementNormal(elementNormal_); coordsAtQPs_ = subAssembler->getCoordsAtQPs(elInfo, quad); - for (int i = 0; i < nVecs; i++) { - vecsAtQPs_[i] = getVectorAtQPs(vecs_[i], elInfo, subAssembler, quad); - } - for (int i = 0; i < nGrads; i++) { - gradsAtQPs_[i] = getGradientsAtQPs(grads_[i], elInfo, subAssembler, quad); - } + for (int i = 0; i < nVecs; i++) + vecsAtQPs_[i] = getVectorAtQPs(vecs_[i], elInfo, subAssembler, quad); + for (int i = 0; i < nGrads; i++) + gradsAtQPs_[i] = getGradientsAtQPs(grads_[i], elInfo, subAssembler, quad); } void GeneralParametric_FOT::getLb(const ElInfo *elInfo, @@ -3020,12 +2996,11 @@ namespace AMDiS { const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); for (int iq = 0; iq < nPoints; iq++) { - for (int i = 0; i < nVecs; i++) { - vecsArg[i] = vecsAtQPs_[i][iq]; - } - for (int i = 0; i < nGrads; i++) { + for (int i = 0; i < nVecs; i++) + vecsArg[i] = vecsAtQPs_[i][iq]; + for (int i = 0; i < nGrads; i++) gradsArg[i] = gradsAtQPs_[i][iq]; - } + lb(Lambda, (*f_)(coordsAtQPs_[iq], elementNormal_, vecsArg, gradsArg), result[iq], 1.0); } } @@ -3048,25 +3023,23 @@ namespace AMDiS { for (int iq = 0; iq < nPoints; iq++) { double resultQP = 0.0; - for (int i = 0; i < nVecs; i++) { + for (int i = 0; i < nVecs; i++) vecsArg[i] = vecsAtQPs_[i][iq]; - } - for (int i = 0; i < nGrads; i++) { - gradsArg[i] = gradsAtQPs_[i][iq]; - } + for (int i = 0; i < nGrads; i++) + gradsArg[i] = gradsAtQPs_[i][iq]; const WorldVector<double> &b = (*f_)(coordsAtQPs_[iq], elementNormal_, vecsArg, gradsArg); - for (int i = 0; i < dow; i++) { + for (int i = 0; i < dow; i++) resultQP += grdUhAtQP[iq][i] * b[i]; - } + result[iq] += factor * resultQP; } } } - void GeneralParametric_ZOT::initElement(const ElInfo* elInfo, SubAssembler* subAssembler, - Quadrature *quad) + void GeneralParametric_ZOT::initElement(const ElInfo* elInfo, SubAssembler* + subAssembler, Quadrature *quad) { int nVecs = static_cast<int>(vecs_.size()); int nGrads = static_cast<int>(grads_.size()); @@ -3074,12 +3047,10 @@ namespace AMDiS { elInfo->getElementNormal(elementNormal_); coordsAtQPs_ = subAssembler->getCoordsAtQPs(elInfo, quad); - for (int i = 0; i < nVecs; i++) { + for (int i = 0; i < nVecs; i++) vecsAtQPs_[i] = getVectorAtQPs(vecs_[i], elInfo, subAssembler, quad); - } - for (int i = 0; i < nGrads; i++) { + for (int i = 0; i < nGrads; i++) gradsAtQPs_[i] = getGradientsAtQPs(grads_[i], elInfo, subAssembler, quad); - } } void GeneralParametric_ZOT::getC(const ElInfo *, int nPoints, diff --git a/AMDiS/src/Operator.h b/AMDiS/src/Operator.h index cfeacab5..6065b87a 100644 --- a/AMDiS/src/Operator.h +++ b/AMDiS/src/Operator.h @@ -172,8 +172,9 @@ namespace AMDiS { double factor) { const int dimOfWorld = Global::getGeo(WORLD); - - for (int i = 0; i <= dimOfWorld; i++) { + const int dim = Lambda.size() - 1; + + for (int i = 0; i <= dim; i++) { double val = 0.0; for (int j = 0; j < dimOfWorld; j++) @@ -192,8 +193,9 @@ namespace AMDiS { double factor) { const int dimOfWorld = Global::getGeo(WORLD); + const int dim = Lambda.size() - 1; - for (int i = 0; i <= dimOfWorld; i++) { + for (int i = 0; i <= dim; i++) { double val = 0.0; for (int j = 0; j < dimOfWorld; j++) @@ -476,9 +478,7 @@ namespace AMDiS { setSymmetric(symmetric); } - /** \brief - * Implements SecondOrderTerm::getLALt(). - */ + /// Implements SecondOrderTerm::getLALt(). inline void getLALt(const ElInfo *elInfo, int nPoints, DimMat<double> **LALt) const { const DimVec<WorldVector<double> >& Lambda = elInfo->getGrdLambda(); @@ -486,9 +486,7 @@ namespace AMDiS { lalt(Lambda, matrix, *(LALt[iq]), symmetric, 1.0); } - /** \brief - * Implenetation of SecondOrderTerm::eval(). - */ + /// Implenetation of SecondOrderTerm::eval(). void eval(int nPoints, const double *uhAtQP, const WorldVector<double> *grdUhAtQP, @@ -496,22 +494,16 @@ namespace AMDiS { double *result, double factor) const; - /** \brief - * Implenetation of SecondOrderTerm::weakEval(). - */ + /// Implenetation of SecondOrderTerm::weakEval(). void weakEval(int nPoints, const WorldVector<double> *grdUhAtQP, WorldVector<double> *result) const; protected: - /** \brief - * Matrix stroring A. - */ + /// Matrix stroring A. WorldMatrix<double> matrix; - /** \brief - * True, if \ref matrix is symmetric. - */ + /// True, if \ref matrix is symmetric. bool symmetric; }; @@ -543,12 +535,10 @@ namespace AMDiS { setSymmetric(xi == xj); } - /** \brief - * Implements SecondOrderTerm::getLALt(). - */ + /// Implements SecondOrderTerm::getLALt(). inline void getLALt(const ElInfo *elInfo, int nPoints, DimMat<double> **LALt) const { - const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); + const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); for (int iq = 0; iq < nPoints; iq++) lalt_kl(Lambda, xi, xj, *(LALt[iq]), (*factor)); } @@ -1357,21 +1347,15 @@ namespace AMDiS { : OperatorTerm(deg) {} - /** \brief - * Destructor. - */ + /// Destructor. virtual ~FirstOrderTerm() {} - /** \brief - * Evaluation of \f$ \Lambda b \f$. - */ + /// Evaluation of \f$ \Lambda b \f$. virtual void getLb(const ElInfo *elInfo, int nPoints, VectorOfFixVecs<DimVec<double> >& result) const = 0; - /** \brief - * Implenetation of FirstOrderTerm::eval(). - */ + /// Implenetation of FirstOrderTerm::eval(). void eval(int nPoints, const double *, const WorldVector<double> *grdUhAtQP, @@ -1384,9 +1368,9 @@ namespace AMDiS { if (grdUhAtQP) { for (int iq = 0; iq < nPoints; iq++) { double resultQP = 0.0; - for (int i = 0; i < dow; i++) { + for (int i = 0; i < dow; i++) resultQP += grdUhAtQP[iq][i]; - } + result[iq] += resultQP * factor; } } @@ -1409,9 +1393,7 @@ namespace AMDiS { : FirstOrderTerm(0) {} - /** \brief - * Implements FirstOrderTerm::getLb(). - */ + /// Implements FirstOrderTerm::getLb(). inline void getLb(const ElInfo *elInfo, int nPoints, VectorOfFixVecs<DimVec<double> >& Lb) const @@ -1491,9 +1473,7 @@ namespace AMDiS { lb(Lambda, b, Lb[iq], 1.0); } - /** \brief - * Implements FirstOrderTerm::eval(). - */ + /// Implements FirstOrderTerm::eval(). void eval(int nPoints, const double *, const WorldVector<double> *grdUhAtQP, @@ -1502,14 +1482,12 @@ namespace AMDiS { double factor) const { if (grdUhAtQP) - for(int iq = 0; iq < nPoints; iq++) + for (int iq = 0; iq < nPoints; iq++) result[iq] += b * grdUhAtQP[iq] * factor; } protected: - /** \brief - * Vector which is multiplied with \f$ \nabla u(\vec{x}) \f$ - */ + /// Vector which is multiplied with \f$ \nabla u(\vec{x}) \f$ WorldVector<double> b; }; @@ -1532,7 +1510,8 @@ namespace AMDiS { Quadrature *quad = NULL); /// Implements FirstOrderTerm::getLb(). - void getLb(const ElInfo *elInfo, int nPoints, VectorOfFixVecs<DimVec<double> >& Lb) const; + void getLb(const ElInfo *elInfo, int nPoints, + VectorOfFixVecs<DimVec<double> >& Lb) const; /// Implements FirstOrderTerm::eval(). void eval(int nPoints, @@ -2224,9 +2203,7 @@ namespace AMDiS { /// Implements ZeroOrderTerm::getC(). void getC(const ElInfo *, int nPoints, std::vector<double> &C) const; - /** \brief - * Implements ZeroOrderTerm::eval(). - */ + /// Implements ZeroOrderTerm::eval(). void eval(int nPoints, const double *uhAtQP, const WorldVector<double> *grdUhAtQP, @@ -2235,19 +2212,13 @@ namespace AMDiS { double fac) const; protected: - /** \brief - * DOFVector to be evaluated at quadrature points. - */ + /// DOFVector to be evaluated at quadrature points. DOFVectorBase<double>* vec; - /** \brief - * Vector v at quadrature points. - */ + /// Vector v at quadrature points. double *vecAtQPs; - /** \brief - * Function for c. - */ + /// Function for c. AbstractFunction<double, double> *f; }; @@ -2266,9 +2237,7 @@ namespace AMDiS { AbstractFunction<double, double> *f1, AbstractFunction<double, double> *f2); - /** \brief - * Implementation of \ref OperatorTerm::initElement(). - */ + /// Implementation of \ref OperatorTerm::initElement(). void initElement(const ElInfo* elInfo, SubAssembler* subAssembler, Quadrature *quad = NULL); -- GitLab