pre rebuild state
authorAnatoly <Titov_AI@pnpi.nrcki.ru>
Tue, 29 Oct 2019 11:52:24 +0000 (14:52 +0300)
committerAnatoly <Titov_AI@pnpi.nrcki.ru>
Tue, 29 Oct 2019 11:52:24 +0000 (14:52 +0300)
CMakeLists.txt
src/CMakeLists.txt
src/domains.cpp

index 4d77447fcde763da612279f583ccf54935a93207..eda633bf6a09ab26edc41950b91ed5f97563de42 100644 (file)
@@ -1,7 +1,11 @@
-cmake_minimum_required(VERSION 2.8.8)
+cmake_minimum_required(VERSION 3.4.3)
 
 project(gromacs-domains CXX)
 
+set(CMAKE_CXX_STANDARD 11)
+set(CMAKE_CXX_STANDARD_REQUIRED ON)
+set(CMAKE_CXX_EXTENSIONS OFF)
+
 if (NOT CMAKE_BUILD_TYPE)
     set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel." FORCE)
 endif()
@@ -29,10 +33,15 @@ else()
     set(GROMACS_SUFFIX ${GMX_SUFFIX})
 endif()
 
-find_package(GROMACS 2016 REQUIRED)
+if (GMX_OPENMP)
+    find_package(OpenMP REQUIRED)
+else()
+    find_package(OpenMP)
+endif()
+
+find_package(GROMACS 2019 REQUIRED)
 gromacs_check_double(GMX_DOUBLE)
 gromacs_check_compiler(CXX)
-include(gmxManageOpenMP)
 
 add_definitions(${GROMACS_DEFINITIONS})
 
index a904b08c89dccb990a403dd54d953074bae8ab24..24a9ae16ed435b76a2c9c433ee3c66e5668704b7 100644 (file)
@@ -5,4 +5,4 @@ include_directories(
         ${CMAKE_SOURCE_DIR}/include)
 set_target_properties(domains PROPERTIES
        COMPILE_FLAGS "${GROMACS_CXX_FLAGS}")
-target_link_libraries(domains ${GROMACS_LIBRARIES})
+target_link_libraries(domains ${GROMACS_LIBRARIES} ${OpenMP_CXX_LIBRARIES})
index 0f1b0bd9ae0af62114964b6babf3d6ea2e4b80f0..ec4298e5b3d700e1ffe25c0279b4e58ff4663563 100644 (file)
@@ -42,6 +42,8 @@
 
 #include <iostream>
 #include <chrono>
+#include <cstdint>
+#include <cfloat>
 #include <omp.h>
 
 #include <gromacs/trajectoryanalysis.h>
 #include <gromacs/utility/smalloc.h>
 #include <gromacs/math/do_fit.h>
 
+#include <gromacs/trajectoryanalysis/topologyinformation.h>
+#include "gromacs/topology/topology.h"
+#include "gromacs/topology/index.h"
+
+
 #define MAX_NTRICVEC 12
 
 using namespace gmx;
@@ -70,46 +77,33 @@ void searchF0xyzabc (double &F, double &Fx, double &Fy, double &Fz, double &Fa,
     t05 = (aix + biy_plus_y * (cos(A) * sin(C) - cos(C) * sin(A) * sin(B)) - biz_plus_z * (sin(A) * sin(C) + cos(A) * cos(C) * sin(B)) - cos(B) * cos(C) * bix_plus_x);
     t06 = (aiz + sin(B) * bix_plus_x - cos(A) * cos(B) * biz_plus_z - cos(B) * sin(A) * biy_plus_y);
     t07 = (aiy - biy_plus_y * (cos(A) * cos(C) + sin(A) * sin(B) * sin(C)) + biz_plus_z * (cos(C) * sin(A) - cos(A) * sin(B) * sin(C)) - cos(B) * sin(C) * bix_plus_x);
-
-    //#pragma omp parallel sections
-    //{
-        //#pragma omp section
-            F += t04;
-        //#pragma omp section
-            Fx += -(2 * cos(B) * cos(C) * t05 - 2 * sin(B) * t06 + 2 * cos(B) * sin(C) * t07) / (2 * t04);
-        //#pragma omp section
-            Fy += -(2 * (cos(A) * cos(C) + sin(A) * sin(B) * sin(C)) * t07 - 2 * (cos(A) * sin(C) - cos(C) * sin(A) * sin(B)) * t05 + 2 * cos(B) * sin(A) * t06) / (2 * t04);
-        //#pragma omp section
-            Fz += -(2 * (sin(A) * sin(C) + cos(A) * cos(C) * sin(B)) * t05 - 2 * (cos(C) * sin(A) - cos(A) * sin(B) * sin(C)) * t07 + 2 * cos(A) * cos(B) * t06) / (2 * t04);
-        //#pragma omp section
-            Fa += -(2 * (cos(A) * cos(B) * biy_plus_y - cos(B) * sin(A) * biz_plus_z) * t06 -
-                2 * (biy_plus_y * (cos(C) * sin(A) - cos(A) * sin(B) * sin(C)) + biz_plus_z * (cos(A) * cos(C) + sin(A) * sin(B) * sin(C))) * t07 +
-                2 * (biy_plus_y * (sin(A) * sin(C) + cos(A) * cos(C) * sin(B)) + biz_plus_z * (cos(A) * sin(C) - cos(C) * sin(A) * sin(B))) * t05) / (2 * t04);
-        //#pragma omp section
-            Fb += -(2 * (cos(A) * cos(B) * sin(C) * biz_plus_z - sin(B) * sin(C) * bix_plus_x + cos(B) * sin(A) * sin(C) * biy_plus_y) * t07 +
-                2 * (cos(A) * cos(B) * cos(C) * biz_plus_z - cos(C) * sin(B) * bix_plus_x + cos(B) * cos(C) * sin(A) * biy_plus_y) * t05 -
-                2 * (cos(B) * bix_plus_x + sin(A) * sin(B) * biy_plus_y + cos(A) * sin(B) * biz_plus_z) * t06) / (2 * t04);
-        //#pragma omp section
-            Fc += (2 * (biy_plus_y * (cos(A) * cos(C) + sin(A) * sin(B) * sin(C)) - biz_plus_z * (cos(C) * sin(A) - cos(A) * sin(B) * sin(C)) + cos(B) * sin(C) * bix_plus_x) * t05 -
-                2 * (biz_plus_z * (sin(A) * sin(C) + cos(A) * cos(C) * sin(B)) - biy_plus_y * (cos(A) * sin(C) - cos(C) * sin(A) * sin(B)) + cos(B) * cos(C) * bix_plus_x) * t07) / (2 * t04);
-    //}
+    F += t04;
+    Fx += -(2 * cos(B) * cos(C) * t05 - 2 * sin(B) * t06 + 2 * cos(B) * sin(C) * t07) / (2 * t04);
+    Fy += -(2 * (cos(A) * cos(C) + sin(A) * sin(B) * sin(C)) * t07 - 2 * (cos(A) * sin(C) - cos(C) * sin(A) * sin(B)) * t05 + 2 * cos(B) * sin(A) * t06) / (2 * t04);
+    Fz += -(2 * (sin(A) * sin(C) + cos(A) * cos(C) * sin(B)) * t05 - 2 * (cos(C) * sin(A) - cos(A) * sin(B) * sin(C)) * t07 + 2 * cos(A) * cos(B) * t06) / (2 * t04);
+    Fa += -(2 * (cos(A) * cos(B) * biy_plus_y - cos(B) * sin(A) * biz_plus_z) * t06 -
+            2 * (biy_plus_y * (cos(C) * sin(A) - cos(A) * sin(B) * sin(C)) + biz_plus_z * (cos(A) * cos(C) + sin(A) * sin(B) * sin(C))) * t07 +
+            2 * (biy_plus_y * (sin(A) * sin(C) + cos(A) * cos(C) * sin(B)) + biz_plus_z * (cos(A) * sin(C) - cos(C) * sin(A) * sin(B))) * t05) / (2 * t04);
+    Fb += -(2 * (cos(A) * cos(B) * sin(C) * biz_plus_z - sin(B) * sin(C) * bix_plus_x + cos(B) * sin(A) * sin(C) * biy_plus_y) * t07 +
+            2 * (cos(A) * cos(B) * cos(C) * biz_plus_z - cos(C) * sin(B) * bix_plus_x + cos(B) * cos(C) * sin(A) * biy_plus_y) * t05 -
+            2 * (cos(B) * bix_plus_x + sin(A) * sin(B) * biy_plus_y + cos(A) * sin(B) * biz_plus_z) * t06) / (2 * t04);
+    Fc += (2 * (biy_plus_y * (cos(A) * cos(C) + sin(A) * sin(B) * sin(C)) - biz_plus_z * (cos(C) * sin(A) - cos(A) * sin(B) * sin(C)) + cos(B) * sin(C) * bix_plus_x) * t05 -
+            2 * (biz_plus_z * (sin(A) * sin(C) + cos(A) * cos(C) * sin(B)) - biy_plus_y * (cos(A) * sin(C) - cos(C) * sin(A) * sin(B)) + cos(B) * cos(C) * bix_plus_x) * t07) / (2 * t04);
 }
 
 void ApplyFit (std::vector< RVec > &b, double x, double y, double z, double A, double B, double C) {
-    RVec temp;
-    //#pragma omp parallel
-    //{
-        //#pragma omp for schedule(dynamic)
-        for (int i = 0; i < b.size(); i++) {
-            temp = b[i];
-            b[i][0] = (temp[2] + z) * (sin(A) * sin(C) + cos(A) * cos(C) * sin(B)) - (temp[1] + y) * (cos(A) * sin(C) - cos(C) * sin(A) * sin(B)) + cos(B) * cos(C) * (temp[0] + x);
-            b[i][1] = (temp[1] + y) * (cos(A) * cos(C) + sin(A) * sin(B) * sin(C)) - (temp[2] + z) * (cos(C) * sin(A) - cos(A) * sin(B) * sin(C)) + cos(B) * sin(C) * (temp[0] + x);
-            b[i][2] = cos(A) * cos(B) * (temp[2] + z) - sin(B) * (temp[0] + x) + cos(B) * sin(A) * (temp[1] + y);
-        }
-    //}
+    double t0 = 0, t1 = 0, t2 = 0;
+    for (unsigned int i = 0; i < b.size(); i++) {
+        t0 = static_cast< double >(b[i][0]);
+        t1 = static_cast< double >(b[i][1]);
+        t2 = static_cast< double >(b[i][2]);
+        b[i][0] = static_cast< float >((t2 + z) * (sin(A) * sin(C) + cos(A) * cos(C) * sin(B)) - (t1 + y) * (cos(A) * sin(C) - cos(C) * sin(A) * sin(B)) + cos(B) * cos(C) * (t0 + x));
+        b[i][1] = static_cast< float >((t1 + y) * (cos(A) * cos(C) + sin(A) * sin(B) * sin(C)) - (t2 + z) * (cos(C) * sin(A) - cos(A) * sin(B) * sin(C)) + cos(B) * sin(C) * (t0 + x));
+        b[i][2] = static_cast< float >(cos(A) * cos(B) * (t2 + z) - sin(B) * (t0 + x) + cos(B) * sin(A) * (t1 + y));
+    }
 }
 
-void CalcMid (std::vector< RVec > a, std::vector< RVec > b, RVec &midA, RVec &midB, std::vector< std::pair< int, int > > pairs) {
+void CalcMid (std::vector< RVec > a, std::vector< RVec > b, RVec &midA, RVec &midB, std::vector< std::pair< unsigned int, unsigned int > > pairs) {
     midA[0] = 0;
     midA[1] = 0;
     midA[2] = 0;
@@ -118,7 +112,7 @@ void CalcMid (std::vector< RVec > a, std::vector< RVec > b, RVec &midA, RVec &mi
     midB[1] = 0;
     midB[2] = 0;
 
-    for (int i = 0; i < pairs.size(); i++) {
+    for (unsigned int i = 0; i < pairs.size(); i++) {
         rvec_inc(midA, a[pairs[i].first]);
         rvec_inc(midB, b[pairs[i].second]);
     }
@@ -131,14 +125,15 @@ void CalcMid (std::vector< RVec > a, std::vector< RVec > b, RVec &midA, RVec &mi
     midB[2] /= pairs.size();
 }
 
-void MyFitNew (std::vector< RVec > a, std::vector< RVec > &b, std::vector< std::pair< int, int > > pairs, double FtCnst) {
+void MyFitNew (std::vector< RVec > a, std::vector< RVec > &b, std::vector< std::pair< unsigned int, unsigned int > > pairs, double FtCnst) {
     double f1 = 0, f2 = 0, fx = 0, fy = 0, fz = 0, fa = 0, fb = 0, fc = 0, l = 1;
     RVec ma, mb;
     CalcMid(a, b, ma, mb, pairs);
     rvec_dec(ma, mb);
-    double x = ma[0], y = ma[1], z = ma[2], A = 0, B = 0, C = 0;
-    for (int i = 0; i < pairs.size(); i++) {
-        f1 += F(a[pairs[i].first][0], a[pairs[i].first][1], a[pairs[i].first][2], b[pairs[i].second][0] + x, b[pairs[i].second][1] + y, b[pairs[i].second][2] + z, A, B, C);
+    double x = static_cast< double >(ma[0]), y = static_cast< double >(ma[1]), z = static_cast< double >(ma[2]), A = 0, B = 0, C = 0;
+    for (unsigned int i = 0; i < pairs.size(); i++) {
+        f1 += F(static_cast< double >(a[pairs[i].first][0]), static_cast< double >(a[pairs[i].first][1]), static_cast< double >(a[pairs[i].first][2]),
+                static_cast< double >(b[pairs[i].second][0]) + x, static_cast< double >(b[pairs[i].second][1]) + y, static_cast< double >(b[pairs[i].second][2]) + z, A, B, C);
     }
     if (FtCnst == 0) {
         FtCnst = 0.00001;
@@ -148,14 +143,19 @@ void MyFitNew (std::vector< RVec > a, std::vector< RVec > &b, std::vector< std::
     } else {
         int count = 0;
         while (f1 - f2 < 0 || f1 - f2 > FtCnst) {
-            f1 = 0; fx = 0; fy = 0; fz = 0; fa = 0; fb = 0; fc = 0;
-            for (int i = 0; i < pairs.size(); i++) {
-                searchF0xyzabc(f1, fx, fy, fz, fa, fb, fc, a[pairs[i].first][0], a[pairs[i].first][1], a[pairs[i].first][2], b[pairs[i].second][0] + x, b[pairs[i].second][1] + y, b[pairs[i].second][2] + z, A, B, C);
+            f1 = 0; fx = 0; fy = 0; fz = 0; fa = 0; fb = 0; fc = 0; l = 1;
+            for (unsigned int i = 0; i < pairs.size(); i++) {
+                searchF0xyzabc(f1, fx, fy, fz, fa, fb, fc,
+                               static_cast< double >(a[pairs[i].first][0]), static_cast< double >(a[pairs[i].first][1]), static_cast< double >(a[pairs[i].first][2]),
+                               static_cast< double >(b[pairs[i].second][0]) + x, static_cast< double >(b[pairs[i].second][1]) + y,
+                               static_cast< double >(b[pairs[i].second][2]) + z, A, B, C);
             }
-            while (true) {
+            while (f2 != f1) {
                 f2 = 0;
-                for (int i = 0; i < pairs.size(); i++) {
-                    f2 += F(a[pairs[i].first][0], a[pairs[i].first][1], a[pairs[i].first][2], b[pairs[i].second][0] + (x - l * fx), b[pairs[i].second][1] + (y - l * fy), b[pairs[i].second][2] + (z - l * fz), A - l * fa, B - l * fb, C - l * fc);
+                for (unsigned int i = 0; i < pairs.size(); i++) {
+                    f2 += F(static_cast< double >(a[pairs[i].first][0]), static_cast< double >(a[pairs[i].first][1]), static_cast< double >(a[pairs[i].first][2]),
+                            static_cast< double >(b[pairs[i].second][0]) + (x - l * fx), static_cast< double >(b[pairs[i].second][1]) + (y - l * fy),
+                            static_cast< double >(b[pairs[i].second][2]) + (z - l * fz), A - l * fa, B - l * fb, C - l * fc);
                 }
                 count++;
                 if (f2 < f1) {
@@ -163,10 +163,20 @@ void MyFitNew (std::vector< RVec > a, std::vector< RVec > &b, std::vector< std::
                     fx = 0; fy = 0; fz = 0; fa = 0; fb = 0; fc = 0;
                     break;
                 } else {
-                    l *= 0.85;
+                    //l *= 0.85;
+                    l *= 0.50;
+                    /*if (count >= 14) {
+                        std::cout << count << " " << l << "\n";
+                    }*/
+                    if (l == DBL_MIN) { /*DBL_TRUE_MIN*/
+                        break;
+                    }
                 }
             }
             count++;
+            if (count % 100000 == 0) {
+                std::cout << "+100k\n";
+            }
         }
         ApplyFit(b, x, y, z, A, B, C);
     }
@@ -178,28 +188,27 @@ struct node {
     bool yep;
 };
 
-void make_graph(int mgwi_natoms, std::vector < RVec > mgwi_x, std::vector< std::vector< node > > &mgwi_graph)
+void make_graph(unsigned long mgwi_natoms, std::vector < RVec > mgwi_x, std::vector< std::vector< node > > &mgwi_graph)
 {
     mgwi_graph.resize(mgwi_natoms);
-    for (int i = 0; i < mgwi_natoms; i++) {
+    for (unsigned int i = 0; i < mgwi_natoms; i++) {
         mgwi_graph[i].resize(mgwi_natoms);
     }
-    for (int i = 0; i < mgwi_natoms; i++) {
-        for (int j = 0; j < mgwi_natoms; j++) {
+    for (unsigned int i = 0; i < mgwi_natoms; i++) {
+        for (unsigned int j = 0; j < mgwi_natoms; j++) {
             rvec_sub(mgwi_x[i].as_vec(), mgwi_x[j].as_vec(), mgwi_graph[i][j].r.as_vec());
             mgwi_graph[i][j].n = 0;
         }
     }
 }
 
-void update_graph(std::vector< std::vector< node > > &ugwi_graph, std::vector < RVec > ugwi_x, long double ugwi_epsi) {
+void update_graph(std::vector< std::vector< node > > &ugwi_graph, std::vector < RVec > ugwi_x, /*long*/ double ugwi_epsi) {
     RVec ugwi_temp;
-    int ugwi_for = ugwi_graph.size();
-    for (int i = 0; i < ugwi_for; i++) {
-        for (int j = i; j < ugwi_for; j++) {
+    for (unsigned int i = 0; i < ugwi_graph.size(); i++) {
+        for (unsigned int j = i; j < ugwi_graph.size(); j++) {
             rvec_sub(ugwi_x[i].as_vec(), ugwi_x[j].as_vec(), ugwi_temp.as_vec());
             rvec_dec(ugwi_temp.as_vec(), ugwi_graph[i][j].r.as_vec());
-            if (norm(ugwi_temp) <= ugwi_epsi) {
+            if (static_cast< double >(norm(ugwi_temp)) <= ugwi_epsi) {
                 if (i == j) {
                     ugwi_graph[i][j].n++;
                 }
@@ -212,11 +221,10 @@ void update_graph(std::vector< std::vector< node > > &ugwi_graph, std::vector <
     }
 }
 
-void check_domains(long double cd_delta, int cd_frames, std::vector< std::vector< std::vector< node > > > &cd_graph) {
-    int cd_for1 = cd_graph.size(), cd_for2 = cd_graph[1].size();
-    for (int k = 0; k < cd_for1; k++) {
-        for (int i = 0; i < cd_for2; i++) {
-            for (int j = 0; j < cd_for2; j++) {
+void check_domains(double cd_delta, int cd_frames, std::vector< std::vector< std::vector< node > > > &cd_graph) {
+    for (unsigned int k = 0; k < cd_graph.size(); k++) {
+        for (unsigned int i = 0; i < cd_graph[1].size(); i++) {
+            for (unsigned int j = 0; j < cd_graph[1].size(); j++) {
                 if (cd_graph[k][i][j].n >= cd_frames * cd_delta) {
                     cd_graph[k][i][j].yep = true;
                 }
@@ -230,11 +238,10 @@ void check_domains(long double cd_delta, int cd_frames, std::vector< std::vector
 
 void find_domain_sizes(std::vector< std::vector< std::vector< node > > > fds_graph, std::vector< std::vector< int > > &fds_domsizes) {
     fds_domsizes.resize(fds_graph.size());
-    int fds_for1 = fds_graph.size(), fds_for2 = fds_graph[1].size();
-    for (int i = 0; i < fds_for1; i++) {
-        fds_domsizes[i].resize(fds_for2, 0);
-        for (int j = 0; j < fds_for2; j++) {
-            for (int k = 0; k < fds_for2; k++) {
+    for (unsigned int i = 0; i < fds_graph.size(); i++) {
+        fds_domsizes[i].resize(fds_graph[1].size(), 0);
+        for (unsigned int j = 0; j < fds_graph[1].size(); j++) {
+            for (unsigned int k = 0; k < fds_graph[1].size(); k++) {
                 if (fds_graph[i][j][k].yep) {
                     fds_domsizes[i][j]++;
                 }
@@ -243,11 +250,10 @@ void find_domain_sizes(std::vector< std::vector< std::vector< node > > > fds_gra
     }
 }
 
-void get_maxsized_domain(std::vector< int > &gmd_max_d, std::vector< std::vector< std::vector< node > > > gmd_graph, std::vector< std::vector< int > > gmd_domsizes) {
-    int gmd_number1 = 0, gmd_number2 = 0;
-    int gmd_for1 = gmd_domsizes.size(), gmd_for2 = gmd_domsizes[0].size();
-    for (int i = 0; i < gmd_for1; i++) {
-        for (int j = 0; j < gmd_for2; j++) {
+void get_maxsized_domain(std::vector< unsigned int > &gmd_max_d, std::vector< std::vector< std::vector< node > > > gmd_graph, std::vector< std::vector< int > > gmd_domsizes) {
+    unsigned int gmd_number1 = 0, gmd_number2 = 0;
+    for (unsigned int i = 0; i < gmd_domsizes.size(); i++) {
+        for (unsigned int j = 0; j < gmd_domsizes[0].size(); j++) {
             if (gmd_domsizes[i][j] >= gmd_domsizes[gmd_number1][gmd_number2]) {
                 gmd_number1 = i;
                 gmd_number2 = j;
@@ -255,19 +261,17 @@ void get_maxsized_domain(std::vector< int > &gmd_max_d, std::vector< std::vector
         }
     }
     gmd_max_d.resize(0);
-    int gmd_for3 = gmd_graph[gmd_number1][gmd_number2].size();
-    for (int i = 0; i < gmd_for3; i++) {
+    for (unsigned int i = 0; i < gmd_graph[gmd_number1][gmd_number2].size(); i++) {
         if (gmd_graph[gmd_number1][gmd_number2][i].yep) {
             gmd_max_d.push_back(i);
         }
     }
 }
 
-void get_min_domain(std::vector< int > &gmd_min_d, std::vector< std::vector< std::vector< node > > > gmd_graph, std::vector< std::vector< int > > gmd_domsizes, int gmd_min_dom_size) {
-    int gmd_number1 = 0, gmd_number2 = 0;
-    int gmd_for1 = gmd_domsizes.size(), gmd_for2 = gmd_domsizes[0].size();
-    for (int i = 0; i < gmd_for1; i++) {
-        for (int j = 0; j < gmd_for2; j++) {
+void get_min_domain(std::vector< unsigned int > &gmd_min_d, std::vector< std::vector< std::vector< node > > > gmd_graph, std::vector< std::vector< int > > gmd_domsizes, int gmd_min_dom_size) {
+    unsigned int gmd_number1 = 0, gmd_number2 = 0;
+    for (unsigned int i = 0; i < gmd_domsizes.size(); i++) {
+        for (unsigned int j = 0; j < gmd_domsizes[0].size(); j++) {
             if (gmd_domsizes[gmd_number1][gmd_number2] < gmd_min_dom_size && gmd_domsizes[i][j] >= gmd_min_dom_size) {
                 gmd_number1 = i;
                 gmd_number2 = j;
@@ -279,19 +283,17 @@ void get_min_domain(std::vector< int > &gmd_min_d, std::vector< std::vector< std
         }
     }
     gmd_min_d.resize(0);
-    int gmd_for3 = gmd_graph[gmd_number1][gmd_number2].size();
-    for (int i = 0; i < gmd_for3; i++) {
+    for (unsigned int i = 0; i < gmd_graph[gmd_number1][gmd_number2].size(); i++) {
         if (gmd_graph[gmd_number1][gmd_number2][i].yep) {
             gmd_min_d.push_back(i);
         }
     }
 }
 
-void delete_domain_from_graph(std::vector< std::vector< std::vector< node > > > &ddf_graph, std::vector< int > ddf_domain) {
-    int ddfg_for1 = ddf_domain.size(), ddfg_for2 = ddf_graph.size(), ddfg_for3 = ddf_graph[1].size();
-    for (int i = 0; i < ddfg_for1; i++) {
-        for (int k = 0; k < ddfg_for2; k++) {
-            for (int j = 0; j < ddfg_for3; j++) {
+void delete_domain_from_graph(std::vector< std::vector< std::vector< node > > > &ddf_graph, std::vector< unsigned int > ddf_domain) {
+    for (unsigned int i = 0; i < ddf_domain.size(); i++) {
+        for (unsigned int k = 0; k < ddf_graph.size(); k++) {
+            for (unsigned int j = 0; j < ddf_graph[1].size(); j++) {
                 if (ddf_graph[k][ddf_domain[i]][j].yep) {
                     ddf_graph[k][ddf_domain[i]][j].yep = false;
                 }
@@ -304,9 +306,8 @@ void delete_domain_from_graph(std::vector< std::vector< std::vector< node > > >
 }
 
 bool check_domsizes(std::vector< std::vector< int > > cd_domsizes, int cd_domain_min_size) {
-    int cd_for1 = cd_domsizes.size(), cd_for2 = cd_domsizes[0].size();
-    for (int i = 0; i < cd_for1; i++) {
-        for (int j = 0; j < cd_for2; j++) {
+    for (unsigned int i = 0; i < cd_domsizes.size(); i++) {
+        for (unsigned int j = 0; j < cd_domsizes[0].size(); j++) {
             if (cd_domsizes[i][j] >= cd_domain_min_size) {
                 return true;
             }
@@ -315,14 +316,14 @@ bool check_domsizes(std::vector< std::vector< int > > cd_domsizes, int cd_domain
     return false;
 }
 
-void print_domains(std::vector< std::vector< int > > pd_domains, std::vector< int > index, std::string fnNdx_, int dms, double epsi, double delta) {
+void print_domains(std::vector< std::vector< unsigned int > > pd_domains, std::vector< int > index, std::string fnNdx_, int dms, double epsi, double delta) {
     FILE               *fpNdx_;
     fpNdx_ = std::fopen(fnNdx_.c_str(), "w+");
     int write_count;
-    for (int i = 0; i < pd_domains.size(); i++) {
+    for (unsigned int i = 0; i < pd_domains.size(); i++) {
         std::fprintf(fpNdx_, "[domain_№_%3d_%3d_%4.3f_%4.3f]\n", i + 1, dms, epsi, delta);
         write_count = 0;
-        for (int j = 0; j < pd_domains[i].size(); j++) {
+        for (unsigned int j = 0; j < pd_domains[i].size(); j++) {
             write_count++;
             if (write_count > 20) {
                 write_count -= 20;
@@ -357,9 +358,6 @@ class Domains : public TrajectoryAnalysisModule
         virtual void initAnalysis(const TrajectoryAnalysisSettings &settings,
                                   const TopologyInformation        &top);
 
-        virtual void initAfterFirstFrame(const TrajectoryAnalysisSettings   &settings,
-                                         const t_trxframe                   &fr);
-
         //! Call for each frame of the trajectory
         // virtual void analyzeFrame(const t_trxframe &fr, t_pbc *pbc);
         virtual void analyzeFrame(int frnr, const t_trxframe &fr, t_pbc *pbc,
@@ -376,24 +374,26 @@ class Domains : public TrajectoryAnalysisModule
 
         std::string                                                 fnNdx_;
 
-        std::vector< std::vector< std::vector< node > > >           graph;
+        //std::vector< std::vector< std::vector< node > > >           graph;
+        std::vector< std::vector< std::vector< std::vector< node > > > >    graph;
 
-        std::vector< std::vector< int > >                           domains;
+
+        std::vector< std::vector< unsigned int > >                  domains;
         std::vector< std::vector< int > >                           domsizes;
 
         std::vector< int >                                          index;
         std::vector< int >                                          numbers;
-        std::vector< std::vector < RVec > >                         trajectory;
+        std::vector< RVec >                                         trajectory;
+        std::vector< RVec >                                         reference;
         Selection                                                   selec;
         int                                                         frames              = 0;
-        int                                                         domain_min_size     = 5; // selectable
+        int                                                         domain_min_size     = 4; // selectable
 
-        std::vector< std::vector< std::pair< int, int > > >         w_rls2;
-        int                                                         bone;
-        double                                                      delta               = 0.90; // selectable
-        double                                                      epsi                = 0.15; // selectable
+        std::vector< std::vector< std::pair< unsigned int, unsigned int > > >         w_rls2;
+        unsigned int                                                bone;
+        double                                                      delta               = 0.95; // selectable
+        double                                                      epsi                = 0.10; // selectable
 
-        int                                                         domains_ePBC;
         int                                                         DomainSearchingAlgorythm = 0; // selectable
         // Copy and assign disallowed by base.
 };
@@ -426,7 +426,7 @@ Domains::initOptions(IOptionsContainer          *options,
     // Add option for domain min size constant
     options->addOption(gmx::IntegerOption("dms")
                             .store(&domain_min_size)
-                            .description("minimum domain size"));
+                            .description("minimum domain size, should be >= 4"));
     // Add option for Domain's Searching Algorythm
     options->addOption(gmx::IntegerOption("DSA")
                             .store(&DomainSearchingAlgorythm)
@@ -441,61 +441,57 @@ Domains::initOptions(IOptionsContainer          *options,
                             .description("domain membership probability"));
     // Control input settings
     settings->setFlags(TrajectoryAnalysisSettings::efNoUserPBC);
+    settings->setFlag(TrajectoryAnalysisSettings::efUseTopX);
     settings->setPBC(true);
 }
 
 void
 Domains::initAnalysis(const TrajectoryAnalysisSettings &settings,
                       const TopologyInformation        &top)
-{
-}
-
-void
-Domains::initAfterFirstFrame(const TrajectoryAnalysisSettings       &settings,
-                             const t_trxframe                       &fr)
 {
     index.resize(0);
     for (ArrayRef< const int >::iterator ai = selec.atomIndices().begin(); (ai < selec.atomIndices().end()); ai++) {
         index.push_back(*ai);
     }
-    trajectory.resize(2);
-    trajectory[0].resize(selec.atomCount());
 
-    for (int i = 0; i < selec.atomCount(); i++) {
-        trajectory[0][i] = fr.x[index[i]];
+    reference.resize(0);
+    if (top.hasFullTopology()) {
+        for (unsigned int i = 0; i < index.size(); i++) {
+            reference.push_back(top.x().at(index[i]));
+        }
     }
 
-    bone = index.size() - domain_min_size + 1;
-    graph.resize(bone);
+    graph.resize(0);
+
+    bone = static_cast< unsigned int >(index.size() - static_cast< unsigned int >(domain_min_size) + 1);
+    graph[0].resize(bone);
     w_rls2.resize(bone);
-    for (int i = 0; i < bone; i++) {
+    for (unsigned int i = 0; i < bone; i++) {
         w_rls2[i].resize(0);
-        for (int j = 0; j < domain_min_size; j++) {
+        for (unsigned int j = 0; j < static_cast< unsigned int >(domain_min_size); j++) {
             w_rls2[i].push_back(std::make_pair(j + i, j + i));
         }
-        make_graph(index.size(), trajectory[0], graph[i]);
+        make_graph(index.size(), reference, graph[0][i]);
     }
-    trajectory[1].resize(index.size());
+
+    trajectory.resize(index.size());
 }
 
 void
-Domains::analyzeFrame(int frnr, const t_trxframe &fr, t_pbc *pbc,
-                      TrajectoryAnalysisModuleData *pdata)
+Domains::analyzeFrame(int frnr, const t_trxframe &fr, t_pbc *pbc, TrajectoryAnalysisModuleData *pdata)
 {
-    for (int i = 0; i < index.size(); i++) {
-        trajectory[1][i] = fr.x[index[i]];
+    for (unsigned int i = 0; i < index.size(); i++) {
+        trajectory[i] = fr.x[index[i]];
     }
     frames++;
 
-    //#pragma omp parallel
-    //{
-        //#pragma omp for schedule(dynamic)
-        for (int j = 0; j < bone; j++) {
-            std::vector < RVec > temp = trajectory[1];
-            MyFitNew(trajectory[0], temp, w_rls2[j], 0);
-            update_graph(graph[j], temp, epsi);
-        }
-    //}
+    #pragma omp parallel for ordered schedule(dynamic) shared(w_rls2, graph) firstprivate(trajectory, reference, epsi)
+    for (unsigned int j = 0; j < bone; j++) {
+        std::vector < RVec > temp = trajectory;
+        MyFitNew(reference, temp, w_rls2[j], 0);
+        update_graph(graph[0][j], temp, epsi);
+    }
+    #pragma omp barrier
     std::cout << "frame: " << frames << " analyzed\n";
 }
 
@@ -505,25 +501,25 @@ Domains::finishAnalysis(int nframes)
     frames -= 1;
 
     std::cout << "final cheking\n";
-    check_domains(delta, frames, graph);
+    check_domains(delta, frames, graph[0]);
 
     std::cout << "finding domains' sizes\n";
-    find_domain_sizes(graph, domsizes);
+    find_domain_sizes(graph[0], domsizes);
 
     std::cout << "finding domains\n";
-    std::vector< int > a;
+    std::vector< unsigned int > a;
     a.resize(0);
     while (check_domsizes(domsizes, domain_min_size)) {
         domains.push_back(a);
         if (DomainSearchingAlgorythm == 0) {
-            get_maxsized_domain(domains.back(), graph, domsizes);
+            get_maxsized_domain(domains.back(), graph[0], domsizes);
         } else if (DomainSearchingAlgorythm == 1) {
-            get_min_domain(domains.back(), graph, domsizes, domain_min_size);
+            get_min_domain(domains.back(), graph[0], domsizes, domain_min_size);
         }
         std::cout << "new domain: " << domains.back().size() << " atoms\n";
-        delete_domain_from_graph(graph, domains.back());
+        delete_domain_from_graph(graph[0], domains.back());
         domsizes.resize(0);
-        find_domain_sizes(graph, domsizes);
+        find_domain_sizes(graph[0], domsizes);
     }
 }