From bcdc6291ca12ca11dc62e4f8db411bee9eac8a23 Mon Sep 17 00:00:00 2001 From: graham Date: Tue, 25 May 2010 11:53:52 +0100 Subject: [PATCH] ENH. Making equivalent size collisions switchable. --- .../PairSpringSliderDashpot.C | 26 ++++++++++++++--- .../PairSpringSliderDashpot.H | 4 +++ .../WallSpringSliderDashpot.C | 28 +++++++++++++++---- .../WallSpringSliderDashpot.H | 4 +++ 4 files changed, 53 insertions(+), 9 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 7216ad0914..ad3f95ad49 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 @@ -46,7 +46,11 @@ void Foam::PairSpringSliderDashpot::findMinMaxProperties // Finding minimum diameter to avoid excessive arithmetic scalar dEff = p.d(); - // scalar dEff = p.d()*cbrt(p.nParticle()*volumeFactor_); + + if (useEquivalentSize_) + { + dEff *= cbrt(p.nParticle()*volumeFactor_); + } RMin = min(dEff, RMin); @@ -95,8 +99,14 @@ Foam::PairSpringSliderDashpot::PairSpringSliderDashpot this->coeffDict().lookup("collisionResolutionSteps") ) ), - volumeFactor_(this->dict().lookupOrDefault("volumeFactor", 1.0)) + volumeFactor_(1.0), + useEquivalentSize_(Switch(this->dict().lookup("useEquivalentSize"))) { + if (useEquivalentSize_) + { + volumeFactor_ = readScalar(this->dict().lookup("volumeFactor")); + } + scalar nu = this->owner().constProps().poissonsRatio(); scalar E = this->owner().constProps().youngsModulus(); @@ -159,12 +169,20 @@ void Foam::PairSpringSliderDashpot::evaluatePair { vector r_AB = (pA.position() - pB.position()); - //scalar dAEff = pA.d()*cbrt(pA.nParticle()*volumeFactor_); scalar dAEff = pA.d(); - // scalar dBEff = pB.d()*cbrt(pB.nParticle()*volumeFactor_); + if (useEquivalentSize_) + { + dAEff *= cbrt(pA.nParticle()*volumeFactor_); + } + scalar dBEff = pB.d(); + if (useEquivalentSize_) + { + dBEff *= cbrt(pB.nParticle()*volumeFactor_); + } + scalar normalOverlapMag = 0.5*(dAEff + dBEff) - mag(r_AB); if (normalOverlapMag > 0) 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 58cd385012..a8982b57eb 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 @@ -92,6 +92,10 @@ class PairSpringSliderDashpot // factor scalar volumeFactor_; + //- Switch to control use of equivalent size particles. Used + // because cbrt calculation is very expensive. + bool useEquivalentSize_; + // Private Member Functions diff --git a/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/PairCollision/WallModel/WallSpringSliderDashpot/WallSpringSliderDashpot.C b/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/PairCollision/WallModel/WallSpringSliderDashpot/WallSpringSliderDashpot.C index b2e05f1ab5..b4b8262cbf 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/PairCollision/WallModel/WallSpringSliderDashpot/WallSpringSliderDashpot.C +++ b/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/PairCollision/WallModel/WallSpringSliderDashpot/WallSpringSliderDashpot.C @@ -46,7 +46,11 @@ void Foam::WallSpringSliderDashpot::findMinMaxProperties // Finding minimum diameter to avoid excessive arithmetic scalar dEff = p.d(); - // scalar dEff = p.d()*cbrt(p.nParticle()*volumeFactor_); + + if (useEquivalentSize_) + { + dEff *= cbrt(p.nParticle()*volumeFactor_); + } rMin = min(dEff, rMin); @@ -65,6 +69,7 @@ void Foam::WallSpringSliderDashpot::findMinMaxProperties rMin /= 2.0; } + template void Foam::WallSpringSliderDashpot::evaluateWall ( @@ -163,8 +168,14 @@ Foam::WallSpringSliderDashpot::WallSpringSliderDashpot this->coeffDict().lookup("collisionResolutionSteps") ) ), - volumeFactor_(this->dict().lookupOrDefault("volumeFactor", 1.0)) -{} + volumeFactor_(1.0), + useEquivalentSize_(Switch(this->dict().lookup("useEquivalentSize"))) +{ + if (useEquivalentSize_) + { + volumeFactor_ = readScalar(this->dict().lookup("volumeFactor")); + } +} // * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // @@ -182,10 +193,17 @@ Foam::scalar Foam::WallSpringSliderDashpot::pREff const typename CloudType::parcelType& p ) const { - // return p.d()/2*cbrt(p.nParticle()*volumeFactor_); - return p.d()/2; + if (useEquivalentSize_) + { + return p.d()/2*cbrt(p.nParticle()*volumeFactor_); + } + else + { + return p.d()/2; + } } + template bool Foam::WallSpringSliderDashpot::controlsTimestep() const { diff --git a/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/PairCollision/WallModel/WallSpringSliderDashpot/WallSpringSliderDashpot.H b/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/PairCollision/WallModel/WallSpringSliderDashpot/WallSpringSliderDashpot.H index 2aefa7d7e7..2c0d7461d9 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/PairCollision/WallModel/WallSpringSliderDashpot/WallSpringSliderDashpot.H +++ b/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/PairCollision/WallModel/WallSpringSliderDashpot/WallSpringSliderDashpot.H @@ -87,6 +87,10 @@ class WallSpringSliderDashpot // factor scalar volumeFactor_; + //- Switch to control use of equivalent size particles. Used + // because the calculation can be very expensive. + bool useEquivalentSize_; + // Private Member Functions