Skip to content

Commit d8bec21

Browse files
committed
Merge branch 'dev' into ms/#1106-transfer-LoadProfile-parsing-code-from-SIMONA
# Conflicts: # CHANGELOG.md
2 parents d02ea97 + feee56c commit d8bec21

File tree

3 files changed

+351
-1
lines changed

3 files changed

+351
-1
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1818
- Attribute `pThermalRated` for `ThermalStorage`s [#679](https://github.com/ie3-institute/PowerSystemDataModel/issues/679)
1919
- Attributes `housingType` and `numberInhabitants` for `ThermalHouse`s [#1253](https://github.com/ie3-institute/PowerSystemDataModel/issues/1253)
2020
- Added domestic hot water storage model [#1257](https://github.com/ie3-institute/PowerSystemDataModel/issues/1257)
21+
- Validation for BDEW load profile values [#1243](https://github.com/ie3-institute/PowerSystemDataModel/issues/1243)
2122
- Added load profiles sources [#1106](https://github.com/ie3-institute/PowerSystemDataModel/issues/1106)
2223

2324
### Fixed

src/main/resources/load/lpts_g5.csv

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ SuSa,SuSu,SuWd,TrSa,TrSu,TrWd,WiSa,WiSu,WiWd,quarterHour
3838
146.4,55.4,208.1,151.7,51.6,211.3,159.5,54.6,230.0,36
3939
137.7,55.7,205.8,145.9,53.5,210.5,155.5,55.4,228.1,37
4040
131.7,56.7,202.6,142.2,55.8,209.1,153.4,56.7,225.4,38
41-
128.0,58.4,198.5,13.09,58.4,206.5,151.1,58.4,221.7,39
41+
128.0,58.4,198.5,139.0,58.4,206.5,151.1,58.4,221.7,39
4242
126.0,61.2,193.4,135.1,61.1,202.2,147.0,60.4,216.4,40
4343
125.3,64.5,187.8,130.6,63.7,196.5,141.5,62.5,210.2,41
4444
125.2,68.1,182.3,126.0,66.2,190.3,135.6,64.6,203.7,42
Lines changed: 349 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,349 @@
1+
/*
2+
* © 2025. TU Dortmund University,
3+
* Institute of Energy Systems, Energy Efficiency and Energy Economics,
4+
* Research group Distribution grid planning and operation
5+
*/
6+
package edu.ie3.resources.load
7+
8+
import edu.ie3.datamodel.io.factory.timeseries.BdewLoadProfileFactory
9+
import edu.ie3.datamodel.io.factory.timeseries.LoadProfileData
10+
import edu.ie3.datamodel.io.naming.FileNamingStrategy
11+
import edu.ie3.datamodel.io.source.csv.CsvDataSource
12+
import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile
13+
import edu.ie3.datamodel.models.value.load.BdewLoadValues
14+
import spock.lang.Shared
15+
import spock.lang.Specification
16+
17+
import java.nio.file.Path
18+
import java.util.function.Function
19+
20+
class BdewLoadProfileTest extends Specification {
21+
22+
@Shared
23+
private CsvDataSource source
24+
25+
@Shared
26+
private BdewLoadProfileFactory factory = new BdewLoadProfileFactory()
27+
28+
@Shared
29+
private List<String> keys = ['su', 'tr', 'wi']
30+
31+
@Shared
32+
private Map results = [:]
33+
34+
def setupSpec() {
35+
Path resourcePath = Path.of(".", "src", "main", "resources", "load")
36+
source = new CsvDataSource(",", resourcePath, new FileNamingStrategy())
37+
}
38+
39+
def "The BDEW profile G0 should be correct"() {
40+
given:
41+
def data = read(BdewStandardLoadProfile.G0)
42+
43+
when:
44+
keys.each {
45+
key ->
46+
results["${key}Sa"] = sumValues(data, v -> v."${key}Sa")
47+
results["${key}Su"] = sumValues(data, v -> v."${key}Su")
48+
results["${key}Wd"] = sumValues(data, v -> v."${key}Wd")
49+
}
50+
51+
then:
52+
results["suSa"] == 9994.0
53+
results["suSu"] == 6187.2
54+
results["suWd"] == 11784.4
55+
56+
results["trSa"] == 10434.2
57+
results["trSu"] == 6293.7
58+
results["trWd"] == 12239.9
59+
60+
results["wiSa"] == 10693.2
61+
results["wiSu"] == 6227.4
62+
results["wiWd"] == 12827.2
63+
}
64+
65+
def "The BDEW profile G1 should be correct"() {
66+
given:
67+
def data = read(BdewStandardLoadProfile.G1)
68+
69+
when:
70+
keys.each {
71+
key ->
72+
results["${key}Sa"] = sumValues(data, v -> v."${key}Sa")
73+
results["${key}Su"] = sumValues(data, v -> v."${key}Su")
74+
results["${key}Wd"] = sumValues(data, v -> v."${key}Wd")
75+
}
76+
77+
then:
78+
results["suSa"] == 2613.7
79+
results["suSu"] == 2127.5
80+
results["suWd"] == 12499.4
81+
82+
results["trSa"] == 3048.3
83+
results["trSu"] == 1955.6
84+
results["trWd"] == 14523.8
85+
86+
results["wiSa"] == 3294.2
87+
results["wiSu"] == 2808.7
88+
results["wiWd"] == 17431.7
89+
}
90+
91+
def "The BDEW profile G2 should be correct"() {
92+
given:
93+
def data = read(BdewStandardLoadProfile.G2)
94+
95+
when:
96+
keys.each {
97+
key ->
98+
results["${key}Sa"] = sumValues(data, v -> v."${key}Sa")
99+
results["${key}Su"] = sumValues(data, v -> v."${key}Su")
100+
results["${key}Wd"] = sumValues(data, v -> v."${key}Wd")
101+
}
102+
103+
then:
104+
results["suSa"] == 9221.1
105+
results["suSu"] == 7924.7
106+
results["suWd"] == 9954.1
107+
108+
results["trSa"] == 10706.3
109+
results["trSu"] == 8897.2
110+
results["trWd"] == 11272.5
111+
112+
results["wiSa"] == 12456
113+
results["wiSu"] == 10596.0
114+
results["wiWd"] == 12837.4
115+
}
116+
117+
def "The BDEW profile G3 should be correct"() {
118+
given:
119+
def data = read(BdewStandardLoadProfile.G3)
120+
121+
when:
122+
keys.each {
123+
key ->
124+
results["${key}Sa"] = sumValues(data, v -> v."${key}Sa")
125+
results["${key}Su"] = sumValues(data, v -> v."${key}Su")
126+
results["${key}Wd"] = sumValues(data, v -> v."${key}Wd")
127+
}
128+
129+
then:
130+
results["suSa"] == 10834.0
131+
results["suSu"] == 9656.0
132+
results["suWd"] == 11544.3
133+
134+
results["trSa"] == 10544.1
135+
results["trSu"] == 9160.9
136+
results["trWd"] == 10978.1
137+
138+
results["wiSa"] == 10645.9
139+
results["wiSu"] == 9216.2
140+
results["wiWd"] == 11679.7
141+
}
142+
143+
def "The BDEW profile G4 should be correct"() {
144+
given:
145+
def data = read(BdewStandardLoadProfile.G4)
146+
147+
when:
148+
keys.each {
149+
key ->
150+
results["${key}Sa"] = sumValues(data, v -> v."${key}Sa")
151+
results["${key}Su"] = sumValues(data, v -> v."${key}Su")
152+
results["${key}Wd"] = sumValues(data, v -> v."${key}Wd")
153+
}
154+
155+
then:
156+
results["suSa"] == 10513.0
157+
results["suSu"] == 6640.3
158+
results["suWd"] == 11968.2
159+
160+
results["trSa"] == 10120.5
161+
results["trSu"] == 6166.7
162+
results["trWd"] == 11947
163+
164+
results["wiSa"] == 10733.4
165+
results["wiSu"] == 6202.3
166+
results["wiWd"] == 12749.4
167+
}
168+
169+
def "The BDEW profile G5 should be correct"() {
170+
given:
171+
def data = read(BdewStandardLoadProfile.G5)
172+
173+
when:
174+
keys.each {
175+
key ->
176+
results["${key}Sa"] = sumValues(data, v -> v."${key}Sa")
177+
results["${key}Su"] = sumValues(data, v -> v."${key}Su")
178+
results["${key}Wd"] = sumValues(data, v -> v."${key}Wd")
179+
}
180+
181+
then:
182+
results["suSa"] == 12107.1
183+
results["suSu"] == 5401.0
184+
results["suWd"] == 12042.8
185+
186+
results["trSa"] == 11861.1
187+
results["trSu"] == 5111.0
188+
results["trWd"] == 11969.3
189+
190+
results["wiSa"] == 12337.1
191+
results["wiSu"] == 5165.2
192+
results["wiWd"] == 12477.4
193+
}
194+
195+
def "The BDEW profile G6 should be correct"() {
196+
given:
197+
def data = read(BdewStandardLoadProfile.G6)
198+
199+
when:
200+
keys.each {
201+
key ->
202+
results["${key}Sa"] = sumValues(data, v -> v."${key}Sa")
203+
results["${key}Su"] = sumValues(data, v -> v."${key}Su")
204+
results["${key}Wd"] = sumValues(data, v -> v."${key}Wd")
205+
}
206+
207+
then:
208+
results["suSa"] == 11793.6
209+
results["suSu"] == 12017.4
210+
results["suWd"] == 9053.4
211+
212+
results["trSa"] == 12718.5
213+
results["trSu"] == 13591.8
214+
results["trWd"] == 10111.4
215+
216+
results["wiSa"] == 13647.2
217+
results["wiSu"] == 13741.2
218+
results["wiWd"] == 10748.5
219+
}
220+
221+
def "The BDEW profile H0 should be correct"() {
222+
given:
223+
def data = read(BdewStandardLoadProfile.H0)
224+
225+
when:
226+
keys.each {
227+
key ->
228+
results["${key}Sa"] = sumValues(data, v -> v."${key}Sa")
229+
results["${key}Su"] = sumValues(data, v -> v."${key}Su")
230+
results["${key}Wd"] = sumValues(data, v -> v."${key}Wd")
231+
}
232+
233+
then:
234+
results["suSa"] == 12132.0
235+
results["suSu"] == 11416.0
236+
results["suWd"] == 11255.9
237+
238+
results["trSa"] == 12054.9
239+
results["trSu"] == 11079.4
240+
results["trWd"] == 10783.3
241+
242+
results["wiSa"] == 11546.0
243+
results["wiSu"] == 10742.0
244+
results["wiWd"] == 10223.7
245+
}
246+
247+
def "The BDEW dynamization function for the profile H0 should work as expected"() {
248+
when:
249+
def dynamizedValue = BdewLoadValues.dynamization(value, dayOfTheYear)
250+
251+
then:
252+
dynamizedValue == expectedValue
253+
254+
where:
255+
dayOfTheYear | value | expectedValue
256+
153 | 89.8d | 76.3d // suSa, time: 00:15
257+
262 | 47.9d | 42.1d // trWd, time: 01:45
258+
343 | 146.8d | 174.5d // wiSu, time: 18:15
259+
}
260+
261+
def "The BDEW profile L0 should be correct"() {
262+
given:
263+
def data = read(BdewStandardLoadProfile.L0)
264+
265+
when:
266+
keys.each {
267+
key ->
268+
results["${key}Sa"] = sumValues(data, v -> v."${key}Sa")
269+
results["${key}Su"] = sumValues(data, v -> v."${key}Su")
270+
results["${key}Wd"] = sumValues(data, v -> v."${key}Wd")
271+
}
272+
273+
then:
274+
results["suSa"] == 9536.1
275+
results["suSu"] == 10243.0
276+
results["suWd"] == 9985.2
277+
278+
results["trSa"] == 10662.1
279+
results["trSu"] == 11012.7
280+
results["trWd"] == 10929.7
281+
282+
results["wiSa"] == 11452.7
283+
results["wiSu"] == 12006.8
284+
results["wiWd"] == 11934.3
285+
}
286+
287+
def "The BDEW profile L1 should be correct"() {
288+
given:
289+
def data = read(BdewStandardLoadProfile.L1)
290+
291+
when:
292+
keys.each {
293+
key ->
294+
results["${key}Sa"] = sumValues(data, v -> v."${key}Sa")
295+
results["${key}Su"] = sumValues(data, v -> v."${key}Su")
296+
results["${key}Wd"] = sumValues(data, v -> v."${key}Wd")
297+
}
298+
299+
then:
300+
results["suSa"] == 9320.5
301+
results["suSu"] == 10011.8
302+
results["suWd"] == 9963.3
303+
304+
results["trSa"] == 10484.5
305+
results["trSu"] == 10913.8
306+
results["trWd"] == 10874.8
307+
308+
results["wiSa"] == 11717.6
309+
results["wiSu"] == 12241.9
310+
results["wiWd"] == 12010.0
311+
}
312+
313+
def "The BDEW profile L2 should be correct"() {
314+
given:
315+
def data = read(BdewStandardLoadProfile.L2)
316+
317+
when:
318+
keys.each {
319+
key ->
320+
results["${key}Sa"] = sumValues(data, v -> v."${key}Sa")
321+
results["${key}Su"] = sumValues(data, v -> v."${key}Su")
322+
results["${key}Wd"] = sumValues(data, v -> v."${key}Wd")
323+
}
324+
325+
then:
326+
results["suSa"] == 9645.7
327+
results["suSu"] == 10408.9
328+
results["suWd"] == 10090.1
329+
330+
results["trSa"] == 10652.4
331+
results["trSu"] == 10980.3
332+
results["trWd"] == 10927.8
333+
334+
results["wiSa"] == 11326.9
335+
results["wiSu"] == 11908.2
336+
results["wiWd"] == 11847.5
337+
}
338+
339+
340+
// helper methods
341+
342+
private List<BdewLoadValues> read(BdewStandardLoadProfile profile) {
343+
source.getSourceData(Path.of("lpts_"+profile.key)).map { it -> factory.buildModel(new LoadProfileData<>(it, BdewLoadValues)).value }.toList()
344+
}
345+
346+
private static double sumValues(List<BdewLoadValues> values, Function<BdewLoadValues, Double> extractor) {
347+
values.stream().map { extractor.apply(it) }.mapToDouble { it.doubleValue() }.sum()
348+
}
349+
}

0 commit comments

Comments
 (0)