#include CPS_START_NAMESPACE Nuc2pt::Nuc2pt(NucOp op, SourceType snk) : HalfFerm(0), nuc(op), SnkType(snk), pos_par(PPAR),neg_par(NPAR) { cname = "Nuc2pt"; char *fname = "Nuc2pt()"; VRB.Func(cname,fname); } Nuc2pt::Nuc2pt(NucOp op, SourceType snk, ProjectType proj) : HalfFerm(0), nuc(op), SnkType(snk), pos_par(proj) { cname = "Nuc2pt"; char *fname = "Nuc2pt()"; VRB.Func(cname,fname); if((pos_par!=PPAR )&&(pos_par!=PPAR_5X)&& (pos_par!=PPAR_5Y)&&(pos_par!=PPAR_5Z)&& (pos_par!=PPAR_5 )) ERR.General(cname,fname,"Unknown proj.\n"); neg_par = (ProjectType)((int) pos_par + 1) ; } /*! Calculate zero momentum nucleon two point functions */ void Nuc2pt::calcNucleon(QPropW& quark){ char *cname = "Nuc2pt" ; char *fname = "calcNucleon(QPropW&)" ; strcpy(mom,"0 0 0"); if(quark.DoHalfFermion()) HalfFerm=1; srcdesc[0]=srcdesc[1]=srcdesc[2]=srcdesc[3]=-1 ; srcdesc[4]=srcdesc[5]=-1 ; // TIZB switch (quark.SrcType()) { case WALL: srcdesc[0] = quark.SourceTime() ; source="WALL" ; break ; case BOX: srcdesc[0] = quark.BoxSrcStart() ; srcdesc[1] = quark.BoxSrcEnd() ; srcdesc[2] = quark.SourceTime() ; if( quark. BoxSrcUseXYZOffset() ){ // use QPropWArg.{x,y,z} as offset srcdesc[3] = quark.PointSrcX() ; srcdesc[4] = quark.PointSrcX() ; srcdesc[5] = quark.PointSrcX() ; } source="BOX" ; break ; case POINT: srcdesc[0] = quark.PointSrcX() ; srcdesc[1] = quark.PointSrcY() ; srcdesc[2] = quark.PointSrcZ() ; srcdesc[3] = quark.SourceTime() ; source = "POINT" ; break ; case GAUSS_GAUGE_INV: srcdesc[0] = quark.Gauss_N() ; srcdesc[1] = int(100*quark.Gauss_W()) ; srcdesc[2] = quark.SourceTime() ; source = "GAUSS" ; break ; default: ERR.General(cname,fname,"Bad source type\n") ; } quark_mass = quark.Mass() ; WilsonMatrix Q1; WilsonMatrix Q2; switch (SnkType) { case POINT: case GAUSS_GAUGE_INV: { if(SnkType==GAUSS_GAUGE_INV) sink="GAUSS" ; else sink="POINT" ; Site s ; for(s.Begin();s.End();s.nextSite()) { int t = s.physT() ; Q1 = quark[s.Index()] ; if(HalfFerm) Q1.PParProjectSink() ; Q2 = Q1 ; calc_nuc_(Q1, Q2, Q1, t) ; } plus_parity.GlobalSum() ; minus_parity.GlobalSum() ; } break ; case WALL: { sink="WALL" ; if(!quark.GFixedSnk()) ERR.General(cname,fname,"Wall sink needs gauge fixing\n") ; for(int t = 0 ; t - p srcdesc[0]=srcdesc[1]=srcdesc[2]=srcdesc[3]=-1 ; srcdesc[4]=srcdesc[5]=-1 ; // TIZB switch (quark.SrcType()) { case WALL: srcdesc[0] = quark.SourceTime() ; source="WALL" ; break ; default: ERR.General(cname,fname,"Bad source type\n") ; } quark_mass = quark.Mass() ; WilsonMatrix Q1; WilsonMatrix Q2; WilsonMatrix Q3; SnkType=POINT; sprintf(mom,"%i %i %i", mom_quark.Mom().cmp(0), mom_quark.Mom().cmp(1), mom_quark.Mom().cmp(2) ); Site s ; for(s.Begin();s.End();s.nextSite()) { int t = s.physT() ; Q1 = quark[s.Index()] ; if(HalfFerm) Q1.PParProjectSink() ; Q2 = Q1 ; // here is the sink so I need exp(ipx) // I did conjugate the momentum at the construction Q3 = sink_mom.Fact(s)*mom_quark[s.Index()] ; if(HalfFerm) Q3.PParProjectSink() ; calc_nuc_(Q1, Q2, Q3,t) ; } plus_parity.GlobalSum() ; minus_parity.GlobalSum() ; } /*! Non-Zero Momentum nucleon from box sources or point */ void Nuc2pt::calcMomNucleon(QPropW& quark, ThreeMom& Mom) { char *fname = "Nuc2pt()"; ThreeMom sink_mom(Mom) ; sink_mom.conj(); //The momentum on the sink has to be complex conjugated!! // p --> - p srcdesc[0]=srcdesc[1]=srcdesc[2]=srcdesc[3]=-1 ; srcdesc[4]=srcdesc[5]=-1 ; // TIZB switch (quark.SrcType()) { case BOX: srcdesc[0] = quark.BoxSrcStart() ; srcdesc[1] = quark.BoxSrcEnd() ; srcdesc[2] = quark.SourceTime() ; source="BOX" ; if( quark. BoxSrcUseXYZOffset() ){ // use QPropWArg.{x,y,z} as offset srcdesc[3] = quark.PointSrcX() ; srcdesc[4] = quark.PointSrcX() ; srcdesc[5] = quark.PointSrcX() ; } break ; case POINT: srcdesc[0] = quark.PointSrcX() ; srcdesc[1] = quark.PointSrcY() ; srcdesc[2] = quark.PointSrcZ() ; srcdesc[3] = quark.SourceTime() ; source="POINT" ; break ; case GAUSS_GAUGE_INV: srcdesc[0] = quark.Gauss_N() ; srcdesc[1] = int(100*quark.Gauss_W()) ; srcdesc[2] = quark.SourceTime() ; source = "GAUSS" ; break ; default: ERR.General(cname,fname,"Bad source type\n") ; } quark_mass = quark.Mass() ; WilsonMatrix Q1; WilsonMatrix Q2; WilsonMatrix Q3; //SnkType=POINT; sprintf(mom,"%i %i %i", Mom.cmp(0), Mom.cmp(1), Mom.cmp(2) ); Site s ; for(s.Begin();s.End();s.nextSite()) { int t = s.physT() ; Q1 = quark[s.Index()] ; if(HalfFerm) Q1.PParProjectSink() ; Q2 = Q1 ; // here is the sink so I need exp(ipx) // I did conjugate the momentum at the construction Q3 = Mom.Fact(s)*Q2 ; if(HalfFerm) Q3.PParProjectSink() ; calc_nuc_(Q1, Q2, Q3, t) ; } plus_parity.GlobalSum() ; minus_parity.GlobalSum() ; } // TY add START /*! Calculate zero momentum nucleon two point functions */ void Nuc2pt::calcNucleon(QPropW& quark, int dohalf){ char *cname = "Nuc2pt" ; char *fname = "calcNucleon(QPropW&)" ; strcpy(mom,"0 0 0"); HalfFerm=dohalf; srcdesc[0]=srcdesc[1]=srcdesc[2]=srcdesc[3]=-1 ; srcdesc[4]=srcdesc[5]=-1 ; // TIZB switch (quark.SrcType()) { case WALL: srcdesc[0] = quark.SourceTime() ; source="WALL" ; break ; case BOX: srcdesc[0] = quark.BoxSrcStart() ; srcdesc[1] = quark.BoxSrcEnd() ; srcdesc[2] = quark.SourceTime() ; if( quark. BoxSrcUseXYZOffset() ){ // use QPropWArg.{x,y,z} as offset srcdesc[3] = quark.PointSrcX() ; srcdesc[4] = quark.PointSrcX() ; srcdesc[5] = quark.PointSrcX() ; } source="BOX" ; break ; case POINT: srcdesc[0] = quark.PointSrcX() ; srcdesc[1] = quark.PointSrcY() ; srcdesc[2] = quark.PointSrcZ() ; srcdesc[3] = quark.SourceTime() ; source = "POINT" ; break ; case GAUSS_GAUGE_INV: srcdesc[0] = quark.Gauss_N() ; srcdesc[1] = int(100*quark.Gauss_W()) ; srcdesc[2] = quark.SourceTime() ; source = "GAUSS" ; break ; default: ERR.General(cname,fname,"Bad source type\n") ; } quark_mass = quark.Mass() ; WilsonMatrix Q1; WilsonMatrix Q2; WilsonMatrix Q3; WilsonMatrix Q4; WilsonMatrix Q5; switch (SnkType) { case POINT: case GAUSS_GAUGE_INV: { if(SnkType==GAUSS_GAUGE_INV) sink="GAUSS" ; else sink="POINT" ; Site s ; for(s.Begin();s.End();s.nextSite()) { int t = s.physT() ; Q1 = quark[s.Index()] ; if(HalfFerm) Q1.PParProjectSink() ; Q2 = Q1 ; Q3 = Q1 ; Q4 = Q1 ; Q5 = Q1 ; calc_nuc_(Q1, Q2, Q3, Q4, Q5, t, dohalf) ; } plus_parity.GlobalSum() ; minus_parity.GlobalSum() ; } break ; case WALL: { sink="WALL" ; if(!quark.GFixedSnk()) ERR.General(cname,fname,"Wall sink needs gauge fixing\n") ; for(int t = 0 ; t - p HalfFerm=dohalf; srcdesc[0]=srcdesc[1]=srcdesc[2]=srcdesc[3]=-1 ; srcdesc[4]=srcdesc[5]=-1 ; // TIZB switch (quark.SrcType()) { case BOX: srcdesc[0] = quark.BoxSrcStart() ; srcdesc[1] = quark.BoxSrcEnd() ; srcdesc[2] = quark.SourceTime() ; if( quark. BoxSrcUseXYZOffset() ){ // use QPropWArg.{x,y,z} as offset srcdesc[3] = quark.PointSrcX() ; srcdesc[4] = quark.PointSrcX() ; srcdesc[5] = quark.PointSrcX() ; } source="BOX" ; break ; case POINT: srcdesc[0] = quark.PointSrcX() ; srcdesc[1] = quark.PointSrcY() ; srcdesc[2] = quark.PointSrcZ() ; srcdesc[3] = quark.SourceTime() ; source="POINT" ; break ; case GAUSS_GAUGE_INV: srcdesc[0] = quark.Gauss_N() ; srcdesc[1] = int(100*quark.Gauss_W()) ; srcdesc[2] = quark.SourceTime() ; source = "GAUSS" ; break ; default: ERR.General(cname,fname,"Bad source type\n") ; } quark_mass = quark.Mass() ; WilsonMatrix Q1; WilsonMatrix Q2; WilsonMatrix Q3; WilsonMatrix Q4; WilsonMatrix Q5; //SnkType=POINT; sprintf(mom,"%i %i %i", Mom.cmp(0), Mom.cmp(1), Mom.cmp(2) ); Site s ; for(s.Begin();s.End();s.nextSite()) { int t = s.physT() ; Q1 = quark[s.Index()] ; if(HalfFerm) Q1.PParProjectSink() ; Q2 = Q1 ; Q3 = Q1 ; Q4 = Q1 ; // here is the sink so I need exp(ipx) // I did conjugate the momentum at the construction Q5 = Mom.Fact(s)*Q2 ; calc_nuc_(Q1, Q2, Q3, Q4, Q5, t, dohalf) ; } plus_parity.GlobalSum() ; minus_parity.GlobalSum() ; } // TY add END void Nuc2pt::Print(FILE *fp) { if(fp==NULL) return ; char *oper ; char *proj ; char *sink ; switch (nuc) { case NUC_G5C: oper="NUC_G5C" ; break ; case NUC_C: oper="NUC_C" ; break ; default: oper="U" ; //just keep gcc happy } switch (pos_par) { case PPAR_5X: proj="5X" ; break ; case PPAR_5Y: proj="5Y" ; break ; case PPAR_5Z: proj="5Z" ; break ; case PPAR_5: proj="5" ; break ; default: proj="" ; //if its PPAR don't print anything } switch (SnkType) { case POINT: sink="POINT" ; break ; case WALL: sink="WALL" ; break ; case GAUSS_GAUGE_INV: sink = "GAUSS" ; break ; default: sink="" ; // Will never happen! } Fprintf(fp,"STARTPROP\n") ; Fprintf(fp,"MASSES: %e %e %e\n", (float)quark_mass,(float)quark_mass,(float)quark_mass) ; Fprintf(fp,"SOURCE: %s ",source) ; for(int i(0) ; i<6;i++) // TIZB if(srcdesc[i]>-1) Fprintf(fp,"%i ",srcdesc[i]) ; Fprintf(fp,"\n" ) ; Fprintf(fp,"SINK: %s\n",sink ) ; if(HalfFerm) Fprintf(fp,"NR-SPINORS\n") ; Fprintf(fp,"MOM: %s\n",mom ) ; Fprintf(fp,"OPER: %s_PP%s %s_NP%s\n",oper,proj,oper,proj) ; for(int t=0; t