Exemplo n.º 1
0
int pinside::inside(double x, double y, const ubvector &xa,
		    const ubvector &ya) {

  int N=xa.size(), ix;
  point t, *p=new point[N+1];
  t.x=x;
  t.y=y;

  // We have to copy the vectors so we can rearrange them because
  // they are const
  ubvector xb(N), yb(N);
  vector_copy(N,xa,xb);
  vector_copy(N,ya,yb);

  // Ensure that (yb[0],ya[0]) is the point with the smallest x
  // coordinate among all the points with the smallest y coordinate
  double xmin=xb[0];
  double ymin=yb[0];
  ix=0;
  for(int i=0;i<N;i++) {
    if (yb[i]<ymin) {
      ymin=yb[i];
      ix=i;
    }
  }
  for(int i=0;i<N;i++) {
    if (yb[i]==ymin && xb[i]<xmin) {
      xmin=xb[i];
      ix=i;
    }
  }
  vector_rotate<ubvector,double>(N,xb,ix);
  vector_rotate<ubvector,double>(N,yb,ix);

  // Copy to p[]
  for(int i=0;i<N;i++) {
    p[i+1].x=xb[i];
    p[i+1].y=yb[i];
  }
    
  int ret=inside(t,p,N);
  delete[] p;

  return ret;
}
Exemplo n.º 2
0
int bamr_class::fill(const ubvector &pars, double weight, 
		     std::vector<double> &line, model_data &dat) {

  model &m=*this->mod;

  size_t n_params=pars.size();
  
  double nbmax2=0.0, emax=0.0, pmax=0.0, nbmax=0.0, mmax=0.0, rmax=0.0;

  if (m.has_eos) {

    // The central energy density in the maximum mass configuration
    emax=dat.mvsr.max("ed");
    // The central pressure in the maximum mass configuration
    pmax=dat.mvsr.max("pr");
    // The maximum mass
    mmax=dat.mvsr.get_constant("m_max");
    // The radius of the maximum mass star
    rmax=dat.mvsr.get_constant("r_max");

    if (set->baryon_density) {

      // The highest baryon density in the EOS table
      nbmax2=dat.eos.max("nb");
      // The central baryon density in the maximum mass configuration
      nbmax=dat.mvsr.get_constant("nb_max");
      
    }

  } else {
    // Need to set mmax for no EOS models to figure out how 
    // high up we should go for the radius grid 
    mmax=3.0;
  }

  for(size_t i=0;i<nsd->n_sources;i++) {
    line.push_back(dat.wgts[i]);
  }
  for(size_t i=0;i<nsd->n_sources;i++) {
    line.push_back(dat.rad[i]);
  }
  for(size_t i=0;i<nsd->n_sources;i++) {
    line.push_back(dat.mass[i]);
  }
  
  if (m.has_eos) {
    for(int i=0;i<set->grid_size;i++) {
      double eval=m.e_grid[i];
      // Make sure the energy density from the grid
      // isn't beyond the table limit
      double emax2=dat.eos.max("ed");
      if (eval<emax2) {
	double pres_temp=dat.eos.interp("ed",eval,"pr");
	//if (pres_temp<pmax) {
	line.push_back(pres_temp);
	//} else {
	//line.push_back(0.0);
	//}
      } else {
	line.push_back(0.0);
      }
    }
  }

  // It is important here that all of these columns which store values
  // over a grid are either always positive or always negative,
  // because the code reports zero in the fill_line() function for
  // values beyond the end of the EOS or the M-R curve. 
  for(int i=0;i<set->grid_size;i++) {
    double mval=m.m_grid[i];
    if (mval<mmax) {
      line.push_back(dat.mvsr.interp("gm",mval,"r"));
      if (m.has_eos) {
	line.push_back(dat.mvsr.interp("gm",mval,"pr"));
      }
    } else {
      line.push_back(0.0);
      if (m.has_eos) {
	line.push_back(0.0);
      }
    }
  }
  if (m.has_eos) {
    if (set->baryon_density) {
      for(int i=0;i<set->grid_size;i++) {
	double nbval=m.nb_grid[i];
	if (nbval<nbmax2) {
	  double pres_temp=dat.eos.interp("nb",nbval,"pr");
	  if (pres_temp<pmax) {
	    line.push_back(pres_temp);
	  } else {
	    line.push_back(0.0);
	  }
	  double eval2=dat.eos.interp("nb",nbval,"ed");
	  double eoa_val2=eval2/nbval-939.0/o2scl_const::hc_mev_fm;
	  line.push_back(eoa_val2);
	} else {
	  line.push_back(0.0);
	  line.push_back(0.0);
	}
      }
    }
    if (m.has_esym) {
      line.push_back(dat.eos.get_constant("S"));
      line.push_back(dat.eos.get_constant("L"));
    }
    line.push_back(rmax);
    line.push_back(mmax);
    line.push_back(pmax);
    line.push_back(emax);
    if (set->baryon_density) line.push_back(nbmax);
    for(size_t i=0;i<nsd->n_sources;i++) {
      double val=dat.mvsr.interp
	("gm",pars[n_params-nsd->n_sources+i],"ed");
      line.push_back(val);
    }
    if (set->baryon_density) {
      for(size_t i=0;i<nsd->n_sources;i++) {
	double val2=dat.mvsr.interp
	  ("gm",pars[n_params-nsd->n_sources+i],"nb");
	line.push_back(val2);
      }
    }
  }
  
  if (set->baryon_density) {
    line.push_back(dat.mvsr.get_constant("gm_nb1"));
    line.push_back(dat.mvsr.get_constant("r_nb1"));
    line.push_back(dat.mvsr.get_constant("gm_nb2"));
    line.push_back(dat.mvsr.get_constant("r_nb2"));
    line.push_back(dat.mvsr.get_constant("gm_nb3"));
    line.push_back(dat.mvsr.get_constant("r_nb3"));
    line.push_back(dat.mvsr.get_constant("gm_nb4"));
    line.push_back(dat.mvsr.get_constant("r_nb4"));
    line.push_back(dat.mvsr.get_constant("gm_nb5"));
    line.push_back(dat.mvsr.get_constant("r_nb5"));
  }
  if (set->compute_cthick) {
    line.push_back(dat.eos.get_constant("nt"));
    line.push_back(dat.eos.get_constant("prt"));
    for(int i=0;i<set->grid_size;i++) {
      double mval=m.m_grid[i];
      if (mval<mmax) {
	double rval=dat.mvsr.interp("gm",mval,"r");
	line.push_back(rval-dat.mvsr.interp("gm",mval,"r0"));
      } else {
	line.push_back(0.0);
      }
    }
  }
  if (set->addl_quants) {
    cout << "1: " << mmax << " " << dat.mvsr.get_constant("m_max") << endl;
    exit(-1);
    mmax=dat.mvsr.get_constant("m_max");
    for(int i=0;i<set->grid_size;i++) {
      double mval=m.m_grid[i];

      if (mval<mmax) {
	
	// Baryonic mass
	double bm=dat.mvsr.interp("gm",mval,"bm");
	line.push_back(bm);

	// Binding energy
	line.push_back(bm-mval);

	// Moment of inertia
	double rad=dat.mvsr.interp("gm",mval,"r");
	// rjw is km^4, so dividing by km/Msun gives Msun*km^2
	double I=dat.mvsr.interp("gm",mval,"rjw")/3.0/schwarz_km;
	line.push_back(I);

	// To compute I_bar, divide by G^2*M^3
	double I_bar=I*4.0/schwarz_km/schwarz_km/mval/mval/mval;
	line.push_back(I_bar);

	/*
	// Relation for lambda given I from Kent Yagi based
	// on Yagi and Yunes, Science, (2014)
	double a0=-210.327;
	double a1=481.472;
	double a2=-464.271;
	double a3=241.564;
	double a4=-70.6449;
	double a5=10.9775;
	double a6=-0.707066;
	*/
	
	// Jim's fit from Steiner, Lattimer, and Brown (2016)
	double b0=-30.5395;
	double b1=38.3931;
	double b2=-16.3071;
	double b3=3.36972;
	double b4=-0.26105;
    
	double li=log(I_bar);
	double li2=li*li;
	double li3=li*li2;
	double li4=li*li3;
	
	double Lambda_bar=exp(b0+b1*li+b2*li2+b3*li3+b4*li4);

	line.push_back(Lambda_bar);
	
      } else {
	line.push_back(0.0);
	line.push_back(0.0);
	line.push_back(0.0);
	line.push_back(0.0);
	line.push_back(0.0);
      }
    }
  }
  if (nsd->source_fnames_alt.size()>0) {
    for(size_t i=0;i<nsd->n_sources;i++) {
      // Compute alternate probability from an insignificant bit
      // in the mass 
      double alt=dat.mass[i]*1.0e8-((double)((int)(dat.mass[i]*1.0e8)));
      if (alt<2.0/3.0) {
	line.push_back(0.0);
      } else {
	line.push_back(1.0);
      }
    }
  }

  return o2scl::success;
}