Example #1
0
def test_compute_distance2boundary(packet_params, expected_params, packet,
                                   model):
    mu = packet_params["mu"]
    r = packet_params["r"]

    d_boundary = r_packet.calculate_distance_boundary(r, mu, model.r_inner[0],
                                                      model.r_outer[0])

    assert_almost_equal(d_boundary[0], expected_params["d_boundary"])
Example #2
0
def test_compute_distance2boundary(packet_params, expected_params):
    mu = packet_params["mu"]
    r = packet_params["r"]
    r_inner = np.array([6.912e14, 8.64e14], dtype=np.float64)
    r_outer = np.array([8.64e14, 1.0368e15], dtype=np.float64)

    d_boundary = r_packet.calculate_distance_boundary(r, mu, r_inner[0],
                                                      r_outer[0])

    assert_almost_equal(d_boundary[0], expected_params["d_boundary"])
Example #3
0
def test_calculate_distance_boundary(packet_params, expected_params, model):
    mu = packet_params["mu"]
    r = packet_params["r"]

    d_boundary = r_packet.calculate_distance_boundary(r, mu, model.r_inner[0],
                                                      model.r_outer[0])

    # Accuracy to within 0.1cm
    assert_almost_equal(d_boundary[0],
                        expected_params["d_boundary"],
                        decimal=1)
Example #4
0
def trace_vpacket_within_shell(v_packet, numba_model, numba_plasma):
    """
    Trace VPacket within one shell (relatively simple operation)
    """
    r_inner = numba_model.r_inner[v_packet.current_shell_id]
    r_outer = numba_model.r_outer[v_packet.current_shell_id]

    distance_boundary, delta_shell = calculate_distance_boundary(
        v_packet.r, v_packet.mu, r_inner, r_outer
    )
    # defining start for line interaction
    start_line_id = v_packet.next_line_id

    # e scattering initialization

    cur_electron_density = numba_plasma.electron_density[
        v_packet.current_shell_id
    ]
    tau_electron = calculate_tau_electron(
        cur_electron_density, distance_boundary
    )
    tau_trace_combined = tau_electron

    # Calculating doppler factor
    doppler_factor = get_doppler_factor(
        v_packet.r, v_packet.mu, numba_model.time_explosion
    )
    comov_nu = v_packet.nu * doppler_factor
    cur_line_id = start_line_id

    for cur_line_id in range(start_line_id, len(numba_plasma.line_list_nu)):
        # if tau_trace_combined > 10: ### FIXME ?????
        #    break

        nu_line = numba_plasma.line_list_nu[cur_line_id]
        # TODO: Check if this is what the C code does

        tau_trace_line = numba_plasma.tau_sobolev[
            cur_line_id, v_packet.current_shell_id
        ]

        if cur_line_id == len(numba_plasma.line_list_nu) - 1:
            is_last_line = True
        else:
            is_last_line = False

        distance_trace_line = calculate_distance_line(
            v_packet,
            comov_nu,
            is_last_line,
            nu_line,
            numba_model.time_explosion,
        )

        if cur_line_id != (len(numba_plasma.line_list_nu) - 1):
            test_for_close_line(
                v_packet,
                cur_line_id,
                numba_plasma.line_list_nu[cur_line_id - 1],
                numba_plasma,
            )

        if distance_boundary <= distance_trace_line:
            break

        tau_trace_combined += tau_trace_line

    else:
        if cur_line_id == (len(numba_plasma.line_list_nu) - 1):
            cur_line_id += 1
    v_packet.next_line_id = cur_line_id

    return tau_trace_combined, distance_boundary, delta_shell