From ef2bcd8a82cd900d19655d948c3a749736e8049c Mon Sep 17 00:00:00 2001
From: "Kurt A. O'Hearn" <ohearnk@msu.edu>
Date: Sun, 23 Dec 2018 00:35:42 -0500
Subject: [PATCH] PuReMD-old: change from array of structs to struct of arrays
 for far nbr list (far_neighbor_data).

---
 PuReMD/src/bond_orders.c    |  28 +++--
 PuReMD/src/bond_orders.h    |   2 +-
 PuReMD/src/forces.c         | 213 ++++++++++++++++++------------------
 PuReMD/src/hydrogen_bonds.c |  24 ++--
 PuReMD/src/io_tools.c       |  25 +++--
 PuReMD/src/list.c           |  61 ++++++-----
 PuReMD/src/neighbors.c      |  12 +-
 PuReMD/src/nonbonded.c      | 105 ++++++++++--------
 PuReMD/src/parallelreax.c   |   1 -
 PuReMD/src/reax_types.h     |  21 +++-
 10 files changed, 261 insertions(+), 231 deletions(-)

diff --git a/PuReMD/src/bond_orders.c b/PuReMD/src/bond_orders.c
index da07f839..f01993b8 100644
--- a/PuReMD/src/bond_orders.c
+++ b/PuReMD/src/bond_orders.c
@@ -663,11 +663,10 @@ void Add_dBond_to_Forces( int i, int pj,
 
 
 int BOp( storage *workspace, reax_list *bonds, real bo_cut,
-         int i, int btop_i, far_neighbor_data *nbr_pj,
+         int i, int btop_i, int j, ivec *rel_box, real d, rvec *dvec,
          int far_nbr_list_format, single_body_parameters *sbp_i,
          single_body_parameters *sbp_j, two_body_parameters *twbp )
 {
-    int j;
     real r2, C12, C34, C56;
     real Cln_BOp_s, Cln_BOp_pi, Cln_BOp_pi2;
     real BO, BO_s, BO_pi, BO_pi2;
@@ -677,26 +676,25 @@ int BOp( storage *workspace, reax_list *bonds, real bo_cut,
     bond_data *jbond;
     bond_order_data *bo_ji;
 
-    j = nbr_pj->nbr;
-    r2 = SQR(nbr_pj->d);
+    r2 = SQR(d);
 
     if ( sbp_i->r_s > 0.0 && sbp_j->r_s > 0.0 )
     {
-        C12 = twbp->p_bo1 * pow( nbr_pj->d / twbp->r_s, twbp->p_bo2 );
+        C12 = twbp->p_bo1 * pow( d / twbp->r_s, twbp->p_bo2 );
         BO_s = (1.0 + bo_cut) * exp( C12 );
     }
     else BO_s = C12 = 0.0;
 
     if ( sbp_i->r_pi > 0.0 && sbp_j->r_pi > 0.0 )
     {
-        C34 = twbp->p_bo3 * pow( nbr_pj->d / twbp->r_p, twbp->p_bo4 );
+        C34 = twbp->p_bo3 * pow( d / twbp->r_p, twbp->p_bo4 );
         BO_pi = exp( C34 );
     }
     else BO_pi = C34 = 0.0;
 
     if ( sbp_i->r_pi_pi > 0.0 && sbp_j->r_pi_pi > 0.0 )
     {
-        C56 = twbp->p_bo5 * pow( nbr_pj->d / twbp->r_pp, twbp->p_bo6 );
+        C56 = twbp->p_bo5 * pow( d / twbp->r_pp, twbp->p_bo6 );
         BO_pi2 = exp( C56 );
     }
     else BO_pi2 = C56 = 0.0;
@@ -707,25 +705,25 @@ int BOp( storage *workspace, reax_list *bonds, real bo_cut,
     if ( BO >= bo_cut )
     {
         /****** bonds i-j and j-i ******/
-        ibond = &( bonds->bond_list[btop_i] );
+        ibond = &bonds->bond_list[btop_i];
         if ( far_nbr_list_format == HALF_LIST )
         {
             btop_j = End_Index( j, bonds );
-            jbond = &(bonds->bond_list[btop_j]);
+            jbond = &bonds->bond_list[btop_j];
         }
 
         ibond->nbr = j;
-        ibond->d = nbr_pj->d;
-        rvec_Copy( ibond->dvec, nbr_pj->dvec );
-        ivec_Copy( ibond->rel_box, nbr_pj->rel_box );
+        ibond->d = d;
+        rvec_Copy( ibond->dvec, *dvec );
+        ivec_Copy( ibond->rel_box, *rel_box );
         ibond->dbond_index = btop_i;
         if ( far_nbr_list_format == HALF_LIST )
         {
             ibond->sym_index = btop_j;
             jbond->nbr = i;
-            jbond->d = nbr_pj->d;
-            rvec_Scale( jbond->dvec, -1.0, nbr_pj->dvec );
-            ivec_Scale( jbond->rel_box, -1.0, nbr_pj->rel_box );
+            jbond->d = d;
+            rvec_Scale( jbond->dvec, -1.0, *dvec );
+            ivec_Scale( jbond->rel_box, -1.0, *rel_box );
             jbond->dbond_index = btop_i;
             jbond->sym_index = btop_i;
 
diff --git a/PuReMD/src/bond_orders.h b/PuReMD/src/bond_orders.h
index a692fccb..fe142fb0 100644
--- a/PuReMD/src/bond_orders.h
+++ b/PuReMD/src/bond_orders.h
@@ -52,7 +52,7 @@ void Add_dDelta_to_Forces( reax_system *, reax_list**, int, real );
 void Add_dBond_to_Forces( int, int, storage*, reax_list** );
 void Add_dBond_to_Forces_NPT( int, int, simulation_data*,
                               storage*, reax_list** );
-int BOp( storage*, reax_list*, real, int, int, far_neighbor_data*,
+int BOp( storage*, reax_list*, real, int, int, int, ivec*, real, rvec*,
         int, single_body_parameters*, single_body_parameters*,
         two_body_parameters* );
 void BO( reax_system*, control_params*, simulation_data*,
diff --git a/PuReMD/src/forces.c b/PuReMD/src/forces.c
index 0f836ff4..d9e4d993 100644
--- a/PuReMD/src/forces.c
+++ b/PuReMD/src/forces.c
@@ -340,33 +340,30 @@ static void Init_Distance( reax_system *system, control_params *control,
     int start_i, end_i;
     int renbr;
     reax_list *far_nbrs;
-    far_neighbor_data *nbr_pj;
     reax_atom *atom_i, *atom_j;
 
     far_nbrs = lists[FAR_NBRS];
-
     renbr = (data->step - data->prev_steps) % control->reneighbor == 0;
 
     for ( i = 0; i < system->N; ++i )
     {
         atom_i = &system->my_atoms[i];
-        start_i = Start_Index(i, far_nbrs);
-        end_i = End_Index(i, far_nbrs);
+        start_i = Start_Index( i, far_nbrs );
+        end_i = End_Index( i, far_nbrs );
 
         /* update i-j distance for non-reneighboring steps */
         for ( pj = start_i; pj < end_i; ++pj )
         {
-            nbr_pj = &far_nbrs->far_nbr_list[pj];
-            j = nbr_pj->nbr;
+            j = far_nbrs->far_nbr_list.nbr[pj];
             atom_j = &system->my_atoms[j];
             
             if ( !renbr )
             {
-                nbr_pj->dvec[0] = atom_j->x[0] - atom_i->x[0];
-                nbr_pj->dvec[1] = atom_j->x[1] - atom_i->x[1];
-                nbr_pj->dvec[2] = atom_j->x[2] - atom_i->x[2];
-                nbr_pj->d = rvec_Norm_Sqr( nbr_pj->dvec );
-                nbr_pj->d = sqrt( nbr_pj->d );
+                far_nbrs->far_nbr_list.dvec[pj][0] = atom_j->x[0] - atom_i->x[0];
+                far_nbrs->far_nbr_list.dvec[pj][1] = atom_j->x[1] - atom_i->x[1];
+                far_nbrs->far_nbr_list.dvec[pj][2] = atom_j->x[2] - atom_i->x[2];
+                far_nbrs->far_nbr_list.d[pj] = rvec_Norm_Sqr( far_nbrs->far_nbr_list.dvec[pj] );
+                far_nbrs->far_nbr_list.d[pj] = sqrt( far_nbrs->far_nbr_list.d[pj] );
             }
 
         }
@@ -389,7 +386,6 @@ static void Init_CM_Half_NT( reax_system *system, control_params *control,
     reax_list *far_nbrs;
     single_body_parameters *sbp_i;
     two_body_parameters *twbp;
-    far_neighbor_data *nbr_pj;
     reax_atom *atom_i, *atom_j;
     int mark[6];
     int total_cnt[6];
@@ -482,11 +478,10 @@ static void Init_CM_Half_NT( reax_system *system, control_params *control,
 
         for ( pj = start_i; pj < end_i; ++pj )
         {
-            nbr_pj = &far_nbrs->far_nbr_list[pj];
-            j = nbr_pj->nbr;
+            j = far_nbrs->far_nbr_list.nbr[pj];
             atom_j = &system->my_atoms[j];
 
-            if ( nbr_pj->d <= cutoff )
+            if ( far_nbrs->far_nbr_list.d[pj] <= cutoff )
             {
                 flag = 1;
             }
@@ -498,7 +493,7 @@ static void Init_CM_Half_NT( reax_system *system, control_params *control,
             if ( flag )
             {
                 type_j = atom_j->type;
-                r_ij = nbr_pj->d;
+                r_ij = far_nbrs->far_nbr_list.d[pj];
                 twbp = &system->reax_param.tbp[type_i][type_j];
 
                 if ( local == 1 )
@@ -615,7 +610,6 @@ static void Init_CM_Full_NT( reax_system *system, control_params *control,
     reax_list *far_nbrs;
     single_body_parameters *sbp_i;
     two_body_parameters *twbp;
-    far_neighbor_data *nbr_pj;
     reax_atom *atom_i, *atom_j;
     int mark[6];
     int total_cnt[6];
@@ -708,11 +702,10 @@ static void Init_CM_Full_NT( reax_system *system, control_params *control,
 
         for ( pj = start_i; pj < end_i; ++pj )
         {
-            nbr_pj = &far_nbrs->far_nbr_list[pj];
-            j = nbr_pj->nbr;
+            j = far_nbrs->far_nbr_list.nbr[pj];
             atom_j = &system->my_atoms[j];
 
-            if ( nbr_pj->d <= cutoff )
+            if ( far_nbrs->far_nbr_list.d[pj] <= cutoff )
             {
                 flag = 1;
             }
@@ -724,7 +717,7 @@ static void Init_CM_Full_NT( reax_system *system, control_params *control,
             if ( flag )
             {
                 type_j = atom_j->type;
-                r_ij = nbr_pj->d;
+                r_ij = far_nbrs->far_nbr_list.d[pj];
                 twbp = &system->reax_param.tbp[type_i][type_j];
 
                 if ( local == 1 )
@@ -842,7 +835,6 @@ static void Init_CM_Half_FS( reax_system *system, control_params *control,
     reax_list *far_nbrs;
     single_body_parameters *sbp_i;
     two_body_parameters *twbp;
-    far_neighbor_data *nbr_pj;
     reax_atom *atom_i, *atom_j;
 
     far_nbrs = lists[FAR_NBRS];
@@ -881,11 +873,10 @@ static void Init_CM_Half_FS( reax_system *system, control_params *control,
 
         for ( pj = start_i; pj < end_i; ++pj )
         {
-            nbr_pj = &far_nbrs->far_nbr_list[pj];
-            j = nbr_pj->nbr;
+            j = far_nbrs->far_nbr_list.nbr[pj];
             atom_j = &system->my_atoms[j];
             
-            if ( nbr_pj->d <= cutoff )
+            if ( far_nbrs->far_nbr_list.d[pj] <= cutoff )
             {
                 flag = 1;
             }
@@ -897,7 +888,7 @@ static void Init_CM_Half_FS( reax_system *system, control_params *control,
             if ( flag )
             {
                 type_j = atom_j->type;
-                r_ij = nbr_pj->d;
+                r_ij = far_nbrs->far_nbr_list.d[pj];
                 twbp = &system->reax_param.tbp[type_i][type_j];
 
                 if ( local )
@@ -958,7 +949,6 @@ static void Init_CM_Full_FS( reax_system *system, control_params *control,
     reax_list *far_nbrs;
     single_body_parameters *sbp_i;
     two_body_parameters *twbp;
-    far_neighbor_data *nbr_pj;
     reax_atom *atom_i, *atom_j;
 
     far_nbrs = lists[FAR_NBRS];
@@ -997,11 +987,10 @@ static void Init_CM_Full_FS( reax_system *system, control_params *control,
 
         for ( pj = start_i; pj < end_i; ++pj )
         {
-            nbr_pj = &far_nbrs->far_nbr_list[pj];
-            j = nbr_pj->nbr;
+            j = far_nbrs->far_nbr_list.nbr[pj];
             atom_j = &system->my_atoms[j];
             
-            if ( nbr_pj->d <= cutoff )
+            if ( far_nbrs->far_nbr_list.d[pj] <= cutoff )
             {
                 flag = 1;
             }
@@ -1013,7 +1002,7 @@ static void Init_CM_Full_FS( reax_system *system, control_params *control,
             if ( flag )
             {
                 type_j = atom_j->type;
-                r_ij = nbr_pj->d;
+                r_ij = far_nbrs->far_nbr_list.d[pj];
                 twbp = &system->reax_param.tbp[type_i][type_j];
 
                 if ( local )
@@ -1072,7 +1061,6 @@ static void Init_Bond_Half( reax_system *system, control_params *control,
     reax_list *far_nbrs, *bonds, *hbonds;
     single_body_parameters *sbp_i, *sbp_j;
     two_body_parameters *twbp;
-    far_neighbor_data *nbr_pj;
     reax_atom *atom_i, *atom_j;
     int jhb_top;
     
@@ -1140,11 +1128,10 @@ static void Init_Bond_Half( reax_system *system, control_params *control,
         /* update i-j distance - check if j is within cutoff */
         for ( pj = start_i; pj < end_i; ++pj )
         {
-            nbr_pj = &far_nbrs->far_nbr_list[pj];
-            j = nbr_pj->nbr;
+            j = far_nbrs->far_nbr_list.nbr[pj];
             atom_j = &system->my_atoms[j];
             
-            if ( nbr_pj->d <= cutoff )
+            if ( far_nbrs->far_nbr_list.d[pj] <= cutoff )
             {
                 flag = 1;
             }
@@ -1164,7 +1151,7 @@ static void Init_Bond_Half( reax_system *system, control_params *control,
                     /* hydrogen bond lists */
                     if ( control->hbond_cut > 0
                             && (ihb == 1 || ihb == 2)
-                            && nbr_pj->d <= control->hbond_cut )
+                            && far_nbrs->far_nbr_list.d[pj] <= control->hbond_cut )
                     {
                         // fprintf( stderr, "%d %d\n", atom1, atom2 );
                         jhb = sbp_j->p_hbond;
@@ -1173,7 +1160,7 @@ static void Init_Bond_Half( reax_system *system, control_params *control,
                         {
                             hbonds->hbond_list[ihb_top].nbr = j;
                             hbonds->hbond_list[ihb_top].scl = 1;
-                            hbonds->hbond_list[ihb_top].ptr = nbr_pj;
+                            hbonds->hbond_list[ihb_top].ptr = pj;
                             ++ihb_top;
                             ++num_hbonds;
                         }
@@ -1183,7 +1170,7 @@ static void Init_Bond_Half( reax_system *system, control_params *control,
                             jhb_top = End_Index( atom_j->Hindex, hbonds );
                             hbonds->hbond_list[jhb_top].nbr = i;
                             hbonds->hbond_list[jhb_top].scl = -1;
-                            hbonds->hbond_list[jhb_top].ptr = nbr_pj;
+                            hbonds->hbond_list[jhb_top].ptr = pj;
                             Set_End_Index( atom_j->Hindex, jhb_top + 1, hbonds );
                             ++num_hbonds;
                         }
@@ -1192,9 +1179,11 @@ static void Init_Bond_Half( reax_system *system, control_params *control,
 
                 /* uncorrected bond orders */
                 if ( //(workspace->bond_mark[i] < 3 || workspace->bond_mark[j] < 3) &&
-                    nbr_pj->d <= control->bond_cut
+                    far_nbrs->far_nbr_list.d[pj] <= control->bond_cut
                     && BOp( workspace, bonds, control->bo_cut,
-                         i, btop_i, nbr_pj, far_nbrs->format,
+                         i, btop_i, far_nbrs->far_nbr_list.nbr[pj],
+                         &far_nbrs->far_nbr_list.rel_box[pj], far_nbrs->far_nbr_list.d[pj],
+                         &far_nbrs->far_nbr_list.dvec[pj], far_nbrs->format,
                          sbp_i, sbp_j, twbp ) )
                 {
                     num_bonds += 2;
@@ -1257,7 +1246,6 @@ static void Init_Bond_Full( reax_system *system, control_params *control,
     reax_list *far_nbrs, *bonds, *hbonds;
     single_body_parameters *sbp_i, *sbp_j;
     two_body_parameters *twbp;
-    far_neighbor_data *nbr_pj;
     reax_atom *atom_i, *atom_j;
     int start_j, end_j;
     int btop_j;
@@ -1324,11 +1312,10 @@ static void Init_Bond_Full( reax_system *system, control_params *control,
         /* update i-j distance - check if j is within cutoff */
         for ( pj = start_i; pj < end_i; ++pj )
         {
-            nbr_pj = &far_nbrs->far_nbr_list[pj];
-            j = nbr_pj->nbr;
+            j = far_nbrs->far_nbr_list.nbr[pj];
             atom_j = &system->my_atoms[j];
             
-            if ( nbr_pj->d <= cutoff )
+            if ( far_nbrs->far_nbr_list.d[pj] <= cutoff )
             {
                 flag = 1;
             }
@@ -1348,7 +1335,7 @@ static void Init_Bond_Full( reax_system *system, control_params *control,
                     /* hydrogen bond lists */
                     if ( control->hbond_cut > 0
                             && (ihb == 1 || ihb == 2)
-                            && nbr_pj->d <= control->hbond_cut )
+                            && far_nbrs->far_nbr_list.d[pj] <= control->hbond_cut )
                     {
                         // fprintf( stderr, "%d %d\n", atom1, atom2 );
                         jhb = sbp_j->p_hbond;
@@ -1357,7 +1344,7 @@ static void Init_Bond_Full( reax_system *system, control_params *control,
                         {
                             hbonds->hbond_list[ihb_top].nbr = j;
                             hbonds->hbond_list[ihb_top].scl = 1;
-                            hbonds->hbond_list[ihb_top].ptr = nbr_pj;
+                            hbonds->hbond_list[ihb_top].ptr = pj;
                             ++ihb_top;
                             ++num_hbonds;
                         }
@@ -1366,9 +1353,11 @@ static void Init_Bond_Full( reax_system *system, control_params *control,
 
                 /* uncorrected bond orders */
                 if ( //(workspace->bond_mark[i] < 3 || workspace->bond_mark[j] < 3) &&
-                    nbr_pj->d <= control->bond_cut
+                    far_nbrs->far_nbr_list.d[pj] <= control->bond_cut
                     && BOp( workspace, bonds, control->bo_cut,
-                         i, btop_i, nbr_pj, far_nbrs->format,
+                         i, btop_i, far_nbrs->far_nbr_list.nbr[pj],
+                         &far_nbrs->far_nbr_list.rel_box[pj], far_nbrs->far_nbr_list.d[pj],
+                         &far_nbrs->far_nbr_list.dvec[pj], far_nbrs->format,
                          sbp_i, sbp_j, twbp ) )
                 {
                     num_bonds += 2;
@@ -1523,7 +1512,6 @@ void Init_Forces( reax_system *system, control_params *control,
     reax_list *far_nbrs, *bonds, *hbonds;
     single_body_parameters *sbp_i, *sbp_j;
     two_body_parameters *twbp;
-    far_neighbor_data *nbr_pj;
     reax_atom *atom_i, *atom_j;
     int jhb_top;
     int start_j, end_j;
@@ -1674,24 +1662,26 @@ void Init_Forces( reax_system *system, control_params *control,
         // update i-j distance - check if j is within cutoff
         for ( pj = start_i; pj < end_i; ++pj )
         {
-            nbr_pj = &( far_nbrs->far_nbr_list[pj] );
-            j = nbr_pj->nbr;
-            atom_j = &(system->my_atoms[j]);
+            j = far_nbrs->far_nbr_list.nbr[pj];
+            atom_j = &system->my_atoms[j];
+
             if ( renbr )
             {
-                if (nbr_pj->d <= cutoff)
+                if ( far_nbrs->far_nbr_list.d[pj] <= cutoff )
                     flag = 1;
-                else flag = 0;
+                else
+                    flag = 0;
             }
             else
             {
-                nbr_pj->dvec[0] = atom_j->x[0] - atom_i->x[0];
-                nbr_pj->dvec[1] = atom_j->x[1] - atom_i->x[1];
-                nbr_pj->dvec[2] = atom_j->x[2] - atom_i->x[2];
-                nbr_pj->d = rvec_Norm_Sqr( nbr_pj->dvec );
-                if ( nbr_pj->d <= SQR(cutoff) )
+                far_nbrs->far_nbr_list.dvec[pj][0] = atom_j->x[0] - atom_i->x[0];
+                far_nbrs->far_nbr_list.dvec[pj][1] = atom_j->x[1] - atom_i->x[1];
+                far_nbrs->far_nbr_list.dvec[pj][2] = atom_j->x[2] - atom_i->x[2];
+                far_nbrs->far_nbr_list.d[pj] = rvec_Norm_Sqr( far_nbrs->far_nbr_list.dvec[pj] );
+
+                if ( far_nbrs->far_nbr_list.d[pj] <= SQR(cutoff) )
                 {
-                    nbr_pj->d = sqrt(nbr_pj->d);
+                    far_nbrs->far_nbr_list.d[pj] = sqrt( far_nbrs->far_nbr_list.d[pj] );
                     flag = 1;
                 }
                 else
@@ -1703,9 +1693,9 @@ void Init_Forces( reax_system *system, control_params *control,
             if ( flag )
             {
                 type_j = atom_j->type;
-                r_ij = nbr_pj->d;
-                sbp_j = &(system->reax_param.sbp[type_j]);
-                twbp = &(system->reax_param.tbp[type_i][type_j]);
+                r_ij = far_nbrs->far_nbr_list.d[pj];
+                sbp_j = &system->reax_param.sbp[type_j];
+                twbp = &system->reax_param.tbp[type_i][type_j];
 
                 if ( local == 1 )
                 {
@@ -1756,8 +1746,9 @@ void Init_Forces( reax_system *system, control_params *control,
 #endif
 
                     // hydrogen bond lists
-                    if ( control->hbond_cut > 0 && (ihb == 1 || ihb == 2) &&
-                            nbr_pj->d <= control->hbond_cut )
+                    if ( control->hbond_cut > 0.0
+                            && (ihb == 1 || ihb == 2)
+                            && far_nbrs->far_nbr_list.d[pj] <= control->hbond_cut )
                     {
                         // fprintf( stderr, "%d %d\n", atom1, atom2 );
                         jhb = sbp_j->p_hbond;
@@ -1765,7 +1756,7 @@ void Init_Forces( reax_system *system, control_params *control,
                         {
                             hbonds->hbond_list[ihb_top].nbr = j;
                             hbonds->hbond_list[ihb_top].scl = 1;
-                            hbonds->hbond_list[ihb_top].ptr = nbr_pj;
+                            hbonds->hbond_list[ihb_top].ptr = pj;
                             ++ihb_top;
                             ++num_hbonds;
                         }
@@ -1776,7 +1767,7 @@ void Init_Forces( reax_system *system, control_params *control,
                             jhb_top = End_Index( atom_j->Hindex, hbonds );
                             hbonds->hbond_list[jhb_top].nbr = i;
                             hbonds->hbond_list[jhb_top].scl = -1;
-                            hbonds->hbond_list[jhb_top].ptr = nbr_pj;
+                            hbonds->hbond_list[jhb_top].ptr = pj;
                             Set_End_Index( atom_j->Hindex, jhb_top + 1, hbonds );
                             ++num_hbonds;
                         }
@@ -1822,9 +1813,11 @@ void Init_Forces( reax_system *system, control_params *control,
 
                 // uncorrected bond orders
                 if ( //(workspace->bond_mark[i] < 3 || workspace->bond_mark[j] < 3) &&
-                    nbr_pj->d <= control->bond_cut &&
-                    BOp( workspace, bonds, control->bo_cut,
-                         i, btop_i, nbr_pj, far_nbrs->format,
+                    far_nbrs->far_nbr_list.d[pj] <= control->bond_cut
+                    && BOp( workspace, bonds, control->bo_cut,
+                         i, btop_i, far_nbrs->far_nbr_list.nbr[pj],
+                         &far_nbrs->far_nbr_list.rel_box[pj], far_nbrs->far_nbr_list.d[pj],
+                         &far_nbrs->far_nbr_list.dvec[pj], far_nbrs->format,
                          sbp_i, sbp_j, twbp ) )
                 {
                     num_bonds += 2;
@@ -1942,7 +1935,6 @@ void Init_Forces_noQEq( reax_system *system, control_params *control,
     reax_list *far_nbrs, *bonds, *hbonds;
     single_body_parameters *sbp_i, *sbp_j;
     two_body_parameters *twbp;
-    far_neighbor_data *nbr_pj;
     reax_atom *atom_i, *atom_j;
     int jhb_top;
     int start_j, end_j;
@@ -2021,25 +2013,30 @@ void Init_Forces_noQEq( reax_system *system, control_params *control,
         /* update i-j distance - check if j is within cutoff */
         for ( pj = start_i; pj < end_i; ++pj )
         {
-            nbr_pj = &( far_nbrs->far_nbr_list[pj] );
-            j = nbr_pj->nbr;
-            atom_j = &(system->my_atoms[j]);
+            j = far_nbrs->far_nbr_list.nbr[pj];
+            atom_j = &system->my_atoms[j];
 
             if ( renbr )
             {
-                if ( nbr_pj->d <= cutoff )
+                if ( far_nbrs->far_nbr_list.d[pj] <= cutoff )
+                {
                     flag = 1;
-                else flag = 0;
+                }
+                else
+                {
+                    flag = 0;
+                }
             }
             else
             {
-                nbr_pj->dvec[0] = atom_j->x[0] - atom_i->x[0];
-                nbr_pj->dvec[1] = atom_j->x[1] - atom_i->x[1];
-                nbr_pj->dvec[2] = atom_j->x[2] - atom_i->x[2];
-                nbr_pj->d = rvec_Norm_Sqr( nbr_pj->dvec );
-                if ( nbr_pj->d <= SQR(cutoff) )
+                far_nbrs->far_nbr_list.dvec[pj][0] = atom_j->x[0] - atom_i->x[0];
+                far_nbrs->far_nbr_list.dvec[pj][1] = atom_j->x[1] - atom_i->x[1];
+                far_nbrs->far_nbr_list.dvec[pj][2] = atom_j->x[2] - atom_i->x[2];
+                far_nbrs->far_nbr_list.d[pj] = rvec_Norm_Sqr( far_nbrs->far_nbr_list.dvec[pj] );
+
+                if ( far_nbrs->far_nbr_list.d[pj] <= SQR(cutoff) )
                 {
-                    nbr_pj->d = sqrt(nbr_pj->d);
+                    far_nbrs->far_nbr_list.d[pj] = sqrt( far_nbrs->far_nbr_list.d[pj] );
                     flag = 1;
                 }
                 else
@@ -2051,15 +2048,16 @@ void Init_Forces_noQEq( reax_system *system, control_params *control,
             if ( flag )
             {
                 type_j = atom_j->type;
-                r_ij = nbr_pj->d;
-                sbp_j = &(system->reax_param.sbp[type_j]);
-                twbp = &(system->reax_param.tbp[type_i][type_j]);
+                r_ij = far_nbrs->far_nbr_list.d[pj];
+                sbp_j = &system->reax_param.sbp[type_j];
+                twbp = &system->reax_param.tbp[type_i][type_j];
 
                 if ( local )
                 {
                     /* hydrogen bond lists */
-                    if ( control->hbond_cut > 0 && (ihb == 1 || ihb == 2) &&
-                            nbr_pj->d <= control->hbond_cut )
+                    if ( control->hbond_cut > 0.0
+                            && (ihb == 1 || ihb == 2)
+                            && far_nbrs->far_nbr_list.d[pj] <= control->hbond_cut )
                     {
                         // fprintf( stderr, "%d %d\n", atom1, atom2 );
                         jhb = sbp_j->p_hbond;
@@ -2067,7 +2065,7 @@ void Init_Forces_noQEq( reax_system *system, control_params *control,
                         {
                             hbonds->hbond_list[ihb_top].nbr = j;
                             hbonds->hbond_list[ihb_top].scl = 1;
-                            hbonds->hbond_list[ihb_top].ptr = nbr_pj;
+                            hbonds->hbond_list[ihb_top].ptr = pj;
                             ++ihb_top;
                             ++num_hbonds;
                         }
@@ -2078,7 +2076,7 @@ void Init_Forces_noQEq( reax_system *system, control_params *control,
                             jhb_top = End_Index( atom_j->Hindex, hbonds );
                             hbonds->hbond_list[jhb_top].nbr = i;
                             hbonds->hbond_list[jhb_top].scl = -1;
-                            hbonds->hbond_list[jhb_top].ptr = nbr_pj;
+                            hbonds->hbond_list[jhb_top].ptr = pj;
                             Set_End_Index( atom_j->Hindex, jhb_top + 1, hbonds );
                             ++num_hbonds;
                         }
@@ -2088,9 +2086,11 @@ void Init_Forces_noQEq( reax_system *system, control_params *control,
 
                 /* uncorrected bond orders */
                 if ( //(workspace->bond_mark[i] < 3 || workspace->bond_mark[j] < 3) &&
-                    nbr_pj->d <= control->bond_cut &&
-                    BOp( workspace, bonds, control->bo_cut,
-                         i, btop_i, nbr_pj, far_nbrs->format,
+                    far_nbrs->far_nbr_list.d[pj] <= control->bond_cut
+                    && BOp( workspace, bonds, control->bo_cut,
+                         i, btop_i, far_nbrs->far_nbr_list.nbr[pj],
+                         &far_nbrs->far_nbr_list.rel_box[pj], far_nbrs->far_nbr_list.d[pj],
+                         &far_nbrs->far_nbr_list.dvec[pj], far_nbrs->format,
                          sbp_i, sbp_j, twbp ) )
                 {
                     num_bonds += 2;
@@ -2155,14 +2155,14 @@ void Init_Forces_noQEq( reax_system *system, control_params *control,
 #endif
 
     Validate_Lists( system, workspace, lists, data->step,
-                    system->n, system->N, system->numH, comm );
+            system->n, system->N, system->numH, comm );
 }
 
 
 void Estimate_Storages( reax_system *system, control_params *control,
-                        reax_list **lists, int *Htop, int *hb_top,
-                        int *bond_top, int *num_3body, MPI_Comm comm, 
-                        int *matrix_dim, int cm_format )
+        reax_list **lists, int *Htop, int *hb_top,
+        int *bond_top, int *num_3body, MPI_Comm comm,
+        int *matrix_dim, int cm_format )
 {
     int i, j, pj;
     int start_i, end_i;
@@ -2176,7 +2176,6 @@ void Estimate_Storages( reax_system *system, control_params *control,
     reax_list *far_nbrs;
     single_body_parameters *sbp_i, *sbp_j;
     two_body_parameters *twbp;
-    far_neighbor_data *nbr_pj;
     reax_atom *atom_i, *atom_j;
 
     far_nbrs = lists[FAR_NBRS];
@@ -2224,8 +2223,8 @@ void Estimate_Storages( reax_system *system, control_params *control,
 
         for ( pj = start_i; pj < end_i; ++pj )
         {
-            nbr_pj = &( far_nbrs->far_nbr_list[pj] );
-            j = nbr_pj->nbr;
+            j = far_nbrs->far_nbr_list.nbr[pj];
+
 #if !defined(NEUTRAL_TERRITORY)
             if ( far_nbrs->format == HALF_LIST )
 #endif
@@ -2233,12 +2232,12 @@ void Estimate_Storages( reax_system *system, control_params *control,
                 atom_j = &system->my_atoms[j];
             }
 
-            if (nbr_pj->d <= cutoff)
+            if ( far_nbrs->far_nbr_list.d[pj] <= cutoff )
             {
                 type_j = system->my_atoms[j].type;
-                r_ij = nbr_pj->d;
-                sbp_j = &(system->reax_param.sbp[type_j]);
-                twbp = &(system->reax_param.tbp[type_i][type_j]);
+                r_ij = far_nbrs->far_nbr_list.d[pj];
+                sbp_j = &system->reax_param.sbp[type_j];
+                twbp = &system->reax_param.tbp[type_i][type_j];
 
                 if ( local == 1 )
                 {
@@ -2257,10 +2256,12 @@ void Estimate_Storages( reax_system *system, control_params *control,
 #endif
 
                     /* hydrogen bond lists */
-                    if ( control->hbond_cut > 0.1 && (ihb == 1 || ihb == 2) &&
-                            nbr_pj->d <= control->hbond_cut )
+                    if ( control->hbond_cut > 0.1
+                            && (ihb == 1 || ihb == 2)
+                            && far_nbrs->far_nbr_list.d[pj] <= control->hbond_cut )
                     {
                         jhb = sbp_j->p_hbond;
+
                         if ( ihb == 1 && jhb == 2 )
                         {
                             ++hb_top[i];
@@ -2286,7 +2287,7 @@ void Estimate_Storages( reax_system *system, control_params *control,
 #endif
 
                 /* uncorrected bond orders */
-                if ( nbr_pj->d <= control->bond_cut )
+                if ( far_nbrs->far_nbr_list.d[pj] <= control->bond_cut )
                 {
                     r2 = SQR(r_ij);
 
diff --git a/PuReMD/src/hydrogen_bonds.c b/PuReMD/src/hydrogen_bonds.c
index cba267ff..699e7bc1 100644
--- a/PuReMD/src/hydrogen_bonds.c
+++ b/PuReMD/src/hydrogen_bonds.c
@@ -39,12 +39,13 @@ void Hydrogen_Bonds( reax_system *system, control_params *control,
                      simulation_data *data, storage *workspace,
                      reax_list **lists, output_controls *out_control )
 {
-    int  i, j, k, pi, pk;
-    int  type_i, type_j, type_k;
-    int  start_j, end_j, hb_start_j, hb_end_j;
-    int  hblist[MAX_BONDS];
-    int  itr, top;
-    int  num_hb_intrs = 0;
+    int i, j, k, pi, pk;
+    int type_i, type_j, type_k;
+    int start_j, end_j, hb_start_j, hb_end_j;
+    int hblist[MAX_BONDS];
+    int itr, top;
+    int num_hb_intrs = 0;
+    int nbr_jk;
     ivec rel_jk;
     real r_ij, r_jk, theta, cos_theta, sin_xhz4, cos_xhz1, sin_theta2;
     real e_hb, exp_hb2, exp_hb3, CEhb1, CEhb2, CEhb3;
@@ -54,11 +55,11 @@ void Hydrogen_Bonds( reax_system *system, control_params *control,
     hbond_parameters *hbp;
     bond_order_data *bo_ij;
     bond_data *pbond_ij;
-    far_neighbor_data *nbr_jk;
-    reax_list *bonds, *hbonds;
+    reax_list *far_nbrs, *bonds, *hbonds;
     bond_data *bond_list;
     hbond_data *hbond_list;
 
+    far_nbrs = lists[FAR_NBRS];
     bonds = lists[BONDS];
     bond_list = bonds->bond_list;
     hbonds = lists[HBONDS];
@@ -102,8 +103,8 @@ void Hydrogen_Bonds( reax_system *system, control_params *control,
                 k = hbond_list[pk].nbr;
                 type_k = system->my_atoms[k].type;
                 nbr_jk = hbond_list[pk].ptr;
-                r_jk = nbr_jk->d;
-                rvec_Scale( dvec_jk, hbond_list[pk].scl, nbr_jk->dvec );
+                r_jk = far_nbrs->far_nbr_list.d[nbr_jk];
+                rvec_Scale( dvec_jk, hbond_list[pk].scl, far_nbrs->far_nbr_list.dvec[nbr_jk] );
 
                 for ( itr = 0; itr < top; ++itr )
                 {
@@ -174,7 +175,8 @@ void Hydrogen_Bonds( reax_system *system, control_params *control,
 
                             rvec_ScaledAdd( workspace->f[j], +CEhb2, dcos_theta_dj );
 
-                            ivec_Scale( rel_jk, hbond_list[pk].scl, nbr_jk->rel_box );
+                            ivec_Scale( rel_jk, hbond_list[pk].scl,
+                                    far_nbrs->far_nbr_list.rel_box[nbr_jk] );
                             rvec_Scale( force, +CEhb2, dcos_theta_dk );
                             rvec_Add( workspace->f[k], force );
                             rvec_iMultiply( ext_press, rel_jk, force );
diff --git a/PuReMD/src/io_tools.c b/PuReMD/src/io_tools.c
index 308086ea..2b58ae63 100644
--- a/PuReMD/src/io_tools.c
+++ b/PuReMD/src/io_tools.c
@@ -682,20 +682,20 @@ void Print_Far_Neighbors( reax_system *system, reax_list **lists,
 
         for ( j = Start_Index(i, far_nbrs); j < End_Index(i, far_nbrs); ++j )
         {
-            nbr = far_nbrs->far_nbr_list[j].nbr;
+            nbr = far_nbrs->far_nbr_list.nbr[j];
             id_j = system->my_atoms[nbr].orig_id;
 
             fprintf( fout, "%6d%6d%24.15e%24.15e%24.15e%24.15e\n",
-                    id_i, id_j, far_nbrs->far_nbr_list[j].d,
-                    far_nbrs->far_nbr_list[j].dvec[0],
-                    far_nbrs->far_nbr_list[j].dvec[1],
-                    far_nbrs->far_nbr_list[j].dvec[2] );
+                    id_i, id_j, far_nbrs->far_nbr_list.d[j],
+                    far_nbrs->far_nbr_list.dvec[j][0],
+                    far_nbrs->far_nbr_list.dvec[j][1],
+                    far_nbrs->far_nbr_list.dvec[j][2] );
 
             fprintf( fout, "%6d%6d%24.15e%24.15e%24.15e%24.15e\n",
-                    id_j, id_i, far_nbrs->far_nbr_list[j].d,
-                    -far_nbrs->far_nbr_list[j].dvec[0],
-                    -far_nbrs->far_nbr_list[j].dvec[1],
-                    -far_nbrs->far_nbr_list[j].dvec[2] );
+                    id_j, id_i, far_nbrs->far_nbr_list.d[j],
+                    -far_nbrs->far_nbr_list.dvec[j][0],
+                    -far_nbrs->far_nbr_list.dvec[j][1],
+                    -far_nbrs->far_nbr_list.dvec[j][2] );
         }
     }
 
@@ -865,6 +865,7 @@ void Print_HBonds( reax_system *system, reax_list **lists,
     char fname[MAX_STR]; 
     hbond_data *phbond;
     FILE *fout;
+    reax_list *far_nbrs = lists[FAR_NBRS];
     reax_list *hbonds = lists[HBONDS];
 
     sprintf( fname, "%s.hbonds.%d.%d", control->sim_name, step, system->my_rank );
@@ -877,7 +878,9 @@ void Print_HBonds( reax_system *system, reax_list **lists,
             phbond = &hbonds->hbond_list[pj];
 
             fprintf( fout, "%8d%8d %24.15e %24.15e %24.15e\n", i, phbond->nbr,
-                    phbond->ptr->dvec[0], phbond->ptr->dvec[1], phbond->ptr->dvec[2] );
+                    far_nbrs->far_nbr_list.dvec[phbond->ptr][0],
+                    far_nbrs->far_nbr_list.dvec[phbond->ptr][1],
+                    far_nbrs->far_nbr_list.dvec[phbond->ptr][2] );
             //            fprintf( fout, "%8d%8d %8d %8d\n", i, phbond->nbr,
             //                  phbond->scl, phbond->sym_index );
         }
@@ -1024,7 +1027,7 @@ void Print_Far_Neighbors_List_Adj_Format( reax_system *system,
 
         for ( pj = Start_Index(i, list); pj < End_Index(i, list); ++pj )
         {
-            nbr = list->far_nbr_list[pj].nbr;
+            nbr = list->far_nbr_list.nbr[pj];
             id_j = system->my_atoms[nbr].orig_id;
             intrs[cnt++] = id_j;
         }
diff --git a/PuReMD/src/list.c b/PuReMD/src/list.c
index 5bfba249..922f42cc 100644
--- a/PuReMD/src/list.c
+++ b/PuReMD/src/list.c
@@ -38,8 +38,8 @@ int Make_List( int n, int num_intrs, int type, int format,
     l->n = n;
     l->num_intrs = num_intrs;
 
-    l->index = (int*) smalloc( n * sizeof(int), "list:index", comm );
-    l->end_index = (int*) smalloc( n * sizeof(int), "list:end_index", comm );
+    l->index = smalloc( n * sizeof(int), "Make_List:index", comm );
+    l->end_index = smalloc( n * sizeof(int), "Make_List:end_index", comm );
 
     l->type = type;
     l->format = format;
@@ -51,42 +51,48 @@ int Make_List( int n, int num_intrs, int type, int format,
     switch ( l->type )
     {
     case TYP_VOID:
-        l->v = (void*) smalloc(l->num_intrs * sizeof(void*), "list:v", comm);
+        l->v = smalloc( l->num_intrs * sizeof(void*),
+                "Make_List:v", comm );
         break;
 
     case TYP_THREE_BODY:
-        l->three_body_list = (three_body_interaction_data*)
-                             smalloc( l->num_intrs * sizeof(three_body_interaction_data),
-                                      "list:three_bodies", comm );
+        l->three_body_list = smalloc( l->num_intrs * sizeof(three_body_interaction_data),
+                "Make_List:three_bodies", comm );
         break;
 
     case TYP_BOND:
-        l->bond_list = (bond_data*)
-                       smalloc( l->num_intrs * sizeof(bond_data), "list:bonds", comm );
+        l->bond_list = smalloc( l->num_intrs * sizeof(bond_data),
+                "Make_List:bonds", comm );
         break;
 
     case TYP_DBO:
-        l->dbo_list = (dbond_data*)
-                      smalloc( l->num_intrs * sizeof(dbond_data), "list:dbonds", comm );
+        l->dbo_list = smalloc( l->num_intrs * sizeof(dbond_data),
+                "Make_List:dbonds", comm );
         break;
 
     case TYP_DDELTA:
-        l->dDelta_list = (dDelta_data*)
-                         smalloc( l->num_intrs * sizeof(dDelta_data), "list:dDeltas", comm );
+        l->dDelta_list = smalloc( l->num_intrs * sizeof(dDelta_data),
+                "Make_List:dDeltas", comm );
         break;
 
     case TYP_FAR_NEIGHBOR:
-        l->far_nbr_list = (far_neighbor_data*)
-                          smalloc(l->num_intrs * sizeof(far_neighbor_data), "list:far_nbrs", comm);
+        l->far_nbr_list.nbr = smalloc( l->num_intrs * sizeof(int),
+                "Make_List:far_nbr_list.nbr", comm );
+        l->far_nbr_list.rel_box = smalloc( l->num_intrs * sizeof(ivec),
+                "Make_List:far_nbr_list.rel_box", comm );
+        l->far_nbr_list.d = smalloc( l->num_intrs * sizeof(real),
+                "Make_List:far_nbr_list.d", comm );
+        l->far_nbr_list.dvec = smalloc( l->num_intrs * sizeof(rvec),
+                "Make_List:far_nbr_list.dvec", comm );
         break;
 
     case TYP_HBOND:
-        l->hbond_list = (hbond_data*)
-                        smalloc( l->num_intrs * sizeof(hbond_data), "list:hbonds", comm );
+        l->hbond_list = smalloc( l->num_intrs * sizeof(hbond_data),
+                "Make_List:hbonds", comm );
         break;
 
     default:
-        fprintf( stderr, "ERROR: no %d list type defined!\n", l->type );
+        fprintf( stderr, "[ERROR]: no %d list type defined!\n", l->type );
         MPI_Abort( comm, INVALID_INPUT );
     }
 
@@ -100,31 +106,34 @@ void Delete_List( reax_list *l, MPI_Comm comm )
         return;
     l->allocated = 0;
 
-    sfree( l->index, "list:index" );
-    sfree( l->end_index, "list:end_index" );
+    sfree( l->index, "Delete_List:index" );
+    sfree( l->end_index, "Delete_List:end_index" );
 
     switch (l->type)
     {
     case TYP_VOID:
-        sfree( l->v, "list:v" );
+        sfree( l->v, "Delete_List:v" );
         break;
     case TYP_HBOND:
-        sfree( l->hbond_list, "list:hbonds" );
+        sfree( l->hbond_list, "Delete_List:hbonds" );
         break;
     case TYP_FAR_NEIGHBOR:
-        sfree( l->far_nbr_list, "list:far_nbrs" );
+        sfree( l->far_nbr_list.nbr, "Delete_List:far_nbr_list.nbr" );
+        sfree( l->far_nbr_list.rel_box, "Delete_List:far_nbr_list.rel_box" );
+        sfree( l->far_nbr_list.d, "Delete_List:far_nbr_list.d" );
+        sfree( l->far_nbr_list.dvec, "Delete_List:far_nbr_list.dvec" );
         break;
     case TYP_BOND:
-        sfree( l->bond_list, "list:bonds" );
+        sfree( l->bond_list, "Delete_List:bonds" );
         break;
     case TYP_DBO:
-        sfree( l->dbo_list, "list:dbos" );
+        sfree( l->dbo_list, "Delete_List:dbos" );
         break;
     case TYP_DDELTA:
-        sfree( l->dDelta_list, "list:dDeltas" );
+        sfree( l->dDelta_list, "Delete_List:dDeltas" );
         break;
     case TYP_THREE_BODY:
-        sfree( l->three_body_list, "list:three_bodies" );
+        sfree( l->three_body_list, "Delete_List:three_bodies" );
         break;
 
     default:
diff --git a/PuReMD/src/neighbors.c b/PuReMD/src/neighbors.c
index e59269ab..a0701698 100644
--- a/PuReMD/src/neighbors.c
+++ b/PuReMD/src/neighbors.c
@@ -74,7 +74,6 @@ void Generate_Neighbor_Lists( reax_system *system, simulation_data *data,
     grid *g;
     grid_cell *gci, *gcj;
     reax_list *far_nbrs;
-    far_neighbor_data *nbr_data;
     reax_atom *atom1, *atom2;
 
 #if defined(LOG_PERFORMANCE)
@@ -140,12 +139,11 @@ void Generate_Neighbor_Lists( reax_system *system, simulation_data *data,
                                     d = rvec_Norm_Sqr( dvec );
                                     if ( d <= cutoff )
                                     {
-                                        nbr_data = &(far_nbrs->far_nbr_list[num_far]);
-                                        nbr_data->nbr = m;
-                                        nbr_data->d = sqrt(d);
-                                        rvec_Copy( nbr_data->dvec, dvec );
-                                        ivec_ScaledSum( nbr_data->rel_box,
-                                                        1, gcj->rel_box, -1, gci->rel_box );
+                                        far_nbrs->far_nbr_list.nbr[num_far] = m;
+                                        far_nbrs->far_nbr_list.d[num_far] = sqrt(d);
+                                        rvec_Copy( far_nbrs->far_nbr_list.dvec[num_far], dvec );
+                                        ivec_ScaledSum( far_nbrs->far_nbr_list.rel_box[num_far],
+                                                1, gcj->rel_box, -1, gci->rel_box );
                                         ++num_far;
                                     }
                                 }
diff --git a/PuReMD/src/nonbonded.c b/PuReMD/src/nonbonded.c
index 4f07103f..174bfada 100644
--- a/PuReMD/src/nonbonded.c
+++ b/PuReMD/src/nonbonded.c
@@ -47,7 +47,6 @@ void vdW_Coulomb_Energy( reax_system *system, control_params *control,
     real e_ele, e_vdW, e_core;
     rvec temp, ext_press;
     two_body_parameters *twbp;
-    far_neighbor_data *nbr_pj;
     reax_list *far_nbrs;
     // rtensor temp_rtensor, total_rtensor;
 
@@ -60,27 +59,25 @@ void vdW_Coulomb_Energy( reax_system *system, control_params *control,
 
     for ( i = 0; i < natoms; ++i )
     {
-        start_i = Start_Index(i, far_nbrs);
-        end_i   = End_Index(i, far_nbrs);
+        start_i = Start_Index( i, far_nbrs );
+        end_i = End_Index( i, far_nbrs );
         orig_i  = system->my_atoms[i].orig_id;
         //fprintf( stderr, "i:%d, start_i: %d, end_i: %d\n", i, start_i, end_i );
 
         for ( pj = start_i; pj < end_i; ++pj )
         {
-            nbr_pj = &(far_nbrs->far_nbr_list[pj]);
-            j = nbr_pj->nbr;
-            orig_j  = system->my_atoms[j].orig_id;
+            j = far_nbrs->far_nbr_list.nbr[pj];
+            orig_j = system->my_atoms[j].orig_id;
 
-            if ( nbr_pj->d <= control->nonb_cut
+            if ( far_nbrs->far_nbr_list.d[pj] <= control->nonb_cut
                     && ((far_nbrs->format == HALF_LIST && (j < natoms || orig_i < orig_j))
                         || (far_nbrs->format == FULL_LIST && orig_i < orig_j)) )
             {
-                r_ij = nbr_pj->d;
-                twbp = &(system->reax_param.tbp[ system->my_atoms[i].type ]
-                         [ system->my_atoms[j].type ]);
+                r_ij = far_nbrs->far_nbr_list.d[pj];
+                twbp = &system->reax_param.tbp[ 
+                    system->my_atoms[i].type ][ system->my_atoms[j].type ];
 
                 /* Calculate Taper and its derivative */
-                // Tap = nbr_pj->Tap;   -- precomputed during compte_H
                 Tap = workspace->Tap[7] * r_ij + workspace->Tap[6];
                 Tap = Tap * r_ij + workspace->Tap[5];
                 Tap = Tap * r_ij + workspace->Tap[4];
@@ -96,12 +93,13 @@ void vdW_Coulomb_Energy( reax_system *system, control_params *control,
                 dTap = dTap * r_ij + 2 * workspace->Tap[2];
                 dTap += workspace->Tap[1] / r_ij;
 
-                /*vdWaals Calculations*/
-                if (system->reax_param.gp.vdw_type == 1 || system->reax_param.gp.vdw_type == 3)
+                /* vdWaals Calculations */
+                if ( system->reax_param.gp.vdw_type == 1
+                        || system->reax_param.gp.vdw_type == 3 )
                 {
                     // shielding
-                    powr_vdW1 = pow(r_ij, p_vdW1);
-                    powgi_vdW1 = pow( 1.0 / twbp->gamma_w, p_vdW1);
+                    powr_vdW1 = pow( r_ij, p_vdW1 );
+                    powgi_vdW1 = pow( 1.0 / twbp->gamma_w, p_vdW1 );
 
                     fn13 = pow( powr_vdW1 + powgi_vdW1, p_vdW1i );
                     exp1 = exp( twbp->alpha * (1.0 - fn13 / twbp->r_vdW) );
@@ -110,11 +108,11 @@ void vdW_Coulomb_Energy( reax_system *system, control_params *control,
                     e_vdW = twbp->D * (exp1 - 2.0 * exp2);
                     data->my_en.e_vdW += Tap * e_vdW;
 
-                    dfn13 = pow( powr_vdW1 + powgi_vdW1, p_vdW1i - 1.0) *
-                            pow(r_ij, p_vdW1 - 2.0);
+                    dfn13 = pow( powr_vdW1 + powgi_vdW1, p_vdW1i - 1.0 )
+                        * pow( r_ij, p_vdW1 - 2.0 );
 
-                    CEvd = dTap * e_vdW -
-                           Tap * twbp->D * (twbp->alpha / twbp->r_vdW) * (exp1 - exp2) * dfn13;
+                    CEvd = dTap * e_vdW - Tap * twbp->D
+                        * (twbp->alpha / twbp->r_vdW) * (exp1 - exp2) * dfn13;
                 }
                 else  // no shielding
                 {
@@ -156,24 +154,30 @@ void vdW_Coulomb_Energy( reax_system *system, control_params *control,
 
                 if ( control->virial == 0 )
                 {
-                    rvec_ScaledAdd( workspace->f[i], -(CEvd + CEclmb), nbr_pj->dvec );
-                    rvec_ScaledAdd( workspace->f[j], +(CEvd + CEclmb), nbr_pj->dvec );
+                    rvec_ScaledAdd( workspace->f[i], -(CEvd + CEclmb),
+                            far_nbrs->far_nbr_list.dvec[pj] );
+                    rvec_ScaledAdd( workspace->f[j], +(CEvd + CEclmb),
+                            far_nbrs->far_nbr_list.dvec[pj] );
                 }
                 else   /* NPT, iNPT or sNPT */
                 {
                     /* for pressure coupling, terms not related to bond order
                        derivatives are added directly into pressure vector/tensor */
-                    rvec_Scale( temp, CEvd + CEclmb, nbr_pj->dvec );
+                    rvec_Scale( temp, CEvd + CEclmb,
+                            far_nbrs->far_nbr_list.dvec[pj] );
 
                     rvec_ScaledAdd( workspace->f[i], -1., temp );
                     rvec_Add( workspace->f[j], temp );
 
-                    rvec_iMultiply( ext_press, nbr_pj->rel_box, temp );
+                    rvec_iMultiply( ext_press,
+                            far_nbrs->far_nbr_list.rel_box[pj], temp );
                     rvec_Add( data->my_ext_press, ext_press );
 
                     // fprintf( stderr, "nonbonded(%d,%d): rel_box (%f %f %f)
                     //   force(%f %f %f) ext_press (%12.6f %12.6f %12.6f)\n",
-                    //   i, j, nbr_pj->rel_box[0], nbr_pj->rel_box[1], nbr_pj->rel_box[2],
+                    //   i, j, far_nbrs->far_nbr_list.rel_box[pj][0],
+                    //   far_nbrs->far_nbr_list.rel_box[pj][1],
+                    //   far_nbrs->far_nbr_list.rel_box[pj][2],
                     //   temp[0], temp[1], temp[2],
                     //   data->ext_press[0], data->ext_press[1], data->ext_press[2] );
                 }
@@ -195,10 +199,14 @@ void vdW_Coulomb_Energy( reax_system *system, control_params *control,
                          e_ele, data->my_en.e_ele );
 #endif
 #ifdef TEST_FORCES
-                rvec_ScaledAdd( workspace->f_vdw[i], -CEvd, nbr_pj->dvec );
-                rvec_ScaledAdd( workspace->f_vdw[j], +CEvd, nbr_pj->dvec );
-                rvec_ScaledAdd( workspace->f_ele[i], -CEclmb, nbr_pj->dvec );
-                rvec_ScaledAdd( workspace->f_ele[j], +CEclmb, nbr_pj->dvec );
+                rvec_ScaledAdd( workspace->f_vdw[i], -CEvd,
+                        far_nbrs->far_nbr_list.dvec[pj] );
+                rvec_ScaledAdd( workspace->f_vdw[j], +CEvd,
+                        far_nbrs->far_nbr_list.dvec[pj] );
+                rvec_ScaledAdd( workspace->f_ele[i], -CEclmb,
+                        far_nbrs->far_nbr_list.dvec[pj] );
+                rvec_ScaledAdd( workspace->f_ele[j], +CEclmb,
+                        far_nbrs->far_nbr_list.dvec[pj] );
 #endif
             }
         }
@@ -227,7 +235,6 @@ void Tabulated_vdW_Coulomb_Energy( reax_system *system, control_params *control,
     real e_vdW, e_ele;
     real CEvd, CEclmb;
     rvec temp, ext_press;
-    far_neighbor_data *nbr_pj;
     reax_list *far_nbrs;
     LR_lookup_table *t;
 
@@ -247,21 +254,19 @@ void Tabulated_vdW_Coulomb_Energy( reax_system *system, control_params *control,
 
         for ( pj = start_i; pj < end_i; ++pj )
         {
-            nbr_pj = &(far_nbrs->far_nbr_list[pj]);
-            j = nbr_pj->nbr;
-            orig_j  = system->my_atoms[j].orig_id;
+            j = far_nbrs->far_nbr_list.nbr[pj];
+            orig_j = system->my_atoms[j].orig_id;
 
-            if ( nbr_pj->d <= control->nonb_cut
+            if ( far_nbrs->far_nbr_list.d[pj] <= control->nonb_cut
                     && ((far_nbrs->format == HALF_LIST && (j < natoms || orig_i < orig_j))
                         || (far_nbrs->format == FULL_LIST && orig_i < orig_j)) )
             {
-                j = nbr_pj->nbr;
                 type_j = system->my_atoms[j].type;
-                r_ij   = nbr_pj->d;
-                tmin  = MIN( type_i, type_j );
-                tmax  = MAX( type_i, type_j );
-                t = &( LR[tmin][tmax] );
-                // table = &( LR[type_i][type_j] );
+                r_ij = far_nbrs->far_nbr_list.d[pj];
+                tmin = MIN( type_i, type_j );
+                tmax = MAX( type_i, type_j );
+                t = &LR[tmin][tmax];
+                // table = &LR[type_i][type_j];
 
                 /* Cubic Spline Interpolation */
                 r = (int)(r_ij * t->inv_dx);
@@ -292,19 +297,21 @@ void Tabulated_vdW_Coulomb_Energy( reax_system *system, control_params *control,
 
                 if ( control->virial == 0 )
                 {
-                    rvec_ScaledAdd( workspace->f[i], -(CEvd + CEclmb), nbr_pj->dvec );
-                    rvec_ScaledAdd( workspace->f[j], +(CEvd + CEclmb), nbr_pj->dvec );
+                    rvec_ScaledAdd( workspace->f[i], -(CEvd + CEclmb),
+                            far_nbrs->far_nbr_list.dvec[pj] );
+                    rvec_ScaledAdd( workspace->f[j], +(CEvd + CEclmb),
+                            far_nbrs->far_nbr_list.dvec[pj] );
                 }
                 else   // NPT, iNPT or sNPT
                 {
                     /* for pressure coupling, terms not related to bond order derivatives
                        are added directly into pressure vector/tensor */
-                    rvec_Scale( temp, CEvd + CEclmb, nbr_pj->dvec );
+                    rvec_Scale( temp, CEvd + CEclmb, far_nbrs->far_nbr_list.dvec[pj] );
 
                     rvec_ScaledAdd( workspace->f[i], -1., temp );
                     rvec_Add( workspace->f[j], temp );
 
-                    rvec_iMultiply( ext_press, nbr_pj->rel_box, temp );
+                    rvec_iMultiply( ext_press, far_nbrs->far_nbr_list.rel_box[pj], temp );
                     rvec_Add( data->my_ext_press, ext_press );
                 }
 
@@ -320,10 +327,14 @@ void Tabulated_vdW_Coulomb_Energy( reax_system *system, control_params *control,
                          e_ele, data->my_en.e_ele );
 #endif
 #ifdef TEST_FORCES
-                rvec_ScaledAdd( workspace->f_vdw[i], -CEvd, nbr_pj->dvec );
-                rvec_ScaledAdd( workspace->f_vdw[j], +CEvd, nbr_pj->dvec );
-                rvec_ScaledAdd( workspace->f_ele[i], -CEclmb, nbr_pj->dvec );
-                rvec_ScaledAdd( workspace->f_ele[j], +CEclmb, nbr_pj->dvec );
+                rvec_ScaledAdd( workspace->f_vdw[i], -CEvd,
+                        far_nbrs->far_nbr_list.dvec[pj] );
+                rvec_ScaledAdd( workspace->f_vdw[j], +CEvd,
+                        far_nbrs->far_nbr_list.dvec[pj] );
+                rvec_ScaledAdd( workspace->f_ele[i], -CEclmb,
+                        far_nbrs->far_nbr_list.dvec[pj] );
+                rvec_ScaledAdd( workspace->f_ele[j], +CEclmb,
+                        far_nbrs->far_nbr_list.dvec[pj] );
 #endif
             }
         }
diff --git a/PuReMD/src/parallelreax.c b/PuReMD/src/parallelreax.c
index 0ff49df1..e633a3d3 100644
--- a/PuReMD/src/parallelreax.c
+++ b/PuReMD/src/parallelreax.c
@@ -160,7 +160,6 @@ int main( int argc, char* argv[] )
         lists[i]->bond_list = NULL;
         lists[i]->dbo_list = NULL;
         lists[i]->dDelta_list = NULL;
-        lists[i]->far_nbr_list = NULL;
         lists[i]->hbond_list = NULL;
     }
     out_control = (output_controls *)
diff --git a/PuReMD/src/reax_types.h b/PuReMD/src/reax_types.h
index b99f95d3..ab8a7b50 100644
--- a/PuReMD/src/reax_types.h
+++ b/PuReMD/src/reax_types.h
@@ -897,10 +897,16 @@ typedef struct
 
 typedef struct
 {
-    int nbr;
-    ivec rel_box;
-    real d;
-    rvec dvec;
+    /* neighbor atom IDs */
+    int *nbr;
+    /* set of three integers which deterimine if the neighbor
+     * atom is a non-periodic neighbor (all zeros) or a periodic
+     * neighbor and which perioidic image this neighbor comes from */
+    ivec *rel_box;
+    /* distance to the neighboring atom */
+    real *d;
+    /* difference between positions of this atom and its neighboring atom */
+    rvec *dvec;
 } far_neighbor_data;
 
 
@@ -917,9 +923,12 @@ typedef struct
 
 typedef struct
 {
+    /* neighbor atom ID */
     int nbr;
+    /* ??? */
     int scl;
-    far_neighbor_data *ptr;
+    /* position of neighbor in far neighbor list */
+    int ptr;
 } hbond_data;
 
 
@@ -1127,7 +1136,7 @@ typedef struct
     bond_data *bond_list;
     dbond_data *dbo_list;
     dDelta_data *dDelta_list;
-    far_neighbor_data *far_nbr_list;
+    far_neighbor_data far_nbr_list;
 #if defined(NEUTRAL_TERRITORY)
     nt_neighbor_data *nt_nbr_list;
 #endif
-- 
GitLab