@@ -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