Esempio n. 1
0
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());
    }
  }
}
Esempio n. 2
0
 /** \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';
  }
Esempio n. 3
0
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;
}