diff --git a/src/fvOptions/sources/general/semiImplicitSource/SemiImplicitSource.C b/src/fvOptions/sources/general/semiImplicitSource/SemiImplicitSource.C index 1f76d81df21ae4e203c72d85b436ba8c4c950f0b..2a3739f1731a012668805d74af7494e0ce83e9b8 100644 --- a/src/fvOptions/sources/general/semiImplicitSource/SemiImplicitSource.C +++ b/src/fvOptions/sources/general/semiImplicitSource/SemiImplicitSource.C @@ -30,6 +30,7 @@ License #include "fvMesh.H" #include "fvMatrices.H" #include "fvmSup.H" +#include "Constant.H" // * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * * // @@ -53,14 +54,46 @@ void Foam::fv::SemiImplicitSource<Type>::setFieldData(const dictionary& dict) label count = dict.size(); fieldNames_.resize(count); - injectionRate_.resize(count); + Su_.resize(count); + Sp_.resize(count); + applied_.resize(count, false); count = 0; for (const entry& dEntry : dict) { fieldNames_[count] = dEntry.keyword(); - dEntry.readEntry(injectionRate_[count]); + + if (!dEntry.isDict()) + { + Tuple2<Type, scalar> injectionRate; + dEntry.readEntry(injectionRate); + + Su_.set + ( + count, + new Function1Types::Constant<Type> + ( + "Su", + injectionRate.first() + ) + ); + Sp_.set + ( + count, + new Function1Types::Constant<scalar> + ( + "Sp", + injectionRate.second() + ) + ); + } + else + { + const dictionary& Sdict = dEntry.dict(); + Su_.set(count, Function1<Type>::New("Su", Sdict)); + Sp_.set(count, Function1<scalar>::New("Sp", Sdict)); + } ++count; } @@ -86,8 +119,7 @@ Foam::fv::SemiImplicitSource<Type>::SemiImplicitSource : cellSetOption(name, modelType, dict, mesh), volumeMode_(vmAbsolute), - VDash_(1.0), - injectionRate_() + VDash_(1.0) { read(dict); } @@ -125,7 +157,9 @@ void Foam::fv::SemiImplicitSource<Type>::addSup false ); - UIndirectList<Type>(Su, cells_) = injectionRate_[fieldi].first()/VDash_; + const scalar tmVal = mesh_.time().timeOutputValue(); + + UIndirectList<Type>(Su, cells_) = Su_[fieldi].value(tmVal)/VDash_; volScalarField::Internal Sp ( @@ -142,7 +176,7 @@ void Foam::fv::SemiImplicitSource<Type>::addSup false ); - UIndirectList<scalar>(Sp, cells_) = injectionRate_[fieldi].second()/VDash_; + UIndirectList<scalar>(Sp, cells_) = Sp_[fieldi].value(tmVal)/VDash_; eqn += Su + fvm::SuSp(Sp, psi); } @@ -166,7 +200,6 @@ void Foam::fv::SemiImplicitSource<Type>::addSup } - template<class Type> bool Foam::fv::SemiImplicitSource<Type>::read(const dictionary& dict) { diff --git a/src/fvOptions/sources/general/semiImplicitSource/SemiImplicitSource.H b/src/fvOptions/sources/general/semiImplicitSource/SemiImplicitSource.H index ba9a8bef3ec801833957654e0d527dadc543ed0b..5154fce6c203db6144be0f0b67c49270c954127f 100644 --- a/src/fvOptions/sources/general/semiImplicitSource/SemiImplicitSource.H +++ b/src/fvOptions/sources/general/semiImplicitSource/SemiImplicitSource.H @@ -60,6 +60,31 @@ Description - absolute: values are given as \<quantity\> - specific: values are given as \<quantity\>/m3 + The injectionRate can also be specified as a Function1 by having + dictionaries for the field entries instead: + + \verbatim + injectionRateSuSp + { + k + { + // Time-ramp from 0 to 30.7 at time 5 + Su table + ( + (0 0.0) + (5 30.7) + ); + Sp 0.0; + } + epsilon + { + Su 1.5; + Sp 0.0; + } + } + \endverbatim + + See also Foam::fvOption @@ -74,6 +99,7 @@ SourceFiles #include "Tuple2.H" #include "cellSetOption.H" #include "Enum.H" +#include "Function1.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -128,7 +154,8 @@ protected: scalar VDash_; //- Source field values - List<Tuple2<Type, scalar>> injectionRate_; + PtrList<Function1<Type>> Su_; + PtrList<Function1<scalar>> Sp_; // Protected functions @@ -162,18 +189,12 @@ public: //- Return const access to the volume mode inline const volumeModeType& volumeMode() const; - //- Return const access to the source field values - inline const List<Tuple2<Type, scalar>>& injectionRate() const; - // Edit //- Return access to the volume mode inline volumeModeType& volumeMode(); - //- Return access to the source field values - inline List<Tuple2<Type, scalar>>& injectionRate(); - // Evaluation diff --git a/src/fvOptions/sources/general/semiImplicitSource/SemiImplicitSourceI.H b/src/fvOptions/sources/general/semiImplicitSource/SemiImplicitSourceI.H index b5742135cf33c4df4bc1963b710c2f9b1a4a408a..7922e86558fab19b87f72b595313e32ded1d0985 100644 --- a/src/fvOptions/sources/general/semiImplicitSource/SemiImplicitSourceI.H +++ b/src/fvOptions/sources/general/semiImplicitSource/SemiImplicitSourceI.H @@ -37,14 +37,6 @@ Foam::fv::SemiImplicitSource<Type>::volumeMode() const } -template<class Type> -inline const Foam::List<Foam::Tuple2<Type, Foam::scalar>>& -Foam::fv::SemiImplicitSource<Type>::injectionRate() const -{ - return injectionRate_; -} - - template<class Type> inline typename Foam::fv::SemiImplicitSource<Type>::volumeModeType& Foam::fv::SemiImplicitSource<Type>::volumeMode() @@ -53,12 +45,4 @@ Foam::fv::SemiImplicitSource<Type>::volumeMode() } -template<class Type> -inline Foam::List<Foam::Tuple2<Type, -Foam::scalar>>& Foam::fv::SemiImplicitSource<Type>::injectionRate() -{ - return injectionRate_; -} - - // ************************************************************************* //