diff --git a/src/lagrangian/intermediate/parcels/include/makeParcelPostProcessingModels.H b/src/lagrangian/intermediate/parcels/include/makeParcelPostProcessingModels.H index ab3055882ff2d8c2c000df77edbce8df100d64b5..76b81aea20b5b0a7cf37ca610519cb24cc4c9246 100644 --- a/src/lagrangian/intermediate/parcels/include/makeParcelPostProcessingModels.H +++ b/src/lagrangian/intermediate/parcels/include/makeParcelPostProcessingModels.H @@ -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, \ diff --git a/src/lagrangian/intermediate/submodels/Kinematic/PostProcessingModel/ParticleTracks/ParticleTracks.C b/src/lagrangian/intermediate/submodels/Kinematic/PostProcessingModel/ParticleTracks/ParticleTracks.C new file mode 100644 index 0000000000000000000000000000000000000000..c68801ad6e5f090453a4f52c60e8cb29dbb962fb --- /dev/null +++ b/src/lagrangian/intermediate/submodels/Kinematic/PostProcessingModel/ParticleTracks/ParticleTracks.C @@ -0,0 +1,139 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / 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()) + ); + } + } +} + + +// ************************************************************************* // diff --git a/src/lagrangian/intermediate/submodels/Kinematic/PostProcessingModel/ParticleTracks/ParticleTracks.H b/src/lagrangian/intermediate/submodels/Kinematic/PostProcessingModel/ParticleTracks/ParticleTracks.H new file mode 100644 index 0000000000000000000000000000000000000000..6bdb3d7478ea8d82d31763409e5032fdabb14975 --- /dev/null +++ b/src/lagrangian/intermediate/submodels/Kinematic/PostProcessingModel/ParticleTracks/ParticleTracks.H @@ -0,0 +1,165 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / 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 + +// ************************************************************************* // diff --git a/src/lagrangian/intermediate/submodels/Kinematic/PostProcessingModel/ParticleTracks/ParticleTracksI.H b/src/lagrangian/intermediate/submodels/Kinematic/PostProcessingModel/ParticleTracks/ParticleTracksI.H new file mode 100644 index 0000000000000000000000000000000000000000..f36556c4f11d54e47a36833cf333085e64a56f8c --- /dev/null +++ b/src/lagrangian/intermediate/submodels/Kinematic/PostProcessingModel/ParticleTracks/ParticleTracksI.H @@ -0,0 +1,67 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / 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_(); +} + + +// ************************************************************************* //