From a3c2a6c92f6cb9e7be4ee775a6e10c30b6751eaf Mon Sep 17 00:00:00 2001 From: Thomas Toulorge <thomas.toulorge@mines-paristech.fr> Date: Wed, 17 Sep 2014 14:02:20 +0000 Subject: [PATCH] Disabled mapping from ideal element when calculatin Jacobian, introduced in r19425 --- Numeric/JacobianBasis.cpp | 50 +++++++++++++++++++++++++-------------- Numeric/JacobianBasis.h | 9 +++++-- Numeric/MetricBasis.cpp | 11 +++++---- Numeric/MetricBasis.h | 1 + 4 files changed, 46 insertions(+), 25 deletions(-) diff --git a/Numeric/JacobianBasis.cpp b/Numeric/JacobianBasis.cpp index 7b8980fdd9..485910cae1 100644 --- a/Numeric/JacobianBasis.cpp +++ b/Numeric/JacobianBasis.cpp @@ -322,7 +322,7 @@ double JacobianBasis::getPrimJac3D(const fullMatrix<double> &nodesXYZ) const // Calculate (signed, possibly scaled) Jacobian for one element, with normal vectors to straight element // for regularization. Evaluation points depend on the given matrices for shape function gradients. -template<bool scaling> +template<bool scaling, bool ideal> inline void JacobianBasis::getJacobianGeneral(int nJacNodes, const fullMatrix<double> &gSMatX, const fullMatrix<double> &gSMatY, const fullMatrix<double> &gSMatZ, const fullMatrix<double> &nodesXYZ, fullVector<double> &jacobian) const @@ -362,7 +362,7 @@ inline void JacobianBasis::getJacobianGeneral(int nJacNodes, const fullMatrix<do fullMatrix<double> dxyzdX(nJacNodes,3), dxyzdY(nJacNodes,3); gSMatX.mult(nodesXYZ, dxyzdX); gSMatY.mult(nodesXYZ, dxyzdY); - if (!scaling) _gradBasis->mapFromIdealElement(&dxyzdX, &dxyzdY, NULL); + if (ideal) _gradBasis->mapFromIdealElement(&dxyzdX, &dxyzdY, NULL); for (int i = 0; i < nJacNodes; i++) { const double &dxdX = dxyzdX(i,0), &dydX = dxyzdX(i,1), &dzdX = dxyzdX(i,2); const double &dxdY = dxyzdY(i,0), &dydY = dxyzdY(i,1), &dzdY = dxyzdY(i,2); @@ -378,7 +378,7 @@ inline void JacobianBasis::getJacobianGeneral(int nJacNodes, const fullMatrix<do gSMatX.mult(nodesXYZ, dxyzdX); gSMatY.mult(nodesXYZ, dxyzdY); gSMatZ.mult(nodesXYZ, dxyzdZ); - if (!scaling) _gradBasis->mapFromIdealElement(&dxyzdX, &dxyzdY, &dxyzdZ); + if (ideal) _gradBasis->mapFromIdealElement(&dxyzdX, &dxyzdY, &dxyzdZ); for (int i = 0; i < nJacNodes; i++) { const double &dxdX = dxyzdX(i,0), &dydX = dxyzdX(i,1), &dzdX = dxyzdX(i,2); const double &dxdY = dxyzdY(i,0), &dydY = dxyzdY(i,1), &dzdY = dxyzdY(i,2); @@ -402,7 +402,7 @@ void JacobianBasis::getSignedJacobianGeneral(int nJacNodes, const fullMatrix<dou const fullMatrix<double> &gSMatY, const fullMatrix<double> &gSMatZ, const fullMatrix<double> &nodesXYZ, fullVector<double> &jacobian) const { - getJacobianGeneral<false>(nJacNodes, gSMatX, gSMatY, gSMatZ, nodesXYZ, jacobian); + getJacobianGeneral<false, false>(nJacNodes, gSMatX, gSMatY, gSMatZ, nodesXYZ, jacobian); } // Calculate (signed) scaled Jacobian for one element, with normal vectors to straight element @@ -411,13 +411,13 @@ void JacobianBasis::getScaledJacobianGeneral(int nJacNodes, const fullMatrix<dou const fullMatrix<double> &gSMatY, const fullMatrix<double> &gSMatZ, const fullMatrix<double> &nodesXYZ, fullVector<double> &jacobian) const { - getJacobianGeneral<true>(nJacNodes, gSMatX, gSMatY, gSMatZ, nodesXYZ, jacobian); + getJacobianGeneral<true, false>(nJacNodes, gSMatX, gSMatY, gSMatZ, nodesXYZ, jacobian); } // Calculate (signed, possibly scaled) Jacobian for several elements, with normal vectors to straight // elements for regularization. Evaluation points depend on the given matrices for shape function gradients. // TODO: Optimize and test 1D & 2D -template<bool scaling> +template<bool scaling, bool ideal> inline void JacobianBasis::getJacobianGeneral(int nJacNodes, const fullMatrix<double> &gSMatX, const fullMatrix<double> &gSMatY, const fullMatrix<double> &gSMatZ, const fullMatrix<double> &nodesX, const fullMatrix<double> &nodesY, @@ -465,7 +465,7 @@ inline void JacobianBasis::getJacobianGeneral(int nJacNodes, const fullMatrix<do fullMatrix<double> dxdY(nJacNodes,numEl), dydY(nJacNodes,numEl), dzdY(nJacNodes,numEl); gSMatX.mult(nodesX, dxdX); gSMatX.mult(nodesY, dydX); gSMatX.mult(nodesZ, dzdX); gSMatY.mult(nodesX, dxdY); gSMatY.mult(nodesY, dydY); gSMatY.mult(nodesZ, dzdY); - if (!scaling) { + if (ideal) { _gradBasis->mapFromIdealElement(&dxdX, &dxdY, NULL); _gradBasis->mapFromIdealElement(&dydX, &dydY, NULL); _gradBasis->mapFromIdealElement(&dzdX, &dzdY, NULL); @@ -500,7 +500,7 @@ inline void JacobianBasis::getJacobianGeneral(int nJacNodes, const fullMatrix<do gSMatX.mult(nodesX, dxdX); gSMatX.mult(nodesY, dydX); gSMatX.mult(nodesZ, dzdX); gSMatY.mult(nodesX, dxdY); gSMatY.mult(nodesY, dydY); gSMatY.mult(nodesZ, dzdY); gSMatZ.mult(nodesX, dxdZ); gSMatZ.mult(nodesY, dydZ); gSMatZ.mult(nodesZ, dzdZ); - if (!scaling) { + if (ideal) { _gradBasis->mapFromIdealElement(&dxdX, &dxdY, &dxdZ); _gradBasis->mapFromIdealElement(&dydX, &dydY, &dydZ); _gradBasis->mapFromIdealElement(&dzdX, &dzdY, &dzdZ); @@ -535,7 +535,7 @@ void JacobianBasis::getSignedJacobianGeneral(int nJacNodes, const fullMatrix<dou const fullMatrix<double> &nodesX, const fullMatrix<double> &nodesY, const fullMatrix<double> &nodesZ, fullMatrix<double> &jacobian) const { - getJacobianGeneral<false>(nJacNodes, gSMatX, gSMatY, gSMatZ, nodesX, nodesY, nodesZ, jacobian); + getJacobianGeneral<false, false>(nJacNodes, gSMatX, gSMatY, gSMatZ, nodesX, nodesY, nodesZ, jacobian); } // Calculate (signed) scaled Jacobian for several elements, with normal vectors to straight elements @@ -545,17 +545,19 @@ void JacobianBasis::getScaledJacobianGeneral(int nJacNodes, const fullMatrix<dou const fullMatrix<double> &nodesX, const fullMatrix<double> &nodesY, const fullMatrix<double> &nodesZ, fullMatrix<double> &jacobian) const { - getJacobianGeneral<true>(nJacNodes, gSMatX, gSMatY, gSMatZ, nodesX, nodesY, nodesZ, jacobian); + getJacobianGeneral<true, false>(nJacNodes, gSMatX, gSMatY, gSMatZ, nodesX, nodesY, nodesZ, jacobian); } // Calculate (signed) Jacobian and its gradients for one element, with normal vectors to straight element // for regularization. Evaluation points depend on the given matrices for shape function gradients. -void JacobianBasis::getSignedJacAndGradientsGeneral(int nJacNodes, const fullMatrix<double> &gSMatX, - const fullMatrix<double> &gSMatY, - const fullMatrix<double> &gSMatZ, - const fullMatrix<double> &nodesXYZ, - const fullMatrix<double> &normals, - fullMatrix<double> &JDJ) const +template<bool ideal> +inline void JacobianBasis::getSignedJacAndGradientsGeneral(int nJacNodes, + const fullMatrix<double> &gSMatX, + const fullMatrix<double> &gSMatY, + const fullMatrix<double> &gSMatZ, + const fullMatrix<double> &nodesXYZ, + const fullMatrix<double> &normals, + fullMatrix<double> &JDJ) const { switch (_dim) { @@ -593,7 +595,7 @@ void JacobianBasis::getSignedJacAndGradientsGeneral(int nJacNodes, const fullMat fullMatrix<double> dxyzdX(nJacNodes,3), dxyzdY(nJacNodes,3); gSMatX.mult(nodesXYZ, dxyzdX); gSMatY.mult(nodesXYZ, dxyzdY); - _gradBasis->mapFromIdealElement(&dxyzdX, &dxyzdY, NULL); + if (ideal) _gradBasis->mapFromIdealElement(&dxyzdX, &dxyzdY, NULL); for (int i = 0; i < nJacNodes; i++) { const double &dxdX = dxyzdX(i,0), &dydX = dxyzdX(i,1), &dzdX = dxyzdX(i,2); const double &dxdY = dxyzdY(i,0), &dydY = dxyzdY(i,1), &dzdY = dxyzdY(i,2); @@ -623,7 +625,7 @@ void JacobianBasis::getSignedJacAndGradientsGeneral(int nJacNodes, const fullMat gSMatX.mult(nodesXYZ, dxyzdX); gSMatY.mult(nodesXYZ, dxyzdY); gSMatZ.mult(nodesXYZ, dxyzdZ); - _gradBasis->mapFromIdealElement(&dxyzdX, &dxyzdY, &dxyzdZ); + if (ideal) _gradBasis->mapFromIdealElement(&dxyzdX, &dxyzdY, &dxyzdZ); for (int i = 0; i < nJacNodes; i++) { const double &dxdX = dxyzdX(i,0), &dydX = dxyzdX(i,1), &dzdX = dxyzdX(i,2); const double &dxdY = dxyzdY(i,0), &dydY = dxyzdY(i,1), &dzdY = dxyzdY(i,2); @@ -654,6 +656,18 @@ void JacobianBasis::getSignedJacAndGradientsGeneral(int nJacNodes, const fullMat } +void JacobianBasis::getSignedJacAndGradientsGeneral(int nJacNodes, + const fullMatrix<double> &gSMatX, + const fullMatrix<double> &gSMatY, + const fullMatrix<double> &gSMatZ, + const fullMatrix<double> &nodesXYZ, + const fullMatrix<double> &normals, + fullMatrix<double> &JDJ) const +{ + getSignedJacAndGradientsGeneral<false>(nJacNodes, gSMatX, gSMatY, gSMatZ, nodesXYZ, normals, JDJ); +} + + void JacobianBasis::getMetricMinAndGradients(const fullMatrix<double> &nodesXYZ, const fullMatrix<double> &nodesXYZStraight, fullVector<double> &lambdaJ, fullMatrix<double> &gradLambdaJ) const diff --git a/Numeric/JacobianBasis.h b/Numeric/JacobianBasis.h index ca744f6e57..4dd280ecc8 100644 --- a/Numeric/JacobianBasis.h +++ b/Numeric/JacobianBasis.h @@ -125,11 +125,11 @@ class JacobianBasis { private : - template<bool scaling> + template<bool scaling, bool ideal> inline void getJacobianGeneral(int nJacNodes, const fullMatrix<double> &gSMatX, const fullMatrix<double> &gSMatY, const fullMatrix<double> &gSMatZ, const fullMatrix<double> &nodesXYZ, fullVector<double> &jacobian) const; - template<bool scaling> + template<bool scaling, bool ideal> inline void getJacobianGeneral(int nJacNodes, const fullMatrix<double> &gSMatX, const fullMatrix<double> &gSMatY, const fullMatrix<double> &gSMatZ, const fullMatrix<double> &nodesX, const fullMatrix<double> &nodesY, @@ -149,6 +149,11 @@ class JacobianBasis { const fullMatrix<double> &nodesX, const fullMatrix<double> &nodesY, const fullMatrix<double> &nodesZ, fullMatrix<double> &jacobian) const; + template<bool ideal> + inline void getSignedJacAndGradientsGeneral(int nJacNodes, const fullMatrix<double> &gSMatX, + const fullMatrix<double> &gSMatY, const fullMatrix<double> &gSMatZ, + const fullMatrix<double> &nodesXYZ, const fullMatrix<double> &normals, + fullMatrix<double> &JDJ) const; void getSignedJacAndGradientsGeneral(int nJacNodes, const fullMatrix<double> &gSMatX, const fullMatrix<double> &gSMatY, const fullMatrix<double> &gSMatZ, const fullMatrix<double> &nodesXYZ, const fullMatrix<double> &normals, diff --git a/Numeric/MetricBasis.cpp b/Numeric/MetricBasis.cpp index 189a5d2953..36cbfbb9db 100644 --- a/Numeric/MetricBasis.cpp +++ b/Numeric/MetricBasis.cpp @@ -95,7 +95,7 @@ double MetricBasis::minRCorner(MElement *el) // Metric coefficients fullMatrix<double> metCoeffLag; - _fillCoeff(el->getDim(), gradients, nodes, metCoeffLag); + _fillCoeff<false>(el->getDim(), gradients, nodes, metCoeffLag); // Compute min_corner(R) return _computeMinlagR(jacLag, metCoeffLag, nSampPnts); @@ -183,7 +183,7 @@ double MetricBasis::getBoundMinR(MElement *el) // Metric coefficients fullMatrix<double> metCoeffLag; - _fillCoeff(el->getDim(), _gradients, nodes, metCoeffLag); + _fillCoeff<false>(el->getDim(), _gradients, nodes, metCoeffLag); fullMatrix<double> *metCoeff; metCoeff = new fullMatrix<double>(nSampPnts, metCoeffLag.size2()); _bezier->matrixLag2Bez.mult(metCoeffLag, *metCoeff); @@ -808,7 +808,7 @@ void MetricBasis::_getMetricData(MElement *el, MetricData *&md) const // Metric coefficients fullMatrix<double> metCoeffLag; - _fillCoeff(el->getDim(), _gradients, nodes, metCoeffLag); + _fillCoeff<false>(el->getDim(), _gradients, nodes, metCoeffLag); fullMatrix<double> *metCoeff; metCoeff = new fullMatrix<double>(nSampPnts, metCoeffLag.size2()); _bezier->matrixLag2Bez.mult(metCoeffLag, *metCoeff); @@ -816,6 +816,7 @@ void MetricBasis::_getMetricData(MElement *el, MetricData *&md) const md = new MetricData(metCoeff, jac, -1, 0, 0); } +template<bool ideal> void MetricBasis::_fillCoeff(int dim, const GradientBasis *gradients, fullMatrix<double> &nodes, fullMatrix<double> &coeff) { @@ -832,7 +833,7 @@ void MetricBasis::_fillCoeff(int dim, const GradientBasis *gradients, { fullMatrix<double> dxydX(nSampPnts,3), dxydY(nSampPnts,3); gradients->getGradientsFromNodes(nodes, &dxydX, &dxydY, NULL); - gradients->mapFromIdealElement(&dxydX, &dxydY, NULL); + if (ideal) gradients->mapFromIdealElement(&dxydX, &dxydY, NULL); coeff.resize(nSampPnts, 3); for (int i = 0; i < nSampPnts; i++) { @@ -851,7 +852,7 @@ void MetricBasis::_fillCoeff(int dim, const GradientBasis *gradients, { fullMatrix<double> dxyzdX(nSampPnts,3), dxyzdY(nSampPnts,3), dxyzdZ(nSampPnts,3); gradients->getGradientsFromNodes(nodes, &dxyzdX, &dxyzdY, &dxyzdZ); - gradients->mapFromIdealElement(&dxyzdX, &dxyzdY, &dxyzdZ); + if (ideal) gradients->mapFromIdealElement(&dxyzdX, &dxyzdY, &dxyzdZ); coeff.resize(nSampPnts, 7); for (int i = 0; i < nSampPnts; i++) { diff --git a/Numeric/MetricBasis.h b/Numeric/MetricBasis.h index bab7253e53..fc15f45a5c 100644 --- a/Numeric/MetricBasis.h +++ b/Numeric/MetricBasis.h @@ -78,6 +78,7 @@ private: void _getMetricData(MElement*, MetricData*&) const; double _subdivideForRmin(MetricData*, double RminLag, double tol) const; + template<bool ideal> static void _fillCoeff(int dim, const GradientBasis*, fullMatrix<double> &nodes, fullMatrix<double> &coeff); static double _computeMinlagR(const fullVector<double> &jac, -- GitLab