diff --git a/applications/utilities/mesh/manipulation/checkMesh/checkGeometry.C b/applications/utilities/mesh/manipulation/checkMesh/checkGeometry.C index 32e260f5fa99435c2c0dabb44fe173fa36dc3d96..8677f08c65919bdaebb8fb16de3cc1ab4da3c20b 100644 --- a/applications/utilities/mesh/manipulation/checkMesh/checkGeometry.C +++ b/applications/utilities/mesh/manipulation/checkMesh/checkGeometry.C @@ -19,7 +19,7 @@ Foam::label Foam::findOppositeWedge { const polyBoundaryMesh& patches = mesh.boundaryMesh(); - scalar wppCosAngle = wpp.centreNormal()&wpp.patchNormal(); + scalar wppCosAngle = wpp.cosAngle(); forAll(patches, patchI) { @@ -30,13 +30,11 @@ Foam::label Foam::findOppositeWedge && isA<wedgePolyPatch>(patches[patchI]) ) { - const wedgePolyPatch& pp = refCast<const wedgePolyPatch> - ( - patches[patchI] - ); + const wedgePolyPatch& pp = + refCast<const wedgePolyPatch>(patches[patchI]); // Calculate (cos of) angle to wpp (not pp!) centre normal - scalar ppCosAngle = wpp.centreNormal()&pp.patchNormal(); + scalar ppCosAngle = wpp.centreNormal() & pp.n(); if ( @@ -73,12 +71,10 @@ bool Foam::checkWedges { if (patches[patchI].size() && isA<wedgePolyPatch>(patches[patchI])) { - const wedgePolyPatch& pp = refCast<const wedgePolyPatch> - ( - patches[patchI] - ); + const wedgePolyPatch& pp = + refCast<const wedgePolyPatch>(patches[patchI]); - scalar wedgeAngle = acos(pp.centreNormal()&pp.patchNormal()); + scalar wedgeAngle = acos(pp.cosAngle()); if (report) { @@ -100,10 +96,8 @@ bool Foam::checkWedges return true; } - const wedgePolyPatch& opp = refCast<const wedgePolyPatch> - ( - patches[oppositePatchI] - ); + const wedgePolyPatch& opp = + refCast<const wedgePolyPatch>(patches[oppositePatchI]); if (mag(opp.axis() & pp.axis()) < (1-1e-3)) @@ -140,7 +134,7 @@ bool Foam::checkWedges forAll(pp.meshPoints(), i) { const point& pt = p[pp.meshPoints()[i]]; - scalar d = mag((pt-p0) & pp.patchNormal()); + scalar d = mag((pt - p0) & pp.n()); if (d > sqrt(SMALL)) { @@ -385,10 +379,8 @@ bool Foam::checkCoupledPoints { if (patches[patchI].coupled()) { - const coupledPolyPatch& cpp = refCast<const coupledPolyPatch> - ( - patches[patchI] - ); + const coupledPolyPatch& cpp = + refCast<const coupledPolyPatch>(patches[patchI]); if (cpp.owner()) { diff --git a/src/OpenFOAM/meshes/pointMesh/pointPatches/constraint/wedge/wedgePointPatch.C b/src/OpenFOAM/meshes/pointMesh/pointPatches/constraint/wedge/wedgePointPatch.C index c335911c55a42c247970d1e071c33bef2abb2d6d..56dba9971a2af0729ca22671a86cb699fee818c0 100644 --- a/src/OpenFOAM/meshes/pointMesh/pointPatches/constraint/wedge/wedgePointPatch.C +++ b/src/OpenFOAM/meshes/pointMesh/pointPatches/constraint/wedge/wedgePointPatch.C @@ -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-2014 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -21,9 +21,6 @@ License You should have received a copy of the GNU General Public License along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. -Description - Wedge front and back plane patch - \*---------------------------------------------------------------------------*/ #include "wedgePointPatch.H" @@ -46,6 +43,19 @@ namespace Foam } +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::wedgePointPatch::wedgePointPatch +( + const polyPatch& patch, + const pointBoundaryMesh& bm +) +: + facePointPatch(patch, bm), + wedgePolyPatch_(refCast<const wedgePolyPatch>(patch)) +{} + + // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // void Foam::wedgePointPatch::applyConstraint @@ -54,7 +64,7 @@ void Foam::wedgePointPatch::applyConstraint pointConstraint& pc ) const { - pc.applyConstraint(pointNormals()[pointi]); + pc.applyConstraint(wedgePolyPatch_.n()); } diff --git a/src/OpenFOAM/meshes/pointMesh/pointPatches/constraint/wedge/wedgePointPatch.H b/src/OpenFOAM/meshes/pointMesh/pointPatches/constraint/wedge/wedgePointPatch.H index a62acfaa90d29bc9258772b4e5042ccae32563a3..0a437c321882b2f75a4a3646edd987f4bb582829 100644 --- a/src/OpenFOAM/meshes/pointMesh/pointPatches/constraint/wedge/wedgePointPatch.H +++ b/src/OpenFOAM/meshes/pointMesh/pointPatches/constraint/wedge/wedgePointPatch.H @@ -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-2014 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -51,6 +51,11 @@ class wedgePointPatch : public facePointPatch { + // Private data + + //- Local reference cast into the symmetryPlane patch + const wedgePolyPatch& wedgePolyPatch_; + public: @@ -65,10 +70,7 @@ public: ( const polyPatch& patch, const pointBoundaryMesh& bm - ) - : - facePointPatch(patch, bm) - {} + ); // Member Functions @@ -85,6 +87,12 @@ public: const label pointi, pointConstraint& ) const; + + //- Return symmetry plane normal + const vector& n() const + { + return wedgePolyPatch_.n(); + } }; diff --git a/src/OpenFOAM/meshes/polyMesh/mapPolyMesh/faceMapper/faceMapper.C b/src/OpenFOAM/meshes/polyMesh/mapPolyMesh/faceMapper/faceMapper.C index e95fbe95f9149a8d439c82691291a497e1ecd68d..803e523d41db27ee9506eb61dae23bcb99a08426 100644 --- a/src/OpenFOAM/meshes/polyMesh/mapPolyMesh/faceMapper/faceMapper.C +++ b/src/OpenFOAM/meshes/polyMesh/mapPolyMesh/faceMapper/faceMapper.C @@ -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-2014 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -28,9 +28,6 @@ License #include "polyMesh.H" #include "mapPolyMesh.H" -// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // - - // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // void Foam::faceMapper::calcAddressing() const @@ -168,7 +165,7 @@ void Foam::faceMapper::calcAddressing() const } - // Grab inserted points (for them the size of addressing is still zero) + // Grab inserted faces (for them the size of addressing is still zero) insertedFaceLabelsPtr_ = new labelList(mesh_.nFaces()); labelList& insertedFaces = *insertedFaceLabelsPtr_; @@ -413,13 +410,4 @@ const Foam::labelList& Foam::faceMapper::oldPatchSizes() const } -// * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * // - - -// * * * * * * * * * * * * * * * Friend Functions * * * * * * * * * * * * * // - - -// * * * * * * * * * * * * * * * Friend Operators * * * * * * * * * * * * * // - - // ************************************************************************* // diff --git a/src/OpenFOAM/meshes/polyMesh/polyMesh.C b/src/OpenFOAM/meshes/polyMesh/polyMesh.C index cd70eb39991b7dededca438995b21f74bd1db6bb..668a595321efd913be23f707f7dfa193426003fe 100644 --- a/src/OpenFOAM/meshes/polyMesh/polyMesh.C +++ b/src/OpenFOAM/meshes/polyMesh/polyMesh.C @@ -921,7 +921,6 @@ Foam::polyMesh::cellTree() const } -// Add boundary patches. Constructor helper void Foam::polyMesh::addPatches ( const List<polyPatch*>& p, @@ -968,7 +967,6 @@ void Foam::polyMesh::addPatches } -// Add mesh zones. Constructor helper void Foam::polyMesh::addZones ( const List<pointZone*>& pz, @@ -1084,7 +1082,6 @@ const Foam::labelList& Foam::polyMesh::faceNeighbour() const } -// Return old mesh motion points const Foam::pointField& Foam::polyMesh::oldPoints() const { if (oldPointsPtr_.empty()) @@ -1129,11 +1126,14 @@ Foam::tmp<Foam::scalarField> Foam::polyMesh::movePoints points_ = newPoints; + bool moveError = false; if (debug) { // Check mesh motion if (checkMeshMotion(points_, true)) { + moveError = true; + Info<< "tmp<scalarField> polyMesh::movePoints" << "(const pointField&) : " << "Moving the mesh with given points will " @@ -1176,6 +1176,12 @@ Foam::tmp<Foam::scalarField> Foam::polyMesh::movePoints const_cast<Time&>(time()).functionObjects().movePoints(*this); + + if (debug && moveError) + { + write(); + } + return sweptVols; } @@ -1219,7 +1225,6 @@ Foam::label& Foam::polyMesh::comm() } -// Remove all files and some subdirs (eg, sets) void Foam::polyMesh::removeFiles(const fileName& instanceDir) const { fileName meshFilesPath = thisDb().time().path()/instanceDir/meshDir(); diff --git a/src/OpenFOAM/meshes/polyMesh/polyPatches/constraint/wedge/wedgePolyPatch.C b/src/OpenFOAM/meshes/polyMesh/polyPatches/constraint/wedge/wedgePolyPatch.C index b7c9783cb984dad0c2cf0691c9afd93fac55b36b..e12d22e5a5c43bf388bd44d5737af2f534f3e01e 100644 --- a/src/OpenFOAM/meshes/polyMesh/polyPatches/constraint/wedge/wedgePolyPatch.C +++ b/src/OpenFOAM/meshes/polyMesh/polyPatches/constraint/wedge/wedgePolyPatch.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2012 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2014 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -40,56 +40,90 @@ namespace Foam // * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * * // -void Foam::wedgePolyPatch::initTransforms() +void Foam::wedgePolyPatch::calcGeometry(PstreamBuffers&) { - if (size() > 0) + if (axis_ != vector::rootMax) { - const pointField& points = this->points(); + return; + } + + if (returnReduce(size(), sumOp<label>())) + { + const vectorField& nf(faceNormals()); + n_ = gAverage(nf); + + if (debug) + { + Info<< "Patch " << name() << " calculated average normal " + << n_ << endl; + } - patchNormal_ = operator[](0).normal(points); - patchNormal_ /= mag(patchNormal_); + + // Check the wedge is planar + forAll(nf, faceI) + { + if (magSqr(n_ - nf[faceI]) > SMALL) + { + // only issue warning instead of error so that the case can + // still be read for post-processing + WarningIn + ( + "wedgePolyPatch::calcGeometry(PstreamBuffers&)" + ) + << "Wedge patch '" << name() << "' is not planar." << nl + << "At local face at " + << primitivePatch::faceCentres()[faceI] + << " the normal " << nf[faceI] + << " differs from the average normal " << n_ + << " by " << magSqr(n_ - nf[faceI]) << nl + << "Either correct the patch or split it into planar parts" + << endl; + } + } centreNormal_ = vector ( - sign(patchNormal_.x())*(max(mag(patchNormal_.x()), 0.5) - 0.5), - sign(patchNormal_.y())*(max(mag(patchNormal_.y()), 0.5) - 0.5), - sign(patchNormal_.z())*(max(mag(patchNormal_.z()), 0.5) - 0.5) + sign(n_.x())*(max(mag(n_.x()), 0.5) - 0.5), + sign(n_.y())*(max(mag(n_.y()), 0.5) - 0.5), + sign(n_.z())*(max(mag(n_.z()), 0.5) - 0.5) ); centreNormal_ /= mag(centreNormal_); + cosAngle_ = centreNormal_ & n_; + const scalar cnCmptSum = centreNormal_.x() + centreNormal_.y() + centreNormal_.z(); if (mag(cnCmptSum) < (1 - SMALL)) { - FatalErrorIn("wedgePolyPatch::initTransforms()") + FatalErrorIn("wedgePolyPatch::calcGeometry(PstreamBuffers&)") << "wedge " << name() << " centre plane does not align with a coordinate plane by " << 1 - mag(cnCmptSum) << exit(FatalError); } - axis_ = centreNormal_ ^ patchNormal_; + axis_ = centreNormal_ ^ n_; scalar magAxis = mag(axis_); if (magAxis < SMALL) { - FatalErrorIn("wedgePolyPatch::initTransforms()") + FatalErrorIn("wedgePolyPatch::calcGeometry(PstreamBuffers&)") << "wedge " << name() << " plane aligns with a coordinate plane." << nl << " The wedge plane should make a small angle (~2.5deg)" " with the coordinate plane" << nl << " and the the pair of wedge planes should be symmetric" << " about the coordinate plane." << nl - << " Normal of face " << 0 << " is " << patchNormal_ + << " Normal of wedge plane is " << n_ << " , implied coordinate plane direction is " << centreNormal_ << exit(FatalError); } axis_ /= magAxis; - faceT_ = rotationTensor(centreNormal_, patchNormal_); + faceT_ = rotationTensor(centreNormal_, n_); cellT_ = faceT_ & faceT_; } } @@ -107,10 +141,14 @@ Foam::wedgePolyPatch::wedgePolyPatch const word& patchType ) : - polyPatch(name, size, start, index, bm, patchType) -{ - initTransforms(); -} + polyPatch(name, size, start, index, bm, patchType), + axis_(vector::rootMax), + centreNormal_(vector::rootMax), + n_(vector::rootMax), + cosAngle_(0.0), + faceT_(tensor::zero), + cellT_(tensor::zero) +{} Foam::wedgePolyPatch::wedgePolyPatch @@ -122,10 +160,14 @@ Foam::wedgePolyPatch::wedgePolyPatch const word& patchType ) : - polyPatch(name, dict, index, bm, patchType) -{ - initTransforms(); -} + polyPatch(name, dict, index, bm, patchType), + axis_(vector::rootMax), + centreNormal_(vector::rootMax), + n_(vector::rootMax), + cosAngle_(0.0), + faceT_(tensor::zero), + cellT_(tensor::zero) +{} Foam::wedgePolyPatch::wedgePolyPatch @@ -134,10 +176,14 @@ Foam::wedgePolyPatch::wedgePolyPatch const polyBoundaryMesh& bm ) : - polyPatch(pp, bm) -{ - initTransforms(); -} + polyPatch(pp, bm), + axis_(pp.axis_), + centreNormal_(pp.centreNormal_), + n_(pp.n_), + cosAngle_(pp.cosAngle_), + faceT_(pp.faceT_), + cellT_(pp.cellT_) +{} Foam::wedgePolyPatch::wedgePolyPatch @@ -149,10 +195,14 @@ Foam::wedgePolyPatch::wedgePolyPatch const label newStart ) : - polyPatch(pp, bm, index, newSize, newStart) -{ - initTransforms(); -} + polyPatch(pp, bm, index, newSize, newStart), + axis_(pp.axis_), + centreNormal_(pp.centreNormal_), + n_(pp.n_), + cosAngle_(pp.cosAngle_), + faceT_(pp.faceT_), + cellT_(pp.cellT_) +{} Foam::wedgePolyPatch::wedgePolyPatch @@ -164,10 +214,14 @@ Foam::wedgePolyPatch::wedgePolyPatch const label newStart ) : - polyPatch(pp, bm, index, mapAddressing, newStart) -{ - initTransforms(); -} + polyPatch(pp, bm, index, mapAddressing, newStart), + axis_(pp.axis_), + centreNormal_(pp.centreNormal_), + n_(pp.n_), + cosAngle_(pp.cosAngle_), + faceT_(pp.faceT_), + cellT_(pp.cellT_) +{} // ************************************************************************* // diff --git a/src/OpenFOAM/meshes/polyMesh/polyPatches/constraint/wedge/wedgePolyPatch.H b/src/OpenFOAM/meshes/polyMesh/polyPatches/constraint/wedge/wedgePolyPatch.H index 2caa492d9f143c60b6a656c75fdf859bede26b2f..9e434cd636db58ef7fe32d429ccada434b83449f 100644 --- a/src/OpenFOAM/meshes/polyMesh/polyPatches/constraint/wedge/wedgePolyPatch.H +++ b/src/OpenFOAM/meshes/polyMesh/polyPatches/constraint/wedge/wedgePolyPatch.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2012 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2014 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -59,7 +59,10 @@ class wedgePolyPatch vector centreNormal_; //- Normal to the patch - vector patchNormal_; + vector n_; + + //- Cosine of the wedge angle + scalar cosAngle_; //- Face transformation tensor tensor faceT_; @@ -67,8 +70,13 @@ class wedgePolyPatch //- Neighbour-cell transformation tensor tensor cellT_; - //- Calculate the above tensors - void initTransforms(); + +protected: + + // Protected Member Functions + + //- Calculate the patch geometry + virtual void calcGeometry(PstreamBuffers&); public: @@ -180,9 +188,15 @@ public: } //- Return the normal to the patch - const vector& patchNormal() const + const vector& n() const + { + return n_; + } + + //- Return the cosine of the wedge angle + scalar cosAngle() const { - return patchNormal_; + return cosAngle_; } //- Return face transformation tensor diff --git a/src/dynamicMesh/layerAdditionRemoval/addCellLayer.C b/src/dynamicMesh/layerAdditionRemoval/addCellLayer.C index c05731781fd8d80194118c61d9f6cf5c05237448..0fffb4aa359377305fc11fcaf114568e7c888931 100644 --- a/src/dynamicMesh/layerAdditionRemoval/addCellLayer.C +++ b/src/dynamicMesh/layerAdditionRemoval/addCellLayer.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2014 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -35,7 +35,6 @@ License // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // -//- Calculate the offset to the next layer Foam::tmp<Foam::vectorField> Foam::layerAdditionRemoval::extrusionDir() const { const polyMesh& mesh = topoChanger().mesh(); @@ -79,6 +78,7 @@ Foam::tmp<Foam::vectorField> Foam::layerAdditionRemoval::extrusionDir() const extrusionDir = minLayerThickness_*masterFaceLayer.pointNormals(); } + return textrusionDir; } @@ -120,7 +120,7 @@ void Foam::layerAdditionRemoval::addCellLayer // Get the extrusion direction for the added points - tmp<vectorField> tpointOffsets = extrusionDir(); + const vectorField pointOffsets(extrusionDir()); // Add the new points labelList addedPoints(mp.size()); @@ -135,7 +135,7 @@ void Foam::layerAdditionRemoval::addCellLayer polyAddPoint ( points[mp[pointI]] // point - + addDelta_*tpointOffsets()[pointI], + + addDelta_*pointOffsets[pointI], mp[pointI], // master point -1, // zone for point true // supports a cell @@ -143,14 +143,18 @@ void Foam::layerAdditionRemoval::addCellLayer ); } - // Pout<< "mp: " << mp << " addedPoints: " << addedPoints << endl; + if (debug > 1) + { + Pout<< "mp: " << mp << " addedPoints: " << addedPoints << endl; + } + // Create the cells const labelList& mc = mesh.faceZones()[faceZoneID_.index()].masterCells(); const labelList& sc = mesh.faceZones()[faceZoneID_.index()].slaveCells(); - // Pout<< "mc: " << mc << " sc: " << sc << endl; + const labelList& mf = mesh.faceZones()[faceZoneID_.index()]; const boolList& mfFlip = mesh.faceZones()[faceZoneID_.index()].flipMap(); @@ -231,10 +235,13 @@ void Foam::layerAdditionRemoval::addCellLayer ) ); - // Pout<< "adding face: " << newFace - // << " own: " << mc[faceI] - // << " nei: " << addedCells[faceI] - // << endl; + if (debug > 1) + { + Pout<< "adding face: " << newFace + << " own: " << mc[faceI] + << " nei: " << addedCells[faceI] + << endl; + } } // Modify the faces from the master zone for the new neighbour @@ -267,10 +274,14 @@ void Foam::layerAdditionRemoval::addCellLayer ) ); - // Pout<< "Modifying a boundary face. Face: " << curfaceID - // << " flip: " << mfFlip[faceI] - // << endl; + if (debug > 1) + { + Pout<< "Modifying a boundary face. Face: " << curfaceID + << " flip: " << mfFlip[faceI] + << endl; + } } + // If slave cell is owner, the face remains the same (but with // a new neighbour - the newly created cell). Otherwise, the // face is flipped. @@ -293,10 +304,13 @@ void Foam::layerAdditionRemoval::addCellLayer ) ); - // Pout<< "modify face, no flip " << curfaceID - // << " own: " << own[curfaceID] - // << " nei: " << addedCells[faceI] - // << endl; + if (debug > 1) + { + Pout<< "modify face, no flip " << curfaceID + << " own: " << own[curfaceID] + << " nei: " << addedCells[faceI] + << endl; + } } else { @@ -317,10 +331,13 @@ void Foam::layerAdditionRemoval::addCellLayer ) ); - // Pout<< "modify face, with flip " << curfaceID - // << " own: " << own[curfaceID] - // << " nei: " << addedCells[faceI] - // << endl; + if (debug > 1) + { + Pout<< "modify face, with flip " << curfaceID + << " own: " << own[curfaceID] + << " nei: " << addedCells[faceI] + << endl; + } } } @@ -362,10 +379,13 @@ void Foam::layerAdditionRemoval::addCellLayer ) ); - // Pout<< "Add internal face off edge: " << newFace - // << " own: " << addedCells[edgeFaces[curEdgeID][0]] - // << " nei: " << addedCells[edgeFaces[curEdgeID][1]] - // << endl; + if (debug > 1) + { + Pout<< "Add internal face off edge: " << newFace + << " own: " << addedCells[edgeFaces[curEdgeID][0]] + << " nei: " << addedCells[edgeFaces[curEdgeID][1]] + << endl; + } } // Prepare creation of faces from boundary edges. @@ -448,10 +468,13 @@ void Foam::layerAdditionRemoval::addCellLayer ) ); - // Pout<< "add boundary face: " << newFace - // << " into patch " << patchID - // << " own: " << addedCells[edgeFaces[curEdgeID][0]] - // << endl; + if (debug > 1) + { + Pout<< "add boundary face: " << newFace + << " into patch " << patchID + << " own: " << addedCells[edgeFaces[curEdgeID][0]] + << endl; + } } // Modify the remaining faces of the master cells to reconnect to the new @@ -562,12 +585,15 @@ void Foam::layerAdditionRemoval::addCellLayer ) ); - // Pout<< "modifying stick-out face. Internal Old face: " - // << oldFace - // << " new face: " << newFace - // << " own: " << own[curFaceID] - // << " nei: " << nei[curFaceID] - // << endl; + if (debug > 1) + { + Pout<< "modifying stick-out face. Internal Old face: " + << oldFace + << " new face: " << newFace + << " own: " << own[curFaceID] + << " nei: " << nei[curFaceID] + << endl; + } } else { @@ -588,22 +614,24 @@ void Foam::layerAdditionRemoval::addCellLayer ) ); - // Pout<< "modifying stick-out face. Boundary Old face: " - // << oldFace - // << " new face: " << newFace - // << " own: " << own[curFaceID] - // << " patch: " - // << mesh.boundaryMesh().whichPatch(curFaceID) - // << endl; + if (debug > 1) + { + Pout<< "modifying stick-out face. Boundary Old face: " + << oldFace + << " new face: " << newFace + << " own: " << own[curFaceID] + << " patch: " + << mesh.boundaryMesh().whichPatch(curFaceID) + << endl; + } } } } if (debug) { - Pout<< "void layerAdditionRemoval::addCellLayer(" - << "polyTopoChange& ref) const " - << " for object " << name() << " : " + Pout<< "void layerAdditionRemoval::addCellLayer(polyTopoChange&) const " + << " for object " << name() << ": " << "Finished adding cell layer" << endl; } } diff --git a/src/dynamicMesh/layerAdditionRemoval/removeCellLayer.C b/src/dynamicMesh/layerAdditionRemoval/removeCellLayer.C index 955e07a1dab7ad62d164462b5874c4411c60c1e0..5569cc876ef92778caffc921e3b2400484376c7c 100644 --- a/src/dynamicMesh/layerAdditionRemoval/removeCellLayer.C +++ b/src/dynamicMesh/layerAdditionRemoval/removeCellLayer.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2014 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -21,9 +21,6 @@ License You should have received a copy of the GNU General Public License along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. -Description - Remove a layer of cells and prepare addressing data - \*---------------------------------------------------------------------------*/ #include "layerAdditionRemoval.H" @@ -87,6 +84,7 @@ bool Foam::layerAdditionRemoval::validCollapse() const } } + void Foam::layerAdditionRemoval::removeCellLayer ( polyTopoChange& ref @@ -115,7 +113,7 @@ void Foam::layerAdditionRemoval::removeCellLayer // Remove all the cells from the master layer const labelList& mc = - topoChanger().mesh().faceZones()[faceZoneID_.index()].masterCells(); + mesh.faceZones()[faceZoneID_.index()].masterCells(); forAll(mc, faceI) { @@ -205,7 +203,10 @@ void Foam::layerAdditionRemoval::removeCellLayer labelList ftm = facesToModify.toc(); -//Pout<< "faces to modify: " << ftm << endl; + if (debug > 1) + { + Pout<< "faces to modify: " << ftm << endl; + } forAll(ftm, faceI) { @@ -228,9 +229,12 @@ void Foam::layerAdditionRemoval::removeCellLayer } } -//Pout<< "face label: " << curFaceID -// << " old face: " << faces[curFaceID] -// << " new face: " << newFace << endl; + if (debug > 1) + { + Pout<< "face label: " << curFaceID + << " old face: " << faces[curFaceID] + << " new face: " << newFace << endl; + } // Get face zone and its flip label modifiedFaceZone = mesh.faceZones().whichZone(curFaceID); @@ -238,22 +242,15 @@ void Foam::layerAdditionRemoval::removeCellLayer if (modifiedFaceZone >= 0) { - modifiedFaceZoneFlip = - mesh.faceZones()[modifiedFaceZone].flipMap() - [ - mesh.faceZones()[modifiedFaceZone].whichFace(curFaceID) - ]; + const faceZone& fz = mesh.faceZones()[modifiedFaceZone]; + modifiedFaceZoneFlip = fz.flipMap()[fz.whichFace(curFaceID)]; } - label newNei; + label newNeighbour = -1; if (curFaceID < mesh.nInternalFaces()) { - newNei = nei[curFaceID]; - } - else - { - newNei = -1; + newNeighbour = nei[curFaceID]; } // Modify the face @@ -264,7 +261,7 @@ void Foam::layerAdditionRemoval::removeCellLayer newFace, // modified face curFaceID, // label of face being modified own[curFaceID], // owner - newNei, // neighbour + newNeighbour, // neighbour false, // face flip mesh.boundaryMesh().whichPatch(curFaceID),// patch for face false, // remove from zone @@ -285,20 +282,34 @@ void Foam::layerAdditionRemoval::removeCellLayer // of the cell to be removed label masterSideCell = own[mf[faceI]]; - if (mesh.isInternalFace(mf[faceI]) && masterSideCell == mc[faceI]) + if (masterSideCell == mc[faceI]) { - // Owner cell of the face is being removed. - // Grab the neighbour instead - masterSideCell = nei[mf[faceI]]; + if (mesh.isInternalFace(mf[faceI])) + { + // Owner cell of the face is being removed. + // Grab the neighbour instead + masterSideCell = nei[mf[faceI]]; + } + else + { + masterSideCell = -1; + } } label slaveSideCell = own[ftc[faceI]]; - if (mesh.isInternalFace(ftc[faceI]) && slaveSideCell == mc[faceI]) + if (slaveSideCell == mc[faceI]) { - // Owner cell of the face is being removed. - // Grab the neighbour instead - slaveSideCell = nei[ftc[faceI]]; + if (mesh.isInternalFace(ftc[faceI])) + { + // Owner cell of the face is being removed. + // Grab the neighbour instead + slaveSideCell = nei[ftc[faceI]]; + } + else + { + slaveSideCell = -1; + } } // Find out if the face needs to be flipped @@ -374,15 +385,18 @@ void Foam::layerAdditionRemoval::removeCellLayer zoneFlip = !zoneFlip; } -// Pout<< "Modifying face " << mf[faceI] -// << " newFace: " << newFace << nl -// << " newOwner: " << newOwner -// << " newNeighbour: " << newNeighbour -// << " flipFace: " << flipFace -// << " newPatchID: " << newPatchID -// << " newZoneID: " << newZoneID << nl -// << " oldOwn: " << own[mf[faceI]] -// << " oldNei: " << nei[mf[faceI]] << endl; + if (debug > 1) + { + Pout<< "Modifying face " << mf[faceI] + << " newFace: " << newFace << nl + << " newOwner: " << newOwner + << " newNeighbour: " << newNeighbour + << " flipFace: " << flipFace + << " newPatchID: " << newPatchID + << " newZoneID: " << newZoneID << nl + << " oldOwn: " << own[mf[faceI]] + << " oldNei: " << nei[mf[faceI]] << endl; + } ref.setAction ( diff --git a/src/dynamicMesh/layerAdditionRemoval/setLayerPairing.C b/src/dynamicMesh/layerAdditionRemoval/setLayerPairing.C index d41241617757dac034629e5819506247dc7f5913..0e2996e45ecda8fd82041d87f4237f4870dea5d1 100644 --- a/src/dynamicMesh/layerAdditionRemoval/setLayerPairing.C +++ b/src/dynamicMesh/layerAdditionRemoval/setLayerPairing.C @@ -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-2014 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -88,10 +88,14 @@ bool Foam::layerAdditionRemoval::setLayerPairing() const facesPairingPtr_ = new labelList(mf.size(), -1); labelList& ftc = *facesPairingPtr_; - // Pout<< "meshPoints: " << meshPoints << nl - // << "localPoints: " - // << mesh.faceZones()[faceZoneID_.index()]().localPoints() - // << endl; + + if (debug > 1) + { + Pout<< "meshPoints: " << meshPoints << nl + << "localPoints: " + << mesh.faceZones()[faceZoneID_.index()]().localPoints() + << endl; + } // For all faces, create the mapping label nPointErrors = 0; @@ -119,12 +123,15 @@ bool Foam::layerAdditionRemoval::setLayerPairing() const continue; } -// Pout<< "curMasterFace: " << faces[mf[faceI]] << nl -// << "cell shape: " << mesh.cellShapes()[mc[faceI]] << nl -// << "curLocalFace: " << curLocalFace << nl -// << "lidFace: " << lidFace -// << " master index: " << lidFace.masterIndex() -// << " oppositeIndex: " << lidFace.oppositeIndex() << endl; + if (debug > 1) + { + Pout<< "curMasterFace: " << faces[mf[faceI]] << nl + << "cell shape: " << mesh.cellShapes()[mc[faceI]] << nl + << "curLocalFace: " << curLocalFace << nl + << "lidFace: " << lidFace + << " master index: " << lidFace.masterIndex() + << " oppositeIndex: " << lidFace.oppositeIndex() << endl; + } // Grab the opposite face for face collapse addressing ftc[faceI] = lidFace.oppositeIndex(); @@ -145,17 +152,20 @@ bool Foam::layerAdditionRemoval::setLayerPairing() const if (ptc[clp] != lidFace[pointI]) { nPointErrors++; -// Pout<< "Topological error in cell layer pairing. " -// << "This mesh is either topologically incorrect " -// << "or the master afce layer is not defined " -// << "consistently. Please check the " -// << "face zone flip map." << nl -// << "First index: " << ptc[clp] -// << " new index: " << lidFace[pointI] << endl; + + if (debug > 1) + { + Pout<< "Topological error in cell layer pairing. " + << "This mesh is either topologically incorrect " + << "or the master face layer is not defined " + << "consistently. Please check the " + << "face zone flip map." << nl + << "First index: " << ptc[clp] + << " new index: " << lidFace[pointI] << endl; + } } } } -// Pout<< "ptc: " << ptc << endl; } reduce(nPointErrors, sumOp<label>()); diff --git a/src/fvMotionSolver/fvMotionSolvers/displacement/layeredSolver/displacementLayeredMotionMotionSolver.C b/src/fvMotionSolver/fvMotionSolvers/displacement/layeredSolver/displacementLayeredMotionMotionSolver.C index 3ea1d3ed39e0fd91908d8537eb659311c12e9642..137283c1ba89785cd517f785e944a2b7eea1ccc4 100644 --- a/src/fvMotionSolver/fvMotionSolvers/displacement/layeredSolver/displacementLayeredMotionMotionSolver.C +++ b/src/fvMotionSolver/fvMotionSolvers/displacement/layeredSolver/displacementLayeredMotionMotionSolver.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2014 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -30,6 +30,8 @@ License #include "PointEdgeWave.H" #include "syncTools.H" #include "interpolationTable.H" +#include "mapPolyMesh.H" +#include "pointConstraints.H" // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // @@ -111,11 +113,13 @@ void Foam::displacementLayeredMotionMotionSolver::calcZoneMask 0 ); - - Info<< "On cellZone " << cz.name() - << " marked " << returnReduce(nPoints, sumOp<label>()) - << " points and " << returnReduce(nEdges, sumOp<label>()) - << " edges." << endl; + if (debug) + { + Info<< "On cellZone " << cz.name() + << " marked " << returnReduce(nPoints, sumOp<label>()) + << " points and " << returnReduce(nEdges, sumOp<label>()) + << " edges." << endl; + } } } @@ -239,14 +243,21 @@ Foam::displacementLayeredMotionMotionSolver::faceZoneEvaluate { FatalIOErrorIn ( - "displacementLayeredMotionMotionSolver::faceZoneEvaluate(..)", + "displacementLayeredMotionMotionSolver::faceZoneEvaluate" + "(" + "const faceZone&, " + "const labelList&, " + "const dictionary&, " + "const PtrList<pointVectorField>&, " + "const label" + ") const", *this - ) << "slip can only be used on second faceZonePatch of pair." + ) << "slip can only be used on second faceZone patch of pair. " << "FaceZone:" << fz.name() << exit(FatalIOError); } // Use field set by previous bc - fld = vectorField(patchDisp[patchI-1], meshPoints); + fld = vectorField(patchDisp[patchI - 1], meshPoints); } else if (type == "follow") { @@ -269,7 +280,14 @@ Foam::displacementLayeredMotionMotionSolver::faceZoneEvaluate { FatalIOErrorIn ( - "displacementLayeredMotionMotionSolver::faceZoneEvaluate(..)", + "displacementLayeredMotionMotionSolver::faceZoneEvaluate" + "(" + "const faceZone&, " + "const labelList&, " + "const dictionary&, " + "const PtrList<pointVectorField>&, " + "const label" + ") const", *this ) << "Unknown faceZonePatch type " << type << " for faceZone " << fz.name() << exit(FatalIOError); @@ -295,9 +313,9 @@ void Foam::displacementLayeredMotionMotionSolver::cellZoneSolve FatalIOErrorIn ( "displacementLayeredMotionMotionSolver::" - "correctBoundaryConditions(..)", + "cellZoneSolve(const label, const dictionary&)", *this - ) << "Can only handle 2 faceZones (= patches) per cellZone. " + ) << "Two faceZones (patches) must be specifed per cellZone. " << " cellZone:" << cellZoneI << " patches:" << patchesDict.toc() << exit(FatalIOError); @@ -317,7 +335,7 @@ void Foam::displacementLayeredMotionMotionSolver::cellZoneSolve FatalIOErrorIn ( "displacementLayeredMotionMotionSolver::" - "correctBoundaryConditions(..)", + "cellZoneSolve(const label, const dictionary&)", *this ) << "Cannot find faceZone " << faceZoneName << endl << "Valid zones are " << mesh().faceZones().names() @@ -386,14 +404,17 @@ void Foam::displacementLayeredMotionMotionSolver::cellZoneSolve patchI ); - -Info<< "For cellZone:" << cellZoneI - << " for faceZone:" << fz.name() << " nPoints:" << tseed().size() - << " have patchField:" - << " max:" << gMax(tseed()) - << " min:" << gMin(tseed()) - << " avg:" << gAverage(tseed()) - << endl; + if (debug) + { + Info<< "For cellZone:" << cellZoneI + << " for faceZone:" << fz.name() + << " nPoints:" << tseed().size() + << " have patchField:" + << " max:" << gMax(tseed()) + << " min:" << gMin(tseed()) + << " avg:" << gAverage(tseed()) + << endl; + } // Set distance and transported value walkStructured @@ -417,16 +438,15 @@ Info<< "For cellZone:" << cellZoneI // Solve // ~~~~~ - // solving the interior is just interpolating if (debug) { - // Get normalised distance + // Normalised distance pointScalarField distance ( IOobject ( - "distance", + mesh().cellZones()[cellZoneI].name() + ":distance", mesh().time().timeName(), mesh(), IOobject::NO_READ, @@ -434,41 +454,67 @@ Info<< "For cellZone:" << cellZoneI false ), pointMesh::New(mesh()), - dimensionedScalar("distance", dimLength, 0.0) + dimensionedScalar("zero", dimLength, 0.0) ); + forAll(distance, pointI) { - if (isZonePoint[pointI]) + scalar d1 = patchDist[0][pointI]; + scalar d2 = patchDist[1][pointI]; + if (d1 + d2 > SMALL) { - scalar d1 = patchDist[0][pointI]; - scalar d2 = patchDist[1][pointI]; - if (d1+d2 > SMALL) - { - scalar s = d1/(d1+d2); - distance[pointI] = s; - } + scalar s = d1/(d1 + d2); + distance[pointI] = s; } } - Info<< "Writing distance pointScalarField to " + + Info<< "Writing " << pointScalarField::typeName + << distance.name() << " to " << mesh().time().timeName() << endl; distance.write(); } - // Average - forAll(pointDisplacement_, pointI) + + const word interpolationScheme = zoneDict.lookup("interpolationScheme"); + + if (interpolationScheme == "oneSided") { - if (isZonePoint[pointI]) + forAll(pointDisplacement_, pointI) { - scalar d1 = patchDist[0][pointI]; - scalar d2 = patchDist[1][pointI]; + if (isZonePoint[pointI]) + { + pointDisplacement_[pointI] = patchDisp[0][pointI]; + } + } + } + else if (interpolationScheme == "linear") + { + forAll(pointDisplacement_, pointI) + { + if (isZonePoint[pointI]) + { + scalar d1 = patchDist[0][pointI]; + scalar d2 = patchDist[1][pointI]; + scalar s = d1/(d1 + d2 + VSMALL); - scalar s = d1/(d1+d2+VSMALL); + const vector& pd1 = patchDisp[0][pointI]; + const vector& pd2 = patchDisp[1][pointI]; - pointDisplacement_[pointI] = - (1-s)*patchDisp[0][pointI] - + s*patchDisp[1][pointI]; + pointDisplacement_[pointI] = (1 - s)*pd1 + s*pd2; + } } } + else + { + FatalErrorIn + ( + "displacementLayeredMotionMotionSolver::" + "cellZoneSolve(const label, const dictionary&)" + ) + << "Invalid interpolationScheme: " << interpolationScheme + << ". Valid schemes are 'oneSided' and 'linear'" + << exit(FatalError); + } } @@ -502,23 +548,19 @@ Foam::displacementLayeredMotionMotionSolver::curPoints() const points0() + pointDisplacement_.internalField() ); - twoDCorrectPoints(tcurPoints()); - return tcurPoints; } void Foam::displacementLayeredMotionMotionSolver::solve() { - // The points have moved so before interpolation update - // the motionSolver accordingly + // The points have moved so before interpolation update the motionSolver movePoints(mesh().points()); // Apply boundary conditions pointDisplacement_.boundaryField().updateCoeffs(); - // Apply all regions (=cellZones) - + // Solve motion on all regions (=cellZones) const dictionary& regionDicts = coeffDict().subDict("regions"); forAllConstIter(dictionary, regionDicts, regionIter) { @@ -527,14 +569,13 @@ void Foam::displacementLayeredMotionMotionSolver::solve() label zoneI = mesh().cellZones().findZoneID(cellZoneName); - Info<< "solve : zone:" << cellZoneName << " index:" << zoneI - << endl; + Info<< "solving for zone: " << cellZoneName << endl; if (zoneI == -1) { FatalIOErrorIn ( - "displacementLayeredMotionMotionSolver::solve(..)", + "displacementLayeredMotionMotionSolver::solve()", *this ) << "Cannot find cellZone " << cellZoneName << endl << "Valid zones are " << mesh().cellZones().names() @@ -545,7 +586,9 @@ void Foam::displacementLayeredMotionMotionSolver::solve() } // Update pointDisplacement for solved values - pointDisplacement_.correctBoundaryConditions(); + const pointConstraints& pcs = + pointConstraints::New(pointDisplacement_.mesh()); + pcs.constrainDisplacement(pointDisplacement_, false); } @@ -555,6 +598,27 @@ void Foam::displacementLayeredMotionMotionSolver::updateMesh ) { displacementMotionSolver::updateMesh(mpm); + + const vectorField displacement(this->newPoints() - points0_); + + forAll(points0_, pointI) + { + label oldPointI = mpm.pointMap()[pointI]; + + if (oldPointI >= 0) + { + label masterPointI = mpm.reversePointMap()[oldPointI]; + + if ((masterPointI != pointI)) + { + // newly inserted point in this cellZone + + // need to set point0 so that it represents the position that + // it would have had if it had existed for all time + points0_[pointI] -= displacement[pointI]; + } + } + } } diff --git a/src/meshTools/twoDPointCorrector/twoDPointCorrector.C b/src/meshTools/twoDPointCorrector/twoDPointCorrector.C index ad0413e61b22fff214e03a3fc9a4f95b499255f8..798d0f8899b5a107061d0df3d96b89904b7e8030 100644 --- a/src/meshTools/twoDPointCorrector/twoDPointCorrector.C +++ b/src/meshTools/twoDPointCorrector/twoDPointCorrector.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2014 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -28,26 +28,20 @@ License #include "wedgePolyPatch.H" #include "emptyPolyPatch.H" #include "SubField.H" - -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // - -namespace Foam -{ +#include "meshTools.H" // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // -const scalar twoDPointCorrector::edgeOrthogonalityTol = 1.0 - 1e-4; +const Foam::scalar Foam::twoDPointCorrector::edgeOrthogonalityTol = 1.0 - 1e-4; // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // -void twoDPointCorrector::calcAddressing() const +void Foam::twoDPointCorrector::calcAddressing() const { // Find geometry normal planeNormalPtr_ = new vector(0, 0, 0); vector& pn = *planeNormalPtr_; - bool isWedge = false; - // Algorithm: // Attempt to find wedge patch and work out the normal from it. // If not found, find an empty patch with faces in it and use the @@ -61,9 +55,15 @@ void twoDPointCorrector::calcAddressing() const { if (isA<wedgePolyPatch>(patches[patchI])) { - isWedge = true; + isWedge_ = true; + + const wedgePolyPatch& wp = + refCast<const wedgePolyPatch>(patches[patchI]); + + pn = wp.centreNormal(); - pn = refCast<const wedgePolyPatch>(patches[patchI]).centreNormal(); + wedgeAxis_ = wp.axis(); + wedgeAngle_ = mag(acos(wp.cosAngle())); if (polyMesh::debug) { @@ -75,7 +75,7 @@ void twoDPointCorrector::calcAddressing() const } // Try to find an empty patch with faces - if (!isWedge) + if (!isWedge_) { forAll(patches, patchI) { @@ -96,11 +96,8 @@ void twoDPointCorrector::calcAddressing() const if (mag(pn) < VSMALL) { - FatalErrorIn - ( - "twoDPointCorrector::twoDPointCorrector(const polyMesh& mesh, " - "const vector& n)" - ) << "Cannot determine normal vector from patches." + FatalErrorIn("twoDPointCorrector::calcAddressing()") + << "Cannot determine normal vector from patches." << abort(FatalError); } else @@ -125,9 +122,9 @@ void twoDPointCorrector::calcAddressing() const forAll(meshEdges, edgeI) { - vector edgeVector = - meshEdges[edgeI].vec(meshPoints)/ - (meshEdges[edgeI].mag(meshPoints) + VSMALL); + const edge& e = meshEdges[edgeI]; + + vector edgeVector = e.vec(meshPoints)/(e.mag(meshPoints) + VSMALL); if (mag(edgeVector & pn) > edgeOrthogonalityTol) { @@ -141,15 +138,12 @@ void twoDPointCorrector::calcAddressing() const // Construction check: number of points in a read 2-D or wedge geometry // should be odd and the number of edges normal to the plane should be // exactly half the number of points - if (!isWedge) + if (!isWedge_) { if (meshPoints.size() % 2 != 0) { - WarningIn - ( - "twoDPointCorrector::twoDPointCorrector(" - "const polyMesh& mesh, const vector& n)" - ) << "the number of vertices in the geometry " + WarningIn("twoDPointCorrector::calcAddressing()") + << "the number of vertices in the geometry " << "is odd - this should not be the case for a 2-D case. " << "Please check the geometry." << endl; @@ -157,11 +151,8 @@ void twoDPointCorrector::calcAddressing() const if (2*nNormalEdges != meshPoints.size()) { - WarningIn - ( - "twoDPointCorrector::twoDPointCorrector(" - "const polyMesh& mesh, const vector& n)" - ) << "The number of points in the mesh is " + WarningIn("twoDPointCorrector::calcAddressing()") + << "The number of points in the mesh is " << "not equal to twice the number of edges normal to the plane " << "- this may be OK only for wedge geometries.\n" << " Please check the geometry or adjust " @@ -174,21 +165,38 @@ void twoDPointCorrector::calcAddressing() const } -void twoDPointCorrector::clearAddressing() const +void Foam::twoDPointCorrector::clearAddressing() const { deleteDemandDrivenData(planeNormalPtr_); deleteDemandDrivenData(normalEdgeIndicesPtr_); } +void Foam::twoDPointCorrector::snapToWedge +( + const vector& n, + const point& A, + point& p +) const +{ + scalar ADash = mag(A - wedgeAxis_*(wedgeAxis_ & A)); + vector pDash = ADash*tan(wedgeAngle_)*planeNormal(); + + p = A + sign(n & p)*pDash; +} + + // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // -twoDPointCorrector::twoDPointCorrector(const polyMesh& mesh) +Foam::twoDPointCorrector::twoDPointCorrector(const polyMesh& mesh) : MeshObject<polyMesh, Foam::UpdateableMeshObject, twoDPointCorrector>(mesh), required_(mesh_.nGeometricD() == 2), planeNormalPtr_(NULL), - normalEdgeIndicesPtr_(NULL) + normalEdgeIndicesPtr_(NULL), + isWedge_(false), + wedgeAxis_(vector::zero), + wedgeAngle_(0.0) {} @@ -203,7 +211,7 @@ Foam::twoDPointCorrector::~twoDPointCorrector() // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // -direction twoDPointCorrector::normalDir() const +Foam::direction Foam::twoDPointCorrector::normalDir() const { const vector& pn = planeNormal(); @@ -231,8 +239,7 @@ direction twoDPointCorrector::normalDir() const } -// Return plane normal -const vector& twoDPointCorrector::planeNormal() const +const Foam::vector& Foam::twoDPointCorrector::planeNormal() const { if (!planeNormalPtr_) { @@ -243,8 +250,7 @@ const vector& twoDPointCorrector::planeNormal() const } -// Return indices of normal edges. -const labelList& twoDPointCorrector::normalEdgeIndices() const +const Foam::labelList& Foam::twoDPointCorrector::normalEdgeIndices() const { if (!normalEdgeIndicesPtr_) { @@ -255,7 +261,7 @@ const labelList& twoDPointCorrector::normalEdgeIndices() const } -void twoDPointCorrector::correctPoints(pointField& p) const +void Foam::twoDPointCorrector::correctPoints(pointField& p) const { if (!required_) return; @@ -277,16 +283,25 @@ void twoDPointCorrector::correctPoints(pointField& p) const point& pEnd = p[meshEdges[neIndices[edgeI]].end()]; // calculate average point position - const point A = 0.5*(pStart + pEnd); + point A = 0.5*(pStart + pEnd); + meshTools::constrainToMeshCentre(mesh_, A); - // correct point locations - pStart = A + pn*(pn & (pStart - A)); - pEnd = A + pn*(pn & (pEnd - A)); + if (isWedge_) + { + snapToWedge(pn, A, pStart); + snapToWedge(pn, A, pEnd); + } + else + { + // correct point locations + pStart = A + pn*(pn & (pStart - A)); + pEnd = A + pn*(pn & (pEnd - A)); + } } } -void twoDPointCorrector::correctDisplacement +void Foam::twoDPointCorrector::correctDisplacement ( const pointField& p, vectorField& disp @@ -316,29 +331,36 @@ void twoDPointCorrector::correctDisplacement point pEnd = p[endPointI] + disp[endPointI]; // calculate average point position - const point A = 0.5*(pStart + pEnd); + point A = 0.5*(pStart + pEnd); + meshTools::constrainToMeshCentre(mesh_, A); - // correct point locations - disp[startPointI] = (A + pn*(pn & (pStart - A))) - p[startPointI]; - disp[endPointI] = (A + pn*(pn & (pEnd - A))) - p[endPointI]; + if (isWedge_) + { + snapToWedge(pn, A, pStart); + snapToWedge(pn, A, pEnd); + disp[startPointI] = pStart - p[startPointI]; + disp[endPointI] = pEnd - p[endPointI]; + } + else + { + // correct point locations + disp[startPointI] = (A + pn*(pn & (pStart - A))) - p[startPointI]; + disp[endPointI] = (A + pn*(pn & (pEnd - A))) - p[endPointI]; + } } } -void twoDPointCorrector::updateMesh(const mapPolyMesh&) +void Foam::twoDPointCorrector::updateMesh(const mapPolyMesh&) { clearAddressing(); } -bool twoDPointCorrector::movePoints() +bool Foam::twoDPointCorrector::movePoints() { return true; } -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // - -} // End namespace Foam - // ************************************************************************* // diff --git a/src/meshTools/twoDPointCorrector/twoDPointCorrector.H b/src/meshTools/twoDPointCorrector/twoDPointCorrector.H index 3cdfc53e8505865635f7e313a410af6292368346..c30a0282a0fd297110efd264a34857142a86c3a3 100644 --- a/src/meshTools/twoDPointCorrector/twoDPointCorrector.H +++ b/src/meshTools/twoDPointCorrector/twoDPointCorrector.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2014 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -56,7 +56,7 @@ namespace Foam class polyMesh; /*---------------------------------------------------------------------------*\ - Class twoDPointCorrector Declaration + Class twoDPointCorrector Declaration \*---------------------------------------------------------------------------*/ class twoDPointCorrector @@ -74,6 +74,15 @@ class twoDPointCorrector //- Indices of edges normal to plane mutable labelList* normalEdgeIndicesPtr_; + //- Flag to indicate a wedge geometry + mutable bool isWedge_; + + //- Wedge axis (if wedge geometry) + mutable vector wedgeAxis_; + + //- Wedge angle (if wedge geometry) + mutable scalar wedgeAngle_; + // Private Member Functions @@ -90,6 +99,9 @@ class twoDPointCorrector //- Clear addressing void clearAddressing() const; + //- Snap a point to the wedge patch(es) + void snapToWedge(const vector& n, const point& A, point& p) const; + // Static data members diff --git a/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionIO.C b/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionIO.C index 23e2c35ac6a46869eb47e6599655f5f5252de6e7..4da01ef285f9e4e85093383896c0c75966f3fd5f 100644 --- a/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionIO.C +++ b/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionIO.C @@ -30,8 +30,8 @@ License bool Foam::sixDoFRigidBodyMotion::read(const dictionary& dict) { - dict.lookup("momentOfInertia") >> momentOfInertia_; dict.lookup("mass") >> mass_; + dict.lookup("momentOfInertia") >> momentOfInertia_; aRelax_ = dict.lookupOrDefault<scalar>("accelerationRelaxation", 1.0); aDamp_ = dict.lookupOrDefault<scalar>("accelerationDamping", 1.0); report_ = dict.lookupOrDefault<Switch>("report", false); @@ -50,16 +50,18 @@ void Foam::sixDoFRigidBodyMotion::write(Ostream& os) const { motionState_.write(os); - os.writeKeyword("initialCentreOfRotation") - << initialCentreOfRotation_ << token::END_STATEMENT << nl; - os.writeKeyword("initialOrientation") + os.writeKeyword("centreOfMass") + << initialCentreOfMass_ << token::END_STATEMENT << nl; + os.writeKeyword("orientation") << initialQ_ << token::END_STATEMENT << nl; - os.writeKeyword("momentOfInertia") - << momentOfInertia_ << token::END_STATEMENT << nl; os.writeKeyword("mass") << mass_ << token::END_STATEMENT << nl; + os.writeKeyword("momentOfInertia") + << momentOfInertia_ << token::END_STATEMENT << nl; os.writeKeyword("accelerationRelaxation") << aRelax_ << token::END_STATEMENT << nl; + os.writeKeyword("accelerationDamping") + << aDamp_ << token::END_STATEMENT << nl; os.writeKeyword("report") << report_ << token::END_STATEMENT << nl;