Skip to content

Adding updated BdewStandardLoadProfiles. #1312

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 8 commits into
base: dev
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased/Snapshot]

### Added
- Added updated `BdewStandardLoadProfiles` [#1292](https://github.com/ie3-institute/PowerSystemDataModel/issues/1292)

### Fixed
- Fixed handling of `CongestionResult.InputModelType` in `EntityProcessor` [#1325](https://github.com/ie3-institute/PowerSystemDataModel/issues/1325)
- -Fixed em fields in input models [#1331](https://github.com/ie3-institute/PowerSystemDataModel/issues/1331)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@
import edu.ie3.datamodel.models.timeseries.repetitive.BdewLoadProfileTimeSeries;
import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry;
import edu.ie3.datamodel.models.value.load.BdewLoadValues;
import edu.ie3.datamodel.models.value.load.BdewLoadValues.BDEW1999;
import edu.ie3.datamodel.models.value.load.BdewLoadValues.BDEW2025;
import edu.ie3.util.quantities.PowerSystemUnits;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Stream;
Expand All @@ -25,6 +28,7 @@

public class BdewLoadProfileFactory
extends LoadProfileFactory<BdewStandardLoadProfile, BdewLoadValues> {
// 1999 profile scheme
public static final String SUMMER_SATURDAY = "SuSa";
public static final String SUMMER_SUNDAY = "SuSu";
public static final String SUMMER_WEEKDAY = "SuWd";
Expand All @@ -35,6 +39,44 @@ public class BdewLoadProfileFactory
public static final String WINTER_SUNDAY = "WiSu";
public static final String WINTER_WEEKDAY = "WiWd";

// 2025 profile scheme
public static final String JANUARY_SATURDAY = "JanSa";
public static final String JANUARY_SUNDAY = "JanSu";
public static final String JANUARY_WEEKDAY = "JanWd";
public static final String FEBRUARY_SATURDAY = "FebSa";
public static final String FEBRUARY_SUNDAY = "FebSu";
public static final String FEBRUARY_WEEKDAY = "FebWd";
public static final String MARCH_SATURDAY = "MarSa";
public static final String MARCH_SUNDAY = "MarSu";
public static final String MARCH_WEEKDAY = "MarWd";
public static final String APRIL_SATURDAY = "AprSa";
public static final String APRIL_SUNDAY = "AprSu";
public static final String APRIL_WEEKDAY = "AprWd";
public static final String MAY_SATURDAY = "MaySa";
public static final String MAY_SUNDAY = "MaySu";
public static final String MAY_WEEKDAY = "MayWd";
public static final String JUNE_SATURDAY = "JunSa";
public static final String JUNE_SUNDAY = "JunSu";
public static final String JUNE_WEEKDAY = "JunWd";
public static final String JULY_SATURDAY = "JulSa";
public static final String JULY_SUNDAY = "JulSu";
public static final String JULY_WEEKDAY = "JulWd";
public static final String AUGUST_SATURDAY = "AugSa";
public static final String AUGUST_SUNDAY = "AugSu";
public static final String AUGUST_WEEKDAY = "AugWd";
public static final String SEPTEMBER_SATURDAY = "SepSa";
public static final String SEPTEMBER_SUNDAY = "SepSu";
public static final String SEPTEMBER_WEEKDAY = "SepWd";
public static final String OCTOBER_SATURDAY = "OctSa";
public static final String OCTOBER_SUNDAY = "OctSu";
public static final String OCTOBER_WEEKDAY = "OctWd";
public static final String NOVEMBER_SATURDAY = "NovSa";
public static final String NOVEMBER_SUNDAY = "NovSu";
public static final String NOVEMBER_WEEKDAY = "NovWd";
public static final String DECEMBER_SATURDAY = "DecSa";
public static final String DECEMBER_SUNDAY = "DecSu";
public static final String DECEMBER_WEEKDAY = "DecWd";

public BdewLoadProfileFactory() {
this(BdewLoadValues.class);
}
Expand All @@ -47,18 +89,64 @@ public BdewLoadProfileFactory(Class<BdewLoadValues> valueClass) {
protected LoadProfileEntry<BdewLoadValues> buildModel(LoadProfileData<BdewLoadValues> data) {
int quarterHour = data.getInt(QUARTER_HOUR);

return new LoadProfileEntry<>(
new BdewLoadValues(
data.getDouble(SUMMER_SATURDAY),
data.getDouble(SUMMER_SUNDAY),
data.getDouble(SUMMER_WEEKDAY),
data.getDouble(TRANSITION_SATURDAY),
data.getDouble(TRANSITION_SUNDAY),
data.getDouble(TRANSITION_WEEKDAY),
data.getDouble(WINTER_SATURDAY),
data.getDouble(WINTER_SUNDAY),
data.getDouble(WINTER_WEEKDAY)),
quarterHour);
boolean is1999Scheme = data.containsKey(SUMMER_SATURDAY);

BdewLoadValues values;

if (is1999Scheme) {
values =
new BDEW1999(
data.getDouble(SUMMER_SATURDAY),
data.getDouble(SUMMER_SUNDAY),
data.getDouble(SUMMER_WEEKDAY),
data.getDouble(TRANSITION_SATURDAY),
data.getDouble(TRANSITION_SUNDAY),
data.getDouble(TRANSITION_WEEKDAY),
data.getDouble(WINTER_SATURDAY),
data.getDouble(WINTER_SUNDAY),
data.getDouble(WINTER_WEEKDAY));
} else {
values =
new BDEW2025(
data.getDouble(JANUARY_SATURDAY),
data.getDouble(JANUARY_SUNDAY),
data.getDouble(JANUARY_WEEKDAY),
data.getDouble(FEBRUARY_SATURDAY),
data.getDouble(FEBRUARY_SUNDAY),
data.getDouble(FEBRUARY_WEEKDAY),
data.getDouble(MARCH_SATURDAY),
data.getDouble(MARCH_SUNDAY),
data.getDouble(MARCH_WEEKDAY),
data.getDouble(APRIL_SATURDAY),
data.getDouble(APRIL_SUNDAY),
data.getDouble(APRIL_WEEKDAY),
data.getDouble(MAY_SATURDAY),
data.getDouble(MAY_SUNDAY),
data.getDouble(MAY_WEEKDAY),
data.getDouble(JUNE_SATURDAY),
data.getDouble(JUNE_SUNDAY),
data.getDouble(JUNE_WEEKDAY),
data.getDouble(JULY_SATURDAY),
data.getDouble(JULY_SUNDAY),
data.getDouble(JULY_WEEKDAY),
data.getDouble(AUGUST_SATURDAY),
data.getDouble(AUGUST_SUNDAY),
data.getDouble(AUGUST_WEEKDAY),
data.getDouble(SEPTEMBER_SATURDAY),
data.getDouble(SEPTEMBER_SUNDAY),
data.getDouble(SEPTEMBER_WEEKDAY),
data.getDouble(OCTOBER_SATURDAY),
data.getDouble(OCTOBER_SUNDAY),
data.getDouble(OCTOBER_WEEKDAY),
data.getDouble(NOVEMBER_SATURDAY),
data.getDouble(NOVEMBER_SUNDAY),
data.getDouble(NOVEMBER_WEEKDAY),
data.getDouble(DECEMBER_SATURDAY),
data.getDouble(DECEMBER_SUNDAY),
data.getDouble(DECEMBER_WEEKDAY));
}

return new LoadProfileEntry<>(values, quarterHour);
}

@Override
Expand All @@ -74,7 +162,46 @@ protected List<Set<String>> getFields(Class<?> entityClass) {
TRANSITION_WEEKDAY,
WINTER_SATURDAY,
WINTER_SUNDAY,
WINTER_WEEKDAY));
WINTER_WEEKDAY),
newSet(
JANUARY_SATURDAY,
JANUARY_SUNDAY,
JANUARY_WEEKDAY,
FEBRUARY_SATURDAY,
FEBRUARY_SUNDAY,
FEBRUARY_WEEKDAY,
MARCH_SATURDAY,
MARCH_SUNDAY,
MARCH_WEEKDAY,
APRIL_SATURDAY,
APRIL_SUNDAY,
APRIL_WEEKDAY,
MAY_SATURDAY,
MAY_SUNDAY,
MAY_WEEKDAY,
JUNE_SATURDAY,
JUNE_SUNDAY,
JUNE_WEEKDAY,
JULY_SATURDAY,
JULY_SUNDAY,
JULY_WEEKDAY,
AUGUST_SATURDAY,
AUGUST_SUNDAY,
AUGUST_WEEKDAY,
SEPTEMBER_SATURDAY,
SEPTEMBER_SUNDAY,
SEPTEMBER_WEEKDAY,
OCTOBER_SATURDAY,
OCTOBER_SUNDAY,
OCTOBER_SUNDAY,
OCTOBER_WEEKDAY,
NOVEMBER_SATURDAY,
NOVEMBER_SUNDAY,
NOVEMBER_WEEKDAY,
DECEMBER_SATURDAY,
DECEMBER_SUNDAY,
DECEMBER_WEEKDAY,
QUARTER_HOUR));
}

@Override
Expand Down Expand Up @@ -106,12 +233,9 @@ public ComparableQuantity<Power> calculateMaxPower(
if (loadProfile == BdewStandardLoadProfile.H0) {
// maximum dynamization factor is on day 366 (leap year) or day 365 (regular year).
// The difference between day 365 and day 366 is negligible, thus pick 366
valueExtractor =
v ->
Stream.of(v.getWiSa(), v.getWiSu(), v.getWiWd())
.map(p -> BdewLoadValues.dynamization(p, 366));
valueExtractor = v -> v.lastDayOfYearValues().map(p -> BdewLoadValues.dynamization(p, 366));
} else {
valueExtractor = v -> v.values().stream();
valueExtractor = BdewLoadValues::values;
}

double maxPower =
Expand All @@ -123,4 +247,16 @@ public ComparableQuantity<Power> calculateMaxPower(

return Quantities.getQuantity(maxPower, WATT);
}

/** Returns the load profile energy scaling. The default value is 1000 kWh */
public ComparableQuantity<Energy> getLoadProfileEnergyScaling(
BdewStandardLoadProfile loadProfile) {

// the updated profiled are scaled to 1 million kWh -> 1000 MWh
// old profiles are scaled to 1000 kWh
return switch (loadProfile) {
case H25, G25, L25, P25, S25 -> Quantities.getQuantity(1000d, PowerSystemUnits.MEGAWATTHOUR);
default -> Quantities.getQuantity(1000d, PowerSystemUnits.KILOWATTHOUR);
};
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,13 @@ public class TimeSeriesProcessor<
new TimeSeriesProcessorKey(
IndividualTimeSeries.class, TimeBasedValue.class, HeatAndSValue.class),
new TimeSeriesProcessorKey(
BdewLoadProfileTimeSeries.class, LoadProfileEntry.class, BdewLoadValues.class),
BdewLoadProfileTimeSeries.class,
LoadProfileEntry.class,
BdewLoadValues.BDEW1999.class),
new TimeSeriesProcessorKey(
BdewLoadProfileTimeSeries.class,
LoadProfileEntry.class,
BdewLoadValues.BDEW2025.class),
new TimeSeriesProcessorKey(
RandomLoadProfileTimeSeries.class, LoadProfileEntry.class, RandomLoadValues.class));

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,16 +14,21 @@
*/
public enum BdewStandardLoadProfile implements StandardLoadProfile {
H0("h0"), // Households
H25("h25"), // household (Updated 2025)
L0("l0"), // Agricultural enterprises without further differentiation
L1("l1"), // Agricultural enterprises with dairy sector
L2("l2"), // Agricultural enterprises without dairy sector
L25("l25"), // Agricultural enterprises without further differentiation (Updated 2025)
G0("g0"), // Businesses without further differentiation
G1("g1"), // Workday businesses from 8 a.m. to 6 p.m.
G2("g2"), // Businesses with high consumption in evening hours
G3("g3"), // Businesses with enduring consumption
G4("g4"), // Vendor or barber shop
G5("g5"), // Bakery
G6("g6"); // Business with main consumption on weekends
G6("g6"), // Business with main consumption on weekends
G25("g25"), // Businesses without further differentiation (Updated 2025)
P25("p25"), // PV profile
S25("s25"); // Combined PV and storage profile

private final String key;

Expand Down
Loading