@@ -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+
560573void 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
75457604bool 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+
86218699su2double 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+
93979489su2double 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