Skip to content
Snippets Groups Projects
Commit 5881c6da authored by sjplimp's avatar sjplimp
Browse files

git-svn-id: svn://svn.icms.temple.edu/lammps-ro/trunk@15304 f3b2605a-c512-4ea7-a41b-209d697bcdaa
parent c1fb6c96
No related branches found
No related tags found
No related merge requests found
......@@ -103,9 +103,6 @@ Molecule::Molecule(LAMMPS *lmp, int narg, char **arg, int &index) :
sizescale = force->numeric(FLERR,arg[iarg+1]);
if (sizescale <= 0.0) error->all(FLERR,"Illegal molecule command");
iarg += 2;
// NOTE: add other geometric ops for points/lines/tris
} else break;
}
......@@ -120,14 +117,11 @@ Molecule::Molecule(LAMMPS *lmp, int narg, char **arg, int &index) :
initialize();
// scan file for sizes of all fields
// scan file for sizes of all fields and allocate them
if (me == 0) open(arg[ifile]);
read(0);
if (me == 0) fclose(fp);
// allocate memory for all fields defined in file
allocate();
// read file again to populate all fields
......@@ -139,34 +133,22 @@ Molecule::Molecule(LAMMPS *lmp, int narg, char **arg, int &index) :
// stats
if (me == 0) {
if (screen) {
fprintf(screen,"Read molecule %s:\n",id);
if (natoms)
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 impropers with %d types\n",
natoms,ntypes,
nbonds,nbondtypes,nangles,nangletypes,
ndihedrals,ndihedraltypes,nimpropers,nimpropertypes);
if (npoints && nlines)
fprintf(screen," %d lines with %d points\n",nlines,npoints);
if (npoints && ntris)
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 impropers with %d types\n",
natoms,ntypes,
nbonds,nbondtypes,nangles,nangletypes,
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);
}
if (screen)
fprintf(screen,"Read molecule %s:\n"
" %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 impropers with %d types\n",
id,natoms,ntypes,
nbonds,nbondtypes,nangles,nangletypes,
ndihedrals,ndihedraltypes,nimpropers,nimpropertypes);
if (logfile)
fprintf(logfile,"Read molecule %s:\n"
" %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 impropers with %d types\n",
id,natoms,ntypes,
nbonds,nbondtypes,nangles,nangletypes,
ndihedrals,ndihedraltypes,nimpropers,nimpropertypes);
}
}
......@@ -435,20 +417,14 @@ void Molecule::read(int flag)
if (strspn(line," \t\n\r") == strlen(line)) continue;
// 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);
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,"angles")) sscanf(line,"%d",&nangles);
else if (strstr(line,"dihedrals")) sscanf(line,"%d",&ndihedrals);
else if (strstr(line,"impropers")) sscanf(line,"%d",&nimpropers);
else if (strstr(line," mass")) {
else if (strstr(line,"mass")) {
massflag = 1;
sscanf(line,"%lg",&masstotal);
masstotal *= sizescale*sizescale*sizescale;
......@@ -487,11 +463,8 @@ void Molecule::read(int flag)
// error checks
if (natoms < 0) error->all(FLERR,"Invalid atom count in molecule file");
if (npoints < 0) error->all(FLERR,"Invalid point 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 (natoms < 1)
error->all(FLERR,"No count or invalid atom 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 (ndihedrals < 0)
......@@ -499,21 +472,6 @@ void Molecule::read(int flag)
if (nimpropers < 0)
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
if (flag == 0) memory->create(count,natoms,"molecule:count");
......@@ -548,19 +506,6 @@ void Molecule::read(int flag)
if (flag) masses(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) {
if (nbonds == 0)
error->all(FLERR,"Molecule file has bonds but no nbonds setting");
......@@ -634,15 +579,6 @@ void Molecule::read(int flag)
// error check
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))
error->all(FLERR,"Molecule file needs both Special Bond sections");
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");
}
/* ----------------------------------------------------------------------
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
set nbondtypes = max type of any bond
......@@ -1563,15 +1405,10 @@ void Molecule::initialize()
nbondtypes = nangletypes = ndihedraltypes = nimpropertypes = 0;
nibody = ndbody = 0;
npoints = 0;
nlines = 0;
ntris = 0;
bond_per_atom = angle_per_atom = dihedral_per_atom = improper_per_atom = 0;
maxspecial = 0;
xflag = typeflag = qflag = radiusflag = rmassflag = 0;
pointflag = lineflag = triflag = 0;
bondflag = angleflag = dihedralflag = improperflag = 0;
nspecialflag = specialflag = 0;
shakeflag = shakeflagflag = shakeatomflag = shaketypeflag = 0;
......@@ -1586,14 +1423,6 @@ void Molecule::initialize()
radius = NULL;
rmass = NULL;
points = NULL;
lines = NULL;
molline = NULL;
typeline = NULL;
tris = NULL;
moltri = NULL;
typetri = NULL;
num_bond = NULL;
bond_type = NULL;
bond_atom = NULL;
......@@ -1638,20 +1467,6 @@ void Molecule::allocate()
if (radiusflag) memory->create(radius,natoms,"molecule:radius");
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
// even if not in molecule file, initialize to 0
// 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(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(bond_type);
memory->destroy(bond_atom);
......
......@@ -34,10 +34,6 @@ class Molecule : protected Pointers {
int nbondtypes,nangletypes,ndihedraltypes,nimpropertypes;
int nibody,ndbody;
// for surface lines or tris with corner points
int npoints,nlines,ntris;
// max bond,angle,etc 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 shakeflag,shakeflagflag,shakeatomflag,shaketypeflag;
int bodyflag,ibodyflag,dbodyflag;
int pointflag,lineflag,triflag;
// 1 if attribute defined or computed, 0 if not
......@@ -68,14 +63,6 @@ class Molecule : protected Pointers {
double *radius; // radius 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 **bond_type;
tagint **bond_atom;
......@@ -147,10 +134,6 @@ class Molecule : protected Pointers {
void charges(char *);
void diameters(char *);
void masses(char *);
void pts(char *);
void line_segments(char *);
void triangles(char *);
void bonds(int, char *);
void angles(int, char *);
void dihedrals(int, char *);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment