Files
GR-raytracing/src/spacetime.h
T

70 lines
2.5 KiB
C

#ifndef SPACETIME_H
#define SPACETIME_H
typedef struct {
double alpha;
double beta[3];
double gamma[3][3];
double K[3][3];
double d_alpha[3];
double d_beta[3][3]; /* d_beta[spatial derivative][component] */
double d_gamma[3][3][3]; /* d_gamma[spatial derivative][j][k] */
} MetricData;
typedef enum {
SPACETIME_RAY_ACTIVE,
SPACETIME_RAY_ESCAPED,
SPACETIME_RAY_CAPTURED
} SpacetimeRayStatus;
typedef struct SpacetimeSource SpacetimeSource;
typedef struct MetricSlab MetricSlab;
struct MetricSlab {
const SpacetimeSource *source;
double t_hi, t_lo;
void *context;
};
typedef struct {
int (*eval)(const SpacetimeSource *source, double t, const double x[3],
MetricData *metric);
SpacetimeRayStatus (*classify)(const SpacetimeSource *source, double t,
const double x[3]);
int (*load_slab)(const SpacetimeSource *source, double t_hi, double t_lo,
MetricSlab **out);
void (*free_slab)(MetricSlab *slab);
int (*eval_slab)(const MetricSlab *slab, double t, const double x[3],
MetricData *metric);
SpacetimeRayStatus (*classify_slab)(const MetricSlab *slab, double t,
const double x[3]);
void (*destroy)(SpacetimeSource *source);
} SpacetimeOps;
struct SpacetimeSource {
const SpacetimeOps *ops;
void *context;
};
/* The selected build provides spacetime_create_default(). Named constructors
* remain available to backend-specific tests and tools. */
int spacetime_create_default(SpacetimeSource *source);
int spacetime_create_minkowski(SpacetimeSource *source, double escape_radius);
int spacetime_create_schwarzschild_ks(SpacetimeSource *source, double mass,
double escape_radius,
double capture_radius);
void spacetime_destroy(SpacetimeSource *source);
int spacetime_eval(const SpacetimeSource *source, double t, const double x[3],
MetricData *metric);
SpacetimeRayStatus spacetime_classify(const SpacetimeSource *source, double t,
const double x[3]);
int spacetime_load_slab(const SpacetimeSource *source, double t_hi, double t_lo,
MetricSlab **out);
void spacetime_free_slab(MetricSlab *slab);
int spacetime_slab_eval(const MetricSlab *slab, double t, const double x[3],
MetricData *metric);
SpacetimeRayStatus spacetime_slab_classify(const MetricSlab *slab, double t,
const double x[3]);
#endif