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; }
// 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); } }
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); }