#include #include "../grapite/etics_interface.h" #include "../grapite/particle_manager.h" static grapite::Active_particles* particles_i; static grapite::Etics_interface* etics_interface; extern "C" void etics_external_init(const int n_total, const double length_scale) { particles_i = new grapite::Active_particles{n_total}; etics_interface = new grapite::Etics_interface{n_total}; etics::scf::SetLengthScale(length_scale); } extern "C" void etics_external_grav(const double* const A, const int n_act, double x_act[][3], double pot_act[], double a_act[][3]) { // Load coefficients std::span A_complex{reinterpret_cast(A), 1024}; std::copy(begin(A_complex), end(A_complex), etics_interface->A_h); // Calculate potentials and forces particles_i->ni_core = 0; particles_i->ni_total = n_act; for (int i = 0; i < n_act; i++) { grapite::Particle_ext p{}; p.m = 1; p.t = 0; p.pos = vec3(x_act[i][0], x_act[i][1], x_act[i][2]); particles_i->add_particle(i, &p); } particles_i->flush_memory(); etics_interface->calculate_gravity(particles_i, grapite::Selector::halo, 0, pot_act, reinterpret_cast(a_act)); }