@@ -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) {
@@ -921,6 +934,9 @@ void CConfig::SetPointersNull() {
921934 ActDiskOutlet_Power = nullptr ; ActDiskOutlet_Temperature = nullptr ; ActDiskOutlet_TotalTemperature = nullptr ;
922935 ActDiskOutlet_MassFlow = nullptr ;
923936
937+ ActDiskOutlet_Thrust_BEM = nullptr ;
938+ ActDiskOutlet_Torque_BEM = nullptr ;
939+
924940 ActDisk_DeltaPress = nullptr ; ActDisk_DeltaTemp = nullptr ;
925941 ActDisk_TotalPressRatio = nullptr ; ActDisk_TotalTempRatio = nullptr ; ActDisk_StaticPressRatio = nullptr ;
926942 ActDisk_StaticTempRatio = nullptr ; ActDisk_NetThrust = nullptr ; ActDisk_GrossThrust = nullptr ;
@@ -1523,6 +1539,16 @@ void CConfig::SetConfig_Options() {
15231539 nMarker_ActDiskInlet, nMarker_ActDiskOutlet, Marker_ActDiskInlet, Marker_ActDiskOutlet,
15241540 ActDisk_PressJump, ActDisk_TempJump, ActDisk_Omega);
15251541
1542+ /* !\brief MARKER_ACTDISK_BEM_CG\n DESCRIPTION: Actuator disk CG for blade element momentum (BEM) method. \ingroup Config*/
1543+ addActDiskBemOption (" MARKER_ACTDISK_BEM_CG" ,
1544+ nMarker_ActDiskBemInlet, nMarker_ActDiskBemOutlet, Marker_ActDiskBemInlet, Marker_ActDiskBemOutlet,
1545+ ActDiskBem_CG[0 ], ActDiskBem_CG[1 ], ActDiskBem_CG[2 ]);
1546+
1547+ /* !\brief MARKER_ACTDISK_BEM_AXIS\n DESCRIPTION: Actuator disk axis for blade element momentum (BEM) method. \ingroup Config*/
1548+ addActDiskBemOption (" MARKER_ACTDISK_BEM_AXIS" ,
1549+ nMarker_ActDiskBemInlet, nMarker_ActDiskBemOutlet, Marker_ActDiskBemInlet, Marker_ActDiskBemOutlet,
1550+ ActDiskBem_Axis[0 ], ActDiskBem_Axis[1 ], ActDiskBem_Axis[2 ]);
1551+
15261552 /* !\brief ACTDISK_FILENAME \n DESCRIPTION: Input file for a specified actuator disk (w/ extension) \n DEFAULT: actdiskinput.dat \ingroup Config*/
15271553 addStringOption (" ACTDISK_FILENAME" , ActDisk_FileName, string (" actdiskinput.dat" ));
15281554
@@ -1648,6 +1674,16 @@ void CConfig::SetConfig_Options() {
16481674 addBoolOption (" SUBSONIC_ENGINE" , SubsonicEngine, false );
16491675 /* DESCRIPTION: Actuator disk double surface */
16501676 addBoolOption (" ACTDISK_DOUBLE_SURFACE" , ActDisk_DoubleSurface, false );
1677+
1678+ /* DESCRIPTION: Actuator disk BEM switch for history file appending.*/
1679+ addBoolOption (" HISTORY_FILE_APPEND" , History_File_Append_Flag, false );
1680+ /* DESCRIPTION: Propeller blade angle for actuator disk BEM.*/
1681+ addDoubleOption (" BEM_PROP_BLADE_ANGLE" , BEM_blade_angle, 23.9 );
1682+ /* DESCRIPTION: Propeller file name for actuator disk BEM.*/
1683+ addStringOption (" BEM_PROP_FILENAME" , BEM_prop_filename, string (" prop_geom_alfclcd_data.txt" ));
1684+ /* DESCRIPTION: Frequency for updating actuator disk with BEM.*/
1685+ addUnsignedShortOption (" BEM_FREQ" , ActDiskBem_Frequency, 40 );
1686+
16511687 /* DESCRIPTION: Only half engine is in the computational grid */
16521688 addBoolOption (" ENGINE_HALF_MODEL" , Engine_HalfModel, false );
16531689 /* DESCRIPTION: Actuator disk double surface */
@@ -4975,6 +5011,18 @@ void CConfig::SetPostprocessing(SU2_COMPONENT val_software, unsigned short val_i
49755011 SU2_MPI::Error (" Vorticity confinement feature currently not supported for incompressible or non-equilibrium model or axisymmetric flows." , CURRENT_FUNCTION);
49765012 }
49775013
5014+ /* --- Actuator disk BEM method for propellers feature currently not supported for incompressible or non-equilibrium model or axisymmetric flows. ---*/
5015+
5016+ if ((Kind_Solver == MAIN_SOLVER::INC_EULER
5017+ || Kind_Solver == MAIN_SOLVER::INC_NAVIER_STOKES
5018+ || Kind_Solver == MAIN_SOLVER::INC_RANS
5019+ || Kind_Solver == MAIN_SOLVER::NEMO_EULER
5020+ || Kind_Solver == MAIN_SOLVER::NEMO_NAVIER_STOKES
5021+ || Axisymmetric)
5022+ && ActDisk_DoubleSurface) {
5023+ SU2_MPI::Error (" Actuator disk BEM method for propellers feature currently not supported for incompressible or non-equilibrium model or axisymmetric flows." , CURRENT_FUNCTION);
5024+ }
5025+
49785026 /* --- Check the coefficients for the polynomial models. ---*/
49795027
49805028 if (Kind_Solver != MAIN_SOLVER::INC_EULER && Kind_Solver != MAIN_SOLVER::INC_NAVIER_STOKES && Kind_Solver != MAIN_SOLVER::INC_RANS) {
@@ -5527,7 +5575,9 @@ void CConfig::SetMarkers(SU2_COMPONENT val_software) {
55275575 nMarker_Supersonic_Inlet + nMarker_Supersonic_Outlet + nMarker_Displacement + nMarker_Load +
55285576 nMarker_FlowLoad + nMarker_Custom + nMarker_Damper + nMarker_Fluid_Load +
55295577 nMarker_Clamped + nMarker_Load_Sine + nMarker_Load_Dir + nMarker_Disp_Dir +
5530- nMarker_ActDiskInlet + nMarker_ActDiskOutlet + nMarker_ZoneInterface;
5578+ nMarker_ActDiskInlet + nMarker_ActDiskOutlet +
5579+ nMarker_ActDiskBemInlet + nMarker_ActDiskBemOutlet +
5580+ nMarker_ZoneInterface;
55315581
55325582 /* --- Add the possible send/receive domains ---*/
55335583
@@ -5682,6 +5732,9 @@ void CConfig::SetMarkers(SU2_COMPONENT val_software) {
56825732 ActDiskOutlet_Force = new su2double[nMarker_ActDiskOutlet] ();
56835733 ActDiskOutlet_Power = new su2double[nMarker_ActDiskOutlet] ();
56845734
5735+ ActDiskOutlet_Thrust_BEM = new su2double[nMarker_ActDiskOutlet]();
5736+ ActDiskOutlet_Torque_BEM = new su2double[nMarker_ActDiskOutlet]();
5737+
56855738 for (iMarker_ActDiskOutlet = 0 ; iMarker_ActDiskOutlet < nMarker_ActDiskOutlet; iMarker_ActDiskOutlet++) {
56865739 Marker_CfgFile_TagBound[iMarker_CfgFile] = Marker_ActDiskOutlet[iMarker_ActDiskOutlet];
56875740 Marker_CfgFile_KindBC[iMarker_CfgFile] = ACTDISK_OUTLET;
@@ -7598,6 +7651,12 @@ void CConfig::SetOutput(SU2_COMPONENT val_software, unsigned short val_izone) {
75987651 }
75997652 }
76007653
7654+ if (nMarker_ActDiskOutlet != 0 ) {
7655+ if (GetKind_ActDisk () == BLADE_ELEMENT) {
7656+ cout << endl << " Actuator disk with blade element momentum (BEM) method." << endl;
7657+ cout << " Actuator disk BEM method propeller data read from file: " << GetBEM_prop_filename () << endl;
7658+ }
7659+ }
76017660}
76027661
76037662bool CConfig::TokenizeString (string & str, string & option_name,
@@ -8091,6 +8150,9 @@ CConfig::~CConfig() {
80918150 delete[] ActDiskOutlet_Force;
80928151 delete[] ActDiskOutlet_Power;
80938152
8153+ delete[] ActDiskOutlet_Thrust_BEM;
8154+ delete[] ActDiskOutlet_Torque_BEM;
8155+
80948156 delete[] Outlet_MassFlow;
80958157 delete[] Outlet_Density;
80968158 delete[] Outlet_Area;
@@ -8676,6 +8738,22 @@ su2double CConfig::GetActDisk_Omega(const string& val_marker, unsigned short val
86768738 return ActDisk_Omega[iMarker_ActDisk][val_value];;
86778739}
86788740
8741+ su2double CConfig::GetActDiskBem_CG (unsigned short iDim, string val_marker, unsigned short val_value) const {
8742+ unsigned short iMarker_ActDisk;
8743+ for (iMarker_ActDisk = 0 ; iMarker_ActDisk < nMarker_ActDiskBemInlet; iMarker_ActDisk++)
8744+ if ((Marker_ActDiskBemInlet[iMarker_ActDisk] == val_marker) ||
8745+ (Marker_ActDiskBemOutlet[iMarker_ActDisk] == val_marker)) break ;
8746+ return ActDiskBem_CG[iDim][iMarker_ActDisk][val_value];
8747+ }
8748+
8749+ su2double CConfig::GetActDiskBem_Axis (unsigned short iDim, string val_marker, unsigned short val_value) const {
8750+ unsigned short iMarker_ActDisk;
8751+ for (iMarker_ActDisk = 0 ; iMarker_ActDisk < nMarker_ActDiskBemInlet; iMarker_ActDisk++)
8752+ if ((Marker_ActDiskBemInlet[iMarker_ActDisk] == val_marker) ||
8753+ (Marker_ActDiskBemOutlet[iMarker_ActDisk] == val_marker)) break ;
8754+ return ActDiskBem_Axis[iDim][iMarker_ActDisk][val_value];
8755+ }
8756+
86798757su2double CConfig::GetOutlet_MassFlow (const string& val_marker) const {
86808758 unsigned short iMarker_Outlet;
86818759 for (iMarker_Outlet = 0 ; iMarker_Outlet < nMarker_Outlet; iMarker_Outlet++)
@@ -9452,6 +9530,20 @@ su2double CConfig::GetActDiskOutlet_Power(const string& val_marker) const {
94529530 return ActDiskOutlet_Power[iMarker_ActDiskOutlet];
94539531}
94549532
9533+ su2double CConfig::GetActDiskOutlet_Thrust_BEM (string val_marker) const {
9534+ unsigned short iMarker_ActDiskOutlet;
9535+ for (iMarker_ActDiskOutlet = 0 ; iMarker_ActDiskOutlet < nMarker_ActDiskOutlet; iMarker_ActDiskOutlet++)
9536+ if (Marker_ActDiskOutlet[iMarker_ActDiskOutlet] == val_marker) break ;
9537+ return ActDiskOutlet_Thrust_BEM[iMarker_ActDiskOutlet];
9538+ }
9539+
9540+ su2double CConfig::GetActDiskOutlet_Torque_BEM (string val_marker) const {
9541+ unsigned short iMarker_ActDiskOutlet;
9542+ for (iMarker_ActDiskOutlet = 0 ; iMarker_ActDiskOutlet < nMarker_ActDiskOutlet; iMarker_ActDiskOutlet++)
9543+ if (Marker_ActDiskOutlet[iMarker_ActDiskOutlet] == val_marker) break ;
9544+ return ActDiskOutlet_Torque_BEM[iMarker_ActDiskOutlet];
9545+ }
9546+
94559547su2double CConfig::GetActDiskInlet_Temperature (const string& val_marker) const {
94569548 unsigned short iMarker_ActDiskInlet;
94579549 for (iMarker_ActDiskInlet = 0 ; iMarker_ActDiskInlet < nMarker_ActDiskInlet; iMarker_ActDiskInlet++)
0 commit comments