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

cleanup

parent 46b9f33d
No related branches found
No related tags found
No related merge requests found
......@@ -89,87 +89,14 @@ double MetricBasis::minRCorner(MElement *el)
// Metric coefficients
fullMatrix<double> metCoeffLag;
switch (el->getDim()) {
case 0 :
return -1.;
case 1 :
case 2 :
Msg::Fatal("not implemented");
break;
case 3 :
{
fullMatrix<double> dxyzdX(nSampPnts,3), dxyzdY(nSampPnts,3), dxyzdZ(nSampPnts,3);
gradients->getGradientsFromNodes(nodes, &dxyzdX, &dxyzdY, &dxyzdZ);
metCoeffLag.resize(nSampPnts, 7);
for (int i = 0; i < nSampPnts; 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);
const double &dxdZ = dxyzdZ(i,0), &dydZ = dxyzdZ(i,1), &dzdZ = dxyzdZ(i,2);
const double dvxdX = dxdX*dxdX + dydX*dydX + dzdX*dzdX;
const double dvxdY = dxdY*dxdY + dydY*dydY + dzdY*dzdY;
const double dvxdZ = dxdZ*dxdZ + dydZ*dydZ + dzdZ*dzdZ;
metCoeffLag(i, 0) = (dvxdX + dvxdY + dvxdZ) / 3;
metCoeffLag(i, 1) = dvxdX - metCoeffLag(i, 0);
metCoeffLag(i, 2) = dvxdY - metCoeffLag(i, 0);
metCoeffLag(i, 3) = dvxdZ - metCoeffLag(i, 0);
const double fact = std::sqrt(2);
metCoeffLag(i, 4) = fact * (dxdX*dxdY + dydX*dydY + dzdX*dzdY);
metCoeffLag(i, 5) = fact * (dxdZ*dxdY + dydZ*dydY + dzdZ*dzdY);
metCoeffLag(i, 6) = fact * (dxdX*dxdZ + dydX*dydZ + dzdX*dzdZ);
}
}
break;
}
_fillCoeff(gradients, nodes, metCoeffLag);
// Jacobian coefficients
fullVector<double> jacLag(jacobian->getNumJacNodes());
jacobian->getSignedJacobian(nodes, jacLag);
// Compute min_corner(R)
double Rmin = 1.;
for (int i = 0; i < nSampPnts; ++i) {
if (jacLag(i) <= 0.) {
Rmin = std::min(Rmin, 0.);
}
else {
double q = metCoeffLag(i, 0);
double p = 0;
for (int k = 1; k < 7; ++k) {
p += pow_int(metCoeffLag(i, k), 2);
}
p = std::sqrt(p/6);
const double a = q/p;
if (a > 1e4) {
Rmin = std::min(Rmin, std::sqrt((a - std::sqrt(3)) / (a + std::sqrt(3))));
}
else {
const double x = .5 * (jacLag(i)/p/p*jacLag(i)/p - a*a*a + 3*a);
if (x > 1.1 || x < -1.1) {
Msg::Error("x much smaller than -1 or much greater than 1");
}
double tmpR;
if (x >= 1)
tmpR = (a - 1) / (a + 2);
else if (x <= -1)
tmpR = (a - 2) / (a + 1);
else {
const double phi = std::acos(x)/3;
tmpR = (a + 2*std::cos(phi + 2*M_PI/3)) / (a + 2*std::cos(phi));
}
if (tmpR < 0) {
if (tmpR < -1e-7) Msg::Error("negative R !!!");
else tmpR = 0;
}
Rmin = std::min(Rmin, std::sqrt(tmpR));
}
}
}
return Rmin;
return _computeMinlagR(jacLag, metCoeffLag, nSampPnts);
}
double MetricBasis::minSampledR(MElement *el, int order)
......@@ -244,41 +171,7 @@ double MetricBasis::getBoundMinR(MElement *el)
// Metric coefficients
fullMatrix<double> metCoeffLag;
switch (el->getDim()) {
case 0 :
return -1.;
case 1 :
case 2 :
Msg::Fatal("not implemented");
break;
case 3 :
{
fullMatrix<double> dxyzdX(nSampPnts,3), dxyzdY(nSampPnts,3), dxyzdZ(nSampPnts,3);
_gradients->getGradientsFromNodes(nodes, &dxyzdX, &dxyzdY, &dxyzdZ);
metCoeffLag.resize(nSampPnts, 7);
for (int i = 0; i < nSampPnts; 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);
const double &dxdZ = dxyzdZ(i,0), &dydZ = dxyzdZ(i,1), &dzdZ = dxyzdZ(i,2);
const double dvxdX = dxdX*dxdX + dydX*dydX + dzdX*dzdX;
const double dvxdY = dxdY*dxdY + dydY*dydY + dzdY*dzdY;
const double dvxdZ = dxdZ*dxdZ + dydZ*dydZ + dzdZ*dzdZ;
metCoeffLag(i, 0) = (dvxdX + dvxdY + dvxdZ) / 3;
metCoeffLag(i, 1) = dvxdX - metCoeffLag(i, 0);
metCoeffLag(i, 2) = dvxdY - metCoeffLag(i, 0);
metCoeffLag(i, 3) = dvxdZ - metCoeffLag(i, 0);
const double fact = std::sqrt(2);
metCoeffLag(i, 4) = fact * (dxdX*dxdY + dydX*dydY + dzdX*dzdY);
metCoeffLag(i, 5) = fact * (dxdZ*dxdY + dydZ*dydY + dzdZ*dzdY);
metCoeffLag(i, 6) = fact * (dxdX*dxdZ + dydX*dydZ + dzdX*dzdZ);
}
}
break;
}
_fillCoeff(_gradients, nodes, metCoeffLag);
fullMatrix<double> *metCoeff;
metCoeff = new fullMatrix<double>(nSampPnts, metCoeffLag.size2());
_bezier->matrixLag2Bez.mult(metCoeffLag, *metCoeff);
......@@ -641,47 +534,14 @@ void MetricBasis::_computeRmin(
double &RminLag, double &RminBez,
int depth, bool debug) const
{
RminLag = 1.;
for (int i = 0; i < _bezier->getNumLagCoeff(); ++i) {
if (jac(i) <= 0) {
RminLag = 0;
RminBez = 0;
return;
}
double q = coeff(i, 0);
double p = 0;
for (int k = 1; k < 7; ++k) {
p += pow_int(coeff(i, k), 2);
}
p = std::sqrt(p/6);
const double a = q/p;
if (a > 1e4) {
RminLag = std::min(RminLag, std::sqrt((a - std::sqrt(3)) / (a + std::sqrt(3))));
}
else {
const double x = .5 * (jac(i)/p/p*jac(i)/p - a*a*a + 3*a);
double tmpR;
if (x >= 1)
tmpR = (a - 1) / (a + 2);
else if (x <= -1)
tmpR = (a - 2) / (a + 1);
else {
const double phi = std::acos(x)/3;
tmpR = (a + 2*std::cos(phi + 2*M_PI/3)) / (a + 2*std::cos(phi));
}
if (tmpR <= 0) {
RminLag = 0;
RminLag = _computeMinlagR(jac, coeff, _bezier->getNumLagCoeff());
if (RminLag == 0) {
RminBez = 0;
return;
}
else RminLag = std::min(RminLag, std::sqrt(tmpR));
}
}
double minK;
_minJ2P3(coeff, jac, minK);
_minK(coeff, jac, minK);
if (minK < 1e-10) {
RminBez = 0;
return;
......@@ -810,23 +670,7 @@ void MetricBasis::_computeRmax(
RmaxLag = std::max(RmaxLag, std::sqrt((a - std::sqrt(3)) / (a + std::sqrt(3))));
}
else {
const double x = .5 * (jac(i)/p/p*jac(i)/p - a*a*a + 3*a);
double tmpR;
if (x >= 1)
tmpR = (a - 1) / (a + 2);
else if (x <= -1)
tmpR = (a - 2) / (a + 1);
else {
const double phi = std::acos(x)/3;
tmpR = (a + 2*std::cos(phi + 2*M_PI/3)) / (a + 2*std::cos(phi));
}
if (tmpR < 0) {
if (tmpR < -1e-7) Msg::Fatal("3 s normal ? %g (%g, %g, %g) or (%g, %g)",
tmpR, p/std::sqrt(6), q, jac(i)*jac(i),
q/p*std::sqrt(6), jac(i)*jac(i)/p/p/p*6*std::sqrt(6));
else tmpR = 0;
}
const double tmpR = _Rsafe(a, jac(i)/p/p*jac(i)/p);
RmaxLag = std::max(RmaxLag, std::sqrt(tmpR));
}
}
......@@ -932,10 +776,27 @@ void MetricBasis::_getMetricData(MElement *el, MetricData *&md) const
// Metric coefficients
fullMatrix<double> metCoeffLag;
_fillCoeff(_gradients, nodes, metCoeffLag);
fullMatrix<double> *metCoeff;
metCoeff = new fullMatrix<double>(nSampPnts, metCoeffLag.size2());
_bezier->matrixLag2Bez.mult(metCoeffLag, *metCoeff);
// Jacobian coefficients
fullVector<double> jacLag(_jacobian->getNumJacNodes());
fullVector<double> *jac = new fullVector<double>(_jacobian->getNumJacNodes());
_jacobian->getSignedJacobian(nodes, jacLag);
_jacobian->lag2Bez(jacLag, *jac);
switch (el->getDim()) {
md = new MetricData(metCoeff, jac, -1, 0, 0);
}
void MetricBasis::_fillCoeff(const GradientBasis *gradients,
fullMatrix<double> &nodes, fullMatrix<double> &coeff)
{
const int nSampPnts = gradients->getNumSamplingPoints();
switch (nodes.size2()) {
case 0 :
md = NULL;
return;
case 1 :
case 2 :
......@@ -945,9 +806,9 @@ void MetricBasis::_getMetricData(MElement *el, MetricData *&md) const
case 3 :
{
fullMatrix<double> dxyzdX(nSampPnts,3), dxyzdY(nSampPnts,3), dxyzdZ(nSampPnts,3);
_gradients->getGradientsFromNodes(nodes, &dxyzdX, &dxyzdY, &dxyzdZ);
gradients->getGradientsFromNodes(nodes, &dxyzdX, &dxyzdY, &dxyzdZ);
metCoeffLag.resize(nSampPnts, 7);
coeff.resize(nSampPnts, 7);
for (int i = 0; i < nSampPnts; 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);
......@@ -955,30 +816,46 @@ void MetricBasis::_getMetricData(MElement *el, MetricData *&md) const
const double dvxdX = dxdX*dxdX + dydX*dydX + dzdX*dzdX;
const double dvxdY = dxdY*dxdY + dydY*dydY + dzdY*dzdY;
const double dvxdZ = dxdZ*dxdZ + dydZ*dydZ + dzdZ*dzdZ;
metCoeffLag(i, 0) = (dvxdX + dvxdY + dvxdZ) / 3;
metCoeffLag(i, 1) = dvxdX - metCoeffLag(i, 0);
metCoeffLag(i, 2) = dvxdY - metCoeffLag(i, 0);
metCoeffLag(i, 3) = dvxdZ - metCoeffLag(i, 0);
coeff(i, 0) = (dvxdX + dvxdY + dvxdZ) / 3;
coeff(i, 1) = dvxdX - coeff(i, 0);
coeff(i, 2) = dvxdY - coeff(i, 0);
coeff(i, 3) = dvxdZ - coeff(i, 0);
const double fact = std::sqrt(2);
metCoeffLag(i, 4) = fact * (dxdX*dxdY + dydX*dydY + dzdX*dzdY);
metCoeffLag(i, 5) = fact * (dxdZ*dxdY + dydZ*dydY + dzdZ*dzdY);
metCoeffLag(i, 6) = fact * (dxdX*dxdZ + dydX*dydZ + dzdX*dzdZ);
coeff(i, 4) = fact * (dxdX*dxdY + dydX*dydY + dzdX*dzdY);
coeff(i, 5) = fact * (dxdZ*dxdY + dydZ*dydY + dzdZ*dzdY);
coeff(i, 6) = fact * (dxdX*dxdZ + dydX*dydZ + dzdX*dzdZ);
}
}
break;
}
}
fullMatrix<double> *metCoeff;
metCoeff = new fullMatrix<double>(nSampPnts, metCoeffLag.size2());
_bezier->matrixLag2Bez.mult(metCoeffLag, *metCoeff);
// Jacobian coefficients
fullVector<double> jacLag(_jacobian->getNumJacNodes());
fullVector<double> *jac = new fullVector<double>(_jacobian->getNumJacNodes());
_jacobian->getSignedJacobian(nodes, jacLag);
_jacobian->lag2Bez(jacLag, *jac);
md = new MetricData(metCoeff, jac, -1, 0, 0);
double MetricBasis::_computeMinlagR(const fullVector<double> &jac,
const fullMatrix<double> &coeff, int num)
{
double Rmin = 1.;
for (int i = 0; i < num; ++i) {
if (jac(i) <= 0.) {
return 0;
}
else {
double q = coeff(i, 0);
double p = 0;
for (int k = 1; k < 7; ++k) {
p += pow_int(coeff(i, k), 2);
}
p = std::sqrt(p/6);
const double a = q/p;
if (a > 1e4) {
Rmin = std::min(Rmin, std::sqrt((a - std::sqrt(3)) / (a + std::sqrt(3))));
}
else {
const double tmpR = _Rsafe(a, jac(i)/p/p*jac(i)/p);
Rmin = std::min(Rmin, std::sqrt(tmpR));
}
}
}
return Rmin;
}
void MetricBasis::_minMaxA(
......@@ -1012,7 +889,7 @@ void MetricBasis::_minMaxA(
max = std::sqrt(max);
}
void MetricBasis::_minJ2P3(const fullMatrix<double> &coeff,
void MetricBasis::_minK(const fullMatrix<double> &coeff,
const fullVector<double> &jac, double &min) const
{
fullVector<double> r(coeff.size1());
......
......@@ -78,9 +78,13 @@ private:
void _getMetricData(MElement*, MetricData*&) const;
double _subdivideForRmin(MetricData*, double RminLag, double tol) const;
static void _fillCoeff(const GradientBasis*,
fullMatrix<double> &nodes, fullMatrix<double> &coeff);
static double _computeMinlagR(const fullVector<double> &jac,
const fullMatrix<double> &coeff, int num);
void _minMaxA(const fullMatrix<double>&, double &min, double &max) const;
void _minJ2P3(const fullMatrix<double>&, const fullVector<double>&, double &min) const;
void _minK(const fullMatrix<double>&, const fullVector<double>&, double &min) const;
void _maxAstKpos(const fullMatrix<double>&, const fullVector<double>&,
double minK, double beta, double &maxa) const;
void _maxAstKneg(const fullMatrix<double>&, const fullVector<double>&,
......@@ -90,10 +94,26 @@ private:
void _maxKstAsharp(const fullMatrix<double>&, const fullVector<double>&,
double mina, double beta, double &maxK) const;
double _Rsafe(double a, double K) const {
static double _Rsafe(double a, double K) {
const double x = .5 * (K - a*a*a + 3*a);
if (x > 1+1e-13 || x < -1-1e-13) {
Msg::Warning("x = %g (|1+%g|)", x, std::abs(x)-1);
}
double ans;
if (x >= 1) ans = (a - 1) / (a + 2);
else if (x <= -1) ans = (a - 2) / (a + 1);
else {
const double phi = std::acos(x) / 3;
return (a + 2*std::cos(phi + 2*M_PI/3)) / (a + 2*std::cos(phi));
ans = (a + 2*std::cos(phi + 2*M_PI/3)) / (a + 2*std::cos(phi));
}
if (ans < 0 || ans > 1) {
Msg::Warning("R = %g", ans);
if (ans < 0) return 0;
else return 1;
}
return ans;
}
private:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment