mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
ENH: Moved particle patch data from interaction model to cloud
This commit is contained in:
@ -661,7 +661,7 @@ void Foam::KinematicCloud<CloudType>::evolve()
|
||||
|
||||
template<class CloudType>
|
||||
template<class TrackData>
|
||||
void Foam::KinematicCloud<CloudType>::motion(TrackData& td)
|
||||
void Foam::KinematicCloud<CloudType>::motion(TrackData& td)
|
||||
{
|
||||
td.part() = TrackData::tpLinearTrack;
|
||||
CloudType::move(td, solution_.trackTime());
|
||||
@ -670,6 +670,152 @@ void Foam::KinematicCloud<CloudType>::motion(TrackData& td)
|
||||
}
|
||||
|
||||
|
||||
template<class CloudType>
|
||||
void Foam::KinematicCloud<CloudType>::patchData
|
||||
(
|
||||
const parcelType& p,
|
||||
const polyPatch& pp,
|
||||
const scalar trackFraction,
|
||||
const tetIndices& tetIs,
|
||||
vector& nw,
|
||||
vector& Up
|
||||
) const
|
||||
{
|
||||
label patchI = pp.index();
|
||||
label patchFaceI = pp.whichFace(p.face());
|
||||
|
||||
vector n = tetIs.faceTri(mesh_).normal();
|
||||
n /= mag(n);
|
||||
|
||||
vector U = U_.boundaryField()[patchI][patchFaceI];
|
||||
|
||||
// Unless the face is rotating, the required normal is n;
|
||||
nw = n;
|
||||
|
||||
if (!mesh_.moving())
|
||||
{
|
||||
// Only wall patches may have a non-zero wall velocity from
|
||||
// the velocity field when the mesh is not moving.
|
||||
|
||||
if (isA<wallPolyPatch>(pp))
|
||||
{
|
||||
Up = U;
|
||||
}
|
||||
else
|
||||
{
|
||||
Up = vector::zero;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
vector U00 = U_.oldTime().boundaryField()[patchI][patchFaceI];
|
||||
|
||||
vector n00 = tetIs.oldFaceTri(mesh_).normal();
|
||||
|
||||
// Difference in normal over timestep
|
||||
vector dn = vector::zero;
|
||||
|
||||
if (mag(n00) > SMALL)
|
||||
{
|
||||
// If the old normal is zero (for example in layer
|
||||
// addition) then use the current normal, meaning that the
|
||||
// motion can only be translational, and dn remains zero,
|
||||
// otherwise, calculate dn:
|
||||
|
||||
n00 /= mag(n00);
|
||||
|
||||
dn = n - n00;
|
||||
}
|
||||
|
||||
// Total fraction through the timestep of the motion,
|
||||
// including stepFraction before the current tracking step
|
||||
// and the current trackFraction
|
||||
// i.e.
|
||||
// let s = stepFraction, t = trackFraction
|
||||
// Motion of x in time:
|
||||
// |-----------------|---------|---------|
|
||||
// x00 x0 xi x
|
||||
//
|
||||
// where xi is the correct value of x at the required
|
||||
// tracking instant.
|
||||
//
|
||||
// x0 = x00 + s*(x - x00) = s*x + (1 - s)*x00
|
||||
//
|
||||
// i.e. the motion covered by previous tracking portions
|
||||
// within this timestep, and
|
||||
//
|
||||
// xi = x0 + t*(x - x0)
|
||||
// = t*x + (1 - t)*x0
|
||||
// = t*x + (1 - t)*(s*x + (1 - s)*x00)
|
||||
// = (s + t - s*t)*x + (1 - (s + t - s*t))*x00
|
||||
//
|
||||
// let m = (s + t - s*t)
|
||||
//
|
||||
// xi = m*x + (1 - m)*x00 = x00 + m*(x - x00);
|
||||
//
|
||||
// In the same form as before.
|
||||
|
||||
scalar m =
|
||||
p.stepFraction()
|
||||
+ trackFraction
|
||||
- (p.stepFraction()*trackFraction);
|
||||
|
||||
// When the mesh is moving, the velocity field on wall patches
|
||||
// will contain the velocity associated with the motion of the
|
||||
// mesh, in which case it is interpolated in time using m.
|
||||
// For other patches the face velocity will need to be
|
||||
// reconstructed from the face centre motion.
|
||||
|
||||
const vector& Cf = mesh_.faceCentres()[p.face()];
|
||||
|
||||
vector Cf00 = mesh_.faces()[p.face()].centre(mesh_.oldPoints());
|
||||
|
||||
if (isA<wallPolyPatch>(pp))
|
||||
{
|
||||
Up = U00 + m*(U - U00);
|
||||
}
|
||||
else
|
||||
{
|
||||
Up = (Cf - Cf00)/mesh_.time().deltaTValue();
|
||||
}
|
||||
|
||||
if (mag(dn) > SMALL)
|
||||
{
|
||||
// Rotational motion, nw requires interpolation and a
|
||||
// rotational velocity around face centre correction to Up
|
||||
// is required.
|
||||
|
||||
nw = n00 + m*dn;
|
||||
|
||||
// Cf at tracking instant
|
||||
vector Cfi = Cf00 + m*(Cf - Cf00);
|
||||
|
||||
// Normal vector cross product
|
||||
vector omega = (n00 ^ n);
|
||||
|
||||
scalar magOmega = mag(omega);
|
||||
|
||||
// magOmega = sin(angle between unit normals)
|
||||
// Normalise omega vector by magOmega, then multiply by
|
||||
// angle/dt to give the correct angular velocity vector.
|
||||
omega *= Foam::asin(magOmega)/(magOmega*mesh_.time().deltaTValue());
|
||||
|
||||
// Project position onto face and calculate this position
|
||||
// relative to the face centre.
|
||||
vector facePos =
|
||||
p.position()
|
||||
- ((p.position() - Cfi) & nw)*nw
|
||||
- Cfi;
|
||||
|
||||
Up += (omega ^ facePos);
|
||||
}
|
||||
|
||||
// No further action is required if the motion is
|
||||
// translational only, nw and Up have already been set.
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
template<class CloudType>
|
||||
void Foam::KinematicCloud<CloudType>::autoMap(const mapPolyMesh& mapper)
|
||||
{
|
||||
|
||||
@ -554,6 +554,17 @@ public:
|
||||
template<class TrackData>
|
||||
void motion(TrackData& td);
|
||||
|
||||
//- Calculate the patch normal and velocity to interact with,
|
||||
// accounting for patch motion if required.
|
||||
void patchData
|
||||
(
|
||||
const parcelType& p,
|
||||
const polyPatch& pp,
|
||||
const scalar trackFraction,
|
||||
const tetIndices& tetIs,
|
||||
vector& normal,
|
||||
vector& Up
|
||||
) const;
|
||||
|
||||
// Mapping
|
||||
|
||||
|
||||
@ -233,7 +233,7 @@ bool Foam::LocalInteraction<CloudType>::correct
|
||||
vector nw;
|
||||
vector Up;
|
||||
|
||||
this->patchData(p, pp, trackFraction, tetIs, nw, Up);
|
||||
this->owner().patchData(p, pp, trackFraction, tetIs, nw, Up);
|
||||
|
||||
// Calculate motion relative to patch velocity
|
||||
U -= Up;
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2011 OpenFOAM Foundation
|
||||
\\ / A nd | Copyright (C) 2011-2012 OpenFOAM Foundation
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
@ -179,159 +179,6 @@ bool Foam::PatchInteractionModel<CloudType>::correct
|
||||
}
|
||||
|
||||
|
||||
template<class CloudType>
|
||||
void Foam::PatchInteractionModel<CloudType>::patchData
|
||||
(
|
||||
typename CloudType::parcelType& p,
|
||||
const polyPatch& pp,
|
||||
const scalar trackFraction,
|
||||
const tetIndices& tetIs,
|
||||
vector& nw,
|
||||
vector& Up
|
||||
) const
|
||||
{
|
||||
const fvMesh& mesh = this->owner().mesh();
|
||||
|
||||
const volVectorField& Ufield =
|
||||
mesh.objectRegistry::lookupObject<volVectorField>(UName_);
|
||||
|
||||
label patchI = pp.index();
|
||||
label patchFaceI = pp.whichFace(p.face());
|
||||
|
||||
vector n = tetIs.faceTri(mesh).normal();
|
||||
n /= mag(n);
|
||||
|
||||
vector U = Ufield.boundaryField()[patchI][patchFaceI];
|
||||
|
||||
// Unless the face is rotating, the required normal is n;
|
||||
nw = n;
|
||||
|
||||
if (!mesh.moving())
|
||||
{
|
||||
// Only wall patches may have a non-zero wall velocity from
|
||||
// the velocity field when the mesh is not moving.
|
||||
|
||||
if (isA<wallPolyPatch>(pp))
|
||||
{
|
||||
Up = U;
|
||||
}
|
||||
else
|
||||
{
|
||||
Up = vector::zero;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
vector U00 = Ufield.oldTime().boundaryField()[patchI][patchFaceI];
|
||||
|
||||
vector n00 = tetIs.oldFaceTri(mesh).normal();
|
||||
|
||||
// Difference in normal over timestep
|
||||
vector dn = vector::zero;
|
||||
|
||||
if (mag(n00) > SMALL)
|
||||
{
|
||||
// If the old normal is zero (for example in layer
|
||||
// addition) then use the current normal, meaning that the
|
||||
// motion can only be translational, and dn remains zero,
|
||||
// otherwise, calculate dn:
|
||||
|
||||
n00 /= mag(n00);
|
||||
|
||||
dn = n - n00;
|
||||
}
|
||||
|
||||
// Total fraction thought the timestep of the motion,
|
||||
// including stepFraction before the current tracking step
|
||||
// and the current trackFraction
|
||||
// i.e.
|
||||
// let s = stepFraction, t = trackFraction
|
||||
// Motion of x in time:
|
||||
// |-----------------|---------|---------|
|
||||
// x00 x0 xi x
|
||||
//
|
||||
// where xi is the correct value of x at the required
|
||||
// tracking instant.
|
||||
//
|
||||
// x0 = x00 + s*(x - x00) = s*x + (1 - s)*x00
|
||||
//
|
||||
// i.e. the motion covered by previous tracking portions
|
||||
// within this timestep, and
|
||||
//
|
||||
// xi = x0 + t*(x - x0)
|
||||
// = t*x + (1 - t)*x0
|
||||
// = t*x + (1 - t)*(s*x + (1 - s)*x00)
|
||||
// = (s + t - s*t)*x + (1 - (s + t - s*t))*x00
|
||||
//
|
||||
// let m = (s + t - s*t)
|
||||
//
|
||||
// xi = m*x + (1 - m)*x00 = x00 + m*(x - x00);
|
||||
//
|
||||
// In the same form as before.
|
||||
|
||||
scalar m =
|
||||
p.stepFraction()
|
||||
+ trackFraction
|
||||
- (p.stepFraction()*trackFraction);
|
||||
|
||||
// When the mesh is moving, the velocity field on wall patches
|
||||
// will contain the velocity associated with the motion of the
|
||||
// mesh, in which case it is interpolated in time using m.
|
||||
// For other patches the face velocity will need to be
|
||||
// reconstructed from the face centre motion.
|
||||
|
||||
const vector& Cf = mesh.faceCentres()[p.face()];
|
||||
|
||||
vector Cf00 = mesh.faces()[p.face()].centre(mesh.oldPoints());
|
||||
|
||||
if (isA<wallPolyPatch>(pp))
|
||||
{
|
||||
Up = U00 + m*(U - U00);
|
||||
}
|
||||
else
|
||||
{
|
||||
Up = (Cf - Cf00)/this->owner().time().deltaTValue();
|
||||
}
|
||||
|
||||
if (mag(dn) > SMALL)
|
||||
{
|
||||
// Rotational motion, nw requires interpolation and a
|
||||
// rotational velocity around face centre correction to Up
|
||||
// is required.
|
||||
|
||||
nw = n00 + m*dn;
|
||||
|
||||
// Cf at tracking instant
|
||||
vector Cfi = Cf00 + m*(Cf - Cf00);
|
||||
|
||||
// Normal vector cross product
|
||||
vector omega = (n00 ^ n);
|
||||
|
||||
scalar magOmega = mag(omega);
|
||||
|
||||
// magOmega = sin(angle between unit normals)
|
||||
// Normalise omega vector by magOmega, then multiply by
|
||||
// angle/dt to give the correct angular velocity vector.
|
||||
omega *=
|
||||
Foam::asin(magOmega)
|
||||
/(magOmega*this->owner().time().deltaTValue());
|
||||
|
||||
// Project position onto face and calculate this position
|
||||
// relative to the face centre.
|
||||
vector facePos =
|
||||
p.position()
|
||||
- ((p.position() - Cfi) & nw)*nw
|
||||
- Cfi;
|
||||
|
||||
Up += (omega ^ facePos);
|
||||
}
|
||||
|
||||
// No further action is required if the motion is
|
||||
// translational only, nw and Up have already been set.
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
template<class CloudType>
|
||||
void Foam::PatchInteractionModel<CloudType>::info(Ostream& os)
|
||||
{
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2011 OpenFOAM Foundation
|
||||
\\ / A nd | Copyright (C) 2011-2012 OpenFOAM Foundation
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
@ -164,18 +164,6 @@ public:
|
||||
const tetIndices& tetIs
|
||||
);
|
||||
|
||||
//- Calculate the patch normal and velocity to interact with,
|
||||
// accounting for patch motion if required.
|
||||
void patchData
|
||||
(
|
||||
typename CloudType::parcelType& p,
|
||||
const polyPatch& pp,
|
||||
const scalar trackFraction,
|
||||
const tetIndices& tetIs,
|
||||
vector& normal,
|
||||
vector& Up
|
||||
) const;
|
||||
|
||||
|
||||
// I-O
|
||||
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2011 OpenFOAM Foundation
|
||||
\\ / A nd | Copyright (C) 2011-2012 OpenFOAM Foundation
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
@ -74,7 +74,7 @@ bool Foam::Rebound<CloudType>::correct
|
||||
vector nw;
|
||||
vector Up;
|
||||
|
||||
this->patchData(p, pp, trackFraction, tetIs, nw, Up);
|
||||
this->owner().patchData(p, pp, trackFraction, tetIs, nw, Up);
|
||||
|
||||
// Calculate motion relative to patch velocity
|
||||
U -= Up;
|
||||
|
||||
@ -148,7 +148,7 @@ bool Foam::StandardWallInteraction<CloudType>::correct
|
||||
vector nw;
|
||||
vector Up;
|
||||
|
||||
this->patchData(p, pp, trackFraction, tetIs, nw, Up);
|
||||
this->owner().patchData(p, pp, trackFraction, tetIs, nw, Up);
|
||||
|
||||
// Calculate motion relative to patch velocity
|
||||
U -= Up;
|
||||
|
||||
Reference in New Issue
Block a user