From e5b4b6d9c0e27ce43a49fe550dc8d05a9695e9d5 Mon Sep 17 00:00:00 2001 From: andy Date: Wed, 9 Jan 2013 11:19:37 +0000 Subject: [PATCH 01/18] ENH: Relocated tetOverlapVolume to meshTools --- src/meshTools/Make/files | 2 ++ .../tetOverlapVolume/tetOverlapVolume.C | 2 +- .../tetOverlapVolume/tetOverlapVolume.H | 7 +++---- src/sampling/Make/files | 3 --- 4 files changed, 6 insertions(+), 8 deletions(-) rename src/{sampling/meshToMeshInterpolation => meshTools}/tetOverlapVolume/tetOverlapVolume.C (98%) rename src/{sampling/meshToMeshInterpolation => meshTools}/tetOverlapVolume/tetOverlapVolume.H (94%) diff --git a/src/meshTools/Make/files b/src/meshTools/Make/files index d159b0df0b..401d14a383 100644 --- a/src/meshTools/Make/files +++ b/src/meshTools/Make/files @@ -201,4 +201,6 @@ regionCoupled/GAMG/interfaces/regionCoupledGAMGInterface/regionCoupledWallGAMGIn regionCoupled/GAMG/interfaceFields/regionCoupledGAMGInterfaceField/regionCoupledGAMGInterfaceField.C regionCoupled/GAMG/interfaceFields/regionCoupledGAMGInterfaceField/regionCoupledWallGAMGInterfaceField.C +tetOverlapVolume/tetOverlapVolume.C + LIB = $(FOAM_LIBBIN)/libmeshTools diff --git a/src/sampling/meshToMeshInterpolation/tetOverlapVolume/tetOverlapVolume.C b/src/meshTools/tetOverlapVolume/tetOverlapVolume.C similarity index 98% rename from src/sampling/meshToMeshInterpolation/tetOverlapVolume/tetOverlapVolume.C rename to src/meshTools/tetOverlapVolume/tetOverlapVolume.C index 219d78ce76..c430a48031 100644 --- a/src/sampling/meshToMeshInterpolation/tetOverlapVolume/tetOverlapVolume.C +++ b/src/meshTools/tetOverlapVolume/tetOverlapVolume.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2012-2013 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License diff --git a/src/sampling/meshToMeshInterpolation/tetOverlapVolume/tetOverlapVolume.H b/src/meshTools/tetOverlapVolume/tetOverlapVolume.H similarity index 94% rename from src/sampling/meshToMeshInterpolation/tetOverlapVolume/tetOverlapVolume.H rename to src/meshTools/tetOverlapVolume/tetOverlapVolume.H index e8890a3ee9..631ed9a50d 100644 --- a/src/sampling/meshToMeshInterpolation/tetOverlapVolume/tetOverlapVolume.H +++ b/src/meshTools/tetOverlapVolume/tetOverlapVolume.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2012-2013 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -26,7 +26,7 @@ Class Foam::tetOverlapVolume Description - Calculates overlap volume of two tets. + Calculates the overlap volume of two cells using tetrahedral decomposition SourceFiles tetOverlapVolume.C @@ -55,7 +55,7 @@ class tetOverlapVolume { // Private member functions - //- Tet Overlap Vol + //- Tet overlap volume scalar tetTetOverlapVol ( const tetPoints& tetA, @@ -112,7 +112,6 @@ public: } // End namespace Foam - // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // #endif diff --git a/src/sampling/Make/files b/src/sampling/Make/files index ef0415f0f2..5dc8a0ac8f 100644 --- a/src/sampling/Make/files +++ b/src/sampling/Make/files @@ -59,8 +59,5 @@ $(meshToMesh)/meshToMesh.C $(meshToMesh)/calculateMeshToMeshAddressing.C $(meshToMesh)/calculateMeshToMeshWeights.C -tetOverlapVolume = meshToMeshInterpolation/tetOverlapVolume -$(tetOverlapVolume)/tetOverlapVolume.C - LIB = $(FOAM_LIBBIN)/libsampling From 9bf0087fe4715ebf09292cf03b4f359d02745cdd Mon Sep 17 00:00:00 2001 From: andy Date: Wed, 9 Jan 2013 11:47:25 +0000 Subject: [PATCH 02/18] ENH: Added intersection test to tetOverlapVolume --- .../tetOverlapVolume/tetOverlapVolume.C | 129 ++++++++++++++++++ .../tetOverlapVolume/tetOverlapVolume.H | 12 +- 2 files changed, 140 insertions(+), 1 deletion(-) diff --git a/src/meshTools/tetOverlapVolume/tetOverlapVolume.C b/src/meshTools/tetOverlapVolume/tetOverlapVolume.C index c430a48031..c0f192f7de 100644 --- a/src/meshTools/tetOverlapVolume/tetOverlapVolume.C +++ b/src/meshTools/tetOverlapVolume/tetOverlapVolume.C @@ -130,6 +130,135 @@ Foam::treeBoundBox Foam::tetOverlapVolume::pyrBb // * * * * * * * * * * * Public Member Functions * * * * * * * * * * * * * // +bool Foam::tetOverlapVolume::cellCellOverlapMinDecomp +( + const primitiveMesh& meshA, + const label cellAI, + const primitiveMesh& meshB, + const label cellBI, + const treeBoundBox& cellBbB, + const scalar threshold +) const +{ + const cell& cFacesA = meshA.cells()[cellAI]; + const point& ccA = meshA.cellCentres()[cellAI]; + + const cell& cFacesB = meshB.cells()[cellBI]; + const point& ccB = meshB.cellCentres()[cellBI]; + + scalar vol = 0.0; + + forAll(cFacesA, cFA) + { + label faceAI = cFacesA[cFA]; + + const face& fA = meshA.faces()[faceAI]; + const treeBoundBox pyrA = pyrBb(meshA.points(), fA, ccA); + if (!pyrA.overlaps(cellBbB)) + { + continue; + } + + bool ownA = (meshA.faceOwner()[faceAI] == cellAI); + + label tetBasePtAI = 0; + + const point& tetBasePtA = meshA.points()[fA[tetBasePtAI]]; + + for (label tetPtI = 1; tetPtI < fA.size() - 1; tetPtI++) + { + label facePtAI = (tetPtI + tetBasePtAI) % fA.size(); + label otherFacePtAI = fA.fcIndex(facePtAI); + + label pt0I = -1; + label pt1I = -1; + + if (ownA) + { + pt0I = fA[facePtAI]; + pt1I = fA[otherFacePtAI]; + } + else + { + pt0I = fA[otherFacePtAI]; + pt1I = fA[facePtAI]; + } + + const tetPoints tetA + ( + ccA, + tetBasePtA, + meshA.points()[pt0I], + meshA.points()[pt1I] + ); + const treeBoundBox tetABb(tetA.bounds()); + + + // Loop over tets of cellB + forAll(cFacesB, cFB) + { + label faceBI = cFacesB[cFB]; + + const face& fB = meshB.faces()[faceBI]; + const treeBoundBox pyrB = pyrBb(meshB.points(), fB, ccB); + if (!pyrB.overlaps(pyrA)) + { + continue; + } + + bool ownB = (meshB.faceOwner()[faceBI] == cellBI); + + label tetBasePtBI = 0; + + const point& tetBasePtB = meshB.points()[fB[tetBasePtBI]]; + + for (label tetPtI = 1; tetPtI < fB.size() - 1; tetPtI++) + { + label facePtBI = (tetPtI + tetBasePtBI) % fB.size(); + label otherFacePtBI = fB.fcIndex(facePtBI); + + label pt0I = -1; + label pt1I = -1; + + if (ownB) + { + pt0I = fB[facePtBI]; + pt1I = fB[otherFacePtBI]; + } + else + { + pt0I = fB[otherFacePtBI]; + pt1I = fB[facePtBI]; + } + + const tetPoints tetB + ( + ccB, + tetBasePtB, + meshB.points()[pt0I], + meshB.points()[pt1I] + ); + + if (!tetB.bounds().overlaps(tetABb)) + { + continue; + } + + vol += tetTetOverlapVol(tetA, tetB); + + if (vol > threshold) + { + return true; + } + } + } + } + } + + return false; +} + + Foam::scalar Foam::tetOverlapVolume::cellCellOverlapVolumeMinDecomp ( const primitiveMesh& meshA, diff --git a/src/meshTools/tetOverlapVolume/tetOverlapVolume.H b/src/meshTools/tetOverlapVolume/tetOverlapVolume.H index 631ed9a50d..58646f2e5a 100644 --- a/src/meshTools/tetOverlapVolume/tetOverlapVolume.H +++ b/src/meshTools/tetOverlapVolume/tetOverlapVolume.H @@ -48,7 +48,7 @@ class polyMesh; class tetPoints; /*---------------------------------------------------------------------------*\ - Class tetOverlapVolume Declaration + Class tetOverlapVolume Declaration \*---------------------------------------------------------------------------*/ class tetOverlapVolume @@ -94,6 +94,16 @@ public: const label cellBI ) const; + //- Return true if olverlap volume is greater than threshold + bool cellCellOverlapMinDecomp + ( + const primitiveMesh& meshA, + const label cellAI, + const primitiveMesh& meshB, + const label cellBI, + const treeBoundBox& cellBbB, + const scalar threshold = 0.0 + ) const; //- Calculates the overlap volume scalar cellCellOverlapVolumeMinDecomp From 631a47a37810d7d5904e8dc7330126852c845b0f Mon Sep 17 00:00:00 2001 From: andy Date: Wed, 9 Jan 2013 11:50:23 +0000 Subject: [PATCH 03/18] ENH: Added new mesh-to-mesh interpolation class --- src/sampling/Make/files | 3 + .../meshToMeshNew/meshToMeshNew.C | 955 ++++++++++++++++++ .../meshToMeshNew/meshToMeshNew.H | 494 +++++++++ .../meshToMeshNew/meshToMeshNewI.H | 64 ++ .../meshToMeshNew/meshToMeshNewParallelOps.C | 884 ++++++++++++++++ .../meshToMeshNew/meshToMeshNewTemplates.C | 537 ++++++++++ 6 files changed, 2937 insertions(+) create mode 100644 src/sampling/meshToMeshInterpolation/meshToMeshNew/meshToMeshNew.C create mode 100644 src/sampling/meshToMeshInterpolation/meshToMeshNew/meshToMeshNew.H create mode 100644 src/sampling/meshToMeshInterpolation/meshToMeshNew/meshToMeshNewI.H create mode 100644 src/sampling/meshToMeshInterpolation/meshToMeshNew/meshToMeshNewParallelOps.C create mode 100644 src/sampling/meshToMeshInterpolation/meshToMeshNew/meshToMeshNewTemplates.C diff --git a/src/sampling/Make/files b/src/sampling/Make/files index 5dc8a0ac8f..747097a781 100644 --- a/src/sampling/Make/files +++ b/src/sampling/Make/files @@ -59,5 +59,8 @@ $(meshToMesh)/meshToMesh.C $(meshToMesh)/calculateMeshToMeshAddressing.C $(meshToMesh)/calculateMeshToMeshWeights.C +meshToMeshNew = meshToMeshInterpolation/meshToMeshNew +$(meshToMeshNew)/meshToMeshNew.C +$(meshToMeshNew)/meshToMeshNewParallelOps.C LIB = $(FOAM_LIBBIN)/libsampling diff --git a/src/sampling/meshToMeshInterpolation/meshToMeshNew/meshToMeshNew.C b/src/sampling/meshToMeshInterpolation/meshToMeshNew/meshToMeshNew.C new file mode 100644 index 0000000000..b71e768f42 --- /dev/null +++ b/src/sampling/meshToMeshInterpolation/meshToMeshNew/meshToMeshNew.C @@ -0,0 +1,955 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012-2013 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 "meshToMeshNew.H" +#include "OFstream.H" +#include "Time.H" +#include "globalIndex.H" +#include "mergePoints.H" +#include "treeBoundBox.H" +#include "tetOverlapVolume.H" +#include "indexedOctree.H" +#include "treeDataCell.H" +#include "ListOps.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +namespace Foam +{ + defineTypeNameAndDebug(meshToMeshNew, 0); +} + +Foam::scalar Foam::meshToMeshNew::tolerance_ = 1e-6; + +// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // + +void Foam::meshToMeshNew::writeConnectivity +( + const polyMesh& src, + const polyMesh& tgt, + const labelListList& srcToTargetAddr +) const +{ + Pout<< "Source size = " << src.nCells() << endl; + Pout<< "Target size = " << tgt.nCells() << endl; + + word fName("addressing_" + src.name() + "_to_" + tgt.name()); + + if (Pstream::parRun()) + { + fName = fName + "_proc" + Foam::name(Pstream::myProcNo()); + } + + OFstream os(src.time().path()/fName + ".obj"); + + label vertI = 0; + forAll(srcToTargetAddr, i) + { + const labelList& tgtAddress = srcToTargetAddr[i]; + forAll(tgtAddress, j) + { + label tgtI = tgtAddress[j]; + const vector& c0 = src.cellCentres()[i]; + + const cell& c = tgt.cells()[tgtI]; + const pointField pts(c.points(tgt.faces(), tgt.points())); + forAll(pts, j) + { + const point& p = pts[j]; + os << "v " << p.x() << ' ' << p.y() << ' ' << p.z() << nl; + vertI++; + os << "v " << c0.x() << ' ' << c0.y() << ' ' << c0.z() + << nl; + vertI++; + os << "l " << vertI - 1 << ' ' << vertI << nl; + } + } + } +} + + +Foam::labelList Foam::meshToMeshNew::maskCells +( + const polyMesh& src, + const polyMesh& tgt +) const +{ + boundBox intersectBb + ( + max(src.bounds().min(), tgt.bounds().min()), + min(src.bounds().max(), tgt.bounds().max()) + ); + + intersectBb.inflate(0.01); + + const cellList& srcCells = src.cells(); + const faceList& srcFaces = src.faces(); + const pointField& srcPts = src.points(); + + DynamicList