#include "ZeroOrderTerm.h" #include "DOFVector.h" namespace AMDiS { // ========== VecAtQP_ZOT ========== VecAtQP_ZOT::VecAtQP_ZOT(DOFVectorBase *dv, AbstractFunction *af) : ZeroOrderTerm(af ? af->getDegree() : 0), vec(dv), f(af) { TEST_EXIT(dv)("No vector!\n"); auxFeSpaces.insert(dv->getFeSpace()); } void VecAtQP_ZOT::initElement(const ElInfo* elInfo, SubAssembler* subAssembler, Quadrature *quad) { getVectorAtQPs(vec, elInfo, subAssembler, quad, vecAtQPs); } void VecAtQP_ZOT::initElement(const ElInfo* smallElInfo, const ElInfo* largeElInfo, SubAssembler* subAssembler, Quadrature *quad) { getVectorAtQPs(vec, smallElInfo, largeElInfo, subAssembler, quad, vecAtQPs); } void VecAtQP_ZOT::getC(const ElInfo *, int nPoints, ElementVector& C) { if (f) { for (int iq = 0; iq < nPoints; iq++) C[iq] += (*f)(vecAtQPs[iq]); } else { for (int iq = 0; iq < nPoints; iq++) C[iq] += vecAtQPs[iq]; } } void VecAtQP_ZOT::eval(int nPoints, const ElementVector& uhAtQP, const WorldVector *grdUhAtQP, const WorldMatrix *D2UhAtQP, ElementVector& result, double fac) { if (f) { for (int iq = 0; iq < nPoints; iq++) result[iq] += fac * (*f)(vecAtQPs[iq]) * uhAtQP[iq]; } else { for (int iq = 0; iq < nPoints; iq++) result[iq] += fac * vecAtQPs[iq] * uhAtQP[iq]; } } // ========== MultVecAtQP_ZOT ========== MultVecAtQP_ZOT::MultVecAtQP_ZOT(DOFVectorBase *dv1, DOFVectorBase *dv2, AbstractFunction *af1, AbstractFunction *af2) : ZeroOrderTerm(af1->getDegree() + af2->getDegree()), vec1(dv1), vec2(dv2), f1(af1), f2(af2) { TEST_EXIT(dv1)("No first vector!\n"); TEST_EXIT(dv2)("No second vector!\n"); auxFeSpaces.insert(dv1->getFeSpace()); auxFeSpaces.insert(dv2->getFeSpace()); } void MultVecAtQP_ZOT::initElement(const ElInfo* elInfo, SubAssembler* subAssembler, Quadrature *quad) { getVectorAtQPs(vec1, elInfo, subAssembler, quad, vecAtQPs1); getVectorAtQPs(vec2, elInfo, subAssembler, quad, vecAtQPs2); } void MultVecAtQP_ZOT::getC(const ElInfo *, int nPoints, ElementVector& C) { for (int iq = 0; iq < nPoints; iq++) C[iq] += (*f1)(vecAtQPs1[iq]) * (*f2)(vecAtQPs2[iq]); } void MultVecAtQP_ZOT::eval(int nPoints, const ElementVector& uhAtQP, const WorldVector *grdUhAtQP, const WorldMatrix *D2UhAtQP, ElementVector& result, double fac) { for (int iq = 0; iq < nPoints; iq++) result[iq] += fac * (*f1)(vecAtQPs1[iq]) * (*f2)(vecAtQPs2[iq]) * uhAtQP[iq]; } // ========== Vec2AtQP_ZOT ========== Vec2AtQP_ZOT::Vec2AtQP_ZOT(DOFVectorBase *dv1, DOFVectorBase *dv2, BinaryAbstractFunction *af) : ZeroOrderTerm(af->getDegree()), vec1(dv1), vec2(dv2), f(af) { TEST_EXIT(dv1)("No first vector!\n"); TEST_EXIT(dv2)("No second vector!\n"); auxFeSpaces.insert(dv1->getFeSpace()); auxFeSpaces.insert(dv2->getFeSpace()); } void Vec2AtQP_ZOT::initElement(const ElInfo* elInfo, SubAssembler* subAssembler, Quadrature *quad) { getVectorAtQPs(vec1, elInfo, subAssembler, quad, vecAtQPs1); getVectorAtQPs(vec2, elInfo, subAssembler, quad, vecAtQPs2); } void Vec2AtQP_ZOT::initElement(const ElInfo* smallElInfo, const ElInfo* largeElInfo, SubAssembler* subAssembler, Quadrature *quad) { TEST_EXIT(vec1->getFeSpace() == vec2->getFeSpace())("Not yet implemented!\n"); getVectorAtQPs(vec1, smallElInfo, largeElInfo, subAssembler, quad, vecAtQPs1); getVectorAtQPs(vec2, smallElInfo, largeElInfo, subAssembler, quad, vecAtQPs2); } void Vec2AtQP_ZOT::getC(const ElInfo *, int nPoints, ElementVector& C) { for (int iq = 0; iq < nPoints; iq++) C[iq] += (*f)(vecAtQPs1[iq], vecAtQPs2[iq]); } void Vec2AtQP_ZOT::eval(int nPoints, const ElementVector& uhAtQP, const WorldVector *grdUhAtQP, const WorldMatrix *D2UhAtQP, ElementVector& result, double fac) { for (int iq = 0; iq < nPoints; iq++) result[iq] += fac * (*f)(vecAtQPs1[iq], vecAtQPs2[iq]) * uhAtQP[iq]; } // ========== Vec3AtQP_ZOT ========== Vec3AtQP_ZOT::Vec3AtQP_ZOT(DOFVectorBase *dv1, DOFVectorBase *dv2, DOFVectorBase *dv3, TertiaryAbstractFunction *af) : ZeroOrderTerm(af->getDegree()), vec1(dv1), vec2(dv2), vec3(dv3), f(af) { TEST_EXIT(dv1)("No first vector!\n"); TEST_EXIT(dv2)("No second vector!\n"); TEST_EXIT(dv3)("No thierd vector!\n"); auxFeSpaces.insert(dv1->getFeSpace()); auxFeSpaces.insert(dv2->getFeSpace()); auxFeSpaces.insert(dv3->getFeSpace()); } void Vec3AtQP_ZOT::initElement(const ElInfo* elInfo, SubAssembler* subAssembler, Quadrature *quad) { getVectorAtQPs(vec1, elInfo, subAssembler, quad, vecAtQPs1); getVectorAtQPs(vec2, elInfo, subAssembler, quad, vecAtQPs2); getVectorAtQPs(vec3, elInfo, subAssembler, quad, vecAtQPs3); } void Vec3AtQP_ZOT::getC(const ElInfo *, int nPoints, ElementVector& C) { for (int iq = 0; iq < nPoints; iq++) C[iq] += (*f)(vecAtQPs1[iq], vecAtQPs2[iq], vecAtQPs3[iq]); } void Vec3AtQP_ZOT::eval(int nPoints, const ElementVector& uhAtQP, const WorldVector *grdUhAtQP, const WorldMatrix *D2UhAtQP, ElementVector& result, double fac) { for (int iq = 0; iq < nPoints; iq++) result[iq] += fac * (*f)(vecAtQPs1[iq], vecAtQPs2[iq], vecAtQPs3[iq]) * uhAtQP[iq]; } // ========== FctGradientCoords_ZOT ========== FctGradientCoords_ZOT::FctGradientCoords_ZOT(DOFVectorBase *dv, BinaryAbstractFunction, WorldVector > *af) : ZeroOrderTerm(af->getDegree()), vec(dv), f(af) { TEST_EXIT(dv)("No vector!\n"); auxFeSpaces.insert(dv->getFeSpace()); } void FctGradientCoords_ZOT::initElement(const ElInfo* elInfo, SubAssembler* subAssembler, Quadrature *quad) { gradAtQPs = getGradientsAtQPs(vec, elInfo, subAssembler, quad); coordsAtQPs = subAssembler->getCoordsAtQPs(elInfo, quad); } void FctGradientCoords_ZOT::getC(const ElInfo *, int nPoints, ElementVector& C) { for (int iq = 0; iq < nPoints; iq++) C[iq] += (*f)(gradAtQPs[iq], coordsAtQPs[iq]); } void FctGradientCoords_ZOT::eval(int nPoints, const ElementVector& uhAtQP, const WorldVector *grdUhAtQP, const WorldMatrix *D2UhAtQP, ElementVector& result, double fac) { for (int iq = 0; iq < nPoints; iq++) result[iq] += fac * (*f)(gradAtQPs[iq], coordsAtQPs[iq]) * uhAtQP[iq]; } // ========== VecGradCoordsAtQP_ZOT ========== VecGradCoordsAtQP_ZOT::VecGradCoordsAtQP_ZOT(DOFVectorBase *dv, TertiaryAbstractFunction, WorldVector > *af) : ZeroOrderTerm(af->getDegree()), vec(dv), f(af) { TEST_EXIT(dv)("No vector!\n"); auxFeSpaces.insert(dv->getFeSpace()); } void VecGradCoordsAtQP_ZOT::initElement(const ElInfo* elInfo, SubAssembler* subAssembler, Quadrature *quad) { getVectorAtQPs(vec, elInfo, subAssembler, quad, vecAtQPs); gradAtQPs = getGradientsAtQPs(vec, elInfo, subAssembler, quad); coordsAtQPs = subAssembler->getCoordsAtQPs(elInfo, quad); } void VecGradCoordsAtQP_ZOT::getC(const ElInfo *, int nPoints, ElementVector& C) { for (int iq = 0; iq < nPoints; iq++) C[iq] += (*f)(vecAtQPs[iq], gradAtQPs[iq], coordsAtQPs[iq]); } void VecGradCoordsAtQP_ZOT::eval(int nPoints, const ElementVector& uhAtQP, const WorldVector *grdUhAtQP, const WorldMatrix *D2UhAtQP, ElementVector& result, double fac) { for (int iq = 0; iq < nPoints; iq++) result[iq] += fac * (*f)(vecAtQPs[iq], gradAtQPs[iq], coordsAtQPs[iq]) * uhAtQP[iq]; } // ========== VecAndCoordsAtQP_ZOT ========== VecAndCoordsAtQP_ZOT::VecAndCoordsAtQP_ZOT(DOFVectorBase *dv, BinaryAbstractFunction > *af) : ZeroOrderTerm(af->getDegree()), vec(dv), f(af) { TEST_EXIT(dv)("No vector!\n"); auxFeSpaces.insert(dv->getFeSpace()); } void VecAndCoordsAtQP_ZOT::initElement(const ElInfo* elInfo, SubAssembler* subAssembler, Quadrature *quad) { getVectorAtQPs(vec, elInfo, subAssembler, quad, vecAtQPs); coordsAtQPs = subAssembler->getCoordsAtQPs(elInfo, quad); } void VecAndCoordsAtQP_ZOT::getC(const ElInfo *, int nPoints, ElementVector& C) { for (int iq = 0; iq < nPoints; iq++) C[iq] += (*f)(vecAtQPs[iq], coordsAtQPs[iq]); } void VecAndCoordsAtQP_ZOT::eval(int nPoints, const ElementVector& uhAtQP, const WorldVector *grdUhAtQP, const WorldMatrix *D2UhAtQP, ElementVector& result, double fac) { for (int iq = 0; iq < nPoints; iq++) result[iq] += fac * (*f)(vecAtQPs[iq], coordsAtQPs[iq]) * uhAtQP[iq]; } // ========== Vec2AndGradAtQP_ZOT ========== Vec2AndGradAtQP_ZOT::Vec2AndGradAtQP_ZOT(DOFVectorBase *dv1, DOFVectorBase *dv2, TertiaryAbstractFunction, double > *af) : ZeroOrderTerm(af->getDegree()), vec1(dv1), vec2(dv2), f(af) { TEST_EXIT(dv1)("No first vector!\n"); TEST_EXIT(dv2)("No second vector!\n"); auxFeSpaces.insert(dv1->getFeSpace()); auxFeSpaces.insert(dv2->getFeSpace()); } void Vec2AndGradAtQP_ZOT::initElement(const ElInfo* elInfo, SubAssembler* subAssembler, Quadrature *quad) { getVectorAtQPs(vec1, elInfo, subAssembler, quad, vecAtQPs1); getVectorAtQPs(vec2, elInfo, subAssembler, quad, vecAtQPs2); gradAtQPs = getGradientsAtQPs(vec1, elInfo, subAssembler, quad); } void Vec2AndGradAtQP_ZOT::eval(int nPoints, const ElementVector& uhAtQP, const WorldVector *grdUhAtQP, const WorldMatrix *D2UhAtQP, ElementVector& result, double fac) { for (int iq = 0; iq < nPoints; iq++) result[iq] += fac * (*f)(vecAtQPs1[iq], gradAtQPs[iq], vecAtQPs2[iq]) * uhAtQP[iq]; } void Vec2AndGradAtQP_ZOT::getC(const ElInfo *, int nPoints, ElementVector& C) { for (int iq = 0; iq < nPoints; iq++) C[iq] += (*f)(vecAtQPs1[iq], gradAtQPs[iq], vecAtQPs2[iq]); } // ========== FctGradient_ZOT ========== FctGradient_ZOT::FctGradient_ZOT(DOFVectorBase *dv, AbstractFunction > *af) : ZeroOrderTerm(af->getDegree()), vec(dv), f(af) { TEST_EXIT(dv)("No vector!\n"); auxFeSpaces.insert(dv->getFeSpace()); } void FctGradient_ZOT::initElement(const ElInfo* elInfo, SubAssembler* subAssembler, Quadrature *quad) { gradAtQPs = getGradientsAtQPs(vec, elInfo, subAssembler, quad); } void FctGradient_ZOT::getC(const ElInfo *, int nPoints, ElementVector& C) { for (int iq = 0; iq < nPoints; iq++) C[iq] += (*f)(gradAtQPs[iq]); } void FctGradient_ZOT::eval(int nPoints, const ElementVector& uhAtQP, const WorldVector *grdUhAtQP, const WorldMatrix *D2UhAtQP, ElementVector& result, double fac) { for (int iq = 0; iq < nPoints; iq++) result[iq] += fac * (*f)(gradAtQPs[iq]) * uhAtQP[iq]; } // ========== VecAndGradAtQP_ZOT ========== VecAndGradAtQP_ZOT::VecAndGradAtQP_ZOT(DOFVectorBase *dv, BinaryAbstractFunction > *af) : ZeroOrderTerm(af->getDegree()), vec(dv), f(af) { TEST_EXIT(dv)("No vector!\n"); auxFeSpaces.insert(dv->getFeSpace()); } void VecAndGradAtQP_ZOT::initElement(const ElInfo* elInfo, SubAssembler* subAssembler, Quadrature *quad) { getVectorAtQPs(vec, elInfo, subAssembler, quad, vecAtQPs); gradAtQPs = getGradientsAtQPs(vec, elInfo, subAssembler, quad); } void VecAndGradAtQP_ZOT::getC(const ElInfo *, int nPoints, ElementVector& C) { for (int iq = 0; iq < nPoints; iq++) C[iq] += (*f)(vecAtQPs[iq], gradAtQPs[iq]); } void VecAndGradAtQP_ZOT::eval(int nPoints, const ElementVector& uhAtQP, const WorldVector *grdUhAtQP, const WorldMatrix *D2UhAtQP, ElementVector& result, double fac) { for (int iq = 0; iq < nPoints; iq++) result[iq] += fac * (*f)(vecAtQPs[iq], gradAtQPs[iq]) * uhAtQP[iq]; } // ========== VecAndGradVecAtQP_ZOT ========== VecAndGradVecAtQP_ZOT::VecAndGradVecAtQP_ZOT(DOFVectorBase *dv, DOFVectorBase *dGrd, BinaryAbstractFunction > *af) : ZeroOrderTerm(af->getDegree()), vec(dv), vecGrd(dGrd), f(af) { TEST_EXIT(dv)("No vector!\n"); TEST_EXIT(dGrd)("No gradient vector!\n"); auxFeSpaces.insert(dv->getFeSpace()); auxFeSpaces.insert(dGrd->getFeSpace()); } void VecAndGradVecAtQP_ZOT::initElement(const ElInfo* elInfo, SubAssembler* subAssembler, Quadrature *quad) { getVectorAtQPs(vec, elInfo, subAssembler, quad, vecAtQPs); gradAtQPs = getGradientsAtQPs(vecGrd, elInfo, subAssembler, quad); } void VecAndGradVecAtQP_ZOT::getC(const ElInfo *, int nPoints, ElementVector& C) { for (int iq = 0; iq < nPoints; iq++) C[iq] += (*f)(vecAtQPs[iq], gradAtQPs[iq]); } void VecAndGradVecAtQP_ZOT::eval(int nPoints, const ElementVector& uhAtQP, const WorldVector *grdUhAtQP, const WorldMatrix *D2UhAtQP, ElementVector& result, double fac) { for (int iq = 0; iq < nPoints; iq++) result[iq] += fac * (*f)(vecAtQPs[iq], gradAtQPs[iq]) * uhAtQP[iq]; } // ========== VecAndGradVec2AtQP_ZOT ========== VecAndGradVec2AtQP_ZOT::VecAndGradVec2AtQP_ZOT(DOFVectorBase *dv, DOFVectorBase *dGrd1, DOFVectorBase *dGrd2, TertiaryAbstractFunction, WorldVector > *af) : ZeroOrderTerm(af->getDegree()), vec(dv), vecGrd1(dGrd1), vecGrd2(dGrd2), f(af) { TEST_EXIT(dv)("No vector!\n"); TEST_EXIT(dGrd1)("No first gradient vector!\n"); TEST_EXIT(dGrd2)("No second gradient vector!\n"); auxFeSpaces.insert(dv->getFeSpace()); auxFeSpaces.insert(dGrd1->getFeSpace()); auxFeSpaces.insert(dGrd2->getFeSpace()); } void VecAndGradVec2AtQP_ZOT::initElement(const ElInfo* elInfo, SubAssembler* subAssembler, Quadrature *quad) { getVectorAtQPs(vec, elInfo, subAssembler, quad, vecAtQPs); grad1AtQPs = getGradientsAtQPs(vecGrd1, elInfo, subAssembler, quad); grad2AtQPs = getGradientsAtQPs(vecGrd2, elInfo, subAssembler, quad); } void VecAndGradVec2AtQP_ZOT::getC(const ElInfo *, int nPoints, ElementVector& C) { for (int iq = 0; iq < nPoints; iq++) C[iq] += (*f)(vecAtQPs[iq], grad1AtQPs[iq], grad2AtQPs[iq]); } void VecAndGradVec2AtQP_ZOT::eval(int nPoints, const ElementVector& uhAtQP, const WorldVector *grdUhAtQP, const WorldMatrix *D2UhAtQP, ElementVector& result, double fac) { for (int iq = 0; iq < nPoints; iq++) result[iq] += fac * (*f)(vecAtQPs[iq], grad1AtQPs[iq], grad2AtQPs[iq]) * uhAtQP[iq]; } // ========== VecOfDOFVecsAtQP_ZOT ========== VecOfDOFVecsAtQP_ZOT::VecOfDOFVecsAtQP_ZOT(const std::vector*>& dv, AbstractFunction > *af) : ZeroOrderTerm(af->getDegree()), vecs(dv), f(af) { vecsAtQPs.resize(vecs.size()); for (unsigned int i = 0; i < dv.size(); i++) { TEST_EXIT(dv[i])("One vector is NULL!\n"); auxFeSpaces.insert(dv[i]->getFeSpace()); } } void VecOfDOFVecsAtQP_ZOT::initElement(const ElInfo* elInfo, SubAssembler* subAssembler, Quadrature *quad) { unsigned int size = vecs.size(); for (unsigned int i = 0; i < size; i++) getVectorAtQPs(vecs[i], elInfo, subAssembler, quad, vecsAtQPs[i]); } void VecOfDOFVecsAtQP_ZOT::getC(const ElInfo *, int nPoints, ElementVector& C) { unsigned int size = vecs.size(); std::vector arg(size); for (int iq = 0; iq < nPoints; iq++) { for (unsigned int i = 0; i < size; i++) arg[i] = vecsAtQPs[i][iq]; C[iq] += (*f)(arg); } } void VecOfDOFVecsAtQP_ZOT::eval(int nPoints, const ElementVector& uhAtQP, const WorldVector *grdUhAtQP, const WorldMatrix *D2UhAtQP, ElementVector& result, double fac) { int size = static_cast(vecs.size()); std::vector arg(size); for (int iq = 0; iq < nPoints; iq++) { for (int i = 0; i < size; i++) arg[i] = vecsAtQPs[i][iq]; result[iq] += fac * (*f)(arg) * uhAtQP[iq]; } } // ========== VecOfGradientsAtQP_ZOT ========== VecOfGradientsAtQP_ZOT::VecOfGradientsAtQP_ZOT(const std::vector*>& dv, AbstractFunction*> > *af) : ZeroOrderTerm(af->getDegree()), vecs(dv), f(af) { gradsAtQPs.resize(vecs.size()); for (int i = 0; i < static_cast(dv.size()); i++) { TEST_EXIT(dv[i])("One vector is NULL!\n"); auxFeSpaces.insert(dv[i]->getFeSpace()); } } void VecOfGradientsAtQP_ZOT::initElement(const ElInfo* elInfo, SubAssembler* subAssembler, Quadrature *quad) { int size = static_cast(vecs.size()); for (int i = 0; i < size; i++) gradsAtQPs[i] = getGradientsAtQPs(vecs[i], elInfo, subAssembler, quad); } void VecOfGradientsAtQP_ZOT::getC(const ElInfo *, int nPoints, ElementVector& C) { int size = static_cast(vecs.size()); std::vector*> arg(size); for (int iq = 0; iq < nPoints; iq++) { for (int i = 0; i < size; i++) arg[i] = &(gradsAtQPs[i][iq]); C[iq] += (*f)(arg); } } void VecOfGradientsAtQP_ZOT::eval(int nPoints, const ElementVector& uhAtQP, const WorldVector *grdUhAtQP, const WorldMatrix *D2UhAtQP, ElementVector& result, double fac) { int size = static_cast(vecs.size()); std::vector*> arg(size); for (int iq = 0; iq < nPoints; iq++) { for (int i = 0; i < size; i++) arg[i] = &(gradsAtQPs[i][iq]); result[iq] += fac * (*f)(arg) * uhAtQP[iq]; } } // ========== VecDivergence_ZOT ========== VecDivergence_ZOT::VecDivergence_ZOT(int nComponents, DOFVectorBase *vec0, DOFVectorBase *vec1, DOFVectorBase *vec2) : ZeroOrderTerm(0) { vecs.resize(nComponents); gradsAtQPs.resize(nComponents); vecs[0] = vec0; vecs[1] = vec1; vecs[2] = vec2; auxFeSpaces.insert(vec0->getFeSpace()); if (vec1) auxFeSpaces.insert(vec1->getFeSpace()); if (vec2) auxFeSpaces.insert(vec2->getFeSpace()); } void VecDivergence_ZOT::initElement(const ElInfo* elInfo, SubAssembler* subAssembler, Quadrature *quad) { int size = static_cast(vecs.size()); for (int i = 0; i < size; i++) gradsAtQPs[i] = getGradientsAtQPs(vecs[i], elInfo, subAssembler, quad); } void VecDivergence_ZOT::getC(const ElInfo *, int nPoints, ElementVector& C) { int size = static_cast(vecs.size()); for (int iq = 0; iq < nPoints; iq++) for (int i = 0; i < size; i++) C[iq] += gradsAtQPs[i][iq][i]; } void VecDivergence_ZOT::eval(int nPoints, const ElementVector& uhAtQP, const WorldVector *grdUhAtQP, const WorldMatrix *D2UhAtQP, ElementVector& result, double fac) { int size = static_cast(vecs.size()); for (int iq = 0; iq < nPoints; iq++) { double d = 0.0; for (int i = 0; i < size; i++) d += gradsAtQPs[i][iq][i]; result[iq] += d * uhAtQP[iq] * fac; } } // ========== VecAndVecOfGradientsAtQP_ZOT ========= VecAndVecOfGradientsAtQP_ZOT::VecAndVecOfGradientsAtQP_ZOT(DOFVector *v, const std::vector*>& dv, BinaryAbstractFunction*> > *af) : ZeroOrderTerm(af->getDegree()), vec(v), vecs(dv), f(af) { gradsAtQPs.resize(vecs.size()); TEST_EXIT(v)("No vector!\n"); auxFeSpaces.insert(v->getFeSpace()); for (int i = 0; i < static_cast(dv.size()); i++) { TEST_EXIT(dv[i])("One gradient vector is NULL!\n"); auxFeSpaces.insert(dv[i]->getFeSpace()); } } void VecAndVecOfGradientsAtQP_ZOT::initElement(const ElInfo* elInfo, SubAssembler* subAssembler, Quadrature *quad) { int size = static_cast(vecs.size()); for (int i = 0; i < size; i++) gradsAtQPs[i] = getGradientsAtQPs(vecs[i], elInfo, subAssembler, quad); getVectorAtQPs(vec, elInfo, subAssembler, quad, vecAtQPs); } void VecAndVecOfGradientsAtQP_ZOT::getC(const ElInfo *, int nPoints, ElementVector& C) { int size = static_cast(vecs.size()); std::vector*> arg(size); for (int iq = 0; iq < nPoints; iq++) { for (int i = 0; i < size; i++) arg[i] = &(gradsAtQPs[i][iq]); C[iq] += (*f)(vecAtQPs[iq], arg); } } void VecAndVecOfGradientsAtQP_ZOT::eval(int nPoints, const ElementVector& uhAtQP, const WorldVector *grdUhAtQP, const WorldMatrix *D2UhAtQP, ElementVector& result, double fac) { int size = static_cast(vecs.size()); std::vector*> arg(size); for (int iq = 0; iq < nPoints; iq++) { for (int i = 0; i < size; i++) arg[i] = &(gradsAtQPs[i][iq]); result[iq] += fac * (*f)(vecAtQPs[iq], arg) * uhAtQP[iq]; } } // ========== Vec2AndGrad2AtQP_ZOT ========== Vec2AndGrad2AtQP_ZOT::Vec2AndGrad2AtQP_ZOT(DOFVectorBase *dv1, DOFVectorBase *dv2, QuartAbstractFunction,WorldVector > *af) : ZeroOrderTerm(af->getDegree()), vec1(dv1), vec2(dv2), f(af) { TEST_EXIT(dv1)("No first vector!\n"); TEST_EXIT(dv2)("No second vector!\n"); auxFeSpaces.insert(dv1->getFeSpace()); auxFeSpaces.insert(dv2->getFeSpace()); } void Vec2AndGrad2AtQP_ZOT::initElement(const ElInfo* elInfo, SubAssembler* subAssembler, Quadrature *quad) { getVectorAtQPs(vec1, elInfo, subAssembler, quad, vecAtQPs1); getVectorAtQPs(vec2, elInfo, subAssembler, quad, vecAtQPs2); gradAtQPs1 = getGradientsAtQPs(vec1, elInfo, subAssembler, quad); gradAtQPs2 = getGradientsAtQPs(vec2, elInfo, subAssembler, quad); } void Vec2AndGrad2AtQP_ZOT::eval(int nPoints, const ElementVector& uhAtQP, const WorldVector *grdUhAtQP, const WorldMatrix *D2UhAtQP, ElementVector& result, double fac) { for (int iq = 0; iq < nPoints; iq++) result[iq] += fac * (*f)(vecAtQPs1[iq], vecAtQPs2[iq], gradAtQPs1[iq], gradAtQPs2[iq]) * uhAtQP[iq]; } void Vec2AndGrad2AtQP_ZOT::getC(const ElInfo *, int nPoints, ElementVector& C) { for (int iq = 0; iq < nPoints; iq++) C[iq] += (*f)(vecAtQPs1[iq], vecAtQPs2[iq], gradAtQPs1[iq], gradAtQPs2[iq]); } // ========== Vec2AndGradVecAtQP_ZOT ========== Vec2AndGradVecAtQP_ZOT::Vec2AndGradVecAtQP_ZOT(DOFVectorBase *dv1, DOFVectorBase *dv2, DOFVectorBase *dGrd, TertiaryAbstractFunction > *af) : ZeroOrderTerm(af->getDegree()), vec1(dv1), vec2(dv2), vecGrd(dGrd), f(af) { TEST_EXIT(dv1)("No vector!\n"); TEST_EXIT(dv2)("No vector!\n"); TEST_EXIT(dGrd)("No gradient vector!\n"); auxFeSpaces.insert(dv1->getFeSpace()); auxFeSpaces.insert(dv2->getFeSpace()); auxFeSpaces.insert(dGrd->getFeSpace()); } void Vec2AndGradVecAtQP_ZOT::initElement(const ElInfo* elInfo, SubAssembler* subAssembler, Quadrature *quad) { getVectorAtQPs(vec1, elInfo, subAssembler, quad, vec1AtQPs); getVectorAtQPs(vec2, elInfo, subAssembler, quad, vec2AtQPs); gradAtQPs = getGradientsAtQPs(vecGrd, elInfo, subAssembler, quad); } void Vec2AndGradVecAtQP_ZOT::getC(const ElInfo *, int nPoints, ElementVector& C) { for (int iq = 0; iq < nPoints; iq++) C[iq] += (*f)(vec1AtQPs[iq], vec2AtQPs[iq], gradAtQPs[iq]); } void Vec2AndGradVecAtQP_ZOT::eval(int nPoints, const ElementVector& uhAtQP, const WorldVector *grdUhAtQP, const WorldMatrix *D2UhAtQP, ElementVector& result, double fac) { for (int iq = 0; iq < nPoints; iq++) result[iq] += fac * (*f)(vec1AtQPs[iq], vec2AtQPs[iq], gradAtQPs[iq]) * uhAtQP[iq]; } // =========== General_ZOT ========== General_ZOT::General_ZOT(std::vector*> vecs, std::vector*> grads, TertiaryAbstractFunction, std::vector, std::vector > > *af) : ZeroOrderTerm(af->getDegree()), vecs_(vecs), grads_(grads), f_(af) { vecsAtQPs.resize(vecs_.size()); gradsAtQPs_.resize(grads_.size()); for (int i = 0; i < static_cast(vecs.size()); i++) { TEST_EXIT(vecs[i])("One vector is NULL!\n"); auxFeSpaces.insert(vecs[i]->getFeSpace()); } for (int i = 0; i < static_cast(grads.size()); i++) { TEST_EXIT(grads[i])("One gradient vector is NULL!\n"); auxFeSpaces.insert(grads[i]->getFeSpace()); } vecsArg.resize(vecs_.size()); gradsArg.resize(grads_.size()); } void General_ZOT::initElement(const ElInfo* elInfo, SubAssembler* subAssembler, Quadrature *quad) { int nVecs = static_cast(vecs_.size()); int nGrads = static_cast(grads_.size()); coordsAtQPs_ = subAssembler->getCoordsAtQPs(elInfo, quad); for (int i = 0; i < nVecs; i++) getVectorAtQPs(vecs_[i], elInfo, subAssembler, quad, vecsAtQPs[i]); for (int i = 0; i < nGrads; i++) gradsAtQPs_[i] = getGradientsAtQPs(grads_[i], elInfo, subAssembler, quad); } void General_ZOT::getC(const ElInfo *, int nPoints, ElementVector& C) { unsigned int nVecs = vecs_.size(); unsigned int nGrads = grads_.size(); for (int iq = 0; iq < nPoints; iq++) { for (unsigned int i = 0; i < nVecs; i++) vecsArg[i] = vecsAtQPs[i][iq]; for (unsigned int i = 0; i < nGrads; i++) gradsArg[i] = gradsAtQPs_[i][iq]; C[iq] += (*f_)(coordsAtQPs_[iq], vecsArg, gradsArg); } } void General_ZOT::eval(int nPoints, const ElementVector& uhAtQP, const WorldVector *grdUhAtQP, const WorldMatrix *D2UhAtQP, ElementVector& result, double fac) { unsigned int nVecs = vecs_.size(); unsigned int nGrads = grads_.size(); for (int iq = 0; iq < nPoints; iq++) { for (unsigned int i = 0; i < nVecs; i++) vecsArg[i] = vecsAtQPs[i][iq]; for (unsigned int i = 0; i < nGrads; i++) gradsArg[i] = gradsAtQPs_[i][iq]; result[iq] += fac * (*f_)(coordsAtQPs_[iq], vecsArg, gradsArg) * uhAtQP[iq]; } } // ========== GeneralParametric_ZOT ========== GeneralParametric_ZOT::GeneralParametric_ZOT(std::vector*> vecs, std::vector*> grads, QuartAbstractFunction, WorldVector, std::vector, std::vector > > *af) : ZeroOrderTerm(af->getDegree()), vecs_(vecs), grads_(grads), f_(af) { vecsAtQPs.resize(vecs_.size()); gradsAtQPs.resize(grads_.size()); for (int i = 0; i < static_cast(vecs.size()); i++) { TEST_EXIT(vecs[i])("One vector is NULL!\n"); auxFeSpaces.insert(vecs[i]->getFeSpace()); } for (int i = 0; i < static_cast(grads.size()); i++) { TEST_EXIT(grads[i])("One gradient vector is NULL!\n"); auxFeSpaces.insert(grads[i]->getFeSpace()); } } void GeneralParametric_ZOT::initElement(const ElInfo* elInfo, SubAssembler* subAssembler, Quadrature *quad) { int nVecs = static_cast(vecs_.size()); int nGrads = static_cast(grads_.size()); elInfo->getElementNormal(elementNormal_); coordsAtQPs_ = subAssembler->getCoordsAtQPs(elInfo, quad); for (int i = 0; i < nVecs; i++) getVectorAtQPs(vecs_[i], elInfo, subAssembler, quad, vecsAtQPs[i]); for (int i = 0; i < nGrads; i++) gradsAtQPs[i] = getGradientsAtQPs(grads_[i], elInfo, subAssembler, quad); } void GeneralParametric_ZOT::getC(const ElInfo *, int nPoints, ElementVector& C) { int nVecs = static_cast(vecs_.size()); int nGrads = static_cast(grads_.size()); std::vector vecsArg(nVecs); std::vector > 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]; C[iq] += (*f_)(coordsAtQPs_[iq], elementNormal_, vecsArg, gradsArg); } } void GeneralParametric_ZOT::eval(int nPoints, const ElementVector& uhAtQP, const WorldVector *grdUhAtQP, const WorldMatrix *D2UhAtQP, ElementVector& result, double fac) { int nVecs = static_cast(vecs_.size()); int nGrads = static_cast(grads_.size()); std::vector vecsArg(nVecs); std::vector > 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]; result[iq] += fac * (*f_)(coordsAtQPs_[iq], elementNormal_, vecsArg, gradsArg) * uhAtQP[iq]; } } // ========== CoordsAtQP_ZOT ========== void CoordsAtQP_ZOT::initElement(const ElInfo* elInfo, SubAssembler* subAssembler, Quadrature *quad) { coordsAtQPs = subAssembler->getCoordsAtQPs(elInfo, quad); } void CoordsAtQP_ZOT::getC(const ElInfo *elInfo, int nPoints, ElementVector& C) { for (int iq = 0; iq < nPoints; iq++) C[iq] += (*g)(coordsAtQPs[iq]); } void CoordsAtQP_ZOT::eval(int nPoints, const ElementVector& uhAtQP, const WorldVector *grdUhAtQP, const WorldMatrix *D2UhAtQP, ElementVector& result, double fac) { for (int iq = 0; iq < nPoints; iq++) result[iq] += fac * (*g)(coordsAtQPs[iq]) * uhAtQP[iq]; } }