git-svn-id: svn://svn.icms.temple.edu/lammps-ro/trunk@13501 f3b2605a-c512-4ea7-a41b-209d697bcdaa

This commit is contained in:
sjplimp 2015-07-02 00:39:19 +00:00
parent a67cb06856
commit 65f55e7023
3 changed files with 97 additions and 30 deletions

View File

@ -1,9 +1,14 @@
-*- fill-column: 70; -*-
This package provides a pair_style kim command which is a wrapper on
the Knowledge Base for Interatomic Models (KIM) repository of
interatomic potentials, so that they can be used by LAMMPS scripts.
Information about the KIM project can be found at https://openkim.org.
It's PIs are Ellad Tadmor and Ryan Elliott (U Minn).
The KIM project is lead by Ellad Tadmor and Ryan Elliott (U Minn) and
James Sethna (Cornell U). Ryan Elliott is the main developer for the
KIM API and he also maintains the code that implements the pair_style
kim command.
Using this package requires the KIM library and its models
(interatomic potentials) to be downloaded and installed on your
@ -15,6 +20,8 @@ soon be provided to help automate the process. Also see the LAMMPS
manual for general information on building LAMMPS with external
libraries. The settings in the Makefile.lammps file in lib/kim must
be correct for LAMMPS to build correctly with this package installed.
However, the default settings should be correct in most cases and the
Makefile.lammps file usually will not need to be changed.
Once you have successfully built LAMMPS with this package and the KIM
library you can test it using an input file from the examples dir:

View File

@ -27,6 +27,7 @@
// includes from LAMMPS
#include "pair_kim.h"
#include "pair_kim_version.h"
#include "atom.h"
#include "comm.h"
#include "force.h"
@ -46,7 +47,7 @@
// support v1.5.0
#define KIM_API_VERSION_MAJOR 1
#define KIM_API_VERSION_MINOR 5
#define KIM_API_VERSION_PATHC 0
#define KIM_API_VERSION_PATCH 0
#endif
using namespace LAMMPS_NS;
@ -55,6 +56,8 @@ using namespace LAMMPS_NS;
PairKIM::PairKIM(LAMMPS *lmp) :
Pair(lmp),
settings_call_count(0),
init_style_call_count(0),
kim_modelname(0),
lmps_map_species_to_unique(0),
lmps_unique_elements(0),
@ -258,10 +261,13 @@ void PairKIM::settings(int narg, char **arg)
{
// This is called when "pair_style kim ..." is read from input
// may be called multiple times
++settings_call_count;
init_style_call_count = 0;
if (narg != 2) error->all(FLERR,"Illegal pair_style command");
if (narg < 2) error->all(FLERR,"Illegal pair_style command");
// arg[0] is the virial handling option: "LAMMPSvirial" or "KIMvirial"
// arg[1] is the KIM Model name
// arg[2] is the print-kim-file flag: 0/1 do-not/do print (default 0)
// ensure we are in a clean state for KIM (needed on repeated call)
// first time called will do nothing...
@ -300,6 +306,16 @@ void PairKIM::settings(int narg, char **arg)
kim_modelname = new char[nmlen+1];
strcpy(kim_modelname, arg[1]);
// set print_kim_file
if ((2 == narg) || ('0' == *(arg[2])))
{
print_kim_file = false;
}
else
{
print_kim_file = true;
}
return;
}
@ -385,6 +401,7 @@ void PairKIM::coeff(int narg, char **arg)
void PairKIM::init_style()
{
// This is called for each "run ...", "minimize ...", etc. read from input
++init_style_call_count;
if (domain->dimension != 3)
error->all(FLERR,"PairKIM only works with 3D problems");
@ -770,6 +787,8 @@ void PairKIM::kim_init()
{
int kimerror;
//
// determine KIM Model capabilities (used in this function below)
set_kim_model_has_flags();
@ -777,6 +796,11 @@ void PairKIM::kim_init()
char* test_descriptor_string = 0;
// allocate memory for test_descriptor_string and write descriptor file
write_descriptor(&test_descriptor_string);
// print descriptor
if (print_kim_file)
{
error->message(FLERR, test_descriptor_string);
}
// initialize KIM model
pkim = new KIM_API_model();
@ -1051,10 +1075,33 @@ void PairKIM::write_descriptor(char** test_descriptor_string)
// Write Test name and units
strcat(*test_descriptor_string,
"#\n"
"# BEGINNING OF KIM DESCRIPTOR FILE\n"
"#\n"
"# This file is automatically generated from LAMMPS pair_style "
"PairKIM command\n"
"kim command\n");
char tmp_version[100];
sprintf(tmp_version,"# This is pair-kim-v%i.%i.%i",
PAIR_KIM_VERSION_MAJOR, PAIR_KIM_VERSION_MINOR,
PAIR_KIM_VERSION_PATCH);
strcat(*test_descriptor_string, tmp_version);
#ifdef PAIR_KIM_VERSION_PRERELEASE
sprintf(tmp_version,"-%s", PAIR_KIM_VERSION_PRERELEASE);
strcat(*test_descriptor_string, tmp_version);
#endif
#ifdef PAIR_KIM_VERSION_BUILD_METADATA
sprintf(tmp_version,"+%s", PAIR_KIM_VERSION_BUILD_METADATA);
#endif
strcat(*test_descriptor_string,
"\n"
#if KIM_API_VERSION_MAJOR == 1 && KIM_API_VERSON_MINOR == 5
"# The call number is (pair_style).(init_style): ");
char tmp_num[100];
sprintf(tmp_num, "%i.%i\n", settings_call_count, init_style_call_count);
strcat(*test_descriptor_string, tmp_num);
strcat(*test_descriptor_string,
"#\n"
"\n"
#if KIM_API_VERSION_MAJOR == 1 && KIM_API_VERSION_MINOR == 5
#else
"KIM_API_Version := 1.6.0\n\n"
#endif
@ -1111,7 +1158,7 @@ void PairKIM::write_descriptor(char** test_descriptor_string)
#else
"PARTICLE_SPECIES:\n"
#endif
"# Symbol/name Type code\n\n");
"# Symbol/name Type code\n");
int code=1;
char* tmp_line = 0;
tmp_line = new char[100];
@ -1128,7 +1175,7 @@ void PairKIM::write_descriptor(char** test_descriptor_string)
strcat(*test_descriptor_string,
"\n"
"CONVENTIONS:\n"
"# Name Type\n\n"
"# Name Type\n"
"ZeroBasedLists flag\n");
// can use iterator or locator neighbor mode, unless in hybrid mode
if (lmps_hybrid)
@ -1158,43 +1205,53 @@ void PairKIM::write_descriptor(char** test_descriptor_string)
strcat(*test_descriptor_string,
"\n"
"MODEL_INPUT:\n"
"# Name Type Unit Shape\n\n"
"numberOfParticles integer none []\n\n"
"numberContributingParticles integer none []\n\n"
"# Name Type Unit Shape\n"
"numberOfParticles integer none []\n"
"numberContributingParticles integer none []\n"
#if KIM_API_VERSION_MAJOR == 1 && KIM_API_VERSON_MINOR == 5
"numberParticleTypes integer none []\n\n"
"numberParticleTypes integer none []\n"
"particleTypes integer none "
#else
"numberOfSpecies integer none []\n\n"
"numberOfSpecies integer none []\n"
"particleSpecies integer none "
#endif
"[numberOfParticles]\n\n"
"[numberOfParticles]\n"
"coordinates double length "
"[numberOfParticles,3]\n\n"
"neighObject pointer none []\n\n"
"get_neigh method none []\n\n");
"[numberOfParticles,3]\n"
"neighObject pointer none []\n"
"get_neigh method none []\n");
// Write output section
strcat(*test_descriptor_string,
"\n"
"MODEL_OUPUT:\n"
"# Name Type Unit Shape\n\n"
"compute method none []\n\n"
"destroy method none []\n\n"
"cutoff double length []\n\n");
if (kim_model_has_energy) strcat(*test_descriptor_string,
"energy double energy []\n\n");
if (kim_model_has_forces) strcat(*test_descriptor_string,
"# Name Type Unit Shape\n"
"compute method none []\n"
"destroy method none []\n"
"cutoff double length []\n");
if (!kim_model_has_energy) strcat(*test_descriptor_string,"# ");
strcat(*test_descriptor_string,
"energy double energy []\n");
if (!kim_model_has_forces) strcat(*test_descriptor_string, "# ");
strcat(*test_descriptor_string,
"forces double force "
"[numberOfParticles,3]\n\n");
if (kim_model_has_particleEnergy) strcat(*test_descriptor_string,
"[numberOfParticles,3]\n");
if (!kim_model_has_particleEnergy) strcat(*test_descriptor_string, "# ");
strcat(*test_descriptor_string,
"particleEnergy double energy "
"[numberOfParticles]\n\n");
if (no_virial_fdotr_compute == 1) strcat(*test_descriptor_string,
"virial double energy [6] \n\n");
if (kim_model_has_particleVirial) strcat(*test_descriptor_string,
"[numberOfParticles]\n");
if (no_virial_fdotr_compute != 1) strcat(*test_descriptor_string, "# ");
strcat(*test_descriptor_string,
"virial double energy [6]\n");
if (!kim_model_has_particleVirial) strcat(*test_descriptor_string, "# ");
strcat(*test_descriptor_string,
"particleVirial double energy "
"[numberOfParticles,6] \n\n");
"[numberOfParticles,6]\n"
"\n");
strcat(*test_descriptor_string,
"#\n"
"# END OF KIM DESCRIPTOR FILE\n"
"#\n");
return;
}

View File

@ -57,9 +57,12 @@ namespace LAMMPS_NS {
// (nearly) all bool flags are not initialized in constructor, but set
// explicitly in the indicated function. All other data members are
// initialized in constructor
int settings_call_count;
int init_style_call_count;
// values set in settings()
char* kim_modelname;
bool print_kim_file;
// values set in coeff()