Antares Simulator
Power System Simulator
Loading...
Searching...
No Matches
links.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 __SOLVER_VARIABLE_INC_LINK_HXX__
22#define __SOLVER_VARIABLE_INC_LINK_HXX__
23
24#include <antares/study/filter.h>
25#include "antares/solver/variable/endoflist.h" // For UNUSED_VARIABLE, should be somewhere else
26
27namespace Antares
28{
29namespace Solver
30{
31namespace Variable
32{
33
34template<class VariablePerLink>
36{
37 // Do nothing
38}
39
40template<class VariablePerLink>
41inline void Links<VariablePerLink>::initializeFromStudy([[maybe_unused]] Data::Study& study)
42{
43 // Do nothing
44}
45
46template<class VariablePerLink>
47inline void Links<VariablePerLink>::initializeFromAreaLink(Data::Study*, Data::AreaLink*)
48{
49 // Nothing to do here
50}
51
52template<class VariablePerLink>
53inline void Links<VariablePerLink>::initializeFromThermalCluster(Data::Study*,
56{
57 // This method should not be called at this stage
58}
59
60template<class VariablePerLink>
61inline void Links<VariablePerLink>::broadcastNonApplicability(bool applyNonApplicable)
62{
63 for (uint i = 0; i != pLinkCount; ++i)
64 {
65 pLinks[i].broadcastNonApplicability(applyNonApplicable);
66 }
67}
68
69template<class VariablePerLink>
70inline void Links<VariablePerLink>::getPrintStatusFromStudy(Data::Study& study)
71{
72 for (uint i = 0; i != pLinkCount; ++i)
73 {
74 pLinks[i].getPrintStatusFromStudy(study);
75 }
76}
77
78template<class VariablePerLink>
79inline void Links<VariablePerLink>::supplyMaxNumberOfColumns(Data::Study& study)
80{
81 for (uint i = 0; i != pLinkCount; ++i)
82 {
83 pLinks[i].supplyMaxNumberOfColumns(study);
84 }
85}
86
87template<class VariablePerLink>
88inline void Links<VariablePerLink>::yearBegin(uint year, unsigned int numSpace)
89{
90 for (uint i = 0; i != pLinkCount; ++i)
91 {
92 pLinks[i].yearBegin(year, numSpace);
93 }
94}
95
96template<class VariablePerLink>
97inline void Links<VariablePerLink>::yearEndBuildPrepareDataForEachThermalCluster(
98 State& state,
99 uint year,
100 unsigned int numSpace)
101{
102 for (uint i = 0; i != pLinkCount; ++i)
103 {
104 pLinks[i].yearEndBuildPrepareDataForEachThermalCluster(state, year, numSpace);
105 }
106}
107
108template<class VariablePerLink>
109inline void Links<VariablePerLink>::yearEndBuildForEachThermalCluster(State& state,
110 uint year,
111 unsigned int numSpace)
112{
113 for (uint i = 0; i != pLinkCount; ++i)
114 {
115 pLinks[i].yearEndBuildForEachThermalCluster(state, year, numSpace);
116 }
117}
118
119template<class VariablePerLink>
120inline void Links<VariablePerLink>::yearEndBuild(State& state, uint year)
121{
122 for (uint i = 0; i != pLinkCount; ++i)
123 {
124 pLinks[i].yearEndBuild(state, year);
125 }
126}
127
128template<class VariablePerLink>
129inline void Links<VariablePerLink>::yearEnd(uint year, uint numSpace)
130{
131 for (uint i = 0; i != pLinkCount; ++i)
132 {
133 pLinks[i].yearEnd(year, numSpace);
134 }
135}
136
137template<class VariablePerLink>
138inline void Links<VariablePerLink>::computeSummary(
139 std::map<unsigned int, unsigned int>& numSpaceToYear,
140 unsigned int nbYearsForCurrentSummary)
141{
142 for (uint i = 0; i != pLinkCount; ++i)
143 {
144 pLinks[i].computeSummary(numSpaceToYear, nbYearsForCurrentSummary);
145 }
146}
147
148template<class VariablePerLink>
149inline void Links<VariablePerLink>::weekBegin(State& state)
150{
151 for (uint i = 0; i != pLinkCount; ++i)
152 {
153 pLinks[i].weekBegin(state);
154 }
155}
156
157template<class VariablePerLink>
158inline void Links<VariablePerLink>::weekForEachArea(State&, uint numSpace)
159{
160 // do nothing
161 UNUSED_VARIABLE(numSpace);
162}
163
164template<class VariablePerLink>
165inline void Links<VariablePerLink>::weekEnd(State& state)
166{
167 for (uint i = 0; i != pLinkCount; ++i)
168 {
169 pLinks[i].weekEnd(state);
170 }
171}
172
173template<class VariablePerLink>
174inline void Links<VariablePerLink>::hourBegin(uint hourInTheYear)
175{
176 for (uint i = 0; i != pLinkCount; ++i)
177 {
178 pLinks[i].hourBegin(hourInTheYear);
179 }
180}
181
182template<class VariablePerLink>
183inline void Links<VariablePerLink>::hourForEachArea(State& state, unsigned int numSpace)
184{
185 for (uint i = 0; i != pLinkCount; ++i)
186 {
187 pLinks[i].hourForEachArea(state, numSpace);
188 }
189}
190
191template<class VariablePerLink>
192inline void Links<VariablePerLink>::hourForEachLink(State& state, unsigned int numSpace)
193{
194 pLinks[state.link->indexForArea].hourForEachLink(state, numSpace);
195}
196
197template<class VariablePerLink>
198inline void Links<VariablePerLink>::hourEnd(State& state, uint hourInTheYear)
199{
200 for (uint i = 0; i != pLinkCount; ++i)
201 {
202 pLinks[i].hourEnd(state, hourInTheYear);
203 }
204}
205
206template<class VariablePerLink>
207inline void Links<VariablePerLink>::buildSurveyReport(SurveyResults& results,
208 int dataLevel,
209 int fileLevel,
210 int precision) const
211{
212 int count_int = count;
213 bool link_dataLevel = (dataLevel & Category::DataLevel::link);
214 if (count_int && link_dataLevel)
215 {
216 assert(results.data.link != NULL
217 && "The link must not be null to generate a survey report");
218
219 // Build the survey results for the given area
220 auto& link = *results.data.link;
221
222 // Filtering
223 switch (precision)
224 {
225 case Category::hourly:
226 if (!(link.filterSynthesis & Data::filterHourly))
227 {
228 return;
229 }
230 break;
231 case Category::daily:
232 if (!(link.filterSynthesis & Data::filterDaily))
233 {
234 return;
235 }
236 break;
237 case Category::weekly:
238 if (!(link.filterSynthesis & Data::filterWeekly))
239 {
240 return;
241 }
242 break;
243 case Category::monthly:
244 if (!(link.filterSynthesis & Data::filterMonthly))
245 {
246 return;
247 }
248 break;
249 case Category::annual:
250 if (!(link.filterSynthesis & Data::filterAnnual))
251 {
252 return;
253 }
254 break;
255 case Category::all:
256 break;
257 }
258 auto& linkOutputData = pLinks[link.indexForArea];
259 linkOutputData.buildSurveyReport(results, dataLevel, fileLevel, precision);
260 }
261}
262
263template<class VariablePerLink>
264inline void Links<VariablePerLink>::buildAnnualSurveyReport(SurveyResults& results,
265 int dataLevel,
266 int fileLevel,
267 int precision,
268 uint numSpace) const
269{
270 int count_int = count;
271 bool link_dataLevel = (dataLevel & Category::DataLevel::link);
272 if (count_int && link_dataLevel)
273 {
274 assert(results.data.link != NULL
275 && "The link must not be null to generate a survey report");
276
277 auto& link = *results.data.link;
278
279 // Filtering
280 switch (precision)
281 {
282 case Category::hourly:
283 if (not(link.filterYearByYear & Data::filterHourly))
284 {
285 return;
286 }
287 break;
288 case Category::daily:
289 if (not(link.filterYearByYear & Data::filterDaily))
290 {
291 return;
292 }
293 break;
294 case Category::weekly:
295 if (not(link.filterYearByYear & Data::filterWeekly))
296 {
297 return;
298 }
299 break;
300 case Category::monthly:
301 if (not(link.filterYearByYear & Data::filterMonthly))
302 {
303 return;
304 }
305 break;
306 case Category::annual:
307 if (not(link.filterYearByYear & Data::filterAnnual))
308 {
309 return;
310 }
311 break;
312 case Category::all:
313 break;
314 }
315
316 // Build the survey results for the given area
317 auto& linkOutputData = pLinks[results.data.link->indexForArea];
318 linkOutputData.buildAnnualSurveyReport(results, dataLevel, fileLevel, precision, numSpace);
319 }
320}
321
322template<class VariablePerLink>
323template<class I>
324inline void Links<VariablePerLink>::provideInformations(I& infos)
325{
326 // Begining of the node
327 if (VCardType::nodeDepthForGUI)
328 {
329 infos.template beginNode<VCardType>();
330 // Next variable in the list
331 NextType::template provideInformations<I>(infos);
332 // End of the node
333 infos.endNode();
334 }
335 else
336 {
337 // Giving our VCard
338 infos.template addVCard<VCardType>();
339 // Next variable in the list
340 NextType::template provideInformations<I>(infos);
341 }
342}
343
344template<class VariablePerLink>
345template<class PredicateT>
347{
348 NextType::RetrieveVariableList(predicate);
349}
350
351template<class VariablePerLink>
353{
354 // Releasing the memory occupied by the areas
355 delete[] pLinks;
356}
357
358template<class VariablePerLink>
360{
361 // Assert
362 assert(study && "A study pointer must not be null");
363 assert(area && "An area pointer must not be null");
364
365 pLinkCount = (uint)area->links.size();
366 if (pLinkCount)
367 {
368 pLinks = new NextType[pLinkCount];
369
370 // For each link...
371 uint lnkIndex = 0;
372 auto end = area->links.end();
373 for (auto i = area->links.begin(); i != end; ++i, ++lnkIndex)
374 {
375 // Instancing a new set of variables of the area
376 NextType& n = pLinks[lnkIndex];
377
378 // Initialize the variables
379 // From the study
380 n.initializeFromStudy(*study);
381 // From the area
382 n.initializeFromArea(study, area);
383 // From the link
384 n.initializeFromAreaLink(study, i->second);
385 }
386 }
387 else
388 {
389 pLinks = nullptr;
390 }
391}
392
393template<class VariablePerLink>
394void Links<VariablePerLink>::simulationBegin()
395{
396 for (uint i = 0; i != pLinkCount; ++i)
397 {
398 pLinks[i].simulationBegin();
399 }
400}
401
402template<class VariablePerLink>
403void Links<VariablePerLink>::simulationEnd()
404{
405 for (uint i = 0; i != pLinkCount; ++i)
406 {
407 pLinks[i].simulationEnd();
408 }
409}
410
411template<class VariablePerLink>
412void Links<VariablePerLink>::buildDigest(SurveyResults& results,
413 int digestLevel,
414 int dataLevel) const
415{
416 int count_int = count;
417 bool linkDataLevel = dataLevel & Category::DataLevel::link;
418 bool areaDataLevel = dataLevel & Category::DataLevel::area;
419 if (count_int && (linkDataLevel || areaDataLevel))
420 {
421 if (not results.data.area->links.empty())
422 {
423 auto end = results.data.area->links.cend();
424 for (auto i = results.data.area->links.cbegin(); i != end; ++i)
425 {
426 results.data.link = i->second;
427 pLinks[results.data.link->indexForArea].buildDigest(results,
428 digestLevel,
429 Category::DataLevel::link);
430 }
431 }
432 }
433}
434
435template<class VariablePerLink>
436void Links<VariablePerLink>::beforeYearByYearExport(uint year, uint numSpace)
437{
438 for (uint i = 0; i != pLinkCount; ++i)
439 {
440 pLinks[i].beforeYearByYearExport(year, numSpace);
441 }
442}
443
444} // namespace Variable
445} // namespace Solver
446} // namespace Antares
447
448#endif // __SOLVER_VARIABLE_INC_LINK_HXX__
Definition for a single area.
Definition area.h:52
Definition study.h:61
A single thermal cluster.
Definition cluster.h:78
Definition cbuilder.h:120
Definition variable.h:25