Exemplo n.º 1
0
  void read_Gaugefield_from_file(Gaugefield &gf,
                                 const int cid,
                                 const nyom::Core & core){
    nyom::Stopwatch sw;

    sw.reset();
    tmLQCD_read_gauge( cid );
    sw.elapsed_print("tmLQCD gauge field reading");

    int Nd = 4;
    int Nc = gf.U[0].lens[GF_DIM_CR];

    // global dimensions
    int Nt = gf.U[0].lens[GF_DIM_T];
    int Nx = gf.U[0].lens[GF_DIM_X];
    int Ny = gf.U[0].lens[GF_DIM_Y];
    int Nz = gf.U[0].lens[GF_DIM_Z];

    int Nt_local = core.geom.lat.T;
    int Nx_local = core.geom.lat.LX;
    int Ny_local = core.geom.lat.LY;
    int Nz_local = core.geom.lat.LZ;

    int64_t npair;
    int64_t * indices;
    complex<double> * pairs;

    for( int dir = 0; dir < 4; ++dir ){
      sw.reset();
      gf.U[dir].read_local(&npair, &indices, &pairs);
      sw.elapsed_print_and_reset("gf.read_local");

      int64_t counter = 0;
      for( int t = 0; t < Nt_local; ++t){
        int gt = Nt_local*core.geom.tmlqcd_mpi.proc_coords[0] + t;
        
        for( int x = 0; x < Nx_local; ++x){
          int gx = Nx_local*core.geom.tmlqcd_mpi.proc_coords[1] + x;

          for( int y = 0; y < Ny_local; ++y){
            int gy = Ny_local*core.geom.tmlqcd_mpi.proc_coords[2] + y;

            for( int z = 0; z < Nz_local; ++z){
              int gz = Nz_local*core.geom.tmlqcd_mpi.proc_coords[3] + z;

              for( int cr = 0; cr < Nc; ++cr ){
                for( int cc = 0; cc < Nc; ++cc ){
                  indices[counter] = cc
                                     + cr  * Nc
                                     + gz  * Nc*Nc
                                     + gy  * Nc*Nc*Nz
                                     + gx  * Nc*Nc*Nz*Ny
                                     + gt  * Nc*Nc*Nz*Ny*Nx;

                  pairs[counter] = std::complex<double>(su3_get_elem(&g_gauge_field[ g_ipt[t][x][y][z] ][dir],
                                                                     cr,
                                                                     cc,
                                                                     0),
                                                        su3_get_elem(&g_gauge_field[ g_ipt[t][x][y][z] ][dir], 
                                                                     cr,
                                                                     cc,
                                                                     1) 
                                                        );
                  counter++;
                } // cc
              } // cr
            } // z
          } // y
        } // x
      } // t
      sw.elapsed_print_and_reset("gf reshuffle");
      gf.U[dir].write(npair, indices, pairs);
      sw.elapsed_print("gf.write");
      free(indices); free(pairs);
    } // dir
  }
Exemplo n.º 2
0
int main(int argc, char *argv[]){

  //MPI initialisation stuff
  //MPI_Init(&argc, &argv);
  int mpi_thread_provided;
  MPI_Init_thread(&argc, &argv, MPI_THREAD_SERIALIZED, &mpi_thread_provided);
  int numprocs = 0, myid = 0;
  MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
  MPI_Comm_rank(MPI_COMM_WORLD, &myid);
  
  //Eigen::initParallel();
  //Eigen::setNbThreads(64);

  // initialisation of the twisted mass stuff - MUST BE the first thing to do
  int verbose = 1; // set to 1 to make tmLQCD more verbose
  tmLQCD_invert_init(argc, argv, verbose);
  MPI_Barrier(MPI_COMM_WORLD);

  // initialisation of distillery
  LapH::input_parameter param;
  param.parse_input_file(argc, argv);
  if(myid == 0)
    std::cout << "processing config: " << param.config << "\n" << std::endl;
  MPI_Barrier(MPI_COMM_WORLD);

  tmLQCD_read_gauge(param.config);
  MPI_Barrier(MPI_COMM_WORLD);

  LapH::distillery dis;
  dis.initialise(param);
  MPI_Barrier(MPI_COMM_WORLD);

  // preparing source creation -------------------------------------------------
  size_t nb_of_inversions = param.dilution_size_so[0] * 
                            param.dilution_size_so[1] *
                            param.dilution_size_so[2];
  int length = 3*4*param.Lt*param.Ls*param.Ls*param.Ls/numprocs;
  std::complex<double>** sources = new std::complex<double>*[nb_of_inversions];
  for(size_t i = 0; i < nb_of_inversions; ++i)
        sources[i] = new std::complex<double>[length];

  // loop over random vectors
  for(size_t rnd_id = 0; rnd_id < param.nb_rnd; ++rnd_id) {
    // source creation
    dis.create_source(sources); 
    // loop over all inversions
    for(size_t dil_t = 0; dil_t < param.dilution_size_so[0]; ++dil_t){
      for(size_t dil_e = 0; dil_e < param.dilution_size_so[1]; ++dil_e){        
        for(size_t dil_d = 0; dil_d < param.dilution_size_so[2]; ++dil_d){        

          if(myid == 0) 
            std::cout << "\t\nDoing inversions at: " << dil_t << "\t" << dil_e 
                      << "\t" << dil_d << "\n" << std::endl;
  
          // tmLQCD can also write the propagator, if requested
          unsigned int op_id = 0;
          unsigned int write_prop = 0;
          size_t i = param.dilution_size_so[2]*
                     (param.dilution_size_so[1]*dil_t+dil_e) + dil_d;
          tmLQCD_invert((double *) sources[i], (double *) sources[i], op_id, 
                        write_prop);
          MPI_Barrier(MPI_COMM_WORLD);

        }
      }
    } // end of loop over inversions

    // constructing the perambulator
    dis.add_to_perambulator(sources);
    MPI_Barrier(MPI_COMM_WORLD);
    // creating new random vector and writing perambulator to disk -------------------
    dis.write_perambulator_to_disk(rnd_id); // ---------------------------------------
    MPI_Barrier(MPI_COMM_WORLD);
    if(rnd_id < param.nb_rnd - 1)
      dis.reset_perambulator_and_randomvector(rnd_id+1);
    MPI_Barrier(MPI_COMM_WORLD);
  } // end of loop over random vectors

  tmLQCD_finalise();
  dis.clean();

  MPI_Finalize();
	return 0;
}