71 MPI_Comm_size(MPI_COMM_WORLD, &nProcs);
72 MPI_Comm_rank(MPI_COMM_WORLD, &rank);
75 MPI_Barrier(MPI_COMM_WORLD);
83 error_exit(
"This program cannot be executed in a single working node");
92 addParamsLine(
" [--mpi_job_size <size=10>]: Number of images sent to a cpu in a single job");
95 addParamsLine(
" : posible value that may not be the best option");
103 std::cerr <<
" Size of mpi jobs " << mpi_job_size <<std::endl;
124 time_dif = difftime (end,start);
126 std::cerr<<
" starting prerun rank= "<<rank<<std::endl;
142 time_dif = difftime (end,start);
144 std::cerr<<
" set rand seed rank= "<<rank<<std::endl;
149 MPI_Bcast (&my_seed, 1, MPI_INT, 0, MPI_COMM_WORLD);
154 time_dif = difftime (end,start);
156 std::cerr<<
" after perturb rank= "<<rank<<std::endl;
171 time_dif = difftime (end,start);
173 std::cerr<<
" setsampling rank= "<<rank<<std::endl;
184 time_dif = difftime (end,start);
186 std::cerr<<
" compute sampling points rank= "<<rank<<std::endl;
207 time_dif = difftime (end,start);
209 std::cerr<<
" remove redundant rank= "<<rank<<std::endl;
219 time_dif = difftime (end,start);
221 std::cerr<<
" remove points far away rank= "<<rank<<std::endl;
257 if (mpi_job_size != -1)
263 numberOfJobs=nProcs-1;
273 std::cerr <<
"numberOfJobs: " << numberOfJobs << std::endl
284 int numberProjections = std::ceil(360.0 /
psi_sampling);
286 std::cerr <<
"creating Blank file: " 288 << numberProjections <<
" projections of size: " <<
Xdim <<
" " <<
Ydim 293 MPI_Barrier(MPI_COMM_WORLD);
307 MPI_Probe(MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status);
312 MPI_COMM_WORLD, &status);
316 std::cerr <<
"Mr_f received TAG_FREEWORKER from worker " << status.MPI_SOURCE << std::endl;
329 std::cerr <<
"Ms_f sent TAG_WORKFORWORKER to worker " << status.MPI_SOURCE << std::endl;
330 std::cerr <<
"Sent jobNo " <<
i << std::endl;
336 std::cerr <<
"M_f Received unknown TAG" << std::endl;
346 while (stopTagsSent < (nProcs-1))
349 MPI_COMM_WORLD, &status);
352 std::cerr <<
"Mr received TAG_FREEWORKER from worker " << status.MPI_SOURCE << std::endl;
353 std::cerr <<
"Ms sent TAG_STOP to worker" << status.MPI_SOURCE << std::endl;
357 MPI_Send(
nullptr, 0, MPI_INT, status.MPI_SOURCE,
TAG_STOP, MPI_COMM_WORLD);
374 size_t myCounter = 0;
378 for (
size_t objId : mySFin.
ids())
381 double x,
y,
z, rot, tilt,
psi;
408 mySF.
setComment(
"x,y,z refer to the coordinates of the unitary vector at direction given by the euler angles");
430 std::cerr <<
"W" << rank <<
" " <<
"sent TAG_FREEWORKER to master " << std::endl;
434 MPI_Probe(0, MPI_ANY_TAG, MPI_COMM_WORLD, &status);
437 std::cerr <<
"W" << rank <<
" " <<
"probe MPI_ANY_TAG " << std::endl;
445 MPI_Recv(
nullptr, 0, MPI_INT, 0,
TAG_STOP,
446 MPI_COMM_WORLD, &status);
449 std::cerr <<
"Wr" << rank <<
" " <<
"TAG_STOP" << std::endl;
461 std::cerr <<
"Wr" << rank <<
" " <<
"TAG_WORKFORWORKER" << std::endl;
462 std::cerr <<
"jobNumber " << jobNumber << std::endl;
467 std::min((
size_t)((jobNumber+1)* mpi_job_size -1),
474 std::cerr <<
"3) Received unknown TAG I quit" << std::endl;
491 MPI_Abort(MPI_COMM_WORLD, EXIT_FAILURE);
504 std::cerr <<
"Error!" <<std::endl;
505 std::cerr << XE.what();
511 std::cout <<
"Done!" <<std::endl;
void init_progress_bar(long total)
void setSampling(double sampling)
void min(Image< double > &op1, const Image< double > &op2)
void removeRedundantPoints(const int symmetry, int sym_order)
void setNoise(double deviation, int my_seed=-1)
FileName output_file_root
#define REPORT_ERROR(nerr, ErrormMsg)
void createAsymUnitFile(const FileName &docfilename)
void setNeighborhoodRadius(double neighborhood)
void findClosestSamplingPoint(const MetaData &DFi, const FileName &output_file_root)
int readSymmetryFile(FileName fn_sym, double accuracy=SYM_ACCURACY)
bool isSymmetryGroup(FileName fn_sym, int &pgGroup, int &pgOrder)
constexpr int TAG_WORKFORWORKER
FileName fn_sym
symmetry file for sampling
void computeNeighbors(bool only_winner=false)
void compose(const String &str, const size_t no, const String &ext="")
void saveSamplingFile(const FileName &fn_base, bool write_vectors=true, bool write_sampling_sphere=false)
bool angular_distance_bool
FileName fn_sym_neigh
symmetry file for heighbors computation
void createGroupSamplingFiles(void)
bool compute_closer_sampling_point_bool
std::vector< Matrix1D< double > > exp_data_projection_direction_by_L_R
void computeSamplingPoints(bool only_half_sphere=true, double max_tilt=180, double min_tilt=0)
void project_angle_vector(int my_init, int my_end, bool verbose=true)
void progress_bar(long rlen)
Error related to numerical calculation.
void createGroupSamplingFiles(void)
void createEmptyFile(const FileName &filename, int xdim, int ydim, int Zdim, size_t select_img, bool isStack, int mode, int _swapWrite, const MDRowVec *md)
int verbose
Verbosity level.
void fillLRRepository(void)
bool remove_points_far_away_from_experimental_data_bool
FileName FnexperimentalImages
std::vector< Matrix1D< double > > no_redundant_sampling_points_angles
ProgMpiAngularProjectLibrary()
double psi(const double x)
fprintf(glob_prnt.io, "\)
int read(const FileName &name, DataMode datamode=DATA, size_t select_img=ALL_IMAGES, bool mapData=false, int mode=WRITE_READONLY)
void fillExpDataProjectionDirectionByLR(const MetaData &DFi)
void removePointsFarAwayFromExperimentalData()
int getIntParam(const char *param, int arg=0)
bool compute_neighbors_bool
double perturb_projection_vector
void addParamsLine(const String &line)
void error_exit(const char *msg)
constexpr int TAG_FREEWORKER