Changeset 3653 in Sophya for trunk/Cosmo/SimLSS
- Timestamp:
- Jul 16, 2009, 12:33:57 PM (16 years ago)
- Location:
- trunk/Cosmo/SimLSS
- Files:
-
- 1 added
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Cosmo/SimLSS/Makefile
r3632 r3653 21 21 $(EXE)cmvtstsch $(EXE)cmvtstblack $(EXE)cmvtvarspec $(EXE)cmvdefsurv \ 22 22 $(EXE)cmvtintfun $(EXE)cmvconcherr $(EXE)cmvtinterp $(EXE)cmvtstagn \ 23 $(EXE)cmvschdist $(EXE)cmvhshsns 23 $(EXE)cmvschdist $(EXE)cmvhshsns $(EXE)cmvhshsew 24 24 25 25 PROGSOBJ = \ … … 29 29 $(OBJ)cmvtintfun.o $(OBJ)cmvtinterp.o \ 30 30 $(OBJ)cmvconcherr.o $(OBJ)cmvtluc.o $(OBJ)cmvtstagn.o $(OBJ)cmvschdist.o \ 31 $(OBJ)cmvhshsns.o 31 $(OBJ)cmvhshsns.o $(OBJ)cmvhshsew.o 32 32 33 33 LIBROBJ = \ … … 280 280 $(CXXCOMPILE) $(CXXREP) -I$(MYEXTINC) -o $@ cmvhshsns.cc 281 281 282 ############################################################################## 282 cmvhshsew: $(EXE)cmvhshsew 283 echo $@ " done" 284 $(EXE)cmvhshsew: $(OBJ)cmvhshsew.o $(LIBR) 285 $(CXXLINK) $(CXXREP) -o $@ $(OBJ)cmvhshsew.o $(MYLIB) 286 $(OBJ)cmvhshsew.o: cmvhshsew.cc 287 $(CXXCOMPILE) $(CXXREP) -I$(MYEXTINC) -o $@ cmvhshsew.cc 288 289 ############################################################################## -
trunk/Cosmo/SimLSS/cmvhshsns.cc
r3632 r3653 1 1 // lobes pour HSHS N-S 2 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 3 5 #include "sopnamsp.h" 4 6 #include "machdefs.h" … … 20 22 cout<<"cmvhshsns [...] val1 val2 ..."<<endl 21 23 <<" -f : val1... sont des frequences en MHz"<<endl 22 <<" (defaut: longueurs d'onde en m "<<endl24 <<" (defaut: longueurs d'onde en m)"<<endl 23 25 <<" -n : hauteur des lobes normalises a 1"<<endl 24 26 <<" -d L : longueur totale dipole"<<endl 25 <<" L==0. alors approximation du dipole"<<endl 27 <<" si \"-D -1\" largeur du cylindre (etude E-W)"<<endl 28 <<" -D : +1 lobe du dipole approximation de Hertz"<<endl 29 <<" -1 le lobe du dipole est remplace par le sinc() du cylindre (etude E-W)"<<endl 26 30 <<" -g N_g,D_g,Theta_g : regroupement de dipoles"<<endl 27 31 <<" N_g<=1 pas de regroupement"<<endl … … 30 34 <<" -t Nang,Tmax,Tcent : nombre de pts entre 2 zeros consecutifs (def=25)"<<endl 31 35 <<" angle maxi (deg, def=180), angle central (deg, def=0)"<<endl 32 <<" -p : interprete Theta_{g,i} en picosecondes "<<endl36 <<" -p : interprete Theta_{g,i} en picosecondes de temps"<<endl 33 37 <<"..distances L,D: >0 en m , <0 en unites de longeur d'onde"<<endl 34 38 <<"..angles Theta: en deg"<<endl 35 <<" en secondes si option \"-p\""<<endl39 <<" en picosecondes de temps si option \"-p\""<<endl 36 40 <<endl; 37 41 } … … 39 43 double thetafromdt(double &theta,double dt,double lambda,double dconsec); 40 44 double dtfromtheta(double theta,double lambda,double dconsec); 45 double princpiclarge(double lambda,int N, double d,double sth=0.); 41 46 42 47 //---------------------------------------------------------------- … … 45 50 const double torad = M_PI/180.; 46 51 47 // --- longueur d'onde e mm52 // --- longueur d'onde en m 48 53 vector<double> Lambda, Nu; 49 54 bool argfreq = false; … … 53 58 // --- dipole de longeur totale L (2 brins de L/2) 54 59 double L_d = -0.5; // >0 en m, <0 en unite de lambda 60 int dipolType = 0; // 1=dipole de Hertz, -1=sinc(), sinon dipole a 2 brins 55 61 56 62 // --- groupes: regroupement des dipoles … … 79 85 // Decodage des arguments 80 86 char c; 81 while((c = getopt(narg,arg,"hpnf d:g:i:t:")) != -1) {87 while((c = getopt(narg,arg,"hpnfD:d:g:i:t:")) != -1) { 82 88 switch (c) { 83 89 case 'f' : … … 89 95 case 'n' : 90 96 normone = true; 97 break; 98 case 'D' : 99 dipolType = atoi(optarg); 91 100 break; 92 101 case 'd' : … … 127 136 for(unsigned short i=0;i<Lambda.size();i++)printf(" %.3f m , %.3f MHz\n",Lambda[i],Nu[i]/1.e6); 128 137 129 cout<<"Dipole : longueurtotale L="<<L_d<<endl;138 cout<<"Dipole : type="<<dipolType<<", longueur (ou largeur) totale L="<<L_d<<endl; 130 139 if(L_d==0.) return -4; 131 140 … … 158 167 cout<<"\n\n>>> Lambda = "<<lambda<<" m , nu = "<<nu/1.e6<<" MHz"<<endl; 159 168 double ld = (L_d<0.) ? -L_d*lambda : L_d; 160 cout<<"dipole: ld="<<ld<<" m "<<endl;169 cout<<"dipole: ld="<<ld<<" m (type="<<dipolType<<")"<<endl; 161 170 double dg = (D_g<0.) ? -D_g*lambda : D_g; 162 171 cout<<"groupe: ("<<N_g<<"), dg="<<dg<<" m -> "<<dg*N_g<<" m"<<endl; … … 181 190 double sthi = sin(thi); 182 191 183 //... distance approx entre 2 zeros 192 //... largeur du pic principale (distance entre les 2 zeros de part et d'autre) 193 if(N_g>1) { 194 double t = princpiclarge(lambda,N_g,dg,sthg); 195 if(t>0.) cout<<"groupe: largeur du lobe principal: "<<t<<" rad "<<t/torad<<" deg"<<endl; 196 } 197 if(N_i>1) { 198 double t = princpiclarge(lambda,N_i,di,sthi); 199 if(t>0.) cout<<"interf: largeur du lobe principal: "<<t<<" rad "<<t/torad<<" deg"<<endl; 200 } 201 202 //... distance approx entre 2 zeros (hors pic principale) 184 203 double dzero = M_PI/2.; 185 204 if(N_g>1) { … … 204 223 double dt = Tmax*torad/npt; 205 224 cout<<"nombre de points dans la boucle "<<2*npt+1<<" , dt="<<dt/torad<<endl; 225 double vhmax = -1.e20, thmax=0.; 206 226 for(int i=-npt;i<=npt;i++) { 207 227 double t = Tcent*torad + i*dt; … … 210 230 double deltag = M_PI*dg/lambda*(st-sthg); 211 231 double deltai = M_PI*di/lambda*(st-sthi); 212 double ant = (ld==0.) ? AntDipole(ld/lambda,ta): AntCentFed(ld/lambda,ta); 232 double ant; 233 if(dipolType<0) ant = LobeSinc(ld/lambda,t); 234 else if(dipolType>0) ant = AntDipole(ld/lambda,ta); 235 else ant = AntCentFed(ld/lambda,ta); 213 236 double intfg = (N_g==1) ? 1.: SinNXsX_Sqr(deltag,N_g)/norme_g; 214 237 double intfi = (N_i==1) ? 1.: SinNXsX_Sqr(deltai,N_i)/norme_i; 215 238 double intf = ant*intfg*intfi; 239 if(fabs(t)<M_PI/2. && intf>vhmax) {vhmax=intf; thmax=t;} 216 240 217 241 xnt[0] = t/torad; … … 222 246 nt.Fill(xnt); 223 247 } 248 cout<<"Found maxi ("<<vhmax<<") for t = "<<thmax<<" rad = "<<thmax/torad<<" deg"<<endl; 224 249 225 250 //...ecriture ppf … … 229 254 DVList dvl; 230 255 dvl("Lambda") = lambda; dvl("Nu") = nu; 231 dvl("Ld") = ld; 232 dvl("Ng") = N_g; dvl("Dg") = dg; dvl("Thg") = thg ; dvl("Tg") = tg;233 dvl("Ni") = N_i; dvl("Di") = di; dvl("Thi") = thi ; dvl("Ti") = ti;256 dvl("Ld") = ld; dvl("dipolType") = dipolType; 257 dvl("Ng") = N_g; dvl("Dg") = dg; dvl("Thg") = thg/torad; dvl("Tg") = tg; 258 dvl("Ni") = N_i; dvl("Di") = di; dvl("Thi") = thi/torad; dvl("Ti") = ti; 234 259 dvl("Tmax") = Tmax; dvl("Tcent") = Tcent; 260 dvl("vhmax") = vhmax; dvl("thmax") = thmax/torad; 235 261 sprintf(str,"dvl_%d",il); 236 262 pos << PPFNameTag(str) << dvl; … … 238 264 239 265 //... remplissage des zeros et des maximas principaux 240 { 241 const int nnt=2; double xnt[nnt]; 242 const char *namev[nnt] = {"t","ztyp"}; 243 if(N_g>1) { 266 for(int i=0;i<2;i++) { // i==0 groupes , i==1 interferences 267 int N = N_g; 268 double d = dg, sth = sthg, norme = norme_g; 269 sprintf(str,"ntzg_%d",il); 270 if(i==1) { 271 N = N_i; 272 d = di; sth = sthi; norme = norme_i; 273 sprintf(str,"ntzi_%d",il); 274 } 275 if(N<=1) continue; 276 const int nnt=2; double xnt[nnt]; 277 const char *namev[nnt] = {"t","ztyp"}; 244 278 NTuple nt(nnt,namev); 245 double no = (normone) ? 1.: norme _g;246 for(int is=-1;is<=1;is+=2) { 279 double no = (normone) ? 1.: norme; 280 for(int is=-1;is<=1;is+=2) { // ki>=0 ou k<0 247 281 int k0 = (is==1) ? 0: -1; 248 282 for(int k=k0;;k+=is) { 249 xnt[0] = k*lambda/(N _g*dg)+sthg;250 xnt[1] = (k%N _g==0) ? no: 0.;283 xnt[0] = k*lambda/(N*d)+sth; 284 xnt[1] = (k%N==0) ? no: 0.; // zero ou maxi? 251 285 if(fabs(xnt[0])>1.) break; 252 286 xnt[0]=asin(xnt[0])/torad; nt.Fill(xnt); 253 287 } 254 288 } 255 sprintf(str,"ntzg_%d",il);256 289 pos << PPFNameTag(str) << nt; 257 }258 if(N_i>1) {259 NTuple nt(nnt,namev);260 double no = (normone) ? 1.: norme_i;261 for(int is=-1;is<=1;is+=2) {262 int k0 = (is==1) ? 0: -1;263 for(int k=k0;;k+=is) {264 xnt[0] = k*lambda/(N_i*di)+sthi;265 xnt[1] = (k%N_i==0) ? no: 0.;266 if(fabs(xnt[0])>1.) break;267 xnt[0]=asin(xnt[0])/torad; nt.Fill(xnt);268 }269 }270 sprintf(str,"ntzi_%d",il);271 pos << PPFNameTag(str) << nt;272 }273 290 } 274 291 … … 331 348 } 332 349 350 double princpiclarge(double lambda,int N, double d,double sth) 351 // Input: 352 // lambda : longueur d'onde 353 // N : nombre de dipole dans le regroupement 354 // d : distance entre deux dipoles 355 // sth : sin(theta) equivalent pour dephasage "electronique" 356 // Return: si >0 distance angulaire en radians 357 // si -1 zero haut (droite) non-existant 358 // si -2 zero bas (gauche) non-existant 359 { 360 double st1 = lambda/(N*d)+sth; 361 if(fabs(st1)>1.) return -1.; 362 double st2 = -lambda/(N*d)+sth; 363 if(fabs(st2)>1.) return -2.; 364 return fabs(asin(st1)-asin(st2)); 365 } 366 333 367 /****************************** 368 delobjs * 334 369 openppf cmvhshsns.ppf 335 370 … … 342 377 set cut -90<t&&t<90 343 378 344 n/plot $nt.$t%_nl 379 c++exec cout<<dvl_${l}<<endl; 380 381 n/plot nt_$l.$t%_nl 345 382 346 383 n/plot nt_$l.ant%$t $cut ! "nsta cpts green" -
trunk/Cosmo/SimLSS/geneutils.cc
r3632 r3653 398 398 d=8cm, distance entre 2 centres consecutifs 10cm 399 399 # 400 # ---- AntCentFed et AntDipole400 # ---- AntCentFed , AntDipole et LobeSinc 401 401 # Input: 402 402 # t = angle entre la direction de la radiation et le fil de l'antenne (radian) … … 432 432 double vd = pil*pil*st/2.; vd *= vd; 433 433 return vd; 434 } 435 436 double LobeSinc(double L, double trad) 437 { 438 double x = M_PI*L*sin(trad); 439 return SinXsX_Sqr(x); 434 440 } 435 441 -
trunk/Cosmo/SimLSS/geneutils.h
r3632 r3653 96 96 double AntCentFed(double L, double trad); 97 97 double AntDipole(double L, double trad); 98 double LobeSinc(double L, double trad); 98 99 99 100 //----------------------------------------------------
Note:
See TracChangeset
for help on using the changeset viewer.