git-svn-id: svn://svn.icms.temple.edu/lammps-ro/trunk@15304 f3b2605a-c512-4ea7-a41b-209d697bcdaa
This commit is contained in:
215
src/molecule.cpp
215
src/molecule.cpp
@ -103,9 +103,6 @@ Molecule::Molecule(LAMMPS *lmp, int narg, char **arg, int &index) :
|
|||||||
sizescale = force->numeric(FLERR,arg[iarg+1]);
|
sizescale = force->numeric(FLERR,arg[iarg+1]);
|
||||||
if (sizescale <= 0.0) error->all(FLERR,"Illegal molecule command");
|
if (sizescale <= 0.0) error->all(FLERR,"Illegal molecule command");
|
||||||
iarg += 2;
|
iarg += 2;
|
||||||
|
|
||||||
// NOTE: add other geometric ops for points/lines/tris
|
|
||||||
|
|
||||||
} else break;
|
} else break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -120,14 +117,11 @@ Molecule::Molecule(LAMMPS *lmp, int narg, char **arg, int &index) :
|
|||||||
|
|
||||||
initialize();
|
initialize();
|
||||||
|
|
||||||
// scan file for sizes of all fields
|
// scan file for sizes of all fields and allocate them
|
||||||
|
|
||||||
if (me == 0) open(arg[ifile]);
|
if (me == 0) open(arg[ifile]);
|
||||||
read(0);
|
read(0);
|
||||||
if (me == 0) fclose(fp);
|
if (me == 0) fclose(fp);
|
||||||
|
|
||||||
// allocate memory for all fields defined in file
|
|
||||||
|
|
||||||
allocate();
|
allocate();
|
||||||
|
|
||||||
// read file again to populate all fields
|
// read file again to populate all fields
|
||||||
@ -139,34 +133,22 @@ Molecule::Molecule(LAMMPS *lmp, int narg, char **arg, int &index) :
|
|||||||
// stats
|
// stats
|
||||||
|
|
||||||
if (me == 0) {
|
if (me == 0) {
|
||||||
if (screen) {
|
if (screen)
|
||||||
fprintf(screen,"Read molecule %s:\n",id);
|
fprintf(screen,"Read molecule %s:\n"
|
||||||
if (natoms)
|
" %d atoms with %d types\n %d bonds with %d types\n"
|
||||||
fprintf(screen," %d atoms with %d types\n %d bonds with %d types\n"
|
|
||||||
" %d angles with %d types\n %d dihedrals with %d types\n"
|
" %d angles with %d types\n %d dihedrals with %d types\n"
|
||||||
" %d impropers with %d types\n",
|
" %d impropers with %d types\n",
|
||||||
natoms,ntypes,
|
id,natoms,ntypes,
|
||||||
nbonds,nbondtypes,nangles,nangletypes,
|
nbonds,nbondtypes,nangles,nangletypes,
|
||||||
ndihedrals,ndihedraltypes,nimpropers,nimpropertypes);
|
ndihedrals,ndihedraltypes,nimpropers,nimpropertypes);
|
||||||
if (npoints && nlines)
|
if (logfile)
|
||||||
fprintf(screen," %d lines with %d points\n",nlines,npoints);
|
fprintf(logfile,"Read molecule %s:\n"
|
||||||
if (npoints && ntris)
|
" %d atoms with %d types\n %d bonds with %d types\n"
|
||||||
fprintf(screen," %d triangles with %d points\n",ntris,npoints);
|
|
||||||
}
|
|
||||||
if (logfile) {
|
|
||||||
fprintf(logfile,"Read molecule %s:\n",id);
|
|
||||||
if (natoms)
|
|
||||||
fprintf(logfile," %d atoms with %d types\n %d bonds with %d types\n"
|
|
||||||
" %d angles with %d types\n %d dihedrals with %d types\n"
|
" %d angles with %d types\n %d dihedrals with %d types\n"
|
||||||
" %d impropers with %d types\n",
|
" %d impropers with %d types\n",
|
||||||
natoms,ntypes,
|
id,natoms,ntypes,
|
||||||
nbonds,nbondtypes,nangles,nangletypes,
|
nbonds,nbondtypes,nangles,nangletypes,
|
||||||
ndihedrals,ndihedraltypes,nimpropers,nimpropertypes);
|
ndihedrals,ndihedraltypes,nimpropers,nimpropertypes);
|
||||||
if (npoints && nlines)
|
|
||||||
fprintf(logfile," %d lines with %d points\n",nlines,npoints);
|
|
||||||
if (npoints && ntris)
|
|
||||||
fprintf(logfile," %d triangles with %d points\n",ntris,npoints);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -435,14 +417,8 @@ void Molecule::read(int flag)
|
|||||||
if (strspn(line," \t\n\r") == strlen(line)) continue;
|
if (strspn(line," \t\n\r") == strlen(line)) continue;
|
||||||
|
|
||||||
// search line for header keywords and set corresponding variable
|
// search line for header keywords and set corresponding variable
|
||||||
// check for triangles before angles so "triangles" not matched as "angles"
|
|
||||||
|
|
||||||
if (strstr(line,"atoms")) sscanf(line,"%d",&natoms);
|
if (strstr(line,"atoms")) sscanf(line,"%d",&natoms);
|
||||||
|
|
||||||
else if (strstr(line,"points")) sscanf(line,"%d",&npoints);
|
|
||||||
else if (strstr(line,"lines")) sscanf(line,"%d",&nlines);
|
|
||||||
else if (strstr(line,"triangles")) sscanf(line,"%d",&ntris);
|
|
||||||
|
|
||||||
else if (strstr(line,"bonds")) sscanf(line,"%d",&nbonds);
|
else if (strstr(line,"bonds")) sscanf(line,"%d",&nbonds);
|
||||||
else if (strstr(line,"angles")) sscanf(line,"%d",&nangles);
|
else if (strstr(line,"angles")) sscanf(line,"%d",&nangles);
|
||||||
else if (strstr(line,"dihedrals")) sscanf(line,"%d",&ndihedrals);
|
else if (strstr(line,"dihedrals")) sscanf(line,"%d",&ndihedrals);
|
||||||
@ -487,11 +463,8 @@ void Molecule::read(int flag)
|
|||||||
|
|
||||||
// error checks
|
// error checks
|
||||||
|
|
||||||
if (natoms < 0) error->all(FLERR,"Invalid atom count in molecule file");
|
if (natoms < 1)
|
||||||
if (npoints < 0) error->all(FLERR,"Invalid point count in molecule file");
|
error->all(FLERR,"No count or invalid atom count in molecule file");
|
||||||
if (nlines < 0) error->all(FLERR,"Invalid line count in molecule file");
|
|
||||||
if (ntris < 0) error->all(FLERR,"Invalid triangle count in molecule file");
|
|
||||||
|
|
||||||
if (nbonds < 0) error->all(FLERR,"Invalid bond count in molecule file");
|
if (nbonds < 0) error->all(FLERR,"Invalid bond count in molecule file");
|
||||||
if (nangles < 0) error->all(FLERR,"Invalid angle count in molecule file");
|
if (nangles < 0) error->all(FLERR,"Invalid angle count in molecule file");
|
||||||
if (ndihedrals < 0)
|
if (ndihedrals < 0)
|
||||||
@ -499,21 +472,6 @@ void Molecule::read(int flag)
|
|||||||
if (nimpropers < 0)
|
if (nimpropers < 0)
|
||||||
error->all(FLERR,"Invalid improper count in molecule file");
|
error->all(FLERR,"Invalid improper count in molecule file");
|
||||||
|
|
||||||
if (natoms == 0 && npoints == 0)
|
|
||||||
error->all(FLERR,"Molecule file must define either atoms or points");
|
|
||||||
if (natoms && npoints)
|
|
||||||
error->all(FLERR,"Molecule file cannot define both atoms and points");
|
|
||||||
|
|
||||||
if (npoints && domain->dimension == 2 && nlines == 0)
|
|
||||||
error->all(FLERR,"Molecule file must define lines with points");
|
|
||||||
if (npoints && domain->dimension == 2 && ntris)
|
|
||||||
error->all(FLERR,"Molecule file cannot define triangles for 2d model");
|
|
||||||
|
|
||||||
if (npoints && domain->dimension == 3 && ntris == 0)
|
|
||||||
error->all(FLERR,"Molecule file must define triangles with points");
|
|
||||||
if (npoints && domain->dimension == 3 && nlines)
|
|
||||||
error->all(FLERR,"Molecule file cannot define lines for 3d model");
|
|
||||||
|
|
||||||
// count = vector for tallying bonds,angles,etc per atom
|
// count = vector for tallying bonds,angles,etc per atom
|
||||||
|
|
||||||
if (flag == 0) memory->create(count,natoms,"molecule:count");
|
if (flag == 0) memory->create(count,natoms,"molecule:count");
|
||||||
@ -548,19 +506,6 @@ void Molecule::read(int flag)
|
|||||||
if (flag) masses(line);
|
if (flag) masses(line);
|
||||||
else skip_lines(natoms,line);
|
else skip_lines(natoms,line);
|
||||||
|
|
||||||
} else if (strcmp(keyword,"Points") == 0) {
|
|
||||||
pointflag = 1;
|
|
||||||
if (flag) pts(line);
|
|
||||||
else skip_lines(npoints,line);
|
|
||||||
} else if (strcmp(keyword,"Lines") == 0) {
|
|
||||||
lineflag = 1;
|
|
||||||
if (flag) line_segments(line);
|
|
||||||
else skip_lines(nlines,line);
|
|
||||||
} else if (strcmp(keyword,"Triangles") == 0) {
|
|
||||||
triflag = 1;
|
|
||||||
if (flag) triangles(line);
|
|
||||||
else skip_lines(ntris,line);
|
|
||||||
|
|
||||||
} else if (strcmp(keyword,"Bonds") == 0) {
|
} else if (strcmp(keyword,"Bonds") == 0) {
|
||||||
if (nbonds == 0)
|
if (nbonds == 0)
|
||||||
error->all(FLERR,"Molecule file has bonds but no nbonds setting");
|
error->all(FLERR,"Molecule file has bonds but no nbonds setting");
|
||||||
@ -634,15 +579,6 @@ void Molecule::read(int flag)
|
|||||||
// error check
|
// error check
|
||||||
|
|
||||||
if (flag == 0) {
|
if (flag == 0) {
|
||||||
if (natoms && !xflag)
|
|
||||||
error->all(FLERR,"Molecule file has no Coords section");
|
|
||||||
if (npoints && !pointflag)
|
|
||||||
error->all(FLERR,"Molecule file has no Points section");
|
|
||||||
if (nlines && !lineflag)
|
|
||||||
error->all(FLERR,"Molecule file has no Lines section");
|
|
||||||
if (ntris && !triflag)
|
|
||||||
error->all(FLERR,"Molecule file has no Triangles section");
|
|
||||||
|
|
||||||
if ((nspecialflag && !specialflag) || (!nspecialflag && specialflag))
|
if ((nspecialflag && !specialflag) || (!nspecialflag && specialflag))
|
||||||
error->all(FLERR,"Molecule file needs both Special Bond sections");
|
error->all(FLERR,"Molecule file needs both Special Bond sections");
|
||||||
if (specialflag && !bondflag)
|
if (specialflag && !bondflag)
|
||||||
@ -803,100 +739,6 @@ void Molecule::masses(char *line)
|
|||||||
if (rmass[i] <= 0.0) error->all(FLERR,"Invalid atom mass in molecule file");
|
if (rmass[i] <= 0.0) error->all(FLERR,"Invalid atom mass in molecule file");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ----------------------------------------------------------------------
|
|
||||||
read line/tri points from file
|
|
||||||
------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
void Molecule::pts(char *line)
|
|
||||||
{
|
|
||||||
int tmp;
|
|
||||||
for (int i = 0; i < npoints; i++) {
|
|
||||||
readline(line);
|
|
||||||
if (i == 0) {
|
|
||||||
int nwords = atom->count_words(line);
|
|
||||||
if (nwords != 4)
|
|
||||||
error->all(FLERR,"Invalid Points section in molecule file");
|
|
||||||
}
|
|
||||||
sscanf(line,"%d %lg %lg %lg",&tmp,
|
|
||||||
&points[i][0],&points[i][1],&points[i][2]);
|
|
||||||
|
|
||||||
// apply geometric operations to each point
|
|
||||||
|
|
||||||
points[i][0] *= sizescale;
|
|
||||||
points[i][1] *= sizescale;
|
|
||||||
points[i][2] *= sizescale;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (domain->dimension == 2) {
|
|
||||||
for (int i = 0; i < natoms; i++)
|
|
||||||
if (points[i][2] != 0.0)
|
|
||||||
error->all(FLERR,"Molecule file z point must be 0.0 for 2d");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ----------------------------------------------------------------------
|
|
||||||
read line segments from file
|
|
||||||
do not subtract one from point indices
|
|
||||||
------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
void Molecule::line_segments(char *line)
|
|
||||||
{
|
|
||||||
int tmp;
|
|
||||||
for (int i = 0; i < nlines; i++) {
|
|
||||||
readline(line);
|
|
||||||
if (i == 0) {
|
|
||||||
int nwords = atom->count_words(line);
|
|
||||||
if (nwords != 5)
|
|
||||||
error->all(FLERR,"Invalid Lines section in molecule file");
|
|
||||||
}
|
|
||||||
sscanf(line,"%d %d %d %d %d",&tmp,&molline[i],&typeline[i],
|
|
||||||
&lines[i][0],&lines[i][1]);
|
|
||||||
typeline[i] += toffset;
|
|
||||||
}
|
|
||||||
|
|
||||||
// check all types and point indices
|
|
||||||
|
|
||||||
for (int i = 0; i < nlines; i++) {
|
|
||||||
if (typeline[i] <= 0)
|
|
||||||
error->all(FLERR,"Invalid line type in molecule file");
|
|
||||||
if (lines[i][0] <= 0 || lines[i][0] > npoints ||
|
|
||||||
lines[i][1] <= 0 || lines[i][1] > npoints)
|
|
||||||
error->all(FLERR,"Invalid point index for line in molecule file");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ----------------------------------------------------------------------
|
|
||||||
read triangles from file
|
|
||||||
do not subtract one from point indices
|
|
||||||
------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
void Molecule::triangles(char *line)
|
|
||||||
{
|
|
||||||
int tmp;
|
|
||||||
for (int i = 0; i < ntris; i++) {
|
|
||||||
readline(line);
|
|
||||||
if (i == 0) {
|
|
||||||
int nwords = atom->count_words(line);
|
|
||||||
if (nwords != 6)
|
|
||||||
error->all(FLERR,"Invalid Triangles section in molecule file");
|
|
||||||
}
|
|
||||||
sscanf(line,"%d %d %d %d %d %d",&tmp,&moltri[i],&typetri[i],
|
|
||||||
&tris[i][0],&tris[i][1],&tris[i][2]);
|
|
||||||
typetri[i] += toffset;
|
|
||||||
}
|
|
||||||
|
|
||||||
// check all types and point indices
|
|
||||||
|
|
||||||
for (int i = 0; i < ntris; i++) {
|
|
||||||
if (typetri[i] <= 0)
|
|
||||||
error->all(FLERR,"Invalid triangle type in molecule file");
|
|
||||||
if (tris[i][0] <= 0 || tris[i][0] > npoints ||
|
|
||||||
tris[i][1] <= 0 || tris[i][1] > npoints ||
|
|
||||||
tris[i][2] <= 0 || tris[i][2] > npoints)
|
|
||||||
error->all(FLERR,"Invalid point index for triangle in molecule file");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ----------------------------------------------------------------------
|
/* ----------------------------------------------------------------------
|
||||||
read bonds from file
|
read bonds from file
|
||||||
set nbondtypes = max type of any bond
|
set nbondtypes = max type of any bond
|
||||||
@ -1563,15 +1405,10 @@ void Molecule::initialize()
|
|||||||
nbondtypes = nangletypes = ndihedraltypes = nimpropertypes = 0;
|
nbondtypes = nangletypes = ndihedraltypes = nimpropertypes = 0;
|
||||||
nibody = ndbody = 0;
|
nibody = ndbody = 0;
|
||||||
|
|
||||||
npoints = 0;
|
|
||||||
nlines = 0;
|
|
||||||
ntris = 0;
|
|
||||||
|
|
||||||
bond_per_atom = angle_per_atom = dihedral_per_atom = improper_per_atom = 0;
|
bond_per_atom = angle_per_atom = dihedral_per_atom = improper_per_atom = 0;
|
||||||
maxspecial = 0;
|
maxspecial = 0;
|
||||||
|
|
||||||
xflag = typeflag = qflag = radiusflag = rmassflag = 0;
|
xflag = typeflag = qflag = radiusflag = rmassflag = 0;
|
||||||
pointflag = lineflag = triflag = 0;
|
|
||||||
bondflag = angleflag = dihedralflag = improperflag = 0;
|
bondflag = angleflag = dihedralflag = improperflag = 0;
|
||||||
nspecialflag = specialflag = 0;
|
nspecialflag = specialflag = 0;
|
||||||
shakeflag = shakeflagflag = shakeatomflag = shaketypeflag = 0;
|
shakeflag = shakeflagflag = shakeatomflag = shaketypeflag = 0;
|
||||||
@ -1586,14 +1423,6 @@ void Molecule::initialize()
|
|||||||
radius = NULL;
|
radius = NULL;
|
||||||
rmass = NULL;
|
rmass = NULL;
|
||||||
|
|
||||||
points = NULL;
|
|
||||||
lines = NULL;
|
|
||||||
molline = NULL;
|
|
||||||
typeline = NULL;
|
|
||||||
tris = NULL;
|
|
||||||
moltri = NULL;
|
|
||||||
typetri = NULL;
|
|
||||||
|
|
||||||
num_bond = NULL;
|
num_bond = NULL;
|
||||||
bond_type = NULL;
|
bond_type = NULL;
|
||||||
bond_atom = NULL;
|
bond_atom = NULL;
|
||||||
@ -1638,20 +1467,6 @@ void Molecule::allocate()
|
|||||||
if (radiusflag) memory->create(radius,natoms,"molecule:radius");
|
if (radiusflag) memory->create(radius,natoms,"molecule:radius");
|
||||||
if (rmassflag) memory->create(rmass,natoms,"molecule:rmass");
|
if (rmassflag) memory->create(rmass,natoms,"molecule:rmass");
|
||||||
|
|
||||||
// lines or triangles with corner points
|
|
||||||
|
|
||||||
if (pointflag) memory->create(points,npoints,3,"molecule:points");
|
|
||||||
if (lineflag) {
|
|
||||||
memory->create(lines,nlines,2,"molecule:lines");
|
|
||||||
memory->create(molline,nlines,"molecule:molline");
|
|
||||||
memory->create(typeline,nlines,"molecule:typeline");
|
|
||||||
}
|
|
||||||
if (triflag) {
|
|
||||||
memory->create(tris,ntris,3,"molecule:tris");
|
|
||||||
memory->create(moltri,ntris,"molecule:moltri");
|
|
||||||
memory->create(typetri,ntris,"molecule:typetri");
|
|
||||||
}
|
|
||||||
|
|
||||||
// always allocate num_bond,num_angle,etc and special+nspecial
|
// always allocate num_bond,num_angle,etc and special+nspecial
|
||||||
// even if not in molecule file, initialize to 0
|
// even if not in molecule file, initialize to 0
|
||||||
// this is so methods that use these arrays don't have to check they exist
|
// this is so methods that use these arrays don't have to check they exist
|
||||||
@ -1739,14 +1554,6 @@ void Molecule::deallocate()
|
|||||||
memory->destroy(radius);
|
memory->destroy(radius);
|
||||||
memory->destroy(rmass);
|
memory->destroy(rmass);
|
||||||
|
|
||||||
memory->destroy(points);
|
|
||||||
memory->destroy(lines);
|
|
||||||
memory->destroy(molline);
|
|
||||||
memory->destroy(typeline);
|
|
||||||
memory->destroy(tris);
|
|
||||||
memory->destroy(moltri);
|
|
||||||
memory->destroy(typetri);
|
|
||||||
|
|
||||||
memory->destroy(num_bond);
|
memory->destroy(num_bond);
|
||||||
memory->destroy(bond_type);
|
memory->destroy(bond_type);
|
||||||
memory->destroy(bond_atom);
|
memory->destroy(bond_atom);
|
||||||
|
|||||||
@ -34,10 +34,6 @@ class Molecule : protected Pointers {
|
|||||||
int nbondtypes,nangletypes,ndihedraltypes,nimpropertypes;
|
int nbondtypes,nangletypes,ndihedraltypes,nimpropertypes;
|
||||||
int nibody,ndbody;
|
int nibody,ndbody;
|
||||||
|
|
||||||
// for surface lines or tris with corner points
|
|
||||||
|
|
||||||
int npoints,nlines,ntris;
|
|
||||||
|
|
||||||
// max bond,angle,etc per atom
|
// max bond,angle,etc per atom
|
||||||
|
|
||||||
int bond_per_atom,angle_per_atom,dihedral_per_atom,improper_per_atom;
|
int bond_per_atom,angle_per_atom,dihedral_per_atom,improper_per_atom;
|
||||||
@ -50,7 +46,6 @@ class Molecule : protected Pointers {
|
|||||||
int nspecialflag,specialflag;
|
int nspecialflag,specialflag;
|
||||||
int shakeflag,shakeflagflag,shakeatomflag,shaketypeflag;
|
int shakeflag,shakeflagflag,shakeatomflag,shaketypeflag;
|
||||||
int bodyflag,ibodyflag,dbodyflag;
|
int bodyflag,ibodyflag,dbodyflag;
|
||||||
int pointflag,lineflag,triflag;
|
|
||||||
|
|
||||||
// 1 if attribute defined or computed, 0 if not
|
// 1 if attribute defined or computed, 0 if not
|
||||||
|
|
||||||
@ -68,14 +63,6 @@ class Molecule : protected Pointers {
|
|||||||
double *radius; // radius of each atom
|
double *radius; // radius of each atom
|
||||||
double *rmass; // mass of each atom
|
double *rmass; // mass of each atom
|
||||||
|
|
||||||
double **points; // end/corner pts of lines or tris
|
|
||||||
int **lines; // list of line indices into points
|
|
||||||
int **tris; // list of tri indices into points
|
|
||||||
int *molline;
|
|
||||||
int *typeline;
|
|
||||||
int *moltri;
|
|
||||||
int *typetri;
|
|
||||||
|
|
||||||
int *num_bond; // bonds, angles, dihedrals, impropers for each atom
|
int *num_bond; // bonds, angles, dihedrals, impropers for each atom
|
||||||
int **bond_type;
|
int **bond_type;
|
||||||
tagint **bond_atom;
|
tagint **bond_atom;
|
||||||
@ -147,10 +134,6 @@ class Molecule : protected Pointers {
|
|||||||
void charges(char *);
|
void charges(char *);
|
||||||
void diameters(char *);
|
void diameters(char *);
|
||||||
void masses(char *);
|
void masses(char *);
|
||||||
void pts(char *);
|
|
||||||
void line_segments(char *);
|
|
||||||
void triangles(char *);
|
|
||||||
|
|
||||||
void bonds(int, char *);
|
void bonds(int, char *);
|
||||||
void angles(int, char *);
|
void angles(int, char *);
|
||||||
void dihedrals(int, char *);
|
void dihedrals(int, char *);
|
||||||
|
|||||||
Reference in New Issue
Block a user