diff --git a/src/OpenFOAM/meshes/polyMesh/polyPatches/constraint/cyclic/cyclicPolyPatch.C b/src/OpenFOAM/meshes/polyMesh/polyPatches/constraint/cyclic/cyclicPolyPatch.C index 3dace6a53e06dab9c8e3417f0f90e68df1aa0181..bd06a2755b8ea87e35540050192130c1380d7c95 100644 --- a/src/OpenFOAM/meshes/polyMesh/polyPatches/constraint/cyclic/cyclicPolyPatch.C +++ b/src/OpenFOAM/meshes/polyMesh/polyPatches/constraint/cyclic/cyclicPolyPatch.C @@ -194,6 +194,9 @@ void Foam::cyclicPolyPatch::calcTransforms vectorField half0Normals(half0Areas.size()); vectorField half1Normals(half1Areas.size()); + scalar maxCos = -GREAT; + label maxFacei = -1; + forAll(half0, facei) { scalar magSf = mag(half0Areas[facei]); @@ -233,9 +236,34 @@ void Foam::cyclicPolyPatch::calcTransforms { half0Normals[facei] = half0Areas[facei] / magSf; half1Normals[facei] = half1Areas[facei] / nbrMagSf; + + if (transform_ == ROTATIONAL) + { + scalar cos = mag(half0Normals[facei] & rotationAxis_); + if (cos > maxCos) + { + maxCos = cos; + maxFacei = facei; + } + } } } + if (maxCos > sqrt(SMALL)) + { + WarningIn + ( + "cyclicPolyPatch::calcTransforms()" + ) << "on patch " << name() + << " face:" << maxFacei << " fc:" << half0Ctrs[maxFacei] + << " is not perpendicular to the rotationAxis." << endl + << "This might cause conservation problems" + << " or problems with geometry or topology changes." << endl + << "rotation axis : " << rotationAxis_ << endl + << "face normal : " << half0Normals[maxFacei] << endl + << "cosine of angle : " << maxCos << endl; + } + // Calculate transformation tensors calcTransformTensors ( @@ -450,6 +478,35 @@ Foam::cyclicPolyPatch::cyclicPolyPatch } +Foam::cyclicPolyPatch::cyclicPolyPatch +( + const word& name, + const label size, + const label start, + const label index, + const polyBoundaryMesh& bm, + const word& neighbPatchName, + const transformType transform, + const vector& rotationAxis, + const point& rotationCentre, + const vector& separationVector +) +: + coupledPolyPatch(name, size, start, index, bm), + neighbPatchName_(neighbPatchName), + neighbPatchID_(-1), + transform_(transform), + rotationAxis_(rotationAxis), + rotationCentre_(rotationCentre), + separationVector_(separationVector), + coupledPointsPtr_(NULL), + coupledEdgesPtr_(NULL) +{ + // Neighbour patch might not be valid yet so no transformation + // calculation possible. +} + + Foam::cyclicPolyPatch::cyclicPolyPatch ( const word& name, diff --git a/src/OpenFOAM/meshes/polyMesh/polyPatches/constraint/cyclic/cyclicPolyPatch.H b/src/OpenFOAM/meshes/polyMesh/polyPatches/constraint/cyclic/cyclicPolyPatch.H index 9e9e3510edd44877b35da74d4dea7a573691ff3f..cd3c3081a95afd7ced3bbb5e26608f79cf3f925e 100644 --- a/src/OpenFOAM/meshes/polyMesh/polyPatches/constraint/cyclic/cyclicPolyPatch.H +++ b/src/OpenFOAM/meshes/polyMesh/polyPatches/constraint/cyclic/cyclicPolyPatch.H @@ -213,6 +213,21 @@ public: const polyBoundaryMesh& bm ); + //- Construct from components + cyclicPolyPatch + ( + const word& name, + const label size, + const label start, + const label index, + const polyBoundaryMesh& bm, + const word& neighbPatchName, + const transformType transform, // transformation type + const vector& rotationAxis, // for rotation only + const point& rotationCentre, // for rotation only + const vector& separationVector // for translation only + ); + //- Construct from dictionary cyclicPolyPatch (