lammps/src/write_coeff.cpp

114 lines
3.4 KiB
C++

/* ----------------------------------------------------------------------
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
http://lammps.sandia.gov, Sandia National Laboratories
Steve Plimpton, sjplimp@sandia.gov
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.
------------------------------------------------------------------------- */
#include <string.h>
#include <unistd.h>
#include "write_coeff.h"
#include "pair.h"
#include "bond.h"
#include "angle.h"
#include "dihedral.h"
#include "improper.h"
#include "comm.h"
#include "force.h"
#include "universe.h"
#include "error.h"
using namespace LAMMPS_NS;
/* ----------------------------------------------------------------------
called as write_coeff command in input script
------------------------------------------------------------------------- */
void WriteCoeff::command(int narg, char **arg)
{
if (domain->box_exist == 0)
error->all(FLERR,"Write_coeff command before simulation box is defined");
if (narg != 1) error->all(FLERR,"Illegal write_coeff command");
int n = strlen(arg[0]) + 5;
char *file = new char[n];
strcpy(file,"tmp.");
strcat(file,arg[0]);
// initialize relevant styles
force->init();
if (comm->me == 0) {
char str[256], coeff[256];
FILE *one = fopen(file,"wb+");
if (one == NULL) {
sprintf(str,"Cannot open coeff file %s",file);
error->one(FLERR,str);
}
if (force->pair && force->pair->writedata) {
fprintf(one,"# pair_style %s\npair_coeff\n",force->pair_style);
force->pair->write_data_all(one);
fprintf(one,"end\n");
}
if (force->bond && force->bond->writedata) {
fprintf(one,"# bond_style %s\nbond_coeff\n",force->bond_style);
force->bond->write_data(one);
fprintf(one,"end\n");
}
if (force->angle && force->angle->writedata) {
fprintf(one,"# angle_style %s\nangle_coeff\n",force->angle_style);
force->angle->write_data(one);
fprintf(one,"end\n");
}
if (force->dihedral && force->dihedral->writedata) {
fprintf(one,"# dihedral_style %s\ndihedral_coeff\n",
force->dihedral_style);
force->dihedral->write_data(one);
fprintf(one,"end\n");
}
if (force->improper && force->improper->writedata) {
fprintf(one,"# improper_style %s\nimproper_coeff\n",
force->improper_style);
force->improper->write_data(one);
fprintf(one,"end\n");
}
rewind(one);
FILE *two = fopen(file+4,"w");
if (two == NULL) {
sprintf(str,"Cannot open coeff file %s",file+4);
error->one(FLERR,str);
}
fprintf(two,"# LAMMPS coeff file via write_coeff, version %s\n",
universe->version);
while(1) {
if (fgets(str,256,one) == NULL) break;
fputs(str,two); // style
fgets(str,256,one); // coeff
n = strlen(str);
strcpy(coeff,str);
coeff[n-1] = '\0';
fgets(str,256,one);
while (strcmp(str,"end\n") != 0) {
fprintf(two,"%s %s",coeff,str);
fgets(str,256,one);
}
fputc('\n',two);
}
fclose(one);
fclose(two);
unlink(file);
}
delete [] file;
}