// 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 #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 // --- 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:g:i:t:")) != -1) { switch (c) { case 'f' : argfreq = true; break; case 'p' : thetaps = true; break; case 'n' : normone = true; 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 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))="<1) { NTuple nt(nnt,namev); double no = (normone) ? 1.: norme_g; for(int is=-1;is<=1;is+=2) { int k0 = (is==1) ? 0: -1; for(int k=k0;;k+=is) { xnt[0] = k*lambda/(N_g*dg)+sthg; xnt[1] = (k%N_g==0) ? no: 0.; if(fabs(xnt[0])>1.) break; xnt[0]=asin(xnt[0])/torad; nt.Fill(xnt); } } sprintf(str,"ntzg_%d",il); pos << PPFNameTag(str) << nt; } if(N_i>1) { NTuple nt(nnt,namev); double no = (normone) ? 1.: norme_i; for(int is=-1;is<=1;is+=2) { int k0 = (is==1) ? 0: -1; for(int k=k0;;k+=is) { xnt[0] = k*lambda/(N_i*di)+sthi; xnt[1] = (k%N_i==0) ? no: 0.; if(fabs(xnt[0])>1.) break; xnt[0]=asin(xnt[0])/torad; nt.Fill(xnt); } } sprintf(str,"ntzi_%d",il); 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); } /****************************** openppf cmvhshsns.ppf set l 0 set t t set t sin(t*M_PI/180.) set cut 1 set cut -90