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 }
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; }