double test_calculate_chi_bf(void){ rpacket_t rp; storage_model_t sm; init_rpacket(&rp); init_storage_model(&sm); rk_state mt_state; irandom(&mt_state); int64_t j_blue_idx = 0; double D_BOUNDARY = compute_distance2boundary(&rp, &sm); rpacket_set_d_boundary(&rp, D_BOUNDARY); double D_LINE; // FIXME MR: return status of compute_distance2line() is ignored compute_distance2line(&rp, &sm, &D_LINE); rpacket_set_d_line(&rp, D_LINE); move_packet(&rp, &sm, 1e13); double d_line = rpacket_get_d_line(&rp); increment_j_blue_estimator(&rp, &sm, d_line, j_blue_idx); double DISTANCE = 1e13; montecarlo_line_scatter(&rp, &sm, DISTANCE, &mt_state); DISTANCE = 0.95e13; // MR: wrong: move_packet_across_shell_boundary() returns void move_packet_across_shell_boundary(&rp, &sm, DISTANCE, &mt_state); montecarlo_one_packet(&sm, &rp, 1, &mt_state); montecarlo_one_packet_loop(&sm, &rp, 1, &mt_state); DISTANCE = 1e13; montecarlo_thomson_scatter(&rp, &sm, DISTANCE, &mt_state); calculate_chi_bf(&rp, &sm); double res = rpacket_doppler_factor (&rp, &sm); dealloc_storage_model(&sm); return res; }
void move_packet_across_shell_boundary (rpacket_t * packet, storage_model_t * storage, double distance, rk_state *mt_state) { move_packet (packet, storage, distance); if (rpacket_get_virtual_packet (packet) > 0) { double delta_tau_event = rpacket_get_chi_continuum(packet) * distance; rpacket_set_tau_event (packet, rpacket_get_tau_event (packet) + delta_tau_event); } else { rpacket_reset_tau_event (packet, mt_state); } if ((rpacket_get_current_shell_id (packet) < storage->no_of_shells - 1 && rpacket_get_next_shell_id (packet) == 1) || (rpacket_get_current_shell_id (packet) > 0 && rpacket_get_next_shell_id (packet) == -1)) { rpacket_set_current_shell_id (packet, rpacket_get_current_shell_id (packet) + rpacket_get_next_shell_id (packet)); } else if (rpacket_get_next_shell_id (packet) == 1) { rpacket_set_status (packet, TARDIS_PACKET_STATUS_EMITTED); } else if ((storage->reflective_inner_boundary == 0) || (rk_double (mt_state) > storage->inner_boundary_albedo)) { rpacket_set_status (packet, TARDIS_PACKET_STATUS_REABSORBED); } else { double doppler_factor = rpacket_doppler_factor (packet, storage); double comov_nu = rpacket_get_nu (packet) * doppler_factor; double comov_energy = rpacket_get_energy (packet) * doppler_factor; rpacket_set_mu (packet, rk_double (mt_state)); double inverse_doppler_factor = 1.0 / rpacket_doppler_factor (packet, storage); rpacket_set_nu (packet, comov_nu * inverse_doppler_factor); rpacket_set_energy (packet, comov_energy * inverse_doppler_factor); if (rpacket_get_virtual_packet_flag (packet) > 0) { montecarlo_one_packet (storage, packet, -2, mt_state); } } }
void move_packet_across_shell_boundary(rpacket_t *packet, storage_model_t *storage, double distance) { double comov_energy, doppler_factor, comov_nu, inverse_doppler_factor; move_packet(packet, storage, distance); if (rpacket_get_virtual_packet(packet) > 0) { double delta_tau_event = distance * storage->electron_densities[rpacket_get_current_shell_id(packet)] * storage->sigma_thomson; rpacket_set_tau_event(packet, rpacket_get_tau_event(packet) + delta_tau_event); } else { rpacket_reset_tau_event(packet); } if ((rpacket_get_current_shell_id(packet) < storage->no_of_shells - 1 && rpacket_get_next_shell_id(packet) == 1) || (rpacket_get_current_shell_id(packet) > 0 && rpacket_get_next_shell_id(packet) == -1)) { rpacket_set_current_shell_id(packet, rpacket_get_current_shell_id(packet) + rpacket_get_next_shell_id(packet)); rpacket_set_recently_crossed_boundary(packet, rpacket_get_next_shell_id(packet)); } else if (rpacket_get_next_shell_id(packet) == 1) { rpacket_set_status(packet, TARDIS_PACKET_STATUS_EMITTED); } else if ((storage->reflective_inner_boundary == 0) || (rk_double(&mt_state) > storage->inner_boundary_albedo)) { rpacket_set_status(packet, TARDIS_PACKET_STATUS_REABSORBED); } else { doppler_factor = rpacket_doppler_factor(packet, storage); comov_nu = rpacket_get_nu(packet) * doppler_factor; comov_energy = rpacket_get_energy(packet) * doppler_factor; rpacket_set_mu(packet, rk_double(&mt_state)); inverse_doppler_factor = 1.0 / rpacket_doppler_factor(packet, storage); rpacket_set_nu(packet, comov_nu * inverse_doppler_factor); rpacket_set_energy(packet, comov_energy * inverse_doppler_factor); rpacket_set_recently_crossed_boundary(packet, 1); if (rpacket_get_virtual_packet_flag(packet) > 0) { montecarlo_one_packet(storage, packet, -2); } } }
void montecarlo_thomson_scatter(rpacket_t *packet, storage_model_t *storage, double distance) { double comov_energy, doppler_factor, comov_nu, inverse_doppler_factor; doppler_factor = move_packet(packet, storage, distance); comov_nu = rpacket_get_nu(packet) * doppler_factor; comov_energy = rpacket_get_energy(packet) * doppler_factor; rpacket_set_mu(packet, 2.0 * rk_double(&mt_state) - 1.0); inverse_doppler_factor = 1.0 / rpacket_doppler_factor(packet, storage); rpacket_set_nu(packet, comov_nu * inverse_doppler_factor); rpacket_set_energy(packet, comov_energy * inverse_doppler_factor); rpacket_reset_tau_event(packet); rpacket_set_recently_crossed_boundary(packet, 0); storage->last_interaction_type[storage->current_packet_id] = 1; if (rpacket_get_virtual_packet_flag(packet) > 0) { montecarlo_one_packet(storage, packet, 1); } }
void montecarlo_thomson_scatter (rpacket_t * packet, storage_model_t * storage, double distance, rk_state *mt_state) { move_packet (packet, storage, distance); double doppler_factor = rpacket_doppler_factor (packet, storage); double comov_nu = rpacket_get_nu (packet) * doppler_factor; double comov_energy = rpacket_get_energy (packet) * doppler_factor; rpacket_set_mu (packet, 2.0 * rk_double (mt_state) - 1.0); double inverse_doppler_factor = 1.0 / rpacket_doppler_factor (packet, storage); rpacket_set_nu (packet, comov_nu * inverse_doppler_factor); rpacket_set_energy (packet, comov_energy * inverse_doppler_factor); rpacket_reset_tau_event (packet, mt_state); storage->last_interaction_type[rpacket_get_id (packet)] = 1; if (rpacket_get_virtual_packet_flag (packet) > 0) { montecarlo_one_packet (storage, packet, 1, mt_state); } }
double test_increment_j_blue_estimator(void){ rpacket_t rp; storage_model_t sm; init_rpacket(&rp); init_storage_model(&sm); int64_t j_blue_idx = 0; double D_BOUNDARY = compute_distance2boundary(&rp, &sm); rpacket_set_d_boundary(&rp, D_BOUNDARY); double D_LINE; // FIXME MR: return status of compute_distance2line() is ignored compute_distance2line(&rp, &sm, &D_LINE); rpacket_set_d_line(&rp, D_LINE); move_packet(&rp, &sm, 1e13); double d_line = rpacket_get_d_line(&rp); increment_j_blue_estimator(&rp, &sm, d_line, j_blue_idx); double res = sm.line_lists_j_blues[j_blue_idx]; dealloc_storage_model(&sm); return res; }
void montecarlo_line_scatter (rpacket_t * packet, storage_model_t * storage, double distance, rk_state *mt_state) { uint64_t next_line_id = rpacket_get_next_line_id (packet); uint64_t line2d_idx = next_line_id + storage->no_of_lines * rpacket_get_current_shell_id (packet); if (rpacket_get_virtual_packet (packet) == 0) { increment_j_blue_estimator (packet, storage, distance, line2d_idx); increment_Edotlu_estimator (packet, storage, line2d_idx); } double tau_line = storage->line_lists_tau_sobolevs[line2d_idx]; double tau_continuum = rpacket_get_chi_continuum(packet) * distance; double tau_combined = tau_line + tau_continuum; //rpacket_set_next_line_id (packet, rpacket_get_next_line_id (packet) + 1); if (next_line_id + 1 == storage->no_of_lines) { rpacket_set_last_line (packet, true); } if (rpacket_get_virtual_packet (packet) > 0) { rpacket_set_tau_event (packet, rpacket_get_tau_event (packet) + tau_line); rpacket_set_next_line_id (packet, next_line_id + 1); } else if (rpacket_get_tau_event (packet) < tau_combined) { move_packet (packet, storage, distance); double old_doppler_factor = rpacket_doppler_factor (packet, storage); rpacket_set_mu (packet, 2.0 * rk_double (mt_state) - 1.0); double inverse_doppler_factor = 1.0 / rpacket_doppler_factor (packet, storage); double comov_energy = rpacket_get_energy (packet) * old_doppler_factor; rpacket_set_energy (packet, comov_energy * inverse_doppler_factor); storage->last_interaction_in_nu[rpacket_get_id (packet)] = rpacket_get_nu (packet); storage->last_line_interaction_in_id[rpacket_get_id (packet)] = next_line_id; storage->last_line_interaction_shell_id[rpacket_get_id (packet)] = rpacket_get_current_shell_id (packet); storage->last_interaction_type[rpacket_get_id (packet)] = 2; int64_t emission_line_id = 0; if (storage->line_interaction_id == 0) { emission_line_id = next_line_id; } else if (storage->line_interaction_id >= 1) { emission_line_id = macro_atom (packet, storage, mt_state); } storage->last_line_interaction_out_id[rpacket_get_id (packet)] = emission_line_id; rpacket_set_nu (packet, storage->line_list_nu[emission_line_id] * inverse_doppler_factor); rpacket_set_nu_line (packet, storage->line_list_nu[emission_line_id]); rpacket_set_next_line_id (packet, emission_line_id + 1); rpacket_reset_tau_event (packet, mt_state); if (rpacket_get_virtual_packet_flag (packet) > 0) { bool virtual_close_line = false; if (!rpacket_get_last_line (packet) && fabs (storage->line_list_nu[rpacket_get_next_line_id (packet)] - rpacket_get_nu_line (packet)) < (rpacket_get_nu_line (packet)* 1e-7)) { virtual_close_line = true; } // QUESTIONABLE!!! bool old_close_line = rpacket_get_close_line (packet); rpacket_set_close_line (packet, virtual_close_line); montecarlo_one_packet (storage, packet, 1, mt_state); rpacket_set_close_line (packet, old_close_line); virtual_close_line = false; } } else { rpacket_set_tau_event (packet, rpacket_get_tau_event (packet) - tau_line); rpacket_set_next_line_id (packet, next_line_id + 1); } if (!rpacket_get_last_line (packet) && fabs (storage->line_list_nu[rpacket_get_next_line_id (packet)] - rpacket_get_nu_line (packet)) < (rpacket_get_nu_line (packet)* 1e-7)) { rpacket_set_close_line (packet, true); } }
void montecarlo_line_scatter(rpacket_t *packet, storage_model_t *storage, double distance) { double comov_energy = 0.0; int64_t emission_line_id = 0; double old_doppler_factor = 0.0; double inverse_doppler_factor = 0.0; double tau_line = 0.0; double tau_electron = 0.0; double tau_combined = 0.0; bool virtual_close_line = false; int64_t j_blue_idx = -1; if (rpacket_get_virtual_packet(packet) == 0) { j_blue_idx = rpacket_get_current_shell_id(packet) * storage->line_lists_j_blues_nd + rpacket_get_next_line_id(packet); increment_j_blue_estimator(packet, storage, distance, j_blue_idx); } tau_line = storage->line_lists_tau_sobolevs[rpacket_get_current_shell_id(packet) * storage->line_lists_tau_sobolevs_nd + rpacket_get_next_line_id(packet)]; tau_electron = storage->sigma_thomson * storage->electron_densities[rpacket_get_current_shell_id(packet)] * distance; tau_combined = tau_line + tau_electron; rpacket_set_next_line_id(packet, rpacket_get_next_line_id(packet) + 1); if (rpacket_get_next_line_id(packet) == storage->no_of_lines) { rpacket_set_last_line(packet, true); } if (rpacket_get_virtual_packet(packet) > 0) { rpacket_set_tau_event(packet, rpacket_get_tau_event(packet) + tau_line); } else if (rpacket_get_tau_event(packet) < tau_combined) { old_doppler_factor = move_packet(packet, storage, distance); rpacket_set_mu(packet, 2.0 * rk_double(&mt_state) - 1.0); inverse_doppler_factor = 1.0 / rpacket_doppler_factor(packet, storage); comov_energy = rpacket_get_energy(packet) * old_doppler_factor; rpacket_set_energy(packet, comov_energy * inverse_doppler_factor); storage->last_line_interaction_in_id[storage->current_packet_id] = rpacket_get_next_line_id(packet) - 1; storage->last_line_interaction_shell_id[storage->current_packet_id] = rpacket_get_current_shell_id(packet); storage->last_interaction_type[storage->current_packet_id] = 2; if (storage->line_interaction_id == 0) { emission_line_id = rpacket_get_next_line_id(packet) - 1; } else if (storage->line_interaction_id >= 1) { emission_line_id = macro_atom(packet, storage); } storage->last_line_interaction_out_id[storage->current_packet_id] = emission_line_id; rpacket_set_nu(packet, storage->line_list_nu[emission_line_id] * inverse_doppler_factor); rpacket_set_nu_line(packet, storage->line_list_nu[emission_line_id]); rpacket_set_next_line_id(packet, emission_line_id + 1); rpacket_reset_tau_event(packet); rpacket_set_recently_crossed_boundary(packet, 0); if (rpacket_get_virtual_packet_flag(packet) > 0) { virtual_close_line = false; if (!rpacket_get_last_line(packet) && fabs(storage->line_list_nu[rpacket_get_next_line_id(packet)] - rpacket_get_nu_line(packet)) / rpacket_get_nu_line(packet) < 1e-7) { virtual_close_line = true; } // QUESTIONABLE!!! bool old_close_line = rpacket_get_close_line(packet); rpacket_set_close_line(packet, virtual_close_line); montecarlo_one_packet(storage, packet, 1); rpacket_set_close_line(packet, old_close_line); virtual_close_line = false; } } else { rpacket_set_tau_event(packet, rpacket_get_tau_event(packet) - tau_line); } if (!rpacket_get_last_line(packet) && fabs(storage->line_list_nu[rpacket_get_next_line_id(packet)] - rpacket_get_nu_line(packet)) / rpacket_get_nu_line(packet) < 1e-7) { rpacket_set_close_line(packet, true); } }