Skip to content

Commit 9364ed2

Browse files
committed
merge develop
2 parents 8531ae8 + a8c5e15 commit 9364ed2

19 files changed

Lines changed: 1471 additions & 19 deletions

Common/include/CConfig.hpp

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,8 @@ class CConfig {
184184
nMarker_NearFieldBound, /*!< \brief Number of near field boundary markers. */
185185
nMarker_ActDiskInlet, /*!< \brief Number of actuator disk inlet markers. */
186186
nMarker_ActDiskOutlet, /*!< \brief Number of actuator disk outlet markers. */
187+
nMarker_ActDiskBemInlet, /*!< \brief Number of actuator disk BEM inlet markers. */
188+
nMarker_ActDiskBemOutlet, /*!< \brief Number of actuator disk BEM outlet markers. */
187189
nMarker_Deform_Mesh_Sym_Plane, /*!< \brief Number of markers with symmetric deformation */
188190
nMarker_Deform_Mesh, /*!< \brief Number of deformable markers at the boundary. */
189191
nMarker_Fluid_Load, /*!< \brief Number of markers in which the flow load is computed/employed. */
@@ -240,6 +242,8 @@ class CConfig {
240242
*Marker_CHTInterface, /*!< \brief Conjugate heat transfer interface markers. */
241243
*Marker_ActDiskInlet, /*!< \brief Actuator disk inlet markers. */
242244
*Marker_ActDiskOutlet, /*!< \brief Actuator disk outlet markers. */
245+
*Marker_ActDiskBemInlet, /*!< \brief Actuator disk BEM inlet markers. */
246+
*Marker_ActDiskBemOutlet, /*!< \brief Actuator disk BEM outlet markers. */
243247
*Marker_Inlet, /*!< \brief Inlet flow markers. */
244248
*Marker_Inlet_Species, /*!< \brief Inlet species markers. */
245249
*Marker_Inlet_Turb, /*!< \brief Inlet turbulent markers. */
@@ -337,8 +341,16 @@ class CConfig {
337341
su2double *ActDiskOutlet_GrossThrust; /*!< \brief Specified outlet gross thrust for actuator disk. */
338342
su2double *ActDiskOutlet_Force; /*!< \brief Specified outlet force for actuator disk. */
339343
su2double *ActDiskOutlet_Power; /*!< \brief Specified outlet power for actuator disk. */
344+
su2double *ActDiskOutlet_Thrust_BEM; /*!< \brief Specified outlet thrust for actuator disk. */
345+
su2double *ActDiskOutlet_Torque_BEM; /*!< \brief Specified outlet torque for actuator disk. */
340346
su2double **ActDisk_PressJump,
341347
**ActDisk_TempJump, **ActDisk_Omega; /*!< \brief Specified deltas for actuator disk.*/
348+
su2double **ActDiskBem_CG[3]; /*!< \brief Specified center for actuator disk BEM.*/
349+
su2double **ActDiskBem_Axis[3]; /*!< \brief Specified axis for actuator disk BEM.*/
350+
su2double BEM_blade_angle; /*!< \brief Propeller blade angle.*/
351+
string BEM_prop_filename; /*!< \brief Propeller filename.*/
352+
unsigned short ActDiskBem_Frequency; /*!< \brief Frequency of updating actuator disk with BEM. */
353+
bool History_File_Append_Flag; /*!< \brief Flag to append history file.*/
342354
su2double *ActDisk_DeltaPress; /*!< \brief Specified pressure delta for actuator disk. */
343355
su2double *ActDisk_DeltaTemp; /*!< \brief Specified temperature delta for actuator disk. */
344356
su2double *ActDisk_TotalPressRatio; /*!< \brief Specified tot. pres. ratio for actuator disk. */
@@ -1350,6 +1362,10 @@ class CConfig {
13501362
unsigned short & nMarker_ActDiskInlet, unsigned short & nMarker_ActDiskOutlet, string* & Marker_ActDiskInlet, string* & Marker_ActDiskOutlet,
13511363
su2double** & ActDisk_PressJump, su2double** & ActDisk_TempJump, su2double** & ActDisk_Omega);
13521364

1365+
void addActDiskBemOption(const string& name,
1366+
unsigned short& nMarker_ActDiskBemInlet, unsigned short& nMarker_ActDiskBemOutlet, string*& Marker_ActDiskBemInlet, string*& Marker_ActDiskBemOutlet,
1367+
su2double**& ActDiskBem_X, su2double**& ActDiskBem_Y, su2double**& ActDiskBem_Z);
1368+
13531369
void addWallFunctionOption(const string &name, unsigned short &list_size,
13541370
string* &string_field, WALL_FUNCTIONS* &val_Kind_WF,
13551371
unsigned short** &val_IntInfo_WF, su2double** &val_DoubleInfo_WF);
@@ -6608,6 +6624,31 @@ class CConfig {
66086624
*/
66096625
su2double GetActDisk_Omega(const string& val_marker, unsigned short val_index) const;
66106626

6627+
/*!
6628+
* \brief Get the Center of the actuator disk with BEM.
6629+
*/
6630+
su2double GetActDiskBem_CG(unsigned short iDim, string val_marker, unsigned short val_index) const;
6631+
6632+
/*!
6633+
* \brief Get the axis of the actuator disk with BEM.
6634+
*/
6635+
su2double GetActDiskBem_Axis(unsigned short iDim, string val_marker, unsigned short val_index) const;
6636+
6637+
/*!
6638+
* \brief Get the frequency of updating the actuator disk with BEM.
6639+
*/
6640+
const unsigned short& GetActDiskBem_Frequency(void) const { return ActDiskBem_Frequency; }
6641+
6642+
/*!
6643+
* \brief Get the blade angle of the propeller.
6644+
*/
6645+
su2double GetBEM_blade_angle(void) const { return BEM_blade_angle; }
6646+
6647+
/*!
6648+
* \brief Get the filename of the propeller.
6649+
*/
6650+
const string& GetBEM_prop_filename(void) const { return BEM_prop_filename; }
6651+
66116652
/*!
66126653
* \brief Get Actuator Disk Outlet for boundary <i>val_marker</i> (actuator disk inlet).
66136654
* \return Actuator Disk Outlet from the config information for the marker <i>val_marker</i>.
@@ -8140,6 +8181,20 @@ class CConfig {
81408181
*/
81418182
su2double GetActDiskOutlet_Power(const string& val_marker) const;
81428183

8184+
/*!
8185+
* \brief Get the thrust at the actuator disk outlet boundary.
8186+
* \param[in] val_marker - Marker corresponding to the outlet (actuator disk) boundary.
8187+
* \return The outlet (actuator disk) thrust.
8188+
*/
8189+
su2double GetActDiskOutlet_Thrust_BEM(string val_marker) const;
8190+
8191+
/*!
8192+
* \brief Get the torque at the actuator disk outlet boundary.
8193+
* \param[in] val_marker - Marker corresponding to the outlet boundary.
8194+
* \return The outlet (actuator disk) torque.
8195+
*/
8196+
su2double GetActDiskOutlet_Torque_BEM(string val_marker) const;
8197+
81438198
/*!
81448199
* \brief Get the back pressure (static) at an outlet boundary.
81458200
* \param[in] val_index - Index corresponding to the outlet boundary.
@@ -8175,6 +8230,24 @@ class CConfig {
81758230
*/
81768231
void SetActDiskOutlet_Power(unsigned short val_marker, su2double val_actdisk_power) { ActDiskOutlet_Power[val_marker] = val_actdisk_power; }
81778232

8233+
/*!
8234+
* \brief Set the thrust at the outlet (actuator disk) boundary.
8235+
* \param[in] val_marker - Marker corresponding to the outlet (actuator disk) boundary.
8236+
* \param[in] val_actdisk_thrust_bem - Value of the actuator disk thrust.
8237+
*/
8238+
void SetActDiskOutlet_Thrust_BEM(unsigned short val_marker, su2double val_actdisk_thrust_bem) {
8239+
ActDiskOutlet_Thrust_BEM[val_marker] = val_actdisk_thrust_bem;
8240+
}
8241+
8242+
/*!
8243+
* \brief Get the back pressure (static) at an outlet boundary.
8244+
* \param[in] val_marker - Marker corresponding to the outlet boundary.
8245+
* \param[in] val_actdisk_torque_bem - Value of the actuator disk torque.
8246+
*/
8247+
void SetActDiskOutlet_Torque_BEM(unsigned short val_marker, su2double val_actdisk_torque_bem) {
8248+
ActDiskOutlet_Torque_BEM[val_marker] = val_actdisk_torque_bem;
8249+
}
8250+
81788251
/*!
81798252
* \brief Get the displacement value at an displacement boundary.
81808253
* \param[in] val_index - Index corresponding to the displacement boundary.

Common/include/basic_types/ad_structure.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -396,6 +396,8 @@ FORCEINLINE void SetIndex(int& index, const su2double& data) { index = data.getI
396396

397397
// WARNING: For performance reasons, this method does not perform bounds checking.
398398
// When using it, please ensure sufficient adjoint vector size by a call to AD::ResizeAdjoints().
399+
// This method does not perform locking either.
400+
// It should be safeguarded by calls to AD::BeginUseAdjoints() and AD::EndUseAdjoints().
399401
FORCEINLINE void SetDerivative(int index, const double val) {
400402
if (index == 0) // Allow multiple threads to "set the derivative" of passive variables without causing data races.
401403
return;
@@ -406,6 +408,8 @@ FORCEINLINE void SetDerivative(int index, const double val) {
406408
// WARNING: For performance reasons, this method does not perform bounds checking.
407409
// If called after tape evaluations, the adjoints should exist.
408410
// Otherwise, please ensure sufficient adjoint vector size by a call to AD::ResizeAdjoints().
411+
// This method does not perform locking either.
412+
// It should be safeguarded by calls to AD::BeginUseAdjoints() and AD::EndUseAdjoints().
409413
FORCEINLINE double GetDerivative(int index) {
410414
return AD::getTape().getGradient(index, codi::AdjointsManagement::Manual);
411415
}

Common/include/option_structure.hpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1857,7 +1857,8 @@ enum ACTDISK_TYPE {
18571857
DRAG_MINUS_THRUST = 4, /*!< \brief User specifies the D-T. */
18581858
MASSFLOW = 5, /*!< \brief User specifies the massflow. */
18591859
POWER = 6, /*!< \brief User specifies the power. */
1860-
VARIABLE_LOAD = 7 /*!< \brief User specifies the load distribution. */
1860+
VARIABLE_LOAD = 7, /*!< \brief User specifies the load distribution. */
1861+
BLADE_ELEMENT = 8 /*!< \brief User specifies to use Blade element method. */
18611862
};
18621863
static const MapType<std::string, ACTDISK_TYPE> ActDisk_Map = {
18631864
MakePair("VARIABLES_JUMP", VARIABLES_JUMP)
@@ -1867,6 +1868,7 @@ static const MapType<std::string, ACTDISK_TYPE> ActDisk_Map = {
18671868
MakePair("MASSFLOW", MASSFLOW)
18681869
MakePair("POWER", POWER)
18691870
MakePair("VARIABLE_LOAD", VARIABLE_LOAD)
1871+
MakePair("BLADE_ELEMENT", BLADE_ELEMENT)
18701872
};
18711873

18721874
/*!

Common/src/CConfig.cpp

Lines changed: 93 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -557,6 +557,19 @@ void CConfig::addActDiskOption(const string & name, unsigned short & nMarker_Act
557557
option_map.insert(pair<string, COptionBase *>(name, val));
558558
}
559559

560+
void CConfig::addActDiskBemOption(const string& name,
561+
unsigned short& nMarker_ActDiskBemInlet, unsigned short& nMarker_ActDiskBemOutlet,
562+
string*& Marker_ActDiskBemInlet, string*& Marker_ActDiskBemOutlet,
563+
su2double**& ActDiskBem_X, su2double**& ActDiskBem_Y, su2double**& ActDiskBem_Z) {
564+
assert(option_map.find(name) == option_map.end());
565+
all_options.insert(pair<string, bool>(name, true));
566+
COptionBase* val = new COptionActDisk(name,
567+
nMarker_ActDiskBemInlet, nMarker_ActDiskBemOutlet,
568+
Marker_ActDiskBemInlet, Marker_ActDiskBemOutlet,
569+
ActDiskBem_X, ActDiskBem_Y, ActDiskBem_Z);
570+
option_map.insert(pair<string, COptionBase *>(name, val));
571+
}
572+
560573
void CConfig::addWallFunctionOption(const string &name, unsigned short &list_size, string* &string_field,
561574
WALL_FUNCTIONS* &val_Kind_WF, unsigned short** &val_IntInfo_WF,
562575
su2double** &val_DoubleInfo_WF) {
@@ -920,6 +933,9 @@ void CConfig::SetPointersNull() {
920933
ActDiskOutlet_Power = nullptr; ActDiskOutlet_Temperature = nullptr; ActDiskOutlet_TotalTemperature = nullptr;
921934
ActDiskOutlet_MassFlow = nullptr;
922935

936+
ActDiskOutlet_Thrust_BEM = nullptr;
937+
ActDiskOutlet_Torque_BEM = nullptr;
938+
923939
ActDisk_DeltaPress = nullptr; ActDisk_DeltaTemp = nullptr;
924940
ActDisk_TotalPressRatio = nullptr; ActDisk_TotalTempRatio = nullptr; ActDisk_StaticPressRatio = nullptr;
925941
ActDisk_StaticTempRatio = nullptr; ActDisk_NetThrust = nullptr; ActDisk_GrossThrust = nullptr;
@@ -1517,6 +1533,16 @@ void CConfig::SetConfig_Options() {
15171533
nMarker_ActDiskInlet, nMarker_ActDiskOutlet, Marker_ActDiskInlet, Marker_ActDiskOutlet,
15181534
ActDisk_PressJump, ActDisk_TempJump, ActDisk_Omega);
15191535

1536+
/*!\brief MARKER_ACTDISK_BEM_CG\n DESCRIPTION: Actuator disk CG for blade element momentum (BEM) method. \ingroup Config*/
1537+
addActDiskBemOption("MARKER_ACTDISK_BEM_CG",
1538+
nMarker_ActDiskBemInlet, nMarker_ActDiskBemOutlet, Marker_ActDiskBemInlet, Marker_ActDiskBemOutlet,
1539+
ActDiskBem_CG[0], ActDiskBem_CG[1], ActDiskBem_CG[2]);
1540+
1541+
/*!\brief MARKER_ACTDISK_BEM_AXIS\n DESCRIPTION: Actuator disk axis for blade element momentum (BEM) method. \ingroup Config*/
1542+
addActDiskBemOption("MARKER_ACTDISK_BEM_AXIS",
1543+
nMarker_ActDiskBemInlet, nMarker_ActDiskBemOutlet, Marker_ActDiskBemInlet, Marker_ActDiskBemOutlet,
1544+
ActDiskBem_Axis[0], ActDiskBem_Axis[1], ActDiskBem_Axis[2]);
1545+
15201546
/*!\brief ACTDISK_FILENAME \n DESCRIPTION: Input file for a specified actuator disk (w/ extension) \n DEFAULT: actdiskinput.dat \ingroup Config*/
15211547
addStringOption("ACTDISK_FILENAME", ActDisk_FileName, string("actdiskinput.dat"));
15221548

@@ -1642,6 +1668,16 @@ void CConfig::SetConfig_Options() {
16421668
addBoolOption("SUBSONIC_ENGINE", SubsonicEngine, false);
16431669
/* DESCRIPTION: Actuator disk double surface */
16441670
addBoolOption("ACTDISK_DOUBLE_SURFACE", ActDisk_DoubleSurface, false);
1671+
1672+
/* DESCRIPTION: Actuator disk BEM switch for history file appending.*/
1673+
addBoolOption("HISTORY_FILE_APPEND", History_File_Append_Flag, false);
1674+
/* DESCRIPTION: Propeller blade angle for actuator disk BEM.*/
1675+
addDoubleOption("BEM_PROP_BLADE_ANGLE", BEM_blade_angle, 23.9);
1676+
/* DESCRIPTION: Propeller file name for actuator disk BEM.*/
1677+
addStringOption("BEM_PROP_FILENAME", BEM_prop_filename, string("prop_geom_alfclcd_data.txt"));
1678+
/* DESCRIPTION: Frequency for updating actuator disk with BEM.*/
1679+
addUnsignedShortOption("BEM_FREQ", ActDiskBem_Frequency, 40);
1680+
16451681
/* DESCRIPTION: Only half engine is in the computational grid */
16461682
addBoolOption("ENGINE_HALF_MODEL", Engine_HalfModel, false);
16471683
/* DESCRIPTION: Actuator disk SU2_DEF */
@@ -4947,6 +4983,18 @@ void CConfig::SetPostprocessing(SU2_COMPONENT val_software, unsigned short val_i
49474983
SU2_MPI::Error("Vorticity confinement feature currently not supported for incompressible or non-equilibrium model or axisymmetric flows.", CURRENT_FUNCTION);
49484984
}
49494985

4986+
/*--- Actuator disk BEM method for propellers feature currently not supported for incompressible or non-equilibrium model or axisymmetric flows. ---*/
4987+
4988+
if ((Kind_Solver == MAIN_SOLVER::INC_EULER
4989+
|| Kind_Solver == MAIN_SOLVER::INC_NAVIER_STOKES
4990+
|| Kind_Solver == MAIN_SOLVER::INC_RANS
4991+
|| Kind_Solver == MAIN_SOLVER::NEMO_EULER
4992+
|| Kind_Solver == MAIN_SOLVER::NEMO_NAVIER_STOKES
4993+
|| Axisymmetric)
4994+
&& ActDisk_DoubleSurface) {
4995+
SU2_MPI::Error("Actuator disk BEM method for propellers feature currently not supported for incompressible or non-equilibrium model or axisymmetric flows.", CURRENT_FUNCTION);
4996+
}
4997+
49504998
/*--- Check the coefficients for the polynomial models. ---*/
49514999

49525000
if (Kind_Solver != MAIN_SOLVER::INC_EULER && Kind_Solver != MAIN_SOLVER::INC_NAVIER_STOKES && Kind_Solver != MAIN_SOLVER::INC_RANS) {
@@ -5499,7 +5547,9 @@ void CConfig::SetMarkers(SU2_COMPONENT val_software) {
54995547
nMarker_Supersonic_Inlet + nMarker_Supersonic_Outlet + nMarker_Displacement + nMarker_Load +
55005548
nMarker_Custom + nMarker_Damper + nMarker_Fluid_Load +
55015549
nMarker_Clamped + nMarker_Load_Dir + nMarker_Disp_Dir +
5502-
nMarker_ActDiskInlet + nMarker_ActDiskOutlet + nMarker_ZoneInterface;
5550+
nMarker_ActDiskInlet + nMarker_ActDiskOutlet +
5551+
nMarker_ActDiskBemInlet + nMarker_ActDiskBemOutlet +
5552+
nMarker_ZoneInterface;
55035553

55045554
/*--- Add the possible send/receive domains ---*/
55055555

@@ -5654,6 +5704,9 @@ void CConfig::SetMarkers(SU2_COMPONENT val_software) {
56545704
ActDiskOutlet_Force = new su2double[nMarker_ActDiskOutlet] ();
56555705
ActDiskOutlet_Power = new su2double[nMarker_ActDiskOutlet] ();
56565706

5707+
ActDiskOutlet_Thrust_BEM = new su2double[nMarker_ActDiskOutlet]();
5708+
ActDiskOutlet_Torque_BEM = new su2double[nMarker_ActDiskOutlet]();
5709+
56575710
for (iMarker_ActDiskOutlet = 0; iMarker_ActDiskOutlet < nMarker_ActDiskOutlet; iMarker_ActDiskOutlet++) {
56585711
Marker_CfgFile_TagBound[iMarker_CfgFile] = Marker_ActDiskOutlet[iMarker_ActDiskOutlet];
56595712
Marker_CfgFile_KindBC[iMarker_CfgFile] = ACTDISK_OUTLET;
@@ -7540,6 +7593,12 @@ void CConfig::SetOutput(SU2_COMPONENT val_software, unsigned short val_izone) {
75407593
}
75417594
}
75427595

7596+
if (nMarker_ActDiskOutlet != 0) {
7597+
if (GetKind_ActDisk() == BLADE_ELEMENT) {
7598+
cout << endl << "Actuator disk with blade element momentum (BEM) method." << endl;
7599+
cout << "Actuator disk BEM method propeller data read from file: " << GetBEM_prop_filename() << endl;
7600+
}
7601+
}
75437602
}
75447603

75457604
bool CConfig::TokenizeString(string & str, string & option_name,
@@ -8033,6 +8092,9 @@ CConfig::~CConfig() {
80338092
delete[] ActDiskOutlet_Force;
80348093
delete[] ActDiskOutlet_Power;
80358094

8095+
delete[] ActDiskOutlet_Thrust_BEM;
8096+
delete[] ActDiskOutlet_Torque_BEM;
8097+
80368098
delete[] Outlet_MassFlow;
80378099
delete[] Outlet_Density;
80388100
delete[] Outlet_Area;
@@ -8618,6 +8680,22 @@ su2double CConfig::GetActDisk_Omega(const string& val_marker, unsigned short val
86188680
return ActDisk_Omega[iMarker_ActDisk][val_value];;
86198681
}
86208682

8683+
su2double CConfig::GetActDiskBem_CG(unsigned short iDim, string val_marker, unsigned short val_value) const {
8684+
unsigned short iMarker_ActDisk;
8685+
for (iMarker_ActDisk = 0; iMarker_ActDisk < nMarker_ActDiskBemInlet; iMarker_ActDisk++)
8686+
if ((Marker_ActDiskBemInlet[iMarker_ActDisk] == val_marker) ||
8687+
(Marker_ActDiskBemOutlet[iMarker_ActDisk] == val_marker)) break;
8688+
return ActDiskBem_CG[iDim][iMarker_ActDisk][val_value];
8689+
}
8690+
8691+
su2double CConfig::GetActDiskBem_Axis(unsigned short iDim, string val_marker, unsigned short val_value) const {
8692+
unsigned short iMarker_ActDisk;
8693+
for (iMarker_ActDisk = 0; iMarker_ActDisk < nMarker_ActDiskBemInlet; iMarker_ActDisk++)
8694+
if ((Marker_ActDiskBemInlet[iMarker_ActDisk] == val_marker) ||
8695+
(Marker_ActDiskBemOutlet[iMarker_ActDisk] == val_marker)) break;
8696+
return ActDiskBem_Axis[iDim][iMarker_ActDisk][val_value];
8697+
}
8698+
86218699
su2double CConfig::GetOutlet_MassFlow(const string& val_marker) const {
86228700
unsigned short iMarker_Outlet;
86238701
for (iMarker_Outlet = 0; iMarker_Outlet < nMarker_Outlet; iMarker_Outlet++)
@@ -9394,6 +9472,20 @@ su2double CConfig::GetActDiskOutlet_Power(const string& val_marker) const {
93949472
return ActDiskOutlet_Power[iMarker_ActDiskOutlet];
93959473
}
93969474

9475+
su2double CConfig::GetActDiskOutlet_Thrust_BEM(string val_marker) const {
9476+
unsigned short iMarker_ActDiskOutlet;
9477+
for (iMarker_ActDiskOutlet = 0; iMarker_ActDiskOutlet < nMarker_ActDiskOutlet; iMarker_ActDiskOutlet++)
9478+
if (Marker_ActDiskOutlet[iMarker_ActDiskOutlet] == val_marker) break;
9479+
return ActDiskOutlet_Thrust_BEM[iMarker_ActDiskOutlet];
9480+
}
9481+
9482+
su2double CConfig::GetActDiskOutlet_Torque_BEM(string val_marker) const {
9483+
unsigned short iMarker_ActDiskOutlet;
9484+
for (iMarker_ActDiskOutlet = 0; iMarker_ActDiskOutlet < nMarker_ActDiskOutlet; iMarker_ActDiskOutlet++)
9485+
if (Marker_ActDiskOutlet[iMarker_ActDiskOutlet] == val_marker) break;
9486+
return ActDiskOutlet_Torque_BEM[iMarker_ActDiskOutlet];
9487+
}
9488+
93979489
su2double CConfig::GetActDiskInlet_Temperature(const string& val_marker) const {
93989490
unsigned short iMarker_ActDiskInlet;
93999491
for (iMarker_ActDiskInlet = 0; iMarker_ActDiskInlet < nMarker_ActDiskInlet; iMarker_ActDiskInlet++)

0 commit comments

Comments
 (0)