Source code for gridopt.power_flow.dc_pf

#*****************************************************#
# This file is part of GRIDOPT.                       #
#                                                     #
# Copyright (c) 2015, Tomas Tinoco De Rubira.         #
#                                                     #
# GRIDOPT is released under the BSD 2-clause license. #
#*****************************************************#

from __future__ import print_function
import time
import numpy as np
from .method_error import *
from .method import PFmethod

[docs]class DCPF(PFmethod): """ DC power flow method. """ name = 'DCPF' _parameters = {'quiet': False, 'solver' : 'superlu'} def __init__(self): PFmethod.__init__(self) self._parameters = DCPF._parameters.copy() self._parameters['solver_parameters'] = {'superlu': {}, 'mumps': {}} def create_problem(self,net): import pfnet # Parameters params = self._parameters # Clear flags net.clear_flags() # Voltages angles (not slack) net.set_flags('bus', 'variable', 'not slack', 'voltage angle') # Gen active powers (slack) net.set_flags('generator', 'variable', 'slack', 'active power') # Check try: assert(net.num_vars == net.num_buses-1+net.get_num_slack_gens()) except AssertionError: raise PFmethodError_BadProblem() # Set up problem problem = pfnet.Problem(net) problem.add_constraint(pfnet.Constraint('DC power balance',net)) problem.add_constraint(pfnet.Constraint('generator active power participation',net)) problem.analyze() # Return return problem def solve(self,net): from optalg.lin_solver import new_linsolver # Parameters params = self._parameters solver_name = params['solver'] # Copy network net = net.get_copy(merge_buses=True) # Problem t0 = time.time() problem = self.create_problem(net) problem_time = time.time()-t0 A = problem.A b = problem.b x = problem.x # Solve update = True t0 = time.time() try: assert(A.shape[0] == A.shape[1]) linsolver = new_linsolver(solver_name,'unsymmetric') linsolver.analyze(A) x = linsolver.factorize_and_solve(A,b) except Exception as e: update = False raise PFmethodError_SolverError(e) finally: # Update network if update: net.set_var_values(x) net.update_properties() net.clear_sensitivities() # Save results self.set_solver_name(solver_name) self.set_solver_status('solved' if update else 'error') self.set_solver_message('') self.set_solver_iterations(1) self.set_solver_time(time.time()-t0) self.set_solver_primal_variables(x) self.set_solver_dual_variables(4*[None]) self.set_problem(None) # skip for now self.set_problem_time(problem_time) self.set_network_snapshot(net)