Skip to content
Snippets Groups Projects
Commit fce60a97 authored by Christophe Geuzaine's avatar Christophe Geuzaine
Browse files

- recode "delete" logic (with aliases and ref counter)

- re-add smooth() for PViewDataList
parent 25287db5
No related branches found
No related tags found
No related merge requests found
# $Id: Makefile,v 1.158 2007-08-24 20:14:18 geuzaine Exp $
# $Id: Makefile,v 1.159 2007-09-01 14:27:55 geuzaine Exp $
#
# Copyright (C) 1997-2007 C. Geuzaine, J.-F. Remacle
#
......@@ -248,7 +248,7 @@ Geo.o: Geo.cpp ../Common/Gmsh.h ../Common/Message.h ../DataStr/Malloc.h \
SPoint3.h SVector3.h SBoundingBox3d.h ExtrudeParams.h \
../Common/SmoothData.h GModel.h GVertex.h GEntity.h MVertex.h GPoint.h \
GEdge.h MElement.h MEdge.h ../Common/Hash.h MFace.h ../Common/Context.h \
GFace.h GEdgeLoop.h GRegion.h GeoInterpolation.h
GFace.h GEdgeLoop.h GRegion.h GeoInterpolation.h ../Parser/Parser.h
GeoStringInterface.o: GeoStringInterface.cpp ../Common/Gmsh.h \
../Common/Message.h ../DataStr/Malloc.h ../DataStr/List.h \
../DataStr/Tree.h ../DataStr/avl.h ../DataStr/Tools.h ../DataStr/List.h \
......
# $Id: Makefile,v 1.124 2007-08-31 17:28:42 geuzaine Exp $
# $Id: Makefile,v 1.125 2007-09-01 14:27:55 geuzaine Exp $
#
# Copyright (C) 1997-2007 C. Geuzaine, J.-F. Remacle
#
......@@ -200,7 +200,7 @@ ReadImg.o: ReadImg.cpp ReadImg.h ../Common/Gmsh.h ../Common/Message.h \
../Common/VertexArray.h ../Geo/SVector3.h ../Geo/SPoint3.h \
../Common/SmoothData.h ../Numeric/Numeric.h ../Post/AdaptiveViews.h \
../Common/GmshMatrix.h
Scale.o: Scale.cpp ../Common/Gmsh.h ../Common/Message.h \
Scale_Old.o: Scale_Old.cpp ../Common/Gmsh.h ../Common/Message.h \
../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
../DataStr/avl.h ../DataStr/Tools.h ../DataStr/List.h ../DataStr/Tree.h \
../Common/GmshUI.h ../Numeric/Numeric.h Draw.h ../Geo/SBoundingBox3d.h \
......@@ -208,14 +208,63 @@ Scale.o: Scale.cpp ../Common/Gmsh.h ../Common/Message.h \
../Post/ColorTable.h ../Common/VertexArray.h ../Geo/SVector3.h \
../Geo/SPoint3.h ../Common/SmoothData.h ../Post/AdaptiveViews.h \
../Common/GmshMatrix.h gl2ps.h
Graph2D.o: Graph2D.cpp ../Common/Gmsh.h ../Common/Message.h \
Scale.o: Scale.cpp ../Common/GmshUI.h Draw.h ../DataStr/List.h \
../Geo/SBoundingBox3d.h ../Geo/SPoint3.h ../Post/PView.h \
../Common/VertexArray.h ../Geo/SVector3.h ../Geo/SPoint3.h \
../Common/SmoothData.h ../Numeric/Numeric.h ../Post/AdaptiveViews.h \
../Common/GmshMatrix.h ../Post/PViewData.h ../Geo/GModel.h \
../Geo/GVertex.h ../Geo/GEntity.h ../Geo/Range.h ../Geo/SPoint3.h \
../Geo/SBoundingBox3d.h ../Common/GmshDefines.h ../Geo/MVertex.h \
../Geo/SPoint3.h ../Geo/GPoint.h ../Geo/SPoint2.h ../Geo/GEdge.h \
../Geo/GEntity.h ../Geo/GVertex.h ../Geo/SVector3.h ../Geo/SPoint3.h \
../Geo/SPoint2.h ../Geo/MElement.h ../Geo/MVertex.h ../Geo/MEdge.h \
../Geo/MVertex.h ../Geo/SVector3.h ../Common/Hash.h ../Geo/MFace.h \
../Geo/MVertex.h ../Geo/SVector3.h ../Common/Context.h \
../Geo/ExtrudeParams.h ../Geo/GFace.h ../Geo/GPoint.h ../Geo/GEntity.h \
../Geo/GEdgeLoop.h ../Geo/GEdge.h ../Geo/MElement.h ../Geo/SPoint2.h \
../Geo/SVector3.h ../Geo/Pair.h ../Geo/ExtrudeParams.h ../Geo/GRegion.h \
../Geo/GEntity.h ../Geo/MElement.h ../Geo/ExtrudeParams.h \
../Geo/SBoundingBox3d.h ../Post/PViewOptions.h ../Post/ColorTable.h \
gl2ps.h
Graph2D_Old.o: Graph2D_Old.cpp ../Common/Gmsh.h ../Common/Message.h \
../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
../DataStr/avl.h ../DataStr/Tools.h ../DataStr/List.h ../DataStr/Tree.h \
../Common/GmshUI.h ../Common/Context.h ../Numeric/Numeric.h Draw.h \
../Geo/SBoundingBox3d.h ../Geo/SPoint3.h ../Post/Views.h \
../Post/ColorTable.h ../Common/VertexArray.h ../Geo/SVector3.h \
../Geo/SPoint3.h ../Common/SmoothData.h ../Post/AdaptiveViews.h \
../Common/GmshMatrix.h gl2ps.h
../Common/GmshMatrix.h gl2ps.h ../Post/PView.h ../Post/AdaptiveViews.h \
../Post/PViewData.h ../Geo/GModel.h ../Geo/GVertex.h ../Geo/GEntity.h \
../Geo/Range.h ../Geo/SPoint3.h ../Geo/SBoundingBox3d.h \
../Common/GmshDefines.h ../Geo/MVertex.h ../Geo/SPoint3.h \
../Geo/GPoint.h ../Geo/SPoint2.h ../Geo/GEdge.h ../Geo/GEntity.h \
../Geo/GVertex.h ../Geo/SVector3.h ../Geo/SPoint3.h ../Geo/SPoint2.h \
../Geo/MElement.h ../Geo/MVertex.h ../Geo/MEdge.h ../Geo/MVertex.h \
../Geo/SVector3.h ../Common/Hash.h ../Geo/MFace.h ../Geo/MVertex.h \
../Geo/SVector3.h ../Geo/ExtrudeParams.h ../Geo/GFace.h ../Geo/GPoint.h \
../Geo/GEntity.h ../Geo/GEdgeLoop.h ../Geo/GEdge.h ../Geo/MElement.h \
../Geo/SPoint2.h ../Geo/SVector3.h ../Geo/Pair.h ../Geo/ExtrudeParams.h \
../Geo/GRegion.h ../Geo/GEntity.h ../Geo/MElement.h \
../Geo/ExtrudeParams.h ../Geo/SBoundingBox3d.h ../Post/PViewOptions.h \
../Post/ColorTable.h
Graph2D.o: Graph2D.cpp ../Common/GmshUI.h Draw.h ../DataStr/List.h \
../Geo/SBoundingBox3d.h ../Geo/SPoint3.h ../Post/PView.h \
../Common/VertexArray.h ../Geo/SVector3.h ../Geo/SPoint3.h \
../Common/SmoothData.h ../Numeric/Numeric.h ../Post/AdaptiveViews.h \
../Common/GmshMatrix.h ../Post/PViewData.h ../Geo/GModel.h \
../Geo/GVertex.h ../Geo/GEntity.h ../Geo/Range.h ../Geo/SPoint3.h \
../Geo/SBoundingBox3d.h ../Common/GmshDefines.h ../Geo/MVertex.h \
../Geo/SPoint3.h ../Geo/GPoint.h ../Geo/SPoint2.h ../Geo/GEdge.h \
../Geo/GEntity.h ../Geo/GVertex.h ../Geo/SVector3.h ../Geo/SPoint3.h \
../Geo/SPoint2.h ../Geo/MElement.h ../Geo/MVertex.h ../Geo/MEdge.h \
../Geo/MVertex.h ../Geo/SVector3.h ../Common/Hash.h ../Geo/MFace.h \
../Geo/MVertex.h ../Geo/SVector3.h ../Common/Context.h \
../Geo/ExtrudeParams.h ../Geo/GFace.h ../Geo/GPoint.h ../Geo/GEntity.h \
../Geo/GEdgeLoop.h ../Geo/GEdge.h ../Geo/MElement.h ../Geo/SPoint2.h \
../Geo/SVector3.h ../Geo/Pair.h ../Geo/ExtrudeParams.h ../Geo/GRegion.h \
../Geo/GEntity.h ../Geo/MElement.h ../Geo/ExtrudeParams.h \
../Geo/SBoundingBox3d.h ../Post/PViewOptions.h ../Post/ColorTable.h \
gl2ps.h
gl2ps.o: gl2ps.cpp gl2ps.h
gl2gif.o: gl2gif.cpp gl2gif.h PixelBuffer.h ../Common/Gmsh.h \
../Common/Message.h ../DataStr/Malloc.h ../DataStr/List.h \
......
// $Id: PView.cpp,v 1.3 2007-08-27 17:51:25 geuzaine Exp $
// $Id: PView.cpp,v 1.4 2007-09-01 14:27:55 geuzaine Exp $
//
// Copyright (C) 1997-2007 C. Geuzaine, J.-F. Remacle
//
......@@ -25,8 +25,75 @@
#include "PView.h"
#include "Message.h"
int PView::_globalNum = 0;
std::vector<PView*> PView::list;
PView::PView(bool allocate)
: _changed(true), _aliasOf(0), _links(0), _eye(0., 0., 0.),
va_points(0), va_lines(0), va_triangles(0), va_vectors(0),
normals(0), adaptive(0)
{
_num = ++_globalNum;
_data = new PViewDataList(allocate);
_options = new PViewOptions();
list.push_back(this);
// reset indices of all views
for(unsigned int i = 0; i < list.size(); i++) list[i]->setIndex(i);
}
PView::PView(PView *ref, bool copyOptions)
: _changed(true), _links(0), _eye(0., 0., 0.),
va_points(0), va_lines(0), va_triangles(0), va_vectors(0),
normals(0), adaptive(0)
{
_num = ++_globalNum;
_aliasOf = ref->getNum();
ref->getLinks()++;
_data = ref->getData();
if(copyOptions)
_options = new PViewOptions(*ref->getOptions());
else
_options = new PViewOptions();
list.push_back(this);
// reset indices of all views
for(unsigned int i = 0; i < list.size(); i++) list[i]->setIndex(i);
}
PView::~PView()
{
if(va_points) delete va_points;
if(va_lines) delete va_lines;
if(va_triangles) delete va_triangles;
if(va_vectors) delete va_vectors;
if(normals) delete normals;
if(adaptive) delete adaptive;
if(_options) delete _options;
std::vector<PView*>::iterator it = std::find(list.begin(), list.end(), this);
if(it != list.end()) list.erase(it);
if(!_data || _links > 0) return;
if(_aliasOf){
for(unsigned int i = 0; i < list.size(); i++){
if(list[i]->getNum() == _aliasOf){
// original data still exists so we can safely delete
delete _data;
list[i]->getLinks()--;
return;
}
}
// original is gone
int numAliases = 0;
for(unsigned int i = 0; i < list.size(); i++)
if(list[i]->getAliasOf() == _aliasOf)
numAliases++;
if(numAliases == 1) // no others aliases so safe to delete
delete _data;
}
}
void PView::setChanged(bool val)
{
_changed = val;
......@@ -44,4 +111,3 @@ PView *PView::current()
// return the last one for now
return list.back();
}
......@@ -31,6 +31,7 @@
// a post-processing view
class PView{
private:
static int _globalNum;
// unique tag of the view
int _num;
// index of the view in the current view list
......@@ -39,12 +40,10 @@ class PView{
bool _changed;
// flag to mark that the view is an alias of another view
int _aliasOf;
// flag to mark that some other views link to this one
bool _links;
// reference counter mark that some other views link to this one
int _links;
// name of the view
std::string _name;
// name of the file the view was loaded from
std::string _filename;
// eye position
SPoint3 _eye;
// the options
......@@ -52,29 +51,11 @@ class PView{
// the data
PViewData *_data;
public:
PView(bool allocate=true) :
_num(0), _index(0), _changed(true), _aliasOf(-1),
_links(false), _name(""), _filename(""), _eye(0., 0., 0.),
_options(0), _data(0), va_points(0), va_lines(0), va_triangles(0),
va_vectors(0), normals(0), adaptive(0)
{
_data = new PViewDataList(allocate);
_options = new PViewOptions;
list.push_back(this);
// reset indices
for(unsigned int i = 0; i < list.size(); i++) list[i]->setIndex(i);
}
~PView()
{
if(_options) delete _options;
if(_data) delete _data;
if(va_points) delete va_points;
if(va_lines) delete va_lines;
if(va_triangles) delete va_triangles;
if(va_vectors) delete va_vectors;
if(normals) delete normals;
if(adaptive) delete adaptive;
}
// default constructor
PView(bool allocate=true);
// alias constructor
PView(PView *ref, bool copyOptions=true);
~PView();
// the static list of all loaded views
static std::vector<PView*> list;
// the current view
......@@ -83,10 +64,13 @@ class PView{
PViewData *getData(){ return _data; }
std::string getName(){ return _name; }
void setName(std::string val){ _name = val; }
int getNum(){ return _num; }
int getIndex(){ return _index; }
void setIndex(int val){ _index = val; }
bool getChanged(){ return _changed; }
void setChanged(bool val);
int& getLinks(){ return _links; }
int getAliasOf(){ return _aliasOf; }
SPoint3 &getEye(){ return _eye; }
void setEye(SPoint3 &p){ _eye = p; }
void setGlobalResolutionLevel(int level)
......@@ -104,7 +88,6 @@ class PView{
smooth_normals *normals;
// adaptative rendering for high-order datasets
Adaptive_Post_View *adaptive;
};
#endif
// $Id: PViewData.cpp,v 1.7 2007-08-31 09:18:16 geuzaine Exp $
// $Id: PViewData.cpp,v 1.8 2007-09-01 14:27:55 geuzaine Exp $
//
// Copyright (C) 1997-2007 C. Geuzaine, J.-F. Remacle
//
......@@ -24,9 +24,13 @@
#include "PViewData.h"
#include "Numeric.h"
#include "SmoothData.h"
#include "Context.h"
extern Context_T CTX;
PViewDataList::PViewDataList(bool allocate)
: DataSize(sizeof(double)), NbTimeStep(0),
: PViewData(), DataSize(sizeof(double)), NbTimeStep(0),
Min(VAL_INF), Max(-VAL_INF), Time(0),
NbSP(0), SP(0), NbVP(0), VP(0), NbTP(0), TP(0),
NbSL(0), SL(0), NbVL(0), VL(0), NbTL(0), TL(0),
......@@ -129,6 +133,8 @@ void PViewDataList::finalize()
for(int j = 0; j <= i; j++)
_index[i] += nb[j];
}
if(CTX.post.smooth) smooth();
setDirty(false);
}
......@@ -203,7 +209,7 @@ void PViewDataList::_stat(List_T *list, int nbcomp, int nbelm, int nbnod)
NbTimeStep = N / (nbcomp * nbnod);
TimeStepMin.clear();
TimeStepMax.clear();
for(int j = 0; j < NbTimeStep; j++){
for(int j = 0; j < NbTimeStep; j++){
TimeStepMin.push_back(VAL_INF);
TimeStepMax.push_back(-VAL_INF);
}
......@@ -395,3 +401,86 @@ void PViewDataList::getString3D(int i, int step, std::string &str,
{
_getString(3, i, step, str, x, y, z, style);
}
static void generateConnectivities(List_T *list, int nbList,
int nbTimeStep, int nbVert,
smooth_data &data)
{
if(!nbList) return;
double *vals = new double[nbTimeStep];
int nb = List_Nbr(list) / nbList;
for(int i = 0; i < List_Nbr(list); i += nb) {
double *x = (double *)List_Pointer_Fast(list, i);
double *y = (double *)List_Pointer_Fast(list, i + nbVert);
double *z = (double *)List_Pointer_Fast(list, i + 2 * nbVert);
double *v = (double *)List_Pointer_Fast(list, i + 3 * nbVert);
for(int j = 0; j < nbVert; j++) {
for(int k = 0; k < nbTimeStep; k++)
vals[k] = v[j + k * nbVert];
data.add(x[j], y[j], z[j], nbTimeStep, vals);
}
}
delete [] vals;
}
static void smoothList(List_T *list, int nbList, double &min, double &max,
std::vector<double> &tsmin, std::vector<double> &tsmax,
int nbTimeStep, int nbVert, smooth_data &data)
{
if(!nbList) return;
double *vals = new double[nbTimeStep];
int nb = List_Nbr(list)/nbList;
for(int i = 0; i < List_Nbr(list); i += nb) {
double *x = (double *)List_Pointer_Fast(list, i);
double *y = (double *)List_Pointer_Fast(list, i + nbVert);
double *z = (double *)List_Pointer_Fast(list, i + 2 * nbVert);
double *v = (double *)List_Pointer_Fast(list, i + 3 * nbVert);
for(int j = 0; j < nbVert; j++) {
if(data.get(x[j], y[j], z[j], nbTimeStep, vals)){
for(int k = 0; k < nbTimeStep; k++) {
double dd = vals[k];
v[j + k * nbVert] = dd;
min = std::min(min, dd);
max = std::max(max, dd);
tsmin[k] = std::min(tsmin[k], dd);
tsmax[k] = std::max(tsmax[k], dd);
}
}
}
}
delete [] vals;
}
void PViewDataList::smooth()
{
double old_eps = xyzv::eps;
xyzv::eps = CTX.lc * 1.e-8;
if(NbSL || NbST || NbSQ || NbSS || NbSH || NbSI || NbSY) {
Min = VAL_INF;
Max = -VAL_INF;
TimeStepMin.clear();
TimeStepMax.clear();
for(int j = 0; j < NbTimeStep; j++){
TimeStepMin.push_back(VAL_INF);
TimeStepMax.push_back(-VAL_INF);
}
smooth_data data;
generateConnectivities(SL, NbSL, NbTimeStep, 2, data);
generateConnectivities(ST, NbST, NbTimeStep, 3, data);
generateConnectivities(SQ, NbSQ, NbTimeStep, 4, data);
generateConnectivities(SS, NbSS, NbTimeStep, 4, data);
generateConnectivities(SH, NbSH, NbTimeStep, 8, data);
generateConnectivities(SI, NbSI, NbTimeStep, 6, data);
generateConnectivities(SY, NbSY, NbTimeStep, 5, data);
smoothList(SL, NbSL, Min, Max, TimeStepMin, TimeStepMax, NbTimeStep, 2, data);
smoothList(ST, NbST, Min, Max, TimeStepMin, TimeStepMax, NbTimeStep, 3, data);
smoothList(SQ, NbSQ, Min, Max, TimeStepMin, TimeStepMax, NbTimeStep, 4, data);
smoothList(SS, NbSS, Min, Max, TimeStepMin, TimeStepMax, NbTimeStep, 4, data);
smoothList(SH, NbSH, Min, Max, TimeStepMin, TimeStepMax, NbTimeStep, 8, data);
smoothList(SI, NbSI, Min, Max, TimeStepMin, TimeStepMax, NbTimeStep, 6, data);
smoothList(SY, NbSY, Min, Max, TimeStepMin, TimeStepMax, NbTimeStep, 5, data);
}
xyzv::eps = old_eps;
}
......@@ -34,6 +34,8 @@ class PViewData {
private:
// flag to mark that the data is 'dirty' and should not be displayed
bool _dirty;
// name of the file the data was loaded from
std::string _filename;
public:
PViewData() : _dirty(true) {}
virtual ~PViewData(){}
......@@ -154,6 +156,7 @@ class PViewDataList : public PViewData {
double &x, double &y, double &style);
void getString3D(int i, int step, std::string &str,
double &x, double &y, double &z, double &style);
void smooth();
bool read(std::string filename);
};
......
// $Id: PViewOptions.cpp,v 1.14 2007-08-31 09:18:16 geuzaine Exp $
// $Id: PViewOptions.cpp,v 1.15 2007-09-01 14:27:55 geuzaine Exp $
//
// Copyright (C) 1997-2007 C. Geuzaine, J.-F. Remacle
//
......@@ -31,11 +31,15 @@
PViewOptions::PViewOptions()
{
for(int i = 0; i < 3; i++) GenRaise_f[i] = 0;
ColorTable_InitParam(2, &CT);
ColorTable_Recompute(&CT);
// FIXME: remove this once Options.cpp uses PViewOptions!
//Type = Plot3D;
Type = Plot3D;
//Type = Plot2DTime;
Type = Plot2DSpace;
//Type = Plot2DSpace;
AutoPosition = 1;
strcpy(Format, "%g");
......@@ -111,9 +115,6 @@ PViewOptions::PViewOptions()
color.text2d = 0;
color.text3d = 0;
color.axes = 0;
ColorTable_InitParam(2, &CT);
ColorTable_Recompute(&CT);
}
PViewOptions::~PViewOptions()
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment