Commit 9506d21c authored by Andrew Heather's avatar Andrew Heather
Browse files

ENH: Added ParticleTracks cloud post-processing model

parent 544068cf
......@@ -31,6 +31,7 @@ License
#include "KinematicCloud.H"
#include "NoPostProcessing.H"
#include "ParticleTracks.H"
#include "PatchPostProcessing.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
......@@ -46,6 +47,12 @@ License
ParcelType \
); \
makePostProcessingModelType \
( \
ParticleTracks, \
KinematicCloud, \
ParcelType \
); \
makePostProcessingModelType \
( \
PatchPostProcessing, \
KinematicCloud, \
......
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2010-2010 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 <http://www.gnu.org/licenses/>.
\*---------------------------------------------------------------------------*/
#include "ParticleTracks.H"
#include "Pstream.H"
#include "ListListOps.H"
#include "IOPtrList.H"
// * * * * * * * * * * * * * protected Member Functions * * * * * * * * * * //
template<class CloudType>
void Foam::ParticleTracks<CloudType>::write()
{
if (this->owner().solution().writeThisStep())
{
cloudPtr_->write();
if (resetOnWrite_)
{
cloudPtr_->clear();
}
}
}
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
template<class CloudType>
Foam::ParticleTracks<CloudType>::ParticleTracks
(
const dictionary& dict,
CloudType& owner
)
:
PostProcessingModel<CloudType>(dict, owner, typeName),
trackInterval_(readLabel(this->coeffDict().lookup("trackInterval"))),
maxSamples_(readLabel(this->coeffDict().lookup("maxSamples"))),
resetOnWrite_(this->coeffDict().lookup("resetOnWrite")),
faceHitCounter_(),
cloudPtr_(NULL)
{}
template<class CloudType>
Foam::ParticleTracks<CloudType>::ParticleTracks
(
const ParticleTracks<CloudType>& ppm
)
:
PostProcessingModel<CloudType>(ppm),
trackInterval_(ppm.trackInterval_),
maxSamples_(ppm.maxSamples_),
resetOnWrite_(ppm.resetOnWrite_),
faceHitCounter_(ppm.faceHitCounter_),
cloudPtr_(ppm.cloudPtr_)
{}
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
template<class CloudType>
Foam::ParticleTracks<CloudType>::~ParticleTracks()
{}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
template<class CloudType>
void Foam::ParticleTracks<CloudType>::postPatch(const parcelType&, const label)
{}
template<class CloudType>
void Foam::ParticleTracks<CloudType>::postFace(const parcelType& p)
{
if
(
this->owner().solution().writeThisStep()
|| this->owner().solution().transient()
)
{
if (!cloudPtr_.valid())
{
cloudPtr_.reset
(
this->owner().cloneBare(this->owner().name() + "Tracks").ptr()
);
}
hitTableType::iterator iter =
faceHitCounter_.find(labelPair(p.origProc(), p.origId()));
label localI = -1;
if (iter != faceHitCounter_.end())
{
iter()++;
localI = iter();
}
else
{
localI = 1;
faceHitCounter_.insert(labelPair(p.origProc(), p.origId()), localI);
}
label nSamples = floor(localI/trackInterval_);
if ((localI % trackInterval_ == 0) && (nSamples < maxSamples_))
{
cloudPtr_->append
(
static_cast<parcelType*>(p.clone(cloudPtr_()).ptr())
);
}
}
}
// ************************************************************************* //
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2010-2010 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 <http://www.gnu.org/licenses/>.
Class
Foam::ParticleTracks
Description
Records particle state (all variables) on each call to postFace
SourceFiles
ParticleTracks.C
\*---------------------------------------------------------------------------*/
#ifndef ParticleTracks_H
#define ParticleTracks_H
#include "PostProcessingModel.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
/*---------------------------------------------------------------------------*\
Class ParticleTracks Declaration
\*---------------------------------------------------------------------------*/
template<class CloudType>
class ParticleTracks
:
public PostProcessingModel<CloudType>
{
// Private data
// Typedefs
//- Convenience typedef for parcel type
typedef typename CloudType::parcelType parcelType;
//- Convenience typedef for hash hit-table
typedef HashTable<label, labelPair, typename labelPair::Hash<> >
hitTableType;
//- Number of face-hit intervals between storing parcel data
label trackInterval_;
//- Maximum number of particles to store per track
label maxSamples_;
//- Flag to indicate whether data should be reset/cleared on writing
Switch resetOnWrite_;
//- Table of number of times a particle has hit a face
hitTableType faceHitCounter_;
//- Pointer to the cloud storage
autoPtr<Cloud<parcelType> > cloudPtr_;
protected:
// Protected member functions
//- Write post-processing info
void write();
public:
//- Runtime type information
TypeName("ParticleTracks");
// Constructors
//- Construct from dictionary
ParticleTracks(const dictionary& dict, CloudType& owner);
//- Construct copy
ParticleTracks(const ParticleTracks<CloudType>& ppm);
//- Construct and return a clone
virtual autoPtr<PostProcessingModel<CloudType> > clone() const
{
return autoPtr<PostProcessingModel<CloudType> >
(
new ParticleTracks<CloudType>(*this)
);
}
//- Destructor
virtual ~ParticleTracks();
// Member Functions
// Access
//- Return const access to the track interval
inline label trackInterval() const;
//- Return const access to the max samples
inline label maxSamples() const;
//- Return const access to the reset on write flag
inline const Switch& resetOnWrite() const;
//- Rerurn the table of number of times a particle has hit a face
inline const hitTableType& faceHitCounter() const;
//- Return const access to the cloud
inline const Cloud<parcelType>& cloud() const;
// Evaluation
//- Gather post-processing info on patch - not used
virtual void postPatch(const parcelType& p, const label patchI);
//- Gather particle data when hit face
virtual void postFace(const parcelType& p);
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#include "ParticleTracksI.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#ifdef NoRepository
# include "ParticleTracks.C"
#endif
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2010-2010 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 <http://www.gnu.org/licenses/>.
\*---------------------------------------------------------------------------*/
#include "ParticleTracks.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
template<class CloudType>
inline Foam::label Foam::ParticleTracks<CloudType>::trackInterval() const
{
return trackInterval_;
}
template<class CloudType>
inline Foam::label Foam::ParticleTracks<CloudType>::maxSamples() const
{
return maxSamples_;
}
template<class CloudType>
inline const Foam::Switch& Foam::ParticleTracks<CloudType>::resetOnWrite() const
{
return resetOnWrite_;
}
template<class CloudType>
inline const typename Foam::ParticleTracks<CloudType>::hitTableType&
Foam::ParticleTracks<CloudType>::faceHitCounter() const
{
return faceHitCounter_;
}
template<class CloudType>
inline const Foam::Cloud<typename CloudType::parcelType>&
Foam::ParticleTracks<CloudType>::cloud() const
{
return cloudPtr_();
}
// ************************************************************************* //
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment