diff --git a/applications/utilities/postProcessing/graphics/PVReaders/PVFoamReader/vtkPVFoam/vtkPVFoam.C b/applications/utilities/postProcessing/graphics/PVReaders/PVFoamReader/vtkPVFoam/vtkPVFoam.C index bade666a7a..c2b9793dc1 100644 --- a/applications/utilities/postProcessing/graphics/PVReaders/PVFoamReader/vtkPVFoam/vtkPVFoam.C +++ b/applications/utilities/postProcessing/graphics/PVReaders/PVFoamReader/vtkPVFoam/vtkPVFoam.C @@ -38,6 +38,7 @@ License #include "vtkTextActor.h" #include "vtkTextProperty.h" #include "vtkSmartPointer.h" +#include "vtkInformation.h" // Templates (only needed here) #include "vtkPVFoamUpdateTemplates.C" @@ -117,6 +118,70 @@ void Foam::vtkPVFoam::resetCounters() } +template +bool Foam::vtkPVFoam::addOutputBlock +( + vtkMultiBlockDataSet* output, + const HashTable& cache, + const arrayRange& selector, + const bool singleDataset +) const +{ + const auto blockNo = output->GetNumberOfBlocks(); + vtkSmartPointer block; + int datasetNo = 0; + + for (auto partId : selector) + { + if (selectedPartIds_.found(partId)) + { + const auto& longName = selectedPartIds_[partId]; + const word shortName = getPartName(partId); + + auto iter = cache.find(longName); + if (iter.found() && (*iter).vtkmesh) + { + auto dataset = (*iter).vtkmesh; + + if (singleDataset) + { + output->SetBlock(blockNo, dataset); + output->GetMetaData(blockNo)->Set + ( + vtkCompositeDataSet::NAME(), + shortName.c_str() + ); + + ++datasetNo; + break; + } + else if (datasetNo == 0) + { + block = vtkSmartPointer::New(); + output->SetBlock(blockNo, block); + output->GetMetaData(blockNo)->Set + ( + vtkCompositeDataSet::NAME(), + selector.name() + ); + } + + block->SetBlock(datasetNo, dataset); + block->GetMetaData(datasetNo)->Set + ( + vtkCompositeDataSet::NAME(), + shortName.c_str() + ); + + ++datasetNo; + } + } + } + + return datasetNo; +} + + int Foam::vtkPVFoam::setTime(int nRequest, const double requestTimes[]) { Time& runTime = dbPtr_(); @@ -417,11 +482,6 @@ void Foam::vtkPVFoam::Update // Set up mesh parts selection(s) { - if (debug) - { - Info<< " updateMeshPartsStatus" << endl; - } - vtkDataArraySelection* selection = reader_->GetPartSelection(); const int n = selection->GetNumberOfArrays(); @@ -464,11 +524,6 @@ void Foam::vtkPVFoam::Update << " : " << str << nl; } } - - if (debug) - { - Info<< " updateMeshPartsStatus" << endl; - } } reader_->UpdateProgress(0.15); @@ -538,49 +593,51 @@ void Foam::vtkPVFoam::Update cachedVtp_.retain(nowActive); cachedVtu_.retain(nowActive); - // Reset (expire) dataset ids - partDataset_.clear(); - - // Convert meshes - start port0 at block=0 - int blockNo = 0; - - convertMeshVolume(output, blockNo); - convertMeshPatches(output, blockNo); + convertMeshVolume(); + convertMeshPatches(); reader_->UpdateProgress(0.6); if (reader_->GetIncludeZones()) { - convertMeshCellZones(output, blockNo); - convertMeshFaceZones(output, blockNo); - convertMeshPointZones(output, blockNo); + convertMeshCellZones(); + convertMeshFaceZones(); + convertMeshPointZones(); reader_->UpdateProgress(0.65); } if (reader_->GetIncludeSets()) { - convertMeshCellSets(output, blockNo); - convertMeshFaceSets(output, blockNo); - convertMeshPointSets(output, blockNo); + convertMeshCellSets(); + convertMeshFaceSets(); + convertMeshPointSets(); reader_->UpdateProgress(0.7); } - if (outputLagrangian) - { - // Lagrangian dual port - restart port1 at block=0 - blockNo = 0; - convertMeshLagrangian(outputLagrangian, blockNo); - } - else - { - convertMeshLagrangian(output, blockNo); - } + convertMeshLagrangian(); reader_->UpdateProgress(0.8); // Update fields - convertVolFields(output); - convertPointFields(output); - convertLagrangianFields(outputLagrangian ? outputLagrangian : output); + convertVolFields(); + convertPointFields(); + convertLagrangianFields(); + + + // Assemble multiblock output + addOutputBlock(output, cachedVtu_, rangeVolume_, true); // One dataset + addOutputBlock(output, cachedVtp_, rangePatches_); + addOutputBlock(output, cachedVtu_, rangeCellZones_); + addOutputBlock(output, cachedVtp_, rangeFaceZones_); + addOutputBlock(output, cachedVtp_, rangePointZones_); + addOutputBlock(output, cachedVtu_, rangeCellSets_); + addOutputBlock(output, cachedVtp_, rangeFaceSets_); + addOutputBlock(output, cachedVtp_, rangePointSets_); + addOutputBlock + ( + (outputLagrangian ? outputLagrangian : output), + cachedVtp_, + rangeLagrangian_ + ); if (debug) { diff --git a/applications/utilities/postProcessing/graphics/PVReaders/PVFoamReader/vtkPVFoam/vtkPVFoam.H b/applications/utilities/postProcessing/graphics/PVReaders/PVFoamReader/vtkPVFoam/vtkPVFoam.H index 4a320affd2..0c520515ba 100644 --- a/applications/utilities/postProcessing/graphics/PVReaders/PVFoamReader/vtkPVFoam/vtkPVFoam.H +++ b/applications/utilities/postProcessing/graphics/PVReaders/PVFoamReader/vtkPVFoam/vtkPVFoam.H @@ -55,6 +55,10 @@ SourceFiles #include "volPointInterpolation.H" #include "foamPvCore.H" +#include "vtkSmartPointer.h" +#include "vtkPolyData.h" +#include "vtkUnstructuredGrid.h" + // * * * * * * * * * * * * * Forward Declarations * * * * * * * * * * * * * // class vtkDataArraySelection; @@ -65,11 +69,8 @@ class vtkPVFoamReader; class vtkRenderer; class vtkTextActor; class vtkMultiBlockDataSet; -class vtkPolyData; -class vtkUnstructuredGrid; class vtkIndent; -template class vtkSmartPointer; // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -82,6 +83,7 @@ class Time; class fvMesh; class IOobjectList; class polyPatch; +class fvMeshSubset; template class IOField; template class Field; @@ -160,16 +162,19 @@ class vtkPVFoam } }; + //- Bookkeeping for vtkPolyData class foamVtpData { + public: + vtkSmartPointer vtkmesh; }; //- Bookkeeping for vtkUnstructuredGrid - class foamVtuData - : - public polyDecomp + class foamVtuData : public polyDecomp { + public: + vtkSmartPointer vtkmesh; }; @@ -202,9 +207,6 @@ class vtkPVFoam //- The index of selected parts mapped to their names Map selectedPartIds_; - //- Datasets corresponding to selected geometrical pieces - Map