31 template<
class CloudType>
45 const typename CloudType::parcelType&
p = iter();
51 if (useEquivalentSize_)
53 dEff *=
cbrt(
p.nParticle()*volumeFactor_);
56 RMin =
min(dEff, RMin);
58 rhoMax =
max(
p.rho(), rhoMax);
83 template<
class CloudType>
93 alpha_(this->coeffDict().template lookup<scalar>(
"alpha")),
94 b_(this->coeffDict().template lookup<scalar>(
"b")),
95 mu_(this->coeffDict().template lookup<scalar>(
"mu")),
96 cohesionEnergyDensity_
98 this->coeffDict().template lookup<scalar>(
"cohesionEnergyDensity")
101 collisionResolutionSteps_
103 this->coeffDict().template lookup<scalar>(
"collisionResolutionSteps")
106 useEquivalentSize_(
Switch(this->coeffDict().lookup(
"useEquivalentSize")))
108 if (useEquivalentSize_)
111 this->
coeffDict().template lookup<scalar>(
"volumeFactor");
118 Estar_ = E/(2.0*(1.0 -
sqr(nu)));
120 scalar
G = E/(2.0*(1.0 + nu));
122 Gstar_ =
G/(2.0*(2.0 - nu));
124 cohesion_ = (
mag(cohesionEnergyDensity_) > vSmall);
130 template<
class CloudType>
137 template<
class CloudType>
144 template<
class CloudType>
147 if (!this->owner().size())
152 scalar RMin, rhoMax, UMagMax;
153 findMinMaxProperties(RMin, rhoMax, UMagMax);
156 const scalar minCollisionDeltaT =
159 *
pow(rhoMax/(Estar_*
sqrt(UMagMax) + small), 0.4)
160 /collisionResolutionSteps_;
162 return ceil(this->owner().time().deltaTValue()/minCollisionDeltaT);
166 template<
class CloudType>
173 const polyMesh& mesh = this->owner().mesh();
175 vector r_AB = pA.position(mesh) - pB.position(mesh);
177 scalar dAEff = pA.d();
179 if (useEquivalentSize_)
181 dAEff *=
cbrt(pA.nParticle()*volumeFactor_);
184 scalar dBEff = pB.d();
186 if (useEquivalentSize_)
188 dBEff *=
cbrt(pB.nParticle()*volumeFactor_);
191 scalar r_AB_mag =
mag(r_AB);
193 scalar normalOverlapMag = 0.5*(dAEff + dBEff) - r_AB_mag;
195 if (normalOverlapMag > 0)
199 vector rHat_AB = r_AB/(r_AB_mag + vSmall);
201 vector U_AB = pA.U() - pB.U();
204 scalar
R = 0.5*dAEff*dBEff/(dAEff + dBEff);
207 scalar
M = pA.mass()*pB.mass()/(pA.mass() + pB.mass());
209 scalar kN = (4.0/3.0)*
sqrt(
R)*Estar_;
211 scalar etaN = alpha_*
sqrt(
M*kN)*
pow025(normalOverlapMag);
216 *(kN*
pow(normalOverlapMag, b_) - etaN*(U_AB & rHat_AB));
223 -cohesionEnergyDensity_
224 *overlapArea(dAEff/2.0, dBEff/2.0, r_AB_mag)
232 U_AB - (U_AB & rHat_AB)*rHat_AB
233 - ((dAEff/2*pA.omega() + dBEff/2*pB.omega()) ^ rHat_AB);
237 vector& tangentialOverlap_AB =
238 pA.collisionRecords().matchPairRecord
244 vector& tangentialOverlap_BA =
245 pB.collisionRecords().matchPairRecord
251 vector deltaTangentialOverlap_AB = USlip_AB*deltaT;
253 tangentialOverlap_AB += deltaTangentialOverlap_AB;
254 tangentialOverlap_BA += -deltaTangentialOverlap_AB;
256 scalar tangentialOverlapMag =
mag(tangentialOverlap_AB);
258 if (tangentialOverlapMag > vSmall)
260 scalar kT = 8.0*
sqrt(
R*normalOverlapMag)*Gstar_;
267 if (kT*tangentialOverlapMag > mu_*
mag(fN_AB))
272 fT_AB = -mu_*
mag(fN_AB)*USlip_AB/
mag(USlip_AB);
274 tangentialOverlap_AB =
Zero;
275 tangentialOverlap_BA =
Zero;
279 fT_AB = - kT*tangentialOverlap_AB - etaT*USlip_AB;
285 pA.torque() += (dAEff/2*-rHat_AB) ^ fT_AB;
286 pB.torque() += (dBEff/2*rHat_AB) ^ -fT_AB;
#define forAllConstIter(Container, container, iter)
Iterate across all elements in the container object of type.
Templated base class for dsmc cloud.
const List< typename ParcelType::constantProperties > & constProps() const
Return all of the constant properties.
ParcelType parcelType
Type of parcel the cloud was instantiated for.
Templated pair interaction class.
const dictionary & coeffDict() const
Return the coefficients dictionary.
const CloudType & owner() const
Return the owner cloud object.
Pair forces between particles colliding with a spring, slider, damper model.
virtual label nSubCycles() const
For PairModels that control the timestep, calculate the.
virtual ~PairSpringSliderDashpot()
Destructor.
PairSpringSliderDashpot(const dictionary &dict, CloudType &cloud)
Construct from dictionary.
virtual void evaluatePair(typename CloudType::parcelType &pA, typename CloudType::parcelType &pB) const
Calculate the pair interaction between parcels.
virtual bool controlsTimestep() const
Whether the PairModel has a timestep limit that will.
A simple wrapper around bool so that it can be read as a word: true/false, on/off,...
scalar deltaTValue() const
Return time step value.
A cloud is a collection of lagrangian particles.
A list of keyword definitions, which are a keyword followed by any number of values (e....
const Time & time() const
Return time.
Mesh consisting of general polyhedral cells.
const dimensionedScalar G
Newtonian constant of gravitation.
DSMCCloud< dsmcParcel > CloudType
intWM_LABEL_SIZE_t label
A label is an int32_t or int64_t as specified by the pre-processor macro WM_LABEL_SIZE.
dimensionedSymmTensor sqr(const dimensionedVector &dv)
layerAndWeight min(const layerAndWeight &a, const layerAndWeight &b)
dimensionedScalar pow(const dimensionedScalar &ds, const dimensionedScalar &expt)
dimensionedScalar sqrt(const dimensionedScalar &ds)
dimensioned< scalar > mag(const dimensioned< Type > &)
layerAndWeight max(const layerAndWeight &a, const layerAndWeight &b)
static scalar R(const scalar a, const scalar x)
dimensionedScalar cbrt(const dimensionedScalar &ds)
dimensionedScalar pow025(const dimensionedScalar &ds)