From 062bb36693f0ff5b0dbf76f01456b9fd58dc9207 Mon Sep 17 00:00:00 2001 From: Mark Olesen Date: Sun, 3 Aug 2008 14:17:25 +0200 Subject: [PATCH] PV3FoamReader - code cleanup - streamlined code somewhat, minor attempt to reclaim some memory - now use "mesh parts" for patches/zones/sets/etc throughout to avoid ambiguity with mesh regions - collect superCells and addPointCellLabels in a class. The old version actually seemed to have overwritten the addPointCellLabels with each cellSet/cellZone. This means that part of the pointFields would be trashed in the combination of polyhedral cells, cellSets/cellZones and internalMesh - polyDecomp information for muitiple mesh regions, but not yet exploited - pointFields now working for cellZones/cellSets - extroplating fields onto walls also works as expected for interpolated pointFields - added tooltips to reader GUI TODO: - pointFields (real and interpolated) for faceSets/faceZones --- .../PV3FoamReader/PV3FoamReader_SM.xml | 35 +- .../PV3FoamReader/vtkPV3FoamReader.cxx | 42 +- .../PV3FoamReader/vtkPV3FoamReader.h | 14 +- .../PV3FoamReader/vtkPV3Foam/Make/files | 1 + .../PV3FoamReader/vtkPV3Foam/vtkPV3Foam.C | 582 ++++------------- .../PV3FoamReader/vtkPV3Foam/vtkPV3Foam.H | 267 +++++--- .../vtkPV3Foam/vtkPV3FoamAddToSelection.H | 43 +- .../vtkPV3Foam/vtkPV3FoamFaceField.H | 32 +- .../vtkPV3Foam/vtkPV3FoamFields.C | 35 +- .../vtkPV3Foam/vtkPV3FoamLagrangianFields.H | 37 +- .../PV3FoamReader/vtkPV3Foam/vtkPV3FoamMesh.C | 602 +++++++----------- .../vtkPV3Foam/vtkPV3FoamMeshVolume.C | 9 +- .../vtkPV3Foam/vtkPV3FoamPatchField.H | 29 +- .../vtkPV3Foam/vtkPV3FoamPointFields.H | 211 +++--- .../vtkPV3Foam/vtkPV3FoamUpdateInfo.C | 118 ++-- .../vtkPV3Foam/vtkPV3FoamUpdateInfoFields.H | 16 +- .../vtkPV3Foam/vtkPV3FoamUtilities.C | 341 ++++++++++ .../vtkPV3Foam/vtkPV3FoamVolFields.H | 322 ++++------ 18 files changed, 1330 insertions(+), 1406 deletions(-) create mode 100644 applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamUtilities.C diff --git a/applications/utilities/postProcessing/graphics/PV3FoamReader/PV3FoamReader/PV3FoamReader_SM.xml b/applications/utilities/postProcessing/graphics/PV3FoamReader/PV3FoamReader/PV3FoamReader_SM.xml index d522660cc4..9a0e8d26bf 100644 --- a/applications/utilities/postProcessing/graphics/PV3FoamReader/PV3FoamReader/PV3FoamReader_SM.xml +++ b/applications/utilities/postProcessing/graphics/PV3FoamReader/PV3FoamReader/PV3FoamReader_SM.xml @@ -12,7 +12,7 @@ animateable="0"> - Specifies the filename for the OpenFOAM Reader + Specifies the filename for the OpenFOAM Reader @@ -32,25 +32,25 @@ - + - + - + @@ -132,6 +132,9 @@ default_values="0" animateable="0"> + + Extrapolate internalField to wall and empty patches + @@ -141,6 +144,9 @@ number_of_elements="1" default_values="0" animateable="0"> + + Searches the polyMesh/sets/ directory + @@ -151,6 +157,10 @@ number_of_elements="1" default_values="0" animateable="0"> + + ZoneMesh information is used to find {cell,face,point}Zones. + The polyMesh/ directory is only checked on startup. + @@ -162,6 +172,9 @@ default_values="0" animateable="0"> + + Show patch names in render window. + @@ -172,6 +185,9 @@ default_values="1" animateable="0"> + + Cache the fvMesh in memory. + @@ -182,6 +198,9 @@ default_values="0" animateable="0"> + + A simple way cause a reader GUI modification. + diff --git a/applications/utilities/postProcessing/graphics/PV3FoamReader/PV3FoamReader/vtkPV3FoamReader.cxx b/applications/utilities/postProcessing/graphics/PV3FoamReader/PV3FoamReader/vtkPV3FoamReader.cxx index 2ad4f68cb0..70a6230bfe 100644 --- a/applications/utilities/postProcessing/graphics/PV3FoamReader/PV3FoamReader/vtkPV3FoamReader.cxx +++ b/applications/utilities/postProcessing/graphics/PV3FoamReader/PV3FoamReader/vtkPV3FoamReader.cxx @@ -71,7 +71,7 @@ vtkPV3FoamReader::vtkPV3FoamReader() UpdateGUI = 0; - RegionSelection = vtkDataArraySelection::New(); + PartSelection = vtkDataArraySelection::New(); VolFieldSelection = vtkDataArraySelection::New(); PointFieldSelection = vtkDataArraySelection::New(); LagrangianFieldSelection = vtkDataArraySelection::New(); @@ -85,7 +85,7 @@ vtkPV3FoamReader::vtkPV3FoamReader() ); SelectionObserver->SetClientData(this); - RegionSelection->AddObserver + PartSelection->AddObserver ( vtkCommand::ModifiedEvent, this->SelectionObserver @@ -128,14 +128,14 @@ vtkPV3FoamReader::~vtkPV3FoamReader() } - RegionSelection->RemoveObserver(this->SelectionObserver); + PartSelection->RemoveObserver(this->SelectionObserver); VolFieldSelection->RemoveObserver(this->SelectionObserver); PointFieldSelection->RemoveObserver(this->SelectionObserver); LagrangianFieldSelection->RemoveObserver(this->SelectionObserver); SelectionObserver->Delete(); - RegionSelection->Delete(); + PartSelection->Delete(); VolFieldSelection->Delete(); PointFieldSelection->Delete(); LagrangianFieldSelection->Delete(); @@ -427,46 +427,46 @@ int vtkPV3FoamReader::GetTimeStep() // ---------------------------------------------------------------------- -// Region selection list control +// Parts selection list control -vtkDataArraySelection* vtkPV3FoamReader::GetRegionSelection() +vtkDataArraySelection* vtkPV3FoamReader::GetPartSelection() { - vtkDebugMacro(<<"GetRegionSelection"); - return RegionSelection; + vtkDebugMacro(<<"GetPartSelection"); + return PartSelection; } -int vtkPV3FoamReader::GetNumberOfRegionArrays() +int vtkPV3FoamReader::GetNumberOfPartArrays() { - vtkDebugMacro(<<"GetNumberOfRegionArrays"); - return RegionSelection->GetNumberOfArrays(); + vtkDebugMacro(<<"GetNumberOfPartArrays"); + return PartSelection->GetNumberOfArrays(); } -const char* vtkPV3FoamReader::GetRegionArrayName(int index) +const char* vtkPV3FoamReader::GetPartArrayName(int index) { - vtkDebugMacro(<<"GetRegionArrayName"); - return RegionSelection->GetArrayName(index); + vtkDebugMacro(<<"GetPartArrayName"); + return PartSelection->GetArrayName(index); } -int vtkPV3FoamReader::GetRegionArrayStatus(const char* name) +int vtkPV3FoamReader::GetPartArrayStatus(const char* name) { - vtkDebugMacro(<<"GetRegionArrayStatus"); - return RegionSelection->ArrayIsEnabled(name); + vtkDebugMacro(<<"GetPartArrayStatus"); + return PartSelection->ArrayIsEnabled(name); } -void vtkPV3FoamReader::SetRegionArrayStatus(const char* name, int status) +void vtkPV3FoamReader::SetPartArrayStatus(const char* name, int status) { - vtkDebugMacro(<<"SetRegionArrayStatus"); + vtkDebugMacro(<<"SetPartArrayStatus"); if (status) { - RegionSelection->EnableArray(name); + PartSelection->EnableArray(name); } else { - RegionSelection->DisableArray(name); + PartSelection->DisableArray(name); } } diff --git a/applications/utilities/postProcessing/graphics/PV3FoamReader/PV3FoamReader/vtkPV3FoamReader.h b/applications/utilities/postProcessing/graphics/PV3FoamReader/PV3FoamReader/vtkPV3FoamReader.h index 88fbae9b31..fde87527de 100644 --- a/applications/utilities/postProcessing/graphics/PV3FoamReader/PV3FoamReader/vtkPV3FoamReader.h +++ b/applications/utilities/postProcessing/graphics/PV3FoamReader/PV3FoamReader/vtkPV3FoamReader.h @@ -88,12 +88,12 @@ public: int GetTimeStep(); // Description: - // Region selection list control - vtkDataArraySelection* GetRegionSelection(); - int GetNumberOfRegionArrays(); - int GetRegionArrayStatus(const char* name); - void SetRegionArrayStatus(const char* name, int status); - const char* GetRegionArrayName(int index); + // Parts selection list control + vtkDataArraySelection* GetPartSelection(); + int GetNumberOfPartArrays(); + int GetPartArrayStatus(const char* name); + void SetPartArrayStatus(const char* name, int status); + const char* GetPartArrayName(int index); // Description: // volField selection list control @@ -191,7 +191,7 @@ private: //- Dummy variable/switch for invoke a reader update int UpdateGUI; - vtkDataArraySelection* RegionSelection; + vtkDataArraySelection* PartSelection; vtkDataArraySelection* VolFieldSelection; vtkDataArraySelection* PointFieldSelection; vtkDataArraySelection* LagrangianFieldSelection; diff --git a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/Make/files b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/Make/files index 4bb4f69970..9699e3c71e 100644 --- a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/Make/files +++ b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/Make/files @@ -7,5 +7,6 @@ vtkPV3FoamMeshSet.C vtkPV3FoamMeshVolume.C vtkPV3FoamMeshZone.C vtkPV3FoamUpdateInfo.C +vtkPV3FoamUtilities.C LIB = $(FOAM_LIBBIN)/libvtkPV3Foam diff --git a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3Foam.C b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3Foam.C index 9595e37ff7..11a28847b3 100644 --- a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3Foam.C +++ b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3Foam.C @@ -31,20 +31,13 @@ License #include "fvMesh.H" #include "Time.H" #include "patchZones.H" -#include "IFstream.H" // VTK includes -#include "vtkCharArray.h" #include "vtkDataArraySelection.h" -#include "vtkDataSet.h" -#include "vtkFieldData.h" #include "vtkMultiBlockDataSet.h" #include "vtkRenderer.h" #include "vtkTextActor.h" #include "vtkTextProperty.h" -#include "vtkPolyData.h" -#include "vtkUnstructuredGrid.h" -#include "vtkInformation.h" // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // @@ -55,122 +48,42 @@ defineTypeNameAndDebug(Foam::vtkPV3Foam, 0); #include "vtkPV3FoamAddToSelection.H" #include "vtkPV3FoamUpdateInfoFields.H" -void Foam::vtkPV3Foam::AddToBlock -( - vtkMultiBlockDataSet* output, - const selectionInfo& selector, - const label datasetNo, - vtkDataSet* dataset, - const string& blockName -) -{ - const int blockNo = selector.block(); - - vtkDataObject* blockDO = output->GetBlock(blockNo); - vtkMultiBlockDataSet* block = vtkMultiBlockDataSet::SafeDownCast(blockDO); - if (blockDO && !block) - { - FatalErrorIn("Foam::vtkPV3Foam::AddToBlock") - << "Block already has a vtkDataSet assigned to it" << nl << endl; - return; - } - - if (!block) - { - block = vtkMultiBlockDataSet::New(); - output->SetBlock(blockNo, block); - block->Delete(); - } - - if (block) - { - if (debug) - { - Info<< "block[" << blockNo << "] has " - << block->GetNumberOfBlocks() - << " datasets prior to adding set " << datasetNo - << " with name: " << blockName << endl; - } - - // when assigning dataset 0, also name the parent block - if (!datasetNo && selector.name()) - { - output->GetMetaData(blockNo)->Set - ( - vtkCompositeDataSet::NAME(), - selector.name() - ); - } - } - - - block->SetBlock(datasetNo, dataset); - - if (blockName.size()) - { - block->GetMetaData(datasetNo)->Set - ( - vtkCompositeDataSet::NAME(), blockName.c_str() - ); - } - -} - - -vtkDataSet* Foam::vtkPV3Foam::GetDataSetFromBlock -( - vtkMultiBlockDataSet* output, - const selectionInfo& selector, - const label datasetNo -) -{ - const int blockNo = selector.block(); - - vtkDataObject* blockDO = output->GetBlock(blockNo); - vtkMultiBlockDataSet* block = vtkMultiBlockDataSet::SafeDownCast(blockDO); - if (block) - { - return vtkDataSet::SafeDownCast(block->GetBlock(datasetNo)); - } - - return 0; -} - - -Foam::label Foam::vtkPV3Foam::GetNumberOfDataSets -( - vtkMultiBlockDataSet* output, - const selectionInfo& selector -) -{ - const int blockNo = selector.block(); - - vtkDataObject* blockDO = output->GetBlock(blockNo); - vtkMultiBlockDataSet* block = vtkMultiBlockDataSet::SafeDownCast(blockDO); - if (block) - { - return block->GetNumberOfBlocks(); - } - - return 0; -} - - void Foam::vtkPV3Foam::resetCounters() { - // Reset region ids and sizes - regionInfoVolume_.reset(); - regionInfoPatches_.reset(); - regionInfoLagrangian_.reset(); - regionInfoCellZones_.reset(); - regionInfoFaceZones_.reset(); - regionInfoPointZones_.reset(); - regionInfoCellSets_.reset(); - regionInfoFaceSets_.reset(); - regionInfoPointSets_.reset(); + // Reset mesh part ids and sizes + partInfoVolume_.reset(); + partInfoPatches_.reset(); + partInfoLagrangian_.reset(); + partInfoCellZones_.reset(); + partInfoFaceZones_.reset(); + partInfoPointZones_.reset(); + partInfoCellSets_.reset(); + partInfoFaceSets_.reset(); + partInfoPointSets_.reset(); } +void Foam::vtkPV3Foam::reduceMemory() +{ + forAll(regionPolyDecomp_, i) + { + regionPolyDecomp_[i].clear(); + } + + forAll(zonePolyDecomp_, i) + { + zonePolyDecomp_[i].clear(); + } + + forAll(csetPolyDecomp_, i) + { + csetPolyDecomp_[i].clear(); + } +} + + + + int Foam::vtkPV3Foam::setTime(const double& requestedTime) { if (debug) @@ -231,242 +144,51 @@ int Foam::vtkPV3Foam::setTime(const double& requestedTime) } -void Foam::vtkPV3Foam::updateRegionStatus() +void Foam::vtkPV3Foam::updateMeshPartsStatus() { if (debug) { - Info<< " Foam::vtkPV3Foam::updateRegionStatus" << endl; + Info<< " Foam::vtkPV3Foam::updateMeshPartsStatus" << endl; } - vtkDataArraySelection* regionSelection = reader_->GetRegionSelection(); - const label nSelect = regionSelection->GetNumberOfArrays(); - if (regionStatus_.size() != nSelect) + vtkDataArraySelection* selection = reader_->GetPartSelection(); + label nElem = selection->GetNumberOfArrays(); + + if (partStatus_.size() != nElem) { - regionStatus_.setSize(nSelect); - regionStatus_ = false; + partStatus_.setSize(nElem); + partStatus_ = false; meshChanged_ = true; } // this needs fixing if we wish to re-use the datasets - regionDataset_.setSize(nSelect); - regionDataset_ = -1; + partDataset_.setSize(nElem); + partDataset_ = -1; - // Read the selected cell regions, zones, patches and add to region list - forAll(regionStatus_, regionId) + // Read the selected mesh parts (zones, patches ...) and add to list + forAll(partStatus_, partId) { - int setting = regionSelection->GetArraySetting(regionId); + const int setting = selection->GetArraySetting(partId); - if (regionStatus_[regionId] != setting) + if (partStatus_[partId] != setting) { - regionStatus_[regionId] = setting; + partStatus_[partId] = setting; meshChanged_ = true; } if (debug) { - Info<< " region[" << regionId << "] = " - << regionStatus_[regionId] - << " : " << regionSelection->GetArrayName(regionId) << endl; + Info<< " part[" << partId << "] = " + << partStatus_[partId] + << " : " << selection->GetArrayName(partId) << endl; } } if (debug) { - Info<< " Foam::vtkPV3Foam::updateRegionStatus" << endl; + Info<< " Foam::vtkPV3Foam::updateMeshPartsStatus" << endl; } } -Foam::wordHashSet Foam::vtkPV3Foam::getSelected -( - vtkDataArraySelection* select -) -{ - int nElem = select->GetNumberOfArrays(); - wordHashSet selections(2*nElem); - - for (int elemI=0; elemI < nElem; ++elemI) - { - if (select->GetArraySetting(elemI)) - { - word name(getFirstWord(select->GetArrayName(elemI))); - selections.insert(name); - } - } - - return selections; -} - - -Foam::stringList Foam::vtkPV3Foam::getSelectedArrayEntries -( - vtkDataArraySelection* select, - const bool firstWord -) -{ - stringList selections(select->GetNumberOfArrays()); - label nElem = 0; - - if (debug) - { - Info<< "available("; - forAll(selections, elemI) - { - Info<< " \"" << select->GetArrayName(elemI) << "\""; - } - Info<< " )\n" - << "selected("; - } - - forAll(selections, elemI) - { - if (select->GetArraySetting(elemI)) - { - if (firstWord) - { - selections[nElem] = getFirstWord - ( - select->GetArrayName(elemI) - ); - } - else - { - selections[nElem] = select->GetArrayName(elemI); - } - - if (debug) - { - Info<< " " << selections[nElem]; - } - - ++nElem; - } - } - - if (debug) - { - Info<< " )" << endl; - } - - selections.setSize(nElem); - return selections; -} - - -Foam::stringList Foam::vtkPV3Foam::getSelectedArrayEntries -( - vtkDataArraySelection* select, - const selectionInfo& selector, - const bool firstWord -) -{ - stringList selections(selector.size()); - label nElem = 0; - - if (debug) - { - Info<< "available("; - for - ( - int elemI = selector.start(); - elemI < selector.end(); - ++elemI - ) - { - Info<< " \"" << select->GetArrayName(elemI) << "\""; - } - - Info<< " )\n" - << "selected("; - } - - for - ( - int elemI = selector.start(); - elemI < selector.end(); - ++elemI - ) - { - if (select->GetArraySetting(elemI)) - { - if (firstWord) - { - selections[nElem] = getFirstWord - ( - select->GetArrayName(elemI) - ); - } - else - { - selections[nElem] = select->GetArrayName(elemI); - } - - if (debug) - { - Info<< " " << selections[nElem]; - } - - ++nElem; - } - } - - if (debug) - { - Info<< " )" << endl; - } - - selections.setSize(nElem); - return selections; -} - - -void Foam::vtkPV3Foam::setSelectedArrayEntries -( - vtkDataArraySelection* select, - const stringList& selections -) -{ - if (debug > 1) - { - Info<< " Foam::vtkPV3Foam::setSelectedArrayEntries" << endl; - } - const label nEntries = select->GetNumberOfArrays(); - - // Reset all current entries to 'not selected' - select->DisableAllArrays(); - - // Loop through entries, setting values from selectedEntries - forAll(selections, elemI) - { - if (debug > 1) - { - Info<< "selections[" << elemI << "] = " << selections[elemI] - << endl; - } - - for (label i=0; iGetArrayName(i); - - if (arrayName == selections[elemI]) - { - if (debug > 1) - { - Info<< "enabling array: " << arrayName << " Index = " - << i - << endl; - } - - select->EnableArray(arrayName.c_str()); - break; - } - } - } - if (debug > 1) - { - Info<< " Foam::vtkPV3Foam::setSelectedArrayEntries" << endl; - } -} - - // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // Foam::vtkPV3Foam::vtkPV3Foam @@ -482,15 +204,15 @@ Foam::vtkPV3Foam::vtkPV3Foam timeIndex_(-1), meshChanged_(true), fieldsChanged_(true), - regionInfoVolume_("unzoned"), - regionInfoPatches_("patches"), - regionInfoLagrangian_("lagrangian"), - regionInfoCellZones_("cellZone"), - regionInfoFaceZones_("faceZone"), - regionInfoPointZones_("pointZone"), - regionInfoCellSets_("cellSet"), - regionInfoFaceSets_("faceSet"), - regionInfoPointSets_("pointSet") + partInfoVolume_("unzoned"), + partInfoPatches_("patches"), + partInfoLagrangian_("lagrangian"), + partInfoCellZones_("cellZone"), + partInfoFaceZones_("faceZone"), + partInfoPointZones_("pointZone"), + partInfoCellSets_("cellSet"), + partInfoFaceSets_("faceSet"), + partInfoPointSets_("pointSet") { if (debug) { @@ -569,29 +291,25 @@ void Foam::vtkPV3Foam::updateInfo() resetCounters(); - vtkDataArraySelection* regionSelection = reader_->GetRegionSelection(); + vtkDataArraySelection* partSelection = reader_->GetPartSelection(); - stringList selectedEntries; // enable 'internalMesh' on the first call - if (regionSelection->GetNumberOfArrays() == 0 && !meshPtr_) + // or preserve the enabled selections + stringList enabledEntries; + if (!partSelection->GetNumberOfArrays() && !meshPtr_) { - selectedEntries.setSize(1); - selectedEntries[0] = "internalMesh"; + enabledEntries.setSize(1); + enabledEntries[0] = "internalMesh"; } else { - // preserve the enabled selections - selectedEntries = getSelectedArrayEntries - ( - regionSelection, - false - ); + enabledEntries = getSelectedArrayEntries(partSelection); } - // Clear current region list/array - regionSelection->RemoveAllArrays(); + // Clear current mesh parts list + partSelection->RemoveAllArrays(); - // Update region array - add Lagrangian at the bottom + // Update mesh parts list - add Lagrangian at the bottom updateInfoInternalMesh(); updateInfoPatches(); updateInfoSets(); @@ -599,11 +317,7 @@ void Foam::vtkPV3Foam::updateInfo() updateInfoLagrangian(); // restore the enabled selections - setSelectedArrayEntries - ( - regionSelection, - selectedEntries - ); + setSelectedArrayEntries(partSelection, enabledEntries); if (meshChanged_) { @@ -696,14 +410,14 @@ void Foam::vtkPV3Foam::Update } reader_->UpdateProgress(0.1); - // Set up region selection(s) - updateRegionStatus(); + // Set up mesh parts selection(s) + updateMeshPartsStatus(); // Update the Foam mesh updateFoamMesh(); reader_->UpdateProgress(0.2); - // Convert meshes + // Convert meshes - start port0 at block=0 int blockNo = 0; convertMeshVolume(output, blockNo); @@ -724,6 +438,7 @@ void Foam::vtkPV3Foam::Update convertMeshPointSets(output, blockNo); } + // restart port1 at block=0 blockNo = 0; convertMeshLagrangian(lagrangianOutput, blockNo); @@ -733,6 +448,10 @@ void Foam::vtkPV3Foam::Update convertVolFields(output); convertPointFields(output); convertLagrangianFields(lagrangianOutput); + reader_->UpdateProgress(0.95); + + // reclaim some memory + reduceMemory(); reader_->UpdateProgress(1.0); meshChanged_ = fieldsChanged_ = false; @@ -789,11 +508,10 @@ void Foam::vtkPV3Foam::addPatchNames(vtkRenderer* renderer) removePatchNames(renderer); // get the display patches, strip off any suffix - const stringList selectedPatches = getSelectedArrayEntries + wordHashSet selectedPatches = getSelected ( - reader_->GetRegionSelection(), - regionInfoPatches_, - true + reader_->GetPartSelection(), + partInfoPatches_ ); if (!selectedPatches.size()) @@ -828,68 +546,60 @@ void Foam::vtkPV3Foam::addPatchNames(vtkRenderer* renderer) const polyPatch& pp = pbMesh[patchI]; // Only include the patch if it is selected - bool isSelected = false; - forAll(selectedPatches, elemI) + if (!selectedPatches.found(pp.name())) { - if (pp.name() == selectedPatches[elemI]) + continue; + } + + const labelListList& edgeFaces = pp.edgeFaces(); + const vectorField& n = pp.faceNormals(); + + boolList featEdge(pp.nEdges(), false); + + forAll(edgeFaces, edgeI) + { + const labelList& eFaces = edgeFaces[edgeI]; + + if (eFaces.size() != 2) { - isSelected = true; - break; + featEdge[edgeI] = true; + } + else if (mag(n[eFaces[0]] & n[eFaces[1]]) < 0.5) + { + featEdge[edgeI] = true; } } - if (isSelected) + // Do topological analysis of patch, find disconnected regions + patchZones pZones(pp, featEdge); + + nZones[patchI] = pZones.nZones(); + + labelList zoneNFaces(pZones.nZones(), 0); + + // Save start of information for current patch + label patchStart = zoneCentre.size(); + + // Create storage for additional zone centres + forAll(zoneNFaces, zoneI) { - const labelListList& edgeFaces = pp.edgeFaces(); - const vectorField& n = pp.faceNormals(); + zoneCentre.append(vector::zero); + } - boolList featEdge(pp.nEdges(), false); + // Do averaging per individual zone + forAll(pp, faceI) + { + label zoneI = pZones[faceI]; + zoneCentre[patchStart+zoneI] += pp[faceI].centre(pp.points()); + zoneNFaces[zoneI]++; + } - forAll(edgeFaces, edgeI) - { - const labelList& eFaces = edgeFaces[edgeI]; - - if (eFaces.size() != 2) - { - featEdge[edgeI] = true; - } - else if (mag(n[eFaces[0]] & n[eFaces[1]]) < 0.5) - { - featEdge[edgeI] = true; - } - } - - // Do topological analysis of patch. Determine disconnected regions - patchZones pZones(pp, featEdge); - - nZones[patchI] = pZones.nZones(); - - labelList zoneNFaces(pZones.nZones(), 0); - - // Save start of information for current patch - label patchStart = zoneCentre.size(); - - // Create storage for additional zone centres - forAll(zoneNFaces, zoneI) - { - zoneCentre.append(vector::zero); - } - - // Do averaging per individual zone - - forAll(pp, faceI) - { - label zoneI = pZones[faceI]; - zoneCentre[patchStart+zoneI] += pp[faceI].centre(pp.points()); - zoneNFaces[zoneI]++; - } - - for (label i=0; i dbPtr_; - - //- Foam mesh - fvMesh* meshPtr_; - - //- Number of meshes - // TODO - for info only - only set up to process ONE mesh - int nMesh_; - - //- The time index - int timeIndex_; - - //- Track changes in mesh geometry - bool meshChanged_; - - //- Track changes in fields - bool fieldsChanged_; - - //- Cell-centre labels used as additional points for decomposed cells - labelList addPointCellLabels_; - - //- Label of original cell for decomposed cells (internal mesh) - labelList superCells_; - - //- Label of original cell for decomposed cells (cellZone meshes) - List zoneSuperCells_; - - //- Label of original cell for decomposed cells (cellSet meshes) - List csetSuperCells_; - - //- List of patch names - List patchTextActorsPtrs_; - - - //- Selected geometrical pieces - // [0] = internal mesh, patches, zones, sets, lagrangian - boolList regionStatus_; - - //- Selected regions indices in each respective block - labelList regionDataset_; - - // Private classes - //- bookkeeping for the GUI checklists and the multi-block organization - class selectionInfo + //- Bookkeeping for GUI checklists and the multi-block organization + class partInfo { const char *name_; int block_; @@ -163,7 +116,7 @@ class vtkPV3Foam public: - selectionInfo(const char *name, const int blockNo=0) + partInfo(const char *name, const int blockNo=0) : name_(name), block_(blockNo), @@ -224,19 +177,121 @@ class vtkPV3Foam } }; - // Private data + //- bookkeeping for polyhedral cell decomposition + // hide in extra pointMap (cellSet/cellZone) for now + class polyDecomp + { + labelList superCells_; + labelList addPointCellLabels_; + labelList pointMap_; - //- First instance and size of various regions - selectionInfo regionInfoVolume_; - selectionInfo regionInfoPatches_; - selectionInfo regionInfoLagrangian_; - selectionInfo regionInfoCellZones_; - selectionInfo regionInfoFaceZones_; - selectionInfo regionInfoPointZones_; - selectionInfo regionInfoCellSets_; - selectionInfo regionInfoFaceSets_; - selectionInfo regionInfoPointSets_; + public: + polyDecomp() + {} + + //- Label of original cell for decomposed cells + labelList& superCells() + { + return superCells_; + } + + //- Label of original cell for decomposed cells + const labelList& superCells() const + { + return superCells_; + } + + //- Cell-centre labels for additional points of decomposed cells + labelList& addPointCellLabels() + { + return addPointCellLabels_; + } + + //- Cell-centre labels for additional points of decomposed cells + const labelList& addPointCellLabels() const + { + return addPointCellLabels_; + } + + //- Point labels for subsetted meshes + labelList& pointMap() + { + return pointMap_; + } + + //- Point labels for subsetted meshes + const labelList& pointMap() const + { + return pointMap_; + } + + + //- Clear + void clear() + { + superCells_.clear(); + addPointCellLabels_.clear(); + pointMap_.clear(); + } + }; + + + // Private Data + + //- Access to the controlling vtkPV3FoamReader + vtkPV3FoamReader* reader_; + + //- Foam time control + autoPtr