// ============================================================================ // == == // == AMDiS - Adaptive multidimensional simulations == // == == // ============================================================================ // == == // == TU Dresden == // == == // == Institut für Wissenschaftliches Rechnen == // == Zellescher Weg 12-14 == // == 01069 Dresden == // == germany == // == == // ============================================================================ // == == // == https://gforge.zih.tu-dresden.de/projects/amdis/ == // == == // ============================================================================ /** \file FirstOrderTerm.h */ #ifndef AMDIS_FIRST_ORDER_TERM_H #define AMDIS_FIRST_ORDER_TERM_H #include "AMDiS_fwd.h" #include "OperatorTerm.h" #include "AbstractFunction.h" #include "ElInfo.h" namespace AMDiS { /** * \ingroup Assembler * * \brief * Describes the first order terms: \f$ b \cdot \nabla u(\vec{x}) \f$ */ class FirstOrderTerm : public OperatorTerm { public: /// Constructor. FirstOrderTerm(int deg) : OperatorTerm(deg) {} /// Destructor. virtual ~FirstOrderTerm() {} /// Evaluation of \f$ \Lambda b \f$. virtual void getLb(const ElInfo *elInfo, int nPoints, VectorOfFixVecs >& result) const = 0; /// Implenetation of FirstOrderTerm::eval(). void eval(int nPoints, const double *, const WorldVector *grdUhAtQP, const WorldMatrix *, double *result, double factor) { int dow = Global::getGeo(WORLD); if (grdUhAtQP) { for (int iq = 0; iq < nPoints; iq++) { double resultQP = 0.0; for (int i = 0; i < dow; i++) resultQP += grdUhAtQP[iq][i]; result[iq] += resultQP * factor; } } } protected: /** \brief * Evaluation of \f$ \Lambda \cdot b\f$ if b contains the value 1.0 in * each component. */ inline void l1(const DimVec >& Lambda, DimVec& Lb, double factor) const { const int dim = Lambda.getSize(); for (int i = 0; i < dim; i++) { double val = 0.0; for (int j = 0; j < dimOfWorld; j++) val += Lambda[i][j]; Lb[i] += val * factor; } } /// Evaluation of \f$ \Lambda \cdot b\f$. inline void lb(const DimVec >& Lambda, const WorldVector& b, DimVec& Lb, double factor) const { const int dim = Lambda.getSize(); for (int i = 0; i < dim; i++) { double val = 0.0; for (int j = 0; j < dimOfWorld; j++) val += Lambda[i][j] * b[j]; Lb[i] += val * factor; } } /// Evaluation of \f$ \Lambda \cdot b\f$. inline void lb_one(const DimVec >& Lambda, DimVec& Lb, double factor) const { const int dim = Lambda.getSize(); for (int i = 0; i < dim; i++) Lb[i] += Lambda[i][bOne] * factor; } }; /** * \ingroup Assembler * * \brief * First order term: \f$ b \cdot \nabla u(\vec{x}) \f$ with a vector b which * only consits of entries equal to one. */ class Simple_FOT : public FirstOrderTerm { public: /// Constructor. Simple_FOT() : FirstOrderTerm(0) {} /// Implements FirstOrderTerm::getLb(). inline void getLb(const ElInfo *elInfo, int nPoints, VectorOfFixVecs >& Lb) const { const DimVec > &Lambda = elInfo->getGrdLambda(); for (int iq = 0; iq < nPoints; iq++) l1(Lambda, Lb[iq], 1.0); } }; /** * \ingroup Assembler * * \brief * First order term: \f$ b \cdot \nabla u(\vec{x}) \f$ with a vector b which * only consits of entries equal to one. */ class FactorSimple_FOT : public FirstOrderTerm { public: /// Constructor. FactorSimple_FOT(double f) : FirstOrderTerm(0) { factor = new double; *factor = f; } /// Constructor. FactorSimple_FOT(double *fptr) : FirstOrderTerm(0), factor(fptr) {} /// Implements FirstOrderTerm::getLb(). inline void getLb(const ElInfo *elInfo, int nPoints, VectorOfFixVecs >& Lb) const { const DimVec > &Lambda = elInfo->getGrdLambda(); for (int iq = 0; iq < nPoints; iq++) l1(Lambda, Lb[iq], (*factor)); } private: /// Pointer to the factor. double *factor; }; /** * \ingroup Assembler * * \brief * First order term: \f$ b \cdot \nabla u(\vec{x}) \f$ with a given vector b. */ class Vector_FOT : public FirstOrderTerm { public: /// Constructor. Vector_FOT(WorldVector wv) : FirstOrderTerm(0), b(wv) {} /// Constructor. Vector_FOT(int bIdx) : FirstOrderTerm(0) { bOne = bIdx; } /// Implements FirstOrderTerm::getLb(). inline void getLb(const ElInfo *elInfo, int nPoints, VectorOfFixVecs >&Lb) const { const DimVec > &Lambda = elInfo->getGrdLambda(); if (bOne > -1) { for (int iq = 0; iq < nPoints; iq++) lb_one(Lambda, Lb[iq], 1.0); } else { for (int iq = 0; iq < nPoints; iq++) lb(Lambda, b, Lb[iq], 1.0); } } /// Implements FirstOrderTerm::eval(). void eval(int nPoints, const double *, const WorldVector *grdUhAtQP, const WorldMatrix *, double *result, double factor) { if (grdUhAtQP) for (int iq = 0; iq < nPoints; iq++) result[iq] += b * grdUhAtQP[iq] * factor; } protected: /// Vector which is multiplied with \f$ \nabla u(\vec{x}) \f$ WorldVector b; }; /** * \ingroup Assembler * * \brief * Simple_FOT multiplied with \f$ f(v(\vec{x})) \f$. */ class VecAtQP_FOT : public FirstOrderTerm { public: /// Constructor. VecAtQP_FOT(DOFVectorBase *dv, AbstractFunction *af, WorldVector *wv); /// Constructor. VecAtQP_FOT(DOFVectorBase *dv, AbstractFunction *af, int bIdx); /// Implementation of \ref OperatorTerm::initElement(). 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 >& Lb) const; /// Implements FirstOrderTerm::eval(). void eval(int nPoints, const double *uhAtQP, const WorldVector *grdUhAtQP, const WorldMatrix *D2UhAtQP, double *result, double factor); protected: /// DOFVector to be evaluated at quadrature points. DOFVectorBase* vec; /// v at quadrature points. double *vecAtQPs; /// Function f. AbstractFunction *f; /// WorldVector *b; }; /** * \ingroup Assembler * * \brief * Simple_FOT multiplied with \f$ f(\vec{x}) \f$. */ class CoordsAtQP_FOT : public FirstOrderTerm { public: /// Constructor. CoordsAtQP_FOT(AbstractFunction > *af) : FirstOrderTerm(af->getDegree()), g(af) {} /// Implementation of \ref OperatorTerm::initElement(). void initElement(const ElInfo* elInfo, SubAssembler* subAssembler, Quadrature *quad = NULL); /// Implements FistOrderTerm::getLb(). void getLb(const ElInfo *elInfo, int nPoints,VectorOfFixVecs >&Lb) const; /// Implements FirstOrderTerm::eval(). void eval(int nPoints, const double *uhAtQP, const WorldVector *grdUhAtQP, const WorldMatrix *D2UhAtQP, double *result, double factor); protected: /// Stores coordinates at quadrature points. Set in \ref initElement(). WorldVector* coordsAtQPs; /// Function avaluated at world coordinates. AbstractFunction > *g; }; /** * \ingroup Assembler * * \brief * Vector_FOT multiplied with \f$ f(\vec{x}) \f$. */ class VecCoordsAtQP_FOT : public FirstOrderTerm { public: /// Constructor. VecCoordsAtQP_FOT(AbstractFunction > *af, WorldVector wv) : FirstOrderTerm(af->getDegree()), g(af), b(wv) {} /// Implementation of \ref OperatorTerm::initElement(). void initElement(const ElInfo* elInfo, SubAssembler* subAssembler, Quadrature *quad = NULL); /// Implements FistOrderTerm::getLb(). void getLb(const ElInfo *elInfo, int nPoints, VectorOfFixVecs >& Lb) const; /// Implements FirstOrderTerm::eval(). void eval(int nPoints, const double *uhAtQP, const WorldVector *grdUhAtQP, const WorldMatrix *D2UhAtQP, double *result, double factor); protected: /// Stores coordinates at quadrature points. Set in \ref initElement(). WorldVector* coordsAtQPs; /// Function evaluated at world coordinates. AbstractFunction > *g; /// Coefficient vector. WorldVector b; }; /** * \ingroup Assembler * * \brief * First order term: \f$ b(\nabla v(\vec{x})) \cdot \nabla u(\vec{x})\f$. */ class VectorGradient_FOT : public FirstOrderTerm { public: /// Constructor. VectorGradient_FOT(DOFVectorBase *dv, AbstractFunction, WorldVector > *af); /// Implementation of \ref OperatorTerm::initElement(). void initElement(const ElInfo* elInfo, SubAssembler* subAssembler, Quadrature *quad = NULL); /// Implements FirstOrderTerm::getLb(). void getLb(const ElInfo *elInfo, int nPoints, VectorOfFixVecs >& Lb) const; /// Implements FirstOrderTerm::eval(). void eval(int nPoints, const double *uhAtQP, const WorldVector *grdUhAtQP, const WorldMatrix *D2UhAtQP, double *result, double factor); protected: DOFVectorBase* vec; /// Function for b. AbstractFunction, WorldVector > *f; /// Gradient of v at quadrature points. WorldVector *gradAtQPs; }; /** * \ingroup Assembler * * \brief * First order term: \f$ b(v(\vec{x})) \cdot \nabla u(\vec{x})\f$. */ class VectorFct_FOT : public FirstOrderTerm { public: /// Constructor. VectorFct_FOT(DOFVectorBase *dv, AbstractFunction, double> *fct); /// Implementation of \ref OperatorTerm::initElement(). void initElement(const ElInfo* elInfo, SubAssembler* subAssembler, Quadrature *quad = NULL); /// Implements FirstOrderTerm::getLb(). void getLb(const ElInfo *elInfo, int qPoint, VectorOfFixVecs >& Lb) const; /// Implements FirstOrderTerm::eval(). void eval(int nPoints, const double *uhAtQP, const WorldVector *grdUhAtQP, const WorldMatrix *D2UhAtQP, double *result, double factor); protected: /// DOFVector to be evaluated at quadrature points. DOFVectorBase* vec; /// Vector v at quadrature points. double *vecAtQPs; /// Function for b. AbstractFunction, double> *vecFct; }; /** * \ingroup Assembler * * \brief * */ class VecFctAtQP_FOT : public FirstOrderTerm { public: /// Constructor. VecFctAtQP_FOT(AbstractFunction, WorldVector > *af) : FirstOrderTerm(af->getDegree()), g(af) {} /// Implementation of \ref OperatorTerm::initElement(). void initElement(const ElInfo* elInfo, SubAssembler* subAssembler, Quadrature *quad = NULL); /// Implements FistOrderTerm::getLb(). void getLb(const ElInfo *elInfo, int nPoints, VectorOfFixVecs >&Lb) const; /// Implements FirstOrderTerm::eval(). void eval(int nPoints, const double *uhAtQP, const WorldVector *grdUhAtQP, const WorldMatrix *D2UhAtQP, double *result, double factor); protected: /// Stores coordinates at quadrature points. Set in \ref initElement(). WorldVector* coordsAtQPs; /// Function avaluated at world coordinates. AbstractFunction, WorldVector > *g; }; /** * \ingroup Assembler * * \brief * First order term: \f$ b(v(\vec{x}), \nabla w(\vec{x})) \cdot \nabla u(\vec{x})\f$. */ class VecGrad_FOT : public FirstOrderTerm { public: /// Constructor. VecGrad_FOT(DOFVectorBase *dv1, DOFVectorBase *dv2, BinaryAbstractFunction, double, WorldVector > *fct); /// Implementation of \ref OperatorTerm::initElement(). 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 qPoint, VectorOfFixVecs >& Lb) const; /// Implements FirstOrderTerm::eval(). void eval(int nPoints, const double *uhAtQP, const WorldVector *grdUhAtQP, const WorldMatrix *D2UhAtQP, double *result, double factor); protected: /// DOFVector to be evaluated at quadrature points. DOFVectorBase* vec1; DOFVectorBase* vec2; /// Vector v at quadrature points. double *vecAtQPs; WorldVector *gradAtQPs; /// Function for b. BinaryAbstractFunction, double, WorldVector > *vecFct; }; /** * \ingroup Assembler * * \brief * First order term: \f$ b(\nabla v(\vec{x}), \nabla w(\vec{x})) \cdot \nabla u(\vec{x})\f$. */ class FctGrad2_FOT : public FirstOrderTerm { public: /// Constructor FctGrad2_FOT(DOFVectorBase *dv1, DOFVectorBase *dv2, BinaryAbstractFunction, WorldVector, WorldVector > *vecFct_) : FirstOrderTerm(vecFct_->getDegree()), vec1(dv1), vec2(dv2), vecFct(vecFct_) {} /// Implementation of \ref OperatorTerm::initElement(). void initElement(const ElInfo* elInfo, SubAssembler* subAssembler, Quadrature *quad = NULL); /// Implements FirstOrderTerm::getLb(). void getLb(const ElInfo *elInfo, int qPoint, VectorOfFixVecs >& Lb) const; /// Implements FirstOrderTerm::eval(). void eval(int nPoints, const double *uhAtQP, const WorldVector *grdUhAtQP, const WorldMatrix *D2UhAtQP, double *result, double factor); protected: /// DOFVector to be evaluated at quadrature points. DOFVectorBase* vec1; /// DOFVector to be evaluated at quadrature points. DOFVectorBase* vec2; /// Gradient v at quadrature points. WorldVector *grad1AtQPs; /// Gradient v at quadrature points. WorldVector *grad2AtQPs; /// Function for b. BinaryAbstractFunction, WorldVector, WorldVector > *vecFct; }; class Vec2AndGradAtQP_FOT : public FirstOrderTerm { public: Vec2AndGradAtQP_FOT(DOFVectorBase *dv1, DOFVectorBase *dv2, TertiaryAbstractFunction > *f_, WorldVector *b_); void initElement(const ElInfo* elInfo, SubAssembler* subAssembler, Quadrature *quad = NULL); void getLb(const ElInfo *elInfo, int nPoints, VectorOfFixVecs >& Lb) const; void eval(int nPoints, const double *uhAtQP, const WorldVector *grdUhAtQP, const WorldMatrix *D2UhAtQP, double *result, double factor); protected: DOFVectorBase* vec1; DOFVectorBase* vec2; double *vec1AtQPs; double *vec2AtQPs; WorldVector *gradAtQPs1; TertiaryAbstractFunction > *f; WorldVector *b; }; class FctVecAtQP_FOT : public FirstOrderTerm { public: FctVecAtQP_FOT(DOFVectorBase *dv, BinaryAbstractFunction, double> *f_, WorldVector *b_); void initElement(const ElInfo* elInfo, SubAssembler* subAssembler, Quadrature *quad = NULL); void getLb(const ElInfo *elInfo, int nPoints, VectorOfFixVecs >& Lb) const; void eval(int nPoints, const double *uhAtQP, const WorldVector *grdUhAtQP, const WorldMatrix *D2UhAtQP, double *result, double factor); protected: DOFVectorBase* vec; double *vecAtQPs; WorldVector *coordsAtQPs; BinaryAbstractFunction, double> *f; WorldVector *b; }; class Vec2AtQP_FOT : public FirstOrderTerm { public: Vec2AtQP_FOT(DOFVectorBase *dv1, DOFVectorBase *dv2, BinaryAbstractFunction *af, WorldVector *b_); Vec2AtQP_FOT(DOFVectorBase *dv1, DOFVectorBase *dv2, BinaryAbstractFunction *af, int bIdx); void initElement(const ElInfo* elInfo, SubAssembler* subAssembler, Quadrature *quad = NULL); void getLb(const ElInfo *elInfo, int nPoints, VectorOfFixVecs >& Lb) const; void eval(int nPoints, const double *uhAtQP, const WorldVector *grdUhAtQP, const WorldMatrix *D2UhAtQP, double *result, double factor); protected: DOFVectorBase* vec1; DOFVectorBase* vec2; double *vec1AtQPs; double *vec2AtQPs; /// Function f. BinaryAbstractFunction *f; WorldVector *b; }; class Vec3FctAtQP_FOT : public FirstOrderTerm { public: Vec3FctAtQP_FOT(DOFVectorBase *dv1, DOFVectorBase *dv2, DOFVectorBase *dv3, TertiaryAbstractFunction *f, WorldVector *b); Vec3FctAtQP_FOT(DOFVectorBase *dv1, DOFVectorBase *dv2, DOFVectorBase *dv3, TertiaryAbstractFunction *f, int b); void initElement(const ElInfo* elInfo, SubAssembler* subAssembler, Quadrature *quad = NULL); void getLb(const ElInfo *elInfo, int nPoints, VectorOfFixVecs >& Lb) const; void eval(int nPoints, const double *uhAtQP, const WorldVector *grdUhAtQP, const WorldMatrix *D2UhAtQP, double *result, double factor); protected: DOFVectorBase* vec1; DOFVectorBase* vec2; DOFVectorBase* vec3; TertiaryAbstractFunction* f; double *vec1AtQPs; double *vec2AtQPs; double *vec3AtQPs; WorldVector *b; }; class General_FOT : public FirstOrderTerm { public: /// Constructor General_FOT(std::vector*> vecs, std::vector*> grads, TertiaryAbstractFunction, WorldVector, std::vector, std::vector > > *f); /// Implementation of \ref OperatorTerm::initElement(). void initElement(const ElInfo*, SubAssembler* , Quadrature *quad= NULL); /// Implements FirstOrderTerm::getLb(). void getLb(const ElInfo *elInfo, int nPoints, VectorOfFixVecs >& result) const; /// Implenetation of FirstOrderTerm::eval(). void eval(int nPoints, const double *uhAtQP, const WorldVector *grdUhAtQP, const WorldMatrix *D2UhAtQP, double *result, double factor); protected: std::vector*> vecs_; std::vector*> grads_; TertiaryAbstractFunction, WorldVector, std::vector, std::vector > > *f_; WorldVector *coordsAtQPs_; std::vector vecsAtQPs_; std::vector*> gradsAtQPs_; }; class GeneralParametric_FOT : public FirstOrderTerm { public: /// Constructor GeneralParametric_FOT(std::vector*> vecs, std::vector*> grads, QuartAbstractFunction, WorldVector, WorldVector, std::vector, std::vector > > *f); /// Implementation of \ref OperatorTerm::initElement(). void initElement(const ElInfo*, SubAssembler*, Quadrature *quad = NULL); /// Implements FirstOrderTerm::getLb(). void getLb(const ElInfo *elInfo, int nPoints, VectorOfFixVecs >& result) const; /// Implenetation of FirstOrderTerm::eval(). void eval(int nPoints, const double *uhAtQP, const WorldVector *grdUhAtQP, const WorldMatrix *D2UhAtQP, double *result, double factor); protected: std::vector*> vecs_; std::vector*> grads_; QuartAbstractFunction, WorldVector, WorldVector, std::vector, std::vector > > *f_; WorldVector *coordsAtQPs_; WorldVector elementNormal_; std::vector vecsAtQPs_; std::vector*> gradsAtQPs_; }; } #endif