70 lines
2.5 KiB
C
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
|