#ifndef _MAIN_H
#define _MAIN_H
#define REB_API
#if defined(_WIN64) || defined(_LP64)
#define REB_PAD(s)
#else
#define REB_PAD_CONCAT(a, b) a ## b
#define REB_PAD_EVAL(a, b) REB_PAD_CONCAT(a, b)
#define REB_PAD(s) char REB_PAD_EVAL(_pad_, __LINE__)[s];
#endif
#if defined(_MSC_VER)
#define REB_RESTRICT __restrict
#pragma comment(lib, "legacy_stdio_definitions.lib")
#elif defined(__GNUC__) || defined(__clang__)
#define REB_RESTRICT __restrict__
#else
#define REB_RESTRICT restrict
#endif
#ifdef _WIN32
#undef REB_API
#define _USE_MATH_DEFINES
#ifdef BUILDINGLIBREBOUND
#define REB_API __declspec(dllexport)
#else
#define REB_API __declspec(dllimport)
#endif
#endif
#include <stdlib.h>
#include <stdint.h>
#include <stddef.h>
#define REB_STRING_SIZE_MAX 256
#define REB_AS_ENUM_MEMBER(prefix, value, name) prefix ## _ ## name = value,
#define REB_GENERATE_ENUM(LIST) LIST(REB_AS_ENUM_MEMBER,LIST)
struct reb_simulationarchive; struct reb_server_data; struct reb_treecell; struct reb_display_data; struct reb_particle_int; struct reb_name_hash_item; struct reb_simulation; struct reb_display_settings; struct reb_variational_configuration; struct reb_ode;
struct reb_particle {
double x; double y;
double z;
double vx;
double vy;
double vz;
double ax;
double ay;
double az;
double m; double r; const char* name; REB_PAD(4)
void* ap; REB_PAD(4)
struct reb_simulation* sim; REB_PAD(4)
};
enum REB_BINARYDATA_DTYPE {
REB_FIELD_NOT_FOUND = 0, REB_DOUBLE = 1,
REB_INT = 2,
REB_UINT = 3, REB_UINT32 = 4,
REB_INT64 = 5,
REB_UINT64 = 6,
REB_SIZE_T = 7,
REB_VEC3D = 8,
REB_PARTICLE = 9,
REB_POINTER = 10,
REB_POINTER_ALIGNED = 11, REB_OTHER = 12, REB_CHARP_LIST = 13, REB_FUNCTIONPOINTER = 14, REB_STRING = 20, };
struct reb_vec3d {
double x;
double y;
double z;
};
struct reb_vec6d{
double x;
double y;
double z;
double vx;
double vy;
double vz;
};
struct reb_collision{
size_t p1; size_t p2; struct reb_vec6d gb; size_t ri; };
struct reb_binarydata_enum_descriptor{
int value;
char name[REB_STRING_SIZE_MAX];
};
struct reb_binarydata_field_descriptor {
char* documentation; enum REB_BINARYDATA_DTYPE dtype; char name[REB_STRING_SIZE_MAX]; size_t offset; size_t offset_N; size_t element_size; struct reb_binarydata_enum_descriptor* enum_descriptor; };
struct reb_integrator {
char* documentation; void (*step)(struct reb_simulation* r, void* p); void (*synchronize)(struct reb_simulation* r, void* p); void* (*create)(); void (*free)(void* p); void (*did_add_particle)(struct reb_simulation* r); void (*will_remove_particle)(struct reb_simulation* r, size_t index); const struct reb_binarydata_field_descriptor* field_descriptor_list; };
struct reb_integrator_configuration {
const char* name;
struct reb_integrator callbacks;
void* state;
};
#include "integrator_ias15.h"
#include "integrator_whfast.h"
#include "integrator_sei.h"
#include "integrator_leapfrog.h"
#include "integrator_janus.h"
#include "integrator_mercurius.h"
#include "integrator_saba.h"
#include "integrator_eos.h"
#include "integrator_bs.h"
#include "integrator_whfast512.h"
#include "integrator_trace.h"
extern const struct reb_integrator reb_integrator_none;
#define REB_BUILTIN_INTEGRATORS X(ias15) X(whfast) X(sei) X(leapfrog) X(janus) X(mercurius) X(saba) X(eos) X(bs) X(whfast512) X(trace) X(none)
enum REB_COLLISION_RESOLVE_OUTCOME {
REB_COLLISION_RESOLVE_OUTCOME_REMOVE_NONE = 0,
REB_COLLISION_RESOLVE_OUTCOME_REMOVE_P1 = 1,
REB_COLLISION_RESOLVE_OUTCOME_REMOVE_P2 = 2,
REB_COLLISION_RESOLVE_OUTCOME_REMOVE_BOTH = 3,
};
enum REB_STATUS {
REB_STATUS_SINGLE_STEP = -10, REB_STATUS_SCREENSHOT_READY=-5, REB_STATUS_SCREENSHOT = -4, REB_STATUS_PAUSED = -3, REB_STATUS_LAST_STEP = -2, REB_STATUS_RUNNING = -1, REB_STATUS_SUCCESS = 0, REB_STATUS_GENERIC_ERROR = 1, REB_STATUS_NO_PARTICLES = 2, REB_STATUS_ENCOUNTER = 3, REB_STATUS_ESCAPE = 4, REB_STATUS_USER = 5, REB_STATUS_SIGINT = 6, REB_STATUS_COLLISION = 7, };
struct reb_simulation {
double t; double G; double softening; double OMEGA; double OMEGAZ; double dt; double dt_last_done; uint64_t steps_done; unsigned int is_synchronized; unsigned int did_modify_particles;
size_t N; size_t N_allocated; struct reb_particle* particles;
size_t N_map; size_t* map;
size_t N_var; struct reb_particle* particles_var;
size_t N_var_config;
struct reb_variational_configuration* var_config;
size_t N_active; int testparticle_type; int testparticle_hidewarnings;
char** name_list; size_t N_name_list; struct reb_name_hash_item* name_hash_table; struct reb_vec3d* gravity_cs;
size_t N_allocated_gravity_cs;
struct reb_treecell** tree_root; double opening_angle2; enum REB_STATUS status; int exact_finish_time;
int force_is_velocity_dependent; enum {
REB_GRAVITY_IGNORE_TERMS_NONE = 0, REB_GRAVITY_IGNORE_TERMS_BETWEEN_0_AND_1 = 1, REB_GRAVITY_IGNORE_TERMS_INVOLVING_0 = 2, } gravity_ignore_terms; double output_timing_last;
int save_messages; char** messages;
int messages_var_rescale_warning;
int messages_timestep_warning;
double exit_max_distance; double exit_min_distance; double usleep; struct reb_display_settings* display_settings; struct reb_display_data* display_data; struct reb_server_data* server_data; int track_energy_offset; double energy_offset; double walltime; double walltime_last_step; double walltime_last_steps; double walltime_last_steps_sum;
int walltime_last_steps_N;
uint32_t python_unit_l; uint32_t python_unit_m; uint32_t python_unit_t;
double root_size; size_t N_root_x; size_t N_root_y;
size_t N_root_z;
int N_ghost_x; int N_ghost_y;
int N_ghost_z;
#ifdef MPI
int mpi_id; int mpi_num; struct reb_particle** particles_send; int* N_particles_send; int* N_particles_send_max; struct reb_particle** particles_recv; int* N_particles_recv; int* N_particles_recv_max;
struct reb_treecell** tree_essential_send; int* N_tree_essential_send; int* N_tree_essential_send_max; struct reb_treecell** tree_essential_recv; int* N_tree_essential_recv; int* N_tree_essential_recv_max; #endif
struct reb_collision* collisions; size_t N_allocated_collisions;
size_t N_collisions; size_t N_targets; double minimum_collision_velocity; double collisions_plog; int64_t collisions_log_n;
int calculate_megno; double megno_Ys; double megno_Yss; double megno_cov_Yt; double megno_var_t; double megno_mean_t; double megno_mean_Y; double megno_initial_t; int64_t megno_n;
unsigned int rand_seed;
int simulationarchive_version; double simulationarchive_auto_interval; double simulationarchive_auto_walltime; uint64_t simulationarchive_auto_step; double simulationarchive_next; uint64_t simulationarchive_next_step; char* simulationarchive_filename;
enum {
REB_COLLISION_NONE = 0, REB_COLLISION_DIRECT = 1, REB_COLLISION_TREE = 2, REB_COLLISION_LINE = 4, REB_COLLISION_LINETREE = 5, } collision;
struct reb_integrator_configuration integrator;
enum {
REB_BOUNDARY_NONE = 0, REB_BOUNDARY_OPEN = 1, REB_BOUNDARY_PERIODIC = 2, REB_BOUNDARY_SHEAR = 3, } boundary;
enum {
REB_GRAVITY_NONE = 0, REB_GRAVITY_BASIC = 1, REB_GRAVITY_COMPENSATED = 2, REB_GRAVITY_TREE = 3, REB_GRAVITY_JACOBI = 5, REB_GRAVITY_CUSTOM = 7, } gravity;
void (*gravity_custom) (struct reb_simulation* const r);
struct reb_ode** odes; size_t N_odes; size_t N_allocated_odes;
void (*additional_forces) (struct reb_simulation* const r); void (*pre_timestep_modifications) (struct reb_simulation* const r); void (*post_timestep_modifications) (struct reb_simulation* const r); void (*heartbeat) (struct reb_simulation* r); int (*key_callback) (struct reb_simulation* r, int key); double (*coefficient_of_restitution) (const struct reb_simulation* const r, double v); enum REB_COLLISION_RESOLVE_OUTCOME (*collision_resolve) (struct reb_simulation* const r, struct reb_collision); void (*free_particle_ap) (struct reb_particle* p); void (*extras_cleanup) (struct reb_simulation* r); void* extras; };
REB_API struct reb_simulation* reb_simulation_create(void);
REB_API struct reb_simulation* reb_simulation_create_from_file(char* filename, int64_t snapshot);
REB_API struct reb_simulation* reb_simulation_create_from_simulationarchive(struct reb_simulationarchive* sa, int64_t snapshot);
REB_API void reb_simulation_free(struct reb_simulation* const r);
REB_API struct reb_simulation* reb_simulation_copy(struct reb_simulation* r);
REB_API int reb_simulation_diff(struct reb_simulation* r1, struct reb_simulation* r2, int output_option);
REB_API int reb_simulation_start_server(struct reb_simulation* r, int port);
REB_API void reb_simulation_stop_server(struct reb_simulation* r);
REB_API void* reb_simulation_set_integrator(struct reb_simulation* r, const char* name);
REB_API void reb_integrator_register(const struct reb_integrator integrator, const char* name);
REB_API void reb_exit(const char* const msg);
REB_API void reb_simulation_stop(struct reb_simulation* const r);
REB_API void reb_simulation_info(struct reb_simulation* const r, const char* const msg);
REB_API void reb_simulation_warning(struct reb_simulation* const r, const char* const msg);
REB_API void reb_simulation_error(struct reb_simulation* const r, const char* const msg);
REB_API void reb_simulation_save_to_file(struct reb_simulation* r, const char* filename);
REB_API void reb_simulation_save_to_file_interval(struct reb_simulation* const r, const char* filename, double interval);
REB_API void reb_simulation_save_to_file_walltime(struct reb_simulation* const r, const char* filename, double walltime);
REB_API void reb_simulation_save_to_file_step(struct reb_simulation* const r, const char* filename, uint64_t step);
REB_API void reb_simulation_output_timing(struct reb_simulation* r, const double tmax);
REB_API void reb_simulation_output_orbits(struct reb_simulation* r, char* filename);
REB_API void reb_simulation_output_ascii(struct reb_simulation* r, char* filename);
REB_API void reb_simulation_output_velocity_dispersion(struct reb_simulation* r, char* filename);
REB_API int reb_simulation_output_check(struct reb_simulation* r, double interval);
REB_API int reb_simulation_output_screenshot(struct reb_simulation* r, const char* filename);
REB_API void reb_simulation_steps(struct reb_simulation* const r, size_t N_steps);
REB_API enum REB_STATUS reb_simulation_integrate(struct reb_simulation* const r, double tmax);
REB_API void reb_simulation_synchronize(struct reb_simulation* r);
REB_API void reb_simulation_move_to_hel(struct reb_simulation* const r);
REB_API void reb_simulation_move_to_com(struct reb_simulation* const r);
REB_API void reb_simulation_imul(struct reb_simulation* r, double scalar_pos, double scalar_vel);
REB_API int reb_simulation_iadd(struct reb_simulation* r, struct reb_simulation* r2);
REB_API int reb_simulation_isub(struct reb_simulation* r, struct reb_simulation* r2);
REB_API void reb_simulation_update_acceleration(struct reb_simulation* r);
REB_API double reb_simulation_energy(struct reb_simulation* const r);
REB_API struct reb_vec3d reb_simulation_angular_momentum(const struct reb_simulation* const r);
REB_API struct reb_particle reb_simulation_com(struct reb_simulation* r);
REB_API struct reb_particle reb_particle_com_of_pair(struct reb_particle p1, struct reb_particle p2);
REB_API struct reb_particle reb_simulation_com_range(struct reb_simulation* r, size_t first, size_t last);
REB_API void reb_simulation_add(struct reb_simulation* const r, struct reb_particle pt);
REB_API void reb_simulation_add_fmt(struct reb_simulation* r, const char* fmt, ...);
REB_API void reb_simulation_add_plummer(struct reb_simulation* r, size_t _N, double M, double R);
REB_API struct reb_particle reb_particle_from_orbit_err(double G, struct reb_particle primary, double m, double a, double e, double i, double Omega, double omega, double f, int* err);
REB_API struct reb_particle reb_particle_from_orbit(double G, struct reb_particle primary, double m, double a, double e, double i, double Omega, double omega, double f);
REB_API struct reb_particle reb_particle_from_pal(double G, struct reb_particle primary, double m, double a, double lambda, double k, double h, double ix, double iy);
REB_API struct reb_particle reb_particle_nan(void);
REB_API void reb_simulation_remove_all_particles(struct reb_simulation* const r);
REB_API int reb_simulation_remove_particle(struct reb_simulation* const r, size_t index);
REB_API int reb_simulation_remove_particle_by_name(struct reb_simulation* r, const char* const name);
REB_API int reb_simulation_particle_index(struct reb_particle* p);
REB_API int reb_simulation_particle_var_index(struct reb_particle* p);
REB_API void reb_particle_isub(struct reb_particle* p1, struct reb_particle* p2);
REB_API void reb_particle_iadd(struct reb_particle* p1, struct reb_particle* p2);
REB_API void reb_particle_imul(struct reb_particle* p1, double value);
REB_API double reb_particle_distance(struct reb_particle* p1, struct reb_particle* p2);
REB_API int reb_particle_cmp(struct reb_particle p1, struct reb_particle p2);
REB_API void reb_particle_set_name(struct reb_particle* p, const char* const name);
REB_API const char* reb_simulation_register_name(struct reb_simulation* r, const char* const name);
REB_API struct reb_particle* reb_simulation_get_particle_by_name(struct reb_simulation* r, const char* const name);
#ifdef MPI
REB_API struct reb_particle reb_simulation_particle_by_id(struct reb_simulation* const r, size_t id);
#endif
REB_API void reb_simulation_init_megno(struct reb_simulation* const r);
REB_API void reb_simulation_init_megno_seed(struct reb_simulation* const r, unsigned int seed);
REB_API double reb_simulation_megno(struct reb_simulation* r);
REB_API double reb_simulation_lyapunov(struct reb_simulation* r);
REB_API enum REB_COLLISION_RESOLVE_OUTCOME reb_collision_resolve_halt(struct reb_simulation* const r, struct reb_collision c); REB_API enum REB_COLLISION_RESOLVE_OUTCOME reb_collision_resolve_hardsphere(struct reb_simulation* const r, struct reb_collision c);
REB_API enum REB_COLLISION_RESOLVE_OUTCOME reb_collision_resolve_merge(struct reb_simulation* const r, struct reb_collision c);
REB_API double reb_random_uniform(struct reb_simulation* r, double min, double max);
REB_API double reb_random_powerlaw(struct reb_simulation* r, double min, double max, double slope);
REB_API double reb_random_normal(struct reb_simulation* r, double variance);
REB_API double reb_random_rayleigh(struct reb_simulation* r, double sigma);
REB_API double reb_mod2pi(double f);
REB_API double reb_M_to_f(double e, double M);
REB_API double reb_E_to_f(double e, double M);
REB_API double reb_M_to_E(double e, double M);
REB_API uint32_t reb_hash(const char* c);
REB_API struct reb_simulationarchive* reb_simulationarchive_create_from_file(const char* filename);
REB_API void reb_simulationarchive_free(struct reb_simulationarchive* sa);
struct reb_orbit {
double d; double v; double h; double P; double n; double a; double e; double inc; double Omega; double omega; double pomega; double f; double M; double l; double theta; double T; double rhill; double pal_h; double pal_k; double pal_ix; double pal_iy; struct reb_vec3d hvec; struct reb_vec3d evec; };
REB_API struct reb_orbit reb_orbit_from_particle(double G, struct reb_particle p, struct reb_particle primary);
REB_API struct reb_orbit reb_orbit_from_particle_err(double G, struct reb_particle p, struct reb_particle primary, int* err);
struct reb_ode{
unsigned int length; double* y; unsigned int needs_nbody; void* ref; void (*derivatives)(struct reb_ode* const ode, double* const yDot, const double* const y, const double t); void (*getscale)(struct reb_ode* const ode, const double* const y0, const double* const y1); void (*pre_timestep)(struct reb_ode* const ode, const double* const y0); void (*post_timestep)(struct reb_ode* const ode, const double* const y0);
size_t N_allocated;
double* scale;
double* C; double** D; double* y1; double* y0Dot; double* yDot; double* yTmp; struct reb_simulation* r; };
REB_API struct reb_ode* reb_ode_create(struct reb_simulation* r, unsigned int length);
REB_API void reb_ode_free(struct reb_ode* ode);
struct reb_variational_configuration{
struct reb_simulation* sim; int order; int index; int testparticle; int index_1st_order_a; int index_1st_order_b; double lrescale; };
REB_API int reb_simulation_add_variation_1st_order(struct reb_simulation* const r, int testparticle);
REB_API int reb_simulation_add_variation_2nd_order(struct reb_simulation* const r, int testparticle, size_t index_1st_order_a, size_t index_1st_order_b);
REB_API void reb_simulation_rescale_var(struct reb_simulation* const r);
REB_API struct reb_particle reb_particle_derivative_lambda(double G, struct reb_particle primary, struct reb_particle po);
REB_API struct reb_particle reb_particle_derivative_h(double G, struct reb_particle primary, struct reb_particle po);
REB_API struct reb_particle reb_particle_derivative_k(double G, struct reb_particle primary, struct reb_particle po);
REB_API struct reb_particle reb_particle_derivative_k_k(double G, struct reb_particle primary, struct reb_particle po);
REB_API struct reb_particle reb_particle_derivative_h_h(double G, struct reb_particle primary, struct reb_particle po);
REB_API struct reb_particle reb_particle_derivative_lambda_lambda(double G, struct reb_particle primary, struct reb_particle po);
REB_API struct reb_particle reb_particle_derivative_k_lambda(double G, struct reb_particle primary, struct reb_particle po);
REB_API struct reb_particle reb_particle_derivative_h_lambda(double G, struct reb_particle primary, struct reb_particle po);
REB_API struct reb_particle reb_particle_derivative_k_h(double G, struct reb_particle primary, struct reb_particle po);
REB_API struct reb_particle reb_particle_derivative_a(double G, struct reb_particle primary, struct reb_particle po);
REB_API struct reb_particle reb_particle_derivative_a_a(double G, struct reb_particle primary, struct reb_particle po);
REB_API struct reb_particle reb_particle_derivative_ix(double G, struct reb_particle primary, struct reb_particle po);
REB_API struct reb_particle reb_particle_derivative_ix_ix(double G, struct reb_particle primary, struct reb_particle po);
REB_API struct reb_particle reb_particle_derivative_iy(double G, struct reb_particle primary, struct reb_particle po);
REB_API struct reb_particle reb_particle_derivative_iy_iy(double G, struct reb_particle primary, struct reb_particle po);
REB_API struct reb_particle reb_particle_derivative_k_ix(double G, struct reb_particle primary, struct reb_particle po);
REB_API struct reb_particle reb_particle_derivative_h_ix(double G, struct reb_particle primary, struct reb_particle po);
REB_API struct reb_particle reb_particle_derivative_lambda_ix(double G, struct reb_particle primary, struct reb_particle po);
REB_API struct reb_particle reb_particle_derivative_lambda_iy(double G, struct reb_particle primary, struct reb_particle po);
REB_API struct reb_particle reb_particle_derivative_h_iy(double G, struct reb_particle primary, struct reb_particle po);
REB_API struct reb_particle reb_particle_derivative_k_iy(double G, struct reb_particle primary, struct reb_particle po);
REB_API struct reb_particle reb_particle_derivative_ix_iy(double G, struct reb_particle primary, struct reb_particle po);
REB_API struct reb_particle reb_particle_derivative_a_ix(double G, struct reb_particle primary, struct reb_particle po);
REB_API struct reb_particle reb_particle_derivative_a_iy(double G, struct reb_particle primary, struct reb_particle po);
REB_API struct reb_particle reb_particle_derivative_a_lambda(double G, struct reb_particle primary, struct reb_particle po);
REB_API struct reb_particle reb_particle_derivative_a_h(double G, struct reb_particle primary, struct reb_particle po);
REB_API struct reb_particle reb_particle_derivative_a_k(double G, struct reb_particle primary, struct reb_particle po);
REB_API struct reb_particle reb_particle_derivative_m(double G, struct reb_particle primary, struct reb_particle po);
REB_API struct reb_particle reb_particle_derivative_m_a(double G, struct reb_particle primary, struct reb_particle po);
REB_API struct reb_particle reb_particle_derivative_m_lambda(double G, struct reb_particle primary, struct reb_particle po);
REB_API struct reb_particle reb_particle_derivative_m_h(double G, struct reb_particle primary, struct reb_particle po);
REB_API struct reb_particle reb_particle_derivative_m_k(double G, struct reb_particle primary, struct reb_particle po);
REB_API struct reb_particle reb_particle_derivative_m_ix(double G, struct reb_particle primary, struct reb_particle po);
REB_API struct reb_particle reb_particle_derivative_m_iy(double G, struct reb_particle primary, struct reb_particle po);
REB_API struct reb_particle reb_particle_derivative_m_m(double G, struct reb_particle primary, struct reb_particle po);
REB_API struct reb_particle reb_particle_derivative_e(double G, struct reb_particle primary, struct reb_particle po);
REB_API struct reb_particle reb_particle_derivative_e_e(double G, struct reb_particle primary, struct reb_particle po);
REB_API struct reb_particle reb_particle_derivative_inc(double G, struct reb_particle primary, struct reb_particle po);
REB_API struct reb_particle reb_particle_derivative_inc_inc(double G, struct reb_particle primary, struct reb_particle po);
REB_API struct reb_particle reb_particle_derivative_Omega(double G, struct reb_particle primary, struct reb_particle po);
REB_API struct reb_particle reb_particle_derivative_Omega_Omega(double G, struct reb_particle primary, struct reb_particle po);
REB_API struct reb_particle reb_particle_derivative_omega(double G, struct reb_particle primary, struct reb_particle po);
REB_API struct reb_particle reb_particle_derivative_omega_omega(double G, struct reb_particle primary, struct reb_particle po);
REB_API struct reb_particle reb_particle_derivative_f(double G, struct reb_particle primary, struct reb_particle po);
REB_API struct reb_particle reb_particle_derivative_f_f(double G, struct reb_particle primary, struct reb_particle po);
REB_API struct reb_particle reb_particle_derivative_a_e(double G, struct reb_particle primary, struct reb_particle po);
REB_API struct reb_particle reb_particle_derivative_a_inc(double G, struct reb_particle primary, struct reb_particle po);
REB_API struct reb_particle reb_particle_derivative_a_Omega(double G, struct reb_particle primary, struct reb_particle po);
REB_API struct reb_particle reb_particle_derivative_a_omega(double G, struct reb_particle primary, struct reb_particle po);
REB_API struct reb_particle reb_particle_derivative_a_f(double G, struct reb_particle primary, struct reb_particle po);
REB_API struct reb_particle reb_particle_derivative_e_inc(double G, struct reb_particle primary, struct reb_particle po);
REB_API struct reb_particle reb_particle_derivative_e_Omega(double G, struct reb_particle primary, struct reb_particle po);
REB_API struct reb_particle reb_particle_derivative_e_omega(double G, struct reb_particle primary, struct reb_particle po);
REB_API struct reb_particle reb_particle_derivative_e_f(double G, struct reb_particle primary, struct reb_particle po);
REB_API struct reb_particle reb_particle_derivative_m_e(double G, struct reb_particle primary, struct reb_particle po);
REB_API struct reb_particle reb_particle_derivative_inc_Omega(double G, struct reb_particle primary, struct reb_particle po);
REB_API struct reb_particle reb_particle_derivative_inc_omega(double G, struct reb_particle primary, struct reb_particle po);
REB_API struct reb_particle reb_particle_derivative_inc_f(double G, struct reb_particle primary, struct reb_particle po);
REB_API struct reb_particle reb_particle_derivative_m_inc(double G, struct reb_particle primary, struct reb_particle po);
REB_API struct reb_particle reb_particle_derivative_omega_Omega(double G, struct reb_particle primary, struct reb_particle po);
REB_API struct reb_particle reb_particle_derivative_Omega_f(double G, struct reb_particle primary, struct reb_particle po);
REB_API struct reb_particle reb_particle_derivative_m_Omega(double G, struct reb_particle primary, struct reb_particle po);
REB_API struct reb_particle reb_particle_derivative_omega_f(double G, struct reb_particle primary, struct reb_particle po);
REB_API struct reb_particle reb_particle_derivative_m_omega(double G, struct reb_particle primary, struct reb_particle po);
REB_API struct reb_particle reb_particle_derivative_m_f(double G, struct reb_particle primary, struct reb_particle po);
enum REB_FREQUENCY_ANALYSIS_TYPE {
REB_FREQUENCY_ANALYSIS_MFT = 0,
REB_FREQUENCY_ANALYSIS_FMFT = 1,
REB_FREQUENCY_ANALYSIS_FMFT2 = 2,
};
REB_API int reb_frequency_analysis(double *output, size_t nfreq, double minfreq, double maxfreq, enum REB_FREQUENCY_ANALYSIS_TYPE type, double *input, size_t ndata);
struct reb_rotation {
double ix;
double iy;
double iz;
double r;
};
REB_API struct reb_rotation reb_rotation_inverse(const struct reb_rotation q);
REB_API struct reb_rotation reb_rotation_mul(const struct reb_rotation p, const struct reb_rotation q);
REB_API struct reb_rotation reb_rotation_identity();
REB_API struct reb_rotation reb_rotation_normalize(const struct reb_rotation q);
REB_API struct reb_rotation reb_rotation_conjugate(const struct reb_rotation q);
REB_API struct reb_rotation reb_rotation_init_angle_axis(const double angle, struct reb_vec3d axis);
REB_API struct reb_rotation reb_rotation_init_from_to(struct reb_vec3d from, struct reb_vec3d to);
REB_API struct reb_rotation reb_rotation_init_orbit(const double Omega, const double inc, const double omega);
REB_API struct reb_rotation reb_rotation_init_to_new_axes(struct reb_vec3d newz, struct reb_vec3d newx);
REB_API struct reb_rotation reb_rotation_slerp(struct reb_rotation q1, struct reb_rotation q2, double t);
REB_API struct reb_vec3d reb_tools_spherical_to_xyz(const double mag, const double theta, const double phi);
REB_API void reb_tools_xyz_to_spherical(struct reb_vec3d const xyz, double* mag, double* theta, double* phi);
REB_API struct reb_vec3d reb_vec3d_mul(const struct reb_vec3d v, const double s);
REB_API struct reb_vec3d reb_vec3d_add(const struct reb_vec3d v, const struct reb_vec3d w);
REB_API double reb_vec3d_length_squared(const struct reb_vec3d v);
REB_API double reb_vec3d_dot(const struct reb_vec3d a, const struct reb_vec3d b);
REB_API struct reb_vec3d reb_vec3d_cross(const struct reb_vec3d a, const struct reb_vec3d b);
REB_API struct reb_vec3d reb_vec3d_normalize(const struct reb_vec3d v);
REB_API struct reb_vec3d reb_vec3d_rotate(struct reb_vec3d v, const struct reb_rotation q);
REB_API void reb_vec3d_irotate(struct reb_vec3d *v, const struct reb_rotation q);
REB_API void reb_particle_irotate(struct reb_particle* p, const struct reb_rotation q);
REB_API void reb_simulation_irotate(struct reb_simulation* const sim, const struct reb_rotation q);
REB_API void reb_rotation_to_orbital(struct reb_rotation q, double* Omega, double* inc, double* omega);
#ifdef MPI
void reb_mpi_init(struct reb_simulation* const r);
void reb_mpi_finalize(struct reb_simulation* const r);
#endif
struct reb_vec3df {
float x,y,z;
};
struct reb_mat4df {
float m[16];
};
struct reb_display_settings {
struct reb_mat4df view;
int spheres; int pause; int wire; unsigned int breadcrumbs; int onscreentext; int onscreenhelp; int multisample; int ghostboxes; size_t reference; };
REB_API void reb_simulation_add_display_settings(struct reb_simulation* r);
REB_API struct reb_mat4df reb_mat4df_identity();
REB_API struct reb_mat4df reb_mat4df_scale(struct reb_mat4df m, float x, float y, float z);
REB_API void reb_mat4df_print(struct reb_mat4df m);
REB_API int reb_mat4df_eq(struct reb_mat4df A, struct reb_mat4df B);
REB_API struct reb_vec3df reb_mat4df_get_scale(struct reb_mat4df m);
REB_API struct reb_mat4df reb_mat4df_translate(struct reb_mat4df m, float x, float y, float z);
REB_API struct reb_mat4df reb_mat4df_multiply(struct reb_mat4df A, struct reb_mat4df B);
REB_API struct reb_mat4df reb_rotation_to_mat4df(struct reb_rotation A);
REB_API struct reb_mat4df reb_mat4df_ortho(float l, float r, float b, float t, float n, float f);
#endif