Ejemplo n.º 1
0
def test_c_se_sim():

    c = new("C", value=1)
    se = new("Se")
    r = new("R", value=1)
    kcl = new("1")
    bg = new()
    bg.add([c, se, kcl, r])

    connect(c, (kcl, kcl.non_inverting))
    connect(r, (kcl, kcl.non_inverting))
    connect(se, (kcl, kcl.non_inverting))

    def u(t, x, dx):
        return -np.exp(-t)
    assert str(bg.constitutive_relations) == '[dx_0 + u_0 + x_0]'
    with pytest.raises(ModelException) as ex:
        _ = simulate(
            c, timespan=[0, 10], x0=[0]
        )
        assert "Control variable u_0 must be specified" in ex.args
    t, x = simulate(
        bg, timespan=[0, 10], x0=[0], control_vars=[u]
    )

    assert t[0] == 0
    assert t[-1] == 10

    assert (len(t), 1) == x.shape
    assert x[0, 0] == 0
    solution = t * np.exp(-t)

    res = abs(x - solution)
    assert (res < 0.001).all()
Ejemplo n.º 2
0
def test_build_templated_model():
    root = new(name="System")
    model = new(name="Vs")
    root.add(model)
    ss = new("SS", name="pout")
    Se = new("Se", name="Vs")
    zero = new("0", name="0_0")
    model.add(ss, Se, zero)
    connect(ss, zero)
    connect(Se, zero)

    file = file_path / "temp.bg"
    assert root.name == "System"

    with TempFile(file):

        save(root, file)

        with open(file, 'r') as fs:
            temp_data = yaml.load(fs, Loader=yaml.SafeLoader)

    assert temp_data["root"] == root.name
    assert temp_data["models"].keys() == {"/", "/Vs"}

    assert temp_data["models"]["/"]["components"] == ["Vs /Vs"]
    assert set(temp_data["models"]["/Vs"]["components"]) == {
        "pout base/SS", "Vs base/Se", "0_0 base/0"
    }
    assert set(temp_data["models"]["/Vs"]["netlist"]) == {"pout 0_0", "Vs 0_0"}
Ejemplo n.º 3
0
def test_c_se_build_ode():

    c = new("C", value=1)
    se = new("Se")
    r = new("R", value=1)
    kcl = new("1")
    bg = new()
    bg.add([c, se, kcl, r])

    connect(c, (kcl, kcl.non_inverting))
    connect(r, (kcl, kcl.non_inverting))
    connect(se, (kcl, kcl.non_inverting))

    # "dx_0 - u_0 + x_0"
    # so f(x,t) = exp(-t) - x

    def u(t, x, dx):
        return -np.exp(-t)

    residual_func, diff_vars = _bondgraph_to_residuals(bg, control_vars=[u])

    r = [0]
    residual_func(0, [0], [0], r)
    assert r == [-1]
    residual_func(0, [0], [2], r)
    assert r == [1]
    residual_func(0, [2], [0], r)
    assert r == [1]

    residual_func(0, [0], [1], r)
    assert r == [0]

    t_test = np.log(4)
    residual_func(t_test, [1 / 8], [1 / 8], r)
    assert r == [0]
Ejemplo n.º 4
0
def test_source_sensor():

    ss = new("SS", name="Plug 1")
    model = new()

    with pytest.raises(InvalidComponentException):
        expose(ss, "A")

    model.add(ss)

    assert len(model.ports) == 0
    expose(ss, "A")
    assert len(model.ports) == 1
Ejemplo n.º 5
0
def test_ported_cap():
    model = new()
    c = new("C", value=3)
    zero = new("0")
    ss = new("SS")
    model.add(c, zero, ss)

    connect(c, zero)
    connect(ss, zero)

    expose(ss)
    assert len(model.ports) == 1

    assert model.constitutive_relations == [
        sympy.sympify("dx_0 - f_0"),
        sympy.sympify("e_0 - x_0/3")
    ]
Ejemplo n.º 6
0
def test_ss_exposure():
    model = new()
    ss = new("SS")
    sf = new("Sf", name="Sf")
    zero = new("0")

    model.add(ss, sf, zero)

    connect(sf, zero)
    connect(ss, zero)
    assert not model.ports
    assert set(model.control_vars.values()) == {(sf, 'f'), (ss, 'e'),
                                                (ss, 'f')}
    expose(ss, 'pin')
    assert model.ports
    p, = list(model.ports)
    assert p.name is "pin"
    assert set(model.control_vars.values()) == {(sf, 'f')}
Ejemplo n.º 7
0
def test_uri_tree():

    model = new(name="Model")

    internal_model = new(name="Model")
    r_i = new('R')
    internal_model.add(r_i)

    # should raise
    with pytest.raises(InvalidComponentException) as ex:
        model.add(model)

    model.add(internal_model)

    assert internal_model.uri == "Model:/Model"

    c_o = new("C", name="C_1")
    model.add(c_o)

    assert c_o.uri == "Model:/C_1"


    assert internal_model in model.components
    assert r_i in internal_model.components
    assert r_i not in model.components


    assert r_i.uri == "Model:/Model/" + r_i.name


    c_i = new("C", name="C_1")
    internal_model.add(
        c_i
    )

    assert c_i.uri == "Model:/Model/C_1"

    model.remove(internal_model)

    assert internal_model not in model.components
    assert internal_model.uri == model.uri

    assert c_i.uri == "Model:/C_1"
    assert c_o.uri == "Model:/C_1"
Ejemplo n.º 8
0
def test_c_se_sum_switch():
    c = new("C", value=1)
    se = new("Se")
    r = new("R", value=1)
    kcl = new("1")
    bg = new()
    bg.add([c, se, kcl, r])

    connect(c, (kcl, kcl.non_inverting))
    connect(r, (kcl, kcl.non_inverting))
    connect(se, (kcl, kcl.non_inverting))

    def bang_bang(t, x, dx):
        return 1.5 if x >= 1 else -2.0

    t, x = simulate(
        bg, timespan=[0, 10], x0=[0], dx0=[1], control_vars=[bang_bang])

    assert (x[0, -1] - 1) < 0.001
Ejemplo n.º 9
0
def test_rlc():
    c = new("C", value=1)
    se = new("Se")
    r = new("R", value=1)
    l = new("I", value=1)
    kvl = new("0")

    bg = new()
    bg.add([c, se, kvl, r, l])

    connect(c, kvl)
    connect(r, kvl)
    connect(se, kvl)
    connect(l, kvl)

    _ = simulate(
        bg, timespan=[0, 10], x0=[1, 0], control_vars=[1]
    )
Ejemplo n.º 10
0
def test_ported_series_resistor():

    Se = new("Se")
    r1 = new("R", value=1)
    r2 = new("R", value=2)
    kvl = new('1')
    ss = new("SS")
    model = new()
    model.add(Se, r1, r2, kvl, ss)
    expose(ss)
    connect(Se, kvl.non_inverting)
    connect(kvl.inverting, r1)
    connect(kvl.inverting, r2)
    connect(kvl.inverting, ss)

    assert len(model.ports) == 1

    assert model.constitutive_relations == [sympy.sympify("e_0 - 3*f_0 - u_0")]
Ejemplo n.º 11
0
def test_c_sim_fail():

    c = new("C")
    with pytest.raises(ModelException):
        t, x = simulate(c, timespan=[0, 1], x0=[1], dx0=[1])
Ejemplo n.º 12
0
    def test_empty_failstate(self):
        from BondGraphTools import new

        model = new()

        assert model.constitutive_relations == []