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

Last change on this file since 3154 was 3115, checked in by ansari, 19 years ago

Creation initiale du groupe Cosmo avec le repertoire SimLSS de
simulation de distribution de masse 3D des galaxies par CMV+Rz
18/12/2006

File size: 11.7 KB
RevLine 
[3115]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
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],"%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//---------------------------------------
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.