Index: trunk/Cosmo/SimLSS/cmvdefsurv.cc
===================================================================
--- trunk/Cosmo/SimLSS/cmvdefsurv.cc	(revision 3746)
+++ trunk/Cosmo/SimLSS/cmvdefsurv.cc	(revision 3749)
@@ -34,11 +34,6 @@
 inline double min22sr(double amin) {return amin*pow(min2rad(1.),2.);}
 
-double LargeurDoppler(double v /* km/s */, double nu);
-double DzFrV(double v /* km/s */, double zred);
-double DNuFrDz(double dzred,double nu_at_0,double zred);
-double DzFrDNu(double dnu_at_0,double nu_at_0,double zred);
-double DzFrDNuApprox(double dnu_at_0,double nu_at_0,double zred);
-double ZFrLos(double loscom /* Mpc com */,CosmoCalc& univ);
 double AngsolEqTelescope(double nu /* GHz */,double telsurf /* m^2 */);
+
 void usage(void);
 
@@ -258,5 +253,5 @@
  for(int i=0;i<3;i++) {
    double l = loscom[i]; if(l<=0.) l = dz/2.;
-   redshift[i]  = ZFrLos(l,univ);
+   redshift[i]  = univ.ZFrLos(l);
    unplusz[i]   = 1. + redshift[i];
    growthfac[i] = growth(redshift[i]);
@@ -792,70 +787,5 @@
 
 
-//-------------------------------------------------------------------------------------------
-double LargeurDoppler(double v, double nu)
-// largeur doppler pour une vitesse v en km/s et une frequence nu
-{
- return v / SpeedOfLight_Cst * nu;
-}
-
-double DzFrV(double v, double zred)
-// largeur en redshift pour une vitesse v en km/s au redshift zred
-{
-  return v / SpeedOfLight_Cst * (1. + zred);
-}
-
-double DNuFrDz(double dzred,double nu_at_0,double zred)
-// Largeur DNu pour une largeur en redshift "dzred" au redshift "zred"
-//    pour la frequence "nu_at_0" a z=0
-// nu =  NuHi(z=0)/(1.+z0)
-// dnu = NuHi(z=0)/(1.+z0-dz/2) - NuHi/(1.+z0+dz/2)
-//     = NuHi(z=0)*dz/[ (1+z0)^2 - (dz/2)^2 ]
-//     = NuHi(z=0)*dz/(1.+z0)^2 / [ 1 - [dz/(1+z0)/2)]^2 ]
-//     = NuHi(z=0)*dz/(1.+z0)^2 / [1 - dz/(1+z0)/2] / [1 + dz/(1+z0)/2]
-//    ~= NuHi(z=0)*dz/(1.+z0)^2   (approx. pour dz<<z0 a l'ordre (dz/z0)^2)
-{
-  double zp1 = 1.+zred;
-  return nu_at_0*dzred/(zp1*zp1)/(1.-dzred/zp1/2.)/(1.+dzred/zp1/2.);
-}
-
-double DzFrDNu(double dnu_at_0,double nu_at_0,double zred)
-// Largeur en redshift au redshift "zred" pour une largeur
-// en frequence "dnu_at_0" a la frequence "nu_at_0" a z=0
-{
-  if(dnu_at_0<=0.) return 0.;
-  double zp1 = 1.+zred;
-  double dnusnu0 = dnu_at_0/nu_at_0;
-  return 2./dnusnu0 * (sqrt(1.+(dnusnu0*zp1)*(dnusnu0*zp1)) - 1.);
-}
-double DzFrDNuApprox(double dnu_at_0,double nu_at_0,double zred)
-// idem DzFrDNu mais on utilise l'approximation: dnu=NuHi(z=0)*dz/(1.+z0)^2
-{
-  double zp1 = 1.+zred;
-  return dnu_at_0/nu_at_0 *(zp1*zp1);
-}
-
-double ZFrLos(double loscom,CosmoCalc& univ)
-// Recherche du redshift correspondant a une distance comobile
-// le long de la ligne de visee egale a "loscom" Mpc
-// et pour un univers "univ"
-{
-  double dz = univ.ZMax()/10.; if(dz<=0.) dz = 0.1;
-  double zmin=0., zmax=0.;
-  while(univ.Dloscom(zmax)<loscom) zmax += dz;
-  if(zmax==0.) return 0.;
-  for(int i=0; i<6; i++) {
-    zmin=zmax-dz; if(zmin<0.) zmin=0.;
-    dz /= 10.;
-    for(double z=zmin; z<zmax+dz; z+=dz) {
-      double d = univ.Dloscom(z);
-      if(d<loscom) continue;
-      zmax = z;
-      //cout<<"ZFrLos: z="<<zmax<<" d="<<d<<" / "<<loscom<<endl;
-      break;
-    }
-  }
-  return zmax;
-}
-
+//-----------------------------------------------------------------------------------
 double AngsolEqTelescope(double nu /* GHz */,double telsurf /* m^2 */)
 /*
Index: trunk/Cosmo/SimLSS/cosmocalc.cc
===================================================================
--- trunk/Cosmo/SimLSS/cosmocalc.cc	(revision 3746)
+++ trunk/Cosmo/SimLSS/cosmocalc.cc	(revision 3749)
@@ -364,4 +364,29 @@
 
   return oldum + z*z*(_Ocurv0 + z*(_Omatter0+z*_Orelat0));
+}
+
+//----------------------------------------------------------
+double CosmoCalc::ZFrLos(double loscom /* Mpc com */, int niter)
+// Recherche du redshift correspondant a une distance comobile
+// le long de la ligne de visee (radiale) egale a "loscom" Mpc
+// niter = nomber of iterations for precision measurement
+{
+  if(niter<3) niter = 6;
+  double dz = ZMax()/10.; if(dz<=0.) dz = 0.1;
+  double zmin=0., zmax=0.;
+  while(Dloscom(zmax)<loscom) zmax += dz;
+  if(zmax==0.) return 0.;
+  for(int i=0; i<niter; i++) {
+    zmin=zmax-dz; if(zmin<0.) zmin=0.;
+    dz /= 10.;
+    for(double z=zmin; z<zmax+dz; z+=dz) {
+      double d = Dloscom(z);
+      if(d<loscom) continue;
+      zmax = z;
+      //cout<<"ZFrLos: z="<<zmax<<" d="<<d<<" / "<<loscom<<endl;
+      break;
+    }
+  }
+  return zmax;
 }
 
@@ -457,3 +482,48 @@
 }
 
+//==========================================================================
+//==========================================================================
+//==========================================================================
+double LargeurDoppler(double v, double nu)
+// largeur doppler pour une vitesse v en km/s et une frequence nu
+{
+ return v / SpeedOfLight_Cst * nu;
+}
+
+double DzFrV(double v, double zred)
+// largeur en redshift pour une vitesse v en km/s au redshift zred
+{
+  return v / SpeedOfLight_Cst * (1. + zred);
+}
+
+double DNuFrDz(double dzred,double nu_at_0,double zred)
+// Largeur DNu pour une largeur en redshift "dzred" au redshift "zred"
+//    pour la frequence "nu_at_0" a z=0
+// nu =  NuHi(z=0)/(1.+z0)
+// dnu = NuHi(z=0)/(1.+z0-dz/2) - NuHi/(1.+z0+dz/2)
+//     = NuHi(z=0)*dz/[ (1+z0)^2 - (dz/2)^2 ]
+//     = NuHi(z=0)*dz/(1.+z0)^2 / [ 1 - [dz/(1+z0)/2)]^2 ]
+//     = NuHi(z=0)*dz/(1.+z0)^2 / [1 - dz/(1+z0)/2] / [1 + dz/(1+z0)/2]
+//    ~= NuHi(z=0)*dz/(1.+z0)^2   (approx. pour dz<<z0 a l'ordre (dz/z0)^2)
+{
+  double zp1 = 1.+zred;
+  return nu_at_0*dzred/(zp1*zp1)/(1.-dzred/zp1/2.)/(1.+dzred/zp1/2.);
+}
+
+double DzFrDNu(double dnu_at_0,double nu_at_0,double zred)
+// Largeur en redshift au redshift "zred" pour une largeur
+// en frequence "dnu_at_0" a la frequence "nu_at_0" a z=0
+{
+  if(dnu_at_0<=0.) return 0.;
+  double zp1 = 1.+zred;
+  double dnusnu0 = dnu_at_0/nu_at_0;
+  return 2./dnusnu0 * (sqrt(1.+(dnusnu0*zp1)*(dnusnu0*zp1)) - 1.);
+}
+double DzFrDNuApprox(double dnu_at_0,double nu_at_0,double zred)
+// idem DzFrDNu mais on utilise l'approximation: dnu=NuHi(z=0)*dz/(1.+z0)^2
+{
+  double zp1 = 1.+zred;
+  return dnu_at_0/nu_at_0 *(zp1*zp1);
+}
+
 }  // Fin namespace SOPHYA
Index: trunk/Cosmo/SimLSS/cosmocalc.h
===================================================================
--- trunk/Cosmo/SimLSS/cosmocalc.h	(revision 3746)
+++ trunk/Cosmo/SimLSS/cosmocalc.h	(revision 3749)
@@ -57,4 +57,6 @@
   double Vol4Pi(double z1,double z2);
 
+  double ZFrLos(double loscom /* Mpc com */, int niter=6);
+
   void Print(double z=0.);
 
@@ -96,4 +98,13 @@
 };
 
+//-----------------------------------------------------------------------------------
+double LargeurDoppler(double v /* km/s */, double nu);
+double DzFrV(double v /* km/s */, double zred);
+double DNuFrDz(double dzred,double nu_at_0,double zred);
+double DzFrDNu(double dnu_at_0,double nu_at_0,double zred);
+double DzFrDNuApprox(double dnu_at_0,double nu_at_0,double zred);
+
+//-----------------------------------------------------------------------------------
+
 } // Fin du namespace SOPHYA
 
