diff --git a/src/lagrangian/intermediate/parcels/include/makeParcelCloudFunctionObjects.H b/src/lagrangian/intermediate/parcels/include/makeParcelCloudFunctionObjects.H
index e56970999c..69618baabf 100644
--- a/src/lagrangian/intermediate/parcels/include/makeParcelCloudFunctionObjects.H
+++ b/src/lagrangian/intermediate/parcels/include/makeParcelCloudFunctionObjects.H
@@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
- \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
+ \\ / A nd | Copyright (C) 2011-2018 OpenFOAM Foundation
\\/ M anipulation |
-------------------------------------------------------------------------------
License
@@ -34,6 +34,7 @@ License
#include "ParticleErosion.H"
#include "ParticleTracks.H"
#include "ParticleTrap.H"
+#include "PatchCollisionDensity.H"
#include "PatchPostProcessing.H"
#include "VoidFraction.H"
@@ -48,6 +49,7 @@ License
makeCloudFunctionObjectType(ParticleErosion, CloudType); \
makeCloudFunctionObjectType(ParticleTracks, CloudType); \
makeCloudFunctionObjectType(ParticleTrap, CloudType); \
+ makeCloudFunctionObjectType(PatchCollisionDensity, CloudType); \
makeCloudFunctionObjectType(PatchPostProcessing, CloudType); \
makeCloudFunctionObjectType(VoidFraction, CloudType);
diff --git a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/PatchCollisionDensity/PatchCollisionDensity.C b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/PatchCollisionDensity/PatchCollisionDensity.C
new file mode 100644
index 0000000000..111ffcbedf
--- /dev/null
+++ b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/PatchCollisionDensity/PatchCollisionDensity.C
@@ -0,0 +1,168 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | Copyright (C) 2018 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 .
+
+\*---------------------------------------------------------------------------*/
+
+#include "PatchCollisionDensity.H"
+#include "Pstream.H"
+#include "stringListOps.H"
+#include "ListOps.H"
+#include "ListListOps.H"
+
+// * * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * //
+
+template
+void Foam::PatchCollisionDensity::write()
+{
+ const scalarField z(this->owner().mesh().nCells(), 0);
+
+ volScalarField
+ (
+ IOobject
+ (
+ this->owner().name() + ":collisionDensity",
+ this->owner().mesh().time().timeName(),
+ this->owner().mesh()
+ ),
+ this->owner().mesh(),
+ dimless/dimArea,
+ z,
+ collisionDensity_
+ )
+ .write();
+
+ volScalarField
+ (
+ IOobject
+ (
+ this->owner().name() + ":collisionDensityRate",
+ this->owner().mesh().time().timeName(),
+ this->owner().mesh()
+ ),
+ this->owner().mesh(),
+ dimless/dimArea/dimTime,
+ z,
+ (collisionDensity_ - collisionDensity0_)
+ /(this->owner().mesh().time().value() - time0_)
+ )
+ .write();
+
+ collisionDensity0_ == collisionDensity_;
+ time0_ = this->owner().mesh().time().value();
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
+
+template
+Foam::PatchCollisionDensity::PatchCollisionDensity
+(
+ const dictionary& dict,
+ CloudType& owner,
+ const word& modelName
+)
+:
+ CloudFunctionObject(dict, owner, modelName, typeName),
+ minSpeed_(dict.lookupOrDefault("minSpeed", -1)),
+ collisionDensity_
+ (
+ this->owner().mesh().boundary(),
+ volScalarField::Internal::null(),
+ calculatedFvPatchField::typeName
+ ),
+ collisionDensity0_
+ (
+ this->owner().mesh().boundary(),
+ volScalarField::Internal::null(),
+ calculatedFvPatchField::typeName
+ ),
+ time0_(this->owner().mesh().time().value())
+{
+ collisionDensity_ == 0;
+ collisionDensity0_ == 0;
+
+ IOobject io
+ (
+ this->owner().name() + ":collisionDensity",
+ this->owner().mesh().time().timeName(),
+ this->owner().mesh(),
+ IOobject::MUST_READ,
+ IOobject::NO_WRITE
+ );
+
+ if (io.typeHeaderOk())
+ {
+ const volScalarField collisionDensity(io, this->owner().mesh());
+ collisionDensity_ == collisionDensity.boundaryField();
+ collisionDensity0_ == collisionDensity.boundaryField();
+ }
+}
+
+
+template
+Foam::PatchCollisionDensity::PatchCollisionDensity
+(
+ const PatchCollisionDensity& ppm
+)
+:
+ CloudFunctionObject(ppm),
+ minSpeed_(ppm.minSpeed_),
+ collisionDensity_(ppm.collisionDensity_),
+ collisionDensity0_(ppm.collisionDensity0_),
+ time0_(ppm.time0_)
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
+
+template
+Foam::PatchCollisionDensity::~PatchCollisionDensity()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
+
+template
+void Foam::PatchCollisionDensity::postPatch
+(
+ const parcelType& p,
+ const polyPatch& pp,
+ bool&
+)
+{
+ const label patchi = pp.index();
+ const label patchFacei = p.face() - pp.start();
+
+ vector nw, Up;
+ this->owner().patchData(p, pp, nw, Up);
+
+ const scalar speed = (p.U() - Up) & nw;
+ if (speed > minSpeed_)
+ {
+ collisionDensity_[patchi][patchFacei] +=
+ 1/this->owner().mesh().magSf().boundaryField()[patchi][patchFacei];
+ }
+}
+
+
+// ************************************************************************* //
diff --git a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/PatchCollisionDensity/PatchCollisionDensity.H b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/PatchCollisionDensity/PatchCollisionDensity.H
new file mode 100644
index 0000000000..8cb4d76bb4
--- /dev/null
+++ b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/PatchCollisionDensity/PatchCollisionDensity.H
@@ -0,0 +1,152 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | Copyright (C) 2018 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 .
+
+Class
+ Foam::PatchCollisionDensity
+
+Description
+ Function object which generates fields of the number and rate of collisions
+ per unit area on all patches. Can optionally take a minimum speed below
+ which a collision is not counted.
+
+ Example usage:
+ \verbatim
+ patchCollisionDensity1
+ {
+ type patchCollisionDensity;
+ minSpeed 1e-3;
+ }
+ \endverbatim
+
+SourceFiles
+ PatchCollisionDensity.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef PatchCollisionDensity_H
+#define PatchCollisionDensity_H
+
+#include "CloudFunctionObject.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+/*---------------------------------------------------------------------------*\
+ Class PatchCollisionDensity Declaration
+\*---------------------------------------------------------------------------*/
+
+template
+class PatchCollisionDensity
+:
+ public CloudFunctionObject
+{
+ // Private data
+
+ typedef typename CloudType::particleType parcelType;
+
+ //- The threshold for a collision
+ const scalar minSpeed_;
+
+ //- The field of the number of collisions per unit area
+ volScalarField::Boundary collisionDensity_;
+
+ //- The field of the number of collisions per unit area at the last
+ // output
+ volScalarField::Boundary collisionDensity0_;
+
+ //- The time at the last output
+ scalar time0_;
+
+
+protected:
+
+ // Protected Member Functions
+
+ //- Write post-processing info
+ void write();
+
+
+public:
+
+ //- Runtime type information
+ TypeName("patchCollisionDensity");
+
+
+ // Constructors
+
+ //- Construct from dictionary
+ PatchCollisionDensity
+ (
+ const dictionary& dict,
+ CloudType& owner,
+ const word& modelName
+ );
+
+ //- Construct copy
+ PatchCollisionDensity(const PatchCollisionDensity& ppm);
+
+ //- Construct and return a clone
+ virtual autoPtr> clone() const
+ {
+ return autoPtr>
+ (
+ new PatchCollisionDensity(*this)
+ );
+ }
+
+
+ //- Destructor
+ virtual ~PatchCollisionDensity();
+
+
+ // Member Functions
+
+ // Evaluation
+
+ //- Post-patch hook
+ virtual void postPatch
+ (
+ const parcelType& p,
+ const polyPatch& pp,
+ bool& keepParticle
+ );
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#ifdef NoRepository
+ #include "PatchCollisionDensity.C"
+#endif
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //