Skip to content

Commit

Permalink
added particle lifts
Browse files Browse the repository at this point in the history
  • Loading branch information
qualand committed Aug 11, 2023
1 parent 5a2f615 commit 4aeeb37
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 10 deletions.
16 changes: 9 additions & 7 deletions ssc/cmod_csp_tower_particle.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@ static var_info _cm_vtab_csp_tower_particle[] = {
{ SSC_INPUT, SSC_NUMBER, "rec_su_delay", "Fixed startup delay time for the receiver", "hr", "", "Tower and Receiver", "*", "", ""},
{ SSC_INPUT, SSC_NUMBER, "rec_qf_delay", "Energy-based receiver startup delay (fraction of rated thermal power)", "", "", "Tower and Receiver", "*", "", ""},
{ SSC_INPUT, SSC_NUMBER, "csp.pt.rec.max_oper_frac", "Maximum receiver mass flow rate fraction", "", "", "Tower and Receiver", "*", "", ""},
{ SSC_INPUT, SSC_NUMBER, "eta_pump", "Receiver HTF pump efficiency", "", "", "Tower and Receiver", "*", "", ""},
{ SSC_INPUT, SSC_NUMBER, "eta_lift", "Receiver particle lift efficiency", "", "", "Tower and Receiver", "*", "", ""},
{ SSC_INPUT, SSC_NUMBER, "piping_length_mult", "Piping length multiplier", "", "", "Tower and Receiver", "*", "", ""},
{ SSC_INPUT, SSC_NUMBER, "piping_length_const", "Piping constant length", "m", "", "Tower and Receiver", "*", "", ""},

Expand Down Expand Up @@ -237,7 +237,7 @@ static var_info _cm_vtab_csp_tower_particle[] = {

// Power Cycle Inputs
{ SSC_INPUT, SSC_NUMBER, "pc_config", "PC configuration 0=Steam Rankine (224), 1=user defined", "", "", "Power Cycle", "?=0", "INTEGER", ""},
{ SSC_INPUT, SSC_NUMBER, "pb_pump_coef", "Pumping power to move 1kg of HTF through PB loop", "kW/kg", "", "Power Cycle", "*", "", ""},
{ SSC_INPUT, SSC_NUMBER, "phx_height", "Height particles travel from Hot TES outlet to the top of the PHX", "m", "", "Power Cycle", "*", "", ""},
{ SSC_INPUT, SSC_NUMBER, "startup_time", "Time needed for power block startup", "hr", "", "Power Cycle", "*", "", ""},
{ SSC_INPUT, SSC_NUMBER, "startup_frac", "Fraction of design thermal power needed for startup", "none", "", "Power Cycle", "*", "", ""},
{ SSC_INPUT, SSC_NUMBER, "cycle_max_frac", "Maximum turbine over design operation fraction", "", "", "Power Cycle", "*", "", ""},
Expand Down Expand Up @@ -539,7 +539,7 @@ static var_info _cm_vtab_csp_tower_particle[] = {
{ SSC_OUTPUT, SSC_ARRAY, "q_piping_losses", "Receiver header/tower piping losses", "MWt", "", "", "sim_type=1", "", ""},
{ SSC_OUTPUT, SSC_ARRAY, "q_thermal_loss", "Receiver convection and emission losses", "MWt", "", "", "sim_type=1", "", ""},
//{ SSC_OUTPUT, SSC_ARRAY, "q_dot_reflection_loss", "Receiver reflection losses", "MWt", "", "", "sim_type=1", "", ""},
{ SSC_OUTPUT, SSC_ARRAY, "P_tower_pump", "Receiver and tower HTF pumping power", "MWe", "", "", "sim_type=1", "", ""},
{ SSC_OUTPUT, SSC_ARRAY, "P_tower_lift", "Receiver and tower particle lift power", "MWe", "", "", "sim_type=1", "", ""},

//{ SSC_OUTPUT, SSC_ARRAY, "T_rec_out_end", "Receiver HTF outlet temperature at end of timestep", "C", "", "CR", "sim_type=1&is_rec_model_trans=1", "", ""},
//{ SSC_OUTPUT, SSC_ARRAY, "T_rec_out_max", "Receiver maximum HTF outlet temperature during timestep", "C", "", "CR", "sim_type=1&is_rec_model_trans=1", "", ""},
Expand Down Expand Up @@ -991,7 +991,9 @@ class cm_csp_tower_particle : public compute_module
pc->m_q_sby_frac = as_double("q_sby_frac");
pc->m_startup_time = as_double("startup_time");
pc->m_startup_frac = as_double("startup_frac");
pc->m_htf_pump_coef = as_double("pb_pump_coef");

// Calculate power block pumping coefficient based on TES and PHX heights
pc->m_htf_pump_coef = ((as_double("h_tank") + as_double("phx_height")) * 9.8067 / as_double("eta_lift")) / 1.e3; // Convert from W/kg/s to kW/kg/s
pc->m_pc_fl = as_integer("rec_htf"); // power cycle HTF is same as receiver HTF
pc->m_pc_fl_props = as_matrix("field_fl_props");

Expand Down Expand Up @@ -1113,7 +1115,7 @@ class cm_csp_tower_particle : public compute_module
as_double("T_htf_hot_des"), as_double("T_htf_cold_des"),
as_double("f_rec_min"), q_dot_rec_des,
as_double("rec_su_delay"), as_double("rec_qf_delay"),
as_double("csp.pt.rec.max_oper_frac"), as_double("eta_pump"),
as_double("csp.pt.rec.max_oper_frac"), as_double("eta_lift"),
as_double("d_tube_out"), as_double("th_tube"),
as_double("piping_loss_coefficient"), as_double("piping_length_const"), as_double("piping_length_mult"),
as_integer("rec_htf"), as_matrix("field_fl_props"),
Expand Down Expand Up @@ -1214,7 +1216,7 @@ class cm_csp_tower_particle : public compute_module
collector_receiver.mc_reported_outputs.assign(C_csp_mspt_collector_receiver::E_Q_DOT_LOSS, allocate("q_thermal_loss", n_steps_fixed), n_steps_fixed);
collector_receiver.mc_reported_outputs.assign(C_csp_mspt_collector_receiver::E_Q_DOT_REFL_LOSS, allocate("q_dot_reflection_loss", n_steps_fixed), n_steps_fixed);
collector_receiver.mc_reported_outputs.assign(C_csp_mspt_collector_receiver::E_W_DOT_TRACKING, allocate("pparasi", n_steps_fixed), n_steps_fixed);
collector_receiver.mc_reported_outputs.assign(C_csp_mspt_collector_receiver::E_W_DOT_PUMP, allocate("P_tower_pump", n_steps_fixed), n_steps_fixed);
collector_receiver.mc_reported_outputs.assign(C_csp_mspt_collector_receiver::E_W_DOT_PUMP, allocate("P_tower_lift", n_steps_fixed), n_steps_fixed);

// Transient model specific outputs
//if (is_rec_model_trans) {
Expand Down Expand Up @@ -1298,7 +1300,7 @@ class cm_csp_tower_particle : public compute_module
as_double("T_htf_cold_des"),
as_double("h_tank_min"),
as_double("tes_init_hot_htf_percent"),
as_double("pb_pump_coef"),
0.0,
as_boolean("tanks_in_parallel"), //[-]
as_double("packed_vol_frac"),
1.85, //[m/s]
Expand Down
9 changes: 6 additions & 3 deletions tcs/csp_solver_falling_particle_receiver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -288,8 +288,8 @@ void C_falling_particle_receiver::call(const C_csp_weatherreader::S_outputs& wea
//double T_particle_prop, cp_particle, q_dot_inc_pre_defocus;
//T_particle_prop = cp_particle = q_dot_inc_pre_defocus = std::numeric_limits<double>::quiet_NaN();

double m_dot_tot, T_particle_hot, eta, T_htf_prop, cp_htf;
m_dot_tot = T_particle_hot = eta = T_htf_prop = cp_htf = std::numeric_limits<double>::quiet_NaN();
double m_dot_tot, T_particle_hot, eta, T_htf_prop, cp_htf, W_lift;
m_dot_tot = T_particle_hot = eta = T_htf_prop = cp_htf = W_lift = std::numeric_limits<double>::quiet_NaN();
double Q_inc, Q_refl, Q_adv, Q_rad, Q_transport, Q_thermal, Q_inc_pre_defocus;
Q_inc = Q_refl = Q_adv = Q_rad = Q_transport = Q_thermal = Q_inc_pre_defocus = std::numeric_limits<double>::quiet_NaN();
double q_thermal_steadystate, q_thermal_csky;
Expand Down Expand Up @@ -637,9 +637,12 @@ void C_falling_particle_receiver::call(const C_csp_weatherreader::S_outputs& wea
od_control = 1.0; //[-]
}

// Particle lift power
W_lift = m_dot_tot * (m_h_tower + m_curtain_height) * 9.8067 / m_eta_pump;

outputs.m_m_dot_salt_tot = m_dot_tot * 3600.0; //[kg/hr] convert from kg/s
outputs.m_eta_therm = eta; //[-] RECEIVER thermal efficiency (includes radiation and convective losses. reflection losses are contained in receiver flux model)
outputs.m_W_dot_pump = 0.0; //[MW] convert from W
outputs.m_W_dot_pump = W_lift / 1.E6; //[MW] convert from W
outputs.m_q_conv_sum = Q_adv / 1.E6; //[MW] convert from W
outputs.m_q_rad_sum = Q_rad / 1.E6; //[MW] convert from W
outputs.m_q_dot_refl_loss = Q_refl / 1.E6;
Expand Down

0 comments on commit 4aeeb37

Please sign in to comment.