/*---------------------------------------------------------------------------*\ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | www.openfoam.com \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2011-2016 OpenFOAM Foundation Copyright (C) 2019 OpenCFD Ltd. ------------------------------------------------------------------------------- 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::PairSpringSliderDashpot Description Pair forces between particles colliding with a spring, slider, damper model Reference: \verbatim "Lagrangian numerical simulation of plug flow of cohesionless particles in a horizontal pipe" Tsuji, Y., Tanaka, T., Ishida, T., Powder Technology Volume 73, Issue 3, September 1992, pp. 239-250 \endverbatim \*---------------------------------------------------------------------------*/ #ifndef PairSpringSliderDashpot_H #define PairSpringSliderDashpot_H #include "PairModel.H" #include "CollisionRecordList.H" #include "mathematicalConstants.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // namespace Foam { /*---------------------------------------------------------------------------*\ Class PairSpringSliderDashpot Declaration \*---------------------------------------------------------------------------*/ template class PairSpringSliderDashpot : public PairModel { // Private data //- Effective Young's modulus value, assuming both particles have // the same E value scalar Estar_; //- Effective shear modulus value, assuming both particles have // the same Poisson's ratio and Young's modulus scalar Gstar_; //- alpha-coefficient, related to coefficient of restitution scalar alpha_; //- Spring power (b = 1 for linear, b = 3/2 for Hertzian) scalar b_; //- 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_; //- Volume factor for determining the equivalent size of a // parcel where nParticles is not 1. The equivalent size of // the parcel is // parcelEquivVolume = volumeFactor*nParticles*p.volume() // so // parcelEquivD = cbrt(volumeFactor*nParticles)*p.d() // + When volumeFactor = 1, the particles are compressed // together so that the equivalent volume of the parcel is // the sum of the constituent particles // + When volumeFactor = 3*sqrt(2)/pi, the particles are // close packed, but uncompressed. // + When volumeFactor > 3*sqrt(2)/pi, the particles loosely // grouped. // 3*sqrt(2)/pi = 1.350474 is the volume factor for close // packing, i.e pi/(3*sqrt(2)) is the maximum close packing // factor scalar volumeFactor_; //- Switch to control use of equivalent size particles. Used // because the calculation can be very expensive. bool useEquivalentSize_; // Private Member Functions //- Find the appropriate properties for determining the minimum // allowable timestep void findMinMaxProperties ( scalar& RMin, scalar& rhoMax, scalar& vMagMax ) const; public: //- Runtime type information TypeName("pairSpringSliderDashpot"); // Constructors //- Construct from dictionary PairSpringSliderDashpot(const dictionary& dict, CloudType& cloud); //- Destructor virtual ~PairSpringSliderDashpot() = default; // Member Functions //- Return the volumeFactor inline scalar volumeFactor() const { 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 { // Reference: // 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 + rB) ); } //- Whether the PairModel has a timestep limit that will // require subCycling virtual bool controlsTimestep() const; //- For PairModels that control the timestep, calculate the // number of subCycles needed to satisfy the minimum // allowable timestep virtual label nSubCycles() const; //- Calculate the pair interaction between parcels virtual void evaluatePair ( typename CloudType::parcelType& pA, typename CloudType::parcelType& pB ) const; }; // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // } // End namespace Foam // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // #ifdef NoRepository #include "PairSpringSliderDashpot.C" #endif // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // #endif // ************************************************************************* //