From 3f3bab4e7199833f50123abe1777edaf90e369ee Mon Sep 17 00:00:00 2001
From: "Ryan S. Elliott" <relliott@umn.edu>
Date: Mon, 2 Apr 2018 09:38:30 -0500
Subject: [PATCH] Create KIM_LAMMPS_PlugIn.h & related changes

---
 lib/kim/Install.py            |  13 +-
 lib/kim/KIM_LAMMPS_PlugIn.h   | 210 ++++++++++++++++++++++
 lib/kim/Makefile.lammps       |   4 +-
 lib/kim/README                |   9 +-
 lib/kim/pair-kim.release.info |   6 -
 src/KIM/pair_kim.cpp          | 326 ++++++++--------------------------
 src/KIM/pair_kim.h            |  38 +---
 7 files changed, 295 insertions(+), 311 deletions(-)
 create mode 100644 lib/kim/KIM_LAMMPS_PlugIn.h
 delete mode 100644 lib/kim/pair-kim.release.info

diff --git a/lib/kim/Install.py b/lib/kim/Install.py
index 8fbaaffb7f..0c9d717bc3 100644
--- a/lib/kim/Install.py
+++ b/lib/kim/Install.py
@@ -21,7 +21,7 @@ Syntax from lib dir: python Install.py -b -v version  -a kim-name
 specify one or more options, order does not matter
 
   -v = version of KIM API library to use
-       default = kim-api-v1.9.4 (current as of Mar 2018)
+       default = kim-api-v1.9.4 (current as of Apr 2018)
   -b = download and build base KIM API library with example Models
        this will delete any previous installation in the current folder
   -n = do NOT download and build base KIM API library.
@@ -166,9 +166,6 @@ if pathflag:
     mkfile.write("print_dir:\n")
     mkfile.write("	@printf $(KIM_INSTALL_DIR)\n")
 
-  with open("%s/Makefile.KIM_Config" % thisdir, 'w') as cfgfile:
-    cfgfile.write("include %s/lib/kim-api/Makefile.KIM_Config" % kimdir)
-
   print("Created %s/Makefile.KIM_DIR\n  using %s" % (thisdir,kimdir))
 else:
   kimdir = os.path.join(os.path.abspath(thisdir), "installed-" + version)
@@ -191,9 +188,6 @@ if buildflag:
     mkfile.write("print_dir:\n")
     mkfile.write("	@printf $(KIM_INSTALL_DIR)\n")
 
-  with open("%s/Makefile.KIM_Config" % thisdir, 'w') as cfgfile:
-    cfgfile.write("include %s/lib/kim-api/Makefile.KIM_Config" % kimdir)
-
   print("Created %s/Makefile.KIM_DIR\n  using %s" % (thisdir,kimdir))
 
   # download entire kim-api tarball
@@ -247,8 +241,9 @@ if buildflag:
 # add single OpenKIM model
 if addflag:
 
-  if os.path.isfile(os.path.join(thisdir, "Makefile.KIM_DIR")):
-    cmd = 'make -f Makefile.KIM_DIR print_dir'
+  makefile_path = os.path.join(thisdir, "Makefile.KIM_DIR")
+  if os.path.isfile(makefile_path):
+    cmd = 'make --no-print-directory -f %s print_dir' % makefile_path
     kimdir = subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True)
 
   if not os.path.isdir(kimdir):
diff --git a/lib/kim/KIM_LAMMPS_PlugIn.h b/lib/kim/KIM_LAMMPS_PlugIn.h
new file mode 100644
index 0000000000..33706e220d
--- /dev/null
+++ b/lib/kim/KIM_LAMMPS_PlugIn.h
@@ -0,0 +1,210 @@
+// Copyright 2018 Regents of the University of Minnesota
+// All rights reserved.
+//
+// Contributing authors: Ryan S. Elliott
+
+#define KIM_STATUS_OK 1
+#define KIM_STATUS_NEIGH_ITER_PAST_END 2
+#define KIM_STATUS_NEIGH_ITER_INIT_OK 3
+#define KIM_STATUS_NEIGH_INVALID_REQUEST -11
+#define KIM_STATUS_NEIGH_INVALID_MODE -6
+#define KIM_COMPUTE_FALSE 0
+#define KIM_COMPUTE_TRUE 1
+#define KIM_STATUS_FAIL 0
+
+#include "dlfcn.h"
+#include "error.h"
+
+namespace LAMMPS_NS {
+
+class KIM_LAMMPS_PlugIn {
+ public:
+  ~KIM_LAMMPS_PlugIn() {};
+  KIM_LAMMPS_PlugIn() : library(NULL) {};
+
+  bool setup_kim_api_library(Error * const error);
+  bool is_strictly_between_1_5_and_2_0;
+
+  // KIM symbols
+  void* library;
+  int (*report_error)(int line, const char *, const char *, int);
+  void (*setm_compute_by_index)(void *, int *, ...);
+  int (*model_compute)(void *);
+  int (*model_init)(void *);
+  int (*model_reinit)(void *);
+  void * (*get_sim_buffer)(void *, int *);
+  void * (*get_data_by_index)(void *, int, int *);
+  int (*model_destroy)(void *);
+  void (*free)(void *, int *);
+  int (*string_init)(void *, const char *, const char *);
+  int (*is_half_neighbors)(void *, int *);
+  int (*get_NBC_method)(void *, const char **);
+  int (*get_index)(void *, const char *, int *);
+  int (*getm_index)(void *, int *, int, ...);
+  int (*get_species_code)(void *, const char *, int *);
+  void (*setm_data_by_index)(void *, int *, int, ...);
+  int (*set_method_by_index)(void *, int, intptr_t, void (*)());
+  void (*set_sim_buffer)(void *, void *, int *);
+  int (*set_data_by_index)(void *, int, intptr_t, void *);
+  void (*set_compute_by_index)(void *, int, int, int*);
+  int (*get_num_params)(void *, int *, int *);
+  int (*get_free_parameter)(void *, const int, const char **);
+  void * (*get_data)(void *, const char *, int *);
+  intptr_t (*get_rank)(void *, const char *, int *);
+  intptr_t (*get_shape)(void *, const char *, int *, int *);
+  int (*model_info)(void *, const char *);
+};
+
+
+bool KIM_LAMMPS_PlugIn::setup_kim_api_library(Error * error)
+{
+  if (library == NULL)
+  {
+#ifdef KIM_INSTALL_DIR
+    library = dlopen(KIM_INSTALL_DIR "/lib/libkim-api-v1.so", RTLD_NOW);
+#endif
+
+    if (library == NULL)
+      library = dlopen("kim-api-v1.so", RTLD_NOW);
+
+    if (library == NULL)
+    {
+      error->all(FLERR,"KIM API library cannot be found");
+      return false;
+    }
+    else
+    {
+      // check for version and set is_strictly_between_1_5_and_2_0
+      void * ver = dlsym(library, "KIM_API_get_version");
+      if (ver == NULL)
+        is_strictly_between_1_5_and_2_0 = false;
+      else
+        is_strictly_between_1_5_and_2_0 = true;
+
+      std::string error_prefix("KIM API library error: ");
+      // get symbols
+      if (NULL == (report_error =
+                   (int (*)(int, const char *, const char *, int))
+                   dlsym(library, "KIM_API_report_error")))
+        error->all(FLERR,(error_prefix + std::string(dlerror())).c_str());
+
+      if (NULL == (setm_compute_by_index =
+                   (void (*)(void *, int *, ...))
+                   dlsym(library, "KIM_API_setm_compute_by_index")))
+        error->all(FLERR,(error_prefix + std::string(dlerror())).c_str());
+
+      if (NULL == (model_compute = (int (*)(void *))
+                   dlsym(library, "KIM_API_model_compute")))
+        error->all(FLERR,(error_prefix + std::string(dlerror())).c_str());
+
+      if (NULL == (model_init = (int (*)(void *))
+                   dlsym(library, "KIM_API_model_init")))
+        error->all(FLERR,(error_prefix + std::string(dlerror())).c_str());
+
+      if (NULL == (model_reinit = (int (*)(void *))
+                   dlsym(library, "KIM_API_model_reinit")))
+        error->all(FLERR,(error_prefix + std::string(dlerror())).c_str());
+
+      if (NULL == (get_sim_buffer = (void * (*)(void *, int *))
+                   dlsym(library, "KIM_API_get_sim_buffer")))
+        error->all(FLERR,(error_prefix + std::string(dlerror())).c_str());
+
+      if (NULL == (get_data_by_index = (void * (*)(void *, int, int *))
+                   dlsym(library, "KIM_API_get_data_by_index")))
+        error->all(FLERR,(error_prefix + std::string(dlerror())).c_str());
+
+      if (NULL == (model_destroy = (int (*)(void *))
+                   dlsym(library, "KIM_API_model_destroy")))
+        error->all(FLERR,(error_prefix + std::string(dlerror())).c_str());
+
+      if (NULL == (free = (void (*)(void *, int *))
+                   dlsym(library, "KIM_API_free")))
+        error->all(FLERR,(error_prefix + std::string(dlerror())).c_str());
+
+      if (NULL == (string_init =
+                   (int (*)(void *, const char *, const char *))
+                   dlsym(library, "KIM_API_string_init")))
+        error->all(FLERR,(error_prefix + std::string(dlerror())).c_str());
+
+      if (NULL == (is_half_neighbors = (int (*)(void *, int *))
+                   dlsym(library, "KIM_API_is_half_neighbors")))
+        error->all(FLERR,(error_prefix + std::string(dlerror())).c_str());
+
+      if (NULL == (get_NBC_method = (int (*)(void *, const char **))
+                   dlsym(library, "KIM_API_get_NBC_method")))
+        error->all(FLERR,(error_prefix + std::string(dlerror())).c_str());
+
+      if (NULL == (get_index = (int (*)(void *, const char *, int *))
+                   dlsym(library, "KIM_API_get_index")))
+        error->all(FLERR,(error_prefix + std::string(dlerror())).c_str());
+
+      if (NULL == (getm_index = (int (*)(void *, int *, int, ...))
+                   dlsym(library, "KIM_API_getm_index")))
+        error->all(FLERR,(error_prefix + std::string(dlerror())).c_str());
+
+      if (NULL == (get_species_code =
+                   (int (*)(void *, const char *, int *))
+                   dlsym(library, "KIM_API_get_species_code")))
+        error->all(FLERR,(error_prefix + std::string(dlerror())).c_str());
+
+      if (NULL == (setm_data_by_index =
+                   (void (*)(void *, int *, int, ...))
+                   dlsym(library, "KIM_API_setm_data_by_index")))
+        error->all(FLERR,(error_prefix + std::string(dlerror())).c_str());
+
+      if (NULL == (set_method_by_index =
+                   (int (*)(void *, int, intptr_t, void (*)()))
+                   dlsym(library, "KIM_API_set_method_by_index")))
+        error->all(FLERR,(error_prefix + std::string(dlerror())).c_str());
+
+      if (NULL == (set_sim_buffer = (void (*)(void *, void *, int *))
+                   dlsym(library, "KIM_API_set_sim_buffer")))
+        error->all(FLERR,(error_prefix + std::string(dlerror())).c_str());
+
+      if (NULL == (set_data_by_index =
+                   (int (*)(void *, int, intptr_t, void *))
+                   dlsym(library, "KIM_API_set_data_by_index")))
+        error->all(FLERR,(error_prefix + std::string(dlerror())).c_str());
+
+      if (NULL == (set_compute_by_index =
+                   (void (*)(void *, int, int, int*))
+                   dlsym(library, "KIM_API_set_compute_by_index")))
+        error->all(FLERR,(error_prefix + std::string(dlerror())).c_str());
+
+      if (NULL == (get_num_params = (int (*)(void *, int *, int *))
+                   dlsym(library, "KIM_API_get_num_params")))
+        error->all(FLERR,(error_prefix + std::string(dlerror())).c_str());
+
+      if (NULL == (get_free_parameter =
+                   (int (*)(void *, const int, const char **))
+                   dlsym(library, "KIM_API_get_free_parameter")))
+        error->all(FLERR,(error_prefix + std::string(dlerror())).c_str());
+
+      if (NULL == (get_data = (void * (*)(void *, const char *, int *))
+                   dlsym(library, "KIM_API_get_data")))
+        error->all(FLERR,(error_prefix + std::string(dlerror())).c_str());
+
+      if (NULL == (get_rank =
+                   (intptr_t (*)(void *, const char *, int *))
+                   dlsym(library, "KIM_API_get_rank")))
+        error->all(FLERR,(error_prefix + std::string(dlerror())).c_str());
+
+      if (NULL == (get_shape =
+                   (intptr_t (*)(void *, const char *, int *, int *))
+                   dlsym(library, "KIM_API_get_shape")))
+        error->all(FLERR,(error_prefix + std::string(dlerror())).c_str());
+
+      if (NULL == (model_info = (int (*)(void *, const char *))
+                   dlsym(library, "KIM_API_model_info")))
+        error->all(FLERR,(error_prefix + std::string(dlerror())).c_str());
+
+    return true;
+    }
+  }
+  else
+  {
+    return true;
+  }
+}
+
+}  // namespace LAMMPS_NS
diff --git a/lib/kim/Makefile.lammps b/lib/kim/Makefile.lammps
index dc2a6b78d4..39afb1286a 100644
--- a/lib/kim/Makefile.lammps
+++ b/lib/kim/Makefile.lammps
@@ -18,6 +18,6 @@
 
 include ../../lib/kim/Makefile.KIM_DIR
 
-kim_SYSINC  = -DKIM_INSTALL_DIR=\"${KIM_INSTALL_DIR}\"
-kim_SYSLIB  =
+kim_SYSINC  = -I../../lib/kim -DKIM_INSTALL_DIR=\"$(KIM_INSTALL_DIR)\"
+kim_SYSLIB  = -ldl
 kim_SYSPATH =
diff --git a/lib/kim/README b/lib/kim/README
index bf1148ed10..ce4ea1bdff 100644
--- a/lib/kim/README
+++ b/lib/kim/README
@@ -20,11 +20,11 @@ Instructions:
 
 1. Configure lammps for use with the kim-api library installed in this directory
 
-$ printf "KIM_INSTALL_DIR=${PWD}\n" > ./Makefile.KIM_DIR
+# replace X.Y.Z as appropriate here and below
+$ printf "KIM_INSTALL_DIR=${PWD}/installed-kim-api-vX.Y.Z\n" > ./Makefile.KIM_DIR
 
 2. Download and unpack the kim-api
 
-# replace X.Y.Z as appropriate here and below
 $ wget http://s3.openkim.org/kim-api/kim-api-vX.Y.Z.txz
 $ tar zxvf kim-api-vX.Y.Z.txz
 
@@ -36,6 +36,7 @@ $ ./configure --prefix=${PWD}/../installed-kim-api-vX.Y.Z
 
 $ make
 $ make install
+$ cd ..
 
 4. Remove source and build files
 
@@ -45,7 +46,7 @@ $ rm -rf kim-api-vX.Y.Z.txz
 5. To add items do the following (replace the kim item name with your
    desired value)
 
-$ source ${PWD}/../kim-api-vX.Y.Z/bin/kim-api-v1-activate
+$ source ${PWD}/kim-api-vX.Y.Z/bin/kim-api-v1-activate
 $ kim-api-v1-collections-management install system Pair_Johnson_Fe__MO_857282754307_002
 
 
@@ -60,4 +61,4 @@ $ make g++ (or whatever target you wish)
 
 Note that the Makefile.lammps and Makefile.KIM_DIR files in this directory
 are required to allow the LAMMPS build to find the necessary KIM files.
-You should not normally need to edit this file.
+You should not normally need to edit these files.
diff --git a/lib/kim/pair-kim.release.info b/lib/kim/pair-kim.release.info
deleted file mode 100644
index f6c3c01c4e..0000000000
--- a/lib/kim/pair-kim.release.info
+++ /dev/null
@@ -1,6 +0,0 @@
-This package (pair-kim-v1.7.2+1) created from commit
-
-ced1275c5fd5b382cb9bd39e44ed1324c7c85e99
-
-of the pair-kim git repository
-By Ryan S. Elliott (relliott@umn.edu) on Mon Feb 22 14:59:53 CST 2016.
diff --git a/src/KIM/pair_kim.cpp b/src/KIM/pair_kim.cpp
index b92b07e23f..57bb6cb894 100644
--- a/src/KIM/pair_kim.cpp
+++ b/src/KIM/pair_kim.cpp
@@ -27,7 +27,6 @@
 
 // includes from LAMMPS
 #include "pair_kim.h"
-#include "pair_kim_version.h"
 #include "atom.h"
 #include "comm.h"
 #include "force.h"
@@ -39,201 +38,13 @@
 #include "domain.h"
 #include "error.h"
 
-// includes from KIM
-#include "dlfcn.h"
-
-#define KIM_STATUS_OK 1
-#define KIM_STATUS_NEIGH_ITER_PAST_END 2
-#define KIM_STATUS_NEIGH_ITER_INIT_OK 3
-#define KIM_STATUS_NEIGH_INVALID_REQUEST -11
-#define KIM_STATUS_NEIGH_INVALID_MODE -6
-#define KIM_COMPUTE_FALSE 0
-#define KIM_COMPUTE_TRUE 1
-#define KIM_STATUS_FAIL 0
+#include "KIM_LAMMPS_PlugIn.h"
 
 using namespace LAMMPS_NS;
 
 /* ---------------------------------------------------------------------- */
 
-void * PairKIM::kim_api_library = NULL;
-bool PairKIM::kim_api_is_strictly_between_1_5_and_2_0;
-int (*PairKIM::report_error)(int line, const char *, const char *, int) = NULL;
-void (*PairKIM::kim_api_setm_compute_by_index)(void *, int *, ...) = NULL;
-int (*PairKIM::kim_api_model_compute)(void *);
-int (*PairKIM::kim_api_model_init)(void *);
-int (*PairKIM::kim_api_model_reinit)(void *);
-void * (*PairKIM::kim_api_get_sim_buffer)(void *, int *);
-void * (*PairKIM::kim_api_get_data_by_index)(void *, int, int *);
-int (*PairKIM::kim_api_model_destroy)(void *);
-void (*PairKIM::kim_api_free)(void *, int *);
-int (*PairKIM::kim_api_string_init)(void *, const char *, const char *);
-int (*PairKIM::kim_api_is_half_neighbors)(void *, int *);
-int (*PairKIM::kim_api_get_NBC_method)(void *, const char **);
-int (*PairKIM::kim_api_get_index)(void *, const char *, int *);
-int (*PairKIM::kim_api_getm_index)(void *, int *, int, ...);
-int (*PairKIM::kim_api_get_species_code)(void *, const char *, int *);
-void (*PairKIM::kim_api_setm_data_by_index)(void *, int *, int, ...);
-int (*PairKIM::kim_api_set_method_by_index)(void *, int, intptr_t, void (*)());
-void (*PairKIM::kim_api_set_sim_buffer)(void *, void *, int *);
-int (*PairKIM::kim_api_set_data_by_index)(void *, int, intptr_t, void *);
-void (*PairKIM::kim_api_set_compute_by_index)(void *, int, int, int*);
-int (*PairKIM::kim_api_get_num_params)(void *, int *, int *);
-int (*PairKIM::kim_api_get_free_parameter)(void *, const int, const char **);
-void * (*PairKIM::kim_api_get_data)(void *, const char *, int *);
-intptr_t (*PairKIM::kim_api_get_rank)(void *, const char *, int *);
-intptr_t (*PairKIM::kim_api_get_shape)(void *, const char *, int *, int *);
-int (*PairKIM::kim_api_model_info)(void *, const char *);
-
-bool PairKIM::setup_kim_api_library()
-{
-  if (kim_api_library == NULL)
-  {
-#ifdef KIM_INSTALL_DIR
-    kim_api_library = dlopen(KIM_INSTALL_DIR "/lib/libkim-api-v1.so", RTLD_NOW);
-#endif
-
-    if (kim_api_library == NULL)
-      kim_api_library = dlopen("kim-api-v1.so", RTLD_NOW);
-
-    if (kim_api_library == NULL)
-    {
-      error->all(FLERR,"KIM API library cannot be found");
-      return false;
-    }
-    else
-    {
-      // check for version and set kim_api_is_strictly_between_1_5_and_2_0
-      void * ver = dlsym(kim_api_library, "KIM_API_get_version");
-      if (ver == NULL)
-        kim_api_is_strictly_between_1_5_and_2_0 = false;
-      else
-        kim_api_is_strictly_between_1_5_and_2_0 = true;
-
-      std::string error_prefix("KIM API library error: ");
-      // get symbols
-      if (NULL == (report_error =
-                   (int (*)(int, const char *, const char *, int))
-                   dlsym(kim_api_library, "KIM_API_report_error")))
-        error->all(FLERR,(error_prefix + std::string(dlerror())).c_str());
-
-      if (NULL == (kim_api_setm_compute_by_index =
-                   (void (*)(void *, int *, ...))
-                   dlsym(kim_api_library, "KIM_API_setm_compute_by_index")))
-        error->all(FLERR,(error_prefix + std::string(dlerror())).c_str());
-
-      if (NULL == (kim_api_model_compute = (int (*)(void *))
-                   dlsym(kim_api_library, "KIM_API_model_compute")))
-        error->all(FLERR,(error_prefix + std::string(dlerror())).c_str());
-
-      if (NULL == (kim_api_model_init = (int (*)(void *))
-                   dlsym(kim_api_library, "KIM_API_model_init")))
-        error->all(FLERR,(error_prefix + std::string(dlerror())).c_str());
-
-      if (NULL == (kim_api_model_reinit = (int (*)(void *))
-                   dlsym(kim_api_library, "KIM_API_model_reinit")))
-        error->all(FLERR,(error_prefix + std::string(dlerror())).c_str());
-
-      if (NULL == (kim_api_get_sim_buffer = (void * (*)(void *, int *))
-                   dlsym(kim_api_library, "KIM_API_get_sim_buffer")))
-        error->all(FLERR,(error_prefix + std::string(dlerror())).c_str());
-
-      if (NULL == (kim_api_get_data_by_index = (void * (*)(void *, int, int *))
-                   dlsym(kim_api_library, "KIM_API_get_data_by_index")))
-        error->all(FLERR,(error_prefix + std::string(dlerror())).c_str());
-
-      if (NULL == (kim_api_model_destroy = (int (*)(void *))
-                   dlsym(kim_api_library, "KIM_API_model_destroy")))
-        error->all(FLERR,(error_prefix + std::string(dlerror())).c_str());
-
-      if (NULL == (kim_api_free = (void (*)(void *, int *))
-                   dlsym(kim_api_library, "KIM_API_free")))
-        error->all(FLERR,(error_prefix + std::string(dlerror())).c_str());
-
-      if (NULL == (kim_api_string_init =
-                   (int (*)(void *, const char *, const char *))
-                   dlsym(kim_api_library, "KIM_API_string_init")))
-        error->all(FLERR,(error_prefix + std::string(dlerror())).c_str());
-
-      if (NULL == (kim_api_is_half_neighbors = (int (*)(void *, int *))
-                   dlsym(kim_api_library, "KIM_API_is_half_neighbors")))
-        error->all(FLERR,(error_prefix + std::string(dlerror())).c_str());
-
-      if (NULL == (kim_api_get_NBC_method = (int (*)(void *, const char **))
-                   dlsym(kim_api_library, "KIM_API_get_NBC_method")))
-        error->all(FLERR,(error_prefix + std::string(dlerror())).c_str());
-
-      if (NULL == (kim_api_get_index = (int (*)(void *, const char *, int *))
-                   dlsym(kim_api_library, "KIM_API_get_index")))
-        error->all(FLERR,(error_prefix + std::string(dlerror())).c_str());
-
-      if (NULL == (kim_api_getm_index = (int (*)(void *, int *, int, ...))
-                   dlsym(kim_api_library, "KIM_API_getm_index")))
-        error->all(FLERR,(error_prefix + std::string(dlerror())).c_str());
-
-      if (NULL == (kim_api_get_species_code =
-                   (int (*)(void *, const char *, int *))
-                   dlsym(kim_api_library, "KIM_API_get_species_code")))
-        error->all(FLERR,(error_prefix + std::string(dlerror())).c_str());
-
-      if (NULL == (kim_api_setm_data_by_index =
-                   (void (*)(void *, int *, int, ...))
-                   dlsym(kim_api_library, "KIM_API_setm_data_by_index")))
-        error->all(FLERR,(error_prefix + std::string(dlerror())).c_str());
-
-      if (NULL == (kim_api_set_method_by_index =
-                   (int (*)(void *, int, intptr_t, void (*)()))
-                   dlsym(kim_api_library, "KIM_API_set_method_by_index")))
-        error->all(FLERR,(error_prefix + std::string(dlerror())).c_str());
-
-      if (NULL == (kim_api_set_sim_buffer = (void (*)(void *, void *, int *))
-                   dlsym(kim_api_library, "KIM_API_set_sim_buffer")))
-        error->all(FLERR,(error_prefix + std::string(dlerror())).c_str());
-
-      if (NULL == (kim_api_set_data_by_index =
-                   (int (*)(void *, int, intptr_t, void *))
-                   dlsym(kim_api_library, "KIM_API_set_data_by_index")))
-        error->all(FLERR,(error_prefix + std::string(dlerror())).c_str());
-
-      if (NULL == (kim_api_set_compute_by_index =
-                   (void (*)(void *, int, int, int*))
-                   dlsym(kim_api_library, "KIM_API_set_compute_by_index")))
-        error->all(FLERR,(error_prefix + std::string(dlerror())).c_str());
-
-      if (NULL == (kim_api_get_num_params = (int (*)(void *, int *, int *))
-                   dlsym(kim_api_library, "KIM_API_get_num_params")))
-        error->all(FLERR,(error_prefix + std::string(dlerror())).c_str());
-
-      if (NULL == (kim_api_get_free_parameter =
-                   (int (*)(void *, const int, const char **))
-                   dlsym(kim_api_library, "KIM_API_get_free_parameter")))
-        error->all(FLERR,(error_prefix + std::string(dlerror())).c_str());
-
-      if (NULL == (kim_api_get_data = (void * (*)(void *, const char *, int *))
-                   dlsym(kim_api_library, "KIM_API_get_data")))
-        error->all(FLERR,(error_prefix + std::string(dlerror())).c_str());
-
-      if (NULL == (kim_api_get_rank =
-                   (intptr_t (*)(void *, const char *, int *))
-                   dlsym(kim_api_library, "KIM_API_get_rank")))
-        error->all(FLERR,(error_prefix + std::string(dlerror())).c_str());
-
-      if (NULL == (kim_api_get_shape =
-                   (intptr_t (*)(void *, const char *, int *, int *))
-                   dlsym(kim_api_library, "KIM_API_get_shape")))
-        error->all(FLERR,(error_prefix + std::string(dlerror())).c_str());
-
-      if (NULL == (kim_api_model_info = (int (*)(void *, const char *))
-                   dlsym(kim_api_library, "KIM_API_model_info")))
-        error->all(FLERR,(error_prefix + std::string(dlerror())).c_str());
-
-    return true;
-    }
-  }
-  else
-  {
-    return true;
-  }
-}
+void * (*PairKIM::kim_get_sim_buffer)(void *, int *);
 
 PairKIM::PairKIM(LAMMPS *lmp) :
    Pair(lmp),
@@ -244,6 +55,7 @@ PairKIM::PairKIM(LAMMPS *lmp) :
    lmps_unique_elements(0),
    lmps_num_unique_elements(0),
    lmps_units(METAL),
+   kim(new KIM_LAMMPS_PlugIn),
    pkim(0),
    kim_ind_coordinates(-1),
    kim_ind_numberOfParticles(-1),
@@ -286,7 +98,7 @@ PairKIM::PairKIM(LAMMPS *lmp) :
 
 PairKIM::~PairKIM()
 {
-  if (kim_api_library != NULL)
+  if (kim->library != NULL)
   {
     // clean up kim_modelname
     if (kim_modelname != 0) delete [] kim_modelname;
@@ -316,9 +128,11 @@ PairKIM::~PairKIM()
     // clean up KIM interface (if necessary)
     kim_free();
 
-    dlclose(kim_api_library);
+    dlclose(kim->library);
   }
 
+  delete kim;
+
   return;
 }
 
@@ -365,17 +179,17 @@ void PairKIM::compute(int eflag , int vflag)
    // pass current atom pointers to KIM
    set_volatiles();
 
-   kim_api_setm_compute_by_index(pkim, &kimerror,3*3,
-                               kim_ind_particleEnergy, eflag_atom,
-                                (int) kim_model_has_particleEnergy,
-                               kim_ind_particleVirial, vflag_atom,
-                                (int) kim_model_has_particleVirial,
-                               kim_ind_virial, vflag_global!=0,
-                                no_virial_fdotr_compute);
+   kim->setm_compute_by_index(pkim, &kimerror,3*3,
+                             kim_ind_particleEnergy, eflag_atom,
+                             (int) kim_model_has_particleEnergy,
+                             kim_ind_particleVirial, vflag_atom,
+                             (int) kim_model_has_particleVirial,
+                             kim_ind_virial, vflag_global!=0,
+                             no_virial_fdotr_compute);
    kim_error(__LINE__,"setm_compute_by_index",kimerror);
 
    // compute via KIM model
-   kimerror = kim_api_model_compute(pkim);
+   kimerror = kim->model_compute(pkim);
    kim_error(__LINE__,"PairKIM::pkim->model_compute() error",kimerror);
    // assemble force and particleVirial if needed
    if (!lmps_using_newton) comm->reverse_comm_pair(this);
@@ -452,7 +266,8 @@ void PairKIM::settings(int narg, char **arg)
    // This is called when "pair_style kim ..." is read from input
    // may be called multiple times
 
-   setup_kim_api_library();  // exits on failure
+   kim->setup_kim_api_library(error);  // exits on failure
+   kim_get_sim_buffer = kim->get_sim_buffer;
 
    ++settings_call_count;
    init_style_call_count = 0;
@@ -603,7 +418,7 @@ void PairKIM::init_style()
    if (!kim_init_ok)
    {
       kim_init();
-      kimerror = kim_api_model_init(pkim);
+      kimerror = kim->model_init(pkim);
       if (kimerror != KIM_STATUS_OK)
          kim_error(__LINE__, "KIM API:model_init() failed", kimerror);
       else
@@ -675,7 +490,7 @@ void PairKIM::reinit()
 
   // Then reinit KIM model
   int kimerror;
-  kimerror = kim_api_model_reinit(pkim);
+  kimerror = kim->model_reinit(pkim);
   kim_error(__LINE__,"model_reinit unsuccessful", kimerror);
 }
 
@@ -817,7 +632,7 @@ double PairKIM::memory_usage()
 void PairKIM::kim_error(int ln, const char* msg, int errcode)
 {
    if (errcode == KIM_STATUS_OK) return;
-   report_error(ln,(char *) __FILE__, (char *) msg,errcode);
+   kim->report_error(ln,(char *) __FILE__, (char *) msg,errcode);
    error->all(__FILE__,ln,"Internal KIM error");
 
    return;
@@ -831,7 +646,7 @@ int PairKIM::get_neigh(void **kimmdl,int *mode,int *request,
    void * pkim = *kimmdl;
 
    int kimerror;
-   PairKIM *self = (PairKIM *) kim_api_get_sim_buffer(pkim, &kimerror);
+   PairKIM *self = (PairKIM *) kim_get_sim_buffer(pkim, &kimerror);
 
    if (self->kim_model_using_Rij) {
       *pRij = &(self->Rij[0]);
@@ -882,8 +697,8 @@ int PairKIM::get_neigh(void **kimmdl,int *mode,int *request,
             // set Rij if needed
             if (self->kim_model_using_Rij) {
                double* x = (double *)
-                   kim_api_get_data_by_index(pkim, self->kim_ind_coordinates,
-                                             &kimerror);
+                   self->kim->get_data_by_index(pkim, self->kim_ind_coordinates,
+                                               &kimerror);
                for (jj=0; jj < *numnei; jj++) {
                   int i = *atom;
                   j = (*nei1atom)[jj];
@@ -930,8 +745,8 @@ int PairKIM::get_neigh(void **kimmdl,int *mode,int *request,
          // set Rij if needed
          if (self->kim_model_using_Rij){
             double* x = (double *)
-                kim_api_get_data_by_index(pkim, self->kim_ind_coordinates,
-                                          &kimerror);
+                self->kim->get_data_by_index(pkim, self->kim_ind_coordinates,
+                                            &kimerror);
             for(int jj=0; jj < *numnei; jj++){
                int i = *atom;
                int j = (*nei1atom)[jj];
@@ -962,12 +777,12 @@ void PairKIM::kim_free()
 
    if (kim_model_init_ok)
    {
-      kimerror = kim_api_model_destroy(pkim);
+      kimerror = kim->model_destroy(pkim);
       kim_model_init_ok = false;
    }
    if (kim_init_ok)
    {
-      kim_api_free(&pkim, &kimerror);
+      kim->free(&pkim, &kimerror);
       kim_init_ok = false;
    }
    if (pkim != 0)
@@ -1006,7 +821,7 @@ void PairKIM::kim_init()
    }
 
    // initialize KIM model
-   kimerror = kim_api_string_init(&pkim, test_descriptor_string, kim_modelname);
+   kimerror = kim->string_init(&pkim, test_descriptor_string, kim_modelname);
    if (kimerror != KIM_STATUS_OK)
       kim_error(__LINE__,"KIM initialization failed", kimerror);
    else
@@ -1019,10 +834,10 @@ void PairKIM::kim_init()
    // determine kim_model_using_* true/false values
    //
    // check for half or full list
-   kim_model_using_half = kim_api_is_half_neighbors(pkim, &kimerror);
+   kim_model_using_half = kim->is_half_neighbors(pkim, &kimerror);
    //
    const char* NBC_method;
-   kimerror = kim_api_get_NBC_method(pkim, &NBC_method);
+   kimerror = kim->get_NBC_method(pkim, &NBC_method);
    kim_error(__LINE__,"NBC method not set",kimerror);
    // check for CLUSTER mode
    kim_model_using_cluster = (strcmp(NBC_method,"CLUSTER")==0);
@@ -1031,18 +846,18 @@ void PairKIM::kim_init()
                           (strcmp(NBC_method,"NEIGH_RVEC_F")==0));
 
    // get correct index of each variable in kim_api object
-   kim_api_getm_index(pkim, &kimerror, 3*15,
+   kim->getm_index(pkim, &kimerror, 3*15,
     "coordinates", &kim_ind_coordinates, 1,
     "cutoff", &kim_ind_cutoff, 1,
     "numberOfParticles", &kim_ind_numberOfParticles, 1,
     "numberParticleTypes", &kim_ind_numberOfSpecies,
-                      ! kim_api_is_strictly_between_1_5_and_2_0,
+                      ! kim->is_strictly_between_1_5_and_2_0,
     "particleTypes", &kim_ind_particleSpecies,
-                      ! kim_api_is_strictly_between_1_5_and_2_0,
+                      ! kim->is_strictly_between_1_5_and_2_0,
     "numberOfSpecies", &kim_ind_numberOfSpecies,
-                      kim_api_is_strictly_between_1_5_and_2_0,
+                      kim->is_strictly_between_1_5_and_2_0,
     "particleSpecies", &kim_ind_particleSpecies,
-                      kim_api_is_strictly_between_1_5_and_2_0,
+                      kim->is_strictly_between_1_5_and_2_0,
     "numberContributingParticles", &kim_ind_numberContributingParticles,
                                    kim_model_using_half,
     "particleEnergy", &kim_ind_particleEnergy,
@@ -1062,7 +877,7 @@ void PairKIM::kim_init()
    for(int i = 0; i < lmps_num_unique_elements; i++){
       int kimerror;
       kim_particle_codes[i]
-         = kim_api_get_species_code(pkim, lmps_unique_elements[i], &kimerror);
+         = kim->get_species_code(pkim, lmps_unique_elements[i], &kimerror);
       kim_error(__LINE__, "create_kim_particle_codes: symbol not found ",
                 kimerror);
    }
@@ -1081,7 +896,7 @@ void PairKIM::set_statics()
    lmps_local_tot_num_atoms = (int) (atom->nghost + atom->nlocal);
 
    int kimerror;
-   kim_api_setm_data_by_index(pkim, &kimerror, 4*6,
+   kim->setm_data_by_index(pkim, &kimerror, 4*6,
     kim_ind_numberOfSpecies, 1, (void *) &(atom->ntypes), 1,
     kim_ind_cutoff, 1, (void *) &(kim_global_cutoff), 1,
     kim_ind_numberOfParticles, 1, (void *) &lmps_local_tot_num_atoms,  1,
@@ -1092,13 +907,12 @@ void PairKIM::set_statics()
    kim_error(__LINE__, "setm_data_by_index", kimerror);
    if (!kim_model_using_cluster)
    {
-      kimerror = kim_api_set_method_by_index(pkim, kim_ind_get_neigh, 1,
-                                             (void (*)()) &get_neigh);
+      kimerror = kim->set_method_by_index(pkim, kim_ind_get_neigh, 1,
+                                         (void (*)()) &get_neigh);
       kim_error(__LINE__, "set_method_by_index", kimerror);
    }
 
-
-   kim_api_set_sim_buffer(pkim, (void *)this, &kimerror);
+   kim->set_sim_buffer(pkim, (void *)this, &kimerror);
    kim_error(__LINE__, "set_sim_buffer", kimerror);
 
    return;
@@ -1112,33 +926,33 @@ void PairKIM::set_volatiles()
    lmps_local_tot_num_atoms = (int) (atom->nghost + atom->nlocal);
    intptr_t nall = (intptr_t) lmps_local_tot_num_atoms;
 
-   kim_api_setm_data_by_index(pkim, &kimerror, 4*2,
+   kim->setm_data_by_index(pkim, &kimerror, 4*2,
     kim_ind_coordinates, 3*nall, (void*) &(atom->x[0][0]), 1,
     kim_ind_particleSpecies, nall, (void*) kim_particleSpecies, 1);
    kim_error(__LINE__, "setm_data_by_index", kimerror);
 
    if (kim_model_has_particleEnergy && (eflag_atom == 1))
    {
-      kimerror = kim_api_set_data_by_index(pkim, kim_ind_particleEnergy, nall,
-                                           (void*) eatom);
+      kimerror = kim->set_data_by_index(pkim, kim_ind_particleEnergy, nall,
+                                       (void*) eatom);
       kim_error(__LINE__, "set_data_by_index", kimerror);
    }
 
    if (kim_model_has_particleVirial && (vflag_atom == 1))
    {
-      kimerror = kim_api_set_data_by_index(pkim, kim_ind_particleVirial, 6*nall,
-                                           (void*) &(vatom[0][0]));
+      kimerror = kim->set_data_by_index(pkim, kim_ind_particleVirial, 6*nall,
+                                       (void*) &(vatom[0][0]));
       kim_error(__LINE__, "set_data_by_index", kimerror);
    }
 
    if (kim_model_has_forces)
    {
       if (lmps_hybrid)
-         kimerror = kim_api_set_data_by_index(pkim, kim_ind_forces, nall*3,
-                                              (void*) &(lmps_force_tmp[0][0]));
+         kimerror = kim->set_data_by_index(pkim, kim_ind_forces, nall*3,
+                                          (void*) &(lmps_force_tmp[0][0]));
       else
-         kimerror = kim_api_set_data_by_index(pkim, kim_ind_forces, nall*3,
-                                              (void*) &(atom->f[0][0]));
+         kimerror = kim->set_data_by_index(pkim, kim_ind_forces, nall*3,
+                                          (void*) &(atom->f[0][0]));
       kim_error(__LINE__, "setm_data_by_index", kimerror);
    }
 
@@ -1151,17 +965,17 @@ void PairKIM::set_volatiles()
    if (kim_model_has_particleVirial)
    {
       if(vflag_atom != 1) {
-         kim_api_set_compute_by_index(pkim, kim_ind_particleVirial,
-                                      KIM_COMPUTE_FALSE, &kimerror);
+         kim->set_compute_by_index(pkim, kim_ind_particleVirial,
+                                  KIM_COMPUTE_FALSE, &kimerror);
       } else {
-         kim_api_set_compute_by_index(pkim, kim_ind_particleVirial,
-                                      KIM_COMPUTE_TRUE, &kimerror);
+         kim->set_compute_by_index(pkim, kim_ind_particleVirial,
+                                  KIM_COMPUTE_TRUE, &kimerror);
       }
    }
 
    if (no_virial_fdotr_compute == 1)
    {
-      kim_api_set_compute_by_index(pkim, kim_ind_virial,
+      kim->set_compute_by_index(pkim, kim_ind_virial,
        ((vflag_global != 1) ? KIM_COMPUTE_FALSE : KIM_COMPUTE_TRUE),
        &kimerror);
    }
@@ -1222,34 +1036,34 @@ void PairKIM::set_kim_model_has_flags()
    int kimerror;
 
    // get KIM API object representing the KIM Model only
-    kimerror = kim_api_model_info(&pkim, kim_modelname);
+   kimerror = kim->model_info(&pkim, kim_modelname);
    kim_error(__LINE__,"KIM initialization failed", kimerror);
 
    // determine if the KIM Model can compute the total energy
-   kim_api_get_index(pkim, (char*) "energy", &kimerror);
+   kim->get_index(pkim, (char*) "energy", &kimerror);
    kim_model_has_energy = (kimerror == KIM_STATUS_OK);
    if (!kim_model_has_energy)
      error->warning(FLERR,"KIM Model does not provide `energy'; "
                     "Potential energy will be zero");
 
    // determine if the KIM Model can compute the forces
-   kim_api_get_index(pkim, (char*) "forces", &kimerror);
+   kim->get_index(pkim, (char*) "forces", &kimerror);
    kim_model_has_forces = (kimerror == KIM_STATUS_OK);
    if (!kim_model_has_forces)
      error->warning(FLERR,"KIM Model does not provide `forces'; "
                     "Forces will be zero");
 
    // determine if the KIM Model can compute the particleEnergy
-   kim_api_get_index(pkim, (char*) "particleEnergy", &kimerror);
+   kim->get_index(pkim, (char*) "particleEnergy", &kimerror);
    kim_model_has_particleEnergy = (kimerror == KIM_STATUS_OK);
    if (!kim_model_has_particleEnergy)
      error->warning(FLERR,"KIM Model does not provide `particleEnergy'; "
                     "energy per atom will be zero");
 
    // determine if the KIM Model can compute the particleVerial
-   kim_api_get_index(pkim, (char*) "particleVirial", &kimerror);
+   kim->get_index(pkim, (char*) "particleVirial", &kimerror);
    kim_model_has_particleVirial = (kimerror == KIM_STATUS_OK);
-   kim_api_get_index(pkim, (char*) "process_dEdr", &kimerror);
+   kim->get_index(pkim, (char*) "process_dEdr", &kimerror);
    kim_model_has_particleVirial = kim_model_has_particleVirial ||
      (kimerror == KIM_STATUS_OK);
    if (!kim_model_has_particleVirial)
@@ -1257,7 +1071,7 @@ void PairKIM::set_kim_model_has_flags()
                     "virial per atom will be zero");
 
    // tear down KIM API object
-   kim_api_free(&pkim, &kimerror);
+   kim->free(&pkim, &kimerror);
    // now destructor will do the remaining tear down for mdl
 
    return;
@@ -1293,7 +1107,7 @@ void PairKIM::write_descriptor(char** test_descriptor_string)
       "#\n"
       "\n");
 
-   if (kim_api_is_strictly_between_1_5_and_2_0)
+   if (kim->is_strictly_between_1_5_and_2_0)
      strcat(*test_descriptor_string,
       "KIM_API_Version := 1.6.0\n\n");
 
@@ -1344,7 +1158,7 @@ void PairKIM::write_descriptor(char** test_descriptor_string)
    }
 
    // Write Supported species section
-   if (kim_api_is_strictly_between_1_5_and_2_0)
+   if (kim->is_strictly_between_1_5_and_2_0)
      strcat(*test_descriptor_string,
       "\n"
       "PARTICLE_SPECIES:\n");
@@ -1403,7 +1217,7 @@ void PairKIM::write_descriptor(char** test_descriptor_string)
       "# Name                         Type         Unit    Shape\n"
       "numberOfParticles              integer      none    []\n"
       "numberContributingParticles    integer      none    []\n");
-   if (kim_api_is_strictly_between_1_5_and_2_0)
+   if (kim->is_strictly_between_1_5_and_2_0)
      strcat(*test_descriptor_string,
       "numberOfSpecies                integer      none    []\n"
       "particleSpecies                integer      none    ");
@@ -1510,13 +1324,13 @@ void *PairKIM::extract(const char *str, int &dim)
 
   // check to make sure that the requested parameter is a valid free parameter
 
-  kimerror = kim_api_get_num_params(pkim, &numParams, &dummyint);
+  kimerror = kim->get_num_params(pkim, &numParams, &dummyint);
   kim_error(__LINE__, "get_num_free_params", kimerror);
   char **freeParamNames = new char*[numParams];
   for (int k = 0; k < numParams; k++)
   {
-    kimerror = kim_api_get_free_parameter(pkim, k,
-                                          (const char**) &freeParamNames[k]);
+    kimerror = kim->get_free_parameter(pkim, k,
+                                      (const char**) &freeParamNames[k]);
     kim_error(__LINE__, "get_free_parameter", kimerror);
     if (0 == strcmp(paramName, freeParamNames[k]))
     {
@@ -1534,7 +1348,7 @@ void *PairKIM::extract(const char *str, int &dim)
   }
 
   // get the parameter arry from pkim object
-  paramData = kim_api_get_data(pkim, paramName, &kimerror);
+  paramData = kim->get_data(pkim, paramName, &kimerror);
   if (kimerror == KIM_STATUS_FAIL)
   {
     delete [] speciesIndex, speciesIndex = 0;
@@ -1543,7 +1357,7 @@ void *PairKIM::extract(const char *str, int &dim)
   kim_error(__LINE__,"get_data",kimerror);
 
   // get rank and shape of parameter
-  rank = kim_api_get_rank(pkim, paramName, &kimerror);
+  rank = kim->get_rank(pkim, paramName, &kimerror);
   if (kimerror == KIM_STATUS_FAIL)
   {
     delete [] speciesIndex, speciesIndex = 0;
@@ -1552,7 +1366,7 @@ void *PairKIM::extract(const char *str, int &dim)
   kim_error(__LINE__,"get_rank",kimerror);
 
   int *shape = new int[maxLine];
-  dummyint = kim_api_get_shape(pkim, paramName, shape, &kimerror);
+  dummyint = kim->get_shape(pkim, paramName, shape, &kimerror);
   if (kimerror == KIM_STATUS_FAIL)
   {
     delete [] speciesIndex, speciesIndex = 0;
diff --git a/src/KIM/pair_kim.h b/src/KIM/pair_kim.h
index 027d37e7fc..3b12cbe8b0 100644
--- a/src/KIM/pair_kim.h
+++ b/src/KIM/pair_kim.h
@@ -31,12 +31,11 @@ PairStyle(kim,PairKIM)
 #ifndef LMP_PAIR_KIM_H
 #define LMP_PAIR_KIM_H
 
-// includes from KIM & LAMMPS
-//class KIM_API_model;
 #include "pair.h"
 
-
 namespace LAMMPS_NS {
+   // Forward declare KIM_LAMMPS_PlugIn
+   class KIM_LAMMPS_PlugIn;
 
    class PairKIM : public Pair {
    public:
@@ -87,6 +86,7 @@ namespace LAMMPS_NS {
       unit_sys lmps_units;
 
       // values set in set_kim_model_has_flags(), called by kim_init()
+      KIM_LAMMPS_PlugIn * kim;
       void * pkim;
       bool kim_model_has_energy;
       bool kim_model_has_forces;
@@ -145,40 +145,10 @@ namespace LAMMPS_NS {
       void set_kim_model_has_flags();
       void write_descriptor(char** test_descriptor_string);
       // static methods used as callbacks from KIM
+      static void * (*kim_get_sim_buffer)(void *, int *);
       static int get_neigh(void** kimmdl, int* mode, int* request,
                            int* atom, int* numnei, int** nei1atom,
                            double** pRij);
-
-     bool setup_kim_api_library();
-     static bool kim_api_is_strictly_between_1_5_and_2_0;
-     // KIM symbols
-     static void* kim_api_library;
-     static int (*report_error)(int line, const char *, const char *, int);
-     static void (*kim_api_setm_compute_by_index)(void *, int *, ...);
-     static int (*kim_api_model_compute)(void *);
-     static int (*kim_api_model_init)(void *);
-     static int (*kim_api_model_reinit)(void *);
-     static void * (*kim_api_get_sim_buffer)(void *, int *);
-     static void * (*kim_api_get_data_by_index)(void *, int, int *);
-     static int (*kim_api_model_destroy)(void *);
-     static void (*kim_api_free)(void *, int *);
-     static int (*kim_api_string_init)(void *, const char *, const char *);
-     static int (*kim_api_is_half_neighbors)(void *, int *);
-     static int (*kim_api_get_NBC_method)(void *, const char **);
-     static int (*kim_api_get_index)(void *, const char *, int *);
-     static int (*kim_api_getm_index)(void *, int *, int, ...);
-     static int (*kim_api_get_species_code)(void *, const char *, int *);
-     static void (*kim_api_setm_data_by_index)(void *, int *, int, ...);
-     static int (*kim_api_set_method_by_index)(void *, int, intptr_t, void (*)());
-     static void (*kim_api_set_sim_buffer)(void *, void *, int *);
-     static int (*kim_api_set_data_by_index)(void *, int, intptr_t, void *);
-     static void (*kim_api_set_compute_by_index)(void *, int, int, int*);
-     static int (*kim_api_get_num_params)(void *, int *, int *);
-     static int (*kim_api_get_free_parameter)(void *, const int, const char **);
-     static void * (*kim_api_get_data)(void *, const char *, int *);
-     static intptr_t (*kim_api_get_rank)(void *, const char *, int *);
-     static intptr_t (*kim_api_get_shape)(void *, const char *, int *, int *);
-     static int (*kim_api_model_info)(void *, const char *);
    };
 }
 
-- 
GitLab