mirror of
https://bitbucket.org/cosmicvoids/vide_public.git
synced 2025-07-05 07:41:11 +00:00
74 lines
2.7 KiB
C
74 lines
2.7 KiB
C
/* Functions defined in keycvt.c. This will go in the library, eventually */
|
|
|
|
#ifndef KeyUTiLsDOTh
|
|
#define KeyUTiLsDOTh
|
|
|
|
#include "key.h"
|
|
#define MAXNDIMKU 5
|
|
|
|
/* Use these as the 'order' argument in CellBBFromKey and GenerateKeys */
|
|
#define MORTON_ORDER 1
|
|
#define PH_ORDER 2
|
|
|
|
#ifdef __cplusplus
|
|
extern "C"{
|
|
#endif /* __cplusplus */
|
|
|
|
typedef struct {
|
|
int ndim;
|
|
/* Store rmin and the size. There are lots of choices. Some might
|
|
be better than others. This is one of them... */
|
|
float rmin[MAXNDIMKU];
|
|
float sz[MAXNDIMKU];
|
|
} tbbox; /* a tree-bbox, */
|
|
|
|
/* For now, we will break the OO secrecy rule and just let routines know
|
|
what's inside the tbbox. Otherwise I have to write a dozen functions
|
|
to extract and insert values...Ugh. */
|
|
/* CenterBbox is useful, nevertheless */
|
|
void CenterBbox(tbbox *bb, float *center);
|
|
|
|
/* This gives a tight bounding box around the list of positions. Note
|
|
that the result is rmin <= pos[i] and rmax >= pos[i]. The equality
|
|
can be a headache for float-to-int conversions! Consider using
|
|
InflateBbox and or CubeBbox! */
|
|
void TightBbox(float *pstart, int nobj, int pstride, int ndim, tbbox *bb);
|
|
|
|
/* Make the bbox a cube by expanding the smaller dimensions. */
|
|
void CubeBbox(tbbox *bb);
|
|
|
|
/* Increase the linear dimension by 'factor' on all sides */
|
|
void InflateBbox(tbbox *bb, float factor);
|
|
|
|
/* Return 1 if bb1 completely contains bb2 */
|
|
int ContainsBbox(tbbox *bb1, tbbox *bb2);
|
|
|
|
/* Construct bbu, the 'union' of bb1 and bb2 */
|
|
void UnionBbox(tbbox *bb1, tbbox *bb2, tbbox *bbu);
|
|
|
|
/* Generate keys for an array of positions (imagine sizeof(body) as the
|
|
stride argument!) */
|
|
void GenerateKeys(float *pstart, int nobj, int pstride, tbbox *bb, Key_t *kstart, int kstride, int ordering);
|
|
/* This will be set when GenerateKeys detects that a key is out of
|
|
bounds. GenerateKeys will not crash and burn, but prudent callers
|
|
will check KeyOutOfBounds after calling it. It is cumulative. */
|
|
extern int KeyOutOfBounds;
|
|
|
|
/* Replacement for CellCorner: you supply the bbox that describes the
|
|
Universe, and we return a bbox that describes the cell */
|
|
void CellBBFromKey(Key_t key, tbbox *bb, tbbox *cellbb, int ordering);
|
|
|
|
/* Some primitive building blocks. They can be combined with
|
|
KeyFromInts and IntsFromKey to do the full conversion... */
|
|
void IntsFromFloats(const float *x, unsigned int *ix, tbbox *bb, int nbits);
|
|
void FloatsFromInts(const int *ix, float *x, tbbox *bb, int nbits);
|
|
|
|
/* These two names conflict with physics_generic.c. Good. It will
|
|
keep me from using physics_generic.c accidentally. */
|
|
Key_t KeyFromInts(unsigned int *xp, int ndim, int nbits);
|
|
int IntsFromKey(Key_t key, unsigned int *ip, int ndim);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif /* __cplusplus */
|
|
#endif
|