[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 |
|
---|
| 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 | */
|
---|