source: Sophya/trunk/Cosmo/SimLSS/cmvtstblack.cc@ 4043

Last change on this file since 4043 was 3572, checked in by cmv, 17 years ago

char* -> const char* pour regler les problemes de deprecated string const... + comparaison unsigned signed + suppression EVOL_PLANCK rz+cmv 07/02/2009

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