Skip to content

Commit

Permalink
Merge branch 'develop' into marine-cost-curve-updates
Browse files Browse the repository at this point in the history
  • Loading branch information
mjprilliman committed Dec 6, 2024
2 parents 9b9a339 + ac78e40 commit 75fb542
Show file tree
Hide file tree
Showing 3 changed files with 107 additions and 24 deletions.
43 changes: 37 additions & 6 deletions ssc/cmod_fresnel_physical_iph.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,17 @@ static var_info _cm_vtab_fresnel_physical_iph[] = {

// Heat Sink

{SSC_INPUT, SSC_NUMBER, "pb_pump_coef", "Pumping power to move 1kg of HTF through PB loop", "kW/kg", "", "Heat Sink", "*", "", ""},
{ SSC_INPUT, SSC_NUMBER, "pb_pump_coef", "Pumping power to move 1kg of HTF through PB loop", "kW/kg", "", "Heat Sink", "*", "", "" },

{ SSC_INPUT, SSC_NUMBER, "hs_type", "0: ideal model, 1: physical steam model", "", "", "Heat Sink", "?=0", "", "" },
{ SSC_INPUT, SSC_NUMBER, "hs_phys_N_sub", "Number physical heat sink HX nodes", "", "", "Heat Sink", "hs_type=1", "", "" },
{ SSC_INPUT, SSC_NUMBER, "hs_phys_tol", "Physical heat sink solve tolerance", "", "", "Heat Sink", "hs_type=1", "", "" },
{ SSC_INPUT, SSC_NUMBER, "hs_phys_f_mdot_steam_min", "Min steam mdot fraction for physical heat sink", "", "", "Heat Sink", "hs_type=1", "", "" },
{ SSC_INPUT, SSC_NUMBER, "hs_phys_f_mdot_steam_max", "Max steam mdot fraction for physical heat sink", "", "", "Heat Sink", "hs_type=1", "", "" },
{ SSC_INPUT, SSC_NUMBER, "hs_phys_T_steam_cold_des", "Steam inlet temperature for physical heat sink", "C", "", "Heat Sink", "hs_type=1", "", "" },
{ SSC_INPUT, SSC_NUMBER, "hs_phys_P_steam_hot_des", "Steam outlet (and inlet) pressure for physical heat sink", "bar", "", "Heat Sink", "hs_type=1", "", "" },
{ SSC_INPUT, SSC_NUMBER, "hs_phys_Q_steam_hot_des", "Steam outlet quality for physical heat sink", "", "", "Heat Sink", "hs_type=1", "", "" },


// TES

Expand Down Expand Up @@ -911,7 +921,12 @@ class cm_fresnel_physical_iph : public compute_module
}

// Heat Sink
int hs_type = as_integer("hs_type");
C_csp_power_cycle* c_heat_sink_pointer = nullptr;
C_pc_heat_sink c_heat_sink;

// Ideal heat sink
if (hs_type == 0)
{
//size_t n_f_turbine1 = 0;
//ssc_number_t* p_f_turbine1 = as_array("f_turb_tou_periods", &n_f_turbine1); // heat sink, not turbine
Expand Down Expand Up @@ -940,6 +955,17 @@ class cm_fresnel_physical_iph : public compute_module
c_heat_sink.mc_reported_outputs.assign(C_pc_heat_sink::E_M_DOT_HTF, allocate("m_dot_htf_heat_sink", n_steps_fixed), n_steps_fixed);
c_heat_sink.mc_reported_outputs.assign(C_pc_heat_sink::E_T_HTF_IN, allocate("T_heat_sink_in", n_steps_fixed), n_steps_fixed);
c_heat_sink.mc_reported_outputs.assign(C_pc_heat_sink::E_T_HTF_OUT, allocate("T_heat_sink_out", n_steps_fixed), n_steps_fixed);

c_heat_sink_pointer = &c_heat_sink;
}
else
{
throw exec_error("fresnel_physical_iph", "hs_type != 0; other heat sink models are not currently supported");
}

if (c_heat_sink_pointer == nullptr)
{
throw exec_error("fresnel_physical_iph", "Heat sink pointer not assigned");
}

// Electricity pricing schedule
Expand Down Expand Up @@ -1087,7 +1113,7 @@ class cm_fresnel_physical_iph : public compute_module
// Instantiate Solver
C_csp_solver csp_solver(weather_reader,
c_fresnel,
c_heat_sink,
*c_heat_sink_pointer,
storage,
tou,
dispatch,
Expand Down Expand Up @@ -1389,8 +1415,7 @@ class cm_fresnel_physical_iph : public compute_module
// Assign
{
assign("nameplate", nameplate); // [MWt]
assign("W_dot_bop_design", W_dot_bop_design);
assign("W_dot_fixed", W_dot_fixed_parasitic_design);


assign("solar_mult", c_fresnel.m_solar_mult);
assign("nLoops", c_fresnel.m_nLoops);
Expand All @@ -1402,11 +1427,17 @@ class cm_fresnel_physical_iph : public compute_module
}

// System Control
vector<double> bop_vec = as_vector_double("bop_array");
double bop_design = bop_vec[0] * bop_vec[1] * (bop_vec[2] + bop_vec[3] + bop_vec[4]) * q_dot_pc_des;
assign("W_dot_bop_design", bop_design);

vector<double> aux_vec = as_vector_double("aux_array");
double W_dot_cycle_des = 0;
double aux_design = aux_vec[0] * aux_vec[1] * (aux_vec[2] + aux_vec[3] + aux_vec[4]) * W_dot_cycle_des;
double aux_design = aux_vec[0] * aux_vec[1] * (aux_vec[2] + aux_vec[3] + aux_vec[4]) * q_dot_pc_des;
assign("aux_design", aux_design);

double W_dot_fixed = as_double("pb_fixed_par") * q_dot_pc_des;
assign("W_dot_fixed", W_dot_fixed);

std::vector<double> timestep_load_fractions_calc;
std::vector<double> timestep_load_abs_calc;
for (S_timeseries_schedule_data data : offtaker_schedule.mv_timeseries_schedule_data)
Expand Down
59 changes: 43 additions & 16 deletions ssc/cmod_mspt_iph.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -224,6 +224,16 @@ static var_info _cm_vtab_mspt_iph[] = {
// Heat Sink
{ SSC_INPUT, SSC_NUMBER, "pb_pump_coef", "Pumping power to move 1kg of HTF through PB loop", "kW/kg", "", "Heat Sink", "*", "", "" },

{ SSC_INPUT, SSC_NUMBER, "hs_type", "0: ideal model, 1: physical steam model", "", "", "Heat Sink", "?=0", "", "" },
{ SSC_INPUT, SSC_NUMBER, "hs_phys_N_sub", "Number physical heat sink HX nodes", "", "", "Heat Sink", "hs_type=1", "", "" },
{ SSC_INPUT, SSC_NUMBER, "hs_phys_tol", "Physical heat sink solve tolerance", "", "", "Heat Sink", "hs_type=1", "", "" },
{ SSC_INPUT, SSC_NUMBER, "hs_phys_f_mdot_steam_min", "Min steam mdot fraction for physical heat sink", "", "", "Heat Sink", "hs_type=1", "", "" },
{ SSC_INPUT, SSC_NUMBER, "hs_phys_f_mdot_steam_max", "Max steam mdot fraction for physical heat sink", "", "", "Heat Sink", "hs_type=1", "", "" },
{ SSC_INPUT, SSC_NUMBER, "hs_phys_T_steam_cold_des", "Steam inlet temperature for physical heat sink", "C", "", "Heat Sink", "hs_type=1", "", "" },
{ SSC_INPUT, SSC_NUMBER, "hs_phys_P_steam_hot_des", "Steam outlet (and inlet) pressure for physical heat sink", "bar", "", "Heat Sink", "hs_type=1", "", "" },
{ SSC_INPUT, SSC_NUMBER, "hs_phys_Q_steam_hot_des", "Steam outlet quality for physical heat sink", "", "", "Heat Sink", "hs_type=1", "", "" },


// Aux and Balance of Plant
{ SSC_INPUT, SSC_NUMBER, "pb_fixed_par", "Fixed parasitic load - runs at all times", "MWe/MWcap", "", "System Control", "*", "", "" },
{ SSC_INPUT, SSC_NUMBER, "aux_par", "Aux heater, boiler parasitic", "MWe/MWcap", "", "System Control", "*", "", "" },
Expand Down Expand Up @@ -1208,31 +1218,48 @@ class cm_mspt_iph : public compute_module
// ***********************************************
// ***********************************************

int hs_type = as_integer("hs_type");
C_csp_power_cycle* c_heat_sink_pointer = nullptr;
C_pc_heat_sink c_heat_sink;

size_t n_f_turbine1 = 0;
ssc_number_t* p_f_turbine1 = as_array("f_turb_tou_periods", &n_f_turbine1); // heat sink, not turbine
double f_turbine_max1 = 1.0;
for (size_t i = 0; i < n_f_turbine1; i++) {
f_turbine_max1 = max(f_turbine_max1, p_f_turbine1[i]);
}

C_pc_heat_sink c_heat_sink;
c_heat_sink.ms_params.m_T_htf_hot_des = T_htf_hot_des; //[C] FIELD design outlet temperature
c_heat_sink.ms_params.m_T_htf_cold_des = T_htf_cold_des; //[C] FIELD design inlet temperature
c_heat_sink.ms_params.m_q_dot_des = q_dot_pc_des; //[MWt] HEAT SINK design thermal power (could have field solar multiple...)
// 9.18.2016 twn: assume for now there's no pressure drop though heat sink
c_heat_sink.ms_params.m_htf_pump_coef = as_double("pb_pump_coef"); //[kWe/kg/s]
c_heat_sink.ms_params.m_max_frac = f_turbine_max1;
// Ideal heat sink
if (hs_type == 0)
{
c_heat_sink.ms_params.m_T_htf_hot_des = T_htf_hot_des; //[C] FIELD design outlet temperature
c_heat_sink.ms_params.m_T_htf_cold_des = T_htf_cold_des; //[C] FIELD design inlet temperature
c_heat_sink.ms_params.m_q_dot_des = q_dot_pc_des; //[MWt] HEAT SINK design thermal power (could have field solar multiple...)
// 9.18.2016 twn: assume for now there's no pressure drop though heat sink
c_heat_sink.ms_params.m_htf_pump_coef = as_double("pb_pump_coef"); //[kWe/kg/s]
c_heat_sink.ms_params.m_max_frac = f_turbine_max1;

c_heat_sink.ms_params.m_pc_fl = as_integer("rec_htf");
c_heat_sink.ms_params.m_pc_fl_props = as_matrix("field_fl_props");

c_heat_sink.ms_params.m_pc_fl = as_integer("rec_htf");
c_heat_sink.ms_params.m_pc_fl_props = as_matrix("field_fl_props");

// Allocate heat sink outputs
c_heat_sink.mc_reported_outputs.assign(C_pc_heat_sink::E_Q_DOT_HEAT_SINK, allocate("q_dot_to_heat_sink", n_steps_fixed), n_steps_fixed);
c_heat_sink.mc_reported_outputs.assign(C_pc_heat_sink::E_W_DOT_PUMPING, allocate("W_dot_pc_pump", n_steps_fixed), n_steps_fixed);
c_heat_sink.mc_reported_outputs.assign(C_pc_heat_sink::E_M_DOT_HTF, allocate("m_dot_htf_heat_sink", n_steps_fixed), n_steps_fixed);
c_heat_sink.mc_reported_outputs.assign(C_pc_heat_sink::E_T_HTF_IN, allocate("T_heat_sink_in", n_steps_fixed), n_steps_fixed);
c_heat_sink.mc_reported_outputs.assign(C_pc_heat_sink::E_T_HTF_OUT, allocate("T_heat_sink_out", n_steps_fixed), n_steps_fixed);

// Allocate heat sink outputs
c_heat_sink.mc_reported_outputs.assign(C_pc_heat_sink::E_Q_DOT_HEAT_SINK, allocate("q_dot_to_heat_sink", n_steps_fixed), n_steps_fixed);
c_heat_sink.mc_reported_outputs.assign(C_pc_heat_sink::E_W_DOT_PUMPING, allocate("W_dot_pc_pump", n_steps_fixed), n_steps_fixed);
c_heat_sink.mc_reported_outputs.assign(C_pc_heat_sink::E_M_DOT_HTF, allocate("m_dot_htf_heat_sink", n_steps_fixed), n_steps_fixed);
c_heat_sink.mc_reported_outputs.assign(C_pc_heat_sink::E_T_HTF_IN, allocate("T_heat_sink_in", n_steps_fixed), n_steps_fixed);
c_heat_sink.mc_reported_outputs.assign(C_pc_heat_sink::E_T_HTF_OUT, allocate("T_heat_sink_out", n_steps_fixed), n_steps_fixed);
c_heat_sink_pointer = &c_heat_sink;
}
else
{
throw exec_error("mspt_iph", "hs_type != 0; other heat sink models are not currently supported");
}
if (c_heat_sink_pointer == nullptr)
{
throw exec_error("mspt_iph", "Heat sink pointer not assigned");
}

//// *********************************************************
//// *********************************************************
Expand Down Expand Up @@ -1741,7 +1768,7 @@ class cm_mspt_iph : public compute_module
// Instantiate Solver
C_csp_solver csp_solver(weather_reader,
collector_receiver,
c_heat_sink,
*c_heat_sink_pointer,
storage,
tou,
dispatch,
Expand Down
29 changes: 27 additions & 2 deletions ssc/cmod_trough_physical_iph.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,16 @@ static var_info _cm_vtab_trough_physical_iph[] = {
{ SSC_INPUT, SSC_NUMBER, "p_start", "Collector startup energy, per SCA", "kWhe", "", "solar_field", "*", "", "" },

// Heat Sink
{ SSC_INPUT, SSC_NUMBER, "pb_pump_coef", "Pumping power to move 1kg of HTF through PB loop", "kW/kg", "", "Heat Sink", "*", "", "" },
{ SSC_INPUT, SSC_NUMBER, "pb_pump_coef", "Pumping power to move 1kg of HTF through PB loop", "kW/kg", "", "Heat Sink", "*", "", "" },

{ SSC_INPUT, SSC_NUMBER, "hs_type", "0: ideal model, 1: physical steam model", "", "", "Heat Sink", "?=0", "", "" },
{ SSC_INPUT, SSC_NUMBER, "hs_phys_N_sub", "Number physical heat sink HX nodes", "", "", "Heat Sink", "hs_type=1", "", "" },
{ SSC_INPUT, SSC_NUMBER, "hs_phys_tol", "Physical heat sink solve tolerance", "", "", "Heat Sink", "hs_type=1", "", "" },
{ SSC_INPUT, SSC_NUMBER, "hs_phys_f_mdot_steam_min", "Min steam mdot fraction for physical heat sink", "", "", "Heat Sink", "hs_type=1", "", "" },
{ SSC_INPUT, SSC_NUMBER, "hs_phys_f_mdot_steam_max", "Max steam mdot fraction for physical heat sink", "", "", "Heat Sink", "hs_type=1", "", "" },
{ SSC_INPUT, SSC_NUMBER, "hs_phys_T_steam_cold_des", "Steam inlet temperature for physical heat sink", "C", "", "Heat Sink", "hs_type=1", "", "" },
{ SSC_INPUT, SSC_NUMBER, "hs_phys_P_steam_hot_des", "Steam outlet (and inlet) pressure for physical heat sink", "bar", "", "Heat Sink", "hs_type=1", "", "" },
{ SSC_INPUT, SSC_NUMBER, "hs_phys_Q_steam_hot_des", "Steam outlet quality for physical heat sink", "", "", "Heat Sink", "hs_type=1", "", "" },

// Parallel heater parameters
{ SSC_INPUT, SSC_NUMBER, "heater_mult", "Heater multiple relative to design cycle thermal power", "-", "", "Parallel Heater", "is_parallel_htr=1", "", "" },
Expand Down Expand Up @@ -1492,7 +1501,12 @@ class cm_trough_physical_iph : public compute_module
}

// Heat Sink
int hs_type = as_integer("hs_type");
C_csp_power_cycle* c_heat_sink_pointer = nullptr;
C_pc_heat_sink c_heat_sink;

// Ideal heat sink
if(hs_type == 0)
{
//size_t n_f_turbine1 = 0;
//ssc_number_t* p_f_turbine1 = as_array("f_turb_tou_periods", &n_f_turbine1); // heat sink, not turbine
Expand Down Expand Up @@ -1522,6 +1536,17 @@ class cm_trough_physical_iph : public compute_module
c_heat_sink.mc_reported_outputs.assign(C_pc_heat_sink::E_M_DOT_HTF, allocate("m_dot_htf_heat_sink", n_steps_fixed), n_steps_fixed);
c_heat_sink.mc_reported_outputs.assign(C_pc_heat_sink::E_T_HTF_IN, allocate("T_heat_sink_in", n_steps_fixed), n_steps_fixed);
c_heat_sink.mc_reported_outputs.assign(C_pc_heat_sink::E_T_HTF_OUT, allocate("T_heat_sink_out", n_steps_fixed), n_steps_fixed);

c_heat_sink_pointer = &c_heat_sink;
}
else
{
throw exec_error("trough_physical_iph", "hs_type != 0; other heat sink models are not currently supported");
}

if (c_heat_sink_pointer == nullptr)
{
throw exec_error("trough_physical_iph", "Heat sink pointer not assigned");
}

// Electricity pricing schedule
Expand Down Expand Up @@ -1665,7 +1690,7 @@ class cm_trough_physical_iph : public compute_module
// Instantiate Solver
C_csp_solver csp_solver(weather_reader,
c_trough,
c_heat_sink,
*c_heat_sink_pointer,
*storage_pointer,
tou,
dispatch,
Expand Down

0 comments on commit 75fb542

Please sign in to comment.