| 1 | // lobes pour HSHS N-S
 | 
|---|
| 2 | // > cmvhshsns -n -d 0.105 -g 4,0.105,0. -i 2,0.41,0. -t 50,180,0 -f 1420 1410 1430
 | 
|---|
| 3 | // > cmvhshsns -n -d 0.105 -g 2,0.105,0. -i 2,0.41,0. -t 50,180,0 -f 1420 1410 1430
 | 
|---|
| 4 | // > cmvhshsns -n -D -1 -d 10 -g 1 -i 10,10,0. -t 50,180,0 -f 1420 1410 1430
 | 
|---|
| 5 | // - Pittsburgh Sun 24 Nov
 | 
|---|
| 6 | //   > cmvhshsns -n -d 0.147 -D 0 -g 1 -i 8,0.147,61.06 -t 360,90,0 -f 1420 
 | 
|---|
| 7 | #include "sopnamsp.h"
 | 
|---|
| 8 | #include "machdefs.h"
 | 
|---|
| 9 | #include <iostream>
 | 
|---|
| 10 | #include <stdlib.h>
 | 
|---|
| 11 | #include <stdio.h>
 | 
|---|
| 12 | #include <string.h>
 | 
|---|
| 13 | #include <math.h>
 | 
|---|
| 14 | #include <unistd.h>
 | 
|---|
| 15 | 
 | 
|---|
| 16 | #include "ntuple.h"
 | 
|---|
| 17 | #include "constcosmo.h"
 | 
|---|
| 18 | #include "geneutils.h"
 | 
|---|
| 19 | 
 | 
|---|
| 20 | //----------------------------------------------------------------
 | 
|---|
| 21 | void usage(void);
 | 
|---|
| 22 | void usage(void)
 | 
|---|
| 23 | {
 | 
|---|
| 24 | cout<<"cmvhshsns [...] val1 val2 ..."<<endl
 | 
|---|
| 25 |   <<"  -f : val1... sont des frequences en MHz"<<endl
 | 
|---|
| 26 |   <<"       (defaut: longueurs d'onde en m)"<<endl
 | 
|---|
| 27 |   <<"  -n : hauteur des lobes normalises a 1"<<endl
 | 
|---|
| 28 |   <<"  -d L : longueur totale dipole"<<endl
 | 
|---|
| 29 |   <<"         si \"-D -1\" largeur du cylindre (etude E-W)"<<endl
 | 
|---|
| 30 |   <<"  -D : +1 lobe du dipole approximation de Hertz"<<endl
 | 
|---|
| 31 |   <<"       -1 le lobe du dipole est remplace par le sinc() du cylindre (etude E-W)"<<endl
 | 
|---|
| 32 |   <<"        0 lobe du dipole a 2 brins de longueur \"L\""<<endl
 | 
|---|
| 33 |   <<"  -g N_g,D_g,Theta_g : regroupement de dipoles"<<endl
 | 
|---|
| 34 |   <<"                       N_g<=1 pas de regroupement"<<endl
 | 
|---|
| 35 |   <<"  -i N_i,D_i,Theta_i : interferences entre regroupements de dipoles"<<endl
 | 
|---|
| 36 |   <<"                       N_i<=1 pas d'interference"<<endl
 | 
|---|
| 37 |   <<"  -t Nang,Tmax,Tcent : nombre de pts entre 2 zeros consecutifs (def=25)"<<endl
 | 
|---|
| 38 |   <<"                       angle maxi (deg, def=180), angle central (deg, def=0)"<<endl
 | 
|---|
| 39 |   <<"  -p : interprete Theta_{g,i} en picosecondes de temps"<<endl
 | 
|---|
| 40 |   <<"..distances L,D: >0 en m , <0 en unites de longeur d'onde"<<endl
 | 
|---|
| 41 |   <<"..angles Theta: en deg"<<endl
 | 
|---|
| 42 |   <<"                en picosecondes de temps si option \"-p\""<<endl
 | 
|---|
| 43 |   <<endl;
 | 
|---|
| 44 | }
 | 
|---|
| 45 | 
 | 
|---|
| 46 | double thetafromdt(double &theta,double dt,double lambda,double dconsec);
 | 
|---|
| 47 | double dtfromtheta(double theta,double lambda,double dconsec);
 | 
|---|
| 48 | double princpiclarge(double lambda,int N, double d,double sth=0.);
 | 
|---|
| 49 | 
 | 
|---|
| 50 | //----------------------------------------------------------------
 | 
|---|
| 51 | int main(int narg,char *arg[])
 | 
|---|
| 52 | {
 | 
|---|
| 53 |  const double torad = M_PI/180.;
 | 
|---|
| 54 | 
 | 
|---|
| 55 |  // --- longueur d'onde en m
 | 
|---|
| 56 |  vector<double> Lambda, Nu;
 | 
|---|
| 57 |  bool argfreq = false;
 | 
|---|
| 58 |  bool thetaps = false;
 | 
|---|
| 59 |  bool normone = false;
 | 
|---|
| 60 | 
 | 
|---|
| 61 |  // --- dipole de longeur totale L (2 brins de L/2)
 | 
|---|
| 62 |  double L_d = -0.5;   // >0 en m, <0 en unite de lambda
 | 
|---|
| 63 |  int dipolType = 0; // 1=dipole de Hertz, -1=sinc(), sinon dipole a 2 brins
 | 
|---|
| 64 | 
 | 
|---|
| 65 |  // --- groupes: regroupement des dipoles
 | 
|---|
| 66 |  // N est le nombre de dipoles regroupes
 | 
|---|
| 67 |  // D est la distance entre deux dipoles consecutifs
 | 
|---|
| 68 |  // Theta est le dephasage entre 2 dipoles consecutifs (dephasage electronique)
 | 
|---|
| 69 |  //  i.e. c'est l'angle d'arrivee des rayons qui sont combines en phase
 | 
|---|
| 70 |  int N_g = 1;  // nombre de dipoles regroupes
 | 
|---|
| 71 |  double D_g = -0.5;    // >0 en m, <0 en unite de lambda
 | 
|---|
| 72 |  double Theta_g = 0.;  // en deg
 | 
|---|
| 73 | 
 | 
|---|
| 74 |  // --- interference des groupes
 | 
|---|
| 75 |  // N est le nombre de groupes sur la ligne focale
 | 
|---|
| 76 |  // D est la distance entre deux groupes consecutifs
 | 
|---|
| 77 |  // Theta est le dephasage entre 2 groupes consecutifs (dephasage electronique)
 | 
|---|
| 78 |  int N_i = 100;  // nombre de groupes
 | 
|---|
| 79 |  double D_i = (N_g>1) ? N_g*D_g:  -0.5;    // >0 en m, <0 en en unite de lambda
 | 
|---|
| 80 |  double Theta_i = 0.;  // en deg
 | 
|---|
| 81 | 
 | 
|---|
| 82 |  // --- Tmax = angle maximum de scan a partir du zenith (degres)
 | 
|---|
| 83 |  double Tcent = 0., Tmax = 180.;
 | 
|---|
| 84 | 
 | 
|---|
| 85 |  // --- Nang nombre de points entre deux zeros de la figure d'interfrence
 | 
|---|
| 86 |  int Nang = -1;
 | 
|---|
| 87 | 
 | 
|---|
| 88 |  // Decodage des arguments
 | 
|---|
| 89 |  char c;
 | 
|---|
| 90 |  while((c = getopt(narg,arg,"hpnfD:d:g:i:t:")) != -1) {
 | 
|---|
| 91 |   switch (c) {
 | 
|---|
| 92 |   case 'f' :
 | 
|---|
| 93 |     argfreq = true;
 | 
|---|
| 94 |     break;
 | 
|---|
| 95 |   case 'p' :
 | 
|---|
| 96 |     thetaps = true;
 | 
|---|
| 97 |     break;
 | 
|---|
| 98 |   case 'n' :
 | 
|---|
| 99 |     normone = true;
 | 
|---|
| 100 |     break;
 | 
|---|
| 101 |   case 'D' :
 | 
|---|
| 102 |     dipolType = atoi(optarg);
 | 
|---|
| 103 |     break;
 | 
|---|
| 104 |   case 'd' :
 | 
|---|
| 105 |     sscanf(optarg,"%lf",&L_d);
 | 
|---|
| 106 |     break;
 | 
|---|
| 107 |   case 'i' :
 | 
|---|
| 108 |     sscanf(optarg,"%d,%lf,%lf",&N_i,&D_i,&Theta_i);
 | 
|---|
| 109 |     break;
 | 
|---|
| 110 |   case 'g' :
 | 
|---|
| 111 |     sscanf(optarg,"%d,%lf,%lf",&N_g,&D_g,&Theta_g);
 | 
|---|
| 112 |     break;
 | 
|---|
| 113 |   case 't' :
 | 
|---|
| 114 |     sscanf(optarg,"%d,%lf,%lf",&Nang,&Tmax,&Tcent);
 | 
|---|
| 115 |     break;
 | 
|---|
| 116 |   case 'h' :
 | 
|---|
| 117 |   default :
 | 
|---|
| 118 |     usage();
 | 
|---|
| 119 |     return -1;
 | 
|---|
| 120 |     break;
 | 
|---|
| 121 |   }
 | 
|---|
| 122 |  }
 | 
|---|
| 123 | 
 | 
|---|
| 124 |  if(optind>=narg) {usage(); return -2;}
 | 
|---|
| 125 |  for(int i=optind;i<narg;i++) {
 | 
|---|
| 126 |    double v = atof(arg[i]);
 | 
|---|
| 127 |    if(v<=0.) continue;
 | 
|---|
| 128 |    if(argfreq) {
 | 
|---|
| 129 |      v *= 1.e6;
 | 
|---|
| 130 |      Nu.push_back(v);
 | 
|---|
| 131 |      Lambda.push_back(SpeedOfLight_Cst*1.e3/v);
 | 
|---|
| 132 |    } else {
 | 
|---|
| 133 |      Lambda.push_back(v);
 | 
|---|
| 134 |      Nu.push_back(SpeedOfLight_Cst*1.e3/v);
 | 
|---|
| 135 |    }
 | 
|---|
| 136 |  }
 | 
|---|
| 137 |  cout<<"Nombre de longueurs d'onde a traiter "<<Lambda.size()<<" (unites: m et Hz)"<<endl;
 | 
|---|
| 138 |  if(Lambda.size()==0) return -3;
 | 
|---|
| 139 |  for(unsigned short i=0;i<Lambda.size();i++)printf(" %.3f m ,  %.3f MHz\n",Lambda[i],Nu[i]/1.e6);
 | 
|---|
| 140 | 
 | 
|---|
| 141 |  cout<<"Dipole : type="<<dipolType<<", longueur (ou largeur) totale L="<<L_d<<endl;
 | 
|---|
| 142 |  if(L_d==0.) return -4;
 | 
|---|
| 143 | 
 | 
|---|
| 144 |  if(N_g<=0) N_g = 1;
 | 
|---|
| 145 |  cout<<"Regroupements N="<<N_g<<" D="<<D_g<<" Theta="<<Theta_g<<endl;
 | 
|---|
| 146 |  if(N_g>1 && D_g==0.) return -4;
 | 
|---|
| 147 | 
 | 
|---|
| 148 |  if(N_i<=0) N_i = 1;
 | 
|---|
| 149 |  cout<<"Interferences N="<<N_i<<" D="<<D_i<<" Theta="<<Theta_i<<endl;
 | 
|---|
| 150 |  if(N_i>1 && D_i==0.) return -4;
 | 
|---|
| 151 | 
 | 
|---|
| 152 |  if(Nang<=0) Nang = 25;
 | 
|---|
| 153 |  while(Tcent<-180.) Tcent += 360.;
 | 
|---|
| 154 |  while(Tcent>180.)  Tcent -= 360.;
 | 
|---|
| 155 |  Tmax = fabs(Tmax); if(Tmax>180.) Tmax=180.;
 | 
|---|
| 156 |  cout<<"Display: Nang="<<Nang<<" Tmax="<<Tmax<<" Tcent="<<Tcent<<endl;
 | 
|---|
| 157 | 
 | 
|---|
| 158 |  double norme_g=1., norme_i=1.;
 | 
|---|
| 159 |  if(normone) {norme_g=N_g*N_g; norme_i=N_i*N_i;}
 | 
|---|
| 160 |  cout<<"Normalisation: norme_g="<<norme_g<<"  norme_i="<<norme_i<<endl;
 | 
|---|
| 161 | 
 | 
|---|
| 162 |  char str[32];
 | 
|---|
| 163 |  POutPersist pos("cmvhshsns.ppf");
 | 
|---|
| 164 | 
 | 
|---|
| 165 |  //------- Boucle sur les longeurs d'ondes
 | 
|---|
| 166 |  for(unsigned short il=0;il<Lambda.size();il++) {
 | 
|---|
| 167 | 
 | 
|---|
| 168 |    //... mise en forme des parametres pour la longueur d'onde
 | 
|---|
| 169 |    double lambda = Lambda[il], nu = Nu[il];
 | 
|---|
| 170 |    cout<<"\n\n>>> Lambda = "<<lambda<<" m ,  nu = "<<nu/1.e6<<" MHz"<<endl;
 | 
|---|
| 171 |    double ld = (L_d<0.) ? -L_d*lambda : L_d;
 | 
|---|
| 172 |    cout<<"dipole: ld="<<ld<<" m  (type="<<dipolType<<")"<<endl;
 | 
|---|
| 173 |    double dg = (D_g<0.) ? -D_g*lambda : D_g;
 | 
|---|
| 174 |    cout<<"groupe: ("<<N_g<<"), dg="<<dg<<" m -> "<<dg*N_g<<" m"<<endl;
 | 
|---|
| 175 |    double di = (D_i<0.) ? -D_i*lambda : D_i;
 | 
|---|
| 176 |    cout<<"interf: ("<<N_i<<"), di="<<di<<" m -> "<<di*N_i<<" m"<<endl;
 | 
|---|
| 177 |    double thg, thi, tg, ti;
 | 
|---|
| 178 |    if(thetaps) {
 | 
|---|
| 179 |      tg = Theta_g;
 | 
|---|
| 180 |      double rcg = thetafromdt(thg,tg,lambda,dg);
 | 
|---|
| 181 |      ti = Theta_i;
 | 
|---|
| 182 |      double rci = thetafromdt(thi,ti,lambda,di);
 | 
|---|
| 183 |      cout<<"dephasage electronique: groupe "<<tg<<" sec -> "<<thg/torad<<" deg pour rc="<<rcg<<endl
 | 
|---|
| 184 |          <<"                        interf "<<ti<<" sec -> "<<thi/torad<<" deg pour rc="<<rci<<endl;
 | 
|---|
| 185 |      if(rcg>1 || rci>1) {cout<<"!!!! Lambda NON-TRAITE"<<endl; continue;}
 | 
|---|
| 186 |    } else {
 | 
|---|
| 187 |      thg = Theta_g*torad; tg  = dtfromtheta(thg,lambda,dg);
 | 
|---|
| 188 |      thi = Theta_i*torad; ti  = dtfromtheta(thi,lambda,di);
 | 
|---|
| 189 |      cout<<"dephasage electronique: groupe "<<thg/torad<<" deg -> "<<tg<<" sec"<<endl
 | 
|---|
| 190 |          <<"                        interf "<<thi/torad<<" deg -> "<<ti<<" sec"<<endl;
 | 
|---|
| 191 |    }
 | 
|---|
| 192 |    double sthg = sin(thg);
 | 
|---|
| 193 |    double sthi = sin(thi);
 | 
|---|
| 194 | 
 | 
|---|
| 195 |    //... largeur du pic principale (distance entre les 2 zeros de part et d'autre)
 | 
|---|
| 196 |    if(N_g>1) {
 | 
|---|
| 197 |      double t = princpiclarge(lambda,N_g,dg,sthg);
 | 
|---|
| 198 |      if(t>0.) cout<<"groupe: largeur du lobe principal: "<<t<<" rad   "<<t/torad<<" deg"<<endl;
 | 
|---|
| 199 |    }
 | 
|---|
| 200 |    if(N_i>1) {
 | 
|---|
| 201 |      double t = princpiclarge(lambda,N_i,di,sthi);
 | 
|---|
| 202 |      if(t>0.) cout<<"interf: largeur du lobe principal: "<<t<<" rad   "<<t/torad<<" deg"<<endl;
 | 
|---|
| 203 |    }
 | 
|---|
| 204 | 
 | 
|---|
| 205 |    //... distance approx entre 2 zeros (hors pic principale)
 | 
|---|
| 206 |    double dzero = M_PI/2.;
 | 
|---|
| 207 |    if(N_g>1) {
 | 
|---|
| 208 |      double z = lambda/(N_g*dg);
 | 
|---|
| 209 |      cout<<"groupe: distance entre 2 zeros: d(sin(t))="<<z<<" (approx "<<z/torad<<" deg)"<<endl;
 | 
|---|
| 210 |      if(z<dzero) dzero = z;
 | 
|---|
| 211 |    }
 | 
|---|
| 212 |    if(N_i>1) {
 | 
|---|
| 213 |      double z = lambda/(N_i*di);
 | 
|---|
| 214 |      cout<<"interf: distance entre 2 zeros: d(sin(t))="<<z<<" (approx "<<z/torad<<" deg)"<<endl;
 | 
|---|
| 215 |      if(z<dzero) dzero = z;
 | 
|---|
| 216 |    }
 | 
|---|
| 217 |    cout<<"distance approx entre 2 zeros "<<dzero<<"  rad = "<<dzero/torad<<" deg"<<endl;
 | 
|---|
| 218 | 
 | 
|---|
| 219 |    //... remplissage des angles
 | 
|---|
| 220 |    {
 | 
|---|
| 221 |    const int nnt=5; float xnt[nnt];
 | 
|---|
| 222 |    const char *namev[nnt] = {"t","ant","intfg","intfi","intf"};
 | 
|---|
| 223 |    NTuple nt(nnt,namev);
 | 
|---|
| 224 | 
 | 
|---|
| 225 |    long npt = long(Tmax*torad/dzero*Nang +0.5);
 | 
|---|
| 226 |    double dt = Tmax*torad/npt;
 | 
|---|
| 227 |    cout<<"nombre de points dans la boucle "<<2*npt+1<<" , dt="<<dt/torad<<endl;
 | 
|---|
| 228 |    double vhmax = -1.e20, thmax=0.;
 | 
|---|
| 229 |    for(int i=-npt;i<=npt;i++) {
 | 
|---|
| 230 |      double t = Tcent*torad + i*dt;
 | 
|---|
| 231 |      double st = sin(t);
 | 
|---|
| 232 |      double ta = acos(st); // angle par rapport au fil de l'antenne
 | 
|---|
| 233 |      double deltag = M_PI*dg/lambda*(st-sthg);
 | 
|---|
| 234 |      double deltai = M_PI*di/lambda*(st-sthi);
 | 
|---|
| 235 |      double ant;
 | 
|---|
| 236 |      if(dipolType<0)        ant = LobeSinc(ld/lambda,t);
 | 
|---|
| 237 |        else if(dipolType>0) ant = AntDipole(ld/lambda,ta);
 | 
|---|
| 238 |          else               ant = AntCentFed(ld/lambda,ta);
 | 
|---|
| 239 |      double intfg = (N_g==1) ? 1.: SinNXsX_Sqr(deltag,N_g)/norme_g;
 | 
|---|
| 240 |      double intfi = (N_i==1) ? 1.: SinNXsX_Sqr(deltai,N_i)/norme_i;
 | 
|---|
| 241 |      double intf = ant*intfg*intfi;
 | 
|---|
| 242 |      if(fabs(t)<M_PI/2. && intf>vhmax) {vhmax=intf; thmax=t;}
 | 
|---|
| 243 | 
 | 
|---|
| 244 |      xnt[0] = t/torad;
 | 
|---|
| 245 |      xnt[1] = ant;
 | 
|---|
| 246 |      xnt[2] = intfg;
 | 
|---|
| 247 |      xnt[3] = intfi;
 | 
|---|
| 248 |      xnt[4] = intf;
 | 
|---|
| 249 |      nt.Fill(xnt);
 | 
|---|
| 250 |    }
 | 
|---|
| 251 |    cout<<"Found maxi ("<<vhmax<<") for t = "<<thmax<<" rad = "<<thmax/torad<<" deg"<<endl;
 | 
|---|
| 252 | 
 | 
|---|
| 253 |    //...ecriture ppf
 | 
|---|
| 254 |    sprintf(str,"nt_%d",il);
 | 
|---|
| 255 |    cout<<"writing "<<str<<" into ppf file"<<endl;
 | 
|---|
| 256 |    pos << PPFNameTag(str) << nt;
 | 
|---|
| 257 |    DVList dvl;
 | 
|---|
| 258 |    dvl("Lambda") = lambda; dvl("Nu") = nu;
 | 
|---|
| 259 |    dvl("Ld") = ld; dvl("dipolType") = dipolType;
 | 
|---|
| 260 |    dvl("Ng") = N_g; dvl("Dg") = dg; dvl("Thg") = thg/torad; dvl("Tg") = tg;
 | 
|---|
| 261 |    dvl("Ni") = N_i; dvl("Di") = di; dvl("Thi") = thi/torad; dvl("Ti") = ti;
 | 
|---|
| 262 |    dvl("Tmax") = Tmax; dvl("Tcent") = Tcent;
 | 
|---|
| 263 |    dvl("vhmax") = vhmax; dvl("thmax") = thmax/torad;
 | 
|---|
| 264 |    sprintf(str,"dvl_%d",il);
 | 
|---|
| 265 |    pos << PPFNameTag(str) << dvl;
 | 
|---|
| 266 |    }
 | 
|---|
| 267 | 
 | 
|---|
| 268 |    //... remplissage des zeros et des maximas principaux
 | 
|---|
| 269 |    for(int i=0;i<2;i++) {  // i==0 groupes , i==1 interferences
 | 
|---|
| 270 |      int N = N_g;
 | 
|---|
| 271 |      double d = dg, sth = sthg, norme = norme_g;
 | 
|---|
| 272 |      sprintf(str,"ntzg_%d",il);
 | 
|---|
| 273 |      if(i==1) {
 | 
|---|
| 274 |        N = N_i;
 | 
|---|
| 275 |        d = di; sth = sthi; norme = norme_i;
 | 
|---|
| 276 |        sprintf(str,"ntzi_%d",il);
 | 
|---|
| 277 |      }
 | 
|---|
| 278 |      if(N<=1) continue;
 | 
|---|
| 279 |      const int nnt=2; double xnt[nnt];
 | 
|---|
| 280 |      const char *namev[nnt] = {"t","ztyp"};
 | 
|---|
| 281 |      NTuple nt(nnt,namev);
 | 
|---|
| 282 |      double no = (normone) ? 1.: norme;
 | 
|---|
| 283 |      for(int is=-1;is<=1;is+=2) {  // ki>=0 ou k<0
 | 
|---|
| 284 |        int k0 = (is==1) ? 0: -1;
 | 
|---|
| 285 |        for(int k=k0;;k+=is) {
 | 
|---|
| 286 |          xnt[0] =  k*lambda/(N*d)+sth;
 | 
|---|
| 287 |          xnt[1] = (k%N==0) ? no: 0.;  // zero ou maxi?
 | 
|---|
| 288 |          if(fabs(xnt[0])>1.) break;
 | 
|---|
| 289 |          xnt[0]=asin(xnt[0])/torad; nt.Fill(xnt);
 | 
|---|
| 290 |        }
 | 
|---|
| 291 |      }
 | 
|---|
| 292 |      pos << PPFNameTag(str) << nt;
 | 
|---|
| 293 |    }
 | 
|---|
| 294 | 
 | 
|---|
| 295 |  }
 | 
|---|
| 296 | 
 | 
|---|
| 297 |  return 0;
 | 
|---|
| 298 | }
 | 
|---|
| 299 | 
 | 
|---|
| 300 | //-----------------
 | 
|---|
| 301 | double thetafromdt(double &theta,double dt,double lambda,double dconsec)
 | 
|---|
| 302 | // Input:
 | 
|---|
| 303 | //   dt : decalage en seconde
 | 
|---|
| 304 | //   lambda : longueur d'onde en m
 | 
|---|
| 305 | //   dconsec : distance entre 2 dipoles consecutifs en m
 | 
|---|
| 306 | // Output et Return code "rc":
 | 
|---|
| 307 | //   on cherche theta tel que: "C*dt = dconsec*sin(theta)"
 | 
|---|
| 308 | //   ...si on peut trouver theta on renvoie
 | 
|---|
| 309 | //        theta (en rad) angle equivalent
 | 
|---|
| 310 | //        rc = 1
 | 
|---|
| 311 | //   ...si on ne peut pas trouver theta on renvoie
 | 
|---|
| 312 | //        theta (en rad) angle equivalent
 | 
|---|
| 313 | //        rc > 1
 | 
|---|
| 314 | //      pour la premiere solution de "C*dt = rc*dconsec*sin(theta)"
 | 
|---|
| 315 | //   ...mauvais parametre on renvoie
 | 
|---|
| 316 | //        rc=0
 | 
|---|
| 317 | {
 | 
|---|
| 318 |   if(dconsec<=0. || lambda<=0.) return 0.;
 | 
|---|
| 319 | 
 | 
|---|
| 320 |   // conversion de dt en longueur
 | 
|---|
| 321 |   dt *= SpeedOfLight_Cst*1.e3;
 | 
|---|
| 322 | 
 | 
|---|
| 323 |   // translation dans une longueur d'onde
 | 
|---|
| 324 |   dt = (dt/lambda - trunc(dt/lambda))*lambda;
 | 
|---|
| 325 | 
 | 
|---|
| 326 |   // calcul de sin(theta)
 | 
|---|
| 327 |   double st = dt/dconsec;
 | 
|---|
| 328 | 
 | 
|---|
| 329 |   // calcul du nombre de dconsec pour avoir la premiere solution
 | 
|---|
| 330 |   double rc = ceil(fabs(st));
 | 
|---|
| 331 |   if(rc==0) rc=1;
 | 
|---|
| 332 |   
 | 
|---|
| 333 |   // equivalent en angle possible
 | 
|---|
| 334 |   theta = asin(st/rc);
 | 
|---|
| 335 |   return rc;
 | 
|---|
| 336 |  }
 | 
|---|
| 337 | 
 | 
|---|
| 338 | double dtfromtheta(double theta,double lambda,double dconsec)
 | 
|---|
| 339 | // Input:
 | 
|---|
| 340 | //   theta : angle en rad
 | 
|---|
| 341 | //   lambda : longueur d'onde en m
 | 
|---|
| 342 | //   dconsec : distance entre 2 dipoles consecutifs en m
 | 
|---|
| 343 | // Return: dt = dconsec/C * sin(theta) remis dans la periode
 | 
|---|
| 344 | {
 | 
|---|
| 345 |   double dt = dconsec*sin(theta);
 | 
|---|
| 346 | 
 | 
|---|
| 347 |   // translation dans une longueur d'onde
 | 
|---|
| 348 |   dt = (dt/lambda - trunc(dt/lambda))*lambda;
 | 
|---|
| 349 | 
 | 
|---|
| 350 |   return dt/(SpeedOfLight_Cst*1.e3);
 | 
|---|
| 351 | }
 | 
|---|
| 352 | 
 | 
|---|
| 353 | double princpiclarge(double lambda,int N, double d,double sth)
 | 
|---|
| 354 | // Input:
 | 
|---|
| 355 | //   lambda : longueur d'onde
 | 
|---|
| 356 | //   N : nombre de dipole dans le regroupement
 | 
|---|
| 357 | //   d : distance entre deux dipoles
 | 
|---|
| 358 | //   sth : sin(theta) equivalent pour dephasage "electronique"
 | 
|---|
| 359 | // Return: si >0 distance angulaire en radians
 | 
|---|
| 360 | //         si -1 zero haut (droite) non-existant
 | 
|---|
| 361 | //         si -2 zero bas (gauche) non-existant
 | 
|---|
| 362 | {
 | 
|---|
| 363 |  double st1 = lambda/(N*d)+sth;
 | 
|---|
| 364 |  if(fabs(st1)>1.) return -1.;
 | 
|---|
| 365 |  double st2 = -lambda/(N*d)+sth;
 | 
|---|
| 366 |  if(fabs(st2)>1.) return -2.;
 | 
|---|
| 367 |  return fabs(asin(st1)-asin(st2));
 | 
|---|
| 368 | }
 | 
|---|
| 369 | 
 | 
|---|
| 370 | /******************************
 | 
|---|
| 371 | delobjs *
 | 
|---|
| 372 | openppf cmvhshsns.ppf
 | 
|---|
| 373 | 
 | 
|---|
| 374 | set l 0
 | 
|---|
| 375 | 
 | 
|---|
| 376 | set t t
 | 
|---|
| 377 | set t sin(t*M_PI/180.)
 | 
|---|
| 378 | 
 | 
|---|
| 379 | set cut 1
 | 
|---|
| 380 | set cut -90<t&&t<90
 | 
|---|
| 381 | 
 | 
|---|
| 382 | c++exec cout<<dvl_${l}<<endl;
 | 
|---|
| 383 | 
 | 
|---|
| 384 | n/plot nt_$l.$t%_nl
 | 
|---|
| 385 | 
 | 
|---|
| 386 | n/plot nt_$l.ant%$t $cut ! "nsta cpts green"
 | 
|---|
| 387 | n/plot nt_$l.intfg%$t $cut ! "nsta cpts same red"
 | 
|---|
| 388 | n/plot nt_$l.intfi%$t $cut ! "nsta cpts same blue"
 | 
|---|
| 389 | n/plot nt_$l.intf%$t $cut ! "nsta cpts same black"
 | 
|---|
| 390 | 
 | 
|---|
| 391 | n/plot ntzg_$l.ztyp%$t $cut ! "nsta same marker=circle,9 red"
 | 
|---|
| 392 | n/plot ntzi_$l.ztyp%$t $cut ! "nsta same marker=star,9 blue"
 | 
|---|
| 393 | 
 | 
|---|
| 394 | 
 | 
|---|
| 395 | # compare frequences
 | 
|---|
| 396 | n/plot nt_0.intf%$t $cut ! "nsta cpts black"
 | 
|---|
| 397 | n/plot nt_1.intf%$t $cut ! "nsta cpts same blue"
 | 
|---|
| 398 | n/plot nt_2.intf%$t $cut ! "nsta cpts same red"
 | 
|---|
| 399 | n/plot nt_3.intf%$t $cut ! "nsta cpts same orange"
 | 
|---|
| 400 | 
 | 
|---|
| 401 |  */
 | 
|---|