Skip to content
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

create new vsc modification #420

Merged
merged 24 commits into from
Mar 7, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
a2dae20
increase coverage , and fix bugs with activePowerControl extension
jamal-khey Jan 4, 2024
856ce0c
Update database changelog and remove unused test method
jamal-khey Jan 30, 2024
0c9dacf
Add author information to DTO and entity classes
jamal-khey Jan 30, 2024
2bda20e
Merge branch 'main' into jamalkhey/vsc-modification
jamal-khey Feb 8, 2024
c79c54e
fix updated interface
jamal-khey Feb 8, 2024
7025679
improve modification of OperatorActivePowerLimit
jamal-khey Feb 12, 2024
f9c31d1
improve logs
jamal-khey Feb 14, 2024
dbf4998
Merge branch 'main' into jamalkhey/vsc-modification
jamal-khey Feb 14, 2024
efddabe
Merge branch 'main' into jamalkhey/vsc-modification
jamal-khey Feb 15, 2024
2ea65ce
Update src/main/java/org/gridsuite/modification/server/dto/DTOUtils.java
YenguiSeddik Feb 15, 2024
87a0dee
take suggestion
jamal-khey Feb 15, 2024
408a6ca
increase coverage
jamal-khey Feb 15, 2024
c82d6cf
fix convertToReactiveCapabilityCurveModificationInfos suggestion
jamal-khey Feb 15, 2024
3e38480
Merge branch 'main' into jamalkhey/vsc-modification
jamal-khey Feb 26, 2024
2e9cf12
Remove unused foreign key constraints
jamal-khey Feb 27, 2024
6ea898d
Refactor reactive limit checks in VscModification , GeneratorModifica…
jamal-khey Feb 27, 2024
61709bb
refactor code to avoid duplication detected by intellij
jamal-khey Mar 1, 2024
edab6dd
Merge branch 'main' into jamalkhey/vsc-modification
jamal-khey Mar 1, 2024
f409c7b
add Copyright
jamal-khey Mar 1, 2024
c8908e6
fix duplicated log
jamal-khey Mar 3, 2024
d3eb7a9
Merge branch 'main' into jamalkhey/vsc-modification
jamal-khey Mar 6, 2024
348c123
increase test coverage, add test for ModifyOperatorActiveRange
jamal-khey Mar 6, 2024
93a8353
fix style
jamal-khey Mar 6, 2024
fe0ab99
Merge branch 'main' into jamalkhey/vsc-modification
jamal-khey Mar 7, 2024
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
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,9 @@ public enum ModificationType {
GENERATION_DISPATCH(PreloadingStrategy.COLLECTION),
VOLTAGE_INIT_MODIFICATION(PreloadingStrategy.COLLECTION),
VSC_CREATION(PreloadingStrategy.NONE),
VSC_MODIFICATION(PreloadingStrategy.NONE),
CONVERTER_STATION_CREATION(PreloadingStrategy.NONE),
CONVERTER_STATION_MODIFICATION(PreloadingStrategy.NONE),
TABULAR_MODIFICATION(PreloadingStrategy.COLLECTION),
TABULAR_CREATION(PreloadingStrategy.COLLECTION),
BY_FORMULA_MODIFICATION(PreloadingStrategy.COLLECTION);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -108,10 +108,13 @@ public enum Type {
TABULAR_MODIFICATION_ERROR(HttpStatus.INTERNAL_SERVER_ERROR),
TABULAR_CREATION_ERROR(HttpStatus.INTERNAL_SERVER_ERROR),
CREATE_VSC_ERROR(HttpStatus.INTERNAL_SERVER_ERROR),
MODIFY_VSC_ERROR(HttpStatus.INTERNAL_SERVER_ERROR),
HVDC_LINE_ALREADY_EXISTS(HttpStatus.BAD_REQUEST),
VSC_CONVERTER_STATION_NOT_FOUND(HttpStatus.NOT_FOUND),
CREATE_CONVERTER_STATION_ERROR(HttpStatus.INTERNAL_SERVER_ERROR),
BY_FORMULA_MODIFICATION_ERROR(HttpStatus.INTERNAL_SERVER_ERROR);
MODIFY_CONVERTER_STATION_ERROR(HttpStatus.INTERNAL_SERVER_ERROR),
BY_FORMULA_MODIFICATION_ERROR(HttpStatus.INTERNAL_SERVER_ERROR),
HVDC_LINE_NOT_FOUND(HttpStatus.NOT_FOUND);

public final HttpStatus status;
private final String message;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
/**
* Copyright (c) 2024, RTE (http://www.rte-france.com)
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
package org.gridsuite.modification.server.dto;

import com.fasterxml.jackson.annotation.JsonTypeName;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import lombok.experimental.SuperBuilder;
import org.gridsuite.modification.server.dto.annotation.ModificationErrorTypeName;
import org.gridsuite.modification.server.entities.equipment.modification.ConverterStationModificationEntity;

import java.util.List;

/**
* @author jamal kheyyad <jamal.kheyyad at rte-france.com>
*/
@SuperBuilder
@NoArgsConstructor
@Getter
@Setter
@ToString(callSuper = true)
@Schema(description = "Converter station modification")
@JsonTypeName("CONVERTER_STATION_MODIFICATION")
@ModificationErrorTypeName("MODIFY_CONVERTER_STATION_ERROR")
public class ConverterStationModificationInfos extends InjectionModificationInfos {
@Schema(description = "Loss Factor")
private AttributeModification<Float> lossFactor;

@Schema(description = "Reactive power")
private AttributeModification<Double> reactivePower;

@Schema(description = "Voltage regulation")
private AttributeModification<Boolean> voltageRegulationOn;

@Schema(description = "Voltage")
private AttributeModification<Double> voltage;

@Schema(description = "Reactive capability curve")
private AttributeModification<Boolean> reactiveCapabilityCurve;

@Schema(description = "Minimum reactive power")
private AttributeModification<Double> minimumReactivePower;

@Schema(description = "Maximum reactive power")
private AttributeModification<Double> maximumReactivePower;

@Schema(description = "Reactive capability curve points")
private List<ReactiveCapabilityCurveModificationInfos> reactiveCapabilityCurvePoints;

@Override
public ConverterStationModificationEntity toEntity() {
return new ConverterStationModificationEntity(this);
}
}
29 changes: 29 additions & 0 deletions src/main/java/org/gridsuite/modification/server/dto/DTOUtils.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
/**
* Copyright (c) 2024, RTE (http://www.rte-france.com)
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
package org.gridsuite.modification.server.dto;

import org.gridsuite.modification.server.entities.equipment.modification.ReactiveCapabilityCurveModificationEmbeddable;
import org.springframework.util.CollectionUtils;

import java.util.List;

/**
* @author jamal kheyyad <jamal.kheyyad at rte-france.com>
*/
public final class DTOUtils {
private DTOUtils() {
}

public static List<ReactiveCapabilityCurveModificationInfos> convertToReactiveCapabilityCurveModificationInfos(List<ReactiveCapabilityCurveModificationEmbeddable> rCCpoints) {
return CollectionUtils.isEmpty(rCCpoints) ? null : rCCpoints
.stream()
.map(value -> new ReactiveCapabilityCurveModificationInfos(value.getMinQ(), value.getOldMinQ(),
value.getMaxQ(), value.getOldMaxQ(),
value.getP(), value.getOldP()))
.toList();
}
Copy link
Contributor

@YenguiSeddik YenguiSeddik Feb 15, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it can be done like this i think
public static List convertToReactiveCapabilityCurveModificationInfos(List rCCpoints) {
return CollectionUtils.isEmpty(rCCpoints) ? List.of() : rCCpoints
.stream()
.map(value -> new ReactiveCapabilityCurveModificationInfos(value.getQminP(), value.getOldQminP(),
value.getQmaxP(), value.getOldQmaxP(),
value.getP(), value.getOldP()))
.toList();
}

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done , i juste replaced 'List.of()' in your suggestion by 'null'

}
Original file line number Diff line number Diff line change
Expand Up @@ -68,8 +68,10 @@
@JsonSubTypes.Type(value = VscCreationInfos.class),
@JsonSubTypes.Type(value = ConverterStationCreationInfos.class),
@JsonSubTypes.Type(value = TabularModificationInfos.class),
@JsonSubTypes.Type(value = TabularCreationInfos.class),
@JsonSubTypes.Type(value = ByFormulaModificationInfos.class)
@JsonSubTypes.Type(value = ByFormulaModificationInfos.class),
@JsonSubTypes.Type(value = VscModificationInfos.class),
@JsonSubTypes.Type(value = ConverterStationModificationInfos.class),
@JsonSubTypes.Type(value = TabularCreationInfos.class)
})
@SuperBuilder
@NoArgsConstructor
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
package org.gridsuite.modification.server.dto;

import com.fasterxml.jackson.annotation.JsonTypeName;
import com.powsybl.commons.reporter.Reporter;
import com.powsybl.commons.reporter.ReporterModel;
import com.powsybl.iidm.network.HvdcLine;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import lombok.experimental.SuperBuilder;
import org.gridsuite.modification.server.dto.annotation.ModificationErrorTypeName;
import org.gridsuite.modification.server.entities.equipment.modification.VscModificationEntity;
import org.gridsuite.modification.server.modifications.AbstractModification;
import org.gridsuite.modification.server.modifications.VscModification;

/**
* @author jamal kheyyad <jamal.kheyyad at rte-france.com>
*/
@SuperBuilder
@NoArgsConstructor
@Data
@ToString(callSuper = true)
@Schema(description = "VSC modification")
@JsonTypeName("VSC_MODIFICATION")
@ModificationErrorTypeName("MODIFY_VSC_ERROR")
public class VscModificationInfos extends BasicEquipmentModificationInfos {
@Schema(description = "DC nominal voltage")
private AttributeModification<Double> dcNominalVoltage;

@Schema(description = "DC resistance")
private AttributeModification<Double> dcResistance;

@Schema(description = "Maximum active power ")
private AttributeModification<Double> maximumActivePower;

@Schema(description = "Operator active power limit (Side1->Side2)")
private AttributeModification<Float> operatorActivePowerLimitFromSide1ToSide2;

@Schema(description = "Operator active power limit (Side2->Side1)")
private AttributeModification<Float> operatorActivePowerLimitFromSide2ToSide1;

@Schema(description = "Converters mode")
private AttributeModification<HvdcLine.ConvertersMode> convertersMode;

@Schema(description = "Active power")
private AttributeModification<Double> activePower;

@Schema(description = "Angle droop active power control ")
private AttributeModification<Boolean> angleDroopActivePowerControl;

@Schema(description = "p0")
private AttributeModification<Float> p0;

@Schema(description = "droop")
private AttributeModification<Float> droop;

@Schema(description = "Converter station 1")
private ConverterStationModificationInfos converterStation1;

@Schema(description = "Converter station 2")
private ConverterStationModificationInfos converterStation2;

@Override
public VscModificationEntity toEntity() {
return new VscModificationEntity(this);
}

@Override
public AbstractModification toModification() {
return new VscModification(this);
}

@Override
public Reporter createSubReporter(ReporterModel reporter) {
return reporter.createSubReporter(getType().name(), "Vsc modification ${vscId}", "vscId", this.getEquipmentId());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,19 +6,17 @@
*/
package org.gridsuite.modification.server.entities.equipment.modification;

import jakarta.persistence.*;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.NonNull;
import org.gridsuite.modification.server.dto.*;
import org.gridsuite.modification.server.entities.equipment.modification.attribute.*;
import org.gridsuite.modification.server.dto.AttributeModification;
import org.gridsuite.modification.server.dto.ModificationInfos;

import jakarta.persistence.*;
import org.gridsuite.modification.server.entities.equipment.modification.attribute.BooleanModificationEmbedded;
import org.gridsuite.modification.server.entities.equipment.modification.attribute.DoubleModificationEmbedded;
import org.gridsuite.modification.server.entities.equipment.modification.attribute.FloatModificationEmbedded;
import org.springframework.util.CollectionUtils;

import java.util.List;
import java.util.stream.Collectors;

import static org.gridsuite.modification.server.entities.equipment.modification.attribute.IAttributeModificationEmbeddable.toAttributeModification;

Expand Down Expand Up @@ -120,14 +118,6 @@ public BatteryModificationInfos toModificationInfos() {
}

private BatteryModificationInfos.BatteryModificationInfosBuilder<?, ?> toBatteryModificationInfosBuilder() {
List<ReactiveCapabilityCurveModificationEmbeddable> pointsEmbeddable = !CollectionUtils.isEmpty(reactiveCapabilityCurvePoints) ? reactiveCapabilityCurvePoints : null;
List<ReactiveCapabilityCurveModificationInfos> points = pointsEmbeddable != null ? getReactiveCapabilityCurvePoints()
.stream()
.map(value -> new ReactiveCapabilityCurveModificationInfos(value.getMinQ(), value.getOldMinQ(),
value.getMaxQ(), value.getOldMaxQ(),
value.getP(), value.getOldP()))
.collect(Collectors.toList()) : null;

return BatteryModificationInfos
.builder()
.uuid(getId())
Expand All @@ -147,7 +137,7 @@ public BatteryModificationInfos toModificationInfos() {
.participate(toAttributeModification(getParticipate()))
.droop(toAttributeModification(getDroop()))
.reactiveCapabilityCurve(toAttributeModification(getReactiveCapabilityCurve()))
.reactiveCapabilityCurvePoints(points)
.reactiveCapabilityCurvePoints(DTOUtils.convertToReactiveCapabilityCurveModificationInfos(getReactiveCapabilityCurvePoints()))
// properties
.properties(CollectionUtils.isEmpty(getProperties()) ? null :
getProperties().stream()
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
/**
* Copyright (c) 2024, RTE (http://www.rte-france.com)
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
package org.gridsuite.modification.server.entities.equipment.modification;

import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.NonNull;
import org.gridsuite.modification.server.dto.*;
import org.gridsuite.modification.server.entities.equipment.modification.attribute.BooleanModificationEmbedded;
import org.gridsuite.modification.server.entities.equipment.modification.attribute.DoubleModificationEmbedded;
import org.gridsuite.modification.server.entities.equipment.modification.attribute.FloatModificationEmbedded;

import java.util.List;

import static org.gridsuite.modification.server.entities.equipment.modification.attribute.IAttributeModificationEmbeddable.toAttributeModification;

/**
* @author jamal kheyyad <jamal.kheyyad at rte-france.com>
*/

@AllArgsConstructor
@NoArgsConstructor
@Getter
@Entity
@Table(name = "converterStationModification")
public class ConverterStationModificationEntity extends InjectionModificationEntity {

@Embedded
@AttributeOverrides(value = {@AttributeOverride(name = "value", column = @Column(name = "lossFactor")), @AttributeOverride(name = "opType", column = @Column(name = "lossFactorOp"))
})
private FloatModificationEmbedded lossFactor;

@Embedded
@AttributeOverrides(value = {@AttributeOverride(name = "value", column = @Column(name = "minimumReactivePower")), @AttributeOverride(name = "opType", column = @Column(name = "minimumReactivePowerOp"))
})
private DoubleModificationEmbedded minimumReactivePower;

@Embedded
@AttributeOverrides(value = {@AttributeOverride(name = "value", column = @Column(name = "maximumReactivePower")), @AttributeOverride(name = "opType", column = @Column(name = "maximumReactivePowerOp"))
})
private DoubleModificationEmbedded maximumReactivePower;

@Embedded
@AttributeOverrides(value = {@AttributeOverride(name = "value", column = @Column(name = "reactivePower")), @AttributeOverride(name = "opType", column = @Column(name = "reactivePowerOp"))
})
private DoubleModificationEmbedded reactivePower;

@Embedded
@AttributeOverrides(value = {@AttributeOverride(name = "value", column = @Column(name = "voltageRegulationOn")), @AttributeOverride(name = "opType", column = @Column(name = "voltageRegulationOnOp"))
})
private BooleanModificationEmbedded voltageRegulationOn;

@Embedded
@AttributeOverrides(value = {@AttributeOverride(name = "value", column = @Column(name = "voltage")), @AttributeOverride(name = "opType", column = @Column(name = "voltageOp"))
})
private DoubleModificationEmbedded voltage;

@ElementCollection
@CollectionTable(name = "converter_station_modification_rcc_points")
private List<ReactiveCapabilityCurveModificationEmbeddable> reactiveCapabilityCurvePoints;

@Embedded
@AttributeOverrides(value = {@AttributeOverride(name = "value", column = @Column(name = "reactiveCapabilityCurve")), @AttributeOverride(name = "opType", column = @Column(name = "reactiveCapabilityCurveOp"))
})
private BooleanModificationEmbedded reactiveCapabilityCurve;

public ConverterStationModificationEntity(ConverterStationModificationInfos converterStationModificationInfos) {
super(converterStationModificationInfos);
assignAttributes(converterStationModificationInfos);
}

@Override
public void update(@NonNull ModificationInfos modificationInfos) {
super.update(modificationInfos);
assignAttributes((ConverterStationModificationInfos) modificationInfos);
}

private void assignAttributes(ConverterStationModificationInfos converterStationModificationInfos) {
this.lossFactor = converterStationModificationInfos.getLossFactor() != null ? new FloatModificationEmbedded(converterStationModificationInfos.getLossFactor()) : null;
this.minimumReactivePower = converterStationModificationInfos.getMinimumReactivePower() != null ? new DoubleModificationEmbedded(converterStationModificationInfos.getMinimumReactivePower()) : null;
this.maximumReactivePower = converterStationModificationInfos.getMaximumReactivePower() != null ? new DoubleModificationEmbedded(converterStationModificationInfos.getMaximumReactivePower()) : null;
this.reactivePower = converterStationModificationInfos.getReactivePower() != null ? new DoubleModificationEmbedded(converterStationModificationInfos.getReactivePower()) : null;
this.voltageRegulationOn = converterStationModificationInfos.getVoltageRegulationOn() != null ? new BooleanModificationEmbedded(converterStationModificationInfos.getVoltageRegulationOn()) : null;
this.voltage = converterStationModificationInfos.getVoltage() != null ? new DoubleModificationEmbedded(converterStationModificationInfos.getVoltage()) : null;
this.reactiveCapabilityCurve = converterStationModificationInfos.getReactiveCapabilityCurve() != null ? new BooleanModificationEmbedded(converterStationModificationInfos.getReactiveCapabilityCurve()) : null;
this.reactiveCapabilityCurvePoints = toEmbeddablePoints(converterStationModificationInfos.getReactiveCapabilityCurvePoints());

}

public static List<ReactiveCapabilityCurveModificationEmbeddable> toEmbeddablePoints(
List<ReactiveCapabilityCurveModificationInfos> points) {
return points == null ? null
: points.stream()
.map(point -> new ReactiveCapabilityCurveModificationEmbeddable(point.getMinQ(), point.getOldMinQ(),
point.getMaxQ(), point.getOldMaxQ(), point.getP(),
point.getOldP()))
.toList();
}

@Override
public ConverterStationModificationInfos toModificationInfos() {
return toConverterStationModificationInfoBuilder().build();
}

private ConverterStationModificationInfos.ConverterStationModificationInfosBuilder<?, ?> toConverterStationModificationInfoBuilder() {

return ConverterStationModificationInfos.builder()
.uuid(getId())
.date(getDate())
.stashed(getStashed())
.equipmentId(getEquipmentId())
.equipmentName(AttributeModification.toAttributeModification(getEquipmentNameValue(), getEquipmentNameOp()))
.lossFactor(toAttributeModification(getLossFactor()))
.minimumReactivePower(toAttributeModification(getMinimumReactivePower()))
.maximumReactivePower(toAttributeModification(getMaximumReactivePower()))
.reactivePower(toAttributeModification(getReactivePower()))
.voltageRegulationOn(toAttributeModification(getVoltageRegulationOn()))
.voltage(toAttributeModification(getVoltage()))
.reactiveCapabilityCurve(toAttributeModification(getReactiveCapabilityCurve()))
.reactiveCapabilityCurvePoints(DTOUtils.convertToReactiveCapabilityCurveModificationInfos(getReactiveCapabilityCurvePoints()));
}
}
Loading
Loading