1 /*---------------------------------------------------------------------------*\
3 \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
5 \\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd.
7 -------------------------------------------------------------------------------
9 This file is part of OpenFOAM.
11 OpenFOAM is free software; you can redistribute it and/or modify it
12 under the terms of the GNU General Public License as published by the
13 Free Software Foundation; either version 2 of the License, or (at your
14 option) any later version.
16 OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
17 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
18 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
21 You should have received a copy of the GNU General Public License
22 along with OpenFOAM; if not, write to the Free Software Foundation,
23 Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
27 \*---------------------------------------------------------------------------*/
29 #include "vtkPV3Foam.H"
35 #include "fvMeshSubset.H"
36 #include "vtkPV3FoamReader.h"
39 #include "vtkDataArraySelection.h"
40 #include "vtkMultiBlockDataSet.h"
41 #include "vtkPolyData.h"
42 #include "vtkUnstructuredGrid.h"
44 // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
46 void Foam::vtkPV3Foam::convertMeshVolume
48 vtkMultiBlockDataSet* output,
52 partInfo& selector = partInfoVolume_;
53 selector.block(blockNo); // set output block
54 label datasetNo = 0; // restart at dataset 0
55 const fvMesh& mesh = *meshPtr_;
57 // resize for decomposed polyhedra
58 regionPolyDecomp_.setSize(selector.size());
62 Info<< "<beg> Foam::vtkPV3Foam::convertMeshVolume" << endl;
66 // Convert the internalMesh
67 // this looks like more than one part, but it isn't
68 for (int partId = selector.start(); partId < selector.end(); ++partId)
70 const word partName = "internalMesh";
72 if (!partStatus_[partId])
77 vtkUnstructuredGrid* vtkmesh = volumeVTKMesh
80 regionPolyDecomp_[datasetNo]
85 AddToBlock(output, vtkmesh, selector, datasetNo, partName);
88 partDataset_[partId] = datasetNo++;
100 Info<< "<end> Foam::vtkPV3Foam::convertMeshVolume" << endl;
106 void Foam::vtkPV3Foam::convertMeshLagrangian
108 vtkMultiBlockDataSet* output,
112 partInfo& selector = partInfoLagrangian_;
113 selector.block(blockNo); // set output block
114 label datasetNo = 0; // restart at dataset 0
115 const fvMesh& mesh = *meshPtr_;
119 Info<< "<beg> Foam::vtkPV3Foam::convertMeshLagrangian" << endl;
123 for (int partId = selector.start(); partId < selector.end(); ++partId)
125 const word cloudName = getPartName(partId);
127 if (!partStatus_[partId])
132 vtkPolyData* vtkmesh = lagrangianVTKMesh(mesh, cloudName);
136 AddToBlock(output, vtkmesh, selector, datasetNo, cloudName);
139 partDataset_[partId] = datasetNo++;
151 Info<< "<end> Foam::vtkPV3Foam::convertMeshLagrangian" << endl;
157 void Foam::vtkPV3Foam::convertMeshPatches
159 vtkMultiBlockDataSet* output,
163 partInfo& selector = partInfoPatches_;
164 selector.block(blockNo); // set output block
165 label datasetNo = 0; // restart at dataset 0
166 const fvMesh& mesh = *meshPtr_;
167 const polyBoundaryMesh& patches = mesh.boundaryMesh();
171 Info<< "<beg> Foam::vtkPV3Foam::convertMeshPatches" << endl;
175 for (int partId = selector.start(); partId < selector.end(); ++partId)
177 const word patchName = getPartName(partId);
178 const label patchId = patches.findPatchID(patchName);
180 if (!partStatus_[partId] || patchId < 0)
187 Info<< "Creating VTK mesh for patch[" << patchId <<"] "
188 << patchName << endl;
191 vtkPolyData* vtkmesh = patchVTKMesh(patches[patchId]);
195 AddToBlock(output, vtkmesh, selector, datasetNo, patchName);
198 partDataset_[partId] = datasetNo++;
210 Info<< "<end> Foam::vtkPV3Foam::convertMeshPatches" << endl;
216 void Foam::vtkPV3Foam::convertMeshCellZones
218 vtkMultiBlockDataSet* output,
222 partInfo& selector = partInfoCellZones_;
223 selector.block(blockNo); // set output block
224 label datasetNo = 0; // restart at dataset 0
225 const fvMesh& mesh = *meshPtr_;
227 // resize for decomposed polyhedra
228 zonePolyDecomp_.setSize(selector.size());
230 if (!selector.size())
237 Info<< "<beg> Foam::vtkPV3Foam::convertMeshCellZones" << endl;
241 const cellZoneMesh& zMesh = mesh.cellZones();
242 for (int partId = selector.start(); partId < selector.end(); ++partId)
244 const word zoneName = getPartName(partId);
245 const label zoneId = zMesh.findZoneID(zoneName);
247 if (!partStatus_[partId] || zoneId < 0)
254 Info<< "Creating VTK mesh for cellZone[" << zoneId << "] "
258 fvMeshSubset subsetter(mesh);
259 subsetter.setLargeCellSubset(zMesh[zoneId]);
261 vtkUnstructuredGrid* vtkmesh = volumeVTKMesh
264 zonePolyDecomp_[datasetNo]
269 // superCells + addPointCellLabels must contain global cell ids
273 zonePolyDecomp_[datasetNo].superCells()
278 zonePolyDecomp_[datasetNo].addPointCellLabels()
281 // copy pointMap as well, otherwise pointFields fail
282 zonePolyDecomp_[datasetNo].pointMap() = subsetter.pointMap();
284 AddToBlock(output, vtkmesh, selector, datasetNo, zoneName);
287 partDataset_[partId] = datasetNo++;
299 Info<< "<end> Foam::vtkPV3Foam::convertMeshCellZones" << endl;
305 void Foam::vtkPV3Foam::convertMeshCellSets
307 vtkMultiBlockDataSet* output,
311 partInfo& selector = partInfoCellSets_;
312 selector.block(blockNo); // set output block
313 label datasetNo = 0; // restart at dataset 0
314 const fvMesh& mesh = *meshPtr_;
316 // resize for decomposed polyhedra
317 csetPolyDecomp_.setSize(selector.size());
321 Info<< "<beg> Foam::vtkPV3Foam::convertMeshCellSets" << endl;
325 for (int partId = selector.start(); partId < selector.end(); ++partId)
327 const word partName = getPartName(partId);
329 if (!partStatus_[partId])
336 Info<< "Creating VTK mesh for cellSet=" << partName << endl;
339 const cellSet cSet(mesh, partName);
340 fvMeshSubset subsetter(mesh);
341 subsetter.setLargeCellSubset(cSet);
343 vtkUnstructuredGrid* vtkmesh = volumeVTKMesh
346 csetPolyDecomp_[datasetNo]
351 // superCells + addPointCellLabels must contain global cell ids
355 csetPolyDecomp_[datasetNo].superCells()
360 csetPolyDecomp_[datasetNo].addPointCellLabels()
363 // copy pointMap as well, otherwise pointFields fail
364 csetPolyDecomp_[datasetNo].pointMap() = subsetter.pointMap();
366 AddToBlock(output, vtkmesh, selector, datasetNo, partName);
369 partDataset_[partId] = datasetNo++;
381 Info<< "<end> Foam::vtkPV3Foam::convertMeshCellSets" << endl;
387 void Foam::vtkPV3Foam::convertMeshFaceZones
389 vtkMultiBlockDataSet* output,
393 partInfo& selector = partInfoFaceZones_;
394 selector.block(blockNo); // set output block
395 label datasetNo = 0; // restart at dataset 0
396 const fvMesh& mesh = *meshPtr_;
398 if (!selector.size())
405 Info<< "<beg> Foam::vtkPV3Foam::convertMeshFaceZones" << endl;
409 const faceZoneMesh& zMesh = mesh.faceZones();
410 for (int partId = selector.start(); partId < selector.end(); ++partId)
412 const word zoneName = getPartName(partId);
413 const label zoneId = zMesh.findZoneID(zoneName);
415 if (!partStatus_[partId] || zoneId < 0)
422 Info<< "Creating VTKmesh for faceZone[" << zoneId << "] "
426 vtkPolyData* vtkmesh = faceZoneVTKMesh(mesh, zMesh[zoneId]);
429 AddToBlock(output, vtkmesh, selector, datasetNo, zoneName);
432 partDataset_[partId] = datasetNo++;
444 Info<< "<end> Foam::vtkPV3Foam::convertMeshFaceZones" << endl;
450 void Foam::vtkPV3Foam::convertMeshFaceSets
452 vtkMultiBlockDataSet* output,
456 partInfo& selector = partInfoFaceSets_;
457 selector.block(blockNo); // set output block
458 label datasetNo = 0; // restart at dataset 0
459 const fvMesh& mesh = *meshPtr_;
463 Info<< "<beg> Foam::vtkPV3Foam::convertMeshFaceSets" << endl;
467 for (int partId = selector.start(); partId < selector.end(); ++partId)
469 const word partName = getPartName(partId);
471 if (!partStatus_[partId])
478 Info<< "Creating VTK mesh for faceSet=" << partName << endl;
481 const faceSet fSet(mesh, partName);
483 vtkPolyData* vtkmesh = faceSetVTKMesh(mesh, fSet);
486 AddToBlock(output, vtkmesh, selector, datasetNo, partName);
489 partDataset_[partId] = datasetNo++;
501 Info<< "<end> Foam::vtkPV3Foam::convertMeshFaceSets" << endl;
507 void Foam::vtkPV3Foam::convertMeshPointZones
509 vtkMultiBlockDataSet* output,
513 partInfo& selector = partInfoPointZones_;
514 selector.block(blockNo); // set output block
515 label datasetNo = 0; // restart at dataset 0
516 const fvMesh& mesh = *meshPtr_;
520 Info<< "<beg> Foam::vtkPV3Foam::convertMeshPointZones" << endl;
526 const pointZoneMesh& zMesh = mesh.pointZones();
527 for (int partId = selector.start(); partId < selector.end(); ++partId)
529 word zoneName = getPartName(partId);
530 label zoneId = zMesh.findZoneID(zoneName);
532 if (!partStatus_[partId] || zoneId < 0)
537 vtkPolyData* vtkmesh = pointZoneVTKMesh(mesh, zMesh[zoneId]);
540 AddToBlock(output, vtkmesh, selector, datasetNo, zoneName);
543 partDataset_[partId] = datasetNo++;
556 Info<< "<end> Foam::vtkPV3Foam::convertMeshPointZones" << endl;
563 void Foam::vtkPV3Foam::convertMeshPointSets
565 vtkMultiBlockDataSet* output,
569 partInfo& selector = partInfoPointSets_;
570 selector.block(blockNo); // set output block
571 label datasetNo = 0; // restart at dataset 0
572 const fvMesh& mesh = *meshPtr_;
576 Info<< "<beg> Foam::vtkPV3Foam::convertMeshPointSets" << endl;
580 for (int partId = selector.start(); partId < selector.end(); ++partId)
582 word partName = getPartName(partId);
584 if (!partStatus_[partId])
591 Info<< "Creating VTK mesh for pointSet=" << partName << endl;
594 const pointSet pSet(mesh, partName);
596 vtkPolyData* vtkmesh = pointSetVTKMesh(mesh, pSet);
599 AddToBlock(output, vtkmesh, selector, datasetNo, partName);
602 partDataset_[partId] = datasetNo++;
614 Info<< "<end> Foam::vtkPV3Foam::convertMeshPointSets" << endl;
619 // ************************************************************************* //