185 lines
5.2 KiB
C++
185 lines
5.2 KiB
C++
/* ----------------------------------------------------------------------
|
|
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
|
|
https://www.lammps.org/, Sandia National Laboratories
|
|
LAMMPS development team: developers@lammps.org
|
|
|
|
Copyright (2003) Sandia Corporation. Under the terms of Contract
|
|
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
|
|
certain rights in this software. This software is distributed under
|
|
the GNU General Public License.
|
|
|
|
See the README file in the top-level LAMMPS directory.
|
|
------------------------------------------------------------------------- */
|
|
|
|
/* ----------------------------------------------------------------------
|
|
Contributing author: Aidan Thompson (SNL)
|
|
------------------------------------------------------------------------- */
|
|
|
|
#include "mliap_model.h"
|
|
|
|
#include "comm.h"
|
|
#include "error.h"
|
|
#include "memory.h"
|
|
#include "tokenizer.h"
|
|
|
|
#include <cstring>
|
|
|
|
using namespace LAMMPS_NS;
|
|
|
|
#define MAXLINE 1024
|
|
#define MAXWORD 3
|
|
|
|
/* ---------------------------------------------------------------------- */
|
|
|
|
MLIAPModel::MLIAPModel(LAMMPS *lmp, char *) : Pointers(lmp), coeffelem(nullptr)
|
|
{
|
|
nparams = 0;
|
|
nelements = 0;
|
|
ndescriptors = 0;
|
|
nonlinearflag = 0;
|
|
}
|
|
|
|
/* ---------------------------------------------------------------------- */
|
|
|
|
MLIAPModel::~MLIAPModel()
|
|
{
|
|
memory->destroy(coeffelem);
|
|
}
|
|
|
|
/* ----------------------------------------------------------------------
|
|
placeholder
|
|
------------------------------------------------------------------------- */
|
|
|
|
void MLIAPModel::init() {}
|
|
|
|
/* ----------------------------------------------------------------------
|
|
set number of elements
|
|
---------------------------------------------------------------------- */
|
|
|
|
void MLIAPModel::set_nelements(int nelements_in)
|
|
{
|
|
nelements = nelements_in;
|
|
}
|
|
|
|
/* ----------------------------------------------------------------------
|
|
set number of descriptors
|
|
---------------------------------------------------------------------- */
|
|
|
|
void MLIAPModel::set_ndescriptors(int ndescriptors_in)
|
|
{
|
|
ndescriptors = ndescriptors_in;
|
|
}
|
|
|
|
/* ---------------------------------------------------------------------- */
|
|
|
|
MLIAPModelSimple::MLIAPModelSimple(LAMMPS *lmp, char *coefffilename) :
|
|
MLIAPModel(lmp, coefffilename)
|
|
{
|
|
if (coefffilename) MLIAPModelSimple::read_coeffs(coefffilename);
|
|
}
|
|
|
|
/* ---------------------------------------------------------------------- */
|
|
|
|
void MLIAPModelSimple::read_coeffs(char *coefffilename)
|
|
{
|
|
|
|
// open coefficient file on proc 0
|
|
|
|
FILE *fpcoeff;
|
|
if (comm->me == 0) {
|
|
fpcoeff = utils::open_potential(coefffilename, lmp, nullptr);
|
|
if (fpcoeff == nullptr)
|
|
error->one(FLERR, "Cannot open MLIAPModel coeff file {}: {}", coefffilename,
|
|
utils::getsyserror());
|
|
}
|
|
|
|
char line[MAXLINE], *ptr;
|
|
int eof = 0;
|
|
|
|
int n;
|
|
int nwords = 0;
|
|
while (nwords == 0) {
|
|
if (comm->me == 0) {
|
|
ptr = fgets(line, MAXLINE, fpcoeff);
|
|
if (ptr == nullptr) {
|
|
eof = 1;
|
|
fclose(fpcoeff);
|
|
} else
|
|
n = strlen(line) + 1;
|
|
}
|
|
MPI_Bcast(&eof, 1, MPI_INT, 0, world);
|
|
if (eof) break;
|
|
MPI_Bcast(&n, 1, MPI_INT, 0, world);
|
|
MPI_Bcast(line, n, MPI_CHAR, 0, world);
|
|
|
|
// strip comment, skip line if blank
|
|
|
|
if ((ptr = strchr(line, '#'))) *ptr = '\0';
|
|
nwords = utils::count_words(line);
|
|
}
|
|
if (nwords != 2) error->all(FLERR, "Incorrect format in MLIAPModel coefficient file");
|
|
|
|
// words = ptrs to all words in line
|
|
// strip single and double quotes from words
|
|
|
|
try {
|
|
ValueTokenizer coeffs(line);
|
|
nelements = coeffs.next_int();
|
|
nparams = coeffs.next_int();
|
|
} catch (TokenizerException &e) {
|
|
error->all(FLERR,
|
|
"Incorrect format in MLIAPModel coefficient "
|
|
"file: {}",
|
|
e.what());
|
|
}
|
|
|
|
// set up coeff lists
|
|
|
|
memory->destroy(coeffelem);
|
|
memory->create(coeffelem, nelements, nparams, "mliap_snap_model:coeffelem");
|
|
|
|
// Loop over nelements blocks in the coefficient file
|
|
|
|
for (int ielem = 0; ielem < nelements; ielem++) {
|
|
for (int icoeff = 0; icoeff < nparams; icoeff++) {
|
|
if (comm->me == 0) {
|
|
ptr = fgets(line, MAXLINE, fpcoeff);
|
|
if (ptr == nullptr) {
|
|
eof = 1;
|
|
fclose(fpcoeff);
|
|
} else
|
|
n = strlen(line) + 1;
|
|
}
|
|
|
|
MPI_Bcast(&eof, 1, MPI_INT, 0, world);
|
|
if (eof) error->all(FLERR, "Incorrect format in MLIAPModel coefficient file");
|
|
MPI_Bcast(&n, 1, MPI_INT, 0, world);
|
|
MPI_Bcast(line, n, MPI_CHAR, 0, world);
|
|
|
|
try {
|
|
ValueTokenizer coeffs(utils::trim_comment(line));
|
|
if (coeffs.count() != 1) throw TokenizerException("Wrong number of items", "");
|
|
coeffelem[ielem][icoeff] = coeffs.next_double();
|
|
} catch (TokenizerException &e) {
|
|
error->all(FLERR,
|
|
"Incorrect format in MLIAPModel "
|
|
"coefficient file: {}",
|
|
e.what());
|
|
}
|
|
}
|
|
}
|
|
if (comm->me == 0) fclose(fpcoeff);
|
|
}
|
|
|
|
/* ----------------------------------------------------------------------
|
|
memory usage
|
|
------------------------------------------------------------------------- */
|
|
|
|
double MLIAPModelSimple::memory_usage()
|
|
{
|
|
double bytes = 0;
|
|
|
|
bytes += (double) nelements * nparams * sizeof(double); // coeffelem
|
|
return bytes;
|
|
}
|