From 91993b236d52dbc9e75c9f7c45cf1438d14c51cc Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer <akohlmey@gmail.com> Date: Fri, 5 Jan 2018 19:52:51 -0500 Subject: [PATCH] avoid division by zero in PPPM for empty and uncharged systems. require kspace_modify gewald --- src/KOKKOS/pppm_kokkos.cpp | 3 +++ src/KSPACE/pppm.cpp | 3 +++ 2 files changed, 6 insertions(+) diff --git a/src/KOKKOS/pppm_kokkos.cpp b/src/KOKKOS/pppm_kokkos.cpp index cf6e2814c0..03de42c68c 100644 --- a/src/KOKKOS/pppm_kokkos.cpp +++ b/src/KOKKOS/pppm_kokkos.cpp @@ -969,6 +969,8 @@ void PPPMKokkos<DeviceType>::set_grid_global() if (!gewaldflag) { if (accuracy <= 0.0) error->all(FLERR,"KSpace accuracy must be > 0"); + if (q2 == 0.0) + error->all(FLERR,"Must use 'kspace_modify gewald' for uncharged system"); g_ewald = accuracy*sqrt(natoms*cutoff*xprd*yprd*zprd) / (2.0*q2); if (g_ewald >= 1.0) g_ewald = (1.35 - 0.15*log(accuracy))/cutoff; else g_ewald = sqrt(-log(g_ewald)) / cutoff; @@ -1179,6 +1181,7 @@ double PPPMKokkos<DeviceType>::final_accuracy() double yprd = domain->yprd; double zprd = domain->zprd; bigint natoms = atomKK->natoms; + if (natoms == 0) natoms = 1; // avoid division by zero double df_kspace = compute_df_kspace(); double q2_over_sqrt = q2 / sqrt(natoms*cutoff*xprd*yprd*zprd); diff --git a/src/KSPACE/pppm.cpp b/src/KSPACE/pppm.cpp index 28dda4abfc..53ab2e5a9d 100644 --- a/src/KSPACE/pppm.cpp +++ b/src/KSPACE/pppm.cpp @@ -1004,6 +1004,8 @@ void PPPM::set_grid_global() if (!gewaldflag) { if (accuracy <= 0.0) error->all(FLERR,"KSpace accuracy must be > 0"); + if (q2 == 0.0) + error->all(FLERR,"Must use kspace_modify gewald for uncharged system"); g_ewald = accuracy*sqrt(natoms*cutoff*xprd*yprd*zprd) / (2.0*q2); if (g_ewald >= 1.0) g_ewald = (1.35 - 0.15*log(accuracy))/cutoff; else g_ewald = sqrt(-log(g_ewald)) / cutoff; @@ -1346,6 +1348,7 @@ double PPPM::final_accuracy() double yprd = domain->yprd; double zprd = domain->zprd; bigint natoms = atom->natoms; + if (natoms == 0) natoms = 1; // avoid division by zero double df_kspace = compute_df_kspace(); double q2_over_sqrt = q2 / sqrt(natoms*cutoff*xprd*yprd*zprd); -- GitLab