Skip to content

Commit 9bb588c

Browse files
committed
Upgrade ssc to extrapolate timeseries on all of the fun yearly to daily options offered by the widget
1 parent 10edebf commit 9bb588c

File tree

1 file changed

+30
-17
lines changed

1 file changed

+30
-17
lines changed

ssc/cmod_custom_generation.cpp

Lines changed: 30 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3434
#include "lib_windfile.h"
3535
#include "lib_windwatts.h"
3636

37+
#include "lib_time.h"
3738
// for adjustment factors
3839
#include "common.h"
3940

@@ -160,6 +161,7 @@ class cm_custom_generation : public compute_module
160161

161162
size_t idx = 0;
162163
double annual_output = 0;
164+
std::vector<ssc_number_t> extrapolated_current_year_generation;
163165

164166
// Constant generation profile
165167
if (spec_mode == 0)
@@ -184,28 +186,36 @@ class cm_custom_generation : public compute_module
184186
}
185187
else if (spec_mode == 2) {
186188
size_t nrec_gen = 0;
187-
ssc_number_t* enet_in = as_array("energy_output_array", &nrec_gen); // kW
189+
std::vector<ssc_number_t> current_year_gen;
190+
std::vector<ssc_number_t> enet_in = as_vector_double("energy_output_array"); // kW
191+
nrec_gen = enet_in.size();
188192
size_t steps_per_hour_gen = nrec_gen / (8760 * nyears);
189-
190-
if (!enet_in) {
191-
throw exec_error("custom_generation", util::format("energy_output_array variable had no values."));
193+
size_t steps_per_year = 0;
194+
// Set this input up for yearly to daily arrays
195+
if (steps_per_hour_gen < 1) {
196+
steps_per_hour_gen = 1;
192197
}
193198

194-
if (nrec_gen < nrec_load * nyears) {
195-
throw exec_error("custom_generation", util::format("energy_output_array %d must be greater than or equal to load array * analysis period %d", nrec_gen, nrec_load * nyears));
199+
if (enet_in.empty()) {
200+
throw exec_error("custom_generation", util::format("energy_output_array variable had no values."));
196201
}
197202
else {
198-
nlifetime = nrec_gen;
203+
steps_per_year = nrec_gen / (size_t) nyears;
204+
nlifetime = steps_per_hour_gen * 8760 * nyears;
199205
steps_per_hour = steps_per_hour_gen;
200206
ts_hour = 1 / (double)(steps_per_hour);
201207
}
202208

203209
enet = allocate("gen", nlifetime);
204210
for (size_t iyear = 0; iyear < nyears; iyear++) {
211+
current_year_gen.clear();
212+
current_year_gen.reserve(steps_per_year);
213+
current_year_gen.insert(current_year_gen.end(), enet_in.begin() + iyear * steps_per_year, enet_in.begin() + (iyear + 1) * steps_per_year);
214+
extrapolated_current_year_generation = extrapolate_timeseries(current_year_gen, steps_per_hour_gen, derate);
205215
for (size_t ihour = 0; ihour < 8760; ihour++) {
206216
for (size_t ihourstep = 0; ihourstep < steps_per_hour_gen; ihourstep++)
207217
{
208-
enet[idx] = enet_in[idx] * (ssc_number_t)(derate);
218+
enet[idx] = extrapolated_current_year_generation[ihour * steps_per_hour_gen + ihourstep];
209219
idx++;
210220
}
211221
}
@@ -215,28 +225,31 @@ class cm_custom_generation : public compute_module
215225
else
216226
{
217227
size_t nrec_gen = 0;
218-
ssc_number_t *enet_in = as_array("energy_output_array", &nrec_gen); // kW
219-
size_t steps_per_hour_gen = nrec_gen / 8760;
228+
std::vector<ssc_number_t> enet_in = as_vector_double("energy_output_array"); // kW
229+
nrec_gen = enet_in.size();
230+
size_t steps_per_hour_gen = nrec_gen / 8760;
231+
// Set this input up for yearly to daily arrays
232+
if (steps_per_hour_gen < 1) {
233+
steps_per_hour_gen = 1;
234+
}
220235

221-
if (!enet_in) {
236+
if (enet_in.empty()) {
222237
throw exec_error("custom_generation", util::format("energy_output_array variable had no values."));
223238
}
224-
225-
if (nrec_gen < nrec_load) {
226-
throw exec_error("custom_generation", util::format("energy_output_array %d must be greater than or equal to load array %d", nrec_gen, nrec_load));
227-
}
228239
else {
229-
nlifetime = nrec_gen * nyears;
240+
nlifetime = steps_per_hour_gen * 8760 * nyears;
230241
steps_per_hour = steps_per_hour_gen;
231242
ts_hour = 1 / (double)(steps_per_hour);
232243
}
233244

245+
extrapolated_current_year_generation = extrapolate_timeseries(enet_in, steps_per_hour_gen, derate);
246+
234247
enet = allocate("gen", nlifetime);
235248
for (size_t iyear = 0; iyear < nyears; iyear++){
236249
for (size_t ihour = 0; ihour < 8760; ihour++){
237250
for (size_t ihourstep = 0; ihourstep < steps_per_hour_gen; ihourstep++)
238251
{
239-
enet[idx] = enet_in[ihour* steps_per_hour_gen + ihourstep] * (ssc_number_t)(derate)* sys_degradation[iyear];
252+
enet[idx] = extrapolated_current_year_generation[ihour* steps_per_hour_gen + ihourstep] * sys_degradation[iyear];
240253
idx++;
241254
}
242255
}

0 commit comments

Comments
 (0)