forked from lijiext/lammps
git-svn-id: svn://svn.icms.temple.edu/lammps-ro/trunk@13501 f3b2605a-c512-4ea7-a41b-209d697bcdaa
This commit is contained in:
parent
a67cb06856
commit
65f55e7023
|
@ -1,9 +1,14 @@
|
||||||
|
-*- fill-column: 70; -*-
|
||||||
|
|
||||||
This package provides a pair_style kim command which is a wrapper on
|
This package provides a pair_style kim command which is a wrapper on
|
||||||
the Knowledge Base for Interatomic Models (KIM) repository of
|
the Knowledge Base for Interatomic Models (KIM) repository of
|
||||||
interatomic potentials, so that they can be used by LAMMPS scripts.
|
interatomic potentials, so that they can be used by LAMMPS scripts.
|
||||||
|
|
||||||
Information about the KIM project can be found at https://openkim.org.
|
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
|
Using this package requires the KIM library and its models
|
||||||
(interatomic potentials) to be downloaded and installed on your
|
(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
|
manual for general information on building LAMMPS with external
|
||||||
libraries. The settings in the Makefile.lammps file in lib/kim must
|
libraries. The settings in the Makefile.lammps file in lib/kim must
|
||||||
be correct for LAMMPS to build correctly with this package installed.
|
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
|
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:
|
library you can test it using an input file from the examples dir:
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
|
|
||||||
// includes from LAMMPS
|
// includes from LAMMPS
|
||||||
#include "pair_kim.h"
|
#include "pair_kim.h"
|
||||||
|
#include "pair_kim_version.h"
|
||||||
#include "atom.h"
|
#include "atom.h"
|
||||||
#include "comm.h"
|
#include "comm.h"
|
||||||
#include "force.h"
|
#include "force.h"
|
||||||
|
@ -46,7 +47,7 @@
|
||||||
// support v1.5.0
|
// support v1.5.0
|
||||||
#define KIM_API_VERSION_MAJOR 1
|
#define KIM_API_VERSION_MAJOR 1
|
||||||
#define KIM_API_VERSION_MINOR 5
|
#define KIM_API_VERSION_MINOR 5
|
||||||
#define KIM_API_VERSION_PATHC 0
|
#define KIM_API_VERSION_PATCH 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
using namespace LAMMPS_NS;
|
using namespace LAMMPS_NS;
|
||||||
|
@ -55,6 +56,8 @@ using namespace LAMMPS_NS;
|
||||||
|
|
||||||
PairKIM::PairKIM(LAMMPS *lmp) :
|
PairKIM::PairKIM(LAMMPS *lmp) :
|
||||||
Pair(lmp),
|
Pair(lmp),
|
||||||
|
settings_call_count(0),
|
||||||
|
init_style_call_count(0),
|
||||||
kim_modelname(0),
|
kim_modelname(0),
|
||||||
lmps_map_species_to_unique(0),
|
lmps_map_species_to_unique(0),
|
||||||
lmps_unique_elements(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
|
// This is called when "pair_style kim ..." is read from input
|
||||||
// may be called multiple times
|
// 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[0] is the virial handling option: "LAMMPSvirial" or "KIMvirial"
|
||||||
// arg[1] is the KIM Model name
|
// 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)
|
// ensure we are in a clean state for KIM (needed on repeated call)
|
||||||
// first time called will do nothing...
|
// first time called will do nothing...
|
||||||
|
@ -300,6 +306,16 @@ void PairKIM::settings(int narg, char **arg)
|
||||||
kim_modelname = new char[nmlen+1];
|
kim_modelname = new char[nmlen+1];
|
||||||
strcpy(kim_modelname, arg[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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -385,6 +401,7 @@ void PairKIM::coeff(int narg, char **arg)
|
||||||
void PairKIM::init_style()
|
void PairKIM::init_style()
|
||||||
{
|
{
|
||||||
// This is called for each "run ...", "minimize ...", etc. read from input
|
// This is called for each "run ...", "minimize ...", etc. read from input
|
||||||
|
++init_style_call_count;
|
||||||
|
|
||||||
if (domain->dimension != 3)
|
if (domain->dimension != 3)
|
||||||
error->all(FLERR,"PairKIM only works with 3D problems");
|
error->all(FLERR,"PairKIM only works with 3D problems");
|
||||||
|
@ -770,6 +787,8 @@ void PairKIM::kim_init()
|
||||||
{
|
{
|
||||||
int kimerror;
|
int kimerror;
|
||||||
|
|
||||||
|
//
|
||||||
|
|
||||||
// determine KIM Model capabilities (used in this function below)
|
// determine KIM Model capabilities (used in this function below)
|
||||||
set_kim_model_has_flags();
|
set_kim_model_has_flags();
|
||||||
|
|
||||||
|
@ -777,6 +796,11 @@ void PairKIM::kim_init()
|
||||||
char* test_descriptor_string = 0;
|
char* test_descriptor_string = 0;
|
||||||
// allocate memory for test_descriptor_string and write descriptor file
|
// allocate memory for test_descriptor_string and write descriptor file
|
||||||
write_descriptor(&test_descriptor_string);
|
write_descriptor(&test_descriptor_string);
|
||||||
|
// print descriptor
|
||||||
|
if (print_kim_file)
|
||||||
|
{
|
||||||
|
error->message(FLERR, test_descriptor_string);
|
||||||
|
}
|
||||||
|
|
||||||
// initialize KIM model
|
// initialize KIM model
|
||||||
pkim = new KIM_API_model();
|
pkim = new KIM_API_model();
|
||||||
|
@ -1051,10 +1075,33 @@ void PairKIM::write_descriptor(char** test_descriptor_string)
|
||||||
|
|
||||||
// Write Test name and units
|
// Write Test name and units
|
||||||
strcat(*test_descriptor_string,
|
strcat(*test_descriptor_string,
|
||||||
|
"#\n"
|
||||||
|
"# BEGINNING OF KIM DESCRIPTOR FILE\n"
|
||||||
|
"#\n"
|
||||||
"# This file is automatically generated from LAMMPS pair_style "
|
"# 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"
|
"\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
|
#else
|
||||||
"KIM_API_Version := 1.6.0\n\n"
|
"KIM_API_Version := 1.6.0\n\n"
|
||||||
#endif
|
#endif
|
||||||
|
@ -1111,7 +1158,7 @@ void PairKIM::write_descriptor(char** test_descriptor_string)
|
||||||
#else
|
#else
|
||||||
"PARTICLE_SPECIES:\n"
|
"PARTICLE_SPECIES:\n"
|
||||||
#endif
|
#endif
|
||||||
"# Symbol/name Type code\n\n");
|
"# Symbol/name Type code\n");
|
||||||
int code=1;
|
int code=1;
|
||||||
char* tmp_line = 0;
|
char* tmp_line = 0;
|
||||||
tmp_line = new char[100];
|
tmp_line = new char[100];
|
||||||
|
@ -1128,7 +1175,7 @@ void PairKIM::write_descriptor(char** test_descriptor_string)
|
||||||
strcat(*test_descriptor_string,
|
strcat(*test_descriptor_string,
|
||||||
"\n"
|
"\n"
|
||||||
"CONVENTIONS:\n"
|
"CONVENTIONS:\n"
|
||||||
"# Name Type\n\n"
|
"# Name Type\n"
|
||||||
"ZeroBasedLists flag\n");
|
"ZeroBasedLists flag\n");
|
||||||
// can use iterator or locator neighbor mode, unless in hybrid mode
|
// can use iterator or locator neighbor mode, unless in hybrid mode
|
||||||
if (lmps_hybrid)
|
if (lmps_hybrid)
|
||||||
|
@ -1158,43 +1205,53 @@ void PairKIM::write_descriptor(char** test_descriptor_string)
|
||||||
strcat(*test_descriptor_string,
|
strcat(*test_descriptor_string,
|
||||||
"\n"
|
"\n"
|
||||||
"MODEL_INPUT:\n"
|
"MODEL_INPUT:\n"
|
||||||
"# Name Type Unit Shape\n\n"
|
"# Name Type Unit Shape\n"
|
||||||
"numberOfParticles integer none []\n\n"
|
"numberOfParticles integer none []\n"
|
||||||
"numberContributingParticles integer none []\n\n"
|
"numberContributingParticles integer none []\n"
|
||||||
#if KIM_API_VERSION_MAJOR == 1 && KIM_API_VERSON_MINOR == 5
|
#if KIM_API_VERSION_MAJOR == 1 && KIM_API_VERSON_MINOR == 5
|
||||||
"numberParticleTypes integer none []\n\n"
|
"numberParticleTypes integer none []\n"
|
||||||
"particleTypes integer none "
|
"particleTypes integer none "
|
||||||
#else
|
#else
|
||||||
"numberOfSpecies integer none []\n\n"
|
"numberOfSpecies integer none []\n"
|
||||||
"particleSpecies integer none "
|
"particleSpecies integer none "
|
||||||
#endif
|
#endif
|
||||||
"[numberOfParticles]\n\n"
|
"[numberOfParticles]\n"
|
||||||
"coordinates double length "
|
"coordinates double length "
|
||||||
"[numberOfParticles,3]\n\n"
|
"[numberOfParticles,3]\n"
|
||||||
"neighObject pointer none []\n\n"
|
"neighObject pointer none []\n"
|
||||||
"get_neigh method none []\n\n");
|
"get_neigh method none []\n");
|
||||||
|
|
||||||
// Write output section
|
// Write output section
|
||||||
strcat(*test_descriptor_string,
|
strcat(*test_descriptor_string,
|
||||||
"\n"
|
"\n"
|
||||||
"MODEL_OUPUT:\n"
|
"MODEL_OUPUT:\n"
|
||||||
"# Name Type Unit Shape\n\n"
|
"# Name Type Unit Shape\n"
|
||||||
"compute method none []\n\n"
|
"compute method none []\n"
|
||||||
"destroy method none []\n\n"
|
"destroy method none []\n"
|
||||||
"cutoff double length []\n\n");
|
"cutoff double length []\n");
|
||||||
if (kim_model_has_energy) strcat(*test_descriptor_string,
|
if (!kim_model_has_energy) strcat(*test_descriptor_string,"# ");
|
||||||
"energy double energy []\n\n");
|
strcat(*test_descriptor_string,
|
||||||
if (kim_model_has_forces) strcat(*test_descriptor_string,
|
"energy double energy []\n");
|
||||||
|
if (!kim_model_has_forces) strcat(*test_descriptor_string, "# ");
|
||||||
|
strcat(*test_descriptor_string,
|
||||||
"forces double force "
|
"forces double force "
|
||||||
"[numberOfParticles,3]\n\n");
|
"[numberOfParticles,3]\n");
|
||||||
if (kim_model_has_particleEnergy) strcat(*test_descriptor_string,
|
if (!kim_model_has_particleEnergy) strcat(*test_descriptor_string, "# ");
|
||||||
|
strcat(*test_descriptor_string,
|
||||||
"particleEnergy double energy "
|
"particleEnergy double energy "
|
||||||
"[numberOfParticles]\n\n");
|
"[numberOfParticles]\n");
|
||||||
if (no_virial_fdotr_compute == 1) strcat(*test_descriptor_string,
|
if (no_virial_fdotr_compute != 1) strcat(*test_descriptor_string, "# ");
|
||||||
"virial double energy [6] \n\n");
|
strcat(*test_descriptor_string,
|
||||||
if (kim_model_has_particleVirial) 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 "
|
"particleVirial double energy "
|
||||||
"[numberOfParticles,6] \n\n");
|
"[numberOfParticles,6]\n"
|
||||||
|
"\n");
|
||||||
|
strcat(*test_descriptor_string,
|
||||||
|
"#\n"
|
||||||
|
"# END OF KIM DESCRIPTOR FILE\n"
|
||||||
|
"#\n");
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -57,9 +57,12 @@ namespace LAMMPS_NS {
|
||||||
// (nearly) all bool flags are not initialized in constructor, but set
|
// (nearly) all bool flags are not initialized in constructor, but set
|
||||||
// explicitly in the indicated function. All other data members are
|
// explicitly in the indicated function. All other data members are
|
||||||
// initialized in constructor
|
// initialized in constructor
|
||||||
|
int settings_call_count;
|
||||||
|
int init_style_call_count;
|
||||||
|
|
||||||
// values set in settings()
|
// values set in settings()
|
||||||
char* kim_modelname;
|
char* kim_modelname;
|
||||||
|
bool print_kim_file;
|
||||||
|
|
||||||
// values set in coeff()
|
// values set in coeff()
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue