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

fix memory leak

parent 26ca193d
No related branches found
No related tags found
No related merge requests found
......@@ -770,6 +770,7 @@ fullMatrix<double> JacobianBasis::generateJacMonomialsPyramid(int order)
monomials(index, 2) = k;
}
}
return monomials;
}
......
......@@ -12,11 +12,8 @@
#include <queue>
#include <sstream>
//#include "Gmsh.h"
//#include "GmshMessage.h"
//#include "polynomialBasis.h"
//#include <fstream>
//#include "PView.h"
#include "GmshMessage.h"
#include "PView.h"
#if defined(HAVE_OPENGL)
#include "drawContext.h"
......@@ -211,7 +208,7 @@ PView *GMSH_AnalyseCurvedMeshPlugin::execute(PView *v)
MElement *const el = _data[i].element();
if (el->getDim() == _dim) {
double val = _computeMetric ? _data[i].minR() : _data[i].minJ();
if (_data[i].maxJ() - _data[i].minJ() < _tol * 1e-2)
if (_data[i].maxJ() - _data[i].minJ() < _tol * 1e-1)
(*dataPV1)[el->getNum()].push_back(val);
else
(*dataPV2)[el->getNum()].push_back(val);
......@@ -298,6 +295,8 @@ void GMSH_AnalyseCurvedMeshPlugin::_computeMinMaxJandValidity(MElement *const*el
return;
}
_data.reserve(_data.size() + numEl);
const int numSamplingPt = jfs->getNumJacNodes();
const int numMapNodes = jfs->getNumMapNodes();
fullVector<double> jacobian(numSamplingPt);
......@@ -324,17 +323,23 @@ void GMSH_AnalyseCurvedMeshPlugin::_computeMinMaxJandValidity(MElement *const*el
bj->subDivisions(subJacBez);
currentDepth = bj->depth() + 1;
if (currentDepth > 20) Msg::Error("depth is too damn high !");
if (currentDepth > 20) {
static int a = 0;
if (++a == 1)
Msg::Error("depth is too damn high ! elem type %d",
el[k]->getTypeForMSH());
}
for (int i = 0; i < jfs->getNumDivisions(); i++) {
jacBez.setAsProxy(subJacBez, i * numSamplingPt, numSamplingPt);
bj = new BezierJacobian(jacBez, jfs, currentDepth);
minL = std::min(minL, bj->minL());
maxL = std::max(maxL, bj->maxL());
BezierJacobian *newbj = new BezierJacobian(jacBez, jfs, currentDepth);
minL = std::min(minL, newbj->minL());
maxL = std::max(maxL, newbj->maxL());
heap.push_back(bj);
heap.push_back(newbj);
push_heap(heap.begin(), heap.end(), lessMinVal());
}
delete bj;
}
make_heap(heap.begin(), heap.end(), lessMax());
......@@ -346,17 +351,23 @@ void GMSH_AnalyseCurvedMeshPlugin::_computeMinMaxJandValidity(MElement *const*el
bj->subDivisions(subJacBez);
currentDepth = bj->depth() + 1;
if (currentDepth > 20) Msg::Error("depth is too damn high !");
if (currentDepth > 20) {
static int a = 0;
if (++a == 1)
Msg::Error("depth is too damn high ! elem type %d",
el[k]->getTypeForMSH());
}
for (int i = 0; i < jfs->getNumDivisions(); i++) {
jacBez.setAsProxy(subJacBez, i * numSamplingPt, numSamplingPt);
bj = new BezierJacobian(jacBez, jfs, currentDepth);
minL = std::min(minL, bj->minL());
maxL = std::max(maxL, bj->maxL());
BezierJacobian *newbj = new BezierJacobian(jacBez, jfs, currentDepth);
minL = std::min(minL, newbj->minL());
maxL = std::max(maxL, newbj->maxL());
heap.push_back(bj);
heap.push_back(newbj);
push_heap(heap.begin(), heap.end(), lessMax());
}
delete bj;
}
double minB = minL;
......@@ -364,41 +375,8 @@ void GMSH_AnalyseCurvedMeshPlugin::_computeMinMaxJandValidity(MElement *const*el
for (unsigned int i = 0; i < heap.size(); ++i) {
minB = std::min(minB, heap[i]->minB());
maxB = std::max(maxB, heap[i]->maxB());
delete heap[i];
}
// TODO REMOVE #include "BasisFactory.h"
/*if (el[k]->getNum() == 26776) {
Msg::Info("%g %g %g %g", minB, minL, maxL, maxB);
/ *const nodalBasis* nb = BasisFactory::getNodalBasis(el[k]->getTypeForMSH());
int tag1 = ElementType::getTag(el[k]->getType(), 1);
const nodalBasis* nb1 = BasisFactory::getNodalBasis(tag1);
//double *f;
//f = new double[nb1->points.size1()];
fullMatrix<double> f;
nb1->f(nb->points, f);
Msg::Info("SIZES [%d %d] (%d, %d)", f.size1(), f.size2(), nb->points.size1(), nb1->points.size1());
for (int i = 0; i < nb->points.size1(); ++i) {
double X[3] = {0, 0, 0};
for (int j = 0; j < f.size2(); ++j) {
X[0] += el[k]->getVertex(j)->x() * f(i, j);
X[1] += el[k]->getVertex(j)->y() * f(i, j);
X[2] += el[k]->getVertex(j)->z() * f(i, j);
}
if (std::abs(X[0] - el[k]->getVertex(i)->x()) < 1e-12 &&
std::abs(X[1] - el[k]->getVertex(i)->y()) < 1e-12 &&
std::abs(X[2] - el[k]->getVertex(i)->z()) < 1e-12);
else {
Msg::Info("aaarg %d/%d : [%g %g %g] ([%g %g %g])", i+1, nb->points.size1(),
el[k]->getVertex(i)->x(), el[k]->getVertex(i)->y(), el[k]->getVertex(i)->z(),
X[0], X[1], X[2]);
}
}* /
}*/
_data.push_back(CurvedMeshPluginData(el[k], minB, maxB));
}
}
......
......@@ -10,6 +10,7 @@
#include "JacobianBasis.h"
#include "MetricBasis.h"
#include "MElement.h"
#include "OS.h"
#include <vector>
......@@ -46,6 +47,7 @@ private :
double _threshold, _tol;
int _numPView, _computeMetric;
bool _recompute;
bool _computedR3D, _computedR2D;
bool _computedJ3D, _computedJ2D, _computedJ1D;
bool _1PViewJ, _2PViewJ, _1PViewR, _2PViewR;
......@@ -75,6 +77,25 @@ public :
int getNbOptions() const;
StringXNumber *getOption(int);
PView *execute(PView *);
void setTol(double tol) {_tol = tol;}
void computeMinJ(MElement *const *el, int numEl, double *minJ, bool *straight) {
std::vector<CurvedMeshPluginData> save(_data);
_data.clear();
double time = Cpu();
//Rmv add OS.H
_computeMinMaxJandValidity(el, numEl);
if (minJ) {
for (unsigned int i = 0; i < _data.size(); ++i) {
minJ[i] = _data[i].minJ();
}
}
if (straight) {
for (unsigned int i = 0; i < _data.size(); ++i) {
straight[i] = _data[i].maxJ() - _data[i].minJ() < _tol * 1e-1;
}
}
_data = save;
}
private :
void _computeMinMaxJandValidity();
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment