#include "ifocad.h" #define RINDEX 1.44963 #define BEAM_RADIUS 0.7 #define PD_RADIUS 10. #define PD_DEPTH 30. #define PD_RCHIP 10. #define BS_R1 0.49 #define BS_T1 0.49 #define BS_R2 0.01 #define BS_T2 0.98 #define BS_AC1 "rd" #define BS_AC2 "rd" #define PBS_RINDEX 1.44963 #define PBS_R1 0.01 #define PBS_T1 0.98 #define PBS_R2 0.49 #define PBS_T2 0.49 #define PBS_AC1 "{t}" #define PBS_AC2 "{srt}" #define BS15x7 1 /* 15 x 7mm plane BS */ #define BS20x7 2 /* 20 x 7mm plane BS */ #define BSM15x7 3 /* 15 x 7mm mirror */ #define BSW18x1 4 /* 18 x 1.6mm waveplate with mount */ #define M_RC 5 FILE *ocfp; FILE *incfp; void makepd (beam * b, double dist, char *label, photodiode * pd) /* create photodiode pd at distance dist along beam b */ { addsmul3 (b->p0, dist, b->dir, pd->s.zen); pd->s.rs = PD_RADIUS; /* radius */ pd->s.k = 0.; cp3 (b->dir, pd->s.nv); pd->d = PD_DEPTH; /* depth */ pd->rchip = PD_RCHIP; /* active radius */ strncpy (pd->name, label, ACLEN - 1); pd->labx = pd->laby = 0; } void makepds (beam * b, surf * s, char *label, photodiode * pd) /* create photodiode pd at intersection of surface s with beam b */ { double dist; dist = isect (s, b, NULL); makepd (b, dist, label, pd); } void makedummypbs (pbscube * bs, char *name) { bs->s.k = 0; /* curvature */ bs->s.rs = 8.5; /* substrate radius */ bs->n = PBS_RINDEX; /* refr. index */ strcpy (bs->ac1, PBS_AC1); /* action string front */ strcpy (bs->ac2, PBS_AC2); /* action string back */ bs->t1 = PBS_T1; /* power transmission front */ bs->r1 = PBS_R1; /* power refl. front */ bs->t2 = PBS_T2; /* power transmission back */ bs->r2 = PBS_R2; /* power refl. back */ strcpy (bs->name, name); /* name to be plotted */ bs->labx = 0; /* x-offset of name-label in mm */ bs->laby = 0; /* y-offset of name-label in mm */ } void makedummybs (beamsplitter * bs, int type, char *name) { switch (type) { case BS15x7: /* 15 x 7mm plane BS */ bs->s.k = 0; /* curvature */ bs->s.rs = 7.5; /* substrate radius */ bs->d = 7; /* max thickness */ bs->n = RINDEX; /* refr. index */ bs->wedge = 0; /* wedge angle */ strcpy (bs->ac1, BS_AC1); /* action string front */ strcpy (bs->ac2, BS_AC2); /* action string back */ bs->t1 = BS_T1; /* power transmission front */ bs->r1 = BS_R1; /* power refl. front */ bs->t2 = BS_T2; /* power transmission back */ bs->r2 = BS_R2; /* power refl. back */ strcpy (bs->name, name); /* name to be plotted */ bs->labx = 0; /* x-offset of name-label in mm */ bs->laby = 0; /* y-offset of name-label in mm */ bs->k2 = 0; /* curvature of second surface */ break; case BS20x7: /* 20 x 7mm plane BS */ bs->s.k = 0; /* curvature */ bs->s.rs = 10.; /* substrate radius */ bs->d = 7; /* max thickness */ bs->n = RINDEX; /* refr. index */ bs->wedge = 0; /* wedge angle */ strcpy (bs->ac1, BS_AC1); /* action string front */ strcpy (bs->ac2, BS_AC2); /* action string back */ bs->t1 = BS_T1; /* power transmission front */ bs->r1 = BS_R1; /* power refl. front */ bs->t2 = BS_T2; /* power transmission back */ bs->r2 = BS_R2; /* power refl. back */ strcpy (bs->name, name); /* name to be plotted */ bs->labx = 0; /* x-offset of name-label in mm */ bs->laby = 0; /* y-offset of name-label in mm */ bs->k2 = 0; /* curvature of second surface */ break; case BSM15x7: /* 15 x 7mm mirror */ bs->s.k = 0; /* curvature */ bs->s.rs = 7.5; /* substrate radius */ bs->d = 7; /* max thickness */ bs->n = RINDEX; /* refr. index */ bs->wedge = 0; /* wedge angle */ strcpy (bs->ac1, "r"); /* action string front */ strcpy (bs->ac2, "d"); /* action string back */ bs->t1 = 0.; /* power transmission front */ bs->r1 = 1.; /* power refl. front */ bs->t2 = 0.; /* power transmission back */ bs->r2 = 0.; /* power refl. back */ strcpy (bs->name, name); /* name to be plotted */ bs->labx = 0; /* x-offset of name-label in mm */ bs->laby = 0; /* y-offset of name-label in mm */ bs->k2 = 0; /* curvature of second surface */ break; case BSW18x1: /* 18 x 1,6mm waveplate mit Halterung */ bs->s.k = 0; /* curvature */ bs->s.rs = 9.; /* substrate radius */ bs->d = 1.6; /* max thickness */ bs->n = RINDEX; /* refr. index */ bs->wedge = 0; /* wedge angle */ strcpy (bs->ac1, "t"); /* action string front */ strcpy (bs->ac2, "t"); /* action string back */ bs->t1 = 1.; /* power transmission front */ bs->r1 = 0.; /* power refl. front */ bs->t2 = 1.; /* power transmission back */ bs->r2 = 0.; /* power refl. back */ strcpy (bs->name, name); /* name to be plotted */ bs->labx = 0; /* x-offset of name-label in mm */ bs->laby = 0; /* y-offset of name-label in mm */ bs->k2 = 0; /* curvature of second surface */ break; case M_RC: /* Modecleaner mirror */ bs->s.k = 0; /* curvature */ bs->s.rs = 50.; /* substrate radius */ bs->d = 50.; /* max thickness */ bs->n = RINDEX; /* refr. index */ bs->wedge = 0; /* wedge angle */ strcpy (bs->ac1, "t"); /* action string front */ strcpy (bs->ac2, "t"); /* action string back */ bs->t1 = 1.; /* power transmission front */ bs->r1 = 0.; /* power refl. front */ bs->t2 = 1.; /* power transmission back */ bs->r2 = 0.; /* power refl. back */ strcpy (bs->name, name); /* name to be plotted */ bs->labx = 0; /* x-offset of name-label in mm */ bs->laby = 0; /* y-offset of name-label in mm */ bs->k2 = 0; /* curvature of second surface */ break; default: fprintf (stderr, "makedummy:illegal type %d\n", type); exit (1); } } #define BEAM(bx) beam bx[1] #define BEAMSPLITTER(bsx) beamsplitter bsx[1] #define PHOTODIODE(pdx) photodiode pdx[1] #define SURF(sx) surf sx[1] #define PBS(sx) pbscube sx[1] #define OCBEAMLABEL(bx) ocbeamlabel(bx, #bx, incfp) #define MC_LEN 10.05e3 #define MC_HI 300. #define MC_CUR -37.8e3 #define EPS 1e-6 int main (void) { BEAM (ba); BEAM (bb); BEAM (bc); BEAMSPLITTER (ma); BEAMSPLITTER (mb); BEAMSPLITTER (mc); SURF (swaist); surf *slist[3]; double s0, s; double zero[3] = { 0, 0, 0 }; double pa[3] = { 0, -0.5 * MC_HI, 0 }; double pc[3] = { 0, 0.5 * MC_HI, 0 }; double pb[3] = { -MC_LEN, 0, 0 }; double vab[3], vac[3], vcb[3], vca[3]; double spher[3], spher0[3]; double pi[3], pi2[3], dpi[3]; double ang[3], ang2[3], dang[3]; double eps; FILE *ocfp; makedummybs (ma, M_RC, "MA"); makedummybs (mb, M_RC, "MB"); makedummybs (mc, M_RC, "MC"); mb->s.k = 1. / MC_CUR; coordsurf (1, 0, swaist); cp3 (pa, ma->s.zen); cp3 (pb, mb->s.zen); cp3 (pc, mc->s.zen); setnva (0, &(mb->s)); sub3 (pb, pc, vcb); sub3 (pa, pc, vca); sub3 (pb, pa, vab); sub3 (pc, pa, vac); between (vca, vcb, mc->s.nv); between (vab, vac, ma->s.nv); slist[0] = &(ma->s); slist[1] = &(mb->s); slist[2] = &(mc->s); /* nominal */ r2s (ma->s.nv, spher0); eigenmode (slist, 3, ba); bprint (ba, "ba"); splitf (mb, ba, bb, NULL, NULL, NULL, 0); splitf (mc, bb, bc, NULL, NULL, NULL, 0); isect (swaist, bc, pi); r2s (bc->dir, ang); /* misaligned */ eps = 1e-9; cp3 (spher0, spher); spher[1] += eps; /* pitch (1), yaw(2) */ s2r (spher, ma->s.nv); eigenmode (slist, 3, ba); // bprint (ba, "ba"); splitf (mb, ba, bb, NULL, NULL, NULL, 0); splitf (mc, bb, bc, NULL, NULL, NULL, 0); isect (swaist, bc, pi2); r2s (bc->dir, ang2); sub3 (pi2, pi, dpi); dpi[0] /= eps; dpi[1] /= eps; dpi[2] /= eps; // vprint (dpi, "Delta intersection point (MB pitch)"); sub3 (ang2, ang, dang); dang[0] /= eps; dang[1] /= eps; dang[2] /= eps; // vprint (dang, "Delta angle (MA pitch)"); printf ("%g %g %g %g %g %g\n", eps, dpi[0], dpi[1], dpi[2], dang[1], dang[2]); return 0; }