forked from lijiext/lammps
123 lines
3.1 KiB
C++
123 lines
3.1 KiB
C++
|
/* -----------------------------------------------------------------------
|
||
|
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
|
||
|
www.cs.sandia.gov/~sjplimp/lammps.html
|
||
|
Steve Plimpton, sjplimp@sandia.gov, Sandia National Laboratories
|
||
|
|
||
|
Copyright (2003) Sandia Corporation. Under the terms of Contract
|
||
|
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
|
||
|
certain rights in this software. This software is distributed under
|
||
|
the GNU General Public License.
|
||
|
|
||
|
See the README file in the top-level LAMMPS directory.
|
||
|
------------------------------------------------------------------------ */
|
||
|
|
||
|
// Convert one or more LAMMPS binary dump files to ASCII text files
|
||
|
//
|
||
|
// this serial code must be compiled on a platform that can read the binary
|
||
|
// dump files since binary formats are not compatible across all platforms
|
||
|
//
|
||
|
// Syntax: binary2txt file1 file2 ...
|
||
|
// Creates: file1.txt file2.txt ...
|
||
|
|
||
|
#include "stdio.h"
|
||
|
#include "stdlib.h"
|
||
|
#include "string.h"
|
||
|
|
||
|
main(int narg, char **arg)
|
||
|
{
|
||
|
int i,j,k,m,n;
|
||
|
int ntimestep,natoms,size_one,nchunk;
|
||
|
double xlo,xhi,ylo,yhi,zlo,zhi;
|
||
|
int maxbuf = 0;
|
||
|
double *buf = NULL;
|
||
|
|
||
|
if (narg == 1) {
|
||
|
printf("Syntax: binary2txt file1 file2 ...\n");
|
||
|
exit(1);
|
||
|
}
|
||
|
|
||
|
// loop over files
|
||
|
|
||
|
for (int iarg = 1; iarg < narg; iarg++) {
|
||
|
printf("%s:",arg[iarg]);
|
||
|
fflush(stdout);
|
||
|
FILE *fp = fopen(arg[iarg],"rb");
|
||
|
if (!fp) {
|
||
|
printf("ERROR: Could not open %s\n",arg[iarg]);
|
||
|
exit(1);
|
||
|
}
|
||
|
|
||
|
n = strlen(arg[iarg]) + 1 + 4;
|
||
|
char *filetxt = new char[n];
|
||
|
strcpy(filetxt,arg[iarg]);
|
||
|
strcat(filetxt,".txt");
|
||
|
FILE *fptxt = fopen(filetxt,"w");
|
||
|
delete [] filetxt;
|
||
|
|
||
|
// loop over snapshots in file
|
||
|
|
||
|
while (1) {
|
||
|
|
||
|
fread(&ntimestep,sizeof(int),1,fp);
|
||
|
|
||
|
// detect end-of-file
|
||
|
|
||
|
if (feof(fp)) {
|
||
|
fclose(fp);
|
||
|
fclose(fptxt);
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
fread(&natoms,sizeof(int),1,fp);
|
||
|
fread(&xlo,sizeof(double),1,fp);
|
||
|
fread(&xhi,sizeof(double),1,fp);
|
||
|
fread(&ylo,sizeof(double),1,fp);
|
||
|
fread(&yhi,sizeof(double),1,fp);
|
||
|
fread(&zlo,sizeof(double),1,fp);
|
||
|
fread(&zhi,sizeof(double),1,fp);
|
||
|
fread(&size_one,sizeof(int),1,fp);
|
||
|
fread(&nchunk,sizeof(int),1,fp);
|
||
|
|
||
|
fprintf(fptxt,"ITEM: TIMESTEP\n");
|
||
|
fprintf(fptxt,"%d\n",ntimestep);
|
||
|
fprintf(fptxt,"ITEM: NUMBER OF ATOMS\n");
|
||
|
fprintf(fptxt,"%d\n",natoms);
|
||
|
fprintf(fptxt,"ITEM: BOX BOUNDS\n");
|
||
|
fprintf(fptxt,"%g %g\n",xlo,xhi);
|
||
|
fprintf(fptxt,"%g %g\n",ylo,yhi);
|
||
|
fprintf(fptxt,"%g %g\n",zlo,zhi);
|
||
|
fprintf(fptxt,"ITEM: ATOMS\n");
|
||
|
|
||
|
// loop over processor chunks in file
|
||
|
|
||
|
for (i = 0; i < nchunk; i++) {
|
||
|
fread(&n,sizeof(int),1,fp);
|
||
|
|
||
|
// extend buffer to fit chunk size
|
||
|
|
||
|
if (n > maxbuf) {
|
||
|
if (buf) delete [] buf;
|
||
|
buf = new double[n];
|
||
|
maxbuf = n;
|
||
|
}
|
||
|
|
||
|
// read chunk and write as size_one values per line
|
||
|
|
||
|
fread(buf,sizeof(double),n,fp);
|
||
|
n /= size_one;
|
||
|
m = 0;
|
||
|
for (j = 0; j < n; j++) {
|
||
|
for (k = 0; k < size_one; k++) fprintf(fptxt,"%g ",buf[m++]);
|
||
|
fprintf(fptxt,"\n");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
printf(" %d",ntimestep);
|
||
|
fflush(stdout);
|
||
|
}
|
||
|
printf("\n");
|
||
|
}
|
||
|
|
||
|
if (buf) delete [] buf;
|
||
|
}
|