def test_no_flexibility_limits(self): p_max = 10 for p_plus in [None, p_max]: spec = np.array([ 2, 1, 1, None, p_max, 1, 2, -3, p_plus, None, 1, -1, None, None, None ]) gen = Generator(spec, self.bus_ids, self.baseMVA) self.assertEqual(gen.tau_1, 0) self.assertEqual(gen.tau_2, 0) q_max = 5 for q_plus in [None, q_max]: spec = np.array([ 2, 1, 1, None, 10, 1, q_max, -3, 5, None, q_plus, -1, None, None, None ]) gen = Generator(spec, self.bus_ids, self.baseMVA) self.assertEqual(gen.tau_1, 0) q_min = -3 for q_minus in [None, q_min]: spec = np.array([ 2, 1, 1, None, 10, 1, 2, q_min, 5, None, 1, q_minus, None, None, None ]) gen = Generator(spec, self.bus_ids, self.baseMVA) self.assertEqual(gen.tau_2, 0)
def test_default_q_values(self): # q_max = None spec = np.array([ 2, 1, 1, None, 10, 1, None, 1, None, None, None, None, None, None, None ]) gen = Generator(spec, self.bus_ids, self.baseMVA) self.assertEqual(gen.q_max, np.inf) # q_min = None spec = np.array([ 2, 1, 1, None, 10, 1, 10, None, None, None, None, None, None, None, None ]) gen = Generator(spec, self.bus_ids, self.baseMVA) self.assertEqual(gen.q_min, -np.inf)
def test_infeasible_q_bounds(self): spec = np.array([ 2, 1, 1, None, 10, 1, 1, 2, None, None, None, None, None, None, None ]) with self.assertRaises(GenSpecError): Generator(spec, self.bus_ids, self.baseMVA)
def test_negative_p_min(self): spec = np.array([ 2, 1, 1, None, 10, -1, 10, -10, None, None, None, None, None, None, None ]) with self.assertRaises(GenSpecError): Generator(spec, self.bus_ids, self.baseMVA)
def test_simple_gen(self): spec = np.array( [2, 1, 1, None, 10, 1, 10, -10, 5, None, 5, -5, None, None, None]) gen = Generator(spec, self.bus_ids, self.baseMVA) self.assertEqual(gen.dev_id, spec[0]) self.assertEqual(gen.bus_id, spec[1]) self.assertEqual(gen.type, spec[2]) self.assertIsNone(gen.qp_ratio) self.assertEqual(gen.p_max, spec[4] / self.baseMVA) self.assertEqual(gen.p_min, spec[5] / self.baseMVA) self.assertEqual(gen.q_max, spec[6] / self.baseMVA) self.assertEqual(gen.q_min, spec[7] / self.baseMVA) self.assertEqual(gen.p_plus, spec[8] / self.baseMVA) self.assertEqual(gen.p_minus, None) self.assertEqual(gen.q_plus, spec[10] / self.baseMVA) self.assertEqual(gen.q_minus, spec[11] / self.baseMVA) self.assertIsNone(gen.soc_max) self.assertIsNone(gen.soc_min) self.assertIsNone(gen.eff) self.assertFalse(gen.is_slack) tau_1 = (spec[10] - spec[6]) / (spec[4] - spec[8]) tau_2 = (spec[11] - spec[7]) / (spec[4] - spec[8]) self.assertAlmostEqual(gen.tau_1, tau_1, places=5) self.assertAlmostEqual(gen.tau_2, tau_2, places=5) self.assertIsNone(gen.tau_3) self.assertIsNone(gen.tau_4) rho_1 = (spec[6] - tau_1 * spec[8]) / self.baseMVA rho_2 = (spec[7] - tau_2 * spec[8]) / self.baseMVA self.assertAlmostEqual(gen.rho_1, rho_1, places=5) self.assertAlmostEqual(gen.rho_2, rho_2, places=5) self.assertIsNone(gen.rho_3) self.assertIsNone(gen.rho_4)
def test_q_minus(self): # q_minus < q_min and q_minus > q_max for q_minus in [0.5, 11]: spec = np.array([ 2, 1, 1, None, 10, 1, 10, 1, None, None, None, q_minus, None, None, None ]) with self.assertRaises(GenSpecError): Generator(spec, self.bus_ids, self.baseMVA) # q_minus = None spec = np.array([ 2, 1, 1, None, 10, 1, 15, 1, None, None, None, None, None, None, None ]) gen = Generator(spec, self.bus_ids, self.baseMVA) self.assertEqual(gen.q_minus, spec[7] / self.baseMVA)
def test_p_minus(self): for p_minus in [None, 0, -1, 1]: spec = np.array([ 2, 1, 1, None, 10, 1, 10, 1, None, p_minus, None, None, None, None, None ]) gen = Generator(spec, self.bus_ids, self.baseMVA) self.assertIsNone(gen.p_minus)
def test_p_plus(self): # p_plus < p_min and p_plus > p_max for p_plus in [0.5, 11]: spec = np.array([ 2, 1, 1, None, 10, 1, 10, 1, p_plus, None, None, None, None, None, None ]) with self.assertRaises(GenSpecError): Generator(spec, self.bus_ids, self.baseMVA) # p_plus = None spec = np.array([ 2, 1, 1, None, 10, 1, 10, 1, None, None, None, None, None, None, None ]) gen = Generator(spec, self.bus_ids, self.baseMVA) self.assertEqual(gen.p_plus, spec[4] / self.baseMVA)
def test_slack_gen(self): spec = np.array([ 2, 1, 0, None, 10, 1, 10, -10, 5, None, None, None, None, None, None ]) gen = Generator(spec, self.bus_ids, self.baseMVA) self.assertTrue(gen.is_slack)
def test_setting_infeasible_ppot(self): spec = np.array([ 2, 1, 1, None, 10, 1, 2, -3, None, None, None, None, None, None, None ]) gen = Generator(spec, self.bus_ids, self.baseMVA) for p_pot in np.random.uniform(-10, 10, 50) / self.baseMVA: gen.p_pot = p_pot true = np.clip(p_pot, spec[5] / self.baseMVA, spec[4] / self.baseMVA) self.assertAlmostEqual(gen.p_pot, float(true), places=5)
def test_map_pq_with_flex_limits(self): spec = np.array( [2, 1, 1, None, 10, 1, 2, -2, 9, None, 1, -1, None, None, None]) gen = Generator(spec, self.bus_ids, self.baseMVA) points = np.array([(-1, 0.5), (5, 5), (5, -5), (12, 0), (10, 2), (10, -2)]) / self.baseMVA mapped = np.array([(1, 0.5), (5, 2), (5, -2), (10, 0), (9.5, 1.5), (9.5, -1.5)]) / self.baseMVA for p, m in zip(points, mapped): gen.map_pq(p[0], p[1]) self.assertAlmostEqual(gen.p, m[0], places=5) self.assertAlmostEqual(gen.q, m[1], places=5)
def test_defaut_p_values(self): # p_max = None spec = np.array([ 2, 1, 1, None, None, 1, 10, 1, None, None, None, None, None, None, None ]) gen = Generator(spec, self.bus_ids, self.baseMVA) self.assertEqual(gen.p_max, np.inf) # p_max = 0 spec = np.array([ 2, 1, 1, None, 0, 0, 10, 1, None, None, None, None, None, None, None ]) gen = Generator(spec, self.bus_ids, self.baseMVA) self.assertEqual(gen.p_max, 0) # p_min = None spec = np.array([ 2, 1, 1, None, 10, None, 10, 1, None, None, None, None, None, None, None ]) gen = Generator(spec, self.bus_ids, self.baseMVA) self.assertEqual(gen.p_min, 0)
def test_map_pq_no_flexibility_limits(self): spec = np.array([ 2, 1, 1, None, 10, 1, 2, -3, None, None, None, None, None, None, None ]) gen = Generator(spec, self.bus_ids, self.baseMVA) ps = np.random.uniform(-10, 10, 10) / self.baseMVA qs = np.random.uniform(-10, 10, 10) / self.baseMVA p_pots = np.random.uniform(spec[5], spec[4], 10) / self.baseMVA for p in ps: for q in qs: for p_pot in p_pots: gen.p_pot = p_pot gen.map_pq(p, q) true_p = np.clip(p, spec[5] / self.baseMVA, np.minimum(spec[4] / self.baseMVA, p_pot)) true_q = np.clip(q, spec[7] / self.baseMVA, spec[6] / self.baseMVA) self.assertAlmostEqual(gen.p, true_p, places=5) self.assertAlmostEqual(gen.q, true_q, places=5)
def test_infeasible_q_plus_minus(self): # q_minus > q_plus spec = np.array( [2, 1, 1, None, 10, 1, 15, 1, None, None, 1, 2, None, None, None]) with self.assertRaises(GenSpecError): Generator(spec, self.bus_ids, self.baseMVA)