From 05de7e13a301f6b078e4e4219afbc45fc2e498db Mon Sep 17 00:00:00 2001 From: Sophie Frasnedo Date: Tue, 3 Dec 2024 13:05:21 +0100 Subject: [PATCH] Remove documentation from open-reac README Signed-off-by: Sophie Frasnedo --- open-reac/README.md | 406 +-------------------------- open-reac/image/reactive-diagram.PNG | Bin 14258 -> 0 bytes 2 files changed, 2 insertions(+), 404 deletions(-) delete mode 100644 open-reac/image/reactive-diagram.PNG diff --git a/open-reac/README.md b/open-reac/README.md index fed9aedf..5f6db1d6 100644 --- a/open-reac/README.md +++ b/open-reac/README.md @@ -1,409 +1,7 @@ # OpenReac -OpenReac is a reactive optimal power flow that gives a set of hypotheses -for voltage and reactive controls by network equipment such as -generators, shunt compensators and transformers. OpenReac can be used -for network planning or in operation as well. +Have a look at the powsybl-optimizer [README](https://github.com/powsybl/powsybl-optimizer/blob/main/README.md) for more information on installation. ---- +Visit our [readthedocs](https://powsybl.readthedocs.io/projects/powsybl-optimizer/en/stable/) page to find the functional documentation! -## Getting started -### AMPL -For this project, you must have [AMPL](https://ampl.com/) installed on your machine. -AMPL is a proprietary tool that works as an optimization modelling language, -and it can be interfaced with many solvers. - -To run OpenReac, you must add in your `~/.itools/config.yml` an ampl section like this: -```yaml -ampl: - # Change to the ampl folder path that contains the ampl executable - homeDir: /home/user/ampl -``` - -### Non-linear optimization solver - -To run the model implemented in AMPL, you'll need a non-linear optimization solver. -By default, the AMPL code is configured to run Knitro, which is a proprietary non-linear solver, but you -are free to configure a different one. - -If you chose to run Knitro, you must have `knitroampl` in your path, after the installation -of the solver is done and that you got a valid licence. - ---- - -## Reactive optimal power flow - -### 1 Overview - -The reactive optimal power flow (OPF) is implemented with AMPL. -Its goal is to compute voltage values on each point of the network as well as control values -for reactive equipment and controllers of the grid -(voltage set point of generating units, shunts, transformer ratios...). - -In a grid development study, you decide new equipment, new generating units, -new substations, new loads, you set values for active and reactive loads, -you set values for active power generation and HVDC flows. -Then if you wish to do AC powerflow simulations with N-1 analysis, you need -all voltage and reactive set points and this reactive OPF is your solution. - -Please notice that this reactive OPF does **not** decide active power of generating units and HVDC branches. - - -### 2 Division of the code - -The code of the reactive OPF is divided into several files, -each serving a specific function: -- `reactiveopf.dat` defines the network data files imported (files with - *ampl_* prefix), and the files used to configure the run (files with *param_* prefix). - Refer to section [3](#3-input). -- `iidm_importer.mod`, `or_param_importer.mod` and `commons.mod` define the sets and parameters of the optimization. -- `connected_component.mod`, `dcopf.mod` and `acopf.mod` define the optimization problems solved in `reactiveopf.run`. - Refer to sections [5](#5-slack-bus--main-connex-component), [6](#6-direct-current-optimal-power-flow) and [7](#7-alternative-current-optimal-power-flow), - respectively. -- `connected_component.run`, `dcopf.run`, `acopf_preprocessing.run` and `acopf.run` orchestrate the optimization and its post-process. -- `reactiveopfoutput.mod` exports result files if the execution of `reactiveopf.run` is successful. - Refer to section [8.1](#81-in-case-of-convergence). -- `reactiveopfexit.run` contains the code executed when the process fails. - Refer to section [8.2](#82-in-case-of-inconsistency). -- `reactiveopf.run` executes the AMPL process of OpenReac, calling the previous scripts. - -### 3 Input - -#### 3.1 Network data - -Files with the prefix `ampl_` contain the -data and the parameters of the network on which the reactive OPF is executed. -These files are obtained by using the -[extended version of PowSyBl AMPL export](https://github.com/powsybl/powsybl-core/blob/main/ampl-converter/src/main/java/com/powsybl/ampl/converter/version/ExtendedAmplExporter.java), which is the default version. - -#### 3.2 Configuration of the run - -The user can configure the run with the dedicated Java interface -(see [OpenReacParameters](src/main/java/com/powsybl/openreac/parameters/input/OpenReacParameters.java)). -Specifically, the user can set various parameters and thresholds used in the preprocessing and modeling of the reactive OPF. -These are specified in the file `param_algo.txt`: - -| Parameter | Description | Java default value | Domain | -|---------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------|-----------------------------------------------| -| `log_level_ampl` | Level of display for AMPL prints | INFO | {DEBUG, INFO, WARNING, ERROR} | -| `log_level_knitro` | Level of display for solver prints (see [AMPL documentation](https://dev.ampl.com/ampl/options.html)) | $1$ | {0, 1, 2} | -| `objective_choice` | Choice of the objective function for the ACOPF (see [7](#7-alternative-current-optimal-power-flow)) | $0$ | {0, 1, 2} | -| `ratio_voltage_target` | Ratio to calculate target V of buses when `objective_choice` is set to $1$ (see [7](#7-alternative-current-optimal-power-flow)) | $0.5$ | $\[0; 1\]$ | -| `coeff_alpha` | Weight to favor more/less minimization of active power produced by generators or deviation between them and target values (see [6.2](#62-alternative-current-optimal-power-flow)) | $1$ | $\[0; 1\]$ | -| `Pnull` | Threshold of active and reactive powers considered as null | $0.01$ (MW) | $\[0; 1\]$ | -| `Znull` | Threshold of impedance considered as null (see [4.2](#)) | $10^{-5}$ (p.u.) | $\[0; 0.1\]$ | - | `epsilon_nominal_voltage` | Threshold to ignore voltage levels with nominal voltage lower than it | $1$ (kV) | $\mathbb{R}^{+}$ | -| `min_plausible_low_voltage_limit` | Consistency bound for low voltage limit of voltage levels (see [4.1](#41-voltage-level-limits-computation)) | $0.5$ (p.u.) | $\mathbb{R}^{+}$ | -| `max_plausible_high_voltage_limit` | Consistency bound for high voltage limit of voltage levels (see [4.1](#41-voltage-level-limits-computation)) | $1.5$ (p.u.) | [`min_plausible_low_voltage_limit`; $\infty$] | -| `ignore_voltage_bounds` | Threshold to replace voltage limits of voltage levels with nominal voltage lower than it, by [min_plausible_low_voltage_limit; max_plausible_high_voltage_limit] | $0$ (p.u.) | $\mathbb{R}^{+}$ | -| `buses_with_reactive_slacks` | Choice of which buses will have reactive slacks attached in ACOPF solving (see [7](#7-alternative-current-optimal-power-flow)) | ALL | {CONFIGURED, NO_GENERATION, ALL} | -| `PQmax` | Threshold for maximum active and reactive power considered in correction of generator limits (see [4.4](#44-pq-units-domain)) | $9000$ (MW, MVAr) | $\mathbb{R}$ | -| `defaultPmax` | Threshold for correction of high active power limit produced by generators (see [4.4](#44-pq-units-domain)) | $1000$ (MW) | $\mathbb{R}$ | -| `defaultPmin` | Threshold for correction of low active power limit produced by generators (see [4.4](#44-pq-units-domain)) | $0$ (MW) | $\mathbb{R}$ | -| `defaultQmaxPmaxRatio` | Ratio used to calculate threshold for corrections of high/low reactive power limits (see [4.4](#44-pq-units-domain)) | $0.3$ (MVAr/MW) | $\mathbb{R}$ | -| `minimalQPrange` | Threshold to fix active (resp. reactive) power of generators with active (resp. reactive) power limits that are closer than it (see [4.4](#44-pq-units-domain)) | $1$ (MW, MVAr) | $\mathbb{R}$ | -| `default_variable_scaling_factor` | Default scaling factor applied to all the variables (except reactive slacks and transformer ratios) before ACOPF solving | $1$ | $\mathbb{R}^{*,+}$ | -| `default_constraint_scaling_factor` | Default scaling factor applied to all the constraints before ACOPF solving | $1$ | $\mathbb{R}^{+}$ | -| `reactive_slack_variable_scaling_factor` | Scaling factor applied to all reactive slacks variables before ACOPF solving (see [7](#7-alternative-current-optimal-power-flow)) | $0.1$ | $\mathbb{R}^{*,+}$ | -| `transformer_ratio_variable_scaling_factor` | Scaling factor applied to all transformer ratio variables before ACOPF solving (see [7](#7-alternative-current-optimal-power-flow)) | $0.001$ | $\mathbb{R}^{*,+}$ | -| `shunt_variable_scaling_factor` | Scaling factor applied to all shunt variables before ACOPF solving (see [7](#7-alternative-current-optimal-power-flow)) | $0.1$ | $\mathbb{R}^{*,+}$ | - -Please note that for these parameters, the AMPL code defines default values which may be different from those in Java (for example, for the -scaling values). This allows a user to use the AMPL code without going through the Java interface, and without providing the file `param_algo.txt`. - -In addition to the previous parameters, the user can specify which -parameters will be variable or fixed in the ACOPF solving (see [7](#7-alternative-current-optimal-power-flow)). -This is done using the following files: - -| File | Description | Default behavior of modified values | -|---------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------| -| `param_transformers.txt` | Ratio tap changers with a variable transformation ratio (real variable) | Transformation ratios are fixed | -| `param_shunt.txt` | Shunts with a continuous variable susceptance and which can be modified and/or connected (only if possible bus is defined in `ampl_network_shunts.txt`) | Shunt susceptances are fixed | -| `param_generators_reactive.txt` | Generators with a constant reactive power production. If this value is not consistent (> PQmax), the reactive power production stays variable | Coherent reactive power productions (see [4.5](#45-pq-units-domain)) are variable | -| `param_buses_with_reactive_slack.txt` | Buses with attached reactive slacks if configurable parameter buses_with_reactive_slacks = "CONFIGURED" | Only buses with no reactive power production have reactive slacks attached | - -All of these files share the same format: 2 columns #"num" "id". - -Once again, the user can directly execute the AMPL code without passing these parameters files as input. -If so, empty files will be created during execution. - -#### 3.3 New voltage limits - -In addition to the elements specified in section [3.2](#32-configuration-of-the-run), the user may choose to override -the voltage limits of specified voltage levels. These values must be defined in `ampl_network_substations_override.txt` and -are employed to establish the new voltage limits as specified in section -[4.1](#41-voltage-level-limits-consistency). - -Format of `ampl_network_substations_override.txt`: 4 columns #"num" "minV (pu)" "maxV (pu)" "id" - -### 4 Pre-processing - -Before solving the reactive ACOPF described in [7](#7-alternative-current-optimal-power-flow), -the following pre-processing blocks are executed to ensure the consistency of the values used in the optimization. - -#### 4.1 Voltage level limit consistency - -To ensure consistent voltage level limits for the buses, -the configurable domain [`min_plausible_low_voltage_limit`; `max_plausible_high_voltage_limit`] is used -(see [3.2](#32-configuration-of-the-run)). - -Let $V_{s}^{min}$ (resp. $V_{s}^{max}$) be the low (resp. high) voltage limit of substation $s$ -specified in `ampl_network_substations.txt` (or -in `ampl_network_substations_override.txt` if an override is given for $s$) and $V_{s}^{min,c}$ (resp. $V_{s}^{max,c}$) -its associated corrected low (resp. high) limit. Then, the limits are calculated as follows: -- $V_{s}^{min,c} = \max(V_{s}^{min},$ min_plausible_low_voltage_limit) -- $V_{s}^{max,c} = \min(V_{s}^{max},$ max_plausible_low_voltage_limit) - -#### 4.2 Zero-impedance branches - -Branches with an impedance magnitude, **calculated in per unit**, -lower than the configurable threshold `Znull` (see section [3.2](#32-configuration-of-the-run)) -are considered as non-impedant. -These branches will have their reactance replaced by the threshold `Znull` (in p.u.), -**even if the reactance specified in `ampl_network_branches.txt` is negative**. - -#### 4.3 Impedance of transformers - -In the calculations of the ACOPF (see [7](#7-alternative-current-optimal-power-flow)), -the transformers with an impedance (specified in `ampl_network_branches.txt`) -considered as null (see [4.2](#42-zero-impedance-branches)) -**are treated as lines**. Then, the transformation ratios/phase shifts are ignored, as well as the impedance -specified in the tap changer table `ampl_network_tct.txt`. - -For phase shifters transformers considered as impedant, the reactance values from the tap changer table (in `ampl_network_tct.txt`) -replace the reactance specified in `ampl_network_branches.txt`. The resistance is then calculated proportionally. -For the ratio tap changers, the impedance stays as specified in `ampl_network_branches.txt`. **Please notice there is no -specified handling for cases where resistance and/or reactance is negative or if there is both a ratio tap changer and a -phase shift transformer on the same branch.** - -#### 4.4 P/Q units' domain - -The following corrections apply successively to determine consistent domains for the active -power and reactive power produced by generators. - -To determine the consistent domain of produced active power, the bounds of the domains -$P_g^{min}$ and $P_g^{max}$, as well as the target $P_g^{t}$ of generator $g$ (all specified in `ampl_network_generators.txt`) are used. -Let $P_{g}^{min,c}$ and $P_{g}^{max,c}$ be the corrected active bounds: - -- By default, $P_{g}^{min,c} = \text{defaultPmin}$ and $P_{g}^{max,c} = \text{defaultPmax}$ (see [3.2](#32-configuration-of-the-run)) -- If $|P_g^{max}| \geq \text{PQmax}$, then $P_{g}^{max,c} = \max(\text{defaultPmax}, P_g^t)$ -- If $|P_g^{min}| \geq \text{PQmax}$, then $P_{g}^{min,c} = \min(\text{defaultPmin}, P_g^t)$ -- If $|P_{g}^{max,c} - P_{g}^{min,c}| \leq \text{minimalQPrange}$, then $P_{g}^{max,c} = P_{g}^{min,c} = P_{g}^t$ (active power is fixed). - -To determine the consistent domain of produced reactive power, the reactive power diagram -(specified in `ampl_network_generators.txt`) of generator -$g$ is used: $qp_g$ (resp. $qP_g$) and $Qp_g$ ($QP_g$) when $P_{g}^{min,c}$ (resp. $P_{g}^{max,c}$) is reached. -Let $qp_g^c$ (resp. $qP_g^c$) and $Qp_g^c$ (resp. $QP_g^c$) be the bounds of the corrected reactive diagram, -and $Q_{g}^{min,c}$ and $Q_{g}^{max,c}$ be the corrected reactive bounds: - -- By default, $qp_g^{c} = qP_{g}^{c} = - \text{defaultPmin} \times \text{defaultQmaxPmaxRatio}$ -and $Qp_{g}^{c} = QP_{g}^{c} = \text{defaultPmax} \times \text{defaultQmaxPmaxRatio}$ (see [3.2](#32-configuration-of-the-run)) -- If $|qp_{g}| \geq \text{PQmax}$, then $qp_{g}^{c} = -\text{defaultQmaxPmaxRatio} \times P_{max}^{g,c}$. - Same with $qP_{g}^{c}$. -- If $|Qp_{g}| \geq \text{PQmax}$, then $Qp_{g}^{c} = \text{defaultQmaxPmaxRatio} \times P_{max}^{g,c}$. - Same with $QP_{g}^{c}$. -- If $qp_{g}^{c} > Qp_{g}^{c}$, the values are swapped. Same with $qP_{g}^{c}$ and $QP_{g}^{c}$. -- If the corrected reactive diagram is too small (the distances between the vertices of the reactive diagram are lower than $\text{minimalQPrange}$), - then $qp_{g}^{c} = Qp_{g}^{c} = qP_{g}^{c} = QP_{g}^{c} = \frac{qp_{g}^{c} + Qp_{g}^{c} + qP_{g}^{c} + QP_{g}^{c}}{4}$ (reactive power is fixed). -- $Q_{g}^{min,c} = \min(qp_{g}^{c}, qP_{g}^{c})$ and $Q_{g}^{max,c} = \min(Qp_{g}^{c}, QP_{g}^{c})$ - -Please note that in the end, **the corrected bounds are rectangular**, -not trapezoidal, and they are used only in the reactive OPF -(see [7](#7-alternative-current-optimal-power-flow)). The trapezoidal diagram should be added shortly. -In addition, bounds $qP_{g}^0$ and $Qp_{g}^0$ are not used, -as generators with zero active power will be excluded from the optimisation (see [7.1](#71-generalities)). - -The general correction of the generator's reactive power diagram $g$ -is illustrated in the following figure: - -
- Reactive Diagram Correction -
- -### 5 Slack bus & main connex component - -The slack bus $s$ is determined by identifying the bus with the **highest number of AC branches connected**, -within the main component (`cc` set to $0$ in `ampl_network_buses.txt`). -If multiple buses have such cardinality, the one with the highest identifier (`num` parameter) is chosen. -In the event no bus satisfies these conditions, the first bus defined in `ampl_network_buses.txt` is selected. - -The OPFs are executed on the **main connex component** (i.e. buses connected to slack bus by AC branches) of the network. -Consequently, **buses connected to the slack only by HVDC lines are excluded**. - -This component is determined by solving the following optimization problem (the variables are bolded): - -$$\text{maximize} \left(\sum\limits_{i} \boldsymbol{\theta_i^{cc}}\right)$$ - -where $\boldsymbol{\theta_i^{cc}}$ is the voltage angle of bus $i$, and with the following constraints: - -$$\boldsymbol{\theta_s^{cc}} = 0 \quad (1)$$ - -$$\boldsymbol{\theta_i^{cc}} - \boldsymbol{\theta_j^{cc}} = 0, \quad ij \in BRANCH \quad (2)$$ - -$$0 \leq \boldsymbol{\theta_i^{cc}} \leq 1, \quad i \in BUS \quad (3)$$ - -If the solving is unsuccessful, the script -`reactiveopfexit.run` is executed (see [8.2](#82-in-case-of-inconsistency)) and the execution is stopped. -The sets of buses and branches belonging to the main connex component are now denoted $BUSCC$ and $BRANCHCC$ -, respectively. - -### 6 Direct current optimal power flow - -#### 6.1 Generalities - -Before to address the ACOPF (see [7](#7-alternative-current-optimal-power-flow)), a DCOPF is solved for two main reasons: -- If the DCOPF resolution fails, it provides a strong indication that the ACOPF resolution will also fail. - Thus, it serves as a formal consistency check on the data. -- The phases computed by DCOPF resolution will be used as initial points for the solving of the ACOPF. - -#### 6.2 Optimization problem - -The DCOPF model involves the following constraints, -in addition to the slack constraint $(1)$ introduced in [5](#5-slack-bus--main-connex-component): - -$$\sum\limits_{j\in v(i)} \boldsymbol{p_{ij}} = P_i^{in} + \boldsymbol{\sigma_{P,i}^{+}} - \boldsymbol{\sigma_{P,i}^{-}} - \sum\limits_{g}\boldsymbol{P_{i,g}}, \quad i\in\text{BUSCC} \quad (4)$$ - -where: -- $\boldsymbol{p_{ij}}$ is the active power leaving bus $i$ on branch $ij$, defined as $\boldsymbol{p_{ij}} = \frac{\boldsymbol{\theta_i} - \boldsymbol{\theta_j}}{X_{ij}}$, where -$X_{ij}$ is the reactance of line $ij$ (specified in `ampl_network_branches.txt`). -- $P_i^{in}$ the constant active power injected or consumed in bus $i$ (by batteries, loads, VSC stations and LCC stations). -- $\boldsymbol{P_{i,g}}$ is the variable active power produced by generators of bus $i$. -- $\boldsymbol{\sigma_{P,i}^{+}}$ (resp. $\boldsymbol{\sigma_{P,i}^{-}}$) is a positive slack variable -expressing the excess (resp. shortfall) of active power produced in bus $i$. - -And the following objective function: - -$$\text{minimize} \left(1000 \sum\limits_{i} (\boldsymbol{\sigma_{i}^{P,+}} + \boldsymbol{\sigma_{i}^{P,-}}) + \sum\limits_{g} \left(\frac{\boldsymbol{P_{i,g}} - P_{i,g}^{t}}{\max(1, \frac{P_{i,g}^t}{100})}\right)^2\right)$$ - -where $P_{i,g}^{t}$ is the target of the generator $g$ on bus $i$. - -The sum of the active slack variables ($\boldsymbol{\sigma_{i}^{P,+}}$ and $\boldsymbol{\sigma_{i}^{P,-}}$) is penalized by a -high coefficient ($1000$) to drive it towards $0$, ensuring active power balance at each bus of the network. -The solving of the DCOPF is considered as successful if this sum **does not exceed** the configurable threshold `Pnull` -(see [3.2](#32-configuration-of-the-run)), and if the non-linear solver employed (see [Non-linear solver](#non-linear-optimization-solver)) -finds a feasible solution without reaching one of its default limit. Otherwise, the solving is considered unsuccessful and the script -`reactiveopfexit.run` is executed (see [8.2](#82-in-case-of-inconsistency)). - -### 7 Alternative current optimal power flow - -#### 7.1 Generalities - -The goal of the reactive ACOPF is to compute voltage values on each bus, as well as control values for reactive equipment and controllers of the grid. -Then, the following values will be variable in the optimization: -- $\boldsymbol{V_i}$ and $\boldsymbol{\theta_i}$ the voltage magnitude and phase of bus $i$. -- $\boldsymbol{P_{i,g}}$ (resp. $\boldsymbol{Q_{i,g}}$) the active (resp. reactive) power produced by variable generator $g$ of bus $i$. -- $\boldsymbol{Q_{i,vsc}}$ the reactive power produced by voltage source converter stations $vsc$ of bus $i$. -- $\boldsymbol{b_{i,g}}$ (resp. $\boldsymbol{b_{i,svc}}$) the susceptance of shunt $s$ (resp. of static var compensator $svc$) of bus $i$. -- $\boldsymbol{\rho_{ij}}$ the transformer ratio of the ratio tap changer on branch $ij$, -specified as variable by the user (see [3.2](#32-configuration-of-the-run)). - -Please note that: -- Units with active power specified in `ampl_network_generators.txt` that is less than the configurable parameter `Pnull` **are excluded from the optimization**, - even if the user designates these generators as fixed in the parameter file `param_generators_reactive.txt` (see [3.2](#32-configuration-of-the-run)). - Therefore, when the optimization results are exported, **these generators are exported with a reactive power target of $0$**. -- **Neither current limits nor power limits** on branches are considered in the optimization. - -#### 7.2 Constraints - -The constraints of the optimization problem depend on parameters specified by the user (see [3.2](#32-configuration-of-the-run)). -In particular, the user can indicate which buses will have associated **reactive slacks** $\boldsymbol{\sigma_{i}^{Q,+}}$ and $\boldsymbol{\sigma_{i}^{Q,-}}$ -, expressing the excess (resp. shortfall) of reactive power produced in bus $i$, and used to ensure reactive power balance. -To do so, these buses must be specified in parameter file `param_buses_with_reactive_slack.txt`, and `buses_with_reactive_slacks` must be set to $\text{CONFIGURED}$. - -The ACOPF involves the following constraints, in addition to the slack constraint $(1)$ introduced in [5](#5-slack-bus--main-connex-component): - -$$\sum\limits_{j\in v(i)} \boldsymbol{p_{ij}} = P_i^{in} - \sum\limits_{g}\boldsymbol{P_{i,g}}, \quad i\in\text{BUSCC} \quad (5)$$ - -$$\sum\limits_{j\in v(i)} \boldsymbol{q_{ij}} = Q_i^{in} - \boldsymbol{\sigma_{i}^{Q,+}} + \boldsymbol{\sigma_{Q_i}^{-}} - \sum\limits_{g}\boldsymbol{Q_{i,g}} - \sum\limits_{vsc}\boldsymbol{Q_{i,vsc}} - \sum\limits_{s}\boldsymbol{b_{i,s}}{V_i}^2 - \sum\limits_{svc}\boldsymbol{b_{i,svc}}{V_i}^2, \quad i\in\text{BUSCC} \quad (6)$$ - -where: -- $\boldsymbol{p_{ij}}$ (resp. $\boldsymbol{q_{ij}}$) is the active (resp. reactive) power leaving bus $i$ on branch $ij$, - calculated as defined in the [PowSyBl documentation](https://powsybl.readthedocs.io/projects/powsybl-open-loadflow). - Those are variables because they depend on $\boldsymbol{V_i}$, $\boldsymbol{V_j}$, $\boldsymbol{\theta_i}$, $\boldsymbol{\theta_j}$ and $\boldsymbol{\rho_{ij}}$. -- $P_i^{in}$ is the constant active power injected or consumed in bus $i$ by batteries, loads, VSC stations and LCC stations. -- $Q_i^{in}$ is the constant reactive power injected or consumed in bus $i$, by fixed generators and fixed shunts (see [3.2](#32-configuration-of-the-run)), batteries, loads and LCC stations. - -In order to bound the variables described in [7.1](#71-generalities), the limits specified in the files of network data (see [3.1](#31-network-data)) -are used. We specify the following special treatments: -- The voltage magnitude $\boldsymbol{V_i}$ lies between the corrected voltage limits described in [4.1](#41-voltage-level-limits-consistency). -- The reactive power $\boldsymbol{Q_{i,g}}$ produced by unit $g$ lies between the corrected limits described in [4.4](#44-pq-units-domain). -- The active power $\boldsymbol{P_{i,g}}$ also lies between the corrected limits described in [4.4](#44-pq-units-domain), -but these bounds are only considered when the configurable parameter $\alpha$ is different than $1$ (default value). -Otherwise, all active powers evolve proportionally to their initial point $P_{i,g}^t$ (specified in `ampl_network_generators.txt`): -$\boldsymbol{P_{i,g}} = P_{i,g}^t + \boldsymbol{\gamma} (P_{g}^{max,c} - P_{i,g}^t)$, where $\boldsymbol{\gamma}$ is optimized and lies in $\[-1;1\]$. -- The reactive power $\boldsymbol{Q_{i,vsc}}$ produced by voltage source converter station $vsc$ is included in $\[\min(qP_{vsc}, qp_{vsc}, qp_{vsc}^0)$; $\max(QP_{vsc}, Qp_{vsc}, Qp_{vsc}^0)\]$. -**The bounds are therefore rectangular, not trapezoidal.** - -#### 7.3 Objective function - -The objective function also depends on parameters specified by the user (see [3.2](#32-configuration-of-the-run)). -The `objective_choice` parameter modifies the values of penalties $\beta_1$, $\beta_2$, and $\beta_3$ in the objective function: -if `objective_choice` $= i$, then $\beta_i = 1$ and $\beta_j = 0.01$ for $j \neq i$. - -Specifically, if `objective_choice` takes on: -- $0$, the minimization of active power production $\sum\limits_{i,g}\boldsymbol{P_{i,g}}$ is prioritized. -- $1$, the minimization of $\sum\limits_{i} \boldsymbol{V_i}-(\rho V_i^{c,max} - (1-\rho)V_i^{c,min})^2$ is prioritized ($\rho$ -equals the configurable parameter `ratio_voltage_target`). -- $2$, the minimization of $\sum\limits_{i} (\boldsymbol{V_i} - V_i^t)^2$ is prioritized. - -The objective function of the ACOPF is: -$$\text{minimize} \left( 10\sum\limits_{i} (\boldsymbol{\sigma_{i}^{Q,+}} + \boldsymbol{\sigma_{i}^{Q,-}}) + \beta_1 \sum\limits_{g} \left( \alpha\boldsymbol{P_{i,g}} + (1-\alpha)(\frac{\boldsymbol{P_{i,g}} - P_{i,g}^t}{\max(1, |P_{i,g}^t|)})^2 \right) + \beta_2 \sum\limits_{i} \left( \boldsymbol{V_i} - (1-\rho)V_{i}^{min,c} + \rho V_{i}^{max,c} \right)^2 + \beta_3 \sum\limits_{i} (\boldsymbol{V_i} - V_i^t)^2 + 0.1 \sum\limits_{g} \left(\frac{\boldsymbol{Q_{i,g}}}{\max(1,Q_{g}^{min,c}, Q_{g}^{max,c})}\right)^2 + 0.1 \sum\limits_{ij} (\boldsymbol{\rho_{ij}} - \rho_{ij})^2 \right)$$ - -where: -- $P_{i,g}^t$ (resp. $V_i^t$) is the active target (resp. voltage initial point) specified in `ampl_network_generators.txt` (resp. `ampl_network_buses.txt`). -- $\rho_{ij}$ is the transformer ratio of line $ij$, specified in `ampl_network_tct.txt`. - -The sum of the reactive slack variables is penalized by a -high coefficient ($10$) to drive it towards $0$, ensuring reactive power balance at each bus of the network. - -#### 7.4 Solving - -Before solving the ACOPF, the voltage magnitudes $\boldsymbol{V_i}$ are warm-started with $V_i^t$ -(specified in `ampl_network_buses.txt`), as well as the voltage phases $\boldsymbol{\theta_i}$ with the results of the DCOPF (see [6](#6-direct-current-optimal-power-flow)). -Please also note that a scaling is applied with user-defined values before solving the ACOPF. - -The solving is considered as successful if the non-linear solver employed (see [Non-linear solver](#non-linear-optimization-solver)) -finds a feasible approximate solution (**even if the sum of -slacks is important**), and the script `reactiveopfoutput.run` is executed (see [8.1](#81-in-case-of-convergence)). - -Note that if the solving of ACOPF fails, and the $\alpha$ parameter is set to $1$ (default value), -then a new resolution is attempted, with $\alpha$ set to zero. This gives more freedom to the active powers -produced (see [7.2](#72-constraints)), leaving these variables free withing their respective bounds. - -If ACOPF solving fails another time, the script `reactiveopfexit.run` is executed (see [8.2](#82-in-case-of-inconsistency)). - -### 8 Output - -#### 8.1 In case of convergence - -After the solving of the ACOPF, the script `reactiveopfoutput.run` is executed - and the following files (except `reactiveopf_results_indic.txt`) are exported only if the solving -is considered as successful (see [7](#7-alternative-current-optimal-power-flow)): - -| File | Content | Format | -|---------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------| -| `reactiveopf_results_indic.txt` | General information (system OS, computation time, etc.). The configurable thresholds/parameters (see section [3.2](#32-configuration-of-the-run)). The cardinality of the sets (number of non-impedance branches, number of slack variables, etc.). Information about calculated angles (maximum/minimum theta, maximum difference between neighbors, etc.). | | -| `reactiveopf_results_static_var_compensators.csv` | Calculated voltage and reactive power values for the SVC that regulate voltage. | 6 columns #"variant" "num" "bus" "vRegul" "V(pu)" "Q(MVAr)" | -| `reactiveopf_results_shunts.csv` | Calculated reactive power (and susceptance) values for shunts that were either connected or modified after the optimization problems were resolved. | 6 columns #"variant" "num" "bus" "b(pu)" "Q(MVAr)" "section" | -| `reactiveopf_results_generators.csv` | Calculated active and reactive power values for generating units. | 9 columns #"variant" "num" "bus" "vRegul" "V(pu)" "targetP(MW)" "targetQ(MVAr)" "P(MW)" "Q(MW)" | -| `reactiveopf_results_vsc_converter_stations.csv` | Calculated reactive power values for VSC converter stations. | 8 columns #"variant" "num" "bus" "vRegul" "targetV(pu)" "targetQ(MVAr)" "P(MW)" "Q(MVAr)" | -| `reactiveopf_results_rtc.csv` | RTCs and associated taps, with transformer ratio closest to the one calculated after the optimization. | 3 columns #"variant" "num" "tap" | -| `reactiveopf_results_reactive_slacks.csv` | Calculated reactive slack variables $\boldsymbol{\sigma^{Q,-}}$ and $\boldsymbol{\sigma^{Q,+}}$. | 6 columns #"variant" "bus" "slack_condensator(MVAr)" "slack_self(MVAr)" "id" "substation" | -| `reactiveopf_results_voltages.csv` | Calculated voltages for each bus of the main connex component (see [5](#5-slack-bus--main-connex-component)). | 5 columns #"variant" "bus" "V(pu)" "theta(rad)" "id" | - -If ACOPF solving is not successful, the user can export the following optional files (aiding for the analysis of ACOPF results) by specifying the - ampl log parameter to a debug level (see [3.2](#32-configuration-of-the-run)): - -| File | Content | Format | -|--------------------------------------------|------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------| -| `debug_bus.csv` | Information on calculated voltages (values, bounds, repartition, etc.). | 13 columns #"bus_id" "Vnom" "V" "Vlb" "Vub" "Vmin_mod" "Vmax_mod" "Vmin_OK" "Vmax_OK" "Vmin_ori" "Vmax_ori" "sQ1" "sQ2" | -| `reactiveopf_results_generators_Pnull.csv` | Information on units that are excluded from the solving of ACOPF (see [7](#7-alternative-current-optimal-power-flow)). | 11 columns #"variant" "num" "bus" "vRegul" "V(pu)" "targetP(MW)" "targetQ(Mvar)" "P(MW)" "Q(MW)" "id" "bus_id" | - -#### 8.2 In case of inconsistency - -If the computation of the main connex component (see [5](#5-slack-bus--main-connex-component)) or -of the DCOPF fails (see [6](#6-direct-current-optimal-power-flow)), -the problem is considered as inconsistent. -Then, the script `reactiveopfexit.run` is executed and the file `reactiveopf_results_indic.txt` described in [8.1](#81-in-case-of-convergence) - is exported, without the information on the calculated angles. diff --git a/open-reac/image/reactive-diagram.PNG b/open-reac/image/reactive-diagram.PNG deleted file mode 100644 index 5d3fe2a380d84472c6dd927dcd6503df7161c0eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14258 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