Changeset 3653 in Sophya for trunk/Cosmo


Ignore:
Timestamp:
Jul 16, 2009, 12:33:57 PM (16 years ago)
Author:
cmv
Message:

add hshs EW, cmv 16/07/2009

Location:
trunk/Cosmo/SimLSS
Files:
1 added
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/Cosmo/SimLSS/Makefile

    r3632 r3653  
    2121       $(EXE)cmvtstsch $(EXE)cmvtstblack $(EXE)cmvtvarspec $(EXE)cmvdefsurv \
    2222       $(EXE)cmvtintfun $(EXE)cmvconcherr $(EXE)cmvtinterp $(EXE)cmvtstagn \
    23        $(EXE)cmvschdist $(EXE)cmvhshsns
     23       $(EXE)cmvschdist $(EXE)cmvhshsns $(EXE)cmvhshsew
    2424 
    2525PROGSOBJ = \
     
    2929          $(OBJ)cmvtintfun.o $(OBJ)cmvtinterp.o \
    3030          $(OBJ)cmvconcherr.o $(OBJ)cmvtluc.o $(OBJ)cmvtstagn.o $(OBJ)cmvschdist.o \
    31           $(OBJ)cmvhshsns.o
     31          $(OBJ)cmvhshsns.o $(OBJ)cmvhshsew.o
    3232 
    3333LIBROBJ = \
     
    280280        $(CXXCOMPILE) $(CXXREP) -I$(MYEXTINC) -o $@ cmvhshsns.cc
    281281
    282 ##############################################################################
     282cmvhshsew: $(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  
    11// lobes pour HSHS N-S
    22// > 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
    35#include "sopnamsp.h"
    46#include "machdefs.h"
     
    2022cout<<"cmvhshsns [...] val1 val2 ..."<<endl
    2123  <<"  -f : val1... sont des frequences en MHz"<<endl
    22   <<"       (defaut: longueurs d'onde en m"<<endl
     24  <<"       (defaut: longueurs d'onde en m)"<<endl
    2325  <<"  -n : hauteur des lobes normalises a 1"<<endl
    2426  <<"  -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
    2630  <<"  -g N_g,D_g,Theta_g : regroupement de dipoles"<<endl
    2731  <<"                       N_g<=1 pas de regroupement"<<endl
     
    3034  <<"  -t Nang,Tmax,Tcent : nombre de pts entre 2 zeros consecutifs (def=25)"<<endl
    3135  <<"                       angle maxi (deg, def=180), angle central (deg, def=0)"<<endl
    32   <<"  -p : interprete Theta_{g,i} en picosecondes"<<endl
     36  <<"  -p : interprete Theta_{g,i} en picosecondes de temps"<<endl
    3337  <<"..distances L,D: >0 en m , <0 en unites de longeur d'onde"<<endl
    3438  <<"..angles Theta: en deg"<<endl
    35   <<"                en secondes si option \"-p\""<<endl
     39  <<"                en picosecondes de temps si option \"-p\""<<endl
    3640  <<endl;
    3741}
     
    3943double thetafromdt(double &theta,double dt,double lambda,double dconsec);
    4044double dtfromtheta(double theta,double lambda,double dconsec);
     45double princpiclarge(double lambda,int N, double d,double sth=0.);
    4146
    4247//----------------------------------------------------------------
     
    4550 const double torad = M_PI/180.;
    4651
    47  // --- longueur d'onde em m
     52 // --- longueur d'onde en m
    4853 vector<double> Lambda, Nu;
    4954 bool argfreq = false;
     
    5358 // --- dipole de longeur totale L (2 brins de L/2)
    5459 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
    5561
    5662 // --- groupes: regroupement des dipoles
     
    7985 // Decodage des arguments
    8086 char c;
    81  while((c = getopt(narg,arg,"hpnfd:g:i:t:")) != -1) {
     87 while((c = getopt(narg,arg,"hpnfD:d:g:i:t:")) != -1) {
    8288  switch (c) {
    8389  case 'f' :
     
    8995  case 'n' :
    9096    normone = true;
     97    break;
     98  case 'D' :
     99    dipolType = atoi(optarg);
    91100    break;
    92101  case 'd' :
     
    127136 for(unsigned short i=0;i<Lambda.size();i++)printf(" %.3f m ,  %.3f MHz\n",Lambda[i],Nu[i]/1.e6);
    128137
    129  cout<<"Dipole : longueur totale L="<<L_d<<endl;
     138 cout<<"Dipole : type="<<dipolType<<", longueur (ou largeur) totale L="<<L_d<<endl;
    130139 if(L_d==0.) return -4;
    131140
     
    158167   cout<<"\n\n>>> Lambda = "<<lambda<<" m ,  nu = "<<nu/1.e6<<" MHz"<<endl;
    159168   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;
    161170   double dg = (D_g<0.) ? -D_g*lambda : D_g;
    162171   cout<<"groupe: ("<<N_g<<"), dg="<<dg<<" m -> "<<dg*N_g<<" m"<<endl;
     
    181190   double sthi = sin(thi);
    182191
    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)
    184203   double dzero = M_PI/2.;
    185204   if(N_g>1) {
     
    204223   double dt = Tmax*torad/npt;
    205224   cout<<"nombre de points dans la boucle "<<2*npt+1<<" , dt="<<dt/torad<<endl;
     225   double vhmax = -1.e20, thmax=0.;
    206226   for(int i=-npt;i<=npt;i++) {
    207227     double t = Tcent*torad + i*dt;
     
    210230     double deltag = M_PI*dg/lambda*(st-sthg);
    211231     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);
    213236     double intfg = (N_g==1) ? 1.: SinNXsX_Sqr(deltag,N_g)/norme_g;
    214237     double intfi = (N_i==1) ? 1.: SinNXsX_Sqr(deltai,N_i)/norme_i;
    215238     double intf = ant*intfg*intfi;
     239     if(fabs(t)<M_PI/2. && intf>vhmax) {vhmax=intf; thmax=t;}
    216240
    217241     xnt[0] = t/torad;
     
    222246     nt.Fill(xnt);
    223247   }
     248   cout<<"Found maxi ("<<vhmax<<") for t = "<<thmax<<" rad = "<<thmax/torad<<" deg"<<endl;
    224249
    225250   //...ecriture ppf
     
    229254   DVList dvl;
    230255   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;
    234259   dvl("Tmax") = Tmax; dvl("Tcent") = Tcent;
     260   dvl("vhmax") = vhmax; dvl("thmax") = thmax/torad;
    235261   sprintf(str,"dvl_%d",il);
    236262   pos << PPFNameTag(str) << dvl;
     
    238264
    239265   //... 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"};
    244278     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
    247281       int k0 = (is==1) ? 0: -1;
    248282       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?
    251285         if(fabs(xnt[0])>1.) break;
    252286         xnt[0]=asin(xnt[0])/torad; nt.Fill(xnt);
    253287       }
    254288     }
    255      sprintf(str,"ntzg_%d",il);
    256289     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    }
    273290   }
    274291
     
    331348}
    332349
     350double 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
    333367/******************************
     368delobjs *
    334369openppf cmvhshsns.ppf
    335370
     
    342377set cut -90<t&&t<90
    343378
    344 n/plot $nt.$t%_nl
     379c++exec cout<<dvl_${l}<<endl;
     380
     381n/plot nt_$l.$t%_nl
    345382
    346383n/plot nt_$l.ant%$t $cut ! "nsta cpts green"
  • trunk/Cosmo/SimLSS/geneutils.cc

    r3632 r3653  
    398398         d=8cm, distance entre 2 centres consecutifs 10cm
    399399#
    400 # ---- AntCentFed et AntDipole
     400# ---- AntCentFed , AntDipole et LobeSinc
    401401# Input:
    402402#   t = angle entre la direction de la radiation et le fil de l'antenne (radian)
     
    432432 double vd = pil*pil*st/2.;  vd *= vd;
    433433 return vd;
     434}
     435
     436double LobeSinc(double L, double trad)
     437{
     438 double x = M_PI*L*sin(trad);
     439 return SinXsX_Sqr(x);
    434440}
    435441
  • trunk/Cosmo/SimLSS/geneutils.h

    r3632 r3653  
    9696double AntCentFed(double L, double trad);
    9797double AntDipole(double L, double trad);
     98double LobeSinc(double L, double trad);
    9899
    99100//----------------------------------------------------
Note: See TracChangeset for help on using the changeset viewer.