Files
openfoam/src/faOptions/faOption/faOption.H
Mark Olesen b25147a4f8 ENH: finite-area region support to all faOptions and regionFaModels
- for a non-default mesh region, corresponding files:

     system/finite-area/faOptions.<name>
     system/finite-area/<name>/faSchemes, etc

  if the entries within the faOptions dictionary happen to contain an
  "area" entry and it conflicts with what is expected, it will be
  rejected when creating the list of options, which helps avoid
  unexpected behaviour and simplifies overall handling.
2025-10-08 13:17:40 +02:00

476 lines
13 KiB
C++

/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | www.openfoam.com
\\/ M anipulation |
-------------------------------------------------------------------------------
Copyright (C) 2019-2025 OpenCFD Ltd.
-------------------------------------------------------------------------------
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::fa::option
Description
Base abstract class for handling finite area options (i.e. \c faOption).
Usage
Minimal example by using \c constant/faOptions:
\verbatim
<userDefinedName1>
{
// Mandatory entries (unmodifiable)
type <faOptionName>;
// Mandatory entries (runtime modifiable)
region <regionName>;
// Optional entry (unmodifiable)
area <areaName>;
// Optional entries (unmodifiable/runtime modifiable)
<faOption>Coeffs
{
// subdictionary entries
}
// Optional entries (runtime modifiable)
active true;
log true;
}
\endverbatim
where the entries mean:
\table
Property | Description | Type | Reqd | Dflt
type | Name of operand faOption | word | yes | -
area | Name of finite-area mesh | word | no | region0
region | Name of operand region | word | yes | -
\<faOption\>Coeffs | Dictionary containing settings of <!--
--> the selected faOption settings | dictionary | no | -
active | Flag to (de)activate faOption | bool | no | true
log | Flag to log faOption-related info | bool | no | true
\endtable
Note
- Source/sink options are to be added to the right-hand side of equations.
SourceFiles
faOption.C
faOptionIO.C
\*---------------------------------------------------------------------------*/
#ifndef Foam_fa_option_H
#define Foam_fa_option_H
#include "faMatricesFwd.H"
#include "areaFieldsFwd.H"
#include "dictionary.H"
#include "fvMesh.H"
#include "volSurfaceMapping.H"
#include "runTimeSelectionTables.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
namespace fa
{
/*---------------------------------------------------------------------------*\
Class option Declaration
\*---------------------------------------------------------------------------*/
class option
{
// Private Member Functions
//- Construct region mesh and fields
void constructMeshObjects();
protected:
// Protected Data
//- Source name
const word name_;
//- Model type
const word modelType_;
//- Reference to the mesh database
const fvMesh& mesh_;
//- Top level source dictionary
dictionary dict_;
//- Dictionary containing source coefficients
dictionary coeffs_;
//- Field names to apply source to - populated by derived models
wordList fieldNames_;
//- Applied flag list - corresponds to each fieldNames_ entry
List<bool> applied_;
//- The finite-area mesh name
word areaName_;
//- The model region name (finite-area)
word regionName_;
// Protected Member Functions
//- Resize/reset applied flag list for all fieldNames_ entries
void resetApplied();
private:
// Private Data
//- Demand-driven: pointer to region mesh database
mutable autoPtr<faMesh> regionMeshPtr_;
//- Demand-driven: volume-to-surface mapping
mutable autoPtr<volSurfaceMapping> vsmPtr_;
//- Source active flag
bool active_;
public:
//- Switch write log to Info
bool log;
//- Runtime type information
TypeName("option");
// Declare run-time constructor selection table
declareRunTimeSelectionTable
(
autoPtr,
option,
dictionary,
(
const word& name,
const word& modelType,
const dictionary& dict,
const fvMesh& mesh,
const word& areaName
),
(name, modelType, dict, mesh, areaName)
);
// Constructors
//- Construct from components
option
(
const word& name,
const word& modelType,
const dictionary& dict,
const fvMesh& mesh,
//! The expected finite-area mesh name
const word& defaultAreaName = word()
);
//- Return clone
autoPtr<option> clone() const
{
NotImplemented;
return nullptr;
}
//- Return pointer to new faOption object created
//- on the freestore from an Istream
class iNew
{
//- Reference to the mesh
const fvMesh& mesh_;
//- The option name
const word& name_;
//- The default area name
const word& area_;
public:
iNew
(
const fvMesh& mesh,
const word& name,
const word& defaultAreaName
) noexcept
:
mesh_(mesh),
name_(name),
area_(defaultAreaName)
{}
autoPtr<option> operator()(Istream& is) const
{
const dictionary dict(is);
return autoPtr<fa::option>
(
fa::option::New(name_, dict, mesh_, area_)
);
}
};
// Selectors
//- Return a reference to the selected faOption model
static autoPtr<option> New
(
const word& name,
const dictionary& dict,
const fvMesh& mesh,
//! The expected finite-area mesh name
const word& defaultAreaName = word()
);
//- Destructor
virtual ~option() = default;
// Member Functions
//- Compare the region names.
// Treats empty or polyMesh::defaultRegion as always matching
static bool sameRegionNames(const word& name1, const word& name2);
// Access
//- The source name
const word& name() const noexcept { return name_; }
//- Return const access to the mesh database
const fvMesh& mesh() const noexcept { return mesh_; }
//- Return dictionary
const dictionary& coeffs() const noexcept { return coeffs_; }
//- True if source is active
bool active() const noexcept { return active_; }
//- Set the applied flag to true for field index fieldi
inline void setApplied(const label fieldi);
//- The finite-area mesh name
const word& areaName() const noexcept { return areaName_; }
//- The model region name
const word& regionName() const noexcept { return regionName_; }
//- Return the region mesh database (demand-driven)
inline const faMesh& regionMesh() const;
//- Return volSurfaceMapping (demand-driven)
inline const volSurfaceMapping& vsm() const;
// Edit
//- Change source active flag, return previous value
inline bool active(bool on) noexcept;
// Checks
//- Is the source active?
virtual bool isActive();
//- Return index of field name if found in fieldNames list
virtual label applyToField(const word& fieldName) const;
//- Check that the source has been applied
virtual void checkApplied() const;
// Member Functions
// Evaluation
// Explicit and implicit sources
virtual void addSup
(
const areaScalarField& h,
faMatrix<scalar>& eqn,
const label fieldi
);
virtual void addSup
(
const areaScalarField& h,
faMatrix<vector>& eqn,
const label fieldi
);
virtual void addSup
(
const areaScalarField& h,
faMatrix<symmTensor>& eqn,
const label fieldi
);
virtual void addSup
(
const areaScalarField& h,
faMatrix<sphericalTensor>& eqn,
const label fieldi
);
virtual void addSup
(
const areaScalarField& h,
faMatrix<tensor>& eqn,
const label fieldi
);
// Explicit and implicit sources for compressible equations
virtual void addSup
(
const areaScalarField& h,
const areaScalarField& rho,
faMatrix<scalar>& eqn,
const label fieldi
);
virtual void addSup
(
const areaScalarField& h,
const areaScalarField& rho,
faMatrix<vector>& eqn,
const label fieldi
);
virtual void addSup
(
const areaScalarField& h,
const areaScalarField& rho,
faMatrix<symmTensor>& eqn,
const label fieldi
);
virtual void addSup
(
const areaScalarField& h,
const areaScalarField& rho,
faMatrix<sphericalTensor>& eqn,
const label fieldi
);
virtual void addSup
(
const areaScalarField& h,
const areaScalarField& rho,
faMatrix<tensor>& eqn,
const label fieldi
);
// Constraints
virtual void constrain
(
faMatrix<scalar>& eqn,
const label fieldi
);
virtual void constrain
(
faMatrix<vector>& eqn,
const label fieldi
);
virtual void constrain
(
faMatrix<sphericalTensor>& eqn,
const label fieldi
);
virtual void constrain
(
faMatrix<symmTensor>& eqn,
const label fieldi
);
virtual void constrain
(
faMatrix<tensor>& eqn,
const label fieldi
);
// Correction
virtual void correct(areaScalarField& field);
virtual void correct(areaVectorField& field);
virtual void correct(areaSphericalTensorField& field);
virtual void correct(areaSymmTensorField& field);
virtual void correct(areaTensorField& field);
// IO
//- Write the source header information
virtual void writeHeader(Ostream&) const;
//- Write the source footer information
virtual void writeFooter(Ostream&) const;
//- Write the source properties
virtual void writeData(Ostream&) const;
//- Read source dictionary
virtual bool read(const dictionary& dict);
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace fa
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#include "faOptionI.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //