Commit 63dcd999 authored by Ryan S. Elliott's avatar Ryan S. Elliott
Browse files

Switch to kim-api c-bindings for SimulatorModel

parent 41e8cf3d
Loading
Loading
Loading
Loading
+7 −5
Original line number Diff line number Diff line
@@ -56,7 +56,9 @@

#include <cstring>
#include "fix_store_kim.h"
#include "KIM_SimulatorModel.hpp"
extern "C" {
#include "KIM_SimulatorModel.h"
}
#include "error.h"

using namespace LAMMPS_NS;
@@ -78,8 +80,8 @@ FixStoreKIM::~FixStoreKIM()
  // free associated storage

  if (simulator_model) {
    KIM::SimulatorModel *sm = (KIM::SimulatorModel *)simulator_model;
    KIM::SimulatorModel::Destroy(&sm);
    KIM_SimulatorModel *sm = (KIM_SimulatorModel *)simulator_model;
    KIM_SimulatorModel_Destroy(&sm);
    simulator_model = NULL;
  }

@@ -116,8 +118,8 @@ void FixStoreKIM::setptr(const char *name, void *ptr)
{
  if (strcmp(name,"simulator_model") == 0) {
    if (simulator_model) {
      KIM::SimulatorModel *sm = (KIM::SimulatorModel *)simulator_model;
      KIM::SimulatorModel::Destroy(&sm);
      KIM_SimulatorModel *sm = (KIM_SimulatorModel *)simulator_model;
      KIM_SimulatorModel_Destroy(&sm);
    }
    simulator_model = ptr;
  } else if (strcmp(name,"model_name") == 0) {
+30 −30
Original line number Diff line number Diff line
@@ -75,9 +75,6 @@
extern "C" {
#include "KIM_SimulatorHeaders.h"
}
//@@@@@ Need to switch to c-bindings when they are available.
#include "KIM_SimulatorModel.hpp"
//@@@@@

using namespace LAMMPS_NS;

@@ -214,29 +211,30 @@ void KimInit::determine_model_type_and_units(char * model_name,
    }
  }

  KIM::SimulatorModel * kim_SM;
  kim_error = KIM::SimulatorModel::Create(model_name, &kim_SM);
  KIM_SimulatorModel * kim_SM;
  kim_error = KIM_SimulatorModel_Create(model_name, &kim_SM);
  if (kim_error)
    error->all(FLERR,"KIM model name not found");
  model_type = SM;

  int sim_fields;
  int sim_lines;
  std::string const * sim_field;
  std::string const * sim_value;
  kim_SM->GetNumberOfSimulatorFields(&sim_fields);
  kim_SM->CloseTemplateMap();
  char const * sim_field;
  char const * sim_value;
  KIM_SimulatorModel_GetNumberOfSimulatorFields(kim_SM, &sim_fields);
  KIM_SimulatorModel_CloseTemplateMap(kim_SM);
  for (int i=0; i < sim_fields; ++i) {
    kim_SM->GetSimulatorFieldMetadata(i,&sim_lines,&sim_field);
    KIM_SimulatorModel_GetSimulatorFieldMetadata(
        kim_SM,i,&sim_lines,&sim_field);

    if (*sim_field == "units") {
      kim_SM->GetSimulatorFieldLine(i,0,&sim_value);
      int len=(*sim_value).length()+1;
      *model_units = new char[len]; strcpy(*model_units,sim_value->c_str());
    if (0 == strcmp(sim_field,"units")) {
      KIM_SimulatorModel_GetSimulatorFieldLine(kim_SM,i,0,&sim_value);
      int len=strlen(sim_value)+1;
      *model_units = new char[len]; strcpy(*model_units,sim_value);
      break;
    }
  }
  KIM::SimulatorModel::Destroy(&kim_SM);
  KIM_SimulatorModel_Destroy(&kim_SM);

  if ((! unit_conversion_mode) && (strcmp(*model_units, user_units)!=0)) {
    std::string mesg("Incompatible units for KIM Simulator Model, "
@@ -271,16 +269,16 @@ void KimInit::do_init(char *model_name, char *user_units, char *model_units)
  kim_init_log_delimiter("begin");

  int kimerror;
  // @@@@@ switch to c-bindings when they are available
  KIM::SimulatorModel * simulatorModel;
  KIM_SimulatorModel * simulatorModel;
  if (model_type == SM)
  {
    kimerror = KIM::SimulatorModel::Create(model_name,&simulatorModel);
    kimerror = KIM_SimulatorModel_Create(model_name,&simulatorModel);

    const std::string *sim_name, *sim_version;
    simulatorModel->GetSimulatorNameAndVersion(&sim_name, &sim_version);
    char const *sim_name, *sim_version;
    KIM_SimulatorModel_GetSimulatorNameAndVersion(
        simulatorModel,&sim_name, &sim_version);

    if (*sim_name != "LAMMPS")
    if (0 != strcmp(sim_name,"LAMMPS"))
      error->all(FLERR,"Incompatible KIM Simulator Model");

    if (comm->me == 0) {
@@ -288,7 +286,7 @@ void KimInit::do_init(char *model_name, char *user_units, char *model_units)
      mesg += model_name;
      mesg += "\n";
      mesg += "# For Simulator             : ";
      mesg += *sim_name + " " + *sim_version + "\n";
      mesg += std::string(sim_name) + " " + sim_version + "\n";
      mesg += "# Running on                : LAMMPS ";
      mesg += universe->version;
      mesg += "\n";
@@ -302,7 +300,7 @@ void KimInit::do_init(char *model_name, char *user_units, char *model_units)

    // need to call this to have access to (some) simulator model init data.

    simulatorModel->CloseTemplateMap();
    KIM_SimulatorModel_CloseTemplateMap(simulatorModel);
  }

  // Define unit conversion factor variables and print to log
@@ -316,24 +314,26 @@ void KimInit::do_init(char *model_name, char *user_units, char *model_units)

  if (model_type == SM) {
    int sim_fields, sim_lines;
    const std::string *sim_field, *sim_value;
    simulatorModel->GetNumberOfSimulatorFields(&sim_fields);
    char const *sim_field, *sim_value;
    KIM_SimulatorModel_GetNumberOfSimulatorFields(simulatorModel, &sim_fields);

    // init model

    for (int i=0; i < sim_fields; ++i) {
      simulatorModel->GetSimulatorFieldMetadata(i,&sim_lines,&sim_field);
      if (*sim_field == "model-init") {
      KIM_SimulatorModel_GetSimulatorFieldMetadata(
          simulatorModel,i,&sim_lines,&sim_field);
      if (0 == strcmp(sim_field,"model-init")) {
        for (int j=0; j < sim_lines; ++j) {
          simulatorModel->GetSimulatorFieldLine(i,j,&sim_value);
          input->one(sim_value->c_str());
          KIM_SimulatorModel_GetSimulatorFieldLine(
              simulatorModel,i,j,&sim_value);
          input->one(sim_value);
        }
        break;
      }
    }

    // reset template map.
    simulatorModel->OpenAndInitializeTemplateMap();
    KIM_SimulatorModel_OpenAndInitializeTemplateMap(simulatorModel);
  }

  // End output to log file
+26 −23
Original line number Diff line number Diff line
@@ -73,9 +73,6 @@
extern "C" {
#include "KIM_SimulatorHeaders.h"
}
//@@@@@ Need to switch to c-bindings when they are available.
#include "KIM_SimulatorModel.hpp"
//@@@@@

#define SNUM(x)                                                \
  static_cast<std::ostringstream const &>(std::ostringstream() \
@@ -122,7 +119,7 @@ void KimInteractions::do_setup(int narg, char **arg)
    error->all(FLERR,"Illegal kim_interactions command");

  char *model_name = NULL;
  KIM::SimulatorModel *simulatorModel(NULL);
  KIM_SimulatorModel *simulatorModel(NULL);

  // check if we had a kim_init command by finding fix STORE/KIM
  // retrieve model name and pointer to simulator model class instance.
@@ -132,7 +129,7 @@ void KimInteractions::do_setup(int narg, char **arg)
  if (ifix >= 0) {
    FixStoreKIM *fix_store = (FixStoreKIM *) modify->fix[ifix];
    model_name = (char *)fix_store->getptr("model_name");
    simulatorModel = (KIM::SimulatorModel *)fix_store->getptr("simulator_model");
    simulatorModel = (KIM_SimulatorModel *)fix_store->getptr("simulator_model");
  } else error->all(FLERR,"Must use 'kim_init' before 'kim_interactions'");

  // Begin output to log file
@@ -151,9 +148,11 @@ void KimInteractions::do_setup(int narg, char **arg)
      delimiter = " ";
    }

    simulatorModel->AddTemplateMap("atom-type-sym-list",atom_type_sym_list);
    simulatorModel->AddTemplateMap("atom-type-num-list",atom_type_num_list);
    simulatorModel->CloseTemplateMap();
    KIM_SimulatorModel_AddTemplateMap(
        simulatorModel,"atom-type-sym-list",atom_type_sym_list.c_str());
    KIM_SimulatorModel_AddTemplateMap(
        simulatorModel,"atom-type-num-list",atom_type_num_list.c_str());
    KIM_SimulatorModel_CloseTemplateMap(simulatorModel);

    int len = strlen(atom_type_sym_list.c_str())+1;
    char *strbuf = new char[len];
@@ -163,16 +162,17 @@ void KimInteractions::do_setup(int narg, char **arg)

    int sim_num_species;
    bool species_is_supported;
    const std::string *sim_species;
    simulatorModel->GetNumberOfSupportedSpecies(&sim_num_species);
    char const *sim_species;
    KIM_SimulatorModel_GetNumberOfSupportedSpecies(
        simulatorModel,&sim_num_species);
    strcpy(strbuf,atom_type_sym_list.c_str());
    strword = strtok(strbuf," \t");
    while (strword) {
      species_is_supported = false;
      if (strcmp(strword,"NULL") == 0) continue;
      for (int i=0; i < sim_num_species; ++i) {
        simulatorModel->GetSupportedSpecies(i, &sim_species);
        if (strcmp(sim_species->c_str(),strword) == 0)
        KIM_SimulatorModel_GetSupportedSpecies(simulatorModel,i,&sim_species);
        if (strcmp(sim_species,strword) == 0)
          species_is_supported = true;
      }
      if (!species_is_supported) {
@@ -188,26 +188,29 @@ void KimInteractions::do_setup(int narg, char **arg)
    // check if units are unchanged

    int sim_fields, sim_lines;
    const std::string *sim_field, *sim_value;
    simulatorModel->GetNumberOfSimulatorFields(&sim_fields);
    const char *sim_field, *sim_value;
    KIM_SimulatorModel_GetNumberOfSimulatorFields(simulatorModel, &sim_fields);
    for (int i=0; i < sim_fields; ++i) {
      simulatorModel->GetSimulatorFieldMetadata(i,&sim_lines,&sim_field);
      KIM_SimulatorModel_GetSimulatorFieldMetadata(
          simulatorModel,i,&sim_lines,&sim_field);

      if (*sim_field == "units") {
        simulatorModel->GetSimulatorFieldLine(i,0,&sim_value);
        if (*sim_value != update->unit_style)
      if (0 == strcmp(sim_field,"units")) {
        KIM_SimulatorModel_GetSimulatorFieldLine(simulatorModel,i,0,&sim_value);
        if (0 != strcmp(sim_value,update->unit_style))
          error->all(FLERR,"Incompatible units for KIM Simulator Model");
      }
    }

    int sim_model_idx=-1;
    for (int i=0; i < sim_fields; ++i) {
      simulatorModel->GetSimulatorFieldMetadata(i,&sim_lines,&sim_field);
      if (*sim_field == "model-defn") {
      KIM_SimulatorModel_GetSimulatorFieldMetadata(
          simulatorModel,i,&sim_lines,&sim_field);
      if (0 == strcmp(sim_field,"model-defn")) {
        sim_model_idx = i;
        for (int j=0; j < sim_lines; ++j) {
          simulatorModel->GetSimulatorFieldLine(sim_model_idx,j,&sim_value);
          input->one(sim_value->c_str());
          KIM_SimulatorModel_GetSimulatorFieldLine(
              simulatorModel,sim_model_idx,j,&sim_value);
          input->one(sim_value);
        }
      }
    }
@@ -215,7 +218,7 @@ void KimInteractions::do_setup(int narg, char **arg)
    if (sim_model_idx < 0)
      error->all(FLERR,"KIM Simulator Model has no Model definition");

    simulatorModel->OpenAndInitializeTemplateMap();
    KIM_SimulatorModel_OpenAndInitializeTemplateMap(simulatorModel);

  } else {