ceo 0.1.0

CUDA Engined Optics
Documentation
#ifndef __RAYTRACING_H__
#define __RAYTRACING_H__

#ifndef __UTILITIES_H__
#include "utilities.h"
#endif

#ifndef __SOURCE_H__
#include "source.h"
#endif

#define SNELL_N_ITERATION 100
#define TOL 1E-9

struct coordinate_system{
  vector *origin;
  vector *euler_angles;
  int N;
  rtd *R, *d__R;
  float *float_R;
  vector *d__origin;
  char tag[32];
  void setup(void);
  void setup(vector _origin_, vector _euler_angles_);
  void setup(vector *_origin_, vector *_euler_angles_, int _N_);
  void setup(vector *_origin_, vector *_euler_angles_, int _N_, char *_tag_);
  void cleanup(void);
  void info(void);
  void info_details(void);
  void update(void);
  void update(vector _origin_, vector _euler_angles_,int idx);
};

struct conic {

  coordinate_system ref_frame;
  vector origin, *d__origin;
  rtd c, k, refractive_index;
  int even_asphere_N;
  rtd *d__even_asphere_a;

  void setup(rtd _c_, rtd _k_);
  void setup(rtd _c_, rtd _k_, vector _origin_, vector _euler_angles_);
  void setup(rtd _c_, rtd _k_, vector _origin_, vector _euler_angles_, 
             vector conic_origin);
  void setup(rtd _c_, rtd _k_, vector _origin_, vector _euler_angles_, 
             vector conic_origin, rtd _refractive_index_);
  void setup(rtd _c_, rtd _k_, vector _origin_, vector _euler_angles_, 
             vector conic_origin, rtd _refractive_index_,
             int asphere_N, rtd *asphere_a);
  void cleanup(void);
  void trace(bundle *src);
  void info(void);
};

__host__ __device__ rtd even_asphere(rtd r, int N, rtd *a);
__host__ __device__ rtd partial_x_or_y_even_asphere(rtd x_or_y, rtd r2, int N, rtd *a);

struct zernikeS {
  int max_n;
  unsigned int j, n, m, n_mode;
  rtd *a, *d__a;
  rtd *bx, *by, *d__bx, *d__by;
  unsigned int *bx_row_idx, *bx_col_ptr,
               *by_row_idx, *by_col_ptr,
               bx_nnz, by_nnz;
  rtd *cx, *d__cx, *cy, *d__cy;
  int N;
  coordinate_system ref_frame;
  void setup(int max_n, rtd *a);
  void setup(int _max_n_, rtd *_a_, int _N_);
  void setup(int max_n, rtd *a, vector _origin_, vector _euler_angles_);
  void setup(int max_n, rtd *a, vector _origin_, vector _euler_angles_, int _N_);
  void cleanup(void);
  void surface(rtd *S, rtd *r, rtd *o, const int N);
  void surface(rtd *S, rtd *r, rtd *o, const int N, int surf_id);
  void update(rtd *a);
  void surface_derivative_coefs(void);
  void surface_derivatives(rtd *d__dSdx, rtd *d__dSdy, rtd *d__r, rtd *d__o, const int N);
  void surface_and_derivatives(rtd *d__S, rtd *d__dSdx, rtd *d__dSdy,
                               rtd *d__r, rtd *d__o, const int N);
  void surface_and_derivatives(rtd *d__S, rtd *d__dSdx, rtd *d__dSdy,
                               rtd *d__r, rtd *d__o, const int N, int surf_id);
  void projection(float *d__phase, rtd *d__r, rtd *d__o, const int N);
};

__host__ __device__  rtd zernike_surface(rtd r, rtd o, int max_n, rtd *a);
__host__ __device__  rtd zernike_surface_x_derivative(rtd r, rtd o, int max_n, rtd *a);
__host__ __device__  rtd zernike_surface_y_derivative(rtd r, rtd o, int max_n, rtd *a);
__host__ __device__ void zernike_surface_and_partials(rtd *ZS, rtd *dZSdx, rtd *dZSdy,
                                                      rtd r, rtd o, int max_n,
                                                      rtd *a, rtd *ax, rtd *ay);
int zern_dx_coef(rtd *b, int j, int n, int m, int jp, int np, int mp);
int zern_dy_coef(rtd *b,int j, int n, int m, int jp, int np, int mp);

__host__ __device__ rtd conic_equation(vector *v, vector *v0, 
                                       const rtd k, const rtd c,
                                       const int N, rtd *a);
__device__ rtd  conic_surface(vector *v, vector *v0, 
                              const rtd k, const rtd c,
                              const int N, rtd *a);
__device__ rtd partial_x_conic_surface(vector *v, vector *v0,
                                       const rtd k, const rtd c,
                                       const int N, rtd *a);
__device__ rtd partial_y_conic_surface(vector *v, vector *v0,
                                       const rtd k, const rtd c,
                                       const int N, rtd *a);
__device__ rtd partial_z_conic_surface(void);

struct aperture {
  int D_px;
  rtd D, ri, D_seg;
  int N;
  mask V;
  coordinate_system ref_frame;

  void setup(rtd _D_, int _D_px_,
             vector _origin_, vector _euler_angles_);
  void setup(rtd _D_, rtd _ri_, int _D_px_,
             vector _origin_, vector _euler_angles_);
  void setup(rtd _D_, rtd _ri_, rtd _D_seg_, int _D_px_,
             vector *_origin_, vector *_euler_angles_, int N_segment);
  void setup_GMT_M1(rtd _D_, int _D_px_);
  void cleanup(void);
  void vignetting(bundle *rays);

};
__global__ void intersection(char *mask, ray *d__ray, int N_RAY);

__host__ __device__  void forward_transform(vector *v_out, vector *v_in,
                                   rtd *d__R, vector *d__origin);
__host__ __device__  void forward_transform_centered(vector *v_out, vector *v_in,
                                            rtd *d__R);
__host__ __device__  void backward_transform(vector *v_out, vector *v_in,
                                    rtd *d__R, vector *d__origin);
__host__ __device__  void backward_transform_centered(vector *v_out, vector *v_in,
                                             rtd *d__R);
__device__ rtd aspheric_surface(vector *v, vector *v0,
                                const rtd k, const rtd c,
                                const int max_n, rtd *a, const rtd R);
__device__ rtd zernike_surface(vector *v, vector *v0,
                               const int max_n, rtd *a, const rtd R);
__device__ rtd partial_x_aspheric_surface(vector *v, vector *v0,
                                          const rtd k, const rtd c,
                                          const int max_n, rtd *cx,
                                          const rtd R);
__device__ rtd partial_x_zernike_surface(vector *v, vector *v0,
                                         const int max_n, rtd *cx,
                                         const rtd R);
__device__ rtd partial_y_aspheric_surface(vector *v, vector *v0,
                                          const rtd k, const rtd c,
                                          const int max_n, rtd *cy,
                                          const rtd R);
__device__ rtd partial_y_zernike_surface(vector *v, vector *v0,
                                         const int max_n, rtd *cy,
                                         const rtd R);
__device__ rtd partial_z_aspheric_surface(void);
__device__ rtd partial_z_zernike_surface(void);


void transform_to_S(bundle *rays, conic *F);
void transform_to_S(bundle *rays, aperture *A);
void transform_to_R(bundle *rays, conic *F);
void transform_to_R(bundle *rays, aperture *A);
void intersect(bundle *rays, conic *F);
void reflect(bundle *rays);
void refract(bundle *rays, rtd mu);
#endif // __RAYTRACING_H__