diff --git a/src/solver/optimisation/CMakeLists.txt b/src/solver/optimisation/CMakeLists.txt index 0d64d42e44..bd6e6c4d64 100644 --- a/src/solver/optimisation/CMakeLists.txt +++ b/src/solver/optimisation/CMakeLists.txt @@ -75,6 +75,8 @@ set(RTESOLVER_OPT include/antares/solver/optimisation/constraints/constraint_builder_utils.h include/antares/solver/optimisation/constraints/AreaBalance.h constraints/AreaBalance.cpp + include/antares/solver/optimisation/constraints/NetPosition.h + constraints/NetPosition.cpp include/antares/solver/optimisation/constraints/FictitiousLoad.h constraints/FictitiousLoad.cpp include/antares/solver/optimisation/constraints/ShortTermStorageLevel.h diff --git a/src/solver/optimisation/constraints/AreaBalance.cpp b/src/solver/optimisation/constraints/AreaBalance.cpp index c0c254854d..b35139d584 100644 --- a/src/solver/optimisation/constraints/AreaBalance.cpp +++ b/src/solver/optimisation/constraints/AreaBalance.cpp @@ -44,22 +44,9 @@ void AreaBalance::add(int pdt, int pays) builder.updateHourWithinWeek(pdt); - int interco = data.IndexDebutIntercoOrigine[pays]; - while (interco >= 0) - { - builder.NTCDirect(interco, 1.0); - interco = data.IndexSuivantIntercoOrigine[interco]; - } - - interco = data.IndexDebutIntercoExtremite[pays]; - while (interco >= 0) - { - builder.NTCDirect(interco, -1.0); - interco = data.IndexSuivantIntercoExtremite[interco]; - } - ExportPaliers(data.PaliersThermiquesDuPays[pays], builder); - builder.HydProd(pays, -1.0) + builder.NetPosition(pays, 1) + .HydProd(pays, -1.0) .Pumping(pays, 1.0) .PositiveUnsuppliedEnergy(pays, -1.0) .NegativeUnsuppliedEnergy(pays, 1.0); diff --git a/src/solver/optimisation/constraints/Group1.cpp b/src/solver/optimisation/constraints/Group1.cpp index 61de7cf2b3..bb5b5c199f 100644 --- a/src/solver/optimisation/constraints/Group1.cpp +++ b/src/solver/optimisation/constraints/Group1.cpp @@ -35,6 +35,15 @@ AreaBalanceData Group1::GetAreaBalanceData() .ShortTermStorage = problemeHebdo_->ShortTermStorage}; } +NetPositionData Group1::GetNetPositionData() +{ + return {.CorrespondanceCntNativesCntOptim = problemeHebdo_->CorrespondanceCntNativesCntOptim, + .IndexDebutIntercoOrigine = problemeHebdo_->IndexDebutIntercoOrigine, + .IndexSuivantIntercoOrigine = problemeHebdo_->IndexSuivantIntercoOrigine, + .IndexDebutIntercoExtremite = problemeHebdo_->IndexDebutIntercoExtremite, + .IndexSuivantIntercoExtremite = problemeHebdo_->IndexSuivantIntercoExtremite}; +} + FictitiousLoadData Group1::GetFictitiousLoadData() { return {.CorrespondanceCntNativesCntOptim = problemeHebdo_->CorrespondanceCntNativesCntOptim, @@ -79,6 +88,9 @@ void Group1::BuildConstraints() auto areaBalanceData = GetAreaBalanceData(); AreaBalance areaBalance(builder_, areaBalanceData); + auto netPositionData = GetNetPositionData(); + NetPosition netPosition(builder_, netPositionData); + auto fictitiousLoadData = GetFictitiousLoadData(); FictitiousLoad fictitiousLoad(builder_, fictitiousLoadData); @@ -116,6 +128,7 @@ void Group1::BuildConstraints() for (uint32_t pays = 0; pays < problemeHebdo_->NombreDePays; pays++) { areaBalance.add(pdt, pays); + netPosition.add(pdt, pays); fictitiousLoad.add(pdt, pays); shortTermStorageLevel.add(pdt, pays); shortTermStorageCostVariationInjectionBackward.add(pdt, pays); diff --git a/src/solver/optimisation/constraints/NetPosition.cpp b/src/solver/optimisation/constraints/NetPosition.cpp new file mode 100644 index 0000000000..710e9398a3 --- /dev/null +++ b/src/solver/optimisation/constraints/NetPosition.cpp @@ -0,0 +1,47 @@ +/* +** Copyright 2007-2024, RTE (https://www.rte-france.com) +** See AUTHORS.txt +** SPDX-License-Identifier: MPL-2.0 +** This file is part of Antares-Simulator, +** Adequacy and Performance assessment for interconnected energy networks. +** +** Antares_Simulator is free software: you can redistribute it and/or modify +** it under the terms of the Mozilla Public Licence 2.0 as published by +** the Mozilla Foundation, either version 2 of the License, or +** (at your option) any later version. +** +** Antares_Simulator is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** Mozilla Public Licence 2.0 for more details. +** +** You should have received a copy of the Mozilla Public Licence 2.0 +** along with Antares_Simulator. If not, see . +*/ + +#include "antares/solver/optimisation/constraints/NetPosition.h" + +void NetPosition::add(int pdt, int pays) +{ + int interco = data.IndexDebutIntercoOrigine[pays]; + while (interco >= 0) + { + builder.NTCDirect(interco, 1.0); + interco = data.IndexSuivantIntercoOrigine[interco]; + } + + interco = data.IndexDebutIntercoExtremite[pays]; + while (interco >= 0) + { + builder.NTCDirect(interco, -1.0); + interco = data.IndexSuivantIntercoExtremite[interco]; + } + + ConstraintNamer namer(builder.data.NomDesContraintes); + namer.UpdateTimeStep(builder.data.weekInTheYear * 168 + pdt); + namer.UpdateArea(builder.data.NomsDesPays[pays]); + namer.NetPosition(builder.data.nombreDeContraintes); + + builder.NetPosition(pays, 1.0); + builder.equalTo().build(); +} diff --git a/src/solver/optimisation/include/antares/solver/optimisation/constraints/Group1.h b/src/solver/optimisation/include/antares/solver/optimisation/constraints/Group1.h index c74567716e..9f866892b0 100644 --- a/src/solver/optimisation/include/antares/solver/optimisation/constraints/Group1.h +++ b/src/solver/optimisation/include/antares/solver/optimisation/constraints/Group1.h @@ -25,6 +25,7 @@ #include "ConstraintGroup.h" #include "FictitiousLoad.h" #include "FlowDissociation.h" +#include "NetPosition.h" #include "ShortTermStorageLevel.h" class Group1: public ConstraintGroup @@ -36,6 +37,7 @@ class Group1: public ConstraintGroup private: AreaBalanceData GetAreaBalanceData(); + NetPositionData GetNetPositionData(); FictitiousLoadData GetFictitiousLoadData(); ShortTermStorageData GetShortTermStorageData(); diff --git a/src/solver/optimisation/include/antares/solver/optimisation/constraints/NetPosition.h b/src/solver/optimisation/include/antares/solver/optimisation/constraints/NetPosition.h new file mode 100644 index 0000000000..139728cee2 --- /dev/null +++ b/src/solver/optimisation/include/antares/solver/optimisation/constraints/NetPosition.h @@ -0,0 +1,56 @@ +/* +** Copyright 2007-2024, RTE (https://www.rte-france.com) +** See AUTHORS.txt +** SPDX-License-Identifier: MPL-2.0 +** This file is part of Antares-Simulator, +** Adequacy and Performance assessment for interconnected energy networks. +** +** Antares_Simulator is free software: you can redistribute it and/or modify +** it under the terms of the Mozilla Public Licence 2.0 as published by +** the Mozilla Foundation, either version 2 of the License, or +** (at your option) any later version. +** +** Antares_Simulator is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** Mozilla Public Licence 2.0 for more details. +** +** You should have received a copy of the Mozilla Public Licence 2.0 +** along with Antares_Simulator. If not, see . +*/ +#pragma once +#include "ConstraintBuilder.h" + +struct NetPositionData +{ + std::vector& CorrespondanceCntNativesCntOptim; + const std::vector& IndexDebutIntercoOrigine; + const std::vector& IndexSuivantIntercoOrigine; + const std::vector& IndexDebutIntercoExtremite; + const std::vector& IndexSuivantIntercoExtremite; +}; + +/*! + * represent 'Net Position' constraint type + */ + +class NetPosition: public ConstraintFactory +{ +public: + NetPosition(ConstraintBuilder& builder, NetPositionData& data): + ConstraintFactory(builder), + data(data) + { + } + + /*! + * @brief Add variables to the constraint and update constraints Matrix + * @param pdt : timestep + * @param pays : area + */ + + void add(int pdt, int pays); + +private: + NetPositionData& data; +}; diff --git a/src/solver/optimisation/include/antares/solver/optimisation/opt_rename_problem.h b/src/solver/optimisation/include/antares/solver/optimisation/opt_rename_problem.h index c7c3dff284..ab526cbf04 100644 --- a/src/solver/optimisation/include/antares/solver/optimisation/opt_rename_problem.h +++ b/src/solver/optimisation/include/antares/solver/optimisation/opt_rename_problem.h @@ -114,6 +114,7 @@ class VariableNamer: public Namer void PositiveUnsuppliedEnergy(unsigned int variable); void NegativeUnsuppliedEnergy(unsigned int variable); void AreaBalance(unsigned int variable); + void NetPosition(unsigned int variable); private: void SetAreaVariableName(unsigned int variable, @@ -133,6 +134,7 @@ class ConstraintNamer: public Namer const std::string& origin, const std::string& destination); + void NetPosition(unsigned int variable); void AreaBalance(unsigned int constraint); void FictiveLoads(unsigned int constraint); void HydroPower(unsigned int constraint); diff --git a/src/solver/optimisation/opt_construction_variables_optimisees_lineaire.cpp b/src/solver/optimisation/opt_construction_variables_optimisees_lineaire.cpp index 61ddf12562..ace9a312fe 100644 --- a/src/solver/optimisation/opt_construction_variables_optimisees_lineaire.cpp +++ b/src/solver/optimisation/opt_construction_variables_optimisees_lineaire.cpp @@ -89,6 +89,7 @@ void OPT_ConstruireLaListeDesVariablesOptimiseesDuProblemeLineaire(PROBLEME_HEBD // NetPosition ProblemeAResoudre->TypeDeVariable[NombreDeVariables] = VARIABLE_NON_BORNEE; variableManager.NetPosition(pays, pdt) = NombreDeVariables; + variableNamer.NetPosition(NombreDeVariables); NombreDeVariables++; for (const auto& storage: problemeHebdo->ShortTermStorage[pays]) diff --git a/src/solver/optimisation/opt_decompte_variables_et_contraintes.cpp b/src/solver/optimisation/opt_decompte_variables_et_contraintes.cpp index 79c29c58ab..720e8bcb83 100644 --- a/src/solver/optimisation/opt_decompte_variables_et_contraintes.cpp +++ b/src/solver/optimisation/opt_decompte_variables_et_contraintes.cpp @@ -281,6 +281,13 @@ int OPT_DecompteDesVariablesEtDesContraintesDuProblemeAOptimiser(PROBLEME_HEBDO* } } + // NetPosition + for (uint32_t pays = 0; pays < problemeHebdo->NombreDePays; pays++) + { + ProblemeAResoudre->NombreDeVariables += nombreDePasDeTempsPourUneOptimisation; + ProblemeAResoudre->NombreDeContraintes += nombreDePasDeTempsPourUneOptimisation; + } + if (problemeHebdo->OptimisationAvecCoutsDeDemarrage) { OPT_DecompteDesVariablesEtDesContraintesCoutsDeDemarrage(problemeHebdo); diff --git a/src/solver/optimisation/opt_rename_problem.cpp b/src/solver/optimisation/opt_rename_problem.cpp index b385c0f8f5..622e8fbb09 100644 --- a/src/solver/optimisation/opt_rename_problem.cpp +++ b/src/solver/optimisation/opt_rename_problem.cpp @@ -192,6 +192,11 @@ void VariableNamer::ShortTermStorageCostVariationWithdrawal(unsigned int variabl SetShortTermStorageVariableName(variable, "CostVariationWithdrawal", shortTermStorageName); } +void VariableNamer::NetPosition(unsigned int constraint) +{ + SetAreaElementNameHour(constraint, "NetPositionVariable"); +} + void VariableNamer::HydProd(unsigned int variable) { SetAreaElementNameHour(variable, "HydProd"); @@ -275,6 +280,11 @@ void ConstraintNamer::AreaBalance(unsigned int constraint) SetAreaElementNameHour(constraint, "AreaBalance"); } +void ConstraintNamer::NetPosition(unsigned int constraint) +{ + SetAreaElementNameHour(constraint, "NetPositionConstraint"); +} + void ConstraintNamer::FictiveLoads(unsigned int constraint) { SetAreaElementNameHour(constraint, "FictiveLoads");