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 | #include "timing.h"
|
---|
10 | #include "ntuple.h"
|
---|
11 |
|
---|
12 | #include "integfunc.h"
|
---|
13 | #include "constcosmo.h"
|
---|
14 | #include "planckspectra.h"
|
---|
15 |
|
---|
16 | void compute_xroot(void);
|
---|
17 |
|
---|
18 | // cmvtstblack [T,nutest(Hz)] [deriv 0/1]
|
---|
19 |
|
---|
20 | int main(int narg,char *arg[])
|
---|
21 | {
|
---|
22 | //{compute_xroot(); return -41;}
|
---|
23 | double T = 2.718, nutest=-1.;
|
---|
24 | unsigned short deriv = 0;
|
---|
25 | double x0;
|
---|
26 |
|
---|
27 | if(narg>1) sscanf(arg[1],"%lf,%lf",&T,&nutest);
|
---|
28 | if(T<=0.) T = 2.718;
|
---|
29 | if(narg>2) sscanf(arg[2],"%u",&deriv);
|
---|
30 | if(deriv!=0) deriv = 1;
|
---|
31 |
|
---|
32 | cout<<"Temperature "<<T<<" K , deriv="<<deriv<<endl;
|
---|
33 |
|
---|
34 | //--------------------------------- Radiance Frequence
|
---|
35 | // frequence planck radiance W/..
|
---|
36 | PlanckSpectra pradf(T);
|
---|
37 | pradf.SetDeriv(deriv); pradf.SetVar(0);
|
---|
38 | pradf.SetApprox(0); pradf.SetTypSpectra(0); pradf.SetUnitOut(0);
|
---|
39 | PlanckSpectra phpradf(pradf); phpradf.SetUnitOut(1);
|
---|
40 |
|
---|
41 | // frequence rayleigh radiance W/..
|
---|
42 | PlanckSpectra rradf(T);
|
---|
43 | rradf.SetDeriv(deriv); rradf.SetVar(0);
|
---|
44 | rradf.SetApprox(1); rradf.SetTypSpectra(0); rradf.SetUnitOut(0);
|
---|
45 | PlanckSpectra phrradf(rradf); phrradf.SetUnitOut(1);
|
---|
46 |
|
---|
47 | // frequence wien radiance W/..
|
---|
48 | PlanckSpectra wradf(T);
|
---|
49 | wradf.SetDeriv(deriv); wradf.SetVar(0);
|
---|
50 | wradf.SetApprox(2); wradf.SetTypSpectra(0); wradf.SetUnitOut(0);
|
---|
51 | PlanckSpectra phwradf(wradf); phwradf.SetUnitOut(1);
|
---|
52 |
|
---|
53 | // Check
|
---|
54 | if(nutest<=0.) nutest = k_Boltzman_Cst*T/h_Planck_Cst;
|
---|
55 | cout<<"Test for t="<<T<<" K, nu="<<nutest<<" Hz"<<endl
|
---|
56 | <<" planck = "<<pradf(nutest)<<endl
|
---|
57 | <<" wien = "<<wradf(nutest)<<endl
|
---|
58 | <<" rayleigh = "<<rradf(nutest)<<endl;
|
---|
59 |
|
---|
60 | //--------------------------------- Densite Frequence
|
---|
61 | // frequence planck density W/..
|
---|
62 | PlanckSpectra pdensf(T);
|
---|
63 | pdensf.SetDeriv(deriv); pdensf.SetVar(0);
|
---|
64 | pdensf.SetApprox(0); pdensf.SetTypSpectra(2); pdensf.SetUnitOut(0);
|
---|
65 | PlanckSpectra phpdensf(pdensf); phpdensf.SetUnitOut(1);
|
---|
66 |
|
---|
67 | // frequence rayleigh density W/..
|
---|
68 | PlanckSpectra rdensf(T);
|
---|
69 | rdensf.SetDeriv(deriv); rdensf.SetVar(0);
|
---|
70 | rdensf.SetApprox(1); rdensf.SetTypSpectra(2); rdensf.SetUnitOut(0);
|
---|
71 | PlanckSpectra phrdensf(rdensf); phrdensf.SetUnitOut(1);
|
---|
72 |
|
---|
73 | // frequence wien density W/..
|
---|
74 | PlanckSpectra wdensf(T);
|
---|
75 | wdensf.SetDeriv(deriv); wdensf.SetVar(0);
|
---|
76 | wdensf.SetApprox(2); wdensf.SetTypSpectra(2); wdensf.SetUnitOut(0);
|
---|
77 | PlanckSpectra phwdensf(wdensf); phwdensf.SetUnitOut(1);
|
---|
78 |
|
---|
79 | //--------------------------------- Radiance Longeur d'onde
|
---|
80 | // longueur d'onde planck radiance W/..
|
---|
81 | PlanckSpectra pradl(T);
|
---|
82 | pradl.SetDeriv(deriv); pradl.SetVar(1);
|
---|
83 | pradl.SetApprox(0); pradl.SetTypSpectra(0); pradl.SetUnitOut(0);
|
---|
84 | PlanckSpectra phpradl(pradl); phpradl.SetUnitOut(1);
|
---|
85 |
|
---|
86 | // longueur d'onde rayleigh radiance W/..
|
---|
87 | PlanckSpectra rradl(T);
|
---|
88 | rradl.SetDeriv(deriv); rradl.SetVar(1);
|
---|
89 | rradl.SetApprox(1); rradl.SetTypSpectra(0); rradl.SetUnitOut(0);
|
---|
90 | PlanckSpectra phrradl(rradl); phrradl.SetUnitOut(1);
|
---|
91 |
|
---|
92 | // longueur d'onde wien radiance W/..
|
---|
93 | PlanckSpectra wradl(T);
|
---|
94 | wradl.SetDeriv(deriv); wradl.SetVar(1);
|
---|
95 | wradl.SetApprox(2); wradl.SetTypSpectra(0); wradl.SetUnitOut(0);
|
---|
96 | PlanckSpectra phwradl(wradl); phwradl.SetUnitOut(1);
|
---|
97 |
|
---|
98 | //--------------------------------- Densite Longeur d'onde
|
---|
99 | // longueur d'onde planck density W/..
|
---|
100 | PlanckSpectra pdensl(T);
|
---|
101 | pdensl.SetDeriv(deriv); pdensl.SetVar(1);
|
---|
102 | pdensl.SetApprox(0); pdensl.SetTypSpectra(2); pdensl.SetUnitOut(0);
|
---|
103 | PlanckSpectra phpdensl(pdensl); phpdensl.SetUnitOut(1);
|
---|
104 |
|
---|
105 | // longueur d'onde rayleigh density W/..
|
---|
106 | PlanckSpectra rdensl(T);
|
---|
107 | rdensl.SetDeriv(deriv); rdensl.SetVar(1);
|
---|
108 | rdensl.SetApprox(1); rdensl.SetTypSpectra(2); rdensl.SetUnitOut(0);
|
---|
109 | PlanckSpectra phrdensl(rdensl); phrdensl.SetUnitOut(1);
|
---|
110 |
|
---|
111 | // longueur d'onde wien density W/..
|
---|
112 | PlanckSpectra wdensl(T);
|
---|
113 | wdensl.SetDeriv(deriv); wdensl.SetVar(1);
|
---|
114 | wdensl.SetApprox(2); wdensl.SetTypSpectra(2); wdensl.SetUnitOut(0);
|
---|
115 | PlanckSpectra phwdensl(wdensl); phwdensl.SetUnitOut(1);
|
---|
116 |
|
---|
117 | //--------------------------------- Le maximum des spectres de planck
|
---|
118 | cout<<endl;
|
---|
119 | double eps = 0.001;
|
---|
120 | x0 = pradf.WienLaw();
|
---|
121 | printf("Planck maximum for radiance energy: f = %e Hz -> %e W/m^2/sr/Hz\n",x0,pradf(x0));
|
---|
122 | printf(" check: = %e\n",pradf.FindMaximum(eps));
|
---|
123 | x0 = phpradf.WienLaw();
|
---|
124 | printf("Planck maximum for radiance photon: f = %e Hz -> %e ph/s/m^2/sr/Hz\n",x0,phpradf(x0));
|
---|
125 | printf(" check: = %e\n",phpradf.FindMaximum(eps));
|
---|
126 |
|
---|
127 | x0 = pdensf.WienLaw();
|
---|
128 | printf("Planck maximum for density energy: f = %e Hz -> %e J/m^3/Hz\n",x0,pdensf(x0));
|
---|
129 | printf(" check: = %e\n",pdensf.FindMaximum(eps));
|
---|
130 | x0 = phpdensf.WienLaw();
|
---|
131 | printf("Planck maximum for density photon: f = %e Hz -> %e ph/m^3/Hz\n",x0,phpdensf(x0));
|
---|
132 | printf(" check: = %e\n",phpdensf.FindMaximum(eps));
|
---|
133 |
|
---|
134 | x0 = pradl.WienLaw();
|
---|
135 | printf("Planck maximum for radiance energy: l = %e m -> %e W/m^2/sr/m\n",x0,pradl(x0));
|
---|
136 | printf(" check: = %e\n",pradl.FindMaximum(eps));
|
---|
137 | x0 = phpradl.WienLaw();
|
---|
138 | printf("Planck maximum for radiance photon: l = %e m -> %e ph/s/m^2/sr/m\n",x0,phpradl(x0));
|
---|
139 | printf(" check: = %e\n",phpradl.FindMaximum(eps));
|
---|
140 |
|
---|
141 | x0 = pdensl.WienLaw();
|
---|
142 | printf("Planck maximum for density energy: l = %e m -> %e J/m^3/m\n",x0,pdensl(x0));
|
---|
143 | printf(" check: = %e\n",pdensl.FindMaximum(eps));
|
---|
144 | x0 = phpdensl.WienLaw();
|
---|
145 | printf("Planck maximum for density photon: l = %e m -> %e ph/m^3/m\n",x0,phpdensl(x0));
|
---|
146 | printf(" check: = %e\n",phpdensl.FindMaximum(eps));
|
---|
147 |
|
---|
148 | //--------------------------------- La loi de Wien
|
---|
149 | cout<<endl;
|
---|
150 | x0 = wradf.WienLaw();
|
---|
151 | printf("Wien law for radiance energy: f = %e Hz -> %e W/m^2/sr/Hz\n",x0,wradf(x0));
|
---|
152 | printf(" check: = %e\n",wradf.FindMaximum(eps));
|
---|
153 | x0 = phwradf.WienLaw();
|
---|
154 | printf("Wien law for radiance photon: f = %e Hz -> %e ph/s/m^2/sr/Hz\n",x0,phwradf(x0));
|
---|
155 | printf(" check: = %e\n",phwradf.FindMaximum(eps));
|
---|
156 |
|
---|
157 | x0 = wdensf.WienLaw();
|
---|
158 | printf("Wien law for density energy: f = %e Hz -> %e J/m^3/Hz\n",x0,wdensf(x0));
|
---|
159 | printf(" check: = %e\n",wdensf.FindMaximum(eps));
|
---|
160 | x0 = phwdensf.WienLaw();
|
---|
161 | printf("Wien law for density photon: f = %e Hz -> %e ph/m^3/Hz\n",x0,phwdensf(x0));
|
---|
162 | printf(" check: = %e\n",phwdensf.FindMaximum(eps));
|
---|
163 |
|
---|
164 | x0 = wradl.WienLaw();
|
---|
165 | printf("Wien law for radiance energy: l = %e m -> %e W/m^2/sr/m\n",x0,wradl(x0));
|
---|
166 | printf(" check: = %e\n",wradl.FindMaximum(eps));
|
---|
167 | x0 = phwradl.WienLaw();
|
---|
168 | printf("Wien law for radiance photon: l = %e m -> %e ph/s/m^2/sr/m\n",x0,phwradl(x0));
|
---|
169 | printf(" check: = %e\n",phwradl.FindMaximum(eps));
|
---|
170 |
|
---|
171 | x0 = wdensl.WienLaw();
|
---|
172 | printf("Wien law for density energy: l = %e m -> %e J/m^3/m\n",x0,wdensl(x0));
|
---|
173 | printf(" check: = %e\n",wdensl.FindMaximum(eps));
|
---|
174 | x0 = phwdensl.WienLaw();
|
---|
175 | printf("Wien law for density photon: l = %e m -> %e ph/m^3/m\n",x0,phwdensl(x0));
|
---|
176 | printf(" check: = %e\n",phwdensl.FindMaximum(eps));
|
---|
177 |
|
---|
178 | //--------------------------------- Densite totale d'energie
|
---|
179 | cout<<endl;
|
---|
180 | cout<<"Densite totale d'energie: "<<pdensf.PlanckEnergie()<<" J/m^3"<<endl;
|
---|
181 | if(! deriv) {
|
---|
182 | double x1,x2,perc,dxinc;
|
---|
183 | x0 = pdensf.WienLaw(); x1=x0/100.; x2=x0*100.; perc=0.1; dxinc=x0/1000.;
|
---|
184 | cout<<" check by integration: "<<IntegrateFunc(pdensf,x1,x2,perc,dxinc)<<" J/m^3"<<endl;
|
---|
185 | x1=log10(x0/100.); x2=log10(x0*100.); perc=0.1; dxinc=(x2-x1)/100.;
|
---|
186 | cout<<" check by integration: "<<IntegrateFuncLog(pdensf,x1,x2,perc,dxinc)<<" J/m^3"<<endl;
|
---|
187 |
|
---|
188 | x0 = pdensl.WienLaw(); x1=x0/100.; x2=x0*100.; perc=0.1; dxinc=x0/1000.;
|
---|
189 | cout<<" check by integration: "<<IntegrateFunc(pdensl,x1,x2,perc,dxinc)<<" J/m^3"<<endl;
|
---|
190 | x1=log10(x0/100.); x2=log10(x0*100.); perc=0.1; dxinc=(x2-x1)/100.;
|
---|
191 | cout<<" check by integration: "<<IntegrateFuncLog(pdensl,x1,x2,perc,dxinc)<<" J/m^3"<<endl;
|
---|
192 | }
|
---|
193 |
|
---|
194 | //--------------------------------- Densite totale de photons
|
---|
195 | cout<<endl;
|
---|
196 | cout<<"Densite totale de photons: "<<pdensf.PlanckPhoton()<<" ph/m^3"<<endl;
|
---|
197 | if(! deriv) {
|
---|
198 | double x1,x2,perc,dxinc;
|
---|
199 | x0 = phpdensf.WienLaw(); x1=x0/100.; x2=x0*100.; perc=0.1; dxinc=x0/1000.;
|
---|
200 | cout<<" check by integration: "<<IntegrateFunc(phpdensf,x1,x2,perc,dxinc)<<" ph/m^3"<<endl;
|
---|
201 | x1=log10(x0/100.); x2=log10(x0*100.); perc=0.1; dxinc=(x2-x1)/100.;
|
---|
202 | cout<<" check by integration: "<<IntegrateFuncLog(phpdensf,x1,x2,perc,dxinc)<<" ph/m^3"<<endl;
|
---|
203 |
|
---|
204 | x0 = phpdensl.WienLaw(); x1=x0/100.; x2=x0*100.; perc=0.1; dxinc=x0/1000.;
|
---|
205 | cout<<" check by integration: "<<IntegrateFunc(phpdensl,x1,x2,perc,dxinc)<<" ph/m^3"<<endl;
|
---|
206 | x1=log10(x0/100.); x2=log10(x0*100.); perc=0.1; dxinc=(x2-x1)/100.;
|
---|
207 | cout<<" check by integration: "<<IntegrateFuncLog(phpdensl,x1,x2,perc,dxinc)<<" ph/m^3"<<endl;
|
---|
208 | }
|
---|
209 |
|
---|
210 | //--------------------------------- NTuple
|
---|
211 | cout<<endl;
|
---|
212 | int npt = 1000;
|
---|
213 | double frac = 10000.;
|
---|
214 | x0 = wradf.WienLaw();
|
---|
215 | double xmin = x0/frac, xmax = x0*frac;
|
---|
216 | cout<<"xmin="<<xmin<<" Hz, xmax="<<xmax<<" Hz"<<endl;
|
---|
217 | double lnx1 = log10(xmin), lnx2 = log10(xmax), dlnx = (lnx2-lnx1)/npt;
|
---|
218 | cout<<"lnx1="<<lnx1<<", lnx2="<<lnx2<<", dlnx="<<dlnx<<endl;
|
---|
219 |
|
---|
220 | const int n = 14;
|
---|
221 | char *vname[n] = {"f","l","prf","prl","pdf","pdl","rrf","rrl","rdf","rdl","wrf","wrl","wdf","wdl"};
|
---|
222 | NTuple nt(n,vname);
|
---|
223 | double xnt[n];
|
---|
224 | for(double lx=lnx1;lx<lnx2+dlnx/2.;lx+=dlnx) {
|
---|
225 | double f = pow(10.,lx);
|
---|
226 | double l = wradf.F2L(f);
|
---|
227 | xnt[0] = f;
|
---|
228 | xnt[1] = l;
|
---|
229 | xnt[2] = pradf(f);
|
---|
230 | xnt[3] = pradl(l);
|
---|
231 | xnt[4] = pdensf(f);
|
---|
232 | xnt[5] = pdensl(l);
|
---|
233 | xnt[6] = rradf(f);
|
---|
234 | xnt[7] = rradl(l);
|
---|
235 | xnt[8] = rdensf(f);
|
---|
236 | xnt[9] = rdensl(l);
|
---|
237 | xnt[10] = wradf(f);
|
---|
238 | xnt[11] = wradl(l);
|
---|
239 | xnt[12] = wdensf(f);
|
---|
240 | xnt[13] = wdensl(l);
|
---|
241 | nt.Fill(xnt);
|
---|
242 | }
|
---|
243 |
|
---|
244 | cout<<"\n>>>> Ecriture"<<endl;
|
---|
245 | string tag = "cmvtstblack.ppf";
|
---|
246 | POutPersist pos(tag);
|
---|
247 | tag = "nt"; pos.PutObject(nt,tag);
|
---|
248 |
|
---|
249 | return 0;
|
---|
250 | }
|
---|
251 |
|
---|
252 | //---------------------------------------
|
---|
253 | void compute_xroot(void)
|
---|
254 | // Pour calculer les x qui donnent le maximum de f(x) pour:
|
---|
255 | // f(x) = x^n * exp(-x)
|
---|
256 | // ou
|
---|
257 | // f(x) = x^n / (exp(x)-1)
|
---|
258 | // ou
|
---|
259 | // f(x) = x^n * exp(x) / (exp(x)-1)^2
|
---|
260 | {
|
---|
261 | double n = 3.;
|
---|
262 | cout<<"n="<<n<<endl;
|
---|
263 | int npt=10;
|
---|
264 | double xmin=0.1,xmax=10., dx=(xmax-xmin)/npt;
|
---|
265 | for(int itry=0;itry<100;itry++) {
|
---|
266 | double x0=xmin, v0=-1e10;
|
---|
267 | for(double x=xmin;x<xmax+dx/2.; x+=dx) {
|
---|
268 | double f = pow(x,n) * exp(-x); // Wien ou dWein/dT
|
---|
269 | //double f = pow(x,n) / (exp(x)-1); // Planck
|
---|
270 | //double f = pow(x,n) * exp(x) / ((exp(x)-1)*(exp(x)-1)); // dPlanck/dT
|
---|
271 | if(f>v0) {v0=f; x0=x;}
|
---|
272 | }
|
---|
273 | printf("x0 = %.18f , v0=%.18f , dx=%e\n",x0,v0,dx);
|
---|
274 | xmin = x0-dx; xmax = x0+dx; dx=(xmax-xmin)/npt;
|
---|
275 | if(dx<1e-15) break;
|
---|
276 | }
|
---|
277 | }
|
---|
278 |
|
---|
279 |
|
---|
280 | /*
|
---|
281 | openppf cmvtstblack.ppf
|
---|
282 |
|
---|
283 | # Energie
|
---|
284 | set fac 1.
|
---|
285 | # Photon
|
---|
286 | set fac (6.6260693e-34*f)
|
---|
287 |
|
---|
288 | n/plot nt.log10(f)%log10(l)
|
---|
289 |
|
---|
290 | # radiance frequence
|
---|
291 | n/plot nt.prf/${fac}%log10(f) ! ! "nsta connectpoints"
|
---|
292 | n/plot nt.rrf/${fac}%log10(f) ! ! "nsta connectpoints red same"
|
---|
293 | n/plot nt.wrf/${fac}%log10(f) ! ! "nsta connectpoints blue same"
|
---|
294 |
|
---|
295 | # radiance longeur d'onde
|
---|
296 | n/plot nt.prl/${fac}%log10(l) ! ! "nsta connectpoints"
|
---|
297 | n/plot nt.rrl/${fac}%log10(l) ! ! "nsta connectpoints red same"
|
---|
298 | n/plot nt.wrl/${fac}%log10(l) ! ! "nsta connectpoints blue same"
|
---|
299 |
|
---|
300 | # densite frequence
|
---|
301 | n/plot nt.pdf/${fac}%log10(f) ! ! "nsta connectpoints"
|
---|
302 | n/plot nt.rdf/${fac}%log10(f) ! ! "nsta connectpoints red same"
|
---|
303 | n/plot nt.wdf/${fac}%log10(f) ! ! "nsta connectpoints blue same"
|
---|
304 |
|
---|
305 | # densite longeur d'onde
|
---|
306 | n/plot nt.pdl/${fac}%log10(l) ! ! "nsta connectpoints"
|
---|
307 | n/plot nt.rdl/${fac}%log10(l) ! ! "nsta connectpoints red same"
|
---|
308 | n/plot nt.wdl/${fac}%log10(l) ! ! "nsta connectpoints blue same"
|
---|
309 |
|
---|
310 | # Check: p(l)dl = p(f)df avec dl = c/f^2 df = l^2/c df
|
---|
311 | n/plot nt.prf%log10(f) ! ! "nsta connectpoints"
|
---|
312 | n/plot nt.prl*2.998e8/(f*f)%log10(f) ! ! "nsta connectpoints red same"
|
---|
313 |
|
---|
314 | */
|
---|