void calculate_chi_bf(rpacket_t * packet, storage_model_t * storage) { double doppler_factor = rpacket_doppler_factor (packet, storage); double comov_nu = rpacket_get_nu (packet) * doppler_factor; int64_t no_of_continuum_edges = storage->no_of_edges; int64_t current_continuum_id; line_search(storage->continuum_list_nu, comov_nu, no_of_continuum_edges, ¤t_continuum_id); rpacket_set_current_continuum_id(packet, current_continuum_id); int64_t shell_id = rpacket_get_current_shell_id(packet); double T = storage->t_electrons[shell_id]; double boltzmann_factor = exp(-(H * comov_nu) / (KB*T)); double bf_helper = 0; for(int64_t i = current_continuum_id; i < no_of_continuum_edges; i++) { // get the levelpopulation for the level ijk in the current shell: double l_pop = storage->l_pop[shell_id * no_of_continuum_edges + i]; // get the levelpopulation ratio \frac{n_{0,j+1,k}}{n_{i,j,k}} \frac{n_{i,j,k}}{n_{0,j+1,k}}^{*}: double l_pop_r = storage->l_pop_r[shell_id * no_of_continuum_edges + i]; bf_helper += l_pop * bf_cross_section(storage, i, comov_nu) * (1 - l_pop_r * boltzmann_factor); // FIXME MR: Is this thread-safe? It doesn't look like it to me ... storage->chi_bf_tmp_partial[i] = bf_helper; } rpacket_set_chi_boundfree(packet, bf_helper * doppler_factor); }
double test_bf_cross_section(void){ storage_model_t sm; init_storage_model(&sm); double CONV_MU = 0.4; double res = bf_cross_section(&sm, 1, CONV_MU); dealloc_storage_model(&sm); return res; }