Пример #1
0
def dssToGridLab(args):
	''' Convert dss file to gridlab. '''
	m = Store()
	reader = OReader(master_file=args.infile, buscoordinates_file=args.buscoords)
	writer = Writer(output_path='.')
	reader.parse(m)
	writer.write(m)
	print ("GRIDLAB-D FILE WRITTEN")
Пример #2
0
def main():
    '''
    Conversion example of a relatively large test system: the EPRI J1 feeder.
    OpenDSS ---> CYME example.
    This example uses the dss files located in tests/data/big_cases/opendss/epri_j1
    '''

    #Path settings (assuming it is run from examples folder)
    #Change this if you wish to use another system
    path = '../tests/data/big_cases/opendss/epri_j1'

    ###############################
    #  STEP 1: READ FROM OPENDSS  #
    ###############################
    #
    #Create a Store object
    print('>>> Creating empty model...')
    model = Store()

    #Instanciate a Reader object
    r = Reader(master_file=os.path.join(path, 'master.dss'),
               buscoordinates_file=os.path.join(path, 'buscoords.dss'))

    #Parse (can take some time for large systems...)
    print('>>> Reading from OpenDSS...')
    start = time.time()  #basic timer
    r.parse(model)
    end = time.time()
    print('...Done (in {} seconds'.format(end - start))

    ###########################
    #  STEP 2: WRITE TO CYME  #
    ###########################
    #
    #Instanciate a Writer object
    w = Writer(output_path='./')

    #Write to CYME (can also take some time for large systems...)
    print('>>> Writing to CYME...')
    start = time.time()  #basic timer
    w.write(model)
    end = time.time()
    print('...Done (in {} seconds'.format(end - start))
Пример #3
0
def test_cyme_to_json():
    """Test the JSON writer with CYME models as input."""
    from ditto.readers.cyme.read import Reader
    from ditto.store import Store
    from ditto.writers.json.write import Writer

    cyme_models = [
        f for f in os.listdir(
            os.path.join(current_directory, "data/small_cases/cyme/"))
        if not f.startswith(".")
    ]
    for model in cyme_models:
        m = Store()
        r = Reader(data_folder_path=os.path.join(
            current_directory, "data/small_cases/cyme", model))
        r.parse(m)
        m.set_names()
        output_path = tempfile.TemporaryDirectory()
        w = Writer(output_path=output_path.name)
        w.write(m)
Пример #4
0
def test_capacitor_kvar():
    m = Store()
    r = Reader(
        master_file=os.path.join(current_directory, "test_capacitor_kvar.dss"))
    r.parse(m)
    m.set_names()

    assert len(
        m["cap1"].phase_capacitors) == 3  # Cap1 is a three phase capacitor
    assert sum([
        phase_capacitor.var for phase_capacitor in m["cap1"].phase_capacitors
    ]) == pytest.approx(600 * 10**3, 0.0001)

    assert len(
        m["cap2"].phase_capacitors) == 1  # Cap2 is a one phase capacitor
    assert m["cap2"].phase_capacitors[0].var == 100 * 10**3

    assert len(
        m["cap3"].phase_capacitors) == 1  # Cap3 is a one phase capacitor
    assert m["cap3"].phase_capacitors[0].var == 200.37 * 10**3
Пример #5
0
def create_output_dir(tests_dir):
    """Reading the input from every reader for each test case and creating the Opendss output."""
    # Creating output directory
    current_dir = os.path.realpath(os.path.dirname(__file__))
    validation_dir = os.path.join(current_dir, "validation_outputs")
    if os.path.exists(validation_dir):
        shutil.rmtree(validation_dir)
    for each in os.listdir(tests_dir):
        if each == "cim" or each == "demo":
            continue
        for dirname in os.listdir(os.path.join(tests_dir, each)):
            if dirname == "storage_test":
                continue
            output_dir = os.path.join(validation_dir, dirname,
                                      each + "_output")
            test_path = os.path.join(tests_dir, each, dirname)
            m = Store()
            if each == "opendss":
                r1 = OpenDSS_Reader(
                    master_file=os.path.join(test_path, "master.dss"))
            elif each == "synergi":
                if dirname == "ieee_4node":
                    r1 = Synergi_Reader(
                        input_file=os.path.join(test_path, "network.mdb"))
            elif each == "cyme":
                r1 = Cyme_Reader(data_folder_path=os.path.join(test_path))
            elif each == "gridlabd":
                r1 = Gridlabd_Reader(
                    input_file=os.path.join(test_path, "node.glm"))
            r1.parse(m)
            w1 = OpenDSS_Writer(output_path=output_dir)
            w1.write(m, separate_feeders=True)
    return validation_dir
Пример #6
0
def test_transformer_kv():
    m = Store()
    r = Reader(master_file=os.path.join(current_directory, "test_transformer_kv.dss"))
    r.parse(m)
    m.set_names()

    # Substation is a 115kV/4.16kV step-down two windings transformer
    assert (
        len(m["substation"].windings) == 2
    )  # Transformer substation should have 2 Windings
    assert m["substation"].windings[0].nominal_voltage == 115 * 10 ** 3
    assert m["substation"].windings[1].nominal_voltage == 4.16 * 10 ** 3

    # reg1 is a 4.16kV/4.16kV two windings regulator
    assert len(m["reg1"].windings) == 2  # Transformer reg1 should have 2 Windings
    assert m["reg1"].windings[0].nominal_voltage == 4.16 * 10 ** 3
    assert m["reg1"].windings[1].nominal_voltage == 4.16 * 10 ** 3

    # xfm1 is a 4.16kV/0.48kV two windings distribution transformer
    assert len(m["xfm1"].windings) == 2  # Transformer xfm1 should have 2 Windings
    assert m["xfm1"].windings[0].nominal_voltage == 4.16 * 10 ** 3
    assert m["xfm1"].windings[1].nominal_voltage == 0.48 * 10 ** 3
Пример #7
0
def test_loads():
    m = Store()
    r = Reader(master_file=os.path.join(current_directory, "test_loads.dss"))
    r.parse(m)
    m.set_names()

    # Reading OpenDSS default values
    d_v = Default_Values(
        os.path.join(
            current_directory,
            "../../../../ditto/default_values/opendss_default_values.json",
        ))
    parsed_values = d_v.parse()

    precision = 0.001
    assert m["load_zipv"].name == "load_zipv"
    assert m["load_zipv"].connection_type == parsed_values["Load"][
        "connection_type"]
    assert m["load_zipv"].vmin == 0.0
    assert m["load_zipv"].vmax == 1.2
    assert m["load_zipv"].connecting_element == "load"
    assert m["load_zipv"].nominal_voltage == 1 * 10**3
    assert m["load_zipv"].feeder_name == "src_src"
    assert m["load_zipv"].peak_coincident_p == None
    assert m["load_zipv"].peak_coincident_q == None
    assert len(m["load_zipv"].phase_loads) == 1  # Load is a one phase load
    assert m["load_zipv"].phase_loads[0].phase == "A"
    assert m["load_zipv"].phase_loads[0].p == 1 * 10**3
    assert m["load_zipv"].phase_loads[0].q == pytest.approx(
        1.0 * math.sqrt(1.0 / 0.88**2 - 1) * 10**3, precision)
    assert m["load_zipv"].phase_loads[0].model == 8
    assert m["load_zipv"].phase_loads[0].use_zip == 1
    assert m["load_zipv"].phase_loads[0].ppercentcurrent == -0.9855 * 100
    assert m["load_zipv"].phase_loads[0].qpercentcurrent == -2.963 * 100
    assert m["load_zipv"].phase_loads[0].ppercentpower == 1.1305 * 100
    assert m["load_zipv"].phase_loads[0].qpercentpower == 1.404 * 100
    assert m["load_zipv"].phase_loads[0].ppercentimpedance == 0.855 * 100
    assert m["load_zipv"].phase_loads[0].qpercentimpedance == 2.559 * 100
Пример #8
0
def test_linegeometries():
    m = Store()
    r = Reader(master_file=os.path.join(current_directory, "test_linegeometries.dss"))
    r.parse(m)
    m.set_names()

    # Reading OpenDSS default values
    d_v = Default_Values(
        os.path.join(
            current_directory,
            "../../../../ditto/default_values/opendss_default_values.json",
        )
    )
    parsed_values = d_v.parse()

    # Number of wires
    assert len(m["line1"].wires) == 4  # Line1 should have 4 wires
    # Phases of the different wires
    assert set([w.phase for w in m["line1"].wires]) == set(["A", "B", "C", "N"])
    assert m["line1"].name == "line1"
    assert m["line1"].nominal_voltage == float(4.8) * 10 ** 3
    assert m["line1"].line_type == "overhead"
    assert m["line1"].length == 300 * 0.3048  # units = ft
    assert m["line1"].from_element == "bus1"
    assert m["line1"].to_element == "bus2"
    assert m["line1"].is_fuse is None
    assert m["line1"].is_switch is None

    z1 = complex(
        parsed_values["Line"]["R1"], parsed_values["Line"]["X1"]
    )  # r1,x1 taken from default values
    z0 = complex(
        parsed_values["Line"]["R0"], parsed_values["Line"]["X0"]
    )  # r0,x0 taken from default values
    diag = ((2 * z1 + z0) / 3) * 0.001  # Units = km
    diag = round(diag.real, 11) + round(diag.imag, 10) * 1j
    rem = ((z0 - z1) / 3) * 0.001  # Units = km
    rem = round(rem.real, 11) + rem.imag * 1j
    imp_matrix = np.zeros((4, 4), dtype=np.complex_)
    imp_matrix.fill(rem)
    np.fill_diagonal(imp_matrix, diag)
    imp_matrix = imp_matrix.tolist()

    assert m["line1"].faultrate == parsed_values["Line"]["faultrate"]

    np.testing.assert_array_almost_equal(
        m["line1"].impedance_matrix,
        [
            [
                (0.00024738133202099736 + 0.0008769514435695538j),
                (5.810587270341207e-05 + 0.00031932618110236215j),
                (5.723612204724409e-05 + 0.0004637522965879265j),
                (5.717280183727034e-05 + 0.0004757309711286089j),
            ],
            [
                (5.810587270341207e-05 + 0.00031932618110236215j),
                (0.0002491671587926509 + 0.0008750521653543306j),
                (5.810603674540682e-05 + 0.0003196077099737533j),
                (5.803946850393701e-05 + 0.0003143254593175853j),
            ],
            [
                (5.723612204724409e-05 + 0.0004637522965879265j),
                (5.810603674540682e-05 + 0.0003196077099737533j),
                (0.00024738133202099736 + 0.0008769514435695538j),
                (5.717296587926509e-05 + 0.0005039963910761155j),
            ],
            [
                (5.717280183727034e-05 + 0.0004757309711286089j),
                (5.803946850393701e-05 + 0.0003143254593175853j),
                (5.717296587926509e-05 + 0.0005039963910761155j),
                (0.0007530643044619422 + 0.0010085508530183727j),
            ],
        ],
    )
    np.testing.assert_array_almost_equal(
        m["line1"].capacitance_matrix,
        [
            [
                (0.008384708005249344 + 0j),
                (-0.0001470299868766404 + 0j),
                (-0.0019942040682414696 + 0j),
                (-0.0020357719816272964 + 0j),
            ],
            [
                (-0.0001470299868766404 + 0j),
                (0.00994426837270341 + 0j),
                (-0.00014228366141732281 + 0j),
                (-9.78384186351706e-05 + 0j),
            ],
            [
                (-0.0019942040682414696 + 0j),
                (-0.00014228366141732281 + 0j),
                (0.008713290682414698 + 0j),
                (-0.002607346128608924 + 0j),
            ],
            [
                (-0.0020357719816272964 + 0j),
                (-9.78384186351706e-05 + 0j),
                (-0.002607346128608924 + 0j),
                (0.008078645013123359 + 0j),
            ],
        ],
    )
    assert m["line1"].feeder_name == "sourcebus_src"
    assert m["line1"].is_recloser is None
    assert m["line1"].is_breaker is None
    assert m["line1"].nameclass == ""

    for w in m["line1"].wires:
        assert w.emergency_ampacity == 795
        assert w.insulation_thickness == parsed_values["Wire"]["insulation_thickness"]
        assert w.is_open is None
        assert w.concentric_neutral_gmr is None
        assert w.concentric_neutral_resistance is None
        assert w.concentric_neutral_diameter is None
        assert w.concentric_neutral_outside_diameter is None
        assert w.concentric_neutral_nstrand is None

    phased_wires = {}
    for wire in m["line1"].wires:
        phased_wires[wire.phase] = wire

    # Nameclass
    for p in ["A", "B", "C"]:
        assert phased_wires[p].ampacity == 530
        assert phased_wires[p].nameclass == "wire1"

    assert phased_wires["N"].ampacity == 230
    assert phased_wires["N"].nameclass == "wire2"

    # Positions of the wires
    assert (phased_wires["A"].X, phased_wires["A"].Y) == (-1.2909, 13.716)
    assert (phased_wires["B"].X, phased_wires["B"].Y) == (
        -0.1530096 * 0.3048,
        4.1806368 * 0.3048,
    )
    assert (phased_wires["C"].X, phased_wires["C"].Y) == (0.5737, 13.716)
    assert (phased_wires["N"].X, phased_wires["N"].Y) == (0.0, 14.648)

    # GMR
    for p in ["A", "B", "C"]:
        assert phased_wires[p].gmr == 0.0255 * 0.3048
    assert phased_wires["N"].gmr == 0.00446 * 0.3048

    # Diameter
    for p in ["A", "B", "C"]:
        assert phased_wires[p].diameter == 0.741 * 0.0254
    assert phased_wires["N"].diameter == 0.398 * 0.0254

    # Resistance
    # TODO: Change this once the resistance of a Wire object will no longer be the total
    # resistance, but the per meter resistance...
    #
    for p in ["A", "B", "C"]:
        assert phased_wires[p].resistance == pytest.approx(
            0.306 * 0.000621371 * 300 * 0.3048, 0.00001
        )
    assert phased_wires["N"].resistance == pytest.approx(
        1.12 * 0.000621371 * 300 * 0.3048, 0.00001
    )

    # Number of wires
    assert len(m["line2"].wires) == 3
    # Phases of the different wires
    assert set([w.phase for w in m["line2"].wires]) == set(["A", "B", "C"])
    assert m["line2"].name == "line2"
    assert m["line2"].nominal_voltage == float(4.8) * 10 ** 3
    assert m["line2"].line_type == "underground"
    assert m["line2"].length == 1 * 1609.34  # units = mi
    assert m["line2"].from_element == "bus2"
    assert m["line2"].to_element == "bus3"
    assert m["line2"].is_fuse is None
    assert m["line2"].is_switch is None
    assert m["line2"].faultrate == parsed_values["Line"]["faultrate"]
    np.testing.assert_array_almost_equal(
        m["line2"].impedance_matrix,
        [
            [
                (0.0005010314787428386 + 0.00026819845402463124j),
                (0.00020170349335752545 + 1.1288596567537003e-05j),
                (0.00017933407483813242 - 1.766354530428623e-05j),
            ],
            [
                (0.00020170349335752545 + 1.1288596567537003e-05j),
                (0.0004946492350901612 + 0.00024160345234692485j),
                (0.00020170349335752545 + 1.1288596567537003e-05j),
            ],
            [
                (0.00017933407483813242 - 1.766354530428623e-05j),
                (0.00020170349335752545 + 1.1288596567537003e-05j),
                (0.0005010314787428386 + 0.00026819845402463124j),
            ],
        ],
    )

    np.testing.assert_array_almost_equal(
        m["line2"].capacitance_matrix,
        [
            [(0.23857494376576735 + 0j), 0j, 0j],
            [0j, (0.23857494376576735 + 0j), 0j],
            [0j, 0j, (0.23857494376576735 + 0j)],
        ],
    )
    assert m["line2"].feeder_name == "sourcebus_src"
    assert m["line2"].is_recloser is None
    assert m["line2"].is_breaker is None
    assert m["line2"].nameclass == ""

    for w in m["line2"].wires:
        assert w.emergency_ampacity is None
        assert w.insulation_thickness == 0.005588
        assert w.is_open is None
        assert w.concentric_neutral_gmr == 0.0508
        assert w.concentric_neutral_resistance == 858.5200001016
        assert w.concentric_neutral_diameter == 0.0016256
        assert w.concentric_neutral_outside_diameter == 0.029463999999999997
        assert w.concentric_neutral_nstrand == 13

    phased_wires = {}
    for wire in m["line2"].wires:
        phased_wires[wire.phase] = wire

    # Nameclass
    for p in ["A", "B", "C"]:
        assert phased_wires[p].ampacity is None
        assert phased_wires[p].nameclass == "cndata1"

    # Positions of the wires
    assert (phased_wires["A"].X, phased_wires["A"].Y) == (-0.5 * 0.3048, -4 * 0.3048)
    assert (phased_wires["B"].X, phased_wires["B"].Y) == (0, -4 * 0.3048)
    assert (phased_wires["C"].X, phased_wires["C"].Y) == (0.5 * 0.3048, -4 * 0.3048)

    # GMR
    for p in ["A", "B", "C"]:
        assert phased_wires[p].gmr == 0.20568 * 0.0254

    # Diameter
    for p in ["A", "B", "C"]:
        assert phased_wires[p].diameter == 0.573 * 0.0254

    for p in ["A", "B", "C"]:
        assert phased_wires[p].resistance == pytest.approx(
            0.076705 * 1609.34 * 0.00328084, 0.00001
        )
def test_capacitor_connectivity():
    m = Store()
    r = Reader(master_file=os.path.join(current_directory,
                                        "test_capacitor_connectivity.dss"))
    r.parse(m)
    m.set_names()

    # Reading OpenDSS default values
    d_v = Default_Values(
        os.path.join(
            current_directory,
            "../../../../ditto/default_values/opendss_default_values.json",
        ))
    parsed_values = d_v.parse()

    # Capacitor Cap1 should be a three phase capacitor (3 PhaseCapacitor objects) connected to bus1
    assert len(
        m["cap1"].phase_capacitors) == 3  # Cap1 is a three phase capacitor
    assert sum([
        phase_capacitor.var for phase_capacitor in m["cap1"].phase_capacitors
    ]) == pytest.approx(600 * 10**3, 0.0001)
    assert m["cap1"].name == "cap1"
    assert m["cap1"].nominal_voltage == float(4.16) * 10**3
    assert m["cap1"].connection_type == parsed_values["Capacitor"][
        "connection_type"]
    assert m["cap1"].delay is None
    assert m["cap1"].mode is None
    assert m["cap1"].low is None
    assert m["cap1"].high is None
    assert m["cap1"].resistance == 0.0
    assert m["cap1"].reactance == 0.0
    assert m["cap1"].susceptance is None
    assert m["cap1"].conductance is None
    assert m["cap1"].pt_ratio is None
    assert m["cap1"].ct_ratio is None
    assert m["cap1"].pt_phase is None
    assert m["cap1"].connecting_element == "bus1"
    assert m["cap1"].measuring_element is None
    assert m["cap1"].feeder_name == "sourcebus_src"

    assert set([pc.phase
                for pc in m["cap1"].phase_capacitors]) == set(["A", "B", "C"])

    # Capacitor Cap2 should be a one phase capacitor (1 PhaseCapacitor object) connected to bus2 on phase C
    assert len(
        m["cap2"].phase_capacitors) == 1  # Cap2 is a one phase capacitor
    assert m["cap2"].phase_capacitors[0].var == 100 * 10**3

    assert m["cap2"].name == "cap2"
    assert m["cap2"].nominal_voltage == float(2.4) * 10**3
    assert m["cap2"].connection_type == parsed_values["Capacitor"][
        "connection_type"]
    assert m["cap2"].delay is None
    assert m["cap2"].mode is None
    assert m["cap2"].low is None
    assert m["cap2"].high is None
    assert m["cap2"].resistance == 0.0
    assert m["cap2"].reactance == 0.0
    assert m["cap2"].susceptance is None
    assert m["cap2"].conductance is None
    assert m["cap2"].pt_ratio is None
    assert m["cap2"].ct_ratio is None
    assert m["cap2"].pt_phase is None
    assert m["cap2"].connecting_element == "bus2"
    assert m["cap2"].measuring_element is None
    assert m["cap2"].feeder_name == "sourcebus_src"

    assert m["cap2"].phase_capacitors[0].phase == "C"

    # Capacitor Cap3 should be a one phase capacitor (1 PhaseCapacitor object) connected to bus3 on phase A
    assert len(
        m["cap3"].phase_capacitors) == 1  # Cap3 is a one phase capacitor
    assert m["cap3"].phase_capacitors[0].var == 200.37 * 10**3

    assert m["cap3"].name == "cap3"
    assert m["cap3"].nominal_voltage == float(2.4) * 10**3
    assert m["cap3"].connection_type == parsed_values["Capacitor"][
        "connection_type"]
    assert m["cap3"].delay is None
    assert m["cap3"].mode is None
    assert m["cap3"].low is None
    assert m["cap3"].high is None
    assert m["cap3"].resistance == 0.0
    assert m["cap3"].reactance == 0.0
    assert m["cap3"].susceptance is None
    assert m["cap3"].conductance is None
    assert m["cap3"].pt_ratio is None
    assert m["cap3"].ct_ratio is None
    assert m["cap3"].pt_phase is None
    assert m["cap3"].connecting_element == "bus3"
    assert m["cap3"].measuring_element is None
    assert m["cap3"].feeder_name == "sourcebus_src"

    assert m["cap3"].phase_capacitors[0].phase == "A"

    # Capacitor Cap4 should be a two phase capacitor (2 PhaseCapacitor objects) connected to bus4 on phase A and C
    assert len(
        m["cap4"].phase_capacitors) == 2  # Cap4 is a two phase capacitor
    assert sum([
        phase_capacitor.var for phase_capacitor in m["cap4"].phase_capacitors
    ]) == pytest.approx(400 * 10**3, 0.0001)

    assert m["cap4"].name == "cap4"
    assert m["cap4"].nominal_voltage == float(2.4) * 10**3
    assert m["cap4"].connection_type == parsed_values["Capacitor"][
        "connection_type"]
    assert m["cap4"].delay is None
    assert m["cap4"].mode is None
    assert m["cap4"].low is None
    assert m["cap4"].high is None
    assert m["cap4"].resistance == 0.0
    assert m["cap4"].reactance == 0.0
    assert m["cap4"].susceptance is None
    assert m["cap4"].conductance is None
    assert m["cap4"].pt_ratio is None
    assert m["cap4"].ct_ratio is None
    assert m["cap4"].pt_phase is None
    assert m["cap4"].connecting_element == "bus4"
    assert m["cap4"].measuring_element is None
    assert m["cap4"].feeder_name == "sourcebus_src"

    assert set([pc.phase
                for pc in m["cap4"].phase_capacitors]) == set(["A", "C"])

    #  Capacitors from epri_j1
    assert len(m["b4909-1"].phase_capacitors
               ) == 3  # b4909-1 is a three phase capacitor
    assert sum([
        phase_capacitor.var
        for phase_capacitor in m["b4909-1"].phase_capacitors
    ]) == pytest.approx(900 * 10**3, 0.0001)
    assert m["b4909-1"].name == "b4909-1"
    assert m["b4909-1"].nominal_voltage == float(12.47) * 10**3
    assert m["b4909-1"].connection_type == parsed_values["Capacitor"][
        "connection_type"]
    assert m["b4909-1"].delay == 30
    assert m["b4909-1"].mode == "voltage"
    assert m["b4909-1"].low == parsed_values["Capacitor"]["low"]
    assert m["b4909-1"].high == parsed_values["Capacitor"]["high"]
    assert m["b4909-1"].resistance == 0.0
    assert m["b4909-1"].reactance == 0.0
    assert m["b4909-1"].susceptance is None
    assert m["b4909-1"].conductance is None
    assert m["b4909-1"].pt_ratio == parsed_values["Capacitor"]["pt_ratio"]
    assert m["b4909-1"].ct_ratio == parsed_values["Capacitor"]["ct_ratio"]
    assert m["b4909-1"].pt_phase == "B"
    assert m["b4909-1"].connecting_element == "b4909"
    assert m["b4909-1"].measuring_element == "Line.OH_B4904"
    assert m["b4909-1"].feeder_name == "sourcebus_src"

    assert set([pc.phase for pc in m["b4909-1"].phase_capacitors
                ]) == set(["A", "B", "C"])

    assert len(m["b4909-2"].phase_capacitors
               ) == 3  # b4909-2 is a three phase capacitor
    assert sum([
        phase_capacitor.var
        for phase_capacitor in m["b4909-2"].phase_capacitors
    ]) == pytest.approx(900 * 10**3, 0.0001)
    assert m["b4909-2"].name == "b4909-2"
    assert m["b4909-2"].nominal_voltage == float(12.47) * 10**3
    assert m["b4909-2"].connection_type == parsed_values["Capacitor"][
        "connection_type"]
    assert m["b4909-2"].delay == 30
    assert m["b4909-2"].mode == "voltage"
    assert m["b4909-2"].low == 120.5
    assert m["b4909-2"].high == 125
    assert m["b4909-2"].resistance == 0.0
    assert m["b4909-2"].reactance == 0.0
    assert m["b4909-2"].susceptance is None
    assert m["b4909-2"].conductance is None
    assert m["b4909-2"].pt_ratio == parsed_values["Capacitor"]["pt_ratio"]
    assert m["b4909-2"].ct_ratio == parsed_values["Capacitor"]["ct_ratio"]
    assert m["b4909-2"].pt_phase == "B"
    assert m["b4909-2"].connecting_element == "b4909"
    assert m["b4909-2"].measuring_element == "Line.OH_B4904"
    assert m["b4909-2"].feeder_name == "sourcebus_src"

    assert set([pc.phase for pc in m["b4909-2"].phase_capacitors
                ]) == set(["A", "B", "C"])

    # oh_b4904
    assert len(m["oh_b4904"].wires) == 3
    #    Phases of the different wires
    assert set([w.phase for w in m["oh_b4904"].wires]) == set(["A", "B", "C"])
    assert m["oh_b4904"].name == "oh_b4904"
    assert (m["oh_b4904"].nameclass == "OH-3X_477AAC_4/0AAACN"
            )  # Linecode is OH-3X_477AAC_4/0AAACN
    assert m["oh_b4904"].line_type == None
    assert m["oh_b4904"].from_element == "b4909"
    assert m["oh_b4904"].to_element == "b4904"
    assert m["oh_b4904"].length == pytest.approx(161.84879)
    assert m["oh_b4904"].nominal_voltage == float(4.16) * 10**3
    assert m["oh_b4904"].is_fuse is None
    assert m["oh_b4904"].is_switch is None
    assert m["oh_b4904"].faultrate == parsed_values["Line"]["faultrate"]

    z1 = complex(0.12241009, 0.39494091)  # Specified in the dss input
    z0 = complex(0.33466485, 1.2742766)  # Specified in the dss input
    diag = ((2 * z1 + z0) / 3) * 0.001  # Units = km
    diag = round(diag.real, 10) + round(diag.imag, 10) * 1j
    rem = ((z0 - z1) / 3) * 0.001  # Units =km
    rem = round(rem.real, 11) + round(rem.imag, 10) * 1j
    imp_matrix = np.zeros((3, 3), dtype=np.complex_)
    imp_matrix.fill(rem)
    np.fill_diagonal(imp_matrix, diag)
    imp_matrix = imp_matrix.tolist()

    assert m["oh_b4904"].impedance_matrix == imp_matrix

    c1 = complex(11.1973, 0)  # Specified in the dss input
    c0 = complex(4.8089, 0)  # Specified in the dss input
    c_diag = ((2 * c1 + c0) / 3) * 0.001  # Units = km
    c_diag = round(c_diag.real, 9) + c_diag.imag * 1j
    c_rem = ((c0 - c1) / 3) * 0.001  # Units = km
    c_rem = round(c_rem.real, 9) + c_rem.imag * 1j
    cap_matrix = np.zeros((3, 3), dtype=np.complex_)
    cap_matrix.fill(c_rem)
    np.fill_diagonal(cap_matrix, c_diag)
    cap_matrix = cap_matrix.tolist()

    assert m["oh_b4904"].capacitance_matrix == cap_matrix

    assert m["oh_b4904"].feeder_name == "sourcebus_src"
    assert m["oh_b4904"].is_recloser is None
    assert m["oh_b4904"].is_breaker is None

    for w in m["oh_b4904"].wires:
        assert w.nameclass == ""
        assert w.X is None
        assert w.Y is None
        assert w.diameter is None
        assert w.gmr is None
        assert w.ampacity == float(732)
        assert w.emergency_ampacity == float(871)
        assert w.resistance is None
        assert w.insulation_thickness == 0.0
        assert w.is_open is None
        assert w.concentric_neutral_gmr is None
        assert w.concentric_neutral_resistance is None
        assert w.concentric_neutral_diameter is None
        assert w.concentric_neutral_outside_diameter is None
        assert w.concentric_neutral_nstrand is None

    assert (len(m["b18944-1"].phase_capacitors) == 3
            )  # b18944-1 is a three phase capacitor
    assert sum([
        phase_capacitor.var
        for phase_capacitor in m["b18944-1"].phase_capacitors
    ]) == pytest.approx(1200 * 10**3, 0.0001)
    assert m["b18944-1"].name == "b18944-1"
    assert m["b18944-1"].nominal_voltage == float(12.47) * 10**3
    assert (m["b18944-1"].connection_type == parsed_values["Capacitor"]
            ["connection_type"])
    assert m["b18944-1"].delay == 31
    assert m["b18944-1"].mode == "voltage"
    assert m["b18944-1"].low == parsed_values["Capacitor"]["low"]
    assert m["b18944-1"].high == parsed_values["Capacitor"]["high"]
    assert m["b18944-1"].resistance == 0.0
    assert m["b18944-1"].reactance == 0.0
    assert m["b18944-1"].susceptance is None
    assert m["b18944-1"].conductance is None
    assert m["b18944-1"].pt_ratio == parsed_values["Capacitor"]["pt_ratio"]
    assert m["b18944-1"].ct_ratio == parsed_values["Capacitor"]["ct_ratio"]
    assert m["b18944-1"].pt_phase == "A"
    assert m["b18944-1"].connecting_element == "b18941"
    assert m["b18944-1"].measuring_element == "Line.OH_B18944"
    assert m["b18944-1"].feeder_name == "sourcebus_src"

    assert set([pc.phase for pc in m["b18944-1"].phase_capacitors
                ]) == set(["A", "B", "C"])

    assert (len(m["b18944-2"].phase_capacitors) == 3
            )  # b18944-2 is a three phase capacitor
    assert sum([
        phase_capacitor.var
        for phase_capacitor in m["b18944-2"].phase_capacitors
    ]) == pytest.approx(1200 * 10**3, 0.0001)
    assert m["b18944-2"].name == "b18944-2"
    assert m["b18944-2"].nominal_voltage == float(12.47) * 10**3
    assert (m["b18944-2"].connection_type == parsed_values["Capacitor"]
            ["connection_type"])
    assert m["b18944-2"].delay == 31
    assert m["b18944-2"].mode == "voltage"
    assert m["b18944-2"].low == 118
    assert m["b18944-2"].high == 124
    assert m["b18944-2"].resistance == 0.0
    assert m["b18944-2"].reactance == 0.0
    assert m["b18944-2"].susceptance is None
    assert m["b18944-2"].conductance is None
    assert m["b18944-2"].pt_ratio == parsed_values["Capacitor"]["pt_ratio"]
    assert m["b18944-2"].ct_ratio == parsed_values["Capacitor"]["ct_ratio"]
    assert m["b18944-2"].pt_phase == "A"
    assert m["b18944-2"].connecting_element == "b18941"
    assert m["b18944-2"].measuring_element == "Line.OH_B18944"
    assert m["b18944-2"].feeder_name == "sourcebus_src"

    assert set([pc.phase for pc in m["b18944-2"].phase_capacitors
                ]) == set(["A", "B", "C"])

    # oh_b18944
    assert len(m["oh_b18944"].wires) == 3  # Number of wires
    #    Phases of the different wires
    assert set([w.phase for w in m["oh_b18944"].wires]) == set(["A", "B", "C"])
    assert m["oh_b18944"].name == "oh_b18944"
    assert m[
        "oh_b18944"].nameclass == "OH-3X_4CU_4CUN"  # Linecode is OH-3X_4CU_4CUN
    assert m["oh_b18944"].line_type == None
    assert m["oh_b18944"].from_element == "b18941"
    assert m["oh_b18944"].to_element == "b18944"
    assert m["oh_b18944"].length == pytest.approx(141.1224)
    assert m["oh_b18944"].nominal_voltage == float(4.16) * 10**3
    assert m["oh_b18944"].is_fuse is None
    assert m["oh_b18944"].is_switch is None
    assert m["oh_b18944"].faultrate == parsed_values["Line"]["faultrate"]

    z1 = complex(0.85376372, 0.49484991)  # Specified in the dss input
    z0 = complex(1.2302027, 1.5569817)  # Specified in the dss input
    diag = ((2 * z1 + z0) / 3) * 0.001  # Units = km
    diag = round(diag.real, 10) + round(diag.imag, 10) * 1j
    rem = ((z0 - z1) / 3) * 0.001  # Units =km
    rem = round(rem.real, 10) + round(rem.imag, 10) * 1j
    imp_matrix = np.zeros((3, 3), dtype=np.complex_)
    imp_matrix.fill(rem)
    np.fill_diagonal(imp_matrix, diag)
    imp_matrix = imp_matrix.tolist()

    assert m["oh_b18944"].impedance_matrix == imp_matrix

    c1 = complex(8.7903, 0)  # Specified in the dss input
    c0 = complex(4.2476, 0)  # Specified in the dss input
    c_diag = ((2 * c1 + c0) / 3) * 0.001  # Units = km
    c_diag = round(c_diag.real, 9) + c_diag.imag * 1j
    c_rem = ((c0 - c1) / 3) * 0.001  # Units = km
    c_rem = round(c_rem.real, 9) + c_rem.imag * 1j
    cap_matrix = np.zeros((3, 3), dtype=np.complex_)
    cap_matrix.fill(c_rem)
    np.fill_diagonal(cap_matrix, c_diag)
    cap_matrix = cap_matrix.tolist()

    assert m["oh_b18944"].capacitance_matrix == cap_matrix

    assert m["oh_b18944"].feeder_name == "sourcebus_src"
    assert m["oh_b18944"].is_recloser is None
    assert m["oh_b18944"].is_breaker is None

    for w in m["oh_b18944"].wires:
        assert w.nameclass == ""
        assert w.X is None
        assert w.Y is None
        assert w.diameter is None
        assert w.gmr is None
        assert w.ampacity == float(142)
        assert w.emergency_ampacity == float(142)
        assert w.resistance is None
        assert w.insulation_thickness == 0.0
        assert w.is_open is None
        assert w.concentric_neutral_gmr is None
        assert w.concentric_neutral_resistance is None
        assert w.concentric_neutral_diameter is None
        assert w.concentric_neutral_outside_diameter is None
        assert w.concentric_neutral_nstrand is None

    #  Capacitors from ieee 8500-node test feeder

    assert (len(m["capbank0a"].phase_capacitors) == 1
            )  # capbank0a is a single phase capacitor
    assert m["capbank0a"].phase_capacitors[0].var == 400 * 10**3
    assert m["capbank0a"].name == "capbank0a"
    assert m["capbank0a"].nominal_voltage == float(7.2) * 10**3
    assert (m["capbank0a"].connection_type == parsed_values["Capacitor"]
            ["connection_type"])
    assert m["capbank0a"].delay == None
    assert m["capbank0a"].mode == None
    assert m["capbank0a"].low is None
    assert m["capbank0a"].high is None
    assert m["capbank0a"].resistance == 0.0
    assert m["capbank0a"].reactance == 0.0
    assert m["capbank0a"].susceptance is None
    assert m["capbank0a"].conductance is None
    assert m["capbank0a"].pt_ratio == None
    assert m["capbank0a"].ct_ratio is None
    assert m["capbank0a"].pt_phase == None
    assert m["capbank0a"].connecting_element == "r42246"
    assert m["capbank0a"].measuring_element == None
    assert m["capbank0a"].feeder_name == "sourcebus_src"

    assert m["capbank0a"].phase_capacitors[0].phase == "A"

    assert (len(m["capbank0b"].phase_capacitors) == 1
            )  # capbank0b is a single phase capacitor
    assert m["capbank0b"].phase_capacitors[0].var == 400 * 10**3
    assert m["capbank0b"].name == "capbank0b"
    assert m["capbank0b"].nominal_voltage == float(7.2) * 10**3
    assert (m["capbank0b"].connection_type == parsed_values["Capacitor"]
            ["connection_type"])
    assert m["capbank0b"].delay == None
    assert m["capbank0b"].mode == None
    assert m["capbank0b"].low is None
    assert m["capbank0b"].high is None
    assert m["capbank0b"].resistance == 0.0
    assert m["capbank0b"].reactance == 0.0
    assert m["capbank0b"].susceptance is None
    assert m["capbank0b"].conductance is None
    assert m["capbank0b"].pt_ratio == None
    assert m["capbank0b"].ct_ratio is None
    assert m["capbank0b"].pt_phase == None
    assert m["capbank0b"].connecting_element == "r42246"
    assert m["capbank0b"].measuring_element == None
    assert m["capbank0b"].feeder_name == "sourcebus_src"

    assert m["capbank0b"].phase_capacitors[0].phase == "B"

    assert (len(m["capbank0c"].phase_capacitors) == 1
            )  # capbank0c is a single phase capacitor
    assert m["capbank0c"].phase_capacitors[0].var == 400 * 10**3
    assert m["capbank0c"].name == "capbank0c"
    assert m["capbank0c"].nominal_voltage == float(7.2) * 10**3
    assert (m["capbank0c"].connection_type == parsed_values["Capacitor"]
            ["connection_type"])
    assert m["capbank0c"].delay == None
    assert m["capbank0c"].mode == None
    assert m["capbank0c"].low is None
    assert m["capbank0c"].high is None
    assert m["capbank0c"].resistance == 0.0
    assert m["capbank0c"].reactance == 0.0
    assert m["capbank0c"].susceptance is None
    assert m["capbank0c"].conductance is None
    assert m["capbank0c"].pt_ratio == None
    assert m["capbank0c"].ct_ratio is None
    assert m["capbank0c"].pt_phase == None
    assert m["capbank0c"].connecting_element == "r42246"
    assert m["capbank0c"].measuring_element == None
    assert m["capbank0c"].feeder_name == "sourcebus_src"

    assert m["capbank0c"].phase_capacitors[0].phase == "C"

    #  This is a 3-phase capacitor bank
    assert (len(m["capbank3"].phase_capacitors) == 3
            )  # capbank3 is a three phase capacitor
    assert sum([
        phase_capacitor.var
        for phase_capacitor in m["capbank3"].phase_capacitors
    ]) == pytest.approx(900 * 10**3, 0.0001)
    assert m["capbank3"].name == "capbank3"
    assert m["capbank3"].nominal_voltage == float(12.47112) * 10**3
    assert (m["capbank3"].connection_type == parsed_values["Capacitor"]
            ["connection_type"])
    assert m["capbank3"].delay == None
    assert m["capbank3"].mode == None
    assert m["capbank3"].low is None
    assert m["capbank3"].high is None
    assert m["capbank3"].resistance == 0.0
    assert m["capbank3"].reactance == 0.0
    assert m["capbank3"].susceptance is None
    assert m["capbank3"].conductance is None
    assert m["capbank3"].pt_ratio == None
    assert m["capbank3"].ct_ratio is None
    assert m["capbank3"].pt_phase == None
    assert m["capbank3"].connecting_element == "r18242"
    assert m["capbank3"].measuring_element == None
    assert m["capbank3"].feeder_name == "sourcebus_src"

    assert set([pc.phase for pc in m["capbank3"].phase_capacitors
                ]) == set(["A", "B", "C"])

    # 3-phase capacitor with number of phases mentioned
    assert (len(m["capbank3-1"].phase_capacitors) == 3
            )  # capbank3-1 is a three phase capacitor
    assert sum([
        phase_capacitor.var
        for phase_capacitor in m["capbank3-1"].phase_capacitors
    ]) == pytest.approx(900 * 10**3, 0.0001)
    assert m["capbank3-1"].nominal_voltage == float(12.47112) * 10**3
    assert m["capbank3-1"].name == "capbank3-1"
    assert (m["capbank3-1"].connection_type == parsed_values["Capacitor"]
            ["connection_type"])
    assert m["capbank3-1"].delay == None
    assert m["capbank3-1"].mode == None
    assert m["capbank3-1"].low is None
    assert m["capbank3-1"].high is None
    assert m["capbank3-1"].resistance == 0.0
    assert m["capbank3-1"].reactance == 0.0
    assert m["capbank3-1"].susceptance is None
    assert m["capbank3-1"].conductance is None
    assert m["capbank3-1"].pt_ratio == None
    assert m["capbank3-1"].ct_ratio is None
    assert m["capbank3-1"].pt_phase == None
    assert m["capbank3-1"].connecting_element == "r18242"
    assert m["capbank3-1"].measuring_element == None
    assert m["capbank3-1"].feeder_name == "sourcebus_src"

    assert set([pc.phase for pc in m["capbank3-1"].phase_capacitors
                ]) == set(["A", "B", "C"])
def main():
    '''
    Conversion example of the IEEE 123 node system.
    Gridlab-D ---> OpenDSS example.
    This example uses the glm file located in tests/data/big_cases/gridlabd/ieee_123node
    '''

    #Path settings (assuming it is run from examples folder)
    #Change this if you wish to use another system
    path = r'C:\Users\rjain\Desktop\BoxSync\NMG\ditto_ODO\ditto\tests\IEEE_13_nodes_origin'

    #################################
    #  STEP 1: READ FROM GRIDLAB-D  #
    #################################
    #
    #Create a Store object
    #    print('>>> Creating empty model...')
    #    model = Store()
    #
    #    #Instanciate a GridLab-D Reader object
    #    r = Reader_glab(input_file = os.path.join(path, 'The-1069-node-system.glm'))
    #
    #    #Parse (can take some time for large systems...)
    #    print('>>> Reading from Gridlab-D...')
    #    start = time.time() #basic timer
    #    r.parse(model)
    #    end = time.time()
    #    print('...Done (in {} seconds'.format(end-start))
    #
    #    ##############################
    #    #  STEP 2: WRITE TO OpenDSS  #
    #    ##############################
    #    #
    #    #Instanciate a Writer object
    #    #w = Writer(output_path = './')
    #
    #    #Write to OpenDSS (can also take some time for large systems...)
    #    w = Writer_dss(output_path = './tests/IEEE_13_nodes_out/glab_out')
    #
    #    print('>>> Writing to OpenDSS...')
    #    start = time.time() #basic timer
    #    w.write(model)
    #    end = time.time()
    #    print('...Done (in {} seconds'.format(end-start))

    #Create a Store object
    print('>>> Creating empty model...')
    m = Store()

    #Instanciate a OpenDSS Reader object
    r_dss = Reader_dss(
        master_file='./tests/IEEE_13_nodes_out/glab_out/Master.dss',
        bus_coordinates_file='./IEEE_13_nodes_origin/ReducedModel/BusCoords.dss'
    )
    print('>>> Reading from OpenDSS...')
    start = time.time()  #basic timer
    r_dss.parse(m, verbose=True)

    end = time.time()
    print('...Done (in {} seconds'.format(end - start))

    print('>>> Writing to ODO...')
    start = time.time()  #basic timer

    baseMVA = 10
    basekV = 13.8

    odo_writer = Writer_odo(linecodes_flag=True,
                            output_path='./IEEE_13_nodes_out',
                            basekV=basekV,
                            baseMVA=baseMVA)
    network = odo_writer.write(m, verbose=True)
    #    network = odo_writer.write(model, verbose=True)

    end = time.time()

    #network['baseKV'] = 4.16
    #network['baseMVA'] = 10.0
    network['baseKV'] = basekV
    network['baseMVA'] = baseMVA
    network['per_unit'] = bool(1)
    network['multinetwork'] = bool(0)

    with open('network_glabd.json', 'w') as f:
        f.write(
            json_tricks.dumps(network,
                              allow_nan=True,
                              sort_keys=True,
                              indent=4))

    Modeldss = OpenDSS.OpenDSS()

    Modeldss.disable_forms(
    )  # Turns off the window dialog boxes for progress bars and errors

    # compile and solve the given model file
    Modeldss.compile(
        r'C:\Users\rjain\Desktop\BoxSync\NMG\ditto_ODO\ditto\tests\IEEE_13_nodes_origin\master.dss'
    )
    #Modeldss.compile(r'C:\Users\rjain\Desktop\BoxSync\NMG\ditto_ODO\ditto\tests\IEEE_13_nodes_origin\ReducedModel\Master.DSS')
    Modeldss.solve()

    # Get the bus dictionary from OpenDSS_function
    busV = Modeldss.get_buses()

    ## Parsing the bus voltages into a usable format
    busV_dict = {}

    for bus in range(len(busV)):

        bus_id = busV[bus]["name"]
        nodes = busV[bus]["nodes"]
        voltages = busV[bus]["voltages"]
        puVmag = busV[bus]["puVmag"]

        busV_dict[bus_id] = {}

        temp_varr = [0, 0, 0]
        temp_thetaarr = [0, 0, 0]
        temp_vminarr = [-1, -1, -1]

        theta = []

        # Calculate angles in radians as atan(Q/P)
        for elem in range(len(nodes)):
            theta.append(math.atan(voltages[2 * elem + 1] /
                                   voltages[2 * elem]))

        # Finalizing the respective vm, va, vmin values given the nodes present
        node_count = 0

        for node in nodes:
            temp_thetaarr[node - 1] = theta[node_count]
            temp_varr[node - 1] = puVmag[node_count]
            temp_vminarr[node - 1] = 0.95

            node_count += 1

        busV_dict[bus_id]["nodes"] = nodes
        busV_dict[bus_id]["vmag"] = temp_varr
        busV_dict[bus_id]["vang"] = temp_thetaarr
        busV_dict[bus_id]["vmin"] = temp_vminarr

    for bus in network['bus'].keys():
        temp_bus = network['bus'][bus]["name"]

        network['bus'][bus]["vm"] = busV_dict[temp_bus]["vmag"]
        network['bus'][bus]["va"] = busV_dict[temp_bus]["vang"]
        network['bus'][bus]["vmin"] = busV_dict[temp_bus]["vmin"]

    ## Getting the P, Q Solution
    circuit = Modeldss.engine.ActiveCircuit

    circuit.SetActiveElement("Vsource.SOURCE")

    PQsoln = circuit.ActiveElement.Powers

    PSoln = [
        -1 * PQsoln[0] / (1000 * network['baseMVA']),
        -1 * PQsoln[2] / (1000 * network['baseMVA']),
        -1 * PQsoln[4] / (1000 * network['baseMVA'])
    ]
    QSoln = [
        -1 * PQsoln[1] / (1000 * network['baseMVA']),
        -1 * PQsoln[3] / (1000 * network['baseMVA']),
        -1 * PQsoln[5] / (1000 * network['baseMVA'])
    ]

    for source in network['generator'].keys():
        if network['generator'][source]["name"] == "Vsource.source":
            network['generator'][source]["pg"] = PSoln
            network['generator'][source]["qg"] = QSoln
            break

    with open('network_13bus.json', 'w') as f:
        f.write(
            json_tricks.dumps(network,
                              allow_nan=True,
                              sort_keys=True,
                              indent=4))

    with open('network_glabd.json', 'w') as f:
        f.write(
            json_tricks.dumps(network,
                              allow_nan=True,
                              sort_keys=True,
                              indent=4))

    print('...Done (in {} seconds'.format(end - start))
Пример #11
0
def test_capacitor_connectivity():
    m = Store()
    r = Reader(master_file=os.path.join(current_directory,
                                        "test_capacitor_connectivity.dss"))
    r.parse(m)
    m.set_names()

    # Reading OpenDSS default values
    d_v = Default_Values(
        os.path.join(
            current_directory,
            "../../../../ditto/default_values/opendss_default_values.json",
        ))
    parsed_values = d_v.parse()

    # Capacitor Cap1 should be a three phase capacitor (3 PhaseCapacitor objects) connected to bus1
    assert len(
        m["cap1"].phase_capacitors) == 3  # Cap1 is a three phase capacitor
    assert sum([
        phase_capacitor.var for phase_capacitor in m["cap1"].phase_capacitors
    ]) == pytest.approx(600 * 10**3, 0.0001)
    assert m["cap1"].name == "cap1"
    assert m["cap1"].nominal_voltage == float(4.16) * 10**3
    assert m["cap1"].connection_type == parsed_values["Capacitor"][
        "connection_type"]
    assert m["cap1"].delay is None
    assert m["cap1"].mode is None
    assert m["cap1"].low is None
    assert m["cap1"].high is None
    assert m["cap1"].resistance == 0.0
    assert m["cap1"].reactance == 0.0
    assert m["cap1"].susceptance is None
    assert m["cap1"].conductance is None
    assert m["cap1"].pt_ratio is None
    assert m["cap1"].ct_ratio is None
    assert m["cap1"].pt_phase is None
    assert m["cap1"].connecting_element == "bus1"
    assert m["cap1"].measuring_element is None
    assert m["cap1"].feeder_name == "sourcebus_src"

    assert set([pc.phase
                for pc in m["cap1"].phase_capacitors]) == set(["A", "B", "C"])
    assert [
        phase_capacitor.switch
        for phase_capacitor in m["cap1"].phase_capacitors
    ] == [None, None, None]
    assert [
        phase_capacitor.sections
        for phase_capacitor in m["cap1"].phase_capacitors
    ] == [None, None, None]
    assert [
        phase_capacitor.normalsections
        for phase_capacitor in m["cap1"].phase_capacitors
    ] == [None, None, None]

    # Capacitor Cap2 should be a one phase capacitor (1 PhaseCapacitor object) connected to bus2 on phase C
    assert len(
        m["cap2"].phase_capacitors) == 1  # Cap2 is a one phase capacitor
    assert m["cap2"].phase_capacitors[0].var == 100 * 10**3

    assert m["cap2"].name == "cap2"
    assert m["cap2"].nominal_voltage == float(2.4) * 10**3
    assert m["cap2"].connection_type == parsed_values["Capacitor"][
        "connection_type"]
    assert m["cap2"].delay is None
    assert m["cap2"].mode is None
    assert m["cap2"].low is None
    assert m["cap2"].high is None
    assert m["cap2"].resistance == 0.0
    assert m["cap2"].reactance == 0.0
    assert m["cap2"].susceptance is None
    assert m["cap2"].conductance is None
    assert m["cap2"].pt_ratio is None
    assert m["cap2"].ct_ratio is None
    assert m["cap2"].pt_phase is None
    assert m["cap2"].connecting_element == "bus2"
    assert m["cap2"].measuring_element is None
    assert m["cap2"].feeder_name == "sourcebus_src"

    assert m["cap2"].phase_capacitors[0].phase == "C"
    assert m["cap2"].phase_capacitors[0].switch == None
    assert m["cap2"].phase_capacitors[0].sections == None
    assert m["cap2"].phase_capacitors[0].normalsections == None

    # Capacitor Cap3 should be a one phase capacitor (1 PhaseCapacitor object) connected to bus3 on phase A
    assert len(
        m["cap3"].phase_capacitors) == 1  # Cap3 is a one phase capacitor
    assert m["cap3"].phase_capacitors[0].var == 200.37 * 10**3

    assert m["cap3"].name == "cap3"
    assert m["cap3"].nominal_voltage == float(2.4) * 10**3
    assert m["cap3"].connection_type == parsed_values["Capacitor"][
        "connection_type"]
    assert m["cap3"].delay is None
    assert m["cap3"].mode is None
    assert m["cap3"].low is None
    assert m["cap3"].high is None
    assert m["cap3"].resistance == 0.0
    assert m["cap3"].reactance == 0.0
    assert m["cap3"].susceptance is None
    assert m["cap3"].conductance is None
    assert m["cap3"].pt_ratio is None
    assert m["cap3"].ct_ratio is None
    assert m["cap3"].pt_phase is None
    assert m["cap3"].connecting_element == "bus3"
    assert m["cap3"].measuring_element is None
    assert m["cap3"].feeder_name == "sourcebus_src"

    assert m["cap3"].phase_capacitors[0].phase == "A"
    assert m["cap3"].phase_capacitors[0].switch == None
    assert m["cap3"].phase_capacitors[0].sections == None
    assert m["cap3"].phase_capacitors[0].normalsections == None

    # Capacitor Cap4 should be a two phase capacitor (2 PhaseCapacitor objects) connected to bus4 on phase A and C
    assert len(
        m["cap4"].phase_capacitors) == 2  # Cap4 is a two phase capacitor
    assert sum([
        phase_capacitor.var for phase_capacitor in m["cap4"].phase_capacitors
    ]) == pytest.approx(400 * 10**3, 0.0001)

    assert m["cap4"].name == "cap4"
    assert m["cap4"].nominal_voltage == float(2.4) * 10**3
    assert m["cap4"].connection_type == parsed_values["Capacitor"][
        "connection_type"]
    assert m["cap4"].delay is None
    assert m["cap4"].mode is None
    assert m["cap4"].low is None
    assert m["cap4"].high is None
    assert m["cap4"].resistance == 0.0
    assert m["cap4"].reactance == 0.0
    assert m["cap4"].susceptance is None
    assert m["cap4"].conductance is None
    assert m["cap4"].pt_ratio is None
    assert m["cap4"].ct_ratio is None
    assert m["cap4"].pt_phase is None
    assert m["cap4"].connecting_element == "bus4"
    assert m["cap4"].measuring_element is None
    assert m["cap4"].feeder_name == "sourcebus_src"

    assert set([pc.phase
                for pc in m["cap4"].phase_capacitors]) == set(["A", "C"])
    assert [
        phase_capacitor.switch
        for phase_capacitor in m["cap4"].phase_capacitors
    ] == [None, None]
    assert [
        phase_capacitor.sections
        for phase_capacitor in m["cap4"].phase_capacitors
    ] == [None, None]
    assert [
        phase_capacitor.normalsections
        for phase_capacitor in m["cap4"].phase_capacitors
    ] == [None, None]

    #  Capacitors from epri_j1
    assert len(m["b4909-1"].phase_capacitors
               ) == 3  # b4909-1 is a three phase capacitor
    assert sum([
        phase_capacitor.var
        for phase_capacitor in m["b4909-1"].phase_capacitors
    ]) == pytest.approx(900 * 10**3, 0.0001)
    assert m["b4909-1"].name == "b4909-1"
    assert m["b4909-1"].nominal_voltage == float(12.47) * 10**3
    assert m["b4909-1"].connection_type == parsed_values["Capacitor"][
        "connection_type"]
    assert m["b4909-1"].delay == 30
    assert m["b4909-1"].mode == "voltage"
    assert m["b4909-1"].low == parsed_values["Capacitor"]["low"]
    assert m["b4909-1"].high == parsed_values["Capacitor"]["high"]
    assert m["b4909-1"].resistance == 0.0
    assert m["b4909-1"].reactance == 0.0
    assert m["b4909-1"].susceptance is None
    assert m["b4909-1"].conductance is None
    assert m["b4909-1"].pt_ratio == parsed_values["Capacitor"]["pt_ratio"]
    assert m["b4909-1"].ct_ratio == parsed_values["Capacitor"]["ct_ratio"]
    assert m["b4909-1"].pt_phase == "B"
    assert m["b4909-1"].connecting_element == "b4909"
    assert m["b4909-1"].measuring_element == "Line.OH_B4904"
    assert m["b4909-1"].feeder_name == "sourcebus_src"

    assert set([pc.phase for pc in m["b4909-1"].phase_capacitors
                ]) == set(["A", "B", "C"])
    assert [
        phase_capacitor.switch
        for phase_capacitor in m["b4909-1"].phase_capacitors
    ] == [None, None, None]
    assert [
        phase_capacitor.sections
        for phase_capacitor in m["b4909-1"].phase_capacitors
    ] == [None, None, None]
    assert [
        phase_capacitor.normalsections
        for phase_capacitor in m["b4909-1"].phase_capacitors
    ] == [None, None, None]

    assert len(m["b4909-2"].phase_capacitors
               ) == 3  # b4909-2 is a three phase capacitor
    assert sum([
        phase_capacitor.var
        for phase_capacitor in m["b4909-2"].phase_capacitors
    ]) == pytest.approx(900 * 10**3, 0.0001)
    assert m["b4909-2"].name == "b4909-2"
    assert m["b4909-2"].nominal_voltage == float(12.47) * 10**3
    assert m["b4909-2"].connection_type == parsed_values["Capacitor"][
        "connection_type"]
    assert m["b4909-2"].delay == 30
    assert m["b4909-2"].mode == "voltage"
    assert m["b4909-2"].low == 120.5
    assert m["b4909-2"].high == 125
    assert m["b4909-2"].resistance == 0.0
    assert m["b4909-2"].reactance == 0.0
    assert m["b4909-2"].susceptance is None
    assert m["b4909-2"].conductance is None
    assert m["b4909-2"].pt_ratio == parsed_values["Capacitor"]["pt_ratio"]
    assert m["b4909-2"].ct_ratio == parsed_values["Capacitor"]["ct_ratio"]
    assert m["b4909-2"].pt_phase == "B"
    assert m["b4909-2"].connecting_element == "b4909"
    assert m["b4909-2"].measuring_element == "Line.OH_B4904"
    assert m["b4909-2"].feeder_name == "sourcebus_src"

    assert set([pc.phase for pc in m["b4909-2"].phase_capacitors
                ]) == set(["A", "B", "C"])
    assert [
        phase_capacitor.switch
        for phase_capacitor in m["b4909-2"].phase_capacitors
    ] == [None, None, None]
    assert [
        phase_capacitor.sections
        for phase_capacitor in m["b4909-2"].phase_capacitors
    ] == [None, None, None]
    assert [
        phase_capacitor.normalsections
        for phase_capacitor in m["b4909-2"].phase_capacitors
    ] == [None, None, None]

    # oh_b4904
    assert len(m["oh_b4904"].wires) == 3
    #    Phases of the different wires
    assert set([w.phase for w in m["oh_b4904"].wires]) == set(["A", "B", "C"])
    assert m["oh_b4904"].name == "oh_b4904"
    assert (m["oh_b4904"].nameclass == "OH-3X_477AAC_4/0AAACN"
            )  # Linecode is OH-3X_477AAC_4/0AAACN
    assert m["oh_b4904"].line_type == "overhead"  # OH in lincecode
    assert m["oh_b4904"].from_element == "b4909"
    assert m["oh_b4904"].to_element == "b4904"
    assert m["oh_b4904"].length == pytest.approx(161.84879)
    assert m["oh_b4904"].nominal_voltage == float(4.16) * 10**3
    assert m["oh_b4904"].is_fuse is None
    assert m["oh_b4904"].is_switch is None
    assert m["oh_b4904"].faultrate == parsed_values["Line"]["faultrate"]
    assert m["oh_b4904"].impedance_matrix == [
        [
            (0.0001931617 + 0.0006880528j),
            (7.075159e-05 + 0.0002931119j),
            (7.075159e-05 + 0.0002931119j),
        ],
        [
            (7.075159e-05 + 0.0002931119j),
            (0.0001931617 + 0.0006880528j),
            (7.075159e-05 + 0.0002931119j),
        ],
        [
            (7.075159e-05 + 0.0002931119j),
            (7.075159e-05 + 0.0002931119j),
            (0.0001931617 + 0.0006880528j),
        ],
    ]
    assert m["oh_b4904"].capacitance_matrix == [
        [(0.009067833 + 0j), (-0.002129467 + 0j), (-0.002129467 + 0j)],
        [(-0.002129467 + 0j), (0.009067833 + 0j), (-0.002129467 + 0j)],
        [(-0.002129467 + 0j), (-0.002129467 + 0j), (0.009067833 + 0j)],
    ]
    assert m["oh_b4904"].feeder_name == "sourcebus_src"
    assert m["oh_b4904"].is_recloser is None
    assert m["oh_b4904"].is_breaker is None

    for w in m["oh_b4904"].wires:
        assert w.nameclass == "4/0AAACN"
        assert w.X is None
        assert w.Y is None
        assert w.diameter is None
        assert w.gmr is None
        assert w.ampacity == float(732)
        assert w.emergency_ampacity == float(871)
        assert w.resistance is None
        assert w.insulation_thickness == 0.0
        assert w.is_open is None
        assert w.concentric_neutral_gmr is None
        assert w.concentric_neutral_resistance is None
        assert w.concentric_neutral_diameter is None
        assert w.concentric_neutral_outside_diameter is None
        assert w.concentric_neutral_nstrand is None

    assert (len(m["b18944-1"].phase_capacitors) == 3
            )  # b18944-1 is a three phase capacitor
    assert sum([
        phase_capacitor.var
        for phase_capacitor in m["b18944-1"].phase_capacitors
    ]) == pytest.approx(1200 * 10**3, 0.0001)
    assert m["b18944-1"].name == "b18944-1"
    assert m["b18944-1"].nominal_voltage == float(12.47) * 10**3
    assert (m["b18944-1"].connection_type == parsed_values["Capacitor"]
            ["connection_type"])
    assert m["b18944-1"].delay == 31
    assert m["b18944-1"].mode == "voltage"
    assert m["b18944-1"].low == parsed_values["Capacitor"]["low"]
    assert m["b18944-1"].high == parsed_values["Capacitor"]["high"]
    assert m["b18944-1"].resistance == 0.0
    assert m["b18944-1"].reactance == 0.0
    assert m["b18944-1"].susceptance is None
    assert m["b18944-1"].conductance is None
    assert m["b18944-1"].pt_ratio == parsed_values["Capacitor"]["pt_ratio"]
    assert m["b18944-1"].ct_ratio == parsed_values["Capacitor"]["ct_ratio"]
    assert m["b18944-1"].pt_phase == "A"
    assert m["b18944-1"].connecting_element == "b18941"
    assert m["b18944-1"].measuring_element == "Line.OH_B18944"
    assert m["b18944-1"].feeder_name == "sourcebus_src"

    assert set([pc.phase for pc in m["b18944-1"].phase_capacitors
                ]) == set(["A", "B", "C"])
    assert [
        phase_capacitor.switch
        for phase_capacitor in m["b18944-1"].phase_capacitors
    ] == [None, None, None]
    assert [
        phase_capacitor.sections
        for phase_capacitor in m["b18944-1"].phase_capacitors
    ] == [None, None, None]
    assert [
        phase_capacitor.normalsections
        for phase_capacitor in m["b18944-1"].phase_capacitors
    ] == [None, None, None]

    assert (len(m["b18944-2"].phase_capacitors) == 3
            )  # b18944-2 is a three phase capacitor
    assert sum([
        phase_capacitor.var
        for phase_capacitor in m["b18944-2"].phase_capacitors
    ]) == pytest.approx(1200 * 10**3, 0.0001)
    assert m["b18944-2"].name == "b18944-2"
    assert m["b18944-2"].nominal_voltage == float(12.47) * 10**3
    assert (m["b18944-2"].connection_type == parsed_values["Capacitor"]
            ["connection_type"])
    assert m["b18944-2"].delay == 31
    assert m["b18944-2"].mode == "voltage"
    assert m["b18944-2"].low == 118
    assert m["b18944-2"].high == 124
    assert m["b18944-2"].resistance == 0.0
    assert m["b18944-2"].reactance == 0.0
    assert m["b18944-2"].susceptance is None
    assert m["b18944-2"].conductance is None
    assert m["b18944-2"].pt_ratio == parsed_values["Capacitor"]["pt_ratio"]
    assert m["b18944-2"].ct_ratio == parsed_values["Capacitor"]["ct_ratio"]
    assert m["b18944-2"].pt_phase == "A"
    assert m["b18944-2"].connecting_element == "b18941"
    assert m["b18944-2"].measuring_element == "Line.OH_B18944"
    assert m["b18944-2"].feeder_name == "sourcebus_src"

    assert set([pc.phase for pc in m["b18944-2"].phase_capacitors
                ]) == set(["A", "B", "C"])
    assert [
        phase_capacitor.switch
        for phase_capacitor in m["b18944-2"].phase_capacitors
    ] == [None, None, None]
    assert [
        phase_capacitor.sections
        for phase_capacitor in m["b18944-2"].phase_capacitors
    ] == [None, None, None]
    assert [
        phase_capacitor.normalsections
        for phase_capacitor in m["b18944-2"].phase_capacitors
    ] == [None, None, None]

    # oh_b18944
    assert len(m["oh_b18944"].wires) == 3  # Number of wires
    #    Phases of the different wires
    assert set([w.phase for w in m["oh_b18944"].wires]) == set(["A", "B", "C"])
    assert m["oh_b18944"].name == "oh_b18944"
    assert m[
        "oh_b18944"].nameclass == "OH-3X_4CU_4CUN"  # Linecode is OH-3X_4CU_4CUN
    assert m["oh_b18944"].line_type == "overhead"  # OH in lincecode
    assert m["oh_b18944"].from_element == "b18941"
    assert m["oh_b18944"].to_element == "b18944"
    assert m["oh_b18944"].length == pytest.approx(141.1224)
    assert m["oh_b18944"].nominal_voltage == float(4.16) * 10**3
    assert m["oh_b18944"].is_fuse is None
    assert m["oh_b18944"].is_switch is None
    assert m["oh_b18944"].faultrate == parsed_values["Line"]["faultrate"]
    assert m["oh_b18944"].impedance_matrix == [
        [
            (0.0009792434 + 0.0008488938j),
            (0.0001254797 + 0.0003540439j),
            (0.0001254797 + 0.0003540439j),
        ],
        [
            (0.0001254797 + 0.0003540439j),
            (0.0009792434 + 0.0008488938j),
            (0.0001254797 + 0.0003540439j),
        ],
        [
            (0.0001254797 + 0.0003540439j),
            (0.0001254797 + 0.0003540439j),
            (0.0009792434 + 0.0008488938j),
        ],
    ]
    assert m["oh_b18944"].capacitance_matrix == [
        [(0.007276067 + 0j), (-0.001514233 + 0j), (-0.001514233 + 0j)],
        [(-0.001514233 + 0j), (0.007276067 + 0j), (-0.001514233 + 0j)],
        [(-0.001514233 + 0j), (-0.001514233 + 0j), (0.007276067 + 0j)],
    ]
    assert m["oh_b18944"].feeder_name == "sourcebus_src"
    assert m["oh_b18944"].is_recloser is None
    assert m["oh_b18944"].is_breaker is None

    for w in m["oh_b18944"].wires:
        assert w.nameclass == "4CUN"
        assert w.X is None
        assert w.Y is None
        assert w.diameter is None
        assert w.gmr is None
        assert w.ampacity == float(142)
        assert w.emergency_ampacity == float(142)
        assert w.resistance is None
        assert w.insulation_thickness == 0.0
        assert w.is_open is None
        assert w.concentric_neutral_gmr is None
        assert w.concentric_neutral_resistance is None
        assert w.concentric_neutral_diameter is None
        assert w.concentric_neutral_outside_diameter is None
        assert w.concentric_neutral_nstrand is None

    #  Capacitors from ieee 8500-node test feeder

    assert (len(m["capbank0a"].phase_capacitors) == 1
            )  # capbank0a is a single phase capacitor
    assert m["capbank0a"].phase_capacitors[0].var == 400 * 10**3
    assert m["capbank0a"].name == "capbank0a"
    assert m["capbank0a"].nominal_voltage == float(7.2) * 10**3
    assert (m["capbank0a"].connection_type == parsed_values["Capacitor"]
            ["connection_type"])
    assert m["capbank0a"].delay == None
    assert m["capbank0a"].mode == None
    assert m["capbank0a"].low is None
    assert m["capbank0a"].high is None
    assert m["capbank0a"].resistance == 0.0
    assert m["capbank0a"].reactance == 0.0
    assert m["capbank0a"].susceptance is None
    assert m["capbank0a"].conductance is None
    assert m["capbank0a"].pt_ratio == None
    assert m["capbank0a"].ct_ratio is None
    assert m["capbank0a"].pt_phase == None
    assert m["capbank0a"].connecting_element == "r42246"
    assert m["capbank0a"].measuring_element == None
    assert m["capbank0a"].feeder_name == "sourcebus_src"

    assert m["capbank0a"].phase_capacitors[0].phase == "A"
    assert m["capbank0a"].phase_capacitors[0].switch == None
    assert m["capbank0a"].phase_capacitors[0].sections == None
    assert m["capbank0a"].phase_capacitors[0].normalsections == None

    assert (len(m["capbank0b"].phase_capacitors) == 1
            )  # capbank0b is a single phase capacitor
    assert m["capbank0b"].phase_capacitors[0].var == 400 * 10**3
    assert m["capbank0b"].name == "capbank0b"
    assert m["capbank0b"].nominal_voltage == float(7.2) * 10**3
    assert (m["capbank0b"].connection_type == parsed_values["Capacitor"]
            ["connection_type"])
    assert m["capbank0b"].delay == None
    assert m["capbank0b"].mode == None
    assert m["capbank0b"].low is None
    assert m["capbank0b"].high is None
    assert m["capbank0b"].resistance == 0.0
    assert m["capbank0b"].reactance == 0.0
    assert m["capbank0b"].susceptance is None
    assert m["capbank0b"].conductance is None
    assert m["capbank0b"].pt_ratio == None
    assert m["capbank0b"].ct_ratio is None
    assert m["capbank0b"].pt_phase == None
    assert m["capbank0b"].connecting_element == "r42246"
    assert m["capbank0b"].measuring_element == None
    assert m["capbank0b"].feeder_name == "sourcebus_src"

    assert m["capbank0b"].phase_capacitors[0].phase == "B"
    assert m["capbank0b"].phase_capacitors[0].switch == None
    assert m["capbank0b"].phase_capacitors[0].sections == None
    assert m["capbank0b"].phase_capacitors[0].normalsections == None

    assert (len(m["capbank0c"].phase_capacitors) == 1
            )  # capbank0c is a single phase capacitor
    assert m["capbank0c"].phase_capacitors[0].var == 400 * 10**3
    assert m["capbank0c"].name == "capbank0c"
    assert m["capbank0c"].nominal_voltage == float(7.2) * 10**3
    assert (m["capbank0c"].connection_type == parsed_values["Capacitor"]
            ["connection_type"])
    assert m["capbank0c"].delay == None
    assert m["capbank0c"].mode == None
    assert m["capbank0c"].low is None
    assert m["capbank0c"].high is None
    assert m["capbank0c"].resistance == 0.0
    assert m["capbank0c"].reactance == 0.0
    assert m["capbank0c"].susceptance is None
    assert m["capbank0c"].conductance is None
    assert m["capbank0c"].pt_ratio == None
    assert m["capbank0c"].ct_ratio is None
    assert m["capbank0c"].pt_phase == None
    assert m["capbank0c"].connecting_element == "r42246"
    assert m["capbank0c"].measuring_element == None
    assert m["capbank0c"].feeder_name == "sourcebus_src"

    assert m["capbank0c"].phase_capacitors[0].phase == "C"
    assert m["capbank0c"].phase_capacitors[0].switch == None
    assert m["capbank0c"].phase_capacitors[0].sections == None
    assert m["capbank0c"].phase_capacitors[0].normalsections == None

    #  This is a 3-phase capacitor bank
    assert (len(m["capbank3"].phase_capacitors) == 3
            )  # capbank3 is a three phase capacitor
    assert sum([
        phase_capacitor.var
        for phase_capacitor in m["capbank3"].phase_capacitors
    ]) == pytest.approx(900 * 10**3, 0.0001)
    assert m["capbank3"].name == "capbank3"
    assert m["capbank3"].nominal_voltage == float(12.47112) * 10**3
    assert (m["capbank3"].connection_type == parsed_values["Capacitor"]
            ["connection_type"])
    assert m["capbank3"].delay == None
    assert m["capbank3"].mode == None
    assert m["capbank3"].low is None
    assert m["capbank3"].high is None
    assert m["capbank3"].resistance == 0.0
    assert m["capbank3"].reactance == 0.0
    assert m["capbank3"].susceptance is None
    assert m["capbank3"].conductance is None
    assert m["capbank3"].pt_ratio == None
    assert m["capbank3"].ct_ratio is None
    assert m["capbank3"].pt_phase == None
    assert m["capbank3"].connecting_element == "r18242"
    assert m["capbank3"].measuring_element == None
    assert m["capbank3"].feeder_name == "sourcebus_src"

    assert set([pc.phase for pc in m["capbank3"].phase_capacitors
                ]) == set(["A", "B", "C"])
    assert [
        phase_capacitor.switch
        for phase_capacitor in m["capbank3"].phase_capacitors
    ] == [None, None, None]
    assert [
        phase_capacitor.sections
        for phase_capacitor in m["capbank3"].phase_capacitors
    ] == [None, None, None]
    assert [
        phase_capacitor.normalsections
        for phase_capacitor in m["capbank3"].phase_capacitors
    ] == [None, None, None]

    # 3-phase capacitor with number of phases mentioned
    assert (len(m["capbank3-1"].phase_capacitors) == 3
            )  # capbank3-1 is a three phase capacitor
    assert sum([
        phase_capacitor.var
        for phase_capacitor in m["capbank3-1"].phase_capacitors
    ]) == pytest.approx(900 * 10**3, 0.0001)
    assert m["capbank3-1"].nominal_voltage == float(12.47112) * 10**3
    assert m["capbank3-1"].name == "capbank3-1"
    assert (m["capbank3-1"].connection_type == parsed_values["Capacitor"]
            ["connection_type"])
    assert m["capbank3-1"].delay == None
    assert m["capbank3-1"].mode == None
    assert m["capbank3-1"].low is None
    assert m["capbank3-1"].high is None
    assert m["capbank3-1"].resistance == 0.0
    assert m["capbank3-1"].reactance == 0.0
    assert m["capbank3-1"].susceptance is None
    assert m["capbank3-1"].conductance is None
    assert m["capbank3-1"].pt_ratio == None
    assert m["capbank3-1"].ct_ratio is None
    assert m["capbank3-1"].pt_phase == None
    assert m["capbank3-1"].connecting_element == "r18242"
    assert m["capbank3-1"].measuring_element == None
    assert m["capbank3-1"].feeder_name == "sourcebus_src"

    assert set([pc.phase for pc in m["capbank3-1"].phase_capacitors
                ]) == set(["A", "B", "C"])
    assert [
        phase_capacitor.switch
        for phase_capacitor in m["capbank3-1"].phase_capacitors
    ] == [None, None, None]
    assert [
        phase_capacitor.sections
        for phase_capacitor in m["capbank3-1"].phase_capacitors
    ] == [None, None, None]
    assert [
        phase_capacitor.normalsections
        for phase_capacitor in m["capbank3-1"].phase_capacitors
    ] == [None, None, None]
Пример #12
0
from ditto.readers.opendss.read import Reader as Reader_opendss
from ditto.readers.cyme.read import Reader as Reader_cyme
from ditto.writers.json.write import Writer
from ditto.store import Store
import logging
import json_tricks

logger = logging.getLogger(__name__)
test_list = os.walk('data')
for (dirpath, dirname, files) in test_list:
    if files != []:
        reader_type = dirpath.split('\\')[2]
        m = Store()
        if reader_type == 'opendss':
            reader = Reader_opendss(
                master_file=os.path.join('..', dirpath, 'master.dss'),
                buscoordinates_file=os.path.join('..', dirpath,
                                                 'buscoord.dss'))
        elif reader_type == 'cyme':
            reader = Reader_cyme(data_folder_path=os.path.join('..', dirpath))
        else:
            #Update with other tests if they get added to the persistence tests
            continue
        reader.parse(m)
        m.set_names()
        output_path = tempfile.TemporaryDirectory()
        w = Writer(output_path=output_path.name, log_path=output_path)
        w.write(m)
        original = json_tricks.load(open(os.path.join(dirpath, files[0]), 'r'))
        update = json_tricks.load(
            open(os.path.join(output_path.name, 'Model.json'), 'r'))
        try:
Пример #13
0
def test_line_connectivity():
    from ditto.store import Store
    from ditto.readers.opendss.read import Reader

    # test on the test_line_connectivity.dss
    m = Store()
    r = Reader(
        master_file=os.path.join(current_directory, "test_line_connectivity.dss")
    )
    r.parse(m)
    m.set_names()

    # Reading OpenDSS default values
    d_v = Default_Values(
        os.path.join(
            current_directory,
            "../../../../ditto/default_values/opendss_default_values.json",
        )
    )
    parsed_values = d_v.parse()

    # Line1 connects sourcebus to bus1 and should have 3 wires: A, B, C
    assert len(m["line1"].wires) == 3
    #    Phases of the different wires
    assert set([w.phase for w in m["line1"].wires]) == set(["A", "B", "C"])
    assert m["line1"].name == "line1"
    assert m["line1"].nominal_voltage == float(4.16) * 10 ** 3
    assert m["line1"].line_type is None
    assert m["line1"].length == 100
    assert m["line1"].from_element == "sourcebus"
    assert m["line1"].to_element == "bus1"
    assert m["line1"].is_fuse is None
    assert m["line1"].is_switch is None
    assert m["line1"].faultrate == parsed_values["Line"]["faultrate"]

    z1 = complex(
        parsed_values["Line"]["R1"], parsed_values["Line"]["X1"]
    )  # r1,x1 taken from default values
    z0 = complex(
        parsed_values["Line"]["R0"], parsed_values["Line"]["X0"]
    )  # r0,x0 taken from default values
    diag = (2 * z1 + z0) / 3
    diag = round(diag.real, 8) + round(diag.imag, 4) * 1j
    rem = (z0 - z1) / 3
    rem = round(rem.real, 8) + rem.imag * 1j
    imp_matrix = np.zeros((3, 3), dtype=np.complex_)
    imp_matrix.fill(rem)
    np.fill_diagonal(imp_matrix, diag)
    imp_matrix = imp_matrix.tolist()

    assert m["line1"].impedance_matrix == imp_matrix

    c1 = complex(parsed_values["Line"]["C1"], 0)  # c1 taken from default values
    c0 = complex(parsed_values["Line"]["C0"], 0)  # c0 taken from default values
    c_diag = (2 * c1 + c0) / 3
    c_diag = round(c_diag.real, 4) + c_diag.imag * 1j
    c_rem = (c0 - c1) / 3
    c_rem = round(c_rem.real, 4) + c_rem.imag * 1j
    cap_matrix = np.zeros((3, 3), dtype=np.complex_)
    cap_matrix.fill(c_rem)
    np.fill_diagonal(cap_matrix, c_diag)
    cap_matrix = cap_matrix.tolist()

    assert m["line1"].capacitance_matrix == cap_matrix
    assert m["line1"].feeder_name == "sourcebus_src"
    assert m["line1"].is_recloser is None
    assert m["line1"].is_breaker is None
    assert m["line1"].nameclass == ""

    for w in m["line1"].wires:
        assert w.nameclass == ""
        assert w.X is None
        assert w.Y is None
        assert w.diameter is None
        assert w.gmr is None
        assert w.ampacity == parsed_values["Wire"]["ampacity"]
        assert w.emergency_ampacity == parsed_values["Wire"]["emergency_ampacity"]
        assert w.resistance is None
        assert w.insulation_thickness == parsed_values["Wire"]["insulation_thickness"]
        assert w.is_open is None
        assert w.concentric_neutral_gmr is None
        assert w.concentric_neutral_resistance is None
        assert w.concentric_neutral_diameter is None
        assert w.concentric_neutral_outside_diameter is None
        assert w.concentric_neutral_nstrand is None

    # Line2 connects bus1 to bus2 and should have 3 wires: A, B, C
    assert len(m["line2"].wires) == 3
    #    Phases of the different wires
    assert set([w.phase for w in m["line2"].wires]) == set(["A", "B", "C"])
    assert m["line2"].name == "line2"
    assert m["line2"].nominal_voltage == float(4.16) * 10 ** 3
    assert m["line2"].line_type is None
    assert m["line2"].length == 200
    assert m["line2"].from_element == "bus1"
    assert m["line2"].to_element == "bus2"
    assert m["line2"].is_fuse is None
    assert m["line2"].is_switch is None
    assert m["line2"].faultrate == parsed_values["Line"]["faultrate"]
    assert (
        m["line2"].impedance_matrix == imp_matrix
    )  # Copying the matrix from Line1 as it has 3 wires
    assert (
        m["line2"].capacitance_matrix == cap_matrix
    )  # Copying the matrix from Line1 as it has 3 wires
    assert m["line2"].feeder_name == "sourcebus_src"
    assert m["line2"].is_recloser is None
    assert m["line2"].is_breaker is None
    assert m["line2"].nameclass == ""

    for w in m["line2"].wires:
        assert w.nameclass == ""
        assert w.X is None
        assert w.Y is None
        assert w.diameter is None
        assert w.gmr is None
        assert w.ampacity == parsed_values["Wire"]["ampacity"]
        assert w.emergency_ampacity == parsed_values["Wire"]["emergency_ampacity"]
        assert w.resistance is None
        assert w.insulation_thickness == parsed_values["Wire"]["insulation_thickness"]
        assert w.is_open is None
        assert w.concentric_neutral_gmr is None
        assert w.concentric_neutral_resistance is None
        assert w.concentric_neutral_diameter is None
        assert w.concentric_neutral_outside_diameter is None
        assert w.concentric_neutral_nstrand is None

    #  Line3 connects bus2 to bus3 and should have 2 wires: A, B
    assert len(m["line3"].wires) == 2
    #    Phases of the different wires
    assert set([w.phase for w in m["line3"].wires]) == set(["A", "B"])
    assert m["line3"].name == "line3"
    assert m["line3"].nominal_voltage == float(4.16) * 10 ** 3
    assert m["line3"].line_type is None
    assert m["line3"].length == 50
    assert m["line3"].from_element == "bus2"
    assert m["line3"].to_element == "bus3"
    assert m["line3"].is_fuse is None
    assert m["line3"].is_switch is None
    assert m["line3"].faultrate == parsed_values["Line"]["faultrate"]
    z1 = complex(
        parsed_values["Line"]["R1"], parsed_values["Line"]["X1"]
    )  # r1,x1 taken from default values
    z0 = complex(
        parsed_values["Line"]["R0"], parsed_values["Line"]["X0"]
    )  # r0,x0 taken from default values
    diag = (2 * z1 + z0) / 3
    diag = round(diag.real, 8) + round(diag.imag, 4) * 1j
    rem = (z0 - z1) / 3
    rem = round(rem.real, 8) + rem.imag * 1j
    imp_matrix = np.zeros((2, 2), dtype=np.complex_)
    imp_matrix.fill(rem)
    np.fill_diagonal(imp_matrix, diag)
    imp_matrix = imp_matrix.tolist()

    assert m["line3"].impedance_matrix == imp_matrix

    c1 = complex(parsed_values["Line"]["C1"], 0)  # c1 taken from default values
    c0 = complex(parsed_values["Line"]["C0"], 0)  # c0 taken from default values
    c_diag = (2 * c1 + c0) / 3
    c_diag = round(c_diag.real, 4) + c_diag.imag * 1j
    c_rem = (c0 - c1) / 3
    c_rem = round(c_rem.real, 4) + c_rem.imag * 1j
    cap_matrix = np.zeros((2, 2), dtype=np.complex_)
    cap_matrix.fill(c_rem)
    np.fill_diagonal(cap_matrix, c_diag)
    cap_matrix = cap_matrix.tolist()

    assert m["line3"].capacitance_matrix == cap_matrix
    assert m["line3"].feeder_name == "sourcebus_src"
    assert m["line3"].is_recloser is None
    assert m["line3"].is_breaker is None
    assert m["line3"].nameclass == ""

    for w in m["line3"].wires:
        assert w.nameclass == ""
        assert w.X is None
        assert w.Y is None
        assert w.diameter is None
        assert w.gmr is None
        assert w.ampacity == parsed_values["Wire"]["ampacity"]
        assert w.emergency_ampacity == parsed_values["Wire"]["emergency_ampacity"]
        assert w.resistance is None
        assert w.insulation_thickness == parsed_values["Wire"]["insulation_thickness"]
        assert w.is_open is None
        assert w.concentric_neutral_gmr is None
        assert w.concentric_neutral_resistance is None
        assert w.concentric_neutral_diameter is None
        assert w.concentric_neutral_outside_diameter is None
        assert w.concentric_neutral_nstrand is None

    #  Line4 connects bus3 to bus4 and should have 1 wire: B
    assert len(m["line4"].wires) == 1
    #    Phases of the different wires
    assert set([w.phase for w in m["line4"].wires]) == set(["B"])
    assert m["line4"].name == "line4"
    assert m["line4"].nominal_voltage == float(4.16) * 10 ** 3
    assert m["line4"].line_type is None
    assert m["line4"].length == 25
    assert m["line4"].from_element == "bus3"
    assert m["line4"].to_element == "bus4"
    assert m["line4"].is_fuse is None
    assert m["line4"].is_switch is None
    assert m["line4"].faultrate == parsed_values["Line"]["faultrate"]
    imp_matrix = complex(parsed_values["Line"]["R1"], parsed_values["Line"]["X1"])
    imp_matrix = round(imp_matrix.real, 9) + imp_matrix.imag * 1j
    assert m["line4"].impedance_matrix == [[imp_matrix]]
    cap_matrix = complex(parsed_values["Line"]["C1"], 0)
    assert m["line4"].capacitance_matrix == [[cap_matrix]]
    assert m["line4"].feeder_name == "sourcebus_src"
    assert m["line4"].is_recloser is None
    assert m["line4"].is_breaker is None
    assert m["line4"].nameclass == ""

    for w in m["line4"].wires:
        assert w.nameclass == ""
        assert w.X is None
        assert w.Y is None
        assert w.diameter is None
        assert w.gmr is None
        assert w.ampacity == parsed_values["Wire"]["ampacity"]
        assert w.emergency_ampacity == parsed_values["Wire"]["emergency_ampacity"]
        assert w.resistance is None
        assert w.insulation_thickness == parsed_values["Wire"]["insulation_thickness"]
        assert w.is_open is None
        assert w.concentric_neutral_gmr is None
        assert w.concentric_neutral_resistance is None
        assert w.concentric_neutral_diameter is None
        assert w.concentric_neutral_outside_diameter is None
        assert w.concentric_neutral_nstrand is None

    #  Line5 connects bus1 to bus5 and should have 2 wires: A, C
    assert len(m["line5"].wires) == 2
    #    Phases of the different wires
    assert set(w.phase for w in m["line5"].wires) == set(["A", "C"])
    assert m["line5"].name == "line5"
    assert m["line5"].nominal_voltage == float(4.16) * 10 ** 3
    assert m["line5"].line_type is None
    assert m["line5"].length == float(1500 * 0.3048)  # units = ft
    assert m["line5"].from_element == "bus1"
    assert m["line5"].to_element == "bus5"
    assert m["line5"].is_fuse is None
    assert m["line5"].is_switch is None
    assert m["line5"].faultrate == parsed_values["Line"]["faultrate"]

    z1 = complex(
        parsed_values["Line"]["R1"], parsed_values["Line"]["X1"]
    )  # r1,x1 taken from default values
    z0 = complex(
        parsed_values["Line"]["R0"], parsed_values["Line"]["X0"]
    )  # r0,x0 taken from default values
    #    import pdb;pdb.set_trace()
    diag = ((2 * z1 + z0) / 3) / 0.3048  # Units = ft
    diag = round(diag.real, 11) + round(diag.imag, 10) * 1j
    rem = ((z0 - z1) / 3) / 0.3048  # Units = ft
    rem = round(rem.real, 11) + rem.imag * 1j
    imp_matrix = np.zeros((2, 2), dtype=np.complex_)
    imp_matrix.fill(rem)
    np.fill_diagonal(imp_matrix, diag)
    imp_matrix = imp_matrix.tolist()

    #    assert m["line5"].impedance_matrix == imp_matrix

    c1 = complex(parsed_values["Line"]["C1"], 0)  # c1 taken from default values
    c0 = complex(parsed_values["Line"]["C0"], 0)  # c0 taken from default values
    c_diag = ((2 * c1 + c0) / 3) / 0.3048  # Units = ft
    c_diag = c_diag.real + c_diag.imag * 1j
    c_rem = ((c0 - c1) / 3) / 0.3048  # Units = ft
    c_rem = c_rem.real + c_rem.imag * 1j
    cap_matrix = np.zeros((2, 2), dtype=np.complex_)
    cap_matrix.fill(c_rem)
    np.fill_diagonal(cap_matrix, c_diag)
    cap_matrix = cap_matrix.tolist()

    np.testing.assert_array_almost_equal(m["line5"].capacitance_matrix, cap_matrix)
    assert m["line5"].feeder_name == "sourcebus_src"
    assert m["line5"].is_recloser is None
    assert m["line5"].is_breaker is None
    assert m["line5"].nameclass == ""

    for w in m["line5"].wires:
        assert w.nameclass == ""
        assert w.X is None
        assert w.Y is None
        assert w.diameter is None
        assert w.gmr is None
        assert w.ampacity == parsed_values["Wire"]["ampacity"]
        assert w.emergency_ampacity == parsed_values["Wire"]["emergency_ampacity"]
        assert w.resistance is None
        assert w.insulation_thickness == parsed_values["Wire"]["insulation_thickness"]
        assert w.is_open is None
        assert w.concentric_neutral_gmr is None
        assert w.concentric_neutral_resistance is None
        assert w.concentric_neutral_diameter is None
        assert w.concentric_neutral_outside_diameter is None
        assert w.concentric_neutral_nstrand is None

    #  Line6 connects bus4 to bus6 and should have 2 wires: B, C
    assert len(m["line6"].wires) == 2
    #    Phases of the different wires
    assert set([w.phase for w in m["line6"].wires]) == set(["B", "C"])
    assert m["line6"].name == "line6"
    assert m["line6"].nominal_voltage == float(4.16) * 10 ** 3
    assert m["line6"].line_type is None
    assert m["line6"].length == 110
    assert m["line6"].from_element == "bus4"
    assert m["line6"].to_element == "bus6"
    assert m["line6"].is_fuse is None
    assert m["line6"].is_switch is None
    assert m["line6"].faultrate == parsed_values["Line"]["faultrate"]
    assert m["line6"].impedance_matrix == [
        [(0.09813333 + 0.2153j), (0.04013333 + 0.0947j)],
        [(0.04013333 + 0.0947j), (0.09813333 + 0.2153j)],
    ]
    assert m["line6"].capacitance_matrix == [
        [(2.8 + 0j), (-0.6 + 0j)],
        [(-0.6 + 0j), (2.8 + 0j)],
    ]
    assert m["line6"].feeder_name == "sourcebus_src"
    assert m["line6"].is_recloser is None
    assert m["line6"].is_breaker is None
    assert m["line6"].nameclass == ""

    for w in m["line6"].wires:
        assert w.nameclass == ""
        assert w.X is None
        assert w.Y is None
        assert w.diameter is None
        assert w.gmr is None
        assert w.ampacity == parsed_values["Wire"]["ampacity"]
        assert w.emergency_ampacity == parsed_values["Wire"]["emergency_ampacity"]
        assert w.resistance is None
        assert w.insulation_thickness == parsed_values["Wire"]["insulation_thickness"]
        assert w.is_open is None
        assert w.concentric_neutral_gmr is None
        assert w.concentric_neutral_resistance is None
        assert w.concentric_neutral_diameter is None
        assert w.concentric_neutral_outside_diameter is None
        assert w.concentric_neutral_nstrand is None

    #  Line7
    assert len(m["line7"].wires) == 2
    #    Phases of the different wires
    assert set([w.phase for w in m["line7"].wires]) == set(["B", "C"])
    assert m["line7"].name == "line7"
    assert m["line7"].nominal_voltage == float(4.16) * 10 ** 3
    assert m["line7"].line_type is None
    assert m["line7"].length == 100
    assert m["line7"].from_element == "bus1"
    assert m["line7"].to_element == "bus2"
    assert m["line7"].is_fuse is None
    assert m["line7"].is_switch is None
    assert m["line7"].faultrate == parsed_values["Line"]["faultrate"]
    assert m["line7"].impedance_matrix == [
        [(0.09813333 + 0.2153j), (0.04013333 + 0.0947j)],
        [(0.04013333 + 0.0947j), (0.09813333 + 0.2153j)],
    ]
    assert m["line7"].capacitance_matrix == [
        [(2.8 + 0j), (-0.6 + 0j)],
        [(-0.6 + 0j), (2.8 + 0j)],
    ]
    assert m["line7"].feeder_name == "sourcebus_src"
    assert m["line7"].is_recloser is None
    assert m["line7"].is_breaker is None
    assert m["line7"].nameclass == ""

    for w in m["line7"].wires:
        assert w.nameclass == ""
        assert w.X is None
        assert w.Y is None
        assert w.diameter is None
        assert w.gmr is None
        assert w.ampacity == parsed_values["Wire"]["ampacity"]
        assert w.emergency_ampacity == parsed_values["Wire"]["emergency_ampacity"]
        assert w.resistance is None
        assert w.insulation_thickness == parsed_values["Wire"]["insulation_thickness"]
        assert w.is_open is None
        assert w.concentric_neutral_gmr is None
        assert w.concentric_neutral_resistance is None
        assert w.concentric_neutral_diameter is None
        assert w.concentric_neutral_outside_diameter is None
        assert w.concentric_neutral_nstrand is None
Пример #14
0
def test_linecodes():
    """Tests if linecodes are read correctly."""
    from ditto.store import Store
    from ditto.readers.opendss.read import Reader

    # test on the test_linecodes.dss
    m = Store()
    r = Reader(
        master_file=os.path.join(current_directory, "test_linecodes.dss"))
    r.parse(m)
    m.set_names()

    # Reading OpenDSS default values
    d_v = Default_Values(
        os.path.join(
            current_directory,
            "../../../../ditto/default_values/opendss_default_values.json",
        ))
    parsed_values = d_v.parse()

    # Line 1
    assert len(m["line1"].wires) == 3
    #    Phases of the different wires
    assert set([w.phase for w in m["line1"].wires]) == set(["A", "B", "C"])
    assert m[
        "line1"].nameclass == "3-1/0C_2/0CN_T"  # Linecode is 3-1/0C_2/0CN_T
    assert m["line1"].line_type == None
    assert m["line1"].from_element == "bus1"
    assert m["line1"].to_element == "bus2"
    assert m["line1"].length == 10
    assert m["line1"].nominal_voltage == float(12.47) * 10**3
    assert m["line1"].is_fuse is None
    assert m["line1"].is_switch is None
    assert m["line1"].faultrate == parsed_values["Line"]["faultrate"]

    z1 = complex(0.3489, 0.426198)  # r1,x1 values from linecode
    z0 = complex(0.588811, 1.29612)  # r0,x0 values from linecode
    diag = ((2 * z1 + z0) / 3) * 0.001  # Units = km
    diag = round(diag.real, 10) + diag.imag * 1j
    rem = ((z0 - z1) / 3) * 0.001  # Units = km
    rem = round(rem.real, 11) + round(rem.imag, 10) * 1j
    imp_matrix = np.zeros((3, 3), dtype=np.complex_)
    imp_matrix.fill(rem)
    np.fill_diagonal(imp_matrix, diag)
    imp_matrix = imp_matrix.tolist()

    assert m["line1"].impedance_matrix == imp_matrix

    c1 = complex(10.4308823411236, 0)  # Value in Linecode
    c0 = complex(4.48501282215346, 0)  # Value in Linecode
    c_diag = ((2 * c1 + c0) / 3) * 0.001  # Units = km
    c_diag = round(c_diag.real, 9) + c_diag.imag * 1j
    c_rem = ((c0 - c1) / 3) * 0.001  # Units = km
    c_rem = round(c_rem.real, 9) + c_rem.imag * 1j
    cap_matrix = np.zeros((3, 3), dtype=np.complex_)
    cap_matrix.fill(c_rem)
    np.fill_diagonal(cap_matrix, c_diag)
    cap_matrix = cap_matrix.tolist()

    assert m["line1"].capacitance_matrix == cap_matrix
    assert m["line1"].feeder_name == "sourcebus_src"
    assert m["line1"].is_recloser is None
    assert m["line1"].is_breaker is None

    for w in m["line1"].wires:
        assert w.nameclass == ""
        assert w.X is None
        assert w.Y is None
        assert w.diameter is None
        assert w.gmr is None
        assert w.ampacity == float(310)
        assert w.emergency_ampacity == float(310)
        assert w.resistance is None
        assert w.is_open is None
        assert w.concentric_neutral_gmr is None
        assert w.concentric_neutral_resistance is None
        assert w.concentric_neutral_diameter is None
        assert w.concentric_neutral_outside_diameter is None
        assert w.concentric_neutral_nstrand is None

    # Line 2
    assert len(m["line2"].wires) == 3
    #    Phases of the different wires
    assert set([w.phase for w in m["line2"].wires]) == set(["C", "N"])
    assert m["line2"].nameclass == "1P_#8CU_#8N"  # Linecode is 1P_#8CU_#8N
    assert m["line2"].line_type == None
    assert m["line2"].from_element == "bus2"
    assert m["line2"].to_element == "bus3"
    assert m["line2"].length == 10
    assert m["line2"].nominal_voltage == float(12.47) * 10**3
    assert m["line2"].is_fuse is None
    assert m["line2"].is_switch is None
    assert m["line2"].faultrate == parsed_values["Line"]["faultrate"]

    z1 = complex(2.15622, 0.539412)  # r1,x1 values from linecode
    z0 = complex(2.5511, 1.78041)  # r0,x0 values from linecode
    diag = ((2 * z1 + z0) / 3) * 0.001  # Units = km
    diag = round(diag.real, 9) + diag.imag * 1j
    rem = ((z0 - z1) / 3) * 0.001  # Units = km
    rem = round(rem.real, 10) + round(rem.imag, 10) * 1j
    imp_matrix = np.zeros((3, 3), dtype=np.complex_)
    imp_matrix.fill(rem)
    np.fill_diagonal(imp_matrix, diag)
    imp_matrix = imp_matrix.tolist()

    assert m["line2"].impedance_matrix == imp_matrix

    c1 = complex(8.05740467479414, 0)  # Value in Linecode
    c0 = complex(4.52209592389387, 0)  # Value in Linecode
    c_diag = ((2 * c1 + c0) / 3) * 0.001  # Units = km
    c_diag = round(c_diag.real, 9) + c_diag.imag * 1j
    c_rem = ((c0 - c1) / 3) * 0.001  # Units = km
    c_rem = round(c_rem.real, 9) + c_rem.imag * 1j
    cap_matrix = np.zeros((3, 3), dtype=np.complex_)
    cap_matrix.fill(c_rem)
    np.fill_diagonal(cap_matrix, c_diag)
    cap_matrix = cap_matrix.tolist()

    assert m["line2"].capacitance_matrix == cap_matrix
    assert m["line2"].feeder_name == "sourcebus_src"
    assert m["line2"].is_recloser is None
    assert m["line2"].is_breaker is None

    for w in m["line2"].wires:
        assert w.nameclass == ""
        assert w.X is None
        assert w.Y is None
        assert w.diameter is None
        assert w.gmr is None
        assert w.ampacity == float(1)
        assert w.emergency_ampacity == float(1)
        assert w.resistance is None
        assert w.insulation_thickness == parsed_values["Wire"][
            "insulation_thickness"]
        assert w.is_open is None
        assert w.concentric_neutral_gmr is None
        assert w.concentric_neutral_resistance is None
        assert w.concentric_neutral_diameter is None
        assert w.concentric_neutral_outside_diameter is None
        assert w.concentric_neutral_nstrand is None

    # Line 3
    assert len(m["line3"].wires) == 3  # Number of wires
    #    Phases of the different wires
    assert set([w.phase for w in m["line3"].wires]) == set(["A", "B", "C"])
    assert (m["line3"].nameclass == "3P_3#500_AL_EPR_CD"
            )  # Linecode is 3P_3#500_AL_EPR_CD
    assert m["line3"].line_type == None
    assert m["line3"].from_element == "bus2"
    assert m["line3"].to_element == "bus4"
    assert m["line3"].length == 10
    assert m["line3"].nominal_voltage == float(12.47) * 10**3
    assert m["line3"].is_fuse is None
    assert m["line3"].is_switch is None
    assert m["line3"].faultrate == parsed_values["Line"]["faultrate"]

    z1 = complex(0.072514, 0.001056)  # r1,x1 values from linecode
    z0 = complex(0.140678, -0.043807)  # r0,x0 values from linecode
    diag = ((2 * z1 + z0) / 3) * 0.001  # Units = km
    diag = round(diag.real, 11) + round(diag.imag, 11) * 1j
    rem = ((z0 - z1) / 3) * 0.001  # Units = km
    rem = round(rem.real, 11) + round(rem.imag, 11) * 1j
    imp_matrix = np.zeros((3, 3), dtype=np.complex_)
    imp_matrix.fill(rem)
    np.fill_diagonal(imp_matrix, diag)
    imp_matrix = imp_matrix.tolist()

    assert m["line3"].impedance_matrix == imp_matrix

    assert m["line3"].capacitance_matrix == [[0j, 0j, 0j], [0j, 0j, 0j],
                                             [0j, 0j, 0j]]
    assert m["line3"].feeder_name == "sourcebus_src"
    assert m["line3"].is_recloser is None
    assert m["line3"].is_breaker is None

    for w in m["line3"].wires:
        assert w.nameclass == ""
        assert w.X is None
        assert w.Y is None
        assert w.diameter is None
        assert w.gmr is None
        assert w.ampacity == float(1110)
        assert w.emergency_ampacity == float(1110)
        assert w.resistance is None
        assert w.insulation_thickness == parsed_values["Wire"][
            "insulation_thickness"]
        assert w.is_open is None
        assert w.concentric_neutral_gmr is None
        assert w.concentric_neutral_resistance is None
        assert w.concentric_neutral_diameter is None
        assert w.concentric_neutral_outside_diameter is None
        assert w.concentric_neutral_nstrand is None

    # Line 4
    assert len(m["line4"].wires) == 3  # Number of wires
    #    Phases of the different wires
    assert set([w.phase for w in m["line4"].wires]) == set(["A", "B", "C"])
    assert (m["line4"].nameclass == "3ph_h-397_acsr397_acsr397_acsr2/0_acsr"
            )  # Linecode is 3ph_h-397_acsr397_acsr397_acsr2/0_acsr
    assert m["line4"].line_type == None
    assert m["line4"].from_element == "bus4"
    assert m["line4"].to_element == "bus5"
    assert m["line4"].length == 10
    assert m["line4"].nominal_voltage == float(12.47) * 10**3
    assert m["line4"].is_fuse is None
    assert m["line4"].is_switch is None
    assert m["line4"].faultrate == parsed_values["Line"]["faultrate"]

    actual_impedance_matrix = [
        [
            (0.000270019 + 0.000695974j),
            (0.000109951 + 0.00033351j),
            (0.000113538 + 0.000308271j),
        ],
        [
            (0.000109951 + 0.00033351j),
            (0.000264634 + 0.000708729j),
            (0.000110747 + 0.000350259j),
        ],
        [
            (0.000113538 + 0.000308271j),
            (0.000110747 + 0.000350259j),
            (0.000271698 + 0.000692021j),
        ],
    ]
    assert m["line4"].impedance_matrix == actual_impedance_matrix
    assert m["line4"].capacitance_matrix == [
        [(0.00913606 + 0j), (-0.00266777 + 0j), (-0.00217646 + 0j)],
        [(-0.00266777 + 0j), (0.00962226 + 0j), (-0.00315664 + 0j)],
        [(-0.00217646 + 0j), (-0.00315664 + 0j), (0.00943197 + 0j)],
    ]
    assert m["line4"].feeder_name == "sourcebus_src"
    assert m["line4"].is_recloser is None
    assert m["line4"].is_breaker is None

    for w in m["line4"].wires:
        assert w.nameclass == ""
        assert w.X is None
        assert w.Y is None
        assert w.diameter is None
        assert w.gmr is None
        assert w.ampacity == parsed_values["Wire"]["ampacity"]
        assert w.emergency_ampacity == parsed_values["Wire"][
            "emergency_ampacity"]
        assert w.resistance is None
        assert w.insulation_thickness == parsed_values["Wire"][
            "insulation_thickness"]
        assert w.is_open is None
        assert w.concentric_neutral_gmr is None
        assert w.concentric_neutral_resistance is None
        assert w.concentric_neutral_diameter is None
        assert w.concentric_neutral_outside_diameter is None
        assert w.concentric_neutral_nstrand is None

    # Line 5
    assert len(m["line5"].wires) == 1  # Number of wires
    #    Phases of the different wires
    assert set([w.phase for w in m["line5"].wires]) == set(["B"])
    assert (m["line5"].nameclass == "1ph-2_acsrxx4_acsr"
            )  # Linecode is 1ph-2_acsrxx4_acsr
    assert m["line5"].line_type == None
    assert m["line5"].from_element == "bus5"
    assert m["line5"].to_element == "bus6"
    assert m["line5"].length == 10
    assert m["line5"].nominal_voltage == float(12.47) * 10**3
    assert m["line5"].is_fuse is None
    assert m["line5"].is_switch is None
    assert m["line5"].faultrate == parsed_values["Line"]["faultrate"]
    actual_impedance_matrix = [[(0.00112339 + 0.000937794j)]]
    assert m["line5"].impedance_matrix == actual_impedance_matrix
    assert m["line5"].capacitance_matrix == [[(0.00649582 + 0j)]]
    assert m["line5"].feeder_name == "sourcebus_src"
    assert m["line5"].is_recloser is None
    assert m["line5"].is_breaker is None

    for w in m["line5"].wires:
        assert w.nameclass == ""
        assert w.X is None
        assert w.Y is None
        assert w.diameter is None
        assert w.gmr is None
        assert w.ampacity == parsed_values["Wire"]["ampacity"]
        assert w.emergency_ampacity == parsed_values["Wire"][
            "emergency_ampacity"]
        assert w.resistance is None
        assert w.insulation_thickness == parsed_values["Wire"][
            "insulation_thickness"]
        assert w.is_open is None
        assert w.concentric_neutral_gmr is None
        assert w.concentric_neutral_resistance is None
        assert w.concentric_neutral_diameter is None
        assert w.concentric_neutral_outside_diameter is None
        assert w.concentric_neutral_nstrand is None

    # Line 6
    assert len(m["line6"].wires) == 2  # Number of wires
    #    Phases of the different wires
    assert set([w.phase for w in m["line6"].wires]) == set(["A", "C"])
    assert (m["line6"].nameclass == "2ph_h-2_acsrx2_acsr2_acsr"
            )  # Linecode is 2ph_h-2_acsrx2_acsr2_acsr
    assert m["line6"].line_type == None
    assert m["line6"].from_element == "bus5"
    assert m["line6"].to_element == "bus7"
    assert m["line6"].length == 10
    assert m["line6"].nominal_voltage == float(12.47) * 10**3
    assert m["line6"].is_fuse is None
    assert m["line6"].is_switch is None
    assert m["line6"].faultrate == parsed_values["Line"]["faultrate"]
    actual_impedance_matrix = [
        [(0.00113148 + 0.000884886j), (0.000142066 + 0.000366115j)],
        [(0.000142066 + 0.000366115j), (0.00113362 + 0.000882239j)],
    ]
    assert m["line6"].impedance_matrix == actual_impedance_matrix
    assert m["line6"].capacitance_matrix == [
        [(0.00733718 + 0j), (-0.00239809 + 0j)],
        [(-0.00239809 + 0j), (0.00733718 + 0j)],
    ]
    assert m["line6"].feeder_name == "sourcebus_src"
    assert m["line6"].is_recloser is None
    assert m["line6"].is_breaker is None

    for w in m["line6"].wires:
        assert w.nameclass == ""
        assert w.X is None
        assert w.Y is None
        assert w.diameter is None
        assert w.gmr is None
        assert w.ampacity == parsed_values["Wire"]["ampacity"]
        assert w.emergency_ampacity == parsed_values["Wire"][
            "emergency_ampacity"]
        assert w.resistance is None
        assert w.insulation_thickness == parsed_values["Wire"][
            "insulation_thickness"]
        assert w.is_open is None
        assert w.interrupting_rating is None
        assert w.concentric_neutral_gmr is None
        assert w.concentric_neutral_resistance is None
        assert w.concentric_neutral_diameter is None
        assert w.concentric_neutral_outside_diameter is None
        assert w.concentric_neutral_nstrand is None

    # Line 7
    assert len(m["line7"].wires) == 2  # Number of wires
    #    Phases of the different wires
    assert set([w.phase for w in m["line7"].wires]) == set(["A", "B"])
    assert m["line7"].nameclass == "750_Triplex"  # Linecode is 750_Triplex
    assert m["line7"].line_type == None
    assert m["line7"].from_element == "bus5"
    assert m["line7"].to_element == "bus8"
    assert m["line7"].length == 10
    assert m["line7"].nominal_voltage == float(12.47) * 10**3
    assert m["line7"].is_fuse is None
    assert m["line7"].is_switch is None
    assert m["line7"].faultrate == parsed_values["Line"]["faultrate"]
    actual_impedance_matrix = [
        [(0.000163213 + 9.128727e-05j), (7.684242e-05 + 2.19643e-05j)],
        [(7.684242e-05 + 2.19643e-05j), (0.000163213 + 9.128727e-05j)],
    ]  # Converted from meters to kft
    assert m["line7"].impedance_matrix == actual_impedance_matrix
    assert m["line7"].capacitance_matrix == [
        [(0.00984252 + 0j), (-0.007874016 + 0j)],
        [(-0.007874016 + 0j), (0.00984252 + 0j)],
    ]  # Converted from meters to kft
    assert m["line7"].feeder_name == "sourcebus_src"
    assert m["line7"].is_recloser is None
    assert m["line7"].is_breaker is None

    for w in m["line7"].wires:
        assert w.nameclass == ""
        assert w.X is None
        assert w.Y is None
        assert w.diameter is None
        assert w.gmr is None
        assert w.ampacity == float(580)
        assert w.emergency_ampacity == float(580 * 1.25)
        assert w.resistance is None
        assert w.insulation_thickness == parsed_values["Wire"][
            "insulation_thickness"]
        assert w.is_open is None
        assert w.interrupting_rating is None
        assert w.concentric_neutral_gmr is None
        assert w.concentric_neutral_resistance is None
        assert w.concentric_neutral_diameter is None
        assert w.concentric_neutral_outside_diameter is None
        assert w.concentric_neutral_nstrand is None

    # Line 8
    assert len(m["line8"].wires) == 2  # Number of wires
    #    Phases of the different wires
    assert set([w.phase for w in m["line8"].wires]) == set(["B", "C"])
    assert m["line8"].nameclass == "4/0Triplex"  # Linecode is 4/0Triplex
    assert m["line8"].line_type == None
    assert m["line8"].from_element == "bus5"
    assert m["line8"].to_element == "bus9"
    assert m["line8"].length == 10
    assert m["line8"].nominal_voltage == float(12.47) * 10**3
    assert m["line8"].is_fuse is None
    assert m["line8"].is_switch is None
    assert m["line8"].faultrate == parsed_values["Line"]["faultrate"]
    actual_impedance_matrix = [
        [(0.001344984 + 0.0005473038j), (0.0003874511 + 0.0004186106j)],
        [(0.0003874511 + 0.0004186106j), (0.001344984 + 0.0005473038j)],
    ]  # Converted from meters to kft
    assert m["line8"].impedance_matrix == actual_impedance_matrix
    assert m["line8"].capacitance_matrix == [
        [(0.00984252 + 0j), (-0.007874016 + 0j)],
        [(-0.007874016 + 0j), (0.00984252 + 0j)],
    ]  # Converted from meters to kft
    assert m["line8"].feeder_name == "sourcebus_src"
    assert m["line8"].is_recloser is None
    assert m["line8"].is_breaker is None

    for w in m["line8"].wires:
        assert w.nameclass == ""
        assert w.X is None
        assert w.Y is None
        assert w.diameter is None
        assert w.gmr is None
        assert w.ampacity == float(156)
        assert w.emergency_ampacity == float(156 * 1.25)
        assert w.resistance is None
        assert w.insulation_thickness == parsed_values["Wire"][
            "insulation_thickness"]
        assert w.is_open is None
        assert w.concentric_neutral_gmr is None
        assert w.concentric_neutral_resistance is None
        assert w.concentric_neutral_diameter is None
        assert w.concentric_neutral_outside_diameter is None
        assert w.concentric_neutral_nstrand is None

    # Line 9
    assert len(m["line9"].wires) == 3  # Number of wires
    #    Phases of the different wires
    assert set([w.phase for w in m["line9"].wires]) == set(["A", "B", "C"])
    assert m["line9"].nameclass == "empty"  # Linecode is empty
    assert m["line9"].line_type == None
    assert m["line9"].from_element == "bus4"
    assert m["line9"].to_element == "bus10"
    assert m["line9"].length == 10
    assert m["line9"].nominal_voltage == float(12.47) * 10**3
    assert m["line9"].is_fuse is None
    assert m["line9"].is_switch is None
    assert m["line9"].faultrate == parsed_values["Line"]["faultrate"]

    z1 = complex(
        parsed_values["Line"]["R1"],
        parsed_values["Line"]["X1"])  # r1,x1 taken from default values
    z0 = complex(
        parsed_values["Line"]["R0"],
        parsed_values["Line"]["X0"])  # r0,x0 taken from default values
    diag = ((2 * z1 + z0) / 3) * 0.001  # Units = km
    diag = round(diag.real, 11) + round(diag.imag, 10) * 1j
    rem = ((z0 - z1) / 3) * 0.001  # Units = km
    rem = round(rem.real, 11) + round(rem.imag, 10) * 1j
    imp_matrix = np.zeros((3, 3), dtype=np.complex_)
    imp_matrix.fill(rem)
    np.fill_diagonal(imp_matrix, diag)
    imp_matrix = imp_matrix.tolist()

    assert m["line9"].impedance_matrix == imp_matrix

    c1 = complex(parsed_values["Line"]["C1"],
                 0)  # c1 taken from default values
    c0 = complex(parsed_values["Line"]["C0"],
                 0)  # c0 taken from default values
    c_diag = ((2 * c1 + c0) / 3) * 0.001  # Units = km
    c_diag = round(c_diag.real, 10) + c_diag.imag * 1j
    c_rem = ((c0 - c1) / 3) * 0.001  # Units = km
    c_rem = round(c_rem.real, 10) + c_rem.imag * 1j
    cap_matrix = np.zeros((3, 3), dtype=np.complex_)
    cap_matrix.fill(c_rem)
    np.fill_diagonal(cap_matrix, c_diag)
    cap_matrix = cap_matrix.tolist()

    assert m["line9"].capacitance_matrix == cap_matrix
    assert m["line9"].feeder_name == "sourcebus_src"
    assert m["line9"].is_recloser is None
    assert m["line9"].is_breaker is None

    for w in m["line9"].wires:
        assert w.nameclass == ""
        assert w.X is None
        assert w.Y is None
        assert w.diameter is None
        assert w.gmr is None
        assert w.ampacity == parsed_values["Wire"]["ampacity"]
        assert w.emergency_ampacity == parsed_values["Wire"][
            "emergency_ampacity"]
        assert w.resistance is None
        assert w.insulation_thickness == parsed_values["Wire"][
            "insulation_thickness"]
        assert w.is_open is None
        assert w.concentric_neutral_gmr is None
        assert w.concentric_neutral_resistance is None
        assert w.concentric_neutral_diameter is None
        assert w.concentric_neutral_outside_diameter is None
        assert w.concentric_neutral_nstrand is None

    # Line 10
    assert len(m["line10"].wires) == 3  # Number of wires
    #    Phases of the different wires
    assert set([w.phase for w in m["line10"].wires]) == set(["A", "B", "C"])
    assert m["line10"].nameclass == "r1_only"  # Linecode is r1_only
    assert m["line10"].line_type == None
    assert m["line10"].from_element == "bus10"
    assert m["line10"].to_element == "bus11"
    assert m["line10"].length == 10
    assert m["line10"].nominal_voltage == float(12.47) * 10**3
    assert m["line10"].is_fuse is None
    assert m["line10"].is_switch is None
    assert m["line10"].faultrate == parsed_values["Line"]["faultrate"]

    z1 = complex(
        0.3489, parsed_values["Line"]
        ["X1"])  # r1 taken from linecode, x1 taken from default values
    z0 = complex(
        parsed_values["Line"]["R0"],
        parsed_values["Line"]["X0"])  # r0,x0 taken from default values
    diag = ((2 * z1 + z0) / 3) * 0.001  # Units = km
    diag = round(diag.real, 10) + round(diag.imag, 10) * 1j
    rem = ((z0 - z1) / 3) * 0.001  # Units = km
    rem = round(rem.real, 11) + round(rem.imag, 10) * 1j
    imp_matrix = np.zeros((3, 3), dtype=np.complex_)
    imp_matrix.fill(rem)
    np.fill_diagonal(imp_matrix, diag)
    imp_matrix = imp_matrix.tolist()

    assert m["line10"].impedance_matrix == imp_matrix

    c1 = complex(parsed_values["Line"]["C1"],
                 0)  # c1 taken from default values
    c0 = complex(parsed_values["Line"]["C0"],
                 0)  # c0 taken from default values
    c_diag = ((2 * c1 + c0) / 3) * 0.001  # Units = km
    c_diag = round(c_diag.real, 10) + c_diag.imag * 1j
    c_rem = ((c0 - c1) / 3) * 0.001  # Units = km
    c_rem = round(c_rem.real, 10) + c_rem.imag * 1j
    cap_matrix = np.zeros((3, 3), dtype=np.complex_)
    cap_matrix.fill(c_rem)
    np.fill_diagonal(cap_matrix, c_diag)
    cap_matrix = cap_matrix.tolist()

    assert m["line10"].capacitance_matrix == cap_matrix
    assert m["line10"].feeder_name == "sourcebus_src"
    assert m["line10"].is_recloser is None
    assert m["line10"].is_breaker is None

    for w in m["line10"].wires:
        assert w.nameclass == ""
        assert w.X is None
        assert w.Y is None
        assert w.diameter is None
        assert w.gmr is None
        assert w.ampacity == parsed_values["Wire"]["ampacity"]
        assert w.emergency_ampacity == parsed_values["Wire"][
            "emergency_ampacity"]
        assert w.resistance is None
        assert w.insulation_thickness == parsed_values["Wire"][
            "insulation_thickness"]
        assert w.is_open is None
        assert w.concentric_neutral_gmr is None
        assert w.concentric_neutral_resistance is None
        assert w.concentric_neutral_diameter is None
        assert w.concentric_neutral_outside_diameter is None
        assert w.concentric_neutral_nstrand is None

    # Line 11
    assert len(m["line11"].wires) == 3  # Number of wires
    #    Phases of the different wires
    assert set([w.phase for w in m["line11"].wires]) == set(["A", "B", "C"])
    assert m["line11"].nameclass == "r0_only"  # Linecode is r0_only
    assert m["line11"].line_type == None
    assert m["line11"].from_element == "bus11"
    assert m["line11"].to_element == "bus12"
    assert m["line11"].length == 10
    assert m["line11"].nominal_voltage == float(12.47) * 10**3
    assert m["line11"].is_fuse is None
    assert m["line11"].is_switch is None
    assert m["line11"].faultrate == parsed_values["Line"]["faultrate"]

    z1 = complex(
        parsed_values["Line"]["R1"],
        parsed_values["Line"]["X1"])  # r1,x1 taken from default values
    z0 = complex(0.588811, parsed_values["Line"]
                 ["X0"])  # r0 taken from linecode,x0 taken from default values
    diag = ((2 * z1 + z0) / 3) * 0.001  # Units = km
    diag = round(diag.real, 10) + round(diag.imag, 10) * 1j
    rem = ((z0 - z1) / 3) * 0.001  # Units = km
    rem = round(rem.real, 11) + round(rem.imag, 10) * 1j
    imp_matrix = np.zeros((3, 3), dtype=np.complex_)
    imp_matrix.fill(rem)
    np.fill_diagonal(imp_matrix, diag)
    imp_matrix = imp_matrix.tolist()

    assert m["line11"].impedance_matrix == imp_matrix

    c1 = complex(parsed_values["Line"]["C1"],
                 0)  # c1 taken from default values
    c0 = complex(parsed_values["Line"]["C0"],
                 0)  # c0 taken from default values
    c_diag = ((2 * c1 + c0) / 3) * 0.001  # Units = km
    c_diag = round(c_diag.real, 10) + c_diag.imag * 1j
    c_rem = ((c0 - c1) / 3) * 0.001  # Units = km
    c_rem = round(c_rem.real, 10) + c_rem.imag * 1j
    cap_matrix = np.zeros((3, 3), dtype=np.complex_)
    cap_matrix.fill(c_rem)
    np.fill_diagonal(cap_matrix, c_diag)
    cap_matrix = cap_matrix.tolist()

    assert m["line11"].capacitance_matrix == cap_matrix
    assert m["line11"].feeder_name == "sourcebus_src"
    assert m["line11"].is_recloser is None
    assert m["line11"].is_breaker is None

    for w in m["line11"].wires:
        assert w.nameclass == ""
        assert w.X is None
        assert w.Y is None
        assert w.diameter is None
        assert w.gmr is None
        assert w.ampacity == parsed_values["Wire"]["ampacity"]
        assert w.emergency_ampacity == parsed_values["Wire"][
            "emergency_ampacity"]
        assert w.resistance is None
        assert w.insulation_thickness == parsed_values["Wire"][
            "insulation_thickness"]
        assert w.is_open is None
        assert w.concentric_neutral_gmr is None
        assert w.concentric_neutral_resistance is None
        assert w.concentric_neutral_diameter is None
        assert w.concentric_neutral_outside_diameter is None
        assert w.concentric_neutral_nstrand is None

    # Line 12
    assert len(m["line12"].wires) == 3  # Number of wires
    #    Phases of the different wires
    assert set([w.phase for w in m["line12"].wires]) == set(["A", "B", "C"])
    assert m["line12"].nameclass == "x1_only"  # Linecode is x1_only
    assert m["line12"].line_type == None
    assert m["line12"].from_element == "bus12"
    assert m["line12"].to_element == "bus13"
    assert m["line12"].length == 10
    assert m["line12"].nominal_voltage == float(12.47) * 10**3
    assert m["line12"].is_fuse is None
    assert m["line12"].is_switch is None
    assert m["line12"].faultrate == parsed_values["Line"]["faultrate"]

    z1 = complex(
        parsed_values["Line"]["R1"],
        0.426198)  # r1 taken from default values, x1 taken from linecode
    z0 = complex(
        parsed_values["Line"]["R0"],
        parsed_values["Line"]["X0"])  # r0,x0 taken from default values
    diag = ((2 * z1 + z0) / 3) * 0.001  # Units = km
    diag = round(diag.real, 11) + round(diag.imag, 10) * 1j
    rem = ((z0 - z1) / 3) * 0.001  # Units = km
    rem = round(rem.real, 11) + round(rem.imag, 10) * 1j
    imp_matrix = np.zeros((3, 3), dtype=np.complex_)
    imp_matrix.fill(rem)
    np.fill_diagonal(imp_matrix, diag)
    imp_matrix = imp_matrix.tolist()

    assert m["line12"].impedance_matrix == imp_matrix

    c1 = complex(parsed_values["Line"]["C1"],
                 0)  # c1 taken from default values
    c0 = complex(parsed_values["Line"]["C0"],
                 0)  # c0 taken from default values
    c_diag = ((2 * c1 + c0) / 3) * 0.001  # Units = km
    c_diag = round(c_diag.real, 10) + c_diag.imag * 1j
    c_rem = ((c0 - c1) / 3) * 0.001  # Units = km
    c_rem = round(c_rem.real, 10) + c_rem.imag * 1j
    cap_matrix = np.zeros((3, 3), dtype=np.complex_)
    cap_matrix.fill(c_rem)
    np.fill_diagonal(cap_matrix, c_diag)
    cap_matrix = cap_matrix.tolist()

    assert m["line12"].capacitance_matrix == cap_matrix
    assert m["line12"].feeder_name == "sourcebus_src"
    assert m["line12"].is_recloser is None
    assert m["line12"].is_breaker is None

    for w in m["line12"].wires:
        assert w.nameclass == ""
        assert w.X is None
        assert w.Y is None
        assert w.diameter is None
        assert w.gmr is None
        assert w.ampacity == parsed_values["Wire"]["ampacity"]
        assert w.emergency_ampacity == parsed_values["Wire"][
            "emergency_ampacity"]
        assert w.resistance is None
        assert w.insulation_thickness == parsed_values["Wire"][
            "insulation_thickness"]
        assert w.is_open is None
        assert w.concentric_neutral_gmr is None
        assert w.concentric_neutral_resistance is None
        assert w.concentric_neutral_diameter is None
        assert w.concentric_neutral_outside_diameter is None
        assert w.concentric_neutral_nstrand is None

    # Line 13
    assert len(m["line13"].wires) == 3  # Number of wires
    #    Phases of the different wires
    assert set([w.phase for w in m["line13"].wires]) == set(["A", "B", "C"])
    assert m["line13"].nameclass == "x0_only"  # Linecode is x0_only
    assert m["line13"].line_type == None
    assert m["line13"].from_element == "bus13"
    assert m["line13"].to_element == "bus14"
    assert m["line13"].length == 10
    assert m["line13"].nominal_voltage == float(12.47) * 10**3
    assert m["line13"].is_fuse is None
    assert m["line13"].is_switch is None
    assert m["line13"].faultrate == parsed_values["Line"]["faultrate"]

    z1 = complex(
        parsed_values["Line"]["R1"],
        parsed_values["Line"]["X1"])  # r1,x1 taken from default values
    z0 = complex(
        parsed_values["Line"]["R0"],
        1.29612)  # r0 taken from default values, x0 taken from linecode
    diag = ((2 * z1 + z0) / 3) * 0.001  # Units = km
    diag = round(diag.real, 11) + round(diag.imag, 10) * 1j
    rem = ((z0 - z1) / 3) * 0.001  # Units = km
    rem = round(rem.real, 11) + round(rem.imag, 10) * 1j
    imp_matrix = np.zeros((3, 3), dtype=np.complex_)
    imp_matrix.fill(rem)
    np.fill_diagonal(imp_matrix, diag)
    imp_matrix = imp_matrix.tolist()

    assert m["line13"].impedance_matrix == imp_matrix

    assert m["line13"].capacitance_matrix == cap_matrix

    assert m["line13"].feeder_name == "sourcebus_src"
    assert m["line13"].is_recloser is None
    assert m["line13"].is_breaker is None

    for w in m["line13"].wires:
        assert w.nameclass == ""
        assert w.X is None
        assert w.Y is None
        assert w.diameter is None
        assert w.gmr is None
        assert w.ampacity == parsed_values["Wire"]["ampacity"]
        assert w.emergency_ampacity == parsed_values["Wire"][
            "emergency_ampacity"]
        assert w.resistance is None
        assert w.insulation_thickness == parsed_values["Wire"][
            "insulation_thickness"]
        assert w.is_open is None
        assert w.concentric_neutral_gmr is None
        assert w.concentric_neutral_resistance is None
        assert w.concentric_neutral_diameter is None
        assert w.concentric_neutral_outside_diameter is None
        assert w.concentric_neutral_nstrand is None

    # Line 14
    assert len(m["line14"].wires) == 3  # Number of wires
    #    Phases of the different wires
    assert set([w.phase for w in m["line14"].wires]) == set(["A", "B", "C"])
    assert m["line14"].nameclass == "c1_only"  # Linecode is c1_only
    assert m["line14"].line_type == None
    assert m["line14"].from_element == "bus14"
    assert m["line14"].to_element == "bus15"
    assert m["line14"].length == 10
    assert m["line14"].nominal_voltage == float(12.47) * 10**3
    assert m["line14"].is_fuse is None
    assert m["line14"].is_switch is None
    assert m["line14"].faultrate == parsed_values["Line"]["faultrate"]

    z1 = complex(
        parsed_values["Line"]["R1"],
        parsed_values["Line"]["X1"])  # r1,x1 taken from default values
    z0 = complex(
        parsed_values["Line"]["R0"],
        parsed_values["Line"]["X0"])  # r0,x0 taken from default values
    diag = ((2 * z1 + z0) / 3) * 0.001  # Units = km
    diag = round(diag.real, 11) + round(diag.imag, 10) * 1j
    rem = ((z0 - z1) / 3) * 0.001  # Units = km
    rem = round(rem.real, 11) + round(rem.imag, 10) * 1j
    imp_matrix = np.zeros((3, 3), dtype=np.complex_)
    imp_matrix.fill(rem)
    np.fill_diagonal(imp_matrix, diag)
    imp_matrix = imp_matrix.tolist()

    assert m["line14"].impedance_matrix == imp_matrix

    c1 = complex(10.4308823411236, 0)  # c1 taken from linecode
    c0 = complex(parsed_values["Line"]["C0"],
                 0)  # c0 taken from default values
    c_diag = ((2 * c1 + c0) / 3) * 0.001  # Units = km
    c_diag = round(c_diag.real, 9) + c_diag.imag * 1j
    c_rem = ((c0 - c1) / 3) * 0.001  # Units = km
    c_rem = round(c_rem.real, 9) + c_rem.imag * 1j
    cap_matrix = np.zeros((3, 3), dtype=np.complex_)
    cap_matrix.fill(c_rem)
    np.fill_diagonal(cap_matrix, c_diag)
    cap_matrix = cap_matrix.tolist()

    assert m["line14"].capacitance_matrix == cap_matrix
    assert m["line14"].feeder_name == "sourcebus_src"
    assert m["line14"].is_recloser is None
    assert m["line14"].is_breaker is None

    for w in m["line14"].wires:
        assert w.nameclass == ""
        assert w.X is None
        assert w.Y is None
        assert w.diameter is None
        assert w.gmr is None
        assert w.ampacity == parsed_values["Wire"]["ampacity"]
        assert w.emergency_ampacity == parsed_values["Wire"][
            "emergency_ampacity"]
        assert w.resistance is None
        assert w.insulation_thickness == parsed_values["Wire"][
            "insulation_thickness"]
        assert w.is_open is None
        assert w.concentric_neutral_gmr is None
        assert w.concentric_neutral_resistance is None
        assert w.concentric_neutral_diameter is None
        assert w.concentric_neutral_outside_diameter is None
        assert w.concentric_neutral_nstrand is None

    # Line 15
    assert len(m["line15"].wires) == 3  # Number of wires
    #    Phases of the different wires
    assert set([w.phase for w in m["line15"].wires]) == set(["A", "B", "C"])
    assert m["line15"].nameclass == "c0_only"  # Linecode is c0_only
    assert m["line15"].line_type == None
    assert m["line15"].from_element == "bus15"
    assert m["line15"].to_element == "bus16"
    assert m["line15"].length == 10
    assert m["line15"].nominal_voltage == float(12.47) * 10**3
    assert m["line15"].is_fuse is None
    assert m["line15"].is_switch is None
    assert m["line15"].faultrate == parsed_values["Line"]["faultrate"]

    z1 = complex(
        parsed_values["Line"]["R1"],
        parsed_values["Line"]["X1"])  # r1,x1 taken from default values
    z0 = complex(
        parsed_values["Line"]["R0"],
        parsed_values["Line"]["X0"])  # r0,x0 taken from default values
    diag = ((2 * z1 + z0) / 3) * 0.001  # Units = km
    diag = round(diag.real, 11) + round(diag.imag, 10) * 1j
    rem = ((z0 - z1) / 3) * 0.001  # Units = km
    rem = round(rem.real, 11) + round(rem.imag, 10) * 1j
    imp_matrix = np.zeros((3, 3), dtype=np.complex_)
    imp_matrix.fill(rem)
    np.fill_diagonal(imp_matrix, diag)
    imp_matrix = imp_matrix.tolist()

    assert m["line15"].impedance_matrix == imp_matrix

    c1 = complex(parsed_values["Line"]["C1"],
                 0)  # c1 taken from default values
    c0 = complex(4.38501282215346, 0)  # c0 taken from linecode
    c_diag = ((2 * c1 + c0) / 3) * 0.001  # Units = km
    c_diag = round(c_diag.real, 9) + c_diag.imag * 1j
    c_rem = ((c0 - c1) / 3) * 0.001  # Units = km
    c_rem = round(c_rem.real, 10) + c_rem.imag * 1j
    cap_matrix = np.zeros((3, 3), dtype=np.complex_)
    cap_matrix.fill(c_rem)
    np.fill_diagonal(cap_matrix, c_diag)
    cap_matrix = cap_matrix.tolist()

    assert m["line15"].capacitance_matrix == cap_matrix
    assert m["line15"].feeder_name == "sourcebus_src"
    assert m["line15"].is_recloser is None
    assert m["line15"].is_breaker is None

    for w in m["line15"].wires:
        assert w.nameclass == ""
        assert w.X is None
        assert w.Y is None
        assert w.diameter is None
        assert w.gmr is None
        assert w.ampacity == parsed_values["Wire"]["ampacity"]
        assert w.emergency_ampacity == parsed_values["Wire"][
            "emergency_ampacity"]
        assert w.resistance is None
        assert w.insulation_thickness == parsed_values["Wire"][
            "insulation_thickness"]
        assert w.is_open is None
        assert w.concentric_neutral_gmr is None
        assert w.concentric_neutral_resistance is None
        assert w.concentric_neutral_diameter is None
        assert w.concentric_neutral_outside_diameter is None
        assert w.concentric_neutral_nstrand is None
Пример #15
0
def test_line_length():
    from ditto.store import Store
    from ditto.readers.opendss.read import Reader
    from ditto.readers.json.read import Reader as json_reader
    from ditto.default_values.default_values_json import Default_Values

    m = Store()
    r = Reader(
        master_file=os.path.join(current_directory, "test_line_length.dss"))
    r.parse(m)
    m.set_names()

    # Reading OpenDSS default values
    d_v = Default_Values(
        os.path.join(
            current_directory,
            "../../../../ditto/default_values/opendss_default_values.json",
        ))
    parsed_values = d_v.parse()

    # Line 1 is a 100 meters 3 phase line
    assert len(m["line1"].wires) == 3
    # Phases of the different wires
    assert set([w.phase for w in m["line1"].wires]) == set(["A", "B", "C"])
    assert m["line1"].name == "line1"
    assert m["line1"].nominal_voltage == float(4.16) * 10**3
    assert m["line1"].line_type == None
    assert m["line1"].length == float(100)  # Units = meters
    assert m["line1"].from_element == "sourcebus"
    assert m["line1"].to_element == "bus1"
    assert m["line1"].is_fuse is None
    assert m["line1"].is_switch is None
    assert m["line1"].faultrate == parsed_values["Line"]["faultrate"]

    z1 = complex(
        parsed_values["Line"]["R1"],
        parsed_values["Line"]["X1"])  # r1,x1 taken from default values
    z0 = complex(
        parsed_values["Line"]["R0"],
        parsed_values["Line"]["X0"])  # r0,x0 taken from default values
    diag = (2 * z1 + z0) / 3
    diag = round(diag.real, 8) + round(diag.imag, 4) * 1j
    rem = (z0 - z1) / 3
    rem = round(rem.real, 8) + rem.imag * 1j
    imp_matrix = np.zeros((3, 3), dtype=np.complex_)
    imp_matrix.fill(rem)
    np.fill_diagonal(imp_matrix, diag)
    imp_matrix = imp_matrix.tolist()

    assert m["line1"].impedance_matrix == imp_matrix

    c1 = complex(parsed_values["Line"]["C1"],
                 0)  # c1 taken from default values
    c0 = complex(parsed_values["Line"]["C0"],
                 0)  # c0 taken from default values
    c_diag = (2 * c1 + c0) / 3
    c_diag = round(c_diag.real, 10) + c_diag.imag * 1j
    c_rem = (c0 - c1) / 3
    c_rem = round(c_rem.real, 10) + c_rem.imag * 1j
    cap_matrix = np.zeros((3, 3), dtype=np.complex_)
    cap_matrix.fill(c_rem)
    np.fill_diagonal(cap_matrix, c_diag)
    cap_matrix = cap_matrix.tolist()

    assert m["line1"].capacitance_matrix == cap_matrix
    assert m["line1"].feeder_name == "sourcebus_src"
    assert m["line1"].is_recloser is None
    assert m["line1"].is_breaker is None
    assert m["line1"].nameclass == ""

    for w in m["line1"].wires:
        assert w.nameclass == ""
        assert w.X is None
        assert w.Y is None
        assert w.diameter is None
        assert w.gmr is None
        assert w.ampacity == parsed_values["Wire"]["ampacity"]
        assert w.emergency_ampacity == parsed_values["Wire"][
            "emergency_ampacity"]
        assert w.resistance is None
        assert w.insulation_thickness == parsed_values["Wire"][
            "insulation_thickness"]
        assert w.is_open is None
        assert w.concentric_neutral_gmr is None
        assert w.concentric_neutral_resistance is None
        assert w.concentric_neutral_diameter is None
        assert w.concentric_neutral_outside_diameter is None
        assert w.concentric_neutral_nstrand is None

    #  Line 2 is a 83.47 kilo-feet 3 phase line
    assert len(m["line2"].wires) == 3
    # Phases of the different wires
    assert set([w.phase for w in m["line2"].wires]) == set(["A", "B", "C"])
    assert m["line2"].name == "line2"
    assert m["line2"].nominal_voltage == float(4.16) * 10**3
    assert m["line2"].line_type == None
    assert m["line2"].length == float(83.47 * 304.8)  # units = kft
    assert m["line2"].from_element == "bus1"
    assert m["line2"].to_element == "bus2"
    assert m["line2"].is_fuse is None
    assert m["line2"].is_switch is None
    assert m["line2"].faultrate == parsed_values["Line"]["faultrate"]

    diag = ((2 * z1 + z0) / 3) / 304.8  # Units = kft
    diag = diag.real + diag.imag * 1j
    rem = ((z0 - z1) / 3) / 304.8  # Units = kft
    rem = rem.real + rem.imag * 1j
    imp_matrix = np.zeros((3, 3), dtype=np.complex_)
    imp_matrix.fill(rem)
    np.fill_diagonal(imp_matrix, diag)
    imp_matrix = imp_matrix.tolist()

    # assert m["line2"].impedance_matrix == imp_matrix

    c1 = complex(parsed_values["Line"]["C1"],
                 0)  # c1 taken from default values
    c0 = complex(parsed_values["Line"]["C0"],
                 0)  # c0 taken from default values
    c_diag = ((2 * c1 + c0) / 3) / 304.8  # Units = kft
    c_diag = c_diag.real + c_diag.imag * 1j
    c_rem = ((c0 - c1) / 3) / 304.8  # Units = kft
    c_rem = c_rem.real + c_rem.imag * 1j
    cap_matrix = np.zeros((3, 3), dtype=np.complex_)
    cap_matrix.fill(c_rem)
    np.fill_diagonal(cap_matrix, c_diag)
    cap_matrix = cap_matrix.tolist()

    #    assert m["line2"].capacitance_matrix == cap_matrix
    assert m["line2"].feeder_name == "sourcebus_src"
    assert m["line2"].is_recloser is None
    assert m["line2"].is_breaker is None
    assert m["line2"].nameclass == ""

    for w in m["line2"].wires:
        assert w.nameclass == ""
        assert w.X is None
        assert w.Y is None
        assert w.diameter is None
        assert w.gmr is None
        assert w.ampacity == parsed_values["Wire"]["ampacity"]
        assert w.emergency_ampacity == parsed_values["Wire"][
            "emergency_ampacity"]
        assert w.resistance is None
        assert w.insulation_thickness == parsed_values["Wire"][
            "insulation_thickness"]
        assert w.is_open is None
        assert w.concentric_neutral_gmr is None
        assert w.concentric_neutral_resistance is None
        assert w.concentric_neutral_diameter is None
        assert w.concentric_neutral_outside_diameter is None
        assert w.concentric_neutral_nstrand is None

    # Line 3 is a 200 feet 2 phases line
    assert len(m["line3"].wires) == 2
    # Phases of the different wires
    assert set([w.phase for w in m["line3"].wires]) == set(["A", "C"])
    assert m["line3"].name == "line3"
    assert m["line3"].nominal_voltage == float(4.16) * 10**3
    assert m["line3"].line_type == None
    assert m["line3"].length == float(200 * 0.3048)  # units = ft
    assert m["line3"].from_element == "bus2"
    assert m["line3"].to_element == "bus3"
    assert m["line3"].is_fuse is None
    assert m["line3"].is_switch is None
    assert m["line3"].faultrate == parsed_values["Line"]["faultrate"]

    diag = ((2 * z1 + z0) / 3) / 0.3048  # Units = ft
    diag = diag.real + diag.imag * 1j
    rem = ((z0 - z1) / 3) / 0.3048  # Units = ft
    rem = rem.real + rem.imag * 1j
    imp_matrix = np.zeros((2, 2), dtype=np.complex_)
    imp_matrix.fill(rem)
    np.fill_diagonal(imp_matrix, diag)
    imp_matrix = imp_matrix.tolist()

    #    assert m["line3"].impedance_matrix == imp_matrix

    c1 = complex(parsed_values["Line"]["C1"],
                 0)  # c1 taken from default values
    c0 = complex(parsed_values["Line"]["C0"],
                 0)  # c0 taken from default values
    c_diag = ((2 * c1 + c0) / 3) / 0.3048  # Units = ft
    c_diag = c_diag.real + c_diag.imag * 1j
    c_rem = ((c0 - c1) / 3) / 0.3048  # Units = ft
    c_rem = c_rem.real + c_rem.imag * 1j
    cap_matrix = np.zeros((2, 2), dtype=np.complex_)
    cap_matrix.fill(c_rem)
    np.fill_diagonal(cap_matrix, c_diag)
    cap_matrix = cap_matrix.tolist()

    #    assert m["line3"].capacitance_matrix == cap_matrix

    assert m["line3"].feeder_name == "sourcebus_src"
    assert m["line3"].is_recloser is None
    assert m["line3"].is_breaker is None
    assert m["line3"].nameclass == ""

    for w in m["line3"].wires:
        assert w.nameclass == ""
        assert w.X is None
        assert w.Y is None
        assert w.diameter is None
        assert w.gmr is None
        assert w.ampacity == parsed_values["Wire"]["ampacity"]
        assert w.emergency_ampacity == parsed_values["Wire"][
            "emergency_ampacity"]
        assert w.resistance is None
        assert w.insulation_thickness == parsed_values["Wire"][
            "insulation_thickness"]
        assert w.is_open is None
        assert w.concentric_neutral_gmr is None
        assert w.concentric_neutral_resistance is None
        assert w.concentric_neutral_diameter is None
        assert w.concentric_neutral_outside_diameter is None
        assert w.concentric_neutral_nstrand is None

    #  Line 4 is a 1.01 miles 1 phase line
    assert len(m["line4"].wires) == 1
    # Phases of the different wires
    assert m["line4"].wires[0].phase == "B"
    assert m["line4"].name == "line4"
    assert m["line4"].nominal_voltage == float(4.16) * 10**3
    assert m["line4"].line_type == None
    assert m["line4"].length == float(1.01 * 1609.34)  # units = mi
    assert m["line4"].from_element == "bus2"
    assert m["line4"].to_element == "bus4"
    assert m["line4"].is_fuse is None
    assert m["line4"].is_switch is None
    assert m["line4"].faultrate == parsed_values["Line"]["faultrate"]

    imp_matrix = (
        complex(parsed_values["Line"]["R1"], parsed_values["Line"]["X1"]) /
        1609.34)  # Units = mi
    imp_matrix = imp_matrix.real + imp_matrix.imag * 1j
    assert m["line4"].impedance_matrix == [[imp_matrix]]
    cap_matrix = complex(parsed_values["Line"]["C1"],
                         0) / 1609.34  # Units = mi
    assert m["line4"].capacitance_matrix == [[cap_matrix]]

    assert m["line4"].feeder_name == "sourcebus_src"
    assert m["line4"].is_recloser is None
    assert m["line4"].is_breaker is None
    assert m["line4"].nameclass == ""

    for w in m["line4"].wires:
        assert w.nameclass == ""
        assert w.X is None
        assert w.Y is None
        assert w.diameter is None
        assert w.gmr is None
        assert w.ampacity == parsed_values["Wire"]["ampacity"]
        assert w.emergency_ampacity == parsed_values["Wire"][
            "emergency_ampacity"]
        assert w.resistance is None
        assert w.insulation_thickness == parsed_values["Wire"][
            "insulation_thickness"]
        assert w.is_open is None
        assert w.concentric_neutral_gmr is None
        assert w.concentric_neutral_resistance is None
        assert w.concentric_neutral_diameter is None
        assert w.concentric_neutral_outside_diameter is None
        assert w.concentric_neutral_nstrand is None

    #  Line 5 is a 2040.12 centimeters 3 phase line
    assert len(m["line5"].wires) == 3
    # Phases of the different wires
    assert set([w.phase for w in m["line5"].wires]) == set(["A", "B", "C"])
    assert m["line5"].name == "line5"
    assert m["line5"].nominal_voltage == float(4.16) * 10**3
    assert m["line5"].line_type == None
    assert m["line5"].length == float(2040.12 * 0.01)  # units = cm
    assert m["line5"].from_element == "bus2"
    assert m["line5"].to_element == "bus5"
    assert m["line5"].is_fuse is None
    assert m["line5"].is_switch is None
    assert m["line5"].faultrate == parsed_values["Line"]["faultrate"]

    diag = ((2 * z1 + z0) / 3) / 0.01  # Units = cm
    diag = round(diag.real, 6) + diag.imag * 1j
    rem = ((z0 - z1) / 3) / 0.01  # Units = cm
    rem = round(rem.real, 6) + rem.imag * 1j
    imp_matrix = np.zeros((3, 3), dtype=np.complex_)
    imp_matrix.fill(rem)
    np.fill_diagonal(imp_matrix, diag)
    imp_matrix = imp_matrix.tolist()

    #    assert m["line5"].impedance_matrix == imp_matrix

    c1 = complex(parsed_values["Line"]["C1"],
                 0)  # c1 taken from default values
    c0 = complex(parsed_values["Line"]["C0"],
                 0)  # c0 taken from default values
    c_diag = ((2 * c1 + c0) / 3) / 0.01  # Units = cm
    c_diag = c_diag.real + c_diag.imag * 1j
    c_rem = ((c0 - c1) / 3) / 0.01  # Units = cm
    c_rem = c_rem.real + c_rem.imag * 1j
    cap_matrix = np.zeros((3, 3), dtype=np.complex_)
    cap_matrix.fill(c_rem)
    np.fill_diagonal(cap_matrix, c_diag)
    cap_matrix = cap_matrix.tolist()

    #    assert m["line5"].capacitance_matrix == cap_matrix

    assert m["line5"].feeder_name == "sourcebus_src"
    assert m["line5"].is_recloser is None
    assert m["line5"].is_breaker is None
    assert m["line5"].nameclass == ""

    for w in m["line5"].wires:
        assert w.nameclass == ""
        assert w.X is None
        assert w.Y is None
        assert w.diameter is None
        assert w.gmr is None
        assert w.ampacity == parsed_values["Wire"]["ampacity"]
        assert w.emergency_ampacity == parsed_values["Wire"][
            "emergency_ampacity"]
        assert w.resistance is None
        assert w.insulation_thickness == parsed_values["Wire"][
            "insulation_thickness"]
        assert w.is_open is None
        assert w.concentric_neutral_gmr is None
        assert w.concentric_neutral_resistance is None
        assert w.concentric_neutral_diameter is None
        assert w.concentric_neutral_outside_diameter is None
        assert w.concentric_neutral_nstrand is None

    #  Line 6 is a 1666.87 inches 1 phase line
    assert len(m["line6"].wires) == 1
    # Phases of the different wires
    assert m["line6"].wires[0].phase == "A"
    assert m["line6"].name == "line6"
    assert m["line6"].nominal_voltage == float(4.16) * 10**3
    assert m["line6"].line_type == None
    assert m["line6"].length == float(1666.87 * 0.0254)  # units = in
    assert m["line6"].from_element == "bus2"
    assert m["line6"].to_element == "bus6"
    assert m["line6"].is_fuse is None
    assert m["line6"].is_switch is None
    assert m["line6"].faultrate == parsed_values["Line"]["faultrate"]

    imp_matrix = (
        complex(parsed_values["Line"]["R1"], parsed_values["Line"]["X1"]) /
        0.0254)  # Units = in
    imp_matrix = imp_matrix.real + imp_matrix.imag * 1j
    assert m["line6"].impedance_matrix == [[imp_matrix]]
    cap_matrix = complex(parsed_values["Line"]["C1"], 0) / 0.0254  # Units = in
    assert m["line6"].capacitance_matrix == [[cap_matrix]]

    assert m["line6"].feeder_name == "sourcebus_src"
    assert m["line6"].is_recloser is None
    assert m["line6"].is_breaker is None
    assert m["line6"].nameclass == ""

    for w in m["line6"].wires:
        assert w.nameclass == ""
        assert w.X is None
        assert w.Y is None
        assert w.diameter is None
        assert w.gmr is None
        assert w.ampacity == parsed_values["Wire"]["ampacity"]
        assert w.emergency_ampacity == parsed_values["Wire"][
            "emergency_ampacity"]
        assert w.resistance is None
        assert w.insulation_thickness == parsed_values["Wire"][
            "insulation_thickness"]
        assert w.is_open is None
        assert w.concentric_neutral_gmr is None
        assert w.concentric_neutral_resistance is None
        assert w.concentric_neutral_diameter is None
        assert w.concentric_neutral_outside_diameter is None
        assert w.concentric_neutral_nstrand is None

    assert len(m["line9"].wires) == 3
    # Phases of the different wires
    assert set([w.phase for w in m["line9"].wires]) == set(["A", "B", "C"])
    assert m["line9"].name == "line9"
    assert m["line9"].nominal_voltage == float(4.16) * 10**3
    assert m["line9"].line_type == None
    assert m["line9"].length == 1.01 * 1609.34  # units = mi
    assert m["line9"].from_element == "bus2"
    assert m["line9"].to_element == "bus9"
    assert m["line9"].is_fuse is None
    assert m["line9"].is_switch is None
    assert m["line9"].faultrate == 0

    z1 = complex(
        parsed_values["Line"]["R1"],
        parsed_values["Line"]["X1"])  # r1,x1 taken from default values
    z0 = complex(
        parsed_values["Line"]["R0"],
        parsed_values["Line"]["X0"])  # r0,x0 taken from default values
    diag = ((2 * z1 + z0) / 3) / 1609.34  # Units = mi
    diag = diag.real + diag.imag * 1j
    rem = ((z0 - z1) / 3) / 1609.34  # Units = mi
    rem = rem.real + rem.imag * 1j
    imp_matrix = np.zeros((3, 3), dtype=np.complex_)
    imp_matrix.fill(rem)
    np.fill_diagonal(imp_matrix, diag)
    imp_matrix = imp_matrix.tolist()

    #    assert m["line9"].impedance_matrix == imp_matrix

    c1 = complex(parsed_values["Line"]["C1"],
                 0)  # c1 taken from default values
    c0 = complex(parsed_values["Line"]["C0"],
                 0)  # c0 taken from default values
    c_diag = ((2 * c1 + c0) / 3) / 1609.34  # Units = mi
    c_diag = round(c_diag.real, 18) + c_diag.imag * 1j
    c_rem = ((c0 - c1) / 3) / 1609.34  # Units = mi
    c_rem = c_rem.real + c_rem.imag * 1j
    cap_matrix = np.zeros((3, 3), dtype=np.complex_)
    cap_matrix.fill(c_rem)
    np.fill_diagonal(cap_matrix, c_diag)
    cap_matrix = cap_matrix.tolist()

    assert m["line9"].capacitance_matrix == cap_matrix

    assert m["line9"].feeder_name == "sourcebus_src"
    assert m["line9"].is_recloser is None
    assert m["line9"].is_breaker is None
    assert m["line9"].nameclass == ""

    for w in m["line9"].wires:
        assert w.X is None
        assert w.Y is None
        assert w.diameter is None
        assert w.gmr is None
        assert w.ampacity == parsed_values["Wire"]["ampacity"]
        assert w.emergency_ampacity == parsed_values["Wire"][
            "emergency_ampacity"]
        assert w.resistance is None
        assert w.insulation_thickness == parsed_values["Wire"][
            "insulation_thickness"]
        assert w.is_open is None
        assert w.concentric_neutral_gmr is None
        assert w.concentric_neutral_resistance is None
        assert w.concentric_neutral_diameter is None
        assert w.concentric_neutral_outside_diameter is None
        assert w.concentric_neutral_nstrand is None

    assert len(m["line10"].wires) == 3
    # Phases of the different wires
    assert set([w.phase for w in m["line1"].wires]) == set(["A", "B", "C"])
    assert m["line10"].name == "line10"
    assert m["line10"].nominal_voltage == float(4.16) * 10**3
    assert m["line10"].line_type == None
    assert m["line10"].length == 1.01 * 1609.34  # units = mi
    assert m["line10"].from_element == "bus2"
    assert m["line10"].to_element == "bus10"
    assert m["line10"].is_fuse is None
    assert m["line10"].is_switch is None
    assert m["line10"].faultrate == parsed_values["Line"]["faultrate"]

    z1 = complex(
        parsed_values["Line"]["R1"],
        parsed_values["Line"]["X1"])  # r1,x1 taken from default values
    z0 = complex(
        parsed_values["Line"]["R0"],
        parsed_values["Line"]["X0"])  # r0,x0 taken from default values
    diag = ((2 * z1 + z0) / 3) / 1609.34  # Units = mi
    diag = diag.real + diag.imag * 1j
    rem = ((z0 - z1) / 3) / 1609.34  # Units = mi
    rem = rem.real + rem.imag * 1j
    imp_matrix = np.zeros((3, 3), dtype=np.complex_)
    imp_matrix.fill(rem)
    np.fill_diagonal(imp_matrix, diag)
    imp_matrix = imp_matrix.tolist()

    #    assert m["line10"].impedance_matrix == imp_matrix

    c1 = complex(parsed_values["Line"]["C1"],
                 0)  # c1 taken from default values
    c0 = complex(parsed_values["Line"]["C0"],
                 0)  # c0 taken from default values
    c_diag = ((2 * c1 + c0) / 3) / 1609.34  # Units = mi
    c_diag = round(c_diag.real, 18) + c_diag.imag * 1j
    c_rem = ((c0 - c1) / 3) / 1609.34  # Units = mi
    c_rem = c_rem.real + c_rem.imag * 1j
    cap_matrix = np.zeros((3, 3), dtype=np.complex_)
    cap_matrix.fill(c_rem)
    np.fill_diagonal(cap_matrix, c_diag)
    cap_matrix = cap_matrix.tolist()

    assert m["line10"].capacitance_matrix == cap_matrix

    assert m["line10"].feeder_name == "sourcebus_src"
    assert m["line10"].is_recloser is None
    assert m["line10"].is_breaker is None
    assert m["line10"].nameclass == ""

    for w in m["line10"].wires:
        assert w.X is None
        assert w.Y is None
        assert w.diameter is None
        assert w.gmr is None
        assert w.ampacity == parsed_values["Wire"]["ampacity"]
        assert w.emergency_ampacity == parsed_values["Wire"][
            "emergency_ampacity"]
        assert w.resistance is None
        assert w.insulation_thickness == parsed_values["Wire"][
            "insulation_thickness"]
        assert w.is_open is None
        assert w.concentric_neutral_gmr is None
        assert w.concentric_neutral_resistance is None
        assert w.concentric_neutral_diameter is None
        assert w.concentric_neutral_outside_diameter is None
        assert w.concentric_neutral_nstrand is None

    assert len(m["line11"].wires) == 3
    # Phases of the different wires
    assert set([w.phase for w in m["line1"].wires]) == set(["A", "B", "C"])
    assert m["line11"].name == "line11"
    assert m["line11"].nominal_voltage == float(4.16) * 10**3
    assert m["line11"].line_type == None
    assert m["line11"].length == 1.01 * 1609.34  # units = mi
    assert m["line11"].from_element == "bus2"
    assert m["line11"].to_element == "bus11"
    assert m["line11"].is_fuse is None
    assert m["line11"].is_switch is None
    assert m["line11"].faultrate == 1.0

    z1 = complex(
        parsed_values["Line"]["R1"],
        parsed_values["Line"]["X1"])  # r1,x1 taken from default values
    z0 = complex(
        parsed_values["Line"]["R0"],
        parsed_values["Line"]["X0"])  # r0,x0 taken from default values
    diag = ((2 * z1 + z0) / 3) / 1609.34  # Units = mi
    diag = diag.real + diag.imag * 1j
    rem = ((z0 - z1) / 3) / 1609.34  # Units = mi
    rem = rem.real + rem.imag * 1j
    imp_matrix = np.zeros((3, 3), dtype=np.complex_)
    imp_matrix.fill(rem)
    np.fill_diagonal(imp_matrix, diag)
    imp_matrix = imp_matrix.tolist()

    #    assert m["line11"].impedance_matrix == imp_matrix

    c1 = complex(parsed_values["Line"]["C1"],
                 0)  # c1 taken from default values
    c0 = complex(parsed_values["Line"]["C0"],
                 0)  # c0 taken from default values
    c_diag = ((2 * c1 + c0) / 3) / 1609.34  # Units = mi
    c_diag = round(c_diag.real, 18) + c_diag.imag * 1j
    c_rem = ((c0 - c1) / 3) / 1609.34  # Units = mi
    c_rem = c_rem.real + c_rem.imag * 1j
    cap_matrix = np.zeros((3, 3), dtype=np.complex_)
    cap_matrix.fill(c_rem)
    np.fill_diagonal(cap_matrix, c_diag)
    cap_matrix = cap_matrix.tolist()

    assert m["line11"].capacitance_matrix == cap_matrix

    assert m["line11"].feeder_name == "sourcebus_src"
    assert m["line11"].is_recloser is None
    assert m["line11"].is_breaker is None
    assert m["line11"].nameclass == ""

    for w in m["line11"].wires:
        assert w.X is None
        assert w.Y is None
        assert w.diameter is None
        assert w.gmr is None
        assert w.ampacity == parsed_values["Wire"]["ampacity"]
        assert w.emergency_ampacity == parsed_values["Wire"][
            "emergency_ampacity"]
        assert w.resistance is None
        assert w.insulation_thickness == parsed_values["Wire"][
            "insulation_thickness"]
        assert w.is_open is None
        assert w.concentric_neutral_gmr is None
        assert w.concentric_neutral_resistance is None
        assert w.concentric_neutral_diameter is None
        assert w.concentric_neutral_outside_diameter is None
        assert w.concentric_neutral_nstrand is None
Пример #16
0
def test_switches():
    from ditto.store import Store
    from ditto.readers.opendss.read import Reader
    from ditto.default_values.default_values_json import Default_Values

    m = Store()
    r = Reader(
        master_file=os.path.join(current_directory, "test_switches.dss"))
    r.parse(m)
    m.set_names()

    # Reading OpenDSS default values
    d_v = Default_Values(
        os.path.join(
            current_directory,
            "../../../../ditto/default_values/opendss_default_values.json",
        ))
    parsed_values = d_v.parse()

    assert len(m["origin"].wires) == 3
    # Phases of the different wires
    assert set([w.phase for w in m["origin"].wires]) == set(["A", "B", "C"])
    assert m["origin"].name == "origin"
    assert m["origin"].nominal_voltage == float(12.47) * 10**3
    assert m["origin"].line_type is None
    assert m["origin"].length == 0.001 * 1000  # units = km
    assert m["origin"].from_element == "sourcebus"
    assert m["origin"].to_element == "node1"
    assert m["origin"].is_fuse is None
    assert m["origin"].is_switch is None
    assert m["origin"].faultrate == parsed_values["Line"]["faultrate"]

    z1 = complex(
        parsed_values["Line"]["R1"],
        parsed_values["Line"]["X1"])  # r1,x1 taken from default values
    z0 = complex(
        parsed_values["Line"]["R0"],
        parsed_values["Line"]["X0"])  # r0,x0 taken from default values
    diag = ((2 * z1 + z0) / 3) * 0.001  # Units = km
    diag = round(diag.real, 11) + round(diag.imag, 10) * 1j
    rem = ((z0 - z1) / 3) * 0.001  # Units = km
    rem = round(rem.real, 11) + rem.imag * 1j
    imp_matrix = np.zeros((3, 3), dtype=np.complex_)
    imp_matrix.fill(rem)
    np.fill_diagonal(imp_matrix, diag)
    imp_matrix = imp_matrix.tolist()

    assert m["origin"].impedance_matrix == imp_matrix

    c1 = complex(parsed_values["Line"]["C1"],
                 0)  # c1 taken from default values
    c0 = complex(parsed_values["Line"]["C0"],
                 0)  # c0 taken from default values
    c_diag = ((2 * c1 + c0) / 3) * 0.001  # Units = km
    c_diag = round(c_diag.real, 10) + c_diag.imag * 1j
    c_rem = ((c0 - c1) / 3) * 0.001  # Units = km
    c_rem = round(c_rem.real, 10) + c_rem.imag * 1j
    cap_matrix = np.zeros((3, 3), dtype=np.complex_)
    cap_matrix.fill(c_rem)
    np.fill_diagonal(cap_matrix, c_diag)
    cap_matrix = cap_matrix.tolist()

    assert m["origin"].capacitance_matrix == cap_matrix

    assert m["origin"].feeder_name == "sourcebus_src"
    assert m["origin"].is_recloser is None
    assert m["origin"].is_breaker is None
    assert m["origin"].nameclass == ""

    for w in m["origin"].wires:
        assert w.nameclass == ""
        assert w.X is None
        assert w.Y is None
        assert w.diameter is None
        assert w.gmr is None
        assert w.ampacity == parsed_values["Wire"]["ampacity"]
        assert w.emergency_ampacity == parsed_values["Wire"][
            "emergency_ampacity"]
        assert w.resistance is None
        assert w.insulation_thickness == parsed_values["Wire"][
            "insulation_thickness"]
        assert w.is_open is None
        assert w.concentric_neutral_gmr is None
        assert w.concentric_neutral_resistance is None
        assert w.concentric_neutral_diameter is None
        assert w.concentric_neutral_outside_diameter is None
        assert w.concentric_neutral_nstrand is None

    assert len(m["switch1"].wires) == 3  # Number of wires
    # Phases of the different wires
    assert set([w.phase for w in m["switch1"].wires]) == set(["A", "B", "C"])
    assert m["switch1"].name == "switch1"
    assert m["switch1"].nominal_voltage == float(12.47) * 10**3
    assert m["switch1"].line_type is None
    assert m["switch1"].length == 0.001 * 1000
    assert m["switch1"].from_element == "node1"
    assert m["switch1"].to_element == "node2"
    assert m["switch1"].is_fuse is None
    assert m["switch1"].is_switch == 1
    assert m["switch1"].faultrate == parsed_values["Line"]["faultrate"]
    assert m["switch1"].impedance_matrix == [
        [(0.001 + 0.001j), 0j, 0j],
        [0j, (0.001 + 0.001j), 0j],
        [0j, 0j, (0.001 + 0.001j)],
    ]

    c1 = complex(1.1, 0)
    c0 = complex(1, 0)
    c_diag = ((2 * c1 + c0) / 3) * 0.001  # Units = km
    c_diag = round(c_diag.real, 9) + c_diag.imag * 1j
    c_rem = ((c0 - c1) / 3) * 0.001  # Units = km
    c_rem = c_rem.real + c_rem.imag * 1j
    cap_matrix = np.zeros((3, 3), dtype=np.complex_)
    cap_matrix.fill(c_rem)
    np.fill_diagonal(cap_matrix, c_diag)
    cap_matrix = cap_matrix.tolist()

    np.testing.assert_array_almost_equal(m["switch1"].capacitance_matrix,
                                         cap_matrix)
    assert m["switch1"].feeder_name == "sourcebus_src"
    assert m["switch1"].is_recloser is None
    assert m["switch1"].is_breaker is None
    assert m["switch1"].nameclass == "switch1"

    for w in m["switch1"].wires:
        assert w.nameclass == ""
        assert w.X is None
        assert w.Y is None
        assert w.diameter is None
        assert w.gmr is None
        assert w.ampacity == 3000
        assert w.emergency_ampacity == 4000
        assert w.resistance is None
        assert w.insulation_thickness == parsed_values["Wire"][
            "insulation_thickness"]
        assert w.is_open == 0
        assert w.concentric_neutral_gmr is None
        assert w.concentric_neutral_resistance is None
        assert w.concentric_neutral_diameter is None
        assert w.concentric_neutral_outside_diameter is None
        assert w.concentric_neutral_nstrand is None

    assert len(m["switch2"].wires) == 3  # Number of wires
    # Phases of the different wires
    assert set([w.phase for w in m["switch2"].wires]) == set(["A", "B", "C"])
    assert m["switch2"].name == "switch2"
    assert m["switch2"].nominal_voltage == float(12.47) * 10**3
    assert m["switch2"].line_type is None
    assert m["switch2"].length == 0.001 * 1000
    assert m["switch2"].from_element == "node1"
    assert m["switch2"].to_element == "node3"
    assert m["switch2"].is_fuse is None
    assert m["switch2"].is_switch == 1
    assert m["switch2"].faultrate == parsed_values["Line"]["faultrate"]
    assert m["switch2"].impedance_matrix == [
        [(0.001 + 0.001j), 0j, 0j],
        [0j, (0.001 + 0.001j), 0j],
        [0j, 0j, (0.001 + 0.001j)],
    ]
    assert m["switch2"].capacitance_matrix == [
        [
            (0.001066667 + 0j),
            (-3.3333330000000004e-05 + 0j),
            (-3.3333330000000004e-05 + 0j),
        ],
        [
            (-3.3333330000000004e-05 + 0j),
            (0.001066667 + 0j),
            (-3.3333330000000004e-05 + 0j),
        ],
        [
            (-3.3333330000000004e-05 + 0j),
            (-3.3333330000000004e-05 + 0j),
            (0.001066667 + 0j),
        ],
    ]
    assert m["switch2"].feeder_name == "sourcebus_src"
    assert m["switch2"].is_recloser is None
    assert m["switch2"].is_breaker is None
    assert m["switch2"].nameclass == "switch2"

    for w in m["switch2"].wires:
        assert w.nameclass == ""
        assert w.X is None
        assert w.Y is None
        assert w.diameter is None
        assert w.gmr is None
        assert w.ampacity == 3000
        assert w.emergency_ampacity == 4000
        assert w.resistance is None
        assert w.insulation_thickness == parsed_values["Wire"][
            "insulation_thickness"]
        assert w.is_open == 1
        assert w.concentric_neutral_gmr is None
        assert w.concentric_neutral_resistance is None
        assert w.concentric_neutral_diameter is None
        assert w.concentric_neutral_outside_diameter is None
        assert w.concentric_neutral_nstrand is None

    assert len(m["switch3"].wires) == 3  # Number of wires
    # Phases of the different wires
    assert set([w.phase for w in m["switch3"].wires]) == set(["A", "B", "C"])
    assert m["switch3"].name == "switch3"
    assert m["switch3"].nominal_voltage == float(12.47) * 10**3
    assert m["switch3"].line_type is None
    assert m["switch3"].length == 0.001 * 1000
    assert m["switch3"].from_element == "node1"
    assert m["switch3"].to_element == "node4"
    assert m["switch3"].is_fuse is None
    assert m["switch3"].is_switch == 1
    assert m["switch3"].faultrate == parsed_values["Line"]["faultrate"]
    assert m["switch3"].impedance_matrix == [
        [(0.001 + 0.001j), 0j, 0j],
        [0j, (0.001 + 0.001j), 0j],
        [0j, 0j, (0.001 + 0.001j)],
    ]
    assert m["switch3"].capacitance_matrix == [
        [
            (0.001066667 + 0j),
            (-3.3333330000000004e-05 + 0j),
            (-3.3333330000000004e-05 + 0j),
        ],
        [
            (-3.3333330000000004e-05 + 0j),
            (0.001066667 + 0j),
            (-3.3333330000000004e-05 + 0j),
        ],
        [
            (-3.3333330000000004e-05 + 0j),
            (-3.3333330000000004e-05 + 0j),
            (0.001066667 + 0j),
        ],
    ]
    assert m["switch3"].feeder_name == "sourcebus_src"
    assert m["switch3"].is_recloser is None
    assert m["switch3"].is_breaker is None
    assert m["switch3"].nameclass == "switch3"

    for w in m["switch3"].wires:
        assert w.nameclass == ""
        assert w.X is None
        assert w.Y is None
        assert w.diameter is None
        assert w.gmr is None
        assert w.ampacity == 3000
        assert w.emergency_ampacity == 4000
        assert w.resistance is None
        assert w.insulation_thickness == parsed_values["Wire"][
            "insulation_thickness"]
        assert w.is_open == 1
        assert w.concentric_neutral_gmr is None
        assert w.concentric_neutral_resistance is None
        assert w.concentric_neutral_diameter is None
        assert w.concentric_neutral_outside_diameter is None
        assert w.concentric_neutral_nstrand is None

    assert len(m["switch4"].wires) == 3  # Number of wires
    # Phases of the different wires
    assert set([w.phase for w in m["switch4"].wires]) == set(["A", "B", "C"])
    assert m["switch4"].name == "switch4"
    assert m["switch4"].nominal_voltage == float(12.47) * 10**3
    assert m["switch4"].line_type is None
    assert m["switch4"].length == 0.001 * 1000
    assert m["switch4"].from_element == "node1"
    assert m["switch4"].to_element == "node5"
    assert m["switch4"].is_fuse is None
    assert m["switch4"].is_switch == 1
    assert m["switch4"].faultrate == parsed_values["Line"]["faultrate"]
    assert m["switch4"].impedance_matrix == [
        [(0.001 + 0.001j), 0j, 0j],
        [0j, (0.001 + 0.001j), 0j],
        [0j, 0j, (0.001 + 0.001j)],
    ]
    assert m["switch4"].capacitance_matrix == [
        [
            (0.001066667 + 0j),
            (-3.3333330000000004e-05 + 0j),
            (-3.3333330000000004e-05 + 0j),
        ],
        [
            (-3.3333330000000004e-05 + 0j),
            (0.001066667 + 0j),
            (-3.3333330000000004e-05 + 0j),
        ],
        [
            (-3.3333330000000004e-05 + 0j),
            (-3.3333330000000004e-05 + 0j),
            (0.001066667 + 0j),
        ],
    ]
    assert m["switch4"].feeder_name == "sourcebus_src"
    assert m["switch4"].is_recloser is None
    assert m["switch4"].is_breaker is None
    assert m["switch4"].nameclass == "switch4"

    for w in m["switch4"].wires:
        assert w.nameclass == ""
        assert w.X is None
        assert w.Y is None
        assert w.diameter is None
        assert w.gmr is None
        assert w.ampacity == 3000
        assert w.emergency_ampacity == 4000
        assert w.resistance is None
        assert w.insulation_thickness == parsed_values["Wire"][
            "insulation_thickness"]
        assert w.is_open == 0
        assert w.concentric_neutral_gmr is None
        assert w.concentric_neutral_resistance is None
        assert w.concentric_neutral_diameter is None
        assert w.concentric_neutral_outside_diameter is None
        assert w.concentric_neutral_nstrand is None

    assert len(m["switch5"].wires) == 1
    # Phases of the different wires
    assert m["switch5"].wires[0].phase == "A"
    assert m["switch5"].name == "switch5"
    assert m["switch5"].nominal_voltage == float(12.47) * 10**3
    assert m["switch5"].line_type is None
    assert m["switch5"].length == 0.001 * 1000
    assert m["switch5"].from_element == "node1"
    assert m["switch5"].to_element == "node6"
    assert m["switch5"].is_fuse is None
    assert m["switch5"].is_switch == 1
    assert m["switch5"].faultrate == parsed_values["Line"]["faultrate"]
    assert m["switch5"].impedance_matrix == [[(0.001 + 0.001j)]]
    assert m["switch5"].capacitance_matrix == [[(0.0011 + 0j)]]
    assert m["switch5"].feeder_name == "sourcebus_src"
    assert m["switch5"].is_recloser is None
    assert m["switch5"].is_breaker is None
    assert m["switch5"].nameclass == "switch5"

    for w in m["switch5"].wires:
        assert w.nameclass == ""
        assert w.X is None
        assert w.Y is None
        assert w.diameter is None
        assert w.gmr is None
        assert w.ampacity == 3000
        assert w.emergency_ampacity == 4000
        assert w.resistance is None
        assert w.insulation_thickness == parsed_values["Wire"][
            "insulation_thickness"]
        assert w.is_open == 0
        assert w.concentric_neutral_gmr is None
        assert w.concentric_neutral_resistance is None
        assert w.concentric_neutral_diameter is None
        assert w.concentric_neutral_outside_diameter is None
        assert w.concentric_neutral_nstrand is None

    assert len(m["switch6"].wires) == 1
    # Phases of the different wires
    assert m["switch6"].wires[0].phase == "C"
    assert m["switch6"].name == "switch6"
    assert m["switch6"].nominal_voltage == float(12.47) * 10**3
    assert m["switch6"].line_type is None
    assert m["switch6"].length == 0.001 * 1000
    assert m["switch6"].from_element == "node1"
    assert m["switch6"].to_element == "node7"
    assert m["switch6"].is_fuse is None
    assert m["switch6"].is_switch == 1
    assert m["switch6"].faultrate == parsed_values["Line"]["faultrate"]
    assert m["switch6"].impedance_matrix == [[(0.001 + 0.001j)]]
    assert m["switch6"].capacitance_matrix == [[(0.0011 + 0j)]]
    assert m["switch6"].feeder_name == "sourcebus_src"
    assert m["switch6"].is_recloser is None
    assert m["switch6"].is_breaker is None
    assert m["switch6"].nameclass == "switch6"

    for w in m["switch6"].wires:
        assert w.nameclass == ""
        assert w.X is None
        assert w.Y is None
        assert w.diameter is None
        assert w.gmr is None
        assert w.ampacity == 3000
        assert w.emergency_ampacity == 4000
        assert w.resistance is None
        assert w.is_open == 1
        assert w.concentric_neutral_gmr is None
        assert w.concentric_neutral_resistance is None
        assert w.concentric_neutral_diameter is None
        assert w.concentric_neutral_outside_diameter is None
        assert w.concentric_neutral_nstrand is None

    assert len(m["switch7"].wires) == 2
    # Phases of the different wires
    assert set([w.phase for w in m["switch7"].wires]) == set(["B", "C"])
    assert m["switch7"].name == "switch7"
    assert m["switch7"].nominal_voltage == float(12.47) * 10**3
    assert m["switch7"].line_type is None
    assert m["switch7"].length == 0.001 * 1000
    assert m["switch7"].from_element == "node1"
    assert m["switch7"].to_element == "node8"
    assert m["switch7"].is_fuse is None
    assert m["switch7"].is_switch == 1
    assert m["switch7"].faultrate == parsed_values["Line"]["faultrate"]
    assert m["switch7"].impedance_matrix == [
        [(0.001 + 0.001j), 0j],
        [0j, (0.001 + 0.001j)],
    ]
    assert m["switch7"].capacitance_matrix == [
        [(0.001066667 + 0j), (-3.3333330000000004e-05 + 0j)],
        [(-3.3333330000000004e-05 + 0j), (0.001066667 + 0j)],
    ]
    assert m["switch7"].feeder_name == "sourcebus_src"
    assert m["switch7"].is_recloser is None
    assert m["switch7"].is_breaker is None
    assert m["switch7"].nameclass == "switch7"

    for w in m["switch7"].wires:
        assert w.nameclass == ""
        assert w.X is None
        assert w.Y is None
        assert w.diameter is None
        assert w.gmr is None
        assert w.ampacity == 3000
        assert w.emergency_ampacity == 4000
        assert w.resistance is None
        assert w.insulation_thickness == parsed_values["Wire"][
            "insulation_thickness"]
        assert w.is_open == 1
        assert w.concentric_neutral_gmr is None
        assert w.concentric_neutral_resistance is None
        assert w.concentric_neutral_diameter is None
        assert w.concentric_neutral_outside_diameter is None
        assert w.concentric_neutral_nstrand is None

    assert len(m["switch8"].wires) == 2
    # Phases of the different wires
    assert set(w.phase for w in m["switch8"].wires) == set(["A", "B"])
    assert m["switch8"].name == "switch8"
    assert m["switch8"].nominal_voltage == float(12.47) * 10**3
    assert m["switch8"].line_type is None
    assert m["switch8"].length == 0.001 * 1000
    assert m["switch8"].from_element == "node1"
    assert m["switch8"].to_element == "node9"
    assert m["switch8"].is_fuse is None
    assert m["switch8"].is_switch == 1
    assert m["switch8"].faultrate == parsed_values["Line"]["faultrate"]
    assert m["switch8"].impedance_matrix == [
        [(0.001 + 0.001j), 0j],
        [0j, (0.001 + 0.001j)],
    ]
    assert m["switch8"].capacitance_matrix == [
        [(0.001066667 + 0j), (-3.3333330000000004e-05 + 0j)],
        [(-3.3333330000000004e-05 + 0j), (0.001066667 + 0j)],
    ]
    assert m["switch8"].feeder_name == "sourcebus_src"
    assert m["switch8"].is_recloser is None
    assert m["switch8"].is_breaker is None
    assert m["switch8"].nameclass == "switch8"

    for w in m["switch8"].wires:
        assert w.nameclass == ""
        assert w.X is None
        assert w.Y is None
        assert w.diameter is None
        assert w.gmr is None
        assert w.ampacity == 3000
        assert w.emergency_ampacity == 4000
        assert w.resistance is None
        assert w.is_open == 0
        assert w.concentric_neutral_gmr is None
        assert w.concentric_neutral_resistance is None
        assert w.concentric_neutral_diameter is None
        assert w.concentric_neutral_outside_diameter is None
        assert w.concentric_neutral_nstrand is None
Пример #17
0
"""
Tests:
    + Check if the system has any loops (once open switches are removed)
    + Check if there is a path from each load to the head node
    + Check that the phases on the high and low side of the transformer match
    + Check if there's a unique path from load to the source

    (transformer_phase_path does all of these):
    + Check that only zero or one transformers are on the path to the head node (excluding regulators)
    + Check that the number of phases increases from the transformer to the substation
    + Check that the number of phases increases from a three phase load to the substation
    + Check that the number of phases is the same from the load to the transformer

"""
model  = Store()
r = Reader(master_file = test_system_master,buscoords_file = test_system_coords)
r.parse(model)

for i in model.models:
    if isinstance(i,PowerTransformer):
        i.is_substation = True #Only for 13 node system. Need to fix in readers

print('Pass loops check:',flush=True)
loops_res = check_loops(model,verbose=True)
print(loops_res)
print()

print('Pass loads connected check:',flush=True)
loads_connected_res = check_loads_connected(model,verbose=True)
print(loads_connected_res)
print()