NcCracCreator.java
/*
* Copyright (c) 2023, 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 com.powsybl.openrao.data.crac.io.nc.craccreator;
import com.powsybl.iidm.network.Network;
import com.powsybl.openrao.data.crac.io.nc.NcCrac;
import com.powsybl.openrao.data.crac.io.nc.craccreator.contingency.NcContingencyCreator;
import com.powsybl.openrao.data.crac.api.Crac;
import com.powsybl.openrao.data.crac.api.InstantKind;
import com.powsybl.openrao.data.crac.api.parameters.CracCreationParameters;
import com.powsybl.openrao.data.crac.io.nc.craccreator.cnec.NcCnecCreator;
import com.powsybl.openrao.data.crac.io.nc.craccreator.remedialaction.NcRemedialActionsCreator;
import com.powsybl.openrao.data.crac.io.nc.parameters.NcCracCreationParameters;
import com.powsybl.openrao.data.crac.io.commons.RaUsageLimitsAdder;
import java.time.OffsetDateTime;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import static com.powsybl.openrao.data.crac.io.nc.craccreator.constants.NcConstants.*;
/**
* @author Jean-Pierre Arnould {@literal <jean-pierre.arnould at rte-france.com>}
*/
class NcCracCreator {
private Crac crac;
private Network network;
NcCracCreationContext creationContext;
private NcCrac nativeCrac;
NcCracCreationContext createCrac(NcCrac nativeCrac, Network network, CracCreationParameters cracCreationParameters) {
this.crac = cracCreationParameters.getCracFactory().create(nativeCrac.toString());
this.network = network;
NcCracCreationParameters ncParameters = cracCreationParameters.getExtension(NcCracCreationParameters.class);
OffsetDateTime offsetDateTime = null;
if (ncParameters != null) {
offsetDateTime = ncParameters.getTimestamp();
}
this.creationContext = new NcCracCreationContext(crac, offsetDateTime, network.getNameOrId());
this.nativeCrac = nativeCrac;
if (offsetDateTime == null) {
creationContext.getCreationReport().error("Timestamp is null for NC crac creator.");
creationContext.creationFailure();
return creationContext;
}
addCsaInstants(ncParameters);
RaUsageLimitsAdder.addRaUsageLimits(crac, cracCreationParameters);
this.nativeCrac.setForTimestamp(offsetDateTime);
createContingencies();
createCnecs(cracCreationParameters);
createRemedialActions(ncParameters);
creationContext.buildCreationReport();
return creationContext.creationSuccess(crac);
}
private void addCsaInstants(NcCracCreationParameters ncCracCreationParameters) {
crac.newInstant(PREVENTIVE_INSTANT, InstantKind.PREVENTIVE)
.newInstant(OUTAGE_INSTANT, InstantKind.OUTAGE)
.newInstant(AUTO_INSTANT, InstantKind.AUTO);
List<String> sortedCurativeInstants = ncCracCreationParameters.getCurativeInstants().entrySet().stream().sorted(Comparator.comparingDouble(Map.Entry::getValue)).map(Map.Entry::getKey).toList();
sortedCurativeInstants.forEach(instantName -> crac.newInstant(instantName, InstantKind.CURATIVE));
}
private void createRemedialActions(NcCracCreationParameters ncCracCreationParameters) {
new NcRemedialActionsCreator(crac, network, nativeCrac, creationContext, creationContext.getCnecCreationContexts(), ncCracCreationParameters);
}
private void createContingencies() {
new NcContingencyCreator(crac, network, nativeCrac, creationContext);
}
private void createCnecs(CracCreationParameters cracCreationParameters) {
new NcCnecCreator(crac, network, nativeCrac, creationContext, cracCreationParameters);
}
}