From 737e5e6c3dfd680216f8e6bbdeb7c3c2acddba74 Mon Sep 17 00:00:00 2001 From: sjplimp Date: Fri, 28 Jun 2013 16:55:37 +0000 Subject: [PATCH] git-svn-id: svn://svn.icms.temple.edu/lammps-ro/trunk@10150 f3b2605a-c512-4ea7-a41b-209d697bcdaa --- src/MANYBODY/pair_adp.cpp | 2 +- src/MANYBODY/pair_airebo.cpp | 2 +- src/MANYBODY/pair_bop.cpp | 8 +- src/MANYBODY/pair_comb.cpp | 2 +- src/MANYBODY/pair_eam.cpp | 2 +- src/MANYBODY/pair_eam_alloy.cpp | 2 +- src/MANYBODY/pair_eam_fs.cpp | 2 +- src/MANYBODY/pair_eim.cpp | 2 +- src/MANYBODY/pair_lcbop.cpp | 2 +- src/MANYBODY/pair_sw.cpp | 2 +- src/MANYBODY/pair_tersoff.cpp | 2 +- src/MANYBODY/pair_tersoff_zbl.cpp | 2 +- src/USER-MISC/pair_cdeam.cpp | 2 +- src/USER-MISC/pair_edip.cpp | 2 +- src/USER-MISC/pair_meam_spline.cpp | 2 +- src/USER-MISC/pair_meam_sw_spline.cpp | 2 +- src/USER-MISC/pair_tersoff_table.cpp | 2 +- src/USER-OMP/pair_eam_alloy_omp.cpp | 2 +- src/USER-OMP/pair_eam_fs_omp.cpp | 2 +- src/USER-OMP/pair_tersoff_zbl_omp.cpp | 2 +- src/pair.cpp | 131 ++++++++++++++++++++++++++ src/pair.h | 5 + 22 files changed, 159 insertions(+), 23 deletions(-) diff --git a/src/MANYBODY/pair_adp.cpp b/src/MANYBODY/pair_adp.cpp index 4939965528..c9b290a0a6 100644 --- a/src/MANYBODY/pair_adp.cpp +++ b/src/MANYBODY/pair_adp.cpp @@ -545,7 +545,7 @@ void PairADP::read_file(char *filename) char line[MAXLINE]; if (me == 0) { - fp = fopen(filename,"r"); + fp = open_potential(filename); if (fp == NULL) { char str[128]; sprintf(str,"Cannot open ADP potential file %s",filename); diff --git a/src/MANYBODY/pair_airebo.cpp b/src/MANYBODY/pair_airebo.cpp index 8665b736a9..fa01ac15ac 100644 --- a/src/MANYBODY/pair_airebo.cpp +++ b/src/MANYBODY/pair_airebo.cpp @@ -3333,7 +3333,7 @@ void PairAIREBO::read_file(char *filename) // read file on proc 0 if (me == 0) { - FILE *fp = fopen(filename,"r"); + FILE *fp = open_potential(filename); if (fp == NULL) { char str[128]; sprintf(str,"Cannot open AIREBO potential file %s",filename); diff --git a/src/MANYBODY/pair_bop.cpp b/src/MANYBODY/pair_bop.cpp index 3410e6c3f2..f298f431c9 100644 --- a/src/MANYBODY/pair_bop.cpp +++ b/src/MANYBODY/pair_bop.cpp @@ -8210,7 +8210,7 @@ void PairBOP::read_file(char *filename) rcore=0.1; if (me == 0) { - FILE *fp = fopen(filename,"r"); + FILE *fp = open_potential(filename); if (fp == NULL) { char str[128]; sprintf(str,"Cannot open BOP potential file %s",filename); @@ -8270,7 +8270,7 @@ void PairBOP::read_file(char *filename) if (me == 0) { words = new char*[bop_types]; for(i=0;ime == 0) { - fp = fopen(file,"r"); + fp = open_potential(file); if (fp == NULL) { char str[128]; sprintf(str,"Cannot open COMB potential file %s",file); diff --git a/src/MANYBODY/pair_eam.cpp b/src/MANYBODY/pair_eam.cpp index 629620101e..b9d21423c8 100644 --- a/src/MANYBODY/pair_eam.cpp +++ b/src/MANYBODY/pair_eam.cpp @@ -439,7 +439,7 @@ void PairEAM::read_file(char *filename) char line[MAXLINE]; if (me == 0) { - fptr = fopen(filename,"r"); + fptr = open_potential(filename); if (fptr == NULL) { char str[128]; sprintf(str,"Cannot open EAM potential file %s",filename); diff --git a/src/MANYBODY/pair_eam_alloy.cpp b/src/MANYBODY/pair_eam_alloy.cpp index 6e46f6edb9..c8abf116a0 100644 --- a/src/MANYBODY/pair_eam_alloy.cpp +++ b/src/MANYBODY/pair_eam_alloy.cpp @@ -122,7 +122,7 @@ void PairEAMAlloy::read_file(char *filename) char line[MAXLINE]; if (me == 0) { - fptr = fopen(filename,"r"); + fptr = open_potential(filename); if (fptr == NULL) { char str[128]; sprintf(str,"Cannot open EAM potential file %s",filename); diff --git a/src/MANYBODY/pair_eam_fs.cpp b/src/MANYBODY/pair_eam_fs.cpp index 80f4239928..0d6fc2110f 100644 --- a/src/MANYBODY/pair_eam_fs.cpp +++ b/src/MANYBODY/pair_eam_fs.cpp @@ -122,7 +122,7 @@ void PairEAMFS::read_file(char *filename) char line[MAXLINE]; if (me == 0) { - fptr = fopen(filename,"r"); + fptr = open_potential(filename); if (fptr == NULL) { char str[128]; sprintf(str,"Cannot open EAM potential file %s",filename); diff --git a/src/MANYBODY/pair_eim.cpp b/src/MANYBODY/pair_eim.cpp index f4f3fcc653..f271bb0030 100644 --- a/src/MANYBODY/pair_eim.cpp +++ b/src/MANYBODY/pair_eim.cpp @@ -457,7 +457,7 @@ void PairEIM::read_file(char *filename) FILE *fptr; if (me == 0) { - fptr = fopen(filename,"r"); + fptr = open_potential(filename); if (fptr == NULL) { char str[128]; sprintf(str,"Cannot open EIM potential file %s",filename); diff --git a/src/MANYBODY/pair_lcbop.cpp b/src/MANYBODY/pair_lcbop.cpp index 06f04b1f2f..5e7c6974c2 100644 --- a/src/MANYBODY/pair_lcbop.cpp +++ b/src/MANYBODY/pair_lcbop.cpp @@ -984,7 +984,7 @@ void PairLCBOP::read_file(char *filename) // read file on proc 0 if (me == 0) { - FILE *fp = fopen(filename,"r"); + FILE *fp = open_potential(filename); if (fp == NULL) { char str[128]; sprintf(str,"Cannot open LCBOP potential file %s",filename); diff --git a/src/MANYBODY/pair_sw.cpp b/src/MANYBODY/pair_sw.cpp index 5efc5b7c64..d3cc168389 100755 --- a/src/MANYBODY/pair_sw.cpp +++ b/src/MANYBODY/pair_sw.cpp @@ -336,7 +336,7 @@ void PairSW::read_file(char *file) FILE *fp; if (comm->me == 0) { - fp = fopen(file,"r"); + fp = open_potential(file); if (fp == NULL) { char str[128]; sprintf(str,"Cannot open Stillinger-Weber potential file %s",file); diff --git a/src/MANYBODY/pair_tersoff.cpp b/src/MANYBODY/pair_tersoff.cpp index 9e90a8902b..fbbe857f09 100755 --- a/src/MANYBODY/pair_tersoff.cpp +++ b/src/MANYBODY/pair_tersoff.cpp @@ -376,7 +376,7 @@ void PairTersoff::read_file(char *file) FILE *fp; if (comm->me == 0) { - fp = fopen(file,"r"); + fp = open_potential(file); if (fp == NULL) { char str[128]; sprintf(str,"Cannot open Tersoff potential file %s",file); diff --git a/src/MANYBODY/pair_tersoff_zbl.cpp b/src/MANYBODY/pair_tersoff_zbl.cpp index 67633525e8..a8ca030d89 100644 --- a/src/MANYBODY/pair_tersoff_zbl.cpp +++ b/src/MANYBODY/pair_tersoff_zbl.cpp @@ -74,7 +74,7 @@ void PairTersoffZBL::read_file(char *file) FILE *fp; if (comm->me == 0) { - fp = fopen(file,"r"); + fp = open_potential(file); if (fp == NULL) { char str[128]; sprintf(str,"Cannot open Tersoff potential file %s",file); diff --git a/src/USER-MISC/pair_cdeam.cpp b/src/USER-MISC/pair_cdeam.cpp index 9d3a3cb084..5edab54d89 100644 --- a/src/USER-MISC/pair_cdeam.cpp +++ b/src/USER-MISC/pair_cdeam.cpp @@ -461,7 +461,7 @@ void PairCDEAM::read_h_coeff(char *filename) FILE *fp; char line[MAXLINE]; char nextline[MAXLINE]; - fp = fopen(filename,"r"); + fp = open_potential(filename); if (fp == NULL) { char str[128]; sprintf(str,"Cannot open EAM potential file %s", filename); diff --git a/src/USER-MISC/pair_edip.cpp b/src/USER-MISC/pair_edip.cpp index bc0d75adfd..a9938f409a 100755 --- a/src/USER-MISC/pair_edip.cpp +++ b/src/USER-MISC/pair_edip.cpp @@ -879,7 +879,7 @@ void PairEDIP::read_file(char *file) FILE *fp; if (comm->me == 0) { - fp = fopen(file,"r"); + fp = open_potential(file); if (fp == NULL) { char str[128]; sprintf(str,"Cannot open EDIP potential file %s",file); diff --git a/src/USER-MISC/pair_meam_spline.cpp b/src/USER-MISC/pair_meam_spline.cpp index 1684bed227..c0260ab6f2 100644 --- a/src/USER-MISC/pair_meam_spline.cpp +++ b/src/USER-MISC/pair_meam_spline.cpp @@ -434,7 +434,7 @@ void PairMEAMSpline::coeff(int narg, char **arg) void PairMEAMSpline::read_file(const char* filename) { if(comm->me == 0) { - FILE *fp = fopen(filename, "r"); + FILE *fp = open_potential(filename); if(fp == NULL) { char str[1024]; sprintf(str,"Cannot open spline MEAM potential file %s", filename); diff --git a/src/USER-MISC/pair_meam_sw_spline.cpp b/src/USER-MISC/pair_meam_sw_spline.cpp index d0385ab010..fe13170e2d 100644 --- a/src/USER-MISC/pair_meam_sw_spline.cpp +++ b/src/USER-MISC/pair_meam_sw_spline.cpp @@ -463,7 +463,7 @@ void PairMEAMSWSpline::coeff(int narg, char **arg) void PairMEAMSWSpline::read_file(const char* filename) { if(comm->me == 0) { - FILE *fp = fopen(filename, "r"); + FILE *fp = open_potential(filename); if(fp == NULL) { char str[1024]; sprintf(str,"Cannot open spline MEAM potential file %s", filename); diff --git a/src/USER-MISC/pair_tersoff_table.cpp b/src/USER-MISC/pair_tersoff_table.cpp index f9940d8d86..a0dd0fcb04 100644 --- a/src/USER-MISC/pair_tersoff_table.cpp +++ b/src/USER-MISC/pair_tersoff_table.cpp @@ -857,7 +857,7 @@ void PairTersoffTable::read_file(char *file) FILE *fp; if (comm->me == 0) { - fp = fopen(file,"r"); + fp = open_potential(file); if (fp == NULL) { char str[128]; sprintf(str,"Cannot open Tersoff potential file %s",file); diff --git a/src/USER-OMP/pair_eam_alloy_omp.cpp b/src/USER-OMP/pair_eam_alloy_omp.cpp index 3dff868b6a..d2aa9b855f 100644 --- a/src/USER-OMP/pair_eam_alloy_omp.cpp +++ b/src/USER-OMP/pair_eam_alloy_omp.cpp @@ -121,7 +121,7 @@ void PairEAMAlloyOMP::read_file(char *filename) char line[MAXLINE]; if (me == 0) { - fptr = fopen(filename,"r"); + fptr = open_potential(filename); if (fptr == NULL) { char str[128]; sprintf(str,"Cannot open EAM potential file %s",filename); diff --git a/src/USER-OMP/pair_eam_fs_omp.cpp b/src/USER-OMP/pair_eam_fs_omp.cpp index 84101913c5..63b990d650 100644 --- a/src/USER-OMP/pair_eam_fs_omp.cpp +++ b/src/USER-OMP/pair_eam_fs_omp.cpp @@ -121,7 +121,7 @@ void PairEAMFSOMP::read_file(char *filename) char line[MAXLINE]; if (me == 0) { - fptr = fopen(filename,"r"); + fptr = open_potential(filename); if (fptr == NULL) { char str[128]; sprintf(str,"Cannot open EAM potential file %s",filename); diff --git a/src/USER-OMP/pair_tersoff_zbl_omp.cpp b/src/USER-OMP/pair_tersoff_zbl_omp.cpp index 9c0f397118..35922c49aa 100644 --- a/src/USER-OMP/pair_tersoff_zbl_omp.cpp +++ b/src/USER-OMP/pair_tersoff_zbl_omp.cpp @@ -94,7 +94,7 @@ void PairTersoffZBLOMP::read_file(char *file) FILE *fp; if (comm->me == 0) { - fp = fopen(file,"r"); + fp = open_potential(file); if (fp == NULL) { char str[128]; sprintf(str,"Cannot open Tersoff potential file %s",file); diff --git a/src/pair.cpp b/src/pair.cpp index 5efa8dd602..bf30fd7dc4 100644 --- a/src/pair.cpp +++ b/src/pair.cpp @@ -16,6 +16,7 @@ ------------------------------------------------------------------------- */ #include "mpi.h" +#include "ctype.h" #include "float.h" #include "limits.h" #include "math.h" @@ -1613,6 +1614,71 @@ void Pair::init_bitmap(double inner, double outer, int ntablebits, masklo = rsq_lookup.i & ~(nmask); } +/* ---------------------------------------------------------------------- + open a potential file as specified + failing that, search in dir specified by env variable LAMMPS_POTENTIALS +------------------------------------------------------------------------- */ + +FILE *Pair::open_potential(const char *name) +{ + FILE *fp; + + // attempt to open file directly + // if successful, return ptr + + fp = fopen(name,"r"); + if (fp) return fp; + + // try the environment variable directory + + const char *path = getenv("LAMMPS_POTENTIALS"); + if (path == NULL) return NULL; + + const char *pot = potname(name); + size_t len1 = strlen(path); + size_t len2 = strlen(pot); + + char *newpath = new char[len1+len2]; + strcpy(newpath,path); +#if defined(_WIN32) + newpath[len1] = '\\'; + newpath[len1+1] = 0; +#else + newpath[len1] = '/'; + newpath[len1+1] = 0; +#endif + strcat(newpath,pot); + + fp = fopen(newpath,"r"); + delete[] newpath; + return fp; +} + +/* ---------------------------------------------------------------------- + strip off leading part of path, return just the filename +------------------------------------------------------------------------- */ + +const char *Pair::potname(const char *path) +{ + const char *pot; + +#if defined(_WIN32) + // skip over the disk drive part of windows pathnames + if (isalpha(path[0]) && path[1] == ':') + path += 2; +#endif + + for (pot = path; *path != '\0'; ++path) { +#if defined(_WIN32) + if ((*path == '\\') || (*path == '/')) pot = path + 1; +#else + if (*path == '/') pot = path + 1; +#endif + } + + return pot; +} + /* ---------------------------------------------------------------------- */ double Pair::memory_usage() @@ -1621,3 +1687,68 @@ double Pair::memory_usage() bytes += comm->nthreads*maxvatom*6 * sizeof(double); return bytes; } + +/* ---------------------------------------------------------------------- */ + +// helper function to strip off leading part of the path +#include + +static const char *potname(const char *path) +{ + const char *pot; + +#if defined(_WIN32) + /* Skip over the disk drive part in windows pathnames */ + if (isalpha(path[0]) && path[1] == ':') + path += 2; +#endif + + for (pot = path; *path != NULL; ++path) { +#if defined(_WIN32) + if ((*path == '\\') || (*path == '/')) + pot = path + 1; +#else + if (*path == '/') + pot = path + 1; +#endif + } + + return pot; +} + +/* this subroutine will try to fopen(3) a potential file in the provided + path, but failing that, it will search in a directory pointed to by + the environment variable LAMMPS_POTENTIALS */ + +FILE *LAMMPS_NS::open_potential(const char *name) +{ + FILE *fp; + + // try to open file directly and return pointer, if successful. + fp = fopen(name,"r"); + if (fp) return fp; + + // direct open failed, now try the directory from the environment. + const char *path = getenv("LAMMPS_POTENTIALS"); + if (path == NULL) return NULL; + + const char *pot = potname(name); + size_t len1 = strlen(path); + size_t len2 = strlen(pot); + + char *newpath = new char[len1+len2]; + strcpy(newpath,path); +#if defined(_WIN32) + newpath[len1] = '\\'; + newpath[len1+1] = 0; +#else + newpath[len1] = '/'; + newpath[len1+1] = 0; +#endif + strcat(newpath,pot); + + // now try new path. + fp = fopen(newpath,"r"); + delete[] newpath; + return fp; +} diff --git a/src/pair.h b/src/pair.h index 89e3c4e365..88b6cf6e64 100644 --- a/src/pair.h +++ b/src/pair.h @@ -208,11 +208,16 @@ class Pair : protected Pointers { double, double, double, double, double, double); void virial_fdotr_compute(); + FILE *open_potential(const char *); + const char *potname(const char *); + inline int sbmask(int j) { return j >> SBBITS & 3; } }; +// fopen wrapper that also looks in $LAMMPS_POTENTIALS for potential files +FILE *open_potential(const char *); } #endif