30 template<
class CloudType>
44 const typename CloudType::parcelType& p = iter();
50 if (useEquivalentSize_)
52 dEff *=
cbrt(p.nParticle()*volumeFactor_);
55 rMin =
min(dEff, rMin);
61 mag(p.U()) +
mag(p.omega())*dEff/2,
73 template<
class CloudType>
76 typename CloudType::parcelType& p,
78 const WallSiteData<vector>& data,
84 vector r_PW = p.position() - site;
86 vector U_PW = p.U() - data.wallData();
88 scalar r_PW_mag =
mag(r_PW);
90 scalar normalOverlapMag =
max(pREff - r_PW_mag, 0.0);
92 vector rHat_PW = r_PW/(r_PW_mag + VSMALL);
94 scalar etaN = alpha_*
sqrt(p.mass()*kN)*
pow025(normalOverlapMag);
98 *(kN*
pow(normalOverlapMag, b_) - etaN*(U_PW & rHat_PW));
105 -cohesionEnergyDensity_
113 U_PW - (U_PW & rHat_PW)*rHat_PW
114 + (p.omega() ^ (pREff*-rHat_PW));
116 scalar deltaT = this->owner().mesh().time().deltaTValue();
118 vector& tangentialOverlap_PW =
119 p.collisionRecords().matchWallRecord(-r_PW, pREff).collisionData();
121 tangentialOverlap_PW += USlip_PW*deltaT;
123 scalar tangentialOverlapMag =
mag(tangentialOverlap_PW);
125 if (tangentialOverlapMag > VSMALL)
127 scalar kT = 8.0*
sqrt(pREff*normalOverlapMag)*Gstar_;
134 if (kT*tangentialOverlapMag > mu_*
mag(fN_PW))
139 fT_PW = -mu_*
mag(fN_PW)*USlip_PW/
mag(USlip_PW);
141 tangentialOverlap_PW =
Zero;
146 -kT*tangentialOverlapMag
147 *tangentialOverlap_PW/tangentialOverlapMag
153 p.torque() += (pREff*-rHat_PW) ^ fT_PW;
160 template<
class CloudType>
173 cohesionEnergyDensity_
178 collisionResolutionSteps_
182 this->coeffDict().
lookup(
"collisionResolutionSteps")
186 useEquivalentSize_(
Switch(this->coeffDict().
lookup(
"useEquivalentSize")))
188 if (useEquivalentSize_)
197 scalar pNu = this->owner().constProps().poissonsRatio();
199 scalar pE = this->owner().constProps().youngsModulus();
201 Estar_ = 1/((1 -
sqr(pNu))/pE + (1 -
sqr(nu))/E);
203 Gstar_ = 1/(2*((2 + pNu -
sqr(pNu))/pE + (2 + nu -
sqr(nu))/E));
205 cohesion_ = (
mag(cohesionEnergyDensity_) > VSMALL);
211 template<
class CloudType>
218 template<
class CloudType>
224 if (useEquivalentSize_)
226 return p.d()/2*
cbrt(p.nParticle()*volumeFactor_);
235 template<
class CloudType>
242 template<
class CloudType>
245 if (!(this->owner().size()))
254 findMinMaxProperties(rMin, rhoMax, UMagMax);
257 scalar minCollisionDeltaT =
260 *
pow(rhoMax/(Estar_*
sqrt(UMagMax) + VSMALL), 0.4)
261 /collisionResolutionSteps_;
263 return ceil(this->owner().time().deltaTValue()/minCollisionDeltaT);
267 template<
class CloudType>
277 scalar pREff = this->pREff(p);
279 scalar kN = (4.0/3.0)*
sqrt(pREff)*Estar_;
281 forAll(flatSitePoints, siteI)
286 flatSitePoints[siteI],
294 forAll(sharpSitePoints, siteI)
301 sharpSitePoints[siteI],
302 sharpSiteData[siteI],
PtrList< dimensionedScalar > rhoMax(fluidRegions.size())
#define forAll(list, i)
Loop across all elements in list.
intWM_LABEL_SIZE_t label
A label is an int32_t or int64_t as specified by the pre-processor macro WM_LABEL_SIZE.
DSMCCloud< dsmcParcel > CloudType
A list of keyword definitions, which are a keyword followed by any number of values (e...
dimensioned< Type > max(const dimensioned< Type > &, const dimensioned< Type > &)
A 1D array of objects of type <T>, where the size of the vector is known and used for subscript bound...
dimensionedSymmTensor sqr(const dimensionedVector &dv)
dimensionedScalar sqrt(const dimensionedScalar &ds)
dimensionedScalar pow025(const dimensionedScalar &ds)
A simple wrapper around bool so that it can be read as a word: true/false, on/off, yes/no, y/n, t/f, or none.
Forces between particles and walls, interacting with a spring, slider, damper model.
Vector< scalar > vector
A scalar version of the templated Vector.
virtual ~WallSpringSliderDashpot()
Destructor.
virtual scalar pREff(const typename CloudType::parcelType &p) const
Return the effective radius for a particle for the model.
stressControl lookup("compactNormalStress") >> compactNormalStress
dimensionedScalar cbrt(const dimensionedScalar &ds)
Templated wall interaction class.
forAllConstIter(PtrDictionary< phaseModel >, mixture.phases(), phase)
Stores the patch ID and templated data to represent a collision with a wall to be passed to the wall ...
ParcelType parcelType
Type of parcel the cloud was instantiated for.
virtual label nSubCycles() const
For WallModels that control the timestep, calculate the.
dimensioned< Type > min(const dimensioned< Type > &, const dimensioned< Type > &)
WallSpringSliderDashpot(const dictionary &dict, CloudType &cloud)
Construct from dictionary.
dimensionedScalar pow(const dimensionedScalar &ds, const dimensionedScalar &expt)
virtual bool controlsTimestep() const
Whether the WallModel has a timestep limit that will.
vector point
Point is a vector.
dimensioned< scalar > mag(const dimensioned< Type > &)
Templated base class for dsmc cloud.