ENH: support time-dependent actuationDiskSource disk direction (#3099)

This commit is contained in:
Pete Bachant 2024-02-11 19:13:22 -08:00 committed by Mark Olesen
parent 5a0fba84b4
commit 0c20009587
6 changed files with 46 additions and 41 deletions

View File

@ -9,6 +9,7 @@ It is likely incomplete...
- Yu Ankun - Yu Ankun
- Tetsuo Aoyagi - Tetsuo Aoyagi
- Akira Azami - Akira Azami
- Pete Bachant
- William Bainbridge - William Bainbridge
- Gabriel Barajas - Gabriel Barajas
- Kutalmis Bercin - Kutalmis Bercin

View File

@ -90,6 +90,8 @@ void Foam::fv::actuationDiskSource::writeFileHeader(Ostream& os)
writeFile::writeCommented(os, "P"); writeFile::writeCommented(os, "P");
} }
writeFile::writeCommented(os, "diskDir");
os << endl; os << endl;
} }
@ -208,14 +210,7 @@ Foam::fv::actuationDiskSource::actuationDiskSource
scalarMinMax::ge(VSMALL) scalarMinMax::ge(VSMALL)
) )
), ),
diskDir_ diskDir_(Function1<vector>::New("diskDir", coeffs_, &mesh)),
(
coeffs_.getCheck<vector>
(
"diskDir",
[&](const vector& vec){ return mag(vec) > VSMALL; }
).normalise()
),
UvsCpPtr_(Function1<scalar>::New("Cp", coeffs_, &mesh)), UvsCpPtr_(Function1<scalar>::New("Cp", coeffs_, &mesh)),
UvsCtPtr_(Function1<scalar>::New("Ct", coeffs_, &mesh)), UvsCtPtr_(Function1<scalar>::New("Ct", coeffs_, &mesh)),
monitorCells_() monitorCells_()
@ -237,6 +232,25 @@ Foam::fv::actuationDiskSource::actuationDiskSource
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
Foam::vector Foam::fv::actuationDiskSource::diskDir() const
{
const scalar t = mesh_.time().timeOutputValue();
const vector dir(diskDir_->value(t));
const scalar magDir = Foam::mag(dir);
if (magDir < SMALL)
{
FatalErrorInFunction
<< "Actuator disk surface-normal vector is zero: " << dir
<< " at time=" << t
<< exit(FatalError);
}
// normalised:
return dir/magDir;
}
void Foam::fv::actuationDiskSource::addSup void Foam::fv::actuationDiskSource::addSup
( (
fvMatrix<vector>& eqn, fvMatrix<vector>& eqn,
@ -295,19 +309,10 @@ bool Foam::fv::actuationDiskSource::read(const dictionary& dict)
<< exit(FatalIOError); << exit(FatalIOError);
} }
dict.readIfPresent("diskDir", diskDir_); // TBD: runTime re-reading of "diskDir" ?
diskDir_.normalise();
if (mag(diskDir_) < VSMALL)
{
FatalIOErrorInFunction(dict)
<< "Actuator disk surface-normal vector is zero: "
<< "diskDir = " << diskDir_
<< exit(FatalIOError);
}
return true; return true;
} }
return false; return false;
} }

View File

@ -170,7 +170,7 @@ Usage
type | Type name: actuationDiskSource | word | yes | - type | Type name: actuationDiskSource | word | yes | -
diskArea | Actuator disk planar surface area | scalar | yes | - diskArea | Actuator disk planar surface area | scalar | yes | -
diskDir | Surface-normal vector of the actuator disk <!-- diskDir | Surface-normal vector of the actuator disk <!--
--> pointing downstream | vector | yes | - --> pointing downstream | Function1 | yes | -
Cp | Power coefficient | Function1 | yes | - Cp | Power coefficient | Function1 | yes | -
Ct | Thrust coefficient | Function1 | yes | - Ct | Thrust coefficient | Function1 | yes | -
monitorMethod | Type of incoming velocity monitoring method <!-- monitorMethod | Type of incoming velocity monitoring method <!--
@ -207,8 +207,8 @@ SourceFiles
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
#ifndef actuationDiskSource_H #ifndef Foam_actuationDiskSource_H
#define actuationDiskSource_H #define Foam_actuationDiskSource_H
#include "cellSetOption.H" #include "cellSetOption.H"
#include "writeFile.H" #include "writeFile.H"
@ -276,7 +276,8 @@ protected:
scalar diskArea_; scalar diskArea_;
//- Surface-normal vector of the actuator disk pointing downstream //- Surface-normal vector of the actuator disk pointing downstream
vector diskDir_; //- as a function of time
autoPtr<Function1<vector>> diskDir_;
//- Velocity vs power coefficients //- Velocity vs power coefficients
autoPtr<Function1<scalar>> UvsCpPtr_; autoPtr<Function1<scalar>> UvsCpPtr_;
@ -364,14 +365,11 @@ public:
// Access // Access
//- Normal disk direction //- Normal disk direction, evaluated at timeOutputValue
const vector& diskDir() const vector diskDir() const;
{
return diskDir_;
}
//- Disk area //- Disk area
scalar diskArea() const scalar diskArea() const noexcept
{ {
return diskArea_; return diskArea_;
} }

View File

@ -110,12 +110,13 @@ void Foam::fv::actuationDiskSource::calcFroudeMethod
} }
// (BJSB:Eq. 3.9) // (BJSB:Eq. 3.9)
const vector diskDir = this->diskDir();
const scalar a = 1.0 - Cp/Ct; const scalar a = 1.0 - Cp/Ct;
const scalar T = 2.0*rhoRef*diskArea_*magSqr(Uref & diskDir_)*a*(1 - a); const scalar T = 2.0*rhoRef*diskArea_*magSqr(Uref & diskDir)*a*(1 - a);
for (const label celli : cells_) for (const label celli : cells_)
{ {
Usource[celli] += ((cellsV[celli]/V())*T)*diskDir_; Usource[celli] += ((cellsV[celli]/V())*T)*diskDir;
} }
if if
@ -128,7 +129,7 @@ void Foam::fv::actuationDiskSource::calcFroudeMethod
writeCurrentTime(os); writeCurrentTime(os);
os << Uref << tab << Cp << tab << Ct << tab << a << tab << T os << Uref << tab << Cp << tab << Ct << tab << a << tab << T
<< endl; << tab << diskDir << endl;
} }
} }
@ -221,12 +222,13 @@ void Foam::fv::actuationDiskSource::calcVariableScalingMethod
const scalar CpStar = Cp*pow3(magUref/magUdisk); const scalar CpStar = Cp*pow3(magUref/magUdisk);
// Compute calibrated thrust/power (LSRMTK:Eq. 5) // Compute calibrated thrust/power (LSRMTK:Eq. 5)
const scalar T = 0.5*rhoRef*diskArea_*magSqr(Udisk & diskDir_)*CtStar; const vector diskDir = this->diskDir();
const scalar P = 0.5*rhoRef*diskArea_*pow3(mag(Udisk & diskDir_))*CpStar; const scalar T = 0.5*rhoRef*diskArea_*magSqr(Udisk & diskDir)*CtStar;
const scalar P = 0.5*rhoRef*diskArea_*pow3(mag(Udisk & diskDir))*CpStar;
for (const label celli : cells_) for (const label celli : cells_)
{ {
Usource[celli] += (cellsV[celli]/totalV*T)*diskDir_; Usource[celli] += (cellsV[celli]/totalV*T)*diskDir;
} }
if if
@ -240,7 +242,7 @@ void Foam::fv::actuationDiskSource::calcVariableScalingMethod
os << Uref << tab << Cp << tab << Ct << tab os << Uref << tab << Cp << tab << Ct << tab
<< Udisk << tab << CpStar << tab << CtStar << tab << T << tab << P << Udisk << tab << CpStar << tab << CtStar << tab << T << tab << P
<< endl; << tab << diskDir << endl;
} }
} }

View File

@ -48,9 +48,8 @@ addRadialActuationDiskAxialInertialResistance
scalarField Tr(cells.size()); scalarField Tr(cells.size());
tensor E(Zero); tensor E(Zero);
E.xx() = diskDir_.x(); const vector diskDir = this->diskDir();
E.yy() = diskDir_.y(); E.diag(diskDir);
E.zz() = diskDir_.z();
const Field<vector> zoneCellCentres(mesh().cellCentres(), cells); const Field<vector> zoneCellCentres(mesh().cellCentres(), cells);
const Field<scalar> zoneCellVolumes(mesh().cellVolumes(), cells); const Field<scalar> zoneCellVolumes(mesh().cellVolumes(), cells);

View File

@ -1,7 +1,7 @@
/*--------------------------------*- C++ -*----------------------------------*\ /*--------------------------------*- C++ -*----------------------------------*\
| ========= | | | ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: v2312 | | \\ / O peration | Version: v2406 |
| \\ / A nd | Website: www.openfoam.com | | \\ / A nd | Website: www.openfoam.com |
| \\/ M anipulation | | | \\/ M anipulation | |
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
@ -21,7 +21,7 @@ disk1
selectionMode cellSet; selectionMode cellSet;
cellSet actuationDisk1; cellSet actuationDisk1;
diskArea 40; diskArea 40;
diskDir (1 0 0); diskDir constant (1 0 0); // Or other Function1
writeToFile true; writeToFile true;
sink true; sink true;
Cp 0.386; Cp 0.386;
@ -45,7 +45,7 @@ disk2
Cp 0.53; Cp 0.53;
Ct 0.58; Ct 0.58;
diskArea 40; diskArea 40;
diskDir (1 0 0); diskDir (1 0 0); // Or other Function1
upstreamPoint (581753 4785663 1070); upstreamPoint (581753 4785663 1070);
} }