![]() |
Mesh Oriented datABase
(version 5.4.1)
Array-based unstructured mesh datastructure
|
00001 #include "vtkMoabReader.h"
00002
00003 #include "SimpleMoab.h"
00004 #include "DataSetConverter.h"
00005
00006
00007 #include "vtkNew.h"
00008 #include "vtkObjectFactory.h"
00009 #include "vtkInformation.h"
00010 #include "vtkInformationVector.h"
00011 #include "vtkMultiBlockDataSet.h"
00012 #include "vtkUnstructuredGrid.h"
00013
00014 #include "vtkPolyData.h"
00015
00016
00017 vtkStandardNewMacro(vtkMoabReader)
00018 //------------------------------------------------------------------------------
00019 vtkMoabReader::vtkMoabReader()
00020 {
00021 this->SetNumberOfInputPorts(0);
00022 this->FileName = NULL;
00023 }
00024
00025 //------------------------------------------------------------------------------
00026 vtkMoabReader::~vtkMoabReader()
00027 {
00028 }
00029
00030 //------------------------------------------------------------------------------
00031 int vtkMoabReader::RequestInformation(vtkInformation *request,
00032 vtkInformationVector **inputVector,
00033 vtkInformationVector *outputVector)
00034 {
00035
00036 //todo. Walk the file and display all the 2d and 3d elements that the users
00037 //could possibly want to load
00038 return this->Superclass::RequestInformation(request,inputVector,outputVector);
00039 }
00040
00041 //------------------------------------------------------------------------------
00042 int vtkMoabReader::RequestData(vtkInformation *vtkNotUsed(request),
00043 vtkInformationVector **vtkNotUsed(inputVector),
00044 vtkInformationVector *outputVector)
00045 {
00046 //First pass is lets load in all 3d elements in a block called Volumes,
00047 //and load all 2d elements in a block called Surfaces
00048
00049 vtkInformation* outInfo = outputVector->GetInformationObject(0);
00050 vtkMultiBlockDataSet *output =
00051 vtkMultiBlockDataSet::SafeDownCast(outInfo->Get(vtkDataObject::DATA_OBJECT()));
00052
00053 vtkNew volumeRoot;
00054 vtkNew boundaryRoot;
00055 vtkNew surfaceRoot;
00056 vtkNew materialRoot;
00057 vtkNew neumannRoot;
00058 vtkNew dirichletRoot;
00059
00060 const int blockIndex = output->GetNumberOfBlocks();
00061 output->SetBlock(blockIndex,volumeRoot.GetPointer());
00062 output->SetBlock(blockIndex+1,boundaryRoot.GetPointer());
00063 output->SetBlock(blockIndex+2,surfaceRoot.GetPointer());
00064 output->SetBlock(blockIndex+3,materialRoot.GetPointer());
00065 output->SetBlock(blockIndex+4,neumannRoot.GetPointer());
00066 output->SetBlock(blockIndex+5,dirichletRoot.GetPointer());
00067
00068 //boring work, set the names of the blocks
00069 output->GetMetaData(blockIndex)->Set(vtkCompositeDataSet::NAME(), "Volumes");
00070 output->GetMetaData(blockIndex+1)->Set(vtkCompositeDataSet::NAME(), "Boundary");
00071 output->GetMetaData(blockIndex+2)->Set(vtkCompositeDataSet::NAME(), "Surfaces");
00072 output->GetMetaData(blockIndex+3)->Set(vtkCompositeDataSet::NAME(), "Material");
00073 output->GetMetaData(blockIndex+4)->Set(vtkCompositeDataSet::NAME(), "Neumann Sets");
00074 output->GetMetaData(blockIndex+5)->Set(vtkCompositeDataSet::NAME(), "Dirichlet Sets");
00075
00076 smoab::GeomTag geom3Tag(3);
00077 smoab::GeomTag geom2Tag(2);
00078 smoab::GeomTag geom1Tag(1);
00079 smoab::MaterialTag matTag;
00080 smoab::NeumannTag neTag;
00081 smoab::DirichletTag diTag;
00082
00083 smoab::Interface interface(this->FileName);
00084 this->CreateSubBlocks(volumeRoot, &interface, &geom3Tag);
00085 this->CreateSubBlocks(boundaryRoot, &interface, &geom3Tag, &geom2Tag);
00086
00087 this->CreateSubBlocks(surfaceRoot, &interface, &geom2Tag);
00088 this->CreateSubBlocks(materialRoot, &interface, &matTag, &geom3Tag);
00089 this->CreateSubBlocks(neumannRoot, &interface, &neTag);
00090 this->CreateSubBlocks(dirichletRoot, &interface, &diTag);
00091
00092 return 1;
00093 }
00094
00095
00096 //------------------------------------------------------------------------------
00097 void vtkMoabReader::CreateSubBlocks(vtkNew & root,
00098 smoab::Interface* interface,
00099 smoab::Tag const* parentTag,
00100 smoab::Tag const* extractTag)
00101 {
00102 if(!extractTag)
00103 {
00104 extractTag = parentTag;
00105 }
00106 //basic premise: query the database for all tagged elements and create a new
00107 //multiblock elemenent for each
00108 smoab::DataSetConverter converter(*interface,extractTag);
00109 converter.readMaterialIds(true);
00110 converter.readProperties(true);
00111
00112 smoab::EntityHandle rootHandle = interface->getRoot();
00113 smoab::Range parents = interface->findEntityRootParents(rootHandle);
00114 smoab::Range dimEnts = interface->findEntitiesWithTag(*parentTag,
00115 rootHandle);
00116
00117 smoab::Range geomParents = smoab::intersect(parents,dimEnts);
00118
00119 parents.clear(); //remove this range as it is unneeded
00120 dimEnts.clear();
00121
00122 //now each item in range can be extracted into a different grid
00123 typedef smoab::Range::iterator iterator;
00124 vtkIdType index = 0;
00125 for(iterator i=geomParents.begin(); i != geomParents.end(); ++i)
00126 {
00127 vtkNew block;
00128 //fill the dataset with geometry and properties
00129 converter.fill(*i, block.GetPointer(),index);
00130
00131 //only add it if we have cells found
00132 if(block->GetNumberOfCells() > 0)
00133 {
00134 root->SetBlock(index,block.GetPointer());
00135 std::string name = interface->name(*i);
00136 if(name.size() > 0)
00137 {
00138 root->GetMetaData(index)->Set(vtkCompositeDataSet::NAME(), name.c_str());
00139 }
00140 ++index;
00141 }
00142 }
00143 }
00144
00145 //------------------------------------------------------------------------------
00146 void vtkMoabReader::PrintSelf(ostream& os, vtkIndent indent)
00147 {
00148 this->Superclass::PrintSelf(os,indent);
00149 }