/*---------------------------------------------------------------------------*\
  ==  == ====== ====   ====    |
                    \\     ||  | 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::fv::Fuchs

Description
    In pool scrubbing, particles within rising bubbles can be captured by the
    surrounding liquid through various removal mechanisms. The decontamination
    model of Fuchs considers three particle transfer mechanisms: gravitational
    sedimentation, centrifugal impaction, and Brownian diffusion, each of which
    can be enabled or disabled via dictionary settings.

Usage
    \table
        Property             | Description                 | Required  | Default
        Species              | Name of species changing phase | yes    | -
        carrierSpecies       | Name of carrier species        | yes    | -
        gravitationalSedimentation | Gravitational sedimentation | no  | true
        centrifugalImpaction | Centrifugal impaction       | no        | true
        brownianDiffusion    | Brownian diffusion          | no        | true
        residualAlpha        | Gas phase residual          | no   | 10*res.Alpha
    \endtable

    References:
    \verbatim
        Fuchs, N. A. (1955). The mechanics of aerosols.
        Pergamon Press.

        Charvet, A., Bardin-Monnier, N., & Thomas, D. (2011).
        Can bubble columns be an alternative to fibrous filters for
        nanoparticles collection?
        Journal of hazardous materials, 195, 432-439.
    \endverbatim

SourceFiles
    Fuchs.C

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

#ifndef Fuchs_H
#define Fuchs_H

#include "decontaminationModel.H"
#include "rhoFluidMulticomponentThermo.H"

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

namespace Foam
{

namespace fv
{

/*---------------------------------------------------------------------------*\
                            Class Fuchs Declaration
\*---------------------------------------------------------------------------*/

class Fuchs
:
    public decontaminationModel
{
private:

    // Private data

        //- Boltzmann’s constant
        const dimensionedScalar kB_;

        //- Particle diameter
        const dimensionedScalar dp_;

        //- Switch for gravitational sedimentation
        const Switch gravitationalSedimentation_;

        //- Switch for centrifugal impaction
        const Switch centrifugalImpaction_;

        //- Switch for Brownian diffusion
        const Switch brownianDiffusion_;

        //- Particle removal rate
        mutable volScalarField Psi_;


    // Private Member Functions

        //- Relaxation time of particle, (s)
        inline tmp<volScalarField> tauP
        (
            const volScalarField& rhoP,
            const dimensionedScalar& dp,
            const volScalarField& muB
        ) const;

        //- Brownian diffusion coefficient of particle, (m^2/s)
        inline tmp<volScalarField> Dp
        (
            const dimensionedScalar& kB,
            const volScalarField& T,
            const dimensionedScalar& dp,
            const volScalarField& muB
        ) const;

        //- Removal coefficient due to gravitational sedimentation, (1/m)
        inline tmp<volScalarField> aS
        (
            const volScalarField& tauP,
            const volScalarField& Urel,
            const volScalarField& d
        ) const;

        //- Removal coefficient due to centrifugal impaction, (1/m)
        inline tmp<volScalarField> aC
        (
            const volScalarField& tauP,
            const volScalarField& Urel,
            const volScalarField& d
        ) const;

        //- Removal coefficient due to Brownian diffusion, (1/m)
        inline tmp<volScalarField> aD
        (
            const volScalarField& Dp,
            const volScalarField& Urel,
            const volScalarField& d
        ) const;


protected:

        //- Particle removal rate
        virtual tmp<volScalarField> rate() const;


public:

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

    // Constructors

        //- Construct from components
        Fuchs
        (
            const dictionary& dict,
            const dispersedPhaseInterface& interface,
            const hashedWordList& species
        );

    //- Destructor
    virtual ~Fuchs();
};

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

} // End namespace fv
} // End namespace Foam

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

#endif

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