void compute_distance2boundary (rpacket_t * packet, const storage_model_t * storage) { double r = rpacket_get_r (packet); double mu = rpacket_get_mu (packet); double r_outer = storage->r_outer[rpacket_get_current_shell_id (packet)]; double r_inner = storage->r_inner[rpacket_get_current_shell_id (packet)]; double check, distance; if (mu > 0.0) { // direction outward rpacket_set_next_shell_id (packet, 1); distance = sqrt (r_outer * r_outer + ((mu * mu - 1.0) * r * r)) - (r * mu); } else { // going inward if ( (check = r_inner * r_inner + (r * r * (mu * mu - 1.0)) )>= 0.0) { // hit inner boundary rpacket_set_next_shell_id (packet, -1); distance = - r * mu - sqrt (check); } else { // miss inner boundary rpacket_set_next_shell_id (packet, 1); distance = sqrt (r_outer * r_outer + ((mu * mu - 1.0) * r * r)) - (r * mu); } } rpacket_set_d_boundary (packet, distance); }
/* initialise RPacket */ static void init_rpacket(rpacket_t *rp){ double MU = 0.3; double R = 7.5e14; double ENERGY = 0.9; int NEXT_LINE_ID = 1; double NU = 0.4; double NU_LINE = 0.2; int CURRENT_SHELL_ID = 0; double TAU_EVENT = 2.9e13; rpacket_set_current_shell_id(rp, CURRENT_SHELL_ID); rpacket_set_next_shell_id(rp, CURRENT_SHELL_ID+1); rpacket_set_mu(rp, MU); rpacket_set_nu(rp, NU); rpacket_set_r(rp, R); rpacket_set_last_line(rp, false); rpacket_set_recently_crossed_boundary(rp, 1); rpacket_set_close_line(rp, false); rpacket_set_nu_line(rp, NU_LINE); rpacket_set_next_line_id(rp, NEXT_LINE_ID); rpacket_set_tau_event(rp, TAU_EVENT); rpacket_set_virtual_packet(rp, 0); rpacket_set_energy(rp, ENERGY); rpacket_set_virtual_packet_flag(rp, true); rpacket_set_status(rp, TARDIS_PACKET_STATUS_IN_PROCESS); rpacket_set_id(rp, 0); rpacket_set_current_continuum_id(rp, 1); }
inline double compute_distance2boundary(rpacket_t *packet, storage_model_t *storage) { double r = rpacket_get_r(packet); double mu = rpacket_get_mu(packet); double r_outer = storage->r_outer[rpacket_get_current_shell_id(packet)]; double r_inner = storage->r_inner[rpacket_get_current_shell_id(packet)]; double d_outer = sqrt(r_outer * r_outer + ((mu * mu - 1.0) * r * r)) - (r * mu); double d_inner; double result; if (rpacket_get_recently_crossed_boundary(packet) == 1) { rpacket_set_next_shell_id(packet, 1); return d_outer; } else { double check = r_inner * r_inner + (r * r * (mu * mu - 1.0)); if (check < 0.0) { rpacket_set_next_shell_id(packet, 1); return d_outer; } else { d_inner = mu < 0.0 ? -r * mu - sqrt(check) : MISS_DISTANCE; } } if (d_inner < d_outer) { rpacket_set_next_shell_id(packet, -1); return d_inner; } else { rpacket_set_next_shell_id(packet, 1); return d_outer; } }
bool test_rpacket_get_next_shell_id(int value) { rpacket_t rp; rpacket_set_next_shell_id(&rp, value); return value==rpacket_get_next_shell_id(&rp); }