Beispiel #1
0
def rate_converters():
    """Two ZOH converters"""
    return {
        cs.Connection(cs.Src('inertia', 'omega'), cs.Dst('engine', 'omega')):
        cs.Zoh,
        cs.Connection(cs.Src('alpha', 'alpha'), cs.Dst('engine', 'alpha')):
        cs.Zoh,
        cs.Connection(cs.Src('engine', 'tau'), cs.Dst('inertia', 'tau')):
        cs.Zoh,
    }
Beispiel #2
0
def _three_cosimulations(parameters: TwoMass):
    """Helper function"""
    csnet = cs_network(parameters)
    slaves, connections = csnet
    make_zoh: cs.ConverterConstructor = cs.Zoh
    rate_converters = {
        cs.Connection(src, dst): make_zoh
        for dst, src in connections.items()
    }

    cosimulations = list()

    step_sizes_1 = {name: Fraction(1, 4) for name in slaves}
    initial_tokens_1 = autoconfig.find_initial_tokens(csnet, step_sizes_1,
                                                      rate_converters)
    cosimulations.append(
        (csnet, step_sizes_1, rate_converters, initial_tokens_1))

    step_sizes_2 = {name: Fraction(1, 2) for name in slaves}
    initial_tokens_2 = autoconfig.find_initial_tokens(csnet, step_sizes_2,
                                                      rate_converters)
    cosimulations.append(
        (csnet, step_sizes_2, rate_converters, initial_tokens_2))

    step_sizes_3 = step_sizes_1
    initial_tokens_3 = autoconfig.null_jacobi_initial_tokens(
        connections, step_sizes_3)
    cosimulations.append(
        (csnet, step_sizes_3, rate_converters, initial_tokens_3))

    return cosimulations
Beispiel #3
0
def simple_execution(end_time=Fraction(100), fig_file=None):
    """The demo function"""
    plt.clf()
    non_default = dict()
    csnet = cs_network(generate_parameters(non_default))
    slaves, connections = csnet
    step_sizes = {name: Fraction(1, 4) for name in slaves}
    make_zoh: cs.ConverterConstructor = cs.Zoh
    rate_converters = {
        cs.Connection(src, dst): make_zoh
        for dst, src in connections.items()
    }
    initial_tokens = autoconfig.find_initial_tokens(csnet, step_sizes,
                                                    rate_converters)
    cosimulation = csnet, step_sizes, rate_converters, initial_tokens
    results = cs.execute(cosimulation, end_time)
    print(f"v_right = {results.tokens['middle_oscillator', 'v_right'][-1]}")
    print(f"v_left = {results.tokens['middle_oscillator', 'v_left'][-1]}")
    print(f"F_right = {results.tokens['left_oscillator', 'F'][-1]}")
    print(f"F_left = {results.tokens['right_oscillator', 'F'][-1]}")
    ts, vals = cs.get_signal_samples(cosimulation, results,
                                     'middle_oscillator', 'F_right')
    # ts, vals = cs.get_signal_samples(cosimulation, results, 'right_oscillator', 'v')
    plt.stem(ts, vals)
    show_figure(plt.gcf(), fig_file)
Beispiel #4
0
def find_configuration(
        csnet: cs.Network, end_time: Fraction, tolerance: float, max_iter: int = 10
) -> cs.Cosimulation:
    """A method for finding a working configuration for the given co-simulation network"""
    slaves, connections = csnet
    step_sizes: cs.StepSizes = {name: end_time / 10 for name in slaves.keys()}
    make_zoh: cs.ConverterConstructor = cs.Zoh
    rate_converters = {cs.Connection(src, dst): make_zoh for dst, src in connections.items()}

    num_iter = 0
    while True:
        initial_tokens = find_initial_tokens(csnet, step_sizes, rate_converters)
        cosim = csnet, step_sizes, rate_converters, initial_tokens
        simulator_defects = calculate_simulator_defects(
            slaves, connections, cs.evaluate(cosim, end_time)
        )
        tolerance_satisfied = all(defect < tolerance for defect in simulator_defects.values())
        num_iter += 1
        if not tolerance_satisfied and num_iter < max_iter:
            step_sizes = {
                name: step_size * _step_reduction_factor(simulator_defects[name], tolerance)
                for name, step_size in step_sizes.items()
            }
        else:
            defect = cs.evaluate(cosim, end_time)
            assert max(max(defect.output.values()), max(defect.connection.values())) < tolerance
            break

    return csnet, step_sizes, rate_converters, initial_tokens
Beispiel #5
0
def test_defect_calculation_control():
    """Tests whether defect calculation give sane results"""
    csnet = example.control.cs_network()
    slaves, connections = csnet
    step_sizes = {name: Fraction(1, 2) for name in slaves}
    make_zoh: cs.ConverterConstructor = cs.Zoh
    rate_converters = {
        cs.Connection(src, dst): make_zoh
        for dst, src in connections.items()
    }
    initial_tokens = {sdf.Dst('PI', 'u'): [0.], sdf.Dst('PT2', 'u'): [0.]}
    cosim = csnet, step_sizes, rate_converters, initial_tokens
    defect = cs.evaluate(cosim, Fraction(20.))
    for val in defect.connection.values():
        assert val < float('inf')
    for val in defect.output.values():
        assert val < float('inf')
Beispiel #6
0
def ramp_cosimulation(slope1=2.,
                      slope2=3.,
                      step1=Fraction(5),
                      step2=Fraction(7)):
    """Used for testing the defect calculation"""
    csnet = _semiconnected_ramps(slope1, slope2)
    _, connections = csnet
    step_sizes = {'Ramp1': step1, 'Ramp2': step2}
    make_zoh: cs.ConverterConstructor = cs.Zoh
    rate_converters = {
        cs.Connection(src, dst): make_zoh
        for dst, src in connections.items()
    }
    alpha = Fraction(int(lcm(step1.numerator, step2.numerator)),
                     int(gcd(step1.denominator, step2.denominator)))
    num1, num2 = tuple(map(int, [alpha / step for step in (step1, step2)]))
    initial_tokens = {
        sdf.Dst('Ramp1', 'u'):
        [(i - num1 + 1) * step2 * slope2 for i in range(num1)],
        sdf.Dst('Ramp2', 'u'):
        [(i - num2 + 1) * step1 * slope1 for i in range(num2)]
    }
    return csnet, step_sizes, rate_converters, initial_tokens
Beispiel #7
0
def rate_converters():
    """Two ZOH converters"""
    return {
        cs.Connection(cs.Src('PI', 'y'), cs.Dst('PT2', 'u')): cs.Zoh,
        cs.Connection(cs.Src('PT2', 'y'), cs.Dst('PI', 'u')): cs.Zoh,
    }