예제 #1
0
def test_simulation_visualization():
    """Test simulation visualization."""
    sim = plonk.load_simulation(prefix=PREFIX, directory=DIR_PATH)

    viz = sim.visualize(kind='particle', x='x', y='y')
    viz.next()
    viz.prev()
예제 #2
0
def test_sim_data():
    """Testing data in simulation."""
    sim = plonk.load_simulation(prefix=PREFIX, directory=DIR_PATH)

    snaps = sim.snaps
    assert len(snaps) == 1
    assert len(snaps[0]) == 2000

    properties = {
        'adiabatic_index': 1.0,
        'dust_method': 'dust as separate sets of particles',
        'equation_of_state': 'locally isothermal disc',
        'grain_density': [3000.0] * plonk.units('kg/m^3'),
        'grain_size': [0.01] * plonk.units('m'),
        'smoothing_length_factor': 1.0,
        'time': [0.0] * plonk.units('s'),
    }

    for key, val in sim.properties.items():
        if isinstance(val, plonk._units.Quantity):
            assert np.allclose(val.m, properties[key].m)
        else:
            assert sim.properties[key] == properties[key]

    assert sim.paths['time_series_global'][0].name == TS_FILENAME
예제 #3
0
def test_init_simulation():
    """Testing initialising simulation."""
    plonk.load_simulation(prefix=PREFIX, directory=DIR_PATH)
    with pytest.raises(ValueError):
        plonk.load_simulation(prefix=PREFIX,
                              directory=DIR_PATH,
                              data_source='not_available')
    with pytest.raises(FileNotFoundError):
        plonk.load_simulation(prefix='does_not_exist', directory=DIR_PATH)
예제 #4
0
def test_animation_particles():
    """Test animation of particle plots."""
    sim = plonk.load_simulation(prefix=PREFIX, directory=DIR_PATH)

    snaps = [sim.snaps[0], sim.snaps[0], sim.snaps[0]]
    filename = Path('animation.mp4')
    visualize.animation_particles(
        filename=filename,
        snaps=snaps,
        x='x',
        y='density',
        units={
            'position': 'au',
            'density': 'g/cm^3'
        },
        adaptive_limits=False,
    )
    filename.unlink()
예제 #5
0
def test_animation_images():
    """Test animation of images."""
    sim = plonk.load_simulation(prefix=PREFIX, directory=DIR_PATH)

    snaps = [sim.snaps[0], sim.snaps[0], sim.snaps[0]]
    filename = Path('animation.mp4')
    visualize.animation_images(
        filename=filename,
        snaps=snaps,
        quantity='density',
        units={
            'position': 'au',
            'density': 'g/cm^3'
        },
        adaptive_colorbar=False,
        num_pixels=(32, 32),
    )
    filename.unlink()
예제 #6
0
def _calculate_velocity_differential(path, same_times=False):
    sim = plonk.load_simulation(prefix='dustybox', directory=path)
    data = dustybox.calculate_differential_velocity(sim)
    times = None
    if same_times:
        times = data['time'].to_numpy()
    exact1 = dustybox.calculate_differential_velocity_exact(sim,
                                                            times=times,
                                                            backreaction=True)
    exact2 = dustybox.calculate_differential_velocity_exact(sim,
                                                            times=times,
                                                            backreaction=False)
    # Scale time by the shortest stopping time
    _, stopping_time = dustybox.get_dust_properties(sim.snaps[0])
    data['time'] = data['time'] / stopping_time[0]
    exact1['time'] = exact1['time'] / stopping_time[0]
    exact2['time'] = exact2['time'] / stopping_time[0]

    return data, exact1, exact2
예제 #7
0
def time_evolution_error():
    print('')
    print('Time evolution of velocity differential error')
    print('---------------------------------------------')
    print('')

    paths = _get_paths(name='time_evolution', glob='f_*-N_*')
    error = dict()

    for name, path in paths.items():
        print(f'Calculating error for {name}...')
        sim = plonk.load_simulation(prefix='dustybox', directory=path)
        error[name] = dustybox.calculate_error(sim)

    print('Plotting figure...')
    fig = dustybox.plot_error_all(error, figsize=(15, 8))
    name = 'dustybox_differential_velocity_error.pdf'
    print(f'Saving figure to {name}')
    fig.savefig(name, bbox_inches='tight', pad_inches=0.05)
예제 #8
0
def test_animation_profiles():
    """Test animation of profiles."""
    sim = plonk.load_simulation(prefix=PREFIX, directory=DIR_PATH)

    snaps = [sim.snaps[0], sim.snaps[0], sim.snaps[0]]
    profiles = [plonk.load_profile(snap) for snap in snaps]

    filename = Path('animation.mp4')
    visualize.animation_profiles(
        filename=filename,
        profiles=profiles,
        x='radius',
        y='surface_density',
        units={
            'position': 'au',
            'surface_density': 'g/cm^2'
        },
    )
    filename.unlink()
예제 #9
0
def accuracy():
    print('')
    print('Accuracy of method')
    print('------------------')
    print('')

    paths = _get_paths(name='accuracy', glob='hfact_*-eps_*-C_force_*')
    error = dict()

    for name, path in paths.items():
        print(f'Calculating error for {name}...')
        sim = plonk.load_simulation(prefix='dustybox', directory=path)
        error[name] = dustybox.calculate_error(sim)

    print('Plotting figure...')

    C_drag = {}
    error_norm = {}
    for key, val in error.items():
        name = key[:18]
        if C_drag.get(name) is None:
            C_drag[name] = list()
        C_drag[name].append(_get_val(key, 'C_force'))
        if error_norm.get(name) is None:
            error_norm[name] = list()
        error_norm[name].append(
            _error_norm_fn([val['error.1'], val['error.2']], method=2))

    def line(x, m=2, c=0):
        return [m * _x + c for _x in x]

    m, c = 2, -0.1

    fig, ax = plt.subplots()

    def plot_error_norm(eta, marker, label, ax):
        _C_drag = {
            key: val
            for key, val in C_drag.items() if _get_val(key, 'hfact') == eta
        }
        _error_norm = {
            key: val
            for key, val in error_norm.items() if _get_val(key, 'hfact') == eta
        }

        for (eps, dt), err in zip(_C_drag.items(), _error_norm.values()):
            _eps = _get_val(eps, 'dust_to_gas')
            if label:
                _label = rf'$\eta = {eta}, \epsilon = {_eps}$'
            else:
                _label = None
            ax.plot(np.log10(dt), np.log10(err), marker, label=_label)

        return [np.log10(dt[0]), np.log10(dt[-1])]

    plot_error_norm(eta=1.0, marker='d', label=True, ax=ax)
    x = plot_error_norm(eta=2.5, marker='s', label=True, ax=ax)
    ax.plot(x, line(x, m=m, c=c), '--', color='gray')
    ax.set(xlabel=r'$\log_{10}$(dt)', ylabel=r'$\log_{10}$(error)')
    ax.legend()

    name = 'dustybox_accuracy.pdf'
    print(f'Saving figure to {name}')
    fig.savefig(name, bbox_inches='tight', pad_inches=0.05)
예제 #10
0
def test_set_units_time_series():
    """Test set/unset units time series."""
    sim = plonk.load_simulation(prefix=PREFIX, directory=DIR_PATH)
    sim.unset_units_on_time_series()
    sim.set_units_on_time_series()
예제 #11
0
def test_to_array():
    """Testing to_array method."""
    sim = plonk.load_simulation(prefix=PREFIX, directory=DIR_PATH)
    sim.to_array(quantity='density', indices=[0, 1, 2])