vector<Extensive> MonopoleSelfGravity::operator()
  (const Tessellation& tess,
   const PhysicalGeometry& /*pg*/,
   const CacheData& cd,
   const vector<ComputationalCell>& cells,
   const vector<Extensive>& /*fluxes*/,
   const vector<Vector2D>& /*point_velocities*/,
   const double /*t*/) const
{
  const vector<double> mass_sample =
    calc_mass_in_shells(calc_mass_radius_list(tess,cells,cd),
			sample_radii_);
  const Interpolator radius_mass_interp(sample_radii_,
					mass_sample);

  vector<Extensive> res(static_cast<size_t>(tess.GetPointNo()));
  for(size_t i=0;i<res.size();++i){
    if(cells[i].stickers.find("ghost")->second)
      continue;
    const Vector2D r = tess.GetCellCM(static_cast<int>(i));
    const double radius = abs(r);
    const double mass = radius_mass_interp(radius)*section2shell_;
    const Vector2D acc = (-1)*gravitation_constant_*r*mass/pow(radius,3);
    const double volume = cd.volumes[i];
    res[i].mass = 0;
    res[i].momentum = volume*cells[i].density*acc;
    res[i].energy = volume*cells[i].density*ScalarProd(acc,cells[i].velocity);
  }
  return res;
}
vector<ComputationalCell> CustomCellUpdater::operator()
(const Tessellation& /*tess*/,
 const PhysicalGeometry& /*pg*/,
 const EquationOfState& eos,
 vector<Extensive>& extensives,
 const vector<ComputationalCell>& old,
 const CacheData& cd,
 const TracerStickerNames& /*tsn*/) const
{
  vector<ComputationalCell> res = old;
  for(size_t i=0;i<extensives.size();++i){
    if(old[i].stickers.front())
      continue;
    const double volume = cd.volumes[i];
    res[i].density = extensives[i].mass/volume;
    res[i].velocity = extensives[i].momentum / extensives[i].mass;
    const double total_energy = extensives[i].energy/extensives[i].mass;
    const double kinetic_energy =
      0.5*ScalarProd(res[i].velocity, res[i].velocity);
    const double energy = total_energy - kinetic_energy;
    res[i].pressure = eos.de2p(res[i].density, energy);
    /*
    for(std::map<std::string,double>::const_iterator it =
	  extensives[i].tracers.begin();
	it!=extensives[i].tracers.end();++it)
      res[i].tracers[it->first] = it->second/extensives[i].mass;
    */
  }
  return res;
}
示例#3
0
// Like above, but a vector, such as a normal (source and dest must be different arrays)
inline void TransformVector(GLfloat *Dest, GLfloat *Src, Model3D_Transform& T)
{
  for (int ic=0; ic<3; ic++)
  {
    GLfloat *Row = T.M[ic];
    Dest[ic] = ScalarProd(Src,Row);
  }
}
示例#4
0
static void FindBoneTransform(Model3D_Transform& T, Model3D_Bone& Bone,
                              Model3D_Frame& Frame, GLfloat MixFrac,
                              Model3D_Frame& AddlFrame)
{
  FindFrameTransform(T,Frame,MixFrac,AddlFrame);

  // Set up overall translate:
  GLfloat *BonePos = Bone.Position;
  for (int ic=0; ic<3; ic++)
    T.M[ic][3] += BonePos[ic] - ScalarProd(T.M[ic],BonePos);
}