| 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 "cosmocalc.h" | 
|---|
| 14 | #include "geneutils.h" | 
|---|
| 15 |  | 
|---|
| 16 | void tstprint(CosmoCalc& univ,double z1,double z2,double dz); | 
|---|
| 17 | void tstprint(CosmoCalc& univ1,CosmoCalc& univ2,double z1,double z2,double dz); | 
|---|
| 18 | void tstspeed(CosmoCalc& univ,double z1,double z2,double dz); | 
|---|
| 19 | void tstntuple(CosmoCalc& univ,double z1,double z2,double dz); | 
|---|
| 20 | void tstinterp(CosmoCalc& univ,double z1,double z2,double dz); | 
|---|
| 21 |  | 
|---|
| 22 | const double deg2rad = M_PI/180.; | 
|---|
| 23 |  | 
|---|
| 24 | void usage(void); | 
|---|
| 25 | void usage(void) { | 
|---|
| 26 | cout | 
|---|
| 27 | <<"cmvtuniv [options] z1,z2"<<endl | 
|---|
| 28 | <<"  -D dz"<<endl | 
|---|
| 29 | <<"  -U h100,om0,or0,ol0,w0"<<endl | 
|---|
| 30 | <<"  -F flat(0,1,2)"<<endl | 
|---|
| 31 | <<"  -I perc,dzinc,dzmax,glorder"<<endl | 
|---|
| 32 | <<" --- What has to be done:"<<endl | 
|---|
| 33 | <<"  -W 1/2/3/4/5"<<endl | 
|---|
| 34 | <<"     1 : print info from z1 to z2 by step dz"<<endl | 
|---|
| 35 | <<"     2 : compare with/without spline from z1 to z2 by step dz"<<endl | 
|---|
| 36 | <<"     3 : test speed from z1 to z2 by step dz"<<endl | 
|---|
| 37 | <<"     4 : fill ntuple with infos from z1 to z2 by step dz"<<endl | 
|---|
| 38 | <<"     5 : test interpolation loscom from z1 to z2 by step dz"<<endl | 
|---|
| 39 | <<endl; | 
|---|
| 40 | } | 
|---|
| 41 |  | 
|---|
| 42 | int main(int narg,char *arg[]) | 
|---|
| 43 | { | 
|---|
| 44 | unsigned short flat = 0; | 
|---|
| 45 | // -- WMAP | 
|---|
| 46 | double h100=0.71, om0=0.267804, or0=7.9e-05, ol0=0.73,w0=-1.; | 
|---|
| 47 | // -- ouvert matter only | 
|---|
| 48 | //double h100=0.71, om0=0.3, or0=0., ol0=0.,w0=-1.; | 
|---|
| 49 | // -- plat matter only | 
|---|
| 50 | //double h100=0.71, om0=1., or0=0., ol0=0.,w0=-1.; flat = 1; | 
|---|
| 51 | // -- plat lambda only | 
|---|
| 52 | //double h100=0.71, om0=0., or0=0., ol0=1.,w0=-1.; flat = 2; | 
|---|
| 53 |  | 
|---|
| 54 | // -- parametre d'integration | 
|---|
| 55 | double perc=0.01,dzinc=-1.,dzmax=-1.; | 
|---|
| 56 | unsigned short glorder=4; | 
|---|
| 57 | // -- redshift | 
|---|
| 58 | double z1=0., z2=-1., dz=-1.; | 
|---|
| 59 | // -- Work to be done | 
|---|
| 60 | int todo = 1; | 
|---|
| 61 |  | 
|---|
| 62 | InitTim(); | 
|---|
| 63 |  | 
|---|
| 64 | // Read arguments | 
|---|
| 65 | char c; | 
|---|
| 66 | while ((c = getopt(narg, arg, "hD:U:F:I:W:")) != -1) { | 
|---|
| 67 | switch (c) { | 
|---|
| 68 | case 'D' : | 
|---|
| 69 | sscanf(optarg,"%lf",&dz); | 
|---|
| 70 | break; | 
|---|
| 71 | case 'U' : | 
|---|
| 72 | sscanf(optarg,"%lf,%lf,%lf,%lf,%lf",&h100,&om0,&or0,&ol0,&w0); | 
|---|
| 73 | break; | 
|---|
| 74 | case 'F' : | 
|---|
| 75 | sscanf(optarg,"%hu",&flat); | 
|---|
| 76 | break; | 
|---|
| 77 | case 'I' : | 
|---|
| 78 | sscanf(optarg,"%lf,%lf,%lf,%hu",&perc,&dzinc,&dzmax,&glorder); | 
|---|
| 79 | break; | 
|---|
| 80 | case 'W' : | 
|---|
| 81 | sscanf(optarg,"%d",&todo); | 
|---|
| 82 | break; | 
|---|
| 83 | case 'h' : | 
|---|
| 84 | default: | 
|---|
| 85 | usage(); | 
|---|
| 86 | return -1; | 
|---|
| 87 | } | 
|---|
| 88 | } | 
|---|
| 89 | if(optind<narg) sscanf(arg[optind],"%lf,%lf",&z1,&z2); | 
|---|
| 90 |  | 
|---|
| 91 | if(z1<0.) z1 = 0.; | 
|---|
| 92 | if(z2<=z1) z2 = z1+1.; | 
|---|
| 93 | if(dz<=0.) dz = 10.*(z2-z1); | 
|---|
| 94 | cout<<"z1="<<z1<<"  z2="<<z2<<"  dz="<<dz<<endl; | 
|---|
| 95 | cout<<"perc="<<perc<<" dzinc="<<dzinc<<" dzmax="<<dzmax<<" glorder="<<glorder<<endl; | 
|---|
| 96 | cout<<"h100="<<h100<<" om0="<<om0<<" or0="<<or0<<" ol0="<<ol0<<" w0="<<w0<<" flat="<<flat<<endl; | 
|---|
| 97 | cout<<"todo ="<<todo<<endl; | 
|---|
| 98 |  | 
|---|
| 99 | CosmoCalc univ1(flat,true,z2); | 
|---|
| 100 | univ1.SetInteg(perc,dzinc,dzmax,glorder); | 
|---|
| 101 | univ1.SetDynParam(h100,om0,or0,ol0,w0); | 
|---|
| 102 | univ1.PrtInteg(); | 
|---|
| 103 | univ1.Print(); | 
|---|
| 104 | cout<<endl; | 
|---|
| 105 |  | 
|---|
| 106 | if(todo==1)  tstprint(univ1,z1,z2,dz); | 
|---|
| 107 | else if(todo==2) { | 
|---|
| 108 | CosmoCalc univ2(flat,false,z2); | 
|---|
| 109 | univ2.SetInteg(perc,dzinc,dzmax,glorder); | 
|---|
| 110 | univ2.SetDynParam(h100,om0,or0,ol0,w0); | 
|---|
| 111 | univ2.PrtInteg(); | 
|---|
| 112 | univ2.Print(); | 
|---|
| 113 | tstprint(univ1,univ2,z1,z2,dz); | 
|---|
| 114 | } | 
|---|
| 115 | else if(todo==3) tstspeed(univ1,z1,z2,dz); | 
|---|
| 116 | else if(todo==4) tstntuple(univ1,z1,z2,dz); | 
|---|
| 117 | else if(todo==5)tstinterp(univ1,z1,z2,dz); | 
|---|
| 118 | else cout<<"Unknown job to be done !!!!!  todo="<<todo<<endl; | 
|---|
| 119 |  | 
|---|
| 120 | return 0; | 
|---|
| 121 | } | 
|---|
| 122 |  | 
|---|
| 123 | /* ----------------------------------------------------- */ | 
|---|
| 124 | void tstprint(CosmoCalc& univ,double z1,double z2,double dz) | 
|---|
| 125 | { | 
|---|
| 126 | if(dz>z2-z1) dz = z2-z1; | 
|---|
| 127 | double fz1 = 1000.*Fr_HyperFin_Par/(1.+z1); | 
|---|
| 128 | double fz1pdz = 1000.*Fr_HyperFin_Par/(1.+z1+dz); | 
|---|
| 129 | double fz2 = 1000.*Fr_HyperFin_Par/(1.+z2); | 
|---|
| 130 | double fz2pdz = 1000.*Fr_HyperFin_Par/(1.+z2+dz); | 
|---|
| 131 | cout<<"\nTSTPRINT(): z1="<<z1<<" z2="<<z2<<" dz="<<dz<<endl; | 
|---|
| 132 | cout<<"  "<<fz1<<" -> "<<fz2<<" MHz,    df: "<<fz1-fz1pdz<<" , "<<fz2-fz2pdz<<" MHz"<<endl; | 
|---|
| 133 | for(double z=z1;z<z2+dz/2.;z+=dz) { | 
|---|
| 134 | cout<<"\n-- z = "<<z<<"      ("<<1000.*Fr_HyperFin_Par/(1.+z)<<" MHz)"<<endl; | 
|---|
| 135 | univ.Print(z); | 
|---|
| 136 | cout<<"Volume comoving in [z,z+"<<dz<<"] for 4Pi sr: " | 
|---|
| 137 | <<univ.Vol4Pi(z,z+dz)<<" Mpc^3"<<endl; | 
|---|
| 138 | double dang = univ.Dang(z); | 
|---|
| 139 | double a = deg2rad/3600.; | 
|---|
| 140 | cout<<"1\" -> "<<dang*a<<" Mpc = "<<dang*a*(1.+z)<<" Mpc com"<<endl; | 
|---|
| 141 | a = deg2rad/60.; | 
|---|
| 142 | cout<<"1\' -> "<<dang*a<<" Mpc = "<<dang*a*(1.+z)<<" Mpc com"<<endl; | 
|---|
| 143 | a = deg2rad; | 
|---|
| 144 | cout<<"1d -> "<<dang*a<<" Mpc = "<<dang*a*(1.+z)<<" Mpc com"<<endl; | 
|---|
| 145 | double dloscom = univ.Dhubble() / univ.E(z); | 
|---|
| 146 | cout<<"dLOScom/dz -> "<<dloscom<<" Mpc com"<<endl; | 
|---|
| 147 | } | 
|---|
| 148 |  | 
|---|
| 149 | } | 
|---|
| 150 |  | 
|---|
| 151 | /* ----------------------------------------------------- */ | 
|---|
| 152 | void tstprint(CosmoCalc& univ1,CosmoCalc& univ2,double z1,double z2,double dz) | 
|---|
| 153 | { | 
|---|
| 154 | if(dz>z2-z1) dz = z2-z1; | 
|---|
| 155 | cout<<"\nTSTPRINT(): z1="<<z1<<" z2="<<z2<<" dz="<<dz<<endl; | 
|---|
| 156 | for(double z=z1;z<z2+dz/2.;z+=dz) { | 
|---|
| 157 | cout<<endl<<"--spline: z = "<<z<<endl; | 
|---|
| 158 | univ1.Print(z); | 
|---|
| 159 | cout<<"Volume comoving in [z,z+dz] for 4Pi sr: " | 
|---|
| 160 | <<univ1.Vol4Pi(z,z+dz)<<" Mpc^3"<<endl; | 
|---|
| 161 | cout<<"--integ: z = "<<z<<endl; | 
|---|
| 162 | univ2.Print(z); | 
|---|
| 163 | cout<<"Volume comoving in [z,z+dz] for 4Pi sr: " | 
|---|
| 164 | <<univ2.Vol4Pi(z,z+dz)<<" Mpc^3"<<endl; | 
|---|
| 165 | } | 
|---|
| 166 | } | 
|---|
| 167 |  | 
|---|
| 168 | /* ----------------------------------------------------- */ | 
|---|
| 169 | void tstspeed(CosmoCalc& univ,double z1,double z2,double dz) | 
|---|
| 170 | { | 
|---|
| 171 | if(dz>z2-z1) dz = z2-z1; | 
|---|
| 172 | cout<<"\nTSTSPEED(): z1="<<z1<<" z2="<<z2<<" dz="<<dz<<endl; | 
|---|
| 173 | double sum = 0.; | 
|---|
| 174 | int_4 n=0; | 
|---|
| 175 | PrtTim("-- Beginning"); | 
|---|
| 176 | for(double z=z1;z<z2+dz/2.;z+=dz) { | 
|---|
| 177 | sum += univ.Dang(z); | 
|---|
| 178 | n++; | 
|---|
| 179 | } | 
|---|
| 180 | if(n>0) cout<<"n="<<n<<" ...dum="<<sum/n<<endl; | 
|---|
| 181 | PrtTim("-- Ending"); | 
|---|
| 182 | } | 
|---|
| 183 |  | 
|---|
| 184 | /* ----------------------------------------------------- */ | 
|---|
| 185 | void tstntuple(CosmoCalc& univ,double z1,double z2,double dz) | 
|---|
| 186 | { | 
|---|
| 187 | if(dz>z2-z1) dz = z2-z1; | 
|---|
| 188 | cout<<"\nTSTNTUPLE(): z1="<<z1<<" z2="<<z2<<" dz="<<dz<<endl; | 
|---|
| 189 | double norm =  univ.Dhubble();  // 1. | 
|---|
| 190 | double norm3 = pow(norm,3.); | 
|---|
| 191 | const int n = 15; | 
|---|
| 192 | const char *vname[n] = { | 
|---|
| 193 | "z","hz","om","or","ol","ok","ot","ob", | 
|---|
| 194 | "dtc","dlc","da","dl", | 
|---|
| 195 | "dvc","vc0","vcdz" | 
|---|
| 196 | }; | 
|---|
| 197 | NTuple nt(n,vname); | 
|---|
| 198 | double xnt[n]; | 
|---|
| 199 | for(double z=z1;z<z2+dz/2.;z+=dz) { | 
|---|
| 200 | xnt[0]  = z; | 
|---|
| 201 | xnt[1]  = univ.H(z); | 
|---|
| 202 | xnt[2]  = univ.Omatter(z); | 
|---|
| 203 | xnt[3]  = univ.Orelat(z); | 
|---|
| 204 | xnt[4]  = univ.Olambda(z); | 
|---|
| 205 | xnt[5]  = univ.Ocurv(z); | 
|---|
| 206 | xnt[6]  = univ.Otot(z); | 
|---|
| 207 | xnt[7]  = univ.Obaryon(z); | 
|---|
| 208 | xnt[8]  = univ.Dtrcom(z)/norm; | 
|---|
| 209 | xnt[9]  = univ.Dloscom(z)/norm; | 
|---|
| 210 | xnt[10] = univ.Dang(z)/norm; | 
|---|
| 211 | xnt[11] = univ.Dlum(z)/norm; | 
|---|
| 212 | xnt[12] = univ.dVol(z)/norm3; | 
|---|
| 213 | xnt[13] = univ.Vol4Pi(z)/norm3; | 
|---|
| 214 | xnt[14] = univ.Vol4Pi(z,z+dz)/norm3; | 
|---|
| 215 | nt.Fill(xnt); | 
|---|
| 216 | } | 
|---|
| 217 | cout<<">>>> Ecriture"<<endl; | 
|---|
| 218 | string tag = "cmvtuniv_nt.ppf"; | 
|---|
| 219 | POutPersist pos(tag); | 
|---|
| 220 | tag = "nt"; pos.PutObject(nt,tag); | 
|---|
| 221 | } | 
|---|
| 222 |  | 
|---|
| 223 |  | 
|---|
| 224 | /* | 
|---|
| 225 | openppf cmvtuniv_nt.ppf | 
|---|
| 226 |  | 
|---|
| 227 | set cut 1 | 
|---|
| 228 | set cut z<100. | 
|---|
| 229 | set cut z<10. | 
|---|
| 230 |  | 
|---|
| 231 | zone | 
|---|
| 232 | n/plot nt.hz%z $cut ! "nsta connectpoints" | 
|---|
| 233 |  | 
|---|
| 234 | zone | 
|---|
| 235 | n/plot nt.dl%z $cut ! "nsta connectpoints" | 
|---|
| 236 | n/plot nt.da%z $cut ! "nsta connectpoints same red" | 
|---|
| 237 | n/plot nt.dtc%z $cut ! "nsta connectpoints same blue" | 
|---|
| 238 | n/plot nt.dlc%z $cut ! "nsta connectpoints same green" | 
|---|
| 239 |  | 
|---|
| 240 | zone 2 2 | 
|---|
| 241 | n/plot nt.dvc%z $cut ! "nsta connectpoints" | 
|---|
| 242 | n/plot nt.vc0%z $cut ! "nsta connectpoints" | 
|---|
| 243 | n/plot nt.vcdz%z $cut ! "nsta connectpoints" | 
|---|
| 244 |  | 
|---|
| 245 | zone | 
|---|
| 246 | n/plot nt.ot%z $cut ! "nsta connectpoints" | 
|---|
| 247 | n/plot nt.om%z $cut ! "nsta connectpoints same blue" | 
|---|
| 248 | n/plot nt.or%z $cut ! "nsta connectpoints same red" | 
|---|
| 249 | n/plot nt.ol%z $cut ! "nsta connectpoints same green" | 
|---|
| 250 | n/plot nt.ok%z $cut ! "nsta connectpoints same orange" | 
|---|
| 251 |  | 
|---|
| 252 | */ | 
|---|
| 253 |  | 
|---|
| 254 | /* ----------------------------------------------------- */ | 
|---|
| 255 | void tstinterp(CosmoCalc& univ,double z1,double z2,double dz) | 
|---|
| 256 | { | 
|---|
| 257 | if(dz>z2-z1) dz = z2-z1; | 
|---|
| 258 | cout<<"\nTSTINTERP(): z1="<<z1<<" z2="<<z2<<" dz="<<dz<<endl; | 
|---|
| 259 | // On remplit les donnes completes | 
|---|
| 260 | vector<double> Z,D; | 
|---|
| 261 | for(double z=z1;z<z2+dz/2.;z+=dz) { | 
|---|
| 262 | Z.push_back(z); | 
|---|
| 263 | D.push_back(univ.Dloscom(z)); | 
|---|
| 264 | } | 
|---|
| 265 | // On remplit un sous tableau | 
|---|
| 266 | int ninc = 5; | 
|---|
| 267 | vector<double> Dinterp; | 
|---|
| 268 | double zmin = Z[0], zmax = Z[0]; | 
|---|
| 269 | for(unsigned int i=0;i<Z.size();i+=ninc) { | 
|---|
| 270 | Dinterp.push_back(D[i]); | 
|---|
| 271 | zmax = Z[i]; | 
|---|
| 272 | } | 
|---|
| 273 | InterpFunc interp(zmin,zmax,Dinterp); | 
|---|
| 274 | unsigned short ok; | 
|---|
| 275 |  | 
|---|
| 276 | const int n = 8; | 
|---|
| 277 | const char *vname[n] = {"z","d","di","dl","dp","zi","zl","zp"}; | 
|---|
| 278 | NTuple nt(n,vname); | 
|---|
| 279 | double xnt[n]; | 
|---|
| 280 |  | 
|---|
| 281 | for(unsigned int i=0;i<Z.size();i++) { | 
|---|
| 282 | if(Z[i]>zmax) break; | 
|---|
| 283 | xnt[0] = Z[i]; | 
|---|
| 284 | xnt[1] = D[i]; | 
|---|
| 285 | xnt[2] = interp(Z[i]); | 
|---|
| 286 | xnt[3] = interp.Linear(Z[i],ok); | 
|---|
| 287 | xnt[4] = interp.Parab(Z[i],ok); | 
|---|
| 288 | xnt[5] = xnt[6] = xnt[7] = 0.; | 
|---|
| 289 | nt.Fill(xnt); | 
|---|
| 290 | } | 
|---|
| 291 | cout<<">>>> Ecriture"<<endl; | 
|---|
| 292 | string tag = "cmvtuniv_int.ppf"; | 
|---|
| 293 | POutPersist pos(tag); | 
|---|
| 294 | tag = "nt"; pos.PutObject(nt,tag); | 
|---|
| 295 | } | 
|---|
| 296 |  | 
|---|
| 297 | /* | 
|---|
| 298 | openppf cmvtuniv_int.ppf | 
|---|
| 299 |  | 
|---|
| 300 | n/plot nt.d%z ! ! "nsta connectpoints" | 
|---|
| 301 | n/plot nt.di%z ! ! "nsta connectpoints same green" | 
|---|
| 302 | n/plot nt.dl%z ! ! "nsta connectpoints same red" | 
|---|
| 303 | n/plot nt.dp%z ! ! "nsta connectpoints same blue" | 
|---|
| 304 |  | 
|---|
| 305 | n/plot nt.di-d%z ! ! "nsta connectpoints green" | 
|---|
| 306 | n/plot nt.dl-d%z ! ! "nsta connectpoints same red" | 
|---|
| 307 | n/plot nt.dp-d%z ! ! "nsta connectpoints same blue" | 
|---|
| 308 |  | 
|---|
| 309 | n/plot nt.(di-d)/d%z d>0 ! "nsta connectpoints green" | 
|---|
| 310 | n/plot nt.(dl-d)/d%z d>0 ! "nsta connectpoints same red" | 
|---|
| 311 | n/plot nt.(dp-d)/d%z d>0 ! "nsta connectpoints same blue" | 
|---|
| 312 |  | 
|---|
| 313 | */ | 
|---|