示例#1
0
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;
}
示例#2
0
void
compute_distance2continuum(rpacket_t * packet, storage_model_t * storage)
{
  double chi_freefree, chi_electron, chi_continuum, d_continuum;

  if (storage->cont_status == CONTINUUM_ON)
    {
      calculate_chi_bf(packet, storage);
      double chi_boundfree = rpacket_get_chi_boundfree(packet);
      rpacket_set_chi_freefree(packet, 0.0);
      chi_freefree = rpacket_get_chi_freefree(packet); // MR ?? this is always zero
      chi_electron = storage->electron_densities[rpacket_get_current_shell_id(packet)] * storage->sigma_thomson *
        rpacket_doppler_factor (packet, storage);
      chi_continuum = chi_boundfree + chi_freefree + chi_electron;
      d_continuum = rpacket_get_tau_event(packet) / chi_continuum;
    }
  else
    {
      // FIXME MR: an assignment to chi_freefree seems to be missing here
      chi_electron = storage->electron_densities[rpacket_get_current_shell_id(packet)] * storage->sigma_thomson;
      chi_continuum = chi_electron;
      d_continuum = storage->inverse_electron_densities[rpacket_get_current_shell_id (packet)] *
        storage->inverse_sigma_thomson * rpacket_get_tau_event (packet);
    }

  if (rpacket_get_virtual_packet(packet) > 0)
    {
      //Set all continuum distances to MISS_DISTANCE in case of an virtual_packet
      rpacket_set_d_continuum(packet, MISS_DISTANCE);
      rpacket_set_chi_boundfree(packet, 0.0);
      rpacket_set_chi_electron(packet, chi_electron);
      rpacket_set_chi_freefree(packet, 0.0);
      rpacket_set_chi_continuum(packet, chi_continuum);
    }
  else
    {

      //        fprintf(stderr, "--------\n");
      //        fprintf(stderr, "nu = %e \n", rpacket_get_nu(packet));
      //        fprintf(stderr, "chi_electron = %e\n", chi_electron);
      //        fprintf(stderr, "chi_boundfree = %e\n", calculate_chi_bf(packet, storage));
      //        fprintf(stderr, "chi_line = %e \n", rpacket_get_tau_event(packet) / rpacket_get_d_line(packet));
      //        fprintf(stderr, "--------\n");

      rpacket_set_chi_freefree(packet, chi_freefree);
      rpacket_set_chi_electron(packet, chi_electron);
      rpacket_set_chi_continuum(packet, chi_continuum);
      rpacket_set_d_continuum(packet, d_continuum);
    }
}