/*---------------------------------------------------------------------------*\ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2012 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 "fvMeshTools.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // Adds patch if not yet there. Returns patchID. Foam::label Foam::fvMeshTools::addPatch ( fvMesh& mesh, const polyPatch& patch, const dictionary& patchFieldDict, const word& defaultPatchFieldType, const bool validBoundary ) { polyBoundaryMesh& polyPatches = const_cast(mesh.boundaryMesh()); label patchI = polyPatches.findPatchID(patch.name()); if (patchI != -1) { // Already there return patchI; } // Append at end unless there are processor patches label insertPatchI = polyPatches.size(); label startFaceI = mesh.nFaces(); if (!isA(patch)) { forAll(polyPatches, patchI) { const polyPatch& pp = polyPatches[patchI]; if (isA(pp)) { insertPatchI = patchI; startFaceI = pp.start(); break; } } } // Below is all quite a hack. Feel free to change once there is a better // mechanism to insert and reorder patches. // Clear local fields and e.g. polyMesh parallelInfo. mesh.clearOut(); label sz = polyPatches.size(); fvBoundaryMesh& fvPatches = const_cast(mesh.boundary()); // Add polyPatch at the end polyPatches.setSize(sz+1); polyPatches.set ( sz, patch.clone ( polyPatches, insertPatchI, //index 0, //size startFaceI //start ) ); fvPatches.setSize(sz+1); fvPatches.set ( sz, fvPatch::New ( polyPatches[sz], // point to newly added polyPatch mesh.boundary() ) ); addPatchFields ( mesh, patchFieldDict, defaultPatchFieldType, pTraits::zero ); addPatchFields ( mesh, patchFieldDict, defaultPatchFieldType, pTraits::zero ); addPatchFields ( mesh, patchFieldDict, defaultPatchFieldType, pTraits::zero ); addPatchFields ( mesh, patchFieldDict, defaultPatchFieldType, pTraits::zero ); addPatchFields ( mesh, patchFieldDict, defaultPatchFieldType, pTraits::zero ); // Surface fields addPatchFields ( mesh, patchFieldDict, defaultPatchFieldType, pTraits::zero ); addPatchFields ( mesh, patchFieldDict, defaultPatchFieldType, pTraits::zero ); addPatchFields ( mesh, patchFieldDict, defaultPatchFieldType, pTraits::zero ); addPatchFields ( mesh, patchFieldDict, defaultPatchFieldType, pTraits::zero ); addPatchFields ( mesh, patchFieldDict, defaultPatchFieldType, pTraits::zero ); // Create reordering list // patches before insert position stay as is labelList oldToNew(sz+1); for (label i = 0; i < insertPatchI; i++) { oldToNew[i] = i; } // patches after insert position move one up for (label i = insertPatchI; i < sz; i++) { oldToNew[i] = i+1; } // appended patch gets moved to insert position oldToNew[sz] = insertPatchI; // Shuffle into place polyPatches.reorder(oldToNew, validBoundary); fvPatches.reorder(oldToNew); reorderPatchFields(mesh, oldToNew); reorderPatchFields(mesh, oldToNew); reorderPatchFields(mesh, oldToNew); reorderPatchFields(mesh, oldToNew); reorderPatchFields(mesh, oldToNew); reorderPatchFields(mesh, oldToNew); reorderPatchFields(mesh, oldToNew); reorderPatchFields(mesh, oldToNew); reorderPatchFields(mesh, oldToNew); reorderPatchFields(mesh, oldToNew); return insertPatchI; } void Foam::fvMeshTools::setPatchFields ( fvMesh& mesh, const label patchI, const dictionary& patchFieldDict ) { setPatchFields(mesh, patchI, patchFieldDict); setPatchFields(mesh, patchI, patchFieldDict); setPatchFields(mesh, patchI, patchFieldDict); setPatchFields(mesh, patchI, patchFieldDict); setPatchFields(mesh, patchI, patchFieldDict); setPatchFields(mesh, patchI, patchFieldDict); setPatchFields(mesh, patchI, patchFieldDict); setPatchFields ( mesh, patchI, patchFieldDict ); setPatchFields(mesh, patchI, patchFieldDict); setPatchFields(mesh, patchI, patchFieldDict); } void Foam::fvMeshTools::zeroPatchFields(fvMesh& mesh, const label patchI) { setPatchFields(mesh, patchI, pTraits::zero); setPatchFields(mesh, patchI, pTraits::zero); setPatchFields ( mesh, patchI, pTraits::zero ); setPatchFields ( mesh, patchI, pTraits::zero ); setPatchFields(mesh, patchI, pTraits::zero); setPatchFields(mesh, patchI, pTraits::zero); setPatchFields(mesh, patchI, pTraits::zero); setPatchFields ( mesh, patchI, pTraits::zero ); setPatchFields ( mesh, patchI, pTraits::zero ); setPatchFields(mesh, patchI, pTraits::zero); } // Deletes last patch void Foam::fvMeshTools::trimPatches(fvMesh& mesh, const label nPatches) { // Clear local fields and e.g. polyMesh globalMeshData. mesh.clearOut(); polyBoundaryMesh& polyPatches = const_cast(mesh.boundaryMesh()); fvBoundaryMesh& fvPatches = const_cast(mesh.boundary()); if (polyPatches.empty()) { FatalErrorIn("fvMeshTools::trimPatches(fvMesh&, const label)") << "No patches in mesh" << abort(FatalError); } label nFaces = 0; for (label patchI = nPatches; patchI < polyPatches.size(); patchI++) { nFaces += polyPatches[patchI].size(); } reduce(nFaces, sumOp