Skip to content
Snippets Groups Projects
  • Henry Weller's avatar
    9a739863
    functionObjects::writeObjects: Added option "writeOption" · 9a739863
    Henry Weller authored
    Description
        Allows specification of different writing frequency of objects registered
        to the database.
    
        It has similar functionality as the main time database through the
        \c writeControl setting:
          - timeStep
          - writeTime
          - adjustableRunTime
          - runTime
          - clockTime
          - cpuTime
    
        It also has the ability to write the selected objects that were defined
        with the respective write mode for the requested \c writeOption, namely:
          - \c autoWrite - objects set to write at output time
          - \c noWrite   - objects set to not write by default
          - \c anyWrite  - any option of the previous two
    
        Example of function object specification:
        \verbatim
        writeObjects1
        {
            type        writeObjects;
            libs        ("libutilityFunctionObjects.so");
            ...
            objects     (obj1 obj2);
            writeOption anyWrite;
        }
        \endverbatim
    
    Patch contributed by Bruno Santos
    Resolves bug-report http://bugs.openfoam.org/view.php?id=2090
    9a739863
    History
    functionObjects::writeObjects: Added option "writeOption"
    Henry Weller authored
    Description
        Allows specification of different writing frequency of objects registered
        to the database.
    
        It has similar functionality as the main time database through the
        \c writeControl setting:
          - timeStep
          - writeTime
          - adjustableRunTime
          - runTime
          - clockTime
          - cpuTime
    
        It also has the ability to write the selected objects that were defined
        with the respective write mode for the requested \c writeOption, namely:
          - \c autoWrite - objects set to write at output time
          - \c noWrite   - objects set to not write by default
          - \c anyWrite  - any option of the previous two
    
        Example of function object specification:
        \verbatim
        writeObjects1
        {
            type        writeObjects;
            libs        ("libutilityFunctionObjects.so");
            ...
            objects     (obj1 obj2);
            writeOption anyWrite;
        }
        \endverbatim
    
    Patch contributed by Bruno Santos
    Resolves bug-report http://bugs.openfoam.org/view.php?id=2090
writeObjects.C 4.99 KiB
/*---------------------------------------------------------------------------*\
  =========                 |
  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
   \\    /   O peration     |
    \\  /    A nd           | Copyright (C) 2011-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 <http://www.gnu.org/licenses/>.

\*---------------------------------------------------------------------------*/

#include "writeObjects.H"
#include "Time.H"
#include "polyMesh.H"
#include "addToRunTimeSelectionTable.H"

// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //

namespace Foam
{
namespace functionObjects
{
    defineTypeNameAndDebug(writeObjects, 0);

    addToRunTimeSelectionTable
    (
        functionObject,
        writeObjects,
        dictionary
    );

    template<>
    const char* Foam::NamedEnum
    <
        Foam::functionObjects::writeObjects::writeOption,
        3
    >::names[] =
    {
        "autoWrite",
        "noWrite",
        "anyWrite"
    };
}
}

const Foam::NamedEnum<Foam::functionObjects::writeObjects::writeOption, 3>
    Foam::functionObjects::writeObjects::writeOptionNames;


// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //

Foam::functionObjects::writeObjects::writeObjects
(
    const word& name,
    const Time& runTime,
    const dictionary& dict
)
:
    functionObject(name),
    obr_
    (
        runTime.lookupObject<objectRegistry>
        (
            dict.lookupOrDefault("region", polyMesh::defaultRegion)
        )
    ),
    writeOption_(ANY_WRITE),
    objectNames_()
{
    read(dict);
}


// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //

Foam::functionObjects::writeObjects::~writeObjects()
{}


// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //

bool Foam::functionObjects::writeObjects::read(const dictionary& dict)
{
    if (dict.found("field"))
    {
        objectNames_.setSize(1);
        dict.lookup("field") >> objectNames_[0];
    }
    else if (dict.found("fields"))
    {
        dict.lookup("fields") >> objectNames_;
    }
    else
    {
        dict.lookup("objects") >> objectNames_;
    }

    if (dict.found("writeOption"))
    {
        writeOption_ = writeOptionNames.read(dict.lookup("writeOption"));
    }
    else
    {
        writeOption_ = ANY_WRITE;
    }

    return true;
}


bool Foam::functionObjects::writeObjects::execute()
{
    return true;
}


bool Foam::functionObjects::writeObjects::write()
{
    Info<< type() << " " << name() << " write:" << nl;

    if (!obr_.time().writeTime())
    {
        obr_.time().writeTimeDict();
    }

    DynamicList<word> allNames(obr_.toc().size());
    forAll(objectNames_, i)
    {
        wordList names(obr_.names<regIOobject>(objectNames_[i]));

        if (names.size())
        {
            allNames.append(names);
        }
        else
        {
            WarningInFunction
                << "Object " << objectNames_[i] << " not found in "
                << "database. Available objects:" << nl << obr_.sortedToc()
                << endl;
        }
    }

    forAll(allNames, i)
    {
        regIOobject& obj = const_cast<regIOobject&>
        (
            obr_.lookupObject<regIOobject>(allNames[i])
        );

        switch(writeOption_)
        {
            case AUTO_WRITE:
                if (obj.writeOpt() != IOobject::AUTO_WRITE)
                {
                    continue;
                }
                else
                {
                    break;
                }

            case NO_WRITE:
                if (obj.writeOpt() != IOobject::NO_WRITE)
                {
                    continue;
                }
                else
                {
                    break;
                }

            case ANY_WRITE:
                break;

            default:
                continue;
        }

        if
        (
            obj.writeOpt() == IOobject::AUTO_WRITE
         && obr_.time().writeTime()
        )
        {
            Info<< "    automatically written object " << obj.name() << endl;
        }
        else
        {
            Info<< "    writing object " << obj.name() << endl;

            obj.write();
        }
    }

    return true;
}


// ************************************************************************* //