00001 #ifndef SYNTHESIS_ANTENNA_H
00002 #define SYNTHESIS_ANTENNA_H
00003
00004 namespace casa
00005 {
00006 #include <synthesis/TransformMachines/BeamCalc.h>
00007
00008 #define MAXGEOM 2000
00009
00010
00011
00012 typedef struct
00013 {
00014 Double sub_h;
00015 Double feed[3];
00016 Double feeddir[3];
00017 Double pfeeddir[3];
00018 Double radius;
00019 Double K;
00020 Double deltar;
00021 Double zedge;
00022 Double bestparabola;
00023 Double ftaper;
00024 Double thmax;
00025 Double fa2pi;
00026 Double legwidth;
00027 Double legfoot, legfootz;
00028 Double legapex;
00029 Double legthick;
00030 Double hole_radius;
00031 Double freq, lambda;
00032 Double dir[3];
00033 Double hhat[3], vhat[3];
00034 Double z[MAXGEOM];
00035 Double m[MAXGEOM];
00036 Double k[3];
00037 Int ngeom;
00038 char name[16];
00039 Int gridsize;
00040 } calcAntenna;
00041
00042 typedef struct
00043 {
00044 Double subrot[3][3];
00045 Double feedrot[3][3];
00046 Double subshift[3];
00047 Double feedshift[3];
00048 Double subrotpoint[3];
00049 Double az_offset;
00050 Double el_offset;
00051 Double phase_offset;
00052 Double focus;
00053 } Pathology;
00054
00055 typedef struct
00056 {
00057 Double aper[6];
00058 Double dish[6];
00059 Double sub[6];
00060 Double feed[3];
00061 } Ray;
00062
00063 calcAntenna *newAntenna(Double sub_h, Double feed_x, Double feed_y, Double feed_z,
00064 Double ftaper, Double thmax, const char *geomfile);
00065 void deleteAntenna(calcAntenna *a);
00066 void Antennasetfreq(calcAntenna *a, Double freq);
00067 void Antennasetdir(calcAntenna *a, const Double *dir);
00068 void alignfeed(calcAntenna *a, const Pathology *p);
00069 void getfeedbasis(const calcAntenna *a, Double B[3][3]);
00070 void Efield(const calcAntenna *a,
00071 const casa::Complex *pol,
00072 casa::Complex *E);
00073 Int Antennasetfeedpattern(calcAntenna *a, const char *filename, Double scale);
00074 calcAntenna *newAntennafromApertureCalcParams(struct ApertureCalcParams *ap);
00075 void applyPathology(Pathology *P, calcAntenna *a);
00076 Int dishvalue(const calcAntenna *a, Double r, Double *z, Double *m);
00077 Int subfromdish(const calcAntenna *a, Double x, Double y, Double *subpoint);
00078 Int dishfromsub(const calcAntenna *a, Double x, Double y, Double *dishpoint);
00079
00080 Ray *newRay(const Double *sub);
00081 void deleteRay(Ray *ray);
00082 Pathology *newPathology();
00083 Pathology *newPathologyfromApertureCalcParams(struct ApertureCalcParams *ap);
00084 void deletePathology(Pathology *P);
00085 Double dAdOmega(const calcAntenna *a, const Ray *ray1, const Ray *ray2,
00086 const Ray *ray3, const Pathology *p);
00087 Double dOmega(const calcAntenna *a, const Ray *ray1, const Ray *ray2,
00088 const Ray *ray3, const Pathology *p);
00089 Double Raylen(const Ray *ray);
00090 Double feedfunc(const calcAntenna *a, Double theta);
00091 void Pathologize(Double *sub, const Pathology *p);
00092 void intersectdish(const calcAntenna *a, const Double *sub, const Double *unitdir,
00093 Double *dish, Int niter);
00094 void intersectaperture(const calcAntenna *a, const Double *dish,
00095 const Double *unitdir, Double *aper);
00096 Ray *trace(const calcAntenna *a, Double x, Double y, const Pathology *p);
00097 Double feedgain(const calcAntenna *a, const Ray *ray, const Pathology *p);
00098
00099 void tracepol(casa::Complex *E0, const Ray *ray, casa::Complex *E1);
00100
00101 Int legplanewaveblock(const calcAntenna *a, Double x, Double y);
00102 Int legplanewaveblock2(const calcAntenna *a, const Ray *ray);
00103 Int legsphericalwaveblock(const calcAntenna *a, const Ray *ray);
00104 };
00105 #endif