diff --git a/src/OpenFOAM/meshes/polyMesh/polyMeshFromShapeMesh.C b/src/OpenFOAM/meshes/polyMesh/polyMeshFromShapeMesh.C index 464ed465b0..fe9b8e45a4 100644 --- a/src/OpenFOAM/meshes/polyMesh/polyMeshFromShapeMesh.C +++ b/src/OpenFOAM/meshes/polyMesh/polyMeshFromShapeMesh.C @@ -577,21 +577,56 @@ Foam::polyMesh::polyMesh << "Found " << nFaces - defaultPatchStart << " undefined faces in mesh; adding to default patch." << endl; - boundary_.set - ( - nAllPatches, - polyPatch::New - ( - defaultBoundaryPatchType, - defaultBoundaryPatchName, - nFaces - defaultPatchStart, - defaultPatchStart, - boundary_.size() - 1, - boundary_ - ) - ); + // Check if there already exists a defaultFaces patch as last patch + // and reuse it. + label patchI = findIndex(boundaryPatchNames, defaultBoundaryPatchName); - nAllPatches++; + if (patchI != -1) + { + if (patchI != boundaryFaces.size()-1 || boundary_[patchI].size()) + { + FatalErrorIn("polyMesh::polyMesh(... construct from shapes...)") + << "Default patch " << boundary_[patchI].name() + << " already has faces in it or is not" + << " last in list of patches." << exit(FatalError); + } + + WarningIn("polyMesh::polyMesh(... construct from shapes...)") + << "Reusing existing patch " << patchI + << " for undefined faces." << endl; + + boundary_.set + ( + patchI, + polyPatch::New + ( + boundaryPatchTypes[patchI], + boundaryPatchNames[patchI], + nFaces - defaultPatchStart, + defaultPatchStart, + patchI, + boundary_ + ) + ); + } + else + { + boundary_.set + ( + nAllPatches, + polyPatch::New + ( + defaultBoundaryPatchType, + defaultBoundaryPatchName, + nFaces - defaultPatchStart, + defaultPatchStart, + boundary_.size() - 1, + boundary_ + ) + ); + + nAllPatches++; + } } // Reset the size of the boundary diff --git a/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.C b/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.C index e17e7138d6..b11d693d95 100644 --- a/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.C +++ b/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.C @@ -258,7 +258,10 @@ bool Foam::KinematicParcel::move(TrackData& td) // face is hit label cellI = p.cell(); - dt *= p.trackToFace(p.position() + dt*U_, td); + if (p.active()) + { + dt *= p.trackToFace(p.position() + dt*U_, td); + } tEnd -= dt; p.stepFraction() = 1.0 - tEnd/deltaT; @@ -322,6 +325,7 @@ bool Foam::KinematicParcel::hitPatch pp, this->face(), td.keepParticle, + active_, U_ ); } diff --git a/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.H b/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.H index 5316ea2280..a154bac88b 100644 --- a/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.H +++ b/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.H @@ -194,6 +194,9 @@ protected: // Parcel properties + //- Active flag - tracking inactive when active = false + bool active_; + //- Parcel type id label typeId_; @@ -308,6 +311,9 @@ public: // Access + //- Return const access to active flag + inline bool active() const; + //- Return const access to type id inline label typeId() const; @@ -332,8 +338,11 @@ public: // Edit + //- Return const access to active flag + inline bool& active(); + //- Return access to type id - inline label typeId(); + inline label& typeId(); //- Return access to number of particles inline scalar& nParticle(); diff --git a/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcelI.H b/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcelI.H index 7c4b759760..6eca153546 100644 --- a/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcelI.H +++ b/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcelI.H @@ -75,6 +75,7 @@ inline Foam::KinematicParcel::KinematicParcel ) : Particle(owner, position, cellI), + active_(false), typeId_(owner.parcelTypeId()), nParticle_(0), d_(0.0), @@ -102,6 +103,7 @@ inline Foam::KinematicParcel::KinematicParcel ) : Particle(owner, position, cellI), + active_(true), typeId_(typeId), nParticle_(nParticle0), d_(d0), @@ -201,6 +203,13 @@ Foam::KinematicParcel::trackData::g() const // * * * * * * * * * * KinematicParcel Member Functions * * * * * * * * * * // +template +inline bool Foam::KinematicParcel::active() const +{ + return active_; +} + + template inline Foam::label Foam::KinematicParcel::typeId() const { @@ -251,7 +260,14 @@ inline const Foam::vector& Foam::KinematicParcel::UTurb() const template -inline Foam::label Foam::KinematicParcel::typeId() +inline bool& Foam::KinematicParcel::active() +{ + return active_; +} + + +template +inline Foam::label& Foam::KinematicParcel::typeId() { return typeId_; } diff --git a/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcelIO.C b/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcelIO.C index bbf5d46412..a334e8b880 100644 --- a/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcelIO.C +++ b/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcelIO.C @@ -33,6 +33,7 @@ License template Foam::string Foam::KinematicParcel::propHeader = Particle::propHeader + + " active" + " typeId" + " nParticle" + " d" @@ -53,6 +54,7 @@ Foam::KinematicParcel::KinematicParcel ) : Particle(cloud, is, readFields), + active_(false), typeId_(0), nParticle_(0.0), d_(0.0), @@ -68,6 +70,7 @@ Foam::KinematicParcel::KinematicParcel { if (is.format() == IOstream::ASCII) { + active_ = readBool(is); typeId_ = readLabel(is); nParticle_ = readScalar(is); d_ = readScalar(is); @@ -81,7 +84,8 @@ Foam::KinematicParcel::KinematicParcel is.read ( reinterpret_cast(&typeId_), - sizeof(typeId_) + sizeof(active_) + + sizeof(typeId_) + sizeof(nParticle_) + sizeof(d_) + sizeof(U_) @@ -111,6 +115,9 @@ void Foam::KinematicParcel::readFields(Cloud& c) Particle::readFields(c); + IOField