From b0b62067d902cbcc5bb8443f7b633eaac81b6547 Mon Sep 17 00:00:00 2001 From: mattijs Date: Thu, 17 Jul 2014 15:35:46 +0100 Subject: [PATCH 01/11] ENH: searchableDisk: new searchable surface --- src/meshTools/Make/files | 1 + .../searchableSurface/searchableDisk.C | 329 ++++++++++++++++++ .../searchableSurface/searchableDisk.H | 246 +++++++++++++ 3 files changed, 576 insertions(+) create mode 100644 src/meshTools/searchableSurface/searchableDisk.C create mode 100644 src/meshTools/searchableSurface/searchableDisk.H diff --git a/src/meshTools/Make/files b/src/meshTools/Make/files index 6b52b270..a95c639b 100644 --- a/src/meshTools/Make/files +++ b/src/meshTools/Make/files @@ -64,6 +64,7 @@ indexedOctree/treeDataTriSurface.C searchableSurface = searchableSurface $(searchableSurface)/searchableBox.C $(searchableSurface)/searchableCylinder.C +$(searchableSurface)/searchableDisk.C $(searchableSurface)/searchablePlane.C $(searchableSurface)/searchablePlate.C $(searchableSurface)/searchableSphere.C diff --git a/src/meshTools/searchableSurface/searchableDisk.C b/src/meshTools/searchableSurface/searchableDisk.C new file mode 100644 index 00000000..a9c968aa --- /dev/null +++ b/src/meshTools/searchableSurface/searchableDisk.C @@ -0,0 +1,329 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2014 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see . + +\*---------------------------------------------------------------------------*/ + +#include "searchableDisk.H" +#include "addToRunTimeSelectionTable.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +namespace Foam +{ + +defineTypeNameAndDebug(searchableDisk, 0); +addToRunTimeSelectionTable(searchableSurface, searchableDisk, dict); + +} + + +// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // + +Foam::pointIndexHit Foam::searchableDisk::findNearest +( + const point& sample, + const scalar nearestDistSqr +) const +{ + pointIndexHit info(false, sample, -1); + + vector v(sample - origin_); + + // Decompose sample-origin into normal and parallel component + scalar parallel = (v & normal_); + + // Remove the parallel component and normalise + v -= parallel*normal_; + scalar magV = mag(v); + + if (magV < ROOTVSMALL) + { + v = vector::zero; + } + else + { + v /= magV; + } + + // Clip to radius. + info.setPoint(origin_ + min(magV, radius_)*v); + + if (magSqr(sample - info.rawPoint()) < nearestDistSqr) + { + info.setHit(); + info.setIndex(0); + } + + return info; +} + + +void Foam::searchableDisk::findLine +( + const point& start, + const point& end, + pointIndexHit& info +) const +{ + info = pointIndexHit(false, vector::zero, -1); + + vector v(start - origin_); + + // Decompose sample-origin into normal and parallel component + scalar parallel = (v & normal_); + + if (sign(parallel) == sign((end - origin_) & normal_)) + { + return; + } + + // Remove the parallel component and normalise + v -= parallel*normal_; + scalar magV = mag(v); + + if (magV < ROOTVSMALL) + { + v = vector::zero; + } + else + { + v /= magV; + } + + // Set (hit or miss) to intersection of ray and plane of disk + info.setPoint(origin_ + magV*v); + + if (magV <= radius_) + { + info.setHit(); + info.setIndex(0); + } +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::searchableDisk::searchableDisk +( + const IOobject& io, + const point& origin, + const point& normal, + const scalar radius +) +: + searchableSurface(io), + origin_(origin), + normal_(normal/mag(normal)), + radius_(radius) +{ + // Rough approximation of bounding box + //vector span(radius_, radius_, radius_); + + // See searchableCylinder + vector span + ( + sqrt(sqr(normal_.y()) + sqr(normal_.z())), + sqrt(sqr(normal_.x()) + sqr(normal_.z())), + sqrt(sqr(normal_.x()) + sqr(normal_.y())) + ); + span *= radius_; + + bounds().min() = origin_ - span; + bounds().max() = origin_ + span; +} + + +Foam::searchableDisk::searchableDisk +( + const IOobject& io, + const dictionary& dict +) +: + searchableSurface(io), + origin_(dict.lookup("origin")), + normal_(dict.lookup("normal")), + radius_(readScalar(dict.lookup("radius"))) +{ + normal_ /= mag(normal_); + + // Rough approximation of bounding box + //vector span(radius_, radius_, radius_); + + // See searchableCylinder + vector span + ( + sqrt(sqr(normal_.y()) + sqr(normal_.z())), + sqrt(sqr(normal_.x()) + sqr(normal_.z())), + sqrt(sqr(normal_.x()) + sqr(normal_.y())) + ); + span *= radius_; + + bounds().min() = origin_ - span; + bounds().max() = origin_ + span; +} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +Foam::searchableDisk::~searchableDisk() +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +const Foam::wordList& Foam::searchableDisk::regions() const +{ + if (regions_.empty()) + { + regions_.setSize(1); + regions_[0] = "region0"; + } + return regions_; +} + + +void Foam::searchableDisk::boundingSpheres +( + pointField& centres, + scalarField& radiusSqr +) const +{ + centres.setSize(1); + centres[0] = origin_; + + radiusSqr.setSize(1); + radiusSqr[0] = sqr(radius_); + + // Add a bit to make sure all points are tested inside + radiusSqr += Foam::sqr(SMALL); +} + + +void Foam::searchableDisk::findNearest +( + const pointField& samples, + const scalarField& nearestDistSqr, + List& info +) const +{ + info.setSize(samples.size()); + + forAll(samples, i) + { + info[i] = findNearest(samples[i], nearestDistSqr[i]); + } +} + + +void Foam::searchableDisk::findLine +( + const pointField& start, + const pointField& end, + List& info +) const +{ + info.setSize(start.size()); + + forAll(start, i) + { + findLine(start[i], end[i], info[i]); + } +} + + +void Foam::searchableDisk::findLineAny +( + const pointField& start, + const pointField& end, + List& info +) const +{ + findLine(start, end, info); +} + + +void Foam::searchableDisk::findLineAll +( + const pointField& start, + const pointField& end, + List >& info +) const +{ + info.setSize(start.size()); + + forAll(start, i) + { + pointIndexHit inter; + findLine(start[i], end[i], inter); + + if (inter.hit()) + { + info[i].setSize(1); + info[i][0] = inter; + } + else + { + info[i].clear(); + } + } +} + + +void Foam::searchableDisk::getRegion +( + const List& info, + labelList& region +) const +{ + region.setSize(info.size()); + region = 0; +} + + +void Foam::searchableDisk::getNormal +( + const List& info, + vectorField& normal +) const +{ + normal.setSize(info.size()); + normal = normal_; +} + + +void Foam::searchableDisk::getVolumeType +( + const pointField& points, + List& volType +) const +{ + FatalErrorIn + ( + "searchableDisk::getVolumeType(const pointField&" + ", List&) const" + ) << "Volume type not supported for disk." + << exit(FatalError); +} + + +// ************************************************************************* // diff --git a/src/meshTools/searchableSurface/searchableDisk.H b/src/meshTools/searchableSurface/searchableDisk.H new file mode 100644 index 00000000..7bebdbf7 --- /dev/null +++ b/src/meshTools/searchableSurface/searchableDisk.H @@ -0,0 +1,246 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2014 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see . + +Class + Foam::searchableDisk + +Description + Searching on circular disk given as origin, normal (gets normalised) + and radius + +SourceFiles + searchableDisk.C + +\*---------------------------------------------------------------------------*/ + +#ifndef searchableDisk_H +#define searchableDisk_H + +#include "treeBoundBox.H" +#include "searchableSurface.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class searchableDisk Declaration +\*---------------------------------------------------------------------------*/ + +class searchableDisk +: + public searchableSurface +{ +private: + + // Private Member Data + + //- origin + const point origin_; + + //- normal + vector normal_; + + //- radius + const scalar radius_; + + //- Names of regions + mutable wordList regions_; + + + // Private Member Functions + + //- Find nearest point on disk + pointIndexHit findNearest + ( + const point& sample, + const scalar nearestDistSqr + ) const; + + //- Find intersection with disk + void findLine + ( + const point& start, + const point& end, + pointIndexHit& + ) const; + + //- Disallow default bitwise copy construct + searchableDisk(const searchableDisk&); + + //- Disallow default bitwise assignment + void operator=(const searchableDisk&); + +public: + + //- Runtime type information + TypeName("searchableDisk"); + + + // Constructors + + //- Construct from components + searchableDisk + ( + const IOobject& io, + const point& origin, + const point& normal, + const scalar radius + ); + + //- Construct from dictionary (used by searchableSurface) + searchableDisk + ( + const IOobject& io, + const dictionary& dict + ); + + //- Destructor + virtual ~searchableDisk(); + + + // Member Functions + + virtual const wordList& regions() const; + + //- Whether supports volume type below + virtual bool hasVolumeType() const + { + return false; + } + + //- Range of local indices that can be returned. + virtual label size() const + { + return 1; + } + + //- Get representative set of element coordinates + // Usually the element centres (should be of length size()). + virtual tmp coordinates() const + { + tmp tCtrs(new pointField(1, origin_)); + return tCtrs; + } + + //- Get bounding spheres (centre and radius squared), one per element. + // Any point on element is guaranteed to be inside. + virtual void boundingSpheres + ( + pointField& centres, + scalarField& radiusSqr + ) const; + + //- Get the points that define the surface. + virtual tmp points() const + { + return coordinates(); + } + + //- Does any part of the surface overlap the supplied bound box? + virtual bool overlaps(const boundBox& bb) const + { + notImplemented + ( + "searchableDisk::overlaps(const boundBox&) const" + ); + + return false; + } + + + // Multiple point queries. + + virtual void findNearest + ( + const pointField& sample, + const scalarField& nearestDistSqr, + List& + ) const; + + virtual void findLine + ( + const pointField& start, + const pointField& end, + List& + ) const; + + virtual void findLineAny + ( + const pointField& start, + const pointField& end, + List& + ) const; + + //- Get all intersections in order from start to end. + virtual void findLineAll + ( + const pointField& start, + const pointField& end, + List >& + ) const; + + //- From a set of points and indices get the region + virtual void getRegion + ( + const List&, + labelList& region + ) const; + + //- From a set of points and indices get the normal + virtual void getNormal + ( + const List&, + vectorField& normal + ) const; + + //- Determine type (inside/outside/mixed) for point. unknown if + // cannot be determined (e.g. non-manifold surface) + virtual void getVolumeType + ( + const pointField&, + List& + ) const; + + + // regIOobject implementation + + bool writeData(Ostream&) const + { + notImplemented("searchableDisk::writeData(Ostream&) const"); + return false; + } + +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // From b79c69bfe33fc86ffee4cf7562241418d2f50262 Mon Sep 17 00:00:00 2001 From: mattijs Date: Wed, 23 Jul 2014 09:17:31 +0100 Subject: [PATCH 02/11] BUG: searchableCylinder: incorrect normal --- .../searchableSurface/searchableCylinder.C | 60 +++++++++++++++---- 1 file changed, 50 insertions(+), 10 deletions(-) diff --git a/src/meshTools/searchableSurface/searchableCylinder.C b/src/meshTools/searchableSurface/searchableCylinder.C index 7657e883..fb2f7276 100644 --- a/src/meshTools/searchableSurface/searchableCylinder.C +++ b/src/meshTools/searchableSurface/searchableCylinder.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 @@ -662,21 +662,61 @@ void Foam::searchableCylinder::getNormal vector v(info[i].hitPoint() - point1_); // Decompose sample-point1 into normal and parallel component - scalar parallel = v & unitDir_; + scalar parallel = (v & unitDir_); - if (parallel < 0) + // Remove the parallel component and normalise + v -= parallel*unitDir_; + scalar magV = mag(v); + + if (parallel <= 0) { - normal[i] = -unitDir_; + if ((magV-radius_) < mag(parallel)) + { + // above endcap + normal[i] = -unitDir_; + } + else + { + normal[i] = v/mag(v); + } } - else if (parallel > magDir_) + else if (parallel <= 0.5*magDir_) { - normal[i] = -unitDir_; + // See if endcap closer or sidewall + if (parallel <= mag(magV-radius_)) + { + // above endcap + normal[i] = -unitDir_; + } + else + { + normal[i] = v/mag(v); + } } - else + else if (parallel <= magDir_) { - // Remove the parallel component - v -= parallel*unitDir_; - normal[i] = v/mag(v); + // See if endcap closer or sidewall + if ((magDir_-parallel) <= mag(magV-radius_)) + { + // above endcap + normal[i] = unitDir_; + } + else + { + normal[i] = v/mag(v); + } + } + else // beyong cylinder + { + if ((magV-radius_) < (parallel-magDir_)) + { + // above endcap + normal[i] = unitDir_; + } + else + { + normal[i] = v/mag(v); + } } } } From 50437d21acbd15fdf8656bbf1af49d22a89da3e4 Mon Sep 17 00:00:00 2001 From: mattijs Date: Wed, 23 Jul 2014 11:18:42 +0100 Subject: [PATCH 03/11] BUG: decompositionMethod: constraints across coupled faces --- .../decompositionMethod/decompositionMethod.C | 108 ++++++++- .../decompositionMethod/minData.H | 205 ++++++++++++++++ .../decompositionMethod/minDataI.H | 222 ++++++++++++++++++ 3 files changed, 534 insertions(+), 1 deletion(-) create mode 100644 src/parallel/decompose/decompositionMethods/decompositionMethod/minData.H create mode 100644 src/parallel/decompose/decompositionMethods/decompositionMethod/minDataI.H diff --git a/src/parallel/decompose/decompositionMethods/decompositionMethod/decompositionMethod.C b/src/parallel/decompose/decompositionMethods/decompositionMethod/decompositionMethod.C index c098db09..ff2f3d68 100644 --- a/src/parallel/decompose/decompositionMethods/decompositionMethod/decompositionMethod.C +++ b/src/parallel/decompose/decompositionMethods/decompositionMethod/decompositionMethod.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 @@ -33,6 +33,8 @@ InClass #include "faceSet.H" #include "regionSplit.H" #include "localPointRegion.H" +#include "minData.H" +#include "FaceCellWave.H" // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // @@ -956,6 +958,72 @@ Foam::labelList Foam::decompositionMethod::decompose } + // blockedFaces corresponding to processor faces need to be handled + // separately since not handled by local regionSplit. We need to + // walk now across coupled faces and make sure to move a whole + // global region across + if (Pstream::parRun()) + { + // Re-do regionSplit + + // Field on cells and faces. + List cellData(mesh.nCells()); + List faceData(mesh.nFaces()); + + // Take over blockedFaces by seeding a negative number + // (so is always less than the decomposition) + label nUnblocked = 0; + forAll(blockedFace, faceI) + { + if (blockedFace[faceI]) + { + faceData[faceI] = minData(-123); + } + else + { + nUnblocked++; + } + } + + // Seed unblocked faces with destination processor + labelList seedFaces(nUnblocked); + List seedData(nUnblocked); + nUnblocked = 0; + + forAll(blockedFace, faceI) + { + if (!blockedFace[faceI]) + { + label own = mesh.faceOwner()[faceI]; + seedFaces[nUnblocked] = faceI; + seedData[nUnblocked] = minData(finalDecomp[own]); + nUnblocked++; + } + } + + + // Propagate information inwards + FaceCellWave deltaCalc + ( + mesh, + seedFaces, + seedData, + faceData, + cellData, + mesh.globalData().nTotalCells()+1 + ); + + // And extract + forAll(finalDecomp, cellI) + { + if (cellData[cellI].valid(deltaCalc.data())) + { + finalDecomp[cellI] = cellData[cellI].data(); + } + } + } + + // For specifiedProcessorFaces rework the cellToProc to enforce // all on one processor since we can't guarantee that the input // to regionSplit was a single region. @@ -1000,6 +1068,44 @@ Foam::labelList Foam::decompositionMethod::decompose } } } + + + if (debug && Pstream::parRun()) + { + labelList nbrDecomp; + syncTools::swapBoundaryCellList(mesh, finalDecomp, nbrDecomp); + + const polyBoundaryMesh& patches = mesh.boundaryMesh(); + forAll(patches, patchI) + { + const polyPatch& pp = patches[patchI]; + if (pp.coupled()) + { + forAll(pp, i) + { + label faceI = pp.start()+i; + label own = mesh.faceOwner()[faceI]; + label bFaceI = faceI-mesh.nInternalFaces(); + + if (!blockedFace[faceI]) + { + label ownProc = finalDecomp[own]; + label nbrProc = nbrDecomp[bFaceI]; + if (ownProc != nbrProc) + { + FatalErrorIn("decompositionMethod::decompose()") + << "patch:" << pp.name() + << " face:" << faceI + << " at:" << mesh.faceCentres()[faceI] + << " ownProc:" << ownProc + << " nbrProc:" << nbrProc + << exit(FatalError); + } + } + } + } + } + } } return finalDecomp; diff --git a/src/parallel/decompose/decompositionMethods/decompositionMethod/minData.H b/src/parallel/decompose/decompositionMethods/decompositionMethod/minData.H new file mode 100644 index 00000000..ad3fb947 --- /dev/null +++ b/src/parallel/decompose/decompositionMethods/decompositionMethod/minData.H @@ -0,0 +1,205 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2014 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see . + +Class + Foam::minData + +Description + For use with FaceCellWave. Transports minimum passive data + +SourceFiles + minDataI.H + +\*---------------------------------------------------------------------------*/ + +#ifndef minData_H +#define minData_H + +#include "point.H" +#include "tensor.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +class polyPatch; +class polyMesh; + +/*---------------------------------------------------------------------------*\ + Class minData Declaration +\*---------------------------------------------------------------------------*/ + +class minData +{ + // Private data + + //- Starting data + label data_; + + +public: + + // Constructors + + //- Construct null + inline minData(); + + //- Construct from count + inline minData(const label data); + + + // Member Functions + + // Access + + inline label data() const + { + return data_; + } + + + // Needed by FaceCellWave + + //- Check whether origin has been changed at all or + // still contains original (invalid) value. + template + inline bool valid(TrackingData& td) const; + + //- Check for identical geometrical data. Used for cyclics checking. + template + inline bool sameGeometry + ( + const polyMesh&, + const minData&, + const scalar, + TrackingData& td + ) const; + + //- Convert any absolute coordinates into relative to (patch)face + // centre + template + inline void leaveDomain + ( + const polyMesh&, + const polyPatch&, + const label patchFaceI, + const point& faceCentre, + TrackingData& td + ); + + //- Reverse of leaveDomain + template + inline void enterDomain + ( + const polyMesh&, + const polyPatch&, + const label patchFaceI, + const point& faceCentre, + TrackingData& td + ); + + //- Apply rotation matrix to any coordinates + template + inline void transform + ( + const polyMesh&, + const tensor&, + TrackingData& td + ); + + //- Influence of neighbouring face. + template + inline bool updateCell + ( + const polyMesh&, + const label thisCellI, + const label neighbourFaceI, + const minData& neighbourInfo, + const scalar tol, + TrackingData& td + ); + + //- Influence of neighbouring cell. + template + inline bool updateFace + ( + const polyMesh&, + const label thisFaceI, + const label neighbourCellI, + const minData& neighbourInfo, + const scalar tol, + TrackingData& td + ); + + //- Influence of different value on same face. + template + inline bool updateFace + ( + const polyMesh&, + const label thisFaceI, + const minData& neighbourInfo, + const scalar tol, + TrackingData& td + ); + + //- Same (like operator==) + template + inline bool equal(const minData&, TrackingData& td) const; + + // Member Operators + + // Needed for List IO + inline bool operator==(const minData&) const; + + inline bool operator!=(const minData&) const; + + + // IOstream Operators + + friend Ostream& operator<<(Ostream&, const minData&); + friend Istream& operator>>(Istream&, minData&); +}; + + +//- Data associated with minData type are contiguous +template<> +inline bool contiguous() +{ + return true; +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#include "minDataI.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/parallel/decompose/decompositionMethods/decompositionMethod/minDataI.H b/src/parallel/decompose/decompositionMethods/decompositionMethod/minDataI.H new file mode 100644 index 00000000..a079524c --- /dev/null +++ b/src/parallel/decompose/decompositionMethods/decompositionMethod/minDataI.H @@ -0,0 +1,222 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2014 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see . + +\*---------------------------------------------------------------------------*/ + +#include "polyMesh.H" + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +inline Foam::minData::minData() +: + data_(labelMax) +{} + + +inline Foam::minData::minData(const label data) +: + data_(data) +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +template +inline bool Foam::minData::valid(TrackingData& td) const +{ + return data_ != labelMax; +} + + +template +inline bool Foam::minData::sameGeometry +( + const polyMesh&, + const minData&, + const scalar, + TrackingData& +) const +{ + return true; +} + + +template +inline void Foam::minData::leaveDomain +( + const polyMesh&, + const polyPatch& patch, + const label patchFaceI, + const point& faceCentre, + TrackingData& +) +{} + + +template +inline void Foam::minData::transform +( + const polyMesh&, + const tensor& rotTensor, + TrackingData& +) +{} + + +template +inline void Foam::minData::enterDomain +( + const polyMesh&, + const polyPatch& patch, + const label patchFaceI, + const point& faceCentre, + TrackingData& +) +{} + + +template +inline bool Foam::minData::updateCell +( + const polyMesh&, + const label thisCellI, + const label neighbourFaceI, + const minData& neighbourInfo, + const scalar tol, + TrackingData& +) +{ + if (neighbourInfo.data_ < data_) + { + operator=(neighbourInfo); + return true; + } + else + { + return false; + } +} + + +template +inline bool Foam::minData::updateFace +( + const polyMesh& mesh, + const label thisFaceI, + const label neighbourCellI, + const minData& neighbourInfo, + const scalar tol, + TrackingData& +) +{ + // From cell to its faces. + + if (neighbourInfo.data_ < data_) + { + operator=(neighbourInfo); + return true; + } + else + { + return false; + } +} + + +template +inline bool Foam::minData::updateFace +( + const polyMesh&, + const label thisFaceI, + const minData& neighbourInfo, + const scalar tol, + TrackingData& +) +{ + // From face to face (e.g. coupled faces) + if (neighbourInfo.data_ < data_) + { + operator=(neighbourInfo); + return true; + } + else + { + return false; + } +} + + +template +inline bool Foam::minData::equal +( + const minData& rhs, + TrackingData& td +) const +{ + return operator==(rhs); +} + + +// * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * // + +inline bool Foam::minData::operator== +( + const Foam::minData& rhs +) const +{ + return data() == rhs.data(); +} + + +inline bool Foam::minData::operator!= +( + const Foam::minData& rhs +) const +{ + return !(*this == rhs); +} + + +// * * * * * * * * * * * * * * * Friend Operators * * * * * * * * * * * * * // + +Foam::Ostream& Foam::operator<< +( + Foam::Ostream& os, + const Foam::minData& wDist +) +{ + return os << wDist.data_; +} + + +Foam::Istream& Foam::operator>> +( + Foam::Istream& is, + Foam::minData& wDist +) +{ + return is >> wDist.data_; +} + + +// ************************************************************************* // From 7d9deced3564ce263b2cbcc928be506ed88734f0 Mon Sep 17 00:00:00 2001 From: mattijs Date: Wed, 23 Jul 2014 11:25:11 +0100 Subject: [PATCH 04/11] ENH: snappyHexMesh: additional checking for faceZones on processor boundaries --- .../autoHexMeshDriver/autoRefineDriver.C | 6 ++++ .../meshRefinement/meshRefinement.H | 3 ++ .../meshRefinement/meshRefinementBaffles.C | 30 +++++++++++++++++++ 3 files changed, 39 insertions(+) diff --git a/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoRefineDriver.C b/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoRefineDriver.C index 48fcdbbb..8c63239f 100644 --- a/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoRefineDriver.C +++ b/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoRefineDriver.C @@ -1248,6 +1248,12 @@ void Foam::autoRefineDriver::doRefine decomposer_, distributor_ ); + + + if (debug) + { + meshRefiner_.checkZoneFaces(); + } } } diff --git a/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinement.H b/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinement.H index 78b7d9a1..770b5025 100644 --- a/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinement.H +++ b/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinement.H @@ -870,6 +870,9 @@ public: const labelList& neiPatch ); + //- Debug helper: check faceZones are not on processor patches + void checkZoneFaces() const; + //- Create baffles for faces straddling zoned surfaces. Return // baffles. autoPtr createZoneBaffles diff --git a/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinementBaffles.C b/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinementBaffles.C index 76bb6150..6dc77b39 100644 --- a/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinementBaffles.C +++ b/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinementBaffles.C @@ -531,6 +531,36 @@ Foam::autoPtr Foam::meshRefinement::createBaffles } +void Foam::meshRefinement::checkZoneFaces() const +{ + const faceZoneMesh& fZones = mesh_.faceZones(); + + const polyBoundaryMesh& pbm = mesh_.boundaryMesh(); + + forAll(pbm, patchI) + { + const polyPatch& pp = pbm[patchI]; + + if (isA(pp)) + { + forAll(pp, i) + { + label faceI = pp.start()+i; + label zoneI = fZones.whichZone(faceI); + + if (zoneI != -1) + { + FatalErrorIn("meshRefinement::checkZoneFaces") + << "face:" << faceI << " on patch " << pp.name() + << " is in zone " << fZones[zoneI].name() + << exit(FatalError); + } + } + } + } +} + + Foam::autoPtr Foam::meshRefinement::createZoneBaffles ( const labelList& globalToMasterPatch, From 436464a47c682c0bf4021f8ce32a585490c70978 Mon Sep 17 00:00:00 2001 From: mattijs Date: Wed, 23 Jul 2014 20:30:22 +0100 Subject: [PATCH 05/11] BUG: createPatch: cleanup --- .../utilities/mesh/manipulation/createPatch/createPatch.C | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/applications/utilities/mesh/manipulation/createPatch/createPatch.C b/applications/utilities/mesh/manipulation/createPatch/createPatch.C index 6f283d47..deefbaef 100644 --- a/applications/utilities/mesh/manipulation/createPatch/createPatch.C +++ b/applications/utilities/mesh/manipulation/createPatch/createPatch.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 @@ -186,6 +186,10 @@ void filterPatches(polyMesh& mesh, const HashSet& addedPatchNames) else { Info<< "No patches removed." << endl; + forAll(allPatches, i) + { + delete allPatches[i]; + } } } From 88708928556d80573d7817d7700cb718342d89ad Mon Sep 17 00:00:00 2001 From: mattijs Date: Thu, 24 Jul 2014 17:29:07 +0100 Subject: [PATCH 06/11] BUG: extrudeToRegionMesh: memory leak --- .../extrude/extrudeToRegionMesh/extrudeToRegionMesh.C | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/applications/utilities/mesh/generation/extrude/extrudeToRegionMesh/extrudeToRegionMesh.C b/applications/utilities/mesh/generation/extrude/extrudeToRegionMesh/extrudeToRegionMesh.C index c8f6b887..e9444d0e 100644 --- a/applications/utilities/mesh/generation/extrude/extrudeToRegionMesh/extrudeToRegionMesh.C +++ b/applications/utilities/mesh/generation/extrude/extrudeToRegionMesh/extrudeToRegionMesh.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 @@ -2430,10 +2430,9 @@ int main(int argc, char *argv[]) // Add the new patches forAll(regionPatches, patchI) { - regionPatches[patchI] = regionPatches[patchI]->clone - ( - regionMesh.boundaryMesh() - ).ptr(); + polyPatch* ppPtr = regionPatches[patchI]; + regionPatches[patchI] = ppPtr->clone(regionMesh.boundaryMesh()).ptr(); + delete ppPtr; } regionMesh.clearOut(); regionMesh.removeFvBoundary(); From 08dc3ab2e42b6e46c8fa9d4fcdb5171eb13aebd6 Mon Sep 17 00:00:00 2001 From: Henry Date: Thu, 24 Jul 2014 18:01:08 +0100 Subject: [PATCH 07/11] tutorials/multiphase/interDyMFoam/ras/mixerVesselAMI updated --- .../interDyMFoam/ras/mixerVesselAMI/system/fvSolution | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/tutorials/multiphase/interDyMFoam/ras/mixerVesselAMI/system/fvSolution b/tutorials/multiphase/interDyMFoam/ras/mixerVesselAMI/system/fvSolution index d09e6aac..e6b5f31c 100644 --- a/tutorials/multiphase/interDyMFoam/ras/mixerVesselAMI/system/fvSolution +++ b/tutorials/multiphase/interDyMFoam/ras/mixerVesselAMI/system/fvSolution @@ -1,7 +1,7 @@ /*--------------------------------*- C++ -*----------------------------------*\ | ========= | | | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | -| \\ / O peration | Version: 2.3.0 | +| \\ / O peration | Version: 2.3.x | | \\ / A nd | Web: www.OpenFOAM.org | | \\/ M anipulation | | \*---------------------------------------------------------------------------*/ @@ -74,9 +74,6 @@ PIMPLE nOuterCorrectors 2; nCorrectors 1; nNonOrthogonalCorrectors 0; - nAlphaCorr 1; - nAlphaSubCycles 2; - cAlpha 1; } relaxationFactors From bbb25e0432e09163fb35f9ed2bccf6ce6b2de0ed Mon Sep 17 00:00:00 2001 From: Henry Date: Thu, 24 Jul 2014 18:01:22 +0100 Subject: [PATCH 08/11] compressibleInterFoam: Add min(T) diagnostics --- applications/solvers/multiphase/compressibleInterFoam/TEqn.H | 2 ++ 1 file changed, 2 insertions(+) diff --git a/applications/solvers/multiphase/compressibleInterFoam/TEqn.H b/applications/solvers/multiphase/compressibleInterFoam/TEqn.H index a02b38a8..13e1feb5 100644 --- a/applications/solvers/multiphase/compressibleInterFoam/TEqn.H +++ b/applications/solvers/multiphase/compressibleInterFoam/TEqn.H @@ -18,4 +18,6 @@ TEqn.solve(); mixture.correct(); + + Info<< "min(T) " << min(T).value() << endl; } From df313c514a362e918460de1a6ab8d8ff139c71a8 Mon Sep 17 00:00:00 2001 From: mattijs Date: Fri, 25 Jul 2014 12:28:39 +0100 Subject: [PATCH 09/11] BUG: searchableCylinder: handling of normal outside cylinder --- .../searchableSurface/searchableCylinder.C | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/meshTools/searchableSurface/searchableCylinder.C b/src/meshTools/searchableSurface/searchableCylinder.C index fb2f7276..496cd04a 100644 --- a/src/meshTools/searchableSurface/searchableCylinder.C +++ b/src/meshTools/searchableSurface/searchableCylinder.C @@ -672,41 +672,41 @@ void Foam::searchableCylinder::getNormal { if ((magV-radius_) < mag(parallel)) { - // above endcap + // either above endcap (magV= radius_ || (radius_-magV) < parallel) { - // above endcap - normal[i] = -unitDir_; + normal[i] = v/magV; } else { - normal[i] = v/mag(v); + // closer to endcap + normal[i] = -unitDir_; } } else if (parallel <= magDir_) { // See if endcap closer or sidewall - if ((magDir_-parallel) <= mag(magV-radius_)) + if (magV >= radius_ || (radius_-magV) < (magDir_-parallel)) { - // above endcap - normal[i] = unitDir_; + normal[i] = v/magV; } else { - normal[i] = v/mag(v); + // closer to endcap + normal[i] = unitDir_; } } - else // beyong cylinder + else // beyond cylinder { if ((magV-radius_) < (parallel-magDir_)) { @@ -715,7 +715,7 @@ void Foam::searchableCylinder::getNormal } else { - normal[i] = v/mag(v); + normal[i] = v/magV; } } } From e3464c2375b474833683346ba1ac713a66e2e382 Mon Sep 17 00:00:00 2001 From: Henry Date: Sat, 26 Jul 2014 21:30:14 +0100 Subject: [PATCH 10/11] compressibleInterFoam: write min(T) --- applications/solvers/multiphase/compressibleInterFoam/TEqn.H | 2 ++ 1 file changed, 2 insertions(+) diff --git a/applications/solvers/multiphase/compressibleInterFoam/TEqn.H b/applications/solvers/multiphase/compressibleInterFoam/TEqn.H index a02b38a8..13e1feb5 100644 --- a/applications/solvers/multiphase/compressibleInterFoam/TEqn.H +++ b/applications/solvers/multiphase/compressibleInterFoam/TEqn.H @@ -18,4 +18,6 @@ TEqn.solve(); mixture.correct(); + + Info<< "min(T) " << min(T).value() << endl; } From 495b2de5a6d3fb350d405d2f11a6499bc75a94ea Mon Sep 17 00:00:00 2001 From: william Date: Mon, 28 Jul 2014 09:26:43 +0100 Subject: [PATCH 11/11] BUG: mantis #1338: added compressible coded fvOption template --- .../dynamicCode/codedFvOptionTemplate.C | 21 ++++++++++++++++++- .../dynamicCode/codedFvOptionTemplate.H | 11 +++++++++- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/etc/codeTemplates/dynamicCode/codedFvOptionTemplate.C b/etc/codeTemplates/dynamicCode/codedFvOptionTemplate.C index 0ac26878..35f017f9 100644 --- a/etc/codeTemplates/dynamicCode/codedFvOptionTemplate.C +++ b/etc/codeTemplates/dynamicCode/codedFvOptionTemplate.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2013 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2013-2014 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -43,6 +43,7 @@ namespace Foam namespace fv { + // * * * * * * * * * * * * * * * Local Functions * * * * * * * * * * * * * * // //{{{ begin localCode @@ -160,6 +161,24 @@ void ${typeName}FvOption${SourceType}::addSup } +void ${typeName}FvOption${SourceType}::addSup +( + const volScalarField& rho, + fvMatrix<${TemplateType}>& eqn, + const label fieldI +) +{ + if (${verbose:-false}) + { + Info<<"${typeName}FvOption${SourceType}::addSup()\n"; + } + +//{{{ begin code + ${codeAddSup} +//}}} end code +} + + void ${typeName}FvOption${SourceType}::setValue ( fvMatrix<${TemplateType}>& eqn, diff --git a/etc/codeTemplates/dynamicCode/codedFvOptionTemplate.H b/etc/codeTemplates/dynamicCode/codedFvOptionTemplate.H index 15f1d1d5..8bc874b7 100644 --- a/etc/codeTemplates/dynamicCode/codedFvOptionTemplate.H +++ b/etc/codeTemplates/dynamicCode/codedFvOptionTemplate.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2013 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2013-2014 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -162,6 +162,15 @@ public: const label fieldI ); + //- Explicit and implicit matrix contributions for compressible + // equations + virtual void addSup + ( + const volScalarField& rho, + fvMatrix<${TemplateType}>& eqn, + const label fieldI + ); + //- Set value virtual void setValue (