You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
2045 lines
66 KiB
2045 lines
66 KiB
/*=========================================================================
|
|
|
|
Program: Visualization Toolkit
|
|
Module: $RCSfile: vtkEnSightReader.cxx,v $
|
|
|
|
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
|
|
All rights reserved.
|
|
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
|
|
|
|
This software is distributed WITHOUT ANY WARRANTY; without even
|
|
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
PURPOSE. See the above copyright notice for more information.
|
|
|
|
=========================================================================*/
|
|
#include "vtkEnSightReader.h"
|
|
|
|
#include "vtkDataArrayCollection.h"
|
|
#include "vtkFloatArray.h"
|
|
#include "vtkIdList.h"
|
|
#include "vtkIdListCollection.h"
|
|
#include "vtkObjectFactory.h"
|
|
#include "vtkRectilinearGrid.h"
|
|
#include "vtkSmartPointer.h"
|
|
#include "vtkStructuredGrid.h"
|
|
#include "vtkStructuredPoints.h"
|
|
#include "vtkUnstructuredGrid.h"
|
|
|
|
#include <vtkstd/string>
|
|
#include <vtkstd/vector>
|
|
|
|
vtkCxxRevisionMacro(vtkEnSightReader, "$Revision: 1.58 $");
|
|
|
|
//----------------------------------------------------------------------------
|
|
typedef vtkstd::vector< vtkSmartPointer<vtkIdList> > vtkEnSightReaderCellIdsTypeBase;
|
|
class vtkEnSightReaderCellIdsType: public vtkEnSightReaderCellIdsTypeBase {};
|
|
|
|
//----------------------------------------------------------------------------
|
|
vtkEnSightReader::vtkEnSightReader()
|
|
{
|
|
this->MeasuredFileName = NULL;
|
|
this->MatchFileName = NULL;
|
|
|
|
this->IS = NULL;
|
|
|
|
this->VariableMode = -1;
|
|
|
|
this->UnstructuredPartIds = vtkIdList::New();
|
|
this->CellIds = NULL;
|
|
|
|
this->VariableFileNames = NULL;
|
|
this->ComplexVariableFileNames = NULL;
|
|
|
|
this->VariableDescriptions = NULL;
|
|
this->ComplexVariableDescriptions = NULL;
|
|
|
|
this->VariableTimeSetIds = vtkIdList::New();
|
|
this->ComplexVariableTimeSetIds = vtkIdList::New();
|
|
this->VariableFileSetIds = vtkIdList::New();
|
|
this->ComplexVariableFileSetIds = vtkIdList::New();
|
|
|
|
this->TimeSetFileNameNumbers = vtkIdListCollection::New();
|
|
this->TimeSetsWithFilenameNumbers = vtkIdList::New();
|
|
this->TimeSets = vtkDataArrayCollection::New();
|
|
this->FileSetFileNameNumbers = vtkIdListCollection::New();
|
|
this->FileSetsWithFilenameNumbers = vtkIdList::New();
|
|
this->FileSetNumberOfSteps = vtkIdListCollection::New();
|
|
|
|
this->TimeSetIds = vtkIdList::New();
|
|
this->FileSets = vtkIdList::New();
|
|
|
|
this->GeometryTimeSet = 1;
|
|
this->GeometryFileSet = 1;
|
|
this->MeasuredTimeSet = 1;
|
|
this->MeasuredFileSet = 1;
|
|
|
|
this->UseTimeSets = 0;
|
|
this->UseFileSets = 0;
|
|
|
|
this->GeometryTimeValue = -1;
|
|
this->MeasuredTimeValue = -1;
|
|
|
|
this->NumberOfGeometryParts = 0;
|
|
|
|
this->NumberOfMeasuredPoints = 0;
|
|
|
|
this->OutputsAreValid = 1;
|
|
this->InitialRead = 1;
|
|
this->NumberOfNewOutputs = 0;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
vtkEnSightReader::~vtkEnSightReader()
|
|
{
|
|
int i;
|
|
|
|
if (this->CellIds)
|
|
{
|
|
delete this->CellIds;
|
|
this->CellIds = NULL;
|
|
}
|
|
|
|
if (this->MeasuredFileName)
|
|
{
|
|
delete [] this->MeasuredFileName;
|
|
this->MeasuredFileName = NULL;
|
|
}
|
|
if (this->MatchFileName)
|
|
{
|
|
delete [] this->MatchFileName;
|
|
this->MatchFileName = NULL;
|
|
}
|
|
|
|
if (this->NumberOfVariables > 0)
|
|
{
|
|
for (i = 0; i < this->NumberOfVariables; i++)
|
|
{
|
|
delete [] this->VariableFileNames[i];
|
|
}
|
|
delete [] this->VariableFileNames;
|
|
this->VariableFileNames = NULL;
|
|
}
|
|
|
|
if (this->NumberOfComplexVariables > 0)
|
|
{
|
|
for (i = 0; i < this->NumberOfComplexVariables*2; i++)
|
|
{
|
|
delete [] this->ComplexVariableFileNames[i];
|
|
}
|
|
delete [] this->ComplexVariableFileNames;
|
|
this->ComplexVariableFileNames = NULL;
|
|
}
|
|
|
|
this->UnstructuredPartIds->Delete();
|
|
this->UnstructuredPartIds = NULL;
|
|
|
|
this->VariableTimeSetIds->Delete();
|
|
this->VariableTimeSetIds = NULL;
|
|
this->ComplexVariableTimeSetIds->Delete();
|
|
this->ComplexVariableTimeSetIds = NULL;
|
|
this->VariableFileSetIds->Delete();
|
|
this->VariableFileSetIds = NULL;
|
|
this->ComplexVariableFileSetIds->Delete();
|
|
this->ComplexVariableFileSetIds = NULL;
|
|
|
|
this->TimeSetFileNameNumbers->Delete();
|
|
this->TimeSetFileNameNumbers = NULL;
|
|
this->TimeSetsWithFilenameNumbers->Delete();
|
|
this->TimeSetsWithFilenameNumbers = NULL;
|
|
this->TimeSets->Delete();
|
|
this->TimeSets = NULL;
|
|
this->FileSetFileNameNumbers->Delete();
|
|
this->FileSetFileNameNumbers = NULL;
|
|
this->FileSetsWithFilenameNumbers->Delete();
|
|
this->FileSetsWithFilenameNumbers = NULL;
|
|
this->FileSetNumberOfSteps->Delete();
|
|
this->FileSetNumberOfSteps = NULL;
|
|
|
|
this->TimeSetIds->Delete();
|
|
this->TimeSets = NULL;
|
|
this->FileSets->Delete();
|
|
this->FileSets = NULL;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
void vtkEnSightReader::Execute()
|
|
{
|
|
vtkDebugMacro("In execute ");
|
|
|
|
int i, timeSet, fileSet, timeStep, timeStepInFile, fileNum;
|
|
vtkDataArray *times;
|
|
vtkIdList *numStepsList, *filenameNumbers;
|
|
float newTime;
|
|
int numSteps;
|
|
char* fileName;
|
|
int filenameNum;
|
|
|
|
if ( ! this->CaseFileRead)
|
|
{
|
|
vtkErrorMacro("error reading case file");
|
|
return;
|
|
}
|
|
|
|
this->OutputsAreValid = 1;
|
|
this->NumberOfNewOutputs = 0;
|
|
this->NumberOfGeometryParts = 0;
|
|
if (this->GeometryFileName)
|
|
{
|
|
timeStep = timeStepInFile = 1;
|
|
fileNum = 1;
|
|
fileName = new char[strlen(this->GeometryFileName) + 1];
|
|
strcpy(fileName, this->GeometryFileName);
|
|
|
|
if (this->UseTimeSets)
|
|
{
|
|
timeSet = this->TimeSetIds->IsId(this->GeometryTimeSet);
|
|
if (timeSet >= 0)
|
|
{
|
|
times = this->TimeSets->GetItem(timeSet);
|
|
this->GeometryTimeValue = times->GetComponent(0, 0);
|
|
for (i = 1; i < times->GetNumberOfTuples(); i++)
|
|
{
|
|
newTime = times->GetComponent(i, 0);
|
|
if (newTime <= this->TimeValue && newTime > this->GeometryTimeValue)
|
|
{
|
|
this->GeometryTimeValue = newTime;
|
|
timeStep++;
|
|
timeStepInFile++;
|
|
}
|
|
}
|
|
if (this->TimeSetFileNameNumbers->GetNumberOfItems() > 0)
|
|
{
|
|
int collectionNum = this->TimeSetsWithFilenameNumbers->
|
|
IsId(this->GeometryTimeSet);
|
|
if (collectionNum > -1)
|
|
{
|
|
filenameNumbers =
|
|
this->TimeSetFileNameNumbers->GetItem(collectionNum);
|
|
filenameNum = filenameNumbers->GetId(timeStep-1);
|
|
this->ReplaceWildcards(fileName, filenameNum);
|
|
}
|
|
}
|
|
|
|
// There can only be file sets if there are also time sets.
|
|
if (this->UseFileSets)
|
|
{
|
|
fileSet = this->FileSets->IsId(this->GeometryFileSet);
|
|
numStepsList = (vtkIdList*)this->FileSetNumberOfSteps->
|
|
GetItemAsObject(fileSet);
|
|
|
|
if (timeStep > numStepsList->GetId(0))
|
|
{
|
|
numSteps = numStepsList->GetId(0);
|
|
timeStepInFile -= numSteps;
|
|
for (i = 1; i < numStepsList->GetNumberOfIds(); i++)
|
|
{
|
|
numSteps += numStepsList->GetId(i);
|
|
if (timeStep > numSteps)
|
|
{
|
|
fileNum++;
|
|
timeStepInFile -= numStepsList->GetId(i);
|
|
}
|
|
}
|
|
}
|
|
if (this->FileSetFileNameNumbers->GetNumberOfItems() > 0)
|
|
{
|
|
int collectionNum = this->FileSetsWithFilenameNumbers->
|
|
IsId(this->GeometryFileSet);
|
|
if (collectionNum > -1)
|
|
{
|
|
filenameNumbers = this->TimeSetFileNameNumbers->
|
|
GetItem(collectionNum);
|
|
filenameNum = filenameNumbers->GetId(fileNum-1);
|
|
this->ReplaceWildcards(fileName, filenameNum);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (!this->ReadGeometryFile(fileName, timeStepInFile))
|
|
{
|
|
vtkErrorMacro("error reading geometry file");
|
|
delete [] fileName;
|
|
return;
|
|
}
|
|
|
|
delete [] fileName;
|
|
}
|
|
if (this->MeasuredFileName)
|
|
{
|
|
timeStep = timeStepInFile = 1;
|
|
fileNum = 1;
|
|
fileName = new char[strlen(this->MeasuredFileName) + 1];
|
|
strcpy(fileName, this->MeasuredFileName);
|
|
|
|
if (this->UseTimeSets)
|
|
{
|
|
timeSet = this->TimeSetIds->IsId(this->MeasuredTimeSet);
|
|
if (timeSet >= 0)
|
|
{
|
|
times = this->TimeSets->GetItem(timeSet);
|
|
this->MeasuredTimeValue = times->GetComponent(0, 0);
|
|
for (i = 1; i < times->GetNumberOfTuples(); i++)
|
|
{
|
|
newTime = times->GetComponent(i, 0);
|
|
if (newTime <= this->TimeValue && newTime > this->MeasuredTimeValue)
|
|
{
|
|
this->MeasuredTimeValue = newTime;
|
|
timeStep++;
|
|
timeStepInFile++;
|
|
}
|
|
}
|
|
if (this->TimeSetFileNameNumbers->GetNumberOfItems() > 0)
|
|
{
|
|
int collectionNum = this->TimeSetsWithFilenameNumbers->
|
|
IsId(this->MeasuredTimeSet);
|
|
if (collectionNum > -1)
|
|
{
|
|
filenameNumbers = this->TimeSetFileNameNumbers->
|
|
GetItem(collectionNum);
|
|
filenameNum = filenameNumbers->GetId(timeStep-1);
|
|
this->ReplaceWildcards(fileName, filenameNum);
|
|
}
|
|
}
|
|
|
|
// There can only be file sets if there are also time sets.
|
|
if (this->UseFileSets)
|
|
{
|
|
fileSet = this->FileSets->IsId(this->MeasuredFileSet);
|
|
numStepsList = (vtkIdList*)this->FileSetNumberOfSteps->
|
|
GetItemAsObject(fileSet);
|
|
|
|
if (timeStep > numStepsList->GetId(0))
|
|
{
|
|
numSteps = numStepsList->GetId(0);
|
|
timeStepInFile -= numSteps;
|
|
for (i = 1; i < numStepsList->GetNumberOfIds(); i++)
|
|
{
|
|
numSteps += numStepsList->GetId(i);
|
|
if (timeStep > numSteps)
|
|
{
|
|
fileNum++;
|
|
timeStepInFile -= numStepsList->GetId(i);
|
|
}
|
|
}
|
|
}
|
|
if (this->FileSetFileNameNumbers->GetNumberOfItems() > 0)
|
|
{
|
|
int collectionNum = this->FileSetsWithFilenameNumbers->
|
|
IsId(this->MeasuredFileSet);
|
|
if (collectionNum > -1)
|
|
{
|
|
filenameNumbers = this->TimeSetFileNameNumbers->
|
|
GetItem(fileSet);
|
|
filenameNum = filenameNumbers->GetId(fileNum-1);
|
|
this->ReplaceWildcards(fileName, filenameNum);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (!this->ReadMeasuredGeometryFile(fileName, timeStepInFile))
|
|
{
|
|
vtkErrorMacro("error reading measured geometry file");
|
|
delete [] fileName;
|
|
return;
|
|
}
|
|
delete [] fileName;
|
|
}
|
|
if (!this->CheckOutputConsistency())
|
|
{
|
|
for (i = 0; i < this->NumberOfOutputs; i++)
|
|
{
|
|
this->GetOutput(i)->Initialize();
|
|
}
|
|
return;
|
|
}
|
|
|
|
if ((this->NumberOfVariables + this->NumberOfComplexVariables) > 0)
|
|
{
|
|
if (!this->ReadVariableFiles())
|
|
{
|
|
vtkErrorMacro("error reading variable files");
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
void vtkEnSightReader::Update()
|
|
{
|
|
vtkDebugMacro("In update");;
|
|
int i;
|
|
|
|
this->UpdateInformation();
|
|
this->UpdateData(0);
|
|
|
|
for (i = 0; i < this->GetNumberOfOutputs(); i++)
|
|
{
|
|
if ( this->GetOutput(i) )
|
|
{
|
|
this->GetOutput(i)->DataHasBeenGenerated();
|
|
this->GetOutput(i)->SetUpdateExtentToWholeExtent();
|
|
}
|
|
}
|
|
}
|
|
//----------------------------------------------------------------------------
|
|
void vtkEnSightReader::ExecuteInformation()
|
|
{
|
|
vtkDebugMacro("In execute information");
|
|
this->CaseFileRead = this->ReadCaseFile();
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
int vtkEnSightReader::ReadCaseFile()
|
|
{
|
|
char line[256], formatLine[256];
|
|
char subLine[256], subLine2[256];
|
|
int stringRead;
|
|
int timeSet, fileSet, numTimeSteps, i, filenameNum, increment, lineRead;
|
|
float timeStep;
|
|
|
|
// Initialize
|
|
//
|
|
if (!this->CaseFileName)
|
|
{
|
|
vtkErrorMacro("A CaseFileName must be specified.");
|
|
return 0;
|
|
}
|
|
vtkstd::string sfilename;
|
|
if (this->FilePath)
|
|
{
|
|
sfilename = this->FilePath;
|
|
if (sfilename.at(sfilename.length()-1) != '/')
|
|
{
|
|
sfilename += "/";
|
|
}
|
|
sfilename += this->CaseFileName;
|
|
vtkDebugMacro("full path to case file: " << sfilename.c_str());
|
|
}
|
|
else
|
|
{
|
|
sfilename = this->CaseFileName;
|
|
}
|
|
|
|
this->IS = new ifstream(sfilename.c_str(), ios::in);
|
|
if (this->IS->fail())
|
|
{
|
|
vtkErrorMacro("Unable to open file: " << sfilename.c_str());
|
|
delete this->IS;
|
|
this->IS = NULL;
|
|
return 0;
|
|
}
|
|
|
|
this->TimeSets->RemoveAllItems();
|
|
|
|
for (i = 0; i < this->NumberOfVariables; i++)
|
|
{
|
|
delete [] this->VariableFileNames[i];
|
|
this->VariableFileNames[i] = NULL;
|
|
delete [] this->VariableDescriptions[i];
|
|
this->VariableDescriptions[i] = NULL;
|
|
}
|
|
delete [] this->VariableFileNames;
|
|
this->VariableFileNames = NULL;
|
|
delete [] this->VariableDescriptions;
|
|
this->VariableDescriptions = NULL;
|
|
delete [] this->VariableTypes;
|
|
this->VariableTypes = NULL;
|
|
|
|
for (i = 0; i < this->NumberOfComplexVariables; i++)
|
|
{
|
|
delete [] this->ComplexVariableFileNames[2*i];
|
|
this->ComplexVariableFileNames[2*i] = NULL;
|
|
delete [] this->ComplexVariableFileNames[2*i+1];
|
|
this->ComplexVariableFileNames[2*i+1] = NULL;
|
|
delete [] this->ComplexVariableDescriptions[i];
|
|
this->ComplexVariableDescriptions[i] = NULL;
|
|
}
|
|
delete [] this->ComplexVariableFileNames;
|
|
this->ComplexVariableFileNames = NULL;
|
|
delete [] this->ComplexVariableDescriptions;
|
|
this->ComplexVariableDescriptions = NULL;
|
|
delete [] this->ComplexVariableTypes;
|
|
this->ComplexVariableTypes = NULL;
|
|
|
|
this->NumberOfVariables = 0;
|
|
this->NumberOfComplexVariables = 0;
|
|
|
|
this->ReadNextDataLine(line);
|
|
|
|
if (strncmp(line, "FORMAT", 6) == 0)
|
|
{
|
|
// found the FORMAT section
|
|
vtkDebugMacro("*** FORMAT section");
|
|
this->ReadNextDataLine(line);
|
|
|
|
stringRead = sscanf(line, " %*s %*s %s", subLine);
|
|
if (stringRead == 1)
|
|
{
|
|
if (strcmp(subLine, "gold") == 0 &&
|
|
strcmp(this->GetClassName(), "vtkEnSight6Reader") == 0)
|
|
{
|
|
// The class is vtkEnSight6Reader, but the case file says "gold".
|
|
vtkErrorMacro("This is not an EnSight6 file.");
|
|
delete this->IS;
|
|
this->IS = NULL;
|
|
return 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (strcmp(this->GetClassName(), "vtkEnSightGoldReader") == 0)
|
|
{
|
|
// The class is vtkEnSightGoldReader, but the case file does
|
|
// not say "gold".
|
|
vtkErrorMacro("This is not an EnSight Gold file.");
|
|
delete this->IS;
|
|
this->IS = NULL;
|
|
return 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
// We know how many lines to read in the FORMAT section, so we haven't read
|
|
// the "GEOMETRY" line yet.
|
|
this->ReadNextDataLine(line);
|
|
if (strncmp(line, "GEOMETRY", 8) == 0)
|
|
{
|
|
// found the GEOMETRY section
|
|
vtkDebugMacro("*** GEOMETRY section");
|
|
|
|
// There will definitely be a "model" line. There may also be "measured"
|
|
// and "match" lines.
|
|
while(this->ReadNextDataLine(line) != 0 &&
|
|
strncmp(line, "m", 1) == 0)
|
|
{
|
|
if (strncmp(line, "model:", 6) == 0)
|
|
{
|
|
if (sscanf(line, " %*s %d%*[ \t]%d%*[ \t]%s", &timeSet, &fileSet, subLine) == 3)
|
|
{
|
|
this->GeometryTimeSet = timeSet;
|
|
this->GeometryFileSet = fileSet;
|
|
this->SetGeometryFileName(subLine);
|
|
vtkDebugMacro(<<this->GetGeometryFileName());
|
|
}
|
|
else if (sscanf(line, " %*s %d%*[ \t]%s", &timeSet, subLine) == 2)
|
|
{
|
|
this->GeometryTimeSet = timeSet;
|
|
this->SetGeometryFileName(subLine);
|
|
vtkDebugMacro(<<this->GetGeometryFileName());
|
|
}
|
|
else if (sscanf(line, " %*s %s", subLine) == 1)
|
|
{
|
|
this->SetGeometryFileName(subLine);
|
|
vtkDebugMacro(<<this->GetGeometryFileName());
|
|
}
|
|
}
|
|
else if (strncmp(line, "measured:", 9) == 0)
|
|
{
|
|
if (sscanf(line, " %*s %d%*[ \t]%d%*[ \t]%s", &timeSet, &fileSet, subLine) == 3)
|
|
{
|
|
this->MeasuredTimeSet = timeSet;
|
|
this->MeasuredFileSet = fileSet;
|
|
this->SetMeasuredFileName(subLine);
|
|
vtkDebugMacro(<< this->GetMeasuredFileName());
|
|
}
|
|
else if (sscanf(line, " %*s %d%*[ \t]%s", &timeSet, subLine) == 2)
|
|
{
|
|
this->MeasuredTimeSet = timeSet;
|
|
this->SetMeasuredFileName(subLine);
|
|
vtkDebugMacro(<< this->GetMeasuredFileName());
|
|
}
|
|
else if (sscanf(line, " %*s %s", subLine) == 1)
|
|
{
|
|
this->SetMeasuredFileName(subLine);
|
|
vtkDebugMacro(<< this->GetMeasuredFileName());
|
|
}
|
|
}
|
|
else if (strncmp(line, "match:", 6) == 0)
|
|
{
|
|
sscanf(line, " %*s %s", subLine);
|
|
this->SetMatchFileName(subLine);
|
|
vtkDebugMacro(<< this->GetMatchFileName());
|
|
}
|
|
}
|
|
}
|
|
|
|
if (strncmp(line, "VARIABLE", 8) == 0)
|
|
{
|
|
// found the VARIABLE section
|
|
vtkDebugMacro(<< "*** VARIABLE section");
|
|
|
|
this->NumberOfScalarsPerNode = 0;
|
|
this->NumberOfVectorsPerNode = 0;
|
|
this->NumberOfTensorsSymmPerNode = 0;
|
|
this->NumberOfScalarsPerElement = 0;
|
|
this->NumberOfVectorsPerElement = 0;
|
|
this->NumberOfTensorsSymmPerElement = 0;
|
|
this->NumberOfScalarsPerMeasuredNode = 0;
|
|
this->NumberOfVectorsPerMeasuredNode = 0;
|
|
this->NumberOfComplexScalarsPerNode = 0;
|
|
this->NumberOfComplexVectorsPerNode = 0;
|
|
this->NumberOfComplexScalarsPerElement = 0;
|
|
this->NumberOfComplexVectorsPerElement = 0;
|
|
|
|
while(this->ReadNextDataLine(line) != 0 &&
|
|
strncmp(line, "TIME", 4) != 0 &&
|
|
strncmp(line, "FILE", 4) != 0)
|
|
{
|
|
if (strncmp(line, "constant", 8) == 0)
|
|
{
|
|
vtkDebugMacro(<< line);
|
|
}
|
|
else if (strncmp(line, "scalar", 6) == 0)
|
|
{
|
|
sscanf(line, " %*s %*s %s", subLine);
|
|
if (strcmp(subLine, "node:") == 0)
|
|
{
|
|
vtkDebugMacro("scalar per node");
|
|
this->VariableMode = vtkEnSightReader::SCALAR_PER_NODE;
|
|
if (sscanf(line, " %*s %*s %*s %d %d %s", &timeSet, &fileSet,
|
|
subLine) == 3)
|
|
{
|
|
this->VariableTimeSetIds->InsertNextId(timeSet);
|
|
this->VariableFileSetIds->InsertNextId(fileSet);
|
|
this->AddVariableDescription(subLine);
|
|
sscanf(line, " %*s %*s %*s %*d %*d %*s %s", subLine);
|
|
}
|
|
else if (sscanf(line, " %*s %*s %*s %d %s", &timeSet, subLine) == 2)
|
|
{
|
|
this->VariableTimeSetIds->InsertNextId(timeSet);
|
|
this->AddVariableDescription(subLine);
|
|
sscanf(line, " %*s %*s %*s %*d %*s %s", subLine);
|
|
}
|
|
else if (sscanf(line, " %*s %*s %*s %s", subLine) == 1)
|
|
{
|
|
this->VariableTimeSetIds->InsertNextId(1);
|
|
this->AddVariableDescription(subLine);
|
|
sscanf(line, " %*s %*s %*s %*s %s", subLine);
|
|
}
|
|
this->AddVariableType();
|
|
this->NumberOfScalarsPerNode++;
|
|
}
|
|
else if (strcmp(subLine, "element:") == 0)
|
|
{
|
|
vtkDebugMacro("scalar per element");
|
|
this->VariableMode = vtkEnSightReader::SCALAR_PER_ELEMENT;
|
|
if (sscanf(line, " %*s %*s %*s %d %d %s", &timeSet, &fileSet,
|
|
subLine) == 3)
|
|
{
|
|
this->VariableTimeSetIds->InsertNextId(timeSet);
|
|
this->VariableFileSetIds->InsertNextId(fileSet);
|
|
this->AddVariableDescription(subLine);
|
|
sscanf(line, " %*s %*s %*s %*d %*d %*s %s", subLine);
|
|
}
|
|
else if (sscanf(line, " %*s %*s %*s %d %s", &timeSet, subLine) == 2)
|
|
{
|
|
this->VariableTimeSetIds->InsertNextId(timeSet);
|
|
this->AddVariableDescription(subLine);
|
|
sscanf(line, " %*s %*s %*s %*d %*s %s", subLine);
|
|
}
|
|
else if (sscanf(line, " %*s %*s %*s %s", subLine) == 1)
|
|
{
|
|
this->VariableTimeSetIds->InsertNextId(1);
|
|
this->AddVariableDescription(subLine);
|
|
sscanf(line, " %*s %*s %*s %*s %s", subLine);
|
|
}
|
|
this->AddVariableType();
|
|
this->NumberOfScalarsPerElement++;
|
|
}
|
|
else if (strcmp(subLine, "measured") == 0)
|
|
{
|
|
vtkDebugMacro("scalar per measured node");
|
|
this->VariableMode = vtkEnSightReader::SCALAR_PER_MEASURED_NODE;
|
|
if (sscanf(line, " %*s %*s %*s %*s %d %d %s", &timeSet, &fileSet,
|
|
subLine) == 3)
|
|
{
|
|
this->VariableTimeSetIds->InsertNextId(timeSet);
|
|
this->VariableFileSetIds->InsertNextId(fileSet);
|
|
this->AddVariableDescription(subLine);
|
|
sscanf(line, " %*s %*s %*s %*s %*d %*d %*s %s", subLine);
|
|
}
|
|
else if (sscanf(line, " %*s %*s %*s %*s %d %s", &timeSet,
|
|
subLine) == 2)
|
|
{
|
|
this->VariableTimeSetIds->InsertNextId(timeSet);
|
|
this->AddVariableDescription(subLine);
|
|
sscanf(line, " %*s %*s %*s %*s %*d %*s %s", subLine);
|
|
}
|
|
else if (sscanf(line, " %*s %*s %*s %*s %s", subLine) == 1)
|
|
{
|
|
this->VariableTimeSetIds->InsertNextId(1);
|
|
this->AddVariableDescription(subLine);
|
|
sscanf(line, " %*s %*s %*s %*s %*s %s", subLine);
|
|
}
|
|
this->AddVariableType();
|
|
this->NumberOfScalarsPerMeasuredNode++;
|
|
}
|
|
this->AddVariableFileName(subLine);
|
|
this->NumberOfVariables++;
|
|
}
|
|
else if (strncmp(line, "vector", 6) == 0)
|
|
{
|
|
sscanf(line, " %*s %*s %s", subLine);
|
|
if (strcmp(subLine, "node:") == 0)
|
|
{
|
|
vtkDebugMacro("vector per node");
|
|
this->VariableMode = vtkEnSightReader::VECTOR_PER_NODE;
|
|
if (sscanf(line, " %*s %*s %*s %d %d %s", &timeSet, &fileSet,
|
|
subLine) == 3)
|
|
{
|
|
this->VariableTimeSetIds->InsertNextId(timeSet);
|
|
this->VariableFileSetIds->InsertNextId(fileSet);
|
|
this->AddVariableDescription(subLine);
|
|
sscanf(line, " %*s %*s %*s %*d %*d %*s %s", subLine);
|
|
}
|
|
else if (sscanf(line, " %*s %*s %*s %d %s", &timeSet, subLine) == 2)
|
|
{
|
|
this->VariableTimeSetIds->InsertNextId(timeSet);
|
|
this->AddVariableDescription(subLine);
|
|
sscanf(line, " %*s %*s %*s %*d %*s %s", subLine);
|
|
}
|
|
else if (sscanf(line, " %*s %*s %*s %s", subLine) == 1)
|
|
{
|
|
this->VariableTimeSetIds->InsertNextId(1);
|
|
this->AddVariableDescription(subLine);
|
|
sscanf(line, " %*s %*s %*s %*s %s", subLine);
|
|
}
|
|
this->AddVariableType();
|
|
this->NumberOfVectorsPerNode++;
|
|
}
|
|
else if (strcmp(subLine, "element:") == 0)
|
|
{
|
|
vtkDebugMacro("vector per element");
|
|
this->VariableMode = vtkEnSightReader::VECTOR_PER_ELEMENT;
|
|
if (sscanf(line, " %*s %*s %*s %d %d %s", &timeSet, &fileSet,
|
|
subLine) == 3)
|
|
{
|
|
this->VariableTimeSetIds->InsertNextId(timeSet);
|
|
this->VariableFileSetIds->InsertNextId(fileSet);
|
|
this->AddVariableDescription(subLine);
|
|
sscanf(line, " %*s %*s %*s %*d %*d %*s %s", subLine);
|
|
}
|
|
else if (sscanf(line, " %*s %*s %*s %d %s", &timeSet, subLine) == 2)
|
|
{
|
|
this->VariableTimeSetIds->InsertNextId(timeSet);
|
|
this->AddVariableDescription(subLine);
|
|
sscanf(line, " %*s %*s %*s %*d %*s %s", subLine);
|
|
}
|
|
else if (sscanf(line, " %*s %*s %*s %s", subLine) == 1)
|
|
{
|
|
this->VariableTimeSetIds->InsertNextId(1);
|
|
this->AddVariableDescription(subLine);
|
|
sscanf(line, " %*s %*s %*s %*s %s", subLine);
|
|
}
|
|
this->AddVariableType();
|
|
this->NumberOfVectorsPerElement++;
|
|
}
|
|
else if (strcmp(subLine, "measured") == 0)
|
|
{
|
|
vtkDebugMacro("vector per measured node");
|
|
this->VariableMode = vtkEnSightReader::VECTOR_PER_MEASURED_NODE;
|
|
if (sscanf(line, " %*s %*s %*s %*s %d %d %s", &timeSet, &fileSet,
|
|
subLine) == 3)
|
|
{
|
|
this->VariableTimeSetIds->InsertNextId(timeSet);
|
|
this->VariableFileSetIds->InsertNextId(fileSet);
|
|
this->AddVariableDescription(subLine);
|
|
sscanf(line, " %*s %*s %*s %*s %*d %*d %*s %s", subLine);
|
|
}
|
|
else if (sscanf(line, " %*s %*s %*s %*s %d %s", &timeSet,
|
|
subLine) == 2)
|
|
{
|
|
this->VariableTimeSetIds->InsertNextId(timeSet);
|
|
this->AddVariableDescription(subLine);
|
|
sscanf(line, " %*s %*s %*s %*s %*d %*s %s", subLine);
|
|
}
|
|
else if (sscanf(line, " %*s %*s %*s %*s %s", subLine) == 1)
|
|
{
|
|
this->VariableTimeSetIds->InsertNextId(1);
|
|
this->AddVariableDescription(subLine);
|
|
sscanf(line, " %*s %*s %*s %*s %*s %s", subLine);
|
|
}
|
|
this->AddVariableType();
|
|
this->NumberOfVectorsPerMeasuredNode++;
|
|
}
|
|
this->AddVariableFileName(subLine);
|
|
this->NumberOfVariables++;
|
|
}
|
|
else if (strncmp(line, "tensor", 6) == 0)
|
|
{
|
|
// According to EnSight documentation tensor entry should be of the form:
|
|
// tensor symm per node/element
|
|
// but it seems like you can also find:
|
|
// tensor per node/element
|
|
// Let handle this case here:
|
|
char symm[10];
|
|
char per[10];
|
|
if( sscanf(line, " %*s %s %s %s", symm, per, subLine) != 3 )
|
|
{
|
|
vtkErrorMacro( "Error while reading: " << line );
|
|
}
|
|
if (!(strcmp(symm, "symm") == 0 && strcmp(per, "per") == 0))
|
|
{
|
|
if( sscanf(line, " %*s %s %s", per, subLine) != 2 )
|
|
{
|
|
vtkErrorMacro( "Error while reading: " << line );
|
|
}
|
|
if (strcmp(per, "per") == 0)
|
|
{
|
|
//Not valid file but seems alright, only 'symm' is missing
|
|
vtkWarningMacro( "Looks almost like a valid case file, continuing" );
|
|
}
|
|
else
|
|
{
|
|
vtkErrorMacro("Trouble reading: " << line );
|
|
}
|
|
}
|
|
if (strcmp(subLine, "node:") == 0)
|
|
{
|
|
vtkDebugMacro("tensor symm per node");
|
|
this->VariableMode = vtkEnSightReader::TENSOR_SYMM_PER_NODE;
|
|
if (sscanf(line, " %*s %*s %*s %*s %d %d %s", &timeSet, &fileSet,
|
|
subLine) == 3)
|
|
{
|
|
this->VariableTimeSetIds->InsertNextId(timeSet);
|
|
this->VariableFileSetIds->InsertNextId(fileSet);
|
|
this->AddVariableDescription(subLine);
|
|
sscanf(line, " %*s %*s %*s %*s %*d %*d %*s %s", subLine);
|
|
}
|
|
else if (sscanf(line, " %*s %*s %*s %*s %d %s", &timeSet,
|
|
subLine) == 2)
|
|
{
|
|
this->VariableTimeSetIds->InsertNextId(timeSet);
|
|
this->AddVariableDescription(subLine);
|
|
sscanf(line, " %*s %*s %*s %*s %*d %*s %s", subLine);
|
|
}
|
|
else if (sscanf(line, " %*s %*s %*s %*s %s", subLine) == 1)
|
|
{
|
|
this->VariableTimeSetIds->InsertNextId(1);
|
|
this->AddVariableDescription(subLine);
|
|
sscanf(line, " %*s %*s %*s %*s %*s %s", subLine);
|
|
}
|
|
this->AddVariableType();
|
|
this->NumberOfTensorsSymmPerNode++;
|
|
}
|
|
else if (strcmp(subLine, "element:") == 0)
|
|
{
|
|
vtkDebugMacro("tensor symm per element");
|
|
this->VariableMode = vtkEnSightReader::TENSOR_SYMM_PER_ELEMENT;
|
|
if (sscanf(line, " %*s %*s %*s %*s %d %d %s", &timeSet, &fileSet,
|
|
subLine) == 3)
|
|
{
|
|
this->VariableTimeSetIds->InsertNextId(timeSet);
|
|
this->VariableFileSetIds->InsertNextId(fileSet);
|
|
this->AddVariableDescription(subLine);
|
|
sscanf(line, " %*s %*s %*s %*s %*d %*d %*s %s", subLine);
|
|
}
|
|
else if (sscanf(line, " %*s %*s %*s %*s %d %s", &timeSet,
|
|
subLine) == 2)
|
|
{
|
|
this->VariableTimeSetIds->InsertNextId(timeSet);
|
|
this->AddVariableDescription(subLine);
|
|
sscanf(line, " %*s %*s %*s %*s %*d %*s %s", subLine);
|
|
}
|
|
else if (sscanf(line, " %*s %*s %*s %*s %s", subLine) == 1)
|
|
{
|
|
this->VariableTimeSetIds->InsertNextId(1);
|
|
this->AddVariableDescription(subLine);
|
|
sscanf(line, " %*s %*s %*s %*s %*s %s", subLine);
|
|
}
|
|
this->AddVariableType();
|
|
this->NumberOfTensorsSymmPerElement++;
|
|
}
|
|
else
|
|
{
|
|
vtkErrorMacro("Unknow type, faulty line was:" << line );
|
|
}
|
|
this->AddVariableFileName(subLine);
|
|
this->NumberOfVariables++;
|
|
}
|
|
else if (strncmp(line, "complex", 6) == 0)
|
|
{
|
|
sscanf(line, " %*s %s", subLine);
|
|
if (strcmp(subLine, "scalar") == 0)
|
|
{
|
|
sscanf(line, " %*s %*s %*s %s", subLine);
|
|
if (strcmp(subLine, "node:") == 0)
|
|
{
|
|
vtkDebugMacro("complex scalar per node");
|
|
this->VariableMode = vtkEnSightReader::COMPLEX_SCALAR_PER_NODE;
|
|
if (sscanf(line, " %*s %*s %*s %*s %d %d %s", &timeSet, &fileSet,
|
|
subLine) == 3)
|
|
{
|
|
this->ComplexVariableTimeSetIds->InsertNextId(timeSet);
|
|
this->ComplexVariableFileSetIds->InsertNextId(fileSet);
|
|
this->AddVariableDescription(subLine);
|
|
sscanf(line, " %*s %*s %*s %*s %*d %*d %*s %s %s", subLine,
|
|
subLine2);
|
|
}
|
|
else if (sscanf(line, " %*s %*s %*s %*s %d %s", &timeSet,
|
|
subLine) == 2)
|
|
{
|
|
this->ComplexVariableTimeSetIds->InsertNextId(timeSet);
|
|
this->AddVariableDescription(subLine);
|
|
sscanf(line, " %*s %*s %*s %*s %*d %*s %s %s", subLine,
|
|
subLine2);
|
|
}
|
|
else if (sscanf(line, " %*s %*s %*s %*s %s", subLine) == 1)
|
|
{
|
|
this->ComplexVariableTimeSetIds->InsertNextId(1);
|
|
this->AddVariableDescription(subLine);
|
|
sscanf(line, " %*s %*s %*s %*s %*s %s %s", subLine, subLine2);
|
|
}
|
|
this->AddVariableType();
|
|
this->NumberOfComplexScalarsPerNode++;
|
|
}
|
|
else if (strcmp(subLine, "element:") == 0)
|
|
{
|
|
vtkDebugMacro("complex scalar per element");
|
|
this->VariableMode = vtkEnSightReader::COMPLEX_SCALAR_PER_ELEMENT;
|
|
if (sscanf(line, " %*s %*s %*s %*s %d %d %s", &timeSet, &fileSet,
|
|
subLine) == 3)
|
|
{
|
|
this->ComplexVariableTimeSetIds->InsertNextId(timeSet);
|
|
this->ComplexVariableFileSetIds->InsertNextId(fileSet);
|
|
this->AddVariableDescription(subLine);
|
|
sscanf(line, " %*s %*s %*s %*s %*d %*d %*s %s %s", subLine,
|
|
subLine2);
|
|
}
|
|
else if (sscanf(line, " %*s %*s %*s %*s %d %s", &timeSet,
|
|
subLine) == 2)
|
|
{
|
|
this->ComplexVariableTimeSetIds->InsertNextId(timeSet);
|
|
this->AddVariableDescription(subLine);
|
|
sscanf(line, " %*s %*s %*s %*s %*d %*s %s %s", subLine,
|
|
subLine2);
|
|
}
|
|
else if (sscanf(line, " %*s %*s %*s %*s %s", subLine) == 1)
|
|
{
|
|
this->ComplexVariableTimeSetIds->InsertNextId(1);
|
|
this->AddVariableDescription(subLine);
|
|
sscanf(line, " %*s %*s %*s %*s %*s %s %s", subLine, subLine2);
|
|
}
|
|
this->AddVariableType();
|
|
this->NumberOfComplexScalarsPerElement++;
|
|
}
|
|
}
|
|
else if (strcmp(subLine, "vector") == 0)
|
|
{
|
|
sscanf(line, " %*s %*s %*s %s", subLine);
|
|
if (strcmp(subLine, "node:") == 0)
|
|
{
|
|
vtkDebugMacro("complex vector per node");
|
|
this->VariableMode = vtkEnSightReader::COMPLEX_VECTOR_PER_NODE;
|
|
if (sscanf(line, " %*s %*s %*s %*s %d %d %s", &timeSet, &fileSet,
|
|
subLine) == 3)
|
|
{
|
|
this->ComplexVariableTimeSetIds->InsertNextId(timeSet);
|
|
this->ComplexVariableFileSetIds->InsertNextId(fileSet);
|
|
this->AddVariableDescription(subLine);
|
|
sscanf(line, " %*s %*s %*s %*s %*d %*d %*s %s %s", subLine,
|
|
subLine2);
|
|
}
|
|
else if (sscanf(line, " %*s %*s %*s %*s %d %s", &timeSet,
|
|
subLine) == 2)
|
|
{
|
|
this->ComplexVariableTimeSetIds->InsertNextId(timeSet);
|
|
this->AddVariableDescription(subLine);
|
|
sscanf(line, " %*s %*s %*s %*s %*d %*s %s %s", subLine,
|
|
subLine2);
|
|
}
|
|
else if (sscanf(line, " %*s %*s %*s %*s %s", subLine) == 1)
|
|
{
|
|
this->ComplexVariableTimeSetIds->InsertNextId(1);
|
|
this->AddVariableDescription(subLine);
|
|
sscanf(line, " %*s %*s %*s %*s %*s %s %s", subLine, subLine2);
|
|
}
|
|
this->AddVariableType();
|
|
this->NumberOfComplexVectorsPerNode++;
|
|
}
|
|
else if (strcmp(subLine, "element:") == 0)
|
|
{
|
|
vtkDebugMacro("complex vector per element");
|
|
this->VariableMode = vtkEnSightReader::COMPLEX_VECTOR_PER_ELEMENT;
|
|
if (sscanf(line, " %*s %*s %*s %*s %d %d %s", &timeSet, &fileSet,
|
|
subLine) == 3)
|
|
{
|
|
this->ComplexVariableTimeSetIds->InsertNextId(timeSet);
|
|
this->ComplexVariableFileSetIds->InsertNextId(fileSet);
|
|
this->AddVariableDescription(subLine);
|
|
sscanf(line, " %*s %*s %*s %*s %*d %*d %*s %s %s", subLine,
|
|
subLine2);
|
|
}
|
|
else if (sscanf(line, " %*s %*s %*s %*s %d %s", &timeSet,
|
|
subLine) == 2)
|
|
{
|
|
this->ComplexVariableTimeSetIds->InsertNextId(timeSet);
|
|
this->AddVariableDescription(subLine);
|
|
sscanf(line, " %*s %*s %*s %*s %*d %*s %s %s", subLine,
|
|
subLine2);
|
|
}
|
|
else if (sscanf(line, " %*s %*s %*s %*s %s", subLine) == 1)
|
|
{
|
|
this->ComplexVariableTimeSetIds->InsertNextId(1);
|
|
this->AddVariableDescription(subLine);
|
|
sscanf(line, " %*s %*s %*s %*s %*s %s %s", subLine, subLine2);
|
|
}
|
|
this->AddVariableType();
|
|
this->NumberOfComplexVectorsPerElement++;
|
|
}
|
|
}
|
|
this->AddVariableFileName(subLine, subLine2);
|
|
this->NumberOfComplexVariables++;
|
|
}
|
|
else
|
|
{
|
|
vtkErrorMacro("invalid VARIABLE line: " << line);
|
|
delete this->IS;
|
|
this->IS = NULL;
|
|
return 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (strncmp(line, "TIME", 4) == 0)
|
|
{
|
|
// found TIME section
|
|
int firstTimeStep = 1;
|
|
|
|
this->UseTimeSetsOn();
|
|
while(this->ReadNextDataLine(line) != 0 &&
|
|
strncmp(line, "FILE", 4) != 0)
|
|
{
|
|
sscanf(line, "%*s %*s %d", &timeSet);
|
|
this->TimeSetIds->InsertNextId(timeSet);
|
|
this->ReadNextDataLine(line);
|
|
sscanf(line, "%*s %*s %*s %d", &numTimeSteps);
|
|
this->ReadNextDataLine(line);
|
|
if (strncmp(line, "filename", 8) == 0)
|
|
{
|
|
vtkIdList *filenameNumbers = vtkIdList::New();
|
|
this->TimeSetsWithFilenameNumbers->InsertNextId(timeSet);
|
|
sscanf(line, "%*s %s", subLine);
|
|
if (strncmp(subLine, "numbers", 7) == 0)
|
|
{
|
|
strcpy(formatLine, "%*s %*s");
|
|
strcpy(subLine, "%*s %*s");
|
|
for (i = 0; i < numTimeSteps; i++)
|
|
{
|
|
strcat(formatLine, " %d");
|
|
sscanf(line, formatLine, &filenameNum);
|
|
filenameNumbers->InsertNextId(filenameNum);
|
|
strcat(subLine, " %*d");
|
|
strcpy(formatLine, subLine);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
sscanf(line, "%*s %*s %*s %d", &filenameNum);
|
|
this->ReadNextDataLine(line);
|
|
sscanf(line, "%*s %*s %d", &increment);
|
|
for (i = 0; i < numTimeSteps; i++)
|
|
{
|
|
filenameNumbers->InsertNextId(filenameNum + i*increment);
|
|
}
|
|
}
|
|
this->TimeSetFileNameNumbers->AddItem(filenameNumbers);
|
|
filenameNumbers->Delete();
|
|
this->ReadLine(line);
|
|
}
|
|
vtkFloatArray *timeValues = vtkFloatArray::New();
|
|
timeValues->SetNumberOfComponents(1);
|
|
timeValues->SetNumberOfTuples(numTimeSteps);
|
|
strcpy(formatLine, "%*s %*s");
|
|
strcpy(subLine, "%*s %*s");
|
|
for (i = 0; i < numTimeSteps; i++)
|
|
{
|
|
strcat(formatLine, " %f");
|
|
if (sscanf(line, formatLine, &timeStep) != 1)
|
|
{
|
|
this->ReadNextDataLine(line);
|
|
strcpy(formatLine, " %f");
|
|
strcpy(subLine, "");
|
|
sscanf(line, formatLine, &timeStep);
|
|
}
|
|
if (firstTimeStep)
|
|
{
|
|
this->MinimumTimeValue = timeStep;
|
|
this->MaximumTimeValue = timeStep;
|
|
firstTimeStep = 0;
|
|
// Set this as default TimeValue.
|
|
if(!this->TimeValueInitialized)
|
|
{
|
|
this->SetTimeValue(timeStep);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (timeStep < this->MinimumTimeValue)
|
|
{
|
|
this->MinimumTimeValue = timeStep;
|
|
}
|
|
else if (timeStep > this->MaximumTimeValue)
|
|
{
|
|
this->MaximumTimeValue = timeStep;
|
|
}
|
|
}
|
|
timeValues->SetComponent(i, 0, timeStep);
|
|
strcat(subLine, " %*f");
|
|
strcpy(formatLine, subLine);
|
|
}
|
|
this->TimeSets->AddItem(timeValues);
|
|
timeValues->Delete();
|
|
}
|
|
}
|
|
|
|
if (strncmp(line, "FILE", 4) == 0)
|
|
{
|
|
// found FILE section
|
|
this->UseFileSetsOn();
|
|
lineRead = this->ReadNextDataLine(line);
|
|
while (lineRead != 0)
|
|
{
|
|
vtkIdList *filenameNums = vtkIdList::New();
|
|
vtkIdList *numSteps = vtkIdList::New();
|
|
sscanf(line, "%*s %*s %d", &fileSet);
|
|
this->FileSets->InsertNextId(fileSet);
|
|
lineRead = this->ReadNextDataLine(line);
|
|
if (strncmp(line, "filename", 8) == 0)
|
|
{
|
|
this->FileSetsWithFilenameNumbers->InsertNextId(fileSet);
|
|
while (lineRead != 0 && strncmp(line, "filename", 8) == 0)
|
|
{
|
|
sscanf(line, "%*s %*s %d", &filenameNum);
|
|
filenameNums->InsertNextId(filenameNum);
|
|
this->ReadNextDataLine(line);
|
|
sscanf(line, "%*s %*s %*s %d", &numTimeSteps);
|
|
numSteps->InsertNextId(numTimeSteps);
|
|
lineRead = this->ReadNextDataLine(line);
|
|
}
|
|
this->FileSetFileNameNumbers->AddItem(filenameNums);
|
|
}
|
|
else
|
|
{
|
|
sscanf(line, "%*s %*s %*s %d", &numTimeSteps);
|
|
numSteps->InsertNextId(numTimeSteps);
|
|
lineRead = this->ReadNextDataLine(line);
|
|
}
|
|
|
|
this->FileSetNumberOfSteps->AddItem(numSteps);
|
|
|
|
filenameNums->Delete();
|
|
numSteps->Delete();
|
|
}
|
|
}
|
|
|
|
delete this->IS;
|
|
this->IS = NULL;
|
|
|
|
// Fill data array selection objects with these arrays.
|
|
this->SetDataArraySelectionSetsFromVariables();
|
|
|
|
return 1;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
int vtkEnSightReader::ReadVariableFiles()
|
|
{
|
|
int i, j;
|
|
char description[256];
|
|
int timeSet, fileSet, timeStep, timeStepInFile, numSteps;
|
|
vtkDataArray *times;
|
|
float newTime;
|
|
vtkIdList *numStepsList, *filenameNumbers;
|
|
//int fileNum;
|
|
int validTime, filenameNum;
|
|
char* fileName, *fileName2;
|
|
|
|
for (i = 0; i < this->NumberOfVariables; i++)
|
|
{
|
|
switch (this->VariableTypes[i])
|
|
{
|
|
case SCALAR_PER_NODE:
|
|
case VECTOR_PER_NODE:
|
|
case TENSOR_SYMM_PER_NODE:
|
|
case SCALAR_PER_MEASURED_NODE:
|
|
case VECTOR_PER_MEASURED_NODE:
|
|
if(!this->GetPointArrayStatus(this->VariableDescriptions[i]))
|
|
{
|
|
continue;
|
|
}
|
|
break;
|
|
case SCALAR_PER_ELEMENT:
|
|
case VECTOR_PER_ELEMENT:
|
|
case TENSOR_SYMM_PER_ELEMENT:
|
|
if(!this->GetCellArrayStatus(this->VariableDescriptions[i]))
|
|
{
|
|
continue;
|
|
}
|
|
break;
|
|
}
|
|
|
|
timeStep = 0;
|
|
timeStepInFile = 1;
|
|
//fileNum = 1;
|
|
validTime = 1;
|
|
fileName = new char[strlen(this->VariableFileNames[i]) + 1];
|
|
strcpy(fileName, this->VariableFileNames[i]);
|
|
if (this->UseTimeSets)
|
|
{
|
|
validTime = 0;
|
|
timeSet = this->VariableTimeSetIds->GetId(i);
|
|
times = this->TimeSets->GetItem(this->TimeSetIds->IsId(timeSet));
|
|
for (j = 0; j < times->GetNumberOfTuples(); j++)
|
|
{
|
|
newTime = times->GetComponent(j, 0);
|
|
if (newTime <= this->TimeValue)
|
|
{
|
|
timeStep++;
|
|
if (this->VariableTypes[i] == SCALAR_PER_MEASURED_NODE ||
|
|
this->VariableTypes[i] == VECTOR_PER_MEASURED_NODE)
|
|
{
|
|
if (newTime >= this->MeasuredTimeValue ||
|
|
this->MeasuredTimeSet == -1)
|
|
{
|
|
validTime = 1;
|
|
}
|
|
}
|
|
else if (newTime >= this->GeometryTimeValue ||
|
|
this->GeometryTimeSet == -1)
|
|
{
|
|
validTime = 1;
|
|
}
|
|
}
|
|
}
|
|
if (this->TimeSetFileNameNumbers->GetNumberOfItems() > 0 &&
|
|
validTime)
|
|
{
|
|
int collectionNum = this->TimeSetsWithFilenameNumbers->IsId(timeSet);
|
|
if (collectionNum > -1)
|
|
{
|
|
filenameNumbers = this->TimeSetFileNameNumbers->
|
|
GetItem(collectionNum);
|
|
filenameNum = filenameNumbers->GetId(timeStep-1);
|
|
this->ReplaceWildcards(fileName, filenameNum);
|
|
}
|
|
}
|
|
|
|
// There can only be file sets if there are also time sets.
|
|
if (this->UseFileSets)
|
|
{
|
|
timeStepInFile = timeStep;
|
|
fileSet = this->VariableFileSetIds->GetId(i);
|
|
numStepsList = (vtkIdList*)this->FileSetNumberOfSteps->
|
|
GetItemAsObject(this->FileSets->IsId(fileSet));
|
|
|
|
if (timeStep > numStepsList->GetId(0))
|
|
{
|
|
numSteps = numStepsList->GetId(0);
|
|
timeStepInFile -= numSteps;
|
|
for (i = 1; i < numStepsList->GetNumberOfIds(); i++)
|
|
{
|
|
numSteps += numStepsList->GetId(i);
|
|
if (timeStep > numSteps)
|
|
{
|
|
//fileNum++;
|
|
timeStepInFile -= numStepsList->GetId(i);
|
|
}
|
|
}
|
|
}
|
|
if (this->FileSetFileNameNumbers->GetNumberOfItems() > 0 &&
|
|
validTime)
|
|
{
|
|
int collectionNum = this->FileSetsWithFilenameNumbers->IsId(fileSet);
|
|
if (collectionNum > -1)
|
|
{
|
|
filenameNumbers = this->TimeSetFileNameNumbers->
|
|
GetItem(collectionNum);
|
|
filenameNum = filenameNumbers->GetId(timeStep-1);
|
|
this->ReplaceWildcards(fileName, filenameNum);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (validTime)
|
|
{
|
|
switch (this->VariableTypes[i])
|
|
{
|
|
case vtkEnSightReader::SCALAR_PER_NODE:
|
|
this->ReadScalarsPerNode(fileName, this->VariableDescriptions[i],
|
|
timeStepInFile);
|
|
break;
|
|
case vtkEnSightReader::SCALAR_PER_MEASURED_NODE:
|
|
this->ReadScalarsPerNode(fileName, this->VariableDescriptions[i],
|
|
timeStepInFile, 1);
|
|
break;
|
|
case vtkEnSightReader::VECTOR_PER_NODE:
|
|
this->ReadVectorsPerNode(fileName, this->VariableDescriptions[i],
|
|
timeStepInFile);
|
|
break;
|
|
case vtkEnSightReader::VECTOR_PER_MEASURED_NODE:
|
|
this->ReadVectorsPerNode(fileName, this->VariableDescriptions[i],
|
|
timeStepInFile, 1);
|
|
break;
|
|
case vtkEnSightReader::TENSOR_SYMM_PER_NODE:
|
|
this->ReadTensorsPerNode(fileName, this->VariableDescriptions[i],
|
|
timeStepInFile);
|
|
break;
|
|
case vtkEnSightReader::SCALAR_PER_ELEMENT:
|
|
this->ReadScalarsPerElement(fileName, this->VariableDescriptions[i],
|
|
timeStepInFile);
|
|
break;
|
|
case vtkEnSightReader::VECTOR_PER_ELEMENT:
|
|
this->ReadVectorsPerElement(fileName, this->VariableDescriptions[i],
|
|
timeStepInFile);
|
|
break;
|
|
case vtkEnSightReader::TENSOR_SYMM_PER_ELEMENT:
|
|
this->ReadTensorsPerElement(fileName, this->VariableDescriptions[i],
|
|
timeStepInFile);
|
|
break;
|
|
}
|
|
}
|
|
delete [] fileName;
|
|
}
|
|
for (i = 0; i < this->NumberOfComplexVariables; i++)
|
|
{
|
|
switch(this->ComplexVariableTypes[i])
|
|
{
|
|
case COMPLEX_SCALAR_PER_NODE:
|
|
case COMPLEX_VECTOR_PER_NODE:
|
|
if(!this->GetPointArrayStatus(this->ComplexVariableDescriptions[i]))
|
|
{
|
|
continue;
|
|
}
|
|
break;
|
|
case COMPLEX_SCALAR_PER_ELEMENT:
|
|
case COMPLEX_VECTOR_PER_ELEMENT:
|
|
if(!this->GetCellArrayStatus(this->ComplexVariableDescriptions[i]))
|
|
{
|
|
continue;
|
|
}
|
|
break;
|
|
}
|
|
timeStep = 0;
|
|
timeStepInFile = 1;
|
|
//fileNum = 1;
|
|
validTime = 1;
|
|
fileName = new char[strlen(this->ComplexVariableFileNames[2*i]) + 1];
|
|
strcpy(fileName, this->ComplexVariableFileNames[2*i]);
|
|
fileName2 = new char[strlen(this->ComplexVariableFileNames[2*i+1]) + 1];
|
|
strcpy(fileName2, this->ComplexVariableFileNames[2*i+1]);
|
|
if (this->UseTimeSets)
|
|
{
|
|
validTime = 0;
|
|
timeSet = this->VariableTimeSetIds->GetId(i);
|
|
times = this->TimeSets->GetItem(this->TimeSetIds->IsId(timeSet));
|
|
for (j = 0; j < times->GetNumberOfTuples(); j++)
|
|
{
|
|
newTime = times->GetComponent(j, 0);
|
|
if (newTime <= this->TimeValue)
|
|
{
|
|
timeStep++;
|
|
if (this->VariableTypes[i] == SCALAR_PER_MEASURED_NODE ||
|
|
this->VariableTypes[i] == VECTOR_PER_MEASURED_NODE)
|
|
{
|
|
if (newTime >= this->MeasuredTimeValue)
|
|
{
|
|
validTime = 1;
|
|
}
|
|
}
|
|
else if (newTime >= this->GeometryTimeValue)
|
|
{
|
|
validTime = 1;
|
|
}
|
|
}
|
|
}
|
|
if (this->TimeSetFileNameNumbers->GetNumberOfItems() > 0 &&
|
|
validTime)
|
|
{
|
|
int collectionNum = this->TimeSetsWithFilenameNumbers->IsId(timeSet);
|
|
if (collectionNum > -1)
|
|
{
|
|
filenameNumbers = this->TimeSetFileNameNumbers->
|
|
GetItem(collectionNum);
|
|
filenameNum = filenameNumbers->GetId(timeStep-1);
|
|
this->ReplaceWildcards(fileName, filenameNum);
|
|
this->ReplaceWildcards(fileName2, filenameNum);
|
|
}
|
|
}
|
|
|
|
// There can only be file sets if there are also time sets.
|
|
if (this->UseFileSets)
|
|
{
|
|
timeStepInFile = timeStep;
|
|
fileSet = this->VariableFileSetIds->GetId(i);
|
|
numStepsList = (vtkIdList*)this->FileSetNumberOfSteps->
|
|
GetItemAsObject(this->FileSets->IsId(fileSet));
|
|
|
|
if (timeStep > numStepsList->GetId(0))
|
|
{
|
|
numSteps = numStepsList->GetId(0);
|
|
timeStepInFile -= numSteps;
|
|
for (i = 1; i < numStepsList->GetNumberOfIds(); i++)
|
|
{
|
|
numSteps += numStepsList->GetId(i);
|
|
if (timeStep > numSteps)
|
|
{
|
|
//fileNum++;
|
|
timeStepInFile -= numStepsList->GetId(i);
|
|
}
|
|
}
|
|
}
|
|
if (this->FileSetFileNameNumbers->GetNumberOfItems() > 0 &&
|
|
validTime)
|
|
{
|
|
int collectionNum = this->FileSetsWithFilenameNumbers->IsId(fileSet);
|
|
if (collectionNum > -1)
|
|
{
|
|
filenameNumbers = this->FileSetFileNameNumbers->
|
|
GetItem(collectionNum);
|
|
filenameNum = filenameNumbers->GetId(timeStep-1);
|
|
this->ReplaceWildcards(fileName, filenameNum);
|
|
this->ReplaceWildcards(fileName2, filenameNum);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (validTime)
|
|
{
|
|
switch (this->ComplexVariableTypes[i])
|
|
{
|
|
case vtkEnSightReader::COMPLEX_SCALAR_PER_NODE:
|
|
this->ReadScalarsPerNode(fileName,
|
|
this->ComplexVariableDescriptions[i],
|
|
timeStepInFile, 0, 2);
|
|
this->ReadScalarsPerNode(fileName2,
|
|
this->ComplexVariableDescriptions[i],
|
|
timeStepInFile, 0, 2, 1);
|
|
break;
|
|
case vtkEnSightReader::COMPLEX_VECTOR_PER_NODE:
|
|
strcpy(description, this->ComplexVariableDescriptions[i]);
|
|
strcat(description, "_r");
|
|
this->ReadVectorsPerNode(fileName, description, timeStepInFile);
|
|
strcpy(description, this->ComplexVariableDescriptions[i]);
|
|
strcat(description, "_i");
|
|
this->ReadVectorsPerNode(fileName2, description, timeStepInFile);
|
|
break;
|
|
case vtkEnSightReader::COMPLEX_SCALAR_PER_ELEMENT:
|
|
this->ReadScalarsPerElement(fileName,
|
|
this->ComplexVariableDescriptions[i],
|
|
timeStepInFile, 2);
|
|
this->ReadScalarsPerElement(fileName2,
|
|
this->ComplexVariableDescriptions[i],
|
|
timeStepInFile, 2, 1);
|
|
break;
|
|
case vtkEnSightReader::COMPLEX_VECTOR_PER_ELEMENT:
|
|
strcpy(description, this->ComplexVariableDescriptions[i]);
|
|
strcat(description, "_r");
|
|
this->ReadVectorsPerElement(fileName, description, timeStepInFile);
|
|
strcpy(description, this->ComplexVariableDescriptions[i]);
|
|
strcat(description, "_i");
|
|
this->ReadVectorsPerElement(fileName2, description, timeStepInFile);
|
|
break;
|
|
}
|
|
}
|
|
delete [] fileName;
|
|
delete [] fileName2;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
void vtkEnSightReader::AddVariableFileName(const char* fileName1,
|
|
const char* fileName2)
|
|
{
|
|
int size;
|
|
int i;
|
|
|
|
if (this->VariableMode < 8)
|
|
{
|
|
size = this->NumberOfVariables;
|
|
|
|
char** newFileNameList = new char *[size]; // temporary array
|
|
|
|
// copy file names to temporary array
|
|
for (i = 0; i < size; i++)
|
|
{
|
|
newFileNameList[i] = new char[strlen(this->VariableFileNames[i]) + 1];
|
|
strcpy(newFileNameList[i], this->VariableFileNames[i]);
|
|
delete [] this->VariableFileNames[i];
|
|
}
|
|
delete [] this->VariableFileNames;
|
|
|
|
// make room for new file name
|
|
this->VariableFileNames = new char *[size+1];
|
|
|
|
// copy existing file names back to first array
|
|
for (i = 0; i < size; i++)
|
|
{
|
|
this->VariableFileNames[i] = new char[strlen(newFileNameList[i]) + 1];
|
|
strcpy(this->VariableFileNames[i], newFileNameList[i]);
|
|
delete [] newFileNameList[i];
|
|
}
|
|
delete [] newFileNameList;
|
|
|
|
// add new file name at end of first array
|
|
this->VariableFileNames[size] = new char[strlen(fileName1) + 1];
|
|
strcpy(this->VariableFileNames[size], fileName1);
|
|
vtkDebugMacro( << "file name: " << this->VariableFileNames[size]);
|
|
}
|
|
else
|
|
{
|
|
size = this->NumberOfComplexVariables;
|
|
|
|
char** newFileNameList = new char *[2 * size]; // temporary array
|
|
|
|
// copy file names to temporary array
|
|
for (i = 0; i < 2*size; i++)
|
|
{
|
|
newFileNameList[i] =
|
|
new char[strlen(this->ComplexVariableFileNames[i]) + 1];
|
|
strcpy(newFileNameList[i], this->ComplexVariableFileNames[i]);
|
|
delete [] this->ComplexVariableFileNames[i];
|
|
}
|
|
delete [] this->ComplexVariableFileNames;
|
|
|
|
// make room for new file name
|
|
this->ComplexVariableFileNames = new char *[2*(size+1)];
|
|
|
|
// copy existing file names back to first array
|
|
for (i = 0; i < 2*size; i++)
|
|
{
|
|
this->ComplexVariableFileNames[i] =
|
|
new char[strlen(newFileNameList[i]) + 1];
|
|
strcpy(this->ComplexVariableFileNames[i], newFileNameList[i]);
|
|
delete [] newFileNameList[i];
|
|
}
|
|
delete [] newFileNameList;
|
|
|
|
// add new file name at end of first array
|
|
this->ComplexVariableFileNames[2*size] = new char[strlen(fileName1) + 1];
|
|
strcpy(this->ComplexVariableFileNames[2*size], fileName1);
|
|
vtkDebugMacro("real file name: "
|
|
<< this->ComplexVariableFileNames[2*size]);
|
|
this->ComplexVariableFileNames[2*size+1] = new char[strlen(fileName2) + 1];
|
|
strcpy(this->ComplexVariableFileNames[2*size+1], fileName2);
|
|
vtkDebugMacro("imag. file name: "
|
|
<< this->ComplexVariableFileNames[2*size+1]);
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
void vtkEnSightReader::AddVariableDescription(const char* description)
|
|
{
|
|
int size;
|
|
int i;
|
|
|
|
if (this->VariableMode < 8)
|
|
{
|
|
size = this->NumberOfVariables;
|
|
|
|
char ** newDescriptionList = new char *[size]; // temporary array
|
|
|
|
// copy descriptions to temporary array
|
|
for (i = 0; i < size; i++)
|
|
{
|
|
newDescriptionList[i] =
|
|
new char[strlen(this->VariableDescriptions[i]) + 1];
|
|
strcpy(newDescriptionList[i], this->VariableDescriptions[i]);
|
|
delete [] this->VariableDescriptions[i];
|
|
}
|
|
delete [] this->VariableDescriptions;
|
|
|
|
// make room for new description
|
|
this->VariableDescriptions = new char *[size+1];
|
|
|
|
// copy existing descriptions back to first array
|
|
for (i = 0; i < size; i++)
|
|
{
|
|
this->VariableDescriptions[i] =
|
|
new char[strlen(newDescriptionList[i]) + 1];
|
|
strcpy(this->VariableDescriptions[i], newDescriptionList[i]);
|
|
delete [] newDescriptionList[i];
|
|
}
|
|
delete [] newDescriptionList;
|
|
|
|
// add new description at end of first array
|
|
this->VariableDescriptions[size] = new char[strlen(description) + 1];
|
|
strcpy(this->VariableDescriptions[size], description);
|
|
vtkDebugMacro("description: " << this->VariableDescriptions[size]);
|
|
}
|
|
else
|
|
{
|
|
size = this->NumberOfComplexVariables;
|
|
|
|
char ** newDescriptionList = new char *[size]; // temporary array
|
|
|
|
// copy descriptions to temporary array
|
|
for (i = 0; i < size; i++)
|
|
{
|
|
newDescriptionList[i] =
|
|
new char[strlen(this->ComplexVariableDescriptions[i]) + 1];
|
|
strcpy(newDescriptionList[i], this->ComplexVariableDescriptions[i]);
|
|
delete [] this->ComplexVariableDescriptions[i];
|
|
}
|
|
delete [] this->ComplexVariableDescriptions;
|
|
|
|
// make room for new description
|
|
this->ComplexVariableDescriptions = new char *[size+1];
|
|
|
|
// copy existing descriptions back to first array
|
|
for (i = 0; i < size; i++)
|
|
{
|
|
this->ComplexVariableDescriptions[i] =
|
|
new char[strlen(newDescriptionList[i]) + 1];
|
|
strcpy(this->ComplexVariableDescriptions[i], newDescriptionList[i]);
|
|
delete [] newDescriptionList[i];
|
|
}
|
|
delete [] newDescriptionList;
|
|
|
|
// add new description at end of first array
|
|
this->ComplexVariableDescriptions[size] =
|
|
new char[strlen(description) + 1];
|
|
strcpy(this->ComplexVariableDescriptions[size], description);
|
|
vtkDebugMacro("description: "
|
|
<< this->ComplexVariableDescriptions[size]);
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
void vtkEnSightReader::AddVariableType()
|
|
{
|
|
int size;
|
|
int i;
|
|
int *types = NULL;
|
|
|
|
// Figure out what the size of the variable type array is.
|
|
if (this->VariableMode < 8)
|
|
{
|
|
size = this->NumberOfVariables;
|
|
|
|
types = new int[size];
|
|
|
|
for (i = 0; i < size; i++)
|
|
{
|
|
types[i] = this->VariableTypes[i];
|
|
}
|
|
delete [] this->VariableTypes;
|
|
|
|
this->VariableTypes = new int[size+1];
|
|
for (i = 0; i < size; i++)
|
|
{
|
|
this->VariableTypes[i] = types[i];
|
|
}
|
|
delete [] types;
|
|
this->VariableTypes[size] = this->VariableMode;
|
|
vtkDebugMacro("variable type: " << this->VariableTypes[size]);
|
|
}
|
|
else
|
|
{
|
|
size = this->NumberOfComplexVariables;
|
|
|
|
if (size > 0)
|
|
{
|
|
types = new int[size];
|
|
for (i = 0; i < size; i++)
|
|
{
|
|
types[i] = this->ComplexVariableTypes[i];
|
|
}
|
|
delete [] this->ComplexVariableTypes;
|
|
}
|
|
|
|
this->ComplexVariableTypes = new int[size+1];
|
|
for (i = 0; i < size; i++)
|
|
{
|
|
this->ComplexVariableTypes[i] = types[i];
|
|
}
|
|
|
|
if (size > 0)
|
|
{
|
|
delete [] types;
|
|
}
|
|
this->ComplexVariableTypes[size] = this->VariableMode;
|
|
vtkDebugMacro("complex variable type: "
|
|
<< this->ComplexVariableTypes[size]);
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
int vtkEnSightReader::GetSectionType(const char *line)
|
|
{
|
|
if (strncmp(line, "coordinates", 5) == 0)
|
|
{
|
|
return vtkEnSightReader::COORDINATES;
|
|
}
|
|
else if (strncmp(line, "block", 4) == 0)
|
|
{
|
|
return vtkEnSightReader::BLOCK;
|
|
}
|
|
else if (this->GetElementType(line) != -1)
|
|
{
|
|
return vtkEnSightReader::ELEMENT;
|
|
}
|
|
else
|
|
{
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
int vtkEnSightReader::GetElementType(const char* line)
|
|
{
|
|
if (strncmp(line, "point", 5) == 0)
|
|
{
|
|
return vtkEnSightReader::POINT;
|
|
}
|
|
else if (strncmp(line, "bar2", 4) == 0)
|
|
{
|
|
return vtkEnSightReader::BAR2;
|
|
}
|
|
else if (strncmp(line, "bar3", 4) == 0)
|
|
{
|
|
return vtkEnSightReader::BAR3;
|
|
}
|
|
else if (strncmp(line, "nsided", 6) == 0)
|
|
{
|
|
return vtkEnSightReader::NSIDED;
|
|
}
|
|
else if (strncmp(line, "tria3", 5) == 0)
|
|
{
|
|
return vtkEnSightReader::TRIA3;
|
|
}
|
|
else if (strncmp(line, "tria6", 5) == 0)
|
|
{
|
|
return vtkEnSightReader::TRIA6;
|
|
}
|
|
else if (strncmp(line, "quad4", 5) == 0)
|
|
{
|
|
return vtkEnSightReader::QUAD4;
|
|
}
|
|
else if (strncmp(line, "quad8", 5) == 0)
|
|
{
|
|
return vtkEnSightReader::QUAD8;
|
|
}
|
|
else if (strncmp(line, "tetra4", 6) == 0)
|
|
{
|
|
return vtkEnSightReader::TETRA4;
|
|
}
|
|
else if (strncmp(line, "tetra10", 7) == 0)
|
|
{
|
|
return vtkEnSightReader::TETRA10;
|
|
}
|
|
else if (strncmp(line, "pyramid5", 8) == 0)
|
|
{
|
|
return vtkEnSightReader::PYRAMID5;
|
|
}
|
|
else if (strncmp(line, "pyramid13", 9) == 0)
|
|
{
|
|
return vtkEnSightReader::PYRAMID13;
|
|
}
|
|
else if (strncmp(line, "hexa8", 5) == 0)
|
|
{
|
|
return vtkEnSightReader::HEXA8;
|
|
}
|
|
else if (strncmp(line, "hexa20", 6) == 0)
|
|
{
|
|
return vtkEnSightReader::HEXA20;
|
|
}
|
|
else if (strncmp(line, "penta6", 6) == 0)
|
|
{
|
|
return vtkEnSightReader::PENTA6;
|
|
}
|
|
else if (strncmp(line, "penta15", 7) == 0)
|
|
{
|
|
return vtkEnSightReader::PENTA15;
|
|
}
|
|
else
|
|
{
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
void vtkEnSightReader::ReplaceWildcards(char* filename, int num)
|
|
{
|
|
int wildcardPos, numWildcards, numDigits = 1, i;
|
|
int tmpNum = num, multTen = 1;
|
|
char newChar;
|
|
int newNum;
|
|
|
|
wildcardPos = static_cast<int>(strcspn(filename, "*"));
|
|
numWildcards = static_cast<int>(strspn(filename + wildcardPos, "*"));
|
|
|
|
if (numWildcards == 0)
|
|
{
|
|
return;
|
|
}
|
|
|
|
tmpNum /= 10;
|
|
while (tmpNum >= 1)
|
|
{
|
|
numDigits++;
|
|
multTen *= 10;
|
|
tmpNum /= 10;
|
|
}
|
|
|
|
for (i = 0; i < numWildcards - numDigits; i++)
|
|
{
|
|
filename[i + wildcardPos] = '0';
|
|
}
|
|
|
|
tmpNum = num;
|
|
for (i = numWildcards - numDigits; i < numWildcards; i++)
|
|
{
|
|
newNum = tmpNum / multTen;
|
|
switch (newNum)
|
|
{
|
|
case 0:
|
|
newChar = '0';
|
|
break;
|
|
case 1:
|
|
newChar = '1';
|
|
break;
|
|
case 2:
|
|
newChar = '2';
|
|
break;
|
|
case 3:
|
|
newChar = '3';
|
|
break;
|
|
case 4:
|
|
newChar = '4';
|
|
break;
|
|
case 5:
|
|
newChar = '5';
|
|
break;
|
|
case 6:
|
|
newChar = '6';
|
|
break;
|
|
case 7:
|
|
newChar = '7';
|
|
break;
|
|
case 8:
|
|
newChar = '8';
|
|
break;
|
|
case 9:
|
|
newChar = '9';
|
|
break;
|
|
default:
|
|
// This case should never be reached.
|
|
return;
|
|
}
|
|
|
|
filename[i + wildcardPos] = newChar;
|
|
tmpNum -= multTen * newNum;
|
|
multTen /= 10;
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
// Called by constructor to set up output array.
|
|
void vtkEnSightReader::SetNumberOfOutputsInternal(int num)
|
|
{
|
|
int idx;
|
|
vtkDataObject **outputs;
|
|
|
|
// in case nothing has changed.
|
|
if (num == this->NumberOfOutputs)
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Allocate new arrays.
|
|
outputs = new vtkDataObject *[num];
|
|
|
|
// Initialize with NULLs.
|
|
for (idx = 0; idx < num; ++idx)
|
|
{
|
|
outputs[idx] = NULL;
|
|
}
|
|
|
|
// Copy old outputs
|
|
for (idx = 0; idx < num && idx < this->NumberOfOutputs; ++idx)
|
|
{
|
|
outputs[idx] = this->Outputs[idx];
|
|
}
|
|
|
|
// delete the previous arrays
|
|
if (this->Outputs)
|
|
{
|
|
delete [] this->Outputs;
|
|
this->Outputs = NULL;
|
|
this->NumberOfOutputs = 0;
|
|
}
|
|
|
|
// Set the new arrays
|
|
this->Outputs = outputs;
|
|
|
|
this->NumberOfOutputs = num;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
void vtkEnSightReader::ReplaceNthOutput(int idx, vtkDataObject* newOutput)
|
|
{
|
|
vtkDataObject *oldOutput;
|
|
|
|
if (idx < 0)
|
|
{
|
|
vtkErrorMacro(<< "SetNthOutput: " << idx << ", cannot set output. ");
|
|
return;
|
|
}
|
|
// Expand array if necessary.
|
|
if (idx >= this->NumberOfOutputs)
|
|
{
|
|
this->SetNumberOfOutputsInternal(idx + 1);
|
|
}
|
|
|
|
// does this change anything?
|
|
oldOutput = this->Outputs[idx];
|
|
if (newOutput == oldOutput)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if ( !newOutput->IsA(oldOutput->GetClassName()) )
|
|
{
|
|
vtkErrorMacro("Can not replace the output with a different type.");
|
|
return;
|
|
}
|
|
|
|
if (newOutput)
|
|
{
|
|
vtkSource *newOutputOldSource = newOutput->GetSource();
|
|
if (newOutputOldSource)
|
|
{
|
|
vtkErrorMacro("The new output can not have a source.");
|
|
return;
|
|
}
|
|
}
|
|
|
|
// disconnect first existing source-output relationship.
|
|
if (oldOutput)
|
|
{
|
|
oldOutput->SetSource(NULL);
|
|
oldOutput->UnRegister(this);
|
|
this->Outputs[idx] = NULL;
|
|
}
|
|
|
|
if (newOutput)
|
|
{
|
|
// Register the newOutput so it does not get deleted.
|
|
// Don't set the link yet until previous links is disconnected.
|
|
newOutput->Register(this);
|
|
newOutput->SetSource(this);
|
|
}
|
|
|
|
// now actually make the link that was registered previously.
|
|
this->Outputs[idx] = newOutput;
|
|
|
|
}
|
|
|
|
int vtkEnSightReader::CheckOutputConsistency()
|
|
{
|
|
if (this->NumberOfOutputs > this->NumberOfNewOutputs &&
|
|
! this->InitialRead)
|
|
{
|
|
vtkErrorMacro("Cannot decrease number of outputs after initial read");
|
|
this->OutputsAreValid = 0;
|
|
}
|
|
|
|
if (this->InitialRead)
|
|
{
|
|
this->InitialRead = 0;
|
|
}
|
|
|
|
return this->OutputsAreValid;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
vtkIdList* vtkEnSightReader::GetCellIds(int index, int cellType)
|
|
{
|
|
// Check argument range.
|
|
if(cellType < 0 || cellType > 15)
|
|
{
|
|
vtkErrorMacro("Cell type " << cellType
|
|
<< " out of range. Only 16 types exist.");
|
|
return 0;
|
|
}
|
|
if(index < 0 || index > this->UnstructuredPartIds->GetNumberOfIds())
|
|
{
|
|
vtkErrorMacro("Index " << index << " out of range. Only "
|
|
<< this->UnstructuredPartIds->GetNumberOfIds()
|
|
<< " IDs exist.");
|
|
return 0;
|
|
}
|
|
|
|
// Create the container if necessary.
|
|
if(!this->CellIds)
|
|
{
|
|
this->CellIds = new vtkEnSightReaderCellIdsType;
|
|
}
|
|
|
|
// Get the index of the actual vtkIdList requested.
|
|
unsigned int cellIdsIndex = index*16 + cellType;
|
|
|
|
// Make sure the container is large enough for this index.
|
|
if(cellIdsIndex+1 > this->CellIds->size())
|
|
{
|
|
this->CellIds->resize(cellIdsIndex+1);
|
|
}
|
|
|
|
// Make sure this vtkIdList exists.
|
|
if(!(*this->CellIds)[cellIdsIndex].GetPointer())
|
|
{
|
|
vtkIdList* nl = vtkIdList::New();
|
|
(*this->CellIds)[cellIdsIndex] = nl;
|
|
nl->Delete();
|
|
}
|
|
|
|
// Return the requested vtkIdList.
|
|
return (*this->CellIds)[cellIdsIndex].GetPointer();
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
void vtkEnSightReader::PrintSelf(ostream& os, vtkIndent indent)
|
|
{
|
|
this->Superclass::PrintSelf(os,indent);
|
|
|
|
os << indent << "CaseFileName: "
|
|
<< (this->CaseFileName ? this->CaseFileName : "(none)") << endl;
|
|
os << indent << "FilePath: "
|
|
<< (this->FilePath ? this->FilePath : "(none)") << endl;
|
|
os << indent << "NumberOfComplexScalarsPerNode: "
|
|
<< this->NumberOfComplexScalarsPerNode << endl;
|
|
os << indent << "NumberOfVectorsPerElement :"
|
|
<< this->NumberOfVectorsPerElement << endl;
|
|
os << indent << "NumberOfTensorsSymmPerElement: "
|
|
<< this->NumberOfTensorsSymmPerElement << endl;
|
|
os << indent << "NumberOfComplexVectorsPerNode: "
|
|
<< this->NumberOfComplexVectorsPerNode << endl;
|
|
os << indent << "NumberOfScalarsPerElement: "
|
|
<< this->NumberOfScalarsPerElement << endl;
|
|
os << indent << "NumberOfComplexVectorsPerElement: "
|
|
<< this->NumberOfComplexVectorsPerElement << endl;
|
|
os << indent << "NumberOfComplexScalarsPerElement: "
|
|
<< this->NumberOfComplexScalarsPerElement << endl;
|
|
os << indent << "NumberOfTensorsSymmPerNode: "
|
|
<< this->NumberOfTensorsSymmPerNode << endl;
|
|
os << indent << "NumberOfScalarsPerMeasuredNode: "
|
|
<< this->NumberOfScalarsPerMeasuredNode << endl;
|
|
os << indent << "NumberOfVectorsPerMeasuredNode: "
|
|
<< this->NumberOfVectorsPerMeasuredNode << endl;
|
|
os << indent << "NumberOfScalarsPerNode: "
|
|
<< this->NumberOfScalarsPerNode << endl;
|
|
os << indent << "NumberOfVectorsPerNode: "
|
|
<< this->NumberOfVectorsPerNode << endl;
|
|
os << indent << "TimeValue: " << this->TimeValue << endl;
|
|
os << indent << "MinimumTimeValue: " << this->MinimumTimeValue << endl;
|
|
os << indent << "MaximumTimeValue: " << this->MaximumTimeValue << endl;
|
|
os << indent << "TimeSets: " << this->TimeSets << endl;
|
|
os << indent << "OutputsAreValid: " << this->OutputsAreValid << endl;
|
|
}
|
|
|