void HistoryInteraction::build_coefficient_table() { Interpolation::UniformLagrangeSet lagrange(interp_order); for(int pair_idx = 0; pair_idx < num_interactions; ++pair_idx) { int src, obs; std::tie(src, obs) = idx2coord(pair_idx); Vec3d dr(separation((*dots)[src], (*dots)[obs])); std::pair<int, double> delay( split_double(dr.norm() / (config.c0 * config.dt))); floor_delays[pair_idx] = delay.first; lagrange.calculate_weights(delay.second, config.dt); std::vector<Eigen::Matrix3cd> interp_dyads( dyadic->coefficients(dr, lagrange)); for(int i = 0; i <= interp_order; ++i) { coefficients[pair_idx][i] = (*dots)[obs].dipole().dot(interp_dyads[i] * (*dots)[src].dipole()); } } }
/** \brief Shows the coordinates from an index. */ void showCoords (unsigned int idx) { std::array<unsigned int, ndims> coords; idx2coord(idx, coords); for (unsigned int i = 0; i < ndims; ++i) std::cout << coords[i] << "\t"; std::cout << '\n'; }
const Interaction::ResultArray &HistoryInteraction::evaluate(const int time_idx) { results.setZero(); for(int pair_idx = 0; pair_idx < num_interactions; ++pair_idx) { int src, obs; std::tie(src, obs) = idx2coord(pair_idx); const int s = time_idx - floor_delays[pair_idx]; for(int i = 0; i <= interp_order; ++i) { if(s - i < (*history).index_bases()[1]) continue; results[src] += (*dyadic).polarization_prefactor((*history)[obs][s - i][0]) * coefficients[pair_idx][i]; results[obs] += (*dyadic).polarization_prefactor((*history)[src][s - i][0]) * coefficients[pair_idx][i]; } } return results; }