Commit e110d696 authored by Axel Kohlmeyer's avatar Axel Kohlmeyer
Browse files

remove obsolete tools and files

parent a42b0b7d
Loading
Loading
Loading
Loading

tools/data2xmovie.c

deleted100644 → 0
+0 −366
Original line number Diff line number Diff line
/* data2xmovie tool

   read LAMMPS data file as input
   write a snapshot in XMOVIE format

   Syntax:  data2xmovie [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 eam or granular
          will be used for reading and writing files
          if not specified, atom_style = full

      -unmap

          unmap all input atom positions using input image flags
          image flags must be specified in infile
	  default is to leave atoms mapped to periodic box

     -inbox xlo xhi ylo yhi zlo zhi

          use these values for the output bounding box of the system
	    useful if are unmapping atoms into a larger domain
	  if not specified use the box bounds read in from infile
*/

#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

#define ATOMIC 1
#define BOND   2
#define ANGLE  3
#define FULL   4
#define EAM    5
#define GRANULAR 6

main(int argc, char *argv[])

{
  char line[1000];            /* strings for reading/parsing input file */
  char linetoken[1000];
  char *token;             
                             /* 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 */

  int atomstyle;             /* atomstyle for read/write of Atoms */
  int unmap;                 /* 0 = no unmapping, 1 = unmap from input box */
  int outbox;                /* flag for whether out box is explicitly set */

  struct box in,out;             /* input/output bounding box */

  char *gettoken(char *, int);    /* function defs */
  void skipline(int); 

  /* default input values */

  atomstyle = 0;
  unmap = 0;
  outbox = 0;
  
  /* read input options from command line
     should do more error checking for missing args */

  int i = 1;
  while (i < argc) {

    if (!strcmp(argv[i],"-style")) {
      if (strcmp(argv[i+1],"atomic") == 0) atomstyle = ATOMIC;
      else if (strcmp(argv[i+1],"bond") == 0) atomstyle = BOND;
      else if (strcmp(argv[i+1],"angle") == 0) atomstyle = ANGLE;
      else if (strcmp(argv[i+1],"full") == 0) atomstyle = FULL;
      else if (strcmp(argv[i+1],"eam") == 0) atomstyle = EAM;
      else if (strcmp(argv[i+1],"granular") == 0) atomstyle = GRANULAR;
      else {
	fprintf(stderr,"Error with command-line arg style\n");
	exit(1);
      }
      i += 2;
    } else if (!strcmp(argv[i],"-unmap")) {
      unmap = 1;
      i += 1;
    } else if (!strcmp(argv[i],"-inbox")) {
      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 {
      fprintf(stderr,"Syntax error: data2xmovie [options] < infile > outfile\n");
      exit(1);
    }
  }
  
  /* error checks */

  if (atomstyle == 0) {
    fprintf(stderr,"ERROR: must use -style to set atom style\n");
    exit(1);
  }

  /* defaults */

  natoms = nbonds = nangles = ndihedrals = nimpropers = 0;
  ntypes = nbondtypes = nangletypes = ndihedtypes = nimprotypes = 0;

  /* read header */

  fgets(line,MAXLINE,stdin);

  while (1) {
    fgets(line,MAXLINE,stdin);

    if (strspn(line," \t\n\r") == strlen(line)) continue;
    else if (strstr(line,"atoms")) sscanf(line,"%d",&natoms);
    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,"atom types")) sscanf(line,"%d",&ntypes);
    else if (strstr(line,"bond types")) sscanf(line,"%d",&nbondtypes);
    else if (strstr(line,"angle types")) sscanf(line,"%d",&nangletypes);
    else if (strstr(line,"dihedral types")) sscanf(line,"%d",&ndihedtypes);
    else if (strstr(line,"improper types")) sscanf(line,"%d",&nimprotypes);
    else if (strstr(line,"xlo xhi")) sscanf(line,"%lg %lg",&in.xlo,&in.xhi);
    else if (strstr(line,"ylo yhi")) sscanf(line,"%lg %lg",&in.ylo,&in.yhi);
    else if (strstr(line,"zlo zhi")) sscanf(line,"%lg %lg",&in.zlo,&in.zhi);
    else break;
  }

  /* compute input box size */

  in.xsize = in.xhi - in.xlo;
  in.ysize = in.yhi - in.ylo;
  in.zsize = in.zhi - in.zlo;

  /* write XMOVIE header */

  printf("ITEM: TIMESTEP\n");
  printf("%d\n",0);
  printf("ITEM: NUMBER OF ATOMS\n");
  printf("%d\n",natoms);
  printf("ITEM: BOX BOUNDS\n");
  if (outbox) {
    printf("%g %g\n",out.xlo,out.xhi);
    printf("%g %g\n",out.ylo,out.yhi);
    printf("%g %g\n",out.zlo,out.zhi);
  } else {
    printf("%g %g\n",in.xlo,in.xhi);
    printf("%g %g\n",in.ylo,in.yhi);
    printf("%g %g\n",in.zlo,in.zhi);
  }

  /* 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")) {

      printf("ITEM: ATOMS\n");

      int tag,type,molecule,imagex,imagey,imagez;
      double x,y,z,radius,density,q;

      for (i = 0; i < natoms; i++) {
	fgets(line,MAXLINE,stdin);
	if (unmap) {
	  if (atomstyle == ATOMIC) 
	    sscanf(line,"%d %d %lg %lg %lg %d %d %d",
		   &tag,&type,&x,&y,&z,
		   &imagex,&imagey,&imagez);
	  else if (atomstyle == BOND) 
	    sscanf(line,"%d %d %d %lg %lg %lg %d %d %d",
		   &tag,&molecule,&type,&x,&y,&z,
		   &imagex,&imagey,&imagez);
	  else if (atomstyle == ANGLE) 
	    sscanf(line,"%d %d %d %lg %lg %lg %d %d %d",
		   &tag,&molecule,&type,&x,&y,&z,
		   &imagex,&imagey,&imagez);
	  else if (atomstyle == FULL) 
	    sscanf(line,"%d %d %d %lg %lg %lg %lg %d %d %d",
		   &tag,&molecule,&type,&q,&x,&y,&z,
		   &imagex,&imagey,&imagez);
	  else if (atomstyle == EAM) 
	    sscanf(line,"%d %d %lg %lg %lg %d %d %d",
		   &tag,&type,&x,&y,&z,
		   &imagex,&imagey,&imagez);
	  else if (atomstyle == GRANULAR) 
	    sscanf(line,"%d %d %lg %lg %lg %lg %lg %d %d %d",
		   &tag,&type,&radius,&density,&x,&y,&z,
		   &imagex,&imagey,&imagez);
	} else {
	  if (atomstyle == ATOMIC) 
	    sscanf(line,"%d %d %lg %lg %lg",
		   &tag,&type,&x,&y,&z);
	  else if (atomstyle == BOND) 
	    sscanf(line,"%d %d %d %lg %lg %lg",
		   &tag,&molecule,&type,&x,&y,&z);
	  else if (atomstyle == ANGLE) 
	    sscanf(line,"%d %d %d %lg %lg %lg",
		   &tag,&molecule,&type,&x,&y,&z);
	  else if (atomstyle == FULL) 
	    sscanf(line,"%d %d %d %lg %lg %lg %lg",
		   &tag,&molecule,&type,&q,&x,&y,&z);
	  else if (atomstyle == EAM) 
	    sscanf(line,"%d %d %lg %lg %lg",
		   &tag,&type,&x,&y,&z);
	  else if (atomstyle == GRANULAR) 
	    sscanf(line,"%d %d %lg %lg %lg %lg %lg",
		   &tag,&type,&radius,&density,&x,&y,&z);
	  imagez = imagey = imagex = 0;
	}

	/* unmap atom position if requested */

	if (unmap) {
	  x = x + imagex*in.xsize;
	  y = y + imagey*in.ysize;
	  z = z + imagez*in.zsize;
	}

	printf("%d %d %g %g %g\n",tag,type,x,y,z);
      }
    }
      
    /* read bonds and replicate */

    else if (!strcmp(token,"Bonds")) {

      printf("ITEM: BONDS\n");

      int n,btype,bond1,bond2;

      for (i = 0; i < nbonds; i++) {
	fgets(line,MAXLINE,stdin);
	sscanf(line,"%d %d %d %d",&n,&btype,&bond1,&bond2);
	printf("%d %d %d\n",btype,bond1,bond2);
      }
    }
    
	/* non-replicated sections - just skip lines */

    else if (!strcmp(token,"Velocities"))
      skipline(natoms);
    else if (!strcmp(token,"Angles"))
      skipline(nangles);
    else if (!strcmp(token,"Dihedrals"))
      skipline(ndihedrals);
    else if (!strcmp(token,"Impropers"))
      skipline(nimpropers);
    else if (!strcmp(token,"Masses"))
      skipline(ntypes);
    else if (!strcmp(token,"Dipoles"))
      skipline(ntypes);
    else if (!strcmp(token,"Pair Coeffs"))
      skipline(ntypes);
    else if (!strcmp(token,"Bond Coeffs"))
      skipline(nbondtypes);
    else if (!strcmp(token,"Angle Coeffs"))
      skipline(nangletypes);
    else if (!strcmp(token,"Dihedral Coeffs"))
      skipline(ndihedtypes);
    else if (!strcmp(token,"Improper Coeffs"))
      skipline(nimprotypes);
    else if (!strcmp(token,"BondBond Coeffs"))
      skipline(nangletypes);
    else if (!strcmp(token,"BondAngle Coeffs"))
      skipline(nangletypes);
    else if (!strcmp(token,"MiddleBondTorsion Coeffs"))
      skipline(ndihedtypes);
    else if (!strcmp(token,"EndBondTorsion Coeffs"))
      skipline(ndihedtypes);
    else if (!strcmp(token,"AngleTorsion Coeffs"))
      skipline(ndihedtypes);
    else if (!strcmp(token,"AngleAngleTorsion Coeffs"))
      skipline(ndihedtypes);
    else if (!strcmp(token,"BondBond13 Coeffs"))
      skipline(ndihedtypes);
    else if (!strcmp(token,"AngleAngle Coeffs"))
      skipline(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';

  /* return ptr to keyword */

  return &line[start];
}

/* read n lines and ignore */

void skipline(int n)
{
  char line[1000];

  while (n) {
    fgets(line,MAXLINE,stdin);
    n--;
  }
}

tools/lmp2vmd/README.txt

deleted100644 → 0
+0 −80
Original line number Diff line number Diff line
This directory  used    to contain utility  scripts  for   using  VMD to
visualize and analyze LAMMPS  trajectories. As of  April 2010 all of the
scripts and many additional features have been merged into the topotools
plugin that is bundled with VMD. Updates between VMD releases are here:
http://sites.google.com/site/akohlmey/software/topotools
This page also contains detailed documentation and some tutorials.

These scripts within VMD and the plugin for native LAMMPS dump files are
are  maintained  by Axel Kohlmeyer <akohlmey@gmail.com>;  please contact
him through the LAMMPS mailing list in case of problems.

Below are a few comments on support for LAMMPS in VMD.

-------------------------

1. File formats and VMD limitations

   VMD currently supports reading several but not all file formats
   that LAMMPS can generate. Supported are: atom (text mode), custom
   (text mode, only some fields are directly supported, please see
   below for more details), dcd, xyz and xtc.  Cfg and binary native
   dump files are not supported (06/2012). The new molfile dump style
   in addition allows to use VMD molfile plugins to write dumps in
   any format that is supported by VMD.

   However VMD requires all frames of a file to have the same number of
   atoms.  If the number of atoms changes between two frames,  the file
   reader will stop. The topotools plugin has a special scripted file
   reader for .xyz files that can generate the necessary padding so that
   the file can still be read into VMD.  Whether an atom is real or 
   "invisible" is then flagged in the "user" field.  For efficiency
   reasons this script will not preserve atom identity between frames.

2. Topology files, a.k.a. as "data" files

   The topotools plugin also contains a read and write option for LAMMPS
   data files. This reader will try to preserve as much information as 
   possible and will also store useful information as comments upon
   writing. It does not store or read coefficient data.  In combination
   with other functionality in topotools complete topologies for rather
   complicated systems for LAMMPS can be build with VMD scripting.

3. Reading custom data fields into VMD

   At this moment VMD only supports reading coordinates and velocities
   (if present) as per timestep data. Everthing else is just taken
   from the first frame or whatever file was used to generate this
   structure information.  Through setting the environment variable
   LAMMPSREMAPFIELDS, custom properties can be mapped to the x, y, z,
   vx, vy, vz data fields and then accessed from within VMD. For
   example to store radius and charge of a particle in the vx and vy
   fields, respectively set this variable to "vx=radius,vy=q".  Future
   versions of VMD will allow more flexibility.

4. Recovering information about elements

   Colorization in VMD is by default based on atom names, yet LAMMPS
   requires identification of atoms by consecutive numbers starting at
   1. With the option of reading a LAMMPS data file, additional
   information is provided that can help to recover some of this
   data. 'topo guessatom element mass' will guess the atom's element
   name from it mass (with fuzz, where possible).

5. Reading files from the command line

   Converting a LAMMPS data file to a .psf file can be very convenient
   for loading trajectories from the command line. This conversion is
   done with

   topo readlammpsdata data.rhodo full
   animate write psf rhodo.psf

   In the future you can now load this PSF file first and then the
   LAMMPS dump file(s) (or a more compact and faster loading DCD or
   XTC file) with:

     vmd micelle.psf -lammpstrj dump.micelle

   Note how the -lammpstrj flag will tell VMD that dump.micelle is a
   lammps trajectory file.