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
- Tetsuo Aoyagi
- Akira Azami
- Pete Bachant
- William Bainbridge
- Gabriel Barajas
- Kutalmis Bercin

View File

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

View File

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

View File

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

View File

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

View File

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