Skip to content

Commit

Permalink
Add error code to cmod. Allows cycle to fail and pass error out.
Browse files Browse the repository at this point in the history
  • Loading branch information
taylorbrown75 committed Apr 24, 2024
1 parent 5f18142 commit 046cbe8
Show file tree
Hide file tree
Showing 6 changed files with 302 additions and 217 deletions.
429 changes: 223 additions & 206 deletions ssc/csp_common.cpp

Large diffs are not rendered by default.

43 changes: 43 additions & 0 deletions tcs/sco2_cycle_templates.h
Expand Up @@ -38,6 +38,49 @@ class C_sco2_cycle_core
E_SET_T_T_IN // Model sets turbine inlet temperature to HTF inlet temperature
};

class E_cycle_error_msg
{
public:

// Error Types
enum E_cycle_error_types
{
E_CANNOT_PRODUCE_POWER = 200,
E_CO2_PROPS_ERROR,
E_ETA_THRESHOLD,
E_HTR_LTR_CONVERGENCE,
E_AIR_COOLER_CONVERGENCE,
E_NO_ERROR
};

// Get error message corresponding to error type
// NO COMMAS in message
static std::string get_error_string(int error_enum)
{
switch (error_enum)
{
case((int)E_CANNOT_PRODUCE_POWER):
return "Cycle cannot produce power";
break;
case((int)E_CO2_PROPS_ERROR):
return "Error calculating sCO2 properties";
case((int)E_ETA_THRESHOLD):
return "Eta below threshold";
case((int)E_NO_ERROR):
return "No error";
break;
case((int)E_HTR_LTR_CONVERGENCE):
return "HTR LTR convergence issue";
case((int)E_AIR_COOLER_CONVERGENCE):
return "Air cooler did not converge";
default:
return "Error code not recognized";
break;
}
}

};

enum class E_turbo_gen_motor_config
{
// Options to apply motor and generator losses
Expand Down
11 changes: 9 additions & 2 deletions tcs/sco2_htrbypass_cycle.cpp
Expand Up @@ -252,7 +252,7 @@ int C_sco2_htrbp_core::solve()

if (m_outputs.m_w_mc + m_outputs.m_w_rc + m_outputs.m_w_t <= 0.0) // positive net power is impossible; return an error
{
m_outputs.m_error_code = 25;
m_outputs.m_error_code = (int)C_sco2_cycle_core::E_cycle_error_msg::E_CANNOT_PRODUCE_POWER;
return m_outputs.m_error_code;
}
}
Expand Down Expand Up @@ -280,7 +280,7 @@ int C_sco2_htrbp_core::solve()

if (T_HTR_LP_out_code != C_monotonic_eq_solver::CONVERGED)
{
m_outputs.m_error_code = 35;
m_outputs.m_error_code = (int)C_sco2_cycle_core::E_cycle_error_msg::E_HTR_LTR_CONVERGENCE;
return m_outputs.m_error_code;
}

Expand Down Expand Up @@ -933,6 +933,13 @@ void C_HTRBypass_Cycle::auto_opt_design_core(int& error_code)
if (error_code != 0)
return;

// don't size system if eta is terrible
//if (m_optimal_htrbp_core.m_outputs.m_eta_thermal < 0.15)
//{
// error_code = (int)C_sco2_cycle_core::E_cycle_error_msg::E_ETA_THRESHOLD;
// return;
//}

// Finalize Design (pass in reference to solved parameters)
error_code = m_optimal_htrbp_core.finalize_design(ms_des_solved);
}
Expand Down
19 changes: 14 additions & 5 deletions tcs/sco2_pc_csp_int.cpp
Expand Up @@ -62,11 +62,11 @@ C_sco2_phx_air_cooler::C_sco2_phx_air_cooler()
mp_mf_update = 0; // NULL
}

void C_sco2_phx_air_cooler::design(S_des_par des_par)
int C_sco2_phx_air_cooler::design(S_des_par des_par)
{
ms_des_par = des_par;

design_core();
return design_core();
}

void C_sco2_phx_air_cooler::C_P_LP_in_iter_tracker::reset_vectors()
Expand All @@ -88,7 +88,7 @@ void C_sco2_phx_air_cooler::C_P_LP_in_iter_tracker::push_back_vectors(double P_L
mv_is_converged.push_back(is_converged); //[-]
}

void C_sco2_phx_air_cooler::design_core()
int C_sco2_phx_air_cooler::design_core()
{
// using -> C_RecompCycle::S_auto_opt_design_hit_eta_parameters
std::string error_msg;
Expand Down Expand Up @@ -375,7 +375,16 @@ void C_sco2_phx_air_cooler::design_core()

if (auto_err_code != 0)
{
throw(C_csp_exception(error_msg.c_str()));
// Check if error code is handled (need to report out)
if (auto_err_code >= (int)C_sco2_cycle_core::E_cycle_error_msg::E_CANNOT_PRODUCE_POWER
&& auto_err_code < (int)C_sco2_cycle_core::E_cycle_error_msg::E_NO_ERROR)
{
return auto_err_code;
}

// Unhandled exception
else
throw(C_csp_exception(error_msg.c_str()));
}

if (error_msg.empty())
Expand Down Expand Up @@ -536,7 +545,7 @@ void C_sco2_phx_air_cooler::design_core()



return;
return auto_err_code;
}


Expand Down
4 changes: 2 additions & 2 deletions tcs/sco2_pc_csp_int.h
Expand Up @@ -404,7 +404,7 @@ class C_sco2_phx_air_cooler
double m_T_co2_crit; //[K]
double m_P_co2_crit; //[kPa]

void design_core();
int design_core();

double adjust_P_mc_in_away_2phase(double T_co2 /*K*/, double P_mc_in /*kPa*/);

Expand Down Expand Up @@ -629,7 +629,7 @@ class C_sco2_phx_air_cooler
util::matrix_t<double> & T_htf_ind, util::matrix_t<double> & T_amb_ind, util::matrix_t<double> & m_dot_htf_ND_ind,
double od_opt_tol /*-*/, double od_tol /*-*/);

void design(S_des_par des_par);
int design(S_des_par des_par);

int off_design__constant_N__calc_max_htf_massflow__T_mc_in_P_LP_in__objective(C_sco2_phx_air_cooler::S_od_par od_par,
bool is_rc_N_od_at_design, double rc_N_od_f_des /*-*/,
Expand Down
13 changes: 11 additions & 2 deletions tcs/sco2_turbinesplitflow_cycle.cpp
Expand Up @@ -477,11 +477,20 @@ int C_sco2_tsf_core::finalize_design(C_sco2_cycle_core::S_design_solved& design_
s_air_cooler_des_par_ind.m_elev = m_inputs.m_elevation; // [m]
s_air_cooler_des_par_ind.m_eta_fan = m_inputs.m_eta_fan; // [-]
s_air_cooler_des_par_ind.m_N_nodes_pass = m_inputs.m_N_nodes_pass; // [-]

if (m_inputs.m_is_des_air_cooler && std::isfinite(m_inputs.m_deltaP_cooler_frac) && std::isfinite(m_inputs.m_frac_fan_power)
&& std::isfinite(m_inputs.m_T_amb_des) && std::isfinite(m_inputs.m_elevation) && std::isfinite(m_inputs.m_eta_fan) && m_inputs.m_N_nodes_pass > 0)
{
m_outputs.mc_air_cooler.design_hx(s_air_cooler_des_par_ind, s_air_cooler_des_par_dep, m_inputs.m_des_tol);
try
{
m_outputs.mc_air_cooler.design_hx(s_air_cooler_des_par_ind, s_air_cooler_des_par_dep, m_inputs.m_des_tol);
}
catch (...)
{
m_outputs.m_error_code = C_sco2_cycle_core::E_cycle_error_msg::E_AIR_COOLER_CONVERGENCE;
return m_outputs.m_error_code;
}

}
}

Expand Down

0 comments on commit 046cbe8

Please sign in to comment.