@@ -272,229 +272,6 @@ TEST_CASE("Test main model - power flow") {
272
272
}
273
273
}
274
274
275
- TEST_CASE (" Test main model - individual output (symmetric)" ) {
276
- State state;
277
- auto main_model = default_model (state);
278
-
279
- auto const res = main_model.calculate <power_flow_t , symmetric_t >(
280
- get_default_options (symmetric, CalculationMethod::newton_raphson));
281
-
282
- SUBCASE (" SymVoltageSensor, sym output" ) { // TODO(mgovers): sensor output for powerflow calculations are not tested
283
- // elsewhere => validation case
284
- main_model.output_result <Node>(res, state.sym_node );
285
- main_model.output_result <SymVoltageSensor>(res, state.sym_voltage_sensor );
286
-
287
- CHECK (state.sym_voltage_sensor [0 ].u_residual == doctest::Approx (1.01 * 10.0e3 - state.sym_node [0 ].u ));
288
- CHECK (state.sym_voltage_sensor [1 ].u_residual == doctest::Approx (1.02 * 10.0e3 - state.sym_node [1 ].u ));
289
- CHECK (state.sym_voltage_sensor [0 ].u_angle_residual == doctest::Approx (0.1 - state.sym_node [0 ].u_angle ));
290
- CHECK (state.sym_voltage_sensor [1 ].u_angle_residual == doctest::Approx (0.2 - state.sym_node [1 ].u_angle ));
291
- }
292
-
293
- SUBCASE (" SymPowerSensor, sym output" ) { // TODO(mgovers): sensor output for powerflow calculations are not tested
294
- // elsewhere => validation case
295
- main_model.output_result <Line>(res, state.sym_line );
296
- main_model.output_result <Link>(res, state.sym_link );
297
- main_model.output_result <Source>(res, state.sym_source );
298
- main_model.output_result <SymLoad>(res, state.sym_load_sym );
299
- main_model.output_result <AsymLoad>(res, state.sym_load_asym );
300
- main_model.output_result <Shunt>(res, state.sym_shunt );
301
- main_model.output_result <SymPowerSensor>(res, state.sym_power_sensor );
302
-
303
- CHECK (state.sym_power_sensor [0 ].p_residual == doctest::Approx (1.1e6 - state.sym_line [0 ].p_from ));
304
- CHECK (state.sym_power_sensor [0 ].q_residual == doctest::Approx (1.1e3 - state.sym_line [0 ].q_from ));
305
- CHECK (state.sym_power_sensor [1 ].p_residual == doctest::Approx (1.3e6 - state.sym_source [0 ].p ));
306
- CHECK (state.sym_power_sensor [1 ].q_residual == doctest::Approx (1.3e3 - state.sym_source [0 ].q ));
307
- CHECK (state.sym_power_sensor [2 ].p_residual == doctest::Approx (1.4e6 - state.sym_source [0 ].p ));
308
- CHECK (state.sym_power_sensor [2 ].q_residual == doctest::Approx (1.4e3 - state.sym_source [0 ].q ));
309
- CHECK (state.sym_power_sensor [3 ].p_residual == doctest::Approx (1.5e6 - state.sym_shunt [0 ].p ));
310
- CHECK (state.sym_power_sensor [3 ].q_residual == doctest::Approx (1.5e3 - state.sym_shunt [0 ].q ));
311
- CHECK (state.sym_power_sensor [4 ].p_residual == doctest::Approx (1.6e6 - state.sym_load_sym [0 ].p ));
312
- CHECK (state.sym_power_sensor [4 ].q_residual == doctest::Approx (1.6e3 - state.sym_load_sym [0 ].q ));
313
- CHECK (state.sym_power_sensor [5 ].p_residual == doctest::Approx (1.7e6 - state.sym_load_asym [0 ].p ));
314
- CHECK (state.sym_power_sensor [5 ].q_residual == doctest::Approx (1.7e3 - state.sym_load_asym [0 ].q ));
315
- CHECK (state.sym_power_sensor [6 ].p_residual ==
316
- doctest::Approx (3.0e6 - (state.sym_source [1 ].p - state.sym_load_sym [0 ].p - state.sym_load_asym [0 ].p )));
317
- CHECK (state.sym_power_sensor [6 ].q_residual ==
318
- doctest::Approx (3.0e3 - (state.sym_source [1 ].q - state.sym_load_sym [0 ].q - state.sym_load_asym [0 ].q )));
319
- }
320
-
321
- SUBCASE (" AsymVoltageSensor, sym output" ) { // TODO(mgovers): sensor output for powerflow calculations are not tested
322
- // elsewhere => validation case
323
- main_model.output_result <Node>(res, state.sym_node );
324
- main_model.output_result <AsymVoltageSensor>(res, state.asym_voltage_sensor_sym_output );
325
-
326
- CHECK (state.asym_voltage_sensor_sym_output [0 ].u_residual == doctest::Approx (10.32e3 - state.sym_node [2 ].u ));
327
- CHECK (state.asym_voltage_sensor_sym_output [0 ].u_angle_residual ==
328
- doctest::Approx (0.0 - state.sym_node [2 ].u_angle ));
329
- }
330
-
331
- SUBCASE (" AsymPowerSensor, sym output" ) { // TODO(mgovers): sensor output for powerflow calculations are not tested
332
- // elsewhere => validation case
333
- main_model.output_result <Line>(res, state.sym_line );
334
- main_model.output_result <Link>(res, state.sym_link );
335
- main_model.output_result <Source>(res, state.sym_source );
336
- main_model.output_result <SymLoad>(res, state.sym_load_sym );
337
- main_model.output_result <AsymLoad>(res, state.sym_load_asym );
338
- main_model.output_result <Shunt>(res, state.sym_shunt );
339
- main_model.output_result <AsymPowerSensor>(res, state.asym_power_sensor_sym_output );
340
-
341
- CHECK (state.asym_power_sensor_sym_output [0 ].p_residual ==
342
- doctest::Approx (3 * 2.12e6 - state.sym_line [0 ].p_from ));
343
- CHECK (state.asym_power_sensor_sym_output [0 ].q_residual ==
344
- doctest::Approx (3 * 2.12e3 - state.sym_line [0 ].q_from ));
345
- CHECK (state.asym_power_sensor_sym_output [1 ].p_residual == doctest::Approx (3 * 2.32e6 - state.sym_source [0 ].p ));
346
- CHECK (state.asym_power_sensor_sym_output [1 ].q_residual == doctest::Approx (3 * 2.32e3 - state.sym_source [0 ].q ));
347
- CHECK (state.asym_power_sensor_sym_output [2 ].p_residual == doctest::Approx (3 * 2.42e6 - state.sym_source [0 ].p ));
348
- CHECK (state.asym_power_sensor_sym_output [2 ].q_residual == doctest::Approx (3 * 2.42e3 - state.sym_source [0 ].q ));
349
- CHECK (state.asym_power_sensor_sym_output [3 ].p_residual == doctest::Approx (3 * 2.52e6 - state.sym_shunt [0 ].p ));
350
- CHECK (state.asym_power_sensor_sym_output [3 ].q_residual == doctest::Approx (3 * 2.52e3 - state.sym_shunt [0 ].q ));
351
- CHECK (state.asym_power_sensor_sym_output [4 ].p_residual ==
352
- doctest::Approx (3 * 2.62e6 - state.sym_load_sym [0 ].p ));
353
- CHECK (state.asym_power_sensor_sym_output [4 ].q_residual ==
354
- doctest::Approx (3 * 2.62e3 - state.sym_load_sym [0 ].q ));
355
- CHECK (state.asym_power_sensor_sym_output [5 ].p_residual ==
356
- doctest::Approx (3 * 2.72e6 - state.sym_load_asym [0 ].p ));
357
- CHECK (state.asym_power_sensor_sym_output [5 ].q_residual ==
358
- doctest::Approx (3 * 2.72e3 - state.sym_load_asym [0 ].q ));
359
- CHECK (
360
- state.asym_power_sensor_sym_output [6 ].p_residual ==
361
- doctest::Approx (3 * 5.02e6 - (state.sym_source [1 ].p - state.sym_load_sym [0 ].p - state.sym_load_asym [0 ].p )));
362
- CHECK (
363
- state.asym_power_sensor_sym_output [6 ].q_residual ==
364
- doctest::Approx (3 * 5.02e3 - (state.sym_source [1 ].q - state.sym_load_sym [0 ].q - state.sym_load_asym [0 ].q )));
365
- }
366
- }
367
-
368
- TEST_CASE (" Test main model - individual output (asymmetric)" ) {
369
- State state;
370
- auto main_model = default_model (state);
371
-
372
- auto const res = main_model.calculate <power_flow_t , asymmetric_t >(
373
- get_default_options (asymmetric, CalculationMethod::newton_raphson));
374
-
375
- SUBCASE (" AsymVoltageSensor, asym output" ) { // TODO(mgovers): sensor output for powerflow calculations are not
376
- // tested elsewhere => validation case
377
- main_model.output_result <Node>(res, state.asym_node );
378
- main_model.output_result <AsymVoltageSensor>(res, state.asym_voltage_sensor );
379
-
380
- CHECK (state.asym_voltage_sensor [0 ].u_residual [0 ] ==
381
- doctest::Approx (1.031 / sqrt3 * 10.0e3 - state.asym_node [2 ].u [0 ]));
382
- CHECK (state.asym_voltage_sensor [0 ].u_residual [1 ] ==
383
- doctest::Approx (1.032 / sqrt3 * 10.0e3 - state.asym_node [2 ].u [1 ]));
384
- CHECK (state.asym_voltage_sensor [0 ].u_residual [2 ] ==
385
- doctest::Approx (1.033 / sqrt3 * 10.0e3 - state.asym_node [2 ].u [2 ]));
386
- CHECK (state.asym_voltage_sensor [0 ].u_angle_residual [0 ] == doctest::Approx (0.0 - state.asym_node [2 ].u_angle [0 ]));
387
- CHECK (state.asym_voltage_sensor [0 ].u_angle_residual [1 ] ==
388
- doctest::Approx (-deg_120 - state.asym_node [2 ].u_angle [1 ]));
389
- CHECK (state.asym_voltage_sensor [0 ].u_angle_residual [2 ] ==
390
- doctest::Approx (-deg_240 - state.asym_node [2 ].u_angle [2 ]));
391
- }
392
-
393
- SUBCASE (" SymVoltageSensor, asym output" ) { // TODO(mgovers): sensor output for powerflow calculations are not tested
394
- // elsewhere => validation case
395
- main_model.output_result <Node>(res, state.asym_node );
396
- main_model.output_result <SymVoltageSensor>(res, state.sym_voltage_sensor_asym_output );
397
-
398
- CHECK (state.sym_voltage_sensor_asym_output [0 ].u_residual [0 ] ==
399
- doctest::Approx (10.1e3 / sqrt3 - state.asym_node [0 ].u [0 ]));
400
- CHECK (state.sym_voltage_sensor_asym_output [0 ].u_residual [1 ] ==
401
- doctest::Approx (10.1e3 / sqrt3 - state.asym_node [0 ].u [1 ]));
402
- CHECK (state.sym_voltage_sensor_asym_output [0 ].u_residual [2 ] ==
403
- doctest::Approx (10.1e3 / sqrt3 - state.asym_node [0 ].u [2 ]));
404
- CHECK (state.sym_voltage_sensor_asym_output [0 ].u_angle_residual [0 ] ==
405
- doctest::Approx (0.1 - state.asym_node [0 ].u_angle [0 ]));
406
- CHECK (state.sym_voltage_sensor_asym_output [0 ].u_angle_residual [1 ] ==
407
- doctest::Approx (0.1 - state.asym_node [0 ].u_angle [1 ]));
408
- CHECK (state.sym_voltage_sensor_asym_output [0 ].u_angle_residual [2 ] ==
409
- doctest::Approx (0.1 - state.asym_node [0 ].u_angle [2 ]));
410
- CHECK (state.sym_voltage_sensor_asym_output [1 ].u_residual [0 ] ==
411
- doctest::Approx (10.2e3 / sqrt3 - state.asym_node [1 ].u [0 ]));
412
- CHECK (state.sym_voltage_sensor_asym_output [1 ].u_residual [1 ] ==
413
- doctest::Approx (10.2e3 / sqrt3 - state.asym_node [1 ].u [1 ]));
414
- CHECK (state.sym_voltage_sensor_asym_output [1 ].u_residual [2 ] ==
415
- doctest::Approx (10.2e3 / sqrt3 - state.asym_node [1 ].u [2 ]));
416
- CHECK (state.sym_voltage_sensor_asym_output [1 ].u_angle_residual [0 ] ==
417
- doctest::Approx (0.2 - state.asym_node [1 ].u_angle [0 ]));
418
- CHECK (state.sym_voltage_sensor_asym_output [1 ].u_angle_residual [1 ] ==
419
- doctest::Approx (0.2 - state.asym_node [1 ].u_angle [1 ]));
420
- CHECK (state.sym_voltage_sensor_asym_output [1 ].u_angle_residual [2 ] ==
421
- doctest::Approx (0.2 - state.asym_node [1 ].u_angle [2 ]));
422
- }
423
-
424
- // Note that only 1/3 of the values is being checked
425
- SUBCASE (" AsymPowerSensor, asym output" ) { // TODO(mgovers): sensor output for powerflow calculations are not tested
426
- // elsewhere
427
- main_model.output_result <Line>(res, state.asym_line );
428
- main_model.output_result <Link>(res, state.asym_link );
429
- main_model.output_result <Source>(res, state.asym_source );
430
- main_model.output_result <SymLoad>(res, state.asym_load_sym );
431
- main_model.output_result <AsymLoad>(res, state.asym_load_asym );
432
- main_model.output_result <Shunt>(res, state.asym_shunt );
433
- main_model.output_result <AsymPowerSensor>(res, state.asym_power_sensor );
434
-
435
- CHECK (state.asym_power_sensor [0 ].p_residual [0 ] == doctest::Approx (2.11e6 - state.asym_line [0 ].p_from [0 ]));
436
- CHECK (state.asym_power_sensor [0 ].q_residual [1 ] == doctest::Approx (2.12e3 - state.asym_line [0 ].q_from [1 ]));
437
- CHECK (state.asym_power_sensor [1 ].p_residual [1 ] == doctest::Approx (2.32e6 - state.asym_source [0 ].p [1 ]));
438
- CHECK (state.asym_power_sensor [1 ].q_residual [2 ] == doctest::Approx (2.33e3 - state.asym_source [0 ].q [2 ]));
439
- CHECK (state.asym_power_sensor [2 ].p_residual [0 ] == doctest::Approx (2.41e6 - state.asym_source [0 ].p [0 ]));
440
- CHECK (state.asym_power_sensor [2 ].q_residual [1 ] == doctest::Approx (2.42e3 - state.asym_source [0 ].q [1 ]));
441
- CHECK (state.asym_power_sensor [3 ].p_residual [2 ] == doctest::Approx (2.53e6 - state.asym_shunt [0 ].p [2 ]));
442
- CHECK (state.asym_power_sensor [3 ].q_residual [0 ] == doctest::Approx (2.51e3 - state.asym_shunt [0 ].q [0 ]));
443
- CHECK (state.asym_power_sensor [4 ].p_residual [1 ] == doctest::Approx (2.62e6 - state.asym_load_sym [0 ].p [1 ]));
444
- CHECK (state.asym_power_sensor [4 ].q_residual [2 ] == doctest::Approx (2.63e3 - state.asym_load_sym [0 ].q [2 ]));
445
- CHECK (state.asym_power_sensor [5 ].p_residual [0 ] == doctest::Approx (2.71e6 - state.asym_load_asym [0 ].p [0 ]));
446
- CHECK (state.asym_power_sensor [5 ].q_residual [1 ] == doctest::Approx (2.72e3 - state.asym_load_asym [0 ].q [1 ]));
447
- CHECK (state.asym_power_sensor [6 ].p_residual [0 ] ==
448
- doctest::Approx (
449
- 5.01e6 - (state.asym_source [1 ].p [0 ] - state.asym_load_sym [0 ].p [0 ] - state.asym_load_asym [0 ].p [0 ])));
450
- CHECK (state.asym_power_sensor [6 ].q_residual [1 ] ==
451
- doctest::Approx (
452
- 5.02e3 - (state.asym_source [1 ].q [1 ] - state.asym_load_sym [0 ].q [1 ] - state.asym_load_asym [0 ].q [1 ])));
453
- }
454
-
455
- SUBCASE (" SymPowerSensor, asym output" ) { // TODO(mgovers): sensor output for powerflow calculations are not tested
456
- // elsewhere
457
- main_model.output_result <Line>(res, state.asym_line );
458
- main_model.output_result <Link>(res, state.asym_link );
459
- main_model.output_result <Source>(res, state.asym_source );
460
- main_model.output_result <SymLoad>(res, state.asym_load_sym );
461
- main_model.output_result <AsymLoad>(res, state.asym_load_asym );
462
- main_model.output_result <Shunt>(res, state.asym_shunt );
463
- main_model.output_result <SymPowerSensor>(res, state.sym_power_sensor_asym_output );
464
-
465
- CHECK (state.sym_power_sensor_asym_output [0 ].p_residual [0 ] ==
466
- doctest::Approx (1.1e6 / 3 - state.asym_line [0 ].p_from [0 ]));
467
- CHECK (state.sym_power_sensor_asym_output [0 ].q_residual [1 ] ==
468
- doctest::Approx (1.1e3 / 3 - state.asym_line [0 ].q_from [1 ]));
469
- CHECK (state.sym_power_sensor_asym_output [1 ].p_residual [1 ] ==
470
- doctest::Approx (1.3e6 / 3 - state.asym_source [0 ].p [1 ]));
471
- CHECK (state.sym_power_sensor_asym_output [1 ].q_residual [2 ] ==
472
- doctest::Approx (1.3e3 / 3 - state.asym_source [0 ].q [2 ]));
473
- CHECK (state.sym_power_sensor_asym_output [2 ].p_residual [0 ] ==
474
- doctest::Approx (1.4e6 / 3 - state.asym_source [0 ].p [0 ]));
475
- CHECK (state.sym_power_sensor_asym_output [2 ].q_residual [1 ] ==
476
- doctest::Approx (1.4e3 / 3 - state.asym_source [0 ].q [1 ]));
477
- CHECK (state.sym_power_sensor_asym_output [3 ].p_residual [2 ] ==
478
- doctest::Approx (1.5e6 / 3 - state.asym_shunt [0 ].p [2 ]));
479
- CHECK (state.sym_power_sensor_asym_output [3 ].q_residual [0 ] ==
480
- doctest::Approx (1.5e3 / 3 - state.asym_shunt [0 ].q [0 ]));
481
- CHECK (state.sym_power_sensor_asym_output [4 ].p_residual [1 ] ==
482
- doctest::Approx (1.6e6 / 3 - state.asym_load_sym [0 ].p [1 ]));
483
- CHECK (state.sym_power_sensor_asym_output [4 ].q_residual [2 ] ==
484
- doctest::Approx (1.6e3 / 3 - state.asym_load_sym [0 ].q [2 ]));
485
- CHECK (state.sym_power_sensor_asym_output [5 ].p_residual [0 ] ==
486
- doctest::Approx (1.7e6 / 3 - state.asym_load_asym [0 ].p [0 ]));
487
- CHECK (state.sym_power_sensor_asym_output [5 ].q_residual [1 ] ==
488
- doctest::Approx (1.7e3 / 3 - state.asym_load_asym [0 ].q [1 ]));
489
- CHECK (state.sym_power_sensor_asym_output [6 ].p_residual [0 ] ==
490
- doctest::Approx (3.0e6 / 3 - (state.asym_source [1 ].p [0 ] - state.asym_load_sym [0 ].p [0 ] -
491
- state.asym_load_asym [0 ].p [0 ])));
492
- CHECK (state.sym_power_sensor_asym_output [6 ].q_residual [1 ] ==
493
- doctest::Approx (3.0e3 / 3 - (state.asym_source [1 ].q [1 ] - state.asym_load_sym [0 ].q [1 ] -
494
- state.asym_load_asym [0 ].q [1 ])));
495
- }
496
- }
497
-
498
275
TEST_CASE_TEMPLATE (" Test main model - unknown id" , settings, regular_update,
499
276
cached_update) { // TODO(mgovers): we need this test
500
277
State const state;
0 commit comments