From 2982e0f319a7df9b6030a150ee0b2eeacd6938bd Mon Sep 17 00:00:00 2001 From: Thomas Witkowski <thomas.witkowski@gmx.de> Date: Tue, 30 Mar 2010 16:18:19 +0000 Subject: [PATCH] Some small changes in Operators. Thanks to Simon ... --- AMDiS/src/Operator.cc | 108 +++++++++++++----------------------------- AMDiS/src/Operator.h | 67 +++++--------------------- 2 files changed, 47 insertions(+), 128 deletions(-) diff --git a/AMDiS/src/Operator.cc b/AMDiS/src/Operator.cc index 354b97ff..b125ef2e 100644 --- a/AMDiS/src/Operator.cc +++ b/AMDiS/src/Operator.cc @@ -767,8 +767,9 @@ namespace AMDiS { ((*b) * grdUhAtQP[iq]); } + FctVecAtQP_FOT::FctVecAtQP_FOT(DOFVectorBase<double> *dv, - AbstractFunction<double, WorldVector<double> > *f_, + BinaryAbstractFunction<double, WorldVector<double>, double> *f_, WorldVector<double> *b_) : FirstOrderTerm(f_->getDegree()), vec(dv), f(f_), b(b_) { @@ -791,9 +792,9 @@ namespace AMDiS { const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); for (int iq = 0; iq < nPoints; iq++) { if (b) - lb(Lambda, *b, Lb[iq], (*f)(coordsAtQPs[iq]) * (vecAtQPs[iq])); + 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])); } } @@ -807,21 +808,29 @@ namespace AMDiS { if (grdUhAtQP) for (int iq = 0; iq < nPoints; iq++) result[iq] += - fac * (*f)(coordsAtQPs[iq]) * (vecAtQPs[iq]) * ((*b) * grdUhAtQP[iq]); + fac * (*f)(coordsAtQPs[iq], vecAtQPs[iq]) * ((*b) * grdUhAtQP[iq]); } Vec2AtQP_FOT::Vec2AtQP_FOT(DOFVectorBase<double> *dv1, DOFVectorBase<double> *dv2, + BinaryAbstractFunction<double, double, double> *af, WorldVector<double> *b_) - : FirstOrderTerm(0), vec1(dv1), vec2(dv2), b(b_) + : FirstOrderTerm(af->getDegree()), vec1(dv1), vec2(dv2), f(af), b(b_) { + TEST_EXIT(dv1)("No first vector!\n"); + TEST_EXIT(dv2)("No second vector!\n"); + auxFeSpaces.insert(dv1->getFESpace()); auxFeSpaces.insert(dv2->getFESpace()); } Vec2AtQP_FOT::Vec2AtQP_FOT(DOFVectorBase<double> *dv1, DOFVectorBase<double> *dv2, + BinaryAbstractFunction<double, double, double> *af, int bIdx) - : FirstOrderTerm(0), vec1(dv1), vec2(dv2) + : FirstOrderTerm(af->getDegree()), vec1(dv1), vec2(dv2), f(af) { + TEST_EXIT(dv1)("No first vector!\n"); + TEST_EXIT(dv2)("No second vector!\n"); + bOne = bIdx; auxFeSpaces.insert(dv1->getFESpace()); auxFeSpaces.insert(dv2->getFESpace()); @@ -842,13 +851,13 @@ namespace AMDiS { if (bOne > -1) { for (int iq = 0; iq < nPoints; iq++) - lb_one(Lambda, Lb[iq], vec1AtQPs[iq] * vec2AtQPs[iq]); + lb_one(Lambda, Lb[iq], (*f)(vec1AtQPs[iq], vec2AtQPs[iq])); } else if (b) { for (int iq = 0; iq < nPoints; iq++) - lb(Lambda, *b, Lb[iq], vec1AtQPs[iq] * vec2AtQPs[iq]); + lb(Lambda, *b, Lb[iq], (*f)(vec1AtQPs[iq], vec2AtQPs[iq])); } else { for (int iq = 0; iq < nPoints; iq++) - l1(Lambda, Lb[iq], vec1AtQPs[iq] * vec2AtQPs[iq]); + l1(Lambda, Lb[iq], (*f)(vec1AtQPs[iq], vec2AtQPs[iq])); } } @@ -861,11 +870,14 @@ namespace AMDiS { { if (grdUhAtQP) for (int iq = 0; iq < nPoints; iq++) - result[iq] += fac * vec1AtQPs[iq] * vec2AtQPs[iq] * ((*b) * grdUhAtQP[iq]); + result[iq] += fac * (*f)(vec1AtQPs[iq], vec2AtQPs[iq]) * ((*b) * grdUhAtQP[iq]); } - Vec3FctAtQP_FOT::Vec3FctAtQP_FOT(DOFVectorBase<double> *dv1, DOFVectorBase<double> *dv2,DOFVectorBase<double> *dv3, - BinaryAbstractFunction<double, double, double> *f_, + + Vec3FctAtQP_FOT::Vec3FctAtQP_FOT(DOFVectorBase<double> *dv1, + DOFVectorBase<double> *dv2, + DOFVectorBase<double> *dv3, + TertiaryAbstractFunction<double, double, double, double> *f_, WorldVector<double> *bvec) : FirstOrderTerm(f_->getDegree()), vec1(dv1), @@ -879,8 +891,11 @@ namespace AMDiS { auxFeSpaces.insert(dv3->getFESpace()); } - Vec3FctAtQP_FOT::Vec3FctAtQP_FOT(DOFVectorBase<double> *dv1, DOFVectorBase<double> *dv2,DOFVectorBase<double> *dv3, - BinaryAbstractFunction<double, double, double> *f_, + + Vec3FctAtQP_FOT::Vec3FctAtQP_FOT(DOFVectorBase<double> *dv1, + DOFVectorBase<double> *dv2, + DOFVectorBase<double> *dv3, + TertiaryAbstractFunction<double, double, double, double> *f_, int b) : FirstOrderTerm(f_->getDegree()), vec1(dv1), @@ -910,17 +925,18 @@ namespace AMDiS { const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); if (bOne > -1) { for (int iq = 0; iq < nPoints; iq++) - lb_one(Lambda, Lb[iq], vec1AtQPs[iq] * (*f)(vec2AtQPs[iq], vec3AtQPs[iq])); + lb_one(Lambda, Lb[iq], (*f)(vec1AtQPs[iq], vec2AtQPs[iq], vec3AtQPs[iq])); } else { for (int iq = 0; iq < nPoints; iq++) { if (b) - lb(Lambda, *b, Lb[iq], vec1AtQPs[iq] * (*f)(vec2AtQPs[iq], vec3AtQPs[iq])); + lb(Lambda, *b, Lb[iq], (*f)(vec1AtQPs[iq], vec2AtQPs[iq], vec3AtQPs[iq])); else - l1(Lambda, Lb[iq], vec1AtQPs[iq] * (*f)(vec2AtQPs[iq], vec3AtQPs[iq])); + l1(Lambda, Lb[iq], (*f)(vec1AtQPs[iq], vec2AtQPs[iq], vec3AtQPs[iq])); } } } + void Vec3FctAtQP_FOT::eval(int nPoints, const double *uhAtQP, const WorldVector<double> *grdUhAtQP, @@ -930,8 +946,7 @@ namespace AMDiS { { if (grdUhAtQP) for (int iq = 0; iq < nPoints; iq++) - result[iq] += fac * - (vec1AtQPs[iq]) * (*f)(vec2AtQPs[iq] ,vec3AtQPs[iq]) * + result[iq] += fac * (*f)(vec1AtQPs[iq], vec2AtQPs[iq] ,vec3AtQPs[iq]) * ((*b) * grdUhAtQP[iq]); } @@ -1053,15 +1068,6 @@ namespace AMDiS { auxFeSpaces.insert(dv->getFESpace()); } - VecAndGradientAtQP_SOT::VecAndGradientAtQP_SOT(DOFVectorBase<double> *dv, - BinaryAbstractFunction<double, double, WorldVector<double> > *af) - : SecondOrderTerm(af->getDegree()), vec(dv), f(af) - { - TEST_EXIT(dv)("No vector!\n"); - - auxFeSpaces.insert(dv->getFESpace()); - } - VecMatrixGradientAtQP_SOT::VecMatrixGradientAtQP_SOT(DOFVectorBase<double> *dv, BinaryAbstractFunction<WorldMatrix<double>, double, WorldVector<double> > *af, AbstractFunction<WorldVector<double>, WorldMatrix<double> > *divAf, @@ -1325,14 +1331,6 @@ namespace AMDiS { gradAtQPs = getGradientsAtQPs(vec, elInfo, subAssembler, quad); } - void VecAndGradientAtQP_SOT::initElement(const ElInfo* elInfo, - SubAssembler* subAssembler, - Quadrature *quad) - { - vecAtQPs = getVectorAtQPs(vec, elInfo, subAssembler, quad); - gradAtQPs = getGradientsAtQPs(vec, elInfo, subAssembler, quad); - } - void VecMatrixGradientAtQP_SOT::initElement(const ElInfo* elInfo, SubAssembler* subAssembler, Quadrature *quad) @@ -1581,14 +1579,6 @@ namespace AMDiS { l1lt(Lambda, *(LALt[iq]), (*f)(gradAtQPs[iq])); } - void VecAndGradientAtQP_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])); - } - void VecMatrixGradientAtQP_SOT::getLALt(const ElInfo *elInfo, int nPoints, DimMat<double> **LALt) const { @@ -2156,36 +2146,6 @@ namespace AMDiS { } } - void VecAndGradientAtQP_SOT::eval(int nPoints, - const double *uhAtQP, - const WorldVector<double> *grdUhAtQP, - const WorldMatrix<double> *D2UhAtQP, - double *result, - double fac) - { - int dow = Global::getGeo(WORLD); - - if (D2UhAtQP) { - for (int iq = 0; iq < nPoints; iq++) { - double factor = (*f)(vecAtQPs[iq], gradAtQPs[iq]); - double resultQP = 0.0; - for (int i = 0; i < dow; i++) - resultQP += D2UhAtQP[iq][i][i]; - result[iq] += fac * factor * resultQP; - } - } - } - - void VecAndGradientAtQP_SOT::weakEval(const std::vector<WorldVector<double> > &grdUhAtQP, - std::vector<WorldVector<double> > &result) - { - int nPoints = grdUhAtQP.size(); - for (int iq = 0; iq < nPoints; iq++) { - double factor = (*f)(vecAtQPs[iq], gradAtQPs[iq]); - axpy(factor, grdUhAtQP[iq], result[iq]); - } - } - void VecMatrixGradientAtQP_SOT::eval(int nPoints, const double *uhAtQP, const WorldVector<double> *grdUhAtQP, diff --git a/AMDiS/src/Operator.h b/AMDiS/src/Operator.h index 54fb1667..624c5a7d 100644 --- a/AMDiS/src/Operator.h +++ b/AMDiS/src/Operator.h @@ -845,54 +845,6 @@ namespace AMDiS { }; - /** - * \ingroup Assembler - * - * \brief - * Laplace multiplied with a function which maps the gradient of a DOFVector - * at each quadrature point to a double: - * \f$ f(\nabla v(\vec{x})) \Delta u(\vec{x}) \f$ - */ - class VecAndGradientAtQP_SOT : public SecondOrderTerm - { - public: - /// Constructor. - VecAndGradientAtQP_SOT(DOFVectorBase<double> *dv, - BinaryAbstractFunction<double, double, WorldVector<double> > *af); - - /// Implementation of \ref OperatorTerm::initElement(). - void initElement(const ElInfo* elInfo, SubAssembler* subAssembler, - Quadrature *quad = NULL); - - /// Implements SecondOrderTerm::getLALt(). - void getLALt(const ElInfo *elInfo, int nPoints, DimMat<double> **LALt) const; - - /// Implenetation of SecondOrderTerm::eval(). - void eval(int nPoints, - const double *uhAtQP, - const WorldVector<double> *grdUhAtQP, - const WorldMatrix<double> *D2UhAtQP, - double *result, - double factor); - - /// Implenetation of SecondOrderTerm::weakEval(). - void weakEval(const std::vector<WorldVector<double> > &grdUhAtQP, - std::vector<WorldVector<double> > &result); - - protected: - DOFVectorBase<double>* vec; - - /// Function wich maps \ref gradAtQPs to a double. - BinaryAbstractFunction<double, double, WorldVector<double> > *f; - - /** \brief - * Pointer to a WorldVector<double> array containing the gradients of the DOFVector - * at each quadrature point. - */ - double* vecAtQPs; - WorldVector<double>* gradAtQPs; - }; - /** * \ingroup Assembler * @@ -1819,7 +1771,7 @@ namespace AMDiS { { public: FctVecAtQP_FOT(DOFVectorBase<double> *dv, - AbstractFunction<double, WorldVector<double> > *f_, + BinaryAbstractFunction<double, WorldVector<double>, double> *f_, WorldVector<double> *b_); void initElement(const ElInfo* elInfo, SubAssembler* subAssembler, @@ -1839,7 +1791,7 @@ namespace AMDiS { DOFVectorBase<double>* vec; double *vecAtQPs; WorldVector<double> *coordsAtQPs; - AbstractFunction<double, WorldVector<double> > *f; + BinaryAbstractFunction<double, WorldVector<double>, double> *f; WorldVector<double> *b; }; @@ -1848,9 +1800,11 @@ namespace AMDiS { { public: Vec2AtQP_FOT(DOFVectorBase<double> *dv1, DOFVectorBase<double> *dv2, + BinaryAbstractFunction<double, double, double> *af, WorldVector<double> *b_); Vec2AtQP_FOT(DOFVectorBase<double> *dv1, DOFVectorBase<double> *dv2, + BinaryAbstractFunction<double, double, double> *af, int bIdx); void initElement(const ElInfo* elInfo, SubAssembler* subAssembler, @@ -1871,6 +1825,8 @@ namespace AMDiS { DOFVectorBase<double>* vec2; double *vec1AtQPs; double *vec2AtQPs; + /// Function f. + BinaryAbstractFunction<double, double, double> *f; WorldVector<double> *b; }; @@ -1879,11 +1835,11 @@ namespace AMDiS { { public: Vec3FctAtQP_FOT(DOFVectorBase<double> *dv1, DOFVectorBase<double> *dv2, DOFVectorBase<double> *dv3, - BinaryAbstractFunction<double, double, double> *f, + TertiaryAbstractFunction<double, double, double, double> *f, WorldVector<double> *b); Vec3FctAtQP_FOT(DOFVectorBase<double> *dv1, DOFVectorBase<double> *dv2, DOFVectorBase<double> *dv3, - BinaryAbstractFunction<double, double, double> *f, + TertiaryAbstractFunction<double, double, double, double> *f, int b); void initElement(const ElInfo* elInfo, SubAssembler* subAssembler, @@ -1903,7 +1859,7 @@ namespace AMDiS { DOFVectorBase<double>* vec1; DOFVectorBase<double>* vec2; DOFVectorBase<double>* vec3; - BinaryAbstractFunction<double, double, double>* f; + TertiaryAbstractFunction<double, double, double, double>* f; double *vec1AtQPs; double *vec2AtQPs; double *vec3AtQPs; @@ -2507,6 +2463,9 @@ namespace AMDiS { * \ingroup Assembler * * \brief + * Laplace multiplied with a function which maps the gradient of a DOFVector + * at each quadrature point to a double: + * \f$ f(\nabla v(\vec{x})) \Delta u(\vec{x}) \f$ */ class VecAndGradAtQP_SOT : public SecondOrderTerm { @@ -2521,7 +2480,7 @@ namespace AMDiS { /// Implements SecondOrderTerm::getLALt(). - inline void getLALt(const ElInfo *elInfo, int nPoints, DimMat<double> **LALt) const; + void getLALt(const ElInfo *elInfo, int nPoints, DimMat<double> **LALt) const; /// Implements SecondOrderTerm::eval(). void eval(int nPoints, -- GitLab