mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-12-28 03:37:59 +00:00
- Include Sets/Zones now scans immediately to refresh the list of available mesh parts. Unfortunately, this also causes the object panel to be modified, even although the selection doesn't acutally need to change. This seems to be due to how the pqNamedWidgets are getting the information from the proxy properties. I can't figure if it's possible to acheive what I want, but we can probably live with the current implementation. After IncludeZones, simply us 'Reset' to undo the spurious GUI changes. Works fine - just looks a bit silly. - Added 'Refresh' button to rescan for new times/fields. Good for post-processing ongoing calculations without exiting the reader. - Added 'Skip Zero Time' checkbox: many (some) calculations have data missing at time=0 (eg, rho, lagrangian, etc). This provides a convenient way to skip over this time. - Future?: We could probably pick up favourite default values for these switches from ~OpenFOAM/controlDict, from a case system/paraview, or simply by making the casename.OpenFOAM also be an OpenFOAM dictionary with the settings.
328 lines
8.0 KiB
C
328 lines
8.0 KiB
C
/*---------------------------------------------------------------------------*\
|
|
========= |
|
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
|
\\ / O peration |
|
|
\\ / A nd | Copyright (C) 2008-2009 OpenCFD Ltd.
|
|
\\/ M anipulation |
|
|
-------------------------------------------------------------------------------
|
|
License
|
|
This file is part of OpenFOAM.
|
|
|
|
OpenFOAM is free software; you can redistribute it and/or modify it
|
|
under the terms of the GNU General Public License as published by the
|
|
Free Software Foundation; either version 2 of the License, or (at your
|
|
option) any later version.
|
|
|
|
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with OpenFOAM; if not, write to the Free Software Foundation,
|
|
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
|
|
Description
|
|
|
|
\*---------------------------------------------------------------------------*/
|
|
|
|
#include "vtkPV3blockMesh.H"
|
|
#include "vtkPV3blockMeshReader.h"
|
|
|
|
// Foam includes
|
|
#include "blockMesh.H"
|
|
#include "Time.H"
|
|
|
|
#include "vtkOpenFOAMPoints.H"
|
|
|
|
// VTK includes
|
|
#include "vtkCellArray.h"
|
|
#include "vtkDataArraySelection.h"
|
|
#include "vtkMultiBlockDataSet.h"
|
|
#include "vtkPoints.h"
|
|
#include "vtkPolyData.h"
|
|
#include "vtkUnstructuredGrid.h"
|
|
|
|
|
|
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
|
|
|
void Foam::vtkPV3blockMesh::convertMeshBlocks
|
|
(
|
|
vtkMultiBlockDataSet* output,
|
|
int& blockNo
|
|
)
|
|
{
|
|
vtkDataArraySelection* selection = reader_->GetBlockSelection();
|
|
arrayRange& range = arrayRangeBlocks_;
|
|
range.block(blockNo); // set output block
|
|
label datasetNo = 0; // restart at dataset 0
|
|
|
|
const blockMesh& blkMesh = *meshPtr_;
|
|
const Foam::pointField& blockPoints = blkMesh.blockPointField();
|
|
|
|
if (debug)
|
|
{
|
|
Info<< "<beg> Foam::vtkPV3blockMesh::convertMeshBlocks" << endl;
|
|
}
|
|
|
|
int blockI = 0;
|
|
const scalar scaleFactor = blkMesh.scaleFactor();
|
|
|
|
for
|
|
(
|
|
int partId = range.start();
|
|
partId < range.end();
|
|
++partId, ++blockI
|
|
)
|
|
{
|
|
if (!blockStatus_[partId])
|
|
{
|
|
continue;
|
|
}
|
|
|
|
const blockDescriptor& blockDef = blkMesh[blockI].blockDef();
|
|
|
|
vtkUnstructuredGrid* vtkmesh = vtkUnstructuredGrid::New();
|
|
|
|
// Convert Foam mesh vertices to VTK
|
|
vtkPoints *vtkpoints = vtkPoints::New();
|
|
vtkpoints->Allocate( blockDef.nPoints() );
|
|
const labelList& blockLabels = blockDef.blockShape();
|
|
|
|
vtkmesh->Allocate(1);
|
|
vtkIdType nodeIds[8];
|
|
|
|
forAll(blockLabels, ptI)
|
|
{
|
|
vtkInsertNextOpenFOAMPoint
|
|
(
|
|
vtkpoints,
|
|
blockPoints[blockLabels[ptI]],
|
|
scaleFactor
|
|
);
|
|
|
|
nodeIds[ptI] = ptI;
|
|
}
|
|
|
|
vtkmesh->InsertNextCell
|
|
(
|
|
VTK_HEXAHEDRON,
|
|
8,
|
|
nodeIds
|
|
);
|
|
|
|
vtkmesh->SetPoints(vtkpoints);
|
|
vtkpoints->Delete();
|
|
|
|
AddToBlock
|
|
(
|
|
output, vtkmesh, range, datasetNo,
|
|
selection->GetArrayName(partId)
|
|
);
|
|
|
|
vtkmesh->Delete();
|
|
datasetNo++;
|
|
}
|
|
|
|
|
|
// anything added?
|
|
if (datasetNo)
|
|
{
|
|
++blockNo;
|
|
}
|
|
|
|
if (debug)
|
|
{
|
|
Info<< "<end> Foam::vtkPV3blockMesh::convertMeshBlocks" << endl;
|
|
}
|
|
}
|
|
|
|
|
|
void Foam::vtkPV3blockMesh::convertMeshEdges
|
|
(
|
|
vtkMultiBlockDataSet* output,
|
|
int& blockNo
|
|
)
|
|
{
|
|
vtkDataArraySelection* selection = reader_->GetCurvedEdgesSelection();
|
|
arrayRange& range = arrayRangeEdges_;
|
|
|
|
range.block(blockNo); // set output block
|
|
label datasetNo = 0; // restart at dataset 0
|
|
|
|
const blockMesh& blkMesh = *meshPtr_;
|
|
const curvedEdgeList& edges = blkMesh.edges();
|
|
|
|
int edgeI = 0;
|
|
const scalar scaleFactor = blkMesh.scaleFactor();
|
|
|
|
for
|
|
(
|
|
int partId = range.start();
|
|
partId < range.end();
|
|
++partId, ++edgeI
|
|
)
|
|
{
|
|
if (!edgeStatus_[partId])
|
|
{
|
|
continue;
|
|
}
|
|
|
|
OStringStream ostr;
|
|
|
|
ostr<< edges[edgeI].start() << ":" << edges[edgeI].end() << " - "
|
|
<< edges[edgeI].type();
|
|
|
|
// search each block
|
|
forAll(blkMesh, blockI)
|
|
{
|
|
const blockDescriptor& blockDef = blkMesh[blockI].blockDef();
|
|
|
|
edgeList blkEdges = blockDef.blockShape().edges();
|
|
|
|
// find the corresponding edge within the block
|
|
label foundEdgeI = -1;
|
|
forAll(blkEdges, blkEdgeI)
|
|
{
|
|
if (edges[edgeI].compare(blkEdges[blkEdgeI]))
|
|
{
|
|
foundEdgeI = blkEdgeI;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (foundEdgeI != -1)
|
|
{
|
|
const List<point>& edgePoints =
|
|
blockDef.blockEdgePoints()[foundEdgeI];
|
|
|
|
|
|
vtkPolyData* vtkmesh = vtkPolyData::New();
|
|
vtkPoints* vtkpoints = vtkPoints::New();
|
|
|
|
vtkpoints->Allocate( edgePoints.size() );
|
|
vtkmesh->Allocate(1);
|
|
|
|
vtkIdType pointIds[edgePoints.size()];
|
|
forAll(edgePoints, ptI)
|
|
{
|
|
vtkInsertNextOpenFOAMPoint
|
|
(
|
|
vtkpoints,
|
|
edgePoints[ptI],
|
|
scaleFactor
|
|
);
|
|
pointIds[ptI] = ptI;
|
|
}
|
|
|
|
vtkmesh->InsertNextCell
|
|
(
|
|
VTK_POLY_LINE,
|
|
edgePoints.size(),
|
|
pointIds
|
|
);
|
|
|
|
vtkmesh->SetPoints(vtkpoints);
|
|
vtkpoints->Delete();
|
|
|
|
AddToBlock
|
|
(
|
|
output, vtkmesh, range, datasetNo,
|
|
selection->GetArrayName(partId)
|
|
);
|
|
|
|
vtkmesh->Delete();
|
|
datasetNo++;
|
|
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
// anything added?
|
|
if (datasetNo)
|
|
{
|
|
++blockNo;
|
|
}
|
|
|
|
if (debug)
|
|
{
|
|
Info<< "<end> Foam::vtkPV3blockMesh::convertMeshEdges" << endl;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
void Foam::vtkPV3blockMesh::convertMeshCorners
|
|
(
|
|
vtkMultiBlockDataSet* output,
|
|
int& blockNo
|
|
)
|
|
{
|
|
arrayRange& range = arrayRangeCorners_;
|
|
range.block(blockNo); // set output block
|
|
label datasetNo = 0; // restart at dataset 0
|
|
|
|
const pointField& blockPoints = meshPtr_->blockPointField();
|
|
const scalar& scaleFactor = meshPtr_->scaleFactor();
|
|
|
|
if (debug)
|
|
{
|
|
Info<< "<beg> Foam::vtkPV3blockMesh::convertMeshCorners" << endl;
|
|
}
|
|
|
|
if (true) // or some flag or other condition
|
|
{
|
|
vtkPolyData* vtkmesh = vtkPolyData::New();
|
|
vtkPoints* vtkpoints = vtkPoints::New();
|
|
vtkCellArray* vtkcells = vtkCellArray::New();
|
|
|
|
vtkpoints->Allocate( blockPoints.size() );
|
|
vtkcells->Allocate( blockPoints.size() );
|
|
|
|
vtkIdType pointId = 0;
|
|
forAll(blockPoints, ptI)
|
|
{
|
|
vtkInsertNextOpenFOAMPoint
|
|
(
|
|
vtkpoints,
|
|
blockPoints[ptI],
|
|
scaleFactor
|
|
);
|
|
|
|
vtkcells->InsertNextCell(1, &pointId);
|
|
pointId++;
|
|
}
|
|
|
|
vtkmesh->SetPoints(vtkpoints);
|
|
vtkpoints->Delete();
|
|
|
|
vtkmesh->SetVerts(vtkcells);
|
|
vtkcells->Delete();
|
|
|
|
AddToBlock
|
|
(
|
|
output, vtkmesh, range, datasetNo,
|
|
arrayRangeCorners_.name()
|
|
);
|
|
vtkmesh->Delete();
|
|
|
|
datasetNo++;
|
|
}
|
|
|
|
// anything added?
|
|
if (datasetNo)
|
|
{
|
|
++blockNo;
|
|
}
|
|
|
|
if (debug)
|
|
{
|
|
Info<< "<end> Foam::vtkPV3blockMesh::convertMeshCorners" << endl;
|
|
}
|
|
}
|
|
|
|
|
|
// ************************************************************************* //
|