mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
PV3FoamReader fix
- using a filter such as clip-plane on a multi-port source causes inconsistent UPDATE_TIME_STEPS() on each port. This looks like a VTK/Paraview bug to me. Workaround: check both ports and take the first one that has a value different than the last time set.
This commit is contained in:
@ -52,8 +52,7 @@ vtkPV3FoamReader::vtkPV3FoamReader()
|
||||
|
||||
// Add second output for the Lagrangian
|
||||
this->SetNumberOfOutputPorts(2);
|
||||
vtkMultiBlockDataSet *lagrangian;
|
||||
lagrangian = vtkMultiBlockDataSet::New();
|
||||
vtkMultiBlockDataSet *lagrangian = vtkMultiBlockDataSet::New();
|
||||
lagrangian->ReleaseData();
|
||||
|
||||
this->GetExecutive()->SetOutputData(1, lagrangian);
|
||||
@ -204,9 +203,9 @@ int vtkPV3FoamReader::RequestInformation
|
||||
);
|
||||
}
|
||||
|
||||
double timeRange[2];
|
||||
if (nTimeSteps)
|
||||
{
|
||||
double timeRange[2];
|
||||
timeRange[0] = timeSteps[0];
|
||||
timeRange[1] = timeSteps[nTimeSteps-1];
|
||||
|
||||
@ -273,19 +272,53 @@ int vtkPV3FoamReader::RequestData
|
||||
}
|
||||
}
|
||||
|
||||
// take port0 as the lead for other outputs
|
||||
vtkInformation *outInfo = outputVector->GetInformationObject(0);
|
||||
// Get the requested time step.
|
||||
// We only support requests for a single time step
|
||||
|
||||
int nRequestTime = 0;
|
||||
double requestTime[nInfo];
|
||||
|
||||
// taking port0 as the lead for other outputs would be nice, but fails when
|
||||
// a filter is added - we need to check everything
|
||||
// but since PREVIOUS_UPDATE_TIME_STEPS() is protected, relay the logic
|
||||
// to the vtkPV3Foam::setTime() method
|
||||
for (int infoI = 0; infoI < nInfo; ++infoI)
|
||||
{
|
||||
vtkInformation *outInfo = outputVector->GetInformationObject(infoI);
|
||||
|
||||
if
|
||||
(
|
||||
outInfo->Has
|
||||
(
|
||||
vtkStreamingDemandDrivenPipeline::UPDATE_TIME_STEPS()
|
||||
)
|
||||
&& outInfo->Length
|
||||
(
|
||||
vtkStreamingDemandDrivenPipeline::UPDATE_TIME_STEPS()
|
||||
) >= 1
|
||||
)
|
||||
{
|
||||
requestTime[nRequestTime++] = outInfo->Get
|
||||
(
|
||||
vtkStreamingDemandDrivenPipeline::UPDATE_TIME_STEPS()
|
||||
)[0];
|
||||
}
|
||||
}
|
||||
|
||||
if (nRequestTime)
|
||||
{
|
||||
foamData_->setTime(nRequestTime, requestTime);
|
||||
}
|
||||
|
||||
|
||||
vtkMultiBlockDataSet* output = vtkMultiBlockDataSet::SafeDownCast
|
||||
(
|
||||
outInfo->Get
|
||||
outputVector->GetInformationObject(0)->Get
|
||||
(
|
||||
vtkMultiBlockDataSet::DATA_OBJECT()
|
||||
)
|
||||
);
|
||||
|
||||
|
||||
vtkMultiBlockDataSet* lagrangianOutput = vtkMultiBlockDataSet::SafeDownCast
|
||||
(
|
||||
outputVector->GetInformationObject(1)->Get
|
||||
@ -294,24 +327,6 @@ int vtkPV3FoamReader::RequestData
|
||||
)
|
||||
);
|
||||
|
||||
if (outInfo->Has(vtkStreamingDemandDrivenPipeline::UPDATE_TIME_STEPS()))
|
||||
{
|
||||
// Get the requested time step.
|
||||
// We only support requests for a single time step
|
||||
int nRequestedTimeSteps = outInfo->Length
|
||||
(
|
||||
vtkStreamingDemandDrivenPipeline::UPDATE_TIME_STEPS()
|
||||
);
|
||||
if (nRequestedTimeSteps >= 1)
|
||||
{
|
||||
double *requestedTimeSteps = outInfo->Get
|
||||
(
|
||||
vtkStreamingDemandDrivenPipeline::UPDATE_TIME_STEPS()
|
||||
);
|
||||
|
||||
foamData_->setTime(requestedTimeSteps[0]);
|
||||
}
|
||||
}
|
||||
|
||||
if (Foam::vtkPV3Foam::debug)
|
||||
{
|
||||
|
||||
@ -90,12 +90,21 @@ void Foam::vtkPV3Foam::reduceMemory()
|
||||
|
||||
|
||||
|
||||
int Foam::vtkPV3Foam::setTime(const double& requestedTime)
|
||||
int Foam::vtkPV3Foam::setTime(int nRequest, const double requestTimes[])
|
||||
{
|
||||
if (debug)
|
||||
{
|
||||
Info<< "<beg> Foam::vtkPV3Foam::setTime(" << requestedTime << ")"
|
||||
<< endl;
|
||||
Info<< "<beg> Foam::vtkPV3Foam::setTime(";
|
||||
for (int requestI = 0; requestI < nRequest; ++requestI)
|
||||
{
|
||||
if (requestI)
|
||||
{
|
||||
Info<< ", ";
|
||||
}
|
||||
|
||||
Info<< requestTimes[requestI];
|
||||
}
|
||||
Info << ") - previousIndex = " << timeIndex_ << endl;
|
||||
}
|
||||
|
||||
Time& runTime = dbPtr_();
|
||||
@ -103,12 +112,26 @@ int Foam::vtkPV3Foam::setTime(const double& requestedTime)
|
||||
// Get times list
|
||||
instantList Times = runTime.times();
|
||||
|
||||
int nearestIndex = Time::findClosestTimeIndex(Times, requestedTime);
|
||||
int nearestIndex = timeIndex_;
|
||||
|
||||
for (int requestI = 0; requestI < nRequest; ++requestI)
|
||||
{
|
||||
int index = Time::findClosestTimeIndex(Times, requestTimes[requestI]);
|
||||
|
||||
if (index >= 0 && index != timeIndex_)
|
||||
{
|
||||
nearestIndex = index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (nearestIndex < 0)
|
||||
{
|
||||
nearestIndex = 0;
|
||||
}
|
||||
|
||||
|
||||
// see what has changed
|
||||
if (timeIndex_ != nearestIndex)
|
||||
{
|
||||
@ -138,10 +161,11 @@ int Foam::vtkPV3Foam::setTime(const double& requestedTime)
|
||||
|
||||
if (debug)
|
||||
{
|
||||
Info<< "<end> Foam::vtkPV3Foam::setTime() - selected time "
|
||||
<< Times[nearestIndex].name() << " index=" << nearestIndex
|
||||
<< " meshChanged=" << meshChanged_
|
||||
<< " fieldsChanged=" << fieldsChanged_ << endl;
|
||||
Info<< "<end> Foam::vtkPV3Foam::setTime() - selectedTime="
|
||||
<< Times[nearestIndex].name() << " index=" << timeIndex_
|
||||
<< "/" << Times.size()
|
||||
<< " meshChanged=" << Switch(meshChanged_)
|
||||
<< " fieldsChanged=" << Switch(fieldsChanged_) << endl;
|
||||
}
|
||||
|
||||
return nearestIndex;
|
||||
|
||||
@ -133,6 +133,7 @@ class vtkPV3Foam
|
||||
return block_;
|
||||
}
|
||||
|
||||
//- Assign block number, return previous value
|
||||
int block(int blockNo)
|
||||
{
|
||||
int prev = block_;
|
||||
@ -718,9 +719,11 @@ public:
|
||||
//- Remove patch names from the display
|
||||
void removePatchNames(vtkRenderer* renderer);
|
||||
|
||||
//- set the runTime to the requested time, returns the timeIndex
|
||||
// sets to "constant" on error and returns -1
|
||||
int setTime(const double& requestedTime);
|
||||
//- set the runTime to the first plausible request time,
|
||||
// returns the timeIndex
|
||||
// sets to "constant" on error
|
||||
int setTime(int count, const double requestTimes[]);
|
||||
|
||||
|
||||
//- The current time index
|
||||
int timeIndex() const
|
||||
|
||||
@ -40,7 +40,10 @@ void Foam::vtkPV3Foam::updateInfoFields
|
||||
{
|
||||
if (debug)
|
||||
{
|
||||
Info<< "<beg> Foam::vtkPV3Foam::updateInfoFields" << endl;
|
||||
Info<< "<beg> Foam::vtkPV3Foam::updateInfoFields <"
|
||||
<< meshType::Mesh::typeName
|
||||
<< "> [meshPtr=" << (meshPtr_ ? "set" : "NULL") << "]"
|
||||
<< endl;
|
||||
}
|
||||
|
||||
stringList enabledEntries;
|
||||
|
||||
Reference in New Issue
Block a user