本文整理汇总了C++中Vec4D::PSpat方法的典型用法代码示例。如果您正苦于以下问题:C++ Vec4D::PSpat方法的具体用法?C++ Vec4D::PSpat怎么用?C++ Vec4D::PSpat使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Vec4D
的用法示例。
在下文中一共展示了Vec4D::PSpat方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: SetFixVec
void Kinematics_Base::SetFixVec(Parton *const p,Vec4D mom,
const Kin_Args <,const int mode) const
{
if (p->GetNext()) SetFixVec(p->GetNext(),mom,lt,mode|4);
if (p->FixSpec()==Vec4D()) return;
Vec4D oldp(p->OldMomentum()), ref(p->FixSpec());
if ((mode&3)==3 || ((mode&1)==1 && lt.m_mode==0)) {
if (mode&4) {
Poincare_Sequence lam(lt.m_lam);
lam.Invert();
mom=lam*mom;
}
else {
oldp=lt.m_lam*oldp;
ref=lt.m_lam*ref;
}
}
if (IsEqual(oldp,mom,rpa->gen.SqrtAccu())) {
p->SetFixSpec(ref);
p->SetOldMomentum(oldp);
return;
}
Vec4D np(0.0,cross(Vec3D(oldp),Vec3D(mom)));
if (np.PSpat2()<=1.0e-6) {
msg_Debugging()<<"Set fixed n_perp\n";
np=Vec4D(0.0,cross(Vec3D(oldp),Vec3D(1.0,1.0,0.0)));
}
np*=1.0/np.PSpat();
Vec4D lp(0.0,cross(Vec3D(oldp),Vec3D(np)));
lp*=1.0/lp.PSpat();
Vec4D pl(0.0,(Vec3D(ref)*Vec3D(lp))*lp);
Vec4D pn(0.0,(Vec3D(ref)*Vec3D(np))*np);
double D(oldp*ref), T(oldp.PSpat()), F(ref[0]);
double Q(mom[0]), P(mom.PSpat()), S(mom.Abs2());
Poincare rot(oldp,mom);
if (oldp.Abs2()>1.0e-3 && mom.Abs2()>1.0e-3) {
Poincare oldcms(oldp), newcms(mom);
oldcms.Boost(ref);
rot.Rotate(ref);
newcms.BoostBack(ref);
}
else {
double E((Q*D+P/T*(F*S-Q*D))/S);
ref=Vec4D(E,Vec3D(mom)*(Q*E-D)/(P*P));
ref+=pn+rot*pl;
}
p->SetFixSpec(ref);
p->SetOldMomentum(mom);
}