/*---------------------------------------------------------------------------*\ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2012-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 "primitiveMeshTools.H" #include "syncTools.H" #include "pyramidPointFaceRef.H" // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // Foam::scalar Foam::primitiveMeshTools::faceSkewness ( const primitiveMesh& mesh, const pointField& p, const vectorField& fCtrs, const vectorField& fAreas, const label faceI, const point& ownCc, const point& neiCc ) { vector Cpf = fCtrs[faceI] - ownCc; vector d = neiCc - ownCc; // Skewness vector vector sv = Cpf - ((fAreas[faceI] & Cpf)/((fAreas[faceI] & d) + SMALL))*d; vector svHat = sv/(mag(sv) + VSMALL); // Normalisation distance calculated as the approximate distance // from the face centre to the edge of the face in the direction // of the skewness scalar fd = 0.2*mag(d) + VSMALL; const face& f = mesh.faces()[faceI]; forAll(f, pi) { fd = max(fd, mag(svHat & (p[f[pi]] - fCtrs[faceI]))); } // Normalised skewness return mag(sv)/fd; } Foam::scalar Foam::primitiveMeshTools::boundaryFaceSkewness ( const primitiveMesh& mesh, const pointField& p, const vectorField& fCtrs, const vectorField& fAreas, const label faceI, const point& ownCc ) { vector Cpf = fCtrs[faceI] - ownCc; vector normal = fAreas[faceI]; normal /= mag(normal) + VSMALL; vector d = normal*(normal & Cpf); // Skewness vector vector sv = Cpf - ((fAreas[faceI] & Cpf)/((fAreas[faceI] & d) + VSMALL))*d; vector svHat = sv/(mag(sv) + VSMALL); // Normalisation distance calculated as the approximate distance // from the face centre to the edge of the face in the direction // of the skewness scalar fd = 0.4*mag(d) + VSMALL; const face& f = mesh.faces()[faceI]; forAll(f, pi) { fd = max(fd, mag(svHat & (p[f[pi]] - fCtrs[faceI]))); } // Normalised skewness return mag(sv)/fd; } Foam::scalar Foam::primitiveMeshTools::faceOrthogonality ( const point& ownCc, const point& neiCc, const vector& s ) { vector d = neiCc - ownCc; return (d & s)/(mag(d)*mag(s) + VSMALL); } // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // Foam::tmp Foam::primitiveMeshTools::faceOrthogonality ( const primitiveMesh& mesh, const vectorField& areas, const vectorField& cc ) { const labelList& own = mesh.faceOwner(); const labelList& nei = mesh.faceNeighbour(); tmp tortho(new scalarField(mesh.nInternalFaces())); scalarField& ortho = tortho(); // Internal faces forAll(nei, faceI) { ortho[faceI] = faceOrthogonality ( cc[own[faceI]], cc[nei[faceI]], areas[faceI] ); } return tortho; } Foam::tmp Foam::primitiveMeshTools::faceSkewness ( const primitiveMesh& mesh, const pointField& p, const vectorField& fCtrs, const vectorField& fAreas, const vectorField& cellCtrs ) { const labelList& own = mesh.faceOwner(); const labelList& nei = mesh.faceNeighbour(); tmp tskew(new scalarField(mesh.nFaces())); scalarField& skew = tskew(); forAll(nei, faceI) { skew[faceI] = faceSkewness ( mesh, p, fCtrs, fAreas, faceI, cellCtrs[own[faceI]], cellCtrs[nei[faceI]] ); } // Boundary faces: consider them to have only skewness error. // (i.e. treat as if mirror cell on other side) for (label faceI = mesh.nInternalFaces(); faceI < mesh.nFaces(); faceI++) { skew[faceI] = boundaryFaceSkewness ( mesh, p, fCtrs, fAreas, faceI, cellCtrs[own[faceI]] ); } return tskew; } void Foam::primitiveMeshTools::facePyramidVolume ( const primitiveMesh& mesh, const pointField& points, const vectorField& ctrs, scalarField& ownPyrVol, scalarField& neiPyrVol ) { const labelList& own = mesh.faceOwner(); const labelList& nei = mesh.faceNeighbour(); const faceList& f = mesh.faces(); ownPyrVol.setSize(mesh.nFaces()); neiPyrVol.setSize(mesh.nInternalFaces()); forAll(f, faceI) { // Create the owner pyramid ownPyrVol[faceI] = -pyramidPointFaceRef ( f[faceI], ctrs[own[faceI]] ).mag(points); if (mesh.isInternalFace(faceI)) { // Create the neighbour pyramid - it will have positive volume neiPyrVol[faceI] = pyramidPointFaceRef ( f[faceI], ctrs[nei[faceI]] ).mag(points); } } } void Foam::primitiveMeshTools::cellClosedness ( const primitiveMesh& mesh, const Vector