1 // The FOAM Project // File: reflectParcel.C
3 -------------------------------------------------------------------------------
4 ========= | Class Implementation
6 \\ / | Name: reflectParcel
7 \\ / | Family: wallModel
9 F ield | FOAM version: 2.3
11 A and | Copyright (C) 1991-2008 OpenCFD Ltd.
12 M anipulation | All Rights Reserved.
13 -------------------------------------------------------------------------------
19 -------------------------------------------------------------------------------
22 #include "reflectParcel.H"
23 #include "addToRunTimeSelectionTable.H"
24 #include "wallPolyPatch.H"
26 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
31 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
33 defineTypeNameAndDebug(reflectParcel, 0);
35 addToRunTimeSelectionTable
43 // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
45 // Construct from components
46 reflectParcel::reflectParcel
48 const dictionary& dict,
53 wallModel(dict, mesh, sm),
54 coeffsDict_(dict.subDict(typeName + "Coeffs")),
55 elasticity_(readScalar(coeffsDict_.lookup("elasticity")))
59 // * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
61 reflectParcel::~reflectParcel()
65 // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
67 // Return 'keepParcel'
68 bool reflectParcel::wallTreatment
73 label patchi = p.patch();
74 label facei = p.patchFace(patchi);
76 const polyMesh& mesh = spray_.mesh();
78 if (typeid(mesh_.boundaryMesh()[patchi]) == typeid(wallPolyPatch))
80 // wallNormal defined to point outwards of domain
81 vector Sf = mesh_.Sf().boundaryField()[patchi][facei];
84 // adjust velocity when wall is moving
87 scalar Un = p.U() & Sf;
91 p.U() -= (1.0 + elasticity_)*Un*Sf;
97 label facep = p.face();
99 scalar dt = spray_.runTime().deltaT().value();
100 scalar fraction = p.t0()/dt;
101 const vectorField& oldPoints = mesh.oldPoints();
102 const vector& Cf1 = mesh.faceCentres()[facep];
104 vector Cf0 = mesh.faces()[facep].centre(oldPoints);
105 vector Cf = Cf0 + fraction*(Cf1 - Cf0);
106 vector Sf0 = mesh.faces()[facep].normal(oldPoints);
109 scalar magSfDiff = mag(Sf - Sf0);
111 if (magSfDiff > SMALL)
113 bool pureRotation = false;
119 // find center of rotation
120 vector omega = Sf0 ^ Sf;
121 scalar magOmega = mag(omega);
122 omega /= magOmega+SMALL;
123 vector n0 = omega ^ Sf0;
124 scalar lam = ((Cf1 - Cf0) & Sf)/(n0 & Sf);
125 vector r0 = Cf0 + lam*n0;
127 scalar phiVel = ::asin(magOmega)/dt;
129 vector pos = p.position() - r0;
130 vector v = phiVel*(omega ^ pos);
132 vector Sfp = Sf0 + fraction*(Sf - Sf0);
135 vector Ur = p.U() - v;
136 scalar Urn = Ur & Sfp;
138 scalar dd = (p.position() - r0) & Sfp;
139 Info << "Urn = " << Urn
141 << ", pos = " << p.position()
143 << ", omega = " << omega
149 p.U() -= (1.0 + elasticity_)*Urn*Sfp;
154 vector Sfp = Sf0 + fraction*(Sf - Sf0);
156 vector omega = Sf0 ^ Sf;
157 scalar magOmega = mag(omega);
158 omega /= magOmega+SMALL;
160 scalar phiVel = ::asin(magOmega)/dt;
162 scalar dist = (p.position() - Cf) & Sfp;
163 vector pos = p.position() - dist*Sfp;
164 vector vrot = phiVel*(omega ^ (pos - Cf));
165 vector vtrans = (Cf1 - Cf0)/dt;
166 vector v = vtrans + vrot;
168 scalar Un = ((p.U() - v) & Sfp);
172 p.U() -= (1.0 + elasticity_)*Un*Sfp;
180 vector v = (Cf1 - Cf0)/dt;
181 vector Ur = p.U() - v;
182 scalar Urn = Ur & Sf;
186 Ur -= (1.0 + elasticity_)*Urn*Sf;
198 << "bool reflectParcel::wallTreatment(parcel& parcel) const "
199 << " parcel has hit a boundary "
200 << mesh_.boundary()[patchi].type()
201 << " which not yet has been implemented."
202 << abort(FatalError);
207 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
209 } // End namespace Foam
211 // ************************************************************************* //