Skip to content
Snippets Groups Projects
Commit af47f665 authored by Amaury Johnen's avatar Amaury Johnen
Browse files

update scaled jacobian for tets

parent 29d121c1
No related branches found
No related tags found
No related merge requests found
...@@ -663,10 +663,18 @@ void _CoeffDataScaledJac::_computeAtCorner(double &min, double &max) const ...@@ -663,10 +663,18 @@ void _CoeffDataScaledJac::_computeAtCorner(double &min, double &max) const
1/v(i,1)/v(i,2)) / 3; 1/v(i,1)/v(i,2)) / 3;
break; break;
case TYPE_TET: case TYPE_TET:
sJ = cTet * _coeffsJacDet(i) * (1/v(i,0)/v(i,1)/v(i,2) + sJ = cTet * _coeffsJacDet(i) * (1/v(i,0)/v(i,5)/v(i,1) +
1/v(i,0)/v(i,3)/v(i,4) + 1/v(i,0)/v(i,5)/v(i,2) +
1/v(i,1)/v(i,3)/v(i,5) + 1/v(i,0)/v(i,5)/v(i,3) +
1/v(i,2)/v(i,4)/v(i,5)) / 4; 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; break;
case TYPE_PRI: case TYPE_PRI:
sJ = cTri * _coeffsJacDet(i) * (1/v(i,0)/v(i,1)/v(i,2) + sJ = cTri * _coeffsJacDet(i) * (1/v(i,0)/v(i,1)/v(i,2) +
...@@ -743,15 +751,39 @@ double _CoeffDataScaledJac::_computeLowerBound() const ...@@ -743,15 +751,39 @@ double _CoeffDataScaledJac::_computeLowerBound() const
return cTri*result/3; return cTri*result/3;
case TYPE_TET: case TYPE_TET:
raiser->computeCoeff(prox[0], prox[1], prox[2], coeffDenominator); {
result += _computeBoundRational(_coeffsJacDet, coeffDenominator, true); fullVector<double> thirdTerm, coeffNum1, tmp;
raiser->computeCoeff(prox[0], prox[3], prox[4], coeffDenominator); thirdTerm = prox[1];
result += _computeBoundRational(_coeffsJacDet, coeffDenominator, true); thirdTerm.axpy(prox[2]);
raiser->computeCoeff(prox[1], prox[3], prox[5], coeffDenominator); thirdTerm.axpy(prox[3]);
result += _computeBoundRational(_coeffsJacDet, coeffDenominator, true); thirdTerm.axpy(prox[4]);
raiser->computeCoeff(prox[2], prox[4], prox[5], coeffDenominator); raiser->computeCoeff(prox[0], prox[5], thirdTerm, coeffNum1);
result += _computeBoundRational(_coeffsJacDet, coeffDenominator, true); thirdTerm = prox[0];
return cTet*result/4; 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: case TYPE_PYR:
raiser->computeCoeff(prox[0], prox[1], prox[2], coeffDenominator); raiser->computeCoeff(prox[0], prox[1], prox[2], coeffDenominator);
......
...@@ -42,7 +42,7 @@ public: ...@@ -42,7 +42,7 @@ public:
: _tag(-1), _spaceOrder(-1), _serendipity(false), _nij(-1), _nk(-1), : _tag(-1), _spaceOrder(-1), _serendipity(false), _nij(-1), _nk(-1),
_pyramidalSpace(false) {} _pyramidalSpace(false) {}
// Constructors of the function space of a different order // Constructors for the function space of a different order
FuncSpaceData(const FuncSpaceData &fsd, FuncSpaceData(const FuncSpaceData &fsd,
int order, int order,
const bool *serendip = NULL); const bool *serendip = NULL);
......
...@@ -959,6 +959,19 @@ void bezierBasisRaiser::_fillRaiserDataPyr() ...@@ -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, void bezierBasisRaiser::computeCoeff(const fullVector<double> &coeffA,
const fullVector<double> &coeffB, const fullVector<double> &coeffB,
fullVector<double> &coeffSquare) fullVector<double> &coeffSquare)
......
...@@ -102,6 +102,8 @@ public: ...@@ -102,6 +102,8 @@ public:
_fillRaiserData(); _fillRaiserData();
}; };
const bezierBasis* getRaisedBezierBasis(int multipliedBy2or3);
// const bezierBasis* getRaisedBezierBasis(int raised) const; // const bezierBasis* getRaisedBezierBasis(int raised) const;
void computeCoeff(const fullVector<double> &coeffA, void computeCoeff(const fullVector<double> &coeffA,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment