#ifndef H_TABIPB_CLUSTERS_STRUCT_H #define H_TABIPB_CLUSTERS_STRUCT_H #include #include "timer.h" #include "particles.h" #include "tree.h" #include "params.h" struct Timers_Clusters; class Clusters { private: const class Particles& particles_; const class Tree& tree_; const struct Params& params_; struct Timers_Clusters& timers_; int num_interp_pts_per_node_; int num_charges_per_node_; std::size_t num_interp_pts_; std::size_t num_charges_; std::vector interp_x_; std::vector interp_y_; std::vector interp_z_; std::vector interp_charge_; std::vector interp_charge_dx_; std::vector interp_charge_dy_; std::vector interp_charge_dz_; std::vector interp_potential_; std::vector interp_potential_dx_; std::vector interp_potential_dy_; std::vector interp_potential_dz_; public: Clusters(const class Particles&, const class Tree&, const struct Params&, struct Timers_Clusters&); ~Clusters() = default; void upward_pass(); void downward_pass(double* potential); void clear_charges(); void clear_potentials(); std::size_t num_interp_pts_per_node() const { return num_interp_pts_per_node_; }; std::size_t num_charges_per_node() const { return num_charges_per_node_; }; const std::array cluster_interp_pts_idxs(std::size_t node_idx) const; const std::array cluster_charges_idxs(std::size_t node_idx) const; const double* interp_x_ptr() const { return interp_x_.data(); }; const double* interp_y_ptr() const { return interp_y_.data(); }; const double* interp_z_ptr() const { return interp_z_.data(); }; const double* interp_charge_ptr() const { return interp_charge_.data(); }; const double* interp_charge_dx_ptr() const { return interp_charge_dx_.data(); }; const double* interp_charge_dy_ptr() const { return interp_charge_dy_.data(); }; const double* interp_charge_dz_ptr() const { return interp_charge_dz_.data(); }; double* interp_potential_ptr() { return interp_potential_.data(); }; double* interp_potential_dx_ptr() { return interp_potential_dx_.data(); }; double* interp_potential_dy_ptr() { return interp_potential_dy_.data(); }; double* interp_potential_dz_ptr() { return interp_potential_dz_.data(); }; void compute_all_interp_pts(); void copyin_to_device() const; void delete_from_device() const; }; struct Timers_Clusters { Timer ctor; Timer upward_pass; Timer downward_pass; Timer clear_charges; Timer clear_potentials; Timer compute_all_interp_pts; Timer copyin_to_device; Timer delete_from_device; void print() const; std::string get_durations() const; std::string get_headers() const; Timers_Clusters() = default; ~Timers_Clusters() = default; }; #endif /* H_TABIPB_CLUSTERS_STRUCT_H */