Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

w_mesons.C

Go to the documentation of this file.
00001 #include<config.h>
00002 CPS_START_NAMESPACE
00003 //--------------------------------------------------------------------
00004 //  CVS keywords
00005 //
00006 //  $Author: chulwoo $
00007 //  $Date: 2008/02/08 18:35:06 $
00008 //  $Header: /space/cvs/cps/cps++/src/alg/alg_w_spect/w_mesons.C,v 1.12 2008/02/08 18:35:06 chulwoo Exp $
00009 //  $Id: w_mesons.C,v 1.12 2008/02/08 18:35:06 chulwoo Exp $
00010 //  $Name: v5_0_8 $
00011 //  $Locker:  $
00012 //  $RCSfile: w_mesons.C,v $
00013 //  $Revision: 1.12 $
00014 //  $Source: /space/cvs/cps/cps++/src/alg/alg_w_spect/w_mesons.C,v $
00015 //  $State: Exp $
00016 //
00017 //--------------------------------------------------------------------
00018 
00019 CPS_END_NAMESPACE
00020 #include <alg/w_all.h>
00021 #include <alg/w_gamma_mat.h>
00022 #ifdef PARALLEL
00023 #include <comms/sysfunc_cps.h>
00024 #endif
00025 
00026 #include <util/error.h>                // ERR
00027 #include <util/verbose.h>              // VRB
00028 #include <util/vector.h>               // dotProduct
00029 #include <util/qcdio.h> 
00030 #include <comms/glb.h>                   // glb_sum
00031 #include <alg/alg_w_spect.h>          // AlgWspect::GetCounter()
00032 CPS_START_NAMESPACE
00033 
00034 //---------------------------------------------------------------------------
00035 // For the purpose of debugging or timing during code upgrade
00036 //---------------------------------------------------------------------------
00037 //#define DEBUG_W_MESON
00038 //#define TIME_W_MESON
00039 
00040 #ifdef  TIME_W_MESON
00041 CPS_END_NAMESPACE
00042 #include <time.h>                 // clock()
00043 CPS_START_NAMESPACE
00044 #endif
00045 
00046 
00047 //---------------------------------------------------------------------------
00048 // static data members
00049 //---------------------------------------------------------------------------
00050 char *      WspectMesons::d_class_name = "WspectMesons";
00051 
00052 
00053 //---------------------------------------------------------------------------
00054 // WspectMesons::WspectMesons(...)
00055 //--------------------------------------------------------------------------- 
00056 WspectMesons::WspectMesons(const IFloat *quark1, const IFloat *quark2, 
00057                            const WspectHyperRectangle &whr,
00058                            const WspectMomenta & mom)
00059   : d_quark1_p(quark1),
00060     d_quark2_p(quark2),
00061     d_whr(whr),
00062     d_mom(mom)
00063 {
00064   Everything();
00065 }
00066 
00067 
00068 
00069 
00070 //---------------------------------------------------------------------------
00071 // WspectMesons::WspectMesons(...)
00072 //--------------------------------------------------------------------------- 
00073 WspectMesons::WspectMesons(const WspectQuark &quark1, 
00074                            const WspectQuark &quark2,
00075                            const WspectHyperRectangle &whr,
00076                            const WspectMomenta & mom)
00077   : d_quark1_p(quark1.Data()),
00078     d_quark2_p(quark2.Data()),
00079     d_whr(whr),
00080     d_mom(mom)
00081 {
00082   Everything();
00083 }
00084 
00085 
00086 
00087 //---------------------------------------------------------------------------
00088 // WspectMesons::Everything()
00089 //--------------------------------------------------------------------------- 
00090 void
00091 WspectMesons::Everything()
00092 {
00093   VRB.Func(d_class_name, ctor_str);
00094 
00095 #ifdef TIME_W_MESON
00096   int beforeClock = clock();
00097 #endif
00098 
00099   //  Length in the propagation direction
00100   //-------------------------------------------------------------------------
00101   d_prop_dir  = d_whr.dir();  
00102   d_glb_walls = glb_sites[d_prop_dir];
00103   {
00104     const int *low  = d_whr.lclMin();
00105     const int *high = d_whr.lclMax();
00106     for (int i = 0; i < LORENTZs; ++i) {
00107       d_lclMin[i] = low[i];
00108       d_lclMax[i] = high[i];
00109     }
00110   }
00111 
00112 
00113   // d_num_mom
00114   //-------------------------------------------------------------------------
00115   d_num_mom = 1;
00116   if (d_mom)
00117     d_num_mom += d_mom.numNonZeroMom();
00118 
00119 
00120   // allocate space and clear them
00121   //-------------------------------------------------------------------------
00122   d_size   = d_num_mom * d_glb_walls * MESONs * COMPLEXs;
00123   {
00124     int fsize = d_size * sizeof(IFloat);
00125     d_data_p = (Complex *)smalloc(fsize);
00126     if (!d_data_p)
00127       ERR.Pointer(d_class_name, ctor_str, empty_str);
00128     VRB.Smalloc(d_class_name, ctor_str, empty_str, d_data_p, fsize);
00129 
00130     IFloat *flt_p = (IFloat *)d_data_p;
00131     for (int i = 0; i < d_size; ++i)
00132       *flt_p++ = 0.0;
00133   }
00134 
00135   // Set the on-node part of d_data_p 
00136   //-------------------------------------------------------------------------
00137   {
00138     int lcl_walls = lcl_sites[d_prop_dir];
00139 
00140     for (int lclW = 0; lclW < lcl_walls; ++lclW) {
00141       DiracAlgebra(lclW);
00142     }
00143 
00144   }
00145 
00146 
00147 #ifdef DEBUG_W_MESON
00148   dumpData("before.gsum.meson.dat");
00149 #endif
00150   
00151 
00152   // Global sum over all data
00153   //-------------------------------------------------------------------------
00154   {
00155     Float *Flt_p = (Float *)d_data_p;
00156     for (int i = 0; i < d_size; ++i)    glb_sum(Flt_p++);
00157   }
00158 
00159 
00160 #ifdef DEBUG_W_MESON
00161   dumpData("after.gsum.meson.Mdat");  
00162 #endif
00163 
00164 
00165 #ifdef TIME_W_MESON
00166   int afterClock = clock();
00167   int clockTime = afterClock - beforeClock;  
00168   printf("Meson %d = [%d - %d]", clockTime, afterClock, beforeClock);  
00169 #endif
00170   
00171 }
00172 
00173 //---------------------------------------------------------------------------
00174 // WspectMesons::~WspectMesons()
00175 //--------------------------------------------------------------------------- 
00176 // Purpose:
00177 //    Free all the memory on heap.
00178 //--------------------------------------------------------------------------- 
00179 WspectMesons::~WspectMesons()
00180 {
00181   VRB.Func(d_class_name, dtor_str);
00182   VRB.Sfree(d_class_name, dtor_str, empty_str, d_data_p);
00183   sfree(d_data_p);
00184 }
00185 
00186 
00187 //---------------------------------------------------------------------------
00188 // void WspectMesons::ColorAlgebra(...)
00189 //---------------------------------------------------------------------------
00190 // The quark propagator data is stored as
00191 //        IFloat[Dy][Cy][T][Z][Y][X][Dx][Cx][2]
00192 // if we only need the real part, we could use
00193 //     dotProduct(q1_p, q2_p, COMPLEXs*COLORs);
00194 // which is much more efficient (by a rough factor of 6).
00195 //---------------------------------------------------------------------------
00196 void
00197 WspectMesons::ColorAlgebra(int D1x, int D2x, int D1y, int D2y,
00198                            const int lcl[LORENTZs], Complex &result) const
00199 {
00200   int local_site_offset = siteOffset(lcl) * SPINORs;  
00201 
00202   const Complex *q1_p = (const Complex *)(d_quark1_p + 
00203                                           WspectQuark::weightSrcDirac()*D1y + 
00204                                           local_site_offset + 
00205                                           (COMPLEXs*COLORs) * D1x);
00206   const Complex *q2_p = (const Complex *)(d_quark2_p + 
00207                                           WspectQuark::weightSrcDirac()*D2y + 
00208                                           local_site_offset + 
00209                                           (COMPLEXs*COLORs) * D2x);
00210 
00211   int off_Cy_in_complex = WspectQuark::weightSrcColor() / COMPLEXs;
00212 
00213   for (int Cy = 0; Cy < COLORs; Cy++) {
00214     result += q1_p[0] * conj(q2_p[0]);
00215     result += q1_p[1] * conj(q2_p[1]);
00216     result += q1_p[2] * conj(q2_p[2]);
00217     q1_p += off_Cy_in_complex;    
00218     q2_p += off_Cy_in_complex;    
00219   }
00220 }
00221 
00222 
00223 //---------------------------------------------------------------------------
00224 // void WspectMesons::MomProject(...)
00225 //---------------------------------------------------------------------------
00226 // res[D1x][D1y][D2x][D2y] 
00227 //---------------------------------------------------------------------------
00228 void
00229 WspectMesons::MomProject(int D1x, int D2x, int D1y, int D2y, int lclW)
00230 {
00231   VRB.Func(d_class_name, "MomProject");
00232   
00233   // set the coordinate limit in the prop_dir to avoid looping in that dir.
00234   //-------------------------------------------------------------------------
00235   d_lclMin[d_prop_dir] = d_lclMax[d_prop_dir] = lclW; 
00236   
00237   // loop over local sites [first for the efficiency in calculation of
00238   // local_site_offset and non-zero momentum projection] and Dirac indexes.
00239   //-------------------------------------------------------------------------
00240   int lcl[LORENTZs];                         
00241   for (lcl[0] = d_lclMin[0]; lcl[0] <= d_lclMax[0]; lcl[0]++) {
00242     for (lcl[1] = d_lclMin[1]; lcl[1] <= d_lclMax[1]; lcl[1]++) {       
00243       for (lcl[2] = d_lclMin[2]; lcl[2] <= d_lclMax[2]; lcl[2]++) {
00244         for (lcl[3] = d_lclMin[3]; lcl[3] <= d_lclMax[3]; lcl[3]++) {
00245           
00246           Complex colorSum(0.0, 0.0);           
00247           ColorAlgebra(D1x, D2x, D1y, D2y, lcl, colorSum);
00248 
00249           // zero momentum projection
00250           d_mom_proj[0][D1x][D1y][D2x][D2y] += colorSum;  
00251 
00252           // non-zero meomentum projection
00253           if (d_mom) {    
00254             const Complex *mom = d_mom[lcl];
00255             for (int iMom = 1; iMom < d_num_mom; ++iMom) {
00256               d_mom_proj[iMom][D1x][D1y][D2x][D2y] += mom[iMom-1] * colorSum;  
00257             }
00258           }
00259         }       // for (lcl[3] = d_lclMin[3];
00260       }         // for (lcl[2] = d_lclMin[2]
00261     }           // for (lcl[1] = d_lclMin[1];
00262   }             // for (lcl[0] = d_lclMin[0];
00263 }
00264 
00265 
00266 //Used in DiracAlgebra
00267 
00268 void WspectMesons::traceDirac(int sign, IFloat *gam1, IFloat *gam2,int mom,
00269                                 Complex *result_p){
00270   char *fname="traceDirac";
00271    //mesonId gives the offset into correlator result
00272   //coor_data_p[glbwall][
00273   //pass the offset from outside directly?
00274   //int corr_offset=mesonId+(lclw+lcl2glb_offset[d_prop_dir])*EXTMESONs;
00275  
00276   //check for errors
00277   if(sign!=1 && sign !=-1) {
00278     ERR.General(d_class_name, fname,"sign must be 1 or -1");
00279   }
00280   if(DIRACs!=4) ERR.General(d_class_name,fname,"DIRACs must be 4!");
00281  
00282   if(gam1==0 || gam2==0 || result_p==0) {
00283     ERR.General(d_class_name,fname,"null pointer passed");
00284   }
00285 
00286   for(int d1=0;d1<DIRACs;d1++){
00287     for(int d2=0;d2<DIRACs;d2++){
00288       for(int d3=0;d3<DIRACs;d3++){
00289         for(int d4=0;d4<DIRACs;d4++){
00290 
00291           Complex gam1_element(gam1[d1*4*2+d2*2],gam1[d1*4*2+d2*2+1]);
00292           Complex gam2_element(gam2[d3*4*2+d4*2],gam2[d3*4*2+d4*2+1]);
00293           //Complex tmp;
00294           //tmp=sign*gam1_element*d_zero_mom_proj[d2][d3][d1][d4]*gam2_element;
00295           //if(tmp.real()!=0 && tmp.imag()!=0) 
00296           //printf("Non-zero term %d,%d,%d,%d\n",d2,d3,d1,d4);
00297 
00298           if(sign==1){
00299             *(result_p) += 
00300                 gam1_element*gam2_element*d_mom_proj[mom][d2][d3][d1][d4];
00301           }else{
00302             *(result_p) -= 
00303                 gam1_element*gam2_element*d_mom_proj[mom][d2][d3][d1][d4];
00304           }
00305         }//d1
00306       }//d2
00307     }//d3
00308   }//d4
00309  
00310   //done
00311 }
00312 
00313 
00314 //---------------------------------------------------------------------------
00315 // void WspectMesons::DiracAlgebra(...)
00316 //---------------------------------------------------------------------------
00317 void
00318 WspectMesons::DiracAlgebra(int lclW) 
00319 { 
00320   VRB.Func(d_class_name, "DiracAlgebra");
00321 
00322   // Loop over Dirac indexes:    Momentum Projection
00323   //
00324   // Ping -- we seem to be able to approve that why only the following
00325   //         combinations of spinor indexes will ever be used in 
00326   //         current calcuations. Can we prove it for non-degenerate
00327   //         quark masses??????
00328   //-----------------------------------------------------------------------
00329   {
00330     // clear space for result -- more effecient this way
00331     IFloat *p = (IFloat *)d_mom_proj;
00332     for (int  i = 0; i < sizeof(d_mom_proj)/sizeof(IFloat); ++i)
00333       *p++ = 0.0;
00334 
00335     // loop
00336     int D1x, D2x, D1y, D2y;  
00337     for (D1x = 0; D1x < DIRACs; D1x++) {    
00338       for (D1y = 0; D1y < DIRACs; D1y++) {      
00339         for (D2x = 0; D2x < DIRACs; D2x++) {
00340           if (D1x==D1y) 
00341             D2y=D2x;            // D1x==D1y  D2x==D2y
00342           else if (D1x==D2x) 
00343             D2y=D1y;            // D1x==D2x  D1y==D2y
00344           else if (D1y==D2x) 
00345             D2y=D1x;            // D1x==D2y  D1y==D2x
00346           else {                    // D1x!=D2y!=D1y!=D2x
00347             for (D2y = 0; D2y == D1x || D2y == D1y || D2y == D2x; ++D2y);
00348           } 
00349           MomProject(D1x, D2x, D1y, D2y, lclW);                   
00350         }
00351       }
00352     }
00353   }
00354   
00355  
00356 #ifdef DEBUG_W_MESON
00357   {
00358     static int calls = 0; calls++;
00359     FILE *fp = Fopen("meson.dirac.dat", "a");    
00360     Fprintf(fp, "Call %d\n", calls);
00361     for (int i0 = 0; i0 < DIRACs; ++i0) {
00362       for (int i1 = 0; i1 < DIRACs; ++i1) {
00363         for (int i2 = 0; i2 < DIRACs; ++i2) {
00364           for (int i3 = 0; i3 < DIRACs; ++i3) {
00365             for (int iMom = 0; iMom < d_num_mom; ++iMom) {
00366               const Complex & tmp = d_mom_proj[iMom][i0][i1][i2][i3];
00367               Fprintf(fp, "mom %d %d %d %d %d [%g %g]\n", 
00368                       iMom, i0, i1, i2, i3, tmp.real(), tmp.imag());
00369             }
00370           }
00371         }
00372       }
00373     }
00374     Fclose(fp);
00375   }
00376 #endif
00377  
00378 
00379   // point to the data for this global time slice
00380   //-----------------------------------------------------------------------
00381   Complex *mesonsAddr = d_data_p + (lclW + lcl2glb_offset[d_prop_dir]
00382                                     ) * MESONs;
00383 
00384   // mesonsAddr increment for each momentum loop:
00385   //     each momentum:       d_glb_walls * MESONs
00386   //     within a iMom loop:  MESONs - 1   increments already
00387   //           subtract:     (d_glb_walls-1) * MESONs + 1;
00388   //-----------------------------------------------------------------------
00389   int numComplexToNextMom = (d_glb_walls-1) * MESONs + 1;
00390 
00391   // for each momentum and each meson
00392   //-----------------------------------------------------------------------
00393   for (int iMom = 0; iMom < d_num_mom; ++iMom) {    
00394     // Meson 0   GAMMA = [gamma_t^0][gamma_z^0][gy^0][gx^0]
00395     //traceDirac(1,(IFloat *)WG5, (IFloat *)WGamma5, iMom, mesonsAddr);
00396 
00397     *mesonsAddr    = d_mom_proj[iMom][0][0][0][0];
00398     *mesonsAddr   += d_mom_proj[iMom][0][1][0][1];
00399     *mesonsAddr   -= d_mom_proj[iMom][0][2][0][2];
00400     *mesonsAddr   -= d_mom_proj[iMom][0][3][0][3];
00401     *mesonsAddr   += d_mom_proj[iMom][1][0][1][0];
00402     *mesonsAddr   += d_mom_proj[iMom][1][1][1][1];
00403     *mesonsAddr   -= d_mom_proj[iMom][1][2][1][2];
00404     *mesonsAddr   -= d_mom_proj[iMom][1][3][1][3];
00405     *mesonsAddr   -= d_mom_proj[iMom][2][0][2][0];
00406     *mesonsAddr   -= d_mom_proj[iMom][2][1][2][1];
00407     *mesonsAddr   += d_mom_proj[iMom][2][2][2][2];
00408     *mesonsAddr   += d_mom_proj[iMom][2][3][2][3];
00409     *mesonsAddr   -= d_mom_proj[iMom][3][0][3][0];
00410     *mesonsAddr   -= d_mom_proj[iMom][3][1][3][1];
00411     *mesonsAddr   += d_mom_proj[iMom][3][2][3][2];
00412     *mesonsAddr++ += d_mom_proj[iMom][3][3][3][3]; 
00413     // Meson 1  GAMMA = [gt^0][gz^0][gy^0][gx^1]   Catalin's 8
00414     //mesonsAddr++;
00415     //traceDirac(-1,(IFloat *)WGamma1Gamma5, (IFloat *)WGamma1Gamma5, iMom, mesonsAddr);
00416 
00417     *mesonsAddr    = d_mom_proj[iMom][0][0][3][3];
00418     *mesonsAddr   += d_mom_proj[iMom][0][1][3][2];
00419     *mesonsAddr   += d_mom_proj[iMom][0][2][3][1];
00420     *mesonsAddr   += d_mom_proj[iMom][0][3][3][0];
00421     *mesonsAddr   += d_mom_proj[iMom][1][0][2][3];
00422     *mesonsAddr   += d_mom_proj[iMom][1][1][2][2];
00423     *mesonsAddr   += d_mom_proj[iMom][1][2][2][1];
00424     *mesonsAddr   += d_mom_proj[iMom][1][3][2][0];
00425     *mesonsAddr   += d_mom_proj[iMom][2][0][1][3];
00426     *mesonsAddr   += d_mom_proj[iMom][2][1][1][2];
00427     *mesonsAddr   += d_mom_proj[iMom][2][2][1][1];
00428     *mesonsAddr   += d_mom_proj[iMom][2][3][1][0];
00429     *mesonsAddr   += d_mom_proj[iMom][3][0][0][3];
00430     *mesonsAddr   += d_mom_proj[iMom][3][1][0][2];
00431     *mesonsAddr   += d_mom_proj[iMom][3][2][0][1];
00432     *mesonsAddr++ += d_mom_proj[iMom][3][3][0][0];     
00433 
00434     // Meson 2  GAMMA = [gt^0][gz^0][gy^1][gx^0]   Catalin's 1
00435     //mesonsAddr++;
00436     //traceDirac(-1,(IFloat *)WGamma2Gamma5, (IFloat *)WGamma2Gamma5, iMom, mesonsAddr);
00437 
00438     *mesonsAddr    = d_mom_proj[iMom][0][0][3][3];
00439     *mesonsAddr   -= d_mom_proj[iMom][0][1][3][2];
00440     *mesonsAddr   += d_mom_proj[iMom][0][2][3][1];
00441     *mesonsAddr   -= d_mom_proj[iMom][0][3][3][0];
00442     *mesonsAddr   -= d_mom_proj[iMom][1][0][2][3];
00443     *mesonsAddr   += d_mom_proj[iMom][1][1][2][2];
00444     *mesonsAddr   -= d_mom_proj[iMom][1][2][2][1];
00445     *mesonsAddr   += d_mom_proj[iMom][1][3][2][0];
00446     *mesonsAddr   += d_mom_proj[iMom][2][0][1][3];
00447     *mesonsAddr   -= d_mom_proj[iMom][2][1][1][2];
00448     *mesonsAddr   += d_mom_proj[iMom][2][2][1][1];
00449     *mesonsAddr   -= d_mom_proj[iMom][2][3][1][0];
00450     *mesonsAddr   -= d_mom_proj[iMom][3][0][0][3];
00451     *mesonsAddr   += d_mom_proj[iMom][3][1][0][2];
00452     *mesonsAddr   -= d_mom_proj[iMom][3][2][0][1];
00453     *mesonsAddr++ += d_mom_proj[iMom][3][3][0][0];     
00454 
00455 
00456     // Meson 3:   GAMMA =  [gt^0][gz^0][gy^1][gx^1]  Catalin's 9
00457     //mesonsAddr++;
00458     //traceDirac(-1,(IFloat *)WGamma3Gamma4, (IFloat *)WGamma3Gamma4, iMom,mesonsAddr);
00459 
00460     *mesonsAddr    = d_mom_proj[iMom][0][1][0][1];
00461     *mesonsAddr   -= d_mom_proj[iMom][0][0][0][0];
00462     *mesonsAddr   += d_mom_proj[iMom][0][2][0][2];
00463     *mesonsAddr   -= d_mom_proj[iMom][0][3][0][3];
00464     *mesonsAddr   += d_mom_proj[iMom][1][0][1][0];
00465     *mesonsAddr   -= d_mom_proj[iMom][1][1][1][1];
00466     *mesonsAddr   -= d_mom_proj[iMom][1][2][1][2];
00467     *mesonsAddr   += d_mom_proj[iMom][1][3][1][3];
00468     *mesonsAddr   += d_mom_proj[iMom][2][0][2][0];
00469     *mesonsAddr   -= d_mom_proj[iMom][2][1][2][1];
00470     *mesonsAddr   -= d_mom_proj[iMom][2][2][2][2];
00471     *mesonsAddr   += d_mom_proj[iMom][2][3][2][3];
00472     *mesonsAddr   -= d_mom_proj[iMom][3][0][3][0];
00473     *mesonsAddr   += d_mom_proj[iMom][3][1][3][1];
00474     *mesonsAddr   += d_mom_proj[iMom][3][2][3][2];
00475     *mesonsAddr++ -= d_mom_proj[iMom][3][3][3][3];     
00476 
00477     // Meson 4:     GAMMA = [gt^0][gz^1][gy^0][gx^0]   Catalin's 2
00478     //mesonsAddr++;
00479     //traceDirac(-1,(IFloat *)WGamma3Gamma5, (IFloat *)WGamma3Gamma5, iMom,mesonsAddr);
00480 
00481     *mesonsAddr    = d_mom_proj[iMom][0][0][2][2];
00482     *mesonsAddr   -= d_mom_proj[iMom][0][1][2][3];
00483     *mesonsAddr   += d_mom_proj[iMom][0][2][2][0];
00484     *mesonsAddr   -= d_mom_proj[iMom][0][3][2][1];
00485     *mesonsAddr   -= d_mom_proj[iMom][1][0][3][2];
00486     *mesonsAddr   += d_mom_proj[iMom][1][1][3][3];
00487     *mesonsAddr   -= d_mom_proj[iMom][1][2][3][0];
00488     *mesonsAddr   += d_mom_proj[iMom][1][3][3][1];
00489     *mesonsAddr   += d_mom_proj[iMom][2][0][0][2];
00490     *mesonsAddr   -= d_mom_proj[iMom][2][1][0][3];
00491     *mesonsAddr   += d_mom_proj[iMom][2][2][0][0];
00492     *mesonsAddr   -= d_mom_proj[iMom][2][3][0][1];
00493     *mesonsAddr   -= d_mom_proj[iMom][3][0][1][2];
00494     *mesonsAddr   += d_mom_proj[iMom][3][1][1][3];
00495     *mesonsAddr   -= d_mom_proj[iMom][3][2][1][0];
00496     *mesonsAddr++ += d_mom_proj[iMom][3][3][1][1]; 
00497 
00498     // Meson 5:   GAMMA = [gt^0][gz^1][gy^0][gx^1]     Catalin's 10
00499     //mesonsAddr++;
00500     //traceDirac(-1,(IFloat *)WGamma2Gamma4, (IFloat *)WGamma2Gamma4, iMom,mesonsAddr);
00501 
00502     *mesonsAddr    = d_mom_proj[iMom][0][1][1][0];
00503     *mesonsAddr   -= d_mom_proj[iMom][0][0][1][1];
00504     *mesonsAddr   += d_mom_proj[iMom][0][2][1][3];
00505     *mesonsAddr   -= d_mom_proj[iMom][0][3][1][2];
00506     *mesonsAddr   += d_mom_proj[iMom][1][0][0][1];
00507     *mesonsAddr   -= d_mom_proj[iMom][1][1][0][0];
00508     *mesonsAddr   -= d_mom_proj[iMom][1][2][0][3];
00509     *mesonsAddr   += d_mom_proj[iMom][1][3][0][2];
00510     *mesonsAddr   += d_mom_proj[iMom][2][0][3][1];
00511     *mesonsAddr   -= d_mom_proj[iMom][2][1][3][0];
00512     *mesonsAddr   -= d_mom_proj[iMom][2][2][3][3];
00513     *mesonsAddr   += d_mom_proj[iMom][2][3][3][2];
00514     *mesonsAddr   -= d_mom_proj[iMom][3][0][2][1];
00515     *mesonsAddr   += d_mom_proj[iMom][3][1][2][0];
00516     *mesonsAddr   += d_mom_proj[iMom][3][2][2][3];
00517     *mesonsAddr++ -= d_mom_proj[iMom][3][3][2][2]; 
00518 
00519     // Meson 6:     GAMMA = [gt^0][gz^0][gy^1][gx^1]  Catalin's 3
00520     //mesonsAddr++;
00521     //traceDirac(-1,(IFloat *)WGamma1Gamma4, (IFloat *)WGamma1Gamma4, iMom,mesonsAddr);
00522 
00523     *mesonsAddr    = d_mom_proj[iMom][0][2][1][3];
00524     *mesonsAddr   -= d_mom_proj[iMom][0][0][1][1];
00525     *mesonsAddr   -= d_mom_proj[iMom][0][1][1][0];
00526     *mesonsAddr   += d_mom_proj[iMom][0][3][1][2];
00527     *mesonsAddr   -= d_mom_proj[iMom][1][0][0][1];
00528     *mesonsAddr   -= d_mom_proj[iMom][1][1][0][0];
00529     *mesonsAddr   += d_mom_proj[iMom][1][2][0][3];
00530     *mesonsAddr   += d_mom_proj[iMom][1][3][0][2];
00531     *mesonsAddr   += d_mom_proj[iMom][2][0][3][1];
00532     *mesonsAddr   += d_mom_proj[iMom][2][1][3][0];
00533     *mesonsAddr   -= d_mom_proj[iMom][2][2][3][3];
00534     *mesonsAddr   -= d_mom_proj[iMom][2][3][3][2];
00535     *mesonsAddr   += d_mom_proj[iMom][3][0][2][1];
00536     *mesonsAddr   += d_mom_proj[iMom][3][1][2][0];
00537     *mesonsAddr   -= d_mom_proj[iMom][3][2][2][3];
00538     *mesonsAddr++ -= d_mom_proj[iMom][3][3][2][2];     
00539 
00540     // Meson 7:   GAMMA = [gt^0][gz^1][gy^1][gx^1]  Catalin's 11
00541     //mesonsAddr++;
00542     //traceDirac(-1,(IFloat *)WGamma4, (IFloat *)WGamma4, iMom, mesonsAddr);
00543 
00544     *mesonsAddr    = 0;    
00545     *mesonsAddr   -= d_mom_proj[iMom][0][0][2][2];
00546     *mesonsAddr   -= d_mom_proj[iMom][0][1][2][3];
00547     *mesonsAddr   -= d_mom_proj[iMom][0][2][2][0];
00548     *mesonsAddr   -= d_mom_proj[iMom][0][3][2][1];
00549     *mesonsAddr   -= d_mom_proj[iMom][1][0][3][2];
00550     *mesonsAddr   -= d_mom_proj[iMom][1][1][3][3];
00551     *mesonsAddr   -= d_mom_proj[iMom][1][2][3][0];
00552     *mesonsAddr   -= d_mom_proj[iMom][1][3][3][1];
00553     *mesonsAddr   -= d_mom_proj[iMom][2][0][0][2];
00554     *mesonsAddr   -= d_mom_proj[iMom][2][1][0][3];
00555     *mesonsAddr   -= d_mom_proj[iMom][2][2][0][0];
00556     *mesonsAddr   -= d_mom_proj[iMom][2][3][0][1];
00557     *mesonsAddr   -= d_mom_proj[iMom][3][0][1][2];
00558     *mesonsAddr   -= d_mom_proj[iMom][3][1][1][3];
00559     *mesonsAddr   -= d_mom_proj[iMom][3][2][1][0];
00560     *mesonsAddr++ -= d_mom_proj[iMom][3][3][1][1];     
00561 
00562     // Meson 8:     GAMMA = [gt^1][gz^0][gy^0][gx^0] Catalin's 4
00563     //mesonsAddr++;
00564     //traceDirac(1,(IFloat *)WGamma4Gamma5, (IFloat *)WGamma4Gamma5, iMom,mesonsAddr);
00565 
00566     *mesonsAddr    = d_mom_proj[iMom][0][0][2][2];
00567     *mesonsAddr   += d_mom_proj[iMom][0][1][2][3];
00568     *mesonsAddr   -= d_mom_proj[iMom][0][2][2][0];
00569     *mesonsAddr   -= d_mom_proj[iMom][0][3][2][1];
00570     *mesonsAddr   += d_mom_proj[iMom][1][0][3][2];
00571     *mesonsAddr   += d_mom_proj[iMom][1][1][3][3];
00572     *mesonsAddr   -= d_mom_proj[iMom][1][2][3][0];
00573     *mesonsAddr   -= d_mom_proj[iMom][1][3][3][1];
00574     *mesonsAddr   -= d_mom_proj[iMom][2][0][0][2];
00575     *mesonsAddr   -= d_mom_proj[iMom][2][1][0][3];
00576     *mesonsAddr   += d_mom_proj[iMom][2][2][0][0];
00577     *mesonsAddr   += d_mom_proj[iMom][2][3][0][1];
00578     *mesonsAddr   -= d_mom_proj[iMom][3][0][1][2];
00579     *mesonsAddr   -= d_mom_proj[iMom][3][1][1][3];
00580     *mesonsAddr   += d_mom_proj[iMom][3][2][1][0];
00581     *mesonsAddr++ += d_mom_proj[iMom][3][3][1][1]; 
00582 
00583     // Meson 9:   GAMMA = [gt^1][gz^0][gy^0][gx^1]   Catalin's 12
00584     //mesonsAddr++;
00585     //traceDirac(1,(IFloat *)WGamma1Gamma4Gamma5, (IFloat *)WGamma1Gamma4Gamma5,iMom, mesonsAddr);
00586 
00587     *mesonsAddr    = 0;    
00588     *mesonsAddr   -= d_mom_proj[iMom][0][0][1][1];
00589     *mesonsAddr   -= d_mom_proj[iMom][0][1][1][0];
00590     *mesonsAddr   -= d_mom_proj[iMom][0][2][1][3];
00591     *mesonsAddr   -= d_mom_proj[iMom][0][3][1][2];
00592     *mesonsAddr   -= d_mom_proj[iMom][1][0][0][1];
00593     *mesonsAddr   -= d_mom_proj[iMom][1][1][0][0];
00594     *mesonsAddr   -= d_mom_proj[iMom][1][2][0][3];
00595     *mesonsAddr   -= d_mom_proj[iMom][1][3][0][2];
00596     *mesonsAddr   -= d_mom_proj[iMom][2][0][3][1];
00597     *mesonsAddr   -= d_mom_proj[iMom][2][1][3][0];
00598     *mesonsAddr   -= d_mom_proj[iMom][2][2][3][3];
00599     *mesonsAddr   -= d_mom_proj[iMom][2][3][3][2];
00600     *mesonsAddr   -= d_mom_proj[iMom][3][0][2][1];
00601     *mesonsAddr   -= d_mom_proj[iMom][3][1][2][0];
00602     *mesonsAddr   -= d_mom_proj[iMom][3][2][2][3];
00603     *mesonsAddr++ -= d_mom_proj[iMom][3][3][2][2];     
00604 
00605     // Meson 10:    GAMMA = [gt^1][gz^0][gy^1][gx^0]  Catalin's 5
00606     //mesonsAddr++;
00607     //traceDirac(1,(IFloat *)WGamma2Gamma4Gamma5, (IFloat *)WGamma2Gamma4Gamma5,iMom, mesonsAddr);
00608 
00609     *mesonsAddr    = d_mom_proj[iMom][0][1][1][0];
00610     *mesonsAddr   -= d_mom_proj[iMom][0][0][1][1];
00611     *mesonsAddr   -= d_mom_proj[iMom][0][2][1][3];
00612     *mesonsAddr   += d_mom_proj[iMom][0][3][1][2];
00613     *mesonsAddr   += d_mom_proj[iMom][1][0][0][1];
00614     *mesonsAddr   -= d_mom_proj[iMom][1][1][0][0];
00615     *mesonsAddr   += d_mom_proj[iMom][1][2][0][3];
00616     *mesonsAddr   -= d_mom_proj[iMom][1][3][0][2];
00617     *mesonsAddr   -= d_mom_proj[iMom][2][0][3][1];
00618     *mesonsAddr   += d_mom_proj[iMom][2][1][3][0];
00619     *mesonsAddr   -= d_mom_proj[iMom][2][2][3][3];
00620     *mesonsAddr   += d_mom_proj[iMom][2][3][3][2];
00621     *mesonsAddr   += d_mom_proj[iMom][3][0][2][1];
00622     *mesonsAddr   -= d_mom_proj[iMom][3][1][2][0];
00623     *mesonsAddr   += d_mom_proj[iMom][3][2][2][3];
00624     *mesonsAddr++ -= d_mom_proj[iMom][3][3][2][2]; 
00625 
00626     // Meson 11:  GAMMA = [gt^1][gz^0][gy^1][gx^1]  Catalin's 13
00627     //mesonsAddr++;
00628     //traceDirac(-1,(IFloat *)WGamma3, (IFloat *)WGamma3, iMom, mesonsAddr);
00629 
00630     *mesonsAddr    = d_mom_proj[iMom][0][1][2][3];
00631     *mesonsAddr   -= d_mom_proj[iMom][0][0][2][2];
00632     *mesonsAddr   += d_mom_proj[iMom][0][2][2][0];
00633     *mesonsAddr   -= d_mom_proj[iMom][0][3][2][1];
00634     *mesonsAddr   += d_mom_proj[iMom][1][0][3][2];
00635     *mesonsAddr   -= d_mom_proj[iMom][1][1][3][3];
00636     *mesonsAddr   -= d_mom_proj[iMom][1][2][3][0];
00637     *mesonsAddr   += d_mom_proj[iMom][1][3][3][1];
00638     *mesonsAddr   += d_mom_proj[iMom][2][0][0][2];
00639     *mesonsAddr   -= d_mom_proj[iMom][2][1][0][3];
00640     *mesonsAddr   -= d_mom_proj[iMom][2][2][0][0];
00641     *mesonsAddr   += d_mom_proj[iMom][2][3][0][1];
00642     *mesonsAddr   -= d_mom_proj[iMom][3][0][1][2];
00643     *mesonsAddr   += d_mom_proj[iMom][3][1][1][3];
00644     *mesonsAddr   += d_mom_proj[iMom][3][2][1][0];
00645     *mesonsAddr++ -= d_mom_proj[iMom][3][3][1][1]; 
00646 
00647     // Meson 12:    GAMMA = [gt^1][gz^1][gy^0][gx^0] Catalin's 6
00648     //    mesonsAddr++;
00649     //traceDirac(1,(IFloat *)WGamma3Gamma4Gamma5, (IFloat *)WGamma3Gamma4Gamma5,iMom, mesonsAddr);
00650 
00651     *mesonsAddr    = d_mom_proj[iMom][0][1][0][1];
00652     *mesonsAddr   -= d_mom_proj[iMom][0][0][0][0];
00653     *mesonsAddr   -= d_mom_proj[iMom][0][2][0][2];
00654     *mesonsAddr   += d_mom_proj[iMom][0][3][0][3];
00655     *mesonsAddr   += d_mom_proj[iMom][1][0][1][0];
00656     *mesonsAddr   -= d_mom_proj[iMom][1][1][1][1];
00657     *mesonsAddr   += d_mom_proj[iMom][1][2][1][2];
00658     *mesonsAddr   -= d_mom_proj[iMom][1][3][1][3];
00659     *mesonsAddr   -= d_mom_proj[iMom][2][0][2][0];
00660     *mesonsAddr   += d_mom_proj[iMom][2][1][2][1];
00661     *mesonsAddr   -= d_mom_proj[iMom][2][2][2][2];
00662     *mesonsAddr   += d_mom_proj[iMom][2][3][2][3];
00663     *mesonsAddr   += d_mom_proj[iMom][3][0][3][0];
00664     *mesonsAddr   -= d_mom_proj[iMom][3][1][3][1];
00665     *mesonsAddr   += d_mom_proj[iMom][3][2][3][2];
00666     *mesonsAddr++ -= d_mom_proj[iMom][3][3][3][3];     
00667 
00668     // Meson 13:  GAMMA = [gt^1][gz^1][gy^0][gx^1]  Catalin's 14
00669     //mesonsAddr++;
00670     //traceDirac(-1,(IFloat *)WGamma2, (IFloat *)WGamma2, iMom, mesonsAddr);
00671 
00672     *mesonsAddr    = d_mom_proj[iMom][0][1][3][2];
00673     *mesonsAddr   -= d_mom_proj[iMom][0][0][3][3];
00674     *mesonsAddr   += d_mom_proj[iMom][0][2][3][1];
00675     *mesonsAddr   -= d_mom_proj[iMom][0][3][3][0];
00676     *mesonsAddr   += d_mom_proj[iMom][1][0][2][3];
00677     *mesonsAddr   -= d_mom_proj[iMom][1][1][2][2];
00678     *mesonsAddr   -= d_mom_proj[iMom][1][2][2][1];
00679     *mesonsAddr   += d_mom_proj[iMom][1][3][2][0];
00680     *mesonsAddr   += d_mom_proj[iMom][2][0][1][3];
00681     *mesonsAddr   -= d_mom_proj[iMom][2][1][1][2];
00682     *mesonsAddr   -= d_mom_proj[iMom][2][2][1][1];
00683     *mesonsAddr   += d_mom_proj[iMom][2][3][1][0];
00684     *mesonsAddr   -= d_mom_proj[iMom][3][0][0][3];
00685     *mesonsAddr   += d_mom_proj[iMom][3][1][0][2];
00686     *mesonsAddr   += d_mom_proj[iMom][3][2][0][1];
00687     *mesonsAddr++ -= d_mom_proj[iMom][3][3][0][0]; 
00688 
00689     // Meson 14:   GAMMA = [gt^1][gz^1][gy^1][gx^0] Catalin's 7
00690     // mesonsAddr++;
00691     //traceDirac(-1,(IFloat *)WGamma1, (IFloat *)WGamma1, iMom, mesonsAddr);
00692 
00693     *mesonsAddr    = d_mom_proj[iMom][0][2][3][1];
00694     *mesonsAddr   -= d_mom_proj[iMom][0][0][3][3];
00695     *mesonsAddr   -= d_mom_proj[iMom][0][1][3][2];
00696     *mesonsAddr   += d_mom_proj[iMom][0][3][3][0];
00697     *mesonsAddr   -= d_mom_proj[iMom][1][0][2][3];
00698     *mesonsAddr   -= d_mom_proj[iMom][1][1][2][2];
00699     *mesonsAddr   += d_mom_proj[iMom][1][2][2][1];
00700     *mesonsAddr   += d_mom_proj[iMom][1][3][2][0];
00701     *mesonsAddr   += d_mom_proj[iMom][2][0][1][3];
00702     *mesonsAddr   += d_mom_proj[iMom][2][1][1][2];
00703     *mesonsAddr   -= d_mom_proj[iMom][2][2][1][1];
00704     *mesonsAddr   -= d_mom_proj[iMom][2][3][1][0];
00705     *mesonsAddr   += d_mom_proj[iMom][3][0][0][3];
00706     *mesonsAddr   += d_mom_proj[iMom][3][1][0][2];
00707     *mesonsAddr   -= d_mom_proj[iMom][3][2][0][1];
00708     *mesonsAddr++ -= d_mom_proj[iMom][3][3][0][0]; 
00709 
00710     // Meson 15:  GAMMA = [gt^1][gz^1][gy^1][gx^1] Catalin's 15
00711     //mesonsAddr++;
00712     //traceDirac(1,(IFloat *)WUnitMat, (IFloat *)WUnitMat, iMom, mesonsAddr);
00713 
00714     *mesonsAddr    = d_mom_proj[iMom][0][0][0][0];
00715     *mesonsAddr   += d_mom_proj[iMom][0][1][0][1];
00716     *mesonsAddr   += d_mom_proj[iMom][0][2][0][2];
00717     *mesonsAddr   += d_mom_proj[iMom][0][3][0][3];
00718     *mesonsAddr   += d_mom_proj[iMom][1][0][1][0];
00719     *mesonsAddr   += d_mom_proj[iMom][1][1][1][1];
00720     *mesonsAddr   += d_mom_proj[iMom][1][2][1][2];
00721     *mesonsAddr   += d_mom_proj[iMom][1][3][1][3];
00722     *mesonsAddr   += d_mom_proj[iMom][2][0][2][0];
00723     *mesonsAddr   += d_mom_proj[iMom][2][1][2][1];
00724     *mesonsAddr   += d_mom_proj[iMom][2][2][2][2];
00725     *mesonsAddr   += d_mom_proj[iMom][2][3][2][3];
00726     *mesonsAddr   += d_mom_proj[iMom][3][0][3][0];
00727     *mesonsAddr   += d_mom_proj[iMom][3][1][3][1];
00728     *mesonsAddr   += d_mom_proj[iMom][3][2][3][2];
00729     *mesonsAddr   += d_mom_proj[iMom][3][3][3][3]; 
00730 
00731     // increment the pointer to the beginning of the next momentum
00732     mesonsAddr += numComplexToNextMom;    
00733   }
00734 }
00735 
00736 
00737 //---------------------------------------------------------------------------
00738 // void WspectMesons::print(const CommonArg *common_arg) const
00739 //--------------------------------------------------------------------------- 
00740 void
00741 WspectMesons::print(WspectOutput *w_spect_output) const
00742 {
00743 
00744 #if TARGET==cpsMPI
00745     using MPISCU::fprintf;
00746 #endif
00747   char *fname = "print";
00748   VRB.Func(d_class_name, fname);
00749 
00750   // the first 8 enum's have to be in the same order as in WspectOutput
00751   enum {a0,           a0_prime,     a1,        b1,
00752         pion,         pion_prime,   rho,       rho_prime,
00753         NUM_DATAFILEs,
00754         a1_x,         a1_y,         a1_z,
00755         b1_x,         b1_y,         b1_z,
00756         rho_x,        rho_y,        rho_z,
00757         rho_x_prime,  rho_y_prime,  rho_z_prime,
00758         NUM_MAP
00759   };
00760 
00761 
00762   // map[x] : filenames x => meson data for this particular prop dir
00763   //-------------------------------------------------------------------------
00764   int map[NUM_MAP];
00765   {
00766     int time = d_whr.dir();
00767     int offset_time = (1 << time);
00768 
00769     int space = 0;    
00770     for (int l = 0; l < LORENTZs; ++l) {
00771       if (l != time) {
00772         int offset_space       = (1<<l);
00773         map[rho_x+space]       =              offset_space;
00774         map[rho_x_prime+space] =              offset_space + offset_time;
00775         map[b1_x+space]        = (MESONs-1) - offset_space - offset_time;
00776         map[a1_x+space]        = (MESONs-1) - offset_space;
00777         ++space;
00778       }
00779     }
00780 
00781     map[pion]       = (MESONs-1);
00782     map[pion_prime] = (MESONs-1) - offset_time;
00783     map[a0]         = 0;
00784     map[a0_prime]   =              offset_time;
00785     map[a1]         = map[a1_x];
00786     map[b1]         = map[b1_x];
00787     map[rho]        = map[rho_x];
00788     map[rho_prime]  = map[rho_x_prime];
00789   }
00790 
00791   char *meson_names[16];
00792   meson_names[0] = w_spect_output->meson_name00;
00793   meson_names[1] = w_spect_output->meson_name01;
00794   meson_names[2] = w_spect_output->meson_name02;
00795   meson_names[3] = w_spect_output->meson_name03;
00796   meson_names[4] = w_spect_output->meson_name04;
00797   meson_names[5] = w_spect_output->meson_name05;
00798   meson_names[6] = w_spect_output->meson_name06;
00799   meson_names[7] = w_spect_output->meson_name07;
00800   meson_names[8] = w_spect_output->meson_name08;
00801   meson_names[9] = w_spect_output->meson_name09;
00802   meson_names[10] = w_spect_output->meson_name10;
00803   meson_names[11] = w_spect_output->meson_name11;
00804   meson_names[12] = w_spect_output->meson_name12;
00805   meson_names[13] = w_spect_output->meson_name13;
00806   meson_names[14] = w_spect_output->meson_name14;
00807   meson_names[15] = w_spect_output->meson_name15;
00808 
00809   // -mcneile
00810   // this routine was only correct for the a0, a0_prime
00811   // I can not see a simple way to fix it in the previous style
00812   // The meson names were obtained by empirically matching 
00813   // against the regression tests.
00814 
00815 #if 0
00816   char *meson_names[] = 
00817   {
00818 #if 1
00819     "Scalar.dat" , 
00820     "Vector_x.dat" , 
00821     "Vector_y.dat"    ,
00822     "Tensor_xy.dat"     ,
00823     "Vector_z.dat"    ,
00824     "Tensor_xz.dat",
00825     "Tensor_yz.dat",
00826     "PV_t.dat",
00827     "Vector_t.dat",
00828     "Tensor_xt.dat",
00829     "Tensor_yt.dat",
00830     "PV_z.dat" ,
00831     "Tensor_zt.dat" , 
00832     "PV_y.dat" , 
00833     "PV_x.dat" , 
00834     "PS.dat" 
00835 #else
00836     "a0.dat" , 
00837     "rho_x.dat" , 
00838     "rho_y.dat"    ,
00839     "b1_z.dat"     ,
00840     "rho_z.dat"    ,
00841     "b1_y.dat",
00842     "b1_x.dat",
00843     "pion_prime.dat",
00844     "a0_prime.dat",
00845     "rho_x_prime.dat",
00846     "rho_y_prime.dat",
00847     "a1_z.dat" ,
00848     "rho_z_prime.dat" , 
00849     "a1_y.dat" , 
00850     "a1_x.dat" , 
00851     "pion.dat" 
00852 #endif
00853 
00854   };
00855 #endif
00856 
00857   for(int imap= 0 ; imap < NUM_MAP ; ++imap)
00858     {  map[imap] = imap ; }
00859 
00860 
00861   //  --mcneile
00862   //  I am not sure what the lines below were meant to do 
00863   //  The attempt to average over x,y,z did not work
00864 
00865 #ifdef GGGGGGGGGGGGGG
00866   // average over x,y,z for vector mesons
00867   //        Complex[d_num_mom][global_slices][MESONs]
00868   //-------------------------------------------------------------------------
00869   {
00870     int size_in_complex = d_size / COMPLEXs;
00871     int x1 = map[a1_x];       int y1 = map[a1_y];    int z1 = map[a1_z];
00872     int x2 = map[b1_x];       int y2 = map[b1_y];    int z2 = map[b1_z];
00873     int x3 = map[rho_x];      int y3 = map[rho_y];   int z3 = map[rho_z];
00874     int x4 = map[rho_x_prime];
00875     int y4 = map[rho_y_prime];
00876     int z4 = map[rho_z_prime];
00877 
00878     for (int i = 0; i < size_in_complex; i += MESONs) {
00879       d_data_p[i+x1] += d_data_p[i+y1] += d_data_p[i+z1]; d_data_p[i+x1] /= 3;
00880       d_data_p[i+x2] += d_data_p[i+y2] += d_data_p[i+z2]; d_data_p[i+x2] /= 3;
00881       d_data_p[i+x3] += d_data_p[i+y3] += d_data_p[i+z3]; d_data_p[i+x3] /= 3;
00882       d_data_p[i+x4] += d_data_p[i+y4] += d_data_p[i+z4]; d_data_p[i+x4] /= 3;
00883     }
00884   }
00885 #endif 
00886 
00887   // Print out mesons
00888   //------------------------------------------------------------------
00889   FILE *fp;
00890   for (int meson = 0; meson < 16  ; ++meson) 
00891     {
00892       
00893       if ( !meson_names[meson] || !(fp = Fopen(meson_names[meson], "a")) ) {
00894         ERR.FileA(d_class_name,fname, meson_names[meson]);
00895       }
00896 
00897       printf("Writing data to file: %s\n",meson_names[meson]);
00898       for (int wall = 0; wall < d_glb_walls; ++wall) {
00899         for (int mom = 0; mom < d_num_mom; ++mom) {
00900           int offset = mom * d_glb_walls * MESONs + map[meson];
00901           Complex tmp = d_data_p[offset + MESONs*
00902                                 ((d_whr.glbCoord() + wall)%d_glb_walls)];
00903           // only print out the real parts
00904           Fprintf(fp, "%d %d %d %.10e\n", 
00905                   AlgWspect::GetCounter(), wall, mom, tmp.real());
00906         }
00907       }
00908       Fclose(fp);
00909 
00910     }
00911 
00912 
00913 
00914 }
00915 
00916 
00917 //---------------------------------------------------------------------------
00918 // void WspectMesons::print_mp(const CommonArg *common_arg) const
00919 //--------------------------------------------------------------------------- 
00920 void
00921 WspectMesons::print_mp(char *filename) const
00922 {
00923 
00924 #if TARGET==cpsMPI
00925     using MPISCU::fprintf;
00926 #endif
00927   char *fname = "print_mp";
00928   VRB.Func(d_class_name, fname);
00929 
00930   // Print out < \Delta J^5 \bar q \gamma^5 q> correlator
00931   // (mid-point sink)
00932   //------------------------------------------------------------------
00933   FILE *fp;
00934 
00935   if ( filename != 0 ) {
00936     if ( !(fp = Fopen(filename, "a")))
00937       ERR.FileA(d_class_name,fname, filename);
00938   
00939     for (int wall = 0; wall < d_glb_walls; ++wall) {
00940       for (int mom = 0; mom < d_num_mom; ++mom) {
00941         int offset = mom * d_glb_walls * MESONs + MESONs -1;
00942         Complex tmp = d_data_p[offset + MESONs*
00943                             ((d_whr.glbCoord() + wall)%d_glb_walls)];
00944         // only print out the real part
00945         Fprintf(fp, "%d %d %d %e\n",
00946                 AlgWspect::GetCounter(), wall, mom, tmp.real());
00947       }
00948     }
00949     Fclose(fp);
00950   }
00951 }
00952 
00953 //---------------------------------------------------------------------------
00954 // void WspectMesons::dumpData() const 
00955 //--------------------------------------------------------------------------- 
00956 void
00957 WspectMesons::dumpData(char *filename) const {
00958 
00959 #if TARGET==cpsMPI
00960     using MPISCU::fprintf;
00961 #endif
00962 
00963   FILE *fp;
00964   
00965   if (filename && (fp = Fopen(filename, "a"))) {
00966     for (int i = 0; i < d_size/COMPLEXs; ++i) {
00967       Fprintf(fp, "%.10e %.10e\n", d_data_p[i].real(), d_data_p[i].imag());
00968     }
00969     Fclose(fp);    
00970   } else {
00971     ERR.FileA(d_class_name, "dumpData", filename);
00972   }
00973 }
00974 
00975 
00976 
00977 
00978 
00979 
00980 
00981 
00982 
00983 
00984 
00985 
00986 
00987 
00988 
00989 
00990 
00991 
00992 
00993 
00994 
00995 
00996 
00997 
00998 
00999 
01000 
01001 
01002 
01003 //---------------------------------------------------------------------------
01004 //  ALL THE FOLLOWING CODE ARE ONLY FOR DEBUGGING PURPOSE.
01005 //  WE COMMENT THEM ALL OUT NOW.
01006 //
01007 
01008 //---------------------------------------------------------------------------
01009 //  math lib for the calculation of non-zero spatial momenta
01010 //---------------------------------------------------------------------------
01011 // Float COS(Float x) 
01012 //         calculate cos(2 PI x)
01013 // Float SIN(Float x)
01014 //         calculate sin(2 PI x)
01015 // Note:
01016 //  The Tartan library messes up the sign of cos and sin. It is correct
01017 //  iff the angle falls [0, PI]. 
01018 //  It is more accurate to comparing angle/(2 PI) against 0.5.
01019 //---------------------------------------------------------------------------
01020 
01021 
01022 //#define TEST_COS_SIN
01023 #ifdef  TEST_COS_SIN
01024 static void testCosSin()
01025 {
01026   Float f, g;  
01027   f = MY_TWO_PI * 0.101;     
01028   printf("COS(%g) = %g SIN(%g) = %g\n", (IFloat)f, 
01029          (IFloat)(COS(f)), (IFloat)f, (IFloat)(SIN(f)));
01030   g = -f;  
01031   printf("COS(%g) = %g SIN(%g) = %g\n", (IFloat)g, 
01032          (IFloat)(COS(g)), (IFloat)g, (IFloat)(SIN(g)));
01033   f += MY_TWO_PI * 0.2;    
01034   printf("COS(%g) = %g SIN(%g) = %g\n", (IFloat)f, 
01035          (IFloat)(COS(f)), (IFloat)f, (IFloat)(SIN(f)));
01036   g = -f;  
01037   printf("COS(%g) = %g SIN(%g) = %g\n", (IFloat)g, 
01038          (IFloat)(COS(g)), (IFloat)g, (IFloat)(SIN(g)));
01039   f += MY_TWO_PI * 0.2;    
01040   printf("COS(%g) = %g SIN(%g) = %g\n", (IFloat)f, 
01041          (IFloat)(COS(f)), (IFloat)f, (IFloat)(SIN(f)));
01042   g = -f;  
01043   printf("COS(%g) = %g SIN(%g) = %g\n", (IFloat)g, 
01044          (IFloat)(COS(g)), (IFloat)g, (IFloat)(SIN(g)));
01045   f += MY_TWO_PI * 0.2;    
01046   printf("COS(%g) = %g SIN(%g) = %g\n", (IFloat)f, 
01047          (IFloat)(COS(f)), (IFloat)f, (IFloat)(SIN(f)));
01048   g = -f;  
01049   printf("COS(%g) = %g SIN(%g) = %g\n", (IFloat)g, 
01050          (IFloat)(COS(g)), (IFloat)g, (IFloat)(SIN(g)));
01051   g = -f;  
01052   printf("COS(%g) = %g SIN(%g) = %g\n", (IFloat)g, 
01053          (IFloat)(COS(g)), (IFloat)g, (IFloat)(SIN(g)));
01054   f += MY_TWO_PI * 0.2;    
01055   printf("COS(%g) = %g SIN(%g) = %g\n", (IFloat)f, 
01056          (IFloat)(COS(f)), (IFloat)f, (IFloat)(SIN(f)));
01057   g = -f;  
01058   printf("COS(%g) = %g SIN(%g) = %g\n", (IFloat)g, 
01059          (IFloat)(COS(g)), (IFloat)g, (IFloat)(SIN(g)));
01060   f += MY_TWO_PI * 0.2;    
01061   printf("COS(%g) = %g SIN(%g) = %g\n", (IFloat)f, 
01062          (IFloat)(COS(f)), (IFloat)f, (IFloat)(SIN(f)));
01063   g = -f;  
01064   printf("COS(%g) = %g SIN(%g) = %g\n", (IFloat)g, 
01065          (IFloat)(COS(g)), (IFloat)g, (IFloat)(SIN(g)));
01066   f += MY_TWO_PI * 0.2;    
01067   printf("COS(%g) = %g SIN(%g) = %g\n", (IFloat)f, 
01068          (IFloat)(COS(f)), (IFloat)f, (IFloat)(SIN(f)));
01069   g = -f;  
01070   printf("COS(%g) = %g SIN(%g) = %g\n", (IFloat)g, 
01071          (IFloat)(COS(g)), (IFloat)g, (IFloat)(SIN(g)));
01072   f += MY_TWO_PI * 0.2;    
01073   printf("COS(%g) = %g SIN(%g) = %g\n", (IFloat)f, 
01074          (IFloat)(COS(f)), (IFloat)f, (IFloat)(SIN(f)));
01075   g = -f;  
01076   printf("COS(%g) = %g SIN(%g) = %g\n", (IFloat)g, 
01077          (IFloat)(COS(g)), (IFloat)g, (IFloat)(SIN(g)));
01078   f += MY_TWO_PI * 0.2;    
01079   printf("COS(%g) = %g SIN(%g) = %g\n", (IFloat)f, 
01080          (IFloat)(COS(f)), (IFloat)f, (IFloat)(SIN(f)));
01081   g = -f;  
01082   printf("COS(%g) = %g SIN(%g) = %g\n", (IFloat)g, 
01083          (IFloat)(COS(g)), (IFloat)g, (IFloat)(SIN(g)));
01084   f += MY_TWO_PI * 0.2;    
01085   printf("COS(%g) = %g SIN(%g) = %g\n", (IFloat)f, 
01086          (IFloat)(COS(f)), (IFloat)f, (IFloat)(SIN(f)));
01087   g = -f;  
01088   printf("COS(%g) = %g SIN(%g) = %g\n", (IFloat)g, 
01089          (IFloat)(COS(g)), (IFloat)g, (IFloat)(SIN(g)));
01090   f += MY_TWO_PI * 0.2;    
01091   printf("COS(%g) = %g SIN(%g) = %g\n", (IFloat)f, 
01092          (IFloat)(COS(f)), (IFloat)f, (IFloat)(SIN(f)));
01093   g = -f;  
01094   printf("COS(%g) = %g SIN(%g) = %g\n", (IFloat)g, 
01095          (IFloat)(COS(g)), (IFloat)g, (IFloat)(SIN(g)));
01096   f += MY_TWO_PI * 0.2;    
01097   printf("COS(%g) = %g SIN(%g) = %g\n", (IFloat)f, 
01098          (IFloat)(COS(f)), (IFloat)f, (IFloat)(SIN(f)));
01099   g = -f;  
01100   printf("COS(%g) = %g SIN(%g) = %g\n", (IFloat)g, 
01101          (IFloat)(COS(g)), (IFloat)g, (IFloat)(SIN(g)));
01102   f += MY_TWO_PI * 0.2;    
01103   printf("COS(%g) = %g SIN(%g) = %g\n", (IFloat)f, 
01104          (IFloat)(COS(f)), (IFloat)f, (IFloat)(SIN(f)));
01105   g = -f;  
01106   printf("COS(%g) = %g SIN(%g) = %g\n", (IFloat)g, 
01107          (IFloat)(COS(g)), (IFloat)g, (IFloat)(SIN(g)));
01108   f += MY_TWO_PI * 0.2;    
01109   printf("COS(%g) = %g SIN(%g) = %g\n", (IFloat)f, 
01110          (IFloat)(COS(f)), (IFloat)f, (IFloat)(SIN(f)));
01111   g = -f;  
01112   printf("COS(%g) = %g SIN(%g) = %g\n", (IFloat)g, 
01113          (IFloat)(COS(g)), (IFloat)g, (IFloat)(SIN(g)));
01114   f += MY_TWO_PI * 0.2;    
01115   printf("COS(%g) = %g SIN(%g) = %g\n", (IFloat)f, 
01116          (IFloat)(COS(f)), (IFloat)f, (IFloat)(SIN(f)));
01117   g = -f;  
01118   printf("COS(%g) = %g SIN(%g) = %g\n", (IFloat)g, 
01119          (IFloat)(COS(g)), (IFloat)g, (IFloat)(SIN(g)));
01120   f += MY_TWO_PI * 0.2;    
01121   printf("COS(%g) = %g SIN(%g) = %g\n", (IFloat)f, 
01122          (IFloat)(COS(f)), (IFloat)f, (IFloat)(SIN(f)));
01123   g = -f;  
01124   printf("COS(%g) = %g SIN(%g) = %g\n", (IFloat)g, 
01125          (IFloat)(COS(g)), (IFloat)g, (IFloat)(SIN(g)));
01126   f += MY_TWO_PI * 0.2;    
01127   printf("COS(%g) = %g SIN(%g) = %g\n", (IFloat)f, 
01128          (IFloat)(COS(f)), (IFloat)f, (IFloat)(SIN(f)));
01129   g = -f;  
01130   printf("COS(%g) = %g SIN(%g) = %g\n", (IFloat)g, 
01131          (IFloat)(COS(g)), (IFloat)g, (IFloat)(SIN(g)));
01132   f += MY_TWO_PI * 0.2;    
01133   printf("COS(%g) = %g SIN(%g) = %g\n", (IFloat)f, 
01134          (IFloat)(COS(f)), (IFloat)f, (IFloat)(SIN(f)));
01135   g = -f;  
01136   printf("COS(%g) = %g SIN(%g) = %g\n", (IFloat)g, 
01137          (IFloat)(COS(g)), (IFloat)g, (IFloat)(SIN(g)));
01138   f += MY_TWO_PI * 0.2;    
01139   printf("COS(%g) = %g SIN(%g) = %g\n", (IFloat)f, 
01140          (IFloat)(COS(f)), (IFloat)f, (IFloat)(SIN(f)));
01141   g = -f;  
01142   printf("COS(%g) = %g SIN(%g) = %g\n", (IFloat)g, 
01143          (IFloat)(COS(g)), (IFloat)g, (IFloat)(SIN(g)));
01144   f += MY_TWO_PI * 0.2;    
01145   printf("COS(%g) = %g SIN(%g) = %g\n", (IFloat)f, 
01146          (IFloat)(COS(f)), (IFloat)f, (IFloat)(SIN(f)));
01147   g = -f;  
01148   printf("COS(%g) = %g SIN(%g) = %g\n", (IFloat)g, 
01149          (IFloat)(COS(g)), (IFloat)g, (IFloat)(SIN(g)));
01150   f += MY_TWO_PI * 0.2;    
01151   printf("COS(%g) = %g SIN(%g) = %g\n", (IFloat)f, 
01152          (IFloat)(COS(f)), (IFloat)f, (IFloat)(SIN(f)));
01153   g = -f;  
01154   printf("COS(%g) = %g SIN(%g) = %g\n", (IFloat)g, 
01155          (IFloat)(COS(g)), (IFloat)g, (IFloat)(SIN(g)));
01156   f += MY_TWO_PI * 0.2;    
01157   printf("COS(%g) = %g SIN(%g) = %g\n", (IFloat)f, 
01158          (IFloat)(COS(f)), (IFloat)f, (IFloat)(SIN(f)));
01159   g = -f;  
01160   printf("COS(%g) = %g SIN(%g) = %g\n", (IFloat)g, 
01161          (IFloat)(COS(g)), (IFloat)g, (IFloat)(SIN(g)));
01162   f += MY_TWO_PI * 0.2;    
01163   printf("COS(%g) = %g SIN(%g) = %g\n", (IFloat)f, 
01164          (IFloat)(COS(f)), (IFloat)f, (IFloat)(SIN(f)));
01165   g = -f;  
01166   printf("COS(%g) = %g SIN(%g) = %g\n", (IFloat)g, 
01167          (IFloat)(COS(g)), (IFloat)g, (IFloat)(SIN(g)));
01168   f += MY_TWO_PI * 0.2;    
01169   printf("COS(%g) = %g SIN(%g) = %g\n", (IFloat)f, 
01170          (IFloat)(COS(f)), (IFloat)f, (IFloat)(SIN(f)));
01171   g = -f;  
01172   printf("COS(%g) = %g SIN(%g) = %g\n", (IFloat)g, 
01173          (IFloat)(COS(g)), (IFloat)g, (IFloat)(SIN(g)));
01174   f += MY_TWO_PI * 0.2;    
01175   printf("COS(%g) = %g SIN(%g) = %g\n", (IFloat)f, 
01176          (IFloat)(COS(f)), (IFloat)f, (IFloat)(SIN(f)));
01177   g = -f;  
01178   printf("COS(%g) = %g SIN(%g) = %g\n", (IFloat)g, 
01179          (IFloat)(COS(g)), (IFloat)g, (IFloat)(SIN(g)));
01180 }
01181 #endif   // #ifdef TEST_COS_SIN
01182 
01183 CPS_END_NAMESPACE

Generated on Sat Oct 10 14:11:21 2009 for Columbia Physics System by  doxygen 1.3.9.1