From b7c74926088515c20e45350bf352697d44d57bd2 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 13 Oct 2017 09:50:56 -0400 Subject: [PATCH] handle invalid lookup for bond/angle tabulation --- src/MOLECULE/angle_table.cpp | 16 +++++++--------- src/MOLECULE/bond_table.cpp | 24 +++++++++++++----------- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/MOLECULE/angle_table.cpp b/src/MOLECULE/angle_table.cpp index 4d9007adb7..b9f467f463 100644 --- a/src/MOLECULE/angle_table.cpp +++ b/src/MOLECULE/angle_table.cpp @@ -609,18 +609,18 @@ double AngleTable::splint(double *xa, double *ya, double *y2a, int n, double x) void AngleTable::uf_lookup(int type, double x, double &u, double &f) { - int itable; double fraction,a,b; - Table *tb = &tables[tabindex[type]]; + const Table *tb = &tables[tabindex[type]]; + const int itable = static_cast (x * tb->invdelta); - if (tabstyle == LINEAR) { - itable = static_cast ( x * tb->invdelta); + if ((itable < 0) || (itable >= tablength) || (!ISFINITE(itable))) { + error->one(FLERR,"Illegal angle in angle style table"); + } else if (tabstyle == LINEAR) { fraction = (x - tb->ang[itable]) * tb->invdelta; u = tb->e[itable] + fraction*tb->de[itable]; f = tb->f[itable] + fraction*tb->df[itable]; } else if (tabstyle == SPLINE) { - itable = static_cast ( x * tb->invdelta); fraction = (x - tb->ang[itable]) * tb->invdelta; b = (x - tb->ang[itable]) * tb->invdelta; @@ -640,17 +640,15 @@ void AngleTable::uf_lookup(int type, double x, double &u, double &f) void AngleTable::u_lookup(int type, double x, double &u) { - int itable; double fraction,a,b; - Table *tb = &tables[tabindex[type]]; + const Table *tb = &tables[tabindex[type]]; + const int itable = static_cast ( x * tb->invdelta); if (tabstyle == LINEAR) { - itable = static_cast ( x * tb->invdelta); fraction = (x - tb->ang[itable]) * tb->invdelta; u = tb->e[itable] + fraction*tb->de[itable]; } else if (tabstyle == SPLINE) { - itable = static_cast ( x * tb->invdelta); fraction = (x - tb->ang[itable]) * tb->invdelta; b = (x - tb->ang[itable]) * tb->invdelta; diff --git a/src/MOLECULE/bond_table.cpp b/src/MOLECULE/bond_table.cpp index 38cbe7e406..a641f41a6f 100644 --- a/src/MOLECULE/bond_table.cpp +++ b/src/MOLECULE/bond_table.cpp @@ -590,29 +590,28 @@ double BondTable::splint(double *xa, double *ya, double *y2a, int n, double x) void BondTable::uf_lookup(int type, double x, double &u, double &f) { - int itable; double fraction,a,b; char estr[128]; - Table *tb = &tables[tabindex[type]]; - if (x < tb->lo) { + const Table *tb = &tables[tabindex[type]]; + const int itable = static_cast ((x - tb->lo) * tb->invdelta); + if (itable < 0) { sprintf(estr,"Bond length < table inner cutoff: " "type %d length %g",type,x); error->one(FLERR,estr); - } - if (x > tb->hi) { + } else if (itable >= tablength) { sprintf(estr,"Bond length > table outer cutoff: " "type %d length %g",type,x); error->one(FLERR,estr); + } else if (!ISFINITE(itable)) { + error->one(FLERR,"Illegal bond length in bond style table"); } if (tabstyle == LINEAR) { - itable = static_cast ((x - tb->lo) * tb->invdelta); fraction = (x - tb->r[itable]) * tb->invdelta; u = tb->e[itable] + fraction*tb->de[itable]; f = tb->f[itable] + fraction*tb->df[itable]; } else if (tabstyle == SPLINE) { - itable = static_cast ((x - tb->lo) * tb->invdelta); fraction = (x - tb->r[itable]) * tb->invdelta; b = (x - tb->r[itable]) * tb->invdelta; @@ -633,19 +632,22 @@ void BondTable::uf_lookup(int type, double x, double &u, double &f) void BondTable::u_lookup(int type, double x, double &u) { - int itable; double fraction,a,b; - Table *tb = &tables[tabindex[type]]; + if (!ISFINITE(x)) { + u = 0.0; + return; + } + + const Table *tb = &tables[tabindex[type]]; x = MAX(x,tb->lo); x = MIN(x,tb->hi); + const int itable = static_cast ((x - tb->lo) * tb->invdelta); if (tabstyle == LINEAR) { - itable = static_cast ((x - tb->lo) * tb->invdelta); fraction = (x - tb->r[itable]) * tb->invdelta; u = tb->e[itable] + fraction*tb->de[itable]; } else if (tabstyle == SPLINE) { - itable = static_cast ((x - tb->lo) * tb->invdelta); fraction = (x - tb->r[itable]) * tb->invdelta; b = (x - tb->r[itable]) * tb->invdelta;