From 9ac189015b5dd0a05dc57448a40753c53fad9175 Mon Sep 17 00:00:00 2001 From: andy <andy> Date: Mon, 19 Aug 2013 17:55:19 +0100 Subject: [PATCH] ENH: updated cloud function objects - particleCollector --- .../CollidingParcel/CollidingParcel.C | 11 ++- .../KinematicParcel/KinematicParcel.C | 4 +- .../CloudFunctionObject/CloudFunctionObject.C | 3 +- .../CloudFunctionObject/CloudFunctionObject.H | 3 +- .../CloudFunctionObjectList.C | 5 +- .../CloudFunctionObjectList.H | 3 +- .../ParticleCollector/ParticleCollector.C | 76 ++++++++++++------- .../ParticleCollector/ParticleCollector.H | 13 ++-- 8 files changed, 75 insertions(+), 43 deletions(-) diff --git a/src/lagrangian/intermediate/parcels/Templates/CollidingParcel/CollidingParcel.C b/src/lagrangian/intermediate/parcels/Templates/CollidingParcel/CollidingParcel.C index 2e544b69063..f04ac77a15b 100644 --- a/src/lagrangian/intermediate/parcels/Templates/CollidingParcel/CollidingParcel.C +++ b/src/lagrangian/intermediate/parcels/Templates/CollidingParcel/CollidingParcel.C @@ -100,6 +100,8 @@ bool Foam::CollidingParcel<ParcelType>::move // Apply correction to position for reduced-D cases meshTools::constrainToMeshCentre(mesh, p.position()); + const point start(p.position()); + // Set the Lagrangian time-step scalar dt = min(dtMax, tEnd); @@ -145,7 +147,14 @@ bool Foam::CollidingParcel<ParcelType>::move p.age() += dt; - td.cloud().functions().postMove(p, cellI, dt, td.keepParticle); + td.cloud().functions().postMove + ( + p, + cellI, + dt, + start, + td.keepParticle + ); } break; diff --git a/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.C b/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.C index f866f69d850..8cf9317c866 100644 --- a/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.C +++ b/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.C @@ -276,6 +276,8 @@ bool Foam::KinematicParcel<ParcelType>::move // Apply correction to position for reduced-D cases meshTools::constrainToMeshCentre(mesh, p.position()); + const point start(p.position()); + // Set the Lagrangian time-step scalar dt = min(dtMax, tEnd); @@ -320,7 +322,7 @@ bool Foam::KinematicParcel<ParcelType>::move p.age() += dt; - td.cloud().functions().postMove(p, cellI, dt, td.keepParticle); + td.cloud().functions().postMove(p, cellI, dt, start, td.keepParticle); } return td.keepParticle; diff --git a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/CloudFunctionObject/CloudFunctionObject.C b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/CloudFunctionObject/CloudFunctionObject.C index 5a208a4ca86..4935aa7b3d2 100644 --- a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/CloudFunctionObject/CloudFunctionObject.C +++ b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/CloudFunctionObject/CloudFunctionObject.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2012 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -97,6 +97,7 @@ void Foam::CloudFunctionObject<CloudType>::postMove const typename CloudType::parcelType&, const label, const scalar, + const point&, bool& ) { diff --git a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/CloudFunctionObject/CloudFunctionObject.H b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/CloudFunctionObject/CloudFunctionObject.H index 976fd3867ff..a9b2be35228 100644 --- a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/CloudFunctionObject/CloudFunctionObject.H +++ b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/CloudFunctionObject/CloudFunctionObject.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2012 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -138,6 +138,7 @@ public: const typename CloudType::parcelType& p, const label cellI, const scalar dt, + const point& position0, bool& keepParticle ); diff --git a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/CloudFunctionObjectList/CloudFunctionObjectList.C b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/CloudFunctionObjectList/CloudFunctionObjectList.C index e0d57b60570..3308cf6228c 100644 --- a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/CloudFunctionObjectList/CloudFunctionObjectList.C +++ b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/CloudFunctionObjectList/CloudFunctionObjectList.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2012 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -133,12 +133,13 @@ void Foam::CloudFunctionObjectList<CloudType>::postMove const typename CloudType::parcelType& p, const label cellI, const scalar dt, + const point& position0, bool& keepParticle ) { forAll(*this, i) { - this->operator[](i).postMove(p, cellI, dt, keepParticle); + this->operator[](i).postMove(p, cellI, dt, position0, keepParticle); if (!keepParticle) { diff --git a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/CloudFunctionObjectList/CloudFunctionObjectList.H b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/CloudFunctionObjectList/CloudFunctionObjectList.H index de9c3afc025..477afe37a58 100644 --- a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/CloudFunctionObjectList/CloudFunctionObjectList.H +++ b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/CloudFunctionObjectList/CloudFunctionObjectList.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2012 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -115,6 +115,7 @@ public: const typename CloudType::parcelType& p, const label cellI, const scalar dt, + const point& position0, bool& keepParticle ); diff --git a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleCollector/ParticleCollector.C b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleCollector/ParticleCollector.C index 128750c3a6b..68d19890dd7 100644 --- a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleCollector/ParticleCollector.C +++ b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleCollector/ParticleCollector.C @@ -64,13 +64,29 @@ void Foam::ParticleCollector<CloudType>::makeLogFile outputFilePtr_() << "# Source : " << type() << nl - << "# Total area : " << sum(area) << nl - << "# Time"; + << "# Total area : " << sum(area) << nl; + outputFilePtr_() << "# Geometry :" << nl; forAll(faces, i) { word id = Foam::name(i); + outputFilePtr_() + << '#' << tab << "point[" << id << "] = " + << faces[i].centre(points) << nl; + } + + outputFilePtr_()<< '#' << nl << "# Time"; + + forAll(faces, i) + { + word id = Foam::name(i); + + if (i != 0) + { + outputFilePtr_() << "#"; + } + outputFilePtr_() << tab << "area[" << id << "]" << tab << "mass[" << id << "]" @@ -265,13 +281,10 @@ void Foam::ParticleCollector<CloudType>::initConcentricCircles() template<class CloudType> Foam::label Foam::ParticleCollector<CloudType>::collectParcelPolygon ( - const point& position, - const vector& U, - const scalar dt + const point& p1, + const point& p2 ) const { - point end(position + dt*U); - label dummyNearType = -1; label dummyNearLabel = -1; @@ -279,10 +292,10 @@ Foam::label Foam::ParticleCollector<CloudType>::collectParcelPolygon { const label facePoint0 = faces_[faceI][0]; - const point p0 = points_[facePoint0]; + const point& pf = points_[facePoint0]; - const scalar d1 = normal_ & (position - p0); - const scalar d2 = normal_ & (end - p0); + const scalar d1 = normal_ & (p1 - pf); + const scalar d2 = normal_ & (p2 - pf); if (sign(d1) == sign(d2)) { @@ -291,7 +304,7 @@ Foam::label Foam::ParticleCollector<CloudType>::collectParcelPolygon } // intersection point - point pIntersect = position + (d1/(d1 - d2))*dt*U; + const point pIntersect = p1 + (d1/(d1 - d2))*(p2 - p1); const List<face>& tris = faceTris_[faceI]; @@ -320,17 +333,14 @@ Foam::label Foam::ParticleCollector<CloudType>::collectParcelPolygon template<class CloudType> Foam::label Foam::ParticleCollector<CloudType>::collectParcelConcentricCircles ( - const point& position, - const vector& U, - const scalar dt + const point& p1, + const point& p2 ) const { label secI = -1; - point end(position + dt*U); - - const scalar d1 = normal_ & (position - coordSys_.origin()); - const scalar d2 = normal_ & (end - coordSys_.origin()); + const scalar d1 = normal_ & (p1 - coordSys_.origin()); + const scalar d2 = normal_ & (p2 - coordSys_.origin()); if (sign(d1) == sign(d2)) { @@ -339,7 +349,7 @@ Foam::label Foam::ParticleCollector<CloudType>::collectParcelConcentricCircles } // intersection point in cylindrical co-ordinate system - point pCyl = coordSys_.localPosition(position + (d1/(d1 - d2))*dt*U); + const point pCyl = coordSys_.localPosition(p1 + (d1/(d1 - d2))*(p2 - p1)); scalar r = pCyl[0]; @@ -408,6 +418,9 @@ void Foam::ParticleCollector<CloudType>::write() Field<scalar> faceMassFlowRate(massFlowRate_.size(), 0.0); this->getModelProperty("massFlowRate", faceMassFlowRate); + + scalar sumTotalMass = 0.0; + scalar sumAverageMFR = 0.0; forAll(faces_, faceI) { scalarList allProcMass(Pstream::nProcs()); @@ -420,10 +433,8 @@ void Foam::ParticleCollector<CloudType>::write() Pstream::gatherList(allProcMassFlowRate); faceMassFlowRate[faceI] += sum(allProcMassFlowRate); - Info<< " face " << faceI - << ": total mass = " << faceMassTotal[faceI] - << "; average mass flow rate = " << faceMassFlowRate[faceI] - << nl; + sumTotalMass += faceMassTotal[faceI]; + sumAverageMFR += faceMassFlowRate[faceI]; if (outputFilePtr_.valid()) { @@ -435,7 +446,9 @@ void Foam::ParticleCollector<CloudType>::write() } } - Info<< endl; + Info<< " sum(total mass) = " << sumTotalMass << nl + << " sum(average mass flow rate) = " << sumAverageMFR << nl + << endl; if (surfaceFormat_ != "none") @@ -554,16 +567,17 @@ Foam::ParticleCollector<CloudType>::ParticleCollector } else { - FatalErrorIn + FatalIOErrorIn ( "Foam::ParticleCollector<CloudType>::ParticleCollector" "(" "const dictionary&," "CloudType&" - ")" + ")", + this->coeffDict() ) << "Unknown mode " << mode << ". Available options are " - << "polygon and concentricCircle" << exit(FatalError); + << "polygon and concentricCircle" << exit(FatalIOError); } mass_.setSize(faces_.size(), 0.0); @@ -620,6 +634,7 @@ void Foam::ParticleCollector<CloudType>::postMove const parcelType& p, const label cellI, const scalar dt, + const point& position0, bool& keepParticle ) { @@ -630,16 +645,19 @@ void Foam::ParticleCollector<CloudType>::postMove label faceI = -1; + // slightly extend end position to avoid falling within tracking tolerances + const point position1 = position0 + 1.0001*(p.position() - position0); + switch (mode_) { case mtPolygon: { - faceI = collectParcelPolygon(p.position(), p.U(), dt); + faceI = collectParcelPolygon(position0, position1); break; } case mtConcentricCircle: { - faceI = collectParcelConcentricCircles(p.position(), p.U(), dt); + faceI = collectParcelConcentricCircles(position0, position1); break; } default: diff --git a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleCollector/ParticleCollector.H b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleCollector/ParticleCollector.H index 71e65fe6c70..001973fd0fd 100644 --- a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleCollector/ParticleCollector.H +++ b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleCollector/ParticleCollector.H @@ -50,7 +50,7 @@ namespace Foam { /*---------------------------------------------------------------------------*\ - Class ParticleCollector Declaration + Class ParticleCollector Declaration \*---------------------------------------------------------------------------*/ template<class CloudType> @@ -169,17 +169,15 @@ private: //- Collect parcels in polygon collectors label collectParcelPolygon ( - const point& position, - const vector& U, - const scalar dt + const point& p1, + const point& p2 ) const; //- Collect parcels in concentric circle collectors label collectParcelConcentricCircles ( - const point& position, - const vector& U, - const scalar dt + const point& p1, + const point& p2 ) const; @@ -235,6 +233,7 @@ public: const parcelType& p, const label cellI, const scalar dt, + const point& position0, bool& keepParticle ); }; -- GitLab