/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2018-2019 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 3 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, see .
\*---------------------------------------------------------------------------*/
#include "catalystTools.H"
#include "Time.H"
#include
#include
#include
#include
#include
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
const Foam::wordHashSet Foam::catalyst::dataQuery::emptyWordHash_;
// * * * * * * * * * * * * * * * Global Functions * * * * * * * * * * * * * //
void Foam::catalyst::printInfo(Ostream& os, vtkCPDataDescription* descrip)
{
if (!descrip)
{
return;
}
const unsigned nItems = descrip->GetNumberOfInputDescriptions();
for (unsigned itemi = 0; itemi < nItems; ++itemi)
{
vtkCPInputDataDescription* input = descrip->GetInputDescription(itemi);
if (!input) continue; // should not happen
os <<"input: " << descrip->GetInputDescriptionName(itemi) << nl;
const unsigned nFields = input->GetNumberOfFields();
for (unsigned fieldi = 0; fieldi < nFields; ++fieldi)
{
os << " field: " << input->GetFieldName(fieldi) << nl;
}
if (!nFields) os <<" no fields requested" << nl;
}
}
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::catalyst::timeQuery::timeQuery(const Foam::Time& when)
:
timeValue(when.timeOutputValue()),
timeIndex(when.timeIndex()),
forced(when.timeOutputValue() >= when.endTime().value())
{}
Foam::catalyst::dataQuery::dataQuery(const Foam::Time& when)
:
timeQuery(when),
names_(),
fields_(),
active_(),
descrip_(vtkCPDataDescription::New())
{}
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
Foam::catalyst::dataQuery::~dataQuery()
{
descrip_->Delete();
}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
void Foam::catalyst::dataQuery::set
(
const word& channel,
const wordHashSet& fields
)
{
auto iter = fields_.find(channel);
if (iter.found())
{
*iter = fields;
}
else
{
active_.insert(names_.size());
fields_.insert(channel, fields);
names_.append(channel);
}
}
Foam::label Foam::catalyst::dataQuery::query(vtkCPProcessor* coproc)
{
dataQuery& dataq = *this;
if (!coproc)
{
Info<< "No ParaView Catalyst initialized" << endl;
dataq.clear();
return dataq.size();
}
if (dataq.empty())
{
// No channels names have been published by the simulation
return dataq.size();
}
vtkCPDataDescription* descrip = dataq.description();
descrip->SetTimeData(dataq.timeValue, dataq.timeIndex);
descrip->SetForceOutput(dataq.forced);
const wordList inputNames(dataq.names());
// Sort out which channels already exist, are new, or disappeared
// The currently defined channels
wordHashSet currChannels;
const unsigned n = descrip->GetNumberOfInputDescriptions();
for (unsigned i=0; i < n; ++i)
{
currChannels.insert
(
word::validate(descrip->GetInputDescriptionName(i))
);
}
wordHashSet oldChannels(currChannels);
oldChannels.erase(inputNames);
if (oldChannels.size())
{
// Some channels disappear - remove and redo everything
descrip->ResetAll();
currChannels.clear();
}
// Add channels.
// Note: this misses updating field information for previously
// existing inputs.
for (const word& channel : inputNames)
{
if (currChannels.found(channel))
{
continue;
}
descrip->AddInput(channel.c_str());
auto* input = descrip->GetInputDescriptionByName(channel.c_str());
for (const word& fldName : dataq.fields(channel))
{
#if (PARAVIEW_VERSION_MAJOR == 5) && \
(PARAVIEW_VERSION_MINOR < 6)
input->AddPointField(fldName.c_str());
input->AddCellField(fldName.c_str());
#else
input->AddField(fldName.c_str(), vtkDataObject::CELL);
input->AddField(fldName.c_str(), vtkDataObject::POINT);
#endif
}
}
if
(
!coproc->RequestDataDescription(descrip)
|| !descrip->GetIfAnyGridNecessary()
)
{
dataq.clear();
return dataq.size();
}
for (const word& channel : inputNames)
{
auto* input = descrip->GetInputDescriptionByName(channel.c_str());
if (input && input->GetIfGridIsNecessary())
{
wordHashSet requestedFields;
for (const word& fldName : dataq.fields(channel))
{
#if (PARAVIEW_VERSION_MAJOR == 5) && \
(PARAVIEW_VERSION_MINOR < 6)
if (input->IsFieldNeeded(fldName.c_str()))
{
requestedFields.insert(fldName);
}
#else
if
(
input->IsFieldNeeded(fldName.c_str(), vtkDataObject::CELL)
|| input->IsFieldNeeded(fldName.c_str(), vtkDataObject::POINT)
)
{
requestedFields.insert(fldName);
}
#endif
}
dataq.set(channel, requestedFields);
}
else
{
dataq.clear(channel);
}
}
return dataq.size();
}
// * * * * * * * * * * * * * * * Ostream Operator * * * * * * * * * * * * * //
Foam::Ostream& Foam::operator<<(Ostream& os, const catalyst::timeQuery& when)
{
os << "Time = " << when.timeValue << ", index: " << when.timeIndex;
return os;
}
// ************************************************************************* //