From bee5afcd0832cba5468696c8a8a5fa5cc7c4ba1f Mon Sep 17 00:00:00 2001 From: Trung Nguyen Date: Fri, 21 Apr 2023 00:22:36 -0500 Subject: [PATCH 001/219] Added yukawa/colloid/kk --- src/KOKKOS/Install.sh | 2 + src/KOKKOS/pair_yukawa_colloid_kokkos.cpp | 271 ++++++++++++++++++++++ src/KOKKOS/pair_yukawa_colloid_kokkos.h | 121 ++++++++++ 3 files changed, 394 insertions(+) create mode 100644 src/KOKKOS/pair_yukawa_colloid_kokkos.cpp create mode 100644 src/KOKKOS/pair_yukawa_colloid_kokkos.h diff --git a/src/KOKKOS/Install.sh b/src/KOKKOS/Install.sh index ede766cbf8..766daaff19 100755 --- a/src/KOKKOS/Install.sh +++ b/src/KOKKOS/Install.sh @@ -361,6 +361,8 @@ action pair_vashishta_kokkos.cpp pair_vashishta.cpp action pair_vashishta_kokkos.h pair_vashishta.h action pair_yukawa_kokkos.cpp action pair_yukawa_kokkos.h +action pair_yukawa_colloid_kokkos.cpp pair_yukawa_colloid.cpp +action pair_yukawa_colloid_kokkos.h pair_yukawa_colloid.h action pair_zbl_kokkos.cpp action pair_zbl_kokkos.h action pppm_kokkos.cpp pppm.cpp diff --git a/src/KOKKOS/pair_yukawa_colloid_kokkos.cpp b/src/KOKKOS/pair_yukawa_colloid_kokkos.cpp new file mode 100644 index 0000000000..ca491a3800 --- /dev/null +++ b/src/KOKKOS/pair_yukawa_colloid_kokkos.cpp @@ -0,0 +1,271 @@ +// clang-format off +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: Trung Nguyen (U Chicago) +------------------------------------------------------------------------- */ + +#include "pair_yukawa_colloid_kokkos.h" + +#include "atom_kokkos.h" +#include "atom_masks.h" +#include "error.h" +#include "force.h" +#include "kokkos.h" +#include "memory_kokkos.h" +#include "neigh_list.h" +#include "neigh_request.h" +#include "neighbor.h" +#include "respa.h" +#include "update.h" + +#include + +using namespace LAMMPS_NS; + +/* ---------------------------------------------------------------------- */ + +template +PairYukawaColloidKokkos::PairYukawaColloidKokkos(LAMMPS *lmp) : PairYukawaColloid(lmp) +{ + respa_enable = 0; + + kokkosable = 1; + atomKK = (AtomKokkos *) atom; + execution_space = ExecutionSpaceFromDevice::space; + datamask_read = X_MASK | F_MASK | TYPE_MASK | ENERGY_MASK | VIRIAL_MASK | RADIUS_MASK; + datamask_modify = F_MASK | ENERGY_MASK | VIRIAL_MASK; +} + +/* ---------------------------------------------------------------------- */ + +template +PairYukawaColloidKokkos::~PairYukawaColloidKokkos() +{ + if (copymode) return; + + if (allocated) { + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->destroy_kokkos(k_vatom,vatom); + memoryKK->destroy_kokkos(k_cutsq,cutsq); + } +} + +/* ---------------------------------------------------------------------- + allocate all arrays +------------------------------------------------------------------------- */ + +template +void PairYukawaColloidKokkos::allocate() +{ + PairYukawaColloid::allocate(); + + int n = atom->ntypes; + memory->destroy(cutsq); + memoryKK->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq"); + d_cutsq = k_cutsq.template view(); + k_params = Kokkos::DualView( + "PairYukawaColloid::params",n+1,n+1); + + params = k_params.template view(); +} + +/* ---------------------------------------------------------------------- + init specific to this pair style +------------------------------------------------------------------------- */ + +template +void PairYukawaColloidKokkos::init_style() +{ + PairYukawaColloid::init_style(); + + // error if rRESPA with inner levels + + if (update->whichflag == 1 && utils::strmatch(update->integrate_style,"^respa")) { + int respa = 0; + if (((Respa *) update->integrate)->level_inner >= 0) respa = 1; + if (((Respa *) update->integrate)->level_middle >= 0) respa = 2; + if (respa) + error->all(FLERR,"Cannot use Kokkos pair style with rRESPA inner/middle"); + } + + // adjust neighbor list request for KOKKOS + + neighflag = lmp->kokkos->neighflag; + auto request = neighbor->find_request(this); + request->set_kokkos_host(std::is_same::value && + !std::is_same::value); + request->set_kokkos_device(std::is_same::value); + if (neighflag == FULL) request->enable_full(); +} + +/* ---------------------------------------------------------------------- + init for one type pair i,j and corresponding j,i +------------------------------------------------------------------------- */ +// Rewrite this. +template +double PairYukawaColloidKokkos::init_one(int i, int j) +{ + double cutone = PairYukawaColloid::init_one(i,j); + + k_params.h_view(i,j).a = a[i][j]; + k_params.h_view(i,j).offset = offset[i][j]; + k_params.h_view(i,j).cutsq = cutone*cutone; + k_params.h_view(j,i) = k_params.h_view(i,j); + + if (i(); + k_params.template modify(); + + return cutone; +} + +/* ---------------------------------------------------------------------- */ + +template +void PairYukawaColloidKokkos::compute(int eflag_in, int vflag_in) +{ + eflag = eflag_in; + vflag = vflag_in; + + + if (neighflag == FULL) no_virial_fdotr_compute = 1; + + ev_init(eflag,vflag,0); + + // reallocate per-atom arrays if necessary + + if (eflag_atom) { + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); + d_eatom = k_eatom.view(); + } + if (vflag_atom) { + memoryKK->destroy_kokkos(k_vatom,vatom); + memoryKK->create_kokkos(k_vatom,vatom,maxvatom,"pair:vatom"); + d_vatom = k_vatom.view(); + } + + atomKK->sync(execution_space,datamask_read); + k_cutsq.template sync(); + k_params.template sync(); + if (eflag || vflag) atomKK->modified(execution_space,datamask_modify); + else atomKK->modified(execution_space,F_MASK); + + x = atomKK->k_x.view(); + c_x = atomKK->k_x.view(); + f = atomKK->k_f.view(); + type = atomKK->k_type.view(); + radius = atomKK->k_radius.view(); + nlocal = atom->nlocal; + nall = atom->nlocal + atom->nghost; + newton_pair = force->newton_pair; + special_lj[0] = force->special_lj[0]; + special_lj[1] = force->special_lj[1]; + special_lj[2] = force->special_lj[2]; + special_lj[3] = force->special_lj[3]; + + // loop over neighbors of my atoms + + EV_FLOAT ev = pair_compute,void >( + this,(NeighListKokkos*)list); + + if (eflag_global) eng_vdwl += ev.evdwl; + if (vflag_global) { + virial[0] += ev.v[0]; + virial[1] += ev.v[1]; + virial[2] += ev.v[2]; + virial[3] += ev.v[3]; + virial[4] += ev.v[4]; + virial[5] += ev.v[5]; + } + + if (vflag_fdotr) pair_virial_fdotr_compute(this); + + if (eflag_atom) { + k_eatom.template modify(); + k_eatom.template sync(); + } + + if (vflag_atom) { + k_vatom.template modify(); + k_vatom.template sync(); + } +} + + + +template +template +KOKKOS_INLINE_FUNCTION +F_FLOAT PairYukawaColloidKokkos:: +compute_fpair(const F_FLOAT& rsq, const int& i, const int&j, + const int& itype, const int& jtype) const { + (void) i; + (void) j; + const F_FLOAT radi = radius[i]; + const F_FLOAT radj = radius[j]; + const F_FLOAT rr = sqrt(rsq); + // Fetch the params either off the stack or from some mapped memory? + const F_FLOAT aa = STACKPARAMS ? m_params[itype][jtype].a + : params(itype,jtype).a; + + // U = a * exp(-kappa*r-(radi+radj)) / kappa + // f = a * exp(-kappa*r) + // f/r = a * exp(-kappa*r) / r + const F_FLOAT rinv = 1.0 / rr; + const F_FLOAT rinv2 = rinv*rinv; + const F_FLOAT screening = exp(-kappa*(rr-(radi+radj))); + const F_FLOAT forceyukawa = aa * screening; + const F_FLOAT fpair = forceyukawa * rinv; + + return fpair; +} + +template +template +KOKKOS_INLINE_FUNCTION +F_FLOAT PairYukawaColloidKokkos:: +compute_evdwl(const F_FLOAT& rsq, const int& i, const int&j, + const int& itype, const int& jtype) const { + (void) i; + (void) j; + const F_FLOAT radi = radius[i]; + const F_FLOAT radj = radius[j]; + const F_FLOAT rr = sqrt(rsq); + const F_FLOAT aa = STACKPARAMS ? m_params[itype][jtype].a + : params(itype,jtype).a; + const F_FLOAT offset = STACKPARAMS ? m_params[itype][jtype].offset + : params(itype,jtype).offset; + + // U = a * exp(-kappa*r) / kappa + const F_FLOAT rinv = 1.0 / rr; + const F_FLOAT screening = exp(-kappa*(rr-(radi+radj))); + + return aa / kappa * screening - offset; +} + + +namespace LAMMPS_NS { +template class PairYukawaColloidKokkos; +#ifdef LMP_KOKKOS_GPU +template class PairYukawaColloidKokkos; +#endif +} diff --git a/src/KOKKOS/pair_yukawa_colloid_kokkos.h b/src/KOKKOS/pair_yukawa_colloid_kokkos.h new file mode 100644 index 0000000000..060b621a8a --- /dev/null +++ b/src/KOKKOS/pair_yukawa_colloid_kokkos.h @@ -0,0 +1,121 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef PAIR_CLASS +// clang-format off +PairStyle(yukawa/colloid/kk,PairYukawaColloidKokkos); +PairStyle(yukawa/colloid/kk/device,PairYukawaColloidKokkos); +PairStyle(yukawa/colloid/kk/host,PairYukawaColloidKokkos); +// clang-format on +#else + +// clang-format off +#ifndef LMP_PAIR_YUKAWA_COLLOID_KOKKOS_H +#define LMP_PAIR_YUKAWA_COLLOID_KOKKOS_H + +#include "pair_kokkos.h" +#include "pair_yukawa_colloid.h" +#include "neigh_list_kokkos.h" + +namespace LAMMPS_NS { + +template +class PairYukawaColloidKokkos : public PairYukawaColloid { + public: + enum {EnabledNeighFlags=FULL|HALFTHREAD|HALF}; + enum {COUL_FLAG=0}; + typedef DeviceType device_type; + typedef ArrayTypes AT; + + PairYukawaColloidKokkos(class LAMMPS *); + ~PairYukawaColloidKokkos() override; + + void compute(int, int) override; + void init_style() override; + double init_one(int,int) override; + + struct params_yukawa { + KOKKOS_INLINE_FUNCTION + params_yukawa() { cutsq=0, a = 0; offset = 0; } + KOKKOS_INLINE_FUNCTION + params_yukawa(int /*i*/) { cutsq=0, a = 0; offset = 0; } + F_FLOAT cutsq, a, offset; + }; + + + protected: + template + KOKKOS_INLINE_FUNCTION + F_FLOAT compute_fpair(const F_FLOAT& rsq, const int& i, const int&j, + const int& itype, const int& jtype) const; + + template + KOKKOS_INLINE_FUNCTION + F_FLOAT compute_evdwl(const F_FLOAT& rsq, const int& i, const int&j, + const int& itype, const int& jtype) const; + + template + KOKKOS_INLINE_FUNCTION + F_FLOAT compute_ecoul(const F_FLOAT& /*rsq*/, const int& /*i*/, const int& /*j*/, + const int& /*itype*/, const int& /*jtype*/) const { return 0; } + + + Kokkos::DualView k_params; + typename Kokkos::DualView::t_dev_const_um params; + params_yukawa m_params[MAX_TYPES_STACKPARAMS+1][MAX_TYPES_STACKPARAMS+1]; + F_FLOAT m_cutsq[MAX_TYPES_STACKPARAMS+1][MAX_TYPES_STACKPARAMS+1]; + typename AT::t_x_array_randomread x; + typename AT::t_x_array c_x; + typename AT::t_f_array f; + typename AT::t_int_1d_randomread type; + typename AT::t_float_1d_randomread radius; + + DAT::tdual_efloat_1d k_eatom; + DAT::tdual_virial_array k_vatom; + typename AT::t_efloat_1d d_eatom; + typename AT::t_virial_array d_vatom; + + int newton_pair; + double special_lj[4]; + + typename AT::tdual_ffloat_2d k_cutsq; + typename AT::t_ffloat_2d d_cutsq; + + + int neighflag; + int nlocal,nall,eflag,vflag; + + void allocate() override; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend EV_FLOAT pair_compute_neighlist( + PairYukawaColloidKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist( + PairYukawaColloidKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist( + PairYukawaColloidKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute( + PairYukawaColloidKokkos*,NeighListKokkos*); + friend void pair_virial_fdotr_compute(PairYukawaColloidKokkos*); + +}; + +} + +#endif +#endif + From 859012b192a4931d2d372dcfbe7799e887b2e0c3 Mon Sep 17 00:00:00 2001 From: Germain Clavier Date: Wed, 17 May 2023 17:13:07 +0200 Subject: [PATCH 002/219] Initial commit of an early version of anisotropic Langevin barostat. --- src/fix_press_langevin.cpp | 614 +++++++++++++++++++++++++++++++++++++ src/fix_press_langevin.h | 71 +++++ 2 files changed, 685 insertions(+) create mode 100644 src/fix_press_langevin.cpp create mode 100644 src/fix_press_langevin.h diff --git a/src/fix_press_langevin.cpp b/src/fix_press_langevin.cpp new file mode 100644 index 0000000000..246d2f08f1 --- /dev/null +++ b/src/fix_press_langevin.cpp @@ -0,0 +1,614 @@ +// clang-format off +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: Germain Clavier (TUe) +------------------------------------------------------------------------- */ + +#include "fix_press_langevin.h" + +#include "atom.h" +#include "comm.h" +#include "compute.h" +#include "domain.h" +#include "error.h" +#include "fix_deform.h" +#include "force.h" +#include "group.h" +#include "kspace.h" +#include "modify.h" +#include "random_mars.h" +#include "update.h" + +#include +#include + +using namespace LAMMPS_NS; +using namespace FixConst; + +enum{NONE,XYZ,XY,YZ,XZ}; +enum{ISO,ANISO}; + +/* ---------------------------------------------------------------------- */ + +FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : + Fix(lmp, narg, arg), + id_press(nullptr), pflag(0), random(nullptr) +{ + if (narg < 5) error->all(FLERR,"Illegal fix press/langevin command"); + + // Langevin barostat applied every step + // For details on the equations of motion see: + // Grønbech-Jensen & Farago J. Chem. Phys. 141 194108 (2014) + + nevery = 1; + + // default values + + pcouple = NONE; + allremap = 1; + + // Alpha friction coefficient + p_fric = 1e-4; + // Target temperature + t_start = t_stop = t_target = 0.0; + + for (int i = 0; i < 3; i++) { + // Pressure and pistons mass Q + p_start[i] = p_stop[i] = p_period[i] = 0.0; + p_flag[i] = 0; + + // Pistons coordinates derivative V + p_deriv[i] = 0.0; + + // a and b values for each piston + gjfa[i] = 0.0; + gjfb[i] = 0.0; + + // Random value for each piston + fran[i] = 0.0; + } + + // process keywords + + dimension = domain->dimension; + + int iarg = 3; + + while (iarg < narg) { + if (strcmp(arg[iarg],"iso") == 0) { + if (iarg+4 > narg) + error->all(FLERR,"Illegal fix press/langevin command"); + pcouple = XYZ; + p_start[0] = p_start[1] = p_start[2] = utils::numeric(FLERR,arg[iarg+1],false,lmp); + p_stop[0] = p_stop[1] = p_stop[2] = utils::numeric(FLERR,arg[iarg+2],false,lmp); + p_period[0] = p_period[1] = p_period[2] = utils::numeric(FLERR,arg[iarg+3],false,lmp); + p_flag[0] = p_flag[1] = p_flag[2] = 1; + if (dimension == 2) { + p_start[2] = p_stop[2] = p_period[2] = 0.0; + p_flag[2] = 0; + } + iarg += 4; + } else if (strcmp(arg[iarg],"aniso") == 0) { + if (iarg+4 > narg) + error->all(FLERR,"Illegal fix press/langevin command"); + pcouple = NONE; + p_start[0] = p_start[1] = p_start[2] = utils::numeric(FLERR,arg[iarg+1],false,lmp); + p_stop[0] = p_stop[1] = p_stop[2] = utils::numeric(FLERR,arg[iarg+2],false,lmp); + p_period[0] = p_period[1] = p_period[2] = utils::numeric(FLERR,arg[iarg+3],false,lmp); + p_flag[0] = p_flag[1] = p_flag[2] = 1; + if (dimension == 2) { + p_start[2] = p_stop[2] = p_period[2] = 0.0; + p_flag[2] = 0; + } + iarg += 4; + + } else if (strcmp(arg[iarg],"x") == 0) { + if (iarg+4 > narg) + error->all(FLERR,"Illegal fix press/langevin command"); + p_start[0] = utils::numeric(FLERR,arg[iarg+1],false,lmp); + p_stop[0] = utils::numeric(FLERR,arg[iarg+2],false,lmp); + p_period[0] = utils::numeric(FLERR,arg[iarg+3],false,lmp); + p_flag[0] = 1; + iarg += 4; + } else if (strcmp(arg[iarg],"y") == 0) { + if (iarg+4 > narg) + error->all(FLERR,"Illegal fix press/langevin command"); + p_start[1] = utils::numeric(FLERR,arg[iarg+1],false,lmp); + p_stop[1] = utils::numeric(FLERR,arg[iarg+2],false,lmp); + p_period[1] = utils::numeric(FLERR,arg[iarg+3],false,lmp); + p_flag[1] = 1; + iarg += 4; + } else if (strcmp(arg[iarg],"z") == 0) { + if (iarg+4 > narg) + error->all(FLERR,"Illegal fix press/langevin command"); + p_start[2] = utils::numeric(FLERR,arg[iarg+1],false,lmp); + p_stop[2] = utils::numeric(FLERR,arg[iarg+2],false,lmp); + p_period[2] = utils::numeric(FLERR,arg[iarg+3],false,lmp); + p_flag[2] = 1; + iarg += 4; + if (dimension == 2) + error->all(FLERR,"Invalid fix press/langevin for a 2d simulation"); + + } else if (strcmp(arg[iarg],"couple") == 0) { + if (iarg+2 > narg) + error->all(FLERR,"Illegal fix press/langevin command"); + if (strcmp(arg[iarg+1],"xyz") == 0) pcouple = XYZ; + else if (strcmp(arg[iarg+1],"xy") == 0) pcouple = XY; + else if (strcmp(arg[iarg+1],"yz") == 0) pcouple = YZ; + else if (strcmp(arg[iarg+1],"xz") == 0) pcouple = XZ; + else if (strcmp(arg[iarg+1],"none") == 0) pcouple = NONE; + else error->all(FLERR,"Illegal fix press/langevin command"); + iarg += 2; + + } else if (strcmp(arg[iarg],"friction") == 0) { + if (iarg+3 > narg) + error->all(FLERR,"Illegal fix press/langevin command"); + p_fric = utils::numeric(FLERR,arg[iarg+1],false,lmp); + seed = utils::numeric(FLERR,arg[iarg+2],false,lmp); + if (p_fric <= 0.0) + error->all(FLERR,"Illegal fix press/langevin command"); + if (seed <= 0.0) + error->all(FLERR,"Illegal fix press/langevin command"); + iarg += 3; + } else if (strcmp(arg[iarg],"dilate") == 0) { + if (iarg+2 > narg) + error->all(FLERR,"Illegal fix press/langevin command"); + if (strcmp(arg[iarg+1],"all") == 0) allremap = 1; + else if (strcmp(arg[iarg+1],"partial") == 0) allremap = 0; + else error->all(FLERR,"Illegal fix press/langevin command"); + iarg += 2; + } else if (strcmp(arg[iarg], "temp") == 0) { + if (iarg+3 > narg) + error->all(FLERR,"Illegal fix press/langevin command"); + t_start = utils::numeric(FLERR,arg[iarg+1],false,lmp); + t_stop = utils::numeric(FLERR,arg[iarg+2],false,lmp); + iarg += 3; + } + + else error->all(FLERR,"Illegal fix press/langevin command"); + } + + if (allremap == 0) restart_pbc = 1; + + random = new RanMars(lmp, seed + comm->me); + + // error checks + + if (dimension == 2 && p_flag[2]) + error->all(FLERR,"Invalid fix press/langevin for a 2d simulation"); + if (dimension == 2 && (pcouple == YZ || pcouple == XZ)) + error->all(FLERR,"Invalid fix press/langevin for a 2d simulation"); + + if (pcouple == XYZ && (p_flag[0] == 0 || p_flag[1] == 0)) + error->all(FLERR,"Invalid fix press/langevin pressure settings"); + if (pcouple == XYZ && dimension == 3 && p_flag[2] == 0) + error->all(FLERR,"Invalid fix press/langevin pressure settings"); + if (pcouple == XY && (p_flag[0] == 0 || p_flag[1] == 0)) + error->all(FLERR,"Invalid fix press/langevin pressure settings"); + if (pcouple == YZ && (p_flag[1] == 0 || p_flag[2] == 0)) + error->all(FLERR,"Invalid fix press/langevin pressure settings"); + if (pcouple == XZ && (p_flag[0] == 0 || p_flag[2] == 0)) + error->all(FLERR,"Invalid fix press/langevin pressure settings"); + + if (p_flag[0] && domain->xperiodic == 0) + error->all(FLERR, + "Cannot use fix press/langevin on a non-periodic dimension"); + if (p_flag[1] && domain->yperiodic == 0) + error->all(FLERR, + "Cannot use fix press/langevin on a non-periodic dimension"); + if (p_flag[2] && domain->zperiodic == 0) + error->all(FLERR, + "Cannot use fix press/langevin on a non-periodic dimension"); + + if (pcouple == XYZ && dimension == 3 && + (p_start[0] != p_start[1] || p_start[0] != p_start[2] || + p_stop[0] != p_stop[1] || p_stop[0] != p_stop[2] || + p_period[0] != p_period[1] || p_period[0] != p_period[2])) + error->all(FLERR,"Invalid fix press/langevin pressure settings"); + if (pcouple == XYZ && dimension == 2 && + (p_start[0] != p_start[1] || p_stop[0] != p_stop[1] || + p_period[0] != p_period[1])) + error->all(FLERR,"Invalid fix press/langevin pressure settings"); + if (pcouple == XY && + (p_start[0] != p_start[1] || p_stop[0] != p_stop[1] || + p_period[0] != p_period[1])) + error->all(FLERR,"Invalid fix press/langevin pressure settings"); + if (pcouple == YZ && + (p_start[1] != p_start[2] || p_stop[1] != p_stop[2] || + p_period[1] != p_period[2])) + error->all(FLERR,"Invalid fix press/langevin pressure settings"); + if (pcouple == XZ && + (p_start[0] != p_start[2] || p_stop[0] != p_stop[2] || + p_period[0] != p_period[2])) + error->all(FLERR,"Invalid fix press/langevin pressure settings"); + + if (t_start < 0.0) + error->all(FLERR,"Fix press/langevin temperature parameters must be >= 0.0"); + if (t_stop < 0.0) + error->all(FLERR,"Fix press/langevin temperature parameters must be >= 0.0"); + + if ((p_flag[0] && p_period[0] <= 0.0) || + (p_flag[1] && p_period[1] <= 0.0) || + (p_flag[2] && p_period[2] <= 0.0)) + error->all(FLERR,"Fix press/langevin damping parameters must be > 0.0"); + + if (p_flag[0]) box_change |= BOX_CHANGE_X; + if (p_flag[1]) box_change |= BOX_CHANGE_Y; + if (p_flag[2]) box_change |= BOX_CHANGE_Z; + + // pstyle = ISO if XYZ coupling or XY coupling in 2d -> 1 dof + // else pstyle = ANISO -> 3 dof + + if (pcouple == XYZ || (dimension == 2 && pcouple == XY)) pstyle = ISO; + else pstyle = ANISO; + + // C1 + // Langevin GJF dynamics does NOT need a temperature compute + // This is stated explicitely in their paper. + // The temperature used for the pressure is NkT/V on purpose. + + // id = fix-ID + temp + // compute group = all since pressure is always global (group all) + // and thus its KE/temperature contribution should use group all + + // id_temp = utils::strdup(std::string(id) + "_temp"); + // modify->add_compute(fmt::format("{} all temp",id_temp)); + // tflag = 1; + + // C2 + // Following C1, the compute must use the virial pressure + // Kinetic contribution will be added by the fix style + // create a new compute pressure style + // id = fix-ID + press, compute group = all + // pass id_temp as 4th arg to pressure constructor + + id_press = utils::strdup(std::string(id) + "_press"); + modify->add_compute(fmt::format("{} all pressure NULL virial",id_press, id_temp)); + pflag = 1; + + for (int i = 0; i < 3; i++) { + gjfa[i] = (1.0 - update->dt / 2.0 / p_period[i]) / (1.0 + update->dt / 2.0 / p_period[i]); + gjfb[i] = 1./(1.0 + update->dt / 2.0 / p_period[i]); + } + + nrigid = 0; + rfix = nullptr; +} + +/* ---------------------------------------------------------------------- */ + +FixPressLangevin::~FixPressLangevin() +{ + delete random; + delete[] rfix; + + // delete temperature and pressure if fix created them + + if (pflag) modify->delete_compute(id_press); + delete[] id_press; +} + +/* ---------------------------------------------------------------------- */ + +int FixPressLangevin::setmask() +{ + int mask = 0; + mask |= INITIAL_INTEGRATE; + mask |= POST_FORCE; + mask |= END_OF_STEP; + return mask; +} + +/* ---------------------------------------------------------------------- */ + +void FixPressLangevin::init() +{ + if (domain->triclinic) + error->all(FLERR,"Cannot use fix press/langevin with triclinic box"); + + // ensure no conflict with fix deform + + for (const auto &ifix : modify->get_fix_list()) + if (strcmp(ifix->style, "^deform") == 0) { + int *dimflag = static_cast(ifix)->dimflag; + if ((p_flag[0] && dimflag[0]) || (p_flag[1] && dimflag[1]) || + (p_flag[2] && dimflag[2])) + error->all(FLERR,"Cannot use fix press/langevin and " + "fix deform on same component of stress tensor"); + } + + // set pressure ptr + + pressure = modify->get_compute_by_id(id_press); + if (!pressure) + error->all(FLERR, "Pressure compute ID {} for fix press/langevin does not exist", id_press); + + // Kspace setting + + if (force->kspace) kspace_flag = 1; + else kspace_flag = 0; + + // detect if any rigid fixes exist so rigid bodies move when box is remapped + // rfix[] = indices to each fix rigid + + delete[] rfix; + nrigid = 0; + rfix = nullptr; + + for (int i = 0; i < modify->nfix; i++) + if (modify->fix[i]->rigid_flag) nrigid++; + if (nrigid > 0) { + rfix = new int[nrigid]; + nrigid = 0; + for (int i = 0; i < modify->nfix; i++) + if (modify->fix[i]->rigid_flag) rfix[nrigid++] = i; + } +} + +/* ---------------------------------------------------------------------- + compute T,P before integrator starts +------------------------------------------------------------------------- */ + +void FixPressLangevin::setup(int /*vflag*/) +{ + // trigger virial computation on next timestep + + pressure->addstep(update->ntimestep+1); +} + +/* ---------------------------------------------------------------------- */ + +void FixPressLangevin::initial_integrate(int /* vflag */) +{ + // compute new V + + double dt; + double dl; + double displacement; + double delta = update->ntimestep - update->beginstep; + + // Compute new random term on pistons dynamics + if (delta != 0.0) delta /= update->endstep - update->beginstep; + t_target = t_start + delta * (t_stop-t_start); + couple_beta(t_target); + + dt = update->dt; + + for (int i = 0; i < 3; i++) { + if (p_flag[i]) { + // See equation 13 + displacement = dt*p_deriv[i]*gjfb[i]; + displacement += 0.5*dt*dt*f_piston[i]*gjfb[i]/p_period[i]; + displacement += 0.5*dt*fran[i]*gjfb[i]/p_period[i]; + dl = domain->boxhi[i] - domain->boxlo[i]; + dilation[i] = (dl + displacement)/dl; + } + } + + // remap simulation box and atoms + // redo KSpace coeffs since volume has changed + + remap(); + if (kspace_flag) force->kspace->setup(); + +} + +/* ---------------------------------------------------------------------- */ +void FixPressLangevin::post_force(int /*vflag*/) +{ + // compute new forces on pistons after internal virial computation + + double delta = update->ntimestep - update->beginstep; + if (delta != 0.0) delta /= update->endstep - update->beginstep; + + // Compute current pressure tensor and add kinetic term + if (pstyle == ISO) { + pressure->compute_scalar(); + } else { + pressure->compute_vector(); + } + + couple_pressure(); + couple_kinetic(t_target); + + for (int i = 0; i < 3; i++) { + if (p_flag[i]) { + f_old_piston[i] = f_piston[i]; + p_target[i] = p_start[i] + delta * (p_stop[i]-p_start[i]); + f_piston[i] = p_current[i] - p_target[i]; + } + } + + // trigger virial computation on next timestep + + pressure->addstep(update->ntimestep+1); +} + +/* ---------------------------------------------------------------------- */ + +void FixPressLangevin::end_of_step() +{ + // compute pistons velocity + + double dt; + dt = update->dt; + + for (int i = 0; i < 3; i++) { + if (p_flag[i]) { + p_deriv[i] *= gjfa[i]; + p_deriv[i] += 0.5*dt*(gjfa[i]*f_old_piston[i]+f_piston[i])/p_period[i]; + p_deriv[i] += fran[i]*gjfb[i]/p_period[i]; + } + } + +} + +/* ---------------------------------------------------------------------- */ + +void FixPressLangevin::couple_pressure() +{ + double *tensor = pressure->vector; + + if (pstyle == ISO) + p_current[0] = p_current[1] = p_current[2] = pressure->scalar; + else if (pcouple == XYZ) { + double ave = 1.0/3.0 * (tensor[0] + tensor[1] + tensor[2]); + p_current[0] = p_current[1] = p_current[2] = ave; + } else if (pcouple == XY) { + double ave = 0.5 * (tensor[0] + tensor[1]); + p_current[0] = p_current[1] = ave; + p_current[2] = tensor[2]; + } else if (pcouple == YZ) { + double ave = 0.5 * (tensor[1] + tensor[2]); + p_current[1] = p_current[2] = ave; + p_current[0] = tensor[0]; + } else if (pcouple == XZ) { + double ave = 0.5 * (tensor[0] + tensor[2]); + p_current[0] = p_current[2] = ave; + p_current[1] = tensor[1]; + } else { + p_current[0] = tensor[0]; + p_current[1] = tensor[1]; + p_current[2] = tensor[2]; + } +} +/* ---------------------------------------------------------------------- */ + +void FixPressLangevin::couple_kinetic(double t_target) +{ + double Pk, volume; + + // Kinetic part + if (dimension == 3) volume = domain->xprd * domain->yprd * domain->zprd; + else volume = domain->xprd * domain->yprd; + + Pk = atom->natoms*force->boltz*t_target/volume; + + p_current[0] += Pk; + p_current[1] += Pk; + if (dimension == 3) p_current[2] += Pk; +} + +/* ---------------------------------------------------------------------- */ + +void FixPressLangevin::couple_beta(double t_target) +{ + double gamma; + int me = comm->me; + + gamma = sqrt(2.0*force->boltz*update->dt*p_fric*t_target); + + fran[0] = fran[1] = fran[2] = 0.0; + if (me == 0) { + if (pstyle == ISO) + fran[0] = fran[1] = fran[2] = gamma*random->gaussian(); + else if (pcouple == XYZ) { + fran[0] = fran[1] = fran[2] = gamma*random->gaussian(); + } else if (pcouple == XY) { + fran[0] = fran[1] = gamma*random->gaussian(); + fran[2] = gamma*random->gaussian(); + } else if (pcouple == YZ) { + fran[1] = fran[2] = gamma*random->gaussian(); + fran[0] = gamma*random->gaussian(); + } else if (pcouple == XZ) { + fran[0] = fran[2] = gamma*random->gaussian(); + fran[1] = gamma*random->gaussian(); + } else { + fran[0] = gamma*random->gaussian(); + fran[1] = gamma*random->gaussian(); + fran[2] = gamma*random->gaussian(); + } + } + MPI_Bcast(&fran, 3, MPI_DOUBLE, 0, world); +} + +/* ---------------------------------------------------------------------- + change box size + remap all atoms or fix group atoms depending on allremap flag + if rigid bodies exist, scale rigid body centers-of-mass +------------------------------------------------------------------------- */ + +void FixPressLangevin::remap() +{ + int i; + double oldlo,oldhi,ctr; + + double **x = atom->x; + int *mask = atom->mask; + int nlocal = atom->nlocal; + + // convert pertinent atoms and rigid bodies to lamda coords + + if (allremap) domain->x2lamda(nlocal); + else { + for (i = 0; i < nlocal; i++) + if (mask[i] & groupbit) + domain->x2lamda(x[i],x[i]); + } + + if (nrigid) + for (i = 0; i < nrigid; i++) + modify->fix[rfix[i]]->deform(0); + + // reset global and local box to new size/shape + + for (i = 0; i < 3; i++) { + if (p_flag[i]) { + oldlo = domain->boxlo[i]; + oldhi = domain->boxhi[i]; + ctr = 0.5 * (oldlo + oldhi); + domain->boxlo[i] = (oldlo-ctr)*dilation[i] + ctr; + domain->boxhi[i] = (oldhi-ctr)*dilation[i] + ctr; + } + } + + domain->set_global_box(); + domain->set_local_box(); + + // convert pertinent atoms and rigid bodies back to box coords + + if (allremap) domain->lamda2x(nlocal); + else { + for (i = 0; i < nlocal; i++) + if (mask[i] & groupbit) + domain->lamda2x(x[i],x[i]); + } + + if (nrigid) + for (i = 0; i < nrigid; i++) + modify->fix[rfix[i]]->deform(1); +} + +/* ---------------------------------------------------------------------- */ + +int FixPressLangevin::modify_param(int narg, char **arg) +{ + if (strcmp(arg[0],"press") == 0) { + if (narg < 2) error->all(FLERR,"Illegal fix_modify command"); + if (pflag) { + modify->delete_compute(id_press); + pflag = 0; + } + delete[] id_press; + id_press = utils::strdup(arg[1]); + + pressure = modify->get_compute_by_id(arg[1]); + if (pressure) error->all(FLERR,"Could not find fix_modify pressure compute ID: {}", arg[1]); + if (pressure->pressflag == 0) + error->all(FLERR,"Fix_modify pressure compute {} does not compute pressure", arg[1]); + return 2; + } + return 0; +} diff --git a/src/fix_press_langevin.h b/src/fix_press_langevin.h new file mode 100644 index 0000000000..a0ea8bbd5a --- /dev/null +++ b/src/fix_press_langevin.h @@ -0,0 +1,71 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef FIX_CLASS +// clang-format off +FixStyle(press/langevin,FixPressLangevin); +// clang-format on +#else + +#ifndef LMP_FIX_PRESS_LANGEVIN_H +#define LMP_FIX_PRESS_LANGEVIN_H + +#include "fix.h" + +namespace LAMMPS_NS { + +class FixPressLangevin : public Fix { + public: + FixPressLangevin(class LAMMPS *, int, char **); + ~FixPressLangevin() override; + int setmask() override; + void init() override; + void setup(int) override; + void initial_integrate(int) override; + void post_force(int) override; + void end_of_step() override; + int modify_param(int, char **) override; + + protected: + int dimension, which; + + int pstyle, pcouple, allremap; + int p_flag[3]; // 1 if control P on this dim, 0 if not + double t_start, t_stop, t_target; + double p_fric; + double p_start[3], p_stop[3], p_current[3]; + double p_period[3], p_target[3]; + double p_deriv[3], dilation[3]; + double f_piston[3], f_old_piston[3]; + double gjfa[3], gjfb[3], fran[3]; + int kspace_flag; // 1 if KSpace invoked, 0 if not + int nrigid; // number of rigid fixes + int *rfix; // indices of rigid fixes + + char *id_temp, *id_press; + class Compute *temperature, *pressure; + int pflag; + + class RanMars *random; + int seed; + + void couple_pressure(); + void couple_kinetic(double ); + void couple_beta(double ); + void remap(); +}; + +} // namespace LAMMPS_NS + +#endif +#endif From 1c33aec5dc64d0da59368d42a81b71679ca011cc Mon Sep 17 00:00:00 2001 From: Germain Clavier Date: Wed, 17 May 2023 18:28:49 +0200 Subject: [PATCH 003/219] Wrote the documentation for fix_press_langevin --- doc/src/Commands_fix.rst | 1 + doc/src/fix.rst | 1 + doc/src/fix_press_langevin.rst | 230 +++++++++++++++++++++++++++++++++ 3 files changed, 232 insertions(+) create mode 100644 doc/src/fix_press_langevin.rst diff --git a/doc/src/Commands_fix.rst b/doc/src/Commands_fix.rst index c74b1fd037..f7b85a5d12 100644 --- a/doc/src/Commands_fix.rst +++ b/doc/src/Commands_fix.rst @@ -181,6 +181,7 @@ OPT. * :doc:`pour ` * :doc:`precession/spin ` * :doc:`press/berendsen ` + * :doc:`press/langevin ` * :doc:`print ` * :doc:`propel/self ` * :doc:`property/atom (k) ` diff --git a/doc/src/fix.rst b/doc/src/fix.rst index 8cee9dd687..c4abbd6c21 100644 --- a/doc/src/fix.rst +++ b/doc/src/fix.rst @@ -333,6 +333,7 @@ accelerated styles exist. * :doc:`pour ` - pour new atoms/molecules into a granular simulation domain * :doc:`precession/spin ` - apply a precession torque to each magnetic spin * :doc:`press/berendsen ` - pressure control by Berendsen barostat +* :doc:`press/langevin ` - pressure control by Langevin barostat * :doc:`print ` - print text and variables during a simulation * :doc:`propel/self ` - model self-propelled particles * :doc:`property/atom ` - add customized per-atom values diff --git a/doc/src/fix_press_langevin.rst b/doc/src/fix_press_langevin.rst new file mode 100644 index 0000000000..cb46d2b7d9 --- /dev/null +++ b/doc/src/fix_press_langevin.rst @@ -0,0 +1,230 @@ +.. index:: fix press/langevin + +fix press/langevin command +=========================== + +Syntax +"""""" + +.. parsed-literal:: + + fix ID group-ID press/langevin keyword value ... + +* ID, group-ID are documented in :doc:`fix ` command +* press/langevin = style name of this fix command + + .. parsed-literal:: + + one or more keyword value pairs may be appended + keyword = *iso* or *aniso* or *x* or *y* or *z* or *couple* or *dilate* or *modulus* or *temp* + *iso* or *aniso* values = Pstart Pstop Pdamp + Pstart,Pstop = scalar external pressure at start/end of run (pressure units) + Pdamp = pressure damping parameter + *x* or *y* or *z* values = Pstart Pstop Pdamp + Pstart,Pstop = external stress tensor component at start/end of run (pressure units) + Pdamp = stress damping parameter + *couple* = *none* or *xyz* or *xy* or *yz* or *xz* + *friction* value = Friction to apply to the barostat + *temp* values = Tstart, Tstop + Tstart, Tstop = target temperature used for the barostat at start/end of run + *dilate* value = *all* or *partial* + +Examples +"""""""" + +.. code-block:: LAMMPS + + fix 1 all press/langevin iso 0.0 0.0 1000.0 temp 300 300 + fix 2 all press/langevin aniso 0.0 0.0 1000.0 temp 100 300 dilate partial + +Description +""""""""""" + +Reset the pressure of the system by using a Langevin stochastic barostat +:ref:`(Grønbech) `, which rescales the system volume and +(optionally) the atoms coordinates within the simulation box every +timestep. + +The Langevin barostat couple each direction *L* with a pseudo-particle that obeys +the Langevin equation such as: + +.. math:: + + f_P = & \frac{N k_B T_{target}}{V} + \frac{1}{V d}\sum_{i=1}^{N} \vec r_i \cdot \vec f_i - P_{target} \\ + Q\ddot{L} + \alpha{}\dot{L} = & f_P + \beta(t)\\ + L^{n+1} = & L^{n} + bdt\dot{L}^{n} \frac{bdt^{2}}{2Q} \\ + \dot{L}^{n+1} = & \alpha\dot{L}^{n} + \frac{dt}{2Q}\left(a f^{n}_{P} + f^{n+1}_{P}\right) + \frac{b}{Q}\beta^{n+1} \\ + a = & \frac{1-\frac{\alpha{}dt}{2Q}}{1+\frac{\alpha{}dt}{2Q}} \\ + b = & \frac{1}{1+\frac{\alpha{}dt}{2Q}} \\ + \left< \beta(t)\beta(t') \right> = & 2\alpha k_B Tdt + +Where :math:`dt` is the timestep :math:`\dot{L}` and :math:`\ddot{L}` the first +and second derivatives of the coupled direction with regard to time, +:math:`\alpha` is a friction coefficient, :math:`\beta` is a random gaussian +variable and :math:`Q` the effective mass of the coupled pseudoparticle. The +two first terms on the righthand side of the first equation are the virial +expression of the canonical pressure. It is to be noted that the temperature +used to compute the pressure is not the velocity of the atom but the canonical +target temperature directly. This temperature is specified using the *temp* +keyword parameter and should be close to the current target temperature of the +system. + +Regardless of what atoms are in the fix group, a global pressure is +computed for all atoms. Similarly, when the size of the simulation +box is changed, all atoms are re-scaled to new positions, unless the +keyword *dilate* is specified with a value of *partial*, in which case +only the atoms in the fix group are re-scaled. The latter can be +useful for leaving the coordinates of atoms in a solid substrate +unchanged and controlling the pressure of a surrounding fluid. + +.. note:: + + Unlike the :doc:`fix npt ` or :doc:`fix nph ` commands which + perform Nose/Hoover barostatting AND time integration, this fix does NOT + perform time integration of the atoms but only of the barostat coupled + coordinate. It then only modifies the box size and atom coordinates to + effect barostatting. Thus you must use a separate time integration fix, + like :doc:`fix nve ` or :doc:`fix nvt ` to actually update + the positions and velocities of atoms. This fix can be used in conjunction + with thermostatting fixes to control the temperature, such as :doc:`fix nvt + ` or :doc:`fix langevin ` or :doc:`fix temp/berendsen + `. + +See the :doc:`Howto barostat ` page for a +discussion of different ways to perform barostatting. + +---------- + +The barostat is specified using one or more of the *iso*, *aniso*, +*x*, *y*, *z*, and *couple* keywords. These keywords give you the +ability to specify the 3 diagonal components of an external stress +tensor, and to couple various of these components together so that the +dimensions they represent are varied together during a +constant-pressure simulation. Unlike the :doc:`fix npt ` and +:doc:`fix nph ` commands, this fix cannot be used with triclinic +(non-orthogonal) simulation boxes to control all 6 components of the +general pressure tensor. + +The target pressures for each of the 3 diagonal components of the +stress tensor can be specified independently via the *x*, *y*, *z*, +keywords, which correspond to the 3 simulation box dimensions. For +each component, the external pressure or tensor component at each +timestep is a ramped value during the run from *Pstart* to *Pstop*\ . +If a target pressure is specified for a component, then the +corresponding box dimension will change during a simulation. For +example, if the *y* keyword is used, the y-box length will change. A +box dimension will not change if that component is not specified, +although you have the option to change that dimension via the :doc:`fix deform ` command. + +For all barostat keywords, the *Pdamp* parameter determines the "mass" of the +pseudo particle acting as a barostat. The relation is such that :math:`P_{damp} += \frac{1}{Q}` where Q is the mass. + +---------- + +The *couple* keyword allows two or three of the diagonal components of +the pressure tensor to be "coupled" together. The value specified +with the keyword determines which are coupled. For example, *xz* +means the *Pxx* and *Pzz* components of the stress tensor are coupled. +*Xyz* means all 3 diagonal components are coupled. Coupling means two +things: the instantaneous stress will be computed as an average of the +corresponding diagonal components, and the coupled box dimensions will +be changed together in lockstep, meaning coupled dimensions will be +dilated or contracted by the same percentage every timestep. The +*Pstart*, *Pstop*, *Pdamp* parameters for any coupled dimensions must +be identical. *Couple xyz* can be used for a 2d simulation; the *z* +dimension is simply ignored. + +---------- + +The *iso* and *aniso* keywords are simply shortcuts that are +equivalent to specifying several other keywords together. + +The keyword *iso* means couple all 3 diagonal components together when +pressure is computed (hydrostatic pressure), and dilate/contract the +dimensions together. Using "iso Pstart Pstop Pdamp" is the same as +specifying these 4 keywords: + +.. parsed-literal:: + + x Pstart Pstop Pdamp + y Pstart Pstop Pdamp + z Pstart Pstop Pdamp + couple xyz + +The keyword *aniso* means *x*, *y*, and *z* dimensions are controlled +independently using the *Pxx*, *Pyy*, and *Pzz* components of the +stress tensor as the driving forces, and the specified scalar external +pressure. Using "aniso Pstart Pstop Pdamp" is the same as specifying +these 4 keywords: + +.. parsed-literal:: + + x Pstart Pstop Pdamp + y Pstart Pstop Pdamp + z Pstart Pstop Pdamp + couple none + +---------- + +This fix computes pressure each timestep. To do +this, the fix creates its own computes of style "pressure", +as if this command had been issued: + +.. code-block:: LAMMPS + + compute fix-ID_press group-ID pressure fix-ID_NULL virial + +See the :doc:`compute pressure ` command for details. Note +that the IDs of the new compute is the fix-ID + underscore + "press" and the +group for the new computes is the same as the fix group. + +Note that this is NOT the compute used by thermodynamic output (see +the :doc:`thermo_style ` command) with ID = *thermo_press*. +This means you can change the attributes of this fix's pressure via the +:doc:`compute_modify ` command or print this temperature +or pressure during thermodynamic output via the :doc:`thermo_style custom ` command using the appropriate compute-ID. +It also means that changing attributes of *thermo_temp* or +*thermo_press* will have no effect on this fix. + +Restart, fix_modify, output, run start/stop, minimize info +""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" + +No information about this fix is written to :doc:`binary restart files `. + +The :doc:`fix_modify ` *press* option is +supported by this fix. You can use it to assign a +:doc:`compute ` you have defined to this fix which will be used +in its pressure calculations. + +No global or per-atom quantities are stored by this fix for access by +various :doc:`output commands `. + +This fix can ramp its target pressure over multiple runs, using the +*start* and *stop* keywords of the :doc:`run ` command. See the +:doc:`run ` command for details of how to do this. + +This fix is not invoked during :doc:`energy minimization `. + +Restrictions +"""""""""""" + +Any dimension being adjusted by this fix must be periodic. + +Related commands +"""""""""""""""" + +:doc:`fix nve `, :doc:`fix nph `, :doc:`fix npt `, :doc:`fix langevin `, +:doc:`fix_modify ` + +Default +""""""" + +The keyword defaults are dilate = all, friction = 0.0001 in units of +pressure for whatever :doc:`units ` are defined. + +---------- + +.. _Grønbech: + +**(Grønbech)** Grønbech-Jensen, Farago, J Chem Phys, 141, 194108 (2014). From ab925000fe4a0da5dffcd14b1be897c20a039c75 Mon Sep 17 00:00:00 2001 From: Germain Clavier Date: Fri, 19 May 2023 16:34:42 +0200 Subject: [PATCH 004/219] Added triclinic and relative remap functions to press/langevin files --- src/fix_press_langevin.cpp | 235 +++++++++++++++++++++++++++++++++---- src/fix_press_langevin.h | 18 ++- 2 files changed, 224 insertions(+), 29 deletions(-) diff --git a/src/fix_press_langevin.cpp b/src/fix_press_langevin.cpp index 246d2f08f1..0848cc9ab6 100644 --- a/src/fix_press_langevin.cpp +++ b/src/fix_press_langevin.cpp @@ -26,6 +26,7 @@ #include "fix_deform.h" #include "force.h" #include "group.h" +#include "irregular.h" #include "kspace.h" #include "modify.h" #include "random_mars.h" @@ -37,14 +38,17 @@ using namespace LAMMPS_NS; using namespace FixConst; +#define DELTAFLIP 0.1 +#define TILTMAX 1.5 + enum{NONE,XYZ,XY,YZ,XZ}; -enum{ISO,ANISO}; +enum{ISO,ANISO,TRICLINIC}; /* ---------------------------------------------------------------------- */ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : Fix(lmp, narg, arg), - id_press(nullptr), pflag(0), random(nullptr) + id_press(nullptr), pflag(0), random(nullptr), irregular(nullptr) { if (narg < 5) error->all(FLERR,"Illegal fix press/langevin command"); @@ -58,13 +62,15 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : pcouple = NONE; allremap = 1; + pre_exchange_flag = 0; + flipflag = 1; // Alpha friction coefficient p_fric = 1e-4; // Target temperature t_start = t_stop = t_target = 0.0; - for (int i = 0; i < 3; i++) { + for (int i = 0; i < 6; i++) { // Pressure and pistons mass Q p_start[i] = p_stop[i] = p_period[i] = 0.0; p_flag[i] = 0; @@ -113,7 +119,28 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : p_flag[2] = 0; } iarg += 4; - + } else if (strcmp(arg[iarg],"tri") == 0) { + if (iarg+4 > narg) + error->all(FLERR,"Illegal fix press/langevin command"); + pcouple = NONE; + p_start[0] = p_start[1] = p_start[2] = utils::numeric(FLERR,arg[iarg+1],false,lmp); + p_stop[0] = p_stop[1] = p_stop[2] = utils::numeric(FLERR,arg[iarg+2],false,lmp); + p_period[0] = p_period[1] = p_period[2] = utils::numeric(FLERR,arg[iarg+3],false,lmp); + p_flag[0] = p_flag[1] = p_flag[2] = 1; + p_start[3] = p_start[4] = p_start[5] = 0.0; + p_stop[3] = p_stop[4] = p_stop[5] = 0.0; + p_period[3] = p_period[4] = p_period[5] = + utils::numeric(FLERR,arg[iarg+3],false,lmp); + p_flag[3] = p_flag[4] = p_flag[5] = 1; + if (dimension == 2) { + p_start[2] = p_stop[2] = p_period[2] = 0.0; + p_flag[2] = 0; + p_start[3] = p_stop[3] = p_period[3] = 0.0; + p_flag[3] = 0; + p_start[4] = p_stop[4] = p_period[4] = 0.0; + p_flag[4] = 0; + } + iarg += 4; } else if (strcmp(arg[iarg],"x") == 0) { if (iarg+4 > narg) error->all(FLERR,"Illegal fix press/langevin command"); @@ -140,6 +167,37 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : iarg += 4; if (dimension == 2) error->all(FLERR,"Invalid fix press/langevin for a 2d simulation"); + } else if (strcmp(arg[iarg],"xy") == 0) { + if (iarg+4 > narg) utils::missing_cmd_args(FLERR, fmt::format("fix {} yz", style), error); + p_start[3] = utils::numeric(FLERR,arg[iarg+1],false,lmp); + p_stop[3] = utils::numeric(FLERR,arg[iarg+2],false,lmp); + p_period[3] = utils::numeric(FLERR,arg[iarg+3],false,lmp); + p_flag[3] = 1; + iarg += 4; + if (dimension == 2) error->all(FLERR,"Invalid fix {} command for a 2d simulation", style); + + } else if (strcmp(arg[iarg],"xz") == 0) { + if (iarg+4 > narg) utils::missing_cmd_args(FLERR, fmt::format("fix {} xz", style), error); + p_start[4] = utils::numeric(FLERR,arg[iarg+1],false,lmp); + p_stop[4] = utils::numeric(FLERR,arg[iarg+2],false,lmp); + p_period[4] = utils::numeric(FLERR,arg[iarg+3],false,lmp); + p_flag[4] = 1; + iarg += 4; + if (dimension == 2) error->all(FLERR,"Invalid fix {} command for a 2d simulation", style); + + } else if (strcmp(arg[iarg],"yz") == 0) { + if (iarg+4 > narg) utils::missing_cmd_args(FLERR, fmt::format("fix {} xy", style), error); + p_start[5] = utils::numeric(FLERR,arg[iarg+1],false,lmp); + p_stop[5] = utils::numeric(FLERR,arg[iarg+2],false,lmp); + p_period[5] = utils::numeric(FLERR,arg[iarg+3],false,lmp); + p_flag[5] = 1; + iarg += 4; + if (dimension == 2) error->all(FLERR,"Invalid fix {} command for a 2d simulation", style); + + } else if (strcmp(arg[iarg],"flip") == 0) { + if (iarg+2 > narg) utils::missing_cmd_args(FLERR, fmt::format("fix {} flip", style), error); + flipflag = utils::logical(FLERR,arg[iarg+1],false,lmp); + iarg += 2; } else if (strcmp(arg[iarg],"couple") == 0) { if (iarg+2 > narg) @@ -212,6 +270,17 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : error->all(FLERR, "Cannot use fix press/langevin on a non-periodic dimension"); + // require periodicity in 2nd dim of off-diagonal tilt component + + if (p_flag[3] && domain->zperiodic == 0) + error->all(FLERR, "Cannot use fix {} on a 2nd non-periodic dimension", style); + if (p_flag[4] && domain->zperiodic == 0) + error->all(FLERR, "Cannot use fix {} on a 2nd non-periodic dimension", style); + if (p_flag[5] && domain->yperiodic == 0) + error->all(FLERR, "Cannot use fix {} on a 2nd non-periodic dimension", style); + if (!domain->triclinic && (p_flag[3] || p_flag[4] || p_flag[5])) + error->all(FLERR,"Can not specify Pxy/Pxz/Pyz in fix {} with non-triclinic box", style); + if (pcouple == XYZ && dimension == 3 && (p_start[0] != p_start[1] || p_start[0] != p_start[2] || p_stop[0] != p_stop[1] || p_stop[0] != p_stop[2] || @@ -234,26 +303,35 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : p_period[0] != p_period[2])) error->all(FLERR,"Invalid fix press/langevin pressure settings"); - if (t_start < 0.0) - error->all(FLERR,"Fix press/langevin temperature parameters must be >= 0.0"); - if (t_stop < 0.0) + if (t_start < 0.0 || t_stop < 0.0) error->all(FLERR,"Fix press/langevin temperature parameters must be >= 0.0"); if ((p_flag[0] && p_period[0] <= 0.0) || (p_flag[1] && p_period[1] <= 0.0) || - (p_flag[2] && p_period[2] <= 0.0)) + (p_flag[2] && p_period[2] <= 0.0) || + (p_flag[3] && p_period[3] <= 0.0) || + (p_flag[4] && p_period[4] <= 0.0) || + (p_flag[5] && p_period[5] <= 0.0)) error->all(FLERR,"Fix press/langevin damping parameters must be > 0.0"); - if (p_flag[0]) box_change |= BOX_CHANGE_X; - if (p_flag[1]) box_change |= BOX_CHANGE_Y; - if (p_flag[2]) box_change |= BOX_CHANGE_Z; - // pstyle = ISO if XYZ coupling or XY coupling in 2d -> 1 dof // else pstyle = ANISO -> 3 dof - if (pcouple == XYZ || (dimension == 2 && pcouple == XY)) pstyle = ISO; + if (p_flag[3] || p_flag[4] || p_flag[5]) pstyle = TRICLINIC; + else if (pcouple == XYZ || (dimension == 2 && pcouple == XY)) pstyle = ISO; else pstyle = ANISO; + // pre_exchange only required if flips can occur due to shape changes + + if (flipflag && (p_flag[3] || p_flag[4] || p_flag[5])) + pre_exchange_flag = pre_exchange_migrate = 1; + if (flipflag && (domain->yz != 0.0 || domain->xz != 0.0 || + domain->xy != 0.0)) + pre_exchange_flag = pre_exchange_migrate = 1; + + if (pre_exchange_flag) irregular = new Irregular(lmp); + else irregular = nullptr; + // C1 // Langevin GJF dynamics does NOT need a temperature compute // This is stated explicitely in their paper. @@ -278,7 +356,7 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : modify->add_compute(fmt::format("{} all pressure NULL virial",id_press, id_temp)); pflag = 1; - for (int i = 0; i < 3; i++) { + for (int i = 0; i < 6; i++) { gjfa[i] = (1.0 - update->dt / 2.0 / p_period[i]) / (1.0 + update->dt / 2.0 / p_period[i]); gjfb[i] = 1./(1.0 + update->dt / 2.0 / p_period[i]); } @@ -293,6 +371,8 @@ FixPressLangevin::~FixPressLangevin() { delete random; delete[] rfix; + delete irregular; + // delete temperature and pressure if fix created them @@ -308,6 +388,7 @@ int FixPressLangevin::setmask() mask |= INITIAL_INTEGRATE; mask |= POST_FORCE; mask |= END_OF_STEP; + if (pre_exchange_flag) mask |= PRE_EXCHANGE; return mask; } @@ -315,16 +396,14 @@ int FixPressLangevin::setmask() void FixPressLangevin::init() { - if (domain->triclinic) - error->all(FLERR,"Cannot use fix press/langevin with triclinic box"); - // ensure no conflict with fix deform for (const auto &ifix : modify->get_fix_list()) if (strcmp(ifix->style, "^deform") == 0) { int *dimflag = static_cast(ifix)->dimflag; if ((p_flag[0] && dimflag[0]) || (p_flag[1] && dimflag[1]) || - (p_flag[2] && dimflag[2])) + (p_flag[2] && dimflag[2]) || (p_flag[3] && dimflag[3]) || + (p_flag[4] && dimflag[4]) || (p_flag[5] && dimflag[5])) error->all(FLERR,"Cannot use fix press/langevin and " "fix deform on same component of stress tensor"); } @@ -386,14 +465,15 @@ void FixPressLangevin::initial_integrate(int /* vflag */) dt = update->dt; - for (int i = 0; i < 3; i++) { + for (int i = 0; i < 6; i++) { if (p_flag[i]) { // See equation 13 displacement = dt*p_deriv[i]*gjfb[i]; displacement += 0.5*dt*dt*f_piston[i]*gjfb[i]/p_period[i]; displacement += 0.5*dt*fran[i]*gjfb[i]/p_period[i]; dl = domain->boxhi[i] - domain->boxlo[i]; - dilation[i] = (dl + displacement)/dl; + if (i < 3) dilation[i] = (dl + displacement)/dl; + else dilation[i] = displacement; } } @@ -423,7 +503,7 @@ void FixPressLangevin::post_force(int /*vflag*/) couple_pressure(); couple_kinetic(t_target); - for (int i = 0; i < 3; i++) { + for (int i = 0; i < 6; i++) { if (p_flag[i]) { f_old_piston[i] = f_piston[i]; p_target[i] = p_start[i] + delta * (p_stop[i]-p_start[i]); @@ -445,7 +525,7 @@ void FixPressLangevin::end_of_step() double dt; dt = update->dt; - for (int i = 0; i < 3; i++) { + for (int i = 0; i < 6; i++) { if (p_flag[i]) { p_deriv[i] *= gjfa[i]; p_deriv[i] += 0.5*dt*(gjfa[i]*f_old_piston[i]+f_piston[i])/p_period[i]; @@ -483,6 +563,9 @@ void FixPressLangevin::couple_pressure() p_current[1] = tensor[1]; p_current[2] = tensor[2]; } + p_current[3] = tensor[3]; + p_current[4] = tensor[4]; + p_current[5] = tensor[5]; } /* ---------------------------------------------------------------------- */ @@ -511,6 +594,7 @@ void FixPressLangevin::couple_beta(double t_target) gamma = sqrt(2.0*force->boltz*update->dt*p_fric*t_target); fran[0] = fran[1] = fran[2] = 0.0; + fran[3] = fran[4] = fran[5] = 0.0; if (me == 0) { if (pstyle == ISO) fran[0] = fran[1] = fran[2] = gamma*random->gaussian(); @@ -530,8 +614,11 @@ void FixPressLangevin::couple_beta(double t_target) fran[1] = gamma*random->gaussian(); fran[2] = gamma*random->gaussian(); } + fran[3] = gamma*random->gaussian(); + fran[4] = gamma*random->gaussian(); + fran[5] = gamma*random->gaussian(); } - MPI_Bcast(&fran, 3, MPI_DOUBLE, 0, world); + MPI_Bcast(&fran, 6, MPI_DOUBLE, 0, world); } /* ---------------------------------------------------------------------- @@ -574,6 +661,19 @@ void FixPressLangevin::remap() } } + if (p_flag[3]) domain->xy += dilation[3]; + if (p_flag[4]) domain->xz += dilation[4]; + if (p_flag[5]) domain->yz += dilation[5]; + + if (domain->yz < -TILTMAX*domain->yprd || + domain->yz > TILTMAX*domain->yprd || + domain->xz < -TILTMAX*domain->xprd || + domain->xz > TILTMAX*domain->xprd || + domain->xy < -TILTMAX*domain->xprd || + domain->xy > TILTMAX*domain->xprd) + error->all(FLERR,"Fix {} has tilted box too far in one step - " + "periodic cell is too far from equilibrium state", style); + domain->set_global_box(); domain->set_local_box(); @@ -591,6 +691,85 @@ void FixPressLangevin::remap() modify->fix[rfix[i]]->deform(1); } +/* ---------------------------------------------------------------------- + if any tilt ratios exceed limits, set flip = 1 and compute new tilt values + do not flip in x or y if non-periodic (can tilt but not flip) + this is b/c the box length would be changed (dramatically) by flip + if yz tilt exceeded, adjust C vector by one B vector + if xz tilt exceeded, adjust C vector by one A vector + if xy tilt exceeded, adjust B vector by one A vector + check yz first since it may change xz, then xz check comes after + if any flip occurs, create new box in domain + image_flip() adjusts image flags due to box shape change induced by flip + remap() puts atoms outside the new box back into the new box + perform irregular on atoms in lamda coords to migrate atoms to new procs + important that image_flip comes before remap, since remap may change + image flags to new values, making eqs in doc of Domain:image_flip incorrect +------------------------------------------------------------------------- */ + +void FixPressLangevin::pre_exchange() +{ + double xprd = domain->xprd; + double yprd = domain->yprd; + + // flip is only triggered when tilt exceeds 0.5 by DELTAFLIP + // this avoids immediate re-flipping due to tilt oscillations + + double xtiltmax = (0.5+DELTAFLIP)*xprd; + double ytiltmax = (0.5+DELTAFLIP)*yprd; + + int flipxy,flipxz,flipyz; + flipxy = flipxz = flipyz = 0; + + if (domain->yperiodic) { + if (domain->yz < -ytiltmax) { + domain->yz += yprd; + domain->xz += domain->xy; + flipyz = 1; + } else if (domain->yz >= ytiltmax) { + domain->yz -= yprd; + domain->xz -= domain->xy; + flipyz = -1; + } + } + + if (domain->xperiodic) { + if (domain->xz < -xtiltmax) { + domain->xz += xprd; + flipxz = 1; + } else if (domain->xz >= xtiltmax) { + domain->xz -= xprd; + flipxz = -1; + } + if (domain->xy < -xtiltmax) { + domain->xy += xprd; + flipxy = 1; + } else if (domain->xy >= xtiltmax) { + domain->xy -= xprd; + flipxy = -1; + } + } + + int flip = 0; + if (flipxy || flipxz || flipyz) flip = 1; + + if (flip) { + domain->set_global_box(); + domain->set_local_box(); + + domain->image_flip(flipxy,flipxz,flipyz); + + double **x = atom->x; + imageint *image = atom->image; + int nlocal = atom->nlocal; + for (int i = 0; i < nlocal; i++) domain->remap(x[i],image[i]); + + domain->x2lamda(atom->nlocal); + irregular->migrate_atoms(); + domain->lamda2x(atom->nlocal); + } +} + /* ---------------------------------------------------------------------- */ int FixPressLangevin::modify_param(int narg, char **arg) @@ -612,3 +791,13 @@ int FixPressLangevin::modify_param(int narg, char **arg) } return 0; } + +/* ---------------------------------------------------------------------- */ + +void FixPressLangevin::reset_dt() +{ + for (int i=0; i<6; i++) { + gjfa[i] = (1.0 - update->dt / 2.0 / p_period[i]) / (1.0 + update->dt / 2.0 / p_period[i]); + gjfb[i] = sqrt(1.0 + update->dt / 2.0 / p_period[i]); + } +} diff --git a/src/fix_press_langevin.h b/src/fix_press_langevin.h index a0ea8bbd5a..b5a62d2646 100644 --- a/src/fix_press_langevin.h +++ b/src/fix_press_langevin.h @@ -31,23 +31,25 @@ class FixPressLangevin : public Fix { int setmask() override; void init() override; void setup(int) override; + void pre_exchange() override; void initial_integrate(int) override; void post_force(int) override; void end_of_step() override; + void reset_dt() override; int modify_param(int, char **) override; protected: int dimension, which; int pstyle, pcouple, allremap; - int p_flag[3]; // 1 if control P on this dim, 0 if not + int p_flag[6]; // 1 if control P on this dim, 0 if not double t_start, t_stop, t_target; double p_fric; - double p_start[3], p_stop[3], p_current[3]; - double p_period[3], p_target[3]; - double p_deriv[3], dilation[3]; - double f_piston[3], f_old_piston[3]; - double gjfa[3], gjfb[3], fran[3]; + double p_start[6], p_stop[6], p_current[6]; + double p_period[6], p_target[6]; + double p_deriv[6], dilation[6]; + double f_piston[6], f_old_piston[6]; + double gjfa[6], gjfb[6], fran[6]; int kspace_flag; // 1 if KSpace invoked, 0 if not int nrigid; // number of rigid fixes int *rfix; // indices of rigid fixes @@ -56,6 +58,10 @@ class FixPressLangevin : public Fix { class Compute *temperature, *pressure; int pflag; + int flipflag; + int pre_exchange_flag; // set if pre_exchange needed for box flips + class Irregular *irregular; // for migrating atoms after box flips + class RanMars *random; int seed; From 93402f61d82f99453317464491b5a3e058bcd30c Mon Sep 17 00:00:00 2001 From: Germain Clavier Date: Sat, 20 May 2023 08:58:52 +0200 Subject: [PATCH 005/219] Updated the documentation to include triclinic commands and other info. --- doc/src/fix_press_langevin.rst | 77 +++++++++++++++++++++------------- 1 file changed, 49 insertions(+), 28 deletions(-) diff --git a/doc/src/fix_press_langevin.rst b/doc/src/fix_press_langevin.rst index cb46d2b7d9..9401e035a3 100644 --- a/doc/src/fix_press_langevin.rst +++ b/doc/src/fix_press_langevin.rst @@ -16,15 +16,15 @@ Syntax .. parsed-literal:: one or more keyword value pairs may be appended - keyword = *iso* or *aniso* or *x* or *y* or *z* or *couple* or *dilate* or *modulus* or *temp* - *iso* or *aniso* values = Pstart Pstop Pdamp + keyword = *iso* or *aniso* or *tri* *x* or *y* or *z* or *xy* or *xz* or *yz* or *couple* or *dilate* or *modulus* or *temp* + *iso* or *aniso* or *tri* values = Pstart Pstop Pdamp Pstart,Pstop = scalar external pressure at start/end of run (pressure units) Pdamp = pressure damping parameter - *x* or *y* or *z* values = Pstart Pstop Pdamp + *x* or *y* or *z* or *xy* or *xz* or *yz* values = Pstart Pstop Pdamp Pstart,Pstop = external stress tensor component at start/end of run (pressure units) Pdamp = stress damping parameter *couple* = *none* or *xyz* or *xy* or *yz* or *xz* - *friction* value = Friction to apply to the barostat + *friction* value = Alpha friction value to apply to the barostat *temp* values = Tstart, Tstop Tstart, Tstop = target temperature used for the barostat at start/end of run *dilate* value = *all* or *partial* @@ -95,26 +95,23 @@ discussion of different ways to perform barostatting. ---------- -The barostat is specified using one or more of the *iso*, *aniso*, -*x*, *y*, *z*, and *couple* keywords. These keywords give you the -ability to specify the 3 diagonal components of an external stress -tensor, and to couple various of these components together so that the -dimensions they represent are varied together during a -constant-pressure simulation. Unlike the :doc:`fix npt ` and -:doc:`fix nph ` commands, this fix cannot be used with triclinic -(non-orthogonal) simulation boxes to control all 6 components of the -general pressure tensor. +The barostat is specified using one or more of the *iso*, *aniso*, *tri* *x*, +*y*, *z*, *xy*, *xz*, *yz*, and *couple* keywords. These keywords give you the +ability to specify the 3 diagonal components of an external stress tensor, and +to couple various of these components together so that the dimensions they +represent are varied together during a constant-pressure simulation. -The target pressures for each of the 3 diagonal components of the -stress tensor can be specified independently via the *x*, *y*, *z*, -keywords, which correspond to the 3 simulation box dimensions. For -each component, the external pressure or tensor component at each -timestep is a ramped value during the run from *Pstart* to *Pstop*\ . -If a target pressure is specified for a component, then the -corresponding box dimension will change during a simulation. For -example, if the *y* keyword is used, the y-box length will change. A -box dimension will not change if that component is not specified, -although you have the option to change that dimension via the :doc:`fix deform ` command. +The target pressures for each of the 6 diagonal components of the stress tensor +can be specified independently via the *x*, *y*, *z*, keywords, which +correspond to the 3 simulation box dimensions, and the *xy*, *xz and *yz* +keywords which corresponds to the 3 simulqtion box tilt factors. For each +component, the external pressure or tensor component at each timestep is a +ramped value during the run from *Pstart* to *Pstop*\ . If a target pressure is +specified for a component, then the corresponding box dimension will change +during a simulation. For example, if the *y* keyword is used, the y-box length +will change. A box dimension will not change if that component is not +specified, although you have the option to change that dimension via the +:doc:`fix deform ` command. For all barostat keywords, the *Pdamp* parameter determines the "mass" of the pseudo particle acting as a barostat. The relation is such that :math:`P_{damp} @@ -137,7 +134,7 @@ dimension is simply ignored. ---------- -The *iso* and *aniso* keywords are simply shortcuts that are +The *iso*, *aniso* and *tri* keywords are simply shortcuts that are equivalent to specifying several other keywords together. The keyword *iso* means couple all 3 diagonal components together when @@ -165,6 +162,24 @@ these 4 keywords: z Pstart Pstop Pdamp couple none +The keyword *tri* is the same as *aniso* but also adds the control on the +shear pressure coupled with the tilt factors. + +.. parsed-literal:: + + x Pstart Pstop Pdamp + y Pstart Pstop Pdamp + z Pstart Pstop Pdamp + xy Pstart Pstop Pdamp + xz Pstart Pstop Pdamp + yz Pstart Pstop Pdamp + couple none + +---------- + +The *friction* keyword sets the friction parameter :math:`\alpha` in the +equations of movement of the barostat. All the barostat use the same value. + ---------- This fix computes pressure each timestep. To do @@ -173,7 +188,10 @@ as if this command had been issued: .. code-block:: LAMMPS - compute fix-ID_press group-ID pressure fix-ID_NULL virial + compute fix-ID_press group-ID pressure NULL virial + +The kinetic contribution to the pressure is taken as the ensemble value +:math:`\frac{Nk_bT}{V}` and computed by the fix itself. See the :doc:`compute pressure ` command for details. Note that the IDs of the new compute is the fix-ID + underscore + "press" and the @@ -200,9 +218,12 @@ in its pressure calculations. No global or per-atom quantities are stored by this fix for access by various :doc:`output commands `. -This fix can ramp its target pressure over multiple runs, using the -*start* and *stop* keywords of the :doc:`run ` command. See the -:doc:`run ` command for details of how to do this. +This fix can ramp its target pressure and temperature over multiple runs, using +the *start* and *stop* keywords of the :doc:`run ` command. See the +:doc:`run ` command for details of how to do this. It is recommended that +the ramped temperature is the same as the effective temperature of the +thermalised system. That is, if the system's temperature is ramped by other +commands, it is recommended to do the same with this pressure control. This fix is not invoked during :doc:`energy minimization `. From 68ec36b0068015f037ef9fcd0fcf1649bae1e31c Mon Sep 17 00:00:00 2001 From: Germain Clavier Date: Sat, 20 May 2023 09:16:30 +0200 Subject: [PATCH 006/219] Added the flip keyword to the documentation of fix_press_langevin. --- doc/src/fix_press_langevin.rst | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/doc/src/fix_press_langevin.rst b/doc/src/fix_press_langevin.rst index 9401e035a3..01d66d08c6 100644 --- a/doc/src/fix_press_langevin.rst +++ b/doc/src/fix_press_langevin.rst @@ -16,13 +16,14 @@ Syntax .. parsed-literal:: one or more keyword value pairs may be appended - keyword = *iso* or *aniso* or *tri* *x* or *y* or *z* or *xy* or *xz* or *yz* or *couple* or *dilate* or *modulus* or *temp* + keyword = *iso* or *aniso* or *tri* or *x* or *y* or *z* or *xy* or *xz* or *yz* or *couple* or *dilate* or *modulus* or *temp* or *flip* *iso* or *aniso* or *tri* values = Pstart Pstop Pdamp Pstart,Pstop = scalar external pressure at start/end of run (pressure units) Pdamp = pressure damping parameter *x* or *y* or *z* or *xy* or *xz* or *yz* values = Pstart Pstop Pdamp Pstart,Pstop = external stress tensor component at start/end of run (pressure units) Pdamp = stress damping parameter + *flip* value = *yes* or *no* = allow or disallow box flips when it becomes highly skewed *couple* = *none* or *xyz* or *xy* or *yz* or *xz* *friction* value = Alpha friction value to apply to the barostat *temp* values = Tstart, Tstop @@ -177,6 +178,20 @@ shear pressure coupled with the tilt factors. ---------- +The *flip* keyword allows the tilt factors for a triclinic box to +exceed half the distance of the parallel box length, as discussed +below. If the *flip* value is set to *yes*, the bound is enforced by +flipping the box when it is exceeded. If the *flip* value is set to +*no*, the tilt will continue to change without flipping. Note that if +applied stress induces large deformations (e.g. in a liquid), this +means the box shape can tilt dramatically and LAMMPS will run less +efficiently, due to the large volume of communication needed to +acquire ghost atoms around a processor's irregular-shaped subdomain. +For extreme values of tilt, LAMMPS may also lose atoms and generate an +error. + +---------- + The *friction* keyword sets the friction parameter :math:`\alpha` in the equations of movement of the barostat. All the barostat use the same value. From a0a0812ebfb996c7f71ec34c5b3e6b6fd384f3b5 Mon Sep 17 00:00:00 2001 From: Aidan Thompson Date: Wed, 24 May 2023 14:33:34 -0600 Subject: [PATCH 007/219] Added link to fix press/berendsen and fixed minor typos --- doc/src/fix_press_langevin.rst | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/doc/src/fix_press_langevin.rst b/doc/src/fix_press_langevin.rst index 01d66d08c6..f7f0f04e9f 100644 --- a/doc/src/fix_press_langevin.rst +++ b/doc/src/fix_press_langevin.rst @@ -104,8 +104,8 @@ represent are varied together during a constant-pressure simulation. The target pressures for each of the 6 diagonal components of the stress tensor can be specified independently via the *x*, *y*, *z*, keywords, which -correspond to the 3 simulation box dimensions, and the *xy*, *xz and *yz* -keywords which corresponds to the 3 simulqtion box tilt factors. For each +correspond to the 3 simulation box dimensions, and the *xy*, *xz* and *yz* +keywords which corresponds to the 3 simulation box tilt factors. For each component, the external pressure or tensor component at each timestep is a ramped value during the run from *Pstart* to *Pstop*\ . If a target pressure is specified for a component, then the corresponding box dimension will change @@ -250,6 +250,7 @@ Any dimension being adjusted by this fix must be periodic. Related commands """""""""""""""" +:doc:`fix press/berendsen `, :doc:`fix nve `, :doc:`fix nph `, :doc:`fix npt `, :doc:`fix langevin `, :doc:`fix_modify ` From a4e7966da5021e2e6f9ef79b17a2c1c88f8e747e Mon Sep 17 00:00:00 2001 From: Germain Clavier Date: Tue, 6 Jun 2023 09:11:27 +0200 Subject: [PATCH 008/219] Fixed some error messages for consistency. Seed did not need comm->me addition. --- src/fix_press_langevin.cpp | 84 +++++++++++++++++++++----------------- 1 file changed, 46 insertions(+), 38 deletions(-) diff --git a/src/fix_press_langevin.cpp b/src/fix_press_langevin.cpp index 0848cc9ab6..cfec66f8d3 100644 --- a/src/fix_press_langevin.cpp +++ b/src/fix_press_langevin.cpp @@ -65,16 +65,19 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : pre_exchange_flag = 0; flipflag = 1; - // Alpha friction coefficient - p_fric = 1e-4; + // Piston mass + p_mass = 1e-3; + // Target temperature t_start = t_stop = t_target = 0.0; for (int i = 0; i < 6; i++) { - // Pressure and pistons mass Q + // Pressure and pistons period tau_p p_start[i] = p_stop[i] = p_period[i] = 0.0; p_flag[i] = 0; + p_fric[i] = 0.; + // Pistons coordinates derivative V p_deriv[i] = 0.0; @@ -210,16 +213,13 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : else error->all(FLERR,"Illegal fix press/langevin command"); iarg += 2; - } else if (strcmp(arg[iarg],"friction") == 0) { - if (iarg+3 > narg) + } else if (strcmp(arg[iarg],"mass") == 0) { + if (iarg+2 > narg) error->all(FLERR,"Illegal fix press/langevin command"); - p_fric = utils::numeric(FLERR,arg[iarg+1],false,lmp); - seed = utils::numeric(FLERR,arg[iarg+2],false,lmp); - if (p_fric <= 0.0) + p_mass = utils::numeric(FLERR,arg[iarg+1],false,lmp); + if (p_mass <= 0.0) error->all(FLERR,"Illegal fix press/langevin command"); - if (seed <= 0.0) - error->all(FLERR,"Illegal fix press/langevin command"); - iarg += 3; + iarg += 2; } else if (strcmp(arg[iarg],"dilate") == 0) { if (iarg+2 > narg) error->all(FLERR,"Illegal fix press/langevin command"); @@ -228,11 +228,14 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : else error->all(FLERR,"Illegal fix press/langevin command"); iarg += 2; } else if (strcmp(arg[iarg], "temp") == 0) { - if (iarg+3 > narg) + if (iarg+4 > narg) error->all(FLERR,"Illegal fix press/langevin command"); t_start = utils::numeric(FLERR,arg[iarg+1],false,lmp); t_stop = utils::numeric(FLERR,arg[iarg+2],false,lmp); - iarg += 3; + seed = utils::numeric(FLERR,arg[iarg+3],false,lmp); + if (seed <= 0.0) + error->all(FLERR,"Illegal fix press/langevin command"); + iarg += 4; } else error->all(FLERR,"Illegal fix press/langevin command"); @@ -240,7 +243,7 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : if (allremap == 0) restart_pbc = 1; - random = new RanMars(lmp, seed + comm->me); + random = new RanMars(lmp, seed); // error checks @@ -356,9 +359,13 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : modify->add_compute(fmt::format("{} all pressure NULL virial",id_press, id_temp)); pflag = 1; + // p_fric is alpha coeff from GJF + // with alpha = Q/p_period + // similar to fix_langevin formalism for (int i = 0; i < 6; i++) { - gjfa[i] = (1.0 - update->dt / 2.0 / p_period[i]) / (1.0 + update->dt / 2.0 / p_period[i]); - gjfb[i] = 1./(1.0 + update->dt / 2.0 / p_period[i]); + p_fric[i] = p_mass/p_period[i]; + gjfa[i] = (1.0 - p_fric[i] * update->dt / 2.0 / p_mass) / (1.0 + p_fric[i] * update->dt / 2.0 / p_mass); + gjfb[i] = 1./(1.0 + p_fric[i] * update->dt / 2.0 / p_mass); } nrigid = 0; @@ -469,8 +476,8 @@ void FixPressLangevin::initial_integrate(int /* vflag */) if (p_flag[i]) { // See equation 13 displacement = dt*p_deriv[i]*gjfb[i]; - displacement += 0.5*dt*dt*f_piston[i]*gjfb[i]/p_period[i]; - displacement += 0.5*dt*fran[i]*gjfb[i]/p_period[i]; + displacement += 0.5*dt*dt*f_piston[i]*gjfb[i]/p_mass; + displacement += 0.5*dt*fran[i]*gjfb[i]/p_mass; dl = domain->boxhi[i] - domain->boxlo[i]; if (i < 3) dilation[i] = (dl + displacement)/dl; else dilation[i] = displacement; @@ -528,8 +535,8 @@ void FixPressLangevin::end_of_step() for (int i = 0; i < 6; i++) { if (p_flag[i]) { p_deriv[i] *= gjfa[i]; - p_deriv[i] += 0.5*dt*(gjfa[i]*f_old_piston[i]+f_piston[i])/p_period[i]; - p_deriv[i] += fran[i]*gjfb[i]/p_period[i]; + p_deriv[i] += 0.5*dt*(gjfa[i]*f_old_piston[i]+f_piston[i])/p_mass; + p_deriv[i] += fran[i]*gjfb[i]/p_mass; } } @@ -588,35 +595,36 @@ void FixPressLangevin::couple_kinetic(double t_target) void FixPressLangevin::couple_beta(double t_target) { - double gamma; + double gamma[6]; int me = comm->me; - gamma = sqrt(2.0*force->boltz*update->dt*p_fric*t_target); + for (int i=0; i<6; i++) + gamma[i] = sqrt(2.0*force->boltz*update->dt*p_fric[i]*t_target); fran[0] = fran[1] = fran[2] = 0.0; fran[3] = fran[4] = fran[5] = 0.0; if (me == 0) { if (pstyle == ISO) - fran[0] = fran[1] = fran[2] = gamma*random->gaussian(); + fran[0] = fran[1] = fran[2] = gamma[0]*random->gaussian(); else if (pcouple == XYZ) { - fran[0] = fran[1] = fran[2] = gamma*random->gaussian(); + fran[0] = fran[1] = fran[2] = gamma[0]*random->gaussian(); } else if (pcouple == XY) { - fran[0] = fran[1] = gamma*random->gaussian(); - fran[2] = gamma*random->gaussian(); + fran[0] = fran[1] = gamma[0]*random->gaussian(); + fran[2] = gamma[2]*random->gaussian(); } else if (pcouple == YZ) { - fran[1] = fran[2] = gamma*random->gaussian(); - fran[0] = gamma*random->gaussian(); + fran[1] = fran[2] = gamma[1]*random->gaussian(); + fran[0] = gamma[0]*random->gaussian(); } else if (pcouple == XZ) { - fran[0] = fran[2] = gamma*random->gaussian(); - fran[1] = gamma*random->gaussian(); + fran[0] = fran[2] = gamma[0]*random->gaussian(); + fran[1] = gamma[1]*random->gaussian(); } else { - fran[0] = gamma*random->gaussian(); - fran[1] = gamma*random->gaussian(); - fran[2] = gamma*random->gaussian(); + fran[0] = gamma[0]*random->gaussian(); + fran[1] = gamma[1]*random->gaussian(); + fran[2] = gamma[2]*random->gaussian(); } - fran[3] = gamma*random->gaussian(); - fran[4] = gamma*random->gaussian(); - fran[5] = gamma*random->gaussian(); + fran[3] = gamma[3]*random->gaussian(); + fran[4] = gamma[4]*random->gaussian(); + fran[5] = gamma[5]*random->gaussian(); } MPI_Bcast(&fran, 6, MPI_DOUBLE, 0, world); } @@ -797,7 +805,7 @@ int FixPressLangevin::modify_param(int narg, char **arg) void FixPressLangevin::reset_dt() { for (int i=0; i<6; i++) { - gjfa[i] = (1.0 - update->dt / 2.0 / p_period[i]) / (1.0 + update->dt / 2.0 / p_period[i]); - gjfb[i] = sqrt(1.0 + update->dt / 2.0 / p_period[i]); + gjfa[i] = (1.0 - p_fric[i] * update->dt / 2.0 / p_mass) / (1.0 + p_fric[i] * update->dt / 2.0 / p_mass); + gjfb[i] = sqrt(1.0 + p_fric[i] * update->dt / 2.0 / p_mass); } } From 9a585f820488f5724ebe28ce4e53331293026076 Mon Sep 17 00:00:00 2001 From: Germain Clavier Date: Tue, 6 Jun 2023 09:14:23 +0200 Subject: [PATCH 009/219] Change variables names in header for consistency with GJF paper. --- src/fix_press_langevin.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/fix_press_langevin.h b/src/fix_press_langevin.h index b5a62d2646..d6ea9df714 100644 --- a/src/fix_press_langevin.h +++ b/src/fix_press_langevin.h @@ -44,9 +44,9 @@ class FixPressLangevin : public Fix { int pstyle, pcouple, allremap; int p_flag[6]; // 1 if control P on this dim, 0 if not double t_start, t_stop, t_target; - double p_fric; - double p_start[6], p_stop[6], p_current[6]; - double p_period[6], p_target[6]; + double p_mass; + double p_start[6], p_stop[6], p_period[6]; + double p_fric[6], p_target[6], p_current[6]; double p_deriv[6], dilation[6]; double f_piston[6], f_old_piston[6]; double gjfa[6], gjfb[6], fran[6]; From 0c2cd80028a309e34dfbd26debd8e2386a6e6330 Mon Sep 17 00:00:00 2001 From: Germain Clavier Date: Tue, 6 Jun 2023 09:37:34 +0200 Subject: [PATCH 010/219] Edited the documentation of fix_press_langevin to take changes into account. --- doc/src/fix_press_langevin.rst | 67 ++++++++++++++++++++++++---------- 1 file changed, 48 insertions(+), 19 deletions(-) diff --git a/doc/src/fix_press_langevin.rst b/doc/src/fix_press_langevin.rst index 01d66d08c6..550decdf8b 100644 --- a/doc/src/fix_press_langevin.rst +++ b/doc/src/fix_press_langevin.rst @@ -22,12 +22,13 @@ Syntax Pdamp = pressure damping parameter *x* or *y* or *z* or *xy* or *xz* or *yz* values = Pstart Pstop Pdamp Pstart,Pstop = external stress tensor component at start/end of run (pressure units) - Pdamp = stress damping parameter + Pdamp = pressure damping parameter *flip* value = *yes* or *no* = allow or disallow box flips when it becomes highly skewed *couple* = *none* or *xyz* or *xy* or *yz* or *xz* - *friction* value = Alpha friction value to apply to the barostat - *temp* values = Tstart, Tstop + *mass* value = Mass of the barostat fictious particle + *temp* values = Tstart, Tstop, seed Tstart, Tstop = target temperature used for the barostat at start/end of run + seed = seed of the random number generator *dilate* value = *all* or *partial* Examples @@ -35,8 +36,8 @@ Examples .. code-block:: LAMMPS - fix 1 all press/langevin iso 0.0 0.0 1000.0 temp 300 300 - fix 2 all press/langevin aniso 0.0 0.0 1000.0 temp 100 300 dilate partial + fix 1 all press/langevin iso 0.0 0.0 1000.0 temp 300 300 487374 + fix 2 all press/langevin aniso 0.0 0.0 1000.0 temp 100 300 238 dilate partial Description """"""""""" @@ -114,9 +115,28 @@ will change. A box dimension will not change if that component is not specified, although you have the option to change that dimension via the :doc:`fix deform ` command. -For all barostat keywords, the *Pdamp* parameter determines the "mass" of the -pseudo particle acting as a barostat. The relation is such that :math:`P_{damp} -= \frac{1}{Q}` where Q is the mass. +For all barostat keywords, the *Pdamp* parameter determines the "friction +parameter" :math:`\alpha` of the pseudo particle acting as a barostat. The +relation is such that :math:`\alpha = \frac{Q}{P_{damp}}` where Q is the mass. + +.. note:: + + As for Berendsen barostat, a Langevin barostat will not work well for + arbitrary values of *Pdamp*\ . If *Pdamp* is too small, the pressure and + volume can fluctuate wildly; if it is too large, the pressure will take a + very long time to equilibrate. A good choice for many models is a *Pdamp* + of around 1000 timesteps. However, note that *Pdamp* is specified in time + units, and that timesteps are NOT the same as time units for most + :doc:`units ` settings. + +---------- + +The *temp* keyword sets the temperature to use in the equation of motion of the +barostat. This value is used to compute the value of the force :math:`f_P` in +the equation of motion. It is important to note that this value is not the +instantaneous temperature but a target temperature that ramps from *Tstart* to +*Tstop*. Also the required argument *seed* also sets the seed for the random +number generator used in the generation of the random forces. ---------- @@ -192,12 +212,20 @@ error. ---------- -The *friction* keyword sets the friction parameter :math:`\alpha` in the +The *mass* keyword sets the mass parameter :math:`Q` in the equations of movement of the barostat. All the barostat use the same value. +.. note:: + + The same recommandation with regard to the bulk modulus of a berendsen + barostat applies to a Langevin barostat mass. It is however important to + note that not only the absolute value used for the mass is important, but + also its ratio with Pdamp values which defines the friction coeffiction + value. + ---------- -This fix computes pressure each timestep. To do +This fix computes pressure each timestep. To do this, the fix creates its own computes of style "pressure", as if this command had been issued: @@ -212,13 +240,14 @@ See the :doc:`compute pressure ` command for details. Note that the IDs of the new compute is the fix-ID + underscore + "press" and the group for the new computes is the same as the fix group. -Note that this is NOT the compute used by thermodynamic output (see -the :doc:`thermo_style ` command) with ID = *thermo_press*. -This means you can change the attributes of this fix's pressure via the -:doc:`compute_modify ` command or print this temperature -or pressure during thermodynamic output via the :doc:`thermo_style custom ` command using the appropriate compute-ID. -It also means that changing attributes of *thermo_temp* or -*thermo_press* will have no effect on this fix. +Note that this is NOT the compute used by thermodynamic output (see the +:doc:`thermo_style ` command) with ID = *thermo_press*. This +means you can change the attributes of this fix's pressure via the +:doc:`compute_modify ` command or print this temperature or +pressure during thermodynamic output via the :doc:`thermo_style custom +` command using the appropriate compute-ID. It also means that +changing attributes of *thermo_temp* or *thermo_press* will have no effect on +this fix. Restart, fix_modify, output, run start/stop, minimize info """"""""""""""""""""""""""""""""""""""""""""""""""""""""""" @@ -256,8 +285,8 @@ Related commands Default """"""" -The keyword defaults are dilate = all, friction = 0.0001 in units of -pressure for whatever :doc:`units ` are defined. +The keyword defaults are dilate = all and mass = 0.001 in units of mass for +whatever :doc:`units ` defined. ---------- From bb1ff49af62dbebd74802a77fe170411032ff978 Mon Sep 17 00:00:00 2001 From: Germain Clavier Date: Wed, 7 Jun 2023 14:03:40 +0200 Subject: [PATCH 011/219] Corrected bug from f_piston not initialised. Removed superfluous temp compute id variable name --- src/fix_press_langevin.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/fix_press_langevin.cpp b/src/fix_press_langevin.cpp index cfec66f8d3..ec8f034181 100644 --- a/src/fix_press_langevin.cpp +++ b/src/fix_press_langevin.cpp @@ -87,6 +87,7 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : // Random value for each piston fran[i] = 0.0; + f_piston[i] = 0.0; } // process keywords @@ -356,7 +357,7 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : // pass id_temp as 4th arg to pressure constructor id_press = utils::strdup(std::string(id) + "_press"); - modify->add_compute(fmt::format("{} all pressure NULL virial",id_press, id_temp)); + modify->add_compute(fmt::format("{} all pressure NULL virial", id_press)); pflag = 1; // p_fric is alpha coeff from GJF From bacfcd205093c626a30f43e157704118d001f945 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Fri, 7 Jul 2023 07:36:05 -0700 Subject: [PATCH 012/219] change triclinic logic to not depend on exact I,J atom coords --- src/npair_half_bin_newton_tri.cpp | 39 ++++++++++++++++++++++++++++--- src/npair_half_nsq_newton.cpp | 14 ++++++++++- 2 files changed, 49 insertions(+), 4 deletions(-) diff --git a/src/npair_half_bin_newton_tri.cpp b/src/npair_half_bin_newton_tri.cpp index 88ef993a41..227a25c321 100644 --- a/src/npair_half_bin_newton_tri.cpp +++ b/src/npair_half_bin_newton_tri.cpp @@ -16,6 +16,7 @@ #include "neigh_list.h" #include "atom.h" #include "atom_vec.h" +#include "force.h" #include "molecule.h" #include "domain.h" #include "my_page.h" @@ -36,10 +37,12 @@ NPairHalfBinNewtonTri::NPairHalfBinNewtonTri(LAMMPS *lmp) : NPair(lmp) {} void NPairHalfBinNewtonTri::build(NeighList *list) { int i,j,k,n,itype,jtype,ibin,which,imol,iatom,moltemplate; - tagint tagprev; + tagint itag,jtag,tagprev; double xtmp,ytmp,ztmp,delx,dely,delz,rsq; int *neighptr; - + + double angstrom = force->angstrom; + double **x = atom->x; int *type = atom->type; int *mask = atom->mask; @@ -68,6 +71,7 @@ void NPairHalfBinNewtonTri::build(NeighList *list) n = 0; neighptr = ipage->vget(); + itag = tag[i]; itype = type[i]; xtmp = x[i][0]; ytmp = x[i][1]; @@ -87,6 +91,34 @@ void NPairHalfBinNewtonTri::build(NeighList *list) ibin = atom2bin[i]; for (k = 0; k < nstencil; k++) { for (j = binhead[ibin+stencil[k]]; j >= 0; j = bins[j]) { + + if (j >= nlocal) { + jtag = tag[j]; + if (itag > jtag) { + if ((itag+jtag) % 2 == 0) continue; + } else if (itag < jtag) { + if ((itag+jtag) % 2 == 1) continue; + } else { + + if (fabs(x[j][2]-ztmp) > angstrom) { + if (x[j][2] < ztmp) continue; + } else if (fabs(x[j][1]-ytmp) > angstrom) { + if (x[j][1] < ytmp) continue; + } else { + if (x[j][0] < xtmp) continue; + } + + /* + if (x[j][2] < ztmp) continue; + if (x[j][2] == ztmp) { + if (x[j][1] < ytmp) continue; + if (x[j][1] == ytmp && x[j][0] < xtmp) continue; + } + */ + } + } + + /* if (x[j][2] < ztmp) continue; if (x[j][2] == ztmp) { if (x[j][1] < ytmp) continue; @@ -95,7 +127,8 @@ void NPairHalfBinNewtonTri::build(NeighList *list) if (x[j][0] == xtmp && j <= i) continue; } } - + */ + jtype = type[j]; if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; diff --git a/src/npair_half_nsq_newton.cpp b/src/npair_half_nsq_newton.cpp index e5f3138f0a..20ffbf6977 100644 --- a/src/npair_half_nsq_newton.cpp +++ b/src/npair_half_nsq_newton.cpp @@ -16,6 +16,7 @@ #include "neigh_list.h" #include "atom.h" #include "atom_vec.h" +#include "force.h" #include "group.h" #include "molecule.h" #include "domain.h" @@ -41,6 +42,9 @@ void NPairHalfNsqNewton::build(NeighList *list) double xtmp,ytmp,ztmp,delx,dely,delz,rsq; int *neighptr; + double angstrom = force->angstrom; + int triclinic = domain->triclinic; + double **x = atom->x; int *type = atom->type; int *mask = atom->mask; @@ -96,7 +100,15 @@ void NPairHalfNsqNewton::build(NeighList *list) if ((itag+jtag) % 2 == 0) continue; } else if (itag < jtag) { if ((itag+jtag) % 2 == 1) continue; - } else { + } else if (triclinic) { + if (fabs(x[j][2]-ztmp) > angstrom) { + if (x[j][2] < ztmp) continue; + } else if (fabs(x[j][1]-ytmp) > angstrom) { + if (x[j][1] < ytmp) continue; + } else { + if (x[j][0] < xtmp) continue; + } + } else { if (x[j][2] < ztmp) continue; if (x[j][2] == ztmp) { if (x[j][1] < ytmp) continue; From 129264aa148bb2b10ce0d6dbfda866443f58d749 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Fri, 7 Jul 2023 08:42:46 -0700 Subject: [PATCH 013/219] debugging --- src/npair_half_bin_newton_tri.cpp | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/npair_half_bin_newton_tri.cpp b/src/npair_half_bin_newton_tri.cpp index 227a25c321..00b5722673 100644 --- a/src/npair_half_bin_newton_tri.cpp +++ b/src/npair_half_bin_newton_tri.cpp @@ -92,6 +92,7 @@ void NPairHalfBinNewtonTri::build(NeighList *list) for (k = 0; k < nstencil; k++) { for (j = binhead[ibin+stencil[k]]; j >= 0; j = bins[j]) { + /* if (j >= nlocal) { jtag = tag[j]; if (itag > jtag) { @@ -108,17 +109,15 @@ void NPairHalfBinNewtonTri::build(NeighList *list) if (x[j][0] < xtmp) continue; } - /* if (x[j][2] < ztmp) continue; if (x[j][2] == ztmp) { if (x[j][1] < ytmp) continue; if (x[j][1] == ytmp && x[j][0] < xtmp) continue; } - */ } } - - /* + */ + if (x[j][2] < ztmp) continue; if (x[j][2] == ztmp) { if (x[j][1] < ytmp) continue; @@ -127,7 +126,6 @@ void NPairHalfBinNewtonTri::build(NeighList *list) if (x[j][0] == xtmp && j <= i) continue; } } - */ jtype = type[j]; if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; From 42f2a4b5b0e8021b01b1655b2c555cd392539c18 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Fri, 7 Jul 2023 08:58:14 -0700 Subject: [PATCH 014/219] exclude self interactions and double counting of own/own --- src/npair_half_bin_newton_tri.cpp | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/npair_half_bin_newton_tri.cpp b/src/npair_half_bin_newton_tri.cpp index 00b5722673..4cd12b2e7c 100644 --- a/src/npair_half_bin_newton_tri.cpp +++ b/src/npair_half_bin_newton_tri.cpp @@ -92,7 +92,7 @@ void NPairHalfBinNewtonTri::build(NeighList *list) for (k = 0; k < nstencil; k++) { for (j = binhead[ibin+stencil[k]]; j >= 0; j = bins[j]) { - /* + if (j <= i) continue; if (j >= nlocal) { jtag = tag[j]; if (itag > jtag) { @@ -109,15 +109,15 @@ void NPairHalfBinNewtonTri::build(NeighList *list) if (x[j][0] < xtmp) continue; } - if (x[j][2] < ztmp) continue; - if (x[j][2] == ztmp) { - if (x[j][1] < ytmp) continue; - if (x[j][1] == ytmp && x[j][0] < xtmp) continue; - } + //if (x[j][2] < ztmp) continue; + //if (x[j][2] == ztmp) { + // if (x[j][1] < ytmp) continue; + // if (x[j][1] == ytmp && x[j][0] < xtmp) continue; + // } } } - */ - + + /* if (x[j][2] < ztmp) continue; if (x[j][2] == ztmp) { if (x[j][1] < ytmp) continue; @@ -126,6 +126,7 @@ void NPairHalfBinNewtonTri::build(NeighList *list) if (x[j][0] == xtmp && j <= i) continue; } } + */ jtype = type[j]; if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; @@ -136,6 +137,8 @@ void NPairHalfBinNewtonTri::build(NeighList *list) rsq = delx*delx + dely*dely + delz*delz; if (rsq <= cutneighsq[itype][jtype]) { + //printf("NEIGH i,j %d %d ijtag %d %d dist %g\n", + // i,j,tag[i],tag[j],sqrt(rsq)); if (molecular != Atom::ATOMIC) { if (!moltemplate) which = find_special(special[i],nspecial[i],tag[j]); From abadf9412afb695eabeb996d507e6533ec686d07 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Sat, 8 Jul 2023 10:26:34 -0700 Subject: [PATCH 015/219] check old results --- src/npair_half_bin_newton_tri.cpp | 7 ++++--- src/npair_half_nsq_newton.cpp | 4 +++- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/npair_half_bin_newton_tri.cpp b/src/npair_half_bin_newton_tri.cpp index 4cd12b2e7c..61d67fed2a 100644 --- a/src/npair_half_bin_newton_tri.cpp +++ b/src/npair_half_bin_newton_tri.cpp @@ -92,6 +92,7 @@ void NPairHalfBinNewtonTri::build(NeighList *list) for (k = 0; k < nstencil; k++) { for (j = binhead[ibin+stencil[k]]; j >= 0; j = bins[j]) { + /* if (j <= i) continue; if (j >= nlocal) { jtag = tag[j]; @@ -116,8 +117,9 @@ void NPairHalfBinNewtonTri::build(NeighList *list) // } } } - - /* + */ + + if (x[j][2] < ztmp) continue; if (x[j][2] == ztmp) { if (x[j][1] < ytmp) continue; @@ -126,7 +128,6 @@ void NPairHalfBinNewtonTri::build(NeighList *list) if (x[j][0] == xtmp && j <= i) continue; } } - */ jtype = type[j]; if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; diff --git a/src/npair_half_nsq_newton.cpp b/src/npair_half_nsq_newton.cpp index 20ffbf6977..995c9cfbed 100644 --- a/src/npair_half_nsq_newton.cpp +++ b/src/npair_half_nsq_newton.cpp @@ -100,7 +100,8 @@ void NPairHalfNsqNewton::build(NeighList *list) if ((itag+jtag) % 2 == 0) continue; } else if (itag < jtag) { if ((itag+jtag) % 2 == 1) continue; - } else if (triclinic) { + /* + } else if (triclinic) { if (fabs(x[j][2]-ztmp) > angstrom) { if (x[j][2] < ztmp) continue; } else if (fabs(x[j][1]-ytmp) > angstrom) { @@ -108,6 +109,7 @@ void NPairHalfNsqNewton::build(NeighList *list) } else { if (x[j][0] < xtmp) continue; } + */ } else { if (x[j][2] < ztmp) continue; if (x[j][2] == ztmp) { From ce1a084a0efba244310fd4d8448b726210030f8d Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Sat, 8 Jul 2023 18:31:55 -0700 Subject: [PATCH 016/219] expand stencil for triclinic neighbor build --- src/npair_half_bin_newton_tri.cpp | 15 ++++++--------- src/npair_half_nsq_newton.cpp | 10 ++++------ src/npair_halffull_newton.cpp | 15 +++++++++++++++ src/nstencil_half_bin_3d_tri.cpp | 3 ++- 4 files changed, 27 insertions(+), 16 deletions(-) diff --git a/src/npair_half_bin_newton_tri.cpp b/src/npair_half_bin_newton_tri.cpp index 61d67fed2a..17504ac3af 100644 --- a/src/npair_half_bin_newton_tri.cpp +++ b/src/npair_half_bin_newton_tri.cpp @@ -41,7 +41,7 @@ void NPairHalfBinNewtonTri::build(NeighList *list) double xtmp,ytmp,ztmp,delx,dely,delz,rsq; int *neighptr; - double angstrom = force->angstrom; + double delta = 0.01 * force->angstrom; double **x = atom->x; int *type = atom->type; @@ -92,7 +92,6 @@ void NPairHalfBinNewtonTri::build(NeighList *list) for (k = 0; k < nstencil; k++) { for (j = binhead[ibin+stencil[k]]; j >= 0; j = bins[j]) { - /* if (j <= i) continue; if (j >= nlocal) { jtag = tag[j]; @@ -101,15 +100,13 @@ void NPairHalfBinNewtonTri::build(NeighList *list) } else if (itag < jtag) { if ((itag+jtag) % 2 == 1) continue; } else { - - if (fabs(x[j][2]-ztmp) > angstrom) { + if (fabs(x[j][2]-ztmp) > delta) { if (x[j][2] < ztmp) continue; - } else if (fabs(x[j][1]-ytmp) > angstrom) { + } else if (fabs(x[j][1]-ytmp) > delta) { if (x[j][1] < ytmp) continue; } else { if (x[j][0] < xtmp) continue; } - //if (x[j][2] < ztmp) continue; //if (x[j][2] == ztmp) { // if (x[j][1] < ytmp) continue; @@ -117,9 +114,8 @@ void NPairHalfBinNewtonTri::build(NeighList *list) // } } } - */ - - + + /* if (x[j][2] < ztmp) continue; if (x[j][2] == ztmp) { if (x[j][1] < ytmp) continue; @@ -128,6 +124,7 @@ void NPairHalfBinNewtonTri::build(NeighList *list) if (x[j][0] == xtmp && j <= i) continue; } } + */ jtype = type[j]; if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; diff --git a/src/npair_half_nsq_newton.cpp b/src/npair_half_nsq_newton.cpp index 995c9cfbed..be06393f58 100644 --- a/src/npair_half_nsq_newton.cpp +++ b/src/npair_half_nsq_newton.cpp @@ -42,7 +42,7 @@ void NPairHalfNsqNewton::build(NeighList *list) double xtmp,ytmp,ztmp,delx,dely,delz,rsq; int *neighptr; - double angstrom = force->angstrom; + double delta = 0.01 * force->angstrom; int triclinic = domain->triclinic; double **x = atom->x; @@ -100,16 +100,14 @@ void NPairHalfNsqNewton::build(NeighList *list) if ((itag+jtag) % 2 == 0) continue; } else if (itag < jtag) { if ((itag+jtag) % 2 == 1) continue; - /* - } else if (triclinic) { - if (fabs(x[j][2]-ztmp) > angstrom) { + } else if (triclinic) { + if (fabs(x[j][2]-ztmp) > delta) { if (x[j][2] < ztmp) continue; - } else if (fabs(x[j][1]-ytmp) > angstrom) { + } else if (fabs(x[j][1]-ytmp) > delta) { if (x[j][1] < ytmp) continue; } else { if (x[j][0] < xtmp) continue; } - */ } else { if (x[j][2] < ztmp) continue; if (x[j][2] == ztmp) { diff --git a/src/npair_halffull_newton.cpp b/src/npair_halffull_newton.cpp index 407a71e614..d1e894943c 100644 --- a/src/npair_halffull_newton.cpp +++ b/src/npair_halffull_newton.cpp @@ -14,7 +14,9 @@ #include "npair_halffull_newton.h" #include "atom.h" +#include "domain.h" #include "error.h" +#include "force.h" #include "my_page.h" #include "neigh_list.h" @@ -37,6 +39,9 @@ void NPairHalffullNewton::build(NeighList *list) int *neighptr, *jlist; double xtmp, ytmp, ztmp; + double delta = 0.01 * force->angstrom; + int triclinic = domain->triclinic; + double **x = atom->x; int nlocal = atom->nlocal; @@ -72,8 +77,17 @@ void NPairHalffullNewton::build(NeighList *list) for (jj = 0; jj < jnum; jj++) { joriginal = jlist[jj]; j = joriginal & NEIGHMASK; + if (j < nlocal) { if (i > j) continue; + } else if (triclinic) { + if (fabs(x[j][2]-ztmp) > delta) { + if (x[j][2] < ztmp) continue; + } else if (fabs(x[j][1]-ytmp) > delta) { + if (x[j][1] < ytmp) continue; + } else { + if (x[j][0] < xtmp) continue; + } } else { if (x[j][2] < ztmp) continue; if (x[j][2] == ztmp) { @@ -81,6 +95,7 @@ void NPairHalffullNewton::build(NeighList *list) if (x[j][1] == ytmp && x[j][0] < xtmp) continue; } } + neighptr[n++] = joriginal; } diff --git a/src/nstencil_half_bin_3d_tri.cpp b/src/nstencil_half_bin_3d_tri.cpp index d066a24ee6..f94bfc5e63 100644 --- a/src/nstencil_half_bin_3d_tri.cpp +++ b/src/nstencil_half_bin_3d_tri.cpp @@ -29,7 +29,8 @@ void NStencilHalfBin3dTri::create() nstencil = 0; - for (k = 0; k <= sz; k++) + //for (k = 0; k <= sz; k++) + for (k = -sz; k <= sz; k++) for (j = -sy; j <= sy; j++) for (i = -sx; i <= sx; i++) if (bin_distance(i, j, k) < cutneighmaxsq) From e3349581c757ad49a187bc86dd429abb4420dd1f Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 9 Jul 2023 15:14:36 -0400 Subject: [PATCH 017/219] fix whitespace and remove debug code --- src/npair_half_bin_newton_tri.cpp | 56 +++++++++++-------------------- src/npair_half_nsq_newton.cpp | 24 ++++++------- src/npair_halffull_newton.cpp | 22 ++++++------ src/nstencil_half_bin_3d_tri.cpp | 1 - 4 files changed, 42 insertions(+), 61 deletions(-) diff --git a/src/npair_half_bin_newton_tri.cpp b/src/npair_half_bin_newton_tri.cpp index 17504ac3af..2917055214 100644 --- a/src/npair_half_bin_newton_tri.cpp +++ b/src/npair_half_bin_newton_tri.cpp @@ -40,9 +40,9 @@ void NPairHalfBinNewtonTri::build(NeighList *list) tagint itag,jtag,tagprev; double xtmp,ytmp,ztmp,delx,dely,delz,rsq; int *neighptr; - - double delta = 0.01 * force->angstrom; - + + const double delta = 0.01 * force->angstrom; + double **x = atom->x; int *type = atom->type; int *mask = atom->mask; @@ -92,40 +92,24 @@ void NPairHalfBinNewtonTri::build(NeighList *list) for (k = 0; k < nstencil; k++) { for (j = binhead[ibin+stencil[k]]; j >= 0; j = bins[j]) { - if (j <= i) continue; - if (j >= nlocal) { - jtag = tag[j]; - if (itag > jtag) { - if ((itag+jtag) % 2 == 0) continue; - } else if (itag < jtag) { - if ((itag+jtag) % 2 == 1) continue; - } else { - if (fabs(x[j][2]-ztmp) > delta) { - if (x[j][2] < ztmp) continue; - } else if (fabs(x[j][1]-ytmp) > delta) { - if (x[j][1] < ytmp) continue; - } else { - if (x[j][0] < xtmp) continue; - } - //if (x[j][2] < ztmp) continue; - //if (x[j][2] == ztmp) { - // if (x[j][1] < ytmp) continue; - // if (x[j][1] == ytmp && x[j][0] < xtmp) continue; - // } - } - } - - /* - if (x[j][2] < ztmp) continue; - if (x[j][2] == ztmp) { - if (x[j][1] < ytmp) continue; - if (x[j][1] == ytmp) { - if (x[j][0] < xtmp) continue; - if (x[j][0] == xtmp && j <= i) continue; + if (j <= i) continue; + if (j >= nlocal) { + jtag = tag[j]; + if (itag > jtag) { + if ((itag+jtag) % 2 == 0) continue; + } else if (itag < jtag) { + if ((itag+jtag) % 2 == 1) continue; + } else { + if (fabs(x[j][2]-ztmp) > delta) { + if (x[j][2] < ztmp) continue; + } else if (fabs(x[j][1]-ytmp) > delta) { + if (x[j][1] < ytmp) continue; + } else { + if (x[j][0] < xtmp) continue; + } } } - */ - + jtype = type[j]; if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; @@ -135,8 +119,6 @@ void NPairHalfBinNewtonTri::build(NeighList *list) rsq = delx*delx + dely*dely + delz*delz; if (rsq <= cutneighsq[itype][jtype]) { - //printf("NEIGH i,j %d %d ijtag %d %d dist %g\n", - // i,j,tag[i],tag[j],sqrt(rsq)); if (molecular != Atom::ATOMIC) { if (!moltemplate) which = find_special(special[i],nspecial[i],tag[j]); diff --git a/src/npair_half_nsq_newton.cpp b/src/npair_half_nsq_newton.cpp index be06393f58..295b7de18c 100644 --- a/src/npair_half_nsq_newton.cpp +++ b/src/npair_half_nsq_newton.cpp @@ -42,9 +42,9 @@ void NPairHalfNsqNewton::build(NeighList *list) double xtmp,ytmp,ztmp,delx,dely,delz,rsq; int *neighptr; - double delta = 0.01 * force->angstrom; - int triclinic = domain->triclinic; - + const double delta = 0.01 * force->angstrom; + const int triclinic = domain->triclinic; + double **x = atom->x; int *type = atom->type; int *mask = atom->mask; @@ -100,15 +100,15 @@ void NPairHalfNsqNewton::build(NeighList *list) if ((itag+jtag) % 2 == 0) continue; } else if (itag < jtag) { if ((itag+jtag) % 2 == 1) continue; - } else if (triclinic) { - if (fabs(x[j][2]-ztmp) > delta) { - if (x[j][2] < ztmp) continue; - } else if (fabs(x[j][1]-ytmp) > delta) { - if (x[j][1] < ytmp) continue; - } else { - if (x[j][0] < xtmp) continue; - } - } else { + } else if (triclinic) { + if (fabs(x[j][2]-ztmp) > delta) { + if (x[j][2] < ztmp) continue; + } else if (fabs(x[j][1]-ytmp) > delta) { + if (x[j][1] < ytmp) continue; + } else { + if (x[j][0] < xtmp) continue; + } + } else { if (x[j][2] < ztmp) continue; if (x[j][2] == ztmp) { if (x[j][1] < ytmp) continue; diff --git a/src/npair_halffull_newton.cpp b/src/npair_halffull_newton.cpp index d1e894943c..0192ed5729 100644 --- a/src/npair_halffull_newton.cpp +++ b/src/npair_halffull_newton.cpp @@ -39,8 +39,8 @@ void NPairHalffullNewton::build(NeighList *list) int *neighptr, *jlist; double xtmp, ytmp, ztmp; - double delta = 0.01 * force->angstrom; - int triclinic = domain->triclinic; + const double delta = 0.01 * force->angstrom; + const int triclinic = domain->triclinic; double **x = atom->x; int nlocal = atom->nlocal; @@ -77,17 +77,17 @@ void NPairHalffullNewton::build(NeighList *list) for (jj = 0; jj < jnum; jj++) { joriginal = jlist[jj]; j = joriginal & NEIGHMASK; - + if (j < nlocal) { if (i > j) continue; } else if (triclinic) { - if (fabs(x[j][2]-ztmp) > delta) { - if (x[j][2] < ztmp) continue; - } else if (fabs(x[j][1]-ytmp) > delta) { - if (x[j][1] < ytmp) continue; - } else { - if (x[j][0] < xtmp) continue; - } + if (fabs(x[j][2]-ztmp) > delta) { + if (x[j][2] < ztmp) continue; + } else if (fabs(x[j][1]-ytmp) > delta) { + if (x[j][1] < ytmp) continue; + } else { + if (x[j][0] < xtmp) continue; + } } else { if (x[j][2] < ztmp) continue; if (x[j][2] == ztmp) { @@ -95,7 +95,7 @@ void NPairHalffullNewton::build(NeighList *list) if (x[j][1] == ytmp && x[j][0] < xtmp) continue; } } - + neighptr[n++] = joriginal; } diff --git a/src/nstencil_half_bin_3d_tri.cpp b/src/nstencil_half_bin_3d_tri.cpp index f94bfc5e63..5887e389fb 100644 --- a/src/nstencil_half_bin_3d_tri.cpp +++ b/src/nstencil_half_bin_3d_tri.cpp @@ -29,7 +29,6 @@ void NStencilHalfBin3dTri::create() nstencil = 0; - //for (k = 0; k <= sz; k++) for (k = -sz; k <= sz; k++) for (j = -sy; j <= sy; j++) for (i = -sx; i <= sx; i++) From 9db5d4523282972f30dd6cb172fddcbb12921c1d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 9 Jul 2023 15:29:18 -0400 Subject: [PATCH 018/219] port neighbor list build changes to corresponding OPENMP package files --- src/OPENMP/npair_half_bin_newton_tri_omp.cpp | 29 ++++++++++++++------ src/OPENMP/npair_half_nsq_newton_omp.cpp | 24 ++++++++++++---- src/OPENMP/npair_halffull_newton_omp.cpp | 13 +++++++++ src/npair_half_nsq_newton.cpp | 7 +++-- 4 files changed, 56 insertions(+), 17 deletions(-) diff --git a/src/OPENMP/npair_half_bin_newton_tri_omp.cpp b/src/OPENMP/npair_half_bin_newton_tri_omp.cpp index e754456ef1..3ad07acd56 100644 --- a/src/OPENMP/npair_half_bin_newton_tri_omp.cpp +++ b/src/OPENMP/npair_half_bin_newton_tri_omp.cpp @@ -18,6 +18,7 @@ #include "neigh_list.h" #include "atom.h" #include "atom_vec.h" +#include "force.h" #include "molecule.h" #include "domain.h" #include "my_page.h" @@ -40,6 +41,7 @@ void NPairHalfBinNewtonTriOmp::build(NeighList *list) const int nlocal = (includegroup) ? atom->nfirst : atom->nlocal; const int molecular = atom->molecular; const int moltemplate = (molecular == Atom::TEMPLATE) ? 1 : 0; + const double delta = 0.01 * force->angstrom; NPAIR_OMP_INIT; #if defined(_OPENMP) @@ -48,7 +50,7 @@ void NPairHalfBinNewtonTriOmp::build(NeighList *list) NPAIR_OMP_SETUP(nlocal); int i,j,k,n,itype,jtype,ibin,which,imol,iatom; - tagint tagprev; + tagint itag,jtag,tagprev; double xtmp,ytmp,ztmp,delx,dely,delz,rsq; int *neighptr; @@ -79,6 +81,7 @@ void NPairHalfBinNewtonTriOmp::build(NeighList *list) n = 0; neighptr = ipage.vget(); + itag = tag[i]; itype = type[i]; xtmp = x[i][0]; ytmp = x[i][1]; @@ -98,12 +101,22 @@ void NPairHalfBinNewtonTriOmp::build(NeighList *list) ibin = atom2bin[i]; for (k = 0; k < nstencil; k++) { for (j = binhead[ibin+stencil[k]]; j >= 0; j = bins[j]) { - if (x[j][2] < ztmp) continue; - if (x[j][2] == ztmp) { - if (x[j][1] < ytmp) continue; - if (x[j][1] == ytmp) { - if (x[j][0] < xtmp) continue; - if (x[j][0] == xtmp && j <= i) continue; + + if (j <= i) continue; + if (j >= nlocal) { + jtag = tag[j]; + if (itag > jtag) { + if ((itag+jtag) % 2 == 0) continue; + } else if (itag < jtag) { + if ((itag+jtag) % 2 == 1) continue; + } else { + if (fabs(x[j][2]-ztmp) > delta) { + if (x[j][2] < ztmp) continue; + } else if (fabs(x[j][1]-ytmp) > delta) { + if (x[j][1] < ytmp) continue; + } else { + if (x[j][0] < xtmp) continue; + } } } @@ -119,7 +132,7 @@ void NPairHalfBinNewtonTriOmp::build(NeighList *list) if (molecular != Atom::ATOMIC) { if (!moltemplate) which = find_special(special[i],nspecial[i],tag[j]); - else if (imol >=0) + else if (imol >= 0) which = find_special(onemols[imol]->special[iatom], onemols[imol]->nspecial[iatom], tag[j]-tagprev); diff --git a/src/OPENMP/npair_half_nsq_newton_omp.cpp b/src/OPENMP/npair_half_nsq_newton_omp.cpp index cb08cb7f7a..726814c6f0 100644 --- a/src/OPENMP/npair_half_nsq_newton_omp.cpp +++ b/src/OPENMP/npair_half_nsq_newton_omp.cpp @@ -15,14 +15,16 @@ #include "omp_compat.h" #include "npair_half_nsq_newton_omp.h" #include "npair_omp.h" -#include "neigh_list.h" + #include "atom.h" #include "atom_vec.h" +#include "domain.h" +#include "error.h" +#include "force.h" #include "group.h" #include "molecule.h" -#include "domain.h" #include "my_page.h" -#include "error.h" +#include "neigh_list.h" using namespace LAMMPS_NS; @@ -42,6 +44,8 @@ void NPairHalfNsqNewtonOmp::build(NeighList *list) const int bitmask = (includegroup) ? group->bitmask[includegroup] : 0; const int molecular = atom->molecular; const int moltemplate = (molecular == Atom::TEMPLATE) ? 1 : 0; + const double delta = 0.01 * force->angstrom; + const int triclinic = domain->triclinic; NPAIR_OMP_INIT; #if defined(_OPENMP) @@ -49,8 +53,8 @@ void NPairHalfNsqNewtonOmp::build(NeighList *list) #endif NPAIR_OMP_SETUP(nlocal); - int i,j,n,itype,jtype,itag,jtag,which,imol,iatom; - tagint tagprev; + int i,j,n,itype,jtype,which,imol,iatom; + tagint itag,jtag,tagprev; double xtmp,ytmp,ztmp,delx,dely,delz,rsq; int *neighptr; @@ -106,6 +110,14 @@ void NPairHalfNsqNewtonOmp::build(NeighList *list) if ((itag+jtag) % 2 == 0) continue; } else if (itag < jtag) { if ((itag+jtag) % 2 == 1) continue; + } else if (triclinic) { + if (fabs(x[j][2]-ztmp) > delta) { + if (x[j][2] < ztmp) continue; + } else if (fabs(x[j][1]-ytmp) > delta) { + if (x[j][1] < ytmp) continue; + } else { + if (x[j][0] < xtmp) continue; + } } else { if (x[j][2] < ztmp) continue; if (x[j][2] == ztmp) { @@ -127,7 +139,7 @@ void NPairHalfNsqNewtonOmp::build(NeighList *list) if (molecular != Atom::ATOMIC) { if (!moltemplate) which = find_special(special[i],nspecial[i],tag[j]); - else if (imol >=0) + else if (imol >= 0) which = find_special(onemols[imol]->special[iatom], onemols[imol]->nspecial[iatom], tag[j]-tagprev); diff --git a/src/OPENMP/npair_halffull_newton_omp.cpp b/src/OPENMP/npair_halffull_newton_omp.cpp index abd5f7eacb..e833ab3095 100644 --- a/src/OPENMP/npair_halffull_newton_omp.cpp +++ b/src/OPENMP/npair_halffull_newton_omp.cpp @@ -15,7 +15,9 @@ #include "npair_halffull_newton_omp.h" #include "atom.h" +#include "domain.h" #include "error.h" +#include "force.h" #include "my_page.h" #include "neigh_list.h" #include "npair_omp.h" @@ -38,6 +40,8 @@ NPairHalffullNewtonOmp::NPairHalffullNewtonOmp(LAMMPS *lmp) : NPair(lmp) {} void NPairHalffullNewtonOmp::build(NeighList *list) { const int inum_full = list->listfull->inum; + const double delta = 0.01 * force->angstrom; + const int triclinic = domain->triclinic; NPAIR_OMP_INIT; #if defined(_OPENMP) @@ -83,8 +87,17 @@ void NPairHalffullNewtonOmp::build(NeighList *list) for (jj = 0; jj < jnum; jj++) { joriginal = jlist[jj]; j = joriginal & NEIGHMASK; + if (j < nlocal) { if (i > j) continue; + } else if (triclinic) { + if (fabs(x[j][2]-ztmp) > delta) { + if (x[j][2] < ztmp) continue; + } else if (fabs(x[j][1]-ytmp) > delta) { + if (x[j][1] < ytmp) continue; + } else { + if (x[j][0] < xtmp) continue; + } } else { if (x[j][2] < ztmp) continue; if (x[j][2] == ztmp) { diff --git a/src/npair_half_nsq_newton.cpp b/src/npair_half_nsq_newton.cpp index 295b7de18c..023ece69c9 100644 --- a/src/npair_half_nsq_newton.cpp +++ b/src/npair_half_nsq_newton.cpp @@ -13,15 +13,16 @@ ------------------------------------------------------------------------- */ #include "npair_half_nsq_newton.h" -#include "neigh_list.h" + #include "atom.h" #include "atom_vec.h" +#include "domain.h" +#include "error.h" #include "force.h" #include "group.h" #include "molecule.h" -#include "domain.h" #include "my_page.h" -#include "error.h" +#include "neigh_list.h" using namespace LAMMPS_NS; From 07f42930ff711b09bf46f9641ae964617edf3cad Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Mon, 10 Jul 2023 12:53:02 -0700 Subject: [PATCH 019/219] clean up code and comments --- src/compute_property_local.cpp | 3 ++- src/npair_half_bin_newton_tri.cpp | 29 ++++++----------------------- src/npair_half_nsq_newton.cpp | 5 +++++ src/npair_halffull_newton.cpp | 5 +++++ src/nstencil_half_bin_2d_tri.cpp | 12 ++++++++++-- src/nstencil_half_bin_3d_tri.cpp | 8 +++++++- 6 files changed, 35 insertions(+), 27 deletions(-) diff --git a/src/compute_property_local.cpp b/src/compute_property_local.cpp index d0523a1bec..92036c4bd2 100644 --- a/src/compute_property_local.cpp +++ b/src/compute_property_local.cpp @@ -405,7 +405,8 @@ int ComputePropertyLocal::count_pairs(int allflag, int forceflag) if (!(mask[j] & groupbit)) continue; // itag = jtag is possible for long cutoffs that include images of self - + // do not need triclinic logic here b/c neighbor list itself is correct + if (newton_pair == 0 && j >= nlocal) { jtag = tag[j]; if (itag > jtag) { diff --git a/src/npair_half_bin_newton_tri.cpp b/src/npair_half_bin_newton_tri.cpp index 17504ac3af..71a15df59e 100644 --- a/src/npair_half_bin_newton_tri.cpp +++ b/src/npair_half_bin_newton_tri.cpp @@ -83,11 +83,12 @@ void NPairHalfBinNewtonTri::build(NeighList *list) } // loop over all atoms in bins in stencil - // pairs for atoms j "below" i are excluded - // below = lower z or (equal z and lower y) or (equal zy and lower x) - // (equal zyx and j <= i) - // latter excludes self-self interaction but allows superposed atoms - + // for triclinic, bin stencil is full in all 3 dims + // must use itag/jtag to eliminate half the I/J interactions + // cannot use I/J coord comparision + // b/c transforming orthog -> lambda -> orthog for ghost atoms + // with an added PBC offset can shift all 3 coords by epsilon + ibin = atom2bin[i]; for (k = 0; k < nstencil; k++) { for (j = binhead[ibin+stencil[k]]; j >= 0; j = bins[j]) { @@ -107,25 +108,9 @@ void NPairHalfBinNewtonTri::build(NeighList *list) } else { if (x[j][0] < xtmp) continue; } - //if (x[j][2] < ztmp) continue; - //if (x[j][2] == ztmp) { - // if (x[j][1] < ytmp) continue; - // if (x[j][1] == ytmp && x[j][0] < xtmp) continue; - // } } } - /* - if (x[j][2] < ztmp) continue; - if (x[j][2] == ztmp) { - if (x[j][1] < ytmp) continue; - if (x[j][1] == ytmp) { - if (x[j][0] < xtmp) continue; - if (x[j][0] == xtmp && j <= i) continue; - } - } - */ - jtype = type[j]; if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; @@ -135,8 +120,6 @@ void NPairHalfBinNewtonTri::build(NeighList *list) rsq = delx*delx + dely*dely + delz*delz; if (rsq <= cutneighsq[itype][jtype]) { - //printf("NEIGH i,j %d %d ijtag %d %d dist %g\n", - // i,j,tag[i],tag[j],sqrt(rsq)); if (molecular != Atom::ATOMIC) { if (!moltemplate) which = find_special(special[i],nspecial[i],tag[j]); diff --git a/src/npair_half_nsq_newton.cpp b/src/npair_half_nsq_newton.cpp index be06393f58..0174a78900 100644 --- a/src/npair_half_nsq_newton.cpp +++ b/src/npair_half_nsq_newton.cpp @@ -89,7 +89,12 @@ void NPairHalfNsqNewton::build(NeighList *list) } // loop over remaining atoms, owned and ghost + // use itag/jtap comparision to eliminate half the interactions // itag = jtag is possible for long cutoffs that include images of self + // for triclinic, must use delta to eliminate half the I/J interactions + // cannot use direct I/J coord comparision as for orthog + // b/c transforming orthog -> lambda -> orthog for ghost atoms + // with an added PBC offset can shift all 3 coords by epsilon for (j = i+1; j < nall; j++) { if (includegroup && !(mask[j] & bitmask)) continue; diff --git a/src/npair_halffull_newton.cpp b/src/npair_halffull_newton.cpp index d1e894943c..af15b27eac 100644 --- a/src/npair_halffull_newton.cpp +++ b/src/npair_halffull_newton.cpp @@ -70,6 +70,11 @@ void NPairHalffullNewton::build(NeighList *list) ztmp = x[i][2]; // loop over full neighbor list + // use i < j < nlocal to eliminate half the local/local interactions + // for triclinic, must use delta to eliminate half the local/ghost interactions + // cannot use direct I/J coord comparision as for orthog + // b/c transforming orthog -> lambda -> orthog for ghost atoms + // with an added PBC offset can shift all 3 coords by epsilon jlist = firstneigh_full[i]; jnum = numneigh_full[i]; diff --git a/src/nstencil_half_bin_2d_tri.cpp b/src/nstencil_half_bin_2d_tri.cpp index 06831730fd..920918fe09 100644 --- a/src/nstencil_half_bin_2d_tri.cpp +++ b/src/nstencil_half_bin_2d_tri.cpp @@ -27,9 +27,17 @@ void NStencilHalfBin2dTri::create() { int i, j; + // for triclinic, need to use full stencil in all dims + // not a half stencil in y + // b/c transforming orthog -> lambda -> orthog for ghost atoms + // with an added PBC offset can shift both coords by epsilon + // thus for an I/J owned/ghost pair, the xy coords + // and bin assignments can be different on I proc vs J proc + nstencil = 0; - for (j = 0; j <= sy; j++) + for (j = -sy; j <= sy; j++) for (i = -sx; i <= sx; i++) - if (bin_distance(i, j, 0) < cutneighmaxsq) stencil[nstencil++] = j * mbinx + i; + if (bin_distance(i, j, 0) < cutneighmaxsq) + stencil[nstencil++] = j * mbinx + i; } diff --git a/src/nstencil_half_bin_3d_tri.cpp b/src/nstencil_half_bin_3d_tri.cpp index f94bfc5e63..d146b92cd1 100644 --- a/src/nstencil_half_bin_3d_tri.cpp +++ b/src/nstencil_half_bin_3d_tri.cpp @@ -27,9 +27,15 @@ void NStencilHalfBin3dTri::create() { int i, j, k; + // for triclinic, need to use full stencil in all dims + // not a half stencil in z + // b/c transforming orthog -> lambda -> orthog for ghost atoms + // with an added PBC offset can shift all 3 coords by epsilon + // thus for an I/J owned/ghost pair, the xyz coords + // and bin assignments can be different on I proc vs J proc + nstencil = 0; - //for (k = 0; k <= sz; k++) for (k = -sz; k <= sz; k++) for (j = -sy; j <= sy; j++) for (i = -sx; i <= sx; i++) From fbbf44fb8e2948fea648f048f4ab1cb088cd93bc Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Mon, 10 Jul 2023 18:25:29 -0700 Subject: [PATCH 020/219] same changes to other NPair and NStencil methods --- src/npair_half_bin_newton_tri.cpp | 4 +- src/npair_half_multi_newton_tri.cpp | 119 +++++++++++-------- src/npair_half_multi_old_newton_tri.cpp | 44 ++++--- src/npair_half_respa_bin_newton_tri.cpp | 45 ++++--- src/npair_half_respa_nsq_newton.cpp | 24 +++- src/npair_half_respa_nsq_newton.h | 2 +- src/npair_half_size_bin_newton_tri.cpp | 41 +++++-- src/npair_half_size_multi_newton_tri.cpp | 107 ++++++++++------- src/npair_half_size_multi_old_newton_tri.cpp | 45 ++++--- src/npair_half_size_nsq_newton.cpp | 22 +++- src/npair_halffull_newton_trim.cpp | 19 +++ src/nstencil_half_multi_2d_tri.cpp | 2 +- src/nstencil_half_multi_3d_tri.cpp | 2 +- src/nstencil_half_multi_old_2d_tri.cpp | 2 +- src/nstencil_half_multi_old_3d_tri.cpp | 2 +- 15 files changed, 313 insertions(+), 167 deletions(-) diff --git a/src/npair_half_bin_newton_tri.cpp b/src/npair_half_bin_newton_tri.cpp index f6cbf1b1af..9c0688af68 100644 --- a/src/npair_half_bin_newton_tri.cpp +++ b/src/npair_half_bin_newton_tri.cpp @@ -16,11 +16,11 @@ #include "neigh_list.h" #include "atom.h" #include "atom_vec.h" +#include "domain.h" +#include "error.h" #include "force.h" #include "molecule.h" -#include "domain.h" #include "my_page.h" -#include "error.h" using namespace LAMMPS_NS; diff --git a/src/npair_half_multi_newton_tri.cpp b/src/npair_half_multi_newton_tri.cpp index 9bebfe71e2..316acb5049 100644 --- a/src/npair_half_multi_newton_tri.cpp +++ b/src/npair_half_multi_newton_tri.cpp @@ -18,6 +18,7 @@ #include "atom_vec.h" #include "domain.h" #include "error.h" +#include "force.h" #include "molecule.h" #include "my_page.h" #include "neighbor.h" @@ -39,11 +40,13 @@ NPairHalfMultiNewtonTri::NPairHalfMultiNewtonTri(LAMMPS *lmp) : NPair(lmp) {} void NPairHalfMultiNewtonTri::build(NeighList *list) { int i,j,k,n,itype,jtype,icollection,jcollection,ibin,jbin,which,ns,imol,iatom,moltemplate; - tagint tagprev; + tagint itag,jtag,tagprev; double xtmp,ytmp,ztmp,delx,dely,delz,rsq; int *neighptr,*s; int js; + const double delta = 0.01 * force->angstrom; + int *collection = neighbor->collection; double **x = atom->x; int *type = atom->type; @@ -72,6 +75,8 @@ void NPairHalfMultiNewtonTri::build(NeighList *list) for (i = 0; i < nlocal; i++) { n = 0; neighptr = ipage->vget(); + + itag = tag[i]; itype = type[i]; icollection = collection[i]; xtmp = x[i][0]; @@ -86,65 +91,79 @@ void NPairHalfMultiNewtonTri::build(NeighList *list) ibin = atom2bin[i]; // loop through stencils for all collections + for (jcollection = 0; jcollection < ncollections; jcollection++) { // if same collection use own bin + if (icollection == jcollection) jbin = ibin; - else jbin = coord2bin(x[i], jcollection); + else jbin = coord2bin(x[i], jcollection); // loop over all atoms in bins in stencil - // stencil is empty if i larger than j - // stencil is half if i same size as j - // stencil is full if i smaller than j - // if half: pairs for atoms j "below" i are excluded - // below = lower z or (equal z and lower y) or (equal zy and lower x) - // (equal zyx and j <= i) - // latter excludes self-self interaction but allows superposed atoms + // for triclinic: + // stencil is empty if i larger than j + // stencil is full if i smaller than j + // stencil is full if i same size as j + // for i smaller than j: + // must use itag/jtag to eliminate half the I/J interactions + // cannot use I/J exact coord comparision + // b/c transforming orthog -> lambda -> orthog for ghost atoms + // with an added PBC offset can shift all 3 coords by epsilon + + s = stencil_multi[icollection][jcollection]; + ns = nstencil_multi[icollection][jcollection]; - s = stencil_multi[icollection][jcollection]; - ns = nstencil_multi[icollection][jcollection]; + for (k = 0; k < ns; k++) { + js = binhead_multi[jcollection][jbin + s[k]]; + for (j = js; j >= 0; j = bins[j]) { + + // if same size (same collection), exclude half of interactions + + if (cutcollectionsq[icollection][icollection] == + cutcollectionsq[jcollection][jcollection]) { + if (j >= nlocal) { + jtag = tag[j]; + if (itag > jtag) { + if ((itag+jtag) % 2 == 0) continue; + } else if (itag < jtag) { + if ((itag+jtag) % 2 == 1) continue; + } else { + if (fabs(x[j][2]-ztmp) > delta) { + if (x[j][2] < ztmp) continue; + } else if (fabs(x[j][1]-ytmp) > delta) { + if (x[j][1] < ytmp) continue; + } else { + if (x[j][0] < xtmp) continue; + } + } + } + } - for (k = 0; k < ns; k++) { - js = binhead_multi[jcollection][jbin + s[k]]; - for (j = js; j >= 0; j = bins[j]) { + jtype = type[j]; + if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; - // if same size (same collection), use half stencil - if(cutcollectionsq[icollection][icollection] == cutcollectionsq[jcollection][jcollection]){ - if (x[j][2] < ztmp) continue; - if (x[j][2] == ztmp) { - if (x[j][1] < ytmp) continue; - if (x[j][1] == ytmp) { - if (x[j][0] < xtmp) continue; - if (x[j][0] == xtmp && j <= i) continue; - } - } - } + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + rsq = delx*delx + dely*dely + delz*delz; - jtype = type[j]; - if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; - - delx = xtmp - x[j][0]; - dely = ytmp - x[j][1]; - delz = ztmp - x[j][2]; - rsq = delx*delx + dely*dely + delz*delz; - - if (rsq <= cutneighsq[itype][jtype]) { - if (molecular != Atom::ATOMIC) { - if (!moltemplate) - which = find_special(special[i],nspecial[i],tag[j]); - else if (imol >= 0) - which = find_special(onemols[imol]->special[iatom], - onemols[imol]->nspecial[iatom], - tag[j]-tagprev); - else which = 0; - if (which == 0) neighptr[n++] = j; - else if (domain->minimum_image_check(delx,dely,delz)) - neighptr[n++] = j; - else if (which > 0) neighptr[n++] = j ^ (which << SBBITS); - } else neighptr[n++] = j; - } - } - } + if (rsq <= cutneighsq[itype][jtype]) { + if (molecular != Atom::ATOMIC) { + if (!moltemplate) + which = find_special(special[i],nspecial[i],tag[j]); + else if (imol >= 0) + which = find_special(onemols[imol]->special[iatom], + onemols[imol]->nspecial[iatom], + tag[j]-tagprev); + else which = 0; + if (which == 0) neighptr[n++] = j; + else if (domain->minimum_image_check(delx,dely,delz)) + neighptr[n++] = j; + else if (which > 0) neighptr[n++] = j ^ (which << SBBITS); + } else neighptr[n++] = j; + } + } + } } ilist[inum++] = i; diff --git a/src/npair_half_multi_old_newton_tri.cpp b/src/npair_half_multi_old_newton_tri.cpp index fbb9a8e504..9dcbcff9f4 100644 --- a/src/npair_half_multi_old_newton_tri.cpp +++ b/src/npair_half_multi_old_newton_tri.cpp @@ -18,6 +18,7 @@ #include "atom_vec.h" #include "domain.h" #include "error.h" +#include "force.h" #include "molecule.h" #include "my_page.h" #include "neigh_list.h" @@ -38,11 +39,13 @@ NPairHalfMultiOldNewtonTri::NPairHalfMultiOldNewtonTri(LAMMPS *lmp) : NPair(lmp) void NPairHalfMultiOldNewtonTri::build(NeighList *list) { int i,j,k,n,itype,jtype,ibin,which,ns,imol,iatom,moltemplate; - tagint tagprev; + tagint itag,jtag,tagprev; double xtmp,ytmp,ztmp,delx,dely,delz,rsq; int *neighptr,*s; double *cutsq,*distsq; + const double delta = 0.01 * force->angstrom; + double **x = atom->x; int *type = atom->type; int *mask = atom->mask; @@ -71,6 +74,7 @@ void NPairHalfMultiOldNewtonTri::build(NeighList *list) n = 0; neighptr = ipage->vget(); + itag = tag[i]; itype = type[i]; xtmp = x[i][0]; ytmp = x[i][1]; @@ -81,13 +85,12 @@ void NPairHalfMultiOldNewtonTri::build(NeighList *list) tagprev = tag[i] - iatom - 1; } - // loop over all atoms in bins, including self, in stencil - // skip if i,j neighbor cutoff is less than bin distance - // bins below self are excluded from stencil - // pairs for atoms j "below" i are excluded - // below = lower z or (equal z and lower y) or (equal zy and lower x) - // (equal zyx and j <= i) - // latter excludes self-self interaction but allows superposed atoms + // loop over all atoms in bins in stencil + // for triclinic, bin stencil is full in all 3 dims + // must use itag/jtag to eliminate half the I/J interactions + // cannot use I/J exact coord comparision + // b/c transforming orthog -> lambda -> orthog for ghost atoms + // with an added PBC offset can shift all 3 coords by epsilon ibin = atom2bin[i]; s = stencil_multi_old[itype]; @@ -98,14 +101,23 @@ void NPairHalfMultiOldNewtonTri::build(NeighList *list) for (j = binhead[ibin+s[k]]; j >= 0; j = bins[j]) { jtype = type[j]; if (cutsq[jtype] < distsq[k]) continue; - if (x[j][2] < ztmp) continue; - if (x[j][2] == ztmp) { - if (x[j][1] < ytmp) continue; - if (x[j][1] == ytmp) { - if (x[j][0] < xtmp) continue; - if (x[j][0] == xtmp && j <= i) continue; - } - } + + if (j >= nlocal) { + jtag = tag[j]; + if (itag > jtag) { + if ((itag+jtag) % 2 == 0) continue; + } else if (itag < jtag) { + if ((itag+jtag) % 2 == 1) continue; + } else { + if (fabs(x[j][2]-ztmp) > delta) { + if (x[j][2] < ztmp) continue; + } else if (fabs(x[j][1]-ytmp) > delta) { + if (x[j][1] < ytmp) continue; + } else { + if (x[j][0] < xtmp) continue; + } + } + } if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; diff --git a/src/npair_half_respa_bin_newton_tri.cpp b/src/npair_half_respa_bin_newton_tri.cpp index b2749bd7a7..05b839869a 100644 --- a/src/npair_half_respa_bin_newton_tri.cpp +++ b/src/npair_half_respa_bin_newton_tri.cpp @@ -16,10 +16,11 @@ #include "neigh_list.h" #include "atom.h" #include "atom_vec.h" -#include "molecule.h" #include "domain.h" -#include "my_page.h" #include "error.h" +#include "force.h" +#include "molecule.h" +#include "my_page.h" using namespace LAMMPS_NS; @@ -38,10 +39,12 @@ NPairHalfRespaBinNewtonTri::NPairHalfRespaBinNewtonTri(LAMMPS *lmp) : void NPairHalfRespaBinNewtonTri::build(NeighList *list) { int i,j,k,n,itype,jtype,ibin,n_inner,n_middle,imol,iatom,moltemplate; - tagint tagprev; + tagint itag,jtag,tagprev; double xtmp,ytmp,ztmp,delx,dely,delz,rsq; int *neighptr,*neighptr_inner,*neighptr_middle; + const double delta = 0.01 * force->angstrom; + double **x = atom->x; int *type = atom->type; int *mask = atom->mask; @@ -94,6 +97,7 @@ void NPairHalfRespaBinNewtonTri::build(NeighList *list) neighptr_middle = ipage_middle->vget(); } + itag = tag[i]; itype = type[i]; xtmp = x[i][0]; ytmp = x[i][1]; @@ -105,22 +109,33 @@ void NPairHalfRespaBinNewtonTri::build(NeighList *list) } // loop over all atoms in bins in stencil - // pairs for atoms j "below" i are excluded - // below = lower z or (equal z and lower y) or (equal zy and lower x) - // (equal zyx and j <= i) - // latter excludes self-self interaction but allows superposed atoms + // for triclinic, bin stencil is full in all 3 dims + // must use itag/jtag to eliminate half the I/J interactions + // cannot use I/J exact coord comparision + // b/c transforming orthog -> lambda -> orthog for ghost atoms + // with an added PBC offset can shift all 3 coords by epsilon ibin = atom2bin[i]; for (k = 0; k < nstencil; k++) { for (j = binhead[ibin+stencil[k]]; j >= 0; j = bins[j]) { - if (x[j][2] < ztmp) continue; - if (x[j][2] == ztmp) { - if (x[j][1] < ytmp) continue; - if (x[j][1] == ytmp) { - if (x[j][0] < xtmp) continue; - if (x[j][0] == xtmp && j <= i) continue; - } - } + + if (j <= i) continue; + if (j >= nlocal) { + jtag = tag[j]; + if (itag > jtag) { + if ((itag+jtag) % 2 == 0) continue; + } else if (itag < jtag) { + if ((itag+jtag) % 2 == 1) continue; + } else { + if (fabs(x[j][2]-ztmp) > delta) { + if (x[j][2] < ztmp) continue; + } else if (fabs(x[j][1]-ytmp) > delta) { + if (x[j][1] < ytmp) continue; + } else { + if (x[j][0] < xtmp) continue; + } + } + } jtype = type[j]; if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; diff --git a/src/npair_half_respa_nsq_newton.cpp b/src/npair_half_respa_nsq_newton.cpp index 77d6af141f..d0292eec92 100644 --- a/src/npair_half_respa_nsq_newton.cpp +++ b/src/npair_half_respa_nsq_newton.cpp @@ -16,9 +16,10 @@ #include "neigh_list.h" #include "atom.h" #include "atom_vec.h" +#include "domain.h" +#include "force.h" #include "group.h" #include "molecule.h" -#include "domain.h" #include "my_page.h" #include "error.h" @@ -38,12 +39,15 @@ NPairHalfRespaNsqNewton::NPairHalfRespaNsqNewton(LAMMPS *lmp) : NPair(lmp) {} void NPairHalfRespaNsqNewton::build(NeighList *list) { - int i,j,n,itype,jtype,itag,jtag,n_inner,n_middle,bitmask; + int i,j,n,itype,jtype,n_inner,n_middle,bitmask; int imol,iatom,moltemplate; - tagint tagprev; + tagint itag,jtag,tagprev; double xtmp,ytmp,ztmp,delx,dely,delz,rsq; int *neighptr,*neighptr_inner,*neighptr_middle; + const double delta = 0.01 * force->angstrom; + const int triclinic = domain->triclinic; + double **x = atom->x; int *type = atom->type; int *mask = atom->mask; @@ -112,6 +116,12 @@ void NPairHalfRespaNsqNewton::build(NeighList *list) } // loop over remaining atoms, owned and ghost + // use itag/jtap comparision to eliminate half the interactions + // itag = jtag is possible for long cutoffs that include images of self + // for triclinic, must use delta to eliminate half the I/J interactions + // cannot use I/J exact coord comparision as for orthog + // b/c transforming orthog -> lambda -> orthog for ghost atoms + // with an added PBC offset can shift all 3 coords by epsilon for (j = i+1; j < nall; j++) { if (includegroup && !(mask[j] & bitmask)) continue; @@ -122,6 +132,14 @@ void NPairHalfRespaNsqNewton::build(NeighList *list) if ((itag+jtag) % 2 == 0) continue; } else if (itag < jtag) { if ((itag+jtag) % 2 == 1) continue; + } else if (triclinic) { + if (fabs(x[j][2]-ztmp) > delta) { + if (x[j][2] < ztmp) continue; + } else if (fabs(x[j][1]-ytmp) > delta) { + if (x[j][1] < ytmp) continue; + } else { + if (x[j][0] < xtmp) continue; + } } else { if (x[j][2] < ztmp) continue; if (x[j][2] == ztmp) { diff --git a/src/npair_half_respa_nsq_newton.h b/src/npair_half_respa_nsq_newton.h index e5233f5e9d..4a5ae23aef 100644 --- a/src/npair_half_respa_nsq_newton.h +++ b/src/npair_half_respa_nsq_newton.h @@ -15,7 +15,7 @@ // clang-format off NPairStyle(half/respa/nsq/newton, NPairHalfRespaNsqNewton, - NP_HALF | NP_RESPA | NP_NSQ | NP_NEWTON | NP_ORTHO); + NP_HALF | NP_RESPA | NP_NSQ | NP_NEWTON | NP_ORTHO | NP_TRI); // clang-format on #else diff --git a/src/npair_half_size_bin_newton_tri.cpp b/src/npair_half_size_bin_newton_tri.cpp index 47bb9d01e1..e6a236eecb 100644 --- a/src/npair_half_size_bin_newton_tri.cpp +++ b/src/npair_half_size_bin_newton_tri.cpp @@ -18,6 +18,7 @@ #include "atom_vec.h" #include "domain.h" #include "error.h" +#include "force.h" #include "molecule.h" #include "my_page.h" #include "neigh_list.h" @@ -39,11 +40,13 @@ NPairHalfSizeBinNewtonTri::NPairHalfSizeBinNewtonTri(LAMMPS *lmp) : void NPairHalfSizeBinNewtonTri::build(NeighList *list) { int i,j,jh,k,n,ibin,which,imol,iatom,moltemplate; - tagint tagprev; + tagint itag,jtag,tagprev; double xtmp,ytmp,ztmp,delx,dely,delz,rsq; double radi,radsum,cutsq; int *neighptr; + const double delta = 0.01 * force->angstrom; + double **x = atom->x; double *radius = atom->radius; int *type = atom->type; @@ -76,6 +79,7 @@ void NPairHalfSizeBinNewtonTri::build(NeighList *list) n = 0; neighptr = ipage->vget(); + itag = tag[i]; xtmp = x[i][0]; ytmp = x[i][1]; ztmp = x[i][2]; @@ -87,22 +91,33 @@ void NPairHalfSizeBinNewtonTri::build(NeighList *list) } // loop over all atoms in bins in stencil - // pairs for atoms j "below" i are excluded - // below = lower z or (equal z and lower y) or (equal zy and lower x) - // (equal zyx and j <= i) - // latter excludes self-self interaction but allows superposed atoms + // for triclinic, bin stencil is full in all 3 dims + // must use itag/jtag to eliminate half the I/J interactions + // cannot use I/J exact coord comparision + // b/c transforming orthog -> lambda -> orthog for ghost atoms + // with an added PBC offset can shift all 3 coords by epsilon ibin = atom2bin[i]; for (k = 0; k < nstencil; k++) { for (j = binhead[ibin+stencil[k]]; j >= 0; j = bins[j]) { - if (x[j][2] < ztmp) continue; - if (x[j][2] == ztmp) { - if (x[j][1] < ytmp) continue; - if (x[j][1] == ytmp) { - if (x[j][0] < xtmp) continue; - if (x[j][0] == xtmp && j <= i) continue; - } - } + + if (j <= i) continue; + if (j >= nlocal) { + jtag = tag[j]; + if (itag > jtag) { + if ((itag+jtag) % 2 == 0) continue; + } else if (itag < jtag) { + if ((itag+jtag) % 2 == 1) continue; + } else { + if (fabs(x[j][2]-ztmp) > delta) { + if (x[j][2] < ztmp) continue; + } else if (fabs(x[j][1]-ytmp) > delta) { + if (x[j][1] < ytmp) continue; + } else { + if (x[j][0] < xtmp) continue; + } + } + } if (exclude && exclusion(i,j,type[i],type[j],mask,molecule)) continue; diff --git a/src/npair_half_size_multi_newton_tri.cpp b/src/npair_half_size_multi_newton_tri.cpp index 5d8a0f05ef..a363ae6e1e 100644 --- a/src/npair_half_size_multi_newton_tri.cpp +++ b/src/npair_half_size_multi_newton_tri.cpp @@ -18,6 +18,7 @@ #include "atom_vec.h" #include "domain.h" #include "error.h" +#include "force.h" #include "molecule.h" #include "my_page.h" #include "neighbor.h" @@ -41,11 +42,13 @@ void NPairHalfSizeMultiNewtonTri::build(NeighList *list) { int i,j,jh,k,n,itype,jtype,icollection,jcollection,ibin,jbin,ns,js; int which,imol,iatom,moltemplate; - tagint tagprev; + tagint itag,jtag,tagprev; double xtmp,ytmp,ztmp,delx,dely,delz,rsq; double radi,radsum,cutdistsq; int *neighptr,*s; + const double delta = 0.01 * force->angstrom; + int *collection = neighbor->collection; double **x = atom->x; double *radius = atom->radius; @@ -78,6 +81,8 @@ void NPairHalfSizeMultiNewtonTri::build(NeighList *list) for (i = 0; i < nlocal; i++) { n = 0; neighptr = ipage->vget(); + + itag = tag[i]; itype = type[i]; icollection = collection[i]; xtmp = x[i][0]; @@ -93,11 +98,13 @@ void NPairHalfSizeMultiNewtonTri::build(NeighList *list) ibin = atom2bin[i]; // loop through stencils for all collections + for (jcollection = 0; jcollection < ncollections; jcollection++) { // if same collection use own bin + if (icollection == jcollection) jbin = ibin; - else jbin = coord2bin(x[i], jcollection); + else jbin = coord2bin(x[i], jcollection); // loop over all atoms in bins in stencil // stencil is empty if i larger than j @@ -108,56 +115,66 @@ void NPairHalfSizeMultiNewtonTri::build(NeighList *list) // (equal zyx and j <= i) // latter excludes self-self interaction but allows superposed atoms - s = stencil_multi[icollection][jcollection]; - ns = nstencil_multi[icollection][jcollection]; + s = stencil_multi[icollection][jcollection]; + ns = nstencil_multi[icollection][jcollection]; - for (k = 0; k < ns; k++) { - js = binhead_multi[jcollection][jbin + s[k]]; - for (j = js; j >= 0; j = bins[j]) { + for (k = 0; k < ns; k++) { + js = binhead_multi[jcollection][jbin + s[k]]; + for (j = js; j >= 0; j = bins[j]) { - // if same size (same collection), use half stencil - if (cutcollectionsq[icollection][icollection] == cutcollectionsq[jcollection][jcollection]){ - if (x[j][2] < ztmp) continue; - if (x[j][2] == ztmp) { - if (x[j][1] < ytmp) continue; - if (x[j][1] == ytmp) { - if (x[j][0] < xtmp) continue; - if (x[j][0] == xtmp && j <= i) continue; - } - } + // if same size (same collection), exclude half of interactions + + if (cutcollectionsq[icollection][icollection] == + cutcollectionsq[jcollection][jcollection]) { + if (j >= nlocal) { + jtag = tag[j]; + if (itag > jtag) { + if ((itag+jtag) % 2 == 0) continue; + } else if (itag < jtag) { + if ((itag+jtag) % 2 == 1) continue; + } else { + if (fabs(x[j][2]-ztmp) > delta) { + if (x[j][2] < ztmp) continue; + } else if (fabs(x[j][1]-ytmp) > delta) { + if (x[j][1] < ytmp) continue; + } else { + if (x[j][0] < xtmp) continue; + } + } + } } jtype = type[j]; if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; - delx = xtmp - x[j][0]; - dely = ytmp - x[j][1]; - delz = ztmp - x[j][2]; - rsq = delx*delx + dely*dely + delz*delz; - radsum = radi + radius[j]; - cutdistsq = (radsum+skin) * (radsum+skin); - - if (rsq <= cutdistsq) { - jh = j; - if (history && rsq < radsum*radsum) - jh = jh ^ mask_history; - - if (molecular != Atom::ATOMIC) { - if (!moltemplate) - which = find_special(special[i],nspecial[i],tag[j]); - else if (imol >= 0) - which = find_special(onemols[imol]->special[iatom], - onemols[imol]->nspecial[iatom], - tag[j]-tagprev); - else which = 0; - if (which == 0) neighptr[n++] = jh; - else if (domain->minimum_image_check(delx,dely,delz)) - neighptr[n++] = jh; - else if (which > 0) neighptr[n++] = jh ^ (which << SBBITS); - } else neighptr[n++] = jh; - } - } - } + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + rsq = delx*delx + dely*dely + delz*delz; + radsum = radi + radius[j]; + cutdistsq = (radsum+skin) * (radsum+skin); + + if (rsq <= cutdistsq) { + jh = j; + if (history && rsq < radsum*radsum) + jh = jh ^ mask_history; + + if (molecular != Atom::ATOMIC) { + if (!moltemplate) + which = find_special(special[i],nspecial[i],tag[j]); + else if (imol >= 0) + which = find_special(onemols[imol]->special[iatom], + onemols[imol]->nspecial[iatom], + tag[j]-tagprev); + else which = 0; + if (which == 0) neighptr[n++] = jh; + else if (domain->minimum_image_check(delx,dely,delz)) + neighptr[n++] = jh; + else if (which > 0) neighptr[n++] = jh ^ (which << SBBITS); + } else neighptr[n++] = jh; + } + } + } } ilist[inum++] = i; diff --git a/src/npair_half_size_multi_old_newton_tri.cpp b/src/npair_half_size_multi_old_newton_tri.cpp index ea3f271956..974500d6b8 100644 --- a/src/npair_half_size_multi_old_newton_tri.cpp +++ b/src/npair_half_size_multi_old_newton_tri.cpp @@ -18,6 +18,7 @@ #include "atom_vec.h" #include "domain.h" #include "error.h" +#include "force.h" #include "molecule.h" #include "my_page.h" #include "neigh_list.h" @@ -38,12 +39,14 @@ NPairHalfSizeMultiOldNewtonTri::NPairHalfSizeMultiOldNewtonTri(LAMMPS *lmp) : NP void NPairHalfSizeMultiOldNewtonTri::build(NeighList *list) { int i,j,jh,k,n,itype,jtype,ibin,ns,which,imol,iatom,moltemplate; - tagint tagprev; + tagint itag,jtag,tagprev; double xtmp,ytmp,ztmp,delx,dely,delz,rsq; double radi,radsum,cutdistsq; int *neighptr,*s; double *cutsq,*distsq; + const double delta = 0.01 * force->angstrom; + double **x = atom->x; double *radius = atom->radius; int *type = atom->type; @@ -76,6 +79,7 @@ void NPairHalfSizeMultiOldNewtonTri::build(NeighList *list) n = 0; neighptr = ipage->vget(); + itag = tag[i]; itype = type[i]; xtmp = x[i][0]; ytmp = x[i][1]; @@ -87,13 +91,12 @@ void NPairHalfSizeMultiOldNewtonTri::build(NeighList *list) tagprev = tag[i] - iatom - 1; } - // loop over all atoms in bins, including self, in stencil - // skip if i,j neighbor cutoff is less than bin distance - // bins below self are excluded from stencil - // pairs for atoms j "below" i are excluded - // below = lower z or (equal z and lower y) or (equal zy and lower x) - // (equal zyx and j <= i) - // latter excludes self-self interaction but allows superposed atoms + // loop over all atoms in bins in stencil + // for triclinic, bin stencil is full in all 3 dims + // must use itag/jtag to eliminate half the I/J interactions + // cannot use I/J exact coord comparision + // b/c transforming orthog -> lambda -> orthog for ghost atoms + // with an added PBC offset can shift all 3 coords by epsilon ibin = atom2bin[i]; s = stencil_multi_old[itype]; @@ -104,14 +107,24 @@ void NPairHalfSizeMultiOldNewtonTri::build(NeighList *list) for (j = binhead[ibin+s[k]]; j >= 0; j = bins[j]) { jtype = type[j]; if (cutsq[jtype] < distsq[k]) continue; - if (x[j][2] < ztmp) continue; - if (x[j][2] == ztmp) { - if (x[j][1] < ytmp) continue; - if (x[j][1] == ytmp) { - if (x[j][0] < xtmp) continue; - if (x[j][0] == xtmp && j <= i) continue; - } - } + + if (j <= i) continue; + if (j >= nlocal) { + jtag = tag[j]; + if (itag > jtag) { + if ((itag+jtag) % 2 == 0) continue; + } else if (itag < jtag) { + if ((itag+jtag) % 2 == 1) continue; + } else { + if (fabs(x[j][2]-ztmp) > delta) { + if (x[j][2] < ztmp) continue; + } else if (fabs(x[j][1]-ytmp) > delta) { + if (x[j][1] < ytmp) continue; + } else { + if (x[j][0] < xtmp) continue; + } + } + } if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; diff --git a/src/npair_half_size_nsq_newton.cpp b/src/npair_half_size_nsq_newton.cpp index 8b596e6968..abd2a4faff 100644 --- a/src/npair_half_size_nsq_newton.cpp +++ b/src/npair_half_size_nsq_newton.cpp @@ -18,6 +18,7 @@ #include "atom_vec.h" #include "domain.h" #include "error.h" +#include "force.h" #include "molecule.h" #include "group.h" #include "my_page.h" @@ -39,12 +40,15 @@ NPairHalfSizeNsqNewton::NPairHalfSizeNsqNewton(LAMMPS *lmp) : NPair(lmp) {} void NPairHalfSizeNsqNewton::build(NeighList *list) { - int i,j,jh,n,itag,jtag,bitmask,which,imol,iatom,moltemplate; - tagint tagprev; + int i,j,jh,n,bitmask,which,imol,iatom,moltemplate; + tagint itag,jtag,tagprev; double xtmp,ytmp,ztmp,delx,dely,delz,rsq; double radi,radsum,cutsq; int *neighptr; + const double delta = 0.01 * force->angstrom; + const int triclinic = domain->triclinic; + double **x = atom->x; double *radius = atom->radius; tagint *tag = atom->tag; @@ -93,6 +97,12 @@ void NPairHalfSizeNsqNewton::build(NeighList *list) } // loop over remaining atoms, owned and ghost + // use itag/jtap comparision to eliminate half the interactions + // itag = jtag is possible for long cutoffs that include images of self + // for triclinic, must use delta to eliminate half the I/J interactions + // cannot use I/J exact coord comparision as for orthog + // b/c transforming orthog -> lambda -> orthog for ghost atoms + // with an added PBC offset can shift all 3 coords by epsilon for (j = i+1; j < nall; j++) { if (includegroup && !(mask[j] & bitmask)) continue; @@ -103,6 +113,14 @@ void NPairHalfSizeNsqNewton::build(NeighList *list) if ((itag+jtag) % 2 == 0) continue; } else if (itag < jtag) { if ((itag+jtag) % 2 == 1) continue; + } else if (triclinic) { + if (fabs(x[j][2]-ztmp) > delta) { + if (x[j][2] < ztmp) continue; + } else if (fabs(x[j][1]-ytmp) > delta) { + if (x[j][1] < ytmp) continue; + } else { + if (x[j][0] < xtmp) continue; + } } else { if (x[j][2] < ztmp) continue; if (x[j][2] == ztmp) { diff --git a/src/npair_halffull_newton_trim.cpp b/src/npair_halffull_newton_trim.cpp index b7bb72c990..7d420f88af 100644 --- a/src/npair_halffull_newton_trim.cpp +++ b/src/npair_halffull_newton_trim.cpp @@ -14,7 +14,9 @@ #include "npair_halffull_newton_trim.h" #include "atom.h" +#include "domain.h" #include "error.h" +#include "force.h" #include "my_page.h" #include "neigh_list.h" @@ -38,6 +40,9 @@ void NPairHalffullNewtonTrim::build(NeighList *list) double xtmp, ytmp, ztmp; double delx, dely, delz, rsq; + const double delta = 0.01 * force->angstrom; + const int triclinic = domain->triclinic; + double **x = atom->x; int nlocal = atom->nlocal; @@ -68,6 +73,11 @@ void NPairHalffullNewtonTrim::build(NeighList *list) ztmp = x[i][2]; // loop over full neighbor list + // use i < j < nlocal to eliminate half the local/local interactions + // for triclinic, must use delta to eliminate half the local/ghost interactions + // cannot use I/J exact coord comparision as for orthog + // b/c transforming orthog -> lambda -> orthog for ghost atoms + // with an added PBC offset can shift all 3 coords by epsilon jlist = firstneigh_full[i]; jnum = numneigh_full[i]; @@ -75,8 +85,17 @@ void NPairHalffullNewtonTrim::build(NeighList *list) for (jj = 0; jj < jnum; jj++) { joriginal = jlist[jj]; j = joriginal & NEIGHMASK; + if (j < nlocal) { if (i > j) continue; + } else if (triclinic) { + if (fabs(x[j][2]-ztmp) > delta) { + if (x[j][2] < ztmp) continue; + } else if (fabs(x[j][1]-ytmp) > delta) { + if (x[j][1] < ytmp) continue; + } else { + if (x[j][0] < xtmp) continue; + } } else { if (x[j][2] < ztmp) continue; if (x[j][2] == ztmp) { diff --git a/src/nstencil_half_multi_2d_tri.cpp b/src/nstencil_half_multi_2d_tri.cpp index bf39c04099..85bbe94c86 100644 --- a/src/nstencil_half_multi_2d_tri.cpp +++ b/src/nstencil_half_multi_2d_tri.cpp @@ -80,7 +80,7 @@ void NStencilHalfMulti2dTri::create() cutsq = cutcollectionsq[icollection][jcollection]; if (flag_half_multi[icollection][jcollection]) { - for (j = 0; j <= sy; j++) + for (j = -sy; j <= sy; j++) for (i = -sx; i <= sx; i++) if (bin_distance_multi(i, j, 0, bin_collection) < cutsq) stencil_multi[icollection][jcollection][ns++] = j * mbinx + i; diff --git a/src/nstencil_half_multi_3d_tri.cpp b/src/nstencil_half_multi_3d_tri.cpp index f2d4d051ad..9761e15854 100644 --- a/src/nstencil_half_multi_3d_tri.cpp +++ b/src/nstencil_half_multi_3d_tri.cpp @@ -81,7 +81,7 @@ void NStencilHalfMulti3dTri::create() cutsq = cutcollectionsq[icollection][jcollection]; if (flag_half_multi[icollection][jcollection]) { - for (k = 0; k <= sz; k++) + for (k = -sz; k <= sz; k++) for (j = -sy; j <= sy; j++) for (i = -sx; i <= sx; i++) if (bin_distance_multi(i, j, k, bin_collection) < cutsq) diff --git a/src/nstencil_half_multi_old_2d_tri.cpp b/src/nstencil_half_multi_old_2d_tri.cpp index 1438aef843..0aeb65bebd 100644 --- a/src/nstencil_half_multi_old_2d_tri.cpp +++ b/src/nstencil_half_multi_old_2d_tri.cpp @@ -37,7 +37,7 @@ void NStencilHalfMultiOld2dTri::create() s = stencil_multi_old[itype]; distsq = distsq_multi_old[itype]; n = 0; - for (j = 0; j <= sy; j++) + for (j = -sy; j <= sy; j++) for (i = -sx; i <= sx; i++) { rsq = bin_distance(i, j, 0); if (rsq < typesq) { diff --git a/src/nstencil_half_multi_old_3d_tri.cpp b/src/nstencil_half_multi_old_3d_tri.cpp index 836eee6039..3717b7836b 100644 --- a/src/nstencil_half_multi_old_3d_tri.cpp +++ b/src/nstencil_half_multi_old_3d_tri.cpp @@ -37,7 +37,7 @@ void NStencilHalfMultiOld3dTri::create() s = stencil_multi_old[itype]; distsq = distsq_multi_old[itype]; n = 0; - for (k = 0; k <= sz; k++) + for (k = -sz; k <= sz; k++) for (j = -sy; j <= sy; j++) for (i = -sx; i <= sx; i++) { rsq = bin_distance(i, j, k); From 6bd965f0df72b23b1a4819f9382eefc642619e72 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 10 Jul 2023 22:35:36 -0400 Subject: [PATCH 021/219] fix whitespace (again) --- src/compute_property_local.cpp | 2 +- src/npair_half_bin_newton_tri.cpp | 36 +++---- src/npair_half_multi_newton_tri.cpp | 98 +++++++++--------- src/npair_half_multi_old_newton_tri.cpp | 32 +++--- src/npair_half_respa_bin_newton_tri.cpp | 36 +++---- src/npair_half_size_bin_newton_tri.cpp | 34 +++---- src/npair_half_size_multi_newton_tri.cpp | 100 +++++++++---------- src/npair_half_size_multi_old_newton_tri.cpp | 34 +++---- src/npair_halffull_newton_trim.cpp | 2 +- src/nstencil_half_bin_3d_tri.cpp | 2 +- 10 files changed, 188 insertions(+), 188 deletions(-) diff --git a/src/compute_property_local.cpp b/src/compute_property_local.cpp index 92036c4bd2..87517a3e05 100644 --- a/src/compute_property_local.cpp +++ b/src/compute_property_local.cpp @@ -406,7 +406,7 @@ int ComputePropertyLocal::count_pairs(int allflag, int forceflag) // itag = jtag is possible for long cutoffs that include images of self // do not need triclinic logic here b/c neighbor list itself is correct - + if (newton_pair == 0 && j >= nlocal) { jtag = tag[j]; if (itag > jtag) { diff --git a/src/npair_half_bin_newton_tri.cpp b/src/npair_half_bin_newton_tri.cpp index 9c0688af68..453d10096e 100644 --- a/src/npair_half_bin_newton_tri.cpp +++ b/src/npair_half_bin_newton_tri.cpp @@ -88,28 +88,28 @@ void NPairHalfBinNewtonTri::build(NeighList *list) // cannot use I/J exact coord comparision // b/c transforming orthog -> lambda -> orthog for ghost atoms // with an added PBC offset can shift all 3 coords by epsilon - + ibin = atom2bin[i]; for (k = 0; k < nstencil; k++) { for (j = binhead[ibin+stencil[k]]; j >= 0; j = bins[j]) { - if (j <= i) continue; - if (j >= nlocal) { - jtag = tag[j]; - if (itag > jtag) { - if ((itag+jtag) % 2 == 0) continue; - } else if (itag < jtag) { - if ((itag+jtag) % 2 == 1) continue; - } else { - if (fabs(x[j][2]-ztmp) > delta) { - if (x[j][2] < ztmp) continue; - } else if (fabs(x[j][1]-ytmp) > delta) { - if (x[j][1] < ytmp) continue; - } else { - if (x[j][0] < xtmp) continue; - } - } - } + if (j <= i) continue; + if (j >= nlocal) { + jtag = tag[j]; + if (itag > jtag) { + if ((itag+jtag) % 2 == 0) continue; + } else if (itag < jtag) { + if ((itag+jtag) % 2 == 1) continue; + } else { + if (fabs(x[j][2]-ztmp) > delta) { + if (x[j][2] < ztmp) continue; + } else if (fabs(x[j][1]-ytmp) > delta) { + if (x[j][1] < ytmp) continue; + } else { + if (x[j][0] < xtmp) continue; + } + } + } jtype = type[j]; if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; diff --git a/src/npair_half_multi_newton_tri.cpp b/src/npair_half_multi_newton_tri.cpp index 316acb5049..1d75d6a3ef 100644 --- a/src/npair_half_multi_newton_tri.cpp +++ b/src/npair_half_multi_newton_tri.cpp @@ -91,11 +91,11 @@ void NPairHalfMultiNewtonTri::build(NeighList *list) ibin = atom2bin[i]; // loop through stencils for all collections - + for (jcollection = 0; jcollection < ncollections; jcollection++) { // if same collection use own bin - + if (icollection == jcollection) jbin = ibin; else jbin = coord2bin(x[i], jcollection); @@ -109,60 +109,60 @@ void NPairHalfMultiNewtonTri::build(NeighList *list) // cannot use I/J exact coord comparision // b/c transforming orthog -> lambda -> orthog for ghost atoms // with an added PBC offset can shift all 3 coords by epsilon - + s = stencil_multi[icollection][jcollection]; ns = nstencil_multi[icollection][jcollection]; for (k = 0; k < ns; k++) { - js = binhead_multi[jcollection][jbin + s[k]]; - for (j = js; j >= 0; j = bins[j]) { - - // if same size (same collection), exclude half of interactions - - if (cutcollectionsq[icollection][icollection] == - cutcollectionsq[jcollection][jcollection]) { - if (j >= nlocal) { - jtag = tag[j]; - if (itag > jtag) { - if ((itag+jtag) % 2 == 0) continue; - } else if (itag < jtag) { - if ((itag+jtag) % 2 == 1) continue; - } else { - if (fabs(x[j][2]-ztmp) > delta) { - if (x[j][2] < ztmp) continue; - } else if (fabs(x[j][1]-ytmp) > delta) { - if (x[j][1] < ytmp) continue; - } else { - if (x[j][0] < xtmp) continue; - } - } - } - } + js = binhead_multi[jcollection][jbin + s[k]]; + for (j = js; j >= 0; j = bins[j]) { - jtype = type[j]; - if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; + // if same size (same collection), exclude half of interactions - delx = xtmp - x[j][0]; - dely = ytmp - x[j][1]; - delz = ztmp - x[j][2]; - rsq = delx*delx + dely*dely + delz*delz; + if (cutcollectionsq[icollection][icollection] == + cutcollectionsq[jcollection][jcollection]) { + if (j >= nlocal) { + jtag = tag[j]; + if (itag > jtag) { + if ((itag+jtag) % 2 == 0) continue; + } else if (itag < jtag) { + if ((itag+jtag) % 2 == 1) continue; + } else { + if (fabs(x[j][2]-ztmp) > delta) { + if (x[j][2] < ztmp) continue; + } else if (fabs(x[j][1]-ytmp) > delta) { + if (x[j][1] < ytmp) continue; + } else { + if (x[j][0] < xtmp) continue; + } + } + } + } - if (rsq <= cutneighsq[itype][jtype]) { - if (molecular != Atom::ATOMIC) { - if (!moltemplate) - which = find_special(special[i],nspecial[i],tag[j]); - else if (imol >= 0) - which = find_special(onemols[imol]->special[iatom], - onemols[imol]->nspecial[iatom], - tag[j]-tagprev); - else which = 0; - if (which == 0) neighptr[n++] = j; - else if (domain->minimum_image_check(delx,dely,delz)) - neighptr[n++] = j; - else if (which > 0) neighptr[n++] = j ^ (which << SBBITS); - } else neighptr[n++] = j; - } - } + jtype = type[j]; + if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; + + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + rsq = delx*delx + dely*dely + delz*delz; + + if (rsq <= cutneighsq[itype][jtype]) { + if (molecular != Atom::ATOMIC) { + if (!moltemplate) + which = find_special(special[i],nspecial[i],tag[j]); + else if (imol >= 0) + which = find_special(onemols[imol]->special[iatom], + onemols[imol]->nspecial[iatom], + tag[j]-tagprev); + else which = 0; + if (which == 0) neighptr[n++] = j; + else if (domain->minimum_image_check(delx,dely,delz)) + neighptr[n++] = j; + else if (which > 0) neighptr[n++] = j ^ (which << SBBITS); + } else neighptr[n++] = j; + } + } } } diff --git a/src/npair_half_multi_old_newton_tri.cpp b/src/npair_half_multi_old_newton_tri.cpp index 9dcbcff9f4..72d46d042f 100644 --- a/src/npair_half_multi_old_newton_tri.cpp +++ b/src/npair_half_multi_old_newton_tri.cpp @@ -102,22 +102,22 @@ void NPairHalfMultiOldNewtonTri::build(NeighList *list) jtype = type[j]; if (cutsq[jtype] < distsq[k]) continue; - if (j >= nlocal) { - jtag = tag[j]; - if (itag > jtag) { - if ((itag+jtag) % 2 == 0) continue; - } else if (itag < jtag) { - if ((itag+jtag) % 2 == 1) continue; - } else { - if (fabs(x[j][2]-ztmp) > delta) { - if (x[j][2] < ztmp) continue; - } else if (fabs(x[j][1]-ytmp) > delta) { - if (x[j][1] < ytmp) continue; - } else { - if (x[j][0] < xtmp) continue; - } - } - } + if (j >= nlocal) { + jtag = tag[j]; + if (itag > jtag) { + if ((itag+jtag) % 2 == 0) continue; + } else if (itag < jtag) { + if ((itag+jtag) % 2 == 1) continue; + } else { + if (fabs(x[j][2]-ztmp) > delta) { + if (x[j][2] < ztmp) continue; + } else if (fabs(x[j][1]-ytmp) > delta) { + if (x[j][1] < ytmp) continue; + } else { + if (x[j][0] < xtmp) continue; + } + } + } if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; diff --git a/src/npair_half_respa_bin_newton_tri.cpp b/src/npair_half_respa_bin_newton_tri.cpp index 05b839869a..eac67b8bd5 100644 --- a/src/npair_half_respa_bin_newton_tri.cpp +++ b/src/npair_half_respa_bin_newton_tri.cpp @@ -118,24 +118,24 @@ void NPairHalfRespaBinNewtonTri::build(NeighList *list) ibin = atom2bin[i]; for (k = 0; k < nstencil; k++) { for (j = binhead[ibin+stencil[k]]; j >= 0; j = bins[j]) { - - if (j <= i) continue; - if (j >= nlocal) { - jtag = tag[j]; - if (itag > jtag) { - if ((itag+jtag) % 2 == 0) continue; - } else if (itag < jtag) { - if ((itag+jtag) % 2 == 1) continue; - } else { - if (fabs(x[j][2]-ztmp) > delta) { - if (x[j][2] < ztmp) continue; - } else if (fabs(x[j][1]-ytmp) > delta) { - if (x[j][1] < ytmp) continue; - } else { - if (x[j][0] < xtmp) continue; - } - } - } + + if (j <= i) continue; + if (j >= nlocal) { + jtag = tag[j]; + if (itag > jtag) { + if ((itag+jtag) % 2 == 0) continue; + } else if (itag < jtag) { + if ((itag+jtag) % 2 == 1) continue; + } else { + if (fabs(x[j][2]-ztmp) > delta) { + if (x[j][2] < ztmp) continue; + } else if (fabs(x[j][1]-ytmp) > delta) { + if (x[j][1] < ytmp) continue; + } else { + if (x[j][0] < xtmp) continue; + } + } + } jtype = type[j]; if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; diff --git a/src/npair_half_size_bin_newton_tri.cpp b/src/npair_half_size_bin_newton_tri.cpp index e6a236eecb..0d1a0a7329 100644 --- a/src/npair_half_size_bin_newton_tri.cpp +++ b/src/npair_half_size_bin_newton_tri.cpp @@ -101,23 +101,23 @@ void NPairHalfSizeBinNewtonTri::build(NeighList *list) for (k = 0; k < nstencil; k++) { for (j = binhead[ibin+stencil[k]]; j >= 0; j = bins[j]) { - if (j <= i) continue; - if (j >= nlocal) { - jtag = tag[j]; - if (itag > jtag) { - if ((itag+jtag) % 2 == 0) continue; - } else if (itag < jtag) { - if ((itag+jtag) % 2 == 1) continue; - } else { - if (fabs(x[j][2]-ztmp) > delta) { - if (x[j][2] < ztmp) continue; - } else if (fabs(x[j][1]-ytmp) > delta) { - if (x[j][1] < ytmp) continue; - } else { - if (x[j][0] < xtmp) continue; - } - } - } + if (j <= i) continue; + if (j >= nlocal) { + jtag = tag[j]; + if (itag > jtag) { + if ((itag+jtag) % 2 == 0) continue; + } else if (itag < jtag) { + if ((itag+jtag) % 2 == 1) continue; + } else { + if (fabs(x[j][2]-ztmp) > delta) { + if (x[j][2] < ztmp) continue; + } else if (fabs(x[j][1]-ytmp) > delta) { + if (x[j][1] < ytmp) continue; + } else { + if (x[j][0] < xtmp) continue; + } + } + } if (exclude && exclusion(i,j,type[i],type[j],mask,molecule)) continue; diff --git a/src/npair_half_size_multi_newton_tri.cpp b/src/npair_half_size_multi_newton_tri.cpp index a363ae6e1e..f597789dee 100644 --- a/src/npair_half_size_multi_newton_tri.cpp +++ b/src/npair_half_size_multi_newton_tri.cpp @@ -98,11 +98,11 @@ void NPairHalfSizeMultiNewtonTri::build(NeighList *list) ibin = atom2bin[i]; // loop through stencils for all collections - + for (jcollection = 0; jcollection < ncollections; jcollection++) { // if same collection use own bin - + if (icollection == jcollection) jbin = ibin; else jbin = coord2bin(x[i], jcollection); @@ -119,61 +119,61 @@ void NPairHalfSizeMultiNewtonTri::build(NeighList *list) ns = nstencil_multi[icollection][jcollection]; for (k = 0; k < ns; k++) { - js = binhead_multi[jcollection][jbin + s[k]]; - for (j = js; j >= 0; j = bins[j]) { + js = binhead_multi[jcollection][jbin + s[k]]; + for (j = js; j >= 0; j = bins[j]) { + + // if same size (same collection), exclude half of interactions - // if same size (same collection), exclude half of interactions - if (cutcollectionsq[icollection][icollection] == - cutcollectionsq[jcollection][jcollection]) { - if (j >= nlocal) { - jtag = tag[j]; - if (itag > jtag) { - if ((itag+jtag) % 2 == 0) continue; - } else if (itag < jtag) { - if ((itag+jtag) % 2 == 1) continue; - } else { - if (fabs(x[j][2]-ztmp) > delta) { - if (x[j][2] < ztmp) continue; - } else if (fabs(x[j][1]-ytmp) > delta) { - if (x[j][1] < ytmp) continue; - } else { - if (x[j][0] < xtmp) continue; - } - } - } + cutcollectionsq[jcollection][jcollection]) { + if (j >= nlocal) { + jtag = tag[j]; + if (itag > jtag) { + if ((itag+jtag) % 2 == 0) continue; + } else if (itag < jtag) { + if ((itag+jtag) % 2 == 1) continue; + } else { + if (fabs(x[j][2]-ztmp) > delta) { + if (x[j][2] < ztmp) continue; + } else if (fabs(x[j][1]-ytmp) > delta) { + if (x[j][1] < ytmp) continue; + } else { + if (x[j][0] < xtmp) continue; + } + } + } } jtype = type[j]; if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; - delx = xtmp - x[j][0]; - dely = ytmp - x[j][1]; - delz = ztmp - x[j][2]; - rsq = delx*delx + dely*dely + delz*delz; - radsum = radi + radius[j]; - cutdistsq = (radsum+skin) * (radsum+skin); - - if (rsq <= cutdistsq) { - jh = j; - if (history && rsq < radsum*radsum) - jh = jh ^ mask_history; - - if (molecular != Atom::ATOMIC) { - if (!moltemplate) - which = find_special(special[i],nspecial[i],tag[j]); - else if (imol >= 0) - which = find_special(onemols[imol]->special[iatom], - onemols[imol]->nspecial[iatom], - tag[j]-tagprev); - else which = 0; - if (which == 0) neighptr[n++] = jh; - else if (domain->minimum_image_check(delx,dely,delz)) - neighptr[n++] = jh; - else if (which > 0) neighptr[n++] = jh ^ (which << SBBITS); - } else neighptr[n++] = jh; - } - } + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + rsq = delx*delx + dely*dely + delz*delz; + radsum = radi + radius[j]; + cutdistsq = (radsum+skin) * (radsum+skin); + + if (rsq <= cutdistsq) { + jh = j; + if (history && rsq < radsum*radsum) + jh = jh ^ mask_history; + + if (molecular != Atom::ATOMIC) { + if (!moltemplate) + which = find_special(special[i],nspecial[i],tag[j]); + else if (imol >= 0) + which = find_special(onemols[imol]->special[iatom], + onemols[imol]->nspecial[iatom], + tag[j]-tagprev); + else which = 0; + if (which == 0) neighptr[n++] = jh; + else if (domain->minimum_image_check(delx,dely,delz)) + neighptr[n++] = jh; + else if (which > 0) neighptr[n++] = jh ^ (which << SBBITS); + } else neighptr[n++] = jh; + } + } } } diff --git a/src/npair_half_size_multi_old_newton_tri.cpp b/src/npair_half_size_multi_old_newton_tri.cpp index 974500d6b8..848a19aa39 100644 --- a/src/npair_half_size_multi_old_newton_tri.cpp +++ b/src/npair_half_size_multi_old_newton_tri.cpp @@ -108,23 +108,23 @@ void NPairHalfSizeMultiOldNewtonTri::build(NeighList *list) jtype = type[j]; if (cutsq[jtype] < distsq[k]) continue; - if (j <= i) continue; - if (j >= nlocal) { - jtag = tag[j]; - if (itag > jtag) { - if ((itag+jtag) % 2 == 0) continue; - } else if (itag < jtag) { - if ((itag+jtag) % 2 == 1) continue; - } else { - if (fabs(x[j][2]-ztmp) > delta) { - if (x[j][2] < ztmp) continue; - } else if (fabs(x[j][1]-ytmp) > delta) { - if (x[j][1] < ytmp) continue; - } else { - if (x[j][0] < xtmp) continue; - } - } - } + if (j <= i) continue; + if (j >= nlocal) { + jtag = tag[j]; + if (itag > jtag) { + if ((itag+jtag) % 2 == 0) continue; + } else if (itag < jtag) { + if ((itag+jtag) % 2 == 1) continue; + } else { + if (fabs(x[j][2]-ztmp) > delta) { + if (x[j][2] < ztmp) continue; + } else if (fabs(x[j][1]-ytmp) > delta) { + if (x[j][1] < ytmp) continue; + } else { + if (x[j][0] < xtmp) continue; + } + } + } if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; diff --git a/src/npair_halffull_newton_trim.cpp b/src/npair_halffull_newton_trim.cpp index 7d420f88af..e758c04284 100644 --- a/src/npair_halffull_newton_trim.cpp +++ b/src/npair_halffull_newton_trim.cpp @@ -85,7 +85,7 @@ void NPairHalffullNewtonTrim::build(NeighList *list) for (jj = 0; jj < jnum; jj++) { joriginal = jlist[jj]; j = joriginal & NEIGHMASK; - + if (j < nlocal) { if (i > j) continue; } else if (triclinic) { diff --git a/src/nstencil_half_bin_3d_tri.cpp b/src/nstencil_half_bin_3d_tri.cpp index d146b92cd1..72bef7fb76 100644 --- a/src/nstencil_half_bin_3d_tri.cpp +++ b/src/nstencil_half_bin_3d_tri.cpp @@ -33,7 +33,7 @@ void NStencilHalfBin3dTri::create() // with an added PBC offset can shift all 3 coords by epsilon // thus for an I/J owned/ghost pair, the xyz coords // and bin assignments can be different on I proc vs J proc - + nstencil = 0; for (k = -sz; k <= sz; k++) From 2eeea4332076c4a11193bd6c4a71d29ab649778c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 11 Jul 2023 01:09:44 -0400 Subject: [PATCH 022/219] port neighbor list changes to OPENMP package --- src/OPENMP/npair_half_bin_newton_tri_omp.cpp | 20 +-- .../npair_half_multi_newton_tri_omp.cpp | 118 ++++++++++-------- .../npair_half_multi_old_newton_tri_omp.cpp | 50 +++++--- src/OPENMP/npair_half_nsq_newton_omp.cpp | 7 +- .../npair_half_respa_bin_newton_tri_omp.cpp | 47 ++++--- .../npair_half_respa_nsq_newton_omp.cpp | 35 ++++-- .../npair_half_size_bin_newton_tri_omp.cpp | 40 +++--- .../npair_half_size_multi_newton_tri_omp.cpp | 43 ++++--- ...air_half_size_multi_old_newton_tri_omp.cpp | 42 ++++--- src/OPENMP/npair_half_size_nsq_newton_omp.cpp | 27 +++- src/npair_half_bin_newton_tri.cpp | 3 +- src/npair_half_multi_newton_tri.cpp | 4 +- src/npair_half_respa_bin_newton_tri.cpp | 3 +- src/npair_half_respa_nsq_newton.cpp | 7 +- src/npair_half_size_nsq_newton.cpp | 2 +- 15 files changed, 278 insertions(+), 170 deletions(-) diff --git a/src/OPENMP/npair_half_bin_newton_tri_omp.cpp b/src/OPENMP/npair_half_bin_newton_tri_omp.cpp index 3ad07acd56..47524474ed 100644 --- a/src/OPENMP/npair_half_bin_newton_tri_omp.cpp +++ b/src/OPENMP/npair_half_bin_newton_tri_omp.cpp @@ -12,17 +12,18 @@ See the README file in the top-level LAMMPS directory. ------------------------------------------------------------------------- */ -#include "omp_compat.h" #include "npair_half_bin_newton_tri_omp.h" #include "npair_omp.h" -#include "neigh_list.h" +#include "omp_compat.h" + #include "atom.h" #include "atom_vec.h" +#include "domain.h" +#include "error.h" #include "force.h" #include "molecule.h" -#include "domain.h" #include "my_page.h" -#include "error.h" +#include "neigh_list.h" using namespace LAMMPS_NS; @@ -54,8 +55,6 @@ void NPairHalfBinNewtonTriOmp::build(NeighList *list) double xtmp,ytmp,ztmp,delx,dely,delz,rsq; int *neighptr; - // loop over each atom, storing neighbors - double **x = atom->x; int *type = atom->type; int *mask = atom->mask; @@ -93,10 +92,11 @@ void NPairHalfBinNewtonTriOmp::build(NeighList *list) } // loop over all atoms in bins in stencil - // pairs for atoms j "below" i are excluded - // below = lower z or (equal z and lower y) or (equal zy and lower x) - // (equal zyx and j <= i) - // latter excludes self-self interaction but allows superposed atoms + // for triclinic, bin stencil is full in all 3 dims + // must use itag/jtag to eliminate half the I/J interactions + // cannot use I/J exact coord comparision + // b/c transforming orthog -> lambda -> orthog for ghost atoms + // with an added PBC offset can shift all 3 coords by epsilon ibin = atom2bin[i]; for (k = 0; k < nstencil; k++) { diff --git a/src/OPENMP/npair_half_multi_newton_tri_omp.cpp b/src/OPENMP/npair_half_multi_newton_tri_omp.cpp index a152d011a7..b18cba0261 100644 --- a/src/OPENMP/npair_half_multi_newton_tri_omp.cpp +++ b/src/OPENMP/npair_half_multi_newton_tri_omp.cpp @@ -12,17 +12,19 @@ See the README file in the top-level LAMMPS directory. ------------------------------------------------------------------------- */ -#include "omp_compat.h" #include "npair_half_multi_newton_tri_omp.h" -#include "npair_omp.h" -#include "neighbor.h" -#include "neigh_list.h" + #include "atom.h" #include "atom_vec.h" -#include "molecule.h" #include "domain.h" -#include "my_page.h" #include "error.h" +#include "force.h" +#include "molecule.h" +#include "my_page.h" +#include "neigh_list.h" +#include "neighbor.h" +#include "npair_omp.h" +#include "omp_compat.h" using namespace LAMMPS_NS; @@ -43,6 +45,7 @@ void NPairHalfMultiNewtonTriOmp::build(NeighList *list) const int nlocal = (includegroup) ? atom->nfirst : atom->nlocal; const int molecular = atom->molecular; const int moltemplate = (molecular == Atom::TEMPLATE) ? 1 : 0; + const double delta = 0.01 * force->angstrom; NPAIR_OMP_INIT; #if defined(_OPENMP) @@ -51,13 +54,11 @@ void NPairHalfMultiNewtonTriOmp::build(NeighList *list) NPAIR_OMP_SETUP(nlocal); int i,j,k,n,itype,jtype,ibin,jbin,icollection,jcollection,which,ns,imol,iatom; - tagint tagprev; + tagint itag,jtag,tagprev; double xtmp,ytmp,ztmp,delx,dely,delz,rsq; int *neighptr,*s; int js; - // loop over each atom, storing neighbors - int *collection = neighbor->collection; double **x = atom->x; int *type = atom->type; @@ -84,6 +85,7 @@ void NPairHalfMultiNewtonTriOmp::build(NeighList *list) n = 0; neighptr = ipage.vget(); + itag = tag[i]; itype = type[i]; icollection = collection[i]; xtmp = x[i][0]; @@ -98,65 +100,79 @@ void NPairHalfMultiNewtonTriOmp::build(NeighList *list) ibin = atom2bin[i]; // loop through stencils for all collections + for (jcollection = 0; jcollection < ncollections; jcollection++) { // if same collection use own bin + if (icollection == jcollection) jbin = ibin; - else jbin = coord2bin(x[i], jcollection); + else jbin = coord2bin(x[i], jcollection); // loop over all atoms in bins in stencil - // stencil is empty if i larger than j - // stencil is half if i same size as j - // stencil is full if i smaller than j - // if half: pairs for atoms j "below" i are excluded - // below = lower z or (equal z and lower y) or (equal zy and lower x) - // (equal zyx and j <= i) - // latter excludes self-self interaction but allows superposed atoms + // for triclinic: + // stencil is empty if i larger than j + // stencil is full if i smaller than j + // stencil is full if i same size as j + // for i smaller than j: + // must use itag/jtag to eliminate half the I/J interactions + // cannot use I/J exact coord comparision + // b/c transforming orthog -> lambda -> orthog for ghost atoms + // with an added PBC offset can shift all 3 coords by epsilon - s = stencil_multi[icollection][jcollection]; - ns = nstencil_multi[icollection][jcollection]; + s = stencil_multi[icollection][jcollection]; + ns = nstencil_multi[icollection][jcollection]; - for (k = 0; k < ns; k++) { - js = binhead_multi[jcollection][jbin + s[k]]; - for (j = js; j >= 0; j = bins[j]) { + for (k = 0; k < ns; k++) { + js = binhead_multi[jcollection][jbin + s[k]]; + for (j = js; j >= 0; j = bins[j]) { - // if same size (same collection), use half stencil - if (cutcollectionsq[icollection][icollection] == cutcollectionsq[jcollection][jcollection]){ - if (x[j][2] < ztmp) continue; - if (x[j][2] == ztmp) { - if (x[j][1] < ytmp) continue; - if (x[j][1] == ytmp) { - if (x[j][0] < xtmp) continue; - if (x[j][0] == xtmp && j <= i) continue; + // if same size (same collection), exclude half of interactions + + if (cutcollectionsq[icollection][icollection] == + cutcollectionsq[jcollection][jcollection]) { + if (j >= nlocal) { + jtag = tag[j]; + if (itag > jtag) { + if ((itag+jtag) % 2 == 0) continue; + } else if (itag < jtag) { + if ((itag+jtag) % 2 == 1) continue; + } else { + if (fabs(x[j][2]-ztmp) > delta) { + if (x[j][2] < ztmp) continue; + } else if (fabs(x[j][1]-ytmp) > delta) { + if (x[j][1] < ytmp) continue; + } else { + if (x[j][0] < xtmp) continue; + } } } } jtype = type[j]; - if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; + if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; - delx = xtmp - x[j][0]; - dely = ytmp - x[j][1]; - delz = ztmp - x[j][2]; - rsq = delx*delx + dely*dely + delz*delz; + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + rsq = delx*delx + dely*dely + delz*delz; - if (rsq <= cutneighsq[itype][jtype]) { - if (molecular != Atom::ATOMIC) { - if (!moltemplate) - which = find_special(special[i],nspecial[i],tag[j]); - else if (imol >= 0) - which = find_special(onemols[imol]->special[iatom], - onemols[imol]->nspecial[iatom], - tag[j]-tagprev); - else which = 0; - if (which == 0) neighptr[n++] = j; - else if (domain->minimum_image_check(delx,dely,delz)) - neighptr[n++] = j; - else if (which > 0) neighptr[n++] = j ^ (which << SBBITS); - } else neighptr[n++] = j; - } - } + if (rsq <= cutneighsq[itype][jtype]) { + if (molecular != Atom::ATOMIC) { + if (!moltemplate) + which = find_special(special[i],nspecial[i],tag[j]); + else if (imol >= 0) + which = find_special(onemols[imol]->special[iatom], + onemols[imol]->nspecial[iatom], + tag[j]-tagprev); + else which = 0; + if (which == 0) neighptr[n++] = j; + else if (domain->minimum_image_check(delx,dely,delz)) + neighptr[n++] = j; + else if (which > 0) neighptr[n++] = j ^ (which << SBBITS); + } else neighptr[n++] = j; } + } + } } ilist[i] = i; diff --git a/src/OPENMP/npair_half_multi_old_newton_tri_omp.cpp b/src/OPENMP/npair_half_multi_old_newton_tri_omp.cpp index e4895ff1a9..38f645abad 100644 --- a/src/OPENMP/npair_half_multi_old_newton_tri_omp.cpp +++ b/src/OPENMP/npair_half_multi_old_newton_tri_omp.cpp @@ -15,13 +15,15 @@ #include "omp_compat.h" #include "npair_half_multi_old_newton_tri_omp.h" #include "npair_omp.h" -#include "neigh_list.h" + #include "atom.h" #include "atom_vec.h" -#include "molecule.h" #include "domain.h" -#include "my_page.h" #include "error.h" +#include "force.h" +#include "molecule.h" +#include "my_page.h" +#include "neigh_list.h" using namespace LAMMPS_NS; @@ -42,6 +44,7 @@ void NPairHalfMultiOldNewtonTriOmp::build(NeighList *list) const int nlocal = (includegroup) ? atom->nfirst : atom->nlocal; const int molecular = atom->molecular; const int moltemplate = (molecular == Atom::TEMPLATE) ? 1 : 0; + const double delta = 0.01 * force->angstrom; NPAIR_OMP_INIT; #if defined(_OPENMP) @@ -50,13 +53,11 @@ void NPairHalfMultiOldNewtonTriOmp::build(NeighList *list) NPAIR_OMP_SETUP(nlocal); int i,j,k,n,itype,jtype,ibin,which,ns,imol,iatom; - tagint tagprev; + tagint itag,jtag,tagprev; double xtmp,ytmp,ztmp,delx,dely,delz,rsq; int *neighptr,*s; double *cutsq,*distsq; - // loop over each atom, storing neighbors - double **x = atom->x; int *type = atom->type; int *mask = atom->mask; @@ -82,6 +83,7 @@ void NPairHalfMultiOldNewtonTriOmp::build(NeighList *list) n = 0; neighptr = ipage.vget(); + itag = tag[i]; itype = type[i]; xtmp = x[i][0]; ytmp = x[i][1]; @@ -92,13 +94,12 @@ void NPairHalfMultiOldNewtonTriOmp::build(NeighList *list) tagprev = tag[i] - iatom - 1; } - // loop over all atoms in bins, including self, in stencil - // skip if i,j neighbor cutoff is less than bin distance - // bins below self are excluded from stencil - // pairs for atoms j "below" i are excluded - // below = lower z or (equal z and lower y) or (equal zy and lower x) - // (equal zyx and j <= i) - // latter excludes self-self interaction but allows superposed atoms + // loop over all atoms in bins in stencil + // for triclinic, bin stencil is full in all 3 dims + // must use itag/jtag to eliminate half the I/J interactions + // cannot use I/J exact coord comparision + // b/c transforming orthog -> lambda -> orthog for ghost atoms + // with an added PBC offset can shift all 3 coords by epsilon ibin = atom2bin[i]; s = stencil_multi_old[itype]; @@ -109,12 +110,21 @@ void NPairHalfMultiOldNewtonTriOmp::build(NeighList *list) for (j = binhead[ibin+s[k]]; j >= 0; j = bins[j]) { jtype = type[j]; if (cutsq[jtype] < distsq[k]) continue; - if (x[j][2] < ztmp) continue; - if (x[j][2] == ztmp) { - if (x[j][1] < ytmp) continue; - if (x[j][1] == ytmp) { - if (x[j][0] < xtmp) continue; - if (x[j][0] == xtmp && j <= i) continue; + + if (j >= nlocal) { + jtag = tag[j]; + if (itag > jtag) { + if ((itag+jtag) % 2 == 0) continue; + } else if (itag < jtag) { + if ((itag+jtag) % 2 == 1) continue; + } else { + if (fabs(x[j][2]-ztmp) > delta) { + if (x[j][2] < ztmp) continue; + } else if (fabs(x[j][1]-ytmp) > delta) { + if (x[j][1] < ytmp) continue; + } else { + if (x[j][0] < xtmp) continue; + } } } @@ -129,7 +139,7 @@ void NPairHalfMultiOldNewtonTriOmp::build(NeighList *list) if (molecular != Atom::ATOMIC) { if (!moltemplate) which = find_special(special[i],nspecial[i],tag[j]); - else if (imol >=0) + else if (imol >= 0) which = find_special(onemols[imol]->special[iatom], onemols[imol]->nspecial[iatom], tag[j]-tagprev); diff --git a/src/OPENMP/npair_half_nsq_newton_omp.cpp b/src/OPENMP/npair_half_nsq_newton_omp.cpp index 726814c6f0..42cf63278a 100644 --- a/src/OPENMP/npair_half_nsq_newton_omp.cpp +++ b/src/OPENMP/npair_half_nsq_newton_omp.cpp @@ -58,8 +58,6 @@ void NPairHalfNsqNewtonOmp::build(NeighList *list) double xtmp,ytmp,ztmp,delx,dely,delz,rsq; int *neighptr; - // loop over each atom, storing neighbors - double **x = atom->x; int *type = atom->type; int *mask = atom->mask; @@ -99,7 +97,12 @@ void NPairHalfNsqNewtonOmp::build(NeighList *list) } // loop over remaining atoms, owned and ghost + // use itag/jtap comparision to eliminate half the interactions // itag = jtag is possible for long cutoffs that include images of self + // for triclinic, must use delta to eliminate half the I/J interactions + // cannot use I/J exact coord comparision as for orthog + // b/c transforming orthog -> lambda -> orthog for ghost atoms + // with an added PBC offset can shift all 3 coords by epsilon for (j = i+1; j < nall; j++) { if (includegroup && !(mask[j] & bitmask)) continue; diff --git a/src/OPENMP/npair_half_respa_bin_newton_tri_omp.cpp b/src/OPENMP/npair_half_respa_bin_newton_tri_omp.cpp index c998f71290..78b3abdd66 100644 --- a/src/OPENMP/npair_half_respa_bin_newton_tri_omp.cpp +++ b/src/OPENMP/npair_half_respa_bin_newton_tri_omp.cpp @@ -15,13 +15,15 @@ #include "omp_compat.h" #include "npair_half_respa_bin_newton_tri_omp.h" #include "npair_omp.h" -#include "neigh_list.h" + #include "atom.h" #include "atom_vec.h" -#include "molecule.h" #include "domain.h" -#include "my_page.h" #include "error.h" +#include "force.h" +#include "molecule.h" +#include "my_page.h" +#include "neigh_list.h" using namespace LAMMPS_NS; @@ -42,6 +44,7 @@ void NPairHalfRespaBinNewtonTriOmp::build(NeighList *list) const int nlocal = (includegroup) ? atom->nfirst : atom->nlocal; const int molecular = atom->molecular; const int moltemplate = (molecular == Atom::TEMPLATE) ? 1 : 0; + const double delta = 0.01 * force->angstrom; NPAIR_OMP_INIT; @@ -53,12 +56,10 @@ void NPairHalfRespaBinNewtonTriOmp::build(NeighList *list) NPAIR_OMP_SETUP(nlocal); int i,j,k,n,itype,jtype,ibin,n_inner,n_middle,imol,iatom; - tagint tagprev; + tagint itag,jtag,tagprev; double xtmp,ytmp,ztmp,delx,dely,delz,rsq; int *neighptr,*neighptr_inner,*neighptr_middle; - // loop over each atom, storing neighbors - double **x = atom->x; int *type = atom->type; int *mask = atom->mask; @@ -111,6 +112,7 @@ void NPairHalfRespaBinNewtonTriOmp::build(NeighList *list) neighptr_middle = ipage_middle->vget(); } + itag = tag[i]; itype = type[i]; xtmp = x[i][0]; ytmp = x[i][1]; @@ -122,20 +124,31 @@ void NPairHalfRespaBinNewtonTriOmp::build(NeighList *list) } // loop over all atoms in bins in stencil - // pairs for atoms j "below" i are excluded - // below = lower z or (equal z and lower y) or (equal zy and lower x) - // (equal zyx and j <= i) - // latter excludes self-self interaction but allows superposed atoms + // for triclinic, bin stencil is full in all 3 dims + // must use itag/jtag to eliminate half the I/J interactions + // cannot use I/J exact coord comparision + // b/c transforming orthog -> lambda -> orthog for ghost atoms + // with an added PBC offset can shift all 3 coords by epsilon ibin = atom2bin[i]; for (k = 0; k < nstencil; k++) { for (j = binhead[ibin+stencil[k]]; j >= 0; j = bins[j]) { - if (x[j][2] < ztmp) continue; - if (x[j][2] == ztmp) { - if (x[j][1] < ytmp) continue; - if (x[j][1] == ytmp) { - if (x[j][0] < xtmp) continue; - if (x[j][0] == xtmp && j <= i) continue; + + if (j <= i) continue; + if (j >= nlocal) { + jtag = tag[j]; + if (itag > jtag) { + if ((itag+jtag) % 2 == 0) continue; + } else if (itag < jtag) { + if ((itag+jtag) % 2 == 1) continue; + } else { + if (fabs(x[j][2]-ztmp) > delta) { + if (x[j][2] < ztmp) continue; + } else if (fabs(x[j][1]-ytmp) > delta) { + if (x[j][1] < ytmp) continue; + } else { + if (x[j][0] < xtmp) continue; + } } } @@ -151,7 +164,7 @@ void NPairHalfRespaBinNewtonTriOmp::build(NeighList *list) if (molecular != Atom::ATOMIC) { if (!moltemplate) which = find_special(special[i],nspecial[i],tag[j]); - else if (imol >=0) + else if (imol >= 0) which = find_special(onemols[imol]->special[iatom], onemols[imol]->nspecial[iatom], tag[j]-tagprev); diff --git a/src/OPENMP/npair_half_respa_nsq_newton_omp.cpp b/src/OPENMP/npair_half_respa_nsq_newton_omp.cpp index 6604861f74..a9745edc64 100644 --- a/src/OPENMP/npair_half_respa_nsq_newton_omp.cpp +++ b/src/OPENMP/npair_half_respa_nsq_newton_omp.cpp @@ -15,21 +15,22 @@ #include "omp_compat.h" #include "npair_half_respa_nsq_newton_omp.h" #include "npair_omp.h" -#include "neigh_list.h" + #include "atom.h" #include "atom_vec.h" +#include "domain.h" +#include "error.h" +#include "force.h" #include "group.h" #include "molecule.h" -#include "domain.h" #include "my_page.h" -#include "error.h" +#include "neigh_list.h" using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ -NPairHalfRespaNsqNewtonOmp::NPairHalfRespaNsqNewtonOmp(LAMMPS *lmp) : - NPair(lmp) {} +NPairHalfRespaNsqNewtonOmp::NPairHalfRespaNsqNewtonOmp(LAMMPS *lmp) : NPair(lmp) {} /* ---------------------------------------------------------------------- multiple respa lists @@ -45,6 +46,8 @@ void NPairHalfRespaNsqNewtonOmp::build(NeighList *list) const int bitmask = (includegroup) ? group->bitmask[includegroup] : 0; const int molecular = atom->molecular; const int moltemplate = (molecular == Atom::TEMPLATE) ? 1 : 0; + const double delta = 0.01 * force->angstrom; + const int triclinic = domain->triclinic; NPAIR_OMP_INIT; @@ -55,13 +58,11 @@ void NPairHalfRespaNsqNewtonOmp::build(NeighList *list) #endif NPAIR_OMP_SETUP(nlocal); - int i,j,n,itype,jtype,itag,jtag,n_inner,n_middle,imol,iatom; - tagint tagprev; + int i,j,n,itype,jtype,n_inner,n_middle,imol,iatom; + tagint itag,jtag,tagprev; double xtmp,ytmp,ztmp,delx,dely,delz,rsq; int *neighptr,*neighptr_inner,*neighptr_middle; - // loop over each atom, storing neighbors - double **x = atom->x; int *type = atom->type; int *mask = atom->mask; @@ -128,6 +129,12 @@ void NPairHalfRespaNsqNewtonOmp::build(NeighList *list) } // loop over remaining atoms, owned and ghost + // use itag/jtap comparision to eliminate half the interactions + // itag = jtag is possible for long cutoffs that include images of self + // for triclinic, must use delta to eliminate half the I/J interactions + // cannot use I/J exact coord comparision as for orthog + // b/c transforming orthog -> lambda -> orthog for ghost atoms + // with an added PBC offset can shift all 3 coords by epsilon for (j = i+1; j < nall; j++) { if (includegroup && !(mask[j] & bitmask)) continue; @@ -138,6 +145,14 @@ void NPairHalfRespaNsqNewtonOmp::build(NeighList *list) if ((itag+jtag) % 2 == 0) continue; } else if (itag < jtag) { if ((itag+jtag) % 2 == 1) continue; + } else if (triclinic) { + if (fabs(x[j][2]-ztmp) > delta) { + if (x[j][2] < ztmp) continue; + } else if (fabs(x[j][1]-ytmp) > delta) { + if (x[j][1] < ytmp) continue; + } else { + if (x[j][0] < xtmp) continue; + } } else { if (x[j][2] < ztmp) continue; if (x[j][2] == ztmp) { @@ -159,7 +174,7 @@ void NPairHalfRespaNsqNewtonOmp::build(NeighList *list) if (molecular != Atom::ATOMIC) { if (!moltemplate) which = find_special(special[i],nspecial[i],tag[j]); - else if (imol >=0) + else if (imol >= 0) which = find_special(onemols[imol]->special[iatom], onemols[imol]->nspecial[iatom], tag[j]-tagprev); diff --git a/src/OPENMP/npair_half_size_bin_newton_tri_omp.cpp b/src/OPENMP/npair_half_size_bin_newton_tri_omp.cpp index c320296442..7fcf07e9c8 100644 --- a/src/OPENMP/npair_half_size_bin_newton_tri_omp.cpp +++ b/src/OPENMP/npair_half_size_bin_newton_tri_omp.cpp @@ -18,6 +18,7 @@ #include "atom_vec.h" #include "domain.h" #include "error.h" +#include "force.h" #include "molecule.h" #include "my_page.h" #include "neigh_list.h" @@ -46,6 +47,7 @@ void NPairHalfSizeBinNewtonTriOmp::build(NeighList *list) const int moltemplate = (molecular == Atom::TEMPLATE) ? 1 : 0; const int history = list->history; const int mask_history = 1 << HISTBITS; + const double delta = 0.01 * force->angstrom; NPAIR_OMP_INIT; #if defined(_OPENMP) @@ -54,13 +56,11 @@ void NPairHalfSizeBinNewtonTriOmp::build(NeighList *list) NPAIR_OMP_SETUP(nlocal); int i,j,jh,k,n,ibin,which,imol,iatom; - tagint tagprev; + tagint itag,jtag,tagprev; double xtmp,ytmp,ztmp,delx,dely,delz,rsq; double radi,radsum,cutsq; int *neighptr; - // loop over each atom, storing neighbors - double **x = atom->x; double *radius = atom->radius; int *type = atom->type; @@ -87,6 +87,7 @@ void NPairHalfSizeBinNewtonTriOmp::build(NeighList *list) n = 0; neighptr = ipage.vget(); + itag = tag[i]; xtmp = x[i][0]; ytmp = x[i][1]; ztmp = x[i][2]; @@ -98,20 +99,31 @@ void NPairHalfSizeBinNewtonTriOmp::build(NeighList *list) } // loop over all atoms in bins in stencil - // pairs for atoms j "below" i are excluded - // below = lower z or (equal z and lower y) or (equal zy and lower x) - // (equal zyx and j <= i) - // latter excludes self-self interaction but allows superposed atoms + // for triclinic, bin stencil is full in all 3 dims + // must use itag/jtag to eliminate half the I/J interactions + // cannot use I/J exact coord comparision + // b/c transforming orthog -> lambda -> orthog for ghost atoms + // with an added PBC offset can shift all 3 coords by epsilon ibin = atom2bin[i]; for (k = 0; k < nstencil; k++) { for (j = binhead[ibin+stencil[k]]; j >= 0; j = bins[j]) { - if (x[j][2] < ztmp) continue; - if (x[j][2] == ztmp) { - if (x[j][1] < ytmp) continue; - if (x[j][1] == ytmp) { - if (x[j][0] < xtmp) continue; - if (x[j][0] == xtmp && j <= i) continue; + + if (j <= i) continue; + if (j >= nlocal) { + jtag = tag[j]; + if (itag > jtag) { + if ((itag+jtag) % 2 == 0) continue; + } else if (itag < jtag) { + if ((itag+jtag) % 2 == 1) continue; + } else { + if (fabs(x[j][2]-ztmp) > delta) { + if (x[j][2] < ztmp) continue; + } else if (fabs(x[j][1]-ytmp) > delta) { + if (x[j][1] < ytmp) continue; + } else { + if (x[j][0] < xtmp) continue; + } } } @@ -132,7 +144,7 @@ void NPairHalfSizeBinNewtonTriOmp::build(NeighList *list) if (molecular != Atom::ATOMIC) { if (!moltemplate) which = find_special(special[i],nspecial[i],tag[j]); - else if (imol >=0) + else if (imol >= 0) which = find_special(onemols[imol]->special[iatom], onemols[imol]->nspecial[iatom], tag[j]-tagprev); diff --git a/src/OPENMP/npair_half_size_multi_newton_tri_omp.cpp b/src/OPENMP/npair_half_size_multi_newton_tri_omp.cpp index 9a0ead482b..916b7bfbc3 100644 --- a/src/OPENMP/npair_half_size_multi_newton_tri_omp.cpp +++ b/src/OPENMP/npair_half_size_multi_newton_tri_omp.cpp @@ -18,6 +18,7 @@ #include "atom_vec.h" #include "domain.h" #include "error.h" +#include "force.h" #include "molecule.h" #include "my_page.h" #include "neighbor.h" @@ -48,6 +49,7 @@ void NPairHalfSizeMultiNewtonTriOmp::build(NeighList *list) const int moltemplate = (molecular == Atom::TEMPLATE) ? 1 : 0; const int history = list->history; const int mask_history = 1 << HISTBITS; + const double delta = 0.01 * force->angstrom; NPAIR_OMP_INIT; #if defined(_OPENMP) @@ -55,15 +57,12 @@ void NPairHalfSizeMultiNewtonTriOmp::build(NeighList *list) #endif NPAIR_OMP_SETUP(nlocal); - int i,j,jh,k,n,itype,jtype,icollection,jcollection,ibin,jbin,ns; + int i,j,jh,k,n,itype,jtype,icollection,jcollection,ibin,jbin,ns,js; int which,imol,iatom; - tagint tagprev; + tagint itag,jtag,tagprev; double xtmp,ytmp,ztmp,delx,dely,delz,rsq; double radi,radsum,cutdistsq; int *neighptr,*s; - int js; - - // loop over each atom, storing neighbors int *collection = neighbor->collection; double **x = atom->x; @@ -92,6 +91,7 @@ void NPairHalfSizeMultiNewtonTriOmp::build(NeighList *list) n = 0; neighptr = ipage.vget(); + itag = tag[i]; itype = type[i]; icollection = collection[i]; xtmp = x[i][0]; @@ -107,12 +107,13 @@ void NPairHalfSizeMultiNewtonTriOmp::build(NeighList *list) ibin = atom2bin[i]; // loop through stencils for all collections + for (jcollection = 0; jcollection < ncollections; jcollection++) { // if same collection use own bin - if(icollection == jcollection) jbin = ibin; - else jbin = coord2bin(x[i], jcollection); + if (icollection == jcollection) jbin = ibin; + else jbin = coord2bin(x[i], jcollection); // loop over all atoms in bins in stencil // stencil is empty if i larger than j @@ -130,14 +131,24 @@ void NPairHalfSizeMultiNewtonTriOmp::build(NeighList *list) js = binhead_multi[jcollection][jbin + s[k]]; for (j = js; j >= 0; j = bins[j]) { - // if same size (same collection), use half stencil - if(cutcollectionsq[icollection][icollection] == cutcollectionsq[jcollection][jcollection]){ - if (x[j][2] < ztmp) continue; - if (x[j][2] == ztmp) { - if (x[j][1] < ytmp) continue; - if (x[j][1] == ytmp) { - if (x[j][0] < xtmp) continue; - if (x[j][0] == xtmp && j <= i) continue; + // if same size (same collection), exclude half of interactions + + if (cutcollectionsq[icollection][icollection] == + cutcollectionsq[jcollection][jcollection]) { + if (j >= nlocal) { + jtag = tag[j]; + if (itag > jtag) { + if ((itag+jtag) % 2 == 0) continue; + } else if (itag < jtag) { + if ((itag+jtag) % 2 == 1) continue; + } else { + if (fabs(x[j][2]-ztmp) > delta) { + if (x[j][2] < ztmp) continue; + } else if (fabs(x[j][1]-ytmp) > delta) { + if (x[j][1] < ytmp) continue; + } else { + if (x[j][0] < xtmp) continue; + } } } } @@ -160,7 +171,7 @@ void NPairHalfSizeMultiNewtonTriOmp::build(NeighList *list) if (molecular != Atom::ATOMIC) { if (!moltemplate) which = find_special(special[i],nspecial[i],tag[j]); - else if (imol >=0) + else if (imol >= 0) which = find_special(onemols[imol]->special[iatom], onemols[imol]->nspecial[iatom], tag[j]-tagprev); diff --git a/src/OPENMP/npair_half_size_multi_old_newton_tri_omp.cpp b/src/OPENMP/npair_half_size_multi_old_newton_tri_omp.cpp index c74b191f66..7faa210107 100644 --- a/src/OPENMP/npair_half_size_multi_old_newton_tri_omp.cpp +++ b/src/OPENMP/npair_half_size_multi_old_newton_tri_omp.cpp @@ -18,6 +18,7 @@ #include "atom_vec.h" #include "domain.h" #include "error.h" +#include "force.h" #include "molecule.h" #include "my_page.h" #include "neigh_list.h" @@ -32,7 +33,6 @@ NPairHalfSizeMultiOldNewtonTriOmp::NPairHalfSizeMultiOldNewtonTriOmp(LAMMPS *lmp NPair(lmp) {} /* ---------------------------------------------------------------------- - size particles binned neighbor list construction with Newton's 3rd law for triclinic each owned atom i checks its own bin and other bins in triclinic stencil multi-type stencil is itype dependent and is distance checked @@ -46,6 +46,7 @@ void NPairHalfSizeMultiOldNewtonTriOmp::build(NeighList *list) const int moltemplate = (molecular == Atom::TEMPLATE) ? 1 : 0; const int history = list->history; const int mask_history = 1 << HISTBITS; + const double delta = 0.01 * force->angstrom; NPAIR_OMP_INIT; #if defined(_OPENMP) @@ -54,7 +55,7 @@ void NPairHalfSizeMultiOldNewtonTriOmp::build(NeighList *list) NPAIR_OMP_SETUP(nlocal); int i,j,jh,k,n,itype,jtype,ibin,ns,which,imol,iatom; - tagint tagprev; + tagint itag,jtag,tagprev; double xtmp,ytmp,ztmp,delx,dely,delz,rsq; double radi,radsum,cutdistsq; int *neighptr,*s; @@ -97,13 +98,12 @@ void NPairHalfSizeMultiOldNewtonTriOmp::build(NeighList *list) tagprev = tag[i] - iatom - 1; } - // loop over all atoms in bins, including self, in stencil - // skip if i,j neighbor cutoff is less than bin distance - // bins below self are excluded from stencil - // pairs for atoms j "below" i are excluded - // below = lower z or (equal z and lower y) or (equal zy and lower x) - // (equal zyx and j <= i) - // latter excludes self-self interaction but allows superposed atoms + // loop over all atoms in bins in stencil + // for triclinic, bin stencil is full in all 3 dims + // must use itag/jtag to eliminate half the I/J interactions + // cannot use I/J exact coord comparision + // b/c transforming orthog -> lambda -> orthog for ghost atoms + // with an added PBC offset can shift all 3 coords by epsilon ibin = atom2bin[i]; s = stencil_multi_old[itype]; @@ -114,12 +114,22 @@ void NPairHalfSizeMultiOldNewtonTriOmp::build(NeighList *list) for (j = binhead[ibin+s[k]]; j >= 0; j = bins[j]) { jtype = type[j]; if (cutsq[jtype] < distsq[k]) continue; - if (x[j][2] < ztmp) continue; - if (x[j][2] == ztmp) { - if (x[j][1] < ytmp) continue; - if (x[j][1] == ytmp) { - if (x[j][0] < xtmp) continue; - if (x[j][0] == xtmp && j <= i) continue; + + if (j <= i) continue; + if (j >= nlocal) { + jtag = tag[j]; + if (itag > jtag) { + if ((itag+jtag) % 2 == 0) continue; + } else if (itag < jtag) { + if ((itag+jtag) % 2 == 1) continue; + } else { + if (fabs(x[j][2]-ztmp) > delta) { + if (x[j][2] < ztmp) continue; + } else if (fabs(x[j][1]-ytmp) > delta) { + if (x[j][1] < ytmp) continue; + } else { + if (x[j][0] < xtmp) continue; + } } } @@ -140,7 +150,7 @@ void NPairHalfSizeMultiOldNewtonTriOmp::build(NeighList *list) if (molecular != Atom::ATOMIC) { if (!moltemplate) which = find_special(special[i],nspecial[i],tag[j]); - else if (imol >=0) + else if (imol >= 0) which = find_special(onemols[imol]->special[iatom], onemols[imol]->nspecial[iatom], tag[j]-tagprev); diff --git a/src/OPENMP/npair_half_size_nsq_newton_omp.cpp b/src/OPENMP/npair_half_size_nsq_newton_omp.cpp index 35dc42ec5b..0628478c0b 100644 --- a/src/OPENMP/npair_half_size_nsq_newton_omp.cpp +++ b/src/OPENMP/npair_half_size_nsq_newton_omp.cpp @@ -18,6 +18,7 @@ #include "atom_vec.h" #include "domain.h" #include "error.h" +#include "force.h" #include "molecule.h" #include "group.h" #include "my_page.h" @@ -30,13 +31,11 @@ using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ -NPairHalfSizeNsqNewtonOmp::NPairHalfSizeNsqNewtonOmp(LAMMPS *lmp) : - NPair(lmp) {} +NPairHalfSizeNsqNewtonOmp::NPairHalfSizeNsqNewtonOmp(LAMMPS *lmp) : NPair(lmp) {} /* ---------------------------------------------------------------------- size particles N^2 / 2 search for neighbor pairs with full Newton's 3rd law - shear history must be accounted for when a neighbor pair is added pair added to list if atoms i and j are both owned and i < j if j is ghost only me or other proc adds pair decision based on itag,jtag tests @@ -50,6 +49,8 @@ void NPairHalfSizeNsqNewtonOmp::build(NeighList *list) const int moltemplate = (molecular == Atom::TEMPLATE) ? 1 : 0; const int history = list->history; const int mask_history = 1 << HISTBITS; + const double delta = 0.01 * force->angstrom; + const int triclinic = domain->triclinic; NPAIR_OMP_INIT; @@ -58,8 +59,8 @@ void NPairHalfSizeNsqNewtonOmp::build(NeighList *list) #endif NPAIR_OMP_SETUP(nlocal); - int i,j,jh,n,itag,jtag,which,imol,iatom; - tagint tagprev; + int i,j,jh,n,which,imol,iatom; + tagint itag,jtag,tagprev; double xtmp,ytmp,ztmp,delx,dely,delz,rsq; double radi,radsum,cutsq; int *neighptr; @@ -104,6 +105,12 @@ void NPairHalfSizeNsqNewtonOmp::build(NeighList *list) } // loop over remaining atoms, owned and ghost + // use itag/jtap comparision to eliminate half the interactions + // itag = jtag is possible for long cutoffs that include images of self + // for triclinic, must use delta to eliminate half the I/J interactions + // cannot use I/J exact coord comparision as for orthog + // b/c transforming orthog -> lambda -> orthog for ghost atoms + // with an added PBC offset can shift all 3 coords by epsilon for (j = i+1; j < nall; j++) { if (includegroup && !(mask[j] & bitmask)) continue; @@ -114,6 +121,14 @@ void NPairHalfSizeNsqNewtonOmp::build(NeighList *list) if ((itag+jtag) % 2 == 0) continue; } else if (itag < jtag) { if ((itag+jtag) % 2 == 1) continue; + } else if (triclinic) { + if (fabs(x[j][2]-ztmp) > delta) { + if (x[j][2] < ztmp) continue; + } else if (fabs(x[j][1]-ytmp) > delta) { + if (x[j][1] < ytmp) continue; + } else { + if (x[j][0] < xtmp) continue; + } } else { if (x[j][2] < ztmp) continue; if (x[j][2] == ztmp) { @@ -140,7 +155,7 @@ void NPairHalfSizeNsqNewtonOmp::build(NeighList *list) if (molecular != Atom::ATOMIC) { if (!moltemplate) which = find_special(special[i],nspecial[i],tag[j]); - else if (imol >=0) + else if (imol >= 0) which = find_special(onemols[imol]->special[iatom], onemols[imol]->nspecial[iatom], tag[j]-tagprev); diff --git a/src/npair_half_bin_newton_tri.cpp b/src/npair_half_bin_newton_tri.cpp index 453d10096e..d261363b0e 100644 --- a/src/npair_half_bin_newton_tri.cpp +++ b/src/npair_half_bin_newton_tri.cpp @@ -13,7 +13,7 @@ ------------------------------------------------------------------------- */ #include "npair_half_bin_newton_tri.h" -#include "neigh_list.h" + #include "atom.h" #include "atom_vec.h" #include "domain.h" @@ -21,6 +21,7 @@ #include "force.h" #include "molecule.h" #include "my_page.h" +#include "neigh_list.h" using namespace LAMMPS_NS; diff --git a/src/npair_half_multi_newton_tri.cpp b/src/npair_half_multi_newton_tri.cpp index 1d75d6a3ef..2b753af499 100644 --- a/src/npair_half_multi_newton_tri.cpp +++ b/src/npair_half_multi_newton_tri.cpp @@ -21,8 +21,8 @@ #include "force.h" #include "molecule.h" #include "my_page.h" -#include "neighbor.h" #include "neigh_list.h" +#include "neighbor.h" using namespace LAMMPS_NS; @@ -39,7 +39,7 @@ NPairHalfMultiNewtonTri::NPairHalfMultiNewtonTri(LAMMPS *lmp) : NPair(lmp) {} void NPairHalfMultiNewtonTri::build(NeighList *list) { - int i,j,k,n,itype,jtype,icollection,jcollection,ibin,jbin,which,ns,imol,iatom,moltemplate; + int i,j,k,n,itype,jtype,ibin,jbin,icollection,jcollection,which,ns,imol,iatom,moltemplate; tagint itag,jtag,tagprev; double xtmp,ytmp,ztmp,delx,dely,delz,rsq; int *neighptr,*s; diff --git a/src/npair_half_respa_bin_newton_tri.cpp b/src/npair_half_respa_bin_newton_tri.cpp index eac67b8bd5..4cd4ead0fa 100644 --- a/src/npair_half_respa_bin_newton_tri.cpp +++ b/src/npair_half_respa_bin_newton_tri.cpp @@ -13,7 +13,7 @@ ------------------------------------------------------------------------- */ #include "npair_half_respa_bin_newton_tri.h" -#include "neigh_list.h" + #include "atom.h" #include "atom_vec.h" #include "domain.h" @@ -21,6 +21,7 @@ #include "force.h" #include "molecule.h" #include "my_page.h" +#include "neigh_list.h" using namespace LAMMPS_NS; diff --git a/src/npair_half_respa_nsq_newton.cpp b/src/npair_half_respa_nsq_newton.cpp index d0292eec92..ae56d62fb5 100644 --- a/src/npair_half_respa_nsq_newton.cpp +++ b/src/npair_half_respa_nsq_newton.cpp @@ -13,15 +13,16 @@ ------------------------------------------------------------------------- */ #include "npair_half_respa_nsq_newton.h" -#include "neigh_list.h" + #include "atom.h" #include "atom_vec.h" #include "domain.h" +#include "error.h" #include "force.h" #include "group.h" #include "molecule.h" #include "my_page.h" -#include "error.h" +#include "neigh_list.h" using namespace LAMMPS_NS; @@ -132,7 +133,7 @@ void NPairHalfRespaNsqNewton::build(NeighList *list) if ((itag+jtag) % 2 == 0) continue; } else if (itag < jtag) { if ((itag+jtag) % 2 == 1) continue; - } else if (triclinic) { + } else if (triclinic) { if (fabs(x[j][2]-ztmp) > delta) { if (x[j][2] < ztmp) continue; } else if (fabs(x[j][1]-ytmp) > delta) { diff --git a/src/npair_half_size_nsq_newton.cpp b/src/npair_half_size_nsq_newton.cpp index abd2a4faff..ce0c7f9562 100644 --- a/src/npair_half_size_nsq_newton.cpp +++ b/src/npair_half_size_nsq_newton.cpp @@ -113,7 +113,7 @@ void NPairHalfSizeNsqNewton::build(NeighList *list) if ((itag+jtag) % 2 == 0) continue; } else if (itag < jtag) { if ((itag+jtag) % 2 == 1) continue; - } else if (triclinic) { + } else if (triclinic) { if (fabs(x[j][2]-ztmp) > delta) { if (x[j][2] < ztmp) continue; } else if (fabs(x[j][1]-ytmp) > delta) { From bb6e4d844088cea152ebd0cf5007a6ba5c2cbfe2 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Tue, 11 Jul 2023 14:30:14 -0700 Subject: [PATCH 023/219] add forgotten line to multi and mutli/old --- src/npair_half_multi_newton_tri.cpp | 1 + src/npair_half_multi_old_newton_tri.cpp | 1 + src/npair_half_size_multi_newton_tri.cpp | 1 + 3 files changed, 3 insertions(+) diff --git a/src/npair_half_multi_newton_tri.cpp b/src/npair_half_multi_newton_tri.cpp index 316acb5049..2595c3ce21 100644 --- a/src/npair_half_multi_newton_tri.cpp +++ b/src/npair_half_multi_newton_tri.cpp @@ -121,6 +121,7 @@ void NPairHalfMultiNewtonTri::build(NeighList *list) if (cutcollectionsq[icollection][icollection] == cutcollectionsq[jcollection][jcollection]) { + if (j <= i) continue; if (j >= nlocal) { jtag = tag[j]; if (itag > jtag) { diff --git a/src/npair_half_multi_old_newton_tri.cpp b/src/npair_half_multi_old_newton_tri.cpp index 9dcbcff9f4..8700db3b32 100644 --- a/src/npair_half_multi_old_newton_tri.cpp +++ b/src/npair_half_multi_old_newton_tri.cpp @@ -102,6 +102,7 @@ void NPairHalfMultiOldNewtonTri::build(NeighList *list) jtype = type[j]; if (cutsq[jtype] < distsq[k]) continue; + if (j <= i) continue; if (j >= nlocal) { jtag = tag[j]; if (itag > jtag) { diff --git a/src/npair_half_size_multi_newton_tri.cpp b/src/npair_half_size_multi_newton_tri.cpp index a363ae6e1e..4ff50870b6 100644 --- a/src/npair_half_size_multi_newton_tri.cpp +++ b/src/npair_half_size_multi_newton_tri.cpp @@ -126,6 +126,7 @@ void NPairHalfSizeMultiNewtonTri::build(NeighList *list) if (cutcollectionsq[icollection][icollection] == cutcollectionsq[jcollection][jcollection]) { + if (j <= i) continue; if (j >= nlocal) { jtag = tag[j]; if (itag > jtag) { From 2a7ac115d8563dab636f10ba516c461ba23f0694 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 11 Jul 2023 18:25:29 -0400 Subject: [PATCH 024/219] fix whitespace (one more time) --- src/npair_half_multi_newton_tri.cpp | 50 ++++++++++++------------ src/npair_half_multi_old_newton_tri.cpp | 34 ++++++++-------- src/npair_half_size_multi_newton_tri.cpp | 36 ++++++++--------- 3 files changed, 60 insertions(+), 60 deletions(-) diff --git a/src/npair_half_multi_newton_tri.cpp b/src/npair_half_multi_newton_tri.cpp index 1c95e73151..24300f6929 100644 --- a/src/npair_half_multi_newton_tri.cpp +++ b/src/npair_half_multi_newton_tri.cpp @@ -114,31 +114,31 @@ void NPairHalfMultiNewtonTri::build(NeighList *list) ns = nstencil_multi[icollection][jcollection]; for (k = 0; k < ns; k++) { - js = binhead_multi[jcollection][jbin + s[k]]; - for (j = js; j >= 0; j = bins[j]) { - - // if same size (same collection), exclude half of interactions - - if (cutcollectionsq[icollection][icollection] == - cutcollectionsq[jcollection][jcollection]) { - if (j <= i) continue; - if (j >= nlocal) { - jtag = tag[j]; - if (itag > jtag) { - if ((itag+jtag) % 2 == 0) continue; - } else if (itag < jtag) { - if ((itag+jtag) % 2 == 1) continue; - } else { - if (fabs(x[j][2]-ztmp) > delta) { - if (x[j][2] < ztmp) continue; - } else if (fabs(x[j][1]-ytmp) > delta) { - if (x[j][1] < ytmp) continue; - } else { - if (x[j][0] < xtmp) continue; - } - } - } - } + js = binhead_multi[jcollection][jbin + s[k]]; + for (j = js; j >= 0; j = bins[j]) { + + // if same size (same collection), exclude half of interactions + + if (cutcollectionsq[icollection][icollection] == + cutcollectionsq[jcollection][jcollection]) { + if (j <= i) continue; + if (j >= nlocal) { + jtag = tag[j]; + if (itag > jtag) { + if ((itag+jtag) % 2 == 0) continue; + } else if (itag < jtag) { + if ((itag+jtag) % 2 == 1) continue; + } else { + if (fabs(x[j][2]-ztmp) > delta) { + if (x[j][2] < ztmp) continue; + } else if (fabs(x[j][1]-ytmp) > delta) { + if (x[j][1] < ytmp) continue; + } else { + if (x[j][0] < xtmp) continue; + } + } + } + } jtype = type[j]; if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; diff --git a/src/npair_half_multi_old_newton_tri.cpp b/src/npair_half_multi_old_newton_tri.cpp index 8700db3b32..ce3149ebf5 100644 --- a/src/npair_half_multi_old_newton_tri.cpp +++ b/src/npair_half_multi_old_newton_tri.cpp @@ -102,23 +102,23 @@ void NPairHalfMultiOldNewtonTri::build(NeighList *list) jtype = type[j]; if (cutsq[jtype] < distsq[k]) continue; - if (j <= i) continue; - if (j >= nlocal) { - jtag = tag[j]; - if (itag > jtag) { - if ((itag+jtag) % 2 == 0) continue; - } else if (itag < jtag) { - if ((itag+jtag) % 2 == 1) continue; - } else { - if (fabs(x[j][2]-ztmp) > delta) { - if (x[j][2] < ztmp) continue; - } else if (fabs(x[j][1]-ytmp) > delta) { - if (x[j][1] < ytmp) continue; - } else { - if (x[j][0] < xtmp) continue; - } - } - } + if (j <= i) continue; + if (j >= nlocal) { + jtag = tag[j]; + if (itag > jtag) { + if ((itag+jtag) % 2 == 0) continue; + } else if (itag < jtag) { + if ((itag+jtag) % 2 == 1) continue; + } else { + if (fabs(x[j][2]-ztmp) > delta) { + if (x[j][2] < ztmp) continue; + } else if (fabs(x[j][1]-ytmp) > delta) { + if (x[j][1] < ytmp) continue; + } else { + if (x[j][0] < xtmp) continue; + } + } + } if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; diff --git a/src/npair_half_size_multi_newton_tri.cpp b/src/npair_half_size_multi_newton_tri.cpp index c521034406..aa0d8e3f42 100644 --- a/src/npair_half_size_multi_newton_tri.cpp +++ b/src/npair_half_size_multi_newton_tri.cpp @@ -125,24 +125,24 @@ void NPairHalfSizeMultiNewtonTri::build(NeighList *list) // if same size (same collection), exclude half of interactions if (cutcollectionsq[icollection][icollection] == - cutcollectionsq[jcollection][jcollection]) { - if (j <= i) continue; - if (j >= nlocal) { - jtag = tag[j]; - if (itag > jtag) { - if ((itag+jtag) % 2 == 0) continue; - } else if (itag < jtag) { - if ((itag+jtag) % 2 == 1) continue; - } else { - if (fabs(x[j][2]-ztmp) > delta) { - if (x[j][2] < ztmp) continue; - } else if (fabs(x[j][1]-ytmp) > delta) { - if (x[j][1] < ytmp) continue; - } else { - if (x[j][0] < xtmp) continue; - } - } - } + cutcollectionsq[jcollection][jcollection]) { + if (j <= i) continue; + if (j >= nlocal) { + jtag = tag[j]; + if (itag > jtag) { + if ((itag+jtag) % 2 == 0) continue; + } else if (itag < jtag) { + if ((itag+jtag) % 2 == 1) continue; + } else { + if (fabs(x[j][2]-ztmp) > delta) { + if (x[j][2] < ztmp) continue; + } else if (fabs(x[j][1]-ytmp) > delta) { + if (x[j][1] < ytmp) continue; + } else { + if (x[j][0] < xtmp) continue; + } + } + } } jtype = type[j]; From 89fb236144902530091f279d012b90f907b93b50 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 11 Jul 2023 18:35:16 -0400 Subject: [PATCH 025/219] port bugfix for colloid test failure --- src/OPENMP/npair_half_multi_newton_tri_omp.cpp | 1 + src/OPENMP/npair_half_size_multi_newton_tri_omp.cpp | 1 + 2 files changed, 2 insertions(+) diff --git a/src/OPENMP/npair_half_multi_newton_tri_omp.cpp b/src/OPENMP/npair_half_multi_newton_tri_omp.cpp index b18cba0261..e26bea990f 100644 --- a/src/OPENMP/npair_half_multi_newton_tri_omp.cpp +++ b/src/OPENMP/npair_half_multi_newton_tri_omp.cpp @@ -130,6 +130,7 @@ void NPairHalfMultiNewtonTriOmp::build(NeighList *list) if (cutcollectionsq[icollection][icollection] == cutcollectionsq[jcollection][jcollection]) { + if (j <= i) continue; if (j >= nlocal) { jtag = tag[j]; if (itag > jtag) { diff --git a/src/OPENMP/npair_half_size_multi_newton_tri_omp.cpp b/src/OPENMP/npair_half_size_multi_newton_tri_omp.cpp index 916b7bfbc3..4765c918b7 100644 --- a/src/OPENMP/npair_half_size_multi_newton_tri_omp.cpp +++ b/src/OPENMP/npair_half_size_multi_newton_tri_omp.cpp @@ -135,6 +135,7 @@ void NPairHalfSizeMultiNewtonTriOmp::build(NeighList *list) if (cutcollectionsq[icollection][icollection] == cutcollectionsq[jcollection][jcollection]) { + if (j <= i) continue; if (j >= nlocal) { jtag = tag[j]; if (itag > jtag) { From 3fc809a1b9782430a4e41b8ca1d8a3c224762ef6 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Tue, 11 Jul 2023 18:45:45 -0700 Subject: [PATCH 026/219] add check for atom IDs when triclinic --- src/neighbor.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/neighbor.cpp b/src/neighbor.cpp index df1547e5eb..c6eea7e2f1 100644 --- a/src/neighbor.cpp +++ b/src/neighbor.cpp @@ -313,7 +313,10 @@ void Neighbor::init() triclinic = domain->triclinic; newton_pair = force->newton_pair; - // error check + // error checks + + if (triclinic && atom->tag_enable == 0) + error->all(FLERR, "Cannot build triclinic neighbor lists unless atoms have IDs"); if (delay > 0 && (delay % every) != 0) error->all(FLERR,"Neighbor delay must be 0 or multiple of every setting"); From a91b3dab963d0044885298955cc2edf8e6556ead Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Tue, 11 Jul 2023 18:50:23 -0700 Subject: [PATCH 027/219] doc atom ID requirement for triclinic --- doc/src/Howto_triclinic.rst | 3 ++- doc/src/atom_modify.rst | 5 +++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/doc/src/Howto_triclinic.rst b/doc/src/Howto_triclinic.rst index 0efadbcc8c..2983d013c6 100644 --- a/doc/src/Howto_triclinic.rst +++ b/doc/src/Howto_triclinic.rst @@ -12,7 +12,8 @@ is created, e.g. by the :doc:`create_box ` or :doc:`read_data ` or :doc:`read_restart ` commands. Additionally, LAMMPS defines box size parameters lx,ly,lz where lx = xhi-xlo, and similarly in the y and z dimensions. The 6 -parameters, as well as lx,ly,lz, can be output via the :doc:`thermo_style custom ` command. +parameters, as well as lx,ly,lz, can be output via the +:doc:`thermo_style custom ` command. LAMMPS also allows simulations to be performed in triclinic (non-orthogonal) simulation boxes shaped as a parallelepiped with diff --git a/doc/src/atom_modify.rst b/doc/src/atom_modify.rst index 1e5a3d49ff..21590e6680 100644 --- a/doc/src/atom_modify.rst +++ b/doc/src/atom_modify.rst @@ -65,6 +65,11 @@ switch. This is described on the :doc:`Build_settings ` doc page. If atom IDs are not used, they must be specified as 0 for all atoms, e.g. in a data or restart file. +.. note:: + + If a :doc:`triclinic simulation box ` is used, + atom IDs are required, due to how neighbor lists are built. + The *map* keyword determines how atoms with specific IDs are found when required. An example are the bond (angle, etc) methods which need to find the local index of an atom with a specific global ID From f62a4c537258e6eab4c20df0237b607378963d37 Mon Sep 17 00:00:00 2001 From: Trung Nguyen Date: Mon, 17 Jul 2023 16:49:26 -0500 Subject: [PATCH 028/219] Working on fix efield/kk --- src/KOKKOS/fix_efield_kokkos.cpp | 87 ++++++++++++++++++++++++++++++++ src/KOKKOS/fix_efield_kokkos.h | 52 +++++++++++++++++++ 2 files changed, 139 insertions(+) create mode 100644 src/KOKKOS/fix_efield_kokkos.cpp create mode 100644 src/KOKKOS/fix_efield_kokkos.h diff --git a/src/KOKKOS/fix_efield_kokkos.cpp b/src/KOKKOS/fix_efield_kokkos.cpp new file mode 100644 index 0000000000..697116402d --- /dev/null +++ b/src/KOKKOS/fix_efield_kokkos.cpp @@ -0,0 +1,87 @@ +// clang-format off +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#include "fix_efield_kokkos.h" + +#include "atom_kokkos.h" +#include "atom_masks.h" +#include "atom_vec.h" +#include "input.h" +#include "modify.h" +#include "update.h" +#include "variable.h" + +using namespace LAMMPS_NS; + +/* ---------------------------------------------------------------------- */ + +template +FixEfieldKokkos::FixEfieldKokkos(LAMMPS *lmp, int narg, char **arg) : + FixEfield(lmp, narg, arg) +{ + kokkosable = 1; + atomKK = (AtomKokkos *)atom; + execution_space = ExecutionSpaceFromDevice::space; + + datamask_read = X_MASK | Q_MASK | F_MASK | RMASS_MASK | MASK_MASK | TYPE_MASK; + datamask_modify = F_MASK; +} + +/* ---------------------------------------------------------------------- */ + +template +void FixEfieldKokkos::post_force(int /*vflag*/) +{ + // update efield due to variables + + update_efield_variables(); + + atomKK->sync(execution_space,datamask_read); + atomKK->modified(execution_space,datamask_modify); + + x = atomKK->k_x.view(); + f = atomKK->k_f.view(); + q = atomKK->k_q.view(); + type = atomKK->k_type.view(); + mask = atomKK->k_mask.view(); + int nlocal = atomKK->nlocal; + if (igroup == atomKK->firstgroup) nlocal = atomKK->nfirst; + + copymode = 1; + + eflag = 0; + + Kokkos::parallel_reduce(Kokkos::RangePolicy(0,nlocal), *this); + + copymode = 0; +} + +template +KOKKOS_INLINE_FUNCTION +void FixEfieldKokkos::operator()(const int i) const +{ + if (mask[i] & groupbit) { + double qi = q[i]; + f(i,0) += qi*ex; + f(i,1) += qi*ey; + f(i,2) += qi*ez; + } +} + +namespace LAMMPS_NS { +template class FixEfieldKokkos; +#ifdef LMP_KOKKOS_GPU +template class FixEfieldKokkos; +#endif +} diff --git a/src/KOKKOS/fix_efield_kokkos.h b/src/KOKKOS/fix_efield_kokkos.h new file mode 100644 index 0000000000..e5171ce6f5 --- /dev/null +++ b/src/KOKKOS/fix_efield_kokkos.h @@ -0,0 +1,52 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef FIX_CLASS +// clang-format off +FixStyle(efield/kk,FixFixEfieldKokkos); +FixStyle(efield/kk/device,FixFixEfieldKokkos); +FixStyle(efield/kk/host,FixFixEfieldKokkos); +// clang-format on +#else + +// clang-format off +#ifndef LMP_FIX_EFIELD_KOKKOS_H +#define LMP_FIX_EFIELD_KOKKOS_H + +#include "fix_efield.h" +#include "kokkos_type.h" + +namespace LAMMPS_NS { + +template +class FixEfieldKokkos : public FixEfield { + public: + FixEfieldKokkos(class LAMMPS *, int, char **); + + void post_force(int) override; + + KOKKOS_INLINE_FUNCTION + void operator()(const int, double &) const; + + private: + typename ArrayTypes::t_x_array x; + typename ArrayTypes::t_f_array f; + typename ArrayTypes::t_int_1d type; + typename ArrayTypes::t_int_1d mask; + typename ArrayTypes::t_float_1d_randomread q; +}; + +} // namespace LAMMPS_NS + +#endif // LMP_FIX_EFIELD_KOKKOS_H +#endif // FIX_CLASS From 6a991ff0a094a089a50b5f3723a7b1e8c1bbf990 Mon Sep 17 00:00:00 2001 From: Trung Nguyen Date: Tue, 1 Aug 2023 10:53:20 -0500 Subject: [PATCH 029/219] Updated fix efield/kk, needs work on unwrap --- src/KOKKOS/fix_efield_kokkos.cpp | 173 ++++++++++++++++++++++++++----- src/KOKKOS/fix_efield_kokkos.h | 67 +++++++++--- src/fix_efield.cpp | 2 + 3 files changed, 197 insertions(+), 45 deletions(-) diff --git a/src/KOKKOS/fix_efield_kokkos.cpp b/src/KOKKOS/fix_efield_kokkos.cpp index 697116402d..fc84967e02 100644 --- a/src/KOKKOS/fix_efield_kokkos.cpp +++ b/src/KOKKOS/fix_efield_kokkos.cpp @@ -15,14 +15,23 @@ #include "fix_efield_kokkos.h" #include "atom_kokkos.h" -#include "atom_masks.h" -#include "atom_vec.h" -#include "input.h" -#include "modify.h" #include "update.h" +#include "modify.h" +#include "domain.h" +#include "region.h" +#include "input.h" #include "variable.h" +#include "memory_kokkos.h" +#include "error.h" +#include "atom_masks.h" +#include "kokkos_base.h" + +#include using namespace LAMMPS_NS; +using namespace FixConst; + +enum{NONE,CONSTANT,EQUAL,ATOM}; /* ---------------------------------------------------------------------- */ @@ -31,11 +40,36 @@ FixEfieldKokkos::FixEfieldKokkos(LAMMPS *lmp, int narg, char **arg) FixEfield(lmp, narg, arg) { kokkosable = 1; - atomKK = (AtomKokkos *)atom; + atomKK = (AtomKokkos *) atom; execution_space = ExecutionSpaceFromDevice::space; + datamask_read = EMPTY_MASK; + datamask_modify = EMPTY_MASK; - datamask_read = X_MASK | Q_MASK | F_MASK | RMASS_MASK | MASK_MASK | TYPE_MASK; - datamask_modify = F_MASK; + memory->destroy(efield); + memoryKK->create_kokkos(k_efield,efield,maxatom,4,"efield:efield"); + d_efield = k_efield.view(); +} + +/* ---------------------------------------------------------------------- */ + +template +FixEfieldKokkos::~FixEfieldKokkos() +{ + if (copymode) return; + + memoryKK->destroy_kokkos(k_efield,efield); + efield = nullptr; +} + +/* ---------------------------------------------------------------------- */ + +template +void FixEfieldKokkos::init() +{ + FixEfield::init(); + + if (utils::strmatch(update->integrate_style,"^respa")) + error->all(FLERR,"Cannot (yet) use respa with Kokkos"); } /* ---------------------------------------------------------------------- */ @@ -43,39 +77,121 @@ FixEfieldKokkos::FixEfieldKokkos(LAMMPS *lmp, int narg, char **arg) template void FixEfieldKokkos::post_force(int /*vflag*/) { - // update efield due to variables + atomKK->sync(execution_space, F_MASK | Q_MASK | MASK_MASK); - update_efield_variables(); - - atomKK->sync(execution_space,datamask_read); - atomKK->modified(execution_space,datamask_modify); - - x = atomKK->k_x.view(); f = atomKK->k_f.view(); q = atomKK->k_q.view(); - type = atomKK->k_type.view(); mask = atomKK->k_mask.view(); - int nlocal = atomKK->nlocal; - if (igroup == atomKK->firstgroup) nlocal = atomKK->nfirst; - copymode = 1; + int nlocal = atom->nlocal; - eflag = 0; + // update region if necessary - Kokkos::parallel_reduce(Kokkos::RangePolicy(0,nlocal), *this); - - copymode = 0; + if (region) { + if (!utils::strmatch(region->style, "^block")) + error->all(FLERR,"Cannot (yet) use {}-style region with fix efield/kk",region->style); + region->prematch(); + DAT::tdual_int_1d k_match = DAT::tdual_int_1d("efield:k_match",nlocal); + KokkosBase* regionKKBase = dynamic_cast(region); + regionKKBase->match_all_kokkos(groupbit,k_match); + k_match.template sync(); + d_match = k_match.template view(); + } + + // reallocate sforce array if necessary + + if (varflag == ATOM && atom->nmax > maxatom) { + maxatom = atom->nmax; + memoryKK->destroy_kokkos(k_efield,efield); + memoryKK->create_kokkos(k_efield,efield,maxatom,4,"efield:efield"); + d_efield = k_efield.view(); + } + + fsum[0] = fsum[1] = fsum[2] = fsum[3] = 0.0; + double_4 fsum_kk; + force_flag = 0; + + if (varflag == CONSTANT) { + copymode = 1; + Kokkos::parallel_reduce(Kokkos::RangePolicy(0,nlocal),*this,fsum_kk); + copymode = 0; + + // variable force, wrap with clear/add + + } else { + + atomKK->sync(Host,ALL_MASK); // this can be removed when variable class is ported to Kokkos + + modify->clearstep_compute(); + + if (xstyle == EQUAL) ex = input->variable->compute_equal(xvar); + else if (xstyle == ATOM) + input->variable->compute_atom(xvar,igroup,&efield[0][0],4,0); + if (ystyle == EQUAL) ey = input->variable->compute_equal(yvar); + else if (ystyle == ATOM) + input->variable->compute_atom(yvar,igroup,&efield[0][1],4,0); + if (zstyle == EQUAL) ez = input->variable->compute_equal(zvar); + else if (zstyle == ATOM) + input->variable->compute_atom(zvar,igroup,&efield[0][2],4,0); + + modify->addstep_compute(update->ntimestep + 1); + + if (varflag == ATOM) { // this can be removed when variable class is ported to Kokkos + k_efield.modify(); + k_efield.sync(); + } + + copymode = 1; + Kokkos::parallel_reduce(Kokkos::RangePolicy(0,nlocal),*this,fsum_kk); + copymode = 0; + } + + atomKK->modified(execution_space, F_MASK); + + fsum[0] = fsum_kk.d0; + fsum[1] = fsum_kk.d1; + fsum[2] = fsum_kk.d2; + fsum[3] = fsum_kk.d3; } template KOKKOS_INLINE_FUNCTION -void FixEfieldKokkos::operator()(const int i) const -{ +void FixEfieldKokkos::operator()(TagFixEfieldConstant, const int &i, double_4& fsum_kk) const { if (mask[i] & groupbit) { - double qi = q[i]; - f(i,0) += qi*ex; - f(i,1) += qi*ey; - f(i,2) += qi*ez; + if (region && !d_match[i]) return; + const F_FLOAT qtmp = q[i]; + const F_FLOAT fx = qtmp * ex; + const F_FLOAT fy = qtmp * ey; + const F_FLOAT fz = qtmp * ez; + f(i,0) += fx; + f(i,1) += fy; + f(i,2) += fz; + //fsum_kk.d0 -= fx * unwrap[0] + fy * unwrap[1] + fz * unwrap[2]; + fsum_kk.d1 += fx; + fsum_kk.d2 += fy; + fsum_kk.d3 += fz; + } +} + +template +KOKKOS_INLINE_FUNCTION +void FixEfieldKokkos::operator()(TagFixEfieldNonConstant, const int &i, double_4& fsum_kk) const { + if (mask[i] & groupbit) { + if (region && !d_match[i]) return; + const F_FLOAT qtmp = q[i]; + const F_FLOAT fx = qtmp * ex; + const F_FLOAT fy = qtmp * ey; + const F_FLOAT fz = qtmp * ez; + if (xstyle == ATOM) f(i,0) += d_efield(i,0); + else if (xstyle) f(i,0) += fx; + if (ystyle == ATOM) f(i,1) = d_efield(i,1); + else if (ystyle) f(i,1) += fy; + if (zstyle == ATOM) f(i,2) = d_efield(i,2); + else if (zstyle) f(i,2) += fz; + //fsum_kk.d0 -= fx * unwrap[0] + fy * unwrap[1] + fz * unwrap[2]; + fsum_kk.d1 += fx; + fsum_kk.d2 += fy; + fsum_kk.d3 += fz; } } @@ -85,3 +201,4 @@ template class FixEfieldKokkos; template class FixEfieldKokkos; #endif } + diff --git a/src/KOKKOS/fix_efield_kokkos.h b/src/KOKKOS/fix_efield_kokkos.h index e5171ce6f5..8d8d2ee97a 100644 --- a/src/KOKKOS/fix_efield_kokkos.h +++ b/src/KOKKOS/fix_efield_kokkos.h @@ -13,9 +13,9 @@ #ifdef FIX_CLASS // clang-format off -FixStyle(efield/kk,FixFixEfieldKokkos); -FixStyle(efield/kk/device,FixFixEfieldKokkos); -FixStyle(efield/kk/host,FixFixEfieldKokkos); +FixStyle(efield/kk,FixEfieldKokkos); +FixStyle(efield/kk/device,FixEfieldKokkos); +FixStyle(efield/kk/host,FixEfieldKokkos); // clang-format on #else @@ -28,25 +28,58 @@ FixStyle(efield/kk/host,FixFixEfieldKokkos); namespace LAMMPS_NS { +struct e_double_4 { + double d0, d1, d2, d3; + KOKKOS_INLINE_FUNCTION + e_double_4() { + d0 = d1 = d2 = d3 = 0.0; + } + KOKKOS_INLINE_FUNCTION + e_double_4& operator+=(const e_double_4 &rhs) { + d0 += rhs.d0; + d1 += rhs.d1; + d2 += rhs.d2; + d3 += rhs.d3; + return *this; + } +}; +typedef e_double_4 double_4; + +struct TagFixEfieldConstant{}; + +struct TagFixEfieldNonConstant{}; + template class FixEfieldKokkos : public FixEfield { - public: - FixEfieldKokkos(class LAMMPS *, int, char **); + public: + typedef DeviceType device_type; + typedef double_4 value_type; + typedef ArrayTypes AT; - void post_force(int) override; + FixEfieldKokkos(class LAMMPS *, int, char **); + ~FixEfieldKokkos() override; + void init() override; + void post_force(int) override; - KOKKOS_INLINE_FUNCTION - void operator()(const int, double &) const; + KOKKOS_INLINE_FUNCTION + void operator()(TagFixEfieldConstant, const int&, double_4&) const; - private: - typename ArrayTypes::t_x_array x; - typename ArrayTypes::t_f_array f; - typename ArrayTypes::t_int_1d type; - typename ArrayTypes::t_int_1d mask; - typename ArrayTypes::t_float_1d_randomread q; + KOKKOS_INLINE_FUNCTION + void operator()(TagFixEfieldNonConstant, const int&, double_4&) const; + + private: + DAT::tdual_ffloat_2d k_efield; + typename AT::t_ffloat_2d_randomread d_efield; + typename AT::t_int_1d d_match; + + typename AT::t_x_array_randomread x; + typename AT::t_float_1d_randomread q; + typename AT::t_f_array f; + typename AT::t_int_1d_randomread mask; }; -} // namespace LAMMPS_NS +} + +#endif +#endif -#endif // LMP_FIX_EFIELD_KOKKOS_H -#endif // FIX_CLASS diff --git a/src/fix_efield.cpp b/src/fix_efield.cpp index d01a498d39..23277f8af3 100644 --- a/src/fix_efield.cpp +++ b/src/fix_efield.cpp @@ -129,6 +129,8 @@ FixEfield::FixEfield(LAMMPS *lmp, int narg, char **arg) : FixEfield::~FixEfield() { + if (copymode) return; + delete[] xstr; delete[] ystr; delete[] zstr; From 34c398dd372a5eae6ecb53a4fa10a2bf2e0cdad0 Mon Sep 17 00:00:00 2001 From: Trung Nguyen Date: Wed, 2 Aug 2023 06:59:24 -0500 Subject: [PATCH 030/219] Tried two ways of doing parallel reduce for fsum --- src/KOKKOS/fix_efield_kokkos.cpp | 75 +++++++++++++++++++++++++++++--- src/KOKKOS/fix_efield_kokkos.h | 1 + 2 files changed, 69 insertions(+), 7 deletions(-) diff --git a/src/KOKKOS/fix_efield_kokkos.cpp b/src/KOKKOS/fix_efield_kokkos.cpp index fc84967e02..d4ef6dc3f2 100644 --- a/src/KOKKOS/fix_efield_kokkos.cpp +++ b/src/KOKKOS/fix_efield_kokkos.cpp @@ -17,7 +17,7 @@ #include "atom_kokkos.h" #include "update.h" #include "modify.h" -#include "domain.h" +#include "domain_kokkos.h" #include "region.h" #include "input.h" #include "variable.h" @@ -77,10 +77,11 @@ void FixEfieldKokkos::init() template void FixEfieldKokkos::post_force(int /*vflag*/) { - atomKK->sync(execution_space, F_MASK | Q_MASK | MASK_MASK); + atomKK->sync(execution_space, F_MASK | Q_MASK | IMAGE_MASK | MASK_MASK); f = atomKK->k_f.view(); q = atomKK->k_q.view(); + image = atomKK->k_image.view(); mask = atomKK->k_mask.view(); int nlocal = atom->nlocal; @@ -113,7 +114,50 @@ void FixEfieldKokkos::post_force(int /*vflag*/) if (varflag == CONSTANT) { copymode = 1; - Kokkos::parallel_reduce(Kokkos::RangePolicy(0,nlocal),*this,fsum_kk); + //Kokkos::parallel_reduce(Kokkos::RangePolicy(0,nlocal),*this,fsum_kk); + + { + // local variables for lambda capture + auto prd = Few(domain->prd); + auto h = Few(domain->h); + auto triclinic = domain->triclinic; + auto l_ex = ex; + auto l_ey = ey; + auto l_ez = ez; + + auto l_x = x; + auto l_q = q; + auto l_f = f; + auto l_mask = mask; + auto l_image = image; + auto l_groupbit = groupbit; + + Kokkos::parallel_reduce(Kokkos::RangePolicy(0,nlocal), + LAMMPS_LAMBDA(int i, double_4& fsum_kk) { + if (l_mask[i] & l_groupbit) { + + Few x_i; + x_i[0] = l_x(i,0); + x_i[1] = l_x(i,1); + x_i[2] = l_x(i,2); + auto unwrap = DomainKokkos::unmap(prd,h,triclinic,x_i,l_image(i)); + auto qtmp = l_q(i); + auto fx = qtmp * l_ex; + auto fy = qtmp * l_ey; + auto fz = qtmp * l_ez; + l_f(i,0) += fx; + l_f(i,1) += fy; + l_f(i,2) += fz; + + fsum_kk.d0 -= fx * unwrap[0] + fy * unwrap[1] + fz * unwrap[2]; + fsum_kk.d1 += fx; + fsum_kk.d2 += fy; + fsum_kk.d3 += fz; + } + }, fsum_kk); + + } + copymode = 0; // variable force, wrap with clear/add @@ -159,6 +203,14 @@ KOKKOS_INLINE_FUNCTION void FixEfieldKokkos::operator()(TagFixEfieldConstant, const int &i, double_4& fsum_kk) const { if (mask[i] & groupbit) { if (region && !d_match[i]) return; + auto prd = Few(domain->prd); + auto h = Few(domain->h); + auto triclinic = domain->triclinic; + Few x_i; + x_i[0] = x(i,0); + x_i[1] = x(i,1); + x_i[2] = x(i,2); + auto unwrap = DomainKokkos::unmap(prd,h,triclinic,x_i,image(i)); const F_FLOAT qtmp = q[i]; const F_FLOAT fx = qtmp * ex; const F_FLOAT fy = qtmp * ey; @@ -166,7 +218,8 @@ void FixEfieldKokkos::operator()(TagFixEfieldConstant, const int &i, f(i,0) += fx; f(i,1) += fy; f(i,2) += fz; - //fsum_kk.d0 -= fx * unwrap[0] + fy * unwrap[1] + fz * unwrap[2]; + + fsum_kk.d0 -= fx * unwrap[0] + fy * unwrap[1] + fz * unwrap[2]; fsum_kk.d1 += fx; fsum_kk.d2 += fy; fsum_kk.d3 += fz; @@ -176,19 +229,27 @@ void FixEfieldKokkos::operator()(TagFixEfieldConstant, const int &i, template KOKKOS_INLINE_FUNCTION void FixEfieldKokkos::operator()(TagFixEfieldNonConstant, const int &i, double_4& fsum_kk) const { + auto prd = Few(domain->prd); + auto h = Few(domain->h); + auto triclinic = domain->triclinic; if (mask[i] & groupbit) { if (region && !d_match[i]) return; + Few x_i; + x_i[0] = x(i,0); + x_i[1] = x(i,1); + x_i[2] = x(i,2); + auto unwrap = DomainKokkos::unmap(prd,h,triclinic,x_i,image(i)); const F_FLOAT qtmp = q[i]; const F_FLOAT fx = qtmp * ex; const F_FLOAT fy = qtmp * ey; const F_FLOAT fz = qtmp * ez; if (xstyle == ATOM) f(i,0) += d_efield(i,0); else if (xstyle) f(i,0) += fx; - if (ystyle == ATOM) f(i,1) = d_efield(i,1); + if (ystyle == ATOM) f(i,1) += d_efield(i,1); else if (ystyle) f(i,1) += fy; - if (zstyle == ATOM) f(i,2) = d_efield(i,2); + if (zstyle == ATOM) f(i,2) += d_efield(i,2); else if (zstyle) f(i,2) += fz; - //fsum_kk.d0 -= fx * unwrap[0] + fy * unwrap[1] + fz * unwrap[2]; + fsum_kk.d0 -= fx * unwrap[0] + fy * unwrap[1] + fz * unwrap[2]; fsum_kk.d1 += fx; fsum_kk.d2 += fy; fsum_kk.d3 += fz; diff --git a/src/KOKKOS/fix_efield_kokkos.h b/src/KOKKOS/fix_efield_kokkos.h index 8d8d2ee97a..d159473d1d 100644 --- a/src/KOKKOS/fix_efield_kokkos.h +++ b/src/KOKKOS/fix_efield_kokkos.h @@ -75,6 +75,7 @@ class FixEfieldKokkos : public FixEfield { typename AT::t_x_array_randomread x; typename AT::t_float_1d_randomread q; typename AT::t_f_array f; + typename AT::t_imageint_1d_randomread image; typename AT::t_int_1d_randomread mask; }; From bc6fcdc61a550b645b25f12138a3bb4022153c9a Mon Sep 17 00:00:00 2001 From: "W. Michael Brown" Date: Fri, 4 Aug 2023 08:49:27 -0700 Subject: [PATCH 031/219] Applying triclinic neighbor fixes to intel package. --- src/INTEL/fix_intel.cpp | 2 + src/INTEL/npair_halffull_newton_intel.cpp | 66 ++++++++++---- .../npair_halffull_newton_trim_intel.cpp | 87 ++++++++++++++----- src/INTEL/npair_intel.cpp | 40 +++++++-- 4 files changed, 144 insertions(+), 51 deletions(-) diff --git a/src/INTEL/fix_intel.cpp b/src/INTEL/fix_intel.cpp index 4c46608677..8396904ffd 100644 --- a/src/INTEL/fix_intel.cpp +++ b/src/INTEL/fix_intel.cpp @@ -20,6 +20,7 @@ #include "fix_intel.h" #include "comm.h" +#include "domain.h" #include "error.h" #include "force.h" #include "neighbor.h" @@ -470,6 +471,7 @@ void FixIntel::pair_init_check(const bool cdmessage) int need_tag = 0; if (atom->molecular != Atom::ATOMIC || three_body_neighbor()) need_tag = 1; + if (domain->triclinic && force->newton_pair) need_tag = 1; // Clear buffers used for pair style char kmode[80]; diff --git a/src/INTEL/npair_halffull_newton_intel.cpp b/src/INTEL/npair_halffull_newton_intel.cpp index cd05d5f97a..adcf2527ab 100644 --- a/src/INTEL/npair_halffull_newton_intel.cpp +++ b/src/INTEL/npair_halffull_newton_intel.cpp @@ -20,7 +20,9 @@ #include "atom.h" #include "comm.h" +#include "domain.h" #include "error.h" +#include "force.h" #include "modify.h" #include "my_page.h" #include "neigh_list.h" @@ -56,6 +58,9 @@ void NPairHalffullNewtonIntel::build_t(NeighList *list, const int * _noalias const numneigh_full = list->listfull->numneigh; const int ** _noalias const firstneigh_full = (const int ** const)list->listfull->firstneigh; // NOLINT + const double delta = 0.01 * force->angstrom; + const int triclinic = domain->triclinic; + #if defined(_OPENMP) #pragma omp parallel #endif @@ -82,25 +87,50 @@ void NPairHalffullNewtonIntel::build_t(NeighList *list, const int * _noalias const jlist = firstneigh_full[i]; const int jnum = numneigh_full[i]; - #if defined(LMP_SIMD_COMPILER) - #pragma vector aligned - #pragma ivdep - #endif - for (int jj = 0; jj < jnum; jj++) { - const int joriginal = jlist[jj]; - const int j = joriginal & NEIGHMASK; - int addme = 1; - if (j < nlocal) { - if (i > j) addme = 0; - } else { - if (x[j].z < ztmp) addme = 0; - if (x[j].z == ztmp) { - if (x[j].y < ytmp) addme = 0; - if (x[j].y == ytmp && x[j].x < xtmp) addme = 0; + if (!triclinic) { + #if defined(LMP_SIMD_COMPILER) + #pragma vector aligned + #pragma ivdep + #endif + for (int jj = 0; jj < jnum; jj++) { + const int joriginal = jlist[jj]; + const int j = joriginal & NEIGHMASK; + int addme = 1; + if (j < nlocal) { + if (i > j) addme = 0; + } else { + if (x[j].z < ztmp) addme = 0; + if (x[j].z == ztmp) { + if (x[j].y < ytmp) addme = 0; + if (x[j].y == ytmp && x[j].x < xtmp) addme = 0; + } } + if (addme) + neighptr[n++] = joriginal; + } + } else { + #if defined(LMP_SIMD_COMPILER) + #pragma vector aligned + #pragma ivdep + #endif + for (int jj = 0; jj < jnum; jj++) { + const int joriginal = jlist[jj]; + const int j = joriginal & NEIGHMASK; + int addme = 1; + if (j < nlocal) { + if (i > j) addme = 0; + } else { + if (fabs(x[j].z-ztmp) > delta) { + if (x[j].z < ztmp) addme = 0; + } else if (fabs(x[j].y-ytmp) > delta) { + if (x[j].y < ytmp) addme = 0; + } else { + if (x[j].x < xtmp) addme = 0; + } + } + if (addme) + neighptr[n++] = joriginal; } - if (addme) - neighptr[n++] = joriginal; } ilist[ii] = i; @@ -203,7 +233,7 @@ void NPairHalffullNewtonIntel::build_t3(NeighList *list, int *numhalf) void NPairHalffullNewtonIntel::build(NeighList *list) { - if (_fix->three_body_neighbor() == 0) { + if (_fix->three_body_neighbor() == 0 || domain->triclinic) { if (_fix->precision() == FixIntel::PREC_MODE_MIXED) build_t(list, _fix->get_mixed_buffers()); else if (_fix->precision() == FixIntel::PREC_MODE_DOUBLE) diff --git a/src/INTEL/npair_halffull_newton_trim_intel.cpp b/src/INTEL/npair_halffull_newton_trim_intel.cpp index e38375f750..34b9b20e9c 100644 --- a/src/INTEL/npair_halffull_newton_trim_intel.cpp +++ b/src/INTEL/npair_halffull_newton_trim_intel.cpp @@ -20,7 +20,9 @@ #include "atom.h" #include "comm.h" +#include "domain.h" #include "error.h" +#include "force.h" #include "modify.h" #include "my_page.h" #include "neigh_list.h" @@ -57,6 +59,8 @@ void NPairHalffullNewtonTrimIntel::build_t(NeighList *list, const int ** _noalias const firstneigh_full = (const int ** const)list->listfull->firstneigh; // NOLINT const flt_t cutsq_custom = cutoff_custom * cutoff_custom; + const double delta = 0.01 * force->angstrom; + const int triclinic = domain->triclinic; #if defined(_OPENMP) #pragma omp parallel @@ -84,35 +88,70 @@ void NPairHalffullNewtonTrimIntel::build_t(NeighList *list, const int * _noalias const jlist = firstneigh_full[i]; const int jnum = numneigh_full[i]; - #if defined(LMP_SIMD_COMPILER) - #pragma vector aligned - #pragma ivdep - #endif - for (int jj = 0; jj < jnum; jj++) { - const int joriginal = jlist[jj]; - const int j = joriginal & NEIGHMASK; - int addme = 1; - if (j < nlocal) { - if (i > j) addme = 0; - } else { - if (x[j].z < ztmp) addme = 0; - if (x[j].z == ztmp) { - if (x[j].y < ytmp) addme = 0; - if (x[j].y == ytmp && x[j].x < xtmp) addme = 0; + if (!triclinic) { + #if defined(LMP_SIMD_COMPILER) + #pragma vector aligned + #pragma ivdep + #endif + for (int jj = 0; jj < jnum; jj++) { + const int joriginal = jlist[jj]; + const int j = joriginal & NEIGHMASK; + int addme = 1; + if (j < nlocal) { + if (i > j) addme = 0; + } else { + if (x[j].z < ztmp) addme = 0; + if (x[j].z == ztmp) { + if (x[j].y < ytmp) addme = 0; + if (x[j].y == ytmp && x[j].x < xtmp) addme = 0; + } } + + // trim to shorter cutoff + + const flt_t delx = xtmp - x[j].x; + const flt_t dely = ytmp - x[j].y; + const flt_t delz = ztmp - x[j].z; + const flt_t rsq = delx * delx + dely * dely + delz * delz; + + if (rsq > cutsq_custom) addme = 0; + + if (addme) + neighptr[n++] = joriginal; } + } else { + #if defined(LMP_SIMD_COMPILER) + #pragma vector aligned + #pragma ivdep + #endif + for (int jj = 0; jj < jnum; jj++) { + const int joriginal = jlist[jj]; + const int j = joriginal & NEIGHMASK; + int addme = 1; + if (j < nlocal) { + if (i > j) addme = 0; + } else { + if (fabs(x[j].z-ztmp) > delta) { + if (x[j].z < ztmp) addme = 0; + } else if (fabs(x[j].y-ytmp) > delta) { + if (x[j].y < ytmp) addme = 0; + } else { + if (x[j].x < xtmp) addme = 0; + } + } - // trim to shorter cutoff + // trim to shorter cutoff - const flt_t delx = xtmp - x[j].x; - const flt_t dely = ytmp - x[j].y; - const flt_t delz = ztmp - x[j].z; - const flt_t rsq = delx * delx + dely * dely + delz * delz; + const flt_t delx = xtmp - x[j].x; + const flt_t dely = ytmp - x[j].y; + const flt_t delz = ztmp - x[j].z; + const flt_t rsq = delx * delx + dely * dely + delz * delz; - if (rsq > cutsq_custom) addme = 0; + if (rsq > cutsq_custom) addme = 0; - if (addme) - neighptr[n++] = joriginal; + if (addme) + neighptr[n++] = joriginal; + } } ilist[ii] = i; @@ -235,7 +274,7 @@ void NPairHalffullNewtonTrimIntel::build_t3(NeighList *list, int *numhalf, void NPairHalffullNewtonTrimIntel::build(NeighList *list) { - if (_fix->three_body_neighbor() == 0) { + if (_fix->three_body_neighbor() == 0 || domain->triclinic) { if (_fix->precision() == FixIntel::PREC_MODE_MIXED) build_t(list, _fix->get_mixed_buffers()); else if (_fix->precision() == FixIntel::PREC_MODE_DOUBLE) diff --git a/src/INTEL/npair_intel.cpp b/src/INTEL/npair_intel.cpp index 600109d7ae..dcfb66e05f 100644 --- a/src/INTEL/npair_intel.cpp +++ b/src/INTEL/npair_intel.cpp @@ -204,6 +204,8 @@ void NPairIntel::bin_newton(const int offload, NeighList *list, } const int special_bound = sb; + const double delta = 0.01 * force->angstrom; + #ifdef _LMP_INTEL_OFFLOAD const int * _noalias const binhead = this->binhead; const int * _noalias const bins = this->bins; @@ -229,7 +231,7 @@ void NPairIntel::bin_newton(const int offload, NeighList *list, in(ncache_stride,maxnbors,nthreads,maxspecial,nstencil,e_nall,offload) \ in(offload_end,separate_buffers,astart,aend,nlocal,molecular) \ in(ntypes,xperiodic,yperiodic,zperiodic,xprd_half,yprd_half,zprd_half) \ - in(pack_width,special_bound) \ + in(pack_width,special_bound,delta) \ out(overflow:length(5) alloc_if(0) free_if(0)) \ out(timer_compute:length(1) alloc_if(0) free_if(0)) \ signal(tag) @@ -331,7 +333,7 @@ void NPairIntel::bin_newton(const int offload, NeighList *list, const flt_t ztmp = x[i].z; const int itype = x[i].w; tagint itag; - if (THREE) itag = tag[i]; + if (THREE || (TRI && !FULL)) itag = tag[i]; const int ioffset = ntypes * itype; const int ibin = atombin[i]; @@ -365,7 +367,7 @@ void NPairIntel::bin_newton(const int offload, NeighList *list, ty[u] = x[j].y; tz[u] = x[j].z; tjtype[u] = x[j].w; - if (THREE) ttag[u] = tag[j]; + if (THREE || (TRI && !FULL)) ttag[u] = tag[j]; } if (FULL == 0 && TRI != 1) { @@ -486,12 +488,32 @@ void NPairIntel::bin_newton(const int offload, NeighList *list, // Triclinic if (TRI) { - if (tz[u] < ztmp) addme = 0; - if (tz[u] == ztmp) { - if (ty[u] < ytmp) addme = 0; - if (ty[u] == ytmp) { - if (tx[u] < xtmp) addme = 0; - if (tx[u] == xtmp && j <= i) addme = 0; + if (FULL) { + if (tz[u] < ztmp) addme = 0; + if (tz[u] == ztmp) { + if (ty[u] < ytmp) addme = 0; + if (ty[u] == ytmp) { + if (tx[u] < xtmp) addme = 0; + if (tx[u] == xtmp && j <= i) addme = 0; + } + } + } else { + if (j <= i) addme = 0; + if (j >= nlocal) { + const tagint jtag = ttag[u]; + if (itag > jtag) { + if ((itag+jtag) % 2 == 0) addme = 0; + } else if (itag < jtag) { + if ((itag+jtag) % 2 == 1) addme = 0; + } else { + if (fabs(tz[u]-ztmp) > delta) { + if (tz[u] < ztmp) addme = 0; + } else if (fabs(ty[u]-ytmp) > delta) { + if (ty[u] < ytmp) addme = 0; + } else { + if (tx[u] < xtmp) addme = 0; + } + } } } } From dbab5b69312a2d789f37973ce21873cc2e2757e4 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 4 Aug 2023 22:24:48 -0400 Subject: [PATCH 032/219] possible workaround for unit test failure taken from: https://github.com/open-mpi/ompi/issues/9656 --- unittest/formats/CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/unittest/formats/CMakeLists.txt b/unittest/formats/CMakeLists.txt index 93ea2f3b32..58c797b6e6 100644 --- a/unittest/formats/CMakeLists.txt +++ b/unittest/formats/CMakeLists.txt @@ -41,6 +41,8 @@ set_tests_properties(TextFileReader PROPERTIES ENVIRONMENT "LAMMPS_POTENTIALS=${ add_executable(test_file_operations test_file_operations.cpp) target_link_libraries(test_file_operations PRIVATE lammps GTest::GMock) add_test(NAME FileOperations COMMAND test_file_operations) +# try to mitigate possible OpenMPI bug +set_tests_properties(TextFileReader PROPERTIES ENVIRONMENT "OMPI_MCA_sharedfp=\"^sm\"") add_executable(test_dump_atom test_dump_atom.cpp) target_link_libraries(test_dump_atom PRIVATE lammps GTest::GMock) From dc8f17e8e6d75e795e93fd2b2d85e93324f6ec12 Mon Sep 17 00:00:00 2001 From: Trung Nguyen Date: Sun, 6 Aug 2023 00:04:46 -0500 Subject: [PATCH 033/219] Fixed bugs with missing x array, removed the () operator overloads because they require access to domain within the kernels --- src/KOKKOS/fix_efield_kokkos.cpp | 63 +++++++++++++++++++++++++++----- src/KOKKOS/fix_efield_kokkos.h | 4 +- 2 files changed, 55 insertions(+), 12 deletions(-) diff --git a/src/KOKKOS/fix_efield_kokkos.cpp b/src/KOKKOS/fix_efield_kokkos.cpp index d4ef6dc3f2..ecf4418cf6 100644 --- a/src/KOKKOS/fix_efield_kokkos.cpp +++ b/src/KOKKOS/fix_efield_kokkos.cpp @@ -77,8 +77,9 @@ void FixEfieldKokkos::init() template void FixEfieldKokkos::post_force(int /*vflag*/) { - atomKK->sync(execution_space, F_MASK | Q_MASK | IMAGE_MASK | MASK_MASK); + atomKK->sync(execution_space, X_MASK | F_MASK | Q_MASK | IMAGE_MASK | MASK_MASK); + x = atomKK->k_f.view(); f = atomKK->k_f.view(); q = atomKK->k_q.view(); image = atomKK->k_image.view(); @@ -132,10 +133,8 @@ void FixEfieldKokkos::post_force(int /*vflag*/) auto l_image = image; auto l_groupbit = groupbit; - Kokkos::parallel_reduce(Kokkos::RangePolicy(0,nlocal), - LAMMPS_LAMBDA(int i, double_4& fsum_kk) { + Kokkos::parallel_reduce(nlocal, LAMMPS_LAMBDA(const int& i, double_4& fsum_kk) { if (l_mask[i] & l_groupbit) { - Few x_i; x_i[0] = l_x(i,0); x_i[1] = l_x(i,1); @@ -148,14 +147,12 @@ void FixEfieldKokkos::post_force(int /*vflag*/) l_f(i,0) += fx; l_f(i,1) += fy; l_f(i,2) += fz; - fsum_kk.d0 -= fx * unwrap[0] + fy * unwrap[1] + fz * unwrap[2]; fsum_kk.d1 += fx; fsum_kk.d2 += fy; fsum_kk.d3 += fz; } - }, fsum_kk); - + },fsum_kk); } copymode = 0; @@ -186,7 +183,53 @@ void FixEfieldKokkos::post_force(int /*vflag*/) } copymode = 1; - Kokkos::parallel_reduce(Kokkos::RangePolicy(0,nlocal),*this,fsum_kk); + //Kokkos::parallel_reduce(Kokkos::RangePolicy(0,nlocal),*this,fsum_kk); + + { + // local variables for lambda capture + auto prd = Few(domain->prd); + auto h = Few(domain->h); + auto triclinic = domain->triclinic; + auto l_ex = ex; + auto l_ey = ey; + auto l_ez = ez; + auto l_d_efield = d_efield; + + auto l_x = x; + auto l_q = q; + auto l_f = f; + auto l_mask = mask; + auto l_image = image; + auto l_groupbit = groupbit; + auto l_xstyle = xstyle; + auto l_ystyle = ystyle; + auto l_zstyle = zstyle; + + Kokkos::parallel_reduce(nlocal, LAMMPS_LAMBDA(const int& i, double_4& fsum_kk) { + if (l_mask[i] & l_groupbit) { + Few x_i; + x_i[0] = l_x(i,0); + x_i[1] = l_x(i,1); + x_i[2] = l_x(i,2); + auto unwrap = DomainKokkos::unmap(prd,h,triclinic,x_i,l_image(i)); + auto qtmp = l_q(i); + auto fx = qtmp * l_ex; + auto fy = qtmp * l_ey; + auto fz = qtmp * l_ez; + if (l_xstyle == ATOM) l_f(i,0) += l_d_efield(i,0); + else if (l_xstyle) l_f(i,0) += fx; + if (l_ystyle == ATOM) l_f(i,1) += l_d_efield(i,1); + else if (l_ystyle) l_f(i,1) += fy; + if (l_zstyle == ATOM) l_f(i,2) += l_d_efield(i,2); + else if (l_zstyle) l_f(i,2) += fz; + fsum_kk.d0 -= fx * unwrap[0] + fy * unwrap[1] + fz * unwrap[2]; + fsum_kk.d1 += fx; + fsum_kk.d2 += fy; + fsum_kk.d3 += fz; + } + },fsum_kk); + } + copymode = 0; } @@ -197,7 +240,7 @@ void FixEfieldKokkos::post_force(int /*vflag*/) fsum[2] = fsum_kk.d2; fsum[3] = fsum_kk.d3; } - +/* template KOKKOS_INLINE_FUNCTION void FixEfieldKokkos::operator()(TagFixEfieldConstant, const int &i, double_4& fsum_kk) const { @@ -255,7 +298,7 @@ void FixEfieldKokkos::operator()(TagFixEfieldNonConstant, const int fsum_kk.d3 += fz; } } - +*/ namespace LAMMPS_NS { template class FixEfieldKokkos; #ifdef LMP_KOKKOS_GPU diff --git a/src/KOKKOS/fix_efield_kokkos.h b/src/KOKKOS/fix_efield_kokkos.h index d159473d1d..2739d03ffc 100644 --- a/src/KOKKOS/fix_efield_kokkos.h +++ b/src/KOKKOS/fix_efield_kokkos.h @@ -60,13 +60,13 @@ class FixEfieldKokkos : public FixEfield { ~FixEfieldKokkos() override; void init() override; void post_force(int) override; - +/* KOKKOS_INLINE_FUNCTION void operator()(TagFixEfieldConstant, const int&, double_4&) const; KOKKOS_INLINE_FUNCTION void operator()(TagFixEfieldNonConstant, const int&, double_4&) const; - +*/ private: DAT::tdual_ffloat_2d k_efield; typename AT::t_ffloat_2d_randomread d_efield; From 4a8275446439aaaa0e859fbbe7fc53de9ac6c4b4 Mon Sep 17 00:00:00 2001 From: Trung Nguyen Date: Mon, 7 Aug 2023 00:30:32 -0500 Subject: [PATCH 034/219] Fixed an obvious bug with x --- src/KOKKOS/fix_efield_kokkos.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/KOKKOS/fix_efield_kokkos.cpp b/src/KOKKOS/fix_efield_kokkos.cpp index ecf4418cf6..1f29d1f809 100644 --- a/src/KOKKOS/fix_efield_kokkos.cpp +++ b/src/KOKKOS/fix_efield_kokkos.cpp @@ -79,7 +79,7 @@ void FixEfieldKokkos::post_force(int /*vflag*/) { atomKK->sync(execution_space, X_MASK | F_MASK | Q_MASK | IMAGE_MASK | MASK_MASK); - x = atomKK->k_f.view(); + x = atomKK->k_x.view(); f = atomKK->k_f.view(); q = atomKK->k_q.view(); image = atomKK->k_image.view(); From 7c17ea632c6fda6c367002b44c028a778624aee7 Mon Sep 17 00:00:00 2001 From: Germain Clavier Date: Mon, 7 Aug 2023 12:09:44 +0200 Subject: [PATCH 035/219] Reverted changes to tau as a time constant. To be checked. --- src/fix_press_langevin.cpp | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/fix_press_langevin.cpp b/src/fix_press_langevin.cpp index ec8f034181..2fad9e300f 100644 --- a/src/fix_press_langevin.cpp +++ b/src/fix_press_langevin.cpp @@ -75,6 +75,7 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : // Pressure and pistons period tau_p p_start[i] = p_stop[i] = p_period[i] = 0.0; p_flag[i] = 0; + // p_mass[i] = 1e-3; p_fric[i] = 0.; @@ -88,6 +89,7 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : // Random value for each piston fran[i] = 0.0; f_piston[i] = 0.0; + dilation[i] = 0.0; } // process keywords @@ -364,9 +366,9 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : // with alpha = Q/p_period // similar to fix_langevin formalism for (int i = 0; i < 6; i++) { - p_fric[i] = p_mass/p_period[i]; - gjfa[i] = (1.0 - p_fric[i] * update->dt / 2.0 / p_mass) / (1.0 + p_fric[i] * update->dt / 2.0 / p_mass); - gjfb[i] = 1./(1.0 + p_fric[i] * update->dt / 2.0 / p_mass); + // p_mass[i] = p_period[i]; // force->boltz*t_start*(atom->natoms + 1)*p_period[i]*p_period[i]; + gjfa[i] = (1.0 - update->dt / 2.0 / p_period[i]) / (1.0 + update->dt / 2.0 / p_period[i]); + gjfb[i] = 1./(1.0 + update->dt / 2.0 / p_period[i]); } nrigid = 0; @@ -469,6 +471,8 @@ void FixPressLangevin::initial_integrate(int /* vflag */) // Compute new random term on pistons dynamics if (delta != 0.0) delta /= update->endstep - update->beginstep; t_target = t_start + delta * (t_stop-t_start); + // for (int i = 0; i < 6; i++) + // p_mass[i] = force->boltz*t_target*(atom->natoms + 1)*p_period[i]*p_period[i]; couple_beta(t_target); dt = update->dt; @@ -600,7 +604,7 @@ void FixPressLangevin::couple_beta(double t_target) int me = comm->me; for (int i=0; i<6; i++) - gamma[i] = sqrt(2.0*force->boltz*update->dt*p_fric[i]*t_target); + gamma[i] = sqrt(2.0*p_mass*force->boltz*update->dt/p_period[i]*t_target); fran[0] = fran[1] = fran[2] = 0.0; fran[3] = fran[4] = fran[5] = 0.0; @@ -806,7 +810,7 @@ int FixPressLangevin::modify_param(int narg, char **arg) void FixPressLangevin::reset_dt() { for (int i=0; i<6; i++) { - gjfa[i] = (1.0 - p_fric[i] * update->dt / 2.0 / p_mass) / (1.0 + p_fric[i] * update->dt / 2.0 / p_mass); - gjfb[i] = sqrt(1.0 + p_fric[i] * update->dt / 2.0 / p_mass); + gjfa[i] = (1.0 - update->dt / 2.0 / p_period[i]) / (1.0 + update->dt / 2.0 / p_period[i]); + gjfb[i] = sqrt(1.0 + update->dt / 2.0 / p_period[i]); } } From 4ca32f0ceccedc2bee1c657038a72e0802c58605 Mon Sep 17 00:00:00 2001 From: Trung Nguyen Date: Mon, 7 Aug 2023 15:24:16 -0500 Subject: [PATCH 036/219] Added comments to the use of operators overloaded when accessing unwrap on the GPU (serial works fine) --- src/KOKKOS/fix_efield_kokkos.cpp | 14 +++++++++----- src/KOKKOS/fix_efield_kokkos.h | 4 ++-- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/KOKKOS/fix_efield_kokkos.cpp b/src/KOKKOS/fix_efield_kokkos.cpp index 1f29d1f809..bbf106f515 100644 --- a/src/KOKKOS/fix_efield_kokkos.cpp +++ b/src/KOKKOS/fix_efield_kokkos.cpp @@ -115,6 +115,8 @@ void FixEfieldKokkos::post_force(int /*vflag*/) if (varflag == CONSTANT) { copymode = 1; + + // It would be more concise to use the operators below, but there is still an issue with unwrap (TODO below) //Kokkos::parallel_reduce(Kokkos::RangePolicy(0,nlocal),*this,fsum_kk); { @@ -183,8 +185,8 @@ void FixEfieldKokkos::post_force(int /*vflag*/) } copymode = 1; + // It would be more concise to use the operators below, but there is still an issue with unwrap (TODO below) //Kokkos::parallel_reduce(Kokkos::RangePolicy(0,nlocal),*this,fsum_kk); - { // local variables for lambda capture auto prd = Few(domain->prd); @@ -240,12 +242,13 @@ void FixEfieldKokkos::post_force(int /*vflag*/) fsum[2] = fsum_kk.d2; fsum[3] = fsum_kk.d3; } -/* + template KOKKOS_INLINE_FUNCTION void FixEfieldKokkos::operator()(TagFixEfieldConstant, const int &i, double_4& fsum_kk) const { if (mask[i] & groupbit) { if (region && !d_match[i]) return; + auto prd = Few(domain->prd); auto h = Few(domain->h); auto triclinic = domain->triclinic; @@ -254,14 +257,14 @@ void FixEfieldKokkos::operator()(TagFixEfieldConstant, const int &i, x_i[1] = x(i,1); x_i[2] = x(i,2); auto unwrap = DomainKokkos::unmap(prd,h,triclinic,x_i,image(i)); - const F_FLOAT qtmp = q[i]; + const F_FLOAT qtmp = q(i); const F_FLOAT fx = qtmp * ex; const F_FLOAT fy = qtmp * ey; const F_FLOAT fz = qtmp * ez; f(i,0) += fx; f(i,1) += fy; f(i,2) += fz; - + // TODO: access to unwrap below crashes fsum_kk.d0 -= fx * unwrap[0] + fy * unwrap[1] + fz * unwrap[2]; fsum_kk.d1 += fx; fsum_kk.d2 += fy; @@ -292,13 +295,14 @@ void FixEfieldKokkos::operator()(TagFixEfieldNonConstant, const int else if (ystyle) f(i,1) += fy; if (zstyle == ATOM) f(i,2) += d_efield(i,2); else if (zstyle) f(i,2) += fz; + // TODO: access to unwrap below crashes fsum_kk.d0 -= fx * unwrap[0] + fy * unwrap[1] + fz * unwrap[2]; fsum_kk.d1 += fx; fsum_kk.d2 += fy; fsum_kk.d3 += fz; } } -*/ + namespace LAMMPS_NS { template class FixEfieldKokkos; #ifdef LMP_KOKKOS_GPU diff --git a/src/KOKKOS/fix_efield_kokkos.h b/src/KOKKOS/fix_efield_kokkos.h index 2739d03ffc..d159473d1d 100644 --- a/src/KOKKOS/fix_efield_kokkos.h +++ b/src/KOKKOS/fix_efield_kokkos.h @@ -60,13 +60,13 @@ class FixEfieldKokkos : public FixEfield { ~FixEfieldKokkos() override; void init() override; void post_force(int) override; -/* + KOKKOS_INLINE_FUNCTION void operator()(TagFixEfieldConstant, const int&, double_4&) const; KOKKOS_INLINE_FUNCTION void operator()(TagFixEfieldNonConstant, const int&, double_4&) const; -*/ + private: DAT::tdual_ffloat_2d k_efield; typename AT::t_ffloat_2d_randomread d_efield; From 6ff85cab7f3bc8cec12470fadd675945561a0c39 Mon Sep 17 00:00:00 2001 From: Trung Nguyen Date: Thu, 10 Aug 2023 00:34:52 -0500 Subject: [PATCH 037/219] Adding fix spring/self/kk, needed to add maxatom to fix spring/self, may need resize xoriginal as well --- src/fix_spring_self.cpp | 1 + src/fix_spring_self.h | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/fix_spring_self.cpp b/src/fix_spring_self.cpp index 550b3afc4d..31f54caef2 100644 --- a/src/fix_spring_self.cpp +++ b/src/fix_spring_self.cpp @@ -73,6 +73,7 @@ FixSpringSelf::FixSpringSelf(LAMMPS *lmp, int narg, char **arg) : // register with Atom class xoriginal = nullptr; + maxatom = atom->nmax; FixSpringSelf::grow_arrays(atom->nmax); atom->add_callback(Atom::GROW); atom->add_callback(Atom::RESTART); diff --git a/src/fix_spring_self.h b/src/fix_spring_self.h index 59dba78e43..24a03aa92e 100644 --- a/src/fix_spring_self.h +++ b/src/fix_spring_self.h @@ -47,11 +47,12 @@ class FixSpringSelf : public Fix { int size_restart(int) override; int maxsize_restart() override; - private: + protected: double k, espring; double **xoriginal; // original coords of atoms int xflag, yflag, zflag; int ilevel_respa; + int maxatom; }; } // namespace LAMMPS_NS From 4bb3ecd09c1a88768e556be76f8707a685c33680 Mon Sep 17 00:00:00 2001 From: Trung Nguyen Date: Thu, 10 Aug 2023 00:36:33 -0500 Subject: [PATCH 038/219] Added the fix spring/self/kk source files --- src/KOKKOS/fix_spring_self_kokkos.cpp | 152 ++++++++++++++++++++++++++ src/KOKKOS/fix_spring_self_kokkos.h | 57 ++++++++++ 2 files changed, 209 insertions(+) create mode 100644 src/KOKKOS/fix_spring_self_kokkos.cpp create mode 100644 src/KOKKOS/fix_spring_self_kokkos.h diff --git a/src/KOKKOS/fix_spring_self_kokkos.cpp b/src/KOKKOS/fix_spring_self_kokkos.cpp new file mode 100644 index 0000000000..fe6d3a3d50 --- /dev/null +++ b/src/KOKKOS/fix_spring_self_kokkos.cpp @@ -0,0 +1,152 @@ +// clang-format off +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#include "fix_spring_self_kokkos.h" + +#include "atom_kokkos.h" +#include "update.h" +#include "modify.h" +#include "domain_kokkos.h" +#include "region.h" +#include "input.h" +#include "variable.h" +#include "memory_kokkos.h" +#include "error.h" +#include "atom_masks.h" +#include "kokkos_base.h" + +#include + +using namespace LAMMPS_NS; +using namespace FixConst; + +/* ---------------------------------------------------------------------- */ + +template +FixSpringSelfKokkos::FixSpringSelfKokkos(LAMMPS *lmp, int narg, char **arg) : + FixSpringSelf(lmp, narg, arg) +{ + kokkosable = 1; + atomKK = (AtomKokkos *) atom; + execution_space = ExecutionSpaceFromDevice::space; + datamask_read = EMPTY_MASK; + datamask_modify = EMPTY_MASK; + + maxatom = atom->nmax; + memory->destroy(xoriginal); + memoryKK->create_kokkos(k_xoriginal,xoriginal,maxatom,3,"spring/self:xoriginal"); + d_xoriginal = k_xoriginal.view(); +} + +/* ---------------------------------------------------------------------- */ + +template +FixSpringSelfKokkos::~FixSpringSelfKokkos() +{ + if (copymode) return; + + memoryKK->destroy_kokkos(k_xoriginal,xoriginal); + xoriginal = nullptr; +} + +/* ---------------------------------------------------------------------- */ + +template +void FixSpringSelfKokkos::init() +{ + FixSpringSelf::init(); + + if (utils::strmatch(update->integrate_style,"^respa")) + error->all(FLERR,"Cannot (yet) use respa with Kokkos"); +} + +/* ---------------------------------------------------------------------- */ + +template +void FixSpringSelfKokkos::post_force(int /*vflag*/) +{ + atomKK->sync(execution_space, X_MASK | F_MASK | MASK_MASK); + + x = atomKK->k_x.view(); + f = atomKK->k_f.view(); + image = atomKK->k_image.view(); + mask = atomKK->k_mask.view(); + + int nlocal = atom->nlocal; + + // reallocate xoriginal array if necessary + + if (atom->nmax > maxatom) { + maxatom = atom->nmax; + memoryKK->destroy_kokkos(k_xoriginal,xoriginal); + memoryKK->create_kokkos(k_xoriginal,xoriginal,maxatom,3,"fix_spring/self:xoriginal"); + d_xoriginal = k_xoriginal.view(); + } + + double espring_kk; + + + copymode = 1; + //Kokkos::parallel_reduce(Kokkos::RangePolicy(0,nlocal),*this, espring_kk); + { + // local variables for lambda capture + auto prd = Few(domain->prd); + auto h = Few(domain->h); + auto triclinic = domain->triclinic; + auto l_xflag = xflag; + auto l_yflag = yflag; + auto l_zflag = zflag; + auto l_k = k; + auto l_x = x; + auto l_xoriginal = d_xoriginal; + auto l_f = f; + auto l_mask = mask; + auto l_image = image; + auto l_groupbit = groupbit; + + Kokkos::parallel_reduce(nlocal, LAMMPS_LAMBDA(const int& i, double& espring_kk) { + if (l_mask[i] & l_groupbit) { + Few x_i; + x_i[0] = l_x(i,0); + x_i[1] = l_x(i,1); + x_i[2] = l_x(i,2); + auto unwrap = DomainKokkos::unmap(prd,h,triclinic,x_i,l_image(i)); + auto dx = unwrap[0] - l_xoriginal(i, 0); + auto dy = unwrap[1] - l_xoriginal(i, 1); + auto dz = unwrap[2] - l_xoriginal(i, 2); + if (!l_xflag) dx = 0.0; + if (!l_yflag) dy = 0.0; + if (!l_zflag) dz = 0.0; + l_f(i,0) -= l_k*dx; + l_f(i,1) -= l_k*dy; + l_f(i,2) -= l_k*dz; + espring_kk += l_k * (dx*dx + dy*dy + dz*dz); + } + },espring_kk); + } + + copymode = 0; + + atomKK->modified(execution_space, F_MASK); + + espring = 0.5*espring_kk; +} + +namespace LAMMPS_NS { +template class FixSpringSelfKokkos; +#ifdef LMP_KOKKOS_GPU +template class FixSpringSelfKokkos; +#endif +} + diff --git a/src/KOKKOS/fix_spring_self_kokkos.h b/src/KOKKOS/fix_spring_self_kokkos.h new file mode 100644 index 0000000000..58dcbc525e --- /dev/null +++ b/src/KOKKOS/fix_spring_self_kokkos.h @@ -0,0 +1,57 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef FIX_CLASS +// clang-format off +FixStyle(spring/self/kk,FixSpringSelfKokkos); +FixStyle(spring/self/kk/device,FixSpringSelfKokkos); +FixStyle(spring/self/kk/host,FixSpringSelfKokkos); +// clang-format on +#else + +// clang-format off +#ifndef LMP_FIX_SPRING_SELF_KOKKOS_H +#define LMP_FIX_SPRING_SELF_KOKKOS_H + +#include "fix_spring_self.h" +#include "kokkos_type.h" + +namespace LAMMPS_NS { + +template +class FixSpringSelfKokkos : public FixSpringSelf { + public: + typedef DeviceType device_type; + typedef double value_type; + typedef ArrayTypes AT; + + FixSpringSelfKokkos(class LAMMPS *, int, char **); + ~FixSpringSelfKokkos() override; + void init() override; + void post_force(int) override; + + private: + DAT::tdual_ffloat_2d k_xoriginal; + typename AT::t_ffloat_2d_randomread d_xoriginal; + + typename AT::t_x_array_randomread x; + typename AT::t_f_array f; + typename AT::t_imageint_1d_randomread image; + typename AT::t_int_1d_randomread mask; +}; + +} + +#endif +#endif + From a24eccf95d0abd036823ff5bbe45839ca9d8a907 Mon Sep 17 00:00:00 2001 From: Trung Nguyen Date: Fri, 11 Aug 2023 09:43:28 -0500 Subject: [PATCH 039/219] Removed maxatom from fix spring/self, need to work on exchange for xoriginal on spring/self/kk --- src/KOKKOS/fix_spring_self_kokkos.cpp | 12 +----------- src/fix_spring_self.cpp | 3 ++- src/fix_spring_self.h | 1 - 3 files changed, 3 insertions(+), 13 deletions(-) diff --git a/src/KOKKOS/fix_spring_self_kokkos.cpp b/src/KOKKOS/fix_spring_self_kokkos.cpp index fe6d3a3d50..5031c0641b 100644 --- a/src/KOKKOS/fix_spring_self_kokkos.cpp +++ b/src/KOKKOS/fix_spring_self_kokkos.cpp @@ -43,9 +43,8 @@ FixSpringSelfKokkos::FixSpringSelfKokkos(LAMMPS *lmp, int narg, char datamask_read = EMPTY_MASK; datamask_modify = EMPTY_MASK; - maxatom = atom->nmax; memory->destroy(xoriginal); - memoryKK->create_kokkos(k_xoriginal,xoriginal,maxatom,3,"spring/self:xoriginal"); + memoryKK->create_kokkos(k_xoriginal,xoriginal,atom->nmax,3,"spring/self:xoriginal"); d_xoriginal = k_xoriginal.view(); } @@ -85,15 +84,6 @@ void FixSpringSelfKokkos::post_force(int /*vflag*/) int nlocal = atom->nlocal; - // reallocate xoriginal array if necessary - - if (atom->nmax > maxatom) { - maxatom = atom->nmax; - memoryKK->destroy_kokkos(k_xoriginal,xoriginal); - memoryKK->create_kokkos(k_xoriginal,xoriginal,maxatom,3,"fix_spring/self:xoriginal"); - d_xoriginal = k_xoriginal.view(); - } - double espring_kk; diff --git a/src/fix_spring_self.cpp b/src/fix_spring_self.cpp index 31f54caef2..df00a2ba8c 100644 --- a/src/fix_spring_self.cpp +++ b/src/fix_spring_self.cpp @@ -73,7 +73,6 @@ FixSpringSelf::FixSpringSelf(LAMMPS *lmp, int narg, char **arg) : // register with Atom class xoriginal = nullptr; - maxatom = atom->nmax; FixSpringSelf::grow_arrays(atom->nmax); atom->add_callback(Atom::GROW); atom->add_callback(Atom::RESTART); @@ -97,6 +96,8 @@ FixSpringSelf::FixSpringSelf(LAMMPS *lmp, int narg, char **arg) : FixSpringSelf::~FixSpringSelf() { + if (copymode) return; + // unregister callbacks to this fix from Atom class atom->delete_callback(id,Atom::GROW); diff --git a/src/fix_spring_self.h b/src/fix_spring_self.h index 24a03aa92e..f13f2be918 100644 --- a/src/fix_spring_self.h +++ b/src/fix_spring_self.h @@ -52,7 +52,6 @@ class FixSpringSelf : public Fix { double **xoriginal; // original coords of atoms int xflag, yflag, zflag; int ilevel_respa; - int maxatom; }; } // namespace LAMMPS_NS From ca9924035bbb90c5d6c9cf41db40a6a10f293ec5 Mon Sep 17 00:00:00 2001 From: Trung Nguyen Date: Sat, 12 Aug 2023 01:19:43 -0500 Subject: [PATCH 040/219] Working on pack/unpack exchange for xoriginal --- src/KOKKOS/fix_spring_self_kokkos.cpp | 143 ++++++++++++++++++++++++++ src/KOKKOS/fix_spring_self_kokkos.h | 53 +++++++++- 2 files changed, 193 insertions(+), 3 deletions(-) diff --git a/src/KOKKOS/fix_spring_self_kokkos.cpp b/src/KOKKOS/fix_spring_self_kokkos.cpp index 5031c0641b..4e89ede2ba 100644 --- a/src/KOKKOS/fix_spring_self_kokkos.cpp +++ b/src/KOKKOS/fix_spring_self_kokkos.cpp @@ -133,6 +133,149 @@ void FixSpringSelfKokkos::post_force(int /*vflag*/) espring = 0.5*espring_kk; } +/* ---------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void FixSpringSelfKokkos::pack_exchange_item(const int &mysend, int &offset, const bool &final) const +{ + const int i = d_exchange_sendlist(mysend); + + d_buf[mysend] = nsend + offset; + int m = nsend + offset; + d_buf[m++] = d_xoriginal(i,0); + d_buf[m++] = d_xoriginal(i,1); + d_buf[m++] = d_xoriginal(i,2); + if (mysend == nsend-1) d_count() = m; + offset = m - nsend; + + const int j = d_copylist(mysend); + if (j > -1) { + d_xoriginal(i,0) = d_xoriginal(j,0); + d_xoriginal(i,1) = d_xoriginal(j,1); + d_xoriginal(i,2) = d_xoriginal(j,2); + } +} + +/* ---------------------------------------------------------------------- */ + +template +int FixSpringSelfKokkos::pack_exchange_kokkos( + const int &nsend, DAT::tdual_xfloat_2d &k_buf, + DAT::tdual_int_1d k_exchange_sendlist, DAT::tdual_int_1d k_copylist, + ExecutionSpace space) +{ + + k_buf.sync(); + k_copylist.sync(); + k_exchange_sendlist.sync(); + + d_buf = typename ArrayTypes::t_xfloat_1d_um( + k_buf.template view().data(), + k_buf.extent(0)*k_buf.extent(1)); + d_copylist = k_copylist.view(); + d_exchange_sendlist = k_exchange_sendlist.view(); + this->nsend = nsend; + + + k_xoriginal.template sync(); + + Kokkos::deep_copy(d_count,0); + + copymode = 1; + + FixSpringSelfKokkosPackExchangeFunctor pack_exchange_functor(this); + Kokkos::parallel_scan(nsend,pack_exchange_functor); + + copymode = 0; + + k_buf.modify(); + + if (space == Host) k_buf.sync(); + else k_buf.sync(); + + k_xoriginal.template modify(); + + Kokkos::deep_copy(h_count,d_count); + + return h_count(); +} + +/* ---------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void FixSpringSelfKokkos::operator()(TagFixSpringSelfUnpackExchange, const int &i) const +{ + int index = d_indices(i); + + if (index > -1) { + int m = d_buf[i]; + + d_xoriginal(index,0) = static_cast (d_buf[m++]); + d_xoriginal(index,1) = static_cast (d_buf[m++]); + d_xoriginal(index,2) = static_cast (d_buf[m++]); + } +} + +/* ---------------------------------------------------------------------- */ + +template +void FixSpringSelfKokkos::unpack_exchange_kokkos( + DAT::tdual_xfloat_2d &k_buf, DAT::tdual_int_1d &k_indices, int nrecv, + ExecutionSpace /*space*/) +{ + k_buf.sync(); + k_indices.sync(); + + d_buf = typename ArrayTypes::t_xfloat_1d_um( + k_buf.template view().data(), + k_buf.extent(0)*k_buf.extent(1)); + d_indices = k_indices.view(); + + k_xoriginal.template sync(); + + copymode = 1; + + Kokkos::parallel_for(Kokkos::RangePolicy(0,nrecv),*this); + + copymode = 0; + + k_xoriginal.template modify(); +} + +/* ---------------------------------------------------------------------- + pack values in local atom-based arrays for exchange with another proc +------------------------------------------------------------------------- */ + +template +int FixSpringSelfKokkos::pack_exchange(int i, double *buf) +{ + k_xoriginal.sync_host(); + + int m = FixSpringSelf::pack_exchange(i,buf); + + k_xoriginal.modify_host(); + + return m; +} + +/* ---------------------------------------------------------------------- + unpack values in local atom-based arrays from exchange with another proc +------------------------------------------------------------------------- */ + +template +int FixSpringSelfKokkos::unpack_exchange(int nlocal, double *buf) +{ + k_xoriginal.sync_host(); + + int m = FixSpringSelf::unpack_exchange(nlocal,buf); + + k_xoriginal.modify_host(); + + return m; +} + namespace LAMMPS_NS { template class FixSpringSelfKokkos; #ifdef LMP_KOKKOS_GPU diff --git a/src/KOKKOS/fix_spring_self_kokkos.h b/src/KOKKOS/fix_spring_self_kokkos.h index 58dcbc525e..b69d4edb4a 100644 --- a/src/KOKKOS/fix_spring_self_kokkos.h +++ b/src/KOKKOS/fix_spring_self_kokkos.h @@ -25,11 +25,14 @@ FixStyle(spring/self/kk/host,FixSpringSelfKokkos); #include "fix_spring_self.h" #include "kokkos_type.h" +#include "kokkos_base.h" namespace LAMMPS_NS { +struct TagFixSpringSelfUnpackExchange{}; + template -class FixSpringSelfKokkos : public FixSpringSelf { +class FixSpringSelfKokkos : public FixSpringSelf, public KokkosBase { public: typedef DeviceType device_type; typedef double value_type; @@ -40,14 +43,58 @@ class FixSpringSelfKokkos : public FixSpringSelf { void init() override; void post_force(int) override; - private: + KOKKOS_INLINE_FUNCTION + void pack_exchange_item(const int&, int &, const bool &) const; + + KOKKOS_INLINE_FUNCTION + void operator()(TagFixSpringSelfUnpackExchange, const int&) const; + + int pack_exchange_kokkos(const int &nsend,DAT::tdual_xfloat_2d &buf, + DAT::tdual_int_1d k_sendlist, + DAT::tdual_int_1d k_copylist, + ExecutionSpace space) override; + + void unpack_exchange_kokkos(DAT::tdual_xfloat_2d &k_buf, + DAT::tdual_int_1d &indices,int nrecv, + ExecutionSpace space) override; + + + int pack_exchange(int, double *) override; + int unpack_exchange(int, double *) override; + + protected: DAT::tdual_ffloat_2d k_xoriginal; - typename AT::t_ffloat_2d_randomread d_xoriginal; + typename AT::t_ffloat_2d d_xoriginal; typename AT::t_x_array_randomread x; typename AT::t_f_array f; typename AT::t_imageint_1d_randomread image; typename AT::t_int_1d_randomread mask; + + int nsend; + + typename AT::t_int_2d d_sendlist; + typename AT::t_xfloat_1d_um d_buf; + + typename AT::t_int_1d d_exchange_sendlist; + typename AT::t_int_1d d_copylist; + typename AT::t_int_1d d_indices; + + typename AT::t_int_scalar d_count; + HAT::t_int_scalar h_count; + +}; + +template +struct FixSpringSelfKokkosPackExchangeFunctor { + typedef DeviceType device_type; + typedef int value_type; + FixSpringSelfKokkos c; + FixSpringSelfKokkosPackExchangeFunctor(FixSpringSelfKokkos* c_ptr):c(*c_ptr) {}; + KOKKOS_INLINE_FUNCTION + void operator()(const int &i, int &offset, const bool &final) const { + c.pack_exchange_item(i, offset, final); + } }; } From ea965d3b2681d6d922edb27e7a0b98859d6c6fb3 Mon Sep 17 00:00:00 2001 From: Trung Nguyen Date: Sun, 13 Aug 2023 23:40:53 -0500 Subject: [PATCH 041/219] Working on exchange comm on device, and grow arrays for xoriginal --- src/KOKKOS/fix_spring_self_kokkos.cpp | 21 +++++++++++++++++++-- src/KOKKOS/fix_spring_self_kokkos.h | 1 + 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/KOKKOS/fix_spring_self_kokkos.cpp b/src/KOKKOS/fix_spring_self_kokkos.cpp index 4e89ede2ba..8a576e2dea 100644 --- a/src/KOKKOS/fix_spring_self_kokkos.cpp +++ b/src/KOKKOS/fix_spring_self_kokkos.cpp @@ -38,14 +38,20 @@ FixSpringSelfKokkos::FixSpringSelfKokkos(LAMMPS *lmp, int narg, char FixSpringSelf(lmp, narg, arg) { kokkosable = 1; + exchange_comm_device = 1; + maxexchange = 6; atomKK = (AtomKokkos *) atom; execution_space = ExecutionSpaceFromDevice::space; datamask_read = EMPTY_MASK; datamask_modify = EMPTY_MASK; memory->destroy(xoriginal); - memoryKK->create_kokkos(k_xoriginal,xoriginal,atom->nmax,3,"spring/self:xoriginal"); - d_xoriginal = k_xoriginal.view(); + + int nmax = atom->nmax; + grow_arrays(nmax); + + d_count = typename AT::t_int_scalar("fix_shake:count"); + h_count = Kokkos::create_mirror_view(d_count); } /* ---------------------------------------------------------------------- */ @@ -133,6 +139,17 @@ void FixSpringSelfKokkos::post_force(int /*vflag*/) espring = 0.5*espring_kk; } +/* ---------------------------------------------------------------------- + allocate local atom-based arrays +------------------------------------------------------------------------- */ + +template +void FixSpringSelfKokkos::grow_arrays(int nmax) +{ + memoryKK->grow_kokkos(k_xoriginal,xoriginal,nmax,3,"spring/self:xoriginal"); + d_xoriginal = k_xoriginal.view(); +} + /* ---------------------------------------------------------------------- */ template diff --git a/src/KOKKOS/fix_spring_self_kokkos.h b/src/KOKKOS/fix_spring_self_kokkos.h index b69d4edb4a..30b9eaf40a 100644 --- a/src/KOKKOS/fix_spring_self_kokkos.h +++ b/src/KOKKOS/fix_spring_self_kokkos.h @@ -41,6 +41,7 @@ class FixSpringSelfKokkos : public FixSpringSelf, public KokkosBase { FixSpringSelfKokkos(class LAMMPS *, int, char **); ~FixSpringSelfKokkos() override; void init() override; + void grow_arrays(int) override; void post_force(int) override; KOKKOS_INLINE_FUNCTION From 3eb8fd219afbb97303efd4fcc5dcd85958dd7954 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Wed, 16 Aug 2023 16:19:11 -0600 Subject: [PATCH 042/219] update of a Howto_output doc page --- doc/src/Howto_output.rst | 140 ++++++++++++++++++++++++++------------- 1 file changed, 93 insertions(+), 47 deletions(-) diff --git a/doc/src/Howto_output.rst b/doc/src/Howto_output.rst index 851b7703fd..6fcd36ab56 100644 --- a/doc/src/Howto_output.rst +++ b/doc/src/Howto_output.rst @@ -1,7 +1,7 @@ Output from LAMMPS (thermo, dumps, computes, fixes, variables) ============================================================== -There are four basic kinds of LAMMPS output: +There are four basic forms of LAMMPS output: * :doc:`Thermodynamic output `, which is a list of quantities printed every few timesteps to the screen and logfile. @@ -20,18 +20,17 @@ output files, depending on what :doc:`dump ` and :doc:`fix ` commands you specify. As discussed below, LAMMPS gives you a variety of ways to determine -what quantities are computed and printed when the thermodynamics, +what quantities are calculated and printed when the thermodynamics, dump, or fix commands listed above perform output. Throughout this discussion, note that users can also :doc:`add their own computes and -fixes to LAMMPS ` which can then generate values that can then -be output with these commands. +fixes to LAMMPS ` which can generate values that can then be +output with these commands. The following subsections discuss different LAMMPS commands related to output and the kind of data they operate on and produce: * :ref:`Global/per-atom/local/per-grid data ` * :ref:`Scalar/vector/array data ` -* :ref:`Per-grid data ` * :ref:`Disambiguation ` * :ref:`Thermodynamic output ` * :ref:`Dump file output ` @@ -48,34 +47,65 @@ to output and the kind of data they operate on and produce: Global/per-atom/local/per-grid data ----------------------------------- -Various output-related commands work with four different styles of +Various output-related commands work with four different "styles" of data: global, per-atom, local, and per-grid. A global datum is one or more system-wide values, e.g. the temperature of the system. A per-atom datum is one or more values per atom, e.g. the kinetic energy of each atom. Local datums are calculated by each processor based on -the atoms it owns, but there may be zero or more per atom, e.g. a list +the atoms it owns, and there may be zero or more per atom, e.g. a list of bond distances. A per-grid datum is one or more values per grid cell, for a grid which -overlays the simulation domain. The grid cells and the data they -store are distributed across processors; each processor owns the grid -cells whose center point falls within its subdomain. +overlays the simulation domain. Similar to atoms and per-atom data, +the grid cells and the data they store are distributed across +processors; each processor owns the grid cells whose center points +fall within its subdomain. .. _scalar: Scalar/vector/array data ------------------------ -Global, per-atom, and local datums can come in three kinds: a single -scalar value, a vector of values, or a 2d array of values. The doc -page for a "compute" or "fix" or "variable" that generates data will -specify both the style and kind of data it produces, e.g. a per-atom -vector. +Global, per-atom, local, and per-grid datums can come in three +"kinds": a single scalar value, a vector of values, or a 2d array of +values. More specifically these are the valid kinds for each style: -When a quantity is accessed, as in many of the output commands -discussed below, it can be referenced via the following bracket -notation, where ID in this case is the ID of a compute. The leading -"c\_" would be replaced by "f\_" for a fix, or "v\_" for a variable: +* global scalar +* global vector +* global array +* per-atom vector +* per-atom array +* local vector +* local array +* per-grid vector +* per-grid array + +A per-atom vector means a single value per atom; the "vector" is the +length of the number of atoms. A per-atom array means multiple values +per atom. Similarly a local vector or array means one or multiple +values per entity (e.g. per bond in the system). And a per-grid +vector or array means one or multiple values per grid cell. + +The doc page for a compute or fix or variable that generates data will +specify both the styles and kinds of data it produces, e.g. a per-atom +vector. Note that a compute or fix may generate multiple styles and +kinds of output. However, for per-atom data only a vector or array is +output, never both. Likewise for per-local and per-grid data. An +example of a fix which generates multiple styles and kinds of data is +the :doc:`fix mdi/qm ` command. It outputs a global +scalar, global vector, and per-atom array for the quantum mechanical +energy and virial of the system and forces on each atom. + +By contrast, different variable styles generate only a single kind of +data: a global scalar for an equal-style variable, global vector for a +vector-style variable, and a per-atom vector for an atom-style +variable. + +When data is accessed by another command, as in many of the output +commands discussed below, it can be referenced via the following +bracket notation, where ID in this case is the ID of a compute. The +leading "c\_" would be replaced by "f\_" for a fix, or "v\_" for a +variable (and ID would be the name of the variable): +-------------+--------------------------------------------+ | c_ID | entire scalar, vector, or array | @@ -85,40 +115,56 @@ notation, where ID in this case is the ID of a compute. The leading | c_ID[I][J] | one element of array | +-------------+--------------------------------------------+ -In other words, using one bracket reduces the dimension of the data -once (vector -> scalar, array -> vector). Using two brackets reduces -the dimension twice (array -> scalar). Thus a command that uses -scalar values as input can typically also process elements of a vector -or array. +Note that using one bracket reduces the dimension of the data once +(vector -> scalar, array -> vector). Using two brackets reduces the +dimension twice (array -> scalar). Thus a command that uses scalar +values as input can also conceptually operate on an element of a +vector or array. -.. _grid: - -Per-grid data ------------------------- - -Per-grid data can come in two kinds: a vector of values (one per grid -cekk), or a 2d array of values (multiple values per grid ckk). The -doc page for a "compute" or "fix" that generates data will specify -names for both the grid(s) and datum(s) it produces, e.g. per-grid -vectors or arrays, which can be referenced by other commands. See the -:doc:`Howto grid ` doc page for more details. +Per-grid vectors or arrays are accessed similarly, except that the ID +for the compute or fix includes a grid name and a data name. This is +because a fix or compute can create multiple grids (of different +sizes) and multiple sets of data (for each grid). The fix or compute +defines names for each grid and for each data set, so that all of them +can be accessed by other commands. See the :doc:`Howto grid +` doc page for more details. .. _disambiguation: Disambiguation -------------- -Some computes and fixes produce data in multiple styles, e.g. a global -scalar and a per-atom vector. Usually the context in which the input -script references the data determines which style is meant. Example: -if a compute provides both a global scalar and a per-atom vector, the -former will be accessed by using ``c_ID`` in an equal-style variable, -while the latter will be accessed by using ``c_ID`` in an atom-style -variable. Note that atom-style variable formulas can also access -global scalars, but in this case it is not possible to do this -directly because of the ambiguity. Instead, an equal-style variable -can be defined which accesses the global scalar, and that variable can -be used in the atom-style variable formula in place of ``c_ID``. +When a compute or fix produces data in multiple styles, e.g. global +and per-atom, a reference to the data can sometimes be ambiguous. +Usually the context in which the input script references the data +determines which style is meant. + +For example, if a compute outputs a global vector and a per-atom +array, an element of the global vector will be accessed by using +``c_ID[I]`` in :doc:`thermodynamic output `, while a +column of the per-atom array will be accessed by using ``c_ID[I]`` in +a :doc:`dump custom ` command. + +However, if a :doc:`atom-style variable ` references +``c_ID[I]``, then it could be intended to refer to a single element of +the global vector or a column of the per-atom array. The doc page for +any command that has a potential ambiguity (variables are the most +common) will explain how to resolve the ambiguity. + +In this case, an atom-style variables references per-atom data if it +exists. If access to an element of a global vector is needed (as in +this example), an equal-style variable which references the value can +be defined and used in the atom-style variable formula instead. + +Similarly, :doc:`thermodynamic output ` can only +reference global data from a compute or fix. But you can indirectly +access per-atom data as follows. The reference ``c_ID[245][2]`` for +the ID of a :doc:`compute displace/atom ` +command, refers to the y-component of displacement for the atom with +ID 245. While you cannot use that reference directly in the +:doc:`thermo_style ` command, you can use it an +equal-style variable formula, and then reference the variable in +thermodynamic output. .. _thermo: @@ -389,7 +435,7 @@ output and input data types must match, e.g. global/per-atom/local data and scalar/vector/array data. Also note that, as described above, when a command takes a scalar as -input, that could be an element of a vector or array. Likewise a +input, that could also be an element of a vector or array. Likewise a vector input could be a column of an array. +--------------------------------------------------------+----------------------------------------------+----------------------------------------------------+ From 0d739439c7cebf64716561022151921c04cd35c8 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Thu, 17 Aug 2023 12:47:48 -0600 Subject: [PATCH 043/219] changes to compute voronoi/atom --- doc/src/compute_voronoi_atom.rst | 126 ++++++++++++--------------- src/VORONOI/compute_voronoi_atom.cpp | 37 ++++---- 2 files changed, 75 insertions(+), 88 deletions(-) diff --git a/doc/src/compute_voronoi_atom.rst b/doc/src/compute_voronoi_atom.rst index 274be1b702..3e67bb6cbf 100644 --- a/doc/src/compute_voronoi_atom.rst +++ b/doc/src/compute_voronoi_atom.rst @@ -13,7 +13,7 @@ Syntax * ID, group-ID are documented in :doc:`compute ` command * voronoi/atom = style name of this compute command * zero or more keyword/value pairs may be appended -* keyword = *only_group* or *occupation* or *surface* or *radius* or *edge_histo* or *edge_threshold* or *face_threshold* or *neighbors* or *peratom* +* keyword = *only_group* or *occupation* or *surface* or *radius* or *edge_histo* or *edge_threshold* or *face_threshold* or *neighbors* .. parsed-literal:: @@ -31,7 +31,6 @@ Syntax *face_threshold* arg = minarea minarea = minimum area for a face to be counted *neighbors* value = *yes* or *no* = store list of all neighbors or no - *peratom* value = *yes* or *no* = per-atom quantities accessible or no Examples """""""" @@ -53,14 +52,12 @@ atoms in the simulation box. The tessellation is calculated using all atoms in the simulation, but non-zero values are only stored for atoms in the group. -By default two per-atom quantities are calculated by this compute. -The first is the volume of the Voronoi cell around each atom. Any -point in an atom's Voronoi cell is closer to that atom than any other. -The second is the number of faces of the Voronoi cell. This is -equal to the number of nearest neighbors of the central atom, -plus any exterior faces (see note below). If the *peratom* keyword -is set to "no", the per-atom quantities are still calculated, -but they are not accessible. +Two per-atom quantities are calculated by this compute. The first is +the volume of the Voronoi cell around each atom. Any point in an +atom's Voronoi cell is closer to that atom than any other. The second +is the number of faces of the Voronoi cell. This is equal to the +number of nearest neighbors of the central atom, plus any exterior +faces (see note below). ---------- @@ -97,13 +94,13 @@ present in atom_style sphere for granular models. The *edge_histo* keyword activates the compilation of a histogram of number of edges on the faces of the Voronoi cells in the compute -group. The argument *maxedge* of the this keyword is the largest number -of edges on a single Voronoi cell face expected to occur in the -sample. This keyword adds the generation of a global vector with -*maxedge*\ +1 entries. The last entry in the vector contains the number of -faces with more than *maxedge* edges. Since the polygon with the -smallest amount of edges is a triangle, entries 1 and 2 of the vector -will always be zero. +group. The argument *maxedge* of the this keyword is the largest +number of edges on a single Voronoi cell face expected to occur in the +sample. This keyword generates output of a global vector by this +compute with *maxedge*\ +1 entries. The last entry in the vector +contains the number of faces with more than *maxedge* edges. Since the +polygon with the smallest amount of edges is a triangle, entries 1 and +2 of the vector will always be zero. The *edge_threshold* and *face_threshold* keywords allow the suppression of edges below a given minimum length and faces below a @@ -127,8 +124,8 @@ to locate vacancies (the coordinates are given by the atom coordinates at the time step when the compute was first invoked), while column two data can be used to identify interstitial atoms. -If the *neighbors* value is set to yes, then this compute creates a -local array with 3 columns. There is one row for each face of each +If the *neighbors* value is set to yes, then this compute also creates +a local array with 3 columns. There is one row for each face of each Voronoi cell. The 3 columns are the atom ID of the atom that owns the cell, the atom ID of the atom in the neighboring cell (or zero if the face is external), and the area of the face. The array can be @@ -143,8 +140,8 @@ containing all the Voronoi neighbors in a system: compute 6 all voronoi/atom neighbors yes dump d2 all local 1 dump.neighbors index c_6[1] c_6[2] c_6[3] -If the *face_threshold* keyword is used, then only faces -with areas greater than the threshold are stored. +If the *face_threshold* keyword is used, then only faces with areas +greater than the threshold are stored. ---------- @@ -158,48 +155,48 @@ Voro++ software in the src/VORONOI/README file. .. note:: - The calculation of Voronoi volumes is performed by each processor for - the atoms it owns, and includes the effect of ghost atoms stored by - the processor. This assumes that the Voronoi cells of owned atoms - are not affected by atoms beyond the ghost atom cut-off distance. - This is usually a good assumption for liquid and solid systems, but - may lead to underestimation of Voronoi volumes in low density - systems. By default, the set of ghost atoms stored by each processor - is determined by the cutoff used for :doc:`pair_style ` - interactions. The cutoff can be set explicitly via the - :doc:`comm_modify cutoff ` command. The Voronoi cells - for atoms adjacent to empty regions will extend into those regions up - to the communication cutoff in :math:`x`, :math:`y`, or :math:`z`. - In that situation, an exterior face is created at the cutoff distance - normal to the :math:`x`, :math:`y`, or :math:`z` direction. For - triclinic systems, the exterior face is parallel to the corresponding - reciprocal lattice vector. + The calculation of Voronoi volumes is performed by each processor + for the atoms it owns, and includes the effect of ghost atoms + stored by the processor. This assumes that the Voronoi cells of + owned atoms are not affected by atoms beyond the ghost atom cut-off + distance. This is usually a good assumption for liquid and solid + systems, but may lead to underestimation of Voronoi volumes in low + density systems. By default, the set of ghost atoms stored by each + processor is determined by the cutoff used for :doc:`pair_style + ` interactions. The cutoff can be set explicitly via + the :doc:`comm_modify cutoff ` command. The Voronoi + cells for atoms adjacent to empty regions will extend into those + regions up to the communication cutoff in :math:`x`, :math:`y`, or + :math:`z`. In that situation, an exterior face is created at the + cutoff distance normal to the :math:`x`, :math:`y`, or :math:`z` + direction. For triclinic systems, the exterior face is parallel to + the corresponding reciprocal lattice vector. .. note:: - The Voro++ package performs its calculation in 3d. This will - still work for a 2d LAMMPS simulation, provided all the atoms have the - same :math:`z`-coordinate. The Voronoi cell of each atom will be a columnar - polyhedron with constant cross-sectional area along the :math:`z`-direction - and two exterior faces at the top and bottom of the simulation box. If - the atoms do not all have the same :math:`z`-coordinate, then the columnar - cells will be accordingly distorted. The cross-sectional area of each - Voronoi cell can be obtained by dividing its volume by the :math:`z` extent - of the simulation box. Note that you define the :math:`z` extent of the - simulation box for 2d simulations when using the - :doc:`create_box ` or :doc:`read_data ` commands. + The Voro++ package performs its calculation in 3d. This will still + work for a 2d LAMMPS simulation, provided all the atoms have the + same :math:`z`-coordinate. The Voronoi cell of each atom will be a + columnar polyhedron with constant cross-sectional area along the + :math:`z`-direction and two exterior faces at the top and bottom of + the simulation box. If the atoms do not all have the same + :math:`z`-coordinate, then the columnar cells will be accordingly + distorted. The cross-sectional area of each Voronoi cell can be + obtained by dividing its volume by the :math:`z` extent of the + simulation box. Note that you define the :math:`z` extent of the + simulation box for 2d simulations when using the :doc:`create_box + ` or :doc:`read_data ` commands. Output info """"""""""" -By default, this compute calculates a per-atom array with two -columns. In regular dynamic tessellation mode the first column is the -Voronoi volume, the second is the neighbor count, as described above -(read above for the output data in case the *occupation* keyword is -specified). These values can be accessed by any command that uses -per-atom values from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output -options. If the *peratom* keyword is set to "no", the per-atom array -is still created, but it is not accessible. +This compute calculates a per-atom array with two columns. In regular +dynamic tessellation mode the first column is the Voronoi volume, the +second is the neighbor count, as described above (read above for the +output data in case the *occupation* keyword is specified). These +values can be accessed by any command that uses per-atom values from a +compute as input. See the :doc:`Howto output ` page for +an overview of LAMMPS output options. If the *edge_histo* keyword is used, then this compute generates a global vector of length *maxedge*\ +1, containing a histogram of the @@ -209,17 +206,6 @@ If the *neighbors* value is set to *yes*, then this compute calculates a local array with three columns. There is one row for each face of each Voronoi cell. -.. note:: - - Some LAMMPS commands such as the :doc:`compute reduce ` - command can accept either a per-atom or local quantity. If this compute - produces both quantities, the command - may access the per-atom quantity, even if you want to access the local - quantity. This effect can be eliminated by using the *peratom* - keyword to turn off the production of the per-atom quantities. For - the default value *yes* both quantities are produced. For the value - *no*, only the local array is produced. - The Voronoi cell volume will be in distance :doc:`units ` cubed. The Voronoi face area will be in distance :doc:`units ` squared. @@ -227,7 +213,8 @@ Restrictions """""""""""" This compute is part of the VORONOI package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` page for more info. +LAMMPS was built with that package. See the :doc:`Build package +` page for more info. It also requires you have a copy of the Voro++ library built and installed on your system. See instructions on obtaining and @@ -241,5 +228,4 @@ Related commands Default """"""" -*neighbors* no, *peratom* yes - +The default for the neighobrs keyword is no. diff --git a/src/VORONOI/compute_voronoi_atom.cpp b/src/VORONOI/compute_voronoi_atom.cpp index 28bab271a2..eb4f53986f 100644 --- a/src/VORONOI/compute_voronoi_atom.cpp +++ b/src/VORONOI/compute_voronoi_atom.cpp @@ -111,12 +111,7 @@ ComputeVoronoi::ComputeVoronoi(LAMMPS *lmp, int narg, char **arg) : if (iarg + 2 > narg) error->all(FLERR,"Illegal compute voronoi/atom command"); faces_flag = utils::logical(FLERR,arg[iarg+1],false,lmp); iarg += 2; - } else if (strcmp(arg[iarg], "peratom") == 0) { - if (iarg + 2 > narg) error->all(FLERR,"Illegal compute voronoi/atom command"); - peratom_flag = utils::logical(FLERR,arg[iarg+1],false,lmp); - iarg += 2; - } - else error->all(FLERR,"Illegal compute voronoi/atom command"); + } else error->all(FLERR,"Illegal compute voronoi/atom command"); } if (occupation && ( surface!=VOROSURF_NONE || maxedge>0 ) ) @@ -394,27 +389,29 @@ void ComputeVoronoi::checkOccupation() // clear occupation vector memset(occvec, 0, oldnatoms*sizeof(*occvec)); - int i, j, k, - nlocal = atom->nlocal, - nall = atom->nghost + nlocal; - double rx, ry, rz, - **x = atom->x; + int i, j, k; + double rx, ry, rz; + + int nlocal = atom->nlocal; + int nall = atom->nghost + nlocal; + double **x = atom->x; // prepare destination buffer for variable evaluation + if (atom->nmax > lmax) { memory->destroy(lnext); lmax = atom->nmax; memory->create(lnext,lmax,"voronoi/atom:lnext"); } - // clear lroot - for (i=0; ifind_voronoi_cell(x[i][0], x[i][1], x[i][2], rx, ry, rz, k)) || @@ -435,6 +432,7 @@ void ComputeVoronoi::checkOccupation() } // MPI sum occupation + #ifdef NOTINPLACE memcpy(sendocc, occvec, oldnatoms*sizeof(*occvec)); MPI_Allreduce(sendocc, occvec, oldnatoms, MPI_INT, MPI_SUM, world); @@ -443,6 +441,7 @@ void ComputeVoronoi::checkOccupation() #endif // determine the total number of atoms in this atom's currently occupied cell + int c; for (i=0; itag[i]; if (mytag > oldmaxtag) voro[i][0] = 0; @@ -479,6 +479,7 @@ void ComputeVoronoi::checkOccupation() void ComputeVoronoi::loopCells() { // invoke voro++ and fetch results for owned atoms in group + voronoicell_neighbor c; int i; if (faces_flag) nfaces = 0; From 299eda8ca36eb4f1eda63f31bd021dca479a4ba3 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Thu, 17 Aug 2023 16:12:14 -0600 Subject: [PATCH 044/219] have compute_reduce require either peratom or local inputs --- doc/src/compute_reduce.rst | 134 +++++++++++++++++++--------------- doc/src/fix_rigid.rst | 5 +- src/compute_reduce.cpp | 95 +++++++++++++++--------- src/compute_reduce.h | 3 +- src/compute_reduce_region.cpp | 18 +++-- 5 files changed, 149 insertions(+), 106 deletions(-) diff --git a/doc/src/compute_reduce.rst b/doc/src/compute_reduce.rst index 204f1c090d..31591d4419 100644 --- a/doc/src/compute_reduce.rst +++ b/doc/src/compute_reduce.rst @@ -37,13 +37,16 @@ Syntax v_name = per-atom vector calculated by an atom-style variable with name * zero or more keyword/args pairs may be appended -* keyword = *replace* +* keyword = *replace* or *inputs* .. parsed-literal:: *replace* args = vec1 vec2 vec1 = reduced value from this input vector will be replaced vec2 = replace it with vec1[N] where N is index of max/min value from vec2 + *inputs* arg = peratom or local + peratom = all inputs are per-atom quantities (default) + local = all input are local quantities Examples """""""" @@ -61,26 +64,30 @@ Description Define a calculation that "reduces" one or more vector inputs into scalar values, one per listed input. The inputs can be per-atom or -local quantities; they cannot be global quantities. Atom attributes -are per-atom quantities, :doc:`computes ` and :doc:`fixes ` -may generate any of the three kinds of quantities, and :doc:`atom-style variables ` generate per-atom quantities. See the -:doc:`variable ` command and its special functions which can -perform the same operations as the compute reduce command on global -vectors. +local quantities and must all be the same kind (per-atom or local); +see discussion of the optional *inputs* keyword below. + +Atom attributes are per-atom quantities, :doc:`computes ` and +:doc:`fixes ` can generate either per-atom or local quantities, +and :doc:`atom-style variables ` generate per-atom +quantities. See the :doc:`variable ` command and its +special functions which can perform the same reduction operations as +the compute reduce command on global vectors. The reduction operation is specified by the *mode* setting. The *sum* option adds the values in the vector into a global total. The *min* or *max* options find the minimum or maximum value across all vector values. The *minabs* or *maxabs* options find the minimum or maximum value across all absolute vector values. The *ave* setting adds the -vector values into a global total, then divides by the number of values -in the vector. The *sumsq* option sums the square of the values in the -vector into a global total. The *avesq* setting does the same as *sumsq*, -then divides the sum of squares by the number of values. The last two options -can be useful for calculating the variance of some quantity (e.g., variance = -sumsq :math:`-` ave\ :math:`^2`). The *sumabs* option sums the absolute -values in the vector into a global total. The *aveabs* setting does the same -as *sumabs*, then divides the sum of absolute values by the number of +vector values into a global total, then divides by the number of +values in the vector. The *sumsq* option sums the square of the +values in the vector into a global total. The *avesq* setting does +the same as *sumsq*, then divides the sum of squares by the number of +values. The last two options can be useful for calculating the +variance of some quantity (e.g., variance = sumsq :math:`-` ave\ +:math:`^2`). The *sumabs* option sums the absolute values in the +vector into a global total. The *aveabs* setting does the same as +*sumabs*, then divides the sum of absolute values by the number of values. Each listed input is operated on independently. For per-atom inputs, @@ -123,52 +130,54 @@ array with six columns: ---------- -The atom attribute values (*x*, *y*, *z*, *vx*, *vy*, *vz*, *fx*, *fy*, and -*fz*) are self-explanatory. Note that other atom attributes can be used as -inputs to this fix by using the -:doc:`compute property/atom ` command and then specifying -an input value from that compute. +The atom attribute values (*x*, *y*, *z*, *vx*, *vy*, *vz*, *fx*, +*fy*, and *fz*) are self-explanatory. Note that other atom attributes +can be used as inputs to this fix by using the :doc:`compute +property/atom ` command and then specifying an +input value from that compute. If a value begins with "c\_", a compute ID must follow which has been -previously defined in the input script. Computes can generate -per-atom or local quantities. See the individual -:doc:`compute ` page for details. If no bracketed integer -is appended, the vector calculated by the compute is used. If a -bracketed integer is appended, the Ith column of the array calculated -by the compute is used. Users can also write code for their own -compute styles and :doc:`add them to LAMMPS `. See the -discussion above for how :math:`I` can be specified with a wildcard asterisk -to effectively specify multiple values. +previously defined in the input script. Valid computes can generate +per-atom or local quantities. See the individual :doc:`compute +` page for details. If no bracketed integer is appended, the +vector calculated by the compute is used. If a bracketed integer is +appended, the Ith column of the array calculated by the compute is +used. Users can also write code for their own compute styles and +:doc:`add them to LAMMPS `. See the discussion above for how +:math:`I` can be specified with a wildcard asterisk to effectively +specify multiple values. If a value begins with "f\_", a fix ID must follow which has been -previously defined in the input script. Fixes can generate per-atom -or local quantities. See the individual :doc:`fix ` page for -details. Note that some fixes only produce their values on certain -timesteps, which must be compatible with when compute reduce +previously defined in the input script. Valid fixes can generate +per-atom or local quantities. See the individual :doc:`fix ` +page for details. Note that some fixes only produce their values on +certain timesteps, which must be compatible with when compute reduce references the values, else an error results. If no bracketed integer is appended, the vector calculated by the fix is used. If a bracketed integer is appended, the Ith column of the array calculated by the fix is used. Users can also write code for their own fix style and :doc:`add them to LAMMPS `. See the discussion above for how -:math:`I` can be specified with a wildcard asterisk to effectively specify -multiple values. +:math:`I` can be specified with a wildcard asterisk to effectively +specify multiple values. If a value begins with "v\_", a variable name must follow which has been previously defined in the input script. It must be an :doc:`atom-style variable `. Atom-style variables can reference thermodynamic keywords and various per-atom attributes, or invoke other computes, fixes, or variables when they are evaluated, so -this is a very general means of generating per-atom quantities to reduce. +this is a very general means of generating per-atom quantities to +reduce. ---------- If the *replace* keyword is used, two indices *vec1* and *vec2* are -specified, where each index ranges from 1 to the number of input values. -The replace keyword can only be used if the *mode* is *min* or *max*\ . -It works as follows. A min/max is computed as usual on the *vec2* -input vector. The index :math:`N` of that value within *vec2* is also stored. -Then, instead of performing a min/max on the *vec1* input vector, the -stored index is used to select the :math:`N`\ th element of the *vec1* vector. +specified, where each index ranges from 1 to the number of input +values. The replace keyword can only be used if the *mode* is *min* +or *max*\ . It works as follows. A min/max is computed as usual on +the *vec2* input vector. The index :math:`N` of that value within +*vec2* is also stored. Then, instead of performing a min/max on the +*vec1* input vector, the stored index is used to select the :math:`N`\ +th element of the *vec1* vector. Thus, for example, if you wish to use this compute to find the bond with maximum stretch, you can do it as follows: @@ -190,6 +199,14 @@ information in this context, the *replace* keywords will extract the atom IDs for the two atoms in the bond of maximum stretch. These atom IDs and the bond stretch will be printed with thermodynamic output. +The *inputs* keyword allows selection of whether all the inputs are +per-atom or local quantities. As noted above, all the inputs must be +the same kind (per-atom or local). Per-atom is the default setting. +If a compute or fix is specified as an input, it must produce per-atom +or local data to match this setting. If it produces both, e.g. for +the :doc:`compute voronoi/atom ` command, then +this keyword selects between them. + ---------- If a single input is specified this compute produces a global scalar @@ -197,34 +214,35 @@ value. If multiple inputs are specified, this compute produces a global vector of values, the length of which is equal to the number of inputs specified. -As discussed below, for the *sum*, *sumabs*, and *sumsq* modes, the value(s) -produced by this compute are all "extensive", meaning their value -scales linearly with the number of atoms involved. If normalized -values are desired, this compute can be accessed by the +As discussed below, for the *sum*, *sumabs*, and *sumsq* modes, the +value(s) produced by this compute are all "extensive", meaning their +value scales linearly with the number of atoms involved. If +normalized values are desired, this compute can be accessed by the :doc:`thermo_style custom ` command with -:doc:`thermo_modify norm yes ` set as an option. -Or it can be accessed by a -:doc:`variable ` that divides by the appropriate atom count. +:doc:`thermo_modify norm yes ` set as an option. Or it +can be accessed by a :doc:`variable ` that divides by the +appropriate atom count. ---------- Output info """"""""""" -This compute calculates a global scalar if a single input value is specified -or a global vector of length :math:`N`, where :math:`N` is the number of -inputs, and which can be accessed by indices 1 to :math:`N`. These values can -be used by any command that uses global scalar or vector values from a -compute as input. See the :doc:`Howto output ` doc page -for an overview of LAMMPS output options. +This compute calculates a global scalar if a single input value is +specified or a global vector of length :math:`N`, where :math:`N` is +the number of inputs, and which can be accessed by indices 1 to +:math:`N`. These values can be used by any command that uses global +scalar or vector values from a compute as input. See the :doc:`Howto +output ` doc page for an overview of LAMMPS output +options. All the scalar or vector values calculated by this compute are "intensive", except when the *sum*, *sumabs*, or *sumsq* modes are used on per-atom or local vectors, in which case the calculated values are "extensive". -The scalar or vector values will be in whatever :doc:`units ` the -quantities being reduced are in. +The scalar or vector values will be in whatever :doc:`units ` +the quantities being reduced are in. Restrictions """""""""""" @@ -238,4 +256,4 @@ Related commands Default """"""" -none +The default value for the *inputs* keyword is peratom. diff --git a/doc/src/fix_rigid.rst b/doc/src/fix_rigid.rst index 89759da817..a50e215681 100644 --- a/doc/src/fix_rigid.rst +++ b/doc/src/fix_rigid.rst @@ -843,7 +843,7 @@ stress/atom ` commands. The former can be accessed by :doc:`thermodynamic output `. The default setting for this fix is :doc:`fix_modify virial yes `. -All of the *rigid* styles (not the *rigid/small* styles) compute a +All of the *rigid* styles (but not the *rigid/small* styles) compute a global array of values which can be accessed by various :doc:`output commands `. Similar information about the bodies defined by the *rigid/small* styles can be accessed via the @@ -887,7 +887,8 @@ Restrictions """""""""""" These fixes are all part of the RIGID package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` page for more info. +LAMMPS was built with that package. See the :doc:`Build package +` page for more info. Assigning a temperature via the :doc:`velocity create ` command to a system with :doc:`rigid bodies ` may not have diff --git a/src/compute_reduce.cpp b/src/compute_reduce.cpp index 6b27498eb7..8565ddb1c9 100644 --- a/src/compute_reduce.cpp +++ b/src/compute_reduce.cpp @@ -31,12 +31,16 @@ using namespace LAMMPS_NS; +enum{UNDECIDED,PERATOM,LOCAL}; // same as in ComputeReduceRegion + #define BIG 1.0e20 //---------------------------------------------------------------- + void abs_max(void *in, void *inout, int * /*len*/, MPI_Datatype * /*type*/) { // r is the already reduced value, n is the new value + double n = std::fabs(*(double *) in), r = *(double *) inout; double m; @@ -47,9 +51,11 @@ void abs_max(void *in, void *inout, int * /*len*/, MPI_Datatype * /*type*/) } *(double *) inout = m; } + void abs_min(void *in, void *inout, int * /*len*/, MPI_Datatype * /*type*/) { // r is the already reduced value, n is the new value + double n = std::fabs(*(double *) in), r = *(double *) inout; double m; @@ -68,6 +74,7 @@ ComputeReduce::ComputeReduce(LAMMPS *lmp, int narg, char **arg) : owner(nullptr), idregion(nullptr), region(nullptr), varatom(nullptr) { int iarg = 0; + if (strcmp(style, "reduce") == 0) { if (narg < 5) utils::missing_cmd_args(FLERR, "compute reduce", error); iarg = 3; @@ -128,42 +135,52 @@ ComputeReduce::ComputeReduce(LAMMPS *lmp, int narg, char **arg) : // parse values + input_mode = UNDECIDED; + values.clear(); nvalues = 0; for (int iarg = 0; iarg < nargnew; ++iarg) { value_t val; val.id = ""; - val.flavor = 0; val.val.c = nullptr; if (strcmp(arg[iarg], "x") == 0) { + input_mode = PERATOM; val.which = ArgInfo::X; val.argindex = 0; } else if (strcmp(arg[iarg], "y") == 0) { + input_mode = PERATOM; val.which = ArgInfo::X; val.argindex = 1; } else if (strcmp(arg[iarg], "z") == 0) { + input_mode = PERATOM; val.which = ArgInfo::X; val.argindex = 2; } else if (strcmp(arg[iarg], "vx") == 0) { + input_mode = PERATOM; val.which = ArgInfo::V; val.argindex = 0; } else if (strcmp(arg[iarg], "vy") == 0) { + input_mode = PERATOM; val.which = ArgInfo::V; val.argindex = 1; } else if (strcmp(arg[iarg], "vz") == 0) { + input_mode = PERATOM; val.which = ArgInfo::V; val.argindex = 2; } else if (strcmp(arg[iarg], "fx") == 0) { + input_mode = PERATOM; val.which = ArgInfo::F; val.argindex = 0; } else if (strcmp(arg[iarg], "fy") == 0) { + input_mode = PERATOM; val.which = ArgInfo::F; val.argindex = 1; } else if (strcmp(arg[iarg], "fz") == 0) { + input_mode = PERATOM; val.which = ArgInfo::F; val.argindex = 2; @@ -207,6 +224,14 @@ ComputeReduce::ComputeReduce(LAMMPS *lmp, int narg, char **arg) : error->all(FLERR, "Compute {} replace column already used for another replacement"); replace[col1] = col2; iarg += 2; + } else if (strcmp(arg[iarg], "inputs") == 0) { + if (iarg + 2 > narg) utils::missing_cmd_args(FLERR, mycmd + " inputs", error); + if (strcmp(arg[iarg+1], "peratom") == 0) input_mode = PERATOM; + else if (strcmp(arg[iarg+1], "local") == 0) { + if (input_mode == PERATOM) + error->all(FLERR,"Compute {} inputs must be all peratom or all local"); + input_mode = LOCAL; + } } else error->all(FLERR, "Unknown compute {} keyword: {}", style, arg[iarg]); } @@ -231,66 +256,64 @@ ComputeReduce::ComputeReduce(LAMMPS *lmp, int narg, char **arg) : // setup and error check for (auto &val : values) { - if (val.which == ArgInfo::X || val.which == ArgInfo::V || val.which == ArgInfo::F) - val.flavor = PERATOM; - - else if (val.which == ArgInfo::COMPUTE) { + if (val.which == ArgInfo::COMPUTE) { val.val.c = modify->get_compute_by_id(val.id); if (!val.val.c) error->all(FLERR, "Compute ID {} for compute {} does not exist", val.id, style); - if (val.val.c->peratom_flag) { - val.flavor = PERATOM; + + if (input_mode == PERATOM) { + if (!val.val.c->peratom_flag) + error->all(FLERR, "Compute {} compute {} does not calculate per-atom values", style, val.id); if (val.argindex == 0 && val.val.c->size_peratom_cols != 0) - error->all(FLERR, "Compute {} compute {} does not calculate a per-atom vector", style, - val.id); + error->all(FLERR, "Compute {} compute {} does not calculate a per-atom vector", style, val.id); if (val.argindex && val.val.c->size_peratom_cols == 0) - error->all(FLERR, "Compute {} compute {} does not calculate a per-atom array", style, - val.id); + error->all(FLERR, "Compute {} compute {} does not calculate a per-atom array", style, val.id); if (val.argindex && val.argindex > val.val.c->size_peratom_cols) error->all(FLERR, "Compute {} compute {} array is accessed out-of-range", style, val.id); - } else if (val.val.c->local_flag) { - val.flavor = LOCAL; + + } else if (input_mode == LOCAL) { + if (!val.val.c->peratom_flag) + error->all(FLERR, "Compute {} compute {} does not calculate local values", style, val.id); if (val.argindex == 0 && val.val.c->size_local_cols != 0) - error->all(FLERR, "Compute {} compute {} does not calculate a local vector", style, - val.id); + error->all(FLERR, "Compute {} compute {} does not calculate a local vector", style, val.id); if (val.argindex && val.val.c->size_local_cols == 0) - error->all(FLERR, "Compute {} compute {} does not calculate a local array", style, - val.id); + error->all(FLERR, "Compute {} compute {} does not calculate a local array", style, val.id); if (val.argindex && val.argindex > val.val.c->size_local_cols) error->all(FLERR, "Compute {} compute {} array is accessed out-of-range", style, val.id); - } else - error->all(FLERR, "Compute {} compute {} calculates global values", style, val.id); + } } else if (val.which == ArgInfo::FIX) { val.val.f = modify->get_fix_by_id(val.id); if (!val.val.f) error->all(FLERR, "Fix ID {} for compute {} does not exist", val.id, style); - if (val.val.f->peratom_flag) { - val.flavor = PERATOM; + + if (input_mode == PERATOM) { + if (!val.val.f->peratom_flag) + error->all(FLERR, "Compute {} fix {} does not calculate per-atom values", style, val.id); if (val.argindex == 0 && (val.val.f->size_peratom_cols != 0)) - error->all(FLERR, "Compute {} fix {} does not calculate a per-atom vector", style, - val.id); + error->all(FLERR, "Compute {} fix {} does not calculate a per-atom vector", style, val.id); if (val.argindex && (val.val.f->size_peratom_cols == 0)) error->all(FLERR, "Compute {} fix {} does not calculate a per-atom array", style, val.id); if (val.argindex && (val.argindex > val.val.f->size_peratom_cols)) error->all(FLERR, "Compute {} fix {} array is accessed out-of-range", style, val.id); - } else if (val.val.f->local_flag) { - val.flavor = LOCAL; + + } else if (input_mode == LOCAL) { + if (!val.val.f->local_flag) + error->all(FLERR, "Compute {} fix {} does not calculate local values", style, val.id); if (val.argindex == 0 && (val.val.f->size_local_cols != 0)) error->all(FLERR, "Compute {} fix {} does not calculate a local vector", style, val.id); if (val.argindex && (val.val.f->size_local_cols == 0)) error->all(FLERR, "Compute {} fix {} does not calculate a local array", style, val.id); if (val.argindex && (val.argindex > val.val.f->size_local_cols)) error->all(FLERR, "Compute {} fix {} array is accessed out-of-range", style, val.id); - } else - error->all(FLERR, "Compute {} fix {} calculates global values", style, val.id); + } } else if (val.which == ArgInfo::VARIABLE) { + if (input_mode == LOCAL) error->all(FLERR,"Compute {} inputs must be all local"); val.val.v = input->variable->find(val.id.c_str()); if (val.val.v < 0) error->all(FLERR, "Variable name {} for compute {} does not exist", val.id, style); if (input->variable->atomstyle(val.val.v) == 0) error->all(FLERR, "Compute {} variable {} is not atom-style variable", style, val.id); - val.flavor = PERATOM; } } @@ -512,7 +535,7 @@ double ComputeReduce::compute_one(int m, int flag) } else if (val.which == ArgInfo::COMPUTE) { - if (val.flavor == PERATOM) { + if (input_mode == PERATOM) { if (!(val.val.c->invoked_flag & Compute::INVOKED_PERATOM)) { val.val.c->compute_peratom(); val.val.c->invoked_flag |= Compute::INVOKED_PERATOM; @@ -537,7 +560,7 @@ double ComputeReduce::compute_one(int m, int flag) one = carray_atom[flag][aidxm1]; } - } else if (val.flavor == LOCAL) { + } else if (input_mode == LOCAL) { if (!(val.val.c->invoked_flag & Compute::INVOKED_LOCAL)) { val.val.c->compute_local(); val.val.c->invoked_flag |= Compute::INVOKED_LOCAL; @@ -567,7 +590,7 @@ double ComputeReduce::compute_one(int m, int flag) if (update->ntimestep % val.val.f->peratom_freq) error->all(FLERR, "Fix {} used in compute {} not computed at compatible time", val.id, style); - if (val.flavor == PERATOM) { + if (input_mode == PERATOM) { if (aidx == 0) { double *fix_vector = val.val.f->vector_atom; if (flag < 0) { @@ -585,7 +608,7 @@ double ComputeReduce::compute_one(int m, int flag) one = fix_array[flag][aidxm1]; } - } else if (val.flavor == LOCAL) { + } else if (input_mode == LOCAL) { if (aidx == 0) { double *fix_vector = val.val.f->vector_local; int n = val.val.f->size_local_rows; @@ -632,18 +655,18 @@ bigint ComputeReduce::count(int m) if ((val.which == ArgInfo::X) || (val.which == ArgInfo::V) || (val.which == ArgInfo::F)) return group->count(igroup); else if (val.which == ArgInfo::COMPUTE) { - if (val.flavor == PERATOM) { + if (input_mode == PERATOM) { return group->count(igroup); - } else if (val.flavor == LOCAL) { + } else if (input_mode == LOCAL) { bigint ncount = val.val.c->size_local_rows; bigint ncountall; MPI_Allreduce(&ncount, &ncountall, 1, MPI_LMP_BIGINT, MPI_SUM, world); return ncountall; } } else if (val.which == ArgInfo::FIX) { - if (val.flavor == PERATOM) { + if (input_mode == PERATOM) { return group->count(igroup); - } else if (val.flavor == LOCAL) { + } else if (input_mode == LOCAL) { bigint ncount = val.val.f->size_local_rows; bigint ncountall; MPI_Allreduce(&ncount, &ncountall, 1, MPI_LMP_BIGINT, MPI_SUM, world); diff --git a/src/compute_reduce.h b/src/compute_reduce.h index f8f73cb17a..f8b652e00c 100644 --- a/src/compute_reduce.h +++ b/src/compute_reduce.h @@ -37,12 +37,11 @@ class ComputeReduce : public Compute { double memory_usage() override; protected: - int mode, nvalues; + int mode, nvalues, input_mode; struct value_t { int which; int argindex; std::string id; - int flavor; union { class Compute *c; class Fix *f; diff --git a/src/compute_reduce_region.cpp b/src/compute_reduce_region.cpp index efce00ff66..2f5a3de675 100644 --- a/src/compute_reduce_region.cpp +++ b/src/compute_reduce_region.cpp @@ -26,6 +26,8 @@ using namespace LAMMPS_NS; +enum{UNDECIDED,PERATOM,LOCAL}; // same as in ComputeReduce + static constexpr double BIG = 1.0e20; /* ---------------------------------------------------------------------- */ @@ -97,7 +99,7 @@ double ComputeReduceRegion::compute_one(int m, int flag) // invoke compute if not previously invoked } else if (val.which == ArgInfo::COMPUTE) { - if (val.flavor == PERATOM) { + if (input_mode == PERATOM) { if (!(val.val.c->invoked_flag & Compute::INVOKED_PERATOM)) { val.val.c->compute_peratom(); val.val.c->invoked_flag |= Compute::INVOKED_PERATOM; @@ -122,7 +124,7 @@ double ComputeReduceRegion::compute_one(int m, int flag) one = compute_array[flag][aidxm1]; } - } else if (val.flavor == LOCAL) { + } else if (input_mode == LOCAL) { if (!(val.val.c->invoked_flag & Compute::INVOKED_LOCAL)) { val.val.c->compute_local(); val.val.c->invoked_flag |= Compute::INVOKED_LOCAL; @@ -151,7 +153,7 @@ double ComputeReduceRegion::compute_one(int m, int flag) if (update->ntimestep % val.val.f->peratom_freq) error->all(FLERR, "Fix {} used in compute {} not computed at compatible time", val.id, style); - if (val.flavor == PERATOM) { + if (input_mode == PERATOM) { if (aidx == 0) { double *fix_vector = val.val.f->vector_atom; if (flag < 0) { @@ -171,7 +173,7 @@ double ComputeReduceRegion::compute_one(int m, int flag) one = fix_array[flag][aidxm1]; } - } else if (val.flavor == LOCAL) { + } else if (input_mode == LOCAL) { if (aidx == 0) { double *fix_vector = val.val.f->vector_local; if (flag < 0) @@ -219,18 +221,18 @@ bigint ComputeReduceRegion::count(int m) if (val.which == ArgInfo::X || val.which == ArgInfo::V || val.which == ArgInfo::F) return group->count(igroup, region); else if (val.which == ArgInfo::COMPUTE) { - if (val.flavor == PERATOM) { + if (input_mode == PERATOM) { return group->count(igroup, region); - } else if (val.flavor == LOCAL) { + } else if (input_mode == LOCAL) { bigint ncount = val.val.c->size_local_rows; bigint ncountall; MPI_Allreduce(&ncount, &ncountall, 1, MPI_DOUBLE, MPI_SUM, world); return ncountall; } } else if (val.which == ArgInfo::FIX) { - if (val.flavor == PERATOM) { + if (input_mode == PERATOM) { return group->count(igroup, region); - } else if (val.flavor == LOCAL) { + } else if (input_mode == LOCAL) { bigint ncount = val.val.f->size_local_rows; bigint ncountall; MPI_Allreduce(&ncount, &ncountall, 1, MPI_DOUBLE, MPI_SUM, world); From f2901827e6cc74bdacfe8cfb06d1ba62322ed007 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Thu, 17 Aug 2023 17:25:27 -0600 Subject: [PATCH 045/219] updates to variable doc page to clarify compute/fix options --- doc/src/compute.rst | 4 +- doc/src/thermo_style.rst | 53 +++++----- doc/src/variable.rst | 218 +++++++++++++++++++++------------------ 3 files changed, 148 insertions(+), 127 deletions(-) diff --git a/doc/src/compute.rst b/doc/src/compute.rst index 317efa4f41..226dc6373b 100644 --- a/doc/src/compute.rst +++ b/doc/src/compute.rst @@ -43,8 +43,8 @@ underscores. ---------- -Computes calculate one or more of four styles of quantities: global, -per-atom, local, or per-atom. A global quantity is one or more +Computes calculate and store any of four styles of quantities: global, +per-atom, local, or per-grid. A global quantity is one or more system-wide values, e.g. the temperature of the system. A per-atom quantity is one or more values per atom, e.g. the kinetic energy of each atom. Per-atom values are set to 0.0 for atoms not in the diff --git a/doc/src/thermo_style.rst b/doc/src/thermo_style.rst index 63ad59e553..c3c607a479 100644 --- a/doc/src/thermo_style.rst +++ b/doc/src/thermo_style.rst @@ -385,19 +385,20 @@ creates a global vector with 6 values. The *c_ID* and *c_ID[I]* and *c_ID[I][J]* keywords allow global values calculated by a compute to be output. As discussed on the :doc:`compute ` doc page, computes can calculate global, -per-atom, or local values. Only global values can be referenced by -this command. However, per-atom compute values for an individual atom -can be referenced in a :doc:`variable ` and the variable -referenced by thermo_style custom, as discussed below. See the -discussion above for how the I in *c_ID[I]* can be specified with a -wildcard asterisk to effectively specify multiple values from a global -compute vector. +per-atom, local, and per-grid values. Only global values can be +referenced by this command. However, per-atom compute values for an +individual atom can be referenced in a :doc:`equal-style variable +` and the variable referenced by thermo_style custom, as +discussed below. See the discussion above for how the I in *c_ID[I]* +can be specified with a wildcard asterisk to effectively specify +multiple values from a global compute vector. The ID in the keyword should be replaced by the actual ID of a compute that has been defined elsewhere in the input script. See the -:doc:`compute ` command for details. If the compute calculates -a global scalar, vector, or array, then the keyword formats with 0, 1, -or 2 brackets will reference a scalar value from the compute. +:doc:`compute ` command for details. If the compute +calculates a global scalar, vector, or array, then the keyword formats +with 0, 1, or 2 brackets will reference a scalar value from the +compute. Note that some computes calculate "intensive" global quantities like temperature; others calculate "extensive" global quantities like @@ -410,13 +411,14 @@ norm ` option being used. The *f_ID* and *f_ID[I]* and *f_ID[I][J]* keywords allow global values calculated by a fix to be output. As discussed on the :doc:`fix -` doc page, fixes can calculate global, per-atom, or local -values. Only global values can be referenced by this command. -However, per-atom fix values can be referenced for an individual atom -in a :doc:`variable ` and the variable referenced by -thermo_style custom, as discussed below. See the discussion above for -how the I in *f_ID[I]* can be specified with a wildcard asterisk to -effectively specify multiple values from a global fix vector. +` doc page, fixes can calculate global, per-atom, local, and +per-grid values. Only global values can be referenced by this +command. However, per-atom fix values can be referenced for an +individual atom in a :doc:`equal-style variable ` and the +variable referenced by thermo_style custom, as discussed below. See +the discussion above for how the I in *f_ID[I]* can be specified with +a wildcard asterisk to effectively specify multiple values from a +global fix vector. The ID in the keyword should be replaced by the actual ID of a fix that has been defined elsewhere in the input script. See the @@ -438,14 +440,15 @@ output. The name in the keyword should be replaced by the variable name that has been defined elsewhere in the input script. Only equal-style and vector-style variables can be referenced; the latter requires a bracketed term to specify the Ith element of the vector -calculated by the variable. However, an atom-style variable can be -referenced for an individual atom by an equal-style variable and that -variable referenced. See the :doc:`variable ` command for -details. Variables of style *equal* and *vector* and *atom* define a -formula which can reference per-atom properties or thermodynamic -keywords, or they can invoke other computes, fixes, or variables when -evaluated, so this is a very general means of creating thermodynamic -output. +calculated by the variable. However, an equal-style variable can use +an atom-style variable in its formula indexed by the ID of an +individual atom. This is a way to output a speciic atom's per-atom +coordinates or other per-atom properties in thermo output. See the +:doc:`variable ` command for details. Note that variables +of style *equal* and *vector* and *atom* define a formula which can +reference per-atom properties or thermodynamic keywords, or they can +invoke other computes, fixes, or variables when evaluated, so this is +a very general means of creating thermodynamic output. Note that equal-style and vector-style variables are assumed to produce "intensive" global quantities, which are thus printed as-is, diff --git a/doc/src/variable.rst b/doc/src/variable.rst index 28c0d29799..38e423b632 100644 --- a/doc/src/variable.rst +++ b/doc/src/variable.rst @@ -550,12 +550,11 @@ variables. Most of the formula elements produce a scalar value. Some produce a global or per-atom vector of values. Global vectors can be produced by computes or fixes or by other vector-style variables. Per-atom -vectors are produced by atom vectors, compute references that -represent a per-atom vector, fix references that represent a per-atom -vector, and variables that are atom-style variables. Math functions -that operate on scalar values produce a scalar value; math function -that operate on global or per-atom vectors do so element-by-element -and produce a global or per-atom vector. +vectors are produced by atom vectors, computes or fixes which output a +per-atom vector or array, and variables that are atom-style variables. +Math functions that operate on scalar values produce a scalar value; +math function that operate on global or per-atom vectors do so +element-by-element and produce a global or per-atom vector. A formula for equal-style variables cannot use any formula element that produces a global or per-atom vector. A formula for a @@ -564,12 +563,13 @@ scalar value or a global vector value, but cannot use a formula element that produces a per-atom vector. A formula for an atom-style variable can use formula elements that produce either a scalar value or a per-atom vector, but not one that produces a global vector. + Atom-style variables are evaluated by other commands that define a -:doc:`group ` on which they operate, e.g. a :doc:`dump ` or -:doc:`compute ` or :doc:`fix ` command. When they invoke -the atom-style variable, only atoms in the group are included in the -formula evaluation. The variable evaluates to 0.0 for atoms not in -the group. +:doc:`group ` on which they operate, e.g. a :doc:`dump ` +or :doc:`compute ` or :doc:`fix ` command. When they +invoke the atom-style variable, only atoms in the group are included +in the formula evaluation. The variable evaluates to 0.0 for atoms +not in the group. ---------- @@ -1138,69 +1138,74 @@ only defined if an :doc:`atom_style ` is being used that defines molecule IDs. Note that many other atom attributes can be used as inputs to a -variable by using the :doc:`compute property/atom ` command and then specifying -a quantity from that compute. +variable by using the :doc:`compute property/atom +` command and then specifying a quantity from +that compute. ---------- Compute References ------------------ -Compute references access quantities calculated by a -:doc:`compute `. The ID in the reference should be replaced by -the ID of a compute defined elsewhere in the input script. As -discussed in the page for the :doc:`compute ` command, -computes can produce global, per-atom, or local values. Only global -and per-atom values can be used in a variable. Computes can also -produce a scalar, vector, or array. +Compute references access quantities calculated by a :doc:`compute +`. The ID in the reference should be replaced by the ID of a +compute defined elsewhere in the input script. -An equal-style variable can only use scalar values, which means a -global scalar, or an element of a global or per-atom vector or array. -A vector-style variable can use scalar values or a global vector of -values, or a column of a global array of values. Atom-style variables -can use global scalar values. They can also use per-atom vector -values, or a column of a per-atom array. See the doc pages for -individual computes to see what kind of values they produce. +As discussed on the page for the :doc:`compute ` command, +computes can produce global, per-atom, local, and per-grid values. +Only global and per-atom values can be used in a variable. Computes +can also produce scalars (global only), vectors, and arrays. See the +doc pages for individual computes to see what different kinds of data +they produce. -Examples of different kinds of compute references are as follows. -There is typically no ambiguity (see exception below) as to what a -reference means, since computes only produce either global or per-atom -quantities, never both. +An equal-style variable can only use scalar values, either from global +or per-atom data. In the case of per-atom data, this would be a value +for a specific atom. -+-------------+-------------------------------------------------------------------------------------------------------+ -| c_ID | global scalar, or per-atom vector | -+-------------+-------------------------------------------------------------------------------------------------------+ -| c_ID[I] | Ith element of global vector, or atom I's value in per-atom vector, or Ith column from per-atom array | -+-------------+-------------------------------------------------------------------------------------------------------+ -| c_ID[I][J] | I,J element of global array, or atom I's Jth value in per-atom array | -+-------------+-------------------------------------------------------------------------------------------------------+ +A vector-style variable can use scalar values (same as for equal-style +variables), or global vectors of values. The latter can also be a +column of a global array. -For I and J indices, integers can be specified or a variable name, -specified as v_name, where name is the name of the variable. The -rules for this syntax are the same as for the "Atom Values and -Vectors" discussion above. +Atom-style variables can use scalar values (same as for equal-style +varaibles), or per-atom vectors of values. The latter can also be a +column of a per-atom array. -One source of ambiguity for compute references is when a vector-style -variable refers to a compute that produces both a global scalar and a -global vector. Consider a compute with ID "foo" that does this, -referenced as follows by variable "a", where "myVec" is another -vector-style variable: +The various allowed compute references in the variable formulas for +equal-, vector-, and atom-style variables are listed in the following +table: -.. code-block:: LAMMPS ++--------+------------+--------------------------------------------+ +| equal | c_ID | global scalar | +| equal | c_ID[I] | element of global vector | +| equal | c_ID[I][J] | element of global array | +| equal | C_ID[I] | element of per-atom vector, I = ID of atom | +| equal | C_ID{i}[J] | element of per-atom array, I = ID of atom | ++--------+------------+--------------------------------------------| +| vector | c_ID | global vector | +| vector | c_ID[I] | column of global array | +---------+------------+--------------------------------------------+ +| atom | c_ID | per-atom vector | +| atom | c_ID[I] | column of per-atom array | ++--------+------------+--------------------------------------------+ - variable a vector c_foo*v_myVec +Note that if an equal-style variable formula wishes to access per-atom +data from a compute, it must use capital "C" as the ID prefix and not +lower-case "c". -The reference "c_foo" could refer to either the global scalar or -global vector produced by compute "foo". In this case, "c_foo" will -always refer to the global scalar, and "C_foo" can be used to -reference the global vector. Similarly if the compute produces both a -global vector and global array, then "c_foo[I]" will always refer to -an element of the global vector, and "C_foo[I]" can be used to -reference the Ith column of the global array. +Also note that if a vector- or atom-style variable formula needs to +access a scalar value from a compute (i.e. the 5 kinds of values in +the first 5 lines of the table), it can not do so directly. Instead, +it can use a reference to an equal-style variable which stores the +scalar value from the compute. -Note that if a variable containing a compute is evaluated directly in -an input script (not during a run), then the values accessed by the -compute must be current. See the discussion below about "Variable +The I and J indices in these compute references can be integers or can +be a variable name, specified as v_name, where name is the name of the +variable. The rules for this syntax are the same as for indices in +the "Atom Values and Vectors" discussion above. + +If a variable containing a compute is evaluated directly in an input +script (not during a run), then the values accessed by the compute +should be current. See the discussion below about "Variable Accuracy". ---------- @@ -1208,51 +1213,60 @@ Accuracy". Fix References -------------- -Fix references access quantities calculated by a :doc:`fix `. +Fix references access quantities calculated by a :doc:`fix `. The ID in the reference should be replaced by the ID of a fix defined -elsewhere in the input script. As discussed in the page for the -:doc:`fix ` command, fixes can produce global, per-atom, or local -values. Only global and per-atom values can be used in a variable. -Fixes can also produce a scalar, vector, or array. An equal-style -variable can only use scalar values, which means a global scalar, or -an element of a global or per-atom vector or array. Atom-style -variables can use the same scalar values. They can also use per-atom -vector values. A vector value can be a per-atom vector itself, or a -column of an per-atom array. See the doc pages for individual fixes -to see what kind of values they produce. +elsewhere in the input script. -The different kinds of fix references are exactly the same as the -compute references listed in the above table, where "c\_" is replaced -by "f\_". Again, there is typically no ambiguity (see exception below) -as to what a reference means, since fixes only produce either global -or per-atom quantities, never both. +As discussed on the page for the :doc:`fix ` command, fixes can +produce global, per-atom, local, and per-grid values. Only global and +per-atom values can be used in a variable. Fixes can also produce +scalars (global only), vectors, and arrays. See the doc pages for +individual fixes to see what different kinds of data they produce. -+-------------+-------------------------------------------------------------------------------------------------------+ -| f_ID | global scalar, or per-atom vector | -+-------------+-------------------------------------------------------------------------------------------------------+ -| f_ID[I] | Ith element of global vector, or atom I's value in per-atom vector, or Ith column from per-atom array | -+-------------+-------------------------------------------------------------------------------------------------------+ -| f_ID[I][J] | I,J element of global array, or atom I's Jth value in per-atom array | -+-------------+-------------------------------------------------------------------------------------------------------+ +An equal-style variable can only use scalar values, either from global +or per-atom data. In the case of per-atom data, this would be a value +for a specific atom. -For I and J indices, integers can be specified or a variable name, -specified as v_name, where name is the name of the variable. The -rules for this syntax are the same as for the "Atom Values and -Vectors" discussion above. +A vector-style variable can use scalar values (same as for equal-style +variables), or global vectors of values. The latter can also be a +column of a global array. -One source of ambiguity for fix references is the same ambiguity -discussed for compute references above. Namely when a vector-style -variable refers to a fix that produces both a global scalar and a -global vector. The solution is the same as for compute references. -For a fix with ID "foo", "f_foo" will always refer to the global -scalar, and "F_foo" can be used to reference the global vector. And -similarly for distinguishing between a fix's global vector versus -global array with "f_foo[I]" versus "F_foo[I]". +Atom-style variables can use scalar values (same as for equal-style +varaibles), or per-atom vectors of values. The latter can also be a +column of a per-atom array. -Note that if a variable containing a fix is evaluated directly in an -input script (not during a run), then the values accessed by the fix -should be current. See the discussion below about "Variable -Accuracy". +The various allowed fix references in the variable formulas for +equal-, vector-, and atom-style variables are listed in the following +table: + ++--------+------------+--------------------------------------------+ +| equal | f_ID | global scalar | +| equal | f_ID[I] | element of global vector | +| equal | f_ID[I][J] | element of global array | +| equal | F_ID[I] | element of per-atom vector, I = ID of atom | +| equal | F_ID{i}[J] | element of per-atom array, I = ID of atom | ++--------+------------+--------------------------------------------| +| vector | f_ID | global vector | +| vector | f_ID[I] | column of global array | +---------+------------+--------------------------------------------+ +| atom | f_ID | per-atom vector | +| atom | f_ID[I] | column of per-atom array | ++--------+------------+--------------------------------------------+ + +Note that if an equal-style variable formula wishes to access per-atom +data from a fix, it must use capital "F" as the ID prefix and not +lower-case "f". + +Also note that if a vector- or atom-style variable formula needs to +access a scalar value from a fix (i.e. the 5 kinds of values in the +first 5 lines of the table), it can not do so directly. Instead, it +can use a reference to an equal-style variable which stores the scalar +value from the fix. + +The I and J indices in these fix references can be integers or can be +a variable name, specified as v_name, where name is the name of the +variable. The rules for this syntax are the same as for indices in +the "Atom Values and Vectors" discussion above. Note that some fixes only generate quantities on certain timesteps. If a variable attempts to access the fix on non-allowed timesteps, an @@ -1260,6 +1274,10 @@ error is generated. For example, the :doc:`fix ave/time ` command may only generate averaged quantities every 100 steps. See the doc pages for individual fix commands for details. +If a variable containing a fix is evaluated directly in an input +script (not during a run), then the values accessed by the fix should +be current. See the discussion below about "Variable Accuracy". + ---------- Variable References @@ -1312,8 +1330,8 @@ produce only a global scalar or global vector or per-atom vector. For the I index, an integer can be specified or a variable name, specified as v_name, where name is the name of the variable. The -rules for this syntax are the same as for the "Atom Values and -Vectors" discussion above. +rules for this syntax are the same as for indices in the "Atom Values +and Vectors" discussion above. ---------- From 95e9e6549f6a2658e7f361c4e40616478f274856 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Fri, 18 Aug 2023 09:28:58 -0600 Subject: [PATCH 046/219] simply variable.cpp --- src/variable.cpp | 347 ++++++++++++++++++++++++----------------------- 1 file changed, 180 insertions(+), 167 deletions(-) diff --git a/src/variable.cpp b/src/variable.cpp index cf2e5c3b6f..5013f3ce55 100644 --- a/src/variable.cpp +++ b/src/variable.cpp @@ -1469,8 +1469,7 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) if (domain->box_exist == 0) print_var_error(FLERR,"Variable evaluation before simulation box is defined",ivar); - // uppercase used to force access of - // global vector vs global scalar, and global array vs global vector + // uppercase used to access of peratom data by equal-style var int lowercase = 1; if (word[0] == 'C') lowercase = 0; @@ -1479,7 +1478,6 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) if (!compute) print_var_error(FLERR,fmt::format("Invalid compute ID '{}' in variable formula", word+2),ivar); - // parse zero or one or two trailing brackets // point i beyond last bracket // nbracket = # of bracket pairs @@ -1501,107 +1499,203 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) } } - // c_ID = scalar from global scalar, must be lowercase + // equal-style variable is being evaluated - if (nbracket == 0 && compute->scalar_flag && lowercase) { + if (style[ivar] == EQUAL) { + + // c_ID = scalar from global scalar - if (!compute->is_initialized()) - print_var_error(FLERR,"Variable formula compute cannot be invoked before " - "initialization by a run",ivar); - if (!(compute->invoked_flag & Compute::INVOKED_SCALAR)) { - compute->compute_scalar(); - compute->invoked_flag |= Compute::INVOKED_SCALAR; - } + if (lowercase && nbracket == 0) { - value1 = compute->scalar; - if (tree) { - auto newtree = new Tree(); - newtree->type = VALUE; - newtree->value = value1; - treestack[ntreestack++] = newtree; - } else argstack[nargstack++] = value1; + if (!compute->scalar_flag) + print_var_error(FLERR,"Mismatched compute in variable formula",ivar); - // c_ID[i] = scalar from global vector, must be lowercase + if (!compute->is_initialized()) + print_var_error(FLERR,"Variable formula compute cannot be invoked before " + "initialization by a run",ivar); + if (!(compute->invoked_flag & Compute::INVOKED_SCALAR)) { + compute->compute_scalar(); + compute->invoked_flag |= Compute::INVOKED_SCALAR; + } - } else if (nbracket == 1 && compute->vector_flag && lowercase) { + value1 = compute->scalar; + argstack[nargstack++] = value1; - if (index1 > compute->size_vector && - compute->size_vector_variable == 0) - print_var_error(FLERR,"Variable formula compute vector is accessed out-of-range",ivar,0); - if (!compute->is_initialized()) - print_var_error(FLERR,"Variable formula compute cannot be invoked before " - "initialization by a run",ivar); - if (!(compute->invoked_flag & Compute::INVOKED_VECTOR)) { - compute->compute_vector(); - compute->invoked_flag |= Compute::INVOKED_VECTOR; - } + // c_ID[i] = scalar from global vector + + } else if (lowercase && nbracket == 1) { + + if (!compute->vector_flag) + print_var_error(FLERR,"Mismatched compute in variable formula",ivar); + if (index1 > compute->size_vector && + compute->size_vector_variable == 0) + print_var_error(FLERR,"Variable formula compute vector is accessed out-of-range",ivar,0); + if (!compute->is_initialized()) + print_var_error(FLERR,"Variable formula compute cannot be invoked before " + "initialization by a run",ivar); + if (!(compute->invoked_flag & Compute::INVOKED_VECTOR)) { + compute->compute_vector(); + compute->invoked_flag |= Compute::INVOKED_VECTOR; + } if (compute->size_vector_variable && index1 > compute->size_vector) value1 = 0.0; else value1 = compute->vector[index1-1]; - if (tree) { + argstack[nargstack++] = value1; + + // c_ID[i][j] = scalar from global array + + } else if (lowercase && nbracket == 2) { + + if (!compute->array_flag) + print_var_error(FLERR,"Mismatched compute in variable formula",ivar); + if (index1 > compute->size_array_rows && + compute->size_array_rows_variable == 0) + print_var_error(FLERR,"Variable formula compute array is accessed out-of-range",ivar,0); + if (index2 > compute->size_array_cols) + print_var_error(FLERR,"Variable formula compute array is accessed out-of-range",ivar,0); + if (!compute->is_initialized()) + print_var_error(FLERR,"Variable formula compute cannot be invoked before " + "initialization by a run",ivar); + if (!(compute->invoked_flag & Compute::INVOKED_ARRAY)) { + compute->compute_array(); + compute->invoked_flag |= Compute::INVOKED_ARRAY; + } + + if (compute->size_array_rows_variable && + index1 > compute->size_array_rows) value1 = 0.0; + else value1 = compute->array[index1-1][index2-1]; + argstack[nargstack++] = value1; + + // C_ID[i] = scalar element of per-atom vector + + } else if (!lowercase && nbracket == 1) { + + if (!compute->peratom_flag) + print_var_error(FLERR,"Mismatched compute in variable formula",ivar); + if (compute->size_peratom_cols) + print_var_error(FLERR,"Mismatched compute in variable formula",ivar); + if (!compute->is_initialized()) + print_var_error(FLERR,"Variable formula compute cannot be invoked before " + "initialization by a run",ivar); + if (!(compute->invoked_flag & Compute::INVOKED_PERATOM)) { + compute->compute_peratom(); + compute->invoked_flag |= Compute::INVOKED_PERATOM; + } + + peratom2global(1,nullptr,compute->vector_atom,1,index1,tree, + treestack,ntreestack,argstack,nargstack); + + // C_ID[i][j] = scalar element of per-atom array + + } else if (!lowercase && nbracket == 2) { + + if (!compute->peratom_flag) + print_var_error(FLERR,"Mismatched compute in variable formula",ivar); + if (!compute->size_peratom_cols) + print_var_error(FLERR,"Mismatched compute in variable formula",ivar); + if (index2 > compute->size_peratom_cols) + print_var_error(FLERR,"Variable formula compute array is accessed out-of-range",ivar,0); + if (!compute->is_initialized()) + print_var_error(FLERR,"Variable formula compute cannot be invoked before " + "initialization by a run",ivar); + if (!(compute->invoked_flag & Compute::INVOKED_PERATOM)) { + compute->compute_peratom(); + compute->invoked_flag |= Compute::INVOKED_PERATOM; + } + + if (compute->array_atom) + peratom2global(1,nullptr,&compute->array_atom[0][index2-1], + compute->size_peratom_cols,index1, + tree,treestack,ntreestack,argstack,nargstack); + else + peratom2global(1,nullptr,nullptr,compute->size_peratom_cols,index1, + tree,treestack,ntreestack,argstack,nargstack); + + // no other possibilities for equal-style variable, so error + + } else print_var_error(FLERR,"Mismatched compute in variable formula",ivar); + + // vector-style variable is being evaluated + + } else if (style[ivar] == VECTOR) { + + // c_ID = vector from global vector + + if (lowercase && nbracket == 0) { + + if (!compute->vector_flag) + print_var_error(FLERR,"Mismatched compute in variable formula",ivar); + + // c_ID[i] = vector from global array + + } else if (lowercase && nbracket == 1) { + + if (!compute->array_flag) + print_var_error(FLERR,"Mismatched compute in variable formula",ivar); + + // no other possibilities for vector-style variable, so error + + } else print_var_error(FLERR,"Mismatched compute in variable formula",ivar); + + // atom-style variable is being evaluated + + } else if (style[ivar] == ATOM) { + + // c_ID = vector from per-atom vector + + if (lowercase && nbracket == 0) { + + if (!compute->peratom_flag) + print_var_error(FLERR,"Mismatched compute in variable formula",ivar); + if (compute->size_peratom_cols) + print_var_error(FLERR,"Mismatched compute in variable formula",ivar); + if (!compute->is_initialized()) + print_var_error(FLERR,"Variable formula compute cannot be invoked before " + "initialization by a run",ivar); + if (!(compute->invoked_flag & Compute::INVOKED_PERATOM)) { + compute->compute_peratom(); + compute->invoked_flag |= Compute::INVOKED_PERATOM; + } + auto newtree = new Tree(); - newtree->type = VALUE; - newtree->value = value1; + newtree->type = ATOMARRAY; + newtree->array = compute->vector_atom; + newtree->nstride = 1; treestack[ntreestack++] = newtree; - } else argstack[nargstack++] = value1; + + // c_ID[i] = vector from per-atom array - // c_ID[i][j] = scalar from global array, must be lowercase + } else if (lowercase && nbracket == 1) { - } else if (nbracket == 2 && compute->array_flag && lowercase) { + if (!compute->peratom_flag) + print_var_error(FLERR,"Mismatched compute in variable formula",ivar); + if (!compute->size_peratom_cols) + print_var_error(FLERR,"Mismatched compute in variable formula",ivar); + if (index1 > compute->size_peratom_cols) + print_var_error(FLERR,"Variable formula compute array is accessed out-of-range",ivar,0); + if (!compute->is_initialized()) + print_var_error(FLERR,"Variable formula compute cannot be invoked before " + "initialization by a run",ivar); + if (!(compute->invoked_flag & Compute::INVOKED_PERATOM)) { + compute->compute_peratom(); + compute->invoked_flag |= Compute::INVOKED_PERATOM; + } - if (index1 > compute->size_array_rows && - compute->size_array_rows_variable == 0) - print_var_error(FLERR,"Variable formula compute array is accessed out-of-range",ivar,0); - if (index2 > compute->size_array_cols) - print_var_error(FLERR,"Variable formula compute array is accessed out-of-range",ivar,0); - if (!compute->is_initialized()) - print_var_error(FLERR,"Variable formula compute cannot be invoked before " - "initialization by a run",ivar); - if (!(compute->invoked_flag & Compute::INVOKED_ARRAY)) { - compute->compute_array(); - compute->invoked_flag |= Compute::INVOKED_ARRAY; - } - - if (compute->size_array_rows_variable && - index1 > compute->size_array_rows) value1 = 0.0; - else value1 = compute->array[index1-1][index2-1]; - if (tree) { auto newtree = new Tree(); - newtree->type = VALUE; - newtree->value = value1; + newtree->type = ATOMARRAY; + newtree->array = nullptr; + if (compute->array_atom) + newtree->array = &compute->array_atom[0][index1-1]; + newtree->nstride = compute->size_peratom_cols; treestack[ntreestack++] = newtree; - } else argstack[nargstack++] = value1; - // c_ID = vector from global vector, lowercase or uppercase - - } else if (nbracket == 0 && compute->vector_flag) { - - if (tree == nullptr) - print_var_error(FLERR,"Compute global vector in equal-style variable formula",ivar); - if (treetype == ATOM) - print_var_error(FLERR,"Compute global vector in atom-style variable formula",ivar); - if (compute->size_vector == 0) - print_var_error(FLERR,"Variable formula compute vector is zero length",ivar); - if (!compute->is_initialized()) - print_var_error(FLERR,"Variable formula compute cannot be invoked before " - "initialization by a run",ivar); - if (!(compute->invoked_flag & Compute::INVOKED_VECTOR)) { - compute->compute_vector(); - compute->invoked_flag |= Compute::INVOKED_VECTOR; - } - - auto newtree = new Tree(); - newtree->type = VECTORARRAY; - newtree->array = compute->vector; - newtree->nvector = compute->size_vector; - newtree->nstride = 1; - treestack[ntreestack++] = newtree; - - // c_ID[i] = vector from global array, lowercase or uppercase - - } else if (nbracket == 1 && compute->array_flag) { + // no other possibilities for atom-style variable, so error + + } else print_var_error(FLERR,"Mismatched compute in variable formula",ivar); + } + if (tree == nullptr) print_var_error(FLERR,"Compute global vector in equal-style variable formula",ivar); if (treetype == ATOM) @@ -1623,97 +1717,16 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) newtree->nstride = compute->size_array_cols; treestack[ntreestack++] = newtree; - // c_ID[i] = scalar from per-atom vector - } else if (nbracket == 1 && compute->peratom_flag && - compute->size_peratom_cols == 0) { - if (!compute->is_initialized()) - print_var_error(FLERR,"Variable formula compute cannot be invoked before " - "initialization by a run",ivar); - if (!(compute->invoked_flag & Compute::INVOKED_PERATOM)) { - compute->compute_peratom(); - compute->invoked_flag |= Compute::INVOKED_PERATOM; - } - peratom2global(1,nullptr,compute->vector_atom,1,index1,tree, - treestack,ntreestack,argstack,nargstack); - // c_ID[i][j] = scalar from per-atom array - } else if (nbracket == 2 && compute->peratom_flag && - compute->size_peratom_cols > 0) { - if (index2 > compute->size_peratom_cols) - print_var_error(FLERR,"Variable formula compute array is accessed out-of-range",ivar,0); - if (!compute->is_initialized()) - print_var_error(FLERR,"Variable formula compute cannot be invoked before " - "initialization by a run",ivar); - if (!(compute->invoked_flag & Compute::INVOKED_PERATOM)) { - compute->compute_peratom(); - compute->invoked_flag |= Compute::INVOKED_PERATOM; - } - if (compute->array_atom) - peratom2global(1,nullptr,&compute->array_atom[0][index2-1],compute->size_peratom_cols,index1, - tree,treestack,ntreestack,argstack,nargstack); - else - peratom2global(1,nullptr,nullptr,compute->size_peratom_cols,index1, - tree,treestack,ntreestack,argstack,nargstack); - // c_ID = vector from per-atom vector - - } else if (nbracket == 0 && compute->peratom_flag && - compute->size_peratom_cols == 0) { - - if (tree == nullptr) - print_var_error(FLERR,"Per-atom compute in equal-style variable formula",ivar); - if (treetype == VECTOR) - print_var_error(FLERR,"Per-atom compute in vector-style variable formula",ivar); - if (!compute->is_initialized()) - print_var_error(FLERR,"Variable formula compute cannot be invoked before " - "initialization by a run",ivar); - if (!(compute->invoked_flag & Compute::INVOKED_PERATOM)) { - compute->compute_peratom(); - compute->invoked_flag |= Compute::INVOKED_PERATOM; - } - - auto newtree = new Tree(); - newtree->type = ATOMARRAY; - newtree->array = compute->vector_atom; - newtree->nstride = 1; - treestack[ntreestack++] = newtree; - - // c_ID[i] = vector from per-atom array - - } else if (nbracket == 1 && compute->peratom_flag && - compute->size_peratom_cols > 0) { - - if (tree == nullptr) - print_var_error(FLERR,"Per-atom compute in equal-style variable formula",ivar); - if (treetype == VECTOR) - print_var_error(FLERR,"Per-atom compute in vector-style variable formula",ivar); - if (index1 > compute->size_peratom_cols) - print_var_error(FLERR,"Variable formula compute array is accessed out-of-range",ivar,0); - if (!compute->is_initialized()) - print_var_error(FLERR,"Variable formula compute cannot be invoked before " - "initialization by a run",ivar); - if (!(compute->invoked_flag & Compute::INVOKED_PERATOM)) { - compute->compute_peratom(); - compute->invoked_flag |= Compute::INVOKED_PERATOM; - } - - auto newtree = new Tree(); - newtree->type = ATOMARRAY; - if (compute->array_atom) - newtree->array = &compute->array_atom[0][index1-1]; - newtree->nstride = compute->size_peratom_cols; - treestack[ntreestack++] = newtree; - - } else if (nbracket == 1 && compute->local_flag) { - print_var_error(FLERR,"Cannot access local data via indexing",ivar); - } else print_var_error(FLERR,"Mismatched compute in variable formula",ivar); + // ---------------- // fix // ---------------- From 91d826a5d660e2e00f5a016dfb8db189cbde1985 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Fri, 18 Aug 2023 09:34:46 -0600 Subject: [PATCH 047/219] changed compute section of variable formulas --- src/variable.cpp | 62 +++++++++++++++++++++++++++--------------------- 1 file changed, 35 insertions(+), 27 deletions(-) diff --git a/src/variable.cpp b/src/variable.cpp index 5013f3ce55..a41c12d111 100644 --- a/src/variable.cpp +++ b/src/variable.cpp @@ -1626,6 +1626,22 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) if (!compute->vector_flag) print_var_error(FLERR,"Mismatched compute in variable formula",ivar); + if (compute->size_vector == 0) + print_var_error(FLERR,"Variable formula compute vector is zero length",ivar); + if (!compute->is_initialized()) + print_var_error(FLERR,"Variable formula compute cannot be invoked before " + "initialization by a run",ivar); + if (!(compute->invoked_flag & Compute::INVOKED_VECTOR)) { + compute->compute_vector(); + compute->invoked_flag |= Compute::INVOKED_VECTOR; + } + + auto newtree = new Tree(); + newtree->type = VECTORARRAY; + newtree->array = compute->vector; + newtree->nvector = compute->size_vector; + newtree->nstride = 1; + treestack[ntreestack++] = newtree; // c_ID[i] = vector from global array @@ -1633,6 +1649,24 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) if (!compute->array_flag) print_var_error(FLERR,"Mismatched compute in variable formula",ivar); + if (compute->size_array_rows == 0) + print_var_error(FLERR,"Variable formula compute array is zero length",ivar); + if (index1 > compute->size_array_cols) + print_var_error(FLERR,"Variable formula compute array is accessed out-of-range",ivar,0); + if (!compute->is_initialized()) + print_var_error(FLERR,"Variable formula compute cannot be invoked before " + "initialization by a run",ivar); + if (!(compute->invoked_flag & Compute::INVOKED_ARRAY)) { + compute->compute_array(); + compute->invoked_flag |= Compute::INVOKED_ARRAY; + } + + auto newtree = new Tree(); + newtree->type = VECTORARRAY; + newtree->array = &compute->array[0][index1-1]; + newtree->nvector = compute->size_array_rows; + newtree->nstride = compute->size_array_cols; + treestack[ntreestack++] = newtree; // no other possibilities for vector-style variable, so error @@ -1695,38 +1729,12 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) } else print_var_error(FLERR,"Mismatched compute in variable formula",ivar); } - - if (tree == nullptr) - print_var_error(FLERR,"Compute global vector in equal-style variable formula",ivar); - if (treetype == ATOM) - print_var_error(FLERR,"Compute global vector in atom-style variable formula",ivar); - if (compute->size_array_rows == 0) - print_var_error(FLERR,"Variable formula compute array is zero length",ivar); - if (!compute->is_initialized()) - print_var_error(FLERR,"Variable formula compute cannot be invoked before " - "initialization by a run",ivar); - if (!(compute->invoked_flag & Compute::INVOKED_ARRAY)) { - compute->compute_array(); - compute->invoked_flag |= Compute::INVOKED_ARRAY; - } - - auto newtree = new Tree(); - newtree->type = VECTORARRAY; - newtree->array = &compute->array[0][index1-1]; - newtree->nvector = compute->size_array_rows; - newtree->nstride = compute->size_array_cols; - treestack[ntreestack++] = newtree; - - - - - - + // ---------------- // fix // ---------------- From 6e1529ddff9068529f70e8aa29f16c0e49df36a6 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Fri, 18 Aug 2023 13:18:50 -0600 Subject: [PATCH 048/219] finish changes to variables --- doc/src/variable.rst | 91 +++---- src/variable.cpp | 553 +++++++++++++++++++++++-------------------- 2 files changed, 338 insertions(+), 306 deletions(-) diff --git a/doc/src/variable.rst b/doc/src/variable.rst index 38e423b632..4541de5fa2 100644 --- a/doc/src/variable.rst +++ b/doc/src/variable.rst @@ -1174,19 +1174,19 @@ The various allowed compute references in the variable formulas for equal-, vector-, and atom-style variables are listed in the following table: -+--------+------------+--------------------------------------------+ -| equal | c_ID | global scalar | -| equal | c_ID[I] | element of global vector | -| equal | c_ID[I][J] | element of global array | -| equal | C_ID[I] | element of per-atom vector, I = ID of atom | -| equal | C_ID{i}[J] | element of per-atom array, I = ID of atom | -+--------+------------+--------------------------------------------| -| vector | c_ID | global vector | -| vector | c_ID[I] | column of global array | ----------+------------+--------------------------------------------+ -| atom | c_ID | per-atom vector | -| atom | c_ID[I] | column of per-atom array | -+--------+------------+--------------------------------------------+ ++--------+------------+------------------------------------------+ +| equal | c_ID | global scalar | +| equal | c_ID[I] | element of global vector | +| equal | c_ID[I][J] | element of global array | +| equal | C_ID[I] | element of per-atom vector (I = atom ID) | +| equal | C_ID{i}[J] | element of per-atom array (I = atom ID) | ++--------+------------+------------------------------------------+ +| vector | c_ID | global vector | +| vector | c_ID[I] | column of global array | +---------+------------+------------------------------------------+ +| atom | c_ID | per-atom vector | +| atom | c_ID[I] | column of per-atom array | ++--------+------------+------------------------------------------+ Note that if an equal-style variable formula wishes to access per-atom data from a compute, it must use capital "C" as the ID prefix and not @@ -1235,23 +1235,22 @@ Atom-style variables can use scalar values (same as for equal-style varaibles), or per-atom vectors of values. The latter can also be a column of a per-atom array. -The various allowed fix references in the variable formulas for -equal-, vector-, and atom-style variables are listed in the following -table: +The allowed fix references in variable formulas for equal-, vector-, +and atom-style variables are listed in the following table: -+--------+------------+--------------------------------------------+ -| equal | f_ID | global scalar | -| equal | f_ID[I] | element of global vector | -| equal | f_ID[I][J] | element of global array | -| equal | F_ID[I] | element of per-atom vector, I = ID of atom | -| equal | F_ID{i}[J] | element of per-atom array, I = ID of atom | -+--------+------------+--------------------------------------------| -| vector | f_ID | global vector | -| vector | f_ID[I] | column of global array | ----------+------------+--------------------------------------------+ -| atom | f_ID | per-atom vector | -| atom | f_ID[I] | column of per-atom array | -+--------+------------+--------------------------------------------+ ++--------+------------+------------------------------------------+ +| equal | f_ID | global scalar | +| equal | f_ID[I] | element of global vector | +| equal | f_ID[I][J] | element of global array | +| equal | F_ID[I] | element of per-atom vector (I = atom ID) | +| equal | F_ID{i}[J] | element of per-atom array (I = atom ID) | ++--------+------------+------------------------------------------+ +| vector | f_ID | global vector | +| vector | f_ID[I] | column of global array | +---------+------------+------------------------------------------+ +| atom | f_ID | per-atom vector | +| atom | f_ID[I] | column of per-atom array | ++--------+------------+------------------------------------------+ Note that if an equal-style variable formula wishes to access per-atom data from a fix, it must use capital "F" as the ID prefix and not @@ -1312,21 +1311,27 @@ including other atom-style or atomfile-style variables. If it uses a vector-style variable, a subscript must be used to access a single value from the vector-style variable. -Examples of different kinds of variable references are as follows. -There is no ambiguity as to what a reference means, since variables -produce only a global scalar or global vector or per-atom vector. +The allowed variable references in variable formulas for equal-, +vector-, and atom-style variables are listed in the following table. +Note that there is no ambiguity as to what a reference means, since +referenced variables produce only a global scalar or global vector or +per-atom vector. -+------------+----------------------------------------------------------------------+ -| v_name | global scalar from equal-style variable | -+------------+----------------------------------------------------------------------+ -| v_name | global vector from vector-style variable | -+------------+----------------------------------------------------------------------+ -| v_name | per-atom vector from atom-style or atomfile-style variable | -+------------+----------------------------------------------------------------------+ -| v_name[I] | Ith element of a global vector from vector-style variable | -+------------+----------------------------------------------------------------------+ -| v_name[I] | value of atom with ID = I from atom-style or atomfile-style variable | -+------------+----------------------------------------------------------------------+ ++--------+-----------+-----------------------------------------------------------------------------------+ +| equal | v_name | global scalar from an equal-style variable | +| equal | v_name[I] | element of global vector from a vector-style variable | +| equal | v_name[I] | element of per-atom vector (I = atom ID) from an atom- or atomfile-style variable | ++--------+-----------+-----------------------------------------------------------------------------------+ +| vector | v_name | global scalar from an equal-style variable | +| vector | v_name | global vector from a vector-style variable | +| vector | v_name[I] | element of global vector from a vector-style variable | +| vector | v_name[I] | element of per-atom vector (I = atom ID) from an atom- or atomfile-style variable | ++--------+-----------+-----------------------------------------------------------------------------------+ +| atom | v_name | global scalar from an equal-style variable | +| atom | v_name | per-atom vector from an atom-style or atomfile-style variable | +| atom | v_name[I] | element of global vector from a vector-style variable | +| atom | v_name[I] | element of per-atom vector (I = atom ID) from an atom- or atomfile-style variable | ++--------+-----------+-----------------------------------------------------------------------------------+ For the I index, an integer can be specified or a variable name, specified as v_name, where name is the name of the variable. The diff --git a/src/variable.cpp b/src/variable.cpp index a41c12d111..ce8f16cd68 100644 --- a/src/variable.cpp +++ b/src/variable.cpp @@ -1509,7 +1509,6 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) if (!compute->scalar_flag) print_var_error(FLERR,"Mismatched compute in variable formula",ivar); - if (!compute->is_initialized()) print_var_error(FLERR,"Variable formula compute cannot be invoked before " "initialization by a run",ivar); @@ -1567,7 +1566,7 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) else value1 = compute->array[index1-1][index2-1]; argstack[nargstack++] = value1; - // C_ID[i] = scalar element of per-atom vector + // C_ID[i] = scalar element of per-atom vector, note uppercase "C" } else if (!lowercase && nbracket == 1) { @@ -1586,7 +1585,7 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) peratom2global(1,nullptr,compute->vector_atom,1,index1,tree, treestack,ntreestack,argstack,nargstack); - // C_ID[i][j] = scalar element of per-atom array + // C_ID[i][j] = scalar element of per-atom array, note uppercase "C" } else if (!lowercase && nbracket == 2) { @@ -1728,12 +1727,6 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) } else print_var_error(FLERR,"Mismatched compute in variable formula",ivar); } - - - - - - // ---------------- // fix @@ -1753,7 +1746,6 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) if (!fix) print_var_error(FLERR,fmt::format("Invalid fix ID '{}' in variable formula",word+2),ivar); - // parse zero or one or two trailing brackets // point i beyond last bracket // nbracket = # of bracket pairs @@ -1775,181 +1767,200 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) } } - // f_ID = scalar from global scalar, must be lowercase + // equal-style variable is being evaluated - if (nbracket == 0 && fix->scalar_flag && lowercase) { + if (style[ivar] == EQUAL) { + + // f_ID = scalar from global scalar - if (update->whichflag > 0 && update->ntimestep % fix->global_freq) - print_var_error(FLERR,"Fix in variable not computed at a compatible time",ivar); + if (lowercase && nbracket == 0) { - value1 = fix->compute_scalar(); - if (tree) { + if (!fix->scalar_flag) + print_var_error(FLERR,"Mismatched fix in variable formula",ivar); + if (update->whichflag > 0 && update->ntimestep % fix->global_freq) + print_var_error(FLERR,"Fix in variable not computed at a compatible time",ivar); + + value1 = fix->compute_scalar(); + argstack[nargstack++] = value1; + + // f_ID[i] = scalar from global vector + + } else if (lowercase && nbracket == 1) { + + if (!fix->vector_flag) + print_var_error(FLERR,"Mismatched fix in variable formula",ivar); + if (index1 > fix->size_vector && + fix->size_vector_variable == 0) + print_var_error(FLERR,"Variable formula fix vector is accessed out-of-range",ivar,0); + if (update->whichflag > 0 && update->ntimestep % fix->global_freq) + print_var_error(FLERR,"Fix in variable not computed at a compatible time",ivar); + + value1 = fix->compute_vector(index1-1); + argstack[nargstack++] = value1; + + // f_ID[i][j] = scalar from global array + + } else if (lowercase && nbracket == 2) { + + if (!fix->array_flag) + print_var_error(FLERR,"Mismatched fix in variable formula",ivar); + if (index1 > fix->size_array_rows && + fix->size_array_rows_variable == 0) + print_var_error(FLERR,"Variable formula fix array is accessed out-of-range",ivar,0); + if (index2 > fix->size_array_cols) + print_var_error(FLERR,"Variable formula fix array is accessed out-of-range",ivar,0); + if (update->whichflag > 0 && update->ntimestep % fix->global_freq) + print_var_error(FLERR,"Fix in variable not computed at a compatible time",ivar); + + value1 = fix->compute_array(index1-1,index2-1); + argstack[nargstack++] = value1; + + // F_ID[i] = scalar element of per-atom vector, note uppercase "F" + + } else if (!lowercase && nbracket == 1) { + + if (!fix->peratom_flag) + print_var_error(FLERR,"Mismatched fix in variable formula",ivar); + if (fix->size_peratom_cols) + print_var_error(FLERR,"Mismatched fix in variable formula",ivar); + if (update->whichflag > 0 && + update->ntimestep % fix->peratom_freq) + print_var_error(FLERR,"Fix in variable not computed at a compatible time",ivar); + + peratom2global(1,nullptr,fix->vector_atom,1,index1,tree, + treestack,ntreestack,argstack,nargstack); + + // F_ID[i][j] = scalar element of per-atom array, note uppercase "F" + + } else if (!lowercase && nbracket == 2) { + + if (!fix->peratom_flag) + print_var_error(FLERR,"Mismatched fix in variable formula",ivar); + if (!fix->size_peratom_cols) + print_var_error(FLERR,"Mismatched fix in variable formula",ivar); + if (index2 > fix->size_peratom_cols) + print_var_error(FLERR,"Variable formula fix array is accessed out-of-range",ivar,0); + if (update->whichflag > 0 && update->ntimestep % fix->peratom_freq) + print_var_error(FLERR,"Fix in variable not computed at a compatible time",ivar); + + if (fix->array_atom) + peratom2global(1,nullptr,&fix->array_atom[0][index2-1], + fix->size_peratom_cols,index1, + tree,treestack,ntreestack,argstack,nargstack); + else + peratom2global(1,nullptr,nullptr,fix->size_peratom_cols,index1, + tree,treestack,ntreestack,argstack,nargstack); + + // no other possibilities for equal-style variable, so error + + } else print_var_error(FLERR,"Mismatched fix in variable formula",ivar); + + // vector-style variable is being evaluated + + } else if (style[ivar] == VECTOR) { + + // f_ID = vector from global vector + + if (lowercase && nbracket == 0) { + + if (!fix->vector_flag) + print_var_error(FLERR,"Mismatched fix in variable formula",ivar); + if (fix->size_vector == 0) + print_var_error(FLERR,"Variable formula fix vector is zero length",ivar); + if (update->whichflag > 0 && update->ntimestep % fix->global_freq) + print_var_error(FLERR,"Fix in variable not computed at compatible time",ivar); + + int nvec = fix->size_vector; + double *vec; + memory->create(vec,nvec,"variable:values"); + for (int m = 0; m < nvec; m++) + vec[m] = fix->compute_vector(m); + auto newtree = new Tree(); - newtree->type = VALUE; - newtree->value = value1; + newtree->type = VECTORARRAY; + newtree->array = vec; + newtree->nvector = nvec; + newtree->nstride = 1; + newtree->selfalloc = 1; treestack[ntreestack++] = newtree; - } else argstack[nargstack++] = value1; + + // f_ID[i] = vector from global array - // f_ID[i] = scalar from global vector, must be lowercase + } else if (lowercase && nbracket == 1) { - } else if (nbracket == 1 && fix->vector_flag && lowercase) { + if (!fix->array_flag) + print_var_error(FLERR,"Mismatched fix in variable formula",ivar); + if (fix->size_array_rows == 0) + print_var_error(FLERR,"Variable formula fix array is zero length",ivar); + if (index1 > fix->size_array_cols) + print_var_error(FLERR,"Variable formula fix array is accessed out-of-range",ivar,0); + if (update->whichflag > 0 && update->ntimestep % fix->global_freq) + print_var_error(FLERR,"Fix in variable not computed at a compatible time",ivar); - if (index1 > fix->size_vector && - fix->size_vector_variable == 0) - print_var_error(FLERR,"Variable formula fix vector is accessed out-of-range",ivar,0); - if (update->whichflag > 0 && update->ntimestep % fix->global_freq) - print_var_error(FLERR,"Fix in variable not computed at a compatible time",ivar); + int nvec = fix->size_array_rows; + double *vec; + memory->create(vec,nvec,"variable:values"); + for (int m = 0; m < nvec; m++) + vec[m] = fix->compute_array(m,index1-1); - value1 = fix->compute_vector(index1-1); - if (tree) { auto newtree = new Tree(); - newtree->type = VALUE; - newtree->value = value1; + newtree->type = VECTORARRAY; + newtree->array = vec; + newtree->nvector = nvec; + newtree->nstride = 1; + newtree->selfalloc = 1; treestack[ntreestack++] = newtree; - } else argstack[nargstack++] = value1; + + // no other possibilities for vector-style variable, so error + + } else print_var_error(FLERR,"Mismatched fix in variable formula",ivar); - // f_ID[i][j] = scalar from global array, must be lowercase + // atom-style variable is being evaluated - } else if (nbracket == 2 && fix->array_flag && lowercase) { + } else if (style[ivar] == ATOM) { + + // f_ID = vector from per-atom vector - if (index1 > fix->size_array_rows && - fix->size_array_rows_variable == 0) - print_var_error(FLERR,"Variable formula fix array is accessed out-of-range",ivar,0); - if (index2 > fix->size_array_cols) - print_var_error(FLERR,"Variable formula fix array is accessed out-of-range",ivar,0); - if (update->whichflag > 0 && update->ntimestep % fix->global_freq) - print_var_error(FLERR,"Fix in variable not computed at a compatible time",ivar); + if (lowercase && nbracket == 0) { + + if (!fix->peratom_flag) + print_var_error(FLERR,"Mismatched fix in variable formula",ivar); + if (fix->size_peratom_cols) + print_var_error(FLERR,"Mismatched fix in variable formula",ivar); + if (update->whichflag > 0 && update->ntimestep % fix->peratom_freq) + print_var_error(FLERR,"Fix in variable not computed at compatible time",ivar); - value1 = fix->compute_array(index1-1,index2-1); - if (tree) { auto newtree = new Tree(); - newtree->type = VALUE; - newtree->value = value1; + newtree->type = ATOMARRAY; + newtree->array = fix->vector_atom; + newtree->nstride = 1; treestack[ntreestack++] = newtree; - } else argstack[nargstack++] = value1; + + // f_ID[i] = vector from per-atom array - // f_ID = vector from global vector, lowercase or uppercase + } else if (lowercase && nbracket == 1) { - } else if (nbracket == 0 && fix->vector_flag) { + if (!fix->peratom_flag) + print_var_error(FLERR,"Mismatched fix in variable formula",ivar); + if (!fix->size_peratom_cols) + print_var_error(FLERR,"Mismatched fix in variable formula",ivar); + if (index1 > fix->size_peratom_cols) + print_var_error(FLERR,"Variable formula fix array is accessed out-of-range",ivar,0); + if (update->whichflag > 0 && update->ntimestep % fix->peratom_freq) + print_var_error(FLERR,"Fix in variable not computed at compatible time",ivar); - if (update->whichflag > 0 && update->ntimestep % fix->global_freq) - print_var_error(FLERR,"Fix in variable not computed at compatible time",ivar); - if (tree == nullptr) - print_var_error(FLERR,"Fix global vector in equal-style variable formula",ivar); - if (treetype == ATOM) - print_var_error(FLERR,"Fix global vector in atom-style variable formula",ivar); - if (fix->size_vector == 0) - print_var_error(FLERR,"Variable formula fix vector is zero length",ivar); + auto newtree = new Tree(); + newtree->type = ATOMARRAY; + newtree->array = nullptr; + if (fix->array_atom) + newtree->array = &fix->array_atom[0][index1-1]; + newtree->nstride = fix->size_peratom_cols; + treestack[ntreestack++] = newtree; - int nvec = fix->size_vector; - double *vec; - memory->create(vec,nvec,"variable:values"); - for (int m = 0; m < nvec; m++) - vec[m] = fix->compute_vector(m); - - auto newtree = new Tree(); - newtree->type = VECTORARRAY; - newtree->array = vec; - newtree->nvector = nvec; - newtree->nstride = 1; - newtree->selfalloc = 1; - treestack[ntreestack++] = newtree; - - // f_ID[i] = vector from global array, lowercase or uppercase - - } else if (nbracket == 1 && fix->array_flag) { - - if (update->whichflag > 0 && update->ntimestep % fix->global_freq) - print_var_error(FLERR,"Fix in variable not computed at a compatible time",ivar); - if (tree == nullptr) - print_var_error(FLERR,"Fix global vector in equal-style variable formula",ivar); - if (treetype == ATOM) - print_var_error(FLERR,"Fix global vector in atom-style variable formula",ivar); - if (fix->size_array_rows == 0) - print_var_error(FLERR,"Variable formula fix array is zero length",ivar); - - int nvec = fix->size_array_rows; - double *vec; - memory->create(vec,nvec,"variable:values"); - for (int m = 0; m < nvec; m++) - vec[m] = fix->compute_array(m,index1-1); - - auto newtree = new Tree(); - newtree->type = VECTORARRAY; - newtree->array = vec; - newtree->nvector = nvec; - newtree->nstride = 1; - newtree->selfalloc = 1; - treestack[ntreestack++] = newtree; - - // f_ID[i] = scalar from per-atom vector - - } else if (nbracket == 1 && fix->peratom_flag && - fix->size_peratom_cols == 0) { - - if (update->whichflag > 0 && - update->ntimestep % fix->peratom_freq) - print_var_error(FLERR,"Fix in variable not computed at a compatible time",ivar); - - peratom2global(1,nullptr,fix->vector_atom,1,index1, - tree,treestack,ntreestack,argstack,nargstack); - - // f_ID[i][j] = scalar from per-atom array - - } else if (nbracket == 2 && fix->peratom_flag && - fix->size_peratom_cols > 0) { - - if (index2 > fix->size_peratom_cols) - print_var_error(FLERR,"Variable formula fix array is accessed out-of-range",ivar,0); - if (update->whichflag > 0 && - update->ntimestep % fix->peratom_freq) - print_var_error(FLERR,"Fix in variable not computed at a compatible time",ivar); - - if (fix->array_atom) - peratom2global(1,nullptr,&fix->array_atom[0][index2-1],fix->size_peratom_cols,index1, - tree,treestack,ntreestack,argstack,nargstack); - else - peratom2global(1,nullptr,nullptr,fix->size_peratom_cols,index1, - tree,treestack,ntreestack,argstack,nargstack); - - // f_ID = vector from per-atom vector - - } else if (nbracket == 0 && fix->peratom_flag && - fix->size_peratom_cols == 0) { - - if (tree == nullptr) - print_var_error(FLERR,"Per-atom fix in equal-style variable formula",ivar); - if (update->whichflag > 0 && - update->ntimestep % fix->peratom_freq) - print_var_error(FLERR,"Fix in variable not computed at compatible time",ivar); - - auto newtree = new Tree(); - newtree->type = ATOMARRAY; - newtree->array = fix->vector_atom; - newtree->nstride = 1; - treestack[ntreestack++] = newtree; - - // f_ID[i] = vector from per-atom array - - } else if (nbracket == 1 && fix->peratom_flag && - fix->size_peratom_cols > 0) { - - if (tree == nullptr) - print_var_error(FLERR,"Per-atom fix in equal-style variable formula",ivar); - if (index1 > fix->size_peratom_cols) - print_var_error(FLERR,"Variable formula fix array is accessed out-of-range",ivar,0); - if (update->whichflag > 0 && - update->ntimestep % fix->peratom_freq) - print_var_error(FLERR,"Fix in variable not computed at compatible time",ivar); - - auto newtree = new Tree(); - newtree->type = ATOMARRAY; - if (fix->array_atom) - newtree->array = &fix->array_atom[0][index1-1]; - newtree->nstride = fix->size_peratom_cols; - treestack[ntreestack++] = newtree; - - } else print_var_error(FLERR,"Mismatched fix in variable formula",ivar); + // no other possibilities for atom-style variable, so error + + } else print_var_error(FLERR,"Mismatched fix in variable formula",ivar); + } // ---------------- // variable @@ -1979,124 +1990,140 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) i = ptr-str+1; } - // v_name = scalar from internal-style variable - // access value directly + // vname with no bracket - if (nbracket == 0 && style[ivar] == INTERNAL) { + if (nbracket == 0) { - value1 = dvalue[ivar]; - if (tree) { - auto newtree = new Tree(); - newtree->type = VALUE; - newtree->value = value1; - treestack[ntreestack++] = newtree; - } else argstack[nargstack++] = value1; + // scalar from internal-style variable + // access value directly - // v_name = scalar from non atom/atomfile & non vector-style variable - // access value via retrieve() + if (style[ivar] = INTERNAL) { - } else if (nbracket == 0 && style[ivar] != ATOM && - style[ivar] != ATOMFILE && style[ivar] != VECTOR) { + value1 = dvalue[ivar]; + if (tree) { + auto newtree = new Tree(); + newtree->type = VALUE; + newtree->value = value1; + treestack[ntreestack++] = newtree; + } else argstack[nargstack++] = value1; - char *var = retrieve(word+2); - if (var == nullptr) - print_var_error(FLERR,"Invalid variable evaluation in variable formula",ivar); - if (utils::is_double(var)) { + // scalar from any style variable except VECTOR, ATOM, ATOMFILE + // access value via retrieve() + + } else if (style[ivar] != ATOM && style[ivar] != ATOMFILE && style[ivar] != VECTOR) { + + char *var = retrieve(word+2); + if (var == nullptr) + print_var_error(FLERR,"Invalid variable evaluation in variable formula",ivar); + if (!utils::is_double(var)) + print_var_error(FLERR,"Non-numeric variable value in variable formula",ivar); if (tree) { auto newtree = new Tree(); newtree->type = VALUE; newtree->value = atof(var); treestack[ntreestack++] = newtree; } else argstack[nargstack++] = atof(var); - } else print_var_error(FLERR,"Non-numeric variable value in variable formula",ivar); - // v_name = per-atom vector from atom-style variable - // evaluate the atom-style variable as newtree + // vector from vector-style variable + // evaluate the vector-style variable, put result in newtree - } else if (nbracket == 0 && style[ivar] == ATOM) { + } else if (style[ivar] == VECTOR) { - if (tree == nullptr) - print_var_error(FLERR,"Atom-style variable in equal-style variable formula",ivar); - if (treetype == VECTOR) - print_var_error(FLERR,"Atom-style variable in vector-style variable formula",ivar); + if (tree == nullptr) + print_var_error(FLERR,"Vector-style variable in equal-style variable formula",ivar); + if (treetype == ATOM) + print_var_error(FLERR,"Vector-style variable in atom-style variable formula",ivar); - Tree *newtree = nullptr; - evaluate(data[ivar][0],&newtree,ivar); - treestack[ntreestack++] = newtree; + double *vec; + int nvec = compute_vector(ivar,&vec); - // v_name = per-atom vector from atomfile-style variable - - } else if (nbracket == 0 && style[ivar] == ATOMFILE) { - - if (tree == nullptr) - print_var_error(FLERR,"Atomfile-style variable in equal-style variable formula",ivar); - if (treetype == VECTOR) - print_var_error(FLERR,"Atomfile-style variable in vector-style variable formula",ivar); - - auto newtree = new Tree(); - newtree->type = ATOMARRAY; - newtree->array = reader[ivar]->fixstore->vstore; - newtree->nstride = 1; - treestack[ntreestack++] = newtree; - - // v_name = vector from vector-style variable - // evaluate the vector-style variable, put result in newtree - - } else if (nbracket == 0 && style[ivar] == VECTOR) { - - if (tree == nullptr) - print_var_error(FLERR,"Vector-style variable in equal-style variable formula",ivar); - if (treetype == ATOM) - print_var_error(FLERR,"Vector-style variable in atom-style variable formula",ivar); - - double *vec; - int nvec = compute_vector(ivar,&vec); - - auto newtree = new Tree(); - newtree->type = VECTORARRAY; - newtree->array = vec; - newtree->nvector = nvec; - newtree->nstride = 1; - treestack[ntreestack++] = newtree; - - // v_name[N] = scalar from atom-style variable - // compute the per-atom variable in result - // use peratom2global to extract single value from result - - } else if (nbracket && style[ivar] == ATOM) { - - double *result; - memory->create(result,atom->nlocal,"variable:result"); - compute_atom(ivar,0,result,1,0); - peratom2global(1,nullptr,result,1,index,tree,treestack,ntreestack,argstack,nargstack); - memory->destroy(result); - - // v_name[N] = scalar from atomfile-style variable - - } else if (nbracket && style[ivar] == ATOMFILE) { - - peratom2global(1,nullptr,reader[ivar]->fixstore->vstore,1,index, - tree,treestack,ntreestack,argstack,nargstack); - - // v_name[N] = scalar from vector-style variable - // compute the vector-style variable, extract single value - - } else if (nbracket && style[ivar] == VECTOR) { - - double *vec; - int nvec = compute_vector(ivar,&vec); - if (index <= 0 || index > nvec) - print_var_error(FLERR,"Invalid index into vector-style variable",ivar); - int m = index; // convert from tagint to int - - if (tree) { auto newtree = new Tree(); - newtree->type = VALUE; - newtree->value = vec[m-1]; + newtree->type = VECTORARRAY; + newtree->array = vec; + newtree->nvector = nvec; + newtree->nstride = 1; treestack[ntreestack++] = newtree; - } else argstack[nargstack++] = vec[m-1]; - } else print_var_error(FLERR,"Mismatched variable in variable formula",ivar); + // vector from atom-style variable + // evaluate the atom-style variable as newtree + + } else if (style[ivar] == ATOM) { + + if (tree == nullptr) + print_var_error(FLERR,"Atom-style variable in equal-style variable formula",ivar); + if (treetype == VECTOR) + print_var_error(FLERR,"Atom-style variable in vector-style variable formula",ivar); + + Tree *newtree = nullptr; + evaluate(data[ivar][0],&newtree,ivar); + treestack[ntreestack++] = newtree; + + // vector from atomfile-style variable + // point to the values in FixStore instance + + } else if (style[ivar] == ATOMFILE) { + + if (tree == nullptr) + print_var_error(FLERR,"Atomfile-style variable in equal-style variable formula",ivar); + if (treetype == VECTOR) + print_var_error(FLERR,"Atomfile-style variable in vector-style variable formula",ivar); + + auto newtree = new Tree(); + newtree->type = ATOMARRAY; + newtree->array = reader[ivar]->fixstore->vstore; + newtree->nstride = 1; + treestack[ntreestack++] = newtree; + + // no other possibilities for variable with no bracket + + } else print_var_error(FLERR,"Mismatched variable in variable formula",ivar); + + // vname[i] with one bracket + + } else if (nbracket == 1) { + + // scalar from vector-style variable + // compute the vector-style variable, extract single value + + if (style[ivar] == VECTOR) { + + double *vec; + int nvec = compute_vector(ivar,&vec); + if (index <= 0 || index > nvec) + print_var_error(FLERR,"Invalid index into vector-style variable",ivar); + int m = index; // convert from tagint to int + + if (tree) { + auto newtree = new Tree(); + newtree->type = VALUE; + newtree->value = vec[m-1]; + treestack[ntreestack++] = newtree; + } else argstack[nargstack++] = vec[m-1]; + + // scalar from atom-style variable + // compute the per-atom variable in result + // use peratom2global to extract single value from result + + } else if (style[ivar] == ATOM) { + + double *result; + memory->create(result,atom->nlocal,"variable:result"); + compute_atom(ivar,0,result,1,0); + peratom2global(1,nullptr,result,1,index,tree,treestack,ntreestack,argstack,nargstack); + memory->destroy(result); + + // scalar from atomfile-style variable + // use peratom2global to extract single value from FixStore instance + + } else if (style[ivar] == ATOMFILE) { + + peratom2global(1,nullptr,reader[ivar]->fixstore->vstore,1,index, + tree,treestack,ntreestack,argstack,nargstack); + + // no other possibilities for variable with one bracket + + } else print_var_error(FLERR,"Mismatched variable in variable formula",ivar); + } // ---------------- // math/group/special/labelmap function or atom value/vector or From c6233547a531cee52049780592e8c3589960633d Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Mon, 21 Aug 2023 09:39:00 -0600 Subject: [PATCH 049/219] update compute and fix doc pages for new generality --- doc/src/compute.rst | 114 ++++++++++++++++++++++++-------------------- doc/src/fix.rst | 89 +++++++++++++++++++--------------- 2 files changed, 113 insertions(+), 90 deletions(-) diff --git a/doc/src/compute.rst b/doc/src/compute.rst index 226dc6373b..2780cac368 100644 --- a/doc/src/compute.rst +++ b/doc/src/compute.rst @@ -27,58 +27,62 @@ Examples Description """"""""""" -Define a computation that will be performed on a group of atoms. -Quantities calculated by a compute are instantaneous values, meaning -they are calculated from information about atoms on the current -timestep or iteration, though a compute may internally store some -information about a previous state of the system. Defining a compute -does not perform a computation. Instead computes are invoked by other -LAMMPS commands as needed (e.g., to calculate a temperature needed for -a thermostat fix or to generate thermodynamic or dump file output). -See the :doc:`Howto output ` page for a summary of -various LAMMPS output options, many of which involve computes. +Define a diagnostic computation that will be performed on a group of +atoms. Quantities calculated by a compute are instantaneous values, +meaning they are calculated from information about atoms on the +current timestep or iteration, though internally a compute may store +some information about a previous state of the system. Defining a +compute does not perform the computation. Instead computes are +invoked by other LAMMPS commands as needed (e.g., to calculate a +temperature needed for a thermostat fix or to generate thermodynamic +or dump file output). See the :doc:`Howto output ` page +for a summary of various LAMMPS output options, many of which involve +computes. The ID of a compute can only contain alphanumeric characters and underscores. ---------- -Computes calculate and store any of four styles of quantities: global, -per-atom, local, or per-grid. A global quantity is one or more -system-wide values, e.g. the temperature of the system. A per-atom -quantity is one or more values per atom, e.g. the kinetic energy of -each atom. Per-atom values are set to 0.0 for atoms not in the -specified compute group. Local quantities are calculated by each -processor based on the atoms it owns, but there may be zero or more -per atom, e.g. a list of bond distances. Per-grid quantities are -calculated on a regular 2d or 3d grid which overlays a 2d or 3d -simulation domain. The grid points and the data they store are -distributed across processors; each processor owns the grid points -which fall within its subdomain. +Computes calculate and store any of four *styles* of quantities: +global, per-atom, local, or per-grid. -Computes that produce per-atom quantities have the word "atom" at the -end of their style, e.g. *ke/atom*\ . Computes that produce local -quantities have the word "local" at the end of their style, -e.g. *bond/local*\ . Computes that produce per-grid quantities have -the word "grid" at the end of their style, e.g. *property/grid*\ . -Styles with neither "atom" or "local" or "grid" at the end of their -style name produce global quantities. +A global quantity is one or more system-wide values, e.g. the +temperature of the system. A per-atom quantity is one or more values +per atom, e.g. the kinetic energy of each atom. Per-atom values are +set to 0.0 for atoms not in the specified compute group. Local +quantities are calculated by each processor based on the atoms it +owns, but there may be zero or more per atom, e.g. a list of bond +distances. Per-grid quantities are calculated on a regular 2d or 3d +grid which overlays a 2d or 3d simulation domain. The grid points and +the data they store are distributed across processors; each processor +owns the grid points which fall within its subdomain. -Note that a single compute typically produces either global or -per-atom or local or per-grid values. It does not compute both global -and per-atom values. It can produce local values or per-grid values -in tandem with global or per-atom quantities. The compute doc page -will explain the details. +As a general rule of thumb, computes that produce per-atom quantities +have the word "atom" at the end of their style, e.g. *ke/atom*\ . +Computes that produce local quantities have the word "local" at the +end of their style, e.g. *bond/local*\ . Computes that produce +per-grid quantities have the word "grid" at the end of their style, +e.g. *property/grid*\ . And styles with neither "atom" or "local" or +"grid" at the end of their style name produce global quantities. -Global, per-atom, local, and per-grid quantities come in three kinds: -a single scalar value, a vector of values, or a 2d array of values. -The doc page for each compute describes the style and kind of values -it produces, e.g. a per-atom vector. Some computes produce more than -one kind of a single style, e.g. a global scalar and a global vector. +Global, per-atom, local, and per-grid quantities can also be of three +*kinds*: a single scalar value (global only), a vector of values, or a +2d array of values. For per-atom, local, and per-grid quantities, a +"vector" means a single value for each atom, each local entity +(e.g. bond), or grid cell. Likewise an "array", means multiple values +for each atom, each local entity, or each grid cell. -When a compute quantity is accessed, as in many of the output commands -discussed below, it can be referenced via the following bracket -notation, where ID is the ID of the compute: +Note that a single compute can produce any combination of global, +per-atom, local, or per-grid values. Likewise it can prouduce any +combination of scalar, vector, or array output for each style. The +exception is that for per-atom, local, and per-grid output, either a +vector or array can be produced, but not both. The doc page for each +compute explains the values it produces. + +When a compute output is accessed by another input script command it +is referenced via the following bracket notation, where ID is the ID +of the compute: +-------------+--------------------------------------------+ | c_ID | entire scalar, vector, or array | @@ -89,17 +93,23 @@ notation, where ID is the ID of the compute: +-------------+--------------------------------------------+ In other words, using one bracket reduces the dimension of the -quantity once (vector :math:`\to` scalar, array :math:`\to` vector). Using two -brackets reduces the dimension twice (array :math:`\to` scalar). Thus a -command that uses scalar compute values as input can also process elements of a -vector or array. +quantity once (vector :math:`\to` scalar, array :math:`\to` vector). +Using two brackets reduces the dimension twice (array :math:`\to` +scalar). Thus, for example, a command that uses global scalar compute +values as input can also process elements of a vector or array. +Depending on the command, this can either be done directly using the +syntax in the table, or by first defining a :doc:`variable ` +of the appropriate style to store the quantity, then using the +variable as an input to the command. -Note that commands and :doc:`variables ` which use compute -quantities typically do not allow for all kinds (e.g., a command may -require a vector of values, not a scalar). This means there is no -ambiguity about referring to a compute quantity as c_ID even if it -produces, for example, both a scalar and vector. The doc pages for -various commands explain the details. +Note that commands and :doc:`variables ` which take compute +outputs as input typically do not allow for all styles and kinds of +data (e.g., a command may require global but not per-atom values, or +it may require a vector of values, not a scalar). This means there is +typically no ambiguity about referring to a compute output as c_ID +even if it produces, for example, both a scalar and vector. The doc +pages for various commands explain the details, including how any +ambiguities are resolved. ---------- diff --git a/doc/src/fix.rst b/doc/src/fix.rst index 09fc05d500..a879a45e05 100644 --- a/doc/src/fix.rst +++ b/doc/src/fix.rst @@ -77,35 +77,44 @@ for individual fixes for info on which ones can be restarted. ---------- -Some fixes calculate one or more of four styles of quantities: global, -per-atom, local, or per-grid, which can be used by other commands or -output as described below. A global quantity is one or more -system-wide values, e.g. the energy of a wall interacting with -particles. A per-atom quantity is one or more values per atom, -e.g. the displacement vector for each atom since time 0. Per-atom -values are set to 0.0 for atoms not in the specified fix group. Local -quantities are calculated by each processor based on the atoms it -owns, but there may be zero or more per atoms. Per-grid quantities -are calculated on a regular 2d or 3d grid which overlays a 2d or 3d -simulation domain. The grid points and the data they store are -distributed across processors; each processor owns the grid points -which fall within its subdomain. +Some fixes calculate and store any of four *styles* of quantities: +global, per-atom, local, or per-grid. -Note that a single fix typically produces either global or per-atom or -local or per-grid values (or none at all). It does not produce both -global and per-atom. It can produce local or per-grid values in -tandem with global or per-atom values. The fix doc page will explain -the details. +A global quantity is one or more system-wide values, e.g. the energy +of a wall interacting with particles. A per-atom quantity is one or +more values per atom, e.g. the original coordinates of each atom at +time 0. Per-atom values are set to 0.0 for atoms not in the specified +fix group. Local quantities are calculated by each processor based on +the atoms it owns, but there may be zero or more per atom, e.g. values +for each bond. Per-grid quantities are calculated on a regular 2d or +3d grid which overlays a 2d or 3d simulation domain. The grid points +and the data they store are distributed across processors; each +processor owns the grid points which fall within its subdomain. -Global, per-atom, local, and per-grid quantities come in three kinds: -a single scalar value, a vector of values, or a 2d array of values. -The doc page for each fix describes the style and kind of values it -produces, e.g. a per-atom vector. Some fixes produce more than one -kind of a single style, e.g. a global scalar and a global vector. +As a general rule of thumb, fixes that produce per-atom quantities +have the word "atom" at the end of their style, e.g. *ave/atom*\ . +Fixes that produce local quantities have the word "local" at the end +of their style, e.g. *store/local*\ . Fixes that produce per-grid +quantities have the word "grid" at the end of their style, +e.g. *ave/grid*\ . -When a fix quantity is accessed, as in many of the output commands -discussed below, it can be referenced via the following bracket -notation, where ID is the ID of the fix: +Global, per-atom, local, and per-grid quantities can also be of three +*kinds*: a single scalar value (global only), a vector of values, or a +2d array of values. For per-atom, local, and per-grid quantities, a +"vector" means a single value for each atom, each local entity +(e.g. bond), or grid cell. Likewise an "array", means multiple values +for each atom, each local entity, or each grid cell. + +Note that a single fix can produce any combination of global, +per-atom, local, or per-grid values. Likewise it can prouduce any +combination of scalar, vector, or array output for each style. The +exception is that for per-atom, local, and per-grid output, either a +vector or array can be produced, but not both. The doc page for each +fix explains the values it produces, if any. + +When a fix output is accessed by another input script command it is +referenced via the following bracket notation, where ID is the ID of +the fix: +-------------+--------------------------------------------+ | f_ID | entire scalar, vector, or array | @@ -116,19 +125,23 @@ notation, where ID is the ID of the fix: +-------------+--------------------------------------------+ In other words, using one bracket reduces the dimension of the -quantity once (vector :math:`\to` scalar, array :math:`\to` vector). Using two -brackets reduces the dimension twice (array :math:`\to` scalar). Thus, a -command that uses scalar fix values as input can also process elements of a -vector or array. +quantity once (vector :math:`\to` scalar, array :math:`\to` vector). +Using two brackets reduces the dimension twice (array :math:`\to` +scalar). Thus, for example, a command that uses global scalar fix +values as input can also process elements of a vector or array. +Depending on the command, this can either be done directly using the +syntax in the table, or by first defining a :doc:`variable ` +of the appropriate style to store the quantity, then using the +variable as an input to the command. -Note that commands and :doc:`variables ` that use fix -quantities typically do not allow for all kinds (e.g., a command may -require a vector of values, not a scalar), and even if they do, the context -in which they are called can be used to resolve which output is being -requested. This means there is no -ambiguity about referring to a fix quantity as f_ID even if it -produces, for example, both a scalar and vector. The doc pages for -various commands explain the details. +Note that commands and :doc:`variables ` which take fix +outputs as input typically do not allow for all styles and kinds of +data (e.g., a command may require global but not per-atom values, or +it may require a vector of values, not a scalar). This means there is +typically no ambiguity about referring to a fix output as c_ID even if +it produces, for example, both a scalar and vector. The doc pages for +various commands explain the details, including how any ambiguities +are resolved. ---------- From ab2b83f65430892d1f45a928248f01507b7ddfed Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Mon, 21 Aug 2023 10:54:42 -0600 Subject: [PATCH 050/219] clarify doc for fix ave/histo command --- doc/src/compute_reduce.rst | 26 +++--- doc/src/fix_ave_histo.rst | 42 +++++----- src/compute_reduce_region.cpp | 145 +++++++++++----------------------- src/fix_ave_histo.cpp | 2 +- 4 files changed, 86 insertions(+), 129 deletions(-) diff --git a/doc/src/compute_reduce.rst b/doc/src/compute_reduce.rst index 31591d4419..4692e161b4 100644 --- a/doc/src/compute_reduce.rst +++ b/doc/src/compute_reduce.rst @@ -63,9 +63,11 @@ Description """"""""""" Define a calculation that "reduces" one or more vector inputs into -scalar values, one per listed input. The inputs can be per-atom or -local quantities and must all be the same kind (per-atom or local); -see discussion of the optional *inputs* keyword below. +scalar values, one per listed input. For the compute reduce command, +the inputs can be either per-atom or local quantities and must all be +of the same kind (per-atom or local); see discussion of the optional +*inputs* keyword below. The compute reduce/region command can only be +used with per-atom inputs. Atom attributes are per-atom quantities, :doc:`computes ` and :doc:`fixes ` can generate either per-atom or local quantities, @@ -92,13 +94,13 @@ values. Each listed input is operated on independently. For per-atom inputs, the group specified with this command means only atoms within the -group contribute to the result. For per-atom inputs, if the compute -reduce/region command is used, the atoms must also currently be within -the region. Note that an input that produces per-atom quantities may -define its own group which affects the quantities it returns. For -example, if a compute is used as an input which generates a per-atom -vector, it will generate values of 0.0 for atoms that are not in the -group specified for that compute. +group contribute to the result. Likewise for per-atom inputs, if the +compute reduce/region command is used, the atoms must also currently +be within the region. Note that an input that produces per-atom +quantities may define its own group which affects the quantities it +returns. For example, if a compute is used as an input which +generates a per-atom vector, it will generate values of 0.0 for atoms +that are not in the group specified for that compute. Each listed input can be an atom attribute (position, velocity, force component) or can be the result of a :doc:`compute ` or @@ -246,7 +248,9 @@ the quantities being reduced are in. Restrictions """""""""""" - none + +As noted above, the compute reduce/region command can only be used +with per-atom inputs. Related commands """""""""""""""" diff --git a/doc/src/fix_ave_histo.rst b/doc/src/fix_ave_histo.rst index 8bb66f0615..31e5476f9e 100644 --- a/doc/src/fix_ave_histo.rst +++ b/doc/src/fix_ave_histo.rst @@ -79,9 +79,10 @@ Description Use one or more values as inputs every few timesteps to create a single histogram. The histogram can then be averaged over longer -timescales. The resulting histogram can be used by other :doc:`output commands `, and can also be written to a file. The -fix ave/histo/weight command has identical syntax to fix ave/histo, -except that exactly two values must be specified. See details below. +timescales. The resulting histogram can be used by other :doc:`output +commands `, and can also be written to a file. The fix +ave/histo/weight command has identical syntax to fix ave/histo, except +that exactly two values must be specified. See details below. The group specified with this command is ignored for global and local input values. For per-atom input values, only atoms in the group @@ -96,14 +97,18 @@ different ways; see the discussion of the *beyond* keyword below. Each input value can be an atom attribute (position, velocity, force component) or can be the result of a :doc:`compute ` or -:doc:`fix ` or the evaluation of an equal-style or vector-style or -atom-style :doc:`variable `. The set of input values can be -either all global, all per-atom, or all local quantities. Inputs of -different kinds (e.g. global and per-atom) cannot be mixed. Atom -attributes are per-atom vector values. See the page for -individual "compute" and "fix" commands to see what kinds of -quantities they generate. See the optional *kind* keyword below for -how to force the fix ave/histo command to disambiguate if necessary. +:doc:`fix ` or the evaluation of an equal-style or vector-style +or atom-style :doc:`variable `. The set of input values can +be either all global, all per-atom, or all local quantities. Inputs +of different kinds (e.g. global and per-atom) cannot be mixed. Atom +attributes are per-atom vector values. See the page for individual +"compute" and "fix" commands to see what kinds of quantities they +generate. + +Note that a compute or fix can produce multiple kinds of data (global, +per-atom, local). If LAMMPS cannot unambiguosly determine which kind +of data to use, the optional *kind* keyword discussed below can force +the desired disambiguation. Note that the output of this command is a single histogram for all input values combined together, not one histogram per input value. @@ -258,13 +263,14 @@ keyword is set to *vector*, then all input values must be global or per-atom or local vectors, or columns of global or per-atom or local arrays. -The *kind* keyword only needs to be set if a compute or fix produces -more than one kind of output (global, per-atom, local). If this is -not the case, then LAMMPS will determine what kind of input is -provided and whether all the input arguments are consistent. If a -compute or fix produces more than one kind of output, the *kind* -keyword should be used to specify which output will be used. The -remaining input arguments must still be consistent. +The *kind* keyword only needs to be used if any of the specfied input +computes or fixes produce more than one kind of output (global, +per-atom, local). If not, LAMMPS will determine the kind of data all +the inputs produce and verify it is all the same kind. If not, an +error will be triggered. If a compute or fix produces more than one +kind of output, the *kind* keyword should be used to specify which +output will be used. The other input arguments must still be +consistent. The *beyond* keyword determines how input values that fall outside the *lo* to *hi* bounds are treated. Values such that *lo* :math:`\le` value diff --git a/src/compute_reduce_region.cpp b/src/compute_reduce_region.cpp index 2f5a3de675..d0a32b8adf 100644 --- a/src/compute_reduce_region.cpp +++ b/src/compute_reduce_region.cpp @@ -35,13 +35,15 @@ static constexpr double BIG = 1.0e20; ComputeReduceRegion::ComputeReduceRegion(LAMMPS *lmp, int narg, char **arg) : ComputeReduce(lmp, narg, arg) { + if (input_mode == LOCAL) + error->all(FLERR,"Compute reduce/region cannot use local data as input"); } /* ---------------------------------------------------------------------- calculate reduced value for one input M and return it if flag = -1: sum/min/max/ave all values in vector - for per-atom quantities, limit to atoms in group and region + limit to atoms in group and region if mode = MIN or MAX, also set index to which vector value wins if flag >= 0: simply return vector[flag] ------------------------------------------------------------------------- */ @@ -59,6 +61,7 @@ double ComputeReduceRegion::compute_one(int m, int flag) // initialization in case it has not yet been run, e.g. when // the compute was invoked right after it has been created + if ((val.which == ArgInfo::COMPUTE) || (val.which == ArgInfo::FIX)) { if (val.val.c == nullptr) init(); } @@ -99,52 +102,29 @@ double ComputeReduceRegion::compute_one(int m, int flag) // invoke compute if not previously invoked } else if (val.which == ArgInfo::COMPUTE) { - if (input_mode == PERATOM) { - if (!(val.val.c->invoked_flag & Compute::INVOKED_PERATOM)) { - val.val.c->compute_peratom(); - val.val.c->invoked_flag |= Compute::INVOKED_PERATOM; - } - if (aidx == 0) { - double *compute_vector = val.val.c->vector_atom; - if (flag < 0) { - for (int i = 0; i < nlocal; i++) - if (mask[i] & groupbit && region->match(x[i][0], x[i][1], x[i][2])) - combine(one, compute_vector[i], i); - } else - one = compute_vector[flag]; - } else { - double **compute_array = val.val.c->array_atom; - int aidxm1 = aidx - 1; - if (flag < 0) { - for (int i = 0; i < nlocal; i++) - if (mask[i] & groupbit && region->match(x[i][0], x[i][1], x[i][2])) - combine(one, compute_array[i][aidxm1], i); - } else - one = compute_array[flag][aidxm1]; - } + if (!(val.val.c->invoked_flag & Compute::INVOKED_PERATOM)) { + val.val.c->compute_peratom(); + val.val.c->invoked_flag |= Compute::INVOKED_PERATOM; + } - } else if (input_mode == LOCAL) { - if (!(val.val.c->invoked_flag & Compute::INVOKED_LOCAL)) { - val.val.c->compute_local(); - val.val.c->invoked_flag |= Compute::INVOKED_LOCAL; - } - - if (aidx == 0) { - double *compute_vector = val.val.c->vector_local; - if (flag < 0) - for (int i = 0; i < val.val.c->size_local_rows; i++) combine(one, compute_vector[i], i); - else - one = compute_vector[flag]; - } else { - double **compute_array = val.val.c->array_local; - int aidxm1 = aidx - 1; - if (flag < 0) - for (int i = 0; i < val.val.c->size_local_rows; i++) + if (aidx == 0) { + double *compute_vector = val.val.c->vector_atom; + if (flag < 0) { + for (int i = 0; i < nlocal; i++) + if (mask[i] & groupbit && region->match(x[i][0], x[i][1], x[i][2])) + combine(one, compute_vector[i], i); + } else + one = compute_vector[flag]; + } else { + double **compute_array = val.val.c->array_atom; + int aidxm1 = aidx - 1; + if (flag < 0) { + for (int i = 0; i < nlocal; i++) + if (mask[i] & groupbit && region->match(x[i][0], x[i][1], x[i][2])) combine(one, compute_array[i][aidxm1], i); - else - one = compute_array[flag][aidxm1]; - } + } else + one = compute_array[flag][aidxm1]; } // check if fix frequency is a match @@ -153,45 +133,26 @@ double ComputeReduceRegion::compute_one(int m, int flag) if (update->ntimestep % val.val.f->peratom_freq) error->all(FLERR, "Fix {} used in compute {} not computed at compatible time", val.id, style); - if (input_mode == PERATOM) { - if (aidx == 0) { - double *fix_vector = val.val.f->vector_atom; - if (flag < 0) { - for (int i = 0; i < nlocal; i++) - if (mask[i] & groupbit && region->match(x[i][0], x[i][1], x[i][2])) - combine(one, fix_vector[i], i); - } else - one = fix_vector[flag]; - } else { - double **fix_array = val.val.f->array_atom; - int aidxm1 = aidx - 1; - if (flag < 0) { - for (int i = 0; i < nlocal; i++) - if (mask[i] & groupbit && region->match(x[i][0], x[i][1], x[i][2])) - combine(one, fix_array[i][aidxm1], i); - } else - one = fix_array[flag][aidxm1]; - } - - } else if (input_mode == LOCAL) { - if (aidx == 0) { - double *fix_vector = val.val.f->vector_local; - if (flag < 0) - for (int i = 0; i < val.val.f->size_local_rows; i++) combine(one, fix_vector[i], i); - else - one = fix_vector[flag]; - } else { - double **fix_array = val.val.f->array_local; - int aidxm1 = aidx - 1; - if (flag < 0) - for (int i = 0; i < val.val.f->size_local_rows; i++) + if (aidx == 0) { + double *fix_vector = val.val.f->vector_atom; + if (flag < 0) { + for (int i = 0; i < nlocal; i++) + if (mask[i] & groupbit && region->match(x[i][0], x[i][1], x[i][2])) + combine(one, fix_vector[i], i); + } else + one = fix_vector[flag]; + } else { + double **fix_array = val.val.f->array_atom; + int aidxm1 = aidx - 1; + if (flag < 0) { + for (int i = 0; i < nlocal; i++) + if (mask[i] & groupbit && region->match(x[i][0], x[i][1], x[i][2])) combine(one, fix_array[i][aidxm1], i); - else - one = fix_array[flag][aidxm1]; - } + } else + one = fix_array[flag][aidxm1]; } - // evaluate atom-style variable + // evaluate atom-style variable } else if (val.which == ArgInfo::VARIABLE) { if (atom->nmax > maxatom) { @@ -220,25 +181,11 @@ bigint ComputeReduceRegion::count(int m) if (val.which == ArgInfo::X || val.which == ArgInfo::V || val.which == ArgInfo::F) return group->count(igroup, region); - else if (val.which == ArgInfo::COMPUTE) { - if (input_mode == PERATOM) { - return group->count(igroup, region); - } else if (input_mode == LOCAL) { - bigint ncount = val.val.c->size_local_rows; - bigint ncountall; - MPI_Allreduce(&ncount, &ncountall, 1, MPI_DOUBLE, MPI_SUM, world); - return ncountall; - } - } else if (val.which == ArgInfo::FIX) { - if (input_mode == PERATOM) { - return group->count(igroup, region); - } else if (input_mode == LOCAL) { - bigint ncount = val.val.f->size_local_rows; - bigint ncountall; - MPI_Allreduce(&ncount, &ncountall, 1, MPI_DOUBLE, MPI_SUM, world); - return ncountall; - } - } else if (val.which == ArgInfo::VARIABLE) + else if (val.which == ArgInfo::COMPUTE) + return group->count(igroup, region); + else if (val.which == ArgInfo::FIX) + return group->count(igroup, region); + else if (val.which == ArgInfo::VARIABLE) return group->count(igroup, region); bigint dummy = 0; diff --git a/src/fix_ave_histo.cpp b/src/fix_ave_histo.cpp index 0a2975bb2e..4503ad56f4 100644 --- a/src/fix_ave_histo.cpp +++ b/src/fix_ave_histo.cpp @@ -164,7 +164,7 @@ FixAveHisto::FixAveHisto(LAMMPS *lmp, int narg, char **arg) : } // check input args for kind consistency - // all inputs must all be global, per-atom, or local + // inputs must all be all either global, per-atom, or local if (nevery <= 0) error->all(FLERR,"Illegal {} nevery value: {}", mycmd, nevery); From aad232ffc64240a24f5421c46df0a5d84aceff0a Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 22 Aug 2023 11:46:57 -0400 Subject: [PATCH 051/219] fix typo --- src/variable.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/variable.cpp b/src/variable.cpp index ce8f16cd68..f3c987f00c 100644 --- a/src/variable.cpp +++ b/src/variable.cpp @@ -1997,7 +1997,7 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) // scalar from internal-style variable // access value directly - if (style[ivar] = INTERNAL) { + if (style[ivar] == INTERNAL) { value1 = dvalue[ivar]; if (tree) { From 7d9c068da09d8135c2e672f2de21b1ed20f4510d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 22 Aug 2023 11:50:54 -0400 Subject: [PATCH 052/219] whitespace --- src/VORONOI/compute_voronoi_atom.cpp | 12 +++---- src/compute_reduce.cpp | 8 ++--- src/compute_reduce_region.cpp | 2 +- src/variable.cpp | 54 ++++++++++++++-------------- 4 files changed, 38 insertions(+), 38 deletions(-) diff --git a/src/VORONOI/compute_voronoi_atom.cpp b/src/VORONOI/compute_voronoi_atom.cpp index eb4f53986f..b4f1aa3055 100644 --- a/src/VORONOI/compute_voronoi_atom.cpp +++ b/src/VORONOI/compute_voronoi_atom.cpp @@ -391,13 +391,13 @@ void ComputeVoronoi::checkOccupation() int i, j, k; double rx, ry, rz; - + int nlocal = atom->nlocal; int nall = atom->nghost + nlocal; double **x = atom->x; // prepare destination buffer for variable evaluation - + if (atom->nmax > lmax) { memory->destroy(lnext); lmax = atom->nmax; @@ -432,7 +432,7 @@ void ComputeVoronoi::checkOccupation() } // MPI sum occupation - + #ifdef NOTINPLACE memcpy(sendocc, occvec, oldnatoms*sizeof(*occvec)); MPI_Allreduce(sendocc, occvec, oldnatoms, MPI_INT, MPI_SUM, world); @@ -441,7 +441,7 @@ void ComputeVoronoi::checkOccupation() #endif // determine the total number of atoms in this atom's currently occupied cell - + int c; for (i=0; itag[i]; if (mytag > oldmaxtag) @@ -479,7 +479,7 @@ void ComputeVoronoi::checkOccupation() void ComputeVoronoi::loopCells() { // invoke voro++ and fetch results for owned atoms in group - + voronoicell_neighbor c; int i; if (faces_flag) nfaces = 0; diff --git a/src/compute_reduce.cpp b/src/compute_reduce.cpp index 8565ddb1c9..24fdc4a991 100644 --- a/src/compute_reduce.cpp +++ b/src/compute_reduce.cpp @@ -40,7 +40,7 @@ enum{UNDECIDED,PERATOM,LOCAL}; // same as in ComputeReduceRegion void abs_max(void *in, void *inout, int * /*len*/, MPI_Datatype * /*type*/) { // r is the already reduced value, n is the new value - + double n = std::fabs(*(double *) in), r = *(double *) inout; double m; @@ -55,7 +55,7 @@ void abs_max(void *in, void *inout, int * /*len*/, MPI_Datatype * /*type*/) void abs_min(void *in, void *inout, int * /*len*/, MPI_Datatype * /*type*/) { // r is the already reduced value, n is the new value - + double n = std::fabs(*(double *) in), r = *(double *) inout; double m; @@ -270,7 +270,7 @@ ComputeReduce::ComputeReduce(LAMMPS *lmp, int narg, char **arg) : error->all(FLERR, "Compute {} compute {} does not calculate a per-atom array", style, val.id); if (val.argindex && val.argindex > val.val.c->size_peratom_cols) error->all(FLERR, "Compute {} compute {} array is accessed out-of-range", style, val.id); - + } else if (input_mode == LOCAL) { if (!val.val.c->peratom_flag) error->all(FLERR, "Compute {} compute {} does not calculate local values", style, val.id); @@ -295,7 +295,7 @@ ComputeReduce::ComputeReduce(LAMMPS *lmp, int narg, char **arg) : error->all(FLERR, "Compute {} fix {} does not calculate a per-atom array", style, val.id); if (val.argindex && (val.argindex > val.val.f->size_peratom_cols)) error->all(FLERR, "Compute {} fix {} array is accessed out-of-range", style, val.id); - + } else if (input_mode == LOCAL) { if (!val.val.f->local_flag) error->all(FLERR, "Compute {} fix {} does not calculate local values", style, val.id); diff --git a/src/compute_reduce_region.cpp b/src/compute_reduce_region.cpp index d0a32b8adf..15280af544 100644 --- a/src/compute_reduce_region.cpp +++ b/src/compute_reduce_region.cpp @@ -61,7 +61,7 @@ double ComputeReduceRegion::compute_one(int m, int flag) // initialization in case it has not yet been run, e.g. when // the compute was invoked right after it has been created - + if ((val.which == ArgInfo::COMPUTE) || (val.which == ArgInfo::FIX)) { if (val.val.c == nullptr) init(); } diff --git a/src/variable.cpp b/src/variable.cpp index f3c987f00c..264dcf6258 100644 --- a/src/variable.cpp +++ b/src/variable.cpp @@ -1502,7 +1502,7 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) // equal-style variable is being evaluated if (style[ivar] == EQUAL) { - + // c_ID = scalar from global scalar if (lowercase && nbracket == 0) { @@ -1588,7 +1588,7 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) // C_ID[i][j] = scalar element of per-atom array, note uppercase "C" } else if (!lowercase && nbracket == 2) { - + if (!compute->peratom_flag) print_var_error(FLERR,"Mismatched compute in variable formula",ivar); if (!compute->size_peratom_cols) @@ -1612,13 +1612,13 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) tree,treestack,ntreestack,argstack,nargstack); // no other possibilities for equal-style variable, so error - + } else print_var_error(FLERR,"Mismatched compute in variable formula",ivar); // vector-style variable is being evaluated } else if (style[ivar] == VECTOR) { - + // c_ID = vector from global vector if (lowercase && nbracket == 0) { @@ -1641,7 +1641,7 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) newtree->nvector = compute->size_vector; newtree->nstride = 1; treestack[ntreestack++] = newtree; - + // c_ID[i] = vector from global array } else if (lowercase && nbracket == 1) { @@ -1666,15 +1666,15 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) newtree->nvector = compute->size_array_rows; newtree->nstride = compute->size_array_cols; treestack[ntreestack++] = newtree; - + // no other possibilities for vector-style variable, so error - + } else print_var_error(FLERR,"Mismatched compute in variable formula",ivar); // atom-style variable is being evaluated } else if (style[ivar] == ATOM) { - + // c_ID = vector from per-atom vector if (lowercase && nbracket == 0) { @@ -1696,7 +1696,7 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) newtree->array = compute->vector_atom; newtree->nstride = 1; treestack[ntreestack++] = newtree; - + // c_ID[i] = vector from per-atom array } else if (lowercase && nbracket == 1) { @@ -1724,10 +1724,10 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) treestack[ntreestack++] = newtree; // no other possibilities for atom-style variable, so error - + } else print_var_error(FLERR,"Mismatched compute in variable formula",ivar); } - + // ---------------- // fix // ---------------- @@ -1770,7 +1770,7 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) // equal-style variable is being evaluated if (style[ivar] == EQUAL) { - + // f_ID = scalar from global scalar if (lowercase && nbracket == 0) { @@ -1826,14 +1826,14 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) if (update->whichflag > 0 && update->ntimestep % fix->peratom_freq) print_var_error(FLERR,"Fix in variable not computed at a compatible time",ivar); - + peratom2global(1,nullptr,fix->vector_atom,1,index1,tree, treestack,ntreestack,argstack,nargstack); // F_ID[i][j] = scalar element of per-atom array, note uppercase "F" } else if (!lowercase && nbracket == 2) { - + if (!fix->peratom_flag) print_var_error(FLERR,"Mismatched fix in variable formula",ivar); if (!fix->size_peratom_cols) @@ -1852,13 +1852,13 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) tree,treestack,ntreestack,argstack,nargstack); // no other possibilities for equal-style variable, so error - + } else print_var_error(FLERR,"Mismatched fix in variable formula",ivar); // vector-style variable is being evaluated } else if (style[ivar] == VECTOR) { - + // f_ID = vector from global vector if (lowercase && nbracket == 0) { @@ -1875,7 +1875,7 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) memory->create(vec,nvec,"variable:values"); for (int m = 0; m < nvec; m++) vec[m] = fix->compute_vector(m); - + auto newtree = new Tree(); newtree->type = VECTORARRAY; newtree->array = vec; @@ -1883,7 +1883,7 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) newtree->nstride = 1; newtree->selfalloc = 1; treestack[ntreestack++] = newtree; - + // f_ID[i] = vector from global array } else if (lowercase && nbracket == 1) { @@ -1910,15 +1910,15 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) newtree->nstride = 1; newtree->selfalloc = 1; treestack[ntreestack++] = newtree; - + // no other possibilities for vector-style variable, so error - + } else print_var_error(FLERR,"Mismatched fix in variable formula",ivar); // atom-style variable is being evaluated } else if (style[ivar] == ATOM) { - + // f_ID = vector from per-atom vector if (lowercase && nbracket == 0) { @@ -1935,7 +1935,7 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) newtree->array = fix->vector_atom; newtree->nstride = 1; treestack[ntreestack++] = newtree; - + // f_ID[i] = vector from per-atom array } else if (lowercase && nbracket == 1) { @@ -1958,7 +1958,7 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) treestack[ntreestack++] = newtree; // no other possibilities for atom-style variable, so error - + } else print_var_error(FLERR,"Mismatched fix in variable formula",ivar); } @@ -2053,21 +2053,21 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) print_var_error(FLERR,"Atom-style variable in equal-style variable formula",ivar); if (treetype == VECTOR) print_var_error(FLERR,"Atom-style variable in vector-style variable formula",ivar); - + Tree *newtree = nullptr; evaluate(data[ivar][0],&newtree,ivar); treestack[ntreestack++] = newtree; // vector from atomfile-style variable // point to the values in FixStore instance - + } else if (style[ivar] == ATOMFILE) { if (tree == nullptr) print_var_error(FLERR,"Atomfile-style variable in equal-style variable formula",ivar); if (treetype == VECTOR) print_var_error(FLERR,"Atomfile-style variable in vector-style variable formula",ivar); - + auto newtree = new Tree(); newtree->type = ATOMARRAY; newtree->array = reader[ivar]->fixstore->vstore; @@ -2121,7 +2121,7 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) tree,treestack,ntreestack,argstack,nargstack); // no other possibilities for variable with one bracket - + } else print_var_error(FLERR,"Mismatched variable in variable formula",ivar); } From ffe291b7934188dc3901534b5ce9d75bf04042c6 Mon Sep 17 00:00:00 2001 From: Trung Nguyen Date: Tue, 22 Aug 2023 15:28:28 -0500 Subject: [PATCH 053/219] Fixed bugs with the memory allocation for xoriginal --- src/KOKKOS/fix_spring_self_kokkos.cpp | 20 ++++++++++++++------ src/KOKKOS/fix_spring_self_kokkos.h | 2 ++ 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/KOKKOS/fix_spring_self_kokkos.cpp b/src/KOKKOS/fix_spring_self_kokkos.cpp index 8a576e2dea..e8aa07240f 100644 --- a/src/KOKKOS/fix_spring_self_kokkos.cpp +++ b/src/KOKKOS/fix_spring_self_kokkos.cpp @@ -39,19 +39,29 @@ FixSpringSelfKokkos::FixSpringSelfKokkos(LAMMPS *lmp, int narg, char { kokkosable = 1; exchange_comm_device = 1; - maxexchange = 6; atomKK = (AtomKokkos *) atom; execution_space = ExecutionSpaceFromDevice::space; datamask_read = EMPTY_MASK; datamask_modify = EMPTY_MASK; - memory->destroy(xoriginal); + xoriginal_tmp = xoriginal; + xoriginal = nullptr; int nmax = atom->nmax; grow_arrays(nmax); - d_count = typename AT::t_int_scalar("fix_shake:count"); + for (int i = 0; i < atom->nlocal; i++) { + k_xoriginal.h_view(i,0) = xoriginal_tmp[i][0]; + k_xoriginal.h_view(i,1) = xoriginal_tmp[i][1]; + k_xoriginal.h_view(i,2) = xoriginal_tmp[i][2]; + } + + k_xoriginal.modify_host(); + + d_count = typename AT::t_int_scalar("spring/self:count"); h_count = Kokkos::create_mirror_view(d_count); + + memory->destroy(xoriginal_tmp); } /* ---------------------------------------------------------------------- */ @@ -81,18 +91,16 @@ void FixSpringSelfKokkos::init() template void FixSpringSelfKokkos::post_force(int /*vflag*/) { - atomKK->sync(execution_space, X_MASK | F_MASK | MASK_MASK); + atomKK->sync(execution_space, X_MASK | F_MASK | IMAGE_MASK | MASK_MASK); x = atomKK->k_x.view(); f = atomKK->k_f.view(); image = atomKK->k_image.view(); mask = atomKK->k_mask.view(); - int nlocal = atom->nlocal; double espring_kk; - copymode = 1; //Kokkos::parallel_reduce(Kokkos::RangePolicy(0,nlocal),*this, espring_kk); { diff --git a/src/KOKKOS/fix_spring_self_kokkos.h b/src/KOKKOS/fix_spring_self_kokkos.h index 30b9eaf40a..99fe435d88 100644 --- a/src/KOKKOS/fix_spring_self_kokkos.h +++ b/src/KOKKOS/fix_spring_self_kokkos.h @@ -84,6 +84,8 @@ class FixSpringSelfKokkos : public FixSpringSelf, public KokkosBase { typename AT::t_int_scalar d_count; HAT::t_int_scalar h_count; + double **xoriginal_tmp; // original coords of atoms + }; template From dd6b847a5c6f88b24904c74f1a84ae4354400cb5 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 22 Aug 2023 16:29:14 -0400 Subject: [PATCH 054/219] mention that "peratom" is no longer required and was removed --- doc/src/compute_voronoi_atom.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/doc/src/compute_voronoi_atom.rst b/doc/src/compute_voronoi_atom.rst index 3e67bb6cbf..37e5386341 100644 --- a/doc/src/compute_voronoi_atom.rst +++ b/doc/src/compute_voronoi_atom.rst @@ -190,6 +190,10 @@ Voro++ software in the src/VORONOI/README file. Output info """"""""""" +.. deprecated:: TBD + + The *peratom* keyword was removed as it is no longer required. + This compute calculates a per-atom array with two columns. In regular dynamic tessellation mode the first column is the Voronoi volume, the second is the neighbor count, as described above (read above for the From ad33a018f48f228f4d4b9f5815c85a93bd25663f Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Tue, 22 Aug 2023 15:52:47 -0600 Subject: [PATCH 055/219] update variable syntax in several example input scripts --- examples/snap/in.snap.compute | 2 +- examples/snap/in.snap.compute.quadratic | 2 +- examples/voronoi/in.voronoi | 8 ++++---- examples/voronoi/in.voronoi.data | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/examples/snap/in.snap.compute b/examples/snap/in.snap.compute index b0c7314882..8d2ffe8b96 100644 --- a/examples/snap/in.snap.compute +++ b/examples/snap/in.snap.compute @@ -70,7 +70,7 @@ compute bsum2 snapgroup2 reduce sum c_b[*] # fix bsum2 all ave/time 1 1 1 c_bsum2 file bsum2.dat mode vector compute vbsum all reduce sum c_vb[*] # fix vbsum all ave/time 1 1 1 c_vbsum file vbsum.dat mode vector -variable db_2_25 equal c_db[2][25] +variable db_2_25 equal C_db[2][25] # set up compute snap generating global array diff --git a/examples/snap/in.snap.compute.quadratic b/examples/snap/in.snap.compute.quadratic index e03d4af3bf..20d5ed3039 100644 --- a/examples/snap/in.snap.compute.quadratic +++ b/examples/snap/in.snap.compute.quadratic @@ -70,7 +70,7 @@ compute bsum2 snapgroup2 reduce sum c_b[*] # fix bsum2 all ave/time 1 1 1 c_bsum2 file bsum2.dat mode vector compute vbsum all reduce sum c_vb[*] # fix vbsum all ave/time 1 1 1 c_vbsum file vbsum.dat mode vector -variable db_2_100 equal c_db[2][100] +variable db_2_100 equal C_db[2][100] # set up compute snap generating global array diff --git a/examples/voronoi/in.voronoi b/examples/voronoi/in.voronoi index 5254969fbd..79b6c6efec 100644 --- a/examples/voronoi/in.voronoi +++ b/examples/voronoi/in.voronoi @@ -146,10 +146,10 @@ variable i2 equal 257 compute v1 all voronoi/atom occupation compute r0 all reduce sum c_v1[1] compute r1 all reduce sum c_v1[2] -variable d5a equal c_v1[${i1}][1] -variable d5b equal c_v1[${i2}][1] -variable d5c equal c_v1[${i1}][2] -variable d5d equal c_v1[${i2}][2] +variable d5a equal C_v1[${i1}][1] +variable d5b equal C_v1[${i2}][1] +variable d5c equal C_v1[${i1}][2] +variable d5d equal C_v1[${i2}][2] thermo_style custom c_r0 c_r1 v_d5a v_d5b v_d5c v_d5d run 0 diff --git a/examples/voronoi/in.voronoi.data b/examples/voronoi/in.voronoi.data index 853c2c2bd1..da00b44e09 100644 --- a/examples/voronoi/in.voronoi.data +++ b/examples/voronoi/in.voronoi.data @@ -67,7 +67,7 @@ undump dlocal # local and global quantities, but # not per-atom quantities -compute v2 all voronoi/atom neighbors yes edge_histo 6 peratom no +compute v2 all voronoi/atom neighbors yes edge_histo 6 # write voronoi local quantities to a file @@ -75,7 +75,7 @@ dump d2 all local 1 dump.neighbors2 index c_v2[1] c_v2[2] c_v2[3] # sum up a voronoi local quantity -compute sumarea all reduce sum c_v2[3] +compute sumarea all reduce sum c_v2[3] inputs local # output voronoi global quantities From 71ca6ee47ca24e0db97e0137b2ad293d33e95647 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Tue, 22 Aug 2023 16:02:28 -0600 Subject: [PATCH 056/219] fix one more example input script --- examples/voronoi/in.voronoi.data | 7 +------ src/compute_reduce.cpp | 3 +-- src/compute_reduce.h | 2 +- src/compute_reduce_region.cpp | 2 -- 4 files changed, 3 insertions(+), 11 deletions(-) diff --git a/examples/voronoi/in.voronoi.data b/examples/voronoi/in.voronoi.data index da00b44e09..e5d925c498 100644 --- a/examples/voronoi/in.voronoi.data +++ b/examples/voronoi/in.voronoi.data @@ -63,9 +63,7 @@ undump dlocal # TEST 2: # -# This compute voronoi generates -# local and global quantities, but -# not per-atom quantities +# This compute voronoi generates peratom and local and global quantities compute v2 all voronoi/atom neighbors yes edge_histo 6 @@ -83,6 +81,3 @@ thermo_style custom c_sumarea c_v2[3] c_v2[4] c_v2[5] c_v2[6] c_v2[7] thermo 1 run 0 - - - diff --git a/src/compute_reduce.cpp b/src/compute_reduce.cpp index 24fdc4a991..5983445517 100644 --- a/src/compute_reduce.cpp +++ b/src/compute_reduce.cpp @@ -31,8 +31,6 @@ using namespace LAMMPS_NS; -enum{UNDECIDED,PERATOM,LOCAL}; // same as in ComputeReduceRegion - #define BIG 1.0e20 //---------------------------------------------------------------- @@ -232,6 +230,7 @@ ComputeReduce::ComputeReduce(LAMMPS *lmp, int narg, char **arg) : error->all(FLERR,"Compute {} inputs must be all peratom or all local"); input_mode = LOCAL; } + iarg += 2; } else error->all(FLERR, "Unknown compute {} keyword: {}", style, arg[iarg]); } diff --git a/src/compute_reduce.h b/src/compute_reduce.h index f8b652e00c..64322bc6ac 100644 --- a/src/compute_reduce.h +++ b/src/compute_reduce.h @@ -27,7 +27,7 @@ namespace LAMMPS_NS { class ComputeReduce : public Compute { public: enum { SUM, SUMSQ, SUMABS, MINN, MAXX, AVE, AVESQ, AVEABS, MINABS, MAXABS }; - enum { PERATOM, LOCAL }; + enum { UNDECIDED, PERATOM, LOCAL }; ComputeReduce(class LAMMPS *, int, char **); ~ComputeReduce() override; diff --git a/src/compute_reduce_region.cpp b/src/compute_reduce_region.cpp index 15280af544..bd850e902c 100644 --- a/src/compute_reduce_region.cpp +++ b/src/compute_reduce_region.cpp @@ -26,8 +26,6 @@ using namespace LAMMPS_NS; -enum{UNDECIDED,PERATOM,LOCAL}; // same as in ComputeReduce - static constexpr double BIG = 1.0e20; /* ---------------------------------------------------------------------- */ From 17dd04b4dea143fe271188b235edbe13e473956e Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Tue, 22 Aug 2023 16:22:57 -0600 Subject: [PATCH 057/219] tweak variable doc page --- doc/src/variable.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/src/variable.rst b/doc/src/variable.rst index 4541de5fa2..f1a316da1f 100644 --- a/doc/src/variable.rst +++ b/doc/src/variable.rst @@ -1179,7 +1179,7 @@ table: | equal | c_ID[I] | element of global vector | | equal | c_ID[I][J] | element of global array | | equal | C_ID[I] | element of per-atom vector (I = atom ID) | -| equal | C_ID{i}[J] | element of per-atom array (I = atom ID) | +| equal | C_ID[I][J] | element of per-atom array (I = atom ID) | +--------+------------+------------------------------------------+ | vector | c_ID | global vector | | vector | c_ID[I] | column of global array | @@ -1243,7 +1243,7 @@ and atom-style variables are listed in the following table: | equal | f_ID[I] | element of global vector | | equal | f_ID[I][J] | element of global array | | equal | F_ID[I] | element of per-atom vector (I = atom ID) | -| equal | F_ID{i}[J] | element of per-atom array (I = atom ID) | +| equal | F_ID[I][J] | element of per-atom array (I = atom ID) | +--------+------------+------------------------------------------+ | vector | f_ID | global vector | | vector | f_ID[I] | column of global array | From 3e22eb83555a484388a433b20be14203dcbb4269 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Tue, 22 Aug 2023 16:40:25 -0600 Subject: [PATCH 058/219] adjust version date --- src/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/version.h b/src/version.h index 572a274053..35780aa785 100644 --- a/src/version.h +++ b/src/version.h @@ -1,2 +1,2 @@ -#define LAMMPS_VERSION "2 Aug 2023" +#define LAMMPS_VERSION "3 Aug 2023" #define LAMMPS_UPDATE "Development" From e6b98f5942856c11ec34b3206ee59cb175a8dc83 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Wed, 23 Aug 2023 09:47:36 -0600 Subject: [PATCH 059/219] fix logic issue in compute reduce --- src/compute_reduce.cpp | 23 ++++++----------------- src/compute_reduce.h | 2 +- 2 files changed, 7 insertions(+), 18 deletions(-) diff --git a/src/compute_reduce.cpp b/src/compute_reduce.cpp index 5983445517..5385554f33 100644 --- a/src/compute_reduce.cpp +++ b/src/compute_reduce.cpp @@ -133,8 +133,6 @@ ComputeReduce::ComputeReduce(LAMMPS *lmp, int narg, char **arg) : // parse values - input_mode = UNDECIDED; - values.clear(); nvalues = 0; for (int iarg = 0; iarg < nargnew; ++iarg) { @@ -144,41 +142,32 @@ ComputeReduce::ComputeReduce(LAMMPS *lmp, int narg, char **arg) : val.val.c = nullptr; if (strcmp(arg[iarg], "x") == 0) { - input_mode = PERATOM; val.which = ArgInfo::X; val.argindex = 0; } else if (strcmp(arg[iarg], "y") == 0) { - input_mode = PERATOM; val.which = ArgInfo::X; val.argindex = 1; } else if (strcmp(arg[iarg], "z") == 0) { - input_mode = PERATOM; val.which = ArgInfo::X; val.argindex = 2; } else if (strcmp(arg[iarg], "vx") == 0) { - input_mode = PERATOM; val.which = ArgInfo::V; val.argindex = 0; } else if (strcmp(arg[iarg], "vy") == 0) { - input_mode = PERATOM; val.which = ArgInfo::V; val.argindex = 1; } else if (strcmp(arg[iarg], "vz") == 0) { - input_mode = PERATOM; val.which = ArgInfo::V; val.argindex = 2; } else if (strcmp(arg[iarg], "fx") == 0) { - input_mode = PERATOM; val.which = ArgInfo::F; val.argindex = 0; } else if (strcmp(arg[iarg], "fy") == 0) { - input_mode = PERATOM; val.which = ArgInfo::F; val.argindex = 1; } else if (strcmp(arg[iarg], "fz") == 0) { - input_mode = PERATOM; val.which = ArgInfo::F; val.argindex = 2; @@ -203,6 +192,7 @@ ComputeReduce::ComputeReduce(LAMMPS *lmp, int narg, char **arg) : nvalues = values.size(); replace = new int[nvalues]; for (int i = 0; i < nvalues; ++i) replace[i] = -1; + input_mode = PERATOM; std::string mycmd = "compute "; mycmd += style; @@ -225,11 +215,7 @@ ComputeReduce::ComputeReduce(LAMMPS *lmp, int narg, char **arg) : } else if (strcmp(arg[iarg], "inputs") == 0) { if (iarg + 2 > narg) utils::missing_cmd_args(FLERR, mycmd + " inputs", error); if (strcmp(arg[iarg+1], "peratom") == 0) input_mode = PERATOM; - else if (strcmp(arg[iarg+1], "local") == 0) { - if (input_mode == PERATOM) - error->all(FLERR,"Compute {} inputs must be all peratom or all local"); - input_mode = LOCAL; - } + else if (strcmp(arg[iarg+1], "local") == 0) input_mode = LOCAL; iarg += 2; } else error->all(FLERR, "Unknown compute {} keyword: {}", style, arg[iarg]); @@ -255,7 +241,10 @@ ComputeReduce::ComputeReduce(LAMMPS *lmp, int narg, char **arg) : // setup and error check for (auto &val : values) { - if (val.which == ArgInfo::COMPUTE) { + if (val.which == ArgInfo::X || val.which == ArgInfo::V || val.which == ArgInfo::F) { + if (input_mode == LOCAL) error->all(FLERR,"Compute {} inputs must be all local"); + + } else if (val.which == ArgInfo::COMPUTE) { val.val.c = modify->get_compute_by_id(val.id); if (!val.val.c) error->all(FLERR, "Compute ID {} for compute {} does not exist", val.id, style); diff --git a/src/compute_reduce.h b/src/compute_reduce.h index 64322bc6ac..f8b652e00c 100644 --- a/src/compute_reduce.h +++ b/src/compute_reduce.h @@ -27,7 +27,7 @@ namespace LAMMPS_NS { class ComputeReduce : public Compute { public: enum { SUM, SUMSQ, SUMABS, MINN, MAXX, AVE, AVESQ, AVEABS, MINABS, MAXABS }; - enum { UNDECIDED, PERATOM, LOCAL }; + enum { PERATOM, LOCAL }; ComputeReduce(class LAMMPS *, int, char **); ~ComputeReduce() override; From b4e7d5f0b9a2a8ce329dc5ca9fb383b9b1390861 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 23 Aug 2023 20:11:32 -0400 Subject: [PATCH 060/219] fix whitespace (again) --- src/compute_reduce.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compute_reduce.cpp b/src/compute_reduce.cpp index 5385554f33..3feabf2ec3 100644 --- a/src/compute_reduce.cpp +++ b/src/compute_reduce.cpp @@ -243,7 +243,7 @@ ComputeReduce::ComputeReduce(LAMMPS *lmp, int narg, char **arg) : for (auto &val : values) { if (val.which == ArgInfo::X || val.which == ArgInfo::V || val.which == ArgInfo::F) { if (input_mode == LOCAL) error->all(FLERR,"Compute {} inputs must be all local"); - + } else if (val.which == ArgInfo::COMPUTE) { val.val.c = modify->get_compute_by_id(val.id); if (!val.val.c) From 6ccccb5d13bbb9f53033ba64c8beb646eba5ae3f Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 24 Aug 2023 09:27:17 -0400 Subject: [PATCH 061/219] add versionadded tag to new inputs keyword docs --- doc/src/compute_reduce.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/src/compute_reduce.rst b/doc/src/compute_reduce.rst index 4692e161b4..6820d2ee04 100644 --- a/doc/src/compute_reduce.rst +++ b/doc/src/compute_reduce.rst @@ -201,6 +201,8 @@ information in this context, the *replace* keywords will extract the atom IDs for the two atoms in the bond of maximum stretch. These atom IDs and the bond stretch will be printed with thermodynamic output. +.. versionadded:: TBD + The *inputs* keyword allows selection of whether all the inputs are per-atom or local quantities. As noted above, all the inputs must be the same kind (per-atom or local). Per-atom is the default setting. From 187bebb515081bf94e3e1b6ab431a8a4902ab3db Mon Sep 17 00:00:00 2001 From: Trung Nguyen Date: Thu, 24 Aug 2023 12:17:37 -0500 Subject: [PATCH 062/219] Working on fix spring/self/kk, something with missing host-device sync that causes force blowup --- src/KOKKOS/fix_efield_kokkos.cpp | 6 +++--- src/KOKKOS/fix_spring_self_kokkos.cpp | 28 +++++++++++++++++++++------ src/KOKKOS/fix_spring_self_kokkos.h | 7 ++++--- 3 files changed, 29 insertions(+), 12 deletions(-) diff --git a/src/KOKKOS/fix_efield_kokkos.cpp b/src/KOKKOS/fix_efield_kokkos.cpp index bbf106f515..8c4469095f 100644 --- a/src/KOKKOS/fix_efield_kokkos.cpp +++ b/src/KOKKOS/fix_efield_kokkos.cpp @@ -218,11 +218,11 @@ void FixEfieldKokkos::post_force(int /*vflag*/) auto fx = qtmp * l_ex; auto fy = qtmp * l_ey; auto fz = qtmp * l_ez; - if (l_xstyle == ATOM) l_f(i,0) += l_d_efield(i,0); + if (l_xstyle == ATOM) l_f(i,0) += qtmp * l_d_efield(i,0); else if (l_xstyle) l_f(i,0) += fx; - if (l_ystyle == ATOM) l_f(i,1) += l_d_efield(i,1); + if (l_ystyle == ATOM) l_f(i,1) += qtmp * l_d_efield(i,1); else if (l_ystyle) l_f(i,1) += fy; - if (l_zstyle == ATOM) l_f(i,2) += l_d_efield(i,2); + if (l_zstyle == ATOM) l_f(i,2) += qtmp * l_d_efield(i,2); else if (l_zstyle) l_f(i,2) += fz; fsum_kk.d0 -= fx * unwrap[0] + fy * unwrap[1] + fz * unwrap[2]; fsum_kk.d1 += fx; diff --git a/src/KOKKOS/fix_spring_self_kokkos.cpp b/src/KOKKOS/fix_spring_self_kokkos.cpp index e8aa07240f..da1576f3ef 100644 --- a/src/KOKKOS/fix_spring_self_kokkos.cpp +++ b/src/KOKKOS/fix_spring_self_kokkos.cpp @@ -108,16 +108,17 @@ void FixSpringSelfKokkos::post_force(int /*vflag*/) auto prd = Few(domain->prd); auto h = Few(domain->h); auto triclinic = domain->triclinic; - auto l_xflag = xflag; - auto l_yflag = yflag; - auto l_zflag = zflag; auto l_k = k; - auto l_x = x; auto l_xoriginal = d_xoriginal; + + auto l_x = x; auto l_f = f; auto l_mask = mask; auto l_image = image; auto l_groupbit = groupbit; + auto l_xflag = xflag; + auto l_yflag = yflag; + auto l_zflag = zflag; Kokkos::parallel_reduce(nlocal, LAMMPS_LAMBDA(const int& i, double& espring_kk) { if (l_mask[i] & l_groupbit) { @@ -154,10 +155,25 @@ void FixSpringSelfKokkos::post_force(int /*vflag*/) template void FixSpringSelfKokkos::grow_arrays(int nmax) { - memoryKK->grow_kokkos(k_xoriginal,xoriginal,nmax,3,"spring/self:xoriginal"); + memoryKK->grow_kokkos(k_xoriginal,xoriginal,nmax,"spring/self:xoriginal"); d_xoriginal = k_xoriginal.view(); } +/* ---------------------------------------------------------------------- + copy values within local atom-based arrays +------------------------------------------------------------------------- */ + +template +void FixSpringSelfKokkos::copy_arrays(int i, int j, int delflag) +{ + k_xoriginal.sync_host(); + + FixSpringSelf::copy_arrays(i,j,delflag); + + k_xoriginal.modify_host(); +} + + /* ---------------------------------------------------------------------- */ template @@ -202,7 +218,7 @@ int FixSpringSelfKokkos::pack_exchange_kokkos( d_exchange_sendlist = k_exchange_sendlist.view(); this->nsend = nsend; - + k_xoriginal.template sync(); Kokkos::deep_copy(d_count,0); diff --git a/src/KOKKOS/fix_spring_self_kokkos.h b/src/KOKKOS/fix_spring_self_kokkos.h index 99fe435d88..49233c4dcc 100644 --- a/src/KOKKOS/fix_spring_self_kokkos.h +++ b/src/KOKKOS/fix_spring_self_kokkos.h @@ -42,6 +42,7 @@ class FixSpringSelfKokkos : public FixSpringSelf, public KokkosBase { ~FixSpringSelfKokkos() override; void init() override; void grow_arrays(int) override; + void copy_arrays(int, int, int) override; void post_force(int) override; KOKKOS_INLINE_FUNCTION @@ -64,14 +65,14 @@ class FixSpringSelfKokkos : public FixSpringSelf, public KokkosBase { int unpack_exchange(int, double *) override; protected: - DAT::tdual_ffloat_2d k_xoriginal; - typename AT::t_ffloat_2d d_xoriginal; + DAT::tdual_x_array k_xoriginal; + typename AT::t_x_array d_xoriginal; typename AT::t_x_array_randomread x; typename AT::t_f_array f; typename AT::t_imageint_1d_randomread image; typename AT::t_int_1d_randomread mask; - + int nsend; typename AT::t_int_2d d_sendlist; From 58d60dfea04b7d3d2012d0c8639bc07a3ca819e0 Mon Sep 17 00:00:00 2001 From: Trung Nguyen Date: Sat, 26 Aug 2023 16:08:59 -0500 Subject: [PATCH 063/219] Fixed bugs with device sync for xoriginal --- src/KOKKOS/fix_spring_self_kokkos.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/KOKKOS/fix_spring_self_kokkos.cpp b/src/KOKKOS/fix_spring_self_kokkos.cpp index da1576f3ef..13ebb7de6f 100644 --- a/src/KOKKOS/fix_spring_self_kokkos.cpp +++ b/src/KOKKOS/fix_spring_self_kokkos.cpp @@ -101,8 +101,11 @@ void FixSpringSelfKokkos::post_force(int /*vflag*/) double espring_kk; + k_xoriginal.modify(); + k_xoriginal.sync(); + copymode = 1; - //Kokkos::parallel_reduce(Kokkos::RangePolicy(0,nlocal),*this, espring_kk); + { // local variables for lambda capture auto prd = Few(domain->prd); @@ -173,7 +176,6 @@ void FixSpringSelfKokkos::copy_arrays(int i, int j, int delflag) k_xoriginal.modify_host(); } - /* ---------------------------------------------------------------------- */ template From 4ef9f70bfe0ef7a408eff0584c793e2fb3ba64dc Mon Sep 17 00:00:00 2001 From: Trung Nguyen Date: Mon, 28 Aug 2023 09:43:00 -0500 Subject: [PATCH 064/219] Fixed whitespaces, added author info --- src/KOKKOS/fix_efield_kokkos.cpp | 4 ++++ src/KOKKOS/fix_spring_self_kokkos.cpp | 4 ++++ src/KOKKOS/fix_spring_self_kokkos.h | 2 +- 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/KOKKOS/fix_efield_kokkos.cpp b/src/KOKKOS/fix_efield_kokkos.cpp index 8c4469095f..ffe1c34e97 100644 --- a/src/KOKKOS/fix_efield_kokkos.cpp +++ b/src/KOKKOS/fix_efield_kokkos.cpp @@ -12,6 +12,10 @@ See the README file in the top-level LAMMPS directory. ------------------------------------------------------------------------- */ +/* ---------------------------------------------------------------------- + Contributing author: Trung Nguyen (U Chicago) +------------------------------------------------------------------------- */ + #include "fix_efield_kokkos.h" #include "atom_kokkos.h" diff --git a/src/KOKKOS/fix_spring_self_kokkos.cpp b/src/KOKKOS/fix_spring_self_kokkos.cpp index 13ebb7de6f..efd8a652ff 100644 --- a/src/KOKKOS/fix_spring_self_kokkos.cpp +++ b/src/KOKKOS/fix_spring_self_kokkos.cpp @@ -12,6 +12,10 @@ See the README file in the top-level LAMMPS directory. ------------------------------------------------------------------------- */ +/* ---------------------------------------------------------------------- + Contributing author: Trung Nguyen (U Chicago) +------------------------------------------------------------------------- */ + #include "fix_spring_self_kokkos.h" #include "atom_kokkos.h" diff --git a/src/KOKKOS/fix_spring_self_kokkos.h b/src/KOKKOS/fix_spring_self_kokkos.h index 49233c4dcc..b23e92249b 100644 --- a/src/KOKKOS/fix_spring_self_kokkos.h +++ b/src/KOKKOS/fix_spring_self_kokkos.h @@ -72,7 +72,7 @@ class FixSpringSelfKokkos : public FixSpringSelf, public KokkosBase { typename AT::t_f_array f; typename AT::t_imageint_1d_randomread image; typename AT::t_int_1d_randomread mask; - + int nsend; typename AT::t_int_2d d_sendlist; From b08abd4a809df5b12bf9e9abca796873742e5d75 Mon Sep 17 00:00:00 2001 From: Trung Nguyen Date: Mon, 28 Aug 2023 11:06:07 -0500 Subject: [PATCH 065/219] Updated Install.sh and cleaned up --- src/KOKKOS/Install.sh | 4 ++++ src/KOKKOS/pair_yukawa_colloid_kokkos.cpp | 9 ++++----- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/KOKKOS/Install.sh b/src/KOKKOS/Install.sh index 766daaff19..0a5bb398aa 100755 --- a/src/KOKKOS/Install.sh +++ b/src/KOKKOS/Install.sh @@ -127,6 +127,8 @@ action fix_dt_reset_kokkos.cpp action fix_dt_reset_kokkos.h action fix_enforce2d_kokkos.cpp action fix_enforce2d_kokkos.h +action fix_efield_kokkos.cpp +action fix_efield_kokkos.h action fix_eos_table_rx_kokkos.cpp fix_eos_table_rx.cpp action fix_eos_table_rx_kokkos.h fix_eos_table_rx.h action fix_freeze_kokkos.cpp fix_freeze.cpp @@ -171,6 +173,8 @@ action fix_shake_kokkos.cpp fix_shake.cpp action fix_shake_kokkos.h fix_shake.h action fix_shardlow_kokkos.cpp fix_shardlow.cpp action fix_shardlow_kokkos.h fix_shardlow.h +action fix_spring_self_kokkos.cpp +action fix_spring_self_kokkos.h action fix_viscous_kokkos.cpp action fix_viscous_kokkos.h action fix_wall_gran_kokkos.cpp fix_wall_gran.cpp diff --git a/src/KOKKOS/pair_yukawa_colloid_kokkos.cpp b/src/KOKKOS/pair_yukawa_colloid_kokkos.cpp index ca491a3800..04eb5ab657 100644 --- a/src/KOKKOS/pair_yukawa_colloid_kokkos.cpp +++ b/src/KOKKOS/pair_yukawa_colloid_kokkos.cpp @@ -210,7 +210,7 @@ void PairYukawaColloidKokkos::compute(int eflag_in, int vflag_in) } } - +/* ---------------------------------------------------------------------- */ template template @@ -227,11 +227,10 @@ compute_fpair(const F_FLOAT& rsq, const int& i, const int&j, const F_FLOAT aa = STACKPARAMS ? m_params[itype][jtype].a : params(itype,jtype).a; - // U = a * exp(-kappa*r-(radi+radj)) / kappa - // f = a * exp(-kappa*r) + // U = a * exp(-kappa*(r-(radi+radj))) / kappa + // f = -dU/dr = a * exp(-kappa*r) // f/r = a * exp(-kappa*r) / r const F_FLOAT rinv = 1.0 / rr; - const F_FLOAT rinv2 = rinv*rinv; const F_FLOAT screening = exp(-kappa*(rr-(radi+radj))); const F_FLOAT forceyukawa = aa * screening; const F_FLOAT fpair = forceyukawa * rinv; @@ -255,7 +254,7 @@ compute_evdwl(const F_FLOAT& rsq, const int& i, const int&j, const F_FLOAT offset = STACKPARAMS ? m_params[itype][jtype].offset : params(itype,jtype).offset; - // U = a * exp(-kappa*r) / kappa + // U = a * exp(-kappa*(r-(radi+radj))) / kappa const F_FLOAT rinv = 1.0 / rr; const F_FLOAT screening = exp(-kappa*(rr-(radi+radj))); From 67bcf75b74f34b4bd0037d47fade1a77fabc073a Mon Sep 17 00:00:00 2001 From: Trung Nguyen Date: Mon, 28 Aug 2023 23:18:05 -0500 Subject: [PATCH 066/219] Updated the corresponding doc pages with ".. index::" and added (k) to the commands in the overview pages --- doc/src/Commands_fix.rst | 4 ++-- doc/src/Commands_pair.rst | 2 +- doc/src/fix_efield.rst | 1 + doc/src/fix_spring_self.rst | 1 + doc/src/pair_yukawa_colloid.rst | 3 ++- 5 files changed, 7 insertions(+), 4 deletions(-) diff --git a/doc/src/Commands_fix.rst b/doc/src/Commands_fix.rst index 6fe321e3c9..a15e24e3e5 100644 --- a/doc/src/Commands_fix.rst +++ b/doc/src/Commands_fix.rst @@ -69,7 +69,7 @@ OPT. * :doc:`drude/transform/inverse ` * :doc:`dt/reset (k) ` * :doc:`edpd/source ` - * :doc:`efield ` + * :doc:`efield (k) ` * :doc:`efield/tip4p ` * :doc:`ehex ` * :doc:`electrode/conp (i) ` @@ -233,7 +233,7 @@ OPT. * :doc:`spring ` * :doc:`spring/chunk ` * :doc:`spring/rg ` - * :doc:`spring/self ` + * :doc:`spring/self (k) ` * :doc:`srd ` * :doc:`store/force ` * :doc:`store/state ` diff --git a/doc/src/Commands_pair.rst b/doc/src/Commands_pair.rst index c45a1d778c..b3d40717da 100644 --- a/doc/src/Commands_pair.rst +++ b/doc/src/Commands_pair.rst @@ -305,5 +305,5 @@ OPT. * :doc:`wf/cut ` * :doc:`ylz ` * :doc:`yukawa (gko) ` - * :doc:`yukawa/colloid (go) ` + * :doc:`yukawa/colloid (gko) ` * :doc:`zbl (gko) ` diff --git a/doc/src/fix_efield.rst b/doc/src/fix_efield.rst index e38e1e6894..c6ac3a0722 100644 --- a/doc/src/fix_efield.rst +++ b/doc/src/fix_efield.rst @@ -1,4 +1,5 @@ .. index:: fix efield +.. index:: fix efield/kk .. index:: fix efield/tip4p fix efield command diff --git a/doc/src/fix_spring_self.rst b/doc/src/fix_spring_self.rst index 6cf0a9e0e7..0def6d51f0 100644 --- a/doc/src/fix_spring_self.rst +++ b/doc/src/fix_spring_self.rst @@ -1,4 +1,5 @@ .. index:: fix spring/self +.. index:: fix spring/self/kk fix spring/self command ======================= diff --git a/doc/src/pair_yukawa_colloid.rst b/doc/src/pair_yukawa_colloid.rst index 6611ea04e4..96893f8e37 100644 --- a/doc/src/pair_yukawa_colloid.rst +++ b/doc/src/pair_yukawa_colloid.rst @@ -1,11 +1,12 @@ .. index:: pair_style yukawa/colloid .. index:: pair_style yukawa/colloid/gpu +.. index:: pair_style yukawa/colloid/kk .. index:: pair_style yukawa/colloid/omp pair_style yukawa/colloid command ================================= -Accelerator Variants: *yukawa/colloid/gpu*, *yukawa/colloid/omp* +Accelerator Variants: *yukawa/colloid/gpu*, *yukawa/colloid/kk*, *yukawa/colloid/omp* Syntax """""" From 1c10d0d495501234d64db307ab6c43e6fa54ba20 Mon Sep 17 00:00:00 2001 From: "W. Michael Brown" Date: Thu, 14 Sep 2023 17:11:51 -0400 Subject: [PATCH 067/219] Intel Package: Adding snap variant. --- src/INTEL/TEST/in.intel.snap | 70 ++ src/INTEL/TEST/run_benchmarks.sh | 2 +- src/INTEL/intel_simd.h | 161 ++++ src/INTEL/pair_snap_intel.cpp | 777 +++++++++++++++ src/INTEL/pair_snap_intel.h | 83 ++ src/INTEL/sna_intel.cpp | 1505 ++++++++++++++++++++++++++++++ src/INTEL/sna_intel.h | 187 ++++ 7 files changed, 2784 insertions(+), 1 deletion(-) create mode 100644 src/INTEL/TEST/in.intel.snap create mode 100644 src/INTEL/pair_snap_intel.cpp create mode 100644 src/INTEL/pair_snap_intel.h create mode 100644 src/INTEL/sna_intel.cpp create mode 100644 src/INTEL/sna_intel.h diff --git a/src/INTEL/TEST/in.intel.snap b/src/INTEL/TEST/in.intel.snap new file mode 100644 index 0000000000..4e45fe01f5 --- /dev/null +++ b/src/INTEL/TEST/in.intel.snap @@ -0,0 +1,70 @@ +# Toy demonstration of SNAP "scale" parameter, using fix/adapt and hybrid/overlay +# Mixing linear and quadratic SNAP Ni potentials by Zuo et al. JCPA 2020 + +variable w index 10 # Warmup Timesteps +variable t index 100 # Main Run Timesteps +variable m index 1 # Main Run Timestep Multiplier +variable n index 0 # Use NUMA Mapping for Multi-Node + +variable x index 4 +variable y index 2 +variable z index 2 + +variable rr equal floor($t*$m) +variable root getenv LMP_ROOT + +if "$n > 0" then "processors * * * grid numa" + +# mixing parameter + +variable lambda equal 0.2 + +# Initialize simulation + +variable a equal 3.52 +units metal + +# generate the box and atom positions using a FCC lattice +variable nx equal 20*$x +variable ny equal 20*$y +variable nz equal 20*$z + +boundary p p p + +lattice fcc $a +region box block 0 ${nx} 0 ${ny} 0 ${nz} +create_box 1 box +create_atoms 1 box + +mass 1 34. + +# choose bundled SNAP Ni potential from Zuo et al. JCPA 2020 +pair_style hybrid/overlay snap snap +pair_coeff * * snap 1 & + ${root}/examples/snap/Ni_Zuo_JPCA2020.snapcoeff & + ${root}/examples/snap/Ni_Zuo_JPCA2020.snapparam Ni +pair_coeff * * snap 2 & + ${root}/examples/snap/Ni_Zuo_JPCA2020.quadratic.snapcoeff & + ${root}/examples/snap/Ni_Zuo_JPCA2020.quadratic.snapparam Ni + +# scale according to mixing parameter +variable l1 equal ${lambda} +variable l2 equal 1.0-${lambda} +fix scale1 all adapt 1 pair snap:1 scale * * v_l1 +fix scale2 all adapt 1 pair snap:2 scale * * v_l2 + +# Setup output +thermo 1 +thermo_modify norm yes + +# Set up NVE run +timestep 0.5e-3 +neighbor 1.0 bin +neigh_modify every 1 delay 0 check yes + +# Run MD +velocity all create 300.0 4928459 loop geom +fix 1 all nve + +if "$w > 0" then "run $w" +run ${rr} diff --git a/src/INTEL/TEST/run_benchmarks.sh b/src/INTEL/TEST/run_benchmarks.sh index 82eb51c928..eeb9f07a11 100755 --- a/src/INTEL/TEST/run_benchmarks.sh +++ b/src/INTEL/TEST/run_benchmarks.sh @@ -35,7 +35,7 @@ export I_MPI_PIN_DOMAIN=core # End settings for your system ######################################################################### -export WORKLOADS="lj rhodo lc sw water eam airebo dpd tersoff" +export WORKLOADS="lj rhodo lc sw water eam airebo dpd tersoff snap" export LMP_ARGS="-pk intel 0 -sf intel -screen none -v d 1" export RLMP_ARGS="-pk intel 0 lrt yes -sf intel -screen none -v d 1" diff --git a/src/INTEL/intel_simd.h b/src/INTEL/intel_simd.h index 37842621dc..9f31580dd2 100644 --- a/src/INTEL/intel_simd.h +++ b/src/INTEL/intel_simd.h @@ -46,13 +46,38 @@ namespace ip_simd { typedef __mmask16 SIMD_mask; + inline bool any(const SIMD_mask &m) { return m != 0; } + struct SIMD_int { __m512i v; SIMD_int() {} SIMD_int(const __m512i in) : v(in) {} + inline int & operator[](const int i) { return ((int *)&(v))[i]; } + inline const int & operator[](const int i) const + { return ((int *)&(v))[i]; } operator __m512i() const { return v;} }; + struct SIMD256_int { + __m256i v; + SIMD256_int() {} + SIMD256_int(const __m256i in) : v(in) {} + SIMD256_int(const int in) : v(_mm256_set1_epi32(in)) {} + inline int & operator[](const int i) { return ((int *)&(v))[i]; } + inline const int & operator[](const int i) const + { return ((int *)&(v))[i]; } +#ifdef __INTEL_LLVM_COMPILER + inline SIMD256_int operator&=(const int i) + { v=_mm256_and_epi32(v, _mm256_set1_epi32(i)); return *this; }; +#else + inline SIMD256_int operator&=(const int i) + { v=_mm256_and_si256(v, _mm256_set1_epi32(i)); return *this; }; +#endif + inline SIMD256_int operator+=(const int i) + { v=_mm256_add_epi32(v, _mm256_set1_epi32(i)); return *this; }; + operator __m256i() const { return v;} + }; + struct SIMD_float { __m512 v; SIMD_float() {} @@ -64,7 +89,24 @@ namespace ip_simd { __m512d v; SIMD_double() {} SIMD_double(const __m512d in) : v(in) {} + SIMD_double(const double in) { v=_mm512_set1_pd(in); } + inline double & operator[](const int i) { return ((double *)&(v))[i]; } + inline const double & operator[](const int i) const + { return ((double *)&(v))[i]; } operator __m512d() const { return v;} + + SIMD_double & operator=(const double i) + { _mm512_set1_pd(i); return *this; } + SIMD_double &operator=(const SIMD_double &i) + { v = i.v; return *this; } + + SIMD_double operator-() { return _mm512_xor_pd(v, _mm512_set1_pd(-0.0)); } + SIMD_double & operator+=(const SIMD_double & two) + { v = _mm512_add_pd(v, two.v); return *this; } + SIMD_double & operator-=(const SIMD_double & two) + { v = _mm512_sub_pd(v, two.v); return *this; } + SIMD_double & operator*=(const SIMD_double & two) + { v = _mm512_mul_pd(v, two.v); return *this; } }; template @@ -99,6 +141,12 @@ namespace ip_simd { // ------- Set Operations + inline SIMD256_int SIMD256_set(const int l0, const int l1, const int l2, + const int l3, const int l4, const int l5, + const int l6, const int l7) { + return _mm256_setr_epi32(l0,l1,l2,l3,l4,l5,l6,l7); + } + inline SIMD_int SIMD_set(const int l0, const int l1, const int l2, const int l3, const int l4, const int l5, const int l6, const int l7, const int l8, @@ -109,6 +157,10 @@ namespace ip_simd { l8,l9,l10,l11,l12,l13,l14,l15); } + inline SIMD256_int SIMD256_set(const int l) { + return _mm256_set1_epi32(l); + } + inline SIMD_int SIMD_set(const int l) { return _mm512_set1_epi32(l); } @@ -121,6 +173,10 @@ namespace ip_simd { return _mm512_set1_pd(l); } + inline SIMD256_int SIMD256_count() { + return SIMD256_set(0,1,2,3,4,5,6,7); + } + inline SIMD_int SIMD_zero_masked(const SIMD_mask &m, const SIMD_int &one) { return _mm512_maskz_mov_epi32(m, one); } @@ -147,6 +203,10 @@ namespace ip_simd { // -------- Load Operations + inline SIMD256_int SIMD_load(const SIMD256_int *p) { + return _mm256_load_epi32((int *)p); + } + inline SIMD_int SIMD_load(const int *p) { return _mm512_load_epi32(p); } @@ -159,6 +219,10 @@ namespace ip_simd { return _mm512_load_pd(p); } + inline SIMD_double SIMD_load(const SIMD_double *p) { + return _mm512_load_pd((double *)p); + } + inline SIMD_int SIMD_loadz(const SIMD_mask &m, const int *p) { return _mm512_maskz_load_epi32(m, p); } @@ -171,6 +235,10 @@ namespace ip_simd { return _mm512_maskz_load_pd(m, p); } + inline SIMD256_int SIMD_gather(const int *p, const SIMD256_int &i) { + return _mm256_i32gather_epi32(p, i, _MM_SCALE_4); + } + inline SIMD_int SIMD_gather(const int *p, const SIMD_int &i) { return _mm512_i32gather_epi32(i, p, _MM_SCALE_4); } @@ -179,6 +247,10 @@ namespace ip_simd { return _mm512_i32gather_ps(i, p, _MM_SCALE_4); } + inline SIMD_double SIMD_gather(const double *p, const SIMD256_int &i) { + return _mm512_i32gather_pd(i, p, _MM_SCALE_8); + } + inline SIMD_double SIMD_gather(const double *p, const SIMD_int &i) { return _mm512_i32gather_pd(_mm512_castsi512_si256(i), p, _MM_SCALE_8); } @@ -201,6 +273,12 @@ namespace ip_simd { _mm512_castsi512_si256(i), p, _MM_SCALE_8); } + inline SIMD_double SIMD_gather(const SIMD_mask &m, const double *p, + const SIMD256_int &i) { + return _mm512_mask_i32gather_pd(_mm512_undefined_pd(), m, + i, p, _MM_SCALE_8); + } + template inline SIMD_int SIMD_gatherz_offset(const SIMD_mask &m, const int *p, const SIMD_int &i) { @@ -252,6 +330,15 @@ namespace ip_simd { return _mm512_store_pd(p,one); } + inline void SIMD_store(SIMD_double *p, const SIMD_double &one) { + return _mm512_store_pd((double *)p,one); + } + + inline void SIMD_scatter(const SIMD_mask &m, int *p, + const SIMD256_int &i, const SIMD256_int &vec) { + _mm256_mask_i32scatter_epi32(p, m, i, vec, _MM_SCALE_4); + } + inline void SIMD_scatter(const SIMD_mask &m, int *p, const SIMD_int &i, const SIMD_int &vec) { _mm512_mask_i32scatter_epi32(p, m, i, vec, _MM_SCALE_4); @@ -268,8 +355,22 @@ namespace ip_simd { _MM_SCALE_8); } + inline void SIMD_scatter(const SIMD_mask &m, double *p, + const SIMD256_int &i, const SIMD_double &vec) { + _mm512_mask_i32scatter_pd(p, m, i, vec, _MM_SCALE_8); + } + + inline void SIMD_scatter(double *p, + const SIMD256_int &i, const SIMD_double &vec) { + _mm512_i32scatter_pd(p, i, vec, _MM_SCALE_8); + } + // ------- Arithmetic Operations + inline SIMD256_int operator+(const SIMD256_int &one, const SIMD256_int &two) { + return _mm256_add_epi32(one,two); + } + inline SIMD_int operator+(const SIMD_int &one, const SIMD_int &two) { return _mm512_add_epi32(one,two); } @@ -286,6 +387,10 @@ namespace ip_simd { return _mm512_add_epi32(one,SIMD_set(two)); } + inline SIMD256_int operator+(const SIMD256_int &one, const int two) { + return _mm256_add_epi32(one,SIMD256_set(two)); + } + inline SIMD_float operator+(const SIMD_float &one, const float two) { return _mm512_add_ps(one,SIMD_set(two)); } @@ -299,6 +404,11 @@ namespace ip_simd { return _mm512_mask_add_epi32(one,m,one,SIMD_set(two)); } + inline SIMD256_int SIMD_add(const SIMD_mask &m, + const SIMD256_int &one, const int two) { + return _mm256_mask_add_epi32(one,m,one,SIMD256_set(two)); + } + inline SIMD_float SIMD_add(const SIMD_mask &m, const SIMD_float &one, const float two) { return _mm512_mask_add_ps(one,m,one,SIMD_set(two)); @@ -309,6 +419,11 @@ namespace ip_simd { return _mm512_mask_add_pd(one,m,one,SIMD_set(two)); } + inline SIMD_double SIMD_add(const SIMD_mask &m, + const SIMD_double &one, const SIMD_double &two) { + return _mm512_mask_add_pd(one,m,one,two); + } + inline SIMD_int SIMD_add(const SIMD_int &s, const SIMD_mask &m, const SIMD_int &one, const SIMD_int &two) { return _mm512_mask_add_epi32(s,m,one,two); @@ -387,6 +502,10 @@ namespace ip_simd { return _mm512_mul_pd(one,two); } + inline SIMD256_int operator*(const SIMD256_int &one, const int two) { + return _mm256_mullo_epi32(one,SIMD256_set(two)); + } + inline SIMD_int operator*(const SIMD_int &one, const int two) { return _mm512_mullo_epi32(one,SIMD_set(two)); } @@ -417,6 +536,12 @@ namespace ip_simd { return _mm512_fmadd_pd(one,two,three); } + inline SIMD_double SIMD_fma(const SIMD_mask m, const SIMD_double &one, + const SIMD_double &two, + const SIMD_double &three) { + return _mm512_mask3_fmadd_pd(one,two,three,m); + } + inline SIMD_float SIMD_fms(const SIMD_float &one, const SIMD_float &two, const SIMD_float &three) { return _mm512_fmsub_ps(one,two,three); @@ -493,6 +618,10 @@ namespace ip_simd { return _mm512_pow_pd(one, two); } + inline SIMD_double SIMD_pow(const SIMD_double &one, const double two) { + return _mm512_pow_pd(one, SIMD_set(two)); + } + inline SIMD_float SIMD_exp(const SIMD_float &one) { return _mm512_exp_ps(one); } @@ -501,6 +630,18 @@ namespace ip_simd { return _mm512_exp_pd(one); } + inline SIMD_double SIMD_cos(const SIMD_double &one) { + return _mm512_cos_pd(one); + } + + inline SIMD_double SIMD_sin(const SIMD_double &one) { + return _mm512_sin_pd(one); + } + + inline SIMD_double SIMD_tan(const SIMD_double &one) { + return _mm512_tan_pd(one); + } + // ------- Comparison operations inline SIMD_mask SIMD_lt(SIMD_mask m, const SIMD_int &one, @@ -533,6 +674,14 @@ namespace ip_simd { return _mm512_mask_cmplt_pd_mask(m, SIMD_set(one), two); } + inline SIMD_mask operator<(const SIMD256_int &one, const SIMD256_int &two) { + return _mm256_cmplt_epi32_mask(one,two); + } + + inline SIMD_mask operator<(const int one, const SIMD256_int &two) { + return _mm256_cmplt_epi32_mask(SIMD256_set(one),two); + } + inline SIMD_mask operator<(const SIMD_int &one, const SIMD_int &two) { return _mm512_cmplt_epi32_mask(one,two); } @@ -577,6 +726,10 @@ namespace ip_simd { return _mm512_cmple_ps_mask(SIMD_set(one), two); } + inline SIMD_mask operator<=(const SIMD_double &one, const SIMD_double &two) { + return _mm512_cmple_pd_mask(one, two); + } + inline SIMD_mask operator<=(const double one, const SIMD_double &two) { return _mm512_cmple_pd_mask(SIMD_set(one), two); } @@ -593,6 +746,14 @@ namespace ip_simd { return _mm512_cmplt_pd_mask(two,one); } + inline SIMD_mask operator>(const SIMD_double &one, const double two) { + return _mm512_cmplt_pd_mask(SIMD_set(two),one); + } + + inline SIMD_mask operator==(const SIMD256_int &one, const int two) { + return _mm256_cmpeq_epi32_mask(one,_mm256_set1_epi32(two)); + } + inline SIMD_mask operator==(const SIMD_int &one, const SIMD_int &two) { return _mm512_cmpeq_epi32_mask(one,two); } diff --git a/src/INTEL/pair_snap_intel.cpp b/src/INTEL/pair_snap_intel.cpp new file mode 100644 index 0000000000..7417b08f9d --- /dev/null +++ b/src/INTEL/pair_snap_intel.cpp @@ -0,0 +1,777 @@ +// clang-format off +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#if defined(__AVX512F__) +#if defined(__INTEL_COMPILER) || defined(__INTEL_LLVM_COMPILER) + +#include "pair_snap_intel.h" + +#include "atom.h" +#include "comm.h" +#include "error.h" +#include "force.h" +#include "memory.h" +#include "modify.h" +#include "neigh_list.h" +#include "neighbor.h" +#include "sna_intel.h" +#include "tokenizer.h" + +#include +#include + +using namespace LAMMPS_NS; +using namespace ip_simd; + +#define MAXLINE 1024 +#define MAXWORD 3 + +/* ---------------------------------------------------------------------- */ + +PairSNAPIntel::PairSNAPIntel(LAMMPS *lmp) : Pair(lmp) +{ + single_enable = 0; + restartinfo = 0; + one_coeff = 1; + manybody_flag = 1; + centroidstressflag = CENTROID_NOTAVAIL; + + radelem = nullptr; + wjelem = nullptr; + coeffelem = nullptr; + sinnerelem = nullptr; + dinnerelem = nullptr; + + beta = nullptr; + bispectrum = nullptr; + snaptr = nullptr; +} + +/* ---------------------------------------------------------------------- */ + +PairSNAPIntel::~PairSNAPIntel() +{ + if (copymode) return; + + memory->destroy(radelem); + memory->destroy(wjelem); + memory->destroy(coeffelem); + memory->destroy(sinnerelem); + memory->destroy(dinnerelem); + + memory->destroy(beta); + memory->destroy(bispectrum); + + delete snaptr; + + if (allocated) { + memory->destroy(setflag); + memory->destroy(cutsq); + memory->destroy(scale); + } + +} + +/* ---------------------------------------------------------------------- + This version is a straightforward implementation + ---------------------------------------------------------------------- */ + +void PairSNAPIntel::compute(int eflag, int vflag) +{ + SNA_DVEC fij[3]; + int *jlist,*numneigh,**firstneigh; + + ev_init(eflag,vflag); + int tally_xyz = 0; + if (vflag_atom || (vflag && !vflag_fdotr)) tally_xyz = 1; + + double **x = atom->x; + double *_x = atom->x[0]; + double **f = atom->f; + int *type = atom->type; + int nlocal = atom->nlocal; + int newton_pair = force->newton_pair; + + // compute dE_i/dB_i = beta_i for all i in list + + numneigh = list->numneigh; + firstneigh = list->firstneigh; + + SNA_DVEC sevdwl(0); + + const int vw = snaptr->vector_width(); + for (int ii = 0; ii < list->inum; ii+=vw) { + SNA_IVEC i, jnum; + int max_jnum = 0; + for (int l = 0; l < vw; l++) { + if (ii + l < list->inum) { + i[l] = list->ilist[ii + l]; + jnum[l] = numneigh[i[l]]; + } else { + i[l] = list->ilist[0]; + jnum[l] = 0; + } + if (jnum[l] > max_jnum) max_jnum = jnum[l]; + } + + // ensure rij, inside, wj, and rcutij are of size jnum + + snaptr->grow_rij(max_jnum); + + SNA_IVEC zero_vec(0); + + const SNA_DVEC xtmp = SIMD_gather(_x, i * 3); + const SNA_DVEC ytmp = SIMD_gather(_x, i * 3 + 1); + const SNA_DVEC ztmp = SIMD_gather(_x, i * 3 + 2); + const SNA_IVEC itype = SIMD_gather(type, i); + const SNA_IVEC ielem = SIMD_gather(map, itype); + const SNA_DVEC radi = SIMD_gather(radelem, ielem); + + // rij[][3] = displacements between atom I and those neighbors + // inside = indices of neighbors of I within cutoff + // wj = weights for neighbors of I within cutoff + // rcutij = cutoffs for neighbors of I within cutoff + // note Rij sign convention => dU/dRij = dU/dRj = -dU/dRi + + SNA_IVEC ninside(0); + for (int jj = 0; jj < max_jnum; jj++) { + SIMD_mask m(SIMD256_set(jj) < jnum); + + SNA_IVEC j; + SV_for (int l = 0; l < vw; l++) { + jlist = firstneigh[i[l]]; + if (jj < jnum[l]) j[l] = jlist[jj]; + else j[l] = 0; + } + j &= NEIGHMASK; + + const SNA_DVEC delx = SIMD_gather(m, _x, j * 3) - xtmp; + const SNA_DVEC dely = SIMD_gather(m, _x, j * 3 + 1) - ytmp; + const SNA_DVEC delz = SIMD_gather(m, _x, j * 3 + 2) - ztmp; + const SNA_IVEC jtype = SIMD_gather(type, j); + const SNA_DVEC rsq = delx*delx + dely*dely + delz*delz; + const SNA_DVEC vcut = SIMD_gather(m, cutsq[0], + itype * (atom->ntypes + 1) + jtype); + + m &= rsq < vcut; + m &= rsq > SIMD_set(1e-20); + const SNA_IVEC jelem = SIMD_gather(map, jtype); + const SNA_IVEC ni3 = ninside * vw * 3 + SIMD256_count(); + SIMD_scatter(m, (double *)(snaptr->rij[0]), ni3, delx); + SIMD_scatter(m, (double *)(snaptr->rij[0] + 1), ni3, dely); + SIMD_scatter(m, (double *)(snaptr->rij[0] + 2), ni3, delz); + const SNA_IVEC ni = ninside * vw + SIMD256_count(); + SIMD_scatter(m, (int *)(snaptr->inside), ni, j); + SIMD_scatter(m, (double *)(snaptr->wj), ni, + SIMD_gather(m, wjelem, jelem)); + SIMD_scatter(m, (double *)(snaptr->rcutij), ni, + (radi + SIMD_gather(m, radelem, jelem)) * rcutfac); + if (switchinnerflag) { + SIMD_scatter(m, (double *)(snaptr->sinnerij), ni, + (SIMD_gather(m, sinnerelem, ielem) + + SIMD_gather(m, sinnerelem, jelem)) * 0.5); + SIMD_scatter(m, (double *)(snaptr->dinnerij), ni, + (SIMD_gather(m, dinnerelem, ielem) + + SIMD_gather(m, dinnerelem, jelem)) * 0.5); + } + if (chemflag) + SIMD_scatter(m, (int *)(snaptr->element), ni, jelem); + ninside = SIMD_add(m, ninside, 1); + } // for jj + + // compute Ui, Yi for atom I + + if (chemflag) + snaptr->compute_ui(ninside, ielem, max_jnum); + else + snaptr->compute_ui(ninside, zero_vec, max_jnum); + + // Compute bispectrum + if (quadraticflag || eflag) { + snaptr->compute_zi_or_yi<0>(beta); + if (chemflag) + snaptr->compute_bi(ielem); + else + snaptr->compute_bi(zero_vec); + for (int icoeff = 0; icoeff < ncoeff; icoeff++) + SIMD_store(bispectrum + icoeff, SIMD_load(snaptr->blist + icoeff)); + } + + // Compute beta + for (int icoeff = 0; icoeff < ncoeff; icoeff++) + SIMD_store(beta + icoeff, SIMD_gather(coeffelem[0], + ielem * ncoeffall + icoeff + 1)); + + if (quadraticflag) { + int k = ncoeff+1; + for (int icoeff = 0; icoeff < ncoeff; icoeff++) { + SNA_DVEC bveci = SIMD_load(bispectrum + icoeff); + SNA_DVEC beta_i = SIMD_load(beta + icoeff) + + SIMD_gather(coeffelem[0], ielem * ncoeffall + k) * bveci; + k++; + for (int jcoeff = icoeff+1; jcoeff < ncoeff; jcoeff++) { + const SNA_DVEC ci = SIMD_gather(coeffelem[0], ielem * ncoeffall + k); + beta_i = beta_i + ci * SIMD_load(bispectrum + jcoeff); + SIMD_store(beta + jcoeff, ci * bveci + SIMD_load(beta + jcoeff)); + k++; + } + SIMD_store(beta + icoeff, beta_i); + } + } + + // for neighbors of I within cutoff: + // compute Fij = dEi/dRj = -dEi/dRi + // add to Fi, subtract from Fj + // scaling is that for type I + + if (quadraticflag || eflag) + snaptr->compute_yi_from_zi(beta); + else + snaptr->compute_zi_or_yi<1>(beta); + + SNA_DVEC fi_x(0.0), fi_y(0.0), fi_z(0.0); + SNA_DVEC scalev = SIMD_gather(scale[0], itype * (atom->ntypes+1) + itype); + for (int jj = 0; jj < max_jnum; jj++) { + snaptr->compute_duidrj(jj, ninside); + if (chemflag && nelements > 1) + snaptr->compute_deidrj_e(jj, ninside, fij); + else + snaptr->compute_deidrj(jj, ninside, fij); + + SNA_DVEC fijs_x = fij[0] * scalev; + SNA_DVEC fijs_y = fij[1] * scalev; + SNA_DVEC fijs_z = fij[2] * scalev; + + fi_x += fijs_x; + fi_y += fijs_y; + fi_z += fijs_z; + + for (int l = 0; l < vw; l++) { + if (jj < ninside[l]) { + int j = snaptr->inside[jj][l]; + f[j][0] -= fijs_x[l]; + f[j][1] -= fijs_y[l]; + f[j][2] -= fijs_z[l]; + + if (tally_xyz) + ev_tally_xyz(i[l],j,nlocal,newton_pair,0.0,0.0, + fij[0][l],fij[1][l],fij[2][l], + -snaptr->rij[jj][0][l],-snaptr->rij[jj][1][l], + -snaptr->rij[jj][2][l]); + } + } // for l + } // for jj + SIMD_mask m((SIMD256_count() + ii) < list->inum); + SNA_DVEC fix = SIMD_gather(m, f[0], i * 3) + fi_x; + SIMD_scatter(m, f[0], i * 3, fix); + SNA_DVEC fiy = SIMD_gather(m, f[0], i * 3 + 1) + fi_y; + SIMD_scatter(m, f[0], i * 3 + 1, fiy); + SNA_DVEC fiz = SIMD_gather(m, f[0], i * 3 + 2) + fi_z; + SIMD_scatter(m, f[0], i * 3 + 2, fiz); + + // tally energy contribution + + if (eflag) { + SNA_DVEC evdwl = SIMD_gather(coeffelem[0], ielem * ncoeffall); + for (int icoeff = 0; icoeff < ncoeff; icoeff++) + evdwl += SIMD_gather(coeffelem[0], ielem * ncoeffall + icoeff +1) * + bispectrum[icoeff]; + + if (quadraticflag) { + int k = ncoeff+1; + for (int icoeff = 0; icoeff < ncoeff; icoeff++) { + SNA_DVEC bveci = SIMD_load(bispectrum + icoeff); + SNA_DVEC c = SIMD_gather(coeffelem[0], ielem * ncoeffall + k); + k++; + evdwl += c * 0.5 * bveci * bveci; + for (int jcoeff = icoeff+1; jcoeff < ncoeff; jcoeff++) { + SNA_DVEC bvecj = SIMD_load(bispectrum + jcoeff); + SNA_DVEC cj = SIMD_gather(coeffelem[0], ielem * ncoeffall + k); + k++; + evdwl += cj * bveci * bvecj; + } + } + } + sevdwl += scalev * evdwl; + if (eatom) { + SNA_DVEC ea = SIMD_gather(m, eatom, i) + scalev * evdwl; + SIMD_scatter(m, eatom, i, ea); + } + } // if (eflag) + } // for ii + if (eflag) eng_vdwl += SIMD_sum(sevdwl); + if (vflag_fdotr) virial_fdotr_compute(); +} + +/* ---------------------------------------------------------------------- + allocate all arrays +------------------------------------------------------------------------- */ + +void PairSNAPIntel::allocate() +{ + allocated = 1; + int n = atom->ntypes; + memory->create(setflag,n+1,n+1,"pair:setflag"); + memory->create(cutsq,n+1,n+1,"pair:cutsq"); + memory->create(scale,n+1,n+1,"pair:scale"); + map = new int[n+1]; +} + +/* ---------------------------------------------------------------------- + global settings +------------------------------------------------------------------------- */ + +void PairSNAPIntel::settings(int narg, char ** /* arg */) +{ + if (narg > 0) + error->all(FLERR,"Illegal pair_style command"); +} + +/* ---------------------------------------------------------------------- + set coeffs for one or more type pairs +------------------------------------------------------------------------- */ + +void PairSNAPIntel::coeff(int narg, char **arg) +{ + if (!allocated) allocate(); + if (narg != 4 + atom->ntypes) error->all(FLERR,"Incorrect args for pair coefficients"); + + map_element2type(narg-4,arg+4); + + // read snapcoeff and snapparam files + + read_files(arg[2],arg[3]); + + if (!quadraticflag) + ncoeff = ncoeffall - 1; + else { + + // ncoeffall should be (ncoeff+2)*(ncoeff+1)/2 + // so, ncoeff = floor(sqrt(2*ncoeffall))-1 + + ncoeff = sqrt(2.0*ncoeffall)-1; + ncoeffq = (ncoeff*(ncoeff+1))/2; + int ntmp = 1+ncoeff+ncoeffq; + if (ntmp != ncoeffall) { + error->all(FLERR,"Incorrect SNAP coeff file"); + } + } + + snaptr = new SNAIntel(lmp, rfac0, twojmax, + rmin0, switchflag, bzeroflag, + chemflag, bnormflag, wselfallflag, + nelements, switchinnerflag); + + if (ncoeff != snaptr->ncoeff) { + if (comm->me == 0) + printf("ncoeff = %d snancoeff = %d \n",ncoeff,snaptr->ncoeff); + error->all(FLERR,"Incorrect SNAP parameter file"); + } + + // Calculate maximum cutoff for all elements + rcutmax = 0.0; + for (int ielem = 0; ielem < nelements; ielem++) + rcutmax = MAX(2.0*radelem[ielem]*rcutfac,rcutmax); + + // set default scaling + int n = atom->ntypes; + for (int ii = 0; ii < n+1; ii++) + for (int jj = 0; jj < n+1; jj++) + scale[ii][jj] = 1.0; + +} + +/* ---------------------------------------------------------------------- + init specific to this pair style +------------------------------------------------------------------------- */ + +void PairSNAPIntel::init_style() +{ + if (force->newton_pair == 0) + error->all(FLERR,"Pair style SNAP requires newton pair on"); + + // need a full neighbor list + + neighbor->add_request(this, NeighConst::REQ_FULL); + + snaptr->init(); + + fix = static_cast(modify->get_fix_by_id("package_intel")); + if (!fix) error->all(FLERR, "The 'package intel' command is required for /intel styles"); + + fix->pair_init_check(); + + memory->create(bispectrum,ncoeff,"PairSNAP:bispectrum"); + memory->create(beta,ncoeff,"PairSNAP:beta"); +} + +/* ---------------------------------------------------------------------- + init for one type pair i,j and corresponding j,i +------------------------------------------------------------------------- */ + +double PairSNAPIntel::init_one(int i, int j) +{ + if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + scale[j][i] = scale[i][j]; + return (radelem[map[i]] + + radelem[map[j]])*rcutfac; +} + +/* ---------------------------------------------------------------------- */ + +void PairSNAPIntel::read_files(char *coefffilename, char *paramfilename) +{ + + // open SNAP coefficient file on proc 0 + + FILE *fpcoeff; + if (comm->me == 0) { + fpcoeff = utils::open_potential(coefffilename,lmp,nullptr); + if (fpcoeff == nullptr) + error->one(FLERR,"Cannot open SNAP coefficient file {}: ", + coefffilename, utils::getsyserror()); + } + + char line[MAXLINE],*ptr; + int eof = 0; + int nwords = 0; + while (nwords == 0) { + if (comm->me == 0) { + ptr = fgets(line,MAXLINE,fpcoeff); + if (ptr == nullptr) { + eof = 1; + fclose(fpcoeff); + } + } + MPI_Bcast(&eof,1,MPI_INT,0,world); + if (eof) break; + MPI_Bcast(line,MAXLINE,MPI_CHAR,0,world); + + // strip comment, skip line if blank + + nwords = utils::count_words(utils::trim_comment(line)); + } + if (nwords != 2) + error->all(FLERR,"Incorrect format in SNAP coefficient file"); + + // strip single and double quotes from words + + int nelemtmp = 0; + try { + ValueTokenizer words(utils::trim_comment(line),"\"' \t\n\r\f"); + nelemtmp = words.next_int(); + ncoeffall = words.next_int(); + } catch (TokenizerException &e) { + error->all(FLERR,"Incorrect format in SNAP coefficient file: {}", e.what()); + } + + // clean out old arrays and set up element lists + + memory->destroy(radelem); + memory->destroy(wjelem); + memory->destroy(coeffelem); + memory->destroy(sinnerelem); + memory->destroy(dinnerelem); + memory->create(radelem,nelements,"pair:radelem"); + memory->create(wjelem,nelements,"pair:wjelem"); + memory->create(coeffelem,nelements,ncoeffall,"pair:coeffelem"); + memory->create(sinnerelem,nelements,"pair:sinnerelem"); + memory->create(dinnerelem,nelements,"pair:dinnerelem"); + + // initialize checklist for all required nelements + + int *elementflags = new int[nelements]; + for (int jelem = 0; jelem < nelements; jelem++) + elementflags[jelem] = 0; + + // loop over nelemtmp blocks in the SNAP coefficient file + + for (int ielem = 0; ielem < nelemtmp; ielem++) { + + if (comm->me == 0) { + ptr = fgets(line,MAXLINE,fpcoeff); + if (ptr == nullptr) { + eof = 1; + fclose(fpcoeff); + } + } + MPI_Bcast(&eof,1,MPI_INT,0,world); + if (eof) + error->all(FLERR,"Incorrect format in SNAP coefficient file"); + MPI_Bcast(line,MAXLINE,MPI_CHAR,0,world); + + std::vector words; + try { + words = Tokenizer(utils::trim_comment(line),"\"' \t\n\r\f").as_vector(); + } catch (TokenizerException &) { + // ignore + } + if (words.size() != 3) + error->all(FLERR,"Incorrect format in SNAP coefficient file"); + + int jelem; + for (jelem = 0; jelem < nelements; jelem++) + if (words[0] == elements[jelem]) break; + + // if this element not needed, skip this block + + if (jelem == nelements) { + if (comm->me == 0) { + for (int icoeff = 0; icoeff < ncoeffall; icoeff++) { + ptr = fgets(line,MAXLINE,fpcoeff); + if (ptr == nullptr) { + eof = 1; + fclose(fpcoeff); + } + } + } + MPI_Bcast(&eof,1,MPI_INT,0,world); + if (eof) + error->all(FLERR,"Incorrect format in SNAP coefficient file"); + continue; + } + + if (elementflags[jelem] == 1) + error->all(FLERR,"Incorrect format in SNAP coefficient file"); + else + elementflags[jelem] = 1; + + radelem[jelem] = utils::numeric(FLERR,words[1],false,lmp); + wjelem[jelem] = utils::numeric(FLERR,words[2],false,lmp); + + if (comm->me == 0) + utils::logmesg(lmp,"SNAP Element = {}, Radius {}, Weight {}\n", + elements[jelem], radelem[jelem], wjelem[jelem]); + + for (int icoeff = 0; icoeff < ncoeffall; icoeff++) { + if (comm->me == 0) { + ptr = fgets(line,MAXLINE,fpcoeff); + if (ptr == nullptr) { + eof = 1; + fclose(fpcoeff); + } + } + + MPI_Bcast(&eof,1,MPI_INT,0,world); + if (eof) + error->all(FLERR,"Incorrect format in SNAP coefficient file"); + MPI_Bcast(line,MAXLINE,MPI_CHAR,0,world); + + try { + ValueTokenizer coeff(utils::trim_comment(line)); + if (coeff.count() != 1) + error->all(FLERR,"Incorrect format in SNAP coefficient file"); + + coeffelem[jelem][icoeff] = coeff.next_double(); + } catch (TokenizerException &e) { + error->all(FLERR,"Incorrect format in SNAP coefficient file: {}", e.what()); + } + } + } + + if (comm->me == 0) fclose(fpcoeff); + + for (int jelem = 0; jelem < nelements; jelem++) { + if (elementflags[jelem] == 0) + error->all(FLERR,"Element {} not found in SNAP coefficient file", elements[jelem]); + } + delete[] elementflags; + + // set flags for required keywords + + rcutfacflag = 0; + twojmaxflag = 0; + + // Set defaults for optional keywords + + rfac0 = 0.99363; + rmin0 = 0.0; + switchflag = 1; + bzeroflag = 1; + quadraticflag = 0; + chemflag = 0; + bnormflag = 0; + wselfallflag = 0; + switchinnerflag = 0; + chunksize = 32768; + parallel_thresh = 8192; + + // set local input checks + + int sinnerflag = 0; + int dinnerflag = 0; + + // open SNAP parameter file on proc 0 + + FILE *fpparam; + if (comm->me == 0) { + fpparam = utils::open_potential(paramfilename,lmp,nullptr); + if (fpparam == nullptr) + error->one(FLERR,"Cannot open SNAP parameter file {}: {}", + paramfilename, utils::getsyserror()); + } + + eof = 0; + while (true) { + if (comm->me == 0) { + ptr = fgets(line,MAXLINE,fpparam); + if (ptr == nullptr) { + eof = 1; + fclose(fpparam); + } + } + MPI_Bcast(&eof,1,MPI_INT,0,world); + if (eof) break; + MPI_Bcast(line,MAXLINE,MPI_CHAR,0,world); + + // words = ptrs to all words in line + // strip single and double quotes from words + + std::vector words; + try { + words = Tokenizer(utils::trim_comment(line),"\"' \t\n\r\f").as_vector(); + } catch (TokenizerException &) { + // ignore + } + + if (words.size() == 0) continue; + + if (words.size() < 2) + error->all(FLERR,"Incorrect format in SNAP parameter file"); + + auto keywd = words[0]; + auto keyval = words[1]; + + // check for keywords with more than one value per element + + if (keywd == "sinner" || keywd == "dinner") { + + if ((int)words.size() != nelements+1) + error->all(FLERR,"Incorrect SNAP parameter file"); + + // innerlogstr collects all values of sinner or dinner for log output below + + std::string innerlogstr; + + int iword = 1; + + if (keywd == "sinner") { + for (int ielem = 0; ielem < nelements; ielem++) { + keyval = words[iword]; + sinnerelem[ielem] = utils::numeric(FLERR,keyval,false,lmp); + iword++; + innerlogstr += keyval + " "; + } + sinnerflag = 1; + } else if (keywd == "dinner") { + for (int ielem = 0; ielem < nelements; ielem++) { + keyval = words[iword]; + dinnerelem[ielem] = utils::numeric(FLERR,keyval,false,lmp); + iword++; + innerlogstr += keyval + " "; + } + dinnerflag = 1; + } + + if (comm->me == 0) + utils::logmesg(lmp,"SNAP keyword {} {} ... \n", keywd, innerlogstr); + + } else { + + // all other keywords take one value + + if (nwords != 2) + error->all(FLERR,"Incorrect SNAP parameter file"); + + if (comm->me == 0) + utils::logmesg(lmp,"SNAP keyword {} {}\n",keywd,keyval); + + if (keywd == "rcutfac") { + rcutfac = utils::numeric(FLERR,keyval,false,lmp); + rcutfacflag = 1; + } else if (keywd == "twojmax") { + twojmax = utils::inumeric(FLERR,keyval,false,lmp); + twojmaxflag = 1; + } else if (keywd == "rfac0") + rfac0 = utils::numeric(FLERR,keyval,false,lmp); + else if (keywd == "rmin0") + rmin0 = utils::numeric(FLERR,keyval,false,lmp); + else if (keywd == "switchflag") + switchflag = utils::inumeric(FLERR,keyval,false,lmp); + else if (keywd == "bzeroflag") + bzeroflag = utils::inumeric(FLERR,keyval,false,lmp); + else if (keywd == "quadraticflag") + quadraticflag = utils::inumeric(FLERR,keyval,false,lmp); + else if (keywd == "chemflag") + chemflag = utils::inumeric(FLERR,keyval,false,lmp); + else if (keywd == "bnormflag") + bnormflag = utils::inumeric(FLERR,keyval,false,lmp); + else if (keywd == "wselfallflag") + wselfallflag = utils::inumeric(FLERR,keyval,false,lmp); + else if (keywd == "switchinnerflag") + switchinnerflag = utils::inumeric(FLERR,keyval,false,lmp); + else if (keywd == "chunksize") + chunksize = utils::inumeric(FLERR,keyval,false,lmp); + else if (keywd == "parallelthresh") + parallel_thresh = utils::inumeric(FLERR,keyval,false,lmp); + else + error->all(FLERR,"Unknown parameter '{}' in SNAP parameter file", keywd); + } + } + + if (rcutfacflag == 0 || twojmaxflag == 0) + error->all(FLERR,"Incorrect SNAP parameter file"); + + if (chemflag && nelemtmp != nelements) + error->all(FLERR,"Incorrect SNAP parameter file"); + + if (switchinnerflag && !(sinnerflag && dinnerflag)) + error->all(FLERR,"Incorrect SNAP parameter file"); + + if (!switchinnerflag && (sinnerflag || dinnerflag)) + error->all(FLERR,"Incorrect SNAP parameter file"); +} + +/* ---------------------------------------------------------------------- + memory usage +------------------------------------------------------------------------- */ + +double PairSNAPIntel::memory_usage() +{ + double bytes = Pair::memory_usage(); + + int n = atom->ntypes+1; + bytes += (double)n*n*sizeof(int); // setflag + bytes += (double)n*n*sizeof(double); // cutsq + bytes += (double)n*n*sizeof(double); // scale + bytes += (double)n*sizeof(int); // map + bytes += (double)ncoeff*sizeof(SNA_DVEC); // bispectrum + bytes += (double)ncoeff*sizeof(SNA_DVEC); // beta + + bytes += snaptr->memory_usage(); // SNA object + + return bytes; +} + +/* ---------------------------------------------------------------------- */ + +void *PairSNAPIntel::extract(const char *str, int &dim) +{ + dim = 2; + if (strcmp(str,"scale") == 0) return (void *) scale; + return nullptr; +} + +#endif +#endif diff --git a/src/INTEL/pair_snap_intel.h b/src/INTEL/pair_snap_intel.h new file mode 100644 index 0000000000..2dc758f244 --- /dev/null +++ b/src/INTEL/pair_snap_intel.h @@ -0,0 +1,83 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#if defined(__AVX512F__) +#if defined(__INTEL_COMPILER) || defined(__INTEL_LLVM_COMPILER) + +#ifdef PAIR_CLASS +// clang-format off +PairStyle(snap/intel,PairSNAPIntel); +// clang-format on +#else + +#ifndef LMP_PAIR_SNAP_INTEL_H +#define LMP_PAIR_SNAP_INTEL_H + +#include "fix_intel.h" +#include "pair.h" + +namespace ip_simd { class SIMD_double; class SIMD_int; }; +#define SNA_DVEC ip_simd::SIMD_double +#define SNA_IVEC ip_simd::SIMD256_int + +namespace LAMMPS_NS { + +class PairSNAPIntel : public Pair { + public: + PairSNAPIntel(class LAMMPS *); + ~PairSNAPIntel() override; + void compute(int, int) override; + void settings(int, char **) override; + void coeff(int, char **) override; + void init_style() override; + double init_one(int, int) override; + double memory_usage() override; + void *extract(const char *, int &) override; + + double rcutfac, quadraticflag; // declared public to workaround gcc 4.9 + int ncoeff; // compiler bug, manifest in KOKKOS package + + protected: + FixIntel *fix; + + int ncoeffq, ncoeffall; + class SNAIntel *snaptr; + virtual void allocate(); + void read_files(char *, char *); + inline int equal(double *x, double *y); + inline double dist2(double *x, double *y); + + double rcutmax; // max cutoff for all elements + double *radelem; // element radii + double *wjelem; // elements weights + double **coeffelem; // element bispectrum coefficients + SNA_DVEC *beta; // betas for all atoms in list + SNA_DVEC *bispectrum; // bispectrum components for all atoms in list + double **scale; // for thermodynamic integration + int twojmax, switchflag, bzeroflag, bnormflag; + int chemflag, wselfallflag; + int switchinnerflag; // inner cutoff switch + double *sinnerelem; // element inner cutoff midpoint + double *dinnerelem; // element inner cutoff half-width + int chunksize, parallel_thresh; + double rfac0, rmin0, wj1, wj2; + int rcutfacflag, twojmaxflag; // flags for required parameters +}; + +} // namespace LAMMPS_NS + +#endif +#endif + +#endif +#endif diff --git a/src/INTEL/sna_intel.cpp b/src/INTEL/sna_intel.cpp new file mode 100644 index 0000000000..b83c90688d --- /dev/null +++ b/src/INTEL/sna_intel.cpp @@ -0,0 +1,1505 @@ +// clang-format off +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing authors: W. Michael Brown, Intel +------------------------------------------------------------------------- */ + +#if defined(__AVX512F__) +#if defined(__INTEL_COMPILER) || defined(__INTEL_LLVM_COMPILER) + +#include "sna_intel.h" + +#include "comm.h" +#include "error.h" +#include "math_const.h" +#include "math_special.h" +#include "memory.h" + +#include + +using namespace std; +using namespace LAMMPS_NS; +using namespace MathConst; +using namespace MathSpecial; +using namespace ip_simd; + +/* ---------------------------------------------------------------------- + + this implementation is based on the method outlined + in Bartok[1], using formulae from VMK[2]. + + for the Clebsch-Gordan coefficients, we + convert the VMK half-integral labels + a, b, c, alpha, beta, gamma + to array offsets j1, j2, j, m1, m2, m + using the following relations: + + j1 = 2*a + j2 = 2*b + j = 2*c + + m1 = alpha+a 2*alpha = 2*m1 - j1 + m2 = beta+b or 2*beta = 2*m2 - j2 + m = gamma+c 2*gamma = 2*m - j + + in this way: + + -a <= alpha <= a + -b <= beta <= b + -c <= gamma <= c + + becomes: + + 0 <= m1 <= j1 + 0 <= m2 <= j2 + 0 <= m <= j + + and the requirement that + a+b+c be integral implies that + j1+j2+j must be even. + The requirement that: + + gamma = alpha+beta + + becomes: + + 2*m - j = 2*m1 - j1 + 2*m2 - j2 + + Similarly, for the Wigner U-functions U(J,m,m') we + convert the half-integral labels J,m,m' to + array offsets j,ma,mb: + + j = 2*J + ma = J+m + mb = J+m' + + so that: + + 0 <= j <= 2*Jmax + 0 <= ma, mb <= j. + + For the bispectrum components B(J1,J2,J) we convert to: + + j1 = 2*J1 + j2 = 2*J2 + j = 2*J + + and the requirement: + + |J1-J2| <= J <= J1+J2, for j1+j2+j integral + + becomes: + + |j1-j2| <= j <= j1+j2, for j1+j2+j even integer + + or + + j = |j1-j2|, |j1-j2|+2,...,j1+j2-2,j1+j2 + + [1] Albert Bartok-Partay, "Gaussian Approximation..." + Doctoral Thesis, Cambridge University, (2009) + + [2] D. A. Varshalovich, A. N. Moskalev, and V. K. Khersonskii, + "Quantum Theory of Angular Momentum," World Scientific (1988) + +------------------------------------------------------------------------- */ + +SNAIntel::SNAIntel(LAMMPS* lmp, double rfac0_in, int twojmax_in, + double rmin0_in, int switch_flag_in, int bzero_flag_in, + int chem_flag_in, int bnorm_flag_in, int wselfall_flag_in, + int nelements_in, int switch_inner_flag_in) : Pointers(lmp) +{ + wself = 1.0; + + rfac0 = rfac0_in; + rmin0 = rmin0_in; + switch_flag = switch_flag_in; + switch_inner_flag = switch_inner_flag_in; + bzero_flag = bzero_flag_in; + chem_flag = chem_flag_in; + bnorm_flag = bnorm_flag_in; + wselfall_flag = wselfall_flag_in; + + if (bnorm_flag != chem_flag) + lmp->error->warning(FLERR, "bnormflag and chemflag are not equal." + "This is probably not what you intended"); + + if (chem_flag) + nelements = nelements_in; + else + nelements = 1; + + twojmax = twojmax_in; + + compute_ncoeff(); + + rij = nullptr; + inside = nullptr; + wj = nullptr; + rcutij = nullptr; + sinnerij = nullptr; + dinnerij = nullptr; + element = nullptr; + nmax = 0; + idxz = nullptr; + idxb = nullptr; + ulist_r_ij = nullptr; + ulist_i_ij = nullptr; + + build_indexlist(); + create_twojmax_arrays(); + + if (bzero_flag) { + double www = wself*wself*wself; + for (int j = 0; j <= twojmax; j++) + if (bnorm_flag) + bzero[j] = www; + else + bzero[j] = www*(j+1); + } + +} + +/* ---------------------------------------------------------------------- */ + +SNAIntel::~SNAIntel() +{ + memory->destroy(rij); + memory->destroy(inside); + memory->destroy(wj); + memory->destroy(rcutij); + memory->destroy(sinnerij); + memory->destroy(dinnerij); + if (chem_flag) memory->destroy(element); + memory->destroy(ulist_r_ij); + memory->destroy(ulist_i_ij); + delete[] idxz; + delete[] idxb; + destroy_twojmax_arrays(); +} + +void SNAIntel::build_indexlist() +{ + + // index list for cglist + + int jdim = twojmax + 1; + memory->create(idxcg_block, jdim, jdim, jdim, + "sna:idxcg_block"); + + int idxcg_count = 0; + for (int j1 = 0; j1 <= twojmax; j1++) + for (int j2 = 0; j2 <= j1; j2++) + for (int j = j1 - j2; j <= MIN(twojmax, j1 + j2); j += 2) { + idxcg_block[j1][j2][j] = idxcg_count; + for (int m1 = 0; m1 <= j1; m1++) + for (int m2 = 0; m2 <= j2; m2++) + idxcg_count++; + } + idxcg_max = idxcg_count; + + // index list for uarray + // need to include both halves + + memory->create(idxu_block, jdim, + "sna:idxu_block"); + + int idxu_count = 0; + + for (int j = 0; j <= twojmax; j++) { + idxu_block[j] = idxu_count; + for (int mb = 0; mb <= j; mb++) + for (int ma = 0; ma <= j; ma++) + idxu_count++; + } + idxu_max = idxu_count; + + // index list for beta and B + + int idxb_count = 0; + for (int j1 = 0; j1 <= twojmax; j1++) + for (int j2 = 0; j2 <= j1; j2++) + for (int j = j1 - j2; j <= MIN(twojmax, j1 + j2); j += 2) + if (j >= j1) idxb_count++; + + idxb_max = idxb_count; + idxb = new SNA_BINDICES[idxb_max]; + + idxb_count = 0; + for (int j1 = 0; j1 <= twojmax; j1++) + for (int j2 = 0; j2 <= j1; j2++) + for (int j = j1 - j2; j <= MIN(twojmax, j1 + j2); j += 2) + if (j >= j1) { + idxb[idxb_count].j1 = j1; + idxb[idxb_count].j2 = j2; + idxb[idxb_count].j = j; + idxb_count++; + } + + // reverse index list for beta and b + + memory->create(idxb_block, jdim, jdim, jdim, + "sna:idxb_block"); + idxb_count = 0; + for (int j1 = 0; j1 <= twojmax; j1++) + for (int j2 = 0; j2 <= j1; j2++) + for (int j = j1 - j2; j <= MIN(twojmax, j1 + j2); j += 2) { + if (j >= j1) { + idxb_block[j1][j2][j] = idxb_count; + idxb_count++; + } + } + + // index list for zlist + + int idxz_count = 0; + + for (int j1 = 0; j1 <= twojmax; j1++) + for (int j2 = 0; j2 <= j1; j2++) + for (int j = j1 - j2; j <= MIN(twojmax, j1 + j2); j += 2) + for (int mb = 0; 2*mb <= j; mb++) + for (int ma = 0; ma <= j; ma++) + idxz_count++; + + idxz_max = idxz_count; + idxz = new SNA_ZINDICES[idxz_max]; + + memory->create(idxz_block, jdim, jdim, jdim, + "sna:idxz_block"); + + idxz_count = 0; + for (int j1 = 0; j1 <= twojmax; j1++) + for (int j2 = 0; j2 <= j1; j2++) + for (int j = j1 - j2; j <= MIN(twojmax, j1 + j2); j += 2) { + idxz_block[j1][j2][j] = idxz_count; + + // find right beta[jjb] entry + // multiply and divide by j+1 factors + // account for multiplicity of 1, 2, or 3 + + for (int mb = 0; 2*mb <= j; mb++) + for (int ma = 0; ma <= j; ma++) { + idxz[idxz_count].j1 = j1; + idxz[idxz_count].j2 = j2; + idxz[idxz_count].j = j; + idxz[idxz_count].ma1min = MAX(0, (2 * ma - j - j2 + j1) / 2); + idxz[idxz_count].ma2max = (2 * ma - j - (2 * idxz[idxz_count].ma1min - j1) + j2) / 2; + idxz[idxz_count].na = MIN(j1, (2 * ma - j + j2 + j1) / 2) - idxz[idxz_count].ma1min + 1; + idxz[idxz_count].mb1min = MAX(0, (2 * mb - j - j2 + j1) / 2); + idxz[idxz_count].mb2max = (2 * mb - j - (2 * idxz[idxz_count].mb1min - j1) + j2) / 2; + idxz[idxz_count].nb = MIN(j1, (2 * mb - j + j2 + j1) / 2) - idxz[idxz_count].mb1min + 1; + // apply to z(j1,j2,j,ma,mb) to unique element of y(j) + + const int jju = idxu_block[j] + (j+1)*mb + ma; + idxz[idxz_count].jju = jju; + + idxz_count++; + } + } +} + +/* ---------------------------------------------------------------------- */ + +void SNAIntel::init() +{ + init_clebsch_gordan(); + // print_clebsch_gordan(); + init_rootpqarray(); +} + +void SNAIntel::grow_rij(int newnmax) +{ + if (newnmax <= nmax) return; + + nmax = newnmax; + + memory->destroy(rij); + memory->destroy(inside); + memory->destroy(wj); + memory->destroy(rcutij); + memory->destroy(sinnerij); + memory->destroy(dinnerij); + if (chem_flag) memory->destroy(element); + memory->destroy(ulist_r_ij); + memory->destroy(ulist_i_ij); + memory->create(rij, nmax, 3, "pair:rij"); + memory->create(inside, nmax, "pair:inside"); + memory->create(wj, nmax, "pair:wj"); + memory->create(rcutij, nmax, "pair:rcutij"); + memory->create(sinnerij, nmax, "pair:sinnerij"); + memory->create(dinnerij, nmax, "pair:dinnerij"); + if (chem_flag) memory->create(element, nmax, "sna:element"); + memory->create(ulist_r_ij, nmax, idxu_max, "sna:ulist_ij"); + memory->create(ulist_i_ij, nmax, idxu_max, "sna:ulist_ij"); +} + +/* ---------------------------------------------------------------------- + compute Ui by summing over neighbors j +------------------------------------------------------------------------- */ + +void SNAIntel::compute_ui(const SNA_IVEC &jnum, const SNA_IVEC &ielem, + const int max_jnum) +{ + // utot(j,ma,mb) = 0 for all j,ma,ma + // utot(j,ma,ma) = 1 for all j,ma + // for j in neighbors of i: + // compute r0 = (x,y,z,z0) + // utot(j,ma,mb) += u(r0;j,ma,mb) for all j,ma,mb + + zero_uarraytot(ielem); + + for (int j = 0; j < max_jnum; j++) { + const SNA_DVEC x = rij[j][0]; + const SNA_DVEC y = rij[j][1]; + const SNA_DVEC z = rij[j][2]; + const SNA_DVEC rcut = rcutij[j]; + const SNA_DVEC rsq = x * x + y * y + z * z; + const SNA_DVEC r = SIMD_sqrt(rsq); + const SNA_DVEC rscale0 = SIMD_rcp(rcut - rmin0) * rfac0 * MY_PI; + const SNA_DVEC theta0 = (r - rmin0) * rscale0; + const SNA_DVEC z0 = r * SIMD_rcp(SIMD_tan(theta0)); + + compute_uarray(x, y, z, z0, r, j, jnum); + add_uarraytot(r, j, jnum); + } + +} + +/* ---------------------------------------------------------------------- + pick out right beta value +------------------------------------------------------------------------- */ + +double SNAIntel::choose_beta(const int j, const int j1, const int j2, + const int elem1, const int elem2, const int elem3, + int &itriple) +{ + double bfactor; + if (j >= j1) { + const int jjb = idxb_block[j1][j2][j]; + itriple = ((elem1 * nelements + elem2) * nelements + elem3) * + idxb_max + jjb; + if (j1 == j) { + if (j2 == j) + bfactor = 3.0; + else + bfactor = 2.0; + } else + bfactor = 1.0; + } else if (j >= j2) { + const int jjb = idxb_block[j][j2][j1]; + itriple = ((elem3 * nelements + elem2) * nelements + elem1) * + idxb_max + jjb; + if (j2 == j) + bfactor = 2.0; + else + bfactor = 1.0; + } else { + const int jjb = idxb_block[j2][j][j1]; + itriple = ((elem2 * nelements + elem3) * nelements + elem1) * + idxb_max + jjb; + bfactor = 1.0; + } + + if (!bnorm_flag && j1 > j) + bfactor *= (1.0 + j1) / (1.0 + j); + + return bfactor; +} + +/* ---------------------------------------------------------------------- + compute Yi from Ui without storing Zi, looping over zlist indices +------------------------------------------------------------------------- */ + +template +void SNAIntel::compute_zi_or_yi(const SNA_DVEC* beta) +{ + if (COMPUTE_YI) { + memset(ylist_r,0,idxu_max*nelements*sizeof(SNA_DVEC)); + memset(ylist_i,0,idxu_max*nelements*sizeof(SNA_DVEC)); + } + + double *zlist_rp = (double *)zlist_r; + double *zlist_ip = (double *)zlist_i; + + int zlist_i = 0; + + for (int elem1 = 0; elem1 < nelements; elem1++) + for (int elem2 = 0; elem2 < nelements; elem2++) { + for (int jjz = 0; jjz < idxz_max; jjz++) { + const int j1 = idxz[jjz].j1; + const int j2 = idxz[jjz].j2; + const int j = idxz[jjz].j; + const int ma1min = idxz[jjz].ma1min; + const int ma2max = idxz[jjz].ma2max; + const int na = idxz[jjz].na; + const int mb1min = idxz[jjz].mb1min; + const int mb2max = idxz[jjz].mb2max; + const int nb = idxz[jjz].nb; + + const double *cgblock = cglist + idxcg_block[j1][j2][j]; + + SNA_DVEC ztmp_r = 0.0; + SNA_DVEC ztmp_i = 0.0; + + const double *u_r = (double *)ulisttot_r; + const double *u_i = (double *)ulisttot_i; + + int jju1 = elem1 * idxu_max + idxu_block[j1] + (j1 + 1) * mb1min; + int jju2 = elem2 * idxu_max + idxu_block[j2] + (j2 + 1) * mb2max; + jju1 *= vector_width(); + jju2 *= vector_width(); + int icgb = mb1min * (j2 + 1) + mb2max; + for (int ib = 0; ib < nb; ib++) { + + SNA_DVEC suma1_r = 0.0; + SNA_DVEC suma1_i = 0.0; + + int ma1 = ma1min * vector_width(); + int ma2 = ma2max * vector_width(); + int icga = ma1min * (j2 + 1) + ma2max; + + for (int ia = 0; ia < na; ia++) { + const SNA_DVEC u1_r = SIMD_load(u_r + jju1 + ma1); + const SNA_DVEC u2_r = SIMD_load(u_r + jju2 + ma2); + const SNA_DVEC u1_i = SIMD_load(u_i + jju1 + ma1); + const SNA_DVEC u2_i = SIMD_load(u_i + jju2 + ma2); + suma1_r += (u1_r*u2_r - u1_i*u2_i) * cgblock[icga]; + suma1_i += (u1_r*u2_i + u1_i*u2_r) * cgblock[icga]; + ma1+= vector_width(); + ma2-= vector_width(); + icga += j2; + } // end loop over ia + + ztmp_r += suma1_r * cgblock[icgb]; + ztmp_i += suma1_i * cgblock[icgb]; + + jju1 += (j1 + 1) * vector_width(); + jju2 -= (j2 + 1) * vector_width(); + icgb += j2; + } // end loop over ib + + // apply to z(j1,j2,j,ma,mb) to unique element of y(j) + // find right y_list[jju] and beta[jjb] entries + // multiply and divide by j+1 factors + // account for multiplicity of 1, 2, or 3 + + if (bnorm_flag) { + ztmp_i *= SIMD_rcp(SIMD_set(static_cast(j+1))); + ztmp_r *= SIMD_rcp(SIMD_set(static_cast(j+1))); + } + + if (COMPUTE_YI) { + int jju = idxz[jjz].jju; + for (int elem3 = 0; elem3 < nelements; elem3++) { + int itriple; + double bfactor = choose_beta(j, j1, j2, elem1, elem2, elem3, + itriple); + const SNA_DVEC betaj = beta[itriple] * bfactor; + const int i = elem3 * idxu_max + jju; + SIMD_store(&(ylist_r[i]), SIMD_load(ylist_r + i) + betaj * ztmp_r); + SIMD_store(&(ylist_i[i]), SIMD_load(ylist_i + i) + betaj * ztmp_i); + } + } else { + SIMD_store(zlist_rp + zlist_i, ztmp_r); + SIMD_store(zlist_ip + zlist_i, ztmp_i); + zlist_i += vector_width(); + } + }// end loop over jjz + } +} + +/* ---------------------------------------------------------------------- + compute Yi from Zi +------------------------------------------------------------------------- */ + +void SNAIntel::compute_yi_from_zi(const SNA_DVEC* beta) +{ + memset(ylist_r,0,idxu_max*nelements*sizeof(SNA_DVEC)); + memset(ylist_i,0,idxu_max*nelements*sizeof(SNA_DVEC)); + + double *zlist_rp = (double *)zlist_r; + double *zlist_ip = (double *)zlist_i; + + int zlist_i = 0; + + for (int elem1 = 0; elem1 < nelements; elem1++) + for (int elem2 = 0; elem2 < nelements; elem2++) { + for (int jjz = 0; jjz < idxz_max; jjz++) { + const int j1 = idxz[jjz].j1; + const int j2 = idxz[jjz].j2; + const int j = idxz[jjz].j; + + const SNA_DVEC ztmp_r = SIMD_load(zlist_rp + zlist_i); + const SNA_DVEC ztmp_i = SIMD_load(zlist_ip + zlist_i); + zlist_i += vector_width(); + + int jju = idxz[jjz].jju; + for (int elem3 = 0; elem3 < nelements; elem3++) { + int itriple; + double bfactor = choose_beta(j, j1, j2, elem1, elem2, elem3, + itriple); + const SNA_DVEC betaj = beta[itriple] * bfactor; + const int i = elem3 * idxu_max + jju; + SIMD_store(&(ylist_r[i]), SIMD_load(ylist_r + i) + betaj * ztmp_r); + SIMD_store(&(ylist_i[i]), SIMD_load(ylist_i + i) + betaj * ztmp_i); + } + } // end loop over jjz + } +} + +/* ---------------------------------------------------------------------- + compute dEidRj +------------------------------------------------------------------------- */ + +void SNAIntel::compute_deidrj_e(const int jj, const SNA_IVEC &jnum, + SNA_DVEC* dedr) +{ + double *ylist_rp = (double *)ylist_r; + double *ylist_ip = (double *)ylist_i; + double *dulist_rp = (double *)(dulist_r[0]); + double *dulist_ip = (double *)(dulist_i[0]); + + for (int k = 0; k < 3; k++) + dedr[k] = SIMD_set(0.0); + + SNA_IVEC jelem; + if (chem_flag) jelem = SIMD_load(element + jj); + else jelem = SIMD256_set(0); + + SIMD_mask m(jj < jnum); + + for (int j = 0; j <= twojmax; j++) { + int jju = idxu_block[j] * vector_width(); + int jju3 = jju * 3; + SNA_IVEC i = jelem*idxu_max*vector_width() + jju + SIMD256_count(); + + for (int mb = 0; 2*mb < j; mb++) + for (int ma = 0; ma <= j; ma++) { + SNA_DVEC jjjmambyarray_r = SIMD_gather(m, ylist_rp, i); + SNA_DVEC jjjmambyarray_i = SIMD_gather(m, ylist_ip, i); + for (int k = 0; k < 3; k++) { + SNA_DVEC du_r = SIMD_load(dulist_rp + jju3); + SNA_DVEC du_i = SIMD_load(dulist_ip + jju3); + SNA_DVEC du = du_r * jjjmambyarray_r + du_i * jjjmambyarray_i; + dedr[k] = SIMD_add(m, dedr[k], du); + jju3 += vector_width(); + } + i = i + vector_width(); + } + + if (j%2 == 0) { + int mb = j / 2; + for (int ma = 0; ma < mb; ma++) { + SNA_DVEC jjjmambyarray_r = SIMD_gather(m, ylist_rp, i); + SNA_DVEC jjjmambyarray_i = SIMD_gather(m, ylist_ip, i); + for (int k = 0; k < 3; k++) { + SNA_DVEC du_r = SIMD_load(dulist_rp + jju3); + SNA_DVEC du_i = SIMD_load(dulist_ip + jju3); + SNA_DVEC du = du_r * jjjmambyarray_r + du_i * jjjmambyarray_i; + dedr[k] = SIMD_add(m, dedr[k], du); + jju3 += vector_width(); + } + i = i + vector_width(); + } + + SNA_DVEC jjjmambyarray_r = SIMD_gather(m, ylist_rp, i); + SNA_DVEC jjjmambyarray_i = SIMD_gather(m, ylist_ip, i); + for (int k = 0; k < 3; k++) { + SNA_DVEC du_r = SIMD_load(dulist_rp + jju3); + SNA_DVEC du_i = SIMD_load(dulist_ip + jju3); + SNA_DVEC du = du_r * jjjmambyarray_r + du_i * jjjmambyarray_i; + dedr[k] = SIMD_fma(m, SIMD_set(0.5), du, dedr[k]); + jju3 += vector_width(); + } + } // if j%2 + } // for j + + for (int k = 0; k < 3; k++) + dedr[k] = dedr[k] * 2.0; +} + +/* ---------------------------------------------------------------------- + compute dEidRj +------------------------------------------------------------------------- */ + +void SNAIntel::compute_deidrj(const int jj, const SNA_IVEC &jnum, + SNA_DVEC* dedr) +{ + double *ylist_rp = (double *)ylist_r; + double *ylist_ip = (double *)ylist_i; + double *dulist_rp = (double *)(dulist_r[0]); + double *dulist_ip = (double *)(dulist_i[0]); + + for (int k = 0; k < 3; k++) + dedr[k] = SIMD_set(0.0); + + SIMD_mask m(jj < jnum); + + for (int j = 0; j <= twojmax; j++) { + int jju = idxu_block[j] * vector_width(); + int jju3 = jju * 3; + + for (int mb = 0; 2*mb < j; mb++) + for (int ma = 0; ma <= j; ma++) { + SNA_DVEC jjjmambyarray_r = SIMD_load(ylist_rp + jju); + SNA_DVEC jjjmambyarray_i = SIMD_load(ylist_ip + jju); + for (int k = 0; k < 3; k++) { + SNA_DVEC du_r = SIMD_load(dulist_rp + jju3); + SNA_DVEC du_i = SIMD_load(dulist_ip + jju3); + SNA_DVEC du = du_r * jjjmambyarray_r + du_i * jjjmambyarray_i; + dedr[k] = SIMD_add(m, dedr[k], du); + jju3 += vector_width(); + } + jju += vector_width(); + } + + if (j%2 == 0) { + int mb = j / 2; + for (int ma = 0; ma < mb; ma++) { + SNA_DVEC jjjmambyarray_r = SIMD_load(ylist_rp + jju); + SNA_DVEC jjjmambyarray_i = SIMD_load(ylist_ip + jju); + for (int k = 0; k < 3; k++) { + SNA_DVEC du_r = SIMD_load(dulist_rp + jju3); + SNA_DVEC du_i = SIMD_load(dulist_ip + jju3); + SNA_DVEC du = du_r * jjjmambyarray_r + du_i * jjjmambyarray_i; + dedr[k] = SIMD_add(m, dedr[k], du); + jju3 += vector_width(); + } + jju += vector_width(); + } + + SNA_DVEC jjjmambyarray_r = SIMD_load(ylist_rp + jju); + SNA_DVEC jjjmambyarray_i = SIMD_load(ylist_ip + jju); + for (int k = 0; k < 3; k++) { + SNA_DVEC du_r = SIMD_load(dulist_rp + jju3); + SNA_DVEC du_i = SIMD_load(dulist_ip + jju3); + SNA_DVEC du = du_r * jjjmambyarray_r + du_i * jjjmambyarray_i; + dedr[k] = SIMD_fma(m, SIMD_set(0.5), du, dedr[k]); + jju3 += vector_width(); + } + } // if j%2 + } // for j + + for (int k = 0; k < 3; k++) + dedr[k] = dedr[k] * 2.0; +} + +/* ---------------------------------------------------------------------- + compute Bi by summing conj(Ui)*Zi +------------------------------------------------------------------------- */ + +void SNAIntel::compute_bi(const SNA_IVEC &ielem) { + // for j1 = 0,...,twojmax + // for j2 = 0,twojmax + // for j = |j1-j2|,Min(twojmax,j1+j2),2 + // b(j1,j2,j) = 0 + // for mb = 0,...,jmid + // for ma = 0,...,j + // b(j1,j2,j) += + // 2*Conj(u(j,ma,mb))*z(j1,j2,j,ma,mb) + + double *ulisttot_rp = (double *)ulisttot_r; + double *ulisttot_ip = (double *)ulisttot_i; + double *blistp = (double *)blist; + + int itriple = 0; + int idouble = 0; + for (int elem1 = 0; elem1 < nelements; elem1++) + for (int elem2 = 0; elem2 < nelements; elem2++) { + + double *zlist_rp = (double *)(zlist_r + idouble*idxz_max); + double *zlist_ip = (double *)(zlist_i + idouble*idxz_max); + + for (int elem3 = 0; elem3 < nelements; elem3++) { + for (int jjb = 0; jjb < idxb_max; jjb++) { + const int j1 = idxb[jjb].j1; + const int j2 = idxb[jjb].j2; + const int j = idxb[jjb].j; + + int jjz = idxz_block[j1][j2][j] * vector_width(); + int jju = (elem3 * idxu_max + idxu_block[j]) * vector_width(); + SNA_DVEC sumzu(0.0); + for (int mb = 0; 2 * mb < j; mb++) + for (int ma = 0; ma <= j; ma++) { + const SNA_DVEC utot_r = SIMD_load(ulisttot_rp + jju); + const SNA_DVEC utot_i = SIMD_load(ulisttot_ip + jju); + const SNA_DVEC z_r = SIMD_load(zlist_rp + jjz); + const SNA_DVEC z_i = SIMD_load(zlist_ip + jjz); + sumzu = sumzu + utot_r * z_r + utot_i * z_i; + jjz += vector_width(); + jju += vector_width(); + } // end loop over ma, mb + + // For j even, handle middle column + + if (j % 2 == 0) { + int mb = j / 2; + for (int ma = 0; ma < mb; ma++) { + const SNA_DVEC utot_r = SIMD_load(ulisttot_rp + jju); + const SNA_DVEC utot_i = SIMD_load(ulisttot_ip + jju); + const SNA_DVEC z_r = SIMD_load(zlist_rp + jjz); + const SNA_DVEC z_i = SIMD_load(zlist_ip + jjz); + sumzu = sumzu + utot_r * z_r + utot_i * z_i; + jjz += vector_width(); + jju += vector_width(); + } + + const SNA_DVEC utot_r = SIMD_load(ulisttot_rp + jju); + const SNA_DVEC utot_i = SIMD_load(ulisttot_ip + jju); + const SNA_DVEC z_r = SIMD_load(zlist_rp + jjz); + const SNA_DVEC z_i = SIMD_load(zlist_ip + jjz); + sumzu = sumzu + (utot_r * z_r + utot_i * z_i) * 0.5; + } // end if jeven + + SIMD_store(blistp + (itriple*idxb_max+jjb) * vector_width(), + sumzu * 2.0); + } + itriple++; + } + idouble++; + } + + // apply bzero shift + + if (bzero_flag) { + if (!wselfall_flag) { + SNA_IVEC itriplev = (ielem*nelements+ielem)*nelements+ielem; + for (int jjb = 0; jjb < idxb_max; jjb++) { + const int j = idxb[jjb].j; + SNA_IVEC i = (itriplev*idxb_max+jjb) * vector_width() + SIMD256_count(); + SIMD_scatter(blistp, i, SIMD_gather(blistp, i) - bzero[j]); + } // end loop over JJ + } else { + int itriple = 0; + for (int elem1 = 0; elem1 < nelements; elem1++) + for (int elem2 = 0; elem2 < nelements; elem2++) { + for (int elem3 = 0; elem3 < nelements; elem3++) { + for (int jjb = 0; jjb < idxb_max; jjb++) { + const int j = idxb[jjb].j; + int i = (itriple*idxb_max+jjb) * vector_width(); + SIMD_store(blistp + i, SIMD_load(blistp + i) - bzero[j]); + } // end loop over JJ + itriple++; + } // end loop over elem3 + } // end loop over elem1,elem2 + } + } +} + +/* ---------------------------------------------------------------------- + calculate derivative of Ui w.r.t. atom j +------------------------------------------------------------------------- */ + +void SNAIntel::compute_duidrj(const int jj, const SNA_IVEC &jnum) +{ + const SNA_DVEC x = rij[jj][0]; + const SNA_DVEC y = rij[jj][1]; + const SNA_DVEC z = rij[jj][2]; + const SNA_DVEC rcut = rcutij[jj]; + const SNA_DVEC rsq = x * x + y * y + z * z; + const SNA_DVEC r = SIMD_sqrt(rsq); + const SNA_DVEC rscale0 = SIMD_rcp(rcut - rmin0) * rfac0 * MY_PI; + const SNA_DVEC theta0 = (r - rmin0) * rscale0; + const SNA_DVEC z0 = r * SIMD_rcp(SIMD_tan(theta0)); + const SNA_DVEC dz0dr = z0 * SIMD_rcp(r) - (r*rscale0) * (rsq + z0 * z0) * + SIMD_rcp(rsq); + compute_duarray(x, y, z, z0, r, dz0dr, wj[jj], rcut, jj, jnum); +} + +/* ---------------------------------------------------------------------- */ + +void SNAIntel::zero_uarraytot(const SNA_IVEC &ielem) +{ + double *ulisttot_rp = (double *)ulisttot_r; + double *ulisttot_ip = (double *)ulisttot_i; + for (int jelem = 0; jelem < nelements; jelem++) + for (int j = 0; j <= twojmax; j++) { + int jju = (jelem * idxu_max + idxu_block[j]) * vector_width(); + for (int mb = 0; mb <= j; mb++) { + for (int ma = 0; ma <= j; ma++) { + SIMD_store(ulisttot_rp + jju, SIMD_set(0.0)); + SIMD_store(ulisttot_ip + jju, SIMD_set(0.0)); + + // utot(j,ma,ma) = wself, sometimes + if (ma == mb) { + if (wselfall_flag || nelements == 1) + SIMD_store(ulisttot_rp + jju, SIMD_set(wself)); + else { + SIMD_mask m(ielem == jelem); + SIMD_store(ulisttot_rp + jju, + SIMD_zero_masked(~m, SIMD_set(wself))); + } + } + jju += vector_width(); + } + } + } +} + + + +/* ---------------------------------------------------------------------- + add Wigner U-functions for one neighbor to the total +------------------------------------------------------------------------- */ + +void SNAIntel::add_uarraytot(const SNA_DVEC &r, const int jj, + const SNA_IVEC &jnum) +{ + SNA_DVEC sfac = compute_sfac(r, rcutij[jj], sinnerij[jj], dinnerij[jj]); + sfac *= wj[jj]; + + double *ulisttot_rp = (double *)ulisttot_r; + double *ulisttot_ip = (double *)ulisttot_i; + const double* ulist_r = (double *)(ulist_r_ij[jj]); + const double* ulist_i = (double *)(ulist_i_ij[jj]); + + SIMD_mask m(jj < jnum); + + if (chem_flag && nelements > 1) { + SNA_IVEC jelem = SIMD_load(element+jj); + for (int j = 0; j <= twojmax; j++) { + int jju = idxu_block[j] * vector_width(); + SNA_IVEC i = jelem*idxu_max*vector_width() + jju + SIMD256_count(); + for (int mb = 0; mb <= j; mb++) + for (int ma = 0; ma <= j; ma++) { + SNA_DVEC utot_r = SIMD_gather(m, ulisttot_rp, i); + SNA_DVEC utot_i = SIMD_gather(m, ulisttot_ip, i); + utot_r = SIMD_fma(m, sfac, SIMD_load(ulist_r + jju), utot_r); + utot_i = SIMD_fma(m, sfac, SIMD_load(ulist_i + jju), utot_i); + SIMD_scatter(m, ulisttot_rp, i, utot_r); + SIMD_scatter(m, ulisttot_ip, i, utot_i); + jju += vector_width(); + i = i + vector_width(); + } + } + } else { + for (int j = 0; j <= twojmax; j++) { + int jju = idxu_block[j] * vector_width(); + for (int mb = 0; mb <= j; mb++) + for (int ma = 0; ma <= j; ma++) { + SNA_DVEC utot_r = SIMD_load(ulisttot_rp + jju); + SNA_DVEC utot_i = SIMD_load(ulisttot_ip + jju); + utot_r = SIMD_fma(m, sfac, SIMD_load(ulist_r + jju), utot_r); + utot_i = SIMD_fma(m, sfac, SIMD_load(ulist_i + jju), utot_i); + SIMD_store(ulisttot_rp + jju, utot_r); + SIMD_store(ulisttot_ip + jju, utot_i); + jju += vector_width(); + } + } + } +} + +/* ---------------------------------------------------------------------- + compute Wigner U-functions for one neighbor +------------------------------------------------------------------------- */ + +void SNAIntel::compute_uarray(const SNA_DVEC &x, const SNA_DVEC &y, + const SNA_DVEC &z, const SNA_DVEC &z0, + const SNA_DVEC &r, const int jj, + const SNA_IVEC &jnum) +{ + // compute Cayley-Klein parameters for unit quaternion + + const SNA_DVEC r0inv = SIMD_invsqrt(r * r + z0 * z0); + const SNA_DVEC a_r = z0 * r0inv; + const SNA_DVEC a_i = -z * r0inv; + const SNA_DVEC b_r = y * r0inv; + const SNA_DVEC b_i = -x * r0inv; + + // VMK Section 4.8.2 + + double *ulist_rp = (double *)(ulist_r_ij[jj]); + double *ulist_ip = (double *)(ulist_i_ij[jj]); + + SIMD_store(ulist_rp, SIMD_set(1.0)); + SIMD_store(ulist_ip, SIMD_set(0.0)); + + for (int j = 1; j <= twojmax; j++) { + int jju = idxu_block[j] * vector_width(); + int jjup = idxu_block[j-1] * vector_width(); + + // fill in left side of matrix layer from previous layer + + for (int mb = 0; 2*mb <= j; mb++) { + SIMD_store(ulist_rp + jju, SIMD_set(0.0)); + SIMD_store(ulist_ip + jju, SIMD_set(0.0)); + + for (int ma = 0; ma < j; ma++) { + double rootpq = rootpqarray[j - ma][j - mb]; + SNA_DVEC u_r = SIMD_load(ulist_rp + jju); + SNA_DVEC u_i = SIMD_load(ulist_ip + jju); + const SNA_DVEC up_r = SIMD_load(ulist_rp + jjup); + const SNA_DVEC up_i = SIMD_load(ulist_ip + jjup); + + SNA_DVEC u_ro, u_io; + + u_ro = a_r * up_r + a_i * up_i; + u_r = SIMD_fma(SIMD_set(rootpq), u_ro, u_r); + SIMD_store(ulist_rp + jju, u_r); + u_io = a_r * up_i - a_i * up_r; + u_i = SIMD_fma(SIMD_set(rootpq), u_io, u_i); + SIMD_store(ulist_ip + jju, u_i); + + jju += vector_width(); + + rootpq = -rootpqarray[ma + 1][j - mb]; + u_r = (b_r * up_r + b_i * up_i) * rootpq; + SIMD_store(ulist_rp + jju, u_r); + u_i = (b_r * up_i - b_i * up_r) * rootpq; + SIMD_store(ulist_ip + jju, u_i); + + jjup += vector_width(); + } + jju += vector_width(); + } + + // copy left side to right side with inversion symmetry VMK 4.4(2) + // u[ma-j][mb-j] = (-1)^(ma-mb)*Conj([u[ma][mb]) + + jju = idxu_block[j]; + jjup = (jju+(j+1)*(j+1)-1) * vector_width(); + jju *= vector_width(); + int mbpar = 1; + for (int mb = 0; 2*mb <= j; mb++) { + int mapar = mbpar; + for (int ma = 0; ma <= j; ma++) { + if (mapar == 1) { + SIMD_store(ulist_rp + jjup, SIMD_load(ulist_rp + jju)); + SIMD_store(ulist_ip + jjup, -SIMD_load(ulist_ip + jju)); + } else { + SIMD_store(ulist_rp + jjup, -SIMD_load(ulist_rp + jju)); + SIMD_store(ulist_ip + jjup, SIMD_load(ulist_ip + jju)); + } + mapar = -mapar; + jju += vector_width(); + jjup -= vector_width(); + } + mbpar = -mbpar; + } + } +} + +/* ---------------------------------------------------------------------- + Compute derivatives of Wigner U-functions for one neighbor + see comments in compute_uarray() +------------------------------------------------------------------------- */ + +void SNAIntel::compute_duarray(const SNA_DVEC &x, const SNA_DVEC &y, + const SNA_DVEC &z, const SNA_DVEC &z0, + const SNA_DVEC &r, const SNA_DVEC &dz0dr, + const SNA_DVEC &wj, const SNA_DVEC &rcut, + const int jj, const SNA_IVEC &jnum) +{ + const SNA_DVEC rinv = SIMD_rcp(r); + const SNA_DVEC r0inv = SIMD_invsqrt(r * r + z0 * z0); + SNA_DVEC up[3]; + up[0] = x * rinv; + up[1] = y * rinv; + up[2] = z * rinv; + const SNA_DVEC a_r = z0 * r0inv; + const SNA_DVEC a_i = -z * r0inv; + const SNA_DVEC b_r = y * r0inv; + const SNA_DVEC b_i = -x * r0inv; + const SNA_DVEC dr0invdr = -SIMD_pow(r0inv, 3.0) * (r + z0 * dz0dr); + + SNA_DVEC dr0inv[3], da_r[3], da_i[3]; + for (int k = 0; k < 3; k++) { + dr0inv[k] = dr0invdr * up[k]; + da_r[k] = dz0dr * up[k] * r0inv + z0 * dr0inv[k]; + da_i[k] = -z * dr0inv[k]; + } + da_i[2] += -r0inv; + + double *ulist_rp = (double *)(ulist_r_ij[jj]); + double *ulist_ip = (double *)(ulist_i_ij[jj]); + double *dulist_rp = (double *)(dulist_r[0]); + double *dulist_ip = (double *)(dulist_i[0]); + + SNA_DVEC db_r[3], db_i[3]; + for (int k = 0; k < 3; k++) { + SIMD_store(dulist_rp + k * vector_width(), SIMD_set(0.0)); + SIMD_store(dulist_ip + k * vector_width(), SIMD_set(0.0)); + db_r[k] = y * dr0inv[k]; + db_i[k] = -x * dr0inv[k]; + } + db_i[0] -= r0inv; + db_r[1] += r0inv; + + for (int j = 1; j <= twojmax; j++) { + int jju3 = idxu_block[j] * 3 * vector_width(); + int jjup = idxu_block[j-1] * vector_width(); + int jjup3 = jjup * 3; + for (int mb = 0; 2*mb <= j; mb++) { + for (int k = 0; k < 3; k++) { + SIMD_store(dulist_rp + jju3 + k * vector_width(), SIMD_set(0.0)); + SIMD_store(dulist_ip + jju3 + k * vector_width(), SIMD_set(0.0)); + } + + for (int ma = 0; ma < j; ma++) { + const double rootpq = rootpqarray[j - ma][j - mb]; + const double mrootpq = -rootpqarray[ma + 1][j - mb]; + const SNA_DVEC up_r = SIMD_load(ulist_rp + jjup); + const SNA_DVEC up_i = SIMD_load(ulist_ip + jjup); + for (int k = 0; k < 3; k++) { + SNA_DVEC du_r = SIMD_load(dulist_rp + jju3); + SNA_DVEC du_i = SIMD_load(dulist_ip + jju3); + const SNA_DVEC dup_r = SIMD_load(dulist_rp + jjup3); + const SNA_DVEC dup_i = SIMD_load(dulist_ip + jjup3); + + SNA_DVEC du_ro, du_io; + + du_ro = (da_r[k]*up_r + da_i[k]*up_i + a_r*dup_r + a_i*dup_i); + du_r = SIMD_fma(SIMD_set(rootpq), du_ro, du_r); + SIMD_store(dulist_rp + jju3, du_r); + + du_io = (da_r[k]*up_i - da_i[k]*up_r + a_r*dup_i - a_i*dup_r); + du_i = SIMD_fma(SIMD_set(rootpq), du_io, du_i); + SIMD_store(dulist_ip + jju3, du_i); + + du_r = (db_r[k]*up_r + db_i[k]*up_i + b_r*dup_r + b_i*dup_i); + SIMD_store(dulist_rp + jju3 + 3 * vector_width(), du_r * mrootpq); + + du_i = (db_r[k]*up_i - db_i[k]*up_r + b_r*dup_i - b_i*dup_r); + SIMD_store(dulist_ip + jju3 + 3 * vector_width(), du_i * mrootpq); + + jju3 += vector_width(); + jjup3 += vector_width(); + } + jjup += vector_width(); + } // for ma + jju3 += 3 * vector_width(); + } // for mb + + // copy left side to right side with inversion symmetry VMK 4.4(2) + // u[ma-j][mb-j] = (-1)^(ma-mb)*Conj([u[ma][mb]) + + SNA_DVEC *du_r_p = dulist_r[0]; + SNA_DVEC *du_i_p = dulist_i[0]; + + int jju = idxu_block[j]; + jjup = (jju+(j+1)*(j+1)-1) * 3 * vector_width(); + jju *= 3 * vector_width(); + int mbpar = 1; + for (int mb = 0; 2*mb <= j; mb++) { + int mapar = mbpar; + for (int ma = 0; ma <= j; ma++) { + if (mapar == 1) { + for (int k = 0; k < 3; k++) { + SIMD_store(dulist_rp + jjup, SIMD_load(dulist_rp + jju)); + SIMD_store(dulist_ip + jjup, -SIMD_load(dulist_ip + jju)); + jju += vector_width(); + jjup += vector_width(); + } + } else { + for (int k = 0; k < 3; k++) { + SIMD_store(dulist_rp + jjup, -SIMD_load(dulist_rp + jju)); + SIMD_store(dulist_ip + jjup, SIMD_load(dulist_ip + jju)); + jju += vector_width(); + jjup += vector_width(); + } + } + mapar = -mapar; + jjup -= 6 * vector_width(); + } // for ma + mbpar = -mbpar; + } // for mb + } // for j + + SNA_DVEC dsfac; + SNA_DVEC sfac = compute_sfac_dsfac(r, rcut, sinnerij[jj], dinnerij[jj], + dsfac); + sfac = sfac * wj; + dsfac = dsfac * wj; + + for (int j = 0; j <= twojmax; j++) { + int jju = idxu_block[j] * vector_width(); + int jju3 = jju * 3; + for (int mb = 0; 2*mb <= j; mb++) + for (int ma = 0; ma <= j; ma++) { + const SNA_DVEC ur_dsfac = dsfac * SIMD_load(ulist_rp + jju); + const SNA_DVEC ui_dsfac = dsfac * SIMD_load(ulist_ip + jju); + jju += vector_width(); + for (int k = 0; k < 3; k++) { + SNA_DVEC du_r = ur_dsfac * up[k] + sfac * SIMD_load(dulist_rp+jju3); + SIMD_store(dulist_rp + jju3, du_r); + SNA_DVEC du_i = ui_dsfac * up[k] + sfac * SIMD_load(dulist_ip+jju3); + SIMD_store(dulist_ip + jju3, du_i); + jju3 += vector_width(); + } + } + } +} + +/* ---------------------------------------------------------------------- + memory usage of arrays +------------------------------------------------------------------------- */ + +double SNAIntel::memory_usage() +{ + int jdimpq = twojmax + 2; + int jdim = twojmax + 1; + double bytes; + + bytes = 0; + + bytes += (double)jdimpq*jdimpq * sizeof(double); // pqarray + bytes += (double)idxcg_max * sizeof(double); // cglist + + bytes += (double)nmax * idxu_max * sizeof(SNA_DVEC) * 2; // ulist_ij + bytes += (double)idxu_max * nelements * sizeof(SNA_DVEC) * 2; // ulisttot + bytes += (double)idxu_max * 3 * sizeof(SNA_DVEC) * 2; // dulist + + bytes += (double)idxz_max * ndoubles * sizeof(SNA_DVEC) * 2; // zlist + bytes += (double)idxb_max * ntriples * sizeof(SNA_DVEC); // blist + bytes += (double)idxb_max * ntriples * 3 * sizeof(double); // dblist + bytes += (double)idxu_max * nelements * sizeof(SNA_DVEC) * 2; // ylist + + bytes += (double)jdim * jdim * jdim * sizeof(int); // idxcg_block + bytes += (double)jdim * sizeof(int); // idxu_block + bytes += (double)jdim * jdim * jdim * sizeof(int); // idxz_block + bytes += (double)jdim * jdim * jdim * sizeof(int); // idxb_block + + bytes += (double)idxz_max * sizeof(SNA_ZINDICES); // idxz + bytes += (double)idxb_max * sizeof(SNA_BINDICES); // idxb + + if (bzero_flag) + bytes += (double)jdim * sizeof(double); // bzero + + bytes += (double)nmax * 3 * sizeof(SNA_DVEC); // rij + bytes += (double)nmax * sizeof(SNA_IVEC); // inside + bytes += (double)nmax * sizeof(SNA_DVEC); // wj + bytes += (double)nmax * sizeof(SNA_DVEC); // rcutij + bytes += (double)nmax * sizeof(SNA_DVEC); // sinnerij + bytes += (double)nmax * sizeof(SNA_DVEC); // dinnerij + if (chem_flag) bytes += (double)nmax * sizeof(SNA_IVEC); // element + + return bytes; +} + +/* ---------------------------------------------------------------------- */ + +void SNAIntel::create_twojmax_arrays() +{ + int jdimpq = twojmax + 2; + memory->create(rootpqarray, jdimpq, jdimpq, + "sna:rootpqarray"); + memory->create(cglist, idxcg_max, "sna:cglist"); + memory->create(ulisttot_r, idxu_max*nelements, "sna:ulisttot"); + memory->create(ulisttot_i, idxu_max*nelements, "sna:ulisttot"); + memory->create(dulist_r, idxu_max, 3, "sna:dulist"); + memory->create(dulist_i, idxu_max, 3, "sna:dulist"); + memory->create(zlist_r, idxz_max*ndoubles, "sna:zlist"); + memory->create(zlist_i, idxz_max*ndoubles, "sna:zlist"); + memory->create(blist, idxb_max*ntriples, "sna:blist"); + memory->create(dblist, idxb_max*ntriples, 3, "sna:dblist"); + memory->create(ylist_r, idxu_max*nelements, "sna:ylist"); + memory->create(ylist_i, idxu_max*nelements, "sna:ylist"); + + if (bzero_flag) + memory->create(bzero, twojmax+1,"sna:bzero"); + else + bzero = nullptr; + +} + +/* ---------------------------------------------------------------------- */ + +void SNAIntel::destroy_twojmax_arrays() +{ + memory->destroy(rootpqarray); + memory->destroy(cglist); + memory->destroy(ulisttot_r); + memory->destroy(ulisttot_i); + memory->destroy(dulist_r); + memory->destroy(dulist_i); + memory->destroy(zlist_r); + memory->destroy(zlist_i); + memory->destroy(blist); + memory->destroy(dblist); + memory->destroy(ylist_r); + memory->destroy(ylist_i); + + memory->destroy(idxcg_block); + memory->destroy(idxu_block); + memory->destroy(idxz_block); + memory->destroy(idxb_block); + + if (bzero_flag) + memory->destroy(bzero); + +} + +/* ---------------------------------------------------------------------- + the function delta given by VMK Eq. 8.2(1) +------------------------------------------------------------------------- */ + +double SNAIntel::deltacg(int j1, int j2, int j) +{ + double sfaccg = factorial((j1 + j2 + j) / 2 + 1); + return sqrt(factorial((j1 + j2 - j) / 2) * + factorial((j1 - j2 + j) / 2) * + factorial((-j1 + j2 + j) / 2) / sfaccg); +} + +/* ---------------------------------------------------------------------- + assign Clebsch-Gordan coefficients using + the quasi-binomial formula VMK 8.2.1(3) +------------------------------------------------------------------------- */ + +void SNAIntel::init_clebsch_gordan() +{ + double sum,dcg,sfaccg; + int m, aa2, bb2, cc2; + int ifac; + + int idxcg_count = 0; + for (int j1 = 0; j1 <= twojmax; j1++) + for (int j2 = 0; j2 <= j1; j2++) + for (int j = j1 - j2; j <= MIN(twojmax, j1 + j2); j += 2) { + for (int m1 = 0; m1 <= j1; m1++) { + aa2 = 2 * m1 - j1; + + for (int m2 = 0; m2 <= j2; m2++) { + + // -c <= cc <= c + + bb2 = 2 * m2 - j2; + m = (aa2 + bb2 + j) / 2; + + if (m < 0 || m > j) { + cglist[idxcg_count] = 0.0; + idxcg_count++; + continue; + } + + sum = 0.0; + + for (int z = MAX(0, MAX(-(j - j2 + aa2) + / 2, -(j - j1 - bb2) / 2)); + z <= MIN((j1 + j2 - j) / 2, + MIN((j1 - aa2) / 2, (j2 + bb2) / 2)); + z++) { + ifac = z % 2 ? -1 : 1; + sum += ifac / + (factorial(z) * + factorial((j1 + j2 - j) / 2 - z) * + factorial((j1 - aa2) / 2 - z) * + factorial((j2 + bb2) / 2 - z) * + factorial((j - j2 + aa2) / 2 + z) * + factorial((j - j1 - bb2) / 2 + z)); + } + + cc2 = 2 * m - j; + dcg = deltacg(j1, j2, j); + sfaccg = sqrt(factorial((j1 + aa2) / 2) * + factorial((j1 - aa2) / 2) * + factorial((j2 + bb2) / 2) * + factorial((j2 - bb2) / 2) * + factorial((j + cc2) / 2) * + factorial((j - cc2) / 2) * + (j + 1)); + + cglist[idxcg_count] = sum * dcg * sfaccg; + idxcg_count++; + } + } + } +} + +/* ---------------------------------------------------------------------- + print out values of Clebsch-Gordan coefficients + format and notation follows VMK Table 8.11 +------------------------------------------------------------------------- */ + +void SNAIntel::print_clebsch_gordan() +{ + if (comm->me) return; + + int aa2, bb2, cc2; + for (int j = 0; j <= twojmax; j += 1) { + printf("c = %g\n",j/2.0); + printf("a alpha b beta C_{a alpha b beta}^{c alpha+beta}\n"); + for (int j1 = 0; j1 <= twojmax; j1++) + for (int j2 = 0; j2 <= j1; j2++) + if (j1-j2 <= j && j1+j2 >= j && (j1+j2+j)%2 == 0) { + int idxcg_count = idxcg_block[j1][j2][j]; + for (int m1 = 0; m1 <= j1; m1++) { + aa2 = 2*m1-j1; + for (int m2 = 0; m2 <= j2; m2++) { + bb2 = 2*m2-j2; + double cgtmp = cglist[idxcg_count]; + cc2 = aa2+bb2; + if (cc2 >= -j && cc2 <= j) + if (j1 != j2 || (aa2 > bb2 && aa2 >= -bb2) || (aa2 == bb2 && aa2 >= 0)) + printf("%4g %4g %4g %4g %10.6g\n", + j1/2.0,aa2/2.0,j2/2.0,bb2/2.0,cgtmp); + idxcg_count++; + } + } + } + } +} + +/* ---------------------------------------------------------------------- + pre-compute table of sqrt[p/m2], p, q = 1,twojmax + the p = 0, q = 0 entries are allocated and skipped for convenience. +------------------------------------------------------------------------- */ + +void SNAIntel::init_rootpqarray() +{ + for (int p = 1; p <= twojmax; p++) + for (int q = 1; q <= twojmax; q++) + rootpqarray[p][q] = sqrt(static_cast(p)/q); +} + +/* ---------------------------------------------------------------------- */ + +void SNAIntel::compute_ncoeff() +{ + int ncount; + + ncount = 0; + + for (int j1 = 0; j1 <= twojmax; j1++) + for (int j2 = 0; j2 <= j1; j2++) + for (int j = j1 - j2; + j <= MIN(twojmax, j1 + j2); j += 2) + if (j >= j1) ncount++; + + ndoubles = nelements*nelements; + ntriples = nelements*nelements*nelements; + if (chem_flag) + ncoeff = ncount*ntriples; + else + ncoeff = ncount; +} + +/* ---------------------------------------------------------------------- */ + +double SNAIntel::compute_sfac(double r, double rcut, double sinner, double dinner) +{ + double sfac; + + // calculate sfac = sfac_outer + + if (switch_flag == 0) sfac = 1.0; + else if (r <= rmin0) sfac = 1.0; + else if (r > rcut) sfac = 0.0; + else { + double rcutfac = MY_PI / (rcut - rmin0); + sfac = 0.5 * (cos((r - rmin0) * rcutfac) + 1.0); + } + + // calculate sfac *= sfac_inner, rarely visited + + if (switch_inner_flag == 1 && r < sinner + dinner) { + if (r > sinner - dinner) { + double rcutfac = MY_PI2 / dinner; + sfac *= 0.5 * (1.0 - cos(MY_PI2 + (r - sinner) * rcutfac)); + } else sfac = 0.0; + } + + return sfac; +} + +/* ---------------------------------------------------------------------- */ + +SNA_DVEC SNAIntel::compute_sfac(const SNA_DVEC &r, const SNA_DVEC &rcut, + const SNA_DVEC &sinner, const SNA_DVEC &dinner) +{ + // calculate sfac = sfac_outer + + // if (switch_flag == 0 || r <= rmin0) + SNA_DVEC sfac = SIMD_set(1.0); + if (switch_flag != 0) { + // r <= rcut && r > rmin0 + const SIMD_mask i(r > rmin0); + const SIMD_mask m(r <= rcut); + const SNA_DVEC rcutfac = SIMD_rcp(rcut - rmin0) * MY_PI; + const SNA_DVEC sfac_m = (SIMD_cos((r - rmin0) * rcutfac) + 1.0) * 0.5; + sfac = SIMD_set(sfac, m & i, sfac_m); + // (r > rcut) && (r> rmin0) + sfac = SIMD_zero_masked(m | i, sfac); + } + + // calculate sfac *= sfac_inner, rarely visited + + if (switch_inner_flag == 1) { + const SIMD_mask m(r < sinner + dinner); + // if any(m) + const SIMD_mask i(r > sinner - dinner); + const SNA_DVEC rcutfac = SIMD_rcp(dinner) * MY_PI2; + const SNA_DVEC sfac_m = (SIMD_set(1.0) - SIMD_cos((r-sinner) * rcutfac + + MY_PI2)) * 0.5; + sfac = SIMD_set(sfac, m & i, sfac_m); + sfac = SIMD_zero_masked((~m) | i, sfac); + } + + return sfac; +} + +/* ---------------------------------------------------------------------- */ + +SNA_DVEC SNAIntel::compute_sfac_dsfac(const SNA_DVEC & r, + const SNA_DVEC & rcut, + const SNA_DVEC & sinner, + const SNA_DVEC & dinner, + SNA_DVEC &dsfac) +{ + // calculate sfac = sfac_outer + + // if (switch_flag == 0 || r <= rmin0) + SNA_DVEC sfac = SIMD_set(1.0); + dsfac = SIMD_set(0.0); + if (switch_flag != 0) { + // r <= rcut && r > rmin0 + const SIMD_mask i(r > rmin0); + const SIMD_mask m(r <= rcut); + const SNA_DVEC rcutfac = SIMD_rcp(rcut - rmin0) * MY_PI; + const SNA_DVEC trig_arg = (r - rmin0) * rcutfac; + const SNA_DVEC sfac_m = (SIMD_cos(trig_arg) + 1.0) * 0.5; + const SNA_DVEC dsfac_m = SIMD_sin(trig_arg) * rcutfac * -0.5; + sfac = SIMD_set(sfac, m & i, sfac_m); + dsfac = SIMD_set(dsfac, m & i, dsfac_m); + // (r > rcut) && (r> rmin0) + sfac = SIMD_zero_masked(m | i, sfac); + } + + // calculate sfac *= sfac_inner, rarely visited + + if (switch_inner_flag == 1) { + const SIMD_mask m(r < sinner + dinner); + const SIMD_mask i(r > sinner - dinner); + if (any(m & i)) { + const SNA_DVEC rcutfac = SIMD_rcp(dinner) * MY_PI2; + const SNA_DVEC trig_arg = (r - sinner) * rcutfac + MY_PI2; + const SNA_DVEC sfac_inner = (SIMD_set(1.0) - SIMD_cos(trig_arg)) * 0.5; + const SNA_DVEC dsfac_inner = rcutfac * 0.5 * SIMD_sin(trig_arg); + dsfac = SIMD_set(dsfac, m & i, dsfac * sfac_inner + + sfac * dsfac_inner); + sfac = SIMD_set(sfac, m & i, sfac_inner); + } + sfac = SIMD_zero_masked((~m) | i, sfac); + dsfac = SIMD_zero_masked((~m) | i, dsfac); + } + + return sfac; +} + +template void SNAIntel::compute_zi_or_yi<1>(const SNA_DVEC *); +template void SNAIntel::compute_zi_or_yi<0>(const SNA_DVEC *); + +#endif +#endif diff --git a/src/INTEL/sna_intel.h b/src/INTEL/sna_intel.h new file mode 100644 index 0000000000..7900dee51b --- /dev/null +++ b/src/INTEL/sna_intel.h @@ -0,0 +1,187 @@ +/* -*- c++ -*- ------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing authors: W. Michael Brown, Intel +------------------------------------------------------------------------- */ + +#ifndef LMP_SNA_INTEL_H +#define LMP_SNA_INTEL_H + +#if defined(__AVX512F__) +#if defined(__INTEL_COMPILER) || defined(__INTEL_LLVM_COMPILER) + +#include "pointers.h" +#include "intel_buffers.h" +#include "intel_simd.h" + +#define SVW 8 + +#if defined(LMP_SIMD_COMPILER) +#if defined(USE_OMP_SIMD) +#define SV_for _Pragma("omp simd") _Pragma("vector aligned") for +#else +#define SV_for _Pragma("simd assert") _Pragma("vector aligned") for +#endif +#else +#define SV_for for +#endif + +namespace LAMMPS_NS { + +struct SNA_ZINDICES { + int j1, j2, j, ma1min, ma2max, mb1min; + int mb2max, na, nb, jju; +}; + +struct SNA_BINDICES { + int j1, j2, j; +}; + +#define SNA_DVEC ip_simd::SIMD_double +#define SNA_IVEC ip_simd::SIMD256_int + +class SNAIntel : protected Pointers { + + public: + SNAIntel(LAMMPS *, double, int, double, int, int, int, int, int, int, int); + + SNAIntel(LAMMPS *lmp) : Pointers(lmp){}; + ~SNAIntel() override; + void build_indexlist(); + void init(); + double memory_usage(); + + int ncoeff; + + inline int vector_width() const { return SVW; } + + // functions for bispectrum coefficients + + void compute_ui(const SNA_IVEC &, const SNA_IVEC &, const int max_jnum); + template void compute_zi_or_yi(const SNA_DVEC *); + void compute_yi_from_zi(const SNA_DVEC *); + void compute_yterm(int, int, int, const double *); + void compute_bi(const SNA_IVEC &); + + // functions for derivatives + + void compute_duidrj(const int, const SNA_IVEC &); + void compute_deidrj_e(const int, const SNA_IVEC &, SNA_DVEC *); + void compute_deidrj(const int, const SNA_IVEC &, SNA_DVEC *); + double compute_sfac(double, double, double, double); + SNA_DVEC compute_sfac(const SNA_DVEC &, const SNA_DVEC &, const SNA_DVEC &, + const SNA_DVEC &); + inline SNA_DVEC compute_sfac_dsfac(const SNA_DVEC &, const SNA_DVEC &, + const SNA_DVEC &, const SNA_DVEC &, + SNA_DVEC &); + + // public bispectrum data + + int twojmax; + SNA_DVEC *blist; + double **dblist; + + // short neighbor list data + + void grow_rij(int); + int nmax; // allocated size of short lists + + SNA_DVEC **rij; // short rij list + SNA_IVEC *inside; // short neighbor list + SNA_DVEC *wj; // short weight list + SNA_DVEC *rcutij; // short cutoff list + + // only allocated for switch_inner_flag=1 + + SNA_DVEC *sinnerij; // short inner cutoff midpoint list + SNA_DVEC *dinnerij; // short inner half-width list + + // only allocated for chem_flag=1 + + SNA_IVEC *element; // short element list [0,nelements) + + private: + double rmin0, rfac0; + + // data for bispectrum coefficients + + SNA_ZINDICES *idxz; + SNA_BINDICES *idxb; + + double **rootpqarray; + double *cglist; + int ***idxcg_block; + + SNA_DVEC *ulisttot_r, *ulisttot_i; + SNA_DVEC **ulist_r_ij, **ulist_i_ij; // short u list + int *idxu_block; + + SNA_DVEC *zlist_r, *zlist_i; + int ***idxz_block; + + int ***idxb_block; + + SNA_DVEC **dulist_r, **dulist_i; + + SNA_DVEC *ylist_r, *ylist_i; + int idxcg_max, idxu_max, idxz_max, idxb_max; + + void create_twojmax_arrays(); + void destroy_twojmax_arrays(); + void init_clebsch_gordan(); + void print_clebsch_gordan(); + void init_rootpqarray(); + void zero_uarraytot(const SNA_IVEC &); + void add_uarraytot(const SNA_DVEC &, const int, const SNA_IVEC &); + void compute_uarray(const SNA_DVEC &, const SNA_DVEC &, const SNA_DVEC &, + const SNA_DVEC &, const SNA_DVEC &, const int, + const SNA_IVEC &); + double deltacg(int, int, int); + void compute_ncoeff(); + void compute_duarray(const SNA_DVEC &, const SNA_DVEC &, const SNA_DVEC &, + const SNA_DVEC &, const SNA_DVEC &, const SNA_DVEC &, + const SNA_DVEC &, const SNA_DVEC &, int, + const SNA_IVEC &); + inline double choose_beta(const int, const int, const int, + const int, const int, const int, int &); + + // Sets the style for the switching function + // 0 = none + // 1 = cosine + int switch_flag; + + // Sets the style for the inner switching function + // 0 = none + // 1 = cosine + int switch_inner_flag; + + // Self-weight + double wself; + + int bzero_flag; // 1 if bzero subtracted from barray + double *bzero; // array of B values for isolated atoms + int bnorm_flag; // 1 if barray divided by j+1 + int chem_flag; // 1 for multi-element bispectrum components + int wselfall_flag; // 1 for adding wself to all element labelings + int nelements; // number of elements + int ndoubles; // number of multi-element pairs + int ntriples; // number of multi-element triplets +}; + +} // namespace LAMMPS_NS + +#endif +#endif + +#endif From 5e657e5adbd624a5d50829cc1f6406b332f0d663 Mon Sep 17 00:00:00 2001 From: "W. Michael Brown" Date: Thu, 14 Sep 2023 18:01:55 -0400 Subject: [PATCH 068/219] Intel Package: Adding documentation changes for snap variant. --- doc/src/pair_snap.rst | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/doc/src/pair_snap.rst b/doc/src/pair_snap.rst index ebedb288c1..df8cb9ad6c 100644 --- a/doc/src/pair_snap.rst +++ b/doc/src/pair_snap.rst @@ -1,10 +1,11 @@ .. index:: pair_style snap +.. index:: pair_style snap/intel .. index:: pair_style snap/kk pair_style snap command ======================= -Accelerator Variants: *snap/kk* +Accelerator Variants: *snap/intel*, *snap/kk* Syntax """""" @@ -258,7 +259,15 @@ Restrictions This style is part of the ML-SNAP package. It is only enabled if LAMMPS was built with that package. See the :doc:`Build package -` page for more info. +` page for more info. The *intel* accelerator variant +will only be available LAMMPS is built with Intel compilers for CPUs +with AVX-512 support. While the *intel* package allows multiple floating +point precision modes to be selected, snap will currently use full +double precision regardless of the precision mode selected. +Additionally, the *intel* variant of snap will not use multiple threads +with OpenMP. + + Related commands """""""""""""""" From 7b4ca086a8692b2989e7279d7e18c94944ee801e Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 14 Sep 2023 19:08:15 -0400 Subject: [PATCH 069/219] documentation updates, clarifications, and corrections --- doc/src/Commands_pair.rst | 2 +- doc/src/pair_snap.rst | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/doc/src/Commands_pair.rst b/doc/src/Commands_pair.rst index c45a1d778c..0d54913bd7 100644 --- a/doc/src/Commands_pair.rst +++ b/doc/src/Commands_pair.rst @@ -265,7 +265,7 @@ OPT. * :doc:`smd/tri_surface ` * :doc:`smd/ulsph ` * :doc:`smtbq ` - * :doc:`snap (k) ` + * :doc:`snap (ik) ` * :doc:`soft (go) ` * :doc:`sph/heatconduction ` * :doc:`sph/idealgas ` diff --git a/doc/src/pair_snap.rst b/doc/src/pair_snap.rst index df8cb9ad6c..ffc43c712a 100644 --- a/doc/src/pair_snap.rst +++ b/doc/src/pair_snap.rst @@ -259,15 +259,15 @@ Restrictions This style is part of the ML-SNAP package. It is only enabled if LAMMPS was built with that package. See the :doc:`Build package -` page for more info. The *intel* accelerator variant -will only be available LAMMPS is built with Intel compilers for CPUs -with AVX-512 support. While the *intel* package allows multiple floating -point precision modes to be selected, snap will currently use full -double precision regardless of the precision mode selected. -Additionally, the *intel* variant of snap will not use multiple threads -with OpenMP. - +` page for more info. +The *snap/intel* accelerator variant will *only* be available if LAMMPS +is built with Intel *compilers* and for CPUs with AVX-512 support. +While the INTEL package in general allows multiple floating point +precision modes to be selected, *snap/intel* will currently always use +full double precision regardless of the precision mode selected. +Additionally, the *intel* variant of snap will **NOT** use multiple +threads with OpenMP. Related commands """""""""""""""" From d1e405e83f0fc1dec8583064eb2505983447a1c5 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 14 Sep 2023 19:08:38 -0400 Subject: [PATCH 070/219] ML-SNAP now also has INTEL as dependent package --- src/Depend.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Depend.sh b/src/Depend.sh index 4004f12686..b88c527b55 100755 --- a/src/Depend.sh +++ b/src/Depend.sh @@ -185,6 +185,7 @@ fi if (test $1 = "ML-SNAP") then depend ML-IAP depend KOKKOS + depend INTEL fi if (test $1 = "CG-SPICA") then From 508dbb74c58c252a7833c959e1802618de43cb24 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 15 Sep 2023 08:37:32 -0400 Subject: [PATCH 071/219] print warning when using threads that snap/intel will not use them --- src/INTEL/pair_snap_intel.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/INTEL/pair_snap_intel.cpp b/src/INTEL/pair_snap_intel.cpp index 7417b08f9d..d91f0adc36 100644 --- a/src/INTEL/pair_snap_intel.cpp +++ b/src/INTEL/pair_snap_intel.cpp @@ -336,6 +336,8 @@ void PairSNAPIntel::settings(int narg, char ** /* arg */) { if (narg > 0) error->all(FLERR,"Illegal pair_style command"); + if ((comm->me == 0) && (comm->nthreads > 1)) + error->warning(FLERR, "Pair style snap/intel does not use OpenMP threads"); } /* ---------------------------------------------------------------------- From cf8b1577027f5c236000e227571213814cc383ce Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 17 Sep 2023 19:38:53 -0400 Subject: [PATCH 072/219] use QtRegExp for QT 5.12 on Ubuntu 20.04LTS --- tools/lammps-gui/lammpsgui.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tools/lammps-gui/lammpsgui.cpp b/tools/lammps-gui/lammpsgui.cpp index 1f997f53b8..6e3cae8cca 100644 --- a/tools/lammps-gui/lammpsgui.cpp +++ b/tools/lammps-gui/lammpsgui.cpp @@ -1106,7 +1106,11 @@ void LammpsGui::render_image() // add a run 0 and thus create the state of the initial system without running. // this will allow us to create a snapshot image. auto saved = ui->textEdit->textCursor(); +#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0) + if (ui->textEdit->find(QRegExp(QStringLiteral("^\\s*(run|minimize)\\s+")))) { +#else if (ui->textEdit->find(QRegularExpression(QStringLiteral("^\\s*(run|minimize)\\s+")))) { +#endif auto cursor = ui->textEdit->textCursor(); cursor.movePosition(QTextCursor::PreviousBlock); cursor.movePosition(QTextCursor::EndOfLine); From 20be9e64cfd69efb0c36fcc5837eec100c4cd633 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 17 Sep 2023 19:39:31 -0400 Subject: [PATCH 073/219] use split_line convenience function for better consistency and backward compatibility --- tools/lammps-gui/codeeditor.cpp | 26 +++++++++++++------------- tools/lammps-gui/lammpsgui.cpp | 2 +- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/tools/lammps-gui/codeeditor.cpp b/tools/lammps-gui/codeeditor.cpp index 6c7ae33283..07cb63bc98 100644 --- a/tools/lammps-gui/codeeditor.cpp +++ b/tools/lammps-gui/codeeditor.cpp @@ -173,7 +173,7 @@ CodeEditor::CodeEditor(QWidget *parent) : if (help_index.open(QIODevice::ReadOnly | QIODevice::Text)) { while (!help_index.atEnd()) { auto line = QString(help_index.readLine()); - auto words = line.trimmed().split(' '); + auto words = line.trimmed().replace('\t', ' ').split(' '); if (words.size() > 2) { if (words.at(1) == "pair_style") { pair_map[words.at(2)] = words.at(0); @@ -396,8 +396,8 @@ void CodeEditor::setGroupList() cursor.movePosition(QTextCursor::Start); setTextCursor(cursor); while (find(groupcmd)) { - auto words = textCursor().block().text().replace('\t', ' ').split(' ', Qt::SkipEmptyParts); - if ((words.size() > 1) && !groups.contains(words[1])) groups << words[1]; + auto words = split_line(textCursor().block().text().replace('\t', ' ').toStdString()); + if ((words.size() > 1) && !groups.contains(words[1].c_str())) groups << words[1].c_str(); } groups.sort(); groups.prepend(QStringLiteral("all")); @@ -426,13 +426,13 @@ void CodeEditor::setVarNameList() cursor.movePosition(QTextCursor::Start); setTextCursor(cursor); while (find(varcmd)) { - auto words = textCursor().block().text().replace('\t', ' ').split(' ', Qt::SkipEmptyParts); + auto words = split_line(textCursor().block().text().replace('\t', ' ').toStdString()); if ((words.size() > 1)) { - QString w = QString("$%1").arg(words[1]); + QString w = QString("$%1").arg(words[1].c_str()); if ((words[1].size() == 1) && !vars.contains(w)) vars << w; - w = QString("${%1}").arg(words[1]); + w = QString("${%1}").arg(words[1].c_str()); if (!vars.contains(w)) vars << w; - w = QString("v_%1").arg(words[1]); + w = QString("v_%1").arg(words[1].c_str()); if (!vars.contains(w)) vars << w; } } @@ -452,11 +452,11 @@ void CodeEditor::setComputeIDList() cursor.movePosition(QTextCursor::Start); setTextCursor(cursor); while (find(compcmd)) { - auto words = textCursor().block().text().replace('\t', ' ').split(' ', Qt::SkipEmptyParts); + auto words = split_line(textCursor().block().text().replace('\t', ' ').toStdString()); if ((words.size() > 1)) { - QString w = QString("c_%1").arg(words[1]); + QString w = QString("c_%1").arg(words[1].c_str()); if (!compid.contains(w)) compid << w; - w = QString("C_%1").arg(words[1]); + w = QString("C_%1").arg(words[1].c_str()); if (!compid.contains(w)) compid << w; } } @@ -476,11 +476,11 @@ void CodeEditor::setFixIDList() cursor.movePosition(QTextCursor::Start); setTextCursor(cursor); while (find(fixcmd)) { - auto words = textCursor().block().text().replace('\t', ' ').split(' ', Qt::SkipEmptyParts); + auto words = split_line(textCursor().block().text().replace('\t', ' ').toStdString()); if ((words.size() > 1)) { - QString w = QString("f_%1").arg(words[1]); + QString w = QString("f_%1").arg(words[1].c_str()); if (!fixid.contains(w)) fixid << w; - w = QString("F_%1").arg(words[1]); + w = QString("F_%1").arg(words[1].c_str()); if (!fixid.contains(w)) fixid << w; } } diff --git a/tools/lammps-gui/lammpsgui.cpp b/tools/lammps-gui/lammpsgui.cpp index 6e3cae8cca..7fff307ed3 100644 --- a/tools/lammps-gui/lammpsgui.cpp +++ b/tools/lammps-gui/lammpsgui.cpp @@ -528,7 +528,7 @@ void LammpsGui::update_recents(const QString &filename) void LammpsGui::update_variables() { - const auto doc = ui->textEdit->toPlainText().split('\n'); + const auto doc = ui->textEdit->toPlainText().replace('\t', ' ').split('\n'); QStringList known; QRegularExpression indexvar("^\\s*variable\\s+(\\w+)\\s+index\\s+(.*)"); QRegularExpression anyvar("^\\s*variable\\s+(\\w+)\\s+(\\w+)\\s+(.*)"); From 7f4de6b8b9e8e0a216555ad7293c9873cc6be8c6 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 17 Sep 2023 19:52:00 -0400 Subject: [PATCH 074/219] more use of QRegExp instead of QRegularExpression for QT version < 5.15 --- tools/lammps-gui/codeeditor.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/tools/lammps-gui/codeeditor.cpp b/tools/lammps-gui/codeeditor.cpp index 07cb63bc98..84026b9f7a 100644 --- a/tools/lammps-gui/codeeditor.cpp +++ b/tools/lammps-gui/codeeditor.cpp @@ -389,7 +389,11 @@ COMPLETER_INIT_FUNC(units, Units) void CodeEditor::setGroupList() { QStringList groups; +#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0) + QRegExp groupcmd(QStringLiteral("^\\s*group\\s+(\\S+)(\\s+|$)")); +#else QRegularExpression groupcmd(QStringLiteral("^\\s*group\\s+(\\S+)(\\s+|$)")); +#endif auto saved = textCursor(); // reposition cursor to beginning of text and search for group commands auto cursor = textCursor(); @@ -419,7 +423,11 @@ void CodeEditor::setVarNameList() vars << QString("v_%1").arg(buffer); } +#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0) + QRegExp varcmd(QStringLiteral("^\\s*variable\\s+(\\S+)(\\s+|$)")); +#else QRegularExpression varcmd(QStringLiteral("^\\s*variable\\s+(\\S+)(\\s+|$)")); +#endif auto saved = textCursor(); // reposition cursor to beginning of text and search for group commands auto cursor = textCursor(); @@ -445,7 +453,11 @@ void CodeEditor::setVarNameList() void CodeEditor::setComputeIDList() { QStringList compid; +#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0) + QRegExp compcmd(QStringLiteral("^\\s*compute\\s+(\\S+)\\s+")); +#else QRegularExpression compcmd(QStringLiteral("^\\s*compute\\s+(\\S+)\\s+")); +#endif auto saved = textCursor(); // reposition cursor to beginning of text and search for group commands auto cursor = textCursor(); @@ -469,7 +481,11 @@ void CodeEditor::setComputeIDList() void CodeEditor::setFixIDList() { QStringList fixid; +#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0) + QRegExp fixcmd(QStringLiteral("^\\s*fix\\s+(\\S+)\\s+")); +#else QRegularExpression fixcmd(QStringLiteral("^\\s*fix\\s+(\\S+)\\s+")); +#endif auto saved = textCursor(); // reposition cursor to beginning of text and search for group commands auto cursor = textCursor(); From 70a8aff56119324ad93e306337f96e72cc0623de Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 17 Sep 2023 20:45:02 -0400 Subject: [PATCH 075/219] update todo list --- tools/lammps-gui/TODO.md | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/tools/lammps-gui/TODO.md b/tools/lammps-gui/TODO.md index e2ff9cb42f..8f752ac43a 100644 --- a/tools/lammps-gui/TODO.md +++ b/tools/lammps-gui/TODO.md @@ -1,15 +1,13 @@ LAMMPS-GUI TODO list: -# Short term goals +# Short term goals (v1.x) -- add "syntax check" with enabled "-skiprun" flag -- implement "static" completion for fix/compute/styles/region etc... -- implement "dynamic" completion for variable names, group names, molecule names, compute/dump/fix/region/group IDs - implement indenting regions for (nested) loops? -# Long term ideas +# Long term ideas (v2.x) - rewrite entire application to build the App and its layout manually -- port to Qt6 +- port to Qt6 (with compatibility to Qt5?) - also a rewrite should establish consistent naming conventions. now we have a mix of LAMMPS style, Qt style, and others. - add option to attach a debugger to the running program (highly non-portable, need customization support in preferences) - write a "wizard" dialog that can be used for beginners to create an input file template for a few typical use scenarios + (could perhaps use some LLM based KI to look up suggestions for answers?). From 934055601b43b0a9f174d74cdd02c817f47846cc Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 18 Sep 2023 18:03:27 -0400 Subject: [PATCH 076/219] change insertion function to always replace partial word with completion Also change popup mode to always display all possible completions and only highlight the current selection. This seems more beginner friendly. --- tools/lammps-gui/codeeditor.cpp | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/tools/lammps-gui/codeeditor.cpp b/tools/lammps-gui/codeeditor.cpp index 84026b9f7a..01e71d087c 100644 --- a/tools/lammps-gui/codeeditor.cpp +++ b/tools/lammps-gui/codeeditor.cpp @@ -138,7 +138,7 @@ CodeEditor::CodeEditor(QWidget *parent) : // set up completer class (without a model currently) #define COMPLETER_SETUP(completer) \ - completer->setCompletionMode(QCompleter::PopupCompletion); \ + completer->setCompletionMode(QCompleter::UnfilteredPopupCompletion); \ completer->setModelSorting(QCompleter::CaseInsensitivelySortedModel); \ completer->setWidget(this); \ completer->setMaxVisibleItems(16); \ @@ -940,10 +940,8 @@ void CodeEditor::insertCompletedCommand(const QString &completion) auto *completer = qobject_cast(sender()); if (completer->widget() != this) return; auto cursor = textCursor(); - int extra = completion.length() - completer->completionPrefix().length(); - cursor.movePosition(QTextCursor::Left); - cursor.movePosition(QTextCursor::EndOfWord); - cursor.insertText(completion.right(extra)); + cursor.movePosition(QTextCursor::StartOfWord, QTextCursor::KeepAnchor); + cursor.insertText(completion); setTextCursor(cursor); } From d371550f5fbaade20abbd2482cf2efc3e14bd262 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 18 Sep 2023 19:19:37 -0400 Subject: [PATCH 077/219] step lammps-gui version patch number --- tools/lammps-gui/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/lammps-gui/CMakeLists.txt b/tools/lammps-gui/CMakeLists.txt index 8c59ec7dc2..50eaee4d85 100644 --- a/tools/lammps-gui/CMakeLists.txt +++ b/tools/lammps-gui/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.16) -project(lammps-gui VERSION 1.5.4 LANGUAGES CXX) +project(lammps-gui VERSION 1.5.5 LANGUAGES CXX) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTOMOC ON) From a46399564614f9c2d8184a1a658475efe489a644 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 21 Sep 2023 19:09:04 -0400 Subject: [PATCH 078/219] add dependencies for building dmg bundle --- tools/lammps-gui/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/lammps-gui/CMakeLists.txt b/tools/lammps-gui/CMakeLists.txt index 50eaee4d85..305e9872d2 100644 --- a/tools/lammps-gui/CMakeLists.txt +++ b/tools/lammps-gui/CMakeLists.txt @@ -165,7 +165,7 @@ if(APPLE) COMMAND ${CMAKE_COMMAND} -E copy_if_different ${LAMMPS_DIR}/doc/lammps.1 ${APP_CONTENTS}/share/lammps/man/man1/ COMMAND ${CMAKE_COMMAND} -E create_symlink lammps.1 ${APP_CONTENTS}/share/lammps/man/man1/lmp.1 COMMAND ${CMAKE_COMMAND} -E copy_if_different ${LAMMPS_DIR}/doc/msi2lmp.1 ${APP_CONTENTS}/share/lammps/man/man1 - DEPENDS lammps-gui lammps + DEPENDS lammps-gui lammps lmp binary2txt stl_bin2txt msi2lmp phana COMMENT "Copying additional files into macOS app bundle tree" WORKING_DIRECTORY ${CMAKE_BINARY_DIR} ) From 57b3b74bcddf356fd9e8e301cd60d25801fe8f0d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 21 Sep 2023 19:09:26 -0400 Subject: [PATCH 079/219] link gui to jpeg and png libs --- tools/lammps-gui/CMakeLists.txt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tools/lammps-gui/CMakeLists.txt b/tools/lammps-gui/CMakeLists.txt index 305e9872d2..47406fd4cb 100644 --- a/tools/lammps-gui/CMakeLists.txt +++ b/tools/lammps-gui/CMakeLists.txt @@ -132,6 +132,12 @@ if(BUILD_OMP) find_package(OpenMP COMPONENTS CXX REQUIRED) target_link_libraries(lammps-gui PRIVATE OpenMP::OpenMP_CXX) endif() +if(WITH_JPEG) + target_link_libraries(lammps-gui PRIVATE JPEG::JPEG) +endif() +if(WITH_PNG) + target_link_libraries(lammps-gui PRIVATE PNG::PNG ZLIB::ZLIB) +endif() # when compiling on macOS, create an "app bundle" if(APPLE) From a9f15f6a297a724ebb1cb5734cdf7de8ea710467 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 21 Sep 2023 19:09:57 -0400 Subject: [PATCH 080/219] update preset --- cmake/presets/macos-multiarch.cmake | 2 -- 1 file changed, 2 deletions(-) diff --git a/cmake/presets/macos-multiarch.cmake b/cmake/presets/macos-multiarch.cmake index 58ef013f68..8ceaec11f8 100644 --- a/cmake/presets/macos-multiarch.cmake +++ b/cmake/presets/macos-multiarch.cmake @@ -10,5 +10,3 @@ set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG" CACHE STRING "" FORCE) set(CMAKE_C_FLAGS_RELEASE "-O3 -DNDEBUG" CACHE STRING "" FORCE) set(BUILD_MPI FALSE CACHE BOOL "" FORCE) -set(BUILD_SHARED_LIBS FALSE CACHE BOOL "" FORCE) -set(LAMMPS_EXCEPTIONS TRUE CACHE BOOL "" FORCE) From 8b40e16ebd86e9a8d3aa1488371075b1391218a7 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 21 Sep 2023 19:16:54 -0400 Subject: [PATCH 081/219] Revert "link gui to jpeg and png libs" This reverts commit 57b3b74bcddf356fd9e8e301cd60d25801fe8f0d. --- tools/lammps-gui/CMakeLists.txt | 6 ------ 1 file changed, 6 deletions(-) diff --git a/tools/lammps-gui/CMakeLists.txt b/tools/lammps-gui/CMakeLists.txt index 47406fd4cb..305e9872d2 100644 --- a/tools/lammps-gui/CMakeLists.txt +++ b/tools/lammps-gui/CMakeLists.txt @@ -132,12 +132,6 @@ if(BUILD_OMP) find_package(OpenMP COMPONENTS CXX REQUIRED) target_link_libraries(lammps-gui PRIVATE OpenMP::OpenMP_CXX) endif() -if(WITH_JPEG) - target_link_libraries(lammps-gui PRIVATE JPEG::JPEG) -endif() -if(WITH_PNG) - target_link_libraries(lammps-gui PRIVATE PNG::PNG ZLIB::ZLIB) -endif() # when compiling on macOS, create an "app bundle" if(APPLE) From 6f79918babb9dddb47ee5639725fc4555372fe38 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 21 Sep 2023 19:43:53 -0400 Subject: [PATCH 082/219] copy FFMpeg binary into app bundle --- tools/lammps-gui/CMakeLists.txt | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/tools/lammps-gui/CMakeLists.txt b/tools/lammps-gui/CMakeLists.txt index 305e9872d2..504b5c6f60 100644 --- a/tools/lammps-gui/CMakeLists.txt +++ b/tools/lammps-gui/CMakeLists.txt @@ -169,9 +169,17 @@ if(APPLE) COMMENT "Copying additional files into macOS app bundle tree" WORKING_DIRECTORY ${CMAKE_BINARY_DIR} ) + if(FFMPEG_EXECUTABLE) + add_custom_target(copy-ffmpeg + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${FFMPEG_EXECUTABLE} ${APP_CONTENTS}/bin/ + COMMENT "Copying FFMpeg into macOS app bundle tree" + DEPENDS complete-bundle + ) + set(FFMPEG_TARGET copy-ffmpeg) + endif() add_custom_target(dmg COMMAND ${LAMMPS_DIR}/cmake/packaging/build_macos_dmg.sh - DEPENDS complete-bundle + DEPENDS complete-bundle ${FFMPEG_TARGET} COMMENT "Create Drag-n-Drop installer disk image from app bundle" BYPRODUCT LAMMPS-macOS-multiarch.dmg WORKING_DIRECTORY ${CMAKE_BINARY_DIR} From c50dcf61298596dfa0f0fa703e1725add6fd6217 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 24 Sep 2023 12:53:14 -0400 Subject: [PATCH 083/219] move helper functions to separate file. add overloads to mystrdup() --- tools/lammps-gui/CMakeLists.txt | 3 +- tools/lammps-gui/helpers.cpp | 71 ++++++++++++++++++++++++++++++++ tools/lammps-gui/helpers.h | 31 ++++++++++++++ tools/lammps-gui/lammpsgui.cpp | 47 +++------------------ tools/lammps-gui/preferences.cpp | 17 +++----- 5 files changed, 115 insertions(+), 54 deletions(-) create mode 100644 tools/lammps-gui/helpers.cpp create mode 100644 tools/lammps-gui/helpers.h diff --git a/tools/lammps-gui/CMakeLists.txt b/tools/lammps-gui/CMakeLists.txt index 504b5c6f60..f6d532f891 100644 --- a/tools/lammps-gui/CMakeLists.txt +++ b/tools/lammps-gui/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.16) -project(lammps-gui VERSION 1.5.5 LANGUAGES CXX) +project(lammps-gui VERSION 1.5.6 LANGUAGES CXX) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTOMOC ON) @@ -84,6 +84,7 @@ set(PROJECT_SOURCES chartviewer.h codeeditor.cpp codeeditor.h + helpers.cpp highlighter.cpp highlighter.h imageviewer.cpp diff --git a/tools/lammps-gui/helpers.cpp b/tools/lammps-gui/helpers.cpp new file mode 100644 index 0000000000..8db7cd0d68 --- /dev/null +++ b/tools/lammps-gui/helpers.cpp @@ -0,0 +1,71 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#include "helpers.h" + +#include +#include +#include +#include + +// duplicate string, STL version +char *mystrdup(const std::string &text) +{ + auto tmp = new char[text.size() + 1]; + memcpy(tmp, text.c_str(), text.size() + 1); + return tmp; +} + +// duplicate string, pointer version +char *mystrdup(const char *text) +{ + return mystrdup(std::string(text)); +} + +// duplicate string, Qt version +char *mystrdup(const QString &text) +{ + return mystrdup(text.toStdString()); +} + +// find if executable is in path +// https://stackoverflow.com/a/51041497 + +bool has_exe(const QString &exe) +{ + QProcess findProcess; + QStringList arguments; + arguments << exe; +#if defined(_WIN32) + findProcess.start("where", arguments); +#else + findProcess.start("which", arguments); +#endif + findProcess.setReadChannel(QProcess::ProcessChannel::StandardOutput); + + if (!findProcess.waitForFinished()) return false; // Not found or which does not work + + QString retStr(findProcess.readAll()); + retStr = retStr.trimmed(); + + QFile file(retStr); + QFileInfo check_file(file); + if (check_file.exists() && check_file.isFile()) + return true; // Found! + else + return false; // Not found! +} + +// Local Variables: +// c-basic-offset: 4 +// End: diff --git a/tools/lammps-gui/helpers.h b/tools/lammps-gui/helpers.h new file mode 100644 index 0000000000..a88233b0f3 --- /dev/null +++ b/tools/lammps-gui/helpers.h @@ -0,0 +1,31 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifndef HELPERS_H +#define HELPERS_H + +#include +#include + +// duplicate string +extern char *mystrdup(const std::string &text); +extern char *mystrdup(const char *text); +extern char *mystrdup(const QString &text); + +// find if executable is in path +extern bool has_exe(const QString &exe); + +#endif +// Local Variables: +// c-basic-offset: 4 +// End: diff --git a/tools/lammps-gui/lammpsgui.cpp b/tools/lammps-gui/lammpsgui.cpp index 7fff307ed3..16e9f50e87 100644 --- a/tools/lammps-gui/lammpsgui.cpp +++ b/tools/lammps-gui/lammpsgui.cpp @@ -14,6 +14,7 @@ #include "lammpsgui.h" #include "chartviewer.h" +#include "helpers.h" #include "highlighter.h" #include "imageviewer.h" #include "lammpsrunner.h" @@ -59,42 +60,6 @@ static const QString blank(" "); static constexpr int MAXRECENT = 5; static constexpr int BUFLEN = 128; -// duplicate string -static char *mystrdup(const std::string &text) -{ - auto tmp = new char[text.size() + 1]; - memcpy(tmp, text.c_str(), text.size() + 1); - return tmp; -} - -// find if executable is in path -// https://stackoverflow.com/a/51041497 - -static bool has_exe(const QString &exe) -{ - QProcess findProcess; - QStringList arguments; - arguments << exe; -#if defined(_WIN32) - findProcess.start("where", arguments); -#else - findProcess.start("which", arguments); -#endif - findProcess.setReadChannel(QProcess::ProcessChannel::StandardOutput); - - if (!findProcess.waitForFinished()) return false; // Not found or which does not work - - QString retStr(findProcess.readAll()); - retStr = retStr.trimmed(); - - QFile file(retStr); - QFileInfo check_file(file); - if (check_file.exists() && check_file.isFile()) - return true; // Found! - else - return false; // Not found! -} - LammpsGui::LammpsGui(QWidget *parent, const char *filename) : QMainWindow(parent), ui(new Ui::LammpsGui), highlighter(nullptr), capturer(nullptr), status(nullptr), logwindow(nullptr), imagewindow(nullptr), chartwindow(nullptr), @@ -1025,11 +990,11 @@ void LammpsGui::do_run(bool use_buffer) runner = new LammpsRunner(this); is_running = true; if (use_buffer) { - // always add final newline since the text edit widget does not - char *input = mystrdup(ui->textEdit->toPlainText().toStdString() + "\n"); + // always add final newline since the text edit widget does not do it + char *input = mystrdup(ui->textEdit->toPlainText() + "\n"); runner->setup_run(&lammps, input, nullptr); } else { - char *fname = mystrdup(current_file.toStdString()); + char *fname = mystrdup(current_file); runner->setup_run(&lammps, nullptr, fname); } @@ -1418,9 +1383,9 @@ void LammpsGui::start_lammps() QString value = var.second; if (!name.isEmpty() && !value.isEmpty()) { lammps_args.push_back(mystrdup("-var")); - lammps_args.push_back(mystrdup(name.toStdString())); + lammps_args.push_back(mystrdup(name)); for (const auto &v : value.split(' ')) - lammps_args.push_back(mystrdup(v.toStdString())); + lammps_args.push_back(mystrdup(v)); } } diff --git a/tools/lammps-gui/preferences.cpp b/tools/lammps-gui/preferences.cpp index c4711dac30..b6224d452e 100644 --- a/tools/lammps-gui/preferences.cpp +++ b/tools/lammps-gui/preferences.cpp @@ -13,6 +13,7 @@ #include "preferences.h" +#include "helpers.h" #include "lammpsgui.h" #include "lammpswrapper.h" #include "ui_lammpsgui.h" @@ -55,14 +56,6 @@ #include #endif -// duplicate string -static char *mystrdup(const std::string &text) -{ - auto tmp = new char[text.size() + 1]; - memcpy(tmp, text.c_str(), text.size() + 1); - return tmp; -} - Preferences::Preferences(LammpsWrapper *_lammps, QWidget *parent) : QDialog(parent), tabWidget(new QTabWidget), buttonBox(new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel)), @@ -176,8 +169,8 @@ void Preferences::accept() "LAMMPS-GUI must be relaunched."), QMessageBox::Ok); msg.exec(); - const char *path = mystrdup(QCoreApplication::applicationFilePath().toStdString()); - const char *arg0 = mystrdup(QCoreApplication::arguments().at(0).toStdString()); + const char *path = mystrdup(QCoreApplication::applicationFilePath()); + const char *arg0 = mystrdup(QCoreApplication::arguments().at(0)); execl(path, arg0, (char *)NULL); } @@ -258,8 +251,8 @@ GeneralTab::GeneralTab(QSettings *_settings, LammpsWrapper *_lammps, QWidget *pa connect(gettextfont, &QPushButton::released, this, &GeneralTab::newtextfont); auto *freqlayout = new QHBoxLayout; - auto *freqlabel = new QLabel("GUI update interval (ms)"); - auto *freqval = new QSpinBox; + auto *freqlabel = new QLabel("GUI update interval (ms)"); + auto *freqval = new QSpinBox; freqval->setRange(1, 1000); freqval->setStepType(QAbstractSpinBox::AdaptiveDecimalStepType); freqval->setValue(settings->value("updfreq", "100").toInt()); From 5588c121f4d619a46b5062375dcb6323ea6ca5f3 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 24 Sep 2023 15:09:14 -0400 Subject: [PATCH 084/219] add support to export slide show animation to movie file via ffmpeg --- doc/src/Howto_lammps_gui.rst | 12 ++++--- tools/lammps-gui/export-movie.png | Bin 0 -> 5162 bytes tools/lammps-gui/lammpsgui.cpp | 1 + tools/lammps-gui/lammpsgui.qrc | 1 + tools/lammps-gui/slideshow.cpp | 52 ++++++++++++++++++++++++++++++ tools/lammps-gui/slideshow.h | 1 + 6 files changed, 62 insertions(+), 5 deletions(-) create mode 100644 tools/lammps-gui/export-movie.png diff --git a/doc/src/Howto_lammps_gui.rst b/doc/src/Howto_lammps_gui.rst index ee190b540e..fb0c0e80d4 100644 --- a/doc/src/Howto_lammps_gui.rst +++ b/doc/src/Howto_lammps_gui.rst @@ -225,11 +225,13 @@ displays the images created by LAMMPS as they are written. :align: center :scale: 50% -The various buttons at the bottom right of the window allow either -single stepping through the sequence of images or playing an animation -(as a continuous loop or once from first to last). It is also possible -to zoom in or zoom out of the displayed images. The slide show window -will be closed when a new file is loaded. +The various buttons at the bottom right of the window allow single +stepping through the sequence of images or playing an animation (as a +continuous loop or once from first to last). It is also possible to +zoom in or zoom out of the displayed images, and to export the slide +show animation to a movie file, if `ffmpeg `_ is +installed. The slide show window will be closed when a new file is +loaded. Variable Info ------------- diff --git a/tools/lammps-gui/export-movie.png b/tools/lammps-gui/export-movie.png new file mode 100644 index 0000000000000000000000000000000000000000..f5ab58b0b50830647a9fefadb6878babe9fe1853 GIT binary patch literal 5162 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 YRPz7s!_knxPuvGE(7C6Lzw3xqW}N^ literal 0 HcmV?d00001 diff --git a/tools/lammps-gui/lammpsgui.cpp b/tools/lammps-gui/lammpsgui.cpp index 16e9f50e87..599b9d5097 100644 --- a/tools/lammps-gui/lammpsgui.cpp +++ b/tools/lammps-gui/lammpsgui.cpp @@ -858,6 +858,7 @@ void LammpsGui::logupdate() slideshow->hide(); } else { slideshow->setWindowTitle(QString("LAMMPS-GUI - Slide Show: ") + current_file); + if (QSettings().value("viewslide", true).toBool()) slideshow->show(); } slideshow->add_image(imagefile); } diff --git a/tools/lammps-gui/lammpsgui.qrc b/tools/lammps-gui/lammpsgui.qrc index bb23d559ee..0baca37aac 100644 --- a/tools/lammps-gui/lammpsgui.qrc +++ b/tools/lammps-gui/lammpsgui.qrc @@ -24,6 +24,7 @@ edit-undo.png emblem-photos.png expand-text.png + export-movie.png format-indent-less-3.png go-first.png go-last.png diff --git a/tools/lammps-gui/slideshow.cpp b/tools/lammps-gui/slideshow.cpp index a42a67f8a2..e92bfdc2d5 100644 --- a/tools/lammps-gui/slideshow.cpp +++ b/tools/lammps-gui/slideshow.cpp @@ -13,7 +13,11 @@ #include "slideshow.h" +#include "helpers.h" + #include +#include +#include #include #include #include @@ -21,11 +25,13 @@ #include #include #include +#include #include #include #include #include #include +#include #include #include @@ -58,6 +64,10 @@ SlideShow::SlideShow(const QString &fileName, QWidget *parent) : auto *dummy = new QPushButton(QIcon(), ""); dummy->hide(); + auto *tomovie = new QPushButton(QIcon(":/export-movie.png"), ""); + tomovie->setToolTip("Export to movie file"); + tomovie->setEnabled(has_exe("ffmpeg")); + auto *gofirst = new QPushButton(QIcon(":/go-first.png"), ""); gofirst->setToolTip("Go to first Image"); auto *goprev = new QPushButton(QIcon(":/go-previous-2.png"), ""); @@ -83,6 +93,7 @@ SlideShow::SlideShow(const QString &fileName, QWidget *parent) : auto *normal = new QPushButton(QIcon(":/gtk-zoom-fit.png"), ""); normal->setToolTip("Reset zoom to normal"); + connect(tomovie, &QPushButton::released, this, &SlideShow::movie); connect(gofirst, &QPushButton::released, this, &SlideShow::first); connect(goprev, &QPushButton::released, this, &SlideShow::prev); connect(goplay, &QPushButton::released, this, &SlideShow::play); @@ -96,6 +107,7 @@ SlideShow::SlideShow(const QString &fileName, QWidget *parent) : navLayout->addSpacerItem(new QSpacerItem(10, 10, QSizePolicy::Expanding, QSizePolicy::Minimum)); navLayout->addWidget(dummy); + navLayout->addWidget(tomovie); navLayout->addWidget(gofirst); navLayout->addWidget(goprev); navLayout->addWidget(goplay); @@ -178,6 +190,46 @@ void SlideShow::loadImage(int idx) } while (idx >= 0); } +void SlideShow::movie() +{ + QString fileName = QFileDialog::getSaveFileName(this, "Export to Movie File", ".", + "Movie Files (*.mpg *.mp4 *.mkv *.avi *.mpeg)"); + if (fileName.isEmpty()) return; + + QDir curdir("."); + QTemporaryFile concatfile; + concatfile.open(); + for (auto image : imagefiles) { + concatfile.write("file '"); + concatfile.write(curdir.absoluteFilePath(image).toLocal8Bit()); + concatfile.write("'\n"); + } + concatfile.close(); + + QStringList args; + args << "-y"; + args << "-safe" + << "0"; + args << "-r" + << "10"; + args << "-f" + << "concat"; + args << "-i" << concatfile.fileName(); + if (scaleFactor != 1.0) { + args << "-vf" << QString("scale=iw*%1:-1").arg(scaleFactor); + } + args << "-b:v" + << "2000k"; + args << "-r" + << "24"; + args << fileName; + + auto *ffmpeg = new QProcess(this); + ffmpeg->start("ffmpeg", args); + ffmpeg->waitForFinished(-1); + delete ffmpeg; +} + void SlideShow::first() { current = 0; diff --git a/tools/lammps-gui/slideshow.h b/tools/lammps-gui/slideshow.h index fe357ec564..176bb9f030 100644 --- a/tools/lammps-gui/slideshow.h +++ b/tools/lammps-gui/slideshow.h @@ -32,6 +32,7 @@ public: void clear(); private slots: + void movie(); void first(); void last(); void next(); From 934269e4564a7a956b70a4a92a42c09f27c96225 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 24 Sep 2023 15:55:14 -0400 Subject: [PATCH 085/219] move all icon files to the icons folder --- tools/lammps-gui/chartviewer.cpp | 8 +- tools/lammps-gui/codeeditor.cpp | 10 +- tools/lammps-gui/{ => icons}/antialias.png | Bin .../{ => icons}/application-calc.png | Bin .../{ => icons}/application-exit.png | Bin .../{ => icons}/application-plot.png | Bin tools/lammps-gui/{ => icons}/axes-img.png | Bin tools/lammps-gui/{ => icons}/document-new.png | Bin .../{ => icons}/document-open-recent.png | Bin .../lammps-gui/{ => icons}/document-open.png | Bin .../{ => icons}/document-revert.png | Bin .../{ => icons}/document-save-as.png | Bin .../lammps-gui/{ => icons}/document-save.png | Bin tools/lammps-gui/{ => icons}/edit-copy.png | Bin tools/lammps-gui/{ => icons}/edit-cut.png | Bin tools/lammps-gui/{ => icons}/edit-delete.png | Bin tools/lammps-gui/{ => icons}/edit-paste.png | Bin tools/lammps-gui/{ => icons}/edit-redo.png | Bin tools/lammps-gui/{ => icons}/edit-undo.png | Bin .../lammps-gui/{ => icons}/emblem-photos.png | Bin tools/lammps-gui/{ => icons}/expand-text.png | Bin tools/lammps-gui/{ => icons}/export-movie.png | Bin .../{ => icons}/format-indent-less-3.png | Bin tools/lammps-gui/{ => icons}/go-first.png | Bin tools/lammps-gui/{ => icons}/go-last.png | Bin tools/lammps-gui/{ => icons}/go-next-2.png | Bin .../lammps-gui/{ => icons}/go-previous-2.png | Bin tools/lammps-gui/{ => icons}/gtk-go-down.png | Bin tools/lammps-gui/{ => icons}/gtk-go-up.png | Bin tools/lammps-gui/{ => icons}/gtk-zoom-fit.png | Bin tools/lammps-gui/{ => icons}/gtk-zoom-in.png | Bin tools/lammps-gui/{ => icons}/gtk-zoom-out.png | Bin tools/lammps-gui/{ => icons}/hd-img.png | Bin tools/lammps-gui/{ => icons}/help-about.png | Bin tools/lammps-gui/{ => icons}/help-browser.png | Bin tools/lammps-gui/{ => icons}/help-faq.png | Bin .../{ => icons}/image-x-generic.png | Bin .../{ => icons}/lammps-icon-128x128.png | Bin .../{ => icons}/media-playback-start-2.png | Bin .../{ => icons}/media-playlist-repeat.png | Bin .../{ => icons}/object-rotate-left.png | Bin .../{ => icons}/object-rotate-right.png | Bin tools/lammps-gui/{ => icons}/ovito.png | Bin .../{ => icons}/preferences-desktop-font.png | Bin .../preferences-desktop-personal.png | Bin .../{ => icons}/preferences-desktop.png | Bin tools/lammps-gui/{ => icons}/process-stop.png | Bin tools/lammps-gui/{ => icons}/run-file.png | Bin tools/lammps-gui/{ => icons}/system-box.png | Bin tools/lammps-gui/{ => icons}/system-help.png | Bin tools/lammps-gui/{ => icons}/system-run.png | Bin .../{ => icons}/utilities-terminal.png | Bin tools/lammps-gui/{ => icons}/vdw-style.png | Bin tools/lammps-gui/{ => icons}/vmd.png | Bin tools/lammps-gui/{ => icons}/window-close.png | Bin .../{ => icons}/x-office-drawing.png | Bin tools/lammps-gui/imageviewer.cpp | 34 +++--- tools/lammps-gui/lammpsgui.cpp | 24 ++-- tools/lammps-gui/lammpsgui.qrc | 108 +++++++++--------- tools/lammps-gui/lammpsgui.ui | 66 +++++------ tools/lammps-gui/preferences.cpp | 6 +- tools/lammps-gui/setvariables.cpp | 6 +- tools/lammps-gui/slideshow.cpp | 22 ++-- 63 files changed, 142 insertions(+), 142 deletions(-) rename tools/lammps-gui/{ => icons}/antialias.png (100%) rename tools/lammps-gui/{ => icons}/application-calc.png (100%) rename tools/lammps-gui/{ => icons}/application-exit.png (100%) rename tools/lammps-gui/{ => icons}/application-plot.png (100%) rename tools/lammps-gui/{ => icons}/axes-img.png (100%) rename tools/lammps-gui/{ => icons}/document-new.png (100%) rename tools/lammps-gui/{ => icons}/document-open-recent.png (100%) rename tools/lammps-gui/{ => icons}/document-open.png (100%) rename tools/lammps-gui/{ => icons}/document-revert.png (100%) rename tools/lammps-gui/{ => icons}/document-save-as.png (100%) rename tools/lammps-gui/{ => icons}/document-save.png (100%) rename tools/lammps-gui/{ => icons}/edit-copy.png (100%) rename tools/lammps-gui/{ => icons}/edit-cut.png (100%) rename tools/lammps-gui/{ => icons}/edit-delete.png (100%) rename tools/lammps-gui/{ => icons}/edit-paste.png (100%) rename tools/lammps-gui/{ => icons}/edit-redo.png (100%) rename tools/lammps-gui/{ => icons}/edit-undo.png (100%) rename tools/lammps-gui/{ => icons}/emblem-photos.png (100%) rename tools/lammps-gui/{ => icons}/expand-text.png (100%) rename tools/lammps-gui/{ => icons}/export-movie.png (100%) rename tools/lammps-gui/{ => icons}/format-indent-less-3.png (100%) rename tools/lammps-gui/{ => icons}/go-first.png (100%) rename tools/lammps-gui/{ => icons}/go-last.png (100%) rename tools/lammps-gui/{ => icons}/go-next-2.png (100%) rename tools/lammps-gui/{ => icons}/go-previous-2.png (100%) rename tools/lammps-gui/{ => icons}/gtk-go-down.png (100%) rename tools/lammps-gui/{ => icons}/gtk-go-up.png (100%) rename tools/lammps-gui/{ => icons}/gtk-zoom-fit.png (100%) rename tools/lammps-gui/{ => icons}/gtk-zoom-in.png (100%) rename tools/lammps-gui/{ => icons}/gtk-zoom-out.png (100%) rename tools/lammps-gui/{ => icons}/hd-img.png (100%) rename tools/lammps-gui/{ => icons}/help-about.png (100%) rename tools/lammps-gui/{ => icons}/help-browser.png (100%) rename tools/lammps-gui/{ => icons}/help-faq.png (100%) rename tools/lammps-gui/{ => icons}/image-x-generic.png (100%) rename tools/lammps-gui/{ => icons}/lammps-icon-128x128.png (100%) rename tools/lammps-gui/{ => icons}/media-playback-start-2.png (100%) rename tools/lammps-gui/{ => icons}/media-playlist-repeat.png (100%) rename tools/lammps-gui/{ => icons}/object-rotate-left.png (100%) rename tools/lammps-gui/{ => icons}/object-rotate-right.png (100%) rename tools/lammps-gui/{ => icons}/ovito.png (100%) rename tools/lammps-gui/{ => icons}/preferences-desktop-font.png (100%) rename tools/lammps-gui/{ => icons}/preferences-desktop-personal.png (100%) rename tools/lammps-gui/{ => icons}/preferences-desktop.png (100%) rename tools/lammps-gui/{ => icons}/process-stop.png (100%) rename tools/lammps-gui/{ => icons}/run-file.png (100%) rename tools/lammps-gui/{ => icons}/system-box.png (100%) rename tools/lammps-gui/{ => icons}/system-help.png (100%) rename tools/lammps-gui/{ => icons}/system-run.png (100%) rename tools/lammps-gui/{ => icons}/utilities-terminal.png (100%) rename tools/lammps-gui/{ => icons}/vdw-style.png (100%) rename tools/lammps-gui/{ => icons}/vmd.png (100%) rename tools/lammps-gui/{ => icons}/window-close.png (100%) rename tools/lammps-gui/{ => icons}/x-office-drawing.png (100%) diff --git a/tools/lammps-gui/chartviewer.cpp b/tools/lammps-gui/chartviewer.cpp index 7ea8a77385..bc9ebd56c4 100644 --- a/tools/lammps-gui/chartviewer.cpp +++ b/tools/lammps-gui/chartviewer.cpp @@ -35,14 +35,14 @@ ChartWindow::ChartWindow(const QString &_filename, QWidget *parent) : top->addWidget(new QLabel("Select data:")); top->addWidget(columns); saveAsAct = file->addAction("&Save Graph As...", this, &ChartWindow::saveAs); - saveAsAct->setIcon(QIcon(":/document-save-as.png")); + saveAsAct->setIcon(QIcon(":/icons/document-save-as.png")); exportCsvAct = file->addAction("&Export data to CSV...", this, &ChartWindow::exportCsv); - exportCsvAct->setIcon(QIcon(":/application-calc.png")); + exportCsvAct->setIcon(QIcon(":/icons/application-calc.png")); exportDatAct = file->addAction("Export data to &Gnuplot...", this, &ChartWindow::exportDat); - exportDatAct->setIcon(QIcon(":/application-plot.png")); + exportDatAct->setIcon(QIcon(":/icons/application-plot.png")); file->addSeparator(); closeAct = file->addAction("&Close", this, &QWidget::close); - closeAct->setIcon(QIcon(":/window-close.png")); + closeAct->setIcon(QIcon(":/icons/window-close.png")); auto *layout = new QVBoxLayout; layout->addLayout(top); setLayout(layout); diff --git a/tools/lammps-gui/codeeditor.cpp b/tools/lammps-gui/codeeditor.cpp index 01e71d087c..bf94568f37 100644 --- a/tools/lammps-gui/codeeditor.cpp +++ b/tools/lammps-gui/codeeditor.cpp @@ -657,18 +657,18 @@ void CodeEditor::contextMenuEvent(QContextMenuEvent *event) auto *menu = createStandardContextMenu(); menu->addSeparator(); auto action = menu->addAction(QString("Display available completions for '%1'").arg(help)); - action->setIcon(QIcon(":/expand-text.png")); + action->setIcon(QIcon(":/icons/expand-text.png")); connect(action, &QAction::triggered, this, &CodeEditor::runCompletion); if (!page.isEmpty()) { menu->addSeparator(); action = menu->addAction(QString("Reformat '%1' command").arg(help)); - action->setIcon(QIcon(":/format-indent-less-3.png")); + action->setIcon(QIcon(":/icons/format-indent-less-3.png")); connect(action, &QAction::triggered, this, &CodeEditor::reformatCurrentLine); menu->addSeparator(); action = menu->addAction(QString("View Documentation for '%1'").arg(help)); - action->setIcon(QIcon(":/system-help.png")); + action->setIcon(QIcon(":/icons/system-help.png")); action->setData(page); connect(action, &QAction::triggered, this, &CodeEditor::open_help); // if we link to help with specific styles (fix, compute, pair, bond, ...) @@ -679,13 +679,13 @@ void CodeEditor::contextMenuEvent(QContextMenuEvent *event) page = words.at(0); page += ".html"; auto action2 = menu->addAction(QString("View Documentation for '%1'").arg(help)); - action2->setIcon(QIcon(":/system-help.png")); + action2->setIcon(QIcon(":/icons/system-help.png")); action2->setData(page); connect(action2, &QAction::triggered, this, &CodeEditor::open_help); } } auto action3 = menu->addAction(QString("LAMMPS Manual")); - action3->setIcon(QIcon(":/help-browser.png")); + action3->setIcon(QIcon(":/icons/help-browser.png")); action3->setData(QString()); connect(action3, &QAction::triggered, this, &CodeEditor::open_help); diff --git a/tools/lammps-gui/antialias.png b/tools/lammps-gui/icons/antialias.png similarity index 100% rename from tools/lammps-gui/antialias.png rename to tools/lammps-gui/icons/antialias.png diff --git a/tools/lammps-gui/application-calc.png b/tools/lammps-gui/icons/application-calc.png similarity index 100% rename from tools/lammps-gui/application-calc.png rename to tools/lammps-gui/icons/application-calc.png diff --git a/tools/lammps-gui/application-exit.png b/tools/lammps-gui/icons/application-exit.png similarity index 100% rename from tools/lammps-gui/application-exit.png rename to tools/lammps-gui/icons/application-exit.png diff --git a/tools/lammps-gui/application-plot.png b/tools/lammps-gui/icons/application-plot.png similarity index 100% rename from tools/lammps-gui/application-plot.png rename to tools/lammps-gui/icons/application-plot.png diff --git a/tools/lammps-gui/axes-img.png b/tools/lammps-gui/icons/axes-img.png similarity index 100% rename from tools/lammps-gui/axes-img.png rename to tools/lammps-gui/icons/axes-img.png diff --git a/tools/lammps-gui/document-new.png b/tools/lammps-gui/icons/document-new.png similarity index 100% rename from tools/lammps-gui/document-new.png rename to tools/lammps-gui/icons/document-new.png diff --git a/tools/lammps-gui/document-open-recent.png b/tools/lammps-gui/icons/document-open-recent.png similarity index 100% rename from tools/lammps-gui/document-open-recent.png rename to tools/lammps-gui/icons/document-open-recent.png diff --git a/tools/lammps-gui/document-open.png b/tools/lammps-gui/icons/document-open.png similarity index 100% rename from tools/lammps-gui/document-open.png rename to tools/lammps-gui/icons/document-open.png diff --git a/tools/lammps-gui/document-revert.png b/tools/lammps-gui/icons/document-revert.png similarity index 100% rename from tools/lammps-gui/document-revert.png rename to tools/lammps-gui/icons/document-revert.png diff --git a/tools/lammps-gui/document-save-as.png b/tools/lammps-gui/icons/document-save-as.png similarity index 100% rename from tools/lammps-gui/document-save-as.png rename to tools/lammps-gui/icons/document-save-as.png diff --git a/tools/lammps-gui/document-save.png b/tools/lammps-gui/icons/document-save.png similarity index 100% rename from tools/lammps-gui/document-save.png rename to tools/lammps-gui/icons/document-save.png diff --git a/tools/lammps-gui/edit-copy.png b/tools/lammps-gui/icons/edit-copy.png similarity index 100% rename from tools/lammps-gui/edit-copy.png rename to tools/lammps-gui/icons/edit-copy.png diff --git a/tools/lammps-gui/edit-cut.png b/tools/lammps-gui/icons/edit-cut.png similarity index 100% rename from tools/lammps-gui/edit-cut.png rename to tools/lammps-gui/icons/edit-cut.png diff --git a/tools/lammps-gui/edit-delete.png b/tools/lammps-gui/icons/edit-delete.png similarity index 100% rename from tools/lammps-gui/edit-delete.png rename to tools/lammps-gui/icons/edit-delete.png diff --git a/tools/lammps-gui/edit-paste.png b/tools/lammps-gui/icons/edit-paste.png similarity index 100% rename from tools/lammps-gui/edit-paste.png rename to tools/lammps-gui/icons/edit-paste.png diff --git a/tools/lammps-gui/edit-redo.png b/tools/lammps-gui/icons/edit-redo.png similarity index 100% rename from tools/lammps-gui/edit-redo.png rename to tools/lammps-gui/icons/edit-redo.png diff --git a/tools/lammps-gui/edit-undo.png b/tools/lammps-gui/icons/edit-undo.png similarity index 100% rename from tools/lammps-gui/edit-undo.png rename to tools/lammps-gui/icons/edit-undo.png diff --git a/tools/lammps-gui/emblem-photos.png b/tools/lammps-gui/icons/emblem-photos.png similarity index 100% rename from tools/lammps-gui/emblem-photos.png rename to tools/lammps-gui/icons/emblem-photos.png diff --git a/tools/lammps-gui/expand-text.png b/tools/lammps-gui/icons/expand-text.png similarity index 100% rename from tools/lammps-gui/expand-text.png rename to tools/lammps-gui/icons/expand-text.png diff --git a/tools/lammps-gui/export-movie.png b/tools/lammps-gui/icons/export-movie.png similarity index 100% rename from tools/lammps-gui/export-movie.png rename to tools/lammps-gui/icons/export-movie.png diff --git a/tools/lammps-gui/format-indent-less-3.png b/tools/lammps-gui/icons/format-indent-less-3.png similarity index 100% rename from tools/lammps-gui/format-indent-less-3.png rename to tools/lammps-gui/icons/format-indent-less-3.png diff --git a/tools/lammps-gui/go-first.png b/tools/lammps-gui/icons/go-first.png similarity index 100% rename from tools/lammps-gui/go-first.png rename to tools/lammps-gui/icons/go-first.png diff --git a/tools/lammps-gui/go-last.png b/tools/lammps-gui/icons/go-last.png similarity index 100% rename from tools/lammps-gui/go-last.png rename to tools/lammps-gui/icons/go-last.png diff --git a/tools/lammps-gui/go-next-2.png b/tools/lammps-gui/icons/go-next-2.png similarity index 100% rename from tools/lammps-gui/go-next-2.png rename to tools/lammps-gui/icons/go-next-2.png diff --git a/tools/lammps-gui/go-previous-2.png b/tools/lammps-gui/icons/go-previous-2.png similarity index 100% rename from tools/lammps-gui/go-previous-2.png rename to tools/lammps-gui/icons/go-previous-2.png diff --git a/tools/lammps-gui/gtk-go-down.png b/tools/lammps-gui/icons/gtk-go-down.png similarity index 100% rename from tools/lammps-gui/gtk-go-down.png rename to tools/lammps-gui/icons/gtk-go-down.png diff --git a/tools/lammps-gui/gtk-go-up.png b/tools/lammps-gui/icons/gtk-go-up.png similarity index 100% rename from tools/lammps-gui/gtk-go-up.png rename to tools/lammps-gui/icons/gtk-go-up.png diff --git a/tools/lammps-gui/gtk-zoom-fit.png b/tools/lammps-gui/icons/gtk-zoom-fit.png similarity index 100% rename from tools/lammps-gui/gtk-zoom-fit.png rename to tools/lammps-gui/icons/gtk-zoom-fit.png diff --git a/tools/lammps-gui/gtk-zoom-in.png b/tools/lammps-gui/icons/gtk-zoom-in.png similarity index 100% rename from tools/lammps-gui/gtk-zoom-in.png rename to tools/lammps-gui/icons/gtk-zoom-in.png diff --git a/tools/lammps-gui/gtk-zoom-out.png b/tools/lammps-gui/icons/gtk-zoom-out.png similarity index 100% rename from tools/lammps-gui/gtk-zoom-out.png rename to tools/lammps-gui/icons/gtk-zoom-out.png diff --git a/tools/lammps-gui/hd-img.png b/tools/lammps-gui/icons/hd-img.png similarity index 100% rename from tools/lammps-gui/hd-img.png rename to tools/lammps-gui/icons/hd-img.png diff --git a/tools/lammps-gui/help-about.png b/tools/lammps-gui/icons/help-about.png similarity index 100% rename from tools/lammps-gui/help-about.png rename to tools/lammps-gui/icons/help-about.png diff --git a/tools/lammps-gui/help-browser.png b/tools/lammps-gui/icons/help-browser.png similarity index 100% rename from tools/lammps-gui/help-browser.png rename to tools/lammps-gui/icons/help-browser.png diff --git a/tools/lammps-gui/help-faq.png b/tools/lammps-gui/icons/help-faq.png similarity index 100% rename from tools/lammps-gui/help-faq.png rename to tools/lammps-gui/icons/help-faq.png diff --git a/tools/lammps-gui/image-x-generic.png b/tools/lammps-gui/icons/image-x-generic.png similarity index 100% rename from tools/lammps-gui/image-x-generic.png rename to tools/lammps-gui/icons/image-x-generic.png diff --git a/tools/lammps-gui/lammps-icon-128x128.png b/tools/lammps-gui/icons/lammps-icon-128x128.png similarity index 100% rename from tools/lammps-gui/lammps-icon-128x128.png rename to tools/lammps-gui/icons/lammps-icon-128x128.png diff --git a/tools/lammps-gui/media-playback-start-2.png b/tools/lammps-gui/icons/media-playback-start-2.png similarity index 100% rename from tools/lammps-gui/media-playback-start-2.png rename to tools/lammps-gui/icons/media-playback-start-2.png diff --git a/tools/lammps-gui/media-playlist-repeat.png b/tools/lammps-gui/icons/media-playlist-repeat.png similarity index 100% rename from tools/lammps-gui/media-playlist-repeat.png rename to tools/lammps-gui/icons/media-playlist-repeat.png diff --git a/tools/lammps-gui/object-rotate-left.png b/tools/lammps-gui/icons/object-rotate-left.png similarity index 100% rename from tools/lammps-gui/object-rotate-left.png rename to tools/lammps-gui/icons/object-rotate-left.png diff --git a/tools/lammps-gui/object-rotate-right.png b/tools/lammps-gui/icons/object-rotate-right.png similarity index 100% rename from tools/lammps-gui/object-rotate-right.png rename to tools/lammps-gui/icons/object-rotate-right.png diff --git a/tools/lammps-gui/ovito.png b/tools/lammps-gui/icons/ovito.png similarity index 100% rename from tools/lammps-gui/ovito.png rename to tools/lammps-gui/icons/ovito.png diff --git a/tools/lammps-gui/preferences-desktop-font.png b/tools/lammps-gui/icons/preferences-desktop-font.png similarity index 100% rename from tools/lammps-gui/preferences-desktop-font.png rename to tools/lammps-gui/icons/preferences-desktop-font.png diff --git a/tools/lammps-gui/preferences-desktop-personal.png b/tools/lammps-gui/icons/preferences-desktop-personal.png similarity index 100% rename from tools/lammps-gui/preferences-desktop-personal.png rename to tools/lammps-gui/icons/preferences-desktop-personal.png diff --git a/tools/lammps-gui/preferences-desktop.png b/tools/lammps-gui/icons/preferences-desktop.png similarity index 100% rename from tools/lammps-gui/preferences-desktop.png rename to tools/lammps-gui/icons/preferences-desktop.png diff --git a/tools/lammps-gui/process-stop.png b/tools/lammps-gui/icons/process-stop.png similarity index 100% rename from tools/lammps-gui/process-stop.png rename to tools/lammps-gui/icons/process-stop.png diff --git a/tools/lammps-gui/run-file.png b/tools/lammps-gui/icons/run-file.png similarity index 100% rename from tools/lammps-gui/run-file.png rename to tools/lammps-gui/icons/run-file.png diff --git a/tools/lammps-gui/system-box.png b/tools/lammps-gui/icons/system-box.png similarity index 100% rename from tools/lammps-gui/system-box.png rename to tools/lammps-gui/icons/system-box.png diff --git a/tools/lammps-gui/system-help.png b/tools/lammps-gui/icons/system-help.png similarity index 100% rename from tools/lammps-gui/system-help.png rename to tools/lammps-gui/icons/system-help.png diff --git a/tools/lammps-gui/system-run.png b/tools/lammps-gui/icons/system-run.png similarity index 100% rename from tools/lammps-gui/system-run.png rename to tools/lammps-gui/icons/system-run.png diff --git a/tools/lammps-gui/utilities-terminal.png b/tools/lammps-gui/icons/utilities-terminal.png similarity index 100% rename from tools/lammps-gui/utilities-terminal.png rename to tools/lammps-gui/icons/utilities-terminal.png diff --git a/tools/lammps-gui/vdw-style.png b/tools/lammps-gui/icons/vdw-style.png similarity index 100% rename from tools/lammps-gui/vdw-style.png rename to tools/lammps-gui/icons/vdw-style.png diff --git a/tools/lammps-gui/vmd.png b/tools/lammps-gui/icons/vmd.png similarity index 100% rename from tools/lammps-gui/vmd.png rename to tools/lammps-gui/icons/vmd.png diff --git a/tools/lammps-gui/window-close.png b/tools/lammps-gui/icons/window-close.png similarity index 100% rename from tools/lammps-gui/window-close.png rename to tools/lammps-gui/icons/window-close.png diff --git a/tools/lammps-gui/x-office-drawing.png b/tools/lammps-gui/icons/x-office-drawing.png similarity index 100% rename from tools/lammps-gui/x-office-drawing.png rename to tools/lammps-gui/icons/x-office-drawing.png diff --git a/tools/lammps-gui/imageviewer.cpp b/tools/lammps-gui/imageviewer.cpp index 139d73cb38..c7186c40aa 100644 --- a/tools/lammps-gui/imageviewer.cpp +++ b/tools/lammps-gui/imageviewer.cpp @@ -79,7 +79,7 @@ ImageViewer::ImageViewer(const QString &fileName, LammpsWrapper *_lammps, QWidge QSettings settings; vdwfactor = 0.5; - auto pix = QPixmap(":/emblem-photos.png"); + auto pix = QPixmap(":/icons/emblem-photos.png"); auto *renderstatus = new QLabel(QString()); renderstatus->setPixmap(pix.scaled(22, 22, Qt::KeepAspectRatio)); @@ -107,39 +107,39 @@ ImageViewer::ImageViewer(const QString &fileName, LammpsWrapper *_lammps, QWidge auto *dummy = new QPushButton(QIcon(), ""); dummy->hide(); - auto *dossao = new QPushButton(QIcon(":/hd-img.png"), ""); + auto *dossao = new QPushButton(QIcon(":/icons/hd-img.png"), ""); dossao->setCheckable(true); dossao->setToolTip("Toggle SSAO rendering"); dossao->setObjectName("ssao"); - auto *doanti = new QPushButton(QIcon(":/antialias.png"), ""); + auto *doanti = new QPushButton(QIcon(":/icons/antialias.png"), ""); doanti->setCheckable(true); doanti->setToolTip("Toggle anti-aliasing"); doanti->setObjectName("antialias"); - auto *dovdw = new QPushButton(QIcon(":/vdw-style.png"), ""); + auto *dovdw = new QPushButton(QIcon(":/icons/vdw-style.png"), ""); dovdw->setCheckable(true); dovdw->setToolTip("Toggle VDW style representation"); dovdw->setObjectName("vdw"); - auto *dobox = new QPushButton(QIcon(":/system-box.png"), ""); + auto *dobox = new QPushButton(QIcon(":/icons/system-box.png"), ""); dobox->setCheckable(true); dobox->setToolTip("Toggle displaying box"); dobox->setObjectName("box"); - auto *doaxes = new QPushButton(QIcon(":/axes-img.png"), ""); + auto *doaxes = new QPushButton(QIcon(":/icons/axes-img.png"), ""); doaxes->setCheckable(true); doaxes->setToolTip("Toggle displaying axes"); doaxes->setObjectName("axes"); - auto *zoomin = new QPushButton(QIcon(":/gtk-zoom-in.png"), ""); + auto *zoomin = new QPushButton(QIcon(":/icons/gtk-zoom-in.png"), ""); zoomin->setToolTip("Zoom in by 10 percent"); - auto *zoomout = new QPushButton(QIcon(":/gtk-zoom-out.png"), ""); + auto *zoomout = new QPushButton(QIcon(":/icons/gtk-zoom-out.png"), ""); zoomout->setToolTip("Zoom out by 10 percent"); - auto *rotleft = new QPushButton(QIcon(":/object-rotate-left.png"), ""); + auto *rotleft = new QPushButton(QIcon(":/icons/object-rotate-left.png"), ""); rotleft->setToolTip("Rotate left by 15 degrees"); - auto *rotright = new QPushButton(QIcon(":/object-rotate-right.png"), ""); + auto *rotright = new QPushButton(QIcon(":/icons/object-rotate-right.png"), ""); rotright->setToolTip("Rotate right by 15 degrees"); - auto *rotup = new QPushButton(QIcon(":/gtk-go-up.png"), ""); + auto *rotup = new QPushButton(QIcon(":/icons/gtk-go-up.png"), ""); rotup->setToolTip("Rotate up by 15 degrees"); - auto *rotdown = new QPushButton(QIcon(":/gtk-go-down.png"), ""); + auto *rotdown = new QPushButton(QIcon(":/icons/gtk-go-down.png"), ""); rotdown->setToolTip("Rotate down by 15 degrees"); - auto *reset = new QPushButton(QIcon(":/gtk-zoom-fit.png"), ""); + auto *reset = new QPushButton(QIcon(":/icons/gtk-zoom-fit.png"), ""); reset->setToolTip("Reset view to defaults"); auto *combo = new QComboBox; combo->setObjectName("group"); @@ -192,7 +192,7 @@ ImageViewer::ImageViewer(const QString &fileName, LammpsWrapper *_lammps, QWidge mainLayout->addLayout(menuLayout); mainLayout->addWidget(scrollArea); mainLayout->addWidget(buttonBox); - setWindowIcon(QIcon(":/lammps-icon-128x128.png")); + setWindowIcon(QIcon(":/icons/lammps-icon-128x128.png")); setWindowTitle(QString("Image Viewer: ") + QFileInfo(fileName).fileName()); createActions(); @@ -475,16 +475,16 @@ void ImageViewer::createActions() QMenu *fileMenu = menuBar->addMenu("&File"); saveAsAct = fileMenu->addAction("&Save As...", this, &ImageViewer::saveAs); - saveAsAct->setIcon(QIcon(":/document-save-as.png")); + saveAsAct->setIcon(QIcon(":/icons/document-save-as.png")); saveAsAct->setEnabled(false); fileMenu->addSeparator(); copyAct = fileMenu->addAction("&Copy", this, &ImageViewer::copy); - copyAct->setIcon(QIcon(":/edit-copy.png")); + copyAct->setIcon(QIcon(":/icons/edit-copy.png")); copyAct->setShortcut(QKeySequence::Copy); copyAct->setEnabled(false); fileMenu->addSeparator(); QAction *exitAct = fileMenu->addAction("&Close", this, &QWidget::close); - exitAct->setIcon(QIcon(":/window-close.png")); + exitAct->setIcon(QIcon(":/icons/window-close.png")); exitAct->setShortcut(QKeySequence::fromString("Ctrl+W")); } diff --git a/tools/lammps-gui/lammpsgui.cpp b/tools/lammps-gui/lammpsgui.cpp index 599b9d5097..870f464ff1 100644 --- a/tools/lammps-gui/lammpsgui.cpp +++ b/tools/lammps-gui/lammpsgui.cpp @@ -146,7 +146,7 @@ LammpsGui::LammpsGui(QWidget *parent, const char *filename) : lammps_args.push_back(mystrdup("-log")); lammps_args.push_back(mystrdup("none")); - setWindowIcon(QIcon(":/lammps-icon-128x128.png")); + setWindowIcon(QIcon(":/icons/lammps-icon-128x128.png")); QFont all_font("Arial", -1); all_font.setStyleHint(QFont::SansSerif, QFont::PreferOutline); @@ -163,7 +163,7 @@ LammpsGui::LammpsGui(QWidget *parent, const char *filename) : varwindow = new QLabel(QString()); varwindow->setWindowTitle("LAMMPS-GUI - Current Variables:"); - varwindow->setWindowIcon(QIcon(":/lammps-icon-128x128.png")); + varwindow->setWindowIcon(QIcon(":/icons/lammps-icon-128x128.png")); varwindow->setMinimumSize(100, 50); varwindow->setText("(none)"); varwindow->setFont(text_font); @@ -226,15 +226,15 @@ LammpsGui::LammpsGui(QWidget *parent, const char *filename) : #endif lammpsstatus = new QLabel(QString()); - auto pix = QPixmap(":/lammps-icon-128x128.png"); + auto pix = QPixmap(":/icons/lammps-icon-128x128.png"); lammpsstatus->setPixmap(pix.scaled(22, 22, Qt::KeepAspectRatio)); ui->statusbar->addWidget(lammpsstatus); lammpsstatus->setToolTip("LAMMPS instance is active"); lammpsstatus->hide(); - auto *lammpsrun = new QPushButton(QIcon(":/system-run.png"), ""); - auto *lammpsstop = new QPushButton(QIcon(":/process-stop.png"), ""); - auto *lammpsimage = new QPushButton(QIcon(":/emblem-photos.png"), ""); + auto *lammpsrun = new QPushButton(QIcon(":/icons/system-run.png"), ""); + auto *lammpsstop = new QPushButton(QIcon(":/icons/process-stop.png"), ""); + auto *lammpsimage = new QPushButton(QIcon(":/icons/emblem-photos.png"), ""); lammpsrun->setToolTip("Run LAMMPS on input"); lammpsstop->setToolTip("Stop LAMMPS"); lammpsimage->setToolTip("Create snapshot image"); @@ -1015,7 +1015,7 @@ void LammpsGui::do_run(bool use_buffer) else logwindow->setWindowTitle("LAMMPS-GUI - Output from running LAMMPS on file - " + current_file); - logwindow->setWindowIcon(QIcon(":/lammps-icon-128x128.png")); + logwindow->setWindowIcon(QIcon(":/icons/lammps-icon-128x128.png")); QFont text_font; text_font.fromString(settings.value("textfont", text_font.toString()).toString()); logwindow->document()->setDefaultFont(text_font); @@ -1039,7 +1039,7 @@ void LammpsGui::do_run(bool use_buffer) else chartwindow->setWindowTitle("LAMMPS-GUI - Thermo charts from running LAMMPS on file - " + current_file); - chartwindow->setWindowIcon(QIcon(":/lammps-icon-128x128.png")); + chartwindow->setWindowIcon(QIcon(":/icons/lammps-icon-128x128.png")); chartwindow->setMinimumSize(400, 300); shortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_W), chartwindow); QObject::connect(shortcut, &QShortcut::activated, chartwindow, &ChartWindow::close); @@ -1202,10 +1202,10 @@ void LammpsGui::about() QMessageBox msg; msg.setWindowTitle("About LAMMPS"); - msg.setWindowIcon(QIcon(":/lammps-icon-128x128.png")); + msg.setWindowIcon(QIcon(":/icons/lammps-icon-128x128.png")); msg.setText(version.c_str()); msg.setInformativeText(info.c_str()); - msg.setIconPixmap(QPixmap(":/lammps-icon-128x128.png").scaled(64, 64)); + msg.setIconPixmap(QPixmap(":/icons/lammps-icon-128x128.png").scaled(64, 64)); msg.setStandardButtons(QMessageBox::Close); QFont font; font.setPointSizeF(font.pointSizeF() * 0.75); @@ -1222,7 +1222,7 @@ void LammpsGui::help() { QMessageBox msg; msg.setWindowTitle("LAMMPS-GUI Quick Help"); - msg.setWindowIcon(QIcon(":/lammps-icon-128x128.png")); + msg.setWindowIcon(QIcon(":/icons/lammps-icon-128x128.png")); msg.setText("
This is LAMMPS-GUI version " LAMMPS_GUI_VERSION "
"); msg.setInformativeText("

LAMMPS GUI is a graphical text editor that is linked to the LAMMPS " "library and thus can run LAMMPS directly using the contents of the " @@ -1262,7 +1262,7 @@ void LammpsGui::help() "accelerator packages and number of OpenMP threads. Due to its nature " "as a graphical application, it is not possible to use the " "LAMMPS GUI in parallel with MPI.

"); - msg.setIconPixmap(QPixmap(":/lammps-icon-128x128.png").scaled(64, 64)); + msg.setIconPixmap(QPixmap(":/icons/lammps-icon-128x128.png").scaled(64, 64)); msg.setStandardButtons(QMessageBox::Close); msg.exec(); } diff --git a/tools/lammps-gui/lammpsgui.qrc b/tools/lammps-gui/lammpsgui.qrc index 0baca37aac..6405d66d7a 100644 --- a/tools/lammps-gui/lammpsgui.qrc +++ b/tools/lammps-gui/lammpsgui.qrc @@ -1,62 +1,62 @@ - lammps-icon-128x128.png + icons/lammps-icon-128x128.png help_index.table lammps_internal_commands.txt - antialias.png - application-calc.png - application-exit.png - application-plot.png - axes-img.png - document-new.png - document-open-recent.png - document-open.png - document-revert.png - document-save-as.png - document-save.png - edit-copy.png - edit-cut.png - edit-delete.png - edit-paste.png - edit-redo.png - edit-undo.png - emblem-photos.png - expand-text.png - export-movie.png - format-indent-less-3.png - go-first.png - go-last.png - go-next-2.png - go-previous-2.png - gtk-go-down.png - gtk-go-up.png - gtk-zoom-fit.png - gtk-zoom-in.png - gtk-zoom-out.png - hd-img.png - help-about.png - help-browser.png - help-faq.png - image-x-generic.png - media-playback-start-2.png - media-playlist-repeat.png - object-rotate-left.png - object-rotate-right.png - ovito.png - preferences-desktop-font.png - preferences-desktop-personal.png - preferences-desktop.png - process-stop.png - run-file.png - system-box.png - system-help.png - system-run.png - utilities-terminal.png - vdw-style.png - vmd.png - window-close.png - x-office-drawing.png + icons/antialias.png + icons/application-calc.png + icons/application-exit.png + icons/application-plot.png + icons/axes-img.png + icons/document-new.png + icons/document-open-recent.png + icons/document-open.png + icons/document-revert.png + icons/document-save-as.png + icons/document-save.png + icons/edit-copy.png + icons/edit-cut.png + icons/edit-delete.png + icons/edit-paste.png + icons/edit-redo.png + icons/edit-undo.png + icons/emblem-photos.png + icons/expand-text.png + icons/export-movie.png + icons/format-indent-less-3.png + icons/go-first.png + icons/go-last.png + icons/go-next-2.png + icons/go-previous-2.png + icons/gtk-go-down.png + icons/gtk-go-up.png + icons/gtk-zoom-fit.png + icons/gtk-zoom-in.png + icons/gtk-zoom-out.png + icons/hd-img.png + icons/help-about.png + icons/help-browser.png + icons/help-faq.png + icons/image-x-generic.png + icons/media-playback-start-2.png + icons/media-playlist-repeat.png + icons/object-rotate-left.png + icons/object-rotate-right.png + icons/ovito.png + icons/preferences-desktop-font.png + icons/preferences-desktop-personal.png + icons/preferences-desktop.png + icons/process-stop.png + icons/run-file.png + icons/system-box.png + icons/system-help.png + icons/system-run.png + icons/utilities-terminal.png + icons/vdw-style.png + icons/vmd.png + icons/window-close.png + icons/x-office-drawing.png diff --git a/tools/lammps-gui/lammpsgui.ui b/tools/lammps-gui/lammpsgui.ui index 77257b23c2..bb9af2e17e 100644 --- a/tools/lammps-gui/lammpsgui.ui +++ b/tools/lammps-gui/lammpsgui.ui @@ -105,7 +105,7 @@ - + &New @@ -116,7 +116,7 @@ - + &Open @@ -127,7 +127,7 @@ - + &Save @@ -138,7 +138,7 @@ - + Save &As @@ -149,7 +149,7 @@ - + &Quit @@ -160,7 +160,7 @@ - + Cu&t @@ -171,7 +171,7 @@ - + &Copy @@ -182,7 +182,7 @@ - + &Paste @@ -193,7 +193,7 @@ - + &Undo @@ -204,7 +204,7 @@ - + &Redo @@ -215,7 +215,7 @@ - + &Run LAMMPS from Editor Buffer @@ -226,7 +226,7 @@ - + &Run LAMMPS from File @@ -237,7 +237,7 @@ - + &Stop LAMMPS @@ -248,7 +248,7 @@ - + Create &Image @@ -259,7 +259,7 @@ - + &About LAMMPS @@ -270,7 +270,7 @@ - + Quick &Help @@ -281,7 +281,7 @@ - + Pre&ferences... @@ -292,7 +292,7 @@ - + LAMMPS &Manual @@ -303,7 +303,7 @@ - + Reset to &Defaults @@ -311,7 +311,7 @@ - + View in &OVITO @@ -322,7 +322,7 @@ - + View in VM&D @@ -333,7 +333,7 @@ - + &Log Window @@ -344,7 +344,7 @@ - + &Chart Window @@ -355,7 +355,7 @@ - + &Slide Show Window @@ -366,7 +366,7 @@ - + &1. @@ -374,7 +374,7 @@ - + &2. @@ -382,7 +382,7 @@ - + &3. @@ -390,7 +390,7 @@ - + &4. @@ -398,7 +398,7 @@ - + &5. @@ -406,7 +406,7 @@ - + &Image Window @@ -417,7 +417,7 @@ - + Set &Variables... @@ -428,7 +428,7 @@ - + &Variables Window @@ -439,7 +439,7 @@ - + LAMMPS GUI Howto diff --git a/tools/lammps-gui/preferences.cpp b/tools/lammps-gui/preferences.cpp index b6224d452e..5b8cc7afdb 100644 --- a/tools/lammps-gui/preferences.cpp +++ b/tools/lammps-gui/preferences.cpp @@ -73,7 +73,7 @@ Preferences::Preferences(LammpsWrapper *_lammps, QWidget *parent) : layout->addWidget(tabWidget); layout->addWidget(buttonBox); setLayout(layout); - setWindowIcon(QIcon(":/lammps-icon-128x128.png")); + setWindowIcon(QIcon(":/icons/lammps-icon-128x128.png")); setWindowTitle("LAMMPS-GUI - Preferences"); resize(600, 450); } @@ -242,9 +242,9 @@ GeneralTab::GeneralTab(QSettings *_settings, LammpsWrapper *_lammps, QWidget *pa auto *fontlayout = new QHBoxLayout; auto *getallfont = - new QPushButton(QIcon(":/preferences-desktop-font.png"), "Select Default Font..."); + new QPushButton(QIcon(":/icons/preferences-desktop-font.png"), "Select Default Font..."); auto *gettextfont = - new QPushButton(QIcon(":/preferences-desktop-font.png"), "Select Text Font..."); + new QPushButton(QIcon(":/icons/preferences-desktop-font.png"), "Select Text Font..."); fontlayout->addWidget(getallfont); fontlayout->addWidget(gettextfont); connect(getallfont, &QPushButton::released, this, &GeneralTab::newallfont); diff --git a/tools/lammps-gui/setvariables.cpp b/tools/lammps-gui/setvariables.cpp index fbbacb70bd..db5eb1cdea 100644 --- a/tools/lammps-gui/setvariables.cpp +++ b/tools/lammps-gui/setvariables.cpp @@ -32,7 +32,7 @@ SetVariables::SetVariables(QList> &_vars, QWidget *paren auto *row = new QHBoxLayout; auto *name = new QLineEdit(v.first); auto *val = new QLineEdit(v.second); - auto *del = new QPushButton(QIcon(":/edit-delete.png"), ""); + auto *del = new QPushButton(QIcon(":/icons/edit-delete.png"), ""); name->setObjectName("varname"); val->setObjectName("varval"); del->setObjectName(QString::number(i)); @@ -55,7 +55,7 @@ SetVariables::SetVariables(QList> &_vars, QWidget *paren layout->addWidget(buttonBox); setLayout(layout); - setWindowIcon(QIcon(":/lammps-icon-128x128.png")); + setWindowIcon(QIcon(":/icons/lammps-icon-128x128.png")); setWindowTitle("LAMMPS-GUI - Set Variables"); resize(300, 200); } @@ -81,7 +81,7 @@ void SetVariables::add_row() auto *row = new QHBoxLayout; auto *name = new QLineEdit(QString()); auto *val = new QLineEdit(QString()); - auto *del = new QPushButton(QIcon(":/edit-delete.png"), ""); + auto *del = new QPushButton(QIcon(":/icons/edit-delete.png"), ""); name->setObjectName("varname"); val->setObjectName("varval"); del->setObjectName(QString::number(nrows - 2)); diff --git a/tools/lammps-gui/slideshow.cpp b/tools/lammps-gui/slideshow.cpp index e92bfdc2d5..68544040e6 100644 --- a/tools/lammps-gui/slideshow.cpp +++ b/tools/lammps-gui/slideshow.cpp @@ -64,33 +64,33 @@ SlideShow::SlideShow(const QString &fileName, QWidget *parent) : auto *dummy = new QPushButton(QIcon(), ""); dummy->hide(); - auto *tomovie = new QPushButton(QIcon(":/export-movie.png"), ""); + auto *tomovie = new QPushButton(QIcon(":/icons/export-movie.png"), ""); tomovie->setToolTip("Export to movie file"); tomovie->setEnabled(has_exe("ffmpeg")); - auto *gofirst = new QPushButton(QIcon(":/go-first.png"), ""); + auto *gofirst = new QPushButton(QIcon(":/icons/go-first.png"), ""); gofirst->setToolTip("Go to first Image"); - auto *goprev = new QPushButton(QIcon(":/go-previous-2.png"), ""); + auto *goprev = new QPushButton(QIcon(":/icons/go-previous-2.png"), ""); goprev->setToolTip("Go to previous Image"); - auto *goplay = new QPushButton(QIcon(":/media-playback-start-2.png"), ""); + auto *goplay = new QPushButton(QIcon(":/icons/media-playback-start-2.png"), ""); goplay->setToolTip("Play animation"); goplay->setCheckable(true); goplay->setChecked(playtimer); goplay->setObjectName("play"); - auto *gonext = new QPushButton(QIcon(":/go-next-2.png"), ""); + auto *gonext = new QPushButton(QIcon(":/icons/go-next-2.png"), ""); gonext->setToolTip("Go to next Image"); - auto *golast = new QPushButton(QIcon(":/go-last.png"), ""); + auto *golast = new QPushButton(QIcon(":/icons/go-last.png"), ""); golast->setToolTip("Go to last Image"); - auto *goloop = new QPushButton(QIcon(":/media-playlist-repeat.png"), ""); + auto *goloop = new QPushButton(QIcon(":/icons/media-playlist-repeat.png"), ""); goloop->setToolTip("Loop animation"); goloop->setCheckable(true); goloop->setChecked(do_loop); - auto *zoomin = new QPushButton(QIcon(":/gtk-zoom-in.png"), ""); + auto *zoomin = new QPushButton(QIcon(":/icons/gtk-zoom-in.png"), ""); zoomin->setToolTip("Zoom in by 10 percent"); - auto *zoomout = new QPushButton(QIcon(":/gtk-zoom-out.png"), ""); + auto *zoomout = new QPushButton(QIcon(":/icons/gtk-zoom-out.png"), ""); zoomout->setToolTip("Zoom out by 10 percent"); - auto *normal = new QPushButton(QIcon(":/gtk-zoom-fit.png"), ""); + auto *normal = new QPushButton(QIcon(":/icons/gtk-zoom-fit.png"), ""); normal->setToolTip("Reset zoom to normal"); connect(tomovie, &QPushButton::released, this, &SlideShow::movie); @@ -127,7 +127,7 @@ SlideShow::SlideShow(const QString &fileName, QWidget *parent) : botLayout->setStretch(0, 3); mainLayout->addLayout(botLayout); - setWindowIcon(QIcon(":/lammps-icon-128x128.png")); + setWindowIcon(QIcon(":/icons/lammps-icon-128x128.png")); setWindowTitle(QString("LAMMPS-GUI - Slide Show: ") + QFileInfo(fileName).fileName()); imagefiles.clear(); From 5201e6b2f15509b5d7aba1742470866c8ebe119b Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 24 Sep 2023 16:31:28 -0400 Subject: [PATCH 086/219] add support for completion on file names --- tools/lammps-gui/codeeditor.cpp | 24 +++++++++++++++++++++++- tools/lammps-gui/codeeditor.h | 3 ++- tools/lammps-gui/lammpsgui.cpp | 4 ++++ 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/tools/lammps-gui/codeeditor.cpp b/tools/lammps-gui/codeeditor.cpp index bf94568f37..e46c14289b 100644 --- a/tools/lammps-gui/codeeditor.cpp +++ b/tools/lammps-gui/codeeditor.cpp @@ -19,8 +19,10 @@ #include #include #include +#include #include #include +#include #include #include #include @@ -131,7 +133,7 @@ CodeEditor::CodeEditor(QWidget *parent) : minimize_comp(new QCompleter(this)), variable_comp(new QCompleter(this)), units_comp(new QCompleter(this)), group_comp(new QCompleter(this)), varname_comp(new QCompleter(this)), fixid_comp(new QCompleter(this)), - compid_comp(new QCompleter(this)), highlight(NO_HIGHLIGHT) + compid_comp(new QCompleter(this)), file_comp(new QCompleter(this)), highlight(NO_HIGHLIGHT) { help_action = new QShortcut(QKeySequence::fromString("Ctrl+?"), parent); connect(help_action, &QShortcut::activated, this, &CodeEditor::get_help); @@ -166,6 +168,7 @@ CodeEditor::CodeEditor(QWidget *parent) : COMPLETER_SETUP(varname_comp); COMPLETER_SETUP(fixid_comp); COMPLETER_SETUP(compid_comp); + COMPLETER_SETUP(file_comp); #undef COMPLETER_SETUP // initialize help system @@ -233,6 +236,7 @@ CodeEditor::~CodeEditor() delete varname_comp; delete fixid_comp; delete compid_comp; + delete file_comp; } int CodeEditor::lineNumberAreaWidth() @@ -506,6 +510,16 @@ void CodeEditor::setFixIDList() fixid_comp->setModel(new QStringListModel(fixid, fixid_comp)); } +void CodeEditor::setFileList() +{ + QStringList files; + QDir dir("."); + for (const auto &file : dir.entryInfoList(QDir::Files)) + files << file.fileName(); + files.sort(); + file_comp->setModel(new QStringListModel(files, file_comp)); +} + void CodeEditor::keyPressEvent(QKeyEvent *event) { const auto key = event->key(); @@ -801,6 +815,10 @@ void CodeEditor::runCompletion() else if ((words[0] == "change_box") || (words[0] == "displace_atoms") || (words[0] == "velocity") || (words[0] == "write_dump")) current_comp = group_comp; + else if ((words[0] == "fitpod") || (words[0] == "include") || (words[0] == "ndx2group") || + (words[0] == "read_data") || (words[0] == "read_dump") || + (words[0] == "read_restart") || (words[0] == "rerun")) + current_comp = file_comp; else if (selected.startsWith("v_")) current_comp = varname_comp; else if (selected.startsWith("c_")) @@ -852,6 +870,8 @@ void CodeEditor::runCompletion() current_comp = fixid_comp; else if (selected.startsWith("F_")) current_comp = fixid_comp; + else if ((words[0] == "fitpod") || (words[0] == "molecule")) + current_comp = file_comp; if (current_comp) { current_comp->setCompletionPrefix(words[2].c_str()); @@ -879,6 +899,8 @@ void CodeEditor::runCompletion() current_comp = compute_comp; else if (words[0] == "dump") current_comp = dump_comp; + else if ((words[0] == "pair_coeff") && (words[1] == "*") && (words[2] == "*")) + current_comp = file_comp; else if (selected.startsWith("v_")) current_comp = varname_comp; else if (selected.startsWith("c_")) diff --git a/tools/lammps-gui/codeeditor.h b/tools/lammps-gui/codeeditor.h index 5f802d329d..703b2ffd3c 100644 --- a/tools/lammps-gui/codeeditor.h +++ b/tools/lammps-gui/codeeditor.h @@ -60,6 +60,7 @@ public: void setVarNameList(); void setComputeIDList(); void setFixIDList(); + void setFileList(); static constexpr int NO_HIGHLIGHT = 1 << 30; @@ -87,7 +88,7 @@ private: QCompleter *current_comp, *command_comp, *fix_comp, *compute_comp, *dump_comp, *atom_comp, *pair_comp, *bond_comp, *angle_comp, *dihedral_comp, *improper_comp, *kspace_comp, *region_comp, *integrate_comp, *minimize_comp, *variable_comp, *units_comp, *group_comp, - *varname_comp, *fixid_comp, *compid_comp; + *varname_comp, *fixid_comp, *compid_comp, *file_comp; int highlight; bool reformat_on_return; diff --git a/tools/lammps-gui/lammpsgui.cpp b/tools/lammps-gui/lammpsgui.cpp index 870f464ff1..3399d69a48 100644 --- a/tools/lammps-gui/lammpsgui.cpp +++ b/tools/lammps-gui/lammpsgui.cpp @@ -305,6 +305,8 @@ LammpsGui::LammpsGui(QWidget *parent, const char *filename) : style_list.sort(); ui->textEdit->setUnitsList(style_list); + ui->textEdit->setFileList(); + #define ADD_STYLES(keyword, Type) \ style_list.clear(); \ if ((std::string(#keyword) == "pair") || (std::string(#keyword) == "bond") || \ @@ -596,6 +598,7 @@ void LammpsGui::open_file(const QString &fileName) ui->textEdit->setVarNameList(); ui->textEdit->setComputeIDList(); ui->textEdit->setFixIDList(); + ui->textEdit->setFileList(); file.close(); dirstatus->setText(QString(" Directory: ") + current_dir); status->setText("Ready."); @@ -938,6 +941,7 @@ void LammpsGui::run_done() QString("Error running LAMMPS:\n\n") + errorbuf); } ui->textEdit->setCursor(nline); + ui->textEdit->setFileList(); progress->hide(); dirstatus->show(); } From 11608abf34e1dd9d207e2be6b8b0c62bc99f5c89 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 24 Sep 2023 16:45:59 -0400 Subject: [PATCH 087/219] update docs --- doc/src/Intro_nonfeatures.rst | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/doc/src/Intro_nonfeatures.rst b/doc/src/Intro_nonfeatures.rst index 3289b838d6..529bcbdf6d 100644 --- a/doc/src/Intro_nonfeatures.rst +++ b/doc/src/Intro_nonfeatures.rst @@ -5,7 +5,7 @@ LAMMPS is designed to be a fast, parallel engine for molecular dynamics (MD) simulations. It provides only a modest amount of functionality for setting up simulations and analyzing their output. -Specifically, LAMMPS was not conceived and designed for: +Originally, LAMMPS was not conceived and designed for: * being run through a GUI * building molecular systems, or building molecular topologies @@ -14,9 +14,10 @@ Specifically, LAMMPS was not conceived and designed for: * visualize your MD simulation interactively * plot your output data -Over the years some of these limitations have been reduced or -removed, through features added to LAMMPS or external tools -that either closely interface with LAMMPS or extend LAMMPS. +Over the years many of these limitations have been reduced or +removed. In part through features added to LAMMPS and in part +through external tools that either closely interface with LAMMPS +or extend LAMMPS. Here are suggestions on how to perform these tasks: @@ -24,8 +25,9 @@ Here are suggestions on how to perform these tasks: wraps the library interface is provided. Thus, GUI interfaces can be written in Python or C/C++ that run LAMMPS and visualize or plot its output. Examples of this are provided in the python directory and - described on the :doc:`Python ` doc page. Also, there - are several external wrappers or GUI front ends. + described on the :doc:`Python ` doc page. As of version + 2 August 2023 :ref:`a GUI tool ` is included in LAMMPS. + Also, there are several external wrappers or GUI front ends. * **Builder:** Several pre-processing tools are packaged with LAMMPS. Some of them convert input files in formats produced by other MD codes such as CHARMM, AMBER, or Insight into LAMMPS input formats. Some of From b2f62bbd1a6fe92b52f55ef352b70cf59250d794 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 24 Sep 2023 17:52:43 -0400 Subject: [PATCH 088/219] include FFMpeg and gzip into windows zip archive for LAMMPS GUI --- cmake/packaging/build_windows_vs.cmake | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/cmake/packaging/build_windows_vs.cmake b/cmake/packaging/build_windows_vs.cmake index bd55f3f442..283425ff65 100644 --- a/cmake/packaging/build_windows_vs.cmake +++ b/cmake/packaging/build_windows_vs.cmake @@ -21,6 +21,13 @@ file(WRITE qtdeploy.bat "@ECHO OFF\r\nset VSCMD_DEBUG=0\r\nCALL ${VC_INIT} x64\r execute_process(COMMAND cmd.exe /c qtdeploy.bat COMMAND_ECHO STDERR) file(REMOVE qtdeploy.bat) +# download and uncompress static FFMpeg and gzip binaries +file(DOWNLOAD "https://download.lammps.org/thirdparty/ffmpeg-gzip.zip" ffmpeg-gzip.zip) +file(WRITE unpackzip.ps1 "Expand-Archive -Path ffmpeg-gzip.zip -DestinationPath LAMMPS_GUI") +execute_process(COMMAND powershell -ExecutionPolicy Bypass -File unpackzip.ps1) +file(REMOVE unpackzip.ps1) +file(REMOVE ffmpeg-gzip.zip) + # create zip archive file(WRITE makearchive.ps1 "Compress-Archive -Path LAMMPS_GUI -CompressionLevel Optimal -DestinationPath LAMMPS_GUI-Win10-amd64.zip") execute_process(COMMAND powershell -ExecutionPolicy Bypass -File makearchive.ps1) From 29989f102a0df719dbf4f204c6bff681b6c081dc Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 24 Sep 2023 23:08:59 -0400 Subject: [PATCH 089/219] remove unused class members and silence compiler warnings --- tools/lammps-gui/chartviewer.cpp | 6 +++--- tools/lammps-gui/codeeditor.cpp | 4 ++-- tools/lammps-gui/highlighter.h | 2 +- tools/lammps-gui/imageviewer.cpp | 4 ++-- tools/lammps-gui/lammpsgui.cpp | 9 ++++----- tools/lammps-gui/lammpswrapper.cpp | 6 +++++- tools/lammps-gui/lammpswrapper.h | 2 ++ tools/lammps-gui/preferences.cpp | 4 ++-- tools/lammps-gui/stdcapture.h | 1 - 9 files changed, 21 insertions(+), 17 deletions(-) diff --git a/tools/lammps-gui/chartviewer.cpp b/tools/lammps-gui/chartviewer.cpp index bc9ebd56c4..f33d6b3b91 100644 --- a/tools/lammps-gui/chartviewer.cpp +++ b/tools/lammps-gui/chartviewer.cpp @@ -22,8 +22,8 @@ using namespace QtCharts; ChartWindow::ChartWindow(const QString &_filename, QWidget *parent) : - QWidget(parent), menu(new QMenuBar), file(new QMenu("&File")), active_chart(-1), - filename(_filename) + QWidget(parent), menu(new QMenuBar), file(new QMenu("&File")), + filename(_filename), active_chart(-1) { auto *top = new QHBoxLayout; menu->addMenu(file); @@ -175,7 +175,7 @@ void ChartWindow::exportCsv() } } -void ChartWindow::change_chart(int index) +void ChartWindow::change_chart(int) { int choice = columns->currentData().toInt(); for (auto &c : charts) { diff --git a/tools/lammps-gui/codeeditor.cpp b/tools/lammps-gui/codeeditor.cpp index e46c14289b..91cecef1fd 100644 --- a/tools/lammps-gui/codeeditor.cpp +++ b/tools/lammps-gui/codeeditor.cpp @@ -323,7 +323,7 @@ QString CodeEditor::reformatLine(const QString &line) } // append remaining words with just a single blank added. - for (int i = 1; i < words.size(); ++i) { + for (std::size_t i = 1; i < words.size(); ++i) { newtext += ' '; newtext += words[i].c_str(); @@ -552,7 +552,7 @@ void CodeEditor::keyPressEvent(QKeyEvent *event) } // automatically reformat when hitting the return or enter key - if (reformat_on_return && (key == Qt::Key_Return) || (key == Qt::Key_Enter)) { + if (reformat_on_return && ((key == Qt::Key_Return) || (key == Qt::Key_Enter))) { reformatCurrentLine(); } diff --git a/tools/lammps-gui/highlighter.h b/tools/lammps-gui/highlighter.h index 6edbc0ca96..03b4355e19 100644 --- a/tools/lammps-gui/highlighter.h +++ b/tools/lammps-gui/highlighter.h @@ -32,7 +32,7 @@ private: QRegularExpression isOutput1, isOutput2, isRead; QTextCharFormat formatOutput, formatRead, formatLattice, formatSetup; QRegularExpression isStyle, isForce, isDefine, isUndo; - QRegularExpression isParticle, isSetup, isSetup1, isRun; + QRegularExpression isParticle, isRun, isSetup, isSetup1; QTextCharFormat formatParticle, formatRun, formatDefine; QRegularExpression isVariable, isReference; QTextCharFormat formatVariable; diff --git a/tools/lammps-gui/imageviewer.cpp b/tools/lammps-gui/imageviewer.cpp index c7186c40aa..010bdc82b8 100644 --- a/tools/lammps-gui/imageviewer.cpp +++ b/tools/lammps-gui/imageviewer.cpp @@ -57,7 +57,7 @@ static int get_pte_from_mass(double mass) static const QString blank(" "); ImageViewer::ImageViewer(const QString &fileName, LammpsWrapper *_lammps, QWidget *parent) : - QDialog(parent), imageLabel(new QLabel), scrollArea(new QScrollArea), menuBar(new QMenuBar), + QDialog(parent), menuBar(new QMenuBar), imageLabel(new QLabel), scrollArea(new QScrollArea), lammps(_lammps), group("all"), filename(fileName), useelements(false) { imageLabel->setBackgroundRole(QPalette::Base); @@ -348,7 +348,7 @@ void ImageViewer::do_rot_up() createImage(); } -void ImageViewer::change_group(int idx) +void ImageViewer::change_group(int) { QComboBox *box = findChild("group"); if (box) group = box->currentText(); diff --git a/tools/lammps-gui/lammpsgui.cpp b/tools/lammps-gui/lammpsgui.cpp index 3399d69a48..80e099ba2d 100644 --- a/tools/lammps-gui/lammpsgui.cpp +++ b/tools/lammps-gui/lammpsgui.cpp @@ -57,8 +57,7 @@ #endif static const QString blank(" "); -static constexpr int MAXRECENT = 5; -static constexpr int BUFLEN = 128; +static constexpr int BUFLEN = 128; LammpsGui::LammpsGui(QWidget *parent, const char *filename) : QMainWindow(parent), ui(new Ui::LammpsGui), highlighter(nullptr), capturer(nullptr), @@ -837,7 +836,7 @@ void LammpsGui::logupdate() for (int i = 0; i < ncols; ++i) { int datatype = *(int *)lammps.last_thermo("type", i); - double data; + double data = 0.0; if (datatype == 0) // int data = *(int *)lammps.last_thermo("data", i); else if (datatype == 2) // double @@ -907,7 +906,7 @@ void LammpsGui::run_done() chartwindow->add_chart(label, i); } int datatype = *(int *)lammps.last_thermo("type", i); - double data; + double data = 0.0; if (datatype == 0) // int data = *(int *)lammps.last_thermo("data", i); else if (datatype == 2) // double @@ -1400,7 +1399,7 @@ void LammpsGui::start_lammps() lammpsstatus->show(); // delete additional arguments again (3 were there initially - while (lammps_args.size() > initial_narg) { + while ((int)lammps_args.size() > initial_narg) { delete lammps_args.back(); lammps_args.pop_back(); } diff --git a/tools/lammps-gui/lammpswrapper.cpp b/tools/lammps-gui/lammpswrapper.cpp index 024aae5301..a71a750ac8 100644 --- a/tools/lammps-gui/lammpswrapper.cpp +++ b/tools/lammps-gui/lammpswrapper.cpp @@ -19,7 +19,11 @@ #include "library.h" #endif -LammpsWrapper::LammpsWrapper() : lammps_handle(nullptr), plugin_handle(nullptr) {} +LammpsWrapper::LammpsWrapper() : lammps_handle(nullptr) { +#if defined(LAMMPS_GUI_USE_PLUGIN) + plugin_handle = nullptr; +#endif +} void LammpsWrapper::open(int narg, char **args) { diff --git a/tools/lammps-gui/lammpswrapper.h b/tools/lammps-gui/lammpswrapper.h index f5d73a0d87..665f44c25c 100644 --- a/tools/lammps-gui/lammpswrapper.h +++ b/tools/lammps-gui/lammpswrapper.h @@ -57,7 +57,9 @@ public: private: void *lammps_handle; +#if defined(LAMMPS_GUI_USE_PLUGIN) void *plugin_handle; +#endif }; #endif diff --git a/tools/lammps-gui/preferences.cpp b/tools/lammps-gui/preferences.cpp index 5b8cc7afdb..cae3783e4d 100644 --- a/tools/lammps-gui/preferences.cpp +++ b/tools/lammps-gui/preferences.cpp @@ -57,9 +57,9 @@ #endif Preferences::Preferences(LammpsWrapper *_lammps, QWidget *parent) : - QDialog(parent), tabWidget(new QTabWidget), + QDialog(parent), need_relaunch(false), tabWidget(new QTabWidget), buttonBox(new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel)), - settings(new QSettings), lammps(_lammps), need_relaunch(false) + settings(new QSettings), lammps(_lammps) { tabWidget->addTab(new GeneralTab(settings, lammps), "&General Settings"); tabWidget->addTab(new AcceleratorTab(settings, lammps), "&Accelerators"); diff --git a/tools/lammps-gui/stdcapture.h b/tools/lammps-gui/stdcapture.h index ee8bb44dd3..3df6835aa9 100644 --- a/tools/lammps-gui/stdcapture.h +++ b/tools/lammps-gui/stdcapture.h @@ -31,7 +31,6 @@ private: int m_pipe[2]; int m_oldStdOut; bool m_capturing; - bool m_init; std::string m_captured; static constexpr int bufSize = 1025; From 082d2bec9ff5805140884f8d70c6f67a25b63d5d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 25 Sep 2023 07:46:55 -0400 Subject: [PATCH 090/219] merge used parts of periodic_table.h into imageviewer.cpp --- tools/lammps-gui/imageviewer.cpp | 77 ++++++++++- tools/lammps-gui/periodic_table.h | 206 ------------------------------ 2 files changed, 74 insertions(+), 209 deletions(-) delete mode 100644 tools/lammps-gui/periodic_table.h diff --git a/tools/lammps-gui/imageviewer.cpp b/tools/lammps-gui/imageviewer.cpp index 010bdc82b8..b73f8a4927 100644 --- a/tools/lammps-gui/imageviewer.cpp +++ b/tools/lammps-gui/imageviewer.cpp @@ -40,8 +40,80 @@ #include -extern "C" { -#include "periodic_table.h" +// clang-format off +/* periodic table of elements for translation of ordinal to atom type */ +static const char *pte_label[] = { + "X", "H", "He", "Li", "Be", "B", "C", "N", "O", "F", "Ne", + "Na", "Mg", "Al", "Si", "P" , "S", "Cl", "Ar", "K", "Ca", "Sc", + "Ti", "V", "Cr", "Mn", "Fe", "Co", "Ni", "Cu", "Zn", "Ga", "Ge", + "As", "Se", "Br", "Kr", "Rb", "Sr", "Y", "Zr", "Nb", "Mo", "Tc", + "Ru", "Rh", "Pd", "Ag", "Cd", "In", "Sn", "Sb", "Te", "I", "Xe", + "Cs", "Ba", "La", "Ce", "Pr", "Nd", "Pm", "Sm", "Eu", "Gd", "Tb", + "Dy", "Ho", "Er", "Tm", "Yb", "Lu", "Hf", "Ta", "W", "Re", "Os", + "Ir", "Pt", "Au", "Hg", "Tl", "Pb", "Bi", "Po", "At", "Rn", "Fr", + "Ra", "Ac", "Th", "Pa", "U", "Np", "Pu", "Am", "Cm", "Bk", "Cf", + "Es", "Fm", "Md", "No", "Lr", "Rf", "Db", "Sg", "Bh", "Hs", "Mt", + "Ds", "Rg" +}; +static constexpr int nr_pte_entries = sizeof(pte_label) / sizeof(char *); + +/* corresponding table of masses. */ +static constexpr double pte_mass[] = { + /* X */ 0.00000, 1.00794, 4.00260, 6.941, 9.012182, 10.811, + /* C */ 12.0107, 14.0067, 15.9994, 18.9984032, 20.1797, + /* Na */ 22.989770, 24.3050, 26.981538, 28.0855, 30.973761, + /* S */ 32.065, 35.453, 39.948, 39.0983, 40.078, 44.955910, + /* Ti */ 47.867, 50.9415, 51.9961, 54.938049, 55.845, 58.9332, + /* Ni */ 58.6934, 63.546, 65.409, 69.723, 72.64, 74.92160, + /* Se */ 78.96, 79.904, 83.798, 85.4678, 87.62, 88.90585, + /* Zr */ 91.224, 92.90638, 95.94, 98.0, 101.07, 102.90550, + /* Pd */ 106.42, 107.8682, 112.411, 114.818, 118.710, 121.760, + /* Te */ 127.60, 126.90447, 131.293, 132.90545, 137.327, + /* La */ 138.9055, 140.116, 140.90765, 144.24, 145.0, 150.36, + /* Eu */ 151.964, 157.25, 158.92534, 162.500, 164.93032, + /* Er */ 167.259, 168.93421, 173.04, 174.967, 178.49, 180.9479, + /* W */ 183.84, 186.207, 190.23, 192.217, 195.078, 196.96655, + /* Hg */ 200.59, 204.3833, 207.2, 208.98038, 209.0, 210.0, 222.0, + /* Fr */ 223.0, 226.0, 227.0, 232.0381, 231.03588, 238.02891, + /* Np */ 237.0, 244.0, 243.0, 247.0, 247.0, 251.0, 252.0, 257.0, + /* Md */ 258.0, 259.0, 262.0, 261.0, 262.0, 266.0, 264.0, 269.0, + /* Mt */ 268.0, 271.0, 272.0 +}; + +/* + * corresponding table of VDW radii. + * van der Waals radii are taken from A. Bondi, + * J. Phys. Chem., 68, 441 - 452, 1964, + * except the value for H, which is taken from R.S. Rowland & R. Taylor, + * J.Phys.Chem., 100, 7384 - 7391, 1996. Radii that are not available in + * either of these publications have RvdW = 2.00 \AA + * The radii for Ions (Na, K, Cl, Ca, Mg, and Cs are based on the CHARMM27 + * Rmin/2 parameters for (SOD, POT, CLA, CAL, MG, CES) by default. + */ +static constexpr double pte_vdw_radius[] = { + /* X */ 1.5, 1.2, 1.4, 1.82, 2.0, 2.0, + /* C */ 1.7, 1.55, 1.52, 1.47, 1.54, + /* Na */ 1.36, 1.18, 2.0, 2.1, 1.8, + /* S */ 1.8, 2.27, 1.88, 1.76, 1.37, 2.0, + /* Ti */ 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + /* Ni */ 1.63, 1.4, 1.39, 1.07, 2.0, 1.85, + /* Se */ 1.9, 1.85, 2.02, 2.0, 2.0, 2.0, + /* Zr */ 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + /* Pd */ 1.63, 1.72, 1.58, 1.93, 2.17, 2.0, + /* Te */ 2.06, 1.98, 2.16, 2.1, 2.0, + /* La */ 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + /* Eu */ 2.0, 2.0, 2.0, 2.0, 2.0, + /* Er */ 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + /* W */ 2.0, 2.0, 2.0, 2.0, 1.72, 1.66, + /* Hg */ 1.55, 1.96, 2.02, 2.0, 2.0, 2.0, 2.0, + /* Fr */ 2.0, 2.0, 2.0, 2.0, 2.0, 1.86, + /* Np */ 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + /* Md */ 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + /* Mt */ 2.0, 2.0, 2.0 +}; + +// clang-format on + static int get_pte_from_mass(double mass) { int idx = 0; @@ -52,7 +124,6 @@ static int get_pte_from_mass(double mass) if ((mass < 61.24) && (mass > 58.8133)) idx = 27; return idx; } -} static const QString blank(" "); diff --git a/tools/lammps-gui/periodic_table.h b/tools/lammps-gui/periodic_table.h deleted file mode 100644 index 70721dee95..0000000000 --- a/tools/lammps-gui/periodic_table.h +++ /dev/null @@ -1,206 +0,0 @@ -// clang-format off -/*************************************************************************** - * RCS INFORMATION: - * - * $RCSfile: periodic_table.h,v $ - * $Author: johns $ $Locker: $ $State: Exp $ - * $Revision: 1.12 $ $Date: 2009/01/21 17:45:41 $ - * - ***************************************************************************/ - -/* - * periodic table of elements and helper functions to convert - * ordinal numbers to labels and back. - * all tables and functions are declared static, so that it - * can be safely included by all plugins that may need it. - * - * 2002-2009 akohlmey@cmm.chem.upenn.edu, vmd@ks.uiuc.edu - */ - -#include -#include - -/* periodic table of elements for translation of ordinal to atom type */ -static const char *pte_label[] = { - "X", "H", "He", "Li", "Be", "B", "C", "N", "O", "F", "Ne", - "Na", "Mg", "Al", "Si", "P" , "S", "Cl", "Ar", "K", "Ca", "Sc", - "Ti", "V", "Cr", "Mn", "Fe", "Co", "Ni", "Cu", "Zn", "Ga", "Ge", - "As", "Se", "Br", "Kr", "Rb", "Sr", "Y", "Zr", "Nb", "Mo", "Tc", - "Ru", "Rh", "Pd", "Ag", "Cd", "In", "Sn", "Sb", "Te", "I", "Xe", - "Cs", "Ba", "La", "Ce", "Pr", "Nd", "Pm", "Sm", "Eu", "Gd", "Tb", - "Dy", "Ho", "Er", "Tm", "Yb", "Lu", "Hf", "Ta", "W", "Re", "Os", - "Ir", "Pt", "Au", "Hg", "Tl", "Pb", "Bi", "Po", "At", "Rn", "Fr", - "Ra", "Ac", "Th", "Pa", "U", "Np", "Pu", "Am", "Cm", "Bk", "Cf", - "Es", "Fm", "Md", "No", "Lr", "Rf", "Db", "Sg", "Bh", "Hs", "Mt", - "Ds", "Rg" -}; -static const int nr_pte_entries = sizeof(pte_label) / sizeof(char *); - -/* corresponding table of masses. */ -static const double pte_mass[] = { - /* X */ 0.00000, 1.00794, 4.00260, 6.941, 9.012182, 10.811, - /* C */ 12.0107, 14.0067, 15.9994, 18.9984032, 20.1797, - /* Na */ 22.989770, 24.3050, 26.981538, 28.0855, 30.973761, - /* S */ 32.065, 35.453, 39.948, 39.0983, 40.078, 44.955910, - /* Ti */ 47.867, 50.9415, 51.9961, 54.938049, 55.845, 58.9332, - /* Ni */ 58.6934, 63.546, 65.409, 69.723, 72.64, 74.92160, - /* Se */ 78.96, 79.904, 83.798, 85.4678, 87.62, 88.90585, - /* Zr */ 91.224, 92.90638, 95.94, 98.0, 101.07, 102.90550, - /* Pd */ 106.42, 107.8682, 112.411, 114.818, 118.710, 121.760, - /* Te */ 127.60, 126.90447, 131.293, 132.90545, 137.327, - /* La */ 138.9055, 140.116, 140.90765, 144.24, 145.0, 150.36, - /* Eu */ 151.964, 157.25, 158.92534, 162.500, 164.93032, - /* Er */ 167.259, 168.93421, 173.04, 174.967, 178.49, 180.9479, - /* W */ 183.84, 186.207, 190.23, 192.217, 195.078, 196.96655, - /* Hg */ 200.59, 204.3833, 207.2, 208.98038, 209.0, 210.0, 222.0, - /* Fr */ 223.0, 226.0, 227.0, 232.0381, 231.03588, 238.02891, - /* Np */ 237.0, 244.0, 243.0, 247.0, 247.0, 251.0, 252.0, 257.0, - /* Md */ 258.0, 259.0, 262.0, 261.0, 262.0, 266.0, 264.0, 269.0, - /* Mt */ 268.0, 271.0, 272.0 -}; - -/* - * corresponding table of VDW radii. - * van der Waals radii are taken from A. Bondi, - * J. Phys. Chem., 68, 441 - 452, 1964, - * except the value for H, which is taken from R.S. Rowland & R. Taylor, - * J.Phys.Chem., 100, 7384 - 7391, 1996. Radii that are not available in - * either of these publications have RvdW = 2.00 \AA - * The radii for Ions (Na, K, Cl, Ca, Mg, and Cs are based on the CHARMM27 - * Rmin/2 parameters for (SOD, POT, CLA, CAL, MG, CES) by default. - */ -static const double pte_vdw_radius[] = { - /* X */ 1.5, 1.2, 1.4, 1.82, 2.0, 2.0, - /* C */ 1.7, 1.55, 1.52, 1.47, 1.54, - /* Na */ 1.36, 1.18, 2.0, 2.1, 1.8, - /* S */ 1.8, 2.27, 1.88, 1.76, 1.37, 2.0, - /* Ti */ 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, - /* Ni */ 1.63, 1.4, 1.39, 1.07, 2.0, 1.85, - /* Se */ 1.9, 1.85, 2.02, 2.0, 2.0, 2.0, - /* Zr */ 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, - /* Pd */ 1.63, 1.72, 1.58, 1.93, 2.17, 2.0, - /* Te */ 2.06, 1.98, 2.16, 2.1, 2.0, - /* La */ 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, - /* Eu */ 2.0, 2.0, 2.0, 2.0, 2.0, - /* Er */ 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, - /* W */ 2.0, 2.0, 2.0, 2.0, 1.72, 1.66, - /* Hg */ 1.55, 1.96, 2.02, 2.0, 2.0, 2.0, 2.0, - /* Fr */ 2.0, 2.0, 2.0, 2.0, 2.0, 1.86, - /* Np */ 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, - /* Md */ 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, - /* Mt */ 2.0, 2.0, 2.0 -}; - -/* lookup functions */ - -static const char *get_pte_label(const int idx) -{ - if ((idx < 1) || (idx >= nr_pte_entries)) return pte_label[0]; - - return pte_label[idx]; -} - -static double get_pte_mass(const int idx) -{ - if ((idx < 1) || (idx >= nr_pte_entries)) return pte_mass[0]; - - return pte_mass[idx]; -} - -static double get_pte_vdw_radius(const int idx) -{ - if ((idx < 1) || (idx >= nr_pte_entries)) return pte_vdw_radius[0]; - -#if 1 - /* Replace with Hydrogen radius with an "all-atom" radius */ - if (idx == 1) - return 1.0; /* H */ -#else - /* Replace with old VMD atom radii values */ - switch (idx) { - case 1: return 1.0; /* H */ - case 6: return 1.5; /* C */ - case 7: return 1.4; /* N */ - case 8: return 1.3; /* O */ - case 9: return 1.2; /* F */ - case 15: return 1.5; /* P */ - case 16: return 1.9; /* S */ - } -#endif - - return pte_vdw_radius[idx]; -} - -static int get_pte_idx(const char *label) -{ - int i; - char atom[3]; - - /* zap string */ - atom[0] = (char) 0; - atom[1] = (char) 0; - atom[2] = (char) 0; - /* if we don't have a null-pointer, there must be at least two - * chars, which is all we need. we convert to the capitalization - * convention of the table above during assignment. */ - if (label != NULL) { - atom[0] = (char) toupper((int) label[0]); - atom[1] = (char) tolower((int) label[1]); - } - /* discard numbers in atom label */ - if (isdigit(atom[1])) atom[1] = (char) 0; - - for (i=0; i < nr_pte_entries; ++i) { - if ( (pte_label[i][0] == atom[0]) - && (pte_label[i][1] == atom[1]) ) return i; - } - - return 0; -} - -static int get_pte_idx_from_string(const char *label) { - int i, ind; - char atom[3]; - - if (label != NULL) { - /* zap string */ - atom[0] = atom[1] = atom[2] = '\0'; - - for (ind=0,i=0; (ind<2) && (label[i]!='\0'); i++) { - if (label[i] != ' ') { - atom[ind] = toupper(label[i]); - ind++; - } - } - - if (ind < 1) - return 0; /* no non-whitespace characters */ - - for (i=0; i < nr_pte_entries; ++i) { - if ((toupper(pte_label[i][0]) == atom[0]) && (toupper(pte_label[i][1]) == atom[1])) - return i; - } - } - - return 0; -} - -#if 0 -#include - -int main() { - int i; - - printf("Periodic table check/dump\n"); - printf(" Table contains data for %d elements\n", nr_pte_entries); - printf(" Mass table size check: %d\n", sizeof(pte_mass) / sizeof(double)); - printf(" VDW table size check: %d\n", sizeof(pte_vdw_radius) / sizeof(double)); - printf("\n"); - printf("Symbol Num Mass rVDW\n"); - for (i=0; i Date: Mon, 25 Sep 2023 08:07:36 -0400 Subject: [PATCH 091/219] check for compatible LAMMPS version when creating LAMMPS instance This check must be done at runtime, since the LAMMPS shared library may have been loaded dynamically and thus required library functions may not be present or missing features with too only a LAMMPS version. --- tools/lammps-gui/lammpsgui.cpp | 9 +++++++++ tools/lammps-gui/lammpswrapper.cpp | 13 +++++++++++++ tools/lammps-gui/lammpswrapper.h | 1 + 3 files changed, 23 insertions(+) diff --git a/tools/lammps-gui/lammpsgui.cpp b/tools/lammps-gui/lammpsgui.cpp index 80e099ba2d..ebfb7f90fb 100644 --- a/tools/lammps-gui/lammpsgui.cpp +++ b/tools/lammps-gui/lammpsgui.cpp @@ -1398,6 +1398,15 @@ void LammpsGui::start_lammps() lammps.open(narg, args); lammpsstatus->show(); + // must have at least 2 August 2023 version of LAMMPS + // TODO: must update this check before next feature release + if (lammps.version() < 20230802) { + QMessageBox::critical(this, "Incompatible LAMMPS Version", + "LAMMPS-GUI version " LAMMPS_GUI_VERSION " requires\n" + "LAMMPS version 2 August 2023 or later"); + exit(1); + } + // delete additional arguments again (3 were there initially while ((int)lammps_args.size() > initial_narg) { delete lammps_args.back(); diff --git a/tools/lammps-gui/lammpswrapper.cpp b/tools/lammps-gui/lammpswrapper.cpp index a71a750ac8..84de5866c4 100644 --- a/tools/lammps-gui/lammpswrapper.cpp +++ b/tools/lammps-gui/lammpswrapper.cpp @@ -36,6 +36,19 @@ void LammpsWrapper::open(int narg, char **args) #endif } +int LammpsWrapper::version() +{ + int val = 0; + if (lammps_handle) { +#if defined(LAMMPS_GUI_USE_PLUGIN) + val = ((liblammpsplugin_t *)plugin_handle)->version(lammps_handle); +#else + val = lammps_version(lammps_handle); +#endif + } + return val; +} + int LammpsWrapper::extract_setting(const char *keyword) { int val = 0; diff --git a/tools/lammps-gui/lammpswrapper.h b/tools/lammps-gui/lammpswrapper.h index 665f44c25c..1d024a94e7 100644 --- a/tools/lammps-gui/lammpswrapper.h +++ b/tools/lammps-gui/lammpswrapper.h @@ -29,6 +29,7 @@ public: void force_timeout(); + int version(); int extract_setting(const char *keyword); void *extract_global(const char *keyword); void *extract_atom(const char *keyword); From a128089ab165eeda4e5d8e0e2c997a69d6ad942e Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 25 Sep 2023 08:09:36 -0400 Subject: [PATCH 092/219] apply clang-format --- tools/lammps-gui/chartviewer.cpp | 4 ++-- tools/lammps-gui/lammpsgui.cpp | 4 ++-- tools/lammps-gui/lammpswrapper.cpp | 3 ++- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/tools/lammps-gui/chartviewer.cpp b/tools/lammps-gui/chartviewer.cpp index f33d6b3b91..34893b75e8 100644 --- a/tools/lammps-gui/chartviewer.cpp +++ b/tools/lammps-gui/chartviewer.cpp @@ -22,8 +22,8 @@ using namespace QtCharts; ChartWindow::ChartWindow(const QString &_filename, QWidget *parent) : - QWidget(parent), menu(new QMenuBar), file(new QMenu("&File")), - filename(_filename), active_chart(-1) + QWidget(parent), menu(new QMenuBar), file(new QMenu("&File")), filename(_filename), + active_chart(-1) { auto *top = new QHBoxLayout; menu->addMenu(file); diff --git a/tools/lammps-gui/lammpsgui.cpp b/tools/lammps-gui/lammpsgui.cpp index ebfb7f90fb..eecf2a58e3 100644 --- a/tools/lammps-gui/lammpsgui.cpp +++ b/tools/lammps-gui/lammpsgui.cpp @@ -836,7 +836,7 @@ void LammpsGui::logupdate() for (int i = 0; i < ncols; ++i) { int datatype = *(int *)lammps.last_thermo("type", i); - double data = 0.0; + double data = 0.0; if (datatype == 0) // int data = *(int *)lammps.last_thermo("data", i); else if (datatype == 2) // double @@ -906,7 +906,7 @@ void LammpsGui::run_done() chartwindow->add_chart(label, i); } int datatype = *(int *)lammps.last_thermo("type", i); - double data = 0.0; + double data = 0.0; if (datatype == 0) // int data = *(int *)lammps.last_thermo("data", i); else if (datatype == 2) // double diff --git a/tools/lammps-gui/lammpswrapper.cpp b/tools/lammps-gui/lammpswrapper.cpp index 84de5866c4..f74a1c6575 100644 --- a/tools/lammps-gui/lammpswrapper.cpp +++ b/tools/lammps-gui/lammpswrapper.cpp @@ -19,7 +19,8 @@ #include "library.h" #endif -LammpsWrapper::LammpsWrapper() : lammps_handle(nullptr) { +LammpsWrapper::LammpsWrapper() : lammps_handle(nullptr) +{ #if defined(LAMMPS_GUI_USE_PLUGIN) plugin_handle = nullptr; #endif From 053f6fa03dde64ea632cc4dff5d13a0339ceae7c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 25 Sep 2023 08:54:56 -0400 Subject: [PATCH 093/219] must also update CWD when *saving* a file, not only when loading --- tools/lammps-gui/lammpsgui.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tools/lammps-gui/lammpsgui.cpp b/tools/lammps-gui/lammpsgui.cpp index eecf2a58e3..e95c41432c 100644 --- a/tools/lammps-gui/lammpsgui.cpp +++ b/tools/lammps-gui/lammpsgui.cpp @@ -622,6 +622,8 @@ void LammpsGui::open_file(const QString &fileName) lammps.close(); } +// write file and update CWD to its folder + void LammpsGui::write_file(const QString &fileName) { QFileInfo path(fileName); @@ -634,6 +636,7 @@ void LammpsGui::write_file(const QString &fileName) return; } setWindowTitle(QString("LAMMPS-GUI - " + current_file)); + QDir::setCurrent(current_dir); update_recents(path.absoluteFilePath()); From 25e9c2a35bb7df5926497eff61984381c414726b Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 25 Sep 2023 09:23:49 -0400 Subject: [PATCH 094/219] file completion only in current folder. hide popup when changing completer --- tools/lammps-gui/codeeditor.cpp | 48 ++++++++++++++++++++++----------- 1 file changed, 33 insertions(+), 15 deletions(-) diff --git a/tools/lammps-gui/codeeditor.cpp b/tools/lammps-gui/codeeditor.cpp index 91cecef1fd..4277ff4c90 100644 --- a/tools/lammps-gui/codeeditor.cpp +++ b/tools/lammps-gui/codeeditor.cpp @@ -725,6 +725,9 @@ void CodeEditor::reformatCurrentLine() void CodeEditor::runCompletion() { + QAbstractItemView *popup = nullptr; + if (current_comp) popup = current_comp->popup(); + auto cursor = textCursor(); auto line = cursor.block().text().trimmed(); // no completion possible on empty lines @@ -751,7 +754,8 @@ void CodeEditor::runCompletion() if (selected.startsWith("$")) { current_comp = varname_comp; current_comp->setCompletionPrefix(selected); - auto popup = current_comp->popup(); + if (popup && (popup != current_comp->popup())) popup->hide(); + popup = current_comp->popup(); // if the command is already a complete command, remove existing popup if (selected == current_comp->currentCompletion()) { if (popup->isVisible()) { @@ -772,7 +776,8 @@ void CodeEditor::runCompletion() current_comp = command_comp; current_comp->setCompletionPrefix(words[0].c_str()); - auto popup = current_comp->popup(); + if (popup && (popup != current_comp->popup())) popup->hide(); + popup = current_comp->popup(); // if the command is already a complete command, remove existing popup if (words[0] == current_comp->currentCompletion().toStdString()) { if (popup->isVisible()) { @@ -817,9 +822,12 @@ void CodeEditor::runCompletion() current_comp = group_comp; else if ((words[0] == "fitpod") || (words[0] == "include") || (words[0] == "ndx2group") || (words[0] == "read_data") || (words[0] == "read_dump") || - (words[0] == "read_restart") || (words[0] == "rerun")) - current_comp = file_comp; - else if (selected.startsWith("v_")) + (words[0] == "read_restart") || (words[0] == "rerun")) { + if (selected.contains('/')) { + if (popup && popup->isVisible()) popup->hide(); + } else + current_comp = file_comp; + } else if (selected.startsWith("v_")) current_comp = varname_comp; else if (selected.startsWith("c_")) current_comp = compid_comp; @@ -832,7 +840,8 @@ void CodeEditor::runCompletion() if (current_comp) { current_comp->setCompletionPrefix(words[1].c_str()); - auto popup = current_comp->popup(); + if (popup && (popup != current_comp->popup())) popup->hide(); + popup = current_comp->popup(); // if the command is already a complete command, remove existing popup if (words[1] == current_comp->currentCompletion().toStdString()) { if (popup->isVisible()) popup->hide(); @@ -870,12 +879,16 @@ void CodeEditor::runCompletion() current_comp = fixid_comp; else if (selected.startsWith("F_")) current_comp = fixid_comp; - else if ((words[0] == "fitpod") || (words[0] == "molecule")) - current_comp = file_comp; - + else if ((words[0] == "fitpod") || (words[0] == "molecule")) { + if (selected.contains('/')) { + if (popup && popup->isVisible()) popup->hide(); + } else + current_comp = file_comp; + } if (current_comp) { current_comp->setCompletionPrefix(words[2].c_str()); - auto popup = current_comp->popup(); + if (popup && (popup != current_comp->popup())) popup->hide(); + popup = current_comp->popup(); // if the command is already a complete command, remove existing popup if (words[2] == current_comp->currentCompletion().toStdString()) { if (popup->isVisible()) popup->hide(); @@ -899,9 +912,12 @@ void CodeEditor::runCompletion() current_comp = compute_comp; else if (words[0] == "dump") current_comp = dump_comp; - else if ((words[0] == "pair_coeff") && (words[1] == "*") && (words[2] == "*")) - current_comp = file_comp; - else if (selected.startsWith("v_")) + else if ((words[0] == "pair_coeff") && (words[1] == "*") && (words[2] == "*")) { + if (selected.contains('/')) { + if (popup && popup->isVisible()) popup->hide(); + } else + current_comp = file_comp; + } else if (selected.startsWith("v_")) current_comp = varname_comp; else if (selected.startsWith("c_")) current_comp = compid_comp; @@ -914,7 +930,8 @@ void CodeEditor::runCompletion() if (current_comp) { current_comp->setCompletionPrefix(words[3].c_str()); - auto popup = current_comp->popup(); + if (popup && (popup != current_comp->popup())) popup->hide(); + popup = current_comp->popup(); // if the command is already a complete command, remove existing popup if (words[3] == current_comp->currentCompletion().toStdString()) { if (popup->isVisible()) popup->hide(); @@ -942,7 +959,8 @@ void CodeEditor::runCompletion() if (current_comp) { current_comp->setCompletionPrefix(selected); - auto popup = current_comp->popup(); + if (popup && (popup != current_comp->popup())) popup->hide(); + popup = current_comp->popup(); // if the command is already a complete command, remove existing popup if (selected == current_comp->currentCompletion()) { if (popup->isVisible()) popup->hide(); From 6613af05dc47b526be4cbf2c8bb239151b4f3f83 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 28 Sep 2023 14:31:19 -0400 Subject: [PATCH 095/219] fix spelling issue --- doc/src/Howto_lammps_gui.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/src/Howto_lammps_gui.rst b/doc/src/Howto_lammps_gui.rst index fb0c0e80d4..cdcc09db84 100644 --- a/doc/src/Howto_lammps_gui.rst +++ b/doc/src/Howto_lammps_gui.rst @@ -308,12 +308,12 @@ contents to a file. Context Specific Word Completion ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -By default, LAMMPS GUI will display a small popup frame with possible +By default, LAMMPS GUI will display a small pop-up frame with possible completions for LAMMPS input script commands or styles after 2 characters of a word have been typed. The word can then be completed through selecting an entry by scrolling down with the cursor keys and selecting with the 'Enter' key or by clicking on the entry with the -mouse. The automatic completion popup can be disabled in the +mouse. The automatic completion pop-up can be disabled in the ``Preferences`` dialog, but the completion can still be requested manually by either hitting the 'Shift-TAB' key or by right-clicking with the mouse and selecting the option from the context menu. Most of the @@ -576,7 +576,7 @@ the range between 1 and 32. The two settings which follow enable or disable the automatic reformatting when hitting the 'Enter' key and the automatic display of -the completion popup window. +the completion pop-up window. ----------- From b03e8e376a0c833f7bb97d4c34da3667dba52a92 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 28 Sep 2023 14:31:32 -0400 Subject: [PATCH 096/219] make references consistent --- doc/src/Howto_lammps_gui.rst | 2 +- doc/src/Intro_nonfeatures.rst | 2 +- doc/src/Tools.rst | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/src/Howto_lammps_gui.rst b/doc/src/Howto_lammps_gui.rst index cdcc09db84..4492a13915 100644 --- a/doc/src/Howto_lammps_gui.rst +++ b/doc/src/Howto_lammps_gui.rst @@ -16,7 +16,7 @@ adapted in multiple ways specifically for editing LAMMPS input files. Pre-compiled, ready-to-use LAMMPS GUI executables for Linux (Ubuntu 20.04LTS or later and compatible), macOS (version 11 aka Big Sur or later), and Windows (version 10 or later) :ref:`are available - ` for download. The executables are linked to + ` for download. The executables are linked to a current version of LAMMPS as well. The source code for the LAMMPS GUI is included in the ``tools/lammps-gui`` folder of the LAMMPS distribution and it can be compiled alongside LAMMPS with diff --git a/doc/src/Intro_nonfeatures.rst b/doc/src/Intro_nonfeatures.rst index 529bcbdf6d..ea12e8c0b5 100644 --- a/doc/src/Intro_nonfeatures.rst +++ b/doc/src/Intro_nonfeatures.rst @@ -26,7 +26,7 @@ Here are suggestions on how to perform these tasks: written in Python or C/C++ that run LAMMPS and visualize or plot its output. Examples of this are provided in the python directory and described on the :doc:`Python ` doc page. As of version - 2 August 2023 :ref:`a GUI tool ` is included in LAMMPS. + 2 August 2023 :ref:`a GUI tool ` is included in LAMMPS. Also, there are several external wrappers or GUI front ends. * **Builder:** Several pre-processing tools are packaged with LAMMPS. Some of them convert input files in formats produced by other MD codes diff --git a/doc/src/Tools.rst b/doc/src/Tools.rst index e9ae37a463..2e8bd3eac4 100644 --- a/doc/src/Tools.rst +++ b/doc/src/Tools.rst @@ -706,7 +706,7 @@ required. The LAMMPS GUI has been successfully compiled and tested on: - Windows 10 and 11 x86_64 with Visual Studio 2022 and Visual C++ 14.36, Qt version 5.15LTS - Windows 10 and 11 x86_64 with MinGW / GCC 10.0 cross-compiler on Fedora 38, Qt version 5.15LTS -.. _lammps-gui-install: +.. _lammps_gui_install: Pre-compiled executables From c24ddfed2953d6da08896e12408b24cdb501e513 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 29 Sep 2023 16:45:13 -0400 Subject: [PATCH 097/219] add a run counter to log, chart, and slideshow window titles this counter is reset on loading a new file --- tools/lammps-gui/CMakeLists.txt | 2 +- tools/lammps-gui/lammpsgui.cpp | 32 ++++++++++++++++++-------------- tools/lammps-gui/lammpsgui.h | 1 + 3 files changed, 20 insertions(+), 15 deletions(-) diff --git a/tools/lammps-gui/CMakeLists.txt b/tools/lammps-gui/CMakeLists.txt index f6d532f891..ec21f9fac2 100644 --- a/tools/lammps-gui/CMakeLists.txt +++ b/tools/lammps-gui/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.16) -project(lammps-gui VERSION 1.5.6 LANGUAGES CXX) +project(lammps-gui VERSION 1.5.7 LANGUAGES CXX) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTOMOC ON) diff --git a/tools/lammps-gui/lammpsgui.cpp b/tools/lammps-gui/lammpsgui.cpp index e95c41432c..d72a7457ab 100644 --- a/tools/lammps-gui/lammpsgui.cpp +++ b/tools/lammps-gui/lammpsgui.cpp @@ -63,7 +63,8 @@ LammpsGui::LammpsGui(QWidget *parent, const char *filename) : QMainWindow(parent), ui(new Ui::LammpsGui), highlighter(nullptr), capturer(nullptr), status(nullptr), logwindow(nullptr), imagewindow(nullptr), chartwindow(nullptr), slideshow(nullptr), logupdater(nullptr), dirstatus(nullptr), progress(nullptr), - prefdialog(nullptr), lammpsstatus(nullptr), varwindow(nullptr) + prefdialog(nullptr), lammpsstatus(nullptr), varwindow(nullptr), runner(nullptr), + is_running(false), run_counter(0) { // enforce using the plain ASCII C locale within the GUI. QLocale::setDefault(QLocale("C")); @@ -373,6 +374,7 @@ void LammpsGui::new_document() lammps.close(); lammpsstatus->hide(); setWindowTitle(QString("LAMMPS-GUI - *unknown*")); + run_counter = 0; } void LammpsGui::open() @@ -588,6 +590,7 @@ void LammpsGui::open_file(const QString &fileName) return; } setWindowTitle(QString("LAMMPS-GUI - " + current_file)); + run_counter = 0; QTextStream in(&file); QString text = in.readAll(); ui->textEdit->document()->setPlainText(text); @@ -862,7 +865,8 @@ void LammpsGui::logupdate() else slideshow->hide(); } else { - slideshow->setWindowTitle(QString("LAMMPS-GUI - Slide Show: ") + current_file); + slideshow->setWindowTitle( + QString("LAMMPS-GUI - Slide Show: %1 - Run %2").arg(current_file).arg(run_counter)); if (QSettings().value("viewslide", true).toBool()) slideshow->show(); } slideshow->add_image(imagefile); @@ -980,6 +984,7 @@ void LammpsGui::do_run(bool use_buffer) progress->setValue(0); dirstatus->hide(); progress->show(); + int nthreads = settings.value("nthreads", 1).toInt(); int accel = settings.value("accelerator", AcceleratorTab::None).toInt(); if ((accel != AcceleratorTab::OpenMP) && (accel != AcceleratorTab::Intel) && @@ -996,6 +1001,7 @@ void LammpsGui::do_run(bool use_buffer) runner = new LammpsRunner(this); is_running = true; + ++run_counter; if (use_buffer) { // always add final newline since the text edit widget does not do it char *input = mystrdup(ui->textEdit->toPlainText() + "\n"); @@ -1015,12 +1021,11 @@ void LammpsGui::do_run(bool use_buffer) logwindow->setReadOnly(true); logwindow->setCenterOnScroll(true); logwindow->moveCursor(QTextCursor::End); - if (use_buffer) - logwindow->setWindowTitle("LAMMPS-GUI - Output from running LAMMPS on buffer - " + - current_file); - else - logwindow->setWindowTitle("LAMMPS-GUI - Output from running LAMMPS on file - " + - current_file); + logwindow->setWindowTitle( + QString("LAMMPS-GUI - Output from running LAMMPS on %1 - %2 - Run %3") + .arg(use_buffer ? "buffer" : "file") + .arg(current_file) + .arg(run_counter)); logwindow->setWindowIcon(QIcon(":/icons/lammps-icon-128x128.png")); QFont text_font; text_font.fromString(settings.value("textfont", text_font.toString()).toString()); @@ -1039,12 +1044,11 @@ void LammpsGui::do_run(bool use_buffer) // if configured, delete old log window before opening new one if (settings.value("chartreplace", false).toBool()) delete chartwindow; chartwindow = new ChartWindow(current_file); - if (use_buffer) - chartwindow->setWindowTitle("LAMMPS-GUI - Thermo charts from running LAMMPS on buffer - " + - current_file); - else - chartwindow->setWindowTitle("LAMMPS-GUI - Thermo charts from running LAMMPS on file - " + - current_file); + chartwindow->setWindowTitle( + QString("LAMMPS-GUI - Thermo charts from running LAMMPS on %1 - %2 - Run %3") + .arg(use_buffer ? "buffer" : "file") + .arg(current_file) + .arg(run_counter)); chartwindow->setWindowIcon(QIcon(":/icons/lammps-icon-128x128.png")); chartwindow->setMinimumSize(400, 300); shortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_W), chartwindow); diff --git a/tools/lammps-gui/lammpsgui.h b/tools/lammps-gui/lammpsgui.h index 6d80b0aee6..0eab3a9705 100644 --- a/tools/lammps-gui/lammpsgui.h +++ b/tools/lammps-gui/lammpsgui.h @@ -126,6 +126,7 @@ private: LammpsRunner *runner; std::string plugin_path; bool is_running; + int run_counter; std::vector lammps_args; }; #endif // LAMMPSGUI_H From ef575d5944eedf01eb2cef162e2dc07e53ce9ba9 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 29 Sep 2023 16:47:52 -0400 Subject: [PATCH 098/219] change default for replacing log/chart/image windows to true --- tools/lammps-gui/lammpsgui.cpp | 6 +++--- tools/lammps-gui/preferences.cpp | 11 +++++------ 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/tools/lammps-gui/lammpsgui.cpp b/tools/lammps-gui/lammpsgui.cpp index d72a7457ab..08dec27c59 100644 --- a/tools/lammps-gui/lammpsgui.cpp +++ b/tools/lammps-gui/lammpsgui.cpp @@ -1016,7 +1016,7 @@ void LammpsGui::do_run(bool use_buffer) runner->start(); // if configured, delete old log window before opening new one - if (settings.value("logreplace", false).toBool()) delete logwindow; + if (settings.value("logreplace", true).toBool()) delete logwindow; logwindow = new LogWindow(); logwindow->setReadOnly(true); logwindow->setCenterOnScroll(true); @@ -1042,7 +1042,7 @@ void LammpsGui::do_run(bool use_buffer) logwindow->hide(); // if configured, delete old log window before opening new one - if (settings.value("chartreplace", false).toBool()) delete chartwindow; + if (settings.value("chartreplace", true).toBool()) delete chartwindow; chartwindow = new ChartWindow(current_file); chartwindow->setWindowTitle( QString("LAMMPS-GUI - Thermo charts from running LAMMPS on %1 - %2 - Run %3") @@ -1107,7 +1107,7 @@ void LammpsGui::render_image() } } // if configured, delete old image window before opening new one - if (QSettings().value("imagereplace", false).toBool()) delete imagewindow; + if (QSettings().value("imagereplace", true).toBool()) delete imagewindow; imagewindow = new ImageViewer(current_file, &lammps); } else { QMessageBox::warning(this, "ImageViewer Error", diff --git a/tools/lammps-gui/preferences.cpp b/tools/lammps-gui/preferences.cpp index cae3783e4d..1e8e23ad62 100644 --- a/tools/lammps-gui/preferences.cpp +++ b/tools/lammps-gui/preferences.cpp @@ -216,16 +216,15 @@ GeneralTab::GeneralTab(QSettings *_settings, LammpsWrapper *_lammps, QWidget *pa sldv->setCheckState(settings->value("viewslide", true).toBool() ? Qt::Checked : Qt::Unchecked); auto *logr = new QCheckBox("Replace log window on new run"); logr->setObjectName("logreplace"); - logr->setCheckState(settings->value("logreplace", false).toBool() ? Qt::Checked - : Qt::Unchecked); + logr->setCheckState(settings->value("logreplace", true).toBool() ? Qt::Checked : Qt::Unchecked); auto *imgr = new QCheckBox("Replace image window on new render"); imgr->setObjectName("imagereplace"); - imgr->setCheckState(settings->value("imagereplace", false).toBool() ? Qt::Checked - : Qt::Unchecked); + imgr->setCheckState(settings->value("imagereplace", true).toBool() ? Qt::Checked + : Qt::Unchecked); auto *pltr = new QCheckBox("Replace chart window on new run"); pltr->setObjectName("chartreplace"); - pltr->setCheckState(settings->value("chartreplace", false).toBool() ? Qt::Checked - : Qt::Unchecked); + pltr->setCheckState(settings->value("chartreplace", true).toBool() ? Qt::Checked + : Qt::Unchecked); #if defined(LAMMPS_GUI_USE_PLUGIN) auto *pluginlabel = new QLabel("Path to LAMMPS Shared Library File:"); From 5a750c8633142b1aa2ad65134d5c16df3f3a39f5 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 29 Sep 2023 17:42:30 -0400 Subject: [PATCH 099/219] automatically define variable "gui_run" to contain the run number --- tools/lammps-gui/codeeditor.cpp | 5 +++++ tools/lammps-gui/lammpsgui.cpp | 4 ++++ 2 files changed, 9 insertions(+) diff --git a/tools/lammps-gui/codeeditor.cpp b/tools/lammps-gui/codeeditor.cpp index 4277ff4c90..46b970bd0a 100644 --- a/tools/lammps-gui/codeeditor.cpp +++ b/tools/lammps-gui/codeeditor.cpp @@ -417,6 +417,11 @@ void CodeEditor::setGroupList() void CodeEditor::setVarNameList() { QStringList vars; + + // variable "gui_run" is always defined by LAMMPS GUI + vars << QString("${gui_run}"); + vars << QString("v_gui_run"); + LammpsWrapper *lammps = &qobject_cast(parent())->lammps; int nvar = lammps->id_count("variable"); char buffer[200]; diff --git a/tools/lammps-gui/lammpsgui.cpp b/tools/lammps-gui/lammpsgui.cpp index 08dec27c59..c7f41555b5 100644 --- a/tools/lammps-gui/lammpsgui.cpp +++ b/tools/lammps-gui/lammpsgui.cpp @@ -1002,6 +1002,10 @@ void LammpsGui::do_run(bool use_buffer) runner = new LammpsRunner(this); is_running = true; ++run_counter; + + // define "gui_run" variable set to run_counter value + lammps.command("variable gui_run delete"); + lammps.command(std::string("variable gui_run index " + std::to_string(run_counter)).c_str()); if (use_buffer) { // always add final newline since the text edit widget does not do it char *input = mystrdup(ui->textEdit->toPlainText() + "\n"); From 1689c306b630c1e42d201e3c7458c5c1609805b3 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 29 Sep 2023 17:59:47 -0400 Subject: [PATCH 100/219] add "Save to File" option to the context dialog for the log window --- tools/lammps-gui/logwindow.cpp | 42 ++++++++++++++++++++++++++++++++++ tools/lammps-gui/logwindow.h | 4 ++++ 2 files changed, 46 insertions(+) diff --git a/tools/lammps-gui/logwindow.cpp b/tools/lammps-gui/logwindow.cpp index 7091b34f43..4b008ce5ca 100644 --- a/tools/lammps-gui/logwindow.cpp +++ b/tools/lammps-gui/logwindow.cpp @@ -12,7 +12,17 @@ ------------------------------------------------------------------------- */ #include "logwindow.h" + +#include +#include +#include +#include +#include +#include +#include #include +#include +#include LogWindow::LogWindow(QWidget *parent) : QPlainTextEdit(parent) { @@ -30,6 +40,38 @@ void LogWindow::closeEvent(QCloseEvent *event) QPlainTextEdit::closeEvent(event); } +void LogWindow::save_as() +{ + QString fileName = QFileDialog::getSaveFileName(this, "Save Log to File"); + if (fileName.isEmpty()) return; + + QFileInfo path(fileName); + QFile file(path.absoluteFilePath()); + + if (!file.open(QIODevice::WriteOnly | QFile::Text)) { + QMessageBox::warning(this, "Warning", "Cannot save file: " + file.errorString()); + return; + } + + QTextStream out(&file); + QString text = toPlainText(); + out << text; + if (text.back().toLatin1() != '\n') out << "\n"; // add final newline if missing + file.close(); +} + +void LogWindow::contextMenuEvent(QContextMenuEvent *event) +{ + // show augmented context menu + auto *menu = createStandardContextMenu(); + menu->addSeparator(); + auto action = menu->addAction(QString("Save Log to File ...")); + action->setIcon(QIcon(":/icons/document-save-as.png")); + connect(action, &QAction::triggered, this, &LogWindow::save_as); + menu->exec(event->globalPos()); + delete menu; +} + // Local Variables: // c-basic-offset: 4 // End: diff --git a/tools/lammps-gui/logwindow.h b/tools/lammps-gui/logwindow.h index 8807ef5cee..4765b2faa7 100644 --- a/tools/lammps-gui/logwindow.h +++ b/tools/lammps-gui/logwindow.h @@ -22,8 +22,12 @@ class LogWindow : public QPlainTextEdit { public: LogWindow(QWidget *parent = nullptr); +private slots: + void save_as(); + protected: void closeEvent(QCloseEvent *event) override; + void contextMenuEvent(QContextMenuEvent *event) override; }; #endif From e7b9bc2d4fbbac36a001e547c19a378eb07e0269 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 29 Sep 2023 18:53:18 -0400 Subject: [PATCH 101/219] update docs --- doc/src/Howto_lammps_gui.rst | 50 ++++++++++++++++++++++++------------ 1 file changed, 34 insertions(+), 16 deletions(-) diff --git a/doc/src/Howto_lammps_gui.rst b/doc/src/Howto_lammps_gui.rst index 4492a13915..0b5237d1f6 100644 --- a/doc/src/Howto_lammps_gui.rst +++ b/doc/src/Howto_lammps_gui.rst @@ -172,17 +172,19 @@ be seen in the command line window, as shown below. LAMMPS GUI captures the screen output as it is generated and updates the log window regularly during a run. -By default, there will be a new window for each run, so that it is -possible to visually compare outputs from different runs. It is also -possible to change the behavior of LAMMPS GUI in the preferences dialog -to *replace* an existing log window for a new run or to not show the log -window by default. It is also possible to show or hide the current log -window from the ``View`` menu. +By default, the log window will be replaced each time a run is started. +The runs are counted and the run number for the current run is displayed +in the window title. It is possible to change the behavior of LAMMPS +GUI in the preferences dialog to create a *new* log window for every run +or to not show the current log window. It is also possible to show or +hide the *current* log window from the ``View`` menu. The text in the log window is read-only and cannot be modified, but -editor commands to select and copy all or parts of the text can be used. -The "Select All" and "Copy" functions are also available via a context -menu by clicking with the right mouse button. +editor hotkeys to select and copy all or parts of the text can be used +to transfer text to another editor program. The "Select All" and "Copy" +functions, as well as a "Save Log to File" option are also available via +a context menu by clicking with the right mouse button into the log +window text area. Chart Window ------------ @@ -199,10 +201,16 @@ The drop down menu on the top right allows selection of different properties that are computed and written to thermo output. Only one property can be shown at a time. The plots will be updated with new data as the run progresses, so they can be used to visually monitor the -evolution of available properties. From the ``File`` menu on the top -left, it is possible to save an image of the currently displayed plot or -export the data in either plain text columns (for use by plotting tools -like `gnuplot `_ or `grace +evolution of available properties. The window title will show the +current run number that this chart window corresponds to. Same as +explained for the log window above, by default, the chart window will +be replaced on each new run, but the behavior can be changed in the +preferences dialog. + +From the ``File`` menu on the top left, it is possible to save an image +of the currently displayed plot or export the data in either plain text +columns (for use by plotting tools like `gnuplot +`_ or `grace `_), or as CSV data which can be imported for further processing with Microsoft Excel or `pandas `_ @@ -230,8 +238,7 @@ stepping through the sequence of images or playing an animation (as a continuous loop or once from first to last). It is also possible to zoom in or zoom out of the displayed images, and to export the slide show animation to a movie file, if `ffmpeg `_ is -installed. The slide show window will be closed when a new file is -loaded. +installed. Variable Info ------------- @@ -252,6 +259,17 @@ during a run. It will show "(none)" if there are no variables defined. Note that it is also possible to *set* :doc:`index style variables `, that would normally be set via command line flags, via the "Set Variables..." dialog from the ``Run`` menu. +LAMMPS GUI will automatically set the variable "gui_run" to the +current value of the run counter. That way it would be possible +to automatically record a log for each run attempt by using the +command + +.. code-block:: LAMMPS + + log logfile-${gui_run}.txt + +at the beginning of an input file. That would record logs to files +``logfile-1.txt``, ``logfile-2.txt``, and so on for successive runs. Viewing Snapshot Images ----------------------- @@ -518,7 +536,7 @@ General Settings: - *Replace image window on new render:* when checked, an existing chart window will be replaced when a new snapshot image is requested, otherwise each command will create a new image window. -- *Path to LAMMPS Shared Library File:* this options is only available +- *Path to LAMMPS Shared Library File:* this option is only visible when LAMMPS GUI was compiled to load the LAMMPS library at run time instead of being linked to it directly. With the ``Browse..`` button or by changing the text, a different shared library file with a From 77d0475fb7ba2910189612a30867cdb2bf29a85b Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 1 Oct 2023 11:46:16 -0400 Subject: [PATCH 102/219] update TODO file --- tools/lammps-gui/TODO.md | 17 +++++++++++++++++ tools/lammps-gui/lammpsgui.cpp | 2 +- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/tools/lammps-gui/TODO.md b/tools/lammps-gui/TODO.md index 8f752ac43a..e4ca44ba3d 100644 --- a/tools/lammps-gui/TODO.md +++ b/tools/lammps-gui/TODO.md @@ -3,6 +3,23 @@ LAMMPS-GUI TODO list: # Short term goals (v1.x) - implement indenting regions for (nested) loops? +- implement data file manager GUI with the following features: + - import coordinates and topology via VMD molfile plugins + - import coordinates and topology from intermol + - import coordinates and topology from OpenBabel + - store data internally in a generalized YAML format + - add/remove columns to per-atom data + - change atom style for export to data file + - merge one system to another + - edit mapping between numeric and symbolic types. create labelmaps. + - import/export LAMMPS data and molecule files + - store coordinates internally as unwrapped coordinates + - recenter coordinates + - edit box boundaries + - readjust box to extent of atoms (with or without estimated radius) + - call to LAMMPS to create geometries from lattices (with/without molecule files) and STL files + - call to LAMMPS to generate visualizations of geometries + - edit force field parameters, e.g. apply charmm # Long term ideas (v2.x) - rewrite entire application to build the App and its layout manually diff --git a/tools/lammps-gui/lammpsgui.cpp b/tools/lammps-gui/lammpsgui.cpp index c7f41555b5..08851da4ca 100644 --- a/tools/lammps-gui/lammpsgui.cpp +++ b/tools/lammps-gui/lammpsgui.cpp @@ -176,7 +176,7 @@ LammpsGui::LammpsGui(QWidget *parent, const char *filename) : update_recents(); - // check if we have OVITO and VMD installed and deacivate actions if not + // check if we have OVITO and VMD installed and deactivate actions if not ui->actionView_in_OVITO->setEnabled(has_exe("ovito")); ui->actionView_in_OVITO->setData("ovito"); ui->actionView_in_VMD->setEnabled(has_exe("vmd")); From 5db01aa98921cc0ae9034c18775e62d3b026f460 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 2 Oct 2023 18:19:27 -0400 Subject: [PATCH 103/219] BUGFIX: correctly render the currently selected chart when exporting to image files --- tools/lammps-gui/chartviewer.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tools/lammps-gui/chartviewer.cpp b/tools/lammps-gui/chartviewer.cpp index 34893b75e8..e6a58ec98d 100644 --- a/tools/lammps-gui/chartviewer.cpp +++ b/tools/lammps-gui/chartviewer.cpp @@ -103,7 +103,10 @@ void ChartWindow::saveAs() QString fileName = QFileDialog::getSaveFileName(this, "Save Chart as Image", defaultname, "Image Files (*.jpg *.png *.bmp *.ppm)"); if (!fileName.isEmpty()) { - charts[active_chart]->grab().save(fileName); + int choice = columns->currentData().toInt(); + for (auto &c : charts) { + if (choice == c->get_index()) c->grab().save(fileName); + } } } From 37c1bfafa3afd489fa2656add3e477627a08e4dd Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 2 Oct 2023 18:30:47 -0400 Subject: [PATCH 104/219] remove unused class member --- tools/lammps-gui/chartviewer.cpp | 14 +++++--------- tools/lammps-gui/chartviewer.h | 1 - 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/tools/lammps-gui/chartviewer.cpp b/tools/lammps-gui/chartviewer.cpp index e6a58ec98d..d018ffe32d 100644 --- a/tools/lammps-gui/chartviewer.cpp +++ b/tools/lammps-gui/chartviewer.cpp @@ -22,8 +22,7 @@ using namespace QtCharts; ChartWindow::ChartWindow(const QString &_filename, QWidget *parent) : - QWidget(parent), menu(new QMenuBar), file(new QMenu("&File")), filename(_filename), - active_chart(-1) + QWidget(parent), menu(new QMenuBar), file(new QMenu("&File")), filename(_filename) { auto *top = new QHBoxLayout; menu->addMenu(file); @@ -74,7 +73,6 @@ void ChartWindow::reset_charts() } charts.clear(); columns->clear(); - active_chart = 0; } void ChartWindow::add_chart(const QString &title, int index) @@ -86,7 +84,6 @@ void ChartWindow::add_chart(const QString &title, int index) // hide all but the first chart added if (charts.size() > 0) chart->hide(); charts.append(chart); - active_chart = 0; } void ChartWindow::add_data(int step, double data, int index) @@ -97,22 +94,21 @@ void ChartWindow::add_data(int step, double data, int index) void ChartWindow::saveAs() { - if (charts.empty() || (active_chart < 0)) return; + if (charts.empty()) return; QString defaultname = filename + "." + columns->currentText() + ".png"; if (filename.isEmpty()) defaultname = columns->currentText() + ".png"; QString fileName = QFileDialog::getSaveFileName(this, "Save Chart as Image", defaultname, "Image Files (*.jpg *.png *.bmp *.ppm)"); if (!fileName.isEmpty()) { int choice = columns->currentData().toInt(); - for (auto &c : charts) { + for (auto &c : charts) if (choice == c->get_index()) c->grab().save(fileName); - } } } void ChartWindow::exportDat() { - if (charts.empty() || (active_chart < 0)) return; + if (charts.empty()) return; QString defaultname = filename + ".dat"; if (filename.isEmpty()) defaultname = "lammpsdata.dat"; QString fileName = QFileDialog::getSaveFileName(this, "Save Chart as Gnuplot data", defaultname, @@ -147,7 +143,7 @@ void ChartWindow::exportDat() void ChartWindow::exportCsv() { - if (charts.empty() || (active_chart < 0)) return; + if (charts.empty()) return; QString defaultname = filename + ".csv"; if (filename.isEmpty()) defaultname = "lammpsdata.csv"; QString fileName = QFileDialog::getSaveFileName(this, "Save Chart as CSV data", defaultname, diff --git a/tools/lammps-gui/chartviewer.h b/tools/lammps-gui/chartviewer.h index 22f52a82d6..cdbc05ad52 100644 --- a/tools/lammps-gui/chartviewer.h +++ b/tools/lammps-gui/chartviewer.h @@ -61,7 +61,6 @@ private: QAction *closeAct; QString filename; - int active_chart; QList charts; }; From b5dae4024af34b5749cacd990639cd54007698a5 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 3 Oct 2023 12:02:56 -0400 Subject: [PATCH 105/219] tweak output format for gnuplot data export --- tools/lammps-gui/chartviewer.cpp | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/tools/lammps-gui/chartviewer.cpp b/tools/lammps-gui/chartviewer.cpp index d018ffe32d..a58aa8719b 100644 --- a/tools/lammps-gui/chartviewer.cpp +++ b/tools/lammps-gui/chartviewer.cpp @@ -116,25 +116,24 @@ void ChartWindow::exportDat() if (!fileName.isEmpty()) { QFile file(fileName); if (file.open(QIODevice::WriteOnly | QIODevice::Text)) { + QTextStream out(&file); + constexpr int fw = 16; + out.setFieldAlignment(QTextStream::AlignRight); + out.setRealNumberPrecision(8); - file.write("# Thermodynamic data from "); - file.write(filename.toLocal8Bit()); - file.write("\n# Columns:"); - for (auto &c : charts) { - file.write(" "); - file.write(c->get_title()); - } - file.write("\n"); + out << "# Thermodynamic data from " << filename << "\n"; + out << "# Step"; + for (auto &c : charts) + out << qSetFieldWidth(0) << ' ' << qSetFieldWidth(fw) << c->get_title(); + out << qSetFieldWidth(0) << '\n'; int lines = charts[0]->get_count(); for (int i = 0; i < lines; ++i) { // timestep - file.write(QString::number(charts[0]->get_step(i)).toLocal8Bit()); - for (auto &c : charts) { - file.write(" "); - file.write(QString::number(c->get_data(i)).toLocal8Bit()); - } - file.write("\n"); + out << qSetFieldWidth(0) << ' ' << qSetFieldWidth(fw) << charts[0]->get_step(i); + for (auto &c : charts) + out << qSetFieldWidth(0) << ' ' << qSetFieldWidth(fw) << c->get_data(i); + out << qSetFieldWidth(0) << '\n'; } file.close(); } From e840d422efb937ab2bef3db0de971149a0bde4e5 Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Tue, 3 Oct 2023 10:07:41 -0600 Subject: [PATCH 106/219] Use a_f to be consistent --- src/KOKKOS/pair_kokkos.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/KOKKOS/pair_kokkos.h b/src/KOKKOS/pair_kokkos.h index 2c2a622791..6f48aa0266 100644 --- a/src/KOKKOS/pair_kokkos.h +++ b/src/KOKKOS/pair_kokkos.h @@ -138,9 +138,9 @@ struct PairComputeFunctor { F_FLOAT fztmp = 0.0; if (NEIGHFLAG == FULL) { - f(i,0) = 0.0; - f(i,1) = 0.0; - f(i,2) = 0.0; + a_f(i,0) = 0.0; + a_f(i,1) = 0.0; + a_f(i,2) = 0.0; } for (int jj = 0; jj < jnum; jj++) { @@ -212,9 +212,9 @@ struct PairComputeFunctor { F_FLOAT fztmp = 0.0; if (NEIGHFLAG == FULL) { - f(i,0) = 0.0; - f(i,1) = 0.0; - f(i,2) = 0.0; + a_f(i,0) = 0.0; + a_f(i,1) = 0.0; + a_f(i,2) = 0.0; } for (int jj = 0; jj < jnum; jj++) { From 367d0ac90518d751af2d872e9cde355c7cef7f22 Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Tue, 3 Oct 2023 10:07:52 -0600 Subject: [PATCH 107/219] Add support for FLUX --- src/KOKKOS/kokkos.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/KOKKOS/kokkos.cpp b/src/KOKKOS/kokkos.cpp index 91ea6d37ac..b611502f74 100644 --- a/src/KOKKOS/kokkos.cpp +++ b/src/KOKKOS/kokkos.cpp @@ -175,6 +175,14 @@ KokkosLMP::KokkosLMP(LAMMPS *lmp, int narg, char **arg) : Pointers(lmp) set_flag = 1; } } + if ((str = getenv("FLUX_TASK_LOCAL_ID"))) { + if (ngpus > 0) { + int local_rank = atoi(str); + device = local_rank % ngpus; + if (device >= skip_gpu) device++; + set_flag = 1; + } + } if (ngpus > 1 && !set_flag) error->all(FLERR,"Could not determine local MPI rank for multiple " From 918705ce2fd1a3ac08b34a0f1b5db9a77ee540b4 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 3 Oct 2023 12:10:44 -0400 Subject: [PATCH 108/219] refactor CSV format output --- tools/lammps-gui/chartviewer.cpp | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/tools/lammps-gui/chartviewer.cpp b/tools/lammps-gui/chartviewer.cpp index a58aa8719b..7dcb98e5be 100644 --- a/tools/lammps-gui/chartviewer.cpp +++ b/tools/lammps-gui/chartviewer.cpp @@ -150,23 +150,21 @@ void ChartWindow::exportCsv() if (!fileName.isEmpty()) { QFile file(fileName); if (file.open(QIODevice::WriteOnly | QIODevice::Text)) { + QTextStream out(&file); + out.setRealNumberPrecision(8); - file.write("Step"); - for (auto &c : charts) { - file.write(","); - file.write(c->get_title()); - } - file.write("\n"); + out << "Step"; + for (auto &c : charts) + out << ',' << c->get_title(); + out << '\n'; int lines = charts[0]->get_count(); for (int i = 0; i < lines; ++i) { // timestep - file.write(QString::number(charts[0]->get_step(i)).toLocal8Bit()); - for (auto &c : charts) { - file.write(","); - file.write(QString::number(c->get_data(i)).toLocal8Bit()); - } - file.write("\n"); + out << charts[0]->get_step(i); + for (auto &c : charts) + out << ',' << c->get_data(i); + out << '\n'; } file.close(); } From ff23da1c9725695cbe8f5429a6f213b96208cead Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Tue, 3 Oct 2023 10:28:08 -0600 Subject: [PATCH 109/219] Switch order --- src/KOKKOS/kokkos.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/KOKKOS/kokkos.cpp b/src/KOKKOS/kokkos.cpp index b611502f74..84a8f59dd0 100644 --- a/src/KOKKOS/kokkos.cpp +++ b/src/KOKKOS/kokkos.cpp @@ -137,13 +137,13 @@ KokkosLMP::KokkosLMP(LAMMPS *lmp, int narg, char **arg) : Pointers(lmp) int set_flag = 0; char *str; - if ((str = getenv("SLURM_LOCALID"))) { + if (str = getenv("SLURM_LOCALID")) { int local_rank = atoi(str); device = local_rank % ngpus; if (device >= skip_gpu) device++; set_flag = 1; } - if ((str = getenv("MPT_LRANK"))) { + if (str = getenv("FLUX_TASK_LOCAL_ID")) { if (ngpus > 0) { int local_rank = atoi(str); device = local_rank % ngpus; @@ -151,7 +151,7 @@ KokkosLMP::KokkosLMP(LAMMPS *lmp, int narg, char **arg) : Pointers(lmp) set_flag = 1; } } - if ((str = getenv("MV2_COMM_WORLD_LOCAL_RANK"))) { + if (str = getenv("MPT_LRANK")) { if (ngpus > 0) { int local_rank = atoi(str); device = local_rank % ngpus; @@ -159,7 +159,7 @@ KokkosLMP::KokkosLMP(LAMMPS *lmp, int narg, char **arg) : Pointers(lmp) set_flag = 1; } } - if ((str = getenv("OMPI_COMM_WORLD_LOCAL_RANK"))) { + if (str = getenv("MV2_COMM_WORLD_LOCAL_RANK")) { if (ngpus > 0) { int local_rank = atoi(str); device = local_rank % ngpus; @@ -167,7 +167,7 @@ KokkosLMP::KokkosLMP(LAMMPS *lmp, int narg, char **arg) : Pointers(lmp) set_flag = 1; } } - if ((str = getenv("PMI_LOCAL_RANK"))) { + if (str = getenv("OMPI_COMM_WORLD_LOCAL_RANK")) { if (ngpus > 0) { int local_rank = atoi(str); device = local_rank % ngpus; @@ -175,7 +175,7 @@ KokkosLMP::KokkosLMP(LAMMPS *lmp, int narg, char **arg) : Pointers(lmp) set_flag = 1; } } - if ((str = getenv("FLUX_TASK_LOCAL_ID"))) { + if (str = getenv("PMI_LOCAL_RANK")) { if (ngpus > 0) { int local_rank = atoi(str); device = local_rank % ngpus; From c521d54f85c2aaef9e937cabbc19e60bb8154452 Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Tue, 3 Oct 2023 10:58:22 -0600 Subject: [PATCH 110/219] Fix compile error --- src/KOKKOS/pair_kokkos.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/KOKKOS/pair_kokkos.h b/src/KOKKOS/pair_kokkos.h index 6f48aa0266..da6bd11006 100644 --- a/src/KOKKOS/pair_kokkos.h +++ b/src/KOKKOS/pair_kokkos.h @@ -138,9 +138,9 @@ struct PairComputeFunctor { F_FLOAT fztmp = 0.0; if (NEIGHFLAG == FULL) { - a_f(i,0) = 0.0; - a_f(i,1) = 0.0; - a_f(i,2) = 0.0; + a_f(i,0) -= f(i,0); + a_f(i,1) -= f(i,1); + a_f(i,2) -= f(i,2); } for (int jj = 0; jj < jnum; jj++) { @@ -212,9 +212,9 @@ struct PairComputeFunctor { F_FLOAT fztmp = 0.0; if (NEIGHFLAG == FULL) { - a_f(i,0) = 0.0; - a_f(i,1) = 0.0; - a_f(i,2) = 0.0; + a_f(i,0) -= f(i,0); + a_f(i,1) -= f(i,1); + a_f(i,2) -= f(i,2); } for (int jj = 0; jj < jnum; jj++) { From f57e5d975c8e72e0a2a6e9c01cc2135ca4428ee0 Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Tue, 3 Oct 2023 12:07:28 -0600 Subject: [PATCH 111/219] Fix harmless compiler warnings --- src/KOKKOS/pair_eam_alloy_kokkos.cpp | 4 ++-- src/KOKKOS/pair_eam_fs_kokkos.cpp | 4 ++-- src/KOKKOS/pair_eam_kokkos.cpp | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/KOKKOS/pair_eam_alloy_kokkos.cpp b/src/KOKKOS/pair_eam_alloy_kokkos.cpp index 5cc6fa9443..0dfe56c365 100644 --- a/src/KOKKOS/pair_eam_alloy_kokkos.cpp +++ b/src/KOKKOS/pair_eam_alloy_kokkos.cpp @@ -1477,7 +1477,7 @@ void PairEAMAlloyKokkos::file2array_alloy() template template struct PairEAMAlloyKokkos::policyInstance { - KOKKOS_INLINE_FUNCTION + static auto get(int inum) { auto policy = Kokkos::RangePolicy(0,inum); return policy; @@ -1488,7 +1488,7 @@ struct PairEAMAlloyKokkos::policyInstance { template<> template struct PairEAMAlloyKokkos::policyInstance { - KOKKOS_INLINE_FUNCTION + static auto get(int inum) { static_assert(t_ffloat_2d_n7::static_extent(2) == 7, "Breaking assumption of spline dim for KernelAB and KernelC scratch caching"); diff --git a/src/KOKKOS/pair_eam_fs_kokkos.cpp b/src/KOKKOS/pair_eam_fs_kokkos.cpp index 8e895dfeac..58ff615c04 100644 --- a/src/KOKKOS/pair_eam_fs_kokkos.cpp +++ b/src/KOKKOS/pair_eam_fs_kokkos.cpp @@ -1487,7 +1487,7 @@ void PairEAMFSKokkos::file2array_fs() template template struct PairEAMFSKokkos::policyInstance { - KOKKOS_INLINE_FUNCTION + static auto get(int inum) { auto policy = Kokkos::RangePolicy(0,inum); return policy; @@ -1498,7 +1498,7 @@ struct PairEAMFSKokkos::policyInstance { template<> template struct PairEAMFSKokkos::policyInstance { - KOKKOS_INLINE_FUNCTION + static auto get(int inum) { static_assert(t_ffloat_2d_n7::static_extent(2) == 7, "Breaking assumption of spline dim for KernelAB and KernelC scratch caching"); diff --git a/src/KOKKOS/pair_eam_kokkos.cpp b/src/KOKKOS/pair_eam_kokkos.cpp index a3bc463bbf..864f736066 100644 --- a/src/KOKKOS/pair_eam_kokkos.cpp +++ b/src/KOKKOS/pair_eam_kokkos.cpp @@ -1162,7 +1162,7 @@ void PairEAMKokkos::ev_tally(EV_FLOAT &ev, const int &i, const int & template template struct PairEAMKokkos::policyInstance { - KOKKOS_INLINE_FUNCTION + static auto get(int inum) { auto policy = Kokkos::RangePolicy(0,inum); return policy; @@ -1173,7 +1173,7 @@ struct PairEAMKokkos::policyInstance { template<> template struct PairEAMKokkos::policyInstance { - KOKKOS_INLINE_FUNCTION + static auto get(int inum) { static_assert(t_ffloat_2d_n7::static_extent(2) == 7, "Breaking assumption of spline dim for KernelAB and KernelC scratch caching"); From 4bbaebda16fe9fb1f26952230b19855124a1f368 Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Tue, 3 Oct 2023 12:09:23 -0600 Subject: [PATCH 112/219] Revert ineffectual change --- src/KOKKOS/pair_kokkos.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/KOKKOS/pair_kokkos.h b/src/KOKKOS/pair_kokkos.h index da6bd11006..2c2a622791 100644 --- a/src/KOKKOS/pair_kokkos.h +++ b/src/KOKKOS/pair_kokkos.h @@ -138,9 +138,9 @@ struct PairComputeFunctor { F_FLOAT fztmp = 0.0; if (NEIGHFLAG == FULL) { - a_f(i,0) -= f(i,0); - a_f(i,1) -= f(i,1); - a_f(i,2) -= f(i,2); + f(i,0) = 0.0; + f(i,1) = 0.0; + f(i,2) = 0.0; } for (int jj = 0; jj < jnum; jj++) { @@ -212,9 +212,9 @@ struct PairComputeFunctor { F_FLOAT fztmp = 0.0; if (NEIGHFLAG == FULL) { - a_f(i,0) -= f(i,0); - a_f(i,1) -= f(i,1); - a_f(i,2) -= f(i,2); + f(i,0) = 0.0; + f(i,1) = 0.0; + f(i,2) = 0.0; } for (int jj = 0; jj < jnum; jj++) { From bb01afc498db52f531471d2379d565e34c73d40b Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 3 Oct 2023 14:15:23 -0400 Subject: [PATCH 113/219] provide default file name when writing log window text to file --- tools/lammps-gui/lammpsgui.cpp | 2 +- tools/lammps-gui/logwindow.cpp | 16 ++++++++++++---- tools/lammps-gui/logwindow.h | 5 ++++- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/tools/lammps-gui/lammpsgui.cpp b/tools/lammps-gui/lammpsgui.cpp index 08851da4ca..cdfb9ab850 100644 --- a/tools/lammps-gui/lammpsgui.cpp +++ b/tools/lammps-gui/lammpsgui.cpp @@ -1021,7 +1021,7 @@ void LammpsGui::do_run(bool use_buffer) // if configured, delete old log window before opening new one if (settings.value("logreplace", true).toBool()) delete logwindow; - logwindow = new LogWindow(); + logwindow = new LogWindow(current_file); logwindow->setReadOnly(true); logwindow->setCenterOnScroll(true); logwindow->moveCursor(QTextCursor::End); diff --git a/tools/lammps-gui/logwindow.cpp b/tools/lammps-gui/logwindow.cpp index 4b008ce5ca..9667950be5 100644 --- a/tools/lammps-gui/logwindow.cpp +++ b/tools/lammps-gui/logwindow.cpp @@ -18,13 +18,15 @@ #include #include #include +#include #include #include #include #include #include -LogWindow::LogWindow(QWidget *parent) : QPlainTextEdit(parent) +LogWindow::LogWindow(const QString &_filename, QWidget *parent) : + QPlainTextEdit(parent), filename(_filename) { QSettings settings; resize(settings.value("logx", 500).toInt(), settings.value("logy", 320).toInt()); @@ -42,10 +44,13 @@ void LogWindow::closeEvent(QCloseEvent *event) void LogWindow::save_as() { - QString fileName = QFileDialog::getSaveFileName(this, "Save Log to File"); - if (fileName.isEmpty()) return; + QString defaultname = filename + ".log"; + if (filename.isEmpty()) defaultname = "lammps.log"; + QString logFileName = QFileDialog::getSaveFileName(this, "Save Log to File", defaultname, + "Log files (*.log *.out *.txt)"); + if (logFileName.isEmpty()) return; - QFileInfo path(fileName); + QFileInfo path(logFileName); QFile file(path.absoluteFilePath()); if (!file.open(QIODevice::WriteOnly | QFile::Text)) { @@ -68,6 +73,9 @@ void LogWindow::contextMenuEvent(QContextMenuEvent *event) auto action = menu->addAction(QString("Save Log to File ...")); action->setIcon(QIcon(":/icons/document-save-as.png")); connect(action, &QAction::triggered, this, &LogWindow::save_as); + action = menu->addAction("&Close Window", this, &QWidget::close); + action->setIcon(QIcon(":/icons/window-close.png")); + action->setShortcut(QKeySequence::fromString("Ctrl+W")); menu->exec(event->globalPos()); delete menu; } diff --git a/tools/lammps-gui/logwindow.h b/tools/lammps-gui/logwindow.h index 4765b2faa7..5f43850655 100644 --- a/tools/lammps-gui/logwindow.h +++ b/tools/lammps-gui/logwindow.h @@ -20,7 +20,7 @@ class LogWindow : public QPlainTextEdit { Q_OBJECT public: - LogWindow(QWidget *parent = nullptr); + LogWindow(const QString &filename, QWidget *parent = nullptr); private slots: void save_as(); @@ -28,6 +28,9 @@ private slots: protected: void closeEvent(QCloseEvent *event) override; void contextMenuEvent(QContextMenuEvent *event) override; + +private: + QString filename; }; #endif From 5302e39f69c3606bf5646eff23ab46847b6a3156 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 3 Oct 2023 14:35:48 -0400 Subject: [PATCH 114/219] avoid segfaults when accessing lammps_last_thermo() --- src/library.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/library.cpp b/src/library.cpp index f89fdaebf0..7b0d8ef91b 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -858,14 +858,17 @@ void *lammps_last_thermo(void *handle, const char *what, int index) { auto lmp = (LAMMPS *) handle; void *val = nullptr; + + if (!lmp->output) return val; Thermo *th = lmp->output->thermo; - if (!th) return nullptr; + if (!th) return val; const int nfield = *th->get_nfield(); BEGIN_CAPTURE { if (strcmp(what, "setup") == 0) { - val = (void *) &lmp->update->setupflag; + if (lmp->update) + val = (void *) &lmp->update->setupflag; } else if (strcmp(what, "line") == 0) { val = (void *) th->get_line(); From 18a69873f89fd5474684a2fd2b8b355e1d23e569 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 3 Oct 2023 15:23:52 -0400 Subject: [PATCH 115/219] add keyboard shortcut for saving log to file --- tools/lammps-gui/logwindow.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tools/lammps-gui/logwindow.cpp b/tools/lammps-gui/logwindow.cpp index 9667950be5..7a4d215317 100644 --- a/tools/lammps-gui/logwindow.cpp +++ b/tools/lammps-gui/logwindow.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include #include @@ -30,6 +31,9 @@ LogWindow::LogWindow(const QString &_filename, QWidget *parent) : { QSettings settings; resize(settings.value("logx", 500).toInt(), settings.value("logy", 320).toInt()); + + auto action = new QShortcut(QKeySequence("Ctrl+S"), this); + connect(action, &QShortcut::activated, this, &LogWindow::save_as); } void LogWindow::closeEvent(QCloseEvent *event) @@ -47,7 +51,7 @@ void LogWindow::save_as() QString defaultname = filename + ".log"; if (filename.isEmpty()) defaultname = "lammps.log"; QString logFileName = QFileDialog::getSaveFileName(this, "Save Log to File", defaultname, - "Log files (*.log *.out *.txt)"); + "Log files (*.log *.out *.txt)"); if (logFileName.isEmpty()) return; QFileInfo path(logFileName); @@ -72,6 +76,7 @@ void LogWindow::contextMenuEvent(QContextMenuEvent *event) menu->addSeparator(); auto action = menu->addAction(QString("Save Log to File ...")); action->setIcon(QIcon(":/icons/document-save-as.png")); + action->setShortcut(QKeySequence::fromString("Ctrl+S")); connect(action, &QAction::triggered, this, &LogWindow::save_as); action = menu->addAction("&Close Window", this, &QWidget::close); action->setIcon(QIcon(":/icons/window-close.png")); From 6da8fff08c68f4f21e329751ce184fe3d515aede Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Tue, 3 Oct 2023 13:35:50 -0600 Subject: [PATCH 116/219] Fix bug with dynamic groups --- src/KOKKOS/modify_kokkos.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/KOKKOS/modify_kokkos.cpp b/src/KOKKOS/modify_kokkos.cpp index 0b81a1cabb..8d8ffca671 100644 --- a/src/KOKKOS/modify_kokkos.cpp +++ b/src/KOKKOS/modify_kokkos.cpp @@ -362,6 +362,17 @@ void ModifyKokkos::pre_reverse(int eflag, int vflag) void ModifyKokkos::post_force(int vflag) { + for (int i = 0; i < n_post_force_group; i++) { + atomKK->sync(fix[list_post_force_group[i]]->execution_space, + fix[list_post_force_group[i]]->datamask_read); + int prev_auto_sync = lmp->kokkos->auto_sync; + if (!fix[list_post_force_group[i]]->kokkosable) lmp->kokkos->auto_sync = 1; + fix[list_post_force_group[i]]->post_force(vflag); + lmp->kokkos->auto_sync = prev_auto_sync; + atomKK->modified(fix[list_post_force_group[i]]->execution_space, + fix[list_post_force_group[i]]->datamask_modify); + } + for (int i = 0; i < n_post_force; i++) { atomKK->sync(fix[list_post_force[i]]->execution_space, fix[list_post_force[i]]->datamask_read); From 75050b8920842e5ac451d42972a99ab05b87ec01 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 3 Oct 2023 15:40:06 -0400 Subject: [PATCH 117/219] get upper thread limit from Qt so we can raise the number of threads --- tools/lammps-gui/preferences.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tools/lammps-gui/preferences.cpp b/tools/lammps-gui/preferences.cpp index 1e8e23ad62..624f59009c 100644 --- a/tools/lammps-gui/preferences.cpp +++ b/tools/lammps-gui/preferences.cpp @@ -41,6 +41,7 @@ #include #include #include +#include #if defined(_OPENMP) #include @@ -400,11 +401,11 @@ AcceleratorTab::AcceleratorTab(QSettings *_settings, LammpsWrapper *_lammps, QWi int maxthreads = 1; #if defined(_OPENMP) - maxthreads = omp_get_max_threads(); + maxthreads = QThread::idealThreadCount(); #endif auto *choices = new QFrame; auto *choiceLayout = new QVBoxLayout; - auto *ntlabel = new QLabel("Number of threads:"); + auto *ntlabel = new QLabel(QString("Number of threads (max %1):").arg(maxthreads)); auto *ntchoice = new QLineEdit(settings->value("nthreads", maxthreads).toString()); auto *intval = new QIntValidator(1, maxthreads, this); ntchoice->setValidator(intval); From 6a43ca8410ba995fd9fbe5baff495bff9f53e314 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 3 Oct 2023 16:13:59 -0400 Subject: [PATCH 118/219] reset number of threads to 1 when using no accelerator or opt --- tools/lammps-gui/lammpsgui.cpp | 2 ++ tools/lammps-gui/preferences.cpp | 13 +++++++++---- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/tools/lammps-gui/lammpsgui.cpp b/tools/lammps-gui/lammpsgui.cpp index cdfb9ab850..73ff530b5c 100644 --- a/tools/lammps-gui/lammpsgui.cpp +++ b/tools/lammps-gui/lammpsgui.cpp @@ -508,6 +508,8 @@ void LammpsGui::update_variables() for (const auto &line : doc) { + if (line.isEmpty()) continue; + // first find variable definitions. // index variables are special since they can be overridden from the command line auto index = indexvar.match(line); diff --git a/tools/lammps-gui/preferences.cpp b/tools/lammps-gui/preferences.cpp index 624f59009c..aa192e8c11 100644 --- a/tools/lammps-gui/preferences.cpp +++ b/tools/lammps-gui/preferences.cpp @@ -40,8 +40,8 @@ #include #include #include -#include #include +#include #if defined(_OPENMP) #include @@ -110,10 +110,15 @@ void Preferences::accept() } } - // store number of threads + // store number of threads, reset to 1 for "None" and "Opt" settings QLineEdit *field = tabWidget->findChild("nthreads"); - if (field) - if (field->hasAcceptableInput()) settings->setValue("nthreads", field->text()); + if (field) { + int accel = settings->value("accelerator", AcceleratorTab::None).toInt(); + if ((accel == AcceleratorTab::None) || (accel == AcceleratorTab::Opt)) + settings->setValue("nthreads", 1); + else if (field->hasAcceptableInput()) + settings->setValue("nthreads", field->text()); + } // store image width, height, zoom, and rendering settings From f9f33ce1b6a25df18b7c1613727771ee16e8fb97 Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Tue, 3 Oct 2023 15:41:35 -0600 Subject: [PATCH 119/219] Fix issues with Kokkos fix property/atom --- src/KOKKOS/fix_property_atom_kokkos.cpp | 40 ++++++++++++++++++++----- src/KOKKOS/fix_property_atom_kokkos.h | 1 + 2 files changed, 34 insertions(+), 7 deletions(-) diff --git a/src/KOKKOS/fix_property_atom_kokkos.cpp b/src/KOKKOS/fix_property_atom_kokkos.cpp index 1de07b39dc..87325accda 100644 --- a/src/KOKKOS/fix_property_atom_kokkos.cpp +++ b/src/KOKKOS/fix_property_atom_kokkos.cpp @@ -33,6 +33,30 @@ FixPropertyAtomKokkos::FixPropertyAtomKokkos(LAMMPS *lmp, int narg, char **arg) grow_arrays(atom->nmax); } +/* ---------------------------------------------------------------------- */ + +FixPropertyAtomKokkos::~FixPropertyAtomKokkos() +{ + // deallocate per-atom vectors in Atom class + // set ptrs to a null pointer, so they no longer exist for Atom class + + for (int nv = 0; nv < nvalue; nv++) { + if (styles[nv] == MOLECULE) { + atom->molecule_flag = 0; + memoryKK->destroy_kokkos(atomKK->k_molecule,atom->molecule); + atom->molecule = nullptr; + } else if (styles[nv] == CHARGE) { + atom->q_flag = 0; + memoryKK->destroy_kokkos(atomKK->k_q,atom->q); + atom->q = nullptr; + } else if (styles[nv] == RMASS) { + atom->rmass_flag = 0; + memoryKK->destroy_kokkos(atomKK->k_rmass,atom->rmass); + atom->rmass = nullptr; + } + } +} + /* ---------------------------------------------------------------------- allocate atom-based arrays initialize new values to 0, @@ -44,17 +68,19 @@ void FixPropertyAtomKokkos::grow_arrays(int nmax) { for (int nv = 0; nv < nvalue; nv++) { if (styles[nv] == MOLECULE) { - memory->grow(atom->molecule,nmax,"atom:molecule"); + atomKK->sync(Device,MOLECULE_MASK); + memoryKK->grow_kokkos(atomKK->k_molecule,atomKK->molecule,nmax,"atom:molecule"); size_t nbytes = (nmax-nmax_old) * sizeof(tagint); - memset(&atom->molecule[nmax_old],0,nbytes); + atomKK->modified(Device,MOLECULE_MASK); } else if (styles[nv] == CHARGE) { - memory->grow(atom->q,nmax,"atom:q"); + atomKK->sync(Device,Q_MASK); + memoryKK->grow_kokkos(atomKK->k_q,atomKK->q,nmax,"atom:q"); size_t nbytes = (nmax-nmax_old) * sizeof(double); - memset(&atom->q[nmax_old],0,nbytes); + atomKK->modified(Device,Q_MASK); } else if (styles[nv] == RMASS) { - memory->grow(atom->rmass,nmax,"atom:rmass"); - size_t nbytes = (nmax-nmax_old) * sizeof(double); - memset(&atom->rmass[nmax_old],0,nbytes); + atomKK->sync(Device,MOLECULE_MASK); + memoryKK->grow_kokkos(atomKK->k_rmass,atomKK->rmass,nmax,"atom:rmass"); + atomKK->modified(Device,RMASS_MASK); } else if (styles[nv] == TEMPERATURE) { memory->grow(atom->temperature, nmax, "atom:temperature"); size_t nbytes = (nmax - nmax_old) * sizeof(double); diff --git a/src/KOKKOS/fix_property_atom_kokkos.h b/src/KOKKOS/fix_property_atom_kokkos.h index 90eddc98e0..29b07b1f5b 100644 --- a/src/KOKKOS/fix_property_atom_kokkos.h +++ b/src/KOKKOS/fix_property_atom_kokkos.h @@ -28,6 +28,7 @@ namespace LAMMPS_NS { class FixPropertyAtomKokkos : public FixPropertyAtom { public: FixPropertyAtomKokkos(class LAMMPS *, int, char **); + ~FixPropertyAtomKokkos() override; void grow_arrays(int) override; }; From b3008e332998d4629f7f4c09b778a8b7b15aba53 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 3 Oct 2023 17:49:44 -0400 Subject: [PATCH 120/219] fix delete / delete[] mismatch --- tools/lammps-gui/lammpsgui.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/lammps-gui/lammpsgui.cpp b/tools/lammps-gui/lammpsgui.cpp index 73ff530b5c..6995023593 100644 --- a/tools/lammps-gui/lammpsgui.cpp +++ b/tools/lammps-gui/lammpsgui.cpp @@ -1422,7 +1422,7 @@ void LammpsGui::start_lammps() // delete additional arguments again (3 were there initially while ((int)lammps_args.size() > initial_narg) { - delete lammps_args.back(); + delete[] lammps_args.back(); lammps_args.pop_back(); } From 02b9bdd639f24f5b993a896065468fa620032323 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 3 Oct 2023 17:49:55 -0400 Subject: [PATCH 121/219] fix uninitialized data access --- src/thermo.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/thermo.cpp b/src/thermo.cpp index 009c9cdf27..1c4e25dcb0 100644 --- a/src/thermo.cpp +++ b/src/thermo.cpp @@ -111,6 +111,7 @@ Thermo::Thermo(LAMMPS *_lmp, int narg, char **arg) : lostflag = lostbond = Thermo::ERROR; lostbefore = warnbefore = 0; flushflag = 0; + firststep = 0; ntimestep = -1; nline = -1; image_fname.clear(); From 6ff7050d2d3b7718612657bb7fe7c04b30fb40e2 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 3 Oct 2023 19:38:22 -0400 Subject: [PATCH 122/219] enforce that the number of threads is properly reset for /omp styles --- src/OPENMP/thr_omp.cpp | 7 +++++++ tools/lammps-gui/lammpsgui.cpp | 8 ++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/OPENMP/thr_omp.cpp b/src/OPENMP/thr_omp.cpp index c27a99028d..88344a900d 100644 --- a/src/OPENMP/thr_omp.cpp +++ b/src/OPENMP/thr_omp.cpp @@ -34,6 +34,10 @@ #include +#if defined(_OPENMP) +#include +#endif + using namespace LAMMPS_NS; using MathConst::THIRD; @@ -44,6 +48,9 @@ ThrOMP::ThrOMP(LAMMPS *ptr, int style) : lmp(ptr), fix(nullptr), thr_style(style // register fix omp with this class fix = static_cast(lmp->modify->get_fix_by_id("package_omp")); if (!fix) lmp->error->all(FLERR, "The 'package omp' command is required for /omp styles"); +#if defined(_OPENMP) + omp_set_num_threads(lmp->comm->nthreads); +#endif } // clang-format off diff --git a/tools/lammps-gui/lammpsgui.cpp b/tools/lammps-gui/lammpsgui.cpp index 6995023593..b6b590e855 100644 --- a/tools/lammps-gui/lammpsgui.cpp +++ b/tools/lammps-gui/lammpsgui.cpp @@ -1329,9 +1329,9 @@ void LammpsGui::preferences() // must delete LAMMPS instance after preferences have changed that require // using different command line flags when creating the LAMMPS instance like // suffixes or package commands + int newthreads = settings.value("nthreads", 1).toInt(); if ((oldaccel != settings.value("accelerator", AcceleratorTab::None).toInt()) || - (oldthreads != settings.value("nthreads", 1).toInt()) || - (oldecho != settings.value("echo", false).toBool()) || + (oldthreads != newthreads) || (oldecho != settings.value("echo", false).toBool()) || (oldcite != settings.value("cite", false).toBool())) { if (lammps.is_running()) { stop_run(); @@ -1340,6 +1340,10 @@ void LammpsGui::preferences() } lammps.close(); lammpsstatus->hide(); +#if defined(_OPENMP) + qputenv("OMP_NUM_THREADS", std::to_string(newthreads).c_str()); + omp_set_num_threads(newthreads); +#endif } if (imagewindow) imagewindow->createImage(); settings.beginGroup("reformat"); From a3c843f5901044795adecb2254c47d0079aea283 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 3 Oct 2023 21:13:06 -0400 Subject: [PATCH 123/219] add support for shortcuts CTRL-/ (stop run) and CTRL-Q (quit) to most windows --- tools/lammps-gui/CMakeLists.txt | 2 +- tools/lammps-gui/chartviewer.cpp | 24 ++++++++++++++++++++++++ tools/lammps-gui/chartviewer.h | 9 +++++---- tools/lammps-gui/imageviewer.cpp | 24 +++++++++++++++++------- tools/lammps-gui/imageviewer.h | 1 + tools/lammps-gui/lammpsgui.h | 6 ++++-- tools/lammps-gui/logwindow.cpp | 25 ++++++++++++++++++++++++- tools/lammps-gui/logwindow.h | 2 ++ tools/lammps-gui/slideshow.cpp | 26 ++++++++++++++++++++++++-- tools/lammps-gui/slideshow.h | 2 ++ 10 files changed, 104 insertions(+), 17 deletions(-) diff --git a/tools/lammps-gui/CMakeLists.txt b/tools/lammps-gui/CMakeLists.txt index ec21f9fac2..be7bcff10a 100644 --- a/tools/lammps-gui/CMakeLists.txt +++ b/tools/lammps-gui/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.16) -project(lammps-gui VERSION 1.5.7 LANGUAGES CXX) +project(lammps-gui VERSION 1.5.8 LANGUAGES CXX) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTOMOC ON) diff --git a/tools/lammps-gui/chartviewer.cpp b/tools/lammps-gui/chartviewer.cpp index 7dcb98e5be..94d938c473 100644 --- a/tools/lammps-gui/chartviewer.cpp +++ b/tools/lammps-gui/chartviewer.cpp @@ -13,6 +13,8 @@ #include "chartviewer.h" +#include "lammpsgui.h" + #include #include #include @@ -40,8 +42,14 @@ ChartWindow::ChartWindow(const QString &_filename, QWidget *parent) : exportDatAct = file->addAction("Export data to &Gnuplot...", this, &ChartWindow::exportDat); exportDatAct->setIcon(QIcon(":/icons/application-plot.png")); file->addSeparator(); + stopAct = file->addAction("Stop &Run", this, &ChartWindow::stop_run); + stopAct->setIcon(QIcon(":/icons/process-stop.png")); + stopAct->setShortcut(QKeySequence(Qt::Key_Slash, Qt::CTRL)); closeAct = file->addAction("&Close", this, &QWidget::close); closeAct->setIcon(QIcon(":/icons/window-close.png")); + quitAct = file->addAction("&Quit", this, &ChartWindow::quit); + quitAct->setIcon(QIcon(":/icons/application-exit.png")); + quitAct->setShortcut(QKeySequence::fromString("Ctrl+Q")); auto *layout = new QVBoxLayout; layout->addLayout(top); setLayout(layout); @@ -92,6 +100,22 @@ void ChartWindow::add_data(int step, double data, int index) if (c->get_index() == index) c->add_data(step, data); } +void ChartWindow::quit() +{ + LammpsGui *main; + for (QWidget *widget : QApplication::topLevelWidgets()) + if (widget->objectName() == "LammpsGui") main = dynamic_cast(widget); + main->quit(); +} + +void ChartWindow::stop_run() +{ + LammpsGui *main; + for (QWidget *widget : QApplication::topLevelWidgets()) + if (widget->objectName() == "LammpsGui") main = dynamic_cast(widget); + main->stop_run(); +} + void ChartWindow::saveAs() { if (charts.empty()) return; diff --git a/tools/lammps-gui/chartviewer.h b/tools/lammps-gui/chartviewer.h index cdbc05ad52..ffdb75cf7e 100644 --- a/tools/lammps-gui/chartviewer.h +++ b/tools/lammps-gui/chartviewer.h @@ -42,6 +42,9 @@ public: void add_data(int step, double data, int index); private slots: + void quit(); + void stop_run(); + void saveAs(); void exportDat(); void exportCsv(); @@ -55,10 +58,8 @@ private: QMenuBar *menu; QMenu *file; QComboBox *columns; - QAction *saveAsAct; - QAction *exportCsvAct; - QAction *exportDatAct; - QAction *closeAct; + QAction *saveAsAct, *exportCsvAct, *exportDatAct; + QAction *closeAct, *stopAct, *quitAct; QString filename; QList charts; diff --git a/tools/lammps-gui/imageviewer.cpp b/tools/lammps-gui/imageviewer.cpp index b73f8a4927..445ff16590 100644 --- a/tools/lammps-gui/imageviewer.cpp +++ b/tools/lammps-gui/imageviewer.cpp @@ -12,9 +12,12 @@ ------------------------------------------------------------------------- */ #include "imageviewer.h" + +#include "lammpsgui.h" #include "lammpswrapper.h" #include +#include #include #include #include @@ -510,15 +513,11 @@ void ImageViewer::createImage() QImageReader reader(dumpfile.fileName()); reader.setAutoTransform(true); const QImage newImage = reader.read(); - - if (newImage.isNull()) { - QMessageBox::warning( - this, QGuiApplication::applicationDisplayName(), - QString("Cannot load %1: %2").arg(dumpfile.fileName(), reader.errorString())); - return; - } dumpfile.remove(); + // read of new image failed. Don't try to scale and load it. + if (newImage.isNull()) return; + // scale back to achieve antialiasing image = newImage.scaled(xsize, ysize, Qt::IgnoreAspectRatio, Qt::SmoothTransformation); imageLabel->setPixmap(QPixmap::fromImage(image)); @@ -536,6 +535,14 @@ void ImageViewer::saveAs() void ImageViewer::copy() {} +void ImageViewer::quit() +{ + LammpsGui *main; + for (QWidget *widget : QApplication::topLevelWidgets()) + if (widget->objectName() == "LammpsGui") main = dynamic_cast(widget); + main->quit(); +} + void ImageViewer::saveFile(const QString &fileName) { if (!fileName.isEmpty()) image.save(fileName); @@ -557,6 +564,9 @@ void ImageViewer::createActions() QAction *exitAct = fileMenu->addAction("&Close", this, &QWidget::close); exitAct->setIcon(QIcon(":/icons/window-close.png")); exitAct->setShortcut(QKeySequence::fromString("Ctrl+W")); + QAction *quitAct = fileMenu->addAction("&Quit", this, &ImageViewer::quit); + quitAct->setIcon(QIcon(":/icons/application-exit.png")); + quitAct->setShortcut(QKeySequence::fromString("Ctrl+Q")); } void ImageViewer::updateActions() diff --git a/tools/lammps-gui/imageviewer.h b/tools/lammps-gui/imageviewer.h index 013a90249f..8946c6cc8b 100644 --- a/tools/lammps-gui/imageviewer.h +++ b/tools/lammps-gui/imageviewer.h @@ -40,6 +40,7 @@ public: private slots: void saveAs(); void copy(); + void quit(); void edit_size(); void reset_view(); diff --git a/tools/lammps-gui/lammpsgui.h b/tools/lammps-gui/lammpsgui.h index 0eab3a9705..0c622f0285 100644 --- a/tools/lammps-gui/lammpsgui.h +++ b/tools/lammps-gui/lammpsgui.h @@ -66,6 +66,10 @@ protected: void start_lammps(); void run_done(); +public slots: + void quit(); + void stop_run(); + private slots: void new_document(); void open(); @@ -73,7 +77,6 @@ private slots: void start_exe(); void save(); void save_as(); - void quit(); void copy(); void cut(); void paste(); @@ -82,7 +85,6 @@ private slots: void run_buffer() { do_run(true); } void run_file() { do_run(false); } - void stop_run(); void edit_variables(); void render_image(); void view_slides(); diff --git a/tools/lammps-gui/logwindow.cpp b/tools/lammps-gui/logwindow.cpp index 7a4d215317..ab1886f1bd 100644 --- a/tools/lammps-gui/logwindow.cpp +++ b/tools/lammps-gui/logwindow.cpp @@ -13,7 +13,10 @@ #include "logwindow.h" +#include "lammpsgui.h" + #include +#include #include #include #include @@ -32,8 +35,12 @@ LogWindow::LogWindow(const QString &_filename, QWidget *parent) : QSettings settings; resize(settings.value("logx", 500).toInt(), settings.value("logy", 320).toInt()); - auto action = new QShortcut(QKeySequence("Ctrl+S"), this); + auto action = new QShortcut(QKeySequence::fromString("Ctrl+S"), this); connect(action, &QShortcut::activated, this, &LogWindow::save_as); + action = new QShortcut(QKeySequence::fromString("Ctrl+Q"), this); + connect(action, &QShortcut::activated, this, &LogWindow::quit); + action = new QShortcut(QKeySequence(Qt::Key_Slash, Qt::CTRL), this); + connect(action, &QShortcut::activated, this, &LogWindow::stop_run); } void LogWindow::closeEvent(QCloseEvent *event) @@ -46,6 +53,22 @@ void LogWindow::closeEvent(QCloseEvent *event) QPlainTextEdit::closeEvent(event); } +void LogWindow::quit() +{ + LammpsGui *main; + for (QWidget *widget : QApplication::topLevelWidgets()) + if (widget->objectName() == "LammpsGui") main = dynamic_cast(widget); + main->quit(); +} + +void LogWindow::stop_run() +{ + LammpsGui *main; + for (QWidget *widget : QApplication::topLevelWidgets()) + if (widget->objectName() == "LammpsGui") main = dynamic_cast(widget); + main->stop_run(); +} + void LogWindow::save_as() { QString defaultname = filename + ".log"; diff --git a/tools/lammps-gui/logwindow.h b/tools/lammps-gui/logwindow.h index 5f43850655..8923e35ee5 100644 --- a/tools/lammps-gui/logwindow.h +++ b/tools/lammps-gui/logwindow.h @@ -23,7 +23,9 @@ public: LogWindow(const QString &filename, QWidget *parent = nullptr); private slots: + void quit(); void save_as(); + void stop_run(); protected: void closeEvent(QCloseEvent *event) override; diff --git a/tools/lammps-gui/slideshow.cpp b/tools/lammps-gui/slideshow.cpp index 68544040e6..de7742f22f 100644 --- a/tools/lammps-gui/slideshow.cpp +++ b/tools/lammps-gui/slideshow.cpp @@ -14,7 +14,9 @@ #include "slideshow.h" #include "helpers.h" +#include "lammpsgui.h" +#include #include #include #include @@ -48,8 +50,12 @@ SlideShow::SlideShow(const QString &fileName, QWidget *parent) : imageName->setAlignment(Qt::AlignCenter); imageName->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - auto *shortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_W), this); - QObject::connect(shortcut, &QShortcut::activated, this, &SlideShow::close); + auto *shortcut = new QShortcut(QKeySequence::fromString("Ctrl+W"), this); + QObject::connect(shortcut, &QShortcut::activated, this, &QWidget::close); + shortcut = new QShortcut(QKeySequence::fromString("Ctrl+/"), this); + QObject::connect(shortcut, &QShortcut::activated, this, &SlideShow::stop_run); + shortcut = new QShortcut(QKeySequence::fromString("Ctrl+Q"), this); + QObject::connect(shortcut, &QShortcut::activated, this, &SlideShow::quit); buttonBox = new QDialogButtonBox(QDialogButtonBox::Close); @@ -190,6 +196,22 @@ void SlideShow::loadImage(int idx) } while (idx >= 0); } +void SlideShow::quit() +{ + LammpsGui *main; + for (QWidget *widget : QApplication::topLevelWidgets()) + if (widget->objectName() == "LammpsGui") main = dynamic_cast(widget); + main->quit(); +} + +void SlideShow::stop_run() +{ + LammpsGui *main; + for (QWidget *widget : QApplication::topLevelWidgets()) + if (widget->objectName() == "LammpsGui") main = dynamic_cast(widget); + main->stop_run(); +} + void SlideShow::movie() { QString fileName = QFileDialog::getSaveFileName(this, "Export to Movie File", ".", diff --git a/tools/lammps-gui/slideshow.h b/tools/lammps-gui/slideshow.h index 176bb9f030..1b5e977643 100644 --- a/tools/lammps-gui/slideshow.h +++ b/tools/lammps-gui/slideshow.h @@ -32,6 +32,8 @@ public: void clear(); private slots: + void quit(); + void stop_run(); void movie(); void first(); void last(); From ed631ecd44cd03cc2e931648047c0dff63c1d380 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 3 Oct 2023 22:36:00 -0400 Subject: [PATCH 124/219] add button to reset zoom/pan of chart viewer --- tools/lammps-gui/chartviewer.cpp | 40 +++++++++++++++++++++++++++++++- tools/lammps-gui/chartviewer.h | 3 +++ 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/tools/lammps-gui/chartviewer.cpp b/tools/lammps-gui/chartviewer.cpp index 94d938c473..d79f0b2748 100644 --- a/tools/lammps-gui/chartviewer.cpp +++ b/tools/lammps-gui/chartviewer.cpp @@ -17,6 +17,7 @@ #include #include +#include #include #include #include @@ -30,9 +31,17 @@ ChartWindow::ChartWindow(const QString &_filename, QWidget *parent) : menu->addMenu(file); menu->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Preferred); + // workaround for incorrect highlight bug on macOS + auto *dummy = new QPushButton(QIcon(), ""); + dummy->hide(); + auto *normal = new QPushButton(QIcon(":/icons/gtk-zoom-fit.png"), ""); + normal->setToolTip("Reset zoom to normal"); + columns = new QComboBox; top->addWidget(menu); top->addSpacerItem(new QSpacerItem(1, 1, QSizePolicy::Expanding, QSizePolicy::Minimum)); + top->addWidget(dummy); + top->addWidget(normal); top->addWidget(new QLabel("Select data:")); top->addWidget(columns); saveAsAct = file->addAction("&Save Graph As...", this, &ChartWindow::saveAs); @@ -44,9 +53,10 @@ ChartWindow::ChartWindow(const QString &_filename, QWidget *parent) : file->addSeparator(); stopAct = file->addAction("Stop &Run", this, &ChartWindow::stop_run); stopAct->setIcon(QIcon(":/icons/process-stop.png")); - stopAct->setShortcut(QKeySequence(Qt::Key_Slash, Qt::CTRL)); + stopAct->setShortcut(QKeySequence::fromString("Ctrl+/")); closeAct = file->addAction("&Close", this, &QWidget::close); closeAct->setIcon(QIcon(":/icons/window-close.png")); + closeAct->setShortcut(QKeySequence::fromString("Ctrl+W")); quitAct = file->addAction("&Quit", this, &ChartWindow::quit); quitAct->setIcon(QIcon(":/icons/application-exit.png")); quitAct->setShortcut(QKeySequence::fromString("Ctrl+Q")); @@ -54,6 +64,8 @@ ChartWindow::ChartWindow(const QString &_filename, QWidget *parent) : layout->addLayout(top); setLayout(layout); + connect(normal, &QPushButton::released, this, &ChartWindow::reset_zoom); + connect(columns, SIGNAL(currentIndexChanged(int)), this, SLOT(change_chart(int))); QSettings settings; resize(settings.value("chartx", 500).toInt(), settings.value("charty", 320).toInt()); @@ -108,6 +120,12 @@ void ChartWindow::quit() main->quit(); } +void ChartWindow::reset_zoom() +{ + int choice = columns->currentData().toInt(); + charts[choice]->reset_zoom(); +} + void ChartWindow::stop_run() { LammpsGui *main; @@ -266,6 +284,26 @@ void ChartViewer::add_data(int step, double data) } } +/* -------------------------------------------------------------------- */ + +void ChartViewer::reset_zoom() +{ + auto points = series->pointsVector(); + + qreal xmin = 1.0e100; + qreal xmax = -1.0e100; + qreal ymin = 1.0e100; + qreal ymax = -1.0e100; + for (auto &p : points) { + xmin = qMin(xmin, p.x()); + xmax = qMax(xmax, p.x()); + ymin = qMin(ymin, p.y()); + ymax = qMax(ymax, p.y()); + } + xaxis->setRange(xmin, xmax); + yaxis->setRange(ymin, ymax); +} + // Local Variables: // c-basic-offset: 4 // End: diff --git a/tools/lammps-gui/chartviewer.h b/tools/lammps-gui/chartviewer.h index ffdb75cf7e..60a9cfba79 100644 --- a/tools/lammps-gui/chartviewer.h +++ b/tools/lammps-gui/chartviewer.h @@ -43,6 +43,7 @@ public: private slots: void quit(); + void reset_zoom(); void stop_run(); void saveAs(); @@ -74,6 +75,8 @@ public: explicit ChartViewer(const QString &title, int index, QWidget *parent = nullptr); void add_data(int step, double data); + void reset_zoom(); + int get_index() const { return index; }; int get_count() const { return series->count(); } const char *get_title() const { return series->name().toLocal8Bit(); } From 8af3aef734dd70c8a67b6d096fcf5df10edfed15 Mon Sep 17 00:00:00 2001 From: Evangelos Voyiatzis Date: Wed, 4 Oct 2023 10:04:45 +0300 Subject: [PATCH 125/219] Fixes #3925 in region_ellipsoid.cpp --- src/region_ellipsoid.cpp | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/region_ellipsoid.cpp b/src/region_ellipsoid.cpp index 3520b55813..0296178648 100644 --- a/src/region_ellipsoid.cpp +++ b/src/region_ellipsoid.cpp @@ -190,8 +190,8 @@ int RegEllipsoid::surface_interior(double *x, double cutoff) double b_r = b - cutoff; double c_r = c - cutoff; double delx_r = b_r * c_r * (x[0] - xc); - double dely_r = a_r * c_r * (x[1] - xc); - double delz_r = a_r * b_r * (x[2] - xc); + double dely_r = a_r * c_r * (x[1] - yc); + double delz_r = a_r * b_r * (x[2] - zc); double r_r = delx_r * delx_r + dely_r * dely_r + delz_r * delz_r; double rc_r = a_r * a_r * b_r * b_r * c_r * c_r; @@ -217,9 +217,9 @@ int RegEllipsoid::surface_interior(double *x, double cutoff) contact[0].r = DistancePointEllipsoid( axes[sorting[2]], axes[sorting[1]], axes[sorting[0]], coords[sorting[2]], coords[sorting[1]], coords[sorting[0]], x0[sorting[2]], x0[sorting[1]], x0[sorting[0]]); - contact[0].delx = x[0] - (copysign(x0[sorting[2]], x[0] - xc) + xc); - contact[0].dely = x[1] - (copysign(x0[sorting[1]], x[1] - yc) + yc); - contact[0].delz = x[2] - (copysign(x0[sorting[0]], x[2] - zc) + zc); + contact[0].delx = x[0] - (copysign(x0[0], x[0] - xc) + xc); + contact[0].dely = x[1] - (copysign(x0[1], x[1] - yc) + yc); + contact[0].delz = x[2] - (copysign(x0[2], x[2] - zc) + zc); // contact[0].radius = -radius; contact[0].iwall = 0; contact[0].varflag = 1; @@ -236,7 +236,7 @@ int RegEllipsoid::surface_interior(double *x, double cutoff) double a_r = a - cutoff; double b_r = b - cutoff; double delx_r = b_r * (x[0] - xc); - double dely_r = a_r * (x[1] - xc); + double dely_r = a_r * (x[1] - yc); double r_r = delx_r * delx_r + dely_r * dely_r; double rc_r = a_r * a_r * b_r * b_r; @@ -281,8 +281,8 @@ int RegEllipsoid::surface_exterior(double *x, double cutoff) double b_r = b + cutoff; double c_r = c + cutoff; double delx_r = b_r * c_r * (x[0] - xc); - double dely_r = a_r * c_r * (x[1] - xc); - double delz_r = a_r * b_r * (x[2] - xc); + double dely_r = a_r * c_r * (x[1] - yc); + double delz_r = a_r * b_r * (x[2] - zc); double r_r = delx_r * delx_r + dely_r * dely_r + delz_r * delz_r; double rc_r = a_r * a_r * b_r * b_r * c_r * c_r; @@ -308,9 +308,9 @@ int RegEllipsoid::surface_exterior(double *x, double cutoff) contact[0].r = DistancePointEllipsoid( axes[sorting[2]], axes[sorting[1]], axes[sorting[0]], coords[sorting[2]], coords[sorting[1]], coords[sorting[0]], x0[sorting[2]], x0[sorting[1]], x0[sorting[0]]); - contact[0].delx = x[0] - (copysign(x0[sorting[2]], x[0] - xc) + xc); - contact[0].dely = x[1] - (copysign(x0[sorting[1]], x[1] - yc) + yc); - contact[0].delz = x[2] - (copysign(x0[sorting[0]], x[2] - zc) + zc); + contact[0].delx = x[0] - (copysign(x0[0], x[0] - xc) + xc); + contact[0].dely = x[1] - (copysign(x0[1], x[1] - yc) + yc); + contact[0].delz = x[2] - (copysign(x0[2], x[2] - zc) + zc); // contact[0].radius = radius; contact[0].iwall = 0; contact[0].varflag = 1; @@ -327,7 +327,7 @@ int RegEllipsoid::surface_exterior(double *x, double cutoff) double a_r = a + cutoff; double b_r = b + cutoff; double delx_r = b_r * (x[0] - xc); - double dely_r = a_r * (x[1] - xc); + double dely_r = a_r * (x[1] - yc); double r_r = delx_r * delx_r + dely_r * dely_r; double rc_r = a_r * a_r * b_r * b_r; From 35640dd72ec226e9d8b8cea5f5291c9e40efb3f9 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 4 Oct 2023 06:29:39 -0400 Subject: [PATCH 126/219] use event filter to bypass default shortcuts that conflict with our custom ones --- tools/lammps-gui/chartviewer.cpp | 23 ++++++++++++++++++++++- tools/lammps-gui/chartviewer.h | 1 + 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/tools/lammps-gui/chartviewer.cpp b/tools/lammps-gui/chartviewer.cpp index d79f0b2748..f28625d9dc 100644 --- a/tools/lammps-gui/chartviewer.cpp +++ b/tools/lammps-gui/chartviewer.cpp @@ -65,8 +65,9 @@ ChartWindow::ChartWindow(const QString &_filename, QWidget *parent) : setLayout(layout); connect(normal, &QPushButton::released, this, &ChartWindow::reset_zoom); - connect(columns, SIGNAL(currentIndexChanged(int)), this, SLOT(change_chart(int))); + installEventFilter(this); + QSettings settings; resize(settings.value("chartx", 500).toInt(), settings.value("charty", 320).toInt()); } @@ -234,6 +235,26 @@ void ChartWindow::closeEvent(QCloseEvent *event) QWidget::closeEvent(event); } +// event filter to handle "Ambiguous shortcut override" issues +bool ChartWindow::eventFilter(QObject *watched, QEvent *event) +{ + if (event->type() == QEvent::ShortcutOverride) { + QKeyEvent *keyEvent = dynamic_cast(event); + if (!keyEvent) return QWidget::eventFilter(watched, event); + if (keyEvent->modifiers().testFlag(Qt::ControlModifier) && keyEvent->key() == '/') { + stop_run(); + event->accept(); + return true; + } + if (keyEvent->modifiers().testFlag(Qt::ControlModifier) && keyEvent->key() == 'W') { + close(); + event->accept(); + return true; + } + } + return QWidget::eventFilter(watched, event); +} + /* -------------------------------------------------------------------- */ ChartViewer::ChartViewer(const QString &title, int _index, QWidget *parent) : diff --git a/tools/lammps-gui/chartviewer.h b/tools/lammps-gui/chartviewer.h index 60a9cfba79..248fdad7bb 100644 --- a/tools/lammps-gui/chartviewer.h +++ b/tools/lammps-gui/chartviewer.h @@ -54,6 +54,7 @@ private slots: protected: void closeEvent(QCloseEvent *event) override; + bool eventFilter(QObject *watched, QEvent *event) override; private: QMenuBar *menu; From 63aa467959b590ee2cb0eecbb5d6b2784d5bc88e Mon Sep 17 00:00:00 2001 From: Yury Lysogorskiy Date: Wed, 4 Oct 2023 12:32:24 +0200 Subject: [PATCH 127/219] add support of computing B-grads (and C-tilde grads) --- cmake/Modules/Packages/ML-PACE.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake/Modules/Packages/ML-PACE.cmake b/cmake/Modules/Packages/ML-PACE.cmake index 6cdb751617..30aa433a58 100644 --- a/cmake/Modules/Packages/ML-PACE.cmake +++ b/cmake/Modules/Packages/ML-PACE.cmake @@ -1,6 +1,6 @@ -set(PACELIB_URL "https://github.com/ICAMS/lammps-user-pace/archive/refs/tags/v.2023.01.3.fix.tar.gz" CACHE STRING "URL for PACE evaluator library sources") +set(PACELIB_URL "https://github.com/ICAMS/lammps-user-pace/archive/refs/tags/v.2023.10.04.pre.tar.gz" CACHE STRING "URL for PACE evaluator library sources") -set(PACELIB_MD5 "4f0b3b5b14456fe9a73b447de3765caa" CACHE STRING "MD5 checksum of PACE evaluator library tarball") +set(PACELIB_MD5 "61ba11a37ee00de8365b18b521d394a6" CACHE STRING "MD5 checksum of PACE evaluator library tarball") mark_as_advanced(PACELIB_URL) mark_as_advanced(PACELIB_MD5) GetFallbackURL(PACELIB_URL PACELIB_FALLBACK) From 0536e0e7b3c2985dafb4ff28173705cc00c84cd7 Mon Sep 17 00:00:00 2001 From: Yury Lysogorskiy Date: Wed, 4 Oct 2023 12:38:25 +0200 Subject: [PATCH 128/219] upd Install.py (new version v.2023.10.04.pre and checksum) --- lib/pace/Install.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/pace/Install.py b/lib/pace/Install.py index 4f3cf299ac..2a8cd2f1f3 100644 --- a/lib/pace/Install.py +++ b/lib/pace/Install.py @@ -18,11 +18,11 @@ from install_helpers import fullpath, geturl, checkmd5sum, getfallback # settings thisdir = fullpath('.') -version ='v.2023.01.3.fix' +version ='v.2023.10.04.pre' # known checksums for different PACE versions. used to validate the download. checksums = { \ - 'v.2023.01.3.fix': '4f0b3b5b14456fe9a73b447de3765caa' + 'v.2023.10.04.pre': '61ba11a37ee00de8365b18b521d394a6' } parser = ArgumentParser(prog='Install.py', description="LAMMPS library build wrapper script") From ac53cbb779c7e1b43efa67e56be55e2919048fd7 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 4 Oct 2023 07:45:25 -0400 Subject: [PATCH 129/219] update LAMMPS GUI docs and some images --- doc/src/Howto_lammps_gui.rst | 198 +++++++++++++---------- doc/src/JPG/lammps-gui-chart.png | Bin 74760 -> 107306 bytes doc/src/JPG/lammps-gui-complete.png | Bin 0 -> 36443 bytes doc/src/JPG/lammps-gui-log.png | Bin 122888 -> 97687 bytes doc/src/JPG/lammps-gui-main.png | Bin 93426 -> 92717 bytes doc/src/JPG/lammps-gui-popup-help.png | Bin 121506 -> 132908 bytes doc/src/JPG/lammps-gui-prefs-accel.png | Bin 36728 -> 38261 bytes doc/src/JPG/lammps-gui-prefs-editor.png | Bin 44506 -> 45027 bytes doc/src/JPG/lammps-gui-prefs-general.png | Bin 76737 -> 82533 bytes doc/src/JPG/lammps-gui-prefs-image.png | Bin 50767 -> 51660 bytes doc/src/JPG/lammps-gui-slideshow.png | Bin 61093 -> 68537 bytes 11 files changed, 110 insertions(+), 88 deletions(-) create mode 100644 doc/src/JPG/lammps-gui-complete.png diff --git a/doc/src/Howto_lammps_gui.rst b/doc/src/Howto_lammps_gui.rst index 0b5237d1f6..4db8b532ce 100644 --- a/doc/src/Howto_lammps_gui.rst +++ b/doc/src/Howto_lammps_gui.rst @@ -5,48 +5,58 @@ This document describes **LAMMPS GUI version 1.5**. ----- -LAMMPS GUI is a simple graphical text editor that is linked to the -:ref:`LAMMPS library ` and thus can run LAMMPS directly -using the contents of the editor's text buffer as input. It can -retrieve and display information from LAMMPS while it is running and is -adapted in multiple ways specifically for editing LAMMPS input files. +LAMMPS GUI is a graphical text editor that is linked to the :ref:`LAMMPS +library ` and thus can run LAMMPS directly using the +contents of the editor's text buffer as input. It can retrieve and +display information from LAMMPS while it is running and is adapted in +multiple ways specifically for editing LAMMPS input files. .. note:: Pre-compiled, ready-to-use LAMMPS GUI executables for Linux (Ubuntu 20.04LTS or later and compatible), macOS (version 11 aka Big Sur or later), and Windows (version 10 or later) :ref:`are available - ` for download. The executables are linked to - a current version of LAMMPS as well. The source code for the - LAMMPS GUI is included in the ``tools/lammps-gui`` folder of the - LAMMPS distribution and it can be compiled alongside LAMMPS with - CMake. + ` for download. They may be linked to a + development version of LAMMPS in case they need features not yet + available in a released version. Serial LAMMPS executables of the + same LAMMPS version are included as well. The source code for the + LAMMPS GUI is included in the LAMMPS source code and can be found in + the ``tools/lammps-gui`` folder. It can be compiled alongside LAMMPS + when :doc:`compiling with CMake `. -LAMMPS GUI tries to be similar to what people traditionally would do -to run LAMMPS using a command line window: editing inputs with a text -editor, run LAMMPS on the input with selected command line flags, and -then extract data from the created files and view them. That -procedure is quite effective and often required when running LAMMPS on -high-performance computing facilities, or for people proficient in -using the command line, as that allows them to use tools for the -individual steps which they are most comfortable with. +LAMMPS GUI tries to provide an experience similar to what people +traditionally would do to run LAMMPS using a command line window: -The main benefit of a GUI application is that many basic tasks can be -done directly from the GUI without switching to a text console or -requiring external programs, let alone scripts to extract data from -the generated output. It also integrates well with graphical desktop -environments. +- editing inputs with a text editor +- run LAMMPS on the input with selected command line flags +- and then use or extract data from the created files and visualize it + +That procedure is quite effective for people proficient in using the +command line, as that allows them to use tools for the individual steps +which they are most comfortable with. It is often required when running +LAMMPS on high-performance computing facilities. + +The main benefit of using the LAMMPS GUI application instead is that +many basic tasks can be done directly from the GUI without switching to +a text console window or using external programs, let alone writing +scripts to extract data from the generated output. It also integrates +well with graphical desktop environments. LAMMPS GUI thus makes it easier for beginners to get started running -simple LAMMPS simulations. It is very suitable for tutorials on -LAMMPS since you only need to learn how to use a single program. It -is also designed to keep the barrier low when you decide to switch to -a full featured, standalone programming editor and more sophisticated +simple LAMMPS simulations. It is very suitable for tutorials on LAMMPS +since you only need to learn how to use a single program for most tasks +and thus time can be saved and people can focus on learning LAMMPS. It +is also designed to keep the barrier low when you decide to switch to a +full featured, standalone programming editor and more sophisticated visualization and analysis tools and run LAMMPS from a command line. The following text provides a detailed tour of the features and functionality of the LAMMPS GUI. +Suggestions for new features and reports of bugs are always welcome. +You can use the :doc:`the same channels as for LAMMPS itself +` for that purpose. + ----- Main window @@ -86,9 +96,9 @@ save them. Running LAMMPS ^^^^^^^^^^^^^^ -From within the LAMMPS GUI main window LAMMPS can be started either -from the ``Run`` menu using the ``Run LAMMPS from Editor Buffer`` -entry, by the hotkey `Ctrl-Enter` (`Command-Enter` on macOS), or by +From within the LAMMPS GUI main window LAMMPS can be started either from +the ``Run`` menu using the ``Run LAMMPS from Editor Buffer`` entry, by +the keyboard shortcut `Ctrl-Enter` (`Command-Enter` on macOS), or by clicking on the green "Run" button in the status bar. All of these operations will cause LAMMPS to process the entire input script, which may contain multiple :doc:`run ` or :doc:`minimize ` @@ -147,10 +157,10 @@ More information on those windows and how to adjust their behavior and contents is given below. An active LAMMPS run can be stopped cleanly by using either the ``Stop -LAMMPS`` entry in the ``Run`` menu, the hotkey `Ctrl-/` (`Command-/` -on macOS), or by clicking on the red button in the status bar. This -will cause the running LAMMPS process to complete the current timestep -(or iteration for energy minimization) and then complete the +LAMMPS`` entry in the ``Run`` menu, the keyboard shortcut `Ctrl-/` +(`Command-/` on macOS), or by clicking on the red button in the status +bar. This will cause the running LAMMPS process to complete the current +timestep (or iteration for energy minimization) and then complete the processing of the buffer while skipping all run or minimize commands. This is equivalent to the input script command :doc:`timer timeout 0 ` and is implemented by calling the @@ -180,11 +190,12 @@ or to not show the current log window. It is also possible to show or hide the *current* log window from the ``View`` menu. The text in the log window is read-only and cannot be modified, but -editor hotkeys to select and copy all or parts of the text can be used -to transfer text to another editor program. The "Select All" and "Copy" -functions, as well as a "Save Log to File" option are also available via -a context menu by clicking with the right mouse button into the log -window text area. +keyboard shortcuts to select and copy all or parts of the text can be +used to transfer text to another program. Also, the keyboard shortcut +`Ctrl-S` (`Command-S` on macOS) is available to save the log buffer to a +file. The "Select All" and "Copy" functions, as well as a "Save Log to +File" option are also available from a context menu by clicking with the +right mouse button into the log window text area. Chart Window ------------ @@ -243,10 +254,10 @@ installed. Variable Info ------------- -During a run, it may be of interest to monitor the value of input -script variables, for example to monitor the progress of loops. This -can be done by enabling the "Variables Window" in the ``View`` menu or -by using the `Ctrl-Shift-W` hotkey. This will show info similar to +During a run, it may be of interest to monitor the value of input script +variables, for example to monitor the progress of loops. This can be +done by enabling the "Variables Window" in the ``View`` menu or by using +the `Ctrl-Shift-W` keyboard shortcut. This will show info similar to the :doc:`info variables ` command in a separate window as shown below. @@ -275,11 +286,11 @@ Viewing Snapshot Images ----------------------- By selecting the ``Create Image`` entry in the ``Run`` menu, or by -hitting the `Ctrl-I` (`Command-I` on macOS) hotkey, or by clicking on -the "palette" button in the status bar, LAMMPS GUI will send a custom -:doc:`write_dump image ` command to LAMMPS and read the -resulting snapshot image with the current state of the system into an -image viewer window. This functionality is not available *during* an +hitting the `Ctrl-I` (`Command-I` on macOS) keyboard shortcut, or by +clicking on the "palette" button in the status bar, LAMMPS GUI will send +a custom :doc:`write_dump image ` command to LAMMPS and read +the resulting snapshot image with the current state of the system into +an image viewer window. This functionality is not available *during* an ongoing run. When LAMMPS is not yet initialized, LAMMPS GUI will try to identify the line with the first run or minimize command and execute all command up to that line from the input buffer and then add a "run 0" @@ -327,33 +338,40 @@ Context Specific Word Completion ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ By default, LAMMPS GUI will display a small pop-up frame with possible -completions for LAMMPS input script commands or styles after 2 -characters of a word have been typed. The word can then be completed -through selecting an entry by scrolling down with the cursor keys and -selecting with the 'Enter' key or by clicking on the entry with the -mouse. The automatic completion pop-up can be disabled in the -``Preferences`` dialog, but the completion can still be requested -manually by either hitting the 'Shift-TAB' key or by right-clicking with -the mouse and selecting the option from the context menu. Most of the -completion information is taken from the LAMMPS instance and thus it -will be adjusted to only show options available that have been enabled -while compiling LAMMPS, however that excludes accelerated styles and -commands, only non-suffix versions are shown. +choices for LAMMPS input script commands or styles after 2 characters of +a word have been typed. + +.. image:: JPG/lammps-gui-complete.png + :align: center + :scale: 75% + +The word can then be completed through selecting an entry by scrolling +up and down with the cursor keys and selecting with the 'Enter' key or +by clicking on the entry with the mouse. The automatic completion +pop-up can be disabled in the ``Preferences`` dialog, but the completion +can still be requested manually by either hitting the 'Shift-TAB' key or +by right-clicking with the mouse and selecting the option from the +context menu. Most of the completion information is taken from the +LAMMPS instance and thus it will be adjusted to only show available +options that have been enabled while compiling LAMMPS. That, however, +excludes accelerated styles and commands; for improved clarity, only the +non-suffix version of styles are shown. Line Reformatting ^^^^^^^^^^^^^^^^^ -The editor supports reformatting lines according to the syntax in -order to have consistently aligned lines. This primarily means adding -space padding to commands, type specifiers, IDs and names. This +The editor supports reformatting lines according to the syntax in order +to have consistently aligned lines. This primarily means adding +whitespace padding to commands, type specifiers, IDs and names. This reformatting is performed by default when hitting the 'Enter' key to -start a new line. This feature can be turned off in the +start a new line. This feature can be turned on or off in the ``Preferences`` dialog, but it can still be manually performed by -hitting the 'TAB' key. +hitting the 'TAB' key. The amount of padding can also be changed in the +``Preferences`` dialog. Internally this functionality is achieved by splitting the line into "words" and then putting it back together with padding added where the -context can be detected; otherwise a single space is used. +context can be detected; otherwise a single space is used between words. Context Specific Help ^^^^^^^^^^^^^^^^^^^^^ @@ -363,23 +381,23 @@ Context Specific Help :scale: 50% A unique feature of the LAMMPS GUI is the option to look up the -documentation for the command in the current line. This can be done -by either clicking the right mouse button or by using the `Ctrl-?` -hotkey. When clicking the mouse there are additional entries in the -context menu that will open the corresponding documentation page in -the online LAMMPS documentation. When using the hotkey, the first of +documentation for the command in the current line. This can be done by +either clicking the right mouse button or by using the `Ctrl-?` keyboard +shortcut. When clicking the mouse there are additional entries in the +context menu that will open the corresponding documentation page in the +online LAMMPS documentation. When using the keyboard, the first of those entries will be chosen directly. Menu ---- The menu bar has entries ``File``, ``Edit``, ``Run``, ``View``, and -``About``. Instead of using the mouse to click on them, the -individual menus can also be activated by hitting the `Alt` key -together with the corresponding underlined letter, that is `Alt-F` -will activate the ``File`` menu. For the corresponding activated -sub-menus, the underlined letter together with the `Alt` key can again -be used to select entries instead of using the mouse. +``About``. Instead of using the mouse to click on them, the individual +menus can also be activated by hitting the `Alt` key together with the +corresponding underlined letter, that is `Alt-F` will activate the +``File`` menu. For the corresponding activated sub-menus, the key +corresponding the underlined letters can again be used to select entries +instead of using the mouse. File ^^^^ @@ -405,8 +423,8 @@ Edit The ``Edit`` menu offers the usual editor functions like ``Undo``, ``Redo``, ``Cut``, ``Copy``, ``Paste``. It can also open a -``Preferences`` dialog (hotkey `Ctrl-P`) and allows deletion of all -stored preferences so they will be reset to default values. +``Preferences`` dialog (keyboard shortcut `Ctrl-P`) and allows deletion +of all stored preferences so they will be reset to default values. Run ^^^ @@ -598,22 +616,22 @@ the completion pop-up window. ----------- -Hotkeys -------- +Keyboard Shortcuts +------------------ -Almost all functionality is accessible from the menu or via hotkeys. -The following hotkeys are available (On macOS use the Command key -instead of Ctrl/Control). +Almost all functionality is accessible from the menu of the editor +window or through keyboard shortcuts. The following shortcuts are +available (On macOS use the Command key instead of Ctrl/Control). .. list-table:: :header-rows: 1 :widths: auto - * - Hotkey + * - Shortcut - Function - - Hotkey + - Shortcut - Function - - Hotkey + - Shortcut - Function * - Ctrl+N - New File @@ -640,7 +658,7 @@ instead of Ctrl/Control). - Ctrl+I - Snapshot Image * - Ctrl+Q - - Quit + - Quit Application - Ctrl+V - Paste text - Ctrl+L @@ -673,3 +691,7 @@ instead of Ctrl/Control). Further editing keybindings `are documented with the Qt documentation `_. In case of conflicts the list above takes precedence. + +All other windows only support a subset of keyboard shortcuts listed +above. Typically, the shortcuts `Ctrl-/` (Stop Run), `Ctrl-W` (Close +Window), and `Ctrl-Q` (Quit Application) are supported. diff --git a/doc/src/JPG/lammps-gui-chart.png b/doc/src/JPG/lammps-gui-chart.png index 447e7096258abc4de0803edd83abe5ba5d871f37..a16fcb167ceb054159d513138d2e54bdcab1eb55 100644 GIT binary patch literal 107306 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 N)RncBO72?({tI9F$SnW> literal 74760 zcma&N1yGz%&_4Js?iSo30fM``li=>|?ydF$kEQIbVRAw~fJ0R4lUlo|lQzP@49kYHY)$Z(qPyneu0 ziz|u)Ky3o*qbdCBcWMu59S?P9D-Ul|H%mZAi_*)|&E3}7iIR(jorRs5gN=iejhllv zf>UQ604RYEQsNpuSto0rKDZ0Sh?^TH75&2fYjQ|fpWAU+)m9BrR$-)3!}0Y>R4T;e z6Ps|EF@FDSN!r9ga+O%MOiIaU4R*kxCJ6<81b}Du*T=^$GDy3!5-nARUT75osxT}G zr2FbS&(pTglV;;DfjqYP#l^CH5$IzIo2*8f#0z#$ZF<*jG7JVH)fi z8V{}uEHW}Oz~baHZ>?^<75?5HxJ~olI;aYdYMB@l<(Qb6`>{-{?bUrY!ei1>tJ{W- zSYy$_rPkNAU9Jgt=j-@h_I#dZcE2!rss^WVg0vVzD@mINq%po7-4W?4M5BZMYF$O@ z<~CnczYW$lr2cPiJ^sZNNnoYKv=5*8JAuP4U(m@*6AdlN&X9UCLx#kUWa~lq&w=qm zEP~MR9-pE5ZFe^{{wf(Ir7{W7&*Iv?z4=Dwlm7EAVrGm51%D zH=3DKEr_=%y--a?N=Uync7 zS4=#-ue5ag7%aSN*|nxRj0u2X5~Ec{g_s71ghlk3eO^ewkevI@0?Ca{04oDDE%7^* z6b_^U0{TNrlDY7TVZzkBqJY}3F1jj3>;m|)(n%u(Mur-LMo1YF^TJeb$v*d_&zWA6 zZg_^S=kfACQ%o>j=o#H&A?ZrYuSpb_3nwSsC-1Ac$Ihmg{;4ZlDX&DHJ8y2mwdBrv%|8B8GasGAy96vJ=uIw2>}<|2M88Qm!P*EM5=6{RJ80@z z^vqLmCEH82*G3GjC2z#{S;HfWt%uW8_{3W?Y7bgWoV%8NzGjg+cisvebw^YSmOobFDR()w-@B1 zX1a#RWi~cJqsb7BLycl}bV+Prt2kM%#eDVAA`b@g+VC z7#%hyBbWTVhNkHKT)*UbY0sTuZhLP;=`wh7YBn4(6KY%m-ZQ1pZew?n%22GVU-o{& zr7RmoR^hMMcCTq!Tj4Qj+hAC%kAx}HcB_b?CAeT9tY!*~ILoHonr$2w?<>79;>Tz^ z2Bg%m9zCyFrhVfBRmfu|hC4R3j`|CC>_&ew=A3?dBjy+ z!Nxyu+elVFL_)7tAoW6qf>Jwb3h>Wfs_O3!rAZj3eam_yL) zT&7MULue>Di$Rms*4S{)dY9$`_SW*aKF}jaSyBZra>UO?pitYLMW}?uV$`-e(?}Jv zD9fAsjuDVqu^f*s4hw8bj8VG0cD}6x=&LMQ+RxDY~Ut{ESc&1Mp1*ynv zOrUoHV%4zgJQYl#3<~l0l>vWD9>Vsw1c{Pt8-mWfAW zgVvDWHFeG#z~oQEK)ehGyLn+?1tmi{l(k;Njr0I@*<|jE!EG&m=;7Gt*wDcjkdVQRqo!ZK=znajEesakGoz+*js4 zT3Q9{P`a&M5KjvFTI5a~*c510v&#f;mbU_D=M zmMocfGX%4b_s0qTXdkT#t*lv%aNxdp*q`%X-2c`Rpa}ts)~3n5`}1*-wb)R@lEx4t z`VbM+v%QE0IDXfQdl^axz3t(;Dk!Rr{=0-K&}jaW;bCM#sGIhpNUpY^;lB38{x75^ zEmL74ZAjA%i=pl(=_ta&Yye*nhn4+%K;iUcM}HL2_oWFpdBA#g#mjHwXFu+GpLFqf z$wh^(BM?G;JP}`B>?G5r!b$DZdc<|QX6TUX-Fh_8WISW`YdpI{$WAY3*`J+Wk+9z3 z=G3r!W;=f@TPTb4T8XSJDT%Sc!RdI;+U+E~@+AjJ?S0q)I+H!-cjQ_k0I4;jx!IT> z?_4Mq7FHYa!wd`awcX9a!vbpFm~YGeLut9`WC{ab1+!FKyH}I#Y`F@|Y3COq=t99U z@86`mECX@nvepTn9ce!ARK@ZDyqL@Tuii^GDzM1Plj1FrXr_)`c)D_Vl zJ68KQ)g&=1yWDoefd(5pI@by^4+w4uPg2lVqEzgeM*{08j>#9d2vtE5?(@kR#HwN| zBoT5y=7=~eg=3hOma19F;9Iea8O_9Qi}awI#rtA9(nq}q58_J{^-mhbZX4K|t@R}( zpZlH8XldGwYX|Iy{ZFek6K@Mt%oyI!Yq*qBA!-@65yR$5yXzC;G6mZxE!Wx6y}(;C zA8Fm?I*0=`E{8|q^|bzePy|F_gBA}(X%y@{N1_i@m@1`28AjWyC*_~>oPIMh@JDHeZu!bbY60TbA z=4S>dP2XgG5{^+ip!LHMmhC3Eoq*qHJ2Glt|Gk18JKK=jJsHY)@%v-B&qsi%2S(|e z0cwU25321^hyO6YA>)qJZ-dS(3v%nd-QUYTgdbMpJQ_A^tK<^8i84Sv(`(*3hU)lJ z3LqvGZNw>Gd2l~H9|_9ynN?%B1`+!Y<7(uD-AXtX$m&y8;dncuLOD9+(XV)lm$vUr zHB-)LKmT4=wp-_(WN>b1Sgm07{BSwbEm;<(dUrdvZIglv!<#kO%f`Yaae7D1Cn%rF zq!Xen4q3wTVXGx$qK8hd}JN&=-;GyVbO$ zcUtHVDJP>bjDo?B+iEa~;uaW*=+xV4xqI<;8bPcOp|MV)qyB>xacUg3&;+{QcOq+7 zySGLaKMLlJ!lVv_l~Vu|jJvl(SYq0UWRt72VC~1NcS(^I_yx{1g+wpW1At>QU5zn_qXEiB+H%eOb5-mL*_|! zJ{aK_r<=@mQ_&38Q2X15+N+d6rg1ie8!Qh+CpBSU=P#~Rr5$I~o4?Hh#3e>7jG9wW z5&7i6=QQD1JT|T$hO~Kvv-y zU}Vcsasq3UA`sKC=jnIBb=%-He5PG^p?7tLxsbrbj^~qNbF?O@pGF=vpEdnLt~twd z-|Vt7QkDH^jjInK7HXTN5v#jsWO#r)$M&NQ`PQsLl zcF)YE@=wQy%=#RXthoVL3&z>7EVpTf3*UTtN4i(emD_jA!s23rgK%$cUb^0d(spOn zNF*gcG(PY+&d|PntN(5S8VU79utQH@>mNV5yJXdDEj@O!_PNelo0z;=ECXxWCek^D z&!53j@$RMx^Q!xZFZ^%?PY%4-{MDNq9IuG7e16+neRK<`zeB)EwzYrmBArC8sI`V7 zs~eIPs@7&P(bTRQv6&gRYe`08PJ45~!#;b-P1I6Y3yp0$BMR9pPN>?m29U-{(cMZR z<5U8qGk<2j4-m`l6n3Sd)8_6{ZGq2$D$s-7$P=snR zr4Z}a)7YD~oJ4zcQ@_@3~TQSUgOA+*gpmoJsyOr;4Krd*!5 zmsD6D*!Ok{315*wz4m!oe@hiBOnaGo}OKsUo z@fn#J9Y`%IdWyy`4Q&mlg1n9;DzfsgY@+Rk2|1*@I~U1DWdm&6)4g>#a<}RKyK1xH z+Wlc===mY(V5c9|B)zFpPijN3xN$7HIIH#~3n)b1gp0t|Z#+!&CUV`O3qro5K3dh) z^isi1BTpH~70zB{_E?*$4*r-B*V*OyK^$38c5Ga0U(qh&TgQU10n)^37r51Gd~#H> zu7-a^^;5G&@t_o5`NGh0>8b(Eu!3Xv$+lBZh~q&G9jz0U>dJ%{)je3%`}+~r zez~k^dxJ%kM2m=pjgQB?54t|k=`Lk}&|5(}!c!OMn zHsG`G$th(hY0{52JAG=L;kW3+x7=KEh-k=+ikVF+&7YcY4TNADRm8{Z*fV1%fVB#t zctpd~Ho{z%xtc%YOr;@Og(b;%2XNtehn~)Y*p!O4Tfw_`nn_pB^+jK8V^U_Pc9NZaz#F{bCxr#m9>irg!_QC_Pf8Y@dTpGP;Fx;7I zt9AI#6qSr>xL9AooKHrn%CqH}=Ay z_8R)t_S_0cJS3Ho&urFynR;_)0~1G+12w^_vBGO(#>ncoI_)tJY#$p385!bWf&kR} zY9iB&NjG3)@cwzQ031i5jvdYr4E zmm5P8ea|a}juzDv?3c^m#t!S{)RZMxMkG`v(O?EciFlO?qXG`Kw29J)A0Svjrmn+A zbNHh65M|u9eM@dg2Ji(lzA0wN8&Vy*zMSBaMU*EnM38<_b*-6Nczk31-W;TpNkUi) zr(g5*lJMd}&z0sPyoBoR28Q0mK{7o|ESEEMF zKLd)^C`Q+IOM$nS3jFv|d?v%E@d|n)k?MwJL>IKTri93o)=|1wSq6qVvPu}!({PD$%A1@ZZbJ5A zB?LkQYH=0YAb0q#ilyGsLGAi7UXvZZ@l?ZL#|kL|`4sO{gdS&qFoBWUf**XbVfg^4 z7=rw{&NT+#&yvMbgKc+gx33>33IkRjI~J8rJwmRq>c&&*Ca^y%;ff`59+6jM3tr0F z%?jexwARHW_ny19)RY>JWVxI(SJdx3cG8EMqiktlv?V3&A`3b_B(Wgifqr>rnpQkO zsNV|uS}bMXbUY2BwHGSC@W)SUJsfi0p;5hw2wR)_ zBYDU94IXp%IfWSfF6vTL2rnSQC|)1=hcU=rv>>xNTsZ+I+L)EGfPnRLt`qvmUw9u+ zij59KN96Lyz-5c7et(we+x&jDa=5#PVCDok?jRh}+&gNX?XB7?+doIJ3&k3=CyWO2 z@a@Kli4}65K+hN8+#r6hcy;#Rn{GqADg3S0JN9zts(W|2YzXN&eBQ^vO2!VKU@PR& zd>V~&xRTlQtJh@#Y@Y=rRTw~Q0s~^<7=c7a)(lfVyBTG(XXOQX(I8+g&3R&G`3Z%m z>-q;HxGZMueRmjKp4M}u5MIS=C@QmP1RriA!fUH^XA4VT-5=*_1q%8{rzsODyMpxk zM9gDYlcVnn(qjD=$Kk`l>t zQqK$Gj-z%K?=KsSKTV|AJus?>u8w@U3MwTMmS11hc0Y|^zt%ihvTusfunidTtkiaS zJV9sDi&d0Ya$d<7U&7O5`8`;U*T21VJKtP@#4nBZVj6VcR%p@}y4 z3m8Dg!D8RwSsJVIMhj0+TRVaqw`Htpg!5FdHH7`sSK4^@G#4wFAceNMO*!* zt8;{Xc9Td50Jb)6hZ8$oc?a;($d@>HPrshwH_u&rv0ZPIU87sjGTixDzs1QB_<#VJ zStUXb{2B%61?L~Rd{_>BsfZ=b|1h+J2T;%VF~cy8r}kPIfkrawVPYn1J8 z85i%SBdT^ZfTAIao%wjB*w-_>t6Y^+X1t-KGLpO6VN`RgIGMl0jmM;yqOoLI!4X~d zMAie!eBc$M}1NcaVBl;T&9H-J*rfq0(W7xg&b@LSetK1QOBHo}j(! z!_fT+GJ{%);6H!EN3|Q9+}6nm{tQkzWa-ACcy6yOsdwqs+5I6tccyN9{bleWpWcH%TFxNk zv}5w9(84{tQauc$h}OeV>7cV!_>TrPMeJ6;*jF}}@e#_e>SOwOolTOxM2z%xmzhq` z7P)*%%<59kX7G*a3ay>3yb1a0o*BO$r9BB%9o{m-!IaVKzA`cYaPfA>WdTVOugkjUV=221dy89_?eec-f-zI2 zO@g4-!C3Kyi|ug(!(cs^lEhPNfBRa!xDr{05O%jRV=sQqxhIA#mHMriq0M6C)^e*V zd2K3%8koQ9Qqq<+vv_l7YzNP^o&?l8weDW~NPh_;a>TGyCJZD0*Iag@6}n$8q#Q@z zrkTS76^Z@@GF?8Wk}nVH;wh6Fe@J2Eg_M6bLLm?N(Og{(KN$J(e7Nm2TGaf_OS6O1 z4tkyj&uGf_m`1g>npV}WEV$MmnLZlLFs^>Ol|j|L{;e^-oI`sFwHq#r-kHN;JRtJ= z>$6rdo6WKIAe44yLm=!?va`gg^zLu)ol)Q+j*L7LG*_@GBlg>IxpfDVY2y?q zpSmwPc2joXl_SFGKFou@Ndy;Z^Uz$fd`Y%gvXU6N5!`Y$-73RH64Fu6$lNGV zb@cq$`e4S~o5m^nd}A`cI7*N^T9CttXL3y_OcI#eb|bLcc`~jx5Sz`um(VSgJn6LY zSFN`uwkl5ZiYEyHw~bWAsE;A6apJh5us=t1={)2R~gY^1#_0H zHR9*b$m*!n=83KLG0Tb#`*UCK#LVv93Kmgu0_84QU7`%Buqk=qdVpMXr@AoisCJJ% z6*HzDwl)Y0nLzxp(T-_6OcLVV%ezcG&%H73`zw2FyNJdEhi~22hJLI8Cul-`Nf3$#;)A)@CWZRp_EY&*XP!ZF}CG4eGLafGc`(= z&qGpsyBq%Jvb(Wfy;O{<^7m`i=W=#GD%B~1SC70@+Ae=rGV+^AZt%oqqg7FK-`6Gn zOfda8!FS)?dHEF|2;iiB36t404O@#Ta`^%+?Ol1@PJ{uP!i z`{n(`mNQX*9Wey+zw1{sT^JA4$^Hj1*;TQ8!BsUuOS9VPC=BHs*4R2w>Opv5^Ta7- zo2|~`cGNZ?!&hDj-bi|705F&JcxKNYMsE*df^Vx*B!(^}zJ3STS94SsE;Lh_1%$ z&iUlYc>RbIC!K~rfNlH@oX1Mm0YoaSFD^U4r=?$4aGyX171B4Jssl?!FlRf|O!3;T zpX0)ZHomZ%kAS7)Ls01@%oxBLlCxu9S}PGSb=X}@3< z95uN3H)9G?&sIOlp9slSg#a#`{k0?wJ!VUf?z*?SI<|A+W!PBb^8GfpbZV&5#JUhd zEj#C>sPHVCp9+v5 zvMrH>qJCoc*{Dpa>pz>Zqf|i$l&Eo?d@YMVkCe^o;{K*8nsUv!J-wZj=(B_RC}#>w z+TV`a1ho3bD8ld2DERMDEYO1J6 z2|vADtYPt!5sn={YFSZ6j(Lv8lU~sWBl&hMuO6_H>6$r=EQjsC`6=*Rq{V3**1%E! zEUw&5JScbce|iBRwZaI_?@!)_1%x;mcHnyZ%67Iv1O)2x=>8nT*11uYy3kh;b^p!M+oN0cardbDOCV7&h zWu}U}rL*^!DI*(wpm!%A`W~mnSn$oPt7NN&pV6_oYUis?$948~7}jNO@`R3quT|UW zp*zARA-0b8Xpx~Tl-}ab-+e>`!IQ6?dGpLQ1un%J{t;ACJW6!PV5NMl2@!lkrYcmk zGC}qU^tt`=vM*NoKl$Ks)|pg-WVV z8vpL%WZ2^JqptNobDH{= zltjPxHmoDTXlp*17Yh=F)+^WOus;oiaD#F|;_!(eLhP25eoK6b1LLDLPPgA&FTsM!JNe%IGTt#3KsvL8A& z#bI6cGIT8S&gyf`3Oc8p<&z)j#{}8Z(I;~tmbGubp)3PMQRKk_(Xjf?tHf*lrJhwp z7Q)=p%(nDAylKf5NC2)Z6$HT^eb*DoP3}l+N9QY?0o!b^i6d1N;+!U18`eT_X!ff` z$*n6a4t^mb8#P-ATa~J`H6&Gx)Qd?wi(e)hhh6lhzsi$;2=T)wQC59DL%t*^k%5+{ zBY}SI7kPn*Gk?{yD#xfFt~ngJf(b0n`m%ULpwmCW`7cP|A0LcmGIH+~PuWYW z#T|Mko>Fy*YU7SYi0e%w7rS6XuI)FRvl_2e(~CnZ?WR9l1y=;y9O~IW+P&~jJ4y^i z?#G1%&KG@~+a^PCR=xOjZQKwU7+2}pgBrPg-E#yQf~y)pVm`g$?TSjpmXJfX46}KE z-7q+zyG=(n1-?1X@N0}a6B#<-s~rWmCP5!PDt57`#f zHu{&+)>$QoBH!}!-yhAD(=_wi&yTIHKHiK5zctMjc)Nce1(j|}7O~g;NMsb&x@{B@ zWn`9KhU=XFYDSlK8n)Q(O$cb|FVJOjS~SX*bfjCENqynU+veedinwAJ=D3VREmrV4 z$(l(xuJpPV+fKP{uEGsM53p55<`nOm1mj{2_Hc5!JG#*A*;U`KdUy3wkv_E^2fx^@ z%|f{1pq|vcsw^=i_%rGhgF?i>$Nctet^D0y9|;Qd+w2{ETYhj(8Qw=F8mY4&q#esB zIE}|l8v?2@8`WjI+^?8DeTY=ZC|gOiM)2jqhDYtE6MKER;exXj`Yl-FFKrH@+9!z^ zZ)BVDQk%Nwzdcfr#=dK=)BH>cCld9IIK9z}d-mi|eb6ELC+vaabXb5%o98htl7#rq zLZ`p?cq#+^<61DkzLY_m)UU_!OpBj|Hcek*UyISLK;S1tsvXCYA?fuNG(3Q$AniwH z3WyPK&0z3%fdvK}9gQLceUzW%MyYmKl8Cyo`?uaHvusU;7F-Nc#}_SItr_;9(d zC%%<^m8liZPEjVg=zZ_2WMy!2H{oPILE`3?lGxbW?5N0sD6~d)SEVn5M0Nj;mIu%v zsugn_$Jdl$>XD19C@(`vtU{(!hP`_vcrMi_Wi2ankr;yh^uIkbGBV1^$c(N#~J6XB(B zmKoeTypar26tLkD?R>_x-#Poc_dW!XP|Wa-+PT%TE8y;}XlJATT5{~_Nr}B5#yIe9 zW93PRs{Of* z|3jACjj1|%h!05F7xzWN_%%KxjRby*38h-Gxbr^NRyZWFddqf4)cMd0cx=oE|Uly6AN5aX0vPqTggNqDdn@SkOcJoCq`x=+(S@_NCGz|c+8|de!W5u`1jE7c zvq1lOt>DjeFDC*A$I@^dG#}52**`$ym5jV%`P=T5Ty%Js4V%A-K*&eP^q#zjfEzo( zLzH1YXqh#ED)QEAM^iliXwN?y(y?L1%R%a46Yv!UMnxTl4%=uq$58@_UV1Jp@bZ98 zQw`&FOyHbFqjKM;Pm;adeLzYj968CpX>UNM63CMKdi&jexWLGL6H)iUR&#` zqM|bXo!j`7M(5SnK`w+SaB(dh91NCXQ!t=r=H`r<;a`tpl@2kZ;}kD=huhoRMg1Ws z6WM~LrKRA)4`Enpx)rVtC@qnjx%pFAgs0oXc!tTW->|+;A?`G* zh|bf!C^R%jddSCU$0TW{HdOPNUo`6ELEDtsp6=;^`fk{ppi28acdp1_W$VV(Wx9)kny zKRraS=DZu7mx}6_xJg77?`m83@~gV&Ti0*b%qf~t(6ZkN`MARzjSVkbVggUBo-GZDjm-WxI;*nr(rSw8Yi z`}DS&oPG$;8>$hU^sGH;0s6Y};3`P~R*k+X8f@x_3I%VV*pH+MDGGB;-p z>X!RBd|&EWYz4sn@Yf<{{8t##v8F0Q*wSKTpt8v;WZ$+K7>OOQT5;Z?cx2<4N zw7J_Z*KcuSAQCkksOk9wQf&ETrLBEhBXM52$M{Vz4|$=?gHK5wbk*U}`^`}2($e+2 zp0oY}<7*joqE0lGw2FtZvvJmbCrJ_8`RS#epPIRq;Z;{>Pqw}bYXkhpIS*?s-|Ek7 z6W#=6b}wBYZNF0Eu&*yANB)W4^Xaq%e_7G*eM`63D=QU(Y}a&_fB3tve9Gk?CM{V0Fu>KY_GE%y2KAuN2FPpvKB35mHL#)+#BM}m4r7Krs+SgQ` z)mO=!bVSS!2)yt&hWB|VLBNjO9#&g^lIH55SvRiWR{G=oJT%6;D0UJMTg8`F(g`>t z62pZsc&rLzJAXp4apXWNCBl6Mn5iHm`N%n?Oz)g5)oRv|_Na)3=kM!N8gM;cZu=R1 z^VT#pggT4(WN6RT<15S8Wcww903narPSHyvl!sHp;sC*9@~yOdZWcOOeeXf9diUW) z;PvnPe|~|!^dTZJmD(W77(8Sx_}rQv_EO?w`n2fA{>0xR`*r~ z5aWEq=ch;74au9EqP`h{7X}0Zta?)|)gieno>)Mb!}*8E`p9SfRMG! zmyw8Jh)6KG1t11kv_@n$J2-M)+J|I_uCgxu?Y%>fOjl0e(HtkczgP_tbtYKyD4A7x z^Dj3bTHO{AC?P=6n8EHiNq7%@1w4Q2tV^((iq-e&Hv>AJlvAym<)P-;Tx5LTA4@39 zKOq@HAsfM)k*=tCPzc%4eDJ4FNWeQ`+&DeD0pnhxwez6Y#J(xLq9VekU&dnsj*0Y()O}E;5Zx zLg#ecY4b8|+cO$diG_0`8UNvg1oTCVaF*l4B&uF`GUo~pDCFxcTYm`XX+l^oUZfea zx_vDkdSz5|GFMVyw0LuGRC^V;bl-InVC+TReLu4F#gWtMPnlxc8|6u$?uz$H zMRcO06`%SIn;t^t2?Q9MIlfoU*pUiDL=>E}Q|tYKBvKDucHh;`g&0lC8JuslsW!SR z24Xm^z=#FeWN|#!z=sCOEY7c3jD!sY!&&S!3!q8ZJshikm;m-M!sy~8L^+(DW0s__wiAv5q)o1hXsblec5r}e`NqBZM|LFRZQi|Cc_ zAY+qzPfaOrD%G(_NEQ021~(T z*G0q?sLM`t)%_A%cc=6q@*v^!Tp7tO*iT^axizv!T*_CclNnz*TYfInsSNtNUcNAo zjsD%n*WBGva&K&ymG))69a;tZ%`oAoUHEEIsckuHaiufwDC>)n(1*7}Cn$Bvf5?GY zO1_}R%JqGFMM9hwEF`74>KRB$?$R%T0kF2!O1fv6eY^@%`_LAYjm}qq}|1T>zlun{gYc z%z4hhhtNbn0U7D($+=%%U9zvfPtHD{(hrrAIlc8mh(J1Pca~uAddKHnypNieF^je4 zgM}ZG${I9%eJG;`-*CIZ5ptfV^nCO6l{G|55W_>0wqf{$f%R*vmRRv;jRim%)@R5~ zEVpUk;dln0;BQv~Ka1NJ%Djup4gjQBBU>573_Ypg)r8>$2(TJMxKmXsd|G<`kV<1- z*S}ImSfBae%1uY}Kk+%IH0n@Y2(gq-X`*yKT3MpHjk+`@i>w z|3BH?AH>1(kw?UL1bR&|4pg>~d3|+aJlq$tX+r8q@3n7cvnrx61fVaJUWmuYxX>~z znpw;qX;?HJ|1W_cdf>hC=Rcu^mQgUi?;)W#VJ#CYHX{EPSf+P_4%Ld)33}QTHDQW& zbY85ysxWjGIZ@w0Fh`mHd7^Q7eUdo;B(iboT^|HHs!$U0*LX;z%7Em~#)bVWSD68e zm|VAu^Y3I>#Ltp%Etz7zJGFKq&fY#aka^hc)5x_4Y(r}!69!}kmN`@eR|c*RwpLx% zy$+z`$IZD>%guKasA5_zV`Eb>=JvPX?nklQsQ-Zl{PUHO-In3J==pvpk7a`7_NI|+ zNSt=Z<#>A?XSgNN!=DUG<7z9_6>he_u?y5&;xTx1hkjSq*5)C|b#qtBOvtR@Sf1M@ zt*0@1vObBB89WM1X=}4aEa56IZjJH3v2R~FJ{vQMOv0>45D^hR(TbTHb2di+W%c$X zimu5=bq99n)Iyt`SNaxQz$=Y)r~mMh<5msSh60O6oX3K4ji;)Tu1IFAHI0|NLU6aZ zbvc{AeqemA5S+d34Hvh7{m@6fz9IgJ7yof43A2LuR01s z?mdZg7u50_)&BWwjo{bYT{W6rp`e&`2Xs}$qolDu)*32=G%lK7UNtM+FzZ5M}~n($Bj?5Zi_u1x!+C+bRY z;8btw_Vb4}cR#k;dk?busMIh%44e+U*-p6S+x4XCdG5~!d+fy?2$M;~ zU-eUI4Ok#@Soo zCk?DJ57>c_-E6Uv?_Tg!&t}0Bi~WkI6CQZ3AgwdD8x{X4&>?B8l_p z=E=No0*bRRc#PP32qV_**=MI4SZjXO^~bo;N_uS9h4y^;ppBLZFy`h&ws9PbZDhe0 zG2L$3CgKh_3*K1%2EXb_K%*oQ#Lp`9ZNW)k`#HQe9&v_?`rWVA zoZm$-CEFU0{OP~Oe%{@m#~;3#_fuS-wmG`iGLmTL@luRH`^uArQG^g;q(~MkyyCRd zW+a{+zX7S9wtL|xOs~x8wn3V; zuIBC|)fy*yfP&X$A)ty%Tv0i)hwcyXj2^J3U0p=$0HZP!a&hh@7)Aty2 zIeplcdwK2Kzeo1xy|@zyPAg{W8toz7-v2+Lia?C=Mq#x`Z-^Y(?*o!Q%l}zbrnH7!n zK3Y=EBe1^xJ$l>)?x3s~U+ysyCW}MM7$lg?0(%&}51J(Z1}3)?aH;RT>)ZD7s;$F~ zB6LbP%lS4OP2YY2KStI8^oyW2cwexnMzo!8K};@ESOq5+_#LCK4ri%00-uz-8#~F- z`2NmYQHEgm`8{>@9E|jmF-K0UG!rT``j2jala2zNjWcFz_Y+>rdj-&l zKE`JH0%d~rpCezGuldEzY>>sw%*sC|(0^x=v2!TDH+ZyjqSpy@_tY}$O^9yThtJg} zL-KH%JKEGKW=~ZRCF7C{Dr^kPmW9cUQA}Wl`qUMabhES-+9_)(EXA>IZWM|XnBRh{ zHc)cR=;fZz_v1&PnIN&CPpG=ZOAIh$glKH$5Z34SvOV3H-?&#Y`ClvFr|ph|EYId8 zzy41zfC%({BeDvenEe~eInF;V+HZMJlB%dr;Ms!MyaU4=7fVTip;mP3Lj3Ry)u*S zHHH3hStgy%8=2MGQZcXRy|E$T?Ujj+rt2c!kX`pGPkWw>1X0z43)6K=&L>a&A07GKTzZcm+I$3TK@1VlVcG6xR88%= zJ712+gbjZQ8$3c6$?0V%&`Fo7EjpPPaSoSg3?CH(?a7mg!o597`Of|?y52GQyDpixyS=-qA3?Q=M+Z0A>S zcedHh@JN0hWiA(LP)$wUKwz!ZyfGtrU^;l+UNBdN4Bap2nkuV365v7c{-FN*$9l`Z z%vBx#dA~Ka9ba(aSTMG@2ar|nJSssZn;9(8aCGuvo)wyTXyLHNx;rkjy6(GnfL@+zyE{q`rGW;U@0 zXy09WD0T#N&AuMQad5$X0ndW{#zIZ22Cjn{0*_p!JbnJoUw90xYE=_IuZ)|cev~SS z&jOl<1$COglgGRxRn76)KAkFRgWB~?Q|(gRPV{_sVy?N26?2~M8`NJrF8Iiv__X@!X)mlv<{#e8OS9V$ z0PP(oZ$5jMTyl!`20qP_CMXm2GWS*4;S7At4PE;Ax|Ae$Y0WVExl1l)d!==7A4Av} zELV?@a;=Tg0b1Cr-$tXKtylhApvU1)*CTB=2V-=P+WGVc-=~v2P8V6MrweKAaRGX& zTW~c%O(_~hnkjK;@Js(+t4|B+kJ8clCkqN$+~4s-$73D#c=BxF=U&jp~W~i{du&4;+Vvv5jCv*|h4X)0pzGsow7KtN60GdlQ zFUBZ)A;Ub@UQXQ$;!$B{ne}sV(qmqyF(0Z>q=&;=8BhZ+M2GDpBwX4W-YqXWcM3|| z1>Z8$v(Fe1%R+BM0r~h)aImLvAE~23sqmz@cX!^E2_SsCMPv`P%1Aho#PuRLQD|~< zkUi7Py3kkpqovdFugPXzxi8;AY_9jKzLuU7S-ulIL%hYkUUSY1<(S+BQBj0z^cd?dNPVX^FdIpf(b(y1tvF%sY zrXF0F2LZd4GQ8B8M+X@KUW`Q2g9|q?@t}6qe7q9d@~LpPAz2bU>M?s$Vk40(T~z>5 zWktn|75j$}5!#^Z3l||AEp2T=T-+j!3O*qY?%j<&f9l%C#>Snd!F6dvHZUu-8TA`x zn1Nz?3|!B(XjF&-%Uu(C*}s<%RhlZ%OGQEghWz=^{ix&*>bB%ifn?{D59O%iVd28! znKQ@M-iyPU2Lhj8@7`v<-IC}`@iNinR;Ci4$gb)^5&<5q5^bJ z*E1uP+P8oAQno_xKUGyeMCe#^Xjp2$Awjl}1yE*M0l* z+{@rJD2a#|5I3>_!o{c9WpGvq(LdU-eun#Zh3!*YChkp-C#5duWO8NN-O9Ey{v-yGM-wa5HVhva1O=7N*5`AU7w$MIIqUP8 zIxG|m5IlCl1EGiFk^JspiCck2F#sqvEVW)Jd)SS!htH+*rQwp73_b|M6|Zii7PgZZv&>h<^UUX9*3cB0MSi^WA3jGvYaPUzjJ{X z?a6)#7kT=ntn9b*8jq8Z1_*kOuc9g4{(gXGxAati@50d|JVey*K*F%A@MP%R0Xsh6 z63<`q^H5K@E|*=+ocpE_dpT=LzzxTRIC9@TXCClhN>d#?1;7EZ5Qc4j-U~p}bpo(Z zXe+`iA6(QwF)EhK600dI3;)anfiIS!bdLMW7y^iKae_s<$VpCK9zP3G9d~Tw1q{4* z&7fYq?KeHVw|PmFlsv)FUu`2S3|n)+d#v)G7FQqFKEEm%f~<`-Yqn1~*FCSbu?^S* zJf3OadS#DiuJ=;yd4a=2bYCZKQeWoPtwpXw@O>8*C$`@>ygd5zuMv(WxiEHkSQ#20 zS-E6U$+{J_57d>F0f7NFueN{rg+6)QHBumfaG!j@07}Bh7De?I_t3Bl_|gv{L>`sK zT&=H@S@7o=i@?b&Th&)&Qfyw#f{Np^N;>Cch@&SLooqtakY-WTnBM*?>=43du84JU8ap9#C+#j zTNe|r$0;-maX#JmIS~?DAEBUby=rxPeg^#ww1E`{02xtyt{>=FzsrxcKHE-RyH)}>ci{0I*0Uur2vR*S z{|=tBE4+~grdIpnR=V10tnt;PZrq;#S*X@+Y{=iQ>Uh(6wHh8YXBZU>_|1n8x;rhu zZr>`1m>mb+UVn}7ix6t{x~izS$G0q}wwNy6t}yTs;X4g?G+e#!6YHLR(#IcUYTvHQ z9M8_((Rx_ihR&TMJk1pZn^VbHF&Q);9{v2xDk;@e z;>WgUb1(F^G_UOma=tj+K`z5_5{v)(HQ-9xbw{_;W#^=_WB-?HrK6xF6U|OT@>|CH zwE&C-KlEms_XMlKML>WSV@}(7W)qX4_fZ7yolneNM(jt62_Yr!*0YX{Y3+;es*3dO zc2k;WFR^&Mjb)Z^1J`_tzyw?;aNk5pj*9b!<~1w$)Wdf(fCaD8I;K^%aK|;+@e2GJ zG%$Y<8Pge6KHxgtNFVs(Q@p~?o;l{x0fIplv%(B0eNG4m@P9%dbgrLMelw*GK!s}6 zW2{+N86)~sYU4L3gg$4OR(vE}|1zljMg)xkOHS6{NVXwi0NAvz1x{ZlRH&3OpU)kf zKQF1?-natL-Y!Six}OI?_s~^;jDue)*M0lt9Bwq}CTN~LdW$v`+P1(MXL3-jXm6}L zqa_Bi{&Y7JV}x{^-D!`@WtIZx0@wI~_R6odz_DyN&4Jg}39sq&84t!Aq#@wxc-e}- zUB1dw`$Wllz1>`xP~3X!{$&B5gP)h?rt;B%J=N;Br;*By5ARJp-cR>bjSu?nTlyIM z)-9tk-AAnUextFV?h-w|2v5H84A3^u2^*r&1@ZI4K<>B>=iW4WmV~WN=TzxKu1W$C zUcmS$p>F`!-kw{YpDL&0s>%_5wO~gaC;?v*Gkq{CX9e~;rYT^(^*lHWS7?0n-TNvp zV4~v1j)y_*Snvb2*OB@W5w3xec-T^{%8>^@A@0)4#6T)V+Cj;PtpTk1OD6*4z*FBIWlHYu;^g>I_FF~Dg2 z7hQP&`-UYc(Df{2hC1mHj8SL)+Vr^!Cy+m-6*tX-yjsc1dZ+tlnCZSX|DB(QAqBeL zEkS+aeedGSHu=M)4D#F4$@7o3slEgN-?ilXs`mJCuhc*x`X|#qAxZ~D3P3COOjtlo zngs)qsTP`-W2aQ4uioQb4G`a4-u_wgU;tyH^n0;wr;RcAFBho1w)0a@?T@q_h4H!I zZtBbE$Sx!@1f!DA4jVD9;?|=-u^l^ZX*3mn8Vi4epAiB43{lc|2Nr+mQC6R;O6_{w zu)Sy^EgFM?IdEehI_Sfw0i+IKYERYsy4a9B;aXwF@axd0pp74Wi;*m_o+9wlJ~aaA z0fTd7qwAs>Oi`d^xRLB*f17E17thp`smOnB`v^Nj$z^IaVP*~uZBFM6&;LH&k3HjUeb$b=bJ{ju>Z95XFCZ~LMN#v9;q$1Y0kh` z-m@^tlw($2HRp5GdRbjSju~hN)@?64gmolSl914m_AnemS$Rw4?LDn@>p$&z0?1l> z7G4h9vkKJ!F7?Qk9PZtC5h9UL$+a@Pr#v%H3Qc-|lEVrUr{94lSR?ENq1h zpRLcN^R9ZQA5FohMUc)|uusUO8VUNVH|A72I|FD>?Obdc-oB=(;l>XDX1Pt3Npo!A z*{Jth6Jd9p<*qIylya_|riLBu+BQ3J8lo0EeEQ30G@I_R7tSAzr&kkVx!$~b@ht}i zlPG^POfekIX0O&=LwzVjfl_vM(sj|PUc`D2U^3HxB@TS;4!A$r(Yz7eY41{Te?gRd zNkINnvSwlgHQUrX`*5J_KR-51Oo%3#=ZTGa1+(Dk|_m-{Fe;OG-sm&*0j9nIMfomV9jTUGgFZEhpC zQ*V*zp!XM}m$w3j35fb7=-p7e{fqta>_xQ_h%qItpucrlz+U!oyM*COd8zqCu7FTj zr&a{p$%6XYbw(qTuqhgTkw!$YXm`nMe_dx{o@RDhDO_#W>dFie&8?tM&C-Ft_1l=# zje|b;%-!6(MbLAF0R#F2Qe8mr^gw_>1Udqp5q481^E?%Be=xK(Rln( zbtO?Dahvh?yi}6wAn9@ws@=~=mj^?`4`@H1V|y!`C6!W@Teg$Y0m4R5&RirPxfyg0 zmPQ_+5J5T_6Vvn^1i^H5e@B64nuMW8L|| z81DWdx&T4Slit?H?R{Va(DE2C6~BR?peL&#IfKnR-QXP2SC?~bz6m2)2=9lvX@8=O zZpxY2!EoRkbIL#w!p8-lSXfI42hmeP{tMi_ zjG6sC;yCO3^@+|q6!+!W=Y+RY@3*@MHg&JJJE@$PxTTw=*KKuJna<}wF7MC2kH7G{ zyDc@^n4U)EY5-143JW-O1zlZdC=TyztLK9oAb*W)@BP(^gGPVDXbPFvo{TxidfkhN zjrH3}Ygflb-7@gayW+t;|M}xlM%cwUI_yD#NVgYe8*`;?waa&x)-BQhR@GiE#pAo2(zk*VsHFJ*zz93Y@UL(J70ih z%Q};qBeKDhW=`uL;Gg7@toM7;7PK2bwuSD~;`CW&U#bH79Uaoj^*w6TFQ{Eljb92PBKZ@a9Zuyq zrphdMr}E10T;Trl28!Z;zgic(+l5iz?TI0-N>EFg+wi-X8unz!;2TBRoaVoY@a*#L z4Zy1r1R(*)5opl;S)b#%exW(6VfxO0Azk$uXQm5OopDEhxgK;!_j`Hyp@1TR8|Qua zw84~#p#%dEfXdi$MucT{|Ghnk*Yz-Lct_WwQm3$OQj-NqgpAmZ1D~>2(eLNbNPvSC zTuhlh0!)-pttSvkQdcgK?|3vp%u2vhrXj!3Tj=z2#f3ij*Ob8Cws%5+7We6&&zkEZ z>sOPLnio2PdqOd;7aKafugeek`nR*TRGqii;Lf`1e9a7Z*JXwTA?FbPUG2RIKk-~w zNr(fqY>m>oI(Z)pxcTGSttT7MraAV!8kPL3`0Zi5#bT8$+Cgu`VcigNh|4&pZLz-R zP8+G?o5^)$ZbW$iz2MX7Qo_M`s~VkC+`zVk=0t0~U$pr#z7)uRaF`U>ahW8ExU8*= zdg7HBkuV(3V>;!HUY+3-{9dwgc^pJT8;x@|4->x#r#ta+haeFJFot%=y{55Sx7@q* z(kY=Zz**DFIV66fE*=(xn;@wp_M|!dqg#0Rdq65UUw9Z%vNx~=y{8cNtR-yx4tM?D ziM~8^zk6@KfnjQZZ;X7ng5c8zT}P1mw<>^X6$b%B#W%<0j0Z6i-Edfnw*wv0nGuiHpB5u9Sk!z4xw|3$B>VEJJ$9T9uGsftN$RIm;4e<&RWtk%$w|A-I` z4Gl>Ni6-eyEVSQNUTe|iLUOAy7Jb<{zaR?Bo1AW2MY*YNj?dL&$$LWK*Z5jGI=oJs z!aTc9)>c*sPdahWtr3S;R5^(?EsozJu4EcG#tgnDkLe&7QHSN*_cIqJNzXOf5pNuW zDq$^}cojlFDB8Kag()b?QDo}>lpsGzL)%dw)US}-jQzTSJ9XBXie#mdQLV5C1M6*z z6g>H>`)W*zDWzvgVZG&uTqF>YyJ`-9t!=EyMrpzg>u7MfgbNdEK`-d&mDNOjbuo2G zLvMYP`Yzta&_BCd;UBk?pF4SY#>U|TMlez>O2rqx@6`S^X`6Vr-leQ;E=rfY_xoHD zA%1dWb5XWhl+ubVR#SXwy(BNM2btQr9yZbB7ZeJ6`G<5hR6&2o?0S$=KJw7Q3O-SZ zzUy%k-7?a+Izp!BeRnpY8djQMm{v;NM=SYdOZ(orC1*5zYmOhC-LJ}dyF=Y0{~EV) zi}lX!LCNT^hnmjbmtfNoeK{^@)=NqVDB6flWn7QYUE5GtGT;)FG#vD zkDdPy(LsYL|BG90aFz+6hH59z?8nBNqF2B_6!;;b+7IFBE@8RO9NCsh#qbUFof94q zjt}AAU)jOXr}sNDZT)NHL3p_nRQpzkn^}xakFRgSrkh#%xPkzh!TQt2F4{G+O6a#T zC;9sN@AH!fH%;@*X2XKHOc>I$0qnP4{KSL9+G79wDTiB|ox~dN{ zFc86sP}jQxrWMS5HO10=Ha*2I4bXIu$ z9~Qt9k6rX@^6%bTJ)BC)iReisw&&NnK4D2e1BST_(ks4XF(Ps|RL&S&>rQAp1*&3*%iQWdX+%z`DA)@ESafLlWX~+ZNap_D3x?$>Lsmvu z{9*Vcvk=t}Zo+8sj5hrSB?+u_ybNsR$w}67v8dgjng3bkUi?S>?{a>5+CGysQ9XFK z_u6r#cx8*Y{Br8@eDYSII78swUUaG&IrTr{H9rCqo1;ZLu7#$} zB#N^LBUvVLN;!wg`^DSBPe>hS!DWkBM*MeDvCI6~i+LcWUZJ$#n}-O}*#0%G456&{ya4&eoHQ zk<8}(_(z7VC!1Y&$wTHNE@^v{v*_R%z}uS z{IoX#PTtircEk0PY)N;YAXO@sam4JWoV=5@%e`%cg0f;dv-a<1O45_xC_Oa5s|r~B z!Uq6Ya|nCzB?Q076-mPzcTz}Z5PvE# z_A<8pd0kLCi3nk+n}IL09J$2l_tOc!_=c^!SUd2R6ZuiaKj3d@0?+ezu6 zY1=6EX1Lv5a(4~U>$EAu#QnZwtK(^KzU%%Mfo`M2EYx>Gcta>a4{)<-hLjk1+}T%B zt@Qd3(GdQKPLEf!NtgQWbvLQY>e$ZuG;FCvr1@}i7Kp`HJh=u-I6*$W;nMoz(-P5N6--SN_zDOXLkpU1iy1PWEnm19KwWHX|v+)L&W`U0iKp3_0$5i3f|_(pbFDPN=Xn*^zP zJ!zF)P&@vf^S)=9?_Ch@npGH+N)}rfYMX;%uq6x85cbWA-zJ06ISo7>UJ{rh+v!5| z{6uCYTGpH{_$pu>$F4zwxss1>*U#V&$rFl&-OsykkDBivY903`nCz9AMU51@qLt-I4K!a79Tm-6+hsxCx7+`-@D8+H{E%=NmD64 z)Bo@6=uPne`iINGeVE|rE}K7$j~+0!(3bM^^kCbQknbl+!LfBK2^-cX`z69L69=jl zb9gaDA+GJS+YexvIEx1D+xz}xgN`-Q*ev?bXe-|hCn&$IOIumBtbhz^G%8TLOH3d? z!-geiWQ3f^a|Qir#R$d;Tv}R#eCm7r((pvRcHZ~{3o3kToZbhB;+NHRo-En!#I zcWko4&GtE2+o2`Q6tL*`(kzCn&Emsj<5ekv0ULZ+YG+X+R=nPoRu}|pPS3PBJugx% z@hB0N4aYp`vKp$uTn3x>=XVaz?Dg(O07%eIX5KWND&7y=mMq!9DFBnVI`EA?K==5) zTHas$Wu^J?GCyNB(nD6H8A7Lyr_iEXKHT7OU{;X_chZi?Lk-nDNGbLf$0bRl8E19# zoifzAmVKQY>m5U;A{u3{`!)Lh*P+Fa{j^nLs&=NLi+2}>nM!|VorgV2j*SB#$i4aV zfIxPAx;XsKVEp_bj@?+@^O}K0Py^0Lm1CxuT073z9|l<%;7@D5S7xlL0z^so0h^%C z<~duwUY&70@IP~_MJb?@yuCSKr={H(AU96VQvzbEPzY$6neSNxm36TYH{T^EZ#D#6 zvoA)?bzhW(F8i1oK0Ov3(k}BV7isQQ>fsXv5eqB0Yd+wZNuHdM1>tq9G5WvpahJ$3 z5XF6+q(1K+uP@ilnh(lSkzv0EflprXV- zx93MM=^l_0tzDa9si1~fv-~4HdHr}uY+FIg@MLT9p1g*t)4w=Qvf%BA-QrI6uU`r; zq3@UMV95YNsaFrVX8DohHOGpmnbU)Mz{DyDM8tjfH|mG7=>Lo#BIGj)8uWPp`9HmCk&f}EoG{A7hk5AUp5)4R3KIiq2k zh@k`(Dol)fP4_>gO^@+;FA3(~7^gdsD;gAqj&U{`Fx z+Wqk4zxe&3J7!B&z8vSX`rg*U4{slxg10bv5D;*l&iAtNGuPnd_HN>AsAF?G`BuaB ztvTS_7x+H@!`C0Ux1lg0-&CsDc^+nLBLzLTml)_(L@QOUbY30v`SYBdJ34|oO4=*P zR4H_JRUnATTHVvfA`lV`D<%JAZ2mo{%R%|9r?8I1^|1cwBh;#pV7oQAh^IINbrkG- z=4tQ3B*3Tg$4cO7;p+5C=DSAT*u=ZrkOWrRf(Ek`a?k=AM?mYu)r|4Nn(42kxcqmc zyLD}}uMkfv6SWM1r+0hnkmPZRE`Z|aK$om`GT*tlQ%QWh)*W&Wn%`h|Q zKzyZKzP0Y|DCqVz5bhz{5IC0`LQ25yy*;jSpti32o@*KK#wiIy7p4^8wLd~mik^Ft z!|H!hE5%mv4m$7TQ#$+oMtdvPr#Gg5eUI5=M8|Nurb7bho@c`!o}=)ox(vLCH$Fih z$@=Q`5&d_mqTU*_rPC@u*U2N}u;HloMlyaa#1C_oC@_ONAc0qQpy}nh;BC@&C!eh! zKoV_I?}vGz^oz=N^#cv*!MRx1x*z~X#?RGz`}@fLh4~hCq9nPJyWY-BHIMr+Zd|xd z{0H5fjMlrUs5$;5>R1htmq;_4y0fFG71B(taWN?)%D6sLIV8)zWM4sU%Zhj6%s?}w zf_VL3d6PKK4bq`5A{<}OkQsgD0)ML_`D+`>J0ybr21H`ka)FmvMfImvd^0Y zWihq58SaB~|03Cq+E^G+!W8?Qkk zZb_(@v=((!zg^cpPik>AtCXyvKq7i+GKjzL*!5mHt#n`q-&WeX5QBTP;d=b#h<1?<~84*(&K1(!3tRS>pyR?Y9w{SR3m(xi8wQOA`@ zTb{(}dr&wSCyhEyZfM;2(1Z;4_T6Yr^73t!48{6%NPy118`zo0UQn8-EG;crmU+XP zRD`CDyBUy!=Q-!x8+?$q8md=y%}lXS%2ks>^cP0zrm4_p+qAcmU)~Ncu|YtZ-`-%W zB!Z76dvJD%6}=N9h~SR|xH2d)Dlptk5~!OM(3VOka|!dF;F07%BpGoI37}tE;XzEBIR*!Lb&Yv`qWc zq>}sMEj$3}nX4CAyNT4hjD#}KLKNOFFmyMi2U_e4+Bjem$@b{^5 zOGRQ~K!QWHE>H~-=9ELNy=_B|pEfBib7l(3(e`VftyI5_4QO@Yb(BHP&N6iTZ+#Ql zTq$&IlTL9HFGQZPEtf&bIK&Ll`bMV8*L0B&Nn0S1V75^tkefMT)|C#!hWs77{DSrY zSoHOx1U@T_^J}lDC&t>6+NL*QctBjE3;)}lrn`uk*2&s+%?{1McDX**qj^xsUYIKU z(e_>TW3>))C(Q)(=9)nBkwmeSE!r?i{p1|t!;1t((rW6K^p@&ExLE7_hhkQA-W z&$z>7PiVwNm<5c3;}Z@+MGIqsfHoEOXXSgrh}-~kDVV_b*cc@Lvy1Vm`Gy%3G@*dk z=)XQp_%d*~lz}^86X@JfqaH*eN7&k(iEsZjufhfGz5-_bXMnn+2B`1m;l2siP) zptok~)E28G_hZrc$2{xHt8NnKmVoSFvww;pQK`i&`meRuvICoXh;=IZ}8^*NcMtw%^!0GE-o zS5!%HHk>Sx(n$=0f_|;#+Z~=3H4q24pa-VCSecfcI%N7VX>J>#veO8je}FZ}G7rTG zBKdD4DL|)kt$T@K@jyr!*niNTAX>bg=f{MRVe~Pzdp+rSLo)2!3crvmvlY$uS-SJV zyINP#wC~39GJY{iWN0{2(xprnOi$6^0y)%HvTZ@=5iVa3m!?H~OB$z=s!fllj3`T{C7Y#*ne z8E|oNA&d?Ohq`F`T5|SD{M_6Iew#rS>t?XL>CAlu*F3Ou;%zeY&^EleqxkcCs2S#V zV)hnnVdf#@;1%?tE{|T$n$E>eC^B1|H%mUZ;EvmD2iwm6%eO20e6|_Ujb&q;T2UqE z#qmnIheNeK3GIRL2?uyo2|a)!FUeOAg?Z^=41`uC{r*G3m zi5O#cbgQNO;l`ahI`|oM(G><{O99!1O-Q$9s zuC3#90{q?uA8rPTKF=wr6f5N~hh-nSo%(2M1Zo)mcxAFujUa5EKwDnCNuHomug~TT zUOcRvdDJY7)K{*px7tfoG7xwXy2KnlAQ>v=&6A5@nD}lIv*fTN83?c3mcwR1ISmcm zwuT$arf7&cw?C-)IML^PhUKA6l4eVSw_A-bxbs$_MdbKT*`dD-RvxWce6-O z1u#xbAMwDs>?IT0_QniA;9d5*IN9{Xgb z8OGfYjEynu;VTUl8D}%(TNkh0h*S(@SdbD8nBDrR+WMI-D$fbN5in*f_?P z)5^KhGq^`IJ_&Ok8;=wlU=U8YJ}0f%_^1EW$s z>WswTOQpBRj-1OZd^D>9erFsDf*aQ>7WGdyw9gt!hh1k-vvWy^x%Sf$H)Ehn#wO&x zsD_8)4bUaw7pQ#igW_Y#b@5PuP=>?81vcM)jrSr65g$vH5q6M5RFnuY->8s{lyxmg z15uDsHxm_Dz!@t4OFSJ;3I&E_7M`EPA@tO0GF{=M09K zUkA>pgFpJlrL(qVUI~j}$~dQZM)eMl<4Gy*LbwK)_fsf(X(9C}{BLG<8Zg@%{48HL z#fYh>-CVq@V-1kfjteF7SOJ_@-@y#UoV!$a8L{)T$UF=oP65t!H9LyRlXL$?^*`SA z*K&Fsk+K~$(tebl9s7qXa%BC;BViF%-P!8mA^2gwabmI5i=_TZQ2{e5znDqTI1e!? z1Gp6n0k=DQp(t!?ZZih9K}6AMKaDX0Yl1U15IIhT{u`af)J7%BHF+57#t}watBG#} z2Gd=DwkeQTcFWW$GL3{Q^XNyrcALnh2}G_}?JwuT>WBVN-)|1lEm9Uk0S*0>TThsC)-0`>gUItCEw7(;55`QnI`z{ zjSYZ+XQzV0wUgoz>s=0$$_~&_#CC}TD^v~_E9ytbaU9+cv(EsOn4{}~u1yXWs2@WxUM|Y)nS%^f$%un(HAtZNCXDi>P>jNmMgTvjIYO2BZppfX{ac}($a zfTU1%?*s{%R4Ez95J3ozC8Oh<16E}ub6s(`>q8*91Pnz2$H1*A95al$Et5xxC_J1Z z9JVF(;RPimgW`?%xZ3UEucc0U0VLqeSDiM#$HV-8J7ji1){n#l$t_5;OrbClyWH0s zttV=FiIFXp`q)Zlg;NMFTVAX@37Yk%!V{w~jmpncg%W+oK+%bAwTVOoPHo{^5Y$K) zwA7T0b?GagbzfaLLMz5f>hK`BjK-O9A>%Pe#Of4Qh6n4Is}g5O6fSKvh9W z?^XOHT&$kauK@Y($M;eH;~c0}eS9B&DFmYUxEX!{o^ZgYHMIv%?GaS5>x8#t$Z`=S zquRWIQ3RwOgcFQnc7|*2X56v2)z8j2|4o1_lr3NIsKw20qg4{bD&M`$lE( zVNh4!_^l~Yd(KA3%ohrhft8FKwz!tK z+S*R1mGWaz^AV9yZS7-5*E(y9=R!*T!i|w~a;9-sq@ESu)9?N@4!skIxQrSSSR?@* z9?=pC#hKRVbf*;;!@dS6JE$(ExkEoF^@By!%}krs?wj_&pQKp8&#d3$7mznr7UaZm zdbet=?!!nRJV}bxit3s-rD>wu1Ry-Cu|^>1x6?veDccN+hfu&8>Cd~aossST9g94I zQRgKi)uDW1{prhRV+&lF7vbd&q#LiI~4uAjzgx@1FntZ z>(fEP(LECBAKX}K#oij|;USqLayMBLl;w$aiX;mS6-wDGyBcJ^NQ`M8a33)vyd7vb zUFY27q*E_8CHkiTT~9G$ZR=c;_P6L+tvFnT6E1VlPV(Csu(cNff*s<=0UH6CwM6pM>J2j z+XHvG@BbUMJvNzhW5qjBi1b8SnCnnv5{vc zBLnq2be(H8TQNKCHySLNw4jHY8lX{Yy8>$OMaSUI7B{1dDM8on(AafEhmAK>$(IV6 zToX(xmB;|K~r{~mAm59Yt3&I!d*NA~V~KC^^BsVf4ah}IoiB6voYe29AHWtAR* z==LZJsZVf5Ua{ea+w@XU*jSAp={h0*_#+^sfX#!-=YRGLNXOS8F>4@b=Rk*+6WA!4u zkw->5AIB(5GS!zOJ(PEct`bw!FT`TQy3j-^?c9KnShchyD6}YCdm+gTMW$Y+# z`(}ht^bGeBYQ6Eg&!3`OY9N1+I#*X$M?CoC*M+AdT@{k#)BJ^z zk@4~!(mzNE$)TeAc>H`-nGtQ;j-^LJIAjZ9==9;P|7KY(J~Ngbk1_S+;J!Y2#m1(b zoPc|gX;eF|fa^LM3p%2}7Lw;j)Wg#?) zJEQ~%oIGBOjBwJ7ZKG1qLvb8B z^v{WVumg}ouqVQiF5+!AZq4)`Hr&C)2E;K3hsX4}))=3bv|1Wcsy^QyDa=Q9G~feA z=ivKSN-$V|Q=Vb-q_o#?oe9NYU_nSCvVEuFiz#UkHS4a~R&o>SB80R>V7XtiNeo+Jle+a0Fl*iQvuBql0sODr5vymI<9&KGL zZeG)V@$KDDeno?7Wu7U$C^ayJP0uKVt8J@?6xW2xlqK(ZQ4*=y$YvN5<5rLdW^;6% zclWQz%@XsQns8|2wNH=TK~Yu9|1;|e4bi{E}z=F6>b#0I2d2vM3dQ3S6TCFeID63EOqmzeXO zHGT`%Z6hxzEzDQIA)FMyW-Nso*BhZQ<4B7{{b)a)+viHr1Tpy@?y&3>c=pBS91Guq zNS(6oS0Cg=144k~B^mkppOJ1zT#nH_b- z^>Mgc$5yzv*TcFKsL;W069}t9qE8|wM0Hwmqe^+byflkh*aO9D<5M5M6;>3M?Z^L* zOv=km2l^4F&5gY+Dkz{e7(E1OBYU7v#_xo#!B~jJe698UT?wZN>sBk@7s7{N!LWFS z;R94oTANsT?F{-_z%H^T8mB_?%9p08XDq`d^Pd0FPQ8FjZNKWq1($KY@aq@7o}^G3 znf3^(K7<~it!=Z$-FddLKydOFp(0tJZFuA8;M7=b+{xVvIGO|{P|X?ybS47u*|fWB z-OoP}8Vog;_HLZee7yvh(}gYLEEfdqovqyVwj1Jskj3G2ekE@obPGWN7XSX4Abovp zNy_lCZEW)&7%g0__!LIlwRG22@9EG!aX!cJxLq-T*Id6j^Zt4To?8B3>*6=orl}B< z-VU(Bt?yfj_kVwM6gubA!L^^{9f-?U>O5j(wJ?G0KmydRoCT9fKi*U4FQi zP!uCX!T|vZi#aKl|NM4np{n2kJbklUjXL~?F_3#|t=zeVpfRT}qxD8aKHgjjg2(78 zQgX5hT=JYL6L0hx>Tj%Im=JhWY?5^{N-`2Th)Fk^Ta>ODQEe^VLY4Mrk4A1f9g zQH_BKDDKF`N3Zg|C|VJ`IpuRyxt+N<$n8G7XCgVl@1A+FF+QWJ@%LBjZjO>OKZE2F z-v8)wA7md|uIsX#et$}+s$2n8-hs~zp2x==KdrIf+#Qx|w5&BhPGxJyeDe8Zb@c4h zl=s;&zY;;vIyVw)6gh8l03e<0^BrF}BS=|QJPN`f)pv#LHrLg_p({k@a4Ku=Y*ibo z?0x$i=n)1|psl&3huD0G$($TufArZyael5`LWZyRleIGwsEwEF?O}4B@~w|amJ=}@?rFz!d;{Qy62JQ=rmBqx z(A*TEr5^aWa~5(BbR{kWmpN^@ho#k~CI&@tvD#xtrDq>>w1Uh3Y5_{&Ng)8;As=zG zHv4;%I+lzVRD>N0RH5A28I16E@szNAIO0STU&CFDUN7?`P!R`CkY-8$zSa?>(DNxk zosLjH*wPRN**gu0BNH1vcM08mH}190ia&BGnq^S*lNyr1I8Qi+{J3{`efkH_k|gxw zRbrAYjox$W(!o`$TRW!*aYNzrDwjc<-?+RpH?@&hW6Np*pZ|voulKzc?C~yZpZ%*< zSSh*ka=$<6rr-K1Dk&{;xZTF$DJ~g+It!gnXZoI56dBU6%%O~1d7jGi^BI1vHJ*K? zp6=flq?7A-|BfNyR{OVuYWjwKc*qTuB&ds)HmU10B1XpqwSB>WwAtN`l0GThvY$mc zR9p*p5c?P|a7RCRKK|+;xw_s`rN9*$=WAd z`zPEo^1AX_eLKs-WymsE%~yl|IM!9|$7QZ{2#IqcDH7Ddn&_->7i_J?O)1zvUe5Bp zr#XNH7 z5B*l943|xfXCX%IH(H0B=Os8isO%z+ik`|xrZU}yr;i4K5=AU8B?DA|UK4f_FNO|Y z8hp!-E$ZMD9PaT6=0@+}7fWrlTPDZcl{1YcG)C}+g3^Tc?P*p?fbXSFbKzV@<>u@{3_@&-~#n?98Fy6rTcs5`{jCnL_8c2&A?ZIfK#1gsU+JGf2`X(70b z?#L3M3kR6==3zj{{07%)NMj@^M~~e{WhwmW3ft%%b<=62FOUXUqbN|V>rBa80z2NI zAar!_9vlQua|D?KM`f;4J)}I5l!duVh$m$ifb@(bD9|id9GDhY?(z&qjx*TBQ1#qG zc615H5&bO|R~D*3tQ6BZJ%50M{s?{6x?jf?x7J*$70!+|)5=z=p5~linf^c=a|dU- z&xhu4#L6|qt_rhTS`D+7{HzK=wZ$5&c5lw4qISvr0ahLw!F9*2`^SxIB!_ABPrqAA z6R#`8!R$$&D_~pFJ%NiWGU4BoMonO+RK8Y4tGUZQNOxJBQ>M6Q#0aK9g%|7F@RFo| zsGirXEZN9>@uhzjG5@#KcpKAllgpP8_?~{ezvzK-`yXwEUfcF5)7uegIH25mdGJ=~ zKKcIVixAHXVhQhPVtV_Fr^zs7?e4Cr|dOY$GZU&e3cq=EjUj(q2VhK-et%AdUOHw)sEqQ zmi|K)W5xTWFnXflz|R+I#JOW9UtH@BO%Jkz1{3EyDTC1jJQAX5{5Ru!sH5*^ogeJxxYfC zgfIg!OCrTQgqP>9Yls`yZcU_?R@F1kgfOU)*bpsTj~1m-eZ}4tn5?9 zprF+jFUeQKQQ#zba}26mnQq1jtC~hw4&~Ff4z?GGfG7oaLQEr}NRM4ymW=ZDt>g>6 zx@RQf%t)n3O(dxB@#Q@yQS|@ze958)jsUMLDK<0#dE+u9EAzUST3R?%u~4;eQfBY# z25$`hw>)NiILvU4?-_a(MICs0S*&rL_OmC*!nIDQ{+O4CPj&h$(g}P{q;~ZfMk>Dv z;;h}@Ev9C=U*zW}8Ms15o&Ee;)qZV>8>}oQ+fwbsehCjK#QNZsWdNJvlG13w`%_@F z_|n|b#py^87&5r(_rSCIPDyZSY6pS!A%cO~`!aefd6nSqf*8TTpYq^WBwd2l+Mq+q z?`-sr)&sA>X9siISIL-ED)$3e0grqS`KrVfTQ+}Z;m+dI=2^(KnoMPKF2XL?41nD5 zVf(U6ka497DIWXR$Cn^i6e5Pta|0*MR%{9R=u*|D->^<2Uo4ohJSt_?x3?CN_D$0M zCsBvLmi?&qFe#ycQD_MluIfdM6p5$Lw**78Z068r#Co68aZb?)I z>gFaVVrALDVso2Kv0zK`TjaezXLfDegj}Kuujf>EE$;fThooRfz?8~v4xA_=y*rqu ze)=p)J|!&<+45PUz8Z88J}Le&GIFD)(Q>}xt?)4amKH0h;<>;h35Pt{t?CrP9(FFL z<~1uH!=)G_bkeHxfa4X|$(0(-grPyBbFms=`7Bn)bx=`I!n5eC-*6{?J~p74^+Eb# zD?p^=J)1Y!N|VLk)pw{}wHNbtcD5b%%+K$1kP_ad%^(xsz1{fR0y+a~XxIv-^W-(d zzW|0-;aGZ@n@FPZ-4qGMegAM5Q^8h?L*lpvZ$2iO4c1ChImw8M%Q!bkSOPp6o?dW` zJHjJf`80^O3v!vgF*C>yToHkTl4C>lJbX=;=K#PG*I!pT$pfae;+nLKh+{imMQ@f-T)zp}A@dw&mUx{H;y zhfZ7+xNZNLr4y%RweP9Er}^E8N{@CR6Ql`U^6KxZz{1&TpNfG%;HvuKqCcBmXj6Sq`&;|LOzNZ^C4pR^b z`p%6WnKF^H#{Z<~z4tLFw6&z9Z>V0=ZxdF}C)?*LPn5D(JVr*#emFCv8g2^=omaMw z5RH#E@_fI=NcWnkW7!QeP>}AT>ADX$JHFU}mH(j8?%JcYT+7+K^VR;FDWnj=Q|s4N z7qUq~(0SYH2}j+G8*oKCve|nskbpXk=H<5b1*~w$O>QQ0Y|ON;S4UMI%}>@#ir%yI z5Jfm%f#ET$-1s=!?G4+_;=HU13=**O!hcxHo`E?zz!f)JJn0QT84Syzj+eG>+wYVx z^wr7ZZStZ-Gga-wX70Qwe!oMFG(wG%i6N;&S=&!Z@<|$`5a$gTE+ZP#ILcfPKMlS4 zRq#XYzoSLBlP@27Eb`gXOJX9hCpDt0Wn0DLuP{))Ugit0YLYH6JkmQVzD6MUP#Ep^ zVRM5EsJ|(GV@J)5{rcu6TqYeVRr(E$#n37qqXRT!)K;WGRh26Zth(lz_J=!AxoU9x0t)6pAx%%pzFGp z`LA<#zc{~xLAt4yWkMRGTQyfaVN%_87CL^q`R^WWy4S%p;YQ=NfM8Vtj^u(QQO{8V zohA+&+?{2%o_#x$oAAmox(1fjUK6oO>A>`Ai{Jl5QedIA;Vjm6IfVE#!W?bQvEMxw zBduX&;t3KGKmRwHaOm&e-zjPW#eNqq6*O^O$gfS55$C7hf2mW z1HwzR6>nOp!J_kOx^A-{QO}yG&_xZ;_sZD#{rl4(3ff;kQK1-FAkDZmekLAI0yT0a zHWuu4lsPPy{n0SeKy3`0%iosnEKBzg6YulYhegl&&g7JJm%kp)KgaOe6b^G#_ z-Y^!0H%IQU5qg|_4%ilJ&m{5z84)=X@B*!;L9CF`j2BN{G}X)#s{r?e(u9js=BVtl zQA-Tm7Yl;|1c?2SO~qiIF&E;QQdxV+qN)ICR|Q5h-q7oj{2xW9hb_Zxd;d9VP)4;C znbQ9q%zxUVNc_$0$&6C`2%lI|G_P*V+#{i}0J4sim?E|aIW39v1wABA$I&T8m#^FR zb9w*Ze-y3y&Vkg*ArRylle?TgLgQJB8;_s2bN2<0vpL%yb@N^Lj0zo1V&pmoQT}7n z$9fJOhF0V>K}xO-Vi@q16ZdmY?qGdMFlaXEC7~&3hW%oN>1g9#lzi)He&AO?1@OJ# zwj>8jBy@r@O}yR@ezN)SrKrfl%k$F}NKn;>Yfn!Bi{G&2(h6$}DO4DO$5vWYqFFcl0obU~j?78C+BS>vq zhnc+t@~2+`|4D#&o%4yh^vtd^0$nNh-TAxmoSM2$t$c{ERXBK)x~LKR&1>fEp>luL zg%_P_lptD3y5a!h_+B=u*a(PHWWT7+XH%cNl$CsC)n&=r{7=Jw2+8QPnrr$DVZ)_# ztB!7&`zVezY<@Y%iv?#}a^V~t15pzPn3D$&uR~d+Y^@HCBd-X|54A`*U{sAbJZhe? z{PRKH?3$<0#iwPC!Cxk|BZGzMl-DwF6sVs>%~wG)GYz6Z4W{_Q3k2jwsoK}A+JIeg( z_hBCYC@uO0zKfd!la&?be+y3c)rNTmWV9(LIY675n_z0Imrq0FlZ7Szx0<`IZZ8KO z{&E##n>&g$SG2tx75g6eBwu`G#ih*In@TsaX?Hgq?VOk356)5F(%A_XRGc}}j8>oa zg@3~aN_=%s!1kOxdleN}XQ*qI@@%Z{YQ!+VY`py?Mm{JN`qZh(eB*Dad0`MMTjINv zolXAHi$I-UhyBw9A2+gBT1D+-56=DFq|B3}{37lK(~FLV9<0SSpOeHfr!t{NqYFZL zh>(#GvWa2+iH$K{e&D**YcBOgGOr>SapaYQ!RE6D>@O%@ql_^2@PL*dRx{#Hk$hlT z^}ufOaJULXdHdgD@TrSgKTV_s|20&%P$x+3GXw~(1e_hFDJ>5K+ zbAz*@++@pDyPSI9fb=GzMrekjMZbEzY!`)SHVVIqyNv~d zBSZNG;eUPUBEi3HR3cYs<9#Wfx0r@Tg9Rm@t1j4Rq+%2X0SpFT4ePI7*rUe-N0~_m z8Hp8p6}K)a8qup+iY}QC-nvK1M@PDXMp<*8BTa7r2$asqu2nQ8g#_vq% z5CG)ENa6SWErV1gd8t+{e9{`d@6o;8NMeeMgESw!((;~}*8kPD;n<-SBR`*=7D}lc zlbhH_`eJw1|G)r6nFaidX}HJ47u=`#^POjHC`yHs#Z^KZMAou~#@HH772GNF76^Mq zTPhYrEJ0M4%n7B~Dzz0>RxOAVzoJ7+V>EY60V3jh?%-HEjF<5^S{mYjCwczz`g@Id zrVBn)0q+dpY(sF`e6^?n83<|H;cBd5P32jP8+L6JF6sO2Dt-L&6YNTLRD+Ta8N|W< zC-t_hHtC-V|CHTLyy?pJ+A#-fMnuV<`<1pPomwp07%mF+4%SZZ4X^S<~AWJ@7Wbgv{`y@IFo)=6yfSX^(OPkt}sz`?aj3S{MYaT8dZPRA_}|)8sb1w0}vb7=An?k_&qCAL*#y_g_=ERKu+JbVYgP+5N-yY zY8n=kpZ;*A{;qowT2<)fA=|FGcYdZU!$U5hrn1HoLyLu3L44y~@{&~Ik{C(sR+-ge zZfKru*WlcN1)Lv2NVmiO z>)0X2Em}7H>f@pQLdG*m577mQHnA%K0d{ZkiVV~dK9>0pBu3NIOUTYlo?cx}7oza~ zxkliTB-rO>NQ67B$biBwS^k1gV|UwS>^BHyE#4kUywjl`rlKKcn?FPC%cWw%ZQdfW zFPk`Gz-zFO<As6xq=RU#_#>avfY5vtB`-o%_CTLi=WPo+dk_vOv}K+>t$( zs>FcC_{Oek zbfvW;*F}H?IkZ*n_v-XyqNO<{|ss5We9>X3=EAA2#FHcySZtM54(`~pl*OtW34ARxRzgb(I zuA+A?liloNd3zxXVPxq^i+hFp+ggOSW;bvhNTh-Q=xnshq|y2`9}Fj3{p{iFFvHV= z`hztF1F~gk)i*nTBnbZFAxC`W?2H^r;Bu#q0A3Uc_uUa!A#R(=v>#9h^@b#Z82D-~ z-3_8`w7_fBjFCO39@OSLY)upL4LNJi?LZV@=~Io%p)+U|BMhj9y%Ddd874S`_$0`l zF1g~xvdezQws{1@yZ%+`-%>eX&n8X;lmY*k-KV7}vh2DUXiqRwCiM3wR;23=h!z zUE}IN{>jZPsGG2#O33_RPgrr+a{Vh4?A z@!g%#dU)AL^Z4K@$$}IX*O`jmkLJR$RBRs2_-0O62VU*+LRIrEKBv)C23{MT6KlF% zlK38fpF=2A;gZfdfXMB*d?_%p%HOgUVL7}jXu`nN!45w@6jiz0tt{3jy@!9f^px#& zT#oBynX&&o1@6L%a8kbwviZ$?xGmwzL5cI%PU%kwfp82e{D$M}9`xh&N>;r($^YaC zE(Cxz`CnY?ek`L5K;^t}e-_quG2AVw06!*X0Id5clB-8~JmmO-&si6Y5dGHuWTsP+ zU7>*=PVgQ{D$w~qDcXN1Q21Q}qkq0XpW!rR2=szk8){t*-Z*cdl1cmBvpN4z z9t3txbY|)AI|!t>u%yaW{Jd%3cExs2S+3y10;PU{;fJzIRQ_+Jkh=c<=u*cn zeb9}0=_DJ5hnh+xnMGAm6V332i&maFxLdL+E_F>1aw*#gwBV5O!@N zJ>faqz@^2_I$~d<)i8iJ^8SA4Yl#s}!nm7Iz*Z<6Z{@)KWWvSE^YT>1%F^oYJM9vq zVVAoNH6lQxdCJ%C&qU?c55~b=LPp*_NbwN_t^ut#xR zfJzTZ?#j2R0yh2e4_rgP&%M8t>^RD$ta25!aTcB&>1^;&^C&|2R#-ned-c|vCd%wN zs?D(NV8qlqVlQHv-_(&Qp8YwV}c7-dzrIQq`2CtPjD{K@ zK>rah-TkIN{R6fqHAhkSmR^Y~^Ow<2{p!(FxF-Ch*Ql1_1`TT{|Mp#(8wZl2Fz=Co z6t%m@bLvraMEEU2XjZ#FdpV7I-Y7$9)VITy2xP0dz1PsiW3cUG?EOhy5HVQ_FKdPG zR`~p>E-Bqd=S5B|o2)Lht}>!3xA#&G7C#iR7@{PAhn74rlEo855`)&s+}!(ikL$;h zyqSa6PrmJM)=J|GOU6WQcai3Q6>wcP05KyKab*7vth6?Ar0_&DX>C6nzM&9eA^dA7 zCFD#WRhwFZ^VK%{*ixOnf_mBW(&}`=uNO}Zvyx`davlF)CD_I=UPH~xmyh_`q5Z5v z^6jfen1^Ji;z>Nm{^)6Ry>@1Cm0my$ymWGXt19mI+t&`Ojtmo?XgbZAB*DqMrpvl9 zmy{M07!gkT$u;U`=ody+eq0?x!s%62X{P!ZlWEdK4p4EZ?3!$Q2PJ`wwTm)CiS`$W za?0>7Dp%JDUEzA1k|;olR#vQlAxFcydX#7SIgPH8y$h}vS`ov`d)1nZ|GcWKD)e=~ zam)Fh)Kzj2i*1buDve)@@F=flockzv2O37(d~#yLnCZI^zDc({HBXwwXG!!LTEe%%W;n zgQr&x}fuG$_K ze?}K&Yes#q+fbx%mjg3H$Ycj9@u!YWQi389P1HWueNJb3uTwiZQ6ArYWHUJ7r&Yr; zWn2?Wb;;exahm$AK8Il0zO8riXy)Q(;}rV6g7`whY%_Z$s^kCH0wBaH_P!&2v?m?8 z-gTV24hs=?H0lm7a=Ocu`9okhM(YT6s$@MqhE+_m14|8|=$hn!Cuv4s-cRc?C3QfZNHMkK~Ia$X@Px(U9~^up${*!&$FN|kym z&!t6rtwb@uK75QYQTagu&k}58q-n6|rx@nxEB16oZcdLlrRv-d8x(M&8y}16I1*+d z)gmp#LxANJxHPbBouTfj=|=Y_l8GoXjBKLiEe;#-8H!ol6myn}h9z`GVz+B758ec) z`rVkQP9}Kusy4;s&QhKw2`7|eqmIS&x5P&0V*%Kkcp{xp%Y@|XUDjAB(c9xFiKWN# z^P$Yq5vX=1b)`c{&>lH;_Fs=+#{O&JKKf$B zIBD%Bo40r8sJ8vuw%$${RU;G!VE)0I`wM#NL7AEo%oFOl z;gN%~aU99!kZtwfHwa?ekJ0w=3y+t6dCGu}YFD8e_VtOJK(Ey)99r6_q`rN<2G~4QQ$BrccmXW?~U$lJP)%38v>iaJ`zpDzv za#M}W)lYm)3-3)`bh?p%=0feG;{-R*#u2g0Dr;Fa>?D?avo*hdiP|h^i{7PrIrF^M=iSsZ=3!-1ROK7Qmjw|+E>H)%meec1|$Huog@ zW5*;)RxCq(JxEdkUV;ULcW&ZY>ov``v*Faq8LNLnvV2m_Q=p?soS@^d{Dc(v7x^cp zRlDhm1x>o$je6*mqg5J|WidMh>1O&{g4F6Vq1O7_8~MS2mnq$nX}-u^3o2mGy>5j? zU1Ztb|Kpl;@xR<14H2fm&}Wi+wLdGjmzznTrDjwnc)^N8z?=vaZrT-{GRjS);gTv@ zxCV&}kwtQN!R1JO>6n;nn=$XIqpGZ^4yCf)i?XVz7(vq=+Vyl}7?b47;vC!GI9((> z=W8$^Q}VwoDAnN9W&Z>K$%*%dlQ~A}@E#K29f1~1!!9Ck;E-HA#RzLoJ6fC__4ggm z7ZK>cmn^Ltr?yOs4Z8eumQ?=fDab4X`E7OXSs#qxq_L}y7xfKJSCB}~T4tJ+y&uvG z1Tqf(`lu0SV!kD>!oym6b}k67mBjYXv_+ebTFRT02%h(yCjJIEWG-Xr$2O4$SJ-H@ z#AXEB)~1j*QO*^cY2#tLN&=BP20f7R!~9ZQVZ_LeXhiy-t0WHZDyQj#7>jnet*Aw>j0$kO$%g00BJmYvNxW4Yq)SV$CaZRt9 z)jPrtRg?Z(`(iz3`a}p-kvUfENC9AICYoc49Y!+uHo#-jJ@`JCNfKoy^vlCSJlfN^J>JQ_(jUSH2Cr1NFz?OR+6u-%1ifu9r zV(IR)sj2Z}qkg-79oqeKT^#r>1@CQ> znA08D*s1ZlHKB!yJ;2&yR!zB3p?=-$G%A){4Cg2D{{@T;j77ZEHGMNtDkwDPG?~`lXs8{Pl;(Ei z!c{oZ9DkK%)%d!gC`p3r%u{=_Q4_;toHY#JRUp9itn^H{x=Rki zXE|0$fFCOeFKfe_XJmb9R%}Q|>i(VTlFZhZ-C;B0=JgCBqGe>naK%tRTF=*au2-IW z1MWlhmNvfZEQg~;OoCx;Zf>S-W9Jtc&YK9E-8a@~TS~X8U-U;lNssRcF%29LC|Eba zJ(2wtQw>-QHeLB+E65Ld&3n~b!k~_B!&mBRpw3z|S{`S*Liw)M58R$;Dt#^(QM}E} z=9j-sM9fS>p*HIKNz_~<1ND|1W}H)kL6;EW)QJ{s`|Ww*o}^t`ZiAffh@VfMGhYXZ zqvRcEN@E7SQ}gNHq$36B)hG%Blp~NJzlMDVJaX+mB3ZSF_L5-3zGLHyB#ie$h=9ij z2^Fq08Z!ua@7PY7Gu6FlmFoyvdQVEuICsL+L6>_c@dzSLy&|kEk^_JvF z%bpm09(PYip6GzRu6SJu4)7`8mE5n@ZV${Dxy?;bidJSjvR!0)YY6qWl)IPzJY~Mq zS6mzWs-o&jT=-=lc}0j?bs_>9ctqn6BEXwKy24}|28GK2J4SWb9yZ0q6ox}9%DBBq zN%$)UtqkWD(ZdX87Nx{^R^XjM>`@{y*aM&V59y;m{3!R@z0_7wJ@xnewMMhYjGA{a}`2_4MRd?g-o$_Kvq||l-34o z*a6#-!%^kJ4(BnJG3OcAdpOAE%y$5rkaf04SY?cpEr3-UXTg_!5sD}9RJ zt+YwxLSrF(g6(o!uUptF;?A-jLv4Rrew80t#7F(c_XXIF_%{%e#$t9H zL+)>xLcW0uoc-(8a2FL?I2r9tr2i#qJbwpoEN!MIyN(S(pA2B+gcTbL&WBpHe6xE^ z8@5)UrNxy-Wb}*Jle5U_<6(FqdUlA;+c#$5!+YiSzV}}5JB~AMXN#Zu-yvb*8fL}| zR7J)=+Nr0d50h!=#nAul#TXnO^<_QPtUS-z$$k>jP3rjAqp*YBTWOFx`7URRqMZIT z%NvxmIWYkr22wTZGcxMQ^6)VF)3b^8kJL!WpY83Wf4a)cDso4U|12kLn5E>sv?uW1 zi95Q4@4&M0z25|LJ<*Xxsh3uHg#QknnG6esq&O&6N9`#;MH2s*vJ{)QV`QZbfA?pt zbtwiPzur%8iO`awbrl5g`gg#?h>*i_dcR|4Fy&8}E^t-G#$lb>*k22SD5QLLNv!Bi z{Hu<|5pLL@@6*R6=wPBqtkPQH1Z$a}YeNnY(%L(=K^v7HYwnV>bnP*R{L>+s>#dB? z$3bCQ*rl%D5f!k%fbWR;@fL9B;Ym$i3h$z6+Nnic?f}-_ys}H&9TYpbsgl=E`0`Nu zm$m<2qw|{vC zEO;_NycQQ1p=G^DV@E{HQ+UUeORkEnAMs}N3JG_>FP0T?$4mfOrbZ%Ww;h=RE|Nr7 z{MaVENC+o0XsTmX0UE+pIrfoL+iceU<*DXtt&?xU);91`{mhx?A88!0-lnKUPohot z=Rv~frp#Zs6mzx_;e!(2laBOhfH7H2RGT8R?#-32eye#?h^hV7+_ zWB-jle8fX%3{!{iQpARnFbjG1Nd=SNS#R9W;k}y>DyuZS*xr7M`@0?eB;t7jXP_g9 zFEuJ%aB!=l=UUflm`H=HO1BFV;$}V9e+aN9 zO{5Ek5g5{&oWeUB_~^Ml<0;KTY!bgy0$KF{dE!b z$s^)BQE2AJg7yAyQ>T(itAlnRbEF;nF=Banxv6}x8hr6DSLr>q1VQfQ6`ny#JgwWT zVRFe@il?BWaJSq59p9TC#lWfJN`~8{!R-%tlIkF&w8goEd)_5xrMm;Nlr)WCG$pX} zeXb`?RhM^r{uC8-78E>s8fG*mYE#FcTtjKW8RWpBZZ_X%X6h4@@>z4{*5i6;{^W zu%{=J!O+)=z45$TiK%Hjv=s_t0y~-=6Daf(I`U?=)DhMHhk4OB5Q}!gu(>Hxp?o07 zUUHl|R6=xjpM-pq8usm$>q9D!PHREPwhL#RFitF9*HIdp%;qsvM$*F0_TW`3_KB-* z<}fEEZBBy-N}j*;e%qgk=e8y=CeA*#(zRGIPxC8zgoo$N{HW=*Aj|lO0VYy}SPrO> zSF{v3JT$31W$SM-ibKS=&O^p2mIS|L=t_27s;ExB3(uWj{mBxf@t1OL;kX;{NrQ~0 zGc8Ej5LGC=kLEXKFIlhVtiRim0k*Ta8ZR7}@ad^8XHsW4RZMTVm=gv!*SuRgO=XD{ ztgks4wN=Cs);hB@w1}M_2M@gkJ16S3&4M_8+Osu&49Ryj@I~`bu9NdM)E{TFMHK)e z&_Zrlg%dnem?iI;+-Ea0#v->Vy?0BG)aj)wpI&~c;WbchEOBMcb1=2~&zT&rGVQn$ zI%F^JR@T9XLs>#H{!$!6T?VUy=5OaRPhZ`=DdH3yy}i0E^EWsBKnYVzHLPrle z9YDV~2|nm7qjV;8esY?Z&z9~9Pz4*VU5Zr%pWkV_$9eUZ*$PH>Uc)9KN-N7s#9Z51;*6k zbh99V?o(?GX<0EVL~|!GDs=giNha#HG3-b7airk`FJCTJ z90OPmeB^p{PWA3r9Nb&3^`~BDM3qeUluljs&ToAZp2?S9vdduCoCdwfL;(WB0Pn-yXY&X1-jH+=zgbX#eD)%Ed#IybW@YzJO)wP`tz?NUDRNq$N8GvZuQ&a^N6rS=@h}siXxeA_Vo&eg=U)ckJIMP5F7n z*lP2nE5gJ_XYhd`;(q!@oJG;pTqS8i1N_4EITs|hruQV#VXi%-HueGB)%}a*ne!L( zE1L@21Fa6l!*oh?%xKP&Y zjnFupGv-c`*(sw{DmJ}N3N?2wJ45>r`+GuLyDLk(9k)cG9gnh zFgZH>av^b$HON1zRr*O&F{gCXkE0CdD8w4itnYM=>%BTRtXO;FsRo@xsi^~zVWn+C|u2@_BZ_cF^cifQ?8KU zV>b3D;_hBPW4-;h%?S%;e5^-{XFs?gkT8G>OH^oL2Bpl-_6QRHQs z$)Q;si$(ByP4$583kSg5jq_07dXf~|wvrv?&GOKvK;F{m zicyj!ShVrW&kdbXCa6Olu6I1e+c?*~rXo0$U~N7EoM?t3lzh|F*1&SZg0i{l=e3?Y zS=7wDzjUA}hwf`0oJ6XB8EI^u04=8GR&D+Me-1GtBNY5vS6xyiYpM^w{DTs4IJ9a< zTSPBwCD!VH9Lj%aw9w{$dCDWcE0WoV7EZ)Q<+~^dhdy?aWBF8&-`F0zr}2m_m|*Kr z$4R|<)tF)%HS!O+`O`Iqt%v(tRc^zSdF zewUNuzPLv=-`VuL2l)Z4xQ>BtReoSn(5;3Yq)yKF4^nz|QMh^FS*%|(O7(V-GMcA1 zhHN*0ObHyYyV5*va4-G2xB2(AUYJR2v`pj3E1Te$SsWjIkt4I`)1+7K7i{xC`a|7P zqmRR}hJ*oB%Ey@#T-V>g1w1#Fqmv)=&L|QPh-GxnL#rCbcretQLx9$E#@9fTOk-uq z?$AiOVmxx_{CuF`w<_}LrIN27?U6=gj)e)9~;Cfe!co@-%!v(2?HH(0^!iO%VP9wU5$~4CMkfLrU}m z%BIzmr959-4mB=GE4H#{Mx#0@^zFnT%3Fps8}4SQRRn8HqxC(iX#OZLXvNH98JaG z11VI%4#uF=;J#!DjR3%miezxjL=pwC8T#voQ(O$Lt4jjF zTs5MO$XNH6OiI~*vCN%F!2P92fLJFgg2Ag&F9iF9m=*#PXMyz^ti|Bucak&6o?kg( z&b>c=Nq5o=4Za6?Lj?WuHCAK&EgTJoM#Fqj@oF7U#@}kfC7sfISZp0DT37({zMD~A zC9ex#|C9aIF#~+;D4NG{)~ZlR>*n|!%B;YPZ)@bynf>V-Yn_TT&BiTh^%B9oZR2Vu znj#NoWYTveZ&4A4EInV=haxZ2LPBmG9MxyyN~N)8)$P0ULwBSYXDhdIsEOXxID9CZ z^}6|k~lGc36!l{vS*I3S2faWsU@@o!C? zD*aN%)@m`#$T#Y=yG&vY&fj5KLgU$F3ciOqSAE|`oKS&s5^UrU`%7n3#ljj;C@@+a z=kn6R9h><#r^1{Mq)h@YMMI^|j!P&(XE)rA{vfqv51l=%(`Bby=E-xs-;8dKphE*8 zEv1ipJH$`WkAz;w8v-`Lq+foJ1JC~FJ!BQ}mhhsD%6H#6U!M_>8PQhbH-4 z=TZ7Dr47sK)%GIGZBA$Rk-JVbzbHW583P8axhdXO4mSc#JAy^d(>iH!{cirr4Gxl7 z0|X37sKwk2aiWhd=J2oqw8tg0OrFy7mFKCY_!M*i^)DVjJhVjn=lga9VC3iM!B>@q zzh2ujwB}ftP&=GmTj7!^4umIoCfdUHR#VCW0o)wP;9I0W@tMr6F?mHbH$d68c0k_H z?wcM7AkSzTL4HJdKi8q-K2mq8_u6MZtdOq*mEwh*G8@Y*f_ql?wTHXb$C&0l#TNpO1+zd&hJ zK}_wEv)~g&h%!&9a+r+m+Hv!Cv1+#PUclKVx%Y5lx?Wq&jRHyX3qoxsLcO_k1-2Z- zOG;b0^?M~f1<)ZQr&9~Q_l(8R4;Oopny$;0|L_yB1fIzt8(bFF^zoF3cRRhmdsP== z$Yz(5-L=bzOsp~l4_q&62>odCq~v+m4~zs`TP8dS-NQH!eheIwXK2!LHx!7t9kxqx zZAKEbJq*>v)C5=tJT=EU_4$(}BO4i6tl)XWLZ7e!UNfuxwmddB#R(X_#!*Sc;KPv` zlsX$k9~H3Lo{eUY+6cYIXnl7N>}RCg)USNL&qoO-O%d7OP!G>oo3mO5dcrp7Ibca0 z$j~e4UL8y^(I1m=5d-S;h6znpwy0oYBdykd{j;=e(@1S%viLPFUx4yr70s0?)k<61 za2teZrl!j#Ikb#s|NM-ZY}o9o*7|2DR8w(*$3XjTJN)P9-(?RwB`L1vMb6uE+c?p| z{#nNk+7?cR*uq+jrpzQ%Mk)2Ww0#3ypECBhUlHc(TZnu<=)r?Ak-;6b-SubqmQAFD z{vhfP-3rYVX)8)JH{LHk>tlFL4}c->nkZ1nxV%-ilwhY71b}aJe2O=Jt{wZb-e&IP ze#KGb1!|kW8BdAKqIR_wDc8MCiLr0$w6*yhDag{wD$twT8+>dlaKa75?dC=Mzghs? zC2f`7DQ4UJjsQKkBGP}nd%Yt>V$83YwS9Ag+;PtYb6%ky!d(Qcn2yB&F$m}(mEf?n zk~59J@2EvZPzgdRvA;OE0T^=x?(+Gy;#H;dnmSo(+?5qm{+4gq8{t3TyPt#Tc>4Ho z{wroW*4YSXDCY_U-YQQU3*{+>lI>c)x^`ZZ@fa-P&Qls9AP{cL+dO!8vY}e4UV(+E zt=JX{X1STs{6o6c_n|E`NE%4sWeR(i`>ks@)_+dI_%Sr*Z%ojvLWq9NX;6S?EW=#g z$ByYdi_JcrY2w$CXDq79BjAK4JKsQcL}nLg!`B=1}<)vT|Os>QZH{D zGNWHFUv5E9{LER{F?j=OoR^sbD6jO?7l+ggO};)pS?)Nh-RI>NFxdRes{^}%eSP<8 zhx$oPx9sl`0}cKhkFBy{_A+5PO^Hcb{)zRS(hN+bA@#7Lw1Wr^52iy!vWJ65p*4 zt;m(~Jz%i%)+e9F*DuDNL#np{+mr1>ws##K+_q69{H)i5u;&xirCa9KeQe-vShM|Z z7{93;*4)gE$s0=|_jKI~U7_*YEXG+?y)Ua7!*BEGwFt1&4Vbn&-G2SB9ysQRg^yqUtNijsMktOw)=+XrodT_T=%pY5%~ zFRS5u*rF5>I%(QnwO<&g20H3j(#gHH{UUZ=mBm0l^tXiV9Lnz4HO^~VXh^|bADz`x zhxn@yI$1TZpJrwFIcb1l+iDyChsr5E{>oxw7c)q4{1?oM5DeUHH#UN)H@JL&5dHou z)AxO5RnhYnXsPl8$IR!K6;2!JFZ(u&!9RSv&H)|%{8jTMAn>&;?*sC^l`|DQf%6c# z^OdH5NuZSbv5wE*dx0j*F@5B?3hk3~he(BCC zb7(EQ&_N;*WUJo~KFfuPTIBkvlEcyZ*w| ztE_n0@)mV8f9cr`sZo&M=h8DY!QiT&<-{p0n_WI*tlC?aEvyfi6SQ;Ig`woZM z;~`gw==eI{;+*hIvv5qYGwN%CdL-v1f_ zd)hQ;*cg#JX`pD$@n6?5SPp>U3tx=tsCDHPYi&xZt9P-QYL(v~pb`f^u77M1Owc+F zQ=>-$keJpPIA{q8vBEM)9RBn)O;J>`QzP97U?Dov=T5T{Bf)z_|AsU4f#&Um*WEz4 z6lzQpFN?&wexzqhAJYCxeQ%H}K$|E_8nqt)Q(Ndb`~OJ$>aeQ1_RT{|horQ0r+|cj z(hW+-0i?T|Lx>=tf`EW@cXxO=fJm2gcS(01Vm7|-`+eWcZ+>&lT*E(lZ4PIzz19== zbFceZ`v?;$!Ohv-W;SIAOB2!EaI!{Eta+XJSH(~}rBUFU%Kk6kWy(8a5=5(L5F~zv zD1iY|>TRRMr^+nmhQZcs(cdj**CQSe#(t zroCl>Y7G=5(hr0#8Mg1Z!m~S%CA~do1m1l)f9)D z&2Kez@Pokmxo9ok80G-1u*QF<+C?U~9vj_pYk2!!LSTuw1gjy@obmS4fLER zS#*(3m$u>?a3U$l?Xai^7j*k^BurB!_jPyEe#WU0?=2!E1p)LXy#L2L{>4gC(@&Kl z#Y#vT$q+uw<5}?wtSj*=1L(1>ZnI$w__v@jnAbfgkC^)_l+nZa3 zRDK*Fcv9yJbJ+}ln!bvTSzmaJ2)RlMOIs4Mebv^1owzf&cSW{xo}T7=a&BB^HoUf$ z!`>Gyms8i+TdCaBx?IQ?gBLDkQxI`#$BIHziqS|Ly}#m_tW|IA?)27QPbIv~m3F*i zjR?)}sW2jFvUDeMtf|L#kAdkiy5Xc`<`;$$G=8gwI$MVWzqdgb(zJIs&hlM?FJ1`H zwVOlAe9N~h=|2Y_>luBPMXFGnR^<2(lIkW3}^b zaz8D@CHna78e0ns3!R>`M_AaVaiQNPD7CbvZ9M@gZx}|)B`_e$%F536Zy+TNh?VUq zH$|Qdh`80&egNSW5zefDJqMSX#p&-4&;a#tv^Ges4CjQueb5(=B3Y0V5tQPyvXkBb z?-}$AxO;Ojz1CBDQaP;gqcx$-Y5neZq}Y-8Gd~N~Sf#HJ+q3DQqUbh$uVtnE+%7rV z*2jxq@K)`39ZUHQ^wK&Nb)GowCdR9F)>68UIXxwU`vAldK7(z8abT1fk1tIT_SL1M zVaIFFt&p$##nnKLs7jsIyM57WtRXG87T9slfzs@G)+`PSxp~AyC9{I}TyUesw*Lj@ zHDb|aU(JsX4nhaxn9s0Qw}uv9Xw zIqe6cal=7+JVNJdyywFkL*Ek**T9DOir-`V|uau}=g&*I-S&D2BfU zBxWem`;R8iLbv7SOO0N9$E-;~#D?#1&eyv!Ix0Mh@0m6D6IRN8A0p5LJ2B?J`Qe;+ zfo6_=H>xdeN68DP@hvl7E*S5QRH(I{9-iQ}1aUuHCS5&QYh+Syo+O6Y7S z0AjZkadF}KoQ`tP#Sx+Ppv41srJ?w40}S$7-SND+$=ANQq`p6zKUgfxdwl`fIr`Oj zFy|3T)Dfmw`IKEukbyFi)o{N^-&%cTuNqK1u#Fi+W@e2*TEr5sJ3sQI1p{i|=A_*H zkpYQSa(AViXUM;HGA|yzYhwh4~BIC2&vnp$< zi3#1ycDy>pow&IQ5S_+PkMxy{v`@eJ`G|9y*yOavgWEmPQxNKVq5G=k#B^>NJ^gab zSKRYH{sMB9n6{S5Vx;3W@FLyozL6pj&3q9t(CCxhvbP%%2vl;Ip?}c4r@!d4R__VT zc`h~OF-u7e>z}W9QS;fP%k|AjW)}hKL@2zcY%@h1E}*C)vK-zLgO}h{hBG*vftjw}Dncabb?F%NOLg2lKz9x>idk zA}f&*KQztXnCYdf*nVa%O_*Okt2o!fN?s=V5-cg-p@zL{JltcRF|+&q>XFgSZ7e~# zADr>G7%sM9+y%}tYVZMM^PJ2q0<=kNSo5eYj>sN~q}AIzuV_wRnsO;4Hn=Zo*SSU1<_rBm0n>nA>Kp=0cmB^evqPfH*C zopAB}02<~#UyFSUHsLLe$~~3&1}P!uYKOg-dPcWgU?(-V+nD=IV{uCGG*jGP_Wmp? z;LyEX_vFqK{OvxT90C4E_CfDP%#J`13kEYrxik(w;vm;FK$ZQacg7P*?qH{o}ktqFAi}#_6kS&4SFOH z-m66@YgNoZ%=~XhGhRoJ*o538UOP0~zVGw`+{t+tH#hC~m)*Eg%P)KupX$`h9yA_& zaqjC1AcAaZmuh_m1A;OV##l}MNxhNXk6o*0o;$oOU&fq-QVYsLG4ZXIamv>d?1XBq zy-ez3H-DK!2K(THE@1+$;j@|<>x8z?m(~%Cp%WvJIIhM}W$-mgM`Uq7@&wJVE^81s z7x1nDUAsfki{NxoUhB)yg|ozuoJQ1#&PVT$c4I#b-R#CL-VZy9UFX)<>WL^k)urrO z8Gms^k)j<)2E4mxYnq1&c9)g*f!ndu))Nv@=-DFnr$Kn+_jBDb*ptUMoX#PZ9 zgv+F_X++RLn+=BeeBoSJp%i_s=*1T`S`toXp8n&H34Ed@l-v z`s5)iuc}^99sznP$~n(Wa$xrrg~4n7m52^;N1(S-Fk^P0y5Av`64*3O_=&mzi(KXy z60fyAZ@I7BiI{xH2U6fY?~nDpulR0iC0neSO_C;Q8w|7s$H}+P+wOn;pqh`cL}}Yh z6miZk6l-hV%9A>*%1~4wPmYERexe%ao~s|PkC?#`bH)q=MF#%e3v}76UM~gAFimlg zcEj3Hl7|<-<|LN^Y))xwkP|9R2NXh-F}+JCMz!2azHmZ)u?uhAOrJT9%SYmrQ>ZX% z<2i)hb|&kUWJv#;pr51*n!~-~ASj~L-IFZuZ_g~Ks-3moC|OKX0=2Fi;zf1s-0#GH zDsfuf1mP$%aqhV%itmI+(}Pl|`HC@96Xo*h`c1_E#%qzG z?^o#yu6x@^u0{*@s{!+IGq^6OUogGv?CwVI-A8vO>-1#%S^@am6M)hAG3uF66=y3# ztKyqN&(aGn?+G(KalFwv#HI%Q?q*Ft;;TqkVI%jP@$9Fd?kXi8-gr@qkOZW_H|XWG->`(wpa$8dph(7+czaN}3|*6%sVQ}7?1T?PIS5ODh`)1N zg8@kGg#Zfs-L(X53>4b z_M#U>PemSEzGI^@N#O!e)?sAc$L!Hov?nIXwL$Gpy%R)DgM{n+PQkcCN&UPtX<@QULf?9RCk3H= zwAt+uPD^l$mNj%Ze?CybR>I-<0AoZm_iY{SO+t|Hs$Mp35%cbjfR@y1UfZQ)t#)Auao6=f;9y+*gbnY(eHGrK1r4~O?O zY~_S@BoRRrk*q|K)BI0!HB1!~Vh6d=V#b|k4746?_0*Mq?8G$TX3t+_`@~Rtl%rKT ztsQw}cSh{-h{sN8st3uoPoHXo!`2dzO5?OuqG)n0S_pn`7m<^etb6;1M}Hzn)Oxy` zgX~QNC;fCDYUch)H({Ko4WQ-EnReF#Yu7n&n=R5S?il^gMD$BTnw?L$m)40WskuxA zo{&;eW(ro|78NePLWKLw&3%aqVc>~Jp)WRt=9NUo;Hk5JPB5|6u`@FN4Jm>z)Gu_v ze7EWG&{9U9ex@GA)komzC&#fTB z<>HiaXTQp~)R?=b?9{+9a5cZPs*!<2U4sBL^gjXGScQVY3mh4hIq@2p)R3@Z$IXnc ztk>nA-!c>~#}usX(TPBb1vZVje|N1ey;I>VHBt0m{+p82uhPd2e#u9vf&%~t@2NM2 zJL-fCR8fjCIo5ijR7}D2&-gE@>hN{rrPU3{A72dh`pTM;xM5s%iMsJ3fVADrhxqAq z|7-)-1H!#7DP$s$N@p!bmncsRGEg}fRoZ2uNP=WvG$iD>@enTU@6&8kBj28(iZ{GgHjcC9%UuT zN|1OSZ7>j=&<4ys#%80IJhxZv(ENlcnC;rNn>r3!S^+17ecrIu*^{Hw0y>qEf&y#F zVuqA%UF>p9dfI@d-2)<=el`MYi0KzLPo*Qd9-$Pu9T0E;jmzpoX35l*yxy#ECi8gS z_|>MrFEqJ)1;#8i;t#CsSy_g%Z0wnH~OJoCj;n866@^A21jL(H5hch_1_}Cb{$~`+*!o8Q&jQ&`Urp#i>GqJ`Ubj)=r$jF z**(jCa=8N5Ze?Wg%?VW$s*WPEv0&Gi+Y(c}uEwv9a<>4CALzM2**z*ADv14Td2lka zn35e>GM&JDG%Le;&VhQ)L)!PT7SfLjLxFf>Go<8xK=f*sLntX9*W9lFnKDJW+t04H{0W9$( z(mx0~H8%@y&>N08cXxab@#xbxW0wR%3L?;LWa(n93_xa5O@yW8XsofO_Sqt(GLwe} zX`uN;T}Pv^byhZ@EOEU;2|NRk^yb(k7v9B}A#B9ofMRrvbV~Lu7}X zZMvRahs5RZL8D(48DLr8Dh9&y9@`;$h7^@X+2sHBWvWFGb<(J#hlsqXv4`QgX^Mo==3>SumMjcn=M38;d}(Is=JxDS?PRtO6AC4>vNP zfkSaqigFeBuuCw|Ku*`YCBRWTA#L40@NGVLHzOA?|1-fAv63J_gUTA##_K(sd?Q*2 zFc87{#s{Ae-GNOM?pWI?BiiECY1-KDi}hwsGyKrn0C&{Sgo|xij*ULHh(9 z!3hluE8*tC z0A%abB&%r6{I0CN^_aOCI!1;nu;P2T00g#+aGmhuA`_hEyVi$-si9UwG?F<{@>*Lc zPC-6Ksv1CsCacd*F-bw48w9o~E-zwuI?-x1c@!5=c1k&C`jG zQRe9@fUbxkqv4lPp%ya0@m7-Bi2~TJ+Z=4z^AA!F`=n4wgewV+kHLM=wHqN(0S=_r zK%)|Gt%OZhxS!aHRle3=vH2W%4ixboe5*0Z*f?MSY3+xd=RH?dcs5@kc1#zc*T8 z0jg1Nc@poj^|E=OWhbkq3z)PG6x3AFD4H@-)X*gIH?<7?vt1Pg^iVEFa`uX-wr-~6 zadimqftf-(s5$N0Mudm-Yui(_=iZd<@A@hHE&rKF3z{CNnpj2oI+*}A06j46yQ;rg|%fbKC*K%fY=bj!UgiK&P z-}*&K_N*|_8^q({ampuCkQfyM(a+z;-bB*F(T0GWQ` zVZ3J{IRytvgW%_c1Uh+m#H~#4XrkjwJj!VTb z83vkgs+G)-QR@N20SXmPi{lk6X;-U{z-u_c;852oD{M(iU$_knsH5HBd-d~2M^T&L zz6ibQ5;bPC5QV<4Jw5We@gF{X;Q0C^sw@0uEAnev?r6E+O%8jhZ%aeJs%CH?4-O59 zq^gup+Qv!5k}Vvz{)9cbvUL1COYE#A#>>QANT%=a*SWd`zN*dyFrx}$eqP>>um-d8!4^MA8q(Y0avZ=Rm$)VDhX7S|5hK>X3RZ< zuu@YD?EeD{A)u(Kq4SR>c>YxlYryJW3i||rN~z(qr6DUWcveCaHgfmKBS1r-l8qJ2 z%}B)<=xN9YI|6N1BLYCSOCkva{ZPTFhAdPA&DX(g#x+R%Ic@-R2Ha;j?@PphUAiDO z;Li`w1{`q(eng`E>HXV@dcf0lEd^x0|A_Ja`1c>818sjr&X>x0&wloc$-qb2pb+Vb z@6D-|hAZO_BVmtC5D1Dl1-JW`JJIJw=AL3N=b{V(TIbb@kDi!kTG zA^$!V3GA11g|AKstjMj43m#Beq*&{;qYV^Opdpux1G>z=YljW1shwqS918}?QS3Cy z^+8(K=W*%}g-%joW)Hr83GX`Di1-KPU);>J5BItPJMjJ5t6%i!>Jm@$kixh@qIl|wDveHTN>yvsxrVnPj^X(} zC$hW|iAhNqAKI@xP=jB+E^^+F8UpmwYykoq?OWN|*+@u8&%EGoD|H4og{5Wp@6#LM z4#cyQgHt?5MSDQ4{1*t)$TevRFNyRL6{FVw)@vpD4$Owp@Cz{cI>6-RgTRkA*VJYB z&6;oLy%_&CG+f4NVT;`R#RW*GtooiKD8QnQVR}qCi2gK^unmzJ5rbHx>|#a@zcNev zHk*0!6-myvraHbx686vij?j$PDAw;ro}Pl_<>t+7JuL3H1kkr?EBwE5dT zAy*HN0AGti3f&ldY8&2fA2V9(p^)4H-PHLB)pemuj@`m<(>s;w& zC~go$Ed}qbvBMjWRb;#=Tn6%2&-(2_m>^~cWC87C*7*Iv(pQCuS7w=p;0@NTOg9BB?J;R%h2>$xP%M$AE*To5+_0`*M#F z3Qdps9$ot#&qlCONqxf3mF)5MO*d#cKF_xZ)$a}Ide_mCBz&HBCAH~<;PN4dgm2$_ zvpUiBfIUzMnwP93B@=5VcrbXL&Wz^fq>*-hMbFU1q_6zSfLRtUw@LAo_Rr9AAyiRp z&z|MHZNwwux%+528-@n1A4AUlEaYA)gfAgcb7wk{oFIe#cG&Ru+Tq%%Nz9!tFR*`CU9+1$?kb8+5a+=Ol>V8~nL8MTZbmf=Wh^`ibcu#MnH9VAzkrOU z;TG?@)=1PzCyO!&lFNo;IQ^Egc&%TnFDDgBVvt^%q)W*(m(r;ygD+Yil?`F|R67eC zr|k;vjmoBi`>MWYUUT2dIEC!0yRMQeQgM5(92@G_=O*21zwjIVb%)(6Zp1Qm+P3E2 zMQPfJ#qK#YG9;$0ch=OX=$BhgKH6Y-4a085Yel9xSP}-QXlF(!7i+vo^~yZ}{9OrL zilQ;!IKh3Tq-`hmEfH69RBX>P;?5@#VTjjQDNKIJ%7~>&1&*kz(AK%s@{S+fgv7Vs zu&yatPH=I;LQY90@BZxSpzLZ$pJ2lsuRR%=n)v?rNzb&xU1WB^K)TB>-;DMQ>-_AV z>3|_>@h!yzXQ-pA9IrqtRAHtMQ@V5nJ2UHK$=Jh1eZ^4 zxfPM(ZN8RFRz+~4pL{dE*%J-u2<38nAC0+TyW^?F99Z1f}R2TA+G=J7h+JKo)Tu`MefxbaZ0Bj6p6^7*PTsIxKwnBy!YN~e{hfD zyda*cHIXcu^oJY_YL1(AbEMW$K&}=Y{lu@1%Y;5S2PE=G>@QDL& zlCs5~on=^BV@X#7R4aq9H-TfUV!UDtU?%>tm#zK%{RIWgA9IVS;hRcu<+2t8%1rAn zOvJbE>BMg4T+(W4o~5q){qme4nYqsDEce5^S;VJ9w6Z)#dNte;9|Tjje}j@^)|X(u z=V^b}yJl06MG?Gw-7T2bFFIb zRWuV)`gS(PU>j->v#Q}>&n$die)qb9zTV25H&H1sE76THR-RD0T6cg7Us_$AkjRub zBQI-QO6jv>>-FPbX1wDj*s-+z#OmFr3RT8cS_1ZT0~|37Df4hj5Qf)se5wLQbK?l8Ii3J$jGj;-Xy z8ox={fn*?v8HJ@7p-$k>4znZxabs)#Ahx@LF>(y%^OuToKX6KIg zGQG-;g_CGM!vgP5a*d?wx2Hv4*0u!}jg5wDU*i-A53Y^tNsOo3VoM`nw<~pFATk*S z>H6l4PjrbE`lvYx9p_3@gX(`zSXyW6Vz%#?WV z*bg}FJ4?gmFloQzr171^^1y4|^QPx$~{6lvyxU z`;IxjI<`EHAT=8rg{OR69)!sd!HJRU32MSR$AHfF+iv`NC4*nbK^?Y~gIM`5W?Z%! zDseqO)+4rFCZH-C{#u4bO-OHAu1g7cp0+s71yiEX@N-nmy5~X&Q0;p;D7WWB6zteR zUYLI1N^K3ZSeNp%vq}}lSSNnaQklN6{ovgJUHUC?a=LSo$wjfuyqoI9l%AF2{~WWt z$GCeOWQY>>*_gkc+`1I#hE-{KgB3W&DqxQ^QqPkO0+3Kiwt?{VrE&x|k@@XH>H{Ro zqgx&CX~yR#3|+b+(rB1z+f^6goZc8&C^bBE4R*=d@;8?UU0PV0RfHe#OsMZ~r_PBw z_o;l=?_!2DKA=}qJJfI9d3a;QNI&CySsSHKn}zW%VZZperve>umKb+tET2Fu z+84FaadR*-&xW)~&n5|tL1O{|WR&oLjGlbyJC5%h7NezYmaj?{1`TL1SVxP2SUeJC|-N*1O%7 z%>P}L@Z^vk$)%?JSsp}6N_ec>0nrKi!+Bvz39Pb3vl>V)?Jqh@C*Uc^!E^_?q#<-@Bmp7vjN z%e`$-ljTVpFSb1MT#1WBDvIRut|eA;-_&kbAlXKvT2{uWFZd1)0Uosc&x3MzS_mgm zcc1qtk3)KV!mN$vPvEyI`J+2$sE7#pqfgkeU=T%zDk(vRw*3heh|X&QV1q|CCa0-1 zO7b-Oat;>Lm6LLeBv+MOTi3B|8s4{l?9)6`h^tt{f(~vv@bd6iOg>0iVUD0hYijCd z7!^}iBa~MEx+K2d%O-Zbs|fT?IR*W|{Pc$Q@`+{jv`#x_c*!~#=MIsj8G)-JRBUkz zS2uX9V&un6xyj+X{hj&cyPovlZaeswQ|9LcNLo1UK;DWi3hxsq3&3z8?kZ zbX}jQ3|(e7xkL|ihKGl3Ge@jp2l8`Cw=p7)ta2RQVTT^H4O>QG@?BnC3 zr1WXrMw2ZA@R@QXm4&Y_Jo8=0)*~}12ba5DY;0^?T&jp=;4ZGNL-0m{oh=kICgrq# z7D~Vd2+3`#65msluc4<0=@xZ_3YTlvgM!kcEEk2f+Y)&;CV31 z{H1HVu8+9KsGF|zfSs;}*Ck3JsHD^H-2d>iZ2dD5GL)e`*Eo52%&ur<6jm2K%?PUk z#<8D__+Vc;#7C=~3B1LhvHd(&+ZI97bAex}CRrMR$uOowf-nN-m~m!cW-)XIw?G&` zAh1WDDid8GE_JFv+o7cn#lrxYisi$wd5C&@S)!1sfCtMWnruD5$2Jy9#=U<%;UbbtW+csnpEkuA*l5WfBKia0Yr67^@}&|yEX<9q z(M#)t>g%fJ7-_;4No>elf+xhX@OPKh<@;B+{`sR@XFkC8-{=+=F{-LEN29ktgIM~I zO)c0fCFXJZP(HIlMGC)YON_Cnkyi@Yd?@P#_Y_^5%j(##)g!r>oDee9@?{t1uGkn( zHi=-hrwtV4=k=NAwg6;-g3IH9#kbc<=En-Ame7MuZV?WORb?^1%P8hANj$fHm&M#B zXxpP-mjhj)8-o3`sg;qIHuOq)+;*DfCS>bH#h|yp-rX(dZcDlwjT!YO%0|c9#BdzQ z1qeCa{k_P~e-CY`FY*`o38bh#0IUy@76{!<@RUW_Wcp6c>qpyt7TAEru+AA1X)#9LC;-KW7TN(+CM z*(csikgYXSw5(qyv~w8t*EQmle%~LI%vb5%fmwE0@=`FPc(dD~*#cB?#M2TOS7t%q zzbbyr5|gTVESf(38k&QUM` zu?2qcWCaZ`W7@)_Jjk`yB4F{n|FZZXekD#|_m!nTN1-(Wi}c}1s&EjGPsRRF5cN4L z(q4^ZTu&%u;eXs|G3H~wvlDQ^;F&D^&$H^cbH8zl4nl=mQ9mIEK9valueW&i@l}}a zDYDsjX$=NrX;fe$_XKqxA$U7b|6wS6E$~6??=rcxWqu9=_Z=0aRDzBe{VR9=u$^L9 zm|&h8@iOR?;LlzHc_q1ajYI!6_$b=a==Bk` zCT#+zCH7FZ)M~Rqr5YWijjSp(sVEc389enS52j5E>gEvZ_KoKsdtx$H5N#?G#o4%b zLXzfL^82?Hf03D*wY9Zadb#yz9&4wYaB4)Bl(aNYh797y<|d$W*iXxHz~+Y`>`1rn z?%E{}Sk%vsV-(ynl5_u+8I+td42k}%9Wh~VDlt{9{!hva0ionTpaY?&r$>);uWw-B z#lhxGNqo%xLtYpbdokMflkFBogVOTYh9hIUX3-1@^&#w*1P3k?57T1oznbP^(Rwq_ z-9}vfiss)rZ6`2s_=?uHF(J4`Lcy^Wvm|q9Q?d|OjSfH`uaw8t;QtX7fsonD z>h(e)QX513J4Dy=y?VAxPjS3I1)GM_?8S{^ICvXCS zrbzXz;$8F@%Q@D3LQ+yvN=iw{Fl=sa?!>=rz=q{2U}UW)W#lEWgfb?Fqkkd*ezZF2 z%?L!aUUle{=Saa42uKdtwJiv>)PI5r0#Xq$+Y`zX!CYf)4=|UO7b7?dnDSA+e9m~a zFF>G&VUL8~c9^GkRs2|0TO>^J7Jx=WY?+dWL zujk27eb;`hj%AZ+=@k?{ge#ktP&Hp8fhB>Gb~2d{-#}~EYkaV#JG5+>&lG$vFEYf{4{D0l%)x2@JwxJ!TL%{v6F?SC`f zJ{VSOu78_N5UIB=_^-e~W63wO$@$f2nq$XN>WlRs$M1epKAW(a@Q6$Ce!t=7rfFBN zMB5&yVP1?5JdSu+^RhqOAYd%mf2FN7L@n`|g!Q;kcE!cGJynd31_z#^aaHoa*HnXV zCSfBU^*+Uero2M)>w4Uv!m3kqt~`)KEPax^a+CjI+5T;XXN26Hj2IGWsxf`w`~xe0 zoI+TTQ9Z08LZu~TGr`nOdew-+@9_mES+Zh$i5CXIr)yDHV3cc`UbVJ2ZR01>@)`XAq2D7 z-stf;OYKl!lKbbr!~00lCIX%Z#k&c2zK>reSx^q8UUlzQl`nmWx!=v|z^_~%5et~; zos8!M`(An}6%4q0Yby?Qr4vvlOxoFohlLgJ@;qhCHyS)rXsdD5t_$d{I%O{(%QoqT z`UCzmPld^^HRDOM*vvwEG^6gSpgpg8=@# zn&kyaDR|MA8N{x8Gcb($VpDXHZ4enH`Xq~qnz_aR^XHVB@Yj_3i=Hz!#{e6PhFk+L zze{^E;kjo!g^IMu%xLMG@X5{c$Y#MEGaWmZ&vn|W1m$i7|4`chHrqkOc%=Q+ zdMwXOKhx0)LHJL7sTZ4m+5|&p-P}L_{5dGwAOS$Uu#cUDxS`C|QmudhMJF}F~_H`E&#Guu#sNyMb%OY+@ zMn>RYg!Z~i;p0*_C7?u}eqeQdn!&L>Uz3xIwIu%F7ywyL?(ipT!g0odbVkg*{uP-y z=ACa+;@$j|Z&nqTQB)V5e9Qxb-DIQW9mJk%YLXL# zwg;!vZ!VI$s(${;S{Cj|z8kON5ESES{vi)pXZzZCJ`nw8f^qI>BwMhC*{AHa+c=Fn zq2i)O2zy^dRsm@&0@s%;<`{Zic1xf96wJSPYa>M9S4U*LODGr?NP1;Yk+isa5z(xu zpNbAE6l}8uNl46dnREPdov9D-ok@wt48AuSx#<0#-g24g?5Th;lN?N7HPG_R+pSkp zQLub|t~7u^0^xl?9d{-QVnXdVVwVHOlYD>SrT6^o71QY3VP}V6ynkI z4d&`I^|tMy8s)dw3#rAWD$AABOi@0zj{Qs4T#K^;UhL1=|NMA)>gecbX=wooPh$=- zF)=YB>t|QGGgb_OEsL>-hlh!YNiZt5MmTZKKX{seNo8u!g9z8~4}9>tJX}V_CVL+m zT12D<02kd>L9*q~d@n2x7MdAjw|=nYu>e~Ruk?+^F5__D-HW`H0_`dJOMoIe^{xeK zm5IK@a2UncF4kVr`Iei!)jaL4mVZ(jLI!#JCb03+#)#PUMff{kZwPWM)*is|Xg~@tdu?8#Rd+DyOV_|o zw^MBcZYK?qp2{Hf4%_#IRQwF>L1&1rx0@ZWoE=y<0uLf0hv9(s+u6FHbwy{{j-RN1 z=?t{{T4vp*_5y&vt40+dPW}zZkx<7N{(pFJgv-sP?_lb>yU_Zyt(p7YlCMbV0gcVG zd!}^k9kKpjTQh5*;GT8aIBlqqCSFHzx<5)QldBj_u!mnXrXzr?u^w<%RkrUI2cN*#j1}QYZ?cbGGF4WS=&ha|G z?0ZC9?*5!F<=m<-cePV&j$;7>v}#25%>CsDxR@SEYI+>O^xW`0%o*1M>-_x8p7uh? z&$R!Bn!sNug>stSc`0}Z$NJ6VQT?Tph~_NXKBM4+9n(}L#$_8&YZb&E^LSoTHZF1c zV(jD&3{hRI(JR#|u0ON9ak9M(XRA1Hv3T*Idn`s4R^G3>tJ^nR_r8sSQ zs~&dFNdNUkt)nf7)~WIdXo4tf#iI0*5I`MSE}U!c)Bvt9#T)?kon(7R#wfyC!&cG)GRN@*{mEIS+A7SGn`et|;+o1B`7ubmEzN?{j zA^!RNo1QDrqHtaV{*-}yW3I@%7Lu=`ax7|o+zc=6^u|h$<>lag;?ihAjrvzVS{<0j zp_T=CS85IDc@}tz10`GrQ7+<(N_#Z%DXTj&#$1G|iB#pMkk`kIEKzVTdkmTiY6XG! zR^Mhb`W>%&o2tSPw?J!dXgJ?yLAe`VsM-i1V;h9Zh{T+^a@*v8>l)4vE%+Cqnv1z+ zbQRQy#x|IlNzRQJ9$D# zRNv`JMv>y)s~t!A3HfiueEqchE!24$X@586xv>G!B83KdRpjQNpP9!rulUy+OA?OA zuv&Sh0K>C|-BOXa&=3=4a;oOL^N$2&)aX+JT=Qq``mTLqed}_c$m=rvX0!)}P%)moPSMnNGlZio&#w7lWHg-esG=7_9N zP75x~l=YMnJbjONnCn;RH^?M%@t#=%uC-4dii2V8soIgS?r)e(cmdnPWGvT9PDlXQ zo;X+K#h)IM;CBq@;uLAIfv@m9-Ac0+1mTzq@Q&iX0) zr)86FPcAj&<#p^1MI`PP1M-`zn|m}>KSg}RyxRD_sQoF0*VMsMzg@9cdaBxNKVZY6 z#>-0!j)PrquXuYja1SNAvR+-l9RrgWu=9wq*lc&@Dn@dqSDp;@<45BVZm0y@eO5lI zpBG)flkqT_Ps(0Y3OH7V3x4)lu-{n_w6RHlt;#wF91TKCW~9&KKYs9}NY~{&@?IHY z{ZdOj!L6ZG;dJARejRXoFJ=RkyE zl2ea(mBD_Tzk&GO-Y;g^p6d7A3S#b!QImP@Ckx*$OY`^I59;g_DlE0H>s`~6X$Bit z+IYs@7y=1e0Kn^OcI(E%mu~+&kiYs{wW+JLj#1lytKFLcfle7fc=B5SlMA zVFvgv2TzK_eh^NV%|6e_tkE#AejzGQ**5JAB%oL#Px46&K` z!0gUaPqTN>rv$f2>D${H=@*0AUMcSh!)yn8O)r!wAd8yIh)$MpFSi4PX-kvFCbKd6niApzsE?+YzDrqr4w*P+d-Wk%lcH+=0J z&#O+lxe8&oMME#aq27Ye4l|7nK@Wiwk=Js@>8ZDZbu6Z0jiMSk$pcvq(!vitX8SMSBW>>C2&CF5WG;Ur`1#&PCHBzV2GH#5uiMt0&SH)iKmY z44OW4m66VzGnO7Jn=Kg9#E!0$mY*}WJm`%%(#2E zSgeDS;O?bI|Gf;S7`{=uQC7<4ZUhdw^xo^3!;}`IqvM)b&}ErX!TtCu?odP+H&(%@Be7+x`Ud0 zy7fzwCPI`VA_^*^(nX4NrArqOloAjKARwL4g9SlpHc$)!q$wbTUWI`4CQS%6R4GCd zY9Ix2gZKA+_pfi}&fNP~=FMbxc2CZ``<#8AJtwibT(4JyDke#Cf*CtThH_Y?{T%%t zhz}?hy?iAkFXO_9FT3^F;b-83x83Txk{@Ns!->^u14WJ^!_|eM{ia4918bzz1yUe~ z6qOE3sNu=nGIk%q9qvJP@k3Yk)7(Ht+2Nw9p8=I~e2jDP!_`Ml9OZV<@lAnwW?X9j zw=2EU&F{^J1$koICTI5-d=Bl6_h)oE&5IdsS4)H=_p_wq}>Z2d13930uI5{7dhDz=keX7I7h9$0DbLqEn? z;sV#&8ha~{?X`C40|Q*0x@I*eo}d8l5{knkoq)896MiK2ypX$|cOG3fg)lX>ac?REze{-vuY41UmVXRx&WV?2Ga$3eLRW)q4P&X-6 z3P(ly^(&S9S>tgpO~OP3=F0pv)Y?g@drBw_b_-zPs1zy@h(>8nuyYGC7?(Nfv6nh4 zO8Gq6?t0eoR%!2qn!%0xUJy=tSeB3K;=*qNPKf4uT^AmjI+c1kZ!&ueZI3O<=_AOQ z6U9@|jbIJXC*o-ML58b+?b-n`NyUGQTpGo!@j=hgA%8Wp<8WVxYh529S-3w$+rSby zRv*^8 z-hs~=C&aS!)cxuHTAUQmyN>l^3paCg(Fx7^;mH(v|Jn{*{EG>-_v!}Sm4nW&(gIOw z^pVbPKmM&n8k}m724#2bg=|N2*f2}PmyAKl!=wZ9C|v1716TDt*?Ev!T;t*v7uy|k zKr`5{0GqGZXgResCODDb;7k3zr8i>x>KrvDFIOi$vksEazz^t}gLg06LANqD;llIR4stXmUZr|R41T8$+rjVoVRdNU=8bFpU0?OsK#q(I z-Ou}cAOL(_f>)F3KUvm@$x0MX^^C+tq`HF>wx1Ko@=~>AI|T(dt}-Zi6zVUk@>XrN z`09B*>6dphcP<*;(EvSTXQkt?*Qrz3D6LzJl!YDaX4GIbALtorewHvMl<$~pJnJG>A zqhH$x0ecmXshv2?`S4l@WwpZOstTz^OzNlF*!pL5%&x-clQe$=Q?mO-UB!sXiHCBq z?pydLC!Xb5Zuf;1Lz&)h9oR|{TsSPXk$K{gmmBv#!TiY272Y?qW6nT_yDnC-#Play zk=|gQo_!}b^hjdcxJ+9S*te|(y%}ud>|x?MvkHt<+6l<#gksTqINQ5hdj%ugK_q+X ze7a;Q1bAj6e=c(4PwF---TE5V=5UfUCT}NcT;NCSEWpTuUP^eB$XHZf#tJlS5oIL| zeOQ25?3knV#4bLvJYdvLo0A5NC=NTV{k9R*?e5uS)*d;hScplZU3v(82}wdtn< zXTu&@s&R6|ZM=epB?Vt!AMFeF?Jnr_5dE(7Ei53_VB2yud9>sT)5>tc*JnSX>=ADx ziJ@LySTL?j(C(d{U^rTVZn;KJx-{P?Z8wlj43x2f_3dzBlxD6Fd zIiijwz%`{^&MKRd9G}u+LbHpec9Z{#42Q{sRZhjG^|c0@@piI4`dNXKz9#viT>|pn z*q{(}!Cu3)8CkgjdL=Q?)9}>sg)5kwno(kK8}qWbP%Yo{;jqOXa2Lbn?=tJ8oMBY% zyVj;$2)JuAU5B^A-B~Q;9xH9pGV(17@mO!IEM@p&5>giyusSnt8R&9*AtfqvF*oJ? z*l!hN{)%4l-hhddJ!L;Q>5Xjr^gvzrO#zzcB&AiVQQ~~G{zkjKf5l~=yfJ_9 z-HIu9|M29*|I*}uS6thx+kFUzOjwm~B?>+u4k4IgA|)hE{h$(jtsAked4f{dKf0}r zGatASzp=_yUM-`>)5xo#nQ2Tn1vIu>eZu_EC^Q9N>_}*syeDB)^VRCMqVA(LOo~^% zQq|*ob**P7yYXAR5d0NM)2R+>RXgHP4&P-s9if7nDhD*wSaX4qM%PDKtO4?gMF)<3 zJ$p@HN)fWgA6k^4hhqU)C>x^{-t3YH#oalaj7wyt7kIyW#y=)Q&3`8B3Vxt*-W7rK zrCCe-AE}wqIT)B+Ql?&BxZWL9bmqas37qYLgb+j2yb=kGe_2#dABAsSI|cay4cV!5 z4ZCc$E`vh{I@;XZp|PC!gN6EeeT#p`<5t^!Hhp%8x?M~;HAmgaTsjhS2oa}gftJ-VO->SXmME_8r* zN<2&0bqO$9-sTK;+!>iNr?(Bo0Pivg)l@)gYot~5OnQ9tm*&))Kt`GVZe@7(%eGQ-sTX`s$u4$og?yQh!J zIRJO-!jgyOBkRJwmyh8H!sOo-30c|G@)g0W(<7ziMh}qx-JcYHGN1o4IY z|6M(Fy0f}bFx)1)u}aWyqCE?h*6@(h7MIl8k07HY8!csoMRT(~P>7rO4;7a=6NAg# zD{=#p{LdpT8`Da&^AvDz6~Fb#>$$@shitFm0d?& zA1r&rYJ}Ijbzkh@t@{+b<)Ct&XQ?9v=9pb}Wsw}F#Nr6o_T^L~X0>e%sko?#@ed7{ z?F{aR@`!VT_6?8(=|{ghWwLcYa1$xf$*ODLv~;b?wGh4%%EAq@u0Ec6U9XiJ`pKM)xw?kcLV=Btb1Beg}-&q$5$Oeh;TJs(;t&vJab zfF+tNiG3_tY)!<&;*1P-Q;X88u=vo~PvnVc7M{>Fa&VEps^6o|Z2Sb%dx6|w=-kFG z3ZGvfMyJRVPn_>;7BLVE8Ruv1vciNdbT)4CIt=AV!EEa5r}XU)NYI154Z11h+5mwT zTRcT=jUwZI_V>Mv_ucvah$eZQe9ron0I&X3e=koT*>CGO-DnBYwjGV=eWzNl!~V4> z;^sf(R(iU>qWhL}UPPrZxLJ+$9Fy;b2dUk?*_-tB^cz>)+;6wsjhU)GCPdH2r*3hK zaHsSAn=4t-FFTgxnwcp_XD}AuhirQSX0QJQ}P2mvrys`pdY{sQZ8VnVpc<%7OaH=LlM2Ja8vg zrLNe2lze*HDsJS$g#s^HmwL+t?}=)+sUFK|@{VpsIOT`(xTwk0O~|@-Lns>31^{eq zu$X-QR-MYjAuVUczfHAhe-2V7#wS(q#AmCd>TDiOjuj$ znNo<@X!SVHANpGmI(k@m>doNMpb=|hwVTS@=hzOZ6XnW#RK(z3T^uev>+7Y_=l4zS zJGb#Z72RFxnWX+38?LE_BvkrTI~hiE(rryr7Gfqb0MEa78fS%2Zjmbb)p ziffFcjltaGT=L~C{~t8#1^krEEXrS@O49*Z2Fbuj)t#MNm_7q4X|4}F8HA$L9de-3 z4$L7{0s5|CR5SA=rN9=Lik*mQHBc^Zsf_T}wSUZP|Xp{Rc976M1O1@%z`yi;eNbqBVma z)kI%|VXA!{BS0VGuhU5R0ZmmGRS#ao-9Nu%x3$;`E~}vTYo`c-rwrrFOsV9N%uky}KLROANpXPuucflP9O&>@O`o!E?AD4#+0u zFujkCi@d@&fZvoFU*p!^%=R@>3(vxSxAOM5zK<2OGPL53M`de&xjYBpYRl$2OoEP= zzr;sS%wOc#%B~cLXiokV7@i!gBI^namlGZz6Ji5=q;s(GtO}?Q*A`bDwJeQ&zsY>c z0{KzMDUjJg8*Rj2Rl>qs1U^lAHSrY9(`ku_67~KGJ8n3cqtseMOu;VgS_5qi}HMLWwjJ;8d zVq+iQGR#i2Hq3V+FAg_0W<~cPXOoJ)oT~4st1_(8U?f!re)J4NJym5k9-V*)XOR+@ zX;O;hWfoZ`*r}LQCLq!Do#~&vOJaa=?Il2zki&tZIst5euu2a*H1d|Ug`xhH@+ju^ zBm|XYm2sZ9(1T1ILp>O5Yn*?={GqbO>rpN7Jn?bYmn*=MkqseVh+gjloiIi3MfIW# z$B#JUvlVPCoIG3MotvF zvtHxy)Aee*7(^Ibkk?pM(C;;63~~EiI`fY+71s`={jHx1O>mF%?RD0Cy^Nr{L=SvY zP>ir{&j|azqMn~wk_kjz6+fn>Z_Mi~IQXZ-Qs8>vl{lJLC-gviF(JO%i;m5;72R#e97Lcq&Bydb%S@qo!}sE#&^_ z;fyygY&B3@RD6DXHFAXm8f!GajpUI7ABTQjaq(R>Qh_*s+QS z4G_V&Y(bgIFxdV_gUS26MO~Icmv&G8s&lmVs!ogjBS9OC^QDwH$AlNPmg7Gjmq0Y* znE@HPQB27t?rE1h&np$gU$!Z{bHH*Km;-~5c!biQ-78LM2Dvw1}E>J$jWki&?rWpY~BZ$3klNZ;OlGRA~eWts;vlzm= z1xWFO@02#47>BCowiAvUE$9Hlie#;|>GHOePF>W#W2!hg3keQDSONgUNqwzb7L63* zT!f-jQtZ$4e?hP*0+GEiBw+WixauUx%!nu!Wy_SHRUsZ|^qYe&m?uD5*jVdD{Pf9n zdP!M^CVhVLB`ubk*5iPv^ZExaiP`!2jNZo%V1URruU&E7l4zi0(|n5t8RqC8z`5+h zt1{`=KfD&ccu&jbl$HkFU6-@(98L~&KOdXdZ6y6!Q>SIyDXPY7;lI4VvNRzx5&VOe zMXa~Al-|POVVM5P`z9G)Dl{mPNT5lTY;DI~?f33RvtBrPha*$um7aK@tiIOW@wrOr z%%1zB>Kth4;&z3y zLgQ)PY^J)=|K(T!8AYeBlAIJP3D7q3tkBGi+U);NNa26iI1@4< z+Eeyw@GlfGo?g7uS7Gw@5>GabJOlBk)paF*a?hYC?qtp!X}Oy7;kNmy1SWbqnxgZe z#u1unq1_vx@zrfn5FV$`HIX#ku=Dko7nb9=Xun4Y+)okF-y(+pSqe8*#WHZQFj^o* zj(WBeI?;Lb`EOYBzZ>j-z(oHqjhFnYz3v$xemy&~#3OFq{|0Bb7++^(fYBpDw5eu& zI%!DI0@SIL@}A!XYowzoz9HF4qWjgU$2EW>hp#K=2i2&Lv<@@VYEkUfD!-z g%mMmF+RV!=96XGd^BH6pX-JOI4cXx*X!QCN1aF^g5oIsG^uEB%5y9JknySuwy{`=}yy{ffY zo0)I6zUl4mpGpeSs7ORe005xMe34KA04VbJ<1GZJ_if4f#_0PF##~fh6acECk)MrW z-^(9dB(+>r?Z3PHFm^Hnv@|H(%$%Gp?d>Qym{^%u8QECa*jYH)xI@^rW&wZ#kdY8o zb5B2B`Jsg~Kn#C=c8VLd+JbW+30oDAjn&f6G%sf(?Db2qAIs!;MFQI^0@bF-0z>(j zR02ox&)w?A;pthlc%LjU4(FA}r9jitQi|6PLAUym5xJecJ#oyb(3nr{RY7w^wHpJ- zmX?;Z*ZDA_7`;i6rA7~e&TfW+E*Lm(kk|uwv__Y|xvrE50Tk`F;q^=#Dtc2jCza3t zjwI#Xk!EEuU_`x7aBTH~i^E; zs3=Ppi%_YQcB0LGu8s`H%&{KW;PRjpRmAd-7F?nhj79w4W*W2}1wz1mGtF%Cpe*H2;12-6bxRxX zMO$mtK_->UBj(@x99EGa=F{&~9bSKPHgn`fjBGtT6&vdpwTv9anciyRn&IO7`M=N@ zAPGXo=@L2898@lONSYSbFE)-h`A5xN%}GVoVTV+G-d|;(mh01hsU;!zdl-z)b8aLR zSRzF`)%;%smvGvC=8Jb_jL=KH7h8XhEQ-DFX9WNEDu!!xEmN;1IF}~8WDHyIy*8XR z**)V0GYb58!TtUlQl$6DDQnI#*$DL}Q6L3fUkrC8WI=KRk$p5DNt&I`eaK~xK2g25 z;H{dk(d~Eti}UVXpQc@WVq(`n5+UL7x`$WlzS6Saaw^L)-LfH+_Do3#)0wLWXr1kS zw4ZQ?$4PMCgXfo+TNXjJ)sMdR<{~;YU^a!~W75OUyjd(T*~*7l_Bo#D^|R9W1|eU2 zoq#-z9Uc*Ay{cxyV5cTj@_k?p^DU05f1HF+{JhGH5pE`Q<^ki#%PyqOb?d>V!T!Um zMFs|=pcyRCl|CEEb)~}t&B*iSM$;lK0oCsM8g3|^yv!`w9tmexRWe4W)zu6S@~j$o zFbiAZo-{W}N84aTcv(PxLLnPPxvVQ&LY->JD7y+-VJ0a_D$(9|A%AB}3Oy&p+& zmR#`o`;!t&a#WlnKKQJW8and{ z5JU0HafbsEogx7+BeAbVxS;`|^bfl6zmb0#RAXHho0VonrGLMOsx>l6Wn(D5dA#bG z4mP`FGgu7um=6;;1jDko+}oq!S4l-SMMmb2V{w)Hv~N!S*4`@&*v#Ml(sK6A__*KN zY($oDD01m2$uwQ1ebG!|{Be~cfWqo)&g>__h9F}{@0ZM4CNF+6tE_l69;>c(?G)_Y zOcdz&Lpq5jCQ^;R7K_F%UuG|k*wLwlG9H~gMg}bbxZ{hKBoa-JmsO2hR@4(!B&WD1-~VR)eD{pp_hR46aqW@|QHOt0B!lP|S7FgZ7gS_F z`|-9MxT_@b-n4ysPXp;z}cO&iVKAPAwK{jhB8V z_HiU*G7?n1B8h;SapL+mH``hrGg+p8pK>(g z-8@Bj4fTDi8ln0P!bs3Fs2~=_kYJ>pX-4310hQE*Mv|cdI1?>R4`g`gdDHxh5P9zk ziwS@ti$%5M{N)EJ8fV#C)9BvZF%wV6*(~zPl9vzX9W!~Y{)$6wu0IwtC);KlMEZk} zG#mwks@I5F-kcolAk8$$!TKcy(>V`|K(?O~P8#|vVvGu%v5@)5dw_6*b?{A01a-12 zMz`B_a=Y-LXmYF)AChx<0J?sG>U^W4Q?Qs%<-jB#F?5!U^_W>jV`9AL)oM2*FZ_Ij z-y3gyEt6}=lfoN+dHrXw0<`PE*`-HYyjgl9z+yalh0jLNU@dfWW|xRsv?P6MPnIM` zwvFAZDVuYeNk=m8mHX9$5SXQHGQmb1KsATbhZ zXS;Lh04Qg!eocOQ=&LNvYI8+x`_?Cf+}n2)(O=K*)A+I(gbF|77sjMoGkJ2ib!xaY z$B{8F(J%(D`ZART|7&#Wc*&Q@$IkzknMfKGkPla`*oO?%;x-DcYq*dI>8&@@*WH!M zH)(}Lm;sfABVUEAvJ{P_$lo}VZeP=`?!9#g!DA|}4_d?}3&Ett4Q~pOX8B?|kcnK! z@g34Z)fc{Q?ocp%=7nyAEu_eVQvWlvbGX3Wv#}0lBgdR_p(wu`t`91ZR_}$X0qJnR z2!?nUtFTiy5b_-mlZz+~WS}Dk+za50dZU0rnZp?L!F<8ry^A#R23u01owb&~WsByZ zMgoLdoq-{U!76xrguuR(c!HQf1UyQ-KN$(&-bwN5^P@&*qSD=CIt$jI(tS*1^{xn6 zpY^W_OmFoUBMPW%+Qvx=_P&_}Vyr*xmAlyoPh$o_ogZnZOxHnpdh?D3KOTln92KEh zk@3lB)}vs&vy-p}Eo1}k4`)P=RFKc=nP4t3|G2(Sd}x;XVMGW>NF`?&htf$*`iJ~5 z0r&sB=@)v!#&?9>(_hBxi(zsQ*g%Z`fsDH^NB<9)^qu~yGQ)uHFz4;icir8nnB)er zfuVR@b;>?$=dqQxK`(q|nKS6fUlC35b+`QwN2Q6C$!UC>)w@HqXZV&6)ZAZ+%MCQ! z=wGsrQAsmzUbXb@~?Sx)z45N2szM4w;z0IOQ3n{z5qqiG{Dr$9**Q3b=aD z@0PEUQGf{|rCr=v<1riKn)cwrblUKf+AbY;db0--{jlDQpUKBia!@?Z zGD%He5-g{+mWy0OI1D?v)xvx=auQRtFm_z5{#bI+<*t zTrB^EM;5={)p-(f6Fe$eJAf^*3$~e@(8GC%Km~Fj0y@pF+^U&=w@+>C%t?VNr|{+d zuR(!+g*J^mGrfaOyU>Ks`3N3X>VxcychBj{Dq{7!E;75G5U)bK+oD|8rZ)@c(CpGa zJ>vEqf$)zprYjxSA0ATi&nJWa-O|ajYV`DEm2*Z2)Q)XP1Lm3c4>H>7^5Yr1TLTT*b+I5tA;@p;FJCWSbnx?lIoE$`IuDi3v@YS2~Dg5P8`W`OMX?+?ms%i3jkP-0x9=M1!SmJVG@ZKSe2Uk|HdKmO}gP<8BYJ_lmB+s9yc zT9h4+0adPr#+a{@aN+zXn*1wX%SQvOOhwThdV{Sxwkn~V_K4qnSd9zY6N&J>idwm=XX>h5H~MMUw)&>ynhlT$?G1xzTE+Kif^SCq$Z2zel2Xx6spHH_xjtI?v^96K z+vw@25G6Bnf^+x|9z#7DUL-Vt7j`A7Dpi%G(CG2f=meh}%_vtlT9i(Wn=G;Rk*xD# zM(rn$TzfzbRznpSy;Hf5F2sr_3_8Kix-eyM4jU={TKPn)rDD0u&3x7m%E3U zSsXVuU79NH99aA>sT!x?^q;T$)8djIa{*J+w6eDG5#vuC1+jS-8}ERyP1j-S_}>Pc zT6R8D^{39h+T_ENZqFDE8aSiu+egYYx=v7a#3uj+VvzM+>quQdg zT-j2ijp5cp?e%HNI5DRvMwSfe3SrzXIiFLxyL9yU-Gu(%W{|=p&WBb>olX`bE>p`!&=fz~YIV=Hm%MwS) zSUh^t;uFS}*cC&_%R>+WM^U78m8viqAYYc=8agIn7r;HJ_~hYuiI2n5fM|a>X2&hL zGPZ(Wp;vkAT>*=~B{fC&XOBSC+xoD;)x+)JJ`iQHS~So~nTvgIa%SI@b>c51lUx99 zzjR`090kP#=c(Vjk^GC%h^8HaqlAYe4+{dga+?weSJ|K^_T4{9wi>Ci9v7E5TLoo! z>dP>8;P{-_HQKN7D`s+{ak8JhUbq9ltQY;>AP3Y~nbdpK&@&E6%JyZllLCOzT4T^A z(g?`Ksh)Uk>Fh>DV^c!2&`bBF(sug`;@8~r2hO`gG$kXa*VEm@{hE%c&injNFWX?`e^Qt4+_FUGNX)yL?BP9WJz+R>pU{-PGK~?smQ| zT3&AQHpZl0@ffA`JCy(j969zpL=?|V9W2{&Kg*|A&IJ@xp>JYT${5jSW^mLIA*|cX zuh}dJ$E5Q*d$9tl(;ztS;L~0F!jn0sRX&}aJ|X^vX|jTXR9Umm3|Wug!m&yV;^KXi zo?k#c1|!UQ4|pFlmO9j%N~&SOe}DBDWd+JZrJ;A`=b($^_rdsN)wu(%KLFQ4zXh&P zT{6^vCBCw1h9ew}WO;KodR`oRVHF%UqJxSjg?iRX`>e|gV$+p7`z!PsKhH)I1Py(R zmM65z&@NYQws^13p58LggthS6WFOa)YK8lqxW|FFcx!NyE|y4?v5{!J};u>JGu^BbhkATF=OhUdEx z7MQ%v7s&(9iS9||O<2leVrGLaag*-%GGkeyIb3I=-(riJ zhL`YAI8dISQI}XFqLp);8t*$xV85dAlzXhh{UXr zp6AqWjA`X`e?Nk=fQ;bJ)xgbgG4OrtXj;yF$hYevL>n_7Dj~i=xB`tNS1wi&tGA&D zO($s`JkM}VCQwu&N=0teo1cg-)I{Tc7k=$^Vzoi;D7>X+;L zIGk5>OVmr)6qS5B$cvoDLgTXvirEwQ9srsn>6z3ldv!s8odbu$KK=f8vg0U^2v<2e?D!%jozVr6t$?nOt4(jn(A=YRf4YxWI#lWaq{hzZpe)zQpr!56 zV;&i!zF@R%$M%wd$H92K*u8+`%bQE-$NFf_!u<)0(YUA+57mJYSa2O+Os^ZtY@0DA zk`jQ7-fwuCAsj$~qXNIsllkRBEQCpxlR*2`?zR#J?>9<3IFVyhtG9|Jf8F4q)euR7 z<%=;TC?1@dPyjvn4YOYaiKD<+L7im1o1nMqJeLyIjy1y9rZU{qzkF3Nd=R;UhW)h`u7#-s z3!Q4ap(z9E75W?u%s*Kz=Uuu7vEyt@Nv^N@K9nJg&UE{+a_^K^66-QEzfBZUe}2$8 zoUL|UNZ-MX%~7~eC)JmFUOd*d)+wn7rF}WB9Ebj?NQ>-@rq^hwv`w}Jn)H)JE*6E{KrKDu@A}jRP*1$6at2d&v@Q3Ft_Ve^B0OHbY%)EZg6#TQOtdF ze#aMLD~|1h(V|5Sih%v$jP^K+utTLrS4?Ul9f)z&)7_Sh`MB#9YQ{n;W1}j*Kc->T z2RQ1W!E)Qz(dA@m)s=!7ONn=a*Y2G<-_v+q_K=@S0O51IdfXom@C!-9rhWbjQ<6Cx zajy|Z*@Qev_=UVR6>X0c#Z(z1BY2yRuKz*p@yjDZE_=)}tSLa@b-RArtKP==CH{7sSE>_jh4~PAj4D6HeXiH*$lUig4MOA`!d&Wv0+mRun4Ie(Q*gQFJ=ZRZ0^rNzo@GA|86#BSlFAVyM zG2I1WM9jiUk0Y`#ctUml=G|&JRv$GW+jZOeHhWn)*5W>Z{}q;EdxAPB`AV)c5OJ?r zkautm^U#aptza!@yh9fu0K7TJWbhGx&4Ba6+cQp?23hX>zP0aOTC{crC58TEyHEAz z%sc3IOS`xehDN0^3QurctE@uiF6R@r6W@XOE;)pqP2Q~qk3wiWr4~#Vj{C%0Lm0h^ zzVFt%Y$?Z;zl)rZ(H&eMleGcA}!}as1@QrRNeHM~P&D}YtEd;ne`QzL_%g4g7YBImK#tkD%v)s&( zcFfi0?$DylPs*c-P1Upu&1a`S^;hA;$94zByl?L~Sl;%MMwtR2+CMW8c&O;EKHi?A zuc}_J48mj=oaytwgcT~2h#9ktfj1#g&Mk15$PMwL>HvkiobSpPc>VwbuLh1RZtH z&~|=V1uyQ&W+6=4`6fp7KTn|nL!mSBM@N32BvadvcL74$td%QTyTClH4V70rkQE({k+|qz#2yi z*{PclAveDvWw4XpyR%ZG-oP|u(xvv&$rmkb1)q-DZV&izJz<#^#~a<3Ms<>OmS{^q z&D30_n~P;Cip0~%UGG^a0{Pz$4qvXNC@K+@;F7O8Q2sG<5>+2i&>V_qq}gU<(D*xE zpG?aOZpY!(Og1Pwa@dyHFd|K33-@SX!zjy#3;NF0n9?S6510e20GQU-2?=ME)!|)B z3u8|GNmO{!SV!!;rtjd1g59C*V%9(I6Y@1V_Hx!r+*i+?hT`R6m#lg|aw@drQE`7N z=P9B4n;9UaikFTw>Q`G*%CXt7o#9jPdb6FgWCIAeMocXqU(&OiA{MTejOxW530Xl5 ziP3N~vO1}3hXh%j=Azb_;xw#%EK?j1HiZ>)tnsbIAt5XH$BP|Bady;8iFONBRYw}j zQx*c{uGUY@;nDZ8FLkwZ6gP5q$k96A1;0#B{B{+n^sg@B9jrJ`cSmKQmNZh8tQ{Lml)=Kn)>+S$Ut+PID+Qpy>2Rc8 zW}^W#-yM}vn8~g!03)yk;kW#CRfmnPN);kjxUl#SGH~KVcCB;N{OEta#N{BOKjH-R zTJ(tTti@v>BvFL=v%)j!4QAaZRoPb%(uKU!mjaRvkN*203Rb8?Ig=MavF%j5>Atp8opwg6f)z8G| zmJR=uRPA^xy+19YFYzMJx)fM;yd9oUmFJH5!2LUM9{^ zuo6YCV4#}wAbLS|Ma?+izf0#NVI7QJf??n>hpZ53_!9NXA`;tMqbRn3)E>jISZ?B) zQsRm4m`vzUu7EXUeTBGh{E$6UM{^jbyMg$7fp{yl;`h8^rsEWyvVgigr7Tu$%l-hL z23<6L7w=|Lbej9ImX)j54m+N0ZU@B9;^t@iO{2=-buPFv)C>Iyo%K2>gN%I{%7|bF zyuS#wWbWlf1XyUm<*hi)VISOOQ7CjBq`o^ zA5Dgq%Gk(Bl-Pd{$(ysSCg4tQp4Bzi@PS)kMG#t>?2pHKn!gI1DvS)0dqK=jAQspf zK?X?+@gDE&^|GP7U3pOT%|j}V8^0!IM=TXS9BvM%^~_JnCj7!qNe@*9m3eU_tWr<1 z=?*A40TzQ!6r=AH`C5ss+-UM}8Ng!|6rZ5sxa)M4wWO(PDmPoFoDYzFV&-YqwE1Fm z3olz4vm>4g9gdvIT9j0brG?nb3UoI3Gr(7WJO3qO-L9;Z3a5>DkJ^bqISP{x(|$A1 zGc4B`qD#;Y)6x%y3hxN?VM!#FdP*T@h6m_1Kd7T`gsx`?JfCe~`ST8+pM{km(^;>( zd`P9;ILCV?c-}R~dagxEY;$miRrBXJurT?_c*JV&CD@lIQfGd*{uSvq$oLPvsYnOO zhz{zSVUCrC>w=C_k?YS0d3pRQ=M{P^5liL$y^}_>1L6D>$C3~TZ-6GkZL0n`P4307 z*Qw-EW~N;l>q)!mr6Wat)FNO|YxSb9IIYQ%tvE~_l2_J-YNK&nh{FGG_|f{IwPe6} zcDY|}t7+wNQpCpKw4nWWi~a7WK?}6n5uRCS z{kXwJnLG_XJJeuz$*8>P!%9)X}bVLcH>Uir^Hbk6K}b(dYKwz6zT1rT8WQj)SotWLbU7(8xtm~LS?I-O8UHRc zl@)B>P>t_;4qwS_QXXEg-kVzVQI1KMi&f9ZJOE%R^p{1Qfgk#(`PU=c&YZs~E63Zv zbv;zk^v^;e^j+C6?`yRJhHSn%&C`}v_QD)w@UQz#%duAg@9z(x)(1-`x~+v&;n%F3 zT7Q91s5tla``NXud^5JSAIj=(HuvKt1K$-MkI240x`UepzWC!=;V$JWbcv$!LYfXu z*2x3Lpf|FifJK~;+rCBZ!RS!89=h;LS{Gd4tR)4TIO^Qy?-9H@AVN=CYk}TDF;ZIS zj#E7Q231?eGJ^~7bpCneX(OS;pF9es<1XOBvC>D%hXVMPFE!;*+|97?ST8KgIW6_S zNe<$Cu%0gVK5BB9NL(=>xKJI`Ix6E6{0=%_`ki4oA3EKOOlLK+^6|%=o<$mK)k_nB z$HII11XwWB=DT@p5s5mquT&|i#I|2r+2c+XxDR^q@V2S@n$>X?7hgx8%=K_-7aSJH z^WtHu2cIrPhlHP@07*~ATwS|wk{*pUFd}+!hBRi-z#8H&mzxA9ezb9(Dvhi4oG~9? znDgcFGa26Dn)BlwOVvKj#6H9QO=s#>0x9wRe!G#H;f6UlH}{#jEpHAQ$l;mHCblK} zqh(Y?p#+wzlj`^WgE@t>-ch6A*~C|#|A$HBa~M; z_acMJlKl8t*Bj;q66Gv;CrjwOD)M__asJw(g9SOK{pQJw^J_m3EdQ2?d^6GCJ*1ZQ z<>N=JRY6mo46--Rfs&BfU=E5vD7CJpj8<6X$7f8f>QOE9kY4Fl0djm%v*@Mv001F4KxprIqNn^qA7@ zf(On(ozzYE!zQm*b}=ahv@RfvKYCpC5#txawX`agZ|?h-!nMguwB(Om37f4pF+v7> z_%=~`yW#yyj62|l;V-QY+`)PY z@!=A#10Fq0kmF|R?K>RW0YT+&SUbZoGg-EsEQK}!+xPjPKk}EbinBprds`;V*EWF@ zKXkk%nC(R z4zS!G36c~>YaPey2db%k2S7Y%WmK`oK*d2iQN*7B-lUd*yew8RBe?5-=B z_n&=qT^hVHC`IB^IGxOF$O5IdJjvyb$uD!4s>7=I*6QGtNV3@6tgUF*ujbY#_L)G`-^)v` zXtgwTO#o~9ZCqMBH=#6bH4^^*B~U`Qu}%!# zxt1tU)Vi|L5CY4N+zAzu>h4P>IO1r=e$5G@V6RABd+vIdimWzg#ICDE9`*OF#YQM9 zN)U;J^#$t6xoUurRE+P&MU1Z`FoNn6B$8VX2=Bj!$oir^3USfLd>U>hWJqX*50OH? zO)%h~a`}4HLNZ4A_?#Zm>2^jCl|(NTkStUdMR;;PLS~=JBcWMYzzh8T#VA`k|0$J& zpBZ3jbDM8qw63pdo2y*acyL?l7FNUf^aWM{f6S%9mQ7m%%5Fn00y~rj+ za=9&;ZWt>|+L>|DAOf1AqA@q_ZwA~+!6?Y6Tt;`2WpX?I3k7DI@3Eu%^o<0i-)XBx zg1wf0M`k7iOy3Tv{>ic;>52RO!tc~2Rcw*LgkO5JFpH`D{REzumCYH|^22agcmraG z1$hp74#{hQQyan_sT$189tL8oeeSH_I`(5eI^$oooTf#n$Rxh(nXF`~L?WRfvcMD) zy_>>Bh7IsWY|AhAx~m`G{v2 zDd5t`^HKa?wT^)gqbvNy5f{r0 zz5Y!_d15r)tJRbE`~yzUokGJFpf-5fc{4juec+Y6TVo9e`F)2npjJ%Ie%I)O|KDJRmH{(MS3>`Rr0eVYLOgYIr1kJU4jst_* zGO-WWe_sf*FHb^CCOK`=UDa6~?a$0hy*{lnMhiPLx;C6m3TJ*L#44FQ++lP*44m^G z_1!10a(SGd*b83 z`V3N7_|}Z6F7n1XzE#%2+Fp(aDEljEB#%zc_%$WN(mY7-q`<}?c3}d4Sp<>6v6)=J z;Y~#ps8e=z`YL8~ko~Z=kn>+7X%lm8<=du0z17)+a$5t1p(ZvCY$BuLFxVdzF!t;( zbr*`#&=j}Kr1>cKdJBo53ziTY%=OC)-&G*ohY)m-i7Mb-3%R`!7kpkXqCDVr7ts^~ zsHCBBMovl|M$f33Gp|YHb#k|ctvHE9@=C}uvS`R8OE??Er<{TFZIFmJhZYUdxHQc& zD2uUf^9!~1#8ukFNy^iJ+p)vFU2>I&Orvnv8h=>??e0F9-FOE0s6 zJE)%OV$7>wujtSUH0XIxP_4%jY-E_xTS=_Bic@?rma%!i>b?V8^Kpwp240nh9NX5q z_^+KA?E1(fGDbh!5c=556@kcfROFhjjG5bL8KAfP27Idey1TV*0wJb^>I49!4+hLM z;V>}kYF3k`!Go*8&)iqv=%+0fL7HRGmjmq#Vv1tZcwTlQlfw_K=E?!_OO)hr`Y<&U$Wbjq7{e!0hO%-+NL~ zZ*N_{sIfJ#X^FaWfcU&+dB>qeiaL%h)96jO?0r8IMvE3i0i%D_TFBV68hxYo((4Ia z$rv|~kG)_>FI4zZ?1YYzxhvy16BU#o@4&~?IP`Og*9zF)GbNwPfxpMo5Q=;qnx*>fHuZG*Mu>C;mCty3U{==4j&)ID`4YP+ z`$v6>L0`A;d+M`P%KH-E*8gdZQ!XsrD9hBpqStcz&qM1*L1IOXofA#t*-b~2(OJa) z0P|@As1mQFW6>rF?Xim_)l6$n`Quty>q@od!2_J6rWlhD9o$5T*+*v)>Bvje1&qeO zezQ$AgqF1Hmlo32k#4I3K37DNuPG;Ct9FbXU(JGWZsg6KF?jrQyVyfI5lLJf{=65= z5yFxEvEyApB13RcK1v)^`Sf$a*4))u6XIuW2`@GCPHKUO_zjYe1E#7w92JolF`1Eo z5_pa8sjFb?^z`R5dp?*;z3%MH+rkkVl?bSHPi`Oh@p7&EG!>z+z;&IP?P7O?P1EK$ z=e<#_Vf;`sq`A2#gax{<%J;_yhht_CUHMvFDlp)_t4O>AtZa`C+n0@OT#2rjR;X~m zGnWW;sPO6fztEOkHd^&eJM_|Js z5BjZ5`=~N;@B-&wVc=M{HZtVGqK*BX@OV|?S=W^&w!|WQpVq*zmu7R>1j* z?n&5>H+@?3a{Bh}1a3khX{_99-3#-Ug29~7JvdQ%$7bppPdV-Y6+1$bNU)f-Zygq7 zE;YAI?!>#u^&(yK2GHuOTA2Gy_?V+e+wyb$XtsQJe_`d)PR|qL^APS;ntjuZNv<@b z__In|gX_VR_bsHi)u2N`kZ+;RAop=*wFN?s`AIS!W$nU{JnTr5E07+GW4HU2J+mx6 z@yl{uQp0TiwQF&_&8-C*eF20!o&3tAu;ft(b1j^C%PvI49O1arXV2YtDK z!J_=TNr7Z~k^J)#EQ8G$Sh_1cdi-_oIRzou{*J?;;vO(`$A{T;R@qRM0Wm47B$2?$ z;v6?weDPx+Li%a-@IeQ^blhw4Xus3Z<(}#efk8<96)oWYabM;9gCFLb@%FodM>M!e z$)~;cpSc(*%yQtx_gfXQTk|l}7$Me)#hMI`w(q|@;C!(Y>ChfkB zpJ%8giP7q-ROCY1ClSJ*v16?()-IPt=f1b6+oQ%IY4f>{3b$(vzDBf|f8|d$Oj}S! z3@E}^CnwQ%)V>eDML(qu5lloJHY>FgW~r<#xo%>hcX(V)@EymFmq!imp>ACIwSX@B z5(sHil=Mx?rziRDQzB$CHFX*1DFn2Nmmhez(`gZ_#w4~C^8;-|g*={#5ZYKwEZ?%Z zqXUK&^at*JevvMgcF^1%sfWwc#UEQQp>~~g9O^+;(t!ICH6Qc8T4Ckzy3AOATV`CQ zXeXC=d1}tyrd_YQR(4Ap`E$oT$PWbWX5;ect%xN4A}EW^7!|aqnrKNNVt$g)uETcm zgBkMH6U9N$CYgr{dkf}4u)zc>Q!rq~NOV{Q6=C73X~M?DoNjIe1Y?ihR#BU&zlQ8n z%?Biv3i|J(NbGgRXur#X^cpvH5hD6K=Xs+{vOMk11FggMe$9?O?Hr_Y*8I{7ba~lw zUgHBk_!a!_HWOHCKiUJitC}#@V9JmUhPh4XgSUl}#T*#AY_FS@l2Dlsfj6t9wGJLE^q$bfp#J`w&(rp1bq9{ zqAR;!X&bu&%0jqm9?fr!FGtK0)Vx+DW;dr%ZXKk#Gil`nPNxh&rcy*tX?!pOCK=81QmnXQe zT;Q=>l~~sdn8;nfYTHYg&kg9c8rRa)ez@9KE~k$4G<2{@YpH`bh*C3iX6}=B60)D( z_#>J%@qHAj-W6W=cMi>~NLWYWxOQO`p>+!!*D;CFGP|1-@*tg1g5Z*KMa`8=k5G;s zqhx~ygaV6;`N!6e_maZ?9lzNO|4f<3Wp((mq>OaMJ5io)&8GdzRkY*c$4KtSn6;Ta zGexpv0;l?1=Uoj&7pokGZAUhJdoxFt>?z*ulM=ogxR&BW=^K01QNK!k{RGSJQ83~t zdC^AHt4Gc>xG&s5c4z;lSU4ySi~Rg(>%nEx8C&_&yhV`r+2%gc;EE}%IuF#FslE37 z`eAxyjI-SdajE+ezQra@0M01YMz`O7({y6A<=ynr9A|sj7HTlf7T7LqjqlxaJ#wNR zplt#_3i~7}U`=T0;$AzHQD6dbnop9hB(>OrEk5=g!Ejz%MtZjng$0py*UbN3W*f zaM0M-_Kg>Uw&gHC1yOKbEv%6SN4_S)j)%Py@5#4Mkv`@k>7*0pR;DhrjrD4tX^oVA z8p2qy4~?lb6w^69#qClgoz_~|!v|`zHJJmgGaxNgN86eJADo1l+>94{Vzdjv$Jdt1 zCO+7Cnly&AHutc(N;7n?8YO|#N?$b;Hjq%;;5`wEpx9f>wt&xg{lm#--l!WAYzUtD1u z9|Ft_aUee!U@lzW<)`13dH{*6o8iPp>|&+VA#`&N47gSU!iTay(;Wa!VWO6lRue@n z^b7iYTZLyhSJeEhzMKxI^}Swg)cVx%m*eJEyyg_QEF!ku;3F|E5=-3-P2-DH<(vZzLxHL?oxP@#+W(5a~K-XcGaNL0o7Sj`I62 zs=-(m=fO?+54^dW@5K% zgLhen7O@%;S6YVSIve-9bF3brW;PUn>zrhHUu_XYQZ;_dM>5LA9{K37I5%p`yl^Xl!4u6-F1Pu^eg1ZwW5ZvAM?(^R7{<`1Ko$cM}>YnMU zQ|ELSkk=+1Xc5Kj&zW;QU1a%AU$``SK5o6mYnZpbopEWe`YptdSQSfmLm%9t_TMs4 zVrSSM#Xe~@=30{M0?=gcMUz#zR13M}!h;AN=WgGY zA%z6q)&;YpHeD>K7oS+FI%*O5icyzms{V3#p8WAFB>ZK+;nTplAQM;^&Fz z^bnO^NOm~$K4b5e!z=Mo9lB{xB33eM;{rbA-x0UoB?Ta<66eQ6x|E%01{WFO{?I{u z4;RE;@vZ3L{UjGcX3F9Z=CA7?bRr|f;Cz$i25-TdjvC?rKeZf+U;hC|C z>%0#!tmn(t5myytm=$U{oqYZ`TjKk=QvR#PFdh)FE z9Tx-Y&JIYTkflQx!OIA*DRU>2cRfHfVfxL*2ykOb6<0dCRr(uX;ih#;SoK^~lHJn_uR24W2K6$CCF?b}uZ>7dDk*hP{jJEG}6Bw3X)iae>E!}qVFybf}ZvO8IXSifx z$CvUe&fRtDZuCF5=%+B@l0LQbF<12{1~@qXz(n)Di(QFMkz1Utbz4$DgJF>eHsFPO zK=!C1EhkKJdcD>%_*;T*#9u;xrt(_R(6MzsL(mtugk@uTk4 zFWo6H{rPx1y7*Zus=&`8M1?}tBXmt!{F1Bs9*^c9`raw$5d*>sj-P!_zdEm_Qxesz zQaQD2c`lQmPtFmg*o$zC7ekFiZ-atB(}^A38Dl@O>wASlbK;$e^iDgk&A)Zai&I74 z?^3H|$$fUxW1F4B5DeuBc|q$DpT~@2lcTZ-G-;wZ`)%O&V%)>rL(ghYAHf4j;$#S-h}DcAYmU0q=))x$qbo;;*z(TGUe|JBIRe%` zzqe$n(NKI<6^6=3iK27|_xvc(kKU2=L<4?z_K1M)v5GQG92C-a3ok(TL|e_9T!r4> zPjrtsN~DfQNR8kh&hH;;wtP4AZ28HrfQu0mZVDS{iQtP0s(~rGInWr7LFGVOc@lCJ-QTyw^Aht;1)lEMvAc8@mKJBbFsh z{2QFuoEV||zi^=7!>kFP-%*6d}lG%&+ zY}Ajs!YYEs^NjA_i-T0MqCsj1d7R5PO|_c9pVMK-8_M?kGX3)~l5$e}kOw$iFn(r< z=>Lp@1uhV&XMWF!?px?ZA@Be&uzh z@^v(i)&uSc#g*AJmc}^F=mXD*y}uDrt@$7?>FjU2OUHwzidp@XUGnQtujRw#Zx%-1 zM+jCCv)S|G?}+_RA+1`xn7+fB$FSo^f| z89oRLDa!{L-|$$>L)KX(TGd+zy5R`A%Wrn@GkMQn0c<+*8M3ZjtuNZ0J)7e{QboMv zyDp5}cKeOkA|Nog#|=QXCgd+Tpjzq$jwT?;wwHYODmSbMCf zVbwwVca66{W0>(>)lhyel*Puw{zkNHBMyrB&g+AJ#K^Buc`S`8YkAlb)A!o_+*LBz z)VvU~?I@aj^o#T-#x_(Ku-p>)Ts+sqMSxsKzQa7zxGf1FfejCocIrnEH)(ZTIR$#> z_bX`w67Xo@a?{Qa1ofV{H5fhz|2hrv2Q6&s?%WEUe#4)43TdEh|K_rqOFv0JN(D?gqKxyuIKQdlbAow; z0)-ySn#F!MN@hUycoKPTa+$*=mB~)52L|ml7`~%$ngFxQU>IfHiy@X;T*f$GL)FUf zstlUy^hL3)KKY+oWVsy%h!7qO$l#wu^I3GI)E+C1HeM^^p;T0;OIzgVwBJL9}kzl|uqun!0P!4Kh`9$8o<7$G$ z{620sI2Icu<@vYe+-k#X!yYh$1GuG~34~}Z(%*|a;YqB1Y|iyb)(S)QXSB~*5<0T# z6Q@oR`vq{?+(V;6o#h|x@Kw(prdwN0D4WfTIbZLlmRgOLNbO}qXIQrL<35<{e)l&B zVSf7;m+je&2YWPZ^kWc&?q>^d&gcS9&GqWMf62rG-}DqByzDE5Ex=G@ch7E*H;a51^RxM{H%98g4X#j?2!JA|p@|8w2pud^~WugOYO`8sCFhVNM9OuhJ-o3vT)5e8fR$%ka#El&R&YATK|5Q&-ihiAsxyt02R`H*zxa)B{tJ3+ zj1Vko_-Qj)&gbp9?|u9!004IWWWm_HJUD^I`)ThLq zM4WouZ|q+HdEMbLmdPGF0$@{}EW{5+6p!X7L&fg2XSK_9d3lGwz|1-K@5LYU>Y9u( z-|&f*)l@MvCFDoijHBDs9ZZwt){$wN^KWf0dRjSFQ-% zzH3`UK#!qNz)OQWdyN(As72!pw&%B-=fMq6>qn(6^Tjd}vd8<<>j0}-PH!j03eNsV2B0MP5>rYSiC%Ad7$WQ*jR!wy~Nh$dUQz#O_4p zF|!vl`Hs<{LCv;|8cUYcp}PRJ=ZzK@Qv&u=%~P;0{vokvr^go$k;UP;s*yy$GdJLbecv<-5jDU<=O6XDU$C#c-=?L!v2T)VKiFBH-bg<#e z8sag!s;}0pop7xvq0YqN&3968us1ZF-cLmwEjK?LB{>Yf?$hxuBA?mosTNT|V&wh* zVnyKpP6A9^Y5vF7#G-4gP0CaS)4@EBg9ZMHSSjL`xD zw1|(4V98arj#`z`a}H`+`nB!R z0-f&2poO%Eg^tC@D{U!BDLGHN;^H#iR`pukzadz`eID-jJzzK8{YeAAWSE36R@+9d z978|Lbe9D=R+@kGkDaw!F37F=9N$_qx4;a^z=~}GtxO-G3w)4sPjWJyUj2^-a*wBq z)d?LOnhhIe`h7L;@w&O*d~eD;q9;nxOUay>UnB^#4#_9^=k;I!x8?v=Mt@TRJJthN zldx|8ux|xF3Gh&WEM9JbZ!W_%ztQH<>@JLF*fxVsQ+&8FdXy2`Ub(~7x>X@#mcLn4 zZU5Fxm8HF6t1k0MAP$#EBLIWKA}zO{G%1l8o{r!evi||7!z5c7Y>Hgj29i;E=tZgnoTocag?{0r32IF!#$Y0l8z%P# zL3J`z?auIiZ*dqFmk%P_@Z+3&$>8hp3M7#5^?|Yi+3`|9pSM_kA5IYF@G*`R1nECPt3c2MB6;9smO>QI z?6bW}AkIg#6apTe=788e2Wm@9Hq3H(dmc4bYS z*t}l5!8|!4ErAKxh}YyR@LbhWbfa>p5|_r{$|d5GBc4!HpB3dFt(1j~Lc;L8g32qG zzJ#es()LRR95u#o*-4mlzPuN2$Z?-&;i`6ATfz^6p(Zj}oSqymzpc{5USpu@gQ|oj zv2Q=F9Y4=N-pN*pQeM11Ri~f(0z@ z#jhw_q4b+b(!q(5TZ~a8l0pdIkOpKLDce!%=_!K8$>T7n&^c%q#V%cv#GruBZgq=4 z&ptq0lNe;-7T#aG#8ifXLm{BBdk8xtO=S6d;C97Yge)KVB1*s$C77w4VhAsPCQLvI z--x0=W5Eo&(*n8Uk?PTBSXi9Io`K+*;9*py5uYBI7!zksjC6cRgWm3t9yCeW;j>^1 ziD^Kxq&lvFivx#-IF9!tYflykBMQd&X%f!ab#s6rzl^5~1jr%nNKgov+)%i}nQPU# zIMarVUI}d)hwwy}tN+6lgStnV4%731Nk@E;8g*I)IeU3r_3%jbJ6Q8)q=&u6opV{b^_D_N$~mAX6Sw8lqG`Y*g*DUyZ$HX53ud8WoM zeH%J)cL_vZPD|cv;TEu>?{=GwT(x0GHqYi_1seDBKi?EnoQ$*s*@Vv2AFnwA#G zL<{43^{KTw1o!7Gw#2C?_7m?Th`<6I~!CT#dWuGl`o)fx!vo_QwGb z6@cFT@bvhX**91AzGGQCw!%PFfc^aU&89JW2U;>0^k74YUhH{krN?{CleTlRIriHc zb)KI?R=%MmRZF=_V)eU2R(A<}ex}HS+eTQkm`{Gz_mbWR65l%O>iy1wnU#1!d6*MU z#MW~ay;|YbeezS{mbs2dexrld+WrHdUzqs5=ubT6J$EzR=%Bi{7SJ=CO6S3n=K51S zKH7hdvSLBNJm!0v>^)Jd&r*}Yrnd3Ji5x|>s5$q|pG<97A{Scq?d-{fWVBuL$&@T) z%R$35XToT|y#cGrMEXM^a;HGfieon9b0^^Ju)2`GMKtY;2Tl{gcy}BUf8E02UeiCQ z3Eer~hPp-}8GHE=cy1xFU)J`xs-9pPt%!ZB?O?8 zJ52GO4`k_GOuax)zTGarKXYPI6FB5#8+mj3|E&*f%MWk+iKW zYyX2+b(Q85_s7DCe$pZJE5zcBrlD6wK^ZFYsbo2Ui_%@1AEvS!$BtxeETPuyU1l)Q zfG;Gys%vIuJ@KV}NAoVKGyan_?LcRT&s4+Is%&OQ*i9Mx6;zz?OiiKsyRgxXa9~D6 zxwu#jmW1Uq-k_iZy!FQFyZeUGz422=mpcoO;iS!=H|OC)~}T=h3=rrrjHf zRk(HhT$c}xtaB8l?zRK?gN$37-0cm@b+^kWxLxf1w@ob;W~U+k=j`*B8QR;sO2RRA zuk0WjN%-qZw@elSqGV=Tz&B`NNdXmgNI*<~S}xh3`mpNc@8>FSesK$%+0Gn7(okKVwXy%V0UMP?;Nssb2IIE>X!-{8MKLrdv&2B?rW;o+@t*zWh0u#u&ol#5@>6+X;W zk=BZlg*YQy*R+({zow5x6e;`)sv`Fw<^E=a(|jqW^Zm`sXegWQ+Y}>?B46Vy6or+E zO+{*&0SNi%sQT(NlSQzkp+!k^y+NtpXv=R6Mvoo2Z?R08iwHe^Z7+=TrF(joAw=>% z2Xl_9&fnwAm7>bI2pondL4Qg-vcGgp#YPa#d7l4yHhv|-@i_aJji3F+i@Wj9u8)80 zvWHo^<+_Y}`)$0T!A)!&bB@%f4e0)665~COZjzu6YTrlEm(K2?kaEb6hLgL$whWR8 z5@WE>2Q?QZmJk6ubP*b5X>#4cRL7blTvyfFE6t~0dMP3H{jCT;po$gcwfybna;ly8 z=u!81LR+mtFx(+`+$M`3AQ_3$TxW*Zlz_V`WRFj9+c)SMJOhDP+;bQ*a zou%PZSNSA6;_@+;1sbqm&*PaPNCu`)(`d9SeLpt{UmOe7Lm%+p+s2=w5+gTC_yh&X z!9AC^{mAnRIQ(+18|aCQ?wD(Gt<~2AH~C4G3qHx&9yaOgc?%mWUCl>dvIm`udJ0_t z(EVp>_iHhR<9r1_&eO=CZJ?KP@&wgdqM-36X`--DkS_t?a6g9L+-m z;yGEnS5pp?!}~fn_iNa2`!Q^S^Bv_`s7H5bP4s$3BE_>lMU9#+F@DP+AxI<%`90UK z&Gq@_-=W}o#}JCwh`t4X~T@1HTG;@7w=?I1WWhFN=bhI9Hbk zep|d`?2xKAs|aqrY`fI+rV>p_?{Rdtpz^?c8%#ttXy+9CaH24ju;N=CRA5M3s$jMj zKoHi=K!b=mx58^Px3jnb_2Cn!WME-jSXOksp7F$UT(iYfPo`Q6J9BUKrLyT|zrgTQ zMmuXZG9eyi%Pv^FWo{>hkO@=6)6TqbcZKi%A7b4K>yS@+y}^%yhU|>I=5x6^P>V_-*ufoZt!;;ft`;IXp^PIi8#%1k)I-WJkICloHC7Qq3+4m@2VK6kMteoNj@W3V9%E$3QKan5`t z*}OOkogZm;w}l!1VBIl-yjcO&mm*S332q){-g~&$MWxj;4wX9rA1b-_e;tf;LwB_B z(vk-#6qEx;FQF2!kMqft{g3bvR(raVa}vwR$Z=vp1?0FtaJIz5&Sud`A zQm_1)r~RH@{1aTR?Rw@Wnszs8V@aKA$F-+M-o((_?yNQh zA48Hb4%2#e7pE~S%IzT0F?S?C3jCHiLa)16dRGL3))*6`pl~FHw0B`9Msl|vLR*2y z=PFG~%9qkB7g3205-PYws^6nYDke-}^}ttQtWjd?Me7-H4J`x#i3FvtuvrdqFb>)w z5{9@wfNeVSz=M!f4mp053o}f-nnWpD`D%M-c+Zpp{78J63CJUTcbm2_Wt40}QG-UN zL{W&bf<|=RxdaL(3tV`fPy{IAR|;K`|358&6dZhlcxrffISK9K6->J2W@-{~+mM6Y z$B#ytq)Y7y%+?-q(jlWT!+Xi!!6D+I;n5gGN|tU|Y!FCZqL^99zPG*gbbGAvm?c@k z2r&;?Rj6SI;3inc7Y!j!_r^P}pRQ_+`5-x*L6!CuZycb5&Pu~S&YHyk=jeiwl3;j`@6vH1Yp~zxO~q+j+DXO}YK- z-x20*3=jd5$&*pnIEg?IJ59p7Q(ROX$_ih}Gq*Z}6X^dmt?o@bo%35-LymXY-g+>q zdMQ}*Bl+|$&ydzq@ac6MLoN{-T+XG_h<=Jv;_uB-UVwR*G0YbFGkCg7D}Is4fb^Lj zk|{v0WF{Z$9RSC|B}*(LKo7MT70UCUMRnnWC(9MO|@9)I?-DwX+?( zJRSrZFPa>W-z%ODsv+%mhd}7Sw{D+x(V%l_?(ZL#SFz3!bL|J6V9j-+dy$x_5Rw6~ zKCV#2i)@9|=n!r^MJH}1&2OboPYadGkfpL0k{0vsZ8SY}!2c89h#m9s-Jt7kzk?l3 z9^cRZa$mo-uMYa(MJS+io#FKPrMT>jfgFDb>W?J?Ne==AVu*|ihZ*E0f;K?WAw@6* zV@(*OAP!(Bk<<-hwBfzp$M-gnin*{@dm!&_n-Z^k8{b15fnlmrQBIrBtN8z|8o{!_o-#2Qw^lE`oym0WZ=yZzj2iJR(1GTp8MRy`UY&L3Ry}ldS z5!&e15bF?wtJ~_UD9`rMjNAryU-3WiWR0gGytrDe3~L_29ya^PCaOIwtF`x$$~tI} zpr>T=nu`p!<-saz>oFcbQyqfow2ZxYz6MloDtCO4uncqJ$L+A`%4;khVkrY_iV|La zE2Uihw=6Ak&nL~J__;PM5t*vjqpy@)IQfH#Y?UrrbpprJmfpEQ=7bf=fmoCD3-jY| zY2$#*%iCpCe5kvn^Qp7AvwuH5f2ATm@7NC3J$9n$p4xF*cozO_`|C?+-DON+vStYT zH&%@2Y~@a>U8-;%WM?jjk}vf^1ylZQEO!6gIQG2GSzj4-=Wr#`ryAsaHb|02=H){v zeRrMt?Lg?0D~11~p-(?0lHri7w!cyU+aGTgt1j`j!;_1teWCqoZqTF#`)X0Y-wG=kN)XrZTM zWQuu-q9k+1Fp0!0KJWdAyz8-JK%b5B6*#fVZq&;bavYS+8-J)dj=YPItU#ZaboU|6 zd9#d6S2McG8hf#r{EgeV{>84hvSc^2tI;RitW!^5iic2z?#cgHh>y|E>33OoT&AV< zM%K~wm5*fdq;tfYbJDqEBpnfb=9ftJ$MO4obp%0I2#mc9K7l4{p!I>@ho-hpsO5zAKl`j}L56N<{bnYhap+al%^K*DbnF14Xt z{IHJUr|GxXM{=x zqb1TFFsp_Qe$!rGWSdc%8dGk)pKf!KaCbS|pAiQEYZ2ZLMt?|1NrEe3(qqq~Klht* z=~vbRoAx~#KKaMBSM|wSy(J@-{-tqitG*EZko72+FjUyYmf8Y^@>kA4pQPL0m+g4V zddOjt!sI+1XELc*1eGAbF#ChS9Ftxl4wAGy>qmTQkLnW&=%oEWE?MqRtpj7{e%)9$ z`sI$lXp|1oNrv!g50AOR$&tt^1az;qGLTK|jII!X4{DacI13Ut^DQ@_hhaSp51)v% zUemcOVWWVqs|IbkL0DczhMsc9>pcDLHdgTyMHr*KXPp@(^&%hHt?u?euGp(dQ1;gb z)83XJG;&L|#KP0Tum}aqX(Uim#ZNPyjHlYWIYH_SX;gM@gbj3?r==oZLga)ww&w<8 zGbJeBfA`DbkwXtdC9}Ly0$|Jo2oAj{1=shKV*&$Xk+6$bX06pIfaJCe?YJn*ql9gv ztHiE?U3JP+vA>esKkOC`77T!8dirOo;nsj|f-w$vlf|XM3uEwG>+uI=vhNj+86T|e zrhiz^Jff1|jP|F<9MSB=O9@)XNmdXoq$TbWCcy$RAp&AFySEeT7zeTAM4E=pG%sV& zBIdL-zb@+Zj+wCYX)W`!qdQWkmIC0xJkIl9Z1j9E-Bg@7?B`41uX-$#o@L%SrP=7G z8@QZ|g-H(vlDS@Df6~|vU6ZZ?1WhL)kZIQ}6lEk&y?T%M^tQJQ+0&vgr1R}~vLDC(x1tJLz!x7duoq-QU`IF8?ra!E6JIIN_M zTuo3(f|ea^RQ;ulu~agWlkT>g2LERsr=74=t$IP|^q z^Vp32qYDz9z>LAtAJ1zHNJ`+X0(owZuEz##xI9z`6%`*p{NAuEZH*9db9ml7qyW_;3^g#A$cUvzE^s+P&t&;g>Pt^XL~-4e-#{ zg*yj{4~)>ylF7az07t;4G5?PfhJ`Rar}B0%ruaP4kr76g6h&|w{>LBE1H^6mTq1X3 zZ>K6*SfT%@ec7*Bcxyy)zQI6Oec(AN?_J&BPmL8Ze)^^~EN7m>SDz!`xS6J={3C-4 zPUd%Dj>ijvxwYB-ghpbQC&X?-AS^-kK16S##i3SqbSOM{bN_mbb$Lt5!{ilcjOuDE z5{M$;#_kJalr!XNH8puBpY!2IoJk7r8<{=)Yv%w*p|jgQ8&R{}3mf^bZ>O;+0goD9 zLvb)$vatNSKZ-bX81qF62%Q_JprTH%KhH8P(Ri4G`TU<5yG%8ST1cs#ca1m^JTay> z#V0gsNDR#Xe!FzPRMU98aD08eZ*D;W{z*U^j+Zar3tB7+vDLOr0KM*onL1M&QFql@WtBZIm{isuEy*@b7Y_+77 zf9Z!;lR-#-yrS4s@C##+h18=^wK7~`bO@M-!lyLQ$RU~jz6I|x!?j|d!{YK@S`-cJ zepwRIT#=^tm6B^kAwnS;ZB&geXh;TRc5~lt(h|Q4cK_(|H1&oy>3PPTDO44OKKkVz zUQP?4Y=4{@vM=~bu0u(d>2W{KFp#%6S^1sIj|Y9sNul%~!t)ID+7fG`#!+}J4wS`j z!QCc)<2KU&8SUgWd%b6e7_3|KHz!f%QAeNVVZO#?;Sr)r49bC!X5(Q$NkD07t0SdU zLpR{O6!jW~~Ul648^xTxH`T{&#R|hf^H<4xrwvVuW@9 zuIoUxK%jt^gROw{x9q4HIe8bB?YPcEwd(LwG2L>UN{l=UU(U(yEqku4QXOG_YKEaY z{fpI$kIu&NS?k6Zy*km9hUWKU%d^L~1;f=TMa#(B&X~85y(OK^&DYfWorLd8)##_v z4j(3=h2W(yHIKgEF!J8_5pemNB5(X*;Bm;8yfhtz2YXHsGW-vXxIGqrM9ma3g zBv!R=gg)bp!WSGJ6lsXQeSW>Ka^(6Xm)xJ3quAzi*#f`mD~V(~VO>Qxj7cT&t$Gml znEH7!!cmuqWGi3KLkj@@M~d|cFNWLkASZ8Xrnf6~X(K$y$puh|fX<|6ly*h>$>QuW z?@dLj3>)~&j?9&g(Q(e`hphYB(f7JS?3wc>WosRl-z;6;h`&r<%02|bS@8wV$+Soe z2WowLdL&blA38kaXOXaY#71OH^G$@{8U-wWzM5{Q4;JqG{l_78y^N1M7mQ#GI}nmD zDpLx~56S2!REI1Ft!xfb%;<36822Q!1>$Ct5y&KC3}p%tqTqh+e|FgxadxK({*(xylN=sAVi^ z&iO%dvw0t6gdKk6SkZP0nJHc?rb(vw=eO0Lf5lk5rhkM>V;Jo8Uf+qJ5yy3K(}wQD z01p?ZiIIQu>kk9wZI=HGia`7FrHFP{jlVe0-1R>h@kLH1z88ijI@GFby;7C7gnc*h zYJjj=uYSvq%Xfly+$V9$=LK(fuI~%9m1@I|`^IIgCLn_6Yd^paeO11rnH!+rEMg`2 zyUZnV`g4N+$B7${zi4dCT~pS_p6&LI{%_6e;j4ZkX!j&;GFO5~J%osoqCd1<;U4<1 zB?CyhRGs%OqzSkO%QGN_4Xse5vZ1xvK;j=ULQ*(w8PfXD9Z+XVnb8axnima8o74RZ zaYkh&SYP^TUmjmcb0zLO4O?DaC-Uk_36?0IyG{GfP zwGPA$0-BYSHuubPJu!(W-F_#ViNXYUNc9p~LxR9ssAbak&gR=s4F?E4lTFybzXL|f zMwOCtu?>33<^RM?wJ)#ASBW!mk%J?kZu0!C zMSh`H=l;aMD;8QgBaP+fGqaL|jK0pN8sO-5=C(m;Br!$P7Rnp{S4j8Ql=Dks=LX@Y}X>?aW(*ntyK<{<|ECvE#lVigu)cWS|BCDmOwfs34<}&ss(y6*OPutb^|O#4HDGQW}XJTOT08 zYaAX;W+6N~Yx*Ly#1ej0Uu33~WUq5mQ$D0^zN%SRrbb%CF52ZmACKEm{C35`HovQ; z01fh98De&ERIjS1 z0EGO3QvLorQbYl6`gF+UOv_#hb8S4U7n`Usj^;wVN;|YV&glhwBoB>zA_i4OAFb#+ z`-gSg8hso7T6n#P5Dv)dLu1>W(+*|i*Z5??!-=DZN{YUD`L~nemrCL{Sc0WX>`H$P zdn41@ctV@>f0mYM2kOdBn!i=!*729Z0|RSb-&FMPFAS#}RM!4Z1-J1W7c?)M zgYBU{f;%plld%y9JFqsB(C&z!!37+ep8)aU%`~>j11gEz zvN=RDe~B2Kcs>p!w(~xcW%C|%6(@du-n>`6_1m)oZo-Dg!nFRK{mq6Oo)V{~Hb4&j z3B(vMw1#LXgMi_wp2~27N7S}hmoNAPczV9%<3UKfuf=Nazc4=WhaYYPEWV)vQCb#I zSu3^yEvBHZHJ$B)qTR(+^J}AxPs;2LU0=j}tE^Vp)Ap;!uzzBo{rgOOx zcb&xLwp{z)#@);s(sKe3QHa5qp~E{fEz{#A(^&8b8c8q_7zFJ-w*xop$-xZ=%#>f-_hD(Rur(n0lIq4&*hrPRel~+|m(-MXgdYYAn(V~~pa(S}&I-Bpph_U| z{uuRPOc|0M!cx+ktG^`s*(jlly|&>oK@MJ&1k0`=x8f>9^0S z#1&qS#Y@hkR|c?bQ!ivOA(lCs3ecHV{@?!plo3Z8 zi)9=>0)bc;iVyIhlk~Aek#>(s0MB8`^(K7(*w;-(+m(_Td+BC>XONC;0fW3M|D%zF z0i56s6aUFFwhC49Q{Cpp%4ZJArgzB6<*gF-Az#9YSuSi_U20k>Ac#u>g18d)>}9XF z9&T1i7ttSj4Q(`j^vUy>fQ=M~-W%ViB7-G<5bv#w|B1De`_EeY{~Os;Y$Lz}YSQn# zJL*XS!xvU0G%CgYY0?ngC|uYS8e> z{8R(?JreHm)m6vktyTOtcXs=X`zDU1T2(#h1wTjPNzZ<@LRY)}!{EgKl}`Gbi{+M% za$x7?{5p}4bH7@H2A?%N7!Y|*vaq^90L(v2J&3mL{Uttp=D3Hq5ip;x3*o}1GkGP~ z;UM~wNg+ViT`fIUe^CbqfG{K2e~TgidnGkkF`MxHjZytrx}4odZh&G@4@u94-7pXY zM2T#ar%P5$m6!S(EM`&9!-ZBnepgI}pTDMXgf9rL@3Fjm+LS(?`k|pjipg$cqFF-Y z{A+Y5;mm4M=uA}qb}BfOeVN&6&|KR_-g953E38hOz13W0?B&|)RhuLV%^xG3(Ug>g zlpbB1uJb2NU2DBx#!~Vs`s?Et7r-?4gec*?`Zh{!)#2y!;d7YMsz$d^CYe=8QlNaZ zG#3@i_{UNtc$xffAD%?6h#*lu)Zu6ixCGI z_*wrM4=KQY(}f@FGj3@lTg>f$sdceH+R3)zz--sTO^mDg8j8Ru`UfdKe%PyzkDjwU zOm8}lb-5891}xaM671yJQv!Ro9@L%rv9QA&k`!i>=Z{o{eJa=NjI<=&-OhBixR|yy zrG*9?ka4;Kb+{6#HA+~muDj;YG>j0bWomc{!psLbM3yiPhRe;dy-Pi)gdTAOY>CUc z!qSu;>0vMqY=ZzWjoqW9^Qpoh1Xr|9*KMem5RpVvee&+i6iSXET2`E1gGrWq!b~vobZ5NFg{d2>#(ojQRIej|Qm(O?Aqv*c*b- zag!c6-Yk}knG{|vihbrPYW_}MT|+wf97=&xd4GFyZ@n;PzyOhkB&c^6j|r)X{y<1J z7bHC~>C>&IN`K^#;S{!D*t>&Qg$EW=THHNgxijA3FQbuy^uw+aw|7D>+ z45K=L`AV%c1kO?&-T6V}eGoE-o{5>9nJgrhFn0M$T5Ia4+V9{qMV?Cx0V4+N0gH(v6*+eF2`dgq*kN z(+3BW@+4S@F)wAGf96s;ijH0ez3HuzRXHKOw)DDAL8^9nvi!iE`rp3?eg1jcU|$(2 zBN2xsb}m$NU)Iv~dO94A*bQ>G&xdsAt-XB3bB4*Z&j?k@@7F{3=#;X&`V7ne#){{s zFtk%&=N9F-rNa(otT7rsIr}Ob$eHsLDW2Sjj|Qh8f0~G%AI{ zA8j(BrAU?~gAe)F$JPoh_X-ai_y1-zk+|&(@_#+HBPTNa-%vbHAN=?Gw3W#JwJw|& zU5H~txuiZ@gl zg6G%sRRu26Uq8q(L9Q_6^Y=^n!WdXM2+0)sn^Y#Seaygbt?plxs3{eS&oAwA+Dx0*gAg>{+%$J@wQsOa?*gz>!q=NRv~e z*TVQ5`*r%~sZP8cqN|AM?M*6HlE;hExX@>aZoK$NS4^En_#XR7!%1tHNwB3u8XK+z zUXpst7W&IUx}mVUO}-G+eZ;#Rh9lr#q2aT2dilDqgnV@CK3KE1k)MC&bt$J;=CxbR zgdq+s2Xq~ESSCZKWOu0K0~xaiYT{Ip{a6;7&&~OPS&P25&duKgxp6b|qF(*oyrnBD zvU%yhWt3FuYncU8L-GM1MeJ%mGb~6!C`8iknqL%7&99>oqIl3y1z^Q9eRmP4B#bzqMKCc+u*N7hmKt>OX%_sw~GfuT!Iq!dKke^p^CJZrJfxytSKoQkc-e zw9_Z?O-L`0*8-P`iF~Xjzir_iQZg*3OmYie%aFmYW~gI9VFa^Bz=Wy*@dUmBK&HSk z3AQjnbjFhdje{wB%)}v^M?wCeH8?B)S_kTHk5{^vAy@mrx-&I3c_xB?WuV;~OF~?d@Oq_wT;JY% z0O$xDd2c?h&cs*%*eCBe62NB8dUq4C1>)vyI;5!DGv{Wqp4N}%65Z^jiwFli@`yI| z^uHuVJ_k1|3$Yo24Ibv63fX$Acu=W}wQ5dx(#b81Wmabf9-A{Qgv*$F6)Ds?e!xUd9I>huE`1 za|Sr)lf-BEjCa%&)PcG5mRF({SN21-yUtzxy*I2Ijqbvdo7j9YX19B$t4PTT<8p3m z7WzX=otUPo+hZwnA!Qdm?)Jxz`G*ejM-wgev>=)uG82#qViT|hMK%obg~|aKr=jIQ zfuIf~_>EGBh-pS)Ap&So zl0_`j=)+JzD>NAx5$Hj<0EEGG;jpjZR508$tPRQ<{9wldzv?>OthM3uh^VX}`GOeP zua=>S^DZ&<4<1jApXodEqwb`SN&Q?_#=39u@AFAm2xeS$T2`npw6=(+^umg+ShacErzfbc}RPyhU1J1f^obb7_8#IZ>VF`x*o|68D zU-!^6*G63E^!c7t|9#4Wt#4oU2)t!HppT|Q6Q!#jfwx5Z1)ARtCXe$7yk)ZWufr0g zmF^Xky}Z+>-_oB2^E3`dhb#&o@XeEwsg?Lcq0}?dtIg`ws{sTA1QeZlaOW0)&gPnS z;|@*pN$RudxzNb{+pZ1L(-SKwx zklBPt2-!{uLkI|2UYOwwAyI@V2;m9IB*c&q5OS6fLI_6)N60urK*)%~L%y(}A0hV% zkrTobq9CLvAs}QyRsPgB#(Oq5bncnR5kiQRkT#>f2M`(>s!UDh3CE`q*$pB&Eti~f z>)C$XfNmv=Z{NOM`LirzHkBuGl27Chh}4IdoSOa9R2v;3AzYRIELpMyV0Pb$QXbxn z&u3WmOaHDQgb*&fi0Q~&?N}k-Yd=?|ry%Z-=*7()dO8_=)+Ek@K6iWRZ;5?u&qOZ=L|Z#H@WcO z%JS;oiSoJV7iQ_`_^FjzL5)3It}9Hcjz1JieLor3iUg2Zgj)~I+KyX0p@a&W)ya|4?G zF!Zm5c9vq6!NYl8($v^$*p)9CK6-VOTc2Ncxir%g37L$88_7>!%Q(K=Sr=tc7c;sg ze(9##f`kkifT&a%0et43c(mwpq5FWyEj~l5D6_dXTjI0eL58dv6;{T}OodGa_oq7k zP$=~Um7sozW$k0CJeORX%=m`+frez=+Z<4^rs(uK)*h0X73xzyV-N z;gF1S*gvzdNJh1N&?)?oSvZ1Hvg{Ec0$_lhKyN@BZ~|gVFVZYmgdh|+1rXpXU>;xu zOapem)#}c=3fosuGiq#wn>UQd>z#OsGf-YDxq# zq7oqrXrdHYcK6=?vFx(D?CKg#CYbyA>)w0zoclfJ+&$;~&bhyP%G*rkHP5Gn_U&GJ zTz~#62LoDgQhZ-uI=|_o)<3*iyl#G=IXM4sO$R}CQhM^h3NYw`SFri4=h|hB z-yA?2I1+?W`7eb}_=WYy8{v`Q{vM^LqY3&9@t$iJG=9TwtM=CD{6qB3)z(wn@^MFx zg2G_ouAW*ik?4st8$LOLsTBaJ>G(bb&yd)}dm;|Nyrx?Qbs&NW9Z+DgX>I_J1~K3R zCu|}n0MGz+z@2!X#DNZgQUIzg6K>etQ3qKN1Xp38o1nSnYzGramj2_WK?|R{ zEoo2@{mArl)&I0iFUpNo2dqICd;DaW9AK_IOl_65Cq8qCF6#UNsk_DYVvBxAuPjUo zXzy#w4%@1B_`^(JUOO9_!7$y0?M|YSjpySlOFWb7JlG1>j@BxeiKS+hO@Gt~JE9Ahh;XP>h)`jweCVOShhS`VCZO<6}ROUBTl{NUKKWou!L9JDV%@c;ighd2< zN6!0bYtGcfZnWBu^WQkoU@lENmKC1dxA!0W-d!>~%B}ZSYJSV)Ujc{_D-bkUi!!$r z6uz_SmzgiEl-k?2=Iykm=8hf(g~5Vbz02emscGB^oMu-(!jxnr$u0V5oST38LGP-`iw@vsXv!Cokb1<(WM?F%v+{sZs9 zIWU3QboQ-@qeD$6)8@Hkw0z5w2 zcj4O~KArc*V?|}x9t<^Qmp&0te*J>ow}mFf1xm!R`SzXdl&kNG8$IH{MGp25vkOk@II&`<0%=OM`qS6Lo>{nOX?9YO zZORK4rWaSeJ0|yVSZAGp{C<gS$}l0H>ItwzEi9Y z`3^4bW~X}D(lePC$#s@ctFOM=GF78>u`c3(t*?HsWu?b@U$YpMi%{DfVehLi*(7VS zN#y>*1T{ulO+>5l6ZqJ`G%e=#T!K?ZE}9r7lAxx>K&MQqeHYsc)dsFeNH9S|h-E;~ zByrk+uRxNPHWM{Q=IZQ9y~;qd#6%6lY{n3Id3pKy`8PT{j~i&0_^E~w_9F}#E=klG zG0H@!i4yxNq@toCB_*Z0y4ojUe7%v8B4gA}1}9(3R2%q42AHEm3wk)HcTz02Y8y?Q zG4h~Df|>(*64i{dgt^kApfI>_%XUfA-6~WCF(NT{`B9VG{(;mk#0vJqe+Q{5n=96X zHn@UIqAWd-HQ9mYg{>G@#)s1!+3InXqrr~|NjABgXHzLENKlht2}*WWN?MrY?0UG0 za7$9YVt;dNC0RqV3rQ-N=;9d@V1$Yhu8qiBKi>WVY4&k-_E~mHq)4PCO@|-fR*!)IY)F$!`-;H588wR1e&1K?({#3f!6*yXQEW8T&q| zx4cN^lxfOm1Me$7H_~8Y?(K|;fwW0{XdqQfz#YGJte~Lqa|3mqyd#Y9H{0000z>3(Ov6dp&eX}p(7^=IP$T+n;^1guXG_G!z|6o*&%(sQ%EZpX8N{lw2mnNY zl&Fx3Yx-G+iz~Y7<4_lC9bcO99GsM--?Yf3E)g3pF#+ZR(8Fj2vS+kb8>tW6n?hwCe>O$dRwbUMwzxBrnu z&zIxc(w~|8TfKpBs|_}5T|Pc`c9&3O7*PL_p}v9VTP&S|O6kPeU0!AYlR<~cb$a{g z$UIc^CVOCS`#<8U0SyClF<E(sryyW|Tg+LrT2nG7d`@@?TASUi%?~D4zb+fa(f$Wu>#jm!@ zu{z)-Yxu&tIkA{5H((+*2HJ~66Q-61FXc^~2FH?x7Q)@)F*T_`h_mwhc~)WY@mPo; zM*M%iRZh&@92+R~`TXb$Lab=DVN-{v4n-?U)405H+BFl;yY{2%`|qqX^H(SOG$Uzpx2;fOdgBUsq`xB{V4nzorr(W0vJ$I|4VQrA zv|$XCv5)Qv#V*0JQe2Cjg9(3*D-fPu+*XEvrWc|oLeP==%J$ihCqg;zsuWb9i2{ue z_if=YzNK$v{vhSBMA@R*{erpz3yqkf2u8pF)c%iGf`zI8nx3Q4*^Ck@Gp0YPpy2gz zMD+!$Us`MZmOJ+cd6XO)bP9@I0Zll8n#rR3?~mE5*Nn%#x#^2gk4^~pqgt!vGN|!q zQTpH%2nE@e#`dY*)m-X|BmO->6))h8h}q6kD!-Co_r1U30H6-$%+{J1XeRNzxf{So9~UrN7diWnONAouFrRyKP{Ba%DS{)>oMu7I3K z@bBjC0sZHM?OaM-=uI4ImangO-^DG`=HATo1=yn#TnPVd??>vv3B7EG8?#;|rD=EH znAP-=Pp^$7H*G7Hb)(B`Zean|kWLGXL4N?I(TLaYG)rwFa^xGnj*fmqrS0eStv@F} zN89ug5-AwxESv+T@;trzLC$%UW-;Y-8G^m6o8{mc`;8emac2iAMc`XC)GhqvCF-?) zC=vnth8zd1Mm|B;vpDi_S#2XFPdqO8ywTMj+fjm*hF>IUgaVV`m?8>@+PJT#S#$DOS& zX`Z~dEFYf~3j-Jcj#{R+DoCWotyTDRG3n{+Gd$>mZr1goq`X(+89%88q9XDW!LHvOL0+{}TtjH?} z08D<^fNvbY&Bt5jX+l1X%(1utBgw&kS7YezW+!v;vb9%b1d}7xL;Z&6e zM#;BW$V~;33)+UK+A%pLktKpP76dS@E&v2QK=OaUU+YG6@Sh+c{2BysOU2h#*k|)k zQ)!uTCoRVTt%mDMjC~0uc7iccupfv(Jta{+y(Rwb@6oO{kjpr(1S$)?gx@br?CY<87mOt96X#_tya&KdMj9%|pW#1$Y0f?{4%+^{dn)~`H z6l{hq{nHtnkIN6J=g=jzYC1lYLqN2gNae3kN}0bCq00WV&Gfq`n+~0}PCAdo8O!j7v$@cqs7ux}gK+0t9zL(*T*BI-}b z<|9R&aN{q(NOS&Nr>JXWE0cr~#9dZP#L~`XrVX#veYbQz{J~3XDCOYpJ#=Atr4tty z4;>7OJ3z3M%ic*CD;(E@*`(=Ef(Ey%}O8_MBcEer-AC15Idf#W3btvxt@xS(fC zGSio1h&m!O>(8V%L&U46arvA!#eW5(l9Qp5?S#p`pFU(^AY`0K1S2Zvx;R1v^d{Dx z8ZMH&kMkSb`v=CRh9powT~gKHeDsAxt2z_Nu)B4QHI$FaPY-Wc9O#DviykqRp)dJp z1TMn<_X}G~Q|uq&anj-Zdz80N2@IzWS~@}P=>=4-ZcIDpTF{_vnvkKhj2{IRRL<9T zw|D6ML&i9A<|sQCOKy^GvjYLmp7Ah-69s-7!T!HX^z9R27ik#wjQrha;Hzjtv%0L_ zB8?M+p4_js9&iNPz!%1+O{vg4!l)T@IzXpwiu;BQ*vXkGf6R?S3yB6m?ah=ET_gGq z`|Y{q4t6jIydX@NPXTA@c{U*wx1M>j+=rK~2bM+^j%H3JHBt~we1Ay6Rv*A+U(UuX z?2ijzlXABYCy*}JV;`!ccvtH=3G@wQdLb>+F%|~B!+*=W;#tfwEZbf>i$au9f4sU% zmx2n42EgZ0a}$sCr8j^EFDGsa?y-@HnqdS);W4wWU~cUy$!sh57o~ z4w)@zVeJ^5`b)*(ZM-Fih&X3Q6UXAqpIlfH5t^i`S}d7_sg6sO^@&9FX&yVA%f2(k z;G$IUy6?s)&W~6#ELhow=)N4Wb80jSQ(Y7*5fqu12u?qDTFyf|u&_jc19No}uU&}w zXn8bzq^zY6b2=mjPnpDF=>fgvDp{t)Bbwv}WPUwUq_^~<~3AxIHIzX%TsZEqh zoz*v#yjhV5bb2%X5UM|^R&1cWD0dorN*z_dnmknV#b}~sGjGrjb3-hMJv1K9LB+Eh z*#40N?OPSwm~fOw$3pRsRu;bdfrLt~-RbT}YN}#(2Y}gfv-}pY1BTOdumSWZRFfBc zO{z#ZrHn=$!a}V!)AY8TXq^}30H&RZUGP6M8?mLhBjI3$~dh%ZQXei$D zO}|dw$!tTV$RD6c7_5h*O37U$*3pQ8AUrlr$nQZmgdIY9w^oJD_rO&9e2XF4U8K$q zcqp5p;1-+dWQ}A!emQ_e7K9@b8JSYN(Q3N|1Ke)*^RRxX1QZ4s1|;v+)uO^xArO-9 zv;^mZcv#Uz){>-I;91U0Lff%cyhBMQ7IQIUMQ_m5rQX>nXMe9Ow0@B3vNA`;?Z$(+-{)2t~7_D{=!X!Qi>_zJ>f6r_Z38K`q@av9S z)@rY&q;gs8*4_Pyk!m!RI0>->XU%PIFwOB0)?Z}QkpGNCJ1^n0bg9UdQ(HCemO_7C zjmD#q$|@-BQ5#h%KO?S|Wi~2_SBjmeRxY~vNKSRPrEWC;iG>l(UR=P~*y!R^$^ zZ?XN|A%{ozh&G=@xBvv-LkJzZnyB@Jjw)8Tqyat?%Dqj?lfuisltW+>b+XyDRs62y z?@I}4qkM~VQUH~T*4VONRk<2vK$ffn6rfl*yXaO?CL)@Z6VgF56;WhfD0k-yc*mV2 zF)oo5ABH>-Uxe1A+yuZ%y^RL|JtEB@my|pZ;C1a#X;F-QHM|QY9*4xB>c%gJgW@eDXTO zH1EJVX|ZT;c-Y{QhY~Thp}<~KY+{w2%4TAhYLMDay^@??sgIleQL5QVNj?4BU+v8W zYk>3@#e7ORv=y%p7gyJ$V&br<@lmi8rIF8|Fh~tNt|_(kT*#`*5!8a{K8+PthUz54iVQw zWF6`rOe7s;(^SiBm514ap<;o_QXfj`c;dUJvx}0Hha?Ucv!ohp=I*CcAq!eO zoJ5b#1;cUc#D5U=69#-5wHh#gOv0xZfjU~C){u&%l96RPz1=TYt0WJ-9z`4|@`%XH zuAoxraw?_?zS_)#FK?&_Ge1S2%NKrM`1-ec)dloTodWtSfALlbX){zQR}NP!hKI*C zbmqYwX|d{-$(NC^spv`ANuPpp2`V4$=|6&yIo)HgiVuQ;@&unrX2UE;c($kyZpBi_^!Q@tSS9k0(NHuC6SAT?TwIfIB|1Fjv;1)*OFUN*pADf`sgTa-&%;T1TX8Z#*$+ID^?&eBoI) z`OAYAj*rLy!D8Blo-9bkRDG>dN}zT4#{Xs%_}5wzPa6|QdnvD>s0P<$VTbvR;~}Wo z<-W(oUfea!qV2(HeRE8Dj3xqHFqk6;GhQt)IDbfUqj1)!sPuxt(n3E1l!%Tfw)Kt> z^H}S3=vFVah4c=BQ$a_b27=sr(@U{fVlT*u3zvk9%~NB~i(=U+4SgW1u77IoGyZ0m z9sS(ldG!bZ@8Rxr=yXZI>?-DS)N^aDgb}Zvvpub%gi2Rt#+INHPWtBHHn5_A#bXPM zfTKD~Zpvc0+j|n)GI-Pv44jqg;B1$uR}Tc3C*((Fg^n_hbvu-<9378;3506i7_P}E zx@BJY1MLeMJ@t5Jy-?`}<#QUpnmD*Tx!H35x}Q+(=5}-Q4^Q+jp|+8^wpJ-|JKXa^ zWla@`XU)7rxw@v$Q~ZZvs{LW== ztD$V_Dz}c4dKzK+kh-!^UY#dQ|6Al)UVa;vTIr4o>TY?nqh?X05-dW1DqGkp<7$_5 ze~GJjI+ZNZ%89o?cubWz8giQgBg`B?Rs;+hX|*PHtqo)t71U#6KmnAWUfF3@bWpW~ zC$ehN84JSgx~{5FB@YSaF%p$IQXN(k>CTG)uJWOr@$7zLZf2XR69Ia8nkKU)nyfgf zf}xYE{Ja zE8<)?0e5TsJa?+g`)&Cg6)XTGBN)+g@BYdz`>|Nj4E${Q*s;&I?aT&r9DSgOihr!s zHR7)trKzTQgCZ5QoD6gsxNNqosWP>oQZ@{;Rw}*WM599;Dk`q+vFeM(9%B+MV+T_n z3Jr(s{wzUyORUJ!a`O1Yl~DNAIL{J@qq!)YpDvga%fU2Ehegm1*oD)%3E2Tj&^64C zGBF4n-nQ2UAIpIbKgj4^dARJsrlE?esQB&$&A|+bf*R%26fH?BsPw?bTWX;u5(4q`<0`_uD5lqK4>8PF`8SX$eYxTE1Wum+XDp6LSF*bR@2 zhwCd?c6rmQ;K_)?Eh@PrIac+}ZJyQ-07R?m^-xrh zq}2+l->TfhDT#_Z&NKXXznww=va0qA5L|d)_N$*hiLJxsnuhn)bW|X9a&^K@t(V7~ z#1YIpd9#&UMe($9e6ZY7*d|b{6YN#_yjrShO8stqhA@-;V#+lR3m~g}RxYb;aqZxh zau1zv;8wgmsBTGo*LGe^$5oa=bALKM?iQiE-`Difm#u=f%sALxLVe6j;e?*q*A?(S zlP^KZ^{o`iTl08Vp3@<;yci?WRTE#GQ8uF=n(=?pj*8CY#^W2VIW+FGad`CBucD*6bq|7GskE~wa7Nv_C;l9g(+`?RWe0TDq8u*4}F6yt$nvt>|CK0 zw8}UStTZu-{kD?0dpY|j3Sno)xR}hxC%JuS z48gUKH{a;RO8^%Yndd4cAboqUrABDf>b@T6nvCHY%cw{$GAK?ye zLoJ4RbK%wmt4lo{WodUs4C!P`lD*>XTHP7$`r*MA&9)l;n-l&t-}Kf?wu+@JrHip& z@(B{*ba%7&gd8|Sl%7R;v_-rzf{|^4`-kqyWcM)16g&VL{fiL^YuPeuBk#}c4bMrq zkx>|Y3X~Ba4z{L>hKpt$qG>SuW81Y$u~dpZaS0vieR^hg2!!BksW zh8Fri%(T&Xg(8}GR)#C;e<_AU+2EbJuTFIdJ3EAhF<6*1k(4g!i>XSWoZ0S*3MUKj zA%-wq)vu`m!ml4-Z!|8cOg|Wck+y6PaO1V)foYPi>1xx*IK#XvbXI=)HZ01_t_;|=X@oCst!Wg9Qu4SJtZ1t&Z zfgtM{Qat_2<4@ubRMOvF*mH(8YPD$!R4qBm5-`9adAf2Q-`_z){t(q|{`w<#&j+5s z+RLfpjJVbooE#hIq-d;i z7Jc<`>hl0ygIL+k_#0o!b5i(bXQx7hr^-fQFv3^4mtA=H4;jxkzTdfdgziV;I|I6l z$;3YKghQeHJ|$(EMXK&Y$?=({8buz3e1D5$NDH5DAvi`sm!wI2MCUH%PTTw0yKzT|&kgrc=>VO2oCWmucpe6TB($tA7gy z2fGf5BPyAhVc^08!aF}2w)@wHCXQA^x6~7#TJ)!OXLdE&d9Ed@F zwv`PnZ?VLal9okXBD~&9x*BqGxjqafxTZ6FTV-pG2;c3UvE+vc zklsK1#o6$}wVHLFNX)G$a&j(O>b@`>a%Bk1e;O-*O-L4!qAGC_t-DGs_)0J0bJ(?@vYLenJP96NDr91lD4!hS-G9Bn zHRWr9QE;j;H}PlP3REb5{Fc!ur;_tGb$&OfI4FN$_NpC1ARQYx(2H%QMS!exnek&X zx1B{xmHG>cLmplBPOlTh2{+kf{0Vv^OI1lkfrbK2r9izuRo2#1 z5l5sgqJk?tmk>;gK~mgM6))10E`(%!s#HiuM_h?Yqaoa~I9b*o0S{qlULT`GM`UJ| zXbyyFYH%Fi73>HbUiyKF4UqeRfQST1P?m*=!};J~^me_%pDN0qP>lS{p+r_LuKP9w zZG7@IBhbE4g6w@?KFKWwt6>fkfDUTWU1_sSJsG9v97hEstpPxrc3T-2zYjAdrMR{W zlaTuo7IeAq{?d`>B8{6!=572ad+6%S;j#mq%W61OWBJV47V}S&Y2mCSq9`L%2f;08rLx`SVfS)f;={n#^y28X|~P>t)YMWCJy)F0af|M zu~FOO?Oot3keJJBO$Nhfp#A%_l73jyv&9qZ-SvES5nHK(6V>H?+nkWY**@+X7sGWv zb$F$4Nc&D;QA&`I7bGEIu1UaC8y8Reg8>T4?ds|659o6Xdf3cc~uv$P*u}1!~2JT+dFmhKAg7 zoIWR(BYyk)bQ2ci#D5)^cyHm-HF7lE!-t>Of^0jkM~1-QY~bWIQeHv+-!L+D*fBs@ z5M_0UJy)bEss~AnAxa|E!(wKA&UX)`uyU=RY5eb4mfoFDnlhSgbBo+uxAAn*7_U}u zePj+_0YPl}g-7TbcqUPGyLn!jQ@UPR-ncyj>hAs^!|Okju+~$1;wT?hKi#|n_g&)M z@jVb^Y=Y^Y_hXj89%D9`Ku`ff?|i)de+>NJzHzkt#hl{rh)?_IU$$ufrJjS8|KHd18K~X|<&jnA4!`~*yg~3s zTU7@okqAveNQ55>F#kiGUPn9Z_J{WPL!k-NZ2=UG)j9$`AD$WY>qPkf<+Oi>$z_Ei z_tutAJVgnFgY7|7yDk2dhSftq>VBpCMP8_p%u3{W@^R>yH6!c;B;bL6c7HTdR6jEf z0^HEzi_h@Qy5mIqOq<};U{$oq+=QJC@$?{UOdCO5cuvqy@?KW&J%;*nuh<6d@Qvv0 ziw0T?y2gVCz35;@pjGtAA+0&0hM&ezn(z9c=+k zhbRvJ(+e;WbWK481K#1sEiT+`+KUZ0z1;+X|MH!o=qIaTJ46_iH>V;$k`^u^Vw42l zP=_3CAzjwL>oc-w^~`(E=Ys5OfrtndT@9zL{iplAimH0|=T0+^Evb#y6|$B5=Z-^m zXQBS=&X=u+EqDuN((PlZ+E9q&=gA^Dy~nr0nx3lQ$Yip#r=&*^JysJ9D@w&~; zRlwVCZB=YGOmAtn{dQfm@Sf9y!*_I$moUGWhi0RWn$o=$UBmf6(}zy3wlvTdGuqfZ z@ZlQ`5AVX6{Vm=N$HFp3$dO(Z%KnZ-x_Gv=U9iLPetdkTs<5wb$R*F?;RN_Dw%lJ zmlVL|eULHfC6I}!*?tMxAsnYoFa0DA|Fl|!T`B6Ic++t`R<|7-qMz6;csfl@WGDteej^4a>i`fy3=9b-LK`b2TN5P-6mcUX&2@~8%4Ft$e#na(5N z6Sp&z&T~0{sIOq-YNeG3m+WzNyQxsAJN&`uqNz3Vx1}r(ab1zEZ3vZ+zW#V9IP%Rn z_8R}U$nTYt2rOH8Z<{;1BfM+K-kzT8t z&Sg%=IkC3j;K6MV5&AgsuiDeT6`@`o7$uT=5)jsoXV6V6q~De zK2{O}?DS8kUr$JD@E{hSZ87C%eJVV1_71gApWSz`wh3k^c74B3**EEmU^dmaOo)*S z;I-#nmlW_Kg?VUw?Ki zA71{%%35JFp6m%rs7spOAng3;SI4NiwQaSQ@fvD3x*UAJ5BEB6!vkSF6Y%WlrY259 z&(-2K^L`4?ii&jd*5erJla&3z0m3a2)SWIR%?UDCS@GxcpGx%$EbuOlv;(E^z5Nb> z<0t!wzQL3DHp;5+wVrqKQ9j+#;%20WoDbG3+Fsi?uj*)SC z!9t9n;G0?-VIhl?|Iq>JM)7jsUiRB{{2f{MZkOl7J4;xPe$&2=Vj~azUQ6kBZZNV$pB4d%aPrT6lDQoT!751CXCvM;!V}67nB>H3NdV zw3(mpHJhw|zhy1OK^fm?&0oANF{CDN@8d#r+>tDf^FG1gT(1deI?`UP6Hf7&3w^&x z6b{7o&1!Rf3?{UFavxjm;`Lf5hfEqCo8SDfwOK#DmpG(%cORTwlnF#<9LezPxUJaP zApu$jq?5LrOimrd?eJR6G{l39cHfx8Z;E`J=pdrpkMxet)9%*Ve(I%f86NLC)Tv=C zcphFbcX|RqnfrZ*^WFAe#`m{+Mg-8FL)$C{*V^}6n8S80B!^-dJeQhEDrdDeDX$k7 zZ^uLS)E$h`1;8OJ5jg02F8i3E-Ea@e5WxBD`^;RP@St>`Y4oV-lYqzyvE`IMCq6+R zEr9U7$rq7s$kE8LPmb~T-(xmBTdw&z7*WF&v!sYx#J5dQ6mrohgd){n>?5#veMU3ce>^et`~A2qJQRF5MA% z{MDJ=hQKRkYsI3M{m#0N^YbtpK5-Y9ADPG!uPfVapKRf~JcgQYmIg8*!+cdW3@z{Pw6bFfjlm9|C%JxCD zrpli1?v?7jQ?ny}0lbJ&9Z5TWH!}Z-a*R+zRZiD6fjSFj<$&9)?9dZ{AIB7pepc@f|RGl&-L83b>UKocB(IOm!LTSxrKk5N%4HTJfEmP>5V^&DgL5_6L_$_ z?TT$*+BA|FT?MJ37x|n*svlz6@bJm6^?3jB_Xb@Y$RYSsnmoY=jv=1=15bBDEQ!|k z?c^C99wILV7^dY!A)1#_!9YJDZ&j>X&-A=&hs(I&^r6%D)J_aXI00)%$$M;1$ zV;zp+49B48@g??RT%W+EXK0^-=`K|+iLkSEzu;s-z-Ty{2WHc+$CO6F252=^N zs>o#;5BH(5S7ic=Z|yfW)iw48`Y-r_LWHpT`d=tag=R-Z9`%+j>jQI-A1eDIQ~xqQ zx+=K1&ilwu8$HW%Oa|h+PKWfRl%vC6zT$(N&`-+wTrNVswPD1eL9p#HP!Q}<7UbD= zR7?d1KEDMnl`VBo{O;%qcRWa2iO;y7_YJw}#MH_oz!`6?1t7!Tn<`)t^W&xab z*U6?VB%d9>HaVnDZvtC7Om$r`;#hnT8rox1m1rT6ujZ8u*A4pOjI6*&eh_dG>AqXxj6%k-kD>J`Jr)E|8tOjt^^pr8d*8gx^71;98gn7d`bYoE9Gp zx?LEA<}F;I&s{(l;}b1gLeP21^xp+`$BO&-I%fcd$cPak?itGLgsQ&m$4;is(J8-3Vj0u9dG-kqTKU-)Z!-O?ZD~Dr_m5 z#aP$6KISoTMy4~%iFbuXc4b$wwprOu=r)NSk-RNB`N;rcj{F;)o`AHM+lD{JUe16{ zrgFQt%E|?&mEPGVm+%~K5n+0m6yPhq-Zo+{}ztU)fPiDDT<jv~y4iSvC`zS)j;#?La4MS&??5m~Q1%1wD%+INpKu?=OO&OF!5j$lNP z=>{vjK|Yp`e#q|Hzy$95UIr-x7X>8yJ(_EjV1?14mKs8r-3f$+eY;Gwv?=(k?g_=T7K2^Wfq8_zEaKM)a_s8BlXT#Lf;ER+t|Io^qSmNf7zx4SZB-Z?i_lu{&Tj^^j z;j2GW3az%%SQT(;X@F$gx9lzZh`2!5AkPaXZI0Xe>s1%PK(S`!@Qx=Fg6LZvh^Le? ztq0b!I+~zmC(TJgpAtTgUdhFf9~2?lrvClhYaRvt8QMZ!UuhMRS=>X}fu?R5O5Nt$ z-d`I+KEB^OZF#OFGnaT#>*LPvmtg}*)0&@}cUiH)O$wKMrmNMtcjNmq3c-9W<=Qd| zGQ}CIc-N~%U6X_zKgFXdv+zol)##q?kk?-$Qu)Dr6MAIEe4dOKht-1Qy~Gi+UEkiC zpWZ!e`P;6eTtdLwvbb(Xs=7Q+1eDFHK8_6R$MEKW}QW zN+}#xsTriI98l$>NJzO(A+%-GL1YkziC%y;HXeH!{bVs4hxG?!x_j~7PWC0+Yi*xr zV|4%KKv|+9tHD5czb^A3z?{VV@}yjJugA)Y>+NB$NIWgdCF{m2f2TjAbFOX5C_XB^ zLiwhzF0K;uj~_D4ho1v?rwB`32o4Ien3ES0`f!?E%>Dx5t#1le4wf9-_330`);rir zZ6I>9Fq{2_`1qP+E_aN~UwpIIQ_Y)ET5#W}h!t;$wjvbZ`T3U%FZ?}FT}1&T{hkY_ zzzxW8My+%=6D<9B^CjdA>7rh2^mf_IR3B>m-2g6kzT@b18MrXk=>2%&OkkxZ*2(96 zTaQGcDbV{g7_)t<%_yhcxOu+f8fis)X}0zGew(9uQJ1l*&0J*Hxc!nq*w}g@!vbxb zzqa)GdfajZUB>$Id|T0Qv6T6;t3Gnci5*`^LdR{s9456HwS}?TI;W5Sve(hX`SE5gDl`c2PFK#lbt`n}uzP!Zr#eMn)l2n}KT_%BR5~B0=hIax zGXr+4dW%>=fG`=-j#EVqAHuH%Xozqo$aA*^Aro*)cx*af^?iTOA_5y%^F9^Ic4Ob9 z>@+~k)HwNC<(!@2Z{)D)OmK8}um!{#4yhCP4CoN^WvsvZye7>?oX`+%lx->wr>rw0 zXtSlL>3LOQvof|Cb#;a{>qN7bUCx3AF~Ouh?yDuJBI-Bh`400QK!+nYLClIki@Cux z7=q^xBjxZCgAi7+|NoUa8_^MK%*pg%O6ue}*o;bv7UhAHYYG z1xMi(Wr-}lwZ`O(j8QyN)g}PMw@Xn1=~9`Gdad4M2PFt0dJsrQNA|SAzVhEam;J7& zhDNf6wcYHW6>C#X4t{=b!B1~htiN=+Cr`|?Lo>J9pz!q=L;k%1tG3gu4GQGlXo+2B z-n>r5lw%^bag~U20^DXM33-9DJMg_W2(3x`o!x%Tbk!^@XP3`HGF zBzkiGmav2V+%Zc)@#=I)Tft`YNkqKoed6K6@W;2TCbtoVB_oZnT<*rc@vNv3t$WAx z3xfXzXziRoPU;uvk`0Zvs*t+p(=x~O-)>s@&=kN-TV2fsNm_j*!*G_!6y6UlJ;l~u; z=i-$1MT6zHG7F@}t1G|HNp2@u)k-Iu&2p!c@=BY-bHL^vlzoYRt=0T^;1o1I6lc5zsKgr|rVMmruTgE<0t0BNspSoC1t$L zRJG?ob`SHpXe7Mn5t2Qgv!Juu1suk8?6=h;&FMpJVYH98@}Y1jPUj7Z57NVfHD-}T zrLOS|+lk-PY?h9i_gjPGU=d_CzZU*d!P6Eg;53af?(LE7bEZ`FBf8&@{LOCiGzAy? z>wWQf7Sxbq<*E($AbNSpceq|LL8uyfw}P^gzvjq^u-X-F-(}q_aQ{Y6W=PZtIquyBkOz>9%7oO0?yvqIk+c!R-b(@3z}*)7sRcA)4Pmvc(R@MO z&BjsG7wav_%ZEO=@&34T)^JX@TPnHD$d~8*bPWaN`Bu{Fq`5z7uLJ0&6`N)h0p!L5 zGb*t2ffZTW!dp0Na_GzSdUDXj4oTpTY5csi9VfrHrem>5XHa(c_t{NG6Ff?>4(IDd zEZjk(d&fV$Y+C#<=wL!l1nRAzWR5Zstf&q4QocaLGIH@Sqoi@4F&uVM5|T~VJ%qHt zPS&3+QvgOLR%aCC;6B{t!;4TCqw2ixuzZQ% z-+WrTQ1}l5O{*?5Rv=CSUIt30=onv3BA8!ibz1`-L;sJcncUlG>-&*g^wonhw;PCo z@5&z3h}^$^`yqXHe*83iWK0$^MZgzS?}D&5MAs#&SqB4mqpg4tL8h@vw26^9wyvmZ ze#&ewC@au!gA&2QhHJy;t{rneZ4YV|fN19+OQ(d}^!^75RIi>>+KNYiTh;;v2+#{7 z@SI3m+Uee-$ZgDsb6tPcyP54(R~6z*KZ8(&w8`AkaZV>1Y0HF5_p7nPLF|C5AeA_? z=&Sz)O*N{>iJAuo8iCQR>=*olgj8Ms|DS+j?MFQs-hb`W+tV@R5VDr~oX0D7NWFnL zioPdR6BYkOTm52-aI{66L3tMc(b|(<|F$hrNA=e>LtL98wtB1cJGpzjRd4V2mC5=F zuZO#2XD0h078w$*@N@2Q9bBx>t#Gdo{@>Rrav}%c$|Y;OU2PwOs|2o9#m?H(7}kDl zF;^|O+55a3>Azllu@38VM@k}_HSO5n^;;lE}0d$eK@l|VH^28H$d+g;_U zsTfsx&`_z-gHRLvKRP)b(EG&Hk;9lhm~Q{v+*)WH4~LNjMZ$a_sZUmEmPLQ9!B|{= zt&UcS>r=Fs<7J}Xt0!G=KP5+|+`8mDo&E8j8=Wilx@JV4de9IVz5FLMS$~}3>jp>uG&4#NN@;Nh|q@_%O-1E=>K%$Jy|Jd-9ZN^UfhCZXy?sM|S z@sr}Uv#!}{YTZT|WY0e-{3~Ce3{p2qDV4jkxL(H-6F#0_tprQ#6WX}hi(07z7{}^Z zZz)gfP;f|HxOWo<9|d-KZW}`kTAeMXtD99_FAIVrr+)JXpLiK&xl!qFc)$$C)aQrB zWlG&=>e9^`B{-!|X2SVgnRko05Mzh=F4$*+oqP>y_Zz1VAJeh)c1}NB9mBnTs@q+i zOKSbJaNz2cZaJ-V#;n6EXS|tP+m(5cI+Z$)>=D{b1rw=%u`*rJzEp66rAUpiGDfP; zA-q9`VS<+zlAvm!n*DBcn^d{-%#)!B5 z3#_!Yr{Z$(V6f{RwPNg0_4eZPgNs~473;FCg?~JlU=B5lW>Nu{Z{|5 zef#uwhl=5w@bu4#oX5HN9<83(6CQ8A#JlCP+{dHMNIQDwp^JC%A2u`+!1r(;e@m)< zznAsQRJtD@|M`0EZT13oflIn`O{L6_Ry*N5sW$ZtU?)c=>>)*nDWs@cUu`g7TEull z$>~1tpDhvF80J@q7|+aoI^J2UoghsiKZ|b+e3n0ZQj$AVz*h9v8}^xYP3GmUc`U?2 zbu-p}+Fom98?QezY5f-!Cm(EXiuT6 z|BtxnLe{AD1#vMGYU1kA2}7-p{hqo4s1X(R1h}AHODK?|ms^^x$T$<|zRypVb%XH* zUnX-<&Hm6NF_4{_R(LdDaA*lHvO~k5xxQMWf$eL5DneC!`2I-f=Kh)!(PD%>X3}^*FAE)_j{y&Dc0hdVK{&RgrrYC`8=ZB5=RIche*A zKepn@Pv>T`Q6A0B(8l6FmjhY#+juFOOn$joS}LjpAzf)bC?aoiD{|mJy6gjs;s52X zGFBy^*KWICd5pN=R6+L#lp+ZBbE)8bCQVZY1i0+%I*{GoUM3XxPzJ!)*1R69)0}m^ zH(5$Fe&791FM#RA?A;GA5XA85}w6y zjV5o`?u#X@OCRsCEei?-oOjO{2aO{~zCz8z3-D|E{WcUHOr)t{b_GP!piu=jWjyWQ zXUeR>Tb$O@*ItEuoTX8`uoY4%XlvZXtUz_?SwjBg&s-2TxI5$giP|{Z8$T3KU|7B# zF$@cJ<%3^M6924B6D)i{RedIOnFPP*>7g=7#>hYxs%fALPbQ3}9gGah4&(VLgpME0 zmkFe`$$Z*b-0muShPi))IJJVCL+m>-!G%KCbjI+GG7E#H9uV5h-i@_o-IC$oN&BR+eV_`rw1EDbpqL zbX)Tny9P7tX0E5#+@iL2l1*cY^)&$63O#fRjREP6nMB1^#a#gZ5hU8~sE*xH0UO+UKRsUo3uS_%W$zfRx2%NuqAs?nra zL-{E5zRDlTo6_h#2%vVkJgN(_iS+gR4qFbv9-)P(VtqtL&dnD69;?)(G@B>4Z1-eg z%3Vk<6+~;2{oO!sB}Z}2j1!S)vC;^S%yzQCyR{;6))2PL^7o|}w!D9TU5bCCy`JH9ik@Sv-OZ~!WgDNzUk)XP?=1g}&*3+2o+mtFoJ1&v#E8k+Ku7u0ou`!w+<1uLCvyg(ZjmpbH=d_|3t1 zMV!+_nPnXit9wN90X>Yn{n32ROYOQmzJ~z{^c$Y3s1UvlY5%Cl?{T)w=~{6q$X?mDGo#I<-+y7$$7bkgIJ{g zU{y!2bUKwq=IA{=|HVEwsqC@^Y>aLIBnAyo*X9)l^gg-}O?K!Hq+-O;{1mu>nfl%S zN)UJw)$Z{GJo9kL<+FaZf?0EE2}W+vo}5u`c~d*<#KOtEDoXJQ@b3MlbW^p_=)oZz z+n(#(msoR^<&=gwn%5C{F5P(i_@~q!eEDsnq`MV@1q~SG%_}K5@{B7{6WH0p#wUmQ zypV>}>c?^?rZe<&?IW#wdVBOo5ZmUYICd*&MPZf*3HuJDczt~0kC?@C`L*`bTXJ%{ zC@kO~yZcb19j7b1{wu7uApPNx2y~^8UbzV@zJyVDkH@O=rBx|cZ&_zJz_`+Md4@6` z=M`}nl~SWa9B{b6!Mg<^LFBK0)_B`aFH#VQ(pD6m^$1rT3cnUS)A@{%)6% zo0ZY{B{!t)p6@Zpt1-smZ9`iAk%xcbz(3~WsA=0NXUVqIefMQW{b=&yBdg;kJnZ;z z`|`s||414YP40WmG-`yNwQdhQdb!Ez8m9gNN2Bf!+8QXLpSj58!NrIXFx2RXArb4S zNCi!n&g%$LRbdLO<2Ne^?nRj`&Q1@fqbc^RtQ0gH8Tze^gyrd}wwH&F(0EB6JKE$O zXQTFiK*^(06i7>zB@37cL^R{R!rhYF4TjkaqFEc2<5vCcrTo)r$E3)O-kFbQM|`S@ z45h}W@DXY^mbr!^vu`fxk%_2=5-=&Yd=k1X5>l4A3MUB=-mWR~+Y2v`S82n;k)SJl zGKRt-9w;mO@w1^M^w+TK`!$+>WTKX8qJ(o)^dV=4yd_stNIz)-dl{D{dZNB0{aiz_Qhnvty} z-6w(=w$!krE{t38%PS+F@WrFY|0IV+wr`iS`U04qVX`%v4V`8Dop|bZ&{f+hMDc$| z0IUsz6S{M51&Rq_kbf>-PnGYxhcrY&x)2I5hwW=RY|pJyp8ARFA`$=o;%5aO--HpC zNc1ywUh`*SB6$YkPhVJtnqnB*Kl#y!^?Tjn8uK=zI>mr|duBjUCMT7-f~5-wvzhm{dfzN2@uF|lI7Qgfs$`Rc;d!lc^&>Z2ip ziP<2AG5C&yuWm0jc0U{_;UkRBP%ua=XRJHMka=%s(8Yq4TOg;WJ0vz^=gg4Vr%06# zS;&)YYi?s-noO$9KgQq>yV;4^lJLXjOThIfWJE+=3ybn{&4hx8ALROK_fIzm9qwoY zS!=b9=67Z&0fISll&HhrfuQ!~`)!E(oc519IaJ?L>A#=J zQGUtk`pr0mS6%gWoyBZZ&1a_k{!>h#0Qy(5pk?cp`9c3jB60HO&zowVK7MzpB%jhC zB`Bj2x)B-Kt|VlpiD1BEzUxAW0v+(bE=h^^bVGMHfhz_P$sOae!^cwSx@@laOer>} zqSo4olXPEp*Olw?sV1frfg@f~XZsAofnDbyOa9luu2|>`%)wQ-mmgH7iol2eK?L1*G5~C_VglzS_ zqj|gy;VOIp!)PD)?73{+M$Z>EtDu5>cPvV7u|aRbUll1TUu3YhcDs_Afgl*bQ|X{f zkU3K+w2B@%H&3i~mBSsRa|P#(HFW86Xw{QeZ<}KFFeU=_v()5%J&~x10je`RP&}NS z{B-x5XT(7|xFRAk2br#O_RE7afx$qpl)H3#{o!KBm)4{Liwj;-(%rRdMeQ}wsF%ky zLN~WT&!gckC|qTZ;Z;h*mX>%&&NV25O@j9M0 zp9Npnl1=sLar&*`7kDu2ZHqrt%Y3ch+6!gcMn{DZ9x^wm3EGY7MrjC^Ebf%QAYG&$ z^E`XREskxe0ei>bPq>XAX@j+gZuDN^oier^CvSs?mmWuTw)fjHdFHKP(y){{{ECIH z^_i-!WP!z4Ub2=&)qR zDW^|!jZqLDF1+id(>=b7uUm(zuiHwG9Bq(gdU}rAv-$O+J$PLV9*-gQ zYd?v{D{E$pR%1=12hys=?2_`OJ~|jCci`-Fnn(%|#&jws@0j*6L^acBCLDU9l$l@i ze`2|i8%m3=drDX3i(}gyX@x=kQjjQ5*(~{M5hXGDCQ2XRa=xyeD-MseLHvXfOd21J zJYKh?6ni1Eh)Ntr@`Mrch)!gftFwzJ4;TXeSadE^sh}p%EU2FNyze>s72gl*V}%BT zERIZ?&JFI=Lc1s<^rszLRJ-9&rsoSlSXh|y=aqDD6f;E9T9ToEwf|{5exFZ^{WX;9 zd95jmOKEFNfK{He8x&&~e^SSZ9<<|dcS9XkX5a@65)p{jK2&gi{xP|fRaSwSK+XLW zI0kwsEILRa-vTT42y8(?HD#9+?G0eLrjrV9{dQ|*tTbz9!v~WP?IGyk=m-L*BhGXZ z@TaTIH6s%k02f!+gmHrqTHjqAVq$N>TGVzJ4Da{AU-3MG>qvt6{^39Ee*_H}3~bQo zFf(^W^e_fh@iJuH?b%qop+<&whp`@0qzgVxKVdR#fs%g4J~G2F0OW#z&jd@|P3Ri5 zR(p(U-djd#RolD+U@h0_htZT2bORKbIPh@x$$HJswlqN)L82J_T%UTGes4Ib=`!oN z-MA(hIS7u2U9at}I!V7+`jc+0Ls9uR^t*d0QpL9wcO+hH7qeJsG&Ehrugsekfq(W3 znAA73sK2o1WkeYLQ{%}AfEdNo{WHUS+v+5inMTVvwRMn8Z8*r#R!V^scq6k^u3}h) z@cu>0#LR*g4w_IbKGE1DMV4C;gW~NeLhCPdQb*t5H;JC)=#qRupFxaA~%qH=3$J5|;JN za~Oqkl<|^sr(!9)aY_iFe~W&8+%^>;-%x{1-gK|~FyYX6qvTz)pEBQa7}to=*813a zyG~yfKm3P=fTfYo{e4YqWq{*6@(Q*NxpQ#o~YrA?tc= zoELG`p*3nF?=!oL*^*|D%i}zb7`&7qd$jX_c2?>oX)<1IePTtMS=i(yWM*w*%Wtmh zbK;XyY$&4&SRs-xu=+1!KVRu5Znqj^NS}&n^$yq;=G58CS|83AtC_t4M+!Og{7r`n z0VIlhp?`=`%$H@H{B^WND}Rqci=-LWiI+mX9Dje658{5mS}U?vtj^>3z+H49@?J=6 z+4HW~$<(%FIlt|kFH#!s&p!=yx@>qf>=(|~?{rp#)%DfxfXV`^??kfE1v7=yq-#c+ZD$0HT?bMv4O~n z=jhjXG$?C_teQS=S95&CjgbmHvtX2r+^$1f1@FY{z$TGCG$n z2WP&JTu_{9)_R4@_ed&Z4IO>s!XD<)y~)0++TOr*yHb%=B>ToBlF8lSzH_+&#A31! zc$$~Ss%^IjLqDJoH+hZe-oggwRZQE|z>tt3&0GHRUG#CT9M@LT&8h)SNpV>^&ZYZWZI^SRpb;sVF)Bsc z&2TY6{Ex2LD>U}&fX%IQdXwp)p-Lg4ub@Q@pEatw<+d4znIl{7+#EDZm1_HX8~(U@ z{M8^_SBBV@8m(!-SlwcccXs&udtn88*1*9)`^aa+Cmv$*uneAR zLdXgv0>5YVgbU}C6@{wXI;|kbr(z;69#R@7Ti`8YWQj)o(H!L(n)jN9BkR1q0ECn> z4Dz2HCItY{)YDne-4R_i4k5&!YBIdm7ru8at%z@aW|pFV_o2Bd_S`$7kwk3*M`;(K zdwhvZWOdQ~i89t9Ib!*4=G9fsoNP;}Q$z*q$ytlS>WZW+Dyx2ai*k_`s1~N8O7erA z^pL(8|7quFmt+R*=;)q-X2Q_%<=0X4wOUmse_KW}|Au@^%`UTW64sPq(mB#MNbgT* z)*5lB2-o+jPhTyZc9aQwYkPx!Lw^`E+{8CPIx2M@Lp7d)0qT7 zOjd_!rL||6Zs{Dk_cqE~y4>-B%=POFJ+Ia1BXmo6%S9KLs)_Q2BV+(wLl{JP(BtThHr^I6!!;q^$O&;heI2E zzp!ameP~zh=ab=b^58d?Ijc*y$Jmk4J<#n=UtrPcaGLDKK!Q~Bu`*q-g&rN zf=<(v1A%LwQE0$mr^vLL=m^z*M>0TFMbo8rSw}k)u&F^&h|zY0y|&KAU!>c2(u5(D zidizWQD$;-P(Xoma&6u5x)lA@bey{+oX&0DP9aMRhZ$AUACW&uDSK zlIy_E-ExingG}vC`1|6Dhi?tu+@2jJ1j#5Hdq!frd)iX5sb872;YCzTilJL3D-Bb5 z#cwu1^%6|X);!7SZcC@^`aPD}QgL;EGJ7cx-$Q@h1Ie-SzPb;TX7b9s@pQ<*lmZ^z zIH_N`03C%>hQj*h55Aq@A4J!~#z)mHs-r-llZD$#>}UQj9AA}nYa^E1g)D?E+%#@V zXA2KPw!Q1%8WJ?gF>pD&xBDSlf?`7k}%rrAEoizs(OwX)M`!?3p@ zQd2wp?6OuU|G-R9>koPXpU(8a_eoBQg4Q)KQmcKKIX{2$=%7LgQX$&%#tUhC2@ys2 zgVLZrM@#_qe(J*gZe@dzmY9c}1$-YhV~xN(^lj(*O%GgG47<1VoQ8~O)rj1g)(jZc zJmp58@J7I90lLM zZlE^hd=m(gBEPT3k;#5ddSC#2jXv}df;m#qcoF1}ju@Ny==jvwHOzOg=b9q?XRfK& z7&^-!d|sDB<0`R!RFOeOUB`1J3IsH{h+|MLqKo2NX8{ z{AZuHt$h(#slVPDx$215a>B)YvJ5;f)M%eMTlNDMId@AH_3{}Ya1VIr&8+i-kmEVs z1q7^Y(MuOt9~tSzs_bL(N>r1TW;^L?!4===#dS|UjAD^jOOuaa&Mbat1$zjy2;U4K zn3;v)9SIY4D8+Nr8_Ps zTYu^P{I3C-*C&6IM3#Uyc{A6u&Cm~uNDvw8$- zrW&sdwTH9@s$af&AGCEGG4@yrA1J&i%1bPv*S*rx(p_Lw?GSP^+w2}zxQf!zJ8}{8 zI157pbnB%*y)`MXS$N#8K;*ea;{URkU;jZK_w>TMxRas3cU>lt2QCsA@gjA72>=Aw zE%|#3ukV0SM%Y+amMSz4zyUsNT(rBwomOpiuE2_InMUpgALxaagDWh8?u}et^NlAw z=>x+bT$TrmQ(gJ>`!75Azj<)GzMn^QQiVvYIBnFWx;2;mx;kHvD=Wh9Kx*+?8W@mi zX$y1VQlx;lHWB!%z6bj>OD+(F8k1e3h>t0nUrxrN!S<+HL^lHmX5$lQ^)-Fo$>PFI zhJ=Kzp>H?GioR?B&1=ElfzSc6NZwZQPt9gS5^xQ;^ecH57{GX_C+#`d7qnBOo-G0m8O9<#f4jt zjM15v0o$@LCbw5+{*?c%%)GHCr0pzVP4%2vY`d%0BJ62?rJq1&xwAM%(K~Lb4#vlW z`OgU-{SP8QY;1OknmVlv2{c|e8>QsqFNGDJu^@Qz+Etc9ltrF~{68%81->Y53bZ-F7oUOvid+;>S`5+AQ4Iz_C@AAu%R@t8la zr|N&x4e+HqfWQ#53R4co(VIilAb$xh)8z6g@om2h%X~bQx^D_f}z4# zKeNd&@LVZPG0-S_{OmdtMX3`qs4rlwLZ>pK_Q{Ocz_!(R5(Fi6hyAdcKBLh7772!= zhHZtB>o1R;$; zgRF7R)4L4dNll$MrmJbnX7b}m3N71v3&RZse{^K%IwUT^EHN>&1_)*CpUu# zkX1y7ILfmVX_3R$GJo@;_c$d5VZwO5Qq?pkt~S2Q7FZKzSb0@6=LREkOU+UvjSkrn zY+JLNA&mjv$llJ9H6yg3V0(P4LtIqU8$zYTB#M<6R>6&Y{|DoH%fm>db1{OVc2#!k zBo5;j!LxVnliQajY}ZoK?aTZ&RgZH%WT0%qIIm0n$F15I_B7;b?#Z{8HiTOJ?Sc++ z8FhzKVY;YNl_AgOo!!<7X9Adfg-nsQQPZ-FJ6!lVN^QB>0=%*TZ|lX*w@R^(Va5EI zP7d$%Gw&NMJ>GSIMNgQnR)3I!q>4UZpD>7#meXn!(GggZPr*d)_HN$3l>25@JD?( zn!LX%h)8tGwG|wkFi2TGKT7&?tAkj3R!f#kb|tyjgp3nm1g~+2bsC-kn~Hk5rj-tOLu9dbf-gw*J{9k zl>YnpauzBpzsqPrVjYx>s8u;n)6H^wL#kLFyMNJ{>s{V@=J*UlKy!sc{!)s&b{lC0 z5J<@SqFcK_sIyWbF|f~x=1=+zy%=sRBa~P!Zih@D?a|6Sx*lPx!&*QHDYrp2dR4!j zB({oHDd_-Yph>i(`+*GVBUC-9Y-RTLwPD&IhcTa(L@d%`IzQxnzEBTB6uFOJxWct#K!)M&x;vI?$KHKa5Nk5e98$EHo&hN-Eo|3Ro*0@nJ7<=^ zq&Oc@YisNH_;>?LZ0lC;3(@Dx<~L!lr_BuiU(FgSvngWYtbeFaLA_kU;@w1wnN8*C9ZYEJ5tS`>kN=A7m^dS|TLkT*LV`Zw*h8)H~>; zK&g;;L_u+MqP0Tn$xX(kDxLV^0c17EA)v7EyT1XI8;aL|V6mYByqf)F_^6>splYXq zfe%j5FL)jIO5KqUI6kjfP*?pReSd$KmzS?9BPAjtqNg99n5fE+tT!4vPEGM=`A)G1 z2?&|~^K<)uMr1jY4UP`t@o|YeC=+l&f!}^Gt+q8M^n?lJg?;=A(+3Bh)pi;5-tOPf zj~)7_W9+q!w49~huRu%u=|GT!G7t6X)+M@4{xZLjD~Ru(A8Z_XM8kpeBpEbQV0}@y zaLyXfGdHahoR}W^KvZfquMUIG`jw`*db!(f?})nHYpb8yV~S=i*ueGTaNv-xbkZw3A9Z|Ub&V0yt;%+&EfBY1>Qk-XSL?C3sDTwxqh=`5`fPd|IE_3;#*&;vHC%-?6UUh z@%GEKdt18#_17wo(Z%P}Cue6%f{kYGe)}%HjnP5hE_;mmi4!0Ni-l|O@lvs2ZAKE0 z$FMW^!*`pRBR;Pv?9ojL850+9u=25R!Z4BxUNDIR_CQ$_7BzXJo-g-gGxm#s&Mi)0 z#n;8fHPWNWh&%n@`|NHOBTA(d18c4JKL-1aF-CJgmnirzKa;Rl*HjV8roOW85SM+v5oNz(fQyDE>&in!Z`p3X+(q=ks2;WZTXo|EqbF`~?eRj;NM;;5fis7{u%RkLWN^^2a-gH%OGl~crTv@xb1~qs>DSLT z-qD7%C_Ifjq9-aE`1M0R{jiVgc^<;fB*mbvj?$JG!{;|)!6)*f1As|xiN~)uw}%c2 z__vb0q7q^w2{UyWlDFFZuK4Gi4Dx}q=WEBj!VL2^<&doa^Vp69^rbXtw33(AlNV3f z)HnM=Y$1YJC+~@Q&pF_7OZJfd2!X zD*69Ir<9xSH+J;@(N@8NWzw2wq7{{*^{v>y_U}R$+!uP(!kF<}z?yF;dBVu(om8$> z95BQ2bzON$GsVLy+Je;4gx##m#tyEYm@aC;g!!U^hx8~AXrTqndk3;RRrX%A_8Vtu z-Ygb=!Qle61YH0w;kU8<4g?WPIm3+};sEhvx8MV*63qLz9`OUP{2|gA{%vW7zMP^H zx+1KUoPn|mapo*~?WeGtLajt~Wf?Dt)pOHG4#Rt~C`&o2q^I+$v6+SEJ1uWFs|zDG zGnK^Mhr3?oA3!?yPCQas*SpuHv)QVEQ(Ps6nDfnqrrg)O?rdCg8A+ zZe5rmDGxr0^fq>evW|y>@h1Si!Cqm(zc`a)Sv%8*0G|tJ=t7k=q^w`g|KHIi-pTrZ z(WSaghK$d^$9TS^-@>AR_VH-s>;kK+jn2f@Ki7?dS>lvBXqKJ;*P|i+@?(Be*N=Db z*PWCP>O%V=6~8 zO*DY4!2UL+<38RnLj(84yuTd-Wpg<6tE|ck1}a2Xlgtl>^&_0WSy7k4<^PTqDbJZH zC@jw!FED)WNPW4PWsn>A*!+8Kksz=CK}PrZSelWjvuF?Ss4xQbn$|Fy5lx^K^)Y+E zb(X3d&cOh_OO$=fD~+u9?6^Ml9!BilXT z*0YiIx%**AgO@kw^#IYQ2B5WUqUn9#swwakPSYu3oJB>|7i^Sjk*E_Gx*i&A(Y#gI z_u^fhwT=xC-ygfnE6mz1Z}<3>qr8+t8_9RZ2la`+9&T zzp;rW#jf&=(E5K+9|!{OAQ*tpe}W%^x1{}SIPko4w#2&oLp@9C$+}L*am&ZuB_HZE zY=@V5h!vO(Rh_!XA@8j;v}W0Y9m=_?eb#!~I~o0()g}y5Ypd(K7cd`A@|!&fs}Y6a z-ypVg7ggojO1_+Tk3j~%VmE1HTGNwXz2_%kW=9i+D9zH+;jrG5mEQk;>olB__HnXO z{3ENDbYn@#c-^vN>SI@PXIi_n%v1&0-e9;of}zu{?TEczjjHGL-V)A#%-zYg#`}EX z-bYhPznk1Q4~lYRr1`$srKC70V}}nIcR`Rf+mQNs(8`rS*M(~h3Z9al$o0VM&%mlz zqT|l8z2rMqPS@W{d+eO#Wzu2Prymf6!=vqwV!Cpq#`nKJzz+4wf3Z8gBvy>Hm2}K= zu-rUc15rmSd9*qpY_-Vxy}Id}AY^7vvCC35g7CPn4p4H{#&7lBw+6J0U)#qgY$>f{ zHK2m4=t*0srUzmGy$gxKf^*FkLD#f}rZ-Gha}&Ty?Bn|W`E8n;tcT~mm`HvGokh88 zR5VU68m}oHV1U%}>rXcZ#plax+VezCkPOKB7(Dp$Id4vZaWlv)&2Z;EmWKxb*tTHb zB8Yi#0Z5Xpb~9M7&vd~$sk!Vo)!~RmXx@y;Wy-lMzo`$>++8?XQLB+tQ?2MFW(5@N zy=^<T|4??VeF^ZJe{NuJsMTR2wF!~5>#+3r&t$8#Ymx#f!IgxT>{Wnf>MyKH5q z+pXv>*WK5(I0b{hhs6lF@0Q57;z%&5TzkKN2@k6?*D3pXJ1#S?Ap)Q{j~cs7EeGx^ z4_KKM6g7U}AMe+?X>K|5ia`mA*+{+`VnlwbBFyf6AA|47f7eQvO$mX>yiZ>43xEUO zJEvrxJdtMXF(YHh8ZZV-*561n5`M)%T*v@i-qfzk=XR}&ttEI%44J=-U5D9=HY!_x zcikOyDJ0Ixi`SV?^?FCL+lC~P3!1bIfl72o{AzEdqjOTt0Eq(+UY) zU&myI1b8LSvdiA&^h6aY$w1i`w50SqefD$WVk>=XOR^Fh4wbJu`ikbI=hj?@JK zvn@GrHfg|EY?D+NYP4hEA~&uvDNg2*I^PQkvX#hx!sms?=5(9^m^gB^$%)&as*1YMoQ4O8I|Nh0FuX8fXvU&z3F>s+V<;=AIZ zSghdAUBSZ;VU#c(P_o0R5`mZsx|bL&0u)8df6Y6c-@(Db!y_UR5)#TNN#cfnCVIZV zx?X7Wh9Ngutf{}5#aTLTY*2sC3LQ3K!Bka;!&ZD&_;jfA7_jaSbz@gMdn3`Bque@x z4(K>m^((#8bbc6 z#6hzJQSma!Cj;FDq8U+;S|grGEKB$dJUpyFQ0|9r2*oCPfGOA^BQ=DwOD>^Y}dYotY2@ zOah{crMW+J9!2L972bu4sRK-vlxsBKZ(5jea>$I|%u}gk(LCTUpK&cOEq&ZlNR@e| z0Z-99kZIsD`j-{IWygn9AbR=*t|4I&Ja8D@;OPERm)c9TEtii@pSup2vxgXkwUk%q zQd8<}OHwWG_~^`gOU5Xy@g6vlUkaVllyQm2U7K_4<>W^Fyh9sr@gE zB1i1G{4cJhRcT%i!*&BX$j#mA|USzWhbo=_|!`6ida)bvpCgM?ZN~r;+`4?jZ z#xENlNy)t?rqSIH4MCP`6Q+EH+3B3*1~17QvYjpoJO1AIZ(co-#TwmMv2p=Bkkt$eP1dYvkslM)+>c53edu zn`~)@+E0V@TMv}9uWzbQ>I8=lS8K8`wjW`dsQfimYl-0$#@LdX$B6$=dXfftCgT&A z<;mW=mG)CG{ee~K7Y`BWBkr(onJTZy=(N~)t*HF8U02h|z`A>iPh$x9_9c6#zvE(X zXeK(EO-s%mYQW;oO){grp3mxt1`@Q2Wa8R7%j+Z*=4Sj)J5G}2-@N8pk6pMACeyM% zeOQfYUrzD9I}e6k5wPyQIK~>5y9+L#FCKNj?ZeyurYyxK1I;F6y( ztXkYCw;yn#K4(Y5huBTqd2F|AO)>^i1-fH2*}2%7u*x-C5J$qiHjaSDAu9KFI$t4!aVQ^6OCG~=|HJH0F#xs;tUsBu#N5U&?qoi-6V!kE z58QO|lLPc$K#U}ryUV}G@X+xrl7~Z0H@9bkNqIP0$4Ob181^8eR;^-KTlN+sm+Sz- zR~`be$T9egw^T$FMvFydDEHNhVb7Pn zuk0l#sJZOv_s<(o0Nc!89{bmrG9l1kj6~5PGux`Yv_E)LevJqzO^DLPowe_7DR!>3 zK>4Q0JY2cY>VB3*i^bbYN{TVpWy#I?RFeE}Eu-zdmNz3>uO#DVn-%d`4<+=Po759C zx-{iAcV~;ADJOU`n^Zt1>7*#j?b@;?*M6NcNi!KT39n5!Q4?K7M62SB(=!3@z#?rs zqKmbgi^_J_ZH1;MD7FAJkKo}Sv8zc3fwyl)0@uV-F`VaDi`KQk6lNE`p)XY`lcibv zYt_M>^Vkonj%kLw%q>Hw5Kd?ILSE0&FINO)TGX?97-Gl@TZ2k1xz&TcpHV?GoyR%l ztqw0QnS1jVIpCroMc!<*ABE;~lQL8^){X8R0RzQ3=MLY14@CZbLmf0$%lKXM!s12P zu~Qa@u`B@^;Ef&DyeX)~>83`%jE|Jxu&*0u&Di2fXFV0F_rdNMv00UkqxJ{z4tH3U zNc_0dIw_jm(|G(%7)~l~#@>N7-nDCAU`MA9`0aMPBC}A^PA`+hX;!_ zV@{Jj#1-G-R(`q*W^Q|RiU9~b7jMy!jfQmA#hwQ9Pk8ZZr2H1|M+B8m6*Os<4Ojq{ zHjjmo!zA+}8Mw^45;OTSuhbAKH9>+4+lo${trk&2L)8i$*I$FBWwKCqj&yvl=dVGa zQ#)Wf9b2Pzsde@O*GIdkNdPI(~jMqMj{@y4z1q~m0(Tm&m> z6|m}xn%Rep!A;{z!v!mfP~DD?ESujqza~@xyKB8{cH`>dHQHtYh?yYKt6dy|_$oMw zeZ^EfOTIwsd?;0329#C#%hW z>(BaRn`FEs7~8xygKIr}8il_i=a9|+bXd>vGS2bF*E`Em+xH%9tQseXz64H1Rk8ZZhBEhxS=4TZUoDSgJOx)VE% zkAzd^v$M$i&{#^SOESAq@myd0)|MZP0oii@2c33^32zf`c7 z+|(2ivQzO}4LXFe2eDi5v@aOXpE$tyBrf+|32K;pWhNu#7R#-qiZ3#`46C4Ph9zYN z-*gO&2hceNh^T=+oQLl;CUQK=gwW5wnU4le$_H6n;x5+b1eBnnS-!Q0D}6t9xAlVm zO^(olMOCW)X*{JMC{&g++0Ae$Zlx}ED3bK~5mNS{KKc4;|VVS(m2z#6lwreOMm zs{x3QtYh|S5&H0Fs|*6p`BQqewe}^}ue!MY%1ic)hPUe`OBcXO(Gqg4(KS!d;8W8b z9TeJpxl3$sq2%LwRME2~wWP$DiXzUv2NerZE#UOb@$ zKIt!{xaK(=$`WLkPbabtAILHp5cN^H#fEYgLx2p)=qDMs^QfBuNO&v)}u(`AKd2*EZMQqkkgFFOYH0T zK#Vid!UUH33XJO+F2zByw4e>oc&a z3;pNPK|2paoOttd;vKE)8{vrf4_lm6r(eHHl;l|#{r{k3)VAA1c?)T$I?+ty+~B|O zvfdXpDavR+>1>D=P#>otin8(E;u3xaRHyvX*5%anY$1|Yj_Y;n>Lt(7K3VRsI2qJh zh-s@NG1dwyzxv$gjrPoTaC$VB1SC&EGuH&AJ}TeDM1bLF6xwk*ovsdCs=e6B5AVV5 z_d0&E%%bMiX%#L~>iZOUI=G3w4FnuDIRSsI_n7`~Wu6aXnSU?y94FGTe_ZNUv3O}8 z9B^XJIcO62J{}9krV)GM!hH9z453ttSaGAA&{KCZ*c_bFxCvL+Ja!OvIS*cq4VYp_ zyWN;4{2!o?9)o?fGRn?Y8i$p-eg$e(ZceA(8rs}FOZtFQ(gA#C+u3aBul1Q$_$*FF zej59`#Zl+=g`@s>;@6Mv?!-;1}^ zIVLtduTD+{{OHnHEnlhM=K}qrHp<|V+ss0E9$FS;;max?2<8ln3<4J0vcD{h{x;@o zaa3fRiP3<^*ZNj3-_+Qs728A7X!)u!WAl{nWL zeH?8tUZWE2q=foMDtJ+uyMftUH(BGV*0ZeG{H95;amRmhjIzHGq*=@eb0>wy|3>hw z#Os?T?Iba~`^UqHF!#&^bLi45$!;%Pg5!A46cD9*DMgK6@#%FKfX zZ^_}=(`+`ozM%>s>?<%O7K#1_W$AWL$FcpJGV~3FF`0=;>#BME_bVBQQat@R*_lEn z>w^XMl=&83ZzJ-u8R{p7;FK~aTj}jNp-o<4N;nHd6Wu83?`Y@a<;z1@H z^C)P)dZ9u~!@=|A!u#}0>P@5L?=V`z|6>>pE9swMG;J?v50IDmkdT;>=1aEF*I^$+BZ-DtLIFmQ zbdcC&IN)2=XC&t`ms9|<8c(86Pc{nBca`D4h(QlIzbwqh2cWO7Z)mtjJv?Z@ zoM@QE@4eopI+5E;r_rSH!KSCN24q3YmK8Cq#|o#Z_#8pySpt5`@G5Wm$Itbf+VK9#O5lgW=F=p17LOk zVm=%LzN+O!%E8sKvi`(z!UsaiXVjVG00?;4!<1*qNxe{@0SNZ&?c|(1{WH4uU!0um zeTI3|%b|?GOHh2n&{{E}!yG z*M^T&4+VsJ^1ub0vjttL%P^saP#AeGExQgAMqc`h@c!unj0f!!Euz|B`&ma|;~qcv z5*|fE{uU>!2Fu%+oR;GgFd)Q=_V>yEy?~{;6POqTn%~xyfXnqWOLG$L?Q!>~S6n(1 z%$V*5!D{yzjt%q!AkJgl^wc{456E+=HK6mkK6T#Vul@V9sXtOy?0U!g5(hm?b^FTO(!8)Hz0_xpSkh!4*J>(g$IA@phhV>G{%R>7 z^O0zcOKie&F`rrFitgYeJaYCla(Z318Lcmj^TL^v!L~2VAq z*YHQFB8Gx=Q8_c=J2S=q2kv4-LmiLOY4Fs2Q)*ciLOooe{O^4d#y{%HyM2!c*w=4d zL(KEMM3&B{x0_z}K`q~via!mnw?$&jU8q)+MK;;PcfhD$Ud*3K*zy*a#* z*5e2=enaNqF26|Msv~rpn^chJqx)}cCXv0K74-hxh!H(lV@p0-HX{ST3&Ik^L^a-a zJ-?X@$9e@kwM6p((%>tZT=2q_nPNZN0w6sF?1)@pBgr2dze^Nxv>; z(74Ef0ib1_2{F}*Dxeql^3eB_9i7d3z|UAo2Xi_)d!DbHqrHe*qwrjr%$4UO(zLb! z9eez?1e~Y9RtNQz>#XemiZC?E{|&-uZT$BL!{HaS@^@U6N6Vy7hQohlgf9|1d=)FT}^CF3?`GT3aj22_}5C7a$s>xwtfrz&F8f2JWR3 zVgVn=dDtIliIcO7Cf`}W0G}UQlaN%^-UPo3j3RMV;XG$NTh`1V2fq=v4*uG4m@ z@&KSEOnT{4=k#m*m_-{H$)isxxPq7&Edx6t>BMOu(l4eb~*%1BK zqCP+>mW zu6^Zp;l^n$-%r8;aK;ZXuIcR?ms}5p_nU&CtqSTzF|BcYkfVWkN^4y9z|SJMp~v~Y zdlQ^Y>vY}ai&!t}0eft&+__y9QjU60?;-VhnZAR{TV+8`dFte$P{`~>BmxC5EJy<$>suA}H^%;-e1$!z z!-V=&2-vi@M#_vanaXxi2pqaB&%%6El2p@LH7_h`HyYwvP=*fu;-lNkO{+v&)F|<4 ztJ9~R0(7R${vHW9C^M2s^Yi}w(&zu9>zkt^3-)z8wl%S>nP_58Y&)6Qwlm?xPA0Z( z+qP}nem&=&d+vGfom*@F(_L%zTD@ym?W#{dIEU32Db8zljgs8{WW#9IqW!)K#fBjV z1SzhXVWd!4xai6sH?`Q~oH)YkdWOcy8I(75dfCXf`(1^zum6|B>p~Uj0q{1 zoWrONq?baKJb>DX26$2WzDv{YXZ9P0y%!E43ohbH9N|JIF0=}f(jh2e<1G%9N7}0& zNlp%;p{sIsp7(=;C-Hikh@8)&Lygp$+7WUMCk&?3EkJkLcz2}JqS?PJ88Cq8^&8%< zE5{ZjJh>XFfB8*D=l0{mr*Y1VX*XgMpT!5Ug30a92Qk!)oX+`ZUX04vuT$P`#&c(z zNfx@=T-FitB9HXGr|~~CUg`ociKaneH$2P1~1_7t|+>#Yj|i^1^KyL5jk z3eDPQrcK*DD$!R?d`a!ELnR^CSL3+f%d1sFRj1{2t1m*$U$G|)N^Jom&!{oH+*Dz$ zu+2q+eEe+?H?mo#oLzp9kcEWicb0#L4F zvX`GPZQQ4ch?tv)4GXPnsYKDv*|BpXbNbB|0qee~U9F66UTmIyl{(q%e~wRP-!h9T z*4A3OvhYbdRwp^4K&`oVj-B`q)(HE3aIdU*oyDHI#l5p;cjJA9D83HF_@X+SgPP&n z;146rYeR0um?`-YMhodqi57C_R=ycUbuh}X`Z#Z0Gx@xoWtM~UHfOWm#tiG)iz+I?) zzP?f~yx92pF}Tq&x6+Fbql48_q@?$Az#pb?ZbOIRir>!>b3n^+55puM1^oB4EMUDy z_tk-lt2twl~XR3!e8M2W;-8owsw{so)zdQi(kiY&XK;!>Dh3tQxrJHCeH7^eOxZntLl4SW7 z{l*vW(y97|fdK&*TG8@wvEp&ruBtTWB&-xqLgOsVuLtbOBP9V9O835P`@+c{zW&Mk z_?nF6Vjt@e$K1@Eytfzd>mN;kIv$#z$PNC*YnnA5BoafdzSBoIFD9Ct->B z0Dz(kzM$3^R*iL8-9jKd(}Dhe8zGl#*}8v{I)DZCVb&PRS=yF$F%_eSWCXFG*0{>C zc3CM;_>%tywDmD1s~}YGcGCrWQod4MoffyWhsFDeq{Xh>({r&;*Un3 z($&PTn-;!o!YJc7J8TPcLkYF4oJxeVH(~6JFK615aiXZap1SoTLVXajs!IU@eZf3Q zFyJ*jmHOc)n(<=CccPCbWQrtBs zW2x*;Xr$c%>gn`_?*245sz%`F?t9g2>~ws*;wx@_L)erPo~e2OB3f35nm{-zo#Cgl z4yRM;s1ic9=^pM*@%x@0xShDJ?XC)p{RYPx=g0E=UGA6NRw3(*;LE|jY8KY1?#M%L za=0>kP0W630mZV{!~NMoMJASeiyY2VX=^sFQ!jJuWcVLv9q&q?#haX#3QOX7Z<-D~ zi})TdX$4dzM$B(^X9Y63GNE(tocf4S@DH~L-V_sKu`;}_b+1b>9_Tb9 z2Z|K+$9llj6CFoHb77P%biUL8!n5y-{ez5}bb2nAW6rBizZGqk7)=Slzg?=z8(R}~JfDVMpdslr=ty-u$M{YrZ-OK(PpFtTz*3n9#*z^o2kVPbR{ z7Q$R(ZoeE_6u^|`)-(3M-nGv=>piWfOM07n9i=T+co~mNI$#h=yRq`kT(j?gGjP04 z_6|kv+dP>!IcFNiTOsA}Q0-Z|vW|O=@TZbykOo#_fFAz%GQ!+?#A+`sFaA26ACj>= zH~fRI!Ck8{M^PP7TlxfR&wl<{VB@1Mx_Em+b)516FR%x^`EEB3Ej`E$k7;w1ve;A@1+lZO=rfU8+sh)Qm3Q@UG`5(;mCJb zk+kAZlZO|J^(YS*6iRwZoX*$xrn>#?*^EO%smGK3O+Bxb5b+9OC{E>D%h1NwR)h}A zKUJKZHo7}~Vz1)wl>G6qkdTl;mBz!d{eckA4jPz8*WCAL4$SKiVme`WYCjICx&2?X&LyBSNy^iyx zQl3!w{wu0)-t7rcqL4C|30 z`7$Hb82Mhdn3EF(4L$rSjx@W7Oh$Cggo=UT-z@o0gXL=a1|A z%YBVO9=Rl@PqHLCM4gHxWHbr=!^03#C)ccbLBFrO$gJvWgES`(dVhAqF3CpoNmCnp z`;J^ENUrqbSlySagQ=~Z&)>f6AJd?%X7}j>3(5BPQ43VAiqFmvkBx?z_OWDq&o{tG zf!^FHO$V`+@s0_qhX*EMGpZ)arSbO7H|e89`6nMsq zhmz5YGL^c5QOJQh1xkKbPB?(+FIBk!q0EYic@X|2ztx|wS%1>bo>XsY7HFz=wu1W> z<2%4VS-^RT2ovbKK~8EyaRfntfbwxMG^(NSh5Lu9O#yOw`|Zn#IHA0tjl_#q6b+%F zMm)RA!h!s01M7m)9+^_NyU}n&^Z7fKU0$n4vJqc*Vd-w8O9PIg$4$Jukd2I$zzt2S zxbiPQnVai-#mvQJ$q##rp2(bljrhG^G(T`U%XQJFv@s6KO41<*SPZ`#VwGo`0~pHZ z9L)NRtK`;ek3Du{0CRW5+UfuZsSEkcT!Rygr>8=e-@krscZS&aQjn0TQ;HV^)47Lz zj@T(7tg5{4buit1Tw5a+vToA3l{-*hSVCp8?Y?cg+r(py!x$$D~L>1}A0Y_lJ;# zQ#2wV`MY>dX3sf)^%n8=nNjNYffN(b2c0kwzmoB2r?jJhE^eSX9QuT{i709>cl zMgQ^0>r$KY17AIx68znPNxh3_OQ-&pZWwXB-MiAP^4W{?&v2;(K**~8$oIB3osw>i zWwC1j+n1^S-JB|;VL6_EJ>#5}m3>>U`miw)!SQK#j~Q2@H|M2?e`|Bwqo8~w@t{qa z^!9Uuts|_On}?iK_I@^%fL7X)tq%v=%oVTMw#Uk`N^g);yATAK0(@-4(f+x`D zJG#2;0N=J-f5T>cfqOq>;VtDj-`L5+VH}#jc{P96YFWLW-RA-6Cik3;Wn~ivET_1H z2!XHL>|{tm@Jd7Zy@iWhCN2 zsjXY6na>0Z+3@0+mKGKozRh6%-K^T=&RL>qHWmo;hXb#CRhq)lhe9;tJ#H?c~j zC%8+$BLQ%kV3gn8ToJ8znfmJ64iQPrf`QY-MJgQ>0S>0rG{o{}rO2d;y4#&1$GqP(nrtY||caS?5;`<~m*LL3eYCj24!3SUQnT%!* zrSv$`GNUXOnv7+T>sh1|R?z81{o%&F?dX(E!+Vzz!1w3rnR;6X+~--ID^xzoX?wF9 zFPZRH_izt!3G=zrSL&W(2J?EdMWPmwkctQkLPdUC#yrR66vH$!!l+^0tXs($3`f*& z+kl@4Y4#==`x7#2ucPHS4}=}2os~>+YMt~ob*Da&YGO{BjUEEmTIoF|iq?dHLPyN> zY3;PZg#*DGp;q$0+f;&l<5ZUBC2dDv`tQ|~YNaBXAd{LT4&=C%(^Ly!z;24)U3L#IJ7iyc6*yXKHmeuVBQ}+h*HC zGqE^(J={P0qof+4((TH6sf%g&VV;f+&d1I32~LNEe}4)CM&=$$x8sjn@qRx4ENus3 z=D*3H_Cp()_3N4SLDrhQ(N>qVJ}kO3b{`AC%y z4o=0f2rcYtWKaQq&;YVmo1%sQktEdd&@w1jS65pE4a7?;E;>P3s4~%B zcD|Cvva>|cgKR}Iq?+I8sP_sCUtJOQAm>z)iq9v1p^^f5Xc zB80wCk$stI8-h|pur<%FKWW>W9b8Kp;4@z`G+t(+ULlNj-mwStb$W>am`4*6m{jVJ zpqiMPt1pL`KL^C`9o0ysZ`_lkOqpBEWy>^b9sxIM?nY>n9Mkh!9F<&LFmT%%AC zJcB7d=OcG2`Gj`qEAEyNoZ{0cT3Nu!8@tI1*8i>6@&g0mlk@J_5%UNZAx0I)*N;Id zGfan`_3f>8-$ojT1u9F_hb9EKSo-NYo(-@`MUsGXe%|KB2-r#|gYwlJEl2E4|KybC zw0tSM2bdj+g8F7dyJ4&%o(@+zj z{AMS zywrySIC|S#GPR&24_<%=Hs!1R;L;%lSOX!wDRkd_X{gYA6uWoR=@0fB>YV{{MGGip z8CJ0LAnB9ZdOH1HiM1{`eL;U3lhM{%>Rne|JB9nzL2tTx4FLM*Ghcsax8K^3g&eE# z=|`8(IX=FY&VZ50hX*ErsP)v#cju`7Qk@|!_bS3?;JO2XIG8qmKQ^sffDql3B{b}51|^!L zI|UBhz^jpoyqv<$c={QVsa2?(K1VfbcImwn2{2d-G!r-B4YLE8lgtq=?@6iN| zVAZyG5!bD|s_H8MiGZ6*K0ha?#`#?1*=e(1Rr9p;fbWmcQ=#set=#?><;YbQ^QEsC zTPORYd^CdiQ!daB!dGtGN#ZRZ7YhKuuQG#xD*xM4o__v z(~m>j+CVpMW#jNQ-k-WfZzo(<%+?9ZNwMZSUy6Zs702&;1^B0=ceoy|St$Lr?3igf z&7c;G6~g&V(wVgcKy`hLgN4w$u~%RM`0S*}yvnyup7vi;pGeaYAuz3+m!}0WF@My` zQP5pb3ll(`T+Kf#%;{m@m|X=NtQroAtR73|pG%_y@R4;Ky&7`A`}!-M0mnnQ5pziR zQ|fX!x9FVq1!m-qM}37^VZD}`ByYo)zTAnO8p^{s9iO|1KsNWdDSm_y0DOynGIx+$ z$DxKfwnbu-WK@>|(8(2MW7HYWyvCf?)f54ATW8m16_Tmn*X_k=DQQbDiaG`d=?OI2 z`or^~l(DKt#-xf6K?;w=0^UoZ?&3CT9JoxV5#8sf*RApJ@t?AK(tU1ZS`r<^^igB7 zL6mTp#-JdWyl|FlFfdc*wl#ewHQk5x_wghAv^wlQjYoqsHPix;US0Bv*(_YT_-;)y z+nx?dL)>Rqc2&|h*4lf>GQwy1^G-A3cf>=;t5Sh~x7gui=6+14VhWp{jhy<&_|;`P8>u0jC} z)R$tsP4*s_A~Jq?R{6ejm%8vJ^g1zDXa&O|bigmXCM_;a^%qEY)&o)XG6{9)7%RZZB)bzI!e6JfKq z2*l7HI3(~VZYBS?2c&TbL9=9^FrAVeWRR)Q55*w^mN2bJ<)^h9Fh)my3_m`IWb)2) zr*dzd6?bYKuvTl?1=1%}ap7|`td>t8!4M5}bzOZzm;>>p(L@G%H=oaLAyLu68V&-< zs}A<9Oil<%#FN^Q@^cJOJ=80+IfGn|LZx_VWHOQO1b1PbLyRF)0sa(cGk&st$jD1K zSMovN*pTs`B5*N8$s$k;=049FJE~iZC12jEiE-(}pc2)=w}JM%IlWvAC_a<#GE5QB zFmu#EE~KVYEe(Eq#y%mwml8UOC^!odx13}DZ4vg@qC#8JFTjB%%VCzFX||@mSeSPF z$coVq^iJP9M7fn z;IIG|EwUQ}Zq@v?yo4EzC}e;Zm@SULUS;U>%MRTU6$Y6?fKyu-C=r5=BdYfNIUS3{ zAQpZmQ3&g_m(%wud0jh9=}Ph|zAF(bcawdK5;!kqNvWucblTm`%|p{L4Vkc|XMvF< z+MG!Q`_0zxFDJp$f8X7I+b4F1(bAn_f!&vXwvR`>pnvsBbi=3qcSpP*HX9Ik`bVP* zobj*_L+tx5VCK8{`nsmRr;VN+IRjO>`Z)b8J;d+hdxs##pcb^X0x){KN6A8-Ns1=- zH-fZI%~T+#K4KBe0291=@hw5#NalY)ol&a_@2(f>r?&$DfPBK&DqLTK@;QWl5TgCb zO=WB?ky^kER&@Ta8OTY zZOf(A1PIHTVz~mveygxb`J}vJm}Ig7u-z3pCVlOy# zCMq^|m7mFPH@>f%LCCR%Sy)hE&5A4Bkk&R{+s%QY?^}mGOVRL76^q{e z>ZWyxlFWY2JU42%c!`9WWar%ad*Ns%-i}_so3@T&Q=_Awst%cc@i!bQhs%3~G1)H% z)1pO{ao$qMtoMn1)l)GUE#AnY2{-sX=~r#?xOvLscG8so8sB^@b&5^6gDQVeHam-r zUBYS(_+Pn-&Fo@bxNWG{ai{C+QB29Db*|cVXZ)Qx+yW)>m)%=w83NJI@gXIP=^tOs zb{*F*G$n)3VdrU>T0u`idgeL@(^f8SIaNfZh3A^_u{-QYE05!2(`J^?k`fu3oEST^ zqHDeeubyBe`eWsC*77|aer(v~3M5!VVt=)GIEqjKnCfM0=DF)_LtKk*+5TJ%wb$fS zZ+%@T30~~vA^W~}ZT=XRgf_!h6K>u;yuRVB%pb^oSz)cgZCP$MTddm3(^hhqpC;7m>AO3$x3EsT%K}t$agj;sQjwFW%|0sW( z*JLDJ*NU<%;=}%AY!e5@Q1xw8BbyUO!GL#gAk}b}uffvqbY!m3Nt9GN0Ze->43t7} z=`iQ5KBPjY@HAlV1i5y0Y3xoyKvNMtJeN%SV#Zhe3I1Clf!fXIFfEdHV-4Fo>PBj{ zpt@$Y3*XJgGhV)Q=?u0E%jf-P>a-3NE}nd6bbKqL-Aw9+5T5aL^W~nx@T&*IL!1cD z`KSIx*c;e!5+o0Ak{KfwHJe8cypEvQ!(jY|-5yRemF$?EwAMEBp7=yZ-CP6=9PFXX zStBj!T`20C%m?AQd#YOihD-KlREAR7*Oix!= zmmKRnK?N{f>Bn4kM?+xm4~hJP3W(fM@qnb?cdXg9AymG<-(bco)s%3g15|(SQ4^z* z+>y+<7zGLi!5=SG@0#RfO8(x%M$sYO`6)=IY?M_h@g@;#2(0Vy{Ed`EFb&gM)kOZ8 zaA$AEme`GfSWxip{(gOJtz*}VFZeeF2t zTHuAn`{SuZ{!8O&N;nYuFaN$FpGA!e1GF`A564%tj(`7H7R9a) z9k1wecNl;_oSTZmKyP0^!T$k*ROtp(9;C0N8ce+?gepk@?~kCEv)!VKrL(N8tPg$!%rfZ)oCxA?V?&T)bQ$TS*wucNp$`vD)M%tJ`_nKbQsT>ybXaL96mCd%~9e zF=0o623okx|C0S9g|NlWBPlT#o|3`p_>a9?L22ZuG}1mrXbhvDda`8~2TlN4lHFESUUE`0&Tpl$bf4}OcW+D9?{$nWIJta8mo|Hu!E~5L6E#Q5 zN$cw6rqW3W;b!?VzE^j;4f$P<1Ee5D$3iVN0N6ikxxAu-bF^1>^$?rF0m6pA2f0>9 zDg9PXs?W|^wWt`1#L7{PKhy4K-0tt2AP|)7_iR>83s6Gu#ihMJ!uPKFTm1*azi4s! z)3y_?cr_qw+7Hit>WxOfd*BiLU5Wd$_m%R2}l|CG?xbOAO09&VGNT*OfFbeoOz-&OKlzAD)DKNrPV_ zk5MC88?;m|hJ=Sw;z7>lI?{=sSjfBlsJe_-eR&%(`0}9Tt$UnE1F@}3L>Ps!_Q%ud z@|)sdJw?3_SmmLFVY^Re3S(^p3mB~U08DfgTZB|TIHN)A9`;e$6?T}+#70YhUWp=gN@$u=10vxVfl9>ko`~WDi!R_+=To$Q-M74dyN%20o<#r?f00)oTj-(>bF##0 zxSYY`*Kr>?h1aWWF*6COb7aoo>2`cd_$EDE$fc~(K~w8+P?y4%^{_U4;6*rAE23xE z44U&L)+yGz@%>;eL%k>HeBIbHJJ|=$kJR9-yj~EiA@wJlb^LZ87@{;BsdId&_{U4~ z?Mc+;*QuJGjF8GpvcJ2TOrc`ExXQ{(o!$oL1C7YYNRle+mzPAvX}7EXYbQ!pDh}w(?TWbLlX_y&m+dH?C&4?b^*QhiZ;# zY$g*0w?sX$-2H`hoK#b{7~%D+(}SMMaUBH9D(CH!tsiOrhaK^b-XI|G_47Gk6OYWP zwlAH{Z`P zJi;JX*1%ayTeGqBP=E0Lo;3R~v~jQEWZ5wtT~uVW^3q)zXB4ufjzxvp^5XQA%Wxnl79O!&ioL%D2Ycc7XFQ`U zk}ImwOjC@12rK~B_EN82xS8{L6LB&zCZ8ctYnpXvk%H3*X_ID5N^0u64c(+-p`I1v z2gLbhd*;g97+3^oEN)DEotf0y-Gy@@DZiQbp@%0kY7aUg4izdmv;}ZCyx{;|(@8Zm94nXJs=~%s(ttVY+v+C{so;=Avv-R+;$XP>-m^EmVDvUZia4OjW0& zGxV#E+Q$sBdFkg5MqXV<&n}Xa-2dnnSC!T_#qV zu`KaIru&MXGcXTU`(x!h_`^GgvtAvx%d4~OQlUFKt`TO_N9Ss2TcB{GkAMq}$IRT@ zD%*PXc+>nPGxCoufr;71wZ_JLG+35udV=)=)Ek4AQ;NQ@z3zBg=cLtqc_OFs8`#^) zKVIoq96XCk;g&0Qpv7RQ>nT1otvhEaDF=kh!UE;8m6n8e!Sa74?j9Wjmlb-^otN z@|nTQ%!7Q%^|;W-L7z|Z&heh19`e^{|SoRTK8 zuWx3Do8DuLL#xZ-_VzJ+Xn$#Td7)aleyvdU{f9==qxZRWjOfdJ9^k4i#R_L(&-N6} zB+a;7b(RfKb(U`ORZluk_!M`TpJlXOS{z5jtPoMH_wG z)KMS$C5N|-&y6Z^=~ezoC2d|~(64Gp9Rw^4me^zuqSFVQ5A&)peZbjIv$BT1 z#mD7-Q{q1Z(uiA`ROc(QnMhaO43ko`b(_OePY%_CB(2zsj9iu_8}5)bkC*E1MiP4) z>b$0B91Cw2ss)WRPaP323S)GdHxM&z@k0X?3jqE@%0UrLE@hp%@+B!Ch7L$T$Jd)5 z=rF0iuainKE3QE=RknN>iLcN242#l!Z75UMf;$vpW!HKb2U;%p&p9E1ps@R0VXWUu z01{E=41@Kr8skcG4Gf@>OF9!GexvSer6}h*@{yYH(PM)$odL%&%lK9ob9t(^F z*XgI1(*2ynoG22KQ=1m^gOBk@16-Q*e;nW9^Eo#us5cp}?A|XfoEvlKtVPtp2T2#{2q z4%4r$OBYcG@3Xa7q@R|nzyD#E6&EI?JPbZfsVmZEH8oMJM(5hn>ogP@l{@)TUS0Xj zyiyz;iTDmPcj0ykX6oAqfiH0&$;I9hKdxxRd|rlo1z&cl!-srzr7!i=%}3H4x9lc-&(g& zh(MwF`I!V6E%Vu55Y9M3eYX&fo_3@wSzt+dxtp`~^&hQ(ezUq`UaAW#KX!7tkB8pc z+dz_)JYg)r`vSgWyYkBFyhi=uyp<^ma_;&n#E8>Bwo;5jc54Mk9*5LF@8vsdLdM-A z&5X)K44(s{aahgEv|Af~>>V8~<%$A}*&RW_taf>uiQ?;R{rKqLMjT%OWp_QYRaZXc z7P6>P(tmtF=1ZZ4*(8&VN7d(f)~ECu|DL+?+gcj)CGy!NfBvE)VieQ!pGfR;dk*_p zH51I+>{G8E)Q4H&Yb|b_oQZ{+v@A7Z9jRm!ZQBt|+fhknF;kAD_A@IAmS<(FYRHgJ z%2m$k#C17H+sdM<>$LLCTb`C98GHH;D?8JWnyb^@xLINeUAuZ=hH7!%NRza(#^uAN z3F4hx)ba}N<5*V_LIXnqUZVG8={I33PcOZ6lvEt1Jn0W%RlRG;o1R;b?;7eq0_Je5 z^6L>P_kT{7)%rut@0zjTCy~%49Xg~N?lpL;TCF|!;%p4%G~sg*r96vcVH?z%`se+Ba@ z^9`3bIA27SBTTExWak;nO}prxmhF3PGR~yqlto9G{RF}OE*tgi-}&}IctdZOTB4qJ z+Zuy(uP5_9TCT*w@mYPWr+3o{Q&65NFpr&9kk6!pRTY}Uxr}YU@T{%L{CWkm2%T)^ zA9K36_Qh~mp5Eo_XdjBRNl&F_C6_8KUvo$PnFu?e>X)QPaMO2lJ+GU#i-IrTWb>{$XpSGtBxr8a$39*PvXJDvUmIIH<<#3p|q zFZRz5LsP&!B-^dPFR4tC21^KEyK{4h&s*Dc}SyN~7WBzBX`IBd5Q6en|5{&qgUY%O1+;ye?E~E0kvn0v}ib6AO69Sk@@m^J!E1z-}2tD zq-i34!f@K_jrACz;5ba>Egc{I0tY`*Xi*l%Bi(IJ?1_)isI2_cfOA6lRw29EVpP8m z7S%sQK9#qnHejIz*_KGG14|HCfcK|rgr4dE1w1rcI(rc-n4$y+2ANSP4Ib1_gHFw1 z^m&zH1X+c8XO17^ZHkBEBZp}l4g`R(Y^u&ZMb4iGf0_5yxI6N7Ic}g$xM(uS>3Q2O zVS$t%Hlk5s55-iW>OinFe0LU(I>)HUmmF86bA}Pm(~lBW493#!Ysp?gepcM?U&t^_ zW-JF;D6KicNuc$a%&q#T*-d2;cse-$@Fly);4y8|J`)f)3Vq0<_yDDq{HE&SS z(UmH7cvx9kA>95A#I-ipY4rAD?Jck&b5z`AZRpSG=jMsj3HBK!}C zG(tWC_daxi(H((w*yy-Gak^AIFOdMKI=A5^uw*3*pw;Zz2AIDYFzZ5kkXj6{-P`3M;ZS<1yKf?^qd6M$08riFbZ zSOw5nxNC$Wc!0MjH_S5Ekbd{8HCO(Zk3}G2-bvpRP8-M5_vt2Ej}|rDl)-t2b9Emc$9B`SVaj6FME#U zvGG{C#w~y!QYT3WlWWFsfs$?_i+*s?ZjvixaicZXg!;R}r>73HP*IrD~1KyBc($n~$;@P?s6fsz9<0I1+CJpDPr^go;*>$Cy=az# z5Zm_t?fiEVa>&$NECCO&Sbb64jSOwXeP^xJPB~Ym!VDEY{Y-12b?5!7x>K5D$q#!W zf=cI3R}SKL($ON!w6*hdRS3@*0Uhn7I-(ybm;@7bNc^yQHMLV-MSJ%U5P5=G)mw9vV+{ z_lzn0p@}_`(8m{p=2$cK4;{LLnr6%o5_`+@00qM<)E!do5=t#l#%)HkZX~k*4at?d zC;x?ADT;UDdiq|Fm)33um6B$~bKbqn<1;KAGo5UO#KJwbayT2g*T-7T94oTKRW=HA zp=rGw>=dx=zRRv^$-PpN>p$EQ1Q#pTu1Q8B*Q?X0m3ZB)haR1+7q7xQuZFkd*m-7a zIsR`TH@dP|VspQnT%!Re2*V>Bq8D`XgT2>B9V2t_(Ys&1$D9e>JB$GZVBz851GA!V zk?|S(yTMZ?|MfNvd}ru(dTOc@-b=?500xB^#IxlHAze5?=f{z9V?}q_@%!H54|Fvh z0bZ0%Qb9rzFKKA)6goHIfFx)Xv}+-fHVH!*zT9u0e9&02ho~fEKXi3B$H&XdjtuKq zG$ir@kOgm`&AxLMjbQ(`7Qi_WGi=1?Q-mR%c}k_e!Ac2)IKXhauP&}NH=m7IUvMZG zT9*}e*I7Fb1*kv2AK-$W+pSIYu^#p2_M2lE;Lep%-1r^JX~9eEQXBSiK9SA^(%08F zw8=Y~?*=IiSzk>S0IahK(&TU`6H)+VFF>A}>p!=}pv9w6{s!g!o6Ov3q$3W+?pn1= zH04h{?o@t=dJL7M^8=VRKeRMZgAsNKOPzRmAXV*-SEdtEVS2e zs^}?f3_}ZoAFiX;;OTB1}f8^rUX-(twRaK7n_c% z{^u2tt9;~#FN82jx|64#C3$qfw1bodPnBMf+=v1z%SF!Hm+;sSgi2|wwbLfybKI|u z{h%(h>8~E@FuM3J!_u#n`sJXsGV>Lf1~@giHDQ=aEPy1HlV%ou=DiIL(8?_6U|wz9 zQZQczh{o;*fo~kk*Oh>$4OcP%tCyH6CO=4=$K2u3A9o1e4|S^-@c`{dk7x=V_Q7(L zN>i^Q$SLJQ^Ud^ylz1z+-l>4JO!Zz}IH;mgnwz35U+0v}J0)$@=V-@@%ADeUL|Mic`6jI7v#E}3VmQE3*N@k#o$nDEE}Dl~y=c0@L&3t7$6k6r zQ-lV&tzOw#XDYTnlOCOIDvioHo3SSdY?!sHn zsCPJPc6D7=C_JO8kT!{l_)!>gUH@v;YhyL5&YZJp8H@FLi~IEXg_GxuNwYP?P6!U5 zez{qAFj_`G?kgB;2fCLlO{z%UJ^F_XFqs?2Va`b}#X<}%qT>q*mxx&~X%Oq}gx0~_ zD5Q&;<_v0uO^j`nGEs_8k3FK+$S&8H|-HF2}C=)L;4zSx5J%lbpAgNHE;Zi7o| zwxs}Plwo?FA`%%s{?(I;!fQ2d$yfrRgLbr{ss1UM&uCJ~iGyU63)3D3;CHxmaZVn~ zyFp)XtRIFL(k*1ZxxVI}0zMwLflWC^OVv7ftsRg;A+R;o_);yj90YLm4xQ{(8=SDB z&Fj3rwfz42tMk@BMb&`a1TE6B*@vfn?~lxKzPiwvN*+`s^n5!iF8BT>;;3Tg*=wnq z1Slqw4bSU&bA}5G!+>}sIsF{36KTzw+=O75(R4|~<2~2NV%#<#{4VN8YK`e?35pQ= z_#ojqFLPEYYwIO{DSb10jJ=*N@ zC&q@)sB@IGPgIOa^pskI(Lzy>C4l}>>O{YR>S(7w!-wwWSo+OJLglDqR%aVb^=V!q z7m#-g2mQ0C924KxyWutqMtlA&wW%{dSrkm{m`{i`BU8 zf%f?giho@r;ZZYz_z-otMA-hxKD*-E*A<**zl`SY;>2r4Jg{Yi{w&F-fmrhif$x$JNqxq!eJ!~;t59vJ=z!=Dez zI>%6cVX2b#a3Vw=b@8I$y9FtN_twjgy~}N%?NMNLPS?>1TsWIrKYdJjNZBm(Pv#~E zD$M5>J&O8C3TGu<72LOPo>gDy;9ckA%5CzcG)a1O4JChDjf!B*vgBsb1arXDPwO_I@lqSFL+aj-IX# ze}^@G#E+&dcGcxN9YAVBqE!?M`s5x#NX^R>TS&;UXn@S;Yb%T1Tk|bCx@63s$0$J< z6=#<5Lr?dUoX0~<6e*TM7QYE?2$C;B$eveLuZKNVjL?9%f5sSp!}G_zA_ywua5TAI z*ZkCJ_b};x^RJb8Tz0*r&YxGa>+ZA(vPi|AsDaD<0mwpvKO4H~yfap`gA5&as$ovj zbt%a$(QKWFm}=ztlq*nx-wdTYf5{}pR9Ig)*O`*cAR)#B;7Ppv82=_`pe0!z0~QU% zFKD-~fJhEuD`7Gn+;&%PX~jThAH($KJb7S(EQsL?`(wYcDQS07#$!%BO)Cdypn)a5 z$!I-x~j2nC03 zbZoRfqvn@T>nUpmemL6PFXbos)ScwYnYB=AhJ?3n5muACgW8`< zWRK+5jd-5bvn&_E7$jG!&;J%SxWCf)H;qxkMS1+G4z;A}W?u5ICx7qd!TTq^@9B122HJR%eKnCBtX^&&g{K-~gDH=(}Js_<{~rv1iZY(nM(uV zSd4b}ie6L;EjB_99vNwKOP*B6XTL96C+ZzzEBqh6-T_FG=xz6`wmEIvwr$(CF>Uv> zZQHipJw0vPnzoH;Z~eb}zk7FM?`~FRL`7s&W}ZA5b@IIL?|q*8{7uxow90xhvNZIv z#^s~kcvNEz8cp5tdb%*jg4^Y^LNKJ;cf+3UUVUuK6Q0(mH5|93BGL{aM*;v@zaM0j zsl_^8;Qxv1h9bXt?dH$UFRs+*4D^0F^p-rCMa)iHcc!DG`7(1}ZUF?QXsZ^I>#^tB z-2ChBkkSpfa#p4so6t=3|8Z@DD}OIdAu_SwDs?m|~2*-g7hC zUy?^5#~bxHn98QVWtVx{!fvo+2)gc6<3w@1H!A@OCMVk-FWqW6C8V7mX-GIeaqQn4 zsb{rp6Ebo*Y(TD7X6K$rjd;*kMt8i;c7+XGX<)V{p-%Mg+oAW(R}NuXxGV^vrTke| zqtod5!zak?<1}@_S*=i1G3~4!j4LEO-5Nm6CJPL?tUsu)H|YJ?GQgzTYIW{kPzKc0 zP1*h%mB#z>^anN*2(-Uq$^2*}T_Um(3(@!1r5CvaH~zPnxLmMZ7w+!N9G&8lsTUkaKwMMO6k@ZX}BO zj3cj8oV~re%D*sVkyE-Cg|dybI1?aI(}zMRRH?to9*2xg{Me1FORbbWEAVv}`>&D= zb3yMVrt4t8*X#s$*jY37glj^ z>*0A+d)5yUsw{>f86~1MCMDd_8=97>o)6o}G8^~Lvxbv?hEX2X5=9xB7*)gy_zBQE zvyg9e+ck#HX1_0b(I&Xy_@W*Z7-By4Chs1yU4#H=JdO-nG}b z254%^+YR<{T~!#WzDcyUxqW|g2;x!6F+b-@LcNp-8e7H0e31LV^ z^eBf=BwhP$wAinzem##=%SDyqA2nC31%@EQBw{?ZB$R+g*}8fgD~d$viabPeRR+BY z=5%N2JSjCL!S@U9q6P*!!+guXx=eWKvNV4a>54A$WLguhT>6nMU7m88h^_OL)xL$k zI{etm7^=31RR?PuCIkG~^10^a@X%09Pj$I+J6}yUvk2Svxo->$z9=KTS3#3>TmNV- zha>T1UrMj*7~*jI>3sDBr}HmASfPi~%Nqa~dUd@QO?+Vj&?pe>RT*aRI*%Nc#7<@- zc?syK^{@?HbtITC;S3CkM^m`M@O*Mt|gM)@y_Tt1b;XZ6aG` zlDdEeapwN)SzmuSNbM-k8^n=gnDdYLWD3 z_U;zGldzui;V=z$z2;;`0Z1eflFT#YImkx6dm1T~|5kXS%hs7NYtmi)&LF(Tj0qf)Ag|^*mEw(TsAN8ROPpY^cd~;HL zY2-hquQ<1OW8LiiL(B)5l${~eAafyg$tP?_14B8xkeW7WGAW-KP#fu?oOEJ9nJjuH zf9q4G@gV89S_J}iWSZV^R$cdqFwNr`8XYR?9kyur*gD!T4x7#daGx(M^qMYq5{s+T z|FL~sU7hG-qQ5%2IaaOO?B5BFemdKIU3s_FMk?J>(Cr&!c$OKW0eDrPW*!t6b_8nj zO5AWq8CVi;pHsWpp>7;EcUxk-=NA(!@pIE@w57woIi?!UIK_S5G9gC6j_qL%?wiT7 z(t0=oY6MwJvc0&&*R?M+WAgMyf0{-7`X?StQD#64P*TKC2jx`M+5CPSspi49_R?XG zoZc8_m087KQeS(s1;eG=o_080F^R6ZrUKKwm}uI)eg2WMHzt@l&46KY)i9hr!;ptRQe>C8%Ef&ig!;vFi4Yy}?@-}< z#)8B8Mwb5?KH%r_IZ$Lz#?Tu!GK0-v&(~qfJ-z4w87{=kQOyzdloyO@v6PiXDi-G! zn)7`C|NH_8>|162Qrqm01fZdIcpb;nZ8&Igl#;JZyUHrS=q3$Cz9sd^U=IZG&sWDm zx5+pMvC?_MW7W~rx9JVvL6%k**T?QOMaT|B$@)N05fM!kLeFzh&>FJOjrUb=anb4y zoO|!j#sZRO17viRdI-CMps2^Rt_Odqz&R1LCw0d>Ljf~Occ6uirG@3mR8F&*y!uyS zco(;{^l@ypyneH%g`YMC6j#?yx8W0yLN^jFLp1sw+fN(B*J8_XAjAyI)l*_0kPTJq zfyc7;BsaB6CZCr3la4Ls-RXO35&Un9fuA~>%JdBayUTIRdNVBK{A%5<)usl1^X)eh zND>TzY{G;{x`;l5oGi{}kNKTcjGj=u2yW;O3uXk`!4Eh;oH+Oxs#ovu*N2mOy-pTV z+KV`>eC?&9!RM20?#E~pN^!CI(5l-d0A>f3h)pArwS%74;pac_h_wAua11sar)UWr zS<(*Du#kaJsE1vT2-(1Px}xC(P7{S_P<3t(l-#GG@-rYYIN1u(kKz zNx&nMBmY=3GMc6CC_>|+pwmGX;zV!?ltdkpindsH*{irs`idJCWwwHy*<#c zUTTZ(ZtOB4-Te^5kTSay3!)2(!sB8VH#L|2MXA!07ARSW0Y=-Ekk>GvN^KxBP_C2@ zcQ8m&o4sZ}kDmK)EV%UgLG7X1`EGxBB9+$GhUOg@BcYybQp^{y->I?o-`^*fU22vW zq((CmDKyva=BTmON@sg1fMKKVrK@GroL)7a{AEvVk*_iQ%!>I76p!19uCxP$+>rju zM-+sE%`WP!86Rrm%9@9&yYyp0DUcYVz3IBqgHW3;WS{w~SUh9pvuD;~mOZiDnI)M$|T~k&Bt%U}<-b|-J9=s)L@kFbEUtr-$ zKTF4zbwTUpc(5u7SSu6n-g`4Dm0=G6eVXg#mCD5u(~2+%HCk-@U5f(03f4+iJob)t zWfvh{Mm_#*)Aif*;XK(b21FAq`kgD>y#~k@O2p!@8!F1m?hJFAD_HyCW-YUJs?8pz zuL~3$zZVm5e708%7o@!jY61_RCLWQPpTX8HHw;@&jpWoUnRVWvunj@@}zYzQB z|HNp=wo(t`Ll)8*3>|78pg@y9>|OFCa@85xNIO!<5sX z8xE37WQ+JCJhayt$igVaSVyVHIY$$QlNu-=!Uc;QxJr=HR@7m%D|*iu0Ud+SwG4;! zSW0w;EE!Z1REeZ;WWo+d)Ca`@;|k%F3qTK&j{Ni6KO`(@)AgBusQq^(NSV8E5fhdi zzSCv2rV`77mQ+;ey%F9(Wu*;*O&{u!3`x)<1lcSA!3xb8F%N9qMQS%_KhPQ6UVZJI z1MUo1V75QX`q#-Cq*Ef1ua9^ z^A@;JF!m}QQZ74F7&Gvo^cuJHL6TCaZxV46{0Z1V*25HP1lny}O;Car`4D06Y5l6y zbR`=Y5&nQi1FM6hT0{lM0P2&1l(S$#g*HuW9($C>7%!$Z@-kkn(+d)T1_t*q6|pMj zRIGN{aYj}mDfaO*w?DUBuo-GH^A7-BKE{!iLP02l6R+5cNK@9`s-^65231z zRHaVtetdl3gCtD-s|Zvm7d6f6FTjF~)z1)kps?XINT^RFyLvv87NArpj~c>@x4_$F z*UgyVH`mr3ap-H|MOOR0lX3R@_srEK0SAimb8qLFejdR|oEvMkeh&EpZts0m+~O=I5AN|GqOi+3DE_v>{Q+^k zum2)B>H`@*b=qZLj(2&(4h(U&JGm4tu(sEzRqBJ(7#^r5~s1+j>0H^M_$s z6p`xj?ug#q_^==m&XxO`B~E?74>N7SZ;+mLo6m=mF(I>X1}*AJ()$JLSH^x$Bs*Kr zpT*KT?x2^IDQlpw=k?m~C<;PP>v*yFMd_@NJH7uYF`MRLcL{%wXMTiEs7yW-KRrtQ z!=U%|!H~!@M|$YOg&q6QA-@NqYHqgfA^L^!jGKTJSfi8hE*m;@BJH-uP!X zZl?pyFNCqN2n$`VY}T!Z0Q1wZ`eg>}%h86#MW|fv{M5WkTieVn52a6?U^!493lc~S`+DfvOJnu*!}wH zAa}m;LMy+zLWqpo>7wKBaPz4iR>r`6*2pRqs40#|A)T!0>E^a;>@;$s^PGnCx0sM| z9H$m&Xd=c%JjP3eoo?at25E8Xz`tE2UU(MrWBFthr?XO}Fa`@I2z(5&!|;^yyz0C{ zc3QJoOq$_ivIXv&K4A0w-DDO8_goWt8qHyR^s4g1{bW zJzf5J`|IY(-a3_cRL%1#mzNLPhjke3m9&I^ahQH0J$052a`1#t1GFUz4T5hZC-T@u zSeUN;%mQ$5XD1&nRa?-PERto0mHGgp ztn207i;|~o2te2<&~ZPU)eOw2 zfK$;TTrp&{4nMZQC8X|1q6p}qh{s&IMc}fq(6kiD98@fJAJR}M<{1Vp3X`qDr7JV! z5xK{e*hjV?MgmP@H-afv{EF1+8bLvY*C$AhC9!rM{*Ya%GmJNJ9{uvBkT!|D zjA|4yG1}cK4)gNA9@e|pks&EA2C>`i({D67Of-kDWhcMPr31}LNjO9maYz-K&Et=a zjfEk;@6eHhsIQF|e_g+{%*2tjgdmU1!=%^iTA+!nlK8I{yQU%&qv(?c9f;v*K7vcb zqu^2Q`-DUQ+b?BM<;rT4LL=Q1v4xx{C(_f?8~rG5BC;bDNe7g?9J^AZp61NpZOW(f zF!?r!X}gQ=Ikf}%jY+*X0))LMnt3HqNfRaIC&`A~2K4x|CS*MSb4D~v)jZL5LG$_J zYcg5xuGEk43DbpKAJWb=(sT`xv5xI@s=bZB^fX^$AqjzjfhteQpJE}#Vop&FFc6VR zoMKKvQa>VyLK^a+$H{_J#qPE8Xg|fkg+t^ilB`I$gohGC^Wbd02&onsL~`t=Z9P55 zfr(J5lSY>oYnhBZxrsvk@%nsbG)M+L$_sB+Et9`%m+^0IW}VrV2*p^va5teL$iR@i z=026uUrCM0pR4gUqZvGeew2wYbQEOl^IIX6|%&StUvbM3{Yb(dCySR z0YJNFDz{&e;?O>^t#Hf_2k2K|dMR&=?BAzn+Hug7+ z&eYvpPNOiGnVs&s=&$nH?z8w~v26c-z1BehDR2U|oD5P`Bqm+c>2x4cUSf^{Z%vo^Y$!{NE{s95(*M94rt@L}eM@i%T zc8(atO0r2k*F@^L78UBBMQ~Oc_+aR`K40H)e72~ijx zOomc1Yx9IdQn7lGFJkjG6g@Zqro$1R3MA2HZH;@>aPy>cuLq}6NZZUA4~i3(Ggvwr45tt7wX5(-1Tc1m%h z)isYAx^=(3jz2z%Te|1k0TGPZiSF*h-eBq0vDvE{2J4uE{xMu5^Yzxong~K_Q@WsB z>zhJ2k_&YzBfS@z?K}QF!RQuqIO3}({xQ&y!|gw*9b;;8P9%9-bA0>X=w|H~JN3Np zqtuPBB=F;Y7Q0^UN;Te?DpctzRr!g`cG6$CUL3ieK5pf?T_J^f##X*WiYEX(H2kjp zxdw~Vj<0K9kRBaS{r_yQ4cF(8`1yp~k#V<#xJHR;!+-u=_+Wyy#ss_=e{o`XmWRNz zxY{zrc>VMWh`6YrfBQfkk*KoOB$w@-$W6=HZL^Y+WiZvJzSCPPhPrI{j5hDIM(ty6 z-z(LRPP1_dnP=Pq8Tt)MF}I~>2?dhU)*F_WFr zT(#+{mS5LYQ)qvIvuu-11w=&!3yNfTeJ4T9}-VHFGC7@ShsCvDOMh$G;89*4~n0Tw$dgKaS*Ck1y)_ z7?V)+lY0M5t<6mbS+3Y!&ou}ADtB?sk!rY^Nd#RPB@9!8aN|I49JUfEZ>`n82CH8%_ z6mN=)IZz`1aG#hLf)g#~$U?`xgU8o9*Z1~#$DI&`mPRzRojLHP7og0$hl7(F! z4+q2S>P>^iji`Ed@6Q-K4TsHV-0qSfjA@H;b%v`~>8v80WeJp<)Uhto4> zO>zBaUlTdKlW$}32%`Sug^jZFlu;?oy7e;M7gH8(mI`_P^@61ck#-HYmpW(?RFL7@ zNh)}!nCWT)FLfPxq+D(tF9(nG!wze}M0EW5p)PvfA`z^6`txq?V zEM+=mS|h8M2c9@G>2BdeS_SH4gV*^3eqGHMYx;asxtp~%e#_^4T}oF&WCyeQjsa~a zAMu-EW3!QQu&02rWEi2g5Wbk7C}g-$4=zvhcCY^rXoO8a%f6*S5aY02pnY(~vDenzw}Gv4EFvn; zxmV*XZ)#Zs3IhFW@iZ$KrZtUOtTfc)&xRN2<-S}5b{;oh)p!q5b4dIfO#`NGm9^0! z!eU1NWAM9ZoIjiDUIf*B+7)Df7-(@_*|c-eGlr>l?OGU?urb?N-B_o*@3*QRHAk5Y z0*t7nBX$B+y>*ncelb3NJ?GcbPhJwPj9*F@QDSwfv`HaTzVnt;2l_G;xlP-Jg_ahW0M)gs47 z$MuPa*HC-&lrks2i?#L>cRQZ_{RVt)#AEJj`XZRp?I}+%?a=I#-3Gz6D$*JOKr#sM zG+CkXmW5KqDd{{LTN3=Fe2ekMG1gHfP-$;zdo`t64HhJphc8Gn{`C%}D{2syVP+of z_5_SHU|Sg#`&1TU0&99@5wT!RU_bytA@Gs===Sh^J~4~f>Y_623x6ru7u>2_MH1-q zLAM`jdNX5v*Gej`-_R($xL@rk+KcyjG2pXHn0>-Mr(@5%o+f$(Vfmn~u(M9e$^l7p zKZ=`R9Zqw2C#5tKXMx{oi8ISN?(F3t*VS=-eAGa9p2cs;u%_M>VA+d02u)>k;`2bW%q3^?`bNGR_3a-4VOWvl3Xyw(Zi(`b^KD}-OJ?^Xam*LA|C<}M?!oV#IhG~Q6 z8(y#N&%TS_^XJQBA9HV${w^4f+x^Vp98%}4mDC>S^6G$sN=H~F{Orx_1%MEUKrD?t zdB+P|q2Erlw6*=is8Zd^Fna~GP|6!5M_Ut`@;Po)_2{yOXN=132vX_?v&gUcYAP98 zPeJ7J;dGV#Y~~FYpQ&I}0y0sI>2vm1N_>uW!g$nU`rn6HsXS{HMDl!_P_> ze94@;=F`hM5O%arqqVhF`N>qXzUVsRBXEG-$|feWg8oK|20a`_^vWuAmT2D+W9I3y z@vg#;gRI)#rg_PySH$Y7*7bOl*Kj^)wg{r=1a87#MAGn{-RADRT;Gp@KFesmXgpOm#IeCuf+*(fQkjPx-G4UdZPaM-;< zApw9=0`-1JsQ%OzX{$l|XL<;+tk(V84V7qDQGTh9B-y!Yx|$p~1t9r6 z-nh^X0@BZQa6;l&NuMte%LXxDWJI@hwY0Je;9X1e*#TM~uc~2@p%`FzgvtkM`JYIJ z(lPL-0vegMv`-GF?N~zMvZ^}GK`8Is{WN|_kOf1CJyM$=%qg~OW`_MR;um6J_U+Z1 z@CCvGl6kx~S4&~DXdmu)2w(s^2T=IFY0$q}b@&AOuwjp+To!?3ZwrNvDz&Ko;-uTK z?J8k1ot%YdBriy^0=xXELd+xTxMO8mQunQ1xo?*o*a3W2GJi;#LmljS63?*eU|~ z(#XO;Jn((?oHv8NP*VHN@=6OOSA!pd#cpQqYc@dtIek0DCA3y8e!x`$%39m`7i@p8 zEhp=EIx;(Ookvgj)7o^oui<+OJ$`}C-Xj6#)1UorXscpf0SWK$I5-9N0K@?j%JVNe3>_aXxNfwI zbJIQCE40Qu48h8)_*BbjB|Y5FdEw_QR0r$zBdr!_ch6IOZt4kk0{rgZ-|q+0D2_TE z#dCC?IHEV0yGOv8)Byl+GJG;jC2Lsj`;WZiD<1$Jw4sE4zr(K0emm+V?mZ#PLTa5p zQ>_TqRZB(jfKeb+1NOXdfmK|mowVrs2DyAd`u(iZNJo_MYAi%0`Z+*NXKA;B1F0Zz zE9NwLPuB_lXw#&FtT#K)q1_uk;epCY&y~bd;bjNV!dDUaoX`g~ifUxI!v~O= zta1k{sA+o@1r8hi!sh%wj^D$w6rJZ}8JnAi&|S#)fw@0D8~3?a;v5PP>KGrcxEff8 zZ>_SgQ}TS_NWiHF_wu4BUGyd9+vp2Y`~zmPR{kzkqR4N)xkbeLwul~A#J$DY2sF>P zYZpAQGPPe3#d{BKJlQCtxe?QuSUWicE5Dy_o&v_aofn%olk{*mkx%SDiZ??5fQbg0 zSySr3m8U5h4;?1QFFDFsPkR1sLCgG=I`+BMZsx!eq_c~SPH&HDgY`NY4U6NtUJnt| zDN6h;C9!r1dq1p453RYzzq$6XrO`7n#N5(J;f#QYnK(>|Gp9=)rnpaHbcORZTCPL^ zZt{gMIYr~0R~-G9pkffApN`FJ*HKggV1b9fIgD?;CJIpNmwy62q2BEbnr+iGUtSk^ zWlI+_;S_$>@^`=auJ4c_7)=_QZq4Fnv6+nkO+0_sPmNrW?4tny#N(Q!jDSGZc{m+) zwMr#-kJoU#&9oRKz`ZliZNAKF+{Y27flu-}K zU}j@L2Kta@Z=yTo%jPf`%3ln98XbMJ-4W9`G|sHge!UOY_j2I0>-N>vY)6zreP3d2 z^&6M(1VFQ}TF~)>eNy1RJ!$q__tD;&N`}Q^8~T}(svmK)Sg);_-hH{)_(;COJXo}M zIxJebSc)=qDeCr`>Vy-pW^-{=HGAu8;Z^o}CvDN(v7Oe>EY5hj+9MNvsiM&_jy2v) zEh$@XT3gHI2=>-**4pdiJY#QVSz4uF6M9fz#SPW;&Ci97q+#1U5DM|gOG2STNbJ=yWAaLsq$oWtXM7VnaW)*c&$EN#9D8(V5lwD zrAKPVi4Njjtn_ZS?nTw|v>mQ{&*HY5DNf*%>Sl+hJ6?UBm>>M@MtCTb5|!X^t}`vG zE`Qj&K2YWrpa>g{)0Gjt%ZdyWf^ILha1?H#VWmi@*t9s+ibxqN(PSvOg_ zDF0}Ve-$0e{fV6vWt{if{ncPss$56=eu-flc`y;)4!+a>~7-d2>>8* zHCQ&y=Cfa&5S&O2<&^Al@UEP#YRkB`2Ptsbx+RTY^K|} zB<8N8)pQgPse*l6H`OCdWek@qGUPP4X~s)cx-ARHV&q-e%-;4_T88i9kjtQcW3zui z15m7|K%4qb$979pEuqifr?`t*{Z9OR--JBFoK80`oa%?SkNms`xZ2x$-upHYPxE3> z?%*RPyFz)r+beaf9MmV&(C_`ow!Et*o9~7F8pHlx0;V*SlJ<;R9FYLklpF!nJ?p+c z1;=3}TR6#-xmefQq6Bp`x4)*L99~olnGooyxQzL<&+G4Jht!~UDFY57Vy@X+cJ+B# zU4A!OAJkb{mX>C(E;!@1&UT^$oM?XCzyQ#od_zZJ626 zN20x{FJLb&|68FqPtnD-I{Pul-Sd^ON$&{w5-2pC!)^Lpqy0MiUz|kSVfwwPh}MFY zmfbNqR0J|Y+XzcY2EbjU-Z?-Io^L$65Bz)!@P z%I8y}n@P+tnpe7}n#51bkDu#A@?S;KL` zVDiDrQ&;$o|9W3yt<1|qz9cXsiX4KWTSm922wH-|mq-)|kuE|HnF?Fog62swObf$C z1tdj^GTeKU_J4`hjnhoHD2FU9w88~KLt~O=iX%WSb3@$oB@vZnFiQI%;;CPwnwEHy z{f7sM-j;$DF2TwK$G}@MKJ<~LS-~}fj>8$xhFYx7Cmx0};56&aqtwLK~u{o=k zjofQz>kseHr{V6a>`OT0heq)++!!H8XGh0JzqxX8nb`!Z-P=={l~{{Kc0lL*JKIi*@kyf8t*ftXVs{jjlaz)?B07I2hF=2 zyN$oFf3I;eM!dhX&7A37fh#C0&QoU;V&_uD>o!+wkNo342cg!fO2uqwq4!kD@ySS` zb!|ZlsrvU1+S=t0%-5$dc>s;ltx~%*`!|AX;7I?hh5~!PU>RFi^{)ByM_&cz`G2^O z|AA_Rz&6VR35a_?vxnbn!KzoXBf8)TX->p<^bIiLKfJCBq8#)zAMlZde39%>ffva` zJ)}4O>yW#|QP_EaE2xcTeVQ2;${CzX{r4fSG^Xeq&O$m736uKo$|ndMk^c=x{M5`D zM#%*k50k(Q{ZaCNgEdH0MBea{u#|kAE`F)lhto)hpZd;=b%A!!bWETTKpX%R+)^1H zQyY+h-{IqA@`{#Hz(5a$?y(ly3+xBz%|S{J2}&FX?BTmAEMrxu^sU!DBW^Hw(oK;l z1fz;jy`ZIV$P|D3gO@_pu~Lbu->7(kQZ@Zb3mW;h4o8pqY1 z!5g4<9Fu2F_ATbxYS{ycYMW&eRLalu{wlJwwOqgaHFO5)Rv*Qg1ze5TatV%6uV!9M z9dp5^4>9TgggZb2Xvg^YdwvcDU#{L6VX;+6zRutj-k<=`oc*N~faHqN!LmE41cFYl zaGI;7^Sdpjqd)*eA@p)}gI{=i4c|ur4e4HtY_x)-p4USi6MJk^)!6f;`l8pHu+<99 z&#cq!;Y5X8mgcqGnRti0Ms!NO)x`V$Xnz?>u$NydI{x zC1eg4^4^b6uhxlMdYC==$BW8XU!gm+n=S>}7w$rHq-@{mw|`T4yKX;W7~1;LO$x_W z2P{wDrfb7v{`qSvgAtwWXJ!A2c91mdjZ0^{*tWc^`y|gHlfQS|5n#E0C+wQ6c z&d*AFzg}9Of^C1PTlqIF;#~Z(Y+wo zo@b?J!$hQvvMdlSKLf(#X9ss@?VDi%WG}sC@>lGR&f4TlzPP~7mGRLrZ@3YSlgIw~ zoJ6EK;8vB(>N)QDiShL+ikIa6{z#Vpqg++oBu0^^ z5bdd6+EzF*TX`e3t_sSG3Jyc0?IZgjW%BkGGTh_!1cetbpd^BqkIMbZRQmN%At$Un z`#;!;#Eo>FQ`POK=o_JFOk#P1zst*h;lHu-ZP#@LLgM{<$ZT8aC{>3ZBeH!4-xc1% zhF-oL%Z}xoFFGjB9Olc#--^X>7yz16xU ztD{)nZiEO&x?IP_O>BHHSGZXvlSg)ky#S&-A5rUa`TQAkg29n#Itb2s`zPj>$SL{V zAz^N-8Z=8*jk9szAnfb9}rE-}QutE6_22`#V;tZ|A^7;Bd)T@IPIdqJf>1a+mx5(s!KG@j>2uvyB@2N{|cM zl$Sp>iBWrgvU!!U4ul^vfn0`oJKl~pbjS^el0_;U61>Xwii79I(sD@|y_&y*pP|J} zPGWLy>NgA=9BHU_uQz+(+M3q--%t27OPyw0QJ+xNrpQy+|K#_nL`opW|9@zQq?E8d zszg3wI~tTc;z6asGW3}=)H{6=E`<`tNVY`iAn0sm8+9AB2)?G6!q&2o-XEyI%39Q< zsfp&Hke)nKAsFeC3Tl4Z|l^ijg)%y`Bsh_SwLL#QINSU_Q z;qG9tD1q+fJ}PBGCI+N1$dZv)L0q1!XlVat?sMOre8|^q`;{|*C#0mLWcXCwSmp|F`y=< zo!Kf6lnuC15hw8T`$WA_fY2KBCmMtkbBc+$K_*cflO_%#8l*t6#zV;=DxwXEfK8__ z2IJ)5$YZzFpkAFODXRVt8gO&vFJf(24tGv+?! z|BRCKc=9hiu1)Z`-eBvRh12kttL+Vj!Z8~5$tg_$@7clr{@~ys+Ncz(<;=f*^1m}( zDYE#@-Hr=KquNMyF)nzTwJwGa%y4=*!#7uPeEGAJzVS~?`mNS_Sb@LXaeXrC&W*dy zXU4JA>lS7g7(K5)=KfxbR@D%gu^(QZz9smMO#&Ufo-&oYwGEq@FZgh_wt2e4e<_Mw zzBBeFepB!U&t&s@sWdNwle++dH1_%~DwiqlgrTO_K=Vjl-7|=&l0$x3oB6bVnjBOdsl;Ji>U>?P(rs zvJ=Jk56J4;S$vIEn+#3YRS~Z)gaOT?iv(>qs!3G5h^&#~9^KD1ogX`F@JWu@f3Yz$ zhRgE{8mqI8`eXbF*F5)Hs;9_yqUm4y|AZTQnyu7bM*A#CEmrIws4r)4{NQZNxU2^f zmG`&An%v&Bst#)W84TMnR3jHAQ1nI42_hH@8XkPf@3B;wiVnlTa88Zx;{sJ0LHyYX z8SA#^e><2R8T48FDCcR3%upu`vTUl+Ol0)I`p37y>mfTjNaX*=(z9n>d(WwzXfrNn@MAEytW zew4@K!HT(rb%Vhs1VXB#ZVay`*}nDPEI>{0%npsg>`}qCW0TkChxZtwx|f2VW8W4C z$h$V`OM)q#Zq29z-X-r{jl<-T=H=BiBDnqzU&W-l{rCA!G+?b>|F_u>9#6-iN8uUG zLAIwy5G-vfETVP1d+TtMZ8eC_`Ns+X5~pDuD)PL4;dH6&4e$GM$A**b0muVjD1UR# z%n5pzu|t2?T^MQSGUJMXen13c_r{VmKbV-tct2~w7978P|4fke{}U8|u!J_1ewI(l z@^#+ML;Iy~y4(25Z8s6zxags{MqsVJUu4gbTmq52mE%!Z?w}vx$nkQUE<5_aQug$M z)OO1ywq4u#&u%*{Y-&$YTTpSlJugGOrFl=`|C+F^Ej4R6oibNCyzJE{Ee$C1VdJRm zEv=#V}rB7uH0Z1~^GuQln17i&S zwhp5~wxD}q(25RXIjwMKUX8sLMV>j94>8zq<(KYIL^2)AeFq7j4Nc@XAG&xF0tnGcm=t2v`fY|F*@ zy$X)Z%_nUs#(tcJU4)PdNC}3|Njjak-qGa4Bp!_a0ubJ80>t}-p$sC}Uh@;StPg37ihwdhy_yfF-(~$->8z zrFbEA((T?OyPpM*%jeNQ&Y92_ZLgh0r2aQ%@Zt2oFas?he06=*DbAg*@8GF6N zp0>~HZniM+Y4@gR7lzeTloKvbySY%H*P|ZnC{jIihgs14~*3B z(^|4U8n*0rDX%1Z<&uRB2XROOi3E>`)Zip1ev2LdKlB(ZgBR`tL8+#GwYJ0C)?>c9 z)qR&&>dt!6>I-a#o;)dN?G`H(85U!)bT&6Sip!MZUl?H$_H48q``A1kOWlvxZ8R)n zF|LSwqT;Pv?VhPL=Im^2bb4LmF?k{)IR9pxI2MT(@I=OPfTn;nTp!u;(8P4alOp+Z zXau1X(^UAp?n_Lq0oj&Er`-PTwNa2wH{F=Ag;>20ju1^j2krTz9vlnynSBLf_W3)V zFE8DvvvM#JJjx>dU10*UqAUuE$9ikk>}q>kL;IWL3mTcC`g+5};?jz%}GA+q%UxNTZ% zAhS5!G3n|{v`LYYkbn-H_9ITr_-2uSiW9E4Nw`Ba$l ziWXJmxLX^k^;o7^RkzLNN@=@Kio9}mu*J&e{w-O2K{i04QpPLBwQ7a~!M;l&+JXgI zFv!%A-)?w6^9r!lMVLIEBy4{^ejFZ4R6w4f zaaug2GquQv+e!hB6;jA{(yLD)TY(Vfj76o-Sh7D?v6af z@X)8*0hu`IWcp{IG9(78BKw00&+GK5RXOZe<*tYz* zpZo+;4r}&;$=*uU#hhH0gwXycbU zFXEISTUE_DK`g_yo0)_n!Q5u=b3Rl^{=tD9%`z7z%3?>PEj>MuDELjl4g{Z0ZUpKV z4GiWQ%hbQ{4D4C268P)|G4HmTyq^SX*vufHS}WT%#FhInl7*YAyi*#m=LW^D4&-NA z5me(Wx&*T3`Yu)b!Dm;N{d6Wzz887h>}NASPgY>IF+*_IyDL?;>^7=wKEX0NVsL3K z1TPlTdYynlC2F#qxNghk%}IG4qbCdyl>F8Ns=BX53w(AXLym=DjnCa00(JxzYvl{|y&>=QX7RpRzc~ z&5@YS_Z949&6_VVTpWG9Msk|%w7trVl|8WkH|9}U6zBJi2tReCak^Swrz!}k zPWaK*&48t)eq^g8TJ6+@r3#4#AS;OkQDdQN0RFq)vkZ~Z>ef^nJ~xaDf#Gh;K0Vit z(rZl)Dj~~41CYtgq|oZEOmDY8LuV^+RH_mY1uGNlbZgOr>|Qq__-8k=*T=%;v);-i zR&<(}e*hdM7yWT`IP)o7$7xS(6uPq(0Wa#K#t0XL*?ex>Gu5Vmsl0{?ofk-c8Uj*k zuX5P@#FXunUz}F@01Dq4pg2UrcAGfw-=S+&3xTWmyyEI4R^0z*zTTFreumJ10ONa> zo}a>;6C?o_h!+un_A|InI6*OaZM@l{Zx^?_u@wStgYeRxYC4y_R=*ey(kn<5^Ko*B zOKrj||P(_g?!n^Ff8993%Hg^J}5k}*=| zPanFg`ARN_$@?#J16S}7%I#J6YWIq_F8fc63N||%BMI8Ga9Lr#dY@hN`rHl1?Tgcb zS@VjPe$Is9A7UyT-<{<{YQ2X0Mo$WIPk#wb`my5A$8u%mVmiGTN!LY&C92wbg5<{bR-i z4}}Ya!L?KT?{KP|=DX@<&gRtC|L!V2(e6Z_#9*7Cd%TT zUKFwZgu{KOsFlbisf|n7OQ$>8Mc?Ms!Bn0tBY-y8`;$ zz&0N5vwEsyj8#vI73q1F*vG4rrwvWfu1AE%`--*3dN)VO7lAavK^8xB84J+`Uo+GJ`_(_*9p+LR6XF$8} zjQ1ep@YFrc?@UBZ(F3`S0Nb^c_yt5gn5OUQguz)?)>}_Jr?XHr@ak%pwpaGr{WUF) zL`zdcPI}FxSB9>z)E|HbZAZf)E;s99t&iR2@M{X_uk&)b#ArTXj~}tHuCF?Z%=07~ zZ(f~qfLSHXCZ5FU@V5SCg}uSXfds5=fn#B%Xlen3t^|xcdqLCvD&IdEO%0An|5~`CPxO7mx-AeG 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 F{{?51w&MT* literal 122888 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�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 VI8a-URa6rItngmGLiR)O{{Y5#U(Nsk literal 93426 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 diff --git a/doc/src/JPG/lammps-gui-popup-help.png b/doc/src/JPG/lammps-gui-popup-help.png index 0d692f17957ee7817920b9b9f363109ecdbc4594..395e06ff432801581de91486503721d9e30de91e 100644 GIT binary patch literal 132908 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%0DavxrtWt%mLX7X+7C{9L9h1)^?2Yx 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 JPDHLkV1g4){M`Tm diff --git a/doc/src/JPG/lammps-gui-prefs-accel.png b/doc/src/JPG/lammps-gui-prefs-accel.png index ffc558f736c27fe3721ffd1e949bdd55145edc59..3cab94136aa44c91127bafa56a44e7f39e790e56 100644 GIT binary patch literal 38261 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 s{9mI#$?sK$0zxH-h-S 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

88qP_g0 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 QFa%Ij)>Nucc>CeM0m`#lH2?qr literal 44506 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 NRFyPeS1Fi({681797O;C diff --git a/doc/src/JPG/lammps-gui-prefs-general.png b/doc/src/JPG/lammps-gui-prefs-general.png index e079f1596338d4c186b7c819fbabfd9aef386227..765ba8f84deafa702bf268b44f4ac20d4a6c0190 100644 GIT binary patch literal 82533 zcmbUJWl$u|7c~wx?lKHAID@;p%K(GB(=af&ySolPxVu~9?l8E!)401kf1cmF@0Z>E zu(2H#k(Jq*m6i9NxLJAfRD~(ZOQIm+Ap!sZ6sey-lmP%pLjVBc4Ic8dg!44C^)rDs z6_FDG0BT~8UJYPA^Q2DVnocUVCQhyf4#ogYbrKh22S;;T8xnR#7Dg5ZR%TWhWl)ICF{0fmxquqJk=k%@Wu34b)UeRnYFSBWIl8jm z;bLF_MH?Ot0UtLr9+mp^W=|7~RMLF>;JU%2$NMnmn01qJFgE5mk;=w~8P0N_JWYZQ z4-L8X!G-U|g>8eR`VsYF99dVVvfk>9e2dZq4DpAP(*H4=; zJw}7=Lp%t?2ryY&VnM;@WM^f6T~Pn>c^Ced9o@{4iq!0!oEUzgg~9Gu-dr}%A07LY z`5at~d38lLo($&2L4Rx{l1?;@4Ub>?_wNs8HmcM|^ix+(!(vY9;@qU8e8M6ghjWj& z&AT`&)yNKX)WU>6#~392Z)F6LKgGlO#KV(|R@PX{=HF6B*zigV4~;{xCT0AA5mj}& znvJ}diwm*>&z=$0?tW2ig_Mm=nJjEez{t3ilEXl0sX1D}#_fq#VqS@@Cf$FQL8pbO z(R|$$0RTxkn3$6DTO&9ui#zozEScdq>)7Ov@osI`F4a4DtDJ9NObe{A!>u@+R|_cV zr;=O@p$BkjbP6T9sCR9_oq8Zu+Ab;M|I8r#hzBnyFCG3C{AHoep%WixLrSc;A@@l? zGH($?NI$6}KLIs%CSODWniy_3+#^W2Y)n?%HnDMK|1{E^TUqYWW0g5AQZ)b&>w)Xu z6M{}HSi&$SZK!YNPuPs>Iq-|~;{^QZ zpYu6|CQ|%_E}&9kKfdHwhu{~%_({Zlwwa!r1Q8VJ*?k!-40z~XUr`zZWy!8CWtyL1 z>E)G+3g3~eXMT;Rsg2-sC48S8gT{kW0W;;Bmxj2^CNyi|@mg~m8;-o}DeveT^FUm$ z$#e%)86B42tj2BdLvP-VdW6&TTZwBMb!YXLSvN(CIiDT-W@xDB%sL(_3zta8w6?JE zKKfgl?P(ISKSJ+|`; zawW&a;P}s&V%bNA;P!pnAGZC&apGvjTmAsbbhcXi=|n@Ozj<(Yq>sR{|;b-obq&lGoE=XRA%Q;OH8G=#0l z64a;Bf7nEgI?oJEwN@*>0Q*UzAj(ky;^Si)&|XT@Ii*KMb~^(7DgCR)SDwK91CQt{ zK=s932X~U`t*$O#RKoF5L7_=dXizO=1D*fZKqh+bN7Bq4nwlu{+0J`;7y402iFO&} z=J)~M>zvC`B@L#_R6h*#fEh@96hV}LV*twK=4|%>1m-tO#g(V<#|l#x1bQ^U4b^

f*5%P0x&tj)Np*tA*%!x3d>!x4~w$DHRc8 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

Npr&& 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 C!6woG literal 50767 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 T3`2{0qy}!fc~S%w@}$ ze;u2b*_ zIr{o)=${CqzBLz~*lnB5Rbx3EWL(0ee{H=q!gx;^pZw!kK>I$D`{wPO%a&6MKYVY{ z<{x?5)rSHJ0e1ZlV@mQE1yo|!_G{mrz|ri z1NfWJdqFdXIuh7d95r z1^hq%Ebi@0!5dZq!gXnEx_<sJ3CGgwJaGNt#*e#UK9$r@Gcm<=_Z z5{AtFnwa35{V0QtD}}?e)hl{`bK=%<`g>=`scCNCOU%|#NUg51(Pw|Q;e5f@Twj06 zffS!kAe*P_3(;D2+d=EutTTyxf~{d9BS0Ibn5d(v`Ny**TYZxuUIG?yelX6(EaNb3 zL4zYk(0LT=X5uqr+Xx|&5l~CA&A|UIY9GVf|4!1}+xs*Peq(C_0sS{393F>WT^$`0 zzds+tEm@=Jl?bhWHbQ`JkSwhsveoR0@|`2U>gJWGaW0OBTZg=2I5-9(L?|-Is0jTuNM)kd z06+ep?@SNIE9hxzCM>-EWi5BgWE@!wnS)iTGA9k%h-~70vaXMg0qk_=OQ z3$9J0o7ORtzkkR1C_Q}t6I&sXO;0$k z8~oOX7T>+aGt}1y^INOz*KC9H^XJcBw=HAmTZf}y=7`wmzTNm$rVWlTx9=mC zlUW?ueoH^YwAudc+ux`c)nFVP`$?3SvqxDO{(g^!^}Es#df0K^*whq%MnW4FhXRiN z;b)ex+s>~tQBhGVJ~(nanNi86%O<7>xqWkU^P;+023$BD1*E|Ern#QphP%iC{QeGp zcUn`^emvx0jwR#p?O`P?&-P}LSTyj^QNjECai88j6{EzHiLfL)@{`C=#SHEK_=MDR zM81=cS1KHz9sy%iGOKASC|E(}-FaDCuf|b{D_lE)CGrCbW~>N&Ny>Fz1Pst4zndU9 zHcw{pOe3dKB3ZM9bwAEgA)}HNUa=o|F5_p!!l?LR`^LtG0f*4+6nNA@EZZkUVZJw# zNKg$bLTOerwR;-%=8sRC{Of2&r9bWl0?A5=UsJpaC!x1v!GUcn(AXe?N>vxlGYqXb3#aKtXw9EYG0w(+dUY zPlwF4RzDA?qv+;9OnAS1E+IEdwzca;ARg5v%O;2;>r&}xq^33;g6P-L6RW5&4GZDu zY3kHHUJR&>eXbpIr1o4JH@5i=vkVIbCRjBjsN)qS?K15ist#YI+y||4)+or_wwG9r zdbC(n1Q$R%k*ukVB5l*JTBJ2-qg7d~%Jx#A)x`bPMYK7`$nc~LovtRMJY5v3u5RaO zaIU8Eobl;~f8ciEK4M8Ddl~V1D+%YJ)_}3x2+=fDDnTCkQ37&I{Q_#HQ%Qr2nGLYF)S(wS7E7zgQ;GRvLH*LtcTMqZ}e92^|%Kj`%6Q)utLq(Pq+sT=zIfEBP3hTuvw4JI;%YFXgeWbpTk z+9&qvq^+FRd00~|-5CApiEprsdF8P75Y8)LgU%Fo%N&t6^@_!N|v zr!Ua2#9ERK+IUV?o0jR6mz1zj;zd77xB8LsqXDd7nVFf5t_$ozljG~jw1kH)2*wE} zYYmp(LRNL9L=@@7(gK69tuRF(8{c&<8J}D_l`%t$S)8d!g`HhTDj@KnM`{2)6FZg| z#1wvk9<(_-SeP3d`@*U$6dfbWkR94flzk1fCyVLmVpx<9F)5|l zg6A<9hsaWFv$V4C!Oqst`a@1H0>MT?Qo5PDA8-qyGz$L@c7<1iY6Do_X~cahx5N`{ zGqf_*OXL~S)49u7hmzT})unF#O;+ef2VJ`mWjGKK(G4_0`VIIp_O`c=u5Z;rb+|GH ze`0>#WzI)MC3>2vt(cDv9s38NrfvbtPR__o;@X-CrUgI@h}dTv1I!_)wEWB-TqBAi zEQvBYDIx-ni@!;UVjvJQ;kCdmr;>`fP`q&<7~th{{3ON>OGpeGtdx;`)xYh?*K zB5DtI#|%}4up}3l4e+BseGh-lfa6)Lg0Zo2Uk#Zx*d>yp-q~iKkeBo`$}pm4hpw

9+AGmTJ%w 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%0ALkM|m^b>=3 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 From c0f1fe4d31cafa6ccc7416aee71a70bd59929f8c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 4 Oct 2023 10:33:27 -0400 Subject: [PATCH 130/219] make utility functions local and static. remove from class. --- src/region_ellipsoid.cpp | 19 +++++++++++++------ src/region_ellipsoid.h | 6 ------ 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/src/region_ellipsoid.cpp b/src/region_ellipsoid.cpp index 0296178648..f5c896644b 100644 --- a/src/region_ellipsoid.cpp +++ b/src/region_ellipsoid.cpp @@ -25,6 +25,14 @@ using namespace LAMMPS_NS; enum { CONSTANT, VARIABLE }; +static double GetRoot2D(double r0, double z0, double z1, double g); +static double GetRoot3D(double r0, double r1, double z0, double z1, double z2, double g); + +static double DistancePointEllipse(double e0, double e1, double y0, double y1, double &x0, + double &x1); +static double DistancePointEllipsoid(double e0, double e1, double e2, double y0, double y1, + double y2, double &x0, double &x1, double &x2); + /* ---------------------------------------------------------------------- */ RegEllipsoid::RegEllipsoid(LAMMPS *lmp, int narg, char **arg) : @@ -439,7 +447,7 @@ void RegEllipsoid::variable_check() functions for the 2D case ------------------------------------------------------------------------- */ -double RegEllipsoid::GetRoot2D(double r0, double z0, double z1, double g) +double GetRoot2D(double r0, double z0, double z1, double g) { int maxIterations = std::numeric_limits::digits - std::numeric_limits::min_exponent; @@ -464,8 +472,7 @@ double RegEllipsoid::GetRoot2D(double r0, double z0, double z1, double g) return s; } -double RegEllipsoid::DistancePointEllipse(double e0, double e1, double y0, double y1, double &x0, - double &x1) +double DistancePointEllipse(double e0, double e1, double y0, double y1, double &x0, double &x1) { double distance; if (y1 > 0) { @@ -510,7 +517,7 @@ double RegEllipsoid::DistancePointEllipse(double e0, double e1, double y0, doubl functions for the 3D case ------------------------------------------------------------------------- */ -double RegEllipsoid::GetRoot3D(double r0, double r1, double z0, double z1, double z2, double g) +double GetRoot3D(double r0, double r1, double z0, double z1, double z2, double g) { int maxIterations = std::numeric_limits::digits - std::numeric_limits::min_exponent; @@ -537,8 +544,8 @@ double RegEllipsoid::GetRoot3D(double r0, double r1, double z0, double z1, doubl return s; } -double RegEllipsoid::DistancePointEllipsoid(double e0, double e1, double e2, double y0, double y1, - double y2, double &x0, double &x1, double &x2) +double DistancePointEllipsoid(double e0, double e1, double e2, double y0, double y1, double y2, + double &x0, double &x1, double &x2) { double distance; if (y2 > 0) { diff --git a/src/region_ellipsoid.h b/src/region_ellipsoid.h index 033d30234f..59944f093e 100644 --- a/src/region_ellipsoid.h +++ b/src/region_ellipsoid.h @@ -47,12 +47,6 @@ class RegEllipsoid : public Region { char *astr, *bstr, *cstr; void variable_check(); - - double GetRoot2D(double r0, double z0, double z1, double g); - double GetRoot3D(double r0, double r1, double z0, double z1, double z2, double g); - double DistancePointEllipse(double e0, double e1, double y0, double y1, double &x0, double &x1); - double DistancePointEllipsoid(double e0, double e1, double e2, double y0, double y1, double y2, - double &x0, double &x1, double &x2); }; } // namespace LAMMPS_NS From 92a6200c5511d522fa04a9a5118d99eff325974d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 4 Oct 2023 10:35:24 -0400 Subject: [PATCH 131/219] no need to converge root finding beyond when g reaches 2*epsilon --- src/region_ellipsoid.cpp | 102 +++++++++++++++++++-------------------- 1 file changed, 51 insertions(+), 51 deletions(-) diff --git a/src/region_ellipsoid.cpp b/src/region_ellipsoid.cpp index f5c896644b..daabd621c8 100644 --- a/src/region_ellipsoid.cpp +++ b/src/region_ellipsoid.cpp @@ -33,6 +33,10 @@ static double DistancePointEllipse(double e0, double e1, double y0, double y1, d static double DistancePointEllipsoid(double e0, double e1, double e2, double y0, double y1, double y2, double &x0, double &x1, double &x2); +static constexpr int maxIterations = + std::numeric_limits::digits - std::numeric_limits::min_exponent; +static constexpr double EPSILON = std::numeric_limits::epsilon() * 2.0; + /* ---------------------------------------------------------------------- */ RegEllipsoid::RegEllipsoid(LAMMPS *lmp, int narg, char **arg) : @@ -444,26 +448,24 @@ void RegEllipsoid::variable_check() // ------------------------------------------------------------------ /* ---------------------------------------------------------------------- - functions for the 2D case + static helper functions for the 2D case ------------------------------------------------------------------------- */ double GetRoot2D(double r0, double z0, double z1, double g) { - int maxIterations = - std::numeric_limits::digits - std::numeric_limits::min_exponent; - double n0 = r0 * z0; - double s0 = z1 - 1; - double s1 = (g < 0 ? 0 : sqrt(n0 * n0 + z1 * z1) - 1); - double s = 0; + const double n0 = r0 * z0; + double s0 = z1 - 1.0; + double s1 = (g < 0.0 ? 0.0 : sqrt(n0 * n0 + z1 * z1) - 1.0); + double s = 0.0; for (int i = 0; i < maxIterations; ++i) { - s = (s0 + s1) / 2; + s = (s0 + s1) / 2.0; if (s == s0 || s == s1) { break; } - double ratio0 = n0 / (s + r0); - double ratio1 = z1 / (s + 1); - g = ratio0 * ratio0 + ratio1 * ratio1 - 1; - if (g > 0) { + const double ratio0 = n0 / (s + r0); + const double ratio1 = z1 / (s + 1.0); + g = ratio0 * ratio0 + ratio1 * ratio1 - 1.0; + if ((g > 0.0) && (g > EPSILON)) { s0 = s; - } else if (g < 0) { + } else if ((g < 0.0) && (g < -EPSILON)) { s1 = s; } else { break; @@ -475,24 +477,24 @@ double GetRoot2D(double r0, double z0, double z1, double g) double DistancePointEllipse(double e0, double e1, double y0, double y1, double &x0, double &x1) { double distance; - if (y1 > 0) { - if (y0 > 0) { + if (y1 > 0.0) { + if (y0 > 0.0) { double z0 = y0 / e0; double z1 = y1 / e1; - double g = z0 * z0 + z1 * z1 - 1; - if (g != 0) { + double g = z0 * z0 + z1 * z1 - 1.0; + if (g != 0.0) { double r0 = (e0 * e0) / (e1 * e1); double sbar = GetRoot2D(r0, z0, z1, g); x0 = r0 * y0 / (sbar + r0); - x1 = y1 / (sbar + 1); + x1 = y1 / (sbar + 1.0); distance = sqrt((x0 - y0) * (x0 - y0) + (x1 - y1) * (x1 - y1)); } else { x0 = y0; x1 = y1; - distance = 0; + distance = 0.0; } } else { - x0 = 0; + x0 = 0.0; x1 = e1; distance = fabs(y1 - e1); } @@ -506,7 +508,7 @@ double DistancePointEllipse(double e0, double e1, double y0, double y1, double & distance = sqrt((x0 - y0) * (x0 - y0) + x1 * x1); } else { x0 = e0; - x1 = 0; + x1 = 0.0; distance = fabs(y0 - e0); } } @@ -514,28 +516,26 @@ double DistancePointEllipse(double e0, double e1, double y0, double y1, double & } /* ---------------------------------------------------------------------- - functions for the 3D case + static helper functions for the 3D case ------------------------------------------------------------------------- */ double GetRoot3D(double r0, double r1, double z0, double z1, double z2, double g) { - int maxIterations = - std::numeric_limits::digits - std::numeric_limits::min_exponent; - double n0 = r0 * z0; - double n1 = r1 * z1; - double s0 = z2 - 1; - double s1 = (g < 0 ? 0 : sqrt(n0 * n0 + n1 * n1 + z2 * z2) - 1); - double s = 0; + const double n0 = r0 * z0; + const double n1 = r1 * z1; + double s0 = z2 - 1.0; + double s1 = (g < 0.0 ? 0.0 : sqrt(n0 * n0 + n1 * n1 + z2 * z2) - 1.0); + double s = 0.0; for (int i = 0; i < maxIterations; ++i) { - s = (s0 + s1) / 2; + s = (s0 + s1) / 2.0; if (s == s0 || s == s1) { break; } - double ratio0 = n0 / (s + r0); - double ratio1 = n1 / (s + r1); - double ratio2 = z2 / (s + 1); - g = ratio0 * ratio0 + ratio1 * ratio1 + ratio2 * ratio2 - 1; - if (g > 0) { + const double ratio0 = n0 / (s + r0); + const double ratio1 = n1 / (s + r1); + const double ratio2 = z2 / (s + 1.0); + g = ratio0 * ratio0 + ratio1 * ratio1 + ratio2 * ratio2 - 1.0; + if ((g > 0.0) && (g > EPSILON)) { s0 = s; - } else if (g < 0) { + } else if ((g < 0.0) && (g < -EPSILON)) { s1 = s; } else { break; @@ -548,38 +548,38 @@ double DistancePointEllipsoid(double e0, double e1, double e2, double y0, double double &x0, double &x1, double &x2) { double distance; - if (y2 > 0) { - if (y1 > 0) { - if (y0 > 0) { + if (y2 > 0.0) { + if (y1 > 0.0) { + if (y0 > 0.0) { double z0 = y0 / e0; double z1 = y1 / e1; double z2 = y2 / e2; - double g = z0 * z0 + z1 * z1 + z2 * z2 - 1; - if (g != 0) { + double g = z0 * z0 + z1 * z1 + z2 * z2 - 1.0; + if (g != 0.0) { double r0 = e0 * e0 / (e2 * e2); double r1 = e1 * e1 / (e2 * e2); double sbar = GetRoot3D(r0, r1, z0, z1, z2, g); x0 = r0 * y0 / (sbar + r0); x1 = r1 * y1 / (sbar + r1); - x2 = y2 / (sbar + 1); + x2 = y2 / (sbar + 1.0); distance = sqrt((x0 - y0) * (x0 - y0) + (x1 - y1) * (x1 - y1) + (x2 - y2) * (x2 - y2)); } else { x0 = y0; x1 = y1; x2 = y2; - distance = 0; + distance = 0.0; } } else { - x0 = 0; + x0 = 0.0; distance = DistancePointEllipse(e1, e2, y1, y2, x1, x2); } } else { - if (y0 > 0) { - x1 = 0; + if (y0 > 0.0) { + x1 = 0.0; distance = DistancePointEllipse(e0, e2, y0, y2, x0, x2); } else { - x0 = 0; - x1 = 0; + x0 = 0.0; + x1 = 0.0; x2 = e2; distance = fabs(y2 - e2); } @@ -595,8 +595,8 @@ double DistancePointEllipsoid(double e0, double e1, double e2, double y0, double double xde1 = numer1 / denom1; double xde0sqr = xde0 * xde0; double xde1sqr = xde1 * xde1; - double discr = 1 - xde0sqr - xde1sqr; - if (discr > 0) { + double discr = 1.0 - xde0sqr - xde1sqr; + if (discr > 0.0) { x0 = e0 * xde0; x1 = e1 * xde1; x2 = e2 * sqrt(discr); @@ -605,7 +605,7 @@ double DistancePointEllipsoid(double e0, double e1, double e2, double y0, double } } if (!computed) { - x2 = 0; + x2 = 0.0; distance = DistancePointEllipse(e0, e1, y0, y1, x0, x1); } } From b0deb87188347ee7cb96d2f7cab4d30cc06eb145 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 4 Oct 2023 15:13:22 -0400 Subject: [PATCH 132/219] include Qt version in About dialog --- tools/lammps-gui/lammpsgui.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tools/lammps-gui/lammpsgui.cpp b/tools/lammps-gui/lammpsgui.cpp index b6b590e855..422122775c 100644 --- a/tools/lammps-gui/lammpsgui.cpp +++ b/tools/lammps-gui/lammpsgui.cpp @@ -1185,14 +1185,15 @@ void LammpsGui::view_variables() void LammpsGui::about() { std::string version = "This is LAMMPS-GUI version " LAMMPS_GUI_VERSION; + version += " using Qt version " QT_VERSION_STR "\n"; if (lammps.has_plugin()) { - version += " - LAMMPS library loaded as plugin"; + version += "LAMMPS library loaded as plugin"; if (!plugin_path.empty()) { version += " from file "; version += plugin_path; } } else { - version += " - LAMMPS library linked to executable"; + version += "LAMMPS library linked to executable"; } QString to_clipboard(version.c_str()); From 7d1c5b4106d7afc08eb5494f4d066634a11f3064 Mon Sep 17 00:00:00 2001 From: Germain Clavier Date: Thu, 5 Oct 2023 15:56:51 +0200 Subject: [PATCH 133/219] Updated the manual to explain the new parameter and the physics of the barostat. --- doc/src/fix_press_langevin.rst | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/doc/src/fix_press_langevin.rst b/doc/src/fix_press_langevin.rst index 045194d4db..fc80c80f9d 100644 --- a/doc/src/fix_press_langevin.rst +++ b/doc/src/fix_press_langevin.rst @@ -25,7 +25,7 @@ Syntax Pdamp = pressure damping parameter *flip* value = *yes* or *no* = allow or disallow box flips when it becomes highly skewed *couple* = *none* or *xyz* or *xy* or *yz* or *xz* - *mass* value = Mass of the barostat fictious particle + *friction* value = Friction coefficient for the barostat *temp* values = Tstart, Tstop, seed Tstart, Tstop = target temperature used for the barostat at start/end of run seed = seed of the random number generator @@ -68,7 +68,7 @@ two first terms on the righthand side of the first equation are the virial expression of the canonical pressure. It is to be noted that the temperature used to compute the pressure is not the velocity of the atom but the canonical target temperature directly. This temperature is specified using the *temp* -keyword parameter and should be close to the current target temperature of the +keyword parameter and should be close to the expected target temperature of the system. Regardless of what atoms are in the fix group, a global pressure is @@ -115,9 +115,13 @@ will change. A box dimension will not change if that component is not specified, although you have the option to change that dimension via the :doc:`fix deform ` command. -For all barostat keywords, the *Pdamp* parameter determines the "friction -parameter" :math:`\alpha` of the pseudo particle acting as a barostat. The -relation is such that :math:`\alpha = \frac{Q}{P_{damp}}` where Q is the mass. +The *Pdamp* parameter can be seen in the same way as a Nosé-Hoover parameter as +it is used to compute the mass of the fictitious particle. Without friction, +the barostat can be compared to a single particle Nosé-Hoover barostat and as +such should follow a similar decay in time. As such the mass of the barostat is +also linked to *Pdamp* by the relation +:math:`Q=(N_{at}+1)\cdot{}k_BT_{target}\cdot{}P_{damp}^2`. Note that *Pdamp* +should be expressed in time units. .. note:: @@ -212,16 +216,16 @@ error. ---------- -The *mass* keyword sets the mass parameter :math:`Q` in the -equations of movement of the barostat. All the barostat use the same value. - -.. note:: - - The same recommandation with regard to the bulk modulus of a berendsen - barostat applies to a Langevin barostat mass. It is however important to - note that not only the absolute value used for the mass is important, but - also its ratio with Pdamp values which defines the friction coeffiction - value. +The *friction* keyword sets the friction parameter :math:`\alpha` in the +equations of movement of the barostat. For each barostat, the value of +:math:`\alpha` depends on both *Pdamp* and *friction*. The value given as a +parameter is the Langevin characteristic time :math:`\tau_{L} +=\frac{Q}{\alpha}` in time units. The langevin time can be understood as a +decorrelation time for the pressure. A long langevin time value will make the +barostat act as an underdamped oscillator while a short value will make it +act as an overdamped oscillator. The ideal configuration would be to find +the critical parameter of the barostat. Such a value is empirically found +so that :math:`\tau_{L}\approx{}P_{damp}/2.`. ---------- From ea8d6aaa522140116b01abf5b4ddf8cae75b7d76 Mon Sep 17 00:00:00 2001 From: Germain Clavier Date: Thu, 5 Oct 2023 16:01:03 +0200 Subject: [PATCH 134/219] Version of the code with Pdamp similar to NH barostat and friction input as Langevin caracteristic time. --- src/fix_press_langevin.cpp | 61 +++++++++++++++++++++++++------------- src/fix_press_langevin.h | 7 +++-- 2 files changed, 45 insertions(+), 23 deletions(-) diff --git a/src/fix_press_langevin.cpp b/src/fix_press_langevin.cpp index 2fad9e300f..41ca69f78a 100644 --- a/src/fix_press_langevin.cpp +++ b/src/fix_press_langevin.cpp @@ -65,19 +65,19 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : pre_exchange_flag = 0; flipflag = 1; - // Piston mass - p_mass = 1e-3; + p_ltime = 1000.; + p_fric = 1./p_ltime; // Target temperature t_start = t_stop = t_target = 0.0; for (int i = 0; i < 6; i++) { - // Pressure and pistons period tau_p + // Pressure and pistons period p_start[i] = p_stop[i] = p_period[i] = 0.0; p_flag[i] = 0; - // p_mass[i] = 1e-3; + p_alpha[i] = 0; - p_fric[i] = 0.; + p_mass[i] = 0.; // Pistons coordinates derivative V p_deriv[i] = 0.0; @@ -216,11 +216,11 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : else error->all(FLERR,"Illegal fix press/langevin command"); iarg += 2; - } else if (strcmp(arg[iarg],"mass") == 0) { + } else if (strcmp(arg[iarg],"friction") == 0) { if (iarg+2 > narg) error->all(FLERR,"Illegal fix press/langevin command"); - p_mass = utils::numeric(FLERR,arg[iarg+1],false,lmp); - if (p_mass <= 0.0) + p_ltime = utils::numeric(FLERR,arg[iarg+1],false,lmp); + if (p_ltime < 0.0) error->all(FLERR,"Illegal fix press/langevin command"); iarg += 2; } else if (strcmp(arg[iarg],"dilate") == 0) { @@ -365,10 +365,18 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : // p_fric is alpha coeff from GJF // with alpha = Q/p_period // similar to fix_langevin formalism + double kt = force->boltz * t_start; + double nkt = (atom->natoms + 1) * kt; + if (p_ltime == 0) { + p_fric = 0; + } else { + p_fric = 1./p_ltime; + } for (int i = 0; i < 6; i++) { - // p_mass[i] = p_period[i]; // force->boltz*t_start*(atom->natoms + 1)*p_period[i]*p_period[i]; - gjfa[i] = (1.0 - update->dt / 2.0 / p_period[i]) / (1.0 + update->dt / 2.0 / p_period[i]); - gjfb[i] = 1./(1.0 + update->dt / 2.0 / p_period[i]); + p_mass[i] = nkt*p_period[i]*p_period[i]; + p_alpha[i] = p_mass[i] * p_fric; + gjfa[i] = (1.0 - p_alpha[i]*update->dt / 2.0 / p_mass[i]) / (1.0 + p_alpha[i]*update->dt / 2.0 / p_mass[i]); + gjfb[i] = 1./(1.0 + p_alpha[i]*update->dt / 2.0 / p_mass[i]); } nrigid = 0; @@ -396,6 +404,7 @@ int FixPressLangevin::setmask() { int mask = 0; mask |= INITIAL_INTEGRATE; + mask |= POST_INTEGRATE; mask |= POST_FORCE; mask |= END_OF_STEP; if (pre_exchange_flag) mask |= PRE_EXCHANGE; @@ -444,6 +453,14 @@ void FixPressLangevin::init() for (int i = 0; i < modify->nfix; i++) if (modify->fix[i]->rigid_flag) rfix[nrigid++] = i; } + + // Nullifies piston derivatives and forces so that it is not integrated at + // the start of a second run. + for (int i = 0; i < 6; i++) { + p_deriv[i] = 0.0; + dilation[i] = 0.0; + } + } /* ---------------------------------------------------------------------- @@ -471,8 +488,6 @@ void FixPressLangevin::initial_integrate(int /* vflag */) // Compute new random term on pistons dynamics if (delta != 0.0) delta /= update->endstep - update->beginstep; t_target = t_start + delta * (t_stop-t_start); - // for (int i = 0; i < 6; i++) - // p_mass[i] = force->boltz*t_target*(atom->natoms + 1)*p_period[i]*p_period[i]; couple_beta(t_target); dt = update->dt; @@ -481,17 +496,19 @@ void FixPressLangevin::initial_integrate(int /* vflag */) if (p_flag[i]) { // See equation 13 displacement = dt*p_deriv[i]*gjfb[i]; - displacement += 0.5*dt*dt*f_piston[i]*gjfb[i]/p_mass; - displacement += 0.5*dt*fran[i]*gjfb[i]/p_mass; + displacement += 0.5*dt*dt*f_piston[i]*gjfb[i]/p_mass[i]; + displacement += 0.5*dt*fran[i]*gjfb[i]/p_mass[i]; dl = domain->boxhi[i] - domain->boxlo[i]; if (i < 3) dilation[i] = (dl + displacement)/dl; else dilation[i] = displacement; } } +} +void FixPressLangevin::post_integrate() +{ // remap simulation box and atoms // redo KSpace coeffs since volume has changed - remap(); if (kspace_flag) force->kspace->setup(); @@ -540,8 +557,8 @@ void FixPressLangevin::end_of_step() for (int i = 0; i < 6; i++) { if (p_flag[i]) { p_deriv[i] *= gjfa[i]; - p_deriv[i] += 0.5*dt*(gjfa[i]*f_old_piston[i]+f_piston[i])/p_mass; - p_deriv[i] += fran[i]*gjfb[i]/p_mass; + p_deriv[i] += 0.5*dt*(gjfa[i]*f_old_piston[i]+f_piston[i])/p_mass[i]; + p_deriv[i] += fran[i]*gjfb[i]/p_mass[i]; } } @@ -584,12 +601,14 @@ void FixPressLangevin::couple_pressure() void FixPressLangevin::couple_kinetic(double t_target) { double Pk, volume; + nktv2p = force->nktv2p; // Kinetic part if (dimension == 3) volume = domain->xprd * domain->yprd * domain->zprd; else volume = domain->xprd * domain->yprd; Pk = atom->natoms*force->boltz*t_target/volume; + Pk *= nktv2p; p_current[0] += Pk; p_current[1] += Pk; @@ -604,7 +623,7 @@ void FixPressLangevin::couple_beta(double t_target) int me = comm->me; for (int i=0; i<6; i++) - gamma[i] = sqrt(2.0*p_mass*force->boltz*update->dt/p_period[i]*t_target); + gamma[i] = sqrt(2.0*p_fric*force->boltz*update->dt*t_target); fran[0] = fran[1] = fran[2] = 0.0; fran[3] = fran[4] = fran[5] = 0.0; @@ -810,7 +829,7 @@ int FixPressLangevin::modify_param(int narg, char **arg) void FixPressLangevin::reset_dt() { for (int i=0; i<6; i++) { - gjfa[i] = (1.0 - update->dt / 2.0 / p_period[i]) / (1.0 + update->dt / 2.0 / p_period[i]); - gjfb[i] = sqrt(1.0 + update->dt / 2.0 / p_period[i]); + gjfa[i] = (1.0 - p_alpha[i]*update->dt / 2.0 / p_mass[i]) / (1.0 + p_alpha[i]*update->dt / 2.0 / p_mass[i]); + gjfb[i] = 1./(1.0 + p_alpha[i]*update->dt / 2.0 / p_mass[i]); } } diff --git a/src/fix_press_langevin.h b/src/fix_press_langevin.h index d6ea9df714..7d0b27c834 100644 --- a/src/fix_press_langevin.h +++ b/src/fix_press_langevin.h @@ -33,6 +33,7 @@ class FixPressLangevin : public Fix { void setup(int) override; void pre_exchange() override; void initial_integrate(int) override; + void post_integrate() override; void post_force(int) override; void end_of_step() override; void reset_dt() override; @@ -43,10 +44,12 @@ class FixPressLangevin : public Fix { int pstyle, pcouple, allremap; int p_flag[6]; // 1 if control P on this dim, 0 if not + double nktv2p; double t_start, t_stop, t_target; - double p_mass; + double p_fric, p_ltime; // Friction and Langevin charac. time + double p_alpha[6]; double p_start[6], p_stop[6], p_period[6]; - double p_fric[6], p_target[6], p_current[6]; + double p_mass[6], p_target[6], p_current[6]; double p_deriv[6], dilation[6]; double f_piston[6], f_old_piston[6]; double gjfa[6], gjfb[6], fran[6]; From 127dcd5613a472eefbfda48fdb539bf5ac097ba1 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 5 Oct 2023 13:16:03 -0400 Subject: [PATCH 135/219] fix cut-n-paste error --- src/update.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/update.cpp b/src/update.cpp index 1074d8dcf6..04d3f7e1e6 100644 --- a/src/update.cpp +++ b/src/update.cpp @@ -396,7 +396,7 @@ void Update::new_integrate(char *style, int narg, char **arg, int trysuffix, int void Update::create_minimize(int narg, char **arg, int trysuffix) { - if (narg < 1) error->all(FLERR, "Illegal run_style command"); + if (narg < 1) error->all(FLERR, "Illegal minimize_style command"); delete[] minimize_style; delete minimize; From 3999b3e5571b7c4aa90abe4248d09c989a76d8bc Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 5 Oct 2023 13:22:15 -0400 Subject: [PATCH 136/219] enforce newline before adding run 0 command to avoid syntax errors. --- tools/lammps-gui/lammpsgui.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/lammps-gui/lammpsgui.cpp b/tools/lammps-gui/lammpsgui.cpp index 422122775c..01933c46eb 100644 --- a/tools/lammps-gui/lammpsgui.cpp +++ b/tools/lammps-gui/lammpsgui.cpp @@ -1098,7 +1098,7 @@ void LammpsGui::render_image() cursor.movePosition(QTextCursor::EndOfLine); cursor.movePosition(QTextCursor::Start, QTextCursor::KeepAnchor); auto selection = cursor.selectedText().replace(QChar(0x2029), '\n'); - selection += "run 0 pre yes post no"; + selection += "\nrun 0 pre yes post no"; ui->textEdit->setTextCursor(saved); lammps.command("clear"); lammps.commands_string(selection.toStdString().c_str()); From b38e828c49a755f16afe5b06f28b8101a1050de5 Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Thu, 5 Oct 2023 22:51:48 -0600 Subject: [PATCH 137/219] Prevent segfault with unsupported radial basis --- src/KOKKOS/pair_pace_kokkos.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/KOKKOS/pair_pace_kokkos.cpp b/src/KOKKOS/pair_pace_kokkos.cpp index 56a6656d78..153a6d0333 100644 --- a/src/KOKKOS/pair_pace_kokkos.cpp +++ b/src/KOKKOS/pair_pace_kokkos.cpp @@ -237,6 +237,9 @@ void PairPACEKokkos::copy_splines() ACERadialFunctions* radial_functions = dynamic_cast(basis_set->radial_functions); + if (radial_functions == nullptr) + error->all(FLERR,"Chosen radial basis style not supported by pair style pace/kk"); + for (int i = 0; i < nelements; i++) { for (int j = 0; j < nelements; j++) { k_splines_gk.h_view(i, j) = radial_functions->splines_gk(i, j); From fcc92b50dbc5e0986d7784d6aba8fd71d2248cd5 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 6 Oct 2023 02:46:15 -0400 Subject: [PATCH 138/219] add support for a help flag and print text mode error message for nonexisting file --- tools/lammps-gui/main.cpp | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/tools/lammps-gui/main.cpp b/tools/lammps-gui/main.cpp index bdd3885492..310ccb291f 100644 --- a/tools/lammps-gui/main.cpp +++ b/tools/lammps-gui/main.cpp @@ -14,13 +14,30 @@ #include "lammpsgui.h" #include +#include + +#include +#include int main(int argc, char *argv[]) { QApplication a(argc, argv); const char *infile = nullptr; - if (argc > 1) infile = argv[1]; + if (argc > 1) { + infile = argv[1]; + if ((strcmp(infile, "-help") == 0) || (strcmp(infile, "-h") == 0)) { + printf("This is LAMMPS-GUI version " LAMMPS_GUI_VERSION + " using Qt version " QT_VERSION_STR "\n"); + printf("Usage: %s [-h|-help|]\n", argv[0]); + return 1; + } + if (!QFileInfo::exists(infile)) { + printf("Input file %s does not exist\n", infile); + printf("Usage: %s [-h|-help|]\n", argv[0]); + return 2; + } + } LammpsGui w(nullptr, infile); w.show(); From d388ef762d91766b09564ce1b52a18da3e2df3f3 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 6 Oct 2023 06:42:40 -0400 Subject: [PATCH 139/219] Implement more conventional behavior when opening non-existing file. Instead of only printing a warning we now create a *named* and empty buffer and change to the directory of the filename, so that the file will be created in the desired location as soon as it is saved. --- tools/lammps-gui/lammpsgui.cpp | 15 ++++++++------- tools/lammps-gui/main.cpp | 5 ----- 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/tools/lammps-gui/lammpsgui.cpp b/tools/lammps-gui/lammpsgui.cpp index 01933c46eb..c9d8b9bef0 100644 --- a/tools/lammps-gui/lammpsgui.cpp +++ b/tools/lammps-gui/lammpsgui.cpp @@ -588,22 +588,23 @@ void LammpsGui::open_file(const QString &fileName) if (!file.open(QIODevice::ReadOnly | QFile::Text)) { QMessageBox::warning(this, "Warning", "Cannot open file " + path.absoluteFilePath() + ": " + - file.errorString()); - return; + file.errorString() + ".\nWill create new file on saving editor buffer."); + ui->textEdit->document()->setPlainText(QString()); + } else { + QTextStream in(&file); + QString text = in.readAll(); + ui->textEdit->document()->setPlainText(text); + ui->textEdit->moveCursor(QTextCursor::Start, QTextCursor::MoveAnchor); + file.close(); } setWindowTitle(QString("LAMMPS-GUI - " + current_file)); run_counter = 0; - QTextStream in(&file); - QString text = in.readAll(); - ui->textEdit->document()->setPlainText(text); - ui->textEdit->moveCursor(QTextCursor::Start, QTextCursor::MoveAnchor); ui->textEdit->document()->setModified(false); ui->textEdit->setGroupList(); ui->textEdit->setVarNameList(); ui->textEdit->setComputeIDList(); ui->textEdit->setFixIDList(); ui->textEdit->setFileList(); - file.close(); dirstatus->setText(QString(" Directory: ") + current_dir); status->setText("Ready."); diff --git a/tools/lammps-gui/main.cpp b/tools/lammps-gui/main.cpp index 310ccb291f..cf09fbb892 100644 --- a/tools/lammps-gui/main.cpp +++ b/tools/lammps-gui/main.cpp @@ -32,11 +32,6 @@ int main(int argc, char *argv[]) printf("Usage: %s [-h|-help|]\n", argv[0]); return 1; } - if (!QFileInfo::exists(infile)) { - printf("Input file %s does not exist\n", infile); - printf("Usage: %s [-h|-help|]\n", argv[0]); - return 2; - } } LammpsGui w(nullptr, infile); From f688a28d7f6a36a5d147f421589adc55cb152608 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 6 Oct 2023 12:42:17 -0400 Subject: [PATCH 140/219] update help index table --- tools/lammps-gui/help_index.table | 8 ++------ tools/lammps-gui/update-help-index.sh | 2 ++ 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/tools/lammps-gui/help_index.table b/tools/lammps-gui/help_index.table index d32483760a..5ce4ae6203 100644 --- a/tools/lammps-gui/help_index.table +++ b/tools/lammps-gui/help_index.table @@ -196,6 +196,8 @@ compute_cluster_atom.html compute fragment/atom compute_cna_atom.html compute cna/atom compute_cnp_atom.html compute cnp/atom compute_com_chunk.html compute com/chunk +compute_composition_atom.html compute composition/atom +compute_composition_atom.html compute composition/atom/kk compute_com.html compute com compute_contact_atom.html compute contact/atom compute_coord_atom.html compute coord/atom @@ -242,8 +244,6 @@ compute_ke_atom.html compute ke/atom compute_ke_eff.html compute ke/eff compute_ke_rigid.html compute ke/rigid compute_ke.html compute ke -compute_local_comp_atom.html compute local/comp/atom -compute_local_comp_atom.html compute local/comp/atom/kk compute_mliap.html compute mliap compute_modify.html compute_modify compute_momentum.html compute momentum @@ -409,15 +409,12 @@ dump_netcdf.html dump netcdf/mpiio dump.html dump dump.html dump atom dump.html dump atom/gz -dump.html dump atom/mpiio dump.html dump atom/zstd dump.html dump cfg dump.html dump cfg/gz -dump.html dump cfg/mpiio dump.html dump cfg/zstd dump.html dump custom dump.html dump custom/gz -dump.html dump custom/mpiio dump.html dump custom/zstd dump.html dump dcd dump.html dump grid @@ -428,7 +425,6 @@ dump.html dump local/zstd dump.html dump xtc dump.html dump xyz dump.html dump xyz/gz -dump.html dump xyz/mpiio dump.html dump xyz/zstd dump.html dump yaml dump_vtk.html dump vtk diff --git a/tools/lammps-gui/update-help-index.sh b/tools/lammps-gui/update-help-index.sh index 5bb57c7148..77b924d38d 100755 --- a/tools/lammps-gui/update-help-index.sh +++ b/tools/lammps-gui/update-help-index.sh @@ -1,4 +1,6 @@ #!/bin/sh # this updates the help index table +mv help_index.table help_index.oldtable grep '\.\. index::' ../../doc/src/*.rst | sort | sed -e 's/^.*src\/\([^/]\+\)\.rst:/\1.html /' -e 's/\.\. \+index:: \+//' > help_index.table +cmp help_index.table help_index.oldtable > /dev/null || touch lammpsgui.qrc From dc3b6aa6977775f91ec8db94888e13c1ebd8175b Mon Sep 17 00:00:00 2001 From: Aidan Thompson Date: Fri, 6 Oct 2023 16:47:38 -0600 Subject: [PATCH 141/219] Minor edits, mainly affecting friction keyword --- doc/src/fix_press_langevin.rst | 47 +++++++++++---------- doc/utils/sphinx-config/false_positives.txt | 2 + 2 files changed, 26 insertions(+), 23 deletions(-) diff --git a/doc/src/fix_press_langevin.rst b/doc/src/fix_press_langevin.rst index fc80c80f9d..8438d72192 100644 --- a/doc/src/fix_press_langevin.rst +++ b/doc/src/fix_press_langevin.rst @@ -19,13 +19,13 @@ Syntax keyword = *iso* or *aniso* or *tri* or *x* or *y* or *z* or *xy* or *xz* or *yz* or *couple* or *dilate* or *modulus* or *temp* or *flip* *iso* or *aniso* or *tri* values = Pstart Pstop Pdamp Pstart,Pstop = scalar external pressure at start/end of run (pressure units) - Pdamp = pressure damping parameter + Pdamp = pressure damping parameter (time units) *x* or *y* or *z* or *xy* or *xz* or *yz* values = Pstart Pstop Pdamp Pstart,Pstop = external stress tensor component at start/end of run (pressure units) Pdamp = pressure damping parameter *flip* value = *yes* or *no* = allow or disallow box flips when it becomes highly skewed *couple* = *none* or *xyz* or *xy* or *yz* or *xz* - *friction* value = Friction coefficient for the barostat + *friction* value = Friction coefficient for the barostat (time units) *temp* values = Tstart, Tstop, seed Tstart, Tstop = target temperature used for the barostat at start/end of run seed = seed of the random number generator @@ -42,8 +42,8 @@ Examples Description """"""""""" -Reset the pressure of the system by using a Langevin stochastic barostat -:ref:`(Grønbech) `, which rescales the system volume and +Adjust the pressure of the system by using a Langevin stochastic barostat +:ref:`(Gronbech) `, which rescales the system volume and (optionally) the atoms coordinates within the simulation box every timestep. @@ -64,9 +64,10 @@ Where :math:`dt` is the timestep :math:`\dot{L}` and :math:`\ddot{L}` the first and second derivatives of the coupled direction with regard to time, :math:`\alpha` is a friction coefficient, :math:`\beta` is a random gaussian variable and :math:`Q` the effective mass of the coupled pseudoparticle. The -two first terms on the righthand side of the first equation are the virial +two first terms on the right-hand side of the first equation are the virial expression of the canonical pressure. It is to be noted that the temperature -used to compute the pressure is not the velocity of the atom but the canonical +used to compute the pressure is not based on the atom velocities but rather on +the canonical target temperature directly. This temperature is specified using the *temp* keyword parameter and should be close to the expected target temperature of the system. @@ -82,7 +83,7 @@ unchanged and controlling the pressure of a surrounding fluid. .. note:: Unlike the :doc:`fix npt ` or :doc:`fix nph ` commands which - perform Nose/Hoover barostatting AND time integration, this fix does NOT + perform Nose-Hoover barostatting AND time integration, this fix does NOT perform time integration of the atoms but only of the barostat coupled coordinate. It then only modifies the box size and atom coordinates to effect barostatting. Thus you must use a separate time integration fix, @@ -115,11 +116,11 @@ will change. A box dimension will not change if that component is not specified, although you have the option to change that dimension via the :doc:`fix deform ` command. -The *Pdamp* parameter can be seen in the same way as a Nosé-Hoover parameter as +The *Pdamp* parameter can be seen in the same way as a Nose-Hoover parameter as it is used to compute the mass of the fictitious particle. Without friction, -the barostat can be compared to a single particle Nosé-Hoover barostat and as -such should follow a similar decay in time. As such the mass of the barostat is -also linked to *Pdamp* by the relation +the barostat can be compared to a single particle Nose-Hoover barostat and +should follow a similar decay in time. The mass of the barostat is +linked to *Pdamp* by the relation :math:`Q=(N_{at}+1)\cdot{}k_BT_{target}\cdot{}P_{damp}^2`. Note that *Pdamp* should be expressed in time units. @@ -139,7 +140,7 @@ The *temp* keyword sets the temperature to use in the equation of motion of the barostat. This value is used to compute the value of the force :math:`f_P` in the equation of motion. It is important to note that this value is not the instantaneous temperature but a target temperature that ramps from *Tstart* to -*Tstop*. Also the required argument *seed* also sets the seed for the random +*Tstop*. Also the required argument *seed* sets the seed for the random number generator used in the generation of the random forces. ---------- @@ -217,15 +218,16 @@ error. ---------- The *friction* keyword sets the friction parameter :math:`\alpha` in the -equations of movement of the barostat. For each barostat, the value of +equations of motion of the barostat. For each barostat direction, the value of :math:`\alpha` depends on both *Pdamp* and *friction*. The value given as a -parameter is the Langevin characteristic time :math:`\tau_{L} -=\frac{Q}{\alpha}` in time units. The langevin time can be understood as a -decorrelation time for the pressure. A long langevin time value will make the +parameter is the Langevin characteristic time +:math:`\tau_{L}=\frac{Q}{\alpha}` in time units. The langevin time can be understood as a +decorrelation time for the pressure. A long Langevin time value will make the barostat act as an underdamped oscillator while a short value will make it act as an overdamped oscillator. The ideal configuration would be to find -the critical parameter of the barostat. Such a value is empirically found -so that :math:`\tau_{L}\approx{}P_{damp}/2.`. +the critical parameter of the barostat. Empirically this is observed to +occur for :math:`\tau_{L}\approx{}P_{damp}`. For this reason, if the *friction* +keyword is not used, the default value *Pdamp* is used for each barostat direction. ---------- @@ -270,7 +272,7 @@ This fix can ramp its target pressure and temperature over multiple runs, using the *start* and *stop* keywords of the :doc:`run ` command. See the :doc:`run ` command for details of how to do this. It is recommended that the ramped temperature is the same as the effective temperature of the -thermalised system. That is, if the system's temperature is ramped by other +thermostatted system. That is, if the system's temperature is ramped by other commands, it is recommended to do the same with this pressure control. This fix is not invoked during :doc:`energy minimization `. @@ -290,11 +292,10 @@ Related commands Default """"""" -The keyword defaults are dilate = all and mass = 0.001 in units of mass for -whatever :doc:`units ` defined. +The keyword defaults are *dilate* = all, *flip* = yes, and *friction* = *Pdamp*. ---------- -.. _Grønbech: +.. _Gronbech: -**(Grønbech)** Grønbech-Jensen, Farago, J Chem Phys, 141, 194108 (2014). +**(Gronbech)** Gronbech-Jensen, Farago, J Chem Phys, 141, 194108 (2014). diff --git a/doc/utils/sphinx-config/false_positives.txt b/doc/utils/sphinx-config/false_positives.txt index 8f3486b1a7..75589e3115 100644 --- a/doc/utils/sphinx-config/false_positives.txt +++ b/doc/utils/sphinx-config/false_positives.txt @@ -2892,6 +2892,7 @@ pscrozi pseudocode Pseudocode pseudodynamics +pseudoparticle pseudopotential psllod pSp @@ -3755,6 +3756,7 @@ uncomment uncommented uncompress uncompute +underdamped underprediction undump uniaxial From 090f12e029ee9e3491a7cf64f8654eebd7c8ed1a Mon Sep 17 00:00:00 2001 From: Aidan Thompson Date: Fri, 6 Oct 2023 17:03:41 -0600 Subject: [PATCH 142/219] Minor edits, mainly affecting friction keyword --- src/fix_press_langevin.cpp | 94 +++++++++++++++++++------------------- src/fix_press_langevin.h | 3 +- 2 files changed, 49 insertions(+), 48 deletions(-) diff --git a/src/fix_press_langevin.cpp b/src/fix_press_langevin.cpp index 41ca69f78a..301eb95f6b 100644 --- a/src/fix_press_langevin.cpp +++ b/src/fix_press_langevin.cpp @@ -54,7 +54,7 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : // Langevin barostat applied every step // For details on the equations of motion see: - // Grønbech-Jensen & Farago J. Chem. Phys. 141 194108 (2014) + // Gronbech-Jensen & Farago J. Chem. Phys. 141 194108 (2014) nevery = 1; @@ -65,28 +65,33 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : pre_exchange_flag = 0; flipflag = 1; - p_ltime = 1000.; - p_fric = 1./p_ltime; + p_ltime = 0.0; - // Target temperature + // target temperature + t_start = t_stop = t_target = 0.0; for (int i = 0; i < 6; i++) { - // Pressure and pistons period + + // pressure and pistons period + p_start[i] = p_stop[i] = p_period[i] = 0.0; p_flag[i] = 0; p_alpha[i] = 0; p_mass[i] = 0.; - // Pistons coordinates derivative V + // pistons coordinates derivative V + p_deriv[i] = 0.0; // a and b values for each piston + gjfa[i] = 0.0; gjfb[i] = 0.0; - // Random value for each piston + // random value for each piston + fran[i] = 0.0; f_piston[i] = 0.0; dilation[i] = 0.0; @@ -220,7 +225,7 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : if (iarg+2 > narg) error->all(FLERR,"Illegal fix press/langevin command"); p_ltime = utils::numeric(FLERR,arg[iarg+1],false,lmp); - if (p_ltime < 0.0) + if (p_ltime <= 0.0) error->all(FLERR,"Illegal fix press/langevin command"); iarg += 2; } else if (strcmp(arg[iarg],"dilate") == 0) { @@ -327,7 +332,7 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : else if (pcouple == XYZ || (dimension == 2 && pcouple == XY)) pstyle = ISO; else pstyle = ANISO; - // pre_exchange only required if flips can occur due to shape changes + // pre_exchange only required if flips can occur due to shape changes if (flipflag && (p_flag[3] || p_flag[4] || p_flag[5])) pre_exchange_flag = pre_exchange_migrate = 1; @@ -338,25 +343,12 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : if (pre_exchange_flag) irregular = new Irregular(lmp); else irregular = nullptr; - // C1 // Langevin GJF dynamics does NOT need a temperature compute // This is stated explicitely in their paper. // The temperature used for the pressure is NkT/V on purpose. - // id = fix-ID + temp - // compute group = all since pressure is always global (group all) - // and thus its KE/temperature contribution should use group all - - // id_temp = utils::strdup(std::string(id) + "_temp"); - // modify->add_compute(fmt::format("{} all temp",id_temp)); - // tflag = 1; - - // C2 - // Following C1, the compute must use the virial pressure + // For this reason, the compute must use the virial pressure // Kinetic contribution will be added by the fix style - // create a new compute pressure style - // id = fix-ID + press, compute group = all - // pass id_temp as 4th arg to pressure constructor id_press = utils::strdup(std::string(id) + "_press"); modify->add_compute(fmt::format("{} all pressure NULL virial", id_press)); @@ -365,17 +357,19 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : // p_fric is alpha coeff from GJF // with alpha = Q/p_period // similar to fix_langevin formalism + double kt = force->boltz * t_start; double nkt = (atom->natoms + 1) * kt; - if (p_ltime == 0) { - p_fric = 0; - } else { - p_fric = 1./p_ltime; + for (int i = 0; i < 6; i++) { + if (p_ltime > 0.0) p_fric[i] = p_ltime; + else p_fric[i] = p_period[i]; } + for (int i = 0; i < 6; i++) { p_mass[i] = nkt*p_period[i]*p_period[i]; - p_alpha[i] = p_mass[i] * p_fric; - gjfa[i] = (1.0 - p_alpha[i]*update->dt / 2.0 / p_mass[i]) / (1.0 + p_alpha[i]*update->dt / 2.0 / p_mass[i]); + p_alpha[i] = p_mass[i] * p_fric[i]; + gjfa[i] = (1.0 - p_alpha[i]*update->dt / 2.0 / p_mass[i]) / + (1.0 + p_alpha[i]*update->dt / 2.0 / p_mass[i]); gjfb[i] = 1./(1.0 + p_alpha[i]*update->dt / 2.0 / p_mass[i]); } @@ -431,7 +425,8 @@ void FixPressLangevin::init() pressure = modify->get_compute_by_id(id_press); if (!pressure) - error->all(FLERR, "Pressure compute ID {} for fix press/langevin does not exist", id_press); + error->all(FLERR, "Pressure compute ID {} for fix press/langevin does not exist", + id_press); // Kspace setting @@ -485,7 +480,8 @@ void FixPressLangevin::initial_integrate(int /* vflag */) double displacement; double delta = update->ntimestep - update->beginstep; - // Compute new random term on pistons dynamics + // compute new random term on pistons dynamics + if (delta != 0.0) delta /= update->endstep - update->beginstep; t_target = t_start + delta * (t_stop-t_start); couple_beta(t_target); @@ -509,6 +505,7 @@ void FixPressLangevin::post_integrate() { // remap simulation box and atoms // redo KSpace coeffs since volume has changed + remap(); if (kspace_flag) force->kspace->setup(); @@ -522,7 +519,8 @@ void FixPressLangevin::post_force(int /*vflag*/) double delta = update->ntimestep - update->beginstep; if (delta != 0.0) delta /= update->endstep - update->beginstep; - // Compute current pressure tensor and add kinetic term + // compute current pressure tensor and add kinetic term + if (pstyle == ISO) { pressure->compute_scalar(); } else { @@ -600,19 +598,20 @@ void FixPressLangevin::couple_pressure() void FixPressLangevin::couple_kinetic(double t_target) { - double Pk, volume; + double pk, volume; nktv2p = force->nktv2p; - // Kinetic part + // kinetic part + if (dimension == 3) volume = domain->xprd * domain->yprd * domain->zprd; else volume = domain->xprd * domain->yprd; - Pk = atom->natoms*force->boltz*t_target/volume; - Pk *= nktv2p; + pk = atom->natoms*force->boltz*t_target/volume; + pk *= nktv2p; - p_current[0] += Pk; - p_current[1] += Pk; - if (dimension == 3) p_current[2] += Pk; + p_current[0] += pk; + p_current[1] += pk; + if (dimension == 3) p_current[2] += pk; } /* ---------------------------------------------------------------------- */ @@ -622,8 +621,8 @@ void FixPressLangevin::couple_beta(double t_target) double gamma[6]; int me = comm->me; - for (int i=0; i<6; i++) - gamma[i] = sqrt(2.0*p_fric*force->boltz*update->dt*t_target); + for (int i = 0; i < 6; i++) + gamma[i] = sqrt(2.0*p_fric[i]*force->boltz*update->dt*t_target); fran[0] = fran[1] = fran[2] = 0.0; fran[3] = fran[4] = fran[5] = 0.0; @@ -816,9 +815,11 @@ int FixPressLangevin::modify_param(int narg, char **arg) id_press = utils::strdup(arg[1]); pressure = modify->get_compute_by_id(arg[1]); - if (pressure) error->all(FLERR,"Could not find fix_modify pressure compute ID: {}", arg[1]); + if (pressure) error->all(FLERR, "Could not find fix_modify pressure compute ID: {}", + arg[1]); if (pressure->pressflag == 0) - error->all(FLERR,"Fix_modify pressure compute {} does not compute pressure", arg[1]); + error->all(FLERR, "Fix_modify pressure compute {} does not compute pressure", + arg[1]); return 2; } return 0; @@ -828,8 +829,9 @@ int FixPressLangevin::modify_param(int narg, char **arg) void FixPressLangevin::reset_dt() { - for (int i=0; i<6; i++) { - gjfa[i] = (1.0 - p_alpha[i]*update->dt / 2.0 / p_mass[i]) / (1.0 + p_alpha[i]*update->dt / 2.0 / p_mass[i]); + for (int i = 0; i < 6; i++) { + gjfa[i] = (1.0 - p_alpha[i]*update->dt / 2.0 / p_mass[i]) / + (1.0 + p_alpha[i]*update->dt / 2.0 / p_mass[i]); gjfb[i] = 1./(1.0 + p_alpha[i]*update->dt / 2.0 / p_mass[i]); - } + } } diff --git a/src/fix_press_langevin.h b/src/fix_press_langevin.h index 7d0b27c834..c923efed25 100644 --- a/src/fix_press_langevin.h +++ b/src/fix_press_langevin.h @@ -41,12 +41,11 @@ class FixPressLangevin : public Fix { protected: int dimension, which; - int pstyle, pcouple, allremap; int p_flag[6]; // 1 if control P on this dim, 0 if not double nktv2p; double t_start, t_stop, t_target; - double p_fric, p_ltime; // Friction and Langevin charac. time + double p_fric[6], p_ltime; // Friction and Langevin charac. time double p_alpha[6]; double p_start[6], p_stop[6], p_period[6]; double p_mass[6], p_target[6], p_current[6]; From 578c95fb4277b3f79b58cf0717d4069d29df12dd Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 7 Oct 2023 12:01:13 -0400 Subject: [PATCH 143/219] modernize access to list of fixes and their properties --- src/fix_press_langevin.cpp | 30 +++++++++++++++--------------- src/fix_press_langevin.h | 2 +- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/fix_press_langevin.cpp b/src/fix_press_langevin.cpp index 301eb95f6b..6670caad90 100644 --- a/src/fix_press_langevin.cpp +++ b/src/fix_press_langevin.cpp @@ -411,14 +411,14 @@ void FixPressLangevin::init() { // ensure no conflict with fix deform - for (const auto &ifix : modify->get_fix_list()) - if (strcmp(ifix->style, "^deform") == 0) { - int *dimflag = static_cast(ifix)->dimflag; - if ((p_flag[0] && dimflag[0]) || (p_flag[1] && dimflag[1]) || - (p_flag[2] && dimflag[2]) || (p_flag[3] && dimflag[3]) || - (p_flag[4] && dimflag[4]) || (p_flag[5] && dimflag[5])) - error->all(FLERR,"Cannot use fix press/langevin and " - "fix deform on same component of stress tensor"); + for (const auto &ifix : modify->get_fix_by_style("^deform")) { + int *dimflag = static_cast(ifix)->dimflag; + if (!dimflag) continue; + if ((p_flag[0] && dimflag[0]) || (p_flag[1] && dimflag[1]) || + (p_flag[2] && dimflag[2]) || (p_flag[3] && dimflag[3]) || + (p_flag[4] && dimflag[4]) || (p_flag[5] && dimflag[5])) + error->all(FLERR, + "Cannot use fix press/langevin and fix deform on same component of stress tensor"); } // set pressure ptr @@ -440,13 +440,13 @@ void FixPressLangevin::init() nrigid = 0; rfix = nullptr; - for (int i = 0; i < modify->nfix; i++) - if (modify->fix[i]->rigid_flag) nrigid++; + for (const auto &ifix : modify->get_fix_list()) + if (ifix->rigid_flag) nrigid++; if (nrigid > 0) { - rfix = new int[nrigid]; + rfix = new Fix*[nrigid]; nrigid = 0; - for (int i = 0; i < modify->nfix; i++) - if (modify->fix[i]->rigid_flag) rfix[nrigid++] = i; + for (auto &ifix : modify->get_fix_list()) + if (ifix->rigid_flag) rfix[nrigid++] = ifix; } // Nullifies piston derivatives and forces so that it is not integrated at @@ -678,7 +678,7 @@ void FixPressLangevin::remap() if (nrigid) for (i = 0; i < nrigid; i++) - modify->fix[rfix[i]]->deform(0); + rfix[i]->deform(0); // reset global and local box to new size/shape @@ -719,7 +719,7 @@ void FixPressLangevin::remap() if (nrigid) for (i = 0; i < nrigid; i++) - modify->fix[rfix[i]]->deform(1); + rfix[i]->deform(1); } /* ---------------------------------------------------------------------- diff --git a/src/fix_press_langevin.h b/src/fix_press_langevin.h index c923efed25..20ce76170b 100644 --- a/src/fix_press_langevin.h +++ b/src/fix_press_langevin.h @@ -54,7 +54,7 @@ class FixPressLangevin : public Fix { double gjfa[6], gjfb[6], fran[6]; int kspace_flag; // 1 if KSpace invoked, 0 if not int nrigid; // number of rigid fixes - int *rfix; // indices of rigid fixes + class Fix **rfix; // list of rigid fixes char *id_temp, *id_press; class Compute *temperature, *pressure; From 3b029796454b39d559cebaed2e598f32d313ed6d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 7 Oct 2023 12:01:33 -0400 Subject: [PATCH 144/219] improve error messages --- src/fix_press_langevin.cpp | 83 ++++++++++++++++---------------------- 1 file changed, 34 insertions(+), 49 deletions(-) diff --git a/src/fix_press_langevin.cpp b/src/fix_press_langevin.cpp index 6670caad90..dec3ca7a05 100644 --- a/src/fix_press_langevin.cpp +++ b/src/fix_press_langevin.cpp @@ -50,7 +50,7 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : Fix(lmp, narg, arg), id_press(nullptr), pflag(0), random(nullptr), irregular(nullptr) { - if (narg < 5) error->all(FLERR,"Illegal fix press/langevin command"); + if (narg < 5) utils::missing_cmd_args(FLERR, "fix press/langevin", error); // Langevin barostat applied every step // For details on the equations of motion see: @@ -105,8 +105,7 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : while (iarg < narg) { if (strcmp(arg[iarg],"iso") == 0) { - if (iarg+4 > narg) - error->all(FLERR,"Illegal fix press/langevin command"); + if (iarg+4 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin iso", error); pcouple = XYZ; p_start[0] = p_start[1] = p_start[2] = utils::numeric(FLERR,arg[iarg+1],false,lmp); p_stop[0] = p_stop[1] = p_stop[2] = utils::numeric(FLERR,arg[iarg+2],false,lmp); @@ -118,8 +117,7 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : } iarg += 4; } else if (strcmp(arg[iarg],"aniso") == 0) { - if (iarg+4 > narg) - error->all(FLERR,"Illegal fix press/langevin command"); + if (iarg+4 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin aniso", error); pcouple = NONE; p_start[0] = p_start[1] = p_start[2] = utils::numeric(FLERR,arg[iarg+1],false,lmp); p_stop[0] = p_stop[1] = p_stop[2] = utils::numeric(FLERR,arg[iarg+2],false,lmp); @@ -131,8 +129,7 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : } iarg += 4; } else if (strcmp(arg[iarg],"tri") == 0) { - if (iarg+4 > narg) - error->all(FLERR,"Illegal fix press/langevin command"); + if (iarg+4 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin tri", error); pcouple = NONE; p_start[0] = p_start[1] = p_start[2] = utils::numeric(FLERR,arg[iarg+1],false,lmp); p_stop[0] = p_stop[1] = p_stop[2] = utils::numeric(FLERR,arg[iarg+2],false,lmp); @@ -153,6 +150,7 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : } iarg += 4; } else if (strcmp(arg[iarg],"x") == 0) { + if (iarg+4 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin tri", error); if (iarg+4 > narg) error->all(FLERR,"Illegal fix press/langevin command"); p_start[0] = utils::numeric(FLERR,arg[iarg+1],false,lmp); @@ -161,43 +159,43 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : p_flag[0] = 1; iarg += 4; } else if (strcmp(arg[iarg],"y") == 0) { - if (iarg+4 > narg) - error->all(FLERR,"Illegal fix press/langevin command"); + if (iarg+4 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin y", error); p_start[1] = utils::numeric(FLERR,arg[iarg+1],false,lmp); p_stop[1] = utils::numeric(FLERR,arg[iarg+2],false,lmp); p_period[1] = utils::numeric(FLERR,arg[iarg+3],false,lmp); p_flag[1] = 1; iarg += 4; } else if (strcmp(arg[iarg],"z") == 0) { - if (iarg+4 > narg) - error->all(FLERR,"Illegal fix press/langevin command"); + if (iarg+4 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin z", error); p_start[2] = utils::numeric(FLERR,arg[iarg+1],false,lmp); p_stop[2] = utils::numeric(FLERR,arg[iarg+2],false,lmp); p_period[2] = utils::numeric(FLERR,arg[iarg+3],false,lmp); p_flag[2] = 1; iarg += 4; if (dimension == 2) - error->all(FLERR,"Invalid fix press/langevin for a 2d simulation"); + error->all(FLERR,"Fix press/langevin z option not allowed for a 2d simulation"); } else if (strcmp(arg[iarg],"xy") == 0) { - if (iarg+4 > narg) utils::missing_cmd_args(FLERR, fmt::format("fix {} yz", style), error); + if (iarg+4 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin yz", error); p_start[3] = utils::numeric(FLERR,arg[iarg+1],false,lmp); p_stop[3] = utils::numeric(FLERR,arg[iarg+2],false,lmp); p_period[3] = utils::numeric(FLERR,arg[iarg+3],false,lmp); p_flag[3] = 1; iarg += 4; - if (dimension == 2) error->all(FLERR,"Invalid fix {} command for a 2d simulation", style); + if (dimension == 2) + error->all(FLERR,"Fix press/langevin yz option not allowed for a 2d simulation"); } else if (strcmp(arg[iarg],"xz") == 0) { - if (iarg+4 > narg) utils::missing_cmd_args(FLERR, fmt::format("fix {} xz", style), error); - p_start[4] = utils::numeric(FLERR,arg[iarg+1],false,lmp); + if (iarg+4 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin xz", error); + p_start[4] = utils::numeric(FLERR,arg[iarg+1],false,lmp); p_stop[4] = utils::numeric(FLERR,arg[iarg+2],false,lmp); p_period[4] = utils::numeric(FLERR,arg[iarg+3],false,lmp); p_flag[4] = 1; iarg += 4; - if (dimension == 2) error->all(FLERR,"Invalid fix {} command for a 2d simulation", style); + if (dimension == 2) + error->all(FLERR,"Fix press/langevin zz option not allowed for a 2d simulation"); } else if (strcmp(arg[iarg],"yz") == 0) { - if (iarg+4 > narg) utils::missing_cmd_args(FLERR, fmt::format("fix {} xy", style), error); + if (iarg+4 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin xy", error); p_start[5] = utils::numeric(FLERR,arg[iarg+1],false,lmp); p_stop[5] = utils::numeric(FLERR,arg[iarg+2],false,lmp); p_period[5] = utils::numeric(FLERR,arg[iarg+3],false,lmp); @@ -206,47 +204,41 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : if (dimension == 2) error->all(FLERR,"Invalid fix {} command for a 2d simulation", style); } else if (strcmp(arg[iarg],"flip") == 0) { - if (iarg+2 > narg) utils::missing_cmd_args(FLERR, fmt::format("fix {} flip", style), error); + if (iarg+2 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin flip", error); flipflag = utils::logical(FLERR,arg[iarg+1],false,lmp); iarg += 2; } else if (strcmp(arg[iarg],"couple") == 0) { - if (iarg+2 > narg) - error->all(FLERR,"Illegal fix press/langevin command"); + if (iarg+2 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin couple", error); if (strcmp(arg[iarg+1],"xyz") == 0) pcouple = XYZ; else if (strcmp(arg[iarg+1],"xy") == 0) pcouple = XY; else if (strcmp(arg[iarg+1],"yz") == 0) pcouple = YZ; else if (strcmp(arg[iarg+1],"xz") == 0) pcouple = XZ; else if (strcmp(arg[iarg+1],"none") == 0) pcouple = NONE; - else error->all(FLERR,"Illegal fix press/langevin command"); + else error->all(FLERR,"Unknown fix press/langevin couple option: {}", arg[iarg+1]); iarg += 2; } else if (strcmp(arg[iarg],"friction") == 0) { - if (iarg+2 > narg) - error->all(FLERR,"Illegal fix press/langevin command"); + if (iarg+2 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin friction", error); p_ltime = utils::numeric(FLERR,arg[iarg+1],false,lmp); - if (p_ltime <= 0.0) - error->all(FLERR,"Illegal fix press/langevin command"); + if (p_ltime <= 0.0) error->all(FLERR,"Fix press/langevin friction value must be > 0"); iarg += 2; } else if (strcmp(arg[iarg],"dilate") == 0) { - if (iarg+2 > narg) - error->all(FLERR,"Illegal fix press/langevin command"); + if (iarg+2 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin dilate", error); if (strcmp(arg[iarg+1],"all") == 0) allremap = 1; else if (strcmp(arg[iarg+1],"partial") == 0) allremap = 0; - else error->all(FLERR,"Illegal fix press/langevin command"); + else error->all(FLERR,"Unknown fix press/langevin dilate option: {}", arg[iarg+1]); iarg += 2; } else if (strcmp(arg[iarg], "temp") == 0) { - if (iarg+4 > narg) - error->all(FLERR,"Illegal fix press/langevin command"); + if (iarg+4 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin temp", error); t_start = utils::numeric(FLERR,arg[iarg+1],false,lmp); t_stop = utils::numeric(FLERR,arg[iarg+2],false,lmp); seed = utils::numeric(FLERR,arg[iarg+3],false,lmp); - if (seed <= 0.0) - error->all(FLERR,"Illegal fix press/langevin command"); + if (seed <= 0.0) error->all(FLERR,"Fix press/langevin temp seed must be > 0"); iarg += 4; } - else error->all(FLERR,"Illegal fix press/langevin command"); + else error->all(FLERR,"Unknown fix press/langevin keyword: {}", arg[iarg]); } if (allremap == 0) restart_pbc = 1; @@ -272,14 +264,11 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : error->all(FLERR,"Invalid fix press/langevin pressure settings"); if (p_flag[0] && domain->xperiodic == 0) - error->all(FLERR, - "Cannot use fix press/langevin on a non-periodic dimension"); + error->all(FLERR, "Cannot use fix press/langevin on a non-periodic dimension"); if (p_flag[1] && domain->yperiodic == 0) - error->all(FLERR, - "Cannot use fix press/langevin on a non-periodic dimension"); + error->all(FLERR, "Cannot use fix press/langevin on a non-periodic dimension"); if (p_flag[2] && domain->zperiodic == 0) - error->all(FLERR, - "Cannot use fix press/langevin on a non-periodic dimension"); + error->all(FLERR, "Cannot use fix press/langevin on a non-periodic dimension"); // require periodicity in 2nd dim of off-diagonal tilt component @@ -336,8 +325,7 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : if (flipflag && (p_flag[3] || p_flag[4] || p_flag[5])) pre_exchange_flag = pre_exchange_migrate = 1; - if (flipflag && (domain->yz != 0.0 || domain->xz != 0.0 || - domain->xy != 0.0)) + if (flipflag && (domain->yz != 0.0 || domain->xz != 0.0 || domain->xy != 0.0)) pre_exchange_flag = pre_exchange_migrate = 1; if (pre_exchange_flag) irregular = new Irregular(lmp); @@ -425,8 +413,7 @@ void FixPressLangevin::init() pressure = modify->get_compute_by_id(id_press); if (!pressure) - error->all(FLERR, "Pressure compute ID {} for fix press/langevin does not exist", - id_press); + error->all(FLERR, "Pressure compute ID {} for fix press/langevin does not exist", id_press); // Kspace setting @@ -806,7 +793,7 @@ void FixPressLangevin::pre_exchange() int FixPressLangevin::modify_param(int narg, char **arg) { if (strcmp(arg[0],"press") == 0) { - if (narg < 2) error->all(FLERR,"Illegal fix_modify command"); + if (narg < 2) utils::missing_cmd_args(FLERR,"fix_modify press", error); if (pflag) { modify->delete_compute(id_press); pflag = 0; @@ -815,11 +802,9 @@ int FixPressLangevin::modify_param(int narg, char **arg) id_press = utils::strdup(arg[1]); pressure = modify->get_compute_by_id(arg[1]); - if (pressure) error->all(FLERR, "Could not find fix_modify pressure compute ID: {}", - arg[1]); + if (pressure) error->all(FLERR, "Could not find fix_modify pressure compute ID: {}", arg[1]); if (pressure->pressflag == 0) - error->all(FLERR, "Fix_modify pressure compute {} does not compute pressure", - arg[1]); + error->all(FLERR, "Fix_modify pressure compute {} does not compute pressure", arg[1]); return 2; } return 0; From 5649381f01d517710bb5473f2bdeb5a7a125453b Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 7 Oct 2023 12:03:18 -0400 Subject: [PATCH 145/219] enable and apply clang-format --- src/fix_press_langevin.cpp | 421 +++++++++++++++++++------------------ src/fix_press_langevin.h | 8 +- 2 files changed, 216 insertions(+), 213 deletions(-) diff --git a/src/fix_press_langevin.cpp b/src/fix_press_langevin.cpp index dec3ca7a05..d275799430 100644 --- a/src/fix_press_langevin.cpp +++ b/src/fix_press_langevin.cpp @@ -1,4 +1,3 @@ -// clang-format off /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories @@ -41,14 +40,13 @@ using namespace FixConst; #define DELTAFLIP 0.1 #define TILTMAX 1.5 -enum{NONE,XYZ,XY,YZ,XZ}; -enum{ISO,ANISO,TRICLINIC}; +enum { NONE, XYZ, XY, YZ, XZ }; +enum { ISO, ANISO, TRICLINIC }; /* ---------------------------------------------------------------------- */ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : - Fix(lmp, narg, arg), - id_press(nullptr), pflag(0), random(nullptr), irregular(nullptr) + Fix(lmp, narg, arg), id_press(nullptr), pflag(0), random(nullptr), irregular(nullptr) { if (narg < 5) utils::missing_cmd_args(FLERR, "fix press/langevin", error); @@ -68,11 +66,11 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : p_ltime = 0.0; // target temperature - + t_start = t_stop = t_target = 0.0; for (int i = 0; i < 6; i++) { - + // pressure and pistons period p_start[i] = p_stop[i] = p_period[i] = 0.0; @@ -82,16 +80,16 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : p_mass[i] = 0.; // pistons coordinates derivative V - + p_deriv[i] = 0.0; // a and b values for each piston - + gjfa[i] = 0.0; gjfb[i] = 0.0; // random value for each piston - + fran[i] = 0.0; f_piston[i] = 0.0; dilation[i] = 0.0; @@ -104,41 +102,40 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : int iarg = 3; while (iarg < narg) { - if (strcmp(arg[iarg],"iso") == 0) { - if (iarg+4 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin iso", error); + if (strcmp(arg[iarg], "iso") == 0) { + if (iarg + 4 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin iso", error); pcouple = XYZ; - p_start[0] = p_start[1] = p_start[2] = utils::numeric(FLERR,arg[iarg+1],false,lmp); - p_stop[0] = p_stop[1] = p_stop[2] = utils::numeric(FLERR,arg[iarg+2],false,lmp); - p_period[0] = p_period[1] = p_period[2] = utils::numeric(FLERR,arg[iarg+3],false,lmp); + p_start[0] = p_start[1] = p_start[2] = utils::numeric(FLERR, arg[iarg + 1], false, lmp); + p_stop[0] = p_stop[1] = p_stop[2] = utils::numeric(FLERR, arg[iarg + 2], false, lmp); + p_period[0] = p_period[1] = p_period[2] = utils::numeric(FLERR, arg[iarg + 3], false, lmp); p_flag[0] = p_flag[1] = p_flag[2] = 1; if (dimension == 2) { p_start[2] = p_stop[2] = p_period[2] = 0.0; p_flag[2] = 0; } iarg += 4; - } else if (strcmp(arg[iarg],"aniso") == 0) { - if (iarg+4 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin aniso", error); + } else if (strcmp(arg[iarg], "aniso") == 0) { + if (iarg + 4 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin aniso", error); pcouple = NONE; - p_start[0] = p_start[1] = p_start[2] = utils::numeric(FLERR,arg[iarg+1],false,lmp); - p_stop[0] = p_stop[1] = p_stop[2] = utils::numeric(FLERR,arg[iarg+2],false,lmp); - p_period[0] = p_period[1] = p_period[2] = utils::numeric(FLERR,arg[iarg+3],false,lmp); + p_start[0] = p_start[1] = p_start[2] = utils::numeric(FLERR, arg[iarg + 1], false, lmp); + p_stop[0] = p_stop[1] = p_stop[2] = utils::numeric(FLERR, arg[iarg + 2], false, lmp); + p_period[0] = p_period[1] = p_period[2] = utils::numeric(FLERR, arg[iarg + 3], false, lmp); p_flag[0] = p_flag[1] = p_flag[2] = 1; if (dimension == 2) { p_start[2] = p_stop[2] = p_period[2] = 0.0; p_flag[2] = 0; } iarg += 4; - } else if (strcmp(arg[iarg],"tri") == 0) { - if (iarg+4 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin tri", error); + } else if (strcmp(arg[iarg], "tri") == 0) { + if (iarg + 4 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin tri", error); pcouple = NONE; - p_start[0] = p_start[1] = p_start[2] = utils::numeric(FLERR,arg[iarg+1],false,lmp); - p_stop[0] = p_stop[1] = p_stop[2] = utils::numeric(FLERR,arg[iarg+2],false,lmp); - p_period[0] = p_period[1] = p_period[2] = utils::numeric(FLERR,arg[iarg+3],false,lmp); + p_start[0] = p_start[1] = p_start[2] = utils::numeric(FLERR, arg[iarg + 1], false, lmp); + p_stop[0] = p_stop[1] = p_stop[2] = utils::numeric(FLERR, arg[iarg + 2], false, lmp); + p_period[0] = p_period[1] = p_period[2] = utils::numeric(FLERR, arg[iarg + 3], false, lmp); p_flag[0] = p_flag[1] = p_flag[2] = 1; p_start[3] = p_start[4] = p_start[5] = 0.0; p_stop[3] = p_stop[4] = p_stop[5] = 0.0; - p_period[3] = p_period[4] = p_period[5] = - utils::numeric(FLERR,arg[iarg+3],false,lmp); + p_period[3] = p_period[4] = p_period[5] = utils::numeric(FLERR, arg[iarg + 3], false, lmp); p_flag[3] = p_flag[4] = p_flag[5] = 1; if (dimension == 2) { p_start[2] = p_stop[2] = p_period[2] = 0.0; @@ -149,96 +146,105 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : p_flag[4] = 0; } iarg += 4; - } else if (strcmp(arg[iarg],"x") == 0) { - if (iarg+4 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin tri", error); - if (iarg+4 > narg) - error->all(FLERR,"Illegal fix press/langevin command"); - p_start[0] = utils::numeric(FLERR,arg[iarg+1],false,lmp); - p_stop[0] = utils::numeric(FLERR,arg[iarg+2],false,lmp); - p_period[0] = utils::numeric(FLERR,arg[iarg+3],false,lmp); + } else if (strcmp(arg[iarg], "x") == 0) { + if (iarg + 4 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin tri", error); + if (iarg + 4 > narg) error->all(FLERR, "Illegal fix press/langevin command"); + p_start[0] = utils::numeric(FLERR, arg[iarg + 1], false, lmp); + p_stop[0] = utils::numeric(FLERR, arg[iarg + 2], false, lmp); + p_period[0] = utils::numeric(FLERR, arg[iarg + 3], false, lmp); p_flag[0] = 1; iarg += 4; - } else if (strcmp(arg[iarg],"y") == 0) { - if (iarg+4 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin y", error); - p_start[1] = utils::numeric(FLERR,arg[iarg+1],false,lmp); - p_stop[1] = utils::numeric(FLERR,arg[iarg+2],false,lmp); - p_period[1] = utils::numeric(FLERR,arg[iarg+3],false,lmp); + } else if (strcmp(arg[iarg], "y") == 0) { + if (iarg + 4 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin y", error); + p_start[1] = utils::numeric(FLERR, arg[iarg + 1], false, lmp); + p_stop[1] = utils::numeric(FLERR, arg[iarg + 2], false, lmp); + p_period[1] = utils::numeric(FLERR, arg[iarg + 3], false, lmp); p_flag[1] = 1; iarg += 4; - } else if (strcmp(arg[iarg],"z") == 0) { - if (iarg+4 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin z", error); - p_start[2] = utils::numeric(FLERR,arg[iarg+1],false,lmp); - p_stop[2] = utils::numeric(FLERR,arg[iarg+2],false,lmp); - p_period[2] = utils::numeric(FLERR,arg[iarg+3],false,lmp); + } else if (strcmp(arg[iarg], "z") == 0) { + if (iarg + 4 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin z", error); + p_start[2] = utils::numeric(FLERR, arg[iarg + 1], false, lmp); + p_stop[2] = utils::numeric(FLERR, arg[iarg + 2], false, lmp); + p_period[2] = utils::numeric(FLERR, arg[iarg + 3], false, lmp); p_flag[2] = 1; iarg += 4; if (dimension == 2) - error->all(FLERR,"Fix press/langevin z option not allowed for a 2d simulation"); - } else if (strcmp(arg[iarg],"xy") == 0) { - if (iarg+4 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin yz", error); - p_start[3] = utils::numeric(FLERR,arg[iarg+1],false,lmp); - p_stop[3] = utils::numeric(FLERR,arg[iarg+2],false,lmp); - p_period[3] = utils::numeric(FLERR,arg[iarg+3],false,lmp); + error->all(FLERR, "Fix press/langevin z option not allowed for a 2d simulation"); + } else if (strcmp(arg[iarg], "xy") == 0) { + if (iarg + 4 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin yz", error); + p_start[3] = utils::numeric(FLERR, arg[iarg + 1], false, lmp); + p_stop[3] = utils::numeric(FLERR, arg[iarg + 2], false, lmp); + p_period[3] = utils::numeric(FLERR, arg[iarg + 3], false, lmp); p_flag[3] = 1; iarg += 4; if (dimension == 2) - error->all(FLERR,"Fix press/langevin yz option not allowed for a 2d simulation"); + error->all(FLERR, "Fix press/langevin yz option not allowed for a 2d simulation"); - } else if (strcmp(arg[iarg],"xz") == 0) { - if (iarg+4 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin xz", error); - p_start[4] = utils::numeric(FLERR,arg[iarg+1],false,lmp); - p_stop[4] = utils::numeric(FLERR,arg[iarg+2],false,lmp); - p_period[4] = utils::numeric(FLERR,arg[iarg+3],false,lmp); + } else if (strcmp(arg[iarg], "xz") == 0) { + if (iarg + 4 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin xz", error); + p_start[4] = utils::numeric(FLERR, arg[iarg + 1], false, lmp); + p_stop[4] = utils::numeric(FLERR, arg[iarg + 2], false, lmp); + p_period[4] = utils::numeric(FLERR, arg[iarg + 3], false, lmp); p_flag[4] = 1; iarg += 4; if (dimension == 2) - error->all(FLERR,"Fix press/langevin zz option not allowed for a 2d simulation"); + error->all(FLERR, "Fix press/langevin zz option not allowed for a 2d simulation"); - } else if (strcmp(arg[iarg],"yz") == 0) { - if (iarg+4 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin xy", error); - p_start[5] = utils::numeric(FLERR,arg[iarg+1],false,lmp); - p_stop[5] = utils::numeric(FLERR,arg[iarg+2],false,lmp); - p_period[5] = utils::numeric(FLERR,arg[iarg+3],false,lmp); + } else if (strcmp(arg[iarg], "yz") == 0) { + if (iarg + 4 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin xy", error); + p_start[5] = utils::numeric(FLERR, arg[iarg + 1], false, lmp); + p_stop[5] = utils::numeric(FLERR, arg[iarg + 2], false, lmp); + p_period[5] = utils::numeric(FLERR, arg[iarg + 3], false, lmp); p_flag[5] = 1; iarg += 4; - if (dimension == 2) error->all(FLERR,"Invalid fix {} command for a 2d simulation", style); + if (dimension == 2) error->all(FLERR, "Invalid fix {} command for a 2d simulation", style); - } else if (strcmp(arg[iarg],"flip") == 0) { - if (iarg+2 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin flip", error); - flipflag = utils::logical(FLERR,arg[iarg+1],false,lmp); + } else if (strcmp(arg[iarg], "flip") == 0) { + if (iarg + 2 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin flip", error); + flipflag = utils::logical(FLERR, arg[iarg + 1], false, lmp); iarg += 2; - } else if (strcmp(arg[iarg],"couple") == 0) { - if (iarg+2 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin couple", error); - if (strcmp(arg[iarg+1],"xyz") == 0) pcouple = XYZ; - else if (strcmp(arg[iarg+1],"xy") == 0) pcouple = XY; - else if (strcmp(arg[iarg+1],"yz") == 0) pcouple = YZ; - else if (strcmp(arg[iarg+1],"xz") == 0) pcouple = XZ; - else if (strcmp(arg[iarg+1],"none") == 0) pcouple = NONE; - else error->all(FLERR,"Unknown fix press/langevin couple option: {}", arg[iarg+1]); + } else if (strcmp(arg[iarg], "couple") == 0) { + if (iarg + 2 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin couple", error); + if (strcmp(arg[iarg + 1], "xyz") == 0) + pcouple = XYZ; + else if (strcmp(arg[iarg + 1], "xy") == 0) + pcouple = XY; + else if (strcmp(arg[iarg + 1], "yz") == 0) + pcouple = YZ; + else if (strcmp(arg[iarg + 1], "xz") == 0) + pcouple = XZ; + else if (strcmp(arg[iarg + 1], "none") == 0) + pcouple = NONE; + else + error->all(FLERR, "Unknown fix press/langevin couple option: {}", arg[iarg + 1]); iarg += 2; - } else if (strcmp(arg[iarg],"friction") == 0) { - if (iarg+2 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin friction", error); - p_ltime = utils::numeric(FLERR,arg[iarg+1],false,lmp); - if (p_ltime <= 0.0) error->all(FLERR,"Fix press/langevin friction value must be > 0"); + } else if (strcmp(arg[iarg], "friction") == 0) { + if (iarg + 2 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin friction", error); + p_ltime = utils::numeric(FLERR, arg[iarg + 1], false, lmp); + if (p_ltime <= 0.0) error->all(FLERR, "Fix press/langevin friction value must be > 0"); iarg += 2; - } else if (strcmp(arg[iarg],"dilate") == 0) { - if (iarg+2 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin dilate", error); - if (strcmp(arg[iarg+1],"all") == 0) allremap = 1; - else if (strcmp(arg[iarg+1],"partial") == 0) allremap = 0; - else error->all(FLERR,"Unknown fix press/langevin dilate option: {}", arg[iarg+1]); + } else if (strcmp(arg[iarg], "dilate") == 0) { + if (iarg + 2 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin dilate", error); + if (strcmp(arg[iarg + 1], "all") == 0) + allremap = 1; + else if (strcmp(arg[iarg + 1], "partial") == 0) + allremap = 0; + else + error->all(FLERR, "Unknown fix press/langevin dilate option: {}", arg[iarg + 1]); iarg += 2; } else if (strcmp(arg[iarg], "temp") == 0) { - if (iarg+4 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin temp", error); - t_start = utils::numeric(FLERR,arg[iarg+1],false,lmp); - t_stop = utils::numeric(FLERR,arg[iarg+2],false,lmp); - seed = utils::numeric(FLERR,arg[iarg+3],false,lmp); - if (seed <= 0.0) error->all(FLERR,"Fix press/langevin temp seed must be > 0"); + if (iarg + 4 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin temp", error); + t_start = utils::numeric(FLERR, arg[iarg + 1], false, lmp); + t_stop = utils::numeric(FLERR, arg[iarg + 2], false, lmp); + seed = utils::numeric(FLERR, arg[iarg + 3], false, lmp); + if (seed <= 0.0) error->all(FLERR, "Fix press/langevin temp seed must be > 0"); iarg += 4; } - else error->all(FLERR,"Unknown fix press/langevin keyword: {}", arg[iarg]); + else + error->all(FLERR, "Unknown fix press/langevin keyword: {}", arg[iarg]); } if (allremap == 0) restart_pbc = 1; @@ -248,20 +254,20 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : // error checks if (dimension == 2 && p_flag[2]) - error->all(FLERR,"Invalid fix press/langevin for a 2d simulation"); + error->all(FLERR, "Invalid fix press/langevin for a 2d simulation"); if (dimension == 2 && (pcouple == YZ || pcouple == XZ)) - error->all(FLERR,"Invalid fix press/langevin for a 2d simulation"); + error->all(FLERR, "Invalid fix press/langevin for a 2d simulation"); if (pcouple == XYZ && (p_flag[0] == 0 || p_flag[1] == 0)) - error->all(FLERR,"Invalid fix press/langevin pressure settings"); + error->all(FLERR, "Invalid fix press/langevin pressure settings"); if (pcouple == XYZ && dimension == 3 && p_flag[2] == 0) - error->all(FLERR,"Invalid fix press/langevin pressure settings"); + error->all(FLERR, "Invalid fix press/langevin pressure settings"); if (pcouple == XY && (p_flag[0] == 0 || p_flag[1] == 0)) - error->all(FLERR,"Invalid fix press/langevin pressure settings"); + error->all(FLERR, "Invalid fix press/langevin pressure settings"); if (pcouple == YZ && (p_flag[1] == 0 || p_flag[2] == 0)) - error->all(FLERR,"Invalid fix press/langevin pressure settings"); + error->all(FLERR, "Invalid fix press/langevin pressure settings"); if (pcouple == XZ && (p_flag[0] == 0 || p_flag[2] == 0)) - error->all(FLERR,"Invalid fix press/langevin pressure settings"); + error->all(FLERR, "Invalid fix press/langevin pressure settings"); if (p_flag[0] && domain->xperiodic == 0) error->all(FLERR, "Cannot use fix press/langevin on a non-periodic dimension"); @@ -279,47 +285,42 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : if (p_flag[5] && domain->yperiodic == 0) error->all(FLERR, "Cannot use fix {} on a 2nd non-periodic dimension", style); if (!domain->triclinic && (p_flag[3] || p_flag[4] || p_flag[5])) - error->all(FLERR,"Can not specify Pxy/Pxz/Pyz in fix {} with non-triclinic box", style); + error->all(FLERR, "Can not specify Pxy/Pxz/Pyz in fix {} with non-triclinic box", style); if (pcouple == XYZ && dimension == 3 && - (p_start[0] != p_start[1] || p_start[0] != p_start[2] || - p_stop[0] != p_stop[1] || p_stop[0] != p_stop[2] || - p_period[0] != p_period[1] || p_period[0] != p_period[2])) - error->all(FLERR,"Invalid fix press/langevin pressure settings"); + (p_start[0] != p_start[1] || p_start[0] != p_start[2] || p_stop[0] != p_stop[1] || + p_stop[0] != p_stop[2] || p_period[0] != p_period[1] || p_period[0] != p_period[2])) + error->all(FLERR, "Invalid fix press/langevin pressure settings"); if (pcouple == XYZ && dimension == 2 && - (p_start[0] != p_start[1] || p_stop[0] != p_stop[1] || - p_period[0] != p_period[1])) - error->all(FLERR,"Invalid fix press/langevin pressure settings"); + (p_start[0] != p_start[1] || p_stop[0] != p_stop[1] || p_period[0] != p_period[1])) + error->all(FLERR, "Invalid fix press/langevin pressure settings"); if (pcouple == XY && - (p_start[0] != p_start[1] || p_stop[0] != p_stop[1] || - p_period[0] != p_period[1])) - error->all(FLERR,"Invalid fix press/langevin pressure settings"); + (p_start[0] != p_start[1] || p_stop[0] != p_stop[1] || p_period[0] != p_period[1])) + error->all(FLERR, "Invalid fix press/langevin pressure settings"); if (pcouple == YZ && - (p_start[1] != p_start[2] || p_stop[1] != p_stop[2] || - p_period[1] != p_period[2])) - error->all(FLERR,"Invalid fix press/langevin pressure settings"); + (p_start[1] != p_start[2] || p_stop[1] != p_stop[2] || p_period[1] != p_period[2])) + error->all(FLERR, "Invalid fix press/langevin pressure settings"); if (pcouple == XZ && - (p_start[0] != p_start[2] || p_stop[0] != p_stop[2] || - p_period[0] != p_period[2])) - error->all(FLERR,"Invalid fix press/langevin pressure settings"); + (p_start[0] != p_start[2] || p_stop[0] != p_stop[2] || p_period[0] != p_period[2])) + error->all(FLERR, "Invalid fix press/langevin pressure settings"); if (t_start < 0.0 || t_stop < 0.0) - error->all(FLERR,"Fix press/langevin temperature parameters must be >= 0.0"); + error->all(FLERR, "Fix press/langevin temperature parameters must be >= 0.0"); - if ((p_flag[0] && p_period[0] <= 0.0) || - (p_flag[1] && p_period[1] <= 0.0) || - (p_flag[2] && p_period[2] <= 0.0) || - (p_flag[3] && p_period[3] <= 0.0) || - (p_flag[4] && p_period[4] <= 0.0) || - (p_flag[5] && p_period[5] <= 0.0)) - error->all(FLERR,"Fix press/langevin damping parameters must be > 0.0"); + if ((p_flag[0] && p_period[0] <= 0.0) || (p_flag[1] && p_period[1] <= 0.0) || + (p_flag[2] && p_period[2] <= 0.0) || (p_flag[3] && p_period[3] <= 0.0) || + (p_flag[4] && p_period[4] <= 0.0) || (p_flag[5] && p_period[5] <= 0.0)) + error->all(FLERR, "Fix press/langevin damping parameters must be > 0.0"); // pstyle = ISO if XYZ coupling or XY coupling in 2d -> 1 dof // else pstyle = ANISO -> 3 dof - if (p_flag[3] || p_flag[4] || p_flag[5]) pstyle = TRICLINIC; - else if (pcouple == XYZ || (dimension == 2 && pcouple == XY)) pstyle = ISO; - else pstyle = ANISO; + if (p_flag[3] || p_flag[4] || p_flag[5]) + pstyle = TRICLINIC; + else if (pcouple == XYZ || (dimension == 2 && pcouple == XY)) + pstyle = ISO; + else + pstyle = ANISO; // pre_exchange only required if flips can occur due to shape changes @@ -328,8 +329,10 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : if (flipflag && (domain->yz != 0.0 || domain->xz != 0.0 || domain->xy != 0.0)) pre_exchange_flag = pre_exchange_migrate = 1; - if (pre_exchange_flag) irregular = new Irregular(lmp); - else irregular = nullptr; + if (pre_exchange_flag) + irregular = new Irregular(lmp); + else + irregular = nullptr; // Langevin GJF dynamics does NOT need a temperature compute // This is stated explicitely in their paper. @@ -349,16 +352,18 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : double kt = force->boltz * t_start; double nkt = (atom->natoms + 1) * kt; for (int i = 0; i < 6; i++) { - if (p_ltime > 0.0) p_fric[i] = p_ltime; - else p_fric[i] = p_period[i]; + if (p_ltime > 0.0) + p_fric[i] = p_ltime; + else + p_fric[i] = p_period[i]; } for (int i = 0; i < 6; i++) { - p_mass[i] = nkt*p_period[i]*p_period[i]; + p_mass[i] = nkt * p_period[i] * p_period[i]; p_alpha[i] = p_mass[i] * p_fric[i]; - gjfa[i] = (1.0 - p_alpha[i]*update->dt / 2.0 / p_mass[i]) / - (1.0 + p_alpha[i]*update->dt / 2.0 / p_mass[i]); - gjfb[i] = 1./(1.0 + p_alpha[i]*update->dt / 2.0 / p_mass[i]); + gjfa[i] = (1.0 - p_alpha[i] * update->dt / 2.0 / p_mass[i]) / + (1.0 + p_alpha[i] * update->dt / 2.0 / p_mass[i]); + gjfb[i] = 1. / (1.0 + p_alpha[i] * update->dt / 2.0 / p_mass[i]); } nrigid = 0; @@ -373,7 +378,6 @@ FixPressLangevin::~FixPressLangevin() delete[] rfix; delete irregular; - // delete temperature and pressure if fix created them if (pflag) modify->delete_compute(id_press); @@ -402,12 +406,11 @@ void FixPressLangevin::init() for (const auto &ifix : modify->get_fix_by_style("^deform")) { int *dimflag = static_cast(ifix)->dimflag; if (!dimflag) continue; - if ((p_flag[0] && dimflag[0]) || (p_flag[1] && dimflag[1]) || - (p_flag[2] && dimflag[2]) || (p_flag[3] && dimflag[3]) || - (p_flag[4] && dimflag[4]) || (p_flag[5] && dimflag[5])) + if ((p_flag[0] && dimflag[0]) || (p_flag[1] && dimflag[1]) || (p_flag[2] && dimflag[2]) || + (p_flag[3] && dimflag[3]) || (p_flag[4] && dimflag[4]) || (p_flag[5] && dimflag[5])) error->all(FLERR, "Cannot use fix press/langevin and fix deform on same component of stress tensor"); - } + } // set pressure ptr @@ -417,8 +420,10 @@ void FixPressLangevin::init() // Kspace setting - if (force->kspace) kspace_flag = 1; - else kspace_flag = 0; + if (force->kspace) + kspace_flag = 1; + else + kspace_flag = 0; // detect if any rigid fixes exist so rigid bodies move when box is remapped // rfix[] = indices to each fix rigid @@ -430,7 +435,7 @@ void FixPressLangevin::init() for (const auto &ifix : modify->get_fix_list()) if (ifix->rigid_flag) nrigid++; if (nrigid > 0) { - rfix = new Fix*[nrigid]; + rfix = new Fix *[nrigid]; nrigid = 0; for (auto &ifix : modify->get_fix_list()) if (ifix->rigid_flag) rfix[nrigid++] = ifix; @@ -442,7 +447,6 @@ void FixPressLangevin::init() p_deriv[i] = 0.0; dilation[i] = 0.0; } - } /* ---------------------------------------------------------------------- @@ -453,7 +457,7 @@ void FixPressLangevin::setup(int /*vflag*/) { // trigger virial computation on next timestep - pressure->addstep(update->ntimestep+1); + pressure->addstep(update->ntimestep + 1); } /* ---------------------------------------------------------------------- */ @@ -470,7 +474,7 @@ void FixPressLangevin::initial_integrate(int /* vflag */) // compute new random term on pistons dynamics if (delta != 0.0) delta /= update->endstep - update->beginstep; - t_target = t_start + delta * (t_stop-t_start); + t_target = t_start + delta * (t_stop - t_start); couple_beta(t_target); dt = update->dt; @@ -478,12 +482,14 @@ void FixPressLangevin::initial_integrate(int /* vflag */) for (int i = 0; i < 6; i++) { if (p_flag[i]) { // See equation 13 - displacement = dt*p_deriv[i]*gjfb[i]; - displacement += 0.5*dt*dt*f_piston[i]*gjfb[i]/p_mass[i]; - displacement += 0.5*dt*fran[i]*gjfb[i]/p_mass[i]; + displacement = dt * p_deriv[i] * gjfb[i]; + displacement += 0.5 * dt * dt * f_piston[i] * gjfb[i] / p_mass[i]; + displacement += 0.5 * dt * fran[i] * gjfb[i] / p_mass[i]; dl = domain->boxhi[i] - domain->boxlo[i]; - if (i < 3) dilation[i] = (dl + displacement)/dl; - else dilation[i] = displacement; + if (i < 3) + dilation[i] = (dl + displacement) / dl; + else + dilation[i] = displacement; } } } @@ -495,7 +501,6 @@ void FixPressLangevin::post_integrate() remap(); if (kspace_flag) force->kspace->setup(); - } /* ---------------------------------------------------------------------- */ @@ -507,7 +512,7 @@ void FixPressLangevin::post_force(int /*vflag*/) if (delta != 0.0) delta /= update->endstep - update->beginstep; // compute current pressure tensor and add kinetic term - + if (pstyle == ISO) { pressure->compute_scalar(); } else { @@ -520,14 +525,14 @@ void FixPressLangevin::post_force(int /*vflag*/) for (int i = 0; i < 6; i++) { if (p_flag[i]) { f_old_piston[i] = f_piston[i]; - p_target[i] = p_start[i] + delta * (p_stop[i]-p_start[i]); + p_target[i] = p_start[i] + delta * (p_stop[i] - p_start[i]); f_piston[i] = p_current[i] - p_target[i]; } } // trigger virial computation on next timestep - pressure->addstep(update->ntimestep+1); + pressure->addstep(update->ntimestep + 1); } /* ---------------------------------------------------------------------- */ @@ -542,11 +547,10 @@ void FixPressLangevin::end_of_step() for (int i = 0; i < 6; i++) { if (p_flag[i]) { p_deriv[i] *= gjfa[i]; - p_deriv[i] += 0.5*dt*(gjfa[i]*f_old_piston[i]+f_piston[i])/p_mass[i]; - p_deriv[i] += fran[i]*gjfb[i]/p_mass[i]; + p_deriv[i] += 0.5 * dt * (gjfa[i] * f_old_piston[i] + f_piston[i]) / p_mass[i]; + p_deriv[i] += fran[i] * gjfb[i] / p_mass[i]; } } - } /* ---------------------------------------------------------------------- */ @@ -558,7 +562,7 @@ void FixPressLangevin::couple_pressure() if (pstyle == ISO) p_current[0] = p_current[1] = p_current[2] = pressure->scalar; else if (pcouple == XYZ) { - double ave = 1.0/3.0 * (tensor[0] + tensor[1] + tensor[2]); + double ave = 1.0 / 3.0 * (tensor[0] + tensor[1] + tensor[2]); p_current[0] = p_current[1] = p_current[2] = ave; } else if (pcouple == XY) { double ave = 0.5 * (tensor[0] + tensor[1]); @@ -577,9 +581,9 @@ void FixPressLangevin::couple_pressure() p_current[1] = tensor[1]; p_current[2] = tensor[2]; } - p_current[3] = tensor[3]; - p_current[4] = tensor[4]; - p_current[5] = tensor[5]; + p_current[3] = tensor[3]; + p_current[4] = tensor[4]; + p_current[5] = tensor[5]; } /* ---------------------------------------------------------------------- */ @@ -589,11 +593,13 @@ void FixPressLangevin::couple_kinetic(double t_target) nktv2p = force->nktv2p; // kinetic part - - if (dimension == 3) volume = domain->xprd * domain->yprd * domain->zprd; - else volume = domain->xprd * domain->yprd; - pk = atom->natoms*force->boltz*t_target/volume; + if (dimension == 3) + volume = domain->xprd * domain->yprd * domain->zprd; + else + volume = domain->xprd * domain->yprd; + + pk = atom->natoms * force->boltz * t_target / volume; pk *= nktv2p; p_current[0] += pk; @@ -609,32 +615,32 @@ void FixPressLangevin::couple_beta(double t_target) int me = comm->me; for (int i = 0; i < 6; i++) - gamma[i] = sqrt(2.0*p_fric[i]*force->boltz*update->dt*t_target); + gamma[i] = sqrt(2.0 * p_fric[i] * force->boltz * update->dt * t_target); fran[0] = fran[1] = fran[2] = 0.0; fran[3] = fran[4] = fran[5] = 0.0; if (me == 0) { if (pstyle == ISO) - fran[0] = fran[1] = fran[2] = gamma[0]*random->gaussian(); + fran[0] = fran[1] = fran[2] = gamma[0] * random->gaussian(); else if (pcouple == XYZ) { - fran[0] = fran[1] = fran[2] = gamma[0]*random->gaussian(); + fran[0] = fran[1] = fran[2] = gamma[0] * random->gaussian(); } else if (pcouple == XY) { - fran[0] = fran[1] = gamma[0]*random->gaussian(); - fran[2] = gamma[2]*random->gaussian(); + fran[0] = fran[1] = gamma[0] * random->gaussian(); + fran[2] = gamma[2] * random->gaussian(); } else if (pcouple == YZ) { - fran[1] = fran[2] = gamma[1]*random->gaussian(); - fran[0] = gamma[0]*random->gaussian(); + fran[1] = fran[2] = gamma[1] * random->gaussian(); + fran[0] = gamma[0] * random->gaussian(); } else if (pcouple == XZ) { - fran[0] = fran[2] = gamma[0]*random->gaussian(); - fran[1] = gamma[1]*random->gaussian(); + fran[0] = fran[2] = gamma[0] * random->gaussian(); + fran[1] = gamma[1] * random->gaussian(); } else { - fran[0] = gamma[0]*random->gaussian(); - fran[1] = gamma[1]*random->gaussian(); - fran[2] = gamma[2]*random->gaussian(); + fran[0] = gamma[0] * random->gaussian(); + fran[1] = gamma[1] * random->gaussian(); + fran[2] = gamma[2] * random->gaussian(); } - fran[3] = gamma[3]*random->gaussian(); - fran[4] = gamma[4]*random->gaussian(); - fran[5] = gamma[5]*random->gaussian(); + fran[3] = gamma[3] * random->gaussian(); + fran[4] = gamma[4] * random->gaussian(); + fran[5] = gamma[5] * random->gaussian(); } MPI_Bcast(&fran, 6, MPI_DOUBLE, 0, world); } @@ -648,7 +654,7 @@ void FixPressLangevin::couple_beta(double t_target) void FixPressLangevin::remap() { int i; - double oldlo,oldhi,ctr; + double oldlo, oldhi, ctr; double **x = atom->x; int *mask = atom->mask; @@ -656,16 +662,15 @@ void FixPressLangevin::remap() // convert pertinent atoms and rigid bodies to lamda coords - if (allremap) domain->x2lamda(nlocal); + if (allremap) + domain->x2lamda(nlocal); else { for (i = 0; i < nlocal; i++) - if (mask[i] & groupbit) - domain->x2lamda(x[i],x[i]); + if (mask[i] & groupbit) domain->x2lamda(x[i], x[i]); } if (nrigid) - for (i = 0; i < nrigid; i++) - rfix[i]->deform(0); + for (i = 0; i < nrigid; i++) rfix[i]->deform(0); // reset global and local box to new size/shape @@ -674,8 +679,8 @@ void FixPressLangevin::remap() oldlo = domain->boxlo[i]; oldhi = domain->boxhi[i]; ctr = 0.5 * (oldlo + oldhi); - domain->boxlo[i] = (oldlo-ctr)*dilation[i] + ctr; - domain->boxhi[i] = (oldhi-ctr)*dilation[i] + ctr; + domain->boxlo[i] = (oldlo - ctr) * dilation[i] + ctr; + domain->boxhi[i] = (oldhi - ctr) * dilation[i] + ctr; } } @@ -683,30 +688,28 @@ void FixPressLangevin::remap() if (p_flag[4]) domain->xz += dilation[4]; if (p_flag[5]) domain->yz += dilation[5]; - if (domain->yz < -TILTMAX*domain->yprd || - domain->yz > TILTMAX*domain->yprd || - domain->xz < -TILTMAX*domain->xprd || - domain->xz > TILTMAX*domain->xprd || - domain->xy < -TILTMAX*domain->xprd || - domain->xy > TILTMAX*domain->xprd) - error->all(FLERR,"Fix {} has tilted box too far in one step - " - "periodic cell is too far from equilibrium state", style); + if (domain->yz < -TILTMAX * domain->yprd || domain->yz > TILTMAX * domain->yprd || + domain->xz < -TILTMAX * domain->xprd || domain->xz > TILTMAX * domain->xprd || + domain->xy < -TILTMAX * domain->xprd || domain->xy > TILTMAX * domain->xprd) + error->all(FLERR, + "Fix {} has tilted box too far in one step - " + "periodic cell is too far from equilibrium state", + style); domain->set_global_box(); domain->set_local_box(); // convert pertinent atoms and rigid bodies back to box coords - if (allremap) domain->lamda2x(nlocal); + if (allremap) + domain->lamda2x(nlocal); else { for (i = 0; i < nlocal; i++) - if (mask[i] & groupbit) - domain->lamda2x(x[i],x[i]); + if (mask[i] & groupbit) domain->lamda2x(x[i], x[i]); } if (nrigid) - for (i = 0; i < nrigid; i++) - rfix[i]->deform(1); + for (i = 0; i < nrigid; i++) rfix[i]->deform(1); } /* ---------------------------------------------------------------------- @@ -733,10 +736,10 @@ void FixPressLangevin::pre_exchange() // flip is only triggered when tilt exceeds 0.5 by DELTAFLIP // this avoids immediate re-flipping due to tilt oscillations - double xtiltmax = (0.5+DELTAFLIP)*xprd; - double ytiltmax = (0.5+DELTAFLIP)*yprd; + double xtiltmax = (0.5 + DELTAFLIP) * xprd; + double ytiltmax = (0.5 + DELTAFLIP) * yprd; - int flipxy,flipxz,flipyz; + int flipxy, flipxz, flipyz; flipxy = flipxz = flipyz = 0; if (domain->yperiodic) { @@ -775,12 +778,12 @@ void FixPressLangevin::pre_exchange() domain->set_global_box(); domain->set_local_box(); - domain->image_flip(flipxy,flipxz,flipyz); + domain->image_flip(flipxy, flipxz, flipyz); double **x = atom->x; imageint *image = atom->image; int nlocal = atom->nlocal; - for (int i = 0; i < nlocal; i++) domain->remap(x[i],image[i]); + for (int i = 0; i < nlocal; i++) domain->remap(x[i], image[i]); domain->x2lamda(atom->nlocal); irregular->migrate_atoms(); @@ -792,8 +795,8 @@ void FixPressLangevin::pre_exchange() int FixPressLangevin::modify_param(int narg, char **arg) { - if (strcmp(arg[0],"press") == 0) { - if (narg < 2) utils::missing_cmd_args(FLERR,"fix_modify press", error); + if (strcmp(arg[0], "press") == 0) { + if (narg < 2) utils::missing_cmd_args(FLERR, "fix_modify press", error); if (pflag) { modify->delete_compute(id_press); pflag = 0; @@ -815,8 +818,8 @@ int FixPressLangevin::modify_param(int narg, char **arg) void FixPressLangevin::reset_dt() { for (int i = 0; i < 6; i++) { - gjfa[i] = (1.0 - p_alpha[i]*update->dt / 2.0 / p_mass[i]) / - (1.0 + p_alpha[i]*update->dt / 2.0 / p_mass[i]); - gjfb[i] = 1./(1.0 + p_alpha[i]*update->dt / 2.0 / p_mass[i]); + gjfa[i] = (1.0 - p_alpha[i] * update->dt / 2.0 / p_mass[i]) / + (1.0 + p_alpha[i] * update->dt / 2.0 / p_mass[i]); + gjfb[i] = 1. / (1.0 + p_alpha[i] * update->dt / 2.0 / p_mass[i]); } } diff --git a/src/fix_press_langevin.h b/src/fix_press_langevin.h index 20ce76170b..fc9f39c434 100644 --- a/src/fix_press_langevin.h +++ b/src/fix_press_langevin.h @@ -45,7 +45,7 @@ class FixPressLangevin : public Fix { int p_flag[6]; // 1 if control P on this dim, 0 if not double nktv2p; double t_start, t_stop, t_target; - double p_fric[6], p_ltime; // Friction and Langevin charac. time + double p_fric[6], p_ltime; // Friction and Langevin charac. time double p_alpha[6]; double p_start[6], p_stop[6], p_period[6]; double p_mass[6], p_target[6], p_current[6]; @@ -61,15 +61,15 @@ class FixPressLangevin : public Fix { int pflag; int flipflag; - int pre_exchange_flag; // set if pre_exchange needed for box flips + int pre_exchange_flag; // set if pre_exchange needed for box flips class Irregular *irregular; // for migrating atoms after box flips class RanMars *random; int seed; void couple_pressure(); - void couple_kinetic(double ); - void couple_beta(double ); + void couple_kinetic(double); + void couple_beta(double); void remap(); }; From 6442763b7021ecafbd15d4db3a9a3af4ac7bdafe Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 7 Oct 2023 12:08:02 -0400 Subject: [PATCH 146/219] indicate that fix press/langevin changes box dimensions --- src/fix_press_langevin.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/fix_press_langevin.cpp b/src/fix_press_langevin.cpp index d275799430..d8b90d8b49 100644 --- a/src/fix_press_langevin.cpp +++ b/src/fix_press_langevin.cpp @@ -312,6 +312,13 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : (p_flag[4] && p_period[4] <= 0.0) || (p_flag[5] && p_period[5] <= 0.0)) error->all(FLERR, "Fix press/langevin damping parameters must be > 0.0"); + if (p_flag[0]) box_change |= BOX_CHANGE_X; + if (p_flag[1]) box_change |= BOX_CHANGE_Y; + if (p_flag[2]) box_change |= BOX_CHANGE_Z; + if (p_flag[3]) box_change |= BOX_CHANGE_YZ; + if (p_flag[4]) box_change |= BOX_CHANGE_XZ; + if (p_flag[5]) box_change |= BOX_CHANGE_XY; + // pstyle = ISO if XYZ coupling or XY coupling in 2d -> 1 dof // else pstyle = ANISO -> 3 dof From 8d305cb44fd93ba1a36a8d09c6b2521effef27dc Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 7 Oct 2023 12:15:57 -0400 Subject: [PATCH 147/219] modernize access to list of fixes and fix properties also for fix press/berendsen --- src/fix_press_berendsen.cpp | 27 +++++++++++++-------------- src/fix_press_berendsen.h | 6 +++--- 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/src/fix_press_berendsen.cpp b/src/fix_press_berendsen.cpp index e27a4560f0..2f418dd102 100644 --- a/src/fix_press_berendsen.cpp +++ b/src/fix_press_berendsen.cpp @@ -269,14 +269,13 @@ void FixPressBerendsen::init() // ensure no conflict with fix deform - for (const auto &ifix : modify->get_fix_list()) - if (strcmp(ifix->style, "^deform") == 0) { - int *dimflag = static_cast(ifix)->dimflag; - if ((p_flag[0] && dimflag[0]) || (p_flag[1] && dimflag[1]) || - (p_flag[2] && dimflag[2])) - error->all(FLERR,"Cannot use fix press/berendsen and " + for (const auto &ifix : modify->get_fix_by_style("^deform")) { + int *dimflag = static_cast(ifix)->dimflag; + if (!dimflag) continue; + if ((p_flag[0] && dimflag[0]) || (p_flag[1] && dimflag[1]) || (p_flag[2] && dimflag[2])) + error->all(FLERR,"Cannot use fix press/berendsen and " "fix deform on same component of stress tensor"); - } + } // set temperature and pressure ptrs @@ -303,13 +302,13 @@ void FixPressBerendsen::init() nrigid = 0; rfix = nullptr; - for (int i = 0; i < modify->nfix; i++) - if (modify->fix[i]->rigid_flag) nrigid++; + for (const auto &ifix : modify->get_fix_list()) + if (ifix->rigid_flag) nrigid++; if (nrigid > 0) { - rfix = new int[nrigid]; + rfix = new Fix *[nrigid]; nrigid = 0; - for (int i = 0; i < modify->nfix; i++) - if (modify->fix[i]->rigid_flag) rfix[nrigid++] = i; + for (auto &ifix : modify->get_fix_list()) + if (ifix->rigid_flag) rfix[nrigid++] = ifix; } } @@ -418,7 +417,7 @@ void FixPressBerendsen::remap() if (nrigid) for (i = 0; i < nrigid; i++) - modify->fix[rfix[i]]->deform(0); + rfix[i]->deform(0); // reset global and local box to new size/shape @@ -446,7 +445,7 @@ void FixPressBerendsen::remap() if (nrigid) for (i = 0; i < nrigid; i++) - modify->fix[rfix[i]]->deform(1); + rfix[i]->deform(1); } /* ---------------------------------------------------------------------- */ diff --git a/src/fix_press_berendsen.h b/src/fix_press_berendsen.h index 85a4895901..9e83533746 100644 --- a/src/fix_press_berendsen.h +++ b/src/fix_press_berendsen.h @@ -44,9 +44,9 @@ class FixPressBerendsen : public Fix { double p_period[3], p_target[3]; double p_current[3], dilation[3]; double factor[3]; - int kspace_flag; // 1 if KSpace invoked, 0 if not - int nrigid; // number of rigid fixes - int *rfix; // indices of rigid fixes + int kspace_flag; // 1 if KSpace invoked, 0 if not + int nrigid; // number of rigid fixes + class Fix **rfix; // indices of rigid fixes char *id_temp, *id_press; class Compute *temperature, *pressure; From 60ffcf74dc8eac22beb7effc4adc16ae53f6668c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 7 Oct 2023 12:17:05 -0400 Subject: [PATCH 148/219] enable and apply clang-format to fix press/berendsen --- src/fix_press_berendsen.cpp | 264 +++++++++++++++++------------------- 1 file changed, 128 insertions(+), 136 deletions(-) diff --git a/src/fix_press_berendsen.cpp b/src/fix_press_berendsen.cpp index 2f418dd102..05e523abae 100644 --- a/src/fix_press_berendsen.cpp +++ b/src/fix_press_berendsen.cpp @@ -1,4 +1,3 @@ -// clang-format off /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories @@ -32,17 +31,16 @@ using namespace LAMMPS_NS; using namespace FixConst; -enum{NOBIAS,BIAS}; -enum{NONE,XYZ,XY,YZ,XZ}; -enum{ISO,ANISO}; +enum { NOBIAS, BIAS }; +enum { NONE, XYZ, XY, YZ, XZ }; +enum { ISO, ANISO }; /* ---------------------------------------------------------------------- */ FixPressBerendsen::FixPressBerendsen(LAMMPS *lmp, int narg, char **arg) : - Fix(lmp, narg, arg), - id_temp(nullptr), id_press(nullptr), tflag(0), pflag(0) + Fix(lmp, narg, arg), id_temp(nullptr), id_press(nullptr), tflag(0), pflag(0) { - if (narg < 5) error->all(FLERR,"Illegal fix press/berendsen command"); + if (narg < 5) error->all(FLERR, "Illegal fix press/berendsen command"); // Berendsen barostat applied every step @@ -67,26 +65,24 @@ FixPressBerendsen::FixPressBerendsen(LAMMPS *lmp, int narg, char **arg) : int iarg = 3; while (iarg < narg) { - if (strcmp(arg[iarg],"iso") == 0) { - if (iarg+4 > narg) - error->all(FLERR,"Illegal fix press/berendsen command"); + if (strcmp(arg[iarg], "iso") == 0) { + if (iarg + 4 > narg) error->all(FLERR, "Illegal fix press/berendsen command"); pcouple = XYZ; - p_start[0] = p_start[1] = p_start[2] = utils::numeric(FLERR,arg[iarg+1],false,lmp); - p_stop[0] = p_stop[1] = p_stop[2] = utils::numeric(FLERR,arg[iarg+2],false,lmp); - p_period[0] = p_period[1] = p_period[2] = utils::numeric(FLERR,arg[iarg+3],false,lmp); + p_start[0] = p_start[1] = p_start[2] = utils::numeric(FLERR, arg[iarg + 1], false, lmp); + p_stop[0] = p_stop[1] = p_stop[2] = utils::numeric(FLERR, arg[iarg + 2], false, lmp); + p_period[0] = p_period[1] = p_period[2] = utils::numeric(FLERR, arg[iarg + 3], false, lmp); p_flag[0] = p_flag[1] = p_flag[2] = 1; if (dimension == 2) { p_start[2] = p_stop[2] = p_period[2] = 0.0; p_flag[2] = 0; } iarg += 4; - } else if (strcmp(arg[iarg],"aniso") == 0) { - if (iarg+4 > narg) - error->all(FLERR,"Illegal fix press/berendsen command"); + } else if (strcmp(arg[iarg], "aniso") == 0) { + if (iarg + 4 > narg) error->all(FLERR, "Illegal fix press/berendsen command"); pcouple = NONE; - p_start[0] = p_start[1] = p_start[2] = utils::numeric(FLERR,arg[iarg+1],false,lmp); - p_stop[0] = p_stop[1] = p_stop[2] = utils::numeric(FLERR,arg[iarg+2],false,lmp); - p_period[0] = p_period[1] = p_period[2] = utils::numeric(FLERR,arg[iarg+3],false,lmp); + p_start[0] = p_start[1] = p_start[2] = utils::numeric(FLERR, arg[iarg + 1], false, lmp); + p_stop[0] = p_stop[1] = p_stop[2] = utils::numeric(FLERR, arg[iarg + 2], false, lmp); + p_period[0] = p_period[1] = p_period[2] = utils::numeric(FLERR, arg[iarg + 3], false, lmp); p_flag[0] = p_flag[1] = p_flag[2] = 1; if (dimension == 2) { p_start[2] = p_stop[2] = p_period[2] = 0.0; @@ -94,59 +90,61 @@ FixPressBerendsen::FixPressBerendsen(LAMMPS *lmp, int narg, char **arg) : } iarg += 4; - } else if (strcmp(arg[iarg],"x") == 0) { - if (iarg+4 > narg) - error->all(FLERR,"Illegal fix press/berendsen command"); - p_start[0] = utils::numeric(FLERR,arg[iarg+1],false,lmp); - p_stop[0] = utils::numeric(FLERR,arg[iarg+2],false,lmp); - p_period[0] = utils::numeric(FLERR,arg[iarg+3],false,lmp); + } else if (strcmp(arg[iarg], "x") == 0) { + if (iarg + 4 > narg) error->all(FLERR, "Illegal fix press/berendsen command"); + p_start[0] = utils::numeric(FLERR, arg[iarg + 1], false, lmp); + p_stop[0] = utils::numeric(FLERR, arg[iarg + 2], false, lmp); + p_period[0] = utils::numeric(FLERR, arg[iarg + 3], false, lmp); p_flag[0] = 1; iarg += 4; - } else if (strcmp(arg[iarg],"y") == 0) { - if (iarg+4 > narg) - error->all(FLERR,"Illegal fix press/berendsen command"); - p_start[1] = utils::numeric(FLERR,arg[iarg+1],false,lmp); - p_stop[1] = utils::numeric(FLERR,arg[iarg+2],false,lmp); - p_period[1] = utils::numeric(FLERR,arg[iarg+3],false,lmp); + } else if (strcmp(arg[iarg], "y") == 0) { + if (iarg + 4 > narg) error->all(FLERR, "Illegal fix press/berendsen command"); + p_start[1] = utils::numeric(FLERR, arg[iarg + 1], false, lmp); + p_stop[1] = utils::numeric(FLERR, arg[iarg + 2], false, lmp); + p_period[1] = utils::numeric(FLERR, arg[iarg + 3], false, lmp); p_flag[1] = 1; iarg += 4; - } else if (strcmp(arg[iarg],"z") == 0) { - if (iarg+4 > narg) - error->all(FLERR,"Illegal fix press/berendsen command"); - p_start[2] = utils::numeric(FLERR,arg[iarg+1],false,lmp); - p_stop[2] = utils::numeric(FLERR,arg[iarg+2],false,lmp); - p_period[2] = utils::numeric(FLERR,arg[iarg+3],false,lmp); + } else if (strcmp(arg[iarg], "z") == 0) { + if (iarg + 4 > narg) error->all(FLERR, "Illegal fix press/berendsen command"); + p_start[2] = utils::numeric(FLERR, arg[iarg + 1], false, lmp); + p_stop[2] = utils::numeric(FLERR, arg[iarg + 2], false, lmp); + p_period[2] = utils::numeric(FLERR, arg[iarg + 3], false, lmp); p_flag[2] = 1; iarg += 4; - if (dimension == 2) - error->all(FLERR,"Invalid fix press/berendsen for a 2d simulation"); + if (dimension == 2) error->all(FLERR, "Invalid fix press/berendsen for a 2d simulation"); - } else if (strcmp(arg[iarg],"couple") == 0) { - if (iarg+2 > narg) - error->all(FLERR,"Illegal fix press/berendsen command"); - if (strcmp(arg[iarg+1],"xyz") == 0) pcouple = XYZ; - else if (strcmp(arg[iarg+1],"xy") == 0) pcouple = XY; - else if (strcmp(arg[iarg+1],"yz") == 0) pcouple = YZ; - else if (strcmp(arg[iarg+1],"xz") == 0) pcouple = XZ; - else if (strcmp(arg[iarg+1],"none") == 0) pcouple = NONE; - else error->all(FLERR,"Illegal fix press/berendsen command"); + } else if (strcmp(arg[iarg], "couple") == 0) { + if (iarg + 2 > narg) error->all(FLERR, "Illegal fix press/berendsen command"); + if (strcmp(arg[iarg + 1], "xyz") == 0) + pcouple = XYZ; + else if (strcmp(arg[iarg + 1], "xy") == 0) + pcouple = XY; + else if (strcmp(arg[iarg + 1], "yz") == 0) + pcouple = YZ; + else if (strcmp(arg[iarg + 1], "xz") == 0) + pcouple = XZ; + else if (strcmp(arg[iarg + 1], "none") == 0) + pcouple = NONE; + else + error->all(FLERR, "Illegal fix press/berendsen command"); iarg += 2; - } else if (strcmp(arg[iarg],"modulus") == 0) { - if (iarg+2 > narg) - error->all(FLERR,"Illegal fix press/berendsen command"); - bulkmodulus = utils::numeric(FLERR,arg[iarg+1],false,lmp); - if (bulkmodulus <= 0.0) - error->all(FLERR,"Illegal fix press/berendsen command"); + } else if (strcmp(arg[iarg], "modulus") == 0) { + if (iarg + 2 > narg) error->all(FLERR, "Illegal fix press/berendsen command"); + bulkmodulus = utils::numeric(FLERR, arg[iarg + 1], false, lmp); + if (bulkmodulus <= 0.0) error->all(FLERR, "Illegal fix press/berendsen command"); iarg += 2; - } else if (strcmp(arg[iarg],"dilate") == 0) { - if (iarg+2 > narg) - error->all(FLERR,"Illegal fix press/berendsen command"); - if (strcmp(arg[iarg+1],"all") == 0) allremap = 1; - else if (strcmp(arg[iarg+1],"partial") == 0) allremap = 0; - else error->all(FLERR,"Illegal fix press/berendsen command"); + } else if (strcmp(arg[iarg], "dilate") == 0) { + if (iarg + 2 > narg) error->all(FLERR, "Illegal fix press/berendsen command"); + if (strcmp(arg[iarg + 1], "all") == 0) + allremap = 1; + else if (strcmp(arg[iarg + 1], "partial") == 0) + allremap = 0; + else + error->all(FLERR, "Illegal fix press/berendsen command"); iarg += 2; - } else error->all(FLERR,"Illegal fix press/berendsen command"); + } else + error->all(FLERR, "Illegal fix press/berendsen command"); } if (allremap == 0) restart_pbc = 1; @@ -154,57 +152,48 @@ FixPressBerendsen::FixPressBerendsen(LAMMPS *lmp, int narg, char **arg) : // error checks if (dimension == 2 && p_flag[2]) - error->all(FLERR,"Invalid fix press/berendsen for a 2d simulation"); + error->all(FLERR, "Invalid fix press/berendsen for a 2d simulation"); if (dimension == 2 && (pcouple == YZ || pcouple == XZ)) - error->all(FLERR,"Invalid fix press/berendsen for a 2d simulation"); + error->all(FLERR, "Invalid fix press/berendsen for a 2d simulation"); if (pcouple == XYZ && (p_flag[0] == 0 || p_flag[1] == 0)) - error->all(FLERR,"Invalid fix press/berendsen pressure settings"); + error->all(FLERR, "Invalid fix press/berendsen pressure settings"); if (pcouple == XYZ && dimension == 3 && p_flag[2] == 0) - error->all(FLERR,"Invalid fix press/berendsen pressure settings"); + error->all(FLERR, "Invalid fix press/berendsen pressure settings"); if (pcouple == XY && (p_flag[0] == 0 || p_flag[1] == 0)) - error->all(FLERR,"Invalid fix press/berendsen pressure settings"); + error->all(FLERR, "Invalid fix press/berendsen pressure settings"); if (pcouple == YZ && (p_flag[1] == 0 || p_flag[2] == 0)) - error->all(FLERR,"Invalid fix press/berendsen pressure settings"); + error->all(FLERR, "Invalid fix press/berendsen pressure settings"); if (pcouple == XZ && (p_flag[0] == 0 || p_flag[2] == 0)) - error->all(FLERR,"Invalid fix press/berendsen pressure settings"); + error->all(FLERR, "Invalid fix press/berendsen pressure settings"); if (p_flag[0] && domain->xperiodic == 0) - error->all(FLERR, - "Cannot use fix press/berendsen on a non-periodic dimension"); + error->all(FLERR, "Cannot use fix press/berendsen on a non-periodic dimension"); if (p_flag[1] && domain->yperiodic == 0) - error->all(FLERR, - "Cannot use fix press/berendsen on a non-periodic dimension"); + error->all(FLERR, "Cannot use fix press/berendsen on a non-periodic dimension"); if (p_flag[2] && domain->zperiodic == 0) - error->all(FLERR, - "Cannot use fix press/berendsen on a non-periodic dimension"); + error->all(FLERR, "Cannot use fix press/berendsen on a non-periodic dimension"); if (pcouple == XYZ && dimension == 3 && - (p_start[0] != p_start[1] || p_start[0] != p_start[2] || - p_stop[0] != p_stop[1] || p_stop[0] != p_stop[2] || - p_period[0] != p_period[1] || p_period[0] != p_period[2])) - error->all(FLERR,"Invalid fix press/berendsen pressure settings"); + (p_start[0] != p_start[1] || p_start[0] != p_start[2] || p_stop[0] != p_stop[1] || + p_stop[0] != p_stop[2] || p_period[0] != p_period[1] || p_period[0] != p_period[2])) + error->all(FLERR, "Invalid fix press/berendsen pressure settings"); if (pcouple == XYZ && dimension == 2 && - (p_start[0] != p_start[1] || p_stop[0] != p_stop[1] || - p_period[0] != p_period[1])) - error->all(FLERR,"Invalid fix press/berendsen pressure settings"); + (p_start[0] != p_start[1] || p_stop[0] != p_stop[1] || p_period[0] != p_period[1])) + error->all(FLERR, "Invalid fix press/berendsen pressure settings"); if (pcouple == XY && - (p_start[0] != p_start[1] || p_stop[0] != p_stop[1] || - p_period[0] != p_period[1])) - error->all(FLERR,"Invalid fix press/berendsen pressure settings"); + (p_start[0] != p_start[1] || p_stop[0] != p_stop[1] || p_period[0] != p_period[1])) + error->all(FLERR, "Invalid fix press/berendsen pressure settings"); if (pcouple == YZ && - (p_start[1] != p_start[2] || p_stop[1] != p_stop[2] || - p_period[1] != p_period[2])) - error->all(FLERR,"Invalid fix press/berendsen pressure settings"); + (p_start[1] != p_start[2] || p_stop[1] != p_stop[2] || p_period[1] != p_period[2])) + error->all(FLERR, "Invalid fix press/berendsen pressure settings"); if (pcouple == XZ && - (p_start[0] != p_start[2] || p_stop[0] != p_stop[2] || - p_period[0] != p_period[2])) - error->all(FLERR,"Invalid fix press/berendsen pressure settings"); + (p_start[0] != p_start[2] || p_stop[0] != p_stop[2] || p_period[0] != p_period[2])) + error->all(FLERR, "Invalid fix press/berendsen pressure settings"); - if ((p_flag[0] && p_period[0] <= 0.0) || - (p_flag[1] && p_period[1] <= 0.0) || + if ((p_flag[0] && p_period[0] <= 0.0) || (p_flag[1] && p_period[1] <= 0.0) || (p_flag[2] && p_period[2] <= 0.0)) - error->all(FLERR,"Fix press/berendsen damping parameters must be > 0.0"); + error->all(FLERR, "Fix press/berendsen damping parameters must be > 0.0"); if (p_flag[0]) box_change |= BOX_CHANGE_X; if (p_flag[1]) box_change |= BOX_CHANGE_Y; @@ -213,8 +202,10 @@ FixPressBerendsen::FixPressBerendsen(LAMMPS *lmp, int narg, char **arg) : // pstyle = ISO if XYZ coupling or XY coupling in 2d -> 1 dof // else pstyle = ANISO -> 3 dof - if (pcouple == XYZ || (dimension == 2 && pcouple == XY)) pstyle = ISO; - else pstyle = ANISO; + if (pcouple == XYZ || (dimension == 2 && pcouple == XY)) + pstyle = ISO; + else + pstyle = ANISO; // create a new compute temp style // id = fix-ID + temp @@ -222,7 +213,7 @@ FixPressBerendsen::FixPressBerendsen(LAMMPS *lmp, int narg, char **arg) : // and thus its KE/temperature contribution should use group all id_temp = utils::strdup(std::string(id) + "_temp"); - modify->add_compute(fmt::format("{} all temp",id_temp)); + modify->add_compute(fmt::format("{} all temp", id_temp)); tflag = 1; // create a new compute pressure style @@ -230,7 +221,7 @@ FixPressBerendsen::FixPressBerendsen(LAMMPS *lmp, int narg, char **arg) : // pass id_temp as 4th arg to pressure constructor id_press = utils::strdup(std::string(id) + "_press"); - modify->add_compute(fmt::format("{} all pressure {}",id_press, id_temp)); + modify->add_compute(fmt::format("{} all pressure {}", id_press, id_temp)); pflag = 1; nrigid = 0; @@ -264,8 +255,7 @@ int FixPressBerendsen::setmask() void FixPressBerendsen::init() { - if (domain->triclinic) - error->all(FLERR,"Cannot use fix press/berendsen with triclinic box"); + if (domain->triclinic) error->all(FLERR, "Cannot use fix press/berendsen with triclinic box"); // ensure no conflict with fix deform @@ -273,8 +263,9 @@ void FixPressBerendsen::init() int *dimflag = static_cast(ifix)->dimflag; if (!dimflag) continue; if ((p_flag[0] && dimflag[0]) || (p_flag[1] && dimflag[1]) || (p_flag[2] && dimflag[2])) - error->all(FLERR,"Cannot use fix press/berendsen and " - "fix deform on same component of stress tensor"); + error->all(FLERR, + "Cannot use fix press/berendsen and " + "fix deform on same component of stress tensor"); } // set temperature and pressure ptrs @@ -283,8 +274,10 @@ void FixPressBerendsen::init() if (!temperature) error->all(FLERR, "Temperature compute ID {} for fix press/berendsen does not exist", id_temp); - if (temperature->tempbias) which = BIAS; - else which = NOBIAS; + if (temperature->tempbias) + which = BIAS; + else + which = NOBIAS; pressure = modify->get_compute_by_id(id_press); if (!pressure) @@ -292,8 +285,10 @@ void FixPressBerendsen::init() // Kspace setting - if (force->kspace) kspace_flag = 1; - else kspace_flag = 0; + if (force->kspace) + kspace_flag = 1; + else + kspace_flag = 0; // detect if any rigid fixes exist so rigid bodies move when box is remapped // rfix[] = indices to each fix rigid @@ -320,7 +315,7 @@ void FixPressBerendsen::setup(int /*vflag*/) { // trigger virial computation on next timestep - pressure->addstep(update->ntimestep+1); + pressure->addstep(update->ntimestep + 1); } /* ---------------------------------------------------------------------- */ @@ -343,10 +338,9 @@ void FixPressBerendsen::end_of_step() for (int i = 0; i < 3; i++) { if (p_flag[i]) { - p_target[i] = p_start[i] + delta * (p_stop[i]-p_start[i]); - dilation[i] = - pow(1.0 - update->dt/p_period[i] * - (p_target[i]-p_current[i])/bulkmodulus,1.0/3.0); + p_target[i] = p_start[i] + delta * (p_stop[i] - p_start[i]); + dilation[i] = pow(1.0 - update->dt / p_period[i] * (p_target[i] - p_current[i]) / bulkmodulus, + 1.0 / 3.0); } } @@ -358,7 +352,7 @@ void FixPressBerendsen::end_of_step() // trigger virial computation on next timestep - pressure->addstep(update->ntimestep+1); + pressure->addstep(update->ntimestep + 1); } /* ---------------------------------------------------------------------- */ @@ -370,7 +364,7 @@ void FixPressBerendsen::couple() if (pstyle == ISO) p_current[0] = p_current[1] = p_current[2] = pressure->scalar; else if (pcouple == XYZ) { - double ave = 1.0/3.0 * (tensor[0] + tensor[1] + tensor[2]); + double ave = 1.0 / 3.0 * (tensor[0] + tensor[1] + tensor[2]); p_current[0] = p_current[1] = p_current[2] = ave; } else if (pcouple == XY) { double ave = 0.5 * (tensor[0] + tensor[1]); @@ -400,7 +394,7 @@ void FixPressBerendsen::couple() void FixPressBerendsen::remap() { int i; - double oldlo,oldhi,ctr; + double oldlo, oldhi, ctr; double **x = atom->x; int *mask = atom->mask; @@ -408,16 +402,15 @@ void FixPressBerendsen::remap() // convert pertinent atoms and rigid bodies to lamda coords - if (allremap) domain->x2lamda(nlocal); + if (allremap) + domain->x2lamda(nlocal); else { for (i = 0; i < nlocal; i++) - if (mask[i] & groupbit) - domain->x2lamda(x[i],x[i]); + if (mask[i] & groupbit) domain->x2lamda(x[i], x[i]); } if (nrigid) - for (i = 0; i < nrigid; i++) - rfix[i]->deform(0); + for (i = 0; i < nrigid; i++) rfix[i]->deform(0); // reset global and local box to new size/shape @@ -426,8 +419,8 @@ void FixPressBerendsen::remap() oldlo = domain->boxlo[i]; oldhi = domain->boxhi[i]; ctr = 0.5 * (oldlo + oldhi); - domain->boxlo[i] = (oldlo-ctr)*dilation[i] + ctr; - domain->boxhi[i] = (oldhi-ctr)*dilation[i] + ctr; + domain->boxlo[i] = (oldlo - ctr) * dilation[i] + ctr; + domain->boxhi[i] = (oldhi - ctr) * dilation[i] + ctr; } } @@ -436,24 +429,23 @@ void FixPressBerendsen::remap() // convert pertinent atoms and rigid bodies back to box coords - if (allremap) domain->lamda2x(nlocal); + if (allremap) + domain->lamda2x(nlocal); else { for (i = 0; i < nlocal; i++) - if (mask[i] & groupbit) - domain->lamda2x(x[i],x[i]); + if (mask[i] & groupbit) domain->lamda2x(x[i], x[i]); } if (nrigid) - for (i = 0; i < nrigid; i++) - rfix[i]->deform(1); + for (i = 0; i < nrigid; i++) rfix[i]->deform(1); } /* ---------------------------------------------------------------------- */ int FixPressBerendsen::modify_param(int narg, char **arg) { - if (strcmp(arg[0],"temp") == 0) { - if (narg < 2) error->all(FLERR,"Illegal fix_modify command"); + if (strcmp(arg[0], "temp") == 0) { + if (narg < 2) error->all(FLERR, "Illegal fix_modify command"); if (tflag) { modify->delete_compute(id_temp); tflag = 0; @@ -463,25 +455,25 @@ int FixPressBerendsen::modify_param(int narg, char **arg) temperature = modify->get_compute_by_id(arg[1]); if (!temperature) - error->all(FLERR,"Could not find fix_modify temperature compute ID: ", arg[1]); + error->all(FLERR, "Could not find fix_modify temperature compute ID: ", arg[1]); if (temperature->tempflag == 0) - error->all(FLERR,"Fix_modify temperature compute {} does not compute temperature", arg[1]); + error->all(FLERR, "Fix_modify temperature compute {} does not compute temperature", arg[1]); if (temperature->igroup != 0 && comm->me == 0) - error->warning(FLERR,"Temperature compute {} for fix {} is not for group all: {}", - arg[1], style, group->names[temperature->igroup]); + error->warning(FLERR, "Temperature compute {} for fix {} is not for group all: {}", arg[1], + style, group->names[temperature->igroup]); // reset id_temp of pressure to new temperature ID auto icompute = modify->get_compute_by_id(id_press); if (!icompute) - error->all(FLERR,"Pressure compute ID {} for fix {} does not exist", id_press, style); + error->all(FLERR, "Pressure compute ID {} for fix {} does not exist", id_press, style); icompute->reset_extra_compute_fix(id_temp); return 2; - } else if (strcmp(arg[0],"press") == 0) { - if (narg < 2) error->all(FLERR,"Illegal fix_modify command"); + } else if (strcmp(arg[0], "press") == 0) { + if (narg < 2) error->all(FLERR, "Illegal fix_modify command"); if (pflag) { modify->delete_compute(id_press); pflag = 0; @@ -490,9 +482,9 @@ int FixPressBerendsen::modify_param(int narg, char **arg) id_press = utils::strdup(arg[1]); pressure = modify->get_compute_by_id(arg[1]); - if (!pressure) error->all(FLERR,"Could not find fix_modify pressure compute ID: {}", arg[1]); + if (!pressure) error->all(FLERR, "Could not find fix_modify pressure compute ID: {}", arg[1]); if (pressure->pressflag == 0) - error->all(FLERR,"Fix_modify pressure compute {} does not compute pressure", arg[1]); + error->all(FLERR, "Fix_modify pressure compute {} does not compute pressure", arg[1]); return 2; } return 0; From 3e6997e98b75971077838f94fa5f5816dc47e504 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 7 Oct 2023 13:33:43 -0400 Subject: [PATCH 149/219] restore saved text cursor when initializing system before creating an image --- tools/lammps-gui/lammpsgui.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/lammps-gui/lammpsgui.cpp b/tools/lammps-gui/lammpsgui.cpp index c9d8b9bef0..afd9b99ed2 100644 --- a/tools/lammps-gui/lammpsgui.cpp +++ b/tools/lammps-gui/lammpsgui.cpp @@ -1112,6 +1112,7 @@ void LammpsGui::render_image() "Cannot create snapshot image without a system box"); return; } + ui->textEdit->setTextCursor(saved); } // if configured, delete old image window before opening new one if (QSettings().value("imagereplace", true).toBool()) delete imagewindow; From d1f910af2c0e961fee9a9e4ddbb284e35f6f495c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 7 Oct 2023 13:33:59 -0400 Subject: [PATCH 150/219] remove redundant close button --- tools/lammps-gui/imageviewer.cpp | 7 ------- 1 file changed, 7 deletions(-) diff --git a/tools/lammps-gui/imageviewer.cpp b/tools/lammps-gui/imageviewer.cpp index 445ff16590..5d16fe9876 100644 --- a/tools/lammps-gui/imageviewer.cpp +++ b/tools/lammps-gui/imageviewer.cpp @@ -18,7 +18,6 @@ #include #include -#include #include #include #include @@ -143,11 +142,6 @@ ImageViewer::ImageViewer(const QString &fileName, LammpsWrapper *_lammps, QWidge scrollArea->setWidget(imageLabel); scrollArea->setVisible(false); - buttonBox = new QDialogButtonBox(QDialogButtonBox::Close); - - connect(buttonBox, &QDialogButtonBox::accepted, this, &QDialog::accept); - connect(buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject); - QVBoxLayout *mainLayout = new QVBoxLayout; QSettings settings; @@ -265,7 +259,6 @@ ImageViewer::ImageViewer(const QString &fileName, LammpsWrapper *_lammps, QWidge mainLayout->addLayout(menuLayout); mainLayout->addWidget(scrollArea); - mainLayout->addWidget(buttonBox); setWindowIcon(QIcon(":/icons/lammps-icon-128x128.png")); setWindowTitle(QString("Image Viewer: ") + QFileInfo(fileName).fileName()); createActions(); From 2d597f61b8a5bba2aa99d8908e75ad29c6739df1 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 7 Oct 2023 13:35:32 -0400 Subject: [PATCH 151/219] adjust default size of image area --- tools/lammps-gui/imageviewer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/lammps-gui/imageviewer.cpp b/tools/lammps-gui/imageviewer.cpp index 5d16fe9876..85e9170ac6 100644 --- a/tools/lammps-gui/imageviewer.cpp +++ b/tools/lammps-gui/imageviewer.cpp @@ -274,7 +274,7 @@ ImageViewer::ImageViewer(const QString &fileName, LammpsWrapper *_lammps, QWidge doanti->setChecked(antialias); scaleFactor = 1.0; - resize(image.width() + 20, image.height() + 50); + resize(image.width() + 20, image.height() + 75); scrollArea->setVisible(true); updateActions(); From 1390a92a5b7bbb70e4a89e7750843c3625bfdefe Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 8 Oct 2023 19:12:37 -0400 Subject: [PATCH 152/219] correct indexing bug with FSAA --- src/image.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/image.cpp b/src/image.cpp index 27079eee58..3133723b32 100644 --- a/src/image.cpp +++ b/src/image.cpp @@ -395,12 +395,12 @@ void Image::merge() if (fsaa) { for (int h=0; h < height; h += 2) { for (int w=0; w < width; w +=2) { - int idx1 = 3*height*h + 3*w; - int idx2 = 3*height*h + 3*(w+1); - int idx3 = 3*height*(h+1) + 3*w; - int idx4 = 3*height*(h+1) + 3*(w+1); + int idx1 = 3*width*h + 3*w; + int idx2 = 3*width*h + 3*(w+1); + int idx3 = 3*width*(h+1) + 3*w; + int idx4 = 3*width*(h+1) + 3*(w+1); - int out = 3*(height/2)*(h/2) + 3*(w/2); + int out = 3*(width/2)*(h/2) + 3*(w/2); for (int i=0; i < 3; ++i) { writeBuffer[out+i] = (unsigned char) (0.25*((int)writeBuffer[idx1+i] +(int)writeBuffer[idx2+i] From e5190a0ff9adcd0b59082ecc6bb84b0494bea3cc Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 8 Oct 2023 19:14:04 -0400 Subject: [PATCH 153/219] more specific preferences label --- tools/lammps-gui/preferences.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/lammps-gui/preferences.cpp b/tools/lammps-gui/preferences.cpp index aa192e8c11..c760e6610b 100644 --- a/tools/lammps-gui/preferences.cpp +++ b/tools/lammps-gui/preferences.cpp @@ -205,7 +205,7 @@ GeneralTab::GeneralTab(QSettings *_settings, LammpsWrapper *_lammps, QWidget *pa { auto *layout = new QVBoxLayout; - auto *echo = new QCheckBox("Echo input to log"); + auto *echo = new QCheckBox("Echo input to output buffer"); echo->setObjectName("echo"); echo->setCheckState(settings->value("echo", false).toBool() ? Qt::Checked : Qt::Unchecked); auto *cite = new QCheckBox("Include citation details"); From b2c52c5032238395d307227b7119ec9d5112099d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 8 Oct 2023 19:23:07 -0400 Subject: [PATCH 154/219] use FSAA implementation of dump image instead of emulating it --- tools/lammps-gui/imageviewer.cpp | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/tools/lammps-gui/imageviewer.cpp b/tools/lammps-gui/imageviewer.cpp index 85e9170ac6..04d3f0a489 100644 --- a/tools/lammps-gui/imageviewer.cpp +++ b/tools/lammps-gui/imageviewer.cpp @@ -435,9 +435,6 @@ void ImageViewer::createImage() dumpcmd += "'" + dumpfile.fileName() + "'"; settings.beginGroup("snapshot"); - int aa = antialias ? 2 : 1; - int tmpxsize = xsize * aa; - int tmpysize = ysize * aa; int hhrot = (hrot > 180) ? 360 - hrot : hrot; // determine elements from masses and set their covalent radii @@ -473,9 +470,10 @@ void ImageViewer::createImage() else dumpcmd += blank + settings.value("color", "type").toString(); dumpcmd += blank + settings.value("diameter", "type").toString(); - dumpcmd += QString(" size ") + QString::number(tmpxsize) + blank + QString::number(tmpysize); - dumpcmd += QString(" zoom ") + QString::number(zoom); + dumpcmd += QString(" size %1 %2").arg(xsize).arg(ysize); + dumpcmd += QString(" zoom %1").arg(zoom); dumpcmd += " shiny 0.5 "; + dumpcmd += QString(" fsaa %1").arg(antialias ? "yes" : "no"); if (nbondtypes > 0) { if (vdwfactor > 1.0) dumpcmd += " bond none none "; @@ -483,16 +481,16 @@ void ImageViewer::createImage() dumpcmd += " bond atom 0.5 "; } if (lammps->extract_setting("dimension") == 3) { - dumpcmd += QString(" view ") + QString::number(hhrot) + blank + QString::number(vrot); + dumpcmd += QString(" view %1 %2").arg(hhrot).arg(vrot); } - if (usessao) dumpcmd += QString(" ssao yes 453983 0.75"); + if (usessao) dumpcmd += " ssao yes 453983 0.75"; if (showbox) - dumpcmd += QString(" box yes 0.025"); + dumpcmd += " box yes 0.025"; else - dumpcmd += QString(" box no 0.0"); + dumpcmd += " box no 0.0"; if (showaxes) - dumpcmd += QString(" axes yes 0.5 0.025"); + dumpcmd += " axes yes 0.5 0.025"; else dumpcmd += QString(" axes no 0.0 0.0"); @@ -512,7 +510,7 @@ void ImageViewer::createImage() if (newImage.isNull()) return; // scale back to achieve antialiasing - image = newImage.scaled(xsize, ysize, Qt::IgnoreAspectRatio, Qt::SmoothTransformation); + image = newImage; imageLabel->setPixmap(QPixmap::fromImage(image)); imageLabel->adjustSize(); if (renderstatus) renderstatus->setEnabled(false); From 4eef20e80850916f6ea7e01f0ffca2d08bf7fc14 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 8 Oct 2023 19:26:08 -0400 Subject: [PATCH 155/219] make consistent --- tools/lammps-gui/imageviewer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/lammps-gui/imageviewer.cpp b/tools/lammps-gui/imageviewer.cpp index 04d3f0a489..86be0b66df 100644 --- a/tools/lammps-gui/imageviewer.cpp +++ b/tools/lammps-gui/imageviewer.cpp @@ -492,7 +492,7 @@ void ImageViewer::createImage() if (showaxes) dumpcmd += " axes yes 0.5 0.025"; else - dumpcmd += QString(" axes no 0.0 0.0"); + dumpcmd += " axes no 0.0 0.0"; dumpcmd += " modify boxcolor " + settings.value("boxcolor", "yellow").toString(); dumpcmd += " backcolor " + settings.value("background", "black").toString(); From 1db12d7df5a63d7f0184da06c926be1728379d2e Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 9 Oct 2023 00:09:18 -0400 Subject: [PATCH 156/219] update LAMMPS GUI help summary text --- doc/src/Howto_lammps_gui.rst | 13 ++++++++----- doc/src/Tools.rst | 17 +++++++++++------ tools/lammps-gui/lammpsgui.cpp | 26 ++++++++++++++++---------- 3 files changed, 35 insertions(+), 21 deletions(-) diff --git a/doc/src/Howto_lammps_gui.rst b/doc/src/Howto_lammps_gui.rst index 4db8b532ce..165ed84d95 100644 --- a/doc/src/Howto_lammps_gui.rst +++ b/doc/src/Howto_lammps_gui.rst @@ -5,11 +5,14 @@ This document describes **LAMMPS GUI version 1.5**. ----- -LAMMPS GUI is a graphical text editor that is linked to the :ref:`LAMMPS -library ` and thus can run LAMMPS directly using the -contents of the editor's text buffer as input. It can retrieve and -display information from LAMMPS while it is running and is adapted in -multiple ways specifically for editing LAMMPS input files. +LAMMPS GUI is a graphical text editor customized for editing LAMMPS +input files that is linked to the :ref:`LAMMPS library ` +and thus can run LAMMPS directly using the contents of the editor's text +buffer as input. It can retrieve and display information from LAMMPS +while it is running, display visualizations created with the :doc:`dump +image command `, and is adapted specifically for editing +LAMMPS input files through text completion and reformatting, and linking +to the online LAMMPS documentation for known LAMMPS commands and styles. .. note:: diff --git a/doc/src/Tools.rst b/doc/src/Tools.rst index 2e8bd3eac4..a42e7c56a5 100644 --- a/doc/src/Tools.rst +++ b/doc/src/Tools.rst @@ -645,9 +645,14 @@ LAMMPS GUI Overview ^^^^^^^^ -LAMMPS GUI is a simple graphical text editor that is linked to the -:ref:`LAMMPS C-library interface ` and thus can run LAMMPS -directly using the contents of the editor's text buffer as input. +LAMMPS GUI is a graphical text editor customized for editing LAMMPS +input files that is linked to the :ref:`LAMMPS C-library ` +and thus can run LAMMPS directly using the contents of the editor's text +buffer as input. It can retrieve and display information from LAMMPS +while it is running, display visualizations created with the :doc:`dump +image command `, and is adapted specifically for editing +LAMMPS input files through text completion and reformatting, and linking +to the online LAMMPS documentation for known LAMMPS commands and styles. This is similar to what people traditionally would do to run LAMMPS: using a regular text editor to edit the input and run the necessary @@ -656,9 +661,9 @@ terminal window. This similarity is a design goal. While making it easy for beginners to start with LAMMPS, it is also the intention to simplify the transition to workflows like most experienced LAMMPS users do. -All features have been extensively exposed to hotkeys, so that there is -also appeal for experienced LAMMPS users, too, especially for -prototyping and testing simulations setups. +All features have been extensively exposed to keyboard shortcuts, so +that there is also appeal for experienced LAMMPS users for prototyping +and testing simulations setups. Features ^^^^^^^^ diff --git a/tools/lammps-gui/lammpsgui.cpp b/tools/lammps-gui/lammpsgui.cpp index afd9b99ed2..ba080dbec3 100644 --- a/tools/lammps-gui/lammpsgui.cpp +++ b/tools/lammps-gui/lammpsgui.cpp @@ -1243,9 +1243,12 @@ void LammpsGui::help() msg.setWindowTitle("LAMMPS-GUI Quick Help"); msg.setWindowIcon(QIcon(":/icons/lammps-icon-128x128.png")); msg.setText("

"); - msg.setInformativeText("

LAMMPS GUI is a graphical text editor that is linked to the LAMMPS " + msg.setInformativeText("

LAMMPS GUI is a graphical text editor that is customized for " + "editing LAMMPS input files and linked to the LAMMPS " "library and thus can run LAMMPS directly using the contents of the " - "text buffer as input through the LAMMPS C-library interface.

" + "text buffer as input. It can retrieve and display information from " + "LAMMPS while it is running and display visualizations created " + "with the dump image command.

" "

The main window of the LAMMPS GUI is a text editor window with " "LAMMPS specific syntax highlighting. When typing Ctrl-Enter " "or clicking on 'Run LAMMMPS' in the 'Run' menu, LAMMPS will be run " @@ -1254,26 +1257,29 @@ void LammpsGui::help() "is displayed in a chart window. Both are updated regularly during the " "run, as is a progress bar in the main window. The running simulation " "can be stopped cleanly by typing Ctrl-/ or by clicking on " - "'Stop LAMMPS' in the 'Run' menu. After the simulation is finished " - "or stopped, an image of the simulated system can be shown in an image " + "'Stop LAMMPS' in the 'Run' menu. While LAMMPS is not running, " + "an image of the simulated system can be created and shown in an image " "viewer window by typing Ctrl-i or by clicking on 'View Image' " "in the 'Run' menu. Multiple image settings can be changed through the " - "buttons in the menu bar and the image will be re-renderd.

" + "buttons in the menu bar and the image will be re-renderd. In case " + "an input file contains a dump image command, LAMMPS GUI will load " + "the images as they are created and display them in a slide show.

" "

When opening a file, the editor will determine the directory " "where the input file resides and switch its current working directory " "to that same folder and thus enabling the run to read other files in " - "that folder, e.g. a data file .The GUI will show its current working " + "that folder, e.g. a data file. The GUI will show its current working " "directory in the status bar. In addition to using the menu, the " "editor window can also receive files as the first command line " "argument or via drag-n-drop from a graphical file manager or a " "desktop environment.

" - "

Almost all commands are accessible via hotkeys. Which those " - "hotkeys are, is typically shown next to their entries in the menus. " + "

Almost all commands are accessible via keyboard shortcuts. Which " + "those shortcuts are, is typically shown next to their entries in the " + "menus. " "In addition, the documentation for the command in the current line " "can be viewed by typing Ctrl-? or by choosing the respective " "entry in the context menu, available by right-clicking the mouse. " - "Log, chart, and image windows can be closed with Ctrl-W, the " - "main window with Ctrl-Q.

" + "Log, chart, slide show, and image windows can be closed with " + "Ctrl-W and the application terminated with Ctrl-Q.

" "

The 'About LAMMPS' dialog will show the LAMMPS version and the " "features included into the LAMMPS library linked to the LAMMPS GUI. " "A number of settings can be adjusted in the 'Preferences' dialog (in " From 4ff226b00f664defa3a761244f41b4d1f00457b6 Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Mon, 9 Oct 2023 16:12:27 -0600 Subject: [PATCH 157/219] Fix issues in Kokkos fix property/atom --- src/KOKKOS/atom_kokkos.cpp | 52 ++++++++++++- src/KOKKOS/atom_kokkos.h | 4 + src/KOKKOS/atom_vec_dpd_kokkos.cpp | 8 -- src/KOKKOS/atom_vec_kokkos.h | 2 + src/KOKKOS/fix_property_atom_kokkos.cpp | 98 +++++++++++++++++++++---- src/KOKKOS/fix_property_atom_kokkos.h | 10 +++ src/KOKKOS/kokkos_base.h | 8 +- src/fix_property_atom.cpp | 14 +++- src/fix_property_atom.h | 1 + 9 files changed, 163 insertions(+), 34 deletions(-) diff --git a/src/KOKKOS/atom_kokkos.cpp b/src/KOKKOS/atom_kokkos.cpp index 03537e7b88..a009972628 100644 --- a/src/KOKKOS/atom_kokkos.cpp +++ b/src/KOKKOS/atom_kokkos.cpp @@ -44,6 +44,10 @@ AtomKokkos::AtomKokkos(LAMMPS *lmp) : Atom(lmp) h_tag_min = Kokkos::subview(h_tag_min_max,0); h_tag_max = Kokkos::subview(h_tag_min_max,1); + + nprop_atom = 0; + prop_atom = nullptr; + fix_prop_atom = nullptr; } /* ---------------------------------------------------------------------- */ @@ -112,6 +116,7 @@ AtomKokkos::~AtomKokkos() memoryKK->destroy_kokkos(k_dvector, dvector); dvector = nullptr; + delete [] fix_prop_atom; } /* ---------------------------------------------------------------------- */ @@ -121,15 +126,46 @@ void AtomKokkos::init() Atom::init(); sort_classic = lmp->kokkos->sort_classic; + + nprop_atom = 0; + for (int ifix = 0; ifix < modify->nfix; ifix++) { + if (modify->fix[ifix] && utils::strmatch(modify->fix[ifix]->style, "^property/atom")) { + auto fix_i = modify->fix[ifix]; + if (!fix_i->kokkosable) + error->all(FLERR, "KOKKOS package requires a Kokkos-enabled version of fix property/atom"); + + memory->grow(prop_atom,nprop_atom+1,"atom::prop_atom"); + prop_atom[nprop_atom++] = ifix; + } + } + + delete [] fix_prop_atom; + fix_prop_atom = new FixPropertyAtomKokkos*[nprop_atom]; + + printf("HERE %i\n",nprop_atom); + + for (int n = 0; n < nprop_atom; n++) { + auto fix_n = dynamic_cast(modify->fix[prop_atom[n]]); + fix_n->atom_init_flag = 1; + fix_prop_atom[n] = fix_n; + } + + memory->destroy(prop_atom); } /* ---------------------------------------------------------------------- */ void AtomKokkos::sync(const ExecutionSpace space, unsigned int mask) { - if (space == Device && lmp->kokkos->auto_sync) avecKK->modified(Host, mask); + if (space == Device && lmp->kokkos->auto_sync) { + avecKK->modified(Host, mask); + for (int n = 0; n < nprop_atom; n++) + fix_prop_atom[n]->modified(Host, mask); + } avecKK->sync(space, mask); + for (int n = 0; n < nprop_atom; n++) + fix_prop_atom[n]->sync(space, mask); } /* ---------------------------------------------------------------------- */ @@ -137,13 +173,23 @@ void AtomKokkos::sync(const ExecutionSpace space, unsigned int mask) void AtomKokkos::modified(const ExecutionSpace space, unsigned int mask) { avecKK->modified(space, mask); + for (int n = 0; n < nprop_atom; n++) + fix_prop_atom[n]->modified(space, mask); - if (space == Device && lmp->kokkos->auto_sync) avecKK->sync(Host, mask); + if (space == Device && lmp->kokkos->auto_sync) { + avecKK->sync(Host, mask); + for (int n = 0; n < nprop_atom; n++) + fix_prop_atom[n]->sync(Host, mask); + } } +/* ---------------------------------------------------------------------- */ + void AtomKokkos::sync_overlapping_device(const ExecutionSpace space, unsigned int mask) { avecKK->sync_overlapping_device(space, mask); + for (int n = 0; n < nprop_atom; n++) + fix_prop_atom[n]->sync_overlapping_device(space, mask); } /* ---------------------------------------------------------------------- */ @@ -375,7 +421,7 @@ AtomVec *AtomKokkos::new_avec(const std::string &style, int trysuffix, int &sfla int hybrid_substyle_flag = (avec != nullptr); AtomVec *avec = Atom::new_avec(style, trysuffix, sflag); - if (!avec->kokkosable) error->all(FLERR, "KOKKOS package requires a kokkos enabled atom_style"); + if (!avec->kokkosable) error->all(FLERR, "KOKKOS package requires a Kokkos-enabled atom_style"); if (!hybrid_substyle_flag) avecKK = dynamic_cast(avec); diff --git a/src/KOKKOS/atom_kokkos.h b/src/KOKKOS/atom_kokkos.h index f8b00f21f2..c26a1b291f 100644 --- a/src/KOKKOS/atom_kokkos.h +++ b/src/KOKKOS/atom_kokkos.h @@ -14,6 +14,7 @@ #include "atom.h" // IWYU pragma: export #include "kokkos_type.h" +#include "fix_property_atom_kokkos.h" #include @@ -25,6 +26,9 @@ namespace LAMMPS_NS { class AtomKokkos : public Atom { public: bool sort_classic; + int nprop_atom; + int* prop_atom; + FixPropertyAtomKokkos** fix_prop_atom; DAT::tdual_tagint_1d k_tag; DAT::tdual_int_1d k_type, k_mask; diff --git a/src/KOKKOS/atom_vec_dpd_kokkos.cpp b/src/KOKKOS/atom_vec_dpd_kokkos.cpp index a8ce29f666..c3430b9f6e 100644 --- a/src/KOKKOS/atom_vec_dpd_kokkos.cpp +++ b/src/KOKKOS/atom_vec_dpd_kokkos.cpp @@ -963,7 +963,6 @@ void AtomVecDPDKokkos::sync(ExecutionSpace space, unsigned int mask) if (mask & UCG_MASK) atomKK->k_uCG.sync(); if (mask & UCGNEW_MASK) atomKK->k_uCGnew.sync(); if (mask & DUCHEM_MASK) atomKK->k_duChem.sync(); - if (mask & DVECTOR_MASK) atomKK->k_dvector.sync(); } else { if (mask & X_MASK) atomKK->k_x.sync(); if (mask & V_MASK) atomKK->k_v.sync(); @@ -980,7 +979,6 @@ void AtomVecDPDKokkos::sync(ExecutionSpace space, unsigned int mask) if (mask & UCG_MASK) atomKK->k_uCG.sync(); if (mask & UCGNEW_MASK) atomKK->k_uCGnew.sync(); if (mask & DUCHEM_MASK) atomKK->k_duChem.sync(); - if (mask & DVECTOR_MASK) atomKK->k_dvector.sync(); } } @@ -1019,8 +1017,6 @@ void AtomVecDPDKokkos::sync_overlapping_device(ExecutionSpace space, unsigned in perform_async_copy(atomKK->k_uCGnew,space); if ((mask & DUCHEM_MASK) && atomKK->k_duChem.need_sync()) perform_async_copy(atomKK->k_duChem,space); - if ((mask & DVECTOR_MASK) && atomKK->k_dvector.need_sync()) - perform_async_copy(atomKK->k_dvector,space); } else { if ((mask & X_MASK) && atomKK->k_x.need_sync()) perform_async_copy(atomKK->k_x,space); @@ -1052,8 +1048,6 @@ void AtomVecDPDKokkos::sync_overlapping_device(ExecutionSpace space, unsigned in perform_async_copy(atomKK->k_uCGnew,space); if ((mask & DUCHEM_MASK) && atomKK->k_duChem.need_sync()) perform_async_copy(atomKK->k_duChem,space); - if ((mask & DVECTOR_MASK) && atomKK->k_dvector.need_sync()) - perform_async_copy(atomKK->k_dvector,space); } } @@ -1077,7 +1071,6 @@ void AtomVecDPDKokkos::modified(ExecutionSpace space, unsigned int mask) if (mask & UCG_MASK) atomKK->k_uCG.modify(); if (mask & UCGNEW_MASK) atomKK->k_uCGnew.modify(); if (mask & DUCHEM_MASK) atomKK->k_duChem.modify(); - if (mask & DVECTOR_MASK) atomKK->k_dvector.modify(); } else { if (mask & X_MASK) atomKK->k_x.modify(); if (mask & V_MASK) atomKK->k_v.modify(); @@ -1094,6 +1087,5 @@ void AtomVecDPDKokkos::modified(ExecutionSpace space, unsigned int mask) if (mask & UCG_MASK) atomKK->k_uCG.modify(); if (mask & UCGNEW_MASK) atomKK->k_uCGnew.modify(); if (mask & DUCHEM_MASK) atomKK->k_duChem.modify(); - if (mask & DVECTOR_MASK) atomKK->k_dvector.modify(); } } diff --git a/src/KOKKOS/atom_vec_kokkos.h b/src/KOKKOS/atom_vec_kokkos.h index d3b2578b68..c10ff5b40a 100644 --- a/src/KOKKOS/atom_vec_kokkos.h +++ b/src/KOKKOS/atom_vec_kokkos.h @@ -139,6 +139,8 @@ class AtomVecKokkos : virtual public AtomVec { DAT::tdual_int_1d k_count; + public: + #ifdef LMP_KOKKOS_GPU template Kokkos::Viewnmax); + kokkosable = 1; + + dvector_flag = 0; + for (int nv = 0; nv < nvalue; nv++) + if (styles[nv] == DVEC) dvector_flag = 1; + + atom_init_flag = 0; } /* ---------------------------------------------------------------------- */ @@ -68,19 +74,20 @@ void FixPropertyAtomKokkos::grow_arrays(int nmax) { for (int nv = 0; nv < nvalue; nv++) { if (styles[nv] == MOLECULE) { - atomKK->sync(Device,MOLECULE_MASK); - memoryKK->grow_kokkos(atomKK->k_molecule,atomKK->molecule,nmax,"atom:molecule"); - size_t nbytes = (nmax-nmax_old) * sizeof(tagint); - atomKK->modified(Device,MOLECULE_MASK); + if (!atom_init_flag) this->modified(Host,MOLECULE_MASK); + else atomKK->sync(Device,MOLECULE_MASK); + memoryKK->grow_kokkos(atomKK->k_molecule,atom->molecule,nmax,"atom:molecule"); + if (atom_init_flag) atomKK->modified(Device,MOLECULE_MASK); } else if (styles[nv] == CHARGE) { - atomKK->sync(Device,Q_MASK); - memoryKK->grow_kokkos(atomKK->k_q,atomKK->q,nmax,"atom:q"); - size_t nbytes = (nmax-nmax_old) * sizeof(double); - atomKK->modified(Device,Q_MASK); + if (!atom_init_flag) this->modified(Host,Q_MASK); + else atomKK->sync(Device,Q_MASK); + memoryKK->grow_kokkos(atomKK->k_q,atom->q,nmax,"atom:q"); + if (atom_init_flag) atomKK->modified(Device,Q_MASK); } else if (styles[nv] == RMASS) { - atomKK->sync(Device,MOLECULE_MASK); - memoryKK->grow_kokkos(atomKK->k_rmass,atomKK->rmass,nmax,"atom:rmass"); - atomKK->modified(Device,RMASS_MASK); + if (!atom_init_flag) this->modified(Host,RMASS_MASK); + else atomKK->sync(Device,RMASS_MASK); + memoryKK->grow_kokkos(atomKK->k_rmass,atom->rmass,nmax,"atom:rmass"); + if (atom_init_flag) atomKK->modified(Device,RMASS_MASK); } else if (styles[nv] == TEMPERATURE) { memory->grow(atom->temperature, nmax, "atom:temperature"); size_t nbytes = (nmax - nmax_old) * sizeof(double); @@ -94,10 +101,11 @@ void FixPropertyAtomKokkos::grow_arrays(int nmax) size_t nbytes = (nmax-nmax_old) * sizeof(int); memset(&atom->ivector[index[nv]][nmax_old],0,nbytes); } else if (styles[nv] == DVEC) { - atomKK->sync(Device,DVECTOR_MASK); - memoryKK->grow_kokkos(atomKK->k_dvector,atomKK->dvector,atomKK->k_dvector.extent(0),nmax, + if (!atom_init_flag) this->modified(Host,DVECTOR_MASK); + else atomKK->sync(Device,DVECTOR_MASK); + memoryKK->grow_kokkos(atomKK->k_dvector,atom->dvector,atomKK->k_dvector.extent(0),nmax, "atom:dvector"); - atomKK->modified(Device,DVECTOR_MASK); + if (atom_init_flag) atomKK->modified(Device,DVECTOR_MASK); } else if (styles[nv] == IARRAY) { memory->grow(atom->iarray[index[nv]], nmax, cols[nv], "atom:iarray"); size_t nbytes = (size_t) (nmax - nmax_old) * cols[nv] * sizeof(int); @@ -110,3 +118,63 @@ void FixPropertyAtomKokkos::grow_arrays(int nmax) } nmax_old = nmax; } + +/* ---------------------------------------------------------------------- */ + +void FixPropertyAtomKokkos::sync(ExecutionSpace space, unsigned int mask) +{ + if (space == Device) { + + if (molecule_flag && (mask & MOLECULE_MASK)) atomKK->k_molecule.sync(); + if (q_flag && (mask & Q_MASK)) atomKK->k_q.sync(); + if (rmass_flag && (mask & RMASS_MASK)) {atomKK->k_rmass.sync();} + if (dvector_flag && (mask & DVECTOR_MASK)) atomKK->k_dvector.sync(); + } else { + if (molecule_flag && (mask & MOLECULE_MASK)) atomKK->k_molecule.sync(); + if (q_flag && (mask & Q_MASK)) atomKK->k_q.sync(); + if (rmass_flag && (mask & RMASS_MASK)) atomKK->k_rmass.sync(); + if (dvector_flag && (mask & DVECTOR_MASK)) atomKK->k_dvector.sync(); + } +} + +/* ---------------------------------------------------------------------- */ + +void FixPropertyAtomKokkos::sync_overlapping_device(ExecutionSpace space, unsigned int mask) +{ + if (space == Device) { + if ((mask & MOLECULE_MASK) && atomKK->k_molecule.need_sync()) + atomKK->avecKK->perform_async_copy(atomKK->k_molecule,space); + if ((mask & Q_MASK) && atomKK->k_q.need_sync()) + atomKK->avecKK->perform_async_copy(atomKK->k_q,space); + if ((mask & RMASS_MASK) && atomKK->k_rmass.need_sync()) + atomKK->avecKK->perform_async_copy(atomKK->k_rmass,space); + if ((mask & DVECTOR_MASK) && atomKK->k_dvector.need_sync()) + atomKK->avecKK->perform_async_copy(atomKK->k_dvector,space); + } else { + if ((mask & MOLECULE_MASK) && atomKK->k_molecule.need_sync()) + atomKK->avecKK->perform_async_copy(atomKK->k_molecule,space); + if ((mask & Q_MASK) && atomKK->k_q.need_sync()) + atomKK->avecKK->perform_async_copy(atomKK->k_q,space); + if ((mask & RMASS_MASK) && atomKK->k_rmass.need_sync()) + atomKK->avecKK->perform_async_copy(atomKK->k_rmass,space); + if ((mask & DVECTOR_MASK) && atomKK->k_dvector.need_sync()) + atomKK->avecKK->perform_async_copy(atomKK->k_dvector,space); + } +} + +/* ---------------------------------------------------------------------- */ + +void FixPropertyAtomKokkos::modified(ExecutionSpace space, unsigned int mask) +{ + if (space == Device) { + if (molecule_flag && (mask & MOLECULE_MASK)) atomKK->k_molecule.modify(); + if (q_flag && (mask & Q_MASK)) atomKK->k_q.modify(); + if (rmass_flag && (mask & RMASS_MASK)) atomKK->k_rmass.modify(); + if (dvector_flag && (mask & DVECTOR_MASK)) atomKK->k_dvector.modify(); + } else { + if (molecule_flag && (mask & MOLECULE_MASK)) atomKK->k_molecule.modify(); + if (q_flag && (mask & Q_MASK)) atomKK->k_q.modify(); + if (rmass_flag && (mask & RMASS_MASK)) atomKK->k_rmass.modify(); + if (dvector_flag && (mask & DVECTOR_MASK)) atomKK->k_dvector.modify(); + } +} diff --git a/src/KOKKOS/fix_property_atom_kokkos.h b/src/KOKKOS/fix_property_atom_kokkos.h index 29b07b1f5b..74a20a28b5 100644 --- a/src/KOKKOS/fix_property_atom_kokkos.h +++ b/src/KOKKOS/fix_property_atom_kokkos.h @@ -22,6 +22,7 @@ FixStyle(property/atom/kk,FixPropertyAtomKokkos); #define LMP_FIX_PROPERTY_ATOM_KOKKOS_H #include "fix_property_atom.h" +#include "atom_vec_kokkos.h" namespace LAMMPS_NS { @@ -31,6 +32,15 @@ class FixPropertyAtomKokkos : public FixPropertyAtom { ~FixPropertyAtomKokkos() override; void grow_arrays(int) override; + + void sync(ExecutionSpace space, unsigned int mask); + void modified(ExecutionSpace space, unsigned int mask); + void sync_overlapping_device(ExecutionSpace space, unsigned int mask); + + int atom_init_flag; + + private: + int dvector_flag; }; } diff --git a/src/KOKKOS/kokkos_base.h b/src/KOKKOS/kokkos_base.h index 7d9ecb5d80..1e22a38657 100644 --- a/src/KOKKOS/kokkos_base.h +++ b/src/KOKKOS/kokkos_base.h @@ -41,11 +41,6 @@ class KokkosBase { int, int *) {return 0;}; virtual void unpack_forward_comm_fix_kokkos(int, int, DAT::tdual_xfloat_1d &) {} - - // Region - virtual void match_all_kokkos(int, DAT::tdual_int_1d) {} - - // Fix virtual int pack_exchange_kokkos(const int & /*nsend*/, DAT::tdual_xfloat_2d & /*k_buf*/, DAT::tdual_int_1d /*k_sendlist*/, DAT::tdual_int_1d /*k_copylist*/, @@ -54,6 +49,9 @@ class KokkosBase { DAT::tdual_int_1d & /*indices*/, int /*nrecv*/, ExecutionSpace /*space*/) {} + // Region + virtual void match_all_kokkos(int, DAT::tdual_int_1d) {} + using KeyViewType = DAT::t_x_array; using BinOp = BinOp3DLAMMPS; virtual void diff --git a/src/fix_property_atom.cpp b/src/fix_property_atom.cpp index 994b4f0f19..3a53110839 100644 --- a/src/fix_property_atom.cpp +++ b/src/fix_property_atom.cpp @@ -198,16 +198,24 @@ FixPropertyAtom::FixPropertyAtom(LAMMPS *lmp, int narg, char **arg) : astyle = utils::strdup(atom->atom_style); - // perform initial allocation of atom-based array // register with Atom class - nmax_old = 0; - if (!lmp->kokkos) FixPropertyAtom::grow_arrays(atom->nmax); atom->add_callback(Atom::GROW); atom->add_callback(Atom::RESTART); if (border) atom->add_callback(Atom::BORDER); } + +/* ---------------------------------------------------------------------- */ + +void FixPropertyAtom::post_constructor() +{ + // perform initial allocation of atom-based array + + nmax_old = 0; + grow_arrays(atom->nmax); +} + /* ---------------------------------------------------------------------- */ FixPropertyAtom::~FixPropertyAtom() diff --git a/src/fix_property_atom.h b/src/fix_property_atom.h index 92497d6188..c50b6049dc 100644 --- a/src/fix_property_atom.h +++ b/src/fix_property_atom.h @@ -27,6 +27,7 @@ namespace LAMMPS_NS { class FixPropertyAtom : public Fix { public: FixPropertyAtom(class LAMMPS *, int, char **); + void post_constructor() override; ~FixPropertyAtom() override; int setmask() override; void init() override; From b24e1e10a0262edd4d30b4a71bcb54e0fe270c00 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 9 Oct 2023 22:24:22 -0400 Subject: [PATCH 158/219] reposition the cursor for the context menu, but only if there is no selection --- tools/lammps-gui/CMakeLists.txt | 2 +- tools/lammps-gui/codeeditor.cpp | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/tools/lammps-gui/CMakeLists.txt b/tools/lammps-gui/CMakeLists.txt index be7bcff10a..44fc45c0e2 100644 --- a/tools/lammps-gui/CMakeLists.txt +++ b/tools/lammps-gui/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.16) -project(lammps-gui VERSION 1.5.8 LANGUAGES CXX) +project(lammps-gui VERSION 1.5.9 LANGUAGES CXX) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTOMOC ON) diff --git a/tools/lammps-gui/codeeditor.cpp b/tools/lammps-gui/codeeditor.cpp index 46b970bd0a..af6e3b3790 100644 --- a/tools/lammps-gui/codeeditor.cpp +++ b/tools/lammps-gui/codeeditor.cpp @@ -668,7 +668,9 @@ void CodeEditor::lineNumberAreaPaintEvent(QPaintEvent *event) void CodeEditor::contextMenuEvent(QContextMenuEvent *event) { - // reposition the cursor here? + // reposition the cursor here, but only if there is no active selection + if (!textCursor().hasSelection()) setTextCursor(cursorForPosition(event->pos())); + QString page, help; find_help(page, help); From b816029d709cded4c2955b08d9113495e6cb9300 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 9 Oct 2023 23:32:22 -0400 Subject: [PATCH 159/219] pop down completion list when all characters have been deleted --- tools/lammps-gui/codeeditor.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tools/lammps-gui/codeeditor.cpp b/tools/lammps-gui/codeeditor.cpp index af6e3b3790..34193bc320 100644 --- a/tools/lammps-gui/codeeditor.cpp +++ b/tools/lammps-gui/codeeditor.cpp @@ -577,6 +577,10 @@ void CodeEditor::keyPressEvent(QKeyEvent *event) --begin; } if (((cursor.positionInBlock() - begin) > 2) || (line[begin + 1] == '$')) runCompletion(); + if (current_comp && current_comp->popup()->isVisible() && + ((cursor.positionInBlock() - begin) < 2)) { + current_comp->popup()->hide(); + } } } From 2b1985f755fb5019f03d4e76b6174808e7f543c1 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 10 Oct 2023 11:36:49 -0400 Subject: [PATCH 160/219] restore GNU make build capability for ML-PACE --- lib/pace/Makefile | 6 +++--- lib/pace/Makefile.lammps | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/pace/Makefile b/lib/pace/Makefile index 5a1588ef93..37f00ee70e 100644 --- a/lib/pace/Makefile +++ b/lib/pace/Makefile @@ -1,4 +1,5 @@ SHELL = /bin/sh +CMAKE= cmake # ------ FILES ------ @@ -35,7 +36,7 @@ lib: $(OBJ) lib-yaml-cpp lib-yaml-cpp: - cd $(YAML_CPP_PATH) && $(MAKE) lib + cd $(YAML_CPP_PATH) && $(CMAKE) . && $(MAKE) all # ------ COMPILE RULES ------ @@ -45,9 +46,8 @@ lib-yaml-cpp: # ------ CLEAN ------ clean-all: -rm -f *~ $(OBJ) $(LIB) - cd $(YAML_CPP_PATH) && $(MAKE) clean-all + cd $(YAML_CPP_PATH) && $(MAKE) clean clean-build: -rm -f *~ $(OBJ) - cd $(YAML_CPP_PATH) && $(MAKE) clean-build diff --git a/lib/pace/Makefile.lammps b/lib/pace/Makefile.lammps index 6411e49a07..1c549e31d0 100644 --- a/lib/pace/Makefile.lammps +++ b/lib/pace/Makefile.lammps @@ -1,3 +1,3 @@ pace_SYSINC =-I../../lib/pace/src/ML-PACE -I../../lib/pace/src/yaml-cpp/include -I../../lib/pace/src/wigner-cpp/include -DEXTRA_C_PROJECTIONS -pace_SYSLIB = -L../../lib/pace/ -lpace -L../../lib/pace/src/yaml-cpp/ -lyaml-cpp +pace_SYSLIB = -L../../lib/pace/ -lpace -L../../lib/pace/src/yaml-cpp/ -lyaml-cpp-pace pace_SYSPATH = From 07a03336702ff90501b2158b1ab14d6f1f2391fe Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 10 Oct 2023 13:53:56 -0400 Subject: [PATCH 161/219] prevent potential memory leak --- src/compute_msd_chunk.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/compute_msd_chunk.cpp b/src/compute_msd_chunk.cpp index 07234ecfdb..6e7436d6ad 100644 --- a/src/compute_msd_chunk.cpp +++ b/src/compute_msd_chunk.cpp @@ -27,8 +27,8 @@ using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ ComputeMSDChunk::ComputeMSDChunk(LAMMPS *lmp, int narg, char **arg) : - ComputeChunk(lmp, narg, arg), id_fix(nullptr), massproc(nullptr), masstotal(nullptr), - com(nullptr), comall(nullptr), msd(nullptr) + ComputeChunk(lmp, narg, arg), id_fix(nullptr), fix(nullptr), massproc(nullptr), + masstotal(nullptr), com(nullptr), comall(nullptr), msd(nullptr) { if (narg != 4) error->all(FLERR, "Illegal compute msd/chunk command"); @@ -196,6 +196,12 @@ void ComputeMSDChunk::compute_array() void ComputeMSDChunk::allocate() { ComputeChunk::allocate(); + memory->destroy(massproc); + memory->destroy(masstotal); + memory->destroy(com); + memory->destroy(comall); + memory->destroy(msd); + memory->create(massproc, nchunk, "msd/chunk:massproc"); memory->create(masstotal, nchunk, "msd/chunk:masstotal"); memory->create(com, nchunk, 3, "msd/chunk:com"); From 84eab70fb4252eb691d52000dae1ce2280ffb2ea Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 10 Oct 2023 22:18:41 -0400 Subject: [PATCH 162/219] must select entire non-blank string under cursor for completion insertions --- tools/lammps-gui/codeeditor.cpp | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/tools/lammps-gui/codeeditor.cpp b/tools/lammps-gui/codeeditor.cpp index 34193bc320..7a1624c192 100644 --- a/tools/lammps-gui/codeeditor.cpp +++ b/tools/lammps-gui/codeeditor.cpp @@ -564,7 +564,7 @@ void CodeEditor::keyPressEvent(QKeyEvent *event) // process key event in parent class QPlainTextEdit::keyPressEvent(event); - // if enabled, try pop up completion automatically after 3 characters + // if enabled, try pop up completion automatically after 2 characters if (automatic_completion) { auto cursor = textCursor(); auto line = cursor.block().text(); @@ -990,8 +990,26 @@ void CodeEditor::insertCompletedCommand(const QString &completion) { auto *completer = qobject_cast(sender()); if (completer->widget() != this) return; + + // select the entire word (non-space text) under the cursor + // we need to do it in this compicated way, since QTextCursor does not recognize + // special characters as part of a word. auto cursor = textCursor(); - cursor.movePosition(QTextCursor::StartOfWord, QTextCursor::KeepAnchor); + auto line = cursor.block().text(); + int begin = cursor.positionInBlock(); + do { + if (line[begin].isSpace()) break; + --begin; + } while (begin >= 0); + + int end = begin + 1; + while (end < line.length()) { + if (line[end].isSpace()) break; + ++end; + } + + cursor.setPosition(cursor.position() - cursor.positionInBlock() + begin + 1); + cursor.movePosition(QTextCursor::NextCharacter, QTextCursor::KeepAnchor, end - begin); cursor.insertText(completion); setTextCursor(cursor); } From 86a5d6bb151c196bb1843d947d901fe228625669 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 11 Oct 2023 02:05:23 -0400 Subject: [PATCH 163/219] must re-initialized threads also for neigbor lists --- src/OPENMP/npair_omp.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/OPENMP/npair_omp.h b/src/OPENMP/npair_omp.h index 318fddfd54..7249c59406 100644 --- a/src/OPENMP/npair_omp.h +++ b/src/OPENMP/npair_omp.h @@ -32,6 +32,7 @@ namespace LAMMPS_NS { // get access to number of threads and per-thread data structures via FixOMP #define NPAIR_OMP_INIT \ const int nthreads = comm->nthreads; \ + omp_set_num_threads(nthreads); \ const int ifix = modify->find_fix("package_omp") // get thread id and then assign each thread a fixed chunk of atoms From cc5c5bbd498553dc529f94516401a24979b65a79 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 11 Oct 2023 02:12:03 -0400 Subject: [PATCH 164/219] block waiting for end of stdout data not more than a second --- tools/lammps-gui/stdcapture.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tools/lammps-gui/stdcapture.cpp b/tools/lammps-gui/stdcapture.cpp index 428277cc10..b09aebf053 100644 --- a/tools/lammps-gui/stdcapture.cpp +++ b/tools/lammps-gui/stdcapture.cpp @@ -77,6 +77,7 @@ bool StdCapture::EndCapture() int bytesRead; bool fd_blocked; + int maxwait = 100; do { bytesRead = 0; @@ -93,9 +94,10 @@ bool StdCapture::EndCapture() buf[bytesRead] = 0; m_captured += buf; } else if (bytesRead < 0) { - fd_blocked = ((errno == EAGAIN) || (errno == EWOULDBLOCK) || (errno == EINTR)); + fd_blocked = ((errno == EAGAIN) || (errno == EWOULDBLOCK) || (errno == EINTR)) && (maxwait > 0); if (fd_blocked) std::this_thread::sleep_for(std::chrono::milliseconds(10)); + --maxwait; } } while (fd_blocked || (bytesRead == (bufSize - 1))); m_capturing = false; From eff74405c1382b4d9b20734e62134333bcf5f88d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 11 Oct 2023 02:16:23 -0400 Subject: [PATCH 165/219] don't replace end of line character from completion --- tools/lammps-gui/codeeditor.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/lammps-gui/codeeditor.cpp b/tools/lammps-gui/codeeditor.cpp index 7a1624c192..b7a14871b7 100644 --- a/tools/lammps-gui/codeeditor.cpp +++ b/tools/lammps-gui/codeeditor.cpp @@ -1009,7 +1009,7 @@ void CodeEditor::insertCompletedCommand(const QString &completion) } cursor.setPosition(cursor.position() - cursor.positionInBlock() + begin + 1); - cursor.movePosition(QTextCursor::NextCharacter, QTextCursor::KeepAnchor, end - begin); + cursor.movePosition(QTextCursor::NextCharacter, QTextCursor::KeepAnchor, end - begin - 1); cursor.insertText(completion); setTextCursor(cursor); } From bb7e8c66edfedccb7f192d06a6a1595f2c931b13 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 11 Oct 2023 08:26:50 -0400 Subject: [PATCH 166/219] clarify --- doc/src/pair_reaxff.rst | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/doc/src/pair_reaxff.rst b/doc/src/pair_reaxff.rst index 4dac9baf85..067eb3afc3 100644 --- a/doc/src/pair_reaxff.rst +++ b/doc/src/pair_reaxff.rst @@ -43,22 +43,22 @@ Examples Description """"""""""" -Style *reaxff* computes the ReaxFF potential of van Duin, Goddard and -co-workers. ReaxFF uses distance-dependent bond-order functions to +Pair style *reaxff* computes the ReaxFF potential of van Duin, Goddard +and co-workers. ReaxFF uses distance-dependent bond-order functions to represent the contributions of chemical bonding to the potential -energy. There is more than one version of ReaxFF. The version +energy. There is more than one version of ReaxFF. The version implemented in LAMMPS uses the functional forms documented in the supplemental information of the following paper: -:ref:`(Chenoweth et al., 2008) `. The version integrated -into LAMMPS matches the version of ReaxFF From Summer 2010. For more -technical details about the pair reaxff implementation of ReaxFF, see -the :ref:`(Aktulga) ` paper. The *reaxff* style was initially -implemented as a stand-alone C code and is now converted to C++ and -integrated into LAMMPS as a package. +:ref:`(Chenoweth et al., 2008) ` and matches the +version of the reference ReaxFF implementation from Summer 2010. For +more technical details about the implementation of ReaxFF in pair style +*reaxff*, see the :ref:`(Aktulga) ` paper. The *reaxff* style +was initially implemented as a stand-alone C code and is now converted +to C++ and integrated into LAMMPS as a package. The *reaxff/kk* style is a Kokkos version of the ReaxFF potential that -is derived from the *reaxff* style. The Kokkos version can run on GPUs -and can also use OpenMP multithreading. For more information about the +is derived from the *reaxff* style. The Kokkos version can run on GPUs +and can also use OpenMP multithreading. For more information about the Kokkos package, see :doc:`Packages details ` and :doc:`Speed kokkos ` doc pages. One important consideration when using the *reaxff/kk* style is the choice of either From 45172d33a9c2296111e341260912b5cb380e5aac Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 11 Oct 2023 09:20:05 -0400 Subject: [PATCH 167/219] use potential file name distributed with LAMMPS in examples --- doc/src/pair_ilp_tmd.rst | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/doc/src/pair_ilp_tmd.rst b/doc/src/pair_ilp_tmd.rst index 482d75a100..70a4768389 100644 --- a/doc/src/pair_ilp_tmd.rst +++ b/doc/src/pair_ilp_tmd.rst @@ -22,12 +22,12 @@ Examples .. code-block:: LAMMPS pair_style hybrid/overlay ilp/tmd 16.0 1 - pair_coeff * * ilp/tmd TMD.ILP Mo S S + pair_coeff * * ilp/tmd MoS2.ILP Mo S S pair_style hybrid/overlay sw/mod sw/mod ilp/tmd 16.0 pair_coeff * * sw/mod 1 tmd.sw.mod Mo S S NULL NULL NULL pair_coeff * * sw/mod 2 tmd.sw.mod NULL NULL NULL Mo S S - pair_coeff * * ilp/tmd TMD.ILP Mo S S Mo S S + pair_coeff * * ilp/tmd MoS2.ILP Mo S S Mo S S Description """"""""""" @@ -69,7 +69,7 @@ calculating the normals. each atom `i`, its six nearest neighboring atoms belonging to the same sub-layer are chosen to define the normal vector `{\bf n}_i`. -The parameter file (e.g. TMD.ILP), is intended for use with *metal* +The parameter file (e.g. MoS2.ILP), is intended for use with *metal* :doc:`units `, with energies in meV. Two additional parameters, *S*, and *rcut* are included in the parameter file. *S* is designed to facilitate scaling of energies. *rcut* is designed to build the neighbor @@ -77,7 +77,7 @@ list for calculating the normals for each atom pair. .. note:: - The parameters presented in the parameter file (e.g. TMD.ILP), + The parameters presented in the parameter file (e.g. MoS2.ILP), are fitted with taper function by setting the cutoff equal to 16.0 Angstrom. Using different cutoff or taper function should be careful. These parameters provide a good description in both short- and long-range @@ -133,10 +133,10 @@ if LAMMPS was built with that package. See the :doc:`Build package This pair style requires the newton setting to be *on* for pair interactions. -The TMD.ILP potential file provided with LAMMPS (see the potentials +The MoS2.ILP potential file provided with LAMMPS (see the potentials directory) are parameterized for *metal* units. You can use this potential with any LAMMPS units, but you would need to create your own -custom TMD.ILP potential file with coefficients listed in the appropriate +custom MoS2.ILP potential file with coefficients listed in the appropriate units, if your simulation does not use *metal* units. Related commands From fbdd61e28c814ba21a1c2e774386d1f469fc0981 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 11 Oct 2023 18:15:13 -0400 Subject: [PATCH 168/219] enable spacefilling sphere option also for systems with per-atom radius --- tools/lammps-gui/imageviewer.cpp | 14 +++++++++----- tools/lammps-gui/imageviewer.h | 2 +- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/tools/lammps-gui/imageviewer.cpp b/tools/lammps-gui/imageviewer.cpp index 86be0b66df..ee81f61253 100644 --- a/tools/lammps-gui/imageviewer.cpp +++ b/tools/lammps-gui/imageviewer.cpp @@ -131,7 +131,7 @@ static const QString blank(" "); ImageViewer::ImageViewer(const QString &fileName, LammpsWrapper *_lammps, QWidget *parent) : QDialog(parent), menuBar(new QMenuBar), imageLabel(new QLabel), scrollArea(new QScrollArea), - lammps(_lammps), group("all"), filename(fileName), useelements(false) + lammps(_lammps), group("all"), filename(fileName), useelements(false), usediameter(false) { imageLabel->setBackgroundRole(QPalette::Base); imageLabel->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored); @@ -268,7 +268,7 @@ ImageViewer::ImageViewer(const QString &fileName, LammpsWrapper *_lammps, QWidge // properties directly since lookup in reset_view() will have failed dobox->setChecked(showbox); dovdw->setChecked(vdwfactor > 1.0); - dovdw->setEnabled(useelements); + dovdw->setEnabled(useelements || usediameter); doaxes->setChecked(showaxes); dossao->setChecked(usessao); doanti->setChecked(antialias); @@ -435,7 +435,7 @@ void ImageViewer::createImage() dumpcmd += "'" + dumpfile.fileName() + "'"; settings.beginGroup("snapshot"); - int hhrot = (hrot > 180) ? 360 - hrot : hrot; + int hhrot = (hrot > 180) ? 360 - hrot : hrot; // determine elements from masses and set their covalent radii int ntypes = lammps->extract_setting("ntypes"); @@ -454,9 +454,10 @@ void ImageViewer::createImage() adiams += QString("adiam %1 %2 ").arg(i).arg(vdwfactor * pte_vdw_radius[idx]); } } + usediameter = lammps->extract_setting("radius_flag") != 0; // adjust pushbutton state and clear adiams string to disable VDW display, if needed - if (useelements) { + if (useelements || usediameter) { auto *button = findChild("vdw"); if (button) button->setEnabled(true); } else { @@ -469,7 +470,10 @@ void ImageViewer::createImage() dumpcmd += blank + "element"; else dumpcmd += blank + settings.value("color", "type").toString(); - dumpcmd += blank + settings.value("diameter", "type").toString(); + if (usediameter && (vdwfactor > 1.0)) + dumpcmd += blank + "diameter"; + else + dumpcmd += blank + settings.value("diameter", "type").toString(); dumpcmd += QString(" size %1 %2").arg(xsize).arg(ysize); dumpcmd += QString(" zoom %1").arg(zoom); dumpcmd += " shiny 0.5 "; diff --git a/tools/lammps-gui/imageviewer.h b/tools/lammps-gui/imageviewer.h index 8946c6cc8b..1be7790666 100644 --- a/tools/lammps-gui/imageviewer.h +++ b/tools/lammps-gui/imageviewer.h @@ -88,7 +88,7 @@ private: int xsize, ysize; int hrot, vrot; double zoom, vdwfactor; - bool showbox, showaxes, antialias, usessao, useelements; + bool showbox, showaxes, antialias, usessao, useelements, usediameter; }; #endif From 9b108a631bb4b7361855b755ce6accfd657bbbf8 Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Wed, 11 Oct 2023 16:36:15 -0600 Subject: [PATCH 169/219] Do not zero forces in pair if using hybrid/overlay --- src/KOKKOS/pair_buck_coul_cut_kokkos.h | 13 +-- src/KOKKOS/pair_buck_coul_long_kokkos.h | 46 ++++++----- src/KOKKOS/pair_buck_kokkos.h | 15 ++-- src/KOKKOS/pair_coul_cut_kokkos.h | 13 +-- src/KOKKOS/pair_coul_debye_kokkos.h | 13 +-- src/KOKKOS/pair_coul_long_kokkos.h | 46 ++++++----- src/KOKKOS/pair_kokkos.h | 81 +++++++++++-------- ...ir_lj_charmm_coul_charmm_implicit_kokkos.h | 46 ++++++----- .../pair_lj_charmm_coul_charmm_kokkos.h | 46 ++++++----- src/KOKKOS/pair_lj_charmm_coul_long_kokkos.h | 46 ++++++----- src/KOKKOS/pair_lj_class2_coul_cut_kokkos.h | 13 +-- src/KOKKOS/pair_lj_class2_coul_long_kokkos.h | 46 ++++++----- src/KOKKOS/pair_lj_class2_kokkos.h | 15 ++-- src/KOKKOS/pair_lj_cut_coul_cut_kokkos.h | 13 +-- src/KOKKOS/pair_lj_cut_coul_debye_kokkos.h | 13 +-- src/KOKKOS/pair_lj_cut_coul_dsf_kokkos.h | 13 +-- src/KOKKOS/pair_lj_cut_coul_long_kokkos.h | 46 ++++++----- src/KOKKOS/pair_lj_cut_kokkos.h | 15 ++-- src/KOKKOS/pair_lj_expand_coul_long_kokkos.h | 46 ++++++----- src/KOKKOS/pair_lj_expand_kokkos.h | 15 ++-- .../pair_lj_gromacs_coul_gromacs_kokkos.h | 46 ++++++----- src/KOKKOS/pair_lj_gromacs_kokkos.h | 46 ++++++----- src/KOKKOS/pair_lj_spica_kokkos.h | 15 ++-- src/KOKKOS/pair_morse_kokkos.h | 15 ++-- src/KOKKOS/pair_table_kokkos.cpp | 12 +-- src/KOKKOS/pair_table_kokkos.h | 51 ++++++------ src/KOKKOS/pair_yukawa_kokkos.h | 19 +++-- src/KOKKOS/pair_zbl_kokkos.h | 15 ++-- 28 files changed, 465 insertions(+), 354 deletions(-) diff --git a/src/KOKKOS/pair_buck_coul_cut_kokkos.h b/src/KOKKOS/pair_buck_coul_cut_kokkos.h index b91348d557..9b6cc31898 100644 --- a/src/KOKKOS/pair_buck_coul_cut_kokkos.h +++ b/src/KOKKOS/pair_buck_coul_cut_kokkos.h @@ -112,15 +112,18 @@ class PairBuckCoulCutKokkos : public PairBuckCoulCut { void allocate() override; - friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; friend struct PairComputeFunctor; friend struct PairComputeFunctor; - friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; friend struct PairComputeFunctor; friend struct PairComputeFunctor; - friend EV_FLOAT pair_compute_neighlist(PairBuckCoulCutKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist(PairBuckCoulCutKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist(PairBuckCoulCutKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairBuckCoulCutKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairBuckCoulCutKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairBuckCoulCutKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairBuckCoulCutKokkos*,NeighListKokkos*); friend EV_FLOAT pair_compute(PairBuckCoulCutKokkos*, NeighListKokkos*); friend void pair_virial_fdotr_compute(PairBuckCoulCutKokkos*); diff --git a/src/KOKKOS/pair_buck_coul_long_kokkos.h b/src/KOKKOS/pair_buck_coul_long_kokkos.h index b776a84e3c..bed9b0d0f8 100644 --- a/src/KOKKOS/pair_buck_coul_long_kokkos.h +++ b/src/KOKKOS/pair_buck_coul_long_kokkos.h @@ -115,27 +115,33 @@ class PairBuckCoulLongKokkos : public PairBuckCoulLong { void allocate() override; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend EV_FLOAT pair_compute_neighlist >(PairBuckCoulLongKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairBuckCoulLongKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairBuckCoulLongKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute >(PairBuckCoulLongKokkos*, + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend EV_FLOAT pair_compute_neighlist>(PairBuckCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairBuckCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairBuckCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairBuckCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute>(PairBuckCoulLongKokkos*, NeighListKokkos*); - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend EV_FLOAT pair_compute_neighlist >(PairBuckCoulLongKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairBuckCoulLongKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairBuckCoulLongKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute >(PairBuckCoulLongKokkos*, + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend EV_FLOAT pair_compute_neighlist>(PairBuckCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairBuckCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairBuckCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairBuckCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute>(PairBuckCoulLongKokkos*, NeighListKokkos*); friend void pair_virial_fdotr_compute(PairBuckCoulLongKokkos*); diff --git a/src/KOKKOS/pair_buck_kokkos.h b/src/KOKKOS/pair_buck_kokkos.h index 364716453b..15325cd56a 100644 --- a/src/KOKKOS/pair_buck_kokkos.h +++ b/src/KOKKOS/pair_buck_kokkos.h @@ -91,16 +91,19 @@ class PairBuckKokkos : public PairBuck { int nlocal,nall,eflag,vflag; void allocate() override; - friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; friend struct PairComputeFunctor; friend struct PairComputeFunctor; - friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; friend struct PairComputeFunctor; friend struct PairComputeFunctor; - friend EV_FLOAT pair_compute_neighlist(PairBuckKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist(PairBuckKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist(PairBuckKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute(PairBuckKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairBuckKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairBuckKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairBuckKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairBuckKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute(PairBuckKokkos*,NeighListKokkos*); friend void pair_virial_fdotr_compute(PairBuckKokkos*); }; diff --git a/src/KOKKOS/pair_coul_cut_kokkos.h b/src/KOKKOS/pair_coul_cut_kokkos.h index 6626889660..3e0501edd9 100644 --- a/src/KOKKOS/pair_coul_cut_kokkos.h +++ b/src/KOKKOS/pair_coul_cut_kokkos.h @@ -112,15 +112,18 @@ class PairCoulCutKokkos : public PairCoulCut { double qqrd2e; void allocate() override; - friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; friend struct PairComputeFunctor; friend struct PairComputeFunctor; - friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; friend struct PairComputeFunctor; friend struct PairComputeFunctor; - friend EV_FLOAT pair_compute_neighlist(PairCoulCutKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist(PairCoulCutKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist(PairCoulCutKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairCoulCutKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairCoulCutKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairCoulCutKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairCoulCutKokkos*,NeighListKokkos*); friend EV_FLOAT pair_compute(PairCoulCutKokkos*, NeighListKokkos*); friend void pair_virial_fdotr_compute(PairCoulCutKokkos*); diff --git a/src/KOKKOS/pair_coul_debye_kokkos.h b/src/KOKKOS/pair_coul_debye_kokkos.h index b6bed9d557..d239291a25 100644 --- a/src/KOKKOS/pair_coul_debye_kokkos.h +++ b/src/KOKKOS/pair_coul_debye_kokkos.h @@ -112,15 +112,18 @@ class PairCoulDebyeKokkos : public PairCoulDebye { double qqrd2e; void allocate() override; - friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; friend struct PairComputeFunctor; friend struct PairComputeFunctor; - friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; friend struct PairComputeFunctor; friend struct PairComputeFunctor; - friend EV_FLOAT pair_compute_neighlist(PairCoulDebyeKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist(PairCoulDebyeKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist(PairCoulDebyeKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairCoulDebyeKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairCoulDebyeKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairCoulDebyeKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairCoulDebyeKokkos*,NeighListKokkos*); friend EV_FLOAT pair_compute(PairCoulDebyeKokkos*, NeighListKokkos*); friend void pair_virial_fdotr_compute(PairCoulDebyeKokkos*); diff --git a/src/KOKKOS/pair_coul_long_kokkos.h b/src/KOKKOS/pair_coul_long_kokkos.h index fcb1402028..232cdbb6df 100644 --- a/src/KOKKOS/pair_coul_long_kokkos.h +++ b/src/KOKKOS/pair_coul_long_kokkos.h @@ -114,27 +114,33 @@ class PairCoulLongKokkos : public PairCoulLong { void allocate() override; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend EV_FLOAT pair_compute_neighlist >(PairCoulLongKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairCoulLongKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairCoulLongKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute >(PairCoulLongKokkos*, + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend EV_FLOAT pair_compute_neighlist>(PairCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute>(PairCoulLongKokkos*, NeighListKokkos*); - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend EV_FLOAT pair_compute_neighlist >(PairCoulLongKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairCoulLongKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairCoulLongKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute >(PairCoulLongKokkos*, + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend EV_FLOAT pair_compute_neighlist>(PairCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute>(PairCoulLongKokkos*, NeighListKokkos*); friend void pair_virial_fdotr_compute(PairCoulLongKokkos*); diff --git a/src/KOKKOS/pair_kokkos.h b/src/KOKKOS/pair_kokkos.h index 2c2a622791..d3c766f5ae 100644 --- a/src/KOKKOS/pair_kokkos.h +++ b/src/KOKKOS/pair_kokkos.h @@ -50,7 +50,7 @@ struct DoCoul<1> { //Specialisation for Neighborlist types Half, HalfThread, Full -template +template struct PairComputeFunctor { typedef typename PairStyle::device_type device_type ; typedef ArrayTypes AT; @@ -137,7 +137,7 @@ struct PairComputeFunctor { F_FLOAT fytmp = 0.0; F_FLOAT fztmp = 0.0; - if (NEIGHFLAG == FULL) { + if (NEIGHFLAG == FULL && ZEROFLAG) { f(i,0) = 0.0; f(i,1) = 0.0; f(i,2) = 0.0; @@ -211,7 +211,7 @@ struct PairComputeFunctor { F_FLOAT fytmp = 0.0; F_FLOAT fztmp = 0.0; - if (NEIGHFLAG == FULL) { + if (NEIGHFLAG == FULL && ZEROFLAG) { f(i,0) = 0.0; f(i,1) = 0.0; f(i,2) = 0.0; @@ -292,11 +292,13 @@ struct PairComputeFunctor { const X_FLOAT ztmp = c.x(i,2); const int itype = c.type(i); - Kokkos::single(Kokkos::PerThread(team), [&] (){ - f(i,0) = 0.0; - f(i,1) = 0.0; - f(i,2) = 0.0; - }); + if (ZEROFLAG) { + Kokkos::single(Kokkos::PerThread(team), [&] (){ + f(i,0) = 0.0; + f(i,1) = 0.0; + f(i,2) = 0.0; + }); + } const AtomNeighborsConst neighbors_i = list.get_neighbors_const(i); const int jnum = list.d_numneigh[i]; @@ -355,11 +357,13 @@ struct PairComputeFunctor { const int itype = c.type(i); const F_FLOAT qtmp = c.q(i); - Kokkos::single(Kokkos::PerThread(team), [&] (){ - f(i,0) = 0.0; - f(i,1) = 0.0; - f(i,2) = 0.0; - }); + if (ZEROFLAG) { + Kokkos::single(Kokkos::PerThread(team), [&] (){ + f(i,0) = 0.0; + f(i,1) = 0.0; + f(i,2) = 0.0; + }); + } const AtomNeighborsConst neighbors_i = list.get_neighbors_const(i); const int jnum = list.d_numneigh[i]; @@ -423,11 +427,13 @@ struct PairComputeFunctor { const X_FLOAT ztmp = c.x(i,2); const int itype = c.type(i); - Kokkos::single(Kokkos::PerThread(team), [&] (){ - f(i,0) = 0.0; - f(i,1) = 0.0; - f(i,2) = 0.0; - }); + if (ZEROFLAG) { + Kokkos::single(Kokkos::PerThread(team), [&] (){ + f(i,0) = 0.0; + f(i,1) = 0.0; + f(i,2) = 0.0; + }); + } const AtomNeighborsConst neighbors_i = list.get_neighbors_const(i); const int jnum = list.d_numneigh[i]; @@ -525,11 +531,13 @@ struct PairComputeFunctor { const int itype = c.type(i); const F_FLOAT qtmp = c.q(i); - Kokkos::single(Kokkos::PerThread(team), [&] (){ - f(i,0) = 0.0; - f(i,1) = 0.0; - f(i,2) = 0.0; - }); + if (ZEROFLAG) { + Kokkos::single(Kokkos::PerThread(team), [&] (){ + f(i,0) = 0.0; + f(i,1) = 0.0; + f(i,2) = 0.0; + }); + } const AtomNeighborsConst neighbors_i = list.get_neighbors_const(i); const int jnum = list.d_numneigh[i]; @@ -740,7 +748,7 @@ struct PairComputeFunctor { // By having the enable_if with a ! and without it, exactly one of the functions // pair_compute_neighlist will match - either the dummy version // or the real one further below. -template +template EV_FLOAT pair_compute_neighlist (PairStyle* fpair, std::enable_if_t*> list) { EV_FLOAT ev; (void) fpair; @@ -770,7 +778,7 @@ int GetTeamSize(FunctorStyle& KOKKOS_GPU_ARG(functor), int KOKKOS_GPU_ARG(inum), } // Submit ParallelFor for NEIGHFLAG=HALF,HALFTHREAD,FULL -template +template EV_FLOAT pair_compute_neighlist (PairStyle* fpair, std::enable_if_t<(NEIGHFLAG&PairStyle::EnabledNeighFlags) != 0, NeighListKokkos*> list) { EV_FLOAT ev; @@ -784,13 +792,13 @@ EV_FLOAT pair_compute_neighlist (PairStyle* fpair, std::enable_if_t<(NEIGHFLAG&P int atoms_per_team = 32; if (fpair->atom->ntypes > MAX_TYPES_STACKPARAMS) { - PairComputeFunctor ff(fpair,list); + PairComputeFunctor ff(fpair,list); atoms_per_team = GetTeamSize(ff, list->inum, (fpair->eflag || fpair->vflag), atoms_per_team, vector_length); Kokkos::TeamPolicy > policy(list->inum,atoms_per_team,vector_length); if (fpair->eflag || fpair->vflag) Kokkos::parallel_reduce(policy,ff,ev); else Kokkos::parallel_for(policy,ff); } else { - PairComputeFunctor ff(fpair,list); + PairComputeFunctor ff(fpair,list); atoms_per_team = GetTeamSize(ff, list->inum, (fpair->eflag || fpair->vflag), atoms_per_team, vector_length); Kokkos::TeamPolicy > policy(list->inum,atoms_per_team,vector_length); if (fpair->eflag || fpair->vflag) Kokkos::parallel_reduce(policy,ff,ev); @@ -798,12 +806,12 @@ EV_FLOAT pair_compute_neighlist (PairStyle* fpair, std::enable_if_t<(NEIGHFLAG&P } } else { if (fpair->atom->ntypes > MAX_TYPES_STACKPARAMS) { - PairComputeFunctor ff(fpair,list); + PairComputeFunctor ff(fpair,list); if (fpair->eflag || fpair->vflag) Kokkos::parallel_reduce(list->inum,ff,ev); else Kokkos::parallel_for(list->inum,ff); ff.contribute(); } else { - PairComputeFunctor ff(fpair,list); + PairComputeFunctor ff(fpair,list); if (fpair->eflag || fpair->vflag) Kokkos::parallel_reduce(list->inum,ff,ev); else Kokkos::parallel_for(list->inum,ff); ff.contribute(); @@ -812,16 +820,21 @@ EV_FLOAT pair_compute_neighlist (PairStyle* fpair, std::enable_if_t<(NEIGHFLAG&P return ev; } -template +template EV_FLOAT pair_compute (PairStyle* fpair, NeighListKokkos* list) { EV_FLOAT ev; if (fpair->neighflag == FULL) { - fpair->fuse_force_clear_flag = 1; - ev = pair_compute_neighlist (fpair,list); + if (utils::strmatch(fpair->lmp->force->pair_style,"^hybrid/overlay")) { + fpair->fuse_force_clear_flag = 0; + ev = pair_compute_neighlist (fpair,list); + } else { + fpair->fuse_force_clear_flag = 1; + ev = pair_compute_neighlist (fpair,list); + } } else if (fpair->neighflag == HALFTHREAD) { - ev = pair_compute_neighlist (fpair,list); + ev = pair_compute_neighlist (fpair,list); } else if (fpair->neighflag == HALF) { - ev = pair_compute_neighlist (fpair,list); + ev = pair_compute_neighlist (fpair,list); } return ev; } diff --git a/src/KOKKOS/pair_lj_charmm_coul_charmm_implicit_kokkos.h b/src/KOKKOS/pair_lj_charmm_coul_charmm_implicit_kokkos.h index ae27ee68ab..7e21676fd5 100644 --- a/src/KOKKOS/pair_lj_charmm_coul_charmm_implicit_kokkos.h +++ b/src/KOKKOS/pair_lj_charmm_coul_charmm_implicit_kokkos.h @@ -110,27 +110,33 @@ class PairLJCharmmCoulCharmmImplicitKokkos : public PairLJCharmmCoulCharmmImplic void allocate() override; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend EV_FLOAT pair_compute_neighlist >(PairLJCharmmCoulCharmmImplicitKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairLJCharmmCoulCharmmImplicitKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairLJCharmmCoulCharmmImplicitKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute >(PairLJCharmmCoulCharmmImplicitKokkos*, + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend EV_FLOAT pair_compute_neighlist>(PairLJCharmmCoulCharmmImplicitKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJCharmmCoulCharmmImplicitKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJCharmmCoulCharmmImplicitKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJCharmmCoulCharmmImplicitKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute>(PairLJCharmmCoulCharmmImplicitKokkos*, NeighListKokkos*); - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend EV_FLOAT pair_compute_neighlist >(PairLJCharmmCoulCharmmImplicitKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairLJCharmmCoulCharmmImplicitKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairLJCharmmCoulCharmmImplicitKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute >(PairLJCharmmCoulCharmmImplicitKokkos*, + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend EV_FLOAT pair_compute_neighlist>(PairLJCharmmCoulCharmmImplicitKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJCharmmCoulCharmmImplicitKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJCharmmCoulCharmmImplicitKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJCharmmCoulCharmmImplicitKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute>(PairLJCharmmCoulCharmmImplicitKokkos*, NeighListKokkos*); friend void pair_virial_fdotr_compute(PairLJCharmmCoulCharmmImplicitKokkos*); diff --git a/src/KOKKOS/pair_lj_charmm_coul_charmm_kokkos.h b/src/KOKKOS/pair_lj_charmm_coul_charmm_kokkos.h index 912ad573c6..1f26242ded 100644 --- a/src/KOKKOS/pair_lj_charmm_coul_charmm_kokkos.h +++ b/src/KOKKOS/pair_lj_charmm_coul_charmm_kokkos.h @@ -108,27 +108,33 @@ class PairLJCharmmCoulCharmmKokkos : public PairLJCharmmCoulCharmm { void allocate() override; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend EV_FLOAT pair_compute_neighlist >(PairLJCharmmCoulCharmmKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairLJCharmmCoulCharmmKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairLJCharmmCoulCharmmKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute >(PairLJCharmmCoulCharmmKokkos*, + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend EV_FLOAT pair_compute_neighlist>(PairLJCharmmCoulCharmmKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJCharmmCoulCharmmKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJCharmmCoulCharmmKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJCharmmCoulCharmmKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute>(PairLJCharmmCoulCharmmKokkos*, NeighListKokkos*); - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend EV_FLOAT pair_compute_neighlist >(PairLJCharmmCoulCharmmKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairLJCharmmCoulCharmmKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairLJCharmmCoulCharmmKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute >(PairLJCharmmCoulCharmmKokkos*, + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend EV_FLOAT pair_compute_neighlist>(PairLJCharmmCoulCharmmKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJCharmmCoulCharmmKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJCharmmCoulCharmmKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJCharmmCoulCharmmKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute>(PairLJCharmmCoulCharmmKokkos*, NeighListKokkos*); friend void pair_virial_fdotr_compute(PairLJCharmmCoulCharmmKokkos*); diff --git a/src/KOKKOS/pair_lj_charmm_coul_long_kokkos.h b/src/KOKKOS/pair_lj_charmm_coul_long_kokkos.h index 4ae8a12944..c6c80e76dc 100644 --- a/src/KOKKOS/pair_lj_charmm_coul_long_kokkos.h +++ b/src/KOKKOS/pair_lj_charmm_coul_long_kokkos.h @@ -106,27 +106,33 @@ class PairLJCharmmCoulLongKokkos : public PairLJCharmmCoulLong { void allocate() override; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend EV_FLOAT pair_compute_neighlist >(PairLJCharmmCoulLongKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairLJCharmmCoulLongKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairLJCharmmCoulLongKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute >(PairLJCharmmCoulLongKokkos*, + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend EV_FLOAT pair_compute_neighlist>(PairLJCharmmCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJCharmmCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJCharmmCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJCharmmCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute>(PairLJCharmmCoulLongKokkos*, NeighListKokkos*); - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend EV_FLOAT pair_compute_neighlist >(PairLJCharmmCoulLongKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairLJCharmmCoulLongKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairLJCharmmCoulLongKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute >(PairLJCharmmCoulLongKokkos*, + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend EV_FLOAT pair_compute_neighlist>(PairLJCharmmCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJCharmmCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJCharmmCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJCharmmCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute>(PairLJCharmmCoulLongKokkos*, NeighListKokkos*); friend void pair_virial_fdotr_compute(PairLJCharmmCoulLongKokkos*); diff --git a/src/KOKKOS/pair_lj_class2_coul_cut_kokkos.h b/src/KOKKOS/pair_lj_class2_coul_cut_kokkos.h index 5ca276c28e..9399345458 100644 --- a/src/KOKKOS/pair_lj_class2_coul_cut_kokkos.h +++ b/src/KOKKOS/pair_lj_class2_coul_cut_kokkos.h @@ -104,15 +104,18 @@ class PairLJClass2CoulCutKokkos : public PairLJClass2CoulCut { double qqrd2e; void allocate() override; - friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; friend struct PairComputeFunctor; friend struct PairComputeFunctor; - friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; friend struct PairComputeFunctor; friend struct PairComputeFunctor; - friend EV_FLOAT pair_compute_neighlist(PairLJClass2CoulCutKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist(PairLJClass2CoulCutKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist(PairLJClass2CoulCutKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairLJClass2CoulCutKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairLJClass2CoulCutKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairLJClass2CoulCutKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairLJClass2CoulCutKokkos*,NeighListKokkos*); friend EV_FLOAT pair_compute(PairLJClass2CoulCutKokkos*, NeighListKokkos*); friend void pair_virial_fdotr_compute(PairLJClass2CoulCutKokkos*); diff --git a/src/KOKKOS/pair_lj_class2_coul_long_kokkos.h b/src/KOKKOS/pair_lj_class2_coul_long_kokkos.h index 599cc2a83c..1cf6590855 100644 --- a/src/KOKKOS/pair_lj_class2_coul_long_kokkos.h +++ b/src/KOKKOS/pair_lj_class2_coul_long_kokkos.h @@ -107,27 +107,33 @@ class PairLJClass2CoulLongKokkos : public PairLJClass2CoulLong { double qqrd2e; void allocate() override; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend EV_FLOAT pair_compute_neighlist >(PairLJClass2CoulLongKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairLJClass2CoulLongKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairLJClass2CoulLongKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute >(PairLJClass2CoulLongKokkos*, + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend EV_FLOAT pair_compute_neighlist>(PairLJClass2CoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJClass2CoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJClass2CoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJClass2CoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute>(PairLJClass2CoulLongKokkos*, NeighListKokkos*); - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend EV_FLOAT pair_compute_neighlist >(PairLJClass2CoulLongKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairLJClass2CoulLongKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairLJClass2CoulLongKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute >(PairLJClass2CoulLongKokkos*, + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend EV_FLOAT pair_compute_neighlist>(PairLJClass2CoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJClass2CoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJClass2CoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJClass2CoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute>(PairLJClass2CoulLongKokkos*, NeighListKokkos*); friend void pair_virial_fdotr_compute(PairLJClass2CoulLongKokkos*); diff --git a/src/KOKKOS/pair_lj_class2_kokkos.h b/src/KOKKOS/pair_lj_class2_kokkos.h index 0936399ca8..5594680929 100644 --- a/src/KOKKOS/pair_lj_class2_kokkos.h +++ b/src/KOKKOS/pair_lj_class2_kokkos.h @@ -96,16 +96,19 @@ class PairLJClass2Kokkos : public PairLJClass2 { int nlocal,nall,eflag,vflag; void allocate() override; - friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; friend struct PairComputeFunctor; friend struct PairComputeFunctor; - friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; friend struct PairComputeFunctor; friend struct PairComputeFunctor; - friend EV_FLOAT pair_compute_neighlist(PairLJClass2Kokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist(PairLJClass2Kokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist(PairLJClass2Kokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute(PairLJClass2Kokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairLJClass2Kokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairLJClass2Kokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairLJClass2Kokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairLJClass2Kokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute(PairLJClass2Kokkos*,NeighListKokkos*); friend void pair_virial_fdotr_compute(PairLJClass2Kokkos*); }; diff --git a/src/KOKKOS/pair_lj_cut_coul_cut_kokkos.h b/src/KOKKOS/pair_lj_cut_coul_cut_kokkos.h index 87464b37dc..affc67bf16 100644 --- a/src/KOKKOS/pair_lj_cut_coul_cut_kokkos.h +++ b/src/KOKKOS/pair_lj_cut_coul_cut_kokkos.h @@ -104,15 +104,18 @@ class PairLJCutCoulCutKokkos : public PairLJCutCoulCut { double qqrd2e; void allocate() override; - friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; friend struct PairComputeFunctor; friend struct PairComputeFunctor; - friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; friend struct PairComputeFunctor; friend struct PairComputeFunctor; - friend EV_FLOAT pair_compute_neighlist(PairLJCutCoulCutKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist(PairLJCutCoulCutKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist(PairLJCutCoulCutKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairLJCutCoulCutKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairLJCutCoulCutKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairLJCutCoulCutKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairLJCutCoulCutKokkos*,NeighListKokkos*); friend EV_FLOAT pair_compute(PairLJCutCoulCutKokkos*, NeighListKokkos*); friend void pair_virial_fdotr_compute(PairLJCutCoulCutKokkos*); diff --git a/src/KOKKOS/pair_lj_cut_coul_debye_kokkos.h b/src/KOKKOS/pair_lj_cut_coul_debye_kokkos.h index ea0b401959..eeed483b76 100644 --- a/src/KOKKOS/pair_lj_cut_coul_debye_kokkos.h +++ b/src/KOKKOS/pair_lj_cut_coul_debye_kokkos.h @@ -104,15 +104,18 @@ class PairLJCutCoulDebyeKokkos : public PairLJCutCoulDebye { double qqrd2e; void allocate() override; - friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; friend struct PairComputeFunctor; friend struct PairComputeFunctor; - friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; friend struct PairComputeFunctor; friend struct PairComputeFunctor; - friend EV_FLOAT pair_compute_neighlist(PairLJCutCoulDebyeKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist(PairLJCutCoulDebyeKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist(PairLJCutCoulDebyeKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairLJCutCoulDebyeKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairLJCutCoulDebyeKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairLJCutCoulDebyeKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairLJCutCoulDebyeKokkos*,NeighListKokkos*); friend EV_FLOAT pair_compute(PairLJCutCoulDebyeKokkos*, NeighListKokkos*); friend void pair_virial_fdotr_compute(PairLJCutCoulDebyeKokkos*); diff --git a/src/KOKKOS/pair_lj_cut_coul_dsf_kokkos.h b/src/KOKKOS/pair_lj_cut_coul_dsf_kokkos.h index e420bd22a9..d9e5fcfe49 100644 --- a/src/KOKKOS/pair_lj_cut_coul_dsf_kokkos.h +++ b/src/KOKKOS/pair_lj_cut_coul_dsf_kokkos.h @@ -101,15 +101,18 @@ class PairLJCutCoulDSFKokkos : public PairLJCutCoulDSF { double qqrd2e; void allocate() override; - friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; friend struct PairComputeFunctor; friend struct PairComputeFunctor; - friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; friend struct PairComputeFunctor; friend struct PairComputeFunctor; - friend EV_FLOAT pair_compute_neighlist(PairLJCutCoulDSFKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist(PairLJCutCoulDSFKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist(PairLJCutCoulDSFKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairLJCutCoulDSFKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairLJCutCoulDSFKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairLJCutCoulDSFKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairLJCutCoulDSFKokkos*,NeighListKokkos*); friend EV_FLOAT pair_compute(PairLJCutCoulDSFKokkos*, NeighListKokkos*); friend void pair_virial_fdotr_compute(PairLJCutCoulDSFKokkos*); diff --git a/src/KOKKOS/pair_lj_cut_coul_long_kokkos.h b/src/KOKKOS/pair_lj_cut_coul_long_kokkos.h index bcb97a59cd..ec6e2db176 100644 --- a/src/KOKKOS/pair_lj_cut_coul_long_kokkos.h +++ b/src/KOKKOS/pair_lj_cut_coul_long_kokkos.h @@ -107,27 +107,33 @@ class PairLJCutCoulLongKokkos : public PairLJCutCoulLong { double qqrd2e; void allocate() override; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend EV_FLOAT pair_compute_neighlist >(PairLJCutCoulLongKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairLJCutCoulLongKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairLJCutCoulLongKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute >(PairLJCutCoulLongKokkos*, + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend EV_FLOAT pair_compute_neighlist>(PairLJCutCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJCutCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJCutCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJCutCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute>(PairLJCutCoulLongKokkos*, NeighListKokkos*); - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend EV_FLOAT pair_compute_neighlist >(PairLJCutCoulLongKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairLJCutCoulLongKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairLJCutCoulLongKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute >(PairLJCutCoulLongKokkos*, + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend EV_FLOAT pair_compute_neighlist>(PairLJCutCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJCutCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJCutCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJCutCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute>(PairLJCutCoulLongKokkos*, NeighListKokkos*); friend void pair_virial_fdotr_compute(PairLJCutCoulLongKokkos*); diff --git a/src/KOKKOS/pair_lj_cut_kokkos.h b/src/KOKKOS/pair_lj_cut_kokkos.h index 106f1a9048..b44c1aa6fe 100644 --- a/src/KOKKOS/pair_lj_cut_kokkos.h +++ b/src/KOKKOS/pair_lj_cut_kokkos.h @@ -92,16 +92,19 @@ class PairLJCutKokkos : public PairLJCut { int nlocal,nall,eflag,vflag; void allocate() override; - friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; friend struct PairComputeFunctor; friend struct PairComputeFunctor; - friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; friend struct PairComputeFunctor; friend struct PairComputeFunctor; - friend EV_FLOAT pair_compute_neighlist(PairLJCutKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist(PairLJCutKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist(PairLJCutKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute(PairLJCutKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairLJCutKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairLJCutKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairLJCutKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairLJCutKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute(PairLJCutKokkos*,NeighListKokkos*); friend void pair_virial_fdotr_compute(PairLJCutKokkos*); }; diff --git a/src/KOKKOS/pair_lj_expand_coul_long_kokkos.h b/src/KOKKOS/pair_lj_expand_coul_long_kokkos.h index 09a694a122..30e82b7dab 100644 --- a/src/KOKKOS/pair_lj_expand_coul_long_kokkos.h +++ b/src/KOKKOS/pair_lj_expand_coul_long_kokkos.h @@ -116,27 +116,33 @@ class PairLJExpandCoulLongKokkos : public PairLJExpandCoulLong { double qqrd2e; void allocate() override; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend EV_FLOAT pair_compute_neighlist >(PairLJExpandCoulLongKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairLJExpandCoulLongKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairLJExpandCoulLongKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute >(PairLJExpandCoulLongKokkos*, + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend EV_FLOAT pair_compute_neighlist>(PairLJExpandCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJExpandCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJExpandCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJExpandCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute>(PairLJExpandCoulLongKokkos*, NeighListKokkos*); - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend EV_FLOAT pair_compute_neighlist >(PairLJExpandCoulLongKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairLJExpandCoulLongKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairLJExpandCoulLongKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute >(PairLJExpandCoulLongKokkos*, + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend EV_FLOAT pair_compute_neighlist>(PairLJExpandCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJExpandCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJExpandCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJExpandCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute>(PairLJExpandCoulLongKokkos*, NeighListKokkos*); friend void pair_virial_fdotr_compute(PairLJExpandCoulLongKokkos*); }; diff --git a/src/KOKKOS/pair_lj_expand_kokkos.h b/src/KOKKOS/pair_lj_expand_kokkos.h index 0df0a6f8f8..64fe7d8b8e 100644 --- a/src/KOKKOS/pair_lj_expand_kokkos.h +++ b/src/KOKKOS/pair_lj_expand_kokkos.h @@ -97,16 +97,19 @@ class PairLJExpandKokkos : public PairLJExpand { int nlocal,nall,eflag,vflag; void allocate() override; - friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; friend struct PairComputeFunctor; friend struct PairComputeFunctor; - friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; friend struct PairComputeFunctor; friend struct PairComputeFunctor; - friend EV_FLOAT pair_compute_neighlist(PairLJExpandKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist(PairLJExpandKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist(PairLJExpandKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute(PairLJExpandKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairLJExpandKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairLJExpandKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairLJExpandKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairLJExpandKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute(PairLJExpandKokkos*,NeighListKokkos*); friend void pair_virial_fdotr_compute(PairLJExpandKokkos*); }; diff --git a/src/KOKKOS/pair_lj_gromacs_coul_gromacs_kokkos.h b/src/KOKKOS/pair_lj_gromacs_coul_gromacs_kokkos.h index 359c4a1229..020b621e33 100644 --- a/src/KOKKOS/pair_lj_gromacs_coul_gromacs_kokkos.h +++ b/src/KOKKOS/pair_lj_gromacs_coul_gromacs_kokkos.h @@ -115,27 +115,33 @@ class PairLJGromacsCoulGromacsKokkos : public PairLJGromacsCoulGromacs { void allocate() override; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend EV_FLOAT pair_compute_neighlist >(PairLJGromacsCoulGromacsKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairLJGromacsCoulGromacsKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairLJGromacsCoulGromacsKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute >(PairLJGromacsCoulGromacsKokkos*, + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend EV_FLOAT pair_compute_neighlist>(PairLJGromacsCoulGromacsKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJGromacsCoulGromacsKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJGromacsCoulGromacsKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJGromacsCoulGromacsKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute>(PairLJGromacsCoulGromacsKokkos*, NeighListKokkos*); - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend EV_FLOAT pair_compute_neighlist >(PairLJGromacsCoulGromacsKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairLJGromacsCoulGromacsKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairLJGromacsCoulGromacsKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute >(PairLJGromacsCoulGromacsKokkos*, + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend EV_FLOAT pair_compute_neighlist>(PairLJGromacsCoulGromacsKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJGromacsCoulGromacsKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJGromacsCoulGromacsKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJGromacsCoulGromacsKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute>(PairLJGromacsCoulGromacsKokkos*, NeighListKokkos*); friend void pair_virial_fdotr_compute(PairLJGromacsCoulGromacsKokkos*); diff --git a/src/KOKKOS/pair_lj_gromacs_kokkos.h b/src/KOKKOS/pair_lj_gromacs_kokkos.h index 95c600a415..ad41ca5120 100644 --- a/src/KOKKOS/pair_lj_gromacs_kokkos.h +++ b/src/KOKKOS/pair_lj_gromacs_kokkos.h @@ -115,27 +115,33 @@ class PairLJGromacsKokkos : public PairLJGromacs { void allocate() override; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend EV_FLOAT pair_compute_neighlist >(PairLJGromacsKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairLJGromacsKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairLJGromacsKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute >(PairLJGromacsKokkos*, + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend EV_FLOAT pair_compute_neighlist>(PairLJGromacsKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJGromacsKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJGromacsKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJGromacsKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute>(PairLJGromacsKokkos*, NeighListKokkos*); - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend EV_FLOAT pair_compute_neighlist >(PairLJGromacsKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairLJGromacsKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairLJGromacsKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute >(PairLJGromacsKokkos*, + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend EV_FLOAT pair_compute_neighlist>(PairLJGromacsKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJGromacsKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJGromacsKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJGromacsKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute>(PairLJGromacsKokkos*, NeighListKokkos*); friend void pair_virial_fdotr_compute(PairLJGromacsKokkos*); diff --git a/src/KOKKOS/pair_lj_spica_kokkos.h b/src/KOKKOS/pair_lj_spica_kokkos.h index b330af4bfd..06c70ebd3e 100644 --- a/src/KOKKOS/pair_lj_spica_kokkos.h +++ b/src/KOKKOS/pair_lj_spica_kokkos.h @@ -97,16 +97,19 @@ class PairLJSPICAKokkos : public PairLJSPICA { int nlocal,nall,eflag,vflag; void allocate() override; - friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; friend struct PairComputeFunctor; friend struct PairComputeFunctor; - friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; friend struct PairComputeFunctor; friend struct PairComputeFunctor; - friend EV_FLOAT pair_compute_neighlist(PairLJSPICAKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist(PairLJSPICAKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist(PairLJSPICAKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute(PairLJSPICAKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairLJSPICAKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairLJSPICAKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairLJSPICAKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairLJSPICAKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute(PairLJSPICAKokkos*,NeighListKokkos*); friend void pair_virial_fdotr_compute(PairLJSPICAKokkos*); }; diff --git a/src/KOKKOS/pair_morse_kokkos.h b/src/KOKKOS/pair_morse_kokkos.h index d06cf2deb1..ccf27b018b 100644 --- a/src/KOKKOS/pair_morse_kokkos.h +++ b/src/KOKKOS/pair_morse_kokkos.h @@ -92,16 +92,19 @@ class PairMorseKokkos : public PairMorse { int nlocal,nall,eflag,vflag; void allocate() override; - friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; friend struct PairComputeFunctor; friend struct PairComputeFunctor; - friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; friend struct PairComputeFunctor; friend struct PairComputeFunctor; - friend EV_FLOAT pair_compute_neighlist(PairMorseKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist(PairMorseKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist(PairMorseKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute(PairMorseKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairMorseKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairMorseKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairMorseKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairMorseKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute(PairMorseKokkos*,NeighListKokkos*); friend void pair_virial_fdotr_compute(PairMorseKokkos*); }; diff --git a/src/KOKKOS/pair_table_kokkos.cpp b/src/KOKKOS/pair_table_kokkos.cpp index 83bd74d4af..99d01be4a5 100644 --- a/src/KOKKOS/pair_table_kokkos.cpp +++ b/src/KOKKOS/pair_table_kokkos.cpp @@ -133,19 +133,19 @@ void PairTableKokkos::compute_style(int eflag_in, int vflag_in) EV_FLOAT ev; if (atom->ntypes > MAX_TYPES_STACKPARAMS) { if (neighflag == FULL) { - PairComputeFunctor,FULL,false,S_TableCompute > + PairComputeFunctor,FULL,false,0,S_TableCompute > ff(this,(NeighListKokkos*) list); if (eflag || vflag) Kokkos::parallel_reduce(list->inum,ff,ev); else Kokkos::parallel_for(list->inum,ff); ff.contribute(); } else if (neighflag == HALFTHREAD) { - PairComputeFunctor,HALFTHREAD,false,S_TableCompute > + PairComputeFunctor,HALFTHREAD,false,0,S_TableCompute > ff(this,(NeighListKokkos*) list); if (eflag || vflag) Kokkos::parallel_reduce(list->inum,ff,ev); else Kokkos::parallel_for(list->inum,ff); ff.contribute(); } else if (neighflag == HALF) { - PairComputeFunctor,HALF,false,S_TableCompute > + PairComputeFunctor,HALF,false,0,S_TableCompute > f(this,(NeighListKokkos*) list); if (eflag || vflag) Kokkos::parallel_reduce(list->inum,f,ev); else Kokkos::parallel_for(list->inum,f); @@ -153,19 +153,19 @@ void PairTableKokkos::compute_style(int eflag_in, int vflag_in) } } else { if (neighflag == FULL) { - PairComputeFunctor,FULL,true,S_TableCompute > + PairComputeFunctor,FULL,true,0,S_TableCompute > f(this,(NeighListKokkos*) list); if (eflag || vflag) Kokkos::parallel_reduce(list->inum,f,ev); else Kokkos::parallel_for(list->inum,f); f.contribute(); } else if (neighflag == HALFTHREAD) { - PairComputeFunctor,HALFTHREAD,true,S_TableCompute > + PairComputeFunctor,HALFTHREAD,true,0,S_TableCompute > f(this,(NeighListKokkos*) list); if (eflag || vflag) Kokkos::parallel_reduce(list->inum,f,ev); else Kokkos::parallel_for(list->inum,f); f.contribute(); } else if (neighflag == HALF) { - PairComputeFunctor,HALF,true,S_TableCompute > + PairComputeFunctor,HALF,true,0,S_TableCompute > f(this,(NeighListKokkos*) list); if (eflag || vflag) Kokkos::parallel_reduce(list->inum,f,ev); else Kokkos::parallel_for(list->inum,f); diff --git a/src/KOKKOS/pair_table_kokkos.h b/src/KOKKOS/pair_table_kokkos.h index 80226d3770..18112e4c18 100644 --- a/src/KOKKOS/pair_table_kokkos.h +++ b/src/KOKKOS/pair_table_kokkos.h @@ -35,9 +35,6 @@ struct S_TableCompute { static constexpr int TabStyle = TABSTYLE; }; -template -struct PairTableComputeFunctor; - template class PairTableKokkos : public PairTable { public: @@ -135,33 +132,33 @@ class PairTableKokkos : public PairTable { F_FLOAT compute_ecoul(const F_FLOAT& /*rsq*/, const int& /*i*/, const int& /*j*/, const int& /*itype*/, const int& /*jtype*/) const { return 0; } - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; + friend struct PairComputeFunctor >; + friend struct PairComputeFunctor >; + friend struct PairComputeFunctor >; + friend struct PairComputeFunctor >; + friend struct PairComputeFunctor >; + friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; + friend struct PairComputeFunctor >; + friend struct PairComputeFunctor >; + friend struct PairComputeFunctor >; + friend struct PairComputeFunctor >; + friend struct PairComputeFunctor >; + friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; + friend struct PairComputeFunctor >; + friend struct PairComputeFunctor >; + friend struct PairComputeFunctor >; + friend struct PairComputeFunctor >; + friend struct PairComputeFunctor >; + friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; + friend struct PairComputeFunctor >; + friend struct PairComputeFunctor >; + friend struct PairComputeFunctor >; + friend struct PairComputeFunctor >; + friend struct PairComputeFunctor >; + friend struct PairComputeFunctor >; friend void pair_virial_fdotr_compute(PairTableKokkos*); }; diff --git a/src/KOKKOS/pair_yukawa_kokkos.h b/src/KOKKOS/pair_yukawa_kokkos.h index e04f65264b..dc93e83aea 100644 --- a/src/KOKKOS/pair_yukawa_kokkos.h +++ b/src/KOKKOS/pair_yukawa_kokkos.h @@ -95,20 +95,19 @@ class PairYukawaKokkos : public PairYukawa { int nlocal,nall,eflag,vflag; void allocate() override; - friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; friend struct PairComputeFunctor; friend struct PairComputeFunctor; - friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; friend struct PairComputeFunctor; friend struct PairComputeFunctor; - friend EV_FLOAT pair_compute_neighlist( - PairYukawaKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist( - PairYukawaKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist( - PairYukawaKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute( - PairYukawaKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairYukawaKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairYukawaKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairYukawaKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairYukawaKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute(PairYukawaKokkos*,NeighListKokkos*); friend void pair_virial_fdotr_compute(PairYukawaKokkos*); }; diff --git a/src/KOKKOS/pair_zbl_kokkos.h b/src/KOKKOS/pair_zbl_kokkos.h index bd33cdb5e0..b7638a25e0 100644 --- a/src/KOKKOS/pair_zbl_kokkos.h +++ b/src/KOKKOS/pair_zbl_kokkos.h @@ -89,16 +89,19 @@ class PairZBLKokkos : public PairZBL { void allocate() override; - friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; friend struct PairComputeFunctor; friend struct PairComputeFunctor; - friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; friend struct PairComputeFunctor; friend struct PairComputeFunctor; - friend EV_FLOAT pair_compute_neighlist(PairZBLKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist(PairZBLKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist(PairZBLKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute(PairZBLKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairZBLKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairZBLKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairZBLKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairZBLKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute(PairZBLKokkos*,NeighListKokkos*); friend void pair_virial_fdotr_compute(PairZBLKokkos*); }; From 8bc396558342e3dea89abcfb4364bf6260706be3 Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Thu, 12 Oct 2023 12:06:55 -0600 Subject: [PATCH 170/219] More robust refactor of Kokkos fix property/atom --- src/KOKKOS/atom_kokkos.cpp | 8 ++++--- src/KOKKOS/atom_kokkos.h | 1 + src/KOKKOS/fix_property_atom_kokkos.cpp | 32 ++++++++++++++----------- src/KOKKOS/fix_property_atom_kokkos.h | 4 +--- 4 files changed, 25 insertions(+), 20 deletions(-) diff --git a/src/KOKKOS/atom_kokkos.cpp b/src/KOKKOS/atom_kokkos.cpp index a009972628..f118b2a204 100644 --- a/src/KOKKOS/atom_kokkos.cpp +++ b/src/KOKKOS/atom_kokkos.cpp @@ -126,7 +126,12 @@ void AtomKokkos::init() Atom::init(); sort_classic = lmp->kokkos->sort_classic; +} +/* ---------------------------------------------------------------------- */ + +void AtomKokkos::update_property_atom() +{ nprop_atom = 0; for (int ifix = 0; ifix < modify->nfix; ifix++) { if (modify->fix[ifix] && utils::strmatch(modify->fix[ifix]->style, "^property/atom")) { @@ -142,11 +147,8 @@ void AtomKokkos::init() delete [] fix_prop_atom; fix_prop_atom = new FixPropertyAtomKokkos*[nprop_atom]; - printf("HERE %i\n",nprop_atom); - for (int n = 0; n < nprop_atom; n++) { auto fix_n = dynamic_cast(modify->fix[prop_atom[n]]); - fix_n->atom_init_flag = 1; fix_prop_atom[n] = fix_n; } diff --git a/src/KOKKOS/atom_kokkos.h b/src/KOKKOS/atom_kokkos.h index c26a1b291f..26ea7da296 100644 --- a/src/KOKKOS/atom_kokkos.h +++ b/src/KOKKOS/atom_kokkos.h @@ -148,6 +148,7 @@ class AtomKokkos : public Atom { } void init() override; + void update_property_atom(); void allocate_type_arrays() override; void sync(const ExecutionSpace space, unsigned int mask); void modified(const ExecutionSpace space, unsigned int mask); diff --git a/src/KOKKOS/fix_property_atom_kokkos.cpp b/src/KOKKOS/fix_property_atom_kokkos.cpp index 080a8f6fe4..dcd943cac6 100644 --- a/src/KOKKOS/fix_property_atom_kokkos.cpp +++ b/src/KOKKOS/fix_property_atom_kokkos.cpp @@ -35,8 +35,15 @@ FixPropertyAtomKokkos::FixPropertyAtomKokkos(LAMMPS *lmp, int narg, char **arg) dvector_flag = 0; for (int nv = 0; nv < nvalue; nv++) if (styles[nv] == DVEC) dvector_flag = 1; +} - atom_init_flag = 0; +/* ---------------------------------------------------------------------- */ + +void FixPropertyAtomKokkos::post_constructor() +{ + atomKK->update_property_atom(); + + FixPropertyAtom::post_constructor(); } /* ---------------------------------------------------------------------- */ @@ -61,6 +68,8 @@ FixPropertyAtomKokkos::~FixPropertyAtomKokkos() atom->rmass = nullptr; } } + + atomKK->update_property_atom(); } /* ---------------------------------------------------------------------- @@ -74,20 +83,17 @@ void FixPropertyAtomKokkos::grow_arrays(int nmax) { for (int nv = 0; nv < nvalue; nv++) { if (styles[nv] == MOLECULE) { - if (!atom_init_flag) this->modified(Host,MOLECULE_MASK); - else atomKK->sync(Device,MOLECULE_MASK); + atomKK->sync(Device,MOLECULE_MASK); memoryKK->grow_kokkos(atomKK->k_molecule,atom->molecule,nmax,"atom:molecule"); - if (atom_init_flag) atomKK->modified(Device,MOLECULE_MASK); + atomKK->modified(Device,MOLECULE_MASK); } else if (styles[nv] == CHARGE) { - if (!atom_init_flag) this->modified(Host,Q_MASK); - else atomKK->sync(Device,Q_MASK); + atomKK->sync(Device,Q_MASK); memoryKK->grow_kokkos(atomKK->k_q,atom->q,nmax,"atom:q"); - if (atom_init_flag) atomKK->modified(Device,Q_MASK); + atomKK->modified(Device,Q_MASK); } else if (styles[nv] == RMASS) { - if (!atom_init_flag) this->modified(Host,RMASS_MASK); - else atomKK->sync(Device,RMASS_MASK); + atomKK->sync(Device,RMASS_MASK); memoryKK->grow_kokkos(atomKK->k_rmass,atom->rmass,nmax,"atom:rmass"); - if (atom_init_flag) atomKK->modified(Device,RMASS_MASK); + atomKK->modified(Device,RMASS_MASK); } else if (styles[nv] == TEMPERATURE) { memory->grow(atom->temperature, nmax, "atom:temperature"); size_t nbytes = (nmax - nmax_old) * sizeof(double); @@ -101,11 +107,10 @@ void FixPropertyAtomKokkos::grow_arrays(int nmax) size_t nbytes = (nmax-nmax_old) * sizeof(int); memset(&atom->ivector[index[nv]][nmax_old],0,nbytes); } else if (styles[nv] == DVEC) { - if (!atom_init_flag) this->modified(Host,DVECTOR_MASK); - else atomKK->sync(Device,DVECTOR_MASK); + atomKK->sync(Device,DVECTOR_MASK); memoryKK->grow_kokkos(atomKK->k_dvector,atom->dvector,atomKK->k_dvector.extent(0),nmax, "atom:dvector"); - if (atom_init_flag) atomKK->modified(Device,DVECTOR_MASK); + atomKK->modified(Device,DVECTOR_MASK); } else if (styles[nv] == IARRAY) { memory->grow(atom->iarray[index[nv]], nmax, cols[nv], "atom:iarray"); size_t nbytes = (size_t) (nmax - nmax_old) * cols[nv] * sizeof(int); @@ -124,7 +129,6 @@ void FixPropertyAtomKokkos::grow_arrays(int nmax) void FixPropertyAtomKokkos::sync(ExecutionSpace space, unsigned int mask) { if (space == Device) { - if (molecule_flag && (mask & MOLECULE_MASK)) atomKK->k_molecule.sync(); if (q_flag && (mask & Q_MASK)) atomKK->k_q.sync(); if (rmass_flag && (mask & RMASS_MASK)) {atomKK->k_rmass.sync();} diff --git a/src/KOKKOS/fix_property_atom_kokkos.h b/src/KOKKOS/fix_property_atom_kokkos.h index 74a20a28b5..adbe6ab20b 100644 --- a/src/KOKKOS/fix_property_atom_kokkos.h +++ b/src/KOKKOS/fix_property_atom_kokkos.h @@ -29,16 +29,14 @@ namespace LAMMPS_NS { class FixPropertyAtomKokkos : public FixPropertyAtom { public: FixPropertyAtomKokkos(class LAMMPS *, int, char **); + void post_constructor() override; ~FixPropertyAtomKokkos() override; - void grow_arrays(int) override; void sync(ExecutionSpace space, unsigned int mask); void modified(ExecutionSpace space, unsigned int mask); void sync_overlapping_device(ExecutionSpace space, unsigned int mask); - int atom_init_flag; - private: int dvector_flag; }; From 4910401f6c43c54318e1c4509475c6f693129f0b Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Thu, 12 Oct 2023 12:52:57 -0600 Subject: [PATCH 171/219] Add accelerator package text --- doc/src/fix_efield.rst | 6 ++++++ doc/src/fix_spring_self.rst | 6 ++++++ doc/src/pair_yukawa_colloid.rst | 6 ++++++ 3 files changed, 18 insertions(+) diff --git a/doc/src/fix_efield.rst b/doc/src/fix_efield.rst index c6ac3a0722..71be030266 100644 --- a/doc/src/fix_efield.rst +++ b/doc/src/fix_efield.rst @@ -211,6 +211,12 @@ the iteration count during the minimization. system (the quantity being minimized), you MUST enable the :doc:`fix_modify ` *energy* option for this fix. +---------- + +.. include:: accel_styles.rst + +---------- + Restrictions """""""""""" diff --git a/doc/src/fix_spring_self.rst b/doc/src/fix_spring_self.rst index 0def6d51f0..3a3e246455 100644 --- a/doc/src/fix_spring_self.rst +++ b/doc/src/fix_spring_self.rst @@ -81,6 +81,12 @@ invoked by the :doc:`minimize ` command. you MUST enable the :doc:`fix_modify ` *energy* option for this fix. +---------- + +.. include:: accel_styles.rst + +---------- + Restrictions """""""""""" none diff --git a/doc/src/pair_yukawa_colloid.rst b/doc/src/pair_yukawa_colloid.rst index 96893f8e37..c6f201d249 100644 --- a/doc/src/pair_yukawa_colloid.rst +++ b/doc/src/pair_yukawa_colloid.rst @@ -132,6 +132,12 @@ per-type polydispersity is allowed. This means all particles of the same type must have the same diameter. Each type can have a different diameter. +---------- + +.. include:: accel_styles.rst + +---------- + Related commands """""""""""""""" From 26133bd26ad1251dd43e16c34f988997fa792b09 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 12 Oct 2023 16:29:01 -0400 Subject: [PATCH 172/219] Revert "restore GNU make build capability for ML-PACE" This reverts commit 2b1985f755fb5019f03d4e76b6174808e7f543c1. --- lib/pace/Makefile | 6 +++--- lib/pace/Makefile.lammps | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/pace/Makefile b/lib/pace/Makefile index 37f00ee70e..5a1588ef93 100644 --- a/lib/pace/Makefile +++ b/lib/pace/Makefile @@ -1,5 +1,4 @@ SHELL = /bin/sh -CMAKE= cmake # ------ FILES ------ @@ -36,7 +35,7 @@ lib: $(OBJ) lib-yaml-cpp lib-yaml-cpp: - cd $(YAML_CPP_PATH) && $(CMAKE) . && $(MAKE) all + cd $(YAML_CPP_PATH) && $(MAKE) lib # ------ COMPILE RULES ------ @@ -46,8 +45,9 @@ lib-yaml-cpp: # ------ CLEAN ------ clean-all: -rm -f *~ $(OBJ) $(LIB) - cd $(YAML_CPP_PATH) && $(MAKE) clean + cd $(YAML_CPP_PATH) && $(MAKE) clean-all clean-build: -rm -f *~ $(OBJ) + cd $(YAML_CPP_PATH) && $(MAKE) clean-build diff --git a/lib/pace/Makefile.lammps b/lib/pace/Makefile.lammps index 1c549e31d0..6411e49a07 100644 --- a/lib/pace/Makefile.lammps +++ b/lib/pace/Makefile.lammps @@ -1,3 +1,3 @@ pace_SYSINC =-I../../lib/pace/src/ML-PACE -I../../lib/pace/src/yaml-cpp/include -I../../lib/pace/src/wigner-cpp/include -DEXTRA_C_PROJECTIONS -pace_SYSLIB = -L../../lib/pace/ -lpace -L../../lib/pace/src/yaml-cpp/ -lyaml-cpp-pace +pace_SYSLIB = -L../../lib/pace/ -lpace -L../../lib/pace/src/yaml-cpp/ -lyaml-cpp pace_SYSPATH = From 1a9dac83d7513e9dad2815b2a291f7b810eaa3a6 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 12 Oct 2023 21:52:32 -0400 Subject: [PATCH 173/219] update fix srd docs --- doc/src/fix_srd.rst | 49 +++++++++++++++++++++------------------------ 1 file changed, 23 insertions(+), 26 deletions(-) diff --git a/doc/src/fix_srd.rst b/doc/src/fix_srd.rst index 1fc574a7ad..8bfbcf2387 100644 --- a/doc/src/fix_srd.rst +++ b/doc/src/fix_srd.rst @@ -71,14 +71,15 @@ imbue the SRD particles with fluid-like properties, including an effective viscosity. Thus simulations with large solute particles can be run more quickly, to measure solute properties like diffusivity and viscosity in a background fluid. The usual LAMMPS fixes for such -simulations, such as :doc:`fix deform `, :doc:`fix viscosity `, and :doc:`fix nvt/sllod `, +simulations, such as :doc:`fix deform `, +:doc:`fix viscosity `, and :doc:`fix nvt/sllod `, can be used in conjunction with the SRD model. -For more details on how the SRD model is implemented in LAMMPS, :ref:`this paper ` describes the implementation and usage of pure SRD -fluids. :ref:`This paper `, which is nearly complete, describes -the implementation and usage of mixture systems (solute particles in -an SRD fluid). See the examples/srd directory for sample input -scripts using SRD particles in both settings. +For more details on how the SRD model is implemented in LAMMPS, +:ref:`(Petersen) ` describes the implementation and usage of +pure SRD fluids. See the ``examples/srd`` directory for sample input +scripts using SRD particles for that and for mixture systems (solute +particles in an SRD fluid). This fix does two things: @@ -357,28 +358,28 @@ These are the 12 quantities. All are values for the current timestep, except for quantity 5 and the last three, each of which are cumulative quantities since the beginning of the run. -* (1) # of SRD/big collision checks performed -* (2) # of SRDs which had a collision -* (3) # of SRD/big collisions (including multiple bounces) -* (4) # of SRD particles inside a big particle -* (5) # of SRD particles whose velocity was rescaled to be < Vmax -* (6) # of bins for collision searching -* (7) # of bins for SRD velocity rotation -* (8) # of bins in which SRD temperature was computed -* (9) SRD temperature -* (10) # of SRD particles which have undergone max # of bounces -* (11) max # of bounces any SRD particle has had in a single step -* (12) # of reneighborings due to SRD particles moving too far +(1) # of SRD/big collision checks performed +(2) # of SRDs which had a collision +(3) # of SRD/big collisions (including multiple bounces) +(4) # of SRD particles inside a big particle +(5) # of SRD particles whose velocity was rescaled to be < Vmax +(6) # of bins for collision searching +(7) # of bins for SRD velocity rotation +(8) # of bins in which SRD temperature was computed +(9) SRD temperature +(10) # of SRD particles which have undergone max # of bounces +(11) max # of bounces any SRD particle has had in a single step +(12) # of reneighborings due to SRD particles moving too far No parameter of this fix can be used with the *start/stop* keywords of -the :doc:`run ` command. This fix is not invoked during :doc:`energy minimization `. +the :doc:`run ` command. This fix is not invoked during +:doc:`energy minimization `. Restrictions """""""""""" -This command can only be used if LAMMPS was built with the SRD -package. See the :doc:`Build package ` doc -page for more info. +This command can only be used if LAMMPS was built with the SRD package. +See the :doc:`Build package ` doc page for more info. Related commands """""""""""""""" @@ -403,7 +404,3 @@ no, and rescale = yes. **(Petersen)** Petersen, Lechman, Plimpton, Grest, in' t Veld, Schunk, J Chem Phys, 132, 174106 (2010). - -.. _Lechman: - -**(Lechman)** Lechman, et al, in preparation (2010). From 6ad5c0eced4a80b80a0c9b7aa2c3d8ee23450408 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 12 Oct 2023 23:24:11 -0400 Subject: [PATCH 174/219] port LAMMPS GUI to Qt6 while still supporting Qt5 --- tools/lammps-gui/CMakeLists.txt | 41 +++++++++++++++++++++++++------- tools/lammps-gui/chartviewer.cpp | 12 ++++++++-- tools/lammps-gui/chartviewer.h | 24 ++++++++++++------- tools/lammps-gui/lammpsgui.cpp | 16 ++++++++----- tools/lammps-gui/lammpsgui.h | 2 ++ 5 files changed, 71 insertions(+), 24 deletions(-) diff --git a/tools/lammps-gui/CMakeLists.txt b/tools/lammps-gui/CMakeLists.txt index 44fc45c0e2..83d5dc3216 100644 --- a/tools/lammps-gui/CMakeLists.txt +++ b/tools/lammps-gui/CMakeLists.txt @@ -11,6 +11,7 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON) option(LAMMPS_GUI_USE_PLUGIN "Load LAMMPS library dynamically at runtime" OFF) mark_as_advanced(LAMMPS_GUI_USE_PLUGIN) +option(LAMMPS_GUI_USE_QT5 "Prefer using Qt5 over Qt6" OFF) # checks # when this file is included as subdirectory in the LAMMPS build, many settings are directly imported @@ -73,7 +74,15 @@ if(CMAKE_SYSTEM_NAME STREQUAL "Windows") endif() # we require Qt 5 and at least version 5.12 at that. -find_package(Qt5 5.12 REQUIRED COMPONENTS Widgets Charts) +if(NOT LAMMPS_GUI_USE_QT5) + find_package(Qt6 6.2 COMPONENTS Widgets Charts) +endif() +if(NOT Qt6_FOUND) + find_package(Qt5 5.12 REQUIRED COMPONENTS Widgets Charts) + set(QT_VERSION_MAJOR "5") +else() + set(QT_VERSION_MAJOR "6") +endif() set(PROJECT_SOURCES main.cpp @@ -105,7 +114,11 @@ set(PROJECT_SOURCES ${PLUGIN_LOADER_SRC} ${ICON_RC_FILE} ) -qt5_add_resources(PROJECT_SOURCES lammpsgui.qrc) +if(QT_VERSION_MAJOR EQUAL 6) + qt6_add_resources(PROJECT_SOURCES lammpsgui.qrc) +else() + qt5_add_resources(PROJECT_SOURCES lammpsgui.qrc) +endif() if(APPLE) set(MACOSX_ICON_FILE ${LAMMPS_DIR}/cmake/packaging/lammps.icns) @@ -113,10 +126,22 @@ if(APPLE) set(MACOSX_BACKGROUND_FILE ${LAMMPS_DIR}/cmake/packaging/LAMMPS_DMG_Background.png) endif() -add_executable(lammps-gui - ${MACOSX_ICON_FILE} - ${PROJECT_SOURCES} -) +if(QT_VERSION_MAJOR EQUAL 6) + qt_add_executable(lammps-gui + MANUAL_FINALIZATION + ${MACOSX_ICON_FILE} + ${PROJECT_SOURCES} + ) +else() + add_executable(lammps-gui + ${MACOSX_ICON_FILE} + ${PROJECT_SOURCES} + ) +endif() + +if(QT_VERSION_MAJOR EQUAL 6) + qt_finalize_executable(lammps-gui) +endif() # compilation settings if(LAMMPS_GUI_USE_PLUGIN) @@ -128,7 +153,7 @@ else() endif() target_include_directories(lammps-gui PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) target_compile_definitions(lammps-gui PRIVATE LAMMPS_GUI_VERSION="${PROJECT_VERSION}") -target_link_libraries(lammps-gui PRIVATE Qt5::Widgets Qt5::Charts) +target_link_libraries(lammps-gui PRIVATE Qt${QT_VERSION_MAJOR}::Widgets Qt${VERSION_MAJOR}::Charts) if(BUILD_OMP) find_package(OpenMP COMPONENTS CXX REQUIRED) target_link_libraries(lammps-gui PRIVATE OpenMP::OpenMP_CXX) @@ -209,7 +234,7 @@ elseif((CMAKE_SYSTEM_NAME STREQUAL "Windows") AND CMAKE_CROSSCOMPILING) COMMENT "Create zip file with windows binaries" BYPRODUCT LAMMPS-Win10-amd64.zip WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) -elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux") +elseif((CMAKE_SYSTEM_NAME STREQUAL "Linux") AND NOT LAMMPS_GUI_USE_PLUGIN) install(TARGETS lammps-gui DESTINATION ${CMAKE_INSTALL_BINDIR}) install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/lammps-gui.desktop DESTINATION ${CMAKE_INSTALL_DATADIR}/applications/) install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/lammps-input.xml DESTINATION ${CMAKE_INSTALL_DATADIR}/mime/packages/) diff --git a/tools/lammps-gui/chartviewer.cpp b/tools/lammps-gui/chartviewer.cpp index f28625d9dc..ab03a110b5 100644 --- a/tools/lammps-gui/chartviewer.cpp +++ b/tools/lammps-gui/chartviewer.cpp @@ -15,11 +15,19 @@ #include "lammpsgui.h" +#include +#include +#include #include +#include +#include #include +#include +#include #include #include #include +#include #include using namespace QtCharts; @@ -288,7 +296,7 @@ void ChartViewer::add_data(int step, double data) if (last_step < step) { last_step = step; series->append(step, data); - auto points = series->pointsVector(); + auto points = series->points(); qreal xmin = 1.0e100; qreal xmax = -1.0e100; @@ -309,7 +317,7 @@ void ChartViewer::add_data(int step, double data) void ChartViewer::reset_zoom() { - auto points = series->pointsVector(); + auto points = series->points(); qreal xmin = 1.0e100; qreal xmax = -1.0e100; diff --git a/tools/lammps-gui/chartviewer.h b/tools/lammps-gui/chartviewer.h index 248fdad7bb..0954f4a9a8 100644 --- a/tools/lammps-gui/chartviewer.h +++ b/tools/lammps-gui/chartviewer.h @@ -14,16 +14,17 @@ #ifndef CHARTVIEWER_H #define CHARTVIEWER_H +#include #include #include #include -#include class QAction; class QMenuBar; class QMenu; -class QComboBox; +namespace QtCharts { class ChartViewer; +} class ChartWindow : public QWidget { Q_OBJECT @@ -64,12 +65,18 @@ private: QAction *closeAct, *stopAct, *quitAct; QString filename; - QList charts; + QList charts; }; /* -------------------------------------------------------------------- */ -class ChartViewer : public QtCharts::QChartView { +#include +#include +#include +#include + +namespace QtCharts { +class ChartViewer : public QChartView { Q_OBJECT public: @@ -86,11 +93,12 @@ public: private: int last_step, index; - QtCharts::QChart *chart; - QtCharts::QLineSeries *series; - QtCharts::QValueAxis *xaxis; - QtCharts::QValueAxis *yaxis; + QChart *chart; + QLineSeries *series; + QValueAxis *xaxis; + QValueAxis *yaxis; }; +} // namespace QtCharts #endif // Local Variables: diff --git a/tools/lammps-gui/lammpsgui.cpp b/tools/lammps-gui/lammpsgui.cpp index ba080dbec3..e0bcb38dc6 100644 --- a/tools/lammps-gui/lammpsgui.cpp +++ b/tools/lammps-gui/lammpsgui.cpp @@ -35,6 +35,7 @@ #include #include #include +#include #include #include #include @@ -69,8 +70,10 @@ LammpsGui::LammpsGui(QWidget *parent, const char *filename) : // enforce using the plain ASCII C locale within the GUI. QLocale::setDefault(QLocale("C")); - // register QList +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) + // register QList only needed for Qt5 qRegisterMetaTypeStreamOperators>("QList"); +#endif ui->setupUi(this); this->setCentralWidget(ui->textEdit); @@ -588,7 +591,8 @@ void LammpsGui::open_file(const QString &fileName) if (!file.open(QIODevice::ReadOnly | QFile::Text)) { QMessageBox::warning(this, "Warning", "Cannot open file " + path.absoluteFilePath() + ": " + - file.errorString() + ".\nWill create new file on saving editor buffer."); + file.errorString() + + ".\nWill create new file on saving editor buffer."); ui->textEdit->document()->setPlainText(QString()); } else { QTextStream in(&file); @@ -1039,9 +1043,9 @@ void LammpsGui::do_run(bool use_buffer) logwindow->document()->setDefaultFont(text_font); logwindow->setLineWrapMode(LogWindow::NoWrap); logwindow->setMinimumSize(400, 300); - QShortcut *shortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_W), logwindow); + QShortcut *shortcut = new QShortcut(QKeySequence(Qt::CTRL | Qt::Key_W), logwindow); QObject::connect(shortcut, &QShortcut::activated, logwindow, &LogWindow::close); - shortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_Slash), logwindow); + shortcut = new QShortcut(QKeySequence(Qt::CTRL | Qt::Key_Slash), logwindow); QObject::connect(shortcut, &QShortcut::activated, this, &LammpsGui::stop_run); if (settings.value("viewlog", true).toBool()) logwindow->show(); @@ -1058,9 +1062,9 @@ void LammpsGui::do_run(bool use_buffer) .arg(run_counter)); chartwindow->setWindowIcon(QIcon(":/icons/lammps-icon-128x128.png")); chartwindow->setMinimumSize(400, 300); - shortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_W), chartwindow); + shortcut = new QShortcut(QKeySequence(Qt::CTRL | Qt::Key_W), chartwindow); QObject::connect(shortcut, &QShortcut::activated, chartwindow, &ChartWindow::close); - shortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_Slash), chartwindow); + shortcut = new QShortcut(QKeySequence(Qt::CTRL | Qt::Key_Slash), chartwindow); QObject::connect(shortcut, &QShortcut::activated, this, &LammpsGui::stop_run); if (settings.value("viewchart", true).toBool()) chartwindow->show(); diff --git a/tools/lammps-gui/lammpsgui.h b/tools/lammps-gui/lammpsgui.h index 0c622f0285..0dd34f2c49 100644 --- a/tools/lammps-gui/lammpsgui.h +++ b/tools/lammps-gui/lammpsgui.h @@ -16,8 +16,10 @@ #include +#include #include #include +#include #include #include From 506de7015df9c6049033f9084a6cf62420ef2b5e Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 13 Oct 2023 05:13:30 -0400 Subject: [PATCH 175/219] document support for building LAMMPS GUI with Qt6 --- doc/src/Tools.rst | 15 +++++++++++---- tools/lammps-gui/TODO.md | 1 - 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/doc/src/Tools.rst b/doc/src/Tools.rst index a42e7c56a5..49022a4ee9 100644 --- a/doc/src/Tools.rst +++ b/doc/src/Tools.rst @@ -702,11 +702,15 @@ Prerequisites and portability LAMMPS GUI is programmed in C++ based on the C++11 standard and using the `Qt GUI framework `_. Currently, Qt version 5.12 or later is required; Qt 5.15LTS is -recommended; Qt 6.x not (yet) supported. Building LAMMPS with CMake is -required. The LAMMPS GUI has been successfully compiled and tested on: +recommended; support for Qt version 6.x is under active development and +thus far only tested with Qt 6.5LTS on Linux. Building LAMMPS with +CMake is required. + +The LAMMPS GUI has been successfully compiled and tested on: - Ubuntu Linux 20.04LTS x86_64 using GCC 9, Qt version 5.12 - Fedora Linux 38 x86\_64 using GCC 13 and Clang 16, Qt version 5.15LTS +- Fedora Linux 38 x86\_64 using GCC 13, Qt version 6.5LTS - Apple macOS 12 (Monterey) and macOS 13 (Ventura) with Xcode on arm64 and x86\_64, Qt version 5.15LTS - Windows 10 and 11 x86_64 with Visual Studio 2022 and Visual C++ 14.36, Qt version 5.15LTS - Windows 10 and 11 x86_64 with MinGW / GCC 10.0 cross-compiler on Fedora 38, Qt version 5.15LTS @@ -717,7 +721,7 @@ required. The LAMMPS GUI has been successfully compiled and tested on: Pre-compiled executables ^^^^^^^^^^^^^^^^^^^^^^^^ -Pre-compiled LAMMPS executables including the GUI are currently +Pre-compiled LAMMPS executable packages that include the GUI are currently available from https://download.lammps.org/static or https://github.com/lammps/lammps/releases. You can unpack the archives (or mount the macOS disk image) and run the GUI directly in place. The @@ -742,7 +746,10 @@ stored in a location where CMake can find them without additional help. Otherwise, the location of the Qt library installation must be indicated by setting ``-D Qt5_DIR=/path/to/qt5/lib/cmake/Qt5``, which is a path to a folder inside the Qt installation that contains the file -``Qt5Config.cmake``. +``Qt5Config.cmake``. Similarly, for Qt6 the location of the Qt library +installation can be indicated by setting ``-D Qt6_DIR=/path/to/qt6/lib/cmake/Qt6``, +if necessary. When both, Qt5 and Qt6 are available, Qt6 will be preferred +unless ``-D LAMMPS_GUI_USE_QT5=yes`` is set. It should be possible to build the LAMMPS GUI as a standalone compilation (e.g. when LAMMPS has been compiled with traditional make), diff --git a/tools/lammps-gui/TODO.md b/tools/lammps-gui/TODO.md index e4ca44ba3d..ee05e67225 100644 --- a/tools/lammps-gui/TODO.md +++ b/tools/lammps-gui/TODO.md @@ -23,7 +23,6 @@ LAMMPS-GUI TODO list: # Long term ideas (v2.x) - rewrite entire application to build the App and its layout manually -- port to Qt6 (with compatibility to Qt5?) - also a rewrite should establish consistent naming conventions. now we have a mix of LAMMPS style, Qt style, and others. - add option to attach a debugger to the running program (highly non-portable, need customization support in preferences) - write a "wizard" dialog that can be used for beginners to create an input file template for a few typical use scenarios From 6195be5af72baea2a7cd8870b3c0bdb615401da7 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 13 Oct 2023 05:59:20 -0400 Subject: [PATCH 176/219] make keyboard shortcut handling consistent across the entire app --- tools/lammps-gui/chartviewer.cpp | 7 ++++--- tools/lammps-gui/imageviewer.cpp | 5 +++-- tools/lammps-gui/logwindow.cpp | 32 +++++++++++++++++++++++++++----- tools/lammps-gui/logwindow.h | 1 + tools/lammps-gui/slideshow.cpp | 7 ++++--- 5 files changed, 39 insertions(+), 13 deletions(-) diff --git a/tools/lammps-gui/chartviewer.cpp b/tools/lammps-gui/chartviewer.cpp index ab03a110b5..ee29ab9540 100644 --- a/tools/lammps-gui/chartviewer.cpp +++ b/tools/lammps-gui/chartviewer.cpp @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include @@ -61,13 +62,13 @@ ChartWindow::ChartWindow(const QString &_filename, QWidget *parent) : file->addSeparator(); stopAct = file->addAction("Stop &Run", this, &ChartWindow::stop_run); stopAct->setIcon(QIcon(":/icons/process-stop.png")); - stopAct->setShortcut(QKeySequence::fromString("Ctrl+/")); + stopAct->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_Slash)); closeAct = file->addAction("&Close", this, &QWidget::close); closeAct->setIcon(QIcon(":/icons/window-close.png")); - closeAct->setShortcut(QKeySequence::fromString("Ctrl+W")); + closeAct->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_W)); quitAct = file->addAction("&Quit", this, &ChartWindow::quit); quitAct->setIcon(QIcon(":/icons/application-exit.png")); - quitAct->setShortcut(QKeySequence::fromString("Ctrl+Q")); + quitAct->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_Q)); auto *layout = new QVBoxLayout; layout->addLayout(top); setLayout(layout); diff --git a/tools/lammps-gui/imageviewer.cpp b/tools/lammps-gui/imageviewer.cpp index ee81f61253..7406f1860a 100644 --- a/tools/lammps-gui/imageviewer.cpp +++ b/tools/lammps-gui/imageviewer.cpp @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -558,10 +559,10 @@ void ImageViewer::createActions() fileMenu->addSeparator(); QAction *exitAct = fileMenu->addAction("&Close", this, &QWidget::close); exitAct->setIcon(QIcon(":/icons/window-close.png")); - exitAct->setShortcut(QKeySequence::fromString("Ctrl+W")); + exitAct->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_W)); QAction *quitAct = fileMenu->addAction("&Quit", this, &ImageViewer::quit); quitAct->setIcon(QIcon(":/icons/application-exit.png")); - quitAct->setShortcut(QKeySequence::fromString("Ctrl+Q")); + quitAct->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_Q)); } void ImageViewer::updateActions() diff --git a/tools/lammps-gui/logwindow.cpp b/tools/lammps-gui/logwindow.cpp index ab1886f1bd..374c4c89b1 100644 --- a/tools/lammps-gui/logwindow.cpp +++ b/tools/lammps-gui/logwindow.cpp @@ -35,12 +35,14 @@ LogWindow::LogWindow(const QString &_filename, QWidget *parent) : QSettings settings; resize(settings.value("logx", 500).toInt(), settings.value("logy", 320).toInt()); - auto action = new QShortcut(QKeySequence::fromString("Ctrl+S"), this); + auto action = new QShortcut(QKeySequence(Qt::CTRL | Qt::Key_S), this); connect(action, &QShortcut::activated, this, &LogWindow::save_as); - action = new QShortcut(QKeySequence::fromString("Ctrl+Q"), this); + action = new QShortcut(QKeySequence(Qt::CTRL | Qt::Key_Q), this); connect(action, &QShortcut::activated, this, &LogWindow::quit); - action = new QShortcut(QKeySequence(Qt::Key_Slash, Qt::CTRL), this); + action = new QShortcut(QKeySequence(Qt::CTRL | Qt::Key_Slash), this); connect(action, &QShortcut::activated, this, &LogWindow::stop_run); + + installEventFilter(this); } void LogWindow::closeEvent(QCloseEvent *event) @@ -99,15 +101,35 @@ void LogWindow::contextMenuEvent(QContextMenuEvent *event) menu->addSeparator(); auto action = menu->addAction(QString("Save Log to File ...")); action->setIcon(QIcon(":/icons/document-save-as.png")); - action->setShortcut(QKeySequence::fromString("Ctrl+S")); + action->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_S)); connect(action, &QAction::triggered, this, &LogWindow::save_as); action = menu->addAction("&Close Window", this, &QWidget::close); action->setIcon(QIcon(":/icons/window-close.png")); - action->setShortcut(QKeySequence::fromString("Ctrl+W")); + action->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_W)); menu->exec(event->globalPos()); delete menu; } +// event filter to handle "Ambiguous shortcut override" issues +bool LogWindow::eventFilter(QObject *watched, QEvent *event) +{ + if (event->type() == QEvent::ShortcutOverride) { + QKeyEvent *keyEvent = dynamic_cast(event); + if (!keyEvent) return QWidget::eventFilter(watched, event); + if (keyEvent->modifiers().testFlag(Qt::ControlModifier) && keyEvent->key() == '/') { + stop_run(); + event->accept(); + return true; + } + if (keyEvent->modifiers().testFlag(Qt::ControlModifier) && keyEvent->key() == 'W') { + close(); + event->accept(); + return true; + } + } + return QWidget::eventFilter(watched, event); +} + // Local Variables: // c-basic-offset: 4 // End: diff --git a/tools/lammps-gui/logwindow.h b/tools/lammps-gui/logwindow.h index 8923e35ee5..ad0691d0cc 100644 --- a/tools/lammps-gui/logwindow.h +++ b/tools/lammps-gui/logwindow.h @@ -30,6 +30,7 @@ private slots: protected: void closeEvent(QCloseEvent *event) override; void contextMenuEvent(QContextMenuEvent *event) override; + bool eventFilter(QObject *watched, QEvent *event) override; private: QString filename; diff --git a/tools/lammps-gui/slideshow.cpp b/tools/lammps-gui/slideshow.cpp index de7742f22f..92eca9a530 100644 --- a/tools/lammps-gui/slideshow.cpp +++ b/tools/lammps-gui/slideshow.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -50,11 +51,11 @@ SlideShow::SlideShow(const QString &fileName, QWidget *parent) : imageName->setAlignment(Qt::AlignCenter); imageName->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - auto *shortcut = new QShortcut(QKeySequence::fromString("Ctrl+W"), this); + auto *shortcut = new QShortcut(QKeySequence(Qt::CTRL | Qt::Key_W), this); QObject::connect(shortcut, &QShortcut::activated, this, &QWidget::close); - shortcut = new QShortcut(QKeySequence::fromString("Ctrl+/"), this); + shortcut = new QShortcut(QKeySequence(Qt::CTRL | Qt::Key_Slash), this); QObject::connect(shortcut, &QShortcut::activated, this, &SlideShow::stop_run); - shortcut = new QShortcut(QKeySequence::fromString("Ctrl+Q"), this); + shortcut = new QShortcut(QKeySequence(Qt::CTRL | Qt::Key_Q), this); QObject::connect(shortcut, &QShortcut::activated, this, &SlideShow::quit); buttonBox = new QDialogButtonBox(QDialogButtonBox::Close); From 3ebcb0f6f18cf68c38ae89a4c0b65911fda5c90d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 13 Oct 2023 06:00:29 -0400 Subject: [PATCH 177/219] store settings to different locations for different Qt versions --- tools/lammps-gui/lammpsgui.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tools/lammps-gui/lammpsgui.cpp b/tools/lammps-gui/lammpsgui.cpp index e0bcb38dc6..11f2554b55 100644 --- a/tools/lammps-gui/lammpsgui.cpp +++ b/tools/lammps-gui/lammpsgui.cpp @@ -84,9 +84,13 @@ LammpsGui::LammpsGui(QWidget *parent, const char *filename) : // use $HOME if we get dropped to "/" like on macOS if (current_dir == "/") current_dir = QDir::homePath(); +#define stringify(x) myxstr(x) +#define myxstr(x) #x QCoreApplication::setOrganizationName("The LAMMPS Developers"); QCoreApplication::setOrganizationDomain("lammps.org"); - QCoreApplication::setApplicationName("LAMMPS GUI"); + QCoreApplication::setApplicationName("LAMMPS GUI - QT" stringify(QT_VERSION_MAJOR)); +#undef stringify +#undef myxstr // restore and initialize settings QSettings settings; From d29ae7af92a2d6716cb106eb02b4296000b5886e Mon Sep 17 00:00:00 2001 From: Yury Lysogorskiy Date: Fri, 13 Oct 2023 12:05:28 +0200 Subject: [PATCH 178/219] upd ML-PACE.cmake and Install.py (new version v.2023.10.04 and checksum) that should fix build issues with KOKOKOS --- cmake/Modules/Packages/ML-PACE.cmake | 4 ++-- lib/pace/Install.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cmake/Modules/Packages/ML-PACE.cmake b/cmake/Modules/Packages/ML-PACE.cmake index 30aa433a58..ce8f02f5f4 100644 --- a/cmake/Modules/Packages/ML-PACE.cmake +++ b/cmake/Modules/Packages/ML-PACE.cmake @@ -1,6 +1,6 @@ -set(PACELIB_URL "https://github.com/ICAMS/lammps-user-pace/archive/refs/tags/v.2023.10.04.pre.tar.gz" CACHE STRING "URL for PACE evaluator library sources") +set(PACELIB_URL "https://github.com/ICAMS/lammps-user-pace/archive/refs/tags/v.2023.10.04.tar.gz" CACHE STRING "URL for PACE evaluator library sources") -set(PACELIB_MD5 "61ba11a37ee00de8365b18b521d394a6" CACHE STRING "MD5 checksum of PACE evaluator library tarball") +set(PACELIB_MD5 "70ff79f4e59af175e55d24f3243ad1ff" CACHE STRING "MD5 checksum of PACE evaluator library tarball") mark_as_advanced(PACELIB_URL) mark_as_advanced(PACELIB_MD5) GetFallbackURL(PACELIB_URL PACELIB_FALLBACK) diff --git a/lib/pace/Install.py b/lib/pace/Install.py index 2a8cd2f1f3..8d31852e44 100644 --- a/lib/pace/Install.py +++ b/lib/pace/Install.py @@ -18,11 +18,11 @@ from install_helpers import fullpath, geturl, checkmd5sum, getfallback # settings thisdir = fullpath('.') -version ='v.2023.10.04.pre' +version ='v.2023.10.04' # known checksums for different PACE versions. used to validate the download. checksums = { \ - 'v.2023.10.04.pre': '61ba11a37ee00de8365b18b521d394a6' + 'v.2023.10.04': '70ff79f4e59af175e55d24f3243ad1ff' } parser = ArgumentParser(prog='Install.py', description="LAMMPS library build wrapper script") From 262913695824a407091b16a493cd1165f0fff591 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 13 Oct 2023 06:18:34 -0400 Subject: [PATCH 179/219] avoid uninitialized data access and segfaults when calling main widget functions --- tools/lammps-gui/chartviewer.cpp | 8 ++++---- tools/lammps-gui/imageviewer.cpp | 4 ++-- tools/lammps-gui/logwindow.cpp | 8 ++++---- tools/lammps-gui/preferences.cpp | 4 ++-- tools/lammps-gui/slideshow.cpp | 8 ++++---- 5 files changed, 16 insertions(+), 16 deletions(-) diff --git a/tools/lammps-gui/chartviewer.cpp b/tools/lammps-gui/chartviewer.cpp index ee29ab9540..c981b2777d 100644 --- a/tools/lammps-gui/chartviewer.cpp +++ b/tools/lammps-gui/chartviewer.cpp @@ -124,10 +124,10 @@ void ChartWindow::add_data(int step, double data, int index) void ChartWindow::quit() { - LammpsGui *main; + LammpsGui *main = nullptr; for (QWidget *widget : QApplication::topLevelWidgets()) if (widget->objectName() == "LammpsGui") main = dynamic_cast(widget); - main->quit(); + if (main) main->quit(); } void ChartWindow::reset_zoom() @@ -138,10 +138,10 @@ void ChartWindow::reset_zoom() void ChartWindow::stop_run() { - LammpsGui *main; + LammpsGui *main = nullptr; for (QWidget *widget : QApplication::topLevelWidgets()) if (widget->objectName() == "LammpsGui") main = dynamic_cast(widget); - main->stop_run(); + if (main) main->stop_run(); } void ChartWindow::saveAs() diff --git a/tools/lammps-gui/imageviewer.cpp b/tools/lammps-gui/imageviewer.cpp index 7406f1860a..00b08f3f47 100644 --- a/tools/lammps-gui/imageviewer.cpp +++ b/tools/lammps-gui/imageviewer.cpp @@ -533,10 +533,10 @@ void ImageViewer::copy() {} void ImageViewer::quit() { - LammpsGui *main; + LammpsGui *main = nullptr; for (QWidget *widget : QApplication::topLevelWidgets()) if (widget->objectName() == "LammpsGui") main = dynamic_cast(widget); - main->quit(); + if (main) main->quit(); } void ImageViewer::saveFile(const QString &fileName) diff --git a/tools/lammps-gui/logwindow.cpp b/tools/lammps-gui/logwindow.cpp index 374c4c89b1..73ec81d06c 100644 --- a/tools/lammps-gui/logwindow.cpp +++ b/tools/lammps-gui/logwindow.cpp @@ -57,18 +57,18 @@ void LogWindow::closeEvent(QCloseEvent *event) void LogWindow::quit() { - LammpsGui *main; + LammpsGui *main = nullptr; for (QWidget *widget : QApplication::topLevelWidgets()) if (widget->objectName() == "LammpsGui") main = dynamic_cast(widget); - main->quit(); + if (main) main->quit(); } void LogWindow::stop_run() { - LammpsGui *main; + LammpsGui *main = nullptr; for (QWidget *widget : QApplication::topLevelWidgets()) if (widget->objectName() == "LammpsGui") main = dynamic_cast(widget); - main->stop_run(); + if (main) main->stop_run(); } void LogWindow::save_as() diff --git a/tools/lammps-gui/preferences.cpp b/tools/lammps-gui/preferences.cpp index c760e6610b..f7fe9ec025 100644 --- a/tools/lammps-gui/preferences.cpp +++ b/tools/lammps-gui/preferences.cpp @@ -286,12 +286,12 @@ GeneralTab::GeneralTab(QSettings *_settings, LammpsWrapper *_lammps, QWidget *pa void GeneralTab::updatefonts(const QFont &all, const QFont &text) { - LammpsGui *main; + LammpsGui *main = nullptr; for (QWidget *widget : QApplication::topLevelWidgets()) if (widget->objectName() == "LammpsGui") main = dynamic_cast(widget); QApplication::setFont(all); - main->ui->textEdit->document()->setDefaultFont(text); + if (main) main->ui->textEdit->document()->setDefaultFont(text); } void GeneralTab::newallfont() diff --git a/tools/lammps-gui/slideshow.cpp b/tools/lammps-gui/slideshow.cpp index 92eca9a530..140c703ca3 100644 --- a/tools/lammps-gui/slideshow.cpp +++ b/tools/lammps-gui/slideshow.cpp @@ -199,18 +199,18 @@ void SlideShow::loadImage(int idx) void SlideShow::quit() { - LammpsGui *main; + LammpsGui *main = nullptr; for (QWidget *widget : QApplication::topLevelWidgets()) if (widget->objectName() == "LammpsGui") main = dynamic_cast(widget); - main->quit(); + if (main) main->quit(); } void SlideShow::stop_run() { - LammpsGui *main; + LammpsGui *main = nullptr; for (QWidget *widget : QApplication::topLevelWidgets()) if (widget->objectName() == "LammpsGui") main = dynamic_cast(widget); - main->stop_run(); + if (main) main->stop_run(); } void SlideShow::movie() From 926de1575c74d98cec2319c54ef4ddc2b75e4ad0 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 13 Oct 2023 06:18:56 -0400 Subject: [PATCH 180/219] avoid completion on empty lines --- tools/lammps-gui/codeeditor.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/lammps-gui/codeeditor.cpp b/tools/lammps-gui/codeeditor.cpp index b7a14871b7..f374b098e2 100644 --- a/tools/lammps-gui/codeeditor.cpp +++ b/tools/lammps-gui/codeeditor.cpp @@ -568,6 +568,7 @@ void CodeEditor::keyPressEvent(QKeyEvent *event) if (automatic_completion) { auto cursor = textCursor(); auto line = cursor.block().text(); + if (line.isEmpty()) return; // QTextCursor::WordUnderCursor is unusable here since recognizes '/' as word boundary. // Work around it by manually searching for the location of the beginning of the word. From 3db7e1f9cf3b370da126dbe9b4d667d108833735 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 13 Oct 2023 06:50:06 -0400 Subject: [PATCH 181/219] avoid invalid data accesses --- tools/lammps-gui/chartviewer.cpp | 5 ++++- tools/lammps-gui/chartviewer.h | 4 ++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/tools/lammps-gui/chartviewer.cpp b/tools/lammps-gui/chartviewer.cpp index c981b2777d..fbd888f1cd 100644 --- a/tools/lammps-gui/chartviewer.cpp +++ b/tools/lammps-gui/chartviewer.cpp @@ -85,7 +85,10 @@ int ChartWindow::get_step() const { if (charts.size() > 0) { auto *v = charts[0]; - return (int)v->get_step(v->get_count() - 1); + if (v) + return (int)v->get_step(v->get_count() - 1); + else + return -1; } else { return -1; } diff --git a/tools/lammps-gui/chartviewer.h b/tools/lammps-gui/chartviewer.h index 0954f4a9a8..da0468eaf8 100644 --- a/tools/lammps-gui/chartviewer.h +++ b/tools/lammps-gui/chartviewer.h @@ -88,8 +88,8 @@ public: int get_index() const { return index; }; int get_count() const { return series->count(); } const char *get_title() const { return series->name().toLocal8Bit(); } - double get_step(int index) const { return series->at(index).x(); } - double get_data(int index) const { return series->at(index).y(); } + double get_step(int index) const { return (index < 0) ? 0.0 : series->at(index).x(); } + double get_data(int index) const { return (index < 0) ? 0.0 : series->at(index).y(); } private: int last_step, index; From 50d2ebc27d7fd96cc94153540d953a02d9abd5bf Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 13 Oct 2023 06:50:52 -0400 Subject: [PATCH 182/219] auto-detect OpenMP support also when compiling a standalone binary --- tools/lammps-gui/CMakeLists.txt | 35 +++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/tools/lammps-gui/CMakeLists.txt b/tools/lammps-gui/CMakeLists.txt index 83d5dc3216..edfeeb1128 100644 --- a/tools/lammps-gui/CMakeLists.txt +++ b/tools/lammps-gui/CMakeLists.txt @@ -13,6 +13,41 @@ option(LAMMPS_GUI_USE_PLUGIN "Load LAMMPS library dynamically at runtime" OFF) mark_as_advanced(LAMMPS_GUI_USE_PLUGIN) option(LAMMPS_GUI_USE_QT5 "Prefer using Qt5 over Qt6" OFF) +include(CheckIncludeFileCXX) +# helper function to check for usable omp.h header +function(check_omp_h_include) + find_package(OpenMP COMPONENTS CXX QUIET) + if(OpenMP_CXX_FOUND) + set(CMAKE_REQUIRED_FLAGS ${OpenMP_CXX_FLAGS}) + set(CMAKE_REQUIRED_INCLUDES ${OpenMP_CXX_INCLUDE_DIRS}) + set(CMAKE_REQUIRED_LINK_OPTIONS ${OpenMP_CXX_FLAGS}) + set(CMAKE_REQUIRED_LIBRARIES ${OpenMP_CXX_LIBRARIES}) + check_include_file_cxx(omp.h _have_omp_h) + else() + set(_have_omp_h FALSE) + endif() + set(HAVE_OMP_H_INCLUDE ${_have_omp_h} PARENT_SCOPE) +endfunction() + +# detect if we may enable OpenMP support by default +set(BUILD_OMP_DEFAULT OFF) +find_package(OpenMP COMPONENTS CXX QUIET) +if(OpenMP_CXX_FOUND) + check_omp_h_include() + if(HAVE_OMP_H_INCLUDE) + set(BUILD_OMP_DEFAULT ON) + endif() +endif() + +option(BUILD_OMP "Build with OpenMP support" ${BUILD_OMP_DEFAULT}) +if(BUILD_OMP) + find_package(OpenMP COMPONENTS CXX REQUIRED) + check_omp_h_include() + if(NOT HAVE_OMP_H_INCLUDE) + message(FATAL_ERROR "Cannot find the 'omp.h' header file required for full OpenMP support") + endif() +endif() + # checks # when this file is included as subdirectory in the LAMMPS build, many settings are directly imported if(LAMMPS_DIR) From 2f6782636382e25eb832292606951ac387d2a3e7 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 13 Oct 2023 06:59:06 -0400 Subject: [PATCH 183/219] indicate whether multi-thread is available in preferences --- tools/lammps-gui/preferences.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tools/lammps-gui/preferences.cpp b/tools/lammps-gui/preferences.cpp index f7fe9ec025..fd01bb5046 100644 --- a/tools/lammps-gui/preferences.cpp +++ b/tools/lammps-gui/preferences.cpp @@ -410,11 +410,19 @@ AcceleratorTab::AcceleratorTab(QSettings *_settings, LammpsWrapper *_lammps, QWi #endif auto *choices = new QFrame; auto *choiceLayout = new QVBoxLayout; +#if defined(_OPENMP) auto *ntlabel = new QLabel(QString("Number of threads (max %1):").arg(maxthreads)); auto *ntchoice = new QLineEdit(settings->value("nthreads", maxthreads).toString()); +#else + auto *ntlabel = new QLabel(QString("Number of threads (OpenMP not available):")); + auto *ntchoice = new QLineEdit("1"); +#endif auto *intval = new QIntValidator(1, maxthreads, this); ntchoice->setValidator(intval); ntchoice->setObjectName("nthreads"); +#if !defined(_OPENMP) + ntchoice->setEnabled(false); +#endif choiceLayout->addWidget(ntlabel); choiceLayout->addWidget(ntchoice); From ae8791c6820ca858b809237aef7a229ae815ffbb Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 13 Oct 2023 08:17:10 -0400 Subject: [PATCH 184/219] avoid out of bounds access to string under cursor --- tools/lammps-gui/codeeditor.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tools/lammps-gui/codeeditor.cpp b/tools/lammps-gui/codeeditor.cpp index f374b098e2..e95f576be0 100644 --- a/tools/lammps-gui/codeeditor.cpp +++ b/tools/lammps-gui/codeeditor.cpp @@ -572,7 +572,8 @@ void CodeEditor::keyPressEvent(QKeyEvent *event) // QTextCursor::WordUnderCursor is unusable here since recognizes '/' as word boundary. // Work around it by manually searching for the location of the beginning of the word. - int begin = cursor.positionInBlock(); + int begin = qMin(cursor.positionInBlock(), line.length() - 1); + while (begin >= 0) { if (line[begin].isSpace()) break; --begin; @@ -749,7 +750,7 @@ void CodeEditor::runCompletion() // QTextCursor::WordUnderCursor is unusable here since it recognizes '/' as word boundary. // Work around it by manually searching for the beginning and end position of the word // under the cursor and then using that substring. - int begin = cursor.positionInBlock(); + int begin = qMin(cursor.positionInBlock(), line.length() - 1); line = cursor.block().text(); while (begin >= 0) { if (line[begin].isSpace()) break; From d8e6b432fa537efde99ac561cd3e66a3fb8f1482 Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Fri, 13 Oct 2023 10:48:37 -0600 Subject: [PATCH 185/219] Port recent changes --- src/KOKKOS/pair_yukawa_colloid_kokkos.h | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/KOKKOS/pair_yukawa_colloid_kokkos.h b/src/KOKKOS/pair_yukawa_colloid_kokkos.h index 060b621a8a..83ce58e898 100644 --- a/src/KOKKOS/pair_yukawa_colloid_kokkos.h +++ b/src/KOKKOS/pair_yukawa_colloid_kokkos.h @@ -96,19 +96,21 @@ class PairYukawaColloidKokkos : public PairYukawaColloid { int nlocal,nall,eflag,vflag; void allocate() override; - friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; friend struct PairComputeFunctor; friend struct PairComputeFunctor; - friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; friend struct PairComputeFunctor; friend struct PairComputeFunctor; - friend EV_FLOAT pair_compute_neighlist( + friend EV_FLOAT pair_compute_neighlist(PairYukawaColloidKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairYukawaColloidKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist( PairYukawaColloidKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist( + friend EV_FLOAT pair_compute_neighlist( PairYukawaColloidKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist( - PairYukawaColloidKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute( + friend EV_FLOAT pair_compute( PairYukawaColloidKokkos*,NeighListKokkos*); friend void pair_virial_fdotr_compute(PairYukawaColloidKokkos*); From 41a7f648474cb2ef34550323d0f030c53dba7f70 Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Fri, 13 Oct 2023 10:58:14 -0600 Subject: [PATCH 186/219] Update dependency --- src/Depend.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Depend.sh b/src/Depend.sh index b88c527b55..dbffb2dba0 100755 --- a/src/Depend.sh +++ b/src/Depend.sh @@ -64,6 +64,7 @@ fi if (test $1 = "COLLOID") then depend GPU + depend KOKKOS depend OPENMP fi From 6c6f35dd690a7b5bc5e276035f0889555051035b Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 13 Oct 2023 14:39:20 -0400 Subject: [PATCH 187/219] modernize loops over fixes --- src/KOKKOS/atom_kokkos.cpp | 42 +++++++++++------------------- src/KOKKOS/fix_dt_reset_kokkos.cpp | 2 +- src/KOKKOS/neigh_bond_kokkos.cpp | 5 ++-- 3 files changed, 18 insertions(+), 31 deletions(-) diff --git a/src/KOKKOS/atom_kokkos.cpp b/src/KOKKOS/atom_kokkos.cpp index f118b2a204..e97213cb4b 100644 --- a/src/KOKKOS/atom_kokkos.cpp +++ b/src/KOKKOS/atom_kokkos.cpp @@ -132,27 +132,20 @@ void AtomKokkos::init() void AtomKokkos::update_property_atom() { - nprop_atom = 0; - for (int ifix = 0; ifix < modify->nfix; ifix++) { - if (modify->fix[ifix] && utils::strmatch(modify->fix[ifix]->style, "^property/atom")) { - auto fix_i = modify->fix[ifix]; - if (!fix_i->kokkosable) - error->all(FLERR, "KOKKOS package requires a Kokkos-enabled version of fix property/atom"); + std::vector prop_atom_fixes; + for (auto &ifix : modify->get_fix_by_style("^property/atom")) { + if (!ifix->kokkosable) + error->all(FLERR, "KOKKOS package requires a Kokkos-enabled version of fix property/atom"); - memory->grow(prop_atom,nprop_atom+1,"atom::prop_atom"); - prop_atom[nprop_atom++] = ifix; - } + prop_atom_fixes.push_back(ifix); } - delete [] fix_prop_atom; - fix_prop_atom = new FixPropertyAtomKokkos*[nprop_atom]; + delete[] fix_prop_atom; + fix_prop_atom = new FixPropertyAtomKokkos *[prop_atom_fixes.size()]; - for (int n = 0; n < nprop_atom; n++) { - auto fix_n = dynamic_cast(modify->fix[prop_atom[n]]); - fix_prop_atom[n] = fix_n; - } - - memory->destroy(prop_atom); + int n = 0; + for (auto &ifix : prop_atom_fixes) + fix_prop_atom[n++] = dynamic_cast(ifix); } /* ---------------------------------------------------------------------- */ @@ -161,13 +154,11 @@ void AtomKokkos::sync(const ExecutionSpace space, unsigned int mask) { if (space == Device && lmp->kokkos->auto_sync) { avecKK->modified(Host, mask); - for (int n = 0; n < nprop_atom; n++) - fix_prop_atom[n]->modified(Host, mask); + for (int n = 0; n < nprop_atom; n++) fix_prop_atom[n]->modified(Host, mask); } avecKK->sync(space, mask); - for (int n = 0; n < nprop_atom; n++) - fix_prop_atom[n]->sync(space, mask); + for (int n = 0; n < nprop_atom; n++) fix_prop_atom[n]->sync(space, mask); } /* ---------------------------------------------------------------------- */ @@ -175,13 +166,11 @@ void AtomKokkos::sync(const ExecutionSpace space, unsigned int mask) void AtomKokkos::modified(const ExecutionSpace space, unsigned int mask) { avecKK->modified(space, mask); - for (int n = 0; n < nprop_atom; n++) - fix_prop_atom[n]->modified(space, mask); + for (int n = 0; n < nprop_atom; n++) fix_prop_atom[n]->modified(space, mask); if (space == Device && lmp->kokkos->auto_sync) { avecKK->sync(Host, mask); - for (int n = 0; n < nprop_atom; n++) - fix_prop_atom[n]->sync(Host, mask); + for (int n = 0; n < nprop_atom; n++) fix_prop_atom[n]->sync(Host, mask); } } @@ -190,8 +179,7 @@ void AtomKokkos::modified(const ExecutionSpace space, unsigned int mask) void AtomKokkos::sync_overlapping_device(const ExecutionSpace space, unsigned int mask) { avecKK->sync_overlapping_device(space, mask); - for (int n = 0; n < nprop_atom; n++) - fix_prop_atom[n]->sync_overlapping_device(space, mask); + for (int n = 0; n < nprop_atom; n++) fix_prop_atom[n]->sync_overlapping_device(space, mask); } /* ---------------------------------------------------------------------- */ diff --git a/src/KOKKOS/fix_dt_reset_kokkos.cpp b/src/KOKKOS/fix_dt_reset_kokkos.cpp index f3435e711e..4c7545cee0 100644 --- a/src/KOKKOS/fix_dt_reset_kokkos.cpp +++ b/src/KOKKOS/fix_dt_reset_kokkos.cpp @@ -113,7 +113,7 @@ void FixDtResetKokkos::end_of_step() update->dt = dt; update->dt_default = 0; if (force->pair) force->pair->reset_dt(); - for (int i = 0; i < modify->nfix; i++) modify->fix[i]->reset_dt(); + for (auto &ifix : modify->get_fix_list()) ifix->reset_dt(); output->reset_dt(); } diff --git a/src/KOKKOS/neigh_bond_kokkos.cpp b/src/KOKKOS/neigh_bond_kokkos.cpp index 4cfe440b1f..b749590779 100644 --- a/src/KOKKOS/neigh_bond_kokkos.cpp +++ b/src/KOKKOS/neigh_bond_kokkos.cpp @@ -112,9 +112,8 @@ void NeighBondKokkos::init_topology_kk() { int i,m; int bond_off = 0; int angle_off = 0; - for (i = 0; i < modify->nfix; i++) - if ((strcmp(modify->fix[i]->style,"shake") == 0) - || (strcmp(modify->fix[i]->style,"rattle") == 0)) + for (const auto &ifix : modify->get_fix_list()) + if (utils::strmatch(ifix->style,"^shake") || utils::strmatch(ifix->style,"^rattle")) bond_off = angle_off = 1; if (force->bond && force->bond_match("quartic")) bond_off = 1; From 69d82b9bc6dbbbfed3a31e9f55891f906d33f22e Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Fri, 13 Oct 2023 12:47:46 -0600 Subject: [PATCH 188/219] Remove unused variable --- src/KOKKOS/atom_kokkos.cpp | 1 - src/KOKKOS/atom_kokkos.h | 1 - 2 files changed, 2 deletions(-) diff --git a/src/KOKKOS/atom_kokkos.cpp b/src/KOKKOS/atom_kokkos.cpp index e97213cb4b..554afec210 100644 --- a/src/KOKKOS/atom_kokkos.cpp +++ b/src/KOKKOS/atom_kokkos.cpp @@ -46,7 +46,6 @@ AtomKokkos::AtomKokkos(LAMMPS *lmp) : Atom(lmp) h_tag_max = Kokkos::subview(h_tag_min_max,1); nprop_atom = 0; - prop_atom = nullptr; fix_prop_atom = nullptr; } diff --git a/src/KOKKOS/atom_kokkos.h b/src/KOKKOS/atom_kokkos.h index 26ea7da296..21a9aeebbd 100644 --- a/src/KOKKOS/atom_kokkos.h +++ b/src/KOKKOS/atom_kokkos.h @@ -27,7 +27,6 @@ class AtomKokkos : public Atom { public: bool sort_classic; int nprop_atom; - int* prop_atom; FixPropertyAtomKokkos** fix_prop_atom; DAT::tdual_tagint_1d k_tag; From 65bd04260bc73ba2472b0ec59f96c98cbff72296 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 13 Oct 2023 14:50:03 -0400 Subject: [PATCH 189/219] bugfix for modernization --- src/KOKKOS/atom_kokkos.cpp | 5 +++-- src/KOKKOS/atom_kokkos.h | 1 - 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/KOKKOS/atom_kokkos.cpp b/src/KOKKOS/atom_kokkos.cpp index e97213cb4b..bc393b29d8 100644 --- a/src/KOKKOS/atom_kokkos.cpp +++ b/src/KOKKOS/atom_kokkos.cpp @@ -46,7 +46,6 @@ AtomKokkos::AtomKokkos(LAMMPS *lmp) : Atom(lmp) h_tag_max = Kokkos::subview(h_tag_min_max,1); nprop_atom = 0; - prop_atom = nullptr; fix_prop_atom = nullptr; } @@ -132,16 +131,18 @@ void AtomKokkos::init() void AtomKokkos::update_property_atom() { + nprop_atom = 0; std::vector prop_atom_fixes; for (auto &ifix : modify->get_fix_by_style("^property/atom")) { if (!ifix->kokkosable) error->all(FLERR, "KOKKOS package requires a Kokkos-enabled version of fix property/atom"); + ++nprop_atom; prop_atom_fixes.push_back(ifix); } delete[] fix_prop_atom; - fix_prop_atom = new FixPropertyAtomKokkos *[prop_atom_fixes.size()]; + fix_prop_atom = new FixPropertyAtomKokkos *[nprop_atom]; int n = 0; for (auto &ifix : prop_atom_fixes) diff --git a/src/KOKKOS/atom_kokkos.h b/src/KOKKOS/atom_kokkos.h index 26ea7da296..21a9aeebbd 100644 --- a/src/KOKKOS/atom_kokkos.h +++ b/src/KOKKOS/atom_kokkos.h @@ -27,7 +27,6 @@ class AtomKokkos : public Atom { public: bool sort_classic; int nprop_atom; - int* prop_atom; FixPropertyAtomKokkos** fix_prop_atom; DAT::tdual_tagint_1d k_tag; From f93ff98728ae788f1a2254d6f25271c0ce826dcb Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Mon, 16 Oct 2023 11:20:06 -0600 Subject: [PATCH 190/219] Fix issues with trim lists --- src/KOKKOS/neighbor_kokkos.cpp | 3 ++- src/KOKKOS/npair_trim_kokkos.cpp | 12 ++++++------ src/npair_trim.cpp | 8 ++++++-- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/KOKKOS/neighbor_kokkos.cpp b/src/KOKKOS/neighbor_kokkos.cpp index 0b40bce841..efb1247560 100644 --- a/src/KOKKOS/neighbor_kokkos.cpp +++ b/src/KOKKOS/neighbor_kokkos.cpp @@ -308,7 +308,8 @@ void NeighborKokkos::build_kokkos(int topoflag) for (i = 0; i < npair_perpetual; i++) { m = plist[i]; if (!lists[m]->kokkos) atomKK->sync(Host,ALL_MASK); - if (!lists[m]->copy) lists[m]->grow(nlocal,nall); + if (!lists[m]->copy || lists[m]->trim || lists[m]->kk2cpu) + lists[m]->grow(nlocal,nall); neigh_pair[m]->build_setup(); neigh_pair[m]->build(lists[m]); } diff --git a/src/KOKKOS/npair_trim_kokkos.cpp b/src/KOKKOS/npair_trim_kokkos.cpp index 97931bf250..d04d8676d7 100644 --- a/src/KOKKOS/npair_trim_kokkos.cpp +++ b/src/KOKKOS/npair_trim_kokkos.cpp @@ -62,8 +62,8 @@ void NPairTrimKokkos::trim_to_kokkos(NeighList *list) d_ilist_copy = k_list_copy->d_ilist; d_numneigh_copy = k_list_copy->d_numneigh; d_neighbors_copy = k_list_copy->d_neighbors; - int inum_copy = list->listcopy->inum; - if (list->ghost) inum_copy += list->listcopy->gnum; + int inum_trim = list->listcopy->inum; + if (list->ghost) inum_trim += list->listcopy->gnum; NeighListKokkos* k_list = static_cast*>(list); k_list->maxneighs = k_list_copy->maxneighs; // simple, but could be made more memory efficient @@ -75,7 +75,7 @@ void NPairTrimKokkos::trim_to_kokkos(NeighList *list) // loop over parent list and trim copymode = 1; - Kokkos::parallel_for(Kokkos::RangePolicy(0,inum_copy),*this); + Kokkos::parallel_for(Kokkos::RangePolicy(0,inum_trim),*this); copymode = 0; list->inum = k_list_copy->inum; @@ -132,8 +132,8 @@ void NPairTrimKokkos::trim_to_cpu(NeighList *list) int inum = listcopy->inum; int gnum = listcopy->gnum; - int inum_all = inum; - if (list->ghost) inum_all += gnum; + int inum_trim = inum; + if (list->ghost) inum_trim += gnum; auto h_ilist = listcopy_kk->k_ilist.h_view; auto h_numneigh = Kokkos::create_mirror_view_and_copy(LMPHostType(),listcopy_kk->d_numneigh); auto h_neighbors = Kokkos::create_mirror_view_and_copy(LMPHostType(),listcopy_kk->d_neighbors); @@ -151,7 +151,7 @@ void NPairTrimKokkos::trim_to_cpu(NeighList *list) MyPage *ipage = list->ipage; ipage->reset(); - for (int ii = 0; ii < inum_all; ii++) { + for (int ii = 0; ii < inum_trim; ii++) { int n = 0; neighptr = ipage->vget(); diff --git a/src/npair_trim.cpp b/src/npair_trim.cpp index 14974d72ab..a4b6c1c6a1 100644 --- a/src/npair_trim.cpp +++ b/src/npair_trim.cpp @@ -50,11 +50,15 @@ void NPairTrim::build(NeighList *list) int *numneigh_copy = listcopy->numneigh; int **firstneigh_copy = listcopy->firstneigh; int inum = listcopy->inum; + int gnum = listcopy->gnum; list->inum = inum; - list->gnum = listcopy->gnum; + list->gnum = gnum; - for (ii = 0; ii < inum; ii++) { + int inum_trim = inum; + if (list->ghost) inum_trim += gnum; + + for (ii = 0; ii < inum_trim; ii++) { n = 0; neighptr = ipage->vget(); From 902e996f2ab23553312753e813613007b94b414b Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 16 Oct 2023 13:51:16 -0400 Subject: [PATCH 191/219] restore neighbor list trimming support to REBO family of pair styles --- src/MANYBODY/pair_airebo.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/MANYBODY/pair_airebo.cpp b/src/MANYBODY/pair_airebo.cpp index e34283f71c..129b9d2218 100644 --- a/src/MANYBODY/pair_airebo.cpp +++ b/src/MANYBODY/pair_airebo.cpp @@ -59,7 +59,6 @@ PairAIREBO::PairAIREBO(LAMMPS *lmp) nextra = 3; pvector = new double[nextra]; - trim_flag = 0; // workaround maxlocal = 0; REBO_numneigh = nullptr; REBO_firstneigh = nullptr; From ad1400ac71ba8b6f305275e97817539c04e054c6 Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Mon, 16 Oct 2023 12:33:21 -0600 Subject: [PATCH 192/219] Fix broken example --- examples/mliap/in.mliap.quadratic.compute | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/mliap/in.mliap.quadratic.compute b/examples/mliap/in.mliap.quadratic.compute index 929dbf3824..cc9ad331b5 100644 --- a/examples/mliap/in.mliap.quadratic.compute +++ b/examples/mliap/in.mliap.quadratic.compute @@ -65,7 +65,7 @@ compute bsum2 snapgroup2 reduce sum c_b[*] # fix bsum2 all ave/time 1 1 1 c_bsum2 file bsum2.dat mode vector compute vbsum all reduce sum c_vb[*] # fix vbsum all ave/time 1 1 1 c_vbsum file vbsum.dat mode vector -variable db_2_100 equal c_db[2][100] +variable db_2_100 equal C_db[2][100] # test output: 1: total potential energy # 2: xy component of stress tensor From 462a3935fea188aea0863f300a65fad0b8e35b1b Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Mon, 16 Oct 2023 14:07:42 -0600 Subject: [PATCH 193/219] Port bugfix to Kokkos --- src/KOKKOS/npair_halffull_kokkos.cpp | 17 +++ src/KOKKOS/npair_halffull_kokkos.h | 4 +- src/KOKKOS/npair_kokkos.cpp | 164 ++++++++++++++++++++------- src/KOKKOS/npair_kokkos.h | 6 +- 4 files changed, 143 insertions(+), 48 deletions(-) diff --git a/src/KOKKOS/npair_halffull_kokkos.cpp b/src/KOKKOS/npair_halffull_kokkos.cpp index ec17cec844..bc2549aa8d 100644 --- a/src/KOKKOS/npair_halffull_kokkos.cpp +++ b/src/KOKKOS/npair_halffull_kokkos.cpp @@ -18,6 +18,7 @@ #include "atom_masks.h" #include "atom_vec.h" #include "domain.h" +#include "force.h" #include "neigh_list_kokkos.h" #include @@ -66,6 +67,9 @@ void NPairHalffullKokkos::build(NeighList *list) d_numneigh = k_list->d_numneigh; d_neighbors = k_list->d_neighbors; + delta = 0.01 * force->angstrom; + triclinic = domain->triclinic; + // loop over parent full list copymode = 1; @@ -92,6 +96,11 @@ void NPairHalffullKokkos::operator()(TagNPairHalffullCom } // loop over full neighbor list + // use i < j < nlocal to eliminate half the local/local interactions + // for triclinic, must use delta to eliminate half the local/ghost interactions + // cannot use I/J exact coord comparision as for orthog + // b/c transforming orthog -> lambda -> orthog for ghost atoms + // with an added PBC offset can shift all 3 coords by epsilon const int jnum = d_numneigh_full(i); const AtomNeighbors neighbors_i = AtomNeighbors(&d_neighbors(i,0),d_numneigh(i), @@ -103,6 +112,14 @@ void NPairHalffullKokkos::operator()(TagNPairHalffullCom if (NEWTON) { if (j < nlocal) { if (i > j) continue; + } else if (triclinic) { + if (fabs(x(j,2)-ztmp) > delta) { + if (x(j,2) < ztmp) continue; + } else if (fabs(x(j,1)-ytmp) > delta) { + if (x(j,1) < ytmp) continue; + } else { + if (x(j,0) < xtmp) continue; + } } else { if (x(j,2) < ztmp) continue; if (x(j,2) == ztmp) { diff --git a/src/KOKKOS/npair_halffull_kokkos.h b/src/KOKKOS/npair_halffull_kokkos.h index c5a09f0b62..1249a9ce8a 100644 --- a/src/KOKKOS/npair_halffull_kokkos.h +++ b/src/KOKKOS/npair_halffull_kokkos.h @@ -257,8 +257,8 @@ class NPairHalffullKokkos : public NPair { void operator()(TagNPairHalffullCompute, const int&) const; private: - int nlocal; - double cutsq_custom; + int nlocal,triclinic; + double cutsq_custom,delta; typename AT::t_x_array_randomread x; diff --git a/src/KOKKOS/npair_kokkos.cpp b/src/KOKKOS/npair_kokkos.cpp index 06567cbeb6..8201ae028b 100644 --- a/src/KOKKOS/npair_kokkos.cpp +++ b/src/KOKKOS/npair_kokkos.cpp @@ -155,6 +155,8 @@ void NPairKokkos::build(NeighList *list_) list->grow(nall); + const double delta = 0.01 * force->angstrom; + NeighborKokkosExecute data(*list, k_cutneighsq.view(), @@ -176,7 +178,7 @@ void NPairKokkos::build(NeighList *list_) atomKK->molecular, nbinx,nbiny,nbinz,mbinx,mbiny,mbinz,mbinxlo,mbinylo,mbinzlo, bininvx,bininvy,bininvz, - exclude, nex_type, + delta, exclude, nex_type, k_ex1_type.view(), k_ex2_type.view(), k_ex_type.view(), @@ -239,7 +241,7 @@ void NPairKokkos::build(NeighList *list_) if (GHOST) { // assumes newton off - NPairKokkosBuildFunctorGhost f(data,atoms_per_bin * 5 * sizeof(X_FLOAT) * factor); + NPairKokkosBuildFunctorGhost f(data,atoms_per_bin * 6 * sizeof(X_FLOAT) * factor); // temporarily disable team policy for ghost due to known bug @@ -261,7 +263,7 @@ void NPairKokkos::build(NeighList *list_) //#endif } else { if (SIZE) { - NPairKokkosBuildFunctorSize f(data,atoms_per_bin * 6 * sizeof(X_FLOAT) * factor); + NPairKokkosBuildFunctorSize f(data,atoms_per_bin * 7 * sizeof(X_FLOAT) * factor); #ifdef LMP_KOKKOS_GPU if (ExecutionSpaceFromDevice::space == Device) { int team_size = atoms_per_bin*factor; @@ -279,7 +281,7 @@ void NPairKokkos::build(NeighList *list_) Kokkos::parallel_for(nall, f); #endif } else { - NPairKokkosBuildFunctor f(data,atoms_per_bin * 5 * sizeof(X_FLOAT) * factor); + NPairKokkosBuildFunctor f(data,atoms_per_bin * 6 * sizeof(X_FLOAT) * factor); #ifdef LMP_KOKKOS_GPU if (ExecutionSpaceFromDevice::space == Device) { int team_size = atoms_per_bin*factor; @@ -414,6 +416,7 @@ void NeighborKokkosExecute:: const X_FLOAT ytmp = x(i, 1); const X_FLOAT ztmp = x(i, 2); const int itype = type(i); + const tagint itag = tag(i); const int ibin = c_atom2bin(i); @@ -484,13 +487,29 @@ void NeighborKokkosExecute:: if (HalfNeigh && !Newton && j <= i) continue; if (!HalfNeigh && j == i) continue; + + // for triclinic, bin stencil is full in all 3 dims + // must use itag/jtag to eliminate half the I/J interactions + // cannot use I/J exact coord comparision + // b/c transforming orthog -> lambda -> orthog for ghost atoms + // with an added PBC offset can shift all 3 coords by epsilon + if (HalfNeigh && Newton && Tri) { - if (x(j,2) < ztmp) continue; - if (x(j,2) == ztmp) { - if (x(j,1) < ytmp) continue; - if (x(j,1) == ytmp) { - if (x(j,0) < xtmp) continue; - if (x(j,0) == xtmp && j <= i) continue; + if (j <= i) continue; + if (j >= nlocal) { + const tagint jtag = tag(j); + if (itag > jtag) { + if ((itag+jtag) % 2 == 0) continue; + } else if (itag < jtag) { + if ((itag+jtag) % 2 == 1) continue; + } else { + if (fabs(x(j,2)-ztmp) > delta) { + if (x(j,2) < ztmp) continue; + } else if (fabs(x(j,1)-ytmp) > delta) { + if (x(j,1) < ytmp) continue; + } else { + if (x(j,0) < xtmp) continue; + } } } } @@ -568,8 +587,9 @@ void NeighborKokkosExecute::build_ItemGPU(typename Kokkos::TeamPolic size_t sharedsize) const { auto* sharedmem = static_cast(dev.team_shmem().get_shmem(sharedsize)); - /* loop over atoms in i's bin, - */ + + // loop over atoms in i's bin + const int atoms_per_bin = c_bins.extent(1); const int BINS_PER_TEAM = dev.team_size()/atoms_per_bin <1?1:dev.team_size()/atoms_per_bin; const int TEAMS_PER_BIN = atoms_per_bin/dev.team_size()<1?1:atoms_per_bin/dev.team_size(); @@ -579,15 +599,14 @@ void NeighborKokkosExecute::build_ItemGPU(typename Kokkos::TeamPolic if (ibin >= mbins) return; - X_FLOAT* other_x = sharedmem + 5*atoms_per_bin*MY_BIN; - int* other_id = (int*) &other_x[4 * atoms_per_bin]; + X_FLOAT* other_x = sharedmem + 6*atoms_per_bin*MY_BIN; + int* other_id = (int*) &other_x[5 * atoms_per_bin]; int bincount_current = c_bincount[ibin]; for (int kk = 0; kk < TEAMS_PER_BIN; kk++) { const int MY_II = dev.team_rank()%atoms_per_bin+kk*dev.team_size(); const int i = MY_II < bincount_current ? c_bins(ibin, MY_II) : -1; - /* if necessary, goto next page and add pages */ int n = 0; @@ -608,6 +627,7 @@ void NeighborKokkosExecute::build_ItemGPU(typename Kokkos::TeamPolic other_x[MY_II + atoms_per_bin] = ytmp; other_x[MY_II + 2 * atoms_per_bin] = ztmp; other_x[MY_II + 3 * atoms_per_bin] = itype; + other_x[MY_II + 4 * atoms_per_bin] = itag; } other_id[MY_II] = i; @@ -695,6 +715,7 @@ void NeighborKokkosExecute::build_ItemGPU(typename Kokkos::TeamPolic other_x[MY_II + atoms_per_bin] = x(j, 1); other_x[MY_II + 2 * atoms_per_bin] = x(j, 2); other_x[MY_II + 3 * atoms_per_bin] = type(j); + other_x[MY_II + 4 * atoms_per_bin] = tag(j); } other_id[MY_II] = j; @@ -708,13 +729,29 @@ void NeighborKokkosExecute::build_ItemGPU(typename Kokkos::TeamPolic if (HalfNeigh && !Newton && j <= i) continue; if (!HalfNeigh && j == i) continue; + + // for triclinic, bin stencil is full in all 3 dims + // must use itag/jtag to eliminate half the I/J interactions + // cannot use I/J exact coord comparision + // b/c transforming orthog -> lambda -> orthog for ghost atoms + // with an added PBC offset can shift all 3 coords by epsilon + if (HalfNeigh && Newton && Tri) { - if (x(j,2) < ztmp) continue; - if (x(j,2) == ztmp) { - if (x(j,1) < ytmp) continue; - if (x(j,1) == ytmp) { - if (x(j,0) < xtmp) continue; - if (x(j,0) == xtmp && j <= i) continue; + if (j <= i) continue; + if (j >= nlocal) { + const tagint jtag = other_x[m + 4 * atoms_per_bin]; + if (itag > jtag) { + if ((itag+jtag) % 2 == 0) continue; + } else if (itag < jtag) { + if ((itag+jtag) % 2 == 1) continue; + } else { + if (fabs(x(j,2)-ztmp) > delta) { + if (x(j,2) < ztmp) continue; + } else if (fabs(x(j,1)-ytmp) > delta) { + if (x(j,1) < ytmp) continue; + } else { + if (x(j,0) < xtmp) continue; + } } } } @@ -794,6 +831,7 @@ void NeighborKokkosExecute:: const X_FLOAT ytmp = x(i, 1); const X_FLOAT ztmp = x(i, 2); const int itype = type(i); + const tagint itag = tag(i); const typename ArrayTypes::t_int_1d_const_um stencil = d_stencil; @@ -905,6 +943,7 @@ void NeighborKokkosExecute::build_ItemGhostGPU(typename Kokkos::Team size_t sharedsize) const { auto* sharedmem = static_cast(dev.team_shmem().get_shmem(sharedsize)); + // loop over atoms in i's bin const int atoms_per_bin = c_bins.extent(1); @@ -916,8 +955,8 @@ void NeighborKokkosExecute::build_ItemGhostGPU(typename Kokkos::Team if (ibin >= mbins) return; - X_FLOAT* other_x = sharedmem + 5*atoms_per_bin*MY_BIN; - int* other_id = (int*) &other_x[4 * atoms_per_bin]; + X_FLOAT* other_x = sharedmem + 6*atoms_per_bin*MY_BIN; + int* other_id = (int*) &other_x[5 * atoms_per_bin]; int bincount_current = c_bincount[ibin]; @@ -944,6 +983,7 @@ void NeighborKokkosExecute::build_ItemGhostGPU(typename Kokkos::Team other_x[MY_II + atoms_per_bin] = ytmp; other_x[MY_II + 2 * atoms_per_bin] = ztmp; other_x[MY_II + 3 * atoms_per_bin] = itype; + other_x[MY_II + 4 * atoms_per_bin] = itag; } other_id[MY_II] = i; #if defined(KOKKOS_ENABLE_CUDA) || defined(KOKKOS_ENABLE_HIP) @@ -999,6 +1039,7 @@ void NeighborKokkosExecute::build_ItemGhostGPU(typename Kokkos::Team other_x[MY_II + atoms_per_bin] = x(j, 1); other_x[MY_II + 2 * atoms_per_bin] = x(j, 2); other_x[MY_II + 3 * atoms_per_bin] = type(j); + other_x[MY_II + 4 * atoms_per_bin] = tag(j); } other_id[MY_II] = j; @@ -1084,6 +1125,7 @@ void NeighborKokkosExecute:: const X_FLOAT ztmp = x(i, 2); const X_FLOAT radi = radius(i); const int itype = type(i); + const tagint itag = tag(i); const int ibin = c_atom2bin(i); @@ -1167,13 +1209,29 @@ void NeighborKokkosExecute:: if (HalfNeigh && !Newton && j <= i) continue; if (!HalfNeigh && j == i) continue; + + // for triclinic, bin stencil is full in all 3 dims + // must use itag/jtag to eliminate half the I/J interactions + // cannot use I/J exact coord comparision + // b/c transforming orthog -> lambda -> orthog for ghost atoms + // with an added PBC offset can shift all 3 coords by epsilon + if (HalfNeigh && Newton && Tri) { - if (x(j,2) < ztmp) continue; - if (x(j,2) == ztmp) { - if (x(j,1) < ytmp) continue; - if (x(j,1) == ytmp) { - if (x(j,0) < xtmp) continue; - if (x(j,0) == xtmp && j <= i) continue; + if (j <= i) continue; + if (j >= nlocal) { + const tagint jtag = tag(j); + if (itag > jtag) { + if ((itag+jtag) % 2 == 0) continue; + } else if (itag < jtag) { + if ((itag+jtag) % 2 == 1) continue; + } else { + if (fabs(x(j,2)-ztmp) > delta) { + if (x(j,2) < ztmp) continue; + } else if (fabs(x(j,1)-ytmp) > delta) { + if (x(j,1) < ytmp) continue; + } else { + if (x(j,0) < xtmp) continue; + } } } } @@ -1245,8 +1303,9 @@ void NeighborKokkosExecute::build_ItemSizeGPU(typename Kokkos::TeamP size_t sharedsize) const { auto* sharedmem = static_cast(dev.team_shmem().get_shmem(sharedsize)); - /* loop over atoms in i's bin, - */ + + // loop over atoms in i's bin + const int atoms_per_bin = c_bins.extent(1); const int BINS_PER_TEAM = dev.team_size()/atoms_per_bin <1?1:dev.team_size()/atoms_per_bin; const int TEAMS_PER_BIN = atoms_per_bin/dev.team_size()<1?1:atoms_per_bin/dev.team_size(); @@ -1256,15 +1315,14 @@ void NeighborKokkosExecute::build_ItemSizeGPU(typename Kokkos::TeamP if (ibin >= mbins) return; - X_FLOAT* other_x = sharedmem + 6*atoms_per_bin*MY_BIN; - int* other_id = (int*) &other_x[5 * atoms_per_bin]; + X_FLOAT* other_x = sharedmem + 7*atoms_per_bin*MY_BIN; + int* other_id = (int*) &other_x[6 * atoms_per_bin]; int bincount_current = c_bincount[ibin]; for (int kk = 0; kk < TEAMS_PER_BIN; kk++) { const int MY_II = dev.team_rank()%atoms_per_bin+kk*dev.team_size(); const int i = MY_II < bincount_current ? c_bins(ibin, MY_II) : -1; - /* if necessary, goto next page and add pages */ int n = 0; @@ -1288,7 +1346,8 @@ void NeighborKokkosExecute::build_ItemSizeGPU(typename Kokkos::TeamP other_x[MY_II + atoms_per_bin] = ytmp; other_x[MY_II + 2 * atoms_per_bin] = ztmp; other_x[MY_II + 3 * atoms_per_bin] = itype; - other_x[MY_II + 4 * atoms_per_bin] = radi; + other_x[MY_II + 4 * atoms_per_bin] = itag; + other_x[MY_II + 5 * atoms_per_bin] = radi; } other_id[MY_II] = i; #if defined(KOKKOS_ENABLE_CUDA) || defined(KOKKOS_ENABLE_HIP) @@ -1323,7 +1382,7 @@ void NeighborKokkosExecute::build_ItemSizeGPU(typename Kokkos::TeamP const X_FLOAT dely = ytmp - other_x[m + atoms_per_bin]; const X_FLOAT delz = ztmp - other_x[m + 2 * atoms_per_bin]; const X_FLOAT rsq = delx*delx + dely*dely + delz*delz; - const X_FLOAT radsum = radi + other_x[m + 4 * atoms_per_bin]; + const X_FLOAT radsum = radi + other_x[m + 5 * atoms_per_bin]; const X_FLOAT cutsq = (radsum + skin) * (radsum + skin); if (rsq <= cutsq) { @@ -1380,7 +1439,8 @@ void NeighborKokkosExecute::build_ItemSizeGPU(typename Kokkos::TeamP other_x[MY_II + atoms_per_bin] = x(j, 1); other_x[MY_II + 2 * atoms_per_bin] = x(j, 2); other_x[MY_II + 3 * atoms_per_bin] = type(j); - other_x[MY_II + 4 * atoms_per_bin] = radius(j); + other_x[MY_II + 4 * atoms_per_bin] = tag(j); + other_x[MY_II + 5 * atoms_per_bin] = radius(j); } other_id[MY_II] = j; @@ -1394,13 +1454,29 @@ void NeighborKokkosExecute::build_ItemSizeGPU(typename Kokkos::TeamP if (HalfNeigh && !Newton && j <= i) continue; if (!HalfNeigh && j == i) continue; + + // for triclinic, bin stencil is full in all 3 dims + // must use itag/jtag to eliminate half the I/J interactions + // cannot use I/J exact coord comparision + // b/c transforming orthog -> lambda -> orthog for ghost atoms + // with an added PBC offset can shift all 3 coords by epsilon + if (HalfNeigh && Newton && Tri) { - if (x(j,2) < ztmp) continue; - if (x(j,2) == ztmp) { - if (x(j,1) < ytmp) continue; - if (x(j,1) == ytmp) { - if (x(j,0) < xtmp) continue; - if (x(j,0) == xtmp && j <= i) continue; + if (j <= i) continue; + if (j >= nlocal) { + const tagint jtag = other_x[m + 4 * atoms_per_bin]; + if (itag > jtag) { + if ((itag+jtag) % 2 == 0) continue; + } else if (itag < jtag) { + if ((itag+jtag) % 2 == 1) continue; + } else { + if (fabs(x(j,2)-ztmp) > delta) { + if (x(j,2) < ztmp) continue; + } else if (fabs(x(j,1)-ytmp) > delta) { + if (x(j,1) < ytmp) continue; + } else { + if (x(j,0) < xtmp) continue; + } } } } @@ -1412,7 +1488,7 @@ void NeighborKokkosExecute::build_ItemSizeGPU(typename Kokkos::TeamP const X_FLOAT dely = ytmp - other_x[m + atoms_per_bin]; const X_FLOAT delz = ztmp - other_x[m + 2 * atoms_per_bin]; const X_FLOAT rsq = delx*delx + dely*dely + delz*delz; - const X_FLOAT radsum = radi + other_x[m + 4 * atoms_per_bin]; + const X_FLOAT radsum = radi + other_x[m + 5 * atoms_per_bin]; const X_FLOAT cutsq = (radsum + skin) * (radsum + skin); if (rsq <= cutsq) { diff --git a/src/KOKKOS/npair_kokkos.h b/src/KOKKOS/npair_kokkos.h index 4427012926..fe5484a771 100644 --- a/src/KOKKOS/npair_kokkos.h +++ b/src/KOKKOS/npair_kokkos.h @@ -189,6 +189,8 @@ class NeighborKokkosExecute public: NeighListKokkos neigh_list; + const double delta; + // data from Neighbor class const typename AT::t_xfloat_2d_randomread cutneighsq; @@ -282,7 +284,7 @@ class NeighborKokkosExecute const int & _mbinx,const int & _mbiny,const int & _mbinz, const int & _mbinxlo,const int & _mbinylo,const int & _mbinzlo, const X_FLOAT &_bininvx,const X_FLOAT &_bininvy,const X_FLOAT &_bininvz, - const int & _exclude,const int & _nex_type, + const double &_delta,const int & _exclude,const int & _nex_type, const typename AT::t_int_1d_const & _ex1_type, const typename AT::t_int_1d_const & _ex2_type, const typename AT::t_int_2d_const & _ex_type, @@ -301,7 +303,7 @@ class NeighborKokkosExecute const typename ArrayTypes::t_int_scalar _h_resize, const typename AT::t_int_scalar _new_maxneighs, const typename ArrayTypes::t_int_scalar _h_new_maxneighs): - neigh_list(_neigh_list), cutneighsq(_cutneighsq),exclude(_exclude), + neigh_list(_neigh_list), cutneighsq(_cutneighsq),delta(_delta),exclude(_exclude), nex_type(_nex_type),ex1_type(_ex1_type),ex2_type(_ex2_type), ex_type(_ex_type),nex_group(_nex_group), ex1_bit(_ex1_bit),ex2_bit(_ex2_bit), From 8c7493d02a9ce2f2f9171ac9a26fd155703f7a5f Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Mon, 16 Oct 2023 15:11:37 -0600 Subject: [PATCH 194/219] Fix more broken examples --- examples/mliap/in.mliap.snap.compute | 2 +- examples/snap/in.grid.snap | 2 +- examples/snap/in.grid.tri | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/mliap/in.mliap.snap.compute b/examples/mliap/in.mliap.snap.compute index 4cfccedbdf..c49365f55f 100644 --- a/examples/mliap/in.mliap.snap.compute +++ b/examples/mliap/in.mliap.snap.compute @@ -65,7 +65,7 @@ compute bsum2 snapgroup2 reduce sum c_b[*] # fix bsum2 all ave/time 1 1 1 c_bsum2 file bsum2.dat mode vector compute vbsum all reduce sum c_vb[*] # fix vbsum all ave/time 1 1 1 c_vbsum file vbsum.dat mode vector -variable db_2_25 equal c_db[2][25] +variable db_2_25 equal C_db[2][25] thermo 100 diff --git a/examples/snap/in.grid.snap b/examples/snap/in.grid.snap index 08c95a004f..d37b6ffde4 100644 --- a/examples/snap/in.grid.snap +++ b/examples/snap/in.grid.snap @@ -67,7 +67,7 @@ compute mygridlocal all sna/grid/local grid ${ngrid} ${ngrid} ${ngrid} & # define output -variable B5atom equal c_b[2][5] +variable B5atom equal C_b[2][5] variable B5grid equal c_mygrid[8][8] variable rmse_global equal "sqrt( & diff --git a/examples/snap/in.grid.tri b/examples/snap/in.grid.tri index 5283957eb8..b34c9dba30 100644 --- a/examples/snap/in.grid.tri +++ b/examples/snap/in.grid.tri @@ -87,7 +87,7 @@ compute mygridlocal all sna/grid/local grid ${ngridx} ${ngridy} ${ngridz} & # define output -variable B5atom equal c_b[7][5] +variable B5atom equal C_b[7][5] variable B5grid equal c_mygrid[13][8] # do not compare x,y,z because assignment of ids From dc67f2527061b036da95c8fd151eb25da57abde3 Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Mon, 16 Oct 2023 15:17:46 -0600 Subject: [PATCH 195/219] Another tweak --- examples/snap/in.grid.snap | 10 +++++----- examples/snap/in.grid.tri | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/examples/snap/in.grid.snap b/examples/snap/in.grid.snap index d37b6ffde4..da48957d97 100644 --- a/examples/snap/in.grid.snap +++ b/examples/snap/in.grid.snap @@ -74,11 +74,11 @@ variable rmse_global equal "sqrt( & (c_mygrid[8][1] - x[2])^2 + & (c_mygrid[8][2] - y[2])^2 + & (c_mygrid[8][3] - z[2])^2 + & - (c_mygrid[8][4] - c_b[2][1])^2 + & - (c_mygrid[8][5] - c_b[2][2])^2 + & - (c_mygrid[8][6] - c_b[2][3])^2 + & - (c_mygrid[8][7] - c_b[2][4])^2 + & - (c_mygrid[8][8] - c_b[2][5])^2 & + (c_mygrid[8][4] - C_b[2][1])^2 + & + (c_mygrid[8][5] - C_b[2][2])^2 + & + (c_mygrid[8][6] - C_b[2][3])^2 + & + (c_mygrid[8][7] - C_b[2][4])^2 + & + (c_mygrid[8][8] - C_b[2][5])^2 & )" thermo_style custom step v_B5atom v_B5grid v_rmse_global diff --git a/examples/snap/in.grid.tri b/examples/snap/in.grid.tri index b34c9dba30..95a14f3bb4 100644 --- a/examples/snap/in.grid.tri +++ b/examples/snap/in.grid.tri @@ -94,11 +94,11 @@ variable B5grid equal c_mygrid[13][8] # to atoms is not unnique for different processor grids variable rmse_global equal "sqrt( & - (c_mygrid[13][4] - c_b[7][1])^2 + & - (c_mygrid[13][5] - c_b[7][2])^2 + & - (c_mygrid[13][6] - c_b[7][3])^2 + & - (c_mygrid[13][7] - c_b[7][4])^2 + & - (c_mygrid[13][8] - c_b[7][5])^2 & + (c_mygrid[13][4] - C_b[7][1])^2 + & + (c_mygrid[13][5] - C_b[7][2])^2 + & + (c_mygrid[13][6] - C_b[7][3])^2 + & + (c_mygrid[13][7] - C_b[7][4])^2 + & + (c_mygrid[13][8] - C_b[7][5])^2 & )" thermo_style custom step v_B5atom v_B5grid v_rmse_global From 4ae0fc83124eff9e400ea43166fc21b4d1ac1ca1 Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Mon, 16 Oct 2023 15:47:42 -0600 Subject: [PATCH 196/219] Fix GPU compile --- src/KOKKOS/npair_kokkos.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/KOKKOS/npair_kokkos.cpp b/src/KOKKOS/npair_kokkos.cpp index 8201ae028b..83e60768cd 100644 --- a/src/KOKKOS/npair_kokkos.cpp +++ b/src/KOKKOS/npair_kokkos.cpp @@ -614,6 +614,7 @@ void NeighborKokkosExecute::build_ItemGPU(typename Kokkos::TeamPolic X_FLOAT ytmp; X_FLOAT ztmp; int itype; + tagint itag; const int index = (i >= 0 && i < nlocal) ? i : 0; const AtomNeighbors neighbors_i = neigh_transpose ? neigh_list.get_neighbors_transpose(index) : neigh_list.get_neighbors(index); @@ -623,6 +624,7 @@ void NeighborKokkosExecute::build_ItemGPU(typename Kokkos::TeamPolic ytmp = x(i, 1); ztmp = x(i, 2); itype = type(i); + itag = tag(i); other_x[MY_II] = xtmp; other_x[MY_II + atoms_per_bin] = ytmp; other_x[MY_II + 2 * atoms_per_bin] = ztmp; @@ -970,6 +972,7 @@ void NeighborKokkosExecute::build_ItemGhostGPU(typename Kokkos::Team X_FLOAT ytmp; X_FLOAT ztmp; int itype; + tagint itag; const int index = (i >= 0 && i < nall) ? i : 0; const AtomNeighbors neighbors_i = neigh_transpose ? neigh_list.get_neighbors_transpose(index) : neigh_list.get_neighbors(index); @@ -979,6 +982,7 @@ void NeighborKokkosExecute::build_ItemGhostGPU(typename Kokkos::Team ytmp = x(i, 1); ztmp = x(i, 2); itype = type(i); + itag = tag(i); other_x[MY_II] = xtmp; other_x[MY_II + atoms_per_bin] = ytmp; other_x[MY_II + 2 * atoms_per_bin] = ztmp; @@ -1331,6 +1335,7 @@ void NeighborKokkosExecute::build_ItemSizeGPU(typename Kokkos::TeamP X_FLOAT ztmp; X_FLOAT radi; int itype; + tagint itag; const int index = (i >= 0 && i < nlocal) ? i : 0; const AtomNeighbors neighbors_i = neigh_transpose ? neigh_list.get_neighbors_transpose(index) : neigh_list.get_neighbors(index); @@ -1342,6 +1347,7 @@ void NeighborKokkosExecute::build_ItemSizeGPU(typename Kokkos::TeamP ztmp = x(i, 2); radi = radius(i); itype = type(i); + itag = tag(i); other_x[MY_II] = xtmp; other_x[MY_II + atoms_per_bin] = ytmp; other_x[MY_II + 2 * atoms_per_bin] = ztmp; From 3b4fff4164a4dc73433b11f9e7fac65c279a2fb2 Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Tue, 17 Oct 2023 12:01:01 -0600 Subject: [PATCH 197/219] Need to sync tag, add template param --- src/KOKKOS/npair_halffull_kokkos.cpp | 41 +++-- src/KOKKOS/npair_halffull_kokkos.h | 249 +++++++++++++++++++-------- src/KOKKOS/npair_kokkos.cpp | 37 ++-- 3 files changed, 223 insertions(+), 104 deletions(-) diff --git a/src/KOKKOS/npair_halffull_kokkos.cpp b/src/KOKKOS/npair_halffull_kokkos.cpp index bc2549aa8d..ddd7362c4e 100644 --- a/src/KOKKOS/npair_halffull_kokkos.cpp +++ b/src/KOKKOS/npair_halffull_kokkos.cpp @@ -27,8 +27,8 @@ using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ -template -NPairHalffullKokkos::NPairHalffullKokkos(LAMMPS *lmp) : NPair(lmp) { +template +NPairHalffullKokkos::NPairHalffullKokkos(LAMMPS *lmp) : NPair(lmp) { atomKK = (AtomKokkos *) atom; execution_space = ExecutionSpaceFromDevice::space; } @@ -42,13 +42,19 @@ NPairHalffullKokkos::NPairHalffullKokkos(LAMMPS *lmp) : if ghost, also store neighbors of ghost atoms & set inum,gnum correctly ------------------------------------------------------------------------- */ -template -void NPairHalffullKokkos::build(NeighList *list) +template +void NPairHalffullKokkos::build(NeighList *list) { if (NEWTON || TRIM) { x = atomKK->k_x.view(); atomKK->sync(execution_space,X_MASK); } + + if (TRI) { + tag = atomKK->k_tag.view(); + atomKK->sync(execution_space,TAG_MASK); + } + nlocal = atom->nlocal; cutsq_custom = cutoff_custom*cutoff_custom; @@ -68,7 +74,6 @@ void NPairHalffullKokkos::build(NeighList *list) d_neighbors = k_list->d_neighbors; delta = 0.01 * force->angstrom; - triclinic = domain->triclinic; // loop over parent full list @@ -82,9 +87,9 @@ void NPairHalffullKokkos::build(NeighList *list) k_list->k_ilist.template modify(); } -template +template KOKKOS_INLINE_FUNCTION -void NPairHalffullKokkos::operator()(TagNPairHalffullCompute, const int &ii) const { +void NPairHalffullKokkos::operator()(TagNPairHalffullCompute, const int &ii) const { int n = 0; const int i = d_ilist_full(ii); @@ -112,7 +117,7 @@ void NPairHalffullKokkos::operator()(TagNPairHalffullCom if (NEWTON) { if (j < nlocal) { if (i > j) continue; - } else if (triclinic) { + } else if (TRI) { if (fabs(x(j,2)-ztmp) > delta) { if (x(j,2) < ztmp) continue; } else if (fabs(x(j,1)-ytmp) > delta) { @@ -158,14 +163,18 @@ void NPairHalffullKokkos::operator()(TagNPairHalffullCom } namespace LAMMPS_NS { -template class NPairHalffullKokkos; -template class NPairHalffullKokkos; -template class NPairHalffullKokkos; -template class NPairHalffullKokkos; +template class NPairHalffullKokkos; +template class NPairHalffullKokkos; +template class NPairHalffullKokkos; +template class NPairHalffullKokkos; +template class NPairHalffullKokkos; +template class NPairHalffullKokkos; #ifdef LMP_KOKKOS_GPU -template class NPairHalffullKokkos; -template class NPairHalffullKokkos; -template class NPairHalffullKokkos; -template class NPairHalffullKokkos; +template class NPairHalffullKokkos; +template class NPairHalffullKokkos; +template class NPairHalffullKokkos; +template class NPairHalffullKokkos; +template class NPairHalffullKokkos; +template class NPairHalffullKokkos; #endif } diff --git a/src/KOKKOS/npair_halffull_kokkos.h b/src/KOKKOS/npair_halffull_kokkos.h index 1249a9ce8a..7e6c28aaba 100644 --- a/src/KOKKOS/npair_halffull_kokkos.h +++ b/src/KOKKOS/npair_halffull_kokkos.h @@ -16,53 +16,79 @@ // Trim off -// Newton +// Newton, no triclinic -typedef NPairHalffullKokkos NPairKokkosHalffullNewtonDevice; +typedef NPairHalffullKokkos NPairKokkosHalffullNewtonDevice; NPairStyle(halffull/newton/kk/device, NPairKokkosHalffullNewtonDevice, NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | - NP_ORTHO | NP_TRI | NP_KOKKOS_DEVICE); + NP_ORTHO | NP_KOKKOS_DEVICE); -typedef NPairHalffullKokkos NPairKokkosHalffullNewtonHost; +typedef NPairHalffullKokkos NPairKokkosHalffullNewtonHost; NPairStyle(halffull/newton/kk/host, NPairKokkosHalffullNewtonHost, NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | - NP_ORTHO | NP_TRI | NP_KOKKOS_HOST); + NP_ORTHO | NP_KOKKOS_HOST); -typedef NPairHalffullKokkos NPairKokkosHalffullNewtonDevice; +typedef NPairHalffullKokkos NPairKokkosHalffullNewtonDevice; NPairStyle(halffull/newton/skip/kk/device, NPairKokkosHalffullNewtonDevice, NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | - NP_ORTHO | NP_TRI | NP_SKIP | NP_KOKKOS_DEVICE); + NP_ORTHO | NP_SKIP | NP_KOKKOS_DEVICE); -typedef NPairHalffullKokkos NPairKokkosHalffullNewtonHost; +typedef NPairHalffullKokkos NPairKokkosHalffullNewtonHost; NPairStyle(halffull/newton/skip/kk/host, NPairKokkosHalffullNewtonHost, NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | + NP_ORTHO | NP_SKIP | NP_KOKKOS_HOST); + +// Newton, triclinic + +typedef NPairHalffullKokkos NPairKokkosHalffullNewtonTriDevice; +NPairStyle(halffull/newton/tri/kk/device, + NPairKokkosHalffullNewtonTriDevice, + NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | + NP_ORTHO | NP_TRI | NP_KOKKOS_DEVICE); + +typedef NPairHalffullKokkos NPairKokkosHalffullNewtonTriHost; +NPairStyle(halffull/newton/tri/kk/host, + NPairKokkosHalffullNewtonTriHost, + NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | + NP_ORTHO | NP_TRI | NP_KOKKOS_HOST); + +typedef NPairHalffullKokkos NPairKokkosHalffullNewtonTriDevice; +NPairStyle(halffull/newton/tri/skip/kk/device, + NPairKokkosHalffullNewtonTriDevice, + NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | + NP_ORTHO | NP_TRI | NP_SKIP | NP_KOKKOS_DEVICE); + +typedef NPairHalffullKokkos NPairKokkosHalffullNewtonTriHost; +NPairStyle(halffull/newton/tri/skip/kk/host, + NPairKokkosHalffullNewtonTriHost, + NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | NP_ORTHO | NP_TRI | NP_SKIP | NP_KOKKOS_HOST); -// Newtoff +// Newtoff (can be triclinic but template param always set to 0) -typedef NPairHalffullKokkos NPairKokkosHalffullNewtoffDevice; +typedef NPairHalffullKokkos NPairKokkosHalffullNewtoffDevice; NPairStyle(halffull/newtoff/kk/device, NPairKokkosHalffullNewtoffDevice, NP_HALF_FULL | NP_NEWTOFF | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | NP_ORTHO | NP_TRI | NP_KOKKOS_DEVICE); -typedef NPairHalffullKokkos NPairKokkosHalffullNewtoffHost; +typedef NPairHalffullKokkos NPairKokkosHalffullNewtoffHost; NPairStyle(halffull/newtoff/kk/host, NPairKokkosHalffullNewtoffHost, NP_HALF_FULL | NP_NEWTOFF | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | NP_ORTHO | NP_TRI | NP_KOKKOS_HOST); -typedef NPairHalffullKokkos NPairKokkosHalffullNewtoffDevice; +typedef NPairHalffullKokkos NPairKokkosHalffullNewtoffDevice; NPairStyle(halffull/newtoff/skip/kk/device, NPairKokkosHalffullNewtoffDevice, NP_HALF_FULL | NP_NEWTOFF | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | NP_ORTHO | NP_TRI | NP_SKIP | NP_KOKKOS_DEVICE); -typedef NPairHalffullKokkos NPairKokkosHalffullNewtoffHost; +typedef NPairHalffullKokkos NPairKokkosHalffullNewtoffHost; NPairStyle(halffull/newtoff/skip/kk/host, NPairKokkosHalffullNewtoffHost, NP_HALF_FULL | NP_NEWTOFF | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | @@ -70,166 +96,244 @@ NPairStyle(halffull/newtoff/skip/kk/host, //************ Ghost ************** -// Newton +// Newton, no triclinic -typedef NPairHalffullKokkos NPairKokkosHalffullNewtonGhostDevice; +typedef NPairHalffullKokkos NPairKokkosHalffullNewtonDevice; NPairStyle(halffull/newton/ghost/kk/device, - NPairKokkosHalffullNewtonGhostDevice, + NPairKokkosHalffullNewtonDevice, NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | - NP_ORTHO | NP_TRI | NP_GHOST | NP_KOKKOS_DEVICE); + NP_ORTHO | NP_GHOST | NP_KOKKOS_DEVICE); -typedef NPairHalffullKokkos NPairKokkosHalffullNewtonHost; +typedef NPairHalffullKokkos NPairKokkosHalffullNewtonHost; NPairStyle(halffull/newton/ghost/kk/host, NPairKokkosHalffullNewtonHost, NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | - NP_ORTHO | NP_TRI | NP_GHOST | NP_KOKKOS_HOST); + NP_ORTHO | NP_GHOST | NP_KOKKOS_HOST); -typedef NPairHalffullKokkos NPairKokkosHalffullNewtonGhostDevice; +typedef NPairHalffullKokkos NPairKokkosHalffullNewtonDevice; NPairStyle(halffull/newton/skip/ghost/kk/device, - NPairKokkosHalffullNewtonGhostDevice, + NPairKokkosHalffullNewtonDevice, NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | - NP_ORTHO | NP_TRI | NP_GHOST | NP_SKIP | NP_KOKKOS_DEVICE); + NP_ORTHO | NP_GHOST | NP_SKIP | NP_KOKKOS_DEVICE); -typedef NPairHalffullKokkos NPairKokkosHalffullNewtonHost; +typedef NPairHalffullKokkos NPairKokkosHalffullNewtonHost; NPairStyle(halffull/newton/skip/ghost/kk/host, NPairKokkosHalffullNewtonHost, NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | + NP_ORTHO | NP_GHOST | NP_SKIP | NP_KOKKOS_HOST); + +// Newton, triclinic + +typedef NPairHalffullKokkos NPairKokkosHalffullNewtonTriDevice; +NPairStyle(halffull/newton/tri/ghost/kk/device, + NPairKokkosHalffullNewtonTriDevice, + NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | + NP_ORTHO | NP_TRI | NP_GHOST | NP_KOKKOS_DEVICE); + +typedef NPairHalffullKokkos NPairKokkosHalffullNewtonTriHost; +NPairStyle(halffull/newton/tri/ghost/kk/host, + NPairKokkosHalffullNewtonTriHost, + NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | + NP_ORTHO | NP_TRI | NP_GHOST | NP_KOKKOS_HOST); + +typedef NPairHalffullKokkos NPairKokkosHalffullNewtonTriDevice; +NPairStyle(halffull/newton/tri/skip/ghost/kk/device, + NPairKokkosHalffullNewtonTriDevice, + NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | + NP_ORTHO | NP_TRI | NP_GHOST | NP_SKIP | NP_KOKKOS_DEVICE); + +typedef NPairHalffullKokkos NPairKokkosHalffullNewtonTriHost; +NPairStyle(halffull/newton/tri/skip/ghost/kk/host, + NPairKokkosHalffullNewtonTriHost, + NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | NP_ORTHO | NP_TRI | NP_GHOST | NP_SKIP | NP_KOKKOS_HOST); -// Newtoff +// Newtoff (can be triclinic but template param always set to 0) -typedef NPairHalffullKokkos NPairKokkosHalffullNewtoffGhostDevice; +typedef NPairHalffullKokkos NPairKokkosHalffullNewtoffDevice; NPairStyle(halffull/newtoff/ghost/kk/device, - NPairKokkosHalffullNewtoffGhostDevice, + NPairKokkosHalffullNewtoffDevice, NP_HALF_FULL | NP_NEWTOFF | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | NP_ORTHO | NP_TRI | NP_GHOST | NP_KOKKOS_DEVICE); -typedef NPairHalffullKokkos NPairKokkosHalffullNewtoffHost; +typedef NPairHalffullKokkos NPairKokkosHalffullNewtoffHost; NPairStyle(halffull/newtoff/ghost/kk/host, NPairKokkosHalffullNewtoffHost, NP_HALF_FULL | NP_NEWTOFF | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | NP_ORTHO | NP_TRI | NP_GHOST | NP_KOKKOS_HOST); -typedef NPairHalffullKokkos NPairKokkosHalffullNewtoffGhostDevice; +typedef NPairHalffullKokkos NPairKokkosHalffullNewtoffDevice; NPairStyle(halffull/newtoff/skip/ghost/kk/device, - NPairKokkosHalffullNewtoffGhostDevice, + NPairKokkosHalffullNewtoffDevice, NP_HALF_FULL | NP_NEWTOFF | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | NP_ORTHO | NP_TRI | NP_GHOST | NP_SKIP | NP_KOKKOS_DEVICE); -typedef NPairHalffullKokkos NPairKokkosHalffullNewtoffHost; +typedef NPairHalffullKokkos NPairKokkosHalffullNewtoffHost; NPairStyle(halffull/newtoff/skip/ghost/kk/host, NPairKokkosHalffullNewtoffHost, NP_HALF_FULL | NP_NEWTOFF | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | NP_ORTHO | NP_TRI | NP_GHOST | NP_SKIP | NP_KOKKOS_HOST); - //************ Trim ************** -// Newton +// Newton, no triclinic -typedef NPairHalffullKokkos NPairKokkosHalffullNewtonTrimDevice; +typedef NPairHalffullKokkos NPairKokkosHalffullNewtonTrimDevice; NPairStyle(halffull/newton/trim/kk/device, NPairKokkosHalffullNewtonTrimDevice, NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | - NP_ORTHO | NP_TRI | NP_TRIM | NP_KOKKOS_DEVICE); + NP_ORTHO | NP_TRIM | NP_KOKKOS_DEVICE); -typedef NPairHalffullKokkos NPairKokkosHalffullNewtonTrimHost; +typedef NPairHalffullKokkos NPairKokkosHalffullNewtonTrimHost; NPairStyle(halffull/newton/trim/kk/host, NPairKokkosHalffullNewtonTrimHost, NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | + NP_ORTHO | NP_TRIM | NP_KOKKOS_HOST); + +typedef NPairHalffullKokkos NPairKokkosHalffullNewtonTrimDevice; +NPairStyle(halffull/newton/trim/skip/kk/device, + NPairKokkosHalffullNewtonTrimDevice, + NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | + NP_ORTHO | NP_SKIP | NP_TRIM | NP_KOKKOS_DEVICE); + +typedef NPairHalffullKokkos NPairKokkosHalffullNewtonTrimHost; +NPairStyle(halffull/newton/trim/skip/kk/host, + NPairKokkosHalffullNewtonTrimHost, + NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | + NP_ORTHO | NP_SKIP | NP_TRIM | NP_KOKKOS_HOST); + +// Newton, triclinic + +typedef NPairHalffullKokkos NPairKokkosHalffullNewtonTriTrimDevice; +NPairStyle(halffull/newton/tri/trim/kk/device, + NPairKokkosHalffullNewtonTriTrimDevice, + NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | + NP_ORTHO | NP_TRI | NP_TRIM | NP_KOKKOS_DEVICE); + +typedef NPairHalffullKokkos NPairKokkosHalffullNewtonTriTrimHost; +NPairStyle(halffull/newton/tri/trim/kk/host, + NPairKokkosHalffullNewtonTriTrimHost, + NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | NP_ORTHO | NP_TRI | NP_TRIM | NP_KOKKOS_HOST); -typedef NPairHalffullKokkos NPairKokkosHalffullNewtonTrimDevice; -NPairStyle(halffull/newton/skip/trim/kk/device, +typedef NPairHalffullKokkos NPairKokkosHalffullNewtonTriTrimDevice; +NPairStyle(halffull/newton/tri/trim/skip/kk/device, NPairKokkosHalffullNewtonTrimDevice, NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | NP_ORTHO | NP_TRI | NP_SKIP | NP_TRIM | NP_KOKKOS_DEVICE); -typedef NPairHalffullKokkos NPairKokkosHalffullNewtonTrimHost; -NPairStyle(halffull/newton/skip/trim/kk/host, - NPairKokkosHalffullNewtonTrimHost, +typedef NPairHalffullKokkos NPairKokkosHalffullNewtonTriTrimHost; +NPairStyle(halffull/newton/tri/trim/skip/kk/host, + NPairKokkosHalffullNewtonTriTrimHost, NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | NP_ORTHO | NP_TRI | NP_SKIP | NP_TRIM | NP_KOKKOS_HOST); -// Newtoff +// Newtoff (can be triclinic but template param always set to 0) -typedef NPairHalffullKokkos NPairKokkosHalffullNewtoffTrimDevice; +typedef NPairHalffullKokkos NPairKokkosHalffullNewtoffTrimDevice; NPairStyle(halffull/newtoff/trim/kk/device, NPairKokkosHalffullNewtoffTrimDevice, NP_HALF_FULL | NP_NEWTOFF | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | NP_ORTHO | NP_TRI | NP_TRIM | NP_KOKKOS_DEVICE); -typedef NPairHalffullKokkos NPairKokkosHalffullNewtoffTrimHost; +typedef NPairHalffullKokkos NPairKokkosHalffullNewtoffTrimHost; NPairStyle(halffull/newtoff/trim/kk/host, NPairKokkosHalffullNewtoffTrimHost, NP_HALF_FULL | NP_NEWTOFF | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | NP_ORTHO | NP_TRI | NP_TRIM | NP_KOKKOS_HOST); -typedef NPairHalffullKokkos NPairKokkosHalffullNewtoffTrimDevice; -NPairStyle(halffull/newtoff/skip/trim/kk/device, +typedef NPairHalffullKokkos NPairKokkosHalffullNewtoffTrimDevice; +NPairStyle(halffull/newtoff/trim/skip/kk/device, NPairKokkosHalffullNewtoffTrimDevice, NP_HALF_FULL | NP_NEWTOFF | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | NP_ORTHO | NP_TRI | NP_SKIP | NP_TRIM | NP_KOKKOS_DEVICE); -typedef NPairHalffullKokkos NPairKokkosHalffullNewtoffTrimHost; -NPairStyle(halffull/newtoff/skip/trim/kk/host, +typedef NPairHalffullKokkos NPairKokkosHalffullNewtoffTrimHost; +NPairStyle(halffull/newtoff/trim/skip/kk/host, NPairKokkosHalffullNewtoffTrimHost, NP_HALF_FULL | NP_NEWTOFF | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | NP_ORTHO | NP_TRI | NP_SKIP | NP_TRIM | NP_KOKKOS_HOST); //************ Ghost ************** -// Newton +// Newton, no triclinic -typedef NPairHalffullKokkos NPairKokkosHalffullNewtonGhostTrimDevice; -NPairStyle(halffull/newton/ghost/trim/kk/device, - NPairKokkosHalffullNewtonGhostTrimDevice, +typedef NPairHalffullKokkos NPairKokkosHalffullNewtonTrimDevice; +NPairStyle(halffull/newton/tri/trim/ghost/kk/device, + NPairKokkosHalffullNewtonTrimDevice, + NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | + NP_ORTHO | NP_GHOST | NP_TRIM | NP_KOKKOS_DEVICE); + +typedef NPairHalffullKokkos NPairKokkosHalffullNewtonTrimHost; +NPairStyle(halffull/newton/trim/ghost/kk/host, + NPairKokkosHalffullNewtonTrimHost, + NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | + NP_ORTHO | NP_GHOST | NP_TRIM | NP_KOKKOS_HOST); + +typedef NPairHalffullKokkos NPairKokkosHalffullNewtonTrimDevice; +NPairStyle(halffull/newton/trim/skip/ghost/kk/device, + NPairKokkosHalffullNewtonTrimDevice, + NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | + NP_ORTHO | NP_GHOST | NP_SKIP | NP_TRIM | NP_KOKKOS_DEVICE); + +typedef NPairHalffullKokkos NPairKokkosHalffullNewtonTrimHost; +NPairStyle(halffull/newton/trim/skip/ghost/kk/host, + NPairKokkosHalffullNewtonTrimHost, + NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | + NP_ORTHO | NP_GHOST | NP_SKIP | NP_TRIM | NP_KOKKOS_HOST); + +// Newton, triclinic + +typedef NPairHalffullKokkos NPairKokkosHalffullNewtonTriTrimDevice; +NPairStyle(halffull/newton/tri/trim/ghost/kk/device, + NPairKokkosHalffullNewtonTriTrimDevice, NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | NP_ORTHO | NP_TRI | NP_GHOST | NP_TRIM | NP_KOKKOS_DEVICE); -typedef NPairHalffullKokkos NPairKokkosHalffullNewtonTrimHost; -NPairStyle(halffull/newton/ghost/trim/kk/host, - NPairKokkosHalffullNewtonTrimHost, +typedef NPairHalffullKokkos NPairKokkosHalffullNewtonTriTrimHost; +NPairStyle(halffull/newton/tri/trim/ghost/kk/host, + NPairKokkosHalffullNewtonTriTrimHost, NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | NP_ORTHO | NP_TRI | NP_GHOST | NP_TRIM | NP_KOKKOS_HOST); -typedef NPairHalffullKokkos NPairKokkosHalffullNewtonGhostTrimDevice; -NPairStyle(halffull/newton/skip/ghost/trim/kk/device, - NPairKokkosHalffullNewtonGhostTrimDevice, +typedef NPairHalffullKokkos NPairKokkosHalffullNewtonTriTrimDevice; +NPairStyle(halffull/newton/tri/trim/skip/ghost/kk/device, + NPairKokkosHalffullNewtonTriTrimDevice, NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | NP_ORTHO | NP_TRI | NP_GHOST | NP_SKIP | NP_TRIM | NP_KOKKOS_DEVICE); -typedef NPairHalffullKokkos NPairKokkosHalffullNewtonTrimHost; -NPairStyle(halffull/newton/skip/ghost/trim/kk/host, - NPairKokkosHalffullNewtonTrimHost, +typedef NPairHalffullKokkos NPairKokkosHalffullNewtonTriTrimHost; +NPairStyle(halffull/newton/tri/trim/skip/ghost/kk/host, + NPairKokkosHalffullNewtonTriTrimHost, NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | NP_ORTHO | NP_TRI | NP_GHOST | NP_SKIP | NP_TRIM | NP_KOKKOS_HOST); -// Newtoff +// Newtoff (can be triclinic but template param always set to 0) -typedef NPairHalffullKokkos NPairKokkosHalffullNewtoffGhostTrimDevice; -NPairStyle(halffull/newtoff/ghost/trim/kk/device, - NPairKokkosHalffullNewtoffGhostTrimDevice, +typedef NPairHalffullKokkos NPairKokkosHalffullNewtoffTrimDevice; +NPairStyle(halffull/newtoff/trim/ghost/kk/device, + NPairKokkosHalffullNewtoffTrimDevice, NP_HALF_FULL | NP_NEWTOFF | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | NP_ORTHO | NP_TRI | NP_GHOST | NP_TRIM | NP_KOKKOS_DEVICE); -typedef NPairHalffullKokkos NPairKokkosHalffullNewtoffTrimHost; -NPairStyle(halffull/newtoff/ghost/trim/kk/host, +typedef NPairHalffullKokkos NPairKokkosHalffullNewtoffTrimHost; +NPairStyle(halffull/newtoff/trim/ghost/kk/host, NPairKokkosHalffullNewtoffTrimHost, NP_HALF_FULL | NP_NEWTOFF | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | NP_ORTHO | NP_TRI | NP_GHOST | NP_TRIM | NP_KOKKOS_HOST); -typedef NPairHalffullKokkos NPairKokkosHalffullNewtoffGhostTrimDevice; -NPairStyle(halffull/newtoff/skip/ghost/trim/kk/device, - NPairKokkosHalffullNewtoffGhostTrimDevice, +typedef NPairHalffullKokkos NPairKokkosHalffullNewtoffTrimDevice; +NPairStyle(halffull/newtoff/trim/skip/ghost/kk/device, + NPairKokkosHalffullNewtoffTrimDevice, NP_HALF_FULL | NP_NEWTOFF | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | NP_ORTHO | NP_TRI | NP_GHOST | NP_SKIP | NP_TRIM | NP_KOKKOS_DEVICE); -typedef NPairHalffullKokkos NPairKokkosHalffullNewtoffTrimHost; -NPairStyle(halffull/newtoff/skip/ghost/trim/kk/host, +typedef NPairHalffullKokkos NPairKokkosHalffullNewtoffTrimHost; +NPairStyle(halffull/newtoff/trim/skip/ghost/kk/host, NPairKokkosHalffullNewtoffTrimHost, NP_HALF_FULL | NP_NEWTOFF | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | NP_ORTHO | NP_TRI | NP_GHOST | NP_SKIP | NP_TRIM | NP_KOKKOS_HOST); + // clang-format on #else @@ -244,7 +348,7 @@ namespace LAMMPS_NS { struct TagNPairHalffullCompute{}; -template +template class NPairHalffullKokkos : public NPair { public: typedef DeviceType device_type; @@ -261,6 +365,7 @@ class NPairHalffullKokkos : public NPair { double cutsq_custom,delta; typename AT::t_x_array_randomread x; + typename AT::t_tagint_1d_randomread tag; typename AT::t_neighbors_2d_const d_neighbors_full; typename AT::t_int_1d_const d_ilist_full; diff --git a/src/KOKKOS/npair_kokkos.cpp b/src/KOKKOS/npair_kokkos.cpp index 83e60768cd..4e992fb2d7 100644 --- a/src/KOKKOS/npair_kokkos.cpp +++ b/src/KOKKOS/npair_kokkos.cpp @@ -219,6 +219,8 @@ void NPairKokkos::build(NeighList *list_) atomKK->sync(Device,X_MASK|RADIUS_MASK|TYPE_MASK); } + if (HALF && NEWTON && TRI) atomKK->sync(Device,TAG_MASK); + data.special_flag[0] = special_flag[0]; data.special_flag[1] = special_flag[1]; data.special_flag[2] = special_flag[2]; @@ -241,7 +243,7 @@ void NPairKokkos::build(NeighList *list_) if (GHOST) { // assumes newton off - NPairKokkosBuildFunctorGhost f(data,atoms_per_bin * 6 * sizeof(X_FLOAT) * factor); + NPairKokkosBuildFunctorGhost f(data,atoms_per_bin * 5 * sizeof(X_FLOAT) * factor); // temporarily disable team policy for ghost due to known bug @@ -416,7 +418,8 @@ void NeighborKokkosExecute:: const X_FLOAT ytmp = x(i, 1); const X_FLOAT ztmp = x(i, 2); const int itype = type(i); - const tagint itag = tag(i); + tagint itag; + if (HalfNeigh && Newton && Tri) itag = tag(i); const int ibin = c_atom2bin(i); @@ -624,12 +627,14 @@ void NeighborKokkosExecute::build_ItemGPU(typename Kokkos::TeamPolic ytmp = x(i, 1); ztmp = x(i, 2); itype = type(i); - itag = tag(i); other_x[MY_II] = xtmp; other_x[MY_II + atoms_per_bin] = ytmp; other_x[MY_II + 2 * atoms_per_bin] = ztmp; other_x[MY_II + 3 * atoms_per_bin] = itype; - other_x[MY_II + 4 * atoms_per_bin] = itag; + if (HalfNeigh && Newton && Tri) { + itag = tag(i); + other_x[MY_II + 4 * atoms_per_bin] = itag; + } } other_id[MY_II] = i; @@ -717,7 +722,8 @@ void NeighborKokkosExecute::build_ItemGPU(typename Kokkos::TeamPolic other_x[MY_II + atoms_per_bin] = x(j, 1); other_x[MY_II + 2 * atoms_per_bin] = x(j, 2); other_x[MY_II + 3 * atoms_per_bin] = type(j); - other_x[MY_II + 4 * atoms_per_bin] = tag(j); + if (HalfNeigh && Newton && Tri) + other_x[MY_II + 4 * atoms_per_bin] = tag(j); } other_id[MY_II] = j; @@ -833,7 +839,6 @@ void NeighborKokkosExecute:: const X_FLOAT ytmp = x(i, 1); const X_FLOAT ztmp = x(i, 2); const int itype = type(i); - const tagint itag = tag(i); const typename ArrayTypes::t_int_1d_const_um stencil = d_stencil; @@ -957,8 +962,8 @@ void NeighborKokkosExecute::build_ItemGhostGPU(typename Kokkos::Team if (ibin >= mbins) return; - X_FLOAT* other_x = sharedmem + 6*atoms_per_bin*MY_BIN; - int* other_id = (int*) &other_x[5 * atoms_per_bin]; + X_FLOAT* other_x = sharedmem + 5*atoms_per_bin*MY_BIN; + int* other_id = (int*) &other_x[4 * atoms_per_bin]; int bincount_current = c_bincount[ibin]; @@ -972,7 +977,6 @@ void NeighborKokkosExecute::build_ItemGhostGPU(typename Kokkos::Team X_FLOAT ytmp; X_FLOAT ztmp; int itype; - tagint itag; const int index = (i >= 0 && i < nall) ? i : 0; const AtomNeighbors neighbors_i = neigh_transpose ? neigh_list.get_neighbors_transpose(index) : neigh_list.get_neighbors(index); @@ -982,12 +986,10 @@ void NeighborKokkosExecute::build_ItemGhostGPU(typename Kokkos::Team ytmp = x(i, 1); ztmp = x(i, 2); itype = type(i); - itag = tag(i); other_x[MY_II] = xtmp; other_x[MY_II + atoms_per_bin] = ytmp; other_x[MY_II + 2 * atoms_per_bin] = ztmp; other_x[MY_II + 3 * atoms_per_bin] = itype; - other_x[MY_II + 4 * atoms_per_bin] = itag; } other_id[MY_II] = i; #if defined(KOKKOS_ENABLE_CUDA) || defined(KOKKOS_ENABLE_HIP) @@ -1043,7 +1045,6 @@ void NeighborKokkosExecute::build_ItemGhostGPU(typename Kokkos::Team other_x[MY_II + atoms_per_bin] = x(j, 1); other_x[MY_II + 2 * atoms_per_bin] = x(j, 2); other_x[MY_II + 3 * atoms_per_bin] = type(j); - other_x[MY_II + 4 * atoms_per_bin] = tag(j); } other_id[MY_II] = j; @@ -1129,7 +1130,8 @@ void NeighborKokkosExecute:: const X_FLOAT ztmp = x(i, 2); const X_FLOAT radi = radius(i); const int itype = type(i); - const tagint itag = tag(i); + tagint itag; + if (HalfNeigh && Newton && Tri) itag = tag(i); const int ibin = c_atom2bin(i); @@ -1347,12 +1349,14 @@ void NeighborKokkosExecute::build_ItemSizeGPU(typename Kokkos::TeamP ztmp = x(i, 2); radi = radius(i); itype = type(i); - itag = tag(i); other_x[MY_II] = xtmp; other_x[MY_II + atoms_per_bin] = ytmp; other_x[MY_II + 2 * atoms_per_bin] = ztmp; other_x[MY_II + 3 * atoms_per_bin] = itype; - other_x[MY_II + 4 * atoms_per_bin] = itag; + if (HalfNeigh && Newton && Tri) { + itag = tag(i); + other_x[MY_II + 4 * atoms_per_bin] = itag; + } other_x[MY_II + 5 * atoms_per_bin] = radi; } other_id[MY_II] = i; @@ -1445,7 +1449,8 @@ void NeighborKokkosExecute::build_ItemSizeGPU(typename Kokkos::TeamP other_x[MY_II + atoms_per_bin] = x(j, 1); other_x[MY_II + 2 * atoms_per_bin] = x(j, 2); other_x[MY_II + 3 * atoms_per_bin] = type(j); - other_x[MY_II + 4 * atoms_per_bin] = tag(j); + if (HalfNeigh && Newton && Tri) + other_x[MY_II + 4 * atoms_per_bin] = tag(j); other_x[MY_II + 5 * atoms_per_bin] = radius(j); } From 750957d585ede258dc025a9091d86cde28ce8c60 Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Tue, 17 Oct 2023 12:27:35 -0600 Subject: [PATCH 198/219] Remove unused var --- src/KOKKOS/npair_halffull_kokkos.cpp | 5 ----- src/KOKKOS/npair_halffull_kokkos.h | 1 - 2 files changed, 6 deletions(-) diff --git a/src/KOKKOS/npair_halffull_kokkos.cpp b/src/KOKKOS/npair_halffull_kokkos.cpp index ddd7362c4e..c8c4d57fc9 100644 --- a/src/KOKKOS/npair_halffull_kokkos.cpp +++ b/src/KOKKOS/npair_halffull_kokkos.cpp @@ -50,11 +50,6 @@ void NPairHalffullKokkos::build(NeighList *list) atomKK->sync(execution_space,X_MASK); } - if (TRI) { - tag = atomKK->k_tag.view(); - atomKK->sync(execution_space,TAG_MASK); - } - nlocal = atom->nlocal; cutsq_custom = cutoff_custom*cutoff_custom; diff --git a/src/KOKKOS/npair_halffull_kokkos.h b/src/KOKKOS/npair_halffull_kokkos.h index 7e6c28aaba..98526c7fee 100644 --- a/src/KOKKOS/npair_halffull_kokkos.h +++ b/src/KOKKOS/npair_halffull_kokkos.h @@ -365,7 +365,6 @@ class NPairHalffullKokkos : public NPair { double cutsq_custom,delta; typename AT::t_x_array_randomread x; - typename AT::t_tagint_1d_randomread tag; typename AT::t_neighbors_2d_const d_neighbors_full; typename AT::t_int_1d_const d_ilist_full; From c051a4cf2df46de7437e7805e4b5598fded4ca27 Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Tue, 17 Oct 2023 14:18:16 -0600 Subject: [PATCH 199/219] Fix perf regression --- src/KOKKOS/npair_kokkos.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/KOKKOS/npair_kokkos.cpp b/src/KOKKOS/npair_kokkos.cpp index 4e992fb2d7..f677b3a1bf 100644 --- a/src/KOKKOS/npair_kokkos.cpp +++ b/src/KOKKOS/npair_kokkos.cpp @@ -1353,11 +1353,11 @@ void NeighborKokkosExecute::build_ItemSizeGPU(typename Kokkos::TeamP other_x[MY_II + atoms_per_bin] = ytmp; other_x[MY_II + 2 * atoms_per_bin] = ztmp; other_x[MY_II + 3 * atoms_per_bin] = itype; + other_x[MY_II + 4 * atoms_per_bin] = radi; if (HalfNeigh && Newton && Tri) { itag = tag(i); - other_x[MY_II + 4 * atoms_per_bin] = itag; + other_x[MY_II + 5 * atoms_per_bin] = itag; } - other_x[MY_II + 5 * atoms_per_bin] = radi; } other_id[MY_II] = i; #if defined(KOKKOS_ENABLE_CUDA) || defined(KOKKOS_ENABLE_HIP) @@ -1392,7 +1392,7 @@ void NeighborKokkosExecute::build_ItemSizeGPU(typename Kokkos::TeamP const X_FLOAT dely = ytmp - other_x[m + atoms_per_bin]; const X_FLOAT delz = ztmp - other_x[m + 2 * atoms_per_bin]; const X_FLOAT rsq = delx*delx + dely*dely + delz*delz; - const X_FLOAT radsum = radi + other_x[m + 5 * atoms_per_bin]; + const X_FLOAT radsum = radi + other_x[m + 4 * atoms_per_bin]; const X_FLOAT cutsq = (radsum + skin) * (radsum + skin); if (rsq <= cutsq) { @@ -1449,9 +1449,9 @@ void NeighborKokkosExecute::build_ItemSizeGPU(typename Kokkos::TeamP other_x[MY_II + atoms_per_bin] = x(j, 1); other_x[MY_II + 2 * atoms_per_bin] = x(j, 2); other_x[MY_II + 3 * atoms_per_bin] = type(j); + other_x[MY_II + 4 * atoms_per_bin] = radius(j); if (HalfNeigh && Newton && Tri) - other_x[MY_II + 4 * atoms_per_bin] = tag(j); - other_x[MY_II + 5 * atoms_per_bin] = radius(j); + other_x[MY_II + 5 * atoms_per_bin] = tag(j); } other_id[MY_II] = j; @@ -1475,7 +1475,7 @@ void NeighborKokkosExecute::build_ItemSizeGPU(typename Kokkos::TeamP if (HalfNeigh && Newton && Tri) { if (j <= i) continue; if (j >= nlocal) { - const tagint jtag = other_x[m + 4 * atoms_per_bin]; + const tagint jtag = other_x[m + 5 * atoms_per_bin]; if (itag > jtag) { if ((itag+jtag) % 2 == 0) continue; } else if (itag < jtag) { @@ -1499,7 +1499,7 @@ void NeighborKokkosExecute::build_ItemSizeGPU(typename Kokkos::TeamP const X_FLOAT dely = ytmp - other_x[m + atoms_per_bin]; const X_FLOAT delz = ztmp - other_x[m + 2 * atoms_per_bin]; const X_FLOAT rsq = delx*delx + dely*dely + delz*delz; - const X_FLOAT radsum = radi + other_x[m + 5 * atoms_per_bin]; + const X_FLOAT radsum = radi + other_x[m + 4 * atoms_per_bin]; const X_FLOAT cutsq = (radsum + skin) * (radsum + skin); if (rsq <= cutsq) { From 6b184e8079bb33310cd3bf441cff59f82a7305b9 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 17 Oct 2023 19:39:31 -0400 Subject: [PATCH 200/219] copy-and-paste bugfix from @stanmoore1 --- src/balance.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/balance.cpp b/src/balance.cpp index 3bd083e2b9..6f28081f13 100644 --- a/src/balance.cpp +++ b/src/balance.cpp @@ -473,7 +473,7 @@ void Balance::options(int iarg, int narg, char **arg, int sortflag_default) } iarg += 2+nopt; - } else if (strcmp(arg[iarg+1],"sort") == 0) { + } else if (strcmp(arg[iarg],"sort") == 0) { if (iarg+2 > narg) utils::missing_cmd_args(FLERR, "balance sort", error); sortflag = utils::logical(FLERR,arg[iarg+1],false,lmp); iarg += 2; From dbd5f93ed475333e61d5fa2914eb3345ffe27eba Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 17 Oct 2023 19:41:00 -0400 Subject: [PATCH 201/219] whitespace --- src/KOKKOS/npair_halffull_kokkos.h | 2 +- src/KOKKOS/npair_kokkos.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/KOKKOS/npair_halffull_kokkos.h b/src/KOKKOS/npair_halffull_kokkos.h index 98526c7fee..3eee19b8c3 100644 --- a/src/KOKKOS/npair_halffull_kokkos.h +++ b/src/KOKKOS/npair_halffull_kokkos.h @@ -16,7 +16,7 @@ // Trim off -// Newton, no triclinic +// Newton, no triclinic typedef NPairHalffullKokkos NPairKokkosHalffullNewtonDevice; NPairStyle(halffull/newton/kk/device, diff --git a/src/KOKKOS/npair_kokkos.cpp b/src/KOKKOS/npair_kokkos.cpp index f677b3a1bf..45ec83e90e 100644 --- a/src/KOKKOS/npair_kokkos.cpp +++ b/src/KOKKOS/npair_kokkos.cpp @@ -1354,7 +1354,7 @@ void NeighborKokkosExecute::build_ItemSizeGPU(typename Kokkos::TeamP other_x[MY_II + 2 * atoms_per_bin] = ztmp; other_x[MY_II + 3 * atoms_per_bin] = itype; other_x[MY_II + 4 * atoms_per_bin] = radi; - if (HalfNeigh && Newton && Tri) { + if (HalfNeigh && Newton && Tri) { itag = tag(i); other_x[MY_II + 5 * atoms_per_bin] = itag; } From ea69d77b790f28632d6ae345eca6b6a143f010bf Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 17 Oct 2023 20:02:01 -0400 Subject: [PATCH 202/219] fix issues with Qt library detection --- tools/lammps-gui/CMakeLists.txt | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/tools/lammps-gui/CMakeLists.txt b/tools/lammps-gui/CMakeLists.txt index edfeeb1128..e83db05fdd 100644 --- a/tools/lammps-gui/CMakeLists.txt +++ b/tools/lammps-gui/CMakeLists.txt @@ -110,14 +110,15 @@ endif() # we require Qt 5 and at least version 5.12 at that. if(NOT LAMMPS_GUI_USE_QT5) - find_package(Qt6 6.2 COMPONENTS Widgets Charts) + find_package(Qt6 6.2 QUIET COMPONENTS Widgets Charts) endif() if(NOT Qt6_FOUND) find_package(Qt5 5.12 REQUIRED COMPONENTS Widgets Charts) - set(QT_VERSION_MAJOR "5") + set(QT_VERSION_MAJOR 5) else() - set(QT_VERSION_MAJOR "6") + set(QT_VERSION_MAJOR 6) endif() +message(STATUS "Using Qt version ${Qt${QT_VERSION_MAJOR}_VERSION} for LAMMPS GUI") set(PROJECT_SOURCES main.cpp @@ -188,7 +189,7 @@ else() endif() target_include_directories(lammps-gui PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) target_compile_definitions(lammps-gui PRIVATE LAMMPS_GUI_VERSION="${PROJECT_VERSION}") -target_link_libraries(lammps-gui PRIVATE Qt${QT_VERSION_MAJOR}::Widgets Qt${VERSION_MAJOR}::Charts) +target_link_libraries(lammps-gui PRIVATE Qt${QT_VERSION_MAJOR}::Widgets Qt${QT_VERSION_MAJOR}::Charts) if(BUILD_OMP) find_package(OpenMP COMPONENTS CXX REQUIRED) target_link_libraries(lammps-gui PRIVATE OpenMP::OpenMP_CXX) From 4c980eec91457763153b530a45095aa066cc96d1 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 17 Oct 2023 20:52:13 -0400 Subject: [PATCH 203/219] correct table formatting --- doc/src/variable.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/src/variable.rst b/doc/src/variable.rst index f1a316da1f..3407b48156 100644 --- a/doc/src/variable.rst +++ b/doc/src/variable.rst @@ -1183,7 +1183,7 @@ table: +--------+------------+------------------------------------------+ | vector | c_ID | global vector | | vector | c_ID[I] | column of global array | ----------+------------+------------------------------------------+ ++--------+------------+------------------------------------------+ | atom | c_ID | per-atom vector | | atom | c_ID[I] | column of per-atom array | +--------+------------+------------------------------------------+ @@ -1247,7 +1247,7 @@ and atom-style variables are listed in the following table: +--------+------------+------------------------------------------+ | vector | f_ID | global vector | | vector | f_ID[I] | column of global array | ----------+------------+------------------------------------------+ ++--------+------------+------------------------------------------+ | atom | f_ID | per-atom vector | | atom | f_ID[I] | column of per-atom array | +--------+------------+------------------------------------------+ From 302e3be66978f81205d63a16b60d4eb5d9b5a34a Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 18 Oct 2023 07:51:25 -0400 Subject: [PATCH 204/219] make sure itag is initialized --- src/OPENMP/npair_half_size_multi_old_newton_tri_omp.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/OPENMP/npair_half_size_multi_old_newton_tri_omp.cpp b/src/OPENMP/npair_half_size_multi_old_newton_tri_omp.cpp index 7faa210107..1c6d025fab 100644 --- a/src/OPENMP/npair_half_size_multi_old_newton_tri_omp.cpp +++ b/src/OPENMP/npair_half_size_multi_old_newton_tri_omp.cpp @@ -87,6 +87,7 @@ void NPairHalfSizeMultiOldNewtonTriOmp::build(NeighList *list) n = 0; neighptr = ipage.vget(); + itag = tag[i]; itype = type[i]; xtmp = x[i][0]; ytmp = x[i][1]; From 5cfd8b3c63d12051c988b1fe30c289d1d35a9bc5 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 18 Oct 2023 07:56:50 -0400 Subject: [PATCH 205/219] silence coverity scan warning --- src/fix_property_atom.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fix_property_atom.cpp b/src/fix_property_atom.cpp index 3a53110839..9613523059 100644 --- a/src/fix_property_atom.cpp +++ b/src/fix_property_atom.cpp @@ -46,6 +46,7 @@ FixPropertyAtom::FixPropertyAtom(LAMMPS *lmp, int narg, char **arg) : rmass_flag = 0; temperature_flag = 0; heatflow_flag = 0; + nmax_old = 0; nvalue = 0; values_peratom = 0; @@ -212,7 +213,6 @@ void FixPropertyAtom::post_constructor() { // perform initial allocation of atom-based array - nmax_old = 0; grow_arrays(atom->nmax); } From a5f61c5d4405a8af7c9c6962936a21c0622864b2 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 18 Oct 2023 07:59:22 -0400 Subject: [PATCH 206/219] address bugs and issues flagged by static code analysis with coverity scan --- src/fix_press_langevin.cpp | 30 +++++++++++++++++------------- src/fix_press_langevin.h | 7 +++---- 2 files changed, 20 insertions(+), 17 deletions(-) diff --git a/src/fix_press_langevin.cpp b/src/fix_press_langevin.cpp index d8b90d8b49..2f6e765cd5 100644 --- a/src/fix_press_langevin.cpp +++ b/src/fix_press_langevin.cpp @@ -46,7 +46,8 @@ enum { ISO, ANISO, TRICLINIC }; /* ---------------------------------------------------------------------- */ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : - Fix(lmp, narg, arg), id_press(nullptr), pflag(0), random(nullptr), irregular(nullptr) + Fix(lmp, narg, arg), id_temp(nullptr), id_press(nullptr), temperature(nullptr), + pressure(nullptr), irregular(nullptr), random(nullptr) { if (narg < 5) utils::missing_cmd_args(FLERR, "fix press/langevin", error); @@ -62,6 +63,9 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : allremap = 1; pre_exchange_flag = 0; flipflag = 1; + seed = 111111; + pflag = 0; + kspace_flag = 0; p_ltime = 0.0; @@ -239,7 +243,7 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : t_start = utils::numeric(FLERR, arg[iarg + 1], false, lmp); t_stop = utils::numeric(FLERR, arg[iarg + 2], false, lmp); seed = utils::numeric(FLERR, arg[iarg + 3], false, lmp); - if (seed <= 0.0) error->all(FLERR, "Fix press/langevin temp seed must be > 0"); + if (seed <= 0) error->all(FLERR, "Fix press/langevin temp seed must be > 0"); iarg += 4; } @@ -349,7 +353,7 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : // Kinetic contribution will be added by the fix style id_press = utils::strdup(std::string(id) + "_press"); - modify->add_compute(fmt::format("{} all pressure NULL virial", id_press)); + pressure = modify->add_compute(fmt::format("{} all pressure NULL virial", id_press)); pflag = 1; // p_fric is alpha coeff from GJF @@ -482,7 +486,7 @@ void FixPressLangevin::initial_integrate(int /* vflag */) if (delta != 0.0) delta /= update->endstep - update->beginstep; t_target = t_start + delta * (t_stop - t_start); - couple_beta(t_target); + couple_beta(); dt = update->dt; @@ -492,11 +496,12 @@ void FixPressLangevin::initial_integrate(int /* vflag */) displacement = dt * p_deriv[i] * gjfb[i]; displacement += 0.5 * dt * dt * f_piston[i] * gjfb[i] / p_mass[i]; displacement += 0.5 * dt * fran[i] * gjfb[i] / p_mass[i]; - dl = domain->boxhi[i] - domain->boxlo[i]; - if (i < 3) + if (i < 3) { + dl = domain->boxhi[i] - domain->boxlo[i]; dilation[i] = (dl + displacement) / dl; - else + } else { dilation[i] = displacement; + } } } } @@ -527,7 +532,7 @@ void FixPressLangevin::post_force(int /*vflag*/) } couple_pressure(); - couple_kinetic(t_target); + couple_kinetic(); for (int i = 0; i < 6; i++) { if (p_flag[i]) { @@ -594,10 +599,9 @@ void FixPressLangevin::couple_pressure() } /* ---------------------------------------------------------------------- */ -void FixPressLangevin::couple_kinetic(double t_target) +void FixPressLangevin::couple_kinetic() { double pk, volume; - nktv2p = force->nktv2p; // kinetic part @@ -607,7 +611,7 @@ void FixPressLangevin::couple_kinetic(double t_target) volume = domain->xprd * domain->yprd; pk = atom->natoms * force->boltz * t_target / volume; - pk *= nktv2p; + pk *= force->nktv2p; p_current[0] += pk; p_current[1] += pk; @@ -616,7 +620,7 @@ void FixPressLangevin::couple_kinetic(double t_target) /* ---------------------------------------------------------------------- */ -void FixPressLangevin::couple_beta(double t_target) +void FixPressLangevin::couple_beta() { double gamma[6]; int me = comm->me; @@ -812,7 +816,7 @@ int FixPressLangevin::modify_param(int narg, char **arg) id_press = utils::strdup(arg[1]); pressure = modify->get_compute_by_id(arg[1]); - if (pressure) error->all(FLERR, "Could not find fix_modify pressure compute ID: {}", arg[1]); + if (!pressure) error->all(FLERR, "Could not find fix_modify pressure compute ID: {}", arg[1]); if (pressure->pressflag == 0) error->all(FLERR, "Fix_modify pressure compute {} does not compute pressure", arg[1]); return 2; diff --git a/src/fix_press_langevin.h b/src/fix_press_langevin.h index fc9f39c434..868993b1f4 100644 --- a/src/fix_press_langevin.h +++ b/src/fix_press_langevin.h @@ -40,10 +40,9 @@ class FixPressLangevin : public Fix { int modify_param(int, char **) override; protected: - int dimension, which; + int dimension; int pstyle, pcouple, allremap; int p_flag[6]; // 1 if control P on this dim, 0 if not - double nktv2p; double t_start, t_stop, t_target; double p_fric[6], p_ltime; // Friction and Langevin charac. time double p_alpha[6]; @@ -68,8 +67,8 @@ class FixPressLangevin : public Fix { int seed; void couple_pressure(); - void couple_kinetic(double); - void couple_beta(double); + void couple_kinetic(); + void couple_beta(); void remap(); }; From 54ff01d86daa134e48feeef503da52b750cf9ffc Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 18 Oct 2023 08:01:41 -0400 Subject: [PATCH 207/219] assign code owner to fix press/langevin --- .github/CODEOWNERS | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index f99a336dbb..9b316fbeb9 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -135,6 +135,7 @@ src/timer.* @akohlmey src/utils.* @akohlmey @rbberger src/verlet.* @sjplimp @stanmoore1 src/math_eigen_impl.h @jewettaij +src/fix_press_langevin.* @Bibobu # tools tools/coding_standard/* @akohlmey @rbberger From 45d2a91c6289466f3940571e5845aad527b912a8 Mon Sep 17 00:00:00 2001 From: Maria-Lesniewski Date: Wed, 18 Oct 2023 13:13:37 -0400 Subject: [PATCH 208/219] Barostat fix - see lammps PR 879 and 942 --- src/BOCS/fix_bocs.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/BOCS/fix_bocs.cpp b/src/BOCS/fix_bocs.cpp index d17884855a..52ca948657 100644 --- a/src/BOCS/fix_bocs.cpp +++ b/src/BOCS/fix_bocs.cpp @@ -1024,7 +1024,10 @@ void FixBocs::final_integrate() if (pstat_flag) { if (pstyle == ISO) pressure->compute_scalar(); - else pressure->compute_vector(); + else { + temperature->compute_vector(); + pressure->compute_vector(); + } couple(); pressure->addstep(update->ntimestep+1); } @@ -1961,7 +1964,7 @@ void FixBocs::nhc_press_integrate() int ich,i,pdof; double expfac,factor_etap,kecurrent; double kt = boltz * t_target; - + double lkt_press; // Update masses, to preserve initial freq, if flag set if (omega_mass_flag) { @@ -2006,7 +2009,8 @@ void FixBocs::nhc_press_integrate() } } - double lkt_press = pdof * kt; + if (pstyle == ISO) lkt_press = kt; + else lkt_press = pdof * kt; etap_dotdot[0] = (kecurrent - lkt_press)/etap_mass[0]; double ncfac = 1.0/nc_pchain; From 27e0a7184954c9b5a2d9c5b3b68c700022c7c050 Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Thu, 19 Oct 2023 07:44:44 -0600 Subject: [PATCH 209/219] whitespace --- src/BOCS/fix_bocs.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/BOCS/fix_bocs.cpp b/src/BOCS/fix_bocs.cpp index 52ca948657..17bb1af002 100644 --- a/src/BOCS/fix_bocs.cpp +++ b/src/BOCS/fix_bocs.cpp @@ -1025,8 +1025,8 @@ void FixBocs::final_integrate() if (pstat_flag) { if (pstyle == ISO) pressure->compute_scalar(); else { - temperature->compute_vector(); - pressure->compute_vector(); + temperature->compute_vector(); + pressure->compute_vector(); } couple(); pressure->addstep(update->ntimestep+1); @@ -1965,6 +1965,7 @@ void FixBocs::nhc_press_integrate() double expfac,factor_etap,kecurrent; double kt = boltz * t_target; double lkt_press; + // Update masses, to preserve initial freq, if flag set if (omega_mass_flag) { From 0fc9b194dc36176e2eb2dd472cc50087c9e7e1da Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 19 Oct 2023 10:01:10 -0400 Subject: [PATCH 210/219] quote strings with special characters in keyword lists --- src/EXTRA-DUMP/dump_yaml.cpp | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/EXTRA-DUMP/dump_yaml.cpp b/src/EXTRA-DUMP/dump_yaml.cpp index 3ca5c59edf..6c21c24f77 100644 --- a/src/EXTRA-DUMP/dump_yaml.cpp +++ b/src/EXTRA-DUMP/dump_yaml.cpp @@ -24,6 +24,8 @@ using namespace LAMMPS_NS; +static constexpr char special_chars[] = "{}[],&:*#?|-<>=!%@\\"; + /* ---------------------------------------------------------------------- */ DumpYAML::DumpYAML(class LAMMPS *_lmp, int narg, char **args) : DumpCustom(_lmp, narg, args), thermo(false) @@ -67,7 +69,12 @@ void DumpYAML::write_header(bigint ndump) const auto &fields = th->get_fields(); thermo_data += "thermo:\n - keywords: [ "; - for (int i = 0; i < nfield; ++i) thermo_data += fmt::format("{}, ", keywords[i]); + for (int i = 0; i < nfield; ++i) { + if (keywords[i].find_first_of(special_chars) == std::string::npos) + thermo_data += fmt::format("{}, ", keywords[i]); + else + thermo_data += fmt::format("'{}', ", keywords[i]); + } thermo_data += "]\n - data: [ "; for (int i = 0; i < nfield; ++i) { @@ -107,7 +114,12 @@ void DumpYAML::write_header(bigint ndump) if (domain->triclinic) fmt::print(fp, " - [ {}, {}, {} ]\n", boxxy, boxxz, boxyz); fmt::print(fp, "keywords: [ "); - for (const auto &item : utils::split_words(columns)) fmt::print(fp, "{}, ", item); + for (const auto &item : utils::split_words(columns)) { + if (item.find_first_of(special_chars) == std::string::npos) + fmt::print(fp, "{}, ", item); + else + fmt::print(fp, "'{}', ", item); + } fputs(" ]\ndata:\n", fp); } else // reset so that the remainder of the output is not multi-proc filewriter = 0; From 62ea874d9df5727a97d90bf922291b0eebd103fc Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Thu, 19 Oct 2023 08:02:11 -0600 Subject: [PATCH 211/219] Add more error checks to Kokkos minimize --- src/KOKKOS/min_kokkos.cpp | 3 +++ src/min.cpp | 3 +++ 2 files changed, 6 insertions(+) diff --git a/src/KOKKOS/min_kokkos.cpp b/src/KOKKOS/min_kokkos.cpp index 4e1c3967ff..bbb9a0bd6e 100644 --- a/src/KOKKOS/min_kokkos.cpp +++ b/src/KOKKOS/min_kokkos.cpp @@ -59,6 +59,9 @@ void MinKokkos::init() { Min::init(); + if (!fix_minimize->kokkosable) + error->all(FLERR,"KOKKOS package requires fix minimize/kk"); + fix_minimize_kk = (FixMinimizeKokkos*) fix_minimize; } diff --git a/src/min.cpp b/src/min.cpp index 5a469a788b..acc7d17654 100644 --- a/src/min.cpp +++ b/src/min.cpp @@ -215,6 +215,9 @@ void Min::setup(int flag) } update->setupflag = 1; + if (lmp->kokkos) + error->all(FLERR,"KOKKOS package requires Kokkos-enabled min_style"); + // setup extra global dof due to fixes // cannot be done in init() b/c update init() is before modify init() From 2401cba84a5e9b07f50fe3a71a4cb6ec1048b025 Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Thu, 19 Oct 2023 12:15:01 -0700 Subject: [PATCH 212/219] Fix bug in Kokkos SNAP on GPUs --- src/KOKKOS/pair_snap_kokkos_impl.h | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/KOKKOS/pair_snap_kokkos_impl.h b/src/KOKKOS/pair_snap_kokkos_impl.h index 91f432dbaf..68303f9b33 100644 --- a/src/KOKKOS/pair_snap_kokkos_impl.h +++ b/src/KOKKOS/pair_snap_kokkos_impl.h @@ -63,10 +63,6 @@ PairSNAPKokkos::PairSNAPKokkos(LAMMPS *lmp datamask_read = EMPTY_MASK; datamask_modify = EMPTY_MASK; - k_cutsq = tdual_fparams("PairSNAPKokkos::cutsq",atom->ntypes+1,atom->ntypes+1); - auto d_cutsq = k_cutsq.template view(); - rnd_cutsq = d_cutsq; - host_flag = (execution_space == Host); } @@ -101,6 +97,8 @@ void PairSNAPKokkos::init_style() if (force->newton_pair == 0) error->all(FLERR,"Pair style SNAP requires newton pair on"); + + // neighbor list request for KOKKOS neighflag = lmp->kokkos->neighflag; @@ -546,6 +544,9 @@ void PairSNAPKokkos::allocate() int n = atom->ntypes; MemKK::realloc_kokkos(d_map,"PairSNAPKokkos::map",n+1); + + MemKK::realloc_kokkos(k_cutsq,"PairSNAPKokkos::cutsq",n+1,n+1); + rnd_cutsq = k_cutsq.template view(); } From 1de15c38bf9375a77768c7b4530fc999a2ebd8a8 Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Thu, 19 Oct 2023 12:16:26 -0700 Subject: [PATCH 213/219] whitespace --- src/KOKKOS/pair_snap_kokkos_impl.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/KOKKOS/pair_snap_kokkos_impl.h b/src/KOKKOS/pair_snap_kokkos_impl.h index 68303f9b33..7b9fda60db 100644 --- a/src/KOKKOS/pair_snap_kokkos_impl.h +++ b/src/KOKKOS/pair_snap_kokkos_impl.h @@ -97,8 +97,6 @@ void PairSNAPKokkos::init_style() if (force->newton_pair == 0) error->all(FLERR,"Pair style SNAP requires newton pair on"); - - // neighbor list request for KOKKOS neighflag = lmp->kokkos->neighflag; From 0f11a9dd70b8e839110b8c65554c3f0a91dc09ba Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 19 Oct 2023 23:21:18 -0400 Subject: [PATCH 214/219] require version newer than 2 Aug 2023 for LAMMPS GUI 1.5.9 --- tools/lammps-gui/lammpsgui.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/lammps-gui/lammpsgui.cpp b/tools/lammps-gui/lammpsgui.cpp index 11f2554b55..37b8aebf88 100644 --- a/tools/lammps-gui/lammpsgui.cpp +++ b/tools/lammps-gui/lammpsgui.cpp @@ -1432,12 +1432,12 @@ void LammpsGui::start_lammps() lammps.open(narg, args); lammpsstatus->show(); - // must have at least 2 August 2023 version of LAMMPS + // must have a version newer than the 2 August 2023 release of LAMMPS // TODO: must update this check before next feature release - if (lammps.version() < 20230802) { + if (lammps.version() <= 20230802) { QMessageBox::critical(this, "Incompatible LAMMPS Version", "LAMMPS-GUI version " LAMMPS_GUI_VERSION " requires\n" - "LAMMPS version 2 August 2023 or later"); + "a LAMMPS version more recent than 2 August 2023"); exit(1); } From 291defb45378eb759470347c97610335a26c9efb Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Fri, 20 Oct 2023 12:57:19 -0600 Subject: [PATCH 215/219] update refs on fix srd doc page --- doc/src/fix_srd.rst | 51 +++++++++++++++++++++++++++++---------------- 1 file changed, 33 insertions(+), 18 deletions(-) diff --git a/doc/src/fix_srd.rst b/doc/src/fix_srd.rst index 8bfbcf2387..c15a566563 100644 --- a/doc/src/fix_srd.rst +++ b/doc/src/fix_srd.rst @@ -61,25 +61,30 @@ Description Treat a group of particles as stochastic rotation dynamics (SRD) particles that serve as a background solvent when interacting with big (colloidal) particles in groupbig-ID. The SRD formalism is described -in :ref:`(Hecht) `. The key idea behind using SRD particles as a -cheap coarse-grained solvent is that SRD particles do not interact -with each other, but only with the solute particles, which in LAMMPS -can be spheroids, ellipsoids, or line segments, or triangles, or rigid -bodies containing multiple spheroids or ellipsoids or line segments -or triangles. The collision and rotation properties of the model -imbue the SRD particles with fluid-like properties, including an -effective viscosity. Thus simulations with large solute particles can -be run more quickly, to measure solute properties like diffusivity -and viscosity in a background fluid. The usual LAMMPS fixes for such -simulations, such as :doc:`fix deform `, -:doc:`fix viscosity `, and :doc:`fix nvt/sllod `, -can be used in conjunction with the SRD model. +in :ref:`(Hecht) `. The same methodology is also called +multi-particle collision dynamics (MPCD) in the literature. -For more details on how the SRD model is implemented in LAMMPS, -:ref:`(Petersen) ` describes the implementation and usage of -pure SRD fluids. See the ``examples/srd`` directory for sample input -scripts using SRD particles for that and for mixture systems (solute -particles in an SRD fluid). +The key idea behind using SRD particles as a cheap coarse-grained +solvent is that SRD particles do not interact with each other, but +only with the solute particles, which in LAMMPS can be spheroids, +ellipsoids, or line segments, or triangles, or rigid bodies containing +multiple spheroids or ellipsoids or line segments or triangles. The +collision and rotation properties of the model imbue the SRD particles +with fluid-like properties, including an effective viscosity. Thus +simulations with large solute particles can be run more quickly, to +measure solute properties like diffusivity and viscosity in a +background fluid. The usual LAMMPS fixes for such simulations, such +as :doc:`fix deform `, :doc:`fix viscosity +`, and :doc:`fix nvt/sllod `, can be +used in conjunction with the SRD model. + +These 3 papers give more details on how the SRD model is implemented +in LAMMPS. :ref:`(Petersen) ` describes pure SRD fluid +systems. :ref:`(Bolintineanu1) ` describes models +where pure SRD fluids :ref:interact with boundary walls. +:ref:`(Bolintineanu2) :ref:` describes mixture models +where large colloidal particles are solvated by an SRD fluid. See the +``examples/srd`` :ref:directory for sample input scripts. This fix does two things: @@ -404,3 +409,13 @@ no, and rescale = yes. **(Petersen)** Petersen, Lechman, Plimpton, Grest, in' t Veld, Schunk, J Chem Phys, 132, 174106 (2010). + +.. _Bolintineanu1: + +**(Bolintineanu1)** +Bolintineanu, Lechman, Plimpton, Grest, Phys Rev E, 86, 066703 (2012). + +.. _Bolintineanu2: + +**(Bolintineanu2)** Bolintineanu, Grest, Lechman, Pierce, Plimpton, +Schunk, Comp Particle Mechanics, 1, 321-356 (2014). From 654a410b8c90840003c0dbaed27ae8672cccff27 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Fri, 20 Oct 2023 12:59:36 -0600 Subject: [PATCH 216/219] update refs on fix srd doc page --- doc/src/fix_srd.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/src/fix_srd.rst b/doc/src/fix_srd.rst index c15a566563..59044a6e3b 100644 --- a/doc/src/fix_srd.rst +++ b/doc/src/fix_srd.rst @@ -82,8 +82,8 @@ These 3 papers give more details on how the SRD model is implemented in LAMMPS. :ref:`(Petersen) ` describes pure SRD fluid systems. :ref:`(Bolintineanu1) ` describes models where pure SRD fluids :ref:interact with boundary walls. -:ref:`(Bolintineanu2) :ref:` describes mixture models -where large colloidal particles are solvated by an SRD fluid. See the +:ref:`(Bolintineanu2) ` describes mixture models where +large colloidal particles are solvated by an SRD fluid. See the ``examples/srd`` :ref:directory for sample input scripts. This fix does two things: From fd05acec2fc0fc8756a2e8564a45a276f8f2e3c2 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 20 Oct 2023 20:54:05 -0400 Subject: [PATCH 217/219] fix spelling --- doc/src/compute.rst | 2 +- doc/src/compute_voronoi_atom.rst | 2 +- doc/src/fix.rst | 2 +- doc/src/fix_ave_histo.rst | 4 ++-- doc/src/thermo_style.rst | 2 +- doc/src/variable.rst | 4 ++-- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/doc/src/compute.rst b/doc/src/compute.rst index cc26d9acc9..6737203618 100644 --- a/doc/src/compute.rst +++ b/doc/src/compute.rst @@ -74,7 +74,7 @@ Global, per-atom, local, and per-grid quantities can also be of three for each atom, each local entity, or each grid cell. Note that a single compute can produce any combination of global, -per-atom, local, or per-grid values. Likewise it can prouduce any +per-atom, local, or per-grid values. Likewise it can produce any combination of scalar, vector, or array output for each style. The exception is that for per-atom, local, and per-grid output, either a vector or array can be produced, but not both. The doc page for each diff --git a/doc/src/compute_voronoi_atom.rst b/doc/src/compute_voronoi_atom.rst index 37e5386341..9607401ccd 100644 --- a/doc/src/compute_voronoi_atom.rst +++ b/doc/src/compute_voronoi_atom.rst @@ -232,4 +232,4 @@ Related commands Default """"""" -The default for the neighobrs keyword is no. +The default for the neighbors keyword is no. diff --git a/doc/src/fix.rst b/doc/src/fix.rst index 3dd7e224e7..0889fe281f 100644 --- a/doc/src/fix.rst +++ b/doc/src/fix.rst @@ -106,7 +106,7 @@ Global, per-atom, local, and per-grid quantities can also be of three for each atom, each local entity, or each grid cell. Note that a single fix can produce any combination of global, -per-atom, local, or per-grid values. Likewise it can prouduce any +per-atom, local, or per-grid values. Likewise it can produce any combination of scalar, vector, or array output for each style. The exception is that for per-atom, local, and per-grid output, either a vector or array can be produced, but not both. The doc page for each diff --git a/doc/src/fix_ave_histo.rst b/doc/src/fix_ave_histo.rst index 31e5476f9e..9699e4238c 100644 --- a/doc/src/fix_ave_histo.rst +++ b/doc/src/fix_ave_histo.rst @@ -106,7 +106,7 @@ attributes are per-atom vector values. See the page for individual generate. Note that a compute or fix can produce multiple kinds of data (global, -per-atom, local). If LAMMPS cannot unambiguosly determine which kind +per-atom, local). If LAMMPS cannot unambiguously determine which kind of data to use, the optional *kind* keyword discussed below can force the desired disambiguation. @@ -263,7 +263,7 @@ keyword is set to *vector*, then all input values must be global or per-atom or local vectors, or columns of global or per-atom or local arrays. -The *kind* keyword only needs to be used if any of the specfied input +The *kind* keyword only needs to be used if any of the specified input computes or fixes produce more than one kind of output (global, per-atom, local). If not, LAMMPS will determine the kind of data all the inputs produce and verify it is all the same kind. If not, an diff --git a/doc/src/thermo_style.rst b/doc/src/thermo_style.rst index c3c607a479..89a2c0b740 100644 --- a/doc/src/thermo_style.rst +++ b/doc/src/thermo_style.rst @@ -442,7 +442,7 @@ equal-style and vector-style variables can be referenced; the latter requires a bracketed term to specify the Ith element of the vector calculated by the variable. However, an equal-style variable can use an atom-style variable in its formula indexed by the ID of an -individual atom. This is a way to output a speciic atom's per-atom +individual atom. This is a way to output a specific atom's per-atom coordinates or other per-atom properties in thermo output. See the :doc:`variable ` command for details. Note that variables of style *equal* and *vector* and *atom* define a formula which can diff --git a/doc/src/variable.rst b/doc/src/variable.rst index 3407b48156..92a78ee3c1 100644 --- a/doc/src/variable.rst +++ b/doc/src/variable.rst @@ -1167,7 +1167,7 @@ variables), or global vectors of values. The latter can also be a column of a global array. Atom-style variables can use scalar values (same as for equal-style -varaibles), or per-atom vectors of values. The latter can also be a +variables), or per-atom vectors of values. The latter can also be a column of a per-atom array. The various allowed compute references in the variable formulas for @@ -1232,7 +1232,7 @@ variables), or global vectors of values. The latter can also be a column of a global array. Atom-style variables can use scalar values (same as for equal-style -varaibles), or per-atom vectors of values. The latter can also be a +variables), or per-atom vectors of values. The latter can also be a column of a per-atom array. The allowed fix references in variable formulas for equal-, vector-, From 3d480a01a5d400d6451c1f5e0831de0b75ce3663 Mon Sep 17 00:00:00 2001 From: Yifan Li Date: Fri, 20 Oct 2023 23:41:06 -0400 Subject: [PATCH 218/219] add the missing dividing by np in compute t_prim --- src/REPLICA/fix_pimd_langevin.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/REPLICA/fix_pimd_langevin.cpp b/src/REPLICA/fix_pimd_langevin.cpp index c091075f7c..a28bc9506b 100644 --- a/src/REPLICA/fix_pimd_langevin.cpp +++ b/src/REPLICA/fix_pimd_langevin.cpp @@ -1347,7 +1347,7 @@ void FixPIMDLangevin::compute_tote() void FixPIMDLangevin::compute_t_prim() { - t_prim = 1.5 * atom->natoms * np * force->boltz * temp - total_spring_energy; + t_prim = 1.5 * atom->natoms * np * force->boltz * temp - total_spring_energy / np; } /* ---------------------------------------------------------------------- */ From 80f72e7a1d560d0a555cea4048417d52e924199f Mon Sep 17 00:00:00 2001 From: Yifan Li Date: Sat, 21 Oct 2023 00:28:33 -0400 Subject: [PATCH 219/219] use times inverse_np instead --- src/REPLICA/fix_pimd_langevin.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/REPLICA/fix_pimd_langevin.cpp b/src/REPLICA/fix_pimd_langevin.cpp index a28bc9506b..cffaf327e4 100644 --- a/src/REPLICA/fix_pimd_langevin.cpp +++ b/src/REPLICA/fix_pimd_langevin.cpp @@ -1347,7 +1347,7 @@ void FixPIMDLangevin::compute_tote() void FixPIMDLangevin::compute_t_prim() { - t_prim = 1.5 * atom->natoms * np * force->boltz * temp - total_spring_energy / np; + t_prim = 1.5 * atom->natoms * np * force->boltz * temp - total_spring_energy * inverse_np; } /* ---------------------------------------------------------------------- */

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 z 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 literal 76737 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%0Du4>D#)kc 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