Skip to content

Commit

Permalink
Fix iteration count (#119)
Browse files Browse the repository at this point in the history
Signed-off-by: Geoffroy Jamgotchian <geoffroy.jamgotchian@gmail.com>
  • Loading branch information
geofjamg committed Jul 21, 2019
1 parent 015fe34 commit d4a11ca
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 57 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@
import com.powsybl.loadflow.simple.ac.nr.*;
import com.powsybl.loadflow.simple.equations.EquationContext;
import com.powsybl.loadflow.simple.equations.EquationSystem;
import com.powsybl.loadflow.simple.network.PerUnit;
import com.powsybl.loadflow.simple.network.LfNetwork;
import com.powsybl.loadflow.simple.network.PerUnit;
import com.powsybl.math.matrix.MatrixFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Expand All @@ -28,8 +28,6 @@ public class AcloadFlowEngine {

private static final Logger LOGGER = LoggerFactory.getLogger(AcloadFlowEngine.class);

private static final String INITIAL_MACRO_ACTION_NAME = "Init";

private final LfNetwork network;

private final VoltageInitializer voltageInitializer;
Expand All @@ -52,45 +50,24 @@ public AcloadFlowEngine(LfNetwork network, VoltageInitializer voltageInitializer
this.observer = Objects.requireNonNull(observer);
}

private NewtonRaphsonResult runNewtowRaphson(LfNetwork network, EquationContext equationContext,
EquationSystem equationSystem, NewtonRaphsonParameters newtonRaphsonParameters,
int newtonRaphsonIteration, int macroIteration, String macroActionName) {
observer.beginMacroIteration(macroIteration, macroActionName);

// for next macro iteration, restart from previous voltage
VoltageInitializer macroIterationVoltageInitializer = macroIteration == 0 ? this.voltageInitializer
: new PreviousValueVoltageInitializer();

NewtonRaphsonResult newtonRaphsonResult = new NewtonRaphson(network, matrixFactory, observer, equationContext,
equationSystem, macroIterationVoltageInitializer,
stoppingCriteria, newtonRaphsonIteration)
.run(newtonRaphsonParameters);

observer.endMacroIteration(macroIteration, macroActionName);

return newtonRaphsonResult;
}

public AcLoadFlowResult run() {
Stopwatch stopwatch = Stopwatch.createStarted();

NewtonRaphsonParameters nrParameters = new NewtonRaphsonParameters();

observer.beforeEquationSystemCreation();

EquationContext equationContext = new EquationContext();
EquationSystem equationSystem = AcEquationSystem.create(network, equationContext);

observer.afterEquationSystemCreation();

// initial macro iteration
int macroIteration = 0;
NewtonRaphson newtonRaphson = new NewtonRaphson(network, matrixFactory, observer, equationContext, equationSystem, stoppingCriteria);

// initial Newton-Raphson
NewtonRaphsonResult lastNrResult = newtonRaphson.run(new NewtonRaphsonParameters().setVoltageInitializer(voltageInitializer));

NewtonRaphsonResult lastNrResult = runNewtowRaphson(network, equationContext, equationSystem,
nrParameters, 0,
macroIteration++, INITIAL_MACRO_ACTION_NAME);
// for each macro action run macro iterations until stabilized
// macro actions are nested: inner most loop first in the list
int macroIteration = 0;
for (MacroAction macroAction : macroActions) {
// re-run macro action + newton-raphson until stabilization
boolean cont;
Expand All @@ -102,14 +79,18 @@ public AcLoadFlowResult run() {
observer.afterMacroActionRun(macroIteration, macroAction.getName(), cont);

if (cont) {
int nextNrIteration = lastNrResult.getIteration() + 1;
lastNrResult = runNewtowRaphson(network, equationContext, equationSystem,
nrParameters, nextNrIteration,
macroIteration, macroAction.getName());
int nrIteration = lastNrResult.getIteration();

observer.beginMacroIteration(macroIteration, macroAction.getName());

// restart from previous voltage
lastNrResult = newtonRaphson.run(new NewtonRaphsonParameters().setVoltageInitializer(new PreviousValueVoltageInitializer()));

observer.endMacroIteration(macroIteration, macroAction.getName());

// if newton raphson exit without running any iteration, it means that
// macro action is stabilized, so we pass to next macro action
if (lastNrResult.getIteration() == nextNrIteration) {
if (lastNrResult.getIteration() == nrIteration) {
cont = false;
} else {
macroIteration++;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
*/
package com.powsybl.loadflow.simple.ac.nr;

import com.google.common.base.Stopwatch;
import com.powsybl.loadflow.simple.ac.macro.AcLoadFlowObserver;
import com.powsybl.loadflow.simple.equations.*;
import com.powsybl.loadflow.simple.network.LfBus;
Expand All @@ -19,7 +18,6 @@

import java.util.List;
import java.util.Objects;
import java.util.concurrent.TimeUnit;

/**
* @author Geoffroy Jamgotchian <geoffroy.jamgotchian at rte-france.com>
Expand All @@ -38,11 +36,9 @@ public class NewtonRaphson {

private final EquationSystem equationSystem;

private final VoltageInitializer voltageInitializer;

private final NewtonRaphsonStoppingCriteria stoppingCriteria;

private int iteration;
private int iteration = -1;

static class NewtonRaphsonContext {

Expand All @@ -58,21 +54,17 @@ static class NewtonRaphsonContext {
}

public NewtonRaphson(LfNetwork network, MatrixFactory matrixFactory, AcLoadFlowObserver observer,
EquationContext equationContext, EquationSystem equationSystem, VoltageInitializer voltageInitializer,
NewtonRaphsonStoppingCriteria stoppingCriteria, int iteration) {
EquationContext equationContext, EquationSystem equationSystem,
NewtonRaphsonStoppingCriteria stoppingCriteria) {
this.network = Objects.requireNonNull(network);
this.matrixFactory = Objects.requireNonNull(matrixFactory);
this.observer = Objects.requireNonNull(observer);
this.equationContext = Objects.requireNonNull(equationContext);
this.equationSystem = Objects.requireNonNull(equationSystem);
this.voltageInitializer = Objects.requireNonNull(voltageInitializer);
this.stoppingCriteria = Objects.requireNonNull(stoppingCriteria);
this.iteration = iteration;
}

private NewtonRaphsonStatus runIteration(int iteration, EquationSystem system, NewtonRaphsonContext context) {
observer.beginIteration(iteration);

private NewtonRaphsonStatus runIteration(EquationSystem system, NewtonRaphsonContext context) {
// evaluate equations
observer.beforeEquationEvaluation(iteration);

Expand All @@ -83,7 +75,6 @@ private NewtonRaphsonStatus runIteration(int iteration, EquationSystem system, N
observer.afterEquationEvaluation(context.fx, system, iteration);

if (stoppingCriteria.test(context.fx, observer)) {
observer.endIteration(iteration);
return NewtonRaphsonStatus.CONVERGED;
}

Expand Down Expand Up @@ -121,15 +112,19 @@ private NewtonRaphsonStatus runIteration(int iteration, EquationSystem system, N
return NewtonRaphsonStatus.SOLVER_FAILED;
}

observer.endIteration(iteration);

observer.beforeStateUpdate(iteration);

// update x
Vectors.minus(context.x, context.fx);

observer.afterStateUpdate(context.x, system, iteration);

observer.endIteration(iteration);

iteration++;

observer.beginIteration(iteration);

return null;
}

Expand All @@ -153,27 +148,30 @@ private double computeSlackBusActivePowerMismatch(EquationContext equationContex
public NewtonRaphsonResult run(NewtonRaphsonParameters parameters) {
Objects.requireNonNull(parameters);

Stopwatch stopwatch = Stopwatch.createStarted();

NewtonRaphsonContext context = new NewtonRaphsonContext();

// initialize state vector (flat start)
context.x = equationSystem.initState(voltageInitializer);
context.x = equationSystem.initState(parameters.getVoltageInitializer());

// initialize target vector
context.targets = equationSystem.initTargets();

// initialize mismatch vector (difference between equation values and targets)
context.fx = new double[equationSystem.getEquationsToSolve().size()];

if (iteration == -1) {
// first run
iteration = 0;
observer.beginIteration(iteration);
}

NewtonRaphsonStatus status = NewtonRaphsonStatus.NO_CALCULATION;
while (iteration <= parameters.getMaxIteration()) {
NewtonRaphsonStatus newStatus = runIteration(iteration, equationSystem, context);
NewtonRaphsonStatus newStatus = runIteration(equationSystem, context);
if (newStatus != null) {
status = newStatus;
break;
}
iteration++;
}

if (context.lu != null) {
Expand All @@ -188,9 +186,6 @@ public NewtonRaphsonResult run(NewtonRaphsonParameters parameters) {

double slackBusActivePowerMismatch = computeSlackBusActivePowerMismatch(equationContext, equationSystem);

stopwatch.stop();
LOGGER.debug("Newton Raphson done in {} ms", stopwatch.elapsed(TimeUnit.MILLISECONDS));

return new NewtonRaphsonResult(status, iteration, slackBusActivePowerMismatch);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
*/
package com.powsybl.loadflow.simple.ac.nr;

import java.util.Objects;

/**
* @author Geoffroy Jamgotchian <geoffroy.jamgotchian at rte-france.com>
*/
Expand All @@ -15,6 +17,8 @@ public class NewtonRaphsonParameters {

private int maxIteration = DEFAULT_MAX_ITERATION;

private VoltageInitializer voltageInitializer = new UniformValueVoltageInitializer();

public int getMaxIteration() {
return maxIteration;
}
Expand All @@ -26,4 +30,13 @@ public NewtonRaphsonParameters setMaxIteration(int maxIteration) {
this.maxIteration = maxIteration;
return this;
}

public VoltageInitializer getVoltageInitializer() {
return voltageInitializer;
}

public NewtonRaphsonParameters setVoltageInitializer(VoltageInitializer voltageInitializer) {
this.voltageInitializer = Objects.requireNonNull(voltageInitializer);
return this;
}
}

0 comments on commit d4a11ca

Please sign in to comment.