From cc825319d2b6c523bc08c5c44967d3847c21ed49 Mon Sep 17 00:00:00 2001 From: mattijs Date: Fri, 18 Nov 2011 11:27:30 +0000 Subject: [PATCH] ENH: singleCellMesh: do all times, write to different region --- .../singleCellMesh/singleCellMesh.C | 152 ++++++++++++------ 1 file changed, 101 insertions(+), 51 deletions(-) diff --git a/applications/utilities/mesh/manipulation/singleCellMesh/singleCellMesh.C b/applications/utilities/mesh/manipulation/singleCellMesh/singleCellMesh.C index e47e27461b..facacddcb0 100644 --- a/applications/utilities/mesh/manipulation/singleCellMesh/singleCellMesh.C +++ b/applications/utilities/mesh/manipulation/singleCellMesh/singleCellMesh.C @@ -25,25 +25,32 @@ Application singleCellMesh Description - Removes all but one cells of the mesh. Used to generate mesh and fields + Reads all fields and maps them to a mesh with all internal faces removed + (singleCellFvMesh) which gets written to region "singleCell". + + Used to generate mesh and fields that can be used for boundary-only data. Might easily result in illegal mesh though so only look at boundaries in paraview. \*---------------------------------------------------------------------------*/ - #include "argList.H" #include "fvMesh.H" #include "volFields.H" #include "Time.H" #include "ReadFields.H" #include "singleCellFvMesh.H" +#include "timeSelector.H" using namespace Foam; // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // +// Name of region to create +const string singleCellName = "singleCell"; + + template void interpolateFields ( @@ -65,72 +72,115 @@ void interpolateFields int main(int argc, char *argv[]) { -# include "addOverwriteOption.H" -# include "addTimeOptions.H" + // constant, not false + timeSelector::addOptions(true, false); # include "setRootCase.H" # include "createTime.H" - // Get times list - instantList Times = runTime.times(); -# include "checkTimeOptions.H" - runTime.setTime(Times[startTime], startTime); -# include "createMesh.H" - const word oldInstance = mesh.pointsInstance(); - const bool overwrite = args.optionFound("overwrite"); + instantList timeDirs = timeSelector::select0(runTime, args); +# include "createNamedMesh.H" - // Read objects in time directory - IOobjectList objects(mesh, runTime.timeName()); - - // Read vol fields. - PtrList vsFlds; - ReadFields(mesh, objects, vsFlds); - - PtrList vvFlds; - ReadFields(mesh, objects, vvFlds); - - PtrList vstFlds; - ReadFields(mesh, objects, vstFlds); - - PtrList vsymtFlds; - ReadFields(mesh, objects, vsymtFlds); - - PtrList vtFlds; - ReadFields(mesh, objects, vtFlds); - - - if (!overwrite) + if (regionName == singleCellName) { - runTime++; + FatalErrorIn(args.executable()) + << "Cannot convert region " << singleCellName + << " since result would overwrite it. Please rename your region." + << exit(FatalError); } // Create the mesh - singleCellFvMesh scMesh + Info<< "Creating singleCell mesh" << nl << endl; + autoPtr scMesh ( - IOobject + new singleCellFvMesh ( - mesh.name(), - mesh.polyMesh::instance(), - runTime, - IOobject::NO_READ, - IOobject::AUTO_WRITE - ), - mesh + IOobject + ( + singleCellName, + mesh.polyMesh::instance(), + runTime, + IOobject::NO_READ, + IOobject::AUTO_WRITE + ), + mesh + ) ); + // For convenience create any fv* files + if (!exists(scMesh().fvSolution::objectPath())) + { + mkDir(scMesh().fvSolution::path()); + ln("../fvSolution", scMesh().fvSolution::objectPath()); + } + if (!exists(scMesh().fvSchemes::objectPath())) + { + mkDir(scMesh().fvSolution::path()); + ln("../fvSchemes", scMesh().fvSchemes::objectPath()); + } - // Map and store the fields on the scMesh. - interpolateFields(scMesh, vsFlds); - interpolateFields(scMesh, vvFlds); - interpolateFields(scMesh, vstFlds); - interpolateFields(scMesh, vsymtFlds); - interpolateFields(scMesh, vtFlds); + forAll(timeDirs, timeI) + { + runTime.setTime(timeDirs[timeI], timeI); + + Info<< nl << "Time = " << runTime.timeName() << endl; - // Write - Info<< "Writing mesh to time " << runTime.timeName() << endl; - scMesh.write(); + // Check for new mesh + if (mesh.readUpdate() != polyMesh::UNCHANGED) + { + Info<< "Detected changed mesh. Recreating singleCell mesh." << endl; + scMesh.clear(); // remove any registered objects + scMesh.reset + ( + new singleCellFvMesh + ( + IOobject + ( + singleCellName, + mesh.polyMesh::instance(), + runTime, + IOobject::NO_READ, + IOobject::AUTO_WRITE + ), + mesh + ) + ); + } + + + // Read objects in time directory + IOobjectList objects(mesh, runTime.timeName()); + + // Read vol fields. + PtrList vsFlds; + ReadFields(mesh, objects, vsFlds); + + PtrList vvFlds; + ReadFields(mesh, objects, vvFlds); + + PtrList vstFlds; + ReadFields(mesh, objects, vstFlds); + + PtrList vsymtFlds; + ReadFields(mesh, objects, vsymtFlds); + + PtrList vtFlds; + ReadFields(mesh, objects, vtFlds); + + // Map and store the fields on the scMesh. + interpolateFields(scMesh(), vsFlds); + interpolateFields(scMesh(), vvFlds); + interpolateFields(scMesh(), vstFlds); + interpolateFields(scMesh(), vsymtFlds); + interpolateFields(scMesh(), vtFlds); + + + // Write + Info<< "Writing mesh to time " << runTime.timeName() << endl; + scMesh().write(); + } Info<< "End\n" << endl;