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

better combineTime

parent 11b3db15
No related branches found
No related tags found
No related merge requests found
......@@ -515,33 +515,12 @@ bool PViewDataGModel::combineTime(nameData &nd)
for(unsigned int i = 0; i < it->second.size(); i++)
_interpolation[it->first].push_back(new fullMatrix<double>(*it->second[i]));
for(unsigned int i = 0; i < data.size(); i++){
// FIXME: this is a horrible hack (we copy the data twice, and use
// a map!); we need to store the number of values per
// node/ele/... in stepData and provide a copy constructor, then
// just copy the stepData
for(unsigned int j = 0; j < data[i]->_steps.size(); j++){
if(data[i]->hasTimeStep(j)){
std::map<int, std::vector<double> > datamap;
if(getType() == NodeData){
stepData<double> *sd = data[i]->_steps[j];
for(unsigned int k = 0; k < sd->getNumData(); k++){
double *d = sd->getData(k);
if(d){
for(int l = 0; l < sd->getNumComponents(); l++){
datamap[k].push_back(d[l]);
}
}
}
}
else{
Msg::Error("Combine time not ready for non nodal model-based datasets");
}
addData(data[i]->getModel(j), datamap, i, data[i]->getTime(j), 0, -1);
}
}
}
// (deep) copy step data
for(unsigned int i = 0; i < data.size(); i++)
for(unsigned int j = 0; j < data[i]->_steps.size(); j++)
if(data[i]->hasTimeStep(j))
_steps.push_back(new stepData<double>(*data[i]->_steps[j]));
std::string tmp;
if(nd.name == "__all__")
tmp = "all";
......
......@@ -35,6 +35,11 @@ class stepData{
// the data and 2) not to store any additional info in MVertex or
// MElement)
std::vector<real*> *_data;
// a vector containing the multiplying factor allowing to compute
// the number of values stored in _data for each index (number of
// values = getMult() * getNumComponents()). If _mult is empty, a
// default value of "1" is assumed
std::vector<int> _mult;
// a vector, indexed by MSH element type, of Gauss point locations
// in parametric space
std::vector<std::vector<double> > _gaussPoints;
......@@ -49,12 +54,44 @@ class stepData{
_model->getEntities(_entities);
_bbox = _model->bounds();
}
stepData(stepData<real> &other) : _data(0)
{
_model = other._model;
_entities = other._entities;
_bbox = other._bbox;
_fileName = other._fileName;
_fileIndex = other._fileIndex;
_time = other._time;
_min = other._min;
_max = other._max;
_numComp = other._numComp;
if(other._data){
int n = other.getNumData();
_data = new std::vector<real*>(n, (real*)0);
for(int i = 0; i < n; i++){
real *d = other.getData(i);
if(d){
int m = other.getMult(i) * _numComp;
(*_data)[i] = new real[m];
for(int j = 0; j < m; j++) (*_data)[i][j] = d[j];
}
}
}
_mult = other._mult;
_gaussPoints = other._gaussPoints;
_partitions = other._partitions;
}
~stepData(){ destroyData(); }
GModel *getModel(){ return _model; }
SBoundingBox3d getBoundingBox(){ return _bbox; }
int getNumEntities(){ return _entities.size(); }
GEntity *getEntity(int ent){ return _entities[ent]; }
int getNumComponents(){ return _numComp; }
int getMult(int index)
{
if(index < 0 || index >= _mult.size()) return 1;
return _mult[index];
}
std::string getFileName(){ return _fileName; }
void setFileName(std::string name){ _fileName = name; }
int getFileIndex(){ return _fileIndex; }
......@@ -83,6 +120,10 @@ class stepData{
(*_data)[index] = new real[_numComp * mult];
for(int i = 0; i < _numComp * mult; i++) (*_data)[index][i] = 0.;
}
if(mult > 1){
if(index >= _mult.size()) _mult.resize(index + 100, 1); // optimize this
_mult[index] = mult;
}
}
else{
if(index >= getNumData()) return 0;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment