Skip to content

Commit

Permalink
Add tests for injection balance
Browse files Browse the repository at this point in the history
Signed-off-by: wangjer <jeremy.wang@rte-france.com>
  • Loading branch information
wangjer committed Sep 17, 2024
1 parent 5a1acd7 commit 9a70345
Show file tree
Hide file tree
Showing 2 changed files with 100 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import com.powsybl.iidm.network.TwoSides;
import com.powsybl.openrao.data.cracapi.range.RangeType;
import com.powsybl.openrao.data.cracapi.rangeaction.PstRangeAction;
import com.powsybl.openrao.data.cracapi.usagerule.UsageMethod;
import com.powsybl.openrao.data.cracimpl.utils.NetworkImportsUtil;
import com.powsybl.openrao.data.raoresultapi.ComputationStatus;
import com.powsybl.openrao.searchtreerao.result.api.FlowResult;
Expand Down Expand Up @@ -52,10 +53,17 @@ abstract class AbstractFillerTest {
static final int TAP_INITIAL = 5;
static final int TAP_IT2 = -7;

// data related to the Injection Range Action
static final double PRE_RESULT_SET_POINT_INJ_0 = 250.;
static final double PRE_RESULT_SET_POINT_INJ_1 = -450.;

static final String CNEC_1_ID = "Tieline BE FR - N - preventive"; // monitored on left side
static final String CNEC_2_ID = "Tieline BE FR - Defaut - N-1 NL1-NL3"; // monitored on right side
static final String RANGE_ACTION_ID = "PRA_PST_BE";
static final String RANGE_ACTION_ELEMENT_ID = "BBE2AA1 BBE3AA1 1";
static final String INJECTION_RANGE_ACTION_ID_0 = "injectionId0";
static final String INJECTION_RANGE_ACTION_ID_1 = "injectionId1";
static final String INJECTION_RANGE_ACTION_ID_2 = "injectionId2";

FlowCnec cnec1;
FlowCnec cnec2;
Expand Down Expand Up @@ -118,6 +126,32 @@ protected void addPstGroupInCrac() {
.add();
}

protected void addInjectionsInCrac() {
crac.removePstRangeAction(RANGE_ACTION_ID);
crac.newInjectionRangeAction()
.withId(INJECTION_RANGE_ACTION_ID_0)
.withNetworkElementAndKey(1., "BBE1AA1 _generator")
.withNetworkElementAndKey(1., "BBE2AA1 _generator")
.newRange().withMin(100).withMax(1000).add()
.newOnInstantUsageRule().withInstant(PREVENTIVE_INSTANT_ID).withUsageMethod(UsageMethod.AVAILABLE).add()
.add();

crac.newInjectionRangeAction()
.withId(INJECTION_RANGE_ACTION_ID_1)
.withNetworkElementAndKey(1., "DDE1AA1 _load")
.newRange().withMin(-1000).withMax(-100).add()
.newOnInstantUsageRule().withInstant(PREVENTIVE_INSTANT_ID).withUsageMethod(UsageMethod.AVAILABLE).add()
.add();

crac.newInjectionRangeAction()
.withId(INJECTION_RANGE_ACTION_ID_2)
.withNetworkElementAndKey(1., "FFR1AA1 _generator")
.withNetworkElementAndKey(-1., "FFR2AA1 _generator")
.newRange().withMin(100).withMax(1000).add()
.newOnInstantUsageRule().withInstant(PREVENTIVE_INSTANT_ID).withUsageMethod(UsageMethod.AVAILABLE).add()
.add();
}

protected void useNetworkWithTwoPsts() {
network = NetworkImportsUtil.import12NodesWith2PstsNetwork();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import com.powsybl.openrao.data.cracapi.State;
import com.powsybl.openrao.data.cracapi.cnec.FlowCnec;
import com.powsybl.iidm.network.TwoSides;
import com.powsybl.openrao.data.cracapi.rangeaction.InjectionRangeAction;
import com.powsybl.openrao.data.cracapi.rangeaction.RangeAction;
import com.powsybl.openrao.data.raoresultapi.ComputationStatus;
import com.powsybl.openrao.raoapi.parameters.RangeActionsOptimizationParameters;
Expand Down Expand Up @@ -102,6 +103,34 @@ private void initialize(Set<FlowCnec> cnecs, double pstSensitivityThreshold, dou
buildLinearProblem();
}

private void initializeForInjection(Set<FlowCnec> cnecs, double pstSensitivityThreshold, double hvdcSensitivityThreshold, double injectionSensitivityThreshold, State mainState, boolean raRangeShrinking, RangeActionsOptimizationParameters.PstModel pstModel) {
RangeAction<?> injGen = crac.getRangeAction(INJECTION_RANGE_ACTION_ID_0);
RangeAction<?> injLoad = crac.getRangeAction(INJECTION_RANGE_ACTION_ID_1);

initialRangeActionSetpointResult = new RangeActionSetpointResultImpl(Map.of(injGen, PRE_RESULT_SET_POINT_INJ_0, injLoad, PRE_RESULT_SET_POINT_INJ_1));
OptimizationPerimeter optimizationPerimeter = Mockito.mock(OptimizationPerimeter.class);
Mockito.when(optimizationPerimeter.getFlowCnecs()).thenReturn(cnecs);
Mockito.when(optimizationPerimeter.getMainOptimizationState()).thenReturn(mainState);

Map<State, Set<RangeAction<?>>> rangeActions = new HashMap<>();
cnecs.forEach(cnec -> rangeActions.put(cnec.getState(), Set.of(injGen, injLoad)));
Mockito.when(optimizationPerimeter.getRangeActionsPerState()).thenReturn(rangeActions);

RaoParameters raoParameters = new RaoParameters();
raoParameters.getRangeActionsOptimizationParameters().setPstSensitivityThreshold(pstSensitivityThreshold);
raoParameters.getRangeActionsOptimizationParameters().setHvdcSensitivityThreshold(hvdcSensitivityThreshold);
raoParameters.getRangeActionsOptimizationParameters().setInjectionRaSensitivityThreshold(injectionSensitivityThreshold);
RangeActionsOptimizationParameters rangeActionParameters = RangeActionsOptimizationParameters.buildFromRaoParameters(raoParameters);

coreProblemFiller = new CoreProblemFiller(
optimizationPerimeter,
initialRangeActionSetpointResult,
new RangeActionActivationResultImpl(initialRangeActionSetpointResult),
rangeActionParameters,
Unit.MEGAWATT, raRangeShrinking, pstModel);
buildLinearProblem();
}

@Test
void fillTestOnPreventive() {
initializeForPreventive(1e-6, 1e-6, 1e-6);
Expand Down Expand Up @@ -638,4 +667,41 @@ void testFilterCnecWithSensiFailureAndUpdateWithChange() {
assertEquals(1, flowConstraint1.getCoefficient(flowVariable1), DOUBLE_TOLERANCE);
assertEquals(-SENSI_CNEC1_IT2, flowConstraint1.getCoefficient(setPointVariable), DOUBLE_TOLERANCE);
}

@Test
void testInjectionBalance() {
addInjectionsInCrac();
initializeForInjection(Set.of(cnec1), 1e-6, 1e-6, 1e-6, crac.getPreventiveState(), false, RangeActionsOptimizationParameters.PstModel.CONTINUOUS);
State state = cnec1.getState();

// test the global balance constraint
InjectionRangeAction injectionRangeAction0 = crac.getInjectionRangeAction(INJECTION_RANGE_ACTION_ID_0);
InjectionRangeAction injectionRangeAction1 = crac.getInjectionRangeAction(INJECTION_RANGE_ACTION_ID_1);
InjectionRangeAction injectionRangeAction2 = crac.getInjectionRangeAction(INJECTION_RANGE_ACTION_ID_2);
OpenRaoMPConstraint balanceConstraint = linearProblem.getInjectionBalanceVariationConstraint(state);
OpenRaoMPVariable signedVariationVariableInj0 = linearProblem.getSignedRangeActionVariationVariable(injectionRangeAction0, state);
OpenRaoMPVariable signedVariationVariableInj1 = linearProblem.getSignedRangeActionVariationVariable(injectionRangeAction1, state);
assertNotNull(balanceConstraint);
assertThrows(OpenRaoException.class, () -> linearProblem.getSignedRangeActionVariationVariable(injectionRangeAction2, state));
assertEquals(1, balanceConstraint.getCoefficient(signedVariationVariableInj0), DOUBLE_TOLERANCE);
assertEquals(1, balanceConstraint.getCoefficient(signedVariationVariableInj1), DOUBLE_TOLERANCE);
// test the signed variation constraints for each injection
OpenRaoMPConstraint singedVariationConstraint0 = linearProblem.getSignedRangeActionVariationConstraint(injectionRangeAction0, state);
OpenRaoMPConstraint singedVariationConstraint1 = linearProblem.getSignedRangeActionVariationConstraint(injectionRangeAction1, state);
OpenRaoMPVariable setPointVariableInj0 = linearProblem.getRangeActionSetpointVariable(injectionRangeAction0, state);
OpenRaoMPVariable setPointVariableInj1 = linearProblem.getRangeActionSetpointVariable(injectionRangeAction1, state);
double sumDistributionKeys0 = injectionRangeAction0.getInjectionDistributionKeys().values().stream().mapToDouble(d -> d).sum();
double sumDistributionKeys1 = injectionRangeAction1.getInjectionDistributionKeys().values().stream().mapToDouble(d -> d).sum();
assertNotNull(singedVariationConstraint0);
assertNotNull(singedVariationConstraint1);
assertThrows(OpenRaoException.class, () -> linearProblem.getSignedRangeActionVariationConstraint(injectionRangeAction2, state));
assertEquals(1, singedVariationConstraint0.getCoefficient(signedVariationVariableInj0), DOUBLE_TOLERANCE);
assertEquals(1, singedVariationConstraint1.getCoefficient(signedVariationVariableInj1), DOUBLE_TOLERANCE);
assertEquals(-sumDistributionKeys0, singedVariationConstraint0.getCoefficient(setPointVariableInj0), DOUBLE_TOLERANCE);
assertEquals(-sumDistributionKeys1, singedVariationConstraint1.getCoefficient(setPointVariableInj1), DOUBLE_TOLERANCE);
assertEquals(-sumDistributionKeys0 * PRE_RESULT_SET_POINT_INJ_0, singedVariationConstraint0.lb(), DOUBLE_TOLERANCE);
assertEquals(-sumDistributionKeys0 * PRE_RESULT_SET_POINT_INJ_0, singedVariationConstraint0.ub(), DOUBLE_TOLERANCE);
assertEquals(-sumDistributionKeys1 * PRE_RESULT_SET_POINT_INJ_1, singedVariationConstraint1.lb(), DOUBLE_TOLERANCE);
assertEquals(-sumDistributionKeys1 * PRE_RESULT_SET_POINT_INJ_1, singedVariationConstraint1.ub(), DOUBLE_TOLERANCE);
}
}

0 comments on commit 9a70345

Please sign in to comment.