Skip to content

Commit

Permalink
Update tidal turbine powercurve ssc equation with capacity factor
Browse files Browse the repository at this point in the history
  • Loading branch information
mjprilliman committed Apr 4, 2024
1 parent af06594 commit f275d80
Showing 1 changed file with 22 additions and 3 deletions.
25 changes: 22 additions & 3 deletions ssc/cmod_mhk_eqns.cpp
Expand Up @@ -97,7 +97,10 @@ bool tidal_turbine_calculate_powercurve(ssc_data_t data)
}

double rotor_diameter, cut_in,
cut_out, rotor_area, generator_rated_capacity, number_rotors = 0;
cut_out, rotor_area, number_rotors = 0;
double target_cf = 0;
double rated_power_rotor = 0;
double generator_rated_capacity = 0;
util::matrix_t<double> tidal_resource;
std::vector<double> pto_efficiency;
std::vector<double> max_cp;
Expand All @@ -110,7 +113,8 @@ bool tidal_turbine_calculate_powercurve(ssc_data_t data)
vt_get_number(vt, "cut_in", &cut_in);
vt_get_number(vt, "cut_out", &cut_out);
vt_get_matrix(vt, "tidal_resource", tidal_resource);
vt_get_number(vt, "generator_rated_capacity", &generator_rated_capacity);
//vt_get_number(vt, "generator_rated_capacity", &generator_rated_capacity);
vt_get_number(vt, "tidal_turbine_target_cf", &target_cf);

}
catch (std::runtime_error& e) {
Expand All @@ -120,6 +124,7 @@ bool tidal_turbine_calculate_powercurve(ssc_data_t data)

util::matrix_t<ssc_number_t> powercurve_tidespeeds;
util::matrix_t<ssc_number_t> powercurve_powerout;
util::matrix_t<ssc_number_t> powercurve_powerout_rated;
util::matrix_t<ssc_number_t> powercurve_hub_efficiency;

char errmsg[250];
Expand All @@ -129,11 +134,14 @@ bool tidal_turbine_calculate_powercurve(ssc_data_t data)

powercurve_tidespeeds.resize(array_size);
powercurve_powerout.resize(array_size);
powercurve_powerout_rated.resize(array_size);
rotor_area = pow((rotor_diameter / 2), 2) * M_PI * number_rotors;
double tidal_vel, p_fluid, p_rotor, eff, p_electric;
double tidal_freq = 0;
double max_cp_value, pto_eff_value;
for (size_t i = 0; i < array_size; i += 1) {
tidal_vel = tidal_resource.at(i, 0);
tidal_freq = tidal_resource.at(i, 1);
p_fluid = 0.5 * pow(tidal_vel, 3) * 1.025 * rotor_area;

if (max_cp.size() == 1) {
Expand All @@ -152,17 +160,28 @@ bool tidal_turbine_calculate_powercurve(ssc_data_t data)
eff = pto_eff_value / 100.0;
if (tidal_vel < cut_in) eff = 0;
if (tidal_vel > cut_out) eff = 0;
p_electric = std::min(eff * p_rotor, generator_rated_capacity);
p_electric = eff * p_rotor;
powercurve_powerout[i] = p_electric;
generator_rated_capacity += p_electric * tidal_freq;
powercurve_tidespeeds[i] = tidal_vel;

}
generator_rated_capacity = generator_rated_capacity / target_cf;
rated_power_rotor = generator_rated_capacity / number_rotors;
for (size_t i = 0; i < array_size; i++) {
powercurve_powerout_rated[i] = std::min(powercurve_powerout[i], generator_rated_capacity);

}

var_data windspeeds = var_data(powercurve_tidespeeds.data(), powercurve_tidespeeds.ncols());
var_data powerout = var_data(powercurve_powerout.data(), powercurve_powerout.ncols());
var_data powerout_rated = var_data(powercurve_powerout_rated.data(), powercurve_powerout_rated.ncols());

vt->assign("tidal_turbine_powercurve_tidespeeds", windspeeds);
vt->assign("tidal_turbine_powercurve_powerout", powerout);
vt->assign("tidal_turbine_powercurve_powerout_rated", powerout_rated);
vt->assign("tidal_turbine_rated_power", generator_rated_capacity);
vt->assign("tidal_turbine_rated_power_rotor", rated_power_rotor);
sprintf(errmsg, "None");
vt->assign("error", std::string(errmsg));
return true;
Expand Down

0 comments on commit f275d80

Please sign in to comment.