Coverage for tests/cim_converter/unit/test_transformer_tank_impedances.py: 100%

80 statements  

« prev     ^ index     » next       coverage.py v7.10.6, created at 2025-11-13 17:34 -0800

1import pytest 

2from cimgraph.data_profile import cimhub_2023 as cim 

3from distopf.cim_importer.processors.transformer_processor import TransformerProcessor 

4 

5 

6def make_tank_end_with_basevoltage(nominal_voltage: float = 480.0): 

7 # Construct minimal TransformerTankEnd and set attributes after 

8 base_voltage = cim.BaseVoltage() 

9 base_voltage.nominalVoltage = float(nominal_voltage) 

10 tank_end = cim.TransformerTankEnd() 

11 tank_end.BaseVoltage = base_voltage 

12 tank_end.FromMeshImpedance = [] 

13 tank_end.orderedPhases = cim.OrderedPhaseCodeKind(value="AN") 

14 tank_end.StarImpedance = None 

15 tank_end.r = None 

16 tank_end.x = None 

17 return tank_end 

18 

19 

20def test_transformer_tank_frommeshimpedance_used_for_impedance(): 

21 tp = TransformerProcessor(1e6) 

22 mesh_imp = cim.TransformerMeshImpedance() 

23 mesh_imp.r = 0.2 

24 mesh_imp.x = 0.4 

25 tank_end = make_tank_end_with_basevoltage(480.0) 

26 tank_end.FromMeshImpedance = [mesh_imp] 

27 tank = cim.TransformerTank(name="tank1", TransformerTankEnds=[tank_end]) 

28 xfmr_like = cim.PowerTransformer(TransformerTanks=[tank]) 

29 

30 data = {} 

31 tp._process_transformer_tank_impedance(xfmr_like, data) 

32 v_base = float(tank_end.BaseVoltage.nominalVoltage) 

33 v_ln_base = v_base / (3**0.5) 

34 z_base = v_ln_base**2 / tp.s_base 

35 expected_r = float(mesh_imp.r) / z_base 

36 expected_x = float(mesh_imp.x) / z_base 

37 assert pytest.approx(data["raa"], rel=1e-9) == expected_r 

38 assert pytest.approx(data["xaa"], rel=1e-9) == expected_x 

39 assert data["phases"] 

40 

41 

42def test_transformer_tank_starimpedance_used_for_impedance(): 

43 tp = TransformerProcessor(1e6) 

44 star_imp = cim.TransformerStarImpedance() 

45 star_imp.r = 0.12 

46 star_imp.x = 0.24 

47 tank_end = make_tank_end_with_basevoltage(480.0) 

48 tank_end.StarImpedance = star_imp 

49 tank = cim.TransformerTank(name="tank_star", TransformerTankEnds=[tank_end]) 

50 xfmr_like = cim.PowerTransformer(TransformerTanks=[tank]) 

51 

52 data = {} 

53 tp._process_transformer_tank_impedance(xfmr_like, data) 

54 v_base = float(tank_end.BaseVoltage.nominalVoltage) 

55 v_ln = v_base / (3**0.5) 

56 z_base = v_ln**2 / tp.s_base 

57 expected_r = float(star_imp.r) / z_base 

58 expected_x = float(star_imp.x) / z_base 

59 assert pytest.approx(data["raa"], rel=1e-9) == expected_r 

60 assert pytest.approx(data["xaa"], rel=1e-9) == expected_x 

61 

62 

63def test_transformer_tank_direct_attributes_and_default_fallback(): 

64 tp = TransformerProcessor(1e6) 

65 tank_end = cim.TransformerTankEnd() 

66 # Set BaseVoltage and direct r/x attributes on the end 

67 tank_end.BaseVoltage = cim.BaseVoltage() 

68 tank_end.BaseVoltage.nominalVoltage = 480.0 

69 tank_end.FromMeshImpedance = [] 

70 tank_end.StarImpedance = None 

71 tank_end.r = 0.05 

72 tank_end.x = 0.06 

73 tank = cim.TransformerTank(name="tank_direct", TransformerTankEnds=[tank_end]) 

74 xfmr_like = cim.PowerTransformer(TransformerTanks=[tank]) 

75 data = {} 

76 tp._process_transformer_tank_impedance(xfmr_like, data) 

77 v_base = float(tank_end.BaseVoltage.nominalVoltage) 

78 z_base = (v_base / (3**0.5)) ** 2 / tp.s_base 

79 expected_r = float(tank_end.r) / z_base 

80 expected_x = float(tank_end.x) / z_base 

81 assert pytest.approx(data["raa"], rel=1e-9) == expected_r 

82 assert pytest.approx(data["xaa"], rel=1e-9) == expected_x 

83 

84 # Now fallback default when no impedance found 

85 empty_tank_end = cim.TransformerTankEnd() 

86 empty_tank_end.BaseVoltage = None 

87 empty_tank_end.FromMeshImpedance = [] 

88 empty_tank_end.StarImpedance = None 

89 empty_tank = cim.TransformerTank( 

90 name="tank_empty", TransformerTankEnds=[empty_tank_end] 

91 ) 

92 xfmr_empty = cim.PowerTransformer(TransformerTanks=[empty_tank]) 

93 data2 = {} 

94 tp._process_transformer_tank_impedance(xfmr_empty, data2) 

95 assert pytest.approx(data2["raa"], rel=1e-12) == 0.01 

96 assert pytest.approx(data2["xaa"], rel=1e-12) == 0.05