source: Sophya/trunk/Cosmo/SimLSS/cmvhshsew.cc@ 3749

Last change on this file since 3749 was 3653, checked in by cmv, 16 years ago

add hshs EW, cmv 16/07/2009

File size: 6.5 KB
Line 
1#include "sopnamsp.h"
2#include "machdefs.h"
3#include <iostream>
4#include <stdlib.h>
5#include <stdio.h>
6#include <string.h>
7#include <math.h>
8#include <unistd.h>
9
10#include "ntuple.h"
11#include "constcosmo.h"
12#include "geneutils.h"
13
14// ----
15// ---- Pattern de diffraction Est-Ouest pour HSHS
16// ----
17// ...Figure de DIFFRACTION
18// Le detecteur de chacune des antennes reste toujours dans le plan focal
19// sur l'axe optique E-W.
20// La puissance mesuree par l'antenne est donc celle mesuree dans le plan focal
21// sur l'axe optique.
22// Pour un rayon arrivant avec l'incidence theta, la valeur mesuree sur l'axe
23// optique est celle de la figure de diffraction d'un rayon arrivant
24// paralellement a l'axe optique (theta=0) mais mesuree en -theta et MULTIPLIEE
25// par cos(theta) puisque la surface collectrice effective est plus faible.
26// Le programme renvoie la figure de diffraction "diff" dont le maximum est en "t=0"
27// NON-MULTIPLIEE par cos(theta)
28// ...Figure d'INTERFERENCE
29// Si tous les detecteurs de chaque antenne sont lus et additionnes en phase,
30// la figure d'interference est donnee par les differences de marche
31// dues a la variation de l'angle d'incidence des rayons.
32// Cette figure d'interference est celle donnee dans le programme ci-apres par "intf".
33// Mais l'experience mesure les amplitudes elementaires sur chaque antenne et les additionne
34// en ajoutant ("electroniquement") une phase "phi" a chaque antenne.
35// La figure d'interference est donc decalee telle que son maximum d'ordre
36// zero (rayons arrivant en phase) soit centre en "phi".
37// Dans le programme le dephasage "phi" est exprime par l'angle d'incidence theta0
38// des rayons qui vont arriver en phase.
39// La difference de marche appliquee a une antenne
40// a la position X sera delta=X*sin(theta0)
41// ...Normalisation
42// Les courbes "intf" et "diff" sont chacunes telles que leurs valeurs maximales
43// sur tout le domaine en angle sont egales a 1
44// ...Resultat
45// Le resultat final pour obtenir la contribution a la puissance mesuree
46// par l'antenne en fonction de la direction du rayon incident est donc:
47// ---- Puissance = intf * diff * cos(theta) ----
48//
49
50int main(int narg,char *arg[])
51{
52const double torad = M_PI/180.;
53
54// Lambda = longueur d'onde (metres)
55double Lambda = 0.21;
56
57// Tmax = angle maximum de scan a partir du zenith (degres)
58// (si <0 alors -Tmax* diffraction_first_zero)
59// Nang nombre de points entre deux maxi d'interference
60//double Tmax = 90.;
61double Tmax = -5.;
62double Nang = 100;
63
64// Theta0 = angle d'incidence (degre) des rayons qui arrivent en phase
65// (traduit le dephasage de phase electronique applique aux antennes)
66double Theta0 = 0.;
67
68// Dcyl = largeur du cylindre en metres
69// Ncyl = nombre cylindres
70// Xcyl = distance entre les cylindres en metres
71double Dcyl = 10.;
72const int Ncyl = 10;
73double Xcyl[Ncyl];
74Xcyl[0] = 0.;
75 for(int i=1;i<Ncyl;i++) Xcyl[i] = Xcyl[i-1] + Dcyl;
76 //for(int i=1;i<Ncyl;i++) Xcyl[i] = Xcyl[i-1] + Dcyl + (i-1)*Dcyl/2.;
77 //for(int i=1;i<Ncyl;i++) Xcyl[i] = Xcyl[i-1] + Dcyl + (i-1)*Dcyl/Ncyl;
78 // for(int i=1;i<Ncyl;i++) Xcyl[i] = Xcyl[i-1] -Dcyl/2. + Dcyl + (i-1)*Dcyl/Ncyl;
79
80//---------------------------------------------
81cout<<"Lambda="<<Lambda<<" m"<<endl;
82cout<<"Dcyl="<<Dcyl<<" m"<<endl;
83cout<<"Ncyl="<<Ncyl<<endl;
84for(int i=0;i<Ncyl;i++) {
85 cout<<" Xcyl["<<i<<"] = "<<Xcyl[i]<<" m";
86 if(i>0) cout<<" d = "<<Xcyl[i]-Xcyl[i-1];
87 cout<<endl;
88}
89
90//---------------------------------------------
91if(Dcyl<=0. || Ncyl<=0) return -1;
92double dxmin = 1.e99, dxmax = -1.e99;
93for(int i=0;i<Ncyl-1;i++) for(int j=i+1;j<Ncyl;j++) {
94 double d = fabs(Xcyl[j]-Xcyl[i]);
95 if(d<dxmin) dxmin=d;
96 if(d>dxmax) dxmax=d;
97}
98cout<<"Minimum distance between cylinders = "<<dxmin<<endl;
99if(dxmin<Dcyl) cout<<"WARNIG: cylinder width > minimum cylinder distance"<<endl;
100cout<<"Maximum distance between cylinders = "<<dxmax<<endl;
101if(dxmin<=0. || dxmax<=0.) return -2;
102
103double samin = Lambda/dxmin;
104double samax = Lambda/dxmax;
105cout<<"Interference secondary maxi for max distance "<<samax<<" in sin() units -> "
106 <<asin(samax)/torad*60.<<"\'"<<endl;
107cout<<"Interference principal maxi for min distance "<<samin<<" in sin() units -> "
108 <<asin(samin)/torad*60.<<"\'"<<endl;
109
110double s0diff = Lambda/Dcyl;
111cout<<"Diffraction first zero "<<s0diff<<" in sin() units -> "
112 <<asin(s0diff)/torad<<" deg"<<endl;
113
114double s_theta0 = sin(Theta0*torad);
115cout<<"Dephasage electronique exprime en angle "<<Theta0<<" deg -> sin="<<s_theta0<<endl;
116
117if(Tmax<=0.) Tmax = -Tmax *asin(s0diff)/torad;
118if(Tmax>90.) Tmax = 90.;
119double sainc = samax/Nang;
120cout<<"Scan 0 to "<<Tmax<<" deg from zenith"<<endl;
121cout<<"Using "<<Nang<<" points between interference maxi"<<endl;
122cout<<"Sinus increment="<<sainc<<" -> "<<asin(sainc)/torad*60.<<"\'"<<endl;
123if(sainc<=0.) return -1;
124
125Tmax *= torad;
126if(Tmax>M_PI_2) Tmax=M_PI_2;
127int nest = int(2.*sin(Tmax)/sainc)+1;
128cout<<"Estimated number of entries "<<nest<<endl;
129
130//---------------------------------------------
131const char *namev[3] = {"t","intf","diff"};
132float xnt[3];
133NTuple nt(3,namev);
134
135int lpmod = (nest>10)? nest/10: 1;
136int nent = 0;
137// On parcourt en sin(angle)
138for(double sa=-sin(Tmax);sa<sin(Tmax) && sa<=1.;sa+=sainc) {
139 double a = asin(sa);
140 // Interference (add dephasage electronique)
141 double sumc = 0., sums = 0.;
142 for(int n=0;n<Ncyl;n++) {
143 double d = 2.*M_PI*(sa-s_theta0)*(Xcyl[n]-Xcyl[0])/Lambda;
144 sumc += cos(d);
145 sums += sin(d);
146 }
147 double intf = (sumc*sumc+sums*sums)/(Ncyl*Ncyl);
148 // Diffraction (le detecteur est toujour sur l'axe optique)
149 double diffr = M_PI*sa*Dcyl/Lambda;
150 diffr = SinXsX_Sqr(diffr);
151 //
152 if(nent%lpmod==0)
153 cout<<nent<<" sa="<<sa<<" a="<<a/torad<<" intf="<<intf<<" diff="<<diffr<<endl;
154 // Fill NTuple
155 xnt[0] = a/torad;
156 xnt[1] = intf;
157 xnt[2] = diffr;
158 nt.Fill(xnt);
159 nent++;
160}
161cout<<"Nent="<<nent<<endl;
162
163POutPersist pos("cmvhshsew.ppf");
164pos << PPFNameTag("nt") << nt;
165
166return 0;
167}
168
169/*
170del nt
171openppf cmvhshsew.ppf
172
173set norm cos(t*M_PI/180.)
174
175set t t
176set t sin(t*M_PI/180.)
177
178n/plot nt.intf%$t ! ! "nsta connectpoints"
179n/plot nt.diff%$t ! ! "nsta connectpoints same red"
180n/plot nt.$norm%$t ! ! "nsta connectpoints same orange"
181n/plot nt.diff*intf*$norm%$t ! ! "nsta connectpoints same blue"
182
183# Plot en dB
184n/plot nt.10.*log10(diff*intf*$norm)%$t diff*intf>0. ! "nsta connectpoints"
185addline -90 0 90 0 "red"
186
187# Dephasage electronique d'angle t (deg)
188set t0 0.6
189n/plot nt.intf%sin(t*M_PI/180.)-sin($t0*M_PI/180.) ! ! "nsta connectpoints"
190n/plot nt.diff%sin(t*M_PI/180.) ! ! "nsta connectpoints same red"
191
192 */
Note: See TracBrowser for help on using the repository browser.