ENH: Initial integration of IHCantrabria wave functionality

- Wave models significantly restructured and refactored into a hierarchy of run-time selecatable models
- Gravity no longer hard-coded
- Ability to use any direction as the gravity direction
- Boundary conditions simplified and take reference to the wave model
  - removes a lot of code duplication and new code is ~30% faster
- Removed unused functions

Requires further testing
- Restart behaviour needs to be addressed
This commit is contained in:
Andrew Heather
2016-11-16 14:05:46 +00:00
parent 95e9467e84
commit b3b0704202
36 changed files with 5805 additions and 0 deletions

View File

@ -0,0 +1,167 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2016 OpenCFD Ltd.
\\/ M anipulation | Copyright (C) 2015 IH-Cantabria
-------------------------------------------------------------------------------
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 "waveInletVelocityFvPatchVectorField.H"
#include "addToRunTimeSelectionTable.H"
#include "fvPatchFieldMapper.H"
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
Foam::waveModel& Foam::waveInletVelocityFvPatchVectorField::getWaveModel()
{
// Return waveModel from database if present, or create
if (!waveModel_.valid())
{
waveModel_ =
waveModel::lookupOrCreate
(
patch().patch(),
internalField().mesh(),
waveDictName_
);
}
return waveModel_.ref();
}
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::waveInletVelocityFvPatchVectorField::waveInletVelocityFvPatchVectorField
(
const fvPatch& p,
const DimensionedField<vector, volMesh>& iF
)
:
fixedValueFvPatchField<vector>(p, iF),
waveDictName_(waveModel::dictName),
waveModel_()
{}
Foam::waveInletVelocityFvPatchVectorField::waveInletVelocityFvPatchVectorField
(
const waveInletVelocityFvPatchVectorField& ptf,
const fvPatch& p,
const DimensionedField<vector, volMesh>& iF,
const fvPatchFieldMapper& mapper
)
:
fixedValueFvPatchField<vector>(ptf, p, iF, mapper),
waveDictName_(ptf.waveDictName_),
waveModel_()
{}
Foam::waveInletVelocityFvPatchVectorField::waveInletVelocityFvPatchVectorField
(
const fvPatch& p,
const DimensionedField<vector, volMesh>& iF,
const dictionary& dict
)
:
fixedValueFvPatchField<vector>(p, iF, dict),
waveDictName_(dict.lookupOrDefault<word>("waveDict", waveModel::dictName)),
waveModel_()
{}
Foam::waveInletVelocityFvPatchVectorField::waveInletVelocityFvPatchVectorField
(
const waveInletVelocityFvPatchVectorField& ptf
)
:
fixedValueFvPatchField<vector>(ptf),
waveDictName_(ptf.waveDictName_),
waveModel_()
{}
Foam::waveInletVelocityFvPatchVectorField::waveInletVelocityFvPatchVectorField
(
const waveInletVelocityFvPatchVectorField& ptf,
const DimensionedField<vector, volMesh>& iF
)
:
fixedValueFvPatchField<vector>(ptf, iF),
waveDictName_(ptf.waveDictName_),
waveModel_()
{}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
void Foam::waveInletVelocityFvPatchVectorField::updateCoeffs()
{
if (updated())
{
return;
}
tmp<waveModel> tmodel
(
waveModel::lookupOrCreate
(
patch().patch(),
internalField().mesh(),
waveDictName_
)
);
waveModel& model = const_cast<waveModel&>(tmodel());
model.correct(db().time().value());
operator == (model.U());
fixedValueFvPatchField<vector>::updateCoeffs();
}
void Foam::waveInletVelocityFvPatchVectorField::write(Ostream& os) const
{
fvPatchField<vector>::write(os);
os.writeKeyword("waveDictName") << waveDictName_
<< token::END_STATEMENT << nl;
writeEntry("value", os);
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
makePatchTypeField
(
fvPatchVectorField,
waveInletVelocityFvPatchVectorField
);
}
// ************************************************************************* //

View File

@ -0,0 +1,173 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2016 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::waveInletVelocityFvPatchVectorField
Description
Example of the boundary condition specification:
\verbatim
inlet
{
type waveInletVelocity;
value uniform (0 0 0);
leftORright 1.0;
}
\endverbatim
Usage
\table
Property | Description | Required | Default value
type | type: waveInletVelocity | yes |
waveDict | Dictionary specifying wave variables | no | waveProperties
leftORright | Define location of Boundary condition: Left(1) or Right (-1) | yes | -1
\endtable
Note
- The value is positive inwards
- May not work correctly for transonic inlets
- Strange behaviour with potentialFoam since the U equation is not solved
SourceFiles
waveInletVelocityFvPatchVectorField.C
\*---------------------------------------------------------------------------*/
#ifndef waveInletVelocityFvPatchVectorField_H
#define waveInletVelocityFvPatchVectorField_H
#include "fixedValueFvPatchFields.H"
#include "waveModel.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
/*---------------------------------------------------------------------------*\
Class waveInletVelocityFvPatchVectorField Declaration
\*---------------------------------------------------------------------------*/
class waveInletVelocityFvPatchVectorField
:
public fixedValueFvPatchVectorField
{
// Private data
//- Dictionary name
word waveDictName_;
//- Pointer to the wave model
tmp<waveModel> waveModel_;
//- Help function to retrieve the wave model
waveModel& getWaveModel();
public:
//- Runtime type information
TypeName("waveInletVelocity");
// Constructors
//- Construct from patch and internal field
waveInletVelocityFvPatchVectorField
(
const fvPatch&,
const DimensionedField<vector, volMesh>&
);
//- Construct from patch, internal field and dictionary
waveInletVelocityFvPatchVectorField
(
const fvPatch&,
const DimensionedField<vector, volMesh>&,
const dictionary&
);
//- Construct by mapping given
// waveInletVelocityFvPatchVectorField
// onto a new patch
waveInletVelocityFvPatchVectorField
(
const waveInletVelocityFvPatchVectorField&,
const fvPatch&,
const DimensionedField<vector, volMesh>&,
const fvPatchFieldMapper&
);
//- Construct as copy
waveInletVelocityFvPatchVectorField
(
const waveInletVelocityFvPatchVectorField&
);
//- Construct and return a clone
virtual tmp<fvPatchVectorField> clone() const
{
return tmp<fvPatchVectorField>
(
new waveInletVelocityFvPatchVectorField(*this)
);
}
//- Construct as copy setting internal field reference
waveInletVelocityFvPatchVectorField
(
const waveInletVelocityFvPatchVectorField&,
const DimensionedField<vector, volMesh>&
);
//- Construct and return a clone setting internal field reference
virtual tmp<fvPatchVectorField> clone
(
const DimensionedField<vector, volMesh>& iF
) const
{
return tmp<fvPatchVectorField>
(
new waveInletVelocityFvPatchVectorField(*this, iF)
);
}
// Member functions
//- Update the coefficients associated with the patch field
virtual void updateCoeffs();
//- Write
virtual void write(Ostream&) const;
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //