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()
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"}
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]
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
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") ]
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')}
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"
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
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] )
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")]
def test_c_sim_fail(): c = new("C") with pytest.raises(ModelException): t, x = simulate(c, timespan=[0, 1], x0=[1], dx0=[1])
def test_empty_failstate(self): from BondGraphTools import new model = new() assert model.constitutive_relations == []