/*---------------------------------------------------------------------------*\ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2016 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 . Application postProcess Description Execute the set of functionObjects specified in the selected dictionary (which defaults to system/controlDict) or on the command-line for the selected set of times on the selected set of fields. \*---------------------------------------------------------------------------*/ #include "argList.H" #include "profiling.H" #include "timeSelector.H" #include "ReadFields.H" #include "volFields.H" #include "surfaceFields.H" #include "pointFields.H" #include "uniformDimensionedFields.H" #include "fileFieldSelection.H" using namespace Foam; // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // #define ReadFields(GeoFieldType) \ readFields(mesh, objects, selectedFields, storedObjects); #define ReadPointFields(GeoFieldType) \ readFields(pMesh, objects, selectedFields, storedObjects); #define ReadUniformFields(FieldType) \ readUniformFields \ (constantObjects, selectedFields, storedObjects); void executeFunctionObjects ( const argList& args, const Time& runTime, fvMesh& mesh, const wordHashSet& selectedFields, functionObjectList& functions, bool lastTime ) { Info<< nl << "Reading fields:" << endl; // Maintain a stack of the stored objects to clear after executing // the functionObjects LIFOStack storedObjects; // Read objects in time directory IOobjectList objects(mesh, runTime.timeName()); // Read volFields ReadFields(volScalarField); ReadFields(volVectorField); ReadFields(volSphericalTensorField); ReadFields(volSymmTensorField); ReadFields(volTensorField); // Read internal fields ReadFields(volScalarField::Internal); ReadFields(volVectorField::Internal); ReadFields(volSphericalTensorField::Internal); ReadFields(volSymmTensorField::Internal); ReadFields(volTensorField::Internal); // Read surface fields ReadFields(surfaceScalarField); ReadFields(surfaceVectorField); ReadFields(surfaceSphericalTensorField); ReadFields(surfaceSymmTensorField); ReadFields(surfaceTensorField); // Read point fields. const pointMesh& pMesh = pointMesh::New(mesh); ReadPointFields(pointScalarField) ReadPointFields(pointVectorField); ReadPointFields(pointSphericalTensorField); ReadPointFields(pointSymmTensorField); ReadPointFields(pointTensorField); // Read uniform dimensioned fields IOobjectList constantObjects(mesh, runTime.constant()); ReadUniformFields(uniformDimensionedScalarField); ReadUniformFields(uniformDimensionedVectorField); ReadUniformFields(uniformDimensionedSphericalTensorField); ReadUniformFields(uniformDimensionedSymmTensorField); ReadUniformFields(uniformDimensionedTensorField); Info<< nl << "Executing functionObjects" << endl; // Execute the functionObjects in post-processing mode functions.execute(); // Execute the functionObject 'end()' function for the last time if (lastTime) { functions.end(); } while (!storedObjects.empty()) { storedObjects.pop()->checkOut(); } } int main(int argc, char *argv[]) { Foam::timeSelector::addOptions(); #include "addProfilingOption.H" #include "addRegionOption.H" #include "addFunctionObjectOptions.H" // Set functionObject post-processing mode functionObject::postProcess = true; #include "setRootCase.H" if (args.found("list")) { functionObjectList::list(); return 0; } #include "createTime.H" Foam::instantList timeDirs = Foam::timeSelector::select0(runTime, args); #include "createNamedMesh.H" // Initialize the set of selected fields from the command-line options functionObjects::fileFieldSelection fields(mesh); if (args.found("fields")) { args.lookup("fields")() >> fields; } if (args.found("field")) { fields.insert(args.lookup("field")()); } // Externally stored dictionary for functionObjectList // if not constructed from runTime dictionary functionsDict; // Construct functionObjectList autoPtr functionsPtr ( functionObjectList::New ( args, runTime, functionsDict, fields ) ); forAll(timeDirs, timei) { runTime.setTime(timeDirs[timei], timei); Info<< "Time = " << runTime.timeName() << endl; fields.updateSelection(); if (mesh.readUpdate() != polyMesh::UNCHANGED) { // Update functionObjectList if mesh changes functionsPtr = functionObjectList::New ( args, runTime, functionsDict, fields ); } const bool throwingIOErr = FatalIOError.throwExceptions(); try { executeFunctionObjects ( args, runTime, mesh, fields.selection(), functionsPtr(), timei == timeDirs.size()-1 ); // Report to output (avoid overwriting values from simulation) profiling::print(Info); } catch (Foam::IOerror& err) { Warning<< err << endl; } Info<< endl; // Restore previous exception throwing state FatalIOError.throwExceptions(throwingIOErr); } Info<< "End\n" << endl; return 0; } // ************************************************************************* //