From af47f665ec73dc9e5c627dc335fcb2d946b12835 Mon Sep 17 00:00:00 2001 From: Amaury Johnan <amjohnen@gmail.com> Date: Wed, 21 Sep 2016 14:15:16 +0000 Subject: [PATCH] update scaled jacobian for tets --- Mesh/qualityMeasuresJacobian.cpp | 58 +++++++++++++++++++++++++------- Numeric/FuncSpaceData.h | 2 +- Numeric/bezierBasis.cpp | 13 +++++++ Numeric/bezierBasis.h | 2 ++ 4 files changed, 61 insertions(+), 14 deletions(-) diff --git a/Mesh/qualityMeasuresJacobian.cpp b/Mesh/qualityMeasuresJacobian.cpp index d48d320639..f70d472e60 100644 --- a/Mesh/qualityMeasuresJacobian.cpp +++ b/Mesh/qualityMeasuresJacobian.cpp @@ -663,10 +663,18 @@ void _CoeffDataScaledJac::_computeAtCorner(double &min, double &max) const 1/v(i,1)/v(i,2)) / 3; break; case TYPE_TET: - sJ = cTet * _coeffsJacDet(i) * (1/v(i,0)/v(i,1)/v(i,2) + - 1/v(i,0)/v(i,3)/v(i,4) + - 1/v(i,1)/v(i,3)/v(i,5) + - 1/v(i,2)/v(i,4)/v(i,5)) / 4; + sJ = cTet * _coeffsJacDet(i) * (1/v(i,0)/v(i,5)/v(i,1) + + 1/v(i,0)/v(i,5)/v(i,2) + + 1/v(i,0)/v(i,5)/v(i,3) + + 1/v(i,0)/v(i,5)/v(i,4) + + 1/v(i,1)/v(i,4)/v(i,0) + + 1/v(i,1)/v(i,4)/v(i,2) + + 1/v(i,1)/v(i,4)/v(i,3) + + 1/v(i,1)/v(i,4)/v(i,5) + + 1/v(i,2)/v(i,3)/v(i,0) + + 1/v(i,2)/v(i,3)/v(i,1) + + 1/v(i,2)/v(i,3)/v(i,4) + + 1/v(i,2)/v(i,3)/v(i,5)) / 12; break; case TYPE_PRI: sJ = cTri * _coeffsJacDet(i) * (1/v(i,0)/v(i,1)/v(i,2) + @@ -743,15 +751,39 @@ double _CoeffDataScaledJac::_computeLowerBound() const return cTri*result/3; case TYPE_TET: - raiser->computeCoeff(prox[0], prox[1], prox[2], coeffDenominator); - result += _computeBoundRational(_coeffsJacDet, coeffDenominator, true); - raiser->computeCoeff(prox[0], prox[3], prox[4], coeffDenominator); - result += _computeBoundRational(_coeffsJacDet, coeffDenominator, true); - raiser->computeCoeff(prox[1], prox[3], prox[5], coeffDenominator); - result += _computeBoundRational(_coeffsJacDet, coeffDenominator, true); - raiser->computeCoeff(prox[2], prox[4], prox[5], coeffDenominator); - result += _computeBoundRational(_coeffsJacDet, coeffDenominator, true); - return cTet*result/4; + { + fullVector<double> thirdTerm, coeffNum1, tmp; + thirdTerm = prox[1]; + thirdTerm.axpy(prox[2]); + thirdTerm.axpy(prox[3]); + thirdTerm.axpy(prox[4]); + raiser->computeCoeff(prox[0], prox[5], thirdTerm, coeffNum1); + thirdTerm = prox[0]; + thirdTerm.axpy(prox[2]); + thirdTerm.axpy(prox[3]); + thirdTerm.axpy(prox[5]); + raiser->computeCoeff(prox[1], prox[4], thirdTerm, tmp); + coeffNum1.axpy(tmp); + thirdTerm = prox[0]; + thirdTerm.axpy(prox[1]); + thirdTerm.axpy(prox[4]); + thirdTerm.axpy(prox[5]); + raiser->computeCoeff(prox[2], prox[3], thirdTerm, tmp); + coeffNum1.axpy(tmp); + + fullVector<double> coeffDen1, coeffDen2; + raiser->computeCoeff(prox[0], prox[1], prox[2], coeffDen1); + raiser->computeCoeff(prox[3], prox[4], prox[5], coeffDen2); + + fullVector<double> &coeffNumerator = tmp; + bezierBasisRaiser *raiserBis; + raiserBis = raiser->getRaisedBezierBasis(3)->getRaiser(); + raiserBis->computeCoeff(coeffNum1, _coeffsJacDet, coeffNumerator); + raiserBis->computeCoeff(coeffDen1, coeffDen2, coeffDenominator); + + result = _computeBoundRational(coeffNumerator, coeffDenominator, true); + return cTet*result/12; + } case TYPE_PYR: raiser->computeCoeff(prox[0], prox[1], prox[2], coeffDenominator); diff --git a/Numeric/FuncSpaceData.h b/Numeric/FuncSpaceData.h index b1bb7e57bd..637c707428 100644 --- a/Numeric/FuncSpaceData.h +++ b/Numeric/FuncSpaceData.h @@ -42,7 +42,7 @@ public: : _tag(-1), _spaceOrder(-1), _serendipity(false), _nij(-1), _nk(-1), _pyramidalSpace(false) {} - // Constructors of the function space of a different order + // Constructors for the function space of a different order FuncSpaceData(const FuncSpaceData &fsd, int order, const bool *serendip = NULL); diff --git a/Numeric/bezierBasis.cpp b/Numeric/bezierBasis.cpp index 88c5339af3..805f6e2154 100644 --- a/Numeric/bezierBasis.cpp +++ b/Numeric/bezierBasis.cpp @@ -959,6 +959,19 @@ void bezierBasisRaiser::_fillRaiserDataPyr() } } +const bezierBasis* bezierBasisRaiser::getRaisedBezierBasis(int mult2or3) +{ + if (mult2or3 != 2 && mult2or3 != 3) { + Msg::Error("There is no reason that I give you the bezier basis of order " + "%d times greater. Ask to another class/object", mult2or3); + return NULL; + } + FuncSpaceData initFuncSpace = _bfs->getFuncSpaceData(); + int newOrder = initFuncSpace.spaceOrder() * mult2or3; + FuncSpaceData raisedFuncSpace(initFuncSpace, newOrder); + return BasisFactory::getBezierBasis(raisedFuncSpace); +} + void bezierBasisRaiser::computeCoeff(const fullVector<double> &coeffA, const fullVector<double> &coeffB, fullVector<double> &coeffSquare) diff --git a/Numeric/bezierBasis.h b/Numeric/bezierBasis.h index c0d50bc707..ac31eb01a0 100644 --- a/Numeric/bezierBasis.h +++ b/Numeric/bezierBasis.h @@ -102,6 +102,8 @@ public: _fillRaiserData(); }; + const bezierBasis* getRaisedBezierBasis(int multipliedBy2or3); + // const bezierBasis* getRaisedBezierBasis(int raised) const; void computeCoeff(const fullVector<double> &coeffA, -- GitLab