diff --git a/src/USER-MEAMC/meam.h b/src/USER-MEAMC/meam.h index 3ef6bf8a42..8cf51c773f 100644 --- a/src/USER-MEAMC/meam.h +++ b/src/USER-MEAMC/meam.h @@ -9,6 +9,8 @@ extern "C" { double fm_exp(double); } +namespace LAMMPS_NS { + typedef enum { FCC, BCC, HCP, DIM, DIA, B1, C11, L12, B2 } lattice_t; typedef struct @@ -18,7 +20,12 @@ typedef struct } allocatable_double_2d; class MEAM { -private: + public: + MEAM() {}; + ~MEAM() { + meam_cleanup_(); + } + private: // cutforce = force cutoff // cutforcesq = force cutoff squared @@ -100,61 +107,46 @@ private: int nr, nrar; double dr, rdrar; -public: -void meam_checkindex(int, int, int, int*, int*); -void meam_setup_param_(int*, double*, int*, int*, int*); -void meam_dens_final_(int*, int*, int*, int*, int*, double*, double*, int*, int*, int*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, int*); -void G_gam(double, int, double, double*, int*); -void dG_gam(double, int, double, double*, double*); -void meam_dens_init_(int*, int*, int*, int*, int*, double*, int*, int*, int*, int*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, int*); -void getscreen(int, int, double*, double*, double*, double*, int, int*, int, int*, int, int*, int*); -void screen(int, int, int, double*, double, double*, int, int*, int, int*, int*); -void calc_rho1(int, int, int, int*, int*, double*, int, int*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*); -void dsij(int, int, int, int, int, int, double, double*, double*, int, int*, int*, double*, double*, double*); -void fcut(double, double*); -void dfcut(double, double*, double*); -void dCfunc(double, double, double, double*); -void dCfunc2(double, double, double, double*, double*); + public: + void meam_checkindex(int, int, int, int*, int*); + void meam_setup_param_(int*, double*, int*, int*, int*); + void meam_dens_final_(int*, int*, int*, int*, int*, double*, double*, int*, int*, int*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, int*); + void G_gam(double, int, double, double*, int*); + void dG_gam(double, int, double, double*, double*); + void meam_dens_init_(int*, int*, int*, int*, int*, double*, int*, int*, int*, int*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, int*); + void getscreen(int, int, double*, double*, double*, double*, int, int*, int, int*, int, int*, int*); + void screen(int, int, int, double*, double, double*, int, int*, int, int*, int*); + void calc_rho1(int, int, int, int*, int*, double*, int, int*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*); + void dsij(int, int, int, int, int, int, double, double*, double*, int, int*, int*, double*, double*, double*); + void fcut(double, double*); + void dfcut(double, double*, double*); + void dCfunc(double, double, double, double*); + void dCfunc2(double, double, double, double*, double*); -void meam_force_(int*, int*, int*, int*, int*, int*, double*, double*, int*, int*, int*, double*, int*, int*, int*, int*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, int*); -void meam_cleanup_(); -void meam_setup_done_(double*); -void alloyparams(); -void compute_pair_meam(); -double phi_meam(double, int, int); -void compute_reference_density(); -void get_shpfcn(double*, lattice_t); -void get_tavref(double*, double*, double*, double*, double*, double*, double, double, double, double, double, double, double, int, int, lattice_t); -void get_Zij(int*, lattice_t); -void get_Zij2(int*, double*, double*, lattice_t, double, double); -void get_sijk(double, int, int, int, double*); -void get_densref(double, int, int, double*, double*, double*, double*, double*, double*, double*, double*); -double zbl(double, int, int); -double erose(double, double, double, double, double, double, int); -void interpolate_meam(int); -double compute_phi(double, int, int); -void meam_setup_global_(int*, int*, double*, int*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, int*); + void meam_force_(int*, int*, int*, int*, int*, int*, double*, double*, int*, int*, int*, double*, int*, int*, int*, int*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, int*); + void meam_cleanup_(); + void meam_setup_done_(double*); + void alloyparams(); + void compute_pair_meam(); + double phi_meam(double, int, int); + void compute_reference_density(); + void get_shpfcn(double*, lattice_t); + void get_tavref(double*, double*, double*, double*, double*, double*, double, double, double, double, double, double, double, int, int, lattice_t); + void get_Zij(int*, lattice_t); + void get_Zij2(int*, double*, double*, lattice_t, double, double); + void get_sijk(double, int, int, int, double*); + void get_densref(double, int, int, double*, double*, double*, double*, double*, double*, double*, double*); + double zbl(double, int, int); + double erose(double, double, double, double, double, double, int); + void interpolate_meam(int); + double compute_phi(double, int, int); + void meam_setup_global_(int*, int*, double*, int*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, int*); }; // Functions we need for compat -#ifndef max -#define max(a, b) \ - ({ \ - __typeof__(a) _a = (a); \ - __typeof__(b) _b = (b); \ - _a > _b ? _a : _b; \ - }) -#endif - -#ifndef min -#define min(a, b) \ - ({ \ - __typeof__(a) _a = (a); \ - __typeof__(b) _b = (b); \ - _a < _b ? _a : _b; \ - }) -#endif +#define MIN(A,B) ((A) < (B) ? (A) : (B)) +#define MAX(A,B) ((A) > (B) ? (A) : (B)) #define iszero(f) (fabs(f) < 1e-20) @@ -215,5 +207,6 @@ Fortran Array Semantics in C. // access data with same index as used in fortran (1-based) #define arr2(arr, i, j) arr.ptr[(arr.dim1) * (j - 1) + (i - 1)] +}; -#endif \ No newline at end of file +#endif diff --git a/src/USER-MEAMC/meam_cleanup.cpp b/src/USER-MEAMC/meam_cleanup.cpp index b0ee013c4e..1b1dc45958 100644 --- a/src/USER-MEAMC/meam_cleanup.cpp +++ b/src/USER-MEAMC/meam_cleanup.cpp @@ -1,5 +1,7 @@ #include "meam.h" +using namespace LAMMPS_NS; + void MEAM::meam_cleanup_(void) { diff --git a/src/USER-MEAMC/meam_dens_final.cpp b/src/USER-MEAMC/meam_dens_final.cpp index 8a63fbd820..778787a062 100644 --- a/src/USER-MEAMC/meam_dens_final.cpp +++ b/src/USER-MEAMC/meam_dens_final.cpp @@ -1,6 +1,7 @@ #include "meam.h" #include +using namespace LAMMPS_NS; // Extern "C" declaration has the form: // // void meam_dens_final_(int *, int *, int *, int *, int *, double *, double *, diff --git a/src/USER-MEAMC/meam_dens_init.cpp b/src/USER-MEAMC/meam_dens_init.cpp index b94eec65cb..f03bc5a128 100644 --- a/src/USER-MEAMC/meam_dens_init.cpp +++ b/src/USER-MEAMC/meam_dens_init.cpp @@ -1,6 +1,7 @@ #include "meam.h" #include +using namespace LAMMPS_NS; // Extern "C" declaration has the form: // // void meam_dens_init_(int *, int *, int *, double *, int *, int *, int *, diff --git a/src/USER-MEAMC/meam_force.cpp b/src/USER-MEAMC/meam_force.cpp index 80e34c66d6..f5d4e75799 100644 --- a/src/USER-MEAMC/meam_force.cpp +++ b/src/USER-MEAMC/meam_force.cpp @@ -1,6 +1,7 @@ #include "meam.h" #include +using namespace LAMMPS_NS; // Extern "C" declaration has the form: // // void meam_force_(int *, int *, int *, double *, int *, int *, int *, double @@ -112,9 +113,9 @@ MEAM::meam_force_(int* iptr, int* nmax, int* eflag_either, int* eflag_global, ind = this->eltind[elti][eltj]; pp = rij * this->rdrar + 1.0; kk = (int)pp; - kk = min(kk, this->nrar - 1); + kk = MIN(kk, this->nrar - 1); pp = pp - kk; - pp = min(pp, 1.0); + pp = MIN(pp, 1.0); phi = ((arr2(this->phirar3, kk, ind) * pp + arr2(this->phirar2, kk, ind)) * pp + diff --git a/src/USER-MEAMC/meam_setup_done.cpp b/src/USER-MEAMC/meam_setup_done.cpp index b05e3824b5..bea6962de5 100644 --- a/src/USER-MEAMC/meam_setup_done.cpp +++ b/src/USER-MEAMC/meam_setup_done.cpp @@ -1,5 +1,6 @@ #include "meam.h" #include +using namespace LAMMPS_NS; // Declaration in pair_meam.h: // @@ -159,7 +160,7 @@ MEAM::alloyparams(void) for (k = 1; k <= this->neltypes; k++) { eb = (this->Cmax_meam[i][j][k] * this->Cmax_meam[i][j][k]) / (4.0 * (this->Cmax_meam[i][j][k] - 1.0)); - this->ebound_meam[i][j] = max(this->ebound_meam[i][j], eb); + this->ebound_meam[i][j] = MAX(this->ebound_meam[i][j], eb); } } } @@ -1041,9 +1042,9 @@ MEAM::compute_phi(double rij, int elti, int eltj) ind = this->eltind[elti][eltj]; pp = rij * this->rdrar + 1.0; kk = (int)pp; - kk = min(kk, this->nrar - 1); + kk = MIN(kk, this->nrar - 1); pp = pp - kk; - pp = min(pp, 1.0); + pp = MIN(pp, 1.0); double result = ((arr2(this->phirar3, kk, ind) * pp + arr2(this->phirar2, kk, ind)) * pp + diff --git a/src/USER-MEAMC/meam_setup_global.cpp b/src/USER-MEAMC/meam_setup_global.cpp index dba4f40d18..6d390e2e59 100644 --- a/src/USER-MEAMC/meam_setup_global.cpp +++ b/src/USER-MEAMC/meam_setup_global.cpp @@ -1,5 +1,6 @@ #include "meam.h" #include +using namespace LAMMPS_NS; // // declaration in pair_meam.h: diff --git a/src/USER-MEAMC/meam_setup_param.cpp b/src/USER-MEAMC/meam_setup_param.cpp index 7b8b5e2cef..a04e5f8183 100644 --- a/src/USER-MEAMC/meam_setup_param.cpp +++ b/src/USER-MEAMC/meam_setup_param.cpp @@ -1,4 +1,5 @@ #include "meam.h" +using namespace LAMMPS_NS; // // do a sanity check on index parameters @@ -148,8 +149,8 @@ MEAM::meam_setup_param_(int* which_p, double* value_p, int* nindex_p, meam_checkindex(2, maxelt, nindex, index, errorflag); if (*errorflag != 0) return; - i1 = min(index[0], index[1]); - i2 = max(index[0], index[1]); + i1 = MIN(index[0], index[1]); + i2 = MAX(index[0], index[1]); this->nn2_meam[i1][i2] = (int)value; break; @@ -217,8 +218,8 @@ MEAM::meam_setup_param_(int* which_p, double* value_p, int* nindex_p, meam_checkindex(2, maxelt, nindex, index, errorflag); if (*errorflag != 0) return; - i1 = min(index[0], index[1]); - i2 = max(index[0], index[1]); + i1 = MIN(index[0], index[1]); + i2 = MAX(index[0], index[1]); this->zbl_meam[i1][i2] = (int)value; break; diff --git a/src/USER-MEAMC/pair_meamc.cpp b/src/USER-MEAMC/pair_meamc.cpp index a92c9c6b50..94b0df7f7b 100644 --- a/src/USER-MEAMC/pair_meamc.cpp +++ b/src/USER-MEAMC/pair_meamc.cpp @@ -19,6 +19,7 @@ #include #include #include +#include "meam.h" #include "pair_meamc.h" #include "atom.h" #include "force.h" @@ -63,6 +64,7 @@ PairMEAMC::PairMEAMC(LAMMPS *lmp) : Pair(lmp) nelements = 0; elements = NULL; mass = NULL; + meam_inst = new MEAM; // set comm size needed by this Pair @@ -77,7 +79,7 @@ PairMEAMC::PairMEAMC(LAMMPS *lmp) : Pair(lmp) PairMEAMC::~PairMEAMC() { - meam_inst.meam_cleanup_(); + delete meam_inst; memory->destroy(rho); memory->destroy(rho0); @@ -236,7 +238,7 @@ void PairMEAMC::compute(int eflag, int vflag) for (ii = 0; ii < inum_half; ii++) { i = ilist_half[ii]; ifort = i+1; - meam_inst.meam_dens_init_(&ifort,&nmax,&ntype,type,fmap,&x[0][0], + meam_inst->meam_dens_init_(&ifort,&nmax,&ntype,type,fmap,&x[0][0], &numneigh_half[i],firstneigh_half[i], &numneigh_full[i],firstneigh_full[i], &scrfcn[offset],&dscrfcn[offset],&fcpair[offset], @@ -253,7 +255,7 @@ void PairMEAMC::compute(int eflag, int vflag) comm->reverse_comm_pair(this); - meam_inst.meam_dens_final_(&nlocal,&nmax,&eflag_either,&eflag_global,&eflag_atom, + meam_inst->meam_dens_final_(&nlocal,&nmax,&eflag_either,&eflag_global,&eflag_atom, &eng_vdwl,eatom,&ntype,type,fmap, &arho1[0][0],&arho2[0][0],arho2b,&arho3[0][0], &arho3b[0][0],&t_ave[0][0],&tsq_ave[0][0],gamma,dgamma1, @@ -278,7 +280,7 @@ void PairMEAMC::compute(int eflag, int vflag) for (ii = 0; ii < inum_half; ii++) { i = ilist_half[ii]; ifort = i+1; - meam_inst.meam_force_(&ifort,&nmax,&eflag_either,&eflag_global,&eflag_atom, + meam_inst->meam_force_(&ifort,&nmax,&eflag_either,&eflag_global,&eflag_atom, &vflag_atom,&eng_vdwl,eatom,&ntype,type,fmap,&x[0][0], &numneigh_half[i],firstneigh_half[i], &numneigh_full[i],firstneigh_full[i], @@ -367,7 +369,7 @@ void PairMEAMC::coeff(int narg, char **arg) // tell MEAM package that setup is done read_files(arg[2],arg[2+nelements+1]); - meam_inst.meam_setup_done_(&cutmax); + meam_inst->meam_setup_done_(&cutmax); // read args that map atom types to MEAM elements // map[i] = which element the Ith atom type is, -1 if not mapped @@ -599,7 +601,7 @@ void PairMEAMC::read_files(char *globalfile, char *userfile) // pass element parameters to MEAM package - meam_inst.meam_setup_global_(&nelements,lat,z,ielement,atwt,alpha,b0,b1,b2,b3, + meam_inst->meam_setup_global_(&nelements,lat,z,ielement,atwt,alpha,b0,b1,b2,b3, alat,esub,asub,t0,t1,t2,t3,rozero,ibar); // set element masses @@ -715,7 +717,7 @@ void PairMEAMC::read_files(char *globalfile, char *userfile) // pass single setting to MEAM package int errorflag = 0; - meam_inst.meam_setup_param_(&which,&value,&nindex,index,&errorflag); + meam_inst->meam_setup_param_(&which,&value,&nindex,index,&errorflag); if (errorflag) { char str[128]; sprintf(str,"MEAM library error %d",errorflag); diff --git a/src/USER-MEAMC/pair_meamc.h b/src/USER-MEAMC/pair_meamc.h index c9aee39364..e566f40a08 100644 --- a/src/USER-MEAMC/pair_meamc.h +++ b/src/USER-MEAMC/pair_meamc.h @@ -21,9 +21,9 @@ PairStyle(meam/c,PairMEAMC) #define LMP_PAIR_MEAMC_H #include "pair.h" -#include "meam.h" namespace LAMMPS_NS { +class MEAM; class PairMEAMC : public Pair { public: @@ -43,7 +43,7 @@ class PairMEAMC : public Pair { double memory_usage(); private: - MEAM meam_inst; + class MEAM *meam_inst; double cutmax; // max cutoff for all elements int nelements; // # of unique elements char **elements; // names of unique elements