Unverified Commit a42c6889 authored by Axel Kohlmeyer's avatar Axel Kohlmeyer
Browse files

address memory leak and C versus C++ programming issues in pair style polymorphic

parent bfe42e3f
Loading
Loading
Loading
Loading
+33 −25
Original line number Diff line number Diff line
@@ -47,26 +47,26 @@ PairPolymorphic::PairPolymorphic(LAMMPS *lmp) : Pair(lmp)
  one_coeff = 1;

  nelements = 0;
  elements = NULL;
  match = NULL;
  pairParameters = NULL;
  tripletParameters = NULL;
  elem2param = NULL;
  elem3param = NULL;
  map = NULL;
  elements = nullptr;
  match = nullptr;
  pairParameters = nullptr;
  tripletParameters = nullptr;
  elem2param = nullptr;
  elem3param = nullptr;
  map = nullptr;
  epsilon = 0.0;
  neighsize = 0;
  firstneighV = NULL;
  firstneighW = NULL;
  firstneighW1 = NULL;
  delxV = NULL;
  delyV = NULL;
  delzV = NULL;
  drV = NULL;
  delxW = NULL;
  delyW = NULL;
  delzW = NULL;
  drW = NULL;
  firstneighV = nullptr;
  firstneighW = nullptr;
  firstneighW1 = nullptr;
  delxV = nullptr;
  delyV = nullptr;
  delzV = nullptr;
  drV = nullptr;
  delxW = nullptr;
  delyW = nullptr;
  delzW = nullptr;
  drW = nullptr;
}

/* ----------------------------------------------------------------------
@@ -79,8 +79,10 @@ PairPolymorphic::~PairPolymorphic()
    for (int i = 0; i < nelements; i++) delete [] elements[i];
  delete [] elements;
  delete [] match;
  memory->destroy(pairParameters);
  memory->destroy(tripletParameters);

  delete [] pairParameters;
  delete [] tripletParameters;

  memory->destroy(elem2param);
  memory->destroy(elem3param);
  if (allocated) {
@@ -487,7 +489,7 @@ void PairPolymorphic::coeff(int narg, char **arg)
    delete [] elements;
  }
  elements = new char*[atom->ntypes];
  for (i = 0; i < atom->ntypes; i++) elements[i] = NULL;
  for (i = 0; i < atom->ntypes; i++) elements[i] = nullptr;

  nelements = 0;
  for (i = 3; i < narg; i++) {
@@ -581,6 +583,7 @@ void PairPolymorphic::read_file(char *file)
      eta = values.next_int();

      // map the elements in the potential file to LAMMPS atom types
      delete [] match;
      match = new int[nelements];

      for (int i = 0; i < nelements; i++) {
@@ -617,8 +620,10 @@ void PairPolymorphic::read_file(char *file)
      // cutoffs
      npair = nelements*(nelements+1)/2;
      ntriple = nelements*nelements*nelements;
      pairParameters = (PairParameters*) memory->srealloc(pairParameters,npair*sizeof(PairParameters), "pair:pairParameters");
      tripletParameters = (TripletParameters*) memory->srealloc(tripletParameters,ntriple*sizeof(TripletParameters), "pair:tripletParameters");
      delete [] pairParameters;
      delete [] tripletParameters;
      pairParameters = new PairParameters[npair];
      tripletParameters = new TripletParameters[ntriple];

      for (int i = 0; i < npair; i++) {
        PairParameters & p = pairParameters[i];
@@ -641,9 +646,12 @@ void PairPolymorphic::read_file(char *file)
  MPI_Bcast(&ntriple, 1, MPI_INT, 0, world);

  if(comm->me != 0) {
    delete [] match;
    match = new int[nelements];
    pairParameters = (PairParameters*) memory->srealloc(pairParameters,npair*sizeof(PairParameters), "pair:pairParameters");
    tripletParameters = (TripletParameters*) memory->srealloc(tripletParameters,ntriple*sizeof(TripletParameters), "pair:tripletParameters");
    delete [] pairParameters;
    delete [] tripletParameters;
    pairParameters = new PairParameters[npair];
    tripletParameters = new TripletParameters[ntriple];
  }

  MPI_Bcast(match, nelements, MPI_INT, 0, world);
+48 −38
Original line number Diff line number Diff line
@@ -50,14 +50,14 @@ class PairPolymorphic : public Pair {
      xmax = 0.0;
      xmaxsq = xmax*xmax;
      vmax = 0.0;
      xs = NULL;
      ys = NULL;
      ys1 = NULL;
      ys2 = NULL;
      ys3 = NULL;
      ys4 = NULL;
      ys5 = NULL;
      ys6 = NULL;
      xs = nullptr;
      ys = nullptr;
      ys1 = nullptr;
      ys2 = nullptr;
      ys3 = nullptr;
      ys4 = nullptr;
      ys5 = nullptr;
      ys6 = nullptr;
    }
    tabularFunction(int n) {
      size = n;
@@ -88,14 +88,14 @@ class PairPolymorphic : public Pair {
      ys6 = new double[n];
    }
    virtual ~tabularFunction() {
      if (xs) delete [] xs;
      if (ys) delete [] ys;
      if (ys1) delete [] ys1;
      if (ys2) delete [] ys2;
      if (ys3) delete [] ys3;
      if (ys4) delete [] ys4;
      if (ys5) delete [] ys5;
      if (ys6) delete [] ys6;
      delete [] xs;
      delete [] ys;
      delete [] ys1;
      delete [] ys2;
      delete [] ys3;
      delete [] ys4;
      delete [] ys5;
      delete [] ys6;
    }
    void set_xrange(double x1, double x2) {
      xmin = x1;
@@ -198,21 +198,21 @@ class PairPolymorphic : public Pair {
    void resize(int n) {
      if (n != size) {
        size = n;
        if (xs) delete [] xs;
        delete [] xs;
        xs = new double[n];
        if (ys) delete [] ys;
        delete [] ys;
        ys = new double[n];
        if (ys1) delete [] ys1;
        delete [] ys1;
        ys1 = new double[n];
        if (ys2) delete [] ys2;
        delete [] ys2;
        ys2 = new double[n];
        if (ys3) delete [] ys3;
        delete [] ys3;
        ys3 = new double[n];
        if (ys4) delete [] ys4;
        delete [] ys4;
        ys4 = new double[n];
        if (ys5) delete [] ys5;
        delete [] ys5;
        ys5 = new double[n];
        if (ys6) delete [] ys6;
        delete [] ys6;
        ys6 = new double[n];
      }
    }
@@ -264,19 +264,29 @@ class PairPolymorphic : public Pair {
      cut = 0.0;
      cutsq = 0.0;
      xi =  1.0;
      U = NULL;
      V = NULL;
      W = NULL;
      F = NULL;
      U = nullptr;
      V = nullptr;
      W = nullptr;
      F = nullptr;
    };
    ~PairParameters() {
      delete U;
      delete V;
      delete W;
      delete F;
    }
  };
  struct TripletParameters {
    class tabularFunction *P;
    class tabularFunction *G;
    TripletParameters() {
      P = NULL;
      G = NULL;
      P = nullptr;
      G = nullptr;
    };
    ~TripletParameters() {
      delete P;
      delete G;
    }
  };

  double epsilon;