void Action_Dihedral::Print() { if (range360_) { DataSet_double* ds = (DataSet_double*)dih_; for (int i = 0; i < ds->Size(); i++) { if ( (*ds)[i] < 0.0 ) (*ds)[i] += 360.0; } } }
int KDE::CalcKDE(DataSet_double& Out, DataSet_1D const& Pdata, std::vector<double> const& Increments, HistBin const& Xdim, double bandwidth) const { int inSize = (int)Pdata.Size(); // Allocate output set, set all to zero. Out.Zero( Xdim.Bins() ); Out.SetDim( Dimension::X, Xdim ); int outSize = (int)Out.Size(); int frame, bin; double increment, val; double total = 0.0; # ifdef _OPENMP int original_num_threads; # pragma omp parallel { # pragma omp master { original_num_threads = omp_get_num_threads(); } } // Ensure we only execute with the desired number of threads if (numthreads_ < original_num_threads) omp_set_num_threads( numthreads_ ); # endif // Calculate KDE, loop over input data # ifdef _OPENMP int mythread; double **P_thread; # pragma omp parallel private(frame, bin, val, increment, mythread) reduction(+:total) { mythread = omp_get_thread_num(); // Prevent race conditions by giving each thread its own histogram # pragma omp master { P_thread = new double*[ numthreads_ ]; for (int nt = 0; nt < numthreads_; nt++) { P_thread[nt] = new double[ outSize ]; std::fill(P_thread[nt], P_thread[nt] + outSize, 0.0); } } # pragma omp barrier # pragma omp for # endif for (frame = 0; frame < inSize; frame++) { val = Pdata.Dval(frame); increment = Increments[frame]; total += increment; // Apply kernel across histogram for (bin = 0; bin < outSize; bin++) # ifdef _OPENMP P_thread[mythread][bin] += # else Out[bin] += # endif (increment * (this->*Kernel_)( (Xdim.Coord(bin) - val) / bandwidth )); } # ifdef _OPENMP } // END parallel block // Combine results from each thread histogram into Out for (int i = 0; i < numthreads_; i++) { for (int j = 0; j < outSize; j++) Out[j] += P_thread[i][j]; delete[] P_thread[i]; } delete[] P_thread; // Restore original number of threads if (original_num_threads != numthreads_) omp_set_num_threads( original_num_threads ); # endif // Normalize for (unsigned int j = 0; j < Out.Size(); j++) Out[j] /= (total * bandwidth); return 0; }