Update pair eam

This commit is contained in:
Richard Berger 2020-05-28 11:35:24 -04:00
parent e7909f4598
commit 49a40f5006
No known key found for this signature in database
GPG Key ID: A9E83994E0BA0CAB
3 changed files with 85 additions and 44 deletions

View File

@ -29,6 +29,8 @@
#include "error.h"
#include "update.h"
#include "utils.h"
#include "tokenizer.h"
#include "potential_file_reader.h"
using namespace LAMMPS_NS;
@ -462,54 +464,58 @@ void PairEAM::read_file(char *filename)
{
Funcfl *file = &funcfl[nfuncfl-1];
int me = comm->me;
FILE *fptr;
char line[MAXLINE];
if(comm->me == 0) {
PotentialFileReader reader(lmp, filename, "EAM");
if (me == 0) {
fptr = force->open_potential(filename);
if (fptr == NULL) {
char str[128];
snprintf(str,128,"Cannot open EAM potential file %s",filename);
error->one(FLERR,str);
try {
char * line = nullptr;
reader.skip_line();
line = reader.next_line(2);
ValueTokenizer values(line);
values.next_int(); // ignore
file->mass = values.next_double();
line = reader.next_line(5);
values = ValueTokenizer(line);
file->nrho = values.next_int();
file->drho = values.next_double();
file->nr = values.next_int();
file->dr = values.next_double();
file->cut = values.next_double();
if ((file->nrho <= 0) || (file->nr <= 0) || (file->dr <= 0.0))
error->one(FLERR,"Invalid EAM potential file");
memory->create(file->frho, (file->nrho+1), "pair:frho");
memory->create(file->rhor, (file->nr+1), "pair:rhor");
memory->create(file->zr, (file->nr+1), "pair:zr");
reader.next_dvector(file->nrho, &file->frho[1]);
reader.next_dvector(file->nr, &file->zr[1]);
reader.next_dvector(file->nr, &file->rhor[1]);
} catch (TokenizerException & e) {
error->one(FLERR, e.what());
}
}
int tmp,nwords;
if (me == 0) {
utils::sfgets(FLERR,line,MAXLINE,fptr,filename,error);
utils::sfgets(FLERR,line,MAXLINE,fptr,filename,error);
sscanf(line,"%d %lg",&tmp,&file->mass);
utils::sfgets(FLERR,line,MAXLINE,fptr,filename,error);
nwords = sscanf(line,"%d %lg %d %lg %lg",
&file->nrho,&file->drho,&file->nr,&file->dr,&file->cut);
MPI_Bcast(&file->mass, 1, MPI_DOUBLE, 0, world);
MPI_Bcast(&file->nrho, 1, MPI_INT, 0, world);
MPI_Bcast(&file->drho, 1, MPI_DOUBLE, 0, world);
MPI_Bcast(&file->nr, 1, MPI_INT, 0, world);
MPI_Bcast(&file->dr, 1, MPI_DOUBLE, 0, world);
MPI_Bcast(&file->cut, 1, MPI_DOUBLE, 0, world);
if(comm->me != 0) {
memory->create(file->frho, (file->nrho+1), "pair:frho");
memory->create(file->rhor, (file->nr+1), "pair:rhor");
memory->create(file->zr, (file->nr+1), "pair:zr");
}
MPI_Bcast(&nwords,1,MPI_INT,0,world);
MPI_Bcast(&file->mass,1,MPI_DOUBLE,0,world);
MPI_Bcast(&file->nrho,1,MPI_INT,0,world);
MPI_Bcast(&file->drho,1,MPI_DOUBLE,0,world);
MPI_Bcast(&file->nr,1,MPI_INT,0,world);
MPI_Bcast(&file->dr,1,MPI_DOUBLE,0,world);
MPI_Bcast(&file->cut,1,MPI_DOUBLE,0,world);
if ((nwords != 5) || (file->nrho <= 0) || (file->nr <= 0) || (file->dr <= 0.0))
error->all(FLERR,"Invalid EAM potential file");
memory->create(file->frho,(file->nrho+1),"pair:frho");
memory->create(file->rhor,(file->nr+1),"pair:rhor");
memory->create(file->zr,(file->nr+1),"pair:zr");
if (me == 0) grab(fptr,file->nrho,&file->frho[1]);
MPI_Bcast(&file->frho[1],file->nrho,MPI_DOUBLE,0,world);
if (me == 0) grab(fptr,file->nr,&file->zr[1]);
MPI_Bcast(&file->zr[1],file->nr,MPI_DOUBLE,0,world);
if (me == 0) grab(fptr,file->nr,&file->rhor[1]);
MPI_Bcast(&file->rhor[1],file->nr,MPI_DOUBLE,0,world);
if (me == 0) fclose(fptr);
MPI_Bcast(&file->frho[1], file->nrho, MPI_DOUBLE, 0, world);
MPI_Bcast(&file->zr[1], file->nr, MPI_DOUBLE, 0, world);
MPI_Bcast(&file->rhor[1], file->nr, MPI_DOUBLE, 0, world);
}
/* ----------------------------------------------------------------------

View File

@ -21,6 +21,7 @@
#include "comm.h"
#include "potential_file_reader.h"
#include "utils.h"
#include "tokenizer.h"
#include <cstring>
@ -28,7 +29,7 @@ using namespace LAMMPS_NS;
PotentialFileReader::PotentialFileReader(LAMMPS *lmp,
const std::string &filename,
const std::string &potential_name) : Pointers(lmp) {
const std::string &potential_name) : Pointers(lmp), filename(filename) {
if (comm->me != 0) {
error->one(FLERR, "PotentialFileReader should only be called by proc 0!");
}
@ -46,6 +47,16 @@ PotentialFileReader::~PotentialFileReader() {
fclose(fp);
}
void PotentialFileReader::skip_line() {
char *ptr = fgets(line, MAXLINE, fp);
if (ptr == nullptr) {
// EOF
char str[128];
snprintf(str, 128, "Missing line in %s potential file!", potential_name.c_str());
error->one(FLERR, str);
}
}
char *PotentialFileReader::next_line(int nparams) {
// concatenate lines until have nparams words
int n = 0;
@ -95,3 +106,24 @@ char *PotentialFileReader::next_line(int nparams) {
return line;
}
void PotentialFileReader::next_dvector(int n, double * list) {
int i = 0;
while (i < n) {
char *ptr = fgets(line, MAXLINE, fp);
if (ptr == nullptr) {
// EOF
if (i < n) {
char str[128];
snprintf(str, 128, "Incorrect format in %s potential file! %d/%d values", potential_name.c_str(), i, n);
error->one(FLERR, str);
}
}
ValueTokenizer values(line);
while(values.has_next()) {
list[i++] = values.next_double();
}
}
}

View File

@ -26,6 +26,7 @@ namespace LAMMPS_NS
{
class PotentialFileReader : protected Pointers {
std::string potential_name;
std::string filename;
static const int MAXLINE = 1024;
char line[MAXLINE];
FILE *fp;
@ -34,7 +35,9 @@ namespace LAMMPS_NS
PotentialFileReader(class LAMMPS *lmp, const std::string &filename, const std::string &potential_name);
~PotentialFileReader();
char *next_line(int nparams);
void skip_line();
char * next_line(int nparams);
void next_dvector(int n, double * list);
};
} // namespace LAMMPS_NS