From a60a08840398c3f32eedeec7befc2aecc3028e67 Mon Sep 17 00:00:00 2001
From: sjplimp <sjplimp@f3b2605a-c512-4ea7-a41b-209d697bcdaa>
Date: Mon, 6 Jul 2015 14:04:30 +0000
Subject: [PATCH] git-svn-id: svn://svn.icms.temple.edu/lammps-ro/trunk@13518
 f3b2605a-c512-4ea7-a41b-209d697bcdaa

---
 src/MANYBODY/pair_bop.cpp | 11218 +++++++++++++-----------------------
 src/MANYBODY/pair_bop.h   |    66 +-
 2 files changed, 4029 insertions(+), 7255 deletions(-)

diff --git a/src/MANYBODY/pair_bop.cpp b/src/MANYBODY/pair_bop.cpp
index 1017e58b47..5e916a9918 100644
--- a/src/MANYBODY/pair_bop.cpp
+++ b/src/MANYBODY/pair_bop.cpp
@@ -42,7 +42,6 @@
 #include "neighbor.h"
 #include "neigh_request.h"
 #include "force.h"
-#include "timer.h"
 #include "comm.h"
 #include "domain.h"
 #include "neighbor.h"
@@ -50,10 +49,9 @@
 #include "neigh_request.h"
 #include "memory.h"
 #include "error.h"
-#include "math_special.h"
+#include "ctype.h"
 
 using namespace LAMMPS_NS;
-using namespace MathSpecial;
 
 #define MAXLINE 1024
 #define EPSILON 1.0e-6
@@ -64,21 +62,19 @@ PairBOP::PairBOP(LAMMPS *lmp) : Pair(lmp)
 {
   single_enable = 0;
   one_coeff = 1;
-  manybody_flag = 1;
-
   map = NULL;
   pi_a = NULL;
   pro_delta = NULL;
   pi_delta = NULL;
   pi_p = NULL;
   pi_c = NULL;
+  r1 = NULL;
   sigma_r0 = NULL;
   pi_r0 = NULL;
   phi_r0 = NULL;
   sigma_rc = NULL;
   pi_rc = NULL;
   phi_rc = NULL;
-  r1 = NULL;
   sigma_beta0 = NULL;
   pi_beta0 = NULL;
   phi0 = NULL;
@@ -92,19 +88,21 @@ PairBOP::PairBOP(LAMMPS *lmp) : Pair(lmp)
   sigma_delta = NULL;
   sigma_c = NULL;
   sigma_a = NULL;
-  sigma_g0 = NULL;
-  sigma_g1 = NULL;
-  sigma_g2 = NULL;
-  sigma_g3 = NULL;
-  sigma_g4 = NULL;
   sigma_f = NULL;
   sigma_k = NULL;
   small3 = NULL;
   rcut = NULL;
+  rcut3 = NULL;
+  rcutsq = NULL;
+  rcutsq3 = NULL;
   dr = NULL;
   rdr = NULL;
+  dr3 = NULL;
+  rdr3 = NULL;
   disij = NULL;
   rij = NULL;
+  neigh_index = NULL;
+  neigh_index3 = NULL;
   cosAng = NULL;
   betaS = NULL;
   dBetaS = NULL;
@@ -113,12 +111,7 @@ PairBOP::PairBOP(LAMMPS *lmp) : Pair(lmp)
   repul = NULL;
   dRepul = NULL;
   itypeSigBk = NULL;
-  nSigBk = NULL;
-  sigB = NULL;
-  sigB1 = NULL;
   itypePiBk = NULL;
-  nPiBk = NULL;
-  piB = NULL;
   pBetaS = NULL;
   pBetaS1 = NULL;
   pBetaS2 = NULL;
@@ -126,6 +119,13 @@ PairBOP::PairBOP(LAMMPS *lmp) : Pair(lmp)
   pBetaS4 = NULL;
   pBetaS5 = NULL;
   pBetaS6 = NULL;
+  pLong = NULL;
+  pLong1 = NULL;
+  pLong2 = NULL;
+  pLong3 = NULL;
+  pLong4 = NULL;
+  pLong5 = NULL;
+  pLong6 = NULL;
   pBetaP = NULL;
   pBetaP1 = NULL;
   pBetaP2 = NULL;
@@ -153,7 +153,14 @@ PairBOP::PairBOP(LAMMPS *lmp) : Pair(lmp)
   setflag = NULL;
   cutsq = NULL;
   cutghost = NULL;
-
+  gfunc = NULL;
+  gfunc1 = NULL;
+  gfunc2 = NULL;
+  gfunc3 = NULL;
+  gfunc4 = NULL;
+  gfunc5 = NULL;
+  gfunc6 = NULL;
+  gpara = NULL;
   ghostneigh = 1;
   bt_sg=NULL;
   bt_pi=NULL;
@@ -165,15 +172,24 @@ PairBOP::PairBOP(LAMMPS *lmp) : Pair(lmp)
 
 PairBOP::~PairBOP()
 {
+  int i;
   if(allocated) {
     memory_theta_destroy();
     if (otfly==0) memory->destroy(cos_index);
     delete [] map;
 
     memory->destroy(BOP_index);
+    memory->destroy(BOP_total);
+    memory->destroy(BOP_index3);
+    memory->destroy(BOP_total3);
     memory->destroy(rcut);
+    memory->destroy(rcut3);
+    memory->destroy(rcutsq);
+    memory->destroy(rcutsq3);
     memory->destroy(dr);
     memory->destroy(rdr);
+    memory->destroy(dr3);
+    memory->destroy(rdr3);
     memory->destroy(setflag);
     memory->destroy(cutsq);
     memory->destroy(cutghost);
@@ -184,6 +200,13 @@ PairBOP::~PairBOP()
     memory->destroy(pBetaS4);
     memory->destroy(pBetaS5);
     memory->destroy(pBetaS6);
+    memory->destroy(pLong);
+    memory->destroy(pLong1);
+    memory->destroy(pLong2);
+    memory->destroy(pLong3);
+    memory->destroy(pLong4);
+    memory->destroy(pLong5);
+    memory->destroy(pLong6);
     memory->destroy(pBetaP);
     memory->destroy(pBetaP1);
     memory->destroy(pBetaP2);
@@ -205,59 +228,27 @@ PairBOP::~PairBOP()
     memory->destroy(FsigBO4);
     memory->destroy(FsigBO5);
     memory->destroy(FsigBO6);
-    if(table==0) {
-      memory->destroy(pi_a);
-      memory->destroy(pro_delta);
-      memory->destroy(pi_delta);
-      memory->destroy(pi_p);
-      memory->destroy(pi_c);
-      memory->destroy(sigma_r0);
-      memory->destroy(pi_r0);
-      memory->destroy(phi_r0);
-      memory->destroy(sigma_rc);
-      memory->destroy(pi_rc);
-      memory->destroy(phi_rc);
-      memory->destroy(r1);
-      memory->destroy(sigma_beta0);
-      memory->destroy(pi_beta0);
-      memory->destroy(phi0);
-      memory->destroy(sigma_n);
-      memory->destroy(pi_n);
-      memory->destroy(phi_m);
-      memory->destroy(sigma_nc);
-      memory->destroy(pi_nc);
-      memory->destroy(phi_nc);
-      memory->destroy(pro);
-      memory->destroy(sigma_delta);
-      memory->destroy(sigma_c);
-      memory->destroy(sigma_a);
-      memory->destroy(sigma_g0);
-      memory->destroy(sigma_g1);
-      memory->destroy(sigma_g2);
-      memory->destroy(sigma_g3);
-      memory->destroy(sigma_g4);
-      memory->destroy(sigma_f);
-      memory->destroy(sigma_k);
-      memory->destroy(small3);
-    }
-    else {
-      memory->destroy(pi_a);
-      memory->destroy(pro_delta);
-      memory->destroy(pi_delta);
-      memory->destroy(pi_p);
-      memory->destroy(pi_c);
-      memory->destroy(r1);
-      memory->destroy(pro);
-      memory->destroy(sigma_delta);
-      memory->destroy(sigma_c);
-      memory->destroy(sigma_a);
-      memory->destroy(sigma_g0);
-      memory->destroy(sigma_g1);
-      memory->destroy(sigma_g2);
-      memory->destroy(sigma_f);
-      memory->destroy(sigma_k);
-      memory->destroy(small3);
-    }
+    memory->destroy(pi_a);
+    memory->destroy(pro_delta);
+    memory->destroy(pi_delta);
+    memory->destroy(pi_p);
+    memory->destroy(pi_c);
+    memory->destroy(r1);
+    memory->destroy(pro);
+    memory->destroy(sigma_delta);
+    memory->destroy(sigma_c);
+    memory->destroy(sigma_a);
+    memory->destroy(sigma_f);
+    memory->destroy(sigma_k);
+    memory->destroy(small3);
+    memory->destroy(gfunc);
+    memory->destroy(gfunc1);
+    memory->destroy(gfunc2);
+    memory->destroy(gfunc3);
+    memory->destroy(gfunc4);
+    memory->destroy(gfunc5);
+    memory->destroy(gfunc6);
+    memory->destroy(gpara);
   }
   if(allocate_sigma) {
     destroy_sigma();
@@ -271,11 +262,11 @@ PairBOP::~PairBOP()
 
 void PairBOP::compute(int eflag, int vflag)
 {
-  int ago,delay,every;
-  int i,j,ii,jj,iij;
+  int ago,delay,every,pass;
+  int i,j,ii,jj,iij,i12;
   int n,inum,temp_ij,ks;
-  int itype,jtype;
-  tagint i_tag,j_tag;
+  int nlisti;
+  int itype,jtype,i_tag,j_tag;
   int *ilist,*iilist,*numneigh;
   int **firstneigh;
   double dpr1,ps;
@@ -284,16 +275,22 @@ void PairBOP::compute(int eflag, int vflag)
   double betaS_ij,dBetaS_ij;
   double betaP_ij,dBetaP_ij;
   double repul_ij,dRepul_ij;
+  double value,dvalue;
   double totE;
+  double fst[3];
+  double rcut_min;
 
   double **f = atom->f;
   double **x = atom->x;
   int *type = atom->type;
-  tagint *tag = atom->tag;
+  int *tag = atom->tag;
   int newton_pair = force->newton_pair;
   int nlocal = atom->nlocal;
   int nall = nlocal + atom->nghost;
+  int timestep,cnt1;
+  MPI_Comm_rank(world,&me);
 
+  timestep = update->ntimestep;
   inum = list->inum;
   ilist = list->ilist;
   numneigh = list->numneigh;
@@ -305,51 +302,39 @@ void PairBOP::compute(int eflag, int vflag)
   if (eflag || vflag) ev_setup(eflag,vflag);
   else evflag = vflag_fdotr = 0;
 
-  // BOP Neighbor lists must be updated every time
-  // atoms are moved between processors
-
-  if ((ago ==0)||bop_step==0||(ago>=delay&&(ago%every)==0)||(nall>maxnall))
-    gneigh();
-
+  // BOP Neighbor lists must be updated every timestep
+  maxnall=nall;
+  gneigh();
   // For non on the fly calculations cos and derivatives
   // are calculated in advance and stored
-
-  if(otfly==0) theta();
-  else theta_mod();
-
-  // Calculate Sigma Bond-Order
-
-  if(a_flag==1) {
-    if (otfly==0) sigmaBo_noa();
-    else sigmaBo_noa_otf();
-  }
-  else {
-    if (otfly==0) sigmaBo();
-    else sigmaBo_otf();
-  }
-
-  // Calculate Pi Bond-Order
-
-  if (otfly==0) PiBo();
-  else PiBo_otf();
-
   n=0;
   totE=0;
+  piB_0=0;
+  sigB_0=0;
+  for (ii = 0; ii < inum; ii++) {
+    i=ilist[ii];
+    f[i][0]=0;
+    f[i][1]=0;
+    f[i][2]=0;
+  }
   for (ii = 0; ii < inum; ii++) {
     i=ilist[ii];
     i_tag=tag[i];
     itype=map[type[i]]+1;
     iilist=firstneigh[i];
-    for(jj=0;jj<numneigh[i];jj++) {
+    nlisti=BOP_total[i];
+    for(jj=0;jj<nlisti;jj++) {
       temp_ij=BOP_index[i]+jj;
-      j=iilist[jj];
+      j=iilist[neigh_index[temp_ij]];
       j_tag=tag[j];
       jtype=map[type[j]]+1;
       if(j_tag>=i_tag) {
+        sigB_0=sigmaBo(ii,jj);
+        piB_0=PiBo(ii,jj);
         if(otfly==0) {
           if(neigh_flag[temp_ij]) {
-            dpr1=(dRepul[temp_ij]-2.0*dBetaS[temp_ij]*sigB[n]
-                -2.0*dBetaP[temp_ij]*piB[n])/rij[temp_ij];
+            dpr1=(dRepul[temp_ij]-2.0*dBetaS[temp_ij]*sigB_0
+                -2.0*dBetaP[temp_ij]*piB_0)/rij[temp_ij];
             ftmp1=dpr1*disij[0][temp_ij];
             ftmp2=dpr1*disij[1][temp_ij];
             ftmp3=dpr1*disij[2][temp_ij];
@@ -359,11 +344,10 @@ void PairBOP::compute(int eflag, int vflag)
             f[j][0]=f[j][0]-ftmp1;
             f[j][1]=f[j][1]-ftmp2;
             f[j][2]=f[j][2]-ftmp3;
-
             // add repulsive and bond order components to total energy
             // (d) Eq.1
 
-            dE=-2.0*betaS[temp_ij]*sigB[n]-2.0*betaP[temp_ij]*piB[n];
+            dE=-2.0*betaS[temp_ij]*sigB_0-2.0*betaP[temp_ij]*piB_0;
             totE+=dE+repul[temp_ij];
             if(evflag) {
               ev_tally_full(i,repul[temp_ij],dE,0.0,0.0,0.0,0.0);
@@ -371,7 +355,6 @@ void PairBOP::compute(int eflag, int vflag)
               ev_tally_xyz(i,j,nlocal,newton_pair,0.0,0.0,-ftmp1,-ftmp2,-ftmp3,
                   disij[0][temp_ij],disij[1][temp_ij],disij[2][temp_ij]);
             }
-            n++;
           }
         }
         else {
@@ -408,8 +391,8 @@ void PairBOP::compute(int eflag, int vflag)
                 +pRepul1[iij][ks-1])*ps+pRepul[iij][ks-1];
             dRepul_ij=(pRepul6[iij][ks-1]*ps+pRepul5[iij][ks-1])*ps
                 +pRepul4[iij][ks-1];
-            dpr1=(dRepul_ij-2.0*dBetaS_ij*sigB[n]
-                -2.0*dBetaP_ij*piB[n])/r_ij;
+            dpr1=(dRepul_ij-2.0*dBetaS_ij*sigB_0
+                -2.0*dBetaP_ij*piB_0)/r_ij;
             ftmp1=dpr1*dis_ij[0];
             ftmp2=dpr1*dis_ij[1];
             ftmp3=dpr1*dis_ij[2];
@@ -423,7 +406,7 @@ void PairBOP::compute(int eflag, int vflag)
             // add repulsive and bond order components to total energy
             // (d) Eq. 1
 
-            dE=-2.0*betaS_ij*sigB[n]-2.0*betaP_ij*piB[n];
+            dE=-2.0*betaS_ij*sigB_0-2.0*betaP_ij*piB_0;
             totE+=dE+repul_ij;
             if(evflag) {
               ev_tally_full(i,repul_ij,dE,0.0,0.0,0.0,0.0);
@@ -431,13 +414,76 @@ void PairBOP::compute(int eflag, int vflag)
               ev_tally_xyz(i,j,nlocal,newton_pair,0.0,0.0,-ftmp1,-ftmp2,-ftmp3,
                   dis_ij[0],dis_ij[1],dis_ij[2]);
             }
-            n++;
           }
         }
       }
     }
   }
-
+  cnt1=0;
+  rcut_min=10000;
+  for (ii = 0; ii < inum; ii++) {
+    i=ilist[ii];
+    i_tag=tag[i];
+    itype=map[type[i]]+1;
+    iilist=firstneigh[i];
+    nlisti=BOP_total3[i];
+    for(jj=0;jj<nlisti;jj++) {
+      temp_ij=BOP_index3[i]+jj;
+      j=iilist[neigh_index3[temp_ij]];
+      j_tag=tag[j];
+      if(i_tag < j_tag) {
+        jtype=map[type[j]]+1;
+        pass=0;
+        if(itype==jtype)
+          i12=itype-1;
+        else if(itype<jtype)
+          i12=itype*bop_types-itype*(itype+1)/2+jtype-1;
+        else
+          i12=jtype*bop_types-jtype*(jtype+1)/2+itype-1;
+        dis_ij[0]=x[j][0]-x[i][0];
+        dis_ij[1]=x[j][1]-x[i][1];
+        dis_ij[2]=x[j][2]-x[i][2];
+        r_ij=sqrt(dis_ij[0]*dis_ij[0]+dis_ij[1]*dis_ij[1]+dis_ij[2]*dis_ij[2]);
+        if(r_ij<rcut_min) {
+          rcut_min=r_ij;
+        }
+        if(r_ij<=rcut3[i12])
+          pass=1;
+        if(pass==1) {
+          ps=r_ij*rdr3[i12]+1.0;
+          ks=(int)ps;
+          if(nr-1<ks)
+            ks=nr-1;
+          ps=ps-ks;
+          if(ps>1.0)
+            ps=1.0;
+          value=((pLong3[i12][ks-1]*ps+pLong2[i12][ks-1])*ps+
+              pLong1[i12][ks-1])*ps+pLong[i12][ks-1];
+          if(value<=0.0) value=pLong[i12][ks-1];
+          dvalue=(pLong6[i12][ks-1]*ps+
+              pLong5[i12][ks-1])*ps+pLong4[i12][ks-1];
+          dpr1=-dvalue/r_ij;
+          ftmp1=dpr1*dis_ij[0];
+          ftmp2=dpr1*dis_ij[1];
+          ftmp3=dpr1*dis_ij[2];
+          f[i][0]=f[i][0]+ftmp1;
+          f[i][1]=f[i][1]+ftmp2;
+          f[i][2]=f[i][2]+ftmp3;
+          f[j][0]=f[j][0]-ftmp1;
+          f[j][1]=f[j][1]-ftmp2;
+          f[j][2]=f[j][2]-ftmp3;
+          totE=totE-value;
+          if(evflag) {
+            ev_tally_full(i,0,-value,0.0,0.0,0.0,0.0);
+            ev_tally_full(j,0,-value,0.0,0.0,0.0,0.0);
+            ev_tally_xyz(i,j,nlocal,newton_pair,0.0,0.0,-ftmp1,-ftmp2,-ftmp3,
+                dis_ij[0],dis_ij[1],dis_ij[2]);
+          }
+          cnt1++;
+        }
+      }
+    }
+  }
   if (vflag_fdotr) virial_fdotr_compute();
   bop_step = 1;
 }
@@ -452,8 +498,13 @@ void PairBOP::allocate()
   int n = atom->ntypes;
 
   memory->create(rcut,npairs,"BOP:rcut");
+  memory->create(rcut3,npairs,"BOP:rcut3");
+  memory->create(rcutsq,npairs,"BOP:rcutsq");
+  memory->create(rcutsq3,npairs,"BOP:rcutsq3");
   memory->create(dr,npairs,"BOP:dr");
   memory->create(rdr,npairs,"BOP:dr");
+  memory->create(dr3,npairs,"BOP:dr");
+  memory->create(rdr3,npairs,"BOP:dr");
   memory->create(setflag,n+1,n+1,"pair:setflag");
   memory->create(cutsq,n+1,n+1,"pair:cutsq");
   memory->create(cutghost,n+1,n+1,"pair:cutghost");
@@ -464,6 +515,13 @@ void PairBOP::allocate()
   memory->create(pBetaS4,npairs,nr,"BOP:pBetaS4");
   memory->create(pBetaS5,npairs,nr,"BOP:pBetaS5");
   memory->create(pBetaS6,npairs,nr,"BOP:pBetaS6");
+  memory->create(pLong,npairs,nr,"BOP:pLong");
+  memory->create(pLong1,npairs,nr,"BOP:pLong");
+  memory->create(pLong2,npairs,nr,"BOP:pLong");
+  memory->create(pLong3,npairs,nr,"BOP:pLong");
+  memory->create(pLong4,npairs,nr,"BOP:pLong");
+  memory->create(pLong5,npairs,nr,"BOP:pLong");
+  memory->create(pLong6,npairs,nr,"BOP:pLong");
   memory->create(pBetaP,npairs,nr,"BOP:pBetaP");
   memory->create(pBetaP1,npairs,nr,"BOP:pBetaP1");
   memory->create(pBetaP2,npairs,nr,"BOP:pBetaP2");
@@ -493,21 +551,13 @@ void PairBOP::allocate()
 
 void PairBOP::settings(int narg, char **arg)
 {
-  table = 0;
   otfly = 1;
-  a_flag = 0;
 
   int iarg = 0;
   while (iarg < narg) {
-    if (strcmp(arg[iarg],"table") == 0) {
-      table = 1;
-      iarg++;
-    } else if (strcmp(arg[iarg],"save") == 0) {
+    if (strcmp(arg[iarg],"save") == 0) {
       otfly = 0;
       iarg++;
-    } else if (strcmp(arg[iarg],"sigmaoff") == 0) {
-      a_flag = 1;
-      iarg++;
     } else error->all(FLERR,"Illegal pair_style command");
   }
 }
@@ -518,11 +568,12 @@ void PairBOP::settings(int narg, char **arg)
 
 void PairBOP::coeff(int narg, char **arg)
 {
-  int i,j,n;
+  int i,j;
+  int n = atom->ntypes;
   MPI_Comm_rank(world,&me);
-  map = new int[atom->ntypes+1];
+  map = new int[n+1];
 
-  if (narg < 3 + atom->ntypes)
+  if (narg != 3 + atom->ntypes)
     error->all(FLERR,"Incorrect args for pair coefficients");
 
   // ensure I,J args are * *
@@ -531,9 +582,9 @@ void PairBOP::coeff(int narg, char **arg)
     error->all(FLERR,"Incorrect args for pair coefficients");
 
   // read the potential file
-
   nr=2000;
   nBOt=2000;
+  ntheta=2000;
   bop_step=0;
   nb_pi=0;
   nb_sg=0;
@@ -541,42 +592,32 @@ void PairBOP::coeff(int narg, char **arg)
   allocate_pi=0;
   allocate_neigh=0;
   update_list=0;
+  maxnall=0;
 
-  if (table == 0) read_file(arg[2]);
-  else read_table(arg[2]);
-
-  if (table == 0) {
-    setPbetaS();
-    setPbetaP();
-    setPrepul();
-    setSign();
-  }
+  read_table(arg[2]);
 
   // match element names to BOP word types
-
   if (me == 0) {
     for (i = 3; i < narg; i++) {
       if (strcmp(arg[i],"NULL") == 0) {
         map[i-2] = -1;
         continue;
       }
-      for (j = 0; j < bop_types; j++)
-        if (strcmp(arg[i],words[j]) == 0) break;
+      for (j = 0; j < bop_types; j++) {
+        if (strcmp(arg[i],elements[j]) == 0) break;
+      }
       map[i-2] = j;
     }
   }
 
   MPI_Bcast(&map[1],atom->ntypes,MPI_INT,0,world);
-
   if (me == 0) {
-    if (words) {
-      for (i = 0; i < bop_types; i++) delete [] words[i];
-      delete [] words;
+    if (elements) {
+      for (i = 0; i < bop_types; i++) delete [] elements[i];
+      delete [] elements;
     }
   }
-
   // clear setflag since coeff() called once with I,J = * *
-
   n = atom->ntypes;
   for (int i = 1; i <= n; i++)
     for (int j = i; j <= n; j++)
@@ -591,7 +632,6 @@ void PairBOP::coeff(int narg, char **arg)
         setflag[i][j] = 1;
         count++;
       }
-
   if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients");
 }
 
@@ -615,9 +655,7 @@ void PairBOP::init_style()
     error->all(FLERR,str);
   }
 
-  // need a full neighbor list and neighbors of ghosts
-
-  int irequest = neighbor->request(this,instance_me);
+  int irequest = neighbor->request(this);
   neighbor->requests[irequest]->half = 0;
   neighbor->requests[irequest]->full = 1;
   neighbor->requests[irequest]->ghost = 1;
@@ -637,11 +675,20 @@ double PairBOP::init_one(int i, int j)
   else if (ii<jj) ij=ii*bop_types-ii*(ii+1)/2+jj-1;
   else ij=jj*bop_types-jj*(jj+1)/2+ii-1;
 
-  cutghost[i][j] = rcut[ij];
-  cutghost[j][i] = cutghost[i][j];
-  cutsq[i][j] = rcut[ij]*rcut[ij];
-  cutsq[j][i] = cutsq[i][j];
-  return rcut[ij];
+
+  if(rcut[ij]>rcut3[ij]) {
+    cutghost[i][j] = rcut[ij];
+    cutghost[j][i] = cutghost[i][j];
+    cutsq[i][j] = rcut[ij]*rcut[ij];
+    cutsq[j][i] = cutsq[i][j];
+    return rcut[ij];
+  } else {
+    cutghost[i][j] = rcut3[ij];
+    cutghost[j][i] = cutghost[i][j];
+    cutsq[i][j] = rcut3[ij]*rcut3[ij];
+    cutsq[j][i] = cutsq[i][j];
+    return rcut3[ij];
+  }
 }
 
 /* ----------------------------------------------------------------------
@@ -654,59 +701,315 @@ double PairBOP::init_one(int i, int j)
 void PairBOP::gneigh()
 {
   int i,ii;
+  int j,k,jj,kk;
+  int itype,jtype,i12;
+  int itag,jtag;
+  int temp_ij,temp_ik,temp_ijk;
+  int n,ks,max_check,neigh_t;
+  int max_check3;
+  int nlisti;
   int *ilist,*numneigh;
+  int *iilist;
+  int **firstneigh;
   int nlocal = atom->nlocal;
   int nall = nlocal + atom->nghost;
+  double dis[3],r;
+  double rj2,rk2,rsq,ps;
+  double rj1k1,rj2k2,rj2k1,rj1k2;
+  double **x = atom->x;
+  int *type = atom->type;
+  int *tag = atom->tag;
 
   if(allocate_neigh==0) {
     memory->create (BOP_index,nall,"BOP_index");
+    memory->create (BOP_index3,nall,"BOP_index3");
+    memory->create (BOP_total,nall,"BOP_total");
+    memory->create (BOP_total3,nall,"BOP_total");
     if (otfly==0) memory->create (cos_index,nall,"cos_index");
     allocate_neigh=1;
   }
   else {
     memory->grow (BOP_index,nall,"BOP_index");
+    memory->grow (BOP_index3,nall,"BOP_index3");
+    memory->grow (BOP_total,nall,"BOP_total");
+    memory->grow (BOP_total3,nall,"BOP_total3");
     if (otfly==0) memory->grow (cos_index,nall,"cos_index");
     allocate_neigh=1;
   }
   ilist = list->ilist;
   numneigh = list->numneigh;
+  firstneigh = list->firstneigh;
   if(bop_step==0) {
     maxneigh=0;
+    maxneigh3=0;
     maxnall=0;
   }
   neigh_total=0;
+  neigh_total3=0;
   cos_total=0;
   for (ii = 0; ii < nall; ii++) {
-    if (ii < nlocal) {
-      i=ilist[ii];
-      if(numneigh[i]>maxneigh) maxneigh=numneigh[i];
-    } else {
+    if(ii<nlocal)
+      i= ilist[ii];
+    else
       i=ii;
-      if(numneigh[i]>maxneigh) maxneigh=numneigh[i];
+    itype = map[type[i]]+1;
+
+    iilist=firstneigh[i];
+    max_check=0;
+    max_check3=0;
+    for(jj=0;jj<numneigh[i];jj++) {
+      j=iilist[jj];
+      jtype = map[type[j]]+1;
+      if(itype==jtype)
+        i12=itype-1;
+      else if(itype<jtype)
+        i12=itype*bop_types-itype*(itype+1)/2+jtype-1;
+      else
+        i12=jtype*bop_types-jtype*(jtype+1)/2+itype-1;
+      if(i12>=npairs) {
+        error->one(FLERR,"Too many atom pairs for pair bop");
+      }
+      dis[0]=x[j][0]-x[i][0];
+      dis[1]=x[j][1]-x[i][1];
+      dis[2]=x[j][2]-x[i][2];
+      rsq=dis[0]*dis[0]
+          +dis[1]*dis[1]
+          +dis[2]*dis[2];
+      r=sqrt(rsq);
+      if(r<=rcut[i12]) {
+        max_check++;
+      }
+      if(r<=rcut3[i12]) {
+        max_check3++;
+      }
     }
+ 
     BOP_index[i]=neigh_total;
-    neigh_total+=numneigh[i];
+    BOP_index3[i]=neigh_total3;
+    BOP_total[i]=max_check;
+    BOP_total3[i]=max_check3;
+    neigh_total+=max_check;
+    neigh_total3+=max_check3;
+    
+    if(max_check>maxneigh||max_check3>maxneigh3){
+       maxneigh=max_check;
+       maxneigh3=max_check3;
+    }
     if(otfly==0) {
       cos_index[i]=cos_total;
-      cos_total+=numneigh[i]*(numneigh[i]-1)/2;
+      cos_total+=max_check*(max_check-1)/2;
     }
   }
   maxnall=nall;
+    if(update_list!=0)
+      memory_theta_grow();
+    else
+      memory_theta_create();
+    neigh_t=0;
+    for (ii = 0; ii < nall; ii++) {
+      if(ii<nlocal)
+        i= ilist[ii];
+      else
+        i=ii;
+      itype = map[type[i]]+1;
+      itag=tag[i];
+      iilist=firstneigh[i];
+      max_check=0;
+      max_check3=0;
+      for(jj=0;jj<numneigh[i];jj++) {
+        j=iilist[jj];
+        jtag=tag[j];
+        jtype = map[type[j]]+1;
+        if(itype==jtype)
+          i12=itype-1;
+        else if(itype<jtype)
+          i12=itype*bop_types-itype*(itype+1)/2+jtype-1;
+        else
+          i12=jtype*bop_types-jtype*(jtype+1)/2+itype-1;
+        if(i12>=npairs) {
+          error->one(FLERR,"Too many atom pairs for pair bop");
+        }
+        dis[0]=x[j][0]-x[i][0];
+        dis[1]=x[j][1]-x[i][1];
+        dis[2]=x[j][2]-x[i][2];
+        rsq=dis[0]*dis[0]
+            +dis[1]*dis[1]
+            +dis[2]*dis[2];
+        r=sqrt(rsq);
+        if(r<=rcut[i12]) {
+          temp_ij=BOP_index[i]+max_check;
+          if(i==0) {
+          }
+          neigh_index[temp_ij]=jj;
+          neigh_flag[temp_ij]=1;
+          max_check++;
+        }
+        if(r<=rcut3[i12]) {
+          temp_ij=BOP_index3[i]+max_check3;
+          neigh_index3[temp_ij]=jj;
+          neigh_flag3[temp_ij]=1;
+          max_check3++;
+        }
+      }
+    }
+  if(otfly==0) {
+    for (ii = 0; ii < nall; ii++) {
+      if(ii<nlocal)
+        i= ilist[ii];
+      else
+        i=ii;
+      itype = map[type[i]]+1;
+
+      iilist=firstneigh[i];
+      nlisti=BOP_total[i];
+      itag=tag[i];
+      max_check=0;
+      for(jj=0;jj<nlisti;jj++) {
+        temp_ij=BOP_index[i]+jj;
+        j=iilist[neigh_index[temp_ij]];
+        jtag=tag[j];
+        if(temp_ij>=neigh_total) {
+        }
+        if(temp_ij<0) {
+        }
+        jtype = map[type[j]]+1;
+        if(itype==jtype)
+          i12=itype-1;
+        else if(itype<jtype)
+          i12=itype*bop_types-itype*(itype+1)/2+jtype-1;
+        else
+          i12=jtype*bop_types-jtype*(jtype+1)/2+itype-1;
+        if(i12>=npairs) {
+          error->one(FLERR,"Too many atom pairs for pair bop");
+        }
+        disij[0][temp_ij]=x[j][0]-x[i][0];
+        disij[1][temp_ij]=x[j][1]-x[i][1];
+        disij[2][temp_ij]=x[j][2]-x[i][2];
+        rsq=disij[0][temp_ij]*disij[0][temp_ij]
+            +disij[1][temp_ij]*disij[1][temp_ij]
+            +disij[2][temp_ij]*disij[2][temp_ij];
+        rij[temp_ij]=sqrt(rsq);
+        if(rij[temp_ij]<=rcut[i12]) {
+          max_check++;
+        }
+        else
+          neigh_flag[temp_ij]=0;
+      }
+    }
+    neigh_t+=max_check;
+    for (ii = 0; ii < nall; ii++) {
+      if(ii<nlocal)
+        i= ilist[ii];
+      else
+        i=ii;
+      itype = map[type[i]]+1;
+
+      iilist=firstneigh[i];
+      nlisti=BOP_total[i];
+      for(jj=0;jj<nlisti;jj++) {
+        temp_ij=BOP_index[i]+jj;
+        j=iilist[neigh_index[temp_ij]];
+          
+        jtype = map[type[j]]+1;
+  
+        if(itype==jtype)
+          i12=itype-1;
+        else if(itype<jtype)
+          i12=itype*bop_types-itype*(itype+1)/2+jtype-1;
+        else
+          i12=jtype*bop_types-jtype*(jtype+1)/2+itype-1;
+        if(i12>=npairs) {
+          error->one(FLERR,"Too many atom pairs for pair bop");
+        }
+        ps=rij[temp_ij];
+        ps=rdr[i12];
+        ps=pBetaS1[i12][ks-1];
+        ps=pBetaS[i12][ks-1];
+        ps=rij[temp_ij]*rdr[i12]+1.0;
+        ks=(int)ps;
+        if(nr-1<ks)
+          ks=nr-1;
+        ps=ps-ks;
+        if(ps>1.0)
+          ps=1.0;
+        betaS[temp_ij]=((pBetaS3[i12][ks-1]*ps+pBetaS2[i12][ks-1])*ps+pBetaS1[i12][ks-1])*ps+pBetaS[i12][ks-1];
+        dBetaS[temp_ij]=(pBetaS6[i12][ks-1]*ps+pBetaS5[i12][ks-1])*ps
+            +pBetaS4[i12][ks-1];
+        betaP[temp_ij]=((pBetaP3[i12][ks-1]*ps+pBetaP2[i12][ks-1])*ps
+            +pBetaP1[i12][ks-1])*ps+pBetaP[i12][ks-1];
+        dBetaP[temp_ij]=(pBetaP6[i12][ks-1]*ps+pBetaP5[i12][ks-1])*ps
+            +pBetaP4[i12][ks-1];
+        repul[temp_ij]=((pRepul3[i12][ks-1]*ps+pRepul2[i12][ks-1])*ps
+            +pRepul1[i12][ks-1])*ps+pRepul[i12][ks-1];
+        dRepul[temp_ij]=(pRepul6[i12][ks-1]*ps+pRepul5[i12][ks-1])*ps
+            +pRepul4[i12][ks-1];
+      }
+    }
+    for (ii = 0; ii < nall; ii++) {
+      n=0;
+      if(ii<nlocal)
+        i= ilist[ii];
+      else
+        i=ii;
+      iilist=firstneigh[i];
+      nlisti=BOP_total[i];
+      for(jj=0;jj<nlisti;jj++) {
+        temp_ij=BOP_index[i]+jj;
+        j=iilist[neigh_index[temp_ij]];
+        rj2=rij[temp_ij]*rij[temp_ij];
+        for(kk=jj+1;kk<nlisti;kk++) {
+          if(cos_index[i]+n>=cos_total) {
+            error->one(FLERR,"Too many atom triplets for pair bop");
+          }
+          temp_ik=BOP_index[i]+kk;
+          temp_ijk=cos_index[i]+n;
+          if(temp_ijk>=cos_total) {
+            error->one(FLERR,"Too many atom triplets for pair bop");
+          }
+          rk2=rij[temp_ik]*rij[temp_ik];
+          rj1k1=rij[temp_ij]*rij[temp_ik];
+          rj2k2=rj1k1*rj1k1;
+          rj2k1=rj1k1*rij[temp_ij];
+          rj1k2=rj1k1*rij[temp_ik];
+          if(temp_ijk>=cos_total) {
+            error->one(FLERR,"Too many atom triplets for pair bop");
+          }
+          cosAng[temp_ijk]=(disij[0][temp_ij]*disij[0][temp_ik]+disij[1][temp_ij]
+              *disij[1][temp_ik]+disij[2][temp_ij]*disij[2][temp_ik])/rj1k1;
+          dcAng[temp_ijk][0][0]=(disij[0][temp_ik]*rj1k1-cosAng[temp_ijk]
+              *disij[0][temp_ij]*rk2)/(rj2k2);
+          dcAng[temp_ijk][1][0]=(disij[1][temp_ik]*rj1k1-cosAng[temp_ijk]
+              *disij[1][temp_ij]*rk2)/(rj2k2);
+          dcAng[temp_ijk][2][0]=(disij[2][temp_ik]*rj1k1-cosAng[temp_ijk]
+              *disij[2][temp_ij]*rk2)/(rj2k2);
+          dcAng[temp_ijk][0][1]=(disij[0][temp_ij]*rj1k1-cosAng[temp_ijk]
+              *disij[0][temp_ik]*rj2)/(rj2k2);
+          dcAng[temp_ijk][1][1]=(disij[1][temp_ij]*rj1k1-cosAng[temp_ijk]
+              *disij[1][temp_ik]*rj2)/(rj2k2);
+          dcAng[temp_ijk][2][1]=(disij[2][temp_ij]*rj1k1-cosAng[temp_ijk]
+              *disij[2][temp_ik]*rj2)/(rj2k2);
+          n++;
+        }
+      }
+    }
+  }
 }
 
 /* ---------------------------------------------------------------------- */
 
 void PairBOP::theta()
 {
-  int i,j,ii,jj,kk;
+  int i,j,k,ii,jj,kk;
   int itype,jtype,i12;
   int temp_ij,temp_ik,temp_ijk;
   int n,nlocal,nall,ks;
+  int nlisti;
   int *ilist,*numneigh;
   int *iilist;
   int **firstneigh;
+  int maxn,maxt;
   double rj2,rk2,rsq,ps;
-  double rj1k1,rj2k2;
+  double rj1k1,rj2k2,rj2k1,rj1k2;
   double **x = atom->x;
   int *type = atom->type;
 
@@ -727,11 +1030,13 @@ void PairBOP::theta()
     itype = map[type[i]]+1;
 
     iilist=firstneigh[i];
-    for(jj=0;jj<numneigh[i];jj++) {
-      j=iilist[jj];
+    maxt=0;
+    maxn=0;
+    nlisti=BOP_total[i];
+    for(jj=0;jj<nlisti;jj++) {
       temp_ij=BOP_index[i]+jj;
+      j=iilist[neigh_index[temp_ij]];
       jtype = map[type[j]]+1;
-
       if(itype==jtype)
         i12=itype-1;
       else if(itype<jtype)
@@ -748,20 +1053,28 @@ void PairBOP::theta()
           +disij[1][temp_ij]*disij[1][temp_ij]
           +disij[2][temp_ij]*disij[2][temp_ij];
       rij[temp_ij]=sqrt(rsq);
-      if(rij[temp_ij]<=rcut[i12])
+      if(rij[temp_ij]<=rcut[i12]) {
         neigh_flag[temp_ij]=1;
+        maxt++;
+      }
       else
         neigh_flag[temp_ij]=0;
+      if(rij[temp_ij]<=rcut3[i12])
+        neigh_flag3[temp_ij]=1;
+      else
+        neigh_flag3[temp_ij]=0;
+      ps=rij[temp_ij];
+      ps=rdr[i12];
+      ps=pBetaS1[i12][ks-1];
+      ps=pBetaS[i12][ks-1];
       ps=rij[temp_ij]*rdr[i12]+1.0;
       ks=(int)ps;
-
       if(nr-1<ks)
         ks=nr-1;
       ps=ps-ks;
       if(ps>1.0)
         ps=1.0;
-      betaS[temp_ij]=((pBetaS3[i12][ks-1]*ps+pBetaS2[i12][ks-1])*ps
-          +pBetaS1[i12][ks-1])*ps+pBetaS[i12][ks-1];
+      betaS[temp_ij]=((pBetaS3[i12][ks-1]*ps+pBetaS2[i12][ks-1])*ps+pBetaS1[i12][ks-1])*ps+pBetaS[i12][ks-1];
       dBetaS[temp_ij]=(pBetaS6[i12][ks-1]*ps+pBetaS5[i12][ks-1])*ps
           +pBetaS4[i12][ks-1];
       betaP[temp_ij]=((pBetaP3[i12][ks-1]*ps+pBetaP2[i12][ks-1])*ps
@@ -773,6 +1086,7 @@ void PairBOP::theta()
       dRepul[temp_ij]=(pRepul6[i12][ks-1]*ps+pRepul5[i12][ks-1])*ps
           +pRepul4[i12][ks-1];
     }
+    if(maxt>maxn) maxn=maxt;
   }
   for (ii = 0; ii < nall; ii++) {
     n=0;
@@ -781,11 +1095,12 @@ void PairBOP::theta()
     else
       i=ii;
     iilist=firstneigh[i];
-    for(jj=0;jj<numneigh[i];jj++) {
-      j=iilist[jj];
+    nlisti=BOP_total[i];
+    for(jj=0;jj<nlisti;jj++) {
       temp_ij=BOP_index[i]+jj;
+      j=iilist[neigh_index[temp_ij]];
       rj2=rij[temp_ij]*rij[temp_ij];
-      for(kk=jj+1;kk<numneigh[i];kk++) {
+      for(kk=jj+1;kk<nlisti;kk++) {
         if(cos_index[i]+n>=cos_total) {
           error->one(FLERR,"Too many atom triplets for pair bop");
         }
@@ -797,6 +1112,9 @@ void PairBOP::theta()
         rk2=rij[temp_ik]*rij[temp_ik];
         rj1k1=rij[temp_ij]*rij[temp_ik];
         rj2k2=rj1k1*rj1k1;
+        rj2k1=rj1k1*rij[temp_ij];
+        rj1k2=rj1k1*rij[temp_ik];
+        k=iilist[kk];
         if(temp_ijk>=cos_total) {
           error->one(FLERR,"Too many atom triplets for pair bop");
         }
@@ -835,42 +1153,62 @@ void PairBOP::theta_mod()
 /*  The formulation differs slightly to avoid negative square roots
     in the calculation of Sigma^(1/2) of (a) Eq. 6 and (b) Eq. 11 */
 
-void PairBOP::sigmaBo()
+/* ---------------------------------------------------------------------- */
+
+/*  The formulation differs slightly to avoid negative square roots
+    in the calculation of Theta_pi,ij of (a) Eq. 36 and (b) Eq. 18 */
+
+double PairBOP::sigmaBo(int itmp, int jtmp)
 {
   int nb_t,new_n_tot;
-  int n,i,j,k,kp,m,pp,kkp;
-  int iij,ji,ki;
-  int itmp,jtmp,ktmp,ltmp,mtmp;
-  tagint i_tag,j_tag;
-  int ngi,ngj,ngk,nglkp,ngli,nglj,ngl;
-  int ngji,ngjk,nikj,ngki,ngkj,ngjkp;
-  int ngkpk,ngkpj,ngkkp,nglk;
-  int njik,nijk,nikkp,nkp,nijkp;
-  int nkikp,njikp,nk0;
-  int njkpk,nkjkp,njkkp;
+  int n,i,j,k,kp,m,pp,kpj,kpk,kkp;
+  int ktmp,ltmp,mtmp;
+  int i_tag,j_tag;
+  int kp1,kp2,kp1type;
+  int iij,iik,ijk,ikkp,ji,iikp,ijkp;
+  int nkp,nk0;
   int jNeik,kNeii,kNeij,kNeikp;
-  int kpNeij,kpNeik;
+  int kpNeij,kpNeik,lp1;
   int new1,new2,nlocal;
   int inum,*ilist,*iilist,*jlist,*klist,*kplist;
   int **firstneigh,*numneigh;
-  int temp_ji,temp_ikp,temp_kkp;
   int temp_ij,temp_ik,temp_jkp,temp_kk,temp_jk;
-  int ang_ijkp,ang_ikkp,ang_jkpk,ang_kjkp;
-  int ang_ijk,ang_ikj,ang_jikp,ang_jkkp;
-  int ang_jik,ang_kikp;
+  int temp_ji,temp_kpj,temp_kkp;
+  int temp_ikp,temp_kpk;
   int nb_ij,nb_ik,nb_ikp;
   int nb_jk,nb_jkp,nb_kkp;
-  int nsearch;
+  int kp_nsearch,nsearch;
   int sig_flag,setting,ncmp,ks;
   int itype,jtype,ktype,kptype;
-  int bt_i,bt_j,bt_ij;
-  int kp_index,same_ikp,same_jkp;
-  int same_kkp;
+  int bt_i,bt_j;
+  int same_ikp,same_jkp,same_kpk;
+  int same_jkpj,same_kkpk;
+  int pass_ij,pass_ik,pass_jk;
+  int pass_jkp,pass_ikp,pass_kkp;
+  int njik,ngj,ngk;
+  int nijk,ngji,ngjk;
+  int nikj,ngki,ngkj;
+  int njikp,nglj,ngl;
+  int nkikp,nglk,nglkp;
+  int nikkp,ngli,nijkp;
+  int ngkkp,njkpk,ngkpj;
+  int ngjkp,ngkpk,ngi;
+  int nkjkp,njkkp;
+  int ang_ijk,ang_jik,ang_ikj;
+  int ang_jikp,ang_kikp,ang_ikkp;
+  int ang_ijkp,ang_jkpk,ang_kjkp;
+  int ang_jkkp;
+  int ni_ij,ni_ji,ni_ik;
+  int ni_jk,ni_ikN,ni_kj;
+  int ni_jkp,ni_kpj,ni_ikp,ni_kkp;
+  int ni_kpk,ni_kpnsearch;
+  int temp_ikN,temp_kj;
+  int nlisti,nlistj,nlistk,nlistkp;
   double AA,BB,CC,DD,EE,EE1,FF;
   double AAC,BBC,CCC,DDC,EEC,FFC,GGC;
   double AACFF,UT,bndtmp,UTcom;
   double amean,gmean0,gmean1,gmean2,ps;
-  double gfactor1,gprime1,gsqprime;
+  double gfactor1,gprime1,gsqprime,factorsq;
   double gfactorsq,gfactor2,gprime2;
   double gfactorsq2,gsqprime2;
   double gfactor3,gprime3,gfactor,rfactor;
@@ -878,478 +1216,951 @@ void PairBOP::sigmaBo()
   double rfactor0,rfactorrt,rfactor1rt,rfactor1;
   double rcm1,rcm2,gcm1,gcm2,gcm3;
   double agpdpr1,agpdpr2,app1,app2,app3,app4;
-  double dsigB1,dsigB2;
+  double dsigB1,dsigB2,xrun;
   double part0,part1,part2,part3,part4;
   double psign,bndtmp0,pp1;
   double bndtmp1,bndtmp2,bndtmp3,bndtmp4,bndtmp5;
-  double ftmp[3];
+  double dis_ij[3],rsq_ij,r_ij;
+  double betaS_ij,dBetaS_ij;
+  double betaP_ij,dBetaP_ij;
+  double dis_ik[3],rsq_ik,r_ik;
+  double betaS_ik,dBetaS_ik;
+  double betaP_ik,dBetaP_ik;
+  double dis_ikp[3],rsq_ikp,r_ikp;
+  double betaS_ikp,dBetaS_ikp;
+  double betaP_ikp,dBetaP_ikp;
+  double dis_jk[3],rsq_jk,r_jk;
+  double betaS_jk,dBetaS_jk;
+  double betaP_jk,dBetaP_jk;
+  double dis_jkp[3],rsq_jkp,r_jkp;
+  double betaS_jkp,dBetaS_jkp;
+  double betaP_jkp,dBetaP_jkp;
+  double dis_kkp[3],rsq_kkp,r_kkp;
+  double betaS_kkp,dBetaS_kkp;
+  double betaP_kkp,dBetaP_kkp;
+  double cosAng_jik,dcA_jik[3][2];
+  double cosAng_jikp,dcA_jikp[3][2];
+  double cosAng_kikp,dcA_kikp[3][2];
+  double cosAng_ijk,dcA_ijk[3][2];
+  double cosAng_ijkp,dcA_ijkp[3][2];
+  double cosAng_kjkp,dcA_kjkp[3][2];
+  double cosAng_ikj,dcA_ikj[3][2];
+  double cosAng_ikkp,dcA_ikkp[3][2];
+  double cosAng_jkkp,dcA_jkkp[3][2];
+  double cosAng_jkpk,dcA_jkpk[3][2];
+  double tt1,tt2,tt3,tt4;
+
+  double ftmp[3],xtmp[3];
   double **x = atom->x;
   double **f = atom->f;
-  tagint *tag = atom->tag;
+  int *tag = atom->tag;
   int newton_pair = force->newton_pair;
   int *type = atom->type;
-
+  int timestep=update->ntimestep;
   nlocal = atom->nlocal;
-  firstneigh = list->firstneigh;
-  numneigh = list->numneigh;
+  int nall = nlocal + atom->nghost;
   inum = list->inum;
   ilist = list->ilist;
+  numneigh = list->numneigh;
+  firstneigh = list->firstneigh;
+  MPI_Comm_rank(world,&me);
+  
   n=0;
-
-//loop over all local atoms
-
-  if(nb_sg>16) {
-    nb_sg=16;
-  }
   if(nb_sg==0) {
     nb_sg=(maxneigh)*(maxneigh/2);
   }
   if(allocate_sigma) {
     destroy_sigma();
   }
+
   create_sigma(nb_sg);
-  for(itmp=0;itmp<inum;itmp++) {
+  sigB=0;
+  if(itmp<nlocal) {
     i = ilist[itmp];
-    i_tag=tag[i];
-    itype = map[type[i]]+1;
-
-//j is loop over all neighbors of i
-
-    for(jtmp=0;jtmp<numneigh[i];jtmp++) {
-      temp_ij=BOP_index[i]+jtmp;
-      if(neigh_flag[temp_ij]) {
-        for(m=0;m<nb_sg;m++) {
-          for(pp=0;pp<3;pp++) {
-            bt_sg[m].dAA[pp]=0.0;
-            bt_sg[m].dBB[pp]=0.0;
-            bt_sg[m].dCC[pp]=0.0;
-            bt_sg[m].dDD[pp]=0.0;
-            bt_sg[m].dEE[pp]=0.0;
-            bt_sg[m].dEE1[pp]=0.0;
-            bt_sg[m].dFF[pp]=0.0;
-            bt_sg[m].dAAC[pp]=0.0;
-            bt_sg[m].dBBC[pp]=0.0;
-            bt_sg[m].dCCC[pp]=0.0;
-            bt_sg[m].dDDC[pp]=0.0;
-            bt_sg[m].dEEC[pp]=0.0;
-            bt_sg[m].dFFC[pp]=0.0;
-            bt_sg[m].dGGC[pp]=0.0;
-            bt_sg[m].dUT[pp]=0.0;
-            bt_sg[m].dSigB1[pp]=0.0;
-            bt_sg[m].dSigB[pp]=0.0;
-          }
-          bt_sg[m].i=-1;
-          bt_sg[m].j=-1;
-          bt_sg[m].temp=-1;
-        }
-        nb_t=0;
-        iilist=firstneigh[i];
-        j=iilist[jtmp];
-        jlist=firstneigh[j];
-        for(ki=0;ki<numneigh[j];ki++) {
-          if(x[jlist[ki]][0]==x[i][0]) {
-            if(x[jlist[ki]][1]==x[i][1]) {
-              if(x[jlist[ki]][2]==x[i][2]) {
-                break;
-              }
-            }
+  } else {
+    i=itmp;
+  }
+  
+  i_tag=tag[i];
+  itype = map[type[i]]+1;
+
+  for(m=0;m<nb_sg;m++) {
+    for(pp=0;pp<3;pp++) {
+      bt_sg[m].dAA[pp]=0.0;
+      bt_sg[m].dBB[pp]=0.0;
+      bt_sg[m].dCC[pp]=0.0;
+      bt_sg[m].dDD[pp]=0.0;
+      bt_sg[m].dEE[pp]=0.0;
+      bt_sg[m].dEE1[pp]=0.0;
+      bt_sg[m].dFF[pp]=0.0;
+      bt_sg[m].dAAC[pp]=0.0;
+      bt_sg[m].dBBC[pp]=0.0;
+      bt_sg[m].dCCC[pp]=0.0;
+      bt_sg[m].dDDC[pp]=0.0;
+      bt_sg[m].dEEC[pp]=0.0;
+      bt_sg[m].dFFC[pp]=0.0;
+      bt_sg[m].dGGC[pp]=0.0;
+      bt_sg[m].dUT[pp]=0.0;
+      bt_sg[m].dSigB1[pp]=0.0;
+      bt_sg[m].dSigB[pp]=0.0;
+    }
+    bt_sg[m].i=-1;
+    bt_sg[m].j=-1;
+    bt_sg[m].temp=-1;
+  }
+  nb_t=0;
+  iilist=firstneigh[i];
+  temp_ij=BOP_index[i]+jtmp;
+  ni_ij=neigh_index[temp_ij];
+  j=iilist[ni_ij];
+  jlist=firstneigh[j];
+  j_tag=tag[j];
+  jtype = map[type[j]]+1;
+  nb_ij=nb_t;
+  nb_t++;
+  if(nb_t>nb_sg) {
+    new_n_tot=nb_sg+maxneigh;
+    grow_sigma(nb_sg,new_n_tot);
+    nb_sg=new_n_tot;
+  }
+  bt_sg[nb_ij].temp=temp_ij;
+  bt_sg[nb_ij].i=i;
+  bt_sg[nb_ij].j=j;
+  if(j_tag>=i_tag) {
+    if(itype==jtype)
+      iij=itype-1;
+    else if(itype<jtype)
+      iij=itype*bop_types-itype*(itype+1)/2+jtype-1;
+    else
+      iij=jtype*bop_types-jtype*(jtype+1)/2+itype-1;
+    nlistj=BOP_total[j];
+    for(ji=0;ji<nlistj;ji++) {
+      temp_ji=BOP_index[j]+ji;
+      ni_ji=neigh_index[temp_ji];
+      if(x[jlist[ni_ji]][0]==x[i][0]) {
+        if(x[jlist[ni_ji]][1]==x[i][1]) {
+          if(x[jlist[ni_ji]][2]==x[i][2]) {
+            break;
           }
         }
-        j_tag=tag[j];
-        jtype = map[type[j]]+1;
-        nb_ij=nb_t;
-        nb_t++;
-        if(nb_t>nb_sg) {
-          new_n_tot=nb_sg+maxneigh;
-          grow_sigma(nb_sg,new_n_tot);
-          nb_sg=new_n_tot;
-        }
-        bt_sg[nb_ij].temp=temp_ij;
-        bt_sg[nb_ij].i=i;
-        bt_sg[nb_ij].j=j;
-        if(j_tag>=i_tag) {
-          if(itype==jtype)
-            iij=itype-1;
-          else if(itype<jtype)
-            iij=itype*bop_types-itype*(itype+1)/2+jtype-1;
-          else
-            iij=jtype*bop_types-jtype*(jtype+1)/2+itype-1;
-          for(ji=0;ji<numneigh[j];ji++) {
-            temp_ji=BOP_index[j]+ji;
-            if(x[jlist[ji]][0]==x[i][0]) {
-              if(x[jlist[ji]][1]==x[i][1]) {
-                if(x[jlist[ji]][2]==x[i][2]) {
-                  break;
-                }
-              }
-            }
-          }
-          nSigBk[n]=0;
+      }
+    }
+    pass_ij=0;
+    if(otfly==1) {
+      dis_ij[0]=x[j][0]-x[i][0];
+      dis_ij[1]=x[j][1]-x[i][1];
+      dis_ij[2]=x[j][2]-x[i][2];
+      rsq_ij=dis_ij[0]*dis_ij[0]
+          +dis_ij[1]*dis_ij[1]
+          +dis_ij[2]*dis_ij[2];
+      r_ij=sqrt(rsq_ij);
+      if(r_ij<rcut[iij]) {
+        pass_ij=1;
+        ps=r_ij*rdr[iij]+1.0;
+        ks=(int)ps;
+        if(nr-1<ks)
+          ks=nr-1;
+        ps=ps-ks;
+        if(ps>1.0)
+          ps=1.0;
+        betaS_ij=((pBetaS3[iij][ks-1]*ps+pBetaS2[iij][ks-1])*ps
+            +pBetaS1[iij][ks-1])*ps+pBetaS[iij][ks-1];
+        dBetaS_ij=(pBetaS6[iij][ks-1]*ps+pBetaS5[iij][ks-1])*ps
+            +pBetaS4[iij][ks-1];
+        betaP_ij=((pBetaP3[iij][ks-1]*ps+pBetaP2[iij][ks-1])*ps
+            +pBetaP1[iij][ks-1])*ps+pBetaP[iij][ks-1];
+        dBetaP_ij=(pBetaP6[iij][ks-1]*ps+pBetaP5[iij][ks-1])*ps
+            +pBetaP4[iij][ks-1];
+      }
+    } else {
+      if(neigh_flag[temp_ij]) {
+        pass_ij=1;
+        dis_ij[0]=disij[0][temp_ij];
+        dis_ij[1]=disij[1][temp_ij];
+        dis_ij[2]=disij[2][temp_ij];
+        r_ij=rij[temp_ij];
+        betaS_ij=betaS[temp_ij];
+        dBetaS_ij=dBetaS[temp_ij];
+        betaP_ij=betaP[temp_ij];
+        dBetaP_ij=dBetaP[temp_ij];
+      }
+    }
+    if(pass_ij==1) {
+      nSigBk=0;
 
 //AA-EE1 are the components making up Eq. 30 (a)
 
-          AA=0.0;
-          BB=0.0;
-          CC=0.0;
-          DD=0.0;
-          EE=0.0;
-          EE1=0.0;
+      AA=0.0;
+      BB=0.0;
+      CC=0.0;
+      DD=0.0;
+      EE=0.0;
+      EE1=0.0;
 
 //FF is the Beta_sigma^2 term
 
-          FF=betaS[temp_ij]*betaS[temp_ij];
+      FF=betaS_ij*betaS_ij;
 
 //agpdpr1 is derivative of FF w.r.t. r_ij
 
-          agpdpr1=2.0*betaS[temp_ij]*dBetaS[temp_ij]/rij[temp_ij];
+      agpdpr1=2.0*betaS_ij*dBetaS_ij/r_ij;
 
 //dXX derivatives are taken with respect to all pairs contributing to the energy
 //nb_ij is derivative w.r.t. ij pair
 
-          bt_sg[nb_ij].dFF[0]=agpdpr1*disij[0][temp_ij];
-          bt_sg[nb_ij].dFF[1]=agpdpr1*disij[1][temp_ij];
-          bt_sg[nb_ij].dFF[2]=agpdpr1*disij[2][temp_ij];
+      bt_sg[nb_ij].dFF[0]=agpdpr1*dis_ij[0];
+      bt_sg[nb_ij].dFF[1]=agpdpr1*dis_ij[1];
+      bt_sg[nb_ij].dFF[2]=agpdpr1*dis_ij[2];
 
 //k is loop over all neighbors of i again with j neighbor of i
 
-          for(ktmp=0;ktmp<numneigh[i];ktmp++) {
-            temp_ik=BOP_index[i]+ktmp;
-            if(neigh_flag[temp_ik]) {
-              if(ktmp!=jtmp) {
-                if(jtmp<ktmp) {
-                  njik=jtmp*(2*numneigh[i]-jtmp-1)/2+(ktmp-jtmp)-1;
-                  ngj=0;
-                  ngk=1;
-                }
-                else {
-                  njik=ktmp*(2*numneigh[i]-ktmp-1)/2+(jtmp-ktmp)-1;
-                  ngj=1;
-                  ngk=0;
-                }
-                k=iilist[ktmp];
-                ktype = map[type[k]]+1;
+      nlisti=BOP_total[i];
+      for(ktmp=0;ktmp<nlisti;ktmp++) {
+        temp_ik=BOP_index[i]+ktmp;
+        ni_ik=neigh_index[temp_ik];
+        if(ktmp!=jtmp) {
+          k=iilist[ni_ik];
+          klist=firstneigh[k];
+          ktype = map[type[k]]+1;
+          if(itype==ktype)
+            iik=itype-1;
+          else if(itype<ktype)
+            iik=itype*bop_types-itype*(itype+1)/2+ktype-1;
+          else
+            iik=ktype*bop_types-ktype*(ktype+1)/2+itype-1;
 
 //find neighbor of k that is equal to i
 
-                klist=firstneigh[k];
-                for(kNeii=0;kNeii<numneigh[k];kNeii++) {
-                  if(x[klist[kNeii]][0]==x[i][0]) {
-                    if(x[klist[kNeii]][1]==x[i][1]) {
-                      if(x[klist[kNeii]][2]==x[i][2]) {
-                        break;
-                      }
-                    }
-                  }
+          nlistk=BOP_total[k];
+          for(kNeii=0;kNeii<nlistk;kNeii++) {
+            temp_ikN=BOP_index[k]+kNeii;
+            ni_ikN=neigh_index[temp_ikN];
+            if(x[klist[ni_ikN]][0]==x[i][0]) {
+              if(x[klist[ni_ikN]][1]==x[i][1]) {
+                if(x[klist[ni_ikN]][2]==x[i][2]) {
+                  break;
                 }
+              }
+            }
+          }
+          pass_ik=0;
+          if(otfly==1) {
+            dis_ik[0]=x[k][0]-x[i][0];
+            dis_ik[1]=x[k][1]-x[i][1];
+            dis_ik[2]=x[k][2]-x[i][2];
+            rsq_ik=dis_ik[0]*dis_ik[0]
+                +dis_ik[1]*dis_ik[1]
+                +dis_ik[2]*dis_ik[2];
+            r_ik=sqrt(rsq_ik);
+            if(r_ik<=rcut[iik]) {
+              pass_ik=1;
+              ps=r_ik*rdr[iik]+1.0;
+              ks=(int)ps;
+              if(nr-1<ks)
+                ks=nr-1;
+              ps=ps-ks;
+              if(ps>1.0)
+                ps=1.0;
+              betaS_ik=((pBetaS3[iik][ks-1]*ps+pBetaS2[iik][ks-1])*ps
+                  +pBetaS1[iik][ks-1])*ps+pBetaS[iik][ks-1];
+              dBetaS_ik=(pBetaS6[iik][ks-1]*ps+pBetaS5[iik][ks-1])*ps
+                  +pBetaS4[iik][ks-1];
+              betaP_ik=((pBetaP3[iik][ks-1]*ps+pBetaP2[iik][ks-1])*ps
+                  +pBetaP1[iik][ks-1])*ps+pBetaP[iik][ks-1];
+              dBetaP_ik=(pBetaP6[iik][ks-1]*ps+pBetaP5[iik][ks-1])*ps
+                  +pBetaP4[iik][ks-1];
+            }
+          } else {
+            if(neigh_flag[temp_ik]) {
+              pass_ik=1;
+              dis_ik[0]=disij[0][temp_ik];
+              dis_ik[1]=disij[1][temp_ik];
+              dis_ik[2]=disij[2][temp_ik];
+              r_ik=rij[temp_ik];
+              betaS_ik=betaS[temp_ik];
+              dBetaS_ik=dBetaS[temp_ik];
+              betaP_ik=betaP[temp_ik];
+              dBetaP_ik=dBetaP[temp_ik];
+            }
+          }
+          if(pass_ik==1) {
 
 //find neighbor of i that is equal to k
 
-                for(jNeik=0;jNeik<numneigh[j];jNeik++) {
-                  temp_jk=BOP_index[j]+jNeik;
-                  if(x[jlist[jNeik]][0]==x[k][0]) {
-                    if(x[jlist[jNeik]][1]==x[k][1]) {
-                      if(x[jlist[jNeik]][2]==x[k][2]) {
-                        break;
-                      }
-                    }
+            nlistj=BOP_total[j];
+            for(jNeik=0;jNeik<nlistj;jNeik++) {
+              temp_jk=BOP_index[j]+jNeik;
+              ni_jk=neigh_index[temp_jk];
+              if(x[jlist[ni_jk]][0]==x[k][0]) {
+                if(x[jlist[ni_jk]][1]==x[k][1]) {
+                  if(x[jlist[ni_jk]][2]==x[k][2]) {
+                    break;
                   }
                 }
+              }
+            }
 
 //find neighbor of k that is equal to j
 
-                for(kNeij=0;kNeij<numneigh[k];kNeij++) {
-                  if(x[klist[kNeij]][0]==x[j][0]) {
-                    if(x[klist[kNeij]][1]==x[j][1]) {
-                      if(x[klist[kNeij]][2]==x[j][2]) {
-                        break;
-                      }
-                    }
+            for(kNeij=0;kNeij<nlistk;kNeij++) {
+              temp_kj=BOP_index[k]+kNeij;
+              ni_kj=neigh_index[temp_kj];
+              if(x[klist[ni_kj]][0]==x[j][0]) {
+                if(x[klist[ni_kj]][1]==x[j][1]) {
+                  if(x[klist[ni_kj]][2]==x[j][2]) {
+                    break;
                   }
                 }
-                sig_flag=0;
-                for(nsearch=0;nsearch<nSigBk[n];nsearch++) {
-                  ncmp=itypeSigBk[n][nsearch];
-                  if(x[ncmp][0]==x[k][0]) {
-                    if(x[ncmp][1]==x[k][1]) {
-                      if(x[ncmp][2]==x[k][2]) {
-                        nk0=nsearch;
-                        sig_flag=1;
-                        break;
-                      }
-                    }
+              }
+            }
+            pass_jk=0;
+            if(otfly==1) {
+              dis_jk[0]=x[k][0]-x[j][0];
+              dis_jk[1]=x[k][1]-x[j][1];
+              dis_jk[2]=x[k][2]-x[j][2];
+              rsq_jk=dis_jk[0]*dis_jk[0]
+                  +dis_jk[1]*dis_jk[1]
+                  +dis_jk[2]*dis_jk[2];
+              r_jk=sqrt(rsq_jk);
+            } else {
+              if(neigh_flag[temp_jk]) {
+                pass_jk=1;
+                dis_jk[0]=disij[0][temp_jk];
+                dis_jk[1]=disij[1][temp_jk];
+                dis_jk[2]=disij[2][temp_jk];
+                r_jk=rij[temp_jk];
+              }
+            }
+            
+            sig_flag=0;
+            for(nsearch=0;nsearch<nSigBk;nsearch++) {
+              ncmp=itypeSigBk[nsearch];
+              if(x[ncmp][0]==x[k][0]) {
+                if(x[ncmp][1]==x[k][1]) {
+                  if(x[ncmp][2]==x[k][2]) {
+                    nk0=nsearch;
+                    sig_flag=1;
+                    break;
                   }
                 }
-                if(sig_flag==0) {
-                  nSigBk[n]=nSigBk[n]+1;
-                  nk0=nSigBk[n]-1;
-                  itypeSigBk[n][nk0]=k;
-                }
-                nb_ik=nb_t;
-                nb_t++;
-                if(nb_t>nb_sg) {
-                  new_n_tot=nb_sg+maxneigh;
-                  grow_sigma(nb_sg,new_n_tot);
-                  nb_sg=new_n_tot;
+              }
+            }
+            if(sig_flag==0) {
+              nSigBk=nSigBk+1;
+              nk0=nSigBk-1;
+              itypeSigBk[nk0]=k;
+            }
+            nb_ik=nb_t;
+            nb_t++;
+            if(nb_t>nb_sg) {
+              new_n_tot=nb_sg+maxneigh;
+              grow_sigma(nb_sg,new_n_tot);
+              nb_sg=new_n_tot;
+            }
+            bt_sg[nb_ik].temp=temp_ik;
+            bt_sg[nb_ik].i=i;
+            bt_sg[nb_ik].j=k;
+            nb_jk=nb_t;
+            nb_t++;
+            if(nb_t>nb_sg) {
+              new_n_tot=nb_sg+maxneigh;
+              grow_sigma(nb_sg,new_n_tot);
+              nb_sg=new_n_tot;
+            }
+            bt_sg[nb_jk].temp=temp_jk;
+            bt_sg[nb_jk].i=j;
+            bt_sg[nb_jk].j=k;
+            if(otfly==1) {
+              cosAng_jik=(dis_ij[0]*dis_ik[0]+dis_ij[1]*dis_ik[1]
+                  +dis_ij[2]*dis_ik[2])/(r_ij*r_ik);
+              dcA_jik[0][0]=(dis_ik[0]*r_ij*r_ik-cosAng_jik
+                  *dis_ij[0]*r_ik*r_ik)/(r_ij*r_ij*r_ik*r_ik);
+              dcA_jik[1][0]=(dis_ik[1]*r_ij*r_ik-cosAng_jik
+                  *dis_ij[1]*r_ik*r_ik)/(r_ij*r_ij*r_ik*r_ik);
+              dcA_jik[2][0]=(dis_ik[2]*r_ij*r_ik-cosAng_jik
+                  *dis_ij[2]*r_ik*r_ik)/(r_ij*r_ij*r_ik*r_ik);
+
+              dcA_jik[0][1]=(dis_ij[0]*r_ij*r_ik-cosAng_jik
+                  *dis_ik[0]*r_ij*r_ij)/(r_ij*r_ij*r_ik*r_ik);
+              dcA_jik[1][1]=(dis_ij[1]*r_ij*r_ik-cosAng_jik
+                  *dis_ik[1]*r_ij*r_ij)/(r_ij*r_ij*r_ik*r_ik);
+              dcA_jik[2][1]=(dis_ij[2]*r_ij*r_ik-cosAng_jik
+                  *dis_ik[2]*r_ij*r_ij)/(r_ij*r_ij*r_ik*r_ik);
+            } else {
+              if(ktmp!=jtmp) {
+                if(jtmp<ktmp) {
+                  njik=jtmp*(2*nlisti-jtmp-1)/2+(ktmp-jtmp)-1;
+                  ngj=0;
+                  ngk=1;
                 }
-                bt_sg[nb_ik].temp=temp_ik;
-                bt_sg[nb_ik].i=i;
-                bt_sg[nb_ik].j=k;
-                nb_jk=nb_t;
-                nb_t++;
-                if(nb_t>nb_sg) {
-                  new_n_tot=nb_sg+maxneigh;
-                  grow_sigma(nb_sg,new_n_tot);
-                  nb_sg=new_n_tot;
+                else {
+                  njik=ktmp*(2*nlisti-ktmp-1)/2+(jtmp-ktmp)-1;
+                  ngj=1;
+                  ngk=0;
                 }
-                bt_sg[nb_jk].temp=temp_jk;
-                bt_sg[nb_jk].i=j;
-                bt_sg[nb_jk].j=k;
                 ang_jik=cos_index[i]+njik;
-                gmean0=sigma_g0[jtype-1][itype-1][ktype-1];
-                gmean1=sigma_g1[jtype-1][itype-1][ktype-1];
-                gmean2=sigma_g2[jtype-1][itype-1][ktype-1];
-                amean=cosAng[ang_jik];
-                gfactor1=gmean0+gmean1*amean
-                    +gmean2*amean*amean;
-                gfactorsq=gfactor1*gfactor1;
-                gprime1=gmean1+2.0*gmean2*amean;
-                gsqprime=2.0*gfactor1*gprime1;
+                cosAng_jik=cosAng[ang_jik];
+                dcA_jik[0][0]=dcAng[ang_jik][0][ngj];
+                dcA_jik[1][0]=dcAng[ang_jik][1][ngj];
+                dcA_jik[2][0]=dcAng[ang_jik][2][ngj];
+                dcA_jik[0][1]=dcAng[ang_jik][0][ngk];
+                dcA_jik[1][1]=dcAng[ang_jik][1][ngk];
+                dcA_jik[2][1]=dcAng[ang_jik][2][ngk];
+              }
+            }
+            amean=cosAng_jik;
+            if(amean<-1.0) amean=-1.0;
+            if(npower<=2) {
+              ps=(amean-1.0)*rdtheta+1.0;
+              ks=(int)ps;
+              if(ntheta-1<ks)
+                ks=ntheta-1;
+              ps=ps-ks;
+              if(ps>1.0)
+                ps=1.0;
+              ks=ks-1;
+              gfactor1=((gfunc3[jtype][itype][ktype][ks]*ps+
+                  gfunc2[jtype][itype][ktype][ks])*ps+
+                  gfunc1[jtype][itype][ktype][ks])*ps+
+                  gfunc[jtype][itype][ktype][ks];
+              gprime1=(gfunc6[jtype][itype][ktype][ks]*ps+
+                  gfunc5[jtype][itype][ktype][ks])*ps+
+                  gfunc4[jtype][itype][ktype][ks];
+            } else {
+              gfactor1=gpara[jtype-1][itype-1][ktype-1][0];
+              gprime1=0.0;
+              xrun=1.0;
+              for(lp1=1;lp1<npower+1;lp1++) {
+                gprime1=gprime1+(double)(lp1)*xrun*gpara[jtype-1][itype-1][ktype-1][lp1];
+                xrun=xrun*amean;
+                gfactor1=gfactor1+xrun*gpara[jtype-1][itype-1][ktype-1][lp1];
+              }
+            }
+            gfactorsq=gfactor1*gfactor1;
+            gsqprime=2.0*gfactor1*gprime1;
 
 //AA is Eq. 34 (a) or Eq. 10 (c) for the i atom
 //1st CC is Eq. 11 (c) for i atom where j & k=neighbor of i
 
-                AA=AA+gfactorsq*betaS[temp_ik]*betaS[temp_ik];
-                CC=CC+gfactorsq*betaS[temp_ik]*betaS[temp_ik]*betaS[temp_ik]*betaS[temp_ik];
-
+            AA=AA+gfactorsq*betaS_ik*betaS_ik;
+            
 //agpdpr1 is derivative of AA w.r.t. Beta(rik)
-//agpdpr2 is derivative of CC 1st term w.r.t. Beta(rik)
 //app1 is derivative of AA w.r.t. cos(theta_jik)
-//app2 is derivative of CC 1st term w.r.t. cos(theta_jik)
-
-                agpdpr1=2.0*gfactorsq*betaS[temp_ik]*dBetaS[temp_ik]/rij[temp_ik];
-                agpdpr1=2.0*betaS[temp_ik]*betaS[temp_ik]*agpdpr1;
-                app1=betaS[temp_ik]*betaS[temp_ik]*gsqprime;
-                app1=betaS[temp_ik]*betaS[temp_ik]*app1;
-                bt_sg[nb_ij].dAA[0]+=
-                    app1*dcAng[ang_jik][0][ngj];
-                bt_sg[nb_ij].dAA[1]+=
-                    app1*dcAng[ang_jik][1][ngj];
-                bt_sg[nb_ij].dAA[2]+=
-                    app1*dcAng[ang_jik][2][ngj];
-                bt_sg[nb_ij].dCC[0]+=
-                    app2*dcAng[ang_jik][0][ngj];
-                bt_sg[nb_ij].dCC[1]+=
-                    app2*dcAng[ang_jik][1][ngj];
-                bt_sg[nb_ij].dCC[2]+=
-                    app2*dcAng[ang_jik][2][ngj];
-                bt_sg[nb_ik].dAA[0]+=
-                    app1*dcAng[ang_jik][0][ngk]
-                    +agpdpr1*disij[0][temp_ik];
-                bt_sg[nb_ik].dAA[1]+=
-                    app1*dcAng[ang_jik][1][ngk]
-                    +agpdpr1*disij[1][temp_ik];
-                bt_sg[nb_ik].dAA[2]+=
-                    app1*dcAng[ang_jik][2][ngk]
-                    +agpdpr1*disij[2][temp_ik];
-                bt_sg[nb_ik].dCC[0]+=
-                    app2*dcAng[ang_jik][0][ngk]
-                    +agpdpr2*disij[0][temp_ik];
-                bt_sg[nb_ik].dCC[1]+=
-                    app2*dcAng[ang_jik][1][ngk]
-                    +agpdpr2*disij[1][temp_ik];
-                bt_sg[nb_ik].dCC[2]+=
-                    app2*dcAng[ang_jik][2][ngk]
-                    +agpdpr2*disij[2][temp_ik];
+
+            agpdpr1=2.0*gfactorsq*betaS_ik*dBetaS_ik/r_ik;
+            app1=betaS_ik*betaS_ik*gsqprime;
+
+            bt_sg[nb_ij].dAA[0]+=
+                app1*dcA_jik[0][0];
+            bt_sg[nb_ij].dAA[1]+=
+                app1*dcA_jik[1][0];
+            bt_sg[nb_ij].dAA[2]+=
+                app1*dcA_jik[2][0];
+            bt_sg[nb_ik].dAA[0]+=
+                app1*dcA_jik[0][1]
+                +agpdpr1*dis_ik[0];
+            bt_sg[nb_ik].dAA[1]+=
+                app1*dcA_jik[1][1]
+                +agpdpr1*dis_ik[1];
+            bt_sg[nb_ik].dAA[2]+=
+                app1*dcA_jik[2][1]
+                +agpdpr1*dis_ik[2];
+            tt1=app1*dcA_jik[0][0]; 
+            tt2=app1*dcA_jik[0][1]+agpdpr1*dis_ik[0]; 
+
+            if(sigma_a[iij]!=0.0) {
+              CC=CC+gfactorsq*betaS_ik*betaS_ik*betaS_ik*betaS_ik;
+              agpdpr2=2.0*betaS_ik*betaS_ik*agpdpr1;
+              app2=betaS_ik*betaS_ik*app1;
+              bt_sg[nb_ij].dCC[0]+=
+                  app2*dcA_jik[0][0];
+              bt_sg[nb_ij].dCC[1]+=
+                  app2*dcA_jik[1][0];
+              bt_sg[nb_ij].dCC[2]+=
+                  app2*dcA_jik[2][0];
+              bt_sg[nb_ik].dCC[0]+=
+                  app2*dcA_jik[0][1]
+                  +agpdpr2*dis_ik[0];
+              bt_sg[nb_ik].dCC[1]+=
+                  app2*dcA_jik[1][1]
+                  +agpdpr2*dis_ik[1];
+              bt_sg[nb_ik].dCC[2]+=
+                  app2*dcA_jik[2][1]
+                  +agpdpr2*dis_ik[2];
+            }
 
 //k' is loop over neighbors all neighbors of j with k a neighbor
 //of i and j a neighbor of i and determine which k' is k
-
-                kp_index=0;
-                for(ltmp=0;ltmp<numneigh[j];ltmp++) {
-                  temp_jkp=BOP_index[j]+ltmp;
-                  kp=jlist[ltmp];
-                  if(x[kp][0]==x[k][0]) {
-                    if(x[kp][1]==x[k][1]) {
-                      if(x[kp][2]==x[k][2]) {
-                        kp_index=1;
-                        break;
-                      }
+            if(sigma_f[iij]!=0.5&&sigma_k[iij]!=0.0) {
+              same_kpk=0;
+
+              for(ltmp=0;ltmp<nlistj;ltmp++) {
+                temp_jkp=BOP_index[j]+ltmp;
+                ni_jkp=neigh_index[temp_jkp];
+                kp1=jlist[ni_jkp];
+                kp1type=map[type[kp1]]+1;
+                if(x[kp1][0]==x[k][0]) {
+                  if(x[kp1][1]==x[k][1]) {
+                    if(x[kp1][2]==x[k][2]) {
+                      same_kpk=1;
+                      break;
                     }
                   }
                 }
-                if(kp_index) {
+              }
+              if(same_kpk){
 
 //loop over neighbors of k
 
-                  for(mtmp=0;mtmp<numneigh[k];mtmp++) {
-                    kp=klist[mtmp];
-                    if(x[kp][0]==x[j][0]) {
-                      if(x[kp][1]==x[j][1]) {
-                        if(x[kp][2]==x[j][2]) {
-                          break;
-                        }
+                for(mtmp=0;mtmp<nlistk;mtmp++) {
+                  temp_kpj=BOP_index[k]+mtmp;
+                  ni_kpj=neigh_index[temp_kpj];
+                  kp2=klist[ni_kpj];
+                  if(x[kp2][0]==x[j][0]) {
+                    if(x[kp2][1]==x[j][1]) {
+                      if(x[kp2][2]==x[j][2]) {
+                        break;
                       }
                     }
                   }
-                  if(ki<ltmp) {
-                    nijk=ki*(2*numneigh[j]-ki-1)/2+(ltmp-ki)-1;
-                    ngji=0;
-                    ngjk=1;
-                  }
-                  else {
-                    nijk=ltmp*(2*numneigh[j]-ltmp-1)/2+(ki-ltmp)-1;
-                    ngji=1;
-                    ngjk=0;
+                }
+                if(jtype==ktype)
+                  ijk=jtype-1;
+                else if(jtype < ktype)
+                  ijk=jtype*bop_types-jtype*(jtype+1)/2+ktype-1;
+                else
+                  ijk=ktype*bop_types-ktype*(ktype+1)/2+jtype-1;
+                if(jtype==kp1type)
+                  ijkp=jtype-1;
+                else if(jtype<kp1type)
+                  ijkp=jtype*bop_types-jtype*(jtype+1)/2+kp1type-1;
+                else
+                  ijkp=kp1type*bop_types-kp1type*(kp1type+1)/2+jtype-1;
+                pass_jkp=0;
+                if(otfly==1) {
+                  dis_jkp[0]=x[kp1][0]-x[j][0];
+                  dis_jkp[1]=x[kp1][1]-x[j][1];
+                  dis_jkp[2]=x[kp1][2]-x[j][2];
+                  rsq_jkp=dis_jkp[0]*dis_jkp[0]
+                      +dis_jkp[1]*dis_jkp[1]
+                      +dis_jkp[2]*dis_jkp[2];
+                  r_jkp=sqrt(rsq_jkp);
+                  if(r_jkp<=rcut[ijkp]) {
+                    pass_jkp=1;
+                    ps=r_jkp*rdr[ijkp]+1.0;
+                    ks=(int)ps;
+                    if(nr-1<ks)
+                      ks=nr-1;
+                    ps=ps-ks;
+                    if(ps>1.0)
+                      ps=1.0;
+                    betaS_jkp=((pBetaS3[ijkp][ks-1]*ps+pBetaS2[ijkp][ks-1])*ps
+                        +pBetaS1[ijkp][ks-1])*ps+pBetaS[ijkp][ks-1];
+                    dBetaS_jkp=(pBetaS6[ijkp][ks-1]*ps+pBetaS5[ijkp][ks-1])*ps
+                        +pBetaS4[ijkp][ks-1];
+                    betaP_jkp=((pBetaP3[ijkp][ks-1]*ps+pBetaP2[ijkp][ks-1])*ps
+                        +pBetaP1[ijkp][ks-1])*ps+pBetaP[ijkp][ks-1];
+                    dBetaP_jkp=(pBetaP6[ijkp][ks-1]*ps+pBetaP5[ijkp][ks-1])*ps
+                        +pBetaP4[ijkp][ks-1];
+                    cosAng_ijk=(-dis_ij[0]*dis_jk[0]-dis_ij[1]*dis_jk[1]
+                        -dis_ij[2]*dis_jk[2])/(r_ij*r_jk);
+                    dcA_ijk[0][0]=(dis_jk[0]*r_ij*r_jk-cosAng_ijk
+                        *-dis_ij[0]*r_jk*r_jk)/(r_ij*r_ij*r_jk*r_jk);
+                    dcA_ijk[1][0]=(dis_jk[1]*r_ij*r_jk-cosAng_ijk
+                        *-dis_ij[1]*r_jk*r_jk)/(r_ij*r_ij*r_jk*r_jk);
+                    dcA_ijk[2][0]=(dis_jk[2]*r_ij*r_jk-cosAng_ijk
+                        *-dis_ij[2]*r_jk*r_jk)/(r_ij*r_ij*r_jk*r_jk);
+                    dcA_ijk[0][1]=(-dis_ij[0]*r_ij*r_jk-cosAng_ijk
+                        *dis_jk[0]*r_ij*r_ij)/(r_ij*r_ij*r_jk*r_jk);
+                    dcA_ijk[1][1]=(-dis_ij[1]*r_ij*r_jk-cosAng_ijk
+                        *dis_jk[1]*r_ij*r_ij)/(r_ij*r_ij*r_jk*r_jk);
+                    dcA_ijk[2][1]=(-dis_ij[2]*r_ij*r_jk-cosAng_ijk
+                        *dis_jk[2]*r_ij*r_ij)/(r_ij*r_ij*r_jk*r_jk);
+                  } 
+                } else { 
+                  if(neigh_flag[temp_jkp]) {
+                    pass_jkp=1;
+                    dis_jkp[0]=disij[0][temp_jkp];
+                    dis_jkp[1]=disij[1][temp_jkp];
+                    dis_jkp[2]=disij[2][temp_jkp];
+                    r_jkp=rij[temp_jkp];
+                    betaS_jkp=betaS[temp_jkp];
+                    dBetaS_jkp=dBetaS[temp_jkp];
+                    betaP_jkp=betaP[temp_jkp];
+                    dBetaP_jkp=dBetaP[temp_jkp];
+                    if(ji<ltmp) {
+                      nijk=ji*(2*nlistj-ji-1)/2+(ltmp-ji)-1;
+                      ngji=0;
+                      ngjk=1;
+                    }
+                    else {
+                      nijk=ltmp*(2*nlistj-ltmp-1)/2+(ji-ltmp)-1;
+                      ngji=1;
+                      ngjk=0;
+                    }
+                    ang_ijk=cos_index[j]+nijk;
+                    cosAng_ijk=cosAng[ang_ijk];
+                    dcA_ijk[0][0]=dcAng[ang_ijk][0][ngji];
+                    dcA_ijk[1][0]=dcAng[ang_ijk][1][ngji];
+                    dcA_ijk[2][0]=dcAng[ang_ijk][2][ngji];
+                    dcA_ijk[0][1]=dcAng[ang_ijk][0][ngjk];
+                    dcA_ijk[1][1]=dcAng[ang_ijk][1][ngjk];
+                    dcA_ijk[2][1]=dcAng[ang_ijk][2][ngjk];
+                  } 
+                } 
+                if(pass_jkp==1) {
+                  amean=cosAng_ijk;
+                  if(amean<-1.0) amean=-1.0;
+                  if(npower<=2) {
+                    ps=(amean-1.0)*rdtheta+1.0;
+                    ks=(int)ps;
+                    if(ntheta-1<ks)
+                      ks=ntheta-1;
+                    ps=ps-ks;
+                    if(ps>1.0)
+                      ps=1.0;
+                    ks=ks-1;
+                    gfactor2=((gfunc3[itype][jtype][ktype][ks]*ps+
+                        gfunc2[itype][jtype][ktype][ks])*ps+
+                        gfunc1[itype][jtype][ktype][ks])*ps+
+                        gfunc[itype][jtype][ktype][ks];
+                    gprime2=(gfunc6[itype][jtype][ktype][ks]*ps+
+                        gfunc5[itype][jtype][ktype][ks])*ps+
+                        gfunc4[itype][jtype][ktype][ks];
+                  } else {
+                    gfactor2=gpara[itype-1][jtype-1][ktype-1][0];
+                    gprime2=0.0;
+                    xrun=1.0;
+                    for(lp1=1;lp1<npower+1;lp1++) {
+                      gprime2=gprime2+(lp1)*xrun*gpara[itype-1][jtype-1][ktype-1][lp1];
+                      xrun=xrun*amean;
+                      gfactor2=gfactor2+xrun*gpara[itype-1][jtype-1][ktype-1][lp1];
+                    }
                   }
-                  if(kNeii<mtmp) {
-                    nikj=kNeii*(2*numneigh[k]-kNeii-1)/2+(mtmp-kNeii)-1;
-                    ngki=0;
-                    ngkj=1;
+                  if(otfly==1) {
+                    cosAng_ikj=(dis_ik[0]*dis_jk[0]+dis_ik[1]*dis_jk[1]
+                        +dis_ik[2]*dis_jk[2])/(r_ik*r_jk);
+                    dcA_ikj[0][0]=(-dis_jk[0]*r_ik*r_jk-cosAng_ikj
+                        *-dis_ik[0]*r_jk*r_jk)/(r_ik*r_ik*r_jk*r_jk);
+                    dcA_ikj[1][0]=(-dis_jk[1]*r_ik*r_jk-cosAng_ikj
+                        *-dis_ik[1]*r_jk*r_jk)/(r_ik*r_ik*r_jk*r_jk);
+                    dcA_ikj[2][0]=(-dis_jk[2]*r_ik*r_jk-cosAng_ikj
+                        *-dis_ik[2]*r_jk*r_jk)/(r_ik*r_ik*r_jk*r_jk);
+                    dcA_ikj[0][1]=(-dis_ik[0]*r_ik*r_jk-cosAng_ikj
+                        *-dis_jk[0]*r_ik*r_ik)/(r_ik*r_ik*r_jk*r_jk);
+                    dcA_ikj[1][1]=(-dis_ik[1]*r_ik*r_jk-cosAng_ikj
+                        *-dis_jk[1]*r_ik*r_ik)/(r_ik*r_ik*r_jk*r_jk);
+                    dcA_ikj[2][1]=(-dis_ik[2]*r_ik*r_jk-cosAng_ikj
+                        *-dis_jk[2]*r_ik*r_ik)/(r_ik*r_ik*r_jk*r_jk);
+                  } else {
+                    if(kNeii<mtmp) {
+                      nikj=kNeii*(2*nlistk-kNeii-1)/2+(mtmp-kNeii)-1;
+                      ngki=0;
+                      ngkj=1;
+                    }
+                    else {
+                      nikj=mtmp*(2*nlistk-mtmp-1)/2+(kNeii-mtmp)-1;
+                      ngki=1;
+                      ngkj=0;
+                    }
+                    ang_ikj=cos_index[k]+nikj;
+               
+                    cosAng_ikj=cosAng[ang_ikj];
+                    dcA_ikj[0][0]=dcAng[ang_ikj][0][ngki];
+                    dcA_ikj[1][0]=dcAng[ang_ikj][1][ngki];
+                    dcA_ikj[2][0]=dcAng[ang_ikj][2][ngki];
+                    dcA_ikj[0][1]=dcAng[ang_ikj][0][ngkj];
+                    dcA_ikj[1][1]=dcAng[ang_ikj][1][ngkj];
+                    dcA_ikj[2][1]=dcAng[ang_ikj][2][ngkj];
                   }
-                  else {
-                    nikj=mtmp*(2*numneigh[k]-mtmp-1)/2+(kNeii-mtmp)-1;
-                    ngki=1;
-                    ngkj=0;
+                  amean=cosAng_ikj;
+                  if(amean<-1.0) amean=-1.0;
+                  if(npower<=2) {
+                    ps=(amean-1.0)*rdtheta+1.0;
+                    ks=(int)ps;
+                    if(ntheta-1<ks)
+                      ks=ntheta-1;
+                    ps=ps-ks;
+                    if(ps>1.0)
+                      ps=1.0;
+                    ks=ks-1;
+                    gfactor3=((gfunc3[itype][jtype][jtype][ks]*ps+
+                        gfunc2[itype][ktype][jtype][ks])*ps+
+                        gfunc1[itype][ktype][jtype][ks])*ps+
+                        gfunc[itype][ktype][jtype][ks];
+                    gprime3=(gfunc6[itype][ktype][jtype][ks]*ps+
+                        gfunc5[itype][ktype][jtype][ks])*ps+
+                        gfunc4[itype][ktype][jtype][ks];
+                  } else {
+                    gfactor3=gpara[itype-1][ktype-1][jtype-1][0];
+                    gprime3=0.0;
+                    xrun=1.0;
+                    for(lp1=1;lp1<npower+1;lp1++) {
+                      gprime3=gprime3+(lp1)*xrun*gpara[itype-1][ktype-1][jtype-1][lp1];
+                      xrun=xrun*amean;
+                      gfactor3=gfactor3+xrun*gpara[itype-1][ktype-1][jtype-1][lp1];
+                    }
                   }
-                  ang_ijk=cos_index[j]+nijk;
-                  gmean0=sigma_g0[itype-1][jtype-1][ktype-1];
-                  gmean1=sigma_g1[itype-1][jtype-1][ktype-1];
-                  gmean2=sigma_g2[itype-1][jtype-1][ktype-1];
-                  amean=cosAng[ang_ijk];
-                  gfactor2=gmean0+gmean1*amean
-                      +gmean2*amean*amean;
-                  gprime2=gmean1+2.0*gmean2*amean;
-                  gmean0=sigma_g0[itype-1][ktype-1][jtype-1];
-                  gmean1=sigma_g1[itype-1][ktype-1][jtype-1];
-                  gmean2=sigma_g2[itype-1][ktype-1][jtype-1];
-                  ang_ikj=cos_index[k]+nikj;
-                  amean=cosAng[ang_ikj];
-                  gfactor3=gmean0+gmean1*amean
-                      +gmean2*amean*amean;
-                  gprime3=gmean1+2.0*gmean2*amean;
                   gfactor=gfactor1*gfactor2*gfactor3;
-                  rfactor=betaS[temp_ik]*betaS[temp_jkp];
+                  rfactor=betaS_ik*betaS_jkp;
 
 //EE1 is (b) Eq. 12
 
                   EE1=EE1+gfactor*rfactor;
 
+//rcm1 is derivative of EE1 w.r.t Beta(r_ik)
 //rcm2 is derivative of EE1 w.r.t Beta(r_jk')
 //gcm1 is derivative of EE1 w.r.t cos(theta_jik)
 //gcm2 is derivative of EE1 w.r.t cos(theta_ijk)
 //gcm3 is derivative of EE1 w.r.t cos(theta_ikj)
 
-                  rcm1=gfactor*betaS[temp_jkp]*dBetaS[temp_ik]/rij[temp_ik];
-                  rcm2=gfactor*betaS[temp_ik]*dBetaS[temp_jkp]/rij[temp_jkp];
+                  rcm1=gfactor*betaS_jkp*dBetaS_ik/r_ik;
+                  rcm2=gfactor*betaS_ik*dBetaS_jkp/r_jkp;
                   gcm1=rfactor*gprime1*gfactor2*gfactor3;
                   gcm2=rfactor*gfactor1*gprime2*gfactor3;
                   gcm3=rfactor*gfactor1*gfactor2*gprime3;
                   bt_sg[nb_ij].dEE1[0]+=
-                      gcm1*dcAng[ang_jik][0][ngj]
-                      -gcm2*dcAng[ang_ijk][0][ngji];
+                      gcm1*dcA_jik[0][0]
+                      -gcm2*dcA_ijk[0][0];
                   bt_sg[nb_ij].dEE1[1]+=
-                      gcm1*dcAng[ang_jik][1][ngj]
-                      -gcm2*dcAng[ang_ijk][1][ngji];
+                      gcm1*dcA_jik[1][0]
+                      -gcm2*dcA_ijk[1][0];
                   bt_sg[nb_ij].dEE1[2]+=
-                      gcm1*dcAng[ang_jik][2][ngj]
-                      -gcm2*dcAng[ang_ijk][2][ngji];
+                      gcm1*dcA_jik[2][0]
+                      -gcm2*dcA_ijk[2][0];
                   bt_sg[nb_ik].dEE1[0]+=
-                      gcm1*dcAng[ang_jik][0][ngk]
-                      +rcm1*disij[0][temp_ik]
-                      -gcm3*dcAng[ang_ikj][0][ngki];
+                      gcm1*dcA_jik[0][1]
+                      +rcm1*dis_ik[0]
+                      -gcm3*dcA_ikj[0][0];
                   bt_sg[nb_ik].dEE1[1]+=
-                      gcm1*dcAng[ang_jik][1][ngk]
-                      +rcm1*disij[1][temp_ik]
-                      -gcm3*dcAng[ang_ikj][1][ngki];
+                      gcm1*dcA_jik[1][1]
+                      +rcm1*dis_ik[1]
+                      -gcm3*dcA_ikj[1][0];
                   bt_sg[nb_ik].dEE1[2]+=
-                      gcm1*dcAng[ang_jik][2][ngk]
-                      +rcm1*disij[2][temp_ik]
-                      -gcm3*dcAng[ang_ikj][2][ngki];
+                      gcm1*dcA_jik[2][1]
+                      +rcm1*dis_ik[2]
+                      -gcm3*dcA_ikj[2][0];
                   bt_sg[nb_jk].dEE1[0]+=
-                      gcm2*dcAng[ang_ijk][0][ngjk]
-                      +rcm2*disij[0][temp_jkp]
-                      -gcm3*dcAng[ang_ikj][0][ngkj];
+                      gcm2*dcA_ijk[0][1]
+                      +rcm2*dis_jkp[0]
+                      -gcm3*dcA_ikj[0][1];
                   bt_sg[nb_jk].dEE1[1]+=
-                      gcm2*dcAng[ang_ijk][1][ngjk]
-                      +rcm2*disij[1][temp_jkp]
-                      -gcm3*dcAng[ang_ikj][1][ngkj];
+                      gcm2*dcA_ijk[1][1]
+                      +rcm2*dis_jkp[1]
+                      -gcm3*dcA_ikj[1][1];
                   bt_sg[nb_jk].dEE1[2]+=
-                      gcm2*dcAng[ang_ijk][2][ngjk]
-                      +rcm2*disij[2][temp_jkp]
-                      -gcm3*dcAng[ang_ikj][2][ngkj];
+                      gcm2*dcA_ijk[2][1]
+                      +rcm2*dis_jkp[2]
+                      -gcm3*dcA_ikj[2][1];
                 }
+              }
+            }
 
 // k and k' and j are all different neighbors of i
-
-                for(ltmp=0;ltmp<ktmp;ltmp++) {
-                  if(ltmp!=jtmp) {
-                    temp_ikp=BOP_index[i]+ltmp;
-                    if(neigh_flag[temp_ikp]) {
-                      kp=iilist[ltmp];
-                      kptype = map[type[kp]]+1;
-                      for(nsearch=0;nsearch<nSigBk[n];nsearch++) {
-                        ncmp=itypeSigBk[n][nsearch];
-                        if(x[ncmp][0]==x[kp][0]) {
-                          if(x[ncmp][1]==x[kp][1]) {
-                            if(x[ncmp][2]==x[kp][2]) {
-                              break;
-                            }
-                          }
+            if(sigma_a[iij]!=0) {
+              for(ltmp=0;ltmp<ktmp;ltmp++) {
+                if(ltmp!=jtmp) {
+                  temp_ikp=BOP_index[i]+ltmp;
+                  ni_ikp=neigh_index[temp_ikp];
+                  kp=iilist[ni_ikp];
+                  kptype = map[type[kp]]+1;
+                  if(itype==kptype)
+                    iikp=itype-1;
+                  else if(itype<kptype)
+                    iikp=itype*bop_types-itype*(itype+1)/2+kptype-1;
+                  else
+                    iikp=kptype*bop_types-kptype*(kptype+1)/2+itype-1;
+                  for(nsearch=0;nsearch<nSigBk;nsearch++) {
+                    ncmp=itypeSigBk[nsearch];
+                    if(x[ncmp][0]==x[kp][0]) {
+                      if(x[ncmp][1]==x[kp][1]) {
+                        if(x[ncmp][2]==x[kp][2]) {
+                          break;
                         }
                       }
+                    }
+                  }
+                  pass_ikp=0;
+                  if(otfly==1) {
+                    dis_ikp[0]=x[kp][0]-x[i][0];
+                    dis_ikp[1]=x[kp][1]-x[i][1];
+                    dis_ikp[2]=x[kp][2]-x[i][2];
+                    rsq_ikp=dis_ikp[0]*dis_ikp[0]
+                        +dis_ikp[1]*dis_ikp[1]
+                        +dis_ikp[2]*dis_ikp[2];
+                    r_ikp=sqrt(rsq_ikp);
+                    if(r_ikp<=rcut[iikp]) {
+                      pass_ikp=1;
+                      ps=r_ikp*rdr[iikp]+1.0;
+                      ks=(int)ps;
+                      if(nr-1<ks)
+                        ks=nr-1;
+                      ps=ps-ks;
+                      if(ps>1.0)
+                        ps=1.0;
+                      betaS_ikp=((pBetaS3[iikp][ks-1]*ps+pBetaS2[iikp][ks-1])*ps
+                          +pBetaS1[iikp][ks-1])*ps+pBetaS[iikp][ks-1];
+                      dBetaS_ikp=(pBetaS6[iikp][ks-1]*ps+pBetaS5[iikp][ks-1])*ps
+                          +pBetaS4[iikp][ks-1];
+                      betaP_ikp=((pBetaP3[iikp][ks-1]*ps+pBetaP2[iikp][ks-1])*ps
+                          +pBetaP1[iikp][ks-1])*ps+pBetaP[iikp][ks-1];
+                      dBetaP_ikp=(pBetaP6[iikp][ks-1]*ps+pBetaP5[iikp][ks-1])*ps
+                          +pBetaP4[iikp][ks-1];
+                    }
+                  } else {
+                    if(neigh_flag[temp_ikp]) {
+                      pass_ikp=1;
+                      dis_ikp[0]=disij[0][temp_ikp];
+                      dis_ikp[1]=disij[1][temp_ikp];
+                      dis_ikp[2]=disij[2][temp_ikp];
+                      r_ikp=rij[temp_ikp];
+                      betaS_ikp=betaS[temp_ikp];
+                      dBetaS_ikp=dBetaS[temp_ikp];
+                      betaP_ikp=betaP[temp_ikp];
+                      dBetaP_ikp=dBetaP[temp_ikp];
+                    }
+                  }
+                  if(pass_ikp==1) {
+                    nb_ikp=nb_t;
+                    nb_t++;
+                    if(nb_t>nb_sg) {
+                      new_n_tot=nb_sg+maxneigh;
+                      grow_sigma(nb_sg,new_n_tot);
+                      nb_sg=new_n_tot;
+                    }
+                    bt_sg[nb_ikp].temp=temp_ikp;
+                    bt_sg[nb_ikp].i=i;
+                    bt_sg[nb_ikp].j=kp;
+                    if(otfly==1) {
+                      cosAng_jikp=(dis_ij[0]*dis_ikp[0]+dis_ij[1]*dis_ikp[1]
+                          +dis_ij[2]*dis_ikp[2])/(r_ij*r_ikp);
+                      dcA_jikp[0][0]=(dis_ikp[0]*r_ij*r_ikp-cosAng_jikp
+                          *dis_ij[0]*r_ikp*r_ikp)/(r_ij*r_ij*r_ikp*r_ikp);
+                      dcA_jikp[1][0]=(dis_ikp[1]*r_ij*r_ikp-cosAng_jikp
+                          *dis_ij[1]*r_ikp*r_ikp)/(r_ij*r_ij*r_ikp*r_ikp);
+                      dcA_jikp[2][0]=(dis_ikp[2]*r_ij*r_ikp-cosAng_jikp
+                          *dis_ij[2]*r_ikp*r_ikp)/(r_ij*r_ij*r_ikp*r_ikp);
+                      dcA_jikp[0][1]=(dis_ij[0]*r_ij*r_ikp-cosAng_jikp
+                          *dis_ikp[0]*r_ij*r_ij)/(r_ij*r_ij*r_ikp*r_ikp);
+                      dcA_jikp[1][1]=(dis_ij[1]*r_ij*r_ikp-cosAng_jikp
+                          *dis_ikp[1]*r_ij*r_ij)/(r_ij*r_ij*r_ikp*r_ikp);
+                      dcA_jikp[2][1]=(dis_ij[2]*r_ij*r_ikp-cosAng_jikp
+                          *dis_ikp[2]*r_ij*r_ij)/(r_ij*r_ij*r_ikp*r_ikp);
+                      cosAng_kikp=(dis_ik[0]*dis_ikp[0]+dis_ik[1]*dis_ikp[1]
+                          +dis_ik[2]*dis_ikp[2])/(r_ik*r_ikp);
+                      dcA_kikp[0][0]=(dis_ikp[0]*r_ik*r_ikp-cosAng_kikp
+                          *dis_ik[0]*r_ikp*r_ikp)/(r_ik*r_ik*r_ikp*r_ikp);
+                      dcA_kikp[1][0]=(dis_ikp[1]*r_ik*r_ikp-cosAng_kikp
+                          *dis_ik[1]*r_ikp*r_ikp)/(r_ik*r_ik*r_ikp*r_ikp);
+                      dcA_kikp[2][0]=(dis_ikp[2]*r_ik*r_ikp-cosAng_kikp
+                          *dis_ik[2]*r_ikp*r_ikp)/(r_ik*r_ik*r_ikp*r_ikp);
+                      dcA_kikp[0][1]=(dis_ik[0]*r_ik*r_ikp-cosAng_kikp
+                          *dis_ikp[0]*r_ik*r_ik)/(r_ik*r_ik*r_ikp*r_ikp);
+                      dcA_kikp[1][1]=(dis_ik[1]*r_ik*r_ikp-cosAng_kikp
+                          *dis_ikp[1]*r_ik*r_ik)/(r_ik*r_ik*r_ikp*r_ikp);
+                      dcA_kikp[2][1]=(dis_ik[2]*r_ik*r_ikp-cosAng_kikp
+                          *dis_ikp[2]*r_ik*r_ik)/(r_ik*r_ik*r_ikp*r_ikp);
+                    } else {
                       if(jtmp<ltmp) {
-                        njikp=jtmp*(2*numneigh[i]-jtmp-1)/2+(ltmp-jtmp)-1;
+                        njikp=jtmp*(2*nlisti-jtmp-1)/2+(ltmp-jtmp)-1;
                         nglj=0;
                         ngl=1;
                       }
                       else {
-                        njikp=ltmp*(2*numneigh[i]-ltmp-1)/2+(jtmp-ltmp)-1;
+                        njikp=ltmp*(2*nlisti-ltmp-1)/2+(jtmp-ltmp)-1;
                         nglj=1;
                         ngl=0;
                       }
                       if(ktmp<ltmp) {
-                        nkikp=ktmp*(2*numneigh[i]-ktmp-1)/2+(ltmp-ktmp)-1;
+                        nkikp=ktmp*(2*nlisti-ktmp-1)/2+(ltmp-ktmp)-1;
                         nglk=0;
                         nglkp=1;
                       }
                       else {
-                        nkikp=ltmp*(2*numneigh[i]-ltmp-1)/2+(ktmp-ltmp)-1;
+                        nkikp=ltmp*(2*nlisti-ltmp-1)/2+(ktmp-ltmp)-1;
                         nglk=1;
                         nglkp=0;
                       }
                       ang_jikp=cos_index[i]+njikp;
-                      nb_ikp=nb_t;
-                      nb_t++;
-                      if(nb_t>nb_sg) {
-                        new_n_tot=nb_sg+maxneigh;
-                        grow_sigma(nb_sg,new_n_tot);
-                        nb_sg=new_n_tot;
-                      }
-                      bt_sg[nb_ikp].temp=temp_ikp;
-                      bt_sg[nb_ikp].i=i;
-                      bt_sg[nb_ikp].j=kp;
-                      gmean0=sigma_g0[jtype-1][itype-1][kptype-1];
-                      gmean1=sigma_g1[jtype-1][itype-1][kptype-1];
-                      gmean2=sigma_g2[jtype-1][itype-1][kptype-1];
-                      amean=cosAng[ang_jikp];
-                      gfactor2=gmean0+gmean1*amean
-                          +gmean2*amean*amean;
-                      gprime2=gmean1+2.0*gmean2*amean;
-                      gmean0=sigma_g0[ktype-1][itype-1][kptype-1];
-                      gmean1=sigma_g1[ktype-1][itype-1][kptype-1];
-                      gmean2=sigma_g2[ktype-1][itype-1][kptype-1];
+                      cosAng_jikp=cosAng[ang_jikp];
+                      dcA_jikp[0][0]=dcAng[ang_jikp][0][nglj];
+                      dcA_jikp[1][0]=dcAng[ang_jikp][1][nglj];
+                      dcA_jikp[2][0]=dcAng[ang_jikp][2][nglj];
+                      dcA_jikp[0][1]=dcAng[ang_jikp][0][ngl];
+                      dcA_jikp[1][1]=dcAng[ang_jikp][1][ngl];
+                      dcA_jikp[2][1]=dcAng[ang_jikp][2][ngl];
                       ang_kikp=cos_index[i]+nkikp;
-                      amean=cosAng[ang_kikp];
-                      gfactor3=gmean0+gmean1*amean
-                          +gmean2*amean*amean;
-                      gprime3=gmean1+2.0*gmean2*amean;
-                      gfactor=gfactor1*gfactor2*gfactor3;
-                      rfactorrt=betaS[temp_ik]*betaS[temp_ikp];
-                      rfactor=rfactorrt*rfactorrt;
+                      cosAng_kikp=cosAng[ang_jikp];
+                      dcA_kikp[0][0]=dcAng[ang_kikp][0][nglk];
+                      dcA_kikp[1][0]=dcAng[ang_kikp][1][nglk];
+                      dcA_kikp[2][0]=dcAng[ang_kikp][2][nglk];
+                      dcA_kikp[0][1]=dcAng[ang_kikp][0][nglkp];
+                      dcA_kikp[1][1]=dcAng[ang_kikp][1][nglkp];
+                      dcA_kikp[2][1]=dcAng[ang_kikp][2][nglkp];
+                    }
+                    amean=cosAng_jikp;
+                    if(amean<-1.0) amean=-1.0;
+                    if(npower<=2) {
+                      ps=(amean-1.0)*rdtheta+1.0;
+                      ks=(int)ps;
+                      if(ntheta-1<ks)
+                        ks=ntheta-1;
+                      ps=ps-ks;
+                      if(ps>1.0)
+                        ps=1.0;
+                      ks=ks-1;
+                      gfactor2=((gfunc3[jtype][itype][kptype][ks]*ps+
+                          gfunc2[jtype][itype][kptype][ks])*ps+
+                          gfunc1[jtype][itype][kptype][ks])*ps+
+                          gfunc[jtype][itype][kptype][ks];
+                      gprime2=(gfunc6[jtype][itype][kptype][ks]*ps+
+                          gfunc5[jtype][itype][kptype][ks])*ps+
+                          gfunc4[jtype][itype][kptype][ks];
+                    } else {
+                      gfactor2=gpara[jtype-1][itype-1][kptype-1][0];
+                      gprime2=0.0;
+                      xrun=1.0;
+                      for(lp1=1;lp1<npower+1;lp1++) {
+                        gprime2=gprime2+(lp1)*xrun*gpara[jtype-1][itype-1][kptype-1][lp1];
+                        xrun=xrun*amean;
+                        gfactor2=gfactor2+xrun*gpara[jtype-1][itype-1][kptype-1][lp1];
+                      }
+                    }
+                    amean=cosAng_kikp;
+                    if(amean<-1.0) amean=-1.0;
+                    if(npower<=2) {
+                      ps=(amean-1.0)*rdtheta+1.0;
+                      ks=(int)ps;
+                      if(ntheta-1<ks)
+                        ks=ntheta-1;
+                      ps=ps-ks;
+                      if(ps>1.0)
+                        ps=1.0;
+                      ks=ks-1;
+                      gfactor3=((gfunc3[ktype][itype][kptype][ks]*ps+
+                          gfunc2[ktype][itype][kptype][ks])*ps+
+                          gfunc1[ktype][itype][kptype][ks])*ps+
+                          gfunc[ktype][itype][kptype][ks];
+                      gprime3=(gfunc6[ktype][itype][kptype][ks]*ps+
+                          gfunc5[ktype][itype][kptype][ks])*ps+
+                          gfunc4[ktype][itype][kptype][ks];
+                    } else {
+                      gfactor3=gpara[ktype-1][itype-1][kptype-1][0];
+                      gprime3=0.0;
+                      xrun=1.0;
+                      for(lp1=1;lp1<npower+1;lp1++) {
+                        gprime3=gprime3+(lp1)*xrun*gpara[ktype-1][itype-1][kptype-1][lp1];
+                        xrun=xrun*amean;
+                        gfactor3=gfactor3+xrun*gpara[ktype-1][itype-1][kptype-1][lp1];
+                      }
+                    }
+                    gfactor=gfactor1*gfactor2*gfactor3;
+                    rfactorrt=betaS_ik*betaS_ikp;
+                    rfactor=rfactorrt*rfactorrt;
 
 //2nd CC is second term of Eq. 11 (c) for i atom where j , k & k' =neighbor of i
 
-                      CC=CC+2.0*gfactor*rfactor;
+                    CC=CC+2.0*gfactor*rfactor;
 
 //agpdpr1 is derivative of CC 2nd term w.r.t. Beta(r_ik)
 //agpdpr2 is derivative of CC 2nd term w.r.t. Beta(r_ik')
@@ -1357,4803 +2168,382 @@ void PairBOP::sigmaBo()
 //app2 is derivative of CC 2nd term w.r.t. cos(theta_jik')
 //app3 is derivative of CC 2nd term w.r.t. cos(theta_kik')
 
-                      agpdpr1=4.0*gfactor*rfactorrt*betaS[temp_ikp]
-                          *dBetaS[temp_ik]/rij[temp_ik];
-                      agpdpr2=4.0*gfactor*rfactorrt*betaS[temp_ik]
-                          *dBetaS[temp_ikp]/rij[temp_ikp];
-                      app1=2.0*rfactor*gfactor2*gfactor3*gprime1;
-                      app2=2.0*rfactor*gfactor1*gfactor3*gprime2;
-                      app3=2.0*rfactor*gfactor1*gfactor2*gprime3;
-                      bt_sg[nb_ij].dCC[0]+=
-                          app1*dcAng[ang_jik][0][ngj]
-                          +app2*dcAng[ang_jikp][0][nglj];
-                      bt_sg[nb_ij].dCC[1]+=
-                          app1*dcAng[ang_jik][1][ngj]
-                          +app2*dcAng[ang_jikp][1][nglj];
-                      bt_sg[nb_ij].dCC[2]+=
-                          app1*dcAng[ang_jik][2][ngj]
-                          +app2*dcAng[ang_jikp][2][nglj];
-                      bt_sg[nb_ik].dCC[0]+=
-                          app1*dcAng[ang_jik][0][ngk]
-                          +app3*dcAng[ang_kikp][0][nglk]
-                          +agpdpr1*disij[0][temp_ik];
-                      bt_sg[nb_ik].dCC[1]+=
-                          app1*dcAng[ang_jik][1][ngk]
-                          +app3*dcAng[ang_kikp][1][nglk]
-                          +agpdpr1*disij[1][temp_ik];
-                      bt_sg[nb_ik].dCC[2]+=
-                          app1*dcAng[ang_jik][2][ngk]
-                          +app3*dcAng[ang_kikp][2][nglk]
-                          +agpdpr1*disij[2][temp_ik];
-                      bt_sg[nb_ikp].dCC[0]+=
-                          app2*dcAng[ang_jikp][0][ngl]
-                          +app3*dcAng[ang_kikp][0][nglkp]
-                          +agpdpr2*disij[0][temp_ikp];
-                      bt_sg[nb_ikp].dCC[1]+=
-                          app2*dcAng[ang_jikp][1][ngl]
-                          +app3*dcAng[ang_kikp][1][nglkp]
-                          +agpdpr2*disij[1][temp_ikp];
-                      bt_sg[nb_ikp].dCC[2]+=
-                          app2*dcAng[ang_jikp][2][ngl]
-                          +app3*dcAng[ang_kikp][2][nglkp]
-                          +agpdpr2*disij[2][temp_ikp];
-                    }
+                    agpdpr1=4.0*gfactor*rfactorrt*betaS_ikp
+                        *dBetaS_ik/r_ik;
+                    agpdpr2=4.0*gfactor*rfactorrt*betaS_ik
+                        *dBetaS_ikp/r_ikp;
+                    app1=2.0*rfactor*gfactor2*gfactor3*gprime1;
+                    app2=2.0*rfactor*gfactor1*gfactor3*gprime2;
+                    app3=2.0*rfactor*gfactor1*gfactor2*gprime3;
+                    bt_sg[nb_ij].dCC[0]+=
+                        app1*dcA_jik[0][0]
+                        +app2*dcA_jikp[0][0];
+                    bt_sg[nb_ij].dCC[1]+=
+                        app1*dcA_jik[1][0]
+                        +app2*dcA_jikp[1][0];
+                    bt_sg[nb_ij].dCC[2]+=
+                        app1*dcA_jik[2][0]
+                        +app2*dcA_jikp[2][0];
+                    bt_sg[nb_ik].dCC[0]+=
+                        app1*dcA_jik[0][1]
+                        +app3*dcA_kikp[0][0]
+                        +agpdpr1*dis_ik[0];
+                    bt_sg[nb_ik].dCC[1]+=
+                        app1*dcA_jik[1][1]
+                        +app3*dcA_kikp[1][0]
+                        +agpdpr1*dis_ik[1];
+                    bt_sg[nb_ik].dCC[2]+=
+                        app1*dcA_jik[2][1]
+                        +app3*dcA_kikp[2][0]
+                        +agpdpr1*dis_ik[2];
+                    bt_sg[nb_ikp].dCC[0]=
+                        app2*dcA_jikp[0][1]
+                        +app3*dcA_kikp[0][1]
+                        +agpdpr2*dis_ikp[0];
+                    bt_sg[nb_ikp].dCC[1]=
+                        app2*dcA_jikp[1][1]
+                        +app3*dcA_kikp[1][1]
+                        +agpdpr2*dis_ikp[1];
+                    bt_sg[nb_ikp].dCC[2]=
+                        app2*dcA_jikp[2][1]
+                        +app3*dcA_kikp[2][1]
+                        +agpdpr2*dis_ikp[2];
                   }
                 }
-
+              }
+  
 // j and k are different neighbors of i and k' is a neighbor k not equal to i
 
-                for(ltmp=0;ltmp<numneigh[k];ltmp++) {
-                  temp_kkp=BOP_index[k]+ltmp;
-                  if(neigh_flag[temp_kkp]) {
-                    kp=klist[ltmp];;
-                    kptype = map[type[kp]]+1;
-                    same_ikp=0;
-                    same_jkp=0;
-                    if(x[i][0]==x[kp][0]) {
-                      if(x[i][1]==x[kp][1]) {
-                        if(x[i][2]==x[kp][2]) {
-                          same_ikp=1;
-                        }
-                      }
-                    }
-                    if(x[j][0]==x[kp][0]) {
-                      if(x[j][1]==x[kp][1]) {
-                        if(x[j][2]==x[kp][2]) {
-                          same_jkp=1;
-                        }
-                      }
+              for(ltmp=0;ltmp<nlistk;ltmp++) {
+                temp_kkp=BOP_index[k]+ltmp;
+                ni_kkp=neigh_index[temp_ik];
+                kp=klist[ni_kkp];;
+                kptype = map[type[kp]]+1;
+                same_ikp=0;
+                same_jkp=0;
+                if(x[i][0]==x[kp][0]) {
+                  if(x[i][1]==x[kp][1]) {
+                    if(x[i][2]==x[kp][2]) {
+                      same_ikp=1;
                     }
-                    if(!same_ikp&&!same_jkp) {
-                      if(kNeii<ltmp) {
-                        nikkp=kNeii*(2*numneigh[k]-kNeii-1)/2+(ltmp-kNeii)-1;
-                        nglkp=1;
-                        ngli=0;
-                      }
-                      else {
-                        nikkp=ltmp*(2*numneigh[k]-ltmp-1)/2+(kNeii-ltmp)-1;
-                        nglkp=0;
-                        ngli=1;
-                      }
-                      sig_flag=0;
-                      for(nsearch=0;nsearch<nSigBk[n];nsearch++) {
-                        ncmp=itypeSigBk[n][nsearch];
-                        if(x[ncmp][0]==x[kp][0]) {
-                          if(x[ncmp][1]==x[kp][1]) {
-                            if(x[ncmp][2]==x[kp][2]) {
-                              sig_flag=1;
-                              nkp=nsearch;
-                              break;
-                            }
-                          }
-                        }
-                      }
-                      if(sig_flag==0) {
-                        nSigBk[n]=nSigBk[n]+1;
-                        nkp=nSigBk[n]-1;
-                        itypeSigBk[n][nkp]=kp;
-                      }
-                      ang_ikkp=cos_index[k]+nikkp;
-                      nb_kkp=nb_t;
-                      nb_t++;
-                      if(nb_t>nb_sg) {
-                        new_n_tot=nb_sg+maxneigh;
-                        grow_sigma(nb_sg,new_n_tot);
-                        nb_sg=new_n_tot;
-                      }
-                      bt_sg[nb_kkp].temp=temp_kkp;
-                      bt_sg[nb_kkp].i=k;
-                      bt_sg[nb_kkp].j=kp;
-                      gmean0=sigma_g0[itype-1][ktype-1][kptype-1];
-                      gmean1=sigma_g1[itype-1][ktype-1][kptype-1];
-                      gmean2=sigma_g2[itype-1][ktype-1][kptype-1];
-                      amean=cosAng[ang_ikkp];
-                      gfactor2=gmean0+gmean1*amean
-                          +gmean2*amean*amean;
-                      gprime2=gmean1+2.0*gmean2*amean;
-                      gfactorsq2=gfactor2*gfactor2;
-                      gsqprime2=2.0*gfactor2*gprime2;
-                      gfactor=gfactorsq*gfactorsq2;
-                      rfactorrt=betaS[temp_ik]*betaS[temp_kkp];
-                      rfactor=rfactorrt*rfactorrt;
-
-//3rd CC is third term of Eq. 11 (c) for i atom
-//where j , k =neighbor of i & k' =neighbor of k
-
-                      CC=CC+gfactor*rfactor;
-                      agpdpr1=2.0*gfactor*rfactorrt*betaS[temp_kkp]
-                          *dBetaS[temp_ik]/rij[temp_ik];
-                      agpdpr2=2.0*gfactor*rfactorrt*betaS[temp_ik]
-                          *dBetaS[temp_kkp]/rij[temp_kkp];
-                      app1=rfactor*gfactorsq2*gsqprime;
-                      app2=rfactor*gfactorsq*gsqprime2;
-                      bt_sg[nb_ij].dCC[0]+=
-                          app1*dcAng[ang_jik][0][ngj];
-                      bt_sg[nb_ij].dCC[1]+=
-                          app1*dcAng[ang_jik][1][ngj];
-                      bt_sg[nb_ij].dCC[2]+=
-                          app1*dcAng[ang_jik][2][ngj];
-                      bt_sg[nb_ik].dCC[0]+=
-                          app1*dcAng[ang_jik][0][ngk]
-                          +agpdpr1*disij[0][temp_ik]
-                          -app2*dcAng[ang_ikkp][0][ngli];
-                      bt_sg[nb_ik].dCC[1]+=
-                          app1*dcAng[ang_jik][1][ngk]
-                          +agpdpr1*disij[1][temp_ik]
-                          -app2*dcAng[ang_ikkp][1][ngli];
-                      bt_sg[nb_ik].dCC[2]+=
-                          app1*dcAng[ang_jik][2][ngk]
-                          +agpdpr1*disij[2][temp_ik]
-                          -app2*dcAng[ang_ikkp][2][ngli];
-                      bt_sg[nb_kkp].dCC[0]+=
-                          app2*dcAng[ang_ikkp][0][nglkp]
-                          +agpdpr2*disij[0][temp_kkp];
-                      bt_sg[nb_kkp].dCC[1]+=
-                          app2*dcAng[ang_ikkp][1][nglkp]
-                          +agpdpr2*disij[1][temp_kkp];
-                      bt_sg[nb_kkp].dCC[2]+=
-                          app2*dcAng[ang_ikkp][2][nglkp]
-                          +agpdpr2*disij[2][temp_kkp];
-
+                  }
+                }
+                if(x[j][0]==x[kp][0]) {
+                  if(x[j][1]==x[kp][1]) {
+                    if(x[j][2]==x[kp][2]) {
+                      same_jkp=1;
                     }
                   }
                 }
-
-       //j and k are different neighbors of i and k' is a neighbor j not equal to k
-
-                kplist=firstneigh[kp];
-                for(ltmp=0;ltmp<numneigh[j];ltmp++) {
-                  sig_flag=0;
-                  temp_jkp=BOP_index[j]+ltmp;
-                  if(neigh_flag[temp_jkp]) {
-                    kp=jlist[ltmp];
-                    kptype = map[type[kp]]+1;
-                    same_jkp=0;
-                    same_kkp=0;
-                    for(kpNeij=0;kpNeij<numneigh[kp];kpNeij++) {
-                      if(x[j][0]==x[kp][0]) {
-                        if(x[j][1]==x[kp][1]) {
-                          if(x[j][2]==x[kp][2]) {
-                            same_jkp=1;
+                if(!same_ikp&&!same_jkp) {
+                  if(ktype==kptype)
+                    ikkp=ktype-1;
+                  else if(ktype<kptype)
+                    ikkp=ktype*bop_types-ktype*(ktype+1)/2+kptype-1;
+                  else
+                    ikkp=kptype*bop_types-kptype*(kptype+1)/2+ktype-1;
+                  pass_kkp=0;
+                  if(otfly==1) {
+                    dis_kkp[0]=x[kp][0]-x[k][0];
+                    dis_kkp[1]=x[kp][1]-x[k][1];
+                    dis_kkp[2]=x[kp][2]-x[k][2];
+                    rsq_kkp=dis_kkp[0]*dis_kkp[0]
+                        +dis_kkp[1]*dis_kkp[1]
+                        +dis_kkp[2]*dis_kkp[2];
+                    r_kkp=sqrt(rsq_kkp);
+                    if(r_kkp<=rcut[ikkp]) {
+                      pass_kkp=1;
+                      ps=r_kkp*rdr[ikkp]+1.0;
+                      ks=(int)ps;
+                      if(nr-1<ks)
+                        ks=nr-1;
+                      ps=ps-ks;
+                      if(ps>1.0)
+                        ps=1.0;
+                      betaS_kkp=((pBetaS3[ikkp][ks-1]*ps+pBetaS2[ikkp][ks-1])*ps
+                          +pBetaS1[ikkp][ks-1])*ps+pBetaS[ikkp][ks-1];
+                      dBetaS_kkp=(pBetaS6[ikkp][ks-1]*ps+pBetaS5[ikkp][ks-1])*ps
+                          +pBetaS4[ikkp][ks-1];
+                      betaP_kkp=((pBetaP3[ikkp][ks-1]*ps+pBetaP2[ikkp][ks-1])*ps
+                          +pBetaP1[ikkp][ks-1])*ps+pBetaP[ikkp][ks-1];
+                      dBetaP_kkp=(pBetaP6[ikkp][ks-1]*ps+pBetaP5[ikkp][ks-1])*ps
+                          +pBetaP4[ikkp][ks-1];
+                    }
+                  } else {
+                    if(neigh_flag[temp_kkp]) {
+                      pass_kkp=1;
+                      dis_kkp[0]=disij[0][temp_kkp];
+                      dis_kkp[1]=disij[1][temp_kkp];
+                      dis_kkp[2]=disij[2][temp_kkp];
+                      r_kkp=rij[temp_kkp];
+                      betaS_kkp=betaS[temp_kkp];
+                      dBetaS_kkp=dBetaS[temp_kkp];
+                      betaP_kkp=betaP[temp_kkp];
+                      dBetaP_kkp=dBetaP[temp_kkp];
+                    }
+                  }
+                  if(pass_kkp==1) { 
+                    sig_flag=0;
+                    for(nsearch=0;nsearch<nSigBk;nsearch++) {
+                      ncmp=itypeSigBk[nsearch];
+                      if(x[ncmp][0]==x[kp][0]) {
+                        if(x[ncmp][1]==x[kp][1]) {
+                          if(x[ncmp][2]==x[kp][2]) {
+                            sig_flag=1;
+                            nkp=nsearch;
                             break;
                           }
                         }
                       }
                     }
-                    for(kpNeik=0;kpNeik<numneigh[kp];kpNeik++) {
-                      if(x[k][0]==x[kp][0]) {
-                        if(x[k][1]==x[kp][1]) {
-                          if(x[k][2]==x[kp][2]) {
-                            same_kkp=1;
-                            break;
-                          }
-                        }
+                    if(sig_flag==0) {
+                      nSigBk=nSigBk+1;
+                      nkp=nSigBk-1;
+                      itypeSigBk[nkp]=kp;
+                    }
+                    if(otfly==1) {
+                      cosAng_ikkp=(-dis_ik[0]*dis_kkp[0]-dis_ik[1]*dis_kkp[1]
+                          -dis_ik[2]*dis_kkp[2])/(r_ik*r_kkp);
+                      dcA_ikkp[0][0]=(dis_kkp[0]*r_ik*r_kkp-cosAng_ikkp
+                          *-dis_ik[0]*r_kkp*r_kkp)/(r_ik*r_ik*r_kkp*r_kkp);
+                      dcA_ikkp[1][0]=(dis_kkp[1]*r_ik*r_kkp-cosAng_ikkp
+                          *-dis_ik[1]*r_kkp*r_kkp)/(r_ik*r_ik*r_kkp*r_kkp);
+                      dcA_ikkp[2][0]=(dis_kkp[2]*r_ik*r_kkp-cosAng_ikkp
+                          *-dis_ik[2]*r_kkp*r_kkp)/(r_ik*r_ik*r_kkp*r_kkp);
+                      dcA_ikkp[0][1]=(-dis_ik[0]*r_ik*r_kkp-cosAng_ikkp
+                          *dis_kkp[0]*r_ik*r_ik)/(r_ik*r_ik*r_kkp*r_kkp);
+                      dcA_ikkp[1][1]=(-dis_ik[1]*r_ik*r_kkp-cosAng_ikkp
+                          *dis_kkp[1]*r_ik*r_ik)/(r_ik*r_ik*r_kkp*r_kkp);
+                      dcA_ikkp[2][1]=(-dis_ik[2]*r_ik*r_kkp-cosAng_ikkp
+                          *dis_kkp[2]*r_ik*r_ik)/(r_ik*r_ik*r_kkp*r_kkp);
+                    } else {
+                      if(kNeii<ltmp) {
+                        nikkp=kNeii*(2*nlistk-kNeii-1)/2+(ltmp-kNeii)-1;
+                        nglkp=1;
+                        ngli=0;
                       }
+                      else {
+                        nikkp=ltmp*(2*nlistk-ltmp-1)/2+(kNeii-ltmp)-1;
+                        nglkp=0;
+                        ngli=1;
+                      }
+                      ang_ikkp=cos_index[i]+nikkp;
+                      cosAng_ikkp=cosAng[ang_ikkp];
+                      dcA_ikkp[0][0]=dcAng[ang_ikkp][0][nglkp];
+                      dcA_ikkp[1][0]=dcAng[ang_ikkp][1][nglkp];
+                      dcA_ikkp[2][0]=dcAng[ang_ikkp][2][nglkp];
+                      dcA_ikkp[0][1]=dcAng[ang_ikkp][0][ngli];
+                      dcA_ikkp[1][1]=dcAng[ang_ikkp][1][ngli];
+                      dcA_ikkp[2][1]=dcAng[ang_ikkp][2][ngli];
                     }
-                    if(!same_kkp&&!same_jkp) {
-                      for(kNeikp=0;kNeikp<numneigh[k];kNeikp++) {
-                        temp_kkp=BOP_index[k]+kNeikp;
-                        kkp=klist[kNeikp];
-                        if(x[kkp][0]==x[kp][0]) {
-                          if(x[kkp][1]==x[kp][1]) {
-                            if(x[kkp][2]==x[kp][2]) {
-                              sig_flag=1;
-                              break;
-                            }
-                          }
-                        }
+                     
+                    nb_kkp=nb_t;
+                    nb_t++;
+                    if(nb_t>nb_sg) {
+                      new_n_tot=nb_sg+maxneigh;
+                      grow_sigma(nb_sg,new_n_tot);
+                      nb_sg=new_n_tot;
+                    }
+                    bt_sg[nb_kkp].temp=temp_kkp;
+                    bt_sg[nb_kkp].i=k;
+                    bt_sg[nb_kkp].j=kp;
+                    amean=cosAng_ikkp;
+                    if(amean<-1.0) amean=-1.0;
+                    if(npower<=2) {
+                      ps=(amean-1.0)*rdtheta+1.0;
+                      ks=(int)ps;
+                      if(ntheta-1<ks)
+                        ks=ntheta-1;
+                      ps=ps-ks;
+                      if(ps>1.0)
+                        ps=1.0;
+                      ks=ks-1;
+                      gfactor2=((gfunc3[itype][ktype][kptype][ks]*ps+
+                          gfunc2[itype][ktype][kptype][ks])*ps+
+                          gfunc1[itype][ktype][kptype][ks])*ps+
+                          gfunc[itype][ktype][kptype][ks];
+                      gprime2=(gfunc6[itype][ktype][kptype][ks]*ps+
+                          gfunc5[itype][ktype][kptype][ks])*ps+
+                          gfunc4[itype][ktype][kptype][ks];
+                    } else {
+                      gfactor2=gpara[itype-1][ktype-1][kptype-1][0];
+                      gprime2=0.0;
+                      xrun=1.0;
+                      for(lp1=1;lp1<npower+1;lp1++) {
+                        gprime2=gprime2+(lp1)*xrun*gpara[itype-1][ktype-1][kptype-1][lp1];
+                        xrun=xrun*amean;
+                        gfactor2=gfactor2+xrun*gpara[itype-1][ktype-1][kptype-1][lp1];
                       }
-                      if(sig_flag==1) {
-                        for(nsearch=0;nsearch<numneigh[kp];nsearch++) {
-                          ncmp=kplist[nsearch];
-                          if(x[ncmp][0]==x[j][0]) {
-                            if(x[ncmp][1]==x[j][1]) {
-                              if(x[ncmp][2]==x[j][2]) {
-                                kpNeij=nsearch;
-                              }
-                            }
-                          }
-                          if(x[ncmp][0]==x[k][0]) {
-                            if(x[ncmp][1]==x[k][1]) {
-                              if(x[ncmp][2]==x[k][2]) {
-                                kpNeik=nsearch;
-                              }
-                            }
-                          }
-                        }
-                        if(ji<ltmp) {
-                          nijkp=(ji)*numneigh[j]-(ji+1)*(ji+2)/2+ltmp;
-                          ngji=0;
-                          ngjkp=1;
-                        }
-                        else {
-                          nijkp=(ltmp)*numneigh[j]-(ltmp+1)*(ltmp+2)/2+ji;
-                          ngji=1;
-                          ngjkp=0;
-                        }
-                        if(kNeii<kNeikp) {
-                          nikkp=(kNeii)*numneigh[k]-(kNeii+1)*(kNeii+2)/2+kNeikp;
-                          ngki=0;
-                          ngkkp=1;
-                        }
-                        else {
-                          nikkp=(kNeikp)*numneigh[k]-(kNeikp+1)*(kNeikp+2)/2+kNeii;
-                          ngki=1;
-                          ngkkp=0;
-                        }
-                        if(kpNeij<kpNeik) {
-                          njkpk=(kpNeij)*numneigh[kp]-(kpNeij+1)*(kpNeij+2)/2+kpNeik;
-                          ngkpj=0;
-                          ngkpk=1;
-                        }
-                        else {
-                          njkpk=(kpNeik)*numneigh[kp]-(kpNeik+1)*(kpNeik+2)/2+kpNeij;
-                          ngkpj=1;
-                          ngkpk=0;
-                        }
-                        sig_flag=0;
-                        for(nsearch=0;nsearch<nSigBk[n];nsearch++) {
-                          ncmp=itypeSigBk[n][nsearch];
-                          if(x[ncmp][0]==x[kp][0]) {
-                            if(x[ncmp][1]==x[kp][1]) {
-                              if(x[ncmp][2]==x[kp][2]) {
-                                nkp=nsearch;
-                                sig_flag=1;
-                                break;
-                              }
-                            }
-                          }
-                        }
-                        if(sig_flag==0) {
-                          nSigBk[n]=nSigBk[n]+1;
-                          nkp=nSigBk[n]-1;
-                          itypeSigBk[n][nkp]=kp;
-                        }
-                        ang_ijkp=cos_index[j]+nijkp;
-                        ang_ikkp=cos_index[k]+nikkp;
-                        ang_jkpk=cos_index[kp]+njkpk;
-                        nb_jkp=nb_t;
-                        nb_t++;
-                        if(nb_t>nb_sg) {
-                          new_n_tot=nb_sg+maxneigh;
-                          grow_sigma(nb_sg,new_n_tot);
-                          nb_sg=new_n_tot;
-                        }
-                        bt_sg[nb_jkp].temp=temp_jkp;
-                        bt_sg[nb_jkp].i=j;
-                        bt_sg[nb_jkp].j=kp;
-                        nb_kkp=nb_t;
-                        nb_t++;
-                        if(nb_t>nb_sg) {
-                          new_n_tot=nb_sg+maxneigh;
-                          grow_sigma(nb_sg,new_n_tot);
-                          nb_sg=new_n_tot;
-                        }
-                        bt_sg[nb_kkp].temp=temp_kkp;
-                        bt_sg[nb_kkp].i=k;
-                        bt_sg[nb_kkp].j=kp;
-                        gmean0=sigma_g0[itype-1][jtype-1][kptype-1];
-                        gmean1=sigma_g1[itype-1][jtype-1][kptype-1];
-                        gmean2=sigma_g2[itype-1][jtype-1][kptype-1];
-                        amean=cosAng[ang_ijkp];
-                        gfactor2=gmean0+gmean1*amean
-                            +gmean2*amean*amean;
-                        gprime2=gmean1+2.0*gmean2*amean;
-                        gmean0=sigma_g0[itype-1][ktype-1][kptype-1];
-                        gmean1=sigma_g1[itype-1][ktype-1][kptype-1];
-                        gmean2=sigma_g2[itype-1][ktype-1][kptype-1];
-                        amean=cosAng[ang_ikkp];
-                        gfactor3=gmean0+gmean1*amean
-                            +gmean2*amean*amean;
-                        gprime3=gmean1+2.0*gmean2*amean;
-                        gmean0=sigma_g0[jtype-1][kptype-1][ktype-1];
-                        gmean1=sigma_g1[jtype-1][kptype-1][ktype-1];
-                        gmean2=sigma_g2[jtype-1][kptype-1][ktype-1];
-                        amean=cosAng[ang_jkpk];
-                        gfactor4=gmean0+gmean1*amean
-                            +gmean2*amean*amean;
-                        gprime4=gmean1+2.0*gmean2*amean;
-                        gfactor=gfactor1*gfactor2*gfactor3*gfactor4;
-                        rfactor0=(betaS[temp_ik]+small2)*(betaS[temp_jkp]+small2)
-                            *(betaS[temp_kkp]+small2);
-                        rfactor=pow(rfactor0,2.0/3.0);
-                        drfactor=2.0/3.0*pow(rfactor0,-1.0/3.0);
-
-//EE is Eq. 25(notes)
+                    }
+                    gfactorsq2=gfactor2*gfactor2;
+                    gsqprime2=2.0*gfactor2*gprime2;
+                    gfactor=gfactorsq*gfactorsq2;
+                    rfactorrt=betaS_ik*betaS_kkp;
+                    rfactor=rfactorrt*rfactorrt;
 
-                        EE=EE+gfactor*rfactor;
+//3rd CC is third term of Eq. 11 (c) for i atom
+//where j , k =neighbor of i & k' =neighbor of k
 
-//agpdpr1 is derivative of agpdpr1 w.r.t. Beta(r_ik)
-//agpdpr2 is derivative of agpdpr1 w.r.t. Beta(r_jk')
-//agpdpr3 is derivative of agpdpr1 w.r.t. Beta(r_kk')
-//app1 is derivative of agpdpr1 w.r.t. cos(theta_jik)
-//app2 is derivative of agpdpr1 w.r.t. cos(theta_ijk')
-//app3 is derivative of agpdpr1 w.r.t. cos(theta_ikk')
-//app4 is derivative of agpdpr1 w.r.t. cos(theta_jk'k)
+                    CC=CC+gfactor*rfactor;
+  
+//agpdpr1 is derivative of CC 3rd term w.r.t. Beta(r_ik)
+//agpdpr2 is derivative of CC 3rd term w.r.t. Beta(r_kk')
+//app1 is derivative of CC 3rd term w.r.t. cos(theta_jik)
+//app2 is derivative of CC 3rd term w.r.t. cos(theta_ikk')
 
-                        agpdpr1=gfactor*drfactor*(betaS[temp_jkp]+small2)*(betaS[temp_kkp]
-                            +small2)*dBetaS[temp_ik]/rij[temp_ik];
-                        agpdpr2=gfactor*drfactor*(betaS[temp_ik]+small2)*(betaS[temp_kkp]
-                            +small2)*dBetaS[temp_jkp]/rij[temp_jkp];
-                        agpdpr3=gfactor*drfactor*(betaS[temp_ik]+small2)*(betaS[temp_jkp]
-                            +small2)*dBetaS[temp_kkp]/rij[temp_kkp];
-                        app1=rfactor*gfactor2*gfactor3*gfactor4*gprime1;
-                        app2=rfactor*gfactor1*gfactor3*gfactor4*gprime2;
-                        app3=rfactor*gfactor1*gfactor2*gfactor4*gprime3;
-                        app4=rfactor*gfactor1*gfactor2*gfactor3*gprime4;
-                        bt_sg[nb_ij].dEE[0]+=
-                            app1*dcAng[ang_jik][0][ngj]
-                            -app2*dcAng[ang_ijkp][0][ngji];
-                        bt_sg[nb_ij].dEE[1]+=
-                            app1*dcAng[ang_jik][1][ngj]
-                            -app2*dcAng[ang_ijkp][1][ngji];
-                        bt_sg[nb_ij].dEE[2]+=
-                            app1*dcAng[ang_jik][2][ngj]
-                            -app2*dcAng[ang_ijkp][2][ngji];
-                        bt_sg[nb_ik].dEE[0]+=
-                            app1*dcAng[ang_jik][0][ngk]
-                            +agpdpr1*disij[0][temp_ik]
-                            -app3*dcAng[ang_ikkp][0][ngki];
-                        bt_sg[nb_ik].dEE[1]+=
-                            app1*dcAng[ang_jik][1][ngk]
-                            +agpdpr1*disij[1][temp_ik]
-                            -app3*dcAng[ang_ikkp][1][ngki];
-                        bt_sg[nb_ik].dEE[2]+=
-                            app1*dcAng[ang_jik][2][ngk]
-                            +agpdpr1*disij[2][temp_ik]
-                            -app3*dcAng[ang_ikkp][2][ngki];
-                        bt_sg[nb_jkp].dEE[0]+=
-                            app2*dcAng[ang_ijkp][0][ngjkp]
-                            +agpdpr2*disij[0][temp_jkp]
-                            -app4*dcAng[ang_jkpk][0][ngkpj];
-                        bt_sg[nb_jkp].dEE[1]+=
-                            app2*dcAng[ang_ijkp][1][ngjkp]
-                            +agpdpr2*disij[1][temp_jkp]
-                            -app4*dcAng[ang_jkpk][1][ngkpj];
-                        bt_sg[nb_jkp].dEE[2]+=
-                            app2*dcAng[ang_ijkp][2][ngjkp]
-                            +agpdpr2*disij[2][temp_jkp]
-                            -app4*dcAng[ang_jkpk][2][ngkpj];
-                        bt_sg[nb_kkp].dEE[0]+=
-                            app3*dcAng[ang_ikkp][0][ngkkp]
-                            +agpdpr3*disij[0][temp_kkp]
-                            -app4*dcAng[ang_jkpk][0][ngkpk];
-                        bt_sg[nb_kkp].dEE[1]+=
-                            app3*dcAng[ang_ikkp][1][ngkkp]
-                            +agpdpr3*disij[1][temp_kkp]
-                            -app4*dcAng[ang_jkpk][1][ngkpk];
-                        bt_sg[nb_kkp].dEE[2]+=
-                            app3*dcAng[ang_ikkp][2][ngkkp]
-                            +agpdpr3*disij[2][temp_kkp]
-                            -app4*dcAng[ang_jkpk][2][ngkpk];
-                      }
-                    }
+                    agpdpr1=2.0*gfactor*rfactorrt*betaS_kkp
+                        *dBetaS_ik/r_ik;
+                    agpdpr2=2.0*gfactor*rfactorrt*betaS_ik
+                        *dBetaS_kkp/r_kkp;
+                    app1=rfactor*gfactorsq2*gsqprime;
+                    app2=rfactor*gfactorsq*gsqprime2;
+                    bt_sg[nb_ij].dCC[0]+=
+                        app1*dcA_jik[0][0];
+                    bt_sg[nb_ij].dCC[1]+=
+                        app1*dcA_jik[1][0];
+                    bt_sg[nb_ij].dCC[2]+=
+                        app1*dcA_jik[2][0];
+                    bt_sg[nb_ik].dCC[0]+=
+                        app1*dcA_jik[0][1]
+                        +agpdpr1*dis_ik[0]
+                        -app2*dcA_ikkp[0][0];
+                    bt_sg[nb_ik].dCC[1]+=
+                        app1*dcA_jik[1][1]
+                        +agpdpr1*dis_ik[1]
+                        -app2*dcA_ikkp[1][0];
+                    bt_sg[nb_ik].dCC[2]+=
+                        app1*dcA_jik[2][1]
+                        +agpdpr1*dis_ik[2]
+                        -app2*dcA_ikkp[2][0];
+                    bt_sg[nb_kkp].dCC[0]+=
+                        app2*dcA_ikkp[0][1]
+                        +agpdpr2*dis_kkp[0];
+                    bt_sg[nb_kkp].dCC[1]+=
+                        app2*dcA_ikkp[1][1]
+                        +agpdpr2*dis_kkp[1];
+                    bt_sg[nb_kkp].dCC[2]+=
+                        app2*dcA_ikkp[2][1]
+                        +agpdpr2*dis_kkp[2];
                   }
                 }
               }
-            }
-          }
 
-//j is a neighbor of i and k is a neighbor of j not equal to i
+//j and k are different neighbors of i and k' is a neighbor j not equal to k
 
-          for(ktmp=0;ktmp<numneigh[j];ktmp++) {
-            if(ktmp!=ji) {
-              if(ktmp<ji) {
-                njik=ktmp*(2*numneigh[j]-ktmp-1)/2+(ji-ktmp)-1;
-                ngi=1;
-                ngk=0;
-              }
-              else {
-                njik=ji*(2*numneigh[j]-ji-1)/2+(ktmp-ji)-1;
-                ngi=0;
-                ngk=1;
-              }
-              temp_jk=BOP_index[j]+ktmp;
-              if(neigh_flag[temp_jk]) {
-                k=jlist[ktmp];
-                ktype=map[type[k]]+1;
-                klist=firstneigh[k];
-
-                for(kNeij=0;kNeij<numneigh[k];kNeij++) {
-                  if(x[klist[kNeij]][0]==x[j][0]) {
-                    if(x[klist[kNeij]][1]==x[j][1]) {
-                      if(x[klist[kNeij]][2]==x[j][2]) {
+              for(ltmp=0;ltmp<nlistj;ltmp++) {
+                sig_flag=0;
+                temp_jkp=BOP_index[j]+ltmp;
+                ni_jkp=neigh_index[temp_jkp];
+                kp=jlist[ni_jkp];
+                kptype = map[type[kp]]+1;
+                kplist=firstneigh[kp];
+ 
+                same_kkpk=0;
+                same_jkpj=0;
+                nlistkp=BOP_total[kp];
+                for(kpNeij=0;kpNeij<nlistkp;kpNeij++) {
+                  temp_kpj=BOP_index[kp]+kpNeij;
+                  ni_kpj=neigh_index[temp_kpj];
+                  kpj=kplist[ni_kpj];
+                  if(x[j][0]==x[kpj][0]) {
+                    if(x[j][1]==x[kpj][1]) {
+                      if(x[j][2]==x[kpj][2]) {
+                        same_jkpj=1;
                         break;
                       }
                     }
                   }
                 }
-                sig_flag=0;
-                for(nsearch=0;nsearch<nSigBk[n];nsearch++) {
-                  ncmp=itypeSigBk[n][nsearch];
-                  if(x[ncmp][0]==x[k][0]) {
-                    if(x[ncmp][1]==x[k][1]) {
-                      if(x[ncmp][2]==x[k][2]) {
-                        new1=nsearch;
-                        sig_flag=1;
+                for(kpNeik=0;kpNeik<nlistkp;kpNeik++) {
+                  temp_kpk=BOP_index[kp]+kpNeik;
+                  ni_kpk=neigh_index[temp_kpk];
+                  kpk=kplist[ni_kpk];
+                  if(x[k][0]==x[kpk][0]) {
+                    if(x[k][1]==x[kpk][1]) {
+                      if(x[k][2]==x[kpk][2]) {
+                        same_kkpk=1;
                         break;
                       }
                     }
                   }
                 }
-                if(sig_flag==0) {
-                  nSigBk[n]=nSigBk[n]+1;
-                  new1=nSigBk[n]-1;
-                  itypeSigBk[n][new1]=k;
-                }
-                ang_ijk=cos_index[j]+njik;
-                nb_jk=nb_t;
-                nb_t++;
-                if(nb_t>nb_sg) {
-                  new_n_tot=nb_sg+maxneigh;
-                  grow_sigma(nb_sg,new_n_tot);
-                  nb_sg=new_n_tot;
-                }
-                bt_sg[nb_jk].temp=temp_jk;
-                bt_sg[nb_jk].i=j;
-                bt_sg[nb_jk].j=k;
-                gmean0=sigma_g0[itype-1][jtype-1][ktype-1];
-                gmean1=sigma_g1[itype-1][jtype-1][ktype-1];
-                gmean2=sigma_g2[itype-1][jtype-1][ktype-1];
-                amean=cosAng[ang_ijk];
-                gfactor1=gmean0+gmean1*amean
-                    +gmean2*amean*amean;
-                gprime1=gmean1+2.0*gmean2*amean;
-                gfactorsq=gfactor1*gfactor1;
-                gsqprime=2.0*gfactor1*gprime1;
-                rfactor1rt=betaS[temp_jk]*betaS[temp_jk];
-                rfactor1=rfactor1rt*rfactor1rt;
-
-//BB is Eq. 34 (a) or Eq. 10 (c) for the j atom
-//1st DD is Eq. 11 (c) for j atom where i & k=neighbor of j
-
-                BB=BB+gfactorsq*rfactor1rt;
-                DD=DD+gfactorsq*rfactor1;
-
-//agpdpr1 is derivative of BB  w.r.t. Beta(r_jk)
-//app1 is derivative of BB w.r.t. cos(theta_ijk)
-
-                agpdpr1=2.0*gfactorsq*betaS[temp_jk]*dBetaS[temp_jk]/rij[temp_jk];
-                app1=rfactor1rt*gsqprime;
-                bt_sg[nb_ij].dBB[0]-=
-                    app1*dcAng[ang_ijk][0][ngi];
-                bt_sg[nb_ij].dBB[1]-=
-                    app1*dcAng[ang_ijk][1][ngi];
-                bt_sg[nb_ij].dBB[2]-=
-                    app1*dcAng[ang_ijk][2][ngi];
-                bt_sg[nb_ij].dDD[0]-=
-                    app2*dcAng[ang_ijk][0][ngi];
-                bt_sg[nb_ij].dDD[1]-=
-                    app2*dcAng[ang_ijk][1][ngi];
-                bt_sg[nb_ij].dDD[2]-=
-                    app2*dcAng[ang_ijk][2][ngi];
-                bt_sg[nb_jk].dBB[0]+=
-                    app1*dcAng[ang_ijk][0][ngk]
-                    +agpdpr1*disij[0][temp_jk];
-                bt_sg[nb_jk].dBB[1]+=
-                    app1*dcAng[ang_ijk][1][ngk]
-                    +agpdpr1*disij[1][temp_jk];
-                bt_sg[nb_jk].dBB[2]+=
-                    app1*dcAng[ang_ijk][2][ngk]
-                    +agpdpr1*disij[2][temp_jk];
-                bt_sg[nb_jk].dDD[0]+=
-                    app2*dcAng[ang_ijk][0][ngk]
-                    +agpdpr2*disij[0][temp_jk];
-                bt_sg[nb_jk].dDD[1]+=
-                    app2*dcAng[ang_ijk][1][ngk]
-                    +agpdpr2*disij[1][temp_jk];
-                bt_sg[nb_jk].dDD[2]+=
-                    app2*dcAng[ang_ijk][2][ngk]
-                    +agpdpr2*disij[2][temp_jk];
-
-//j is a neighbor of i, k and k' prime different neighbors of j not equal to i
-
-                for(ltmp=0;ltmp<ktmp;ltmp++) {
-                  if(ltmp!=ji) {
-                    temp_jkp=BOP_index[j]+ltmp;
-                    if(neigh_flag[temp_jkp]) {
-                      kp=jlist[ltmp];
-                      kptype=map[type[kp]]+1;
-                      for(nsearch=0;nsearch<nSigBk[n];nsearch++) {
-                        ncmp=itypeSigBk[n][nsearch];
-                        if(x[ncmp][0]==x[kp][0]) {
-                          if(x[ncmp][1]==x[kp][1]) {
-                            if(x[ncmp][2]==x[kp][2]) {
-                              new2=nsearch;
-                              break;
-                            }
-                          }
+                if(!same_jkpj&&!same_kkpk) {
+                  same_kkpk=0;
+                  for(kNeikp=0;kNeikp<nlistk;kNeikp++) {
+                    temp_kkp=BOP_index[k]+kNeikp;
+                    ni_kkp=neigh_index[temp_kkp];
+                    kkp=kplist[ni_kkp];
+                    if(x[kp][0]==x[kkp][0]) {
+                      if(x[kp][1]==x[kkp][1]) {
+                        if(x[kp][2]==x[kkp][2]) {
+                          sig_flag=1;
+                          break;
                         }
                       }
-                      if(ji<ltmp) {
-                        nijkp=ji*(2*numneigh[j]-ji-1)/2+(ltmp-ji)-1;
-                        ngli=0;
-                        ngl=1;
-                      }
-                      else {
-                        nijkp=ltmp*(2*numneigh[j]-ltmp-1)/2+(ji-ltmp)-1;
-                        ngli=1;
-                        ngl=0;
-                      }
-                      if(ktmp<ltmp) {
-                        nkjkp=ktmp*(2*numneigh[j]-ktmp-1)/2+(ltmp-ktmp)-1;
-                        ngjk=0;
-                        ngjkp=1;
-                      }
-                      else {
-                        nkjkp=ltmp*(2*numneigh[j]-ltmp-1)/2+(ktmp-ltmp)-1;
-                        ngjk=1;
-                        ngjkp=0;
-                      }
-                      ang_ijkp=cos_index[j]+nijkp;
-                      ang_kjkp=cos_index[j]+nkjkp;
-                      gmean0=sigma_g0[itype-1][jtype-1][kptype-1];
-                      gmean1=sigma_g1[itype-1][jtype-1][kptype-1];
-                      gmean2=sigma_g2[itype-1][jtype-1][kptype-1];
-                      amean=cosAng[ang_ijkp];
-                      gfactor2=gmean0+gmean1*amean
-                        +gmean2*amean*amean;
-                      gprime2=gmean1+2.0*gmean2*amean;
-                      gmean0=sigma_g0[ktype-1][jtype-1][kptype-1];
-                      gmean1=sigma_g1[ktype-1][jtype-1][kptype-1];
-                      gmean2=sigma_g2[ktype-1][jtype-1][kptype-1];
-                      amean=cosAng[ang_kjkp];
-                      gfactor3=gmean0+gmean1*amean
-                        +gmean2*amean*amean;
-                      gprime3=gmean1+2.0*gmean2*amean;
-                      gfactor=gfactor1*gfactor2*gfactor3;
-                      rfactorrt=betaS[temp_jk]*betaS[temp_jkp];
-                      rfactor=rfactorrt*rfactorrt;
-
-//2nd DD is Eq. 11 (c) for j atom where i , k & k'=neighbor of j
-
-                      DD=DD+2.0*gfactor*rfactor;
-
-//agpdpr1 is derivative of DD  w.r.t. Beta(r_jk)
-//agpdpr2 is derivative of DD  w.r.t. Beta(r_jk')
-//app1 is derivative of DD  w.r.t. cos(theta_ijk)
-//app2 is derivative of DD  w.r.t. cos(theta_ijkp)
-//app3 is derivative of DD  w.r.t. cos(theta_kjkp)
-
-                      agpdpr1=4.0*gfactor*rfactorrt*betaS[temp_jkp]
-                          *dBetaS[temp_jk]/rij[temp_jk];
-                          agpdpr2=4.0*gfactor*rfactorrt*betaS[temp_jk]
-                          *dBetaS[temp_jkp]/rij[temp_jkp];
-                      app1=2.0*rfactor*gfactor2*gfactor3*gprime1;
-                      app2=2.0*rfactor*gfactor1*gfactor3*gprime2;
-                      app3=2.0*rfactor*gfactor1*gfactor2*gprime3;
-                      bt_sg[nb_ij].dDD[0]-=
-                          app1*dcAng[ang_ijk][0][ngi]
-                          +app2*dcAng[ang_ijkp][0][ngli];
-                      bt_sg[nb_ij].dDD[1]-=
-                          app1*dcAng[ang_ijk][1][ngi]
-                          +app2*dcAng[ang_ijkp][1][ngli];
-                      bt_sg[nb_ij].dDD[2]-=
-                          app1*dcAng[ang_ijk][2][ngi]
-                          +app2*dcAng[ang_ijkp][2][ngli];
-                      bt_sg[nb_jk].dDD[0]+=
-                          app1*dcAng[ang_ijk][0][ngk]
-                          +app3*dcAng[ang_kjkp][0][ngjk]
-                          +agpdpr1*disij[0][temp_jk];
-                      bt_sg[nb_jk].dDD[1]+=
-                          app1*dcAng[ang_ijk][1][ngk]
-                          +app3*dcAng[ang_kjkp][1][ngjk]
-                          +agpdpr1*disij[1][temp_jk];
-                      bt_sg[nb_jk].dDD[2]+=
-                          app1*dcAng[ang_ijk][2][ngk]
-                          +app3*dcAng[ang_kjkp][2][ngjk]
-                          +agpdpr1*disij[2][temp_jk];
-                      bt_sg[nb_jkp].dDD[0]+=
-                          app2*dcAng[ang_ijkp][0][ngl]
-                          +app3*dcAng[ang_kjkp][0][ngjkp]
-                          +agpdpr2*disij[0][temp_jkp];
-                      bt_sg[nb_jkp].dDD[1]+=
-                          app2*dcAng[ang_ijkp][1][ngl]
-                          +app3*dcAng[ang_kjkp][1][ngjkp]
-                          +agpdpr2*disij[1][temp_jkp];
-                      bt_sg[nb_jkp].dDD[2]+=
-                          app2*dcAng[ang_ijkp][2][ngl]
-                          +app3*dcAng[ang_kjkp][2][ngjkp]
-                          +agpdpr2*disij[2][temp_jkp];
                     }
                   }
-                }
-
-//j is a neighbor of i, k is a neighbor of j not equal to i and k'
-//is a neighbor of k not equal to j or i
-
-                for(ltmp=0;ltmp<numneigh[k];ltmp++) {
-                  temp_kkp=BOP_index[k]+ltmp;
-                  if(neigh_flag[temp_kkp]) {
-                    kp=klist[ltmp];
-                    kptype=map[type[kp]]+1;
-                    same_ikp=0;
-                    same_jkp=0;
-                    if(x[i][0]==x[kp][0]) {
-                      if(x[i][1]==x[kp][1]) {
-                        if(x[i][2]==x[kp][2]) {
-                          same_ikp=1;
-                        }
-                      }
-                    }
-                    if(x[j][0]==x[kp][0]) {
-                      if(x[j][1]==x[kp][1]) {
-                        if(x[j][2]==x[kp][2]) {
-                          same_jkp=1;
-                        }
-                      }
-                    }
-                    if(!same_ikp&&!same_jkp) {
-                      for(kNeij=0;kNeij<numneigh[k];kNeij++) {
-                        if(x[klist[kNeij]][0]==x[j][0]) {
-                          if(x[klist[kNeij]][1]==x[j][1]) {
-                            if(x[klist[kNeij]][2]==x[j][2]) {
-                              break;
-                            }
+                  if(sig_flag==1) {
+                    for(nsearch=0;nsearch<nlistkp;nsearch++) {
+                      kp_nsearch=BOP_index[kp]+nsearch;
+                      ni_kpnsearch=neigh_index[kp_nsearch];
+                      ncmp=kplist[ni_kpnsearch];
+                      if(x[ncmp][0]==x[j][0]) {
+                        if(x[ncmp][1]==x[j][1]) {
+                          if(x[ncmp][2]==x[j][2]) {
+                            kpNeij=nsearch;
                           }
                         }
                       }
-                      if(kNeij<ltmp) {
-                        njkkp=kNeij*(2*numneigh[k]-kNeij-1)/2+(ltmp-kNeij)-1;
-                        nglkp=1;
-                        nglj=0;
-                      }
-                      else {
-                        njkkp=ltmp*(2*numneigh[k]-ltmp-1)/2+(kNeij-ltmp)-1;
-                        nglkp=0;
-                        nglj=1;
-                      }
-                      sig_flag=0;
-                      for(nsearch=0;nsearch<nSigBk[n];nsearch++) {
-                        ncmp=itypeSigBk[n][nsearch];
-                        if(x[ncmp][0]==x[kp][0]) {
-                          if(x[ncmp][1]==x[kp][1]) {
-                            if(x[ncmp][2]==x[kp][2]) {
-                              new2=nsearch;
-                              sig_flag=1;
-                              break;
-                            }
+                      if(x[ncmp][0]==x[k][0]) {
+                        if(x[ncmp][1]==x[k][1]) {
+                          if(x[ncmp][2]==x[k][2]) {
+                            kpNeik=nsearch;
                           }
                         }
                       }
-                      if(sig_flag==0) {
-                        nSigBk[n]=nSigBk[n]+1;
-                        new2=nSigBk[n]-1;
-                        itypeSigBk[n][new2]=kp;
-                      }
-                      ang_jkkp=cos_index[k]+njkkp;
-                      nb_kkp=nb_t;
-                      nb_t++;
-                      if(nb_t>nb_sg) {
-                        new_n_tot=nb_sg+maxneigh;
-                        grow_sigma(nb_sg,new_n_tot);
-                        nb_sg=new_n_tot;
-                      }
-                      bt_sg[nb_kkp].temp=temp_kkp;
-                      bt_sg[nb_kkp].i=k;
-                      bt_sg[nb_kkp].j=kp;
-                      gmean0=sigma_g0[jtype-1][ktype-1][kptype-1];
-                      gmean1=sigma_g1[jtype-1][ktype-1][kptype-1];
-                      gmean2=sigma_g2[jtype-1][ktype-1][kptype-1];
-                      amean=cosAng[ang_jkkp];
-                      gfactor2=gmean0+gmean1*amean
-                          +gmean2*amean*amean;
-                      gprime2=gmean1+2.0*gmean2*amean;
-                      gfactorsq2=gfactor2*gfactor2;
-                      gsqprime2=2.0*gfactor2*gprime2;
-                      gfactor=gfactorsq*gfactorsq2;
-                      rfactorrt=betaS[temp_jk]*betaS[temp_kkp];
-                      rfactor=rfactorrt*rfactorrt;
-
-//3rd DD is Eq. 11 (c) for j atom where i & k=neighbor of j & k'=neighbor of k
-
-                      DD=DD+gfactor*rfactor;
-
-//agpdpr1 is derivative of DD  3rd term w.r.t. Beta(r_jk)
-//agpdpr2 is derivative of DD  3rd term w.r.t. Beta(r_kk')
-//app1 is derivative of DD  3rd term w.r.t. cos(theta_ijk)
-//app2 is derivative of DD  3rd term w.r.t. cos(theta_jkkp)
-
-                      agpdpr1=2.0*gfactor*rfactorrt*betaS[temp_kkp]
-                          *dBetaS[temp_jk]/rij[temp_jk];
-                      agpdpr2=2.0*gfactor*rfactorrt*betaS[temp_jk]
-                          *dBetaS[temp_kkp]/rij[temp_kkp];
-                      app1=rfactor*gfactorsq2*gsqprime;
-                      app2=rfactor*gfactorsq*gsqprime2;
-                      bt_sg[nb_ij].dDD[0]-=
-                          app1*dcAng[ang_ijk][0][ngi];
-                      bt_sg[nb_ij].dDD[1]-=
-                          app1*dcAng[ang_ijk][1][ngi];
-                      bt_sg[nb_ij].dDD[2]-=
-                          app1*dcAng[ang_ijk][2][ngi];
-                      bt_sg[nb_jk].dDD[0]+=
-                          app1*dcAng[ang_ijk][0][ngk]
-                          +agpdpr1*disij[0][temp_jk]
-                          -app2*dcAng[ang_jkkp][0][nglj];
-                      bt_sg[nb_jk].dDD[1]+=
-                          app1*dcAng[ang_ijk][1][ngk]
-                          +agpdpr1*disij[1][temp_jk]
-                          -app2*dcAng[ang_jkkp][1][nglj];
-                      bt_sg[nb_jk].dDD[2]+=
-                          app1*dcAng[ang_ijk][2][ngk]
-                          +agpdpr1*disij[2][temp_jk]
-                          -app2*dcAng[ang_jkkp][2][nglj];
-                      bt_sg[nb_kkp].dDD[0]+=
-                          app2*dcAng[ang_jkkp][0][nglkp]
-                          +agpdpr2*disij[0][temp_kkp];
-                      bt_sg[nb_kkp].dDD[1]+=
-                          app2*dcAng[ang_jkkp][1][nglkp]
-                          +agpdpr2*disij[1][temp_kkp];
-                      bt_sg[nb_kkp].dDD[2]+=
-                          app2*dcAng[ang_jkkp][2][nglkp]
-                          +agpdpr2*disij[2][temp_kkp];
                     }
-                  }
-                }
-              }
-            }
-          }
-
-          sig_flag=0;
-          if(FF<=0.000001) {
-            sigB[n]=0.0;
-            sig_flag=1;
-          }
-          if(sig_flag==0) {
-            if(AA<0.0)
-              AA=0.0;
-            if(BB<0.0)
-              BB=0.0;
-            if(CC<0.0)
-              CC=0.0;
-            if(DD<0.0)
-              DD=0.0;
-
-// AA and BB are the representations of (a) Eq. 34 and (b) Eq. 9
-// for atoms i and j respectively
-
-            AAC=AA+BB;
-            BBC=AA*BB;
-            CCC=AA*AA+BB*BB;
-            DDC=CC+DD;
-
-//EEC is a modified form of (a) Eq. 33
-
-            EEC=(DDC-CCC)/(AAC+2.0*small1);
-            AACFF=1.0/(AAC+2.0*small1);
-            for(m=0;m<nb_t;m++) {
-              if((bt_sg[m].i>-1)&&(bt_sg[m].j>-1)) {
-                bt_i=bt_sg[m].i;
-                bt_j=bt_sg[m].j;
-                bt_sg[m].dAAC[0]=bt_sg[m].dAA[0]
-                    +bt_sg[m].dBB[0];
-                bt_sg[m].dAAC[1]=bt_sg[m].dAA[1]
-                    +bt_sg[m].dBB[1];
-                bt_sg[m].dAAC[2]=bt_sg[m].dAA[2]
-                    +bt_sg[m].dBB[2];
-                bt_sg[m].dBBC[0]=bt_sg[m].dAA[0]*BB
-                    +AA*bt_sg[m].dBB[0];
-                bt_sg[m].dBBC[1]=bt_sg[m].dAA[1]*BB
-                    +AA*bt_sg[m].dBB[1];
-                bt_sg[m].dBBC[2]=bt_sg[m].dAA[2]*BB
-                    +AA*bt_sg[m].dBB[2];
-                bt_sg[m].dCCC[0]=2.0*AA*bt_sg[m].dAA[0]
-                    +2.0*BB*bt_sg[m].dBB[0];
-                bt_sg[m].dCCC[1]=2.0*AA*bt_sg[m].dAA[1]
-                    +2.0*BB*bt_sg[m].dBB[1];
-                bt_sg[m].dCCC[2]=2.0*AA*bt_sg[m].dAA[2]
-                    +2.0*BB*bt_sg[m].dBB[2];
-                bt_sg[m].dDDC[0]=bt_sg[m].dCC[0]
-                    +bt_sg[m].dDD[0];
-                bt_sg[m].dDDC[1]=bt_sg[m].dCC[1]
-                    +bt_sg[m].dDD[1];
-                bt_sg[m].dDDC[2]=bt_sg[m].dCC[2]
-                    +bt_sg[m].dDD[2];
-                bt_sg[m].dEEC[0]=(bt_sg[m].dDDC[0]
-                    -bt_sg[m].dCCC[0]
-                    -EEC*bt_sg[m].dAAC[0])*AACFF;
-                bt_sg[m].dEEC[1]=(bt_sg[m].dDDC[1]
-                    -bt_sg[m].dCCC[1]
-                    -EEC*bt_sg[m].dAAC[1])*AACFF;
-                bt_sg[m].dEEC[2]=(bt_sg[m].dDDC[2]
-                    -bt_sg[m].dCCC[2]
-                    -EEC*bt_sg[m].dAAC[2])*AACFF;
-              }
-            }
-            UT=EEC*FF+BBC+small3[iij];
-            UT=1.0/sqrt(UT);
-
-// FFC is slightly modified form of (a) Eq. 31
-// GGC is slightly modified form of (a) Eq. 32
-// bndtmp is a slightly modified form of (a) Eq. 30 and (b) Eq. 8
-
-            FFC=BBC*UT;
-            GGC=EEC*UT;
-            bndtmp=(FF+sigma_delta[iij]*sigma_delta[iij])
-                +sigma_c[iij]*AAC+small4;
-            UTcom=-0.5*UT*UT*UT;
-            for(m=0;m<nb_t;m++) {
-              if((bt_sg[m].i>-1)&&(bt_sg[m].j>-1)) {
-                bt_sg[m].dUT[0]=UTcom*(bt_sg[m].dEEC[0]*FF
-                    +EEC*bt_sg[m].dFF[0]+bt_sg[m].dBBC[0]);
-                bt_sg[m].dUT[1]=UTcom*(bt_sg[m].dEEC[1]*FF
-                    +EEC*bt_sg[m].dFF[1]+bt_sg[m].dBBC[1]);
-                bt_sg[m].dUT[2]=UTcom*(bt_sg[m].dEEC[2]*FF
-                    +EEC*bt_sg[m].dFF[2]+bt_sg[m].dBBC[2]);
-                bt_sg[m].dFFC[0]=bt_sg[m].dBBC[0]*UT
-                    +BBC*bt_sg[m].dUT[0];
-                bt_sg[m].dFFC[1]=bt_sg[m].dBBC[1]*UT
-                    +BBC*bt_sg[m].dUT[1];
-                bt_sg[m].dFFC[2]=bt_sg[m].dBBC[2]*UT
-                    +BBC*bt_sg[m].dUT[2];
-                bt_sg[m].dGGC[0]=bt_sg[m].dEEC[0]*UT
-                    +EEC*bt_sg[m].dUT[0];
-                bt_sg[m].dGGC[1]=bt_sg[m].dEEC[1]*UT
-                    +EEC*bt_sg[m].dUT[1];
-                bt_sg[m].dGGC[2]=bt_sg[m].dEEC[2]*UT
-                    +EEC*bt_sg[m].dUT[2];
-              }
-            }
-            psign=1.0;
-            if(1.0+sigma_a[iij]*GGC<0.0)
-              psign=-1.0;
-            bndtmp0=1.0/sqrt(bndtmp);
-            sigB1[n]=psign*betaS[temp_ij]*(1.0+sigma_a[iij]*GGC)*bndtmp0;
-            bndtmp=-0.5*bndtmp0*bndtmp0*bndtmp0;
-            bndtmp1=psign*(1.0+sigma_a[iij]*GGC)*bndtmp0+psign*betaS[temp_ij]
-                *(1.0+sigma_a[iij]*GGC)*bndtmp*2.0*betaS[temp_ij]*(1.0
-                +sigma_a[iij]*GGC)*(1.0+sigma_a[iij]*GGC);
-            bndtmp1=bndtmp1*dBetaS[temp_ij]/rij[temp_ij];
-            bndtmp2=psign*betaS[temp_ij]*(1.0+sigma_a[iij]*GGC)*bndtmp*sigma_c[iij];
-            bndtmp3=psign*betaS[temp_ij]*(1.0+sigma_a[iij]*GGC)
-                *bndtmp*sigma_c[iij]*sigma_a[iij];
-            bndtmp4=psign*betaS[temp_ij]*(1.0+sigma_a[iij]*GGC)
-                *bndtmp*sigma_c[iij]*sigma_a[iij]*(2.0+GGC);
-            bndtmp5=sigma_a[iij]*psign*betaS[temp_ij]*bndtmp0
-                +psign*betaS[temp_ij]*(1.0+sigma_a[iij]*GGC)*bndtmp
-                *(2.0*(FF+sigma_delta[iij]*sigma_delta[iij])*(1.0
-                +sigma_a[iij]*GGC)*sigma_a[iij]+sigma_c[iij]*sigma_a[iij]*FFC);
-            setting=0;
-            for(m=0;m<nb_t;m++) {
-              if((bt_sg[m].i>-1)&&(bt_sg[m].j>-1)) {
-                temp_kk=bt_sg[m].temp;
-                if(temp_kk==temp_ij&&setting==0) {
-                  bt_sg[m].dSigB1[0]=bndtmp1*disij[0][temp_ij]
-                      +(bndtmp2*bt_sg[m].dAAC[0]
-                      +bndtmp3*bt_sg[m].dEE[0]
-                      +bndtmp4*bt_sg[m].dFFC[0]
-                      +bndtmp5*bt_sg[m].dGGC[0]);
-                  bt_sg[m].dSigB1[1]=bndtmp1*disij[1][temp_ij]
-                      +(bndtmp2*bt_sg[m].dAAC[1]
-                      +bndtmp3*bt_sg[m].dEE[1]
-                      +bndtmp4*bt_sg[m].dFFC[1]
-                      +bndtmp5*bt_sg[m].dGGC[1]);
-                  bt_sg[m].dSigB1[2]=bndtmp1*disij[2][temp_ij]
-                      +(bndtmp2*bt_sg[m].dAAC[2]
-                      +bndtmp3*bt_sg[m].dEE[2]
-                      +bndtmp4*bt_sg[m].dFFC[2]
-                      +bndtmp5*bt_sg[m].dGGC[2]);
-                  setting=1;
-                }
-                else if(temp_kk==temp_ji&&setting==0) {
-                  bt_sg[m].dSigB1[0]=-bndtmp1*disij[0][temp_ij]
-                      +(bndtmp2*bt_sg[m].dAAC[0]
-                      +bndtmp3*bt_sg[m].dEE[0]
-                      +bndtmp4*bt_sg[m].dFFC[0]
-                      +bndtmp5*bt_sg[m].dGGC[0]);
-                  bt_sg[m].dSigB1[1]=-bndtmp1*disij[1][temp_ij]
-                      +(bndtmp2*bt_sg[m].dAAC[1]
-                      +bndtmp3*bt_sg[m].dEE[1]
-                      +bndtmp4*bt_sg[m].dFFC[1]
-                      +bndtmp5*bt_sg[m].dGGC[1]);
-                  bt_sg[m].dSigB1[2]=-bndtmp1*disij[2][temp_ij]
-                      +(bndtmp2*bt_sg[m].dAAC[2]
-                      +bndtmp3*bt_sg[m].dEE[2]
-                      +bndtmp4*bt_sg[m].dFFC[2]
-                      +bndtmp5*bt_sg[m].dGGC[2]);
-                  setting=1;
-                }
-                else {
-                  bt_sg[m].dSigB1[0]=(bndtmp2*bt_sg[m].dAAC[0]
-                      +bndtmp3*bt_sg[m].dEE[0]
-                      +bndtmp4*bt_sg[m].dFFC[0]
-                      +bndtmp5*bt_sg[m].dGGC[0]);
-                  bt_sg[m].dSigB1[1]=(bndtmp2*bt_sg[m].dAAC[1]
-                      +bndtmp3*bt_sg[m].dEE[1]
-                      +bndtmp4*bt_sg[m].dFFC[1]
-                      +bndtmp5*bt_sg[m].dGGC[1]);
-                  bt_sg[m].dSigB1[2]=(bndtmp2*bt_sg[m].dAAC[2]
-                      +bndtmp3*bt_sg[m].dEE[2]
-                      +bndtmp4*bt_sg[m].dFFC[2]
-                      +bndtmp5*bt_sg[m].dGGC[2]);
-                }
-              }
-            }
-
-//This loop is to ensure there is not an error for atoms with no neighbors (deposition)
-
-            if(nb_t==0) {
-              if(j>i) {
-                bt_sg[0].dSigB1[0]=bndtmp1*disij[0][temp_ij];
-                bt_sg[0].dSigB1[1]=bndtmp1*disij[1][temp_ij];
-                bt_sg[0].dSigB1[2]=bndtmp1*disij[2][temp_ij];
-              }
-              else {
-                bt_sg[0].dSigB1[0]=-bndtmp1*disij[0][temp_ij];
-                bt_sg[0].dSigB1[1]=-bndtmp1*disij[1][temp_ij];
-                bt_sg[0].dSigB1[2]=-bndtmp1*disij[2][temp_ij];
-              }
-              for(pp=0;pp<3;pp++) {
-                bt_sg[0].dAA[pp]=0.0;
-                bt_sg[0].dBB[pp]=0.0;
-                bt_sg[0].dCC[pp]=0.0;
-                bt_sg[0].dDD[pp]=0.0;
-                bt_sg[0].dEE[pp]=0.0;
-                bt_sg[0].dEE1[pp]=0.0;
-                bt_sg[0].dFF[pp]=0.0;
-                bt_sg[0].dAAC[pp]=0.0;
-                bt_sg[0].dBBC[pp]=0.0;
-                bt_sg[0].dCCC[pp]=0.0;
-                bt_sg[0].dDDC[pp]=0.0;
-                bt_sg[0].dEEC[pp]=0.0;
-                bt_sg[0].dFFC[pp]=0.0;
-                bt_sg[0].dGGC[pp]=0.0;
-                bt_sg[0].dUT[pp]=0.0;
-                bt_sg[0].dSigB1[pp]=0.0;
-                bt_sg[0].dSigB[pp]=0.0;
-              }
-              bt_sg[0].i=i;
-              bt_sg[0].j=j;
-              bt_sg[0].temp=temp_ij;
-              nb_t++;
-              if(nb_t>nb_sg) {
-                new_n_tot=nb_sg+maxneigh;
-                grow_sigma(nb_sg,new_n_tot);
-                nb_sg=new_n_tot;
-              }
-            }
-            ps=sigB1[n]*rdBO+1.0;
-            ks=(int)ps;
-            if(nBOt-1<ks)
-              ks=nBOt-1;
-            ps=ps-ks;
-            if(ps>1.0)
-              ps=1.0;
-            dsigB1=((FsigBO3[iij][ks-1]*ps+FsigBO2[iij][ks-1])*ps
-                +FsigBO1[iij][ks-1])*ps+FsigBO[iij][ks-1];
-            dsigB2=(FsigBO6[iij][ks-1]*ps+FsigBO5[iij][ks-1])*ps+FsigBO4[iij][ks-1];
-            part0=(FF+0.5*AAC+small5);
-            part1=(sigma_f[iij]-0.5)*sigma_k[iij];
-            part2=1.0-part1*EE1/part0;
-            part3=dsigB1*part1/part0;
-            part4=part3/part0*EE1;
-
-// sigB is the final expression for (a) Eq. 6 and (b) Eq. 11
-
-            sigB[n]=dsigB1*part2;
-            pp1=2.0*betaS[temp_ij];
-            for(m=0;m<nb_t;m++) {
-              if((bt_sg[m].i>-1)&&(bt_sg[m].j>-1)) {
-                temp_kk=bt_sg[m].temp;
-                bt_ij=bt_sg[m].temp;
-                bt_i=bt_sg[m].i;
-                bt_j=bt_sg[m].j;
-                for(pp=0;pp<3;pp++) {
-                  bt_sg[m].dSigB[pp]=dsigB2*part2*bt_sg[m].dSigB1[pp]
-                      -part3*bt_sg[m].dEE1[pp]
-                      +part4*(bt_sg[m].dFF[pp]
-                      +0.5*bt_sg[m].dAAC[pp]);
-                }
-                for(pp=0;pp<3;pp++) {
-                  ftmp[pp]=pp1*bt_sg[m].dSigB[pp];
-                  f[bt_i][pp]-=ftmp[pp];
-                  f[bt_j][pp]+=ftmp[pp];
-                }
-                if(evflag) {
-                  ev_tally_xyz(bt_i,bt_j,nlocal,newton_pair,0.0,0.0,ftmp[0],ftmp[1]
-                      ,ftmp[2],disij[0][bt_ij],disij[1][bt_ij],disij[2][bt_ij]);
-                }
-              }
-            }
-          }
-          n++;
-        }
-      }
-    }
-  }
-  if(allocate_sigma)
-    destroy_sigma();
-}
-
-/* ---------------------------------------------------------------------- */
-
-void PairBOP::sigmaBo_noa()
-{
-  int nb_t,new_n_tot;
-  int n,i,j,k,kp,m,pp;
-  int iij,ji,ki;
-  int itmp,jtmp,ktmp,ltmp,mtmp;
-  tagint i_tag,j_tag;
-  int ngi,ngj,ngk;
-  int ngji,ngjk,nikj,ngki,ngkj;
-  int njik,nijk,nikkp,nkp,nijkp;
-  int nkikp,njikp,nk0,nkjkp,njkkp;
-  int jNeik,kNeii,kNeij;
-  int new1,new2,nlocal,nsearch;
-  int inum,*ilist,*iilist,*jlist,*klist;
-  int **firstneigh,*numneigh;
-  int temp_ji,temp_ikp,temp_kkp;
-  int temp_ij,temp_ik,temp_jkp,temp_kk,temp_jk;
-  int ang_ijkp,ang_ikkp,ang_kjkp;
-  int ang_ijk,ang_ikj,ang_jikp,ang_jkkp;
-  int ang_jik,ang_kikp;
-  int nb_ij,nb_ik,nb_jk;
-  int sig_flag,setting,ncmp,ks;
-  int itype,jtype,ktype,kptype;
-  int bt_i,bt_j,bt_ij;
-  int kp_index,same_ikp,same_jkp;
-  double AA,BB,CC,DD,EE1,FF;
-  double AAC,BBC,CCC,DDC,EEC;
-  double UT,bndtmp;
-  double amean,gmean0,gmean1,gmean2,ps;
-  double gfactor1,gprime1,gsqprime;
-  double gfactorsq,gfactor2,gprime2;
-  double gfactorsq2;
-  double gfactor3,gprime3,gfactor,rfactor;
-  double rfactorrt,rfactor1rt,rfactor1;
-  double rcm1,rcm2,gcm1,gcm2,gcm3;
-  double agpdpr1,app1;
-  double dsigB1,dsigB2;
-  double part0,part1,part2,part3,part4;
-  double psign,bndtmp0,pp1,bndtmp1,bndtmp2;
-  double ftmp[3];
-  double **x = atom->x;
-  double **f = atom->f;
-  tagint *tag = atom->tag;
-  int newton_pair = force->newton_pair;
-  int *type = atom->type;
-
-  nlocal = atom->nlocal;
-  firstneigh = list->firstneigh;
-  numneigh = list->numneigh;
-  inum = list->inum;
-  ilist = list->ilist;
-  n=0;
-
-//loop over all local atoms
-
-  if(nb_sg>16) {
-    nb_sg=16;
-  }
-  if(nb_sg==0) {
-    nb_sg=(maxneigh)*(maxneigh/2);
-  }
-  if(allocate_sigma) {
-    destroy_sigma();
-  }
-  create_sigma(nb_sg);
-  for(itmp=0;itmp<inum;itmp++) {
-    i = ilist[itmp];
-    i_tag=tag[i];
-    itype = map[type[i]]+1;
-
-//j is loop over all neighbors of i
-
-    for(jtmp=0;jtmp<numneigh[i];jtmp++) {
-      temp_ij=BOP_index[i]+jtmp;
-      if(neigh_flag[temp_ij]) {
-        for(m=0;m<nb_sg;m++) {
-          for(pp=0;pp<3;pp++) {
-            bt_sg[m].dAA[pp]=0.0;
-            bt_sg[m].dBB[pp]=0.0;
-            bt_sg[m].dEE1[pp]=0.0;
-            bt_sg[m].dFF[pp]=0.0;
-            bt_sg[m].dAAC[pp]=0.0;
-            bt_sg[m].dSigB1[pp]=0.0;
-            bt_sg[m].dSigB[pp]=0.0;
-          }
-          bt_sg[m].i=-1;
-          bt_sg[m].j=-1;
-        }
-        nb_t=0;
-        iilist=firstneigh[i];
-        j=iilist[jtmp];
-        jlist=firstneigh[j];
-        for(ki=0;ki<numneigh[j];ki++) {
-          if(x[jlist[ki]][0]==x[i][0]) {
-            if(x[jlist[ki]][1]==x[i][1]) {
-              if(x[jlist[ki]][2]==x[i][2]) {
-                break;
-              }
-            }
-          }
-        }
-        j_tag=tag[j];
-        jtype = map[type[j]]+1;
-        nb_ij=nb_t;
-        nb_t++;
-        if(nb_t>nb_sg) {
-          new_n_tot=nb_sg+maxneigh;
-          grow_sigma(nb_sg,new_n_tot);
-          nb_sg=new_n_tot;
-        }
-        bt_sg[nb_ij].temp=temp_ij;
-        bt_sg[nb_ij].i=i;
-        bt_sg[nb_ij].j=j;
-        if(j_tag>=i_tag) {
-          if(itype==jtype)
-            iij=itype-1;
-          else if(itype<jtype)
-            iij=itype*bop_types-itype*(itype+1)/2+jtype-1;
-          else
-            iij=jtype*bop_types-jtype*(jtype+1)/2+itype-1;
-          for(ji=0;ji<numneigh[j];ji++) {
-            temp_ji=BOP_index[j]+ji;
-            if(x[jlist[ji]][0]==x[i][0]) {
-              if(x[jlist[ji]][1]==x[i][1]) {
-                if(x[jlist[ji]][2]==x[i][2]) {
-                  break;
-                }
-              }
-            }
-          }
-          nSigBk[n]=0;
-
-//AA-EE1 are the components making up Eq. 30 (a)
-
-          AA=0.0;
-          BB=0.0;
-          CC=0.0;
-          DD=0.0;
-          EE1=0.0;
-
-//FF is the Beta_sigma^2 term
-
-          FF=betaS[temp_ij]*betaS[temp_ij];
-
-//agpdpr1 is derivative of FF w.r.t. r_ij
-
-          agpdpr1=2.0*betaS[temp_ij]*dBetaS[temp_ij]/rij[temp_ij];
-
-//dXX derivatives are taken with respect to all pairs contributing to the energy
-//nb_ij is derivative w.r.t. ij pair
-
-          bt_sg[nb_ij].dFF[0]=agpdpr1*disij[0][temp_ij];
-          bt_sg[nb_ij].dFF[1]=agpdpr1*disij[1][temp_ij];
-          bt_sg[nb_ij].dFF[2]=agpdpr1*disij[2][temp_ij];
-
-//k is loop over all neighbors of i again with j neighbor of i
-          for(ktmp=0;ktmp<numneigh[i];ktmp++) {
-            temp_ik=BOP_index[i]+ktmp;
-            if(neigh_flag[temp_ik]) {
-              if(ktmp!=jtmp) {
-                if(jtmp<ktmp) {
-                  njik=jtmp*(2*numneigh[i]-jtmp-1)/2+(ktmp-jtmp)-1;
-                  ngj=0;
-                  ngk=1;
-                }
-                else {
-                  njik=ktmp*(2*numneigh[i]-ktmp-1)/2+(jtmp-ktmp)-1;
-                  ngj=1;
-                  ngk=0;
-                }
-                k=iilist[ktmp];
-                ktype = map[type[k]]+1;
-
-//find neighbor of k that is equal to i
-
-                klist=firstneigh[k];
-                for(kNeii=0;kNeii<numneigh[k];kNeii++) {
-                  if(x[klist[kNeii]][0]==x[i][0]) {
-                    if(x[klist[kNeii]][1]==x[i][1]) {
-                      if(x[klist[kNeii]][2]==x[i][2]) {
-                        break;
-                      }
-                    }
-                  }
-                }
-
-//find neighbor of i that is equal to k
-
-                for(jNeik=0;jNeik<numneigh[j];jNeik++) {
-                  temp_jk=BOP_index[j]+jNeik;
-                  if(x[jlist[jNeik]][0]==x[k][0]) {
-                    if(x[jlist[jNeik]][1]==x[k][1]) {
-                      if(x[jlist[jNeik]][2]==x[k][2]) {
-                        break;
-                      }
-                    }
-                  }
-                }
-
-//find neighbor of k that is equal to j
-
-                for(kNeij=0;kNeij<numneigh[k];kNeij++) {
-                  if(x[klist[kNeij]][0]==x[j][0]) {
-                    if(x[klist[kNeij]][1]==x[j][1]) {
-                      if(x[klist[kNeij]][2]==x[j][2]) {
-                        break;
-                      }
-                    }
-                  }
-                }
-                sig_flag=0;
-                for(nsearch=0;nsearch<nSigBk[n];nsearch++) {
-                  ncmp=itypeSigBk[n][nsearch];
-                  if(x[ncmp][0]==x[k][0]) {
-                    if(x[ncmp][1]==x[k][1]) {
-                      if(x[ncmp][2]==x[k][2]) {
-                        nk0=nsearch;
-                        sig_flag=1;
-                        break;
-                      }
-                    }
-                  }
-                }
-                if(sig_flag==0) {
-                  nSigBk[n]=nSigBk[n]+1;
-                  nk0=nSigBk[n]-1;
-                  itypeSigBk[n][nk0]=k;
-                }
-                nb_ik=nb_t;
-                nb_t++;
-                if(nb_t>nb_sg) {
-                  new_n_tot=nb_sg+maxneigh;
-                  grow_sigma(nb_sg,new_n_tot);
-                  nb_sg=new_n_tot;
-                }
-                bt_sg[nb_ik].temp=temp_ik;
-                bt_sg[nb_ik].i=i;
-                bt_sg[nb_ik].j=k;
-                nb_jk=nb_t;
-                nb_t++;
-                if(nb_t>nb_sg) {
-                  new_n_tot=nb_sg+maxneigh;
-                  grow_sigma(nb_sg,new_n_tot);
-                  nb_sg=new_n_tot;
-                }
-                bt_sg[nb_jk].temp=temp_jk;
-                bt_sg[nb_jk].i=j;
-                bt_sg[nb_jk].j=k;
-                ang_jik=cos_index[i]+njik;
-                if(ang_jik>=cos_total) {
-                  error->one(FLERR,"Too many atom triplets for pair bop");
-                }
-                gmean0=sigma_g0[jtype-1][itype-1][ktype-1];
-                gmean1=sigma_g1[jtype-1][itype-1][ktype-1];
-                gmean2=sigma_g2[jtype-1][itype-1][ktype-1];
-                amean=cosAng[ang_jik];
-                gfactor1=gmean0+gmean1*amean
-                    +gmean2*amean*amean;
-                gfactorsq=gfactor1*gfactor1;
-                gprime1=gmean1+2.0*gmean2*amean;
-                gsqprime=2.0*gfactor1*gprime1;
-
-//AA is Eq. 34 (a) or Eq. 10 (c) for the i atom
-//1st CC is Eq. 11 (c) for i atom where j & k=neighbor of i
-
-                AA=AA+gfactorsq*betaS[temp_ik]*betaS[temp_ik];
-                CC=CC+gfactorsq*betaS[temp_ik]*betaS[temp_ik]*betaS[temp_ik]*betaS[temp_ik];
-//agpdpr1 is derivative of AA w.r.t. Beta(rik)
-//agpdpr2 is derivative of CC 1st term w.r.t. Beta(rik)
-//app1 is derivative of AA w.r.t. cos(theta_jik)
-//app2 is derivative of CC 1st term w.r.t. cos(theta_jik)
-
-                agpdpr1=2.0*gfactorsq*betaS[temp_ik]*dBetaS[temp_ik]/rij[temp_ik];
-                app1=betaS[temp_ik]*betaS[temp_ik]*gsqprime;
-                bt_sg[nb_ij].dAA[0]+=
-                    app1*dcAng[ang_jik][0][ngj];
-                bt_sg[nb_ij].dAA[1]+=
-                    app1*dcAng[ang_jik][1][ngj];
-                bt_sg[nb_ij].dAA[2]+=
-                    app1*dcAng[ang_jik][2][ngj];
-                bt_sg[nb_ik].dAA[0]+=
-                    app1*dcAng[ang_jik][0][ngk]
-                    +agpdpr1*disij[0][temp_ik];
-                bt_sg[nb_ik].dAA[1]+=
-                    app1*dcAng[ang_jik][1][ngk]
-                    +agpdpr1*disij[1][temp_ik];
-                bt_sg[nb_ik].dAA[2]+=
-                    app1*dcAng[ang_jik][2][ngk]
-                    +agpdpr1*disij[2][temp_ik];
-
-//k' is loop over neighbors all neighbors of j with k a neighbor
-//of i and j a neighbor of i and determine which k' is k
-
-                kp_index=0;
-                for(ltmp=0;ltmp<numneigh[j];ltmp++) {
-                  temp_jkp=BOP_index[j]+ltmp;
-                  kp=jlist[ltmp];
-                  if(x[kp][0]==x[k][0]) {
-                    if(x[kp][1]==x[k][1]) {
-                      if(x[kp][2]==x[k][2]) {
-                        kp_index=1;
-                        break;
-                      }
-                    }
-                  }
-                }
-                if(kp_index) {
-
-//loop over neighbors of k
-
-                  for(mtmp=0;mtmp<numneigh[k];mtmp++) {
-                    kp=klist[mtmp];
-                    if(x[kp][0]==x[j][0]) {
-                      if(x[kp][1]==x[j][1]) {
-                        if(x[kp][2]==x[j][2]) {
-                          break;
-                        }
-                      }
-                    }
-                  }
-                  if(ki<ltmp) {
-                    nijk=ki*(2*numneigh[j]-ki-1)/2+(ltmp-ki)-1;
-                    ngji=0;
-                    ngjk=1;
-                  }
-                  else {
-                    nijk=ltmp*(2*numneigh[j]-ltmp-1)/2+(ki-ltmp)-1;
-                    ngji=1;
-                    ngjk=0;
-                  }
-                  if(kNeii<mtmp) {
-                    nikj=kNeii*(2*numneigh[k]-kNeii-1)/2+(mtmp-kNeii)-1;
-                    ngki=0;
-                    ngkj=1;
-                  }
-                  else {
-                    nikj=mtmp*(2*numneigh[k]-mtmp-1)/2+(kNeii-mtmp)-1;
-                    ngki=1;
-                    ngkj=0;
-                  }
-                  ang_ijk=cos_index[j]+nijk;
-                  if(ang_ijk>=cos_total) {
-                    error->one(FLERR,"Too many atom triplets for pair bop");
-                  }
-                  gmean0=sigma_g0[itype-1][jtype-1][ktype-1];
-                  gmean1=sigma_g1[itype-1][jtype-1][ktype-1];
-                  gmean2=sigma_g2[itype-1][jtype-1][ktype-1];
-                  amean=cosAng[ang_ijk];
-                  gfactor2=gmean0+gmean1*amean
-                      +gmean2*amean*amean;
-                  gprime2=gmean1+2.0*gmean2*amean;
-                  gmean0=sigma_g0[itype-1][ktype-1][jtype-1];
-                  gmean1=sigma_g1[itype-1][ktype-1][jtype-1];
-                  gmean2=sigma_g2[itype-1][ktype-1][jtype-1];
-                  ang_ikj=cos_index[k]+nikj;
-                  if(ang_ikj>=cos_total) {
-                    error->one(FLERR,"Too many atom triplets for pair bop");
-                  }
-                  amean=cosAng[ang_ikj];
-                  gfactor3=gmean0+gmean1*amean
-                      +gmean2*amean*amean;
-                  gprime3=gmean1+2.0*gmean2*amean;
-                  gfactor=gfactor1*gfactor2*gfactor3;
-                  rfactor=betaS[temp_ik]*betaS[temp_jkp];
-
-//EE1 is (b) Eq. 12
-
-                  EE1=EE1+gfactor*rfactor;
-
-//rcm2 is derivative of EE1 w.r.t Beta(r_jk')
-//gcm1 is derivative of EE1 w.r.t cos(theta_jik)
-//gcm2 is derivative of EE1 w.r.t cos(theta_ijk)
-//gcm3 is derivative of EE1 w.r.t cos(theta_ikj)
-
-                  rcm1=gfactor*betaS[temp_jkp]*dBetaS[temp_ik]/rij[temp_ik];
-                  rcm2=gfactor*betaS[temp_ik]*dBetaS[temp_jkp]/rij[temp_jkp];
-                  gcm1=rfactor*gprime1*gfactor2*gfactor3;
-                  gcm2=rfactor*gfactor1*gprime2*gfactor3;
-                  gcm3=rfactor*gfactor1*gfactor2*gprime3;
-                  bt_sg[nb_ij].dEE1[0]+=
-                      gcm1*dcAng[ang_jik][0][ngj]
-                      -gcm2*dcAng[ang_ijk][0][ngji];
-                  bt_sg[nb_ij].dEE1[1]+=
-                      gcm1*dcAng[ang_jik][1][ngj]
-                      -gcm2*dcAng[ang_ijk][1][ngji];
-                  bt_sg[nb_ij].dEE1[2]+=
-                      gcm1*dcAng[ang_jik][2][ngj]
-                      -gcm2*dcAng[ang_ijk][2][ngji];
-                  bt_sg[nb_ik].dEE1[0]+=
-                      gcm1*dcAng[ang_jik][0][ngk]
-                      +rcm1*disij[0][temp_ik]
-                      -gcm3*dcAng[ang_ikj][0][ngki];
-                  bt_sg[nb_ik].dEE1[1]+=
-                      gcm1*dcAng[ang_jik][1][ngk]
-                      +rcm1*disij[1][temp_ik]
-                      -gcm3*dcAng[ang_ikj][1][ngki];
-                  bt_sg[nb_ik].dEE1[2]+=
-                      gcm1*dcAng[ang_jik][2][ngk]
-                      +rcm1*disij[2][temp_ik]
-                      -gcm3*dcAng[ang_ikj][2][ngki];
-                  bt_sg[nb_jk].dEE1[0]+=
-                      gcm2*dcAng[ang_ijk][0][ngjk]
-                      +rcm2*disij[0][temp_jkp]
-                      -gcm3*dcAng[ang_ikj][0][ngkj];
-                  bt_sg[nb_jk].dEE1[1]+=
-                      gcm2*dcAng[ang_ijk][1][ngjk]
-                      +rcm2*disij[1][temp_jkp]
-                      -gcm3*dcAng[ang_ikj][1][ngkj];
-                  bt_sg[nb_jk].dEE1[2]+=
-                      gcm2*dcAng[ang_ijk][2][ngjk]
-                      +rcm2*disij[2][temp_jkp]
-                      -gcm3*dcAng[ang_ikj][2][ngkj];
-                }
-
-// k and k' and j are all different neighbors of i
-
-                for(ltmp=0;ltmp<ktmp;ltmp++) {
-                  if(ltmp!=jtmp) {
-                    temp_ikp=BOP_index[i]+ltmp;
-                    if(neigh_flag[temp_ikp]) {
-                      kp=iilist[ltmp];
-                      kptype = map[type[kp]]+1;
-                      for(nsearch=0;nsearch<nSigBk[n];nsearch++) {
-                        ncmp=itypeSigBk[n][nsearch];
-                        if(x[ncmp][0]==x[kp][0]) {
-                          if(x[ncmp][1]==x[kp][1]) {
-                            if(x[ncmp][2]==x[kp][2]) {
-                              break;
-                            }
-                          }
-                        }
-                      }
-                      if(jtmp<ltmp) {
-                        njikp=jtmp*(2*numneigh[i]-jtmp-1)/2+(ltmp-jtmp)-1;
-                      } else {
-                        njikp=ltmp*(2*numneigh[i]-ltmp-1)/2+(jtmp-ltmp)-1;
-                      }
-                      if(ktmp<ltmp) {
-                        nkikp=ktmp*(2*numneigh[i]-ktmp-1)/2+(ltmp-ktmp)-1;
-                      } else {
-                        nkikp=ltmp*(2*numneigh[i]-ltmp-1)/2+(ktmp-ltmp)-1;
-                      }
-                      ang_jikp=cos_index[i]+njikp;
-                      if(ang_jikp>=cos_total) {
-                        error->one(FLERR,"Too many atom triplets for pair bop");
-                      }
-                      gmean0=sigma_g0[jtype-1][itype-1][kptype-1];
-                      gmean1=sigma_g1[jtype-1][itype-1][kptype-1];
-                      gmean2=sigma_g2[jtype-1][itype-1][kptype-1];
-                      amean=cosAng[ang_jikp];
-                      gfactor2=gmean0+gmean1*amean
-                          +gmean2*amean*amean;
-                      gprime2=gmean1+2.0*gmean2*amean;
-                      gmean0=sigma_g0[ktype-1][itype-1][kptype-1];
-                      gmean1=sigma_g1[ktype-1][itype-1][kptype-1];
-                      gmean2=sigma_g2[ktype-1][itype-1][kptype-1];
-                      ang_kikp=cos_index[i]+nkikp;
-                      if(ang_kikp>=cos_total) {
-                        error->one(FLERR,"Too many atom triplets for pair bop");
-                      }
-                      amean=cosAng[ang_kikp];
-                      gfactor3=gmean0+gmean1*amean
-                          +gmean2*amean*amean;
-                      gprime3=gmean1+2.0*gmean2*amean;
-                      gfactor=gfactor1*gfactor2*gfactor3;
-                      rfactorrt=betaS[temp_ik]*betaS[temp_ikp];
-                      rfactor=rfactorrt*rfactorrt;
-
-//2nd CC is second term of Eq. 11 (c) for i atom where j , k & k' =neighbor of i
-
-                      CC=CC+2.0*gfactor*rfactor;
-                    }
-                  }
-                }
-
-// j and k are different neighbors of i and k' is a neighbor k not equal to i
-
-                for(ltmp=0;ltmp<numneigh[k];ltmp++) {
-                  temp_kkp=BOP_index[k]+ltmp;
-                  if(neigh_flag[temp_kkp]) {
-                    kp=klist[ltmp];;
-                    kptype = map[type[kp]]+1;
-                    same_ikp=0;
-                    same_jkp=0;
-                    if(x[i][0]==x[kp][0]) {
-                      if(x[i][1]==x[kp][1]) {
-                        if(x[i][2]==x[kp][2]) {
-                          same_ikp=1;
-                        }
-                      }
-                    }
-                    if(x[j][0]==x[kp][0]) {
-                      if(x[j][1]==x[kp][1]) {
-                        if(x[j][2]==x[kp][2]) {
-                          same_jkp=1;
-                        }
-                      }
-                    }
-                    if(!same_ikp&&!same_jkp) {
-                      if(kNeii<ltmp) {
-                        nikkp=kNeii*(2*numneigh[k]-kNeii-1)/2+(ltmp-kNeii)-1;
-                      } else {
-                        nikkp=ltmp*(2*numneigh[k]-ltmp-1)/2+(kNeii-ltmp)-1;
-                      }
-                      sig_flag=0;
-                      for(nsearch=0;nsearch<nSigBk[n];nsearch++) {
-                        ncmp=itypeSigBk[n][nsearch];
-                        if(x[ncmp][0]==x[kp][0]) {
-                          if(x[ncmp][1]==x[kp][1]) {
-                            if(x[ncmp][2]==x[kp][2]) {
-                              sig_flag=1;
-                              nkp=nsearch;
-                              break;
-                            }
-                          }
-                        }
-                      }
-                      if(sig_flag==0) {
-                        nSigBk[n]=nSigBk[n]+1;
-                        nkp=nSigBk[n]-1;
-                        itypeSigBk[n][nkp]=kp;
-                      }
-                      ang_ikkp=cos_index[k]+nikkp;
-                      if(ang_ikkp>=cos_total) {
-                        error->one(FLERR,"Too many atom triplets for pair bop");
-                      }
-                      gmean0=sigma_g0[itype-1][ktype-1][kptype-1];
-                      gmean1=sigma_g1[itype-1][ktype-1][kptype-1];
-                      gmean2=sigma_g2[itype-1][ktype-1][kptype-1];
-                      amean=cosAng[ang_ikkp];
-                      gfactor2=gmean0+gmean1*amean
-                          +gmean2*amean*amean;
-                      gprime2=gmean1+2.0*gmean2*amean;
-                      gfactorsq2=gfactor2*gfactor2;
-                      gfactor=gfactorsq*gfactorsq2;
-                      rfactorrt=betaS[temp_ik]*betaS[temp_kkp];
-                      rfactor=rfactorrt*rfactorrt;
-
-//3rd CC is third term of Eq. 11 (c) for i atom
-//where j , k =neighbor of i & k' =neighbor of k
-
-                      CC=CC+gfactor*rfactor;
-                    }
-                  }
-                }
-              }
-            }
-          }
-
-//j is a neighbor of i and k is a neighbor of j not equal to i
-
-          for(ktmp=0;ktmp<numneigh[j];ktmp++) {
-            if(ktmp!=ji) {
-              if(ktmp<ji) {
-                njik=ktmp*(2*numneigh[j]-ktmp-1)/2+(ji-ktmp)-1;
-                ngi=1;
-                ngk=0;
-              }
-              else {
-                njik=ji*(2*numneigh[j]-ji-1)/2+(ktmp-ji)-1;
-                ngi=0;
-                ngk=1;
-              }
-              temp_jk=BOP_index[j]+ktmp;
-              if(neigh_flag[temp_jk]) {
-                k=jlist[ktmp];
-                ktype=map[type[k]]+1;
-                klist=firstneigh[k];
-
-                for(kNeij=0;kNeij<numneigh[k];kNeij++) {
-                  if(x[klist[kNeij]][0]==x[j][0]) {
-                    if(x[klist[kNeij]][1]==x[j][1]) {
-                      if(x[klist[kNeij]][2]==x[j][2]) {
-                        break;
-                      }
-                    }
-                  }
-                }
-                sig_flag=0;
-                for(nsearch=0;nsearch<nSigBk[n];nsearch++) {
-                  ncmp=itypeSigBk[n][nsearch];
-                  if(x[ncmp][0]==x[k][0]) {
-                    if(x[ncmp][1]==x[k][1]) {
-                      if(x[ncmp][2]==x[k][2]) {
-                        new1=nsearch;
-                        sig_flag=1;
-                        break;
-                      }
-                    }
-                  }
-                }
-                if(sig_flag==0) {
-                  nSigBk[n]=nSigBk[n]+1;
-                  new1=nSigBk[n]-1;
-                  itypeSigBk[n][new1]=k;
-                }
-                ang_ijk=cos_index[j]+njik;
-                if(ang_ijk>=cos_total) {
-                  error->one(FLERR,"Too many atom triplets for pair bop");
-                }
-                nb_jk=nb_t;
-                nb_t++;
-                if(nb_t>nb_sg) {
-                  new_n_tot=nb_sg+maxneigh;
-                  grow_sigma(nb_sg,new_n_tot);
-                  nb_sg=new_n_tot;
-                }
-                bt_sg[nb_jk].temp=temp_jk;
-                bt_sg[nb_jk].i=j;
-                bt_sg[nb_jk].j=k;
-                gmean0=sigma_g0[itype-1][jtype-1][ktype-1];
-                gmean1=sigma_g1[itype-1][jtype-1][ktype-1];
-                gmean2=sigma_g2[itype-1][jtype-1][ktype-1];
-                amean=cosAng[ang_ijk];
-                gfactor1=gmean0+gmean1*amean
-                    +gmean2*amean*amean;
-                gprime1=gmean1+2.0*gmean2*amean;
-                gfactorsq=gfactor1*gfactor1;
-                gsqprime=2.0*gfactor1*gprime1;
-                rfactor1rt=betaS[temp_jk]*betaS[temp_jk];
-                rfactor1=rfactor1rt*rfactor1rt;
-
-//BB is Eq. 34 (a) or Eq. 10 (c) for the j atom
-//1st DD is Eq. 11 (c) for j atom where i & k=neighbor of j
-                BB=BB+gfactorsq*rfactor1rt;
-                DD=DD+gfactorsq*rfactor1;
-
-//agpdpr1 is derivative of BB  w.r.t. Beta(r_jk)
-//app1 is derivative of BB w.r.t. cos(theta_ijk)
-
-                agpdpr1=2.0*gfactorsq*betaS[temp_jk]*dBetaS[temp_jk]/rij[temp_jk];
-                app1=rfactor1rt*gsqprime;
-                bt_sg[nb_ij].dBB[0]-=
-                    app1*dcAng[ang_ijk][0][ngi];
-                bt_sg[nb_ij].dBB[1]-=
-                    app1*dcAng[ang_ijk][1][ngi];
-                bt_sg[nb_ij].dBB[2]-=
-                    app1*dcAng[ang_ijk][2][ngi];
-                bt_sg[nb_jk].dBB[0]+=
-                    app1*dcAng[ang_ijk][0][ngk]
-                    +agpdpr1*disij[0][temp_jk];
-                bt_sg[nb_jk].dBB[1]+=
-                    app1*dcAng[ang_ijk][1][ngk]
-                    +agpdpr1*disij[1][temp_jk];
-                bt_sg[nb_jk].dBB[2]+=
-                    app1*dcAng[ang_ijk][2][ngk]
-                    +agpdpr1*disij[2][temp_jk];
-
-//j is a neighbor of i, k and k' prime different neighbors of j not equal to i
-
-                for(ltmp=0;ltmp<ktmp;ltmp++) {
-                  if(ltmp!=ji) {
-                    temp_jkp=BOP_index[j]+ltmp;
-                    if(neigh_flag[temp_jkp]) {
-                      kp=jlist[ltmp];
-                      kptype=map[type[kp]]+1;
-                      for(nsearch=0;nsearch<nSigBk[n];nsearch++) {
-                        ncmp=itypeSigBk[n][nsearch];
-                        if(x[ncmp][0]==x[kp][0]) {
-                          if(x[ncmp][1]==x[kp][1]) {
-                            if(x[ncmp][2]==x[kp][2]) {
-                              new2=nsearch;
-                              break;
-                            }
-                          }
-                        }
-                      }
-                      if(ji<ltmp) {
-                        nijkp=ji*(2*numneigh[j]-ji-1)/2+(ltmp-ji)-1;
-                      } else {
-                        nijkp=ltmp*(2*numneigh[j]-ltmp-1)/2+(ji-ltmp)-1;
-                      }
-                      if(ktmp<ltmp) {
-                        nkjkp=ktmp*(2*numneigh[j]-ktmp-1)/2+(ltmp-ktmp)-1;
-                        ngjk=0;
-                      }
-                      else {
-                        nkjkp=ltmp*(2*numneigh[j]-ltmp-1)/2+(ktmp-ltmp)-1;
-                        ngjk=1;
-                      }
-                      ang_ijkp=cos_index[j]+nijkp;
-                      if(ang_ijkp>=cos_total) {
-                        error->one(FLERR,"Too many atom triplets for pair bop");
-                      }
-                      ang_kjkp=cos_index[j]+nkjkp;
-                      if(ang_kjkp>=cos_total) {
-                        error->one(FLERR,"Too many atom triplets for pair bop");
-                      }
-                      gmean0=sigma_g0[itype-1][jtype-1][kptype-1];
-                      gmean1=sigma_g1[itype-1][jtype-1][kptype-1];
-                      gmean2=sigma_g2[itype-1][jtype-1][kptype-1];
-                      amean=cosAng[ang_ijkp];
-                      gfactor2=gmean0+gmean1*amean
-                        +gmean2*amean*amean;
-                      gprime2=gmean1+2.0*gmean2*amean;
-                      gmean0=sigma_g0[ktype-1][jtype-1][kptype-1];
-                      gmean1=sigma_g1[ktype-1][jtype-1][kptype-1];
-                      gmean2=sigma_g2[ktype-1][jtype-1][kptype-1];
-                      amean=cosAng[ang_kjkp];
-                      gfactor3=gmean0+gmean1*amean
-                        +gmean2*amean*amean;
-                      gprime3=gmean1+2.0*gmean2*amean;
-                      gfactor=gfactor1*gfactor2*gfactor3;
-                      rfactorrt=betaS[temp_jk]*betaS[temp_jkp];
-                      rfactor=rfactorrt*rfactorrt;
-
-//2nd DD is Eq. 11 (c) for j atom where i , k & k'=neighbor of j
-
-                      DD=DD+2.0*gfactor*rfactor;
-                    }
-                  }
-                }
-
-//j is a neighbor of i, k is a neighbor of j not equal to i and k'
-//is a neighbor of k not equal to j or i
-
-                for(ltmp=0;ltmp<numneigh[k];ltmp++) {
-                  temp_kkp=BOP_index[k]+ltmp;
-                  if(neigh_flag[temp_kkp]) {
-                    kp=klist[ltmp];
-                    kptype=map[type[kp]]+1;
-                    same_ikp=0;
-                    same_jkp=0;
-                    if(x[i][0]==x[kp][0]) {
-                      if(x[i][1]==x[kp][1]) {
-                        if(x[i][2]==x[kp][2]) {
-                          same_ikp=1;
-                        }
-                      }
-                    }
-                    if(x[j][0]==x[kp][0]) {
-                      if(x[j][1]==x[kp][1]) {
-                        if(x[j][2]==x[kp][2]) {
-                          same_jkp=1;
-                        }
-                      }
-                    }
-                    if(!same_ikp&&!same_jkp) {
-                      for(kNeij=0;kNeij<numneigh[k];kNeij++) {
-                        if(x[klist[kNeij]][0]==x[j][0]) {
-                          if(x[klist[kNeij]][1]==x[j][1]) {
-                            if(x[klist[kNeij]][2]==x[j][2]) {
-                              break;
-                            }
-                          }
-                        }
-                      }
-                      if(kNeij<ltmp) {
-                        njkkp=kNeij*(2*numneigh[k]-kNeij-1)/2+(ltmp-kNeij)-1;
-                      } else {
-                        njkkp=ltmp*(2*numneigh[k]-ltmp-1)/2+(kNeij-ltmp)-1;
-                      }
-                      sig_flag=0;
-                      for(nsearch=0;nsearch<nSigBk[n];nsearch++) {
-                        ncmp=itypeSigBk[n][nsearch];
-                        if(x[ncmp][0]==x[kp][0]) {
-                          if(x[ncmp][1]==x[kp][1]) {
-                            if(x[ncmp][2]==x[kp][2]) {
-                              new2=nsearch;
-                              sig_flag=1;
-                              break;
-                            }
-                          }
-                        }
-                      }
-                      if(sig_flag==0) {
-                        nSigBk[n]=nSigBk[n]+1;
-                        new2=nSigBk[n]-1;
-                        itypeSigBk[n][new2]=kp;
-                      }
-                      ang_jkkp=cos_index[k]+njkkp;
-                      if(ang_jkkp>=cos_total) {
-                        error->one(FLERR,"Too many atom triplets for pair bop");
-                      }
-                      gmean0=sigma_g0[jtype-1][ktype-1][kptype-1];
-                      gmean1=sigma_g1[jtype-1][ktype-1][kptype-1];
-                      gmean2=sigma_g2[jtype-1][ktype-1][kptype-1];
-                      amean=cosAng[ang_jkkp];
-                      gfactor2=gmean0+gmean1*amean
-                          +gmean2*amean*amean;
-                      gprime2=gmean1+2.0*gmean2*amean;
-                      gfactorsq2=gfactor2*gfactor2;
-                      gfactor=gfactorsq*gfactorsq2;
-                      rfactorrt=betaS[temp_jk]*betaS[temp_kkp];
-                      rfactor=rfactorrt*rfactorrt;
-
-//3rd DD is Eq. 11 (c) for j atom where i & k=neighbor of j & k'=neighbor of k
-
-                      DD=DD+gfactor*rfactor;
-                    }
-                  }
-                }
-              }
-            }
-          }
-
-          sig_flag=0;
-          if(sig_flag==0) {
-
-// AA and BB are the representations of (a) Eq. 34 and (b) Eq. 9
-// for atoms i and j respectively
-
-            AAC=AA+BB;
-            BBC=AA*BB;
-            CCC=AA*AA+BB*BB;
-            DDC=CC+DD;
-
-//EEC is a modified form of (a) Eq. 33
-
-            EEC=(DDC-CCC)/(AAC+2.0*small1);
-            for(m=0;m<nb_t;m++) {
-              if((bt_sg[m].i>-1)&&(bt_sg[m].j>-1)) {
-                bt_i=bt_sg[m].i;
-                bt_j=bt_sg[m].j;
-                bt_sg[m].dAAC[0]=bt_sg[m].dAA[0]
-                    +bt_sg[m].dBB[0];
-                bt_sg[m].dAAC[1]=bt_sg[m].dAA[1]
-                    +bt_sg[m].dBB[1];
-                bt_sg[m].dAAC[2]=bt_sg[m].dAA[2]
-                    +bt_sg[m].dBB[2];
-              }
-            }
-            UT=EEC*FF+BBC+small3[iij];
-            UT=1.0/sqrt(UT);
-
-// FFC is slightly modified form of (a) Eq. 31
-// GGC is slightly modified form of (a) Eq. 32
-// bndtmp is a slightly modified form of (a) Eq. 30 and (b) Eq. 8
-
-            bndtmp=(FF+sigma_delta[iij]*sigma_delta[iij])
-                +sigma_c[iij]*AAC+small4;
-            psign=1.0;
-            bndtmp0=1.0/sqrt(bndtmp);
-            sigB1[n]=psign*betaS[temp_ij]*bndtmp0;
-            bndtmp=-0.5*bndtmp0*bndtmp0*bndtmp0;
-            bndtmp1=psign*bndtmp0+psign*betaS[temp_ij]
-                *bndtmp*2.0*betaS[temp_ij];
-            bndtmp1=bndtmp1*dBetaS[temp_ij]/rij[temp_ij];
-            bndtmp2=psign*betaS[temp_ij]*bndtmp*sigma_c[iij];
-            setting=0;
-            for(m=0;m<nb_t;m++) {
-              if((bt_sg[m].i>-1)&&(bt_sg[m].j>-1)) {
-                temp_kk=bt_sg[m].temp;
-                if(temp_kk==temp_ij&&setting==0) {
-                  bt_sg[m].dSigB1[0]=bndtmp1*disij[0][temp_ij]
-                      +(bndtmp2*bt_sg[m].dAAC[0]);
-                  bt_sg[m].dSigB1[1]=bndtmp1*disij[1][temp_ij]
-                      +(bndtmp2*bt_sg[m].dAAC[1]);
-                  bt_sg[m].dSigB1[2]=bndtmp1*disij[2][temp_ij]
-                      +(bndtmp2*bt_sg[m].dAAC[2]);
-                  setting=1;
-                }
-                else if(temp_kk==temp_ji&&setting==0) {
-                  bt_sg[m].dSigB1[0]=-bndtmp1*disij[0][temp_ij]
-                      +(bndtmp2*bt_sg[m].dAAC[0]);
-                  bt_sg[m].dSigB1[1]=-bndtmp1*disij[1][temp_ij]
-                      +(bndtmp2*bt_sg[m].dAAC[1]);
-                  bt_sg[m].dSigB1[2]=-bndtmp1*disij[2][temp_ij]
-                      +(bndtmp2*bt_sg[m].dAAC[2]);
-                  setting=1;
-                }
-                else {
-                  bt_sg[m].dSigB1[0]=(bndtmp2*bt_sg[m].dAAC[0]);
-                  bt_sg[m].dSigB1[1]=(bndtmp2*bt_sg[m].dAAC[1]);
-                  bt_sg[m].dSigB1[2]=(bndtmp2*bt_sg[m].dAAC[2]);
-                }
-              }
-            }
-
-//This loop is to ensure there is not an error for atoms with no neighbors (deposition)
-
-            if(nb_t==0) {
-              if(j>i) {
-                bt_sg[0].dSigB1[0]=bndtmp1*disij[0][temp_ij];
-                bt_sg[0].dSigB1[1]=bndtmp1*disij[1][temp_ij];
-                bt_sg[0].dSigB1[2]=bndtmp1*disij[2][temp_ij];
-              }
-              else {
-                bt_sg[0].dSigB1[0]=-bndtmp1*disij[0][temp_ij];
-                bt_sg[0].dSigB1[1]=-bndtmp1*disij[1][temp_ij];
-                bt_sg[0].dSigB1[2]=-bndtmp1*disij[2][temp_ij];
-              }
-              for(pp=0;pp<3;pp++) {
-                bt_sg[0].dAA[pp]=0.0;
-                bt_sg[0].dBB[pp]=0.0;
-                bt_sg[0].dEE1[pp]=0.0;
-                bt_sg[0].dFF[pp]=0.0;
-                bt_sg[0].dAAC[pp]=0.0;
-                bt_sg[0].dSigB[pp]=0.0;
-              }
-              bt_sg[0].i=i;
-              bt_sg[0].j=j;
-              bt_sg[0].temp=temp_ij;
-              nb_t++;
-              if(nb_t>nb_sg) {
-                new_n_tot=nb_sg+maxneigh;
-                grow_sigma(nb_sg,new_n_tot);
-                nb_sg=new_n_tot;
-              }
-            }
-            ps=sigB1[n]*rdBO+1.0;
-            ks=(int)ps;
-            if(nBOt-1<ks)
-              ks=nBOt-1;
-            ps=ps-ks;
-            if(ps>1.0)
-              ps=1.0;
-            dsigB1=((FsigBO3[iij][ks-1]*ps+FsigBO2[iij][ks-1])*ps
-                +FsigBO1[iij][ks-1])*ps+FsigBO[iij][ks-1];
-            dsigB2=(FsigBO6[iij][ks-1]*ps+FsigBO5[iij][ks-1])*ps+FsigBO4[iij][ks-1];
-            part0=(FF+0.5*AAC+small5);
-            part1=(sigma_f[iij]-0.5)*sigma_k[iij];
-            part2=1.0-part1*EE1/part0;
-            part3=dsigB1*part1/part0;
-            part4=part3/part0*EE1;
-
-// sigB is the final expression for (a) Eq. 6 and (b) Eq. 11
-
-            sigB[n]=dsigB1*part2;
-            pp1=2.0*betaS[temp_ij];
-            for(m=0;m<nb_t;m++) {
-              if((bt_sg[m].i>-1)&&(bt_sg[m].j>-1)) {
-                temp_kk=bt_sg[m].temp;
-                bt_ij=bt_sg[m].temp;
-                bt_i=bt_sg[m].i;
-                bt_j=bt_sg[m].j;
-                for(pp=0;pp<3;pp++) {
-                  bt_sg[m].dSigB[pp]=dsigB2*part2*bt_sg[m].dSigB1[pp]
-                      -part3*bt_sg[m].dEE1[pp]
-                      +part4*(bt_sg[m].dFF[pp]
-                      +0.5*bt_sg[m].dAAC[pp]);
-                }
-                for(pp=0;pp<3;pp++) {
-                  ftmp[pp]=pp1*bt_sg[m].dSigB[pp];
-                  f[bt_i][pp]-=ftmp[pp];
-                  f[bt_j][pp]+=ftmp[pp];
-                }
-                if(evflag) {
-                  ev_tally_xyz(bt_i,bt_j,nlocal,newton_pair,0.0,0.0,ftmp[0],ftmp[1]
-                      ,ftmp[2],disij[0][bt_ij],disij[1][bt_ij],disij[2][bt_ij]);
-                }
-              }
-            }
-          }
-          n++;
-        }
-      }
-    }
-  }
-  destroy_sigma();
-}
-
-/* ---------------------------------------------------------------------- */
-
-/*  The formulation differs slightly to avoid negative square roots
-    in the calculation of Theta_pi,ij of (a) Eq. 36 and (b) Eq. 18 */
-
-void PairBOP::sigmaBo_otf()
-{
-  int nb_t,new_n_tot;
-  int n,i,j,k,kp,m,pp,kpj,kpk,kkp;
-  int itmp,jtmp,ktmp,ltmp,mtmp;
-  tagint i_tag,j_tag;
-  int kp1,kp2,kp1type;
-  int iij,iik,ijk,ikkp,ji,iikp,ijkp;
-  int nkp;
-  int nk0;
-  int jNeik,kNeii,kNeij,kNeikp;
-  int kpNeij,kpNeik;
-  int new1,new2,nlocal;
-  int inum,*ilist,*iilist,*jlist,*klist,*kplist;
-  int **firstneigh,*numneigh;
-  int temp_ij,temp_ik,temp_jkp,temp_kk,temp_jk;
-  int temp_ji,temp_kkp;
-  int temp_ikp;
-  int nb_ij,nb_ik,nb_ikp;
-  int nb_jk,nb_jkp,nb_kkp;
-  int nsearch;
-  int sig_flag,setting,ncmp,ks;
-  int itype,jtype,ktype,kptype;
-  int bt_i,bt_j;
-  int same_ikp,same_jkp,same_kpk;
-  int same_jkpj,same_kkpk;
-  double AA,BB,CC,DD,EE,EE1,FF;
-  double AAC,BBC,CCC,DDC,EEC,FFC,GGC;
-  double AACFF,UT,bndtmp,UTcom;
-  double amean,gmean0,gmean1,gmean2,ps;
-  double gfactor1,gprime1,gsqprime;
-  double gfactorsq,gfactor2,gprime2;
-  double gfactorsq2,gsqprime2;
-  double gfactor3,gprime3,gfactor,rfactor;
-  double drfactor,gfactor4,gprime4,agpdpr3;
-  double rfactor0,rfactorrt,rfactor1rt,rfactor1;
-  double rcm1,rcm2,gcm1,gcm2,gcm3;
-  double agpdpr1,agpdpr2,app1,app2,app3,app4;
-  double dsigB1,dsigB2;
-  double part0,part1,part2,part3,part4;
-  double psign,bndtmp0,pp1;
-  double bndtmp1,bndtmp2,bndtmp3,bndtmp4,bndtmp5;
-  double dis_ij[3],rsq_ij,r_ij;
-  double betaS_ij,dBetaS_ij;
-  double dis_ik[3],rsq_ik,r_ik;
-  double betaS_ik,dBetaS_ik;
-  double dis_ikp[3],rsq_ikp,r_ikp;
-  double betaS_ikp,dBetaS_ikp;
-  double dis_jk[3],rsq_jk,r_jk;
-  double betaS_jk,dBetaS_jk;
-  double dis_jkp[3],rsq_jkp,r_jkp;
-  double betaS_jkp,dBetaS_jkp;
-  double dis_kkp[3],rsq_kkp,r_kkp;
-  double betaS_kkp,dBetaS_kkp;
-  double cosAng_jik,dcA_jik[3][2];
-  double cosAng_jikp,dcA_jikp[3][2];
-  double cosAng_kikp,dcA_kikp[3][2];
-  double cosAng_ijk,dcA_ijk[3][2];
-  double cosAng_ijkp,dcA_ijkp[3][2];
-  double cosAng_kjkp,dcA_kjkp[3][2];
-  double cosAng_ikj,dcA_ikj[3][2];
-  double cosAng_ikkp,dcA_ikkp[3][2];
-  double cosAng_jkkp,dcA_jkkp[3][2];
-  double cosAng_jkpk,dcA_jkpk[3][2];
-
-  double ftmp[3],xtmp[3];
-  double **x = atom->x;
-  double **f = atom->f;
-  tagint *tag = atom->tag;
-  int newton_pair = force->newton_pair;
-  int *type = atom->type;
-
-  nlocal = atom->nlocal;
-  inum = list->inum;
-  ilist = list->ilist;
-  numneigh = list->numneigh;
-  firstneigh = list->firstneigh;
-
-  n=0;
-  if(nb_sg==0) {
-    nb_sg=(maxneigh)*(maxneigh/2);
-  }
-  if(allocate_sigma) {
-    destroy_sigma();
-  }
-
-  create_sigma(nb_sg);
-
-  for(itmp=0;itmp<inum;itmp++) {
-    i = ilist[itmp];
-    i_tag=tag[i];
-    itype = map[type[i]]+1;
-
-//j is loop over all neighbors of i
-
-    for(jtmp=0;jtmp<numneigh[i];jtmp++) {
-      for(m=0;m<nb_sg;m++) {
-        for(pp=0;pp<3;pp++) {
-          bt_sg[m].dAA[pp]=0.0;
-          bt_sg[m].dBB[pp]=0.0;
-          bt_sg[m].dCC[pp]=0.0;
-          bt_sg[m].dDD[pp]=0.0;
-          bt_sg[m].dEE[pp]=0.0;
-          bt_sg[m].dEE1[pp]=0.0;
-          bt_sg[m].dFF[pp]=0.0;
-          bt_sg[m].dAAC[pp]=0.0;
-          bt_sg[m].dBBC[pp]=0.0;
-          bt_sg[m].dCCC[pp]=0.0;
-          bt_sg[m].dDDC[pp]=0.0;
-          bt_sg[m].dEEC[pp]=0.0;
-          bt_sg[m].dFFC[pp]=0.0;
-          bt_sg[m].dGGC[pp]=0.0;
-          bt_sg[m].dUT[pp]=0.0;
-          bt_sg[m].dSigB1[pp]=0.0;
-          bt_sg[m].dSigB[pp]=0.0;
-        }
-        bt_sg[m].i=-1;
-        bt_sg[m].j=-1;
-        bt_sg[m].temp=-1;
-      }
-      nb_t=0;
-      iilist=firstneigh[i];
-      temp_ij=BOP_index[i]+jtmp;
-      j=iilist[jtmp];
-      jlist=firstneigh[j];
-      j_tag=tag[j];
-      jtype = map[type[j]]+1;
-      nb_ij=nb_t;
-      nb_t++;
-      if(nb_t>nb_sg) {
-        new_n_tot=nb_sg+maxneigh;
-        grow_sigma(nb_sg,new_n_tot);
-        nb_sg=new_n_tot;
-      }
-      bt_sg[nb_ij].temp=temp_ij;
-      bt_sg[nb_ij].i=i;
-      bt_sg[nb_ij].j=j;
-      if(j_tag>=i_tag) {
-        if(itype==jtype)
-          iij=itype-1;
-        else if(itype<jtype)
-          iij=itype*bop_types-itype*(itype+1)/2+jtype-1;
-        else
-          iij=jtype*bop_types-jtype*(jtype+1)/2+itype-1;
-        for(ji=0;ji<numneigh[j];ji++) {
-          temp_ji=BOP_index[j]+ji;
-          if(x[jlist[ji]][0]==x[i][0]) {
-            if(x[jlist[ji]][1]==x[i][1]) {
-              if(x[jlist[ji]][2]==x[i][2]) {
-                break;
-              }
-            }
-          }
-        }
-        dis_ij[0]=x[j][0]-x[i][0];
-        dis_ij[1]=x[j][1]-x[i][1];
-        dis_ij[2]=x[j][2]-x[i][2];
-        rsq_ij=dis_ij[0]*dis_ij[0]
-            +dis_ij[1]*dis_ij[1]
-            +dis_ij[2]*dis_ij[2];
-        r_ij=sqrt(rsq_ij);
-
-        if(r_ij<rcut[iij]) {
-          ps=r_ij*rdr[iij]+1.0;
-          ks=(int)ps;
-          if(nr-1<ks)
-            ks=nr-1;
-          ps=ps-ks;
-          if(ps>1.0)
-            ps=1.0;
-          betaS_ij=((pBetaS3[iij][ks-1]*ps+pBetaS2[iij][ks-1])*ps
-              +pBetaS1[iij][ks-1])*ps+pBetaS[iij][ks-1];
-          dBetaS_ij=(pBetaS6[iij][ks-1]*ps+pBetaS5[iij][ks-1])*ps
-              +pBetaS4[iij][ks-1];
-          nSigBk[n]=0;
-
-//AA-EE1 are the components making up Eq. 30 (a)
-
-          AA=0.0;
-          BB=0.0;
-          CC=0.0;
-          DD=0.0;
-          EE=0.0;
-          EE1=0.0;
-
-//FF is the Beta_sigma^2 term
-
-          FF=betaS_ij*betaS_ij;
-
-//agpdpr1 is derivative of FF w.r.t. r_ij
-
-          agpdpr1=2.0*betaS_ij*dBetaS_ij/r_ij;
-
-//dXX derivatives are taken with respect to all pairs contributing to the energy
-//nb_ij is derivative w.r.t. ij pair
-
-          bt_sg[nb_ij].dFF[0]=agpdpr1*dis_ij[0];
-          bt_sg[nb_ij].dFF[1]=agpdpr1*dis_ij[1];
-          bt_sg[nb_ij].dFF[2]=agpdpr1*dis_ij[2];
-
-//k is loop over all neighbors of i again with j neighbor of i
-
-          for(ktmp=0;ktmp<numneigh[i];ktmp++) {
-            temp_ik=BOP_index[i]+ktmp;
-            if(ktmp!=jtmp) {
-              k=iilist[ktmp];
-              klist=firstneigh[k];
-              ktype = map[type[k]]+1;
-              if(itype==ktype)
-                iik=itype-1;
-              else if(itype<ktype)
-                iik=itype*bop_types-itype*(itype+1)/2+ktype-1;
-              else
-                iik=ktype*bop_types-ktype*(ktype+1)/2+itype-1;
-
-//find neighbor of k that is equal to i
-
-              for(kNeii=0;kNeii<numneigh[k];kNeii++) {
-                if(x[klist[kNeii]][0]==x[i][0]) {
-                  if(x[klist[kNeii]][1]==x[i][1]) {
-                    if(x[klist[kNeii]][2]==x[i][2]) {
-                      break;
-                    }
-                  }
-                }
-              }
-              dis_ik[0]=x[k][0]-x[i][0];
-              dis_ik[1]=x[k][1]-x[i][1];
-              dis_ik[2]=x[k][2]-x[i][2];
-              rsq_ik=dis_ik[0]*dis_ik[0]
-                  +dis_ik[1]*dis_ik[1]
-                  +dis_ik[2]*dis_ik[2];
-              r_ik=sqrt(rsq_ik);
-              if(r_ik<=rcut[iik]) {
-                ps=r_ik*rdr[iik]+1.0;
-                ks=(int)ps;
-                if(nr-1<ks)
-                  ks=nr-1;
-                ps=ps-ks;
-                if(ps>1.0)
-                  ps=1.0;
-                betaS_ik=((pBetaS3[iik][ks-1]*ps+pBetaS2[iik][ks-1])*ps
-                    +pBetaS1[iik][ks-1])*ps+pBetaS[iik][ks-1];
-                dBetaS_ik=(pBetaS6[iik][ks-1]*ps+pBetaS5[iik][ks-1])*ps
-                    +pBetaS4[iik][ks-1];
-
-//find neighbor of i that is equal to k
-
-                for(jNeik=0;jNeik<numneigh[j];jNeik++) {
-                  temp_jk=BOP_index[j]+jNeik;
-                  if(x[jlist[jNeik]][0]==x[k][0]) {
-                    if(x[jlist[jNeik]][1]==x[k][1]) {
-                      if(x[jlist[jNeik]][2]==x[k][2]) {
-                        break;
-                      }
-                    }
-                  }
-                }
-
-//find neighbor of k that is equal to j
-
-                for(kNeij=0;kNeij<numneigh[k];kNeij++) {
-                  if(x[klist[kNeij]][0]==x[j][0]) {
-                    if(x[klist[kNeij]][1]==x[j][1]) {
-                      if(x[klist[kNeij]][2]==x[j][2]) {
-                        break;
-                      }
-                    }
-                  }
-                }
-                dis_jk[0]=x[k][0]-x[j][0];
-                dis_jk[1]=x[k][1]-x[j][1];
-                dis_jk[2]=x[k][2]-x[j][2];
-                rsq_jk=dis_jk[0]*dis_jk[0]
-                    +dis_jk[1]*dis_jk[1]
-                    +dis_jk[2]*dis_jk[2];
-                r_jk=sqrt(rsq_jk);
-
-                sig_flag=0;
-                for(nsearch=0;nsearch<nSigBk[n];nsearch++) {
-                  ncmp=itypeSigBk[n][nsearch];
-                  if(x[ncmp][0]==x[k][0]) {
-                    if(x[ncmp][1]==x[k][1]) {
-                      if(x[ncmp][2]==x[k][2]) {
-                        nk0=nsearch;
-                        sig_flag=1;
-                        break;
-                      }
-                    }
-                  }
-                }
-                if(sig_flag==0) {
-                  nSigBk[n]=nSigBk[n]+1;
-                  nk0=nSigBk[n]-1;
-                  itypeSigBk[n][nk0]=k;
-                }
-                nb_ik=nb_t;
-                nb_t++;
-                if(nb_t>nb_sg) {
-                  new_n_tot=nb_sg+maxneigh;
-                  grow_sigma(nb_sg,new_n_tot);
-                  nb_sg=new_n_tot;
-                }
-                bt_sg[nb_ik].temp=temp_ik;
-                bt_sg[nb_ik].i=i;
-                bt_sg[nb_ik].j=k;
-                nb_jk=nb_t;
-                nb_t++;
-                if(nb_t>nb_sg) {
-                  new_n_tot=nb_sg+maxneigh;
-                  grow_sigma(nb_sg,new_n_tot);
-                  nb_sg=new_n_tot;
-                }
-                bt_sg[nb_jk].temp=temp_jk;
-                bt_sg[nb_jk].i=j;
-                bt_sg[nb_jk].j=k;
-                cosAng_jik=(dis_ij[0]*dis_ik[0]+dis_ij[1]*dis_ik[1]
-                    +dis_ij[2]*dis_ik[2])/(r_ij*r_ik);
-                dcA_jik[0][0]=(dis_ik[0]*r_ij*r_ik-cosAng_jik
-                    *dis_ij[0]*r_ik*r_ik)/(r_ij*r_ij*r_ik*r_ik);
-                dcA_jik[1][0]=(dis_ik[1]*r_ij*r_ik-cosAng_jik
-                    *dis_ij[1]*r_ik*r_ik)/(r_ij*r_ij*r_ik*r_ik);
-                dcA_jik[2][0]=(dis_ik[2]*r_ij*r_ik-cosAng_jik
-                    *dis_ij[2]*r_ik*r_ik)/(r_ij*r_ij*r_ik*r_ik);
-                dcA_jik[0][1]=(dis_ij[0]*r_ij*r_ik-cosAng_jik
-                    *dis_ik[0]*r_ij*r_ij)/(r_ij*r_ij*r_ik*r_ik);
-                dcA_jik[1][1]=(dis_ij[1]*r_ij*r_ik-cosAng_jik
-                    *dis_ik[1]*r_ij*r_ij)/(r_ij*r_ij*r_ik*r_ik);
-                dcA_jik[2][1]=(dis_ij[2]*r_ij*r_ik-cosAng_jik
-                    *dis_ik[2]*r_ij*r_ij)/(r_ij*r_ij*r_ik*r_ik);
-                gmean0=sigma_g0[jtype-1][itype-1][ktype-1];
-                gmean1=sigma_g1[jtype-1][itype-1][ktype-1];
-                gmean2=sigma_g2[jtype-1][itype-1][ktype-1];
-                amean=cosAng_jik;
-                gfactor1=gmean0+gmean1*amean
-                    +gmean2*amean*amean;
-                gfactorsq=gfactor1*gfactor1;
-                gprime1=gmean1+2.0*gmean2*amean;
-                gsqprime=2.0*gfactor1*gprime1;
-
-//AA is Eq. 34 (a) or Eq. 10 (c) for the i atom
-//1st CC is Eq. 11 (c) for i atom where j & k=neighbor of i
-
-                AA=AA+gfactorsq*betaS_ik*betaS_ik;
-                CC=CC+gfactorsq*betaS_ik*betaS_ik*betaS_ik*betaS_ik;
-
-//agpdpr1 is derivative of AA w.r.t. Beta(rik)
-//app1 is derivative of AA w.r.t. cos(theta_jik)
-
-                agpdpr1=2.0*gfactorsq*betaS_ik*dBetaS_ik/r_ik;
-                app1=betaS_ik*betaS_ik*gsqprime;
-                bt_sg[nb_ij].dAA[0]+=
-                    app1*dcA_jik[0][0];
-                bt_sg[nb_ij].dAA[1]+=
-                    app1*dcA_jik[1][0];
-                bt_sg[nb_ij].dAA[2]+=
-                    app1*dcA_jik[2][0];
-                bt_sg[nb_ij].dCC[0]+=
-                    app2*dcA_jik[0][0];
-                bt_sg[nb_ij].dCC[1]+=
-                    app2*dcA_jik[1][0];
-                bt_sg[nb_ij].dCC[2]+=
-                    app2*dcA_jik[2][0];
-                bt_sg[nb_ik].dAA[0]+=
-                    app1*dcA_jik[0][1]
-                    +agpdpr1*dis_ik[0];
-                bt_sg[nb_ik].dAA[1]+=
-                    app1*dcA_jik[1][1]
-                    +agpdpr1*dis_ik[1];
-                bt_sg[nb_ik].dAA[2]+=
-                    app1*dcA_jik[2][1]
-                    +agpdpr1*dis_ik[2];
-                bt_sg[nb_ik].dCC[0]+=
-                    app2*dcA_jik[0][1]
-                    +agpdpr2*dis_ik[0];
-                bt_sg[nb_ik].dCC[1]+=
-                    app2*dcA_jik[1][1]
-                    +agpdpr2*dis_ik[1];
-                bt_sg[nb_ik].dCC[2]+=
-                    app2*dcA_jik[2][1]
-                    +agpdpr2*dis_ik[2];
-
-//k' is loop over neighbors all neighbors of j with k a neighbor
-//of i and j a neighbor of i and determine which k' is k
-
-                same_kpk=0;
-                for(ltmp=0;ltmp<numneigh[j];ltmp++) {
-                  temp_jkp=BOP_index[j]+ltmp;
-                  kp1=jlist[ltmp];
-                  kp1type=map[type[kp1]]+1;
-                  if(x[kp1][0]==x[k][0]) {
-                    if(x[kp1][1]==x[k][1]) {
-                      if(x[kp1][2]==x[k][2]) {
-                        same_kpk=1;
-                        break;
-                      }
-                    }
-                  }
-                }
-                if(same_kpk){
-
-//loop over neighbors of k
-
-                  for(mtmp=0;mtmp<numneigh[k];mtmp++) {
-                    kp2=klist[mtmp];
-                    if(x[kp2][0]==x[k][0]) {
-                      if(x[kp2][1]==x[k][1]) {
-                        if(x[kp2][2]==x[k][2]) {
-                          break;
-                        }
-                      }
-                    }
-                  }
-                  if(jtype==ktype)
-                    ijk=jtype-1;
-                  else if(jtype < ktype)
-                    ijk=jtype*bop_types-jtype*(jtype+1)/2+ktype-1;
-                  else
-                    ijk=ktype*bop_types-ktype*(ktype+1)/2+jtype-1;
-                  if(jtype==kp1type)
-                    ijkp=jtype-1;
-                  else if(jtype<kp1type)
-                    ijkp=jtype*bop_types-jtype*(jtype+1)/2+kp1type-1;
-                  else
-                    ijkp=kp1type*bop_types-kp1type*(kp1type+1)/2+jtype-1;
-
-                  dis_jkp[0]=x[kp1][0]-x[j][0];
-                  dis_jkp[1]=x[kp1][1]-x[j][1];
-                  dis_jkp[2]=x[kp1][2]-x[j][2];
-                  rsq_jkp=dis_jkp[0]*dis_jkp[0]
-                      +dis_jkp[1]*dis_jkp[1]
-                      +dis_jkp[2]*dis_jkp[2];
-                  r_jkp=sqrt(rsq_jkp);
-                  if(r_jkp<=rcut[ijkp]) {
-                    ps=r_jkp*rdr[ijkp]+1.0;
-                    ks=(int)ps;
-                    if(nr-1<ks)
-                      ks=nr-1;
-                    ps=ps-ks;
-                    if(ps>1.0)
-                      ps=1.0;
-                    betaS_jkp=((pBetaS3[ijkp][ks-1]*ps+pBetaS2[ijkp][ks-1])*ps
-                        +pBetaS1[ijkp][ks-1])*ps+pBetaS[ijkp][ks-1];
-                    dBetaS_jkp=(pBetaS6[ijkp][ks-1]*ps+pBetaS5[ijkp][ks-1])*ps
-                        +pBetaS4[ijkp][ks-1];
-                    cosAng_ijk=(-dis_ij[0]*dis_jk[0]-dis_ij[1]*dis_jk[1]
-                        -dis_ij[2]*dis_jk[2])/(r_ij*r_jk);
-                    dcA_ijk[0][0]=(dis_jk[0]*r_ij*r_jk-cosAng_ijk
-                        *-dis_ij[0]*r_jk*r_jk)/(r_ij*r_ij*r_jk*r_jk);
-                    dcA_ijk[1][0]=(dis_jk[1]*r_ij*r_jk-cosAng_ijk
-                        *-dis_ij[1]*r_jk*r_jk)/(r_ij*r_ij*r_jk*r_jk);
-                    dcA_ijk[2][0]=(dis_jk[2]*r_ij*r_jk-cosAng_ijk
-                        *-dis_ij[2]*r_jk*r_jk)/(r_ij*r_ij*r_jk*r_jk);
-                    dcA_ijk[0][1]=(-dis_ij[0]*r_ij*r_jk-cosAng_ijk
-                        *dis_jk[0]*r_ij*r_ij)/(r_ij*r_ij*r_jk*r_jk);
-                    dcA_ijk[1][1]=(-dis_ij[1]*r_ij*r_jk-cosAng_ijk
-                        *dis_jk[1]*r_ij*r_ij)/(r_ij*r_ij*r_jk*r_jk);
-                    dcA_ijk[2][1]=(-dis_ij[2]*r_ij*r_jk-cosAng_ijk
-                        *dis_jk[2]*r_ij*r_ij)/(r_ij*r_ij*r_jk*r_jk);
-                    gmean0=sigma_g0[itype-1][jtype-1][ktype-1];
-                    gmean1=sigma_g1[itype-1][jtype-1][ktype-1];
-                    gmean2=sigma_g2[itype-1][jtype-1][ktype-1];
-                    amean=cosAng_ijk;
-                    gfactor2=gmean0+gmean1*amean
-                        +gmean2*amean*amean;
-                    gprime2=gmean1+2.0*gmean2*amean;
-                    gmean0=sigma_g0[itype-1][ktype-1][jtype-1];
-                    gmean1=sigma_g1[itype-1][ktype-1][jtype-1];
-                    gmean2=sigma_g2[itype-1][ktype-1][jtype-1];
-                    cosAng_ikj=(dis_ik[0]*dis_jk[0]+dis_ik[1]*dis_jk[1]
-                        +dis_ik[2]*dis_jk[2])/(r_ik*r_jk);
-                    dcA_ikj[0][0]=(-dis_jk[0]*r_ik*r_jk-cosAng_ikj
-                        *-dis_ik[0]*r_jk*r_jk)/(r_ik*r_ik*r_jk*r_jk);
-                    dcA_ikj[1][0]=(-dis_jk[1]*r_ik*r_jk-cosAng_ikj
-                        *-dis_ik[1]*r_jk*r_jk)/(r_ik*r_ik*r_jk*r_jk);
-                    dcA_ikj[2][0]=(-dis_jk[2]*r_ik*r_jk-cosAng_ikj
-                        *-dis_ik[2]*r_jk*r_jk)/(r_ik*r_ik*r_jk*r_jk);
-                    dcA_ikj[0][1]=(-dis_ik[0]*r_ik*r_jk-cosAng_ikj
-                        *-dis_jk[0]*r_ik*r_ik)/(r_ik*r_ik*r_jk*r_jk);
-                    dcA_ikj[1][1]=(-dis_ik[1]*r_ik*r_jk-cosAng_ikj
-                        *-dis_jk[1]*r_ik*r_ik)/(r_ik*r_ik*r_jk*r_jk);
-                    dcA_ikj[2][1]=(-dis_ik[2]*r_ik*r_jk-cosAng_ikj
-                        *-dis_jk[2]*r_ik*r_ik)/(r_ik*r_ik*r_jk*r_jk);
-                    amean=cosAng_ikj;
-                    gfactor3=gmean0+gmean1*amean
-                        +gmean2*amean*amean;
-                    gprime3=gmean1+2.0*gmean2*amean;
-                    gfactor=gfactor1*gfactor2*gfactor3;
-                    rfactor=betaS_ik*betaS_jkp;
-
-//EE1 is (b) Eq. 12
-
-                    EE1=EE1+gfactor*rfactor;
-
-//rcm1 is derivative of EE1 w.r.t Beta(r_ik)
-//rcm2 is derivative of EE1 w.r.t Beta(r_jk')
-//gcm1 is derivative of EE1 w.r.t cos(theta_jik)
-//gcm2 is derivative of EE1 w.r.t cos(theta_ijk)
-//gcm3 is derivative of EE1 w.r.t cos(theta_ikj)
-
-                    rcm1=gfactor*betaS_jkp*dBetaS_ik/r_ik;
-                    rcm2=gfactor*betaS_ik*dBetaS_jkp/r_jkp;
-                    gcm1=rfactor*gprime1*gfactor2*gfactor3;
-                    gcm2=rfactor*gfactor1*gprime2*gfactor3;
-                    gcm3=rfactor*gfactor1*gfactor2*gprime3;
-                    bt_sg[nb_ij].dEE1[0]+=
-                        gcm1*dcA_jik[0][0]
-                        -gcm2*dcA_ijk[0][0];
-                    bt_sg[nb_ij].dEE1[1]+=
-                        gcm1*dcA_jik[1][0]
-                        -gcm2*dcA_ijk[1][0];
-                    bt_sg[nb_ij].dEE1[2]+=
-                        gcm1*dcA_jik[2][0]
-                        -gcm2*dcA_ijk[2][0];
-                    bt_sg[nb_ik].dEE1[0]+=
-                        gcm1*dcA_jik[0][1]
-                        +rcm1*dis_ik[0]
-                        -gcm3*dcA_ikj[0][0];
-                    bt_sg[nb_ik].dEE1[1]+=
-                        gcm1*dcA_jik[1][1]
-                        +rcm1*dis_ik[1]
-                        -gcm3*dcA_ikj[1][0];
-                    bt_sg[nb_ik].dEE1[2]+=
-                        gcm1*dcA_jik[2][1]
-                        +rcm1*dis_ik[2]
-                        -gcm3*dcA_ikj[2][0];
-                    bt_sg[nb_jk].dEE1[0]+=
-                        gcm2*dcA_ijk[0][1]
-                        +rcm2*dis_jkp[0]
-                        -gcm3*dcA_ikj[0][1];
-                    bt_sg[nb_jk].dEE1[1]+=
-                        gcm2*dcA_ijk[1][1]
-                        +rcm2*dis_jkp[1]
-                        -gcm3*dcA_ikj[1][1];
-                    bt_sg[nb_jk].dEE1[2]+=
-                        gcm2*dcA_ijk[2][1]
-                        +rcm2*dis_jkp[2]
-                        -gcm3*dcA_ikj[2][1];
-                  }
-                }
-
-// k and k' and j are all different neighbors of i
-
-                for(ltmp=0;ltmp<ktmp;ltmp++) {
-                  if(ltmp!=jtmp) {
-                    temp_ikp=BOP_index[i]+ltmp;
-                    kp=iilist[ltmp];;
-                    kptype = map[type[kp]]+1;
-                    if(itype==kptype)
-                      iikp=itype-1;
-                    else if(itype<kptype)
-                      iikp=itype*bop_types-itype*(itype+1)/2+kptype-1;
-                    else
-                      iikp=kptype*bop_types-kptype*(kptype+1)/2+itype-1;
-                    for(nsearch=0;nsearch<nSigBk[n];nsearch++) {
-                      ncmp=itypeSigBk[n][nsearch];
-                      if(x[ncmp][0]==x[kp][0]) {
-                        if(x[ncmp][1]==x[kp][1]) {
-                          if(x[ncmp][2]==x[kp][2]) {
-                            break;
-                          }
-                        }
-                      }
-                    }
-                    dis_ikp[0]=x[kp][0]-x[i][0];
-                    dis_ikp[1]=x[kp][1]-x[i][1];
-                    dis_ikp[2]=x[kp][2]-x[i][2];
-                    rsq_ikp=dis_ikp[0]*dis_ikp[0]
-                        +dis_ikp[1]*dis_ikp[1]
-                        +dis_ikp[2]*dis_ikp[2];
-                    r_ikp=sqrt(rsq_ikp);
-                    if(r_ikp<=rcut[iikp]) {
-                      ps=r_ikp*rdr[iikp]+1.0;
-                      ks=(int)ps;
-                      if(nr-1<ks)
-                        ks=nr-1;
-                      ps=ps-ks;
-                      if(ps>1.0)
-                        ps=1.0;
-                      betaS_ikp=((pBetaS3[iikp][ks-1]*ps+pBetaS2[iikp][ks-1])*ps
-                          +pBetaS1[iikp][ks-1])*ps+pBetaS[iikp][ks-1];
-                      dBetaS_ikp=(pBetaS6[iikp][ks-1]*ps+pBetaS5[iikp][ks-1])*ps
-                          +pBetaS4[iikp][ks-1];
-                      nb_ikp=nb_t;
-                      nb_t++;
-                      if(nb_t>nb_sg) {
-                        new_n_tot=nb_sg+maxneigh;
-                        grow_sigma(nb_sg,new_n_tot);
-                        nb_sg=new_n_tot;
-                      }
-                      bt_sg[nb_ikp].temp=temp_ikp;
-                      bt_sg[nb_ikp].i=i;
-                      bt_sg[nb_ikp].j=kp;
-                      gmean0=sigma_g0[jtype-1][itype-1][kptype-1];
-                      gmean1=sigma_g1[jtype-1][itype-1][kptype-1];
-                      gmean2=sigma_g2[jtype-1][itype-1][kptype-1];
-                      cosAng_jikp=(dis_ij[0]*dis_ikp[0]+dis_ij[1]*dis_ikp[1]
-                          +dis_ij[2]*dis_ikp[2])/(r_ij*r_ikp);
-                      dcA_jikp[0][0]=(dis_ikp[0]*r_ij*r_ikp-cosAng_jikp
-                          *dis_ij[0]*r_ikp*r_ikp)/(r_ij*r_ij*r_ikp*r_ikp);
-                      dcA_jikp[1][0]=(dis_ikp[1]*r_ij*r_ikp-cosAng_jikp
-                          *dis_ij[1]*r_ikp*r_ikp)/(r_ij*r_ij*r_ikp*r_ikp);
-                      dcA_jikp[2][0]=(dis_ikp[2]*r_ij*r_ikp-cosAng_jikp
-                          *dis_ij[2]*r_ikp*r_ikp)/(r_ij*r_ij*r_ikp*r_ikp);
-                      dcA_jikp[0][1]=(dis_ij[0]*r_ij*r_ikp-cosAng_jikp
-                          *dis_ikp[0]*r_ij*r_ij)/(r_ij*r_ij*r_ikp*r_ikp);
-                      dcA_jikp[1][1]=(dis_ij[1]*r_ij*r_ikp-cosAng_jikp
-                          *dis_ikp[1]*r_ij*r_ij)/(r_ij*r_ij*r_ikp*r_ikp);
-                      dcA_jikp[2][1]=(dis_ij[2]*r_ij*r_ikp-cosAng_jikp
-                          *dis_ikp[2]*r_ij*r_ij)/(r_ij*r_ij*r_ikp*r_ikp);
-                      cosAng_kikp=(dis_ik[0]*dis_ikp[0]+dis_ik[1]*dis_ikp[1]
-                          +dis_ik[2]*dis_ikp[2])/(r_ik*r_ikp);
-                      dcA_kikp[0][0]=(dis_ikp[0]*r_ik*r_ikp-cosAng_kikp
-                          *dis_ik[0]*r_ikp*r_ikp)/(r_ik*r_ik*r_ikp*r_ikp);
-                      dcA_kikp[1][0]=(dis_ikp[1]*r_ik*r_ikp-cosAng_kikp
-                          *dis_ik[1]*r_ikp*r_ikp)/(r_ik*r_ik*r_ikp*r_ikp);
-                      dcA_kikp[2][0]=(dis_ikp[2]*r_ik*r_ikp-cosAng_kikp
-                          *dis_ik[2]*r_ikp*r_ikp)/(r_ik*r_ik*r_ikp*r_ikp);
-                      dcA_kikp[0][1]=(dis_ik[0]*r_ik*r_ikp-cosAng_kikp
-                          *dis_ikp[0]*r_ik*r_ik)/(r_ik*r_ik*r_ikp*r_ikp);
-                      dcA_kikp[1][1]=(dis_ik[1]*r_ik*r_ikp-cosAng_kikp
-                          *dis_ikp[1]*r_ik*r_ik)/(r_ik*r_ik*r_ikp*r_ikp);
-                      dcA_kikp[2][1]=(dis_ik[2]*r_ik*r_ikp-cosAng_kikp
-                          *dis_ikp[2]*r_ik*r_ik)/(r_ik*r_ik*r_ikp*r_ikp);
-                      amean=cosAng_jikp;
-                      gfactor2=gmean0+gmean1*amean
-                          +gmean2*amean*amean;
-                      gprime2=gmean1+2.0*gmean2*amean;
-                      gmean0=sigma_g0[ktype-1][itype-1][kptype-1];
-                      gmean1=sigma_g1[ktype-1][itype-1][kptype-1];
-                      gmean2=sigma_g2[ktype-1][itype-1][kptype-1];
-                      amean=cosAng_kikp;
-                      gfactor3=gmean0+gmean1*amean
-                          +gmean2*amean*amean;
-                      gprime3=gmean1+2.0*gmean2*amean;
-                      gfactor=gfactor1*gfactor2*gfactor3;
-                      rfactorrt=betaS_ik*betaS_ikp;
-                      rfactor=rfactorrt*rfactorrt;
-
-//2nd CC is second term of Eq. 11 (c) for i atom where j , k & k' =neighbor of i
-
-                      CC=CC+2.0*gfactor*rfactor;
-
-//agpdpr1 is derivative of CC 2nd term w.r.t. Beta(r_ik)
-//agpdpr2 is derivative of CC 2nd term w.r.t. Beta(r_ik')
-//app1 is derivative of CC 2nd term w.r.t. cos(theta_jik)
-//app2 is derivative of CC 2nd term w.r.t. cos(theta_jik')
-//app3 is derivative of CC 2nd term w.r.t. cos(theta_kik')
-
-                      agpdpr1=4.0*gfactor*rfactorrt*betaS_ikp
-                          *dBetaS_ik/r_ik;
-                      agpdpr2=4.0*gfactor*rfactorrt*betaS_ik
-                          *dBetaS_ikp/r_ikp;
-                      app1=2.0*rfactor*gfactor2*gfactor3*gprime1;
-                      app2=2.0*rfactor*gfactor1*gfactor3*gprime2;
-                      app3=2.0*rfactor*gfactor1*gfactor2*gprime3;
-                      bt_sg[nb_ij].dCC[0]+=
-                          app1*dcA_jik[0][0]
-                          +app2*dcA_jikp[0][0];
-                      bt_sg[nb_ij].dCC[1]+=
-                          app1*dcA_jik[1][0]
-                          +app2*dcA_jikp[1][0];
-                      bt_sg[nb_ij].dCC[2]+=
-                          app1*dcA_jik[2][0]
-                          +app2*dcA_jikp[2][0];
-                      bt_sg[nb_ik].dCC[0]+=
-                          app1*dcA_jik[0][1]
-                          +app3*dcA_kikp[0][0]
-                          +agpdpr1*dis_ik[0];
-                      bt_sg[nb_ik].dCC[1]+=
-                          app1*dcA_jik[1][1]
-                          +app3*dcA_kikp[1][0]
-                          +agpdpr1*dis_ik[1];
-                      bt_sg[nb_ik].dCC[2]+=
-                          app1*dcA_jik[2][1]
-                          +app3*dcA_kikp[2][0]
-                          +agpdpr1*dis_ik[2];
-                      bt_sg[nb_ikp].dCC[0]=
-                          app2*dcA_jikp[0][1]
-                          +app3*dcA_kikp[0][1]
-                          +agpdpr2*dis_ikp[0];
-                      bt_sg[nb_ikp].dCC[1]=
-                          app2*dcA_jikp[1][1]
-                          +app3*dcA_kikp[1][1]
-                          +agpdpr2*dis_ikp[1];
-                      bt_sg[nb_ikp].dCC[2]=
-                          app2*dcA_jikp[2][1]
-                          +app3*dcA_kikp[2][1]
-                          +agpdpr2*dis_ikp[2];
-                    }
-                  }
-                }
-
-// j and k are different neighbors of i and k' is a neighbor k not equal to i
-
-                for(ltmp=0;ltmp<numneigh[k];ltmp++) {
-                  temp_kkp=BOP_index[k]+ltmp;
-                  kp=klist[ltmp];;
-                  kptype = map[type[kp]]+1;
-                  same_ikp=0;
-                  same_jkp=0;
-                  if(x[i][0]==x[kp][0]) {
-                    if(x[i][1]==x[kp][1]) {
-                      if(x[i][2]==x[kp][2]) {
-                        same_ikp=1;
-                      }
-                    }
-                  }
-                  if(x[j][0]==x[kp][0]) {
-                    if(x[j][1]==x[kp][1]) {
-                      if(x[j][2]==x[kp][2]) {
-                        same_jkp=1;
-                      }
-                    }
-                  }
-                  if(!same_ikp&&!same_jkp) {
-                    if(ktype==kptype)
-                      ikkp=ktype-1;
-                    else if(ktype<kptype)
-                      ikkp=ktype*bop_types-ktype*(ktype+1)/2+kptype-1;
-                    else
-                      ikkp=kptype*bop_types-kptype*(kptype+1)/2+ktype-1;
-                    dis_kkp[0]=x[kp][0]-x[k][0];
-                    dis_kkp[1]=x[kp][1]-x[k][1];
-                    dis_kkp[2]=x[kp][2]-x[k][2];
-                    rsq_kkp=dis_kkp[0]*dis_kkp[0]
-                        +dis_kkp[1]*dis_kkp[1]
-                        +dis_kkp[2]*dis_kkp[2];
-                    r_kkp=sqrt(rsq_kkp);
-                    if(r_kkp<=rcut[ikkp]) {
-                      ps=r_kkp*rdr[ikkp]+1.0;
-                      ks=(int)ps;
-                      if(nr-1<ks)
-                        ks=nr-1;
-                      ps=ps-ks;
-                      if(ps>1.0)
-                        ps=1.0;
-                      betaS_kkp=((pBetaS3[ikkp][ks-1]*ps+pBetaS2[ikkp][ks-1])*ps
-                          +pBetaS1[ikkp][ks-1])*ps+pBetaS[ikkp][ks-1];
-                      dBetaS_kkp=(pBetaS6[ikkp][ks-1]*ps+pBetaS5[ikkp][ks-1])*ps
-                          +pBetaS4[ikkp][ks-1];
-                      sig_flag=0;
-                      for(nsearch=0;nsearch<nSigBk[n];nsearch++) {
-                        ncmp=itypeSigBk[n][nsearch];
-                        if(x[ncmp][0]==x[kp][0]) {
-                          if(x[ncmp][1]==x[kp][1]) {
-                            if(x[ncmp][2]==x[kp][2]) {
-                              sig_flag=1;
-                              nkp=nsearch;
-                              break;
-                            }
-                          }
-                        }
-                      }
-                      if(sig_flag==0) {
-                        nSigBk[n]=nSigBk[n]+1;
-                        nkp=nSigBk[n]-1;
-                        itypeSigBk[n][nkp]=kp;
-                      }
-                      cosAng_ikkp=(-dis_ik[0]*dis_kkp[0]-dis_ik[1]*dis_kkp[1]
-                          -dis_ik[2]*dis_kkp[2])/(r_ik*r_kkp);
-                      dcA_ikkp[0][0]=(dis_kkp[0]*r_ik*r_kkp-cosAng_ikkp
-                          *-dis_ik[0]*r_kkp*r_kkp)/(r_ik*r_ik*r_kkp*r_kkp);
-                      dcA_ikkp[1][0]=(dis_kkp[1]*r_ik*r_kkp-cosAng_ikkp
-                          *-dis_ik[1]*r_kkp*r_kkp)/(r_ik*r_ik*r_kkp*r_kkp);
-                      dcA_ikkp[2][0]=(dis_kkp[2]*r_ik*r_kkp-cosAng_ikkp
-                          *-dis_ik[2]*r_kkp*r_kkp)/(r_ik*r_ik*r_kkp*r_kkp);
-                      dcA_ikkp[0][1]=(-dis_ik[0]*r_ik*r_kkp-cosAng_ikkp
-                          *dis_kkp[0]*r_ik*r_ik)/(r_ik*r_ik*r_kkp*r_kkp);
-                      dcA_ikkp[1][1]=(-dis_ik[1]*r_ik*r_kkp-cosAng_ikkp
-                          *dis_kkp[1]*r_ik*r_ik)/(r_ik*r_ik*r_kkp*r_kkp);
-                      dcA_ikkp[2][1]=(-dis_ik[2]*r_ik*r_kkp-cosAng_ikkp
-                          *dis_kkp[2]*r_ik*r_ik)/(r_ik*r_ik*r_kkp*r_kkp);
-                      nb_kkp=nb_t;
-                      nb_t++;
-                      if(nb_t>nb_sg) {
-                        new_n_tot=nb_sg+maxneigh;
-                        grow_sigma(nb_sg,new_n_tot);
-                        nb_sg=new_n_tot;
-                      }
-                      bt_sg[nb_kkp].temp=temp_kkp;
-                      bt_sg[nb_kkp].i=k;
-                      bt_sg[nb_kkp].j=kp;
-                      gmean0=sigma_g0[itype-1][ktype-1][kptype-1];
-                      gmean1=sigma_g1[itype-1][ktype-1][kptype-1];
-                      gmean2=sigma_g2[itype-1][ktype-1][kptype-1];
-                      amean=cosAng_ikkp;
-                      gfactor2=gmean0+gmean1*amean
-                          +gmean2*amean*amean;
-                      gprime2=gmean1+2.0*gmean2*amean;
-                      gfactorsq2=gfactor2*gfactor2;
-                      gsqprime2=2.0*gfactor2*gprime2;
-                      gfactor=gfactorsq*gfactorsq2;
-                      rfactorrt=betaS_ik*betaS_kkp;
-                      rfactor=rfactorrt*rfactorrt;
-
-//3rd CC is third term of Eq. 11 (c) for i atom
-//where j , k =neighbor of i & k' =neighbor of k
-
-                      CC=CC+gfactor*rfactor;
-
-//agpdpr1 is derivative of CC 3rd term w.r.t. Beta(r_ik)
-//agpdpr2 is derivative of CC 3rd term w.r.t. Beta(r_kk')
-//app1 is derivative of CC 3rd term w.r.t. cos(theta_jik)
-//app2 is derivative of CC 3rd term w.r.t. cos(theta_ikk')
-
-                      agpdpr1=2.0*gfactor*rfactorrt*betaS_kkp
-                          *dBetaS_ik/r_ik;
-                      agpdpr2=2.0*gfactor*rfactorrt*betaS_ik
-                          *dBetaS_kkp/r_kkp;
-                      app1=rfactor*gfactorsq2*gsqprime;
-                      app2=rfactor*gfactorsq*gsqprime2;
-                      bt_sg[nb_ij].dCC[0]+=
-                          app1*dcA_jik[0][0];
-                      bt_sg[nb_ij].dCC[1]+=
-                          app1*dcA_jik[1][0];
-                      bt_sg[nb_ij].dCC[2]+=
-                          app1*dcA_jik[2][0];
-                      bt_sg[nb_ik].dCC[0]+=
-                          app1*dcA_jik[0][1]
-                          +agpdpr1*dis_ik[0]
-                          -app2*dcA_ikkp[0][0];
-                      bt_sg[nb_ik].dCC[1]+=
-                          app1*dcA_jik[1][1]
-                          +agpdpr1*dis_ik[1]
-                          -app2*dcA_ikkp[1][0];
-                      bt_sg[nb_ik].dCC[2]+=
-                          app1*dcA_jik[2][1]
-                          +agpdpr1*dis_ik[2]
-                          -app2*dcA_ikkp[2][0];
-                      bt_sg[nb_kkp].dCC[0]+=
-                          app2*dcA_ikkp[0][1]
-                          +agpdpr2*dis_kkp[0];
-                      bt_sg[nb_kkp].dCC[1]+=
-                          app2*dcA_ikkp[1][1]
-                          +agpdpr2*dis_kkp[1];
-                      bt_sg[nb_kkp].dCC[2]+=
-                          app2*dcA_ikkp[2][1]
-                          +agpdpr2*dis_kkp[2];
-                    }
-                  }
-                }
-
-//j and k are different neighbors of i and k' is a neighbor j not equal to k
-
-                for(ltmp=0;ltmp<numneigh[j];ltmp++) {
-                  sig_flag=0;
-                  temp_jkp=BOP_index[j]+ltmp;
-                  kp=jlist[ltmp];
-                  kptype = map[type[kp]]+1;
-                  kplist=firstneigh[kp];
-
-                  same_kkpk=0;
-                  same_jkpj=0;
-
-                  for(kpNeij=0;kpNeij<numneigh[kp];kpNeij++) {
-                    kpj=kplist[kpNeij];
-                    if(x[j][0]==x[kpj][0]) {
-                      if(x[j][1]==x[kpj][1]) {
-                        if(x[j][2]==x[kpj][2]) {
-                          same_jkpj=1;
-                          break;
-                        }
-                      }
-                    }
-                  }
-                  for(kpNeik=0;kpNeik<numneigh[kp];kpNeik++) {
-                    kpk=kplist[kpNeik];
-                    if(x[k][0]==x[kpk][0]) {
-                      if(x[k][1]==x[kpk][1]) {
-                        if(x[k][2]==x[kpk][2]) {
-                          same_kkpk=1;
-                          break;
-                        }
-                      }
-                    }
-                  }
-                  if(!same_jkpj&&!same_kkpk) {
-                    same_kkpk=0;
-                    for(kNeikp=0;kNeikp<numneigh[k];kNeikp++) {
-                      temp_kkp=BOP_index[k]+kNeikp;
-                      kkp=kplist[kNeikp];
-                      if(x[kp][0]==x[kkp][0]) {
-                        if(x[kp][1]==x[kkp][1]) {
-                          if(x[kp][2]==x[kkp][2]) {
-                            sig_flag=1;
-                            break;
-                          }
-                        }
-                      }
-                    }
-                    if(sig_flag==1) {
-                      for(nsearch=0;nsearch<numneigh[kp];nsearch++) {
-                        ncmp=kplist[nsearch];
-                        if(x[ncmp][0]==x[j][0]) {
-                          if(x[ncmp][1]==x[j][1]) {
-                            if(x[ncmp][2]==x[j][2]) {
-                              kpNeij=nsearch;
-                            }
-                          }
-                        }
-                        if(x[ncmp][0]==x[k][0]) {
-                          if(x[ncmp][1]==x[k][1]) {
-                            if(x[ncmp][2]==x[k][2]) {
-                              kpNeik=nsearch;
-                            }
-                          }
-                        }
-                      }
-                      if(jtype==kptype)
-                        ijkp=jtype-1;
-                      else if(jtype<kptype)
-                        ijkp=jtype*bop_types-jtype*(jtype+1)/2+kptype-1;
-                      else
-                        ijkp=kptype*bop_types-kptype*(kptype+1)/2+jtype-1;
-                      if(ktype==kptype)
-                        ikkp=ktype-1;
-                      else if(ktype<kptype)
-                        ikkp=ktype*bop_types-ktype*(ktype+1)/2+kptype-1;
-                      else
-                        ikkp=kptype*bop_types-kptype*(kptype+1)/2+ktype-1;
-
-                      dis_jkp[0]=x[kp][0]-x[j][0];
-                      dis_jkp[1]=x[kp][1]-x[j][1];
-                      dis_jkp[2]=x[kp][2]-x[j][2];
-                      rsq_jkp=dis_jkp[0]*dis_jkp[0]
-                          +dis_jkp[1]*dis_jkp[1]
-                          +dis_jkp[2]*dis_jkp[2];
-                      r_jkp=sqrt(rsq_jkp);
-                      ps=r_jkp*rdr[ijkp]+1.0;
-                      ks=(int)ps;
-                      if(nr-1<ks)
-                        ks=nr-1;
-                      ps=ps-ks;
-                      if(ps>1.0)
-                        ps=1.0;
-                      betaS_jkp=((pBetaS3[ijkp][ks-1]*ps+pBetaS2[ijkp][ks-1])*ps
-                          +pBetaS1[ijkp][ks-1])*ps+pBetaS[ijkp][ks-1];
-                      dBetaS_jkp=(pBetaS6[ijkp][ks-1]*ps+pBetaS5[ijkp][ks-1])*ps
-                          +pBetaS4[ijkp][ks-1];
-                      dis_kkp[0]=x[kp][0]-x[k][0];
-                      dis_kkp[1]=x[kp][1]-x[k][1];
-                      dis_kkp[2]=x[kp][2]-x[k][2];
-                      rsq_kkp=dis_kkp[0]*dis_kkp[0]
-                          +dis_kkp[1]*dis_kkp[1]
-                          +dis_kkp[2]*dis_kkp[2];
-                      r_kkp=sqrt(rsq_kkp);
-                      ps=r_kkp*rdr[ikkp]+1.0;
-                      ks=(int)ps;
-                      if(nr-1<ks)
-                        ks=nr-1;
-                      ps=ps-ks;
-                      if(ps>1.0)
-                        ps=1.0;
-                      betaS_kkp=((pBetaS3[ikkp][ks-1]*ps+pBetaS2[ikkp][ks-1])*ps
-                          +pBetaS1[ikkp][ks-1])*ps+pBetaS[ikkp][ks-1];
-                      dBetaS_kkp=(pBetaS6[ikkp][ks-1]*ps+pBetaS5[ikkp][ks-1])*ps
-                          +pBetaS4[ikkp][ks-1];
-                      cosAng_ijkp=(-dis_ij[0]*dis_jkp[0]-dis_ij[1]*dis_jkp[1]
-                          -dis_ij[2]*dis_jkp[2])/(r_ij*r_jkp);
-                      dcA_ijkp[0][0]=(dis_jkp[0]*r_ij*r_jkp-cosAng_ijkp
-                          *-dis_ij[0]*r_jkp*r_jkp)/(r_ij*r_ij*r_jkp*r_jkp);
-                      dcA_ijkp[1][0]=(dis_jkp[1]*r_ij*r_jkp-cosAng_ijkp
-                          *-dis_ij[1]*r_jkp*r_jkp)/(r_ij*r_ij*r_jkp*r_jkp);
-                      dcA_ijkp[2][0]=(dis_jkp[2]*r_ij*r_jkp-cosAng_ijkp
-                          *-dis_ij[2]*r_jkp*r_jkp)/(r_ij*r_ij*r_jkp*r_jkp);
-                      dcA_ijkp[0][1]=(-dis_ij[0]*r_ij*r_jkp-cosAng_ijkp
-                          *dis_jkp[0]*r_ij*r_ij)/(r_ij*r_ij*r_jkp*r_jkp);
-                      dcA_ijkp[1][1]=(-dis_ij[1]*r_ij*r_jkp-cosAng_ijkp
-                          *dis_jkp[1]*r_ij*r_ij)/(r_ij*r_ij*r_jkp*r_jkp);
-                      dcA_ijkp[2][1]=(-dis_ij[2]*r_ij*r_jkp-cosAng_ijkp
-                          *dis_jkp[2]*r_ij*r_ij)/(r_ij*r_ij*r_jkp*r_jkp);
-                      cosAng_ikkp=(-dis_ik[0]*dis_kkp[0]-dis_ik[1]*dis_kkp[1]
-                          -dis_ik[2]*dis_kkp[2])/(r_ik*r_kkp);
-                      dcA_ikkp[0][0]=(dis_kkp[0]*r_ik*r_kkp-cosAng_ikkp
-                          *-dis_ik[0]*r_kkp*r_kkp)/(r_ik*r_ik*r_kkp*r_kkp);
-                      dcA_ikkp[1][0]=(dis_kkp[1]*r_ik*r_kkp-cosAng_ikkp
-                          *-dis_ik[1]*r_kkp*r_kkp)/(r_ik*r_ik*r_kkp*r_kkp);
-                      dcA_ikkp[2][0]=(dis_kkp[2]*r_ik*r_kkp-cosAng_ikkp
-                          *-dis_ik[2]*r_kkp*r_kkp)/(r_ik*r_ik*r_kkp*r_kkp);
-                      dcA_ikkp[0][1]=(-dis_ik[0]*r_ik*r_kkp-cosAng_ikkp
-                          *dis_kkp[0]*r_ik*r_ik)/(r_ik*r_ik*r_kkp*r_kkp);
-                      dcA_ikkp[1][1]=(-dis_ik[1]*r_ik*r_kkp-cosAng_ikkp
-                          *dis_kkp[1]*r_ik*r_ik)/(r_ik*r_ik*r_kkp*r_kkp);
-                      dcA_ikkp[2][1]=(-dis_ik[2]*r_ik*r_kkp-cosAng_ikkp
-                          *dis_kkp[2]*r_ik*r_ik)/(r_ik*r_ik*r_kkp*r_kkp);
-                      cosAng_jkpk=(dis_jkp[0]*dis_kkp[0]+dis_jkp[1]*dis_kkp[1]
-                          +dis_jkp[2]*dis_kkp[2])/(r_jkp*r_kkp);
-                      dcA_jkpk[0][0]=(-dis_kkp[0]*r_jkp*r_kkp-cosAng_jkpk
-                          *-dis_jkp[0]*r_kkp*r_kkp)/(r_jkp*r_jkp*r_kkp*r_kkp);
-                      dcA_jkpk[1][0]=(-dis_kkp[1]*r_jkp*r_kkp-cosAng_jkpk
-                          *-dis_jkp[1]*r_kkp*r_kkp)/(r_jkp*r_jkp*r_kkp*r_kkp);
-                      dcA_jkpk[2][0]=(-dis_kkp[2]*r_jkp*r_kkp-cosAng_jkpk
-                          *-dis_jkp[2]*r_kkp*r_kkp)/(r_jkp*r_jkp*r_kkp*r_kkp);
-                      dcA_jkpk[0][1]=(-dis_jkp[0]*r_jkp*r_kkp-cosAng_jkpk
-                          *-dis_kkp[0]*r_jkp*r_jkp)/(r_jkp*r_jkp*r_kkp*r_kkp);
-                      dcA_jkpk[1][1]=(-dis_jkp[1]*r_jkp*r_kkp-cosAng_jkpk
-                          *-dis_kkp[1]*r_jkp*r_jkp)/(r_jkp*r_jkp*r_kkp*r_kkp);
-                      dcA_jkpk[2][1]=(-dis_jkp[2]*r_jkp*r_kkp-cosAng_jkpk
-                          *-dis_kkp[2]*r_jkp*r_jkp)/(r_jkp*r_jkp*r_kkp*r_kkp);
-                      sig_flag=0;
-                      for(nsearch=0;nsearch<nSigBk[n];nsearch++) {
-                        ncmp=itypeSigBk[n][nsearch];
-                        if(x[ncmp][0]==x[kp][0]) {
-                          if(x[ncmp][1]==x[kp][1]) {
-                            if(x[ncmp][2]==x[kp][2]) {
-                              nkp=nsearch;
-                              sig_flag=1;
-                              break;
-                            }
-                          }
-                        }
-                      }
-                      if(sig_flag==0) {
-                        nSigBk[n]=nSigBk[n]+1;
-                        nkp=nSigBk[n]-1;
-                        itypeSigBk[n][nkp]=kp;
-                      }
-                      nb_jkp=nb_t;
-                      nb_t++;
-                      if(nb_t>nb_sg) {
-                        new_n_tot=nb_sg+maxneigh;
-                        grow_sigma(nb_sg,new_n_tot);
-                        nb_sg=new_n_tot;
-                      }
-                      bt_sg[nb_jkp].temp=temp_jkp;
-                      bt_sg[nb_jkp].i=j;
-                      bt_sg[nb_jkp].j=kp;
-                      nb_kkp=nb_t;
-                      nb_t++;
-                      if(nb_t>nb_sg) {
-                        new_n_tot=nb_sg+maxneigh;
-                        grow_sigma(nb_sg,new_n_tot);
-                        nb_sg=new_n_tot;
-                      }
-                      bt_sg[nb_kkp].temp=temp_kkp;
-                      bt_sg[nb_kkp].i=k;
-                      bt_sg[nb_kkp].j=kp;
-                      gmean0=sigma_g0[itype-1][jtype-1][kptype-1];
-                      gmean1=sigma_g1[itype-1][jtype-1][kptype-1];
-                      gmean2=sigma_g2[itype-1][jtype-1][kptype-1];
-                      amean=cosAng_ijkp;
-                      gfactor2=gmean0+gmean1*amean
-                          +gmean2*amean*amean;
-                      gprime2=gmean1+2.0*gmean2*amean;
-                      gmean0=sigma_g0[itype-1][ktype-1][kptype-1];
-                      gmean1=sigma_g1[itype-1][ktype-1][kptype-1];
-                      gmean2=sigma_g2[itype-1][ktype-1][kptype-1];
-                      amean=cosAng_ikkp;
-                      gfactor3=gmean0+gmean1*amean
-                          +gmean2*amean*amean;
-                      gprime3=gmean1+2.0*gmean2*amean;
-                      gmean0=sigma_g0[jtype-1][kptype-1][ktype-1];
-                      gmean1=sigma_g1[jtype-1][kptype-1][ktype-1];
-                      gmean2=sigma_g2[jtype-1][kptype-1][ktype-1];
-                      amean=cosAng_jkpk;
-                      gfactor4=gmean0+gmean1*amean
-                          +gmean2*amean*amean;
-                      gprime4=gmean1+2.0*gmean2*amean;
-                      gfactor=gfactor1*gfactor2*gfactor3*gfactor4;
-                      rfactor0=(betaS_ik+small2)*(betaS_jkp+small2)
-                          *(betaS_kkp+small2);
-                      rfactor=pow(rfactor0,2.0/3.0);
-                      drfactor=2.0/3.0*pow(rfactor0,-1.0/3.0);
-
-//EE is Eq. 25(notes)
-
-                      EE=EE+gfactor*rfactor;
-
-//agpdpr1 is derivative of agpdpr1 w.r.t. Beta(r_ik)
-//agpdpr2 is derivative of agpdpr1 w.r.t. Beta(r_jk')
-//agpdpr3 is derivative of agpdpr1 w.r.t. Beta(r_kk')
-//app1 is derivative of agpdpr1 w.r.t. cos(theta_jik)
-//app2 is derivative of agpdpr1 w.r.t. cos(theta_ijk')
-//app3 is derivative of agpdpr1 w.r.t. cos(theta_ikk')
-//app4 is derivative of agpdpr1 w.r.t. cos(theta_jk'k)
-
-                      agpdpr1=gfactor*drfactor*(betaS_jkp+small2)*(betaS_kkp
-                          +small2)*dBetaS_ik/r_ik;
-                      agpdpr2=gfactor*drfactor*(betaS_ik+small2)*(betaS_kkp
-                          +small2)*dBetaS_jkp/r_jkp;
-                      agpdpr3=gfactor*drfactor*(betaS_ik+small2)*(betaS_jkp
-                          +small2)*dBetaS_kkp/r_kkp;
-                      app1=rfactor*gfactor2*gfactor3*gfactor4*gprime1;
-                      app2=rfactor*gfactor1*gfactor3*gfactor4*gprime2;
-                      app3=rfactor*gfactor1*gfactor2*gfactor4*gprime3;
-                      app4=rfactor*gfactor1*gfactor2*gfactor3*gprime4;
-                      bt_sg[nb_ij].dEE[0]+=
-                          app1*dcA_jik[0][0]
-                          -app2*dcA_ijkp[0][0];
-                      bt_sg[nb_ij].dEE[1]+=
-                          app1*dcA_jik[1][0]
-                          -app2*dcA_ijkp[1][0];
-                      bt_sg[nb_ij].dEE[2]+=
-                          app1*dcA_jik[2][0]
-                          -app2*dcA_ijkp[2][0];
-                      bt_sg[nb_ik].dEE[0]+=
-                          app1*dcA_jik[0][1]
-                          +agpdpr1*dis_ik[0]
-                          -app3*dcA_ikkp[0][0];
-                      bt_sg[nb_ik].dEE[1]+=
-                          app1*dcA_jik[1][1]
-                          +agpdpr1*dis_ik[1]
-                          -app3*dcA_ikkp[1][0];
-                      bt_sg[nb_ik].dEE[2]+=
-                          app1*dcA_jik[2][1]
-                          +agpdpr1*dis_ik[2]
-                          -app3*dcA_ikkp[2][0];
-                      bt_sg[nb_jkp].dEE[0]+=
-                          app2*dcA_ijkp[0][1]
-                          +agpdpr2*dis_jkp[0]
-                          -app4*dcA_jkpk[0][0];
-                      bt_sg[nb_jkp].dEE[1]+=
-                          app2*dcA_ijkp[1][1]
-                          +agpdpr2*dis_jkp[1]
-                          -app4*dcA_jkpk[1][0];
-                      bt_sg[nb_jkp].dEE[2]+=
-                          app2*dcA_ijkp[2][1]
-                          +agpdpr2*dis_jkp[2]
-                          -app4*dcA_jkpk[2][0];
-                      bt_sg[nb_kkp].dEE[0]+=
-                          app3*dcA_ikkp[0][1]
-                          +agpdpr3*dis_kkp[0]
-                          -app4*dcA_jkpk[0][1];
-                      bt_sg[nb_kkp].dEE[1]+=
-                          app3*dcA_ikkp[1][1]
-                          +agpdpr3*dis_kkp[1]
-                          -app4*dcA_jkpk[1][1];
-                      bt_sg[nb_kkp].dEE[2]+=
-                          app3*dcA_ikkp[2][1]
-                          +agpdpr3*dis_kkp[2]
-                          -app4*dcA_jkpk[2][1];
-                    }
-                  }
-                }
-              }
-            }
-          }
-
-//j is a neighbor of i and k is a neighbor of j not equal to i
-
-          for(ktmp=0;ktmp<numneigh[j];ktmp++) {
-            if(ktmp!=ji) {
-              temp_jk=BOP_index[j]+ktmp;
-              k=jlist[ktmp];
-              klist=firstneigh[k];
-              ktype=map[type[k]]+1;
-              for(kNeij=0;kNeij<numneigh[k];kNeij++) {
-                if(x[klist[kNeij]][0]==x[j][0]) {
-                  if(x[klist[kNeij]][1]==x[j][1]) {
-                    if(x[klist[kNeij]][2]==x[j][2]) {
-                      break;
-                    }
-                  }
-                }
-              }
-              if(jtype==ktype)
-                ijk=jtype-1;
-              else if(jtype<ktype)
-                ijk=jtype*bop_types-jtype*(jtype+1)/2+ktype-1;
-              else
-                ijk=ktype*bop_types-ktype*(ktype+1)/2+jtype-1;
-              sig_flag=0;
-              for(nsearch=0;nsearch<nSigBk[n];nsearch++) {
-                ncmp=itypeSigBk[n][nsearch];
-                if(x[ncmp][0]==x[k][0]) {
-                  if(x[ncmp][1]==x[k][1]) {
-                    if(x[ncmp][2]==x[k][2]) {
-                      new1=nsearch;
-                      sig_flag=1;
-                      break;
-                    }
-                  }
-                }
-              }
-              if(sig_flag==0) {
-                nSigBk[n]=nSigBk[n]+1;
-                new1=nSigBk[n]-1;
-                itypeSigBk[n][new1]=k;
-              }
-              dis_jk[0]=x[k][0]-x[j][0];
-              dis_jk[1]=x[k][1]-x[j][1];
-              dis_jk[2]=x[k][2]-x[j][2];
-              rsq_jk=dis_jk[0]*dis_jk[0]
-                  +dis_jk[1]*dis_jk[1]
-                  +dis_jk[2]*dis_jk[2];
-              r_jk=sqrt(rsq_jk);
-              if(r_jk<=rcut[ijk]) {
-                ps=r_jk*rdr[ijk]+1.0;
-                ks=(int)ps;
-                if(nr-1<ks)
-                  ks=nr-1;
-                ps=ps-ks;
-                if(ps>1.0)
-                  ps=1.0;
-                betaS_jk=((pBetaS3[ijk][ks-1]*ps+pBetaS2[ijk][ks-1])*ps
-                    +pBetaS1[ijk][ks-1])*ps+pBetaS[ijk][ks-1];
-                dBetaS_jk=(pBetaS6[ijk][ks-1]*ps+pBetaS5[ijk][ks-1])*ps
-                    +pBetaS4[ijk][ks-1];
-                cosAng_ijk=(-dis_ij[0]*dis_jk[0]-dis_ij[1]*dis_jk[1]
-                    -dis_ij[2]*dis_jk[2])/(r_ij*r_jk);
-                dcA_ijk[0][0]=(dis_jk[0]*r_ij*r_jk-cosAng_ijk
-                    *-dis_ij[0]*r_jk*r_jk)/(r_ij*r_ij*r_jk*r_jk);
-                dcA_ijk[1][0]=(dis_jk[1]*r_ij*r_jk-cosAng_ijk
-                    *-dis_ij[1]*r_jk*r_jk)/(r_ij*r_ij*r_jk*r_jk);
-                dcA_ijk[2][0]=(dis_jk[2]*r_ij*r_jk-cosAng_ijk
-                    *-dis_ij[2]*r_jk*r_jk)/(r_ij*r_ij*r_jk*r_jk);
-                dcA_ijk[0][1]=(-dis_ij[0]*r_ij*r_jk-cosAng_ijk
-                    *dis_jk[0]*r_ij*r_ij)/(r_ij*r_ij*r_jk*r_jk);
-                dcA_ijk[1][1]=(-dis_ij[1]*r_ij*r_jk-cosAng_ijk
-                    *dis_jk[1]*r_ij*r_ij)/(r_ij*r_ij*r_jk*r_jk);
-                dcA_ijk[2][1]=(-dis_ij[2]*r_ij*r_jk-cosAng_ijk
-                    *dis_jk[2]*r_ij*r_ij)/(r_ij*r_ij*r_jk*r_jk);
-                nb_jk=nb_t;
-                nb_t++;
-                if(nb_t>nb_sg) {
-                  new_n_tot=nb_sg+maxneigh;
-                  grow_sigma(nb_sg,new_n_tot);
-                  nb_sg=new_n_tot;
-                }
-                bt_sg[nb_jk].temp=temp_jk;
-                bt_sg[nb_jk].i=j;
-                bt_sg[nb_jk].j=k;
-                gmean0=sigma_g0[itype-1][jtype-1][ktype-1];
-                gmean1=sigma_g1[itype-1][jtype-1][ktype-1];
-                gmean2=sigma_g2[itype-1][jtype-1][ktype-1];
-                amean=cosAng_ijk;
-                gfactor1=gmean0+gmean1*amean
-                    +gmean2*amean*amean;
-                gprime1=gmean1+2.0*gmean2*amean;
-                gfactorsq=gfactor1*gfactor1;
-                gsqprime=2.0*gfactor1*gprime1;
-                rfactor1rt=betaS_jk*betaS_jk;
-                rfactor1=rfactor1rt*rfactor1rt;
-
-//BB is Eq. 34 (a) or Eq. 10 (c) for the j atom
-//1st DD is Eq. 11 (c) for j atom where i & k=neighbor of j
-
-                BB=BB+gfactorsq*rfactor1rt;
-                DD=DD+gfactorsq*rfactor1;
-
-//agpdpr1 is derivative of BB  w.r.t. Beta(r_jk)
-//app1 is derivative of BB w.r.t. cos(theta_ijk)
-
-                agpdpr1=2.0*gfactorsq*betaS_jk*dBetaS_jk/r_jk;
-                agpdpr2=2.0*rfactor1rt*agpdpr1;
-                app1=rfactor1rt*gsqprime;
-                app2=rfactor1rt*app1;
-                bt_sg[nb_ij].dBB[0]-=
-                    app1*dcA_ijk[0][0];
-                bt_sg[nb_ij].dBB[1]-=
-                    app1*dcA_ijk[1][0];
-                bt_sg[nb_ij].dBB[2]-=
-                    app1*dcA_ijk[2][0];
-                bt_sg[nb_ij].dDD[0]-=
-                    app2*dcA_ijk[0][0];
-                bt_sg[nb_ij].dDD[1]-=
-                    app2*dcA_ijk[1][0];
-                bt_sg[nb_ij].dDD[2]-=
-                    app2*dcA_ijk[2][0];
-                bt_sg[nb_jk].dBB[0]+=
-                    app1*dcA_ijk[0][1]
-                    +agpdpr1*dis_jk[0];
-                bt_sg[nb_jk].dBB[1]+=
-                    app1*dcA_ijk[1][1]
-                    +agpdpr1*dis_jk[1];
-                bt_sg[nb_jk].dBB[2]+=
-                    app1*dcA_ijk[2][1]
-                    +agpdpr1*dis_jk[2];
-                bt_sg[nb_jk].dDD[0]+=
-                    app2*dcA_ijk[0][1]
-                    +agpdpr2*dis_jk[0];
-                bt_sg[nb_jk].dDD[1]+=
-                    app2*dcA_ijk[1][1]
-                    +agpdpr2*dis_jk[1];
-                bt_sg[nb_jk].dDD[2]+=
-                    app2*dcA_ijk[2][1]
-                    +agpdpr2*dis_jk[2];
-
-//j is a neighbor of i, k and k' prime different neighbors of j not equal to i
-
-                for(ltmp=0;ltmp<ktmp;ltmp++) {
-                  if(ltmp!=ji) {
-                    temp_jkp=BOP_index[j]+ltmp;
-                    kp=jlist[ltmp];
-                    kptype=map[type[kp]]+1;
-                    if(jtype==kptype)
-                      ijkp=jtype-1;
-                    else if(jtype<kptype)
-                      ijkp=jtype*bop_types-jtype*(jtype+1)/2+kptype-1;
-                    else
-                      ijkp=kptype*bop_types-kptype*(kptype+1)/2+jtype-1;
-                    for(nsearch=0;nsearch<nSigBk[n];nsearch++) {
-                      ncmp=itypeSigBk[n][nsearch];
-                      if(x[ncmp][0]==x[kp][0]) {
-                        if(x[ncmp][1]==x[kp][1]) {
-                          if(x[ncmp][2]==x[kp][2]) {
-                            new2=nsearch;
-                            break;
-                          }
-                        }
-                      }
-                    }
-                    dis_jkp[0]=x[kp][0]-x[j][0];
-                    dis_jkp[1]=x[kp][1]-x[j][1];
-                    dis_jkp[2]=x[kp][2]-x[j][2];
-                    rsq_jkp=dis_jkp[0]*dis_jkp[0]
-                        +dis_jkp[1]*dis_jkp[1]
-                        +dis_jkp[2]*dis_jkp[2];
-                    r_jkp=sqrt(rsq_jkp);
-                    if(r_jkp<=rcut[ijkp]) {
-                      ps=r_jkp*rdr[ijkp]+1.0;
-                      ks=(int)ps;
-                      if(nr-1<ks)
-                        ks=nr-1;
-                      ps=ps-ks;
-                      if(ps>1.0)
-                        ps=1.0;
-                      betaS_jkp=((pBetaS3[ijkp][ks-1]*ps+pBetaS2[ijkp][ks-1])*ps
-                        +pBetaS1[ijkp][ks-1])*ps+pBetaS[ijkp][ks-1];
-                      dBetaS_jkp=(pBetaS6[ijkp][ks-1]*ps+pBetaS5[ijkp][ks-1])*ps
-                        +pBetaS4[ijkp][ks-1];
-                      cosAng_ijkp=(-dis_ij[0]*dis_jkp[0]-dis_ij[1]*dis_jkp[1]
-                        -dis_ij[2]*dis_jkp[2])/(r_ij*r_jkp);
-                      dcA_ijkp[0][0]=(dis_jkp[0]*r_ij*r_jkp-cosAng_ijkp
-                        *-dis_ij[0]*r_jkp*r_jkp)/(r_ij*r_ij*r_jkp*r_jkp);
-                      dcA_ijkp[1][0]=(dis_jkp[1]*r_ij*r_jkp-cosAng_ijkp
-                        *-dis_ij[1]*r_jkp*r_jkp)/(r_ij*r_ij*r_jkp*r_jkp);
-                      dcA_ijkp[2][0]=(dis_jkp[2]*r_ij*r_jkp-cosAng_ijkp
-                        *-dis_ij[2]*r_jkp*r_jkp)/(r_ij*r_ij*r_jkp*r_jkp);
-                      dcA_ijkp[0][1]=(-dis_ij[0]*r_ij*r_jkp-cosAng_ijkp
-                        *dis_jkp[0]*r_ij*r_ij)/(r_ij*r_ij*r_jkp*r_jkp);
-                      dcA_ijkp[1][1]=(-dis_ij[1]*r_ij*r_jkp-cosAng_ijkp
-                        *dis_jkp[1]*r_ij*r_ij)/(r_ij*r_ij*r_jkp*r_jkp);
-                      dcA_ijkp[2][1]=(-dis_ij[2]*r_ij*r_jkp-cosAng_ijkp
-                        *dis_jkp[2]*r_ij*r_ij)/(r_ij*r_ij*r_jkp*r_jkp);
-                      cosAng_kjkp=(dis_jk[0]*dis_jkp[0]+dis_jk[1]*dis_jkp[1]
-                        +dis_jk[2]*dis_jkp[2])/(r_jk*r_jkp);
-                      dcA_kjkp[0][0]=(dis_jkp[0]*r_jk*r_jkp-cosAng_kjkp
-                        *dis_jk[0]*r_jkp*r_jkp)/(r_jk*r_jk*r_jkp*r_jkp);
-                      dcA_kjkp[1][0]=(dis_jkp[1]*r_jk*r_jkp-cosAng_kjkp
-                        *dis_jk[1]*r_jkp*r_jkp)/(r_jk*r_jk*r_jkp*r_jkp);
-                      dcA_kjkp[2][0]=(dis_jkp[2]*r_jk*r_jkp-cosAng_kjkp
-                        *dis_jk[2]*r_jkp*r_jkp)/(r_jk*r_jk*r_jkp*r_jkp);
-                      dcA_kjkp[0][1]=(dis_jk[0]*r_jk*r_jkp-cosAng_kjkp
-                        *dis_jkp[0]*r_jk*r_jk)/(r_jk*r_jk*r_jkp*r_jkp);
-                      dcA_kjkp[1][1]=(dis_jk[1]*r_jk*r_jkp-cosAng_kjkp
-                        *dis_jkp[1]*r_jk*r_jk)/(r_jk*r_jk*r_jkp*r_jkp);
-                      dcA_kjkp[2][1]=(dis_jk[2]*r_jk*r_jkp-cosAng_kjkp
-                        *dis_jkp[2]*r_jk*r_jk)/(r_jk*r_jk*r_jkp*r_jkp);
-                      nb_jkp=nb_t;
-                      nb_t++;
-                      if(nb_t>nb_sg) {
-                        new_n_tot=nb_sg+maxneigh;
-                        grow_sigma(nb_sg,new_n_tot);
-                        nb_sg=new_n_tot;
-                      }
-                      bt_sg[nb_jkp].temp=temp_jkp;
-                      bt_sg[nb_jkp].i=j;
-                      bt_sg[nb_jkp].j=kp;
-                      gmean0=sigma_g0[itype-1][jtype-1][kptype-1];
-                      gmean1=sigma_g1[itype-1][jtype-1][kptype-1];
-                      gmean2=sigma_g2[itype-1][jtype-1][kptype-1];
-                      amean=cosAng_ijkp;
-                      gfactor2=gmean0+gmean1*amean
-                          +gmean2*amean*amean;
-                      gprime2=gmean1+2.0*gmean2*amean;
-                      gmean0=sigma_g0[ktype-1][jtype-1][kptype-1];
-                      gmean1=sigma_g1[ktype-1][jtype-1][kptype-1];
-                      gmean2=sigma_g2[ktype-1][jtype-1][kptype-1];
-                      amean=cosAng_kjkp;
-                      gfactor3=gmean0+gmean1*amean
-                          +gmean2*amean*amean;
-                      gprime3=gmean1+2.0*gmean2*amean;
-                      gfactor=gfactor1*gfactor2*gfactor3;
-                      rfactorrt=betaS_jk*betaS_jkp;
-                      rfactor=rfactorrt*rfactorrt;
-
-//2nd DD is Eq. 11 (c) for j atom where i , k & k'=neighbor of j
-
-                      DD=DD+2.0*gfactor*rfactor;
-
-//agpdpr1 is derivative of DD  w.r.t. Beta(r_jk)
-//agpdpr2 is derivative of DD  w.r.t. Beta(r_jk')
-//app1 is derivative of DD  w.r.t. cos(theta_ijk)
-//app2 is derivative of DD  w.r.t. cos(theta_ijkp)
-//app3 is derivative of DD  w.r.t. cos(theta_kjkp)
-
-                      agpdpr1=4.0*gfactor*rfactorrt*betaS_jkp
-                          *dBetaS_jk/r_jk;
-                      agpdpr2=4.0*gfactor*rfactorrt*betaS_jk
-                          *dBetaS_jkp/r_jkp;
-                      app1=2.0*rfactor*gfactor2*gfactor3*gprime1;
-                      app2=2.0*rfactor*gfactor1*gfactor3*gprime2;
-                      app3=2.0*rfactor*gfactor1*gfactor2*gprime3;
-                      bt_sg[nb_ij].dDD[0]-=
-                          app1*dcA_ijk[0][0]
-                          +app2*dcA_ijkp[0][0];
-                      bt_sg[nb_ij].dDD[1]-=
-                          app1*dcA_ijk[1][0]
-                          +app2*dcA_ijkp[1][0];
-                      bt_sg[nb_ij].dDD[2]-=
-                          app1*dcA_ijk[2][0]
-                          +app2*dcA_ijkp[2][0];
-                      bt_sg[nb_jk].dDD[0]+=
-                          app1*dcA_ijk[0][1]
-                          +app3*dcA_kjkp[0][0]
-                          +agpdpr1*dis_jk[0];
-                      bt_sg[nb_jk].dDD[1]+=
-                          app1*dcA_ijk[1][1]
-                          +app3*dcA_kjkp[1][0]
-                          +agpdpr1*dis_jk[1];
-                      bt_sg[nb_jk].dDD[2]+=
-                          app1*dcA_ijk[2][1]
-                          +app3*dcA_kjkp[2][0]
-                          +agpdpr1*dis_jk[2];
-                      bt_sg[nb_jkp].dDD[0]+=
-                          app2*dcA_ijkp[0][1]
-                          +app3*dcA_kjkp[0][1]
-                          +agpdpr2*dis_jkp[0];
-                      bt_sg[nb_jkp].dDD[1]+=
-                          app2*dcA_ijkp[1][1]
-                          +app3*dcA_kjkp[1][1]
-                          +agpdpr2*dis_jkp[1];
-                      bt_sg[nb_jkp].dDD[2]+=
-                          app2*dcA_ijkp[2][1]
-                          +app3*dcA_kjkp[2][1]
-                          +agpdpr2*dis_jkp[2];
-
-                    }
-                  }
-                }
-
-//j is a neighbor of i, k is a neighbor of j not equal to i and k'
-//is a neighbor of k not equal to j or i
-
-                for(ltmp=0;ltmp<numneigh[k];ltmp++) {
-                  temp_kkp=BOP_index[k]+ltmp;
-                  kp=klist[ltmp];
-                  kptype=map[type[kp]]+1;
-                  same_ikp=0;
-                  same_jkp=0;
-                  if(x[i][0]==x[kp][0]) {
-                    if(x[i][1]==x[kp][1]) {
-                      if(x[i][2]==x[kp][2]) {
-                        same_ikp=1;
-                      }
-                    }
-                  }
-                  if(x[j][0]==x[kp][0]) {
-                    if(x[j][1]==x[kp][1]) {
-                      if(x[j][2]==x[kp][2]) {
-                        same_jkp=1;
-                      }
-                    }
-                  }
-                  if(!same_ikp&&!same_jkp) {
-                    if(ktype==kptype)
-                      ikkp=ktype-1;
-                    else if(ktype<kptype)
-                      ikkp=ktype*bop_types-ktype*(ktype+1)/2+kptype-1;
-                    else
-                      ikkp=kptype*bop_types-kptype*(kptype+1)/2+ktype-1;
-                    for(kNeij=0;kNeij<numneigh[k];kNeij++) {
-                      if(x[klist[kNeij]][0]==x[j][0]) {
-                        if(x[klist[kNeij]][1]==x[j][1]) {
-                          if(x[klist[kNeij]][2]==x[j][2]) {
-                            break;
-                          }
-                        }
-                      }
-                    }
-                    sig_flag=0;
-                    for(nsearch=0;nsearch<nSigBk[n];nsearch++) {
-                      ncmp=itypeSigBk[n][nsearch];
-                      if(x[ncmp][0]==x[kp][0]) {
-                        if(x[ncmp][1]==x[kp][1]) {
-                          if(x[ncmp][2]==x[kp][2]) {
-                            new2=nsearch;
-                            sig_flag=1;
-                            break;
-                          }
-                        }
-                      }
-                    }
-                    if(sig_flag==0) {
-                      nSigBk[n]=nSigBk[n]+1;
-                      new2=nSigBk[n]-1;
-                      itypeSigBk[n][new2]=kp;
-                    }
-                    dis_kkp[0]=x[kp][0]-x[k][0];
-                    dis_kkp[1]=x[kp][1]-x[k][1];
-                    dis_kkp[2]=x[kp][2]-x[k][2];
-                    rsq_kkp=dis_kkp[0]*dis_kkp[0]
-                        +dis_kkp[1]*dis_kkp[1]
-                        +dis_kkp[2]*dis_kkp[2];
-                    r_kkp=sqrt(rsq_kkp);
-                    if(r_kkp<=rcut[ikkp]) {
-                      ps=r_kkp*rdr[ikkp]+1.0;
-                      ks=(int)ps;
-                      if(nr-1<ks)
-                        ks=nr-1;
-                      ps=ps-ks;
-                      if(ps>1.0)
-                        ps=1.0;
-                      betaS_kkp=((pBetaS3[ikkp][ks-1]*ps+pBetaS2[ikkp][ks-1])*ps
-                          +pBetaS1[ikkp][ks-1])*ps+pBetaS[ikkp][ks-1];
-                      dBetaS_kkp=(pBetaS6[ikkp][ks-1]*ps+pBetaS5[ikkp][ks-1])*ps
-                          +pBetaS4[ikkp][ks-1];
-                      cosAng_jkkp=(-dis_jk[0]*dis_kkp[0]-dis_jk[1]*dis_kkp[1]
-                          -dis_jk[2]*dis_kkp[2])/(r_jk*r_kkp);
-                      dcA_jkkp[0][0]=(dis_kkp[0]*r_jk*r_kkp-cosAng_jkkp
-                          *-dis_jk[0]*r_kkp*r_kkp)/(r_jk*r_jk*r_kkp*r_kkp);
-                      dcA_jkkp[1][0]=(dis_kkp[1]*r_jk*r_kkp-cosAng_jkkp
-                          *-dis_jk[1]*r_kkp*r_kkp)/(r_jk*r_jk*r_kkp*r_kkp);
-                      dcA_jkkp[2][0]=(dis_kkp[2]*r_jk*r_kkp-cosAng_jkkp
-                          *-dis_jk[2]*r_kkp*r_kkp)/(r_jk*r_jk*r_kkp*r_kkp);
-                      dcA_jkkp[0][1]=(-dis_jk[0]*r_jk*r_kkp-cosAng_jkkp
-                          *dis_kkp[0]*r_jk*r_jk)/(r_jk*r_jk*r_kkp*r_kkp);
-                      dcA_jkkp[1][1]=(-dis_jk[1]*r_jk*r_kkp-cosAng_jkkp
-                          *dis_kkp[1]*r_jk*r_jk)/(r_jk*r_jk*r_kkp*r_kkp);
-                      dcA_jkkp[2][1]=(-dis_jk[2]*r_jk*r_kkp-cosAng_jkkp
-                          *dis_kkp[2]*r_jk*r_jk)/(r_jk*r_jk*r_kkp*r_kkp);
-                      nb_kkp=nb_t;
-                      nb_t++;
-                      if(nb_t>nb_sg) {
-                        new_n_tot=nb_sg+maxneigh;
-                        grow_sigma(nb_sg,new_n_tot);
-                        nb_sg=new_n_tot;
-                      }
-                      bt_sg[nb_kkp].temp=temp_kkp;
-                      bt_sg[nb_kkp].i=k;
-                      bt_sg[nb_kkp].j=kp;
-                      gmean0=sigma_g0[jtype-1][ktype-1][kptype-1];
-                      gmean1=sigma_g1[jtype-1][ktype-1][kptype-1];
-                      gmean2=sigma_g2[jtype-1][ktype-1][kptype-1];
-                      amean=cosAng_jkkp;
-                      gfactor2=gmean0+gmean1*amean
-                          +gmean2*amean*amean;
-                      gprime2=gmean1+2.0*gmean2*amean;
-                      gfactorsq2=gfactor2*gfactor2;
-                      gsqprime2=2.0*gfactor2*gprime2;
-                      gfactor=gfactorsq*gfactorsq2;
-                      rfactorrt=betaS_jk*betaS_kkp;
-                      rfactor=rfactorrt*rfactorrt;
-
-//3rd DD is Eq. 11 (c) for j atom where i & k=neighbor of j & k'=neighbor of k
-
-                      DD=DD+gfactor*rfactor;
-
-//agpdpr1 is derivative of DD  3rd term w.r.t. Beta(r_jk)
-//agpdpr2 is derivative of DD  3rd term w.r.t. Beta(r_kk')
-//app1 is derivative of DD  3rd term w.r.t. cos(theta_ijk)
-//app2 is derivative of DD  3rd term w.r.t. cos(theta_jkkp)
-
-                      agpdpr1=2.0*gfactor*rfactorrt*betaS_kkp
-                          *dBetaS_jk/r_jk;
-                      agpdpr2=2.0*gfactor*rfactorrt*betaS_jk
-                          *dBetaS_kkp/r_kkp;
-                      app1=rfactor*gfactorsq2*gsqprime;
-                      app2=rfactor*gfactorsq*gsqprime2;
-                      bt_sg[nb_ij].dDD[0]-=
-                          app1*dcA_ijk[0][0];
-                      bt_sg[nb_ij].dDD[1]-=
-                          app1*dcA_ijk[1][0];
-                      bt_sg[nb_ij].dDD[2]-=
-                          app1*dcA_ijk[2][0];
-                      bt_sg[nb_jk].dDD[0]+=
-                          app1*dcA_ijk[0][1]
-                          +agpdpr1*dis_jk[0]
-                          -app2*dcA_jkkp[0][0];
-                      bt_sg[nb_jk].dDD[1]+=
-                          app1*dcA_ijk[1][1]
-                          +agpdpr1*dis_jk[1]
-                          -app2*dcA_jkkp[1][0];
-                      bt_sg[nb_jk].dDD[2]+=
-                          app1*dcA_ijk[2][1]
-                          +agpdpr1*dis_jk[2]
-                          -app2*dcA_jkkp[2][0];
-                      bt_sg[nb_kkp].dDD[0]+=
-                          app2*dcA_jkkp[0][1]
-                          +agpdpr2*dis_kkp[0];
-                      bt_sg[nb_kkp].dDD[1]+=
-                          app2*dcA_jkkp[1][1]
-                          +agpdpr2*dis_kkp[1];
-                      bt_sg[nb_kkp].dDD[2]+=
-                          app2*dcA_jkkp[2][1]
-                          +agpdpr2*dis_kkp[2];
-
-                    }
-                  }
-                }
-              }
-            }
-          }
-
-          sig_flag=0;
-          if(FF<=0.000001) {
-            sigB[n]=0.0;
-            sig_flag=1;
-          }
-          if(sig_flag==0) {
-            if(AA<0.0)
-              AA=0.0;
-            if(BB<0.0)
-              BB=0.0;
-            if(CC<0.0)
-              CC=0.0;
-            if(DD<0.0)
-              DD=0.0;
-
-// AA and BB are the representations of (a) Eq. 34 and (b) Eq. 9
-// for atoms i and j respectively
-
-            AAC=AA+BB;
-            BBC=AA*BB;
-            CCC=AA*AA+BB*BB;
-            DDC=CC+DD;
-
-//EEC is a modified form of (a) Eq. 33
-
-            EEC=(DDC-CCC)/(AAC+2.0*small1);
-            AACFF=1.0/(AAC+2.0*small1);
-            for(m=0;m<nb_t;m++) {
-              if((bt_sg[m].i>-1)&&(bt_sg[m].j>-1)) {
-                bt_sg[m].dAAC[0]=bt_sg[m].dAA[0]
-                    +bt_sg[m].dBB[0];
-                bt_sg[m].dAAC[1]=bt_sg[m].dAA[1]
-                    +bt_sg[m].dBB[1];
-                bt_sg[m].dAAC[2]=bt_sg[m].dAA[2]
-                    +bt_sg[m].dBB[2];
-                bt_sg[m].dBBC[0]=bt_sg[m].dAA[0]*BB
-                    +AA*bt_sg[m].dBB[0];
-                bt_sg[m].dBBC[1]=bt_sg[m].dAA[1]*BB
-                    +AA*bt_sg[m].dBB[1];
-                bt_sg[m].dBBC[2]=bt_sg[m].dAA[2]*BB
-                    +AA*bt_sg[m].dBB[2];
-                bt_sg[m].dCCC[0]=2.0*AA*bt_sg[m].dAA[0]
-                    +2.0*BB*bt_sg[m].dBB[0];
-                bt_sg[m].dCCC[1]=2.0*AA*bt_sg[m].dAA[1]
-                    +2.0*BB*bt_sg[m].dBB[1];
-                bt_sg[m].dCCC[2]=2.0*AA*bt_sg[m].dAA[2]
-                    +2.0*BB*bt_sg[m].dBB[2];
-                bt_sg[m].dDDC[0]=bt_sg[m].dCC[0]
-                    +bt_sg[m].dDD[0];
-                bt_sg[m].dDDC[1]=bt_sg[m].dCC[1]
-                    +bt_sg[m].dDD[1];
-                bt_sg[m].dDDC[2]=bt_sg[m].dCC[2]
-                    +bt_sg[m].dDD[2];
-                bt_sg[m].dEEC[0]=(bt_sg[m].dDDC[0]
-                    -bt_sg[m].dCCC[0]
-                    -EEC*bt_sg[m].dAAC[0])*AACFF;
-                bt_sg[m].dEEC[1]=(bt_sg[m].dDDC[1]
-                    -bt_sg[m].dCCC[1]
-                    -EEC*bt_sg[m].dAAC[1])*AACFF;
-                bt_sg[m].dEEC[2]=(bt_sg[m].dDDC[2]
-                    -bt_sg[m].dCCC[2]
-                    -EEC*bt_sg[m].dAAC[2])*AACFF;
-              }
-            }
-            UT=EEC*FF+BBC+small3[iij];
-            UT=1.0/sqrt(UT);
-
-// FFC is slightly modified form of (a) Eq. 31
-// GGC is slightly modified form of (a) Eq. 32
-// bndtmp is a slightly modified form of (a) Eq. 30 and (b) Eq. 8
-
-            FFC=BBC*UT;
-            GGC=EEC*UT;
-            bndtmp=(FF+sigma_delta[iij]*sigma_delta[iij])*(1.0+sigma_a[iij]*GGC)
-                *(1.0+sigma_a[iij]*GGC)+sigma_c[iij]*(AAC+sigma_a[iij]*EE
-                +sigma_a[iij]*FFC*(2.0+GGC))+small4;
-            UTcom=-0.5*UT*UT*UT;
-            for(m=0;m<nb_t;m++) {
-              if((bt_sg[m].i>-1)&&(bt_sg[m].j>-1)) {
-                bt_sg[m].dUT[0]=UTcom*(bt_sg[m].dEEC[0]*FF
-                    +EEC*bt_sg[m].dFF[0]+bt_sg[m].dBBC[0]);
-                bt_sg[m].dUT[1]=UTcom*(bt_sg[m].dEEC[1]*FF
-                    +EEC*bt_sg[m].dFF[1]+bt_sg[m].dBBC[1]);
-                bt_sg[m].dUT[2]=UTcom*(bt_sg[m].dEEC[2]*FF
-                    +EEC*bt_sg[m].dFF[2]+bt_sg[m].dBBC[2]);
-                bt_sg[m].dFFC[0]=bt_sg[m].dBBC[0]*UT
-                    +BBC*bt_sg[m].dUT[0];
-                bt_sg[m].dFFC[1]=bt_sg[m].dBBC[1]*UT
-                    +BBC*bt_sg[m].dUT[1];
-                bt_sg[m].dFFC[2]=bt_sg[m].dBBC[2]*UT
-                    +BBC*bt_sg[m].dUT[2];
-                bt_sg[m].dGGC[0]=bt_sg[m].dEEC[0]*UT
-                    +EEC*bt_sg[m].dUT[0];
-                bt_sg[m].dGGC[1]=bt_sg[m].dEEC[1]*UT
-                    +EEC*bt_sg[m].dUT[1];
-                bt_sg[m].dGGC[2]=bt_sg[m].dEEC[2]*UT
-                    +EEC*bt_sg[m].dUT[2];
-              }
-            }
-            psign=1.0;
-            if(1.0+sigma_a[iij]*GGC<0.0)
-              psign=-1.0;
-            bndtmp0=1.0/sqrt(bndtmp);
-            sigB1[n]=psign*betaS_ij*(1.0+sigma_a[iij]*GGC)*bndtmp0;
-            bndtmp=-0.5*bndtmp0*bndtmp0*bndtmp0;
-            bndtmp1=psign*(1.0+sigma_a[iij]*GGC)*bndtmp0+psign*betaS_ij
-                *(1.0+sigma_a[iij]*GGC)*bndtmp*2.0*betaS_ij*(1.0
-                +sigma_a[iij]*GGC)*(1.0+sigma_a[iij]*GGC);
-            bndtmp1=bndtmp1*dBetaS_ij/r_ij;
-            bndtmp2=psign*betaS_ij*(1.0+sigma_a[iij]*GGC)*bndtmp*sigma_c[iij];
-            bndtmp3=psign*betaS_ij*(1.0+sigma_a[iij]*GGC)
-                *bndtmp*sigma_c[iij]*sigma_a[iij];
-            bndtmp4=psign*betaS_ij*(1.0+sigma_a[iij]*GGC)
-                *bndtmp*sigma_c[iij]*sigma_a[iij]*(2.0+GGC);
-            bndtmp5=sigma_a[iij]*psign*betaS_ij*bndtmp0
-                +psign*betaS_ij*(1.0+sigma_a[iij]*GGC)*bndtmp
-                *(2.0*(FF+sigma_delta[iij]*sigma_delta[iij])*(1.0
-                +sigma_a[iij]*GGC)*sigma_a[iij]+sigma_c[iij]*sigma_a[iij]*FFC);
-            setting=0;
-            for(m=0;m<nb_t;m++) {
-              if((bt_sg[m].i>-1)&&(bt_sg[m].j>-1)) {
-                temp_kk=bt_sg[m].temp;
-                if(temp_kk==temp_ij&&setting==0) {
-                  bt_sg[m].dSigB1[0]=bndtmp1*dis_ij[0]
-                      +(bndtmp2*bt_sg[m].dAAC[0]
-                      +bndtmp3*bt_sg[m].dEE[0]
-                      +bndtmp4*bt_sg[m].dFFC[0]
-                      +bndtmp5*bt_sg[m].dGGC[0]);
-                  bt_sg[m].dSigB1[1]=bndtmp1*dis_ij[1]
-                      +(bndtmp2*bt_sg[m].dAAC[1]
-                      +bndtmp3*bt_sg[m].dEE[1]
-                      +bndtmp4*bt_sg[m].dFFC[1]
-                      +bndtmp5*bt_sg[m].dGGC[1]);
-                  bt_sg[m].dSigB1[2]=bndtmp1*dis_ij[2]
-                      +(bndtmp2*bt_sg[m].dAAC[2]
-                      +bndtmp3*bt_sg[m].dEE[2]
-                      +bndtmp4*bt_sg[m].dFFC[2]
-                      +bndtmp5*bt_sg[m].dGGC[2]);
-                  setting=1;
-                }
-                else if(temp_kk==temp_ji&&setting==0) {
-                  bt_sg[m].dSigB1[0]=-bndtmp1*dis_ij[0]
-                      +(bndtmp2*bt_sg[m].dAAC[0]
-                      +bndtmp3*bt_sg[m].dEE[0]
-                      +bndtmp4*bt_sg[m].dFFC[0]
-                      +bndtmp5*bt_sg[m].dGGC[0]);
-                  bt_sg[m].dSigB1[1]=-bndtmp1*dis_ij[1]
-                      +(bndtmp2*bt_sg[m].dAAC[1]
-                      +bndtmp3*bt_sg[m].dEE[1]
-                      +bndtmp4*bt_sg[m].dFFC[1]
-                      +bndtmp5*bt_sg[m].dGGC[1]);
-                  bt_sg[m].dSigB1[2]=-bndtmp1*dis_ij[2]
-                      +(bndtmp2*bt_sg[m].dAAC[2]
-                      +bndtmp3*bt_sg[m].dEE[2]
-                      +bndtmp4*bt_sg[m].dFFC[2]
-                      +bndtmp5*bt_sg[m].dGGC[2]);
-                  setting=1;
-                }
-                else {
-                  bt_sg[m].dSigB1[0]=(bndtmp2*bt_sg[m].dAAC[0]
-                      +bndtmp3*bt_sg[m].dEE[0]
-                      +bndtmp4*bt_sg[m].dFFC[0]
-                      +bndtmp5*bt_sg[m].dGGC[0]);
-                  bt_sg[m].dSigB1[1]=(bndtmp2*bt_sg[m].dAAC[1]
-                      +bndtmp3*bt_sg[m].dEE[1]
-                      +bndtmp4*bt_sg[m].dFFC[1]
-                      +bndtmp5*bt_sg[m].dGGC[1]);
-                  bt_sg[m].dSigB1[2]=(bndtmp2*bt_sg[m].dAAC[2]
-                      +bndtmp3*bt_sg[m].dEE[2]
-                      +bndtmp4*bt_sg[m].dFFC[2]
-                      +bndtmp5*bt_sg[m].dGGC[2]);
-                }
-              }
-            }
-
-//This loop is to ensure there is not an error for atoms with no neighbors (deposition)
-
-            if(nb_t==0) {
-              if(j>i) {
-                bt_sg[0].dSigB1[0]=bndtmp1*dis_ij[0];
-                bt_sg[0].dSigB1[1]=bndtmp1*dis_ij[1];
-                bt_sg[0].dSigB1[2]=bndtmp1*dis_ij[2];
-              }
-              else {
-                bt_sg[0].dSigB1[0]=-bndtmp1*dis_ij[0];
-                bt_sg[0].dSigB1[1]=-bndtmp1*dis_ij[1];
-                bt_sg[0].dSigB1[2]=-bndtmp1*dis_ij[2];
-              }
-              for(pp=0;pp<3;pp++) {
-                bt_sg[0].dAA[pp]=0.0;
-                bt_sg[0].dBB[pp]=0.0;
-                bt_sg[0].dCC[pp]=0.0;
-                bt_sg[0].dDD[pp]=0.0;
-                bt_sg[0].dEE[pp]=0.0;
-                bt_sg[0].dEE1[pp]=0.0;
-                bt_sg[0].dFF[pp]=0.0;
-                bt_sg[0].dAAC[pp]=0.0;
-                bt_sg[0].dBBC[pp]=0.0;
-                bt_sg[0].dCCC[pp]=0.0;
-                bt_sg[0].dDDC[pp]=0.0;
-                bt_sg[0].dEEC[pp]=0.0;
-                bt_sg[0].dFFC[pp]=0.0;
-                bt_sg[0].dGGC[pp]=0.0;
-                bt_sg[0].dUT[pp]=0.0;
-                bt_sg[0].dSigB1[pp]=0.0;
-                bt_sg[0].dSigB[pp]=0.0;
-              }
-              bt_sg[0].i=i;
-              bt_sg[0].j=j;
-              bt_sg[0].temp=temp_ij;
-              nb_t++;
-              if(nb_t>nb_sg) {
-                new_n_tot=nb_sg+maxneigh;
-                grow_sigma(nb_sg,new_n_tot);
-                nb_sg=new_n_tot;
-              }
-            }
-            ps=sigB1[n]*rdBO+1.0;
-            ks=(int)ps;
-            if(nBOt-1<ks)
-              ks=nBOt-1;
-            ps=ps-ks;
-            if(ps>1.0)
-              ps=1.0;
-            dsigB1=((FsigBO3[iij][ks-1]*ps+FsigBO2[iij][ks-1])*ps
-                +FsigBO1[iij][ks-1])*ps+FsigBO[iij][ks-1];
-            dsigB2=(FsigBO6[iij][ks-1]*ps+FsigBO5[iij][ks-1])*ps+FsigBO4[iij][ks-1];
-            part0=(FF+0.5*AAC+small5);
-            part1=(sigma_f[iij]-0.5)*sigma_k[iij];
-            part2=1.0-part1*EE1/part0;
-            part3=dsigB1*part1/part0;
-            part4=part3/part0*EE1;
-
-// sigB is the final expression for (a) Eq. 6 and (b) Eq. 11
-
-            sigB[n]=dsigB1*part2;
-            pp1=2.0*betaS_ij;
-            for(m=0;m<nb_t;m++) {
-              if((bt_sg[m].i>-1)&&(bt_sg[m].j>-1)) {
-                temp_kk=bt_sg[m].temp;
-                bt_i=bt_sg[m].i;
-                bt_j=bt_sg[m].j;
-                xtmp[0]=x[bt_j][0]-x[bt_i][0];
-                xtmp[1]=x[bt_j][1]-x[bt_i][1];
-                xtmp[2]=x[bt_j][2]-x[bt_i][2];
-                for(pp=0;pp<3;pp++) {
-                  bt_sg[m].dSigB[pp]=dsigB2*part2*bt_sg[m].dSigB1[pp]
-                      -part3*bt_sg[m].dEE1[pp]
-                      +part4*(bt_sg[m].dFF[pp]
-                      +0.5*bt_sg[m].dAAC[pp]);
-                }
-                for(pp=0;pp<3;pp++) {
-                  ftmp[pp]=pp1*bt_sg[m].dSigB[pp];
-                  f[bt_i][pp]-=ftmp[pp];
-                  f[bt_j][pp]+=ftmp[pp];
-                }
-                if(evflag) {
-                  ev_tally_xyz(bt_i,bt_j,nlocal,newton_pair,0.0,0.0,ftmp[0],ftmp[1]
-                      ,ftmp[2],xtmp[0],xtmp[1],xtmp[2]);
-                }
-              }
-            }
-          }
-          n++;
-        }
-      }
-    }
-  }
-  destroy_sigma();
-}
-
-/* ---------------------------------------------------------------------- */
-
-/*  The formulation differs slightly to avoid negative square roots
-    in the calculation of Theta_pi,ij of (a) Eq. 36 and (b) Eq. 18
-    see (d) */
-
-void PairBOP::sigmaBo_noa_otf()
-{
-  int nb_t,new_n_tot;
-  int n,i,j,k,kp,m,pp;
-  int itmp,jtmp,ktmp,ltmp,mtmp;
-  tagint i_tag,j_tag;
-  int kp1,kp2,kp1type;
-  int iij,iik,ijk,ikkp,ji,iikp,ijkp;
-  int nkp;
-  int nk0;
-  int jNeik,kNeii,kNeij;
-  int new1,new2,nlocal;
-  int inum,*ilist,*iilist,*jlist,*klist;
-  int **firstneigh,*numneigh;
-  int temp_ij,temp_ik,temp_jkp,temp_kk,temp_jk;
-  int temp_ji,temp_kkp;
-  int nb_ij,nb_ik;
-  int nb_jk,nb_jkp,nb_kkp;
-  int nsearch;
-  int sig_flag,setting,ncmp,ks;
-  int itype,jtype,ktype,kptype;
-  int bt_i,bt_j;
-  int same_ikp,same_jkp,same_kpk;
-  double AA,BB,CC,DD,EE1,FF;
-  double AAC,BBC,CCC,DDC,EEC;
-  double UT,bndtmp;
-  double amean,gmean0,gmean1,gmean2,ps;
-  double gfactor1,gprime1,gsqprime;
-  double gfactorsq,gfactor2,gprime2;
-  double gfactorsq2;
-  double gfactor3,gprime3,gfactor,rfactor;
-  double rfactorrt,rfactor1rt,rfactor1;
-  double rcm1,rcm2,gcm1,gcm2,gcm3;
-  double agpdpr1,app1;
-  double dsigB1,dsigB2;
-  double part0,part1,part2,part3,part4;
-  double psign,bndtmp0,pp1;
-  double bndtmp1,bndtmp2;
-  double dis_ij[3],rsq_ij,r_ij;
-  double betaS_ij,dBetaS_ij;
-  double dis_ik[3],rsq_ik,r_ik;
-  double betaS_ik,dBetaS_ik;
-  double dis_ikp[3],rsq_ikp,r_ikp;
-  double betaS_ikp;
-  double dis_jk[3],rsq_jk,r_jk;
-  double betaS_jk,dBetaS_jk;
-  double dis_jkp[3],rsq_jkp,r_jkp;
-  double betaS_jkp,dBetaS_jkp;
-  double dis_kkp[3],rsq_kkp,r_kkp;
-  double betaS_kkp;
-  double cosAng_jik,dcA_jik[3][2];
-  double cosAng_jikp;
-  double cosAng_kikp;
-  double cosAng_ijk,dcA_ijk[3][2];
-  double cosAng_ijkp;
-  double cosAng_kjkp;
-  double cosAng_ikj,dcA_ikj[3][2];
-  double cosAng_ikkp;
-  double cosAng_jkkp;
-
-
-  double ftmp[3],xtmp[3];
-  double **x = atom->x;
-  double **f = atom->f;
-  tagint *tag = atom->tag;
-  int newton_pair = force->newton_pair;
-  int *type = atom->type;
-
-  nlocal = atom->nlocal;
-  inum = list->inum;
-  ilist = list->ilist;
-  numneigh = list->numneigh;
-  firstneigh = list->firstneigh;
-
-  n=0;
-  if(nb_sg==0) {
-    nb_sg=4;
-  }
-  if(allocate_sigma) {
-    destroy_sigma();
-  }
-    create_sigma(nb_sg);
-  for(itmp=0;itmp<inum;itmp++) {
-
-    i = ilist[itmp];
-    i_tag=tag[i];
-    itype = map[type[i]]+1;
-
-//j is loop over all neighbors of i
-
-    for(jtmp=0;jtmp<numneigh[i];jtmp++) {
-      for(m=0;m<nb_sg;m++) {
-        for(pp=0;pp<3;pp++) {
-          bt_sg[m].dAA[pp]=0.0;
-          bt_sg[m].dBB[pp]=0.0;
-          bt_sg[m].dEE1[pp]=0.0;
-          bt_sg[m].dFF[pp]=0.0;
-          bt_sg[m].dAAC[pp]=0.0;
-          bt_sg[m].dSigB1[pp]=0.0;
-          bt_sg[m].dSigB[pp]=0.0;
-        }
-        bt_sg[m].i=-1;
-        bt_sg[m].j=-1;
-      }
-      nb_t=0;
-      iilist=firstneigh[i];
-      temp_ij=BOP_index[i]+jtmp;
-      j=iilist[jtmp];
-      jlist=firstneigh[j];
-      j_tag=tag[j];
-      jtype = map[type[j]]+1;
-      nb_ij=nb_t;
-      nb_t++;
-      if(nb_t>nb_sg) {
-        new_n_tot=nb_sg+maxneigh;
-        grow_sigma(nb_sg,new_n_tot);
-        nb_sg=new_n_tot;
-      }
-      bt_sg[nb_ij].temp=temp_ij;
-      bt_sg[nb_ij].i=i;
-      bt_sg[nb_ij].j=j;
-      if(j_tag>=i_tag) {
-        if(itype==jtype)
-          iij=itype-1;
-        else if(itype<jtype)
-          iij=itype*bop_types-itype*(itype+1)/2+jtype-1;
-        else
-          iij=jtype*bop_types-jtype*(jtype+1)/2+itype-1;
-        for(ji=0;ji<numneigh[j];ji++) {
-          temp_ji=BOP_index[j]+ji;
-          if(x[jlist[ji]][0]==x[i][0]) {
-            if(x[jlist[ji]][1]==x[i][1]) {
-              if(x[jlist[ji]][2]==x[i][2]) {
-                break;
-              }
-            }
-          }
-        }
-        dis_ij[0]=x[j][0]-x[i][0];
-        dis_ij[1]=x[j][1]-x[i][1];
-        dis_ij[2]=x[j][2]-x[i][2];
-        rsq_ij=dis_ij[0]*dis_ij[0]
-            +dis_ij[1]*dis_ij[1]
-            +dis_ij[2]*dis_ij[2];
-        r_ij=sqrt(rsq_ij);
-
-        if(r_ij<rcut[iij]) {
-
-          ps=r_ij*rdr[iij]+1.0;
-          ks=(int)ps;
-          if(nr-1<ks)
-            ks=nr-1;
-          ps=ps-ks;
-          if(ps>1.0)
-            ps=1.0;
-          betaS_ij=((pBetaS3[iij][ks-1]*ps+pBetaS2[iij][ks-1])*ps
-              +pBetaS1[iij][ks-1])*ps+pBetaS[iij][ks-1];
-          dBetaS_ij=(pBetaS6[iij][ks-1]*ps+pBetaS5[iij][ks-1])*ps
-              +pBetaS4[iij][ks-1];
-          nSigBk[n]=0;
-
-//AA-EE1 are the components making up Eq. 30 (a)
-
-          AA=0.0;
-          BB=0.0;
-          CC=0.0;
-          DD=0.0;
-          EE1=0.0;
-
-//FF is the Beta_sigma^2 term
-
-          FF=betaS_ij*betaS_ij;
-
-//agpdpr1 is derivative of FF w.r.t. r_ij
-
-          agpdpr1=2.0*betaS_ij*dBetaS_ij/r_ij;
-
-//dXX derivatives are taken with respect to all pairs contributing to the energy
-//nb_ij is derivative w.r.t. ij pair
-
-          bt_sg[nb_ij].dFF[0]=agpdpr1*dis_ij[0];
-          bt_sg[nb_ij].dFF[1]=agpdpr1*dis_ij[1];
-          bt_sg[nb_ij].dFF[2]=agpdpr1*dis_ij[2];
-
-//k is loop over all neighbors of i again with j neighbor of i
-
-          for(ktmp=0;ktmp<numneigh[i];ktmp++) {
-            temp_ik=BOP_index[i]+ktmp;
-            if(ktmp!=jtmp) {
-              k=iilist[ktmp];
-              klist=firstneigh[k];
-              ktype = map[type[k]]+1;
-              if(itype==ktype)
-                iik=itype-1;
-              else if(itype<ktype)
-                iik=itype*bop_types-itype*(itype+1)/2+ktype-1;
-              else
-                iik=ktype*bop_types-ktype*(ktype+1)/2+itype-1;
-
-//find neighbor of k that is equal to i
-
-              for(kNeii=0;kNeii<numneigh[k];kNeii++) {
-                if(x[klist[kNeii]][0]==x[i][0]) {
-                  if(x[klist[kNeii]][1]==x[i][1]) {
-                    if(x[klist[kNeii]][2]==x[i][2]) {
-                      break;
-                    }
-                  }
-                }
-              }
-              dis_ik[0]=x[k][0]-x[i][0];
-              dis_ik[1]=x[k][1]-x[i][1];
-              dis_ik[2]=x[k][2]-x[i][2];
-              rsq_ik=dis_ik[0]*dis_ik[0]
-                  +dis_ik[1]*dis_ik[1]
-                  +dis_ik[2]*dis_ik[2];
-              r_ik=sqrt(rsq_ik);
-              if(r_ik<=rcut[iik]) {
-                ps=r_ik*rdr[iik]+1.0;
-                ks=(int)ps;
-                if(nr-1<ks)
-                  ks=nr-1;
-                ps=ps-ks;
-                if(ps>1.0)
-                  ps=1.0;
-                betaS_ik=((pBetaS3[iik][ks-1]*ps+pBetaS2[iik][ks-1])*ps
-                    +pBetaS1[iik][ks-1])*ps+pBetaS[iik][ks-1];
-                dBetaS_ik=(pBetaS6[iik][ks-1]*ps+pBetaS5[iik][ks-1])*ps
-                    +pBetaS4[iik][ks-1];
-
-//find neighbor of i that is equal to k
-
-                for(jNeik=0;jNeik<numneigh[j];jNeik++) {
-                  temp_jk=BOP_index[j]+jNeik;
-                  if(x[jlist[jNeik]][0]==x[k][0]) {
-                    if(x[jlist[jNeik]][1]==x[k][1]) {
-                      if(x[jlist[jNeik]][2]==x[k][2]) {
-                        break;
-                      }
-                    }
-                  }
-                }
-
-//find neighbor of k that is equal to j
-
-                for(kNeij=0;kNeij<numneigh[k];kNeij++) {
-                  if(x[klist[kNeij]][0]==x[j][0]) {
-                    if(x[klist[kNeij]][1]==x[j][1]) {
-                      if(x[klist[kNeij]][2]==x[j][2]) {
-                        break;
-                      }
-                    }
-                  }
-                }
-                dis_jk[0]=x[k][0]-x[j][0];
-                dis_jk[1]=x[k][1]-x[j][1];
-                dis_jk[2]=x[k][2]-x[j][2];
-                rsq_jk=dis_jk[0]*dis_jk[0]
-                    +dis_jk[1]*dis_jk[1]
-                    +dis_jk[2]*dis_jk[2];
-                r_jk=sqrt(rsq_jk);
-
-                sig_flag=0;
-                for(nsearch=0;nsearch<nSigBk[n];nsearch++) {
-                  ncmp=itypeSigBk[n][nsearch];
-                  if(x[ncmp][0]==x[k][0]) {
-                    if(x[ncmp][1]==x[k][1]) {
-                      if(x[ncmp][2]==x[k][2]) {
-                        nk0=nsearch;
-                        sig_flag=1;
-                        break;
-                      }
-                    }
-                  }
-                }
-                if(sig_flag==0) {
-                  nSigBk[n]=nSigBk[n]+1;
-                  nk0=nSigBk[n]-1;
-                  itypeSigBk[n][nk0]=k;
-                }
-                nb_ik=nb_t;
-                nb_t++;
-                if(nb_t>nb_sg) {
-                  new_n_tot=nb_sg+maxneigh;
-                  grow_sigma(nb_sg,new_n_tot);
-                  nb_sg=new_n_tot;
-                }
-                bt_sg[nb_ik].temp=temp_ik;
-                bt_sg[nb_ik].i=i;
-                bt_sg[nb_ik].j=k;
-                nb_jk=nb_t;
-                nb_t++;
-                if(nb_t>nb_sg) {
-                  new_n_tot=nb_sg+maxneigh;
-                  grow_sigma(nb_sg,new_n_tot);
-                  nb_sg=new_n_tot;
-                }
-                bt_sg[nb_jk].temp=temp_jk;
-                bt_sg[nb_jk].i=j;
-                bt_sg[nb_jk].j=k;
-                cosAng_jik=(dis_ij[0]*dis_ik[0]+dis_ij[1]*dis_ik[1]
-                    +dis_ij[2]*dis_ik[2])/(r_ij*r_ik);
-                dcA_jik[0][0]=(dis_ik[0]*r_ij*r_ik-cosAng_jik
-                    *dis_ij[0]*r_ik*r_ik)/(r_ij*r_ij*r_ik*r_ik);
-                dcA_jik[1][0]=(dis_ik[1]*r_ij*r_ik-cosAng_jik
-                    *dis_ij[1]*r_ik*r_ik)/(r_ij*r_ij*r_ik*r_ik);
-                dcA_jik[2][0]=(dis_ik[2]*r_ij*r_ik-cosAng_jik
-                    *dis_ij[2]*r_ik*r_ik)/(r_ij*r_ij*r_ik*r_ik);
-                dcA_jik[0][1]=(dis_ij[0]*r_ij*r_ik-cosAng_jik
-                    *dis_ik[0]*r_ij*r_ij)/(r_ij*r_ij*r_ik*r_ik);
-                dcA_jik[1][1]=(dis_ij[1]*r_ij*r_ik-cosAng_jik
-                    *dis_ik[1]*r_ij*r_ij)/(r_ij*r_ij*r_ik*r_ik);
-                dcA_jik[2][1]=(dis_ij[2]*r_ij*r_ik-cosAng_jik
-                    *dis_ik[2]*r_ij*r_ij)/(r_ij*r_ij*r_ik*r_ik);
-                gmean0=sigma_g0[jtype-1][itype-1][ktype-1];
-                gmean1=sigma_g1[jtype-1][itype-1][ktype-1];
-                gmean2=sigma_g2[jtype-1][itype-1][ktype-1];
-                amean=cosAng_jik;
-                gfactor1=gmean0+gmean1*amean
-                    +gmean2*amean*amean;
-                gfactorsq=gfactor1*gfactor1;
-                gprime1=gmean1+2.0*gmean2*amean;
-                gsqprime=2.0*gfactor1*gprime1;
-
-//AA is Eq. 34 (a) or Eq. 10 (c) for the i atom
-//1st CC is Eq. 11 (c) for i atom where j & k=neighbor of i
-
-                AA=AA+gfactorsq*betaS_ik*betaS_ik;
-                CC=CC+gfactorsq*betaS_ik*betaS_ik*betaS_ik*betaS_ik;
-
-//agpdpr1 is derivative of AA w.r.t. Beta(rik)
-//app1 is derivative of AA w.r.t. cos(theta_jik)
-
-                agpdpr1=2.0*gfactorsq*betaS_ik*dBetaS_ik/r_ik;
-                app1=betaS_ik*betaS_ik*gsqprime;
-                bt_sg[nb_ij].dAA[0]+=
-                    app1*dcA_jik[0][0];
-                bt_sg[nb_ij].dAA[1]+=
-                    app1*dcA_jik[1][0];
-                bt_sg[nb_ij].dAA[2]+=
-                    app1*dcA_jik[2][0];
-                bt_sg[nb_ik].dAA[0]+=
-                    app1*dcA_jik[0][1]
-                    +agpdpr1*dis_ik[0];
-                bt_sg[nb_ik].dAA[1]+=
-                    app1*dcA_jik[1][1]
-                    +agpdpr1*dis_ik[1];
-                bt_sg[nb_ik].dAA[2]+=
-                    app1*dcA_jik[2][1]
-                    +agpdpr1*dis_ik[2];
-
-//k' is loop over neighbors all neighbors of j with k a neighbor
-//of i and j a neighbor of i and determine which k' is k
-
-                same_kpk=0;
-                for(ltmp=0;ltmp<numneigh[j];ltmp++) {
-                  temp_jkp=BOP_index[j]+ltmp;
-                  kp1=jlist[ltmp];
-                  kp1type=map[type[kp1]]+1;
-                  if(x[kp1][0]==x[k][0]) {
-                    if(x[kp1][1]==x[k][1]) {
-                      if(x[kp1][2]==x[k][2]) {
-                        same_kpk=1;
-                        break;
-                      }
-                    }
-                  }
-                }
-                if(same_kpk){
-
-//loop over neighbors of k
-
-                  for(mtmp=0;mtmp<numneigh[k];mtmp++) {
-                    kp2=klist[mtmp];
-                    if(x[kp2][0]==x[k][0]) {
-                      if(x[kp2][1]==x[k][1]) {
-                        if(x[kp2][2]==x[k][2]) {
-                          break;
-                        }
-                      }
-                    }
-                  }
-                  if(jtype==ktype)
-                    ijk=jtype-1;
-                  else if(jtype < ktype)
-                    ijk=jtype*bop_types-jtype*(jtype+1)/2+ktype-1;
-                  else
-                    ijk=ktype*bop_types-ktype*(ktype+1)/2+jtype-1;
-                  if(jtype==kp1type)
-                    ijkp=jtype-1;
-                  else if(jtype<kp1type)
-                    ijkp=jtype*bop_types-jtype*(jtype+1)/2+kp1type-1;
-                  else
-                    ijkp=kp1type*bop_types-kp1type*(kp1type+1)/2+jtype-1;
-
-                  dis_jkp[0]=x[kp1][0]-x[j][0];
-                  dis_jkp[1]=x[kp1][1]-x[j][1];
-                  dis_jkp[2]=x[kp1][2]-x[j][2];
-                  rsq_jkp=dis_jkp[0]*dis_jkp[0]
-                      +dis_jkp[1]*dis_jkp[1]
-                      +dis_jkp[2]*dis_jkp[2];
-                  r_jkp=sqrt(rsq_jkp);
-                  if(r_jkp<=rcut[ijkp]) {
-                    ps=r_jkp*rdr[ijkp]+1.0;
-                    ks=(int)ps;
-                    if(nr-1<ks)
-                      ks=nr-1;
-                    ps=ps-ks;
-                    if(ps>1.0)
-                      ps=1.0;
-                    betaS_jkp=((pBetaS3[ijkp][ks-1]*ps+pBetaS2[ijkp][ks-1])*ps
-                        +pBetaS1[ijkp][ks-1])*ps+pBetaS[ijkp][ks-1];
-                    dBetaS_jkp=(pBetaS6[ijkp][ks-1]*ps+pBetaS5[ijkp][ks-1])*ps
-                        +pBetaS4[ijkp][ks-1];
-                    cosAng_ijk=(-dis_ij[0]*dis_jk[0]-dis_ij[1]*dis_jk[1]
-                        -dis_ij[2]*dis_jk[2])/(r_ij*r_jk);
-                    dcA_ijk[0][0]=(dis_jk[0]*r_ij*r_jk-cosAng_ijk
-                        *-dis_ij[0]*r_jk*r_jk)/(r_ij*r_ij*r_jk*r_jk);
-                    dcA_ijk[1][0]=(dis_jk[1]*r_ij*r_jk-cosAng_ijk
-                        *-dis_ij[1]*r_jk*r_jk)/(r_ij*r_ij*r_jk*r_jk);
-                    dcA_ijk[2][0]=(dis_jk[2]*r_ij*r_jk-cosAng_ijk
-                        *-dis_ij[2]*r_jk*r_jk)/(r_ij*r_ij*r_jk*r_jk);
-                    dcA_ijk[0][1]=(-dis_ij[0]*r_ij*r_jk-cosAng_ijk
-                        *dis_jk[0]*r_ij*r_ij)/(r_ij*r_ij*r_jk*r_jk);
-                    dcA_ijk[1][1]=(-dis_ij[1]*r_ij*r_jk-cosAng_ijk
-                        *dis_jk[1]*r_ij*r_ij)/(r_ij*r_ij*r_jk*r_jk);
-                    dcA_ijk[2][1]=(-dis_ij[2]*r_ij*r_jk-cosAng_ijk
-                        *dis_jk[2]*r_ij*r_ij)/(r_ij*r_ij*r_jk*r_jk);
-                    gmean0=sigma_g0[itype-1][jtype-1][ktype-1];
-                    gmean1=sigma_g1[itype-1][jtype-1][ktype-1];
-                    gmean2=sigma_g2[itype-1][jtype-1][ktype-1];
-                    amean=cosAng_ijk;
-                    gfactor2=gmean0+gmean1*amean
-                        +gmean2*amean*amean;
-                    gprime2=gmean1+2.0*gmean2*amean;
-                    gmean0=sigma_g0[itype-1][ktype-1][jtype-1];
-                    gmean1=sigma_g1[itype-1][ktype-1][jtype-1];
-                    gmean2=sigma_g2[itype-1][ktype-1][jtype-1];
-                    cosAng_ikj=(dis_ik[0]*dis_jk[0]+dis_ik[1]*dis_jk[1]
-                        +dis_ik[2]*dis_jk[2])/(r_ik*r_jk);
-                    dcA_ikj[0][0]=(-dis_jk[0]*r_ik*r_jk-cosAng_ikj
-                        *-dis_ik[0]*r_jk*r_jk)/(r_ik*r_ik*r_jk*r_jk);
-                    dcA_ikj[1][0]=(-dis_jk[1]*r_ik*r_jk-cosAng_ikj
-                        *-dis_ik[1]*r_jk*r_jk)/(r_ik*r_ik*r_jk*r_jk);
-                    dcA_ikj[2][0]=(-dis_jk[2]*r_ik*r_jk-cosAng_ikj
-                        *-dis_ik[2]*r_jk*r_jk)/(r_ik*r_ik*r_jk*r_jk);
-                    dcA_ikj[0][1]=(-dis_ik[0]*r_ik*r_jk-cosAng_ikj
-                        *-dis_jk[0]*r_ik*r_ik)/(r_ik*r_ik*r_jk*r_jk);
-                    dcA_ikj[1][1]=(-dis_ik[1]*r_ik*r_jk-cosAng_ikj
-                        *-dis_jk[1]*r_ik*r_ik)/(r_ik*r_ik*r_jk*r_jk);
-                    dcA_ikj[2][1]=(-dis_ik[2]*r_ik*r_jk-cosAng_ikj
-                        *-dis_jk[2]*r_ik*r_ik)/(r_ik*r_ik*r_jk*r_jk);
-                    amean=cosAng_ikj;
-                    gfactor3=gmean0+gmean1*amean
-                        +gmean2*amean*amean;
-                    gprime3=gmean1+2.0*gmean2*amean;
-                    gfactor=gfactor1*gfactor2*gfactor3;
-                    rfactor=betaS_ik*betaS_jkp;
-
-//EE1 is (b) Eq. 12
-
-                    EE1=EE1+gfactor*rfactor;
-
-//rcm1 is derivative of EE1 w.r.t Beta(r_ik)
-//rcm2 is derivative of EE1 w.r.t Beta(r_jk')
-//gcm1 is derivative of EE1 w.r.t cos(theta_jik)
-//gcm2 is derivative of EE1 w.r.t cos(theta_ijk)
-//gcm3 is derivative of EE1 w.r.t cos(theta_ikj)
-
-                    rcm1=gfactor*betaS_jkp*dBetaS_ik/r_ik;
-                    rcm2=gfactor*betaS_ik*dBetaS_jkp/r_jkp;
-                    gcm1=rfactor*gprime1*gfactor2*gfactor3;
-                    gcm2=rfactor*gfactor1*gprime2*gfactor3;
-                    gcm3=rfactor*gfactor1*gfactor2*gprime3;
-                    bt_sg[nb_ij].dEE1[0]+=
-                        gcm1*dcA_jik[0][0]
-                        -gcm2*dcA_ijk[0][0];
-                    bt_sg[nb_ij].dEE1[1]+=
-                        gcm1*dcA_jik[1][0]
-                        -gcm2*dcA_ijk[1][0];
-                    bt_sg[nb_ij].dEE1[2]+=
-                        gcm1*dcA_jik[2][0]
-                        -gcm2*dcA_ijk[2][0];
-                    bt_sg[nb_ik].dEE1[0]+=
-                        gcm1*dcA_jik[0][1]
-                        +rcm1*dis_ik[0]
-                        -gcm3*dcA_ikj[0][0];
-                    bt_sg[nb_ik].dEE1[1]+=
-                        gcm1*dcA_jik[1][1]
-                        +rcm1*dis_ik[1]
-                        -gcm3*dcA_ikj[1][0];
-                    bt_sg[nb_ik].dEE1[2]+=
-                        gcm1*dcA_jik[2][1]
-                        +rcm1*dis_ik[2]
-                        -gcm3*dcA_ikj[2][0];
-                    bt_sg[nb_jk].dEE1[0]+=
-                        gcm2*dcA_ijk[0][1]
-                        +rcm2*dis_jkp[0]
-                        -gcm3*dcA_ikj[0][1];
-                    bt_sg[nb_jk].dEE1[1]+=
-                        gcm2*dcA_ijk[1][1]
-                        +rcm2*dis_jkp[1]
-                        -gcm3*dcA_ikj[1][1];
-                    bt_sg[nb_jk].dEE1[2]+=
-                        gcm2*dcA_ijk[2][1]
-                        +rcm2*dis_jkp[2]
-                        -gcm3*dcA_ikj[2][1];
-                  }
-                }
-
-// k and k' and j are all different neighbors of i
-
-                for(ltmp=0;ltmp<ktmp;ltmp++) {
-                  if(ltmp!=jtmp) {
-                    kp=iilist[ltmp];;
-                    kptype = map[type[kp]]+1;
-                    if(itype==kptype)
-                      iikp=itype-1;
-                    else if(itype<kptype)
-                      iikp=itype*bop_types-itype*(itype+1)/2+kptype-1;
-                    else
-                      iikp=kptype*bop_types-kptype*(kptype+1)/2+itype-1;
-                    for(nsearch=0;nsearch<nSigBk[n];nsearch++) {
-                      ncmp=itypeSigBk[n][nsearch];
-                      if(x[ncmp][0]==x[kp][0]) {
-                        if(x[ncmp][1]==x[kp][1]) {
-                          if(x[ncmp][2]==x[kp][2]) {
-                            break;
-                          }
-                        }
-                      }
-                    }
-                    dis_ikp[0]=x[kp][0]-x[i][0];
-                    dis_ikp[1]=x[kp][1]-x[i][1];
-                    dis_ikp[2]=x[kp][2]-x[i][2];
-                    rsq_ikp=dis_ikp[0]*dis_ikp[0]
-                        +dis_ikp[1]*dis_ikp[1]
-                        +dis_ikp[2]*dis_ikp[2];
-                    r_ikp=sqrt(rsq_ikp);
-                    if(r_ikp<=rcut[iikp]) {
-                      ps=r_ikp*rdr[iikp]+1.0;
-                      ks=(int)ps;
-                      if(nr-1<ks)
-                        ks=nr-1;
-                      ps=ps-ks;
-                      if(ps>1.0)
-                        ps=1.0;
-                      betaS_ikp=((pBetaS3[iikp][ks-1]*ps+pBetaS2[iikp][ks-1])*ps
-                          +pBetaS1[iikp][ks-1])*ps+pBetaS[iikp][ks-1];
-                      gmean0=sigma_g0[jtype-1][itype-1][kptype-1];
-                      gmean1=sigma_g1[jtype-1][itype-1][kptype-1];
-                      gmean2=sigma_g2[jtype-1][itype-1][kptype-1];
-                      cosAng_jikp=(dis_ij[0]*dis_ikp[0]+dis_ij[1]*dis_ikp[1]
-                          +dis_ij[2]*dis_ikp[2])/(r_ij*r_ikp);
-                      cosAng_kikp=(dis_ik[0]*dis_ikp[0]+dis_ik[1]*dis_ikp[1]
-                          +dis_ik[2]*dis_ikp[2])/(r_ik*r_ikp);
-                      amean=cosAng_jikp;
-                      gfactor2=gmean0+gmean1*amean
-                          +gmean2*amean*amean;
-                      gprime2=gmean1+2.0*gmean2*amean;
-                      gmean0=sigma_g0[ktype-1][itype-1][kptype-1];
-                      gmean1=sigma_g1[ktype-1][itype-1][kptype-1];
-                      gmean2=sigma_g2[ktype-1][itype-1][kptype-1];
-                      amean=cosAng_kikp;
-                      gfactor3=gmean0+gmean1*amean
-                          +gmean2*amean*amean;
-                      gprime3=gmean1+2.0*gmean2*amean;
-                      gfactor=gfactor1*gfactor2*gfactor3;
-                      rfactorrt=betaS_ik*betaS_ikp;
-                      rfactor=rfactorrt*rfactorrt;
-
-//2nd CC is second term of Eq. 11 (c) for i atom where j , k & k' =neighbor of i
-
-                      CC=CC+2.0*gfactor*rfactor;
-                    }
-                  }
-                }
-
-// j and k are different neighbors of i and k' is a neighbor k not equal to i
-
-                for(ltmp=0;ltmp<numneigh[k];ltmp++) {
-                  temp_kkp=BOP_index[k]+ltmp;
-                  kp=klist[ltmp];;
-                  kptype = map[type[kp]]+1;
-                  same_ikp=0;
-                  same_jkp=0;
-                  if(x[i][0]==x[kp][0]) {
-                    if(x[i][1]==x[kp][1]) {
-                      if(x[i][2]==x[kp][2]) {
-                        same_ikp=1;
-                      }
-                    }
-                  }
-                  if(x[j][0]==x[kp][0]) {
-                    if(x[j][1]==x[kp][1]) {
-                      if(x[j][2]==x[kp][2]) {
-                        same_jkp=1;
-                      }
-                    }
-                  }
-                  if(!same_ikp&&!same_jkp) {
-                    if(ktype==kptype)
-                      ikkp=ktype-1;
-                    else if(ktype<kptype)
-                      ikkp=ktype*bop_types-ktype*(ktype+1)/2+kptype-1;
-                    else
-                      ikkp=kptype*bop_types-kptype*(kptype+1)/2+ktype-1;
-                    dis_kkp[0]=x[kp][0]-x[k][0];
-                    dis_kkp[1]=x[kp][1]-x[k][1];
-                    dis_kkp[2]=x[kp][2]-x[k][2];
-                    rsq_kkp=dis_kkp[0]*dis_kkp[0]
-                        +dis_kkp[1]*dis_kkp[1]
-                        +dis_kkp[2]*dis_kkp[2];
-                    r_kkp=sqrt(rsq_kkp);
-                    if(r_kkp<=rcut[ikkp]) {
-                      ps=r_kkp*rdr[ikkp]+1.0;
-                      ks=(int)ps;
-                      if(nr-1<ks)
-                        ks=nr-1;
-                      ps=ps-ks;
-                      if(ps>1.0)
-                        ps=1.0;
-                      betaS_kkp=((pBetaS3[ikkp][ks-1]*ps+pBetaS2[ikkp][ks-1])*ps
-                          +pBetaS1[ikkp][ks-1])*ps+pBetaS[ikkp][ks-1];
-                      sig_flag=0;
-                      for(nsearch=0;nsearch<nSigBk[n];nsearch++) {
-                        ncmp=itypeSigBk[n][nsearch];
-                        if(x[ncmp][0]==x[kp][0]) {
-                          if(x[ncmp][1]==x[kp][1]) {
-                            if(x[ncmp][2]==x[kp][2]) {
-                              sig_flag=1;
-                              nkp=nsearch;
-                              break;
-                            }
-                          }
-                        }
-                      }
-                      if(sig_flag==0) {
-                        nSigBk[n]=nSigBk[n]+1;
-                        nkp=nSigBk[n]-1;
-                        itypeSigBk[n][nkp]=kp;
-                      }
-                      cosAng_ikkp=(-dis_ik[0]*dis_kkp[0]-dis_ik[1]*dis_kkp[1]
-                          -dis_ik[2]*dis_kkp[2])/(r_ik*r_kkp);
-                      gmean0=sigma_g0[itype-1][ktype-1][kptype-1];
-                      gmean1=sigma_g1[itype-1][ktype-1][kptype-1];
-                      gmean2=sigma_g2[itype-1][ktype-1][kptype-1];
-                      amean=cosAng_ikkp;
-                      gfactor2=gmean0+gmean1*amean
-                          +gmean2*amean*amean;
-                      gprime2=gmean1+2.0*gmean2*amean;
-                      gfactorsq2=gfactor2*gfactor2;
-                      gfactor=gfactorsq*gfactorsq2;
-                      rfactorrt=betaS_ik*betaS_kkp;
-                      rfactor=rfactorrt*rfactorrt;
-
-//3rd CC is third term of Eq. 11 (c) for i atom
-//where j , k =neighbor of i & k' =neighbor of k
-
-                      CC=CC+gfactor*rfactor;
-                    }
-                  }
-                }
-              }
-            }
-          }
-
-//j is a neighbor of i and k is a neighbor of j not equal to i
-
-          for(ktmp=0;ktmp<numneigh[j];ktmp++) {
-            if(ktmp!=ji) {
-              temp_jk=BOP_index[j]+ktmp;
-              k=jlist[ktmp];
-              klist=firstneigh[k];
-              ktype=map[type[k]]+1;
-              for(kNeij=0;kNeij<numneigh[k];kNeij++) {
-                if(x[klist[kNeij]][0]==x[j][0]) {
-                  if(x[klist[kNeij]][1]==x[j][1]) {
-                    if(x[klist[kNeij]][2]==x[j][2]) {
-                      break;
-                    }
-                  }
-                }
-              }
-              if(jtype==ktype)
-                ijk=jtype-1;
-              else if(jtype<ktype)
-                ijk=jtype*bop_types-jtype*(jtype+1)/2+ktype-1;
-              else
-                ijk=ktype*bop_types-ktype*(ktype+1)/2+jtype-1;
-              sig_flag=0;
-              for(nsearch=0;nsearch<nSigBk[n];nsearch++) {
-                ncmp=itypeSigBk[n][nsearch];
-                if(x[ncmp][0]==x[k][0]) {
-                  if(x[ncmp][1]==x[k][1]) {
-                    if(x[ncmp][2]==x[k][2]) {
-                      new1=nsearch;
-                      sig_flag=1;
-                      break;
-                    }
-                  }
-                }
-              }
-              if(sig_flag==0) {
-                nSigBk[n]=nSigBk[n]+1;
-                new1=nSigBk[n]-1;
-                itypeSigBk[n][new1]=k;
-              }
-              dis_jk[0]=x[k][0]-x[j][0];
-              dis_jk[1]=x[k][1]-x[j][1];
-              dis_jk[2]=x[k][2]-x[j][2];
-              rsq_jk=dis_jk[0]*dis_jk[0]
-                  +dis_jk[1]*dis_jk[1]
-                  +dis_jk[2]*dis_jk[2];
-              r_jk=sqrt(rsq_jk);
-              if(r_jk<=rcut[ijk]) {
-                ps=r_jk*rdr[ijk]+1.0;
-                ks=(int)ps;
-                if(nr-1<ks)
-                  ks=nr-1;
-                ps=ps-ks;
-                if(ps>1.0)
-                  ps=1.0;
-                betaS_jk=((pBetaS3[ijk][ks-1]*ps+pBetaS2[ijk][ks-1])*ps
-                    +pBetaS1[ijk][ks-1])*ps+pBetaS[ijk][ks-1];
-                dBetaS_jk=(pBetaS6[ijk][ks-1]*ps+pBetaS5[ijk][ks-1])*ps
-                    +pBetaS4[ijk][ks-1];
-                cosAng_ijk=(-dis_ij[0]*dis_jk[0]-dis_ij[1]*dis_jk[1]
-                    -dis_ij[2]*dis_jk[2])/(r_ij*r_jk);
-                dcA_ijk[0][0]=(dis_jk[0]*r_ij*r_jk-cosAng_ijk
-                    *-dis_ij[0]*r_jk*r_jk)/(r_ij*r_ij*r_jk*r_jk);
-                dcA_ijk[1][0]=(dis_jk[1]*r_ij*r_jk-cosAng_ijk
-                    *-dis_ij[1]*r_jk*r_jk)/(r_ij*r_ij*r_jk*r_jk);
-                dcA_ijk[2][0]=(dis_jk[2]*r_ij*r_jk-cosAng_ijk
-                    *-dis_ij[2]*r_jk*r_jk)/(r_ij*r_ij*r_jk*r_jk);
-                dcA_ijk[0][1]=(-dis_ij[0]*r_ij*r_jk-cosAng_ijk
-                    *dis_jk[0]*r_ij*r_ij)/(r_ij*r_ij*r_jk*r_jk);
-                dcA_ijk[1][1]=(-dis_ij[1]*r_ij*r_jk-cosAng_ijk
-                    *dis_jk[1]*r_ij*r_ij)/(r_ij*r_ij*r_jk*r_jk);
-                dcA_ijk[2][1]=(-dis_ij[2]*r_ij*r_jk-cosAng_ijk
-                    *dis_jk[2]*r_ij*r_ij)/(r_ij*r_ij*r_jk*r_jk);
-                nb_jk=nb_t;
-                nb_t++;
-                if(nb_t>nb_sg) {
-                  new_n_tot=nb_sg+maxneigh;
-                  grow_sigma(nb_sg,new_n_tot);
-                  nb_sg=new_n_tot;
-                }
-                bt_sg[nb_jk].temp=temp_jk;
-                bt_sg[nb_jk].i=j;
-                bt_sg[nb_jk].j=k;
-                gmean0=sigma_g0[itype-1][jtype-1][ktype-1];
-                gmean1=sigma_g1[itype-1][jtype-1][ktype-1];
-                gmean2=sigma_g2[itype-1][jtype-1][ktype-1];
-                amean=cosAng_ijk;
-                gfactor1=gmean0+gmean1*amean
-                    +gmean2*amean*amean;
-                gprime1=gmean1+2.0*gmean2*amean;
-                gfactorsq=gfactor1*gfactor1;
-                gsqprime=2.0*gfactor1*gprime1;
-                rfactor1rt=betaS_jk*betaS_jk;
-                rfactor1=rfactor1rt*rfactor1rt;
-
-//BB is Eq. 34 (a) or Eq. 10 (c) for the j atom
-//1st DD is Eq. 11 (c) for j atom where i & k=neighbor of j
-
-                BB=BB+gfactorsq*rfactor1rt;
-                DD=DD+gfactorsq*rfactor1;
-
-//agpdpr1 is derivative of BB  w.r.t. Beta(r_jk)
-//app1 is derivative of BB w.r.t. cos(theta_ijk)
-
-                agpdpr1=2.0*gfactorsq*betaS_jk*dBetaS_jk/r_jk;
-                app1=rfactor1rt*gsqprime;
-                bt_sg[nb_ij].dBB[0]-=
-                    app1*dcA_ijk[0][0];
-                bt_sg[nb_ij].dBB[1]-=
-                    app1*dcA_ijk[1][0];
-                bt_sg[nb_ij].dBB[2]-=
-                    app1*dcA_ijk[2][0];
-                bt_sg[nb_jk].dBB[0]+=
-                    app1*dcA_ijk[0][1]
-                    +agpdpr1*dis_jk[0];
-                bt_sg[nb_jk].dBB[1]+=
-                    app1*dcA_ijk[1][1]
-                    +agpdpr1*dis_jk[1];
-                bt_sg[nb_jk].dBB[2]+=
-                    app1*dcA_ijk[2][1]
-                    +agpdpr1*dis_jk[2];
-
-//j is a neighbor of i, k and k' prime different neighbors of j not equal to i
-
-                for(ltmp=0;ltmp<ktmp;ltmp++) {
-                  if(ltmp!=ji) {
-                    temp_jkp=BOP_index[j]+ltmp;
-                    kp=jlist[ltmp];
-                    kptype=map[type[kp]]+1;
                     if(jtype==kptype)
                       ijkp=jtype-1;
                     else if(jtype<kptype)
                       ijkp=jtype*bop_types-jtype*(jtype+1)/2+kptype-1;
                     else
                       ijkp=kptype*bop_types-kptype*(kptype+1)/2+jtype-1;
-                    for(nsearch=0;nsearch<nSigBk[n];nsearch++) {
-                      ncmp=itypeSigBk[n][nsearch];
-                      if(x[ncmp][0]==x[kp][0]) {
-                        if(x[ncmp][1]==x[kp][1]) {
-                          if(x[ncmp][2]==x[kp][2]) {
-                            new2=nsearch;
-                            break;
-                          }
-                        }
-                      }
-                    }
-                    dis_jkp[0]=x[kp][0]-x[j][0];
-                    dis_jkp[1]=x[kp][1]-x[j][1];
-                    dis_jkp[2]=x[kp][2]-x[j][2];
-                    rsq_jkp=dis_jkp[0]*dis_jkp[0]
-                        +dis_jkp[1]*dis_jkp[1]
-                        +dis_jkp[2]*dis_jkp[2];
-                    r_jkp=sqrt(rsq_jkp);
-                    if(r_jkp<=rcut[ijkp]) {
-                      ps=r_jkp*rdr[ijkp]+1.0;
-                      ks=(int)ps;
-                      if(nr-1<ks)
-                        ks=nr-1;
-                      ps=ps-ks;
-                      if(ps>1.0)
-                        ps=1.0;
-                      betaS_jkp=((pBetaS3[ijkp][ks-1]*ps+pBetaS2[ijkp][ks-1])*ps
-                        +pBetaS1[ijkp][ks-1])*ps+pBetaS[ijkp][ks-1];
-                      dBetaS_jkp=(pBetaS6[ijkp][ks-1]*ps+pBetaS5[ijkp][ks-1])*ps
-                        +pBetaS4[ijkp][ks-1];
-                      cosAng_ijkp=(-dis_ij[0]*dis_jkp[0]-dis_ij[1]*dis_jkp[1]
-                        -dis_ij[2]*dis_jkp[2])/(r_ij*r_jkp);
-                      cosAng_kjkp=(dis_jk[0]*dis_jkp[0]+dis_jk[1]*dis_jkp[1]
-                        +dis_jk[2]*dis_jkp[2])/(r_jk*r_jkp);
-                      nb_jkp=nb_t;
-                      nb_t++;
-                      if(nb_t>nb_sg) {
-                        new_n_tot=nb_sg+maxneigh;
-                        grow_sigma(nb_sg,new_n_tot);
-                        nb_sg=new_n_tot;
-                      }
-                      bt_sg[nb_jkp].temp=temp_jkp;
-                      bt_sg[nb_jkp].i=j;
-                      bt_sg[nb_jkp].j=kp;
-                      gmean0=sigma_g0[itype-1][jtype-1][kptype-1];
-                      gmean1=sigma_g1[itype-1][jtype-1][kptype-1];
-                      gmean2=sigma_g2[itype-1][jtype-1][kptype-1];
-                      amean=cosAng_ijkp;
-                      gfactor2=gmean0+gmean1*amean
-                          +gmean2*amean*amean;
-                      gprime2=gmean1+2.0*gmean2*amean;
-                      gmean0=sigma_g0[ktype-1][jtype-1][kptype-1];
-                      gmean1=sigma_g1[ktype-1][jtype-1][kptype-1];
-                      gmean2=sigma_g2[ktype-1][jtype-1][kptype-1];
-                      amean=cosAng_kjkp;
-                      gfactor3=gmean0+gmean1*amean
-                          +gmean2*amean*amean;
-                      gprime3=gmean1+2.0*gmean2*amean;
-                      gfactor=gfactor1*gfactor2*gfactor3;
-                      rfactorrt=betaS_jk*betaS_jkp;
-                      rfactor=rfactorrt*rfactorrt;
-
-//2nd DD is Eq. 11 (c) for j atom where i , k & k'=neighbor of j
-
-                      DD=DD+2.0*gfactor*rfactor;
-                    }
-                  }
-                }
-
-//j is a neighbor of i, k is a neighbor of j not equal to i and k'
-//is a neighbor of k not equal to j or i
-
-                for(ltmp=0;ltmp<numneigh[k];ltmp++) {
-                  temp_kkp=BOP_index[k]+ltmp;
-                  kp=klist[ltmp];
-                  kptype=map[type[kp]]+1;
-                  same_ikp=0;
-                  same_jkp=0;
-                  if(x[i][0]==x[kp][0]) {
-                    if(x[i][1]==x[kp][1]) {
-                      if(x[i][2]==x[kp][2]) {
-                        same_ikp=1;
-                      }
-                    }
-                  }
-                  if(x[j][0]==x[kp][0]) {
-                    if(x[j][1]==x[kp][1]) {
-                      if(x[j][2]==x[kp][2]) {
-                        same_jkp=1;
-                      }
-                    }
-                  }
-                  if(!same_ikp&&!same_jkp) {
                     if(ktype==kptype)
                       ikkp=ktype-1;
                     else if(ktype<kptype)
                       ikkp=ktype*bop_types-ktype*(ktype+1)/2+kptype-1;
                     else
                       ikkp=kptype*bop_types-kptype*(kptype+1)/2+ktype-1;
-                    for(kNeij=0;kNeij<numneigh[k];kNeij++) {
-                      if(x[klist[kNeij]][0]==x[j][0]) {
-                        if(x[klist[kNeij]][1]==x[j][1]) {
-                          if(x[klist[kNeij]][2]==x[j][2]) {
-                            break;
-                          }
-                        }
-                      }
-                    }
-                    sig_flag=0;
-                    for(nsearch=0;nsearch<nSigBk[n];nsearch++) {
-                      ncmp=itypeSigBk[n][nsearch];
-                      if(x[ncmp][0]==x[kp][0]) {
-                        if(x[ncmp][1]==x[kp][1]) {
-                          if(x[ncmp][2]==x[kp][2]) {
-                            new2=nsearch;
-                            sig_flag=1;
-                            break;
-                          }
-                        }
-                      }
-                    }
-                    if(sig_flag==0) {
-                      nSigBk[n]=nSigBk[n]+1;
-                      new2=nSigBk[n]-1;
-                      itypeSigBk[n][new2]=kp;
-                    }
-                    dis_kkp[0]=x[kp][0]-x[k][0];
-                    dis_kkp[1]=x[kp][1]-x[k][1];
-                    dis_kkp[2]=x[kp][2]-x[k][2];
-                    rsq_kkp=dis_kkp[0]*dis_kkp[0]
-                        +dis_kkp[1]*dis_kkp[1]
-                        +dis_kkp[2]*dis_kkp[2];
-                    r_kkp=sqrt(rsq_kkp);
-                    if(r_kkp<=rcut[ikkp]) {
+                    if(otfly==1) {
+                      dis_jkp[0]=x[kp][0]-x[j][0];
+                      dis_jkp[1]=x[kp][1]-x[j][1];
+                      dis_jkp[2]=x[kp][2]-x[j][2];
+                      rsq_jkp=dis_jkp[0]*dis_jkp[0]
+                          +dis_jkp[1]*dis_jkp[1]
+                          +dis_jkp[2]*dis_jkp[2];
+                      r_jkp=sqrt(rsq_jkp);
+                      ps=r_jkp*rdr[ijkp]+1.0;
+                      ks=(int)ps;
+                      if(nr-1<ks)
+                        ks=nr-1;
+                      ps=ps-ks;
+                      if(ps>1.0)
+                        ps=1.0;
+                      betaS_jkp=((pBetaS3[ijkp][ks-1]*ps+pBetaS2[ijkp][ks-1])*ps
+                          +pBetaS1[ijkp][ks-1])*ps+pBetaS[ijkp][ks-1];
+                      dBetaS_jkp=(pBetaS6[ijkp][ks-1]*ps+pBetaS5[ijkp][ks-1])*ps
+                          +pBetaS4[ijkp][ks-1];
+                      betaP_jkp=((pBetaP3[ijkp][ks-1]*ps+pBetaP2[ijkp][ks-1])*ps
+                          +pBetaP1[ijkp][ks-1])*ps+pBetaP[ijkp][ks-1];
+                      dBetaP_jkp=(pBetaP6[ijkp][ks-1]*ps+pBetaP5[ijkp][ks-1])*ps
+                          +pBetaP4[ijkp][ks-1];
+                      dis_kkp[0]=x[kp][0]-x[k][0];
+                      dis_kkp[1]=x[kp][1]-x[k][1];
+                      dis_kkp[2]=x[kp][2]-x[k][2];
+                      rsq_kkp=dis_kkp[0]*dis_kkp[0]
+                          +dis_kkp[1]*dis_kkp[1]
+                          +dis_kkp[2]*dis_kkp[2];
+                      r_kkp=sqrt(rsq_kkp);
                       ps=r_kkp*rdr[ikkp]+1.0;
                       ks=(int)ps;
                       if(nr-1<ks)
@@ -6163,938 +2553,1381 @@ void PairBOP::sigmaBo_noa_otf()
                         ps=1.0;
                       betaS_kkp=((pBetaS3[ikkp][ks-1]*ps+pBetaS2[ikkp][ks-1])*ps
                           +pBetaS1[ikkp][ks-1])*ps+pBetaS[ikkp][ks-1];
-                      cosAng_jkkp=(-dis_jk[0]*dis_kkp[0]-dis_jk[1]*dis_kkp[1]
-                          -dis_jk[2]*dis_kkp[2])/(r_jk*r_kkp);
-                      nb_kkp=nb_t;
-                      nb_t++;
-                      if(nb_t>nb_sg) {
-                        new_n_tot=nb_sg+maxneigh;
-                        grow_sigma(nb_sg,new_n_tot);
-                        nb_sg=new_n_tot;
-                      }
-                      bt_sg[nb_kkp].temp=temp_kkp;
-                      bt_sg[nb_kkp].i=k;
-                      bt_sg[nb_kkp].j=kp;
-                      gmean0=sigma_g0[jtype-1][ktype-1][kptype-1];
-                      gmean1=sigma_g1[jtype-1][ktype-1][kptype-1];
-                      gmean2=sigma_g2[jtype-1][ktype-1][kptype-1];
-                      amean=cosAng_jkkp;
-                      gfactor2=gmean0+gmean1*amean
-                          +gmean2*amean*amean;
-                      gprime2=gmean1+2.0*gmean2*amean;
-                      gfactorsq2=gfactor2*gfactor2;
-                      gfactor=gfactorsq*gfactorsq2;
-                      rfactorrt=betaS_jk*betaS_kkp;
-                      rfactor=rfactorrt*rfactorrt;
-
-//3rd DD is Eq. 11 (c) for j atom where i & k=neighbor of j & k'=neighbor of k
-
-                      DD=DD+gfactor*rfactor;
-                    }
-                  }
-                }
-              }
-            }
-          }
-
-          sig_flag=0;
-          if(FF<=0.000001) {
-            sigB[n]=0.0;
-            sig_flag=1;
-          }
-          if(sig_flag==0) {
-            if(AA<0.0)
-              AA=0.0;
-            if(BB<0.0)
-              BB=0.0;
-            if(CC<0.0)
-              CC=0.0;
-            if(DD<0.0)
-              DD=0.0;
-
-// AA and BB are the representations of (a) Eq. 34 and (b) Eq. 9
-// for atoms i and j respectively
-
-            AAC=AA+BB;
-            BBC=AA*BB;
-            CCC=AA*AA+BB*BB;
-            DDC=CC+DD;
-
-//EEC is a modified form of (a) Eq. 33
-
-            EEC=(DDC-CCC)/(AAC+2.0*small1);
-            for(m=0;m<nb_t;m++) {
-              if((bt_sg[m].i>-1)&&(bt_sg[m].j>-1)) {
-                bt_sg[m].dAAC[0]=bt_sg[m].dAA[0]
-                    +bt_sg[m].dBB[0];
-                bt_sg[m].dAAC[1]=bt_sg[m].dAA[1]
-                    +bt_sg[m].dBB[1];
-                bt_sg[m].dAAC[2]=bt_sg[m].dAA[2]
-                    +bt_sg[m].dBB[2];
-              }
-            }
-            UT=EEC*FF+BBC+small3[iij];
-            UT=1.0/sqrt(UT);
-
-// bndtmp is a slightly modified form of (a) Eq. 30 and (b) Eq. 8
-
-            bndtmp=(FF+sigma_delta[iij]*sigma_delta[iij])
-                +sigma_c[iij]*AAC+small4;
-            psign=1.0;
-            bndtmp0=1.0/sqrt(bndtmp);
-            sigB1[n]=psign*betaS_ij*bndtmp0;
-            bndtmp=-0.5*bndtmp0*bndtmp0*bndtmp0;
-            bndtmp1=psign*bndtmp0+psign*betaS_ij
-                *bndtmp*2.0*betaS_ij;
-            bndtmp1=bndtmp1*dBetaS_ij/r_ij;
-            bndtmp2=psign*betaS_ij*bndtmp*sigma_c[iij];
-            setting=0;
-            for(m=0;m<nb_t;m++) {
-              if((bt_sg[m].i>-1)&&(bt_sg[m].j>-1)) {
-                temp_kk=bt_sg[m].temp;
-                if(temp_kk==temp_ij&&setting==0) {
-                  bt_sg[m].dSigB1[0]=bndtmp1*dis_ij[0]
-                      +(bndtmp2*bt_sg[m].dAAC[0]);
-                  bt_sg[m].dSigB1[1]=bndtmp1*dis_ij[1]
-                      +(bndtmp2*bt_sg[m].dAAC[1]);
-                  bt_sg[m].dSigB1[2]=bndtmp1*dis_ij[2]
-                      +(bndtmp2*bt_sg[m].dAAC[2]);
-                  setting=1;
-                }
-                else if(temp_kk==temp_ji&&setting==0) {
-                  bt_sg[m].dSigB1[0]=-bndtmp1*dis_ij[0]
-                      +(bndtmp2*bt_sg[m].dAAC[0]);
-                  bt_sg[m].dSigB1[1]=-bndtmp1*dis_ij[1]
-                      +(bndtmp2*bt_sg[m].dAAC[1]);
-                  bt_sg[m].dSigB1[2]=-bndtmp1*dis_ij[2]
-                      +(bndtmp2*bt_sg[m].dAAC[2]);
-                  setting=1;
-                }
-                else {
-                  bt_sg[m].dSigB1[0]=(bndtmp2*bt_sg[m].dAAC[0]);
-                  bt_sg[m].dSigB1[1]=(bndtmp2*bt_sg[m].dAAC[1]);
-                  bt_sg[m].dSigB1[2]=(bndtmp2*bt_sg[m].dAAC[2]);
-                }
-              }
-            }
-
-//This loop is to ensure there is not an error for atoms with no neighbors (deposition)
-
-            if(nb_t==0) {
-              if(j>i) {
-                bt_sg[0].dSigB1[0]=bndtmp1*dis_ij[0];
-                bt_sg[0].dSigB1[1]=bndtmp1*dis_ij[1];
-                bt_sg[0].dSigB1[2]=bndtmp1*dis_ij[2];
-              }
-              else {
-                bt_sg[0].dSigB1[0]=-bndtmp1*dis_ij[0];
-                bt_sg[0].dSigB1[1]=-bndtmp1*dis_ij[1];
-                bt_sg[0].dSigB1[2]=-bndtmp1*dis_ij[2];
-              }
-              for(pp=0;pp<3;pp++) {
-                bt_sg[0].dAA[pp]=0.0;
-                bt_sg[0].dBB[pp]=0.0;
-                bt_sg[0].dEE1[pp]=0.0;
-                bt_sg[0].dFF[pp]=0.0;
-                bt_sg[0].dAAC[pp]=0.0;
-                bt_sg[0].dSigB[pp]=0.0;
-              }
-              bt_sg[0].i=i;
-              bt_sg[0].j=j;
-              bt_sg[0].temp=temp_ij;
-              nb_t++;
-              if(nb_t>nb_sg) {
-                new_n_tot=nb_sg+maxneigh;
-                grow_sigma(nb_sg,new_n_tot);
-                nb_sg=new_n_tot;
-              }
-            }
-            ps=sigB1[n]*rdBO+1.0;
-            ks=(int)ps;
-            if(nBOt-1<ks)
-              ks=nBOt-1;
-            ps=ps-ks;
-            if(ps>1.0)
-              ps=1.0;
-            dsigB1=((FsigBO3[iij][ks-1]*ps+FsigBO2[iij][ks-1])*ps
-                +FsigBO1[iij][ks-1])*ps+FsigBO[iij][ks-1];
-            dsigB2=(FsigBO6[iij][ks-1]*ps+FsigBO5[iij][ks-1])*ps+FsigBO4[iij][ks-1];
-            part0=(FF+0.5*AAC+small5);
-            part1=(sigma_f[iij]-0.5)*sigma_k[iij];
-            part2=1.0-part1*EE1/part0;
-            part3=dsigB1*part1/part0;
-            part4=part3/part0*EE1;
-
-// sigB is the final expression for (a) Eq. 6 and (b) Eq. 11
-
-            sigB[n]=dsigB1*part2;
-            pp1=2.0*betaS_ij;
-            for(m=0;m<nb_t;m++) {
-              if((bt_sg[m].i>-1)&&(bt_sg[m].j>-1)) {
-                temp_kk=bt_sg[m].temp;
-                bt_i=bt_sg[m].i;
-                bt_j=bt_sg[m].j;
-                xtmp[0]=x[bt_j][0]-x[bt_i][0];
-                xtmp[1]=x[bt_j][1]-x[bt_i][1];
-                xtmp[2]=x[bt_j][2]-x[bt_i][2];
-                for(pp=0;pp<3;pp++) {
-                  bt_sg[m].dSigB[pp]=dsigB2*part2*bt_sg[m].dSigB1[pp]
-                      -part3*bt_sg[m].dEE1[pp]
-                      +part4*(bt_sg[m].dFF[pp]
-                      +0.5*bt_sg[m].dAAC[pp]);
-                }
-                for(pp=0;pp<3;pp++) {
-                  ftmp[pp]=pp1*bt_sg[m].dSigB[pp];
-                  f[bt_i][pp]-=ftmp[pp];
-                  f[bt_j][pp]+=ftmp[pp];
-                }
-                if(evflag) {
-                  ev_tally_xyz(bt_i,bt_j,nlocal,newton_pair,0.0,0.0,ftmp[0],ftmp[1]
-                      ,ftmp[2],xtmp[0],xtmp[1],xtmp[2]);
-                }
-              }
-            }
-          }
-          n++;
-        }
-      }
-    }
-  }
-  destroy_sigma();
-}
-
-/* ---------------------------------------------------------------------- */
-
-void PairBOP::PiBo()
-{
-  int new_n_tot;
-  int i,j,k,kp,m,n,pp,nb_t;
-  int iij,ji,ki;
-  int nsearch,ncmp;
-  tagint i_tag,j_tag;
-  int njik,ngj,ngk,nglj,ngl,ngi;
-  int nkjkp,nijkp,ngli,nkikp,njikp;
-  int itmp,ltmp,jtmp,ktmp;
-  int nlocal,pi_flag;
-  int inum,*ilist,*iilist,*jlist;
-  int **firstneigh,*numneigh;
-  int itype,jtype;
-  int temp_ij,temp_ik,temp_ikp;
-  int temp_jk,temp_jkp;
-  int ang_jikp,ang_kikp,ang_ijk;
-  int ang_ijkp,ang_kjkp,ang_jik;
-  int nb_ij,nb_ik,nb_jk,nb_ikp,nb_jkp;
-  int bt_ij,bt_i,bt_j;
-  double AA,BB,CC;
-  double cosSq,sinFactor,cosFactor;
-  double cosSq1,dotV,BBrt,AB1,AB2;
-  double BBrtR,ABrtR1,ABrtR2;
-  double angFactor,angFactor1,angFactor2;
-  double angFactor3,angFactor4,angRfactor;
-  double dAngR1,dAngR2,agpdpr3;
-  double agpdpr1,agpdpr2,app1,app2,app3;
-  double betaCapSq1,dbetaCapSq1;
-  double betaCapSq2,dbetaCapSq2;
-  double betaCapSum,ftmp[3];
-  double dPiB1,dPiB2,dPiB3,pp2;
-  double **f = atom->f;
-  double **x = atom->x;
-  int *type = atom->type;
-  tagint *tag = atom->tag;
-  int newton_pair = force->newton_pair;
-
-  nlocal = atom->nlocal;
-  inum = list->inum;
-  ilist = list->ilist;
-  numneigh = list->numneigh;
-  firstneigh = list->firstneigh;
-
-  n=0;
-
-// Loop over all local atoms for i
-
-  if(nb_pi>16) {
-    nb_pi=16;
-  }
-  if(nb_pi==0) {
-    nb_pi=(maxneigh)*(maxneigh/2);
-  }
-  if(allocate_pi) {
-    destroy_pi();
-  }
-  create_pi(nb_pi);
-  for(itmp=0;itmp<inum;itmp++) {
-    nb_t=0;
-    i = ilist[itmp];
-    itype = map[type[i]]+1;
-    i_tag=tag[i];
-
-// j is a loop over all neighbors of i
-
-    iilist=firstneigh[i];
-    for(jtmp=0;jtmp<numneigh[i];jtmp++) {
-      temp_ij=BOP_index[i]+jtmp;
-      if(neigh_flag[temp_ij]) {
-        for(m=0;m<nb_pi;m++) {
-          for(pp=0;pp<3;pp++) {
-            bt_pi[m].dAA[pp]=0.0;
-            bt_pi[m].dBB[pp]=0.0;
-            bt_pi[m].dPiB[pp]=0.0;
-          }
-          bt_pi[m].i=-1;
-          bt_pi[m].j=-1;
-        }
-        j=iilist[jtmp];
-        jlist=firstneigh[j];
-        jtype=map[type[j]]+1;
-        j_tag=tag[j];
-        nb_t=0;
-        ftmp[0]=0.0;
-        ftmp[1]=0.0;
-        ftmp[2]=0.0;
-        nb_ij=nb_t;
-        nb_t++;
-        if(nb_t>nb_pi) {
-          new_n_tot=nb_pi+maxneigh;
-          grow_pi(nb_pi,new_n_tot);
-          nb_pi=new_n_tot;
-        }
-        bt_pi[nb_ij].i=i;
-        bt_pi[nb_ij].j=j;
-        bt_pi[nb_ij].temp=temp_ij;
-        if(j_tag>=i_tag) {
-          if(itype==jtype)
-            iij=itype-1;
-          else if(itype<jtype)
-            iij=itype*bop_types-itype*(itype+1)/2+jtype-1;
-          else
-            iij=jtype*bop_types-jtype*(jtype+1)/2+itype-1;
-          AA=0.0;
-          BB=0.0;
-          nPiBk[n]=0;
-          for(ji=0;ji<numneigh[j];ji++) {
-            if(x[jlist[ji]][0]==x[i][0]) {
-              if(x[jlist[ji]][1]==x[i][1]) {
-                if(x[jlist[ji]][2]==x[i][2]) {
-                  break;
-                }
-              }
-            }
-          }
-
-// j and k are different neighbors of i
-
-          for(ktmp=0;ktmp<numneigh[i];ktmp++) {
-            if(ktmp!=jtmp) {
-              temp_ik=BOP_index[i]+ktmp;
-              if(neigh_flag[temp_ik]) {
-                k=iilist[ktmp];
-                if(jtmp<ktmp) {
-                  njik=jtmp*(2*numneigh[i]-jtmp-1)/2+(ktmp-jtmp)-1;
-                  ngj=0;
-                  ngk=1;
-                }
-                else {
-                  njik=ktmp*(2*numneigh[i]-ktmp-1)/2+(jtmp-ktmp)-1;
-                  ngj=1;
-                  ngk=0;
-                }
-                ang_jik=cos_index[i]+njik;
-                if(ang_jik>=cos_total) {
-                  error->one(FLERR,"Too many atom triplets for pair bop");
-                }
-                nb_ik=nb_t;
-                nb_t++;
-                if(nb_t>nb_pi) {
-                  new_n_tot=nb_pi+maxneigh;
-                  grow_pi(nb_pi,new_n_tot);
-                  nb_pi=new_n_tot;
-                }
-                bt_pi[nb_ik].i=i;
-                bt_pi[nb_ik].j=k;
-                bt_pi[nb_ik].temp=temp_ik;
-                cosSq=cosAng[ang_jik]*cosAng[ang_jik];
-                sinFactor=.5*(1.0-cosSq)*pi_p[itype-1]*betaS[temp_ik];
-                cosFactor=.5*(1.0+cosSq)*betaP[temp_ik];
-                betaCapSq1=pi_p[itype-1]*betaS[temp_ik]*betaS[temp_ik]-betaP[temp_ik]
-                    *betaP[temp_ik];
-                dbetaCapSq1=2.0*pi_p[itype-1]*betaS[temp_ik]*dBetaS[temp_ik]
-                    -2.0*betaP[temp_ik]*dBetaP[temp_ik];
-
-//AA is Eq. 37 (a) and Eq. 19 (b) or i atoms
-//1st BB is first term of Eq. 38 (a) where j and k =neighbors i
-
-                AA=AA+sinFactor*betaS[temp_ik]+cosFactor*betaP[temp_ik];
-                BB=BB+.25*(1.0-cosSq)*(1.0-cosSq)*betaCapSq1*betaCapSq1;
-
-//agpdpr1 is derivative of AA w.r.t. for atom i w.r.t. Beta(r_ik)
-//agpdpr2 is derivative of BB w.r.t. for atom i w.r.t. Beta(r_ik)
-//app1 is derivative of AA w.r.t. for atom i w.r.t. cos(theta_jik)
-//app2 is derivative of BB w.r.t. for atom i w.r.t. cos(theta_jik)
-
-                agpdpr1=(2.0*sinFactor*dBetaS[temp_ik]+2.0*cosFactor
-                    *dBetaP[temp_ik])/rij[temp_ik];
-                app1=cosAng[ang_jik]*(-pi_p[itype-1]*betaS[temp_ik]*betaS[temp_ik]
-                    +betaP[temp_ik]*betaP[temp_ik]);
-                app2=-(1.0-cosSq)*cosAng[ang_jik]*betaCapSq1*betaCapSq1;
-                agpdpr2=.5*(1.0-cosSq)*(1.0-cosSq)*betaCapSq1*dbetaCapSq1/rij[temp_ik];
-                itypePiBk[n][nPiBk[n]]=k;
-                bt_pi[nb_ij].dAA[0]+=
-                    app1*dcAng[ang_jik][0][ngj];
-                bt_pi[nb_ij].dAA[1]+=
-                    app1*dcAng[ang_jik][1][ngj];
-                bt_pi[nb_ij].dAA[2]+=
-                    app1*dcAng[ang_jik][2][ngj];
-                bt_pi[nb_ij].dBB[0]+=
-                    app2*dcAng[ang_jik][0][ngj];
-                bt_pi[nb_ij].dBB[1]+=
-                    app2*dcAng[ang_jik][1][ngj];
-                bt_pi[nb_ij].dBB[2]+=
-                    app2*dcAng[ang_jik][2][ngj];
-                bt_pi[nb_ik].dAA[0]+=
-                    agpdpr1*disij[0][temp_ik]
-                    +app1*dcAng[ang_jik][0][ngk];
-                bt_pi[nb_ik].dAA[1]+=
-                    agpdpr1*disij[1][temp_ik]
-                    +app1*dcAng[ang_jik][1][ngk];
-                bt_pi[nb_ik].dAA[2]+=
-                    agpdpr1*disij[2][temp_ik]
-                    +app1*dcAng[ang_jik][2][ngk];
-                bt_pi[nb_ik].dBB[0]+=
-                    app2*dcAng[ang_jik][0][ngk]
-                    +agpdpr2*disij[0][temp_ik];
-                bt_pi[nb_ik].dBB[1]+=
-                    app2*dcAng[ang_jik][1][ngk]
-                    +agpdpr2*disij[1][temp_ik];
-                bt_pi[nb_ik].dBB[2]+=
-                    app2*dcAng[ang_jik][2][ngk]
-                    +agpdpr2*disij[2][temp_ik];
-
-// j and k and k' are different neighbors of i
-
-                for(ltmp=0;ltmp<ktmp;ltmp++) {
-                  if(ltmp!=jtmp) {
-                    temp_ikp=BOP_index[i]+ltmp;
-                    if(neigh_flag[temp_ikp]) {
-                      kp=iilist[ltmp];
-                      for(nsearch=0;nsearch<nPiBk[n];nsearch++) {
-                        ncmp=itypePiBk[n][nsearch];
-                        if(x[ncmp][0]==x[kp][0]) {
-                          if(x[ncmp][1]==x[kp][1]) {
-                            if(x[ncmp][2]==x[kp][2]) {
-                              break;
-                            }
-                          }
-                        }
+                      dBetaS_kkp=(pBetaS6[ikkp][ks-1]*ps+pBetaS5[ikkp][ks-1])*ps
+                          +pBetaS4[ikkp][ks-1];
+                      betaP_kkp=((pBetaP3[ikkp][ks-1]*ps+pBetaP2[ikkp][ks-1])*ps
+                          +pBetaP1[ikkp][ks-1])*ps+pBetaP[ikkp][ks-1];
+                      dBetaP_kkp=(pBetaP6[ikkp][ks-1]*ps+pBetaP5[ikkp][ks-1])*ps
+                          +pBetaP4[ikkp][ks-1];
+                      cosAng_ijkp=(-dis_ij[0]*dis_jkp[0]-dis_ij[1]*dis_jkp[1]
+                          -dis_ij[2]*dis_jkp[2])/(r_ij*r_jkp);
+                      dcA_ijkp[0][0]=(dis_jkp[0]*r_ij*r_jkp-cosAng_ijkp
+                          *-dis_ij[0]*r_jkp*r_jkp)/(r_ij*r_ij*r_jkp*r_jkp);
+                      dcA_ijkp[1][0]=(dis_jkp[1]*r_ij*r_jkp-cosAng_ijkp
+                          *-dis_ij[1]*r_jkp*r_jkp)/(r_ij*r_ij*r_jkp*r_jkp);
+                      dcA_ijkp[2][0]=(dis_jkp[2]*r_ij*r_jkp-cosAng_ijkp
+                          *-dis_ij[2]*r_jkp*r_jkp)/(r_ij*r_ij*r_jkp*r_jkp);
+                      dcA_ijkp[0][1]=(-dis_ij[0]*r_ij*r_jkp-cosAng_ijkp
+                          *dis_jkp[0]*r_ij*r_ij)/(r_ij*r_ij*r_jkp*r_jkp);
+                      dcA_ijkp[1][1]=(-dis_ij[1]*r_ij*r_jkp-cosAng_ijkp
+                          *dis_jkp[1]*r_ij*r_ij)/(r_ij*r_ij*r_jkp*r_jkp);
+                      dcA_ijkp[2][1]=(-dis_ij[2]*r_ij*r_jkp-cosAng_ijkp
+                          *dis_jkp[2]*r_ij*r_ij)/(r_ij*r_ij*r_jkp*r_jkp);
+                      cosAng_ikkp=(-dis_ik[0]*dis_kkp[0]-dis_ik[1]*dis_kkp[1]
+                          -dis_ik[2]*dis_kkp[2])/(r_ik*r_kkp);
+                      dcA_ikkp[0][0]=(dis_kkp[0]*r_ik*r_kkp-cosAng_ikkp
+                          *-dis_ik[0]*r_kkp*r_kkp)/(r_ik*r_ik*r_kkp*r_kkp);
+                      dcA_ikkp[1][0]=(dis_kkp[1]*r_ik*r_kkp-cosAng_ikkp
+                          *-dis_ik[1]*r_kkp*r_kkp)/(r_ik*r_ik*r_kkp*r_kkp);
+                      dcA_ikkp[2][0]=(dis_kkp[2]*r_ik*r_kkp-cosAng_ikkp
+                          *-dis_ik[2]*r_kkp*r_kkp)/(r_ik*r_ik*r_kkp*r_kkp);
+                      dcA_ikkp[0][1]=(-dis_ik[0]*r_ik*r_kkp-cosAng_ikkp
+                          *dis_kkp[0]*r_ik*r_ik)/(r_ik*r_ik*r_kkp*r_kkp);
+                      dcA_ikkp[1][1]=(-dis_ik[1]*r_ik*r_kkp-cosAng_ikkp
+                          *dis_kkp[1]*r_ik*r_ik)/(r_ik*r_ik*r_kkp*r_kkp);
+                      dcA_ikkp[2][1]=(-dis_ik[2]*r_ik*r_kkp-cosAng_ikkp
+                          *dis_kkp[2]*r_ik*r_ik)/(r_ik*r_ik*r_kkp*r_kkp);
+                      cosAng_jkpk=(dis_jkp[0]*dis_kkp[0]+dis_jkp[1]*dis_kkp[1]
+                          +dis_jkp[2]*dis_kkp[2])/(r_jkp*r_kkp);
+                      dcA_jkpk[0][0]=(-dis_kkp[0]*r_jkp*r_kkp-cosAng_jkpk
+                          *-dis_jkp[0]*r_kkp*r_kkp)/(r_jkp*r_jkp*r_kkp*r_kkp);
+                      dcA_jkpk[1][0]=(-dis_kkp[1]*r_jkp*r_kkp-cosAng_jkpk
+                          *-dis_jkp[1]*r_kkp*r_kkp)/(r_jkp*r_jkp*r_kkp*r_kkp);
+                      dcA_jkpk[2][0]=(-dis_kkp[2]*r_jkp*r_kkp-cosAng_jkpk
+                          *-dis_jkp[2]*r_kkp*r_kkp)/(r_jkp*r_jkp*r_kkp*r_kkp);
+                      dcA_jkpk[0][1]=(-dis_jkp[0]*r_jkp*r_kkp-cosAng_jkpk
+                          *-dis_kkp[0]*r_jkp*r_jkp)/(r_jkp*r_jkp*r_kkp*r_kkp);
+                      dcA_jkpk[1][1]=(-dis_jkp[1]*r_jkp*r_kkp-cosAng_jkpk
+                          *-dis_kkp[1]*r_jkp*r_jkp)/(r_jkp*r_jkp*r_kkp*r_kkp);
+                      dcA_jkpk[2][1]=(-dis_jkp[2]*r_jkp*r_kkp-cosAng_jkpk
+                          *-dis_kkp[2]*r_jkp*r_jkp)/(r_jkp*r_jkp*r_kkp*r_kkp);
+                    } else {
+                      dis_jkp[0]=disij[0][temp_jkp];
+                      dis_jkp[1]=disij[1][temp_jkp];
+                      dis_jkp[2]=disij[2][temp_jkp];
+                      r_jkp=rij[temp_jkp];
+                      betaS_jkp=betaS[temp_jkp];
+                      dBetaS_jkp=dBetaS[temp_jkp];
+                      betaP_jkp=betaP[temp_jkp];
+                      dBetaP_jkp=dBetaP[temp_jkp];
+                      dis_kkp[0]=disij[0][temp_kkp];
+                      dis_kkp[1]=disij[1][temp_kkp];
+                      dis_kkp[2]=disij[2][temp_kkp];
+                      r_kkp=rij[temp_kkp];
+                      betaS_kkp=betaS[temp_kkp];
+                      dBetaS_kkp=dBetaS[temp_kkp];
+                      betaP_kkp=betaP[temp_kkp];
+                      dBetaP_kkp=dBetaP[temp_kkp];
+                      if(ji<ltmp) {
+                        nijkp=(ji)*nlistj-(ji+1)*(ji+2)/2+ltmp;
+                        ngji=0;
+                        ngjkp=1;
                       }
-                      nkikp=ltmp*(2*numneigh[i]-ltmp-1)/2+(ktmp-ltmp)-1;
-                      if(jtmp<ltmp) {
-                        njikp=jtmp*(2*numneigh[i]-jtmp-1)/2+(ltmp-jtmp)-1;
-                        nglj=0;
-                        ngl=1;
+                      else {
+                        nijkp=(ltmp)*nlistj-(ltmp+1)*(ltmp+2)/2+ji;
+                        ngji=1;
+                        ngjkp=0;
+                      }
+                      if(kNeii<kNeikp) {
+                        nikkp=(kNeii)*nlistk-(kNeii+1)*(kNeii+2)/2+kNeikp;
+                        ngki=0;
+                        ngkkp=1;
                       }
                       else {
-                        njikp=ltmp*(2*numneigh[i]-ltmp-1)/2+(jtmp-ltmp)-1;
-                        nglj=1;
-                        ngl=0;
+                        nikkp=(kNeikp)*nlistk-(kNeikp+1)*(kNeikp+2)/2+kNeii;
+                        ngki=1;
+                        ngkkp=0;
                       }
-                      ang_jikp=cos_index[i]+njikp;
-                      if(ang_jikp>=cos_total) {
-                        error->one(FLERR,"Too many atom triplets for pair bop");
+                      if(kpNeij<kpNeik) {
+                        njkpk=(kpNeij)*nlistkp-(kpNeij+1)*(kpNeij+2)/2+kpNeik;
+                        ngkpj=0;
+                        ngkpk=1;
                       }
-                      nb_ikp=nb_t;
-                      nb_t++;
-                      if(nb_t>nb_pi) {
-                        new_n_tot=nb_pi+maxneigh;
-                        grow_pi(nb_pi,new_n_tot);
-                        nb_pi=new_n_tot;
+                      else {
+                        njkpk=(kpNeik)*nlistkp-(kpNeik+1)*(kpNeik+2)/2+kpNeij;
+                        ngkpj=1;
+                        ngkpk=0;
                       }
-                      bt_pi[nb_ikp].i=i;
-                      bt_pi[nb_ikp].j=kp;
-                      bt_pi[nb_ikp].temp=temp_ikp;
-                      ang_kikp=cos_index[i]+nkikp;
-                      if(ang_kikp>=cos_total) {
-                        error->one(FLERR,"Too many atom triplets for pair bop");
+                      ang_ijkp=cos_index[j]+nijkp;
+                      ang_ikkp=cos_index[k]+nikkp;
+                      ang_jkpk=cos_index[kp]+njkpk;
+                      cosAng_ijkp=cosAng[ang_ijkp];
+                      dcA_ijkp[0][0]=dcAng[ang_ijkp][0][ngji];
+                      dcA_ijkp[1][0]=dcAng[ang_ijkp][1][ngji];
+                      dcA_ijkp[2][0]=dcAng[ang_ijkp][2][ngji];
+                      dcA_ijkp[0][1]=dcAng[ang_ijkp][0][ngjkp];
+                      dcA_ijkp[1][1]=dcAng[ang_ijkp][1][ngjkp];
+                      dcA_ijkp[2][1]=dcAng[ang_ijkp][2][ngjkp];
+                      cosAng_ikkp=cosAng[ang_ikkp];
+                      dcA_ikkp[0][0]=dcAng[ang_ikkp][0][ngki];
+                      dcA_ikkp[1][0]=dcAng[ang_ikkp][1][ngki];
+                      dcA_ikkp[2][0]=dcAng[ang_ikkp][2][ngki];
+                      dcA_ikkp[0][1]=dcAng[ang_ikkp][0][ngkkp];
+                      dcA_ikkp[1][1]=dcAng[ang_ikkp][1][ngkkp];
+                      dcA_ikkp[2][1]=dcAng[ang_ikkp][2][ngkkp];
+                      cosAng_jkpk=cosAng[ang_jkpk];
+                      dcA_jkpk[0][0]=dcAng[ang_jkpk][0][ngkpj];
+                      dcA_jkpk[1][0]=dcAng[ang_jkpk][1][ngkpj];
+                      dcA_jkpk[2][0]=dcAng[ang_jkpk][2][ngkpj];
+                      dcA_jkpk[0][1]=dcAng[ang_jkpk][0][ngkpk];
+                      dcA_jkpk[1][1]=dcAng[ang_jkpk][1][ngkpk];
+                      dcA_jkpk[2][1]=dcAng[ang_jkpk][2][ngkpk];
+                    }
+                    sig_flag=0;
+                    for(nsearch=0;nsearch<nSigBk;nsearch++) {
+                      ncmp=itypeSigBk[nsearch];
+                      if(x[ncmp][0]==x[kp][0]) {
+                        if(x[ncmp][1]==x[kp][1]) {
+                          if(x[ncmp][2]==x[kp][2]) {
+                            nkp=nsearch;
+                            sig_flag=1;
+                            break;
+                          }
+                        }
                       }
-                      betaCapSq2=pi_p[itype-1]*betaS[temp_ikp]*betaS[temp_ikp]
-                          -betaP[temp_ikp]*betaP[temp_ikp];
-                      dbetaCapSq2=2.0*pi_p[itype-1]*betaS[temp_ikp]*dBetaS[temp_ikp]
-                          -2.0*betaP[temp_ikp]*dBetaP[temp_ikp];
-                      cosSq1=cosAng[ang_jikp]*cosAng[ang_jikp];
-                      angFactor=cosAng[ang_kikp]-cosAng[ang_jikp]*cosAng[ang_jik];
-                      angFactor1=4.0*angFactor;
-                      angFactor2=-angFactor1*cosAng[ang_jikp]
-                          +2.0*cosAng[ang_jik]*(1.0-cosSq1);
-                      angFactor3=-angFactor1*cosAng[ang_jik]
-                          +2.0*cosAng[ang_jikp]*(1.0-cosSq);
-                      angFactor4=2.0*angFactor*angFactor-(1.0-cosSq)*(1.0-cosSq1);
-                      betaCapSum=.5*betaCapSq1*betaCapSq2;
-
-//2nd BB is third term of Eq. 38 (a) where j , k and k'=neighbors i
-
-                      BB=BB+betaCapSum*angFactor4;
+                    }
+                    if(sig_flag==0) {
+                      nSigBk=nSigBk+1;
+                      nkp=nSigBk-1;
+                      itypeSigBk[nkp]=kp;
+                    }
+                    temp_kpk=BOP_index[kp]+kpNeik;
+                    nb_jkp=nb_t;
+                    nb_t++;
+                    if(nb_t>nb_sg) {
+                      new_n_tot=nb_sg+maxneigh;
+                      grow_sigma(nb_sg,new_n_tot);
+                      nb_sg=new_n_tot;
+                    }
+                    bt_sg[nb_jkp].temp=temp_jkp;
+                    bt_sg[nb_jkp].i=j;
+                    bt_sg[nb_jkp].j=kp;
+                    nb_kkp=nb_t;
+                    nb_t++;
+                    if(nb_t>nb_sg) {
+                      new_n_tot=nb_sg+maxneigh;
+                      grow_sigma(nb_sg,new_n_tot);
+                      nb_sg=new_n_tot;
+                    }
+                    bt_sg[nb_kkp].temp=temp_kkp;
+                    bt_sg[nb_kkp].i=k;
+                    bt_sg[nb_kkp].j=kp;
+                    amean=cosAng_ijkp;
+                    if(amean<-1.0) amean=-1.0;
+                    if(npower<=2) {
+                      ps=(amean-1.0)*rdtheta+1.0;
+                      ks=(int)ps;
+                      if(ntheta-1<ks)
+                        ks=ntheta-1;
+                      ps=ps-ks;
+                      if(ps>1.0)
+                      ps=1.0;
+                      ks=ks-1;
+                      gfactor2=((gfunc3[itype][jtype][kptype][ks]*ps+
+                          gfunc2[itype][jtype][kptype][ks])*ps+
+                          gfunc1[itype][jtype][kptype][ks])*ps+
+                          gfunc[itype][jtype][kptype][ks];
+                      gprime2=(gfunc6[itype][jtype][kptype][ks]*ps+
+                          gfunc5[itype][jtype][kptype][ks])*ps+
+                          gfunc4[itype][jtype][kptype][ks];
+                    } else {
+                      gfactor2=gpara[itype-1][jtype-1][kptype-1][0];
+                      gprime2=0.0;
+                      xrun=1.0;
+                      for(lp1=1;lp1<npower+1;lp1++) {
+                        gprime2=gprime2+(lp1)*xrun*gpara[itype-1][jtype-1][kptype-1][lp1];
+                        xrun=xrun*amean;
+                        gfactor2=gfactor2+xrun*gpara[itype-1][jtype-1][kptype-1][lp1];
+                      }
+                    }
+                    amean=cosAng_ikkp;
+                    if(amean<-1.0) amean=-1.0;
+                    if(npower<=2) {
+                      ps=(amean-1.0)*rdtheta+1.0;
+                      ks=(int)ps;
+                      if(ntheta-1<ks)
+                        ks=ntheta-1;
+                      ps=ps-ks;
+                      if(ps>1.0)
+                        ps=1.0;
+                      ks=ks-1;
+                      gfactor3=((gfunc3[itype][ktype][kptype][ks]*ps+
+                          gfunc2[itype][ktype][kptype][ks])*ps+
+                          gfunc1[itype][ktype][kptype][ks])*ps+
+                          gfunc[itype][ktype][kptype][ks];
+                      gprime3=(gfunc6[itype][ktype][kptype][ks]*ps+
+                          gfunc5[itype][ktype][kptype][ks])*ps+
+                          gfunc4[itype][ktype][kptype][ks];
+                    } else {
+                      gfactor3=gpara[itype-1][ktype-1][kptype-1][0];
+                      gprime3=0.0;
+                      xrun=1.0;
+                      for(lp1=1;lp1<npower+1;lp1++) {
+                        gprime3=gprime3+(lp1)*xrun*gpara[itype-1][ktype-1][kptype-1][lp1];
+                        xrun=xrun*amean;
+                        gfactor3=gfactor3+xrun*gpara[itype-1][ktype-1][kptype-1][lp1];
+                      }
+                    }
+                    amean=cosAng_jkpk;
+                    if(amean<-1.0) amean=-1.0;
+                    if(npower<=2) {
+                      ps=(amean-1.0)*rdtheta+1.0;
+                      ks=(int)ps;
+                      if(ntheta-1<ks)
+                        ks=ntheta-1;
+                      ps=ps-ks;
+                      if(ps>1.0)
+                        ps=1.0;
+                      ks=ks-1;
+                      gfactor4=((gfunc3[jtype][kptype][ktype][ks]*ps+
+                          gfunc2[jtype][kptype][ktype][ks])*ps+
+                          gfunc1[jtype][kptype][ktype][ks])*ps+
+                          gfunc[jtype][kptype][ktype][ks];
+                      gprime4=(gfunc6[jtype][kptype][ktype][ks]*ps+
+                          gfunc5[jtype][kptype][ktype][ks])*ps+
+                          gfunc4[jtype][kptype][ktype][ks];
+                    } else {
+                      gfactor4=gpara[jtype-1][kptype-1][ktype-1][0];
+                      gprime4=0.0;
+                      xrun=1.0;
+                      for(lp1=1;lp1<npower+1;lp1++) {
+                        gprime4=gprime4+(lp1)*xrun*gpara[jtype-1][kptype-1][ktype-1][lp1];
+                        xrun=xrun*amean;
+                        gfactor4=gfactor4+xrun*gpara[jtype-1][kptype-1][ktype-1][lp1];
+                      }
+                    }
+                    gfactor=gfactor1*gfactor2*gfactor3*gfactor4;
+                    rfactor0=(betaS_ik+small2)*(betaS_jkp+small2)
+                        *(betaS_kkp+small2);
+                    rfactor=pow(rfactor0,2.0/3.0);
+                    drfactor=2.0/3.0*pow(rfactor0,-1.0/3.0);
+ 
+//EE is Eq. 25(notes)
 
-//agpdpr1 is derivative of BB w.r.t. for atom i w.r.t. Beta(r_ik)
-//agpdpr2 is derivative of BB w.r.t. for atom i w.r.t. Beta(r_ik')
-//app1 is derivative of BB 3rd term w.r.t. cos(theta_kik')
-//app2 is derivative of BB 3rd term w.r.t. cos(theta_jik)
-//app3 is derivative of BB 3rd term w.r.t. cos(theta_jik')
+                    EE=EE+gfactor*rfactor;
 
-                      app1=betaCapSum*angFactor1;
-                      app2=betaCapSum*angFactor2;
-                      app3=betaCapSum*angFactor3;
-                      agpdpr1=.5*angFactor4*dbetaCapSq1*betaCapSq2/rij[temp_ik];
-                      agpdpr2=.5*angFactor4*betaCapSq1*dbetaCapSq2/rij[temp_ikp];
+//agpdpr1 is derivative of agpdpr1 w.r.t. Beta(r_ik)
+//agpdpr2 is derivative of agpdpr1 w.r.t. Beta(r_jk')
+//agpdpr3 is derivative of agpdpr1 w.r.t. Beta(r_kk')
+//app1 is derivative of agpdpr1 w.r.t. cos(theta_jik)
+//app2 is derivative of agpdpr1 w.r.t. cos(theta_ijk')
+//app3 is derivative of agpdpr1 w.r.t. cos(theta_ikk')
+//app4 is derivative of agpdpr1 w.r.t. cos(theta_jk'k)
 
-                      bt_pi[nb_ij].dBB[0]+=
-                          app2*dcAng[ang_jik][0][ngj]
-                          +app3*dcAng[ang_jikp][0][nglj];
-                      bt_pi[nb_ij].dBB[1]+=
-                          app2*dcAng[ang_jik][1][ngj]
-                          +app3*dcAng[ang_jikp][1][nglj];
-                      bt_pi[nb_ij].dBB[2]+=
-                          app2*dcAng[ang_jik][2][ngj]
-                          +app3*dcAng[ang_jikp][2][nglj];
-                      bt_pi[nb_ik].dBB[0]+=
-                          agpdpr1*disij[0][temp_ik]
-                          +app1*dcAng[ang_kikp][0][1]
-                          +app2*dcAng[ang_jik][0][ngk];
-                      bt_pi[nb_ik].dBB[1]+=
-                          agpdpr1*disij[1][temp_ik]
-                          +app1*dcAng[ang_kikp][1][1]
-                          +app2*dcAng[ang_jik][1][ngk];
-                      bt_pi[nb_ik].dBB[2]+=
-                          agpdpr1*disij[2][temp_ik]
-                          +app1*dcAng[ang_kikp][2][1]
-                          +app2*dcAng[ang_jik][2][ngk];
-                      bt_pi[nb_ikp].dBB[0]+=
-                          agpdpr2*disij[0][temp_ikp]
-                          +app1*dcAng[ang_kikp][0][0]
-                          +app3*dcAng[ang_jikp][0][ngl];
-                      bt_pi[nb_ikp].dBB[1]+=
-                          agpdpr2*disij[1][temp_ikp]
-                          +app1*dcAng[ang_kikp][1][0]
-                          +app3*dcAng[ang_jikp][1][ngl];
-                      bt_pi[nb_ikp].dBB[2]+=
-                          agpdpr2*disij[2][temp_ikp]
-                          +app1*dcAng[ang_kikp][2][0]
-                          +app3*dcAng[ang_jikp][2][ngl];
-                    }
+                    agpdpr1=gfactor*drfactor*(betaS_jkp+small2)*(betaS_kkp
+                        +small2)*dBetaS_ik/r_ik;
+                    agpdpr2=gfactor*drfactor*(betaS_ik+small2)*(betaS_kkp
+                        +small2)*dBetaS_jkp/r_jkp;
+                    agpdpr3=gfactor*drfactor*(betaS_ik+small2)*(betaS_jkp
+                        +small2)*dBetaS_kkp/r_kkp;
+                    app1=rfactor*gfactor2*gfactor3*gfactor4*gprime1;
+                    app2=rfactor*gfactor1*gfactor3*gfactor4*gprime2;
+                    app3=rfactor*gfactor1*gfactor2*gfactor4*gprime3;
+                    app4=rfactor*gfactor1*gfactor2*gfactor3*gprime4;
+                    bt_sg[nb_ij].dEE[0]+=
+                        app1*dcA_jik[0][0]
+                        -app2*dcA_ijkp[0][0];
+                    bt_sg[nb_ij].dEE[1]+=
+                        app1*dcA_jik[1][0]
+                        -app2*dcA_ijkp[1][0];
+                    bt_sg[nb_ij].dEE[2]+=
+                        app1*dcA_jik[2][0]
+                        -app2*dcA_ijkp[2][0];
+                    bt_sg[nb_ik].dEE[0]+=
+                        app1*dcA_jik[0][1]
+                        +agpdpr1*dis_ik[0]
+                        -app3*dcA_ikkp[0][0];
+                    bt_sg[nb_ik].dEE[1]+=
+                        app1*dcA_jik[1][1]
+                        +agpdpr1*dis_ik[1]
+                        -app3*dcA_ikkp[1][0];
+                    bt_sg[nb_ik].dEE[2]+=
+                        app1*dcA_jik[2][1]
+                        +agpdpr1*dis_ik[2]
+                        -app3*dcA_ikkp[2][0];
+                    bt_sg[nb_jkp].dEE[0]+=
+                        app2*dcA_ijkp[0][1]
+                        +agpdpr2*dis_jkp[0]
+                        -app4*dcA_jkpk[0][0];
+                    bt_sg[nb_jkp].dEE[1]+=
+                        app2*dcA_ijkp[1][1]
+                        +agpdpr2*dis_jkp[1]
+                        -app4*dcA_jkpk[1][0];
+                    bt_sg[nb_jkp].dEE[2]+=
+                        app2*dcA_ijkp[2][1]
+                        +agpdpr2*dis_jkp[2]
+                        -app4*dcA_jkpk[2][0];
+                    bt_sg[nb_kkp].dEE[0]+=
+                        app3*dcA_ikkp[0][1]
+                        +agpdpr3*dis_kkp[0]
+                        -app4*dcA_jkpk[0][1];
+                    bt_sg[nb_kkp].dEE[1]+=
+                        app3*dcA_ikkp[1][1]
+                        +agpdpr3*dis_kkp[1]
+                        -app4*dcA_jkpk[1][1];
+                    bt_sg[nb_kkp].dEE[2]+=
+                        app3*dcA_ikkp[2][1]
+                        +agpdpr3*dis_kkp[2]
+                        -app4*dcA_jkpk[2][1];
                   }
                 }
-                nPiBk[n]=nPiBk[n]+1;
               }
             }
           }
-
-//j is a neighbor of i and k is a neighbor of j and equal to i
-
-          for(ki=0;ki<numneigh[j];ki++) {
-            k=jlist[ki];
-            if(x[k][0]==x[i][0]) {
-              if(x[k][1]==x[i][1]) {
-                if(x[k][2]==x[i][2]) {
+        }
+      }
+//j is a neighbor of i and k is a neighbor of j not equal to i
+      for(ktmp=0;ktmp<nlistj;ktmp++) {
+        if(ktmp!=ji) {
+          temp_jk=BOP_index[j]+ktmp;
+          ni_jk=neigh_index[temp_jk];
+          k=jlist[ni_jk];
+          
+          klist=firstneigh[k];
+          ktype=map[type[k]]+1;
+          nlistk=BOP_total[k];
+          for(kNeij=0;kNeij<nlistk;kNeij++) {
+            if(x[klist[kNeij]][0]==x[j][0]) {
+              if(x[klist[kNeij]][1]==x[j][1]) {
+                if(x[klist[kNeij]][2]==x[j][2]) {
                   break;
                 }
               }
             }
           }
-
-//j is a neighbor of i and k is a neighbor of j not equal to i
-
-          for(ktmp=0;ktmp<numneigh[j];ktmp++) {
-            if(ktmp!=ki) {
-              temp_jk=BOP_index[j]+ktmp;
-              if(neigh_flag[temp_jk]) {
-                k=jlist[ktmp];
-                pi_flag=0;
-                for(nsearch=0;nsearch<nPiBk[n];nsearch++) {
-                  ncmp=itypePiBk[n][nsearch];
-                  if(x[ncmp][0]==x[k][0]) {
-                    if(x[ncmp][1]==x[k][1]) {
-                      if(x[ncmp][2]==x[k][2]) {
-                        pi_flag=1;
-                        break;
-                      }
-                    }
-                  }
-                }
-                if(pi_flag==0) {
-                  itypePiBk[n][nPiBk[n]]=k;
-                }
-                if(ktmp<ki) {
-                  njik=ktmp*(2*numneigh[j]-ktmp-1)/2+(ki-ktmp)-1;
-                  ngi=1;
-                  ngk=0;
-                }
-                else {
-                  njik=ki*(2*numneigh[j]-ki-1)/2+(ktmp-ki)-1;
-                  ngi=0;
-                  ngk=1;
-                }
-                ang_ijk=cos_index[j]+njik;
-                if(ang_ijk>=cos_total) {
-                  error->one(FLERR,"Too many atom triplets for pair bop");
-                }
-                nb_jk=nb_t;
-                nb_t++;
-                if(nb_t>nb_pi) {
-                  new_n_tot=nb_pi+maxneigh;
-                  grow_pi(nb_pi,new_n_tot);
-                  nb_pi=new_n_tot;
+          if(jtype==ktype)
+            ijk=jtype-1;
+          else if(jtype<ktype)
+            ijk=jtype*bop_types-jtype*(jtype+1)/2+ktype-1;
+          else
+            ijk=ktype*bop_types-ktype*(ktype+1)/2+jtype-1;
+          sig_flag=0;
+          for(nsearch=0;nsearch<nSigBk;nsearch++) {
+            ncmp=itypeSigBk[nsearch];
+            if(x[ncmp][0]==x[k][0]) {
+              if(x[ncmp][1]==x[k][1]) {
+                if(x[ncmp][2]==x[k][2]) {
+                  new1=nsearch;
+                  sig_flag=1;
+                  break;
                 }
-                bt_pi[nb_jk].i=j;
-                bt_pi[nb_jk].j=k;
-                bt_pi[nb_jk].temp=temp_jk;
-                cosSq=cosAng[ang_ijk]*cosAng[ang_ijk];
-                sinFactor=.5*(1.0-cosSq)*pi_p[jtype-1]*betaS[temp_jk];
-                cosFactor=.5*(1.0+cosSq)*betaP[temp_jk];
-                betaCapSq1=pi_p[jtype-1]*betaS[temp_jk]*betaS[temp_jk]
-                    -betaP[temp_jk]*betaP[temp_jk];
-                dbetaCapSq1=2.0*pi_p[jtype-1]*betaS[temp_jk]*dBetaS[temp_jk]
-                    -2.0*betaP[temp_jk]*dBetaP[temp_jk];
+              }
+            }
+          }
+          if(sig_flag==0) {
+            nSigBk=nSigBk+1;
+            new1=nSigBk-1;
+            itypeSigBk[new1]=k;
+          }
+          pass_jk=0;
+          if(otfly==1) {
+            dis_jk[0]=x[k][0]-x[j][0];
+            dis_jk[1]=x[k][1]-x[j][1];
+            dis_jk[2]=x[k][2]-x[j][2];
+            rsq_jk=dis_jk[0]*dis_jk[0]
+                +dis_jk[1]*dis_jk[1]
+                +dis_jk[2]*dis_jk[2];
+            r_jk=sqrt(rsq_jk);
+            if(r_jk<=rcut[ijk]) {
+              pass_jk=1;
+              ps=r_jk*rdr[ijk]+1.0;
+              ks=(int)ps;
+              if(nr-1<ks)
+                ks=nr-1;
+              ps=ps-ks;
+              if(ps>1.0)
+                ps=1.0;
+              betaS_jk=((pBetaS3[ijk][ks-1]*ps+pBetaS2[ijk][ks-1])*ps
+                  +pBetaS1[ijk][ks-1])*ps+pBetaS[ijk][ks-1];
+              dBetaS_jk=(pBetaS6[ijk][ks-1]*ps+pBetaS5[ijk][ks-1])*ps
+                  +pBetaS4[ijk][ks-1];
+              betaP_jk=((pBetaP3[ijk][ks-1]*ps+pBetaP2[ijk][ks-1])*ps
+                  +pBetaP1[ijk][ks-1])*ps+pBetaP[ijk][ks-1];
+              dBetaP_jk=(pBetaP6[ijk][ks-1]*ps+pBetaP5[ijk][ks-1])*ps
+                  +pBetaP4[ijk][ks-1];
+              cosAng_ijk=(-dis_ij[0]*dis_jk[0]-dis_ij[1]*dis_jk[1]
+                  -dis_ij[2]*dis_jk[2])/(r_ij*r_jk);
+              dcA_ijk[0][0]=(dis_jk[0]*r_ij*r_jk-cosAng_ijk
+                  *-dis_ij[0]*r_jk*r_jk)/(r_ij*r_ij*r_jk*r_jk);
+              dcA_ijk[1][0]=(dis_jk[1]*r_ij*r_jk-cosAng_ijk
+                  *-dis_ij[1]*r_jk*r_jk)/(r_ij*r_ij*r_jk*r_jk);
+              dcA_ijk[2][0]=(dis_jk[2]*r_ij*r_jk-cosAng_ijk
+                  *-dis_ij[2]*r_jk*r_jk)/(r_ij*r_ij*r_jk*r_jk);
+              dcA_ijk[0][1]=(-dis_ij[0]*r_ij*r_jk-cosAng_ijk
+                  *dis_jk[0]*r_ij*r_ij)/(r_ij*r_ij*r_jk*r_jk);
+              dcA_ijk[1][1]=(-dis_ij[1]*r_ij*r_jk-cosAng_ijk
+                  *dis_jk[1]*r_ij*r_ij)/(r_ij*r_ij*r_jk*r_jk);
+              dcA_ijk[2][1]=(-dis_ij[2]*r_ij*r_jk-cosAng_ijk
+                  *dis_jk[2]*r_ij*r_ij)/(r_ij*r_ij*r_jk*r_jk);
+            }
+          } else {
+            if(neigh_flag[temp_jk]) {
+              pass_jk=1;
+              dis_jk[0]=disij[0][temp_jk];
+              dis_jk[1]=disij[1][temp_jk];
+              dis_jk[2]=disij[2][temp_jk];
+              r_jk=rij[temp_jk];
+              betaS_jk=betaS[temp_jk];
+              dBetaS_jk=dBetaS[temp_jk];
+              betaP_jk=betaP[temp_jk];
+              dBetaP_jk=dBetaP[temp_jk];
+              if(ktmp<ji) {
+                nijk=ktmp*(2*nlistj-ktmp-1)/2+(ji-ktmp)-1;
+                ngi=1;
+                ngk=0;
+              }
+              else {
+                nijk=ji*(2*nlistj-ji-1)/2+(ktmp-ji)-1;
+                ngi=0;
+                ngk=1;
+              }
+              ang_ijk=cos_index[j]+nijk;
+              cosAng_ijk=cosAng[ang_ijk];
+              dcA_ijk[0][0]=dcAng[ang_ijk][0][ngi];
+              dcA_ijk[1][0]=dcAng[ang_ijk][1][ngi];
+              dcA_ijk[2][0]=dcAng[ang_ijk][2][ngi];
+              dcA_ijk[0][1]=dcAng[ang_ijk][0][ngk];
+              dcA_ijk[1][1]=dcAng[ang_ijk][1][ngk];
+              dcA_ijk[2][1]=dcAng[ang_ijk][2][ngk];
+            }
+          }
+          if(pass_jk==1) {      
+            nb_jk=nb_t;
+            nb_t++;
+            if(nb_t>nb_sg) {
+              new_n_tot=nb_sg+maxneigh;
+              grow_sigma(nb_sg,new_n_tot);
+              nb_sg=new_n_tot;
+            }
+            bt_sg[nb_jk].temp=temp_jk;
+            bt_sg[nb_jk].i=j;
+            bt_sg[nb_jk].j=k;
+            amean=cosAng_ijk;
+            if(amean<-1.0) amean=-1.0;
+            if(npower<=2) {
+              ps=(amean-1.0)*rdtheta+1.0;
+              ks=(int)ps;
+              if(ntheta-1<ks)
+              ks=ntheta-1;
+              ps=ps-ks;
+              if(ps>1.0)
+                ps=1.0;
+              ks=ks-1;
+              gfactor1=((gfunc3[itype][jtype][ktype][ks]*ps+
+                  gfunc2[itype][jtype][ktype][ks])*ps+
+                  gfunc1[itype][jtype][ktype][ks])*ps+
+                  gfunc[itype][jtype][ktype][ks];
+              gprime1=(gfunc6[itype][jtype][ktype][ks]*ps+
+                  gfunc5[itype][jtype][ktype][ks])*ps+
+                  gfunc4[itype][jtype][ktype][ks];
+            } else {
+              gfactor1=gpara[itype-1][jtype-1][ktype-1][0];
+              gprime1=0.0;
+              xrun=1.0;
+              for(lp1=1;lp1<npower+1;lp1++) {
+                gprime1=gprime1+(lp1)*xrun*gpara[itype-1][jtype-1][ktype-1][lp1];
+                xrun=xrun*amean;
+                gfactor1=gfactor1+xrun*gpara[itype-1][jtype-1][ktype-1][lp1];
+              }
+            }
+            gfactorsq=gfactor1*gfactor1;
+            gsqprime=2.0*gfactor1*gprime1;
+            rfactor1rt=betaS_jk*betaS_jk;
+            rfactor1=rfactor1rt*rfactor1rt;
 
-//AA is Eq. 37 (a) and Eq. 19 (b) for j atoms
-//3rd BB is 2nd term of Eq. 38 (a) where i and k =neighbors j
+//BB is Eq. 34 (a) or Eq. 10 (c) for the j atom
+//1st DD is Eq. 11 (c) for j atom where i & k=neighbor of j
 
-                AA=AA+sinFactor*betaS[temp_jk]+cosFactor*betaP[temp_jk];
-                BB=BB+.25*(1.0-cosSq)*(1.0-cosSq)*betaCapSq1*betaCapSq1;
+            BB=BB+gfactorsq*rfactor1rt;
 
-//agpdpr1 is derivative of AA for atom j w.r.t. Beta(r_jk)
-//agpdpr2 is derivative of BB for atom j w.r.t. Beta(r_jk)
-//app1 is derivative of AA for j atom w.r.t. cos(theta_ijk)
-//app2 is derivative of BB 2nd term w.r.t. cos(theta_ijk)
+//agpdpr1 is derivative of BB  w.r.t. Beta(r_jk)
+//app1 is derivative of BB w.r.t. cos(theta_ijk)
 
-                agpdpr1=(2.0*sinFactor*dBetaS[temp_jk]+2.0*cosFactor
-                    *dBetaP[temp_jk])/rij[temp_jk];
-                agpdpr2=.5*(1.0-cosSq)*(1.0-cosSq)*betaCapSq1*dbetaCapSq1/rij[temp_jk];
-                app1=cosAng[ang_ijk]*(-pi_p[jtype-1]*betaS[temp_jk]*betaS[temp_jk]
-                    +betaP[temp_jk]*betaP[temp_jk]);
-                app2=-(1.0-cosSq)*cosAng[ang_ijk]*betaCapSq1*betaCapSq1;
-                bt_pi[nb_ij].dAA[0]-=
-                    app1*dcAng[ang_ijk][0][ngi];
-                bt_pi[nb_ij].dAA[1]-=
-                    app1*dcAng[ang_ijk][1][ngi];
-                bt_pi[nb_ij].dAA[2]-=
-                    app1*dcAng[ang_ijk][2][ngi];
-                bt_pi[nb_ij].dBB[0]-=
-                    app2*dcAng[ang_ijk][0][ngi];
-                bt_pi[nb_ij].dBB[1]-=
-                    app2*dcAng[ang_ijk][1][ngi];
-                bt_pi[nb_ij].dBB[2]-=
-                    app2*dcAng[ang_ijk][2][ngi];
-                bt_pi[nb_jk].dAA[0]+=
-                    agpdpr1*disij[0][temp_jk]
-                    +app1*dcAng[ang_ijk][0][ngk];
-                bt_pi[nb_jk].dAA[1]+=
-                    agpdpr1*disij[1][temp_jk]
-                    +app1*dcAng[ang_ijk][1][ngk];
-                bt_pi[nb_jk].dAA[2]+=
-                    agpdpr1*disij[2][temp_jk]
-                    +app1*dcAng[ang_ijk][2][ngk];
-                bt_pi[nb_jk].dBB[0]+=
-                    app2*dcAng[ang_ijk][0][ngk]
-                    +agpdpr2*disij[0][temp_jk];
-                bt_pi[nb_jk].dBB[1]+=
-                    app2*dcAng[ang_ijk][1][ngk]
-                    +agpdpr2*disij[1][temp_jk];
-                bt_pi[nb_jk].dBB[2]+=
-                    app2*dcAng[ang_ijk][2][ngk]
-                    +agpdpr2*disij[2][temp_jk];
+            agpdpr1=2.0*gfactorsq*betaS_jk*dBetaS_jk/r_jk;
+            app1=rfactor1rt*gsqprime;
+            bt_sg[nb_ij].dBB[0]-=
+                app1*dcA_ijk[0][0];
+            bt_sg[nb_ij].dBB[1]-=
+                app1*dcA_ijk[1][0];
+            bt_sg[nb_ij].dBB[2]-=
+                app1*dcA_ijk[2][0];
+            bt_sg[nb_jk].dBB[0]+=
+                app1*dcA_ijk[0][1]
+                +agpdpr1*dis_jk[0];
+            bt_sg[nb_jk].dBB[1]+=
+                app1*dcA_ijk[1][1]
+                +agpdpr1*dis_jk[1];
+            bt_sg[nb_jk].dBB[2]+=
+                app1*dcA_ijk[2][1]
+                +agpdpr1*dis_jk[2];
+            if(sigma_a[iij]!=0) {
+              app2=rfactor1rt*app1;
+              agpdpr2=2.0*rfactor1rt*agpdpr1;
+              DD=DD+gfactorsq*rfactor1;
+              bt_sg[nb_ij].dDD[0]-=
+                  app2*dcA_ijk[0][0];
+              bt_sg[nb_ij].dDD[1]-=
+                  app2*dcA_ijk[1][0];
+              bt_sg[nb_ij].dDD[2]-=
+                  app2*dcA_ijk[2][0];
+              bt_sg[nb_jk].dDD[0]+=
+                  app2*dcA_ijk[0][1]
+                  +agpdpr2*dis_jk[0];
+              bt_sg[nb_jk].dDD[1]+=
+                  app2*dcA_ijk[1][1]
+                  +agpdpr2*dis_jk[1];
+              bt_sg[nb_jk].dDD[2]+=
+                  app2*dcA_ijk[2][1]
+                  +agpdpr2*dis_jk[2];
 
-//j is a neighbor of i and k and k' are different neighbors of j not equal to i
+//j is a neighbor of i, k and k' prime different neighbors of j not equal to i
 
-                for(ltmp=0;ltmp<ktmp;ltmp++) {
-                  if(ltmp!=ki) {
-                    temp_jkp=BOP_index[j]+ltmp;
-                    if(neigh_flag[temp_jkp]) {
-                      kp=jlist[ltmp];
-                      for(nsearch=0;nsearch<nPiBk[n];nsearch++) {
-                        ncmp=itypePiBk[n][nsearch];
-                        if(x[ncmp][0]==x[kp][0]) {
-                          if(x[ncmp][1]==x[kp][1]) {
-                            if(x[ncmp][2]==x[kp][2]) {
-                              break;
-                            }
-                          }
+              for(ltmp=0;ltmp<ktmp;ltmp++) {
+                if(ltmp!=ji) {
+                  temp_jkp=BOP_index[j]+ltmp;
+                  ni_jkp=neigh_index[temp_jkp];
+                  kp=jlist[ni_jkp];
+                  kptype=map[type[kp]]+1;
+                  if(jtype==kptype)
+                    ijkp=jtype-1;
+                  else if(jtype<kptype)
+                    ijkp=jtype*bop_types-jtype*(jtype+1)/2+kptype-1;
+                  else
+                    ijkp=kptype*bop_types-kptype*(kptype+1)/2+jtype-1;
+                  for(nsearch=0;nsearch<nSigBk;nsearch++) {
+                    ncmp=itypeSigBk[nsearch];
+                    if(x[ncmp][0]==x[kp][0]) {
+                      if(x[ncmp][1]==x[kp][1]) {
+                        if(x[ncmp][2]==x[kp][2]) {
+                          new2=nsearch;
+                          break;
                         }
                       }
-                      nkjkp=ltmp*(2*numneigh[j]-ltmp-1)/2+(ktmp-ltmp)-1;
-                      if(ki<ltmp) {
-                        nijkp=ki*(2*numneigh[j]-ki-1)/2+(ltmp-ki)-1;
+                    }
+                  }
+                  pass_jkp=0;
+                  if(otfly==1) {
+                    dis_jkp[0]=x[kp][0]-x[j][0];
+                    dis_jkp[1]=x[kp][1]-x[j][1];
+                    dis_jkp[2]=x[kp][2]-x[j][2];
+                    rsq_jkp=dis_jkp[0]*dis_jkp[0]
+                        +dis_jkp[1]*dis_jkp[1]
+                        +dis_jkp[2]*dis_jkp[2];
+                    r_jkp=sqrt(rsq_jkp);
+                    if(r_jkp<=rcut[ijkp]) {
+                      pass_jkp=1;
+                      ps=r_jkp*rdr[ijkp]+1.0;
+                      ks=(int)ps;
+                      if(nr-1<ks)
+                        ks=nr-1;
+                      ps=ps-ks;
+                      if(ps>1.0)
+                        ps=1.0;
+                      betaS_jkp=((pBetaS3[ijkp][ks-1]*ps+pBetaS2[ijkp][ks-1])*ps
+                          +pBetaS1[ijkp][ks-1])*ps+pBetaS[ijkp][ks-1];
+                      dBetaS_jkp=(pBetaS6[ijkp][ks-1]*ps+pBetaS5[ijkp][ks-1])*ps
+                          +pBetaS4[ijkp][ks-1];
+                      betaP_jkp=((pBetaP3[ijkp][ks-1]*ps+pBetaP2[ijkp][ks-1])*ps
+                          +pBetaP1[ijkp][ks-1])*ps+pBetaP[ijkp][ks-1];
+                      dBetaP_jkp=(pBetaP6[ijkp][ks-1]*ps+pBetaP5[ijkp][ks-1])*ps
+                          +pBetaP4[ijkp][ks-1];
+                      cosAng_ijkp=(-dis_ij[0]*dis_jkp[0]-dis_ij[1]*dis_jkp[1]
+                          -dis_ij[2]*dis_jkp[2])/(r_ij*r_jkp);
+                      dcA_ijkp[0][0]=(dis_jkp[0]*r_ij*r_jkp-cosAng_ijkp
+                          *-dis_ij[0]*r_jkp*r_jkp)/(r_ij*r_ij*r_jkp*r_jkp);
+                      dcA_ijkp[1][0]=(dis_jkp[1]*r_ij*r_jkp-cosAng_ijkp
+                          *-dis_ij[1]*r_jkp*r_jkp)/(r_ij*r_ij*r_jkp*r_jkp);
+                      dcA_ijkp[2][0]=(dis_jkp[2]*r_ij*r_jkp-cosAng_ijkp
+                          *-dis_ij[2]*r_jkp*r_jkp)/(r_ij*r_ij*r_jkp*r_jkp);
+                      dcA_ijkp[0][1]=(-dis_ij[0]*r_ij*r_jkp-cosAng_ijkp
+                          *dis_jkp[0]*r_ij*r_ij)/(r_ij*r_ij*r_jkp*r_jkp);
+                      dcA_ijkp[1][1]=(-dis_ij[1]*r_ij*r_jkp-cosAng_ijkp
+                          *dis_jkp[1]*r_ij*r_ij)/(r_ij*r_ij*r_jkp*r_jkp);
+                      dcA_ijkp[2][1]=(-dis_ij[2]*r_ij*r_jkp-cosAng_ijkp
+                          *dis_jkp[2]*r_ij*r_ij)/(r_ij*r_ij*r_jkp*r_jkp);
+                      cosAng_kjkp=(dis_jk[0]*dis_jkp[0]+dis_jk[1]*dis_jkp[1]
+                          +dis_jk[2]*dis_jkp[2])/(r_jk*r_jkp);
+                      dcA_kjkp[0][0]=(dis_jkp[0]*r_jk*r_jkp-cosAng_kjkp
+                          *dis_jk[0]*r_jkp*r_jkp)/(r_jk*r_jk*r_jkp*r_jkp);
+                      dcA_kjkp[1][0]=(dis_jkp[1]*r_jk*r_jkp-cosAng_kjkp
+                          *dis_jk[1]*r_jkp*r_jkp)/(r_jk*r_jk*r_jkp*r_jkp);
+                      dcA_kjkp[2][0]=(dis_jkp[2]*r_jk*r_jkp-cosAng_kjkp
+                          *dis_jk[2]*r_jkp*r_jkp)/(r_jk*r_jk*r_jkp*r_jkp);
+                      dcA_kjkp[0][1]=(dis_jk[0]*r_jk*r_jkp-cosAng_kjkp
+                          *dis_jkp[0]*r_jk*r_jk)/(r_jk*r_jk*r_jkp*r_jkp);
+                      dcA_kjkp[1][1]=(dis_jk[1]*r_jk*r_jkp-cosAng_kjkp
+                          *dis_jkp[1]*r_jk*r_jk)/(r_jk*r_jk*r_jkp*r_jkp);
+                      dcA_kjkp[2][1]=(dis_jk[2]*r_jk*r_jkp-cosAng_kjkp
+                          *dis_jkp[2]*r_jk*r_jk)/(r_jk*r_jk*r_jkp*r_jkp);
+                    }
+                  } else {
+                    if(neigh_flag[temp_jkp]) {
+                      pass_jkp=1;
+                      dis_jkp[0]=disij[0][temp_jkp];
+                      dis_jkp[1]=disij[1][temp_jkp];
+                      dis_jkp[2]=disij[2][temp_jkp];
+                      r_jkp=rij[temp_jkp];
+                      betaS_jkp=betaS[temp_jkp];
+                      dBetaS_jkp=dBetaS[temp_jkp];
+                      betaP_jkp=betaP[temp_jkp];
+                      dBetaP_jkp=dBetaP[temp_jkp];
+                      if(ji<ltmp) {
+                        nijkp=ji*(2*nlistj-ji-1)/2+(ltmp-ji)-1;
                         ngli=0;
                         ngl=1;
                       }
                       else {
-                        nijkp=ltmp*(2*numneigh[j]-ltmp-1)/2+(ki-ltmp)-1;
+                        nijkp=ltmp*(2*nlistj-ltmp-1)/2+(ji-ltmp)-1;
                         ngli=1;
                         ngl=0;
                       }
-                      ang_ijkp=cos_index[j]+nijkp;
-                      if(ang_ijkp>=cos_total) {
-                        error->one(FLERR,"Too many atom triplets for pair bop");
+                      if(ktmp<ltmp) {
+                        nkjkp=ktmp*(2*nlistj-ktmp-1)/2+(ltmp-ktmp)-1;
+                        ngjk=0;
+                        ngjkp=1;
+                      }
+                      else {
+                        nkjkp=ltmp*(2*nlistj-ltmp-1)/2+(ktmp-ltmp)-1;
+                        ngjk=1;
+                        ngjkp=0;
                       }
+                      ang_ijkp=cos_index[j]+nijkp;
+                      cosAng_ijkp=cosAng[ang_ijkp];
+                      dcA_ijkp[0][0]=dcAng[ang_ijkp][0][ngli];
+                      dcA_ijkp[1][0]=dcAng[ang_ijkp][1][ngli];
+                      dcA_ijkp[2][0]=dcAng[ang_ijkp][2][ngli];
+                      dcA_ijkp[0][1]=dcAng[ang_ijkp][0][ngl];
+                      dcA_ijkp[1][1]=dcAng[ang_ijkp][1][ngl];
+                      dcA_ijkp[2][1]=dcAng[ang_ijkp][2][ngl];
                       ang_kjkp=cos_index[j]+nkjkp;
-                      if(ang_kjkp>=cos_total) {
-                        error->one(FLERR,"Too many atom triplets for pair bop");
+                      cosAng_kjkp=cosAng[ang_kjkp];
+                      dcA_kjkp[0][0]=dcAng[ang_kjkp][0][ngjk];
+                      dcA_kjkp[1][0]=dcAng[ang_kjkp][1][ngjk];
+                      dcA_kjkp[2][0]=dcAng[ang_kjkp][2][ngjk];
+                      dcA_kjkp[0][1]=dcAng[ang_kjkp][0][ngjkp];
+                      dcA_kjkp[1][1]=dcAng[ang_kjkp][1][ngjkp];
+                      dcA_kjkp[2][1]=dcAng[ang_kjkp][2][ngjkp];
+                    }
+                  }
+                  if(pass_jkp==1) {
+                    nb_jkp=nb_t;
+                    nb_t++;
+                    if(nb_t>nb_sg) {
+                      new_n_tot=nb_sg+maxneigh;
+                      grow_sigma(nb_sg,new_n_tot);
+                      nb_sg=new_n_tot;
+                    }
+                    bt_sg[nb_jkp].temp=temp_jkp;
+                    bt_sg[nb_jkp].i=j;
+                    bt_sg[nb_jkp].j=kp;
+                    amean=cosAng_ijkp;
+                    if(amean<-1.0) amean=-1.0;
+                    if(npower<=2) {
+                      ps=(amean-1.0)*rdtheta+1.0;
+                      ks=(int)ps;
+                      if(ntheta-1<ks)
+                        ks=ntheta-1;
+                      ps=ps-ks;
+                      if(ps>1.0)
+                        ps=1.0;
+                      ks=ks-1;
+                      gfactor2=((gfunc3[itype][jtype][kptype][ks]*ps+
+                          gfunc2[itype][jtype][kptype][ks])*ps+
+                          gfunc1[itype][jtype][kptype][ks])*ps+
+                          gfunc[itype][jtype][kptype][ks];
+                      gprime2=(gfunc6[itype][jtype][kptype][ks]*ps+
+                          gfunc5[itype][jtype][kptype][ks])*ps+
+                          gfunc4[itype][jtype][kptype][ks];
+                    } else {
+                      gfactor2=gpara[itype-1][jtype-1][kptype-1][0];
+                      gprime2=0.0;
+                      xrun=1.0;
+                      for(lp1=1;lp1<npower+1;lp1++) {
+                        gprime2=gprime2+(lp1)*xrun*gpara[itype-1][jtype-1][kptype-1][lp1];
+                        xrun=xrun*amean;
+                        gfactor2=gfactor2+xrun*gpara[itype-1][jtype-1][kptype-1][lp1];
                       }
-                      nb_jkp=nb_t;
-                      nb_t++;
-                      if(nb_t>nb_pi) {
-                        new_n_tot=nb_pi+maxneigh;
-                        grow_pi(nb_pi,new_n_tot);
-                        nb_pi=new_n_tot;
+                    }
+                    amean=cosAng_kjkp;
+                    if(amean<-1.0) amean=-1.0;
+                    if(npower<=2) {
+                      ps=(amean-1.0)*rdtheta+1.0;
+                      ks=(int)ps;
+                      if(ntheta-1<ks)
+                        ks=ntheta-1;
+                      ps=ps-ks;
+                      if(ps>1.0)
+                        ps=1.0;
+                      ks=ks-1;
+                      gfactor3=((gfunc3[ktype][jtype][kptype][ks]*ps+
+                          gfunc2[ktype][jtype][kptype][ks])*ps+
+                          gfunc1[ktype][jtype][kptype][ks])*ps+
+                          gfunc[ktype][jtype][kptype][ks];
+                      gprime3=(gfunc6[ktype][jtype][kptype][ks]*ps+
+                          gfunc5[ktype][jtype][kptype][ks])*ps+
+                          gfunc4[ktype][jtype][kptype][ks];
+                    } else {
+                      gfactor3=gpara[ktype-1][jtype-1][kptype-1][0];
+                      gprime3=0.0;
+                      xrun=1.0;
+                      for(lp1=1;lp1<npower+1;lp1++) {
+                        gprime3=gprime3+(lp1)*xrun*gpara[ktype-1][jtype-1][kptype-1][lp1];
+                        xrun=xrun*amean;
+                        gfactor3=gfactor3+xrun*gpara[ktype-1][jtype-1][kptype-1][lp1];
                       }
-                      bt_pi[nb_jkp].i=j;
-                      bt_pi[nb_jkp].j=kp;
-                      bt_pi[nb_jkp].temp=temp_jkp;
-                      betaCapSq2=pi_p[jtype-1]*betaS[temp_jkp]*betaS[temp_jkp]
-                          -betaP[temp_jkp]*betaP[temp_jkp];
-                      dbetaCapSq2=2.0*pi_p[jtype-1]*betaS[temp_jkp]*dBetaS[temp_jkp]
-                          -2.0*betaP[temp_jkp]*dBetaP[temp_jkp];
-                      cosSq1=cosAng[ang_ijkp]*cosAng[ang_ijkp];
-                      angFactor=cosAng[ang_kjkp]-cosAng[ang_ijkp]*cosAng[ang_ijk];
-                      angFactor1=4.0*angFactor;
-                      angFactor2=-angFactor1*cosAng[ang_ijkp]
-                          +2.0*cosAng[ang_ijk]*(1.0-cosSq1);
-                      angFactor3=-angFactor1*cosAng[ang_ijk]
-                          +2.0*cosAng[ang_ijkp]*(1.0-cosSq);
-                      angFactor4=2.0*angFactor*angFactor-(1.0-cosSq)*(1.0-cosSq1);
-                      betaCapSum=.5*betaCapSq1*betaCapSq2;
-
-//4th BB is 4th term of Eq. 38 (a) where i , k and k' =neighbors j
+                    }
+                    gfactor=gfactor1*gfactor2*gfactor3;
+                    rfactorrt=betaS_jk*betaS_jkp;
+                    rfactor=rfactorrt*rfactorrt;
+  
+//2nd DD is Eq. 11 (c) for j atom where i , k & k'=neighbor of j
 
-                      BB=BB+betaCapSum*angFactor4;
+                    DD=DD+2.0*gfactor*rfactor;
+  
+//agpdpr1 is derivative of DD  w.r.t. Beta(r_jk)
+//agpdpr2 is derivative of DD  w.r.t. Beta(r_jk')
+//app1 is derivative of DD  w.r.t. cos(theta_ijk)
+//app2 is derivative of DD  w.r.t. cos(theta_ijkp)
+//app3 is derivative of DD  w.r.t. cos(theta_kjkp)
 
-//app1 is derivative of BB 4th term w.r.t. cos(theta_kjk')
-//app2 is derivative of BB 4th term w.r.t. cos(theta_ijk)
-//app3 is derivative of BB 4th term w.r.t. cos(theta_ijk')
-//agpdpr1 is derivative of BB 4th term for atom j w.r.t. Beta(r_jk)
-//agpdpr2 is derivative of BB 4th term for atom j w.r.t. Beta(r_jk')
+                    agpdpr1=4.0*gfactor*rfactorrt*betaS_jkp
+                        *dBetaS_jk/r_jk;
+                    agpdpr2=4.0*gfactor*rfactorrt*betaS_jk
+                        *dBetaS_jkp/r_jkp;
+                    app1=2.0*rfactor*gfactor2*gfactor3*gprime1;
+                    app2=2.0*rfactor*gfactor1*gfactor3*gprime2;
+                    app3=2.0*rfactor*gfactor1*gfactor2*gprime3;
+                    bt_sg[nb_ij].dDD[0]-=
+                        app1*dcA_ijk[0][0]
+                        +app2*dcA_ijkp[0][0];
+                    bt_sg[nb_ij].dDD[1]-=
+                        app1*dcA_ijk[1][0]
+                        +app2*dcA_ijkp[1][0];
+                    bt_sg[nb_ij].dDD[2]-=
+                        app1*dcA_ijk[2][0]
+                        +app2*dcA_ijkp[2][0];
+                    bt_sg[nb_jk].dDD[0]+=
+                        app1*dcA_ijk[0][1]
+                        +app3*dcA_kjkp[0][0]
+                        +agpdpr1*dis_jk[0];
+                    bt_sg[nb_jk].dDD[1]+=
+                        app1*dcA_ijk[1][1]
+                        +app3*dcA_kjkp[1][0]
+                        +agpdpr1*dis_jk[1];
+                    bt_sg[nb_jk].dDD[2]+=
+                        app1*dcA_ijk[2][1]
+                        +app3*dcA_kjkp[2][0]
+                        +agpdpr1*dis_jk[2];
+                    bt_sg[nb_jkp].dDD[0]+=
+                        app2*dcA_ijkp[0][1]
+                        +app3*dcA_kjkp[0][1]
+                        +agpdpr2*dis_jkp[0];
+                    bt_sg[nb_jkp].dDD[1]+=
+                        app2*dcA_ijkp[1][1]
+                        +app3*dcA_kjkp[1][1]
+                        +agpdpr2*dis_jkp[1];
+                    bt_sg[nb_jkp].dDD[2]+=
+                        app2*dcA_ijkp[2][1]
+                        +app3*dcA_kjkp[2][1]
+                        +agpdpr2*dis_jkp[2];
+  
+                  }
+                }
+              }
 
-                      app1=betaCapSum*angFactor1;
-                      app2=betaCapSum*angFactor2;
-                      app3=betaCapSum*angFactor3;
-                      agpdpr1=.5*angFactor4*dbetaCapSq1*betaCapSq2/rij[temp_jk];
-                      agpdpr2=.5*angFactor4*betaCapSq1*dbetaCapSq2/rij[temp_jkp];
+//j is a neighbor of i, k is a neighbor of j not equal to i and k'
+//is a neighbor of k not equal to j or i
 
-                      bt_pi[nb_ij].dBB[0]-=
-                          app3*dcAng[ang_ijkp][0][ngli]
-                          +app2*dcAng[ang_ijk][0][ngi];
-                      bt_pi[nb_ij].dBB[1]-=
-                          app3*dcAng[ang_ijkp][1][ngli]
-                          +app2*dcAng[ang_ijk][1][ngi];
-                      bt_pi[nb_ij].dBB[2]-=
-                          app3*dcAng[ang_ijkp][2][ngli]
-                          +app2*dcAng[ang_ijk][2][ngi];
-                      bt_pi[nb_jk].dBB[0]+=
-                          agpdpr1*disij[0][temp_jk]
-                          +app1*dcAng[ang_kjkp][0][1]
-                          +app2*dcAng[ang_ijk][0][ngk];
-                      bt_pi[nb_jk].dBB[1]+=
-                          agpdpr1*disij[1][temp_jk]
-                          +app1*dcAng[ang_kjkp][1][1]
-                          +app2*dcAng[ang_ijk][1][ngk];
-                      bt_pi[nb_jk].dBB[2]+=
-                          agpdpr1*disij[2][temp_jk]
-                          +app1*dcAng[ang_kjkp][2][1]
-                          +app2*dcAng[ang_ijk][2][ngk];
-                      bt_pi[nb_jkp].dBB[0]+=
-                          agpdpr2*disij[0][temp_jkp]
-                          +app1*dcAng[ang_kjkp][0][0]
-                          +app3*dcAng[ang_ijkp][0][ngl];
-                      bt_pi[nb_jkp].dBB[1]+=
-                          agpdpr2*disij[1][temp_jkp]
-                          +app1*dcAng[ang_kjkp][1][0]
-                          +app3*dcAng[ang_ijkp][1][ngl];
-                      bt_pi[nb_jkp].dBB[2]+=
-                          agpdpr2*disij[2][temp_jkp]
-                          +app1*dcAng[ang_kjkp][2][0]
-                          +app3*dcAng[ang_ijkp][2][ngl];
+              for(ltmp=0;ltmp<nlistk;ltmp++) {
+                temp_kkp=BOP_index[k]+ltmp;
+                ni_kkp=neigh_index[temp_kkp];
+                kp=klist[ni_kkp];
+                kptype=map[type[kp]]+1;
+                same_ikp=0;
+                same_jkp=0;
+                if(x[i][0]==x[kp][0]) {
+                  if(x[i][1]==x[kp][1]) {
+                    if(x[i][2]==x[kp][2]) {
+                      same_ikp=1;
                     }
                   }
                 }
-
-//j and k' are different neighbors of i and k is a neighbor of j not equal to i
-
-                for(ltmp=0;ltmp<numneigh[i];ltmp++) {
-                  if(ltmp!=jtmp) {
-                    temp_ikp=BOP_index[i]+ltmp;
-                    if(neigh_flag[temp_ikp]) {
-                      kp=iilist[ltmp];
-                      for(nsearch=0;nsearch<nPiBk[n];nsearch++) {
-                        ncmp=itypePiBk[n][nsearch];
-                        if(x[ncmp][0]==x[kp][0]) {
-                          if(x[ncmp][1]==x[kp][1]) {
-                            if(x[ncmp][2]==x[kp][2]) {
-                              break;
-                            }
-                          }
+                if(x[j][0]==x[kp][0]) {
+                  if(x[j][1]==x[kp][1]) {
+                    if(x[j][2]==x[kp][2]) {
+                      same_jkp=1;
+                    }
+                  }
+                }
+                if(!same_ikp&&!same_jkp) {
+                  if(ktype==kptype)
+                    ikkp=ktype-1;
+                  else if(ktype<kptype)
+                    ikkp=ktype*bop_types-ktype*(ktype+1)/2+kptype-1;
+                  else
+                    ikkp=kptype*bop_types-kptype*(kptype+1)/2+ktype-1;
+                  for(kNeij=0;kNeij<nlistk;kNeij++) {
+                    temp_kj=BOP_index[k]+kNeij;
+                    ni_kj=neigh_index[temp_kj];
+                    if(x[klist[ni_kj]][0]==x[j][0]) {
+                      if(x[klist[ni_kj]][1]==x[j][1]) {
+                        if(x[klist[ni_kj]][2]==x[j][2]) {
+                          break;
                         }
                       }
-                      if(ltmp<jtmp) {
-                        njikp=ltmp*(2*numneigh[i]-ltmp-1)/2+(jtmp-ltmp)-1;
-                        ngl=1;
+                    }
+                  }
+                  sig_flag=0;
+                  for(nsearch=0;nsearch<nSigBk;nsearch++) {
+                    ncmp=itypeSigBk[nsearch];
+                    if(x[ncmp][0]==x[kp][0]) {
+                      if(x[ncmp][1]==x[kp][1]) {
+                        if(x[ncmp][2]==x[kp][2]) {
+                          new2=nsearch;
+                          sig_flag=1;
+                          break;
+                        }
+                      }
+                    }
+                  }
+                  if(sig_flag==0) {
+                    nSigBk=nSigBk+1;
+                    new2=nSigBk-1;
+                    itypeSigBk[new2]=kp;
+                  }
+                  pass_kkp=0;
+                  if(otfly==1) {
+                    dis_kkp[0]=x[kp][0]-x[k][0];
+                    dis_kkp[1]=x[kp][1]-x[k][1];
+                    dis_kkp[2]=x[kp][2]-x[k][2];
+                    rsq_kkp=dis_kkp[0]*dis_kkp[0]
+                        +dis_kkp[1]*dis_kkp[1]
+                        +dis_kkp[2]*dis_kkp[2];
+                    r_kkp=sqrt(rsq_kkp);
+                    if(r_kkp<=rcut[ikkp]) {
+                      pass_kkp=1;
+                      ps=r_kkp*rdr[ikkp]+1.0;
+                      ks=(int)ps;
+                      if(nr-1<ks)
+                        ks=nr-1;
+                      ps=ps-ks;
+                      if(ps>1.0)
+                        ps=1.0;
+                      betaS_kkp=((pBetaS3[ikkp][ks-1]*ps+pBetaS2[ikkp][ks-1])*ps
+                          +pBetaS1[ikkp][ks-1])*ps+pBetaS[ikkp][ks-1];
+                      dBetaS_kkp=(pBetaS6[ikkp][ks-1]*ps+pBetaS5[ikkp][ks-1])*ps
+                          +pBetaS4[ikkp][ks-1];
+                      betaP_kkp=((pBetaP3[ikkp][ks-1]*ps+pBetaP2[ikkp][ks-1])*ps
+                          +pBetaP1[ikkp][ks-1])*ps+pBetaP[ikkp][ks-1];
+                      dBetaP_kkp=(pBetaP6[ikkp][ks-1]*ps+pBetaP5[ikkp][ks-1])*ps
+                          +pBetaP4[ikkp][ks-1];
+                      cosAng_jkkp=(-dis_jk[0]*dis_kkp[0]-dis_jk[1]*dis_kkp[1]
+                          -dis_jk[2]*dis_kkp[2])/(r_jk*r_kkp);
+                      dcA_jkkp[0][0]=(dis_kkp[0]*r_jk*r_kkp-cosAng_jkkp
+                          *-dis_jk[0]*r_kkp*r_kkp)/(r_jk*r_jk*r_kkp*r_kkp);
+                      dcA_jkkp[1][0]=(dis_kkp[1]*r_jk*r_kkp-cosAng_jkkp
+                          *-dis_jk[1]*r_kkp*r_kkp)/(r_jk*r_jk*r_kkp*r_kkp);
+                      dcA_jkkp[2][0]=(dis_kkp[2]*r_jk*r_kkp-cosAng_jkkp
+                          *-dis_jk[2]*r_kkp*r_kkp)/(r_jk*r_jk*r_kkp*r_kkp);
+                      dcA_jkkp[0][1]=(-dis_jk[0]*r_jk*r_kkp-cosAng_jkkp
+                          *dis_kkp[0]*r_jk*r_jk)/(r_jk*r_jk*r_kkp*r_kkp);
+                      dcA_jkkp[1][1]=(-dis_jk[1]*r_jk*r_kkp-cosAng_jkkp
+                          *dis_kkp[1]*r_jk*r_jk)/(r_jk*r_jk*r_kkp*r_kkp);
+                      dcA_jkkp[2][1]=(-dis_jk[2]*r_jk*r_kkp-cosAng_jkkp
+                          *dis_kkp[2]*r_jk*r_jk)/(r_jk*r_jk*r_kkp*r_kkp);
+                    }
+                  } else {
+                    if(neigh_flag[temp_kkp]) {
+                      pass_kkp=1;
+                      dis_kkp[0]=disij[0][temp_kkp];
+                      dis_kkp[1]=disij[1][temp_kkp];
+                      dis_kkp[2]=disij[2][temp_kkp];
+                      r_kkp=rij[temp_kkp];
+                      betaS_kkp=betaS[temp_kkp];
+                      dBetaS_kkp=dBetaS[temp_kkp];
+                      betaP_kkp=betaP[temp_kkp];
+                      dBetaP_kkp=dBetaP[temp_kkp];
+                      if(kNeij<ltmp) {
+                        njkkp=kNeij*(2*nlistk-kNeij-1)/2+(ltmp-kNeij)-1;
+                        nglkp=1;
                         nglj=0;
                       }
                       else {
-                        njikp=jtmp*(2*numneigh[i]-jtmp-1)/2+(ltmp-jtmp)-1;
-                        ngl=0;
+                        njkkp=ltmp*(2*nlistk-ltmp-1)/2+(kNeij-ltmp)-1;
+                        nglkp=0;
                         nglj=1;
                       }
-                      ang_jikp=cos_index[i]+njikp;
-                      if(ang_jikp>=cos_total) {
-                        error->one(FLERR,"Too many atom triplets for pair bop");
-                      }
-                      nb_ikp=nb_t;
-                      nb_t++;
-                      if(nb_t>nb_pi) {
-                        new_n_tot=nb_pi+maxneigh;
-                        grow_pi(nb_pi,new_n_tot);
-                        nb_pi=new_n_tot;
+                      ang_jkkp=cos_index[k]+njkkp;
+                      cosAng_jkkp=cosAng[ang_jkkp];
+                      dcA_jkkp[0][0]=dcAng[ang_jkkp][0][nglj];
+                      dcA_jkkp[1][0]=dcAng[ang_jkkp][1][nglj];
+                      dcA_jkkp[2][0]=dcAng[ang_jkkp][2][nglj];
+                      dcA_jkkp[0][1]=dcAng[ang_jkkp][0][nglkp];
+                      dcA_jkkp[1][1]=dcAng[ang_jkkp][1][nglkp];
+                      dcA_jkkp[2][1]=dcAng[ang_jkkp][2][nglkp];
+                    }
+                  }
+                  if(pass_kkp==1) {
+                    nb_kkp=nb_t;
+                    nb_t++;
+                    if(nb_t>nb_sg) {
+                      new_n_tot=nb_sg+maxneigh;
+                      grow_sigma(nb_sg,new_n_tot);
+                      nb_sg=new_n_tot;
+                    }
+                    bt_sg[nb_kkp].temp=temp_kkp;
+                    bt_sg[nb_kkp].i=k;
+                    bt_sg[nb_kkp].j=kp;
+                    amean=cosAng_jkkp;
+                    if(amean<-1.0) amean=-1.0;
+                    if(npower<=2) {
+                      ps=(amean-1.0)*rdtheta+1.0;
+                      ks=(int)ps;
+                      if(ntheta-1<ks)
+                        ks=ntheta-1;
+                      ps=ps-ks;
+                      if(ps>1.0)
+                        ps=1.0;
+                      ks=ks-1;
+                      gfactor2=((gfunc3[jtype][ktype][kptype][ks]*ps+
+                          gfunc2[jtype][ktype][kptype][ks])*ps+
+                          gfunc1[jtype][ktype][kptype][ks])*ps+
+                          gfunc[jtype][ktype][kptype][ks];
+                      gprime2=(gfunc6[jtype][ktype][kptype][ks]*ps+
+                          gfunc5[jtype][ktype][kptype][ks])*ps+
+                          gfunc4[jtype][ktype][kptype][ks];
+                    } else {
+                      gfactor2=gpara[jtype-1][ktype-1][kptype-1][0];
+                      gprime2=0.0;
+                      xrun=1.0;
+                      for(lp1=1;lp1<npower+1;lp1++) {
+                        gprime2=gprime2+(lp1)*xrun*gpara[jtype-1][ktype-1][kptype-1][lp1];
+                        xrun=xrun*amean;
+                        gfactor2=gfactor2+xrun*gpara[jtype-1][ktype-1][kptype-1][lp1];
                       }
-                      bt_pi[nb_ikp].i=i;
-                      bt_pi[nb_ikp].j=kp;
-                      bt_pi[nb_ikp].temp=temp_ikp;
-                      betaCapSq2=pi_p[itype-1]*betaS[temp_ikp]*betaS[temp_ikp]
-                          -betaP[temp_ikp]*betaP[temp_ikp];
-                      dbetaCapSq2=2.0*pi_p[itype-1]*betaS[temp_ikp]*dBetaS[temp_ikp]
-                          -2.0*betaP[temp_ikp]*dBetaP[temp_ikp];
-                      dotV=(disij[0][temp_jk]*disij[0][temp_ikp]+disij[1][temp_jk]
-                          *disij[1][temp_ikp]+disij[2][temp_jk]*disij[2][temp_ikp])
-                          /(rij[temp_jk]*rij[temp_ikp]);
-                      cosSq1=cosAng[ang_jikp]*cosAng[ang_jikp];
-                      angFactor=dotV+cosAng[ang_jikp]*cosAng[ang_ijk];
-                      angRfactor=4.0*angFactor*dotV;
-                      dAngR1=-angRfactor/rij[temp_jk];
-                      dAngR2=-angRfactor/rij[temp_ikp];
-                      angFactor1=4.0*angFactor*cosAng[ang_jikp]
-                          +2.0*cosAng[ang_ijk]*(1.0-cosSq1);
-                      angFactor2=4.0*angFactor*cosAng[ang_ijk]
-                          +2.0*cosAng[ang_jikp]*(1.0-cosSq);
-                      angFactor3=2.0*angFactor*angFactor-(1.0-cosSq)*(1.0-cosSq1);
-                      betaCapSum=.5*betaCapSq1*betaCapSq2;
-
-//5th BB is 5th term of Eq. 38 (a) Eq. 21 (b) where i , k and k' =neighbors j
-
-                      BB=BB+betaCapSum*angFactor3;
+                    }
+                    gfactorsq2=gfactor2*gfactor2;
+                    gsqprime2=2.0*gfactor2*gprime2;
+                    gfactor=gfactorsq*gfactorsq2;
+                    rfactorrt=betaS_jk*betaS_kkp;
+                    rfactor=rfactorrt*rfactorrt;
+  
+//3rd DD is Eq. 11 (c) for j atom where i & k=neighbor of j & k'=neighbor of k
 
-//app1 is derivative of BB 5th term w.r.t. cos(theta_ijk)
-//app2 is derivative of BB 5th term w.r.t. cos(theta_jik')
-//agpdpr1 is derivative of BB 5th term for atom j w.r.t. Beta(r_jk)
-//agpdpr2 is derivative of BB 5th term for atom j w.r.t. Beta(r_ik')
-//agpdpr3 is derivative of BB 5th term for atom j w.r.t. dot(r_ik',r_ij)
+                    DD=DD+gfactor*rfactor;
+  
+//agpdpr1 is derivative of DD  3rd term w.r.t. Beta(r_jk)
+//agpdpr2 is derivative of DD  3rd term w.r.t. Beta(r_kk')
+//app1 is derivative of DD  3rd term w.r.t. cos(theta_ijk)
+//app2 is derivative of DD  3rd term w.r.t. cos(theta_jkkp)
 
-                      app1=betaCapSum*angFactor1;
-                      app2=betaCapSum*angFactor2;
-                      agpdpr1=(.5*angFactor3*dbetaCapSq1*betaCapSq2
-                          +betaCapSum*dAngR1)/rij[temp_jk];
-                      agpdpr2=(.5*angFactor3*betaCapSq1*dbetaCapSq2
-                          +betaCapSum*dAngR2)/rij[temp_ikp];
-                      agpdpr3=4.0*betaCapSum*angFactor/(rij[temp_ikp]*rij[temp_jk]);
+                    agpdpr1=2.0*gfactor*rfactorrt*betaS_kkp
+                        *dBetaS_jk/r_jk;
+                    agpdpr2=2.0*gfactor*rfactorrt*betaS_jk
+                        *dBetaS_kkp/r_kkp;
+                    app1=rfactor*gfactorsq2*gsqprime;
+                    app2=rfactor*gfactorsq*gsqprime2;
+                    bt_sg[nb_ij].dDD[0]-=
+                        app1*dcA_ijk[0][0];
+                    bt_sg[nb_ij].dDD[1]-=
+                        app1*dcA_ijk[1][0];
+                    bt_sg[nb_ij].dDD[2]-=
+                        app1*dcA_ijk[2][0];
+                    bt_sg[nb_jk].dDD[0]+=
+                        app1*dcA_ijk[0][1]
+                        +agpdpr1*dis_jk[0]
+                        -app2*dcA_jkkp[0][0];
+                    bt_sg[nb_jk].dDD[1]+=
+                        app1*dcA_ijk[1][1]
+                        +agpdpr1*dis_jk[1]
+                        -app2*dcA_jkkp[1][0];
+                    bt_sg[nb_jk].dDD[2]+=
+                        app1*dcA_ijk[2][1]
+                        +agpdpr1*dis_jk[2]
+                        -app2*dcA_jkkp[2][0];
+                    bt_sg[nb_kkp].dDD[0]+=
+                        app2*dcA_jkkp[0][1]
+                        +agpdpr2*dis_kkp[0];
+                    bt_sg[nb_kkp].dDD[1]+=
+                        app2*dcA_jkkp[1][1]
+                        +agpdpr2*dis_kkp[1];
+                    bt_sg[nb_kkp].dDD[2]+=
+                        app2*dcA_jkkp[2][1]
+                        +agpdpr2*dis_kkp[2];
 
-                      bt_pi[nb_ij].dBB[0]+=
-                          +app2*dcAng[ang_jikp][0][ngl]
-                          -app1*dcAng[ang_ijk][0][ngi];
-                      bt_pi[nb_ij].dBB[1]+=
-                          +app2*dcAng[ang_jikp][1][ngl]
-                          -app1*dcAng[ang_ijk][1][ngi];
-                      bt_pi[nb_ij].dBB[2]+=
-                          +app2*dcAng[ang_jikp][2][ngl]
-                          -app1*dcAng[ang_ijk][2][ngi];
-                      bt_pi[nb_ikp].dBB[0]+=
-                          agpdpr2*disij[0][temp_ikp]
-                          +agpdpr3*disij[0][temp_jk]
-                          +app2*dcAng[ang_jikp][0][nglj];
-                      bt_pi[nb_ikp].dBB[1]+=
-                          agpdpr2*disij[1][temp_ikp]
-                          +agpdpr3*disij[1][temp_jk]
-                          +app2*dcAng[ang_jikp][1][nglj];
-                      bt_pi[nb_ikp].dBB[2]+=
-                          agpdpr2*disij[2][temp_ikp]
-                          +agpdpr3*disij[2][temp_jk]
-                          +app2*dcAng[ang_jikp][2][nglj];
-                      bt_pi[nb_jk].dBB[0]+=
-                          agpdpr1*disij[0][temp_jk]
-                          +agpdpr3*disij[0][temp_ikp]
-                          +app1*dcAng[ang_ijk][0][ngk];
-                      bt_pi[nb_jk].dBB[1]+=
-                          agpdpr1*disij[1][temp_jk]
-                          +agpdpr3*disij[1][temp_ikp]
-                          +app1*dcAng[ang_ijk][1][ngk];
-                      bt_pi[nb_jk].dBB[2]+=
-                          agpdpr1*disij[2][temp_jk]
-                          +agpdpr3*disij[2][temp_ikp]
-                          +app1*dcAng[ang_ijk][2][ngk];
-                    }
                   }
                 }
-                if(pi_flag==0)
-                  nPiBk[n]=nPiBk[n]+1;
               }
             }
-          }
-          CC=betaP[temp_ij]*betaP[temp_ij]+pi_delta[iij]*pi_delta[iij];
-          BBrt=sqrt(BB+small6);
-          AB1=CC+pi_c[iij]*(AA+BBrt)+small7;
-          AB2=CC+pi_c[iij]*(AA-BBrt+sqrt(small6))+small7;
-          BBrtR=1.0/BBrt;
-          ABrtR1=1.0/sqrt(AB1);
-          ABrtR2=1.0/sqrt(AB2);
-
-// piB is similary formulation to (a) Eq. 36 and (b) Eq. 18
-
-          piB[n]=(ABrtR1+ABrtR2)*pi_a[iij]*betaP[temp_ij];
-          dPiB1=-.5*(cube(ABrtR1)+cube(ABrtR2))*pi_c[iij]*pi_a[iij]*betaP[temp_ij];
-          dPiB2=.25*BBrtR*(cube(ABrtR2)-cube(ABrtR1))*pi_c[iij]*pi_a[iij]*betaP[temp_ij];
-          dPiB3=((ABrtR1+ABrtR2)*pi_a[iij]-(cube(ABrtR1)+cube(ABrtR2))*pi_a[iij]
-              *betaP[temp_ij]*betaP[temp_ij])*dBetaP[temp_ij]/rij[temp_ij];
-          n++;
-          pp2=2.0*betaP[temp_ij];
-          for(m=0;m<nb_t;m++) {
-            bt_ij=bt_pi[m].temp;
-            bt_i=bt_pi[m].i;
-            bt_j=bt_pi[m].j;
+          }
+        }
+      }
+
+      sig_flag=0;
+      if(FF<=0.000001) {
+        sigB=0.0;
+        sig_flag=1;
+      }
+      if(sig_flag==0){ 
+      if(sigma_a[iij]==0){
+        if(sig_flag==0) {
+          if(AA<0.0)
+            AA=0.0;
+          if(BB<0.0)
+            BB=0.0;
+          AAC=AA+BB;
+          for(m=0;m<nb_t;m++) {
+            if((bt_sg[m].i>-1)&&(bt_sg[m].j>-1)) {
+              bt_sg[m].dAAC[0]=bt_sg[m].dAA[0]
+                  +bt_sg[m].dBB[0];
+              bt_sg[m].dAAC[1]=bt_sg[m].dAA[1]
+                  +bt_sg[m].dBB[1];
+              bt_sg[m].dAAC[2]=bt_sg[m].dAA[2]
+                  +bt_sg[m].dBB[2];
+            }
+          }
+          bndtmp=(FF+sigma_delta[iij]*sigma_delta[iij]+sigma_c[iij]*AAC+small4);
+          bndtmp0=1.0/sqrt(bndtmp);
+          sigB1=betaS_ij*bndtmp0;
+          bndtmp=-0.5*bndtmp0*bndtmp0*bndtmp0;
+          bndtmp1=bndtmp0+betaS_ij*bndtmp*2.0*betaS_ij;
+          bndtmp1=bndtmp1*dBetaS_ij/r_ij;
+          bndtmp2=betaS_ij*bndtmp*sigma_c[iij];
+          setting=0;
+          for(m=0;m<nb_t;m++) {
+            if((bt_sg[m].i>-1)&&(bt_sg[m].j>-1)) {
+              temp_kk=bt_sg[m].temp;
+              if(temp_kk==temp_ij&&setting==0) {
+                bt_sg[m].dSigB1[0]=bndtmp1*dis_ij[0]
+                    +bndtmp2*bt_sg[m].dAAC[0];
+                bt_sg[m].dSigB1[1]=bndtmp1*dis_ij[1]
+                    +bndtmp2*bt_sg[m].dAAC[1];
+                bt_sg[m].dSigB1[2]=bndtmp1*dis_ij[2]
+                    +bndtmp2*bt_sg[m].dAAC[2];
+                setting=1;
+              }
+              else if(temp_kk==temp_ji&&setting==0) {
+                bt_sg[m].dSigB1[0]=-bndtmp1*dis_ij[0]
+                    +bndtmp2*bt_sg[m].dAAC[0];
+                bt_sg[m].dSigB1[1]=-bndtmp1*dis_ij[1]
+                    +bndtmp2*bt_sg[m].dAAC[1];
+                bt_sg[m].dSigB1[2]=-bndtmp1*dis_ij[2]
+                    +bndtmp2*bt_sg[m].dAAC[2];
+                setting=1;
+              }
+              else {
+                bt_sg[m].dSigB1[0]=bndtmp2*bt_sg[m].dAAC[0];
+                bt_sg[m].dSigB1[1]=bndtmp2*bt_sg[m].dAAC[1];
+                bt_sg[m].dSigB1[2]=bndtmp2*bt_sg[m].dAAC[2];
+              }
+            }
+          }
+        }
+      } else {
+        if(sig_flag==0) {
+          if(AA<0.0)
+            AA=0.0;
+          if(BB<0.0)
+            BB=0.0;
+          if(CC<0.0)
+            CC=0.0;
+          if(DD<0.0)
+            DD=0.0;
+
+// AA and BB are the representations of (a) Eq. 34 and (b) Eq. 9
+// for atoms i and j respectively
+
+          AAC=AA+BB;
+          BBC=AA*BB;
+          CCC=AA*AA+BB*BB;
+          DDC=CC+DD;
+
+//EEC is a modified form of (a) Eq. 33
+          if(DDC<CCC) DDC=CCC;
+          EEC=(DDC-CCC)/(AAC+2.0*small1);
+          AACFF=1.0/(AAC+2.0*small1);
+          for(m=0;m<nb_t;m++) {
+            if((bt_sg[m].i>-1)&&(bt_sg[m].j>-1)) {
+              bt_sg[m].dAAC[0]=bt_sg[m].dAA[0]
+                  +bt_sg[m].dBB[0];
+              bt_sg[m].dAAC[1]=bt_sg[m].dAA[1]
+                  +bt_sg[m].dBB[1];
+              bt_sg[m].dAAC[2]=bt_sg[m].dAA[2]
+                  +bt_sg[m].dBB[2];
+              bt_sg[m].dBBC[0]=bt_sg[m].dAA[0]*BB
+                  +AA*bt_sg[m].dBB[0];
+              bt_sg[m].dBBC[1]=bt_sg[m].dAA[1]*BB
+                  +AA*bt_sg[m].dBB[1];
+              bt_sg[m].dBBC[2]=bt_sg[m].dAA[2]*BB
+                  +AA*bt_sg[m].dBB[2];
+              bt_sg[m].dCCC[0]=2.0*AA*bt_sg[m].dAA[0]
+                  +2.0*BB*bt_sg[m].dBB[0];
+              bt_sg[m].dCCC[1]=2.0*AA*bt_sg[m].dAA[1]
+                  +2.0*BB*bt_sg[m].dBB[1];
+              bt_sg[m].dCCC[2]=2.0*AA*bt_sg[m].dAA[2]
+                  +2.0*BB*bt_sg[m].dBB[2];
+              bt_sg[m].dDDC[0]=bt_sg[m].dCC[0]
+                  +bt_sg[m].dDD[0];
+              bt_sg[m].dDDC[1]=bt_sg[m].dCC[1]
+                  +bt_sg[m].dDD[1];
+              bt_sg[m].dDDC[2]=bt_sg[m].dCC[2]
+                  +bt_sg[m].dDD[2];
+              bt_sg[m].dEEC[0]=(bt_sg[m].dDDC[0]
+                  -bt_sg[m].dCCC[0]
+                  -EEC*bt_sg[m].dAAC[0])*AACFF;
+              bt_sg[m].dEEC[1]=(bt_sg[m].dDDC[1]
+                  -bt_sg[m].dCCC[1]
+                  -EEC*bt_sg[m].dAAC[1])*AACFF;
+              bt_sg[m].dEEC[2]=(bt_sg[m].dDDC[2]
+                  -bt_sg[m].dCCC[2]
+                  -EEC*bt_sg[m].dAAC[2])*AACFF;
+            }
+          }
+          UT=EEC*FF+BBC+small3[iij];
+          UT=1.0/sqrt(UT);
+// FFC is slightly modified form of (a) Eq. 31
+// GGC is slightly modified form of (a) Eq. 32
+// bndtmp is a slightly modified form of (a) Eq. 30 and (b) Eq. 8
+
+          FFC=BBC*UT;
+          GGC=EEC*UT;
+          bndtmp=(FF+sigma_delta[iij]*sigma_delta[iij])*(1.0+sigma_a[iij]*GGC)
+              *(1.0+sigma_a[iij]*GGC)+sigma_c[iij]*(AAC+sigma_a[iij]*EE
+              +sigma_a[iij]*FFC*(2.0+GGC))+small4;
+          UTcom=-0.5*UT*UT*UT;
+          for(m=0;m<nb_t;m++) {
+            if((bt_sg[m].i>-1)&&(bt_sg[m].j>-1)) {
+              bt_sg[m].dUT[0]=UTcom*(bt_sg[m].dEEC[0]*FF
+                  +EEC*bt_sg[m].dFF[0]+bt_sg[m].dBBC[0]);
+              bt_sg[m].dUT[1]=UTcom*(bt_sg[m].dEEC[1]*FF
+                  +EEC*bt_sg[m].dFF[1]+bt_sg[m].dBBC[1]);
+              bt_sg[m].dUT[2]=UTcom*(bt_sg[m].dEEC[2]*FF
+                  +EEC*bt_sg[m].dFF[2]+bt_sg[m].dBBC[2]);
+              bt_sg[m].dFFC[0]=bt_sg[m].dBBC[0]*UT
+                  +BBC*bt_sg[m].dUT[0];
+              bt_sg[m].dFFC[1]=bt_sg[m].dBBC[1]*UT
+                  +BBC*bt_sg[m].dUT[1];
+              bt_sg[m].dFFC[2]=bt_sg[m].dBBC[2]*UT
+                  +BBC*bt_sg[m].dUT[2];
+              bt_sg[m].dGGC[0]=bt_sg[m].dEEC[0]*UT
+                  +EEC*bt_sg[m].dUT[0];
+              bt_sg[m].dGGC[1]=bt_sg[m].dEEC[1]*UT
+                  +EEC*bt_sg[m].dUT[1];
+              bt_sg[m].dGGC[2]=bt_sg[m].dEEC[2]*UT
+                  +EEC*bt_sg[m].dUT[2];
+            }
+          }
+          psign=1.0;
+          if(1.0+sigma_a[iij]*GGC<0.0)
+            psign=-1.0;
+          bndtmp0=1.0/sqrt(bndtmp);
+          sigB1=psign*betaS_ij*(1.0+sigma_a[iij]*GGC)*bndtmp0;
+          bndtmp=-0.5*bndtmp0*bndtmp0*bndtmp0;
+          bndtmp1=psign*(1.0+sigma_a[iij]*GGC)*bndtmp0+psign*betaS_ij
+              *(1.0+sigma_a[iij]*GGC)*bndtmp*2.0*betaS_ij*(1.0
+              +sigma_a[iij]*GGC)*(1.0+sigma_a[iij]*GGC);
+          bndtmp1=bndtmp1*dBetaS_ij/r_ij;
+          bndtmp2=psign*betaS_ij*(1.0+sigma_a[iij]*GGC)*bndtmp*sigma_c[iij];
+          bndtmp3=psign*betaS_ij*(1.0+sigma_a[iij]*GGC)
+              *bndtmp*sigma_c[iij]*sigma_a[iij];
+          bndtmp4=psign*betaS_ij*(1.0+sigma_a[iij]*GGC)
+              *bndtmp*sigma_c[iij]*sigma_a[iij]*(2.0+GGC);
+          bndtmp5=sigma_a[iij]*psign*betaS_ij*bndtmp0
+              +psign*betaS_ij*(1.0+sigma_a[iij]*GGC)*bndtmp
+              *(2.0*(FF+sigma_delta[iij]*sigma_delta[iij])*(1.0
+              +sigma_a[iij]*GGC)*sigma_a[iij]+sigma_c[iij]*sigma_a[iij]*FFC);
+          setting=0;
+          for(m=0;m<nb_t;m++) {
+            if((bt_sg[m].i>-1)&&(bt_sg[m].j>-1)) {
+              temp_kk=bt_sg[m].temp;
+              if(temp_kk==temp_ij&&setting==0) {
+                bt_sg[m].dSigB1[0]=bndtmp1*dis_ij[0]
+                    +(bndtmp2*bt_sg[m].dAAC[0]
+                    +bndtmp3*bt_sg[m].dEE[0]
+                    +bndtmp4*bt_sg[m].dFFC[0]
+                    +bndtmp5*bt_sg[m].dGGC[0]);
+                bt_sg[m].dSigB1[1]=bndtmp1*dis_ij[1]
+                    +(bndtmp2*bt_sg[m].dAAC[1]
+                    +bndtmp3*bt_sg[m].dEE[1]
+                    +bndtmp4*bt_sg[m].dFFC[1]
+                    +bndtmp5*bt_sg[m].dGGC[1]);
+                bt_sg[m].dSigB1[2]=bndtmp1*dis_ij[2]
+                    +(bndtmp2*bt_sg[m].dAAC[2]
+                    +bndtmp3*bt_sg[m].dEE[2]
+                    +bndtmp4*bt_sg[m].dFFC[2]
+                    +bndtmp5*bt_sg[m].dGGC[2]);
+                setting=1;
+              }
+              else if(temp_kk==temp_ji&&setting==0) {
+                bt_sg[m].dSigB1[0]=-bndtmp1*dis_ij[0]
+                    +(bndtmp2*bt_sg[m].dAAC[0]
+                    +bndtmp3*bt_sg[m].dEE[0]
+                    +bndtmp4*bt_sg[m].dFFC[0]
+                    +bndtmp5*bt_sg[m].dGGC[0]);
+                bt_sg[m].dSigB1[1]=-bndtmp1*dis_ij[1]
+                    +(bndtmp2*bt_sg[m].dAAC[1]
+                    +bndtmp3*bt_sg[m].dEE[1]
+                    +bndtmp4*bt_sg[m].dFFC[1]
+                    +bndtmp5*bt_sg[m].dGGC[1]);
+                bt_sg[m].dSigB1[2]=-bndtmp1*dis_ij[2]
+                    +(bndtmp2*bt_sg[m].dAAC[2]
+                    +bndtmp3*bt_sg[m].dEE[2]
+                    +bndtmp4*bt_sg[m].dFFC[2]
+                    +bndtmp5*bt_sg[m].dGGC[2]);
+                setting=1;
+              }
+              else {
+                bt_sg[m].dSigB1[0]=(bndtmp2*bt_sg[m].dAAC[0]
+                    +bndtmp3*bt_sg[m].dEE[0]
+                    +bndtmp4*bt_sg[m].dFFC[0]
+                    +bndtmp5*bt_sg[m].dGGC[0]);
+                bt_sg[m].dSigB1[1]=(bndtmp2*bt_sg[m].dAAC[1]
+                    +bndtmp3*bt_sg[m].dEE[1]
+                    +bndtmp4*bt_sg[m].dFFC[1]
+                    +bndtmp5*bt_sg[m].dGGC[1]);
+                bt_sg[m].dSigB1[2]=(bndtmp2*bt_sg[m].dAAC[2]
+                    +bndtmp3*bt_sg[m].dEE[2]
+                    +bndtmp4*bt_sg[m].dFFC[2]
+                    +bndtmp5*bt_sg[m].dGGC[2]);
+              }
+            }
+          }
+        }
+      }
+
+//This loop is to ensure there is not an error for atoms with no neighbors (deposition)
+
+// sigB is the final expression for (a) Eq. 6 and (b) Eq. 11
+ 
+      if(nb_t==0) {
+        if(j>i) {
+          bt_sg[0].dSigB1[0]=bndtmp1*dis_ij[0];
+          bt_sg[0].dSigB1[1]=bndtmp1*dis_ij[1];
+          bt_sg[0].dSigB1[2]=bndtmp1*dis_ij[2];
+        }
+        else {
+          bt_sg[0].dSigB1[0]=-bndtmp1*dis_ij[0];
+          bt_sg[0].dSigB1[1]=-bndtmp1*dis_ij[1];
+          bt_sg[0].dSigB1[2]=-bndtmp1*dis_ij[2];
+        }
+        for(pp=0;pp<3;pp++) {
+          bt_sg[0].dAA[pp]=0.0;
+          bt_sg[0].dBB[pp]=0.0;
+          bt_sg[0].dAAC[pp]=0.0;
+          bt_sg[0].dSigB1[pp]=0.0;
+          bt_sg[0].dSigB[pp]=0.0;
+          if(sigma_f[iij]!=0.5&&sigma_k[iij]!=0.0) {
+            bt_sg[0].dCC[pp]=0.0;
+            bt_sg[0].dDD[pp]=0.0;
+            bt_sg[0].dEE[pp]=0.0;
+            bt_sg[0].dEE1[pp]=0.0;
+            bt_sg[0].dFF[pp]=0.0;
+            bt_sg[0].dBBC[pp]=0.0;
+            bt_sg[0].dCCC[pp]=0.0;
+            bt_sg[0].dDDC[pp]=0.0;
+            bt_sg[0].dEEC[pp]=0.0;
+            bt_sg[0].dFFC[pp]=0.0;
+            bt_sg[0].dGGC[pp]=0.0;
+            bt_sg[0].dUT[pp]=0.0;
+          }
+        }
+        bt_sg[0].i=i;
+        bt_sg[0].j=j;
+        bt_sg[0].temp=temp_ij;
+        nb_t++;
+        if(nb_t>nb_sg) {
+          new_n_tot=nb_sg+maxneigh;
+          grow_sigma(nb_sg,new_n_tot);
+          nb_sg=new_n_tot;
+        }
+      }
+      ps=sigB1*rdBO+1.0;
+      ks=(int)ps;
+      if(nBOt-1<ks)
+        ks=nBOt-1;
+      ps=ps-ks;
+      if(ps>1.0)
+        ps=1.0;
+      dsigB1=((FsigBO3[iij][ks-1]*ps+FsigBO2[iij][ks-1])*ps
+          +FsigBO1[iij][ks-1])*ps+FsigBO[iij][ks-1];
+
+      dsigB2=(FsigBO6[iij][ks-1]*ps+FsigBO5[iij][ks-1])*ps+FsigBO4[iij][ks-1];
+      for(m=0;m<nb_t;m++) {
+        if((bt_sg[m].i>-1)&&(bt_sg[m].j>-1)) {
+          temp_kk=bt_sg[m].temp;
+          bt_i=bt_sg[m].i;
+          bt_j=bt_sg[m].j;
+          if(sigma_f[iij]==0.5&&sigma_k[iij]==0.0) {
+            sigB=dsigB1;
+            pp1=2.0*betaS_ij;
+            for(pp=0;pp<3;pp++) {
+              bt_sg[m].dSigB[pp]=dsigB2*bt_sg[m].dSigB1[pp];
+            }
+            for(pp=0;pp<3;pp++) {
+              ftmp[pp]=pp1*bt_sg[m].dSigB[pp];
+              f[bt_i][pp]-=ftmp[pp];
+              f[bt_j][pp]+=ftmp[pp];
+            }
+            if(evflag) {
+              ev_tally_xyz(bt_i,bt_j,nlocal,newton_pair,0.0,0.0,ftmp[0],ftmp[1]
+                  ,ftmp[2],xtmp[0],xtmp[1],xtmp[2]);
+            }
+          } else {
+            part0=(FF+0.5*AAC+small5);
+            part1=(sigma_f[iij]-0.5)*sigma_k[iij];
+            part2=1.0-part1*EE1/part0;
+            part3=dsigB1*part1/part0;
+            part4=part3/part0*EE1;
+        
+// sigB is the final expression for (a) Eq. 6 and (b) Eq. 11
+
+            sigB=dsigB1*part2;
+ 
+            pp1=2.0*betaS_ij;
+            xtmp[0]=x[bt_j][0]-x[bt_i][0];
+            xtmp[1]=x[bt_j][1]-x[bt_i][1];
+            xtmp[2]=x[bt_j][2]-x[bt_i][2];
+            for(pp=0;pp<3;pp++) {
+              bt_sg[m].dSigB[pp]=dsigB2*part2*bt_sg[m].dSigB1[pp]
+                  -part3*bt_sg[m].dEE1[pp]
+                  +part4*(bt_sg[m].dFF[pp]
+                  +0.5*bt_sg[m].dAAC[pp]);
+            }
             for(pp=0;pp<3;pp++) {
-              bt_pi[m].dPiB[pp]=
-                  +dPiB1*bt_pi[m].dAA[pp]
-                  +dPiB2*bt_pi[m].dBB[pp];
-              ftmp[pp]=pp2*bt_pi[m].dPiB[pp];
+              ftmp[pp]=pp1*bt_sg[m].dSigB[pp];
               f[bt_i][pp]-=ftmp[pp];
               f[bt_j][pp]+=ftmp[pp];
-
             }
             if(evflag) {
               ev_tally_xyz(bt_i,bt_j,nlocal,newton_pair,0.0,0.0,ftmp[0],ftmp[1]
-                  ,ftmp[2],disij[0][bt_ij],disij[1][bt_ij],disij[2][bt_ij]);
+                  ,ftmp[2],xtmp[0],xtmp[1],xtmp[2]);
             }
           }
-          for(pp=0;pp<3;pp++) {
-            ftmp[pp]=pp2*dPiB3*disij[pp][temp_ij];
-            f[i][pp]-=ftmp[pp];
-            f[j][pp]+=ftmp[pp];
-          }
-          if(evflag) {
-            ev_tally_xyz(i,j,nlocal,newton_pair,0.0,0.0,ftmp[0],ftmp[1]
-                ,ftmp[2],disij[0][temp_ij],disij[1][temp_ij],disij[2][temp_ij]);
-          }
         }
       }
     }
+    }
   }
-  destroy_pi();
+  return(sigB);
+  destroy_sigma();
 }
 
 /* ---------------------------------------------------------------------- */
 
-void PairBOP::PiBo_otf()
+/*  The formulation differs slightly to avoid negative square roots
+    in the calculation of Theta_pi,ij of (a) Eq. 36 and (b) Eq. 18
+    see (d) */
+
+/* ---------------------------------------------------------------------- */
+
+double PairBOP::PiBo(int itmp, int jtmp)
 {
   int new_n_tot;
   int i,j,k,kp,m,n,pp,nb_t;
   int iij,iik,iikp,ji,ki,ijkp,ijk;
   int nsearch,ncmp;
-  tagint i_tag,j_tag;
-  int itmp,ltmp,jtmp,ktmp;
+  int i_tag,j_tag;
+  int ltmp,ktmp;
   int pi_flag,ks;
   int nlocal;
   int inum,*ilist,*iilist,*jlist;
@@ -7104,10 +3937,23 @@ void PairBOP::PiBo_otf()
   int temp_jk,temp_jkp;
   int nb_ij,nb_ik,nb_jk,nb_ikp,nb_jkp;
   int bt_i,bt_j;
-  double AA,BB,CC;
+  int pass_ij,pass_ik,pass_ikp;
+  int pass_jkp,pass_jk;
+  int njik,ngj,ngk;
+  int nkikp,njikp,nglj;
+  int ngl,ngi,nkjkp;
+  int nijkp,ngli,nijk;
+  int ang_jik,ang_jikp,ang_kikp;
+  int ang_ijk,ang_ijkpi,ang_kjkp;
+  int ang_ijkp;
+  int ni_ij,ni_ji,ni_ik,ni_ikp;
+  int ni_ki,ni_jk,ni_jkp;
+  int temp_ji,temp_ki;
+  int nlistj,nlisti,nlistk;
+  double AA,BB,CC,DD,EE,FF;
   double cosSq,sinFactor,cosFactor;
   double cosSq1,dotV,BBrt,AB1,AB2;
-  double BBrtR,ABrtR1,ABrtR2;
+  double BBrtR,ABrtR,ABrtR1,ABrtR2;
   double angFactor,angFactor1,angFactor2;
   double angFactor3,angFactor4,angRfactor;
   double dAngR1,dAngR2,agpdpr3;
@@ -7145,9 +3991,11 @@ void PairBOP::PiBo_otf()
   double **f = atom->f;
   double **x = atom->x;
   int *type = atom->type;
-  tagint *tag = atom->tag;
+  int *tag = atom->tag;
 
   nlocal = atom->nlocal;
+  int nall = nlocal + atom->nghost;
+
   numneigh = list->numneigh;
   firstneigh = list->firstneigh;
   inum = list->inum;
@@ -7166,17 +4014,13 @@ void PairBOP::PiBo_otf()
     destroy_pi();
   }
   create_pi(nb_pi);
-
-  for(itmp=0;itmp<inum;itmp++) {
-    nb_t=0;
+  piB=0;
     i = ilist[itmp];
-    itype = map[type[i]]+1;
     i_tag=tag[i];
+    itype = map[type[i]]+1;
 
 // j is a loop over all neighbors of i
-
     iilist=firstneigh[i];
-    for(jtmp=0;jtmp<numneigh[i];jtmp++) {
       for(m=0;m<nb_pi;m++) {
         for(pp=0;pp<3;pp++) {
           bt_pi[m].dAA[pp]=0.0;
@@ -7186,12 +4030,13 @@ void PairBOP::PiBo_otf()
         bt_pi[m].i=-1;
         bt_pi[m].j=-1;
       }
+      nb_t=0;
       temp_ij=BOP_index[i]+jtmp;
-      j=iilist[jtmp];
+      ni_ij=neigh_index[temp_ij];
+      j=iilist[ni_ij];
       jlist=firstneigh[j];
-      jtype=map[type[j]]+1;
       j_tag=tag[j];
-      nb_t=0;
+      jtype=map[type[j]]+1;
       ftmp[0]=0.0;
       ftmp[1]=0.0;
       ftmp[2]=0.0;
@@ -7202,13 +4047,20 @@ void PairBOP::PiBo_otf()
           iij=itype*bop_types-itype*(itype+1)/2+jtype-1;
         else
           iij=jtype*bop_types-jtype*(jtype+1)/2+itype-1;
+        if(pi_a[iij]==0) {
+          nPiBk=0;
+          piB=0;
+        } else {
         AA=0.0;
         BB=0.0;
-        nPiBk[n]=0;
-        for(ji=0;ji<numneigh[j];ji++) {
-          if(x[jlist[ji]][0]==x[i][0]) {
-            if(x[jlist[ji]][1]==x[i][1]) {
-              if(x[jlist[ji]][2]==x[i][2]) {
+        nPiBk=0;
+        nlistj=BOP_total[j];
+        for(ji=0;ji<nlistj;ji++) {
+          temp_ji=BOP_index[j]+ji;
+          ni_ji=neigh_index[temp_ji];
+          if(x[jlist[ni_ji]][0]==x[i][0]) {
+            if(x[jlist[ni_ji]][1]==x[i][1]) {
+              if(x[jlist[ni_ji]][2]==x[i][2]) {
                   break;
               }
             }
@@ -7224,32 +4076,53 @@ void PairBOP::PiBo_otf()
         bt_pi[nb_ij].i=i;
         bt_pi[nb_ij].j=j;
         bt_pi[nb_ij].temp=temp_ij;
-        dis_ij[0]=x[j][0]-x[i][0];
-        dis_ij[1]=x[j][1]-x[i][1];
-        dis_ij[2]=x[j][2]-x[i][2];
-        rsq_ij=dis_ij[0]*dis_ij[0]
-            +dis_ij[1]*dis_ij[1]
-            +dis_ij[2]*dis_ij[2];
-        r_ij=sqrt(rsq_ij);
-        if(r_ij<=rcut[iij]) {
-          ps=r_ij*rdr[iij]+1.0;
-          ks=(int)ps;
-          if(nr-1<ks)
-            ks=nr-1;
-          ps=ps-ks;
-          if(ps>1.0)
-            ps=1.0;
-          betaP_ij=((pBetaP3[iij][ks-1]*ps+pBetaP2[iij][ks-1])*ps
-              +pBetaP1[iij][ks-1])*ps+pBetaP[iij][ks-1];
-          dBetaP_ij=(pBetaP6[iij][ks-1]*ps+pBetaP5[iij][ks-1])*ps
-              +pBetaP4[iij][ks-1];
+        pass_ij=0;
+        if(otfly==1) {
+          dis_ij[0]=x[j][0]-x[i][0];
+          dis_ij[1]=x[j][1]-x[i][1];
+          dis_ij[2]=x[j][2]-x[i][2];
+          rsq_ij=dis_ij[0]*dis_ij[0]
+              +dis_ij[1]*dis_ij[1]
+              +dis_ij[2]*dis_ij[2];
+          r_ij=sqrt(rsq_ij);
+          if(r_ij<=rcut[iij]) {
+            pass_ij=1;
+            ps=r_ij*rdr[iij]+1.0;
+            ks=(int)ps;
+            if(nr-1<ks)
+              ks=nr-1;
+            ps=ps-ks;
+            if(ps>1.0)
+              ps=1.0;
+            betaP_ij=((pBetaP3[iij][ks-1]*ps+pBetaP2[iij][ks-1])*ps
+                +pBetaP1[iij][ks-1])*ps+pBetaP[iij][ks-1];
+            dBetaP_ij=(pBetaP6[iij][ks-1]*ps+pBetaP5[iij][ks-1])*ps
+                +pBetaP4[iij][ks-1];
+          }
+        } else {
+          if(neigh_flag[temp_ij]) {
+            pass_ij=1;
+            dis_ij[0]=disij[0][temp_ij];
+            dis_ij[1]=disij[1][temp_ij];
+            dis_ij[2]=disij[2][temp_ij];
+            r_ij=rij[temp_ij];
+            betaP_ij=betaP[temp_ij];
+            dBetaP_ij=dBetaP[temp_ij];
+          }
+        }
 
 // j and k are different neighbors of i
 
-          for(ktmp=0;ktmp<numneigh[i];ktmp++) {
+        AA=0.0;
+        BB=0.0;
+        if(pass_ij==1) {
+          nPiBk=0;
+          nlisti=BOP_total[i];
+          for(ktmp=0;ktmp<nlisti;ktmp++) {
             if(ktmp!=jtmp) {
               temp_ik=BOP_index[i]+ktmp;
-              k=iilist[ktmp];
+              ni_ik=neigh_index[temp_ik];
+              k=iilist[ni_ik];
               ktype=map[type[k]]+1;
               if(itype==ktype)
                 iik=itype-1;
@@ -7257,43 +4130,79 @@ void PairBOP::PiBo_otf()
                 iik=itype*bop_types-itype*(itype+1)/2+ktype-1;
               else
                 iik=ktype*bop_types-ktype*(ktype+1)/2+itype-1;
-              dis_ik[0]=x[k][0]-x[i][0];
-              dis_ik[1]=x[k][1]-x[i][1];
-              dis_ik[2]=x[k][2]-x[i][2];
-              rsq_ik=dis_ik[0]*dis_ik[0]
-                  +dis_ik[1]*dis_ik[1]
-                  +dis_ik[2]*dis_ik[2];
-              r_ik=sqrt(rsq_ik);
-              if(r_ik<=rcut[iik]) {
-                ps=r_ik*rdr[iik]+1.0;
-                ks=(int)ps;
-                if(nr-1<ks)
-                  ks=nr-1;
-                ps=ps-ks;
-                if(ps>1.0)
-                  ps=1.0;
-                betaS_ik=((pBetaS3[iik][ks-1]*ps+pBetaS2[iik][ks-1])*ps
-                    +pBetaS1[iik][ks-1])*ps+pBetaS[iik][ks-1];
-                dBetaS_ik=(pBetaS6[iik][ks-1]*ps+pBetaS5[iik][ks-1])*ps
-                    +pBetaS4[iik][ks-1];
-                betaP_ik=((pBetaP3[iik][ks-1]*ps+pBetaP2[iik][ks-1])*ps
-                    +pBetaP1[iik][ks-1])*ps+pBetaP[iik][ks-1];
-                dBetaP_ik=(pBetaP6[iik][ks-1]*ps+pBetaP5[iik][ks-1])*ps
-                    +pBetaP4[iik][ks-1];
-                cosAng_jik=(dis_ij[0]*dis_ik[0]+dis_ij[1]*dis_ik[1]
-                    +dis_ij[2]*dis_ik[2])/(r_ij*r_ik);
-                dcA_jik[0][0]=(dis_ik[0]*r_ij*r_ik-cosAng_jik
-                    *dis_ij[0]*r_ik*r_ik)/(r_ij*r_ij*r_ik*r_ik);
-                dcA_jik[1][0]=(dis_ik[1]*r_ij*r_ik-cosAng_jik
-                    *dis_ij[1]*r_ik*r_ik)/(r_ij*r_ij*r_ik*r_ik);
-                dcA_jik[2][0]=(dis_ik[2]*r_ij*r_ik-cosAng_jik
-                    *dis_ij[2]*r_ik*r_ik)/(r_ij*r_ij*r_ik*r_ik);
-                dcA_jik[0][1]=(dis_ij[0]*r_ij*r_ik-cosAng_jik
-                    *dis_ik[0]*r_ij*r_ij)/(r_ij*r_ij*r_ik*r_ik);
-                dcA_jik[1][1]=(dis_ij[1]*r_ij*r_ik-cosAng_jik
-                    *dis_ik[1]*r_ij*r_ij)/(r_ij*r_ij*r_ik*r_ik);
-                dcA_jik[2][1]=(dis_ij[2]*r_ij*r_ik-cosAng_jik
-                    *dis_ik[2]*r_ij*r_ij)/(r_ij*r_ij*r_ik*r_ik);
+              pass_ik=0;
+              if(otfly==1) {
+                dis_ik[0]=x[k][0]-x[i][0];
+                dis_ik[1]=x[k][1]-x[i][1];
+                dis_ik[2]=x[k][2]-x[i][2];
+                rsq_ik=dis_ik[0]*dis_ik[0]
+                    +dis_ik[1]*dis_ik[1]
+                    +dis_ik[2]*dis_ik[2];
+                r_ik=sqrt(rsq_ik);
+                if(r_ik<=rcut[iik]) {
+                  pass_ik=1;
+                  ps=r_ik*rdr[iik]+1.0;
+                  ks=(int)ps;
+                  if(nr-1<ks)
+                    ks=nr-1;
+                  ps=ps-ks;
+                  if(ps>1.0)
+                    ps=1.0;
+                  betaS_ik=((pBetaS3[iik][ks-1]*ps+pBetaS2[iik][ks-1])*ps
+                      +pBetaS1[iik][ks-1])*ps+pBetaS[iik][ks-1];
+                  dBetaS_ik=(pBetaS6[iik][ks-1]*ps+pBetaS5[iik][ks-1])*ps
+                      +pBetaS4[iik][ks-1];
+                  betaP_ik=((pBetaP3[iik][ks-1]*ps+pBetaP2[iik][ks-1])*ps
+                      +pBetaP1[iik][ks-1])*ps+pBetaP[iik][ks-1];
+                  dBetaP_ik=(pBetaP6[iik][ks-1]*ps+pBetaP5[iik][ks-1])*ps
+                      +pBetaP4[iik][ks-1];
+                  cosAng_jik=(dis_ij[0]*dis_ik[0]+dis_ij[1]*dis_ik[1]
+                      +dis_ij[2]*dis_ik[2])/(r_ij*r_ik);
+                  dcA_jik[0][0]=(dis_ik[0]*r_ij*r_ik-cosAng_jik
+                      *dis_ij[0]*r_ik*r_ik)/(r_ij*r_ij*r_ik*r_ik);
+                  dcA_jik[1][0]=(dis_ik[1]*r_ij*r_ik-cosAng_jik
+                      *dis_ij[1]*r_ik*r_ik)/(r_ij*r_ij*r_ik*r_ik);
+                  dcA_jik[2][0]=(dis_ik[2]*r_ij*r_ik-cosAng_jik
+                      *dis_ij[2]*r_ik*r_ik)/(r_ij*r_ij*r_ik*r_ik);
+                  dcA_jik[0][1]=(dis_ij[0]*r_ij*r_ik-cosAng_jik
+                      *dis_ik[0]*r_ij*r_ij)/(r_ij*r_ij*r_ik*r_ik);
+                  dcA_jik[1][1]=(dis_ij[1]*r_ij*r_ik-cosAng_jik
+                      *dis_ik[1]*r_ij*r_ij)/(r_ij*r_ij*r_ik*r_ik);
+                  dcA_jik[2][1]=(dis_ij[2]*r_ij*r_ik-cosAng_jik
+                      *dis_ik[2]*r_ij*r_ij)/(r_ij*r_ij*r_ik*r_ik);
+                }
+              } else {
+                if(neigh_flag[temp_ik]) {
+                  pass_ik=1;
+                  dis_ik[0]=disij[0][temp_ik];
+                  dis_ik[1]=disij[1][temp_ik];
+                  dis_ik[2]=disij[2][temp_ik];
+                  r_ik=rij[temp_ik];
+                  betaS_ik=betaS[temp_ik];
+                  dBetaS_ik=dBetaS[temp_ik];
+                  betaP_ik=betaP[temp_ik];
+                  dBetaP_ik=dBetaP[temp_ik];
+                  if(jtmp<ktmp) {
+                    njik=jtmp*(2*nlisti-jtmp-1)/2+(ktmp-jtmp)-1;
+                    ngj=0;
+                    ngk=1;
+                  }
+                  else {
+                    njik=ktmp*(2*nlisti-ktmp-1)/2+(jtmp-ktmp)-1;
+                    ngj=1;
+                    ngk=0;
+                  }
+                  ang_jik=cos_index[i]+njik;
+                  cosAng_jik=cosAng[ang_jik];
+                  dcA_jik[0][0]=dcAng[ang_jik][0][ngj];
+                  dcA_jik[1][0]=dcAng[ang_jik][1][ngj];
+                  dcA_jik[2][0]=dcAng[ang_jik][2][ngj];
+                  dcA_jik[0][1]=dcAng[ang_jik][0][ngk];
+                  dcA_jik[1][1]=dcAng[ang_jik][1][ngk];
+                  dcA_jik[2][1]=dcAng[ang_jik][2][ngk];
+                }
+              }
+              if(pass_ik==1) {
                 nb_ik=nb_t;
                 nb_t++;
                 if(nb_t>nb_pi) {
@@ -7314,7 +4223,6 @@ void PairBOP::PiBo_otf()
 
 //AA is Eq. 37 (a) and Eq. 19 (b) or i atoms
 //1st BB is first term of Eq. 38 (a) where j and k =neighbors i
-
                 AA=AA+sinFactor*betaS_ik+cosFactor*betaP_ik;
                 BB=BB+.25*(1.0-cosSq)*(1.0-cosSq)*betaCapSq1*betaCapSq1;
 
@@ -7329,7 +4237,7 @@ void PairBOP::PiBo_otf()
                     +betaP_ik*betaP_ik);
                 app2=-(1.0-cosSq)*cosAng_jik*betaCapSq1*betaCapSq1;
                 agpdpr2=.5*(1.0-cosSq)*(1.0-cosSq)*betaCapSq1*dbetaCapSq1/r_ik;
-                itypePiBk[n][nPiBk[n]]=k;
+                itypePiBk[nPiBk]=k;
                 bt_pi[nb_ij].dAA[0]+=
                     app1*dcA_jik[0][0];
                 bt_pi[nb_ij].dAA[1]+=
@@ -7366,10 +4274,11 @@ void PairBOP::PiBo_otf()
                 for(ltmp=0;ltmp<ktmp;ltmp++) {
                   if(ltmp!=jtmp) {
                     temp_ikp=BOP_index[i]+ltmp;
-                    kp=iilist[ltmp];
+                    ni_ikp=neigh_index[temp_ikp];
+                    kp=iilist[ni_ikp];
                     kptype=map[type[kp]]+1;
-                    for(nsearch=0;nsearch<nPiBk[n];nsearch++) {
-                      ncmp=itypePiBk[n][nsearch];
+                    for(nsearch=0;nsearch<nPiBk;nsearch++) {
+                      ncmp=itypePiBk[nsearch];
                       if(x[ncmp][0]==x[kp][0]) {
                         if(x[ncmp][1]==x[kp][1]) {
                           if(x[ncmp][2]==x[kp][2]) {
@@ -7384,57 +4293,102 @@ void PairBOP::PiBo_otf()
                       iikp=itype*bop_types-itype*(itype+1)/2+kptype-1;
                     else
                       iikp=kptype*bop_types-kptype*(kptype+1)/2+itype-1;
-                    dis_ikp[0]=x[kp][0]-x[i][0];
-                    dis_ikp[1]=x[kp][1]-x[i][1];
-                    dis_ikp[2]=x[kp][2]-x[i][2];
-                    rsq_ikp=dis_ikp[0]*dis_ikp[0]
-                        +dis_ikp[1]*dis_ikp[1]
-                        +dis_ikp[2]*dis_ikp[2];
-                    r_ikp=sqrt(rsq_ikp);
-                    if(r_ikp<=rcut[iikp]) {
-                      ps=r_ikp*rdr[iikp]+1.0;
-                      ks=(int)ps;
-                      if(nr-1<ks)
-                        ks=nr-1;
-                      ps=ps-ks;
-                      if(ps>1.0)
-                        ps=1.0;
-                      betaS_ikp=((pBetaS3[iikp][ks-1]*ps+pBetaS2[iikp][ks-1])*ps
-                          +pBetaS1[iikp][ks-1])*ps+pBetaS[iikp][ks-1];
-                      dBetaS_ikp=(pBetaS6[iikp][ks-1]*ps+pBetaS5[iikp][ks-1])*ps
-                          +pBetaS4[iikp][ks-1];
-                      betaP_ikp=((pBetaP3[iikp][ks-1]*ps+pBetaP2[iikp][ks-1])*ps
-                          +pBetaP1[iikp][ks-1])*ps+pBetaP[iikp][ks-1];
-                      dBetaP_ikp=(pBetaP6[iikp][ks-1]*ps+pBetaP5[iikp][ks-1])*ps
-                          +pBetaP4[iikp][ks-1];
-                      cosAng_jikp=(dis_ij[0]*dis_ikp[0]+dis_ij[1]*dis_ikp[1]
-                          +dis_ij[2]*dis_ikp[2])/(r_ij*r_ikp);
-                      dcA_jikp[0][0]=(dis_ikp[0]*r_ij*r_ikp-cosAng_jikp
-                          *dis_ij[0]*r_ikp*r_ikp)/(r_ij*r_ij*r_ikp*r_ikp);
-                      dcA_jikp[1][0]=(dis_ikp[1]*r_ij*r_ikp-cosAng_jikp
-                          *dis_ij[1]*r_ikp*r_ikp)/(r_ij*r_ij*r_ikp*r_ikp);
-                      dcA_jikp[2][0]=(dis_ikp[2]*r_ij*r_ikp-cosAng_jikp
-                          *dis_ij[2]*r_ikp*r_ikp)/(r_ij*r_ij*r_ikp*r_ikp);
-                      dcA_jikp[0][1]=(dis_ij[0]*r_ij*r_ikp-cosAng_jikp
-                          *dis_ikp[0]*r_ij*r_ij)/(r_ij*r_ij*r_ikp*r_ikp);
-                      dcA_jikp[1][1]=(dis_ij[1]*r_ij*r_ikp-cosAng_jikp
-                          *dis_ikp[1]*r_ij*r_ij)/(r_ij*r_ij*r_ikp*r_ikp);
-                      dcA_jikp[2][1]=(dis_ij[2]*r_ij*r_ikp-cosAng_jikp
-                          *dis_ikp[2]*r_ij*r_ij)/(r_ij*r_ij*r_ikp*r_ikp);
-                      cosAng_kikp=(dis_ik[0]*dis_ikp[0]+dis_ik[1]*dis_ikp[1]
-                          +dis_ik[2]*dis_ikp[2])/(r_ik*r_ikp);
-                      dcA_kikp[0][0]=(dis_ikp[0]*r_ik*r_ikp-cosAng_kikp
-                          *dis_ik[0]*r_ikp*r_ikp)/(r_ik*r_ik*r_ikp*r_ikp);
-                      dcA_kikp[1][0]=(dis_ikp[1]*r_ik*r_ikp-cosAng_kikp
-                          *dis_ik[1]*r_ikp*r_ikp)/(r_ik*r_ik*r_ikp*r_ikp);
-                      dcA_kikp[2][0]=(dis_ikp[2]*r_ik*r_ikp-cosAng_kikp
-                          *dis_ik[2]*r_ikp*r_ikp)/(r_ik*r_ik*r_ikp*r_ikp);
-                      dcA_kikp[0][1]=(dis_ik[0]*r_ik*r_ikp-cosAng_kikp
-                          *dis_ikp[0]*r_ik*r_ik)/(r_ik*r_ik*r_ikp*r_ikp);
-                      dcA_kikp[1][1]=(dis_ik[1]*r_ik*r_ikp-cosAng_kikp
-                          *dis_ikp[1]*r_ik*r_ik)/(r_ik*r_ik*r_ikp*r_ikp);
-                      dcA_kikp[2][1]=(dis_ik[2]*r_ik*r_ikp-cosAng_kikp
-                          *dis_ikp[2]*r_ik*r_ik)/(r_ik*r_ik*r_ikp*r_ikp);
+                    pass_ikp=0;
+                    if(otfly==1) {
+                      dis_ikp[0]=x[kp][0]-x[i][0];
+                      dis_ikp[1]=x[kp][1]-x[i][1];
+                      dis_ikp[2]=x[kp][2]-x[i][2];
+                      rsq_ikp=dis_ikp[0]*dis_ikp[0]
+                          +dis_ikp[1]*dis_ikp[1]
+                          +dis_ikp[2]*dis_ikp[2];
+                      r_ikp=sqrt(rsq_ikp);
+                      if(r_ikp<=rcut[iikp]) {
+                        pass_ikp=1;
+                        ps=r_ikp*rdr[iikp]+1.0;
+                        ks=(int)ps;
+                        if(nr-1<ks)
+                          ks=nr-1;
+                        ps=ps-ks;
+                        if(ps>1.0)
+                          ps=1.0;
+                        betaS_ikp=((pBetaS3[iikp][ks-1]*ps+pBetaS2[iikp][ks-1])*ps
+                            +pBetaS1[iikp][ks-1])*ps+pBetaS[iikp][ks-1];
+                        dBetaS_ikp=(pBetaS6[iikp][ks-1]*ps+pBetaS5[iikp][ks-1])*ps
+                            +pBetaS4[iikp][ks-1];
+                        betaP_ikp=((pBetaP3[iikp][ks-1]*ps+pBetaP2[iikp][ks-1])*ps
+                            +pBetaP1[iikp][ks-1])*ps+pBetaP[iikp][ks-1];
+                        dBetaP_ikp=(pBetaP6[iikp][ks-1]*ps+pBetaP5[iikp][ks-1])*ps
+                            +pBetaP4[iikp][ks-1];
+                        cosAng_jikp=(dis_ij[0]*dis_ikp[0]+dis_ij[1]*dis_ikp[1]
+                            +dis_ij[2]*dis_ikp[2])/(r_ij*r_ikp);
+                        dcA_jikp[0][0]=(dis_ikp[0]*r_ij*r_ikp-cosAng_jikp
+                            *dis_ij[0]*r_ikp*r_ikp)/(r_ij*r_ij*r_ikp*r_ikp);
+                        dcA_jikp[1][0]=(dis_ikp[1]*r_ij*r_ikp-cosAng_jikp
+                            *dis_ij[1]*r_ikp*r_ikp)/(r_ij*r_ij*r_ikp*r_ikp);
+                        dcA_jikp[2][0]=(dis_ikp[2]*r_ij*r_ikp-cosAng_jikp
+                            *dis_ij[2]*r_ikp*r_ikp)/(r_ij*r_ij*r_ikp*r_ikp);
+                        dcA_jikp[0][1]=(dis_ij[0]*r_ij*r_ikp-cosAng_jikp
+                            *dis_ikp[0]*r_ij*r_ij)/(r_ij*r_ij*r_ikp*r_ikp);
+                        dcA_jikp[1][1]=(dis_ij[1]*r_ij*r_ikp-cosAng_jikp
+                            *dis_ikp[1]*r_ij*r_ij)/(r_ij*r_ij*r_ikp*r_ikp);
+                        dcA_jikp[2][1]=(dis_ij[2]*r_ij*r_ikp-cosAng_jikp
+                            *dis_ikp[2]*r_ij*r_ij)/(r_ij*r_ij*r_ikp*r_ikp);
+                        cosAng_kikp=(dis_ik[0]*dis_ikp[0]+dis_ik[1]*dis_ikp[1]
+                            +dis_ik[2]*dis_ikp[2])/(r_ik*r_ikp);
+                        dcA_kikp[0][0]=(dis_ikp[0]*r_ik*r_ikp-cosAng_kikp
+                            *dis_ik[0]*r_ikp*r_ikp)/(r_ik*r_ik*r_ikp*r_ikp);
+                        dcA_kikp[1][0]=(dis_ikp[1]*r_ik*r_ikp-cosAng_kikp
+                            *dis_ik[1]*r_ikp*r_ikp)/(r_ik*r_ik*r_ikp*r_ikp);
+                        dcA_kikp[2][0]=(dis_ikp[2]*r_ik*r_ikp-cosAng_kikp
+                            *dis_ik[2]*r_ikp*r_ikp)/(r_ik*r_ik*r_ikp*r_ikp);
+                        dcA_kikp[0][1]=(dis_ik[0]*r_ik*r_ikp-cosAng_kikp
+                            *dis_ikp[0]*r_ik*r_ik)/(r_ik*r_ik*r_ikp*r_ikp);
+                        dcA_kikp[1][1]=(dis_ik[1]*r_ik*r_ikp-cosAng_kikp
+                            *dis_ikp[1]*r_ik*r_ik)/(r_ik*r_ik*r_ikp*r_ikp);
+                        dcA_kikp[2][1]=(dis_ik[2]*r_ik*r_ikp-cosAng_kikp
+                            *dis_ikp[2]*r_ik*r_ik)/(r_ik*r_ik*r_ikp*r_ikp);
+                      }
+                    } else {
+                      if(neigh_flag[temp_ikp]) {
+                        pass_ikp=1;
+                        dis_ikp[0]=disij[0][temp_ikp];
+                        dis_ikp[1]=disij[1][temp_ikp];
+                        dis_ikp[2]=disij[2][temp_ikp];
+                        r_ikp=rij[temp_ikp];
+                        betaS_ikp=betaS[temp_ikp];
+                        dBetaS_ikp=dBetaS[temp_ikp];
+                        betaP_ikp=betaP[temp_ikp];
+                        dBetaP_ikp=dBetaP[temp_ikp];
+                        nkikp=ltmp*(2*nlisti-ltmp-1)/2+(ktmp-ltmp)-1;
+                        if(jtmp<ltmp) {
+                          njikp=jtmp*(2*nlisti-jtmp-1)/2+(ltmp-jtmp)-1;
+                          nglj=0;
+                          ngl=1;
+                        }
+                        else {
+                          njikp=ltmp*(2*nlisti-ltmp-1)/2+(jtmp-ltmp)-1;
+                          nglj=1;
+                          ngl=0;
+                        }
+                        ang_jikp=cos_index[i]+njikp;
+                        cosAng_jikp=cosAng[ang_jikp];
+                        dcA_jikp[0][0]=dcAng[ang_jikp][0][nglj];
+                        dcA_jikp[1][0]=dcAng[ang_jikp][1][nglj];
+                        dcA_jikp[2][0]=dcAng[ang_jikp][2][nglj];
+                        dcA_jikp[0][1]=dcAng[ang_jikp][0][ngl];
+                        dcA_jikp[1][1]=dcAng[ang_jikp][1][ngl];
+                        dcA_jikp[2][1]=dcAng[ang_jikp][2][ngl];
+                        ang_kikp=cos_index[i]+nkikp;
+                        cosAng_kikp=cosAng[ang_kikp];
+                        dcA_kikp[0][0]=dcAng[ang_kikp][0][1];
+                        dcA_kikp[1][0]=dcAng[ang_kikp][1][1];
+                        dcA_kikp[2][0]=dcAng[ang_kikp][2][1];
+                        dcA_kikp[0][1]=dcAng[ang_kikp][0][0];
+                        dcA_kikp[1][1]=dcAng[ang_kikp][1][0];
+                        dcA_kikp[2][1]=dcAng[ang_kikp][2][0];
+                      }
+                    }
+                    if(pass_ikp==1) {
                       nb_ikp=nb_t;
                       nb_t++;
                       if(nb_t>nb_pi) {
@@ -7462,7 +4416,6 @@ void PairBOP::PiBo_otf()
 //2nd BB is third term of Eq. 38 (a) where j , k and k'=neighbors i
 
                       BB=BB+betaCapSum*angFactor4;
-
 //agpdpr1 is derivative of BB w.r.t. for atom i w.r.t. Beta(r_ik)
 //agpdpr2 is derivative of BB w.r.t. for atom i w.r.t. Beta(r_ik')
 //app1 is derivative of BB 3rd term w.r.t. cos(theta_kik')
@@ -7507,18 +4460,20 @@ void PairBOP::PiBo_otf()
                           agpdpr2*dis_ikp[2]
                           +app1*dcA_kikp[2][1]
                           +app3*dcA_jikp[2][1];
-                      }
                     }
                   }
-                nPiBk[n]=nPiBk[n]+1;
                 }
+                nPiBk=nPiBk+1;
               }
             }
+          }
 
 //j is a neighbor of i and k is a neighbor of j and equal to i
 
-          for(ki=0;ki<numneigh[j];ki++) {
-            k=jlist[ki];
+          for(ki=0;ki<nlistj;ki++) {
+            temp_ki=BOP_index[j]+ki;
+            ni_ki=neigh_index[temp_ki];
+            k=jlist[ni_ki];
             if(x[k][0]==x[i][0]) {
               if(x[k][1]==x[i][1]) {
                 if(x[k][2]==x[i][2]) {
@@ -7529,15 +4484,15 @@ void PairBOP::PiBo_otf()
           }
 
 //j is a neighbor of i and k is a neighbor of j not equal to i
-
-          for(ktmp=0;ktmp<numneigh[j];ktmp++) {
+          for(ktmp=0;ktmp<nlistj;ktmp++) {
             if(ktmp!=ki) {
               temp_jk=BOP_index[j]+ktmp;
-              k=jlist[ktmp];
+              ni_jk=neigh_index[temp_jk];
+              k=jlist[ni_jk];
               ktype=map[type[k]]+1;
               pi_flag=0;
-              for(nsearch=0;nsearch<nPiBk[n];nsearch++) {
-                ncmp=itypePiBk[n][nsearch];
+              for(nsearch=0;nsearch<nPiBk;nsearch++) {
+                ncmp=itypePiBk[nsearch];
                 if(x[ncmp][0]==x[k][0]) {
                   if(x[ncmp][1]==x[k][1]) {
                     if(x[ncmp][2]==x[k][2]) {
@@ -7548,7 +4503,7 @@ void PairBOP::PiBo_otf()
                 }
               }
               if(pi_flag==0) {
-                itypePiBk[n][nPiBk[n]]=k;
+                itypePiBk[nPiBk]=k;
               }
               if(jtype==ktype)
                 ijk=jtype-1;
@@ -7556,43 +4511,79 @@ void PairBOP::PiBo_otf()
                 ijk=jtype*bop_types-jtype*(jtype+1)/2+ktype-1;
               else
                 ijk=ktype*bop_types-ktype*(ktype+1)/2+jtype-1;
-              dis_jk[0]=x[k][0]-x[j][0];
-              dis_jk[1]=x[k][1]-x[j][1];
-              dis_jk[2]=x[k][2]-x[j][2];
-              rsq_jk=dis_jk[0]*dis_jk[0]
-                  +dis_jk[1]*dis_jk[1]
-                  +dis_jk[2]*dis_jk[2];
-              r_jk=sqrt(rsq_jk);
-              if(r_jk<=rcut[ijk]) {
-                ps=r_jk*rdr[ijk]+1.0;
-                ks=(int)ps;
-                if(nr-1<ks)
-                  ks=nr-1;
-                ps=ps-ks;
-                if(ps>1.0)
-                  ps=1.0;
-                betaS_jk=((pBetaS3[ijk][ks-1]*ps+pBetaS2[ijk][ks-1])*ps
-                    +pBetaS1[ijk][ks-1])*ps+pBetaS[ijk][ks-1];
-                dBetaS_jk=(pBetaS6[ijk][ks-1]*ps+pBetaS5[ijk][ks-1])*ps
-                    +pBetaS4[ijk][ks-1];
-                betaP_jk=((pBetaP3[ijk][ks-1]*ps+pBetaP2[ijk][ks-1])*ps
-                    +pBetaP1[ijk][ks-1])*ps+pBetaP[ijk][ks-1];
-                dBetaP_jk=(pBetaP6[ijk][ks-1]*ps+pBetaP5[ijk][ks-1])*ps
-                    +pBetaP4[ijk][ks-1];
-                cosAng_ijk=(-dis_ij[0]*dis_jk[0]-dis_ij[1]*dis_jk[1]
-                    -dis_ij[2]*dis_jk[2])/(r_ij*r_jk);
-                dcA_ijk[0][0]=(dis_jk[0]*r_ij*r_jk-cosAng_ijk
-                    *-dis_ij[0]*r_jk*r_jk)/(r_ij*r_ij*r_jk*r_jk);
-                dcA_ijk[1][0]=(dis_jk[1]*r_ij*r_jk-cosAng_ijk
-                    *-dis_ij[1]*r_jk*r_jk)/(r_ij*r_ij*r_jk*r_jk);
-                dcA_ijk[2][0]=(dis_jk[2]*r_ij*r_jk-cosAng_ijk
-                    *-dis_ij[2]*r_jk*r_jk)/(r_ij*r_ij*r_jk*r_jk);
-                dcA_ijk[0][1]=(-dis_ij[0]*r_ij*r_jk-cosAng_ijk
-                    *dis_jk[0]*r_ij*r_ij)/(r_ij*r_ij*r_jk*r_jk);
-                dcA_ijk[1][1]=(-dis_ij[1]*r_ij*r_jk-cosAng_ijk
-                    *dis_jk[1]*r_ij*r_ij)/(r_ij*r_ij*r_jk*r_jk);
-                dcA_ijk[2][1]=(-dis_ij[2]*r_ij*r_jk-cosAng_ijk
-                    *dis_jk[2]*r_ij*r_ij)/(r_ij*r_ij*r_jk*r_jk);
+              pass_jk=0;
+              if(otfly==1) {
+                dis_jk[0]=x[k][0]-x[j][0];
+                dis_jk[1]=x[k][1]-x[j][1];
+                dis_jk[2]=x[k][2]-x[j][2];
+                rsq_jk=dis_jk[0]*dis_jk[0]
+                    +dis_jk[1]*dis_jk[1]
+                    +dis_jk[2]*dis_jk[2];
+                r_jk=sqrt(rsq_jk);
+                if(r_jk<=rcut[ijk]) {
+                  pass_jk=1;
+                  ps=r_jk*rdr[ijk]+1.0;
+                  ks=(int)ps;
+                  if(nr-1<ks)
+                    ks=nr-1;
+                  ps=ps-ks;
+                  if(ps>1.0)
+                    ps=1.0;
+                  betaS_jk=((pBetaS3[ijk][ks-1]*ps+pBetaS2[ijk][ks-1])*ps
+                      +pBetaS1[ijk][ks-1])*ps+pBetaS[ijk][ks-1];
+                  dBetaS_jk=(pBetaS6[ijk][ks-1]*ps+pBetaS5[ijk][ks-1])*ps
+                      +pBetaS4[ijk][ks-1];
+                  betaP_jk=((pBetaP3[ijk][ks-1]*ps+pBetaP2[ijk][ks-1])*ps
+                      +pBetaP1[ijk][ks-1])*ps+pBetaP[ijk][ks-1];
+                  dBetaP_jk=(pBetaP6[ijk][ks-1]*ps+pBetaP5[ijk][ks-1])*ps
+                      +pBetaP4[ijk][ks-1];
+                  cosAng_ijk=(-dis_ij[0]*dis_jk[0]-dis_ij[1]*dis_jk[1]
+                      -dis_ij[2]*dis_jk[2])/(r_ij*r_jk);
+                  dcA_ijk[0][0]=(dis_jk[0]*r_ij*r_jk-cosAng_ijk
+                      *-dis_ij[0]*r_jk*r_jk)/(r_ij*r_ij*r_jk*r_jk);
+                  dcA_ijk[1][0]=(dis_jk[1]*r_ij*r_jk-cosAng_ijk
+                      *-dis_ij[1]*r_jk*r_jk)/(r_ij*r_ij*r_jk*r_jk);
+                  dcA_ijk[2][0]=(dis_jk[2]*r_ij*r_jk-cosAng_ijk
+                      *-dis_ij[2]*r_jk*r_jk)/(r_ij*r_ij*r_jk*r_jk);
+                  dcA_ijk[0][1]=(-dis_ij[0]*r_ij*r_jk-cosAng_ijk
+                      *dis_jk[0]*r_ij*r_ij)/(r_ij*r_ij*r_jk*r_jk);
+                  dcA_ijk[1][1]=(-dis_ij[1]*r_ij*r_jk-cosAng_ijk
+                      *dis_jk[1]*r_ij*r_ij)/(r_ij*r_ij*r_jk*r_jk);
+                  dcA_ijk[2][1]=(-dis_ij[2]*r_ij*r_jk-cosAng_ijk
+                      *dis_jk[2]*r_ij*r_ij)/(r_ij*r_ij*r_jk*r_jk);
+                }
+              } else {
+                if(neigh_flag[temp_jk]) {
+                  pass_jk=1;
+                  dis_jk[0]=disij[0][temp_jk];
+                  dis_jk[1]=disij[1][temp_jk];
+                  dis_jk[2]=disij[2][temp_jk];
+                  r_jk=rij[temp_jk];
+                  betaS_jk=betaS[temp_jk];
+                  dBetaS_jk=dBetaS[temp_jk];
+                  betaP_jk=betaP[temp_jk];
+                  dBetaP_jk=dBetaP[temp_jk];
+                  if(ktmp<ki) {
+                    nijk=ktmp*(2*nlistj-ktmp-1)/2+(ki-ktmp)-1;
+                    ngi=1;
+                    ngk=0;
+                  }
+                  else {
+                    nijk=ki*(2*nlistj-ki-1)/2+(ktmp-ki)-1;
+                    ngi=0;
+                    ngk=1;
+                  }
+                  ang_ijk=cos_index[j]+nijk;
+                  cosAng_ijk=cosAng[ang_ijk];
+                  dcA_ijk[0][0]=dcAng[ang_ijk][0][ngi];
+                  dcA_ijk[1][0]=dcAng[ang_ijk][1][ngi];
+                  dcA_ijk[2][0]=dcAng[ang_ijk][2][ngi];
+                  dcA_ijk[0][1]=dcAng[ang_ijk][0][ngk];
+                  dcA_ijk[1][1]=dcAng[ang_ijk][1][ngk];
+                  dcA_ijk[2][1]=dcAng[ang_ijk][2][ngk];
+                }
+              }
+              if(pass_jk==1) {
                 nb_jk=nb_t;
                 nb_t++;
                 if(nb_t>nb_pi) {
@@ -7646,94 +4637,140 @@ void PairBOP::PiBo_otf()
                     +app1*dcA_ijk[0][1];
                 bt_pi[nb_jk].dAA[1]+=
                     agpdpr1*dis_jk[1]
-                    +app1*dcA_ijk[1][1];
-                bt_pi[nb_jk].dAA[2]+=
-                    agpdpr1*dis_jk[2]
-                    +app1*dcA_ijk[2][1];
-                bt_pi[nb_jk].dBB[0]+=
-                    app2*dcA_ijk[0][1]
-                    +agpdpr2*dis_jk[0];
-                bt_pi[nb_jk].dBB[1]+=
-                    app2*dcA_ijk[1][1]
-                    +agpdpr2*dis_jk[1];
-                bt_pi[nb_jk].dBB[2]+=
-                    app2*dcA_ijk[2][1]
-                    +agpdpr2*dis_jk[2];
-
-//j is a neighbor of i and k and k' are different neighbors of j not equal to i
-
-                for(ltmp=0;ltmp<ktmp;ltmp++) {
-                  if(ltmp!=ki) {
-                    temp_jkp=BOP_index[j]+ltmp;
-                    kp=jlist[ltmp];
-                    kptype=map[type[kp]]+1;
-                    for(nsearch=0;nsearch<nPiBk[n];nsearch++) {
-                      ncmp=itypePiBk[n][nsearch];
-                      if(x[ncmp][0]==x[kp][0]) {
-                        if(x[ncmp][1]==x[kp][1]) {
-                          if(x[ncmp][2]==x[kp][2]) {
-                            break;
-                          }
-                        }
-                      }
-                    }
-                    if(jtype==kptype)
-                      ijkp=jtype-1;
-                    else if(jtype<kptype)
-                      ijkp=jtype*bop_types-jtype*(jtype+1)/2+kptype-1;
-                    else
-                      ijkp=kptype*bop_types-kptype*(kptype+1)/2+jtype-1;
-                    dis_jkp[0]=x[kp][0]-x[j][0];
-                    dis_jkp[1]=x[kp][1]-x[j][1];
-                    dis_jkp[2]=x[kp][2]-x[j][2];
-                    rsq_jkp=dis_jkp[0]*dis_jkp[0]
-                        +dis_jkp[1]*dis_jkp[1]
-                        +dis_jkp[2]*dis_jkp[2];
-                    r_jkp=sqrt(rsq_jkp);
-                    if(r_jkp<=rcut[ijkp]) {
-                      ps=r_jkp*rdr[ijkp]+1.0;
-                      ks=(int)ps;
-                      if(nr-1<ks)
-                        ks=nr-1;
-                      ps=ps-ks;
-                      if(ps>1.0)
-                        ps=1.0;
-                      betaS_jkp=((pBetaS3[ijkp][ks-1]*ps+pBetaS2[ijkp][ks-1])*ps
-                          +pBetaS1[ijkp][ks-1])*ps+pBetaS[ijkp][ks-1];
-                      dBetaS_jkp=(pBetaS6[ijkp][ks-1]*ps+pBetaS5[ijkp][ks-1])*ps
-                          +pBetaS4[ijkp][ks-1];
-                      betaP_jkp=((pBetaP3[ijkp][ks-1]*ps+pBetaP2[ijkp][ks-1])*ps
-                          +pBetaP1[ijkp][ks-1])*ps+pBetaP[ijkp][ks-1];
-                      dBetaP_jkp=(pBetaP6[ijkp][ks-1]*ps+pBetaP5[ijkp][ks-1])*ps
-                          +pBetaP4[ijkp][ks-1];
-                      cosAng_ijkp=(-dis_ij[0]*dis_jkp[0]-dis_ij[1]*dis_jkp[1]
-                          -dis_ij[2]*dis_jkp[2])/(r_ij*r_jkp);
-                      dcA_ijkp[0][0]=(dis_jkp[0]*r_ij*r_jkp-cosAng_ijkp
-                          *-dis_ij[0]*r_jkp*r_jkp)/(r_ij*r_ij*r_jkp*r_jkp);
-                      dcA_ijkp[1][0]=(dis_jkp[1]*r_ij*r_jkp-cosAng_ijkp
-                          *-dis_ij[1]*r_jkp*r_jkp)/(r_ij*r_ij*r_jkp*r_jkp);
-                      dcA_ijkp[2][0]=(dis_jkp[2]*r_ij*r_jkp-cosAng_ijkp
-                          *-dis_ij[2]*r_jkp*r_jkp)/(r_ij*r_ij*r_jkp*r_jkp);
-                      dcA_ijkp[0][1]=(-dis_ij[0]*r_ij*r_jkp-cosAng_ijkp
-                          *dis_jkp[0]*r_ij*r_ij)/(r_ij*r_ij*r_jkp*r_jkp);
-                      dcA_ijkp[1][1]=(-dis_ij[1]*r_ij*r_jkp-cosAng_ijkp
-                          *dis_jkp[1]*r_ij*r_ij)/(r_ij*r_ij*r_jkp*r_jkp);
-                      dcA_ijkp[2][1]=(-dis_ij[2]*r_ij*r_jkp-cosAng_ijkp
-                          *dis_jkp[2]*r_ij*r_ij)/(r_ij*r_ij*r_jkp*r_jkp);
-                      cosAng_kjkp=(dis_jk[0]*dis_jkp[0]+dis_jk[1]*dis_jkp[1]
-                          +dis_jk[2]*dis_jkp[2])/(r_jk*r_jkp);
-                      dcA_kjkp[0][0]=(dis_jkp[0]*r_jk*r_jkp-cosAng_kjkp
-                          *dis_jk[0]*r_jkp*r_jkp)/(r_jk*r_jk*r_jkp*r_jkp);
-                      dcA_kjkp[1][0]=(dis_jkp[1]*r_jk*r_jkp-cosAng_kjkp
-                          *dis_jk[1]*r_jkp*r_jkp)/(r_jk*r_jk*r_jkp*r_jkp);
-                      dcA_kjkp[2][0]=(dis_jkp[2]*r_jk*r_jkp-cosAng_kjkp
-                          *dis_jk[2]*r_jkp*r_jkp)/(r_jk*r_jk*r_jkp*r_jkp);
-                      dcA_kjkp[0][1]=(dis_jk[0]*r_jk*r_jkp-cosAng_kjkp
-                          *dis_jkp[0]*r_jk*r_jk)/(r_jk*r_jk*r_jkp*r_jkp);
-                      dcA_kjkp[1][1]=(dis_jk[1]*r_jk*r_jkp-cosAng_kjkp
-                          *dis_jkp[1]*r_jk*r_jk)/(r_jk*r_jk*r_jkp*r_jkp);
-                      dcA_kjkp[2][1]=(dis_jk[2]*r_jk*r_jkp-cosAng_kjkp
-                          *dis_jkp[2]*r_jk*r_jk)/(r_jk*r_jk*r_jkp*r_jkp);
+                    +app1*dcA_ijk[1][1];
+                bt_pi[nb_jk].dAA[2]+=
+                    agpdpr1*dis_jk[2]
+                    +app1*dcA_ijk[2][1];
+                bt_pi[nb_jk].dBB[0]+=
+                    app2*dcA_ijk[0][1]
+                    +agpdpr2*dis_jk[0];
+                bt_pi[nb_jk].dBB[1]+=
+                    app2*dcA_ijk[1][1]
+                    +agpdpr2*dis_jk[1];
+                bt_pi[nb_jk].dBB[2]+=
+                    app2*dcA_ijk[2][1]
+                    +agpdpr2*dis_jk[2];
+
+//j is a neighbor of i and k and k' are different neighbors of j not equal to i
+
+                for(ltmp=0;ltmp<ktmp;ltmp++) {
+                  if(ltmp!=ki) {
+                    temp_jkp=BOP_index[j]+ltmp;
+                    ni_jkp=neigh_index[temp_jkp];
+                    kp=jlist[ni_jkp];
+                    kptype=map[type[kp]]+1;
+                    for(nsearch=0;nsearch<nPiBk;nsearch++) {
+                      ncmp=itypePiBk[nsearch];
+                      if(x[ncmp][0]==x[kp][0]) {
+                        if(x[ncmp][1]==x[kp][1]) {
+                          if(x[ncmp][2]==x[kp][2]) {
+                            break;
+                          }
+                        }
+                      }
+                    }
+                    if(jtype==kptype)
+                      ijkp=jtype-1;
+                    else if(jtype<kptype)
+                      ijkp=jtype*bop_types-jtype*(jtype+1)/2+kptype-1;
+                    else
+                      ijkp=kptype*bop_types-kptype*(kptype+1)/2+jtype-1;
+                    pass_jkp=0;
+                    if(otfly==1) {
+                      dis_jkp[0]=x[kp][0]-x[j][0];
+                      dis_jkp[1]=x[kp][1]-x[j][1];
+                      dis_jkp[2]=x[kp][2]-x[j][2];
+                      rsq_jkp=dis_jkp[0]*dis_jkp[0]
+                          +dis_jkp[1]*dis_jkp[1]
+                          +dis_jkp[2]*dis_jkp[2];
+                      r_jkp=sqrt(rsq_jkp);
+                      if(r_jkp<=rcut[ijkp]) {
+                        pass_jkp=1;
+                        ps=r_jkp*rdr[ijkp]+1.0;
+                        ks=(int)ps;
+                        if(nr-1<ks)
+                          ks=nr-1;
+                        ps=ps-ks;
+                        if(ps>1.0)
+                          ps=1.0;
+                        betaS_jkp=((pBetaS3[ijkp][ks-1]*ps+pBetaS2[ijkp][ks-1])*ps
+                            +pBetaS1[ijkp][ks-1])*ps+pBetaS[ijkp][ks-1];
+                        dBetaS_jkp=(pBetaS6[ijkp][ks-1]*ps+pBetaS5[ijkp][ks-1])*ps
+                            +pBetaS4[ijkp][ks-1];
+                        betaP_jkp=((pBetaP3[ijkp][ks-1]*ps+pBetaP2[ijkp][ks-1])*ps
+                            +pBetaP1[ijkp][ks-1])*ps+pBetaP[ijkp][ks-1];
+                        dBetaP_jkp=(pBetaP6[ijkp][ks-1]*ps+pBetaP5[ijkp][ks-1])*ps
+                            +pBetaP4[ijkp][ks-1];
+                        cosAng_ijkp=(-dis_ij[0]*dis_jkp[0]-dis_ij[1]*dis_jkp[1]
+                            -dis_ij[2]*dis_jkp[2])/(r_ij*r_jkp);
+                        dcA_ijkp[0][0]=(dis_jkp[0]*r_ij*r_jkp-cosAng_ijkp
+                            *-dis_ij[0]*r_jkp*r_jkp)/(r_ij*r_ij*r_jkp*r_jkp);
+                        dcA_ijkp[1][0]=(dis_jkp[1]*r_ij*r_jkp-cosAng_ijkp
+                            *-dis_ij[1]*r_jkp*r_jkp)/(r_ij*r_ij*r_jkp*r_jkp);
+                        dcA_ijkp[2][0]=(dis_jkp[2]*r_ij*r_jkp-cosAng_ijkp
+                            *-dis_ij[2]*r_jkp*r_jkp)/(r_ij*r_ij*r_jkp*r_jkp);
+                        dcA_ijkp[0][1]=(-dis_ij[0]*r_ij*r_jkp-cosAng_ijkp
+                            *dis_jkp[0]*r_ij*r_ij)/(r_ij*r_ij*r_jkp*r_jkp);
+                        dcA_ijkp[1][1]=(-dis_ij[1]*r_ij*r_jkp-cosAng_ijkp
+                            *dis_jkp[1]*r_ij*r_ij)/(r_ij*r_ij*r_jkp*r_jkp);
+                        dcA_ijkp[2][1]=(-dis_ij[2]*r_ij*r_jkp-cosAng_ijkp
+                            *dis_jkp[2]*r_ij*r_ij)/(r_ij*r_ij*r_jkp*r_jkp);
+                        cosAng_kjkp=(dis_jk[0]*dis_jkp[0]+dis_jk[1]*dis_jkp[1]
+                            +dis_jk[2]*dis_jkp[2])/(r_jk*r_jkp);
+                        dcA_kjkp[0][0]=(dis_jkp[0]*r_jk*r_jkp-cosAng_kjkp
+                            *dis_jk[0]*r_jkp*r_jkp)/(r_jk*r_jk*r_jkp*r_jkp);
+                        dcA_kjkp[1][0]=(dis_jkp[1]*r_jk*r_jkp-cosAng_kjkp
+                            *dis_jk[1]*r_jkp*r_jkp)/(r_jk*r_jk*r_jkp*r_jkp);
+                        dcA_kjkp[2][0]=(dis_jkp[2]*r_jk*r_jkp-cosAng_kjkp
+                            *dis_jk[2]*r_jkp*r_jkp)/(r_jk*r_jk*r_jkp*r_jkp);
+                        dcA_kjkp[0][1]=(dis_jk[0]*r_jk*r_jkp-cosAng_kjkp
+                            *dis_jkp[0]*r_jk*r_jk)/(r_jk*r_jk*r_jkp*r_jkp);
+                        dcA_kjkp[1][1]=(dis_jk[1]*r_jk*r_jkp-cosAng_kjkp
+                            *dis_jkp[1]*r_jk*r_jk)/(r_jk*r_jk*r_jkp*r_jkp);
+                        dcA_kjkp[2][1]=(dis_jk[2]*r_jk*r_jkp-cosAng_kjkp
+                            *dis_jkp[2]*r_jk*r_jk)/(r_jk*r_jk*r_jkp*r_jkp);
+                      }
+                    } else {
+                      if(neigh_flag[temp_jkp]) {
+                        pass_jkp=1;
+                        dis_jkp[0]=disij[0][temp_jkp];
+                        dis_jkp[1]=disij[1][temp_jkp];
+                        dis_jkp[2]=disij[2][temp_jkp];
+                        r_jkp=rij[temp_jkp];
+                        betaS_jkp=betaS[temp_jkp];
+                        dBetaS_jkp=dBetaS[temp_jkp];
+                        betaP_jkp=betaP[temp_jkp];
+                        dBetaP_jkp=dBetaP[temp_jkp];
+                        nkjkp=ltmp*(2*nlistj-ltmp-1)/2+(ktmp-ltmp)-1;
+                        if(ki<ltmp) {
+                          nijkp=ki*(2*nlistj-ki-1)/2+(ltmp-ki)-1;
+                          ngli=0;
+                          ngl=1;
+                        }
+                        else {
+                          nijkp=ltmp*(2*nlistj-ltmp-1)/2+(ki-ltmp)-1;
+                          ngli=1;
+                          ngl=0;
+                        }
+                        ang_ijkp=cos_index[j]+nijkp;
+                        cosAng_ijkp=cosAng[ang_ijkp];
+                        dcA_ijkp[0][0]=dcAng[ang_ijkp][0][ngli];
+                        dcA_ijkp[1][0]=dcAng[ang_ijkp][1][ngli];
+                        dcA_ijkp[2][0]=dcAng[ang_ijkp][2][ngli];
+                        dcA_ijkp[0][1]=dcAng[ang_ijkp][0][ngl];
+                        dcA_ijkp[1][1]=dcAng[ang_ijkp][1][ngl];
+                        dcA_ijkp[2][1]=dcAng[ang_ijkp][2][ngl];
+                        ang_kjkp=cos_index[j]+nkjkp;
+                        cosAng_kjkp=cosAng[ang_kjkp];
+                        dcA_kjkp[0][0]=dcAng[ang_kjkp][0][1];
+                        dcA_kjkp[1][0]=dcAng[ang_kjkp][1][1];
+                        dcA_kjkp[2][0]=dcAng[ang_kjkp][2][1];
+                        dcA_kjkp[0][1]=dcAng[ang_kjkp][0][0];
+                        dcA_kjkp[1][1]=dcAng[ang_kjkp][1][0];
+                        dcA_kjkp[2][1]=dcAng[ang_kjkp][2][0];
+                      }
+                    }
+                    if(pass_jkp) {
                       nb_jkp=nb_t;
                       nb_t++;
                       if(nb_t>nb_pi) {
@@ -7741,26 +4778,26 @@ void PairBOP::PiBo_otf()
                         grow_pi(nb_pi,new_n_tot);
                         nb_pi=new_n_tot;
                       }
-                    bt_pi[nb_jkp].i=j;
-                    bt_pi[nb_jkp].j=kp;
-                    bt_pi[nb_jkp].temp=temp_jkp;
-                    betaCapSq2=pi_p[jtype-1]*betaS_jkp*betaS_jkp
-                      -betaP_jkp*betaP_jkp;
-                    dbetaCapSq2=2.0*pi_p[jtype-1]*betaS_jkp*dBetaS_jkp
-                      -2.0*betaP_jkp*dBetaP_jkp;
-                    cosSq1=cosAng_ijkp*cosAng_ijkp;
-                    angFactor=cosAng_kjkp-cosAng_ijkp*cosAng_ijk;
-                    angFactor1=4.0*angFactor;
-                    angFactor2=-angFactor1*cosAng_ijkp
-                      +2.0*cosAng_ijk*(1.0-cosSq1);
-                    angFactor3=-angFactor1*cosAng_ijk
-                      +2.0*cosAng_ijkp*(1.0-cosSq);
-                    angFactor4=2.0*angFactor*angFactor-(1.0-cosSq)*(1.0-cosSq1);
-                      betaCapSum=.5*betaCapSq1*betaCapSq2;
-
+                      bt_pi[nb_jkp].i=j;
+                      bt_pi[nb_jkp].j=kp;
+                      bt_pi[nb_jkp].temp=temp_jkp;
+                      betaCapSq2=pi_p[jtype-1]*betaS_jkp*betaS_jkp
+                        -betaP_jkp*betaP_jkp;
+                      dbetaCapSq2=2.0*pi_p[jtype-1]*betaS_jkp*dBetaS_jkp
+                        -2.0*betaP_jkp*dBetaP_jkp;
+                      cosSq1=cosAng_ijkp*cosAng_ijkp;
+                      angFactor=cosAng_kjkp-cosAng_ijkp*cosAng_ijk;
+                      angFactor1=4.0*angFactor;
+                      angFactor2=-angFactor1*cosAng_ijkp
+                        +2.0*cosAng_ijk*(1.0-cosSq1);
+                      angFactor3=-angFactor1*cosAng_ijk
+                        +2.0*cosAng_ijkp*(1.0-cosSq);
+                      angFactor4=2.0*angFactor*angFactor-(1.0-cosSq)*(1.0-cosSq1);
+                        betaCapSum=.5*betaCapSq1*betaCapSq2;
+  
 //4th BB is 4th term of Eq. 38 (a) where i , k and k' =neighbors j
 
-                    BB=BB+betaCapSum*angFactor4;
+                      BB=BB+betaCapSum*angFactor4;
 
 //app1 is derivative of BB 4th term w.r.t. cos(theta_kjk')
 //app2 is derivative of BB 4th term w.r.t. cos(theta_ijk)
@@ -7768,57 +4805,58 @@ void PairBOP::PiBo_otf()
 //agpdpr1 is derivative of BB 4th term for atom j w.r.t. Beta(r_jk)
 //agpdpr2 is derivative of BB 4th term for atom j w.r.t. Beta(r_jk')
 
-                    app1=betaCapSum*angFactor1;
-                    app2=betaCapSum*angFactor2;
-                    app3=betaCapSum*angFactor3;
-                    agpdpr1=.5*angFactor4*dbetaCapSq1*betaCapSq2/r_jk;
-                    agpdpr2=.5*angFactor4*betaCapSq1*dbetaCapSq2/r_jkp;
-                    bt_pi[nb_ij].dBB[0]-=
-                      app3*dcA_ijkp[0][0]
-                      +app2*dcA_ijk[0][0];
-                    bt_pi[nb_ij].dBB[1]-=
-                      app3*dcA_ijkp[1][0]
-                      +app2*dcA_ijk[1][0];
-                    bt_pi[nb_ij].dBB[2]-=
-                      app3*dcA_ijkp[2][0]
-                      +app2*dcA_ijk[2][0];
-                    bt_pi[nb_jk].dBB[0]+=
-                      agpdpr1*dis_jk[0]
-                      +app1*dcA_kjkp[0][0]
-                      +app2*dcA_ijk[0][1];
-                    bt_pi[nb_jk].dBB[1]+=
-                      agpdpr1*dis_jk[1]
-                      +app1*dcA_kjkp[1][0]
-                      +app2*dcA_ijk[1][1];
-                    bt_pi[nb_jk].dBB[2]+=
-                      agpdpr1*dis_jk[2]
-                      +app1*dcA_kjkp[2][0]
-                      +app2*dcA_ijk[2][1];
-                    bt_pi[nb_jkp].dBB[0]+=
-                      agpdpr2*dis_jkp[0]
-                      +app1*dcA_kjkp[0][1]
-                      +app3*dcA_ijkp[0][1];
-                    bt_pi[nb_jkp].dBB[1]+=
-                      agpdpr2*dis_jkp[1]
-                      +app1*dcA_kjkp[1][1]
-                      +app3*dcA_ijkp[1][1];
-                    bt_pi[nb_jkp].dBB[2]+=
-                      agpdpr2*dis_jkp[2]
-                      +app1*dcA_kjkp[2][1]
-                      +app3*dcA_ijkp[2][1];
+                      app1=betaCapSum*angFactor1;
+                      app2=betaCapSum*angFactor2;
+                      app3=betaCapSum*angFactor3;
+                      agpdpr1=.5*angFactor4*dbetaCapSq1*betaCapSq2/r_jk;
+                      agpdpr2=.5*angFactor4*betaCapSq1*dbetaCapSq2/r_jkp;
+                      bt_pi[nb_ij].dBB[0]-=
+                          app3*dcA_ijkp[0][0]
+                          +app2*dcA_ijk[0][0];
+                      bt_pi[nb_ij].dBB[1]-=
+                          app3*dcA_ijkp[1][0]
+                          +app2*dcA_ijk[1][0];
+                      bt_pi[nb_ij].dBB[2]-=
+                          app3*dcA_ijkp[2][0]
+                          +app2*dcA_ijk[2][0];
+                      bt_pi[nb_jk].dBB[0]+=
+                          agpdpr1*dis_jk[0]
+                          +app1*dcA_kjkp[0][0]
+                          +app2*dcA_ijk[0][1];
+                      bt_pi[nb_jk].dBB[1]+=
+                          agpdpr1*dis_jk[1]
+                          +app1*dcA_kjkp[1][0]
+                          +app2*dcA_ijk[1][1];
+                      bt_pi[nb_jk].dBB[2]+=
+                          agpdpr1*dis_jk[2]
+                          +app1*dcA_kjkp[2][0]
+                          +app2*dcA_ijk[2][1];
+                      bt_pi[nb_jkp].dBB[0]+=
+                          agpdpr2*dis_jkp[0]
+                          +app1*dcA_kjkp[0][1]
+                          +app3*dcA_ijkp[0][1];
+                      bt_pi[nb_jkp].dBB[1]+=
+                          agpdpr2*dis_jkp[1]
+                          +app1*dcA_kjkp[1][1]
+                          +app3*dcA_ijkp[1][1];
+                      bt_pi[nb_jkp].dBB[2]+=
+                          agpdpr2*dis_jkp[2]
+                          +app1*dcA_kjkp[2][1]
+                          +app3*dcA_ijkp[2][1];
                     }
                   }
                 }
 
 //j and k' are different neighbors of i and k is a neighbor of j not equal to i
 
-                for(ltmp=0;ltmp<numneigh[i];ltmp++) {
+                for(ltmp=0;ltmp<nlisti;ltmp++) {
                   if(ltmp!=jtmp) {
                     temp_ikp=BOP_index[i]+ltmp;
-                    kp=iilist[ltmp];
+                    ni_ikp=neigh_index[temp_ikp];
+                    kp=iilist[ni_ikp];
                     kptype=map[type[kp]]+1;
-                    for(nsearch=0;nsearch<nPiBk[n];nsearch++) {
-                      ncmp=itypePiBk[n][nsearch];
+                    for(nsearch=0;nsearch<nPiBk;nsearch++) {
+                      ncmp=itypePiBk[nsearch];
                       if(x[ncmp][0]==x[kp][0]) {
                         if(x[ncmp][1]==x[kp][1]) {
                           if(x[ncmp][2]==x[kp][2]) {
@@ -7833,43 +4871,79 @@ void PairBOP::PiBo_otf()
                       iikp=itype*bop_types-itype*(itype+1)/2+kptype-1;
                     else
                       iikp=kptype*bop_types-kptype*(kptype+1)/2+itype-1;
-                    dis_ikp[0]=x[kp][0]-x[i][0];
-                    dis_ikp[1]=x[kp][1]-x[i][1];
-                    dis_ikp[2]=x[kp][2]-x[i][2];
-                    rsq_ikp=dis_ikp[0]*dis_ikp[0]
-                        +dis_ikp[1]*dis_ikp[1]
-                        +dis_ikp[2]*dis_ikp[2];
-                    r_ikp=sqrt(rsq_ikp);
-                    if(r_ikp<=rcut[iikp]) {
-                      ps=r_ikp*rdr[iikp]+1.0;
-                      ks=(int)ps;
-                      if(nr-1<ks)
-                        ks=nr-1;
-                      ps=ps-ks;
-                      if(ps>1.0)
-                        ps=1.0;
-                      betaS_ikp=((pBetaS3[iikp][ks-1]*ps+pBetaS2[iikp][ks-1])*ps
-                          +pBetaS1[iikp][ks-1])*ps+pBetaS[iikp][ks-1];
-                      dBetaS_ikp=(pBetaS6[iikp][ks-1]*ps+pBetaS5[iikp][ks-1])*ps
-                          +pBetaS4[iikp][ks-1];
-                      betaP_ikp=((pBetaP3[iikp][ks-1]*ps+pBetaP2[iikp][ks-1])*ps
-                          +pBetaP1[iikp][ks-1])*ps+pBetaP[iikp][ks-1];
-                      dBetaP_ikp=(pBetaP6[iikp][ks-1]*ps+pBetaP5[iikp][ks-1])*ps
-                          +pBetaP4[iikp][ks-1];
-                      cosAng_jikp=(dis_ij[0]*dis_ikp[0]+dis_ij[1]*dis_ikp[1]
-                          +dis_ij[2]*dis_ikp[2])/(r_ij*r_ikp);
-                      dcA_jikp[0][0]=(dis_ikp[0]*r_ij*r_ikp-cosAng_jikp
-                          *dis_ij[0]*r_ikp*r_ikp)/(r_ij*r_ij*r_ikp*r_ikp);
-                      dcA_jikp[1][0]=(dis_ikp[1]*r_ij*r_ikp-cosAng_jikp
-                          *dis_ij[1]*r_ikp*r_ikp)/(r_ij*r_ij*r_ikp*r_ikp);
-                      dcA_jikp[2][0]=(dis_ikp[2]*r_ij*r_ikp-cosAng_jikp
-                          *dis_ij[2]*r_ikp*r_ikp)/(r_ij*r_ij*r_ikp*r_ikp);
-                      dcA_jikp[0][1]=(dis_ij[0]*r_ij*r_ikp-cosAng_jikp
-                          *dis_ikp[0]*r_ij*r_ij)/(r_ij*r_ij*r_ikp*r_ikp);
-                      dcA_jikp[1][1]=(dis_ij[1]*r_ij*r_ikp-cosAng_jikp
-                          *dis_ikp[1]*r_ij*r_ij)/(r_ij*r_ij*r_ikp*r_ikp);
-                      dcA_jikp[2][1]=(dis_ij[2]*r_ij*r_ikp-cosAng_jikp
-                          *dis_ikp[2]*r_ij*r_ij)/(r_ij*r_ij*r_ikp*r_ikp);
+                    pass_ikp=0;
+                    if(otfly==1) {
+                      dis_ikp[0]=x[kp][0]-x[i][0];
+                      dis_ikp[1]=x[kp][1]-x[i][1];
+                      dis_ikp[2]=x[kp][2]-x[i][2];
+                      rsq_ikp=dis_ikp[0]*dis_ikp[0]
+                          +dis_ikp[1]*dis_ikp[1]
+                          +dis_ikp[2]*dis_ikp[2];
+                      r_ikp=sqrt(rsq_ikp);
+                      if(r_ikp<=rcut[iikp]) {
+                        pass_ikp=1;
+                        ps=r_ikp*rdr[iikp]+1.0;
+                        ks=(int)ps;
+                        if(nr-1<ks)
+                          ks=nr-1;
+                        ps=ps-ks;
+                        if(ps>1.0)
+                          ps=1.0;
+                        betaS_ikp=((pBetaS3[iikp][ks-1]*ps+pBetaS2[iikp][ks-1])*ps
+                            +pBetaS1[iikp][ks-1])*ps+pBetaS[iikp][ks-1];
+                        dBetaS_ikp=(pBetaS6[iikp][ks-1]*ps+pBetaS5[iikp][ks-1])*ps
+                            +pBetaS4[iikp][ks-1];
+                        betaP_ikp=((pBetaP3[iikp][ks-1]*ps+pBetaP2[iikp][ks-1])*ps
+                            +pBetaP1[iikp][ks-1])*ps+pBetaP[iikp][ks-1];
+                        dBetaP_ikp=(pBetaP6[iikp][ks-1]*ps+pBetaP5[iikp][ks-1])*ps
+                            +pBetaP4[iikp][ks-1];
+                        cosAng_jikp=(dis_ij[0]*dis_ikp[0]+dis_ij[1]*dis_ikp[1]
+                            +dis_ij[2]*dis_ikp[2])/(r_ij*r_ikp);
+                        dcA_jikp[0][0]=(dis_ikp[0]*r_ij*r_ikp-cosAng_jikp
+                            *dis_ij[0]*r_ikp*r_ikp)/(r_ij*r_ij*r_ikp*r_ikp);
+                        dcA_jikp[1][0]=(dis_ikp[1]*r_ij*r_ikp-cosAng_jikp
+                            *dis_ij[1]*r_ikp*r_ikp)/(r_ij*r_ij*r_ikp*r_ikp);
+                        dcA_jikp[2][0]=(dis_ikp[2]*r_ij*r_ikp-cosAng_jikp
+                            *dis_ij[2]*r_ikp*r_ikp)/(r_ij*r_ij*r_ikp*r_ikp);
+                        dcA_jikp[0][1]=(dis_ij[0]*r_ij*r_ikp-cosAng_jikp
+                            *dis_ikp[0]*r_ij*r_ij)/(r_ij*r_ij*r_ikp*r_ikp);
+                        dcA_jikp[1][1]=(dis_ij[1]*r_ij*r_ikp-cosAng_jikp
+                            *dis_ikp[1]*r_ij*r_ij)/(r_ij*r_ij*r_ikp*r_ikp);
+                        dcA_jikp[2][1]=(dis_ij[2]*r_ij*r_ikp-cosAng_jikp
+                            *dis_ikp[2]*r_ij*r_ij)/(r_ij*r_ij*r_ikp*r_ikp);
+                      }
+                    } else {
+                      if(neigh_flag[temp_ikp]) {
+                        pass_ikp=1;
+                        dis_ikp[0]=disij[0][temp_ikp];
+                        dis_ikp[1]=disij[1][temp_ikp];
+                        dis_ikp[2]=disij[2][temp_ikp];
+                        r_ikp=rij[temp_ikp];
+                        betaS_ikp=betaS[temp_ikp];
+                        dBetaS_ikp=dBetaS[temp_ikp];
+                        betaP_ikp=betaP[temp_ikp];
+                        dBetaP_ikp=dBetaP[temp_ikp];
+                        if(ltmp<jtmp) {
+                          njikp=ltmp*(2*nlisti-ltmp-1)/2+(jtmp-ltmp)-1;
+                          ngl=1;
+                          nglj=0;
+                        }
+                        else {
+                          njikp=jtmp*(2*nlisti-jtmp-1)/2+(ltmp-jtmp)-1;
+                          ngl=0;
+                          nglj=1;
+                        }
+                        ang_jikp=cos_index[i]+njikp;
+                        cosAng_jikp=cosAng[ang_jikp];
+                        dcA_jikp[0][0]=dcAng[ang_jikp][0][ngl];
+                        dcA_jikp[1][0]=dcAng[ang_jikp][1][ngl];
+                        dcA_jikp[2][0]=dcAng[ang_jikp][2][ngl];
+                        dcA_jikp[0][1]=dcAng[ang_jikp][0][nglj];
+                        dcA_jikp[1][1]=dcAng[ang_jikp][1][nglj];
+                        dcA_jikp[2][1]=dcAng[ang_jikp][2][nglj];
+                      }
+                    }
+                    if(pass_ikp==1) {
                       nb_ikp=nb_t;
                       nb_t++;
                       if(nb_t>nb_pi) {
@@ -7938,353 +5012,169 @@ void PairBOP::PiBo_otf()
                           agpdpr2*dis_ikp[2]
                           +agpdpr3*dis_jk[2]
                           +app2*dcA_jikp[2][1];
-                      bt_pi[nb_jk].dBB[0]+=
-                          agpdpr1*dis_jk[0]
-                          +agpdpr3*dis_ikp[0]
-                          +app1*dcA_ijk[0][1];
-                      bt_pi[nb_jk].dBB[1]+=
-                          agpdpr1*dis_jk[1]
-                          +agpdpr3*dis_ikp[1]
-                          +app1*dcA_ijk[1][1];
-                      bt_pi[nb_jk].dBB[2]+=
-                          agpdpr1*dis_jk[2]
-                          +agpdpr3*dis_ikp[2]
-                          +app1*dcA_ijk[2][1];
-                    }
-                  }
-                }
-                if(pi_flag==0)
-                  nPiBk[n]=nPiBk[n]+1;
-              }
-            }
-          }
-          CC=betaP_ij*betaP_ij+pi_delta[iij]*pi_delta[iij];
-          BBrt=sqrt(BB+small6);
-          AB1=CC+pi_c[iij]*(AA+BBrt)+small7;
-          AB2=CC+pi_c[iij]*(AA-BBrt+sqrt(small6))+small7;
-          BBrtR=1.0/BBrt;
-          ABrtR1=1.0/sqrt(AB1);
-          ABrtR2=1.0/sqrt(AB2);
-
-// piB is similary formulation to (a) Eq. 36 and (b) Eq. 18
-
-          piB[n]=(ABrtR1+ABrtR2)*pi_a[iij]*betaP_ij;
-          dPiB1=-.5*(cube(ABrtR1)+cube(ABrtR2))*pi_c[iij]*pi_a[iij]*betaP_ij;
-          dPiB2=.25*BBrtR*(cube(ABrtR2)-cube(ABrtR1))*pi_c[iij]*pi_a[iij]*betaP_ij;
-          dPiB3=((ABrtR1+ABrtR2)*pi_a[iij]-(cube(ABrtR1)+cube(ABrtR2))*pi_a[iij]
-              *betaP_ij*betaP_ij)*dBetaP_ij/r_ij;
-          n++;
-
-          pp2=2.0*betaP_ij;
-          for(m=0;m<nb_t;m++) {
-            bt_i=bt_pi[m].i;
-            bt_j=bt_pi[m].j;
-            xtmp[0]=x[bt_j][0]-x[bt_i][0];
-            xtmp[1]=x[bt_j][1]-x[bt_i][1];
-            xtmp[2]=x[bt_j][2]-x[bt_i][2];
-            for(pp=0;pp<3;pp++) {
-              bt_pi[m].dPiB[pp]=
-                  +dPiB1*bt_pi[m].dAA[pp]
-                  +dPiB2*bt_pi[m].dBB[pp];
-              ftmp[pp]=pp2*bt_pi[m].dPiB[pp];
-              f[bt_i][pp]-=ftmp[pp];
-              f[bt_j][pp]+=ftmp[pp];
-            }
-            if(evflag) {
-              ev_tally_xyz(bt_i,bt_j,nlocal,newton_pair,0.0,0.0,ftmp[0],ftmp[1]
-                  ,ftmp[2],xtmp[0],xtmp[1],xtmp[2]);
-            }
-          }
-          for(pp=0;pp<3;pp++) {
-            ftmp[pp]=pp2*dPiB3*dis_ij[pp];
-            f[i][pp]-=ftmp[pp];
-            f[j][pp]+=ftmp[pp];
-          }
-          if(evflag) {
-            ev_tally_xyz(i,j,nlocal,newton_pair,0.0,0.0,ftmp[0],ftmp[1]
-                ,ftmp[2],dis_ij[0],dis_ij[1],dis_ij[2]);
-          }
-        }
-      }
-    }
-  }
-  destroy_pi();
-}
-
-/* ----------------------------------------------------------------------
-   read BOP potential file
-------------------------------------------------------------------------- */
-
-void PairBOP::read_file(char *filename)
-{
-  int i,j,k;
-  int ij,ii,jj;
-  int buf1;
-  int n;
-  double buf2;
-  char s[MAXLINE];
-  char buf[2];
-
-  MPI_Comm_rank(world,&me);
-
-  // read file on proc 0
-
-  rcore=0.1;
-
-  if (me == 0) {
-    FILE *fp = force->open_potential(filename);
-    if (fp == NULL) {
-      char str[128];
-      sprintf(str,"Cannot open BOP potential file %s",filename);
-      error->one(FLERR,str);
-    }
-
-    // read parameters
-
-    fgets(s,MAXLINE,fp);
-    fgets(s,MAXLINE,fp);
-    sscanf(s,"%d",&bop_types);
-    fclose(fp);
-    npairs=bop_types*(bop_types+1)/2;
-  }
-
-  MPI_Bcast(&bop_types,1,MPI_INT,0,world);
-  MPI_Bcast(&npairs,1,MPI_INT,0,world);
-  allocate();
-  memory->create(pi_a,npairs,"BOP:pi_a");
-  memory->create(pro_delta,bop_types,"BOP:pro_delta");
-  memory->create(pi_delta,npairs,"BOP:pi_delta");
-  memory->create(pi_p,bop_types,"BOP:pi_p");
-  memory->create(pi_c,npairs,"BOP:pi_c");
-  memory->create(sigma_r0,npairs,"BOP:sigma_r0");
-  memory->create(pi_r0,npairs,"BOP:pi_r0");
-  memory->create(phi_r0,npairs,"BOP:phi_r0");
-  memory->create(sigma_rc,npairs,"BOP:sigma_rc");
-  memory->create(pi_rc,npairs,"BOP:pi_rc");
-  memory->create(phi_rc,npairs,"BOP:phi_rc");
-  memory->create(r1,npairs,"BOP:r1");
-  memory->create(sigma_beta0,npairs,"BOP:sigma_beta0");
-  memory->create(pi_beta0,npairs,"BOP:pi_beta0");
-  memory->create(phi0,npairs,"BOP:phi0");
-  memory->create(sigma_n,npairs,"BOP:sigma_n");
-  memory->create(pi_n,npairs,"BOP:pi_n");
-  memory->create(phi_m,npairs,"BOP:phi_m");
-  memory->create(sigma_nc,npairs,"BOP:sigma_nc");
-  memory->create(pi_nc,npairs,"BOP:pi_nc");
-  memory->create(phi_nc,npairs,"BOP:phi_nc");
-  memory->create(pro,bop_types,"BOP:pro");
-  memory->create(sigma_delta,npairs,"BOP:sigma_delta");
-  memory->create(sigma_c,npairs,"BOP:sigma_c");
-  memory->create(sigma_a,npairs,"BOP:sigma_a");
-  memory->create(sigma_g0,bop_types
-      ,bop_types,bop_types,"BOP:sigma_g0");
-  memory->create(sigma_g1,bop_types
-      ,bop_types,bop_types,"BOP:sigma_g1");
-  memory->create(sigma_g2,bop_types
-      ,bop_types,bop_types,"BOP:sigma_g2");
-  memory->create(sigma_g3,bop_types
-      ,bop_types,bop_types,"BOP:sigma_g3");
-  memory->create(sigma_g4,bop_types
-      ,bop_types,bop_types,"BOP:sigma_g4");
-  memory->create(sigma_f,npairs,"BOP:sigma_f");
-  memory->create(sigma_k,npairs,"BOP:sigma_k");
-  memory->create(small3,npairs,"BOP:small3");
-
-  if (me == 0) {
-    words = new char*[bop_types];
-    for(i=0;i<bop_types;i++) words[i]=NULL;
-    FILE *fp = force->open_potential(filename);
-    if (fp == NULL) {
-      char str[128];
-      sprintf(str,"Cannot open BOP potential file %s",filename);
-      error->one(FLERR,str);
-    }
-    fgets(s,MAXLINE,fp);
-    fgets(s,MAXLINE,fp);
-    for(i=0;i<bop_types;i++) {
-      fgets(s,MAXLINE,fp);
-      sscanf(s,"%d %lf %s",&buf1,&buf2,buf);
-      n= strlen(buf)+1;
-      words[i] = new char[n];
-      strcpy(words[i],buf);
-    }
-    fgets(s,MAXLINE,fp);
-    fgets(s,MAXLINE,fp);
-    fgets(s,MAXLINE,fp);
-    sscanf(s,"%lf%lf%lf%lf%lf%lf%lf",&small1,&small2,&small3g,&small4
-        ,&small5,&small6,&small7);
-    fgets(s,MAXLINE,fp);
-    sscanf(s,"%d%lf%lf",&ncutoff,&rbig,&rsmall);
-    fgets(s,MAXLINE,fp);
-    sscanf(s,"%lf%lf%d",&which,&alpha,&nfunc);
-    fgets(s,MAXLINE,fp);
-    sscanf(s,"%lf%lf%lf",&alpha1,&beta1,&gamma1);
-    fgets(s,MAXLINE,fp);
-    sscanf(s,"%lf%lf",&alpha2,&beta2);
-    fgets(s,MAXLINE,fp);
-    sscanf(s,"%lf%lf",&alpha3,&beta3);
-    fgets(s,MAXLINE,fp);
-    fgets(s,MAXLINE,fp);
-    for(i=0;i<bop_types;i++) {
-        fgets(s,MAXLINE,fp);
-        sscanf(s,"%lf%lf%lf",&pro[i],&pro_delta[i],&pi_p[i]);
-    }
-    fgets(s,MAXLINE,fp);
-    fgets(s,MAXLINE,fp);
-    cutmax=0;
-
-    for(i=0;i<bop_types;i++) {
-      ii=i+1;
-      for(j=i;j<bop_types;j++) {
-        jj=j+1;
-        if(ii==jj)
-          ij=ii-1;
-        else if(ii<jj)
-          ij=ii*bop_types-ii*(ii+1)/2+jj-1;
-        else
-          ij=jj*bop_types-jj*(jj+1)/2+ii-1;
-        fgets(s,MAXLINE,fp);
-        sscanf(s,"%lf%lf%lf%lf",&sigma_r0[ij],&sigma_rc[ij],&r1[ij],&rcut[ij]);
-        if(rcut[ij]>cutmax)
-          cutmax=rcut[ij];
-        pi_r0[ij]=sigma_r0[ij];
-        phi_r0[ij]=sigma_r0[ij];
-        pi_rc[ij]=sigma_rc[ij];
-        phi_rc[ij]=sigma_rc[ij];
-        fgets(s,MAXLINE,fp);
-        sscanf(s,"%lf%lf%lf",&phi_m[ij],&sigma_n[ij],&sigma_nc[ij]);
-        pi_n[ij]=sigma_n[ij];
-        pi_nc[ij]=sigma_nc[ij];
-        phi_nc[ij]=sigma_nc[ij];
-        fgets(s,MAXLINE,fp);
-        sscanf(s,"%lf%lf%lf",&phi0[ij],&sigma_beta0[ij],&pi_beta0[ij]);
-        fgets(s,MAXLINE,fp);
-        sscanf(s,"%lf%lf%lf",&sigma_a[ij],&sigma_c[ij],&sigma_delta[ij]);
-        fgets(s,MAXLINE,fp);
-        sscanf(s,"%lf%lf%lf",&pi_a[ij],&pi_c[ij],&pi_delta[ij]);
-        fgets(s,MAXLINE,fp);
-        sscanf(s,"%lf%lf%lf",&sigma_f[ij],&sigma_k[ij],&small3[ij]);
-      }
-    }
-    fgets(s,MAXLINE,fp);
-    fgets(s,MAXLINE,fp);
-    for(i=0;i<bop_types;i++) {
-      for(j=0;j<bop_types;j++) {
-        for(k=j;k<bop_types;k++) {
-          fgets(s,MAXLINE,fp);
-          sscanf(s,"%lf%lf%lf",&sigma_g0[j][i][k],&sigma_g1[j][i][k]
-              ,&sigma_g2[j][i][k]);
-          sigma_g0[k][i][j]=sigma_g0[j][i][k];
-          sigma_g1[k][i][j]=sigma_g1[j][i][k];
-          sigma_g2[k][i][j]=sigma_g2[j][i][k];
+                      bt_pi[nb_jk].dBB[0]+=
+                          agpdpr1*dis_jk[0]
+                          +agpdpr3*dis_ikp[0]
+                          +app1*dcA_ijk[0][1];
+                      bt_pi[nb_jk].dBB[1]+=
+                          agpdpr1*dis_jk[1]
+                          +agpdpr3*dis_ikp[1]
+                          +app1*dcA_ijk[1][1];
+                      bt_pi[nb_jk].dBB[2]+=
+                          agpdpr1*dis_jk[2]
+                          +agpdpr3*dis_ikp[2]
+                          +app1*dcA_ijk[2][1];
+                    }
+                  }
+                }
+                if(pi_flag==0)
+                  nPiBk=nPiBk+1;
+              }
+            }
+          }
+          n++;
+          pp2=2.0*betaP_ij;
+          for(m=0;m<nb_t;m++) {
+            bt_i=bt_pi[m].i;
+            bt_j=bt_pi[m].j;
+            CC=betaP_ij*betaP_ij+pi_delta[iij]*pi_delta[iij];
+            BBrt=sqrt(BB+small6);
+            AB1=CC+pi_c[iij]*(AA+BBrt)+small7;
+            AB2=CC+pi_c[iij]*(AA-BBrt+sqrt(small6))+small7;
+            BBrtR=1.0/BBrt;
+            ABrtR1=1.0/sqrt(AB1);
+            ABrtR2=1.0/sqrt(AB2);
+
+            piB=(ABrtR1+ABrtR2)*pi_a[iij]*betaP_ij;
+            dPiB1=-.5*(pow(ABrtR1,3)+pow(ABrtR2,3))*pi_c[iij]*pi_a[iij]*betaP_ij;
+            dPiB2=.25*BBrtR*(pow(ABrtR2,3)-pow(ABrtR1,3))*pi_c[iij]*pi_a[iij]*betaP_ij;
+            dPiB3=((ABrtR1+ABrtR2)*pi_a[iij]-(pow(ABrtR1,3)+pow(ABrtR2,3))*pi_a[iij]
+                *betaP_ij*betaP_ij)*dBetaP_ij/r_ij;
+            xtmp[0]=x[bt_j][0]-x[bt_i][0];
+            xtmp[1]=x[bt_j][1]-x[bt_i][1];
+            xtmp[2]=x[bt_j][2]-x[bt_i][2];
+            for(pp=0;pp<3;pp++) {
+              bt_pi[m].dPiB[pp]=
+                  +dPiB1*bt_pi[m].dAA[pp]
+                  +dPiB2*bt_pi[m].dBB[pp];
+              ftmp[pp]=pp2*bt_pi[m].dPiB[pp];
+              f[bt_i][pp]-=ftmp[pp];
+              f[bt_j][pp]+=ftmp[pp];
+            }
+            if(evflag) {
+              ev_tally_xyz(bt_i,bt_j,nlocal,newton_pair,0.0,0.0,ftmp[0],ftmp[1]
+                  ,ftmp[2],xtmp[0],xtmp[1],xtmp[2]);
+            }
+          }
+          for(pp=0;pp<3;pp++) {
+            ftmp[pp]=pp2*dPiB3*dis_ij[pp];
+            f[i][pp]-=ftmp[pp];
+            f[j][pp]+=ftmp[pp];
+          }
+          if(evflag) {
+            ev_tally_xyz(i,j,nlocal,newton_pair,0.0,0.0,ftmp[0],ftmp[1]
+                ,ftmp[2],dis_ij[0],dis_ij[1],dis_ij[2]);
+          }
+          }
         }
       }
-    }
-    for(i=0;i<npairs;i++) {
-      dr[i]=rcut[i]/(nr-1.0);
-      rdr[i]=1.0/dr[i];
-    }
-    fclose(fp);
-  }
-  MPI_Bcast(&small1,1,MPI_DOUBLE,0,world);
-  MPI_Bcast(&small2,1,MPI_DOUBLE,0,world);
-  MPI_Bcast(&small3g,1,MPI_DOUBLE,0,world);
-  MPI_Bcast(&small4,1,MPI_DOUBLE,0,world);
-  MPI_Bcast(&small5,1,MPI_DOUBLE,0,world);
-  MPI_Bcast(&small6,1,MPI_DOUBLE,0,world);
-  MPI_Bcast(&small7,1,MPI_DOUBLE,0,world);
-  MPI_Bcast(&ncutoff,1,MPI_INT,0,world);
-  MPI_Bcast(&rbig,1,MPI_DOUBLE,0,world);
-  MPI_Bcast(&rsmall,1,MPI_DOUBLE,0,world);
-  MPI_Bcast(&which,1,MPI_DOUBLE,0,world);
-  MPI_Bcast(&alpha,1,MPI_DOUBLE,0,world);
-  MPI_Bcast(&nfunc,1,MPI_INT,0,world);
-  MPI_Bcast(&alpha1,1,MPI_DOUBLE,0,world);
-  MPI_Bcast(&beta1,1,MPI_DOUBLE,0,world);
-  MPI_Bcast(&gamma1,1,MPI_DOUBLE,0,world);
-  MPI_Bcast(&alpha2,1,MPI_DOUBLE,0,world);
-  MPI_Bcast(&beta2,1,MPI_DOUBLE,0,world);
-  MPI_Bcast(&alpha3,1,MPI_DOUBLE,0,world);
-  MPI_Bcast(&beta3,1,MPI_DOUBLE,0,world);
-  MPI_Bcast(&pro[0],bop_types,MPI_DOUBLE,0,world);
-  MPI_Bcast(&pro_delta[0],bop_types,MPI_DOUBLE,0,world);
-  MPI_Bcast(&pi_p[0],bop_types,MPI_DOUBLE,0,world);
-  MPI_Bcast(&sigma_r0[0],npairs,MPI_DOUBLE,0,world);
-  MPI_Bcast(&sigma_rc[0],npairs,MPI_DOUBLE,0,world);
-  MPI_Bcast(&r1[0],npairs,MPI_DOUBLE,0,world);
-  MPI_Bcast(&rcut[0],npairs,MPI_DOUBLE,0,world);
-  MPI_Bcast(&cutmax,1,MPI_DOUBLE,0,world);
-  MPI_Bcast(&pi_r0[0],npairs,MPI_DOUBLE,0,world);
-  MPI_Bcast(&phi_r0[0],npairs,MPI_DOUBLE,0,world);
-  MPI_Bcast(&pi_rc[0],npairs,MPI_DOUBLE,0,world);
-  MPI_Bcast(&phi_rc[0],npairs,MPI_DOUBLE,0,world);
-  MPI_Bcast(&phi_m[0],npairs,MPI_DOUBLE,0,world);
-  MPI_Bcast(&sigma_n[0],npairs,MPI_DOUBLE,0,world);
-  MPI_Bcast(&sigma_nc[0],npairs,MPI_DOUBLE,0,world);
-  MPI_Bcast(&pi_n[0],npairs,MPI_DOUBLE,0,world);
-  MPI_Bcast(&pi_nc[0],npairs,MPI_DOUBLE,0,world);
-  MPI_Bcast(&phi_nc[0],npairs,MPI_DOUBLE,0,world);
-  MPI_Bcast(&phi0[0],npairs,MPI_DOUBLE,0,world);
-  MPI_Bcast(&sigma_beta0[0],npairs,MPI_DOUBLE,0,world);
-  MPI_Bcast(&pi_beta0[0],npairs,MPI_DOUBLE,0,world);
-  MPI_Bcast(&sigma_a[0],npairs,MPI_DOUBLE,0,world);
-  MPI_Bcast(&sigma_c[0],npairs,MPI_DOUBLE,0,world);
-  MPI_Bcast(&sigma_delta[0],npairs,MPI_DOUBLE,0,world);
-  MPI_Bcast(&pi_a[0],npairs,MPI_DOUBLE,0,world);
-  MPI_Bcast(&pi_c[0],npairs,MPI_DOUBLE,0,world);
-  MPI_Bcast(&pi_delta[0],npairs,MPI_DOUBLE,0,world);
-  MPI_Bcast(&sigma_f[0],npairs,MPI_DOUBLE,0,world);
-  MPI_Bcast(&sigma_k[0],npairs,MPI_DOUBLE,0,world);
-  MPI_Bcast(&small3[0],npairs,MPI_DOUBLE,0,world);
-  MPI_Bcast(&sigma_g0[0][0][0],bop_types*bop_types*bop_types,MPI_DOUBLE,0,world);
-  MPI_Bcast(&sigma_g1[0][0][0],bop_types*bop_types*bop_types,MPI_DOUBLE,0,world);
-  MPI_Bcast(&sigma_g2[0][0][0],bop_types*bop_types*bop_types,MPI_DOUBLE,0,world);
-  MPI_Bcast(&sigma_g3[0][0][0],bop_types*bop_types*bop_types,MPI_DOUBLE,0,world);
-  MPI_Bcast(&sigma_g4[0][0][0],bop_types*bop_types*bop_types,MPI_DOUBLE,0,world);
-  MPI_Bcast(&dr[0],npairs,MPI_DOUBLE,0,world);
-  MPI_Bcast(&rdr[0],npairs,MPI_DOUBLE,0,world);
+  return(piB);
+  destroy_pi();
 }
 
+/* ----------------------------------------------------------------------
+   read BOP potential file
+------------------------------------------------------------------------- */
+
 /* ---------------------------------------------------------------------- */
 
 void PairBOP::read_table(char *filename)
 {
-  int i,j,k,n;
-  int buf1;
+  int i,j,k,n,m;
+  int buf1,pass;
+  int nws,ws;
   double buf2;
   char s[MAXLINE],buf[2];
 
   MPI_Comm_rank(world,&me);
-
   if (me == 0) {
-    FILE *fp = force->open_potential(filename);
+    FILE *fp = fopen(filename,"r");
     if (fp == NULL) {
       char str[128];
       sprintf(str,"Cannot open BOP potential file %s",filename);
       error->one(FLERR,str);
     }
-    fgets(s,MAXLINE,fp);  // skip first comment line
     fgets(s,MAXLINE,fp);
     sscanf(s,"%d",&bop_types);
-    words = new char*[bop_types];
-    for(i=0;i<bop_types;i++) words[i]=NULL;
+    elements = new char*[bop_types];
+    for(i=0;i<bop_types;i++) elements[i]=NULL;
     for(i=0;i<bop_types;i++) {
       fgets(s,MAXLINE,fp);
+      nws=0;
+      ws=1;
+      for(j=0;j<strlen(s);j++) {
+        if(ws==1) {
+          if(isspace(s[j])) {
+            ws=1;
+          } else {
+            ws=0;
+          }
+        } else {
+          if(isspace(s[j])) {
+            ws=1;
+            nws++;
+          } else {
+            ws=0;
+          }
+        }
+      }
+      if(nws!=3){
+         error->all(FLERR,"Incorrect table format check for element types");
+      }
       sscanf(s,"%d %lf %s",&buf1,&buf2,buf);
       n= strlen(buf)+1;
-      words[i] = new char[n];
-      strcpy(words[i],buf);
+      elements[i] = new char[n];
+      strcpy(elements[i],buf);
     }
+    nws=0;
+    ws=1;
     fgets(s,MAXLINE,fp);
-    sscanf(s,"%d %d",&nr,&nBOt);
+    for(j=0;j<strlen(s);j++) {
+      if(ws==1) {
+        if(isspace(s[j])) {
+          ws=1;
+        } else {
+          ws=0;
+        }
+      } else {
+        if(isspace(s[j])) {
+          ws=1;
+          nws++;
+        } else {
+          ws=0;
+        }
+      }
+    }
+    if(nws==3) { 
+      sscanf(s,"%d %d %d",&nr,&ntheta,&nBOt);
+      npower=2;
+      if(ntheta<=10) npower=ntheta;
+    }
+    else { 
+      sscanf(s,"%d %d",&nr,&nBOt);
+      ntheta=0;
+      npower=3;
+    }
     fclose(fp);
     npairs=bop_types*(bop_types+1)/2;
   }
 
   MPI_Bcast(&nr,1,MPI_INT,0,world);
   MPI_Bcast(&nBOt,1,MPI_INT,0,world);
+  MPI_Bcast(&ntheta,1,MPI_INT,0,world);
   MPI_Bcast(&bop_types,1,MPI_INT,0,world);
   MPI_Bcast(&npairs,1,MPI_INT,0,world);
+  MPI_Bcast(&npower,1,MPI_INT,0,world);
   memory->create(pi_a,npairs,"BOP:pi_a");
   memory->create(pro_delta,bop_types,"BOP:pro_delta");
   memory->create(pi_delta,npairs,"BOP:pi_delta");
@@ -8295,19 +5185,21 @@ void PairBOP::read_table(char *filename)
   memory->create(sigma_delta,npairs,"BOP:sigma_delta");
   memory->create(sigma_c,npairs,"BOP:sigma_c");
   memory->create(sigma_a,npairs,"BOP:sigma_a");
-  memory->create(sigma_g0,bop_types
-      ,bop_types,bop_types,"BOP:sigma_g0");
-  memory->create(sigma_g1,bop_types
-      ,bop_types,bop_types,"BOP:sigma_g1");
-  memory->create(sigma_g2,bop_types
-      ,bop_types,bop_types,"BOP:sigma_g2");
   memory->create(sigma_f,npairs,"BOP:sigma_f");
   memory->create(sigma_k,npairs,"BOP:sigma_k");
   memory->create(small3,npairs,"BOP:small3");
+  memory->create(gfunc,bop_types,bop_types,bop_types,ntheta,"BOP:gfunc");
+  memory->create(gfunc1,bop_types,bop_types,bop_types,ntheta,"BOP:gfunc1");
+  memory->create(gfunc2,bop_types,bop_types,bop_types,ntheta,"BOP:gfunc2");
+  memory->create(gfunc3,bop_types,bop_types,bop_types,ntheta,"BOP:gfunc3");
+  memory->create(gfunc4,bop_types,bop_types,bop_types,ntheta,"BOP:gfunc4");
+  memory->create(gfunc5,bop_types,bop_types,bop_types,ntheta,"BOP:gfunc5");
+  memory->create(gfunc6,bop_types,bop_types,bop_types,ntheta,"BOP:gfunc6");
+  memory->create(gpara,bop_types,bop_types,bop_types,npower+1,"BOP:gpara");
+ 
   allocate();
-
   if (me == 0) {
-    FILE *fp = force->open_potential(filename);
+    FILE *fp = fopen(filename,"r");
     if (fp == NULL) {
       char str[128];
       sprintf(str,"Cannot open BOP potential file %s",filename);
@@ -8334,14 +5226,81 @@ void PairBOP::read_table(char *filename)
       fgets(s,MAXLINE,fp);
       sscanf(s,"%lf%lf",&sigma_delta[i],&pi_delta[i]);
       fgets(s,MAXLINE,fp);
-      sscanf(s,"%lf%lf%lf",&sigma_f[i],&sigma_k[i],&small3[i]);
+      if(nws==3) {
+        sscanf(s,"%lf%lf%lf",&sigma_f[i],&sigma_k[i],&small3[i]);
+      } else {
+        sscanf(s,"%lf%lf%lf",&sigma_f[i],&sigma_k[i],&small3[i]);
+      }
+    }
+    if(nws==3) {
+      for(i=0;i<bop_types;i++)
+        for(j=0;j<bop_types;j++)
+          for(k=j;k<bop_types;k++) {
+            if(npower<=2) {
+              for(m=0;m<ntheta;m++) { 
+                fgets(s,MAXLINE,fp);
+                sscanf(s,"%lf%lf%lf%lf%lf",&gfunc[j][i][k][n],&gfunc[j][i][k][n+1]
+                    ,&gfunc[j][i][k][n+2],&gfunc[j][i][k][n+3],&gfunc[j][i][k][n+4]);
+                n+=4;
+              }
+            } else {
+              if(npower==3) {
+                fgets(s,MAXLINE,fp);
+                sscanf(s,"%lf%lf%lf%lf",&gpara[j][i][k][0],&gpara[j][i][k][1],&gpara[j][i][k][2],&gpara[j][i][k][3]);
+              }
+              else if(npower==4) {
+                fgets(s,MAXLINE,fp);
+                sscanf(s,"%lf%lf%lf%lf%lf",&gpara[j][i][k][0],&gpara[j][i][k][1],&gpara[j][i][k][2],&gpara[j][i][k][3],&gpara[j][i][k][4]);
+              }
+              else if(npower==5) {
+                fgets(s,MAXLINE,fp);
+                sscanf(s,"%lf%lf%lf%lf%lf",&gpara[j][i][k][0],&gpara[j][i][k][1],&gpara[j][i][k][2],&gpara[j][i][k][3],&gpara[j][i][k][4]);
+                fgets(s,MAXLINE,fp);
+                sscanf(s,"%lf",&gpara[j][i][k][5]);
+              }
+              else if(npower==6) {
+                fgets(s,MAXLINE,fp);
+                sscanf(s,"%lf%lf%lf%lf%lf",&gpara[j][i][k][0],&gpara[j][i][k][1],&gpara[j][i][k][2],&gpara[j][i][k][3],&gpara[j][i][k][4]);
+                fgets(s,MAXLINE,fp);
+                sscanf(s,"%lf%lf",&gpara[j][i][k][5],&gpara[j][i][k][6]);
+              }
+              else if(npower==7) {
+                fgets(s,MAXLINE,fp);
+                sscanf(s,"%lf%lf%lf%lf%lf",&gpara[j][i][k][0],&gpara[j][i][k][1],&gpara[j][i][k][2],&gpara[j][i][k][3],&gpara[j][i][k][4]);
+                fgets(s,MAXLINE,fp);
+                sscanf(s,"%lf%lf%lf",&gpara[j][i][k][5],&gpara[j][i][k][6],&gpara[j][i][k][7]);
+              }
+              else if(npower==8) {
+                fgets(s,MAXLINE,fp);
+                sscanf(s,"%lf%lf%lf%lf%lf",&gpara[j][i][k][0],&gpara[j][i][k][1],&gpara[j][i][k][2],&gpara[j][i][k][3],&gpara[j][i][k][4]);
+                fgets(s,MAXLINE,fp);
+                sscanf(s,"%lf%lf%lf%lf",&gpara[j][i][k][5],&gpara[j][i][k][6],&gpara[j][i][k][7],&gpara[j][i][k][8]);
+              }
+              else if(npower==9) {
+                fgets(s,MAXLINE,fp);
+                sscanf(s,"%lf%lf%lf%lf%lf",&gpara[j][i][k][0],&gpara[j][i][k][1],&gpara[j][i][k][2],&gpara[j][i][k][3],&gpara[j][i][k][4]);
+                fgets(s,MAXLINE,fp);
+                sscanf(s,"%lf%lf%lf%lf%lf",&gpara[j][i][k][5],&gpara[j][i][k][6],&gpara[j][i][k][7],&gpara[j][i][k][8],&gpara[j][i][k][9]);
+              }
+              else if(npower==10) {
+                fgets(s,MAXLINE,fp);
+                sscanf(s,"%lf%lf%lf%lf%lf",&gpara[j][i][k][0],&gpara[j][i][k][1],&gpara[j][i][k][2],&gpara[j][i][k][3],&gpara[j][i][k][4]);
+                fgets(s,MAXLINE,fp);
+                sscanf(s,"%lf%lf%lf%lf%lf",&gpara[j][i][k][5],&gpara[j][i][k][6],&gpara[j][i][k][7],&gpara[j][i][k][8],&gpara[j][i][k][9]);
+                fgets(s,MAXLINE,fp);
+                sscanf(s,"%lf",&gpara[j][i][k][10]);
+              }
+            }
+          }
+    } else {
+      for(i=0;i<bop_types;i++)
+        for(j=0;j<bop_types;j++)
+          for(k=0;k<bop_types;k++) {
+            fgets(s,MAXLINE,fp);
+            sscanf(s,"%lf%lf%lf",&gpara[i][j][k][0],&gpara[i][j][k][1],&gpara[i][j][k][2]);
+            gpara[j][i][k][3]=0;
+          }
     }
-    for(i=0;i<bop_types;i++)
-      for(j=0;j<bop_types;j++)
-        for(k=0;k<bop_types;k++) {
-          fgets(s,MAXLINE,fp);
-          sscanf(s,"%lf%lf%lf",&sigma_g0[i][j][k],&sigma_g1[i][j][k],&sigma_g2[i][j][k]);
-        }
     for(i=0;i<npairs;i++) {
       for(j=0;j<nr;j++) {
         fgets(s,MAXLINE,fp);
@@ -8383,12 +5342,45 @@ void PairBOP::read_table(char *filename)
       sscanf(s,"%lf",&pro[i]);
     }
     for(i=0;i<npairs;i++) {
+      rcut3[i]=0.0;
+    }
+    pass=0;
+    i=0;
+    if(nws==3) {
+      while(fgets(s,MAXLINE,fp)!=NULL&&i<npairs) {
+        sscanf(s,"%lf",&rcut3[i]);
+        pass=1;
+        i++;
+      }
+      if(pass==1) {
+        for(i=0;i<npairs;i++) {
+          for(j=0;j<nr;j++) {
+            fgets(s,MAXLINE,fp);
+            sscanf(s,"%lf%lf%lf%lf%lf",&pLong[i][j],&pLong[i][j+1]
+                ,&pLong[i][j+2],&pLong[i][j+3],&pLong[i][j+4]);
+            j+=4;
+          }
+        }
+      }
+    }
+    rcutall=0.0;
+    for(i=0;i<npairs;i++) {
+      if(rcut[i]>rcutall)
+        rcutall=rcut[i];
+      if(rcut3[i]>rcutall)
+        rcutall=rcut3[i];
+      rcutsq[i]=rcut[i]*rcut[i];
+      rcutsq3[i]=rcut3[i]*rcut3[i];
       dr[i]=rcut[i]/((double)nr-1.0);
       rdr[i]=1.0/dr[i];
+      dr3[i]=rcut3[i]/((double)nr-1.0);
+      rdr3[i]=1.0/dr3[i];
     }
+    rctroot=rcutall;
+    dtheta=2.0/((double)ntheta-1.0);
+    rdtheta=1.0/dtheta;
     dBO=1.0/((double)nBOt-1.0);
     rdBO=1.0/(double)dBO;
-
     for(i=0;i<npairs;i++) {
       pBetaS1[i][0]=pBetaS[i][1]-pBetaS[i][0];
       pBetaS1[i][1]=0.5*(pBetaS[i][2]-pBetaS[i][0]);
@@ -8406,6 +5398,10 @@ void PairBOP::read_table(char *filename)
       FsigBO1[i][1]=0.5*(FsigBO[i][2]-FsigBO[i][0]);
       FsigBO1[i][nBOt-2]=0.5*(FsigBO[i][nBOt-1]-FsigBO[i][nBOt-3]);
       FsigBO1[i][nBOt-1]=FsigBO[i][nBOt-1]-FsigBO[i][nBOt-2];
+      pLong1[i][0]=pLong[i][1]-pLong[i][0];
+      pLong1[i][1]=0.5*(pLong[i][2]-pLong[i][0]);
+      pLong1[i][nBOt-2]=0.5*(pLong[i][nr-1]-pLong[i][nr-3]);
+      pLong1[i][nBOt-1]=pLong[i][nr-1]-pLong[i][nr-2];
       for(k=2;k<nr-2;k++) {
         pBetaS1[i][k]=((pBetaS[i][k-2]-pBetaS[i][k+2])
             +8.0*(pBetaS[i][k+1]-pBetaS[i][k-1]))/12.0;
@@ -8413,6 +5409,8 @@ void PairBOP::read_table(char *filename)
             +8.0*(pBetaP[i][k+1]-pBetaP[i][k-1]))/12.0;
         pRepul1[i][k]=((pRepul[i][k-2]-pRepul[i][k+2])
             +8.0*(pRepul[i][k+1]-pRepul[i][k-1]))/12.0;
+        pLong1[i][k]=((pLong[i][k-2]-pLong[i][k+2])
+            +8.0*(pLong[i][k+1]-pLong[i][k-1]))/12.0;
       }
       for(k=2;k<nr-2;k++) {
         FsigBO1[i][k]=((FsigBO[i][k-2]-FsigBO[i][k+2])
@@ -8431,6 +5429,10 @@ void PairBOP::read_table(char *filename)
             -2.0*pRepul1[i][k]-pRepul1[i][k+1];
         pRepul3[i][k]=pRepul1[i][k]+pRepul1[i][k+1]
             -2.0*(pRepul[i][k+1]-pRepul[i][k]);
+        pLong2[i][k]=3.0*(pLong[i][k+1]-pLong[i][k])
+            -2.0*pLong1[i][k]-pLong1[i][k+1];
+        pLong3[i][k]=pLong1[i][k]+pLong1[i][k+1]
+            -2.0*(pLong[i][k+1]-pLong[i][k]);
       }
       for(k=0;k<nBOt-1;k++) {
         FsigBO2[i][k]=3.0*(FsigBO[i][k+1]-FsigBO[i][k])
@@ -8444,6 +5446,8 @@ void PairBOP::read_table(char *filename)
       pBetaP3[i][nr-1]=0.0;
       pRepul2[i][nr-1]=0.0;
       pRepul3[i][nr-1]=0.0;
+      pLong2[i][nr-1]=0.0;
+      pLong3[i][nr-1]=0.0;
       FsigBO2[i][nBOt-1]=0.0;
       FsigBO3[i][nBOt-1]=0.0;
       for(k=0;k<nr;k++) {
@@ -8456,6 +5460,9 @@ void PairBOP::read_table(char *filename)
         pRepul4[i][k]=pRepul1[i][k]/dr[i];
         pRepul5[i][k]=2.0*pRepul2[i][k]/dr[i];
         pRepul6[i][k]=3.0*pRepul3[i][k]/dr[i];
+        pLong4[i][k]=pLong1[i][k]/dr3[i];
+        pLong5[i][k]=2.0*pLong2[i][k]/dr3[i];
+        pLong6[i][k]=3.0*pLong3[i][k]/dr3[i];
       }
       for(k=0;k<nBOt;k++) {
         FsigBO4[i][k]=FsigBO1[i][k]/dBO;
@@ -8463,10 +5470,68 @@ void PairBOP::read_table(char *filename)
         FsigBO6[i][k]=3.0*FsigBO3[i][k]/dBO;
       }
     }
+    if(npower<=2) {
+      for(i=0;i<bop_types;i++) {
+        for(j=0;j<bop_types;j++) {
+          for(k=j;k<bop_types;k++) {
+            gfunc1[j][i][k][0]=gfunc[j][i][k][1]-gfunc[j][i][k][0];
+            gfunc1[j][i][k][1]=0.5*(gfunc[j][i][k][2]-gfunc[j][i][k][0]);
+            gfunc1[j][i][k][ntheta-2]=0.5*(gfunc[j][i][k][ntheta-1]-gfunc[j][i][k][ntheta-3]);
+            gfunc1[j][i][k][ntheta-1]=0.5*(gfunc[j][i][k][ntheta-1]-gfunc[j][i][k][ntheta-2]);
+            for(m=2;m<ntheta-2;m++) {
+              gfunc1[j][i][k][m]=((gfunc[j][i][k][m-2]-gfunc[j][i][k][m+2])+
+                  8.0*(gfunc[j][i][k][m+1]-gfunc[j][i][k][m+1]-gfunc[j][i][k][m-1]))/12.0;
+            }
+            for(m=0;m<ntheta-1;m++) {
+              gfunc2[j][i][k][m]=3.0*(gfunc[j][i][k][m+1]-gfunc[j][i][k][m])-
+                  2.0*gfunc1[j][i][k][m]-gfunc1[j][i][k][m+1];
+              gfunc3[j][i][k][m]=gfunc1[j][i][k][m]+gfunc1[j][i][k][m+1]-
+                  2.0*(gfunc[j][i][k][m+1]-gfunc[j][i][k][m]);
+            }
+            gfunc2[j][i][k][ntheta-1]=0.0;
+            gfunc3[j][i][k][ntheta-1]=0.0;
+            for(m=0;m<ntheta;m++) {
+              gfunc4[j][i][k][ntheta-1]=gfunc1[j][i][k][m]/dtheta;
+              gfunc5[j][i][k][ntheta-1]=2.0*gfunc2[j][i][k][m]/dtheta;
+              gfunc6[j][i][k][ntheta-1]=3.0*gfunc3[j][i][k][m]/dtheta;
+            } 
+          } 
+        } 
+      } 
+    } 
+    for(i=0;i<bop_types;i++) {
+      for(j=0;j<bop_types;j++) {
+        for(k=0;k<j;k++) {
+          if(npower<=2) {
+            for(n=0;n<ntheta;n++) {
+              gfunc[j][i][k][n]=gfunc[k][i][j][n];
+              gfunc1[j][i][k][n]=gfunc1[k][i][j][n];
+              gfunc2[j][i][k][n]=gfunc2[k][i][j][n];
+              gfunc3[j][i][k][n]=gfunc3[k][i][j][n];
+              gfunc4[j][i][k][n]=gfunc4[k][i][j][n];
+              gfunc5[j][i][k][n]=gfunc5[k][i][j][n];
+              gfunc6[j][i][k][n]=gfunc6[k][i][j][n];
+            }
+          } else {
+            if(nws==3) {
+              for(n=0;n<npower+1;n++) {
+                gpara[j][i][k][n]=gpara[k][i][j][n];
+              } 
+            } else {
+              for(n=0;n<npower+1;n++) {
+                gpara[j][i][k][n]=gpara[k][i][j][n];
+              } 
+            } 
+          } 
+        } 
+      } 
+    } 
     fclose(fp);
   }
   MPI_Bcast(&rdBO,1,MPI_DOUBLE,0,world);
   MPI_Bcast(&dBO,1,MPI_DOUBLE,0,world);
+  MPI_Bcast(&rdtheta,1,MPI_DOUBLE,0,world);
+  MPI_Bcast(&dtheta,1,MPI_DOUBLE,0,world);
   MPI_Bcast(&bop_types,1,MPI_INT,0,world);
   MPI_Bcast(&small1,1,MPI_DOUBLE,0,world);
   MPI_Bcast(&small2,1,MPI_DOUBLE,0,world);
@@ -8480,6 +5545,9 @@ void PairBOP::read_table(char *filename)
   MPI_Bcast(&pi_p[0],bop_types,MPI_DOUBLE,0,world);
   MPI_Bcast(&r1[0],npairs,MPI_DOUBLE,0,world);
   MPI_Bcast(&rcut[0],npairs,MPI_DOUBLE,0,world);
+  MPI_Bcast(&rcut3[0],npairs,MPI_DOUBLE,0,world);
+  MPI_Bcast(&rcutsq[0],npairs,MPI_DOUBLE,0,world);
+  MPI_Bcast(&rcutsq3[0],npairs,MPI_DOUBLE,0,world);
   MPI_Bcast(&cutmax,1,MPI_DOUBLE,0,world);
   MPI_Bcast(&sigma_a[0],npairs,MPI_DOUBLE,0,world);
   MPI_Bcast(&sigma_c[0],npairs,MPI_DOUBLE,0,world);
@@ -8490,11 +5558,10 @@ void PairBOP::read_table(char *filename)
   MPI_Bcast(&sigma_f[0],npairs,MPI_DOUBLE,0,world);
   MPI_Bcast(&sigma_k[0],npairs,MPI_DOUBLE,0,world);
   MPI_Bcast(&small3[0],npairs,MPI_DOUBLE,0,world);
-  MPI_Bcast(&sigma_g0[0][0][0],bop_types*bop_types*bop_types,MPI_DOUBLE,0,world);
-  MPI_Bcast(&sigma_g1[0][0][0],bop_types*bop_types*bop_types,MPI_DOUBLE,0,world);
-  MPI_Bcast(&sigma_g2[0][0][0],bop_types*bop_types*bop_types,MPI_DOUBLE,0,world);
   MPI_Bcast(&dr[0],npairs,MPI_DOUBLE,0,world);
   MPI_Bcast(&rdr[0],npairs,MPI_DOUBLE,0,world);
+  MPI_Bcast(&dr3[0],npairs,MPI_DOUBLE,0,world);
+  MPI_Bcast(&rdr3[0],npairs,MPI_DOUBLE,0,world);
   MPI_Bcast(&pBetaS[0][0],npairs*nr,MPI_DOUBLE,0,world);
   MPI_Bcast(&pBetaS1[0][0],npairs*nr,MPI_DOUBLE,0,world);
   MPI_Bcast(&pBetaS2[0][0],npairs*nr,MPI_DOUBLE,0,world);
@@ -8509,6 +5576,13 @@ void PairBOP::read_table(char *filename)
   MPI_Bcast(&pBetaP4[0][0],npairs*nr,MPI_DOUBLE,0,world);
   MPI_Bcast(&pBetaP5[0][0],npairs*nr,MPI_DOUBLE,0,world);
   MPI_Bcast(&pBetaP6[0][0],npairs*nr,MPI_DOUBLE,0,world);
+  MPI_Bcast(&pLong[0][0],npairs*nr,MPI_DOUBLE,0,world);
+  MPI_Bcast(&pLong1[0][0],npairs*nr,MPI_DOUBLE,0,world);
+  MPI_Bcast(&pLong2[0][0],npairs*nr,MPI_DOUBLE,0,world);
+  MPI_Bcast(&pLong3[0][0],npairs*nr,MPI_DOUBLE,0,world);
+  MPI_Bcast(&pLong4[0][0],npairs*nr,MPI_DOUBLE,0,world);
+  MPI_Bcast(&pLong5[0][0],npairs*nr,MPI_DOUBLE,0,world);
+  MPI_Bcast(&pLong6[0][0],npairs*nr,MPI_DOUBLE,0,world);
   MPI_Bcast(&pRepul[0][0],npairs*nr,MPI_DOUBLE,0,world);
   MPI_Bcast(&pRepul1[0][0],npairs*nr,MPI_DOUBLE,0,world);
   MPI_Bcast(&pRepul2[0][0],npairs*nr,MPI_DOUBLE,0,world);
@@ -8523,359 +5597,16 @@ void PairBOP::read_table(char *filename)
   MPI_Bcast(&FsigBO4[0][0],npairs*nBOt,MPI_DOUBLE,0,world);
   MPI_Bcast(&FsigBO5[0][0],npairs*nBOt,MPI_DOUBLE,0,world);
   MPI_Bcast(&FsigBO6[0][0],npairs*nBOt,MPI_DOUBLE,0,world);
-}
-
-/* ---------------------------------------------------------------------- */
-
-void PairBOP::setPbetaS()
-{
-  int i,j,k;
-  double r,value,dvalue;
-
-  for(i=0;i<npairs;i++) {
-    for(j=0;j<nr;j++) {
-      r=(double)j*dr[i];
-      if(r<rcore)
-        r=rcore;
-      if(ncutoff==3) {
-        if(r>=rcut[i])
-          pBetaS[i][j]=0.0;
-        else if(r<=r1[i]) {
-          value=betaSfunc(i,r);
-          dvalue=dBetaSfunc(i,r,value,1.0);
-          pBetaS[i][j]=value;
-        }
-        else {
-          value=betaSfunc(i,r1[i]);
-          dvalue=dBetaSfunc(i,r1[i],value,1.0);
-          pBetaS[i][j]=-(r-rcut[i])*(r-rcut[i])*(value*(2.0*r-3.0*r1[i]+rcut[i])
-              -dvalue*(r-r1[i])*(r1[i]-rcut[i]))/((r1[i]-rcut[i])
-              *(r1[i]-rcut[i])*(r1[i]-rcut[i]));
-        }
-      }
-      else {
-        if(r>=rcut[i])
-          pBetaS[i][j]=0.0;
-        else {
-          value=betaSfunc(i,r);
-          dvalue=dBetaSfunc(i,r,value,0.0);
-          pBetaS[i][j]=value*cutoff(r1[i],rcut[i],ncutoff,r);
-        }
-      }
-    }
-    pBetaS[i][nr-1]=0.0;
-    pBetaS1[i][0]=pBetaS[i][1]-pBetaS[i][0];
-    pBetaS1[i][1]=0.5*(pBetaS[i][2]-pBetaS[i][0]);
-    pBetaS1[i][nr-2]=0.5*(pBetaS[i][nr-1]-pBetaS[i][nr-3]);
-    pBetaS1[i][nr-1]=pBetaS[i][nr-1]-pBetaS[i][nr-2];
-
-    for(k=2;k<nr-2;k++) {
-      pBetaS1[i][k]=((pBetaS[i][k-2]-pBetaS[i][k+2])+8.0*(pBetaS[i][k+1]
-          -pBetaS[i][k-1]))/12.0;
-    }
-    for(k=0;k<nr-1;k++) {
-      pBetaS2[i][k]=3.0*(pBetaS[i][k+1]-pBetaS[i][k])-2.0*pBetaS1[i][k]-pBetaS1[i][k+1];
-      pBetaS3[i][k]=pBetaS1[i][k]+pBetaS1[i][k+1]-2.0*(pBetaS[i][k+1]-pBetaS[i][k]);
-    }
-    pBetaS2[i][nr-1]=0.0;
-    pBetaS3[i][nr-1]=0.0;
-    for(k=0;k<nr;k++) {
-      pBetaS4[i][k]=pBetaS1[i][k]/dr[i];
-      pBetaS5[i][k]=2.0*pBetaS2[i][k]/dr[i];
-      pBetaS6[i][k]=3.0*pBetaS3[i][k]/dr[i];
-    }
-  }
-}
-
-/* ---------------------------------------------------------------------- */
-
-void PairBOP::setPbetaP()
-{
-  int i,j,k;
-  double r,value,dvalue;
-
-  for(i=0;i<npairs;i++) {
-    for(j=0;j<nr;j++) {
-      r=(double)j*dr[i];
-      if(r<rcore)
-        r=rcore;
-      if(ncutoff==3) {
-        if(r>=rcut[i])
-          pBetaP[i][j]=0.0;
-        else if(r<=r1[i]) {
-          value=betaPfunc(i,r);
-          dvalue=dBetaPfunc(i,r,value,0.0);
-          pBetaP[i][j]=value;
-        }
-        else {
-          value=betaPfunc(i,r1[i]);
-          dvalue=dBetaPfunc(i,r1[i],value,1.0);
-          pBetaP[i][j]=-(r-rcut[i])*(r-rcut[i])*(value*(2.0*r-3.0*r1[i]
-              +rcut[i])-dvalue*(r-r1[1])*(r1[i]-rcut[i]))/((r1[i]-rcut[i])
-              *(r1[i]-rcut[i])*(r1[i]-rcut[i]));
-        }
-      }
-      else {
-        if(r>=rcut[i])
-          pBetaP[i][j]=0.0;
-        else {
-          value=betaPfunc(i,r);
-          dvalue=dBetaPfunc(i,r,value,0.0);
-          pBetaP[i][j]=value*cutoff(r1[i],rcut[i],ncutoff,r);
-        }
-      }
-    }
-    pBetaP[i][nr-1]=0.0;
-    pBetaP1[i][0]=pBetaP[i][1]-pBetaP[i][0];
-    pBetaP1[i][1]=0.5*(pBetaP[i][2]-pBetaP[i][0]);
-    pBetaP1[i][nr-2]=0.5*(pBetaP[i][nr-1]-pBetaP[i][nr-3]);
-    pBetaP1[i][nr-1]=pBetaP[i][nr-1]-pBetaP[i][nr-2];
-    for(k=2;k<nr-2;k++)
-      pBetaP1[i][k]=((pBetaP[i][k-2]-pBetaP[i][k+2])+8.0*(pBetaP[i][k+1]
-          -pBetaP[i][k-1]))/12.0;
-    for(k=0;k<nr-1;k++) {
-      pBetaP2[i][k]=3.0*(pBetaP[i][k+1]-pBetaP[i][k])-2.0*pBetaP1[i][k]-pBetaP1[i][k+1];
-      pBetaP3[i][k]=pBetaP1[i][k]+pBetaP1[i][k+1]-2.0*(pBetaP[i][k+1]-pBetaP[i][k]);
-    }
-    pBetaP2[i][nr-1]=0.0;
-    pBetaP3[i][nr-1]=0.0;
-    for(k=0;k<nr;k++) {
-      pBetaP4[i][k]=pBetaP1[i][k]/dr[i];
-      pBetaP5[i][k]=2.0*pBetaP2[i][k]/dr[i];
-      pBetaP6[i][k]=3.0*pBetaP3[i][k]/dr[i];
-    }
-  }
-}
-
-/* ---------------------------------------------------------------------- */
-
-void PairBOP::setPrepul()
-{
-  int i,j,k;
-  double r,value,dvalue;
-
-  for(i=0;i<npairs;i++) {
-    for(j=0;j<nr;j++) {
-      r=(double)j*dr[i];
-      if(r<rcore)
-        r=rcore;
-      if(ncutoff==3) {
-        if(r>=rcut[i])
-          pRepul[i][j]=0.0;
-        else if(r<=r1[i]) {
-          value=repulfunc(i,r);
-          dvalue=dRepulfunc(i,r,value,0.0);
-          pRepul[i][j]=value;
-        }
-        else {
-          value=repulfunc(i,r1[i]);
-          dvalue=dRepulfunc(i,r1[i],value,1.0);
-          pRepul[i][j]=-(r-rcut[i])*(r-rcut[i])*(value*(2.0*r-3.0*r1[i]+rcut[i])
-              -dvalue*(r-r1[i])*(r1[i]-rcut[i]))/((r1[i]-rcut[i])
-              *(r1[i]-rcut[i])*(r1[i]-rcut[i]));
-        }
-      }
-      else {
-        if(r>=rcut[i])
-          pRepul[i][j]=0.0;
-        else {
-          value=repulfunc(i,r);
-          dvalue=dRepulfunc(i,r,value,0.0);
-          pRepul[i][j]=value*cutoff(r1[i],rcut[i],ncutoff,r);
-        }
-      }
-    }
-    pRepul[i][nr-1]=0.0;
-    pRepul1[i][0]=pRepul[i][1]-pRepul[i][0];
-    pRepul1[i][1]=0.5*(pRepul[i][2]-pRepul[i][0]);
-    pRepul1[i][nr-2]=0.5*(pRepul[i][nr-1]-pRepul[i][nr-3]);
-    pRepul1[i][nr-1]=pRepul[i][nr-1]-pRepul[i][nr-2];
-    for(k=2;k<nr-2;k++)
-      pRepul1[i][k]=((pRepul[i][k-2]-pRepul[i][k+2])+8.0*(pRepul[i][k+1]
-          -pRepul[i][k-1]))/12.0;
-    for(k=0;k<nr-1;k++) {
-      pRepul2[i][k]=3.0*(pRepul[i][k+1]-pRepul[i][k])-2.0*pRepul1[i][k]-pRepul1[i][k+1];
-      pRepul3[i][k]=pRepul1[i][k]+pRepul1[i][k+1]-2.0*(pRepul[i][k+1]-pRepul[i][k]);
-    }
-    pRepul2[i][nr-1]=0.0;
-    pRepul3[i][nr-1]=0.0;
-    for(k=0;k<nr;k++) {
-      pRepul4[i][k]=pRepul1[i][k]/dr[i];
-      pRepul5[i][k]=2.0*pRepul2[i][k]/dr[i];
-      pRepul6[i][k]=3.0*pRepul3[i][k]/dr[i];
-    }
-  }
-}
-
-/* ---------------------------------------------------------------------- */
-
-double PairBOP::betaSfunc(int i,double r)
-{
-  double temp_value;
-
-  if(nfunc==1) {
-    temp_value=pow(sigma_r0[i]/r,sigma_n[i])*exp(sigma_n[i]*pow(sigma_r0[i]
-        /sigma_rc[i],sigma_nc[i])-sigma_n[i]*pow(r/sigma_rc[i],sigma_nc[i]));
-    temp_value=sigma_beta0[i]*temp_value;
-  }
-  if(nfunc==2)
-    temp_value=sigma_beta0[i]*exp(-sigma_n[i]*r);
-  if(nfunc==3)
-    temp_value=sigma_beta0[i]/pow(r,sigma_n[i]);
-  return(temp_value);
-}
-
-/* ---------------------------------------------------------------------- */
-
-double PairBOP::dBetaSfunc(int i,double r,double value,double dmore)
-{
-  double temp_dvalue;
-
-  if(nfunc==1)
-    if(dmore==1.0)
-      temp_dvalue=-sigma_n[i]*value/r*(1.0+sigma_nc[i]
-          *pow(r/sigma_rc[i],sigma_nc[i]));
-  if(nfunc==2)
-    if(dmore==1.0)
-      temp_dvalue=-sigma_n[i]*value;
-  if(nfunc==3)
-    if(dmore==1.0)
-      temp_dvalue=-sigma_n[i]*value/r;
-  return(temp_dvalue);
-}
-
-/* ---------------------------------------------------------------------- */
-
-double PairBOP::betaPfunc(int i,double r)
-{
-  double temp_value;
-
-  if(nfunc==1) {
-    temp_value=pow(pi_r0[i]/r,pi_n[i])*exp(pi_n[i]*pow(pi_r0[i]
-        /pi_rc[i],pi_nc[i])-pi_n[i]*pow(r/pi_rc[i],pi_nc[i]));
-        temp_value=pi_beta0[i]*temp_value;
-  }
-  if(nfunc==2)
-    temp_value=pi_beta0[i]*exp(-pi_n[i]*r);
-  if(nfunc==3)
-    temp_value=pi_beta0[i]/pow(r,pi_n[i]);
-  return(temp_value);
-}
-
-/* ---------------------------------------------------------------------- */
-
-double PairBOP::dBetaPfunc(int i,double r,double value,double dmore)
-{
-  double temp_dvalue;
-
-  if(nfunc==1)
-    if(dmore==1.0)
-      temp_dvalue=-pi_n[i]*value/r*(1.0+pi_nc[i]*pow(r/pi_rc[i],pi_nc[i]));
-  if(nfunc==2)
-    if(dmore==1.0)
-      temp_dvalue=-pi_n[i]*value;
-  if(nfunc==3)
-    if(dmore==1.0)
-      temp_dvalue=-pi_n[i]*value/r;
-  return(temp_dvalue);
-}
-
-/* ---------------------------------------------------------------------- */
-
-double PairBOP::repulfunc(int i,double r)
-{
-  double temp_value;
-
-  if(nfunc==1) {
-    temp_value=pow(phi_r0[i]/r,phi_m[i])*exp(phi_m[i]*pow(phi_r0[i]/phi_rc[i]
-        ,phi_nc[i])-phi_m[i]*pow(r/phi_rc[i],phi_nc[i]));
-    temp_value=phi0[i]*temp_value;
-  }
-  if(nfunc==2)
-    temp_value=phi0[i]*exp(-phi_m[i]*r);
-  if(nfunc==3)
-    temp_value=phi0[i]/pow(r,phi_m[i]);
-  return(temp_value);
-}
-
-/* ---------------------------------------------------------------------- */
-
-double PairBOP::dRepulfunc(int i,double r,double value,double dmore)
-{
-  double temp_dvalue;
-
-  if(nfunc==1)
-    if(dmore==1.0)
-      temp_dvalue=-phi_m[i]*value/r*(1.0+phi_nc[i]*pow(r/phi_rc[i],phi_nc[i]));
-  if(nfunc==2)
-    if(dmore==1.0)
-      temp_dvalue=-phi_m[i]*value;
-  if(nfunc==3)
-    if(dmore==1.0)
-      temp_dvalue=-phi_m[i]*value/r;
-  return(temp_dvalue);
-}
-
-/* ---------------------------------------------------------------------- */
-
-void PairBOP::setSign()
-{
-  int i,j,k;
-  double y0,tmp,xBO,fth,cs,bigF;
-  double epsilon,fsigma1,slope,sat;
-
-  dBO=1.0/(nBOt-1.0);
-  rdBO=1.0/dBO;
-  for(i=0;i<npairs;i++) {
-    for(j=0;j<nBOt;j++) {
-      xBO=(double)j*dBO;
-      if(which==1.0) {
-        fth=0.0;
-        if(xBO>alpha)
-          fth=4.0/3.0*(xBO-alpha);
-        if(sigma_f[i]<=fth)
-          FsigBO[i][j]=2.0*sigma_f[i];
-        else if(sigma_f[i]>=1.0-fth)
-          FsigBO[i][j]=2.0*(1.0-sigma_f[i]);
-        else {
-          cs=0.0;
-          if(xBO<alpha)
-            cs=32.0*(alpha-xBO);
-          bigF=(sigma_f[i]*(1.0-sigma_f[i])-fth*(1.0-fth))/square(1.0-2.0*fth);
-          FsigBO[i][j]=2.0*fth+2.0*bigF*(1.0-2.0*fth)*(1.0+bigF*(1.0-cs*bigF));
-        }
-      }
-      else if(which==2.0) {
-        epsilon=0.0000000001;
-        fsigma1=sigma_f[i];
-        if(fsigma1>0.5)
-          fsigma1=1.0-fsigma1;
-        y0=alpha1*pow(fsigma1,beta1)*pow(0.5-fsigma1,gamma1);
-        slope=(1.0-exp(-alpha2*pow(fsigma1,beta2)))/(1.0-exp(-alpha2*pow(0.5,beta2)));
-        sat=alpha3*fsigma1+beta3;
-        tmp=y0+slope*xBO+sat;
-        FsigBO[i][j]=(tmp-sqrt(tmp*tmp-4.0*(-epsilon*sqrt(1.0+slope*slope)
-            +y0*sat+slope*sat*xBO)))/2.0;
-      }
-    }
-    FsigBO1[i][0]=FsigBO[i][1]-FsigBO[i][0];
-    FsigBO1[i][1]=0.5*(FsigBO[i][2]-FsigBO[i][0]);
-    FsigBO1[i][nBOt-2]=0.5*(FsigBO[i][nBOt-1]-FsigBO[i][nBOt-3]);
-    FsigBO1[i][nBOt-1]=FsigBO[i][nBOt-1]-FsigBO[i][nBOt-2];
-    for(k=2;k<nBOt-2;k++)
-      FsigBO1[i][k]=((FsigBO[i][k-2]-FsigBO[i][k+2])+8.0*(FsigBO[i][k+1]
-          -FsigBO[i][k-1]))/12.0;
-    for(k=0;k<nBOt-1;k++) {
-      FsigBO2[i][k]=3.0*(FsigBO[i][k+1]-FsigBO[i][k])-2.0*FsigBO1[i][k]-FsigBO1[i][k+1];
-      FsigBO3[i][k]=FsigBO1[i][k]+FsigBO1[i][k+1]-2.0*(FsigBO[i][k+1]-FsigBO[i][k]);
-    }
-    FsigBO2[i][nBOt-1]=0.0;
-    FsigBO3[i][nBOt-1]=0.0;
-    for(k=0;k<nBOt;k++) {
-      FsigBO4[i][k]=FsigBO1[i][k]/dBO;
-      FsigBO5[i][k]=2.0*FsigBO2[i][k]/dBO;
-      FsigBO6[i][k]=3.0*FsigBO3[i][k]/dBO;
-    }
+  if(npower<=2){
+    MPI_Bcast(&gfunc[0][0][0][0],bop_types*bop_types*bop_types*ntheta,MPI_DOUBLE,0,world);
+    MPI_Bcast(&gfunc1[0][0][0][0],bop_types*bop_types*bop_types*ntheta,MPI_DOUBLE,0,world);
+    MPI_Bcast(&gfunc2[0][0][0][0],bop_types*bop_types*bop_types*ntheta,MPI_DOUBLE,0,world);
+    MPI_Bcast(&gfunc3[0][0][0][0],bop_types*bop_types*bop_types*ntheta,MPI_DOUBLE,0,world);
+    MPI_Bcast(&gfunc4[0][0][0][0],bop_types*bop_types*bop_types*ntheta,MPI_DOUBLE,0,world);
+    MPI_Bcast(&gfunc5[0][0][0][0],bop_types*bop_types*bop_types*ntheta,MPI_DOUBLE,0,world);
+    MPI_Bcast(&gfunc6[0][0][0][0],bop_types*bop_types*bop_types*ntheta,MPI_DOUBLE,0,world);
+  } else {
+    MPI_Bcast(&gpara[0][0][0][0],bop_types*bop_types*bop_types*(npower+1),MPI_DOUBLE,0,world);
   }
 }
 
@@ -8914,10 +5645,20 @@ double PairBOP::memory_usage()
 
 // rcut
   bytes += npairs * sizeof (double);
+// rcut3
+  bytes += npairs * sizeof (double);
+// rcutsq
+  bytes += npairs * sizeof (double);
+// rcutsq3
+  bytes += npairs * sizeof (double);
 // dr
   bytes += npairs * sizeof (double);
 // rdr
   bytes += npairs * sizeof (double);
+// dr3
+  bytes += npairs * sizeof (double);
+// rdr3
+  bytes += npairs * sizeof (double);
 // setflag
   bytes += (n+1) * (n+1) * sizeof (int);
 // cutsq
@@ -8940,6 +5681,20 @@ double PairBOP::memory_usage()
   bytes += npairs * nr * sizeof (double);
 // pBetaS6
   bytes += npairs * nr * sizeof (double);
+// pLong
+  bytes += npairs * nr * sizeof (double);
+// pLong1
+  bytes += npairs * nr * sizeof (double);
+// pLong2
+  bytes += npairs * nr * sizeof (double);
+// pLong3
+  bytes += npairs * nr * sizeof (double);
+// pLong4
+  bytes += npairs * nr * sizeof (double);
+// pLong5
+  bytes += npairs * nr * sizeof (double);
+// pLong6
+  bytes += npairs * nr * sizeof (double);
 // pBetaP
   bytes += npairs * nr * sizeof (double);
 // pBetaP1
@@ -8983,21 +5738,13 @@ double PairBOP::memory_usage()
 // FsigBO6
   bytes += npairs * nr * sizeof (double);
 // itypeSigBk
-  bytes += neigh_total *neigh_ct* sizeof(int);
-// nSigBk
-  bytes += neigh_total * sizeof(int);
-// sigB
-  bytes += neigh_total * sizeof(int);
-// sigB1
-  bytes += neigh_total * sizeof(int);
-// nPiBk
-  bytes += neigh_total * sizeof(int);
-// piB
-  bytes += neigh_total * sizeof(int);
+  bytes += neigh_ct* sizeof(int);
 // itypePiBk
-  bytes += neigh_total *neigh_ct* sizeof(int);
+  bytes += neigh_ct* sizeof(int);
 // BOP_index
     bytes += nall * sizeof(double);
+// BOP_total
+    bytes += nall * sizeof(double);
   if(otfly==0) {
 // cosAng
     bytes += cos_total* sizeof(double);
@@ -9024,8 +5771,8 @@ double PairBOP::memory_usage()
   }
 // pi_a
   bytes += npairs * sizeof(double);
-// pro_delta
-  bytes += npairs * sizeof(double);
+// pro
+  bytes += bop_types * sizeof(double);
 // pi_delta
   bytes += npairs * sizeof(double);
 // pi_p
@@ -9045,7 +5792,7 @@ double PairBOP::memory_usage()
 // pi_a
   bytes += npairs * sizeof(double);
 // pro_delta
-  bytes += npairs * sizeof(double);
+  bytes += bop_types * sizeof(double);
 // pi_delta
   bytes += npairs * sizeof(double);
 // pi_p
@@ -9084,24 +5831,12 @@ double PairBOP::memory_usage()
   bytes += npairs * sizeof(double);
 // phi_nc
   bytes += npairs * sizeof(double);
-// pro
-  bytes += npairs * sizeof(double);
 // sigma_delta
   bytes += npairs * sizeof(double);
 // sigma_c
   bytes += npairs * sizeof(double);
 // sigma_a
   bytes += npairs * sizeof(double);
-// sigma_g0
-  bytes += bop_types * bop_types *bop_types * sizeof(double);
-// sigma_g1
-  bytes += bop_types * bop_types *bop_types * sizeof(double);
-// sigma_g2
-  bytes += bop_types * bop_types *bop_types * sizeof(double);
-// sigma_g3
-  bytes += bop_types * bop_types *bop_types * sizeof(double);
-// sigma_g4
-  bytes += bop_types * bop_types *bop_types * sizeof(double);
 // sigma_f
   bytes += npairs * sizeof(double);
 // sigma_k
@@ -9112,7 +5847,24 @@ double PairBOP::memory_usage()
   bytes += maxneigh*(maxneigh/2) *sizeof(B_PI);
 // bt_sigma
   bytes += maxneigh*(maxneigh/2) *sizeof(B_SG);
-
+  if(npower<=2) {
+// gfunc
+    bytes += bop_types*bop_types*bop_types*ntheta *sizeof(double);
+// gfunc1
+    bytes += bop_types*bop_types*bop_types*ntheta *sizeof(double);
+// gfunc2
+    bytes += bop_types*bop_types*bop_types*ntheta *sizeof(double);
+// gfunc3
+    bytes += bop_types*bop_types*bop_types*ntheta *sizeof(double);
+// gfunc4
+    bytes += bop_types*bop_types*bop_types*ntheta *sizeof(double);
+// gfunc5
+    bytes += bop_types*bop_types*bop_types*ntheta *sizeof(double);
+// gfunc6
+    bytes += bop_types*bop_types*bop_types*ntheta *sizeof(double);
+  } else {
+    bytes += bop_types*bop_types*bop_types*npower+1 *sizeof(double);
+  }  
   return bytes;
 }
 
@@ -9120,23 +5872,25 @@ double PairBOP::memory_usage()
 
 void PairBOP::memory_theta_create()
 {
+  int nlocal,nghost,nall;
+
+  nlocal = atom->nlocal;
+  nghost = atom->nghost;
+  nall = nlocal + nghost;
   if(maxneigh<8)
     neigh_ct=(maxneigh-1)*(maxneigh-1)*(maxneigh-1);
   else
-    neigh_ct=(maxneigh-1)*(maxneigh-1);
-  memory->create(itypeSigBk,neigh_total
-      ,neigh_ct,"itypeSigBk");
-  memory->create(nSigBk,neigh_total,"nSigBk");
-  memory->create(sigB,neigh_total,"sigB");
-  memory->create(sigB1,neigh_total,"sigB1");
-  memory->create(itypePiBk,neigh_total
-      ,neigh_ct,"itypePiBk");
-  memory->create(nPiBk,neigh_total,"nPiBk");
-  memory->create(piB,neigh_total,"piB");
+    neigh_ct=(maxneigh-1)*(maxneigh-1)*(maxneigh-1);
+  if(neigh_ct<0) neigh_ct=0;
+  memory->create(itypeSigBk,neigh_ct,"itypeSigBk");
+  memory->create(itypePiBk,neigh_ct,"itypePiBk");
   memory->create(neigh_flag,neigh_total,"neigh_flag");
+  memory->create(neigh_flag3,neigh_total3,"neigh_flag3");
+  memory->create(neigh_index,neigh_total,"neigh_index");
+  memory->create(neigh_index3,neigh_total3,"neigh_index3");
   if(otfly==0) {
     memory->create(cosAng,cos_total,"BOP:cosAng");
-    memory->create(dcAng,cos_total*2,3,2,"BOP:dcAng");
+    memory->create(dcAng,cos_total,3,2,"BOP:dcAng");
     memory->create(disij,3,neigh_total,"disij");
     memory->create(rij,neigh_total,"rij");
     memory->create(betaS,neigh_total,"betaS");
@@ -9153,23 +5907,25 @@ void PairBOP::memory_theta_create()
 
 void PairBOP::memory_theta_grow()
 {
+  int nlocal,nghost,nall;
+
+  nlocal = atom->nlocal;
+  nghost = atom->nghost;
+  nall = nlocal + nghost;
   if(maxneigh<8)
     neigh_ct=(maxneigh-1)*(maxneigh-1)*(maxneigh-1);
   else
-    neigh_ct=(maxneigh-1)*(maxneigh-1);
-  memory->grow(itypeSigBk,neigh_total
-      ,neigh_ct,"itypeSigBk");
-  memory->grow(nSigBk,neigh_total,"nSigBk");
-  memory->grow(sigB,neigh_total,"sigB");
-  memory->grow(sigB1,neigh_total,"sigB1");
-  memory->grow(itypePiBk,neigh_total
-      ,neigh_ct,"itypePiBk");
-  memory->grow(nPiBk,neigh_total,"nPiBk");
-  memory->grow(piB,neigh_total,"piB");
+    neigh_ct=(maxneigh-1)*(maxneigh-1)*(maxneigh-1);
+  if(neigh_ct<0) neigh_ct=0;
+  memory->grow(itypeSigBk,neigh_ct,"itypeSigBk");
+  memory->grow(itypePiBk,neigh_ct,"itypePiBk");
   memory->grow(neigh_flag,neigh_total,"neigh_flag");
+  memory->grow(neigh_flag3,neigh_total3,"neigh_flag3");
+  memory->grow(neigh_index,neigh_total,"neigh_index");
+  memory->grow(neigh_index3,neigh_total3,"neigh_index3");
   if(otfly==0) {
     memory->grow(cosAng,cos_total,"BOP:cosAng");
-    memory->grow(dcAng,cos_total*2,3,2,"BOP:dcAng");
+    memory->grow(dcAng,cos_total,3,2,"BOP:dcAng");
     memory->grow(disij,3,neigh_total,"disij");
     memory->grow(rij,neigh_total,"rij");
     memory->grow(betaS,neigh_total,"betaS");
@@ -9188,13 +5944,11 @@ void PairBOP::memory_theta_destroy()
 {
 
   memory->destroy(itypeSigBk);
-  memory->destroy(nSigBk);
-  memory->destroy(sigB);
-  memory->destroy(sigB1);
   memory->destroy(itypePiBk);
-  memory->destroy(nPiBk);
-  memory->destroy(piB);
   memory->destroy(neigh_flag);
+  memory->destroy(neigh_flag3);
+  memory->destroy(neigh_index);
+  memory->destroy(neigh_index3);
   if(otfly==0) {
     memory->destroy(cosAng);
     memory->destroy(dcAng);
diff --git a/src/MANYBODY/pair_bop.h b/src/MANYBODY/pair_bop.h
index 483884a936..ed8d1fdc27 100644
--- a/src/MANYBODY/pair_bop.h
+++ b/src/MANYBODY/pair_bop.h
@@ -1,4 +1,4 @@
-/* -*- c++ -*- ----------------------------------------------------------
+/* ----------------------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    http://lammps.sandia.gov, Sandia National Laboratories
    Steve Plimpton, sjplimp@sandia.gov
@@ -26,6 +26,7 @@ PairStyle(bop,PairBOP)
 #define LMP_PAIR_BOP_H
 
 #include "pair.h"
+#include "time.h"
 #include "update.h"
 
 namespace LAMMPS_NS {
@@ -44,23 +45,40 @@ class PairBOP : public Pair {
  private:
   int me;
   int maxneigh;                    // maximum size of neighbor list on this processor
+  int maxneigh3;                    // maximum size of neighbor list on this processor
   int update_list;                 // check for changing maximum size of neighbor list
+  int maxbopn;                     // maximum size of bop neighbor list for allocation
   int maxnall;                     // maximum size of bop neighbor list for allocation
   int *map;                        // mapping from atom types to elements
-  int nr;                     // increments for the BOP potential
+  int nelements;                   // # of unique elments
+  int nr;                     // increments for the BOP pair potential
+  int ntheta;                     // increments for the angle function
+  int npower;                     // power of the angular function
   int nBOt;                   // second BO increments
   int bop_types;                   // number of elments in potential
   int npairs;                      // number of element pairs
+  char **elements;                   // names of unique elements
+  int ***elem2param;
+  int nparams;
   int bop_step;
   int allocate_pi;
   int allocate_sigma;
   int allocate_neigh;
   int nb_pi,nb_sg;
+  int ago1;
+//  int cnt1;
 
   int *BOP_index;                 // index for neighbor list position
+  int *BOP_total;                 // index for neighbor list position
+  int *BOP_index3;                 // index for neighbor list position
+  int *BOP_total3;                 // index for neighbor list position
+  int *neigh_index;                 // index for neighbor list position
+  int *neigh_index3;                 // index for neighbor list position
   int neigh_total;                // total number of neighbors stored
+  int neigh_total3;                // total number of neighbors stored
   int *cos_index;                 // index for neighbor cosine if not using on the fly
   int *neigh_flag;                 // index for neighbor cosine if not using on the fly
+  int *neigh_flag3;                 // index for neighbor cosine if not using on the fly
   int cos_total;                  // number of cosines stored if not using on the fly
   int neigh_ct;                  //  limit for large arrays
 
@@ -73,9 +91,8 @@ class PairBOP : public Pair {
   double *sigma_rc,*pi_rc,*phi_rc,*r1,*sigma_beta0;
   double *pi_beta0,*phi0,*sigma_n,*pi_n,*phi_m;
   double *sigma_nc,*pi_nc,*phi_nc;
-  double *pro,*sigma_delta,*sigma_c,*sigma_a;
-  double ***sigma_g0,***sigma_g1,***sigma_g2,***sigma_g3;
-  double ***sigma_g4,*sigma_f,*sigma_k,*small3;
+  double *pro,*sigma_delta,*sigma_c,*sigma_a;  
+  double *sigma_f,*sigma_k,*small3;
   double small1,small2,small3g,small4,small5,small6,small7;
   double which,alpha,alpha1,beta1,gamma1,alpha2,beta2,alpha3;
   double beta3,rsmall,rbig,rcore;
@@ -87,18 +104,16 @@ class PairBOP : public Pair {
                                 //on the fly will slow down calculations
                                 //but requires less memory on = 1, off=0
 
-  int table;                        //determines the method for reading in
-                                //potential parameters a preset table
-                                //or generate the tables using a spline
-
 /* Neigh variables */
 
-  double *rcut,*dr,*rdr;
+  double *rcut,*rcut3,*dr,*rdr,*dr3,*rdr3;
+  double *rcutsq,*rcutsq3;
   double **disij,*rij;
+  double rcutall,rctroot;
 
 /*Triple variables */
 
-  double *cosAng,***dcAng;
+  double *cosAng,***dcosAng,***dcAng;
 
 /*Double variables */
 
@@ -107,15 +122,15 @@ class PairBOP : public Pair {
 
 /*Sigma variables */
 
-  int **itypeSigBk,*nSigBk;
-  double *sigB;
-  double *sigB1;
+  int *itypeSigBk,nSigBk;
+  double sigB,sigB_0;
+  double sigB1;
 
 
 /*Pi variables */
 
-  int **itypePiBk,*nPiBk;
-  double *piB;
+  int *itypePiBk,nPiBk;
+  double piB,piB_0;
 
 /*Grids1 variables */
 
@@ -132,6 +147,14 @@ class PairBOP : public Pair {
   double **pRepul,**pRepul1,**pRepul2,**pRepul3;
   double **pRepul4,**pRepul5,**pRepul6;
 
+  double **pLong,**pLong1,**pLong2,**pLong3;
+  double **pLong4,**pLong5,**pLong6;
+
+  double ****gfunc,****gpara;
+  double ****gfunc1,****gfunc2,****gfunc3;
+  double ****gfunc4,****gfunc5,****gfunc6;
+  double dtheta,rdtheta;
+
 /*Grids4 variables */
 
   double **FsigBO,**FsigBO1,**FsigBO2,**FsigBO3;
@@ -182,24 +205,21 @@ class PairBOP : public Pair {
   void gneigh();
   void theta();
   void theta_mod();
-  void sigmaBo();
-  void PiBo();
-  void sigmaBo_otf();
-  void PiBo_otf();
-  void sigmaBo_noa();
-  void sigmaBo_noa_otf();
+  double sigmaBo(int, int);
+  double PiBo(int, int);
   void memory_theta_create();
   void memory_theta_destroy();
   void memory_theta_grow();
   double cutoff(double, double, int, double);
+/*
   double betaSfunc(int, double);
   double dBetaSfunc(int, double, double, double);
   double betaPfunc(int, double);
   double dBetaPfunc(int, double, double, double);
   double repulfunc(int, double);
   double dRepulfunc(int, double, double, double);
+*/
 
-  void read_file(char *);
   void read_table(char *);
   void allocate();
   void create_pi(int);
-- 
GitLab