diff options
Diffstat (limited to 'src/vtkAMRStructuredPointsReader.cxx')
-rwxr-xr-x | src/vtkAMRStructuredPointsReader.cxx | 327 |
1 files changed, 327 insertions, 0 deletions
diff --git a/src/vtkAMRStructuredPointsReader.cxx b/src/vtkAMRStructuredPointsReader.cxx new file mode 100755 index 0000000..80b08d0 --- /dev/null +++ b/src/vtkAMRStructuredPointsReader.cxx @@ -0,0 +1,327 @@ +#include "vtkAMRStructuredPointsReader.h" +#include "vtkScalars.h" +#include "vtkFloatArray.h" +#include "vtkIntArray.h" +#include "vtkShortArray.h" +#include "vtkUnsignedShortArray.h" +#include "vtkUnsignedCharArray.h" +#include <stdio.h> +#include <string.h> + +vtkAMRStructuredPointsReader::vtkAMRStructuredPointsReader():hdf_file(0),file(0),index(0){ + filename[0]='\0'; + skipmap=0; + curset=curtime=curlevel=0; + maxset=maxtime=maxlevel=0; + myreader=NULL; + SetLoggedOff(); + fprintf(stderr,"before loggedrange\n"); + loggedmax=0.0; + loggedmin=0.0; + fprintf(stderr,"after loggedrange\n"); +} + + +unsigned long vtkAMRStructuredPointsReader::GetMTime() +{ + unsigned long dtime = this->vtkSource::GetMTime(); + // get last modification time... need to set this myself... + //unsigned long rtime = this->Reader.GetMTime(); + //return (dtime > rtime ? dtime : rtime); + return dtime; +} + +// Description: +// Specify file name of vtk polygonal data file to read. +// immediately constructs the file handle, but reading +// doesn't occur until Execute is called (through Update method). + +void vtkAMRStructuredPointsReader::SetFileName(char *name) { + if(file) delete file; // reopen for new filename + file=0; + hdf_file=0; + if(!name){ + vtkErrorMacro(<<"Null Datafile!"); + return; + } + // statically allocating filename for right now + strncpy(filename,name,sizeof(filename)); // copy the name (for printing info) + filename[sizeof(filename)-1]='\0'; // cap it off; + file = new IEEEIO(name,IObase::Read); + if(!file->isValid()){ + delete file; + file=0; + file = hdf_file = new HDFIO(name,IObase::Read); + if(!file->isValid()){ + vtkErrorMacro(<<"Not a valid IEEEIO or HDF-SDS file: "<<name); + delete file; + file=0; + hdf_file=0; + filename[0]='\0'; + return; + } + } + // here is where we should scan to differentiate datasets from coords + if(skipmap) delete skipmap; + int nds=file->nDatasets(); + skipmap = new int[nds]; + for(index=0,maxindex=0;index<nds;index++){ + file->seek(index); + if(!hdf_file || hdf_file->isCoord()) continue; + else skipmap[maxindex++] = index; + } + maxindex--; + index = skipmap[0]; // reset the file index to 0; (should scan for datasets) + myreader=new Brads_AmrFileReader(*file); + if (myreader==NULL){ + vtkErrorMacro(<<"Not a valid AMR file: "<<name); + return; + } + myreader->setDataLoadingOff(); + maxlevel=myreader->getNumLevels()-1; + myreader->getTimeRange(mintime,maxtime); + int ii=0; + for (ii;ii<=maxlevel;ii++) myreader->hideLevel(ii); + myreader->showLevel(curlevel); + myreader->setTime(curtime); + maxset=myreader->getNumGrids(); + Modified(); // this has been modified +} + +int vtkAMRStructuredPointsReader::SelectTimeStep(int timestep){ + if (timestep<mintime || timestep>maxtime){ + vtkErrorMacro(<<"Timestep out of range"); + return 0; + } + myreader->setTime(timestep); + curtime=timestep; + maxset=myreader->getNumGrids(); + Modified(); +} + +int vtkAMRStructuredPointsReader::SelectLevel(int level){ + if (level<0 || level>maxlevel){ + vtkErrorMacro(<<"Level out of range"); + return 0; + } + curlevel=level; + int ii=0; + for (ii;ii<=maxlevel;ii++) myreader->hideLevel(ii); + myreader->showLevel(curlevel); + SelectTimeStep(curtime); + Modified(); +} + +int vtkAMRStructuredPointsReader::SelectDataset(int dataset){ + if (dataset<0 || dataset>=maxset){ + vtkErrorMacro(<<"Dataset out of range"); + return 0; + } + curset=dataset; + index=file->seek(myreader->getActiveIndex(curset)); + Modified(); +} + + + +void vtkAMRStructuredPointsReader::Execute(){ + + //fprintf(stderr,"in execute\n"); + //puts("vtkAMR:execute()"); + int numPts=0,i; + char line[256]; + int dimsRead=0; +#ifdef VTK31 + vtkStructuredPoints *output=(vtkStructuredPoints *)this->Outputs[0]; +#else + vtkStructuredPoints *output=(vtkStructuredPoints *)this->Output; +#endif + + if(!file || !(file->isValid())) { + vtkErrorMacro(<<"Invalid Data File (cannot read)!"); + return; + } + // seek to current + file->seek(index); + // read dimensions + int rank,dims[3]={1,1,1}; + IObase::DataType datatype; + i=file->readInfo(datatype,rank,dims,3); + //printf("ReadInfo: type=%u rank=%u dims[0]=%u dims[1]=%u dims[2]=%u retval=%u\n",(int)datatype,rank,dims[0],dims[1],dims[2],i); + //for(i=0,numPts=1;i<rank;i++) numPts*=dims[i]; + numPts = IObase::nElements(rank,dims); + output->SetDimensions(dims); + // danger if file is >3 dimensions!!! + + // read x,y, and z coordinates + // for now, lets just set them to to the dimensions of the dataset + // ReadCoordinates(output,<dimnumber>,ncoords) + // ReadPointData(output,npoints) + // for now, we only support two different types + { // push stack + void *ptr; + vtkScalars *scalars = vtkScalars::New(); + scalars->Allocate(numPts*8); // bogus? + + switch(datatype){ + case IObase::Float32: + { + scalars->SetDataTypeToFloat(); + vtkFloatArray *farray = (vtkFloatArray*)scalars->GetData(); + ptr = (void*)farray->WritePointer(0, numPts); + } + break; + case IObase::Char: + case IObase::uChar: + { + scalars->SetDataTypeToUnsignedChar(); + vtkUnsignedCharArray *ucarray = + (vtkUnsignedCharArray*)scalars->GetData(); + ptr = (void*)ucarray->WritePointer(0, numPts); + } + break; + case IObase::Int16: + { + scalars->SetDataTypeToShort(); + vtkShortArray *sarray = (vtkShortArray*)scalars->GetData(); + ptr = (void*)sarray->WritePointer(0, numPts); + } + break; + case IObase::uInt16: + { + scalars->SetDataTypeToUnsignedShort(); + vtkUnsignedShortArray *usarray = + (vtkUnsignedShortArray*)scalars->GetData(); + ptr = (void*)usarray->WritePointer(0, numPts); + } + break; + case IObase::Int32: + { + scalars->SetDataTypeToInt(); + vtkIntArray *iarray = (vtkIntArray*)scalars->GetData(); + ptr = (void*)iarray->WritePointer(0, numPts); + } + break; + } + + file->read(ptr); // read it directly into vtk pre-allocated buffer + + // in case the data is logged. -BPM + //fprintf(stderr,"in execute\n"); + if(logged){ + double scalar; + int n = scalars->GetNumberOfScalars(); + float maxscalar = scalars->GetRange()[1]; + + int i=0; + for(i;i<n;i++){ + scalar = scalars->GetScalar(i); + + if (scalar > 0.0) { + scalar = log10((double)scalars->GetScalar(i)); + scalars->InsertScalar(i, (float) scalar); + } + else { + if (scalar == 0.0) { + scalar = log10((double) (maxscalar*1.0e-10)); + scalars->InsertScalar(i, (float) scalar); + } + else { + logged=-1; + vtkErrorMacro(<<"Negative value!"); + return; + } + } + } + + scalars->Modified(); + float* scarange = scalars->GetRange(); + if(scarange[0]<loggedmin) + loggedmin=scarange[0]; + if(scarange[1]>loggedmax) + loggedmax=scarange[1]; + } + //fprintf(stderr,"in execute\n"); + // printf("read %u points\n",numPts); + + output->GetPointData()->SetScalars(scalars); // should set ->Modified() and Refcount() + scalars->Delete(); // remove local copy of reference counted data + } + { // push the stack... + // check for coord info (read for xcoordinate) + float min_ext[5],max_ext[5]; + int use_extents=0; + int nelements; + int minindex,maxindex; + IObase::DataType dtype; + + if((minindex=file->readAttributeInfo("min_ext",dtype,nelements))>0 && + (maxindex=file->readAttributeInfo("max_ext",dtype,nelements))>0 && + (dtype==IObase::Float32 || dtype==IObase::Float64)) { + if(dtype==IObase::Float32){ + file->readAttribute(maxindex,min_ext); + file->readAttribute(minindex,max_ext); + } + else if(dtype==IObase::Float64){ + double maxext[5],minext[5]; + file->readAttribute(maxindex,maxext); + file->readAttribute(minindex,minext); + int i=0; + for(i;i<rank;i++){ + min_ext[i]=(float)(minext[i]); + max_ext[i]=(float)(maxext[i]); + } + } + output->SetOrigin(min_ext); + int i=0; + for(i;i<rank;i++){ + max_ext[i]-=min_ext[i]; + if(dims[i]-1 > 0) + max_ext[i]/=(float)(dims[i]-1); + } + output->SetSpacing(max_ext); + //use_extents=1; + } //***** OK, if we cant find extents, then try origin & delta + else if((minindex=file->readAttributeInfo("origin",dtype,nelements))>0 && + (maxindex=file->readAttributeInfo("delta",dtype,nelements))>0 && + (dtype==IObase::Float32 || dtype==IObase::Float64)) { + if(dtype==IObase::Float32){ + file->readAttribute(maxindex,min_ext); + file->readAttribute(minindex,max_ext); + output->SetOrigin(min_ext); + output->SetSpacing(max_ext); + } + else if(dtype==IObase::Float64){ + double maxext[5],minext[5]; + file->readAttribute(maxindex,maxext); + file->readAttribute(minindex,minext); + int i=0; + for(i;i<rank;i++){ + min_ext[i]=(float)(minext[i]); + max_ext[i]=(float)(maxext[i]); + } + output->SetOrigin(min_ext); + output->SetSpacing(max_ext); + } + } + else{ + int i=0; + for(i;i<rank;i++){ + min_ext[i]=0; + max_ext[i]=(float)(dims[i]-1); + } + output->SetOrigin(min_ext); + output->SetSpacing(max_ext); + } + } +} + +void vtkAMRStructuredPointsReader::PrintSelf(ostream& os, vtkIndent indent) +{ + os << indent << "AMR File Name: " << (this->filename) << "\n"; + os << indent << "CurrentIndex: " << (this->index) << "\n"; + //output->PrintSelf(os,indent); + vtkStructuredPointsSource::PrintSelf(os,indent); +} + + |