git-svn-id: svn://svn.icms.temple.edu/lammps-ro/trunk@644 f3b2605a-c512-4ea7-a41b-209d697bcdaa

This commit is contained in:
sjplimp 2007-06-22 17:23:42 +00:00
parent f93cd8f7ad
commit 24f7d34ec3
2 changed files with 2 additions and 866 deletions

View File

@ -5,14 +5,11 @@
#
all:
$(MAKE) binary2txt replicate restart2data chain micelle2d data2xmovie
$(MAKE) binary2txt restart2data chain micelle2d data2xmovie
binary2txt: binary2txt.o
g++ -g binary2txt.o -o binary2txt
replicate: replicate.o
g++ -g replicate.o -o replicate
restart2data: restart2data.o
g++ -g restart2data.o -o restart2data
@ -29,7 +26,7 @@ thermo_extract: thermo_extract.o
gcc -g thermo_extract.o -o thermo_extract
clean:
rm binary2txt replicate restart2data chain micelle2d data2xmovie
rm binary2txt restart2data chain micelle2d data2xmovie
rm thermo_extract
rm *.o

View File

@ -1,861 +0,0 @@
/* replicate tool
read LAMMPS data file as input
create new LAMMPS data file as output
new file can be translated, dilated, mapped to periodic box
and/or replicated to create a larger system
create new molecule tags as needed
Syntax: replicate [options] < infile > outfile
Options:
-style atom_style
use the LAMMPS atom style that corresponds to this file
e.g. atomic or bond or angle or full or granular
will be used for reading and writing files
this option must be specified
for atom_style = hybrid, append subsequent styles
e.g. -style hybrid bond charge
-repeat nx ny nz
use the input data as a unit cell and replicate the unit
cell by (nx,ny,nz) in the +x, +y, +z directions
this creates new atoms, bonds, angles, etc
if not specified, nx = ny = nz = 1
-inbox xlo xhi ylo yhi zlo zhi
use these values for the bounding box of the input system
and for the unit cell used for replicating purposes
if not specified use the box bounds read in from infile
-outbox xlo xhi ylo yhi zlo zhi
use these values for the bounding box of the output system
if not specified the output bounding box is computed from the input
bounding box by holding the "lo" values constant and creating
new "hi" values by multiplying by the replicating factors
-unmap
unmap all input atom positions using input image flags
and inbox in a periodic sense
this enables molecular bonds to be replicated
-map
map all final atom positions into the output bounding box
in a periodic sense
works no matter how far away from the box the atoms are
this operation is independent of unmap option
-imageout
image flags will be written to outfile, else they won't be
if unmapping/mapping is done, image flags are modified accordingly
Notes:
works with "Velocities" entry by giving same velocity to
all replicated images of an atom, which is probably not ideal
can perform system dilation/contraction by using "-repeat 1 1 1"
and specifying a slightly larger/smaller output box than input
box.
can add/delete image flags by using -imageout
*/
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
struct box {
double xlo,xhi,xsize;
double ylo,yhi,ysize;
double zlo,zhi,zsize;
};
#define MAXLINE 1000
main(int argc, char *argv[])
{
char line[MAXLINE]; /* strings for reading/parsing input file */
char linetoken[MAXLINE];
char *token,*ptr;
/* numbers of various quantities as read in */
int natoms,nbonds,nangles,ndihedrals,nimpropers;
int ntypes,nbondtypes,nangletypes,ndihedtypes,nimprotypes;
int nmolecules; /* total # of mols specified by mol tags */
/* vectors of various quantities as read in */
int *tag,*molecule,*type;
double *q,*radius,*density,*x,*y,*z,*mux,*muy,*muz;
int *imagex,*imagey,*imagez;
int *vtag;
double *vx,*vy,*vz,*vphix,*vphiy,*vphiz;
int *btype,*atype,*dtype,*itype;
int *bond1,*bond2,*angle1,*angle2,*angle3;
int *dihed1,*dihed2,*dihed3,*dihed4,*impro1,*impro2,*impro3,*impro4;
int atomstyle; /* atom styles and settings */
int style_angle,style_atomic,style_bond,style_charge,style_dipole;
int style_dpd,style_full,style_granular,style_molecular;
int charge,molecular,dipole;
int nx,ny,nz; /* replication factors */
int inbox,outbox; /* flags for whether in/out boxes were explicitly
specified */
int unmap; /* 0 = no unmapping, 1 = unmap from input box */
int map; /* 0 = no mapping, 1 = map to output box */
int imageout; /* 0/1 = no/yes output of image flags */
int imageflag; /* 0/1 = no/yes if image flags exist in input */
struct box in,out; /* input and output bounding boxes */
int ntotal; /* total replication factor = nx*ny*nz */
double newx,newy,newz; /* replicated atom position */
int size_atom_valid; /* values that should be on atom line */
int size_atom_actual; /* values that are on atom line */
int i,j,k,m,n,tmp,del,tag_offset,mol_offset; /* temp variables */
char **values;
char *gettoken(char *, int); /* function defs */
int count_words(char *);
void copyline(int);
void scale(struct box, int, int, int,
struct box, double *, double *, double *);
void pbc(struct box, double *, double *, double *, int *, int *, int *);
/* default input values */
atomstyle = 0;
style_angle = style_atomic = style_bond = style_charge = style_dipole =
style_dpd = style_full = style_granular = style_molecular = 0;
nx = ny = nz = 1;
inbox = outbox = 0;
unmap = 0;
map = 0;
imageout = 0;
/* read input options from command line
should do more error checking for missing args */
i = 1;
while (i < argc) {
if (!strcmp(argv[i],"-style")) {
atomstyle = 1;
if (strcmp(argv[i+1],"angle") == 0) style_angle = 1;
else if (strcmp(argv[i+1],"atomic") == 0) style_atomic = 1;
else if (strcmp(argv[i+1],"bond") == 0) style_bond = 1;
else if (strcmp(argv[i+1],"charge") == 0) style_charge = 1;
else if (strcmp(argv[i+1],"dipole") == 0) style_dipole = 1;
else if (strcmp(argv[i+1],"dpd") == 0) style_dpd = 1;
else if (strcmp(argv[i+1],"full") == 0) style_full = 1;
else if (strcmp(argv[i+1],"granular") == 0) style_granular = 1;
else if (strcmp(argv[i+1],"molecular") == 0) style_molecular = 1;
else if (strcmp(argv[i+1],"hybrid") == 0) {
n = i + 2;
while (n < argc && argv[n][0] != '-') {
if (strcmp(argv[n],"angle") == 0) style_angle = 1;
else if (strcmp(argv[n],"atomic") == 0) style_atomic = 1;
else if (strcmp(argv[n],"bond") == 0) style_bond = 1;
else if (strcmp(argv[n],"charge") == 0) style_charge = 1;
else if (strcmp(argv[n],"dipole") == 0) style_dipole = 1;
else if (strcmp(argv[n],"dpd") == 0) style_dpd = 1;
else if (strcmp(argv[n],"full") == 0) style_full = 1;
else if (strcmp(argv[n],"granular") == 0) style_granular = 1;
else if (strcmp(argv[n],"molecular") == 0) style_molecular = 1;
else {
fprintf(stderr,"Error with command-line arg style\n");
exit(1);
}
n++;
}
if (i == n - 2) {
fprintf(stderr,"Error with command-line arg style\n");
exit(1);
}
i = n - 2;
} else {
fprintf(stderr,"Error with command-line arg style\n");
exit(1);
}
i += 2;
} else if (!strcmp(argv[i],"-repeat")) {
sscanf(argv[i+1],"%d",&nx);
sscanf(argv[i+2],"%d",&ny);
sscanf(argv[i+3],"%d",&nz);
i += 4;
} else if (!strcmp(argv[i],"-inbox")) {
inbox = 1;
sscanf(argv[i+1],"%lg",&in.xlo);
sscanf(argv[i+2],"%lg",&in.xhi);
sscanf(argv[i+3],"%lg",&in.ylo);
sscanf(argv[i+4],"%lg",&in.yhi);
sscanf(argv[i+5],"%lg",&in.zlo);
sscanf(argv[i+6],"%lg",&in.zhi);
i += 7;
} else if (!strcmp(argv[i],"-outbox")) {
outbox = 1;
sscanf(argv[i+1],"%lg",&out.xlo);
sscanf(argv[i+2],"%lg",&out.xhi);
sscanf(argv[i+3],"%lg",&out.ylo);
sscanf(argv[i+4],"%lg",&out.yhi);
sscanf(argv[i+5],"%lg",&out.zlo);
sscanf(argv[i+6],"%lg",&out.zhi);
i += 7;
} else if (!strcmp(argv[i],"-unmap")) {
unmap = 1;
i += 1;
} else if (!strcmp(argv[i],"-map")) {
map = 1;
i += 1;
} else if (!strcmp(argv[i],"-imageout")) {
imageout = 1;
i += 1;
} else {
fprintf(stderr,"Syntax error: replicate [options] < infile > outfile\n");
exit(1);
}
}
/* set low-level info from style flags */
charge = 0;
if (style_charge || style_full || style_dipole) charge = 1;
molecular = 0;
if (style_angle || style_bond || style_full || style_molecular)
molecular = 1;
dipole = 0;
if (style_dipole) dipole = 1;
size_atom_valid = 5;
if (charge) size_atom_valid += 1;
if (style_dipole) size_atom_valid += 3;
if (style_granular) size_atom_valid += 2;
if (molecular) size_atom_valid += 1;
/* error checks */
if (atomstyle == 0) {
fprintf(stderr,"ERROR: must use -style to set atom style\n");
exit(1);
}
/* ntotal = total replication factor */
ntotal = nx*ny*nz;
/* defaults */
natoms = nbonds = nangles = ndihedrals = nimpropers = 0;
ntypes = nbondtypes = nangletypes = ndihedtypes = nimprotypes = 0;
/* read/write header */
copyline(1); // echo 1st line
while (1) {
fgets(line,MAXLINE,stdin);
// trim anything from '#' onward
// if line is blank, continue
if (ptr = strchr(line,'#')) *ptr = '\0';
if (strspn(line," \t\n\r") == strlen(line)) {
printf("\n");
continue;
}
if (strstr(line,"atoms")) {
sscanf(line,"%d",&natoms);
printf("%d atoms\n",natoms*ntotal);
} else if (strstr(line,"bonds")) {
sscanf(line,"%d",&nbonds);
printf("%d bonds\n",nbonds*ntotal);
} else if (strstr(line,"angles")) {
sscanf(line,"%d",&nangles);
printf("%d angles\n",nangles*ntotal);
} else if (strstr(line,"dihedrals")) {
sscanf(line,"%d",&ndihedrals);
printf("%d dihedrals\n",ndihedrals*ntotal);
} else if (strstr(line,"impropers")) {
sscanf(line,"%d",&nimpropers);
printf("%d impropers\n",nimpropers*ntotal);
} else if (strstr(line,"atom types")) {
sscanf(line,"%d",&ntypes);
printf("%d atom types\n",ntypes);
} else if (strstr(line,"bond types")) {
sscanf(line,"%d",&nbondtypes);
printf("%d bond types\n",nbondtypes);
} else if (strstr(line,"angle types")) {
sscanf(line,"%d",&nangletypes);
printf("%d angle types\n",nangletypes);
} else if (strstr(line,"dihedral types")) {
sscanf(line,"%d",&ndihedtypes);
printf("%d dihedral types\n",ndihedtypes);
} else if (strstr(line,"improper types")) {
sscanf(line,"%d",&nimprotypes);
printf("%d improper types\n",nimprotypes);
} else if (strstr(line,"xlo xhi")) {
if (!inbox) sscanf(line,"%lg %lg",&in.xlo,&in.xhi);
in.xsize = in.xhi - in.xlo;
if (!outbox) {
out.xlo = in.xlo;
if (nx > 1) out.xhi = out.xlo + (in.xhi-in.xlo)*nx;
else out.xhi = in.xhi;
}
out.xsize = out.xhi - out.xlo;
printf("%g %g xlo xhi\n",out.xlo,out.xhi);
} else if (strstr(line,"ylo yhi")) {
if (!inbox) sscanf(line,"%lg %lg",&in.ylo,&in.yhi);
in.ysize = in.yhi - in.ylo;
if (!outbox) {
out.ylo = in.ylo;
if (ny > 1) out.yhi = out.ylo + (in.yhi-in.ylo)*ny;
else out.yhi = in.yhi;
}
out.ysize = out.yhi - out.ylo;
printf("%g %g ylo yhi\n",out.ylo,out.yhi);
} else if (strstr(line,"zlo zhi")) {
if (!inbox) sscanf(line,"%lg %lg",&in.zlo,&in.zhi);
in.zsize = in.zhi - in.zlo;
if (!outbox) {
out.zlo = in.zlo;
if (nz > 1) out.zhi = out.zlo + (in.zhi-in.zlo)*nz;
else out.zhi = in.zhi;
}
out.zsize = out.zhi - out.zlo;
printf("%g %g zlo zhi\n",out.zlo,out.zhi);
} else break;
}
/* malloc space for input atoms and topology */
tag = (int *) malloc(natoms*sizeof(int));
type = (int *) malloc(natoms*sizeof(int));
x = (double *) malloc(natoms*sizeof(double));
y = (double *) malloc(natoms*sizeof(double));
z = (double *) malloc(natoms*sizeof(double));
imagex = (int *) malloc(natoms*sizeof(int));
imagey = (int *) malloc(natoms*sizeof(int));
imagez = (int *) malloc(natoms*sizeof(int));
vtag = (int *) malloc(natoms*sizeof(int));
vx = (double *) malloc(natoms*sizeof(double));
vy = (double *) malloc(natoms*sizeof(double));
vz = (double *) malloc(natoms*sizeof(double));
if (tag == NULL || type == NULL ||
x == NULL || y == NULL || z == NULL ||
imagex == NULL || imagey == NULL || imagez == NULL ||
vtag == NULL || vx == NULL || vy == NULL || vz == NULL) {
fprintf(stderr,"Error in atom malloc - no space\n");
exit(1);
}
if (charge) {
q = (double *) malloc(natoms*sizeof(double));
if (q == NULL) {
fprintf(stderr,"Error in atom malloc - no space\n");
exit(1);
}
}
if (molecular) {
molecule = (int *) malloc(natoms*sizeof(int));
if (molecule == NULL) {
fprintf(stderr,"Error in atom malloc - no space\n");
exit(1);
}
}
if (dipole) {
mux = (double *) malloc(natoms*sizeof(double));
muy = (double *) malloc(natoms*sizeof(double));
muz = (double *) malloc(natoms*sizeof(double));
if (mux == NULL || muy == NULL || muz == NULL) {
fprintf(stderr,"Error in atom malloc - no space\n");
exit(1);
}
}
if (style_granular) {
radius = (double *) malloc(natoms*sizeof(double));
density = (double *) malloc(natoms*sizeof(double));
vphix = (double *) malloc(natoms*sizeof(double));
vphiy = (double *) malloc(natoms*sizeof(double));
vphiz = (double *) malloc(natoms*sizeof(double));
if (radius == NULL || density == NULL ||
vphix == NULL || vphiy == NULL || vphiz == NULL) {
fprintf(stderr,"Error in atom malloc - no space\n");
exit(1);
}
}
if (nbonds) {
btype = (int *) malloc(nbonds*sizeof(int));
bond1 = (int *) malloc(nbonds*sizeof(int));
bond2 = (int *) malloc(nbonds*sizeof(int));
if (btype == NULL || bond1 == NULL || bond2 == NULL) {
fprintf(stderr,"Error in bond malloc - no space\n");
exit(1);
}
}
if (nangles) {
atype = (int *) malloc(nangles*sizeof(int));
angle1 = (int *) malloc(nangles*sizeof(int));
angle2 = (int *) malloc(nangles*sizeof(int));
angle3 = (int *) malloc(nangles*sizeof(int));
if (atype == NULL || angle1 == NULL || angle2 == NULL || angle3 == NULL) {
fprintf(stderr,"Error in angle malloc - no space\n");
exit(1);
}
}
if (ndihedrals) {
dtype = (int *) malloc(ndihedrals*sizeof(int));
dihed1 = (int *) malloc(ndihedrals*sizeof(int));
dihed2 = (int *) malloc(ndihedrals*sizeof(int));
dihed3 = (int *) malloc(ndihedrals*sizeof(int));
dihed4 = (int *) malloc(ndihedrals*sizeof(int));
if (dtype == NULL || dihed1 == NULL || dihed2 == NULL ||
dihed3 == NULL || dihed4 == NULL) {
fprintf(stderr,"Error in dihedral malloc - no space\n");
exit(1);
}
}
if (nimpropers) {
itype = (int *) malloc(nimpropers*sizeof(int));
impro1 = (int *) malloc(nimpropers*sizeof(int));
impro2 = (int *) malloc(nimpropers*sizeof(int));
impro3 = (int *) malloc(nimpropers*sizeof(int));
impro4 = (int *) malloc(nimpropers*sizeof(int));
if (itype == NULL || impro1 == NULL || impro2 == NULL ||
impro3 == NULL || impro4 == NULL) {
fprintf(stderr,"Error in improper malloc - no space\n");
exit(1);
}
}
/* read identifier strings one by one in free-form part of data file */
token = gettoken(line,1);
while (token) {
/* read atoms */
if (!strcmp(token,"Atoms")) {
for (i = 0; i < natoms; i++) {
fgets(line,MAXLINE,stdin);
if (i == 0) {
size_atom_actual = count_words(line);
if (size_atom_actual == size_atom_valid) imageflag = 0;
else if (size_atom_actual == size_atom_valid + 3) imageflag = 1;
else {
fprintf(stderr,"Error in atom lines\n");
exit(1);
}
if (unmap == 1 && imageflag == 0) {
fprintf(stderr,
"If unmap is requested, file must have image flags\n");
exit(1);
}
values = (char **) malloc(size_atom_actual*sizeof(char *));
}
values[0] = strtok(line," \t\n");
for (m = 1; m < size_atom_actual; m++)
values[m] = strtok(NULL," \t\n");
m = 0;
tag[i] = atoi(values[m++]);
if (molecular) molecule[i] = atoi(values[m++]);
type[i] = atoi(values[m++]);
if (charge) q[i] = atof(values[m++]);
if (style_granular) {
radius[i] = 0.5 * atof(values[m++]);
density[i] = atof(values[m++]);
}
x[i] = atof(values[m++]);
y[i] = atof(values[m++]);
z[i] = atof(values[m++]);
if (style_dipole) {
mux[i] = atof(values[m++]);
muy[i] = atof(values[m++]);
muz[i] = atof(values[m++]);
}
if (imageflag) {
imagex[i] = atoi(values[m++]);
imagey[i] = atoi(values[m++]);
imagez[i] = atoi(values[m++]);
} else imagex[i] = imagey[i] = imagez[i] = 0;
}
/* unmap atoms if requested */
if (unmap) {
for (i = 0; i < natoms; i++) {
x[i] = x[i] + imagex[i]*in.xsize;
y[i] = y[i] + imagey[i]*in.ysize;
z[i] = z[i] + imagez[i]*in.zsize;
imagex[i] = imagey[i] = imagez[i] = 0;
}
}
/* find number of molecules */
nmolecules = 0;
if (molecular)
for (i = 0; i < natoms; i++)
if (molecule[i] > nmolecules) nmolecules = molecule[i];
/* replicate set of N atoms as many times as requested
generate new tags, mol number, coords, image flags as needed */
for (k = 0; k < nz; k++) {
for (j = 0; j < ny; j++) {
for (i = 0; i < nx; i++) {
for (m = 0; m < natoms; m++) {
newx = x[m] + i*in.xsize;
newy = y[m] + j*in.ysize;
newz = z[m] + k*in.zsize;
if (outbox) scale(in,nx,ny,nz,out,&newx,&newy,&newz);
if (map) pbc(out,&newx,&newy,&newz,
&imagex[m],&imagey[m],&imagez[m]);
tag_offset = k*ny*nx*natoms + j*nx*natoms + i*natoms;
mol_offset = k*ny*nx*nmolecules + j*nx*nmolecules + i*nmolecules;
line[0] = '\0';
sprintf(&line[strlen(line)],"%d",tag[m]+tag_offset);
if (molecular) sprintf(&line[strlen(line)]," %d",
molecule[m]+mol_offset);
sprintf(&line[strlen(line)]," %d",type[m]);
if (charge) sprintf(&line[strlen(line)]," %g",q[m]);
if (style_granular) sprintf(&line[strlen(line)]," %g %g",
radius[m],density[m]);
sprintf(&line[strlen(line)]," %g %g %g",newx,newy,newz);
if (style_dipole) sprintf(&line[strlen(line)]," %g %g %g",
mux[m],muy[m],muz[m]);
if (imageout) sprintf(&line[strlen(line)]," %d %d %d",
imagex[m],imagey[m],imagez[m]);
printf("%s\n",line);
}
}
}
}
}
/* read velocities and replicate */
else if (!strcmp(token,"Velocities")) {
for (i = 0; i < natoms; i++) {
fgets(line,MAXLINE,stdin);
if (!style_granular)
sscanf(line,"%d %lg %lg %lg",&vtag[i],&vx[i],&vy[i],&vz[i]);
else
sscanf(line,"%d %lg %lg %lg %lg %lg %lg",&vtag[i],
&vx[i],&vy[i],&vz[i],&vphix[i],&vphiy[i],&vphiz[i]);
}
for (k = 0; k < nz; k++) {
for (j = 0; j < ny; j++) {
for (i = 0; i < nx; i++) {
for (m = 0; m < natoms; m++) {
tag_offset = k*ny*nx*natoms + j*nx*natoms + i*natoms;
if (!style_granular)
printf("%d %g %g %g\n",vtag[m]+tag_offset,vx[m],vy[m],vz[m]);
else
printf("%d %g %g %g %g %g %g\n",vtag[m]+tag_offset,
vx[m],vy[m],vz[m],vphix[m],vphiy[m],vphiz[m]);
}
}
}
}
}
/* read bonds and replicate */
else if (!strcmp(token,"Bonds")) {
for (i = 0; i < nbonds; i++) {
fgets(line,MAXLINE,stdin);
sscanf(line,"%d %d %d %d",&n,&btype[i],&bond1[i],&bond2[i]);
}
n = 0;
for (k = 0; k < nz; k++)
for (j = 0; j < ny; j++)
for (i = 0; i < nx; i++)
for (m = 0; m < nbonds; m++) {
n++;
del = k*ny*nx*natoms + j*nx*natoms + i*natoms;
printf("%d %d %d %d\n",n,btype[m],bond1[m]+del,bond2[m]+del);
}
}
/* read angles and replicate */
else if (!strcmp(token,"Angles")) {
for (i = 0; i < nangles; i++) {
fgets(line,MAXLINE,stdin);
sscanf(line,"%d %d %d %d %d",&n,&atype[i],
&angle1[i],&angle2[i],&angle3[i]);
}
n = 0;
for (k = 0; k < nz; k++)
for (j = 0; j < ny; j++)
for (i = 0; i < nx; i++)
for (m = 0; m < nangles; m++) {
n++;
del = k*ny*nx*natoms + j*nx*natoms + i*natoms;
printf("%d %d %d %d %d\n",n,atype[m],
angle1[m]+del,angle2[m]+del,angle3[m]+del);
}
}
/* read dihedrals and replicate */
else if (!strcmp(token,"Dihedrals")) {
for (i = 0; i < ndihedrals; i++) {
fgets(line,MAXLINE,stdin);
sscanf(line,"%d %d %d %d %d %d",&n,&dtype[i],&dihed1[i],&dihed2[i],
&dihed3[i],&dihed4[i]);
}
n = 0;
for (k = 0; k < nz; k++)
for (j = 0; j < ny; j++)
for (i = 0; i < nx; i++)
for (m = 0; m < ndihedrals; m++) {
n++;
del = k*ny*nx*natoms + j*nx*natoms + i*natoms;
printf("%d %d %d %d %d %d\n",n,dtype[m],
dihed1[m]+del,dihed2[m]+del,dihed3[m]+del,dihed4[m]+del);
}
}
/* read impropers and replicate */
else if (!strcmp(token,"Impropers")) {
for (i = 0; i < nimpropers; i++) {
fgets(line,MAXLINE,stdin);
sscanf(line,"%d %d %d %d %d %d",&n,&itype[i],&impro1[i],&impro2[i],
&impro3[i],&impro4[i]);
}
n = 0;
for (k = 0; k < nz; k++)
for (j = 0; j < ny; j++)
for (i = 0; i < nx; i++)
for (m = 0; m < nimpropers; m++) {
n++;
del = k*ny*nx*natoms + j*nx*natoms + i*natoms;
printf("%d %d %d %d %d %d\n",n,itype[m],
impro1[m]+del,impro2[m]+del,impro3[m]+del,impro4[m]+del);
}
}
/* non-replicated sections
just copy proper number of lines from in to out */
else if (!strcmp(token,"Masses"))
copyline(ntypes);
else if (!strcmp(token,"Dipoles"))
copyline(ntypes);
else if (!strcmp(token,"Pair Coeffs"))
copyline(ntypes);
else if (!strcmp(token,"Bond Coeffs"))
copyline(nbondtypes);
else if (!strcmp(token,"Angle Coeffs"))
copyline(nangletypes);
else if (!strcmp(token,"Dihedral Coeffs"))
copyline(ndihedtypes);
else if (!strcmp(token,"Improper Coeffs"))
copyline(nimprotypes);
else if (!strcmp(token,"BondBond Coeffs"))
copyline(nangletypes);
else if (!strcmp(token,"BondAngle Coeffs"))
copyline(nangletypes);
else if (!strcmp(token,"MiddleBondTorsion Coeffs"))
copyline(ndihedtypes);
else if (!strcmp(token,"EndBondTorsion Coeffs"))
copyline(ndihedtypes);
else if (!strcmp(token,"AngleTorsion Coeffs"))
copyline(ndihedtypes);
else if (!strcmp(token,"AngleAngleTorsion Coeffs"))
copyline(ndihedtypes);
else if (!strcmp(token,"BondBond13 Coeffs"))
copyline(ndihedtypes);
else if (!strcmp(token,"AngleAngle Coeffs"))
copyline(nimprotypes);
else {
fprintf(stderr,
"Error in input data file - unknown identifier %s\n",token);
exit(1);
}
token = gettoken(line,0);
}
}
/* ------------------------------------------------------------------- */
/* return a LAMMPS keyword from data file
if first is 1, non-blank line with token is in line
else read until find a non-blank line
keyword is all text on line w/out leading & trailing white space
read one additional line after non-blank line (assumed blank)
return ptr to keyword
return NULL if end of file */
char *gettoken(char *line, int first)
{
char buffer[MAXLINE];
// read upto non-blank line plus 1 following line
// eof is set to 1 if any read hits end-of-file
int eof = 0;
if (!first) if (fgets(line,MAXLINE,stdin) == NULL) eof = 1;
while (eof == 0 && strspn(line," \t\n\r") == strlen(line))
if (fgets(line,MAXLINE,stdin) == NULL) eof = 1;
if (fgets(buffer,MAXLINE,stdin) == NULL) eof = 1;
// if eof, return NULL
if (eof) return NULL;
// bracket non-whitespace portion of line
int start = strspn(line," \t\n\r");
int stop = strlen(line) - 1;
while (line[stop] == ' ' || line[stop] == '\t'
|| line[stop] == '\n' || line[stop] == '\r') stop--;
line[stop+1] = '\0';
// print keyword into output file
if (first) printf("%s\n\n",&line[start]);
else printf("\n%s\n\n",&line[start]);
// return ptr to keyword
return &line[start];
}
/* count and return words in a single line
make copy of line before using strtok so as not to change line
trim anything from '#' onward */
int count_words(char *line)
{
int n = strlen(line) + 1;
char *copy = (char *) malloc(n*sizeof(char));
strcpy(copy,line);
char *ptr;
if (ptr = strchr(copy,'#')) *ptr = '\0';
if (strtok(copy," \t\n") == NULL) return 0;
n = 1;
while (strtok(NULL," \t\n")) n++;
free(copy);
return n;
}
/* copy n lines from stdin to stdout */
void copyline(int n)
{
char line[1000];
while (n) {
fgets(line,MAXLINE,stdin);
printf("%s",line);
n--;
}
}
/* point (x,y,z) is somewhere in (or near) the replicated box "in"
rescale (x,y,z) so it is in the same relative location in box "out"
do this by 1st converting to 0-1 coord system in "in" space */
void scale(struct box in, int nx, int ny, int nz,
struct box out, double *x, double *y, double *z)
{
double rel;
rel = (*x-in.xlo) / (nx*in.xsize);
*x = out.xlo + rel*out.xsize;
rel = (*y-in.ylo) / (ny*in.ysize);
*y = out.ylo + rel*out.ysize;
rel = (*z-in.zlo) / (nz*in.zsize);
*z = out.zlo + rel*out.zsize;
}
/* remap the point (x,y,z) so it is guaranteed to be inside the box
using standard periodic imaging, update image flags */
void pbc(struct box box, double *x, double *y, double *z,
int *imagex, int *imagey, int *imagez)
{
while (*x < box.xlo) {
*x += box.xsize;
*imagex -= 1;
}
while (*x >= box.xhi) {
*x -= box.xsize;
*imagex += 1;
}
while (*y < box.ylo) {
*y += box.ysize;
*imagey -= 1;
}
while (*y >= box.yhi) {
*y -= box.ysize;
*imagey += 1;
}
while (*z < box.zlo) {
*z += box.zsize;
*imagez -= 1;
}
while (*z >= box.zhi) {
*z -= box.zsize;
*imagez += 1;
}
}