#ifndef __GMTMIRRORS_H_
#define __GMTMIRRORS_H_
#ifndef __RAYTRACING_H__
#include "rayTracing.h"
#endif
#ifndef __SOURCE_H__
#include "source.h"
#endif
__device__ rtd bending_modes_surface(vector *v, const int N_mode, rtd *b,
double *BM,
const int BM_N_SAMPLE, const double BM_radius);
__device__ rtd partial_x_bending_modes_surface(vector *v, const int N_mode, rtd *b,
double *BM,
const int BM_N_SAMPLE, const double BM_radius);
__device__ rtd partial_y_bending_modes_surface(vector *v, const int N_mode, rtd *b,
double *BM,
const int BM_N_SAMPLE, const double BM_radius);
__device__ rtd partial_z_bending_modes_surface(void);
struct bending_modes {
double *d__x_BM, *d__y_BM;
double *d__BM;
double *d__BMS;
double BM_radius;
int BM_N_SAMPLE;
double *d__BM_buffer;
int n_mode;
rtd *b, *d__b;
int N;
void setup(int n_mode);
void setup(int n_mode, int N_SET);
void setupKL(int n_mode);
void setupKL(int n_mode, int N_SET);
void setupPolish(int n_mode, int N_SET);
void cleanup(void);
void load(void);
void load_reg(void);
void load_KL(void);
void load_polish(void);
void nearest_neighbor(rtd *d__BMi,
rtd *d__partial_x_BMi,
rtd *d__partial_y_BMi,
int NI, rtd di, int k_mode);
void bilinear(rtd *d__BMi,
rtd *d__partial_x_BMi,
rtd *d__partial_y_BMi,
int NI, rtd di, int k_mode);
void update(rtd *b);
};
struct modes {
double *d__x_BM, *d__y_BM;
double *d__BM;
double *d__BMS;
double BM_radius;
int BM_N_SAMPLE;
double *d__BM_buffer;
int n_mode;
rtd *b, *d__b;
int N;
char filename[256];
int N_SET;
int N_MODE;
int *d__s2b;
void setup(char *filename, int N, int n_mode);
void setup(int _BM_N_SAMPLE_, double _BM_radius_,
int _N_SET_, int _N_MODE_, int *s2b,
double *buffer, int _N_, int _n_mode_);
void cleanup(void);
void load(void);
void load(int _BM_N_SAMPLE_, double _BM_radius_,
int _N_SET_, int _N_MODE_, int *s2b,
double *buffer);
void reset_modes(double *buffer);
void update(rtd *b);
};
struct gmt_m1 {
int M_ID;
rtd D_assembly;
rtd D_clear;
rtd D_full;
rtd ri;
rtd beta;
rtd L;
rtd area0, area_fraction;
float area0_px;
rtd area;
int N;
rtd depth;
coordinate_system aperture_CS;
coordinate_system conic_CS;
vector conic_origin[7], *d__conic_origin;
rtd conic_c, conic_k;
rtd *d__conic_c, *d__conic_k;
coordinate_system rigid_body_CS;
coordinate_system motion_CS;
rtd height;
mask *V;
int idx_offset;
zernikeS *ZS;
int *d__piston_mask;
coordinate_system TT_CS;
double *d__C, *d__D;
cublasHandle_t handle;
char *d__valid_segments;
modes BS;
float *d__segment_reflectivity;
void setup(void);
void setup(char *_filename_, int _N_, int _n_mode_);
void setup(zernikeS *ZS);
void cleanup(void);
void update(vector _origin_, vector _euler_angles_,int idx);
void reset(void);
void trace(bundle *rays);
void traceall(bundle *rays);
void blocking(bundle *rays);
void global_tiptilt(float tip, float tilt);
void test_ray_tracing(void);
void track(float *x, float *y, float *z, int N, int idx);
void locate(float *x, float *y, float *z, int N, int idx);
void remove(int *seg_ID, int N_ID);
void keep(int *seg_ID, int N_ID);
void update_conic_c(rtd *_conic_c_);
void update_conic_k(rtd *_conic_k_);
void set_reflectivity(float *reflectivity);
void preset(bundle *rays, rtd margin);
void edge_sensors_data(void);
};
struct gmt_m2 {
int M_ID;
rtd D_assembly;
rtd D_clear;
rtd D_full;
rtd ri;
rtd beta;
rtd L;
rtd area0, area_fraction;
float area0_px;
rtd area;
int N;
rtd depth;
coordinate_system aperture_CS;
coordinate_system conic_CS;
vector conic_origin[7], *d__conic_origin;
rtd conic_c, conic_k;
rtd *d__conic_c, *d__conic_k;
coordinate_system rigid_body_CS;
coordinate_system motion_CS;
rtd height;
mask *V;
int idx_offset;
zernikeS *ZS;
int *d__piston_mask;
coordinate_system TT_CS;
double *d__C, *d__D;
cublasHandle_t handle;
char *d__valid_segments;
modes BS;
float *d__segment_reflectivity;
void setup(void);
void setup(char *_filename_, int _N_, int _n_mode_);
void setup(zernikeS *ZS);
void cleanup(void);
void update(vector _origin_, vector _euler_angles_,int idx);
void reset(void);
void trace(bundle *rays);
void traceall(bundle *rays);
void blocking(bundle *rays);
void global_tiptilt(float tip, float tilt);
void test_ray_tracing(void);
void track(float *x, float *y, float *z, int N, int idx);
void locate(float *x, float *y, float *z, int N, int idx);
void remove(int *seg_ID, int N_ID);
void keep(int *seg_ID, int N_ID);
void update_conic_c(rtd *_conic_c_);
void update_conic_k(rtd *_conic_k_);
void set_reflectivity(float *reflectivity);
void pointing_neutral(float tip, float tilt);
void coma_neutral(float tip, float tilt);
};
struct stereoscopic_edge_sensors {
int N, N_DATA;
int n_byte, n_byte_DATA;
rtd alpha;
gmt_m1 *mirror;
vector *v0, *v, *d__v0, *d__v;
vector *dv0, *d__dv0;
vector *dv, *d__dv;
void setup(gmt_m1 *_mirror_);
void cleanup(void);
void data(void);
};
struct lateral_edge_sensors {
int N, N_DATA, N_HEIGHT;
rtd alpha;
rtd height;
gmt_m1 *mirror;
int n_byte_DATA;
rtd *x, *y, *d__x, *d__y, *d, *d__d;
vector *k_cam, *d__k_cam;
vector *k_laser, *d__k_laser;
vector *uP, *d__uP;
vector *vP, *d__vP;
vector *A, *A0, *B, *B0, *d__A, *d__A0, *d__B, *d__B0;
void setup(gmt_m1 *_mirror_);
void setup(gmt_m1 *_mirror_, rtd _height_);
void cleanup(void);
void data(void);
};
#endif