/*---------------------------------------------------------------------------*\
  ==  == ====== ====   ====    |
                    \\     ||  | Multiphase Code Repository by HZDR
  ======   //   ||  || ===//   | Website: https://doi.org/10.14278/rodare.767
  ||  ||  //    ||  // || \\   | License: GPL-3.0-or-later
  ==  == ====== ====   ==  ==  |
-------------------------------------------------------------------------------
License
    This file is part of the Multiphase Code Repository by HZDR.

    Copyright (C) 2025 by Helmholtz-Zentrum Dresden-Rossendorf e.V. (HZDR),
    Website: https://hzdr.de

    Multiphase Code Repository by HZDR is based on the free software for
    computational fluid dynamics (CFD) from the OpenFOAM Foundation.
    Copyright (C) 2025 by OpenFOAM Foundation, Website: https://openfoam.org

    If you are interested in which files are original OpenFOAM Foundation
    files, which OpenFOAM Foundation files were modified, and which files were
    newly created, see FILES.md.

    Multiphase Code Repository by HZDR 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.

    Multiphase Code Repository by HZDR 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 the Multiphase Code Repository by HZDR. If not, see
    <http://www.gnu.org/licenses/>.

Class
    Foam::functionObjects::graphicalResiduals

Description
    This function object shows the progress and the residuals in a graphical
    window. The graphical user interface is generated with QT.

    Example of function object specification:
    \verbatim
    graphicalResiduals1
    {
        type           graphicalResiduals;
        libs ("libaddonUtilityFunctionObjects.so");
        executeControl          clockTime;
        executeInterval         1;
        executeAtStart          false;
        fields                  (U p);
    }
    \endverbatim

Usage
    \table
        Property     | Description               | Required | Default value
        type         | type name: graphicalResiduals | yes   |
        fields       | Fields to show residuals for | yes    |
    \endtable

SourceFiles
    graphicalResiduals.C

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

#ifndef graphicalResiduals_H
#define graphicalResiduals_H

#include "fvMeshFunctionObject.H"
#include <QApplication>
#include <QProgressBar>
#include "window.H.qt"

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

namespace Foam
{
namespace functionObjects
{

/*---------------------------------------------------------------------------*\
                   Class graphicalResiduals Declaration
\*---------------------------------------------------------------------------*/

class graphicalResiduals
:
    public fvMeshFunctionObject
{
    // Private Data

        //- QApplication object (handles all QT related things)
        QApplication* app_;

        //- QWidget to display the residuals and progress
        window* window_;

        //- Store endTime to update estimated time in case controlDict changes
        scalar endTime_;


protected:

    // Protected member data

        //- Names of fields to process
        wordList fieldNames_;

        //- Names of series to print
        wordList seriesNames_;


    // Protected member functions

        //- Create series names based on Type
        template<class Type>
        void seriesNames(const word& fieldName);

        //- Plot series names based on Type
        template<class Type>
        void printResidual(const word& fieldName);
public:

    //- Runtime type information
    TypeName("graphicalResiduals");


    // Constructors

        //- Construct from Time and dictionary
        graphicalResiduals
        (
            const word& name,
            const Time& runTime,
            const dictionary& dict
        );

        //- Disallow default bitwise copy construction
        graphicalResiduals(const graphicalResiduals&) = delete;


    //- Destructor
    virtual ~graphicalResiduals();


    // Member Functions

        //- Read the graphicalResiduals data
        virtual bool read(const dictionary&);

        //- Return the list of fields required
        virtual wordList fields() const;

        //- Execute, currently does nothing
        virtual bool execute();

        //- Execute at the final time-loop, currently does nothing
        virtual bool end();

        //- Write the graphicalResiduals
        virtual bool write();


    // Member Operators

        //- Disallow default bitwise assignment
        void operator=(const graphicalResiduals&) = delete;
};


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

} // End namespace functionObjects
} // End namespace Foam

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

#ifdef NoRepository
    #include "graphicalResidualsTemplates.C"
#endif

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

#endif

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