From d29798265c96075ae373a736d239f2cabf886889 Mon Sep 17 00:00:00 2001
From: mattijs <mattijs>
Date: Fri, 20 May 2011 11:58:26 +0100
Subject: [PATCH] ENH: partialWrite: new functionObject for partial dumps

---
 .../functionObjects/IO/Make/files             |   3 +
 .../functionObjects/IO/controlDict            |  88 ++++++++++
 .../IO/partialWrite/IOpartialWrite.H          |  49 ++++++
 .../IO/partialWrite/partialWrite.C            | 142 ++++++++++++++++
 .../IO/partialWrite/partialWrite.H            | 156 ++++++++++++++++++
 .../partialWrite/partialWriteFunctionObject.C |  46 ++++++
 .../partialWrite/partialWriteFunctionObject.H |  54 ++++++
 7 files changed, 538 insertions(+)
 create mode 100644 src/postProcessing/functionObjects/IO/controlDict
 create mode 100644 src/postProcessing/functionObjects/IO/partialWrite/IOpartialWrite.H
 create mode 100644 src/postProcessing/functionObjects/IO/partialWrite/partialWrite.C
 create mode 100644 src/postProcessing/functionObjects/IO/partialWrite/partialWrite.H
 create mode 100644 src/postProcessing/functionObjects/IO/partialWrite/partialWriteFunctionObject.C
 create mode 100644 src/postProcessing/functionObjects/IO/partialWrite/partialWriteFunctionObject.H

diff --git a/src/postProcessing/functionObjects/IO/Make/files b/src/postProcessing/functionObjects/IO/Make/files
index a3517e560f1..a00b7575f18 100644
--- a/src/postProcessing/functionObjects/IO/Make/files
+++ b/src/postProcessing/functionObjects/IO/Make/files
@@ -1,3 +1,6 @@
+partialWrite/partialWrite.C
+partialWrite/partialWriteFunctionObject.C
+
 writeRegisteredObject/writeRegisteredObject.C
 writeRegisteredObject/writeRegisteredObjectFunctionObject.C
 
diff --git a/src/postProcessing/functionObjects/IO/controlDict b/src/postProcessing/functionObjects/IO/controlDict
new file mode 100644
index 00000000000..4daa3a1c158
--- /dev/null
+++ b/src/postProcessing/functionObjects/IO/controlDict
@@ -0,0 +1,88 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  1.7.1                                 |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    location    "system";
+    object      controlDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+application     icoFoam;
+
+startFrom       startTime;
+
+startTime       0;
+
+stopAt          endTime;
+
+endTime         0.5;
+
+deltaT          0.005;
+
+writeControl    timeStep;
+
+writeInterval   20;
+
+purgeWrite      0;
+
+writeFormat     ascii;
+
+writePrecision  6;
+
+writeCompression uncompressed;
+
+timeFormat      general;
+
+timePrecision   6;
+
+runTimeModifiable yes;
+
+functions
+{
+    partialWrite
+    {
+        // Write some registered objects more often than others.
+        // Above writeControl determines most frequent dump.
+
+        type            partialWrite;
+
+        // Where to load it from
+        functionObjectLibs ("libIOFunctionObjects.so");
+
+        // Execute upon outputTime
+        outputControl   outputTime;
+
+        // Objects to write every outputTime
+        objectNames    (p);
+        // Write as normal every writeInterval'th outputTime.
+        writeInterval   3;
+    }
+
+    dumpObjects
+    {
+        // Forcibly write registered objects. E.g. fields that have been
+        // created with NO_READ.
+
+        type            writeRegisteredObject;
+
+        // Where to load it from
+        functionObjectLibs ("libIOFunctionObjects.so");
+
+        // Execute upon outputTime
+        outputControl   outputTime;
+
+        // Objects to write
+        objectNames    ();
+    }
+}
+
+
+// ************************************************************************* //
diff --git a/src/postProcessing/functionObjects/IO/partialWrite/IOpartialWrite.H b/src/postProcessing/functionObjects/IO/partialWrite/IOpartialWrite.H
new file mode 100644
index 00000000000..961f2b6d558
--- /dev/null
+++ b/src/postProcessing/functionObjects/IO/partialWrite/IOpartialWrite.H
@@ -0,0 +1,49 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011-2011 OpenCFD Ltd.
+     \\/     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/>.
+
+Typedef
+    Foam::IOpartialWrite
+
+Description
+    Instance of the generic IOOutputFilter for partialWrite.
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef IOpartialWrite_H
+#define IOpartialWrite_H
+
+#include "partialWrite.H"
+#include "IOOutputFilter.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+    typedef IOOutputFilter<partialWrite> IOpartialWrite;
+}
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/postProcessing/functionObjects/IO/partialWrite/partialWrite.C b/src/postProcessing/functionObjects/IO/partialWrite/partialWrite.C
new file mode 100644
index 00000000000..327c7b804ad
--- /dev/null
+++ b/src/postProcessing/functionObjects/IO/partialWrite/partialWrite.C
@@ -0,0 +1,142 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011-2011 OpenCFD Ltd.
+     \\/     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 "partialWrite.H"
+#include "dictionary.H"
+#include "Time.H"
+#include "IOobjectList.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+    defineTypeNameAndDebug(partialWrite, 0);
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::partialWrite::partialWrite
+(
+    const word& name,
+    const objectRegistry& obr,
+    const dictionary& dict,
+    const bool loadFromFiles
+)
+:
+    name_(name),
+    obr_(obr)
+{
+    read(dict);
+}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+Foam::partialWrite::~partialWrite()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+void Foam::partialWrite::read(const dictionary& dict)
+{
+    dict.lookup("objectNames") >> objectNames_;
+    dict.lookup("writeInterval") >> writeInterval_;
+    writeInstance_ = 0;
+
+    Info<< type() << " " << name() << ":" << nl
+        << "    dumping every outputTime :";
+    forAllConstIter(HashSet<word>, objectNames_, iter)
+    {
+        Info<< ' ' << iter.key();
+    }
+    Info<< nl
+        << "    dumping all other fields every "
+        << writeInterval_ << "th outputTime" << nl
+        << endl;
+
+    if (writeInterval_ < 1)
+    {
+        FatalIOErrorIn("partialWrite::read(const dictionary&)", dict)
+            << "Illegal value for writeInterval " << writeInterval_
+            << ". It should be >= 1."
+            << exit(FatalIOError);
+    }
+}
+
+
+void Foam::partialWrite::execute()
+{
+    //Pout<< "execute at time " << obr_.time().timeName()
+    //    << " index:" << obr_.time().timeIndex() << endl;
+}
+
+
+void Foam::partialWrite::end()
+{
+    //Pout<< "end at time " << obr_.time().timeName() << endl;
+    // Do nothing - only valid on write
+}
+
+
+void Foam::partialWrite::write()
+{
+    //Pout<< "write at time " << obr_.time().timeName() << endl;
+    if (obr_.time().outputTime())
+    {
+        // Above check so it can be used both with
+        //  outputControl   timeStep;
+        //  outputInterval  1;
+        // or with
+        //  outputControl   outputTime;
+
+        writeInstance_++;
+
+        if (writeInstance_ == writeInterval_)
+        {
+            // Normal dump
+            writeInstance_ = 0;
+        }
+        else
+        {
+            // Delete all but marked objects
+            IOobjectList objects(obr_, obr_.time().timeName());
+
+            forAllConstIter(HashPtrTable<IOobject>, objects, iter)
+            {
+                if (!objectNames_.found(iter()->name()))
+                {
+                    const fileName f = obr_.time().timePath()/iter()->name();
+                    //Pout<< "   rm " << f << endl;
+                    rm(f);
+                }
+            }
+        }
+    }
+}
+
+
+// ************************************************************************* //
diff --git a/src/postProcessing/functionObjects/IO/partialWrite/partialWrite.H b/src/postProcessing/functionObjects/IO/partialWrite/partialWrite.H
new file mode 100644
index 00000000000..b51b9d17415
--- /dev/null
+++ b/src/postProcessing/functionObjects/IO/partialWrite/partialWrite.H
@@ -0,0 +1,156 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011-2011 OpenCFD Ltd.
+     \\/     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/>.
+
+Class
+    Foam::partialWrite
+
+Description
+    Allows some fields/registered objects to be written more often than others.
+
+    Works in the opposite way: deletes at intermediate times all
+    but selected fields.
+
+SourceFiles
+    partialWrite.C
+    IOpartialWrite.H
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef partialWrite_H
+#define partialWrite_H
+
+#include "pointFieldFwd.H"
+#include "HashSet.H"
+#include "DynamicList.H"
+#include "runTimeSelectionTables.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+// Forward declaration of classes
+class objectRegistry;
+class dictionary;
+class mapPolyMesh;
+
+/*---------------------------------------------------------------------------*\
+                   Class partialWrite Declaration
+\*---------------------------------------------------------------------------*/
+
+class partialWrite
+{
+protected:
+
+    // Private data
+
+        //- Name of this set of partialWrite
+        word name_;
+
+        const objectRegistry& obr_;
+
+
+        // Read from dictionary
+
+            //- Names of objects to dump always
+            HashSet<word> objectNames_;
+
+            //- Write interval for restart dump
+            label writeInterval_;
+
+
+        //- Current dump instance. If reaches writeInterval do a full write.
+        label writeInstance_;
+
+
+    // Private Member Functions
+
+        //- Disallow default bitwise copy construct
+        partialWrite(const partialWrite&);
+
+        //- Disallow default bitwise assignment
+        void operator=(const partialWrite&);
+
+
+public:
+
+    //- Runtime type information
+    TypeName("partialWrite");
+
+
+    // Constructors
+
+        //- Construct for given objectRegistry and dictionary.
+        //  Allow the possibility to load fields from files
+        partialWrite
+        (
+            const word& name,
+            const objectRegistry&,
+            const dictionary&,
+            const bool loadFromFiles = false
+        );
+
+
+    //- Destructor
+    virtual ~partialWrite();
+
+
+    // Member Functions
+
+        //- Return name of the partialWrite
+        virtual const word& name() const
+        {
+            return name_;
+        }
+
+        //- Read the partialWrite data
+        virtual void read(const dictionary&);
+
+        //- Execute, currently does nothing
+        virtual void execute();
+
+        //- Execute at the final time-loop, currently does nothing
+        virtual void end();
+
+        //- Write the partialWrite
+        virtual void write();
+
+        //- Update for changes of mesh
+        virtual void updateMesh(const mapPolyMesh&)
+        {}
+
+        //- Update for changes of mesh
+        virtual void movePoints(const pointField&)
+        {}
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/postProcessing/functionObjects/IO/partialWrite/partialWriteFunctionObject.C b/src/postProcessing/functionObjects/IO/partialWrite/partialWriteFunctionObject.C
new file mode 100644
index 00000000000..5c98c82580c
--- /dev/null
+++ b/src/postProcessing/functionObjects/IO/partialWrite/partialWriteFunctionObject.C
@@ -0,0 +1,46 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011-2011 OpenCFD Ltd.
+     \\/     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 "partialWriteFunctionObject.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+    defineNamedTemplateTypeNameAndDebug
+    (
+        partialWriteFunctionObject,
+        0
+    );
+
+    addToRunTimeSelectionTable
+    (
+        functionObject,
+        partialWriteFunctionObject,
+        dictionary
+    );
+}
+
+// ************************************************************************* //
diff --git a/src/postProcessing/functionObjects/IO/partialWrite/partialWriteFunctionObject.H b/src/postProcessing/functionObjects/IO/partialWrite/partialWriteFunctionObject.H
new file mode 100644
index 00000000000..315a5c22829
--- /dev/null
+++ b/src/postProcessing/functionObjects/IO/partialWrite/partialWriteFunctionObject.H
@@ -0,0 +1,54 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011-2011 OpenCFD Ltd.
+     \\/     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/>.
+
+Typedef
+    Foam::partialWriteFunctionObject
+
+Description
+    FunctionObject wrapper around partialWrite to allow them to be
+    created via the functions list within controlDict.
+
+SourceFiles
+    partialWriteFunctionObject.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef partialWriteFunctionObject_H
+#define partialWriteFunctionObject_H
+
+#include "partialWrite.H"
+#include "OutputFilterFunctionObject.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+    typedef OutputFilterFunctionObject<partialWrite>
+        partialWriteFunctionObject;
+}
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
-- 
GitLab