From b30c8999201ed51ed59bd9222617229bcec87d05 Mon Sep 17 00:00:00 2001 From: graham <g.macpherson@opencfd.co.uk> Date: Tue, 31 May 2011 16:15:53 +0100 Subject: [PATCH] ENH: Cohesion force based on energy density between particles. --- .../PairSpringSliderDashpot.C | 29 ++++++++++++++----- .../PairSpringSliderDashpot.H | 24 +++++++++++++++ .../constant/kinematicCloudProperties | 2 ++ .../constant/kinematicCloudProperties | 2 ++ 4 files changed, 50 insertions(+), 7 deletions(-) diff --git a/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/PairCollision/PairModel/PairSpringSliderDashpot/PairSpringSliderDashpot.C b/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/PairCollision/PairModel/PairSpringSliderDashpot/PairSpringSliderDashpot.C index 3096c829d0d..812296e6f5b 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/PairCollision/PairModel/PairSpringSliderDashpot/PairSpringSliderDashpot.C +++ b/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/PairCollision/PairModel/PairSpringSliderDashpot/PairSpringSliderDashpot.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2008-2010 OpenCFD Ltd. + \\ / A nd | Copyright (C) 2008-2011 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -92,12 +92,14 @@ Foam::PairSpringSliderDashpot<CloudType>::PairSpringSliderDashpot alpha_(readScalar(this->coeffDict().lookup("alpha"))), b_(readScalar(this->coeffDict().lookup("b"))), mu_(readScalar(this->coeffDict().lookup("mu"))), + cohesionEnergyDensity_ + ( + readScalar(this->coeffDict().lookup("cohesionEnergyDensity")) + ), + cohesion_(false), collisionResolutionSteps_ ( - readScalar - ( - this->coeffDict().lookup("collisionResolutionSteps") - ) + readScalar(this->coeffDict().lookup("collisionResolutionSteps")) ), volumeFactor_(1.0), useEquivalentSize_(Switch(this->coeffDict().lookup("useEquivalentSize"))) @@ -116,6 +118,8 @@ Foam::PairSpringSliderDashpot<CloudType>::PairSpringSliderDashpot scalar G = E/(2.0*(1.0 + nu)); Gstar_ = G/(2.0*(2.0 - nu)); + + cohesion_ = (mag(cohesionEnergyDensity_) > VSMALL); } @@ -183,13 +187,15 @@ void Foam::PairSpringSliderDashpot<CloudType>::evaluatePair dBEff *= cbrt(pB.nParticle()*volumeFactor_); } - scalar normalOverlapMag = 0.5*(dAEff + dBEff) - mag(r_AB); + scalar r_AB_mag = mag(r_AB); + + scalar normalOverlapMag = 0.5*(dAEff + dBEff) - r_AB_mag; if (normalOverlapMag > 0) { //Particles in collision - vector rHat_AB = r_AB/(mag(r_AB) + VSMALL); + vector rHat_AB = r_AB/(r_AB_mag + VSMALL); vector U_AB = pA.U() - pB.U(); @@ -208,6 +214,15 @@ void Foam::PairSpringSliderDashpot<CloudType>::evaluatePair rHat_AB *(kN*pow(normalOverlapMag, b_) - etaN*(U_AB & rHat_AB)); + // Cohesion force + if (cohesion_) + { + fN_AB += + -cohesionEnergyDensity_ + *overlapArea(dAEff/2.0, dBEff/2.0, r_AB_mag) + *rHat_AB; + } + pA.f() += fN_AB; pB.f() += -fN_AB; diff --git a/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/PairCollision/PairModel/PairSpringSliderDashpot/PairSpringSliderDashpot.H b/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/PairCollision/PairModel/PairSpringSliderDashpot/PairSpringSliderDashpot.H index d2c9071ae38..e53f80babfc 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/PairCollision/PairModel/PairSpringSliderDashpot/PairSpringSliderDashpot.H +++ b/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/PairCollision/PairModel/PairSpringSliderDashpot/PairSpringSliderDashpot.H @@ -34,6 +34,7 @@ Description #include "PairModel.H" #include "CollisionRecordList.H" +#include "mathematicalConstants.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -67,6 +68,12 @@ class PairSpringSliderDashpot //- Coefficient of friction in for tangential sliding scalar mu_; + //- Cohesion energy density [J/m^3] + scalar cohesionEnergyDensity_; + + // Switch cohesion on and off + bool cohesion_; + //- The number of steps over which to resolve the minimum // harmonic approximation of the collision period scalar collisionResolutionSteps_; @@ -129,6 +136,23 @@ public: return volumeFactor_; } + // Return the area of overlap between two spheres of radii rA and rB, + // centres separated by a distance rAB. Assumes rAB < (rA + rB). + inline scalar overlapArea(scalar rA, scalar rB, scalar rAB) const + { + // From: + // http://mathworld.wolfram.com/Sphere-SphereIntersection.html + return + mathematical::pi/4.0 + /sqr(rAB) + *( + (-rAB + rA - rB) + *(-rAB - rA + rB) + *(-rAB + rA + rB) + *( rAB + rA + rA) + ); + } + //- Whether the PairModel has a timestep limit that will // require subCycling virtual bool controlsTimestep() const; diff --git a/tutorials/lagrangian/icoUncoupledKinematicParcelFoam/hopper/hopperEmptying/constant/kinematicCloudProperties b/tutorials/lagrangian/icoUncoupledKinematicParcelFoam/hopper/hopperEmptying/constant/kinematicCloudProperties index 253b3324601..7422e40c440 100644 --- a/tutorials/lagrangian/icoUncoupledKinematicParcelFoam/hopper/hopperEmptying/constant/kinematicCloudProperties +++ b/tutorials/lagrangian/icoUncoupledKinematicParcelFoam/hopper/hopperEmptying/constant/kinematicCloudProperties @@ -82,6 +82,7 @@ subModels pairCollisionCoeffs { + // Maximum possible particle diameter expected at any time maxInteractionDistance 0.006; writeReferredParticleCloud no; @@ -94,6 +95,7 @@ subModels alpha 0.12; b 1.5; mu 0.52; + cohesionEnergyDensity 0; collisionResolutionSteps 12; }; diff --git a/tutorials/lagrangian/icoUncoupledKinematicParcelFoam/hopper/hopperInitialState/constant/kinematicCloudProperties b/tutorials/lagrangian/icoUncoupledKinematicParcelFoam/hopper/hopperInitialState/constant/kinematicCloudProperties index 93315fbd630..36448f7b307 100644 --- a/tutorials/lagrangian/icoUncoupledKinematicParcelFoam/hopper/hopperInitialState/constant/kinematicCloudProperties +++ b/tutorials/lagrangian/icoUncoupledKinematicParcelFoam/hopper/hopperInitialState/constant/kinematicCloudProperties @@ -91,6 +91,7 @@ subModels pairCollisionCoeffs { + // Maximum possible particle diameter expected at any time maxInteractionDistance 0.006; writeReferredParticleCloud no; @@ -103,6 +104,7 @@ subModels alpha 0.12; b 1.5; mu 0.52; + cohesionEnergyDensity 0; collisionResolutionSteps 12; }; -- GitLab