std::fclose(file);
}
-void make_diffusion_file(const char* file_name, std::vector< std::vector< float > > D)
+void make_diffusion_file(const char* file_name, std::vector< float > D)
{
FILE *file;
file = std::fopen(file_name, "w+");
for (int i = 0; i < D.size(); i++) {
- std::fprintf(file, "diffusion for tau= %d\n", i);
- for (int j = 0; j < D[i].size(); j++) {
- std::fprintf(file, "%f ", D[i][j]);
- }
- std::fprintf(file, "\n");
+ std::fprintf(file, "%f ", D[i]);
}
std::fclose(file);
}
std::vector< float > d;
d.resize(traj.front().size(), 0);
+ //int nth = omp_get_thread_num();
#pragma omp parallel shared(crl, temp_zero, d)
{
- #pragma omp for schedule(dynamic)
+
for (int i = tauS; i <= tauE; i += 1) {
std::vector< RVec > medx, medy;
RVec temp1, temp2;
float tmp;
medx.resize(traj.front().size(), temp_zero);
medy.resize(traj.front().size(), temp_zero);
+ #pragma omp for schedule(dynamic)
for (int j = 0; j < traj.size() - i - 1; j++) {
for (int f = 0; f < traj.front().size(); f++) {
medx[f] += (traj[b_frame][f] - traj[j][f]);
medy[f] += (traj[b_frame][f] - traj[j + i][f]);
}
}
+ #pragma omp barrier
+ #pragma omp for schedule(dynamic)
for (int j = 0; j < traj.front().size(); j++) {
tmp = traj.size() - 1;
tmp -= i;
medx[j] *= tmp;
medy[j] *= tmp;
}
+ #pragma omp barrier
std::vector< std::vector< float > > a, b, c;
a.resize(traj.front().size(), d);
b.resize(traj.front().size(), d);
c.resize(traj.front().size(), d);
for (int j = 0; j < traj.size() - i - 1; j++) {
for (int f1 = 0; f1 < traj.front().size(); f1++) {
+ #pragma omp for schedule(dynamic)
for (int f2 = 0; f2 < traj.front().size(); f2++) {
temp1 = traj[b_frame][f1] - traj[j][f1] - medx[f1];
temp2 = traj[b_frame][f2] - traj[j + i][f2] - medy[f2];
b[f1][f2] += (temp1[0] * temp1[0] + temp1[1] * temp1[1] + temp1[2] * temp1[2]);
c[f1][f2] += (temp2[0] * temp2[0] + temp2[1] * temp2[1] + temp2[2] * temp2[2]);
}
+ #pragma omp barrier
}
}
+
+ #pragma omp for schedule(dynamic)
for (int j = 0; j < traj.front().size(); j++) {
for (int f = 0; f < traj.front().size(); f++) {
crl[i][j][f] = a[j][f] / (std::sqrt(b[j][f] * c[j][f]));
}
}
+ #pragma omp barrier
medx.resize(0);
medy.resize(0);
std::cout << i << " corr done\n";
}
}
- #pragma omp barrier
+
}
void graph_calculation(std::vector< std::vector< std::pair< float, int > > > &graph, std::vector< std::vector< int > > &s_graph, std::vector< std::vector< std::pair< int, int > > > &s_graph_rbr,
return temp;
}
-void evaluate_diffusion(std::vector< std::vector< RVec > > trj, std::vector< std::vector< float > > &D/*, int max_frame_depth*/) {
- D.resize(trj.size() * 0.9 /*max_frame_depth*/);
+void evaluate_diffusion(std::vector< std::vector< RVec > > trj, std::vector< float > &D/*, int max_frame_depth*/) {
+ D.resize(trj.size() * 0.9 - 1/*max_frame_depth*/);
+ float temp;
for (int i = 1; i < trj.size() * 0.9 /*max_frame_depth*/; i++) {
- D[i].resize(trj.size() - 1 - i /*trj.size() - 1 - max_frame_depth*/);
+ temp = 0;
for (int j = 0; j < trj.size() - 1 - i /*trj.size() - 1 - max_frame_depth*/; j++) {
- D[i][j] = (evaluate_com(trj[j]) - evaluate_com(trj[j + i])).norm2() / (2 * i);
+ temp += (evaluate_com(trj[j]) - evaluate_com(trj[j + i])).norm2();
+ //D[i][j] = (evaluate_com(trj[j]) - evaluate_com(trj[j + i])).norm2() / (2 * i);
}
+ D[i - 1] = temp / (trj.size() - 1 - i) / (2 * i * 0.000001);
}
}
std::cout << "extra params\n";
- std::vector< std::vector< float > > diffusion;
+ std::vector< float > diffusion;
evaluate_diffusion(trajectory, diffusion);
make_diffusion_file((OutPutName + "_diffusion.txt").c_str(), diffusion);