Files
OpenFOAM-12/src/lagrangian/basic/Cloud/Cloud.H
Will Bainbridge 4c223b8aee particle: Removed polyMesh reference
This reference represents unnecessary storage. The mesh can be obtained
from tracking data or passed to the particle evolution functions by
argument.

In addition, removing the mesh reference makes it possible to construct
as particle from an Istream without the need for an iNew class. This
simplifies stream-based transfer, and makes it possible for particles to
be communicated by a polyDistributionMap.
2022-09-21 16:31:40 +01:00

346 lines
9.6 KiB
C++

/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Copyright (C) 2011-2022 OpenFOAM Foundation
\\/ 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::Cloud
Description
Base cloud calls templated on particle type
SourceFiles
Cloud.C
CloudIO.C
\*---------------------------------------------------------------------------*/
#ifndef Cloud_H
#define Cloud_H
#include "cloud.H"
#include "IDLList.H"
#include "IOField.H"
#include "CompactIOField.H"
#include "polyMesh.H"
#include "PackedBoolList.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
// Forward declaration of functions
template<class ParticleType>
class Cloud;
template<class ParticleType>
class IOPosition;
template<class ParticleType>
Ostream& operator<<
(
Ostream&,
const Cloud<ParticleType>&
);
/*---------------------------------------------------------------------------*\
Class Cloud Declaration
\*---------------------------------------------------------------------------*/
template<class ParticleType>
class Cloud
:
public cloud,
public IDLList<ParticleType>
{
// Private Data
//- Reference to the mesh
const polyMesh& pMesh_;
//- Map from patch index to the neighbouring processor index
const labelList patchNbrProc_;
//- Map from patch index to the corresponding patch index on the
// neighbouring processor
const labelList patchNbrProcPatch_;
//- Map from patch index to connected non-conformal cyclics
const labelListList patchNonConformalCyclicPatches_;
//- Temporary storage for the global particle positions
mutable autoPtr<vectorField> globalPositionsPtr_;
// Private Member Functions
//- Check patches
void checkPatches() const;
//- Initialise cloud on IO constructor
void initCloud(const bool checkClass);
//- Read cloud properties dictionary
void readCloudUniformProperties();
//- Write cloud properties dictionary
void writeCloudUniformProperties() const;
//- Map from patch index to the neighbouring processor index
static labelList patchNbrProc(const polyMesh&);
//- Map from patch index to the corresponding patch index on the
// neighbouring processor
static labelList patchNbrProcPatch(const polyMesh&);
//- Map from patch index to connected non-conformal cyclics
static labelListList patchNonConformalCyclicPatches(const polyMesh&);
//- Store rays necessary for non conformal cyclic transfer
void storeRays() const;
public:
friend class particle;
template<class ParticleT>
friend class IOPosition;
typedef ParticleType particleType;
typedef typename IDLList<ParticleType>::iterator iterator;
typedef typename IDLList<ParticleType>::const_iterator const_iterator;
// Static data
//- Name of cloud properties dictionary
static word cloudPropertiesName;
// Constructors
//- Construct from mesh and a list of particles
Cloud
(
const polyMesh& mesh,
const word& cloudName,
const IDLList<ParticleType>& particles
);
//- Construct from mesh by reading from file with given cloud instance
// Optionally disable checking of class name for post-processing
Cloud
(
const polyMesh& pMesh,
const word& cloudName,
const bool checkClass = true
);
// Member Functions
// Access
//- Return the polyMesh reference
const polyMesh& pMesh() const
{
return pMesh_;
}
//- Map from patch index to the neighbouring processor index
const labelList& patchNbrProc() const
{
return patchNbrProc_;
}
//- Map from patch index to the corresponding patch index on the
// neighbouring processor
const labelList& patchNbrProcPatch() const
{
return patchNbrProcPatch_;
}
//- Return map from patch index to connected non-conformal cyclics
const labelListList& patchNonConformalCyclicPatches() const
{
return patchNonConformalCyclicPatches_;
}
//- Return the number of particles in the cloud
label size() const
{
return IDLList<ParticleType>::size();
};
// Iterators
const const_iterator begin() const
{
return IDLList<ParticleType>::begin();
};
const const_iterator cbegin() const
{
return IDLList<ParticleType>::cbegin();
};
const const_iterator end() const
{
return IDLList<ParticleType>::end();
};
const const_iterator cend() const
{
return IDLList<ParticleType>::cend();
};
iterator begin()
{
return IDLList<ParticleType>::begin();
};
iterator end()
{
return IDLList<ParticleType>::end();
};
// Edit
void clear()
{
IDLList<ParticleType>::clear();
};
//- Transfer particle to cloud
void addParticle(ParticleType* pPtr);
//- Remove particle from cloud and delete
void deleteParticle(ParticleType&);
//- Remove lost particles from cloud and delete
void deleteLostParticles();
//- Reset the particles
void cloudReset(const Cloud<ParticleType>& c);
//- Move the particles
template<class TrackCloudType>
void move
(
TrackCloudType& cloud,
typename ParticleType::trackingData& td,
const scalar trackTime
);
// Mapping
//- Update topology using the given map
virtual void topoChange(const polyTopoChangeMap&);
//- Update from another mesh using the given map
virtual void mapMesh(const polyMeshMap&);
//- Redistribute or update using the given distribution map
virtual void distribute(const polyDistributionMap&);
// Read
//- Helper to construct IOobject for field and current time.
IOobject fieldIOobject
(
const word& fieldName,
const IOobject::readOption r
) const;
//- Check lagrangian data field
template<class DataType>
void checkFieldIOobject
(
const Cloud<ParticleType>& c,
const IOField<DataType>& data
) const;
//- Check lagrangian data fieldfield
template<class DataType>
void checkFieldFieldIOobject
(
const Cloud<ParticleType>& c,
const CompactIOField<Field<DataType>>& data
) const;
// Write
//- Write the field data for the cloud of particles Dummy at
// this level.
virtual void writeFields() const;
//- Write using given format, version and compression.
// Only writes the cloud file if the Cloud isn't empty
virtual bool writeObject
(
IOstream::streamFormat fmt,
IOstream::versionNumber ver,
IOstream::compressionType cmp,
const bool write = true
) const;
//- Write positions to \<cloudName\>_positions.obj file
void writePositions() const;
//- Call this before a topology change. Stores the particles global
// positions in the database for use during mapping.
void storeGlobalPositions() const;
// Ostream Operator
friend Ostream& operator<< <ParticleType>
(
Ostream&,
const Cloud<ParticleType>&
);
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#ifdef NoRepository
#include "Cloud.C"
#endif
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //