void ClusterDist_DME::PairwiseDist(ClusterMatrix& frameDistances, ClusterSieve::SievedFrames const& frames) { int f1, f2; Frame frm2 = frm1_; int f2end = (int)frames.size(); int f1end = f2end - 1; #ifdef _OPENMP Frame frm1 = frm1_; # define frm1_ frm1 #pragma omp parallel private(f1, f2) firstprivate(frm1, frm2) { #pragma omp for schedule(dynamic) #endif for (f1 = 0; f1 < f1end; f1++) { coords_->GetFrame( frames[f1], frm1_, mask_ ); for (f2 = f1 + 1; f2 < f2end; f2++) { coords_->GetFrame( frames[f2], frm2, mask_ ); frameDistances.SetElement( f1, f2, frm1_.DISTRMSD( frm2 ) ); } } #ifdef _OPENMP # undef frm1_ } // END pragma omp parallel #endif }
void ClusterDist_SRMSD::PairwiseDist(ClusterMatrix& frameDistances, ClusterSieve::SievedFrames const& frames) { double rmsd; int f1, f2; Frame frm2 = frm1_; int f2end = (int)frames.size(); int f1end = f2end - 1; ParallelProgress progress(f1end); #ifdef _OPENMP Frame frm1 = frm1_; # define frm1_ frm1 SymmetricRmsdCalc SRMSD_OMP = SRMSD_; # define SRMSD_ SRMSD_OMP #pragma omp parallel private(f1, f2, rmsd) firstprivate(SRMSD_OMP, frm1, frm2, progress) { progress.SetThread(omp_get_thread_num()); #pragma omp for schedule(dynamic) #endif for (f1 = 0; f1 < f1end; f1++) { progress.Update(f1); coords_->GetFrame( frames[f1], frm1_, mask_ ); for (f2 = f1 + 1; f2 < f2end; f2++) { coords_->GetFrame( frames[f2], frm2, mask_ ); rmsd = SRMSD_.SymmRMSD(frm1_, frm2); frameDistances.SetElement( f1, f2, rmsd ); } } #ifdef _OPENMP # undef frm1_ # undef SRMSD_ } // END pragma omp parallel #endif progress.Finish(); }
void ClusterDist_Euclid::PairwiseDist(ClusterMatrix& frameDistances, ClusterSieve::SievedFrames const& frames) { int f1, f2; double dist, diff; DcArray::iterator dcalc; D1Array::iterator ds; int f2end = (int)frames.size(); int f1end = f2end - 1; #ifdef _OPENMP #pragma omp parallel private(f1, f2, dist, diff, dcalc, ds) { #pragma omp for schedule(dynamic) #endif for (f1 = 0; f1 < f1end; f1++) { for (f2 = f1 + 1; f2 < f2end; f2++) { dist = 0.0; dcalc = dcalcs_.begin(); for (ds = dsets_.begin(); ds != dsets_.end(); ++ds, ++dcalc) { diff = (*dcalc)((*ds)->Dval(frames[f1]), (*ds)->Dval(frames[f2])); dist += (diff * diff); } frameDistances.SetElement( f1, f2, sqrt(dist) ); } } #ifdef _OPENMP } #endif }
void ClusterDist_Num::PairwiseDist(ClusterMatrix& frameDistances, ClusterSieve::SievedFrames const& frames) { int f1, f2; int f2end = (int)frames.size(); int f1end = f2end - 1; #ifdef _OPENMP #pragma omp parallel private(f1, f2) { #pragma omp for schedule(dynamic) #endif for (f1 = 0; f1 < f1end; f1++) { for (f2 = f1 + 1; f2 < f2end; f2++) frameDistances.SetElement( f1, f2, dcalc_(data_->Dval(frames[f1]), data_->Dval(frames[f2])) ); } #ifdef _OPENMP } #endif }