Hi, I just came across Dave DeMarle's ParaView course slides presented at the 6th OpenFOAM Workshop. http://www.openfoamworkshop.org/6th_OpenFOAM_Workshop_2011/Program/Training/deMarle_slides.pdf
In the 11th slide (Temporal Processing) I see that the "Interpolation between time steps" is grayed out, which I suspect was done so because the temporal interpolator did not interpolate the OpenFOAM dataset (which made path lines unpractical as well). This is a known problem that has fixes involving both the OpenFOAM reader and the temporal interpolator. The fix to the former (which I backported from my own development version) is attached in this mail and the latter has already been filed as a bug with a patch: http://vtk.org/Bug/view.php?id=12151 Thanks, Takuya Takuya OSHIMA, Ph.D. Faculty of Engineering, Niigata University 8050 Ikarashi-Ninocho, Nishi-ku, Niigata, 950-2181, JAPAN
diff --git a/IO/vtkOpenFOAMReader.cxx b/IO/vtkOpenFOAMReader.cxx index 7445c6f..423124f 100644 --- a/IO/vtkOpenFOAMReader.cxx +++ b/IO/vtkOpenFOAMReader.cxx @@ -337,6 +337,8 @@ private: vtkPoints *); bool GetCellZoneMesh(vtkMultiBlockDataSet *, const vtkFoamIntVectorVector *, const vtkFoamIntVectorVector *, vtkPoints *); + void SetShallowCopies(vtkMultiBlockDataSet *, vtkMultiBlockDataSet *, + const char *); }; vtkStandardNewMacro(vtkOpenFOAMReaderPrivate); @@ -7682,6 +7684,30 @@ void vtkOpenFOAMReaderPrivate::AddArrayToFieldData( } //----------------------------------------------------------------------------- +// Set shallow copies of the input datasets to output +void vtkOpenFOAMReaderPrivate::SetShallowCopies(vtkMultiBlockDataSet *output, + vtkMultiBlockDataSet *input, const char *blockName) +{ + // Set shallow copies of the member datasets as the final output so + // as not to get overridden in the input temporal dataset during the + // execution of temporal pipeline executive. + vtkMultiBlockDataSet *mbds = vtkMultiBlockDataSet::New(); + for (unsigned int blockI = 0; blockI < input->GetNumberOfBlocks(); blockI++) + { + vtkDataObject *ds = input->GetBlock(blockI)->NewInstance(); + ds->ShallowCopy(input->GetBlock(blockI)); + mbds->SetBlock(blockI, ds); + ds->FastDelete(); + mbds->GetMetaData(blockI)->CopyEntry(input->GetMetaData(blockI), + vtkCompositeDataSet::NAME()); + } + const unsigned int groupTypeI = output->GetNumberOfBlocks(); + output->SetBlock(groupTypeI, mbds); + mbds->FastDelete(); + this->SetBlockName(output, groupTypeI, blockName); +} + +//----------------------------------------------------------------------------- // return 0 if there's any error, 1 if success int vtkOpenFOAMReaderPrivate::RequestData(vtkMultiBlockDataSet *output, bool recreateInternalMesh, bool recreateBoundaryMesh, bool updateVariables) @@ -8004,16 +8030,21 @@ int vtkOpenFOAMReaderPrivate::RequestData(vtkMultiBlockDataSet *output, // Add Internal Mesh to final output only if selected for display if (this->InternalMesh != NULL) { - output->SetBlock(0, this->InternalMesh); + // Set shallow copy of the unstructured grid as the final output + // so as not to get overridden when it is used as the input of + // temporal filters during the execution of the temporal pipeline + // executive. + vtkUnstructuredGrid *ug = vtkUnstructuredGrid::New(); + ug->ShallowCopy(this->InternalMesh); + output->SetBlock(0, ug); + ug->FastDelete(); this->SetBlockName(output, 0, "internalMesh"); } // set boundary meshes/data as output if (this->BoundaryMesh != NULL && this->BoundaryMesh->GetNumberOfBlocks() > 0) { - const unsigned int groupTypeI = output->GetNumberOfBlocks(); - output->SetBlock(groupTypeI, this->BoundaryMesh); - this->SetBlockName(output, groupTypeI, "Patches"); + this->SetShallowCopies(output, this->BoundaryMesh, "Patches"); } // set lagrangian mesh as output @@ -8021,50 +8052,37 @@ int vtkOpenFOAMReaderPrivate::RequestData(vtkMultiBlockDataSet *output, { if (lagrangianMesh->GetNumberOfBlocks() > 0) { - const unsigned int groupTypeI = output->GetNumberOfBlocks(); - output->SetBlock(groupTypeI, lagrangianMesh); - this->SetBlockName(output, groupTypeI, "Lagrangian Particles"); + this->SetShallowCopies(output, lagrangianMesh, "Lagrangian Particles"); } lagrangianMesh->Delete(); } if (this->Parent->GetReadZones()) { - vtkMultiBlockDataSet *zones = NULL; + vtkMultiBlockDataSet *zones + = (this->PointZoneMesh || this->FaceZoneMesh || this->CellZoneMesh + ? vtkMultiBlockDataSet::New() : 0); + // set Zone Meshes as output if (this->PointZoneMesh != NULL) { - zones = vtkMultiBlockDataSet::New(); - const unsigned int zoneTypeI = zones->GetNumberOfBlocks(); - zones->SetBlock(zoneTypeI, this->PointZoneMesh); - this->SetBlockName(zones, zoneTypeI, "pointZones"); + this->SetShallowCopies(zones, this->PointZoneMesh, "pointZones"); } if (this->FaceZoneMesh != NULL) { - if (zones == NULL) - { - zones = vtkMultiBlockDataSet::New(); - } - const unsigned int zoneTypeI = zones->GetNumberOfBlocks(); - zones->SetBlock(zoneTypeI, this->FaceZoneMesh); - this->SetBlockName(zones, zoneTypeI, "faceZones"); + this->SetShallowCopies(zones, this->FaceZoneMesh, "faceZones"); } if (this->CellZoneMesh != NULL) { - if (zones == NULL) - { - zones = vtkMultiBlockDataSet::New(); - } - const unsigned int zoneTypeI = zones->GetNumberOfBlocks(); - zones->SetBlock(zoneTypeI, this->CellZoneMesh); - this->SetBlockName(zones, zoneTypeI, "cellZones"); + this->SetShallowCopies(zones, this->CellZoneMesh, "cellZones"); } if (zones != NULL) { const unsigned int groupTypeI = output->GetNumberOfBlocks(); output->SetBlock(groupTypeI, zones); + zones->FastDelete(); this->SetBlockName(output, groupTypeI, "Zones"); } }
_______________________________________________ Powered by www.kitware.com Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html Please keep messages on-topic and check the ParaView Wiki at: http://paraview.org/Wiki/ParaView Follow this link to subscribe/unsubscribe: http://www.paraview.org/mailman/listinfo/paraview