Commit e37436d6 authored by Axel Kohlmeyer's avatar Axel Kohlmeyer
Browse files

plug memory leak and avoid accessing uninitialized memory in virial...

plug memory leak and avoid accessing uninitialized memory in virial computation and properly handle PPPM/Ewald cases that don't compute a virial
parent 9ee076e4
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -58,7 +58,7 @@ style = {none} or {ewald} or {ewald/disp} or {ewald/omp} or {pppm} or {pppm/cg}
    accuracy = desired relative error in forces
    smallq = cutoff for charges to be considered (optional) (charge units)
  {scafacos} values = method accuracy
    method = fmm or p2nfft or ewald or direct
    method = fmm or p2nfft or p3m or ewald or direct
    accuracy = desired relative error in forces :pre
:ule

@@ -392,6 +392,8 @@ the same bond/angle/dihedral are weighted by the
"special_bonds"_special_bonds.html command.  Likewise it does not
support the "TIP4P water style" where a fictitious charge site is
introduced in each water molecule.
Finally, the methods {p3m} and {ewald} do not support computing the
virial, so this contribution is not included.

[Related commands:]

+34 −18
Original line number Diff line number Diff line
@@ -100,6 +100,12 @@ void Scafacos::init()
  if (logfile && me == 0) fprintf(logfile,
                          "Setting up ScaFaCoS with solver %s ...\n",method);

  if ((strcmp(method,"p3m") == 0) && (me == 0))
    error->warning(FLERR,"Virial computation for P3M not available");

  if ((strcmp(method,"ewald") == 0) && (me == 0))
    error->warning(FLERR,"Virial computation for Ewald not available");

  if (!atom->q_flag)
    error->all(FLERR,"Kspace style requires atom attribute q");

@@ -143,8 +149,7 @@ void Scafacos::init()
    double *q = atom->q;
    int nlocal = atom->nlocal;

    if (strcmp(method,"fmm") == 0)
    {
    if (strcmp(method,"fmm") == 0) {
      if (fmm_tuning_flag == 1)
        fcs_fmm_set_internal_tuning((FCS)fcs,FCS_FMM_INHOMOGENOUS_SYSTEM);
      else
@@ -152,8 +157,7 @@ void Scafacos::init()
    }

    // for the FMM at least one particle is required per process
    if (strcmp(method,"fmm") == 0)
    {
    if (strcmp(method,"fmm") == 0) {
      int empty = (nlocal==0)?1:0;
      MPI_Allreduce(MPI_IN_PLACE,&empty,1,MPI_INT,MPI_SUM,world);
      if (empty > 0)
@@ -212,11 +216,15 @@ void Scafacos::compute(int eflag, int vflag)
    memory->create(efield,maxatom,3,"scafacos:efield");
  }

  if (vflag_global)
  {
    fcs_set_compute_virial((FCS)fcs,1);
    //if (strcmp(method,"p3m") == 0)
    //  error->all(FLERR,"ScaFaCoS p3m does not support computation of virial");
  if (vflag_global) {

    // for P3M or Ewald we cannot compute the virial. skip it.

    if ((strcmp(method,"p3m") != 0)
        && (strcmp(method,"ewald") != 0)) {
      result = fcs_set_compute_virial((FCS)fcs,1);
      check_result((void*)&result);
    }
  }

  // pack coords into xpbc and apply PBC
@@ -230,6 +238,7 @@ void Scafacos::compute(int eflag, int vflag)
      j += 3;
    }
  }

  // if simulation box has changed, call fcs_tune()

  if (box_has_changed()) {
@@ -245,9 +254,15 @@ void Scafacos::compute(int eflag, int vflag)

  // extract virial

  if (vflag_global)
  {
    fcs_get_virial((FCS)fcs,virial_int);
  if (vflag_global) {

    // for P3M or Ewald we cannot compute the virial. skip it.

    if ((strcmp(method,"p3m") != 0)
        && (strcmp(method,"ewald") != 0)) {
      result = fcs_get_virial((FCS)fcs,virial_int);
      check_result((void*)&result);

      virial[0] = virial_int[0];
      virial[1] = virial_int[1];
      virial[2] = virial_int[2];
@@ -255,6 +270,7 @@ void Scafacos::compute(int eflag, int vflag)
      virial[4] = virial_int[5];
      virial[5] = virial_int[8];
    }
  }

  // apply Efield to each particle
  // accumulate total energy