mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
Merge branch 'master' of ssh://dm/home/dm4/OpenFOAM/repositories/OpenFOAM-dev
This commit is contained in:
@ -2,7 +2,7 @@
|
|||||||
========= |
|
========= |
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
\\ / O peration |
|
\\ / O peration |
|
||||||
\\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation
|
\\ / A nd | Copyright (C) 2011-2014 OpenFOAM Foundation
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
@ -36,6 +36,7 @@ License
|
|||||||
#include "diagTensor.H"
|
#include "diagTensor.H"
|
||||||
#include "transformField.H"
|
#include "transformField.H"
|
||||||
#include "SubField.H"
|
#include "SubField.H"
|
||||||
|
#include "unitConversion.H"
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||||
|
|
||||||
@ -272,10 +273,14 @@ void Foam::cyclicPolyPatch::calcTransforms
|
|||||||
|
|
||||||
if (debug)
|
if (debug)
|
||||||
{
|
{
|
||||||
|
scalar theta = radToDeg(acos(n0 & n1));
|
||||||
|
|
||||||
Pout<< "cyclicPolyPatch::calcTransforms :"
|
Pout<< "cyclicPolyPatch::calcTransforms :"
|
||||||
<< " patch:" << name()
|
<< " patch:" << name()
|
||||||
<< " Specified rotation :"
|
<< " Specified rotation :"
|
||||||
<< " n0:" << n0 << " n1:" << n1 << endl;
|
<< " n0:" << n0 << " n1:" << n1
|
||||||
|
<< " swept angle: " << theta << " [deg]"
|
||||||
|
<< endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Extended tensor from two local coordinate systems calculated
|
// Extended tensor from two local coordinate systems calculated
|
||||||
@ -432,10 +437,14 @@ void Foam::cyclicPolyPatch::getCentresAndAnchors
|
|||||||
|
|
||||||
if (debug)
|
if (debug)
|
||||||
{
|
{
|
||||||
|
scalar theta = radToDeg(acos(n0 & n1));
|
||||||
|
|
||||||
Pout<< "cyclicPolyPatch::getCentresAndAnchors :"
|
Pout<< "cyclicPolyPatch::getCentresAndAnchors :"
|
||||||
<< " patch:" << name()
|
<< " patch:" << name()
|
||||||
<< " Specified rotation :"
|
<< " Specified rotation :"
|
||||||
<< " n0:" << n0 << " n1:" << n1 << endl;
|
<< " n0:" << n0 << " n1:" << n1
|
||||||
|
<< " swept angle: " << theta << " [deg]"
|
||||||
|
<< endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Extended tensor from two local coordinate systems calculated
|
// Extended tensor from two local coordinate systems calculated
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
========= |
|
========= |
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
\\ / O peration |
|
\\ / O peration |
|
||||||
\\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation
|
\\ / A nd | Copyright (C) 2011-2014 OpenFOAM Foundation
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
@ -45,7 +45,7 @@ namespace Foam
|
|||||||
|
|
||||||
// * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * * //
|
// * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * * //
|
||||||
|
|
||||||
Foam::vector Foam::cyclicAMIPolyPatch::findFaceMaxRadius
|
Foam::vector Foam::cyclicAMIPolyPatch::findFaceNormalMaxRadius
|
||||||
(
|
(
|
||||||
const pointField& faceCentres
|
const pointField& faceCentres
|
||||||
) const
|
) const
|
||||||
@ -138,45 +138,115 @@ void Foam::cyclicAMIPolyPatch::calcTransforms
|
|||||||
{
|
{
|
||||||
case ROTATIONAL:
|
case ROTATIONAL:
|
||||||
{
|
{
|
||||||
point n0 = vector::zero;
|
tensor revT = tensor::zero;
|
||||||
if (half0Ctrs.size())
|
|
||||||
|
if (rotationAngleDefined_)
|
||||||
{
|
{
|
||||||
n0 = findFaceMaxRadius(half0Ctrs);
|
tensor T(rotationAxis_*rotationAxis_);
|
||||||
|
|
||||||
|
tensor S
|
||||||
|
(
|
||||||
|
0, -rotationAxis_.z(), rotationAxis_.y(),
|
||||||
|
rotationAxis_.z(), 0, -rotationAxis_.x(),
|
||||||
|
-rotationAxis_.y(), rotationAxis_.x(), 0
|
||||||
|
);
|
||||||
|
|
||||||
|
tensor RPos
|
||||||
|
(
|
||||||
|
T
|
||||||
|
+ cos(rotationAngle_)*(tensor::I + T)
|
||||||
|
+ sin(rotationAngle_)*S
|
||||||
|
);
|
||||||
|
tensor RNeg
|
||||||
|
(
|
||||||
|
T
|
||||||
|
+ cos(-rotationAngle_)*(tensor::I + T)
|
||||||
|
+ sin(-rotationAngle_)*S
|
||||||
|
);
|
||||||
|
|
||||||
|
// check - assume correct angle when difference in face areas
|
||||||
|
// is the smallest
|
||||||
|
vector transformedAreaPos = sum(half0Areas & RPos);
|
||||||
|
vector transformedAreaNeg = sum(half0Areas & RNeg);
|
||||||
|
vector area1 = sum(half1Areas);
|
||||||
|
reduce(transformedAreaPos, sumOp<vector>());
|
||||||
|
reduce(transformedAreaNeg, sumOp<vector>());
|
||||||
|
reduce(area1, sumOp<vector>());
|
||||||
|
|
||||||
|
scalar errorPos = mag(transformedAreaPos - area1);
|
||||||
|
scalar errorNeg = mag(transformedAreaNeg - area1);
|
||||||
|
|
||||||
|
if (errorPos < errorNeg)
|
||||||
|
{
|
||||||
|
revT = RPos;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
revT = RNeg;
|
||||||
|
rotationAngle_ *= -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (debug)
|
||||||
|
{
|
||||||
|
scalar theta = radToDeg(rotationAngle_);
|
||||||
|
|
||||||
|
Pout<< "cyclicAMIPolyPatch::calcTransforms: patch:"
|
||||||
|
<< name()
|
||||||
|
<< " Specified rotation:"
|
||||||
|
<< " swept angle: " << theta << " [deg]"
|
||||||
|
<< " reverse transform: " << revT
|
||||||
|
<< endl;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
point n1 = vector::zero;
|
else
|
||||||
if (half1Ctrs.size())
|
|
||||||
{
|
{
|
||||||
n1 = -findFaceMaxRadius(half1Ctrs);
|
point n0 = vector::zero;
|
||||||
|
point n1 = vector::zero;
|
||||||
|
if (half0Ctrs.size())
|
||||||
|
{
|
||||||
|
n0 = findFaceNormalMaxRadius(half0Ctrs);
|
||||||
|
}
|
||||||
|
if (half1Ctrs.size())
|
||||||
|
{
|
||||||
|
n1 = -findFaceNormalMaxRadius(half1Ctrs);
|
||||||
|
}
|
||||||
|
|
||||||
|
reduce(n0, maxMagSqrOp<point>());
|
||||||
|
reduce(n1, maxMagSqrOp<point>());
|
||||||
|
|
||||||
|
n0 /= mag(n0) + VSMALL;
|
||||||
|
n1 /= mag(n1) + VSMALL;
|
||||||
|
|
||||||
|
// Extended tensor from two local coordinate systems calculated
|
||||||
|
// using normal and rotation axis
|
||||||
|
const tensor E0
|
||||||
|
(
|
||||||
|
rotationAxis_,
|
||||||
|
(n0 ^ rotationAxis_),
|
||||||
|
n0
|
||||||
|
);
|
||||||
|
const tensor E1
|
||||||
|
(
|
||||||
|
rotationAxis_,
|
||||||
|
(-n1 ^ rotationAxis_),
|
||||||
|
-n1
|
||||||
|
);
|
||||||
|
revT = E1.T() & E0;
|
||||||
|
|
||||||
|
if (debug)
|
||||||
|
{
|
||||||
|
scalar theta = radToDeg(acos(n0 & n1));
|
||||||
|
|
||||||
|
Pout<< "cyclicAMIPolyPatch::calcTransforms: patch:"
|
||||||
|
<< name()
|
||||||
|
<< " Specified rotation:"
|
||||||
|
<< " n0:" << n0 << " n1:" << n1
|
||||||
|
<< " swept angle: " << theta << " [deg]"
|
||||||
|
<< " reverse transform: " << revT
|
||||||
|
<< endl;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
reduce(n0, maxMagSqrOp<point>());
|
|
||||||
reduce(n1, maxMagSqrOp<point>());
|
|
||||||
|
|
||||||
n0 /= mag(n0) + VSMALL;
|
|
||||||
n1 /= mag(n1) + VSMALL;
|
|
||||||
|
|
||||||
if (debug)
|
|
||||||
{
|
|
||||||
Pout<< "cyclicAMIPolyPatch::calcTransforms : patch:" << name()
|
|
||||||
<< " Specified rotation :"
|
|
||||||
<< " n0:" << n0 << " n1:" << n1 << endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Extended tensor from two local coordinate systems calculated
|
|
||||||
// using normal and rotation axis
|
|
||||||
const tensor E0
|
|
||||||
(
|
|
||||||
rotationAxis_,
|
|
||||||
(n0 ^ rotationAxis_),
|
|
||||||
n0
|
|
||||||
);
|
|
||||||
const tensor E1
|
|
||||||
(
|
|
||||||
rotationAxis_,
|
|
||||||
(-n1 ^ rotationAxis_),
|
|
||||||
-n1
|
|
||||||
);
|
|
||||||
const tensor revT(E1.T() & E0);
|
|
||||||
const_cast<tensorField&>(forwardT()) = tensorField(1, revT.T());
|
const_cast<tensorField&>(forwardT()) = tensorField(1, revT.T());
|
||||||
const_cast<tensorField&>(reverseT()) = tensorField(1, revT);
|
const_cast<tensorField&>(reverseT()) = tensorField(1, revT);
|
||||||
const_cast<vectorField&>(separation()).setSize(0);
|
const_cast<vectorField&>(separation()).setSize(0);
|
||||||
@ -395,6 +465,8 @@ Foam::cyclicAMIPolyPatch::cyclicAMIPolyPatch
|
|||||||
nbrPatchID_(-1),
|
nbrPatchID_(-1),
|
||||||
rotationAxis_(vector::zero),
|
rotationAxis_(vector::zero),
|
||||||
rotationCentre_(point::zero),
|
rotationCentre_(point::zero),
|
||||||
|
rotationAngleDefined_(false),
|
||||||
|
rotationAngle_(0.0),
|
||||||
separationVector_(vector::zero),
|
separationVector_(vector::zero),
|
||||||
AMIPtr_(NULL),
|
AMIPtr_(NULL),
|
||||||
AMIReverse_(false),
|
AMIReverse_(false),
|
||||||
@ -421,6 +493,8 @@ Foam::cyclicAMIPolyPatch::cyclicAMIPolyPatch
|
|||||||
nbrPatchID_(-1),
|
nbrPatchID_(-1),
|
||||||
rotationAxis_(vector::zero),
|
rotationAxis_(vector::zero),
|
||||||
rotationCentre_(point::zero),
|
rotationCentre_(point::zero),
|
||||||
|
rotationAngleDefined_(false),
|
||||||
|
rotationAngle_(0.0),
|
||||||
separationVector_(vector::zero),
|
separationVector_(vector::zero),
|
||||||
AMIPtr_(NULL),
|
AMIPtr_(NULL),
|
||||||
AMIReverse_(dict.lookupOrDefault<bool>("flipNormals", false)),
|
AMIReverse_(dict.lookupOrDefault<bool>("flipNormals", false)),
|
||||||
@ -466,6 +540,17 @@ Foam::cyclicAMIPolyPatch::cyclicAMIPolyPatch
|
|||||||
{
|
{
|
||||||
dict.lookup("rotationAxis") >> rotationAxis_;
|
dict.lookup("rotationAxis") >> rotationAxis_;
|
||||||
dict.lookup("rotationCentre") >> rotationCentre_;
|
dict.lookup("rotationCentre") >> rotationCentre_;
|
||||||
|
if (dict.readIfPresent("rotationAngle", rotationAngle_))
|
||||||
|
{
|
||||||
|
rotationAngleDefined_ = true;
|
||||||
|
rotationAngle_ = degToRad(rotationAngle_);
|
||||||
|
|
||||||
|
if (debug)
|
||||||
|
{
|
||||||
|
Info<< "rotationAngle: " << rotationAngle_ << " [rad]"
|
||||||
|
<< endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
scalar magRot = mag(rotationAxis_);
|
scalar magRot = mag(rotationAxis_);
|
||||||
if (magRot < SMALL)
|
if (magRot < SMALL)
|
||||||
@ -516,6 +601,8 @@ Foam::cyclicAMIPolyPatch::cyclicAMIPolyPatch
|
|||||||
nbrPatchID_(-1),
|
nbrPatchID_(-1),
|
||||||
rotationAxis_(pp.rotationAxis_),
|
rotationAxis_(pp.rotationAxis_),
|
||||||
rotationCentre_(pp.rotationCentre_),
|
rotationCentre_(pp.rotationCentre_),
|
||||||
|
rotationAngleDefined_(pp.rotationAngleDefined_),
|
||||||
|
rotationAngle_(pp.rotationAngle_),
|
||||||
separationVector_(pp.separationVector_),
|
separationVector_(pp.separationVector_),
|
||||||
AMIPtr_(NULL),
|
AMIPtr_(NULL),
|
||||||
AMIReverse_(pp.AMIReverse_),
|
AMIReverse_(pp.AMIReverse_),
|
||||||
@ -543,6 +630,8 @@ Foam::cyclicAMIPolyPatch::cyclicAMIPolyPatch
|
|||||||
nbrPatchID_(-1),
|
nbrPatchID_(-1),
|
||||||
rotationAxis_(pp.rotationAxis_),
|
rotationAxis_(pp.rotationAxis_),
|
||||||
rotationCentre_(pp.rotationCentre_),
|
rotationCentre_(pp.rotationCentre_),
|
||||||
|
rotationAngleDefined_(pp.rotationAngleDefined_),
|
||||||
|
rotationAngle_(pp.rotationAngle_),
|
||||||
separationVector_(pp.separationVector_),
|
separationVector_(pp.separationVector_),
|
||||||
AMIPtr_(NULL),
|
AMIPtr_(NULL),
|
||||||
AMIReverse_(pp.AMIReverse_),
|
AMIReverse_(pp.AMIReverse_),
|
||||||
@ -584,6 +673,8 @@ Foam::cyclicAMIPolyPatch::cyclicAMIPolyPatch
|
|||||||
nbrPatchID_(-1),
|
nbrPatchID_(-1),
|
||||||
rotationAxis_(pp.rotationAxis_),
|
rotationAxis_(pp.rotationAxis_),
|
||||||
rotationCentre_(pp.rotationCentre_),
|
rotationCentre_(pp.rotationCentre_),
|
||||||
|
rotationAngleDefined_(pp.rotationAngleDefined_),
|
||||||
|
rotationAngle_(pp.rotationAngle_),
|
||||||
separationVector_(pp.separationVector_),
|
separationVector_(pp.separationVector_),
|
||||||
AMIPtr_(NULL),
|
AMIPtr_(NULL),
|
||||||
AMIReverse_(pp.AMIReverse_),
|
AMIReverse_(pp.AMIReverse_),
|
||||||
@ -874,6 +965,14 @@ void Foam::cyclicAMIPolyPatch::write(Ostream& os) const
|
|||||||
<< token::END_STATEMENT << nl;
|
<< token::END_STATEMENT << nl;
|
||||||
os.writeKeyword("rotationCentre") << rotationCentre_
|
os.writeKeyword("rotationCentre") << rotationCentre_
|
||||||
<< token::END_STATEMENT << nl;
|
<< token::END_STATEMENT << nl;
|
||||||
|
|
||||||
|
if (rotationAngleDefined_)
|
||||||
|
{
|
||||||
|
os.writeKeyword("rotationAngle") << radToDeg(rotationAngle_)
|
||||||
|
<< token::END_STATEMENT << nl;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TRANSLATIONAL:
|
case TRANSLATIONAL:
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
========= |
|
========= |
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
\\ / O peration |
|
\\ / O peration |
|
||||||
\\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation
|
\\ / A nd | Copyright (C) 2011-2014 OpenFOAM Foundation
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
@ -75,9 +75,15 @@ private:
|
|||||||
//- Axis of rotation for rotational cyclics
|
//- Axis of rotation for rotational cyclics
|
||||||
vector rotationAxis_;
|
vector rotationAxis_;
|
||||||
|
|
||||||
//- point on axis of rotation for rotational cyclics
|
//- Point on axis of rotation for rotational cyclics
|
||||||
point rotationCentre_;
|
point rotationCentre_;
|
||||||
|
|
||||||
|
//- Flag to show whether the rotation angle is defined
|
||||||
|
bool rotationAngleDefined_;
|
||||||
|
|
||||||
|
//- Rotation angle
|
||||||
|
scalar rotationAngle_;
|
||||||
|
|
||||||
|
|
||||||
// For translation
|
// For translation
|
||||||
|
|
||||||
@ -101,7 +107,7 @@ private:
|
|||||||
// Private Member Functions
|
// Private Member Functions
|
||||||
|
|
||||||
//- Return normal of face at max distance from rotation axis
|
//- Return normal of face at max distance from rotation axis
|
||||||
vector findFaceMaxRadius(const pointField& faceCentres) const;
|
vector findFaceNormalMaxRadius(const pointField& faceCentres) const;
|
||||||
|
|
||||||
void calcTransforms
|
void calcTransforms
|
||||||
(
|
(
|
||||||
|
|||||||
@ -940,6 +940,8 @@ void Foam::forces::calcForcesMoment()
|
|||||||
|
|
||||||
Pstream::listCombineGather(force_, plusEqOp<vectorField>());
|
Pstream::listCombineGather(force_, plusEqOp<vectorField>());
|
||||||
Pstream::listCombineGather(moment_, plusEqOp<vectorField>());
|
Pstream::listCombineGather(moment_, plusEqOp<vectorField>());
|
||||||
|
Pstream::listCombineScatter(force_);
|
||||||
|
Pstream::listCombineScatter(moment_);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user