Antares Simulator
Power System Simulator
Loading...
Searching...
No Matches
generator.hxx
1/*
2** Copyright 2007-2024, RTE (https://www.rte-france.com)
3** See AUTHORS.txt
4** SPDX-License-Identifier: MPL-2.0
5** This file is part of Antares-Simulator,
6** Adequacy and Performance assessment for interconnected energy networks.
7**
8** Antares_Simulator is free software: you can redistribute it and/or modify
9** it under the terms of the Mozilla Public Licence 2.0 as published by
10** the Mozilla Foundation, either version 2 of the License, or
11** (at your option) any later version.
12**
13** Antares_Simulator is distributed in the hope that it will be useful,
14** but WITHOUT ANY WARRANTY; without even the implied warranty of
15** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16** Mozilla Public Licence 2.0 for more details.
17**
18** You should have received a copy of the Mozilla Public Licence 2.0
19** along with Antares_Simulator. If not, see <https://opensource.org/license/mpl-2-0/>.
20*/
21#ifndef __ANTARES_SOLVER_timeSeries_GENERATOR_HXX__
22#define __ANTARES_SOLVER_timeSeries_GENERATOR_HXX__
23
24#include <antares/logs/logs.h>
25
26namespace Antares::TSGenerator
27{
28
29// forward declaration
30// Hydro - see hydro.cpp
31bool GenerateHydroTimeSeries(Data::Study& study, uint year, IResultWriter& writer);
32
33template<>
34inline bool GenerateTimeSeries<Data::timeSeriesHydro>(Data::Study& study,
35 uint year,
36 IResultWriter& writer)
37{
38 return GenerateHydroTimeSeries(study, year, writer);
39}
40
41// --- TS Generators using XCast ---
42template<enum Data::TimeSeriesType T>
43bool GenerateTimeSeries(Data::Study& study, uint year, IResultWriter& writer)
44{
45 auto* xcast = reinterpret_cast<XCast::XCast*>(
46 study.cacheTSGenerator[Data::TimeSeriesBitPatternIntoIndex<T>::value]);
47
48 if (not xcast)
49 {
50 logs.debug() << "Preparing the " << Data::TimeSeriesToCStr<T>::Value() << " TS Generator";
51 xcast = new XCast::XCast(study, T, writer);
52 study.cacheTSGenerator[Data::TimeSeriesBitPatternIntoIndex<T>::value] = xcast;
53 }
54
55 // The current year
56 xcast->year = year;
57
58 switch (T)
59 {
60 case Data::timeSeriesLoad:
61 xcast->random = &(study.runtime.random[Data::seedTsGenLoad]);
62 break;
63 case Data::timeSeriesSolar:
64 xcast->random = &(study.runtime.random[Data::seedTsGenSolar]);
65 break;
66 case Data::timeSeriesWind:
67 xcast->random = &(study.runtime.random[Data::seedTsGenWind]);
68 break;
69 case Data::timeSeriesHydro:
70 xcast->random = &(study.runtime.random[Data::seedTsGenHydro]);
71 break;
72 default:
73 xcast->random = nullptr;
74 assert(false and "invalid ts type");
75 }
76
77 // Run the generation of the time-series
78 bool r = xcast->run();
79 // Destroy if required the TS Generator
80 Destroy<T>(study, year);
81 return r;
82}
83
84template<enum Data::TimeSeriesType T>
85void Destroy(Data::Study& study, uint year)
86{
87 auto* xcast = reinterpret_cast<XCast::XCast*>(
88 study.cacheTSGenerator[Data::TimeSeriesBitPatternIntoIndex<T>::value]);
89 if (not xcast)
90 {
91 return;
92 }
93
94 // releasing
95 auto& parameters = study.parameters;
96
97 bool shouldDestroy;
98 switch (T)
99 {
100 case Data::timeSeriesLoad:
101 {
102 shouldDestroy = (parameters.refreshIntervalLoad > parameters.nbYears)
103 || year + parameters.refreshIntervalLoad > parameters.nbYears;
104 break;
105 }
106 case Data::timeSeriesSolar:
107 {
108 shouldDestroy = (parameters.refreshIntervalSolar > parameters.nbYears)
109 || year + parameters.refreshIntervalSolar > parameters.nbYears;
110 break;
111 }
112 case Data::timeSeriesHydro:
113 {
114 shouldDestroy = (parameters.refreshIntervalHydro > parameters.nbYears)
115 || year + parameters.refreshIntervalHydro > parameters.nbYears;
116 break;
117 }
118 case Data::timeSeriesWind:
119 {
120 shouldDestroy = (parameters.refreshIntervalWind > parameters.nbYears)
121 || year + parameters.refreshIntervalWind > parameters.nbYears;
122 break;
123 }
124 case Data::timeSeriesThermal:
125 {
126 shouldDestroy = (parameters.refreshIntervalThermal > parameters.nbYears)
127 || year + parameters.refreshIntervalThermal > parameters.nbYears;
128 break;
129 }
130 default:
131 shouldDestroy = true;
132 }
133
134 if (shouldDestroy)
135 {
136 logs.info() << " Releasing the " << Data::TimeSeriesToCStr<T>::Value() << " TS Generator";
137 study.cacheTSGenerator[Data::TimeSeriesBitPatternIntoIndex<T>::value] = nullptr;
138 study.destroyTSGeneratorData<T>();
139 delete xcast;
140 xcast = nullptr;
141 }
142}
143
144} // namespace Antares::TSGenerator
145
146#endif // __ANTARES_SOLVER_timeSeries_GENERATOR_HXX__