// lobes pour HSHS N-S // > cmvhshsns -n -d 0.105 -g 4,0.105,0. -i 2,0.41,0. -t 50,180,0 -f 1420 1410 1430 // > cmvhshsns -n -d 0.105 -g 2,0.105,0. -i 2,0.41,0. -t 50,180,0 -f 1420 1410 1430 // > cmvhshsns -n -D -1 -d 10 -g 1 -i 10,10,0. -t 50,180,0 -f 1420 1410 1430 // - Pittsburgh Sun 24 Nov // > cmvhshsns -n -d 0.147 -D 0 -g 1 -i 8,0.147,61.06 -t 360,90,0 -f 1420 #include "sopnamsp.h" #include "machdefs.h" #include #include #include #include #include #include #include "ntuple.h" #include "constcosmo.h" #include "geneutils.h" //---------------------------------------------------------------- void usage(void); void usage(void) { cout<<"cmvhshsns [...] val1 val2 ..."<0 en m , <0 en unites de longeur d'onde"< Lambda, Nu; bool argfreq = false; bool thetaps = false; bool normone = false; // --- dipole de longeur totale L (2 brins de L/2) double L_d = -0.5; // >0 en m, <0 en unite de lambda int dipolType = 0; // 1=dipole de Hertz, -1=sinc(), sinon dipole a 2 brins // --- groupes: regroupement des dipoles // N est le nombre de dipoles regroupes // D est la distance entre deux dipoles consecutifs // Theta est le dephasage entre 2 dipoles consecutifs (dephasage electronique) // i.e. c'est l'angle d'arrivee des rayons qui sont combines en phase int N_g = 1; // nombre de dipoles regroupes double D_g = -0.5; // >0 en m, <0 en unite de lambda double Theta_g = 0.; // en deg // --- interference des groupes // N est le nombre de groupes sur la ligne focale // D est la distance entre deux groupes consecutifs // Theta est le dephasage entre 2 groupes consecutifs (dephasage electronique) int N_i = 100; // nombre de groupes double D_i = (N_g>1) ? N_g*D_g: -0.5; // >0 en m, <0 en en unite de lambda double Theta_i = 0.; // en deg // --- Tmax = angle maximum de scan a partir du zenith (degres) double Tcent = 0., Tmax = 180.; // --- Nang nombre de points entre deux zeros de la figure d'interfrence int Nang = -1; // Decodage des arguments char c; while((c = getopt(narg,arg,"hpnfD:d:g:i:t:")) != -1) { switch (c) { case 'f' : argfreq = true; break; case 'p' : thetaps = true; break; case 'n' : normone = true; break; case 'D' : dipolType = atoi(optarg); break; case 'd' : sscanf(optarg,"%lf",&L_d); break; case 'i' : sscanf(optarg,"%d,%lf,%lf",&N_i,&D_i,&Theta_i); break; case 'g' : sscanf(optarg,"%d,%lf,%lf",&N_g,&D_g,&Theta_g); break; case 't' : sscanf(optarg,"%d,%lf,%lf",&Nang,&Tmax,&Tcent); break; case 'h' : default : usage(); return -1; break; } } if(optind>=narg) {usage(); return -2;} for(int i=optind;i>> Lambda = "< "< "< "< "< "< "<1) { double t = princpiclarge(lambda,N_g,dg,sthg); if(t>0.) cout<<"groupe: largeur du lobe principal: "<1) { double t = princpiclarge(lambda,N_i,di,sthi); if(t>0.) cout<<"interf: largeur du lobe principal: "<1) { double z = lambda/(N_g*dg); cout<<"groupe: distance entre 2 zeros: d(sin(t))="<1) { double z = lambda/(N_i*di); cout<<"interf: distance entre 2 zeros: d(sin(t))="<=0 ou k<0 int k0 = (is==1) ? 0: -1; for(int k=k0;;k+=is) { xnt[0] = k*lambda/(N*d)+sth; xnt[1] = (k%N==0) ? no: 0.; // zero ou maxi? if(fabs(xnt[0])>1.) break; xnt[0]=asin(xnt[0])/torad; nt.Fill(xnt); } } pos << PPFNameTag(str) << nt; } } return 0; } //----------------- double thetafromdt(double &theta,double dt,double lambda,double dconsec) // Input: // dt : decalage en seconde // lambda : longueur d'onde en m // dconsec : distance entre 2 dipoles consecutifs en m // Output et Return code "rc": // on cherche theta tel que: "C*dt = dconsec*sin(theta)" // ...si on peut trouver theta on renvoie // theta (en rad) angle equivalent // rc = 1 // ...si on ne peut pas trouver theta on renvoie // theta (en rad) angle equivalent // rc > 1 // pour la premiere solution de "C*dt = rc*dconsec*sin(theta)" // ...mauvais parametre on renvoie // rc=0 { if(dconsec<=0. || lambda<=0.) return 0.; // conversion de dt en longueur dt *= SpeedOfLight_Cst*1.e3; // translation dans une longueur d'onde dt = (dt/lambda - trunc(dt/lambda))*lambda; // calcul de sin(theta) double st = dt/dconsec; // calcul du nombre de dconsec pour avoir la premiere solution double rc = ceil(fabs(st)); if(rc==0) rc=1; // equivalent en angle possible theta = asin(st/rc); return rc; } double dtfromtheta(double theta,double lambda,double dconsec) // Input: // theta : angle en rad // lambda : longueur d'onde en m // dconsec : distance entre 2 dipoles consecutifs en m // Return: dt = dconsec/C * sin(theta) remis dans la periode { double dt = dconsec*sin(theta); // translation dans une longueur d'onde dt = (dt/lambda - trunc(dt/lambda))*lambda; return dt/(SpeedOfLight_Cst*1.e3); } double princpiclarge(double lambda,int N, double d,double sth) // Input: // lambda : longueur d'onde // N : nombre de dipole dans le regroupement // d : distance entre deux dipoles // sth : sin(theta) equivalent pour dephasage "electronique" // Return: si >0 distance angulaire en radians // si -1 zero haut (droite) non-existant // si -2 zero bas (gauche) non-existant { double st1 = lambda/(N*d)+sth; if(fabs(st1)>1.) return -1.; double st2 = -lambda/(N*d)+sth; if(fabs(st2)>1.) return -2.; return fabs(asin(st1)-asin(st2)); } /****************************** delobjs * openppf cmvhshsns.ppf set l 0 set t t set t sin(t*M_PI/180.) set cut 1 set cut -90