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

Last change on this file since 3283 was 3248, checked in by cmv, 18 years ago

correction erreur format dans sscanf cmv 15/05/2007

File size: 11.7 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 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],"%hu",&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//---------------------------------------
253void 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/*
281openppf cmvtstblack.ppf
282
283# Energie
284set fac 1.
285# Photon
286set fac (6.6260693e-34*f)
287
288n/plot nt.log10(f)%log10(l)
289
290# radiance frequence
291n/plot nt.prf/${fac}%log10(f) ! ! "nsta connectpoints"
292n/plot nt.rrf/${fac}%log10(f) ! ! "nsta connectpoints red same"
293n/plot nt.wrf/${fac}%log10(f) ! ! "nsta connectpoints blue same"
294
295# radiance longeur d'onde
296n/plot nt.prl/${fac}%log10(l) ! ! "nsta connectpoints"
297n/plot nt.rrl/${fac}%log10(l) ! ! "nsta connectpoints red same"
298n/plot nt.wrl/${fac}%log10(l) ! ! "nsta connectpoints blue same"
299
300# densite frequence
301n/plot nt.pdf/${fac}%log10(f) ! ! "nsta connectpoints"
302n/plot nt.rdf/${fac}%log10(f) ! ! "nsta connectpoints red same"
303n/plot nt.wdf/${fac}%log10(f) ! ! "nsta connectpoints blue same"
304
305# densite longeur d'onde
306n/plot nt.pdl/${fac}%log10(l) ! ! "nsta connectpoints"
307n/plot nt.rdl/${fac}%log10(l) ! ! "nsta connectpoints red same"
308n/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
311n/plot nt.prf%log10(f) ! ! "nsta connectpoints"
312n/plot nt.prl*2.998e8/(f*f)%log10(f) ! ! "nsta connectpoints red same"
313
314 */
Note: See TracBrowser for help on using the repository browser.