Merge branch 'master' of ssh://git.code.sf.net/p/foam-extend/foam-extend-3.2
[foam-extend-3.2.git] / src / lagrangian / dsmc / clouds / Templates / DsmcCloud / DsmcCloudTemplate.H
blob3cfbdc09a4c92137ce73a6f0c18aee5e12a227ac
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | foam-extend: Open Source CFD
4    \\    /   O peration     | Version:     3.2
5     \\  /    A nd           | Web:         http://www.foam-extend.org
6      \\/     M anipulation  | For copyright notice see file Copyright
7 -------------------------------------------------------------------------------
8 License
9     This file is part of foam-extend.
11     foam-extend is free software: you can redistribute it and/or modify it
12     under the terms of the GNU General Public License as published by the
13     Free Software Foundation, either version 3 of the License, or (at your
14     option) any later version.
16     foam-extend is distributed in the hope that it will be useful, but
17     WITHOUT ANY WARRANTY; without even the implied warranty of
18     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19     General Public License for more details.
21     You should have received a copy of the GNU General Public License
22     along with foam-extend.  If not, see <http://www.gnu.org/licenses/>.
24 Class
25     Foam::DsmcCloud
27 Description
28     Templated base class for dsmc cloud
30 SourceFiles
31     DsmcCloudTemplateI.H
32     DsmcCloudTemplate.C
34 \*---------------------------------------------------------------------------*/
36 #ifndef DsmcCloudTemplate_H
37 #define DsmcCloudTemplate_H
39 #include "CloudTemplate.H"
40 #include "DsmcBaseCloud.H"
41 #include "IOdictionary.H"
42 #include "autoPtr.H"
43 #include "Random.H"
44 #include "fvMesh.H"
45 #include "volFields.H"
46 #include "scalarIOField.H"
48 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
50 namespace Foam
53 // Forward declaration of classes
55 template<class CloudType>
56 class BinaryCollisionModel;
58 template<class CloudType>
59 class WallInteractionModel;
61 template<class CloudType>
62 class InflowBoundaryModel;
64 /*---------------------------------------------------------------------------*\
65                          Class DsmcCloud Declaration
66 \*---------------------------------------------------------------------------*/
68 template<class ParcelType>
69 class DsmcCloud
71     public Cloud<ParcelType>,
72     public DsmcBaseCloud
74     // Private data
76         //- Cloud type - used to set the name of the parcel properties
77         //  dictionary by appending "Properties"
78         const word cloudName_;
80         //- References to the mesh and time databases
81         const fvMesh& mesh_;
83         //- Dictionary of particle properties
84         IOdictionary particleProperties_;
86         //- A list of unique instances of molecule types in the simulation.
87         // The position of an entry in the list maps to the label identifying
88         // the typeId, i.e. where typeIdList_ = (N2 O2 CO2)
89         // N2 has typeId label = 0, O2 = 1, CO2 = 2.
90         List<word> typeIdList_;
92         //- Number of real atoms/molecules represented by a parcel
93         scalar nParticle_;
95         //- A data structure holding which particles are in which cell
96         List<DynamicList<ParcelType*> > cellOccupancy_;
98         //- An IOField holding the value of (sigmaT * cR)max for each cell (see
99         // Bird p220). Initialised with the parcels, updated as required, and
100         // read in on start/restart.
101         volScalarField sigmaTcRMax_;
103         //- A field holding the remainder from the previous collision selections
104         scalarField collisionSelectionRemainder_;
106         //- Heat flux at surface field
107         volScalarField q_;
109         //- Force density at surface field
110         volVectorField fD_;
112         //- number density field
113         volScalarField rhoN_;
115         //- Mass density field
116         volScalarField rhoM_;
118         //- dsmc particle density field
119         volScalarField dsmcRhoN_;
121         //- linear kinetic energy density field
122         volScalarField linearKE_;
124         //- Internal energy density field
125         volScalarField internalE_;
127         // Internal degree of freedom density field
128         volScalarField iDof_;
130         //- Momentum density field
131         volVectorField momentum_;
133         //- Parcel constant properties - one for each type
134         List<typename ParcelType::constantProperties> constProps_;
136         //- Random number generator
137         Random rndGen_;
140         // boundary value fields
142             //- boundary temperature
143             volScalarField boundaryT_;
145             //- boundary velocity
146             volVectorField boundaryU_;
149         // References to the cloud sub-models
151             //- Binary collision model
152             autoPtr<BinaryCollisionModel<DsmcCloud<ParcelType> > >
153                 binaryCollisionModel_;
155             //- Wall interaction model
156             autoPtr<WallInteractionModel<DsmcCloud<ParcelType> > >
157                 wallInteractionModel_;
159             //- Inflow boundary model
160             autoPtr<InflowBoundaryModel<DsmcCloud<ParcelType> > >
161                 inflowBoundaryModel_;
164     // Private Member Functions
166         //- Build the constant properties for all of the species
167         void buildConstProps();
169         //- Record which particles are in which cell
170         void buildCellOccupancy();
172         //- Initialise the system
173         void initialise(const IOdictionary& dsmcInitialiseDict);
175         //- Calculate collisions between molecules
176         void collisions();
178         //- Reset the data accumulation field values to zero
179         void resetFields();
181         //- Calculate the volume field data
182         void calculateFields();
184         //- Disallow default bitwise copy construct
185         DsmcCloud(const DsmcCloud&);
187         //- Disallow default bitwise assignment
188         void operator=(const DsmcCloud&);
191 public:
193     // Static data members
195         //- Boltzmann constant
196         static scalar kb;
199     // Constructors
201         //- Construct given name and mesh, will read Parcels and fields from
202         //  file
203         DsmcCloud
204         (
205             const word& cloudName,
206             const fvMesh& mesh,
207             bool readFields = true
208         );
210         //- Construct given name, mesh and initialisation dictionary.
211         DsmcCloud
212         (
213             const word& cloudName,
214             const fvMesh& mesh,
215             const IOdictionary& dsmcInitialiseDict
216         );
219     //- Destructor
220     virtual ~DsmcCloud();
223     // Member Functions
225         // Access
227             // References to the mesh and databases
229                 //- Return the cloud type
230                 inline const word& cloudName() const;
232                 //- Return refernce to the mesh
233                 inline const fvMesh& mesh() const;
236             // References to the dsmc specific data
238                 //- Return particle properties dictionary
239                 inline const IOdictionary& particleProperties() const;
241                 //- Return the idList
242                 inline const List<word>& typeIdList() const;
244                 //- Return the number of real particles represented by one
245                 //  parcel
246                 inline scalar nParticle() const;
248                 //- Return the cell occupancy addressing
249                 inline const List<DynamicList<ParcelType*> >&
250                     cellOccupancy() const;
252                 //- Return the sigmaTcRMax field.  non-const access to allow
253                 // updating.
254                 inline volScalarField& sigmaTcRMax();
256                 //- Return the collision selection remainder field.  non-const
257                 // access to allow updating.
258                 inline scalarField& collisionSelectionRemainder();
260                 //- Return all of the constant properties
261                 inline const List<typename ParcelType::constantProperties>&
262                     constProps() const;
264                 //- Return the constant properties of the given typeId
265                 inline const typename ParcelType::constantProperties&
266                     constProps(label typeId) const;
268                 //- Return refernce to the random object
269                 inline Random& rndGen();
272             // References to the boundary fields for surface data collection
274                 //- Return non-const heat flux boundary field reference
275                 inline volScalarField::GeometricBoundaryField& qBF();
277                 //- Return non-const force density at boundary field reference
278                 inline volVectorField::GeometricBoundaryField& fDBF();
280                 //- Return non-const number density boundary field reference
281                 inline volScalarField::GeometricBoundaryField& rhoNBF();
283                 //- Return non-const mass density boundary field reference
284                 inline volScalarField::GeometricBoundaryField& rhoMBF();
286                 //- Return non-const linear kinetic energy density boundary
287                 //  field reference
288                 inline volScalarField::GeometricBoundaryField& linearKEBF();
290                 //- Return non-const internal energy density boundary field
291                 // reference
292                 inline volScalarField::GeometricBoundaryField& internalEBF();
294                 //- Return non-const internal degree of freedom density boundary
295                 //  field reference
296                 inline volScalarField::GeometricBoundaryField& iDofBF();
298                 //- Return non-const momentum density boundary field reference
299                 inline volVectorField::GeometricBoundaryField& momentumBF();
302             // References to the macroscopic fields
304                 //- Return macroscopic temperature
305                 inline const volScalarField& boundaryT() const;
307                 //- Return macroscopic velocity
308                 inline const volVectorField& boundaryU() const;
310                 //- Return heat flux at surface field
311                 inline const volScalarField& q() const;
313                 //- Return force density at surface field
314                 inline const volVectorField& fD() const;
316                 //- Return the real particle number density field
317                 inline const volScalarField& rhoN() const;
319                 //- Return the particle mass density field
320                 inline const volScalarField& rhoM() const;
322                 //- Return the field of number of DSMC particles
323                 inline const volScalarField& dsmcRhoN() const;
325                 //- Return the total linear kinetic energy (translational and
326                 // thermal density field
327                 inline const volScalarField& linearKE() const;
329                 //- Return the internal energy density field
330                 inline const volScalarField& internalE() const;
332                 //- Return the average internal degrees of freedom  field
333                 inline const volScalarField& iDof() const;
335                 //- Return the momentum density field
336                 inline const volVectorField& momentum() const;
339             // Kinetic theory helper functions
341                 //- Generate a random velocity sampled from the Maxwellian speed
342                 // distribution
343                 vector equipartitionLinearVelocity
344                 (
345                     scalar temperature,
346                     scalar mass
347                 );
349                 //- Generate a random internal energy, sampled from the
350                 // equilibrium distribution (Bird eqn 11.22 and 11.23 and
351                 // adapting code from DSMC3.FOR)
352                 scalar equipartitionInternalEnergy
353                 (
354                     scalar temperature,
355                     scalar internalDegreesOfFreedom
356                 );
359                 // From the Maxwellian distribution:
360                 //- Average particle speed
361                 inline scalar maxwellianAverageSpeed
362                 (
363                     scalar temperature,
364                     scalar mass
365                 ) const;
367                 inline scalarField maxwellianAverageSpeed
368                 (
369                     scalarField temperature,
370                     scalar mass
371                 ) const;
373                 //- RMS particle speed
374                 inline scalar maxwellianRMSSpeed
375                 (
376                     scalar temperature,
377                     scalar mass
378                 ) const;
380                 inline scalarField maxwellianRMSSpeed
381                 (
382                     scalarField temperature,
383                     scalar mass
384                 ) const;
386                 //- Most probable speed
387                 inline scalar maxwellianMostProbableSpeed
388                 (
389                     scalar temperature,
390                     scalar mass
391                 ) const;
393                 inline scalarField maxwellianMostProbableSpeed
394                 (
395                     scalarField temperature,
396                     scalar mass
397                 ) const;
400             // Sub-models
402                 //- Return reference to binary elastic collision model
403                 inline const BinaryCollisionModel<DsmcCloud<ParcelType> >&
404                     binaryCollision() const;
406                 //- Return non-const reference to binary elastic collision model
407                 inline BinaryCollisionModel<DsmcCloud<ParcelType> >&
408                     binaryCollision();
410                 //- Return reference to wall interaction model
411                 inline const WallInteractionModel<DsmcCloud<ParcelType> >&
412                     wallInteraction() const;
414                 //- Return non-const reference to wall interaction model
415                 inline WallInteractionModel<DsmcCloud<ParcelType> >&
416                     wallInteraction();
418                 //- Return reference to wall interaction model
419                 inline const InflowBoundaryModel<DsmcCloud<ParcelType> >&
420                     inflowBoundary() const;
422                 //- Return non-const reference to wall interaction model
423                 inline InflowBoundaryModel<DsmcCloud<ParcelType> >&
424                     inflowBoundary();
427         // Check
429             //- Total mass injected
430             inline scalar massInjected() const;
432             //- Total mass in system
433             inline scalar massInSystem() const;
435             //- Total linear momentum of the system
436             inline vector linearMomentumOfSystem() const;
438             //- Total linear kinetic energy in the system
439             inline scalar linearKineticEnergyOfSystem() const;
441             //- Total internal energy in the system
442             inline scalar internalEnergyOfSystem() const;
444             //- Print cloud information
445             void info() const;
447             //- Dump particle positions to .obj file
448             void dumpParticlePositions() const;
453         // Cloud evolution functions
455             //- Add new parcel
456             void addNewParcel
457             (
458                 const vector& position,
459                 const vector& U,
460                 const scalar Ei,
461                 const label cellId,
462                 const label typeId
463             );
465             //- Evolve the cloud (move, collide)
466             void evolve();
468             //- Clear the Cloud
469             inline void clear();
473 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
475 } // End namespace Foam
477 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
479 #include "DsmcCloudTemplateI.H"
481 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
483 #ifdef NoRepository
484 #   include "DsmcCloudTemplate.C"
485 #endif
487 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
489 #endif
491 // ************************************************************************* //