Ejemplo n.º 1
0
void FullAmplitude_External::BuildColorMatrix
(const size_t &ci,const size_t &cj) 
{
  m_colfs[ci][cj].
    resize(m_amap.size(),std::vector<Complex>
	   (m_amap.size(),Complex(0.0,0.0)));
  for (size_t a=0;a<m_amap.size();++a) {
    const std::vector<int> &cp(m_amap[a].m_perm);
    int nsuba, psuba, swapa;
    Flavour_Vector fla;
    std::vector<size_t> ida, perma(cp.begin(),cp.end());
    GetPermutation(perma,ida,fla,nsuba,psuba,swapa);
    msg_Debugging()<<"A: "<<perma<<ida<<fla<<" sub = -"<<nsuba<<"/+"<<psuba
		   <<" swap = "<<swapa<<" ( em = "<<ci<<" )\n";
    msg_Indent();
    for (size_t b=a;b<m_amap.size();++b) {
      const std::vector<int> &cp(m_amap[b].m_perm);
      int nsubb, psubb, swapb;
      Flavour_Vector flb;
      std::vector<size_t> idb, permb(cp.begin(),cp.end());
      GetPermutation(permb,idb,flb,nsubb,psubb,swapb);
      msg_Debugging()<<"B: "<<permb<<idb<<flb<<" sub = -"<<nsubb<<"/+"<<psubb
		     <<" swap = "<<swapb<<" ( sp = "<<cj<<" )\n";
      msg_Indent();
      Expression expression(100,100);
      expression.pop_back();
      expression.SetTR(p_calc->TR());
      size_t ad(expression.AIndex()), lf(expression.FIndex()), fl(lf);
      for (size_t i=0;i<fla.size();++i) {
	if (fla[i].StrongCharge()==3) {
	  if (i>0) lf=expression.FIndex();
	  expression.push_back(Delta::New(ida[i]+1,lf));
	  if (ci!=cj) {
	  if (ci==ida[i]) {
	    size_t nlf=expression.FIndex();
	    expression.push_back(Fundamental::New(ad,lf,nlf));
	    lf=nlf;
	  }
	  }
	}
	else if (fla[i].StrongCharge()==-3) {
	  if (ci!=cj) {
	  if (ci==ida[i]) {
	    size_t nlf=expression.FIndex();
	    expression.push_back(Fundamental::New(ad,lf,nlf));
	    expression.push_back(CNumber::New(Complex(-1.0)));
	    lf=nlf;
	  }
	  }
	  expression.push_back(Delta::New(lf,ida[i]+1));
	}
	else {
	  if (ci==cj) {
	    size_t nlf=expression.FIndex();
	    expression.push_back(Fundamental::New(ida[i]+1,lf,nlf));
	    lf=nlf;
	  }
	  else {
	  if (ci!=ida[i]) {
	    size_t nlf=expression.FIndex();
	    expression.push_back(Fundamental::New(ida[i]+1,lf,nlf));
	    lf=nlf;
	  }
	  else {
	    size_t la=expression.AIndex();
	    size_t nlf=expression.FIndex();
	    expression.push_back(Fundamental::New(la,lf,nlf));
	    expression.push_back(Adjoint::New(ad,ida[i]+1,la));
	    expression.push_back(CNumber::New(Complex(0.0,-1.0)));
	    lf=nlf;
	  }
	  }
	}
      }
      if (fla.back().StrongCharge()==3 ||
	  fla.back().StrongCharge()==8)
	expression.push_back(Delta::New(lf,fl));
      fl=lf=expression.FIndex();
      for (size_t i=0;i<flb.size();++i) {
	if (flb[i].StrongCharge()==3) {
	  if (i>0) lf=expression.FIndex();
	  expression.push_back(Delta::New(lf,idb[i]+1));
	  if (ci!=cj) {
	  if (cj==idb[i]) {
	    size_t nlf=expression.FIndex();
	    expression.push_back(Fundamental::New(ad,nlf,lf));
	    lf=nlf;
	  }
	  }
	}
	else if (flb[i].StrongCharge()==-3) {
	  if (ci!=cj) {
	  if (cj==idb[i]) {
	    size_t nlf=expression.FIndex();
	    expression.push_back(Fundamental::New(ad,nlf,lf));
	    expression.push_back(CNumber::New(Complex(-1.0)));
	    lf=nlf;
	  }
	  }
	  expression.push_back(Delta::New(idb[i]+1,lf));
	}
	else {
	  if (ci==cj) {
	    size_t nlf=expression.FIndex();
	    expression.push_back(Fundamental::New(idb[i]+1,nlf,lf));
	    lf=nlf;
	  }
	  else {
	  if (cj!=idb[i]) {
	    size_t nlf=expression.FIndex();
	    expression.push_back(Fundamental::New(idb[i]+1,nlf,lf));
	    lf=nlf;
	  }
	  else {
	    size_t la=expression.AIndex();
	    size_t nlf=expression.FIndex();
	    expression.push_back(Fundamental::New(la,nlf,lf));
	    expression.push_back(Adjoint::New(ad,la,idb[i]+1));
	    expression.push_back(CNumber::New(Complex(0.0,-1.0)));
	    lf=nlf;
	  }
	  }
	}
      }
      if (fla.back().StrongCharge()==3 ||
	  flb.back().StrongCharge()==8)
	expression.push_back(Delta::New(fl,lf));
      if (msg_LevelIsDebugging()) expression.Print();
      expression.Evaluate();
      Complex col=expression.Result();
      if (nsuba || nsubb) col/=pow(-expression.NC(),nsuba+nsubb);
      if (psuba || psubb) col/=pow(expression.NC(),psuba+psubb);
      if ((swapa+swapb)%2) col=-col;
      double T2=1.0;
      if (ci!=cj) {
      if (m_fls[ci].StrongCharge()==8) {
	T2=expression.NC()*expression.TR();
	T2/=CSC.CA*CSC.TR;
      }
      else {
	T2=expression.TR()*(expression.NC()-1.0/expression.NC());
	T2/=CSC.CF;
      }
      }
      msg_Debugging()<<"A B^* = "<<col<<" <- sub = -"<<nsuba+nsubb
		     <<"/+"<<psuba+psubb<<", swap = "<<swapa+swapb
		     <<", T2 = "<<T2<<" ("<<a<<","<<b<<")\n";
      m_colfs[ci][cj][a][b]=col/T2;
      m_colfs[ci][cj][b][a]=conj(col)/T2;
    }
  }
}