Commit fac508c5 authored by mattijs's avatar mattijs
Browse files

ENH: cyclicAMI: consistent parallel transformations

parent ef4a5757
......@@ -251,6 +251,7 @@ void Foam::cyclicPolyPatch::calcTransforms
if (debug)
{
Pout<< "cyclicPolyPatch::calcTransforms :"
<< " patch:" << name()
<< " Max area error:" << 100*maxAreaDiff << "% at face:"
<< maxAreaFacei << " at:" << half0Ctrs[maxAreaFacei]
<< " coupled face at:" << half1Ctrs[maxAreaFacei]
......@@ -264,17 +265,15 @@ void Foam::cyclicPolyPatch::calcTransforms
{
// Calculate using the given rotation axis and centre. Do not
// use calculated normals.
label face0 = getConsistentRotationFace(half0Ctrs);
label face1 = face0;
vector n0 = ((half0Ctrs[face0] - rotationCentre_) ^ rotationAxis_);
vector n1 = ((half1Ctrs[face1] - rotationCentre_) ^ -rotationAxis_);
vector n0 = findFaceMaxRadius(half0Ctrs);
vector n1 = findFaceMaxRadius(half1Ctrs);
n0 /= mag(n0) + VSMALL;
n1 /= mag(n1) + VSMALL;
if (debug)
{
Pout<< "cyclicPolyPatch::calcTransforms :"
<< " patch:" << name()
<< " Specified rotation :"
<< " n0:" << n0 << " n1:" << n1 << endl;
}
......@@ -330,6 +329,7 @@ void Foam::cyclicPolyPatch::calcTransforms
if (debug)
{
Pout<< "cyclicPolyPatch::calcTransforms :"
<< " patch:" << name()
<< " Specified separation vector : "
<< separationVector_ << endl;
}
......@@ -426,17 +426,15 @@ void Foam::cyclicPolyPatch::getCentresAndAnchors
{
case ROTATIONAL:
{
label face0 = getConsistentRotationFace(half0Ctrs);
label face1 = getConsistentRotationFace(half1Ctrs);
vector n0 = ((half0Ctrs[face0] - rotationCentre_) ^ rotationAxis_);
vector n1 = ((half1Ctrs[face1] - rotationCentre_) ^ -rotationAxis_);
vector n0 = findFaceMaxRadius(half0Ctrs);
vector n1 = findFaceMaxRadius(half1Ctrs);
n0 /= mag(n0) + VSMALL;
n1 /= mag(n1) + VSMALL;
if (debug)
{
Pout<< "cyclicPolyPatch::getCentresAndAnchors :"
<< " patch:" << name()
<< " Specified rotation :"
<< " n0:" << n0 << " n1:" << n1 << endl;
}
......@@ -485,6 +483,7 @@ void Foam::cyclicPolyPatch::getCentresAndAnchors
if (debug)
{
Pout<< "cyclicPolyPatch::getCentresAndAnchors :"
<< " patch:" << name()
<< "Specified translation : " << separationVector_
<< endl;
}
......@@ -516,6 +515,7 @@ void Foam::cyclicPolyPatch::getCentresAndAnchors
if (debug)
{
Pout<< "cyclicPolyPatch::getCentresAndAnchors :"
<< " patch:" << name()
<< " Detected rotation :"
<< " n0:" << n0 << " n1:" << n1 << endl;
}
......@@ -548,6 +548,7 @@ void Foam::cyclicPolyPatch::getCentresAndAnchors
if (debug)
{
Pout<< "cyclicPolyPatch::getCentresAndAnchors :"
<< " patch:" << name()
<< " Detected translation :"
<< " n0:" << n0 << " n1:" << n1
<< " ctr0:" << ctr0 << " ctr1:" << ctr1 << endl;
......@@ -566,30 +567,29 @@ void Foam::cyclicPolyPatch::getCentresAndAnchors
}
Foam::label Foam::cyclicPolyPatch::getConsistentRotationFace
Foam::vector Foam::cyclicPolyPatch::findFaceMaxRadius
(
const pointField& faceCentres
) const
{
// Determine a face furthest away from the axis
const scalarField magRadSqr
(
magSqr((faceCentres - rotationCentre_) ^ rotationAxis_)
);
const vectorField n((faceCentres - rotationCentre_) ^ rotationAxis_);
const scalarField magRadSqr(magSqr(n));
label rotFace = findMax(magRadSqr);
label faceI = findMax(magRadSqr);
if (debug)
{
Info<< "getConsistentRotationFace(const pointField&)" << nl
<< " rotFace = " << rotFace << nl
<< " point = " << faceCentres[rotFace] << nl
<< " distance = " << Foam::sqrt(magRadSqr[rotFace])
Info<< "findFaceMaxRadius(const pointField&) : patch: " << name() << nl
<< " rotFace = " << faceI << nl
<< " point = " << faceCentres[faceI] << nl
<< " distance = " << Foam::sqrt(magRadSqr[faceI])
<< endl;
}
return rotFace;
return n[faceI];
}
......
......@@ -130,9 +130,8 @@ class cyclicPolyPatch
scalarField& tols
) const;
//- For rotational cases, try to find a unique face on each side
// of the cyclic.
label getConsistentRotationFace(const pointField&) const;
//- Return normal of face at max distance from rotation axis
vector findFaceMaxRadius(const pointField& faceCentres) const;
protected:
......
......@@ -30,6 +30,7 @@ License
#include "Time.H"
#include "addToRunTimeSelectionTable.H"
#include "faceAreaIntersect.H"
#include "ops.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
......@@ -44,63 +45,68 @@ namespace Foam
// * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * * //
Foam::label Foam::cyclicAMIPolyPatch::findFaceMaxRadius
Foam::vector Foam::cyclicAMIPolyPatch::findFaceMaxRadius
(
const pointField& faceCentres
) const
{
// Determine a face furthest away from the axis
const scalarField magRadSqr
(
magSqr((faceCentres - rotationCentre_) ^ rotationAxis_)
);
const vectorField n((faceCentres - rotationCentre_) ^ rotationAxis_);
const scalarField magRadSqr(magSqr(n));
label faceI = findMax(magRadSqr);
if (debug)
{
Info<< "findFaceMaxRadius(const pointField&)" << nl
Info<< "findFaceMaxRadius(const pointField&) : patch: " << name() << nl
<< " rotFace = " << faceI << nl
<< " point = " << faceCentres[faceI] << nl
<< " point = " << faceCentres[faceI] << nl
<< " distance = " << Foam::sqrt(magRadSqr[faceI])
<< endl;
}
return faceI;
return n[faceI];
}
// * * * * * * * * * * * Protecetd Member Functions * * * * * * * * * * * * //
// * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * * //
void Foam::cyclicAMIPolyPatch::calcTransforms()
{
if (size())
// Half0
const cyclicAMIPolyPatch& half0 = *this;
vectorField half0Areas(half0.size());
forAll(half0, facei)
{
// Half0
const cyclicAMIPolyPatch& half0 = *this;
vectorField half0Areas(half0.size());
forAll(half0, facei)
{
half0Areas[facei] = half0[facei].normal(half0.points());
}
half0Areas[facei] = half0[facei].normal(half0.points());
}
// Half1
const cyclicAMIPolyPatch& half1 = neighbPatch();
vectorField half1Areas(half1.size());
forAll(half1, facei)
{
half1Areas[facei] = half1[facei].normal(half1.points());
}
// Half1
const cyclicAMIPolyPatch& half1 = neighbPatch();
vectorField half1Areas(half1.size());
forAll(half1, facei)
{
half1Areas[facei] = half1[facei].normal(half1.points());
}
calcTransforms
(
half0,
half0.faceCentres(),
half0Areas,
half1.faceCentres(),
half1Areas
);
calcTransforms
(
half0,
half0.faceCentres(),
half0Areas,
half1.faceCentres(),
half1Areas
);
if (debug)
{
Pout<< "calcTransforms() : patch: " << name() << nl
<< " forwardT = " << forwardT() << nl
<< " reverseT = " << reverseT() << nl
<< " separation = " << separation() << nl
<< " collocated = " << collocated() << nl << endl;
}
}
......@@ -128,26 +134,30 @@ void Foam::cyclicAMIPolyPatch::calcTransforms
// Calculate transformation tensors
if ((half0Ctrs.size() <= 0) || (half1Ctrs.size() <= 0))
{
return;
}
switch (transform_)
{
case ROTATIONAL:
{
label face0 = findFaceMaxRadius(half0Ctrs);
label face1 = findFaceMaxRadius(half1Ctrs);
point n0 = vector::zero;
if (half0Ctrs.size())
{
n0 = findFaceMaxRadius(half0Ctrs);
}
point n1 = vector::zero;
if (half1Ctrs.size())
{
n1 = -findFaceMaxRadius(half1Ctrs);
}
reduce(n0, maxMagSqrOp<point>());
reduce(n1, maxMagSqrOp<point>());
vector n0 = ((half0Ctrs[face0] - rotationCentre_) ^ rotationAxis_);
vector n1 = ((half1Ctrs[face1] - rotationCentre_) ^ -rotationAxis_);
n0 /= mag(n0) + VSMALL;
n1 /= mag(n1) + VSMALL;
if (debug)
{
Pout<< "cyclicAMIPolyPatch::calcTransforms :"
Pout<< "cyclicAMIPolyPatch::calcTransforms : patch:" << name()
<< " Specified rotation :"
<< " n0:" << n0 << " n1:" << n1 << endl;
}
......@@ -178,8 +188,8 @@ void Foam::cyclicAMIPolyPatch::calcTransforms
{
if (debug)
{
Pout<< "cyclicAMIPolyPatch::calcTransforms :"
<< "Specified translation : " << separationVector_
Pout<< "cyclicAMIPolyPatch::calcTransforms : patch:" << name()
<< " Specified translation : " << separationVector_
<< endl;
}
......@@ -198,7 +208,8 @@ void Foam::cyclicAMIPolyPatch::calcTransforms
{
if (debug)
{
Pout<< "Assuming cyclic AMI pairs are colocated" << endl;
Pout<< " patch:" << name()
<< " Assuming cyclic AMI pairs are colocated" << endl;
}
const_cast<tensorField&>(forwardT()).clear();
......@@ -232,7 +243,8 @@ void Foam::cyclicAMIPolyPatch::resetAMI() const
if (debug)
{
OFstream os(name() + "_neighbourPatch-org.obj");
const Time& t = boundaryMesh().mesh().time();
OFstream os(t.path()/name() + "_neighbourPatch-org.obj");
meshTools::writeOBJ(os, neighbPatch().localFaces(), nbrPoints);
}
......@@ -250,10 +262,11 @@ void Foam::cyclicAMIPolyPatch::resetAMI() const
if (debug)
{
OFstream osN(name() + "_neighbourPatch-trans.obj");
const Time& t = boundaryMesh().mesh().time();
OFstream osN(t.path()/name() + "_neighbourPatch-trans.obj");
meshTools::writeOBJ(osN, nbrPatch0.localFaces(), nbrPoints);
OFstream osO(name() + "_ownerPatch.obj");
OFstream osO(t.path()/name() + "_ownerPatch.obj");
meshTools::writeOBJ(osO, this->localFaces(), localPoints());
}
......@@ -451,10 +464,10 @@ Foam::cyclicAMIPolyPatch::cyclicAMIPolyPatch
coupledPolyPatch(pp, bm),
nbrPatchName_(pp.nbrPatchName_),
nbrPatchID_(-1),
transform_(UNKNOWN),
rotationAxis_(vector::zero),
rotationCentre_(point::zero),
separationVector_(vector::zero),
transform_(pp.transform_),
rotationAxis_(pp.rotationAxis_),
rotationCentre_(pp.rotationCentre_),
separationVector_(pp.separationVector_),
AMIPtr_(NULL),
surfPtr_(NULL),
surfDict_(dictionary::null)
......@@ -477,10 +490,10 @@ Foam::cyclicAMIPolyPatch::cyclicAMIPolyPatch
coupledPolyPatch(pp, bm, index, newSize, newStart),
nbrPatchName_(nbrPatchName),
nbrPatchID_(-1),
transform_(UNKNOWN),
rotationAxis_(vector::zero),
rotationCentre_(point::zero),
separationVector_(vector::zero),
transform_(pp.transform_),
rotationAxis_(pp.rotationAxis_),
rotationCentre_(pp.rotationCentre_),
separationVector_(pp.separationVector_),
AMIPtr_(NULL),
surfPtr_(NULL),
surfDict_(dictionary::null)
......@@ -535,6 +548,23 @@ Foam::cyclicAMIPolyPatch::~cyclicAMIPolyPatch()
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
bool Foam::cyclicAMIPolyPatch::coupled() const
{
if
(
Pstream::parRun()
|| (size() && neighbPatch().size())
)
{
return true;
}
else
{
return false;
}
}
Foam::label Foam::cyclicAMIPolyPatch::neighbPatchID() const
{
if (nbrPatchID_ == -1)
......@@ -769,6 +799,7 @@ void Foam::cyclicAMIPolyPatch::write(Ostream& os) const
coupledPolyPatch::write(os);
os.writeKeyword("neighbourPatch") << nbrPatchName_
<< token::END_STATEMENT << nl;
switch (transform_)
{
case ROTATIONAL:
......@@ -801,8 +832,12 @@ void Foam::cyclicAMIPolyPatch::write(Ostream& os) const
}
}
os.writeKeyword(surfDict_.dictName());
os << surfDict_;
if (surfDict_ != dictionary::null)
{
os.writeKeyword(surfDict_.dictName());
os << surfDict_;
}
}
......
......@@ -97,8 +97,8 @@ private:
// Private Member Functions
//- Return face ID of face at max distance from rotation axis
label findFaceMaxRadius(const pointField& faceCentres) const;
//- Return normal of face at max distance from rotation axis
vector findFaceMaxRadius(const pointField& faceCentres) const;
void calcTransforms
(
......@@ -254,6 +254,11 @@ public:
// Access
//- Return true only if is coupled. Note that for non-parallel
// operation of a decomposed case this can return the wrong
// result
virtual bool coupled() const;
//- Neighbour patch name
inline const word& neighbPatchName() const;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment