/*---------------------------------------------------------------------------*\ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-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 "polyMesh.H" #include "Time.H" #include "cellIOList.H" // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // void Foam::polyMesh::setInstance(const fileName& inst) { if (debug) { Info<< "void polyMesh::setInstance(const fileName& inst) : " << "Resetting file instance to " << inst << endl; } points_.writeOpt() = IOobject::AUTO_WRITE; points_.instance() = inst; faces_.writeOpt() = IOobject::AUTO_WRITE; faces_.instance() = inst; owner_.writeOpt() = IOobject::AUTO_WRITE; owner_.instance() = inst; neighbour_.writeOpt() = IOobject::AUTO_WRITE; neighbour_.instance() = inst; boundary_.writeOpt() = IOobject::AUTO_WRITE; boundary_.instance() = inst; pointZones_.writeOpt() = IOobject::AUTO_WRITE; pointZones_.instance() = inst; faceZones_.writeOpt() = IOobject::AUTO_WRITE; faceZones_.instance() = inst; cellZones_.writeOpt() = IOobject::AUTO_WRITE; cellZones_.instance() = inst; } Foam::polyMesh::readUpdateState Foam::polyMesh::readUpdate() { if (debug) { Info<< "polyMesh::readUpdateState polyMesh::readUpdate() : " << "Updating mesh based on saved data." << endl; } // Find the point and cell instance fileName pointsInst(time().findInstance(meshDir(), "points")); fileName facesInst(time().findInstance(meshDir(), "faces")); //fileName boundaryInst(time().findInstance(meshDir(), "boundary")); if (debug) { Info<< "Faces instance: old = " << facesInstance() << " new = " << facesInst << nl //<< "Boundary instance: old = " << boundary_.instance() //<< " new = " << boundaryInst << nl << "Points instance: old = " << pointsInstance() << " new = " << pointsInst << endl; } if (facesInst != facesInstance()) { // Topological change if (debug) { Info<< "Topological change" << endl; } clearOut(); // Set instance to new instance. Note that points instance can differ // from from faces instance. setInstance(facesInst); points_.instance() = pointsInst; points_ = pointIOField ( IOobject ( "points", pointsInst, meshSubDir, *this, IOobject::MUST_READ, IOobject::NO_WRITE, false ) ); faces_ = faceCompactIOList ( IOobject ( "faces", facesInst, meshSubDir, *this, IOobject::MUST_READ, IOobject::NO_WRITE, false ) ); owner_ = labelIOList ( IOobject ( "owner", facesInst, meshSubDir, *this, IOobject::READ_IF_PRESENT, IOobject::NO_WRITE, false ) ); neighbour_ = labelIOList ( IOobject ( "neighbour", facesInst, meshSubDir, *this, IOobject::READ_IF_PRESENT, IOobject::NO_WRITE, false ) ); // Reset the boundary patches polyBoundaryMesh newBoundary ( IOobject ( "boundary", facesInst, meshSubDir, *this, IOobject::MUST_READ, IOobject::NO_WRITE, false ), *this ); // Check that patch types and names are unchanged bool boundaryChanged = false; if (newBoundary.size() != boundary_.size()) { boundaryChanged = true; } else { wordList newTypes = newBoundary.types(); wordList newNames = newBoundary.names(); wordList oldTypes = boundary_.types(); wordList oldNames = boundary_.names(); forAll(oldTypes, patchI) { if ( oldTypes[patchI] != newTypes[patchI] || oldNames[patchI] != newNames[patchI] ) { boundaryChanged = true; break; } } } if (boundaryChanged) { WarningIn("polyMesh::readUpdateState polyMesh::readUpdate()") << "Number of patches has changed. This may have " << "unexpected consequences. Proceed with care." << endl; boundary_.clear(); boundary_.setSize(newBoundary.size()); forAll(newBoundary, patchI) { boundary_.set(patchI, newBoundary[patchI].clone(boundary_)); } } else { forAll(boundary_, patchI) { boundary_[patchI] = polyPatch ( newBoundary[patchI].name(), newBoundary[patchI].size(), newBoundary[patchI].start(), patchI, boundary_, newBoundary[patchI].type() ); } } // Boundary is set so can use initMesh now (uses boundary_ to // determine internal and active faces) if (exists(owner_.objectPath())) { initMesh(); } else { cellCompactIOList cells ( IOobject ( "cells", facesInst, meshSubDir, *this, IOobject::MUST_READ, IOobject::NO_WRITE, false ) ); // Recalculate the owner/neighbour addressing and reset the // primitiveMesh initMesh(cells); } // Even if number of patches stayed same still recalculate boundary // data. // Calculate topology for the patches (processor-processor comms etc.) boundary_.updateMesh(); // Calculate the geometry for the patches (transformation tensors etc.) boundary_.calcGeometry(); // Derived info bounds_ = boundBox(points_); geometricD_ = Vector