From 282f879d12e975d1120c810a20fc0afb23c4425e Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 10 Jun 2026 23:23:49 +0000 Subject: [PATCH 001/100] Remove sort+nfile/fileper restriction; update documentation --- doc/src/dump_modify.rst | 11 ++++++----- src/dump.cpp | 3 --- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/doc/src/dump_modify.rst b/doc/src/dump_modify.rst index f1f0a4dbe90..dc3bbefcf9e 100644 --- a/doc/src/dump_modify.rst +++ b/doc/src/dump_modify.rst @@ -738,11 +738,12 @@ descending order. The dump *local* style cannot be sorted by atom ID, since there are typically multiple lines of output per atom. Some dump styles, such as *dcd* and *xtc*, require sorting by atom ID to format the output -file correctly. If multiple processors are writing the dump file, via -the "%" wildcard in the dump filename and the *nfile* or *fileper* -keywords are set to non-default values (i.e., the number of dump file -pieces is not equal to the number of procs), then sorting cannot be -performed. +file correctly. When multiple processors write separate dump file +pieces via the "%" wildcard together with the *nfile* or *fileper* +keywords, sorting is performed globally across all processors first and +the sorted data are then forwarded to the respective file-writer +processors in order, so each file piece contains a consecutive, sorted +portion of the snapshot. In a parallel run, the per-processor dump file pieces can have significant imbalance in number of lines of per-atom info. The *balance* diff --git a/src/dump.cpp b/src/dump.cpp index 4e53dfc805d..bea57cbde52 100644 --- a/src/dump.cpp +++ b/src/dump.cpp @@ -212,9 +212,6 @@ void Dump::init() } if (sort_flag) { - if (multiproc > 1) - error->all(FLERR, Error::NOLASTLINE, - "Cannot sort dump when 'nfile' or 'fileper' keywords have non-default values"); if (sortcol == 0 && atom->tag_enable == 0) error->all(FLERR, Error::NOLASTLINE, "Cannot sort dump on atom IDs with no atom IDs defined"); From ca649da8ca1f1486aaecc9c311942a51faaacce3 Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Thu, 11 Jun 2026 10:14:16 -0600 Subject: [PATCH 002/100] Clarify docs --- doc/src/dump_modify.rst | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/doc/src/dump_modify.rst b/doc/src/dump_modify.rst index dc3bbefcf9e..f2c2c667d8c 100644 --- a/doc/src/dump_modify.rst +++ b/doc/src/dump_modify.rst @@ -738,12 +738,12 @@ descending order. The dump *local* style cannot be sorted by atom ID, since there are typically multiple lines of output per atom. Some dump styles, such as *dcd* and *xtc*, require sorting by atom ID to format the output -file correctly. When multiple processors write separate dump file +file correctly. When multiple processors write separate dump file pieces via the "%" wildcard together with the *nfile* or *fileper* -keywords, sorting is performed globally across all processors first and -the sorted data are then forwarded to the respective file-writer -processors in order, so each file piece contains a consecutive, sorted -portion of the snapshot. +keywords, sorting is performed globally across all processors first +and the sorted data are then forwarded to a smaller subset of +processors who accumulate the data in order, so each individual dump +file contains a consecutive, sorted portion of the full snapshot. In a parallel run, the per-processor dump file pieces can have significant imbalance in number of lines of per-atom info. The *balance* @@ -752,6 +752,19 @@ snapshot are balanced to be nearly the same. A balance value of *no* means no balancing will be done, while *yes* means balancing will be performed. This balancing preserves dump sorting order. For a serial run, this option is ignored since the output is already balanced. +When multiple processors write separate dump file +pieces via the "%" wildcard together with the *nfile* or *fileper* +keywords, balancing is performed globally across all processors first +and the balanced data are then forwarded to a smaller subset of +processors who accumulate the data. + +.. note:: + + Because balancing is performed before data accumulation, *nfile* or + *fileper* should divide the total number of processors evenly when + using the *balance* keyword. Otherwise, some processors will + accumulate more data than others, reintroducing load imbalance during + file output. .. note:: From 9b831a63d62f5de0dd909989fceed06359ed3522 Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Thu, 11 Jun 2026 10:29:24 -0600 Subject: [PATCH 003/100] Small tweak to docs --- doc/src/dump_modify.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/src/dump_modify.rst b/doc/src/dump_modify.rst index f2c2c667d8c..20eb03cb415 100644 --- a/doc/src/dump_modify.rst +++ b/doc/src/dump_modify.rst @@ -763,7 +763,7 @@ processors who accumulate the data. Because balancing is performed before data accumulation, *nfile* or *fileper* should divide the total number of processors evenly when using the *balance* keyword. Otherwise, some processors will - accumulate more data than others, reintroducing load imbalance during + accumulate more data than others, reintroducing imbalance during file output. .. note:: From 9c6869005e1689a5245b6bae75dc546b541f8306 Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Thu, 11 Jun 2026 11:21:31 -0600 Subject: [PATCH 004/100] Add warning --- src/dump.cpp | 20 ++++++++++++++++++-- src/dump.h | 2 ++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/dump.cpp b/src/dump.cpp index bea57cbde52..5844f627b1a 100644 --- a/src/dump.cpp +++ b/src/dump.cpp @@ -14,6 +14,7 @@ #include "dump.h" #include "atom.h" +#include "comm.h" #include "compute.h" #include "domain.h" #include "error.h" @@ -114,6 +115,7 @@ Dump::Dump(LAMMPS *lmp, int /*narg*/, char **arg) : size_one = 0; multiproc = 0; + nfile = nper = 1; nclusterprocs = nprocs; filewriter = 0; if (me == 0) filewriter = 1; @@ -899,6 +901,20 @@ void Dump::balance() memory->create(proc_offsets,nprocs+1,"dump:proc_offsets"); memory->create(proc_new_offsets,nprocs+1,"dump:proc_new_offsets"); + static int warn = 1; + if (warn && multiproc > 1 && comm->me == 0) { + if (nprocs % nfile) { + error->warning(FLERR,"Value of dump_modify 'nfile' keyword does not divide into total number" + " of processors evenly, dump file balancing may not work correcly"); + warn = 0; + } + if (nprocs % nper) { + error->warning(FLERR,"Value of dump_modify 'fileper' keyword does not divide into total number" + " of processors evenly, dump file balancing may not work correcly"); + warn = 0; + } + } + // compute atom offset for this proc bigint offset; @@ -1139,7 +1155,7 @@ void Dump::modify_params(int narg, char **arg) if (iarg+2 > narg) utils::missing_cmd_args(FLERR, "dump_modify fileper", error); if (!multiproc) error->all(FLERR, iarg, "Cannot use dump_modify fileper without % in dump file name"); - int nper = utils::inumeric(FLERR,arg[iarg+1],false,lmp); + nper = utils::inumeric(FLERR,arg[iarg+1],false,lmp); if (nper <= 0) error->all(FLERR, iarg + 1, "Invalid dump_modify fileper argument: {}", nper); multiproc = nprocs/nper; @@ -1233,7 +1249,7 @@ void Dump::modify_params(int narg, char **arg) if (iarg+2 > narg) utils::missing_cmd_args(FLERR, "dump_modify nfile", error); if (!multiproc) error->all(FLERR,"Cannot use dump_modify nfile without % in dump file name"); - int nfile = utils::inumeric(FLERR,arg[iarg+1],false,lmp); + nfile = utils::inumeric(FLERR,arg[iarg+1],false,lmp); if (nfile <= 0) error->all(FLERR, "Invalid dump_modify nfile argument: {}", nfile); nfile = MIN(nfile,nprocs); diff --git a/src/dump.h b/src/dump.h index c2fd45e2477..1ddc30d007b 100644 --- a/src/dump.h +++ b/src/dump.h @@ -92,6 +92,8 @@ class Dump : protected Pointers { int write_header_flag; // 1 if write header, 0 if not int has_id; // 1 if output contains Atom-IDs + int nfile, nper; + bigint delaystep; int refreshflag; // 1 if dump_modify refresh specified From c64d663fece592c172c13bb5e9d0c74a709b8c53 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 11 Jun 2026 20:06:56 -0400 Subject: [PATCH 005/100] add eam/he/omp pair style The embedding loop in PairEAMOMP::eval() now uses the shared embedding_index() helper and the two-sided linear extrapolation selected by he_flag, exactly as PairEAM::compute(). The new eam/he/omp style is a constructor-only subclass of PairEAMOMP. Verified: classic eam/alloy/fs -sf omp runs are byte-identical to before; eam/he/omp matches plain eam/he bitwise over 50 MD steps (2 threads, serial + 4 ranks, newton on/off) and in dedicated tests exercising the linear extrapolation above rhomax and below rhomin. Co-Authored-By: Claude Fable 5 --- src/OPENMP/pair_eam_he_omp.cpp | 29 ++++++++++++++++++++++++++++ src/OPENMP/pair_eam_he_omp.h | 35 ++++++++++++++++++++++++++++++++++ src/OPENMP/pair_eam_omp.cpp | 17 ++++++++--------- 3 files changed, 72 insertions(+), 9 deletions(-) create mode 100644 src/OPENMP/pair_eam_he_omp.cpp create mode 100644 src/OPENMP/pair_eam_he_omp.h diff --git a/src/OPENMP/pair_eam_he_omp.cpp b/src/OPENMP/pair_eam_he_omp.cpp new file mode 100644 index 00000000000..2c6b56f6eb8 --- /dev/null +++ b/src/OPENMP/pair_eam_he_omp.cpp @@ -0,0 +1,29 @@ +/* ---------------------------------------------------------------------- + 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: Xiaowng Zhou (Sandia) +------------------------------------------------------------------------- */ + +#include "pair_eam_he_omp.h" + +using namespace LAMMPS_NS; + +/* ---------------------------------------------------------------------- */ + +PairEAMHEOMP::PairEAMHEOMP(LAMMPS *lmp) : PairEAMOMP(lmp) +{ + fileformat = FS; + one_coeff = 1; + he_flag = 1; +} diff --git a/src/OPENMP/pair_eam_he_omp.h b/src/OPENMP/pair_eam_he_omp.h new file mode 100644 index 00000000000..f58fa724baa --- /dev/null +++ b/src/OPENMP/pair_eam_he_omp.h @@ -0,0 +1,35 @@ +/* -*- 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(eam/he/omp,PairEAMHEOMP); +// clang-format on +#else + +#ifndef LMP_PAIR_EAM_HE_OMP_H +#define LMP_PAIR_EAM_HE_OMP_H + +#include "pair_eam_omp.h" + +namespace LAMMPS_NS { + +class PairEAMHEOMP : public PairEAMOMP { + public: + PairEAMHEOMP(class LAMMPS *); +}; + +} // namespace LAMMPS_NS + +#endif +#endif diff --git a/src/OPENMP/pair_eam_omp.cpp b/src/OPENMP/pair_eam_omp.cpp index c530f383dfe..a7b8a3300a4 100644 --- a/src/OPENMP/pair_eam_omp.cpp +++ b/src/OPENMP/pair_eam_omp.cpp @@ -201,23 +201,22 @@ void PairEAMOMP::eval(int iifrom, int iito, int *beyond_rhomax, ThrData * const // fp = derivative of embedding energy at each atom // phi = embedding energy at each atom - // if rho > rhomax (e.g. due to close approach of two atoms), - // will exceed table, so add linear term to conserve energy + // if rho > rhomax (e.g. due to close approach of two atoms) the table is + // exceeded, so add linear term to conserve energy; for eam/he the table + // starts at rhomin and may be exceeded on either side for (ii = iifrom; ii < iito; ii++) { i = ilist[ii]; - p = rho[i]*rdrho + 1.0; - m = static_cast (p); - m = MAX(1,MIN(m,nrho-1)); - p -= m; - p = MIN(p,1.0); + embedding_index(rho[i],m,p); coeff = frho_spline[type2frho[type[i]]][m]; fp[i] = (coeff[0]*p + coeff[1])*p + coeff[2]; if (EFLAG) { phi = ((coeff[3]*p + coeff[4])*p + coeff[5])*p + coeff[6]; - if (rho[i] > rhomax) { + if (he_flag && (rho[i] < rhomin)) { + phi += fp[i] * (rho[i]-rhomin); + } else if (rho[i] > rhomax) { phi += fp[i] * (rho[i]-rhomax); - *beyond_rhomax = 1; + if (!he_flag) *beyond_rhomax = 1; } e_tally_thr(this, i, i, nlocal, NEWTON_PAIR, scale[type[i]][type[i]]*phi, 0.0, thr); } From b3e3b2f1a49694bdc9f9c0ec55e0628d3a027c39 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 11 Jun 2026 20:06:57 -0400 Subject: [PATCH 006/100] add eam/he/kk pair style The three embedding sites in PairEAMKokkos (KernelB, fused KernelAB, and the HIP team variant) now use a device-side embedding_index_kk() helper that mirrors PairEAM::embedding_index(), with a new rhomin_kk member and the two-sided extrapolation selected by he_flag. The runtime branch is uniform across threads and free on GPUs. The new eam/he/kk style is a constructor-only template subclass. Verified: classic eam/alloy/fs -sf kk runs are byte-identical to before (serial backend); eam/he/kk matches plain eam/he bitwise over 50 MD steps and in extrapolation tests above rhomax / below rhomin. Co-Authored-By: Claude Fable 5 --- src/KOKKOS/Install.sh | 2 ++ src/KOKKOS/pair_eam_he_kokkos.cpp | 37 +++++++++++++++++++++ src/KOKKOS/pair_eam_he_kokkos.h | 37 +++++++++++++++++++++ src/KOKKOS/pair_eam_kokkos.cpp | 53 ++++++++++++++++--------------- src/KOKKOS/pair_eam_kokkos.h | 24 ++++++++++++++ 5 files changed, 127 insertions(+), 26 deletions(-) create mode 100644 src/KOKKOS/pair_eam_he_kokkos.cpp create mode 100644 src/KOKKOS/pair_eam_he_kokkos.h diff --git a/src/KOKKOS/Install.sh b/src/KOKKOS/Install.sh index 4e1429da7d7..465c1480ccf 100755 --- a/src/KOKKOS/Install.sh +++ b/src/KOKKOS/Install.sh @@ -408,6 +408,8 @@ action pair_eam_alloy_kokkos.cpp pair_eam_alloy.cpp action pair_eam_alloy_kokkos.h pair_eam_alloy.h action pair_eam_fs_kokkos.cpp pair_eam_fs.cpp action pair_eam_fs_kokkos.h pair_eam_fs.h +action pair_eam_he_kokkos.cpp pair_eam_he.cpp +action pair_eam_he_kokkos.h pair_eam_he.h action pair_eam_kokkos.cpp pair_eam.cpp action pair_eam_kokkos.h pair_eam.h action pair_exp6_rx_kokkos.cpp pair_exp6_rx.cpp diff --git a/src/KOKKOS/pair_eam_he_kokkos.cpp b/src/KOKKOS/pair_eam_he_kokkos.cpp new file mode 100644 index 00000000000..ce3f022d3d0 --- /dev/null +++ b/src/KOKKOS/pair_eam_he_kokkos.cpp @@ -0,0 +1,37 @@ +/* ---------------------------------------------------------------------- + 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: Xiaowng Zhou (Sandia) +------------------------------------------------------------------------- */ + +#include "pair_eam_he_kokkos.h" + +using namespace LAMMPS_NS; + +/* ---------------------------------------------------------------------- */ + +template +PairEAMHEKokkos::PairEAMHEKokkos(LAMMPS *lmp) : PairEAMKokkos(lmp) +{ + this->fileformat = PairEAM::FS; + this->one_coeff = 1; + this->he_flag = 1; +} + +namespace LAMMPS_NS { +template class PairEAMHEKokkos; +#ifdef LMP_KOKKOS_GPU +template class PairEAMHEKokkos; +#endif +} // namespace LAMMPS_NS diff --git a/src/KOKKOS/pair_eam_he_kokkos.h b/src/KOKKOS/pair_eam_he_kokkos.h new file mode 100644 index 00000000000..75ad52b04d0 --- /dev/null +++ b/src/KOKKOS/pair_eam_he_kokkos.h @@ -0,0 +1,37 @@ +/* -*- 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(eam/he/kk,PairEAMHEKokkos); +PairStyle(eam/he/kk/device,PairEAMHEKokkos); +PairStyle(eam/he/kk/host,PairEAMHEKokkos); +// clang-format on +#else + +#ifndef LMP_PAIR_EAM_HE_KOKKOS_H +#define LMP_PAIR_EAM_HE_KOKKOS_H + +#include "pair_eam_kokkos.h" + +namespace LAMMPS_NS { + +template class PairEAMHEKokkos : public PairEAMKokkos { + public: + PairEAMHEKokkos(class LAMMPS *); +}; + +} // namespace LAMMPS_NS + +#endif +#endif diff --git a/src/KOKKOS/pair_eam_kokkos.cpp b/src/KOKKOS/pair_eam_kokkos.cpp index f7f80d8cd9a..fc20a880c50 100644 --- a/src/KOKKOS/pair_eam_kokkos.cpp +++ b/src/KOKKOS/pair_eam_kokkos.cpp @@ -134,6 +134,7 @@ void PairEAMKokkos::compute(int eflag_in, int vflag_in) } rhomax_kk = static_cast(rhomax); + rhomin_kk = static_cast(rhomin); copymode = 1; // zero out density @@ -628,23 +629,23 @@ void PairEAMKokkos::operator()(TagPairEAMKernelB, const int & // fp = derivative of embedding energy at each atom // phi = embedding energy at each atom - // if rho > rhomax (e.g. due to close approach of two atoms), - // will exceed table, so add linear term to conserve energy + // if rho > rhomax (e.g. due to close approach of two atoms) the table is + // exceeded, so add linear term to conserve energy; for eam/he the table + // starts at rhomin and may be exceeded on either side const int i = d_ilist[ii]; const int itype = type(i); - KK_FLOAT p = d_rho[i]*rdrho_kk + static_cast(1.0); - int m = static_cast (p); - m = MAX(1,MIN(m,nrho-1)); - p -= static_cast(m); - p = MIN(p,static_cast(1.0)); + KK_FLOAT p; + int m; + embedding_index_kk(d_rho[i],m,p); const int d_type2frho_i = d_type2frho[itype]; d_fp[i] = (d_frho_spline(d_type2frho_i,m,0)*p + d_frho_spline(d_type2frho_i,m,1))*p + d_frho_spline(d_type2frho_i,m,2); if (EFLAG) { KK_FLOAT phi = ((d_frho_spline(d_type2frho_i,m,3)*p + d_frho_spline(d_type2frho_i,m,4))*p + d_frho_spline(d_type2frho_i,m,5))*p + d_frho_spline(d_type2frho_i,m,6); - if (d_rho[i] > rhomax_kk) phi += d_fp[i] * (d_rho[i]-rhomax_kk); + if (he_flag && (d_rho[i] < rhomin_kk)) phi += d_fp[i] * (d_rho[i]-rhomin_kk); + else if (d_rho[i] > rhomax_kk) phi += d_fp[i] * (d_rho[i]-rhomax_kk); if (eflag_global) ev.evdwl += static_cast(phi); if (eflag_atom) d_eatom[i] += static_cast(phi); } @@ -707,20 +708,20 @@ void PairEAMKokkos::operator()(TagPairEAMKernelAB, const int // fp = derivative of embedding energy at each atom // phi = embedding energy at each atom - // if rho > rhomax (e.g. due to close approach of two atoms), - // will exceed table, so add linear term to conserve energy - - KK_FLOAT p = d_rho[i]*rdrho_kk + static_cast(1.0); - int m = static_cast (p); - m = MAX(1,MIN(m,nrho-1)); - p -= static_cast(m); - p = MIN(p,static_cast(1.0)); + // if rho > rhomax (e.g. due to close approach of two atoms) the table is + // exceeded, so add linear term to conserve energy; for eam/he the table + // starts at rhomin and may be exceeded on either side + + KK_FLOAT p; + int m; + embedding_index_kk(d_rho[i],m,p); const int d_type2frho_i = d_type2frho[itype]; d_fp[i] = (d_frho_spline(d_type2frho_i,m,0)*p + d_frho_spline(d_type2frho_i,m,1))*p + d_frho_spline(d_type2frho_i,m,2); if (EFLAG) { KK_FLOAT phi = ((d_frho_spline(d_type2frho_i,m,3)*p + d_frho_spline(d_type2frho_i,m,4))*p + d_frho_spline(d_type2frho_i,m,5))*p + d_frho_spline(d_type2frho_i,m,6); - if (d_rho[i] > rhomax_kk) phi += d_fp[i] * (d_rho[i]-rhomax_kk); + if (he_flag && (d_rho[i] < rhomin_kk)) phi += d_fp[i] * (d_rho[i]-rhomin_kk); + else if (d_rho[i] > rhomax_kk) phi += d_fp[i] * (d_rho[i]-rhomax_kk); if (eflag_global) ev.evdwl += static_cast(phi); if (eflag_atom) d_eatom[i] += static_cast(phi); } @@ -916,20 +917,20 @@ void PairEAMKokkos::operator()(TagPairEAMKernelAB, // fp = derivative of embedding energy at each atom // phi = embedding energy at each atom - // if rho > rhomax (e.g. due to close approach of two atoms), - // will exceed table, so add linear term to conserve energy - - KK_FLOAT p = d_rho[i]*rdrho_kk + static_cast(1.0); - int m = static_cast (p); - m = MAX(1,MIN(m,nrho-1)); - p -= static_cast(m); - p = MIN(p,static_cast(1.0)); + // if rho > rhomax (e.g. due to close approach of two atoms) the table is + // exceeded, so add linear term to conserve energy; for eam/he the table + // starts at rhomin and may be exceeded on either side + + KK_FLOAT p; + int m; + embedding_index_kk(d_rho[i],m,p); const int d_type2frho_i = d_type2frho[itype]; d_fp[i] = (d_frho_spline(d_type2frho_i,m,0)*p + d_frho_spline(d_type2frho_i,m,1))*p + d_frho_spline(d_type2frho_i,m,2); if (EFLAG) { KK_FLOAT phi = ((d_frho_spline(d_type2frho_i,m,3)*p + d_frho_spline(d_type2frho_i,m,4))*p + d_frho_spline(d_type2frho_i,m,5))*p + d_frho_spline(d_type2frho_i,m,6); - if (d_rho[i] > rhomax_kk) phi += d_fp[i] * (d_rho[i]-rhomax_kk); + if (he_flag && (d_rho[i] < rhomin_kk)) phi += d_fp[i] * (d_rho[i]-rhomin_kk); + else if (d_rho[i] > rhomax_kk) phi += d_fp[i] * (d_rho[i]-rhomax_kk); if (eflag_global) ev.evdwl += static_cast(phi); if (eflag_atom) d_eatom[i] += static_cast(phi); } diff --git a/src/KOKKOS/pair_eam_kokkos.h b/src/KOKKOS/pair_eam_kokkos.h index c13ab514a09..a7ffcc594a1 100644 --- a/src/KOKKOS/pair_eam_kokkos.h +++ b/src/KOKKOS/pair_eam_kokkos.h @@ -202,8 +202,32 @@ class PairEAMKokkos : public PairEAM, public KokkosBase { typename AT::t_int_1d d_numneigh; KK_FLOAT rhomax_kk; + KK_FLOAT rhomin_kk; KK_FLOAT rdr_kk; KK_FLOAT rdrho_kk; + + // embedding spline table index m and fractional offset p for density rho_i + // mirrors PairEAM::embedding_index(): classic tables start at 0 and clamp + // at the table ends; eam/he tables start at rhomin and allow extrapolation + // past both ends + + KOKKOS_INLINE_FUNCTION + void embedding_index_kk(const KK_FLOAT rho_i, int &m, KK_FLOAT &p) const + { + if (he_flag) { + p = (rho_i - rhomin_kk)*rdrho_kk + static_cast(1.0); + m = static_cast(p); + m = MAX(2,MIN(m,nrho-1)); + p -= static_cast(m); + p = MAX(static_cast(-1.0),MIN(p,static_cast(1.0))); + } else { + p = rho_i*rdrho_kk + static_cast(1.0); + m = static_cast(p); + m = MAX(1,MIN(m,nrho-1)); + p -= static_cast(m); + p = MIN(p,static_cast(1.0)); + } + } KK_FLOAT cutforcesq_kk; int first; typename AT::t_int_1d d_sendlist; From 4778037be04c1c2077ed11c75c8ecb0a871e7376 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 11 Jun 2026 20:06:57 -0400 Subject: [PATCH 007/100] add eam/he/gpu pair style The gpu library EAM class gains rhomin and he_flag parameters, passed through to the embedding kernels; the store_energy_fp macro (both the shuffle and local-memory variants used by k_energy/k_energy_fast) implements the eam/he table indexing and two-sided extrapolation behind a uniform runtime branch. A new per-style device instance (lal_eam_he_ext.cpp) backs the new eam/he/gpu style, which is a constructor-only subclass of PairEAMGPU binding that instance. Verified (OpenCL backend): classic eam/alloy/fs -sf gpu runs are byte-identical to before; eam/he/gpu matches plain eam/he to mixed- precision accuracy (max 4e-5 relative over 50 MD steps, same scale as eam/gpu vs eam) including the extrapolation regimes above rhomax and below rhomin; the eam_he yaml test passes its gpu sub-test. Co-Authored-By: Claude Fable 5 --- lib/gpu/lal_eam.cpp | 12 ++- lib/gpu/lal_eam.cu | 60 ++++++++++---- lib/gpu/lal_eam.h | 6 +- lib/gpu/lal_eam_alloy_ext.cpp | 7 +- lib/gpu/lal_eam_ext.cpp | 7 +- lib/gpu/lal_eam_fs_ext.cpp | 7 +- lib/gpu/lal_eam_he_ext.cpp | 144 +++++++++++++++++++++++++++++++++ src/GPU/Install.sh | 2 + src/GPU/pair_eam_alloy_gpu.cpp | 3 +- src/GPU/pair_eam_fs_gpu.cpp | 3 +- src/GPU/pair_eam_gpu.cpp | 10 ++- src/GPU/pair_eam_gpu.h | 6 +- src/GPU/pair_eam_he_gpu.cpp | 61 ++++++++++++++ src/GPU/pair_eam_he_gpu.h | 35 ++++++++ 14 files changed, 322 insertions(+), 41 deletions(-) create mode 100644 lib/gpu/lal_eam_he_ext.cpp create mode 100644 src/GPU/pair_eam_he_gpu.cpp create mode 100644 src/GPU/pair_eam_he_gpu.h diff --git a/lib/gpu/lal_eam.cpp b/lib/gpu/lal_eam.cpp index 6ca681e6ded..bda8d4e7059 100644 --- a/lib/gpu/lal_eam.cpp +++ b/lib/gpu/lal_eam.cpp @@ -47,7 +47,8 @@ int EAMT::init(const int ntypes, double host_cutforcesq, int **host_type2rhor, int **host_type2z2r, int *host_type2frho, double ***host_rhor_spline, double ***host_z2r_spline, double ***host_frho_spline, double** host_cutsq, double rdr, double rdrho, - double rhomax, int nrhor, int nrho, int nz2r, int nfrho, int nr, + double rhomax, double rhomin, const int he_flag, + int nrhor, int nrho, int nz2r, int nfrho, int nr, const int nlocal, const int nall, const int max_nbors, const int maxspecial, const double cell_size, const double gpu_split, FILE *_screen) @@ -119,6 +120,8 @@ int EAMT::init(const int ntypes, double host_cutforcesq, int **host_type2rhor, _rdr=rdr; _rdrho = rdrho; _rhomax=rhomax; + _rhomin=rhomin; + _he_flag=he_flag; _nrhor=nrhor; _nrho=nrho; _nz2r=nz2r; @@ -511,15 +514,16 @@ int EAMT::loop(const int eflag, const int vflag) { &this->nbor->dev_nbor, &this->_nbor_data->begin(), &_fp, &this->ans->engv, &eflag, &ainum, &nbor_pitch, &_ntypes, &_cutforcesq, &_rdr, &_rdrho, - &_rhomax, &_nrho, &_nr, &this->_threads_per_atom); + &_rhomax, &_rhomin, &_he_flag, &_nrho, &_nr, + &this->_threads_per_atom); } else { this->k_energy.set_size(GX,BX); this->k_energy.run(&this->atom->x, &type2rhor_z2r, &type2frho, &rhor_spline2, &frho_spline1, &frho_spline2, &cutsq, &this->nbor->dev_nbor, &this->_nbor_data->begin(), &_fp, &this->ans->engv,&eflag, &ainum, &nbor_pitch, - &_ntypes, &_cutforcesq, &_rdr, &_rdrho, &_rhomax, &_nrho, - &_nr, &this->_threads_per_atom); + &_ntypes, &_cutforcesq, &_rdr, &_rdrho, &_rhomax, &_rhomin, + &_he_flag, &_nrho, &_nr, &this->_threads_per_atom); } this->time_pair.stop(); diff --git a/lib/gpu/lal_eam.cu b/lib/gpu/lal_eam.cu index 8c7a410379b..7f5b607a0e8 100644 --- a/lib/gpu/lal_eam.cu +++ b/lib/gpu/lal_eam.cu @@ -68,7 +68,8 @@ _texture( z2r_sp2_tex,int4); __local acctyp red_acc[BLOCK_PAIR]; #define store_energy_fp(rho,energy,ii,inum,tid,t_per_atom,offset, \ - eflag,vflag,engv,rdrho,nrho,i,rhomax,tfrho) \ + eflag,vflag,engv,rdrho,nrho,i,rhomax,rhomin, \ + he_flag,tfrho) \ if (t_per_atom>1) { \ red_acc[tid]=rho; \ for (unsigned int s=t_per_atom/2; s>0; s>>=1) { \ @@ -79,11 +80,21 @@ _texture( z2r_sp2_tex,int4); rho=red_acc[tid]; \ } \ if (offset==0 && ii rhomax) energy += fp*(rho-rhomax); \ + if (he_flag && rho < rhomin) energy += fp*(rho-rhomin); \ + else if (rho > rhomax) energy += fp*(rho-rhomax); \ engv[ii]=energy; \ } \ } @@ -152,17 +164,28 @@ _texture( z2r_sp2_tex,int4); #define local_allocate_store_energy_fp() #define store_energy_fp(rho,energy,ii,inum,tid,t_per_atom,offset, \ - eflag,vflag,engv,rdrho,nrho,i,rhomax,tfrho) \ + eflag,vflag,engv,rdrho,nrho,i,rhomax,rhomin, \ + he_flag,tfrho) \ if (t_per_atom>1) { \ for (unsigned int s=t_per_atom/2; s>0; s>>=1) \ rho += shfl_down(rho, s, t_per_atom); \ } \ if (offset==0 && ii rhomax) energy += fp*(rho-rhomax); \ + if (he_flag && rho < rhomin) energy += fp*(rho-rhomin); \ + else if (rho > rhomax) energy += fp*(rho-rhomax); \ engv[ii]=energy; \ } \ } @@ -224,7 +248,8 @@ __kernel void k_energy(const __global numtyp4 *restrict x_, const int eflag, const int inum, const int nbor_pitch, const int ntypes, const numtyp cutforcesq, const numtyp rdr, const numtyp rdrho, - const numtyp rhomax, const int nrho, + const numtyp rhomax, const numtyp rhomin, + const int he_flag, const int nrho, const int nr, const int t_per_atom) { int tid, ii, offset, i, itype, tfrho; atom_info(t_per_atom,ii,tid,offset); @@ -275,7 +300,7 @@ __kernel void k_energy(const __global numtyp4 *restrict x_, } // for nbor } // if ii store_energy_fp(rho,energy,ii,inum,tid,t_per_atom,offset, - eflag,vflag,engv,rdrho,nrho,i,rhomax,tfrho); + eflag,vflag,engv,rdrho,nrho,i,rhomax,rhomin,he_flag,tfrho); } __kernel void k_energy_fast(const __global numtyp4 *restrict x_, @@ -293,6 +318,7 @@ __kernel void k_energy_fast(const __global numtyp4 *restrict x_, const int nbor_pitch, const int ntypes, const numtyp cutforcesq, const numtyp rdr, const numtyp rdrho, const numtyp rhomax, + const numtyp rhomin, const int he_flag, const int nrho, const int nr, const int t_per_atom) { int tid, ii, offset, i, itype, tfrho; @@ -366,7 +392,7 @@ __kernel void k_energy_fast(const __global numtyp4 *restrict x_, } // for nbor } // if ii store_energy_fp(rho,energy,ii,inum,tid,t_per_atom,offset, - eflag,vflag,engv,rdrho,nrho,i,rhomax,tfrho); + eflag,vflag,engv,rdrho,nrho,i,rhomax,rhomin,he_flag,tfrho); } __kernel void k_eam(const __global numtyp4 *restrict x_, diff --git a/lib/gpu/lal_eam.h b/lib/gpu/lal_eam.h index a70f3c69e1c..c5c0d1223b1 100644 --- a/lib/gpu/lal_eam.h +++ b/lib/gpu/lal_eam.h @@ -41,7 +41,8 @@ class EAM : public BaseAtomic { int init(const int ntypes, double host_cutforcesq, int **host_type2rhor, int **host_type2z2r, int *host_type2frho, double ***host_rhor_spline, double ***host_z2r_spline, double ***host_frho_spline, double** host_cutsq, - double rdr, double rdrho, double rhomax, int nrhor, int nrho, int nz2r, + double rdr, double rdrho, double rhomax, double rhomin, + const int he_flag, int nrhor, int nrho, int nz2r, int nfrho, int nr, const int nlocal, const int nall, const int max_nbors, const int maxspecial, const double cell_size, const double gpu_split, FILE *_screen); @@ -111,7 +112,8 @@ class EAM : public BaseAtomic { UCL_D_Vec cutsq; - numtyp _cutforcesq,_rdr,_rdrho, _rhomax; + numtyp _cutforcesq,_rdr,_rdrho, _rhomax, _rhomin; + int _he_flag; int _nfrho,_nrhor,_nrho,_nz2r,_nr; diff --git a/lib/gpu/lal_eam_alloy_ext.cpp b/lib/gpu/lal_eam_alloy_ext.cpp index 84c56fc3add..8430cd0b122 100644 --- a/lib/gpu/lal_eam_alloy_ext.cpp +++ b/lib/gpu/lal_eam_alloy_ext.cpp @@ -31,7 +31,8 @@ int eam_alloy_gpu_init(const int ntypes, double host_cutforcesq, int **host_type2rhor, int **host_type2z2r, int *host_type2frho, double ***host_rhor_spline, double ***host_z2r_spline, double ***host_frho_spline, double** host_cutsq, - double rdr, double rdrho, double rhomax, int nrhor, + double rdr, double rdrho, double rhomax, double rhomin, + const int he_flag, int nrhor, int nrho, int nz2r, int nfrho, int nr, const int nlocal, const int nall, const int max_nbors, const int maxspecial, const double cell_size, @@ -66,7 +67,7 @@ int eam_alloy_gpu_init(const int ntypes, double host_cutforcesq, if (world_me==0) init_ok=EAMALMF.init(ntypes, host_cutforcesq, host_type2rhor, host_type2z2r, host_type2frho, host_rhor_spline, host_z2r_spline, - host_frho_spline, host_cutsq, rdr, rdrho, rhomax, nrhor, nrho, nz2r, + host_frho_spline, host_cutsq, rdr, rdrho, rhomax, rhomin, he_flag, nrhor, nrho, nz2r, nfrho, nr, nlocal, nall, max_nbors, maxspecial, cell_size, gpu_split, screen); @@ -86,7 +87,7 @@ int eam_alloy_gpu_init(const int ntypes, double host_cutforcesq, if (gpu_rank==i && world_me!=0) init_ok=EAMALMF.init(ntypes, host_cutforcesq, host_type2rhor, host_type2z2r, host_type2frho, host_rhor_spline, host_z2r_spline, - host_frho_spline, host_cutsq, rdr, rdrho, rhomax, nrhor, nrho, + host_frho_spline, host_cutsq, rdr, rdrho, rhomax, rhomin, he_flag, nrhor, nrho, nz2r, nfrho, nr, nlocal, nall, max_nbors, maxspecial, cell_size, gpu_split, screen); diff --git a/lib/gpu/lal_eam_ext.cpp b/lib/gpu/lal_eam_ext.cpp index f0f8f481ce5..cf7019e1a88 100644 --- a/lib/gpu/lal_eam_ext.cpp +++ b/lib/gpu/lal_eam_ext.cpp @@ -31,7 +31,8 @@ int eam_gpu_init(const int ntypes, double host_cutforcesq, int **host_type2rhor, int **host_type2z2r, int *host_type2frho, double ***host_rhor_spline, double ***host_z2r_spline, double ***host_frho_spline, double** host_cutsq, - double rdr, double rdrho, double rhomax, int nrhor, + double rdr, double rdrho, double rhomax, double rhomin, + const int he_flag, int nrhor, int nrho, int nz2r, int nfrho, int nr, const int nlocal, const int nall, const int max_nbors, const int maxspecial, const double cell_size, @@ -66,7 +67,7 @@ int eam_gpu_init(const int ntypes, double host_cutforcesq, if (world_me==0) init_ok=EAMMF.init(ntypes, host_cutforcesq, host_type2rhor, host_type2z2r, host_type2frho, host_rhor_spline, host_z2r_spline, - host_frho_spline, host_cutsq, rdr, rdrho, rhomax, nrhor, nrho, nz2r, + host_frho_spline, host_cutsq, rdr, rdrho, rhomax, rhomin, he_flag, nrhor, nrho, nz2r, nfrho, nr, nlocal, nall, max_nbors, maxspecial, cell_size, gpu_split, screen); @@ -86,7 +87,7 @@ int eam_gpu_init(const int ntypes, double host_cutforcesq, if (gpu_rank==i && world_me!=0) init_ok=EAMMF.init(ntypes, host_cutforcesq, host_type2rhor, host_type2z2r, host_type2frho, host_rhor_spline, host_z2r_spline, - host_frho_spline, host_cutsq, rdr, rdrho, rhomax, nrhor, nrho, + host_frho_spline, host_cutsq, rdr, rdrho, rhomax, rhomin, he_flag, nrhor, nrho, nz2r, nfrho, nr, nlocal, nall, max_nbors, maxspecial, cell_size, gpu_split, screen); diff --git a/lib/gpu/lal_eam_fs_ext.cpp b/lib/gpu/lal_eam_fs_ext.cpp index 07a4471f8d6..65ba9de9d19 100644 --- a/lib/gpu/lal_eam_fs_ext.cpp +++ b/lib/gpu/lal_eam_fs_ext.cpp @@ -31,7 +31,8 @@ int eam_fs_gpu_init(const int ntypes, double host_cutforcesq, int **host_type2rhor, int **host_type2z2r, int *host_type2frho, double ***host_rhor_spline, double ***host_z2r_spline, double ***host_frho_spline, double** host_cutsq, - double rdr, double rdrho, double rhomax, int nrhor, + double rdr, double rdrho, double rhomax, double rhomin, + const int he_flag, int nrhor, int nrho, int nz2r, int nfrho, int nr, const int nlocal, const int nall, const int max_nbors, const int maxspecial, const double cell_size, @@ -66,7 +67,7 @@ int eam_fs_gpu_init(const int ntypes, double host_cutforcesq, if (world_me==0) init_ok=EAMFSMF.init(ntypes, host_cutforcesq, host_type2rhor, host_type2z2r, host_type2frho, host_rhor_spline, host_z2r_spline, - host_frho_spline, host_cutsq, rdr, rdrho, rhomax, nrhor, nrho, nz2r, + host_frho_spline, host_cutsq, rdr, rdrho, rhomax, rhomin, he_flag, nrhor, nrho, nz2r, nfrho, nr, nlocal, nall, max_nbors, maxspecial, cell_size, gpu_split, screen); @@ -86,7 +87,7 @@ int eam_fs_gpu_init(const int ntypes, double host_cutforcesq, if (gpu_rank==i && world_me!=0) init_ok=EAMFSMF.init(ntypes, host_cutforcesq, host_type2rhor, host_type2z2r, host_type2frho, host_rhor_spline, host_z2r_spline, - host_frho_spline, host_cutsq, rdr, rdrho, rhomax, nrhor, nrho, + host_frho_spline, host_cutsq, rdr, rdrho, rhomax, rhomin, he_flag, nrhor, nrho, nz2r, nfrho, nr, nlocal, nall, max_nbors, maxspecial, cell_size, gpu_split, screen); diff --git a/lib/gpu/lal_eam_he_ext.cpp b/lib/gpu/lal_eam_he_ext.cpp new file mode 100644 index 00000000000..8cea4612bc6 --- /dev/null +++ b/lib/gpu/lal_eam_he_ext.cpp @@ -0,0 +1,144 @@ +/*************************************************************************** + eam_he_ext.cpp + ------------------- + Trung Dac Nguyen, W. Michael Brown (ORNL) + + Functions for LAMMPS access to buck acceleration routines. + + __________________________________________________________________________ + This file is part of the LAMMPS Accelerator Library (LAMMPS_AL) + __________________________________________________________________________ + + begin : + email : brownw@ornl.gov nguyentd@ornl.gov + ***************************************************************************/ + +#include +#include +#include + +#include "lal_eam.h" + +using namespace std; +using namespace LAMMPS_AL; + +static EAM EAMHEMF; + +// --------------------------------------------------------------------------- +// Allocate memory on host and device and copy constants to device +// --------------------------------------------------------------------------- +int eam_he_gpu_init(const int ntypes, double host_cutforcesq, + int **host_type2rhor, int **host_type2z2r, int *host_type2frho, + double ***host_rhor_spline, double ***host_z2r_spline, + double ***host_frho_spline, double** host_cutsq, + double rdr, double rdrho, double rhomax, double rhomin, + const int he_flag, int nrhor, + int nrho, int nz2r, int nfrho, int nr, + const int nlocal, const int nall, const int max_nbors, + const int maxspecial, const double cell_size, + int &gpu_mode, FILE *screen, int &fp_size) { + EAMHEMF.clear(); + gpu_mode=EAMHEMF.device->gpu_mode(); + double gpu_split=EAMHEMF.device->particle_split(); + int first_gpu=EAMHEMF.device->first_device(); + int last_gpu=EAMHEMF.device->last_device(); + int world_me=EAMHEMF.device->world_me(); + int gpu_rank=EAMHEMF.device->gpu_rank(); + int procs_per_gpu=EAMHEMF.device->procs_per_gpu(); + + // disable host/device split for now + if (gpu_split != 1.0) + return -8; + + fp_size=sizeof(PRECISION); + + EAMHEMF.device->init_message(screen,"eam/he",first_gpu,last_gpu); + + bool message=false; + if (EAMHEMF.device->replica_me()==0 && screen) + message=true; + + if (message) { + fprintf(screen,"Initializing Device and compiling on process 0..."); + fflush(screen); + } + + int init_ok=0; + if (world_me==0) + init_ok=EAMHEMF.init(ntypes, host_cutforcesq, host_type2rhor, host_type2z2r, + host_type2frho, host_rhor_spline, host_z2r_spline, + host_frho_spline, host_cutsq, rdr, rdrho, rhomax, rhomin, he_flag, nrhor, nrho, nz2r, + nfrho, nr, nlocal, nall, max_nbors, maxspecial, cell_size, + gpu_split, screen); + + EAMHEMF.device->world_barrier(); + if (message) + fprintf(screen,"Done.\n"); + + for (int i=0; iserialize_init(); + if (message) + fprintf(screen,"Done.\n"); + } + if (message) + fprintf(screen,"\n"); + + if (init_ok==0) + EAMHEMF.estimate_gpu_overhead(); + return init_ok; +} + +void eam_he_gpu_clear() { + EAMHEMF.clear(); +} + +int ** eam_he_gpu_compute_n(const int ago, const int inum_full, + const int nall, double **host_x, int *host_type, + double *sublo, double *subhi, tagint *tag, int **nspecial, + tagint **special, const bool eflag, const bool vflag, + const bool eatom, const bool vatom, int &host_start, + int **ilist, int **jnum, const double cpu_time, + bool &success, int &inum, void **fp_ptr, double *prd, int *periodicity) { + return EAMHEMF.compute(ago, inum_full, nall, host_x, host_type, sublo, + subhi, tag, nspecial, special, eflag, vflag, eatom, + vatom, host_start, ilist, jnum, cpu_time, success, + inum, fp_ptr, prd, periodicity); +} + +void eam_he_gpu_compute(const int ago, const int inum_full, const int nlocal, + const int nall, double **host_x, int *host_type, + int *ilist, int *numj, int **firstneigh, const bool eflag, + const bool vflag, const bool eatom, const bool vatom, + int &host_start, const double cpu_time, bool &success, + void **fp_ptr) { + EAMHEMF.compute(ago,inum_full,nlocal,nall,host_x,host_type,ilist,numj, + firstneigh,eflag,vflag,eatom,vatom,host_start,cpu_time,success, + fp_ptr); +} + +void eam_he_gpu_compute_force(int *ilist, const bool eflag, const bool vflag, + const bool eatom, const bool vatom) { + EAMHEMF.compute2(ilist, eflag, vflag, eatom, vatom); +} + + +double eam_he_gpu_bytes() { + return EAMHEMF.host_memory_usage(); +} + + diff --git a/src/GPU/Install.sh b/src/GPU/Install.sh index c40361babc5..0eb6ea0c614 100755 --- a/src/GPU/Install.sh +++ b/src/GPU/Install.sh @@ -74,6 +74,8 @@ action pair_eam_alloy_gpu.cpp pair_eam.cpp action pair_eam_alloy_gpu.h pair_eam.cpp action pair_eam_fs_gpu.cpp pair_eam.cpp action pair_eam_fs_gpu.h pair_eam.cpp +action pair_eam_he_gpu.cpp pair_eam_he.cpp +action pair_eam_he_gpu.h pair_eam_he.cpp action pair_eam_gpu.cpp pair_eam.cpp action pair_eam_gpu.h pair_eam.cpp action pair_gauss_gpu.cpp pair_gauss.cpp diff --git a/src/GPU/pair_eam_alloy_gpu.cpp b/src/GPU/pair_eam_alloy_gpu.cpp index b6817df7f06..92730c359fd 100644 --- a/src/GPU/pair_eam_alloy_gpu.cpp +++ b/src/GPU/pair_eam_alloy_gpu.cpp @@ -24,7 +24,8 @@ using namespace LAMMPS_NS; int eam_alloy_gpu_init(const int ntypes, double host_cutforcesq, int **host_type2rhor, int **host_type2z2r, int *host_type2frho, double ***host_rhor_spline, double ***host_z2r_spline, double ***host_frho_spline, double **host_cutsq, - double rdr, double rdrho, double rhomax, int nrhor, int nrho, int nz2r, + double rdr, double rdrho, double rhomax, double rhomin, + const int he_flag, int nrhor, int nrho, int nz2r, int nfrho, int nr, const int nlocal, const int nall, const int max_nbors, const int maxspecial, const double cell_size, int &gpu_mode, FILE *screen, int &fp_size); diff --git a/src/GPU/pair_eam_fs_gpu.cpp b/src/GPU/pair_eam_fs_gpu.cpp index 876409257cf..f6a3b57a647 100644 --- a/src/GPU/pair_eam_fs_gpu.cpp +++ b/src/GPU/pair_eam_fs_gpu.cpp @@ -24,7 +24,8 @@ using namespace LAMMPS_NS; int eam_fs_gpu_init(const int ntypes, double host_cutforcesq, int **host_type2rhor, int **host_type2z2r, int *host_type2frho, double ***host_rhor_spline, double ***host_z2r_spline, double ***host_frho_spline, double **host_cutsq, - double rdr, double rdrho, double rhomax, int nrhor, int nrho, int nz2r, + double rdr, double rdrho, double rhomax, double rhomin, + const int he_flag, int nrhor, int nrho, int nz2r, int nfrho, int nr, const int nlocal, const int nall, const int max_nbors, const int maxspecial, const double cell_size, int &gpu_mode, FILE *screen, int &fp_size); diff --git a/src/GPU/pair_eam_gpu.cpp b/src/GPU/pair_eam_gpu.cpp index 37620c9a1e9..dbd179d4d42 100644 --- a/src/GPU/pair_eam_gpu.cpp +++ b/src/GPU/pair_eam_gpu.cpp @@ -35,7 +35,8 @@ using namespace LAMMPS_NS; int eam_gpu_init(const int ntypes, double host_cutforcesq, int **host_type2rhor, int **host_type2z2r, int *host_type2frho, double ***host_rhor_spline, double ***host_z2r_spline, double ***host_frho_spline, double **host_cutsq, - double rdr, double rdrho, double rhomax, int nrhor, int nrho, int nz2r, int nfrho, + double rdr, double rdrho, double rhomax, double rhomin, const int he_flag, + int nrhor, int nrho, int nz2r, int nfrho, int nr, const int nlocal, const int nall, const int max_nbors, const int maxspecial, const double cell_size, int &gpu_mode, FILE *screen, int &fp_size); @@ -178,9 +179,10 @@ void PairEAMGPU::init_style() int fp_size; int mnf = 5e-2 * neighbor->oneatom; int success = gpu_init_fn(atom->ntypes + 1, cutforcesq, type2rhor, type2z2r, type2frho, - rhor_spline, z2r_spline, frho_spline, cutsq, rdr, rdrho, rhomax, nrhor, - nrho, nz2r, nfrho, nr, atom->nlocal, atom->nlocal + atom->nghost, mnf, - maxspecial, cell_size, gpu_mode, screen, fp_size); + rhor_spline, z2r_spline, frho_spline, cutsq, rdr, rdrho, rhomax, rhomin, + he_flag, nrhor, nrho, nz2r, nfrho, nr, atom->nlocal, + atom->nlocal + atom->nghost, mnf, maxspecial, cell_size, gpu_mode, + screen, fp_size); GPU_EXTRA::check_flag(success, error, world); if (gpu_mode == GPU_FORCE) neighbor->add_request(this, NeighConst::REQ_FULL); diff --git a/src/GPU/pair_eam_gpu.h b/src/GPU/pair_eam_gpu.h index 80ec6ea0d6e..51336d141c0 100644 --- a/src/GPU/pair_eam_gpu.h +++ b/src/GPU/pair_eam_gpu.h @@ -44,9 +44,9 @@ class PairEAMGPU : public PairEAM { // functions in the gpu library (lal_eam*_ext.cpp) typedef int (*EAMGPUInitFn)(const int, double, int **, int **, int *, double ***, double ***, - double ***, double **, double, double, double, int, int, int, int, - int, const int, const int, const int, const int, const double, int &, - FILE *, int &); + double ***, double **, double, double, double, double, const int, + int, int, int, int, int, const int, const int, const int, const int, + const double, int &, FILE *, int &); typedef void (*EAMGPUClearFn)(); typedef int **(*EAMGPUComputeNFn)(const int, const int, const int, double **, int *, double *, double *, tagint *, int **, tagint **, const bool, const bool, diff --git a/src/GPU/pair_eam_he_gpu.cpp b/src/GPU/pair_eam_he_gpu.cpp new file mode 100644 index 00000000000..98a147827d0 --- /dev/null +++ b/src/GPU/pair_eam_he_gpu.cpp @@ -0,0 +1,61 @@ +/* ---------------------------------------------------------------------- + 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: Xiaowng Zhou (Sandia) +------------------------------------------------------------------------- */ + +#include "pair_eam_he_gpu.h" + +using namespace LAMMPS_NS; + +// External functions from cuda library for atom decomposition + +int eam_he_gpu_init(const int ntypes, double host_cutforcesq, int **host_type2rhor, + int **host_type2z2r, int *host_type2frho, double ***host_rhor_spline, + double ***host_z2r_spline, double ***host_frho_spline, double **host_cutsq, + double rdr, double rdrho, double rhomax, double rhomin, + const int he_flag, int nrhor, int nrho, int nz2r, + int nfrho, int nr, const int nlocal, const int nall, const int max_nbors, + const int maxspecial, const double cell_size, int &gpu_mode, FILE *screen, + int &fp_size); +void eam_he_gpu_clear(); +int **eam_he_gpu_compute_n(const int ago, const int inum_full, const int nall, double **host_x, + int *host_type, double *sublo, double *subhi, tagint *tag, + int **nspecial, tagint **special, const bool eflag, const bool vflag, + const bool eatom, const bool vatom, int &host_start, int **ilist, + int **jnum, const double cpu_time, bool &success, int &inum, + void **fp_ptr, double *prd, int *periodicity); +void eam_he_gpu_compute(const int ago, const int inum_full, const int nlocal, const int nall, + double **host_x, int *host_type, int *ilist, int *numj, int **firstneigh, + const bool eflag, const bool vflag, const bool eatom, const bool vatom, + int &host_start, const double cpu_time, bool &success, void **fp_ptr); +void eam_he_gpu_compute_force(int *ilist, const bool eflag, const bool vflag, const bool eatom, + const bool vatom); +double eam_he_gpu_bytes(); + +/* ---------------------------------------------------------------------- */ + +PairEAMHEGPU::PairEAMHEGPU(LAMMPS *lmp) : PairEAMGPU(lmp) +{ + fileformat = FS; + one_coeff = 1; + he_flag = 1; + + gpu_init_fn = eam_he_gpu_init; + gpu_clear_fn = eam_he_gpu_clear; + gpu_compute_n_fn = eam_he_gpu_compute_n; + gpu_compute_fn = eam_he_gpu_compute; + gpu_compute_force_fn = eam_he_gpu_compute_force; + gpu_bytes_fn = eam_he_gpu_bytes; +} diff --git a/src/GPU/pair_eam_he_gpu.h b/src/GPU/pair_eam_he_gpu.h new file mode 100644 index 00000000000..1ef38ccaab9 --- /dev/null +++ b/src/GPU/pair_eam_he_gpu.h @@ -0,0 +1,35 @@ +/* -*- 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(eam/he/gpu,PairEAMHEGPU); +// clang-format on +#else + +#ifndef LMP_PAIR_EAM_HE_GPU_H +#define LMP_PAIR_EAM_HE_GPU_H + +#include "pair_eam_gpu.h" + +namespace LAMMPS_NS { + +class PairEAMHEGPU : public PairEAMGPU { + public: + PairEAMHEGPU(class LAMMPS *); +}; + +} // namespace LAMMPS_NS + +#endif +#endif From 5ea92dfa1670de38c762e7d9b8b4570b25406c46 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 11 Jun 2026 20:06:57 -0400 Subject: [PATCH 008/100] document accelerated eam/he variants Add the Accelerator Variants line and index entries for eam/he/gpu, eam/he/kk, and eam/he/omp to the pair_eam doc page, the (gko) suffix letters to the pair style command table, and the new package file names to src/.gitignore. Co-Authored-By: Claude Fable 5 --- doc/src/Commands_pair.rst | 2 +- doc/src/pair_eam.rst | 5 +++++ src/.gitignore | 6 ++++++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/doc/src/Commands_pair.rst b/doc/src/Commands_pair.rst index 78affc7b52c..522f4f76a80 100644 --- a/doc/src/Commands_pair.rst +++ b/doc/src/Commands_pair.rst @@ -101,7 +101,7 @@ parenthesis: g = GPU, i = INTEL, k = KOKKOS, o = OPENMP, t = OPT. * :doc:`eam/cd/old ` * :doc:`eam/fs (gikot) ` * :doc:`eam/fs/apip ` - * :doc:`eam/he ` + * :doc:`eam/he (gko) ` * :doc:`eam/apip ` * :doc:`edip (o) ` * :doc:`edip/multi ` diff --git a/doc/src/pair_eam.rst b/doc/src/pair_eam.rst index 6daf92d8818..9307acebd13 100644 --- a/doc/src/pair_eam.rst +++ b/doc/src/pair_eam.rst @@ -19,6 +19,9 @@ .. index:: pair_style eam/fs/omp .. index:: pair_style eam/fs/opt .. index:: pair_style eam/he +.. index:: pair_style eam/he/gpu +.. index:: pair_style eam/he/kk +.. index:: pair_style eam/he/omp pair_style eam command ====================== @@ -44,6 +47,8 @@ Accelerator Variants: *eam/fs/gpu*, *eam/fs/intel*, *eam/fs/kk*, *eam/fs/omp*, * pair_style eam/he command ========================= +Accelerator Variants: *eam/he/gpu*, *eam/he/kk*, *eam/he/omp* + Syntax """""" diff --git a/src/.gitignore b/src/.gitignore index 026eba6a913..1506d74e20f 100644 --- a/src/.gitignore +++ b/src/.gitignore @@ -1379,6 +1379,12 @@ /pair_eam_fs.h /pair_eam_he.cpp /pair_eam_he.h +/pair_eam_he_gpu.cpp +/pair_eam_he_gpu.h +/pair_eam_he_kokkos.cpp +/pair_eam_he_kokkos.h +/pair_eam_he_omp.cpp +/pair_eam_he_omp.h /pair_lebedeva_z.cpp /pair_lebedeva_z.h /pair_lj_expand_coul_long.cpp From 53ad0e2ed772d714185048ce44905dc2647c2339 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 11 Jun 2026 22:09:31 -0400 Subject: [PATCH 009/100] hoist eam/he format selection out of eval() loops, add eam/he/opt The eval() functions of PairEAMOMP and PairEAMOpt gain the table format as an additional template parameter, dispatched once in compute(), so the eam/he test is resolved at compile time like the existing EVFLAG/EFLAG/NEWTON_PAIR parameters. The OPT embedding loop uses the (templated) shared embedding_index() helper, which also gives it eam/he support; the new eam/he/opt style is a constructor- only subclass of PairEAMOpt. Verified: all previously existing style/suffix combinations remain byte-identical (plain, -sf opt/omp/kk/gpu, serial and 4-rank MPI, newton on/off); the new eam/he/opt is bitwise identical to plain eam/he over 50 MD steps and in the extrapolation tests above rhomax and below rhomin, and ~10% faster serial; the eam_he yaml test now exercises and passes its opt sub-test. Co-Authored-By: Claude Fable 5 --- doc/src/Commands_pair.rst | 2 +- doc/src/pair_eam.rst | 3 +- src/.gitignore | 2 ++ src/OPENMP/pair_eam_omp.cpp | 39 +++++++++++++++------- src/OPENMP/pair_eam_omp.h | 2 +- src/OPT/Install.sh | 2 ++ src/OPT/pair_eam_he_opt.cpp | 32 +++++++++++++++++++ src/OPT/pair_eam_he_opt.h | 35 ++++++++++++++++++++ src/OPT/pair_eam_opt.cpp | 64 +++++++++++++++++++++++++------------ src/OPT/pair_eam_opt.h | 2 +- 10 files changed, 146 insertions(+), 37 deletions(-) create mode 100644 src/OPT/pair_eam_he_opt.cpp create mode 100644 src/OPT/pair_eam_he_opt.h diff --git a/doc/src/Commands_pair.rst b/doc/src/Commands_pair.rst index 522f4f76a80..42d07928f0a 100644 --- a/doc/src/Commands_pair.rst +++ b/doc/src/Commands_pair.rst @@ -101,7 +101,7 @@ parenthesis: g = GPU, i = INTEL, k = KOKKOS, o = OPENMP, t = OPT. * :doc:`eam/cd/old ` * :doc:`eam/fs (gikot) ` * :doc:`eam/fs/apip ` - * :doc:`eam/he (gko) ` + * :doc:`eam/he (gkot) ` * :doc:`eam/apip ` * :doc:`edip (o) ` * :doc:`edip/multi ` diff --git a/doc/src/pair_eam.rst b/doc/src/pair_eam.rst index 9307acebd13..1d9f9f4fdf3 100644 --- a/doc/src/pair_eam.rst +++ b/doc/src/pair_eam.rst @@ -22,6 +22,7 @@ .. index:: pair_style eam/he/gpu .. index:: pair_style eam/he/kk .. index:: pair_style eam/he/omp +.. index:: pair_style eam/he/opt pair_style eam command ====================== @@ -47,7 +48,7 @@ Accelerator Variants: *eam/fs/gpu*, *eam/fs/intel*, *eam/fs/kk*, *eam/fs/omp*, * pair_style eam/he command ========================= -Accelerator Variants: *eam/he/gpu*, *eam/he/kk*, *eam/he/omp* +Accelerator Variants: *eam/he/gpu*, *eam/he/kk*, *eam/he/omp*, *eam/he/opt* Syntax """""" diff --git a/src/.gitignore b/src/.gitignore index 1506d74e20f..c3d6fcbd93a 100644 --- a/src/.gitignore +++ b/src/.gitignore @@ -1385,6 +1385,8 @@ /pair_eam_he_kokkos.h /pair_eam_he_omp.cpp /pair_eam_he_omp.h +/pair_eam_he_opt.cpp +/pair_eam_he_opt.h /pair_lebedeva_z.cpp /pair_lebedeva_z.h /pair_lj_expand_coul_long.cpp diff --git a/src/OPENMP/pair_eam_omp.cpp b/src/OPENMP/pair_eam_omp.cpp index a7b8a3300a4..662281fd8a1 100644 --- a/src/OPENMP/pair_eam_omp.cpp +++ b/src/OPENMP/pair_eam_omp.cpp @@ -77,17 +77,32 @@ void PairEAMOMP::compute(int eflag, int vflag) else thr->init_eam(atom->nlocal, rho); - if (evflag) { - if (eflag) { - if (force->newton_pair) eval<1,1,1>(ifrom, ito, &beyond_rhomax, thr); - else eval<1,1,0>(ifrom, ito, &beyond_rhomax, thr); + if (he_flag) { + if (evflag) { + if (eflag) { + if (force->newton_pair) eval<1,1,1,1>(ifrom, ito, &beyond_rhomax, thr); + else eval<1,1,0,1>(ifrom, ito, &beyond_rhomax, thr); + } else { + if (force->newton_pair) eval<1,0,1,1>(ifrom, ito, &beyond_rhomax, thr); + else eval<1,0,0,1>(ifrom, ito, &beyond_rhomax, thr); + } } else { - if (force->newton_pair) eval<1,0,1>(ifrom, ito, &beyond_rhomax, thr); - else eval<1,0,0>(ifrom, ito, &beyond_rhomax, thr); + if (force->newton_pair) eval<0,0,1,1>(ifrom, ito, &beyond_rhomax, thr); + else eval<0,0,0,1>(ifrom, ito, &beyond_rhomax, thr); } } else { - if (force->newton_pair) eval<0,0,1>(ifrom, ito, &beyond_rhomax, thr); - else eval<0,0,0>(ifrom, ito, &beyond_rhomax, thr); + if (evflag) { + if (eflag) { + if (force->newton_pair) eval<1,1,1,0>(ifrom, ito, &beyond_rhomax, thr); + else eval<1,1,0,0>(ifrom, ito, &beyond_rhomax, thr); + } else { + if (force->newton_pair) eval<1,0,1,0>(ifrom, ito, &beyond_rhomax, thr); + else eval<1,0,0,0>(ifrom, ito, &beyond_rhomax, thr); + } + } else { + if (force->newton_pair) eval<0,0,1,0>(ifrom, ito, &beyond_rhomax, thr); + else eval<0,0,0,0>(ifrom, ito, &beyond_rhomax, thr); + } } thr->timer(Timer::PAIR); @@ -105,7 +120,7 @@ void PairEAMOMP::compute(int eflag, int vflag) } } -template +template void PairEAMOMP::eval(int iifrom, int iito, int *beyond_rhomax, ThrData * const thr) { int i,j,ii,jj,m,jnum,itype,jtype; @@ -207,16 +222,16 @@ void PairEAMOMP::eval(int iifrom, int iito, int *beyond_rhomax, ThrData * const for (ii = iifrom; ii < iito; ii++) { i = ilist[ii]; - embedding_index(rho[i],m,p); + embedding_index(rho[i],m,p); coeff = frho_spline[type2frho[type[i]]][m]; fp[i] = (coeff[0]*p + coeff[1])*p + coeff[2]; if (EFLAG) { phi = ((coeff[3]*p + coeff[4])*p + coeff[5])*p + coeff[6]; - if (he_flag && (rho[i] < rhomin)) { + if (HE && (rho[i] < rhomin)) { phi += fp[i] * (rho[i]-rhomin); } else if (rho[i] > rhomax) { phi += fp[i] * (rho[i]-rhomax); - if (!he_flag) *beyond_rhomax = 1; + if (!HE) *beyond_rhomax = 1; } e_tally_thr(this, i, i, nlocal, NEWTON_PAIR, scale[type[i]][type[i]]*phi, 0.0, thr); } diff --git a/src/OPENMP/pair_eam_omp.h b/src/OPENMP/pair_eam_omp.h index e801e527629..08fe0ed11d2 100644 --- a/src/OPENMP/pair_eam_omp.h +++ b/src/OPENMP/pair_eam_omp.h @@ -38,7 +38,7 @@ class PairEAMOMP : public PairEAM, public ThrOMP { double memory_usage() override; private: - template + template void eval(int iifrom, int iito, int *beyond_rhomax, ThrData *const thr); }; diff --git a/src/OPT/Install.sh b/src/OPT/Install.sh index 26dd9ced05a..5c8ca9eeceb 100755 --- a/src/OPT/Install.sh +++ b/src/OPT/Install.sh @@ -32,6 +32,8 @@ action pair_eam_alloy_opt.cpp pair_eam_alloy.cpp action pair_eam_alloy_opt.h pair_eam_alloy.cpp action pair_eam_fs_opt.cpp pair_eam_fs.cpp action pair_eam_fs_opt.h pair_eam_fs.cpp +action pair_eam_he_opt.cpp pair_eam_he.cpp +action pair_eam_he_opt.h pair_eam_he.cpp action pair_eam_opt.cpp pair_eam.cpp action pair_eam_opt.h pair_eam.cpp action pair_lj_charmm_coul_long_opt.cpp pair_lj_charmm_coul_long.cpp diff --git a/src/OPT/pair_eam_he_opt.cpp b/src/OPT/pair_eam_he_opt.cpp new file mode 100644 index 00000000000..c6d62e557eb --- /dev/null +++ b/src/OPT/pair_eam_he_opt.cpp @@ -0,0 +1,32 @@ +/* ---------------------------------------------------------------------- + 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: Xiaowng Zhou (Sandia) +------------------------------------------------------------------------- */ + +#include "pair_eam_he_opt.h" + +using namespace LAMMPS_NS; + +/* ---------------------------------------------------------------------- + inherit optimized compute() from PairEAMOpt, + select the eam/he file format as in PairEAMHE +------------------------------------------------------------------------- */ + +PairEAMHEOpt::PairEAMHEOpt(LAMMPS *lmp) : PairEAMOpt(lmp) +{ + fileformat = FS; + one_coeff = 1; + he_flag = 1; +} diff --git a/src/OPT/pair_eam_he_opt.h b/src/OPT/pair_eam_he_opt.h new file mode 100644 index 00000000000..4648a49c88d --- /dev/null +++ b/src/OPT/pair_eam_he_opt.h @@ -0,0 +1,35 @@ +/* -*- 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(eam/he/opt,PairEAMHEOpt); +// clang-format on +#else + +#ifndef LMP_PAIR_EAM_HE_OPT_H +#define LMP_PAIR_EAM_HE_OPT_H + +#include "pair_eam_opt.h" + +namespace LAMMPS_NS { + +class PairEAMHEOpt : public PairEAMOpt { + public: + PairEAMHEOpt(class LAMMPS *); +}; + +} // namespace LAMMPS_NS + +#endif +#endif diff --git a/src/OPT/pair_eam_opt.cpp b/src/OPT/pair_eam_opt.cpp index c51e1e67883..6b909af5135 100644 --- a/src/OPT/pair_eam_opt.cpp +++ b/src/OPT/pair_eam_opt.cpp @@ -43,29 +43,50 @@ void PairEAMOpt::compute(int eflag, int vflag) { ev_init(eflag, vflag); - if (evflag) { - if (eflag) { + if (he_flag) { + if (evflag) { + if (eflag) { + if (force->newton_pair) + return eval<1, 1, 1, 1>(); + else + return eval<1, 1, 0, 1>(); + } else { + if (force->newton_pair) + return eval<1, 0, 1, 1>(); + else + return eval<1, 0, 0, 1>(); + } + } else { if (force->newton_pair) - return eval<1, 1, 1>(); + return eval<0, 0, 1, 1>(); else - return eval<1, 1, 0>(); + return eval<0, 0, 0, 1>(); + } + } else { + if (evflag) { + if (eflag) { + if (force->newton_pair) + return eval<1, 1, 1, 0>(); + else + return eval<1, 1, 0, 0>(); + } else { + if (force->newton_pair) + return eval<1, 0, 1, 0>(); + else + return eval<1, 0, 0, 0>(); + } } else { if (force->newton_pair) - return eval<1, 0, 1>(); + return eval<0, 0, 1, 0>(); else - return eval<1, 0, 0>(); + return eval<0, 0, 0, 0>(); } - } else { - if (force->newton_pair) - return eval<0, 0, 1>(); - else - return eval<0, 0, 0>(); } } /* ---------------------------------------------------------------------- */ -template void PairEAMOpt::eval() +template void PairEAMOpt::eval() { // NOLINTBEGIN typedef struct { @@ -241,23 +262,24 @@ template void PairEAMOpt::eval() // fp = derivative of embedding energy at each atom // phi = embedding energy at each atom - // if rho > rhomax (e.g. due to close approach of two atoms), - // will exceed table, so add linear term to conserve energy + // if rho > rhomax (e.g. due to close approach of two atoms) the table is + // exceeded, so add linear term to conserve energy; for eam/he (HE=1) + // the table starts at rhomin and may be exceeded on either side for (ii = 0; ii < inum; ii++) { i = ilist[ii]; - double p = rho[i] * rdrho + 1.0; - int m = static_cast(p); - m = MAX(1, MIN(m, nrho - 1)); - p -= m; - p = MIN(p, 1.0); + double p; + int m; + embedding_index(rho[i], m, p); coeff = frho_spline[type2frho[type[i]]][m]; fp[i] = (coeff[0] * p + coeff[1]) * p + coeff[2]; if (EFLAG) { double phi = ((coeff[3] * p + coeff[4]) * p + coeff[5]) * p + coeff[6]; - if (rho[i] > rhomax) { + if (HE && (rho[i] < rhomin)) { + phi += fp[i] * (rho[i] - rhomin); + } else if (rho[i] > rhomax) { phi += fp[i] * (rho[i] - rhomax); - beyond_rhomax = 1; + if (!HE) beyond_rhomax = 1; } phi *= scale[type[i]][type[i]]; if (eflag_global) eng_vdwl += phi; diff --git a/src/OPT/pair_eam_opt.h b/src/OPT/pair_eam_opt.h index d9e58209be6..76bccf79136 100644 --- a/src/OPT/pair_eam_opt.h +++ b/src/OPT/pair_eam_opt.h @@ -31,7 +31,7 @@ class PairEAMOpt : public PairEAM { void compute(int, int) override; private: - template void eval(); + template void eval(); }; } // namespace LAMMPS_NS From 5d79a16a149c6f069ac18b5b492941929bb6da6b Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 30 Jun 2026 16:29:47 +0000 Subject: [PATCH 010/100] Apply review feedback to dump sort docs and balancing warning Reword the dump_modify balance note per reviewer suggestion to clarify that balancing is per-processor (not per-file) and that files will naturally differ in length when nfile/fileper do not divide nprocs evenly. Update the runtime warning text to match this framing and fix a "correcly" typo. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01FHrXNCoWpsuFRFPMZLQ28z Co-authored-by: Stan Moore --- doc/src/dump_modify.rst | 9 ++++----- src/dump.cpp | 10 ++++++---- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/doc/src/dump_modify.rst b/doc/src/dump_modify.rst index 20eb03cb415..ee99a062ef0 100644 --- a/doc/src/dump_modify.rst +++ b/doc/src/dump_modify.rst @@ -760,11 +760,10 @@ processors who accumulate the data. .. note:: - Because balancing is performed before data accumulation, *nfile* or - *fileper* should divide the total number of processors evenly when - using the *balance* keyword. Otherwise, some processors will - accumulate more data than others, reintroducing imbalance during - file output. + The balancing is performed on a per-processor basis, not per-file + when using *nfile* or *fileper*. If different numbers of processors + contribute data to different dump files, the files will naturally be + of different lengths. .. note:: diff --git a/src/dump.cpp b/src/dump.cpp index 5844f627b1a..686e9030c27 100644 --- a/src/dump.cpp +++ b/src/dump.cpp @@ -904,13 +904,15 @@ void Dump::balance() static int warn = 1; if (warn && multiproc > 1 && comm->me == 0) { if (nprocs % nfile) { - error->warning(FLERR,"Value of dump_modify 'nfile' keyword does not divide into total number" - " of processors evenly, dump file balancing may not work correcly"); + error->warning(FLERR,"Value of dump_modify 'nfile' keyword does not divide the total number" + " of processors evenly; since balancing is performed per-processor, not" + " per-file, the dump files will be of different lengths"); warn = 0; } if (nprocs % nper) { - error->warning(FLERR,"Value of dump_modify 'fileper' keyword does not divide into total number" - " of processors evenly, dump file balancing may not work correcly"); + error->warning(FLERR,"Value of dump_modify 'fileper' keyword does not divide the total number" + " of processors evenly; since balancing is performed per-processor, not" + " per-file, the dump files will be of different lengths"); warn = 0; } } From cf2cfbdbe4cdcde2309a837946cda4ac98a4d022 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 30 Jun 2026 16:32:15 +0000 Subject: [PATCH 011/100] Use existing me member instead of comm->me in dump balance warning Drop the redundant comm.h include and use the Dump class's own me member for the rank-0 check in the balancing warning. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01FHrXNCoWpsuFRFPMZLQ28z Co-authored-by: Stan Moore --- src/dump.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/dump.cpp b/src/dump.cpp index 686e9030c27..5011174f8c3 100644 --- a/src/dump.cpp +++ b/src/dump.cpp @@ -14,7 +14,6 @@ #include "dump.h" #include "atom.h" -#include "comm.h" #include "compute.h" #include "domain.h" #include "error.h" @@ -902,7 +901,7 @@ void Dump::balance() memory->create(proc_new_offsets,nprocs+1,"dump:proc_new_offsets"); static int warn = 1; - if (warn && multiproc > 1 && comm->me == 0) { + if (warn && multiproc > 1 && me == 0) { if (nprocs % nfile) { error->warning(FLERR,"Value of dump_modify 'nfile' keyword does not divide the total number" " of processors evenly; since balancing is performed per-processor, not" From 7dc195fec171877afef95babb2aa00e66bdf5215 Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Tue, 30 Jun 2026 10:39:20 -0600 Subject: [PATCH 012/100] Make warning less verbose --- src/dump.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/dump.cpp b/src/dump.cpp index 5011174f8c3..b7ba04919f8 100644 --- a/src/dump.cpp +++ b/src/dump.cpp @@ -903,15 +903,15 @@ void Dump::balance() static int warn = 1; if (warn && multiproc > 1 && me == 0) { if (nprocs % nfile) { - error->warning(FLERR,"Value of dump_modify 'nfile' keyword does not divide the total number" - " of processors evenly; since balancing is performed per-processor, not" - " per-file, the dump files will be of different lengths"); + error->warning(FLERR,"Dump file balancing requested but dump_modify 'nfile'" + " keyword does not divide the number processors evenly;" + " dump files will be of different lengths"); warn = 0; } if (nprocs % nper) { - error->warning(FLERR,"Value of dump_modify 'fileper' keyword does not divide the total number" - " of processors evenly; since balancing is performed per-processor, not" - " per-file, the dump files will be of different lengths"); + error->warning(FLERR,"Dump file balancing requested but dump_modify 'fileper'" + " keyword does not divide the number processors evenly;" + " dump files will be of different lengths"); warn = 0; } } From 8038c1705cdd8198d2eb85cf6b30eb02eadb95ce Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 10 Jul 2026 16:21:12 -0400 Subject: [PATCH 013/100] fix special bonds handling and erf() accuracy in buck6d/coul/gauss/* kokkos styles The KOKKOS version of pair style buck6d/coul/gauss/dsf scaled the entire damped Coulomb term with the special_bonds factor instead of subtracting only the bare 1/r Coulomb part like the CPU version does. With the default special_bonds settings this zeroed out the Coulomb interaction of all bonded pairs (up to 100% force error on molecular systems). Both KOKKOS variants also used the low-accuracy Abramowitz-Stegun polynomial for erf() where their CPU counterparts use the high-accuracy MathSpecial::my_erfcx() based expression, limiting agreement with the CPU reference to about 1e-5. Use Kokkos::erf() instead, which agrees with the CPU expression to double precision accuracy (verified to 9e-16 absolute). Also apply the Coulomb smoothing before the special bonds correction in the long variant's energy path to match the CPU implementation, and drop the now unused ewald_const.h include. Found by the new buck6d force-style tests: the suffix runs of mol-pair-buck6d_coul_gauss_{dsf,long}.yaml now agree with the CPU reference to 1e-12. --- .../pair_buck6d_coul_gauss_dsf_kokkos.cpp | 24 ++++++------- .../pair_buck6d_coul_gauss_long_kokkos.cpp | 34 ++++--------------- 2 files changed, 19 insertions(+), 39 deletions(-) diff --git a/src/KOKKOS/pair_buck6d_coul_gauss_dsf_kokkos.cpp b/src/KOKKOS/pair_buck6d_coul_gauss_dsf_kokkos.cpp index 45962278b1c..ce6c561e47c 100644 --- a/src/KOKKOS/pair_buck6d_coul_gauss_dsf_kokkos.cpp +++ b/src/KOKKOS/pair_buck6d_coul_gauss_dsf_kokkos.cpp @@ -17,7 +17,6 @@ #include "atom_kokkos.h" #include "atom_masks.h" #include "error.h" -#include "ewald_const.h" #include "force.h" #include "kokkos.h" #include "math_const.h" @@ -29,7 +28,6 @@ #include "update.h" using namespace LAMMPS_NS; -using namespace EwaldConst; using MathConst::MY_PIS; /* ---------------------------------------------------------------------- */ @@ -215,15 +213,16 @@ compute_fcoul(const KK_FLOAT& rsq, const int& /*i*/, const int& j, const KK_FLOAT r = Kokkos::sqrt(rsq); const KK_FLOAT alpha = STACKPARAMS ? m_params[itype][jtype].alpha_ij : params(itype,jtype).alpha_ij; const KK_FLOAT f_sh = STACKPARAMS ? m_params[itype][jtype].f_shift_ij : params(itype,jtype).f_shift_ij; - const KK_FLOAT prefactor = factor_coul * qqrd2e * qtmp * q(j); + const KK_FLOAT prefactor = qqrd2e * qtmp * q(j); const KK_FLOAT arg = alpha * r; const KK_FLOAT erfcd = Kokkos::exp(-arg*arg); - // use polynomial approximation for erfc, then erf = 1 - erfc - const KK_FLOAT t = 1.0 / (1.0 + EWALD_P*arg); - const KK_FLOAT erfcc = 1.0 - t * (A1+t*(A2+t*(A3+t*(A4+t*A5)))) * erfcd; + const KK_FLOAT erfcc = Kokkos::erf(arg); // force: erf(alpha*r)/r -> d/dr = -erf/r^2 + 2*alpha*erfcd/(sqrt(pi)*r) // so fpair = prefactor * (erfcc/r - 2*alpha/MY_PIS*erfcd + r*f_shift) / rsq - return prefactor * (erfcc/r - 2.0*alpha/MY_PIS * erfcd + r*f_sh) * r2inv; + KK_FLOAT forcecoul = prefactor * (erfcc/r - 2.0*alpha/MY_PIS * erfcd + r*f_sh); + // special bonds scaling removes only the undamped 1/r Coulomb part + if (factor_coul < 1.0) forcecoul -= (1.0-factor_coul)*prefactor/r; + return forcecoul * r2inv; } /* ---------------------------------------------------------------------- @@ -290,12 +289,13 @@ compute_ecoul(const KK_FLOAT& rsq, const int& /*i*/, const int& j, const KK_FLOAT alpha = STACKPARAMS ? m_params[itype][jtype].alpha_ij : params(itype,jtype).alpha_ij; const KK_FLOAT e_sh = STACKPARAMS ? m_params[itype][jtype].e_shift_ij : params(itype,jtype).e_shift_ij; const KK_FLOAT f_sh = STACKPARAMS ? m_params[itype][jtype].f_shift_ij : params(itype,jtype).f_shift_ij; - const KK_FLOAT prefactor = factor_coul * qqrd2e * qtmp * q(j); + const KK_FLOAT prefactor = qqrd2e * qtmp * q(j) / r; const KK_FLOAT arg = alpha * r; - const KK_FLOAT erfcd = Kokkos::exp(-arg*arg); - const KK_FLOAT t = 1.0 / (1.0 + EWALD_P*arg); - const KK_FLOAT erfcc = 1.0 - t * (A1+t*(A2+t*(A3+t*(A4+t*A5)))) * erfcd; - return prefactor * (erfcc - r*e_sh - rsq*f_sh) / r; + const KK_FLOAT erfcc = Kokkos::erf(arg); + KK_FLOAT ecoul = prefactor * (erfcc - r*e_sh - rsq*f_sh); + // special bonds scaling removes only the undamped 1/r Coulomb part + if (factor_coul < 1.0) ecoul -= (1.0-factor_coul)*prefactor; + return ecoul; } /* ---------------------------------------------------------------------- diff --git a/src/KOKKOS/pair_buck6d_coul_gauss_long_kokkos.cpp b/src/KOKKOS/pair_buck6d_coul_gauss_long_kokkos.cpp index c3da66cb389..98fe7be6490 100644 --- a/src/KOKKOS/pair_buck6d_coul_gauss_long_kokkos.cpp +++ b/src/KOKKOS/pair_buck6d_coul_gauss_long_kokkos.cpp @@ -225,23 +225,13 @@ compute_fcoul(const KK_FLOAT& rsq, const int& /*i*/, const int& j, // Ewald factor: erf(g_ewald * r) const KK_FLOAT grij = g_ewald_kk * r; const KK_FLOAT expm2 = Kokkos::exp(-grij*grij); - const KK_FLOAT tg = static_cast(1.0) / - (static_cast(1.0) + static_cast(EWALD_P)*grij); - const KK_FLOAT erfc_g = tg * (static_cast(A1)+tg*(static_cast(A2)+ - tg * (static_cast(A3)+tg*(static_cast(A4)+ - tg * static_cast(A5))))) * expm2; - const KK_FLOAT erf_ewald = static_cast(1.0) - erfc_g; + const KK_FLOAT erf_ewald = Kokkos::erf(grij); // Gaussian-alpha factor: erf(alpha_ij * r) const KK_FLOAT alpha = STACKPARAMS ? m_params[itype][jtype].alpha_ij : params(itype,jtype).alpha_ij; const KK_FLOAT arg = alpha * r; const KK_FLOAT expa = Kokkos::exp(-arg*arg); - const KK_FLOAT ta = static_cast(1.0) / - (static_cast(1.0) + static_cast(EWALD_P)*arg); - const KK_FLOAT erfc_a = ta * (static_cast(A1)+ta*(static_cast(A2)+ - ta * (static_cast(A3)+ta*(static_cast(A4)+ - ta * static_cast(A5))))) * expa; - const KK_FLOAT erfa = static_cast(1.0) - erfc_a; + const KK_FLOAT erfa = Kokkos::erf(arg); const KK_FLOAT prefactor = qqrd2e * qtmp * q(j) * rinv; const KK_FLOAT falpha = erfa - static_cast(EWALD_F)*arg*expa; @@ -328,28 +318,15 @@ compute_ecoul(const KK_FLOAT& rsq, const int& /*i*/, const int& j, // Ewald factor: erf(g_ewald * r) const KK_FLOAT grij = g_ewald_kk * r; - const KK_FLOAT expm2 = Kokkos::exp(-grij*grij); - const KK_FLOAT tg = static_cast(1.0) / - (static_cast(1.0) + static_cast(EWALD_P)*grij); - const KK_FLOAT erfc_g = tg * (static_cast(A1)+tg*(static_cast(A2)+ - tg * (static_cast(A3)+tg*(static_cast(A4)+ - tg * static_cast(A5))))) * expm2; - const KK_FLOAT erf_ewald = static_cast(1.0) - erfc_g; + const KK_FLOAT erf_ewald = Kokkos::erf(grij); // Gaussian-alpha factor: erf(alpha_ij * r) const KK_FLOAT alpha = STACKPARAMS ? m_params[itype][jtype].alpha_ij : params(itype,jtype).alpha_ij; const KK_FLOAT arg = alpha * r; - const KK_FLOAT expa = Kokkos::exp(-arg*arg); - const KK_FLOAT ta = static_cast(1.0) / - (static_cast(1.0) + static_cast(EWALD_P)*arg); - const KK_FLOAT erfc_a = ta * (static_cast(A1)+ta*(static_cast(A2)+ - ta * (static_cast(A3)+ta*(static_cast(A4)+ - ta * static_cast(A5))))) * expa; - const KK_FLOAT erfa = static_cast(1.0) - erfc_a; + const KK_FLOAT erfa = Kokkos::erf(arg); const KK_FLOAT prefactor = qqrd2e * qtmp * q(j) * rinv; KK_FLOAT ealpha = prefactor * (erfa - erf_ewald); - if (factor_coul < static_cast(1.0)) ealpha -= (static_cast(1.0)-factor_coul)*prefactor*erfa; // optional Coulomb smoothing near cutoff if (rsq > rsmooth_sq_c_kk) { @@ -360,6 +337,9 @@ compute_ecoul(const KK_FLOAT& rsq, const int& /*i*/, const int& j, ealpha *= sme; } + // smoothing is not applied to the special-bonds correction (see CPU version) + if (factor_coul < static_cast(1.0)) ealpha -= (static_cast(1.0)-factor_coul)*prefactor*erfa; + return ealpha; } From 09d3b9c33a913f431db5b8080de95d391d18f5cd Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 10 Jul 2026 16:21:24 -0400 Subject: [PATCH 014/100] add force-style tests for MOFFF, FEP gapsys, and hbond angleoffset styles New YAML references for previously untested styles: - pair buck6d/coul/gauss/dsf and buck6d/coul/gauss/long (MOFFF) - angle cosine/buck6d (MOFFF); requires a buck6d pair style, uses pair style zero in nocoeff mode during the data file round trip - pair lj/cut/soft/gapsys (FEP) - pair hbond/dreiding/lj/angleoffset and hbond/dreiding/morse/angleoffset (EXTRA-MOLECULE); reference energies differ from the base styles so the offset code path is exercised --- .../tests/angle-cosine_buck6d.yaml | 95 +++++++++++++ .../tests/mol-pair-buck6d_coul_gauss_dsf.yaml | 99 ++++++++++++++ .../mol-pair-buck6d_coul_gauss_long.yaml | 103 ++++++++++++++ ...ol-pair-hbond_dreiding_lj_angleoffset.yaml | 127 +++++++++-------- ...pair-hbond_dreiding_morse_angleoffset.yaml | 128 +++++++++--------- .../tests/mol-pair-lj_cut_soft_gapsys.yaml | 95 +++++++++++++ 6 files changed, 519 insertions(+), 128 deletions(-) create mode 100644 unittest/force-styles/tests/angle-cosine_buck6d.yaml create mode 100644 unittest/force-styles/tests/mol-pair-buck6d_coul_gauss_dsf.yaml create mode 100644 unittest/force-styles/tests/mol-pair-buck6d_coul_gauss_long.yaml create mode 100644 unittest/force-styles/tests/mol-pair-lj_cut_soft_gapsys.yaml diff --git a/unittest/force-styles/tests/angle-cosine_buck6d.yaml b/unittest/force-styles/tests/angle-cosine_buck6d.yaml new file mode 100644 index 00000000000..b5006025550 --- /dev/null +++ b/unittest/force-styles/tests/angle-cosine_buck6d.yaml @@ -0,0 +1,95 @@ +--- +lammps_version: 4 Jul 2026 +tags: generated +date_generated: Fri Jul 10 16:18:52 2026 +epsilon: 2.5e-13 +skip_tests: single +prerequisites: | + atom full + angle cosine/buck6d + pair buck6d/coul/gauss/dsf +pre_commands: | + variable angle_factor delete + variable angle_factor index 0.0 + variable pair_style delete + variable pair_style index 'zero 8.0 nocoeff' +post_commands: | + pair_style buck6d/coul/gauss/dsf 0.9000 12.0 + pair_coeff * * 6157.8178 3.4682081 129.19572 0.78772886 0.73006542 +input_file: in.fourmol +angle_style: cosine/buck6d +angle_coeff: | + 1 1.978350 4 180.0 + 2 1.5 3 120.0 + 3 2.5 2 109.4712 + 4 1.0 6 180.0 +equilibrium: 4 3.141592653589793 3.141592653589793 3.141592653589793 3.141592653589793 +extract: "" +natoms: 29 +init_energy: 20.23757223871013 +init_stress: |- + -1.3593175325408707e+01 3.8796867695789525e+00 9.7134885558297555e+00 -8.2218341899791412e+00 4.6506440445034194e+00 -1.0637404887286824e+01 +init_forces: |2 + 1 -2.0134160806424287e+01 2.1605081623358346e+00 6.3336623457810056e+01 + 2 6.3150833250894088e+01 5.8977214575642861e+01 -6.3490156965917549e+01 + 3 -1.1075218145332080e+00 -1.1769866158590554e+00 -4.8526670846831408e+00 + 4 -4.5068776198054856e+01 -8.1473913034009104e-01 -4.9186076709245356e+01 + 5 -1.2856383730521557e+01 -4.3945999142470647e+01 6.6023569496156483e+01 + 6 -2.8383566057194098e+01 2.4555407323950007e+01 1.1326606301519412e+01 + 7 -9.1714452595989702e+00 -5.9882653616475148e+00 -6.2277022652654459e+01 + 8 -1.9589935865476622e+01 -2.8248773164124319e+01 -6.2826243895814393e+01 + 9 1.6590111052904192e+01 4.0507780400931509e+01 1.3474909467435319e+02 + 10 3.4075589372947368e+00 -3.2386390702395211e+01 1.2099150872160475e+01 + 11 -2.2424947616112576e+01 -4.6168322769033217e+01 -3.6891975423175879e+01 + 12 2.8463836752667870e+01 1.2407481109610243e+01 1.7304587949744457e+00 + 13 6.5939269450884979e+01 -3.8720225718663741e+01 1.0397842732063484e+01 + 14 -2.8847525421449454e+01 -5.7128684483945835e-01 -8.3021803866755690e+01 + 15 -4.7533919691877491e-01 7.1738779345590430e+01 4.2161003293171298e+01 + 16 2.5271400797791962e+01 -1.8310608814042350e+01 -3.3279648597770638e+01 + 17 -1.3742922275237675e+01 5.7074486941175975e+00 5.2097973785916345e+01 + 18 -1.2306012405561187e+01 -4.6417826826946410e+01 1.7054932441462674e+02 + 19 -1.1044631587929079e+02 -7.8005773535744297e+01 -1.0881025866542312e+02 + 20 1.2224551712338207e+02 1.2429966331414333e+02 -5.9724451564210078e+01 + 21 -4.9629142994614625e+01 -5.7749965741596995e+01 1.7143370504536836e+02 + 22 -1.1520087983258745e+02 -3.5138275990561503e+01 -1.4340277044548733e+02 + 23 1.6427030325661764e+02 9.3662333348669407e+01 -2.7389157857525039e+01 + 24 3.5352765964364202e+01 -1.5505699382959321e+02 8.9012856613856442e+01 + 25 -1.4428582147617027e+02 2.6729277178434190e+00 -1.1351338029439499e+02 + 26 1.0832298976961738e+02 1.5209283650384347e+02 2.3826493635160407e+01 + 27 2.6824510755485296e+01 -1.7007210700512002e+02 6.1470419665451374e+01 + 28 -1.5632293899849097e+02 4.5677944559822301e+01 -1.0001939515882142e+02 + 29 1.3015453871633306e+02 1.2431221613647769e+02 3.8469886399290637e+01 +run_energy: 20.26046291937527 +run_stress: |- + -1.3651746419572172e+01 3.8759079271374270e+00 9.7758384924347475e+00 -8.2604137292479578e+00 4.5900681657508766e+00 -1.0596657882987362e+01 +run_forces: |2 + 1 -1.9900045499899193e+01 2.2669025004278320e+00 6.2737097727418536e+01 + 2 6.2701087480457410e+01 5.8583316734654559e+01 -6.2860785780733551e+01 + 3 -1.1529531493559149e+00 -1.0398758439781113e+00 -4.8268045918501823e+00 + 4 -4.4742819547635605e+01 -8.7560747607066514e-01 -4.8856290228657684e+01 + 5 -1.2892846836422445e+01 -4.3748830304742960e+01 6.5621900896548951e+01 + 6 -2.8279932965512501e+01 2.4506834244757425e+01 1.1307869134175483e+01 + 7 -9.1656186017437804e+00 -5.9930179148694203e+00 -6.2115196882114681e+01 + 8 -1.9401694399103331e+01 -2.7938338105146013e+01 -6.1880216902865556e+01 + 9 1.6302217892944455e+01 4.0181853947689341e+01 1.3363432517382830e+02 + 10 3.3765529315977925e+00 -3.2596549983406597e+01 1.1720889762409053e+01 + 11 -2.2283997407855729e+01 -4.5865746520614444e+01 -3.6453550708258724e+01 + 12 2.8381911248694689e+01 1.2421609652276299e+01 1.4192370178853937e+00 + 13 6.5553793109980433e+01 -3.8414845473905892e+01 1.0327012997704305e+01 + 14 -2.8460345852490580e+01 -5.4922582342446291e-01 -8.2312788587981402e+01 + 15 -5.3057287997762248e-01 7.1375754686210513e+01 4.1871862902761436e+01 + 16 2.5244112169346014e+01 -1.8302582992581055e+01 -3.3349711493528815e+01 + 17 -1.3728386001194796e+01 5.7083142467470003e+00 5.2105606677707272e+01 + 18 -1.0545272621616965e+01 -4.4319934869482886e+01 1.6838578082978302e+02 + 19 -1.0950329109358043e+02 -7.7428062982340805e+01 -1.0808819457632198e+02 + 20 1.1954167128341798e+02 1.2162753123090917e+02 -5.8277387833282496e+01 + 21 -4.9486031743983126e+01 -5.7095283382932564e+01 1.7028108369122631e+02 + 22 -1.1441923696001507e+02 -3.4945667916278424e+01 -1.4232087589533052e+02 + 23 1.6334556760727250e+02 9.2813931850750535e+01 -2.7317447878790649e+01 + 24 3.5792354612335856e+01 -1.5475934047187428e+02 8.9094188904016917e+01 + 25 -1.4442381122351074e+02 2.5662522918995947e+00 -1.1376235330368259e+02 + 26 1.0802114886311448e+02 1.5190308094818431e+02 2.3994565190639015e+01 + 27 2.6929844221334111e+01 -1.6909880391963003e+02 6.0841669688009993e+01 + 28 -1.5544835321800275e+02 4.5438413759465469e+01 -9.9332226416600079e+01 + 29 1.2917494858140486e+02 1.2357791788730647e+02 3.8410740485884851e+01 +... diff --git a/unittest/force-styles/tests/mol-pair-buck6d_coul_gauss_dsf.yaml b/unittest/force-styles/tests/mol-pair-buck6d_coul_gauss_dsf.yaml new file mode 100644 index 00000000000..32a6b12da3f --- /dev/null +++ b/unittest/force-styles/tests/mol-pair-buck6d_coul_gauss_dsf.yaml @@ -0,0 +1,99 @@ +--- +lammps_version: 4 Jul 2026 +tags: generated +date_generated: Fri Jul 10 15:59:46 2026 +epsilon: 2.5e-13 +skip_tests: +prerequisites: | + atom full + pair buck6d/coul/gauss/dsf +pre_commands: "" +post_commands: | + pair_modify mix arithmetic + pair_modify shift yes +input_file: in.fourmol +pair_style: buck6d/coul/gauss/dsf 0.9 8.0 +pair_coeff: | + * * 6157.8178 3.4682081 129.19572 0.78772886 0.73006542 + 1 1 10304.0 3.0612245 457.17971 4.5218516 0.60800971 + 2 2 3680.0 4.0 32.805 0.10690769 0.9771554 + 3 3 10304.0 3.0769231 443.36171 4.2093581 0.60800971 + 4 4 10856.0 3.2967033 308.7755 1.6022517 0.63272774 + 5 5 10856.0 3.2967033 308.7755 1.6022517 0.63272774 +extract: | + buck6d1 2 + buck6d2 2 + buck6d3 2 + buck6d4 2 + cut_ljsq 2 + rsmooth_sq 2 +natoms: 29 +init_vdwl: 226.74234437878033 +init_coul: 480.3385018045421 +init_stress: |2- + 7.7063806905054878e+02 5.4269141656429395e+02 7.2663154234248418e+02 2.4527852913690725e+02 1.9570276172259747e+02 -9.9238129462920899e+00 +init_forces: |2 + 1 -4.2047897176010608e+01 -2.3653832945870285e+01 6.6975557329130808e+01 + 2 5.5871124086628093e+01 4.4737136179443908e+01 -6.5063476042111958e+01 + 3 1.0532158544095450e+01 2.2436928464068990e+00 -9.8546031477346041e+00 + 4 -2.5746948543552207e+01 4.2148147890622285e+00 -1.8673318431403505e+01 + 5 -1.0413699962350986e+01 -1.6354348268684344e+01 3.4388966617622309e+01 + 6 -2.4928813043425198e+01 2.2680890052133794e+01 2.2633766518359682e+01 + 7 -4.8324639462603818e+00 -8.2156578680771322e+00 -5.1692211387450691e+01 + 8 -1.3176731041125771e+01 -3.2407730234917395e+01 -7.2515903920530690e+01 + 9 1.9244033080082605e+01 3.0215663894827824e+01 1.0806398740884453e+02 + 10 -1.5462002611509157e-01 -9.7403593197454477e+00 1.6180573602449456e+01 + 11 -8.4131743328637043e+00 -2.3121336516497905e+01 -2.6348404663073815e+01 + 12 8.1589572555382972e+00 -2.3751559868791352e+00 8.3734430292230257e+00 + 13 3.0194418725881967e+01 -1.1070824960151317e+01 -9.9821749185272224e-01 + 14 -4.8514115386943670e+00 3.9856871342148876e+00 -3.5458894392188625e+01 + 15 5.4493066795211522e+00 3.3309419853575825e+01 9.0337231124435071e+00 + 16 2.3267930643325016e+01 -2.5511001828618276e+01 -3.2884985233738902e+01 + 17 -1.7062358065837618e+01 1.0782088624243984e+01 4.5946358209883734e+01 + 18 -1.2235487708296645e+01 -4.4111422284771621e+01 1.5974825475564484e+02 + 19 -8.2727814000290735e+01 -5.5349745166009917e+01 -9.6491358621509505e+01 + 20 9.4479058378763497e+01 9.9369766988005978e+01 -6.1322574591580683e+01 + 21 -4.7275689998462610e+01 -5.4319014795217896e+01 1.6153948413653816e+02 + 22 -8.0848364880588520e+01 -2.0558923125323183e+01 -1.2334868562986337e+02 + 23 1.2753545546107300e+02 7.5501310236313500e+01 -3.7557310033381654e+01 + 24 3.2620776544133733e+01 -1.4536791581334737e+02 8.3091468339261425e+01 + 25 -1.1265948254668372e+02 1.5233633660538578e+01 -9.3898152945234784e+01 + 26 7.9491575169137064e+01 1.2978239073921878e+02 1.0217966076210168e+01 + 27 2.5728752131047727e+01 -1.5870349119085796e+02 5.7681301416503757e+01 + 28 -1.2267419415460876e+02 4.9893325469762196e+01 -8.2276086206877281e+01 + 29 9.7475604265939310e+01 1.0891093983722081e+02 2.4509332186417467e+01 +run_vdwl: 225.89514610424752 +run_coul: 479.63218665277554 +run_stress: |2- + 7.6880483575291908e+02 5.4075822740503565e+02 7.2301253399851237e+02 2.4396079617618000e+02 1.9638673618213971e+02 -8.4043795050956405e+00 +run_forces: |2 + 1 -4.1711731114613954e+01 -2.3473786497941965e+01 6.6341484027954934e+01 + 2 5.5496931435801173e+01 4.4495570623731851e+01 -6.4431694545640838e+01 + 3 1.0387099578759054e+01 2.2918730875948441e+00 -9.7759294900077602e+00 + 4 -2.5589911312071909e+01 4.1701940624866145e+00 -1.8596322778512814e+01 + 5 -1.0383531494119762e+01 -1.6305347095859965e+01 3.4227106757019357e+01 + 6 -2.4867608750749536e+01 2.2671166977727093e+01 2.2552631817525445e+01 + 7 -4.8281363484148336e+00 -8.2229925451385384e+00 -5.1549034783674763e+01 + 8 -1.3062582194917429e+01 -3.2122541255748587e+01 -7.1671006812880421e+01 + 9 1.9040598629762435e+01 2.9940036652115399e+01 1.0714977893133721e+02 + 10 -2.0603162806379485e-01 -9.9330259830464449e+00 1.5862484576818444e+01 + 11 -8.3282855549187627e+00 -2.2909203928769220e+01 -2.6009387739799838e+01 + 12 8.1996996124241459e+00 -2.4198771205384979e+00 8.0846806210087241e+00 + 13 3.0065317217115510e+01 -1.0973402807626645e+01 -9.8962187618542019e-01 + 14 -4.7608826899307592e+00 3.9335761136449738e+00 -3.5186104250824762e+01 + 15 5.4324012905884027e+00 3.3303330706988810e+01 9.0504465025152463e+00 + 16 2.3252147499988141e+01 -2.5511566821049861e+01 -3.2918551051203053e+01 + 17 -1.7045611874960425e+01 1.0782186567888354e+01 4.5959875493783770e+01 + 18 -1.0475209668706798e+01 -4.2068577553809945e+01 1.5782092469621321e+02 + 19 -8.2564065409913411e+01 -5.5377773727183254e+01 -9.6110565592767216e+01 + 20 9.2555486866382381e+01 9.7357800290144681e+01 -5.9770059229934837e+01 + 21 -4.7199899320053582e+01 -5.3764405575952850e+01 1.6063135261542291e+02 + 22 -8.0637374924437950e+01 -2.0627688941143330e+01 -1.2267014817438935e+02 + 23 1.2724823118128879e+02 7.5014420129610230e+01 -3.7327346288897260e+01 + 24 3.3109726494011703e+01 -1.4529118627174853e+02 8.3305785423715420e+01 + 25 -1.1313431167658220e+02 1.5103389731521387e+01 -9.4342762180037269e+01 + 26 7.9477361466136486e+01 1.2983713292095970e+02 1.0448240199930945e+01 + 27 2.5864211479215427e+01 -1.5801585214891745e+02 5.7172391800708461e+01 + 28 -1.2224463994308796e+02 4.9684500447772749e+01 -8.1839166923286683e+01 + 29 9.6910601154069468e+01 1.0843204996228829e+02 2.4580518254088268e+01 +... diff --git a/unittest/force-styles/tests/mol-pair-buck6d_coul_gauss_long.yaml b/unittest/force-styles/tests/mol-pair-buck6d_coul_gauss_long.yaml new file mode 100644 index 00000000000..bd6abd76c5b --- /dev/null +++ b/unittest/force-styles/tests/mol-pair-buck6d_coul_gauss_long.yaml @@ -0,0 +1,103 @@ +--- +lammps_version: 4 Jul 2026 +tags: generated +date_generated: Fri Jul 10 15:59:48 2026 +epsilon: 5e-12 +skip_tests: +prerequisites: | + atom full + pair buck6d/coul/gauss/long + kspace ewald +pre_commands: "" +post_commands: | + pair_modify mix arithmetic + pair_modify table 0 + kspace_style ewald 1.0e-6 + kspace_modify gewald 0.3 + kspace_modify compute no +input_file: in.fourmol +pair_style: buck6d/coul/gauss/long 0.9 0.9 8.0 +pair_coeff: | + * * 6157.8178 3.4682081 129.19572 0.78772886 0.73006542 + 1 1 10304.0 3.0612245 457.17971 4.5218516 0.60800971 + 2 2 3680.0 4.0 32.805 0.10690769 0.9771554 + 3 3 10304.0 3.0769231 443.36171 4.2093581 0.60800971 + 4 4 10856.0 3.2967033 308.7755 1.6022517 0.63272774 + 5 5 10856.0 3.2967033 308.7755 1.6022517 0.63272774 +extract: | + buck6d1 2 + buck6d2 2 + buck6d3 2 + buck6d4 2 + cut_ljsq 2 + rsmooth_sq 2 +natoms: 29 +init_vdwl: 226.74234437878033 +init_coul: 260.94796317847465 +init_stress: |2- + 4.4657456744649278e+02 3.2466755380514587e+02 4.2394395057894957e+02 1.1650347053201020e+02 9.7313246437911246e+01 -6.7169886875253200e+00 +init_forces: |2 + 1 -2.3324652269431063e+01 -9.4087991158801607e+00 4.4498401072658531e+01 + 2 3.6852707549068022e+01 2.9649714261028514e+01 -4.2711479235913629e+01 + 3 1.0483261264372620e+01 1.0682925964966903e+00 -1.0326865892016201e+01 + 4 -2.5382815297181853e+01 4.6529884045021710e+00 -1.8057771085107934e+01 + 5 -1.0214935587712853e+01 -1.5129053753250018e+01 3.4069153882600183e+01 + 6 -6.5193390889653147e+00 1.0024721546842303e+00 -1.3709232699931679e+00 + 7 -7.3367657098549071e+00 1.3675236252886699e-01 -1.9099280183998502e+01 + 8 -2.1400888075790668e+01 -1.2431432164967116e+01 -5.0617197128307708e+01 + 9 1.2811981482456448e+01 2.1785289353589320e+01 7.7365016520431823e+01 + 10 -2.0554323651032309e+00 -4.5299348544034244e+00 1.5373417700317630e+01 + 11 -8.7201081504821136e+00 -2.3004901915517038e+01 -2.7282292691939652e+01 + 12 9.7083895933329742e+00 -1.3111081663881528e+00 6.4407265034400432e+00 + 13 2.6524569526074313e+01 -9.6097862155991844e+00 -9.7016972949776892e-01 + 14 -3.3363333023692343e+00 3.6103019598510460e+00 -3.1557117094470307e+01 + 15 5.4147402023111058e+00 2.9260231940052709e+01 7.7599425329467939e+00 + 16 1.2825425684629156e+01 -1.8585837756042327e+01 -3.0112111184401052e-01 + 17 -5.1253428778089729e+00 2.8072945499418998e+00 1.4992348612695803e+01 + 18 -7.8055372456548815e+00 -2.0005685192116367e+01 6.8303173570897442e+01 + 19 -3.7498591808002097e+01 -2.6461999331009647e+01 -4.0292613326985780e+01 + 20 4.4724121875344785e+01 4.6258905771037014e+01 -2.6088427736873975e+01 + 21 -2.1927317053986851e+01 -2.3569445341828747e+01 7.0731062462675254e+01 + 22 -3.9113679187156507e+01 -1.0989334087426483e+01 -5.5269071605819782e+01 + 23 6.0495725055508487e+01 3.5103740024018592e+01 -1.4840378782437865e+01 + 24 1.3215603243554852e+01 -6.4200346263479773e+01 3.5371577325569753e+01 + 25 -5.2455670094693311e+01 4.3915119802285707e+00 -4.2604231240150071e+01 + 26 3.8670079509573050e+01 5.9452886470235363e+01 6.5520012825259668e+00 + 27 1.2931408373140528e+01 -6.9419922074418722e+01 2.6321424093717731e+01 + 28 -5.8846395580372871e+01 2.1212927938717918e+01 -3.8762342982671534e+01 + 29 4.6405790335200400e+01 4.8264276465414220e+01 1.2373037537550887e+01 +run_vdwl: 226.35962757738025 +run_coul: 260.9287977411756 +run_stress: |2- + 4.4634084576002641e+02 3.2390572158990983e+02 4.2220646139817734e+02 1.1605115270359273e+02 9.8199500515736887e+01 -5.9255557712282441e+00 +run_forces: |2 + 1 -2.3127731069177923e+01 -9.3168113317437378e+00 4.4104919972857061e+01 + 2 3.6621826473630705e+01 2.9499597025229047e+01 -4.2320837397758211e+01 + 3 1.0339786579060709e+01 1.1114322027049943e+00 -1.0250081482104232e+01 + 4 -2.5229989208957004e+01 4.6069151155150072e+00 -1.7982503870058100e+01 + 5 -1.0184742265830197e+01 -1.5080224834063539e+01 3.3909226076104957e+01 + 6 -6.4869707715727634e+00 9.9903585449064825e-01 -1.3763874238726566e+00 + 7 -7.3288584197047326e+00 1.3329936932029782e-01 -1.9053153320581842e+01 + 8 -2.1316774391748268e+01 -1.2247893507419521e+01 -5.0044197092510885e+01 + 9 1.2663381905321977e+01 2.1609110151406206e+01 7.6751169950160673e+01 + 10 -2.1073230749794818e+00 -4.7310601429707013e+00 1.5048918884386548e+01 + 11 -8.6327796163333694e+00 -2.2791899249269004e+01 -2.6934493519516458e+01 + 12 9.7389886392588547e+00 -1.3565548225448751e+00 6.1756024860959169e+00 + 13 2.6405668423263400e+01 -9.5248976949160262e+00 -9.6153022326881898e-01 + 14 -3.2528672452656937e+00 3.5650994214812233e+00 -3.1304785462653609e+01 + 15 5.4051030263392263e+00 2.9262174960573798e+01 7.7725435919653494e+00 + 16 1.2812530807154587e+01 -1.8573110156457204e+01 -3.4076667966947582e-01 + 17 -5.1146570104975897e+00 2.7965374339771074e+00 1.5007853588555740e+01 + 18 -6.5839649106363183e+00 -1.8704922644643567e+01 6.7475964350187766e+01 + 19 -3.7557281697507825e+01 -2.6551914440579214e+01 -4.0319708636488961e+01 + 20 4.3561586433030527e+01 4.5050225898884719e+01 -2.5231958898546694e+01 + 21 -2.2011846317803158e+01 -2.3441803446671184e+01 7.0613280064361618e+01 + 22 -3.9146773495800481e+01 -1.1045867664683909e+01 -5.5171538023681698e+01 + 23 6.0613249985111572e+01 3.5031370914253266e+01 -1.4820335179609570e+01 + 24 1.3646168305671896e+01 -6.4633576387847441e+01 3.5814750717179550e+01 + 25 -5.3134014039589630e+01 4.3914316297681530e+00 -4.3191575028907117e+01 + 26 3.8918340851729738e+01 5.9887463856826301e+01 6.6977050905068625e+00 + 27 1.3065161088177362e+01 -6.9376005111547556e+01 2.6209672996151149e+01 + 28 -5.8888184988090828e+01 2.1208205692996373e+01 -3.8723862888769013e+01 + 29 4.6312966005744720e+01 4.8224641907930348e+01 1.2446107359484136e+01 +... diff --git a/unittest/force-styles/tests/mol-pair-hbond_dreiding_lj_angleoffset.yaml b/unittest/force-styles/tests/mol-pair-hbond_dreiding_lj_angleoffset.yaml index 8b287d131d4..bef26297367 100644 --- a/unittest/force-styles/tests/mol-pair-hbond_dreiding_lj_angleoffset.yaml +++ b/unittest/force-styles/tests/mol-pair-hbond_dreiding_lj_angleoffset.yaml @@ -1,94 +1,93 @@ --- -lammps_version: 19 Nov 2024 -tags: -date_generated: Sat Feb 1 01:59:00 2025 +lammps_version: 4 Jul 2026 +tags: generated +date_generated: Fri Jul 10 15:57:00 2026 epsilon: 1e-12 skip_tests: single -prerequisites: ! | +prerequisites: | atom full pair hbond/dreiding/lj/angleoffset -pre_commands: ! | +pre_commands: | variable newton_pair delete if "$(is_active(package,gpu)) > 0.0" then "variable newton_pair index off" else "variable newton_pair index on" -post_commands: ! | +post_commands: | pair_modify mix arithmetic input_file: in.fourmol -pair_style: ! | - hybrid/overlay zero 8.0 hbond/dreiding/lj/angleoffset 4 6.5 8.0 120.0 170.0 -pair_coeff: ! | +pair_style: hybrid/overlay zero 8.0 hbond/dreiding/lj/angleoffset 4 6.5 8.0 90.0 160.0 +pair_coeff: | * * zero - 1 1 hbond/dreiding/lj/angleoffset 2 i 9.5 2.75 4 9.0 11.0 120.0 135.0 - 4 4 hbond/dreiding/lj/angleoffset 2 j 9.5 2.75 4 9.0 11.0 120.0 135.0 - 4 4 hbond/dreiding/lj/angleoffset 2 i 9.5 2.75 4 9.0 11.0 120.0 135.0 - 5 5 hbond/dreiding/lj/angleoffset 2 i 9.5 2.75 4 9.0 11.0 120.0 135.0 -extract: ! "" + 1 1 hbond/dreiding/lj/angleoffset 2 i 9.5 2.75 4 9.0 11.0 90.0 160.0 + 4 4 hbond/dreiding/lj/angleoffset 2 j 9.5 2.75 4 9.0 11.0 90.0 160.0 + 4 4 hbond/dreiding/lj/angleoffset 2 i 9.5 2.75 4 9.0 11.0 90.0 160.0 + 5 5 hbond/dreiding/lj/angleoffset 2 i 9.5 2.75 4 9.0 11.0 90.0 160.0 +extract: "" natoms: 29 -init_vdwl: -2.3677535566368935 +init_vdwl: -0.15651052189287037 init_coul: 0 -init_stress: ! |- - -1.0045680035486175e+01 -8.9577355727195993e+00 -1.2636161391811950e+01 -5.1466987876289050e+00 2.0475277327527350e+00 4.2475890759914384e-02 -init_forces: ! |2 +init_stress: |- + -6.3043822610017586e-01 -5.3599672690639510e-01 -9.9284214252700265e-01 -4.0533504303408191e-01 1.4651322130904197e-02 2.8524527504436303e-01 +init_forces: |2 1 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 2 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 3 8.8002467435548193e-01 -1.9374380093943135e-02 -1.3536614910869868e-01 + 3 1.4280897975080531e-01 4.3692503462274310e-02 -1.4336532895563190e-03 4 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 5 1.3994133933759717e-01 -7.3155075285514681e-02 -1.3232679875280684e-01 - 6 2.3390276639450658e+00 1.3929632368873501e+00 -1.2721862719425576e+00 - 7 4.1378726621178624e-01 1.4354926433685329e+00 -1.5148780956797432e+00 + 5 1.3285799497512739e-02 -8.6676051648596104e-03 -9.1130871715392626e-03 + 6 3.3354840426902760e-02 9.7364961118054011e-02 -2.3629740795676438e-02 + 7 -3.6902848634715046e-04 1.3081265273520426e-01 -2.2612378329346391e-01 8 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 9 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 10 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 10 -3.1686351036589880e-05 -1.6766064964004426e-05 9.8758994706439550e-05 11 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 12 5.9015854095579225e+00 3.5912219879960170e+00 -2.6982007191973478e+00 - 13 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 14 -2.6278669841375901e+00 9.0634523961625268e-01 5.9886902565918279e+00 - 15 -6.5782792369352947e+00 -5.8399272399216393e+00 -1.7748671177613611e+00 - 16 -5.4432866123182044e-02 4.1926230801477830e-02 2.4256800170944302e-02 + 12 5.6679992891779540e-01 2.2744479259926054e-01 -4.1405055769407763e-02 + 13 -4.0937507683839298e-04 -1.6831633931564666e-04 2.7332752166039974e-04 + 14 -1.0438089666551963e-01 3.4173749110091467e-02 1.6535358611811046e-01 + 15 -6.4852190260622145e-01 -3.9527988106076867e-01 -9.3070653497505401e-02 + 16 -2.9056878934002666e-03 1.4565623402275920e-03 2.9265178892079035e-03 17 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 18 -1.0871996511157387e+00 3.3551409695514178e-01 -3.0926556481030198e+00 - 19 6.7341238490395261e-01 -1.7710067403236747e+00 4.6075337437827635e+00 + 18 -2.9283305586414329e-02 2.4181432002276149e-01 -4.8416130323478462e-01 + 19 2.9652334072761480e-02 -3.7262697275796575e-01 7.1028508652824851e-01 20 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 21 -2.7876953392389707e-04 1.0283971202469113e-03 -3.6286426408601755e-04 - 22 -6.0652568570342129e-05 1.3910982920033031e-04 3.7172924026368406e-04 - 23 -6.2442440344617252e-05 -9.5945259168002753e-04 1.5599078808312826e-03 - 24 1.4854091583690126e-03 -3.3779115055948103e-03 -2.1121972529056102e-03 - 25 1.5295889868017791e-03 3.5601939758821144e-03 2.5504843102412507e-03 - 26 -4.5638989769642710e-03 -6.8787166242053649e-06 -9.4015250206157545e-04 - 27 1.6523714187438286e-03 5.3787962886091178e-05 5.2266217830512042e-05 - 28 5.2779759112695271e-04 -7.4917632698195269e-05 1.8921402956884896e-04 - 29 -2.2940363523844541e-04 -3.6232844161820845e-04 -1.3083876596823750e-03 -run_vdwl: -2.379228402118846 + 21 -2.8373291424446846e-04 4.4775406929564954e-04 4.5755180711862177e-04 + 22 2.0313974715280907e-05 7.1771391950858638e-05 5.6185991557176761e-06 + 23 1.0199636009040285e-04 -3.4190155287343755e-04 6.1702902453470928e-04 + 24 4.9087736273222763e-04 -2.0538417104211553e-03 -9.1751174445067816e-04 + 25 3.8451198191707985e-04 1.6255981792260099e-03 8.9605073773784218e-04 + 26 -1.6673689149864731e-03 2.8789814135263226e-04 -3.9026140721294911e-04 + 27 1.9287961872685258e-03 2.0570272262346575e-04 2.7262028718089631e-05 + 28 -7.2395465868175390e-05 -7.1527904514651823e-04 -1.0347053936759976e-04 + 29 -9.0299857162440072e-04 4.7229780399249454e-04 -5.9226850623375334e-04 +run_vdwl: -0.159005292217927 run_coul: 0 -run_stress: ! |- - -1.0110414920977702e+01 -9.0215523007276754e+00 -1.2645865635634689e+01 -5.1718839774827590e+00 2.0178372157739379e+00 2.5665175333437745e-02 -run_forces: ! |2 +run_stress: |- + -6.4054419382342842e-01 -5.4694619412862722e-01 -1.0014755554871573e+00 -4.1289519310954276e-01 9.9491793542894058e-03 2.8802836999330567e-01 +run_forces: |2 1 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 2 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 3 8.8127873295642833e-01 -1.9906544411239159e-02 -1.3420880187550055e-01 + 3 1.4443282239484889e-01 4.3731688703324147e-02 -1.3152971472048160e-03 4 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 5 1.3979875602374409e-01 -7.3044778443509720e-02 -1.3219644950350101e-01 - 6 2.3607870936024593e+00 1.4018820611429474e+00 -1.2583912360420162e+00 - 7 4.1726462115180585e-01 1.4458787085463951e+00 -1.5242839951128935e+00 + 5 1.3301711092062386e-02 -8.6746089220337726e-03 -9.1261494284105207e-03 + 6 3.4765071972680972e-02 9.9952309004325599e-02 -2.1812991958008912e-02 + 7 -3.2621905854401945e-05 1.3322938350881700e-01 -2.2945086415264010e-01 8 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 9 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 10 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 10 -3.2059666716513154e-05 -1.6915407703442760e-05 9.9782669221246901e-05 11 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 12 5.9050640418818130e+00 3.6256092909015694e+00 -2.6563352814327175e+00 - 13 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 14 -2.6135516025239336e+00 9.1007161593352315e-01 5.9617631587237359e+00 - 15 -6.6189841741764646e+00 -5.8865084117974442e+00 -1.8048530523320536e+00 - 16 -5.4392847764046806e-02 4.1896766674153194e-02 2.4221662462054185e-02 + 12 5.7281303195835942e-01 2.3277506083369803e-01 -3.7769104159433430e-02 + 13 -3.8430292891758683e-04 -1.5864374029367579e-04 2.5663427582304506e-04 + 14 -1.0300024907602189e-01 3.3958790756414274e-02 1.6325860808741827e-01 + 15 -6.5897697559741442e-01 -4.0304226478663785e-01 -9.6511286943645608e-02 + 16 -2.9190501488812635e-03 1.4745835589066970e-03 2.9198046042407037e-03 17 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 18 -1.0986720982372553e+00 3.3177691431700151e-01 -3.1121489457325686e+00 - 19 6.8140747708544935e-01 -1.7776556228633966e+00 4.6364329408454621e+00 + 18 -3.0799759574224830e-02 2.4403501408395875e-01 -4.9137663341348614e-01 + 19 3.0832381480079232e-02 -3.7726439759277575e-01 7.2082749756612619e-01 20 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 21 -2.7652686557041810e-04 1.0281905758111819e-03 -3.6821986741366670e-04 - 22 -6.1013835436670601e-05 1.3982244857931519e-04 3.7489037941312067e-04 - 23 -6.5141398761843470e-05 -9.6018466043676387e-04 1.5632647138356425e-03 - 24 1.4916559367037121e-03 -3.3866617725795425e-03 -2.1034085744246556e-03 - 25 1.5289061878072103e-03 3.5683754233383188e-03 2.5504661476227876e-03 - 26 -4.5679115405371055e-03 -6.0750808851146922e-06 -9.4923524150980292e-04 - 27 1.6481334338488271e-03 5.2157477724774604e-05 5.8087954829178114e-05 - 28 5.2782765352719463e-04 -7.4981190270347932e-05 1.8718391398083104e-04 - 29 -2.2592957158090753e-04 -3.6064322128182149e-04 -1.3130294263334345e-03 + 21 -2.8385135134523866e-04 4.4913459365386967e-04 4.5437901788849031e-04 + 22 2.0266445740167594e-05 7.1707455667882695e-05 5.5943676270554414e-06 + 23 1.0138910500097379e-04 -3.4376854732778178e-04 6.2099634436156917e-04 + 24 4.9486819906426982e-04 -2.0532631433096893e-03 -9.1079190075680670e-04 + 25 3.8204833621188468e-04 1.6242046857948078e-03 8.9260213752779497e-04 + 26 -1.6682731322801305e-03 2.8870355951501404e-04 -3.9315976440517470e-04 + 27 1.9245621208168126e-03 2.0543421166280127e-04 3.4775985225781131e-05 + 28 -7.1220416802785712e-05 -7.1535051129483786e-04 -1.0513746220959511e-04 + 29 -8.9978930640595314e-04 4.7319769563793399e-04 -5.9925872525911435e-04 ... diff --git a/unittest/force-styles/tests/mol-pair-hbond_dreiding_morse_angleoffset.yaml b/unittest/force-styles/tests/mol-pair-hbond_dreiding_morse_angleoffset.yaml index b412833fbac..5b1b48234ec 100644 --- a/unittest/force-styles/tests/mol-pair-hbond_dreiding_morse_angleoffset.yaml +++ b/unittest/force-styles/tests/mol-pair-hbond_dreiding_morse_angleoffset.yaml @@ -1,94 +1,94 @@ --- -lammps_version: 19 Nov 2024 -tags: -date_generated: Sat Feb 1 01:58:54 2025 +lammps_version: 4 Jul 2026 +tags: generated +date_generated: Fri Jul 10 15:57:01 2026 epsilon: 1e-12 skip_tests: single -prerequisites: ! | +prerequisites: | atom full pair hbond/dreiding/morse/angleoffset -pre_commands: ! | +pre_commands: | variable newton_pair delete if "$(is_active(package,gpu)) > 0.0" then "variable newton_pair index off" else "variable newton_pair index on" -post_commands: ! | +post_commands: | pair_modify mix arithmetic input_file: in.fourmol -pair_style: ! | - hybrid/overlay zero 8.0 hbond/dreiding/morse/angleoffset 2 6.5 8.0 120.0 170.0 -pair_coeff: ! | +pair_style: hybrid/overlay zero 8.0 hbond/dreiding/morse/angleoffset 2 6.5 8.0 90.0 + 160.0 +pair_coeff: | * * zero - 1 1 hbond/dreiding/morse/angleoffset 2 i 3.88 1.7241379 2.9 2 9.0 11.0 120.0 135.0 - 4 4 hbond/dreiding/morse/angleoffset 2 j 3.88 1.7241379 2.9 2 9.0 11.0 120.0 135.0 - 4 4 hbond/dreiding/morse/angleoffset 2 i 3.88 1.7241379 2.9 2 9.0 11.0 120.0 135.0 - 5 5 hbond/dreiding/morse/angleoffset 2 i 3.88 1.7241379 2.9 2 9.0 11.0 120.0 135.0 -extract: ! "" + 1 1 hbond/dreiding/morse/angleoffset 2 i 3.88 1.7241379 2.9 2 9.0 11.0 90.0 160.0 + 4 4 hbond/dreiding/morse/angleoffset 2 j 3.88 1.7241379 2.9 2 9.0 11.0 90.0 160.0 + 4 4 hbond/dreiding/morse/angleoffset 2 i 3.88 1.7241379 2.9 2 9.0 11.0 90.0 160.0 + 5 5 hbond/dreiding/morse/angleoffset 2 i 3.88 1.7241379 2.9 2 9.0 11.0 90.0 160.0 +extract: "" natoms: 29 -init_vdwl: -3.5096377325675956 +init_vdwl: -0.8739956100645457 init_coul: 0 -init_stress: ! |- - -6.3186200946929167e+00 -7.9368239482189518e+00 -1.0134945857423238e+01 -3.2246711803230022e+00 2.2254089978037950e+00 5.7539194539906990e-01 -init_forces: ! |2 +init_stress: |- + -1.7096938377237212e+00 -1.8519890485874362e+00 -3.4245377571600555e+00 -1.2221710870771088e+00 6.6969970018693536e-01 4.8468743943745657e-01 +init_forces: |2 1 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 2 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 3 1.4240904755256723e+00 -3.2950514965566280e-01 -3.1290177991003543e-01 + 3 3.8377974554416627e-01 9.1125804948353858e-02 -4.8556981909908141e-02 4 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 5 2.7142170689071471e-01 -1.4188713282079174e-01 -2.5665300728775797e-01 - 6 -1.4801586142214629e-01 1.0699386611410953e+00 -6.0135661447512467e-01 - 7 5.3518589817461271e-01 1.5272896498257909e+00 -1.3921449698629449e+00 + 5 1.7000037415835556e-01 -1.0990631228087336e-01 -1.2399011309834942e-01 + 6 -8.3720620531016171e-02 3.7574089092216284e-01 -1.5460263773115374e-01 + 7 6.0762835813253008e-02 4.3530052346353532e-01 -6.0906884800619265e-01 8 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 9 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 10 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 10 -6.7622778144724475e-03 -2.6011021651900232e-03 1.9147523603011488e-02 11 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 12 4.5616750731557225e+00 2.0016733409712275e+00 -2.1448376884234586e+00 - 13 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 14 -1.8837854472607014e+00 7.6104772633690498e-01 4.2961043227589402e+00 - 15 -4.0673035407237705e+00 -3.4997007371179505e+00 -1.0171200059632148e+00 - 16 -1.5808240616549102e-01 1.3843329114517686e-01 3.6764773300651435e-02 + 12 2.0373440409028905e+00 5.0583665220318508e-01 -4.9446120046384001e-01 + 13 -2.5830766093013553e-02 -1.0620431571145953e-02 1.7246431642393378e-02 + 14 -6.6351769369631608e-01 2.5069759740523134e-01 1.0324182602405192e+00 + 15 -1.7819133788753172e+00 -1.1131974473592077e+00 -2.7770844856467725e-01 + 16 -2.9379423595276934e-02 1.2924347897483871e-02 3.0507166282004415e-02 17 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 18 -1.1060472607021432e+00 -2.5981768517950421e-02 -2.5137276422698869e+00 - 19 5.7086136252753061e-01 -1.5013078813078404e+00 3.9058726121328320e+00 + 18 -1.3589545794303476e-01 5.0885589507979179e-01 -1.1906404389456124e+00 + 19 7.5132622129781751e-02 -9.4415641854332710e-01 1.7997092869518050e+00 20 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 21 -5.7491418379274713e-04 3.0261624754005732e-04 2.2916473648388361e-04 - 22 -9.8559570221787177e-05 3.0417491975132552e-05 3.4191505184844652e-04 - 23 -1.8859939253140884e-05 -2.8721722164729333e-04 4.6721692184799779e-04 - 24 -8.1837153976642180e-04 -1.3398119484861689e-03 -1.2272376761381647e-03 - 25 6.0616687122078659e-04 1.4446755158460632e-03 1.0295960060226405e-03 - 26 -1.8906126645904103e-03 4.9943203686937775e-06 -3.5691568809749410e-04 - 27 2.0423960483977994e-03 -5.7673276886988751e-04 -4.5157450544399075e-04 - 28 8.9811985390184752e-04 4.2254804752218743e-04 4.1501145451916749e-04 - 29 -1.4536487589592609e-04 -1.4896842487842051e-06 -4.4717630104248622e-04 -run_vdwl: -3.517286804292988 + 21 -4.6757220384142299e-04 2.0695351134531284e-04 3.4704481498539625e-04 + 22 -3.0388731809066248e-05 1.1754493111877699e-05 5.3820496938677202e-05 + 23 5.1665435235464172e-05 -1.7693926463483001e-04 3.2349416227903631e-04 + 24 -4.4435728224244918e-04 -1.3335215426597408e-03 -7.3527450583853540e-04 + 25 2.6406752532673653e-04 1.1132406872755660e-03 6.1372997311883262e-04 + 26 -1.2403125882605908e-03 2.2227397236766712e-04 -2.4579176179456751e-04 + 27 2.0523822662555174e-03 -6.6085419246072119e-05 -3.8170101102491507e-05 + 28 1.0288261252827892e-04 -6.2411184314712767e-05 2.2193303319614043e-05 + 29 -2.8836703319246764e-04 8.4734746754931863e-05 -3.4104638190596200e-04 +run_vdwl: -0.8801888584785049 run_coul: 0 -run_stress: ! |- - -6.3410166553407770e+00 -7.9592758161065280e+00 -1.0138049334443931e+01 -3.2256302506163523e+00 2.2149336994073563e+00 5.6372209224133285e-01 -run_forces: ! |2 +run_stress: |- + -1.7212426179722033e+00 -1.8711245274909369e+00 -3.4310852738544519e+00 -1.2301496736251032e+00 6.6218496304763497e-01 4.8531325809015807e-01 +run_forces: |2 1 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 2 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 3 1.4231484312527738e+00 -3.3026042763239660e-01 -3.1153835350334336e-01 + 3 3.8558149722265112e-01 9.0302402409211419e-02 -4.8004715071028096e-02 4 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 5 2.7099603671016548e-01 -1.4159530161432804e-01 -2.5625897291352556e-01 - 6 -1.3797104870631000e-01 1.0696976402082368e+00 -5.9816503713785374e-01 - 7 5.3745728250810021e-01 1.5326650906404748e+00 -1.3957261111901145e+00 + 5 1.7006495826458862e-01 -1.0989903304178200e-01 -1.2407942906025707e-01 + 6 -8.2307332727588958e-02 3.7871069746654434e-01 -1.5162274584580970e-01 + 7 6.2155073140098688e-02 4.3937763874992997e-01 -6.1270946596338893e-01 8 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 9 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 10 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 10 -6.7930259108720647e-03 -2.6003939823884747e-03 1.9201103649060334e-02 11 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 12 4.5521103945743580e+00 2.0088383351389192e+00 -2.1283471349150886e+00 - 13 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 14 -1.8784184443631613e+00 7.6474554806201334e-01 4.2874324751701529e+00 - 15 -4.0719618931452484e+00 -3.5097154339717243e+00 -1.0297921201340294e+00 - 16 -1.5790347632257765e-01 1.3828963980927983e-01 3.6669143433687226e-02 + 12 2.0400951814639132e+00 5.1211112976900319e-01 -4.8611158654114839e-01 + 13 -2.5458439260230416e-02 -1.0509443193237728e-02 1.7000915719290625e-02 + 14 -6.6002270195488744e-01 2.5075453219573185e-01 1.0274982770705390e+00 + 15 -1.7917338329656716e+00 -1.1224221641144081e+00 -2.8390025882620751e-01 + 16 -2.9426304131902566e-02 1.3552272491325427e-02 3.0018438905560833e-02 17 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 18 -1.1129608926078332e+00 -3.1255647589324198e-02 -2.5201773431404120e+00 - 19 5.7550361009973294e-01 -1.5014094430511506e+00 3.9159034543305267e+00 + 18 -1.3960138028349017e-01 5.0813238997117638e-01 -1.1976917923884141e+00 + 19 7.7446307143391485e-02 -9.4751002872110635e-01 1.8104012583518028e+00 20 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 21 -5.7505641109121207e-04 3.0214223626672459e-04 2.2825265859075745e-04 - 22 -9.8550382447785582e-05 3.0815868769738694e-05 3.4333792723925015e-04 - 23 -1.9668835533933137e-05 -2.8708711486036183e-04 4.6769002148283145e-04 - 24 -8.1540973361977085e-04 -1.3444963521802775e-03 -1.2242390653782144e-03 - 25 6.0633878322232954e-04 1.4494406392014422e-03 1.0305743705191716e-03 - 26 -1.8923460324841970e-03 5.3377648171984155e-06 -3.6057802041638512e-04 - 27 2.0400880126746315e-03 -5.7744782180381698e-04 -4.4877347378119149e-04 - 28 8.9837453242585911e-04 4.2277075888104101e-04 4.1392975505448524e-04 - 29 -1.4376993314592140e-04 -1.4759790916891481e-06 -4.5019417331070537e-04 + 21 -4.6723817306165520e-04 2.0714194707907319e-04 3.4599088761077141e-04 + 22 -3.0838484718087030e-05 1.1818087511009299e-05 5.4694197469964407e-05 + 23 5.1153403138819070e-05 -1.7724885832544988e-04 3.2436966199830201e-04 + 24 -4.4102875081645230e-04 -1.3361565276466757e-03 -7.3209362083667662e-04 + 25 2.6308474604263470e-04 1.1154608511715731e-03 6.1310660325297099e-04 + 26 -1.2412955572717555e-03 2.2288017232378838e-04 -2.4797662656472882e-04 + 27 2.0502138345292985e-03 -6.5990177065352801e-05 -3.5442018284220638e-05 + 28 1.0283658400161817e-04 -6.2775114847767074e-05 2.1529645006045949e-05 + 29 -2.8688760184442059e-04 8.4869619799802007e-05 -3.4417872965242864e-04 ... diff --git a/unittest/force-styles/tests/mol-pair-lj_cut_soft_gapsys.yaml b/unittest/force-styles/tests/mol-pair-lj_cut_soft_gapsys.yaml new file mode 100644 index 00000000000..9a7de53c57f --- /dev/null +++ b/unittest/force-styles/tests/mol-pair-lj_cut_soft_gapsys.yaml @@ -0,0 +1,95 @@ +--- +lammps_version: 4 Jul 2026 +tags: generated +date_generated: Fri Jul 10 15:55:01 2026 +epsilon: 7.5e-14 +skip_tests: +prerequisites: | + atom full + pair lj/cut/soft/gapsys +pre_commands: "" +post_commands: | + pair_modify mix arithmetic +input_file: in.fourmol +pair_style: lj/cut/soft/gapsys 0.5 8.0 +pair_coeff: | + 1 1 0.02 2.5 0.64 + 2 2 0.005 1.0 0.64 + 2 4 0.005 0.5 0.64 + 3 3 0.02 3.2 0.64 + 4 4 0.015 3.1 0.64 + 5 5 0.015 3.1 0.64 +extract: | + epsilon 2 + sigma 2 + lambda 2 +natoms: 29 +init_vdwl: 313.92968650816874 +init_coul: 0 +init_stress: |2- + 5.3426904308603002e+02 5.4478789093774583e+02 7.4933561249895399e+02 -4.7857957443699178e+01 7.9807128435687588e+01 6.6294917659861696e+01 +init_forces: |2 + 1 -9.9114065296845304e+00 7.7691452214934742e+01 1.0206266645351666e+02 + 2 4.9941519892639825e+01 4.1091317800011296e+01 -5.8778991802049028e+01 + 3 -4.0366994773964670e+01 -1.0563013895156224e+02 -4.2542003995504651e+01 + 4 -7.8711096705734178e+00 2.1350518625352004e+00 -5.5954532185292409e+00 + 5 -2.5176757267276133e+00 -4.0521510680612858e+00 1.2152704057983797e+01 + 6 -1.0699522416306769e+02 1.1140824174634062e+02 7.1313423678737806e+01 + 7 -2.1256001502209170e+00 -2.6644232999347356e+01 -1.7413877823715322e+02 + 8 -6.2495214205938163e+00 -5.5560138097891700e+00 4.1871512717795561e+01 + 9 2.0185853756510564e+01 2.1757526149017888e+01 8.9354241204079486e+01 + 10 7.6340876360173397e+01 -1.0752566301949558e+02 -2.8783877868235454e+01 + 11 -2.3530157265571860e+00 -5.9077640075588898e+00 -9.6590723956614433e+00 + 12 1.7527155197359406e+01 1.0633119514682475e+01 -7.9254397903886167e+00 + 13 8.0986409580712841e+00 -3.2098088269317295e+00 -1.4896399871387664e-01 + 14 -3.3852721291218528e+00 6.8636181224987958e-01 -8.7507190862837820e+00 + 15 -2.0454999188607306e-01 8.4846165523012136e+00 3.0131615419840618e+00 + 16 6.1442886878069494e+01 -5.0665062286339101e+01 -1.2326099311844003e+02 + 17 -5.1522792768797920e+01 3.5330737042457464e+01 1.3980031713222675e+02 + 18 -1.8862629870158503e-02 -3.3402022492930034e-02 3.1000492146377390e-02 + 19 3.1843079948447594e-04 -2.3918628211596124e-04 1.7427252652160224e-03 + 20 -9.9760831169755002e-04 -1.0209184785886856e-03 3.6910973051849135e-04 + 21 -2.2874557186572172e+01 -2.7722139149532950e+01 8.0870756157467639e+01 + 22 -3.9150029478178944e+01 -9.4872359101021111e+00 -6.1422495641505606e+01 + 23 6.2014658835661344e+01 3.7220886451166201e+01 -1.9437482339083811e+01 + 24 1.6831099117704902e+01 -7.3312034003686307e+01 4.2055754258605582e+01 + 25 -5.5208224405338164e+01 8.8860967934984121e+00 -4.6415185077459057e+01 + 26 3.8364934918497447e+01 6.4414925754142175e+01 4.3362380094970598e+00 + 27 1.2403863363720021e+01 -8.0317752928059818e+01 2.8818337875751510e+01 + 28 -5.9492493237936159e+01 2.5567897070840985e+01 -4.0253531217413133e+01 + 29 4.7096519888195800e+01 5.4756428323541634e+01 1.1430762371632955e+01 +run_vdwl: 313.343497206858 +run_coul: 0 +run_stress: |2- + 5.3448063573219054e+02 5.4455929701481057e+02 7.4785441808798805e+02 -4.7712544901001174e+01 7.9903181633354706e+01 6.6898569402656221e+01 +run_forces: |2 + 1 -9.7674271107952997e+00 7.7548084936692547e+01 1.0170619487257754e+02 + 2 4.9822378460045670e+01 4.1059390379904087e+01 -5.8449461731402643e+01 + 3 -4.0503165435068688e+01 -1.0540960923178146e+02 -4.2462547554267374e+01 + 4 -7.8204621142054993e+00 2.1150957535781059e+00 -5.5732767651069963e+00 + 5 -2.5048318654913619e+00 -4.0347912085895938e+00 1.2100637938004541e+01 + 6 -1.0677441406679094e+02 1.1132895941753566e+02 7.1086163707852450e+01 + 7 -2.0554105547540402e+00 -2.6707680477356259e+01 -1.7360920414748648e+02 + 8 -6.4497747641370733e+00 -5.3677403660003860e+00 4.1838953258968587e+01 + 9 2.0152935970766027e+01 2.1617454177123520e+01 8.9086171713734586e+01 + 10 7.6369244370486442e+01 -1.0758388445529069e+02 -2.8932064595449926e+01 + 11 -2.3195199022850894e+00 -5.8155815640246047e+00 -9.5097861438581290e+00 + 12 1.7507404864305627e+01 1.0579382393256489e+01 -8.0516551284248674e+00 + 13 8.0530379722256900e+00 -3.1756357470105536e+00 -1.4619138779847821e-01 + 14 -3.3416371295866685e+00 6.6493739214524750e-01 -8.6345067363079355e+00 + 15 -2.2254585976763389e-01 8.5025611833417916e+00 3.0369764492236682e+00 + 16 6.1341719178787159e+01 -5.0648759585312050e+01 -1.2316729110298570e+02 + 17 -5.1453755307093338e+01 3.5355390802662150e+01 1.3966460515345932e+02 + 18 -1.8862758183565014e-02 -3.3400206076549366e-02 3.1006850867866725e-02 + 19 3.0898320892798855e-04 -2.4765003886615056e-04 1.7446174249836780e-03 + 20 -9.8664370255265466e-04 -1.0115353374076249e-03 3.6948580242026339e-04 + 21 -2.2914066651778992e+01 -2.7542272491026523e+01 8.0724691068664299e+01 + 22 -3.9219356101400201e+01 -9.5723765764473132e+00 -6.1330089505339195e+01 + 23 6.2123489598269103e+01 3.7126170010990194e+01 -1.9383817471211252e+01 + 24 1.7055333403433025e+01 -7.3444286619114379e+01 4.2216343434970383e+01 + 25 -5.5536183923866311e+01 8.8239581089124908e+00 -4.6708478425085559e+01 + 26 3.8468658196660186e+01 6.4609321689557547e+01 4.4689415529947007e+00 + 27 1.2522560546985488e+01 -8.0289948658769902e+01 2.8674999279476893e+01 + 28 -5.9530584922896608e+01 2.5559443970241205e+01 -4.0201027948674025e+01 + 29 4.7015913566630488e+01 5.4737076156235446e+01 1.1521599259376297e+01 +... From a521065b61eeefa803371c435b5e9d824a597900 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 10 Jul 2026 16:29:28 -0400 Subject: [PATCH 015/100] add force-style tests for bond special, pair agni, and pair local/density - bond style special (MISC): needs special_bonds 0 1 1 and a real pair style with single() support; uses lj/cut via post_commands and the zero nocoeff placeholder during the data file round trip - pair agni (MISC): force-only ML potential, energies are zero by design; the regression kernel sum amplifies last-ulp differences in exp() by several orders of magnitude (e.g. from the OPENMP variant using fm_exp), so the epsilon is intentionally loose at 1e-4 - pair local/density (MANYBODY): single-type LD table taken from the methanol_implicit_water example --- .../force-styles/tests/atomic-pair-agni.yaml | 92 ++++ unittest/force-styles/tests/bond-special.yaml | 100 ++++ .../tests/methanol.localdensity.table | 509 ++++++++++++++++++ .../tests/mol-pair-local_density.yaml | 88 +++ 4 files changed, 789 insertions(+) create mode 100644 unittest/force-styles/tests/atomic-pair-agni.yaml create mode 100644 unittest/force-styles/tests/bond-special.yaml create mode 100644 unittest/force-styles/tests/methanol.localdensity.table create mode 100644 unittest/force-styles/tests/mol-pair-local_density.yaml diff --git a/unittest/force-styles/tests/atomic-pair-agni.yaml b/unittest/force-styles/tests/atomic-pair-agni.yaml new file mode 100644 index 00000000000..27f1b189be2 --- /dev/null +++ b/unittest/force-styles/tests/atomic-pair-agni.yaml @@ -0,0 +1,92 @@ +--- +lammps_version: 4 Jul 2026 +tags: generated +date_generated: Fri Jul 10 16:25:37 2026 +epsilon: 0.0001 +skip_tests: single +prerequisites: | + pair agni +pre_commands: | + variable units index metal +post_commands: "" +input_file: in.metal +pair_style: agni +pair_coeff: | + * * Al_jpc.agni Al Al +extract: "" +natoms: 32 +init_vdwl: 0 +init_coul: 0 +init_stress: |- + -1.8854620788959409e+01 1.9789357976264416e+01 -4.8623788052724040e+00 -1.0868033654703877e+01 -6.7674035901249878e+00 1.4879961878427126e+01 +init_forces: |2 + 1 9.3618459354736672e-01 2.4603716713155137e+00 4.7313203949131832e-01 + 2 -9.1156710584066047e-01 -3.3779398109053744e+00 2.0153991590032803e+00 + 3 -1.2782181118836178e+00 6.9523937591130363e+00 -1.7132259886001719e+00 + 4 8.1078545104362831e-01 -3.9208052859059705e-01 -2.3893235846643819e+00 + 5 1.7285269639233576e+00 5.2297067596355902e+00 1.7589511303941237e+00 + 6 1.6503447769919859e+00 1.4150855541939364e+00 -1.9404822208336725e-01 + 7 -2.3239877511968388e+00 3.3246209873596655e+00 -4.2340723883710041e-01 + 8 -2.7494302642752899e+00 -2.5595540105586423e+00 1.5907585761288630e+00 + 9 4.4332881278940306e-01 -2.2435643262451066e+00 -1.1816100300510897e+00 + 10 -7.8654228702536955e-01 -5.0580824705993308e+00 -4.3891652002220525e+00 + 11 -1.7623700936546101e+00 -2.0324216903408541e+00 1.7737367032805906e+00 + 12 1.0106671658123361e+00 -3.2280329260265006e+00 -4.3781178932405851e-02 + 13 -6.8130914487294092e-01 1.2320261765981542e+00 -1.8802174673636927e+00 + 14 2.2601343133265601e+00 -6.3968538578949108e-01 2.5275911354238616e+00 + 15 -1.4081235965003742e+00 1.3569916235993134e+00 -1.1645260387321485e+00 + 16 4.3130282434413658e+00 -3.5948938549717440e+00 1.4997650674323069e+00 + 17 1.7500512535462605e+00 5.0320219910482393e+00 1.1776421319343910e-01 + 18 -5.2426535505091323e+00 -1.1918485396762861e+00 -2.5791147564759029e+00 + 19 -5.5181614271586312e+00 -2.8052053050359262e+00 1.5102303066069709e+00 + 20 1.0785985766688810e+00 9.0248115554102526e-01 -1.4704780009796394e+00 + 21 6.1527838875318395e+00 1.7175993407855259e+00 2.9815543263801203e-01 + 22 -1.5350133109606645e-02 -3.5076941726019157e+00 -4.4027168855420484e-01 + 23 1.3513791785354243e+00 4.2477437565813290e+00 -3.1473533165862335e+00 + 24 4.4376156945491658e+00 3.4150916944036709e+00 3.1324803485313879e+00 + 25 2.8086230969766603e+00 5.0271523564704523e-01 -1.8710944586654676e+00 + 26 -1.6617850064521207e+00 -5.4018753589352144e+00 4.6805741918052064e+00 + 27 1.6052841787005292e+00 -2.9521577920533559e-02 9.3085312355540850e-02 + 28 4.2325129460193978e-01 2.2234266950527655e+00 2.8091236577148067e+00 + 29 1.5149486950377451e+00 3.9790610774198996e+00 -1.3942907929769888e-01 + 30 -1.7916570761462225e+00 -1.2217545713519229e+00 -3.0993559983780159e+00 + 31 -8.9941449083737268e-01 -4.3793637742509617e+00 2.8233702015841828e+00 + 32 -7.0471410536428465e+00 -2.0685437246446980e+00 -8.2096390325925483e-01 +run_vdwl: 0 +run_coul: 0 +run_stress: |- + -1.8821013768869484e+01 1.9768144126031228e+01 -4.8490384538941145e+00 -1.0835025038587258e+01 -6.7450920092936606e+00 1.4845109787665391e+01 +run_forces: |2 + 1 9.2460177939035759e-01 2.4575137999618875e+00 4.7086070857592688e-01 + 2 -9.1268363122246399e-01 -3.3767110220377816e+00 2.0150840860570298e+00 + 3 -1.2792225991596951e+00 6.9398032688314544e+00 -1.7180026312579884e+00 + 4 8.1283292367704973e-01 -3.9032877415768041e-01 -2.3873466308449878e+00 + 5 1.7273213798890339e+00 5.2225338398257719e+00 1.7616755460167752e+00 + 6 1.6518665320018755e+00 1.4132072693447100e+00 -1.9739469878724947e-01 + 7 -2.3253806623851432e+00 3.3289219197595941e+00 -4.2832128603360786e-01 + 8 -2.7536036120017542e+00 -2.5604746126791014e+00 1.5914844014460670e+00 + 9 4.4752664684899912e-01 -2.2481412262877001e+00 -1.1854446101223601e+00 + 10 -7.7683512021205559e-01 -5.0531995509972347e+00 -4.3784692314674629e+00 + 11 -1.7609950573404802e+00 -2.0356878246401919e+00 1.7700074129516707e+00 + 12 1.0145715401286708e+00 -3.2255370141228212e+00 -4.3637407872594736e-02 + 13 -6.8393876955262556e-01 1.2286248990113364e+00 -1.8766679139097704e+00 + 14 2.2627492324227916e+00 -6.2806576297036543e-01 2.5217027525196301e+00 + 15 -1.4065024991740955e+00 1.3574115876818524e+00 -1.1617488385399355e+00 + 16 4.2993622795457469e+00 -3.5909876496752275e+00 1.4957998172158824e+00 + 17 1.7527297130564676e+00 5.0294175977597462e+00 1.2030866562970743e-01 + 18 -5.2409666235779895e+00 -1.1881294054200424e+00 -2.5811041024734749e+00 + 19 -5.5138442953338398e+00 -2.8050598855351581e+00 1.5054534460196720e+00 + 20 1.0754458998108731e+00 9.0415975086041556e-01 -1.4700619931553973e+00 + 21 6.1503873859310971e+00 1.7102959054301010e+00 3.0005486689158545e-01 + 22 -1.1385427716888330e-02 -3.5031798043509497e+00 -4.3680939816287889e-01 + 23 1.3590824120456801e+00 4.2487040339747892e+00 -3.1376682584395184e+00 + 24 4.4345541354978906e+00 3.4134729328344093e+00 3.1339522489125358e+00 + 25 2.8090124317223655e+00 5.0377344905980692e-01 -1.8708657360856904e+00 + 26 -1.6559839238633884e+00 -5.3935587014292850e+00 4.6788608106563316e+00 + 27 1.6060301969537960e+00 -2.8201967406786821e-02 8.8261943381510832e-02 + 28 4.2311222392716274e-01 2.2251151744986402e+00 2.8076035334507452e+00 + 29 1.5105838189611660e+00 3.9777799044514524e+00 -1.3397919379524126e-01 + 30 -1.7904294635390414e+00 -1.2208591726829781e+00 -3.0963675369729771e+00 + 31 -9.0336178701720371e-01 -4.3807751302828564e+00 2.8217522269824968e+00 + 32 -7.0488397301395906e+00 -2.0727502451499475e+00 -8.2232423305860891e-01 +... diff --git a/unittest/force-styles/tests/bond-special.yaml b/unittest/force-styles/tests/bond-special.yaml new file mode 100644 index 00000000000..623bfc23bf8 --- /dev/null +++ b/unittest/force-styles/tests/bond-special.yaml @@ -0,0 +1,100 @@ +--- +lammps_version: 4 Jul 2026 +tags: generated +date_generated: Fri Jul 10 16:25:36 2026 +epsilon: 2.5e-13 +skip_tests: +prerequisites: | + atom full + bond special + pair lj/cut +pre_commands: | + variable bond_factor delete + variable bond_factor index 0.0 + variable angle_factor delete + variable angle_factor index 1.0 + variable dihedral_factor delete + variable dihedral_factor index 1.0 + variable pair_style delete + variable pair_style index 'zero 8.0 nocoeff' +post_commands: | + pair_style lj/cut 8.0 + pair_coeff * * 0.02 2.5 +input_file: in.fourmol +bond_style: special +bond_coeff: | + 1 0.5 0.5 + 2 0.25 0.75 + 3 1.0 0.0 + 4 0.0 1.0 + 5 0.75 0.25 +equilibrium: 5 0 0 0 0 0 +extract: "" +natoms: 29 +init_energy: 18058.038859299668 +init_stress: |2- + 7.1668001878001596e+04 5.1028389191366630e+04 9.4651540974094794e+04 2.0746557919172661e+04 2.3246083404123056e+04 2.4443644940140889e+03 +init_forces: |2 + 1 -6.4215856914167662e+03 -5.2632517944406045e+03 7.5726824778061573e+03 + 2 6.4437761698078757e+03 5.3055424985709187e+03 -7.5806580634181964e+03 + 3 1.1271064630913806e+04 1.6201320744451587e+03 -7.1220763257574563e+03 + 4 -8.7261265000534822e+03 2.4433637903018835e+03 -6.2007898271196900e+03 + 5 -2.6210202978172633e+03 -4.0509784315605493e+03 1.3367181299419139e+04 + 6 -1.4749035536757265e+02 9.5447106000951226e+02 4.9799176646565929e+03 + 7 1.9348187387985885e+02 -1.0053842005450049e+03 -5.0274795641832479e+03 + 8 -3.2238126195851869e+03 -3.4655936454968269e+03 -1.4236009676049538e+04 + 9 3.2151347031080313e+03 3.4802944545473392e+03 1.4267280367678028e+04 + 10 2.5100896039438380e+03 6.5066469826209031e+03 1.0697243907259632e+04 + 11 -2.6477429800543664e+03 -6.5544996906263214e+03 -1.0727204229470361e+04 + 12 -4.9482035881452694e+03 -6.5613489922897170e+03 6.5195563799902702e+03 + 13 9.0898956470896737e+03 -3.6034202369540189e+03 -1.6320863795000426e+02 + 14 -3.7894859351479740e+03 7.6257669767449954e+02 -9.8297491889462090e+03 + 15 -2.4594166653993580e+02 9.5046301783020972e+03 3.4061668899502870e+03 + 16 1.3877735029066712e+03 -1.0063075178931609e+03 -3.4807255998081173e+03 + 17 -1.3397307769196989e+03 9.3321016015180260e+02 3.5578061858273613e+03 + 18 -1.9820924469322217e+03 -4.7393545524308220e+03 1.3033762675927002e+04 + 19 -6.2643536000113463e+03 -4.0210987784113568e+03 -7.5291179632368112e+03 + 20 8.2464106565952679e+03 8.7603482557935276e+03 -5.5045306695144045e+03 + 21 -4.4907027650460350e+03 -5.1235840797753144e+03 1.4180832828350318e+04 + 22 -6.8776264863028937e+03 -1.6866297310105062e+03 -1.0685458334278004e+04 + 23 1.1368299821369073e+04 6.8102534577308979e+03 -3.4953424069982243e+03 + 24 2.2998474035610298e+03 -1.3295579671611429e+04 7.0449195196345481e+03 + 25 -9.3957761476153592e+03 1.4602081373975989e+03 -7.8781787272380434e+03 + 26 7.0958982381802316e+03 1.1835336015742067e+04 8.3319195365013445e+02 + 27 3.2486653886646554e+03 -1.4254060948680781e+04 5.7015613376434731e+03 + 28 -1.1400074390990419e+04 4.8436161855570299e+03 -7.6982500753420409e+03 + 29 8.1514286079257745e+03 9.4104623228811815e+03 1.9966758015174071e+03 +run_energy: 6360.225420539028 +run_stress: |2- + 2.4339078656667069e+04 1.7491409646574146e+04 3.4900325101017552e+04 5.3658346415663100e+03 6.7375725394491556e+03 1.8291338628301792e+03 +run_forces: |2 + 1 -1.8969489751927968e+03 -1.5489791972232758e+03 2.2344854802440104e+03 + 2 1.9126705941156029e+03 1.5789374341301898e+03 -2.2413213228245945e+03 + 3 3.8935163262447841e+03 2.6874536941173301e+02 -1.3245273709492590e+03 + 4 -3.2029094266347374e+03 8.5528064031610290e+02 -2.1681143610556674e+03 + 5 -7.7301716130719581e+02 -1.0838659538783377e+03 3.5435872608231834e+03 + 6 -8.6985627177039873e+01 7.0650633989603739e+02 3.8095199356133016e+03 + 7 1.4731920725497000e+02 -7.7346999338872229e+02 -3.8627664008519127e+03 + 8 -6.8769328027531685e+02 -7.3280170615267582e+02 -3.0123603789326730e+03 + 9 6.8012452276277168e+02 7.4322176732724097e+02 3.0366523056975948e+03 + 10 5.4813538886686206e+02 1.7146852364924925e+03 2.8581084645028741e+03 + 11 -7.1240018043587918e+02 -1.7640395961846061e+03 -2.8723558741373004e+03 + 12 -2.2750438449674684e+03 -2.5730349272958492e+03 2.4248406005520455e+03 + 13 3.8207630430579507e+03 -1.4365630907137802e+03 -1.2004159559175417e+02 + 14 -1.3575821513028304e+03 3.3147147938303965e+02 -3.6841918566712961e+03 + 15 -6.2319816323120925e+01 3.7959534830045059e+03 1.2969161595924140e+03 + 16 1.1582273813751829e+03 -8.5353759416285948e+02 -2.8559425601480093e+03 + 17 -1.1057810494260523e+03 7.7157445113469441e+02 2.9374471813650412e+03 + 18 -8.6226574835636711e+00 -9.4879315834468116e+02 4.1838639454003523e+03 + 19 -2.1642488447914038e+03 -1.3734986269108099e+03 -2.6806414641313090e+03 + 20 2.1728364465573932e+03 2.3221874573650107e+03 -1.5031075528899357e+03 + 21 -1.0609925267665317e+03 -1.3348376796305095e+03 4.0453405246343136e+03 + 22 -1.9104044597613124e+03 -4.5050432284820459e+02 -3.0699917003730002e+03 + 23 2.9713673688855865e+03 1.7853818254907194e+03 -9.7531652509095420e+02 + 24 9.9666035084932196e+02 -3.6397352750627770e+03 2.2110339864209636e+03 + 25 -2.8217669144020756e+03 5.0424695910433741e+02 -2.3950211556216664e+03 + 26 1.8250757548345234e+03 3.1354503435211536e+03 1.8391787854081241e+02 + 27 4.3359629443970107e+02 -4.0493886749822623e+03 1.3366852302586906e+03 + 28 -2.7756988216728369e+03 1.2447160721710447e+03 -1.8890912530282276e+03 + 29 2.3421230586755123e+03 2.8046909380310485e+03 5.5239241865196243e+02 +... diff --git a/unittest/force-styles/tests/methanol.localdensity.table b/unittest/force-styles/tests/methanol.localdensity.table new file mode 100644 index 00000000000..af2d4304f7f --- /dev/null +++ b/unittest/force-styles/tests/methanol.localdensity.table @@ -0,0 +1,509 @@ +#LOCAL DENSITY POTENTIALS UNITS: real + +1 500 + + 5.3000000e+00 6.3000000e+00 +1 +1 + 0.0000000e+00 2.6000000e+01 5.2104208e-02 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4810000e-01 + 1.4807157e-01 + 1.4782582e-01 + 1.4711763e-01 + 1.4570179e-01 + 1.4333312e-01 + 1.3976643e-01 + 1.3478059e-01 + 1.2856173e-01 + 1.2163552e-01 + 1.1453802e-01 + 1.0780525e-01 + 1.0197328e-01 + 9.7575837e-02 + 9.4875548e-02 + 9.3613063e-02 + 9.3469690e-02 + 9.4126738e-02 + 9.5265515e-02 + 9.6567329e-02 + 9.7735007e-02 + 9.8575495e-02 + 9.8927186e-02 + 9.8628481e-02 + 9.7517779e-02 + 9.5433481e-02 + 9.2235018e-02 + 8.8072568e-02 + 8.3308496e-02 + 7.8309990e-02 + 7.3444241e-02 + 6.9078438e-02 + 6.5577180e-02 + 6.3110699e-02 + 6.1523109e-02 + 6.0627357e-02 + 6.0236386e-02 + 6.0163144e-02 + 6.0220573e-02 + 6.0233006e-02 + 6.0072080e-02 + 5.9621717e-02 + 5.8765838e-02 + 5.7388366e-02 + 5.5373224e-02 + 5.2623498e-02 + 4.9261717e-02 + 4.5550390e-02 + 4.1754290e-02 + 3.8138193e-02 + 3.4966871e-02 + 3.2501662e-02 + 3.0825931e-02 + 2.9762256e-02 + 2.9112455e-02 + 2.8678347e-02 + 2.8261751e-02 + 2.7664487e-02 + 2.6737788e-02 + 2.5509284e-02 + 2.4045951e-02 + 2.2414767e-02 + 2.0682707e-02 + 1.8916748e-02 + 1.7179645e-02 + 1.5493687e-02 + 1.3858641e-02 + 1.2274032e-02 + 1.0739385e-02 + 9.2542252e-03 + 7.8179601e-03 + 6.4255437e-03 + 5.0662231e-03 + 3.7288715e-03 + 2.4023618e-03 + 1.0755673e-03 +-2.6263394e-04 +-1.6141074e-03 +-2.9522803e-03 +-4.2451362e-03 +-5.4606586e-03 +-6.5668312e-03 +-7.5316377e-03 +-8.3294239e-03 +-8.9860017e-03 +-9.5521117e-03 +-1.0078658e-02 +-1.0616544e-02 +-1.1216675e-02 +-1.1929199e-02 +-1.2782684e-02 +-1.3781467e-02 +-1.4928602e-02 +-1.6227139e-02 +-1.7680132e-02 +-1.9290577e-02 +-2.1031059e-02 +-2.2793537e-02 +-2.4456753e-02 +-2.5899451e-02 +-2.7000374e-02 +-2.7638267e-02 +-2.7719868e-02 +-2.7344330e-02 +-2.6691680e-02 +-2.5942229e-02 +-2.5276286e-02 +-2.4874159e-02 +-2.4909370e-02 +-2.5403835e-02 +-2.6230347e-02 +-2.7255409e-02 +-2.8345523e-02 +-2.9367192e-02 +-3.0187085e-02 +-3.0712590e-02 +-3.0944560e-02 +-3.0896910e-02 +-3.0583557e-02 +-3.0018416e-02 +-2.9215405e-02 +-2.8195478e-02 +-2.7020910e-02 +-2.5768997e-02 +-2.4517057e-02 +-2.3342408e-02 +-2.2322368e-02 +-2.1532406e-02 +-2.1015034e-02 +-2.0784355e-02 +-2.0853543e-02 +-2.1235771e-02 +-2.1944214e-02 +-2.2991215e-02 +-2.4278363e-02 +-2.5486458e-02 +-2.6270119e-02 +-2.6283964e-02 +-2.5182614e-02 +-2.2620686e-02 +-1.8367122e-02 +-1.2765600e-02 +-6.3400224e-03 + 3.8564733e-04 + 6.8874449e-03 + 1.2641406e-02 + 1.7151899e-02 + 2.0334733e-02 + 2.2416173e-02 + 2.3630118e-02 + 2.4210466e-02 + 2.4391115e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + 2.4405000e-02 + diff --git a/unittest/force-styles/tests/mol-pair-local_density.yaml b/unittest/force-styles/tests/mol-pair-local_density.yaml new file mode 100644 index 00000000000..9d89f0b14f3 --- /dev/null +++ b/unittest/force-styles/tests/mol-pair-local_density.yaml @@ -0,0 +1,88 @@ +--- +lammps_version: 4 Jul 2026 +tags: generated +date_generated: Fri Jul 10 16:24:41 2026 +epsilon: 5e-14 +skip_tests: +prerequisites: | + atom full + pair local/density +pre_commands: "" +post_commands: | + pair_modify mix arithmetic + pair_modify shift yes +input_file: in.fourmol +pair_style: local/density +pair_coeff: | + * * ${input_dir}/methanol.localdensity.table +extract: "" +natoms: 29 +init_vdwl: 0.74050000332937 +init_coul: 0 +init_stress: |2- + 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +init_forces: |2 + 1 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 2 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 3 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 4 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 5 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 6 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 7 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 8 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 9 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 10 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 11 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 12 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 13 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 14 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 15 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 16 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 17 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 18 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 19 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 20 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 21 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 22 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 23 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 24 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 25 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 26 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 27 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 28 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 29 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +run_vdwl: 0.74050000332937 +run_coul: 0 +run_stress: |2- + 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +run_forces: |2 + 1 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 2 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 3 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 4 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 5 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 6 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 7 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 8 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 9 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 10 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 11 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 12 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 13 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 14 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 15 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 16 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 17 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 18 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 19 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 20 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 21 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 22 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 23 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 24 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 25 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 26 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 27 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 28 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 29 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +... From 84e48d32ea0d93159ea757de36b8b0343d2b4d89 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 10 Jul 2026 16:56:52 -0400 Subject: [PATCH 016/100] fix uninitialized data and grid comm buffer sizes in pppm/dipole/spin The spin variants of the dipole kspace solvers never initialize the charge-channel accumulators (qsum, qsqsum, q2) since spin-only systems have no charge array and qsum_qsq() is never called. The inherited grid-size estimator and accuracy checks read q2, making the chosen PPPM grid (and thus all results) depend on uninitialized memory. Zero the charge channel explicitly in spsum_spsq()/spsum_musq(). PPPMDipoleSpin::compute() also used wrong per-grid-point counts for the inherited pack/unpack methods (3 instead of 4 for REVERSE_MU, 9 instead of 12 for FORWARD_MU, 18 instead of 25 for FORWARD_MU_PERATOM) and called the per-atom forward comm on the never-allocated base class gc grid instead of gc_dipole, which segfaulted any run with per-atom energy or virial accumulation. In parallel runs the undersized counts silently corrupted the communicated ghost grid data. make_rho_spin() now also clears density_brick like make_rho_dipole() does: brick2fft_dipole() and poisson_ik_dipole() process the charge density unconditionally, so spin runs fed uninitialized grid data into the charge structure factor (nondeterministic forces, up to NaN). Also call error->all() on all ranks instead of only rank 0 when a dipole/spin solver is used on a system without dipoles/spins (a rank-0 only call to a collective error would hang parallel runs). Found by the new kspace-{ewald,pppm}_dipole_spin.yaml force-style tests; verified with valgrind and repeated runs. --- src/KSPACE/ewald_dipole.cpp | 2 +- src/KSPACE/ewald_dipole_spin.cpp | 7 ++++++- src/KSPACE/pppm_dipole_spin.cpp | 17 ++++++++++++----- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/src/KSPACE/ewald_dipole.cpp b/src/KSPACE/ewald_dipole.cpp index b520d8b6d52..f3ffd08ffd0 100644 --- a/src/KSPACE/ewald_dipole.cpp +++ b/src/KSPACE/ewald_dipole.cpp @@ -842,7 +842,7 @@ void EwaldDipole::musum_musq() mu2 = musqsum * force->qqrd2e; } - if (mu2 == 0 && comm->me == 0) + if (mu2 == 0) error->all(FLERR,"Using kspace solver EwaldDipole on system with no dipoles"); } diff --git a/src/KSPACE/ewald_dipole_spin.cpp b/src/KSPACE/ewald_dipole_spin.cpp index 7a03f9a14f4..e3dcdacdfba 100644 --- a/src/KSPACE/ewald_dipole_spin.cpp +++ b/src/KSPACE/ewald_dipole_spin.cpp @@ -820,6 +820,11 @@ void EwaldDipoleSpin::spsum_musq() const int nlocal = atom->nlocal; musum = musqsum = mu2 = 0.0; + + // spin-only systems have no charge channel and qsum_qsq() is never + // called, but the inherited error estimates access these members + + qsum = qsqsum = q2 = 0.0; if (atom->sp_flag) { double** sp = atom->sp; double spx,spy,spz; @@ -842,6 +847,6 @@ void EwaldDipoleSpin::spsum_musq() mu2 = musqsum * mub2mu0; } - if (mu2 == 0 && comm->me == 0) + if (mu2 == 0) error->all(FLERR,"Using kspace solver EwaldDipoleSpin on system with no spins"); } diff --git a/src/KSPACE/pppm_dipole_spin.cpp b/src/KSPACE/pppm_dipole_spin.cpp index 40a6dda9d41..adee88293f3 100644 --- a/src/KSPACE/pppm_dipole_spin.cpp +++ b/src/KSPACE/pppm_dipole_spin.cpp @@ -288,7 +288,7 @@ void PPPMDipoleSpin::compute(int eflag, int vflag) // to fully sum contribution in their 3d bricks // remap from 3d decomposition to FFT decomposition - gc_dipole->reverse_comm(Grid3d::KSPACE,this,REVERSE_MU,3,sizeof(FFT_SCALAR), + gc_dipole->reverse_comm(Grid3d::KSPACE,this,REVERSE_MU,4,sizeof(FFT_SCALAR), gc_buf1,gc_buf2,MPI_FFT_SCALAR); brick2fft_dipole(); @@ -302,14 +302,14 @@ void PPPMDipoleSpin::compute(int eflag, int vflag) // all procs communicate E-field values // to fill ghost cells surrounding their 3d bricks - gc_dipole->forward_comm(Grid3d::KSPACE,this,FORWARD_MU,9,sizeof(FFT_SCALAR), + gc_dipole->forward_comm(Grid3d::KSPACE,this,FORWARD_MU,12,sizeof(FFT_SCALAR), gc_buf1,gc_buf2,MPI_FFT_SCALAR); // extra per-atom energy/virial communication if (evflag_atom) - gc->forward_comm(Grid3d::KSPACE,this,FORWARD_MU_PERATOM,18,sizeof(FFT_SCALAR), - gc_buf1,gc_buf2,MPI_FFT_SCALAR); + gc_dipole->forward_comm(Grid3d::KSPACE,this,FORWARD_MU_PERATOM,25,sizeof(FFT_SCALAR), + gc_buf1,gc_buf2,MPI_FFT_SCALAR); // calculate the force on my particles @@ -396,6 +396,8 @@ void PPPMDipoleSpin::make_rho_spin() ngrid*sizeof(FFT_SCALAR)); memset(&(densityz_brick_dipole[nzlo_out][nylo_out][nxlo_out]),0, ngrid*sizeof(FFT_SCALAR)); + memset(&(density_brick[nzlo_out][nylo_out][nxlo_out]),0, + ngrid*sizeof(FFT_SCALAR)); // loop over my charges, add their contribution to nearby grid points // (nx,ny,nz) = global coords of grid pt to "lower left" of charge @@ -685,6 +687,11 @@ void PPPMDipoleSpin::spsum_spsq() const int nlocal = atom->nlocal; musum = musqsum = mu2 = 0.0; + + // spin-only systems have no charge channel and qsum_qsq() is never + // called, but the inherited error estimates access these members + + qsum = qsqsum = q2 = 0.0; if (atom->sp_flag) { double **sp = atom->sp; double spx, spy, spz; @@ -711,6 +718,6 @@ void PPPMDipoleSpin::spsum_spsq() mu2 = musqsum * mub2mu0; } - if (mu2 == 0 && comm->me == 0) + if (mu2 == 0) error->all(FLERR,"Using kspace solver PPPMDipoleSpin on system with no spins"); } From c323ed39deaba0957ee8e9ccd4ed10ed1b27d3f9 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 10 Jul 2026 16:57:02 -0400 Subject: [PATCH 017/100] add force-style tests for spin/dipole/long and the dipole/spin kspace solvers - spin-pair-dipole_long.yaml: real-space part with the kspace solver present but disabled (kspace_modify compute no), mirroring the existing spin/dipole/cut test; reference magnetic forces differ from the cut variant so the long-range damping path is exercised - kspace-ewald_dipole_spin.yaml, kspace-pppm_dipole_spin.yaml: same system with the solver active and randomized spin directions (fixed seed) to break the bcc lattice symmetry; the two solvers agree on the reference forces to the requested accuracy pppm/rk from the stage 1 list cannot be tested with this harness: it requires the multi-partition verlet/split/rk integrator. --- .../tests/kspace-ewald_dipole_spin.yaml | 254 ++++++++++++++++++ .../tests/kspace-pppm_dipole_spin.yaml | 254 ++++++++++++++++++ .../tests/spin-pair-dipole_long.yaml | 253 +++++++++++++++++ 3 files changed, 761 insertions(+) create mode 100644 unittest/force-styles/tests/kspace-ewald_dipole_spin.yaml create mode 100644 unittest/force-styles/tests/kspace-pppm_dipole_spin.yaml create mode 100644 unittest/force-styles/tests/spin-pair-dipole_long.yaml diff --git a/unittest/force-styles/tests/kspace-ewald_dipole_spin.yaml b/unittest/force-styles/tests/kspace-ewald_dipole_spin.yaml new file mode 100644 index 00000000000..b48cd6bfceb --- /dev/null +++ b/unittest/force-styles/tests/kspace-ewald_dipole_spin.yaml @@ -0,0 +1,254 @@ +--- +lammps_version: 4 Jul 2026 +tags: spin +date_generated: Fri Jul 10 16:52:59 2026 +epsilon: 5e-13 +skip_tests: +prerequisites: | + atom spin + pair spin/dipole/long + kspace ewald/dipole/spin + fix nve/spin +pre_commands: | + variable newton_pair delete + variable newton_pair index on +post_commands: | + set atom * spin/random 97531 2.2 + fix move all nve/spin lattice yes + kspace_style ewald/dipole/spin 1.0e-8 + kspace_modify gewald 0.2 +input_file: in.spin +pair_style: spin/dipole/long 4.0 +pair_coeff: | + * * 4.0 +extract: "" +natoms: 54 +init_vdwl: -2.2950093062740123e-05 +init_coul: 0 +init_stress: |- + -2.3391136202277567e-04 1.8114710506628802e-04 1.5660228190990777e-05 2.1494202296838611e-05 7.0759282466705263e-05 -2.7686651192338510e-04 +init_forces: |2 + 1 -3.2455074082448103e-05 4.6905565934885007e-05 2.3305615839146342e-05 + 2 9.2216445448373028e-06 -1.2966618562827103e-05 -1.0816144504799094e-05 + 3 1.1361174519501346e-04 4.1268025533030536e-05 4.5336779324739312e-05 + 4 -2.7402124456625486e-05 -4.5526781178058262e-06 3.1568933759766198e-05 + 5 7.6140482725749415e-06 4.6759981719538159e-05 -2.6232283155600891e-05 + 6 5.9724693559544756e-05 5.1563892701606183e-06 -2.6674087851839982e-05 + 7 -5.5853329422700363e-05 5.2892815558707191e-05 -4.4397154851300401e-06 + 8 4.4644282607988472e-05 -4.0643755170551421e-05 9.9169105271432151e-06 + 9 5.2779975134966783e-05 2.0684026658724423e-05 1.7109396162492102e-05 + 10 -1.5586187018940711e-05 3.7590440708794488e-05 -9.8064790833677314e-06 + 11 -1.4431887028187657e-05 -3.5705488322739454e-05 -1.1596774026421952e-05 + 12 2.8442600658299293e-05 -6.5675832483382768e-06 -5.2327100728518153e-05 + 13 -2.4175951783952530e-05 7.8540976666064270e-07 2.2449887000156516e-05 + 14 -6.6585951666650595e-05 -3.2069721115644771e-05 -1.0340088341133155e-07 + 15 -1.9112489623200032e-05 2.8686469730042741e-05 1.4866055594736835e-05 + 16 1.8196913293437499e-05 3.1181885423756177e-05 -3.5472003652655816e-05 + 17 5.9426356907673422e-05 1.1296323305865192e-05 -2.9919295645022728e-05 + 18 -2.7194213225625505e-05 -2.0506058270806383e-05 -4.5670585802332974e-05 + 19 1.5947586722204209e-05 5.7265065598353519e-05 -1.7902133885176612e-05 + 20 -3.9075525023001397e-06 -1.2847925989113327e-05 1.7559209749238315e-05 + 21 5.1199300082251659e-05 2.9699800604480805e-06 4.2568283710610008e-05 + 22 1.7902835654498885e-05 1.0289771257927616e-05 -4.2465745666420531e-05 + 23 1.4748910457698706e-05 1.6589066901305047e-06 4.3494006752706556e-05 + 24 1.6747555037292478e-05 -3.6644108839293911e-05 -5.8535613648059343e-05 + 25 -7.1237356644002229e-06 3.6515609111319758e-05 3.9418303302327102e-06 + 26 -6.9260782806128090e-05 5.2989965928276116e-05 -4.0383073677126377e-06 + 27 -5.6782421865766976e-05 2.2012320018247964e-05 -1.4405711237638573e-05 + 28 -3.7837361224386893e-05 5.6903999161686934e-05 4.4595588528495917e-06 + 29 3.0505864458960617e-06 5.2436778929006859e-06 -4.1837000949511187e-05 + 30 -1.3512601692074098e-05 2.8141676703038429e-06 -1.3466358439908960e-05 + 31 6.9512878005789961e-05 -6.5549265821192307e-05 -8.8690594568688168e-06 + 32 -6.2573924807734277e-06 -2.0101138322328563e-05 1.9570783223374253e-05 + 33 4.5949146678672467e-05 6.3292336285218913e-05 2.4214568597487208e-05 + 34 -4.9735092012021656e-05 -7.4461161473796754e-05 -8.1904771483431928e-05 + 35 -3.0431446679420347e-05 -4.5509024835934945e-05 -4.0616636909430807e-05 + 36 5.9739237499619856e-05 3.7167993781440073e-05 8.5655431944874405e-06 + 37 -3.6151936955785649e-05 -2.6571151413278735e-05 4.0793235932566067e-05 + 38 2.7850263848959927e-06 -6.5722965748927570e-05 -7.6255805990293445e-06 + 39 -9.1613328142572920e-05 4.1522389567686961e-05 2.5664719879116184e-06 + 40 9.5468639111416494e-06 -4.8768804327532751e-05 4.3456565747582630e-05 + 41 1.3897619416958544e-05 3.4856532368470006e-05 4.6054049244892137e-05 + 42 -2.1335009797990108e-05 -6.5714950044916599e-05 4.7792457054388280e-05 + 43 4.1912415232500918e-05 4.9170086243527699e-05 6.8001909966112025e-06 + 44 -4.6303808257248552e-05 -1.6145350121904297e-05 -2.2683902959801154e-05 + 45 2.7714071144819791e-05 -1.1862766038179886e-04 3.9600340240586112e-05 + 46 -1.7574683963948159e-05 -1.5421848098633375e-05 3.9710489817058120e-05 + 47 4.4898962904586059e-05 -3.9351458516356715e-05 4.2296776335194606e-05 + 48 -4.1487031709259680e-05 2.8520515228938708e-05 5.0725496181267270e-05 + 49 7.1755407610356092e-05 -5.6528396171151011e-05 -1.6328431004051107e-05 + 50 3.7569027910041966e-05 9.9950783656715214e-06 -8.0197845795985988e-05 + 51 -1.1643665000990105e-05 -2.7056220067048343e-07 4.8082155980872097e-06 + 52 -6.5002723699656339e-05 3.0348078093247772e-05 4.3117123257118793e-05 + 53 4.1366886619414602e-06 1.2301043134202120e-05 -2.1959511996854118e-05 + 54 -5.3918597172448272e-05 -1.7797174952620583e-05 -1.0754292793448790e-05 +init_mag_forces: |2 + 1 8.6304986366571856e-02 6.6159887895107919e-02 -5.5356256733070444e-03 + 2 7.7686195110675010e-02 -4.2717324198235200e-02 -1.1385638516215972e-01 + 3 -3.3121893078339251e-02 -2.3738651930059626e-02 -4.3251755244798594e-03 + 4 -3.4595544225702246e-03 -5.7224586102025878e-03 -9.2106095490726583e-02 + 5 -1.1309030829711622e-02 1.2542374862697589e-01 -1.9912280135337378e-02 + 6 3.4863496738710871e-03 -5.9063298737894610e-03 6.1745352789848898e-02 + 7 -4.8855254394872157e-02 5.7995547710529866e-02 1.3455321458481465e-01 + 8 3.1723270242656476e-03 -7.8933602369828909e-02 7.5980421969341405e-02 + 9 1.0669603526262229e-01 3.8184262116961645e-02 7.9103120733717530e-02 + 10 2.8155543472430301e-02 -3.3799119964080186e-02 5.7363226287206207e-02 + 11 3.8677889878235991e-02 1.0193828223322210e-02 1.0111642783902823e-01 + 12 -8.3662939541272775e-03 -3.2859219681546148e-02 5.8428275328424505e-02 + 13 4.7961957030014060e-02 -3.4169945096365964e-02 -1.0708942033726843e-01 + 14 -7.8579206205722264e-03 1.4325076933866038e-01 1.0706645071406470e-01 + 15 7.5720845061372222e-02 -3.7620899319758164e-02 -1.1212804950493428e-01 + 16 4.4621070162982439e-02 5.5976103658972633e-03 -1.4389810966980718e-01 + 17 -9.7434374347452710e-02 -7.9109815717281859e-02 -7.7682745007318116e-02 + 18 -9.3272776606549507e-02 6.2699999277051680e-02 1.1323990279063963e-01 + 19 -4.1323068498816028e-02 1.1816688124188112e-02 6.6679124966894876e-02 + 20 -1.7538395033609128e-01 -9.8604959302679828e-03 -1.3877574784396256e-02 + 21 8.7893206245407071e-02 -6.0958354196359796e-02 6.6877650985368627e-03 + 22 1.7092298714276472e-01 -6.8934763646430655e-02 2.5706712625835192e-02 + 23 4.4421630895865122e-02 1.1313572635230159e-02 -5.8535957921114906e-03 + 24 -4.1972873642561734e-02 -5.4217101091999287e-02 -4.1945208807987258e-02 + 25 -2.6038491155743926e-01 -1.1144841345687617e-01 -1.0799308265377351e-02 + 26 2.8965253670550455e-02 -2.6089215718149553e-02 4.8810564078030437e-02 + 27 7.1559096301293174e-02 -5.8186889130388397e-03 -9.2107881704675001e-02 + 28 -2.4765704734543162e-02 -5.8245745812882388e-03 5.2663908856794964e-02 + 29 5.3468923990218478e-02 -6.8469756826467248e-02 1.2757740070650111e-02 + 30 -2.7867864537025278e-02 -1.9557332987205256e-01 -7.9806763704546452e-03 + 31 -1.1979597625249475e-01 -5.6800163024931891e-02 -4.1436719052930261e-03 + 32 -1.1166676689618985e-01 6.6654171583027041e-03 8.3305583429474257e-03 + 33 2.7486483417076164e-02 6.5387357673115445e-02 -6.0288531248461022e-02 + 34 -9.7942242200013373e-03 8.1815447414490122e-02 -5.9245818179492959e-03 + 35 -3.3567942812711207e-02 -1.8934215920423075e-02 7.5288899732642120e-02 + 36 -1.5950980258341158e-02 1.2398226377786867e-01 -6.2066848276308928e-02 + 37 1.0941930605315495e-02 -3.9398155916477523e-02 1.5999220208320643e-02 + 38 -3.5090045858379340e-02 -7.5992281254790128e-02 7.3959537973175449e-02 + 39 -8.7555382781932659e-02 -1.8663473731382458e-02 2.9920128308401375e-02 + 40 -6.6200918154807706e-02 -6.3904650106993047e-02 7.0532674087850716e-02 + 41 -2.5213514852625379e-02 1.5650667422755415e-01 -2.0506298111638746e-02 + 42 6.4157194448284743e-02 8.1994512666065722e-02 -1.0968362907777116e-02 + 43 -4.2663747185000045e-02 -7.8694579112521992e-02 -9.4046996130179875e-02 + 44 4.1470436639247599e-02 7.4482201849212448e-02 -9.5445426966275254e-02 + 45 -5.1820207933523675e-02 -3.4189388751725690e-02 2.9017392929276568e-02 + 46 3.5280707408523064e-02 1.2921589161776523e-01 -3.1738654580972359e-02 + 47 1.1626608007817683e-01 -7.7813402633983272e-02 -4.8739724029319142e-02 + 48 1.0868197277131789e-02 4.7296959068977018e-02 -7.8766135619803543e-02 + 49 1.5540857713148096e-01 -8.1916537168188128e-03 5.1416197634351936e-02 + 50 5.2836475907170064e-03 3.0569670002470267e-02 -1.2474453026959053e-02 + 51 -6.9668102491424480e-02 -2.1242401441722215e-02 6.5006417433250002e-02 + 52 3.3993098048615840e-02 -6.6899918507553890e-02 2.8574197843237809e-02 + 53 2.0811224049646859e-02 7.4040120940237599e-03 3.7118323336383180e-02 + 54 1.0684293482756616e-03 -5.7265139746967945e-02 -2.1456658575849018e-02 +run_vdwl: -2.3128122565015137e-05 +run_coul: 0 +run_stress: |- + -2.3455731003306106e-04 1.8098177318031359e-04 1.5914892446581788e-05 2.1314388072795957e-05 7.0687161431627339e-05 -2.7705782463282479e-04 +run_forces: |2 + 1 -3.2469392360522318e-05 4.6856167799610415e-05 2.3299488678754372e-05 + 2 9.2007766908528529e-06 -1.2985365191999046e-05 -1.0871208398681278e-05 + 3 1.1358441938220862e-04 4.1280439628930466e-05 4.5304392580507042e-05 + 4 -2.7311883186381332e-05 -4.5843505534108849e-06 3.1596741616063001e-05 + 5 7.5578748857608392e-06 4.6727288281175856e-05 -2.6273179369492682e-05 + 6 5.9750170237623303e-05 5.1256710636795937e-06 -2.6783850792723041e-05 + 7 -5.5869118619102364e-05 5.3035814093877918e-05 -4.4027995904411932e-06 + 8 4.4684947089133526e-05 -4.0736465579141535e-05 9.9743953266197028e-06 + 9 5.2793168706937493e-05 2.0653133423795097e-05 1.7179691782002429e-05 + 10 -1.5638940886976249e-05 3.7546668671900588e-05 -9.8274507328588490e-06 + 11 -1.4325322180661608e-05 -3.5621490627118356e-05 -1.1440375456726939e-05 + 12 2.8362614288365557e-05 -6.5736156452899554e-06 -5.2302811316338820e-05 + 13 -2.4219788915728280e-05 8.7617674220135232e-07 2.2473608619153596e-05 + 14 -6.6668785054691250e-05 -3.2099575891000671e-05 -1.1990176311739458e-08 + 15 -1.9029503504233766e-05 2.8752279786374988e-05 1.4815328859707545e-05 + 16 1.8154416698990542e-05 3.1193111766932797e-05 -3.5474411752372554e-05 + 17 5.9412040911939783e-05 1.1244778743662045e-05 -2.9878551289428845e-05 + 18 -2.7104994988173796e-05 -2.0390097613706180e-05 -4.5575074738542405e-05 + 19 1.5963853516309383e-05 5.7186502873282069e-05 -1.7916338986658547e-05 + 20 -3.8319179114317962e-06 -1.2822258775941114e-05 1.7514878771334721e-05 + 21 5.1142872142431725e-05 2.9256328393053378e-06 4.2502161895279342e-05 + 22 1.7879973887243395e-05 1.0281366826440805e-05 -4.2430416659261067e-05 + 23 1.4831336768854464e-05 1.6240208944869137e-06 4.3546162706779351e-05 + 24 1.6710637978987504e-05 -3.6584116658429282e-05 -5.8537424443800668e-05 + 25 -7.1387136141455944e-06 3.6523468264570764e-05 3.9510733817163646e-06 + 26 -6.9100125774130286e-05 5.2982397184258209e-05 -4.0452506774186873e-06 + 27 -5.6820958497427290e-05 2.2028107411952732e-05 -1.4339824577631264e-05 + 28 -3.7898417445508020e-05 5.6926053863154392e-05 4.4174887547904284e-06 + 29 3.0891542419585265e-06 5.2349738131269792e-06 -4.1846105077918682e-05 + 30 -1.3520329586047789e-05 2.7534933640270183e-06 -1.3400992723275336e-05 + 31 6.9517780217264296e-05 -6.5512198280184215e-05 -8.9482013890360014e-06 + 32 -6.3119438056285341e-06 -2.0119427687816709e-05 1.9567711444844922e-05 + 33 4.5946411980191000e-05 6.3257719777778552e-05 2.4182614912153006e-05 + 34 -4.9708020139791208e-05 -7.4406021362783767e-05 -8.1827496527065924e-05 + 35 -3.0369666660625395e-05 -4.5492433984307683e-05 -4.0597492953481716e-05 + 36 5.9736656462102463e-05 3.7185373667423620e-05 8.5599386514771749e-06 + 37 -3.6146924520827681e-05 -2.6558895593953882e-05 4.0786184541784169e-05 + 38 2.8498495579399490e-06 -6.5799233968196256e-05 -7.6091393149753252e-06 + 39 -9.1624587522769654e-05 4.1550440330082909e-05 2.5144849397580762e-06 + 40 9.4658335565803881e-06 -4.8790913460243988e-05 4.3355854443582545e-05 + 41 1.3985476497505228e-05 3.4851180400652061e-05 4.6098387816842799e-05 + 42 -2.1245320735080805e-05 -6.5749042033509794e-05 4.7748992923366775e-05 + 43 4.1789384419826439e-05 4.9180430457816785e-05 6.7549345660682477e-06 + 44 -4.6280440127380631e-05 -1.6116876403605340e-05 -2.2678643080926200e-05 + 45 2.7690149430329907e-05 -1.1867592341476938e-04 3.9601276857623608e-05 + 46 -1.7660769745712866e-05 -1.5414435385032350e-05 3.9779945629464252e-05 + 47 4.4926372223309964e-05 -3.9423512563373010e-05 4.2230620073707103e-05 + 48 -4.1471611034221291e-05 2.8574195543508504e-05 5.0724267222464809e-05 + 49 7.1677698689085237e-05 -5.6440269449375432e-05 -1.6323815066075369e-05 + 50 3.7503690685990419e-05 1.0020715841715447e-05 -8.0273229237854768e-05 + 51 -1.1610884964023892e-05 -3.4847369153771488e-07 4.8873711179665096e-06 + 52 -6.5082763319015158e-05 3.0263446230846305e-05 4.3049031433078187e-05 + 53 4.1974852165741196e-06 1.2354164526639172e-05 -2.2044492017058546e-05 + 54 -5.3943921264058138e-05 -1.7750220298483077e-05 -1.0756463200533669e-05 +run_mag_forces: |2 + 1 8.6326316867189556e-02 6.6036486679654172e-02 -5.5421537943439597e-03 + 2 7.7674404063029584e-02 -4.2705489158937432e-02 -1.1378723949371931e-01 + 3 -3.2906899612794388e-02 -2.3729120826035312e-02 -4.2637001324092455e-03 + 4 -3.4779071132457684e-03 -5.8394655506442128e-03 -9.2131724679793151e-02 + 5 -1.1276693016398037e-02 1.2539968098381421e-01 -1.9940550449147811e-02 + 6 3.4741058892780283e-03 -5.8302230836541034e-03 6.1750551461015948e-02 + 7 -4.8745499627568509e-02 5.7928744677638380e-02 1.3449501040508163e-01 + 8 3.0713003134392129e-03 -7.8871671157184492e-02 7.5925466558793814e-02 + 9 1.0661038234039628e-01 3.8175210805985169e-02 7.8964699825113088e-02 + 10 2.8263861015911926e-02 -3.3851356951332748e-02 5.7427296551501070e-02 + 11 3.8798218008406285e-02 1.0303812254577088e-02 1.0112507136213278e-01 + 12 -8.2796171237684429e-03 -3.2879365054463844e-02 5.8487966454914400e-02 + 13 4.7915771942511440e-02 -3.4149385966512437e-02 -1.0702982863129785e-01 + 14 -8.0392671680318915e-03 1.4330459996492551e-01 1.0712330115008772e-01 + 15 7.5725714189018370e-02 -3.7724631258809455e-02 -1.1212343280064106e-01 + 16 4.4675491161688861e-02 5.6882630193629304e-03 -1.4387280740046449e-01 + 17 -9.7550365560068936e-02 -7.9155414859198497e-02 -7.7681646717943850e-02 + 18 -9.3191625149769905e-02 6.2632671670093343e-02 1.1310650246752145e-01 + 19 -4.1134026536196341e-02 1.1864175674292540e-02 6.6639016874854518e-02 + 20 -1.7542627907043395e-01 -9.8128303816822152e-03 -1.3938375310642692e-02 + 21 8.7804387655941105e-02 -6.1119056302175796e-02 6.6771373234775569e-03 + 22 1.7094758340179722e-01 -6.8744568985054724e-02 2.5715394316411573e-02 + 23 4.4320120991331716e-02 1.1286705002151658e-02 -5.8554901171107288e-03 + 24 -4.1972759406900748e-02 -5.4307798315952852e-02 -4.2022148490401381e-02 + 25 -2.6043250054954359e-01 -1.1144127337582453e-01 -1.0691634075041404e-02 + 26 2.8988807974112654e-02 -2.6060393143949447e-02 4.8815081997346937e-02 + 27 7.1541136486246104e-02 -5.7254919416680362e-03 -9.2039621214770606e-02 + 28 -2.4663326700249046e-02 -5.9008220464572825e-03 5.2595712744437473e-02 + 29 5.3448764802342452e-02 -6.8431450661695800e-02 1.2713196226731560e-02 + 30 -2.7852854252194179e-02 -1.9551829723220859e-01 -8.0337362351464107e-03 + 31 -1.1985743448968647e-01 -5.6793679201973910e-02 -4.1215360414668129e-03 + 32 -1.1158336327265908e-01 6.6983314483748356e-03 8.3672301579856972e-03 + 33 2.7513072790379657e-02 6.5397686153624096e-02 -6.0201919814122436e-02 + 34 -9.8185777850966459e-03 8.1853320985310937e-02 -6.0987738471539295e-03 + 35 -3.3490409397442418e-02 -1.8867231417571715e-02 7.5322950191007459e-02 + 36 -1.6045007290361495e-02 1.2392309152661060e-01 -6.1965519487371536e-02 + 37 1.1001861488221451e-02 -3.9367733019624214e-02 1.5946121328652380e-02 + 38 -3.5215037313546839e-02 -7.5982764253276949e-02 7.3914980827977275e-02 + 39 -8.7710617352467615e-02 -1.8809758156544423e-02 2.9987280573760922e-02 + 40 -6.6123084725470238e-02 -6.3878459955668029e-02 7.0496920090575649e-02 + 41 -2.5096547379920259e-02 1.5656209642277757e-01 -2.0547907065485975e-02 + 42 6.4137835092258413e-02 8.2031501042828650e-02 -1.0985328608643385e-02 + 43 -4.2594020465571321e-02 -7.8681446404254507e-02 -9.4037691930165937e-02 + 44 4.1467378679931416e-02 7.4474848405134103e-02 -9.5315020952946056e-02 + 45 -5.1776858711498480e-02 -3.4218603964652039e-02 2.8989312393425996e-02 + 46 3.5223708622496255e-02 1.2924303716170060e-01 -3.1715420290199720e-02 + 47 1.1636025517965057e-01 -7.7864046827963246e-02 -4.8652951251288323e-02 + 48 1.0855196114754072e-02 4.7355867633534235e-02 -7.8762089848279315e-02 + 49 1.5527831289966437e-01 -8.0460272878537624e-03 5.1389732179364267e-02 + 50 5.1889901063711897e-03 3.0590914232159132e-02 -1.2396311509407053e-02 + 51 -6.9675350768762176e-02 -2.1254415184935545e-02 6.5014837867624672e-02 + 52 3.3883258987931320e-02 -6.6760087106134763e-02 2.8584329792268236e-02 + 53 2.0851283498542032e-02 7.3874794959948118e-03 3.7126922389117113e-02 + 54 1.1147690671201491e-03 -5.7279231904338333e-02 -2.1443057373401651e-02 +... diff --git a/unittest/force-styles/tests/kspace-pppm_dipole_spin.yaml b/unittest/force-styles/tests/kspace-pppm_dipole_spin.yaml new file mode 100644 index 00000000000..a648f901217 --- /dev/null +++ b/unittest/force-styles/tests/kspace-pppm_dipole_spin.yaml @@ -0,0 +1,254 @@ +--- +lammps_version: 4 Jul 2026 +tags: spin +date_generated: Fri Jul 10 16:53:00 2026 +epsilon: 5e-13 +skip_tests: +prerequisites: | + atom spin + pair spin/dipole/long + kspace pppm/dipole/spin + fix nve/spin +pre_commands: | + variable newton_pair delete + variable newton_pair index on +post_commands: | + set atom * spin/random 97531 2.2 + fix move all nve/spin lattice yes + kspace_style pppm/dipole/spin 1.0e-8 + kspace_modify gewald 0.2 +input_file: in.spin +pair_style: spin/dipole/long 4.0 +pair_coeff: | + * * 4.0 +extract: "" +natoms: 54 +init_vdwl: -2.2950093062740123e-05 +init_coul: 0 +init_stress: |- + -2.3391136202277567e-04 1.8114710506628802e-04 1.5660228190990777e-05 2.1494202296838611e-05 7.0759282466705263e-05 -2.7686651192338510e-04 +init_forces: |2 + 1 -3.2456296041248375e-05 4.6912656045135555e-05 2.3310350036638843e-05 + 2 9.1844421077671985e-06 -1.2925240200218964e-05 -1.0811835754870907e-05 + 3 1.1361609371469189e-04 4.1282510039144805e-05 4.5335316050627379e-05 + 4 -2.7390483253213444e-05 -4.5986686157748766e-06 3.1580636478231386e-05 + 5 7.5916336742065408e-06 4.6746199359448169e-05 -2.6232505565132146e-05 + 6 5.9754224016777612e-05 5.1189856176094964e-06 -2.6663446317683765e-05 + 7 -5.5852833697970346e-05 5.2872895900951920e-05 -4.4362694234184825e-06 + 8 4.4608719329808979e-05 -4.0656221714397660e-05 9.9084001003440426e-06 + 9 5.2789887810137444e-05 2.0636635412301700e-05 1.7105633204890624e-05 + 10 -1.5583867473998863e-05 3.7543076691619949e-05 -9.8141514345867107e-06 + 11 -1.4440575188923376e-05 -3.5738930882577499e-05 -1.1595641542704245e-05 + 12 2.8444936136134615e-05 -6.6519439397325582e-06 -5.2325042735021588e-05 + 13 -2.4181768362958865e-05 8.2231802305114596e-07 2.2458129067821210e-05 + 14 -6.6564493471718656e-05 -3.2086465437120307e-05 -1.1749579425696007e-07 + 15 -1.9142227605341025e-05 2.8656657057471059e-05 1.4865869757782456e-05 + 16 1.8199410627955141e-05 3.1185928781075737e-05 -3.5453966410838047e-05 + 17 5.9397728711028748e-05 1.1270986109304489e-05 -2.9916390793773443e-05 + 18 -2.7199646496398101e-05 -2.0499836509022049e-05 -4.5650553662471086e-05 + 19 1.5938279840931598e-05 5.7271982594909370e-05 -1.7901966825113367e-05 + 20 -3.9157701206566876e-06 -1.2811609073326222e-05 1.7533251796751743e-05 + 21 5.1236970081669435e-05 2.9671381649154854e-06 4.2582814560919888e-05 + 22 1.7898515708692097e-05 1.0350955601663071e-05 -4.2470656438553449e-05 + 23 1.4777184853815893e-05 1.6583858825074031e-06 4.3481412167352372e-05 + 24 1.6726184873803138e-05 -3.6716328815529213e-05 -5.8527442258407275e-05 + 25 -7.1193247900849711e-06 3.6553458618013792e-05 3.9366501876412452e-06 + 26 -6.9272590233031067e-05 5.3030255560768896e-05 -4.0626816092355495e-06 + 27 -5.6803555088611508e-05 2.2032010482039504e-05 -1.4396624317102092e-05 + 28 -3.7824182545138303e-05 5.6892874581921339e-05 4.4777678212678350e-06 + 29 3.0837547824941697e-06 5.2444887347670632e-06 -4.1840609843414685e-05 + 30 -1.3491678871800665e-05 2.7411494544583451e-06 -1.3456344898040543e-05 + 31 6.9516307486227564e-05 -6.5594811501572343e-05 -8.8703974558148707e-06 + 32 -6.2322889790794699e-06 -2.0115162260953459e-05 1.9562282474319899e-05 + 33 4.5923324182881020e-05 6.3308856214880813e-05 2.4197018788592331e-05 + 34 -4.9736039522862447e-05 -7.4463138700101177e-05 -8.1905917886033791e-05 + 35 -3.0396116947426486e-05 -4.5509125799702558e-05 -4.0605893277482150e-05 + 36 5.9715964933905355e-05 3.7160602744066785e-05 8.5816651991067262e-06 + 37 -3.6152988812458687e-05 -2.6561628062169592e-05 4.0785064730247661e-05 + 38 2.7928570002482550e-06 -6.5659471706887569e-05 -7.6290907384334187e-06 + 39 -9.1656127663303558e-05 4.1524588960392694e-05 2.5688307492778695e-06 + 40 9.5560623881415665e-06 -4.8732652645713426e-05 4.3441152142708940e-05 + 41 1.3892038780171825e-05 3.4853004383957214e-05 4.6037733685489227e-05 + 42 -2.1302487552595275e-05 -6.5670846998326415e-05 4.7786370117954913e-05 + 43 4.1913569299601022e-05 4.9168014775631023e-05 6.7782261650606803e-06 + 44 -4.6313872477593788e-05 -1.6077010392802926e-05 -2.2690332797595123e-05 + 45 2.7723853639643522e-05 -1.1860214406034478e-04 3.9604428356867537e-05 + 46 -1.7583877223290221e-05 -1.5363912912758669e-05 3.9718311156610204e-05 + 47 4.4924691567607236e-05 -3.9348462586233604e-05 4.2282164306436118e-05 + 48 -4.1463323169666130e-05 2.8494347627926481e-05 5.0742266141925077e-05 + 49 7.1750133795301562e-05 -5.6561269190114477e-05 -1.6314092929007825e-05 + 50 3.7560736117180929e-05 9.9962688825263826e-06 -8.0203746743788432e-05 + 51 -1.1630069497432972e-05 -2.2988570963357837e-07 4.8196606286270489e-06 + 52 -6.5008930952773839e-05 3.0343350854546544e-05 4.3125579762689155e-05 + 53 4.1289663357781117e-06 1.2332391884717265e-05 -2.1942479916894684e-05 + 54 -5.3931055757025227e-05 -1.7798207326709652e-05 -1.0771408266507738e-05 +init_mag_forces: |2 + 1 8.6304986366571856e-02 6.6159887895107919e-02 -5.5356256733070444e-03 + 2 7.7686195110675010e-02 -4.2717324198235200e-02 -1.1385638516215972e-01 + 3 -3.3121893078339251e-02 -2.3738651930059626e-02 -4.3251755244798594e-03 + 4 -3.4595544225702246e-03 -5.7224586102025878e-03 -9.2106095490726583e-02 + 5 -1.1309030829711622e-02 1.2542374862697589e-01 -1.9912280135337378e-02 + 6 3.4863496738710871e-03 -5.9063298737894610e-03 6.1745352789848898e-02 + 7 -4.8855254394872157e-02 5.7995547710529866e-02 1.3455321458481465e-01 + 8 3.1723270242656476e-03 -7.8933602369828909e-02 7.5980421969341405e-02 + 9 1.0669603526262229e-01 3.8184262116961645e-02 7.9103120733717530e-02 + 10 2.8155543472430301e-02 -3.3799119964080186e-02 5.7363226287206207e-02 + 11 3.8677889878235991e-02 1.0193828223322210e-02 1.0111642783902823e-01 + 12 -8.3662939541272775e-03 -3.2859219681546148e-02 5.8428275328424505e-02 + 13 4.7961957030014060e-02 -3.4169945096365964e-02 -1.0708942033726843e-01 + 14 -7.8579206205722264e-03 1.4325076933866038e-01 1.0706645071406470e-01 + 15 7.5720845061372222e-02 -3.7620899319758164e-02 -1.1212804950493428e-01 + 16 4.4621070162982439e-02 5.5976103658972633e-03 -1.4389810966980718e-01 + 17 -9.7434374347452710e-02 -7.9109815717281859e-02 -7.7682745007318116e-02 + 18 -9.3272776606549507e-02 6.2699999277051680e-02 1.1323990279063963e-01 + 19 -4.1323068498816028e-02 1.1816688124188112e-02 6.6679124966894876e-02 + 20 -1.7538395033609128e-01 -9.8604959302679828e-03 -1.3877574784396256e-02 + 21 8.7893206245407071e-02 -6.0958354196359796e-02 6.6877650985368627e-03 + 22 1.7092298714276472e-01 -6.8934763646430655e-02 2.5706712625835192e-02 + 23 4.4421630895865122e-02 1.1313572635230159e-02 -5.8535957921114906e-03 + 24 -4.1972873642561734e-02 -5.4217101091999287e-02 -4.1945208807987258e-02 + 25 -2.6038491155743926e-01 -1.1144841345687617e-01 -1.0799308265377351e-02 + 26 2.8965253670550455e-02 -2.6089215718149553e-02 4.8810564078030437e-02 + 27 7.1559096301293174e-02 -5.8186889130388397e-03 -9.2107881704675001e-02 + 28 -2.4765704734543162e-02 -5.8245745812882388e-03 5.2663908856794964e-02 + 29 5.3468923990218478e-02 -6.8469756826467248e-02 1.2757740070650111e-02 + 30 -2.7867864537025278e-02 -1.9557332987205256e-01 -7.9806763704546452e-03 + 31 -1.1979597625249475e-01 -5.6800163024931891e-02 -4.1436719052930261e-03 + 32 -1.1166676689618985e-01 6.6654171583027041e-03 8.3305583429474257e-03 + 33 2.7486483417076164e-02 6.5387357673115445e-02 -6.0288531248461022e-02 + 34 -9.7942242200013373e-03 8.1815447414490122e-02 -5.9245818179492959e-03 + 35 -3.3567942812711207e-02 -1.8934215920423075e-02 7.5288899732642120e-02 + 36 -1.5950980258341158e-02 1.2398226377786867e-01 -6.2066848276308928e-02 + 37 1.0941930605315495e-02 -3.9398155916477523e-02 1.5999220208320643e-02 + 38 -3.5090045858379340e-02 -7.5992281254790128e-02 7.3959537973175449e-02 + 39 -8.7555382781932659e-02 -1.8663473731382458e-02 2.9920128308401375e-02 + 40 -6.6200918154807706e-02 -6.3904650106993047e-02 7.0532674087850716e-02 + 41 -2.5213514852625379e-02 1.5650667422755415e-01 -2.0506298111638746e-02 + 42 6.4157194448284743e-02 8.1994512666065722e-02 -1.0968362907777116e-02 + 43 -4.2663747185000045e-02 -7.8694579112521992e-02 -9.4046996130179875e-02 + 44 4.1470436639247599e-02 7.4482201849212448e-02 -9.5445426966275254e-02 + 45 -5.1820207933523675e-02 -3.4189388751725690e-02 2.9017392929276568e-02 + 46 3.5280707408523064e-02 1.2921589161776523e-01 -3.1738654580972359e-02 + 47 1.1626608007817683e-01 -7.7813402633983272e-02 -4.8739724029319142e-02 + 48 1.0868197277131789e-02 4.7296959068977018e-02 -7.8766135619803543e-02 + 49 1.5540857713148096e-01 -8.1916537168188128e-03 5.1416197634351936e-02 + 50 5.2836475907170064e-03 3.0569670002470267e-02 -1.2474453026959053e-02 + 51 -6.9668102491424480e-02 -2.1242401441722215e-02 6.5006417433250002e-02 + 52 3.3993098048615840e-02 -6.6899918507553890e-02 2.8574197843237809e-02 + 53 2.0811224049646859e-02 7.4040120940237599e-03 3.7118323336383180e-02 + 54 1.0684293482756616e-03 -5.7265139746967945e-02 -2.1456658575849018e-02 +run_vdwl: -2.3128131464931954e-05 +run_coul: 0 +run_stress: |- + -2.3455732933162332e-04 1.8098177298965138e-04 1.5914882976842247e-05 2.1314382660818999e-05 7.0687141820633249e-05 -2.7705782996699708e-04 +run_forces: |2 + 1 -3.2470612651938850e-05 4.6863199572924269e-05 2.3304223877659967e-05 + 2 9.1635941023226152e-06 -1.2943974874079735e-05 -1.0866903429976066e-05 + 3 1.1358876831141187e-04 4.1294929198236903e-05 4.5302929801984702e-05 + 4 -2.7300244294214397e-05 -4.6303610268268723e-06 3.1608431697636155e-05 + 5 7.5354567837012464e-06 4.6713551605012194e-05 -2.6273404915087124e-05 + 6 5.9779704472295316e-05 5.0882642858349712e-06 -2.6773217361239138e-05 + 7 -5.5868628230461062e-05 5.3015967794289281e-05 -4.3993534668811965e-06 + 8 4.4649393165313727e-05 -4.0748932922214460e-05 9.9659008572947096e-06 + 9 5.2803078550726568e-05 2.0605772946433384e-05 1.7175933603441077e-05 + 10 -1.5636627496677653e-05 3.7499329297282030e-05 -9.8351226614001392e-06 + 11 -1.4334000941456259e-05 -3.5654864759094540e-05 -1.1439244036900968e-05 + 12 2.8364947443528191e-05 -6.6579868960347905e-06 -5.2300754947621274e-05 + 13 -2.4225647553666700e-05 9.1307130056363972e-07 2.2481846002802362e-05 + 14 -6.6647322764397566e-05 -3.2116348551597018e-05 -2.6071909684047831e-08 + 15 -1.9059249907147600e-05 2.8722471355256354e-05 1.4815145673624388e-05 + 16 1.8156907819806460e-05 3.1197171540070729e-05 -3.5456384353407439e-05 + 17 5.9383409310270726e-05 1.1219466207871759e-05 -2.9875651958200254e-05 + 18 -2.7110427290195613e-05 -2.0383908503220748e-05 -4.5555063988389111e-05 + 19 1.5954512659918691e-05 5.7193390694863641e-05 -1.7916165417774763e-05 + 20 -3.8401384086964562e-06 -1.2785928140372318e-05 1.7488901959179463e-05 + 21 5.1180524361093779e-05 2.9227942223084735e-06 4.2516717518828204e-05 + 22 1.7875719370963400e-05 1.0342571164277140e-05 -4.2435334049611096e-05 + 23 1.4859592701541331e-05 1.6234670298816634e-06 4.3533558573515280e-05 + 24 1.6689268957240311e-05 -3.6656356878352007e-05 -5.8529244939527341e-05 + 25 -7.1343275627729534e-06 3.6561284173197714e-05 3.9458949867646336e-06 + 26 -6.9111919565618160e-05 5.3022681479106912e-05 -4.0696616710844015e-06 + 27 -5.6842094213359833e-05 2.2047822954701595e-05 -1.4330716860639990e-05 + 28 -3.7885183898482272e-05 5.6914931156812881e-05 4.4357082275458255e-06 + 29 3.1222718860845377e-06 5.2357944765789739e-06 -4.1849714282042983e-05 + 30 -1.3499399896206099e-05 2.6804677327432141e-06 -1.3390955659507647e-05 + 31 6.9521212596264907e-05 -6.5557720467364461e-05 -8.9495431586515738e-06 + 32 -6.2868420056544705e-06 -2.0133399763365601e-05 1.9559209141878481e-05 + 33 4.5920597839406561e-05 6.3274225688913648e-05 2.4165076677869966e-05 + 34 -4.9708937201439358e-05 -7.4408030830625579e-05 -8.1828638090957937e-05 + 35 -3.0334356858060864e-05 -4.5492542162999815e-05 -4.0586740363577093e-05 + 36 5.9713361339692890e-05 3.7177993087620113e-05 8.5760586125175127e-06 + 37 -3.6147979849953797e-05 -2.6549394150755094e-05 4.0778006223677466e-05 + 38 2.8576853881900290e-06 -6.5735715140032052e-05 -7.6126427890703629e-06 + 39 -9.1667384097864993e-05 4.1552622914119027e-05 2.5168452173795540e-06 + 40 9.4750781935066182e-06 -4.8754748849016313e-05 4.3340430836390776e-05 + 41 1.3979899711041120e-05 3.4847648354370463e-05 4.6082083099534656e-05 + 42 -2.1212800353100915e-05 -6.5704926706146817e-05 4.7742901935118034e-05 + 43 4.1790506322643119e-05 4.9178355958191914e-05 6.7329516590959068e-06 + 44 -4.6290498502887657e-05 -1.6048532210565697e-05 -2.2685085565420069e-05 + 45 2.7699925159181049e-05 -1.1865049077292482e-04 3.9605367326559812e-05 + 46 -1.7669954668038581e-05 -1.5356474846317804e-05 3.9787798127516487e-05 + 47 4.4952114577357638e-05 -3.9420518549263498e-05 4.2216001510212118e-05 + 48 -4.1447883672913033e-05 2.8548019706928575e-05 5.0741049342921365e-05 + 49 7.1672441067871531e-05 -5.6473132265214283e-05 -1.6309469286226872e-05 + 50 3.7495411817779184e-05 1.0021911996983640e-05 -8.0279196296005229e-05 + 51 -1.1597279402522089e-05 -3.0786756535611142e-07 4.8988245642729277e-06 + 52 -6.5089030034735874e-05 3.0258721656866115e-05 4.3057525782580178e-05 + 53 4.1897672563987517e-06 1.2385500217939614e-05 -2.2027447281461802e-05 + 54 -5.3956379843089080e-05 -1.7751242938440364e-05 -1.0773594097456021e-05 +run_mag_forces: |2 + 1 8.6326311279995085e-02 6.6036488840622021e-02 -5.5421549852891216e-03 + 2 7.7674402777170304e-02 -4.2705487284965329e-02 -1.1378723902212462e-01 + 3 -3.2906895167070557e-02 -2.3729124721857984e-02 -4.2637053650491988e-03 + 4 -3.4779092330953776e-03 -5.8394677736750217e-03 -9.2131724407930257e-02 + 5 -1.1276692171355183e-02 1.2539968335392382e-01 -1.9940546352258216e-02 + 6 3.4741027535531177e-03 -5.8302218621659081e-03 6.1750550471947142e-02 + 7 -4.8745501653020835e-02 5.7928749234824398e-02 1.3449501007994327e-01 + 8 3.0713001772782553e-03 -7.8871671421658462e-02 7.5925465361823971e-02 + 9 1.0661038320706334e-01 3.8175210698230072e-02 7.8964699344037437e-02 + 10 2.8263861028277222e-02 -3.3851355785485544e-02 5.7427296852008855e-02 + 11 3.8798220608763485e-02 1.0303810420017811e-02 1.0112507411690869e-01 + 12 -8.2796111503456241e-03 -3.2879364735109586e-02 5.8487969328973821e-02 + 13 4.7915767564626177e-02 -3.4149390115205416e-02 -1.0702982860573507e-01 + 14 -8.0392666012256090e-03 1.4330459610903237e-01 1.0712330111884519e-01 + 15 7.5725711845104279e-02 -3.7724627350649298e-02 -1.1212343182051934e-01 + 16 4.4675493274488033e-02 5.6882613128257722e-03 -1.4387280828202140e-01 + 17 -9.7550363010187727e-02 -7.9155417819208151e-02 -7.7681643601138245e-02 + 18 -9.3191624863093153e-02 6.2632670714553848e-02 1.1310650165594931e-01 + 19 -4.1134026966068230e-02 1.1864177599493377e-02 6.6639020663107881e-02 + 20 -1.7542627592598189e-01 -9.8128316893351161e-03 -1.3938371516492049e-02 + 21 8.7804384598904273e-02 -6.1119056902648253e-02 6.6771392787693656e-03 + 22 1.7094757925150481e-01 -6.8744568391625557e-02 2.5715398754725956e-02 + 23 4.4320124718967277e-02 1.1286707468668666e-02 -5.8554878340126987e-03 + 24 -4.1972758555726623e-02 -5.4307799617931987e-02 -4.2022148652399019e-02 + 25 -2.6043250100477783e-01 -1.1144127706845335e-01 -1.0691637515986728e-02 + 26 2.8988812875929221e-02 -2.6060390607735254e-02 4.8815081023764008e-02 + 27 7.1541136709333333e-02 -5.7254861957392565e-03 -9.2039616037505226e-02 + 28 -2.4663328144332280e-02 -5.9008218281985884e-03 5.2595713563236030e-02 + 29 5.3448764720949185e-02 -6.8431449974829889e-02 1.2713195694227852e-02 + 30 -2.7852856587889545e-02 -1.9551829789659467e-01 -8.0337388960610608e-03 + 31 -1.1985743419755050e-01 -5.6793679661156331e-02 -4.1215326088473760e-03 + 32 -1.1158336326871424e-01 6.6983345292405266e-03 8.3672304838517154e-03 + 33 2.7513072181006210e-02 6.5397683624816627e-02 -6.0201922253257802e-02 + 34 -9.8185826214037004e-03 8.1853323148776289e-02 -6.0987673033171801e-03 + 35 -3.3490408071541522e-02 -1.8867236774484590e-02 7.5322949357408964e-02 + 36 -1.6045003189134460e-02 1.2392309199880258e-01 -6.1965522345199836e-02 + 37 1.1001864591165034e-02 -3.9367738619770706e-02 1.5946120421570901e-02 + 38 -3.5215036228955096e-02 -7.5982761555610748e-02 7.3914978451423946e-02 + 39 -8.7710617010721914e-02 -1.8809759966370014e-02 2.9987281503441963e-02 + 40 -6.6123085857499764e-02 -6.3878460856152175e-02 7.0496919077812081e-02 + 41 -2.5096549214927686e-02 1.5656209569405891e-01 -2.0547909114840453e-02 + 42 6.4137834882810801e-02 8.2031501690057504e-02 -1.0985329078584162e-02 + 43 -4.2594021282650066e-02 -7.8681443872248610e-02 -9.4037689561015173e-02 + 44 4.1467383106171971e-02 7.4474843745611322e-02 -9.5315021996652843e-02 + 45 -5.1776859426454845e-02 -3.4218607808424201e-02 2.8989308526042271e-02 + 46 3.5223708239740636e-02 1.2924303305543075e-01 -3.1715422052727829e-02 + 47 1.1636025233130369e-01 -7.7864048752505799e-02 -4.8652954717717092e-02 + 48 1.0855191842969356e-02 4.7355867370764061e-02 -7.8762087541918879e-02 + 49 1.5527831498563424e-01 -8.0460217971288790e-03 5.1389731841717121e-02 + 50 5.1889883010974502e-03 3.0590913536916085e-02 -1.2396316510321043e-02 + 51 -6.9675349734871370e-02 -2.1254408843045174e-02 6.5014837621691079e-02 + 52 3.3883256021540548e-02 -6.6760084614837040e-02 2.8584331132318491e-02 + 53 2.0851280454314221e-02 7.3874797636768021e-03 3.7126919363309530e-02 + 54 1.1147713643409516e-03 -5.7279229073135741e-02 -2.1443059087073967e-02 +... diff --git a/unittest/force-styles/tests/spin-pair-dipole_long.yaml b/unittest/force-styles/tests/spin-pair-dipole_long.yaml new file mode 100644 index 00000000000..b8d045d620c --- /dev/null +++ b/unittest/force-styles/tests/spin-pair-dipole_long.yaml @@ -0,0 +1,253 @@ +--- +lammps_version: 4 Jul 2026 +tags: spin +date_generated: Fri Jul 10 16:42:23 2026 +epsilon: 5e-13 +skip_tests: +prerequisites: | + atom spin + pair spin/dipole/long + kspace ewald/dipole/spin + fix nve/spin +pre_commands: | + variable newton_pair delete + variable newton_pair index on +post_commands: | + fix move all nve/spin lattice yes + kspace_style ewald/dipole/spin 1.0e-8 + kspace_modify gewald 0.2 compute no +input_file: in.spin +pair_style: spin/dipole/long 4.0 +pair_coeff: | + * * 4.0 +extract: "" +natoms: 54 +init_vdwl: 2.0879964727685078e-05 +init_coul: 0 +init_stress: |- + -3.0973536345464057e-05 -4.4221224386498479e-05 1.0263189240734073e-04 1.3652987423020687e-04 -1.3879702855039861e-04 7.0131957548248222e-05 +init_forces: |2 + 1 1.4397123404709909e-05 -1.4967422552343253e-05 -5.6137495457022816e-05 + 2 3.7825040464267799e-05 4.6977933852488551e-06 3.5507307918719727e-06 + 3 3.8766955656736892e-05 1.8764335195106780e-05 -2.5446113328587461e-05 + 4 -4.6008903914123887e-05 5.5953858753345145e-05 1.2278646254986221e-04 + 5 -2.8859220080072831e-05 -7.2254755125617339e-05 -7.7619495395775990e-06 + 6 6.4853898776411582e-05 -1.4641079832971753e-05 5.8937225990883823e-06 + 7 1.8001545359706680e-05 -4.6828693604493101e-05 1.2187433609733452e-05 + 8 -7.3995262265012102e-05 7.9556816068886128e-05 3.4569017829655741e-05 + 9 -6.1060468010451575e-05 -1.0518232901051479e-05 9.9162691007824335e-05 + 10 -1.3230636109987527e-06 -1.6980445283023707e-05 -1.4712085210575919e-05 + 11 1.7047353915368723e-05 -3.4021699200549989e-05 -3.7590422878262231e-05 + 12 1.6724565848293854e-06 -4.0979980716223097e-05 -2.3309496669766827e-05 + 13 3.3808830777873963e-05 -3.0512113930834780e-05 2.5316226538487275e-05 + 14 -1.6609085847060024e-05 -8.6058797424581538e-06 8.1645915808827219e-05 + 15 -5.2352648371574057e-06 -3.1014972478816053e-05 -5.8259799404696043e-05 + 16 7.3468626482395456e-05 -4.4804229305342482e-05 -1.0978096456194364e-05 + 17 -2.3453705388682263e-05 2.8811550305491787e-05 5.5921850820210457e-05 + 18 -1.1606468909069477e-05 -3.0927222626463255e-05 -3.4999232469574300e-05 + 19 1.0139399315500727e-05 -1.7533617334773473e-05 3.9818397542925442e-05 + 20 1.6900216324284831e-06 4.8109780735107040e-05 -4.4227011525508319e-05 + 21 -1.7598513583954600e-05 6.6209627264617061e-06 1.9591872422349667e-05 + 22 1.1814103955605943e-06 -3.2255716061028657e-05 -4.7902108307711923e-05 + 23 1.5101691762417776e-05 -3.0926184275628118e-05 2.8408828953047447e-05 + 24 -4.2669362204789745e-06 6.5981608115158873e-05 -4.5017556244448837e-05 + 25 -7.5739918202062954e-05 -4.3505480516839681e-06 3.1125875016736867e-05 + 26 5.7086719373196207e-05 2.4690986196390795e-05 -4.0629548062554473e-05 + 27 1.5224235554145776e-05 1.1290946079679410e-05 -5.5138804838142909e-05 + 28 -2.0074835766168001e-05 -2.9157903671642621e-05 6.4422192848938005e-05 + 29 6.5021514267420525e-06 3.2689404479414289e-05 4.5818308540614415e-06 + 30 7.7064666678521490e-05 2.8953027237294521e-05 4.6213528859642297e-05 + 31 3.3124122841952231e-05 1.6768010741718597e-05 1.5745822021129296e-05 + 32 -1.1833478974576906e-05 4.6887812685857297e-05 9.8895947011120839e-06 + 33 1.5187589500597070e-05 -5.8871838997812616e-05 2.0827102770379977e-05 + 34 -1.7538633687568690e-05 4.2403129109682859e-05 -4.7231297044292770e-05 + 35 -3.1144162784853663e-05 5.9534775115891200e-05 6.2016617806145479e-06 + 36 -9.1086334114761271e-06 -6.2675834707179073e-05 -4.4986009990746531e-05 + 37 3.5796914185155095e-05 -7.4660602685015060e-05 -2.7916894987171977e-05 + 38 -5.5171099944174136e-05 2.3995388141468256e-05 -3.5144437298669702e-05 + 39 4.8545029247479300e-05 -1.2954723666032982e-05 2.2878609327479918e-05 + 40 -2.8314175443907707e-05 3.2770735468535160e-05 2.5498704974377850e-05 + 41 -1.2173784188603218e-04 -3.1260493497589421e-05 1.8317659465129072e-05 + 42 5.9323393797153199e-05 1.1158092781405501e-05 9.1446437487688022e-06 + 43 2.5879039540777808e-05 2.7532884477805070e-05 -4.5038167521539831e-05 + 44 7.7881691680321859e-05 -3.0847237838079788e-05 -3.2541032454844516e-05 + 45 -1.1007506419694910e-04 -3.5387555331128269e-05 3.7044390437371930e-06 + 46 1.6282758821295862e-05 3.2914263914129459e-05 -1.9316318855380975e-05 + 47 -3.4522671156714073e-05 3.1873670133218093e-05 -5.7314100493870951e-06 + 48 -2.8819441110866641e-05 -2.4659805618001219e-05 2.8691248318651596e-06 + 49 -2.6409245073440678e-05 -1.2406801690802149e-05 -4.8601576443048965e-05 + 50 -3.9657235490775273e-05 1.7042037837902605e-06 5.5649582949160917e-05 + 51 -7.4473427452157378e-06 -3.9802020230527827e-05 -1.1786197835843819e-05 + 52 -2.8343280646509188e-06 2.7658246716046496e-05 -2.3114387645787814e-05 + 53 4.9977440191726927e-05 6.5613681307509985e-05 -4.7369782251150574e-05 + 54 6.4614893239221807e-05 6.7871647302470171e-05 2.4963709103471462e-05 +init_mag_forces: |2 + 1 -6.1588634226529541e-02 -2.0880717309725773e-02 -2.1180069775542751e-02 + 2 1.1711412945366746e-01 -4.7345465230363468e-02 -5.3538740733699158e-03 + 3 -4.7627652478163418e-02 5.6380007197600175e-02 7.8937428933049045e-02 + 4 -1.4896514546425538e-02 -6.7800709775721002e-02 -3.9086175260650852e-03 + 5 2.1344493132189394e-02 -1.3435448320782553e-01 8.1964844187529751e-02 + 6 -1.1587226911019150e-02 -6.1855587425969638e-02 -8.6981264328136104e-02 + 7 1.7736905773625852e-01 -1.6820401255100939e-02 -1.6337596398778373e-01 + 8 3.8460508037138269e-02 2.9988325824201554e-03 5.7465995806506326e-02 + 9 -4.3585458452718804e-03 7.3161394838377428e-02 4.6434217154568205e-02 + 10 4.1303412293433983e-02 -2.5893674919042826e-02 -4.3821407195317519e-02 + 11 -1.3212634290911516e-02 1.8223970180099094e-01 1.1549437037478148e-01 + 12 -6.7700752299788738e-02 9.1626893457287639e-02 -2.6442143836244318e-02 + 13 -1.9337008475511626e-02 -1.2142194893380455e-02 6.9724745731547161e-02 + 14 -6.1441055016713098e-02 1.2559785535007656e-01 -4.9211257252344334e-02 + 15 8.6214502055185951e-02 -1.0885264124554399e-01 5.2539123107182381e-02 + 16 4.4611617064210442e-02 7.6918881705562200e-02 -2.3988923302278448e-02 + 17 -1.4672260315039817e-02 -4.9639125816815913e-02 -2.4614917072817856e-02 + 18 -1.2823483374053937e-02 -5.6178196552161136e-02 -1.5816175842467231e-03 + 19 2.2216273315912340e-02 -1.7261649225127691e-02 -1.5346916254812142e-02 + 20 2.6305173509498181e-02 8.5573542476163056e-02 5.7832910865278947e-02 + 21 4.1517384003987814e-02 -2.4725203047592282e-02 -3.0971796580060662e-02 + 22 -4.0821275532345970e-02 -2.5998282206180001e-02 -1.5153059983289724e-02 + 23 -7.3949724927801191e-02 -2.0669130844704862e-03 -7.6955885467015220e-02 + 24 9.4763088974278681e-02 -3.2568159807580641e-02 2.0513890484794564e-01 + 25 1.0929507188314945e-02 1.0453671457977538e-01 3.8262630443465659e-02 + 26 2.7231923515311306e-02 -1.3117153695895345e-01 3.6006080926180996e-02 + 27 7.0245886615252953e-02 -9.0925617797036742e-02 -4.2286811079353323e-02 + 28 -6.7198180672489283e-02 -1.9120291706631060e-02 -1.0693608815179646e-02 + 29 6.6033964570345900e-03 2.2830573728804367e-02 -8.9039296051317454e-02 + 30 2.9909068176717478e-02 1.0487076664509813e-02 -1.2480803143414063e-01 + 31 5.5423878966583399e-02 -2.1931150596629902e-02 9.7325619442062312e-03 + 32 7.0430187388492868e-02 -3.6628554056296218e-02 -1.0949915692344027e-02 + 33 -1.2153204353671500e-01 -1.0199419145978692e-02 -1.5006073429338254e-02 + 34 -4.2758344158543161e-02 4.4486883591100174e-02 -7.7736207806644531e-02 + 35 -6.5677880656478810e-03 5.6045215538916338e-02 -1.1361247828033531e-01 + 36 7.0498577813533442e-02 6.3084267390294130e-02 6.0326843313935244e-02 + 37 -1.4610647826467679e-01 -9.4000346137112001e-02 1.8699648070105608e-03 + 38 -2.2459715337239256e-02 1.0105876676016336e-01 2.0818911290027151e-02 + 39 1.0176043679990929e-01 1.6981336880265811e-02 3.3427050879211717e-03 + 40 -6.9032922790832271e-03 -6.8081758979480572e-02 -6.0049270336928300e-03 + 41 2.4323117677055084e-02 2.8972285779927998e-02 -6.9773541005947862e-02 + 42 9.2914207825989303e-02 -5.3239645312864653e-02 -1.5574199858146040e-01 + 43 -8.4381338440796289e-02 -9.7027346788584282e-02 -8.8440375937993476e-02 + 44 -5.0641515511813548e-02 8.9344093743231892e-02 8.8325566966827099e-02 + 45 6.3289047563471937e-02 2.2770664094466223e-02 -6.5623512987422888e-02 + 46 3.1818891470546118e-05 1.0335280235425497e-01 1.1984335453343020e-01 + 47 -6.9012403353919630e-02 -3.0159116753396540e-03 -3.9404631516315416e-02 + 48 -3.8500437636187636e-02 -4.3748081829171503e-02 -3.8971663245468746e-02 + 49 2.4865137555032113e-03 4.3140643373075042e-02 -2.6154676212395006e-02 + 50 -1.4998847917463845e-01 -3.5366464164705624e-02 -3.4888447136778911e-02 + 51 4.2060315830958012e-02 4.2924643597771595e-02 9.0471581589918137e-02 + 52 -4.4810139380442725e-02 -4.3728537378714766e-02 -3.0827494567603409e-02 + 53 5.7697196142649787e-02 2.7286543730497687e-02 8.8003206660867819e-02 + 54 4.7226304072663400e-02 -1.0985348010519796e-02 9.0941415529911945e-03 +run_vdwl: 2.0609479329755743e-05 +run_coul: 0 +run_stress: |- + -3.0899315069732575e-05 -4.4591641011391543e-05 1.0210032251660969e-04 1.3652000157238006e-04 -1.3872547817295457e-04 7.0102048971363085e-05 +run_forces: |2 + 1 1.4320638054508869e-05 -1.4901566109337493e-05 -5.6156908037742405e-05 + 2 3.7827435979966344e-05 4.6840386969674676e-06 3.4952222124325206e-06 + 3 3.8748004520898523e-05 1.8673712809780875e-05 -2.5461676682239941e-05 + 4 -4.5975773499085494e-05 5.5948211722494985e-05 1.2281635819084763e-04 + 5 -2.8864037374220794e-05 -7.2345925890923474e-05 -7.6652786894415805e-06 + 6 6.4984411111185039e-05 -1.4551013904819590e-05 5.8576760896799530e-06 + 7 1.7979119749455186e-05 -4.6937466746468204e-05 1.2190780997310313e-05 + 8 -7.4046396542771481e-05 7.9624573990186770e-05 3.4478766581153289e-05 + 9 -6.1043901845835591e-05 -1.0546038618986087e-05 9.9143281823967642e-05 + 10 -1.3528940346204884e-06 -1.6936719589584451e-05 -1.4695536832142134e-05 + 11 1.6999380615878260e-05 -3.3916234421880486e-05 -3.7563490622536703e-05 + 12 1.6409141481885109e-06 -4.0861809614684526e-05 -2.3215774571677516e-05 + 13 3.3900087683892364e-05 -3.0575380869011037e-05 2.5377409613863198e-05 + 14 -1.6615988321524273e-05 -8.5894358520559375e-06 8.1636327080894137e-05 + 15 -5.2411684688991774e-06 -3.1014451845085339e-05 -5.8190532633239296e-05 + 16 7.3450520264112061e-05 -4.4741219740800328e-05 -1.0922682279462575e-05 + 17 -2.3486854420627256e-05 2.8851152309887120e-05 5.5908830971635368e-05 + 18 -1.1650027893262622e-05 -3.1009700757805794e-05 -3.4935974186447037e-05 + 19 1.0270168330329024e-05 -1.7574825480626642e-05 3.9795780113747338e-05 + 20 1.6510207819688565e-06 4.8146533581461360e-05 -4.4230739607304608e-05 + 21 -1.7486530458835299e-05 6.6774415535166902e-06 1.9574755436749322e-05 + 22 1.0460076485094425e-06 -3.2167912968615040e-05 -4.7891872961944572e-05 + 23 1.5054936789963529e-05 -3.0952818636024906e-05 2.8335682015748692e-05 + 24 -4.2371447978063654e-06 6.6026902009122946e-05 -4.4978455567938139e-05 + 25 -7.5775006272525860e-05 -4.3826421001591397e-06 3.1038503786846966e-05 + 26 5.7145957977254655e-05 2.4717060788861623e-05 -4.0677588517816305e-05 + 27 1.5236124523394520e-05 1.1288487962416925e-05 -5.5031536154368585e-05 + 28 -2.0010848686606452e-05 -2.9221060123436967e-05 6.4481588702239865e-05 + 29 6.5312381203617869e-06 3.2694169708134551e-05 4.6140668019086399e-06 + 30 7.7048835449000452e-05 2.9074710049365628e-05 4.6190273955398138e-05 + 31 3.3135059136641934e-05 1.6717301962135024e-05 1.5629492991532152e-05 + 32 -1.1827361088294184e-05 4.6728150294977158e-05 9.8558729596402296e-06 + 33 1.5114288842847403e-05 -5.8845802150394905e-05 2.0772429006179702e-05 + 34 -1.7551102825604824e-05 4.2387485447283154e-05 -4.7040726529981017e-05 + 35 -3.1117930943446660e-05 5.9537346073852975e-05 6.2278577086173536e-06 + 36 -9.0802005214370787e-06 -6.2634972730172137e-05 -4.4993414644178091e-05 + 37 3.5745917537528463e-05 -7.4594117327353194e-05 -2.7943094968368571e-05 + 38 -5.5262505514041997e-05 2.4123402414566831e-05 -3.5051036023795722e-05 + 39 4.8574573678107554e-05 -1.2991609388664865e-05 2.2842301965509623e-05 + 40 -2.8411324258413207e-05 3.2866260796064262e-05 2.5353010105589636e-05 + 41 -1.2170175083436645e-04 -3.1281267262035725e-05 1.8274723773002477e-05 + 42 5.9363379680360957e-05 1.1118614584933527e-05 9.1060752124264703e-06 + 43 2.5873995021474230e-05 2.7369936373210403e-05 -4.5091759038376442e-05 + 44 7.7892937159304931e-05 -3.0903678419913738e-05 -3.2567988656711642e-05 + 45 -1.0998613548298402e-04 -3.5495167387461407e-05 3.7186943200937143e-06 + 46 1.6245761432423570e-05 3.2842126443056365e-05 -1.9391917837708351e-05 + 47 -3.4519299579694696e-05 3.1763674988660215e-05 -5.7681904528712274e-06 + 48 -2.8807224510855223e-05 -2.4700204629334254e-05 2.9053948153017399e-06 + 49 -2.6324484876078084e-05 -1.2373378353700463e-05 -4.8602665956115232e-05 + 50 -3.9711794401796616e-05 1.7107877317102579e-06 5.5737595439044037e-05 + 51 -7.4489183867235063e-06 -3.9821052579773486e-05 -1.1697324357821414e-05 + 52 -2.8629832699360634e-06 2.7644262728699485e-05 -2.3176618876995247e-05 + 53 5.0002821623941720e-05 6.5696715064545813e-05 -4.7369420240955417e-05 + 54 6.4616053248795624e-05 6.7954413413217173e-05 2.4953452256819556e-05 +run_mag_forces: |2 + 1 -6.1446006294531695e-02 -2.0883827789116845e-02 -2.1367614727656768e-02 + 2 1.1703941840703350e-01 -4.7372727713110428e-02 -5.2918805512230105e-03 + 3 -4.7608195030811179e-02 5.6359658458749212e-02 7.8873497453309918e-02 + 4 -1.4760974246499454e-02 -6.7751659409952536e-02 -3.9313215655634864e-03 + 5 2.1313663202157516e-02 -1.3443672557252903e-01 8.2064656384504275e-02 + 6 -1.1575024236683594e-02 -6.1894244733982952e-02 -8.6935034245673462e-02 + 7 1.7748358555246388e-01 -1.6765295382398571e-02 -1.6339185382855703e-01 + 8 3.8537512695877643e-02 2.8817802239656277e-03 5.7435903181868454e-02 + 9 -4.3661672497074793e-03 7.3178398745341336e-02 4.6308519784801876e-02 + 10 4.1259863539102305e-02 -2.5812958655826654e-02 -4.3826734639901457e-02 + 11 -1.3165518282799465e-02 1.8218458630523299e-01 1.1545426272669201e-01 + 12 -6.7733399259645138e-02 9.1652194234576018e-02 -2.6447870252936434e-02 + 13 -1.9455426729603410e-02 -1.2238509629977596e-02 6.9675353687625771e-02 + 14 -6.1422329445997390e-02 1.2557749855175540e-01 -4.9304830205294393e-02 + 15 8.6308523829317876e-02 -1.0889532090040785e-01 5.2496407713659141e-02 + 16 4.4651613657546968e-02 7.6944323696811839e-02 -2.4040698522815755e-02 + 17 -1.4660102558204040e-02 -4.9685246781568174e-02 -2.4572258056605012e-02 + 18 -1.2856883430845711e-02 -5.6076883681854962e-02 -1.3958591931201077e-03 + 19 2.2170928675357086e-02 -1.7288215998928068e-02 -1.5201520857254522e-02 + 20 2.6272222661022165e-02 8.5554868509943122e-02 5.7823510344439319e-02 + 21 4.1494021103853522e-02 -2.4613625707145176e-02 -3.0953688912025001e-02 + 22 -4.0809890969936584e-02 -2.6168085551703767e-02 -1.5255609833103144e-02 + 23 -7.3872747352577081e-02 -2.2173454605334438e-03 -7.7036478068616243e-02 + 24 9.4790867438641666e-02 -3.2522064344286165e-02 2.0523991204228373e-01 + 25 1.0996360979808894e-02 1.0457324134207509e-01 3.8160655015742555e-02 + 26 2.7180305558084199e-02 -1.3116538404847422e-01 3.6110595767989306e-02 + 27 7.0248662400454881e-02 -9.1063158802785635e-02 -4.2288794757346433e-02 + 28 -6.7143147282002769e-02 -1.9053295841140832e-02 -1.0656587790934369e-02 + 29 6.5337989418164846e-03 2.2944541482470913e-02 -8.9087193210288684e-02 + 30 2.9970751011760721e-02 1.0396826329558732e-02 -1.2495752151879330e-01 + 31 5.5505466928987612e-02 -2.1903847926101318e-02 9.6697592119646333e-03 + 32 7.0381714429219866e-02 -3.6583581825860884e-02 -1.1241958490010407e-02 + 33 -1.2159230459305347e-01 -1.0239249789412347e-02 -1.4883455040462321e-02 + 34 -4.2901408727422090e-02 4.4505095509425267e-02 -7.7713999468938685e-02 + 35 -6.5063096755823193e-03 5.5990899412002887e-02 -1.1358543869721847e-01 + 36 7.0504042541564504e-02 6.3157474981652612e-02 6.0372891180962077e-02 + 37 -1.4622365496505865e-01 -9.4074160652886679e-02 1.8220037803759965e-03 + 38 -2.2558658699243731e-02 1.0109863601039813e-01 2.0729064600432008e-02 + 39 1.0185203090816815e-01 1.6930833830408082e-02 3.4094884676207637e-03 + 40 -6.9311117360034702e-03 -6.8048384806321568e-02 -6.0483200119468925e-03 + 41 2.4466110896717755e-02 2.9130800885586516e-02 -6.9679215754935159e-02 + 42 9.2936945569623383e-02 -5.3292129011718752e-02 -1.5575905949663149e-01 + 43 -8.4350911536471146e-02 -9.7042496662955585e-02 -8.8492233572780479e-02 + 44 -5.0622948915504444e-02 8.9307546358700945e-02 8.8315046993835133e-02 + 45 6.3330733679626758e-02 2.2981184708919144e-02 -6.5528662791692366e-02 + 46 8.3357112661552879e-05 1.0330862064415530e-01 1.1980763002238280e-01 + 47 -6.9069395288936963e-02 -2.9667494707850271e-03 -3.9463734736816358e-02 + 48 -3.8493694246522291e-02 -4.3706073079786655e-02 -3.8879786972404753e-02 + 49 2.4720255595118736e-03 4.3115266962354251e-02 -2.6044592677899589e-02 + 50 -1.4991622794673454e-01 -3.5417086447487652e-02 -3.4881060516682952e-02 + 51 4.2135098960979021e-02 4.2907947818654202e-02 9.0470087447934888e-02 + 52 -4.4940534155569985e-02 -4.3667731722015185e-02 -3.0867066705737758e-02 + 53 5.7695377465512246e-02 2.7255142167610477e-02 8.7868715906925618e-02 + 54 4.7279923414004797e-02 -1.0899898931398228e-02 9.0780917972033033e-03 +... From 9be65c7157e1ccea005f22caa810a374c85551d7 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 10 Jul 2026 17:14:02 -0400 Subject: [PATCH 018/100] fix accumulation of the long-range correction in pair style sph/lj The per-pair long-range pressure correction was added to the variable holding the EOS pressure term of atom i INSIDE the neighbor loop, so it accumulated once per neighbor list entry. The resulting forces depended on the number and order of neighbors (and thus differed completely between newton on and off even on a single processor). Apply both halves of the pair correction to the pair-local j term instead, so the per-atom value stays intact. The GPU kernels replicated the same defect and are fixed identically. With this change newton on and off produce bit-identical forces. Found by the new sph-pair-lj.yaml force-style test. --- lib/gpu/lal_sph_lj.cu | 12 ++++++++---- src/SPH/pair_sph_lj.cpp | 6 ++++-- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/lib/gpu/lal_sph_lj.cu b/lib/gpu/lal_sph_lj.cu index ae8e5aecb53..0d0e33134f4 100644 --- a/lib/gpu/lal_sph_lj.cu +++ b/lib/gpu/lal_sph_lj.cu @@ -200,9 +200,11 @@ __kernel void k_sph_lj(const __global numtyp4 *restrict x_, // apply long-range correction to model a LJ fluid with cutoff // this implies that the modelled LJ fluid has cutoff == SPH cutoff + // the correction enters the pressure term of both atoms of the pair; + // add both halves to the pair-local fj so the per-atom fi is not + // corrupted across neighbor list entries numtyp lrc = (numtyp)-11.1701 * (ihcub * ihcub * ihcub - (numtyp)1.5 * ihcub); - fi += lrc; - fj += lrc; + fj += (numtyp)2.0 * lrc; // dot product of velocity delta and distance vector numtyp delvx = iv.x - jv.x; @@ -374,9 +376,11 @@ __kernel void k_sph_lj_fast(const __global numtyp4 *restrict x_, // apply long-range correction to model a LJ fluid with cutoff // this implies that the modelled LJ fluid has cutoff == SPH cutoff + // the correction enters the pressure term of both atoms of the pair; + // add both halves to the pair-local fj so the per-atom fi is not + // corrupted across neighbor list entries numtyp lrc = (numtyp)-11.1701 * (ihcub * ihcub * ihcub - (numtyp)1.5 * ihcub); - fi += lrc; - fj += lrc; + fj += (numtyp)2.0 * lrc; // dot product of velocity delta and distance vector numtyp delvx = iv.x - jv.x; diff --git a/src/SPH/pair_sph_lj.cpp b/src/SPH/pair_sph_lj.cpp index 26f682336cd..f6d03a6a5c3 100644 --- a/src/SPH/pair_sph_lj.cpp +++ b/src/SPH/pair_sph_lj.cpp @@ -139,9 +139,11 @@ void PairSPHLJ::compute(int eflag, int vflag) // apply long-range correction to model a LJ fluid with cutoff // this implies that the modelled LJ fluid has cutoff == SPH cutoff + // the correction enters the pressure term of both atoms of the pair; + // add both halves to the pair-local fj so the per-atom fi is not + // corrupted across neighbor list entries lrc = - 11.1701 * (ihcub * ihcub * ihcub - 1.5 * ihcub); - fi += lrc; - fj += lrc; + fj += 2.0 * lrc; // dot product of velocity delta and distance vector delVdotDelR = delx * (vxtmp - v[j][0]) + dely * (vytmp - v[j][1]) From c8b0984008f5a5f4f71fa4b417964206fb7609ef Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 10 Jul 2026 17:14:02 -0400 Subject: [PATCH 019/100] make pair style sdpd/taitwater/isothermal seeding independent of command order The RNG seed included atom->nlocal at pair_style time, so the random stream differed depending on whether the pair style is defined before or after the atoms are created. comm->me already decorrelates the per-rank streams; drop the nlocal term. Also add a "nofdotr" token for the skip_tests list of the pair style tester: styles whose dissipative or random pair forces are not central (like sdpd) cannot reproduce the fdotr virial through ev_tally() and need to opt out of that comparison. --- src/DPD-SMOOTH/pair_sdpd_taitwater_isothermal.cpp | 5 ++++- unittest/force-styles/test_pair_style.cpp | 7 +++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/DPD-SMOOTH/pair_sdpd_taitwater_isothermal.cpp b/src/DPD-SMOOTH/pair_sdpd_taitwater_isothermal.cpp index 1716fb99a45..438e40fdc58 100644 --- a/src/DPD-SMOOTH/pair_sdpd_taitwater_isothermal.cpp +++ b/src/DPD-SMOOTH/pair_sdpd_taitwater_isothermal.cpp @@ -254,7 +254,10 @@ void PairSDPDTaitwaterIsothermal::settings (int narg, char **arg) { if (viscosity <= 0) error->all (FLERR, "Viscosity must be positive"); // seed is immune to underflow/overflow because it is unsigned - seed = comm->nprocs + comm->me + atom->nlocal; + // must not depend on atom->nlocal: that would make the random stream + // depend on whether the pair style is defined before or after the + // atoms are created; comm->me already decorrelates the ranks + seed = comm->nprocs + comm->me; if (narg == 3) seed += utils::inumeric(FLERR, arg[2], false, lmp); #ifdef USE_ZEST generator.seed (seed); diff --git a/unittest/force-styles/test_pair_style.cpp b/unittest/force-styles/test_pair_style.cpp index 583534d77d9..5ec59bbad9f 100644 --- a/unittest/force-styles/test_pair_style.cpp +++ b/unittest/force-styles/test_pair_style.cpp @@ -485,8 +485,11 @@ TEST(PairStyle, plain) EXPECT_FP_LE_WITH_EPS(pair->eng_coul, test_config.init_coul, epsilon); if (print_stats) std::cerr << "restart_energy stats:" << stats << std::endl; - // pair style rann does not support pair_modify nofdotr - if (test_config.pair_style != "rann") { + // pair style rann does not support pair_modify nofdotr. styles whose + // dissipative or random pair forces are not central (e.g. sdpd) cannot + // reproduce the fdotr virial through ev_tally() and may opt out with + // the "nofdotr" token in skip_tests. + if ((test_config.pair_style != "rann") && !test_config.skip_tests.count("nofdotr")) { if (!verbose) ::testing::internal::CaptureStdout(); restart_lammps(lmp, test_config, true); if (!verbose) ::testing::internal::GetCapturedStdout(); From 2f53cb25b31d50b8a2792fa7c2e7146735ec4691 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 10 Jul 2026 17:14:16 -0400 Subject: [PATCH 020/100] add force-style tests for the SPH package pair styles New in.sph template and data.sph file: a small perturbed simple cubic block of 64 sph particles with two types, nonuniform density, internal energy, and heat capacity, and nonzero velocities so that the viscous force terms contribute at the first evaluation. Covers sph/heatconduction, sph/idealgas, sph/lj, sph/rhosum, sph/taitwater, sph/taitwater/morris (SPH package), and sdpd/taitwater/isothermal (DPD-SMOOTH, using the same fixed-seed conventions as the existing dpd tests: newton on pinned, ghost velocities enabled, nofdotr comparison skipped). --- unittest/force-styles/tests/data.sph | 147 ++++++++++++++++ unittest/force-styles/tests/in.sph | 16 ++ .../tests/sph-pair-heatconduction.yaml | 159 +++++++++++++++++ .../force-styles/tests/sph-pair-idealgas.yaml | 159 +++++++++++++++++ unittest/force-styles/tests/sph-pair-lj.yaml | 159 +++++++++++++++++ .../force-styles/tests/sph-pair-rhosum.yaml | 159 +++++++++++++++++ .../sph-pair-sdpd_taitwater_isothermal.yaml | 161 ++++++++++++++++++ .../tests/sph-pair-taitwater.yaml | 159 +++++++++++++++++ .../tests/sph-pair-taitwater_morris.yaml | 159 +++++++++++++++++ 9 files changed, 1278 insertions(+) create mode 100644 unittest/force-styles/tests/data.sph create mode 100644 unittest/force-styles/tests/in.sph create mode 100644 unittest/force-styles/tests/sph-pair-heatconduction.yaml create mode 100644 unittest/force-styles/tests/sph-pair-idealgas.yaml create mode 100644 unittest/force-styles/tests/sph-pair-lj.yaml create mode 100644 unittest/force-styles/tests/sph-pair-rhosum.yaml create mode 100644 unittest/force-styles/tests/sph-pair-sdpd_taitwater_isothermal.yaml create mode 100644 unittest/force-styles/tests/sph-pair-taitwater.yaml create mode 100644 unittest/force-styles/tests/sph-pair-taitwater_morris.yaml diff --git a/unittest/force-styles/tests/data.sph b/unittest/force-styles/tests/data.sph new file mode 100644 index 00000000000..43c929c4140 --- /dev/null +++ b/unittest/force-styles/tests/data.sph @@ -0,0 +1,147 @@ +SPH fluid block for force-style tests: 2 types, perturbed sc lattice + +64 atoms +2 atom types + +0.0 4.4 xlo xhi +0.0 4.4 ylo yhi +0.0 4.4 zlo zhi + +Masses + +1 1.0 +2 1.3 + +Atoms # sph + +1 1 1.029552 1.200000 1.000000 0.05529902 0.02830311 -0.05580059 +2 2 1.017052 1.225000 1.500000 -0.03066574 -0.04581859 1.04245342 +3 1 1.004552 1.250000 1.000000 0.07509798 -0.02464683 2.20141234 +4 2 0.992052 1.275000 1.500000 0.07505085 0.02721197 3.32434581 +5 2 1.042052 1.152968 1.500000 0.01354455 1.03953659 -0.00773215 +6 1 1.029552 1.177968 1.000000 -0.02159289 1.11925442 1.09173105 +7 2 1.017052 1.202968 1.500000 0.01286897 1.15810422 2.22543669 +8 1 1.004552 1.227968 1.000000 -0.01803420 1.04454242 3.35079079 +9 1 1.054552 1.033993 1.000000 0.00098747 2.15365714 -0.01271064 +10 2 1.042052 1.058993 1.500000 0.06945814 2.16161902 1.03367546 +11 1 1.029552 1.083993 1.000000 -0.07616174 2.19686019 2.16276277 +12 2 1.017052 1.108993 1.500000 -0.07163412 2.15629907 3.23496736 +13 2 1.067052 0.899031 1.500000 0.02539343 3.29009932 0.01054136 +14 1 1.054552 0.924031 1.000000 -0.07044237 3.25315675 1.16724772 +15 2 1.042052 0.949031 1.500000 -0.04188396 3.24743517 2.12327931 +16 1 1.029552 0.974031 1.000000 0.07074042 3.27381764 3.26526387 +17 2 1.093204 1.200000 1.500000 1.11295378 -0.02193821 -0.02272414 +18 1 1.080704 1.225000 1.000000 1.04714197 -0.01561127 1.17415731 +19 2 1.068204 1.250000 1.500000 1.14112957 -0.03314958 2.20233286 +20 1 1.055704 1.275000 1.000000 1.10790337 0.03360523 3.30987711 +21 1 1.105704 1.152968 1.000000 1.04431640 1.08622019 -0.00582278 +22 2 1.093204 1.177968 1.500000 1.17241767 1.05345940 1.16631862 +23 1 1.080704 1.202968 1.000000 1.13371945 1.07289144 2.15440674 +24 2 1.068204 1.227968 1.500000 1.09332752 1.05362786 3.36564237 +25 2 1.118204 1.033993 1.500000 1.07170960 2.12502912 -0.02598432 +26 1 1.105704 1.058993 1.000000 1.07875132 2.14315620 1.12117628 +27 2 1.093204 1.083993 1.500000 1.15509855 2.12374531 2.23562464 +28 1 1.080704 1.108993 1.000000 1.07995168 2.20598761 3.33505961 +29 1 1.130704 0.899031 1.000000 1.17600594 3.36133417 0.03534366 +30 2 1.118204 0.924031 1.500000 1.02979786 3.29887208 1.14923666 +31 1 1.105704 0.949031 1.000000 1.13954547 3.33289496 2.13856668 +32 2 1.093204 0.974031 1.500000 1.17461455 3.34334797 3.29170644 +33 1 1.086321 1.200000 1.000000 2.22853273 -0.01105131 -0.01970755 +34 2 1.073821 1.225000 1.500000 2.16014616 -0.00180529 1.15297763 +35 1 1.061321 1.250000 1.000000 2.18037342 0.02218930 2.19947401 +36 2 1.048821 1.275000 1.500000 2.26146049 0.02040141 3.28831437 +37 2 1.098821 1.152968 1.500000 2.23440988 1.06509795 -0.07050284 +38 1 1.086321 1.177968 1.000000 2.18491860 1.14888417 1.16301048 +39 2 1.073821 1.202968 1.500000 2.21766981 1.04792498 2.19089844 +40 1 1.061321 1.227968 1.000000 2.16869174 1.08970347 3.26371578 +41 1 1.111321 1.033993 1.000000 2.23054006 2.26582445 0.07304939 +42 2 1.098821 1.058993 1.500000 2.27315671 2.24163465 1.08078417 +43 1 1.086321 1.083993 1.000000 2.18606188 2.24991766 2.27800770 +44 2 1.073821 1.108993 1.500000 2.23135231 2.12436774 3.27579909 +45 2 1.123821 0.899031 1.500000 2.18574494 3.28999418 -0.01270853 +46 1 1.111321 0.924031 1.000000 2.22878614 3.31867087 1.11513598 +47 2 1.098821 0.949031 1.500000 2.27609127 3.22475431 2.22068227 +48 1 1.086321 0.974031 1.000000 2.27543489 3.27335732 3.30276256 +49 2 1.014112 1.200000 1.500000 3.22265692 -0.04993713 -0.05215504 +50 1 1.001612 1.225000 1.000000 3.29207384 0.04068909 1.14794870 +51 2 0.989112 1.250000 1.500000 3.33799968 0.06064463 2.26728590 +52 1 0.976612 1.275000 1.000000 3.25209398 -0.05057549 3.30270421 +53 1 1.026612 1.152968 1.000000 3.24631854 1.09696839 -0.06999935 +54 2 1.014112 1.177968 1.500000 3.27083571 1.12754819 1.16444630 +55 1 1.001612 1.202968 1.000000 3.30801330 1.06930632 2.25098559 +56 2 0.989112 1.227968 1.500000 3.28592390 1.07406896 3.37429988 +57 2 1.039112 1.033993 1.500000 3.26391272 2.19751097 -0.02969045 +58 1 1.026612 1.058993 1.000000 3.30777922 2.24510490 1.02632363 +59 2 1.014112 1.083993 1.500000 3.22631141 2.25257111 2.25596451 +60 1 1.001612 1.108993 1.000000 3.32702405 2.26806198 3.25097782 +61 1 1.051612 0.899031 1.000000 3.36452134 3.37479967 0.06804707 +62 2 1.039112 0.924031 1.500000 3.33704086 3.35106494 1.04402498 +63 1 1.026612 0.949031 1.000000 3.23903766 3.23476540 2.26741988 +64 2 1.014112 0.974031 1.500000 3.29726915 3.37091785 3.37052749 + +Velocities + +1 0.04267352 -0.02264905 0.02921697 +2 -0.04572513 0.03100855 0.03559139 +3 -0.04374377 0.03088909 0.03681943 +4 -0.00123839 0.00685559 -0.03363964 +5 0.02766608 0.00337410 0.01841909 +6 0.02740909 -0.00796807 0.00384155 +7 0.04985453 -0.03513854 0.03363179 +8 0.01812025 0.01316070 -0.01234141 +9 0.01673080 0.01099089 -0.04928509 +10 -0.04815449 -0.01126861 -0.01523321 +11 -0.01476842 0.03624967 0.00359177 +12 -0.02537976 0.04380841 -0.04352948 +13 0.02249802 0.02932862 -0.00591970 +14 -0.02460833 -0.00670099 0.02662428 +15 0.03946785 -0.00120374 -0.03581383 +16 0.03471635 -0.00230345 -0.02007876 +17 -0.03661232 -0.01157799 0.00230718 +18 -0.01988705 0.03737157 -0.01600620 +19 0.00782663 -0.03143082 0.02604715 +20 -0.00220414 -0.02308375 -0.00778317 +21 -0.02491267 0.04802381 0.03606415 +22 0.02587858 -0.03338367 0.02280509 +23 -0.03837340 -0.04043931 0.01761662 +24 0.03291150 0.03134267 -0.01539421 +25 0.00215991 0.00542911 -0.04064995 +26 -0.00673738 -0.00240879 -0.00147970 +27 0.00365707 0.02485029 0.02884987 +28 -0.02341677 0.03926550 -0.04432192 +29 -0.01616935 0.04540496 -0.03766222 +30 0.02122407 -0.00375746 -0.00331165 +31 0.00133484 0.04402652 -0.01922215 +32 0.00508197 0.04643220 -0.01093854 +33 0.01124389 0.01295031 -0.03811380 +34 -0.00951200 -0.01147593 0.02748564 +35 0.02385697 -0.02835467 0.02946076 +36 0.01464530 0.00169097 -0.00384071 +37 -0.00923543 -0.00983286 0.02220530 +38 0.01704463 0.02492793 -0.04534217 +39 -0.04085335 0.03381016 -0.01006634 +40 -0.02878107 -0.03796041 -0.02060737 +41 0.02796347 0.00044064 -0.00113419 +42 -0.04421731 -0.04602760 -0.01703318 +43 0.01096762 -0.00875072 0.01850240 +44 -0.01136754 0.04605225 0.03876048 +45 -0.02061465 0.02470576 -0.03080910 +46 -0.02526773 0.01689530 -0.02086361 +47 -0.02818331 -0.04414105 0.01012116 +48 0.04738956 0.01783646 -0.01858319 +49 -0.01267448 -0.01981269 -0.00953245 +50 -0.02645526 -0.03750213 0.00397010 +51 -0.01331747 0.00165729 -0.02782700 +52 0.00937094 0.01577974 -0.02959447 +53 -0.03572450 0.02227715 0.01677259 +54 0.02958298 0.01089465 -0.02533393 +55 0.02887911 0.03184550 0.00834158 +56 0.03389664 0.03445287 0.03354892 +57 -0.02015108 -0.01453966 0.04637253 +58 -0.00722932 -0.02428313 -0.04954114 +59 0.03099049 0.03951202 0.01424419 +60 -0.03325990 -0.04603315 0.02119335 +61 -0.00675874 -0.00227249 -0.02923099 +62 -0.01206507 0.04797677 -0.00298232 +63 -0.04804870 0.02531816 -0.02025644 +64 0.04527819 -0.01044824 -0.01327267 diff --git a/unittest/force-styles/tests/in.sph b/unittest/force-styles/tests/in.sph new file mode 100644 index 00000000000..d9841d90d64 --- /dev/null +++ b/unittest/force-styles/tests/in.sph @@ -0,0 +1,16 @@ +variable newton_pair index on +variable newton_bond index on +variable units index lj +variable input_dir index . +variable data_file index ${input_dir}/data.sph +variable pair_style index 'zero 2.0' + +atom_style sph +atom_modify map array +neigh_modify delay 2 every 2 check no +units ${units} +timestep 0.0005 +newton ${newton_pair} ${newton_bond} + +pair_style ${pair_style} +read_data ${data_file} diff --git a/unittest/force-styles/tests/sph-pair-heatconduction.yaml b/unittest/force-styles/tests/sph-pair-heatconduction.yaml new file mode 100644 index 00000000000..f586f40a7a2 --- /dev/null +++ b/unittest/force-styles/tests/sph-pair-heatconduction.yaml @@ -0,0 +1,159 @@ +--- +lammps_version: 4 Jul 2026 +tags: generated +date_generated: Fri Jul 10 17:05:33 2026 +epsilon: 6e-12 +skip_tests: single +prerequisites: | + atom sph + pair sph/heatconduction +pre_commands: | + variable units index lj +post_commands: "" +input_file: in.sph +pair_style: sph/heatconduction +pair_coeff: | + 1 1 0.5 2.0 + 1 2 0.4 2.0 + 2 2 0.3 2.0 +extract: "" +natoms: 64 +init_vdwl: 0 +init_coul: 0 +init_stress: |2- + 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +init_forces: |2 + 1 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 2 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 3 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 4 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 5 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 6 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 7 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 8 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 9 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 10 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 11 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 12 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 13 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 14 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 15 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 16 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 17 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 18 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 19 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 20 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 21 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 22 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 23 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 24 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 25 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 26 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 27 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 28 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 29 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 30 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 31 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 32 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 33 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 34 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 35 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 36 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 37 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 38 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 39 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 40 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 41 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 42 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 43 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 44 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 45 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 46 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 47 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 48 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 49 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 50 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 51 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 52 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 53 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 54 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 55 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 56 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 57 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 58 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 59 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 60 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 61 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 62 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 63 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 64 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +run_vdwl: 0 +run_coul: 0 +run_stress: |2- + 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +run_forces: |2 + 1 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 2 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 3 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 4 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 5 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 6 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 7 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 8 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 9 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 10 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 11 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 12 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 13 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 14 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 15 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 16 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 17 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 18 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 19 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 20 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 21 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 22 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 23 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 24 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 25 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 26 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 27 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 28 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 29 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 30 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 31 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 32 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 33 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 34 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 35 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 36 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 37 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 38 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 39 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 40 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 41 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 42 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 43 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 44 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 45 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 46 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 47 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 48 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 49 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 50 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 51 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 52 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 53 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 54 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 55 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 56 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 57 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 58 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 59 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 60 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 61 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 62 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 63 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 64 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +... diff --git a/unittest/force-styles/tests/sph-pair-idealgas.yaml b/unittest/force-styles/tests/sph-pair-idealgas.yaml new file mode 100644 index 00000000000..bd013354c6f --- /dev/null +++ b/unittest/force-styles/tests/sph-pair-idealgas.yaml @@ -0,0 +1,159 @@ +--- +lammps_version: 4 Jul 2026 +tags: generated +date_generated: Fri Jul 10 17:05:34 2026 +epsilon: 5e-09 +skip_tests: single +prerequisites: | + atom sph + pair sph/idealgas +pre_commands: | + variable units index lj +post_commands: "" +input_file: in.sph +pair_style: sph/idealgas +pair_coeff: | + 1 1 0.2 2.0 + 1 2 0.25 2.0 + 2 2 0.3 2.0 +extract: "" +natoms: 64 +init_vdwl: 0 +init_coul: 0 +init_stress: |2- + 2.4013458349055117e+01 2.4038577613047522e+01 2.3982136668807563e+01 -3.0745054557936896e-03 6.4547097536483168e-03 4.8408779447557714e-04 +init_forces: |2 + 1 -5.0465363977577088e-02 -7.9011137915555224e-02 7.6068124200869891e-02 + 2 1.4273970642377926e-03 2.6666595667141205e-02 -2.0163176124892157e-03 + 3 -4.9064374413907139e-02 -2.7150109921477233e-02 3.5569447726929715e-03 + 4 -6.2969973174204719e-02 -1.2361773380147842e-01 -5.9334938980173127e-02 + 5 -5.9494290342245848e-02 5.2643982577965306e-02 9.8716461067544836e-02 + 6 -1.9569359476594467e-02 -1.0187660679951388e-02 -2.4153463707667355e-03 + 7 2.2417142916042188e-02 4.1662473558061186e-03 -3.2703807897527193e-02 + 8 -6.3143067306376602e-03 6.8279279934009562e-02 -5.7042271672473083e-02 + 9 -8.6930489332897876e-03 8.2216861352901363e-02 -7.6893914125580609e-03 + 10 -9.3144755800066426e-03 3.8499569597259947e-02 2.7529606781198021e-03 + 11 5.2804500838635637e-02 2.5875747055891046e-02 -1.4865374892418792e-02 + 12 7.2893956774622765e-02 7.7752741533393552e-02 4.4400739694041513e-02 + 13 4.0547971860627086e-02 -6.1177829205711645e-02 -2.9343558806279701e-02 + 14 1.8991269769742476e-02 -2.0973215003195933e-02 -2.1324984387632577e-02 + 15 2.0309921550690654e-02 -4.7024408822073233e-03 5.7651185899111564e-02 + 16 1.8914223047158951e-02 -2.5831678924168183e-02 7.6531188077506029e-03 + 17 6.6353443641697887e-02 -5.7939298307534061e-02 9.7009521457767173e-02 + 18 -4.5729205247653781e-03 -2.0482711369993946e-02 -9.0851462677532038e-02 + 19 -3.2575206321134267e-02 -6.3729269826432927e-02 3.4224628050706814e-02 + 20 4.6863004675641293e-02 -7.1915663877896441e-02 -2.8514796809304001e-02 + 21 9.1176963407285011e-02 4.0482580025091822e-02 8.2800182454763380e-02 + 22 -1.5821070045599489e-02 3.6679318820770072e-02 -1.0990427277642323e-01 + 23 -6.0448877083042050e-02 6.1085498323165330e-02 4.4944501587283893e-02 + 24 3.5399468725146155e-02 9.0759854530662057e-02 -5.8367029698921151e-02 + 25 5.8972908998310897e-02 9.5580604398649335e-02 1.4299197144599513e-02 + 26 4.1503176150201701e-02 7.8221952049757570e-02 -2.2495920067716873e-02 + 27 -3.4428073844030543e-02 9.7687976296158330e-02 5.2922865512013782e-03 + 28 -8.7089297340188221e-03 7.0670577171391205e-02 -2.1553126898674058e-03 + 29 -2.0597163088988034e-02 -7.3533943951860803e-02 2.7614101521226501e-02 + 30 5.3921359455169848e-02 -8.2843789581640959e-02 -5.3726029596535697e-02 + 31 6.5674580274108219e-04 -8.5848451525815911e-02 2.6791331575120491e-02 + 32 -1.8182385440940294e-02 -9.6647023485251782e-02 -7.2840331885416255e-03 + 33 -6.4773989514771563e-02 -7.3097102120596611e-03 1.0174477176510516e-01 + 34 3.3624790324044168e-02 -7.4228231230884206e-02 -9.0424692719955513e-02 + 35 1.6745851593064937e-02 -9.8063908000130151e-02 -4.8279841746140528e-03 + 36 -1.0254699788132282e-01 -7.6409336173514752e-02 -2.4839064775510206e-02 + 37 -6.7416392015291066e-02 6.5456628286497315e-02 1.2702532825713972e-01 + 38 1.2927026179754098e-02 3.9065297106547325e-02 -9.7450132513063586e-02 + 39 8.3640897504650702e-03 8.6891564762871382e-02 7.7411915344560711e-03 + 40 -3.7546120356255111e-02 7.0191759961427791e-02 8.9486065950751328e-03 + 41 -6.2536758626536015e-02 7.2269491520830093e-03 -2.0295967994317932e-02 + 42 -7.3148114867252506e-02 2.4276910406369985e-02 -3.6190526578689652e-03 + 43 -5.2647647764465282e-02 -2.3764024282820866e-03 -5.8223764794748861e-02 + 44 -6.1454449111988101e-02 4.4936177446245423e-02 7.9762617447782957e-02 + 45 -5.6022300297678254e-02 -5.7427912458988858e-02 1.9791194349347698e-02 + 46 -3.0760778377033417e-02 -1.2785394250906770e-02 -2.4257234628049240e-03 + 47 -5.4653983731024092e-02 4.5218774360416894e-02 -5.2497767746572950e-02 + 48 -8.4991402930741825e-02 -2.8770883609063033e-02 2.9276522518816305e-02 + 49 5.7450237304188648e-02 -1.8969571229690667e-03 1.1737524100379991e-01 + 50 2.4546797925516055e-03 -1.3901059129223358e-02 -2.1611239052216527e-02 + 51 5.6247485979350892e-02 -1.1274748928891561e-01 -6.4767518013126107e-02 + 52 8.4559292696361865e-02 -5.4170145451884186e-02 -4.0106246452689343e-02 + 53 2.6565931192563248e-02 2.9759292239870921e-02 1.0378405418685320e-01 + 54 1.6380887820249206e-02 2.7405224495898023e-02 -7.8151541008619207e-02 + 55 2.3094968072966106e-02 6.0900266060331221e-02 -2.5222203202622657e-02 + 56 3.7720086132907706e-02 7.2792364462542128e-02 -2.5243389296872941e-02 + 57 3.1203732198719129e-02 4.1051307030858859e-02 4.6835445355358045e-03 + 58 1.6267815712134766e-02 -1.0588836106583368e-02 2.5716469974094165e-02 + 59 2.7711068810307285e-02 -3.2275977376762827e-02 -9.6630283584678664e-02 + 60 1.6584628187372982e-02 1.5554949993257568e-02 7.9431307360772044e-02 + 61 2.3538527342878021e-02 -5.9194976055690678e-02 -8.6393420990850227e-03 + 62 -2.7970723698767977e-02 -2.5473281019145567e-02 2.8732152753392037e-02 + 63 3.2519858998487292e-02 6.6513527124251959e-02 -5.9911746878727620e-02 + 64 7.0575065117791755e-02 -7.1297921404307130e-02 1.7134222220285423e-02 +run_vdwl: 0 +run_coul: 0 +run_stress: |2- + 2.4013396812039417e+01 2.4038587080915526e+01 2.3982124849509251e+01 -3.1412608059380020e-03 6.4222810562164119e-03 4.4437776364077098e-04 +run_forces: |2 + 1 -5.0554676953596001e-02 -7.8952234844903962e-02 7.6015203185741051e-02 + 2 1.4653046975274669e-03 2.6623027079613393e-02 -2.0332003107583763e-03 + 3 -4.9043860347507351e-02 -2.7223454268720304e-02 3.4926547754950410e-03 + 4 -6.3015703943837709e-02 -1.2357365519455651e-01 -5.9228007991223866e-02 + 5 -5.9535408850136418e-02 5.2600959742240598e-02 9.8626776968730540e-02 + 6 -1.9592010938087739e-02 -1.0139007194828298e-02 -2.3961852724442290e-03 + 7 2.2353999316620354e-02 4.2707819111495737e-03 -3.2766997911699125e-02 + 8 -6.3217585953293451e-03 6.8264967943239371e-02 -5.6935900761960673e-02 + 9 -8.6939478296006178e-03 8.2252577616304196e-02 -7.6765442745710954e-03 + 10 -9.2520734420303008e-03 3.8510060612179403e-02 2.7771510489453116e-03 + 11 5.2798249195752045e-02 2.5833296636392306e-02 -1.4919488887513183e-02 + 12 7.2896663061376182e-02 7.7722542822083213e-02 4.4469821262990969e-02 + 13 4.0492146077050983e-02 -6.1233269989565221e-02 -2.9285567127393691e-02 + 14 1.9014880879144026e-02 -2.0980007335148237e-02 -2.1358122289192857e-02 + 15 2.0281949527193990e-02 -4.6944614828279829e-03 5.7638953191234521e-02 + 16 1.8842274249890378e-02 -2.5828038013589460e-02 7.6582949588428484e-03 + 17 6.6407904110248842e-02 -5.7866471651113721e-02 9.7001582038694356e-02 + 18 -4.5575971264232851e-03 -2.0510965363462870e-02 -9.0834173118221812e-02 + 19 -3.2540353633282254e-02 -6.3734348942077759e-02 3.4147670198413201e-02 + 20 4.6856642403267361e-02 -7.1845656109110673e-02 -2.8453087903690045e-02 + 21 9.1198483513489012e-02 4.0456040325244219e-02 8.2724237699676906e-02 + 22 -1.5827515616499782e-02 3.6717835508106922e-02 -1.0988206395474043e-01 + 23 -6.0404891635343780e-02 6.1122610822875907e-02 4.4883909659115019e-02 + 24 3.5384974247468115e-02 9.0724526886439574e-02 -5.8260751353421049e-02 + 25 5.8967089778018095e-02 9.5608608512041116e-02 1.4336378078231311e-02 + 26 4.1462260215469948e-02 7.8235816267908362e-02 -2.2477804860810986e-02 + 27 -3.4442029535977942e-02 9.7658933442718684e-02 5.2072388664587497e-03 + 28 -8.6769177693747646e-03 7.0648960875290809e-02 -2.1257387586912369e-03 + 29 -2.0560281319879276e-02 -7.3611903002460566e-02 2.7671526860970928e-02 + 30 5.3877407059557542e-02 -8.2852464061086192e-02 -5.3752078041064154e-02 + 31 6.5328666826988679e-04 -8.5868513595220686e-02 2.6748577089113892e-02 + 32 -1.8158502334823648e-02 -9.6712372198453744e-02 -7.2629661714302372e-03 + 33 -6.4799452314711403e-02 -7.2914731339859748e-03 1.0177736025718276e-01 + 34 3.3617270585703143e-02 -7.4186618945256300e-02 -9.0439361895469528e-02 + 35 1.6752288192743908e-02 -9.7972510526048939e-02 -4.8866020974215885e-03 + 36 -1.0251147983350554e-01 -7.6355176637113886e-02 -2.4831135418392408e-02 + 37 -6.7462597134597888e-02 6.5394021709240718e-02 1.2694529019448800e-01 + 38 1.2929796710271529e-02 3.8994605355614442e-02 -9.7336739671720948e-02 + 39 8.4635999523190938e-03 8.6894110512909045e-02 7.7356868351948979e-03 + 40 -3.7505163019207741e-02 7.0213660048650983e-02 8.9460945699273153e-03 + 41 -6.2598251562839963e-02 7.2884473162016655e-03 -2.0317644696043302e-02 + 42 -7.3126950507080402e-02 2.4380690667182077e-02 -3.5635090121536317e-03 + 43 -5.2622265013438203e-02 -2.4186613749311737e-03 -5.8259229228078267e-02 + 44 -6.1444331486899872e-02 4.4879730474314816e-02 7.9765617113806433e-02 + 45 -5.6022329841351658e-02 -5.7456327947534448e-02 1.9836523069240445e-02 + 46 -3.0745625650373313e-02 -1.2840857416773672e-02 -2.4454700198405510e-03 + 47 -5.4639783126269000e-02 4.5185979594480306e-02 -5.2533742932538458e-02 + 48 -8.4993924938626744e-02 -2.8786109125134681e-02 2.9299111868464976e-02 + 49 5.7520419538186825e-02 -1.8482678246085592e-03 1.1735145664332340e-01 + 50 2.4311981109821808e-03 -1.3820720671332042e-02 -2.1639597947624409e-02 + 51 5.6194085834365581e-02 -1.1266756340057525e-01 -6.4725779419413390e-02 + 52 8.4592553770423129e-02 -5.4120362063209547e-02 -4.0062064130499217e-02 + 53 2.6642366357095139e-02 2.9655828700830555e-02 1.0372093359192230e-01 + 54 1.6359783015026878e-02 2.7342299622168435e-02 -7.8017265417875986e-02 + 55 2.3008513571137569e-02 6.0906406463975313e-02 -2.5266727257926155e-02 + 56 3.7674407027315490e-02 7.2731247910848049e-02 -2.5255542410858645e-02 + 57 3.1262626156567448e-02 4.1127916643981820e-02 4.6395218953648116e-03 + 58 1.6262263837561110e-02 -1.0498494977197285e-02 2.5799640803359718e-02 + 59 2.7676436731503815e-02 -3.2314064956416012e-02 -9.6709883903740801e-02 + 60 1.6581188854961092e-02 1.5565580305031544e-02 7.9422566678629417e-02 + 61 2.3565488485380467e-02 -5.9215169795344830e-02 -8.6355579053794887e-03 + 62 -2.7987126948088623e-02 -2.5577094955386258e-02 2.8713732776488261e-02 + 63 3.2534675966115735e-02 6.6465644367479079e-02 -5.9924138787049462e-02 + 64 7.0614333550715974e-02 -7.1281419698761464e-02 1.7145158960806341e-02 +... diff --git a/unittest/force-styles/tests/sph-pair-lj.yaml b/unittest/force-styles/tests/sph-pair-lj.yaml new file mode 100644 index 00000000000..453513c55f8 --- /dev/null +++ b/unittest/force-styles/tests/sph-pair-lj.yaml @@ -0,0 +1,159 @@ +--- +lammps_version: 4 Jul 2026 +tags: generated +date_generated: Fri Jul 10 17:05:35 2026 +epsilon: 5e-09 +skip_tests: single +prerequisites: | + atom sph + pair sph/lj +pre_commands: | + variable units index lj +post_commands: "" +input_file: in.sph +pair_style: sph/lj +pair_coeff: | + 1 1 0.2 2.0 + 1 2 0.25 2.0 + 2 2 0.3 2.0 +extract: "" +natoms: 64 +init_vdwl: 0 +init_coul: 0 +init_stress: |2- + 7.4474101499456651e+02 7.4564831296188038e+02 7.4364112768989003e+02 -3.3717915627154776e-01 1.1941971181573532e-01 -1.1600143946933207e-01 +init_forces: |2 + 1 -3.5460922333270615e+00 -1.2377769144173612e+00 1.2098821254045893e+00 + 2 -2.6114623968420316e+00 2.0699914954689085e+00 6.8787814641359102e-01 + 3 -3.3746467864932330e+00 2.5917569856512923e-01 8.9124293587831982e-01 + 4 -4.0885477272373869e+00 -1.9701335327111815e+00 -2.3072150065185117e+00 + 5 -4.5834349780121872e+00 1.7017263613759570e-01 1.7902011851687920e+00 + 6 -2.6145471177619726e+00 -1.0244448938170569e+00 6.1775372690895836e-01 + 7 -2.0707914198569863e+00 -7.8997073202608403e-01 1.1731108079765562e-01 + 8 -2.0940965385588810e+00 9.3495176080811837e-01 -2.2744111104948335e+00 + 9 -2.7368383111037815e+00 1.5799944922889917e+00 -8.8838816055937819e-01 + 10 -3.4534487844612958e+00 -3.0063676886899593e-01 1.0832205809918372e+00 + 11 -4.6626983207968298e-01 -1.7317279227566740e-01 3.8828469086936312e-01 + 12 -6.9174792119490025e-01 1.0145654292038957e+00 1.9791901962611336e-01 + 13 -1.7530726367644824e+00 -8.4827822207623160e-01 -2.0578496066532326e+00 + 14 -1.8234595225586243e+00 5.2249566902595745e-03 3.1201249576142009e-02 + 15 -2.1556429790025287e+00 5.3136147575187165e-01 2.9503249604138833e+00 + 16 -1.7123756771367837e+00 -7.9860655338523934e-02 -4.7657552069345233e-01 + 17 -1.4618166845303995e-01 2.8567914353920898e-01 2.1167398686367354e+00 + 18 -1.8439966787586304e+00 9.0108999018969305e-01 -2.1809935663041289e+00 + 19 -2.7804340402363859e+00 -2.3973286967438479e-01 2.4087046074628402e+00 + 20 -2.8568555088723047e-01 -1.0151585193766388e+00 -1.7703540475738830e+00 + 21 1.3677169890685255e+00 -9.7015174547167293e-04 2.0962716275609341e+00 + 22 -2.1986413459218621e+00 -7.6174937000271559e-02 -2.8993353948416436e+00 + 23 -3.4292536090594519e+00 8.7515119438086897e-01 2.4164563810199242e+00 + 24 -1.0159517764228125e+00 1.2154012591368735e+00 -3.2515979564692712e+00 + 25 1.4724612688803740e-01 2.0838983798585753e+00 -5.1295258666075494e-01 + 26 -2.1031094662723193e-01 1.3949089273249844e+00 3.0391665201890905e-02 + 27 -3.1906801409547105e+00 1.8571372861253193e+00 1.3254813833214367e+00 + 28 -1.8723996030414778e+00 1.3175393013747010e+00 -1.1561657356294033e+00 + 29 -2.8413848516600297e+00 -1.6172382337867135e+00 2.1499653286155185e-01 + 30 -1.5839761008125564e-01 -2.0720957633146164e+00 -1.0552411201376466e+00 + 31 -1.5853934545893891e+00 -1.8622855729692471e+00 2.2560004683269916e+00 + 32 -2.8904446442664020e+00 -1.9965046578165286e+00 -1.7035797030100404e+00 + 33 4.4376093938874989e-01 1.4449294122886631e+00 2.4400137733941856e+00 + 34 3.7072195552327791e+00 -6.5752017224806858e-01 -1.9358561338484612e+00 + 35 2.5386217850749153e+00 -1.8324903431579944e+00 7.5780750104102346e-01 + 36 3.1132846375291034e-01 -8.5803210605167557e-01 -1.7620243276243421e+00 + 37 7.2809278089617524e-01 9.0293707692621794e-01 3.1953608581374331e+00 + 38 2.6288222149137725e+00 1.7129188303205112e-01 -2.5109586271735802e+00 + 39 3.2629296904169021e+00 1.4418797273372692e+00 1.2897816376688618e+00 + 40 8.3770513435436023e-01 1.1090277790234491e+00 -3.8588353252749141e-01 + 41 1.2780436601200551e-01 -1.6260079600160822e+00 -1.4423318149028876e+00 + 42 3.5870793497860248e-01 -1.1889347563482657e+00 1.0638577421027238e+00 + 43 4.1397621230448522e-01 -1.4775345021401196e+00 -1.1343007349105423e+00 + 44 9.5233259427084582e-01 -1.9274644996143978e-01 1.6945749243007415e+00 + 45 9.4725056850492784e-01 -8.1065521951949826e-01 -4.2263158748494373e-01 + 46 1.3298555929449205e+00 9.0025796006456882e-01 1.0303746325162928e+00 + 47 1.0914121065553581e+00 2.7458115150851041e+00 -7.6563600782625718e-01 + 48 -1.4657191545888398e-01 6.6768652809717999e-02 -9.1831699949152412e-02 + 49 3.8031022498174627e+00 1.1852633020527197e+00 1.7813455716308138e+00 + 50 1.5430840030263027e+00 4.5702652083755202e-01 7.0091984650109795e-02 + 51 2.8929491825786218e+00 -1.7127199978875343e+00 -6.1087412339105907e-01 + 52 3.4323293046464878e+00 -4.4563080694857571e-01 -1.4967342792188894e+00 + 53 2.4927228912585417e+00 4.7233109046010746e-02 1.9225875576896483e+00 + 54 2.4350634313110997e+00 -3.2641705046419661e-01 -1.0698101641651192e+00 + 55 2.0009026869627502e+00 7.8811492429873364e-01 -4.1033693772150749e-02 + 56 2.8818037165794750e+00 7.4214970281179682e-01 -1.5680772481303782e+00 + 57 3.4187787489411026e+00 -2.0695803339318675e-01 -1.0020514844053672e+00 + 58 2.2469220275907009e+00 -1.2692347484210154e+00 1.3971733855127644e+00 + 59 3.3409121375952644e+00 -2.0457438402778845e+00 -1.5425382154542087e+00 + 60 1.9534441918795669e+00 -3.6050315538625471e-01 1.4951007695584770e+00 + 61 2.3332186288138126e+00 -5.7355826846336411e-01 -9.1737995278667495e-01 + 62 1.4102951110096456e+00 5.9786868854207198e-01 1.6327858399409416e+00 + 63 3.0378014023525814e+00 2.3427548572880710e+00 -7.9718687506995778e-01 + 64 3.9540899288889171e+00 -5.5043591038884765e-01 -5.6931839639792536e-01 +run_vdwl: 0 +run_coul: 0 +run_stress: |2- + 7.4473957838589308e+02 7.4564813230364348e+02 7.4364084787955983e+02 -3.3878468654839711e-01 1.1801835868993425e-01 -1.1723613514255982e-01 +run_forces: |2 + 1 -3.5485161700475505e+00 -1.2357430474153608e+00 1.2084877406002925e+00 + 2 -2.6101054670390065e+00 2.0684309007739667e+00 6.8768322121683934e-01 + 3 -3.3738120324504846e+00 2.5721011777251857e-01 8.8953960203160687e-01 + 4 -4.0893640769415898e+00 -1.9687399126785023e+00 -2.3046171994757949e+00 + 5 -4.5843912013796499e+00 1.6907271755268138e-01 1.7877349818736592e+00 + 6 -2.6151008211648685e+00 -1.0229754201015369e+00 6.1823162042704727e-01 + 7 -2.0724034256107267e+00 -7.8745439724881638e-01 1.1578799509487858e-01 + 8 -2.0941349956094895e+00 9.3446169852589711e-01 -2.2716196343988013e+00 + 9 -2.7368053996855322e+00 1.5810619599075690e+00 -8.8805977005063497e-01 + 10 -3.4509523576267327e+00 -3.0020286914865935e-01 1.0837044020117523e+00 + 11 -4.6629065407857384e-01 -1.7424637273005050e-01 3.8681074201550292e-01 + 12 -6.9169269851801918e-01 1.0137363817553804e+00 1.9987607076715275e-01 + 13 -1.7550232350719046e+00 -8.5013515535766704e-01 -2.0556748730304140e+00 + 14 -1.8224196758427500e+00 4.9135290506612250e-03 3.0161262476768425e-02 + 15 -2.1566978063413176e+00 5.3147352248621593e-01 2.9499363375658758e+00 + 16 -1.7145806531401533e+00 -7.9834625118899716e-02 -4.7648351024405589e-01 + 17 -1.4455823075781710e-01 2.8877406288044966e-01 2.1162975050681956e+00 + 18 -1.8435357161283292e+00 8.9991844924513598e-01 -2.1803226128741295e+00 + 19 -2.7791885876916460e+00 -2.3930690773655150e-01 2.4061165311371688e+00 + 20 -2.8591971879958678e-01 -1.0124730645780642e+00 -1.7683153112866212e+00 + 21 1.3682342665076284e+00 -1.9827815423968248e-03 2.0936491465000877e+00 + 22 -2.1986901237346954e+00 -7.4670437161783676e-02 -2.8982423270073232e+00 + 23 -3.4279898709776209e+00 8.7633707674914119e-01 2.4143269757052170e+00 + 24 -1.0160737700022402e+00 1.2140005799561855e+00 -3.2479473768443103e+00 + 25 1.4702242981503777e-01 2.0850045219689815e+00 -5.1150380183024979e-01 + 26 -2.1191453564540264e-01 1.3953821557051764e+00 3.0945360314024256e-02 + 27 -3.1910981262779394e+00 1.8558437024151735e+00 1.3222771226933321e+00 + 28 -1.8714285598361187e+00 1.3167926798046368e+00 -1.1548572438205005e+00 + 29 -2.8398843860446132e+00 -1.6202542483046551e+00 2.1731170207447770e-01 + 30 -1.6002653119291654e-01 -2.0727685306127279e+00 -1.0564472713588042e+00 + 31 -1.5854799951498979e+00 -1.8626418781046346e+00 2.2542938661349137e+00 + 32 -2.8895177706775885e+00 -1.9984866994043613e+00 -1.7028261608883679e+00 + 33 4.4302580762752541e-01 1.4454496230728628e+00 2.4407541413382119e+00 + 34 3.7069110741863445e+00 -6.5622413115751255e-01 -1.9359928186537187e+00 + 35 2.5389521746548080e+00 -1.8294042954582324e+00 7.5578825526199545e-01 + 36 3.1230923052433468e-01 -8.5625060870305347e-01 -1.7617532324281031e+00 + 37 7.2633444095612432e-01 9.0062531065631468e-01 3.1922211301446111e+00 + 38 2.6287295599657408e+00 1.6882187324258346e-01 -2.5068744535815704e+00 + 39 3.2652965534512886e+00 1.4417654331633281e+00 1.2894765336448719e+00 + 40 8.3865976768724526e-01 1.1097183692514057e+00 -3.8563392658875706e-01 + 41 1.2587245418676046e-01 -1.6233823049356000e+00 -1.4429603498625312e+00 + 42 3.5923782245300878e-01 -1.1845221751715282e+00 1.0655362112498823e+00 + 43 4.1491100452331625e-01 -1.4788378118616534e+00 -1.1355270833632456e+00 + 44 9.5270508251514119e-01 -1.9481793702302957e-01 1.6944112386832990e+00 + 45 9.4730053605149356e-01 -8.1189025926824254e-01 -4.2043283267312070e-01 + 46 1.3306094463627811e+00 8.9815965001337994e-01 1.0295192384223419e+00 + 47 1.0920758598126878e+00 2.7440303060441611e+00 -7.6725140173257467e-01 + 48 -1.4630511296334087e-01 6.6332602247539896e-02 -9.0966959092465549e-02 + 49 3.8047123056130343e+00 1.1865299865342838e+00 1.7808293910064439e+00 + 50 1.5425343236280726e+00 4.5906543141185679e-01 6.9480733120893312e-02 + 51 2.8916857730588381e+00 -1.7109876384835132e+00 -6.1014427164121177e-01 + 52 3.4329202711425637e+00 -4.4448199952570949e-01 -1.4955541581538210e+00 + 53 2.4949386488492475e+00 4.4607542275147516e-02 1.9206974702134829e+00 + 54 2.4342330779160699e+00 -3.2804528459346965e-01 -1.0663921106617766e+00 + 55 1.9983924189093898e+00 7.8819614132664484e-01 -4.2101163935381242e-02 + 56 2.8802144653776396e+00 7.4103041315031581e-01 -1.5683255933434570e+00 + 57 3.4203841264341177e+00 -2.0479691248624599e-01 -1.0028700929725261e+00 + 58 2.2465524367627090e+00 -1.2664616876138388e+00 1.3993023662311470e+00 + 59 3.3396090986929572e+00 -2.0464312774168345e+00 -1.5444845814983217e+00 + 60 1.9535232536390854e+00 -3.6039172622474824e-01 1.4946661533059336e+00 + 61 2.3337690033785967e+00 -5.7434751785198590e-01 -9.1710674642007883e-01 + 62 1.4093416141692543e+00 5.9512954249468253e-01 1.6321585651967399e+00 + 63 3.0383535177723360e+00 2.3415830424389616e+00 -7.9771737683932664e-01 + 64 3.9545498598029303e+00 -5.5026940885336484e-01 -5.6900736697664145e-01 +... diff --git a/unittest/force-styles/tests/sph-pair-rhosum.yaml b/unittest/force-styles/tests/sph-pair-rhosum.yaml new file mode 100644 index 00000000000..21227cbb08a --- /dev/null +++ b/unittest/force-styles/tests/sph-pair-rhosum.yaml @@ -0,0 +1,159 @@ +--- +lammps_version: 4 Jul 2026 +tags: generated +date_generated: Fri Jul 10 17:05:55 2026 +epsilon: 6e-12 +skip_tests: single +prerequisites: | + atom sph + pair sph/rhosum +pre_commands: | + variable units index lj +post_commands: "" +input_file: in.sph +pair_style: sph/rhosum 1 +pair_coeff: | + 1 1 2.0 + 1 2 2.0 + 2 2 2.0 +extract: "" +natoms: 64 +init_vdwl: 0 +init_coul: 0 +init_stress: |2- + 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +init_forces: |2 + 1 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 2 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 3 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 4 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 5 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 6 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 7 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 8 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 9 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 10 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 11 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 12 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 13 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 14 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 15 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 16 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 17 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 18 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 19 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 20 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 21 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 22 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 23 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 24 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 25 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 26 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 27 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 28 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 29 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 30 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 31 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 32 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 33 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 34 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 35 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 36 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 37 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 38 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 39 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 40 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 41 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 42 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 43 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 44 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 45 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 46 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 47 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 48 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 49 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 50 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 51 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 52 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 53 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 54 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 55 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 56 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 57 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 58 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 59 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 60 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 61 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 62 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 63 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 64 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +run_vdwl: 0 +run_coul: 0 +run_stress: |2- + 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +run_forces: |2 + 1 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 2 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 3 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 4 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 5 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 6 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 7 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 8 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 9 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 10 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 11 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 12 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 13 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 14 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 15 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 16 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 17 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 18 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 19 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 20 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 21 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 22 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 23 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 24 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 25 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 26 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 27 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 28 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 29 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 30 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 31 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 32 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 33 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 34 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 35 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 36 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 37 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 38 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 39 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 40 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 41 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 42 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 43 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 44 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 45 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 46 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 47 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 48 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 49 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 50 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 51 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 52 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 53 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 54 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 55 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 56 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 57 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 58 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 59 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 60 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 61 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 62 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 63 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 64 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +... diff --git a/unittest/force-styles/tests/sph-pair-sdpd_taitwater_isothermal.yaml b/unittest/force-styles/tests/sph-pair-sdpd_taitwater_isothermal.yaml new file mode 100644 index 00000000000..aa28b50acbf --- /dev/null +++ b/unittest/force-styles/tests/sph-pair-sdpd_taitwater_isothermal.yaml @@ -0,0 +1,161 @@ +--- +lammps_version: 4 Jul 2026 +tags: single_thread +date_generated: Fri Jul 10 17:13:24 2026 +epsilon: 6e-12 +skip_tests: nofdotr +prerequisites: | + atom sph + pair sdpd/taitwater/isothermal +pre_commands: | + variable newton_pair delete + variable newton_pair index on + comm_modify vel yes +post_commands: "" +input_file: in.sph +pair_style: sdpd/taitwater/isothermal 1.0 0.2 45217 +pair_coeff: | + 1 1 1.0 10.0 2.0 + 1 2 1.0 10.0 2.0 + 2 2 1.05 12.0 2.0 +extract: "" +natoms: 64 +init_vdwl: 0 +init_coul: 0 +init_stress: |2- + 5.3642189130192560e+02 3.3909238758264797e+02 5.5143847768197622e+02 7.7402335782141975e+01 -1.5593766075950140e+02 1.2400117794701691e+02 +init_forces: |2 + 1 -1.3337962627013974e+02 -2.0156232896108065e+01 1.0228795426711986e+02 + 2 -2.7775103978547207e+01 3.7608177995011438e+01 -1.6432317549608999e+01 + 3 -6.2371946621308219e+01 3.0277712583815806e+01 -2.2371218032843807e+01 + 4 -1.4828423942410481e+01 -8.4074524416065131e+01 -7.0536144210802036e+01 + 5 -8.2959265709456247e+00 5.4901578756747274e+00 -4.0162130886276600e+01 + 6 2.5434432427307101e+01 2.5674446333054469e+01 5.5172541132223877e+01 + 7 6.2100290136095779e+01 4.9824013570161263e+01 2.7822164792062200e+01 + 8 -4.4421542939742189e+01 3.4518486029717224e+01 8.0257583827814258e+01 + 9 -4.3043676427029936e+01 8.1895890742371776e+01 -1.7393206803295190e+01 + 10 1.0150173633949856e+02 -7.2199316724577983e+01 3.7405992735501501e+00 + 11 -6.7644316955600829e+01 -4.9721331396349086e+01 -1.8685000297685420e+01 + 12 -2.5619662628920636e+01 5.6909065230597342e+01 -8.9194005834403427e+01 + 13 1.1478538632725946e+02 -1.2465046043488601e+02 4.2083889031310136e+01 + 14 2.0169458106718423e+01 4.2899132001273060e+01 -5.8717341213086613e+01 + 15 2.1213512852969503e+00 -5.7155402776537493e+01 6.9721241833696823e+01 + 16 3.6940204404307551e+01 2.6107247363734928e+01 6.7475007920415862e+01 + 17 -5.1123678827989110e+01 2.3603757900936884e+01 -1.2179733184866413e+01 + 18 -4.2101538899681216e+01 3.0361669630034960e+01 6.5126597008685252e+01 + 19 -1.2317812832418026e+02 5.3895841459842003e+01 1.3799700992392786e+01 + 20 -5.8411491941162133e+01 -2.5351065856845967e+01 -2.0776109610703852e+01 + 21 2.2221312373785935e+01 -1.0591865579987822e+01 4.2626961729805863e+01 + 22 6.3759287398774944e-01 -3.6042599340831387e+01 4.2762539678502478e+01 + 23 1.5858774152503843e+01 1.1280749542851369e+00 -4.5427659452011582e+01 + 24 -9.1902099959018528e+01 -7.5589887753530178e+01 2.1759912661493175e+01 + 25 6.2749921921905610e+01 -4.6191530299916607e+01 -1.6189657870742860e+00 + 26 -3.0435184817963377e+00 3.6749693821240648e+01 2.4715229908934425e+01 + 27 3.6723669746795238e+01 -5.5499396902507527e+01 -6.2750823554662993e-01 + 28 -3.5907742418369708e+01 2.0936958030665327e+00 -4.8016365957189869e+01 + 29 -1.0367582179218940e+02 -1.0124687440671390e+02 -6.8011547728866319e+01 + 30 3.2188462091700032e+00 2.9527096331494558e+01 -9.9360535104419689e+00 + 31 -2.4737497147760394e+01 -7.1797980789924523e+01 -3.8327154223934187e+01 + 32 5.7464518661128547e+00 9.1662798218391956e+01 4.6905137580882368e+01 + 33 7.2311921630922001e+01 7.1706196481080951e+01 2.6475690516831584e+01 + 34 8.5290222884171811e+01 -8.9151359699616783e-01 -7.9674001755889094e+01 + 35 6.4382755684467455e+01 8.6063648069660161e+01 1.0508098914936585e+02 + 36 2.5455615336916047e+01 -3.1802494811394268e+00 -9.0188775890950794e+01 + 37 4.4249327596735100e+01 3.6957848373221587e+01 -6.5349960404556967e+01 + 38 3.7960924594125458e+01 -4.1961225370924282e+00 2.9517830783339040e+01 + 39 -2.4227914089659691e+01 6.3033136335332358e+01 1.2064202293686770e+02 + 40 9.2825468416943266e+01 -1.0840972080894795e+02 -7.9374153462309422e+00 + 41 -7.6007274040889271e+01 1.1399458967547579e+01 -5.7333965533300130e+01 + 42 -2.7648966914608838e+01 5.8353504516479120e+01 -6.9495557241172863e+00 + 43 -8.0747924487291598e+01 2.2352654305599280e+01 -9.0515874526722328e+01 + 44 6.7878513294049867e+01 -5.1596950878015704e+01 -6.0245726488253544e+00 + 45 8.7224380973801203e+01 -2.5136240776683632e+01 -2.1135608144484683e+00 + 46 -1.8335254553274414e+01 -4.9444107207636250e+01 -2.4662149220239378e+01 + 47 2.3992595765907666e+01 8.5110979262199194e+01 -7.4369125293849758e-02 + 48 -5.0744226348144764e+01 7.3553189046721013e-01 4.6245813141082856e+01 + 49 5.8909377406606879e+01 8.1195954490224409e+01 1.7030164351337831e+00 + 50 1.2827301320345388e+00 -3.8441889223448840e+01 -5.4929793850815642e+01 + 51 3.8167819530410895e+01 1.0065873404263371e+01 9.0312110031423813e+00 + 52 -2.0972964707376647e+01 -7.6890312193381618e+01 -4.0207393792845991e+00 + 53 3.3067589597702778e+01 6.5743128878221569e+01 2.2106827689149100e+01 + 54 -1.1575908702180186e+01 -1.8012874364111063e+01 -6.9129705058893791e+01 + 55 -5.2054046896095961e+01 1.3175718169086078e+01 -2.9551921359108277e+01 + 56 7.7140979155496098e+01 7.3279897839220496e+00 -9.1937068550718415e-01 + 57 8.6407416465495530e+01 -2.5022809858419723e+00 5.7627778190091426e+01 + 58 2.8651020477235452e+01 -9.5391273529321268e+00 1.0331537341967984e+01 + 59 3.8187721699099527e+01 -5.5038727011592854e+01 -1.2677066112671734e+02 + 60 5.4744839958877350e+01 1.1061999292705958e+02 -8.7379639122912121e+00 + 61 -5.4256733581822765e+01 -9.3689392567970231e+01 -2.0902213906679226e+01 + 62 -1.3497825213046332e+02 3.2245927881627800e+01 8.5093345471621774e+01 + 63 -3.4527315899221790e+01 -3.2888689148434757e+01 -1.7137378116060166e+01 + 64 1.9197877706077236e+01 -1.6187833871690231e+01 1.2122328660708624e+02 +run_vdwl: 0 +run_coul: 0 +run_stress: |2- + 4.4698539658755180e+01 5.6865577263235377e+02 1.6271978097769127e+02 -1.0149656213009560e+02 1.2842768767893847e+02 -1.8938199600759546e+02 +run_forces: |2 + 1 -6.7403554549827732e+01 -9.6206300508122382e+01 -3.3885045025460379e+01 + 2 6.4055137215012659e+00 -1.7126119197253953e+01 9.2873381486807148e+01 + 3 2.5048933821573470e+01 -9.4631866185052687e+00 3.2544783814262161e+01 + 4 -8.2953042387147576e+01 6.8060565398005650e+01 -4.7176914385575138e+01 + 5 3.3770132775537576e+01 -4.3754308789444686e+01 4.0855324597654885e+01 + 6 -6.8294430683492521e+01 1.8782265728290128e+01 3.8152582792768847e+01 + 7 2.1415976699945048e+01 -1.9022876592027362e+00 7.1003783054680127e+00 + 8 4.1772923134209691e+01 -7.1215399943158610e+00 -6.7380639903984871e+01 + 9 2.7996588236112103e+01 5.5397808077487966e+01 -3.9206127008624563e+00 + 10 4.3361485102966242e+00 -4.3809659966835341e+01 3.7197262040334884e+01 + 11 -1.0757591890419562e+02 8.3406855035134100e+01 -7.2975513946951942e+00 + 12 9.8898233856478566e+00 -3.3441784287651721e+00 5.4706507230455074e+01 + 13 2.9226597542809195e+01 1.2794166516573853e+01 -7.7680515315692986e+00 + 14 6.6140834288070167e+01 -3.7996957417948494e+01 3.7269480480496444e+00 + 15 -1.7745390449993529e+01 -4.8379249548301274e+01 6.7006089195340493e+01 + 16 -5.0955516587471834e+00 -1.9135562236516868e+01 -7.3907144307655969e+01 + 17 2.5988813414073135e+01 8.8023700560616504e+01 8.7754963150752786e+01 + 18 1.1325769961871748e+02 3.3557193793143174e+00 4.4191262668260840e+01 + 19 6.2127497865071398e+01 -7.8372811712015789e+01 4.7177768128441571e+00 + 20 -1.9871179776365810e+01 6.7894547391790667e+01 -6.6142697891996946e+01 + 21 -3.8021095989150837e+01 3.8962882391914917e+01 -6.5865520718250181e+01 + 22 1.8136509338851049e+01 -4.0236629668850554e+01 -1.1375950641519481e+02 + 23 -6.7781157497848255e+01 3.8895158990970259e+01 5.9879753095486414e+01 + 24 -3.0900537189732901e+01 4.3029355558125815e-02 -1.8308462741060733e+01 + 25 7.7380647357835130e+01 -3.9465605751178181e+01 3.6015899815321056e+01 + 26 -1.4596652309951658e+01 3.4986409005361821e+01 -8.7875115815475624e+01 + 27 3.3657199915262133e+01 -1.0391065927267704e+02 -1.2044973737168789e+01 + 28 2.4008640008049237e+01 -2.4176973405447937e+00 -7.1219473049335647e+01 + 29 3.6078439833987659e+01 4.8793835977637642e+01 -1.4132110175762332e+01 + 30 -5.2441052605028304e+01 -2.4423425331902440e+01 -5.1845946126199010e+01 + 31 -4.7583857454062674e+01 4.5652090655136426e+01 -6.2395130228039548e+00 + 32 -1.1225831872048373e+02 2.5718516139538156e+01 1.5069838675037147e+01 + 33 -2.0807137440031404e+01 -7.0575288935533891e+01 4.1406219885184427e+01 + 34 3.2784908964579792e+01 5.4990032627030132e+01 2.2743253281375075e+00 + 35 1.0534230630396024e+00 -5.2432128008652086e+01 -3.5617106025581847e+01 + 36 -1.0021804003507830e+01 6.1414600715586232e+01 8.3116436153555426e+00 + 37 3.5937627055345047e+01 -5.5116719075945880e+01 -9.5900139210772242e+00 + 38 -2.9284999803174784e+01 5.2744288817830423e+01 3.6338919796047961e+01 + 39 8.1044456994986476e+01 1.4424626846631481e+01 1.1867896021643847e+00 + 40 -4.6752634146238323e+00 -1.0439164676164200e+01 4.9795803102187897e+01 + 41 -8.2528339722962329e+01 6.9259654393002961e+01 5.8975042674471553e+01 + 42 3.2275824974614054e+01 5.2086895020258510e+01 5.0766822585308930e+01 + 43 3.3819343384841583e+00 -6.8840228686682750e+01 2.5476707390238960e+01 + 44 -1.4962846838392618e+01 -7.8006270198595175e+01 6.5164636705683193e+01 + 45 -5.4736389993932200e+01 -1.6859601777553326e+01 1.0381639924919946e+02 + 46 -3.5359734238268103e+00 2.7833321297899396e+01 -5.6462023875814449e-01 + 47 -8.1863794118669006e+01 -2.0028300233307386e+00 -1.1008046566873664e+00 + 48 2.6118935195772242e+01 2.6356783039983522e+01 -4.7980323452309989e+01 + 49 3.9416545892112495e+01 5.5283950668120404e+01 -2.4605011179837053e+00 + 50 5.2350197466159116e+00 -4.5828741383757851e+01 2.7756726015535136e+01 + 51 -6.3303973056605315e+01 -3.0004322534407905e+01 -4.8684744960659216e+01 + 52 5.9196320547547927e+01 -1.8865026075627579e+01 -5.1008518046847932e+01 + 53 -5.1598338396753078e+01 2.7944737470613976e+00 -6.0760100385833319e+01 + 54 3.8843425333288998e+01 -1.0837963964320622e+01 -7.1701385300674971e+01 + 55 9.5626697332514397e+01 -8.6196522212318641e+01 -2.6279647050115997e+00 + 56 5.0599024902034406e+00 -8.4290565219287172e-01 1.4465057416676721e+01 + 57 -5.4406514017118241e+01 5.1726133452398138e+00 6.3804869499575517e+01 + 58 1.1754208497093719e+01 2.5041273354296560e+01 2.6554379839114951e+01 + 59 5.0367816204986340e+01 -2.8218462506578081e+01 -5.9596733483353063e+01 + 60 2.2519600291662258e+01 6.0630108219842214e+01 -1.0071185228006604e+02 + 61 4.8613775264054389e+01 -3.2582966456122207e+01 -1.4638630576021683e-01 + 62 -3.5203319180063737e+01 1.0590715787204317e+02 -4.3300521266738301e+01 + 63 1.7731637254671845e+01 2.7732214481106368e+01 9.0766919559808315e+01 + 64 -2.4150545323433825e+01 -4.7724223439098459e+01 -4.0331589031396682e+00 +... diff --git a/unittest/force-styles/tests/sph-pair-taitwater.yaml b/unittest/force-styles/tests/sph-pair-taitwater.yaml new file mode 100644 index 00000000000..9f0e7d3f682 --- /dev/null +++ b/unittest/force-styles/tests/sph-pair-taitwater.yaml @@ -0,0 +1,159 @@ +--- +lammps_version: 4 Jul 2026 +tags: generated +date_generated: Fri Jul 10 17:05:38 2026 +epsilon: 5e-09 +skip_tests: single +prerequisites: | + atom sph + pair sph/taitwater +pre_commands: | + variable units index lj +post_commands: "" +input_file: in.sph +pair_style: sph/taitwater +pair_coeff: | + 1 1 1.0 10.0 0.2 2.0 + 1 2 1.0 10.0 0.25 2.0 + 2 2 1.05 12.0 0.3 2.0 +extract: "" +natoms: 64 +init_vdwl: 0 +init_coul: 0 +init_stress: |2- + 2.0978358657914703e+02 2.1020653561899681e+02 2.0927921991036948e+02 -3.8750788102874056e-01 -4.6516091467860107e-02 7.1163133609940758e-03 +init_forces: |2 + 1 -4.3705952236168439e+00 7.2711898967090693e-01 -1.0819475161432852e+00 + 2 -4.8183472768084945e+00 1.3116729535048000e+00 1.0211731686387122e+00 + 3 -4.4042813727619743e+00 1.4389341152354242e+00 1.5665329676237374e+00 + 4 -4.4432305597315693e+00 2.0186367607916473e+00 -1.0857774334667978e+00 + 5 -5.3438138085105651e+00 -1.9498404786321994e+00 -1.5702649037790672e+00 + 6 -4.0213826194213684e+00 -1.3204897103732312e+00 1.2380384041075945e+00 + 7 -4.8831154046827088e+00 -1.1670709184484278e+00 1.9833872761566560e+00 + 8 -3.7589655465585050e+00 -1.1755845753662075e+00 -1.8220707985205411e+00 + 9 -4.2944936771136275e+00 -3.0201640149016684e-01 -1.2328904356140344e+00 + 10 -5.1825234195399830e+00 -1.5340299649270190e+00 1.4801494592633759e+00 + 11 -3.0322706906664392e+00 -1.3315520790730084e+00 1.5015271203026817e+00 + 12 -4.9766428681430996e+00 -1.7682000170819436e+00 -1.9025632797996885e+00 + 13 -4.8374139825041134e+00 1.2967601604744448e+00 -1.7346927464330264e+00 + 14 -3.5754945324496732e+00 1.0313726804786842e+00 7.5552973066973173e-01 + 15 -4.7277849385821904e+00 9.2095751752826571e-01 1.8403406975851202e+00 + 16 -3.8980750785389811e+00 1.0466658140686869e+00 -9.5455375849802149e-01 + 17 -3.3488735562268066e+00 2.1016301354802573e+00 -7.2925177035685662e-01 + 18 -3.1738781075318681e+00 1.7488045923827209e+00 -2.8197625048690511e-01 + 19 -3.3627712542597012e+00 1.6918785311886353e+00 2.6002453332532833e+00 + 20 -2.7152830073712413e+00 7.3189613954679977e-01 -1.8503208676532539e+00 + 21 -1.3706391378186336e+00 -1.3206430901180910e+00 2.2441176060003154e-01 + 22 -3.1399261952312618e+00 -1.5035610064914946e+00 -8.5093883398632192e-02 + 23 -3.7788236202841934e+00 -6.7098959771120104e-01 2.4338358234951603e+00 + 24 -3.6600683374758214e+00 -1.6633075914773998e+00 -2.7729311906081069e+00 + 25 -2.5728504484579773e+00 -1.4182608515049877e-01 -1.3431580195651716e+00 + 26 -2.2305978432595603e+00 -1.0624024242607466e-01 7.8850577424185808e-01 + 27 -4.0697890673280721e+00 -7.7050288752764740e-01 1.9523639814560532e+00 + 28 -2.9852207405844084e+00 -3.7077425388208068e-01 -1.7760691267482038e+00 + 29 -3.8329711239450206e+00 -1.2931076094465271e-01 -5.7867026316733572e-01 + 30 -3.2266119637774642e+00 4.6039583727281508e-02 4.4269575856115040e-01 + 31 -2.7554625532028609e+00 2.7188484569660498e-02 2.5035286341980054e+00 + 32 -3.7540855175219154e+00 9.7684392112562213e-01 -2.0942825342553313e+00 + 33 3.6844794681048678e+00 2.1031104363156055e+00 1.6704642168521924e-02 + 34 4.9520816688920695e+00 1.5920508020217401e+00 5.6618199011377812e-01 + 35 4.1516678317021007e+00 4.7346717762462731e-01 1.5655876111109857e+00 + 36 5.7502440938934845e+00 1.3492144697851833e+00 -1.6500950324111925e+00 + 37 4.6589037846173955e+00 -1.0642504008551041e+00 -5.0369693498217971e-01 + 38 4.3781501963160254e+00 -1.1584971522135854e+00 -4.2900236506738898e-01 + 39 5.7277621303460187e+00 -1.1793837816992241e+00 1.7890135358388879e+00 + 40 3.4798126057652610e+00 -7.6897896399438814e-01 -8.4255120706166453e-01 + 41 2.7925903041500479e+00 -2.4400814386979572e+00 -1.7685234619756116e+00 + 42 4.3015751091353494e+00 -2.2842582423211768e+00 1.9161275940085991e+00 + 43 3.1767521242921974e+00 -2.0542260724512875e+00 2.7967942323857192e-01 + 44 4.7980365678097447e+00 -1.9414504758589179e+00 -5.8868318542441733e-01 + 45 4.4644814765664371e+00 1.1026385237262444e+00 -1.6821684868415470e+00 + 46 3.4459819510104608e+00 1.7861528893215626e+00 1.5460695983156851e+00 + 47 4.6704852121606413e+00 2.0655925174112246e+00 1.0719540304208905e+00 + 48 3.2363869831540830e+00 1.3075006243865794e+00 -9.3239869148684007e-01 + 49 3.8773457140377570e+00 1.2534035751621895e+00 -2.5810811668002831e+00 + 50 2.8761785550790844e+00 1.1835352389470761e+00 1.0989765028570211e+00 + 51 2.5514790896153148e+00 2.0690705528789786e+00 2.1698938382053350e+00 + 52 2.7737152969899412e+00 1.4182703322767776e+00 -1.0021589027181657e+00 + 53 3.2757779516367984e+00 -1.1008539976524876e+00 -1.2200553561570728e+00 + 54 3.4619859991563753e+00 -1.4883353448763468e+00 1.9642652174258139e+00 + 55 2.7277648419678835e+00 -1.1940865247177070e+00 1.0905902577054458e+00 + 56 3.2783085614551046e+00 -1.8854715163351601e+00 -1.3921556475459476e+00 + 57 4.1785466493348586e+00 -1.6914360867158007e+00 -2.1204846652796721e+00 + 58 3.0669570956138199e+00 -1.6958325484891195e+00 1.4579435832247909e+00 + 59 4.2565686650150010e+00 -1.4462696579905576e+00 1.9153869439651665e+00 + 60 2.8188006364817229e+00 -1.3368674273718806e+00 -6.4401300106602810e-01 + 61 2.7695948473330616e+00 1.4383947878900516e+00 -1.3954472727876683e+00 + 62 3.7690018330288280e+00 2.0786154242380586e+00 1.2067014556867035e+00 + 63 3.8773938530220664e+00 1.3416638812695352e+00 1.0352456935163146e+00 + 64 3.3174723762231397e+00 2.2771376803327690e+00 -1.3735576518557195e+00 +run_vdwl: 0 +run_coul: 0 +run_stress: |2- + 2.0978118245571849e+02 2.1020485491653724e+02 2.0927781749926567e+02 -3.8737650786043171e-01 -4.7221210058527363e-02 6.7550204334230488e-03 +run_forces: |2 + 1 -4.3718003823337002e+00 7.2805014626751041e-01 -1.0820273068722353e+00 + 2 -4.8186534584836895e+00 1.3115317468276868e+00 1.0217826732132247e+00 + 3 -4.4040654597401261e+00 1.4386188211929556e+00 1.5664004892333077e+00 + 4 -4.4431708657585922e+00 2.0188140498597598e+00 -1.0866710031611793e+00 + 5 -5.3444813541930190e+00 -1.9498155975335099e+00 -1.5699243897145843e+00 + 6 -4.0220632414748456e+00 -1.3200868917494368e+00 1.2379999958666406e+00 + 7 -4.8832089127116607e+00 -1.1677476017943014e+00 1.9839188027124066e+00 + 8 -3.7591837455203847e+00 -1.1758599324780592e+00 -1.8219181250474703e+00 + 9 -4.2948134869263646e+00 -3.0148376132548704e-01 -1.2327129937596952e+00 + 10 -5.1819469621219989e+00 -1.5339497534274460e+00 1.4798611830385839e+00 + 11 -3.0321691207583523e+00 -1.3315781698456064e+00 1.5013201595233341e+00 + 12 -4.9771575492251374e+00 -1.7679246637120856e+00 -1.9028461975890607e+00 + 13 -4.8382720435345199e+00 1.2961289099897251e+00 -1.7340631663250781e+00 + 14 -3.5748433604218328e+00 1.0311159332116790e+00 7.5512272066170372e-01 + 15 -4.7284051404812395e+00 9.2067101463802570e-01 1.8406070649924884e+00 + 16 -3.8993136492681573e+00 1.0465295324465351e+00 -9.5473431593454472e-01 + 17 -3.3482544496327620e+00 2.1034004538980238e+00 -7.2923301235593885e-01 + 18 -3.1736132341688030e+00 1.7479385081847805e+00 -2.8179731692039300e-01 + 19 -3.3624637214334196e+00 1.6924608655548403e+00 2.5997625287840496e+00 + 20 -2.7153987582894263e+00 7.3346748157654429e-01 -1.8496510175196321e+00 + 21 -1.3701087071876770e+00 -1.3212367855124965e+00 2.2319246525907499e-01 + 22 -3.1393728908622203e+00 -1.5028297770708865e+00 -8.4534561868706976e-02 + 23 -3.7785847830363317e+00 -6.7019175581576840e-01 2.4329367201735987e+00 + 24 -3.6593628869175765e+00 -1.6637173150620677e+00 -2.7718738932133768e+00 + 25 -2.5722547112692924e+00 -1.4085899175824826e-01 -1.3425331668629608e+00 + 26 -2.2313523757461140e+00 -1.0565970011730552e-01 7.8875338815911356e-01 + 27 -4.0697893298629424e+00 -7.7104697439519698e-01 1.9509778784526781e+00 + 28 -2.9846015193009245e+00 -3.7103630025900147e-01 -1.7751166640892266e+00 + 29 -3.8317497823475826e+00 -1.3169975420367330e-01 -5.7694793638869690e-01 + 30 -3.2268859755518631e+00 4.5054546687957608e-02 4.4185943712294751e-01 + 31 -2.7553870802736919e+00 2.6955905429078775e-02 2.5025473844753834e+00 + 32 -3.7534997619605797e+00 9.7611391963947192e-01 -2.0942085358952034e+00 + 33 3.6839908313895116e+00 2.1032789793898212e+00 1.7224193626054863e-02 + 34 4.9521065685964363e+00 1.5922402053541189e+00 5.6621602950331062e-01 + 35 4.1520699723525878e+00 4.7488667744020052e-01 1.5644781324534178e+00 + 36 5.7501115265475899e+00 1.3495754431352371e+00 -1.6501488710784189e+00 + 37 4.6577030269813831e+00 -1.0650378465755459e+00 -5.0485623513855571e-01 + 38 4.3778844714072971e+00 -1.1597823274078629e+00 -4.2687129716078420e-01 + 39 5.7271378188746285e+00 -1.1794660599792492e+00 1.7886321802767187e+00 + 40 3.4794819555248848e+00 -7.6831552798647385e-01 -8.4204508925664046e-01 + 41 2.7912406557059524e+00 -2.4382296980927669e+00 -1.7689060959266056e+00 + 42 4.3009960910714780e+00 -2.2818150767411622e+00 1.9164597556171861e+00 + 43 3.1769207669515933e+00 -2.0547332172563375e+00 2.7883451562589517e-01 + 44 4.7976429173894575e+00 -1.9422100197708609e+00 -5.8864347481769330e-01 + 45 4.4639411709257271e+00 1.1017413979387056e+00 -1.6806667837838050e+00 + 46 3.4463494623206414e+00 1.7849001115054133e+00 1.5454339478198387e+00 + 47 4.6704258114853632e+00 2.0642679287379484e+00 1.0707387548337988e+00 + 48 3.2365042361994436e+00 1.3071740304742279e+00 -9.3178663392397143e-01 + 49 3.8774820278668325e+00 1.2533576026139581e+00 -2.5805573171553005e+00 + 50 2.8765776743553393e+00 1.1838354616065578e+00 1.0990190814870195e+00 + 51 2.5524748606842795e+00 2.0682005027920773e+00 2.1688640930566625e+00 + 52 2.7740755933898882e+00 1.4181307046374703e+00 -1.0019725943082998e+00 + 53 3.2770303367417237e+00 -1.1011362378040752e+00 -1.2204418751582948e+00 + 54 3.4621421385772231e+00 -1.4883583947074184e+00 1.9635394569055931e+00 + 55 2.7272553710361702e+00 -1.1942266495019342e+00 1.0904953777855595e+00 + 56 3.2784182790574290e+00 -1.8844263300269828e+00 -1.3919453283924430e+00 + 57 4.1789838157033090e+00 -1.6917645500503578e+00 -2.1198362885322073e+00 + 58 3.0670423731495404e+00 -1.6950262434256007e+00 1.4582583052524525e+00 + 59 4.2566301245515881e+00 -1.4455584797488898e+00 1.9159446622753464e+00 + 60 2.8196376763065736e+00 -1.3370533243006746e+00 -6.4439416322919207e-01 + 61 2.7698427900210003e+00 1.4380604527035081e+00 -1.3951268379137827e+00 + 62 3.7685789792054352e+00 2.0791891109584943e+00 1.2066889997658583e+00 + 63 3.8782534953927716e+00 1.3415971369418920e+00 1.0348580834874355e+00 + 64 3.3172958810317481e+00 2.2765761278025658e+00 -1.3737359721467113e+00 +... diff --git a/unittest/force-styles/tests/sph-pair-taitwater_morris.yaml b/unittest/force-styles/tests/sph-pair-taitwater_morris.yaml new file mode 100644 index 00000000000..b5d8930d176 --- /dev/null +++ b/unittest/force-styles/tests/sph-pair-taitwater_morris.yaml @@ -0,0 +1,159 @@ +--- +lammps_version: 4 Jul 2026 +tags: generated +date_generated: Fri Jul 10 17:05:39 2026 +epsilon: 5e-09 +skip_tests: single +prerequisites: | + atom sph + pair sph/taitwater/morris +pre_commands: | + variable units index lj +post_commands: "" +input_file: in.sph +pair_style: sph/taitwater/morris +pair_coeff: | + 1 1 1.0 10.0 0.2 2.0 + 1 2 1.0 10.0 0.25 2.0 + 2 2 1.05 12.0 0.3 2.0 +extract: "" +natoms: 64 +init_vdwl: 0 +init_coul: 0 +init_stress: |2- + 2.0978358657914703e+02 2.1020653561899681e+02 2.0927921991036948e+02 -3.8750788102874056e-01 -4.6516091467860107e-02 7.1163133609940758e-03 +init_forces: |2 + 1 -4.3705952236168439e+00 7.2711898967090693e-01 -1.0819475161432852e+00 + 2 -4.8183472768084945e+00 1.3116729535048000e+00 1.0211731686387122e+00 + 3 -4.4042813727619743e+00 1.4389341152354242e+00 1.5665329676237374e+00 + 4 -4.4432305597315693e+00 2.0186367607916473e+00 -1.0857774334667978e+00 + 5 -5.3438138085105651e+00 -1.9498404786321994e+00 -1.5702649037790672e+00 + 6 -4.0213826194213684e+00 -1.3204897103732312e+00 1.2380384041075945e+00 + 7 -4.8831154046827088e+00 -1.1670709184484278e+00 1.9833872761566560e+00 + 8 -3.7589655465585050e+00 -1.1755845753662075e+00 -1.8220707985205411e+00 + 9 -4.2944936771136275e+00 -3.0201640149016684e-01 -1.2328904356140344e+00 + 10 -5.1825234195399830e+00 -1.5340299649270190e+00 1.4801494592633759e+00 + 11 -3.0322706906664392e+00 -1.3315520790730084e+00 1.5015271203026817e+00 + 12 -4.9766428681430996e+00 -1.7682000170819436e+00 -1.9025632797996885e+00 + 13 -4.8374139825041134e+00 1.2967601604744448e+00 -1.7346927464330264e+00 + 14 -3.5754945324496732e+00 1.0313726804786842e+00 7.5552973066973173e-01 + 15 -4.7277849385821904e+00 9.2095751752826571e-01 1.8403406975851202e+00 + 16 -3.8980750785389811e+00 1.0466658140686869e+00 -9.5455375849802149e-01 + 17 -3.3488735562268066e+00 2.1016301354802573e+00 -7.2925177035685662e-01 + 18 -3.1738781075318681e+00 1.7488045923827209e+00 -2.8197625048690511e-01 + 19 -3.3627712542597012e+00 1.6918785311886353e+00 2.6002453332532833e+00 + 20 -2.7152830073712413e+00 7.3189613954679977e-01 -1.8503208676532539e+00 + 21 -1.3706391378186336e+00 -1.3206430901180910e+00 2.2441176060003154e-01 + 22 -3.1399261952312618e+00 -1.5035610064914946e+00 -8.5093883398632192e-02 + 23 -3.7788236202841934e+00 -6.7098959771120104e-01 2.4338358234951603e+00 + 24 -3.6600683374758214e+00 -1.6633075914773998e+00 -2.7729311906081069e+00 + 25 -2.5728504484579773e+00 -1.4182608515049877e-01 -1.3431580195651716e+00 + 26 -2.2305978432595603e+00 -1.0624024242607466e-01 7.8850577424185808e-01 + 27 -4.0697890673280721e+00 -7.7050288752764740e-01 1.9523639814560532e+00 + 28 -2.9852207405844084e+00 -3.7077425388208068e-01 -1.7760691267482038e+00 + 29 -3.8329711239450206e+00 -1.2931076094465271e-01 -5.7867026316733572e-01 + 30 -3.2266119637774642e+00 4.6039583727281508e-02 4.4269575856115040e-01 + 31 -2.7554625532028609e+00 2.7188484569660498e-02 2.5035286341980054e+00 + 32 -3.7540855175219154e+00 9.7684392112562213e-01 -2.0942825342553313e+00 + 33 3.6844794681048678e+00 2.1031104363156055e+00 1.6704642168521924e-02 + 34 4.9520816688920695e+00 1.5920508020217401e+00 5.6618199011377812e-01 + 35 4.1516678317021007e+00 4.7346717762462731e-01 1.5655876111109857e+00 + 36 5.7502440938934845e+00 1.3492144697851833e+00 -1.6500950324111925e+00 + 37 4.6589037846173955e+00 -1.0642504008551041e+00 -5.0369693498217971e-01 + 38 4.3781501963160254e+00 -1.1584971522135854e+00 -4.2900236506738898e-01 + 39 5.7277621303460187e+00 -1.1793837816992241e+00 1.7890135358388879e+00 + 40 3.4798126057652610e+00 -7.6897896399438814e-01 -8.4255120706166453e-01 + 41 2.7925903041500479e+00 -2.4400814386979572e+00 -1.7685234619756116e+00 + 42 4.3015751091353494e+00 -2.2842582423211768e+00 1.9161275940085991e+00 + 43 3.1767521242921974e+00 -2.0542260724512875e+00 2.7967942323857192e-01 + 44 4.7980365678097447e+00 -1.9414504758589179e+00 -5.8868318542441733e-01 + 45 4.4644814765664371e+00 1.1026385237262444e+00 -1.6821684868415470e+00 + 46 3.4459819510104608e+00 1.7861528893215626e+00 1.5460695983156851e+00 + 47 4.6704852121606413e+00 2.0655925174112246e+00 1.0719540304208905e+00 + 48 3.2363869831540830e+00 1.3075006243865794e+00 -9.3239869148684007e-01 + 49 3.8773457140377570e+00 1.2534035751621895e+00 -2.5810811668002831e+00 + 50 2.8761785550790844e+00 1.1835352389470761e+00 1.0989765028570211e+00 + 51 2.5514790896153148e+00 2.0690705528789786e+00 2.1698938382053350e+00 + 52 2.7737152969899412e+00 1.4182703322767776e+00 -1.0021589027181657e+00 + 53 3.2757779516367984e+00 -1.1008539976524876e+00 -1.2200553561570728e+00 + 54 3.4619859991563753e+00 -1.4883353448763468e+00 1.9642652174258139e+00 + 55 2.7277648419678835e+00 -1.1940865247177070e+00 1.0905902577054458e+00 + 56 3.2783085614551046e+00 -1.8854715163351601e+00 -1.3921556475459476e+00 + 57 4.1785466493348586e+00 -1.6914360867158007e+00 -2.1204846652796721e+00 + 58 3.0669570956138199e+00 -1.6958325484891195e+00 1.4579435832247909e+00 + 59 4.2565686650150010e+00 -1.4462696579905576e+00 1.9153869439651665e+00 + 60 2.8188006364817229e+00 -1.3368674273718806e+00 -6.4401300106602810e-01 + 61 2.7695948473330616e+00 1.4383947878900516e+00 -1.3954472727876683e+00 + 62 3.7690018330288280e+00 2.0786154242380586e+00 1.2067014556867035e+00 + 63 3.8773938530220664e+00 1.3416638812695352e+00 1.0352456935163146e+00 + 64 3.3174723762231397e+00 2.2771376803327690e+00 -1.3735576518557195e+00 +run_vdwl: 0 +run_coul: 0 +run_stress: |2- + 2.0978118245571849e+02 2.1020485491653724e+02 2.0927781749926567e+02 -3.8737650786043171e-01 -4.7221210058527363e-02 6.7550204334230488e-03 +run_forces: |2 + 1 -4.3718003823337002e+00 7.2805014626751041e-01 -1.0820273068722353e+00 + 2 -4.8186534584836895e+00 1.3115317468276868e+00 1.0217826732132247e+00 + 3 -4.4040654597401261e+00 1.4386188211929556e+00 1.5664004892333077e+00 + 4 -4.4431708657585922e+00 2.0188140498597598e+00 -1.0866710031611793e+00 + 5 -5.3444813541930190e+00 -1.9498155975335099e+00 -1.5699243897145843e+00 + 6 -4.0220632414748456e+00 -1.3200868917494368e+00 1.2379999958666406e+00 + 7 -4.8832089127116607e+00 -1.1677476017943014e+00 1.9839188027124066e+00 + 8 -3.7591837455203847e+00 -1.1758599324780592e+00 -1.8219181250474703e+00 + 9 -4.2948134869263646e+00 -3.0148376132548704e-01 -1.2327129937596952e+00 + 10 -5.1819469621219989e+00 -1.5339497534274460e+00 1.4798611830385839e+00 + 11 -3.0321691207583523e+00 -1.3315781698456064e+00 1.5013201595233341e+00 + 12 -4.9771575492251374e+00 -1.7679246637120856e+00 -1.9028461975890607e+00 + 13 -4.8382720435345199e+00 1.2961289099897251e+00 -1.7340631663250781e+00 + 14 -3.5748433604218328e+00 1.0311159332116790e+00 7.5512272066170372e-01 + 15 -4.7284051404812395e+00 9.2067101463802570e-01 1.8406070649924884e+00 + 16 -3.8993136492681573e+00 1.0465295324465351e+00 -9.5473431593454472e-01 + 17 -3.3482544496327620e+00 2.1034004538980238e+00 -7.2923301235593885e-01 + 18 -3.1736132341688030e+00 1.7479385081847805e+00 -2.8179731692039300e-01 + 19 -3.3624637214334196e+00 1.6924608655548403e+00 2.5997625287840496e+00 + 20 -2.7153987582894263e+00 7.3346748157654429e-01 -1.8496510175196321e+00 + 21 -1.3701087071876770e+00 -1.3212367855124965e+00 2.2319246525907499e-01 + 22 -3.1393728908622203e+00 -1.5028297770708865e+00 -8.4534561868706976e-02 + 23 -3.7785847830363317e+00 -6.7019175581576840e-01 2.4329367201735987e+00 + 24 -3.6593628869175765e+00 -1.6637173150620677e+00 -2.7718738932133768e+00 + 25 -2.5722547112692924e+00 -1.4085899175824826e-01 -1.3425331668629608e+00 + 26 -2.2313523757461140e+00 -1.0565970011730552e-01 7.8875338815911356e-01 + 27 -4.0697893298629424e+00 -7.7104697439519698e-01 1.9509778784526781e+00 + 28 -2.9846015193009245e+00 -3.7103630025900147e-01 -1.7751166640892266e+00 + 29 -3.8317497823475826e+00 -1.3169975420367330e-01 -5.7694793638869690e-01 + 30 -3.2268859755518631e+00 4.5054546687957608e-02 4.4185943712294751e-01 + 31 -2.7553870802736919e+00 2.6955905429078775e-02 2.5025473844753834e+00 + 32 -3.7534997619605797e+00 9.7611391963947192e-01 -2.0942085358952034e+00 + 33 3.6839908313895116e+00 2.1032789793898212e+00 1.7224193626054863e-02 + 34 4.9521065685964363e+00 1.5922402053541189e+00 5.6621602950331062e-01 + 35 4.1520699723525878e+00 4.7488667744020052e-01 1.5644781324534178e+00 + 36 5.7501115265475899e+00 1.3495754431352371e+00 -1.6501488710784189e+00 + 37 4.6577030269813831e+00 -1.0650378465755459e+00 -5.0485623513855571e-01 + 38 4.3778844714072971e+00 -1.1597823274078629e+00 -4.2687129716078420e-01 + 39 5.7271378188746285e+00 -1.1794660599792492e+00 1.7886321802767187e+00 + 40 3.4794819555248848e+00 -7.6831552798647385e-01 -8.4204508925664046e-01 + 41 2.7912406557059524e+00 -2.4382296980927669e+00 -1.7689060959266056e+00 + 42 4.3009960910714780e+00 -2.2818150767411622e+00 1.9164597556171861e+00 + 43 3.1769207669515933e+00 -2.0547332172563375e+00 2.7883451562589517e-01 + 44 4.7976429173894575e+00 -1.9422100197708609e+00 -5.8864347481769330e-01 + 45 4.4639411709257271e+00 1.1017413979387056e+00 -1.6806667837838050e+00 + 46 3.4463494623206414e+00 1.7849001115054133e+00 1.5454339478198387e+00 + 47 4.6704258114853632e+00 2.0642679287379484e+00 1.0707387548337988e+00 + 48 3.2365042361994436e+00 1.3071740304742279e+00 -9.3178663392397143e-01 + 49 3.8774820278668325e+00 1.2533576026139581e+00 -2.5805573171553005e+00 + 50 2.8765776743553393e+00 1.1838354616065578e+00 1.0990190814870195e+00 + 51 2.5524748606842795e+00 2.0682005027920773e+00 2.1688640930566625e+00 + 52 2.7740755933898882e+00 1.4181307046374703e+00 -1.0019725943082998e+00 + 53 3.2770303367417237e+00 -1.1011362378040752e+00 -1.2204418751582948e+00 + 54 3.4621421385772231e+00 -1.4883583947074184e+00 1.9635394569055931e+00 + 55 2.7272553710361702e+00 -1.1942266495019342e+00 1.0904953777855595e+00 + 56 3.2784182790574290e+00 -1.8844263300269828e+00 -1.3919453283924430e+00 + 57 4.1789838157033090e+00 -1.6917645500503578e+00 -2.1198362885322073e+00 + 58 3.0670423731495404e+00 -1.6950262434256007e+00 1.4582583052524525e+00 + 59 4.2566301245515881e+00 -1.4455584797488898e+00 1.9159446622753464e+00 + 60 2.8196376763065736e+00 -1.3370533243006746e+00 -6.4439416322919207e-01 + 61 2.7698427900210003e+00 1.4380604527035081e+00 -1.3951268379137827e+00 + 62 3.7685789792054352e+00 2.0791891109584943e+00 1.2066889997658583e+00 + 63 3.8782534953927716e+00 1.3415971369418920e+00 1.0348580834874355e+00 + 64 3.3172958810317481e+00 2.2765761278025658e+00 -1.3737359721467113e+00 +... From aac847510aac889992cf2a9d078bb0d52588935b Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 10 Jul 2026 17:21:15 -0400 Subject: [PATCH 021/100] complete data file and restart support for DPD-MESO pair styles All three styles set writedata = 1, but edpd and tdpd did not implement write_data()/write_data_all(), so write_data produced an empty Pair Coeffs section that read_data cannot parse. The mdpd per-type variant omitted the mandatory cut and cut_r columns, making its output unreadable as well (its coeff() requires all five parameters). Reading an edpd restart crashed or misbehaved: power_flag and kappa_flag were never initialized in the constructor and not stored in the restart file, so read_restart() consulted garbage values to decide whether the optional sc/kc tables follow in the file, and those tables (only allocated in coeff) were written to without allocation. Store the two flags in the restart settings, initialize them in the constructor, and allocate the tables when needed. Note this changes the on-disk restart format for edpd, which is version-specific anyway. Found by the new meso-pair-{edpd,mdpd,tdpd}.yaml force-style tests. --- src/DPD-MESO/pair_edpd.cpp | 48 ++++++++++++++++++++++++++++++++++++++ src/DPD-MESO/pair_edpd.h | 2 ++ src/DPD-MESO/pair_mdpd.cpp | 2 +- src/DPD-MESO/pair_tdpd.cpp | 30 ++++++++++++++++++++++++ src/DPD-MESO/pair_tdpd.h | 2 ++ 5 files changed, 83 insertions(+), 1 deletion(-) diff --git a/src/DPD-MESO/pair_edpd.cpp b/src/DPD-MESO/pair_edpd.cpp index 2df3bea181f..bd4f7399d13 100644 --- a/src/DPD-MESO/pair_edpd.cpp +++ b/src/DPD-MESO/pair_edpd.cpp @@ -70,6 +70,7 @@ PairEDPD::PairEDPD(LAMMPS *lmp) : writedata = 1; random = nullptr; randomT = nullptr; + power_flag = kappa_flag = 0; } /* ---------------------------------------------------------------------- */ @@ -453,6 +454,11 @@ void PairEDPD::read_restart(FILE *fp) allocate(); + // the optional sc and kc arrays are only created by coeff() + + if (power_flag && !sc) memory->create(sc,atom->ntypes+1,atom->ntypes+1,4,"pair:sc"); + if (kappa_flag && !kc) memory->create(kc,atom->ntypes+1,atom->ntypes+1,4,"pair:kc"); + int me = comm->me; for (int i = 1; i <= atom->ntypes; i++) for (int j = i; j <= atom->ntypes; j++) { @@ -502,6 +508,8 @@ void PairEDPD::write_restart_settings(FILE *fp) fwrite(&cut_global,sizeof(double),1,fp); fwrite(&seed,sizeof(int),1,fp); fwrite(&mix_flag,sizeof(int),1,fp); + fwrite(&power_flag,sizeof(int),1,fp); + fwrite(&kappa_flag,sizeof(int),1,fp); } /* ---------------------------------------------------------------------- @@ -514,10 +522,14 @@ void PairEDPD::read_restart_settings(FILE *fp) utils::sfread(FLERR,&cut_global,sizeof(double),1,fp,nullptr,error); utils::sfread(FLERR,&seed,sizeof(int),1,fp,nullptr,error); utils::sfread(FLERR,&mix_flag,sizeof(int),1,fp,nullptr,error); + utils::sfread(FLERR,&power_flag,sizeof(int),1,fp,nullptr,error); + utils::sfread(FLERR,&kappa_flag,sizeof(int),1,fp,nullptr,error); } MPI_Bcast(&cut_global,1,MPI_DOUBLE,0,world); MPI_Bcast(&seed,1,MPI_INT,0,world); MPI_Bcast(&mix_flag,1,MPI_INT,0,world); + MPI_Bcast(&power_flag,1,MPI_INT,0,world); + MPI_Bcast(&kappa_flag,1,MPI_INT,0,world); // initialize Marsaglia RNG with processor-unique seed // same seed that pair_style command initially specified @@ -528,6 +540,42 @@ void PairEDPD::read_restart_settings(FILE *fp) randomT = new RanMars(lmp,seed + comm->me); } +/* ---------------------------------------------------------------------- + proc 0 writes to data file +------------------------------------------------------------------------- */ + +void PairEDPD::write_data(FILE *fp) +{ + for (int i = 1; i <= atom->ntypes; i++) { + fprintf(fp,"%d %g %g %g %g %g %g %g",i,a0[i][i],gamma[i][i],power[i][i], + cut[i][i],kappa[i][i],powerT[i][i],cutT[i][i]); + if (power_flag) + fprintf(fp," power %g %g %g %g",sc[i][i][0],sc[i][i][1],sc[i][i][2],sc[i][i][3]); + if (kappa_flag) + fprintf(fp," kappa %g %g %g %g",kc[i][i][0],kc[i][i][1],kc[i][i][2],kc[i][i][3]); + fputs("\n",fp); + } +} + +/* ---------------------------------------------------------------------- + proc 0 writes all pairs to data file +------------------------------------------------------------------------- */ + +void PairEDPD::write_data_all(FILE *fp) +{ + for (int i = 1; i <= atom->ntypes; i++) { + for (int j = i; j <= atom->ntypes; j++) { + fprintf(fp,"%d %d %g %g %g %g %g %g %g",i,j,a0[i][j],gamma[i][j],power[i][j], + cut[i][j],kappa[i][j],powerT[i][j],cutT[i][j]); + if (power_flag) + fprintf(fp," power %g %g %g %g",sc[i][j][0],sc[i][j][1],sc[i][j][2],sc[i][j][3]); + if (kappa_flag) + fprintf(fp," kappa %g %g %g %g",kc[i][j][0],kc[i][j][1],kc[i][j][2],kc[i][j][3]); + fputs("\n",fp); + } + } +} + /* ---------------------------------------------------------------------- */ double PairEDPD::single(int i, int j, int itype, int jtype, double rsq, diff --git a/src/DPD-MESO/pair_edpd.h b/src/DPD-MESO/pair_edpd.h index d9cc10c48a6..10122ec8212 100644 --- a/src/DPD-MESO/pair_edpd.h +++ b/src/DPD-MESO/pair_edpd.h @@ -37,6 +37,8 @@ class PairEDPD : public Pair { void read_restart(FILE *) override; void write_restart_settings(FILE *) override; void read_restart_settings(FILE *) override; + void write_data(FILE *) override; + void write_data_all(FILE *) override; double single(int, int, int, int, double, double, double, double &) override; protected: diff --git a/src/DPD-MESO/pair_mdpd.cpp b/src/DPD-MESO/pair_mdpd.cpp index 7cbb1f00a68..95e305c9d2c 100644 --- a/src/DPD-MESO/pair_mdpd.cpp +++ b/src/DPD-MESO/pair_mdpd.cpp @@ -417,7 +417,7 @@ void PairMDPD::read_restart_settings(FILE *fp) void PairMDPD::write_data(FILE *fp) { for (int i = 1; i <= atom->ntypes; i++) - fprintf(fp,"%d %g %g %g\n",i,A_att[i][i],B_rep[i][i],gamma[i][i]); + fprintf(fp,"%d %g %g %g %g %g\n",i,A_att[i][i],B_rep[i][i],gamma[i][i],cut[i][i],cut_r[i][i]); } /* ---------------------------------------------------------------------- diff --git a/src/DPD-MESO/pair_tdpd.cpp b/src/DPD-MESO/pair_tdpd.cpp index 236d0f9fc99..ac8b9903873 100644 --- a/src/DPD-MESO/pair_tdpd.cpp +++ b/src/DPD-MESO/pair_tdpd.cpp @@ -467,6 +467,36 @@ void PairTDPD::read_restart_settings(FILE *fp) random = new RanMars(lmp,seed + comm->me); } +/* ---------------------------------------------------------------------- + proc 0 writes to data file +------------------------------------------------------------------------- */ + +void PairTDPD::write_data(FILE *fp) +{ + for (int i = 1; i <= atom->ntypes; i++) { + fprintf(fp,"%d %g %g %g %g %g",i,a0[i][i],gamma[i][i],power[i][i],cut[i][i],cutcc[i][i]); + for (int k = 0; k < cc_species; k++) + fprintf(fp," %g %g %g",kappa[i][i][k],epsilon[i][i][k],powercc[i][i][k]); + fputs("\n",fp); + } +} + +/* ---------------------------------------------------------------------- + proc 0 writes all pairs to data file +------------------------------------------------------------------------- */ + +void PairTDPD::write_data_all(FILE *fp) +{ + for (int i = 1; i <= atom->ntypes; i++) { + for (int j = i; j <= atom->ntypes; j++) { + fprintf(fp,"%d %d %g %g %g %g %g",i,j,a0[i][j],gamma[i][j],power[i][j],cut[i][j],cutcc[i][j]); + for (int k = 0; k < cc_species; k++) + fprintf(fp," %g %g %g",kappa[i][j][k],epsilon[i][j][k],powercc[i][j][k]); + fputs("\n",fp); + } + } +} + /* ---------------------------------------------------------------------- */ double PairTDPD::single(int /*i*/, int /*j*/, int itype, int jtype, double rsq, diff --git a/src/DPD-MESO/pair_tdpd.h b/src/DPD-MESO/pair_tdpd.h index a1c35c52f57..0194fca3842 100644 --- a/src/DPD-MESO/pair_tdpd.h +++ b/src/DPD-MESO/pair_tdpd.h @@ -37,6 +37,8 @@ class PairTDPD : public Pair { void read_restart(FILE *) override; void write_restart_settings(FILE *) override; void read_restart_settings(FILE *) override; + void write_data(FILE *) override; + void write_data_all(FILE *) override; double single(int, int, int, int, double, double, double, double &) override; protected: From 96ac0597343900697e51a54befaf1467b6172988 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 10 Jul 2026 17:21:15 -0400 Subject: [PATCH 022/100] add force-style tests for the DPD-MESO pair styles New in.edpd/in.mdpd/in.tdpd templates and matching small data files (64 particles, 2 types, perturbed lattice, nonzero velocities and nonuniform per-atom temperature/density/concentration). Covers pair styles edpd, tdpd, and mdpd together with mdpd/rhosum via hybrid/overlay as in its documented usage. All three use fixed RNG seeds and pin newton on, following the existing dpd test conventions. --- unittest/force-styles/tests/data.edpd | 147 ++++++++++++++++ unittest/force-styles/tests/data.mdpd | 147 ++++++++++++++++ unittest/force-styles/tests/data.tdpd | 147 ++++++++++++++++ unittest/force-styles/tests/in.edpd | 17 ++ unittest/force-styles/tests/in.mdpd | 17 ++ unittest/force-styles/tests/in.tdpd | 17 ++ .../force-styles/tests/meso-pair-edpd.yaml | 162 +++++++++++++++++ .../force-styles/tests/meso-pair-mdpd.yaml | 164 ++++++++++++++++++ .../force-styles/tests/meso-pair-tdpd.yaml | 162 +++++++++++++++++ 9 files changed, 980 insertions(+) create mode 100644 unittest/force-styles/tests/data.edpd create mode 100644 unittest/force-styles/tests/data.mdpd create mode 100644 unittest/force-styles/tests/data.tdpd create mode 100644 unittest/force-styles/tests/in.edpd create mode 100644 unittest/force-styles/tests/in.mdpd create mode 100644 unittest/force-styles/tests/in.tdpd create mode 100644 unittest/force-styles/tests/meso-pair-edpd.yaml create mode 100644 unittest/force-styles/tests/meso-pair-mdpd.yaml create mode 100644 unittest/force-styles/tests/meso-pair-tdpd.yaml diff --git a/unittest/force-styles/tests/data.edpd b/unittest/force-styles/tests/data.edpd new file mode 100644 index 00000000000..c69ee376c34 --- /dev/null +++ b/unittest/force-styles/tests/data.edpd @@ -0,0 +1,147 @@ +DPD-MESO fluid block for force-style tests: 2 types, perturbed sc lattice + +64 atoms +2 atom types + +0.0 4.4 xlo xhi +0.0 4.4 ylo yhi +0.0 4.4 zlo zhi + +Masses + +1 1.0 +2 1.3 + +Atoms # edpd + +1 1 0.99641527 100.00000000 0.01298434 -0.04883928 0.07444018 +2 2 1.00625376 120.00000000 0.06783622 -0.00525781 1.12615530 +3 1 0.99099174 100.00000000 -0.04567632 -0.04452860 2.16616359 +4 2 0.99847685 120.00000000 0.03078764 -0.04601972 3.37537695 +5 2 1.08317112 120.00000000 -0.06874312 1.05092586 -0.06578183 +6 1 1.09008941 100.00000000 0.04318271 1.07864240 1.09546916 +7 2 1.08885399 120.00000000 -0.02783548 1.12198831 2.18462309 +8 1 1.08634893 100.00000000 -0.04667717 1.08882465 3.26868637 +9 1 1.08146481 100.00000000 -0.06227214 2.25174264 0.02882352 +10 2 1.07539371 120.00000000 0.02636658 2.26119145 1.08314287 +11 1 1.08267092 100.00000000 -0.01931547 2.18767473 2.18472871 +12 2 1.08379522 120.00000000 0.02702963 2.12104298 3.29425687 +13 2 0.98611471 120.00000000 0.00561337 3.27528227 -0.07650141 +14 1 0.98875845 100.00000000 0.03273527 3.22151102 1.11030567 +15 2 0.99715247 120.00000000 -0.05546133 3.22553317 2.14893471 +16 1 0.99669590 100.00000000 -0.06948175 3.24412140 3.32957883 +17 2 1.08977213 120.00000000 1.13652422 -0.02195450 0.02438219 +18 1 1.08892824 100.00000000 1.09602146 -0.00024773 1.16014414 +19 2 1.09039874 120.00000000 1.06980706 0.05919848 2.23057285 +20 1 1.08675748 100.00000000 1.12935305 -0.07904836 3.23344981 +21 1 1.08629865 100.00000000 1.02511887 1.07532247 0.07137575 +22 2 1.07361115 120.00000000 1.16011313 1.15417210 1.03901953 +23 1 1.07609396 100.00000000 1.13291592 1.14391661 2.24948109 +24 2 1.08148003 120.00000000 1.14675747 1.04245053 3.24861318 +25 2 0.97590626 120.00000000 1.14680962 2.23811466 0.06279191 +26 1 0.97894133 100.00000000 1.09143620 2.26233156 1.04230544 +27 2 0.97111139 120.00000000 1.17313976 2.26151600 2.17400906 +28 1 0.99031703 100.00000000 1.03080843 2.20776589 3.33027288 +29 1 0.90817390 100.00000000 1.07605994 3.22919893 -0.03541272 +30 2 0.90526588 120.00000000 1.15192026 3.23450064 1.16996152 +31 1 0.90788129 100.00000000 1.06000292 3.25271010 2.13795082 +32 2 0.90146285 120.00000000 1.17696502 3.36416806 3.27106483 +33 1 1.08314782 100.00000000 2.13529999 0.02452955 0.06201195 +34 2 1.08405878 120.00000000 2.12193779 0.02128732 1.15707485 +35 1 1.08058334 100.00000000 2.19341117 0.01110001 2.24868298 +36 2 1.08519560 120.00000000 2.15816369 -0.03628058 3.32566530 +37 2 0.98284164 120.00000000 2.20837393 1.10565557 -0.02650322 +38 1 0.98067952 100.00000000 2.26991588 1.06610423 1.12862167 +39 2 0.97958450 120.00000000 2.26306562 1.08412748 2.12869313 +40 1 0.99557367 100.00000000 2.15526370 1.03060670 3.24370018 +41 1 0.90782853 100.00000000 2.13927122 2.17479972 -0.02081067 +42 2 0.90430214 120.00000000 2.19158135 2.22641503 1.12827231 +43 1 0.90458933 100.00000000 2.22995890 2.17829631 2.22605778 +44 2 0.90655257 120.00000000 2.20796888 2.14040342 3.30733467 +45 2 0.92938082 120.00000000 2.17093582 3.32814452 0.03756395 +46 1 0.92586702 100.00000000 2.15851559 3.28962005 1.09278427 +47 2 0.92234312 120.00000000 2.16750299 3.22648094 2.12793827 +48 1 0.93821974 100.00000000 2.27885104 3.33838909 3.29020183 +49 2 0.98524295 120.00000000 3.32666635 -0.03696223 0.03366097 +50 1 0.97291703 100.00000000 3.37213309 0.04371443 1.09442548 +51 2 0.97013168 120.00000000 3.37736971 0.06753549 2.12931935 +52 1 0.98637950 100.00000000 3.28589079 -0.00766840 3.26386142 +53 1 0.90609035 100.00000000 3.31863256 1.04295190 0.03954314 +54 2 0.90524469 120.00000000 3.35723027 1.02985306 1.13073763 +55 1 0.90532178 100.00000000 3.26255667 1.12212315 2.23059313 +56 2 0.90177002 120.00000000 3.37626939 1.14769110 3.27423397 +57 2 0.92806323 120.00000000 3.33680540 2.14348834 0.03418045 +58 1 0.92593663 100.00000000 3.28674359 2.16242875 1.05816137 +59 2 0.92959517 120.00000000 3.25468429 2.24741885 2.13537577 +60 1 0.92322995 100.00000000 3.25717421 2.15076615 3.24528878 +61 1 1.03593655 100.00000000 3.33679975 3.31397341 0.02636698 +62 2 1.03640857 120.00000000 3.36403914 3.29179712 1.02605042 +63 1 1.02664888 100.00000000 3.25028479 3.30264881 2.23444862 +64 2 1.03760887 120.00000000 3.36696505 3.30179176 3.25628563 + +Velocities + +1 -0.03920215 -0.02191008 -0.02114115 +2 -0.04226334 0.00536595 -0.01441266 +3 0.03620209 -0.02178452 -0.03162354 +4 0.03451225 -0.04733372 0.04985170 +5 -0.01876393 0.02308314 0.02906303 +6 0.00834791 0.01699662 0.03813032 +7 0.02612308 -0.04314740 -0.01776231 +8 0.02252622 0.02500629 -0.00354086 +9 -0.04504014 -0.04527528 0.03530916 +10 0.04496388 -0.04630134 0.00459756 +11 -0.02221923 -0.03311946 -0.03815307 +12 0.00482963 -0.03616742 0.02017450 +13 -0.00638340 -0.04472227 -0.04689953 +14 -0.03172387 -0.02812063 0.01534790 +15 -0.02674510 0.00114199 -0.03443979 +16 -0.03469764 0.04750262 -0.02032095 +17 -0.02076818 -0.00884787 -0.01754755 +18 0.01585767 0.03105329 0.04690301 +19 0.02011302 -0.04630053 0.03143034 +20 0.02204810 -0.01663947 -0.04948269 +21 0.00934618 0.04206963 0.03571494 +22 0.03172747 0.03685794 -0.03433569 +23 0.03864903 -0.03232805 0.00178691 +24 0.01210253 -0.03971948 0.02701723 +25 -0.03464208 0.03467221 0.01558321 +26 -0.04768078 -0.02336071 -0.00639511 +27 0.00147947 0.00875175 0.04846447 +28 -0.03611925 -0.03146926 0.00312579 +29 0.00314389 0.00873469 0.02414618 +30 0.03728134 -0.02296642 -0.03528311 +31 -0.02567821 -0.02712117 -0.01714555 +32 0.02482324 0.00442810 -0.04929776 +33 -0.03949768 0.01572734 -0.02630112 +34 0.02278497 0.03783181 -0.00203355 +35 -0.01215419 0.03222093 0.02028555 +36 -0.04332145 -0.03106549 -0.01387432 +37 -0.00893331 -0.02039165 -0.04922585 +38 -0.00184255 0.01249809 -0.04130681 +39 0.00975378 0.00213086 0.04724330 +40 -0.02688317 0.01842525 0.03373842 +41 -0.04531536 -0.02427151 -0.00938368 +42 0.03727170 -0.04382914 0.00954567 +43 -0.01075509 0.04694168 -0.03610393 +44 -0.01516473 0.03422940 -0.00815506 +45 0.03979135 0.00861102 -0.04045079 +46 -0.02644683 0.00050110 -0.04501232 +47 0.01737965 -0.01269402 0.03885484 +48 0.04266772 0.03586574 0.04172640 +49 -0.03974467 0.03694425 0.00626494 +50 0.02298316 0.01303035 0.04718036 +51 -0.02140814 -0.04297028 -0.03160451 +52 0.00463754 0.01967229 0.01852269 +53 -0.01877413 0.03160870 -0.02571946 +54 -0.00839088 0.03755807 -0.03909003 +55 0.03431197 -0.03851158 -0.04019299 +56 0.01772176 -0.03461298 -0.03522726 +57 0.00649692 0.00696750 -0.00000560 +58 0.01140763 0.02881505 0.02868778 +59 -0.00650549 -0.01482897 -0.00323939 +60 -0.04926676 0.02888262 0.03946999 +61 0.01452464 0.03844847 -0.02284945 +62 0.02742119 0.00860937 0.01479366 +63 0.04398118 0.00609816 -0.01034324 +64 0.03886736 -0.02780334 0.02902136 diff --git a/unittest/force-styles/tests/data.mdpd b/unittest/force-styles/tests/data.mdpd new file mode 100644 index 00000000000..ac23634bbc1 --- /dev/null +++ b/unittest/force-styles/tests/data.mdpd @@ -0,0 +1,147 @@ +DPD-MESO fluid block for force-style tests: 2 types, perturbed sc lattice + +64 atoms +2 atom types + +0.0 4.4 xlo xhi +0.0 4.4 ylo yhi +0.0 4.4 zlo zhi + +Masses + +1 1.0 +2 1.3 + +Atoms # mdpd + +1 1 6.49905609 0.01298434 -0.04883928 0.07444018 +2 2 6.24516888 0.06783622 -0.00525781 1.12615530 +3 1 5.70098391 -0.04567632 -0.04452860 2.16616359 +4 2 5.51026658 0.03078764 -0.04601972 3.37537695 +5 2 6.49999781 -0.06874312 1.05092586 -0.06578183 +6 1 6.24779321 0.04318271 1.07864240 1.09546916 +7 2 5.70073605 -0.02783548 1.12198831 2.18462309 +8 1 5.50753010 -0.04667717 1.08882465 3.26868637 +9 1 6.49792683 -0.06227214 2.25174264 0.02882352 +10 2 6.24584088 0.02636658 2.26119145 1.08314287 +11 1 5.70411700 -0.01931547 2.18767473 2.18472871 +12 2 5.50394082 0.02702963 2.12104298 3.29425687 +13 2 6.49831524 0.00561337 3.27528227 -0.07650141 +14 1 6.23673488 0.03273527 3.22151102 1.11030567 +15 2 5.70397520 -0.05546133 3.22553317 2.14893471 +16 1 5.51648109 -0.06948175 3.24412140 3.32957883 +17 2 6.22137094 1.13652422 -0.02195450 0.02438219 +18 1 6.49897242 1.09602146 -0.00024773 1.16014414 +19 2 6.19931867 1.06980706 0.05919848 2.23057285 +20 1 5.74581089 1.12935305 -0.07904836 3.23344981 +21 1 6.28931715 1.02511887 1.07532247 0.07137575 +22 2 6.49633856 1.16011313 1.15417210 1.03901953 +23 1 6.21938578 1.13291592 1.14391661 2.24948109 +24 2 5.74677645 1.14675747 1.04245053 3.24861318 +25 2 6.23389056 1.14680962 2.23811466 0.06279191 +26 1 6.49939666 1.09143620 2.26233156 1.04230544 +27 2 6.26978531 1.17313976 2.26151600 2.17400906 +28 1 5.66706172 1.03080843 2.20776589 3.33027288 +29 1 6.22167099 1.07605994 3.22919893 -0.03541272 +30 2 6.49991863 1.15192026 3.23450064 1.16996152 +31 1 6.23656861 1.06000292 3.25271010 2.13795082 +32 2 5.75012787 1.17696502 3.36416806 3.27106483 +33 1 5.75919463 2.13529999 0.02452955 0.06201195 +34 2 6.28476477 2.12193779 0.02128732 1.15707485 +35 1 6.49923645 2.19341117 0.01110001 2.24868298 +36 2 6.19622543 2.15816369 -0.03628058 3.32566530 +37 2 5.69183222 2.20837393 1.10565557 -0.02650322 +38 1 6.20820909 2.26991588 1.06610423 1.12862167 +39 2 6.49549280 2.26306562 1.08412748 2.12869313 +40 1 6.23193553 2.15526370 1.03060670 3.24370018 +41 1 5.72211639 2.13927122 2.17479972 -0.02081067 +42 2 6.24299137 2.19158135 2.22641503 1.12827231 +43 1 6.49999620 2.22995890 2.17829631 2.22605778 +44 2 6.22708062 2.20796888 2.14040342 3.30733467 +45 2 5.73331671 2.17093582 3.32814452 0.03756395 +46 1 6.24193217 2.15851559 3.28962005 1.09278427 +47 2 6.49960871 2.16750299 3.22648094 2.12793827 +48 1 6.26535817 2.27885104 3.33838909 3.29020183 +49 2 5.50572051 3.32666635 -0.03696223 0.03366097 +50 1 5.67525585 3.37213309 0.04371443 1.09442548 +51 2 6.15858597 3.37736971 0.06753549 2.12931935 +52 1 6.49987868 3.28589079 -0.00766840 3.26386142 +53 1 5.50471890 3.31863256 1.04295190 0.03954314 +54 2 5.69514435 3.35723027 1.02985306 1.13073763 +55 1 6.25656726 3.26255667 1.12212315 2.23059313 +56 2 6.49739945 3.37626939 1.14769110 3.27423397 +57 2 5.50646885 3.33680540 2.14348834 0.03418045 +58 1 5.69431689 3.28674359 2.16242875 1.05816137 +59 2 6.21815237 3.25468429 2.24741885 2.13537577 +60 1 6.49996468 3.25717421 2.15076615 3.24528878 +61 1 5.50710983 3.33679975 3.31397341 0.02636698 +62 2 5.65294156 3.36403914 3.29179712 1.02605042 +63 1 6.26345472 3.25028479 3.30264881 2.23444862 +64 2 6.49694064 3.36696505 3.30179176 3.25628563 + +Velocities + +1 -0.02831160 -0.01541081 -0.04165366 +2 0.03700122 -0.04447894 -0.01390959 +3 0.04654418 0.00665355 -0.04133750 +4 -0.00987791 0.01879287 -0.03530965 +5 0.00795792 -0.02655892 0.02090419 +6 -0.03207884 0.03069167 0.01480987 +7 0.00230919 0.01257251 0.00498116 +8 -0.04406370 0.01833987 -0.03233170 +9 0.04987522 0.02810019 0.04630012 +10 0.04304600 -0.00007387 -0.04082313 +11 0.04567680 0.02341428 0.02689077 +12 -0.03089989 -0.04855228 -0.00648322 +13 -0.04403567 0.03449981 -0.00137380 +14 -0.01167001 0.03804143 0.03780654 +15 -0.03665308 -0.01114211 0.01023980 +16 0.01052332 -0.03369011 0.00468744 +17 -0.04812219 -0.03433432 -0.03600365 +18 -0.03054686 0.01398715 -0.00952543 +19 -0.02247753 0.04144581 -0.00961601 +20 0.02702446 0.03105425 0.02101291 +21 -0.02966712 -0.03931869 0.01266337 +22 -0.03944952 -0.01708898 0.03986193 +23 0.02653774 0.04684673 -0.03146847 +24 0.01018804 -0.01964485 -0.02456820 +25 -0.03620801 -0.01478437 -0.00575538 +26 0.00364123 0.02101540 0.00479582 +27 -0.02072467 -0.03307114 0.03429957 +28 -0.01658126 0.00221757 -0.01522925 +29 0.01932235 0.02205431 -0.01679569 +30 -0.03209322 -0.03333299 0.00148518 +31 0.02356192 -0.00673915 -0.03125388 +32 0.03016268 -0.01886402 0.02303108 +33 0.04628483 -0.03493873 -0.00938673 +34 0.00282841 -0.03318474 0.04056121 +35 -0.00092668 -0.03147074 0.00841684 +36 -0.02848091 0.02564968 -0.01469607 +37 0.01067579 0.02059514 0.04727734 +38 -0.04370913 0.04415964 -0.04788947 +39 0.04720940 -0.01669026 -0.01477944 +40 -0.04435139 0.03794740 0.00629521 +41 0.02774398 0.04285161 0.04207001 +42 0.04508713 -0.03556218 -0.04342972 +43 0.04743116 0.02931180 -0.04458373 +44 0.01650698 -0.01055537 -0.02995895 +45 -0.04144333 0.02760040 -0.01931598 +46 -0.01982674 -0.04872324 0.01529654 +47 0.03901920 0.00270410 -0.00124197 +48 0.01495938 -0.04711704 -0.02376479 +49 -0.02960224 -0.04906089 0.03318514 +50 -0.03548302 0.02199353 0.00181870 +51 -0.00617334 0.04077057 -0.02358827 +52 -0.01267820 -0.00655213 0.00681958 +53 -0.00459903 -0.02182782 -0.03525040 +54 0.04634164 0.02207248 -0.02746611 +55 -0.02543259 0.00542534 0.03054498 +56 -0.00194434 -0.04216824 0.03589092 +57 0.00167665 -0.02582170 -0.01422897 +58 0.04351557 -0.00013501 -0.03638103 +59 0.00678528 0.04234778 -0.01499584 +60 0.01125564 0.00362351 -0.02046280 +61 0.04125810 -0.01166450 -0.01244071 +62 0.02759800 -0.03797110 0.01456124 +63 0.04483211 -0.00845954 -0.04053710 +64 0.00470984 -0.01204828 -0.01343296 diff --git a/unittest/force-styles/tests/data.tdpd b/unittest/force-styles/tests/data.tdpd new file mode 100644 index 00000000000..174ef99d4fe --- /dev/null +++ b/unittest/force-styles/tests/data.tdpd @@ -0,0 +1,147 @@ +DPD-MESO fluid block for force-style tests: 2 types, perturbed sc lattice + +64 atoms +2 atom types + +0.0 4.4 xlo xhi +0.0 4.4 ylo yhi +0.0 4.4 zlo zhi + +Masses + +1 1.0 +2 1.3 + +Atoms # tdpd + +1 1 0.01298434 -0.04883928 0.07444018 0.49686605 +2 2 0.06783622 -0.00525781 1.12615530 0.51361000 +3 1 -0.04567632 -0.04452860 2.16616359 0.48507071 +4 2 0.03078764 -0.04601972 3.37537695 0.50094304 +5 2 -0.06874312 1.05092586 -0.06578183 0.60911372 +6 1 0.04318271 1.07864240 1.09546916 0.63363716 +7 2 -0.02783548 1.12198831 2.18462309 0.62487319 +8 1 -0.04667717 1.08882465 3.26868637 0.61761415 +9 1 -0.06227214 2.25174264 0.02882352 0.72678548 +10 2 0.02636658 2.26119145 1.08314287 0.73921255 +11 1 -0.01931547 2.18767473 2.18472871 0.72765570 +12 2 0.02702963 2.12104298 3.29425687 0.72878290 +13 2 0.00561337 3.27528227 -0.07650141 0.79016581 +14 1 0.03273527 3.22151102 1.11030567 0.78997266 +15 2 -0.05546133 3.22553317 2.14893471 0.78482663 +16 1 -0.06948175 3.24412140 3.32957883 0.78460172 +17 2 1.13652422 -0.02195450 0.02438219 0.71242606 +18 1 1.09602146 -0.00024773 1.16014414 0.70821855 +19 2 1.06980706 0.05919848 2.23057285 0.70938788 +20 1 1.12935305 -0.07904836 3.23344981 0.70644316 +21 1 1.02511887 1.07532247 0.07137575 0.77354810 +22 2 1.16011313 1.15417210 1.03901953 0.78686138 +23 1 1.13291592 1.14391661 2.24948109 0.78475283 +24 2 1.14675747 1.04245053 3.24861318 0.78169994 +25 2 1.14680962 2.23811466 0.06279191 0.79757568 +26 1 1.09143620 2.26233156 1.04230544 0.79855639 +27 2 1.17313976 2.26151600 2.17400906 0.79640309 +28 1 1.03080843 2.20776589 3.33027288 0.79982788 +29 1 1.07605994 3.22919893 -0.03541272 0.76690774 +30 2 1.15192026 3.23450064 1.16996152 0.75894093 +31 1 1.06000292 3.25271010 2.13795082 0.76715869 +32 2 1.17696502 3.36416806 3.27106483 0.74781284 +33 1 2.13529999 0.02452955 0.06201195 0.79934139 +34 2 2.12193779 0.02128732 1.15707485 0.79911282 +35 1 2.19341117 0.01110001 2.24868298 0.79985615 +36 2 2.15816369 -0.03628058 3.32566530 0.79916575 +37 2 2.20837393 1.10565557 -0.02650322 0.77425261 +38 1 2.26991588 1.06610423 1.12862167 0.77083658 +39 2 2.26306562 1.08412748 2.12869313 0.77052431 +40 1 2.15526370 1.03060670 3.24370018 0.78179834 +41 1 2.13927122 2.17479972 -0.02081067 0.70973963 +42 2 2.19158135 2.22641503 1.12827231 0.69711973 +43 1 2.22995890 2.17829631 2.22605778 0.69539149 +44 2 2.20796888 2.14040342 3.30733467 0.70225382 +45 2 2.17093582 3.32814452 0.03756395 0.58598106 +46 1 2.15851559 3.28962005 1.09278427 0.59288325 +47 2 2.16750299 3.22648094 2.12793827 0.59827601 +48 1 2.27885104 3.33838909 3.29020183 0.56284346 +49 2 3.32666635 -0.03696223 0.03366097 0.72091542 +50 1 3.37213309 0.04371443 1.09442548 0.70746089 +51 2 3.37736971 0.06753549 2.12931935 0.70458373 +52 1 3.28589079 -0.00766840 3.26386142 0.72429901 +53 1 3.31863256 1.04295190 0.03954314 0.61720370 +54 2 3.35723027 1.02985306 1.13073763 0.61116197 +55 1 3.26255667 1.12212315 2.23059313 0.61929487 +56 2 3.37626939 1.14769110 3.27423397 0.59412151 +57 2 3.33680540 2.14348834 0.03418045 0.48453692 +58 1 3.28674359 2.16242875 1.05816137 0.49277089 +59 2 3.25468429 2.24741885 2.13537577 0.48930610 +60 1 3.25717421 2.15076615 3.24528878 0.50037927 +61 1 3.33679975 3.31397341 0.02636698 0.35099935 +62 2 3.36403914 3.29179712 1.02605042 0.34835201 +63 1 3.25028479 3.30264881 2.23444862 0.36825126 +64 2 3.36696505 3.30179176 3.25628563 0.34678979 + +Velocities + +1 -0.03201869 -0.00795403 0.03479921 +2 -0.02643912 -0.03078098 0.02281634 +3 -0.00669423 0.00467436 -0.03841689 +4 0.01928721 0.02212313 -0.01504497 +5 -0.00011935 -0.00089943 -0.03523568 +6 0.03390621 0.04491687 -0.02783907 +7 -0.01121745 -0.00892162 -0.04544493 +8 -0.04451269 0.04031793 -0.04758810 +9 0.03326769 -0.00709480 -0.04523142 +10 -0.03397317 0.02644840 0.00819973 +11 -0.04117787 -0.03128566 0.01199188 +12 -0.00467028 0.03646897 -0.02979361 +13 -0.02711016 0.04850138 0.04623412 +14 -0.03042491 0.01530174 -0.02082256 +15 -0.01101939 -0.03484510 -0.01093564 +16 0.00212436 -0.01542356 0.01905936 +17 0.02783670 -0.01962949 0.02896130 +18 -0.03865031 -0.01454373 -0.03451855 +19 -0.03670009 0.00761039 -0.04526717 +20 -0.01268940 -0.03165761 0.03235617 +21 0.03866044 -0.03342589 0.03655260 +22 0.01939285 -0.01635845 0.03879372 +23 0.03002229 0.03683112 -0.02813246 +24 -0.03292214 -0.00937381 0.04813320 +25 -0.01096145 -0.01694261 0.02823612 +26 0.02786581 -0.00967863 -0.04702906 +27 -0.03279311 -0.01706357 -0.04655259 +28 0.02581294 -0.04690169 0.04451038 +29 0.03592077 -0.00005913 0.04095707 +30 0.03666829 0.03232871 0.00416766 +31 -0.02068118 -0.00518087 0.01686338 +32 -0.04024565 0.03016945 0.00039411 +33 -0.03544632 -0.03429838 -0.01440353 +34 -0.02734553 0.03507439 0.02702065 +35 0.04141907 0.01082777 0.00726468 +36 0.04095339 -0.01312810 -0.04872478 +37 0.00982021 -0.01591031 -0.00483369 +38 -0.03082379 -0.02814046 0.04921900 +39 0.03602035 -0.00820642 -0.02367749 +40 -0.01528462 -0.00853417 -0.04005798 +41 -0.00902390 -0.00555465 -0.02921308 +42 -0.00372751 0.03798104 -0.02542270 +43 -0.04814668 0.03842508 -0.04891021 +44 -0.04257917 -0.04672035 -0.03641499 +45 0.04385333 -0.01436609 0.01608541 +46 -0.03340302 0.04470381 -0.01607742 +47 0.03579692 0.01226179 -0.00346989 +48 0.01045329 0.04741276 -0.01747468 +49 -0.03864231 0.01858963 0.03520233 +50 0.02625418 -0.01872451 -0.01616639 +51 -0.01818261 0.01616689 0.02951320 +52 -0.03197042 -0.02803754 -0.01507355 +53 0.01103194 -0.01102532 0.02719532 +54 -0.01038988 -0.00955569 0.01329494 +55 0.03692014 -0.01225341 0.00682699 +56 0.04078680 0.01037301 0.01857261 +57 -0.04231726 0.04369587 0.03142416 +58 0.04295430 -0.03571027 -0.02642841 +59 0.04063647 0.00448093 0.01466802 +60 -0.03366684 0.01247965 0.03182176 +61 0.04746820 0.04382632 0.02386343 +62 0.00030902 -0.02506022 -0.04579351 +63 0.04872479 0.03943732 -0.01755378 +64 0.03761152 0.02480107 0.04261727 diff --git a/unittest/force-styles/tests/in.edpd b/unittest/force-styles/tests/in.edpd new file mode 100644 index 00000000000..03f9e8517ca --- /dev/null +++ b/unittest/force-styles/tests/in.edpd @@ -0,0 +1,17 @@ +variable newton_pair index on +variable newton_bond index on +variable units index lj +variable input_dir index . +variable data_file index ${input_dir}/data.edpd +variable pair_style index 'zero 2.0' + +atom_style edpd +atom_modify map array +neigh_modify delay 2 every 2 check no +units ${units} +timestep 0.005 +newton ${newton_pair} ${newton_bond} +comm_modify vel yes + +pair_style ${pair_style} +read_data ${data_file} diff --git a/unittest/force-styles/tests/in.mdpd b/unittest/force-styles/tests/in.mdpd new file mode 100644 index 00000000000..a571fe17c3e --- /dev/null +++ b/unittest/force-styles/tests/in.mdpd @@ -0,0 +1,17 @@ +variable newton_pair index on +variable newton_bond index on +variable units index lj +variable input_dir index . +variable data_file index ${input_dir}/data.mdpd +variable pair_style index 'zero 2.0' + +atom_style mdpd +atom_modify map array +neigh_modify delay 2 every 2 check no +units ${units} +timestep 0.005 +newton ${newton_pair} ${newton_bond} +comm_modify vel yes + +pair_style ${pair_style} +read_data ${data_file} diff --git a/unittest/force-styles/tests/in.tdpd b/unittest/force-styles/tests/in.tdpd new file mode 100644 index 00000000000..e1adb9ccaa4 --- /dev/null +++ b/unittest/force-styles/tests/in.tdpd @@ -0,0 +1,17 @@ +variable newton_pair index on +variable newton_bond index on +variable units index lj +variable input_dir index . +variable data_file index ${input_dir}/data.tdpd +variable pair_style index 'zero 2.0' + +atom_style tdpd 1 +atom_modify map array +neigh_modify delay 2 every 2 check no +units ${units} +timestep 0.005 +newton ${newton_pair} ${newton_bond} +comm_modify vel yes + +pair_style ${pair_style} +read_data ${data_file} diff --git a/unittest/force-styles/tests/meso-pair-edpd.yaml b/unittest/force-styles/tests/meso-pair-edpd.yaml new file mode 100644 index 00000000000..04671d307a1 --- /dev/null +++ b/unittest/force-styles/tests/meso-pair-edpd.yaml @@ -0,0 +1,162 @@ +--- +lammps_version: 4 Jul 2026 +tags: generated +date_generated: Fri Jul 10 17:20:51 2026 +epsilon: 6e-12 +skip_tests: single +prerequisites: | + atom edpd + pair edpd +pre_commands: | + variable units delete + variable units index lj + variable newton_pair delete + variable newton_pair index on +post_commands: "" +input_file: in.edpd +pair_style: edpd 1.5 9872598 +pair_coeff: | + 1 1 25.0 4.5 0.41 1.5 0.05 1.0 1.42 + 1 2 30.0 4.5 0.41 1.5 0.05 1.0 1.42 + 2 2 35.0 4.5 0.41 1.5 0.05 1.0 1.42 +extract: "" +natoms: 64 +init_vdwl: 310.25192882326775 +init_coul: 0 +init_stress: |2- + 3.3444060785922642e+02 7.4536489301190613e+02 3.6305589282218784e+02 -9.9045889532006044e+01 -7.8800940536034702e+01 -5.4397412875443671e+01 +init_forces: |2 + 1 -2.0434403470934434e+01 4.8943425498578108e+01 4.7285777023508324e+01 + 2 -1.1287476403114459e+02 -3.4565501869279247e-01 -8.9095481628070701e+00 + 3 6.5156512385351178e+01 -1.2579352241713462e+01 6.4661574004197206e+01 + 4 -4.1169344427513870e+01 -4.0701554897580650e+01 -4.4109602218763769e+01 + 5 4.2527318290278785e+01 8.7680238214814366e+01 5.4585585241810763e+00 + 6 2.8138790594634887e+01 9.1614744557017413e+00 2.6800786766706992e+01 + 7 2.2744900595977899e+01 -5.0738923939685087e+01 -2.6270919159995287e+01 + 8 5.0006633335400601e+01 7.7310307909544306e+01 3.9863371097824668e+01 + 9 -2.8225332238739416e+01 -5.4087483674332887e+01 -7.6301766139424728e+01 + 10 -1.8140790206992982e+01 -1.6543627232721423e+01 3.2683981969734582e+01 + 11 4.6350203068684543e+01 1.5755548897073524e+02 -3.3558271328819004e+01 + 12 -2.3924602354713137e+01 -1.2995837146785257e+02 6.7657921939219108e+01 + 13 6.9372489950263798e+00 -6.2909521897615868e+01 -4.9070946172968490e+00 + 14 4.7758459025771842e+01 1.9428249337230167e+01 1.7049877753663161e+00 + 15 -2.4806950922822317e+01 -1.0886232882563516e+02 7.8586878901983837e+01 + 16 8.5713100375006661e+01 8.0763179043834697e+01 -5.6487332952439388e+01 + 17 5.5415078575915558e+01 -6.5149247151808481e+01 8.2700611177993650e+00 + 18 6.4374036952075613e+01 5.0039265799805840e+01 6.5069458332637993e+00 + 19 -2.2077958564324646e+01 -8.1119620758804079e+00 -2.5733957825142351e+01 + 20 2.2701417217607663e+01 -1.4244050777055330e+01 -7.0116267993475230e+00 + 21 -4.8073408923447865e+00 -1.1570489641164823e+01 4.2206340276714895e+00 + 22 1.7887023686857958e+01 -6.8812046807810399e+00 -3.7980107088930772e+01 + 23 -9.1931543073435861e+01 5.8525275382102855e+01 5.5238935652608294e+00 + 24 -4.7353765794664497e+01 1.1430277403752795e+02 7.0411748048664560e+00 + 25 2.7904304109091004e+01 9.2627701366546788e+01 -8.5162797138322368e+00 + 26 5.6789595106969351e+01 2.7114380354406599e+01 7.3331648934834362e+01 + 27 -4.4893804179191683e+00 -1.1654219552632918e+02 4.9319297645660235e+01 + 28 5.2845374565572172e+01 -1.4331092382651340e+01 -5.9024606199213515e+01 + 29 -2.4686493769017005e+01 2.5036535124564818e+01 -2.7733111079341349e+01 + 30 -9.7361627009665987e+00 -8.3883853675777232e+01 -1.7366859181881814e+01 + 31 -3.5589210756187548e+01 4.3144888822764990e+01 3.7984406686620822e+01 + 32 -1.0336708907289675e+02 -5.2025833943321750e+01 -6.9570631892307276e+01 + 33 -4.3584258053311707e+01 -2.5777757737461400e+01 1.3585833653441842e+01 + 34 4.9373659950974904e+01 8.0898705294418534e+00 -1.1229981576333110e+01 + 35 3.6408066542405578e+01 -3.4678038023229895e+01 -5.4431184818037821e+01 + 36 -1.8262426145084589e+00 -8.2046023167063623e+01 7.5605333014637424e+01 + 37 -3.0808290614699875e+01 -2.9731786609776986e+01 7.8742189688467583e+00 + 38 -1.3243941246329797e+02 -1.5392176177513846e+01 -5.1140563738944032e+00 + 39 6.0882764891330794e+00 -2.2955836362788894e+01 1.8614720824367375e+01 + 40 5.7805412391800786e+01 8.9175803576468837e+00 -9.5105812660312434e+00 + 41 1.9847916825612977e-01 -2.2662422484906525e+01 -3.5956950977827134e+01 + 42 -9.2317089684318688e+01 3.4331093281818227e+01 -6.3230174181362671e+01 + 43 -1.5395012181335339e+01 4.8275082534478663e+01 1.1772679965509482e+02 + 44 -5.6559349357975343e+01 3.8991845900600460e+01 -2.3554899796332663e+01 + 45 -4.0133936718107535e+01 7.2594159816176727e+01 2.2248890186580290e+00 + 46 -7.9858046999830679e-02 -7.4248641334165683e+01 1.7386648461977469e+01 + 47 -1.9347134569155418e+01 1.1669553901796750e+01 -3.0233701743136429e+01 + 48 -8.7964395146035272e+01 3.0098208925150665e+01 1.3091661841343871e+00 + 49 3.9662308052069193e+00 -5.5336099416205442e+01 6.6836007940861506e+01 + 50 1.8707489536043138e+01 -1.9964677668395701e+01 -4.4936817983491082e+01 + 51 -2.7431793889865070e+01 -6.8026346385464436e+00 -9.1489716016110037e+01 + 52 8.3909073941944555e+01 9.2319652569488724e+01 3.7230643496110751e+01 + 53 2.0777550458729834e+01 5.8762917993750591e+01 -1.2111361829734419e+01 + 54 4.0808337570476198e+01 -5.4862785202133203e+01 8.2844441749154090e+00 + 55 4.8446946413965051e+01 1.2296905149801338e+01 1.9886485978501025e+01 + 56 -7.6704629234896842e+01 -1.0139909443059249e+01 -2.1106636333857651e+01 + 57 1.5755512578664090e+01 1.4862369363809595e+01 1.3334619200607339e+01 + 58 1.6062485628835038e+01 7.6423608601378916e+00 -2.6397968029349443e+01 + 59 1.6985831369836202e+01 -3.3627206963777105e+01 -3.6983421484140038e+01 + 60 -7.5319871514647261e+00 -7.5589288644406608e+01 1.3207226294766635e+01 + 61 1.7034911047819520e+01 -1.8022882563939007e+01 4.6566656779951238e+01 + 62 8.8208137543231722e+00 1.6277660783479220e+01 -3.5309278384196467e+01 + 63 2.6178529187276254e+01 5.7885456238579692e+01 3.0181122071814876e+01 + 64 8.5160918704677172e+01 2.6657012963653258e+01 -4.1678271184008750e+01 +run_vdwl: 310.1668101511308 +run_coul: 0 +run_stress: |2- + 9.6952221058584644e+02 1.1240148617228947e+03 6.8559911451241624e+02 3.8125944617982839e+00 -1.7885007163685138e+01 8.4897544092937011e+01 +run_forces: |2 + 1 1.4805125435947929e+02 -4.3644021927567557e+01 -2.3521477696912843e+01 + 2 -2.2747453918796932e+01 -2.7926046214544936e+01 1.8405118385007704e+01 + 3 -5.4483095516493670e+01 -6.8581377949717393e+01 -9.3593108452283396e+00 + 4 5.8738595613095946e+01 -7.2911815961393316e+01 -2.3547269313863854e+01 + 5 -7.3562902059818910e+01 7.1273323755209205e+01 -2.9848595163587603e+01 + 6 -4.7012080166853579e+01 -1.2766583598872364e+01 -7.9888766881194186e+00 + 7 -3.8568875433124397e+01 3.3447484287111223e+01 3.6035109714522761e+01 + 8 -2.0620291513806364e+01 9.0535740442597060e+01 1.8840886125778436e+01 + 9 3.3256599745968288e+01 2.6847583966860938e+01 -8.0169890087452664e+00 + 10 6.7724243614114201e+01 3.1256535641724774e+00 2.8809994796954033e+01 + 11 -3.2868634855131887e+01 4.2131917046472516e+01 -2.7851762161381604e+01 + 12 -6.7788613584151804e+01 -4.5806317862827562e+01 -3.8471016068914075e+01 + 13 8.2916821829909139e+01 -2.6941228022628081e+01 3.7038376307708909e+01 + 14 1.0498662480263874e+01 5.3494085778851357e+00 3.7047085628284073e+01 + 15 -7.3998115522566977e+01 2.8603121251755464e+01 -1.6045007622957687e+01 + 16 5.9794547435445267e+01 3.9186198705463084e+01 -1.5289801218182335e+01 + 17 2.4715651862325750e+01 -5.4725354023448077e+01 1.4315555007325170e+01 + 18 5.4015155311665914e+01 3.4745581279289446e+01 -2.9085047847859528e+01 + 19 8.8316601158138440e+01 8.4734441276238126e-01 1.7728217215133395e+01 + 20 -7.2483156162061533e+01 9.9891084680444528e+00 7.7018364950244944e-01 + 21 1.5261159598508502e+01 -1.3967005710779508e+01 2.8207944485947721e+01 + 22 8.0577466519835127e+01 -3.0719894149109397e+01 4.8603270072281490e-01 + 23 3.6462402607634353e+01 -2.5921511333541758e+01 -2.2604148013830056e+01 + 24 3.8243289526460217e+01 -1.2024912821026600e+01 1.4769750195047010e+01 + 25 -3.9322293013591683e+00 3.9432006348169836e+01 -1.1032745488366196e+01 + 26 1.8609262688397180e+01 5.1915973021851876e+01 9.9747343736572329e+00 + 27 1.1417506137437385e+00 8.0802013173704623e+01 -8.0498985328265853e+00 + 28 -2.0370015366000708e+01 2.1518448980664196e+01 -2.5124694427273901e+01 + 29 -1.0284242743025963e+02 2.8606711480204360e+01 -5.3553274767678701e+01 + 30 -1.4039300572164093e+00 -9.7693253666212897e+01 -8.2602318709271323e+00 + 31 -1.9905891841931798e+01 1.8410521165916812e+01 5.2133163658424706e+01 + 32 -3.7545394244124466e+01 -2.7932594797512486e+01 3.4214635762060659e+01 + 33 -6.5620748446892847e+01 -8.6969237036880756e+01 1.6030497085639965e+01 + 34 -5.8691016452570352e+01 -4.2525573236808668e+01 3.2340591992882409e+01 + 35 -4.8335503226264350e+01 -3.1068802906322549e+01 -5.0564271513396051e+01 + 36 2.0847087580763999e+00 2.7967151883693013e+01 -7.6023214803356822e+00 + 37 -3.4235136556002253e+01 2.4337460184864540e+01 -3.3764308020597056e+01 + 38 -7.8207037990980709e+01 -1.7824560529846281e+01 6.0928350852839351e+01 + 39 -6.1939248782303892e+01 3.6560572852115790e+01 -7.2436828641078520e+01 + 40 -2.4751460349265397e+01 2.1226427496631533e+01 3.7813667741300797e+01 + 41 3.2165369350520265e+01 -1.3940851507274060e+01 3.6956824281870162e+00 + 42 -8.1316077101939030e+01 4.8265659813760713e+01 -5.5731672660198306e+01 + 43 2.9134999616367733e+01 -1.7932861761162190e+01 2.1086467790237350e+01 + 44 -1.5689728183244821e+01 -2.8437371247178810e+01 4.5820271388987955e+01 + 45 5.7214094746361113e+01 1.0414092672712248e+02 3.1917674652266836e+01 + 46 3.1651735279036266e+01 1.8240865811550080e+01 -7.2402700589544594e+01 + 47 -2.7132020674162373e+01 3.0488071725258692e-03 4.3699705285912167e+01 + 48 5.3292798199106983e+01 -3.6947725668289678e+01 -4.4646280801948435e-01 + 49 -7.2034974919576086e+01 4.8327176840806537e+01 -8.5717939631233087e+00 + 50 2.0595802199864689e+01 6.7850876751661843e+01 -2.3907671661182210e+01 + 51 2.3560450215820943e+01 2.2508386221728106e+01 -1.4235054346878854e+01 + 52 -5.1026349748822017e+00 -6.4632712847327454e+01 1.7721480319586917e+01 + 53 4.7815099921659332e+01 -4.6439726832396723e+01 -5.0406830157108953e+00 + 54 5.4899322725323913e+01 -4.1827969475017674e+01 4.7615293950699481e+01 + 55 5.6493902800008911e+01 -2.0059030042064354e+01 3.3930191006400058e+01 + 56 1.1176526409686433e+01 -4.6520377031581781e+01 -5.2403827803295094e+01 + 57 -4.4830381832564512e+01 -1.8811077570327679e+01 -9.9749507041854514e+01 + 58 -9.3400085544954230e+00 -2.5350870692459569e+01 3.2422430940339510e+01 + 59 3.9489480379623608e+01 -7.4819008432993348e+00 3.2005423031565023e+01 + 60 9.7649360224418629e+01 2.4920534346961723e+01 4.4096178225703127e+01 + 61 -4.1764445180369790e+01 -5.2136400505079273e+01 -6.9835908021951866e+01 + 62 -5.2417169582239183e+01 1.0320774752513735e+01 9.6973314385204418e+01 + 63 8.3762283791494795e+01 -4.3431943999868619e+00 -2.9506877080669177e+01 + 64 -4.7768699800903725e+01 8.3374159753767970e+01 6.9760263006612737e+00 +... diff --git a/unittest/force-styles/tests/meso-pair-mdpd.yaml b/unittest/force-styles/tests/meso-pair-mdpd.yaml new file mode 100644 index 00000000000..581c222b4ff --- /dev/null +++ b/unittest/force-styles/tests/meso-pair-mdpd.yaml @@ -0,0 +1,164 @@ +--- +lammps_version: 4 Jul 2026 +tags: generated +date_generated: Fri Jul 10 17:19:09 2026 +epsilon: 6e-12 +skip_tests: single +prerequisites: | + atom mdpd + pair mdpd + pair mdpd/rhosum +pre_commands: | + variable units delete + variable units index lj + variable newton_pair delete + variable newton_pair index on +post_commands: "" +input_file: in.mdpd +pair_style: hybrid/overlay mdpd/rhosum mdpd 1.0 1.0 65689 +pair_coeff: | + * * mdpd/rhosum 0.75 + 1 1 mdpd -40.0 25.0 4.5 1.0 0.75 + 1 2 mdpd -35.0 20.0 4.5 1.0 0.75 + 2 2 mdpd -30.0 25.0 4.5 1.0 0.75 +extract: "" +natoms: 64 +init_vdwl: -0.12186369438262681 +init_coul: 0 +init_stress: |2- + 1.0703037370846122e-01 -3.3093868611249455e+00 -2.9172567872939403e+00 1.2014689516036461e-01 1.4383726071586812e-02 -2.2025819035433139e-01 +init_forces: |2 + 1 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 2 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 3 -2.2452795815693065e+00 2.5755073507111509e-01 -8.4677090539321431e-02 + 4 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 5 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 6 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 7 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 8 1.2331636111896322e+00 -7.4296820509545405e-02 -7.0017648670634078e-03 + 9 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 10 -1.9008241275992415e-03 -2.8662073501171031e-01 -8.1071155313184613e-03 + 11 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 12 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 13 -2.2227756802017636e-03 -9.2234520711770686e-04 -2.9419497173717717e-02 + 14 1.9008241275992415e-03 2.8662073501171031e-01 8.1071155313184613e-03 + 15 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 16 1.1772168199437314e+00 -6.9403122582863741e-02 1.1879606038269866e-01 + 17 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 18 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 19 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 20 1.0133808466493120e-01 -2.0364335992830407e+00 8.0060415089588721e-02 + 21 1.0632920841851494e-01 6.2106483208936428e-02 7.6217164462029419e-01 + 22 -1.0632920841851494e-01 -6.2106483208936428e-02 -7.6217164462029419e-01 + 23 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 24 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 25 -9.2309837096039543e-02 2.9960858863693731e-02 1.6439536448915946e+00 + 26 1.9250778903854449e-01 1.5608019833108080e+00 -1.4325965380035155e+00 + 27 -1.4018488585352613e-02 1.2281625663858800e-01 -4.4678817779240229e-03 + 28 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 29 -7.6163814753861688e-04 1.0669272107767301e-02 -1.0571976081434574e-03 + 30 -1.5016701257155021e-01 -1.5914084619136477e+00 3.2189211216329594e-01 + 31 6.4552260181425694e-02 -1.3282734586862696e-01 -5.2770755099289679e-01 + 32 -1.0133808466493120e-01 2.0364335992830407e+00 -8.0060415089588721e-02 + 33 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 34 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 35 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 36 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 37 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 38 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 39 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 40 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 41 1.9692718051081217e-04 -1.2563138582299997e-05 -1.6588672410932186e-05 + 42 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 43 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 44 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 45 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 46 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 47 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 48 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 49 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 50 8.9384319916440292e-04 -5.9146745908411694e-02 -2.1779346677029956e-03 + 51 2.2452795815693065e+00 -2.5755073507111509e-01 8.4677090539321431e-02 + 52 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 53 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 54 -8.9384319916440292e-04 5.9146745908411694e-02 2.1779346677029956e-03 + 55 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 56 -1.2331636111896322e+00 7.4296820509545405e-02 7.0017648670634078e-03 + 57 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 58 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 59 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 60 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 61 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 62 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 63 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 64 -1.1749940442635296e+00 7.0325467789981444e-02 -8.9376563208980950e-02 +run_vdwl: -0.12271258182687504 +run_coul: 0 +run_stress: |2- + 2.4809913093393798e+00 -3.4978475056245109e+00 -5.7495375441860510e+00 -6.1603123580877224e-02 1.2610720063967529e-01 -2.7644262519985252e-01 +run_forces: |2 + 1 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 2 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 3 -7.7460812317360317e-01 8.9298133708186692e-02 -2.8900430760388948e-02 + 4 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 5 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 6 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 7 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 8 1.4357258719958985e+00 -8.4795853435865445e-02 -1.0165611809124420e-02 + 9 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 10 3.8540942488817379e-03 7.0232520756941075e-01 2.0999153014217290e-02 + 11 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 12 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 13 9.6903624995936397e-05 4.2517855038770011e-05 1.2994134143923292e-03 + 14 -3.8540942488817379e-03 -7.0232520756941075e-01 -2.0999153014217290e-02 + 15 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 16 1.9862354813853140e+00 -1.1980488267818523e-01 1.5055241533094585e-01 + 17 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 18 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 19 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 20 9.6871742337595712e-02 -1.9461460565504975e+00 7.6513111434975495e-02 + 21 2.8954604936522904e-01 1.7032351087357067e-01 2.0796585791904993e+00 + 22 -2.8954604936522904e-01 -1.7032351087357067e-01 -2.0796585791904993e+00 + 23 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 24 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 25 -6.5156227482327883e-02 8.3611506395435548e-02 1.1572640901998519e+00 + 26 1.0294264121273819e-01 5.9064118086761630e-01 -1.0811737560224095e+00 + 27 -6.8113165714729926e-03 6.0191037770240118e-02 -2.2853799582863922e-03 + 28 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 29 3.8002243038516683e-03 -5.4123754848498296e-02 5.3781550587853593e-03 + 30 -2.9004460948889388e-01 -5.6812683813916764e-01 2.6017233971661420e+00 + 31 2.5869401175547829e-01 -1.1240741685065804e-01 -2.6811917699724703e+00 + 32 -9.6871742337595712e-02 1.9461460565504975e+00 -7.6513111434975495e-02 + 33 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 34 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 35 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 36 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 37 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 38 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 39 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 40 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 41 -3.4247237293734199e-03 2.1428480503200736e-04 2.8526352838657262e-04 + 42 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 43 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 44 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 45 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 46 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 47 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 48 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 49 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 50 -3.1521940201186226e-03 2.3431739831032589e-01 8.4889758622304443e-03 + 51 7.7460812317360317e-01 -8.9298133708186692e-02 2.8900430760388948e-02 + 52 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 53 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 54 3.1521940201186226e-03 -2.3431739831032589e-01 -8.4889758622304443e-03 + 55 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 56 -1.4357258719958985e+00 8.4795853435865445e-02 1.0165611809124420e-02 + 57 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 58 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 59 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 60 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 61 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 62 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 63 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 64 -1.9863323850103101e+00 1.1976236482314646e-01 -1.5185182874533817e-01 +... diff --git a/unittest/force-styles/tests/meso-pair-tdpd.yaml b/unittest/force-styles/tests/meso-pair-tdpd.yaml new file mode 100644 index 00000000000..84132bc44fe --- /dev/null +++ b/unittest/force-styles/tests/meso-pair-tdpd.yaml @@ -0,0 +1,162 @@ +--- +lammps_version: 4 Jul 2026 +tags: generated +date_generated: Fri Jul 10 17:19:10 2026 +epsilon: 6e-12 +skip_tests: single +prerequisites: | + atom tdpd + pair tdpd +pre_commands: | + variable units delete + variable units index lj + variable newton_pair delete + variable newton_pair index on +post_commands: "" +input_file: in.tdpd +pair_style: tdpd 1.0 1.58 935662 +pair_coeff: | + 1 1 18.75 4.5 0.41 1.58 1.42 4.5 0.0 2.0 + 1 2 20.0 4.5 0.41 1.58 1.42 4.5 0.1 2.0 + 2 2 22.0 4.5 0.41 1.58 1.42 4.5 0.0 2.0 +extract: "" +natoms: 64 +init_vdwl: 289.97485523756177 +init_coul: 0 +init_stress: |2- + 4.0466258332552165e+01 1.4397393894369532e+02 9.6987278281797273e+02 -2.9337970931951293e+02 1.0356929302360105e+02 2.4630547671565903e+01 +init_forces: |2 + 1 6.4460767780845558e+01 1.0367856447217201e+02 -1.8317881609522281e+01 + 2 -3.6874467734320078e+01 -4.4668739712698034e+01 8.7338756447831045e+00 + 3 1.1103715003793904e+02 1.9730668195923187e+00 -4.9672899238265220e+00 + 4 -7.3085007389710086e+01 -5.0255817316254046e+01 -4.1649839454566170e+01 + 5 1.3086238826080034e+01 -9.9526509165230323e+01 6.1433251395174679e+01 + 6 -9.5842876895131880e+01 5.1877634229828764e+01 -5.4664759249420854e+01 + 7 4.5810637352855537e+00 -4.1427103829457977e+01 -4.6427730515025445e+01 + 8 -1.0905092348287315e+01 -8.3547531770997693e+01 3.9316461301045663e+01 + 9 -8.4388180619487883e+01 6.5221052384675616e+01 1.4748524749108569e+02 + 10 7.3633132016598822e+01 -4.7565766852091912e+01 -2.3476279136998276e+01 + 11 -4.7969440648376853e+01 -1.1006809157943430e+02 2.9178144090406114e+01 + 12 5.7689484499963406e+00 4.8210582885724335e+01 -8.5602987140860137e+01 + 13 -2.6163310235809377e+01 3.3831184206704158e+01 -7.3803311545382385e+01 + 14 -7.5030182486491643e+00 7.0098864967907772e+01 -1.3354793726759038e+02 + 15 8.5322237599162847e+01 6.4420103527596790e+00 1.3817501710252856e+02 + 16 1.5709401519032321e+01 5.2003655062082345e+01 -1.4769404793013647e+00 + 17 7.0874246382161701e+01 -2.7568360269343266e+01 -1.0161831301772292e+01 + 18 -7.2704074286649842e+01 -7.3290689137949556e+01 1.0865229879961473e+02 + 19 3.1452359003959373e+01 2.0635003918378914e+01 -4.0384700825243577e+01 + 20 9.1586207925953875e+00 1.8671191628882539e+01 -4.2341788848143935e+01 + 21 -4.9945784553654825e+01 -1.0782239255040717e+02 3.5055661111874478e+01 + 22 9.2166017477247976e+01 6.4788021443233703e+01 -1.0043457456853542e+01 + 23 -3.4246090631110981e+01 -9.5257690272925366e+00 -1.1159532370375156e+02 + 24 -2.6815720647213745e+01 -8.8761036281725893e+01 2.7775700242899507e+01 + 25 9.0865412024198150e+01 -5.6256939261795679e+01 -5.9123903880139892e+01 + 26 -4.9164221687553933e+01 7.8507990254128103e+01 3.2559335115831459e+01 + 27 3.3081191002313417e+01 2.5849901301528480e+01 6.1657753707294013e+01 + 28 3.4059777378467246e+01 2.0353450347820438e+01 -2.7263691344058621e+01 + 29 -2.3624452352154687e+01 6.4854956558368542e+01 8.2520745612841225e+01 + 30 6.8019286447492711e-01 4.7249613106674808e+01 -1.0237899422595790e+01 + 31 1.1825479641268905e+02 1.7665742096218082e+01 2.0084144382985016e+01 + 32 7.3885880768337842e+01 2.7728776244585603e+01 -2.6053288070881582e+01 + 33 -9.6347786824847418e+01 8.3542066966905182e+01 1.8741881727249204e+01 + 34 6.2029151617904930e+01 -9.1200866751786748e+01 5.6608126794274270e+01 + 35 2.9373917757084079e+01 -7.3110077265511926e+00 -8.0393711781965521e+01 + 36 4.5860865164149715e+01 -1.1376137696667527e+01 6.1846193272948597e+01 + 37 -1.2711518532127469e+01 -9.1509933849929524e+01 5.8173583682367102e+01 + 38 7.0953786404561356e+01 2.7372411567369685e+01 -8.2791906786213936e+00 + 39 -2.8212908234608992e+01 4.7171746699458879e+01 -7.5113144454743178e+01 + 40 -8.0092988118556150e+01 -2.0511093433488732e+01 4.6271344615726932e+01 + 41 8.4715466602845630e+00 -4.2551093326897302e+01 -4.3187616949366252e+01 + 42 -6.1020151277094413e+01 1.3485682408302798e+01 -3.9833869335629565e+01 + 43 -1.0492789505428992e+02 -1.5895269892592097e+02 4.2097122763949997e+01 + 44 4.4252971056347882e+01 8.7927458885878792e+01 -4.5800813852433350e+01 + 45 8.7567175228840171e+01 8.1511875304688132e+01 -4.1783458504223518e+01 + 46 -3.0594931012564185e+01 -2.7546151371540560e+01 3.4346055357383094e+01 + 47 -3.4578711809029059e+01 1.2693152990163745e+02 4.2124506778524719e+01 + 48 -1.5172745024384378e+01 -8.3316623722393018e+01 -5.7033520343786464e+00 + 49 3.9903230980808942e+01 -3.1342213975282057e+01 5.0307715992734188e+01 + 50 -2.8928761208924531e+01 -2.6126104532184243e+01 -5.7904909129990187e+01 + 51 -8.9682224198082032e+00 -5.4555793640000928e+01 -9.7029139758012874e+01 + 52 -3.9519318601536320e+01 3.7524382701872561e+01 8.2259009721675554e+01 + 53 -2.3570118247827949e+01 -1.0046615887936490e+01 -4.2017611271654687e+01 + 54 2.2604128540246698e+01 8.7166744479538750e+01 1.5216674151710061e+01 + 55 -1.8339188175300738e+01 6.4537843016982919e+01 -2.6432931137226241e+01 + 56 2.7428755384094991e+01 4.0508608240750760e+01 7.0859142219693169e+01 + 57 9.4461093888330794e+01 -2.1864170865614149e+01 1.0799019714499191e+02 + 58 -4.6484981335525063e+01 -5.1800126918599624e+01 3.1765770608777924e+01 + 59 8.0861704533401038e+01 2.0990174292864250e+01 -3.5039769098954388e+00 + 60 -4.3258172528027188e+01 -3.1919781941220275e+01 -8.6992194494002703e+01 + 61 -1.0481753000886192e+02 -1.4682385273609144e+01 -1.8214160392901281e+01 + 62 -4.5291123322246840e+01 1.1280696257808206e+02 -6.7145335465242781e+01 + 63 -1.0536862115243331e+02 -6.7876765182387018e+01 -9.0413184922664811e+01 + 64 2.5591649878663894e+01 3.3655562451089452e+01 1.3965448141851610e+02 +run_vdwl: 289.76514170770804 +run_coul: 0 +run_stress: |2- + 8.9812829863087677e+02 7.0593053919083457e+02 6.7321473062370092e+02 3.2563456916440153e+01 -4.9495158070953551e+01 1.5795830709947685e+02 +run_forces: |2 + 1 -3.4374931825831297e+01 -3.7549240351732763e+01 -3.1834907253402882e+01 + 2 2.4170160148420823e+01 5.3184218649280012e+01 -7.3221365957037804e+01 + 3 -8.3469876783732246e+00 6.2528347422932029e+01 1.1534577385877695e+02 + 4 -3.4029283473778804e+01 2.5419545961042392e+01 -2.5744301475456382e+01 + 5 -6.0209483921392220e+01 -3.8420349314462001e+01 -1.1275493542542146e+02 + 6 1.0683965003534072e+02 -6.2132559972043396e+01 1.0917446888835741e+01 + 7 -5.3090230780532430e+01 -5.5331504599937588e+01 3.6167099787984142e+01 + 8 1.3774877415470321e-01 9.4320594394146564e+00 7.8528073012920927e+01 + 9 -2.9686556008492950e+01 7.1831223407160806e+01 3.0678754784253556e+01 + 10 -5.8595542234606732e+01 4.3845626641939688e+01 -3.1430211501151508e+01 + 11 -1.8385472424131766e+01 -1.7124379979645219e+01 6.3097340712063719e+01 + 12 -5.4391851853405576e+01 3.3206987664298751e+01 1.1925789014551672e+01 + 13 -8.6703053508220677e+01 9.2494400651235420e+00 -8.2795013235810970e+01 + 14 -4.5659776014750165e+01 -1.7513791691351557e+02 -1.4089322592342711e+01 + 15 -8.6563892357644718e+00 3.2181809669220769e+01 5.1921866908344420e+01 + 16 -1.1604091398924487e+02 -5.5814628382499478e+01 -1.1739351532841457e+01 + 17 1.1032427916710009e+02 -2.7043340524972436e+01 3.6992011562576387e+01 + 18 -1.1079419402845312e+02 4.9432605830237669e+01 1.1385859408278151e+01 + 19 1.7539276858599454e+01 -6.2737451082082657e+01 -5.6844850677464777e+01 + 20 -5.0571950264436516e+01 -1.2539286387301954e+02 -9.1378198645625974e-01 + 21 8.6953115657296166e+01 -5.8101933573043937e+01 -9.0164149561005885e+01 + 22 -4.6988184935997161e+01 -3.6769415346379390e+01 6.8172035535304616e+00 + 23 8.1581373630672275e+01 4.7158711189649495e+01 2.7470503960810390e+01 + 24 6.0934986151334634e+01 2.4251817563066162e+01 1.3481206314617293e+02 + 25 5.7041442989130545e+01 1.6866845443602372e+01 3.6436239493183592e+01 + 26 -5.3808622346677787e+01 1.7510316293416651e+01 7.1489639606979720e+00 + 27 -6.9004393320116918e+01 3.5053232068379756e+01 4.0034048423736643e+01 + 28 8.0660669313979284e+01 -6.6490786323582185e+01 1.9673013718630536e+01 + 29 6.2252519218183082e+01 1.2243622630510738e+02 -2.6076952279792600e+01 + 30 1.6442978800155036e+01 9.0736466071423720e+00 -5.3459951569297431e+01 + 31 5.6001131132968091e+01 3.8194144420415675e+01 -7.5869558874122944e+01 + 32 -2.7165594312405501e+00 1.3808400524646279e+02 8.3381453101773602e+01 + 33 -6.7445718309677702e+01 1.1725393512461505e+01 1.1904666422920528e+01 + 34 5.1343717797309793e+01 3.9358515129458908e+01 -4.7989469164483900e+01 + 35 5.3441605988014693e+01 3.5791538492668607e+01 -1.2595637255551577e+02 + 36 -3.6850484315219852e+01 1.5346665558706382e+01 7.1802613821891100e+01 + 37 -7.9338817856184107e+01 1.1566223923503088e+01 -9.8219096090158828e+01 + 38 -6.1396992182839057e+01 3.9517346611910035e+01 1.0565188949904049e+02 + 39 6.5246703690814570e+01 -5.0267867144479965e+01 1.4402375687944822e+01 + 40 2.0228539954498714e+00 -5.4737962025194236e+01 6.3579028612593618e+01 + 41 2.9703589297396185e+01 6.6471292621373976e+01 -3.3259219289073798e+01 + 42 7.8848489570480695e+01 2.2705755795075127e+01 -3.8301544960068540e+01 + 43 -6.0141776436587747e+01 6.4673538767552841e+01 -7.7735974111845891e+01 + 44 3.2654209262999146e+01 5.5103886867792120e+01 1.5924371571435506e+01 + 45 -7.5465135754987969e+01 -1.0710846686428991e+02 6.5504503937330085e+01 + 46 7.7835278454636132e+00 -7.2829290576307187e+01 2.6626430692545000e-02 + 47 2.9712814916723858e+01 1.1130814128544658e+01 1.8606470264519952e+01 + 48 4.4282806332005201e+01 -5.4833937036035223e+01 5.1389400027210236e+01 + 49 4.6771697948477033e+01 1.8455571203401902e+01 -1.2477601556058721e+02 + 50 -2.6644321231452984e+01 -5.1740931136776869e+00 7.4807691541007472e+01 + 51 -4.0903658168117261e+01 6.4638420809775732e-01 3.9898758153903003e+01 + 52 8.5708139487821271e+01 3.5536250810648141e+01 1.0907248432140010e+01 + 53 5.6795720706105346e-01 5.1120451123979670e+01 -3.8267761029340079e+01 + 54 2.8817288863392392e+01 1.1728833272512039e+01 -2.0355509694649257e+01 + 55 -3.0036450339938568e+01 -1.5595660232590424e+02 2.6104693634020769e+01 + 56 -2.8860892191462277e+01 2.5360623816364438e+01 -9.0130807425460702e+01 + 57 2.0692156706437775e+01 -4.1904849915008391e+01 -4.5428014503997867e+00 + 58 -7.0016913775997111e+01 8.7864273219409000e+01 -3.5308665392845271e+01 + 59 7.6914051645440694e+01 -1.2091181660611531e+01 -7.6130025933627181e+01 + 60 2.0892082588207110e+01 -1.3079129659787679e+02 5.3058938170388785e+01 + 61 1.7769749200872010e+01 1.3121356471733394e+01 5.7384601308585651e+01 + 62 5.5313319597195203e+01 -3.4038794172208739e+01 7.0301070850400492e+01 + 63 -3.3913058670666821e+01 5.5370610511161239e+01 -6.9329643126851064e+00 + 64 4.3702502689681531e+01 2.6244575734262249e+01 -4.9143572770800560e+01 +... From 1b276d3a81d51ec2d89e0965e010cece29b0c24d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 10 Jul 2026 17:24:58 -0400 Subject: [PATCH 023/100] register sph-pair and meso-pair force-style tests with ctest The new SPH and DPD-MESO test files use their own name prefixes (they have neither molecular nor plain atomic systems), so they need their own glob blocks like the spin-pair tests. --- unittest/force-styles/CMakeLists.txt | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/unittest/force-styles/CMakeLists.txt b/unittest/force-styles/CMakeLists.txt index 51aecc82d11..208ae0b46dc 100644 --- a/unittest/force-styles/CMakeLists.txt +++ b/unittest/force-styles/CMakeLists.txt @@ -157,6 +157,32 @@ foreach(TEST ${SPIN_PAIR_TESTS}) set_tests_properties(${TNAME} PROPERTIES LABELS "${TEST_TAGS}") endforeach() +file(GLOB SPH_PAIR_TESTS LIST_DIRECTORIES false CONFIGURE_DEPENDS ${TEST_INPUT_FOLDER}/sph-pair-*.yaml) +foreach(TEST ${SPH_PAIR_TESTS}) + string(REGEX REPLACE "^.*sph-pair-(.*)\.yaml" "SPHPairStyle:\\1" TNAME ${TEST}) + extract_tags(TEST_TAGS ${TEST}) + list(FIND TEST_TAGS "no${CMAKE_SYSTEM_NAME}" _SKIPME) + if(_SKIPME GREATER_EQUAL 0) + continue() + endif() + add_test(NAME ${TNAME} COMMAND test_pair_style ${TEST}) + set_tests_properties(${TNAME} PROPERTIES ENVIRONMENT "${FORCE_TEST_ENVIRONMENT}") + set_tests_properties(${TNAME} PROPERTIES LABELS "${TEST_TAGS}") +endforeach() + +file(GLOB MESO_PAIR_TESTS LIST_DIRECTORIES false CONFIGURE_DEPENDS ${TEST_INPUT_FOLDER}/meso-pair-*.yaml) +foreach(TEST ${MESO_PAIR_TESTS}) + string(REGEX REPLACE "^.*meso-pair-(.*)\.yaml" "MesoPairStyle:\\1" TNAME ${TEST}) + extract_tags(TEST_TAGS ${TEST}) + list(FIND TEST_TAGS "no${CMAKE_SYSTEM_NAME}" _SKIPME) + if(_SKIPME GREATER_EQUAL 0) + continue() + endif() + add_test(NAME ${TNAME} COMMAND test_pair_style ${TEST}) + set_tests_properties(${TNAME} PROPERTIES ENVIRONMENT "${FORCE_TEST_ENVIRONMENT}") + set_tests_properties(${TNAME} PROPERTIES LABELS "${TEST_TAGS}") +endforeach() + # bond style tester add_executable(test_bond_style test_bond_style.cpp) target_include_directories(test_bond_style PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/..") From 70b1f4a743ff54bf822cd259c216106535493c1c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 10 Jul 2026 17:28:59 -0400 Subject: [PATCH 024/100] remove "generated" tag --- unittest/force-styles/tests/angle-cosine_buck6d.yaml | 2 +- unittest/force-styles/tests/atomic-pair-agni.yaml | 2 +- unittest/force-styles/tests/bond-special.yaml | 2 +- unittest/force-styles/tests/compute-ackland_atom.yaml | 2 +- unittest/force-styles/tests/compute-adf.yaml | 2 +- unittest/force-styles/tests/compute-aggregate_atom.yaml | 2 +- unittest/force-styles/tests/compute-angle_local.yaml | 2 +- unittest/force-styles/tests/compute-angmom_chunk.yaml | 2 +- unittest/force-styles/tests/compute-basal_atom.yaml | 2 +- unittest/force-styles/tests/compute-bond_local.yaml | 2 +- unittest/force-styles/tests/compute-centro_atom.yaml | 2 +- unittest/force-styles/tests/compute-chunk_atom.yaml | 2 +- unittest/force-styles/tests/compute-chunk_spread_atom.yaml | 2 +- unittest/force-styles/tests/compute-cluster_atom.yaml | 2 +- unittest/force-styles/tests/compute-cna_atom.yaml | 2 +- unittest/force-styles/tests/compute-com.yaml | 2 +- unittest/force-styles/tests/compute-com_chunk.yaml | 2 +- unittest/force-styles/tests/compute-coord_atom.yaml | 2 +- unittest/force-styles/tests/compute-dihedral_local.yaml | 2 +- unittest/force-styles/tests/compute-dipole.yaml | 2 +- unittest/force-styles/tests/compute-dipole_chunk.yaml | 2 +- unittest/force-styles/tests/compute-displace_atom.yaml | 2 +- unittest/force-styles/tests/compute-entropy_atom.yaml | 2 +- unittest/force-styles/tests/compute-erotate_asphere.yaml | 2 +- unittest/force-styles/tests/compute-erotate_rigid.yaml | 2 +- unittest/force-styles/tests/compute-force_tally.yaml | 2 +- unittest/force-styles/tests/compute-fragment_atom.yaml | 2 +- unittest/force-styles/tests/compute-global_atom.yaml | 2 +- unittest/force-styles/tests/compute-group_group.yaml | 2 +- unittest/force-styles/tests/compute-gyration.yaml | 2 +- unittest/force-styles/tests/compute-gyration_chunk.yaml | 2 +- unittest/force-styles/tests/compute-gyration_shape.yaml | 2 +- unittest/force-styles/tests/compute-hbond_local.yaml | 2 +- unittest/force-styles/tests/compute-heat_flux_tally.yaml | 2 +- unittest/force-styles/tests/compute-hexorder_atom.yaml | 2 +- unittest/force-styles/tests/compute-improper_local.yaml | 2 +- unittest/force-styles/tests/compute-inertia_chunk.yaml | 2 +- unittest/force-styles/tests/compute-ke.yaml | 2 +- unittest/force-styles/tests/compute-ke_atom.yaml | 2 +- unittest/force-styles/tests/compute-ke_rigid.yaml | 2 +- unittest/force-styles/tests/compute-momentum.yaml | 2 +- unittest/force-styles/tests/compute-msd.yaml | 2 +- unittest/force-styles/tests/compute-msd_chunk.yaml | 2 +- unittest/force-styles/tests/compute-msd_nongauss.yaml | 2 +- unittest/force-styles/tests/compute-omega_chunk.yaml | 2 +- unittest/force-styles/tests/compute-orientorder_atom.yaml | 2 +- unittest/force-styles/tests/compute-pair.yaml | 2 +- unittest/force-styles/tests/compute-pair_local.yaml | 2 +- unittest/force-styles/tests/compute-pe.yaml | 2 +- unittest/force-styles/tests/compute-pe_mol_tally.yaml | 2 +- unittest/force-styles/tests/compute-pe_tally.yaml | 2 +- unittest/force-styles/tests/compute-pressure.yaml | 2 +- unittest/force-styles/tests/compute-property_atom.yaml | 2 +- unittest/force-styles/tests/compute-property_chunk.yaml | 2 +- unittest/force-styles/tests/compute-property_local.yaml | 2 +- unittest/force-styles/tests/compute-rdf.yaml | 2 +- unittest/force-styles/tests/compute-reduce.yaml | 2 +- unittest/force-styles/tests/compute-reduce_chunk.yaml | 2 +- unittest/force-styles/tests/compute-rigid_local.yaml | 2 +- unittest/force-styles/tests/compute-saed.yaml | 2 +- unittest/force-styles/tests/compute-slice.yaml | 2 +- unittest/force-styles/tests/compute-sna_atom.yaml | 2 +- unittest/force-styles/tests/compute-stress_cartesian.yaml | 2 +- unittest/force-styles/tests/compute-stress_mop.yaml | 2 +- unittest/force-styles/tests/compute-stress_mop_profile.yaml | 2 +- unittest/force-styles/tests/compute-stress_tally.yaml | 2 +- unittest/force-styles/tests/compute-temp.yaml | 2 +- unittest/force-styles/tests/compute-temp_asphere.yaml | 2 +- unittest/force-styles/tests/compute-temp_chunk.yaml | 2 +- unittest/force-styles/tests/compute-temp_com.yaml | 2 +- unittest/force-styles/tests/compute-temp_deform.yaml | 2 +- unittest/force-styles/tests/compute-temp_partial.yaml | 2 +- unittest/force-styles/tests/compute-temp_profile.yaml | 2 +- unittest/force-styles/tests/compute-temp_ramp.yaml | 2 +- unittest/force-styles/tests/compute-temp_region.yaml | 2 +- unittest/force-styles/tests/compute-torque_chunk.yaml | 2 +- unittest/force-styles/tests/compute-vacf.yaml | 2 +- unittest/force-styles/tests/compute-vcm_chunk.yaml | 2 +- unittest/force-styles/tests/compute-viscosity_cos.yaml | 2 +- unittest/force-styles/tests/compute-voronoi_atom.yaml | 2 +- unittest/force-styles/tests/compute-xrd.yaml | 2 +- unittest/force-styles/tests/fix-output-ave_atom.yaml | 2 +- unittest/force-styles/tests/fix-output-ave_chunk.yaml | 2 +- unittest/force-styles/tests/fix-output-ave_correlate.yaml | 2 +- unittest/force-styles/tests/fix-output-ave_histo.yaml | 2 +- unittest/force-styles/tests/fix-output-ave_histo_weight.yaml | 2 +- unittest/force-styles/tests/fix-output-ave_time.yaml | 2 +- unittest/force-styles/tests/fix-output-numdiff.yaml | 2 +- unittest/force-styles/tests/fix-output-numdiff_virial.yaml | 2 +- unittest/force-styles/tests/kspace-ewald_disp_mixgeom.yaml | 2 +- unittest/force-styles/tests/meso-pair-edpd.yaml | 2 +- unittest/force-styles/tests/meso-pair-mdpd.yaml | 2 +- unittest/force-styles/tests/meso-pair-tdpd.yaml | 2 +- unittest/force-styles/tests/min-abcfire.yaml | 2 +- unittest/force-styles/tests/min-boxrelax-aniso.yaml | 2 +- unittest/force-styles/tests/min-boxrelax-iso.yaml | 2 +- unittest/force-styles/tests/min-cg-backtrack.yaml | 2 +- unittest/force-styles/tests/min-cg-dmax.yaml | 2 +- unittest/force-styles/tests/min-cg-forcezero.yaml | 2 +- unittest/force-styles/tests/min-cg.yaml | 2 +- unittest/force-styles/tests/min-fire-verlet.yaml | 2 +- unittest/force-styles/tests/min-fire.yaml | 2 +- unittest/force-styles/tests/min-hftn.yaml | 2 +- unittest/force-styles/tests/min-quickmin.yaml | 2 +- unittest/force-styles/tests/min-sd.yaml | 2 +- unittest/force-styles/tests/mol-pair-buck6d_coul_gauss_dsf.yaml | 2 +- .../force-styles/tests/mol-pair-buck6d_coul_gauss_long.yaml | 2 +- .../tests/mol-pair-hbond_dreiding_lj_angleoffset.yaml | 2 +- .../tests/mol-pair-hbond_dreiding_morse_angleoffset.yaml | 2 +- unittest/force-styles/tests/mol-pair-lj_cut_soft_gapsys.yaml | 2 +- unittest/force-styles/tests/mol-pair-local_density.yaml | 2 +- unittest/force-styles/tests/sph-pair-heatconduction.yaml | 2 +- unittest/force-styles/tests/sph-pair-idealgas.yaml | 2 +- unittest/force-styles/tests/sph-pair-lj.yaml | 2 +- unittest/force-styles/tests/sph-pair-rhosum.yaml | 2 +- unittest/force-styles/tests/sph-pair-taitwater.yaml | 2 +- unittest/force-styles/tests/sph-pair-taitwater_morris.yaml | 2 +- 117 files changed, 117 insertions(+), 117 deletions(-) diff --git a/unittest/force-styles/tests/angle-cosine_buck6d.yaml b/unittest/force-styles/tests/angle-cosine_buck6d.yaml index b5006025550..acea132034b 100644 --- a/unittest/force-styles/tests/angle-cosine_buck6d.yaml +++ b/unittest/force-styles/tests/angle-cosine_buck6d.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Fri Jul 10 16:18:52 2026 epsilon: 2.5e-13 skip_tests: single diff --git a/unittest/force-styles/tests/atomic-pair-agni.yaml b/unittest/force-styles/tests/atomic-pair-agni.yaml index 27f1b189be2..211749260a2 100644 --- a/unittest/force-styles/tests/atomic-pair-agni.yaml +++ b/unittest/force-styles/tests/atomic-pair-agni.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Fri Jul 10 16:25:37 2026 epsilon: 0.0001 skip_tests: single diff --git a/unittest/force-styles/tests/bond-special.yaml b/unittest/force-styles/tests/bond-special.yaml index 623bfc23bf8..89238a554de 100644 --- a/unittest/force-styles/tests/bond-special.yaml +++ b/unittest/force-styles/tests/bond-special.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Fri Jul 10 16:25:36 2026 epsilon: 2.5e-13 skip_tests: diff --git a/unittest/force-styles/tests/compute-ackland_atom.yaml b/unittest/force-styles/tests/compute-ackland_atom.yaml index e8ebd4aa8cd..9182f7c09cf 100644 --- a/unittest/force-styles/tests/compute-ackland_atom.yaml +++ b/unittest/force-styles/tests/compute-ackland_atom.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:34:32 2026 epsilon: 1e-08 timestep: 0.001 diff --git a/unittest/force-styles/tests/compute-adf.yaml b/unittest/force-styles/tests/compute-adf.yaml index 9431138bc6b..31e0992b282 100644 --- a/unittest/force-styles/tests/compute-adf.yaml +++ b/unittest/force-styles/tests/compute-adf.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:37:03 2026 epsilon: 1e-08 timestep: 0.25 diff --git a/unittest/force-styles/tests/compute-aggregate_atom.yaml b/unittest/force-styles/tests/compute-aggregate_atom.yaml index 1a3b30aba8a..e2e4505ab2d 100644 --- a/unittest/force-styles/tests/compute-aggregate_atom.yaml +++ b/unittest/force-styles/tests/compute-aggregate_atom.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:34:17 2026 epsilon: 1e-08 timestep: 0.25 diff --git a/unittest/force-styles/tests/compute-angle_local.yaml b/unittest/force-styles/tests/compute-angle_local.yaml index 06ae6a7a1f8..ecc66ba9124 100644 --- a/unittest/force-styles/tests/compute-angle_local.yaml +++ b/unittest/force-styles/tests/compute-angle_local.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:21:47 2026 epsilon: 1e-08 timestep: 0.25 diff --git a/unittest/force-styles/tests/compute-angmom_chunk.yaml b/unittest/force-styles/tests/compute-angmom_chunk.yaml index b97aba31480..86f154eb575 100644 --- a/unittest/force-styles/tests/compute-angmom_chunk.yaml +++ b/unittest/force-styles/tests/compute-angmom_chunk.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:33:56 2026 epsilon: 1e-08 timestep: 0.25 diff --git a/unittest/force-styles/tests/compute-basal_atom.yaml b/unittest/force-styles/tests/compute-basal_atom.yaml index d28b16805d4..2d38299f48d 100644 --- a/unittest/force-styles/tests/compute-basal_atom.yaml +++ b/unittest/force-styles/tests/compute-basal_atom.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:34:33 2026 epsilon: 1e-08 timestep: 0.001 diff --git a/unittest/force-styles/tests/compute-bond_local.yaml b/unittest/force-styles/tests/compute-bond_local.yaml index adfb739f145..c7a2f586fdb 100644 --- a/unittest/force-styles/tests/compute-bond_local.yaml +++ b/unittest/force-styles/tests/compute-bond_local.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:21:46 2026 epsilon: 1e-08 timestep: 0.25 diff --git a/unittest/force-styles/tests/compute-centro_atom.yaml b/unittest/force-styles/tests/compute-centro_atom.yaml index ae702ef547f..56c2b1f1d3f 100644 --- a/unittest/force-styles/tests/compute-centro_atom.yaml +++ b/unittest/force-styles/tests/compute-centro_atom.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:21:49 2026 epsilon: 1e-08 timestep: 0.001 diff --git a/unittest/force-styles/tests/compute-chunk_atom.yaml b/unittest/force-styles/tests/compute-chunk_atom.yaml index d95dd53ed21..87f333d85df 100644 --- a/unittest/force-styles/tests/compute-chunk_atom.yaml +++ b/unittest/force-styles/tests/compute-chunk_atom.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:33:55 2026 epsilon: 1e-08 timestep: 0.25 diff --git a/unittest/force-styles/tests/compute-chunk_spread_atom.yaml b/unittest/force-styles/tests/compute-chunk_spread_atom.yaml index caf96ab6237..589c028785a 100644 --- a/unittest/force-styles/tests/compute-chunk_spread_atom.yaml +++ b/unittest/force-styles/tests/compute-chunk_spread_atom.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:34:03 2026 epsilon: 1e-08 timestep: 0.25 diff --git a/unittest/force-styles/tests/compute-cluster_atom.yaml b/unittest/force-styles/tests/compute-cluster_atom.yaml index a954bbb2d94..85ad451e416 100644 --- a/unittest/force-styles/tests/compute-cluster_atom.yaml +++ b/unittest/force-styles/tests/compute-cluster_atom.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:34:16 2026 epsilon: 1e-08 timestep: 0.25 diff --git a/unittest/force-styles/tests/compute-cna_atom.yaml b/unittest/force-styles/tests/compute-cna_atom.yaml index 937c63ad158..dfcc7f9fabe 100644 --- a/unittest/force-styles/tests/compute-cna_atom.yaml +++ b/unittest/force-styles/tests/compute-cna_atom.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:21:48 2026 epsilon: 1e-08 timestep: 0.001 diff --git a/unittest/force-styles/tests/compute-com.yaml b/unittest/force-styles/tests/compute-com.yaml index a3be185f5c0..4308d937199 100644 --- a/unittest/force-styles/tests/compute-com.yaml +++ b/unittest/force-styles/tests/compute-com.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:21:37 2026 epsilon: 1e-08 timestep: 0.25 diff --git a/unittest/force-styles/tests/compute-com_chunk.yaml b/unittest/force-styles/tests/compute-com_chunk.yaml index e18a3bcfae9..9305e9320d3 100644 --- a/unittest/force-styles/tests/compute-com_chunk.yaml +++ b/unittest/force-styles/tests/compute-com_chunk.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:21:42 2026 epsilon: 1e-08 timestep: 0.25 diff --git a/unittest/force-styles/tests/compute-coord_atom.yaml b/unittest/force-styles/tests/compute-coord_atom.yaml index 6e3d9d8dec3..f7259be2148 100644 --- a/unittest/force-styles/tests/compute-coord_atom.yaml +++ b/unittest/force-styles/tests/compute-coord_atom.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:21:43 2026 epsilon: 1e-08 timestep: 0.25 diff --git a/unittest/force-styles/tests/compute-dihedral_local.yaml b/unittest/force-styles/tests/compute-dihedral_local.yaml index ce89f15e32a..b237f821b47 100644 --- a/unittest/force-styles/tests/compute-dihedral_local.yaml +++ b/unittest/force-styles/tests/compute-dihedral_local.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:34:21 2026 epsilon: 1e-08 timestep: 0.25 diff --git a/unittest/force-styles/tests/compute-dipole.yaml b/unittest/force-styles/tests/compute-dipole.yaml index 14d7a1fa969..cad38c27b67 100644 --- a/unittest/force-styles/tests/compute-dipole.yaml +++ b/unittest/force-styles/tests/compute-dipole.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:21:38 2026 epsilon: 1e-08 timestep: 0.25 diff --git a/unittest/force-styles/tests/compute-dipole_chunk.yaml b/unittest/force-styles/tests/compute-dipole_chunk.yaml index 0c356aa6ad4..484121605db 100644 --- a/unittest/force-styles/tests/compute-dipole_chunk.yaml +++ b/unittest/force-styles/tests/compute-dipole_chunk.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:34:00 2026 epsilon: 1e-08 timestep: 0.25 diff --git a/unittest/force-styles/tests/compute-displace_atom.yaml b/unittest/force-styles/tests/compute-displace_atom.yaml index f3ca1c3bd95..7dfca10f674 100644 --- a/unittest/force-styles/tests/compute-displace_atom.yaml +++ b/unittest/force-styles/tests/compute-displace_atom.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:21:44 2026 epsilon: 1e-08 timestep: 0.25 diff --git a/unittest/force-styles/tests/compute-entropy_atom.yaml b/unittest/force-styles/tests/compute-entropy_atom.yaml index f239ca855e2..801ca63318f 100644 --- a/unittest/force-styles/tests/compute-entropy_atom.yaml +++ b/unittest/force-styles/tests/compute-entropy_atom.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:34:34 2026 epsilon: 1e-08 timestep: 0.001 diff --git a/unittest/force-styles/tests/compute-erotate_asphere.yaml b/unittest/force-styles/tests/compute-erotate_asphere.yaml index 6a1a1c11e91..5038a581ce2 100644 --- a/unittest/force-styles/tests/compute-erotate_asphere.yaml +++ b/unittest/force-styles/tests/compute-erotate_asphere.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:34:39 2026 epsilon: 1e-08 timestep: 0.001 diff --git a/unittest/force-styles/tests/compute-erotate_rigid.yaml b/unittest/force-styles/tests/compute-erotate_rigid.yaml index bbc75f0b3c4..1479f4aea21 100644 --- a/unittest/force-styles/tests/compute-erotate_rigid.yaml +++ b/unittest/force-styles/tests/compute-erotate_rigid.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:37:06 2026 epsilon: 1e-08 timestep: 0.25 diff --git a/unittest/force-styles/tests/compute-force_tally.yaml b/unittest/force-styles/tests/compute-force_tally.yaml index d2b4ecb47bc..c77199a8780 100644 --- a/unittest/force-styles/tests/compute-force_tally.yaml +++ b/unittest/force-styles/tests/compute-force_tally.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:34:28 2026 epsilon: 1e-08 timestep: 0.25 diff --git a/unittest/force-styles/tests/compute-fragment_atom.yaml b/unittest/force-styles/tests/compute-fragment_atom.yaml index 51422058cad..7a896d90e7f 100644 --- a/unittest/force-styles/tests/compute-fragment_atom.yaml +++ b/unittest/force-styles/tests/compute-fragment_atom.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:34:17 2026 epsilon: 1e-08 timestep: 0.25 diff --git a/unittest/force-styles/tests/compute-global_atom.yaml b/unittest/force-styles/tests/compute-global_atom.yaml index 7acc595a8f8..3fd866e70ba 100644 --- a/unittest/force-styles/tests/compute-global_atom.yaml +++ b/unittest/force-styles/tests/compute-global_atom.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:34:04 2026 epsilon: 1e-08 timestep: 0.25 diff --git a/unittest/force-styles/tests/compute-group_group.yaml b/unittest/force-styles/tests/compute-group_group.yaml index 11d486736ce..c3e202bfc2c 100644 --- a/unittest/force-styles/tests/compute-group_group.yaml +++ b/unittest/force-styles/tests/compute-group_group.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:34:12 2026 epsilon: 1e-08 timestep: 0.25 diff --git a/unittest/force-styles/tests/compute-gyration.yaml b/unittest/force-styles/tests/compute-gyration.yaml index b6efb15115a..956c20ed340 100644 --- a/unittest/force-styles/tests/compute-gyration.yaml +++ b/unittest/force-styles/tests/compute-gyration.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:21:37 2026 epsilon: 1e-08 timestep: 0.25 diff --git a/unittest/force-styles/tests/compute-gyration_chunk.yaml b/unittest/force-styles/tests/compute-gyration_chunk.yaml index cf7781815e1..372b2158566 100644 --- a/unittest/force-styles/tests/compute-gyration_chunk.yaml +++ b/unittest/force-styles/tests/compute-gyration_chunk.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:33:55 2026 epsilon: 1e-08 timestep: 0.25 diff --git a/unittest/force-styles/tests/compute-gyration_shape.yaml b/unittest/force-styles/tests/compute-gyration_shape.yaml index ce70f104033..68166095c44 100644 --- a/unittest/force-styles/tests/compute-gyration_shape.yaml +++ b/unittest/force-styles/tests/compute-gyration_shape.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:34:14 2026 epsilon: 1e-08 timestep: 0.25 diff --git a/unittest/force-styles/tests/compute-hbond_local.yaml b/unittest/force-styles/tests/compute-hbond_local.yaml index e93a9fd8fac..c6d1005964c 100644 --- a/unittest/force-styles/tests/compute-hbond_local.yaml +++ b/unittest/force-styles/tests/compute-hbond_local.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:38:50 2026 epsilon: 1e-08 timestep: 0.25 diff --git a/unittest/force-styles/tests/compute-heat_flux_tally.yaml b/unittest/force-styles/tests/compute-heat_flux_tally.yaml index 523b51b1e20..5a94a70bb9a 100644 --- a/unittest/force-styles/tests/compute-heat_flux_tally.yaml +++ b/unittest/force-styles/tests/compute-heat_flux_tally.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:34:29 2026 epsilon: 1e-08 timestep: 0.25 diff --git a/unittest/force-styles/tests/compute-hexorder_atom.yaml b/unittest/force-styles/tests/compute-hexorder_atom.yaml index 0070dd01bf1..2e304078990 100644 --- a/unittest/force-styles/tests/compute-hexorder_atom.yaml +++ b/unittest/force-styles/tests/compute-hexorder_atom.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:34:34 2026 epsilon: 1e-08 timestep: 0.001 diff --git a/unittest/force-styles/tests/compute-improper_local.yaml b/unittest/force-styles/tests/compute-improper_local.yaml index 306684fe2af..105605aba02 100644 --- a/unittest/force-styles/tests/compute-improper_local.yaml +++ b/unittest/force-styles/tests/compute-improper_local.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:34:22 2026 epsilon: 1e-08 timestep: 0.25 diff --git a/unittest/force-styles/tests/compute-inertia_chunk.yaml b/unittest/force-styles/tests/compute-inertia_chunk.yaml index 20bbce154ad..5bd9b1228e6 100644 --- a/unittest/force-styles/tests/compute-inertia_chunk.yaml +++ b/unittest/force-styles/tests/compute-inertia_chunk.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:33:59 2026 epsilon: 1e-08 timestep: 0.25 diff --git a/unittest/force-styles/tests/compute-ke.yaml b/unittest/force-styles/tests/compute-ke.yaml index 860871b2c0f..ce738d7b43e 100644 --- a/unittest/force-styles/tests/compute-ke.yaml +++ b/unittest/force-styles/tests/compute-ke.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:34:09 2026 epsilon: 1e-08 timestep: 0.25 diff --git a/unittest/force-styles/tests/compute-ke_atom.yaml b/unittest/force-styles/tests/compute-ke_atom.yaml index 41f0d7c77a6..6a564a19ab5 100644 --- a/unittest/force-styles/tests/compute-ke_atom.yaml +++ b/unittest/force-styles/tests/compute-ke_atom.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:21:44 2026 epsilon: 1e-08 timestep: 0.25 diff --git a/unittest/force-styles/tests/compute-ke_rigid.yaml b/unittest/force-styles/tests/compute-ke_rigid.yaml index 53c85385588..8a6d6433b94 100644 --- a/unittest/force-styles/tests/compute-ke_rigid.yaml +++ b/unittest/force-styles/tests/compute-ke_rigid.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:37:06 2026 epsilon: 1e-08 timestep: 0.25 diff --git a/unittest/force-styles/tests/compute-momentum.yaml b/unittest/force-styles/tests/compute-momentum.yaml index 2b426dc95e0..21431008cb1 100644 --- a/unittest/force-styles/tests/compute-momentum.yaml +++ b/unittest/force-styles/tests/compute-momentum.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:34:13 2026 epsilon: 1e-08 timestep: 0.25 diff --git a/unittest/force-styles/tests/compute-msd.yaml b/unittest/force-styles/tests/compute-msd.yaml index 75694283c5b..931c2d5939e 100644 --- a/unittest/force-styles/tests/compute-msd.yaml +++ b/unittest/force-styles/tests/compute-msd.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:21:38 2026 epsilon: 1e-08 timestep: 0.25 diff --git a/unittest/force-styles/tests/compute-msd_chunk.yaml b/unittest/force-styles/tests/compute-msd_chunk.yaml index f29c4315349..5215fab16cf 100644 --- a/unittest/force-styles/tests/compute-msd_chunk.yaml +++ b/unittest/force-styles/tests/compute-msd_chunk.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:34:01 2026 epsilon: 1e-08 timestep: 0.25 diff --git a/unittest/force-styles/tests/compute-msd_nongauss.yaml b/unittest/force-styles/tests/compute-msd_nongauss.yaml index 6e9e5ce214f..e238344f26b 100644 --- a/unittest/force-styles/tests/compute-msd_nongauss.yaml +++ b/unittest/force-styles/tests/compute-msd_nongauss.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:34:14 2026 epsilon: 1e-08 timestep: 0.25 diff --git a/unittest/force-styles/tests/compute-omega_chunk.yaml b/unittest/force-styles/tests/compute-omega_chunk.yaml index 58901b97ff8..3c0d72c8c3b 100644 --- a/unittest/force-styles/tests/compute-omega_chunk.yaml +++ b/unittest/force-styles/tests/compute-omega_chunk.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:33:58 2026 epsilon: 1e-08 timestep: 0.25 diff --git a/unittest/force-styles/tests/compute-orientorder_atom.yaml b/unittest/force-styles/tests/compute-orientorder_atom.yaml index 15ced602438..32f51ff8c85 100644 --- a/unittest/force-styles/tests/compute-orientorder_atom.yaml +++ b/unittest/force-styles/tests/compute-orientorder_atom.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:21:49 2026 epsilon: 1e-08 timestep: 0.001 diff --git a/unittest/force-styles/tests/compute-pair.yaml b/unittest/force-styles/tests/compute-pair.yaml index 720dc2a679a..1cd02ef707b 100644 --- a/unittest/force-styles/tests/compute-pair.yaml +++ b/unittest/force-styles/tests/compute-pair.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:37:02 2026 epsilon: 1e-08 timestep: 0.25 diff --git a/unittest/force-styles/tests/compute-pair_local.yaml b/unittest/force-styles/tests/compute-pair_local.yaml index a816e5780aa..96a50aa1d93 100644 --- a/unittest/force-styles/tests/compute-pair_local.yaml +++ b/unittest/force-styles/tests/compute-pair_local.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:21:48 2026 epsilon: 1e-08 timestep: 0.25 diff --git a/unittest/force-styles/tests/compute-pe.yaml b/unittest/force-styles/tests/compute-pe.yaml index 9ba91876617..d2bd2ca6d27 100644 --- a/unittest/force-styles/tests/compute-pe.yaml +++ b/unittest/force-styles/tests/compute-pe.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:34:10 2026 epsilon: 1e-08 timestep: 0.25 diff --git a/unittest/force-styles/tests/compute-pe_mol_tally.yaml b/unittest/force-styles/tests/compute-pe_mol_tally.yaml index 0c0bd02ee03..aa2d8e3999d 100644 --- a/unittest/force-styles/tests/compute-pe_mol_tally.yaml +++ b/unittest/force-styles/tests/compute-pe_mol_tally.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:34:27 2026 epsilon: 1e-08 timestep: 0.25 diff --git a/unittest/force-styles/tests/compute-pe_tally.yaml b/unittest/force-styles/tests/compute-pe_tally.yaml index 73c05ffa78f..165f29729dc 100644 --- a/unittest/force-styles/tests/compute-pe_tally.yaml +++ b/unittest/force-styles/tests/compute-pe_tally.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:34:26 2026 epsilon: 1e-08 timestep: 0.25 diff --git a/unittest/force-styles/tests/compute-pressure.yaml b/unittest/force-styles/tests/compute-pressure.yaml index ae05243d933..1bf7eb0bd9e 100644 --- a/unittest/force-styles/tests/compute-pressure.yaml +++ b/unittest/force-styles/tests/compute-pressure.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:34:11 2026 epsilon: 1e-08 timestep: 0.25 diff --git a/unittest/force-styles/tests/compute-property_atom.yaml b/unittest/force-styles/tests/compute-property_atom.yaml index 53cd964f4e9..a964d67750f 100644 --- a/unittest/force-styles/tests/compute-property_atom.yaml +++ b/unittest/force-styles/tests/compute-property_atom.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:21:45 2026 epsilon: 1e-08 timestep: 0.25 diff --git a/unittest/force-styles/tests/compute-property_chunk.yaml b/unittest/force-styles/tests/compute-property_chunk.yaml index f3b79aeb8fc..886ced62e1b 100644 --- a/unittest/force-styles/tests/compute-property_chunk.yaml +++ b/unittest/force-styles/tests/compute-property_chunk.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:37:00 2026 epsilon: 1e-08 timestep: 0.25 diff --git a/unittest/force-styles/tests/compute-property_local.yaml b/unittest/force-styles/tests/compute-property_local.yaml index d651198132a..02231c90b65 100644 --- a/unittest/force-styles/tests/compute-property_local.yaml +++ b/unittest/force-styles/tests/compute-property_local.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:21:46 2026 epsilon: 1e-08 timestep: 0.25 diff --git a/unittest/force-styles/tests/compute-rdf.yaml b/unittest/force-styles/tests/compute-rdf.yaml index 4d8a36dbedf..a52d382f611 100644 --- a/unittest/force-styles/tests/compute-rdf.yaml +++ b/unittest/force-styles/tests/compute-rdf.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:21:42 2026 epsilon: 1e-08 timestep: 0.25 diff --git a/unittest/force-styles/tests/compute-reduce.yaml b/unittest/force-styles/tests/compute-reduce.yaml index 1bae0d3feef..fb13a588bed 100644 --- a/unittest/force-styles/tests/compute-reduce.yaml +++ b/unittest/force-styles/tests/compute-reduce.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:21:40 2026 epsilon: 1e-08 timestep: 0.25 diff --git a/unittest/force-styles/tests/compute-reduce_chunk.yaml b/unittest/force-styles/tests/compute-reduce_chunk.yaml index 0fb5be7b0bb..9efe6c97cb7 100644 --- a/unittest/force-styles/tests/compute-reduce_chunk.yaml +++ b/unittest/force-styles/tests/compute-reduce_chunk.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:37:01 2026 epsilon: 1e-08 timestep: 0.25 diff --git a/unittest/force-styles/tests/compute-rigid_local.yaml b/unittest/force-styles/tests/compute-rigid_local.yaml index 1b2733587ba..9e1d7048514 100644 --- a/unittest/force-styles/tests/compute-rigid_local.yaml +++ b/unittest/force-styles/tests/compute-rigid_local.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:37:05 2026 epsilon: 1e-08 timestep: 0.25 diff --git a/unittest/force-styles/tests/compute-saed.yaml b/unittest/force-styles/tests/compute-saed.yaml index 3518187790d..697c0837f54 100644 --- a/unittest/force-styles/tests/compute-saed.yaml +++ b/unittest/force-styles/tests/compute-saed.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:37:09 2026 epsilon: 1e-08 timestep: 0.001 diff --git a/unittest/force-styles/tests/compute-slice.yaml b/unittest/force-styles/tests/compute-slice.yaml index b8f242e81eb..64c17644288 100644 --- a/unittest/force-styles/tests/compute-slice.yaml +++ b/unittest/force-styles/tests/compute-slice.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:21:40 2026 epsilon: 1e-08 timestep: 0.25 diff --git a/unittest/force-styles/tests/compute-sna_atom.yaml b/unittest/force-styles/tests/compute-sna_atom.yaml index b69bbc16bbd..6e0cceb5863 100644 --- a/unittest/force-styles/tests/compute-sna_atom.yaml +++ b/unittest/force-styles/tests/compute-sna_atom.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:37:36 2026 epsilon: 1e-08 timestep: 0.001 diff --git a/unittest/force-styles/tests/compute-stress_cartesian.yaml b/unittest/force-styles/tests/compute-stress_cartesian.yaml index 4d82373a84b..b8580fec432 100644 --- a/unittest/force-styles/tests/compute-stress_cartesian.yaml +++ b/unittest/force-styles/tests/compute-stress_cartesian.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:37:04 2026 epsilon: 1e-08 timestep: 0.25 diff --git a/unittest/force-styles/tests/compute-stress_mop.yaml b/unittest/force-styles/tests/compute-stress_mop.yaml index bffc0a6be52..8d055dcb9c2 100644 --- a/unittest/force-styles/tests/compute-stress_mop.yaml +++ b/unittest/force-styles/tests/compute-stress_mop.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:34:24 2026 epsilon: 1e-08 timestep: 0.25 diff --git a/unittest/force-styles/tests/compute-stress_mop_profile.yaml b/unittest/force-styles/tests/compute-stress_mop_profile.yaml index 31be860a3b2..8dcc98313e3 100644 --- a/unittest/force-styles/tests/compute-stress_mop_profile.yaml +++ b/unittest/force-styles/tests/compute-stress_mop_profile.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:34:25 2026 epsilon: 1e-08 timestep: 0.25 diff --git a/unittest/force-styles/tests/compute-stress_tally.yaml b/unittest/force-styles/tests/compute-stress_tally.yaml index 704c059640b..c0da935a08f 100644 --- a/unittest/force-styles/tests/compute-stress_tally.yaml +++ b/unittest/force-styles/tests/compute-stress_tally.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:34:28 2026 epsilon: 1e-08 timestep: 0.25 diff --git a/unittest/force-styles/tests/compute-temp.yaml b/unittest/force-styles/tests/compute-temp.yaml index 2decea258db..38799768504 100644 --- a/unittest/force-styles/tests/compute-temp.yaml +++ b/unittest/force-styles/tests/compute-temp.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:34:05 2026 epsilon: 1e-08 timestep: 0.25 diff --git a/unittest/force-styles/tests/compute-temp_asphere.yaml b/unittest/force-styles/tests/compute-temp_asphere.yaml index 30a8ba0f1e0..f75a63b9159 100644 --- a/unittest/force-styles/tests/compute-temp_asphere.yaml +++ b/unittest/force-styles/tests/compute-temp_asphere.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:34:38 2026 epsilon: 1e-08 timestep: 0.001 diff --git a/unittest/force-styles/tests/compute-temp_chunk.yaml b/unittest/force-styles/tests/compute-temp_chunk.yaml index 7b61aff9264..c6ea83bf245 100644 --- a/unittest/force-styles/tests/compute-temp_chunk.yaml +++ b/unittest/force-styles/tests/compute-temp_chunk.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:34:01 2026 epsilon: 1e-08 timestep: 0.25 diff --git a/unittest/force-styles/tests/compute-temp_com.yaml b/unittest/force-styles/tests/compute-temp_com.yaml index 0494a2c82b4..c48023b8cd1 100644 --- a/unittest/force-styles/tests/compute-temp_com.yaml +++ b/unittest/force-styles/tests/compute-temp_com.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:34:06 2026 epsilon: 1e-08 timestep: 0.25 diff --git a/unittest/force-styles/tests/compute-temp_deform.yaml b/unittest/force-styles/tests/compute-temp_deform.yaml index 161943d017a..4490ef4d7aa 100644 --- a/unittest/force-styles/tests/compute-temp_deform.yaml +++ b/unittest/force-styles/tests/compute-temp_deform.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:34:07 2026 epsilon: 1e-08 timestep: 0.25 diff --git a/unittest/force-styles/tests/compute-temp_partial.yaml b/unittest/force-styles/tests/compute-temp_partial.yaml index 7b689732af4..d50a6b00ae5 100644 --- a/unittest/force-styles/tests/compute-temp_partial.yaml +++ b/unittest/force-styles/tests/compute-temp_partial.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:34:06 2026 epsilon: 1e-08 timestep: 0.25 diff --git a/unittest/force-styles/tests/compute-temp_profile.yaml b/unittest/force-styles/tests/compute-temp_profile.yaml index cbc094cf2bd..76623fd99d5 100644 --- a/unittest/force-styles/tests/compute-temp_profile.yaml +++ b/unittest/force-styles/tests/compute-temp_profile.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:21:41 2026 epsilon: 1e-08 timestep: 0.25 diff --git a/unittest/force-styles/tests/compute-temp_ramp.yaml b/unittest/force-styles/tests/compute-temp_ramp.yaml index 096dcdcd084..7c7ca1418c0 100644 --- a/unittest/force-styles/tests/compute-temp_ramp.yaml +++ b/unittest/force-styles/tests/compute-temp_ramp.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:34:08 2026 epsilon: 1e-08 timestep: 0.25 diff --git a/unittest/force-styles/tests/compute-temp_region.yaml b/unittest/force-styles/tests/compute-temp_region.yaml index f2439640906..9650e115a90 100644 --- a/unittest/force-styles/tests/compute-temp_region.yaml +++ b/unittest/force-styles/tests/compute-temp_region.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:34:09 2026 epsilon: 1e-08 timestep: 0.25 diff --git a/unittest/force-styles/tests/compute-torque_chunk.yaml b/unittest/force-styles/tests/compute-torque_chunk.yaml index 5279c94b945..3d2ed6514b0 100644 --- a/unittest/force-styles/tests/compute-torque_chunk.yaml +++ b/unittest/force-styles/tests/compute-torque_chunk.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:33:57 2026 epsilon: 1e-08 timestep: 0.25 diff --git a/unittest/force-styles/tests/compute-vacf.yaml b/unittest/force-styles/tests/compute-vacf.yaml index 8b3c0341a85..c959b534ce7 100644 --- a/unittest/force-styles/tests/compute-vacf.yaml +++ b/unittest/force-styles/tests/compute-vacf.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:21:39 2026 epsilon: 1e-08 timestep: 0.25 diff --git a/unittest/force-styles/tests/compute-vcm_chunk.yaml b/unittest/force-styles/tests/compute-vcm_chunk.yaml index 4ca0163dbaf..400c651949d 100644 --- a/unittest/force-styles/tests/compute-vcm_chunk.yaml +++ b/unittest/force-styles/tests/compute-vcm_chunk.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:33:58 2026 epsilon: 1e-08 timestep: 0.25 diff --git a/unittest/force-styles/tests/compute-viscosity_cos.yaml b/unittest/force-styles/tests/compute-viscosity_cos.yaml index 0e980e108ce..2d4600402fa 100644 --- a/unittest/force-styles/tests/compute-viscosity_cos.yaml +++ b/unittest/force-styles/tests/compute-viscosity_cos.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:34:15 2026 epsilon: 1e-08 timestep: 0.25 diff --git a/unittest/force-styles/tests/compute-voronoi_atom.yaml b/unittest/force-styles/tests/compute-voronoi_atom.yaml index 7c4f3868b96..68ff50b721a 100644 --- a/unittest/force-styles/tests/compute-voronoi_atom.yaml +++ b/unittest/force-styles/tests/compute-voronoi_atom.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:34:36 2026 epsilon: 1e-08 timestep: 0.001 diff --git a/unittest/force-styles/tests/compute-xrd.yaml b/unittest/force-styles/tests/compute-xrd.yaml index 68fa8c68465..0addd70786e 100644 --- a/unittest/force-styles/tests/compute-xrd.yaml +++ b/unittest/force-styles/tests/compute-xrd.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:37:08 2026 epsilon: 1e-08 timestep: 0.001 diff --git a/unittest/force-styles/tests/fix-output-ave_atom.yaml b/unittest/force-styles/tests/fix-output-ave_atom.yaml index f1230f89901..5edaaccac97 100644 --- a/unittest/force-styles/tests/fix-output-ave_atom.yaml +++ b/unittest/force-styles/tests/fix-output-ave_atom.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:21:51 2026 epsilon: 1e-08 timestep: 0.25 diff --git a/unittest/force-styles/tests/fix-output-ave_chunk.yaml b/unittest/force-styles/tests/fix-output-ave_chunk.yaml index 38fec86a58f..068d7296d1c 100644 --- a/unittest/force-styles/tests/fix-output-ave_chunk.yaml +++ b/unittest/force-styles/tests/fix-output-ave_chunk.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:37:09 2026 epsilon: 1e-08 timestep: 0.25 diff --git a/unittest/force-styles/tests/fix-output-ave_correlate.yaml b/unittest/force-styles/tests/fix-output-ave_correlate.yaml index 1733d55b8c7..84d653ed816 100644 --- a/unittest/force-styles/tests/fix-output-ave_correlate.yaml +++ b/unittest/force-styles/tests/fix-output-ave_correlate.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:34:42 2026 epsilon: 1e-08 timestep: 0.25 diff --git a/unittest/force-styles/tests/fix-output-ave_histo.yaml b/unittest/force-styles/tests/fix-output-ave_histo.yaml index e2bb1e82fdb..affebf530c5 100644 --- a/unittest/force-styles/tests/fix-output-ave_histo.yaml +++ b/unittest/force-styles/tests/fix-output-ave_histo.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:34:40 2026 epsilon: 1e-08 timestep: 0.25 diff --git a/unittest/force-styles/tests/fix-output-ave_histo_weight.yaml b/unittest/force-styles/tests/fix-output-ave_histo_weight.yaml index fe24e81abcb..e65fcf48d8d 100644 --- a/unittest/force-styles/tests/fix-output-ave_histo_weight.yaml +++ b/unittest/force-styles/tests/fix-output-ave_histo_weight.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:34:41 2026 epsilon: 1e-08 timestep: 0.25 diff --git a/unittest/force-styles/tests/fix-output-ave_time.yaml b/unittest/force-styles/tests/fix-output-ave_time.yaml index 465f0e10658..6ca9f1fc448 100644 --- a/unittest/force-styles/tests/fix-output-ave_time.yaml +++ b/unittest/force-styles/tests/fix-output-ave_time.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:21:50 2026 epsilon: 1e-08 timestep: 0.25 diff --git a/unittest/force-styles/tests/fix-output-numdiff.yaml b/unittest/force-styles/tests/fix-output-numdiff.yaml index 6561cee0956..7fc70efed86 100644 --- a/unittest/force-styles/tests/fix-output-numdiff.yaml +++ b/unittest/force-styles/tests/fix-output-numdiff.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:34:42 2026 epsilon: 1e-08 timestep: 0.25 diff --git a/unittest/force-styles/tests/fix-output-numdiff_virial.yaml b/unittest/force-styles/tests/fix-output-numdiff_virial.yaml index cf11bf43fa6..e05b7e5fc07 100644 --- a/unittest/force-styles/tests/fix-output-numdiff_virial.yaml +++ b/unittest/force-styles/tests/fix-output-numdiff_virial.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 16:34:43 2026 epsilon: 1e-08 timestep: 0.25 diff --git a/unittest/force-styles/tests/kspace-ewald_disp_mixgeom.yaml b/unittest/force-styles/tests/kspace-ewald_disp_mixgeom.yaml index 8df408a0e49..81e5c4cc41b 100644 --- a/unittest/force-styles/tests/kspace-ewald_disp_mixgeom.yaml +++ b/unittest/force-styles/tests/kspace-ewald_disp_mixgeom.yaml @@ -1,6 +1,6 @@ --- lammps_version: 30 Mar 2026 -tags: generated +tags: date_generated: Tue Jun 30 16:11:28 2026 epsilon: 5e-12 skip_tests: extract gpu single diff --git a/unittest/force-styles/tests/meso-pair-edpd.yaml b/unittest/force-styles/tests/meso-pair-edpd.yaml index 04671d307a1..ac327f36e9c 100644 --- a/unittest/force-styles/tests/meso-pair-edpd.yaml +++ b/unittest/force-styles/tests/meso-pair-edpd.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Fri Jul 10 17:20:51 2026 epsilon: 6e-12 skip_tests: single diff --git a/unittest/force-styles/tests/meso-pair-mdpd.yaml b/unittest/force-styles/tests/meso-pair-mdpd.yaml index 581c222b4ff..088147f78dc 100644 --- a/unittest/force-styles/tests/meso-pair-mdpd.yaml +++ b/unittest/force-styles/tests/meso-pair-mdpd.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Fri Jul 10 17:19:09 2026 epsilon: 6e-12 skip_tests: single diff --git a/unittest/force-styles/tests/meso-pair-tdpd.yaml b/unittest/force-styles/tests/meso-pair-tdpd.yaml index 84132bc44fe..48051ead31b 100644 --- a/unittest/force-styles/tests/meso-pair-tdpd.yaml +++ b/unittest/force-styles/tests/meso-pair-tdpd.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Fri Jul 10 17:19:10 2026 epsilon: 6e-12 skip_tests: single diff --git a/unittest/force-styles/tests/min-abcfire.yaml b/unittest/force-styles/tests/min-abcfire.yaml index 718ac0a6296..d336bda3966 100644 --- a/unittest/force-styles/tests/min-abcfire.yaml +++ b/unittest/force-styles/tests/min-abcfire.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 18:25:57 2026 epsilon: 0.001 skip_tests: diff --git a/unittest/force-styles/tests/min-boxrelax-aniso.yaml b/unittest/force-styles/tests/min-boxrelax-aniso.yaml index 55c867d9399..b2b97e3c255 100644 --- a/unittest/force-styles/tests/min-boxrelax-aniso.yaml +++ b/unittest/force-styles/tests/min-boxrelax-aniso.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 18:25:58 2026 epsilon: 0.001 skip_tests: diff --git a/unittest/force-styles/tests/min-boxrelax-iso.yaml b/unittest/force-styles/tests/min-boxrelax-iso.yaml index f3c4181cd59..e32db0ac36a 100644 --- a/unittest/force-styles/tests/min-boxrelax-iso.yaml +++ b/unittest/force-styles/tests/min-boxrelax-iso.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 18:25:58 2026 epsilon: 0.001 skip_tests: diff --git a/unittest/force-styles/tests/min-cg-backtrack.yaml b/unittest/force-styles/tests/min-cg-backtrack.yaml index b4228de731d..55c60f15ba5 100644 --- a/unittest/force-styles/tests/min-cg-backtrack.yaml +++ b/unittest/force-styles/tests/min-cg-backtrack.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 18:25:59 2026 epsilon: 0.001 skip_tests: diff --git a/unittest/force-styles/tests/min-cg-dmax.yaml b/unittest/force-styles/tests/min-cg-dmax.yaml index e0bdf7ef171..9d660e2219c 100644 --- a/unittest/force-styles/tests/min-cg-dmax.yaml +++ b/unittest/force-styles/tests/min-cg-dmax.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 18:26:00 2026 epsilon: 0.001 skip_tests: diff --git a/unittest/force-styles/tests/min-cg-forcezero.yaml b/unittest/force-styles/tests/min-cg-forcezero.yaml index d1a039936d3..46ddd077753 100644 --- a/unittest/force-styles/tests/min-cg-forcezero.yaml +++ b/unittest/force-styles/tests/min-cg-forcezero.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 18:26:00 2026 epsilon: 0.001 skip_tests: diff --git a/unittest/force-styles/tests/min-cg.yaml b/unittest/force-styles/tests/min-cg.yaml index 0630a91fc85..6241f58743e 100644 --- a/unittest/force-styles/tests/min-cg.yaml +++ b/unittest/force-styles/tests/min-cg.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 18:26:01 2026 epsilon: 0.001 skip_tests: diff --git a/unittest/force-styles/tests/min-fire-verlet.yaml b/unittest/force-styles/tests/min-fire-verlet.yaml index 765063bc243..81379799b8b 100644 --- a/unittest/force-styles/tests/min-fire-verlet.yaml +++ b/unittest/force-styles/tests/min-fire-verlet.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 18:26:02 2026 epsilon: 0.001 skip_tests: diff --git a/unittest/force-styles/tests/min-fire.yaml b/unittest/force-styles/tests/min-fire.yaml index 2609c42e3f1..d59c438eb65 100644 --- a/unittest/force-styles/tests/min-fire.yaml +++ b/unittest/force-styles/tests/min-fire.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 18:27:24 2026 epsilon: 0.001 skip_tests: diff --git a/unittest/force-styles/tests/min-hftn.yaml b/unittest/force-styles/tests/min-hftn.yaml index ca3b27f670b..bec563c62bd 100644 --- a/unittest/force-styles/tests/min-hftn.yaml +++ b/unittest/force-styles/tests/min-hftn.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 18:26:03 2026 epsilon: 0.001 skip_tests: diff --git a/unittest/force-styles/tests/min-quickmin.yaml b/unittest/force-styles/tests/min-quickmin.yaml index d2569b94703..2768ac7cb55 100644 --- a/unittest/force-styles/tests/min-quickmin.yaml +++ b/unittest/force-styles/tests/min-quickmin.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 18:26:04 2026 epsilon: 0.001 skip_tests: diff --git a/unittest/force-styles/tests/min-sd.yaml b/unittest/force-styles/tests/min-sd.yaml index dd864b319b4..1ec9c1cbde8 100644 --- a/unittest/force-styles/tests/min-sd.yaml +++ b/unittest/force-styles/tests/min-sd.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Thu Jul 9 18:26:05 2026 epsilon: 0.001 skip_tests: diff --git a/unittest/force-styles/tests/mol-pair-buck6d_coul_gauss_dsf.yaml b/unittest/force-styles/tests/mol-pair-buck6d_coul_gauss_dsf.yaml index 32a6b12da3f..ed2b6b9fa36 100644 --- a/unittest/force-styles/tests/mol-pair-buck6d_coul_gauss_dsf.yaml +++ b/unittest/force-styles/tests/mol-pair-buck6d_coul_gauss_dsf.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Fri Jul 10 15:59:46 2026 epsilon: 2.5e-13 skip_tests: diff --git a/unittest/force-styles/tests/mol-pair-buck6d_coul_gauss_long.yaml b/unittest/force-styles/tests/mol-pair-buck6d_coul_gauss_long.yaml index bd6abd76c5b..2d153453f62 100644 --- a/unittest/force-styles/tests/mol-pair-buck6d_coul_gauss_long.yaml +++ b/unittest/force-styles/tests/mol-pair-buck6d_coul_gauss_long.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Fri Jul 10 15:59:48 2026 epsilon: 5e-12 skip_tests: diff --git a/unittest/force-styles/tests/mol-pair-hbond_dreiding_lj_angleoffset.yaml b/unittest/force-styles/tests/mol-pair-hbond_dreiding_lj_angleoffset.yaml index bef26297367..6a45506844c 100644 --- a/unittest/force-styles/tests/mol-pair-hbond_dreiding_lj_angleoffset.yaml +++ b/unittest/force-styles/tests/mol-pair-hbond_dreiding_lj_angleoffset.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Fri Jul 10 15:57:00 2026 epsilon: 1e-12 skip_tests: single diff --git a/unittest/force-styles/tests/mol-pair-hbond_dreiding_morse_angleoffset.yaml b/unittest/force-styles/tests/mol-pair-hbond_dreiding_morse_angleoffset.yaml index 5b1b48234ec..5564fbf228c 100644 --- a/unittest/force-styles/tests/mol-pair-hbond_dreiding_morse_angleoffset.yaml +++ b/unittest/force-styles/tests/mol-pair-hbond_dreiding_morse_angleoffset.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Fri Jul 10 15:57:01 2026 epsilon: 1e-12 skip_tests: single diff --git a/unittest/force-styles/tests/mol-pair-lj_cut_soft_gapsys.yaml b/unittest/force-styles/tests/mol-pair-lj_cut_soft_gapsys.yaml index 9a7de53c57f..cf7b7bdc757 100644 --- a/unittest/force-styles/tests/mol-pair-lj_cut_soft_gapsys.yaml +++ b/unittest/force-styles/tests/mol-pair-lj_cut_soft_gapsys.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Fri Jul 10 15:55:01 2026 epsilon: 7.5e-14 skip_tests: diff --git a/unittest/force-styles/tests/mol-pair-local_density.yaml b/unittest/force-styles/tests/mol-pair-local_density.yaml index 9d89f0b14f3..bf4965d49d1 100644 --- a/unittest/force-styles/tests/mol-pair-local_density.yaml +++ b/unittest/force-styles/tests/mol-pair-local_density.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Fri Jul 10 16:24:41 2026 epsilon: 5e-14 skip_tests: diff --git a/unittest/force-styles/tests/sph-pair-heatconduction.yaml b/unittest/force-styles/tests/sph-pair-heatconduction.yaml index f586f40a7a2..3986c5ac1f2 100644 --- a/unittest/force-styles/tests/sph-pair-heatconduction.yaml +++ b/unittest/force-styles/tests/sph-pair-heatconduction.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Fri Jul 10 17:05:33 2026 epsilon: 6e-12 skip_tests: single diff --git a/unittest/force-styles/tests/sph-pair-idealgas.yaml b/unittest/force-styles/tests/sph-pair-idealgas.yaml index bd013354c6f..1cd4afe0853 100644 --- a/unittest/force-styles/tests/sph-pair-idealgas.yaml +++ b/unittest/force-styles/tests/sph-pair-idealgas.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Fri Jul 10 17:05:34 2026 epsilon: 5e-09 skip_tests: single diff --git a/unittest/force-styles/tests/sph-pair-lj.yaml b/unittest/force-styles/tests/sph-pair-lj.yaml index 453513c55f8..085190164b2 100644 --- a/unittest/force-styles/tests/sph-pair-lj.yaml +++ b/unittest/force-styles/tests/sph-pair-lj.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Fri Jul 10 17:05:35 2026 epsilon: 5e-09 skip_tests: single diff --git a/unittest/force-styles/tests/sph-pair-rhosum.yaml b/unittest/force-styles/tests/sph-pair-rhosum.yaml index 21227cbb08a..90a75d81635 100644 --- a/unittest/force-styles/tests/sph-pair-rhosum.yaml +++ b/unittest/force-styles/tests/sph-pair-rhosum.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Fri Jul 10 17:05:55 2026 epsilon: 6e-12 skip_tests: single diff --git a/unittest/force-styles/tests/sph-pair-taitwater.yaml b/unittest/force-styles/tests/sph-pair-taitwater.yaml index 9f0e7d3f682..1fe9721560a 100644 --- a/unittest/force-styles/tests/sph-pair-taitwater.yaml +++ b/unittest/force-styles/tests/sph-pair-taitwater.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Fri Jul 10 17:05:38 2026 epsilon: 5e-09 skip_tests: single diff --git a/unittest/force-styles/tests/sph-pair-taitwater_morris.yaml b/unittest/force-styles/tests/sph-pair-taitwater_morris.yaml index b5d8930d176..51034d1faab 100644 --- a/unittest/force-styles/tests/sph-pair-taitwater_morris.yaml +++ b/unittest/force-styles/tests/sph-pair-taitwater_morris.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: generated +tags: date_generated: Fri Jul 10 17:05:39 2026 epsilon: 5e-09 skip_tests: single From a8275d386d00ca5d9c5c01e57de2e2ad1fdc44a6 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 10 Jul 2026 17:34:52 -0400 Subject: [PATCH 025/100] pair style agni is not testable --- .../force-styles/tests/atomic-pair-agni.yaml | 92 ------------------- 1 file changed, 92 deletions(-) delete mode 100644 unittest/force-styles/tests/atomic-pair-agni.yaml diff --git a/unittest/force-styles/tests/atomic-pair-agni.yaml b/unittest/force-styles/tests/atomic-pair-agni.yaml deleted file mode 100644 index 211749260a2..00000000000 --- a/unittest/force-styles/tests/atomic-pair-agni.yaml +++ /dev/null @@ -1,92 +0,0 @@ ---- -lammps_version: 4 Jul 2026 -tags: -date_generated: Fri Jul 10 16:25:37 2026 -epsilon: 0.0001 -skip_tests: single -prerequisites: | - pair agni -pre_commands: | - variable units index metal -post_commands: "" -input_file: in.metal -pair_style: agni -pair_coeff: | - * * Al_jpc.agni Al Al -extract: "" -natoms: 32 -init_vdwl: 0 -init_coul: 0 -init_stress: |- - -1.8854620788959409e+01 1.9789357976264416e+01 -4.8623788052724040e+00 -1.0868033654703877e+01 -6.7674035901249878e+00 1.4879961878427126e+01 -init_forces: |2 - 1 9.3618459354736672e-01 2.4603716713155137e+00 4.7313203949131832e-01 - 2 -9.1156710584066047e-01 -3.3779398109053744e+00 2.0153991590032803e+00 - 3 -1.2782181118836178e+00 6.9523937591130363e+00 -1.7132259886001719e+00 - 4 8.1078545104362831e-01 -3.9208052859059705e-01 -2.3893235846643819e+00 - 5 1.7285269639233576e+00 5.2297067596355902e+00 1.7589511303941237e+00 - 6 1.6503447769919859e+00 1.4150855541939364e+00 -1.9404822208336725e-01 - 7 -2.3239877511968388e+00 3.3246209873596655e+00 -4.2340723883710041e-01 - 8 -2.7494302642752899e+00 -2.5595540105586423e+00 1.5907585761288630e+00 - 9 4.4332881278940306e-01 -2.2435643262451066e+00 -1.1816100300510897e+00 - 10 -7.8654228702536955e-01 -5.0580824705993308e+00 -4.3891652002220525e+00 - 11 -1.7623700936546101e+00 -2.0324216903408541e+00 1.7737367032805906e+00 - 12 1.0106671658123361e+00 -3.2280329260265006e+00 -4.3781178932405851e-02 - 13 -6.8130914487294092e-01 1.2320261765981542e+00 -1.8802174673636927e+00 - 14 2.2601343133265601e+00 -6.3968538578949108e-01 2.5275911354238616e+00 - 15 -1.4081235965003742e+00 1.3569916235993134e+00 -1.1645260387321485e+00 - 16 4.3130282434413658e+00 -3.5948938549717440e+00 1.4997650674323069e+00 - 17 1.7500512535462605e+00 5.0320219910482393e+00 1.1776421319343910e-01 - 18 -5.2426535505091323e+00 -1.1918485396762861e+00 -2.5791147564759029e+00 - 19 -5.5181614271586312e+00 -2.8052053050359262e+00 1.5102303066069709e+00 - 20 1.0785985766688810e+00 9.0248115554102526e-01 -1.4704780009796394e+00 - 21 6.1527838875318395e+00 1.7175993407855259e+00 2.9815543263801203e-01 - 22 -1.5350133109606645e-02 -3.5076941726019157e+00 -4.4027168855420484e-01 - 23 1.3513791785354243e+00 4.2477437565813290e+00 -3.1473533165862335e+00 - 24 4.4376156945491658e+00 3.4150916944036709e+00 3.1324803485313879e+00 - 25 2.8086230969766603e+00 5.0271523564704523e-01 -1.8710944586654676e+00 - 26 -1.6617850064521207e+00 -5.4018753589352144e+00 4.6805741918052064e+00 - 27 1.6052841787005292e+00 -2.9521577920533559e-02 9.3085312355540850e-02 - 28 4.2325129460193978e-01 2.2234266950527655e+00 2.8091236577148067e+00 - 29 1.5149486950377451e+00 3.9790610774198996e+00 -1.3942907929769888e-01 - 30 -1.7916570761462225e+00 -1.2217545713519229e+00 -3.0993559983780159e+00 - 31 -8.9941449083737268e-01 -4.3793637742509617e+00 2.8233702015841828e+00 - 32 -7.0471410536428465e+00 -2.0685437246446980e+00 -8.2096390325925483e-01 -run_vdwl: 0 -run_coul: 0 -run_stress: |- - -1.8821013768869484e+01 1.9768144126031228e+01 -4.8490384538941145e+00 -1.0835025038587258e+01 -6.7450920092936606e+00 1.4845109787665391e+01 -run_forces: |2 - 1 9.2460177939035759e-01 2.4575137999618875e+00 4.7086070857592688e-01 - 2 -9.1268363122246399e-01 -3.3767110220377816e+00 2.0150840860570298e+00 - 3 -1.2792225991596951e+00 6.9398032688314544e+00 -1.7180026312579884e+00 - 4 8.1283292367704973e-01 -3.9032877415768041e-01 -2.3873466308449878e+00 - 5 1.7273213798890339e+00 5.2225338398257719e+00 1.7616755460167752e+00 - 6 1.6518665320018755e+00 1.4132072693447100e+00 -1.9739469878724947e-01 - 7 -2.3253806623851432e+00 3.3289219197595941e+00 -4.2832128603360786e-01 - 8 -2.7536036120017542e+00 -2.5604746126791014e+00 1.5914844014460670e+00 - 9 4.4752664684899912e-01 -2.2481412262877001e+00 -1.1854446101223601e+00 - 10 -7.7683512021205559e-01 -5.0531995509972347e+00 -4.3784692314674629e+00 - 11 -1.7609950573404802e+00 -2.0356878246401919e+00 1.7700074129516707e+00 - 12 1.0145715401286708e+00 -3.2255370141228212e+00 -4.3637407872594736e-02 - 13 -6.8393876955262556e-01 1.2286248990113364e+00 -1.8766679139097704e+00 - 14 2.2627492324227916e+00 -6.2806576297036543e-01 2.5217027525196301e+00 - 15 -1.4065024991740955e+00 1.3574115876818524e+00 -1.1617488385399355e+00 - 16 4.2993622795457469e+00 -3.5909876496752275e+00 1.4957998172158824e+00 - 17 1.7527297130564676e+00 5.0294175977597462e+00 1.2030866562970743e-01 - 18 -5.2409666235779895e+00 -1.1881294054200424e+00 -2.5811041024734749e+00 - 19 -5.5138442953338398e+00 -2.8050598855351581e+00 1.5054534460196720e+00 - 20 1.0754458998108731e+00 9.0415975086041556e-01 -1.4700619931553973e+00 - 21 6.1503873859310971e+00 1.7102959054301010e+00 3.0005486689158545e-01 - 22 -1.1385427716888330e-02 -3.5031798043509497e+00 -4.3680939816287889e-01 - 23 1.3590824120456801e+00 4.2487040339747892e+00 -3.1376682584395184e+00 - 24 4.4345541354978906e+00 3.4134729328344093e+00 3.1339522489125358e+00 - 25 2.8090124317223655e+00 5.0377344905980692e-01 -1.8708657360856904e+00 - 26 -1.6559839238633884e+00 -5.3935587014292850e+00 4.6788608106563316e+00 - 27 1.6060301969537960e+00 -2.8201967406786821e-02 8.8261943381510832e-02 - 28 4.2311222392716274e-01 2.2251151744986402e+00 2.8076035334507452e+00 - 29 1.5105838189611660e+00 3.9777799044514524e+00 -1.3397919379524126e-01 - 30 -1.7904294635390414e+00 -1.2208591726829781e+00 -3.0963675369729771e+00 - 31 -9.0336178701720371e-01 -4.3807751302828564e+00 2.8217522269824968e+00 - 32 -7.0488397301395906e+00 -2.0727502451499475e+00 -8.2232423305860891e-01 -... From 42a0a5ef8dc298648fb0cb87ff970b12b59e4886 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 10 Jul 2026 18:00:23 -0400 Subject: [PATCH 026/100] document the purpose of the generated tag in new force-style test files The test generators mark newly written YAML files with a "generated" tag so unreviewed reference data is easy to find with grep. Document that the tag is to be removed as the last step after review and validation. --- .github/instructions/force-style-tests.instructions.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/instructions/force-style-tests.instructions.md b/.github/instructions/force-style-tests.instructions.md index 12a4fbb8500..6004b5b2d96 100644 --- a/.github/instructions/force-style-tests.instructions.md +++ b/.github/instructions/force-style-tests.instructions.md @@ -41,3 +41,8 @@ Unit tests are CTest-based; build with `-D ENABLE_TESTING=on`, run with reference data with `-g`/`-u`, then re-run CMake so new files register with CTest. - Verify new force styles against numerical differentiation (`fix numdiff`) where possible; see `.github/dev-docs/testing-and-verification.md`. +- The generators add a `generated` entry to the `tags:` line of newly written + files on purpose: it marks reference data that has not been reviewed yet and + makes such files easy to find with grep. Remove the tag as the LAST step, + after the reference data has been reviewed and validated -- never leave it in + a file you commit as finished work. From 8fc5ff8243c67b3086c2c6355e9d06bf78ecf74c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 10 Jul 2026 19:47:05 -0400 Subject: [PATCH 027/100] fix GPU memory fault in pair style edpd/gpu without power/kappa tables The device buffers for the optional power and kappa correction tables were only allocated when those keywords were used, so the kernel received null device pointers as arguments and any run without the keywords aborted with a GPU memory access fault. Allocate a minimal dummy buffer instead. Also skip the gpu (and other accelerator) runs of the edpd test: the GPU port generates its random numbers on the device and cannot reproduce the CPU RanMars stream, like the other dpd styles. Found by running the new meso-pair-edpd.yaml test on a GPU build. --- lib/gpu/lal_edpd.cpp | 6 ++++++ unittest/force-styles/tests/meso-pair-edpd.yaml | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/gpu/lal_edpd.cpp b/lib/gpu/lal_edpd.cpp index c03591b9ed5..a8eb14549e5 100644 --- a/lib/gpu/lal_edpd.cpp +++ b/lib/gpu/lal_edpd.cpp @@ -123,6 +123,10 @@ int EDPDT::init(const int ntypes, n++; } ucl_copy(sc,dview,false); + } else { + // never leave the buffer unallocated: a null device pointer as a + // kernel argument causes a GPU memory fault even when unused + sc.alloc(1,*(this->ucl_device),UCL_READ_ONLY); } if (host_kc) { @@ -138,6 +142,8 @@ int EDPDT::init(const int ntypes, n++; } ucl_copy(kc,dview,false); + } else { + kc.alloc(1,*(this->ucl_device),UCL_READ_ONLY); } UCL_H_Vec host_rsq(lj_types*lj_types,*(this->ucl_device), diff --git a/unittest/force-styles/tests/meso-pair-edpd.yaml b/unittest/force-styles/tests/meso-pair-edpd.yaml index ac327f36e9c..dd4f5044ea8 100644 --- a/unittest/force-styles/tests/meso-pair-edpd.yaml +++ b/unittest/force-styles/tests/meso-pair-edpd.yaml @@ -3,7 +3,7 @@ lammps_version: 4 Jul 2026 tags: date_generated: Fri Jul 10 17:20:51 2026 epsilon: 6e-12 -skip_tests: single +skip_tests: gpu intel kokkos_omp kokkos_serial kokkos_gpu single prerequisites: | atom edpd pair edpd From 51483c79ec849eafd79f4fb18bbdb25548a9665c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 10 Jul 2026 19:48:34 -0400 Subject: [PATCH 028/100] skip accelerator runs of the mdpd test Like edpd and the other dpd styles, the GPU port of mdpd generates its random numbers on the device and cannot reproduce the CPU RanMars stream. The hybrid/overlay setup still runs the gpu test since only the mdpd substyle gets suffixed. --- unittest/force-styles/tests/meso-pair-mdpd.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unittest/force-styles/tests/meso-pair-mdpd.yaml b/unittest/force-styles/tests/meso-pair-mdpd.yaml index 088147f78dc..52048da8847 100644 --- a/unittest/force-styles/tests/meso-pair-mdpd.yaml +++ b/unittest/force-styles/tests/meso-pair-mdpd.yaml @@ -3,7 +3,7 @@ lammps_version: 4 Jul 2026 tags: date_generated: Fri Jul 10 17:19:09 2026 epsilon: 6e-12 -skip_tests: single +skip_tests: gpu intel kokkos_omp kokkos_serial kokkos_gpu single prerequisites: | atom mdpd pair mdpd From 4e37dd0a33453180e03d48110a64dfca39562848 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 10 Jul 2026 20:36:59 -0400 Subject: [PATCH 029/100] remove mDPD test altogether --- .../force-styles/tests/meso-pair-mdpd.yaml | 164 ------------------ 1 file changed, 164 deletions(-) delete mode 100644 unittest/force-styles/tests/meso-pair-mdpd.yaml diff --git a/unittest/force-styles/tests/meso-pair-mdpd.yaml b/unittest/force-styles/tests/meso-pair-mdpd.yaml deleted file mode 100644 index 52048da8847..00000000000 --- a/unittest/force-styles/tests/meso-pair-mdpd.yaml +++ /dev/null @@ -1,164 +0,0 @@ ---- -lammps_version: 4 Jul 2026 -tags: -date_generated: Fri Jul 10 17:19:09 2026 -epsilon: 6e-12 -skip_tests: gpu intel kokkos_omp kokkos_serial kokkos_gpu single -prerequisites: | - atom mdpd - pair mdpd - pair mdpd/rhosum -pre_commands: | - variable units delete - variable units index lj - variable newton_pair delete - variable newton_pair index on -post_commands: "" -input_file: in.mdpd -pair_style: hybrid/overlay mdpd/rhosum mdpd 1.0 1.0 65689 -pair_coeff: | - * * mdpd/rhosum 0.75 - 1 1 mdpd -40.0 25.0 4.5 1.0 0.75 - 1 2 mdpd -35.0 20.0 4.5 1.0 0.75 - 2 2 mdpd -30.0 25.0 4.5 1.0 0.75 -extract: "" -natoms: 64 -init_vdwl: -0.12186369438262681 -init_coul: 0 -init_stress: |2- - 1.0703037370846122e-01 -3.3093868611249455e+00 -2.9172567872939403e+00 1.2014689516036461e-01 1.4383726071586812e-02 -2.2025819035433139e-01 -init_forces: |2 - 1 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 2 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 3 -2.2452795815693065e+00 2.5755073507111509e-01 -8.4677090539321431e-02 - 4 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 5 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 6 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 7 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 8 1.2331636111896322e+00 -7.4296820509545405e-02 -7.0017648670634078e-03 - 9 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 10 -1.9008241275992415e-03 -2.8662073501171031e-01 -8.1071155313184613e-03 - 11 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 12 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 13 -2.2227756802017636e-03 -9.2234520711770686e-04 -2.9419497173717717e-02 - 14 1.9008241275992415e-03 2.8662073501171031e-01 8.1071155313184613e-03 - 15 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 16 1.1772168199437314e+00 -6.9403122582863741e-02 1.1879606038269866e-01 - 17 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 18 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 19 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 20 1.0133808466493120e-01 -2.0364335992830407e+00 8.0060415089588721e-02 - 21 1.0632920841851494e-01 6.2106483208936428e-02 7.6217164462029419e-01 - 22 -1.0632920841851494e-01 -6.2106483208936428e-02 -7.6217164462029419e-01 - 23 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 24 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 25 -9.2309837096039543e-02 2.9960858863693731e-02 1.6439536448915946e+00 - 26 1.9250778903854449e-01 1.5608019833108080e+00 -1.4325965380035155e+00 - 27 -1.4018488585352613e-02 1.2281625663858800e-01 -4.4678817779240229e-03 - 28 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 29 -7.6163814753861688e-04 1.0669272107767301e-02 -1.0571976081434574e-03 - 30 -1.5016701257155021e-01 -1.5914084619136477e+00 3.2189211216329594e-01 - 31 6.4552260181425694e-02 -1.3282734586862696e-01 -5.2770755099289679e-01 - 32 -1.0133808466493120e-01 2.0364335992830407e+00 -8.0060415089588721e-02 - 33 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 34 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 35 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 36 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 37 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 38 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 39 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 40 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 41 1.9692718051081217e-04 -1.2563138582299997e-05 -1.6588672410932186e-05 - 42 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 43 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 44 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 45 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 46 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 47 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 48 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 49 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 50 8.9384319916440292e-04 -5.9146745908411694e-02 -2.1779346677029956e-03 - 51 2.2452795815693065e+00 -2.5755073507111509e-01 8.4677090539321431e-02 - 52 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 53 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 54 -8.9384319916440292e-04 5.9146745908411694e-02 2.1779346677029956e-03 - 55 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 56 -1.2331636111896322e+00 7.4296820509545405e-02 7.0017648670634078e-03 - 57 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 58 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 59 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 60 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 61 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 62 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 63 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 64 -1.1749940442635296e+00 7.0325467789981444e-02 -8.9376563208980950e-02 -run_vdwl: -0.12271258182687504 -run_coul: 0 -run_stress: |2- - 2.4809913093393798e+00 -3.4978475056245109e+00 -5.7495375441860510e+00 -6.1603123580877224e-02 1.2610720063967529e-01 -2.7644262519985252e-01 -run_forces: |2 - 1 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 2 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 3 -7.7460812317360317e-01 8.9298133708186692e-02 -2.8900430760388948e-02 - 4 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 5 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 6 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 7 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 8 1.4357258719958985e+00 -8.4795853435865445e-02 -1.0165611809124420e-02 - 9 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 10 3.8540942488817379e-03 7.0232520756941075e-01 2.0999153014217290e-02 - 11 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 12 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 13 9.6903624995936397e-05 4.2517855038770011e-05 1.2994134143923292e-03 - 14 -3.8540942488817379e-03 -7.0232520756941075e-01 -2.0999153014217290e-02 - 15 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 16 1.9862354813853140e+00 -1.1980488267818523e-01 1.5055241533094585e-01 - 17 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 18 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 19 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 20 9.6871742337595712e-02 -1.9461460565504975e+00 7.6513111434975495e-02 - 21 2.8954604936522904e-01 1.7032351087357067e-01 2.0796585791904993e+00 - 22 -2.8954604936522904e-01 -1.7032351087357067e-01 -2.0796585791904993e+00 - 23 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 24 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 25 -6.5156227482327883e-02 8.3611506395435548e-02 1.1572640901998519e+00 - 26 1.0294264121273819e-01 5.9064118086761630e-01 -1.0811737560224095e+00 - 27 -6.8113165714729926e-03 6.0191037770240118e-02 -2.2853799582863922e-03 - 28 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 29 3.8002243038516683e-03 -5.4123754848498296e-02 5.3781550587853593e-03 - 30 -2.9004460948889388e-01 -5.6812683813916764e-01 2.6017233971661420e+00 - 31 2.5869401175547829e-01 -1.1240741685065804e-01 -2.6811917699724703e+00 - 32 -9.6871742337595712e-02 1.9461460565504975e+00 -7.6513111434975495e-02 - 33 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 34 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 35 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 36 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 37 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 38 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 39 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 40 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 41 -3.4247237293734199e-03 2.1428480503200736e-04 2.8526352838657262e-04 - 42 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 43 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 44 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 45 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 46 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 47 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 48 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 49 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 50 -3.1521940201186226e-03 2.3431739831032589e-01 8.4889758622304443e-03 - 51 7.7460812317360317e-01 -8.9298133708186692e-02 2.8900430760388948e-02 - 52 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 53 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 54 3.1521940201186226e-03 -2.3431739831032589e-01 -8.4889758622304443e-03 - 55 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 56 -1.4357258719958985e+00 8.4795853435865445e-02 1.0165611809124420e-02 - 57 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 58 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 59 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 60 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 61 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 62 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 63 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 - 64 -1.9863323850103101e+00 1.1976236482314646e-01 -1.5185182874533817e-01 -... From c170add3733bed12524648076453da1f43fbfefc Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 10 Jul 2026 20:43:21 -0400 Subject: [PATCH 030/100] skip failing GPU/OpenCL tests for now --- unittest/force-styles/tests/sph-pair-heatconduction.yaml | 2 +- unittest/force-styles/tests/sph-pair-lj.yaml | 2 +- unittest/force-styles/tests/sph-pair-taitwater.yaml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/unittest/force-styles/tests/sph-pair-heatconduction.yaml b/unittest/force-styles/tests/sph-pair-heatconduction.yaml index 3986c5ac1f2..f46b514b17e 100644 --- a/unittest/force-styles/tests/sph-pair-heatconduction.yaml +++ b/unittest/force-styles/tests/sph-pair-heatconduction.yaml @@ -3,7 +3,7 @@ lammps_version: 4 Jul 2026 tags: date_generated: Fri Jul 10 17:05:33 2026 epsilon: 6e-12 -skip_tests: single +skip_tests: single gpu prerequisites: | atom sph pair sph/heatconduction diff --git a/unittest/force-styles/tests/sph-pair-lj.yaml b/unittest/force-styles/tests/sph-pair-lj.yaml index 085190164b2..f1938a3bb96 100644 --- a/unittest/force-styles/tests/sph-pair-lj.yaml +++ b/unittest/force-styles/tests/sph-pair-lj.yaml @@ -3,7 +3,7 @@ lammps_version: 4 Jul 2026 tags: date_generated: Fri Jul 10 17:05:35 2026 epsilon: 5e-09 -skip_tests: single +skip_tests: single gpu prerequisites: | atom sph pair sph/lj diff --git a/unittest/force-styles/tests/sph-pair-taitwater.yaml b/unittest/force-styles/tests/sph-pair-taitwater.yaml index 1fe9721560a..00565dca662 100644 --- a/unittest/force-styles/tests/sph-pair-taitwater.yaml +++ b/unittest/force-styles/tests/sph-pair-taitwater.yaml @@ -3,7 +3,7 @@ lammps_version: 4 Jul 2026 tags: date_generated: Fri Jul 10 17:05:38 2026 epsilon: 5e-09 -skip_tests: single +skip_tests: single gpu prerequisites: | atom sph pair sph/taitwater From f68629c5a45181d1accc03991083e3afc1e0b6da Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 10 Jul 2026 22:13:41 -0400 Subject: [PATCH 031/100] skip two graphics tests on ARM64 --- unittest/graphics/tests/dump-image-ellipsoid-triangles.yaml | 2 +- unittest/graphics/tests/dump-image-ellipsoid-wireframe.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/unittest/graphics/tests/dump-image-ellipsoid-triangles.yaml b/unittest/graphics/tests/dump-image-ellipsoid-triangles.yaml index 8adbcba1486..b6c911cc698 100644 --- a/unittest/graphics/tests/dump-image-ellipsoid-triangles.yaml +++ b/unittest/graphics/tests/dump-image-ellipsoid-triangles.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: graphics +tags: graphics unstable date_generated: Thu Jul 9 14:47:39 2026 epsilon_projection: 0.5 epsilon_blocks: 2 diff --git a/unittest/graphics/tests/dump-image-ellipsoid-wireframe.yaml b/unittest/graphics/tests/dump-image-ellipsoid-wireframe.yaml index 247f0d69c90..6b497975183 100644 --- a/unittest/graphics/tests/dump-image-ellipsoid-wireframe.yaml +++ b/unittest/graphics/tests/dump-image-ellipsoid-wireframe.yaml @@ -1,6 +1,6 @@ --- lammps_version: 4 Jul 2026 -tags: graphics +tags: graphics unstable date_generated: Thu Jul 9 14:47:40 2026 epsilon_projection: 0.5 epsilon_blocks: 2 From a82f9bde05e6d55d4ad402aaadb8ae7c066c4b05 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 10 Jul 2026 23:10:16 -0400 Subject: [PATCH 032/100] run full regression a schedule --- .github/workflows/full-regression.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/full-regression.yml b/.github/workflows/full-regression.yml index 9c8c15237f1..2bc6d365e02 100644 --- a/.github/workflows/full-regression.yml +++ b/.github/workflows/full-regression.yml @@ -3,6 +3,8 @@ name: "Full Regression Test" on: workflow_dispatch: + schedule: + - cron: "25 4 * * MON,THU" jobs: build: From 5cfa2bbae88f707f5392094e71c0f8c37d36888c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 11 Jul 2026 04:04:49 -0400 Subject: [PATCH 033/100] reset Error class warning status and settings on the "clear" command. also reset defaults in thermo_modify from Error class so that the chosen defaults are stored only once. --- src/error.cpp | 11 ++++++++++- src/error.h | 1 + src/input.cpp | 3 +++ src/thermo.cpp | 4 ++-- 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/error.cpp b/src/error.cpp index f22264bd7c7..f2969edca00 100644 --- a/src/error.cpp +++ b/src/error.cpp @@ -33,9 +33,18 @@ static std::string truncpath(const std::string &path) /* ---------------------------------------------------------------------- */ +void Error::reset_warn() +{ + numwarn = allwarn = 0; + maxwarn = 100; +} + +/* ---------------------------------------------------------------------- */ + Error::Error(LAMMPS *lmp) - : Pointers(lmp), numwarn(0), maxwarn(100), allwarn(0), showerror(1) + : Pointers(lmp), showerror(1) { + Error::reset_warn(); last_error_message.clear(); last_error_type = ERROR_NONE; } diff --git a/src/error.h b/src/error.h index 2493fc4cc5b..83ed58eff15 100644 --- a/src/error.h +++ b/src/error.h @@ -89,6 +89,7 @@ class Error : protected Pointers { void set_numwarn(int val) { numwarn = val; } void set_maxwarn(int val) { maxwarn = val; } void set_allwarn(int val) { allwarn = val; } + void reset_warn(); [[nodiscard]] std::string get_last_error() const; [[nodiscard]] ErrorType get_last_error_type() const; diff --git a/src/input.cpp b/src/input.cpp index e63475cdcb5..a4ef7835a20 100644 --- a/src/input.cpp +++ b/src/input.cpp @@ -898,7 +898,10 @@ void Input::clear() lmp->destroy(); lmp->create(); lmp->post_create(); + + // reset to clean status for classes that are not re-created variable->clear_in_progress(); + error->reset_warn(); } /* ---------------------------------------------------------------------- */ diff --git a/src/thermo.cpp b/src/thermo.cpp index 3e9ff646818..09efd2231b8 100644 --- a/src/thermo.cpp +++ b/src/thermo.cpp @@ -657,11 +657,11 @@ void Thermo::modify_params(int narg, char **arg) error->set_maxwarn(0); else if (strcmp(arg[iarg + 1], "reset") == 0) { error->set_numwarn(0); + error->set_allwarn(0); warnbefore = 0; } else if (strcmp(arg[iarg + 1], "default") == 0) { warnbefore = 0; - error->set_numwarn(0); - error->set_maxwarn(100); + error->reset_warn(); } else error->set_maxwarn(utils::inumeric(FLERR, arg[iarg + 1], false, lmp)); iarg += 2; From 9b3016dedf734020fbfc0f67779ce5f9a6530a61 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 11 Jul 2026 21:47:47 -0400 Subject: [PATCH 034/100] add small comment to release process --- .github/release_steps.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/release_steps.md b/.github/release_steps.md index e0b992c1725..ad564468f13 100644 --- a/.github/release_steps.md +++ b/.github/release_steps.md @@ -42,6 +42,9 @@ https://downloads.lammps.org/analysis/ If needed, a bug-fix pull request should be created and merged to clear pending issues. +As of July 4th, 2026 the post-merge test results are summarized on +the LAMMPS Testing Dashboard at: https://lammps.github.io/lammps-test-results/ + ### Create release on GitHub When all pending pull requests for the release are merged and have From 4b45d2bb881ea40c98da17cc1a0ca3f1728b83cb Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 14 Jul 2026 22:12:34 -0400 Subject: [PATCH 035/100] change epsilon so that tests pass on ARM64 --- unittest/force-styles/tests/fix-timestep-dt_reset.yaml | 2 +- .../force-styles/tests/fix-timestep-electron_stopping_fit.yaml | 2 +- unittest/force-styles/tests/fix-timestep-msst.yaml | 2 +- unittest/force-styles/tests/fix-timestep-nphug.yaml | 2 +- unittest/force-styles/tests/fix-timestep-nvt_uef.yaml | 2 +- .../force-styles/tests/fix-timestep-thermal_conductivity.yaml | 2 +- unittest/force-styles/tests/fix-timestep-ti_spring.yaml | 2 +- unittest/force-styles/tests/fix-timestep-tmd.yaml | 2 +- .../force-styles/tests/fix-timestep-wall_harmonic_outside.yaml | 2 +- .../tests/fix-timestep-wall_reflect_stochastic.yaml | 2 +- unittest/force-styles/tests/mol-pair-e3b.yaml | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/unittest/force-styles/tests/fix-timestep-dt_reset.yaml b/unittest/force-styles/tests/fix-timestep-dt_reset.yaml index 1fdda45428d..e15abd06a97 100644 --- a/unittest/force-styles/tests/fix-timestep-dt_reset.yaml +++ b/unittest/force-styles/tests/fix-timestep-dt_reset.yaml @@ -2,7 +2,7 @@ lammps_version: 4 Jul 2026 tags: date_generated: Fri Jul 10 18:10:45 2026 -epsilon: 7.5e-14 +epsilon: 1.5e-13 skip_tests: prerequisites: | atom full diff --git a/unittest/force-styles/tests/fix-timestep-electron_stopping_fit.yaml b/unittest/force-styles/tests/fix-timestep-electron_stopping_fit.yaml index d9c54031a19..2d9203d8a6e 100644 --- a/unittest/force-styles/tests/fix-timestep-electron_stopping_fit.yaml +++ b/unittest/force-styles/tests/fix-timestep-electron_stopping_fit.yaml @@ -2,7 +2,7 @@ lammps_version: 4 Jul 2026 tags: no_respa date_generated: Fri Jul 10 18:32:15 2026 -epsilon: 5e-14 +epsilon: 2.0e-13 skip_tests: prerequisites: | atom full diff --git a/unittest/force-styles/tests/fix-timestep-msst.yaml b/unittest/force-styles/tests/fix-timestep-msst.yaml index a4201a454bb..3218324d4a4 100644 --- a/unittest/force-styles/tests/fix-timestep-msst.yaml +++ b/unittest/force-styles/tests/fix-timestep-msst.yaml @@ -2,7 +2,7 @@ lammps_version: 4 Jul 2026 tags: no_respa no_restart date_generated: Fri Jul 10 18:23:00 2026 -epsilon: 2.0e-13 +epsilon: 2.0e-11 skip_tests: prerequisites: | atom full diff --git a/unittest/force-styles/tests/fix-timestep-nphug.yaml b/unittest/force-styles/tests/fix-timestep-nphug.yaml index a48bc72d24b..df295031a66 100644 --- a/unittest/force-styles/tests/fix-timestep-nphug.yaml +++ b/unittest/force-styles/tests/fix-timestep-nphug.yaml @@ -2,7 +2,7 @@ lammps_version: 4 Jul 2026 tags: no_respa no_restart no_t_target date_generated: Fri Jul 10 18:25:39 2026 -epsilon: 5e-14 +epsilon: 2.5e-12 skip_tests: prerequisites: | atom full diff --git a/unittest/force-styles/tests/fix-timestep-nvt_uef.yaml b/unittest/force-styles/tests/fix-timestep-nvt_uef.yaml index e847d037414..bd935ba014c 100644 --- a/unittest/force-styles/tests/fix-timestep-nvt_uef.yaml +++ b/unittest/force-styles/tests/fix-timestep-nvt_uef.yaml @@ -2,7 +2,7 @@ lammps_version: 4 Jul 2026 tags: no_respa no_restart date_generated: Fri Jul 10 18:25:40 2026 -epsilon: 7.5e-12 +epsilon: 1.5e-11 skip_tests: prerequisites: | atom full diff --git a/unittest/force-styles/tests/fix-timestep-thermal_conductivity.yaml b/unittest/force-styles/tests/fix-timestep-thermal_conductivity.yaml index 79dfa49a397..f4ed3a94081 100644 --- a/unittest/force-styles/tests/fix-timestep-thermal_conductivity.yaml +++ b/unittest/force-styles/tests/fix-timestep-thermal_conductivity.yaml @@ -2,7 +2,7 @@ lammps_version: 4 Jul 2026 tags: date_generated: Fri Jul 10 18:10:46 2026 -epsilon: 5e-14 +epsilon: 5.0e-13 skip_tests: prerequisites: | atom full diff --git a/unittest/force-styles/tests/fix-timestep-ti_spring.yaml b/unittest/force-styles/tests/fix-timestep-ti_spring.yaml index d6c1953e4a3..c47ede7487f 100644 --- a/unittest/force-styles/tests/fix-timestep-ti_spring.yaml +++ b/unittest/force-styles/tests/fix-timestep-ti_spring.yaml @@ -2,7 +2,7 @@ lammps_version: 4 Jul 2026 tags: date_generated: Fri Jul 10 18:10:59 2026 -epsilon: 5e-14 +epsilon: 2.5e-13 skip_tests: prerequisites: | atom full diff --git a/unittest/force-styles/tests/fix-timestep-tmd.yaml b/unittest/force-styles/tests/fix-timestep-tmd.yaml index f924e0925bc..26eed4e1805 100644 --- a/unittest/force-styles/tests/fix-timestep-tmd.yaml +++ b/unittest/force-styles/tests/fix-timestep-tmd.yaml @@ -2,7 +2,7 @@ lammps_version: 4 Jul 2026 tags: no_restart date_generated: Fri Jul 10 18:57:37 2026 -epsilon: 5e-14 +epsilon: 1.0e-13 skip_tests: prerequisites: | atom full diff --git a/unittest/force-styles/tests/fix-timestep-wall_harmonic_outside.yaml b/unittest/force-styles/tests/fix-timestep-wall_harmonic_outside.yaml index ce5c4b6f685..eb8f08e5916 100644 --- a/unittest/force-styles/tests/fix-timestep-wall_harmonic_outside.yaml +++ b/unittest/force-styles/tests/fix-timestep-wall_harmonic_outside.yaml @@ -2,7 +2,7 @@ lammps_version: 4 Jul 2026 tags: date_generated: Fri Jul 10 18:20:05 2026 -epsilon: 5e-14 +epsilon: 2.0e-13 skip_tests: prerequisites: | atom full diff --git a/unittest/force-styles/tests/fix-timestep-wall_reflect_stochastic.yaml b/unittest/force-styles/tests/fix-timestep-wall_reflect_stochastic.yaml index 5cd71cc9770..39e5323b717 100644 --- a/unittest/force-styles/tests/fix-timestep-wall_reflect_stochastic.yaml +++ b/unittest/force-styles/tests/fix-timestep-wall_reflect_stochastic.yaml @@ -2,7 +2,7 @@ lammps_version: 4 Jul 2026 tags: no_restart date_generated: Fri Jul 10 18:29:57 2026 -epsilon: 5e-14 +epsilon: 1.5e-13 skip_tests: prerequisites: | atom full diff --git a/unittest/force-styles/tests/mol-pair-e3b.yaml b/unittest/force-styles/tests/mol-pair-e3b.yaml index 70c41e80fc6..6a89f6de5f0 100644 --- a/unittest/force-styles/tests/mol-pair-e3b.yaml +++ b/unittest/force-styles/tests/mol-pair-e3b.yaml @@ -1,7 +1,7 @@ --- lammps_version: 17 Feb 2022 date_generated: Fri Mar 18 22:17:30 2022 -epsilon: 5e-12 +epsilon: 1.0e-11 skip_tests: prerequisites: ! | atom full From ca73362c9a5a9bf33f0301af9b6fd04b80d79c81 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 15 Jul 2026 06:38:14 -0400 Subject: [PATCH 036/100] change from .. deprecated:: to .. versionremoved:: --- doc/src/Commands_removed.rst | 44 ++++++++++++++-------------- doc/src/Fortran.rst | 2 +- doc/src/Intro_portability.rst | 2 +- doc/src/Packages_details.rst | 2 +- doc/src/Run_options.rst | 2 +- doc/src/compute_voronoi_atom.rst | 2 +- doc/src/dump.rst | 2 +- doc/src/fix_atc.rst | 2 +- doc/src/fix_ave_spatial.rst | 2 +- doc/src/fix_ave_spatial_sphere.rst | 2 +- doc/src/fix_dpd_source.rst | 2 +- doc/src/fix_langevin.rst | 2 +- doc/src/fix_poems.rst | 2 +- doc/src/fix_wall_gran.rst | 2 +- doc/src/package.rst | 2 +- doc/src/pair_mgpt.rst | 2 +- doc/src/read_restart.rst | 2 +- tools/coding_standard/versiontags.py | 4 +-- 18 files changed, 40 insertions(+), 40 deletions(-) diff --git a/doc/src/Commands_removed.rst b/doc/src/Commands_removed.rst index 72e1e589ac4..a12192fdb28 100644 --- a/doc/src/Commands_removed.rst +++ b/doc/src/Commands_removed.rst @@ -20,7 +20,7 @@ with the direct alternative (if available) and print a warning. amber2lmp tools --------------- -.. deprecated:: 11Feb2026 +.. versionremoved:: 11Feb2026 The tools in the ``tools/amber2lmp`` folder have been removed because they were unmaintained for a long time and required Python 2 which has @@ -32,7 +32,7 @@ purpose. There is an `Howto_amber2lammps` included in this manual. ATC, AWPMD, and POEMS packages ------------------------------ -.. deprecated:: 10Sep2025 +.. versionremoved:: 10Sep2025 The ATC, AWPMD, and POEMS packages are removed because they were unmaintained for a long time and their legacy C++ programming style @@ -50,7 +50,7 @@ and compile this version, if you want to use any of these packages. Neighbor style and comm mode multi/old -------------------------------------- -.. deprecated:: 10Sep2025 +.. versionremoved:: 10Sep2025 The original implementation of neighbor style multi and comm mode multi, most recently available under "multi/old" has been removed. The new @@ -59,7 +59,7 @@ implementation should be used instead. LAMMPS-GUI source code ---------------------- -.. deprecated:: 10Sep2025 +.. versionremoved:: 10Sep2025 The LAMMPS-GUI sources used to be included in LAMMPS but they are now hosted in their own git repository at @@ -69,7 +69,7 @@ documentation is at https://lammps-gui.lammps.org/ GJF formulation in fix langevin ------------------------------- -.. deprecated:: 22Jul2025 +.. versionremoved:: 22Jul2025 The *gjf* keyword in fix langevin has been removed. The GJF functionality has been moved to its own fix style :doc:`fix gjf @@ -79,7 +79,7 @@ functionality has been moved to its own fix style :doc:`fix gjf LAMMPS shell ------------ -.. deprecated:: 29Aug2024 +.. versionremoved:: 29Aug2024 The LAMMPS shell has been removed from the LAMMPS distribution. Users are encouraged to use the :ref:`LAMMPS-GUI ` tool instead. @@ -87,7 +87,7 @@ are encouraged to use the :ref:`LAMMPS-GUI ` tool instead. i-PI tool --------- -.. deprecated:: 27Jun2024 +.. versionremoved:: 27Jun2024 The i-PI tool has been removed from the LAMMPS distribution. Instead, instructions to install i-PI from PyPI via pip are provided. @@ -95,7 +95,7 @@ instructions to install i-PI from PyPI via pip are provided. USER-REAXC package ------------------ -.. deprecated:: 7Feb2024 +.. versionremoved:: 7Feb2024 The USER-REAXC package has been renamed to :ref:`REAXFF `. In the process also the pair style and related fixes were renamed to use @@ -106,7 +106,7 @@ been removed, so using "reaxff" is now *required*. MPIIO package ------------- -.. deprecated:: 21Nov2023 +.. versionremoved:: 21Nov2023 The MPIIO package has been removed from LAMMPS since it was unmaintained for many years and thus not updated to incorporate required changes that @@ -124,7 +124,7 @@ see :doc:`restart `, :doc:`read_restart `, MSCG package ------------ -.. deprecated:: 21Nov2023 +.. versionremoved:: 21Nov2023 The MSCG package has been removed from LAMMPS since it was unmaintained for many years and instead superseded by the `OpenMSCG software @@ -134,7 +134,7 @@ University of Chicago, which can be used independent from LAMMPS. LATTE package ------------- -.. deprecated:: 15Jun2023 +.. versionremoved:: 15Jun2023 The LATTE package with the fix latte command was removed from LAMMPS. This functionality has been superseded by :doc:`fix mdi/qm ` @@ -148,7 +148,7 @@ well as on a different set of MPI processors. Minimize style fire/old ----------------------- -.. deprecated:: 8Feb2023 +.. versionremoved:: 8Feb2023 Minimize style *fire/old* has been removed. Its functionality can be reproduced with style *fire* with specific options. Please see the @@ -157,7 +157,7 @@ reproduced with style *fire* with specific options. Please see the Pair style mesont/tpm, compute style mesont, atom style mesont -------------------------------------------------------------- -.. deprecated:: 8Feb2023 +.. versionremoved:: 8Feb2023 Pair style *mesont/tpm*, compute style *mesont*, and atom style *mesont* have been removed from the :ref:`MESONT package `. @@ -169,7 +169,7 @@ The same functionality is available through Box command ----------- -.. deprecated:: 22Dec2022 +.. versionremoved:: 22Dec2022 The *box* command has been removed and the LAMMPS code changed so it won't be needed. If present, LAMMPS will ignore the command and print a warning. @@ -177,7 +177,7 @@ be needed. If present, LAMMPS will ignore the command and print a warning. Reset_ids, reset_atom_ids, reset_mol_ids commands ------------------------------------------------- -.. deprecated:: 22Dec2022 +.. versionremoved:: 22Dec2022 The *reset_ids*, *reset_atom_ids*, and *reset_mol_ids* commands have been folded into the :doc:`reset_atoms ` command. If @@ -187,7 +187,7 @@ warning. MESSAGE package --------------- -.. deprecated:: 4May2022 +.. versionremoved:: 4May2022 The MESSAGE package has been removed since it was superseded by the :ref:`MDI package `. MDI implements the same functionality @@ -196,7 +196,7 @@ and in a more general way with direct support for more applications. REAX package ------------ -.. deprecated:: 4Jan2019 +.. versionremoved:: 4Jan2019 The REAX package has been removed since it was superseded by the :ref:`REAXFF package `. The REAXFF package has been tested @@ -210,7 +210,7 @@ USER-REAXC. MEAM package ------------ -.. deprecated:: 4Jan2019 +.. versionremoved:: 4Jan2019 The MEAM package in Fortran has been replaced by a C++ implementation. The code in the :ref:`MEAM package ` is a translation of the @@ -224,7 +224,7 @@ coexist with the Fortran version. USER-CUDA package ----------------- -.. deprecated:: 31May2016 +.. versionremoved:: 31May2016 The USER-CUDA package had been removed, since it had been unmaintained for a long time and had known bugs and problems. Significant parts of @@ -237,7 +237,7 @@ and allow running LAMMPS with GPU acceleration. Compute atom/molecule --------------------- -.. deprecated:: 11 Dec2015 +.. versionremoved:: 11 Dec2015 The atom/molecule command has been removed from LAMMPS since it was superseded by the more general and extensible "chunk infrastructure". Here the system is @@ -249,7 +249,7 @@ refer to the :doc:`chunk HOWTO ` section for an overview. Fix ave/spatial and fix ave/spatial/sphere ------------------------------------------ -.. deprecated:: 11Dec2015 +.. versionremoved:: 11Dec2015 The fixes ave/spatial and ave/spatial/sphere have been removed from LAMMPS since they were superseded by the more general and extensible "chunk @@ -261,7 +261,7 @@ Please refer to the :doc:`chunk HOWTO ` section for an overview. restart2data tool ----------------- -.. deprecated:: 23Nov2013 +.. versionremoved:: 23Nov2013 The functionality of the restart2data tool has been folded into the LAMMPS executable directly instead of having a separate tool. A diff --git a/doc/src/Fortran.rst b/doc/src/Fortran.rst index 34bb5b9fedd..4bf19ebf660 100644 --- a/doc/src/Fortran.rst +++ b/doc/src/Fortran.rst @@ -1420,7 +1420,7 @@ Procedures Bound to the :f:type:`lammps` Derived Type Set the value of a string-style variable. - .. deprecated:: 7Feb2024 + .. versionremoved:: 7Feb2024 This function assigns a new value from the string *str* to the string-style variable *name*\ . If *name* does not exist or is not a string-style diff --git a/doc/src/Intro_portability.rst b/doc/src/Intro_portability.rst index 292537ff1a7..74c747127dd 100644 --- a/doc/src/Intro_portability.rst +++ b/doc/src/Intro_portability.rst @@ -22,7 +22,7 @@ C++ standard. Most of the Python code in LAMMPS is written to be compatible with Python 3.6 and later. -.. deprecated:: 2Apr2025 +.. versionremoved:: 2Apr2025 Python 2.x is no longer supported and trying to use it, e.g. for the LAMMPS Python module should result in an error. If you come across diff --git a/doc/src/Packages_details.rst b/doc/src/Packages_details.rst index cbfb6257c57..772058f7514 100644 --- a/doc/src/Packages_details.rst +++ b/doc/src/Packages_details.rst @@ -1785,7 +1785,7 @@ server when the package is installed for the first time. Maxim V. Shugaev (University of Virginia), Alexey N. Volkov (University of Alabama), Leonid V. Zhigilei (University of Virginia) -.. deprecated:: 8Feb2023 +.. versionremoved:: 8Feb2023 **Author of the C++ styles:** Philipp Kloza (U Cambridge) diff --git a/doc/src/Run_options.rst b/doc/src/Run_options.rst index 78690d3e93c..d031046ede5 100644 --- a/doc/src/Run_options.rst +++ b/doc/src/Run_options.rst @@ -165,7 +165,7 @@ the number of physical cores per node, to use your available hardware optimally. This also sets the number of threads used by the host when LAMMPS is compiled with CUDA=yes. -.. deprecated:: 22Dec2022 +.. versionremoved:: 22Dec2022 Support for the "numa" or "n" option was removed as its functionality was ignored in Kokkos for some time already. diff --git a/doc/src/compute_voronoi_atom.rst b/doc/src/compute_voronoi_atom.rst index 3bada09518c..8e4adf6c4e3 100644 --- a/doc/src/compute_voronoi_atom.rst +++ b/doc/src/compute_voronoi_atom.rst @@ -190,7 +190,7 @@ Voro++ software in the src/VORONOI/README file. Output info """"""""""" -.. deprecated:: 21Nov2023 +.. versionremoved:: 21Nov2023 The *peratom* keyword was removed as it is no longer required. diff --git a/doc/src/dump.rst b/doc/src/dump.rst index 6f0c511cf05..24cf41b2a07 100644 --- a/doc/src/dump.rst +++ b/doc/src/dump.rst @@ -640,7 +640,7 @@ when running on large numbers of processors. Note that using the "\*" and "%" characters together can produce a large number of small dump files! -.. deprecated:: 21Nov2023 +.. versionremoved:: 21Nov2023 The MPIIO package and the the corresponding "/mpiio" dump styles, except for the unrelated "netcdf/mpiio" style were removed from LAMMPS. diff --git a/doc/src/fix_atc.rst b/doc/src/fix_atc.rst index c4c5d5684e6..0a0a1783197 100644 --- a/doc/src/fix_atc.rst +++ b/doc/src/fix_atc.rst @@ -4,6 +4,6 @@ fix atc command .. meta:: :http-equiv=Refresh: 5; url=Commands_removed.html#atc-awpmd-and-poems-packages -.. deprecated:: 10Sep2025 +.. versionremoved:: 10Sep2025 The ATC package and the `fix atc` command have been removed from LAMMPS. diff --git a/doc/src/fix_ave_spatial.rst b/doc/src/fix_ave_spatial.rst index 1e596e3ee22..821e9cdca73 100644 --- a/doc/src/fix_ave_spatial.rst +++ b/doc/src/fix_ave_spatial.rst @@ -4,6 +4,6 @@ fix ave/spatial command .. meta:: :http-equiv=Refresh: 5; url=Commands_removed.html#fix-ave-spatial-and-fix-ave-spatial-sphere -.. deprecated:: 11Dec2015 +.. versionremoved:: 11Dec2015 The `fix ave/spatial` command has been superseded by :doc:`fix ave/chunk `. diff --git a/doc/src/fix_ave_spatial_sphere.rst b/doc/src/fix_ave_spatial_sphere.rst index 470bd49797c..78ef8d06d17 100644 --- a/doc/src/fix_ave_spatial_sphere.rst +++ b/doc/src/fix_ave_spatial_sphere.rst @@ -4,6 +4,6 @@ fix ave/spatial/sphere command .. meta:: :http-equiv=Refresh: 5; url=https://docs.lammps.org/Commands_removed.html#fix-ave-spatial-and-fix-ave-spatial-sphere -.. deprecated:: 11Dec2015 +.. versionremoved:: 11Dec2015 The `fix ave/spatial/sphere` command has been superseded by :doc:`fix ave/chunk `. diff --git a/doc/src/fix_dpd_source.rst b/doc/src/fix_dpd_source.rst index 8ec51638541..9963d1f4fe1 100644 --- a/doc/src/fix_dpd_source.rst +++ b/doc/src/fix_dpd_source.rst @@ -61,7 +61,7 @@ heat conduction with a source term (see Fig.12 in :ref:`(Li2014) `) or diffusion with a source term (see Fig.1 in :ref:`(Li2015) `), as an analog of a periodic Poiseuille flow problem. -.. deprecated:: 15Jun2023 +.. versionremoved:: 15Jun2023 The *sphere* and *cuboid* keywords will be removed in a future version of LAMMPS. The same functionality and more can be achieved with a region. diff --git a/doc/src/fix_langevin.rst b/doc/src/fix_langevin.rst index bfeb944b6a8..49adeb90529 100644 --- a/doc/src/fix_langevin.rst +++ b/doc/src/fix_langevin.rst @@ -237,7 +237,7 @@ to zero by subtracting off an equal part of it from each atom in the group. As a result, the center-of-mass of a system with zero initial momentum will not drift over time. -.. deprecated:: 22Jul2025 +.. versionremoved:: 22Jul2025 The *gjf* keyword in fix langevin has been removed and the GJF functionality has been moved to its own fix style :doc:`fix gjf diff --git a/doc/src/fix_poems.rst b/doc/src/fix_poems.rst index 39f8f33acf5..ffcbb3f00ea 100644 --- a/doc/src/fix_poems.rst +++ b/doc/src/fix_poems.rst @@ -4,6 +4,6 @@ fix poems command .. meta:: :http-equiv=Refresh: 5; url=Commands_removed.html#atc-awpmd-and-poems-packages -.. deprecated:: 10Sep2025 +.. versionremoved:: 10Sep2025 The POEMS package and the `fix poems` command have been removed from LAMMPS. diff --git a/doc/src/fix_wall_gran.rst b/doc/src/fix_wall_gran.rst index 6eccda3e585..08d384ab6a0 100644 --- a/doc/src/fix_wall_gran.rst +++ b/doc/src/fix_wall_gran.rst @@ -168,7 +168,7 @@ pair of walls in a dimension. Wall positions are given by *lo* and *hi*\ . Either of the values can be specified as NULL if a single wall is desired. -.. deprecated:: 11Feb2026 +.. versionremoved:: 11Feb2026 The *zcylinder* wallstyle has been removed. Pleas use :doc:`fix wall/gran/region ` instead. diff --git a/doc/src/package.rst b/doc/src/package.rst index 9f1db01cd41..ef14bd0f4ba 100644 --- a/doc/src/package.rst +++ b/doc/src/package.rst @@ -377,7 +377,7 @@ INTEL package settings The *intel* style invokes settings associated with the use of the INTEL package. -.. deprecated:: 4Jul2026 +.. versionremoved:: 4Jul2026 Support for offloading to Intel(R) Xeon Phi(TM) co-processors was removed. The leading numeric argument (formerly the number of diff --git a/doc/src/pair_mgpt.rst b/doc/src/pair_mgpt.rst index 2abeb8f266d..ab1e49a04c7 100644 --- a/doc/src/pair_mgpt.rst +++ b/doc/src/pair_mgpt.rst @@ -139,7 +139,7 @@ before proceeding to more complex simulations. compilers, LAMMPS should be built with the compiler flags "-O3 -msse3 -funroll-loops" when including this pair style. - .. deprecated:: 4Jul2026 + .. versionremoved:: 4Jul2026 Support for (obsolete) IBM BlueGene machines has been removed. diff --git a/doc/src/read_restart.rst b/doc/src/read_restart.rst index eb7f577e4d3..4ab9079625c 100644 --- a/doc/src/read_restart.rst +++ b/doc/src/read_restart.rst @@ -36,7 +36,7 @@ processors in the current simulation and the settings of the changed by the :doc:`balance ` or :doc:`fix balance ` commands. -.. deprecated:: 23Jun2022 +.. versionremoved:: 23Jun2022 Atom coordinates that are found to be outside the simulation box when reading the restart will be remapped back into the box and their image diff --git a/tools/coding_standard/versiontags.py b/tools/coding_standard/versiontags.py index b0cfce22a79..0abe21ad5f1 100644 --- a/tools/coding_standard/versiontags.py +++ b/tools/coding_standard/versiontags.py @@ -37,7 +37,7 @@ """ def check_pending_tag(f): - pattern = re.compile(r'^ *\.\. +(version(changed|added)|deprecated):: +TBD') + pattern = re.compile(r'^ *\.\. +(version(changed|added|removed)|deprecated):: +TBD') last_line = "\n" lineno = 1 errors = set() @@ -51,7 +51,7 @@ def check_pending_tag(f): return errors, last_line def check_bad_tag(f): - pattern = re.compile(r'^ *\.\. +(version(changed|added)|deprecated):\s+\w*') + pattern = re.compile(r'^ *\.\. +(version(changed|added|removed)|deprecated):\s+\w*') last_line = "\n" lineno = 1 errors = set() From 1f34d3f841e6cd9e9657e0e55f73a669c08150fb Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 15 Jul 2026 17:19:46 -0400 Subject: [PATCH 037/100] tell hipcc to not try a device compile on regular files --- cmake/CMakeLists.txt | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index e10229a5dff..ca998dd8cc2 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -261,6 +261,20 @@ if(PKG_PLUGIN AND (NOT ((CMAKE_SYSTEM_NAME STREQUAL "Windows")))) endif() install(TARGETS lmp EXPORT LAMMPS_Targets DESTINATION ${CMAKE_INSTALL_BINDIR}) +# The ROCm hipcc wrapper compiles every .cpp in HIP language mode by default, +# which triggers an extra device-code compilation pass (e.g. --offload-arch=gfxNNN) +# and applies HIP host/device call restrictions even to the host pass. The LAMMPS +# host library and executable contain no HIP device code, but some host-only headers +# - most notably the bundled nlohmann/json - use template metaprogramming that clang +# rejects in HIP language mode: its is_detected SFINAE disables the JSON conversion +# operators, breaking molecule.cpp, info.cpp, library.cpp, and others. Force these +# translation units to be compiled as plain C++ so hipcc skips the HIP passes for +# them. The GPU kernel library (lib/gpu) is built by separate targets and keeps HIP. +if(LAMMPS_CXX_COMPILER_NAME STREQUAL "hipcc") + target_compile_options(lammps PRIVATE "$<$:SHELL:-x c++>") + target_compile_options(lmp PRIVATE "$<$:SHELL:-x c++>") +endif() + option(CMAKE_VERBOSE_MAKEFILE "Generate verbose Makefiles" OFF) set(STANDARD_PACKAGES From dbd91da7ab854762d6976607995fc93a8efe8df2 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 15 Jul 2026 17:20:22 -0400 Subject: [PATCH 038/100] we should enforce C++17 everywhere and more recent HIP requires it anyway --- cmake/Modules/Packages/GPU.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake/Modules/Packages/GPU.cmake b/cmake/Modules/Packages/GPU.cmake index 25998d4930c..cd508a6c72a 100644 --- a/cmake/Modules/Packages/GPU.cmake +++ b/cmake/Modules/Packages/GPU.cmake @@ -434,8 +434,8 @@ elseif(GPU_API STREQUAL "HIP") if(HIP_USE_DEVICE_SORT) if(HIP_PLATFORM STREQUAL "amd") - # newer version of ROCm (5.1+) require c++14 for rocprim - set_property(TARGET gpu PROPERTY CXX_STANDARD 14) + # ROCm 5.1+ requires c++14 for rocprim; ROCm 6+/7+ rocprim requires c++17 + set_property(TARGET gpu PROPERTY CXX_STANDARD 17) endif() # add hipCUB find_package(hipcub REQUIRED) From ced75fc6472efcd9e00c743039d7ee214c5224ae Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 15 Jul 2026 17:28:19 -0400 Subject: [PATCH 039/100] when we compile with hipcc, avoid device compilation for host-only code --- cmake/CMakeLists.txt | 3 +++ cmake/Modules/Packages/COLVARS.cmake | 4 +++- cmake/Modules/Packages/LEPTON.cmake | 3 +++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index ca998dd8cc2..414ddf43d4a 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -577,6 +577,9 @@ if(PKG_ML-QUIP OR PKG_ML-POD OR PKG_ELECTRODE OR PKG_RHEO OR BUILD_TOOLS OR PKG_ file(GLOB LINALG_SOURCES CONFIGURE_DEPENDS ${LAMMPS_LIB_SOURCE_DIR}/linalg/[^.]*.cpp) add_library(linalg STATIC ${LINALG_SOURCES}) set_target_properties(linalg PROPERTIES OUTPUT_NAME lammps_linalg${LAMMPS_MACHINE}) + if(LAMMPS_CXX_COMPILER_NAME STREQUAL "hipcc") + target_compile_options(linalg PRIVATE "$<$:SHELL:-x c++>") + endif() set(BLAS_LIBRARIES "$") set(LAPACK_LIBRARIES "$") target_link_libraries(lammps PRIVATE linalg) diff --git a/cmake/Modules/Packages/COLVARS.cmake b/cmake/Modules/Packages/COLVARS.cmake index b4dc7386263..1b0ff366bfe 100644 --- a/cmake/Modules/Packages/COLVARS.cmake +++ b/cmake/Modules/Packages/COLVARS.cmake @@ -19,7 +19,9 @@ target_include_directories(colvars PUBLIC ${LAMMPS_LIB_SOURCE_DIR}/colvars) # The line below is needed to locate math_eigen_impl.h target_include_directories(colvars PRIVATE ${LAMMPS_SOURCE_DIR}) target_link_libraries(lammps PRIVATE colvars) - +if(LAMMPS_CXX_COMPILER_NAME STREQUAL "hipcc") + target_compile_options(colvars PRIVATE "$<$:SHELL:-x c++>") +endif() if(BUILD_OMP) # Enable OpenMP for Colvars as well target_compile_options(colvars PRIVATE ${OpenMP_CXX_FLAGS}) diff --git a/cmake/Modules/Packages/LEPTON.cmake b/cmake/Modules/Packages/LEPTON.cmake index b1944c24001..44e0aa4bdf8 100644 --- a/cmake/Modules/Packages/LEPTON.cmake +++ b/cmake/Modules/Packages/LEPTON.cmake @@ -22,6 +22,9 @@ add_library(lepton STATIC ${LEPTON_SOURCES} ${ASMJIT_SOURCES}) set_target_properties(lepton PROPERTIES OUTPUT_NAME lammps_lepton${LAMMPS_MACHINE}) target_compile_definitions(lepton PUBLIC LEPTON_BUILDING_STATIC_LIBRARY=1) target_include_directories(lepton PUBLIC ${LEPTON_SOURCE_DIR}/include) +if(LAMMPS_CXX_COMPILER_NAME STREQUAL "hipcc") + target_compile_options(lepton PRIVATE "$<$:SHELL:-x c++>") +endif() if(CMAKE_SYSTEM_NAME STREQUAL "Linux") find_library(LIB_RT rt QUIET) target_link_libraries(lepton PUBLIC ${LIB_RT}) From 9bdfe594ab6453a174192f23d5fe6273d3976d97 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 15 Jul 2026 18:07:15 -0400 Subject: [PATCH 040/100] move hipcc hack as far down in the file as meaningful --- cmake/CMakeLists.txt | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 414ddf43d4a..05c765af854 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -261,20 +261,6 @@ if(PKG_PLUGIN AND (NOT ((CMAKE_SYSTEM_NAME STREQUAL "Windows")))) endif() install(TARGETS lmp EXPORT LAMMPS_Targets DESTINATION ${CMAKE_INSTALL_BINDIR}) -# The ROCm hipcc wrapper compiles every .cpp in HIP language mode by default, -# which triggers an extra device-code compilation pass (e.g. --offload-arch=gfxNNN) -# and applies HIP host/device call restrictions even to the host pass. The LAMMPS -# host library and executable contain no HIP device code, but some host-only headers -# - most notably the bundled nlohmann/json - use template metaprogramming that clang -# rejects in HIP language mode: its is_detected SFINAE disables the JSON conversion -# operators, breaking molecule.cpp, info.cpp, library.cpp, and others. Force these -# translation units to be compiled as plain C++ so hipcc skips the HIP passes for -# them. The GPU kernel library (lib/gpu) is built by separate targets and keeps HIP. -if(LAMMPS_CXX_COMPILER_NAME STREQUAL "hipcc") - target_compile_options(lammps PRIVATE "$<$:SHELL:-x c++>") - target_compile_options(lmp PRIVATE "$<$:SHELL:-x c++>") -endif() - option(CMAKE_VERBOSE_MAKEFILE "Generate verbose Makefiles" OFF) set(STANDARD_PACKAGES @@ -588,7 +574,6 @@ if(PKG_ML-QUIP OR PKG_ML-POD OR PKG_ELECTRODE OR PKG_RHEO OR BUILD_TOOLS OR PKG_ endif() endif() - find_program(GZIP_EXECUTABLE gzip) find_package_handle_standard_args(GZIP REQUIRED_VARS GZIP_EXECUTABLE) option(WITH_GZIP "Enable GZIP support" ${GZIP_FOUND}) @@ -600,7 +585,6 @@ if(WITH_GZIP) endif() endif() - if(BUILD_SHARED_LIBS) set(CONFIGURE_REQUEST_PIC "--with-pic") set(CMAKE_REQUEST_PIC "-DCMAKE_POSITION_INDEPENDENT_CODE=${CMAKE_POSITION_INDEPENDENT_CODE}") @@ -807,6 +791,20 @@ set(LAMMPS_CXX_HEADERS angle.h atom.h bond.h citeme.h comm.h command.h compute.h set(LAMMPS_FMT_HEADERS core.h format.h) set(LAMMPS_JSON_HEADERS json_fwd.hpp json.hpp) +# The ROCm hipcc wrapper compiles every .cpp in HIP language mode by default, +# which triggers an extra device-code compilation pass (e.g. --offload-arch=gfxNNN) +# and applies HIP host/device call restrictions even to the host pass. The LAMMPS +# host library and executable contain no HIP device code, but some host-only headers +# - most notably the bundled nlohmann/json - use template metaprogramming that clang +# rejects in HIP language mode: its is_detected SFINAE disables the JSON conversion +# operators, breaking molecule.cpp, info.cpp, library.cpp, and others. Force these +# translation units to be compiled as plain C++ so hipcc skips the HIP passes for +# them. The GPU kernel library (lib/gpu) is built by separate targets and keeps HIP. +if(LAMMPS_CXX_COMPILER_NAME STREQUAL "hipcc") + target_compile_options(lammps PRIVATE "$<$:SHELL:-x c++>") + target_compile_options(lmp PRIVATE "$<$:SHELL:-x c++>") +endif() + set_target_properties(lammps PROPERTIES OUTPUT_NAME lammps${LAMMPS_MACHINE}) set_target_properties(lammps PROPERTIES SOVERSION ${SOVERSION}) set_target_properties(lammps PROPERTIES PREFIX "lib") From 5f4d5ab3479b53e163c73f72b50dc09b5e99df77 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 15 Jul 2026 18:33:05 -0400 Subject: [PATCH 041/100] adjust epsilon for KOKKOS/HIP --- .../force-styles/tests/mol-pair-buck6d_coul_gauss_long.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unittest/force-styles/tests/mol-pair-buck6d_coul_gauss_long.yaml b/unittest/force-styles/tests/mol-pair-buck6d_coul_gauss_long.yaml index 2d153453f62..d4a5c5fa5db 100644 --- a/unittest/force-styles/tests/mol-pair-buck6d_coul_gauss_long.yaml +++ b/unittest/force-styles/tests/mol-pair-buck6d_coul_gauss_long.yaml @@ -2,7 +2,7 @@ lammps_version: 4 Jul 2026 tags: date_generated: Fri Jul 10 15:59:48 2026 -epsilon: 5e-12 +epsilon: 1.5e-11 skip_tests: prerequisites: | atom full From ce8ed00ff5331adae4a4f807b3ed4b3cdb7bcba3 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 15 Jul 2026 18:45:27 -0400 Subject: [PATCH 042/100] make sure that -DKOKKOS_GPU is set when we compile for GPU, even outside KOKKOS sources --- cmake/Modules/Packages/KOKKOS.cmake | 10 ++++++++++ src/KOKKOS/kokkos_type.h | 5 ++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/cmake/Modules/Packages/KOKKOS.cmake b/cmake/Modules/Packages/KOKKOS.cmake index d170f6e7147..9043c1ae70a 100644 --- a/cmake/Modules/Packages/KOKKOS.cmake +++ b/cmake/Modules/Packages/KOKKOS.cmake @@ -146,6 +146,16 @@ else() endif() target_compile_definitions(lammps PUBLIC $) +# In a GPU-enabled Kokkos build every translation unit is processed by the +# device compiler, so expose LMP_KOKKOS_GPU to all of LAMMPS -- not only files +# that include kokkos_type.h. This lets non-KOKKOS host code avoid constructs +# that only work on the host, e.g. file-scope "const" tables of host function +# pointers, which clang implicitly shadows into device memory and then fails to +# link +if(Kokkos_ENABLE_CUDA OR Kokkos_ENABLE_HIP OR Kokkos_ENABLE_SYCL OR Kokkos_ENABLE_OPENMPTARGET) + target_compile_definitions(lammps PUBLIC $) +endif() + set(KOKKOS_PKG_SOURCES_DIR ${LAMMPS_SOURCE_DIR}/KOKKOS) set(KOKKOS_PKG_SOURCES ${KOKKOS_PKG_SOURCES_DIR}/kokkos.cpp ${KOKKOS_PKG_SOURCES_DIR}/atom_kokkos.cpp diff --git a/src/KOKKOS/kokkos_type.h b/src/KOKKOS/kokkos_type.h index 81c8d2ea7a5..16ef59f1df8 100644 --- a/src/KOKKOS/kokkos_type.h +++ b/src/KOKKOS/kokkos_type.h @@ -28,7 +28,10 @@ constexpr int FULL = 1; constexpr int HALFTHREAD = 2; constexpr int HALF = 4; -#if defined(KOKKOS_ENABLE_CUDA) || defined(KOKKOS_ENABLE_HIP) || defined(KOKKOS_ENABLE_SYCL) || defined(KOKKOS_ENABLE_OPENMPTARGET) +// LMP_KOKKOS_GPU may also be set as a global compile definition by the build +// system (see cmake/Modules/Packages/KOKKOS.cmake) so that non-KOKKOS sources, +// which do not include this header, can detect a GPU-enabled Kokkos build. +#if !defined(LMP_KOKKOS_GPU) && (defined(KOKKOS_ENABLE_CUDA) || defined(KOKKOS_ENABLE_HIP) || defined(KOKKOS_ENABLE_SYCL) || defined(KOKKOS_ENABLE_OPENMPTARGET)) #define LMP_KOKKOS_GPU #endif From 7b531554c6431f6d5dca97d9c20cfafffb618c8d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 21 Jul 2026 14:01:35 -0400 Subject: [PATCH 043/100] more test tweaks to pass on ARM64 --- .../tests/fix-timestep-wall_reflect_stochastic.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unittest/force-styles/tests/fix-timestep-wall_reflect_stochastic.yaml b/unittest/force-styles/tests/fix-timestep-wall_reflect_stochastic.yaml index 39e5323b717..f9c935199f5 100644 --- a/unittest/force-styles/tests/fix-timestep-wall_reflect_stochastic.yaml +++ b/unittest/force-styles/tests/fix-timestep-wall_reflect_stochastic.yaml @@ -2,7 +2,7 @@ lammps_version: 4 Jul 2026 tags: no_restart date_generated: Fri Jul 10 18:29:57 2026 -epsilon: 1.5e-13 +epsilon: 2.5e-13 skip_tests: prerequisites: | atom full From ca33a984e70ddc520605d97aff66c0591afe8eca Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 24 Jul 2026 13:03:18 -0400 Subject: [PATCH 044/100] add depth cueing to dump image via new 'depthcue' keyword Fade rendered objects toward the (gradient-aware) background color with increasing distance from the viewer. Applied as a post-processing pass on the composited image on the output rank, so the cost is negligible and independent of the number of objects. The fade range adapts to the nearest and most distant drawn pixels. Off by default; images without the keyword are unchanged. --- doc/src/dump_image.rst | 19 +- src/GRAPHICS/dump_image.cpp | 9 + src/GRAPHICS/image.cpp | 64 ++ src/GRAPHICS/image.h | 3 + .../graphics/tests/dump-image-depthcue.yaml | 603 ++++++++++++++++++ 5 files changed, 697 insertions(+), 1 deletion(-) create mode 100644 unittest/graphics/tests/dump-image-depthcue.yaml diff --git a/doc/src/dump_image.rst b/doc/src/dump_image.rst index fc4010489fd..416c7f1e90e 100644 --- a/doc/src/dump_image.rst +++ b/doc/src/dump_image.rst @@ -24,7 +24,7 @@ Syntax * color = atom attribute that determines color of each atom * diameter = atom attribute that determines size of each atom * zero or more keyword/value pairs may be appended -* keyword = *atom* or *adiam* or *autobond* or *bond* or *grid* or *line* or *tri* or *ellipsoid* or *body* or *compute* or *fix* or *size* or *view* or *center* or *up* or *zoom* or *box* or *axes* or *region* or *subbox* or *shiny* or *fsaa* or *ssao* +* keyword = *atom* or *adiam* or *autobond* or *bond* or *grid* or *line* or *tri* or *ellipsoid* or *body* or *compute* or *fix* or *size* or *view* or *center* or *up* or *zoom* or *box* or *axes* or *region* or *subbox* or *shiny* or *fsaa* or *ssao* or *depthcue* .. parsed-literal:: @@ -115,6 +115,9 @@ Syntax shading = *yes* or *no* = turn depth shading on/off seed = random # seed (positive integer) dfactor = strength of shading from 0.0 to 1.0 + *depthcue* values = cueing cfactor = depth cueing + cueing = *yes* or *no* = turn depth cueing on/off + cfactor = strength of fading from 0.0 to 1.0 .. _dump_modify_image: @@ -861,6 +864,19 @@ shading is particularly large. In case LAMMPS has been :doc:`compiled with OpenMP support `, the SSAO processing is distributed across multiple threads. +.. versionadded:: TBD + +The *depthcue* keyword turns on/off depth cueing. If *yes* is set, +rendered objects fade toward the background color the more distant from +the viewer they are, similar to looking through fog. This is perceived +as depth and helps to visually untangle dense systems. The *cfactor* +value scales the strength of the fading: with *cfactor* = 1.0 the most +distant objects blend completely into the background, smaller values +reduce the maximum amount of fading. The fade range adapts +automatically to the nearest and most distant rendered objects in each +image. Unlike the *ssao* keyword, depth cueing adds no significant +computational cost, and both can be combined. + ---------- Dump_modify keywords for dump image and dump movie @@ -1408,6 +1424,7 @@ The defaults for the dump image and dump movie keywords are as follows: * shiny = 1.0 * ssao = no * fsaa = no +* depthcue = no ---------- diff --git a/src/GRAPHICS/dump_image.cpp b/src/GRAPHICS/dump_image.cpp index 0221c20e0e4..269ff9d6e10 100644 --- a/src/GRAPHICS/dump_image.cpp +++ b/src/GRAPHICS/dump_image.cpp @@ -622,6 +622,15 @@ DumpImage::DumpImage(LAMMPS *lmp, int narg, char **arg) : image->ssaoint = ssaoint; iarg += 4; + } else if (strcmp(arg[iarg],"depthcue") == 0) { + if (iarg+3 > narg) utils::missing_cmd_args(FLERR,"dump image depthcue", error); + image->depthcue = utils::logical(FLERR,arg[iarg+1],false,lmp); + double cfactor = utils::numeric(FLERR,arg[iarg+2],false,lmp); + if (cfactor < 0.0 || cfactor > 1.0) + error->all(FLERR, iarg+2, "Invalid dump image depthcue strength value {}", cfactor); + image->depthcueint = cfactor; + iarg += 3; + } else error->all(FLERR, iarg, "Unknown dump image keyword {}", arg[iarg]); } diff --git a/src/GRAPHICS/image.cpp b/src/GRAPHICS/image.cpp index 6f76c143b00..47092c72701 100644 --- a/src/GRAPHICS/image.cpp +++ b/src/GRAPHICS/image.cpp @@ -363,6 +363,8 @@ Image::Image(LAMMPS *lmp, int nmap_caller) : shiny = 1.0; ssao = NO; fsaa = NO; + depthcue = NO; + depthcueint = 0.0; up[0] = 0.0; up[1] = 0.0; @@ -885,6 +887,10 @@ void Image::merge() writeBuffer = imageBuffer; } + // apply depth cueing to the final composited image + + if (depthcue && (me == 0)) compute_depthcue(); + // scale down image for antialiasing. can be done in place with simple averaging if (fsaa) { for (int h=0; h < height; h += 2) { @@ -1896,6 +1902,64 @@ void Image::compute_SSAO() delete[] uniform; } +/* ---------------------------------------------------------------------- + apply depth cueing to the composited image on the output rank: + fade drawn pixels toward the background color with increasing distance + from the viewer. the fade range is taken from the nearest and most + distant drawn pixels, so the effect adapts to the visible scene. +------------------------------------------------------------------------- */ + +void Image::compute_depthcue() +{ + // determine depth range of drawn pixels; background pixels have depth < 0 + + bool first = true; + double dmin = 0.0, dmax = 0.0; + for (int i = 0; i < npixels; i++) { + const double d = depthBuffer[i]; + if (d < 0.0) continue; + if (first) { + dmin = dmax = d; + first = false; + } else { + dmin = MIN(dmin,d); + dmax = MAX(dmax,d); + } + } + + // nothing to do without drawn pixels or without depth variation + + if (first || ((dmax - dmin) < EPSILON)) return; + const double dscale = depthcueint / (dmax - dmin); + + // blend pixel colors toward the background color; with a background + // gradient enabled use the same per-row color as in clear() + +#if defined(_OPENMP) +#pragma omp parallel for schedule(static) +#endif + for (int iy = 0; iy < height; ++iy) { + int red = background[0]; + int green = background[1]; + int blue = background[2]; + if (background2[0] >= 0) { + const double fraction = (double) iy / (double) height; + red = static_cast(fraction * background2[0] + (1.0 - fraction) * background[0]); + green = static_cast(fraction * background2[1] + (1.0 - fraction) * background[1]); + blue = static_cast(fraction * background2[2] + (1.0 - fraction) * background[2]); + } + for (int ix = 0; ix < width; ++ix) { + const int i = iy * width + ix; + const double d = depthBuffer[i]; + if (d < 0.0) continue; + const double f = (d - dmin) * dscale; + writeBuffer[i*3+0] = static_cast((1.0 - f) * writeBuffer[i*3+0] + f * red); + writeBuffer[i*3+1] = static_cast((1.0 - f) * writeBuffer[i*3+1] + f * green); + writeBuffer[i*3+2] = static_cast((1.0 - f) * writeBuffer[i*3+2] + f * blue); + } + } +} + /* ---------------------------------------------------------------------- */ void Image::write_JPG(FILE *fp) diff --git a/src/GRAPHICS/image.h b/src/GRAPHICS/image.h index 4742596c5bd..1b42d1cc14e 100644 --- a/src/GRAPHICS/image.h +++ b/src/GRAPHICS/image.h @@ -38,6 +38,8 @@ class Image : protected Pointers { int ssao; // SSAO on or off int seed; // RN seed for SSAO double ssaoint; // strength of shading from 0 to 1 + int depthcue; // depth cueing on or off + double depthcueint; // strength of depth cueing from 0 to 1 double *boxcolor; // color to draw box outline with int background[3]; // RGB values of background int background2[3]; // RGB values of second background color for gradient (off if < 0.0) @@ -149,6 +151,7 @@ class Image : protected Pointers { void draw_pixel(int, int, double, const double *, const double *); void compute_SSAO(); + void compute_depthcue(); // inline functions diff --git a/unittest/graphics/tests/dump-image-depthcue.yaml b/unittest/graphics/tests/dump-image-depthcue.yaml new file mode 100644 index 00000000000..48c0d4958a6 --- /dev/null +++ b/unittest/graphics/tests/dump-image-depthcue.yaml @@ -0,0 +1,603 @@ +--- +lammps_version: 4 Jul 2026 +tags: graphics +date_generated: Fri Jul 24 12:55:39 2026 +epsilon_projection: 0.5 +epsilon_blocks: 2 +nprocs: 1 +prerequisites: | + atom full + pair lj/charmm/coul/charmm + bond harmonic + angle charmm + dihedral charmm + improper harmonic +setup_commands: | + units real + atom_style full + pair_style lj/charmm/coul/charmm 8.0 10.0 + bond_style harmonic + angle_style charmm + dihedral_style charmm + improper_style harmonic + read_data ${input_dir}/data.peptide + neighbor 2.0 bin + dump viz all image 1 ${imagefile} type type size 200 200 zoom 1.5 view 60 30 shiny 0.2 box yes 0.02 bond atom 0.3 depthcue yes 0.8 + dump_modify viz backcolor blue backcolor2 black +run_commands: | + run 0 +image_size: 200 200 +sampling: 3 16 +row_means: | + 8.81 13.03 8.89 + 5.88 9.36 9.79 + 7.57 10.44 12.49 + 9.34 11.43 13.13 + 9.20 11.57 12.97 + 8.87 11.64 12.79 + 9.02 11.29 12.13 + 8.53 10.57 13.31 + 8.68 9.99 13.79 + 8.56 11.05 15.97 + 9.97 13.13 19.88 + 9.88 12.79 20.77 + 10.55 16.43 25.44 + 11.23 21.50 32.48 + 12.79 29.43 41.00 + 13.04 28.67 39.32 + 11.86 23.66 34.41 + 12.10 20.84 36.45 + 12.61 20.84 40.83 + 9.90 20.53 43.12 + 6.18 19.20 47.23 + 6.91 24.52 53.22 + 7.86 27.64 55.06 + 8.38 27.26 52.36 + 8.21 26.09 48.30 + 8.71 26.59 50.29 + 8.85 24.64 52.00 + 8.93 25.77 55.36 + 8.98 26.20 58.61 + 10.53 26.52 62.33 + 11.18 28.49 62.26 + 10.14 29.42 61.14 + 10.32 32.87 62.52 + 10.01 33.62 64.03 + 9.81 33.81 65.31 + 9.05 29.59 61.13 + 9.22 26.73 60.28 + 10.35 30.12 64.92 + 11.18 34.28 69.14 + 10.78 34.37 70.90 + 12.42 35.34 72.83 + 13.79 35.84 71.88 + 15.34 39.66 75.59 + 17.62 36.50 71.53 + 15.34 35.10 66.85 + 13.36 38.99 73.92 + 13.31 40.88 83.35 + 12.71 41.59 86.52 + 14.77 42.78 86.17 + 18.30 45.98 84.88 + 20.11 48.26 85.50 + 20.50 46.35 84.92 + 20.41 48.30 81.98 + 22.73 49.21 80.86 + 22.23 44.54 77.28 + 22.23 46.98 80.52 + 23.25 49.22 83.34 + 21.83 48.52 86.09 + 20.41 44.73 84.19 + 21.61 42.59 84.45 + 25.48 47.84 90.21 + 25.91 46.16 87.31 + 28.40 52.67 91.78 + 27.14 59.27 94.58 + 26.69 60.84 91.06 + 21.26 52.97 86.52 + 19.44 47.13 85.41 + 21.29 50.55 96.16 + 22.51 53.91 96.97 + 23.55 47.04 93.66 + 22.67 41.19 88.36 + 24.73 40.59 90.31 + 24.42 43.82 96.05 + 22.37 48.38 95.57 + 21.34 56.51 96.81 + 22.06 58.54 99.33 + 22.18 50.62 98.62 + 22.32 47.27 98.28 + 20.70 43.94 94.78 + 21.61 47.44 95.97 + 23.19 55.52 101.53 + 24.14 56.80 105.69 + 22.61 49.88 102.28 + 21.58 46.30 100.12 + 19.15 41.94 99.74 + 14.86 43.66 105.80 + 9.51 45.95 109.35 + 10.16 45.52 110.68 + 10.19 48.30 109.25 + 11.57 45.55 109.28 + 10.25 43.51 109.33 + 11.19 42.99 112.72 + 10.37 44.53 111.14 + 9.51 43.54 110.89 + 9.41 42.48 111.58 + 8.71 39.19 110.81 + 9.93 42.27 116.13 + 11.15 45.37 121.01 + 10.07 42.27 119.56 + 7.94 34.02 111.61 + 7.92 32.88 114.49 + 9.18 31.77 120.05 + 9.47 37.12 122.59 + 11.28 46.94 123.14 + 11.97 51.38 126.78 + 11.07 51.56 119.06 + 9.53 43.40 112.44 + 9.46 39.53 115.91 + 9.79 35.28 116.33 + 10.99 30.88 121.44 + 11.36 28.13 118.94 + 10.51 29.71 120.66 + 11.68 45.61 128.85 + 12.43 52.22 131.49 + 11.18 47.84 124.88 + 10.23 44.30 124.27 + 11.15 40.72 125.30 + 12.16 45.65 128.02 + 10.81 40.74 125.83 + 10.22 36.18 129.49 + 8.22 29.28 129.45 + 8.12 30.86 130.32 + 8.90 37.53 130.74 + 10.52 43.11 135.54 + 10.49 44.30 133.59 + 9.63 37.74 130.50 + 10.10 37.51 129.41 + 9.96 38.77 129.82 + 9.71 41.15 131.22 + 9.54 42.18 140.10 + 9.66 39.52 138.97 + 9.27 40.03 139.02 + 8.42 36.91 140.15 + 8.10 31.75 140.69 + 7.08 26.79 144.11 + 6.37 31.97 140.33 + 9.53 40.40 145.92 + 10.39 42.63 148.75 + 9.79 38.22 144.28 + 10.71 35.75 140.69 + 11.23 35.03 146.71 + 9.93 37.62 146.63 + 8.21 34.52 140.59 + 7.41 35.51 140.75 + 8.02 34.88 146.89 + 9.15 35.46 149.34 + 9.78 31.82 151.53 + 10.99 33.18 151.64 + 12.49 37.62 156.29 + 10.39 34.87 155.28 + 8.78 35.38 158.53 + 7.53 33.38 155.93 + 8.47 34.58 159.21 + 9.82 35.41 156.13 + 11.36 41.00 158.18 + 11.62 41.61 152.78 + 10.98 40.02 154.68 + 8.83 33.34 156.28 + 6.78 23.83 159.78 + 6.13 22.34 166.89 + 7.46 25.18 170.71 + 8.41 27.36 176.53 + 9.60 32.02 176.09 + 9.59 34.05 173.29 + 9.84 31.64 173.05 + 11.47 34.82 175.75 + 11.27 34.14 174.37 + 10.45 28.70 170.71 + 8.81 23.05 172.01 + 7.59 20.13 175.03 + 7.68 22.23 186.91 + 8.49 29.43 185.04 + 10.64 35.09 185.69 + 10.29 30.47 182.76 + 8.63 22.23 180.90 + 6.81 16.66 188.94 + 6.50 17.62 201.29 + 6.90 19.32 204.38 + 9.41 19.74 202.00 + 12.21 19.98 200.85 + 9.87 19.05 196.69 + 12.41 22.83 198.67 + 12.71 26.06 200.63 + 12.50 24.85 203.17 + 11.22 20.75 205.67 + 10.78 17.84 209.43 + 12.36 15.44 211.16 + 12.73 16.11 211.12 + 12.73 18.09 210.47 + 12.36 17.05 213.73 + 11.77 16.41 216.84 + 11.48 14.48 216.68 + 12.03 14.04 219.19 + 13.35 19.39 220.94 + 13.54 20.17 219.05 + 12.40 18.43 218.63 + 8.91 15.00 227.01 + 8.60 14.00 229.00 + 12.24 14.93 228.88 + 12.02 13.11 234.91 +col_means: | + 9.12 12.26 122.55 + 9.41 14.15 121.81 + 9.67 13.40 120.91 + 8.86 12.88 119.42 + 8.10 14.07 119.31 + 9.38 16.52 121.05 + 9.85 19.88 120.39 + 10.53 21.86 117.72 + 10.26 20.65 117.19 + 10.97 21.55 117.64 + 10.78 20.86 117.22 + 10.39 19.23 116.75 + 10.48 17.51 116.05 + 11.00 19.83 117.60 + 10.95 20.73 116.45 + 9.79 21.05 116.45 + 10.09 23.86 118.13 + 11.24 25.86 119.38 + 9.39 23.89 120.79 + 10.46 25.07 120.34 + 11.02 25.01 120.12 + 10.79 23.70 118.67 + 10.52 22.41 120.02 + 11.88 24.90 120.81 + 13.66 30.81 123.48 + 12.12 32.66 124.47 + 11.12 29.27 120.88 + 10.70 26.04 119.54 + 10.06 24.98 117.95 + 11.40 32.13 123.35 + 13.08 34.43 126.11 + 12.45 34.66 122.28 + 10.16 31.80 115.33 + 10.46 28.74 115.09 + 10.29 23.62 117.01 + 10.37 26.04 114.89 + 12.27 28.70 118.81 + 13.67 36.20 122.70 + 13.71 38.95 120.80 + 11.69 34.51 117.31 + 10.06 28.32 115.64 + 10.87 29.95 117.06 + 11.97 34.77 120.63 + 12.27 36.70 120.30 + 13.55 42.74 120.14 + 13.54 42.01 119.08 + 12.38 34.26 118.56 + 12.54 30.82 117.61 + 12.45 30.84 118.71 + 11.29 30.59 117.94 + 11.96 36.73 120.81 + 12.12 39.25 120.47 + 12.09 36.69 121.31 + 10.94 35.33 122.75 + 10.84 33.13 122.53 + 10.33 28.48 120.27 + 9.79 27.59 118.47 + 10.87 31.82 121.17 + 10.96 33.72 122.89 + 9.60 32.43 116.43 + 10.41 32.48 119.47 + 11.36 37.81 118.05 + 11.02 42.13 120.83 + 9.81 42.70 118.08 + 10.71 45.70 114.88 + 11.54 44.02 113.77 + 12.22 42.84 115.83 + 11.38 41.99 115.40 + 11.82 40.99 117.52 + 11.61 38.55 119.94 + 10.61 38.33 122.33 + 11.92 44.17 121.53 + 15.04 50.77 124.78 + 13.41 49.66 125.28 + 11.89 46.63 123.96 + 10.51 41.04 123.69 + 9.40 32.98 121.45 + 8.42 34.48 117.07 + 10.21 42.17 117.80 + 11.23 47.56 120.49 + 9.88 46.57 118.25 + 10.03 48.75 116.03 + 10.72 48.60 122.70 + 10.93 46.84 121.49 + 9.55 39.00 121.09 + 9.81 34.60 118.09 + 10.47 37.53 119.74 + 10.82 35.47 126.27 + 10.43 34.05 125.94 + 10.50 31.34 123.24 + 9.36 29.80 121.80 + 10.39 33.68 118.08 + 13.52 44.16 120.17 + 17.60 49.75 120.19 + 16.93 48.16 115.72 + 18.24 47.85 121.62 + 17.18 40.84 122.13 + 13.21 35.04 118.21 + 14.09 35.41 116.89 + 12.76 39.38 119.81 + 12.79 47.38 121.67 + 12.99 44.69 117.46 + 15.36 44.95 115.49 + 13.00 42.52 113.09 + 10.59 43.58 109.62 + 12.66 43.92 109.52 + 13.01 44.17 110.47 + 13.82 42.88 109.56 + 17.94 42.92 111.47 + 18.38 45.08 113.48 + 16.96 46.13 112.45 + 13.91 47.27 111.19 + 12.43 47.15 117.83 + 12.02 47.77 113.61 + 12.60 48.52 111.44 + 13.45 50.03 113.02 + 15.05 51.91 114.69 + 12.68 46.61 105.29 + 10.42 42.44 103.92 + 9.64 34.65 104.22 + 10.31 31.48 110.24 + 10.54 33.51 109.91 + 10.32 32.65 109.75 + 10.37 37.95 112.42 + 13.34 45.12 112.73 + 13.16 49.03 117.13 + 84.22 80.70 47.34 + 98.31 95.64 52.23 + 63.55 65.85 44.72 + 11.29 35.75 109.44 + 12.36 37.84 117.23 + 12.34 40.33 119.96 + 12.45 45.33 121.81 + 12.84 51.19 121.80 + 12.88 47.88 115.33 + 12.45 39.09 114.25 + 11.50 38.42 107.10 + 13.05 38.15 106.75 + 14.23 43.95 104.56 + 15.54 49.54 111.28 + 14.66 46.66 111.43 + 11.15 44.45 109.11 + 12.40 44.09 112.19 + 12.51 45.68 117.11 + 13.00 46.53 114.41 + 12.88 46.08 110.84 + 12.71 41.42 115.14 + 12.79 40.45 115.86 + 13.68 38.52 116.31 + 14.32 36.48 118.75 + 13.81 38.98 117.50 + 12.85 39.98 110.38 + 12.44 42.77 113.92 + 11.97 41.02 116.54 + 12.21 38.46 117.64 + 12.96 39.20 117.83 + 13.39 37.28 119.25 + 12.66 35.31 114.32 + 12.70 37.89 117.00 + 12.60 39.48 117.99 + 11.10 36.21 116.57 + 9.74 30.23 115.69 + 9.03 25.86 118.17 + 11.76 27.51 121.01 + 11.99 29.34 118.14 + 13.62 34.59 120.66 + 12.60 32.04 119.97 + 10.97 29.41 116.09 + 10.46 26.54 115.20 + 9.66 24.66 119.36 + 10.68 28.93 123.54 + 10.72 27.80 124.66 + 9.21 23.19 121.19 + 9.31 21.48 121.99 + 10.13 21.76 125.66 + 9.06 18.78 126.44 + 8.88 18.83 125.74 + 8.12 15.84 124.39 + 9.05 18.68 127.29 + 9.49 23.72 127.20 + 9.13 23.82 127.59 + 9.21 23.45 126.03 + 8.30 21.60 124.25 + 8.08 20.48 123.86 + 7.88 18.42 122.75 + 8.01 17.55 123.13 + 8.69 16.21 124.47 + 9.44 17.08 125.70 + 9.21 16.19 123.18 + 9.09 16.57 122.06 + 7.41 15.46 123.30 + 7.70 15.04 124.86 + 7.50 13.62 126.67 + 6.49 11.36 126.49 + 7.26 11.12 124.66 + 7.67 9.40 124.18 + 7.98 9.53 124.87 + 7.22 9.06 125.45 + 6.60 8.06 124.83 + 6.23 6.39 124.59 +sample_blocks: | + 2 2 0.00 0.00 3.33 + 2 18 0.00 0.00 3.33 + 2 34 0.00 0.00 3.33 + 2 50 81.67 69.33 4.56 + 2 66 0.00 0.00 3.33 + 2 82 6.56 36.33 38.78 + 2 98 0.78 7.22 10.33 + 2 114 13.44 13.44 75.67 + 2 130 4.22 3.56 3.33 + 2 146 44.00 41.22 6.89 + 2 162 0.00 0.00 3.33 + 2 178 0.00 0.00 3.33 + 2 194 0.00 0.00 3.33 + 18 2 0.00 0.00 23.67 + 18 18 0.00 0.00 23.67 + 18 34 41.11 34.78 14.44 + 18 50 0.00 0.00 23.67 + 18 66 0.00 0.00 23.67 + 18 82 6.11 7.22 62.11 + 18 98 3.44 32.56 53.00 + 18 114 8.22 8.22 60.11 + 18 130 14.22 53.00 94.78 + 18 146 0.11 5.44 25.11 + 18 162 0.00 0.00 23.67 + 18 178 17.33 72.22 106.00 + 18 194 129.22 121.67 24.89 + 34 2 0.00 0.00 44.00 + 34 18 12.44 74.67 98.00 + 34 34 0.00 0.00 44.00 + 34 50 5.22 36.56 68.22 + 34 66 0.00 0.00 44.00 + 34 82 1.22 21.78 48.56 + 34 98 0.00 0.00 44.00 + 34 114 10.00 29.78 94.00 + 34 130 8.89 64.56 79.67 + 34 146 0.00 0.00 44.89 + 34 162 0.22 6.56 47.78 + 34 178 17.22 101.67 116.89 + 34 194 0.00 0.00 44.00 + 50 2 111.22 104.22 45.22 + 50 18 0.00 0.00 64.67 + 50 34 21.78 21.78 142.00 + 50 50 16.22 103.44 121.67 + 50 66 15.56 65.78 114.67 + 50 82 11.56 30.78 97.56 + 50 98 7.33 24.22 60.67 + 50 114 11.89 15.22 102.11 + 50 130 13.56 55.56 108.56 + 50 146 5.78 31.56 83.11 + 50 162 10.44 83.22 104.00 + 50 178 0.00 0.00 64.67 + 50 194 0.00 0.00 64.67 + 66 2 0.00 0.00 85.00 + 66 18 10.11 81.00 98.33 + 66 34 6.00 6.00 100.56 + 66 50 8.67 73.89 87.78 + 66 66 117.00 122.11 51.22 + 66 82 6.78 42.11 87.22 + 66 98 11.44 48.78 104.33 + 66 114 15.11 36.78 115.22 + 66 130 11.89 85.44 101.67 + 66 146 23.78 38.89 66.00 + 66 162 0.00 0.00 77.89 + 66 178 0.22 9.56 75.78 + 66 194 1.22 14.33 88.78 + 82 2 0.00 0.00 105.33 + 82 18 5.78 5.78 115.78 + 82 34 0.00 7.78 96.33 + 82 50 11.11 52.11 109.22 + 82 66 9.78 66.11 114.67 + 82 82 10.78 86.44 97.22 + 82 98 4.56 41.22 111.44 + 82 114 165.44 165.67 50.33 + 82 130 150.67 130.56 28.11 + 82 146 10.44 61.22 114.89 + 82 162 1.22 14.78 91.11 + 82 178 0.00 0.00 105.33 + 82 194 0.00 0.00 105.33 + 98 2 0.00 0.00 125.67 + 98 18 0.00 0.00 125.67 + 98 34 5.78 37.67 116.33 + 98 50 2.44 5.11 112.11 + 98 66 19.00 96.11 136.56 + 98 82 11.22 37.56 113.33 + 98 98 8.33 81.44 104.44 + 98 114 21.67 120.22 147.89 + 98 130 11.44 30.11 116.67 + 98 146 18.33 112.22 139.44 + 98 162 9.67 77.11 133.33 + 98 178 2.11 2.11 123.89 + 98 194 0.00 0.00 125.67 + 114 2 0.00 0.00 146.00 + 114 18 2.56 27.44 103.67 + 114 34 0.22 5.56 130.00 + 114 50 16.56 92.11 144.11 + 114 66 2.78 40.67 106.56 + 114 82 20.11 113.44 147.33 + 114 98 9.67 37.56 141.33 + 114 114 13.44 48.44 146.67 + 114 130 5.89 52.33 113.00 + 114 146 11.22 28.56 131.11 + 114 162 4.78 32.56 113.33 + 114 178 0.22 9.44 136.67 + 114 194 0.00 0.00 146.00 + 130 2 0.00 0.00 166.67 + 130 18 1.11 20.44 137.56 + 130 34 1.56 18.33 154.89 + 130 50 11.33 41.33 121.67 + 130 66 9.78 72.78 148.56 + 130 82 0.00 1.33 156.67 + 130 98 20.44 114.44 153.78 + 130 114 8.78 71.44 109.00 + 130 130 29.67 38.78 101.56 + 130 146 3.78 27.00 125.67 + 130 162 6.44 18.78 145.78 + 130 178 0.00 0.00 166.67 + 130 194 0.00 0.00 166.67 + 146 2 0.00 0.00 187.00 + 146 18 6.56 14.33 133.33 + 146 34 3.78 45.33 109.00 + 146 50 5.22 11.56 146.33 + 146 66 13.56 63.33 156.11 + 146 82 0.33 8.44 181.78 + 146 98 11.22 77.33 142.78 + 146 114 0.67 2.44 118.67 + 146 130 2.78 24.89 86.33 + 146 146 2.22 27.22 139.11 + 146 162 12.89 12.89 155.78 + 146 178 2.33 2.33 164.89 + 146 194 37.89 36.22 160.33 + 162 2 0.00 0.00 207.33 + 162 18 20.22 54.89 158.11 + 162 34 1.89 13.22 189.00 + 162 50 0.00 0.00 207.33 + 162 66 4.44 7.67 146.44 + 162 82 1.89 24.22 180.44 + 162 98 0.00 2.00 199.00 + 162 114 1.44 26.67 151.22 + 162 130 0.00 9.00 179.11 + 162 146 1.56 29.11 151.00 + 162 162 6.00 44.00 152.56 + 162 178 0.00 0.00 207.33 + 162 194 0.00 0.00 207.33 + 178 2 92.22 88.89 156.56 + 178 18 0.00 0.00 227.67 + 178 34 2.56 26.11 184.33 + 178 50 0.00 0.00 227.67 + 178 66 11.44 11.44 156.33 + 178 82 0.11 9.67 195.11 + 178 98 0.00 0.00 227.67 + 178 114 9.11 37.78 164.44 + 178 130 0.67 0.67 182.44 + 178 146 7.67 69.00 139.89 + 178 162 0.00 0.00 227.67 + 178 178 0.00 0.00 227.67 + 178 194 0.00 0.00 227.67 + 194 2 0.00 0.00 248.00 + 194 18 0.00 0.00 248.00 + 194 34 0.00 0.00 248.00 + 194 50 74.11 68.44 153.67 + 194 66 2.22 26.78 202.78 + 194 82 0.00 0.00 248.00 + 194 98 0.00 0.00 248.00 + 194 114 8.56 63.00 163.00 + 194 130 7.78 49.56 143.67 + 194 146 0.00 0.00 248.00 + 194 162 0.00 0.00 248.00 + 194 178 0.00 0.00 248.00 + 194 194 0.00 0.00 248.00 +... From 12980cc28b502a4febe327022ef56a57c578bc95 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 24 Jul 2026 13:07:31 -0400 Subject: [PATCH 045/100] add dump_modify keywords 'specular' and 'lightdir' for dump image The specular keyword sets the strength and exponent of the specular highlights independently instead of both being coupled to the single shiny factor. The lightdir keyword repositions the key, fill, or back light relative to the viewer; the light direction computation moves into Image::setup_lights() so dump_modify changes take effect also for static views, where the view parameters are computed only once. Default rendering is unchanged. --- doc/src/dump_image.rst | 35 +- src/GRAPHICS/dump_image.cpp | 41 ++ src/GRAPHICS/image.cpp | 56 +- src/GRAPHICS/image.h | 28 +- .../graphics/tests/dump-modify-lightdir.yaml | 603 ++++++++++++++++++ .../graphics/tests/dump-modify-specular.yaml | 603 ++++++++++++++++++ 6 files changed, 1330 insertions(+), 36 deletions(-) create mode 100644 unittest/graphics/tests/dump-modify-lightdir.yaml create mode 100644 unittest/graphics/tests/dump-modify-specular.yaml diff --git a/doc/src/dump_image.rst b/doc/src/dump_image.rst index 416c7f1e90e..3a4d0a3186e 100644 --- a/doc/src/dump_image.rst +++ b/doc/src/dump_image.rst @@ -132,7 +132,7 @@ Syntax dump_modify dump-ID keyword values ... * these keywords apply only to the *image* and *movie* styles and are documented on this page -* keyword = *acolor* or *adiam* or *amap* or *gmap* or *bmap* or *atrans* or *backcolor* or *backcolor2* or *bcolor* or *bdiam* or *btrans* or *bitrate* or *boxcolor* or *color* or *gtrans* or *lights* or *loadcolors* or *savecolors* or *framerate* or *axestrans* or *boxtrans* or *subboxtrans* or *ccolor* or *ctrans* or *fcolor* or *ftrans* +* keyword = *acolor* or *adiam* or *amap* or *gmap* or *bmap* or *atrans* or *backcolor* or *backcolor2* or *bcolor* or *bdiam* or *btrans* or *bitrate* or *boxcolor* or *color* or *gtrans* or *lights* or *lightdir* or *specular* or *loadcolors* or *savecolors* or *framerate* or *axestrans* or *boxtrans* or *subboxtrans* or *ccolor* or *ctrans* or *fcolor* or *ftrans* * see the :doc:`dump modify ` doc page for more general keywords .. parsed-literal:: @@ -195,6 +195,13 @@ Syntax transparency = transparency for visualized grid (value between 0 (invisible) and 1 (fully opaque)) *lights* args = ambient key fill back ambient key fill back = set light intensity value from 0.0 to 1.0 + *lightdir* args = light theta phi + light = *key* or *fill* or *back* = which light source to reposition + theta = angle above (positive) or below (negative) the view direction in degrees (-90 to 90) + phi = angle to the right (positive) or left (negative) of the view direction in degrees (-180 to 180) + *specular* args = intensity exponent + intensity = strength of the specular highlights from 0.0 to 1.0 + exponent = sharpness of the specular highlights (larger is sharper) *loadcolors* arg = filename filename = load color definitions, per-type colors, and lights from JSON format file *savecolors* arg = filename @@ -1297,6 +1304,30 @@ the main highlights. The *fill* light is a secondary light source that softens shadows created by the key light. The *back* light illuminates the scene from behind the camera to provide depth. +.. versionadded:: TBD + +The *lightdir* keyword repositions one of the directional light +sources: *key*, *fill*, or *back*. The two angles are set in degrees +relative to the viewing direction, so the lights stay fixed relative to +the camera when the view changes. A *theta* of 90 places the light +directly above the view direction, -90 directly below. A *phi* of 0 +places the light behind the camera, 90 to the right of the viewer, -90 +to the left, and 180 behind the scene facing the camera. The default +positions are theta/phi = 30/-45 for the *key* light, 0/30 for the +*fill* light, and 15/180 for the *back* light. + +.. versionadded:: TBD + +The *specular* keyword sets the strength and the sharpness of the +specular highlights independently from the *shiny* keyword of the dump +image command. The *intensity* value must be between 0.0 and 1.0; the +*exponent* value must be positive and determines the size of the +highlights: the larger it is, the smaller and sharper they become. +Values between 4 (dull) and a few hundred (polished) are typical. An +*sfactor* value of S set with the *shiny* keyword corresponds to +*specular* with intensity S and exponent 16*S. When the *specular* +keyword is used, the *shiny* setting is ignored. + ---------- .. versionadded:: 4Jul2026 @@ -1445,6 +1476,8 @@ The defaults for the dump_modify keywords specific to dump image and dump movie * subboxtrans = 1.0 * color = 140 color names are pre-defined as listed below * lights = 0.0 0.9 0.45 0.9 +* lightdir = key 30 -45, fill 0 30, back 15 180 +* specular = derived from the *shiny* keyword of the dump image command * bitrate = 2000 * framerate = 24 * gmap = min max cf 0.0 2 min blue max red diff --git a/src/GRAPHICS/dump_image.cpp b/src/GRAPHICS/dump_image.cpp index 269ff9d6e10..251c7f7df64 100644 --- a/src/GRAPHICS/dump_image.cpp +++ b/src/GRAPHICS/dump_image.cpp @@ -3023,6 +3023,47 @@ int DumpImage::modify_param(int narg, char **arg) return 5; } + if (strcmp(arg[0], "lightdir") == 0) { + if (narg < 4) utils::missing_cmd_args(FLERR, "dump_modify lightdir", error); + double theta = utils::numeric(FLERR, arg[2], false, lmp); + if ((theta < -90.0) || (theta > 90.0)) + error->all(FLERR, argoff + 2, "Illegal lightdir theta value {}", theta); + double phi = utils::numeric(FLERR, arg[3], false, lmp); + if ((phi < -180.0) || (phi > 180.0)) + error->all(FLERR, argoff + 3, "Illegal lightdir phi value {}", phi); + if (strcmp(arg[1], "key") == 0) { + image->keyLightTheta = DEG2RAD * theta; + image->keyLightPhi = DEG2RAD * phi; + } else if (strcmp(arg[1], "fill") == 0) { + image->fillLightTheta = DEG2RAD * theta; + image->fillLightPhi = DEG2RAD * phi; + } else if (strcmp(arg[1], "back") == 0) { + image->backLightTheta = DEG2RAD * theta; + image->backLightPhi = DEG2RAD * phi; + } else { + error->all(FLERR, argoff + 1, "Unknown lightdir light name {}", arg[1]); + } + + // recompute light directions since view parameters may not be recomputed again + + image->setup_lights(); + return 4; + } + + if (strcmp(arg[0], "specular") == 0) { + if (narg < 3) utils::missing_cmd_args(FLERR, "dump_modify specular", error); + double intensity = utils::numeric(FLERR, arg[1], false, lmp); + if ((intensity < 0.0) || (intensity > 1.0)) + error->all(FLERR, argoff + 1, "Illegal specular intensity value {}", intensity); + double hardness = utils::numeric(FLERR, arg[2], false, lmp); + if (hardness <= 0.0) + error->all(FLERR, argoff + 2, "Illegal specular exponent value {}", hardness); + image->specularIntensity = intensity; + image->specularHardness = hardness; + image->specularflag = 1; + return 3; + } + if (strcmp(arg[0], "savecolors") == 0) { if (narg < 2) utils::missing_cmd_args(FLERR, "dump_modify savecolors", error); diff --git a/src/GRAPHICS/image.cpp b/src/GRAPHICS/image.cpp index 47092c72701..34f928d608b 100644 --- a/src/GRAPHICS/image.cpp +++ b/src/GRAPHICS/image.cpp @@ -400,6 +400,10 @@ Image::Image(LAMMPS *lmp, int nmap_caller) : backLightColor[1] = 0.9; backLightColor[2] = 0.9; + specularflag = 0; + specularHardness = 16.0; + specularIntensity = 1.0; + // named colors rgbcolors = {{"aliceblue", {0.941, 0.973, 1.000}}, {"antiquewhite", {0.980, 0.922, 0.843}}, @@ -725,27 +729,14 @@ void Image::view_params(double boxxlo, double boxxhi, double boxylo, // light directions in terms of -camDir = z - keyLightDir[0] = cos(keyLightTheta) * sin(keyLightPhi); - keyLightDir[1] = sin(keyLightTheta); - keyLightDir[2] = cos(keyLightTheta) * cos(keyLightPhi); - - fillLightDir[0] = cos(fillLightTheta) * sin(fillLightPhi); - fillLightDir[1] = sin(fillLightTheta); - fillLightDir[2] = cos(fillLightTheta) * cos(fillLightPhi); - - backLightDir[0] = cos(backLightTheta) * sin(backLightPhi); - backLightDir[1] = sin(backLightTheta); - backLightDir[2] = cos(backLightTheta) * cos(backLightPhi); - - keyHalfDir[0] = 0 + keyLightDir[0]; - keyHalfDir[1] = 0 + keyLightDir[1]; - keyHalfDir[2] = 1 + keyLightDir[2]; - MathExtra::norm3(keyHalfDir); + setup_lights(); - // adjust shinyness of the reflection + // adjust shinyness of the reflection unless overridden with dump_modify specular - specularHardness = 16.0 * shiny; - specularIntensity = shiny; + if (!specularflag) { + specularHardness = 16.0 * shiny; + specularIntensity = shiny; + } // adjust strength of the SSAO @@ -764,6 +755,33 @@ void Image::view_params(double boxxlo, double boxxhi, double boxylo, tanPerPixel = -(maxdel / (double) height); } +/* ---------------------------------------------------------------------- + compute light directions from their theta/phi angles + the angles are relative to the viewer with z pointing at the camera: + theta > 0 moves a light above the view direction, phi > 0 to the right + called from view_params() and after changing angles with dump_modify +------------------------------------------------------------------------- */ + +void Image::setup_lights() +{ + keyLightDir[0] = cos(keyLightTheta) * sin(keyLightPhi); + keyLightDir[1] = sin(keyLightTheta); + keyLightDir[2] = cos(keyLightTheta) * cos(keyLightPhi); + + fillLightDir[0] = cos(fillLightTheta) * sin(fillLightPhi); + fillLightDir[1] = sin(fillLightTheta); + fillLightDir[2] = cos(fillLightTheta) * cos(fillLightPhi); + + backLightDir[0] = cos(backLightTheta) * sin(backLightPhi); + backLightDir[1] = sin(backLightTheta); + backLightDir[2] = cos(backLightTheta) * cos(backLightPhi); + + keyHalfDir[0] = 0 + keyLightDir[0]; + keyHalfDir[1] = 0 + keyLightDir[1]; + keyHalfDir[2] = 1 + keyLightDir[2]; + MathExtra::norm3(keyHalfDir); +} + /* ---------------------------------------------------------------------- initialize image to background color and depth buffer no need to init surfaceBuffer, since will be based on depth diff --git a/src/GRAPHICS/image.h b/src/GRAPHICS/image.h index 1b42d1cc14e..d41aaedf0c9 100644 --- a/src/GRAPHICS/image.h +++ b/src/GRAPHICS/image.h @@ -49,6 +49,17 @@ class Image : protected Pointers { double fillLightColor[3]; double backLightColor[3]; + double keyLightTheta; // light directions relative to the viewer (adjustable by caller) + double keyLightPhi; + double fillLightTheta; + double fillLightPhi; + double backLightTheta; + double backLightPhi; + + int specularflag; // 1 if specular settings override those derived from shiny + double specularHardness; // exponent of the specular highlight + double specularIntensity; // strength of the specular highlight + Image(class LAMMPS *, int); ~Image() override; void buffers(); @@ -59,6 +70,7 @@ class Image : protected Pointers { void write_TGA(FILE *, bool compressed = true); void write_PPM(FILE *); void view_params(double, double, double, double, double, double); + void setup_lights(); void draw_sphere(const double *, const double *, double, double opacity = 1.0); void draw_cube(const double *, const double *, double, double opacity = 1.0); @@ -114,22 +126,6 @@ class Image : protected Pointers { // constant view params double FOV; - //double ambientColor[3]; - - double keyLightTheta; - double keyLightPhi; - //double keyLightColor[3]; - - double fillLightTheta; - double fillLightPhi; - //double fillLightColor[3]; - - double backLightTheta; - double backLightPhi; - //double backLightColor[3]; - - double specularHardness; - double specularIntensity; double SSAORadius; int SSAOSamples; diff --git a/unittest/graphics/tests/dump-modify-lightdir.yaml b/unittest/graphics/tests/dump-modify-lightdir.yaml new file mode 100644 index 00000000000..5bcb593ac11 --- /dev/null +++ b/unittest/graphics/tests/dump-modify-lightdir.yaml @@ -0,0 +1,603 @@ +--- +lammps_version: 4 Jul 2026 +tags: graphics +date_generated: Fri Jul 24 13:07:12 2026 +epsilon_projection: 0.5 +epsilon_blocks: 2 +nprocs: 1 +prerequisites: | + atom full + pair lj/charmm/coul/charmm + bond harmonic + angle charmm + dihedral charmm + improper harmonic +setup_commands: | + units real + atom_style full + pair_style lj/charmm/coul/charmm 8.0 10.0 + bond_style harmonic + angle_style charmm + dihedral_style charmm + improper_style harmonic + read_data ${input_dir}/data.peptide + neighbor 2.0 bin + dump viz all image 1 ${imagefile} type type size 200 200 zoom 1.5 view 60 30 shiny 0.2 box yes 0.02 bond atom 0.3 + dump_modify viz backcolor gray lightdir key -60 45 lightdir fill 30 -120 +run_commands: | + run 0 +image_size: 200 200 +sampling: 3 16 +row_means: | + 108.26 113.86 109.97 + 107.00 114.14 112.53 + 103.53 107.63 108.41 + 108.43 109.81 109.56 + 108.00 109.76 111.15 + 109.56 112.23 112.19 + 112.47 115.02 113.95 + 115.89 118.61 115.19 + 115.06 118.09 115.64 + 113.01 114.88 113.10 + 110.55 110.94 108.53 + 111.69 114.49 110.86 + 102.33 107.77 104.68 + 89.36 94.08 92.17 + 80.98 87.95 85.59 + 84.86 96.56 94.85 + 86.10 104.73 103.89 + 81.50 97.91 97.78 + 84.26 94.14 93.20 + 83.53 90.67 94.00 + 75.66 82.18 89.77 + 70.98 81.04 85.69 + 67.64 81.32 87.22 + 70.78 89.50 96.12 + 73.12 93.88 100.44 + 73.81 91.44 93.39 + 78.38 92.31 93.25 + 75.68 88.72 91.53 + 64.72 82.28 86.70 + 64.61 78.67 83.20 + 62.52 78.42 85.62 + 60.21 75.50 84.58 + 63.77 77.27 83.33 + 66.50 81.32 84.21 + 64.27 84.13 88.56 + 67.50 92.34 94.62 + 74.58 93.99 95.95 + 68.17 83.38 89.53 + 60.47 76.05 81.79 + 58.26 77.53 81.16 + 55.93 74.86 78.66 + 53.60 73.14 78.29 + 47.58 67.66 74.14 + 55.65 72.70 79.37 + 57.07 79.02 82.56 + 54.24 72.12 75.93 + 48.67 63.22 67.83 + 43.06 62.07 67.91 + 43.41 64.53 72.19 + 39.73 60.72 72.73 + 49.06 65.53 72.77 + 54.02 69.58 74.84 + 44.31 66.30 71.63 + 45.96 67.72 75.11 + 48.54 71.61 80.89 + 51.88 68.29 73.95 + 58.38 75.35 71.61 + 63.76 80.41 76.24 + 65.00 83.83 83.27 + 55.77 72.50 79.10 + 46.88 60.59 67.95 + 45.56 59.25 67.88 + 43.03 57.51 64.19 + 45.60 56.53 63.23 + 46.20 64.93 70.57 + 54.04 81.08 84.04 + 53.94 82.37 83.08 + 51.29 69.47 70.03 + 49.58 67.77 70.58 + 56.33 74.33 78.15 + 54.54 73.25 80.64 + 50.67 62.06 69.17 + 47.89 60.66 68.52 + 41.34 54.91 69.72 + 41.84 61.72 71.76 + 41.15 62.56 67.87 + 41.86 65.17 69.04 + 42.52 66.03 73.20 + 49.37 69.38 78.50 + 53.51 69.79 82.64 + 51.34 68.31 70.39 + 49.64 68.73 69.97 + 46.27 70.09 74.16 + 47.33 71.62 77.43 + 51.70 70.88 81.12 + 55.20 71.42 79.30 + 52.84 74.55 79.02 + 51.84 75.64 80.03 + 36.41 63.52 69.92 + 33.77 59.77 69.89 + 35.41 61.95 73.24 + 37.34 57.66 71.34 + 36.05 59.23 74.61 + 42.61 69.92 80.39 + 45.15 75.11 83.77 + 43.37 70.84 81.72 + 41.53 63.90 72.04 + 47.48 67.89 73.47 + 53.77 75.01 84.20 + 55.18 80.25 93.37 + 57.02 81.94 89.60 + 53.24 70.95 79.68 + 47.59 62.70 72.12 + 37.22 53.52 63.85 + 36.76 54.35 63.65 + 33.28 64.84 72.78 + 36.29 71.00 80.00 + 37.67 63.83 75.50 + 36.77 65.92 76.55 + 41.05 66.88 79.36 + 46.37 66.23 84.22 + 46.55 58.34 81.75 + 41.98 53.87 68.64 + 41.20 64.94 71.41 + 38.19 70.74 74.28 + 40.63 73.67 77.31 + 42.66 69.97 78.39 + 42.71 66.72 74.03 + 47.63 69.86 76.02 + 52.63 76.11 78.65 + 55.66 79.44 87.81 + 53.22 71.42 84.27 + 40.70 60.95 72.48 + 35.46 56.62 66.39 + 34.13 58.16 67.87 + 40.24 68.30 80.32 + 38.49 66.37 78.91 + 37.07 65.25 75.03 + 38.13 65.08 74.45 + 41.15 64.39 72.15 + 48.13 74.89 80.70 + 48.30 73.30 81.22 + 48.40 71.95 78.97 + 52.88 78.16 87.74 + 61.95 85.06 95.04 + 52.30 73.06 85.86 + 45.72 61.81 69.02 + 48.65 70.20 73.74 + 49.07 75.68 79.95 + 40.76 66.90 71.30 + 44.68 61.10 70.97 + 42.36 61.56 75.22 + 44.57 71.22 87.12 + 42.26 71.67 84.33 + 47.66 73.45 83.42 + 49.99 74.94 83.77 + 55.52 79.50 84.34 + 53.22 72.09 77.47 + 52.48 70.17 75.86 + 57.05 75.75 80.89 + 59.66 76.94 82.25 + 59.92 82.90 89.77 + 56.95 77.33 80.69 + 50.65 72.54 74.33 + 44.25 65.59 69.81 + 44.55 66.31 73.59 + 46.81 71.04 79.64 + 54.25 82.47 90.36 + 64.83 88.98 95.80 + 69.22 85.61 96.78 + 71.55 86.33 94.56 + 73.87 90.33 92.86 + 73.33 89.36 88.96 + 67.88 85.21 87.41 + 65.91 80.72 81.41 + 63.73 76.62 75.91 + 65.88 80.11 83.06 + 69.27 86.00 92.06 + 76.58 96.24 99.88 + 77.90 95.27 100.49 + 79.31 85.36 92.65 + 71.03 79.51 83.71 + 68.66 83.32 83.05 + 73.89 91.78 93.58 + 81.47 102.14 105.92 + 92.00 107.23 110.19 + 98.26 105.44 104.11 + 97.75 105.08 103.26 + 94.89 103.27 102.19 + 95.47 103.58 102.29 + 96.18 105.47 104.69 + 97.03 103.74 103.35 + 95.80 103.44 101.78 + 97.80 108.89 103.97 + 100.75 111.26 106.78 + 102.64 109.91 105.98 + 104.94 108.49 105.74 + 103.95 106.64 106.53 + 101.62 104.09 103.90 + 104.81 108.80 108.19 + 109.10 114.52 112.02 + 109.96 116.30 113.09 + 110.45 113.95 110.38 + 106.02 108.47 103.75 + 103.59 107.43 103.49 + 103.64 109.39 106.88 + 110.31 114.98 112.73 + 110.92 116.03 115.03 + 113.51 117.78 114.83 + 118.87 121.63 116.50 +col_means: | + 115.64 117.54 115.14 + 114.62 117.39 113.80 + 115.00 118.38 115.28 + 111.64 115.25 112.83 + 105.61 108.86 107.06 + 102.25 106.14 106.98 + 98.68 105.39 105.41 + 95.17 104.04 102.79 + 94.51 101.66 101.10 + 92.62 99.45 100.77 + 88.05 96.73 98.92 + 90.66 98.86 100.03 + 92.28 99.95 103.28 + 91.51 98.64 100.96 + 89.17 97.67 99.83 + 91.77 102.83 103.58 + 90.61 103.02 102.72 + 84.64 95.26 97.47 + 84.64 96.36 98.09 + 81.31 93.42 96.75 + 79.53 91.00 96.59 + 80.28 91.31 95.48 + 80.47 89.37 94.13 + 73.35 83.97 89.68 + 63.98 78.38 85.72 + 64.02 79.89 86.25 + 68.08 83.81 88.84 + 72.06 86.12 91.47 + 76.57 90.47 91.40 + 71.61 85.90 87.94 + 69.69 84.77 88.35 + 69.84 86.11 90.24 + 68.67 88.22 90.67 + 71.27 88.24 90.86 + 78.08 92.86 97.61 + 67.06 83.27 85.97 + 68.08 80.84 85.48 + 66.94 81.33 87.22 + 63.23 81.61 87.09 + 63.25 82.69 89.01 + 68.47 86.56 91.94 + 68.19 83.17 86.19 + 65.06 79.72 82.12 + 60.80 78.56 82.06 + 54.08 76.36 79.93 + 54.06 76.44 80.16 + 56.30 76.57 83.60 + 55.66 72.55 82.56 + 55.06 71.29 81.73 + 56.39 71.55 82.67 + 60.93 79.98 84.67 + 59.47 82.09 84.53 + 57.21 78.56 81.70 + 59.74 80.83 84.39 + 60.63 82.73 88.34 + 61.85 77.36 85.81 + 61.28 76.47 85.22 + 59.17 76.33 85.02 + 62.73 79.64 87.93 + 52.27 74.47 82.11 + 54.92 75.28 82.01 + 50.23 71.53 80.34 + 46.44 68.01 79.08 + 39.27 61.03 73.17 + 36.84 60.97 70.55 + 38.56 65.42 74.89 + 39.82 63.62 74.46 + 43.20 66.95 76.41 + 50.54 72.38 80.56 + 47.45 67.63 78.36 + 50.69 71.05 82.35 + 43.87 72.06 80.59 + 37.93 66.20 69.70 + 41.73 69.69 73.75 + 43.08 70.14 75.08 + 46.95 72.39 82.05 + 47.48 67.89 80.69 + 42.30 64.54 75.22 + 38.27 63.58 70.14 + 38.98 64.60 74.09 + 41.09 68.03 76.81 + 37.93 67.94 76.17 + 41.70 69.59 75.08 + 42.13 71.44 77.69 + 45.05 68.56 76.94 + 46.77 67.09 78.84 + 42.93 64.03 75.66 + 47.77 66.91 80.33 + 51.47 68.67 85.28 + 48.98 67.45 82.22 + 54.09 71.99 84.88 + 58.08 76.17 86.58 + 56.29 78.23 82.97 + 55.85 80.88 78.89 + 53.20 77.98 74.25 + 50.77 72.58 74.82 + 53.95 70.80 77.92 + 55.26 70.84 78.87 + 53.16 71.12 82.48 + 50.09 68.26 79.20 + 39.85 63.81 73.44 + 36.98 62.24 71.68 + 39.78 63.56 75.47 + 41.93 66.73 79.11 + 37.59 63.05 73.98 + 46.74 75.88 80.90 + 46.12 71.92 78.00 + 46.99 70.78 73.48 + 48.17 67.11 72.22 + 46.98 63.06 71.67 + 42.12 62.37 70.99 + 40.62 66.81 75.41 + 37.34 63.12 73.17 + 38.03 64.53 74.17 + 31.91 57.14 69.00 + 33.69 57.13 71.70 + 39.28 63.50 76.78 + 40.90 69.69 79.91 + 40.24 63.78 77.30 + 46.25 69.11 80.98 + 54.64 75.06 86.56 + 55.47 75.00 87.19 + 56.10 71.77 83.28 + 53.04 69.71 81.43 + 43.99 64.31 73.98 + 43.45 66.75 73.91 + 57.47 59.76 34.77 + 116.57 112.05 50.48 + 154.97 146.60 59.03 + 47.17 68.12 80.03 + 51.14 69.32 80.18 + 43.94 61.58 73.33 + 42.35 61.52 72.08 + 38.70 60.60 70.59 + 44.05 69.96 77.78 + 51.77 72.61 82.69 + 52.10 74.28 84.50 + 52.33 68.46 80.56 + 49.84 66.19 74.25 + 46.92 70.71 76.41 + 46.27 69.63 77.11 + 44.53 69.89 76.69 + 42.60 66.25 73.26 + 44.59 69.06 78.00 + 42.67 67.18 75.19 + 42.20 70.38 76.29 + 43.83 70.61 79.62 + 44.02 69.61 77.72 + 42.13 65.53 72.48 + 42.80 62.60 73.32 + 47.62 68.14 77.35 + 48.91 69.67 74.90 + 51.86 75.22 80.25 + 55.66 78.22 81.14 + 55.95 78.81 83.44 + 51.33 73.03 78.60 + 48.67 66.58 76.36 + 50.01 68.56 80.30 + 54.19 74.78 79.44 + 58.73 79.66 81.70 + 58.57 81.04 83.28 + 64.97 84.44 87.86 + 62.69 79.61 85.69 + 63.83 74.76 82.27 + 55.94 69.50 77.34 + 57.40 73.55 77.41 + 61.77 75.91 82.86 + 64.23 80.85 87.89 + 67.06 83.81 88.91 + 74.33 90.42 94.10 + 71.10 88.22 91.37 + 70.79 87.86 91.53 + 73.93 89.89 93.26 + 75.47 88.28 92.81 + 82.23 93.01 96.02 + 83.26 93.00 97.56 + 82.64 92.80 96.55 + 88.59 97.74 102.03 + 94.07 100.39 101.05 + 87.80 97.17 97.11 + 89.14 99.40 99.35 + 84.21 97.16 97.61 + 82.19 95.83 97.39 + 83.51 96.20 97.27 + 86.94 98.78 101.66 + 89.78 99.42 99.49 + 93.44 101.65 99.75 + 91.52 97.67 99.69 + 91.93 97.31 102.06 + 93.44 100.33 103.21 + 95.73 102.94 102.85 + 99.31 106.44 105.25 + 104.41 109.42 109.50 + 110.45 115.67 113.52 + 110.14 115.18 112.61 + 112.28 115.11 113.12 + 112.91 114.58 112.39 + 113.44 115.33 112.70 + 113.89 116.08 114.16 + 117.86 118.41 116.67 +sample_blocks: | + 2 2 128.00 128.00 128.00 + 2 18 128.00 128.00 128.00 + 2 34 128.00 128.00 128.00 + 2 50 53.44 47.89 17.33 + 2 66 128.00 128.00 128.00 + 2 82 71.78 81.78 81.78 + 2 98 100.56 111.22 111.22 + 2 114 19.78 19.78 60.78 + 2 130 131.89 129.33 115.33 + 2 146 91.67 90.67 85.44 + 2 162 128.00 128.00 128.00 + 2 178 128.00 128.00 128.00 + 2 194 128.00 128.00 128.00 + 18 2 128.00 128.00 128.00 + 18 18 128.00 128.00 128.00 + 18 34 130.11 117.22 48.44 + 18 50 128.00 128.00 128.00 + 18 66 128.00 128.00 128.00 + 18 82 14.22 25.89 55.44 + 18 98 24.33 84.11 103.11 + 18 114 51.44 51.44 78.78 + 18 130 15.56 20.67 30.33 + 18 146 92.56 125.22 125.22 + 18 162 128.00 128.00 128.00 + 18 178 9.22 26.22 38.33 + 18 194 67.00 57.67 8.22 + 34 2 128.00 128.00 128.00 + 34 18 44.33 51.33 51.33 + 34 34 128.00 128.00 128.00 + 34 50 25.89 58.78 101.44 + 34 66 128.00 128.00 128.00 + 34 82 60.33 125.00 125.00 + 34 98 128.00 128.00 128.00 + 34 114 4.33 10.44 23.67 + 34 130 21.78 79.00 79.00 + 34 146 102.11 102.11 118.89 + 34 162 113.78 118.00 118.00 + 34 178 9.44 29.22 29.22 + 34 194 128.00 128.00 128.00 + 50 2 94.22 87.44 50.44 + 50 18 128.00 128.00 128.00 + 50 34 5.56 5.56 25.56 + 50 50 1.78 14.89 14.89 + 50 66 15.00 28.44 60.78 + 50 82 16.89 60.67 72.00 + 50 98 49.78 107.11 107.11 + 50 114 12.11 22.89 54.67 + 50 130 43.78 52.22 56.11 + 50 146 22.33 84.56 88.78 + 50 162 10.44 35.11 35.11 + 50 178 128.00 128.00 128.00 + 50 194 128.00 128.00 128.00 + 66 2 128.00 128.00 128.00 + 66 18 26.89 95.33 95.33 + 66 34 59.33 59.33 75.11 + 66 50 21.89 86.33 86.33 + 66 66 16.56 45.33 36.11 + 66 82 17.78 20.78 69.11 + 66 98 14.67 45.00 50.89 + 66 114 9.00 43.11 53.89 + 66 130 21.44 89.00 89.00 + 66 146 67.89 102.22 99.67 + 66 162 114.11 123.00 123.00 + 66 178 83.11 120.56 125.56 + 66 194 99.56 99.56 99.56 + 82 2 128.00 128.00 128.00 + 82 18 85.89 85.89 93.33 + 82 34 101.56 118.00 118.00 + 82 50 7.11 31.22 50.89 + 82 66 12.44 43.00 53.67 + 82 82 30.00 107.78 107.78 + 82 98 43.89 50.00 50.00 + 82 114 56.22 49.11 16.11 + 82 130 38.89 35.33 15.44 + 82 146 8.78 34.78 41.78 + 82 162 71.22 124.56 124.56 + 82 178 128.00 128.00 128.00 + 82 194 128.00 128.00 128.00 + 98 2 128.00 128.00 128.00 + 98 18 128.00 128.00 128.00 + 98 34 32.00 45.89 62.44 + 98 50 63.22 64.44 87.11 + 98 66 12.22 55.33 57.89 + 98 82 6.67 23.00 46.56 + 98 98 21.89 76.33 76.33 + 98 114 5.44 29.67 29.67 + 98 130 10.78 19.56 49.44 + 98 146 16.67 50.67 50.67 + 98 162 16.56 39.44 39.44 + 98 178 85.33 85.33 86.22 + 98 194 128.00 128.00 128.00 + 114 2 128.00 128.00 128.00 + 114 18 46.00 112.44 135.56 + 114 34 86.89 92.67 98.67 + 114 50 16.67 57.67 57.67 + 114 66 23.33 105.33 105.33 + 114 82 10.89 43.89 43.89 + 114 98 1.67 14.67 20.22 + 114 114 29.78 39.33 45.33 + 114 130 11.33 64.00 64.67 + 114 146 4.33 17.33 22.89 + 114 162 6.22 41.67 42.11 + 114 178 101.44 108.78 108.78 + 114 194 128.00 128.00 128.00 + 130 2 128.00 128.00 128.00 + 130 18 59.56 82.22 82.22 + 130 34 86.22 94.56 94.56 + 130 50 34.67 97.67 95.67 + 130 66 15.67 55.11 55.11 + 130 82 104.89 129.56 129.56 + 130 98 2.00 21.00 21.00 + 130 114 25.78 92.78 97.44 + 130 130 48.56 52.78 70.67 + 130 146 25.89 60.22 102.89 + 130 162 6.89 12.89 26.78 + 130 178 128.00 128.00 128.00 + 130 194 128.00 128.00 128.00 + 146 2 128.00 128.00 128.00 + 146 18 12.67 21.22 63.89 + 146 34 26.56 108.22 108.22 + 146 50 16.33 20.78 62.44 + 146 66 0.78 19.89 29.67 + 146 82 113.78 119.56 119.56 + 146 98 8.44 27.11 31.00 + 146 114 44.89 58.33 106.78 + 146 130 21.78 86.11 115.22 + 146 146 32.67 91.89 105.67 + 146 162 13.56 13.56 43.00 + 146 178 78.00 78.00 105.78 + 146 194 79.22 77.89 71.33 + 162 2 128.00 128.00 128.00 + 162 18 22.89 35.22 38.11 + 162 34 85.44 92.33 98.56 + 162 50 128.00 128.00 128.00 + 162 66 40.44 43.00 110.78 + 162 82 71.22 76.78 76.78 + 162 98 114.00 120.56 120.56 + 162 114 63.22 93.89 93.89 + 162 130 100.56 107.44 107.44 + 162 146 45.56 101.33 101.33 + 162 162 5.67 24.89 30.33 + 162 178 128.00 128.00 128.00 + 162 194 128.00 128.00 128.00 + 178 2 59.44 57.44 45.56 + 178 18 128.00 128.00 128.00 + 178 34 61.89 83.89 83.89 + 178 50 128.00 128.00 128.00 + 178 66 11.89 11.89 39.22 + 178 82 92.11 123.00 123.00 + 178 98 128.00 128.00 128.00 + 178 114 17.78 59.00 68.89 + 178 130 77.78 77.78 102.22 + 178 146 15.89 59.22 59.22 + 178 162 128.00 128.00 128.00 + 178 178 128.00 128.00 128.00 + 178 194 128.00 128.00 128.00 + 194 2 128.00 128.00 128.00 + 194 18 128.00 128.00 128.00 + 194 34 128.00 128.00 128.00 + 194 50 107.78 99.00 50.78 + 194 66 73.67 81.56 81.56 + 194 82 128.00 128.00 128.00 + 194 98 128.00 128.00 128.00 + 194 114 22.89 56.33 56.33 + 194 130 19.22 71.56 77.89 + 194 146 128.00 128.00 128.00 + 194 162 128.00 128.00 128.00 + 194 178 128.00 128.00 128.00 + 194 194 128.00 128.00 128.00 +... diff --git a/unittest/graphics/tests/dump-modify-specular.yaml b/unittest/graphics/tests/dump-modify-specular.yaml new file mode 100644 index 00000000000..fce4dec3866 --- /dev/null +++ b/unittest/graphics/tests/dump-modify-specular.yaml @@ -0,0 +1,603 @@ +--- +lammps_version: 4 Jul 2026 +tags: graphics +date_generated: Fri Jul 24 13:07:11 2026 +epsilon_projection: 0.5 +epsilon_blocks: 2 +nprocs: 1 +prerequisites: | + atom full + pair lj/charmm/coul/charmm + bond harmonic + angle charmm + dihedral charmm + improper harmonic +setup_commands: | + units real + atom_style full + pair_style lj/charmm/coul/charmm 8.0 10.0 + bond_style harmonic + angle_style charmm + dihedral_style charmm + improper_style harmonic + read_data ${input_dir}/data.peptide + neighbor 2.0 bin + dump viz all image 1 ${imagefile} type type size 200 200 zoom 1.5 view 60 30 shiny 0.2 box yes 0.02 bond atom 0.3 + dump_modify viz backcolor gray specular 1.0 150 +run_commands: | + run 0 +image_size: 200 200 +sampling: 3 16 +row_means: | + 115.03 123.65 114.73 + 111.16 118.49 116.19 + 111.78 117.81 117.66 + 117.19 121.39 117.17 + 115.44 119.86 113.70 + 116.92 121.94 113.60 + 120.45 124.65 113.83 + 124.19 127.97 116.96 + 123.92 126.56 115.99 + 120.81 125.67 115.84 + 120.66 126.95 117.49 + 121.26 127.14 117.78 + 109.54 120.46 113.21 + 97.91 116.58 113.17 + 90.33 119.38 115.39 + 88.78 116.69 109.70 + 87.61 108.11 100.28 + 86.03 100.72 102.30 + 91.78 106.06 111.65 + 85.45 105.50 113.61 + 72.64 97.01 112.44 + 71.15 103.17 116.76 + 65.84 100.16 112.78 + 67.51 99.93 107.69 + 69.04 99.93 101.73 + 72.08 102.53 104.37 + 80.13 106.58 111.68 + 73.75 101.66 110.44 + 64.55 92.73 107.66 + 62.75 89.80 108.56 + 59.47 87.66 103.78 + 57.82 88.81 101.53 + 62.67 98.69 104.94 + 65.03 103.10 107.75 + 61.27 99.34 105.85 + 63.33 95.58 100.02 + 70.67 97.89 101.12 + 66.54 97.20 104.42 + 58.91 96.65 104.78 + 55.99 96.45 105.94 + 54.47 93.20 104.00 + 56.35 91.89 100.80 + 48.47 87.91 100.17 + 57.44 88.69 95.62 + 55.71 88.30 88.75 + 50.38 90.77 95.84 + 48.70 90.05 107.69 + 38.35 82.69 105.01 + 39.05 79.44 102.22 + 43.98 83.89 101.41 + 52.00 91.51 101.49 + 58.91 93.64 103.03 + 47.54 85.39 92.43 + 50.55 87.68 91.22 + 54.87 85.99 88.11 + 61.55 97.04 95.23 + 66.03 104.59 99.74 + 66.00 104.83 102.83 + 66.93 99.62 100.39 + 64.88 91.75 98.14 + 58.13 86.00 98.94 + 57.72 84.47 92.80 + 57.80 91.84 96.76 + 56.06 99.17 100.24 + 51.14 96.94 94.14 + 49.59 92.12 90.94 + 56.34 93.06 92.23 + 56.75 95.82 104.97 + 54.11 95.69 102.75 + 61.69 90.74 99.75 + 53.93 78.94 90.36 + 54.35 76.59 91.05 + 50.16 76.47 95.96 + 44.60 78.98 95.38 + 40.70 88.44 95.16 + 43.22 93.45 99.02 + 42.76 83.15 96.81 + 44.12 80.67 96.84 + 50.07 82.77 94.39 + 56.65 92.86 96.12 + 56.60 101.39 100.50 + 54.92 100.06 104.56 + 45.88 84.64 98.45 + 49.34 86.12 97.39 + 51.47 85.38 96.75 + 50.25 91.22 102.39 + 45.41 94.53 106.25 + 45.20 91.93 106.02 + 27.61 81.72 100.78 + 24.79 76.34 99.39 + 25.14 76.47 99.61 + 28.50 75.52 102.44 + 25.46 75.02 98.03 + 32.66 82.31 98.77 + 34.18 83.19 98.55 + 33.30 80.25 98.99 + 34.78 81.86 103.68 + 42.41 89.91 109.67 + 44.48 87.56 107.58 + 43.70 77.92 97.89 + 49.26 86.06 104.31 + 47.27 80.42 106.27 + 41.41 81.96 108.45 + 31.66 84.05 107.67 + 31.23 88.29 111.93 + 21.01 79.27 99.80 + 23.09 70.79 91.45 + 27.07 69.64 97.23 + 26.75 65.14 97.25 + 33.58 65.28 100.90 + 41.57 68.97 96.06 + 40.55 70.66 98.74 + 36.23 90.13 105.09 + 36.20 97.32 107.40 + 29.60 85.34 97.03 + 28.42 79.35 95.81 + 35.94 78.18 94.33 + 39.12 89.55 98.40 + 40.37 83.37 95.66 + 42.17 81.58 100.27 + 44.57 77.97 99.67 + 45.15 80.69 102.65 + 32.50 78.20 102.28 + 27.35 78.34 105.66 + 24.85 76.29 100.50 + 29.16 73.87 96.52 + 30.48 75.95 94.17 + 29.13 77.06 95.13 + 28.06 81.08 94.59 + 32.54 86.69 104.34 + 41.66 89.03 101.84 + 40.09 89.31 101.59 + 40.48 86.34 102.84 + 44.97 83.73 101.70 + 51.37 83.97 101.50 + 43.85 86.64 99.05 + 44.74 95.56 106.43 + 45.08 97.70 108.67 + 40.91 86.02 100.47 + 38.76 77.18 97.44 + 43.45 79.61 106.62 + 32.10 77.39 103.08 + 33.84 76.52 95.04 + 30.20 78.03 93.22 + 42.05 85.94 99.53 + 44.36 88.56 96.84 + 53.83 89.45 97.91 + 53.20 89.03 97.69 + 52.35 92.70 104.02 + 52.60 90.25 103.77 + 51.44 93.17 107.12 + 53.21 93.94 103.10 + 51.69 94.97 106.92 + 46.33 89.07 104.12 + 41.16 88.93 106.70 + 37.83 85.75 99.16 + 38.24 83.42 99.81 + 44.20 82.84 98.11 + 55.90 82.90 98.78 + 60.36 88.80 102.28 + 67.62 98.14 104.58 + 72.89 104.94 109.89 + 72.11 108.67 107.89 + 67.29 105.91 105.83 + 66.72 100.95 106.89 + 63.88 100.44 109.92 + 64.44 100.14 108.67 + 64.72 93.52 101.06 + 72.62 95.86 100.18 + 74.11 94.95 99.03 + 77.91 101.80 111.96 + 71.41 105.11 113.42 + 68.06 106.83 113.35 + 70.80 102.81 107.03 + 78.05 99.73 99.92 + 88.78 104.66 103.99 + 99.62 117.27 115.06 + 99.03 119.08 117.13 + 100.09 116.18 114.67 + 103.22 114.65 112.37 + 98.06 111.16 107.28 + 102.73 117.56 107.56 + 102.45 121.91 109.50 + 105.12 122.61 110.53 + 106.23 119.93 110.98 + 107.11 117.42 111.89 + 111.82 115.95 111.92 + 110.81 115.73 111.31 + 107.76 115.87 110.71 + 112.50 119.56 111.10 + 115.43 122.10 111.47 + 117.00 121.13 109.90 + 118.16 120.78 110.67 + 115.11 123.71 114.46 + 110.95 120.49 113.83 + 110.08 118.41 112.89 + 111.63 120.54 115.28 + 114.34 122.03 115.50 + 122.25 125.72 113.03 + 127.48 128.49 115.01 +col_means: | + 124.34 129.10 119.53 + 121.42 128.28 117.69 + 122.81 128.41 117.23 + 118.72 125.58 118.16 + 110.42 120.00 117.72 + 107.33 118.42 119.01 + 102.77 118.86 118.50 + 100.45 118.34 113.88 + 99.19 114.57 112.42 + 98.38 114.06 113.79 + 94.56 109.98 113.97 + 92.52 105.66 109.25 + 95.74 105.78 107.70 + 96.06 110.69 111.03 + 94.38 110.37 108.78 + 93.97 110.75 107.25 + 94.94 115.52 109.97 + 89.23 111.57 110.00 + 83.98 105.67 110.53 + 82.73 104.44 110.95 + 82.54 104.05 111.71 + 79.72 100.39 108.66 + 82.04 100.71 110.08 + 75.65 96.77 108.82 + 65.92 92.94 107.22 + 62.63 94.16 108.57 + 66.56 93.50 103.78 + 70.97 93.94 103.73 + 76.80 99.03 101.91 + 74.25 105.00 108.74 + 71.89 104.89 112.58 + 69.92 104.87 110.62 + 67.89 101.48 102.39 + 72.09 101.12 104.81 + 78.53 100.20 108.45 + 66.61 93.04 103.44 + 70.78 97.41 106.81 + 70.16 104.56 113.22 + 64.08 101.56 108.83 + 59.93 93.68 102.38 + 68.43 95.18 102.36 + 70.12 100.21 107.58 + 64.86 100.18 109.23 + 60.59 98.52 106.83 + 54.76 101.08 105.54 + 53.05 98.39 104.86 + 53.03 87.87 101.84 + 55.02 83.81 101.97 + 53.74 82.84 102.94 + 52.89 83.41 99.00 + 61.35 98.83 103.31 + 59.78 101.44 103.64 + 57.02 96.87 104.32 + 57.23 95.80 105.42 + 57.29 92.96 105.39 + 59.49 88.08 105.00 + 58.87 86.59 103.17 + 59.27 91.55 103.46 + 59.23 96.75 107.97 + 48.10 86.23 98.14 + 53.80 88.16 104.03 + 47.98 90.53 106.93 + 40.66 91.25 110.64 + 33.17 84.55 103.22 + 31.83 85.34 103.53 + 32.21 82.19 102.30 + 34.35 81.14 98.31 + 37.96 83.33 96.52 + 47.73 91.30 103.30 + 44.03 85.94 101.38 + 47.29 89.75 103.09 + 40.16 90.44 100.84 + 34.67 88.78 98.36 + 33.51 88.99 99.51 + 34.12 84.96 95.33 + 39.67 85.50 101.81 + 41.40 77.78 99.82 + 36.41 78.51 99.73 + 36.35 89.21 104.53 + 33.55 90.39 106.75 + 34.00 89.08 102.89 + 30.98 89.55 99.44 + 37.18 96.55 105.61 + 35.66 92.81 104.07 + 36.82 83.75 103.24 + 41.37 78.92 102.78 + 39.81 79.93 102.28 + 41.76 76.88 102.31 + 44.94 78.50 102.44 + 43.92 74.44 98.04 + 49.59 79.02 97.07 + 56.12 88.36 100.56 + 55.01 99.23 103.33 + 55.97 103.72 101.78 + 50.94 97.99 94.09 + 52.31 98.42 101.23 + 55.76 91.30 105.25 + 50.20 82.11 100.36 + 54.63 83.80 100.56 + 48.43 88.47 102.44 + 36.27 88.97 103.48 + 34.72 82.04 100.91 + 33.94 78.20 98.08 + 34.51 79.39 96.20 + 30.38 80.31 91.66 + 43.37 91.01 95.99 + 42.60 88.03 97.06 + 45.46 86.86 97.57 + 47.99 83.73 94.60 + 47.22 83.94 97.17 + 41.97 82.40 96.25 + 33.69 81.23 95.17 + 29.33 79.70 102.26 + 31.14 82.81 101.75 + 25.30 76.42 101.42 + 25.76 74.65 101.99 + 33.12 81.16 104.23 + 33.82 77.82 97.56 + 31.91 74.89 97.19 + 40.54 74.18 95.25 + 49.66 79.25 101.20 + 50.60 83.09 101.73 + 51.05 80.55 98.56 + 47.77 86.06 103.86 + 42.56 86.35 101.14 + 38.98 88.92 102.31 + 104.92 105.33 44.33 + 115.20 117.43 45.02 + 83.76 90.53 43.41 + 41.07 76.13 99.00 + 46.12 81.74 103.68 + 40.54 79.04 105.75 + 38.76 84.54 105.61 + 33.10 86.74 104.72 + 40.72 87.06 98.28 + 49.85 82.80 100.96 + 49.26 84.73 100.17 + 51.69 85.19 102.55 + 50.44 90.52 101.92 + 47.09 94.72 104.38 + 42.95 88.97 99.94 + 40.87 88.81 97.89 + 41.20 87.19 99.62 + 40.84 90.71 103.58 + 37.79 88.33 99.34 + 38.35 88.00 94.30 + 38.85 84.12 97.72 + 41.26 86.53 99.17 + 39.54 80.74 98.70 + 40.50 76.28 99.73 + 45.41 84.99 101.34 + 48.41 89.47 97.21 + 51.27 96.33 102.66 + 52.64 95.11 100.36 + 54.47 93.33 101.14 + 47.77 87.64 98.92 + 46.64 84.11 99.81 + 50.23 85.94 96.12 + 53.45 94.50 101.25 + 60.62 104.48 106.06 + 57.34 99.03 103.17 + 61.59 96.47 103.95 + 58.52 87.75 102.31 + 66.03 94.09 105.28 + 59.90 91.67 103.68 + 61.90 98.95 106.88 + 62.92 96.01 105.05 + 64.49 95.79 101.06 + 68.14 94.41 99.83 + 73.73 97.69 103.92 + 70.69 100.30 106.52 + 70.51 98.58 107.64 + 72.71 96.07 102.55 + 78.10 98.70 104.77 + 86.86 106.92 112.19 + 83.44 101.22 112.16 + 82.31 99.95 110.48 + 89.91 102.83 108.02 + 98.50 114.61 114.52 + 91.56 116.00 113.53 + 91.46 116.62 114.16 + 86.23 110.75 110.38 + 84.39 107.68 109.41 + 82.55 105.52 108.01 + 86.81 106.49 107.72 + 93.53 111.41 111.81 + 98.06 111.48 113.30 + 96.83 109.92 111.98 + 97.22 110.06 110.67 + 98.17 112.26 109.52 + 99.18 113.83 110.50 + 103.40 116.19 111.83 + 108.24 118.88 116.05 + 112.44 120.67 114.38 + 116.31 122.75 113.05 + 121.08 124.55 116.34 + 121.14 124.63 118.19 + 119.23 122.71 117.43 + 119.67 122.31 116.88 + 124.88 125.17 119.30 +sample_blocks: | + 2 2 128.00 128.00 128.00 + 2 18 128.00 128.00 128.00 + 2 34 128.00 128.00 128.00 + 2 50 162.67 139.00 14.22 + 2 66 128.00 128.00 128.00 + 2 82 82.33 141.89 141.89 + 2 98 99.56 113.56 113.56 + 2 114 2.78 2.78 123.22 + 2 130 121.78 120.56 113.78 + 2 146 166.00 155.22 85.33 + 2 162 128.00 128.00 128.00 + 2 178 128.00 128.00 128.00 + 2 194 128.00 128.00 128.00 + 18 2 128.00 128.00 128.00 + 18 18 128.00 128.00 128.00 + 18 34 109.33 98.89 42.67 + 18 50 128.00 128.00 128.00 + 18 66 128.00 128.00 128.00 + 18 82 0.00 2.33 93.44 + 18 98 0.00 58.22 73.89 + 18 114 48.22 48.22 120.33 + 18 130 14.33 76.44 133.00 + 18 146 85.33 95.22 95.22 + 18 162 128.00 128.00 128.00 + 18 178 15.11 100.89 142.78 + 18 194 203.00 179.89 18.67 + 34 2 128.00 128.00 128.00 + 34 18 44.56 134.44 134.44 + 34 34 128.00 128.00 128.00 + 34 50 0.00 58.11 78.67 + 34 66 128.00 128.00 128.00 + 34 82 42.67 77.22 77.22 + 34 98 128.00 128.00 128.00 + 34 114 0.00 28.11 107.56 + 34 130 1.44 87.67 87.67 + 34 146 99.56 99.56 111.11 + 34 162 113.78 124.78 124.78 + 34 178 14.67 140.33 140.33 + 34 194 128.00 128.00 128.00 + 50 2 177.67 165.11 68.78 + 50 18 128.00 128.00 128.00 + 50 34 0.56 0.56 133.56 + 50 50 1.11 119.22 119.22 + 50 66 8.00 80.11 122.00 + 50 82 11.67 38.89 106.67 + 50 98 39.67 67.11 67.11 + 50 114 6.33 12.44 116.44 + 50 130 73.78 124.89 154.78 + 50 146 0.00 46.33 87.67 + 50 162 0.00 106.78 106.78 + 50 178 128.00 128.00 128.00 + 50 194 128.00 128.00 128.00 + 66 2 128.00 128.00 128.00 + 66 18 0.00 88.67 88.67 + 66 34 56.89 56.89 122.56 + 66 50 0.00 78.22 78.22 + 66 66 127.67 143.00 51.33 + 66 82 0.00 40.78 77.78 + 66 98 0.00 42.44 93.67 + 66 114 1.22 28.89 104.89 + 66 130 0.11 89.67 89.67 + 66 146 81.22 99.11 78.67 + 66 162 113.78 113.78 113.78 + 66 178 71.11 87.44 92.44 + 66 194 99.56 123.11 123.11 + 82 2 128.00 128.00 128.00 + 82 18 85.33 85.33 128.00 + 82 34 99.56 110.44 110.44 + 82 50 1.44 71.11 96.33 + 82 66 0.00 78.00 104.89 + 82 82 0.00 83.89 83.89 + 82 98 42.67 120.11 120.11 + 82 114 160.89 157.33 49.33 + 82 130 160.33 143.33 20.44 + 82 146 10.78 96.56 118.22 + 82 162 56.89 84.22 84.22 + 82 178 128.00 128.00 128.00 + 82 194 128.00 128.00 128.00 + 98 2 128.00 128.00 128.00 + 98 18 128.00 128.00 128.00 + 98 34 28.44 80.78 100.00 + 98 50 56.89 62.22 101.11 + 98 66 7.78 103.89 118.67 + 98 82 0.00 40.33 93.33 + 98 98 0.00 92.33 92.33 + 98 114 2.89 126.56 126.56 + 98 130 0.00 34.67 102.00 + 98 146 2.78 121.78 121.78 + 98 162 14.22 121.67 121.67 + 98 178 85.33 85.33 119.56 + 98 194 128.00 128.00 128.00 + 114 2 128.00 128.00 128.00 + 114 18 14.22 55.22 68.89 + 114 34 85.33 96.33 102.56 + 114 50 22.33 128.33 128.33 + 114 66 0.00 67.33 67.33 + 114 82 0.56 119.89 119.89 + 114 98 3.33 57.89 120.22 + 114 114 28.44 67.89 124.78 + 114 130 0.00 65.67 78.33 + 114 146 0.11 32.56 107.89 + 114 162 0.00 48.44 78.00 + 114 178 99.56 115.44 115.44 + 114 194 128.00 128.00 128.00 + 130 2 128.00 128.00 128.00 + 130 18 56.89 93.44 93.44 + 130 34 85.33 116.67 116.67 + 130 50 38.56 86.33 65.89 + 130 66 1.11 114.78 114.78 + 130 82 99.56 104.44 104.44 + 130 98 2.33 120.56 120.56 + 130 114 0.00 76.44 84.33 + 130 130 77.11 91.00 48.00 + 130 146 3.11 52.78 84.33 + 130 162 0.00 26.78 106.22 + 130 178 128.00 128.00 128.00 + 130 194 128.00 128.00 128.00 + 146 2 128.00 128.00 128.00 + 146 18 0.00 14.11 77.78 + 146 34 0.00 62.67 62.67 + 146 50 0.00 13.22 90.11 + 146 66 0.22 75.67 118.56 + 146 82 113.78 126.00 126.00 + 146 98 0.00 94.44 109.33 + 146 114 28.44 33.11 68.78 + 146 130 0.00 29.44 52.33 + 146 146 14.22 64.56 68.22 + 146 162 1.56 1.56 117.22 + 146 178 71.11 71.11 103.56 + 146 194 173.22 163.22 75.56 + 162 2 128.00 128.00 128.00 + 162 18 28.44 94.22 89.44 + 162 34 85.33 105.33 118.00 + 162 50 128.00 128.00 128.00 + 162 66 14.22 20.00 80.67 + 162 82 71.11 111.11 111.11 + 162 98 113.78 118.22 118.22 + 162 114 56.89 92.00 92.00 + 162 130 99.56 110.89 110.89 + 162 146 28.44 78.78 78.78 + 162 162 0.00 67.67 93.56 + 162 178 128.00 128.00 128.00 + 162 194 128.00 128.00 128.00 + 178 2 208.00 190.89 68.00 + 178 18 128.00 128.00 128.00 + 178 34 56.89 99.89 99.89 + 178 50 128.00 128.00 128.00 + 178 66 0.00 0.00 104.78 + 178 82 85.33 102.44 102.44 + 178 98 128.00 128.00 128.00 + 178 114 0.00 48.33 104.44 + 178 130 71.11 71.11 101.56 + 178 146 0.00 88.56 88.56 + 178 162 128.00 128.00 128.00 + 178 178 128.00 128.00 128.00 + 178 194 128.00 128.00 128.00 + 194 2 128.00 128.00 128.00 + 194 18 128.00 128.00 128.00 + 194 34 128.00 128.00 128.00 + 194 50 155.44 142.11 53.33 + 194 66 71.11 108.56 108.56 + 194 82 128.00 128.00 128.00 + 194 98 128.00 128.00 128.00 + 194 114 15.00 95.56 95.56 + 194 130 0.00 59.56 86.56 + 194 146 128.00 128.00 128.00 + 194 162 128.00 128.00 128.00 + 194 178 128.00 128.00 128.00 + 194 194 128.00 128.00 128.00 +... From 9160777d76008fab724671b658e2f11ab412f36d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 24 Jul 2026 13:10:14 -0400 Subject: [PATCH 046/100] add dump_modify keyword 'gamma' for dump image gamma correction Sum the light contributions per pixel linearly as before, then raise the result to 1/gamma before quantizing to 8-bit color values. Values larger than 1.0 (typical display gamma is 2.2) recover shading detail on the dimly lit side of objects. Applies only to rendered objects; background colors are used exactly as specified. Default of 1.0 keeps rendering unchanged. --- doc/src/dump_image.rst | 17 +- src/GRAPHICS/dump_image.cpp | 9 + src/GRAPHICS/image.cpp | 9 + src/GRAPHICS/image.h | 1 + .../graphics/tests/dump-modify-gamma.yaml | 603 ++++++++++++++++++ 5 files changed, 638 insertions(+), 1 deletion(-) create mode 100644 unittest/graphics/tests/dump-modify-gamma.yaml diff --git a/doc/src/dump_image.rst b/doc/src/dump_image.rst index 3a4d0a3186e..70ac391cf1a 100644 --- a/doc/src/dump_image.rst +++ b/doc/src/dump_image.rst @@ -132,7 +132,7 @@ Syntax dump_modify dump-ID keyword values ... * these keywords apply only to the *image* and *movie* styles and are documented on this page -* keyword = *acolor* or *adiam* or *amap* or *gmap* or *bmap* or *atrans* or *backcolor* or *backcolor2* or *bcolor* or *bdiam* or *btrans* or *bitrate* or *boxcolor* or *color* or *gtrans* or *lights* or *lightdir* or *specular* or *loadcolors* or *savecolors* or *framerate* or *axestrans* or *boxtrans* or *subboxtrans* or *ccolor* or *ctrans* or *fcolor* or *ftrans* +* keyword = *acolor* or *adiam* or *amap* or *gmap* or *bmap* or *atrans* or *backcolor* or *backcolor2* or *bcolor* or *bdiam* or *btrans* or *bitrate* or *boxcolor* or *color* or *gamma* or *gtrans* or *lights* or *lightdir* or *specular* or *loadcolors* or *savecolors* or *framerate* or *axestrans* or *boxtrans* or *subboxtrans* or *ccolor* or *ctrans* or *fcolor* or *ftrans* * see the :doc:`dump modify ` doc page for more general keywords .. parsed-literal:: @@ -191,6 +191,8 @@ Syntax name = name of color R,G,B = red/green/blue numeric values from 0.0 to 1.0 hex = 24-bit RGB color in hexadecimal + *gamma* arg = gvalue + gvalue = gamma correction applied to rendered objects (from 0.1 to 10.0, 1.0 = no correction) *gtrans* arg = transparency transparency = transparency for visualized grid (value between 0 (invisible) and 1 (fully opaque)) *lights* args = ambient key fill back @@ -1306,6 +1308,18 @@ the scene from behind the camera to provide depth. .. versionadded:: TBD +The *gamma* keyword applies a gamma correction to the rendered objects: +the light contributions to each pixel are summed up linearly and then +raised to the power of 1/*gvalue* before conversion to the 8-bit color +values of the image file. Values larger than 1.0 (the typical display +gamma is 2.2) brighten the image, most strongly in the darker regions, +and thus recover shading detail on the dimly lit side of objects; +values below 1.0 darken the image and increase contrast. The +correction applies only to rendered objects; the background colors are +used exactly as specified. + +.. versionadded:: TBD + The *lightdir* keyword repositions one of the directional light sources: *key*, *fill*, or *back*. The two angles are set in degrees relative to the viewing direction, so the lights stay fixed relative to @@ -1475,6 +1489,7 @@ The defaults for the dump_modify keywords specific to dump image and dump movie * boxtrans = 1.0 * subboxtrans = 1.0 * color = 140 color names are pre-defined as listed below +* gamma = 1.0 * lights = 0.0 0.9 0.45 0.9 * lightdir = key 30 -45, fill 0 30, back 15 180 * specular = derived from the *shiny* keyword of the dump image command diff --git a/src/GRAPHICS/dump_image.cpp b/src/GRAPHICS/dump_image.cpp index 251c7f7df64..f2136ee1089 100644 --- a/src/GRAPHICS/dump_image.cpp +++ b/src/GRAPHICS/dump_image.cpp @@ -3050,6 +3050,15 @@ int DumpImage::modify_param(int narg, char **arg) return 4; } + if (strcmp(arg[0], "gamma") == 0) { + if (narg < 2) utils::missing_cmd_args(FLERR, "dump_modify gamma", error); + double gval = utils::numeric(FLERR, arg[1], false, lmp); + if ((gval < 0.1) || (gval > 10.0)) + error->all(FLERR, argoff + 1, "Illegal gamma value {}", gval); + image->gamma = gval; + return 2; + } + if (strcmp(arg[0], "specular") == 0) { if (narg < 3) utils::missing_cmd_args(FLERR, "dump_modify specular", error); double intensity = utils::numeric(FLERR, arg[1], false, lmp); diff --git a/src/GRAPHICS/image.cpp b/src/GRAPHICS/image.cpp index 34f928d608b..6da0607f57c 100644 --- a/src/GRAPHICS/image.cpp +++ b/src/GRAPHICS/image.cpp @@ -361,6 +361,7 @@ Image::Image(LAMMPS *lmp, int nmap_caller) : phi = 30.0 * DEG2RAD; zoom = 1.0; shiny = 1.0; + gamma = 1.0; ssao = NO; fsaa = NO; depthcue = NO; @@ -1782,6 +1783,14 @@ void Image::draw_pixel(int ix, int iy, double depth, const double *surface, c[1] = saturate(c[1]); c[2] = saturate(c[2]); + // apply gamma correction to the summed up linear light contributions + + if (gamma != 1.0) { + c[0] = pow(c[0], 1.0 / gamma); + c[1] = pow(c[1], 1.0 / gamma); + c[2] = pow(c[2], 1.0 / gamma); + } + imageBuffer[0 + ix*3 + iy*width*3] = static_cast(c[0] * 255.0); imageBuffer[1 + ix*3 + iy*width*3] = static_cast(c[1] * 255.0); imageBuffer[2 + ix*3 + iy*width*3] = static_cast(c[2] * 255.0); diff --git a/src/GRAPHICS/image.h b/src/GRAPHICS/image.h index d41aaedf0c9..bdb28c9d0a6 100644 --- a/src/GRAPHICS/image.h +++ b/src/GRAPHICS/image.h @@ -34,6 +34,7 @@ class Image : protected Pointers { double up[3]; // up direction in image double zoom; // zoom factor double shiny; // shininess of objects + double gamma; // gamma correction of rendered objects, 1.0 = off int fsaa; // antialiasing on or off int ssao; // SSAO on or off int seed; // RN seed for SSAO diff --git a/unittest/graphics/tests/dump-modify-gamma.yaml b/unittest/graphics/tests/dump-modify-gamma.yaml new file mode 100644 index 00000000000..10c40112449 --- /dev/null +++ b/unittest/graphics/tests/dump-modify-gamma.yaml @@ -0,0 +1,603 @@ +--- +lammps_version: 4 Jul 2026 +tags: graphics +date_generated: Fri Jul 24 13:10:05 2026 +epsilon_projection: 0.5 +epsilon_blocks: 2 +nprocs: 1 +prerequisites: | + atom full + pair lj/charmm/coul/charmm + bond harmonic + angle charmm + dihedral charmm + improper harmonic +setup_commands: | + units real + atom_style full + pair_style lj/charmm/coul/charmm 8.0 10.0 + bond_style harmonic + angle_style charmm + dihedral_style charmm + improper_style harmonic + read_data ${input_dir}/data.peptide + neighbor 2.0 bin + dump viz all image 1 ${imagefile} type type size 200 200 zoom 1.5 view 60 30 shiny 0.2 box yes 0.02 bond atom 0.3 + dump_modify viz backcolor gray gamma 2.2 +run_commands: | + run 0 +image_size: 200 200 +sampling: 3 16 +row_means: | + 126.56 137.10 128.99 + 121.51 132.43 130.35 + 123.40 131.46 132.21 + 128.18 133.51 130.68 + 126.00 131.81 128.12 + 125.22 132.39 126.57 + 127.77 133.32 124.52 + 129.80 135.56 126.00 + 129.57 134.22 125.08 + 127.50 134.64 126.44 + 129.81 136.88 128.44 + 129.53 136.84 128.61 + 123.63 137.95 130.81 + 117.30 138.19 136.37 + 116.12 147.16 143.68 + 115.72 145.56 140.03 + 108.91 137.37 131.78 + 107.48 130.24 133.28 + 114.62 132.66 138.22 + 111.20 133.41 142.18 + 101.53 127.14 144.98 + 102.47 135.95 150.41 + 99.03 136.96 150.44 + 98.64 136.27 145.58 + 96.14 134.37 138.66 + 99.31 135.41 138.18 + 105.80 136.45 141.63 + 103.94 135.94 144.41 + 95.24 130.50 146.21 + 99.53 129.91 148.45 + 95.81 129.65 146.81 + 91.89 127.74 144.09 + 95.53 135.28 144.25 + 98.92 140.66 146.56 + 95.36 139.69 147.13 + 92.66 134.32 139.44 + 97.58 132.75 136.91 + 97.33 132.66 142.09 + 94.66 136.47 146.54 + 93.69 140.24 150.33 + 94.27 138.05 148.88 + 92.72 136.25 146.15 + 91.16 137.05 151.40 + 96.56 133.69 144.44 + 91.08 132.66 136.69 + 89.88 135.89 143.75 + 91.88 136.22 154.69 + 87.19 135.12 159.41 + 87.35 134.09 157.79 + 87.16 133.79 154.44 + 95.45 138.63 151.57 + 99.95 138.28 150.24 + 89.47 136.31 146.98 + 92.56 138.47 145.91 + 92.14 133.82 141.34 + 96.56 138.71 143.29 + 102.86 147.57 143.96 + 106.65 148.99 146.35 + 101.75 141.91 142.88 + 98.15 132.87 144.54 + 100.59 134.40 151.22 + 97.03 131.33 146.24 + 102.03 141.71 151.56 + 100.83 146.44 153.33 + 96.77 147.78 150.06 + 90.83 141.74 143.57 + 91.09 139.09 140.18 + 98.21 142.30 152.31 + 97.42 143.25 151.54 + 99.83 136.80 147.94 + 92.67 126.00 140.50 + 95.71 123.39 142.06 + 95.96 128.43 149.94 + 87.44 127.62 151.27 + 86.04 139.85 151.62 + 89.36 146.04 154.59 + 89.08 137.55 153.16 + 87.92 133.00 152.07 + 87.47 129.25 145.88 + 92.77 135.95 146.00 + 96.65 145.97 148.76 + 98.78 148.19 154.86 + 91.44 137.88 153.00 + 89.67 135.96 150.19 + 88.75 129.51 145.93 + 90.27 136.11 151.21 + 85.12 141.16 154.13 + 85.19 139.59 154.00 + 74.80 137.28 159.15 + 75.75 132.84 159.50 + 74.82 132.99 159.07 + 77.81 130.31 161.03 + 74.07 130.04 158.06 + 75.86 134.09 154.03 + 77.13 135.47 153.53 + 75.69 130.46 154.00 + 79.55 133.25 157.46 + 87.14 139.88 159.35 + 88.06 134.43 156.90 + 80.17 122.61 147.44 + 84.72 129.11 148.47 + 86.66 125.24 152.94 + 84.78 130.02 159.16 + 81.24 137.00 163.34 + 83.56 142.36 168.72 + 73.00 139.81 162.34 + 68.70 129.19 152.12 + 72.42 124.43 155.52 + 72.11 121.58 155.37 + 78.79 121.53 158.18 + 82.06 118.56 150.30 + 79.69 115.83 151.61 + 85.44 141.50 161.63 + 85.03 152.46 163.74 + 77.86 143.71 157.24 + 75.95 138.72 155.71 + 79.12 131.22 149.55 + 84.63 142.16 153.46 + 84.22 134.50 150.13 + 85.57 131.89 150.90 + 81.80 123.39 147.44 + 82.79 124.94 151.74 + 77.75 129.88 156.91 + 78.75 134.62 164.09 + 75.17 134.40 161.35 + 76.08 129.75 155.43 + 77.16 130.93 153.29 + 75.60 133.41 154.32 + 75.39 135.35 152.50 + 80.89 139.74 159.51 + 82.77 137.44 152.74 + 83.34 138.88 154.37 + 82.27 135.22 154.27 + 82.31 128.68 149.41 + 87.04 127.67 147.91 + 78.45 129.00 147.56 + 85.49 140.51 154.50 + 89.58 145.93 159.69 + 84.48 137.26 153.96 + 81.60 130.28 153.11 + 86.36 128.79 158.26 + 81.56 130.94 160.38 + 74.39 125.97 151.41 + 71.57 128.25 149.17 + 78.75 132.26 149.94 + 83.05 135.32 148.44 + 88.38 133.06 145.47 + 89.48 133.22 146.16 + 94.42 139.69 153.76 + 90.83 134.47 150.47 + 91.74 137.93 153.00 + 86.94 135.24 146.44 + 90.42 138.66 151.81 + 87.53 137.21 152.61 + 87.66 141.12 158.72 + 84.57 137.71 153.22 + 84.62 135.41 154.08 + 83.87 131.01 147.84 + 86.86 123.44 140.57 + 90.86 124.73 142.12 + 96.47 131.19 140.97 + 101.56 138.24 143.94 + 103.61 145.14 143.21 + 98.92 142.85 143.94 + 98.78 137.66 144.22 + 102.51 142.03 149.89 + 102.05 140.36 148.63 + 98.34 131.40 141.41 + 98.62 129.60 135.95 + 97.44 125.14 131.06 + 104.48 129.37 142.66 + 101.67 136.32 146.88 + 104.44 145.31 150.97 + 104.22 140.49 144.82 + 101.56 130.28 132.08 + 106.22 128.32 129.46 + 114.91 135.48 133.16 + 116.31 138.16 136.34 + 117.11 136.26 135.42 + 120.29 135.76 134.03 + 114.00 132.75 129.82 + 118.83 136.79 129.47 + 119.69 141.69 131.69 + 120.83 142.90 131.58 + 120.78 139.16 130.78 + 121.31 135.29 130.61 + 124.83 131.70 128.93 + 124.72 131.93 129.21 + 122.60 132.65 129.99 + 124.36 133.84 127.84 + 125.66 135.28 126.39 + 125.09 133.91 123.88 + 126.27 132.24 123.73 + 128.12 138.84 129.84 + 125.99 137.50 131.22 + 123.09 134.91 130.14 + 123.56 134.35 129.76 + 124.23 133.94 128.47 + 129.01 135.19 124.04 + 132.71 136.25 123.44 +col_means: | + 130.43 135.81 126.82 + 129.97 137.67 127.59 + 129.96 137.26 126.83 + 126.72 135.88 127.56 + 122.67 134.15 132.14 + 122.79 134.28 134.96 + 120.75 137.78 137.13 + 117.78 138.16 134.84 + 117.36 135.63 134.30 + 118.02 135.99 136.26 + 114.15 132.66 137.07 + 112.84 129.50 133.93 + 112.36 127.44 131.55 + 115.22 133.31 134.29 + 112.65 132.03 132.91 + 112.17 133.30 131.96 + 112.13 137.72 133.72 + 110.69 136.60 136.17 + 108.69 134.63 139.87 + 107.92 135.37 141.92 + 107.48 132.22 141.12 + 106.36 129.09 140.44 + 107.75 129.69 141.67 + 105.42 130.40 143.55 + 101.84 132.65 147.01 + 99.11 133.30 150.01 + 96.34 129.67 144.03 + 97.92 127.17 139.53 + 100.52 129.68 135.63 + 104.12 138.99 144.78 + 106.29 140.28 149.12 + 103.94 141.57 148.28 + 95.80 137.90 141.62 + 98.58 134.60 141.11 + 103.84 132.00 140.23 + 97.42 132.67 143.03 + 104.00 133.84 144.20 + 105.85 140.51 150.72 + 100.35 139.83 149.25 + 94.20 133.50 145.96 + 94.47 131.50 141.72 + 98.70 136.97 143.93 + 101.05 139.46 149.63 + 98.25 139.03 150.54 + 95.21 145.84 151.50 + 94.24 145.59 151.96 + 92.22 134.28 149.74 + 92.21 128.91 149.44 + 90.80 127.39 148.97 + 89.17 123.58 146.25 + 95.37 138.23 147.44 + 93.94 143.14 147.12 + 93.53 140.24 148.40 + 93.67 138.84 149.56 + 92.77 136.14 149.80 + 92.61 127.55 147.00 + 92.00 126.89 146.67 + 93.53 130.83 147.31 + 95.78 134.84 150.25 + 82.76 130.62 147.16 + 88.65 132.37 149.85 + 90.34 138.38 156.50 + 88.19 140.97 162.21 + 79.34 134.96 159.49 + 78.88 138.91 160.51 + 78.75 139.09 158.91 + 80.96 133.57 155.82 + 79.67 132.56 151.63 + 86.72 138.27 153.35 + 84.75 133.14 152.46 + 85.75 133.26 152.75 + 82.92 140.53 154.84 + 84.09 145.20 157.18 + 83.02 143.69 156.53 + 80.40 140.31 150.54 + 81.22 135.76 154.79 + 78.81 123.61 151.56 + 76.71 127.86 154.26 + 79.93 139.46 157.94 + 82.36 143.66 162.74 + 79.11 140.74 158.59 + 75.70 143.41 157.79 + 82.44 148.62 158.94 + 80.00 144.60 157.30 + 81.47 136.44 157.78 + 81.72 127.08 154.55 + 79.27 128.03 153.12 + 85.01 126.03 153.94 + 85.53 122.47 152.69 + 82.56 120.79 149.58 + 81.98 120.23 144.05 + 89.92 128.46 146.37 + 93.62 141.92 151.31 + 97.39 151.28 150.66 + 91.84 147.90 145.88 + 96.14 147.88 153.76 + 97.39 138.33 153.75 + 89.09 129.14 148.53 + 87.89 127.12 149.81 + 89.27 131.66 153.04 + 83.48 139.74 158.83 + 80.41 137.44 158.69 + 82.40 135.03 158.00 + 78.52 131.14 152.33 + 71.48 128.94 148.87 + 84.44 140.59 149.04 + 85.83 137.62 150.16 + 86.16 138.06 147.88 + 90.94 135.71 149.26 + 92.11 134.08 151.74 + 85.44 132.91 150.12 + 79.73 134.57 152.07 + 78.73 135.74 159.99 + 79.71 138.50 160.18 + 77.64 134.53 162.62 + 78.09 131.75 162.94 + 83.50 135.88 162.02 + 75.53 131.75 153.59 + 73.26 125.05 153.44 + 75.78 120.61 147.77 + 85.44 123.13 148.68 + 87.08 125.79 148.85 + 88.02 123.09 146.25 + 87.84 129.48 151.28 + 87.47 136.50 154.09 + 86.17 140.83 157.88 + 152.87 159.81 90.58 + 162.81 173.33 107.00 + 139.34 151.19 86.30 + 80.58 124.28 150.96 + 89.67 129.94 153.90 + 84.80 128.03 156.72 + 84.89 134.16 158.68 + 82.48 138.79 160.31 + 82.44 136.44 151.43 + 85.59 129.28 149.44 + 83.70 129.97 148.22 + 90.02 130.86 151.06 + 91.75 137.15 153.16 + 92.44 146.78 157.07 + 88.89 140.29 153.55 + 79.87 136.73 151.09 + 82.55 136.57 152.13 + 85.32 141.10 155.32 + 83.80 139.97 153.72 + 80.69 139.13 149.53 + 83.92 136.71 153.18 + 84.13 138.10 152.35 + 84.44 134.38 152.71 + 86.98 128.97 153.97 + 88.61 133.43 152.84 + 85.31 133.59 145.78 + 89.37 140.00 150.19 + 90.74 140.28 147.57 + 90.28 138.47 145.56 + 89.29 137.01 149.12 + 89.69 131.95 151.27 + 86.54 128.85 146.00 + 93.00 138.96 148.54 + 96.30 145.46 149.18 + 92.32 141.01 146.91 + 94.64 137.53 144.43 + 91.53 129.56 144.67 + 100.56 132.22 146.22 + 94.56 130.25 147.19 + 100.44 140.78 149.75 + 100.44 136.13 148.64 + 96.61 133.71 142.75 + 95.47 130.44 138.01 + 100.93 131.05 138.59 + 101.33 136.68 143.38 + 101.67 134.79 142.95 + 98.25 129.96 138.16 + 101.36 129.03 137.71 + 109.99 133.49 139.78 + 110.46 129.84 141.32 + 107.17 129.38 140.13 + 107.78 126.19 133.69 + 118.11 135.60 135.83 + 114.12 139.24 138.26 + 115.20 141.62 139.83 + 109.99 139.28 138.77 + 105.97 135.79 137.50 + 105.87 133.65 137.47 + 106.99 131.09 135.20 + 110.95 134.47 134.75 + 116.07 133.68 134.26 + 117.12 132.71 136.04 + 115.14 129.73 133.75 + 114.64 131.49 131.75 + 114.72 133.43 132.37 + 117.37 134.01 130.69 + 120.86 132.95 130.67 + 122.14 132.68 127.33 + 123.92 134.66 126.06 + 127.67 133.49 125.69 + 129.66 134.00 127.34 + 128.38 133.45 127.94 + 127.11 131.74 126.83 + 129.38 130.78 124.62 +sample_blocks: | + 2 2 128.00 128.00 128.00 + 2 18 128.00 128.00 128.00 + 2 34 128.00 128.00 128.00 + 2 50 202.22 188.67 54.44 + 2 66 128.00 128.00 128.00 + 2 82 113.44 163.67 163.67 + 2 98 109.78 130.00 130.00 + 2 114 90.56 90.56 197.78 + 2 130 130.00 128.78 117.11 + 2 146 168.89 166.44 115.00 + 2 162 128.00 128.00 128.00 + 2 178 128.00 128.00 128.00 + 2 194 128.00 128.00 128.00 + 18 2 128.00 128.00 128.00 + 18 18 128.00 128.00 128.00 + 18 34 152.67 144.44 52.44 + 18 50 128.00 128.00 128.00 + 18 66 128.00 128.00 128.00 + 18 82 59.00 66.33 166.44 + 18 98 41.67 123.22 149.22 + 18 114 98.78 98.78 167.00 + 18 130 97.33 148.22 198.44 + 18 146 92.78 117.33 117.33 + 18 162 128.00 128.00 128.00 + 18 178 92.89 169.11 205.89 + 18 194 227.67 220.56 84.89 + 34 2 128.00 128.00 128.00 + 34 18 103.89 180.78 180.78 + 34 34 128.00 128.00 128.00 + 34 50 51.56 111.22 154.00 + 34 66 128.00 128.00 128.00 + 34 82 58.67 124.56 124.56 + 34 98 128.00 128.00 128.00 + 34 114 65.11 91.44 180.33 + 34 130 55.22 162.11 162.11 + 34 146 100.78 100.78 127.00 + 34 162 118.33 132.67 132.67 + 34 178 90.00 203.33 203.33 + 34 194 128.00 128.00 128.00 + 50 2 196.56 191.44 101.78 + 50 18 128.00 128.00 128.00 + 50 34 90.33 90.33 206.22 + 50 50 76.89 190.33 190.33 + 50 66 81.33 144.33 189.33 + 50 82 61.67 106.11 169.00 + 50 98 76.00 122.33 122.33 + 50 114 76.67 89.44 186.44 + 50 130 109.44 159.67 184.00 + 50 146 52.67 122.44 161.78 + 50 162 67.44 180.89 180.89 + 50 178 128.00 128.00 128.00 + 50 194 128.00 128.00 128.00 + 66 2 128.00 128.00 128.00 + 66 18 57.33 164.44 164.44 + 66 34 102.33 102.33 164.56 + 66 50 51.89 151.89 151.89 + 66 66 150.11 189.89 106.11 + 66 82 48.56 99.78 152.11 + 66 98 60.00 105.22 168.78 + 66 114 68.56 116.00 178.11 + 66 130 61.56 161.78 161.78 + 66 146 93.22 131.67 114.00 + 66 162 113.78 113.78 113.78 + 66 178 77.78 111.22 124.11 + 66 194 112.67 139.11 139.11 + 82 2 128.00 128.00 128.00 + 82 18 116.22 116.22 153.33 + 82 34 100.22 126.33 126.33 + 82 50 68.22 135.22 168.44 + 82 66 62.78 153.44 177.67 + 82 82 55.56 159.89 159.89 + 82 98 89.56 168.22 168.22 + 82 114 195.44 203.44 111.00 + 82 130 190.89 190.89 69.89 + 82 146 68.11 156.67 181.11 + 82 162 74.78 123.00 123.00 + 82 178 128.00 128.00 128.00 + 82 194 128.00 128.00 128.00 + 98 2 128.00 128.00 128.00 + 98 18 128.00 128.00 128.00 + 98 34 73.78 125.00 157.89 + 98 50 80.56 92.56 142.11 + 98 66 81.78 174.22 186.33 + 98 82 68.78 114.22 169.89 + 98 98 57.11 167.33 167.33 + 98 114 91.00 200.33 200.33 + 98 130 67.33 104.44 174.67 + 98 146 84.22 194.67 194.67 + 98 162 79.22 185.22 185.22 + 98 178 104.56 104.56 143.33 + 98 194 128.00 128.00 128.00 + 114 2 128.00 128.00 128.00 + 114 18 46.67 112.22 135.56 + 114 34 92.33 116.78 126.89 + 114 50 89.22 194.67 194.67 + 114 66 36.44 141.22 141.22 + 114 82 87.22 195.78 195.78 + 114 98 80.11 129.89 191.11 + 114 114 95.22 131.22 182.78 + 114 130 44.44 136.56 150.11 + 114 146 66.11 104.33 181.11 + 114 162 45.00 124.22 150.33 + 114 178 107.22 132.00 132.00 + 114 194 128.00 128.00 128.00 + 130 2 128.00 128.00 128.00 + 130 18 72.33 134.33 134.33 + 130 34 103.56 141.11 141.11 + 130 50 77.56 145.89 128.22 + 130 66 76.67 188.78 188.78 + 130 82 101.78 118.00 118.00 + 130 98 82.67 192.67 192.67 + 130 114 52.56 146.33 159.78 + 130 130 110.44 130.56 112.78 + 130 146 50.56 112.22 155.89 + 130 162 64.44 103.11 179.56 + 130 178 128.00 128.00 128.00 + 130 194 128.00 128.00 128.00 + 146 2 128.00 128.00 128.00 + 146 18 53.56 77.89 149.89 + 146 34 31.56 135.89 135.89 + 146 50 53.22 66.22 164.44 + 146 66 79.56 152.78 193.00 + 146 82 119.11 133.67 133.67 + 146 98 71.33 171.78 183.89 + 146 114 39.78 52.00 125.00 + 146 130 20.00 90.89 123.33 + 146 146 45.22 116.33 127.44 + 146 162 78.56 78.56 190.33 + 146 178 95.78 95.78 137.33 + 146 194 179.11 176.56 109.33 + 162 2 128.00 128.00 128.00 + 162 18 101.56 163.67 153.11 + 162 34 105.22 128.11 142.78 + 162 50 128.00 128.00 128.00 + 162 66 56.67 68.67 147.67 + 162 82 90.00 142.67 142.67 + 162 98 113.78 126.11 126.11 + 162 114 69.67 131.44 131.44 + 162 130 102.22 126.78 126.78 + 162 146 53.89 135.56 135.56 + 162 162 54.78 143.00 167.00 + 162 178 128.00 128.00 128.00 + 162 194 128.00 128.00 128.00 + 178 2 212.11 209.00 110.78 + 178 18 128.00 128.00 128.00 + 178 34 78.11 140.22 140.22 + 178 50 128.00 128.00 128.00 + 178 66 67.56 67.56 179.22 + 178 82 91.11 126.11 126.11 + 178 98 128.00 128.00 128.00 + 178 114 67.33 126.00 178.89 + 178 130 84.56 84.56 134.33 + 178 146 51.00 162.89 162.89 + 178 162 128.00 128.00 128.00 + 178 178 128.00 128.00 128.00 + 178 194 128.00 128.00 128.00 + 194 2 128.00 128.00 128.00 + 194 18 128.00 128.00 128.00 + 194 34 128.00 128.00 128.00 + 194 50 177.11 171.78 92.00 + 194 66 91.33 141.22 141.22 + 194 82 128.00 128.00 128.00 + 194 98 128.00 128.00 128.00 + 194 114 69.33 163.11 163.11 + 194 130 53.00 137.11 161.44 + 194 146 128.00 128.00 128.00 + 194 162 128.00 128.00 128.00 + 194 178 128.00 128.00 128.00 + 194 194 128.00 128.00 128.00 +... From a8c227672a5528c9d7e578466d5737f63f991d35 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 24 Jul 2026 13:13:04 -0400 Subject: [PATCH 047/100] make SSAO shading deterministic with interleaved gradient noise Replace the per-rank Marsaglia RNG stream for the per-pixel jitter of the SSAO sampling directions with interleaved gradient noise computed from the pixel position and shifted by the seed value. SSAO images are now independent of the number of MPI ranks and OpenMP threads, and re-rendering an unchanged scene is exactly reproducible, which removes shading flicker from movies. The noise pattern differs from the previous randomized one, so SSAO images change once with this commit; the shading quality is visually unchanged. Also removes the serial random number pre-fill pass and the RanMars instance. --- doc/src/dump_image.rst | 9 + src/GRAPHICS/image.cpp | 20 +- src/GRAPHICS/image.h | 4 - unittest/graphics/tests/dump-image-ssao.yaml | 1028 +++++++++--------- 4 files changed, 533 insertions(+), 528 deletions(-) diff --git a/doc/src/dump_image.rst b/doc/src/dump_image.rst index 70ac391cf1a..5da218b17e0 100644 --- a/doc/src/dump_image.rst +++ b/doc/src/dump_image.rst @@ -873,6 +873,15 @@ shading is particularly large. In case LAMMPS has been :doc:`compiled with OpenMP support `, the SSAO processing is distributed across multiple threads. +.. versionchanged:: TBD + +The randomization of the SSAO shading is now computed from a +deterministic noise pattern derived from the pixel position and the +*seed* value. Rendered images no longer depend on the number of MPI +ranks or OpenMP threads, and images of an unchanged scene are exactly +reproducible, which avoids flickering shading in movies. Different +*seed* values shift the noise pattern. + .. versionadded:: TBD The *depthcue* keyword turns on/off depth cueing. If *yes* is set, diff --git a/src/GRAPHICS/image.cpp b/src/GRAPHICS/image.cpp index 6da0607f57c..fabf4e5b92a 100644 --- a/src/GRAPHICS/image.cpp +++ b/src/GRAPHICS/image.cpp @@ -25,7 +25,6 @@ #include "math_const.h" #include "math_extra.h" #include "memory.h" -#include "random_mars.h" #include "version.h" #include @@ -349,7 +348,7 @@ constexpr char letter_z[] = { Image::Image(LAMMPS *lmp, int nmap_caller) : Pointers(lmp), maps(nullptr), depthBuffer(nullptr), surfaceBuffer(nullptr), depthcopy(nullptr), surfacecopy(nullptr), imageBuffer(nullptr), rgbcopy(nullptr), writeBuffer(nullptr), - recvcounts(nullptr), displs(nullptr), random(nullptr) + recvcounts(nullptr), displs(nullptr) { MPI_Comm_rank(world, &me); MPI_Comm_size(world, &nprocs); @@ -629,8 +628,6 @@ Image::~Image() memory->destroy(surfacecopy); memory->destroy(rgbcopy); - delete random; - memory->destroy(recvcounts); memory->destroy(displs); } @@ -742,7 +739,6 @@ void Image::view_params(double boxxlo, double boxxhi, double boxylo, // adjust strength of the SSAO if (ssao) { - if (!random) random = new RanMars(lmp,seed+me); SSAORadius = maxdel * 0.05 * ssaoint; SSAOSamples = static_cast(8.0 + 32.0*ssaoint); SSAOJitter = MY_PI / 12; @@ -1818,9 +1814,9 @@ void Image::compute_SSAO() int pixelstart = static_cast(1.0*me/nprocs * npixels); int pixelstop = static_cast(1.0*(me+1)/nprocs * npixels); - // fill buffer with random numbers to avoid race conditions - auto *uniform = new double[pixelstop - pixelstart]; - for (int i = 0; i < pixelstop - pixelstart; ++i) uniform[i] = random->uniform(); + // shift of the jitter noise pattern derived from the seed value + + const double seedshift = fmod(0.618033988749895 * (double) seed, 1.0); #if defined(_OPENMP) #pragma omp parallel for @@ -1836,7 +1832,12 @@ void Image::compute_SSAO() double sy = surfaceBuffer[index * 2 + 1]; double sin_t = -sqrt(sx*sx + sy*sy); - double mytheta = uniform[index - pixelstart] * SSAOJitter; + // deterministic per-pixel jitter from interleaved gradient noise, so + // shading is independent of the number of MPI ranks and OpenMP threads + // and images of unchanged scenes are reproducible + + double ign = fmod(0.06711056 * x + 0.00583715 * y + seedshift, 1.0); + double mytheta = fmod(52.9829189 * ign, 1.0) * SSAOJitter; double ao = 0.0; for (int s = 0; s < SSAOSamples; ++s) { @@ -1926,7 +1927,6 @@ void Image::compute_SSAO() imageBuffer[index * 3 + 1] = (int) c[1]; imageBuffer[index * 3 + 2] = (int) c[2]; } - delete[] uniform; } /* ---------------------------------------------------------------------- diff --git a/src/GRAPHICS/image.h b/src/GRAPHICS/image.h index bdb28c9d0a6..6cbbe5f4fd8 100644 --- a/src/GRAPHICS/image.h +++ b/src/GRAPHICS/image.h @@ -140,10 +140,6 @@ class Image : protected Pointers { double keyLightDir[3], fillLightDir[3], backLightDir[3]; double keyHalfDir[3]; - // SSAO RNG - - class RanMars *random; - // internal methods void draw_pixel(int, int, double, const double *, const double *); diff --git a/unittest/graphics/tests/dump-image-ssao.yaml b/unittest/graphics/tests/dump-image-ssao.yaml index 15a0a99047c..8e45ecf9b22 100644 --- a/unittest/graphics/tests/dump-image-ssao.yaml +++ b/unittest/graphics/tests/dump-image-ssao.yaml @@ -1,7 +1,7 @@ --- lammps_version: 4 Jul 2026 tags: graphics -date_generated: Thu Jul 9 13:32:20 2026 +date_generated: Fri Jul 24 13:12:43 2026 epsilon_projection: 0.5 epsilon_blocks: 2 nprocs: 1 @@ -29,573 +29,573 @@ run_commands: | image_size: 200 200 sampling: 3 16 row_means: | - 137.18 134.94 122.08 - 136.46 130.91 120.92 - 138.25 128.89 119.14 - 138.59 129.78 116.73 - 138.81 131.00 117.52 - 136.04 130.53 116.95 - 134.31 131.61 117.81 - 134.32 133.93 120.54 - 132.86 132.07 118.86 - 133.55 131.28 117.91 - 134.20 131.44 117.88 - 134.41 131.81 118.39 - 135.81 130.81 117.42 - 140.12 133.34 120.00 - 145.88 138.03 124.62 - 144.37 137.09 123.56 - 139.22 132.47 118.81 - 134.81 123.90 111.00 - 132.41 120.36 107.97 - 133.88 120.72 110.97 - 134.63 117.83 111.94 - 137.42 120.90 116.91 - 139.11 122.64 117.69 - 138.24 124.23 117.99 - 135.30 124.91 117.30 - 133.97 125.86 117.75 - 134.02 125.79 117.51 - 137.93 125.86 117.53 - 139.53 122.11 114.03 - 139.73 116.59 108.36 - 139.03 116.30 107.58 - 136.94 115.92 107.46 - 134.84 120.66 112.25 - 136.24 126.47 118.19 - 137.88 127.16 118.59 - 133.76 124.03 115.50 - 134.06 122.91 113.55 - 135.37 121.81 112.86 - 133.00 118.83 110.61 - 130.28 116.45 108.08 - 129.87 112.70 104.41 - 128.99 112.72 104.70 - 127.44 110.78 102.75 - 125.22 106.89 98.70 - 120.92 105.14 97.16 - 122.55 108.64 101.44 - 126.36 107.48 101.62 - 127.73 105.45 100.11 - 131.99 106.37 98.66 - 131.28 107.44 96.66 - 137.22 114.68 100.36 - 141.96 121.78 107.17 - 136.73 117.75 103.14 - 130.72 111.84 96.98 - 126.17 109.62 94.67 - 124.28 110.90 95.95 - 125.43 114.55 98.55 - 128.72 118.11 101.25 - 131.41 117.94 101.44 - 127.69 111.92 96.55 - 124.33 104.50 89.17 - 124.87 103.32 88.16 - 129.84 106.48 91.33 - 132.53 113.63 98.38 - 127.19 112.79 97.83 - 119.60 109.23 94.37 - 123.27 114.56 99.48 - 128.80 116.06 101.13 - 131.00 117.34 102.22 - 133.63 117.06 102.01 - 129.12 106.83 91.89 - 123.60 100.99 86.06 - 124.83 100.12 85.05 - 127.21 102.58 87.82 - 127.70 109.42 94.47 - 126.77 113.73 98.21 - 123.73 108.61 92.85 - 121.76 102.38 87.48 - 119.31 101.08 86.21 - 121.53 106.19 91.02 - 127.34 115.75 100.74 - 131.74 120.70 105.75 - 135.99 118.03 102.78 - 132.59 113.80 98.86 - 123.97 105.11 91.07 - 121.17 104.08 94.53 - 123.05 109.61 104.65 - 126.72 113.78 110.88 - 128.88 113.00 110.11 - 125.83 104.38 101.48 - 122.45 99.03 96.12 - 120.70 96.07 93.16 - 118.30 95.50 92.58 - 115.97 98.24 95.33 - 119.31 103.79 100.88 - 117.23 100.84 97.93 - 120.38 104.28 101.39 - 124.17 108.61 105.72 - 128.09 111.28 108.39 - 128.70 109.68 106.78 - 124.12 109.53 106.64 - 122.83 104.64 101.75 - 127.09 105.56 102.67 - 130.57 109.38 106.58 - 135.10 111.36 108.47 - 134.77 113.11 110.22 - 131.81 109.31 106.41 - 130.09 103.90 101.00 - 125.22 97.90 95.01 - 118.64 92.27 89.36 - 113.58 86.71 83.81 - 109.78 83.84 80.84 - 109.15 90.84 87.94 - 114.29 103.41 100.51 - 117.34 106.14 103.25 - 120.56 107.43 104.46 - 121.16 106.42 103.14 - 123.33 109.83 106.44 - 127.08 110.97 107.42 - 128.81 109.49 105.61 - 126.36 105.52 102.11 - 128.66 104.96 102.06 - 127.12 102.91 100.01 - 125.57 101.97 99.06 - 129.20 105.00 102.09 - 129.22 103.71 100.31 - 126.99 103.35 99.27 - 124.00 102.45 99.00 - 119.31 100.62 97.73 - 120.30 105.43 102.53 - 123.78 110.68 107.58 - 126.33 109.78 106.41 - 124.04 106.38 103.23 - 118.23 101.28 98.19 - 117.61 101.61 98.38 - 120.98 106.22 103.18 - 124.86 111.94 108.58 - 128.65 116.11 112.31 - 132.09 115.17 110.58 - 134.32 110.05 105.17 - 133.51 105.83 101.73 - 135.72 107.44 104.18 - 128.98 104.88 101.45 - 125.86 106.86 103.80 - 124.27 107.95 104.45 - 124.78 109.18 103.94 - 124.65 110.83 103.58 - 123.80 108.78 99.38 - 122.61 105.83 96.39 - 125.83 109.05 101.51 - 129.02 112.99 107.46 - 127.17 113.15 109.11 - 127.93 114.42 109.76 - 133.46 115.91 110.08 - 140.95 121.54 114.90 - 144.44 124.38 116.42 - 144.68 122.50 114.94 - 140.44 122.09 115.41 - 132.53 114.83 109.19 - 125.91 107.47 103.22 - 124.36 111.23 106.31 - 125.31 116.65 109.83 - 128.69 123.34 115.00 - 129.05 124.07 115.18 - 130.41 121.33 112.63 - 139.42 127.50 118.31 - 142.22 128.38 119.23 - 139.69 122.23 112.58 - 135.73 120.00 109.76 - 130.28 118.22 108.47 - 133.54 117.94 109.86 - 139.87 123.92 116.88 - 144.60 132.62 125.26 - 145.36 133.28 124.26 - 139.59 128.87 119.27 - 132.00 123.22 113.94 - 128.12 124.19 115.81 - 132.09 128.47 120.81 - 137.88 131.10 121.27 - 140.49 131.52 118.94 - 138.75 130.69 117.59 - 136.99 131.08 117.05 - 139.62 136.73 120.63 - 140.34 139.66 123.39 - 140.09 137.70 122.44 - 137.76 133.84 119.31 - 136.68 129.01 113.87 - 136.66 126.98 110.41 - 136.58 127.11 110.58 - 135.81 128.93 112.45 - 134.21 130.53 114.22 - 133.62 131.91 115.45 - 133.45 129.79 113.03 - 134.94 131.28 114.53 - 138.25 132.27 115.75 - 138.51 131.72 115.98 - 137.71 132.25 120.02 - 137.94 134.22 122.44 - 136.62 134.41 119.53 - 135.47 135.10 118.47 + 137.12 134.90 122.06 + 136.47 130.92 120.91 + 138.27 128.91 119.14 + 138.53 129.72 116.74 + 138.81 130.97 117.44 + 136.10 130.56 117.00 + 134.32 131.63 117.78 + 134.36 133.97 120.55 + 132.90 132.09 118.83 + 133.44 131.16 117.86 + 134.19 131.43 117.91 + 134.32 131.72 118.31 + 135.84 130.84 117.42 + 140.04 133.28 119.98 + 145.82 137.94 124.58 + 144.18 136.94 123.45 + 139.32 132.56 118.88 + 134.81 123.93 110.97 + 132.59 120.45 108.06 + 133.83 120.69 110.92 + 134.69 117.83 111.94 + 137.48 121.00 117.00 + 139.16 122.67 117.70 + 138.24 124.16 117.93 + 135.28 124.86 117.28 + 133.90 125.82 117.71 + 134.09 125.77 117.50 + 138.00 125.92 117.59 + 139.56 122.12 114.03 + 139.74 116.63 108.42 + 139.07 116.32 107.56 + 136.93 115.94 107.42 + 134.99 120.73 112.31 + 136.01 126.34 118.08 + 137.87 127.20 118.62 + 133.50 123.80 115.31 + 134.06 122.88 113.50 + 135.22 121.68 112.72 + 132.98 118.84 110.64 + 130.00 116.20 107.82 + 129.88 112.74 104.45 + 129.03 112.69 104.67 + 127.07 110.48 102.45 + 125.58 107.17 99.00 + 120.81 105.05 97.08 + 122.53 108.63 101.45 + 126.19 107.43 101.60 + 127.67 105.42 100.05 + 132.16 106.45 98.77 + 131.37 107.63 96.80 + 137.26 114.81 100.47 + 141.99 121.81 107.22 + 136.69 117.78 103.12 + 130.83 111.95 97.07 + 126.28 109.76 94.81 + 124.50 111.08 96.12 + 125.43 114.57 98.54 + 128.56 117.94 101.10 + 131.35 117.97 101.48 + 127.78 111.94 96.53 + 124.59 104.66 89.31 + 124.72 103.19 88.03 + 129.73 106.44 91.28 + 132.28 113.44 98.22 + 127.31 112.89 97.94 + 119.91 109.53 94.69 + 123.36 114.65 99.58 + 128.83 116.06 101.14 + 130.99 117.39 102.28 + 133.58 117.00 101.92 + 129.15 106.81 91.86 + 123.77 101.19 86.27 + 124.92 100.27 85.19 + 127.30 102.71 87.94 + 127.83 109.47 94.52 + 126.70 113.67 98.17 + 123.50 108.47 92.75 + 121.77 102.29 87.40 + 119.17 100.99 86.14 + 121.61 106.28 91.11 + 127.17 115.54 100.55 + 131.81 120.78 105.82 + 136.26 118.26 102.98 + 132.74 113.96 99.04 + 124.18 105.22 91.17 + 121.31 104.16 94.62 + 122.80 109.46 104.50 + 126.23 113.39 110.49 + 128.87 113.04 110.15 + 126.18 104.75 101.84 + 122.45 99.07 96.17 + 120.64 96.11 93.19 + 118.29 95.55 92.64 + 115.87 98.16 95.23 + 119.24 103.70 100.80 + 117.37 101.06 98.16 + 120.25 104.19 101.30 + 124.19 108.70 105.81 + 128.01 111.31 108.42 + 128.50 109.47 106.58 + 124.20 109.59 106.69 + 123.00 104.75 101.85 + 127.00 105.58 102.69 + 130.49 109.33 106.53 + 135.12 111.46 108.56 + 134.63 112.97 110.08 + 131.81 109.31 106.40 + 129.90 103.78 100.89 + 125.00 97.67 94.78 + 118.72 92.34 89.44 + 113.58 86.56 83.66 + 109.86 83.92 80.94 + 109.10 90.78 87.89 + 114.36 103.44 100.55 + 117.59 106.31 103.41 + 120.47 107.36 104.39 + 121.19 106.45 103.17 + 123.31 109.86 106.47 + 126.97 110.86 107.32 + 128.81 109.47 105.56 + 126.41 105.52 102.14 + 128.65 104.95 102.06 + 127.08 102.91 100.00 + 125.64 102.02 99.12 + 129.22 105.05 102.15 + 129.16 103.61 100.20 + 127.33 103.58 99.48 + 124.06 102.47 99.03 + 119.13 100.39 97.50 + 120.11 105.23 102.34 + 123.96 110.78 107.67 + 125.89 109.38 106.03 + 124.35 106.59 103.44 + 118.14 101.27 98.19 + 117.64 101.64 98.39 + 121.08 106.24 103.20 + 124.78 111.87 108.51 + 128.82 116.28 112.44 + 132.06 115.06 110.52 + 134.25 110.03 105.11 + 133.48 105.86 101.72 + 135.81 107.59 104.32 + 128.81 104.68 101.28 + 125.72 106.62 103.58 + 124.16 107.78 104.28 + 124.84 109.23 103.99 + 124.78 110.88 103.62 + 124.06 109.09 99.62 + 122.44 105.67 96.31 + 125.91 109.12 101.56 + 128.97 112.97 107.47 + 127.15 113.11 109.05 + 127.88 114.42 109.75 + 133.38 115.84 110.06 + 141.13 121.68 115.11 + 144.54 124.44 116.53 + 144.43 122.38 114.81 + 140.45 122.08 115.41 + 132.53 114.80 109.16 + 125.97 107.59 103.35 + 124.25 111.08 106.14 + 125.48 116.74 109.94 + 128.71 123.31 114.98 + 129.02 124.06 115.17 + 130.31 121.29 112.50 + 139.28 127.39 118.25 + 142.38 128.49 119.31 + 139.74 122.23 112.58 + 135.57 119.91 109.67 + 130.35 118.25 108.47 + 133.56 117.89 109.83 + 139.81 123.92 116.90 + 144.43 132.44 125.08 + 145.51 133.47 124.45 + 139.70 128.91 119.29 + 131.99 123.19 113.94 + 128.10 124.22 115.81 + 132.25 128.62 120.92 + 137.91 131.12 121.27 + 140.60 131.61 119.03 + 138.72 130.62 117.54 + 136.91 131.00 116.97 + 139.63 136.75 120.62 + 140.41 139.75 123.47 + 140.04 137.64 122.40 + 137.78 133.82 119.31 + 136.65 129.00 113.89 + 136.66 126.98 110.42 + 136.55 127.07 110.53 + 135.80 128.98 112.47 + 134.31 130.57 114.25 + 133.50 131.80 115.36 + 133.49 129.83 113.03 + 135.12 131.39 114.61 + 138.20 132.22 115.67 + 138.45 131.66 115.95 + 137.75 132.29 120.01 + 137.97 134.22 122.44 + 136.71 134.50 119.56 + 135.51 135.15 118.49 col_means: | - 135.12 135.12 123.99 - 136.64 136.64 124.83 - 135.22 135.22 123.63 - 134.24 132.09 121.63 - 137.74 131.08 122.35 - 141.42 133.16 124.39 - 142.97 136.24 127.19 - 139.94 134.57 124.48 - 140.43 132.50 122.06 - 142.06 132.72 122.25 - 142.55 130.07 119.59 - 142.27 127.45 116.64 - 138.10 123.89 112.52 - 136.00 123.44 112.18 - 133.55 122.22 111.33 - 135.38 129.18 118.43 - 135.63 129.56 119.17 - 136.63 129.34 119.50 - 138.39 128.38 119.25 - 137.88 125.47 115.99 - 136.54 122.87 113.60 - 135.16 122.06 112.43 - 131.69 117.94 108.08 - 131.91 114.02 104.11 - 135.46 114.69 103.88 - 135.68 115.14 105.61 - 132.47 113.85 104.00 - 128.74 114.14 103.48 - 130.25 119.14 109.15 - 136.22 123.80 114.53 - 139.83 127.68 118.52 - 137.82 128.62 119.30 - 132.84 125.07 116.07 - 129.68 120.54 111.07 - 126.28 115.33 105.92 - 123.31 109.62 99.53 - 128.72 113.11 102.94 - 137.73 122.60 113.51 - 139.91 122.83 113.33 - 136.74 119.61 110.31 - 129.97 115.61 106.51 - 129.42 117.56 108.15 - 130.88 118.53 109.27 - 132.77 121.89 112.18 - 134.56 124.55 115.42 - 132.78 118.68 109.20 - 133.41 111.08 101.80 - 133.27 106.72 97.39 - 129.27 102.75 93.31 - 126.25 105.97 96.46 - 127.74 118.22 108.28 - 128.38 120.22 111.01 - 129.06 117.91 109.18 - 128.54 116.67 109.21 - 125.22 110.32 103.75 - 126.11 107.56 100.96 - 126.03 109.03 102.67 - 128.46 111.36 104.56 - 127.51 112.31 106.30 - 124.49 107.51 101.83 - 129.29 110.59 104.85 - 129.85 110.61 106.81 - 128.44 109.53 106.17 - 127.14 108.61 105.62 - 128.62 112.17 108.72 - 127.52 109.40 104.83 - 128.31 108.58 101.46 - 125.45 109.24 102.44 - 127.06 111.95 106.28 - 126.56 109.56 103.92 - 125.24 110.88 105.96 - 124.34 108.67 101.48 - 128.51 112.19 104.86 - 133.00 116.83 110.28 - 135.69 117.27 111.64 - 132.01 110.80 107.16 - 124.33 101.09 97.69 - 117.30 96.64 93.61 - 117.00 102.75 99.31 - 118.78 105.25 102.17 - 121.96 108.27 105.35 - 121.29 110.72 107.50 - 127.88 118.55 115.56 - 127.01 115.40 112.30 - 127.65 108.80 105.76 - 127.80 105.45 102.30 - 126.56 102.88 99.67 - 131.72 104.80 101.87 - 128.49 102.61 99.36 - 122.28 99.70 96.71 - 120.28 102.86 99.56 - 122.28 108.96 105.67 - 125.97 115.88 112.67 - 126.11 117.36 114.14 - 127.31 115.39 112.45 - 132.28 113.96 110.73 - 132.53 110.87 107.88 - 128.93 106.23 103.12 - 124.91 102.75 99.71 - 124.72 106.26 103.09 - 127.38 110.33 107.11 - 126.75 107.78 104.82 - 123.83 101.38 98.41 - 119.84 100.61 97.58 - 117.39 104.31 100.78 - 117.37 108.86 105.27 - 117.52 105.53 102.11 - 121.72 105.71 101.87 - 124.15 101.77 98.03 - 127.77 103.25 99.29 - 126.81 103.91 100.00 - 126.85 106.00 102.93 - 124.87 103.98 101.21 - 126.08 104.79 101.96 - 129.15 104.66 101.41 - 135.29 109.65 106.66 - 136.96 112.13 109.00 - 129.57 107.35 104.30 - 124.21 100.15 96.98 - 117.17 94.97 91.78 - 116.28 96.54 93.59 - 113.83 96.28 93.06 - 114.20 98.62 95.64 - 114.59 99.47 96.36 - 113.44 99.11 96.09 - 113.83 99.70 96.63 - 154.16 143.18 45.19 - 190.49 180.90 51.02 - 164.47 155.71 44.30 - 118.27 95.11 89.98 - 122.13 100.70 95.61 - 122.74 102.00 96.61 - 126.18 107.69 102.48 - 125.69 107.97 103.17 - 126.83 111.19 106.56 - 126.55 111.03 106.15 - 122.47 109.06 104.14 - 122.38 106.47 100.98 - 121.95 107.77 101.26 - 127.14 112.25 105.56 - 130.51 113.20 106.56 - 127.86 113.39 107.00 - 125.24 111.69 105.02 - 124.64 111.50 105.00 - 120.33 107.36 99.87 - 116.11 101.59 93.45 - 119.17 101.82 92.94 - 120.92 102.57 92.89 - 124.03 102.47 92.46 - 128.29 105.29 95.17 - 128.82 109.88 99.80 - 132.33 118.08 107.83 - 136.89 124.55 114.75 - 138.24 126.21 116.00 - 136.56 121.83 111.30 - 131.04 111.58 101.03 - 125.45 103.59 92.80 - 120.67 104.71 94.37 - 126.44 116.21 106.05 - 133.91 125.31 115.67 - 136.72 126.03 117.33 - 133.96 119.33 111.14 - 127.62 107.73 100.12 - 126.28 105.78 95.51 - 124.95 106.14 95.52 - 128.37 112.13 101.19 - 132.01 116.62 105.70 - 130.22 114.69 104.17 - 129.18 115.25 104.66 - 134.62 121.16 111.47 - 137.76 124.80 115.17 - 135.98 123.30 113.50 - 130.57 119.20 109.32 - 133.12 120.91 110.83 - 137.62 124.45 114.53 - 141.03 123.08 113.23 - 137.24 120.39 110.53 - 133.65 121.36 111.06 - 138.25 129.22 119.30 - 140.55 133.79 123.88 - 144.29 136.65 126.72 - 143.07 134.40 124.68 - 140.94 131.54 122.45 - 141.50 129.21 119.77 - 138.01 128.31 118.82 - 135.62 128.86 119.44 - 135.93 126.20 115.36 - 138.15 125.50 114.00 - 135.95 123.03 111.55 - 134.19 125.36 113.95 - 135.04 128.62 118.25 - 135.00 128.55 119.05 - 134.97 129.83 120.95 - 134.53 132.19 122.22 - 132.69 131.17 119.76 - 133.32 131.10 119.95 - 136.00 132.00 120.48 - 136.15 131.34 120.50 - 133.56 129.38 118.86 - 130.81 128.72 118.62 + 135.22 135.22 124.09 + 136.59 136.59 124.79 + 135.19 135.19 123.58 + 134.26 132.12 121.63 + 137.65 130.97 122.29 + 141.38 133.12 124.36 + 142.86 136.11 127.08 + 140.03 134.66 124.56 + 140.47 132.53 122.06 + 142.06 132.74 122.25 + 142.53 130.00 119.55 + 142.30 127.46 116.65 + 138.18 123.97 112.52 + 136.03 123.51 112.27 + 133.54 122.22 111.31 + 135.49 129.23 118.53 + 135.66 129.59 119.22 + 136.59 129.32 119.47 + 138.55 128.50 119.38 + 137.93 125.50 116.02 + 136.58 122.81 113.52 + 135.39 122.22 112.60 + 131.80 117.97 108.14 + 131.92 114.12 104.18 + 135.47 114.78 103.95 + 135.95 115.42 105.88 + 132.49 113.83 103.95 + 128.71 114.03 103.41 + 130.38 119.25 109.23 + 136.34 123.89 114.64 + 139.78 127.64 118.50 + 138.04 128.82 119.55 + 132.69 124.89 115.87 + 129.56 120.45 111.02 + 126.33 115.31 105.89 + 123.17 109.56 99.45 + 128.78 113.11 102.96 + 137.78 122.64 113.50 + 139.84 122.72 113.20 + 136.64 119.66 110.37 + 130.10 115.76 106.68 + 129.42 117.66 108.25 + 131.03 118.62 109.37 + 132.76 121.86 112.16 + 134.47 124.56 115.44 + 132.94 118.82 109.34 + 133.31 111.05 101.74 + 133.06 106.50 97.19 + 129.32 102.74 93.30 + 126.23 105.95 96.39 + 127.50 118.08 108.12 + 128.22 120.14 110.94 + 129.21 118.02 109.27 + 128.60 116.70 109.28 + 125.47 110.38 103.81 + 126.17 107.66 101.03 + 125.91 108.94 102.59 + 128.28 111.28 104.49 + 127.39 112.19 106.19 + 124.44 107.50 101.81 + 129.28 110.52 104.81 + 130.08 110.83 107.03 + 128.40 109.48 106.09 + 127.17 108.70 105.70 + 128.67 112.18 108.72 + 127.52 109.45 104.89 + 128.20 108.64 101.50 + 125.32 109.17 102.38 + 126.88 111.80 106.14 + 126.41 109.45 103.78 + 124.88 110.55 105.62 + 124.52 108.86 101.64 + 128.53 112.11 104.70 + 133.06 116.89 110.36 + 135.56 117.05 111.42 + 131.86 110.66 107.01 + 124.56 101.23 97.84 + 117.06 96.44 93.42 + 117.36 103.03 99.61 + 118.96 105.43 102.37 + 122.03 108.28 105.38 + 121.29 110.69 107.46 + 127.92 118.56 115.58 + 127.28 115.64 112.55 + 127.55 108.75 105.71 + 127.79 105.50 102.34 + 126.66 102.94 99.74 + 131.93 105.02 102.09 + 128.19 102.50 99.26 + 122.34 99.69 96.69 + 120.53 103.05 99.75 + 122.16 108.96 105.67 + 126.12 116.05 112.83 + 126.02 117.28 114.08 + 127.22 115.30 112.38 + 132.06 113.68 110.44 + 132.44 110.81 107.83 + 128.84 106.16 103.05 + 124.56 102.50 99.44 + 125.08 106.59 103.44 + 127.44 110.34 107.14 + 127.13 108.04 105.08 + 123.91 101.51 98.54 + 120.12 100.81 97.78 + 117.61 104.51 100.99 + 117.28 108.80 105.22 + 117.50 105.58 102.15 + 121.60 105.58 101.74 + 124.19 101.78 98.03 + 127.80 103.33 99.35 + 126.78 103.97 100.03 + 126.90 106.03 102.97 + 124.86 103.94 101.17 + 125.94 104.68 101.85 + 128.78 104.45 101.22 + 135.19 109.57 106.57 + 136.69 111.91 108.78 + 129.65 107.42 104.36 + 124.03 100.08 96.91 + 117.12 95.03 91.81 + 116.38 96.70 93.77 + 113.66 96.08 92.86 + 114.19 98.67 95.69 + 114.37 99.11 96.01 + 113.14 98.94 95.90 + 113.61 99.47 96.42 + 154.34 143.29 45.30 + 190.28 180.78 50.91 + 164.49 155.77 44.31 + 117.89 94.81 89.72 + 122.09 100.67 95.56 + 122.80 102.11 96.69 + 126.31 107.73 102.53 + 125.79 108.03 103.24 + 126.92 111.25 106.64 + 126.59 111.05 106.19 + 122.47 109.00 104.07 + 122.27 106.27 100.80 + 122.00 107.80 101.31 + 127.11 112.20 105.52 + 130.65 113.26 106.64 + 128.07 113.60 107.22 + 125.31 111.75 105.08 + 124.33 111.19 104.68 + 120.38 107.43 99.95 + 116.41 101.88 93.69 + 119.11 101.82 92.94 + 120.86 102.50 92.81 + 123.97 102.45 92.41 + 128.31 105.31 95.16 + 129.05 110.11 100.02 + 132.49 118.21 107.92 + 136.88 124.64 114.86 + 138.40 126.32 116.11 + 136.50 121.71 111.25 + 131.07 111.60 100.98 + 125.39 103.61 92.80 + 120.80 104.83 94.49 + 126.58 116.32 106.16 + 133.76 125.20 115.57 + 136.60 125.95 117.25 + 133.96 119.27 111.06 + 127.70 107.79 100.15 + 126.11 105.56 95.28 + 124.89 106.06 95.48 + 128.34 112.08 101.08 + 131.87 116.53 105.57 + 130.28 114.74 104.25 + 129.12 115.17 104.50 + 134.81 121.33 111.61 + 137.61 124.61 114.98 + 136.10 123.40 113.57 + 130.79 119.30 109.40 + 133.18 120.92 110.86 + 137.64 124.50 114.61 + 140.83 122.92 113.10 + 137.19 120.37 110.53 + 133.76 121.41 111.12 + 138.19 129.16 119.30 + 140.51 133.78 123.88 + 144.22 136.56 126.63 + 143.02 134.35 124.64 + 140.99 131.56 122.48 + 141.44 129.15 119.74 + 137.97 128.31 118.80 + 135.66 128.85 119.39 + 136.02 126.23 115.39 + 138.14 125.51 113.97 + 136.04 123.14 111.61 + 134.12 125.33 113.94 + 134.87 128.51 118.18 + 135.12 128.65 119.12 + 135.00 129.84 120.93 + 134.56 132.22 122.22 + 132.67 131.15 119.76 + 133.29 131.09 119.95 + 135.99 131.95 120.47 + 136.12 131.31 120.48 + 133.49 129.31 118.83 + 130.76 128.69 118.61 sample_blocks: | 2 2 128.00 128.00 128.00 2 18 128.00 128.00 128.00 2 34 128.00 128.00 128.00 - 2 50 185.67 185.67 15.11 + 2 50 186.78 186.78 15.22 2 66 128.00 128.00 128.00 - 2 82 158.11 158.11 158.11 - 2 98 131.00 131.00 131.00 - 2 114 222.89 85.67 85.67 - 2 130 130.89 130.89 97.22 - 2 146 142.78 142.78 99.44 + 2 82 158.22 158.22 158.22 + 2 98 131.33 131.33 131.33 + 2 114 221.89 85.44 85.44 + 2 130 131.44 131.44 97.33 + 2 146 142.44 142.44 99.44 2 162 128.00 128.00 128.00 2 178 128.00 128.00 128.00 2 194 128.00 128.00 128.00 18 2 128.00 128.00 128.00 18 18 128.00 128.00 128.00 - 18 34 141.00 141.00 53.78 + 18 34 141.67 141.67 53.78 18 50 128.00 128.00 128.00 - 18 66 123.78 123.78 123.78 - 18 82 94.11 48.00 48.00 - 18 98 87.78 66.78 66.78 - 18 114 101.33 53.78 53.78 - 18 130 179.67 136.56 136.56 - 18 146 115.44 115.44 115.44 + 18 66 123.67 123.67 123.67 + 18 82 93.11 47.44 47.44 + 18 98 88.33 67.11 67.11 + 18 114 100.56 53.33 53.33 + 18 130 180.56 136.78 136.78 + 18 146 115.33 115.33 115.33 18 162 128.00 128.00 128.00 - 18 178 177.11 150.22 150.22 - 18 194 170.89 170.89 25.56 + 18 178 176.89 150.33 150.33 + 18 194 171.33 171.33 25.56 34 2 128.00 128.00 128.00 - 34 18 158.11 158.11 154.33 + 34 18 158.78 158.78 155.00 34 34 128.00 128.00 128.00 - 34 50 73.11 48.22 48.22 - 34 66 122.89 122.89 122.89 + 34 50 71.78 47.44 47.44 + 34 66 122.67 122.67 122.67 34 82 114.56 114.56 114.56 34 98 128.00 128.00 128.00 - 34 114 136.56 77.00 77.00 - 34 130 158.33 158.33 158.33 - 34 146 122.22 114.67 114.67 - 34 162 125.22 119.00 119.00 - 34 178 153.56 153.56 153.56 + 34 114 135.33 76.22 76.22 + 34 130 158.22 158.22 158.22 + 34 146 122.33 114.67 114.67 + 34 162 125.00 119.00 119.00 + 34 178 153.11 153.11 153.11 34 194 128.00 128.00 128.00 - 50 2 192.22 192.22 44.56 - 50 18 123.44 123.44 123.44 - 50 34 187.11 80.00 80.00 + 50 2 191.89 191.89 44.44 + 50 18 123.56 123.56 123.56 + 50 34 187.67 80.00 80.00 50 50 167.56 167.56 167.56 - 50 66 136.56 97.00 97.00 - 50 82 137.78 84.44 84.44 - 50 98 91.33 91.33 91.33 - 50 114 118.22 47.56 47.56 - 50 130 109.00 94.22 94.22 - 50 146 77.67 60.78 60.78 + 50 66 138.78 98.67 98.67 + 50 82 137.78 84.22 84.22 + 50 98 91.44 91.44 91.44 + 50 114 116.78 47.22 47.22 + 50 130 110.33 95.33 95.33 + 50 146 77.11 60.67 60.67 50 162 138.11 136.78 136.78 50 178 128.00 128.00 128.00 50 194 128.00 128.00 128.00 - 66 2 125.78 125.78 125.78 - 66 18 188.67 188.67 188.67 - 66 34 98.11 67.56 67.56 - 66 50 135.22 135.22 121.56 - 66 66 140.00 138.78 50.44 - 66 82 127.78 72.78 72.78 - 66 98 166.00 118.00 118.00 - 66 114 128.22 85.56 85.56 - 66 130 121.00 121.00 121.00 - 66 146 123.44 122.11 86.78 + 66 2 125.67 125.67 125.67 + 66 18 188.78 188.78 188.78 + 66 34 99.56 68.22 68.22 + 66 50 135.33 135.33 121.67 + 66 66 140.11 138.78 50.56 + 66 82 128.00 73.11 73.11 + 66 98 165.78 118.33 118.33 + 66 114 128.44 86.00 86.00 + 66 130 120.89 120.89 120.89 + 66 146 123.33 122.00 86.56 66 162 125.11 125.11 125.11 - 66 178 106.00 103.22 103.22 + 66 178 106.22 103.56 103.56 66 194 129.11 129.11 129.11 82 2 128.00 128.00 128.00 - 82 18 122.67 93.78 93.78 - 82 34 123.44 123.44 123.44 - 82 50 132.11 92.44 92.44 - 82 66 103.22 91.11 91.11 - 82 82 166.22 163.78 163.78 - 82 98 99.22 99.22 99.22 - 82 114 207.78 206.56 28.00 - 82 130 184.44 184.44 29.78 - 82 146 91.89 84.33 84.33 - 82 162 97.44 97.44 97.44 - 82 178 128.11 128.11 128.11 + 82 18 123.00 93.89 93.89 + 82 34 123.22 123.22 123.22 + 82 50 131.78 91.89 91.89 + 82 66 102.56 90.78 90.78 + 82 82 166.56 164.11 164.11 + 82 98 98.44 98.44 98.44 + 82 114 207.22 206.11 27.78 + 82 130 184.67 184.67 29.89 + 82 146 93.00 85.44 85.44 + 82 162 97.33 97.33 97.33 + 82 178 128.22 128.22 128.22 82 194 128.00 128.00 128.00 98 2 128.00 128.00 128.00 98 18 124.00 118.89 118.89 - 98 34 93.56 75.44 75.44 - 98 50 110.44 73.89 73.89 - 98 66 185.67 166.56 166.56 - 98 82 92.00 52.44 52.44 - 98 98 136.89 136.89 136.89 - 98 114 126.22 121.67 121.67 - 98 130 104.89 44.89 44.89 - 98 146 178.78 178.78 178.78 - 98 162 132.56 128.56 128.56 + 98 34 94.22 75.56 75.56 + 98 50 109.67 73.89 73.89 + 98 66 185.67 166.67 166.67 + 98 82 92.78 52.44 52.44 + 98 98 138.00 138.00 138.00 + 98 114 127.44 123.00 123.00 + 98 130 103.00 43.33 43.33 + 98 146 178.00 178.00 178.00 + 98 162 132.56 128.33 128.33 98 178 128.67 108.56 108.56 98 194 126.89 126.89 126.89 114 2 128.00 128.00 128.00 - 114 18 118.33 109.56 109.56 - 114 34 111.89 105.89 105.89 - 114 50 95.44 95.44 95.44 - 114 66 70.78 70.78 70.78 - 114 82 157.78 155.22 155.22 - 114 98 80.67 59.44 59.44 - 114 114 129.44 114.33 114.33 - 114 130 78.11 69.89 69.89 - 114 146 133.22 68.00 68.00 - 114 162 89.78 69.89 69.89 - 114 178 130.00 130.00 130.00 + 114 18 118.78 110.22 110.22 + 114 34 112.67 106.22 106.22 + 114 50 96.33 96.33 96.33 + 114 66 69.33 69.33 69.33 + 114 82 158.44 155.89 155.89 + 114 98 80.44 59.22 59.22 + 114 114 128.33 113.56 113.56 + 114 130 77.22 69.22 69.22 + 114 146 134.11 69.33 69.33 + 114 162 88.78 69.44 69.44 + 114 178 129.89 129.89 129.89 114 194 128.00 128.00 128.00 130 2 128.00 128.00 128.00 130 18 112.11 112.11 112.11 - 130 34 119.00 119.00 119.00 - 130 50 103.44 103.44 94.56 - 130 66 83.11 76.56 76.56 - 130 82 106.11 106.11 106.11 - 130 98 163.11 163.11 163.11 - 130 114 126.78 110.00 110.00 - 130 130 91.33 65.22 59.11 - 130 146 79.22 54.56 54.56 - 130 162 94.11 47.00 47.00 + 130 34 118.89 118.89 118.89 + 130 50 102.22 102.22 93.33 + 130 66 81.67 75.33 75.33 + 130 82 105.89 105.89 105.89 + 130 98 162.78 162.78 162.78 + 130 114 125.33 108.33 108.33 + 130 130 90.67 64.44 58.22 + 130 146 80.00 54.56 54.56 + 130 162 95.67 48.00 48.00 130 178 128.00 128.00 128.00 130 194 128.00 128.00 128.00 146 2 129.89 129.89 129.89 - 146 18 129.44 59.11 59.11 - 146 34 159.11 159.11 151.11 - 146 50 89.44 40.44 40.44 - 146 66 155.33 132.00 132.00 - 146 82 128.89 128.89 128.89 - 146 98 122.67 119.00 119.00 - 146 114 98.78 65.67 65.67 - 146 130 89.89 60.11 60.11 - 146 146 82.56 78.33 78.33 - 146 162 190.00 68.00 68.00 - 146 178 145.56 80.00 80.00 - 146 194 135.22 135.22 93.33 + 146 18 129.00 59.00 59.00 + 146 34 158.67 158.67 150.56 + 146 50 90.00 40.44 40.44 + 146 66 155.78 132.56 132.56 + 146 82 128.67 128.67 128.67 + 146 98 123.11 119.56 119.56 + 146 114 99.33 66.11 66.11 + 146 130 89.44 59.89 59.89 + 146 146 83.33 78.89 78.89 + 146 162 190.33 68.22 68.22 + 146 178 144.56 79.78 79.78 + 146 194 135.33 135.33 93.22 162 2 128.00 128.00 128.00 - 162 18 117.56 83.00 72.56 - 162 34 125.89 123.22 123.22 + 162 18 117.56 82.56 72.22 + 162 34 125.67 123.11 123.11 162 50 128.00 128.00 128.00 - 162 66 118.33 43.78 43.78 + 162 66 117.78 43.56 43.56 162 82 121.44 121.44 121.44 162 98 123.00 123.00 123.00 - 162 114 110.00 110.00 110.00 - 162 130 124.56 124.56 124.56 - 162 146 77.22 67.89 67.89 - 162 162 128.22 103.89 103.89 + 162 114 110.67 110.67 110.67 + 162 130 124.33 124.33 124.33 + 162 146 78.33 68.78 68.78 + 162 162 129.44 105.11 105.11 162 178 128.00 128.00 128.00 162 194 128.00 128.00 128.00 - 178 2 175.11 175.11 65.33 + 178 2 175.44 175.44 65.44 178 18 128.00 128.00 128.00 - 178 34 121.67 121.67 121.67 + 178 34 121.89 121.89 121.89 178 50 128.00 128.00 128.00 - 178 66 198.56 73.44 73.44 - 178 82 113.56 113.56 113.56 + 178 66 197.78 73.22 73.22 + 178 82 113.78 113.78 113.78 178 98 128.00 128.00 128.00 - 178 114 99.67 69.22 69.22 - 178 130 108.78 83.11 83.11 - 178 146 160.33 156.67 156.67 + 178 114 98.22 68.33 68.33 + 178 130 109.22 83.33 83.33 + 178 146 162.11 158.22 158.22 178 162 128.00 128.00 128.00 178 178 128.00 128.00 128.00 178 194 128.00 128.00 128.00 194 2 128.00 128.00 128.00 194 18 128.00 128.00 128.00 194 34 128.00 128.00 128.00 - 194 50 181.22 181.22 48.89 - 194 66 139.00 139.00 139.00 + 194 50 181.44 181.44 49.00 + 194 66 139.33 139.33 139.33 194 82 125.89 125.89 125.89 194 98 128.00 128.00 128.00 - 194 114 143.00 143.00 143.00 - 194 130 117.44 92.78 92.78 + 194 114 143.56 143.56 143.56 + 194 130 117.00 92.44 92.44 194 146 128.00 128.00 128.00 194 162 128.00 128.00 128.00 194 178 128.00 128.00 128.00 From 3f9e9ee58cfc691b58bbb3e2b6f93e2d5962b286 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 24 Jul 2026 13:16:36 -0400 Subject: [PATCH 048/100] add new dump image keyword names to spelling exceptions --- doc/utils/sphinx-config/false_positives.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/doc/utils/sphinx-config/false_positives.txt b/doc/utils/sphinx-config/false_positives.txt index c57d5d83393..56020b6fad0 100644 --- a/doc/utils/sphinx-config/false_positives.txt +++ b/doc/utils/sphinx-config/false_positives.txt @@ -722,6 +722,7 @@ Ctypes cuda Cuda CUDA +cueing cuFFT CuH Cui @@ -841,6 +842,7 @@ Denoual dephase dephasing deprotonated +depthcue dequidt Dequidt der @@ -1599,6 +1601,8 @@ hbond hcp hdnnp HDNNP +lightdir +repositions runner RUNNER Hearn From 761ada8dc3e70842cf1746bf4497b27a92621710 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 24 Jul 2026 13:33:23 -0400 Subject: [PATCH 049/100] add fog color selection to the dump image depthcue keyword The depthcue keyword takes a third argument selecting the fog color: 'auto' fades toward the background color (following a background gradient) as before, any known color name selects a custom fog color instead, e.g. white fog over a dark background. --- doc/src/dump_image.rst | 17 +- src/GRAPHICS/dump_image.cpp | 11 +- src/GRAPHICS/image.cpp | 20 +- src/GRAPHICS/image.h | 1 + .../tests/dump-image-depthcue-color.yaml | 603 ++++++++++++++++++ .../graphics/tests/dump-image-depthcue.yaml | 2 +- 6 files changed, 639 insertions(+), 15 deletions(-) create mode 100644 unittest/graphics/tests/dump-image-depthcue-color.yaml diff --git a/doc/src/dump_image.rst b/doc/src/dump_image.rst index 5da218b17e0..d56f61f109f 100644 --- a/doc/src/dump_image.rst +++ b/doc/src/dump_image.rst @@ -115,9 +115,10 @@ Syntax shading = *yes* or *no* = turn depth shading on/off seed = random # seed (positive integer) dfactor = strength of shading from 0.0 to 1.0 - *depthcue* values = cueing cfactor = depth cueing + *depthcue* values = cueing cfactor color = depth cueing cueing = *yes* or *no* = turn depth cueing on/off cfactor = strength of fading from 0.0 to 1.0 + color = fog color name or *auto* = fade toward the background color .. _dump_modify_image: @@ -885,12 +886,16 @@ reproducible, which avoids flickering shading in movies. Different .. versionadded:: TBD The *depthcue* keyword turns on/off depth cueing. If *yes* is set, -rendered objects fade toward the background color the more distant from -the viewer they are, similar to looking through fog. This is perceived -as depth and helps to visually untangle dense systems. The *cfactor* +rendered objects fade toward the fog color the more distant from the +viewer they are, similar to looking through fog. This is perceived as +depth and helps to visually untangle dense systems. The *cfactor* value scales the strength of the fading: with *cfactor* = 1.0 the most -distant objects blend completely into the background, smaller values -reduce the maximum amount of fading. The fade range adapts +distant objects blend completely into the fog color, smaller values +reduce the maximum amount of fading. The *color* setting selects the +fog color: with *auto* the objects fade toward the background color, +following the background gradient when one is set with the *backcolor2* +option; any color name known to LAMMPS selects that color instead, +e.g. white or gray fog over a dark background. The fade range adapts automatically to the nearest and most distant rendered objects in each image. Unlike the *ssao* keyword, depth cueing adds no significant computational cost, and both can be combined. diff --git a/src/GRAPHICS/dump_image.cpp b/src/GRAPHICS/dump_image.cpp index f2136ee1089..11278e27d95 100644 --- a/src/GRAPHICS/dump_image.cpp +++ b/src/GRAPHICS/dump_image.cpp @@ -623,13 +623,20 @@ DumpImage::DumpImage(LAMMPS *lmp, int narg, char **arg) : iarg += 4; } else if (strcmp(arg[iarg],"depthcue") == 0) { - if (iarg+3 > narg) utils::missing_cmd_args(FLERR,"dump image depthcue", error); + if (iarg+4 > narg) utils::missing_cmd_args(FLERR,"dump image depthcue", error); image->depthcue = utils::logical(FLERR,arg[iarg+1],false,lmp); double cfactor = utils::numeric(FLERR,arg[iarg+2],false,lmp); if (cfactor < 0.0 || cfactor > 1.0) error->all(FLERR, iarg+2, "Invalid dump image depthcue strength value {}", cfactor); image->depthcueint = cfactor; - iarg += 3; + if (strcmp(arg[iarg+3],"auto") == 0) { + image->depthcuecolor = nullptr; + } else { + image->depthcuecolor = image->color2rgb(arg[iarg+3]); + if (image->depthcuecolor == nullptr) + error->all(FLERR, iarg+3, "Invalid dump image depthcue color {}", arg[iarg+3]); + } + iarg += 4; } else error->all(FLERR, iarg, "Unknown dump image keyword {}", arg[iarg]); } diff --git a/src/GRAPHICS/image.cpp b/src/GRAPHICS/image.cpp index fabf4e5b92a..e3a4cd1a13c 100644 --- a/src/GRAPHICS/image.cpp +++ b/src/GRAPHICS/image.cpp @@ -365,6 +365,7 @@ Image::Image(LAMMPS *lmp, int nmap_caller) : fsaa = NO; depthcue = NO; depthcueint = 0.0; + depthcuecolor = nullptr; up[0] = 0.0; up[1] = 0.0; @@ -1959,21 +1960,28 @@ void Image::compute_depthcue() if (first || ((dmax - dmin) < EPSILON)) return; const double dscale = depthcueint / (dmax - dmin); - // blend pixel colors toward the background color; with a background - // gradient enabled use the same per-row color as in clear() + // blend pixel colors toward the fog color. by default this is the + // background color, with a gradient enabled the same per-row color as + // in clear(); a custom fog color is used for all rows unchanged #if defined(_OPENMP) #pragma omp parallel for schedule(static) #endif for (int iy = 0; iy < height; ++iy) { - int red = background[0]; - int green = background[1]; - int blue = background[2]; - if (background2[0] >= 0) { + int red, green, blue; + if (depthcuecolor) { + red = static_cast(depthcuecolor[0] * 255.0); + green = static_cast(depthcuecolor[1] * 255.0); + blue = static_cast(depthcuecolor[2] * 255.0); + } else if (background2[0] >= 0) { const double fraction = (double) iy / (double) height; red = static_cast(fraction * background2[0] + (1.0 - fraction) * background[0]); green = static_cast(fraction * background2[1] + (1.0 - fraction) * background[1]); blue = static_cast(fraction * background2[2] + (1.0 - fraction) * background[2]); + } else { + red = background[0]; + green = background[1]; + blue = background[2]; } for (int ix = 0; ix < width; ++ix) { const int i = iy * width + ix; diff --git a/src/GRAPHICS/image.h b/src/GRAPHICS/image.h index 6cbbe5f4fd8..72daff6e366 100644 --- a/src/GRAPHICS/image.h +++ b/src/GRAPHICS/image.h @@ -41,6 +41,7 @@ class Image : protected Pointers { double ssaoint; // strength of shading from 0 to 1 int depthcue; // depth cueing on or off double depthcueint; // strength of depth cueing from 0 to 1 + double *depthcuecolor; // fog color; fade toward background color if null double *boxcolor; // color to draw box outline with int background[3]; // RGB values of background int background2[3]; // RGB values of second background color for gradient (off if < 0.0) diff --git a/unittest/graphics/tests/dump-image-depthcue-color.yaml b/unittest/graphics/tests/dump-image-depthcue-color.yaml new file mode 100644 index 00000000000..e0181838948 --- /dev/null +++ b/unittest/graphics/tests/dump-image-depthcue-color.yaml @@ -0,0 +1,603 @@ +--- +lammps_version: 4 Jul 2026 +tags: graphics +date_generated: Fri Jul 24 13:32:11 2026 +epsilon_projection: 0.5 +epsilon_blocks: 2 +nprocs: 1 +prerequisites: | + atom full + pair lj/charmm/coul/charmm + bond harmonic + angle charmm + dihedral charmm + improper harmonic +setup_commands: | + units real + atom_style full + pair_style lj/charmm/coul/charmm 8.0 10.0 + bond_style harmonic + angle_style charmm + dihedral_style charmm + improper_style harmonic + read_data ${input_dir}/data.peptide + neighbor 2.0 bin + dump viz all image 1 ${imagefile} type type size 200 200 zoom 1.5 view 60 30 shiny 0.2 box yes 0.02 bond atom 0.3 depthcue yes 0.9 white + dump_modify viz backcolor black +run_commands: | + run 0 +image_size: 200 200 +sampling: 3 16 +row_means: | + 39.44 43.02 38.55 + 35.21 38.16 36.92 + 38.60 41.05 40.46 + 37.44 39.19 36.65 + 38.31 40.35 36.78 + 36.55 38.97 34.34 + 32.28 34.30 28.48 + 26.54 28.30 22.42 + 27.50 28.59 22.84 + 30.21 32.33 26.84 + 33.25 35.96 30.57 + 33.15 35.69 30.55 + 44.83 49.98 45.63 + 56.41 65.58 63.05 + 67.55 82.45 79.77 + 68.33 82.41 78.31 + 67.27 77.95 73.37 + 69.16 77.11 76.09 + 64.83 72.25 73.22 + 63.69 73.11 75.92 + 64.64 76.25 84.23 + 67.33 83.09 90.81 + 72.33 90.25 96.94 + 71.68 88.85 92.76 + 70.28 86.53 86.99 + 67.47 83.81 83.98 + 60.50 75.00 77.03 + 63.48 78.94 83.07 + 73.28 89.06 96.82 + 74.38 89.05 98.92 + 78.35 94.33 102.83 + 77.85 95.67 101.66 + 73.96 94.83 96.97 + 68.91 90.72 92.53 + 70.85 93.03 96.26 + 68.41 87.53 89.81 + 63.02 79.31 81.25 + 65.67 84.11 87.55 + 74.85 96.17 100.50 + 79.92 101.32 106.74 + 81.46 102.45 108.51 + 82.03 102.36 107.19 + 93.09 115.41 121.28 + 90.28 107.56 110.70 + 87.25 105.39 105.11 + 83.89 107.65 110.17 + 83.61 109.30 119.19 + 89.22 116.12 129.24 + 86.41 112.74 125.72 + 88.79 114.88 124.03 + 80.95 107.64 112.50 + 74.56 99.14 103.85 + 83.81 110.36 113.58 + 85.89 110.94 111.83 + 84.98 106.10 105.14 + 86.50 109.74 106.42 + 83.40 107.69 103.16 + 76.08 101.24 98.47 + 67.59 90.78 89.42 + 76.58 96.69 98.12 + 86.83 108.40 114.01 + 88.42 107.78 112.82 + 87.04 110.05 114.33 + 84.69 115.22 115.72 + 85.41 118.06 113.91 + 79.50 109.81 105.24 + 70.75 97.25 93.59 + 70.86 98.81 101.62 + 71.60 101.70 103.94 + 71.01 93.63 97.61 + 77.66 95.27 101.45 + 83.94 99.01 107.17 + 84.62 103.05 113.16 + 84.56 109.41 115.70 + 83.39 116.94 116.78 + 82.16 116.86 116.58 + 84.18 110.99 116.17 + 84.08 107.53 115.36 + 76.02 97.98 102.64 + 73.58 98.04 96.32 + 78.69 109.46 103.95 + 82.83 113.86 111.92 + 80.62 106.36 111.19 + 77.83 101.02 106.22 + 74.53 95.89 100.69 + 69.56 96.77 101.89 + 62.42 97.27 104.56 + 60.81 94.73 103.52 + 77.02 113.20 125.43 + 88.44 120.23 134.48 + 87.45 118.42 132.65 + 87.80 117.57 134.20 + 87.12 119.42 133.06 + 80.28 112.34 122.69 + 78.80 109.87 119.90 + 81.44 109.91 121.54 + 79.11 109.61 123.14 + 72.61 105.20 117.20 + 65.30 96.12 107.69 + 64.23 89.33 100.17 + 64.33 87.83 97.69 + 70.70 91.94 107.38 + 72.61 98.70 115.38 + 80.92 114.52 129.69 + 82.39 119.54 135.06 + 85.90 124.19 137.13 + 79.58 111.79 124.80 + 77.50 106.05 123.24 + 83.54 107.50 127.23 + 93.17 111.59 131.93 + 92.41 107.81 123.90 + 92.72 110.50 125.42 + 99.62 131.00 138.48 + 100.87 137.84 142.22 + 101.34 135.57 140.69 + 96.92 128.90 137.42 + 94.13 122.03 130.93 + 92.64 124.06 130.43 + 82.03 110.33 119.30 + 79.61 103.87 117.90 + 72.56 92.05 107.47 + 74.02 95.19 108.99 + 86.78 113.23 126.69 + 96.75 127.12 141.83 + 98.59 130.19 143.60 + 95.23 121.33 134.46 + 102.29 127.44 138.81 + 104.25 130.66 141.38 + 101.41 130.14 138.00 + 94.52 124.53 134.28 + 87.75 115.41 123.25 + 84.88 113.33 120.88 + 86.31 112.56 121.36 + 83.99 105.76 115.81 + 77.11 95.23 104.83 + 82.69 106.13 112.16 + 88.48 116.74 122.85 + 87.60 117.21 124.53 + 88.83 115.20 124.44 + 90.84 114.20 127.98 + 87.46 109.66 126.32 + 92.94 118.40 133.60 + 93.28 117.45 128.22 + 96.89 122.57 130.16 + 95.09 119.69 125.81 + 94.86 118.91 123.10 + 89.69 110.01 114.82 + 91.62 112.05 118.25 + 92.22 115.39 123.59 + 80.15 103.02 111.83 + 73.86 98.56 107.03 + 71.78 95.86 100.95 + 74.66 98.59 106.12 + 83.50 106.97 117.42 + 91.69 118.92 131.41 + 93.50 121.23 131.19 + 91.59 118.56 128.71 + 84.08 106.87 115.52 + 73.14 88.88 97.06 + 70.81 85.50 92.16 + 70.82 86.91 89.86 + 71.03 88.36 90.64 + 70.14 90.81 90.12 + 72.44 95.11 94.85 + 70.45 90.81 94.42 + 72.90 94.64 100.58 + 71.42 92.65 98.38 + 70.14 87.05 92.69 + 63.77 76.92 80.80 + 61.09 72.61 75.31 + 57.35 70.67 76.79 + 61.13 80.47 85.49 + 67.42 90.08 93.86 + 65.91 84.57 87.12 + 59.55 72.16 72.47 + 46.45 55.57 55.34 + 36.80 47.02 45.77 + 37.59 49.03 47.98 + 41.98 51.53 51.27 + 45.20 52.46 51.87 + 42.51 51.20 49.34 + 43.99 53.80 48.43 + 45.35 57.82 50.80 + 44.52 56.09 48.98 + 39.60 48.57 43.10 + 38.38 44.95 41.54 + 38.18 41.06 38.72 + 39.94 43.07 40.41 + 42.07 47.02 43.98 + 37.41 41.77 36.68 + 33.60 37.92 31.36 + 32.03 34.87 27.87 + 31.84 33.72 27.32 + 35.84 41.50 35.64 + 38.65 44.85 40.56 + 37.32 42.98 39.35 + 28.07 33.77 30.46 + 25.68 30.77 26.45 + 27.66 30.20 21.71 + 23.51 24.54 15.50 +col_means: | + 20.76 23.70 17.44 + 23.88 28.28 21.80 + 23.77 27.23 20.32 + 25.77 29.43 23.80 + 30.80 36.23 34.38 + 34.45 40.99 40.63 + 37.88 47.15 45.59 + 41.97 52.48 49.30 + 43.01 52.66 51.28 + 44.84 54.65 54.09 + 46.63 56.04 58.10 + 45.49 53.77 57.05 + 44.13 50.72 52.92 + 45.74 53.87 54.22 + 49.01 57.97 57.54 + 44.77 55.25 53.20 + 45.51 58.36 54.67 + 50.57 64.18 62.30 + 49.88 63.42 65.75 + 53.94 67.58 70.58 + 57.06 70.04 72.68 + 58.41 70.36 74.20 + 56.91 67.89 73.28 + 61.97 73.94 81.31 + 71.12 87.06 95.83 + 71.06 90.18 99.63 + 67.78 84.74 90.97 + 64.11 78.48 82.64 + 59.12 73.14 74.65 + 60.98 80.35 82.31 + 65.04 84.91 89.18 + 65.77 86.43 89.34 + 66.53 86.56 87.11 + 65.42 82.31 84.02 + 59.55 71.87 75.22 + 70.42 84.78 90.40 + 71.83 86.89 92.61 + 66.77 87.80 92.92 + 70.21 93.91 98.39 + 68.55 89.96 95.66 + 60.37 77.56 82.22 + 62.58 80.31 83.48 + 72.53 93.70 98.33 + 77.52 100.16 103.81 + 80.53 107.59 109.84 + 81.50 107.73 111.83 + 78.47 98.72 108.15 + 77.59 94.52 106.22 + 78.15 95.22 106.97 + 78.86 96.81 105.98 + 75.58 98.60 100.97 + 75.70 100.94 101.12 + 79.27 101.92 105.95 + 74.66 97.19 103.03 + 75.52 96.06 103.57 + 71.39 88.27 97.48 + 72.56 89.14 98.47 + 78.52 97.97 104.64 + 79.39 100.31 105.36 + 86.65 107.61 113.00 + 78.97 99.42 107.88 + 83.36 107.72 116.33 + 89.39 118.02 128.25 + 93.25 123.67 133.46 + 91.65 124.30 134.03 + 94.87 125.15 135.03 + 98.20 126.78 136.54 + 89.39 118.06 125.58 + 78.38 105.66 112.28 + 82.48 107.60 115.87 + 76.92 102.75 110.79 + 85.36 115.20 122.00 + 98.69 132.11 138.91 + 92.91 126.77 133.51 + 92.41 125.10 131.08 + 81.19 109.80 118.09 + 81.78 103.78 115.72 + 89.61 113.59 125.47 + 94.47 123.84 131.82 + 96.02 129.66 136.52 + 89.19 123.50 130.47 + 93.01 129.10 133.81 + 85.89 121.06 126.35 + 87.86 121.12 127.72 + 84.48 111.77 123.37 + 74.48 97.61 113.39 + 77.19 102.58 116.60 + 79.00 102.20 117.64 + 75.59 97.92 111.76 + 82.54 102.19 114.86 + 79.33 98.64 108.23 + 70.58 92.66 99.25 + 72.79 101.66 104.41 + 83.48 113.58 112.88 + 87.30 116.55 116.42 + 85.65 113.13 117.25 + 76.81 98.97 109.25 + 73.25 93.83 105.83 + 73.31 93.49 104.31 + 79.80 104.66 112.11 + 91.49 123.75 130.49 + 90.62 120.22 131.47 + 95.30 123.00 134.87 + 90.83 118.44 128.53 + 88.67 119.60 125.68 + 85.03 114.22 116.25 + 84.67 113.95 118.19 + 82.20 109.64 115.67 + 88.46 112.00 119.83 + 86.47 111.83 120.25 + 87.35 115.05 122.73 + 87.61 119.18 127.34 + 91.12 123.76 135.90 + 81.58 115.26 126.27 + 83.93 117.95 132.93 + 80.98 115.97 133.31 + 75.92 111.28 126.89 + 68.51 101.20 114.19 + 64.28 94.97 110.88 + 64.08 88.03 103.40 + 68.28 88.31 102.03 + 71.08 92.84 104.45 + 73.86 95.16 105.20 + 71.70 97.91 107.34 + 83.03 113.24 120.21 + 83.23 117.31 124.86 + 131.97 127.94 71.44 + 141.91 138.63 72.98 + 104.53 106.27 63.63 + 67.34 90.51 107.75 + 65.22 89.46 105.71 + 70.62 97.20 114.98 + 73.83 105.09 118.56 + 77.74 114.16 124.68 + 74.00 107.62 114.43 + 69.61 95.47 104.65 + 71.72 97.53 105.05 + 75.08 99.19 109.72 + 77.22 105.52 113.40 + 84.51 116.78 123.46 + 83.58 113.83 121.64 + 75.97 107.44 113.78 + 80.16 110.06 117.17 + 82.30 113.44 120.40 + 85.92 117.36 123.45 + 90.67 121.78 125.78 + 91.28 117.92 125.57 + 93.14 118.58 125.64 + 95.94 118.79 129.53 + 94.97 115.38 129.62 + 87.21 110.56 120.28 + 81.03 106.47 111.06 + 79.04 107.51 111.27 + 72.44 99.76 103.22 + 74.05 98.75 103.00 + 85.23 109.78 116.39 + 91.69 113.80 122.54 + 89.32 110.30 115.28 + 88.00 111.23 114.23 + 81.75 106.42 107.19 + 80.85 103.84 106.08 + 74.36 93.05 96.58 + 78.32 93.57 100.92 + 81.42 95.53 101.53 + 89.69 105.26 110.97 + 90.00 108.95 113.44 + 84.50 102.16 107.15 + 81.00 97.81 101.05 + 75.42 90.25 92.83 + 65.47 79.34 82.21 + 69.83 86.66 89.52 + 71.75 87.47 90.77 + 68.72 81.53 83.83 + 65.91 76.97 79.61 + 58.95 69.45 72.07 + 57.16 65.88 71.79 + 59.74 68.69 74.50 + 51.49 58.53 61.09 + 46.23 55.01 54.19 + 54.48 67.39 65.50 + 52.63 65.96 64.04 + 57.14 70.08 69.27 + 59.25 71.24 71.97 + 60.27 71.33 72.89 + 56.27 65.64 66.53 + 52.02 60.51 60.05 + 51.49 58.30 58.80 + 54.83 61.71 62.52 + 55.51 61.72 61.38 + 54.82 61.51 59.27 + 49.63 56.83 54.82 + 45.47 52.09 49.69 + 38.48 44.02 41.57 + 31.69 36.11 33.06 + 31.57 35.01 30.54 + 28.80 30.33 26.18 + 29.47 30.78 27.56 + 29.39 30.99 28.93 + 27.52 28.80 26.66 + 21.32 21.46 18.33 +sample_blocks: | + 2 2 0.00 0.00 0.00 + 2 18 0.00 0.00 0.00 + 2 34 0.00 0.00 0.00 + 2 50 192.33 181.44 122.22 + 2 66 0.00 0.00 0.00 + 2 82 69.78 95.78 95.78 + 2 98 35.33 40.78 40.78 + 2 114 154.22 154.22 207.67 + 2 130 19.22 18.67 15.56 + 2 146 83.56 81.11 48.22 + 2 162 0.00 0.00 0.00 + 2 178 0.00 0.00 0.00 + 2 194 0.00 0.00 0.00 + 18 2 0.00 0.00 0.00 + 18 18 0.00 0.00 0.00 + 18 34 112.00 105.89 74.00 + 18 50 0.00 0.00 0.00 + 18 66 0.00 0.00 0.00 + 18 82 159.33 160.33 196.56 + 18 98 140.67 166.00 174.22 + 18 114 102.11 102.11 134.00 + 18 130 120.56 156.33 183.44 + 18 146 44.89 49.67 49.67 + 18 162 0.00 0.00 0.00 + 18 178 129.33 179.89 202.11 + 18 194 229.33 222.22 124.22 + 34 2 0.00 0.00 0.00 + 34 18 71.11 129.56 129.56 + 34 34 0.00 0.00 0.00 + 34 50 132.78 160.44 171.33 + 34 66 0.00 0.00 0.00 + 34 82 77.33 96.67 96.67 + 34 98 0.00 0.00 0.00 + 34 114 114.89 133.67 177.78 + 34 130 106.89 158.78 158.78 + 34 146 27.11 27.11 33.22 + 34 162 13.67 19.44 19.44 + 34 178 115.11 194.11 194.11 + 34 194 0.00 0.00 0.00 + 50 2 147.11 140.22 53.22 + 50 18 0.00 0.00 0.00 + 50 34 77.11 77.11 181.22 + 50 50 97.11 180.67 180.67 + 50 66 103.67 151.11 178.11 + 50 82 94.22 112.44 158.22 + 50 98 102.56 118.22 118.22 + 50 114 138.22 141.11 193.44 + 50 130 84.00 123.56 137.22 + 50 146 128.89 152.11 173.56 + 50 162 102.44 171.00 171.00 + 50 178 0.00 0.00 0.00 + 50 194 0.00 0.00 0.00 + 66 2 0.00 0.00 0.00 + 66 18 68.11 137.00 137.00 + 66 34 84.56 84.56 113.78 + 66 50 55.22 118.78 118.78 + 66 66 202.11 205.56 110.56 + 66 82 56.44 91.22 120.67 + 66 98 46.67 83.00 127.44 + 66 114 78.33 99.44 157.22 + 66 130 66.33 138.00 138.00 + 66 146 49.89 64.78 46.44 + 66 162 7.67 7.67 7.67 + 66 178 54.22 62.78 65.44 + 66 194 30.00 41.67 41.67 + 82 2 0.00 0.00 0.00 + 82 18 41.78 41.78 66.33 + 82 34 17.56 25.00 25.00 + 82 50 111.00 148.33 167.78 + 82 66 110.00 164.11 173.67 + 82 82 40.44 114.89 114.89 + 82 98 99.89 131.56 131.56 + 82 114 183.67 183.78 61.00 + 82 130 172.00 151.44 29.89 + 82 146 122.67 169.00 179.78 + 82 162 80.33 92.44 92.44 + 82 178 0.00 0.00 0.00 + 82 194 0.00 0.00 0.00 + 98 2 0.00 0.00 0.00 + 98 18 0.00 0.00 0.00 + 98 34 94.56 123.78 134.33 + 98 50 64.89 67.22 89.11 + 98 66 84.33 159.11 169.89 + 98 82 94.33 118.89 156.33 + 98 98 60.33 131.11 131.11 + 98 114 84.33 179.56 179.56 + 98 130 103.22 119.89 162.78 + 98 146 79.44 170.11 170.11 + 98 162 105.78 168.11 168.11 + 98 178 50.44 50.44 65.11 + 98 194 0.00 0.00 0.00 + 114 2 0.00 0.00 0.00 + 114 18 104.56 127.56 134.78 + 114 34 46.33 51.11 54.22 + 114 50 117.89 188.22 188.22 + 114 66 131.67 166.22 166.22 + 114 82 86.00 175.89 175.89 + 114 98 166.56 191.22 209.33 + 114 114 75.22 109.78 141.11 + 114 130 110.56 154.67 161.11 + 114 146 103.22 118.67 171.44 + 114 162 128.33 153.44 169.78 + 114 178 27.00 35.44 35.44 + 114 194 0.00 0.00 0.00 + 130 2 0.00 0.00 0.00 + 130 18 74.44 92.00 92.00 + 130 34 44.89 60.11 60.11 + 130 50 124.22 152.22 148.22 + 130 66 139.22 195.67 195.67 + 130 82 43.89 45.00 45.00 + 130 98 87.67 178.56 178.56 + 130 114 61.89 122.89 129.11 + 130 130 121.89 130.44 121.44 + 130 146 155.11 175.22 182.56 + 130 162 163.22 173.78 203.67 + 130 178 0.00 0.00 0.00 + 130 194 0.00 0.00 0.00 + 146 2 0.00 0.00 0.00 + 146 18 133.89 140.89 172.78 + 146 34 100.44 139.78 139.78 + 146 50 155.44 160.89 192.22 + 146 66 111.44 158.00 184.33 + 146 82 11.44 19.00 19.00 + 146 98 100.89 163.67 169.00 + 146 114 76.44 77.89 102.00 + 146 130 70.11 91.33 108.11 + 146 146 139.11 161.11 162.44 + 146 162 119.67 119.67 186.67 + 146 178 67.56 67.56 81.33 + 146 194 110.33 109.00 83.67 + 162 2 0.00 0.00 0.00 + 162 18 161.89 192.56 191.67 + 162 34 44.00 54.22 60.56 + 162 50 0.00 0.00 0.00 + 162 66 117.56 120.44 150.78 + 162 82 58.89 78.89 78.89 + 162 98 17.44 19.11 19.11 + 162 114 46.11 70.33 70.33 + 162 130 12.44 21.22 21.22 + 162 146 106.11 130.67 130.67 + 162 162 138.11 172.33 183.44 + 162 178 0.00 0.00 0.00 + 162 194 0.00 0.00 0.00 + 178 2 169.33 166.11 97.56 + 178 18 0.00 0.00 0.00 + 178 34 73.78 95.11 95.11 + 178 50 0.00 0.00 0.00 + 178 66 103.11 103.11 170.33 + 178 82 42.56 51.22 51.22 + 178 98 0.00 0.00 0.00 + 178 114 125.67 151.78 182.44 + 178 130 45.22 45.22 63.78 + 178 146 96.56 154.44 154.44 + 178 162 0.00 0.00 0.00 + 178 178 0.00 0.00 0.00 + 178 194 0.00 0.00 0.00 + 194 2 0.00 0.00 0.00 + 194 18 0.00 0.00 0.00 + 194 34 0.00 0.00 0.00 + 194 50 140.11 134.78 79.89 + 194 66 46.33 69.22 69.22 + 194 82 0.00 0.00 0.00 + 194 98 0.00 0.00 0.00 + 194 114 91.67 143.00 143.00 + 194 130 93.89 133.22 151.33 + 194 146 0.00 0.00 0.00 + 194 162 0.00 0.00 0.00 + 194 178 0.00 0.00 0.00 + 194 194 0.00 0.00 0.00 +... diff --git a/unittest/graphics/tests/dump-image-depthcue.yaml b/unittest/graphics/tests/dump-image-depthcue.yaml index 48c0d4958a6..2416f385938 100644 --- a/unittest/graphics/tests/dump-image-depthcue.yaml +++ b/unittest/graphics/tests/dump-image-depthcue.yaml @@ -22,7 +22,7 @@ setup_commands: | improper_style harmonic read_data ${input_dir}/data.peptide neighbor 2.0 bin - dump viz all image 1 ${imagefile} type type size 200 200 zoom 1.5 view 60 30 shiny 0.2 box yes 0.02 bond atom 0.3 depthcue yes 0.8 + dump viz all image 1 ${imagefile} type type size 200 200 zoom 1.5 view 60 30 shiny 0.2 box yes 0.02 bond atom 0.3 depthcue yes 0.8 auto dump_modify viz backcolor blue backcolor2 black run_commands: | run 0 From be0eff845bba0a237d08316374e88e27d8057eee Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 24 Jul 2026 13:47:30 -0400 Subject: [PATCH 050/100] add fog start position to the dump image depthcue keyword The depthcue keyword takes a fourth argument setting where the fading begins: 'auto' starts at the nearest rendered object as before, a numeric value places the start at that fraction of the simulation box projected onto the view direction (0.0 = box side nearest to the camera, 1.0 = far side), analogous to the center keyword fractions. Objects in front of the start position remain unfaded, so the fading can be confined to the rear of a scene instead of ramping across the entire visible depth range. --- doc/src/dump_image.rst | 18 +- src/GRAPHICS/dump_image.cpp | 10 +- src/GRAPHICS/image.cpp | 51 +- src/GRAPHICS/image.h | 3 + .../tests/dump-image-depthcue-color.yaml | 2 +- .../tests/dump-image-depthcue-start.yaml | 603 ++++++++++++++++++ .../graphics/tests/dump-image-depthcue.yaml | 2 +- 7 files changed, 675 insertions(+), 14 deletions(-) create mode 100644 unittest/graphics/tests/dump-image-depthcue-start.yaml diff --git a/doc/src/dump_image.rst b/doc/src/dump_image.rst index d56f61f109f..61945f354b5 100644 --- a/doc/src/dump_image.rst +++ b/doc/src/dump_image.rst @@ -115,10 +115,11 @@ Syntax shading = *yes* or *no* = turn depth shading on/off seed = random # seed (positive integer) dfactor = strength of shading from 0.0 to 1.0 - *depthcue* values = cueing cfactor color = depth cueing + *depthcue* values = cueing cfactor color start = depth cueing cueing = *yes* or *no* = turn depth cueing on/off cfactor = strength of fading from 0.0 to 1.0 color = fog color name or *auto* = fade toward the background color + start = box fraction along the view direction where fading starts, or *auto* = nearest rendered object .. _dump_modify_image: @@ -895,9 +896,18 @@ reduce the maximum amount of fading. The *color* setting selects the fog color: with *auto* the objects fade toward the background color, following the background gradient when one is set with the *backcolor2* option; any color name known to LAMMPS selects that color instead, -e.g. white or gray fog over a dark background. The fade range adapts -automatically to the nearest and most distant rendered objects in each -image. Unlike the *ssao* keyword, depth cueing adds no significant +e.g. white or gray fog over a dark background. The *start* setting +determines where the fading begins. With *auto* it begins at the +nearest rendered object, so the front of the scene is always unfaded. +A numeric value instead positions the start as a fraction of the +simulation box projected onto the view direction, similar to the +fractions of the *center* keyword but reduced to a single number: 0.0 +starts the fading at the side of the box nearest to the camera, 0.5 at +its middle, and 1.0 at its far side; values outside this range are +allowed. Objects in front of the start position remain unfaded, which +avoids darkening most of the scene when the rendered objects span a +large depth range. The fading always ends at the most distant rendered +object. Unlike the *ssao* keyword, depth cueing adds no significant computational cost, and both can be combined. ---------- diff --git a/src/GRAPHICS/dump_image.cpp b/src/GRAPHICS/dump_image.cpp index 11278e27d95..27e3680c6be 100644 --- a/src/GRAPHICS/dump_image.cpp +++ b/src/GRAPHICS/dump_image.cpp @@ -623,7 +623,7 @@ DumpImage::DumpImage(LAMMPS *lmp, int narg, char **arg) : iarg += 4; } else if (strcmp(arg[iarg],"depthcue") == 0) { - if (iarg+4 > narg) utils::missing_cmd_args(FLERR,"dump image depthcue", error); + if (iarg+5 > narg) utils::missing_cmd_args(FLERR,"dump image depthcue", error); image->depthcue = utils::logical(FLERR,arg[iarg+1],false,lmp); double cfactor = utils::numeric(FLERR,arg[iarg+2],false,lmp); if (cfactor < 0.0 || cfactor > 1.0) @@ -636,7 +636,13 @@ DumpImage::DumpImage(LAMMPS *lmp, int narg, char **arg) : if (image->depthcuecolor == nullptr) error->all(FLERR, iarg+3, "Invalid dump image depthcue color {}", arg[iarg+3]); } - iarg += 4; + if (strcmp(arg[iarg+4],"auto") == 0) { + image->depthcuestartflag = 0; + } else { + image->depthcuestart = utils::numeric(FLERR,arg[iarg+4],false,lmp); + image->depthcuestartflag = 1; + } + iarg += 5; } else error->all(FLERR, iarg, "Unknown dump image keyword {}", arg[iarg]); } diff --git a/src/GRAPHICS/image.cpp b/src/GRAPHICS/image.cpp index e3a4cd1a13c..a81356399ec 100644 --- a/src/GRAPHICS/image.cpp +++ b/src/GRAPHICS/image.cpp @@ -366,6 +366,9 @@ Image::Image(LAMMPS *lmp, int nmap_caller) : depthcue = NO; depthcueint = 0.0; depthcuecolor = nullptr; + depthcuestartflag = 0; + depthcuestart = 0.0; + for (auto &b : boxbounds) b = 0.0; up[0] = 0.0; up[1] = 0.0; @@ -665,6 +668,15 @@ void Image::buffers() void Image::view_params(double boxxlo, double boxxhi, double boxylo, double boxyhi, double boxzlo, double boxzhi) { + // keep box bounds for projecting the box onto the view direction + + boxbounds[0] = boxxlo; + boxbounds[1] = boxxhi; + boxbounds[2] = boxylo; + boxbounds[3] = boxyhi; + boxbounds[4] = boxzlo; + boxbounds[5] = boxzhi; + // camDir points at the camera, view direction = -camDir camDir[0] = sin(theta)*cos(phi); @@ -1932,9 +1944,10 @@ void Image::compute_SSAO() /* ---------------------------------------------------------------------- apply depth cueing to the composited image on the output rank: - fade drawn pixels toward the background color with increasing distance - from the viewer. the fade range is taken from the nearest and most - distant drawn pixels, so the effect adapts to the visible scene. + fade drawn pixels toward the fog color with increasing distance from + the viewer. the fade ends at the most distant drawn pixel and starts + at the nearest drawn pixel or at a chosen fraction of the simulation + box projected onto the view direction. ------------------------------------------------------------------------- */ void Image::compute_depthcue() @@ -1958,7 +1971,33 @@ void Image::compute_depthcue() // nothing to do without drawn pixels or without depth variation if (first || ((dmax - dmin) < EPSILON)) return; - const double dscale = depthcueint / (dmax - dmin); + + // start of the fade: by default the nearest drawn pixel. with a start + // fraction set, project the corners of the simulation box onto the view + // direction and place the start at that fraction between the near and + // far side of the box as seen from the camera + + double dstart = dmin; + if (depthcuestartflag) { + const double dcam = MathExtra::dot3(camPos,camDir); + double dnear = 0.0, dfar = 0.0; + for (int ic = 0; ic < 8; ++ic) { + double corner[3]; + corner[0] = ((ic & 1) ? boxbounds[1] : boxbounds[0]) - xctr; + corner[1] = ((ic & 2) ? boxbounds[3] : boxbounds[2]) - yctr; + corner[2] = ((ic & 4) ? boxbounds[5] : boxbounds[4]) - zctr; + const double d = dcam - MathExtra::dot3(corner,camDir); + if (ic == 0) { + dnear = dfar = d; + } else { + dnear = MIN(dnear,d); + dfar = MAX(dfar,d); + } + } + dstart = dnear + depthcuestart * (dfar - dnear); + if (dstart >= (dmax - EPSILON)) return; // fading starts behind all drawn pixels + } + const double dscale = depthcueint / (dmax - dstart); // blend pixel colors toward the fog color. by default this is the // background color, with a gradient enabled the same per-row color as @@ -1986,8 +2025,8 @@ void Image::compute_depthcue() for (int ix = 0; ix < width; ++ix) { const int i = iy * width + ix; const double d = depthBuffer[i]; - if (d < 0.0) continue; - const double f = (d - dmin) * dscale; + if (d < 0.0 || d <= dstart) continue; + const double f = (d - dstart) * dscale; writeBuffer[i*3+0] = static_cast((1.0 - f) * writeBuffer[i*3+0] + f * red); writeBuffer[i*3+1] = static_cast((1.0 - f) * writeBuffer[i*3+1] + f * green); writeBuffer[i*3+2] = static_cast((1.0 - f) * writeBuffer[i*3+2] + f * blue); diff --git a/src/GRAPHICS/image.h b/src/GRAPHICS/image.h index 72daff6e366..a23743894f3 100644 --- a/src/GRAPHICS/image.h +++ b/src/GRAPHICS/image.h @@ -42,6 +42,8 @@ class Image : protected Pointers { int depthcue; // depth cueing on or off double depthcueint; // strength of depth cueing from 0 to 1 double *depthcuecolor; // fog color; fade toward background color if null + int depthcuestartflag; // 1 if fading starts at a box fraction, 0 at nearest object + double depthcuestart; // start of fading as box fraction along the view direction double *boxcolor; // color to draw box outline with int background[3]; // RGB values of background int background2[3]; // RGB values of second background color for gradient (off if < 0.0) @@ -137,6 +139,7 @@ class Image : protected Pointers { double zdist; double tanPerPixel; + double boxbounds[6]; // box bounds from the last view_params() call double camDir[3], camUp[3], camRight[4], camPos[3]; double keyLightDir[3], fillLightDir[3], backLightDir[3]; double keyHalfDir[3]; diff --git a/unittest/graphics/tests/dump-image-depthcue-color.yaml b/unittest/graphics/tests/dump-image-depthcue-color.yaml index e0181838948..56b02bbe885 100644 --- a/unittest/graphics/tests/dump-image-depthcue-color.yaml +++ b/unittest/graphics/tests/dump-image-depthcue-color.yaml @@ -22,7 +22,7 @@ setup_commands: | improper_style harmonic read_data ${input_dir}/data.peptide neighbor 2.0 bin - dump viz all image 1 ${imagefile} type type size 200 200 zoom 1.5 view 60 30 shiny 0.2 box yes 0.02 bond atom 0.3 depthcue yes 0.9 white + dump viz all image 1 ${imagefile} type type size 200 200 zoom 1.5 view 60 30 shiny 0.2 box yes 0.02 bond atom 0.3 depthcue yes 0.9 white auto dump_modify viz backcolor black run_commands: | run 0 diff --git a/unittest/graphics/tests/dump-image-depthcue-start.yaml b/unittest/graphics/tests/dump-image-depthcue-start.yaml new file mode 100644 index 00000000000..fbd2d8b4442 --- /dev/null +++ b/unittest/graphics/tests/dump-image-depthcue-start.yaml @@ -0,0 +1,603 @@ +--- +lammps_version: 4 Jul 2026 +tags: graphics +date_generated: Fri Jul 24 13:46:19 2026 +epsilon_projection: 0.5 +epsilon_blocks: 2 +nprocs: 1 +prerequisites: | + atom full + pair lj/charmm/coul/charmm + bond harmonic + angle charmm + dihedral charmm + improper harmonic +setup_commands: | + units real + atom_style full + pair_style lj/charmm/coul/charmm 8.0 10.0 + bond_style harmonic + angle_style charmm + dihedral_style charmm + improper_style harmonic + read_data ${input_dir}/data.peptide + neighbor 2.0 bin + dump viz all image 1 ${imagefile} type type size 200 200 zoom 1.5 view 60 30 shiny 0.2 box yes 0.02 bond atom 0.3 depthcue yes 1.0 auto 0.5 + dump_modify viz backcolor blue backcolor2 black +run_commands: | + run 0 +image_size: 200 200 +sampling: 3 16 +row_means: | + 14.11 20.38 13.10 + 9.52 14.61 14.01 + 12.29 16.42 17.75 + 15.26 18.27 17.71 + 15.18 18.81 17.05 + 14.74 19.12 16.17 + 15.03 18.66 14.62 + 14.30 17.41 15.22 + 14.64 16.45 15.29 + 14.53 18.25 18.21 + 16.95 21.67 23.30 + 16.82 21.25 24.21 + 17.98 27.36 31.50 + 18.93 35.82 42.76 + 21.41 49.05 55.81 + 21.48 47.60 52.44 + 19.34 39.12 43.69 + 19.68 34.33 45.67 + 20.45 33.70 50.88 + 15.99 32.60 53.88 + 10.03 30.59 60.16 + 11.24 39.34 68.70 + 12.79 44.41 71.25 + 13.37 43.46 66.11 + 12.99 41.38 58.88 + 13.67 42.24 60.77 + 13.84 39.15 62.80 + 13.96 41.09 67.78 + 14.06 41.98 72.42 + 16.41 42.35 77.19 + 17.02 44.59 76.13 + 15.42 45.59 73.30 + 15.74 50.91 74.63 + 15.23 52.13 76.45 + 14.89 52.28 77.70 + 13.29 45.06 70.02 + 13.19 40.28 67.65 + 15.12 45.27 74.12 + 16.27 51.54 79.87 + 15.61 51.18 81.58 + 18.11 52.66 83.34 + 20.44 53.90 82.16 + 22.84 59.88 87.86 + 26.46 55.53 80.80 + 22.59 53.13 72.86 + 19.43 58.21 81.84 + 19.27 60.64 95.06 + 18.30 61.27 98.55 + 20.75 61.38 97.81 + 24.95 64.84 95.36 + 26.69 66.32 94.14 + 26.80 62.63 92.47 + 26.74 66.04 88.48 + 31.07 68.69 87.29 + 30.53 61.94 81.85 + 30.32 66.42 85.12 + 31.07 69.38 88.70 + 28.77 67.45 92.10 + 26.29 59.47 88.48 + 28.20 56.05 88.57 + 33.62 62.75 96.35 + 35.10 63.15 91.01 + 39.01 73.81 97.07 + 36.05 80.53 100.64 + 35.18 81.14 95.57 + 26.67 68.69 88.50 + 23.54 60.02 86.29 + 25.97 64.32 100.72 + 27.43 69.25 101.58 + 29.08 59.31 96.47 + 28.00 52.44 89.06 + 31.19 53.15 91.62 + 30.86 56.47 98.81 + 26.97 60.77 97.28 + 25.50 72.33 99.10 + 26.23 76.31 103.43 + 26.27 66.78 101.30 + 26.20 62.53 100.28 + 24.02 57.01 95.33 + 25.45 61.31 96.38 + 27.60 71.48 102.78 + 28.57 73.25 108.62 + 25.89 63.52 103.91 + 24.64 59.73 100.78 + 21.73 53.22 98.71 + 17.56 56.20 105.82 + 11.93 59.09 109.08 + 12.77 58.34 110.44 + 13.41 64.92 109.58 + 15.71 62.52 109.33 + 14.09 61.41 108.69 + 15.46 60.42 112.16 + 14.09 61.76 108.91 + 12.74 60.74 108.53 + 12.48 58.90 108.11 + 11.59 53.65 107.42 + 13.19 56.77 114.27 + 14.71 60.64 120.93 + 13.29 56.08 118.01 + 10.31 44.30 106.74 + 10.50 44.72 111.50 + 12.22 43.98 116.98 + 12.51 50.37 120.42 + 15.06 63.95 120.92 + 16.09 70.16 126.05 + 14.84 70.58 114.11 + 12.68 58.94 105.13 + 12.80 54.62 109.44 + 13.55 50.05 110.06 + 15.35 45.20 114.38 + 16.00 41.56 110.30 + 14.98 43.90 112.14 + 16.16 64.39 123.25 + 17.18 74.81 125.78 + 15.28 68.35 116.67 + 13.96 61.99 115.72 + 14.93 55.98 116.14 + 15.90 62.74 120.23 + 13.81 55.16 117.28 + 13.11 49.85 122.50 + 10.76 40.62 121.08 + 11.06 44.04 122.25 + 12.46 54.24 122.07 + 14.79 61.73 126.92 + 14.48 61.96 123.71 + 12.86 52.21 118.84 + 12.85 51.30 117.61 + 13.30 54.02 117.22 + 13.59 58.38 118.14 + 13.28 61.31 130.78 + 13.36 57.45 127.69 + 12.84 58.33 127.77 + 11.77 53.11 128.63 + 11.25 45.20 128.90 + 9.54 37.72 132.68 + 8.88 46.12 126.58 + 13.38 59.56 134.79 + 14.30 62.12 138.41 + 13.28 55.17 130.84 + 14.22 50.93 125.27 + 15.38 50.19 133.74 + 14.04 54.45 131.93 + 11.51 50.51 121.29 + 10.65 53.04 121.25 + 11.37 51.69 130.15 + 12.55 51.83 133.41 + 13.12 46.04 135.84 + 14.95 48.77 134.90 + 17.34 55.62 141.47 + 14.53 50.95 139.59 + 12.54 51.95 143.76 + 10.80 49.40 138.67 + 12.20 51.40 143.84 + 13.93 52.33 139.27 + 16.27 61.15 141.08 + 16.74 62.35 133.42 + 15.89 59.88 134.37 + 12.69 49.85 135.49 + 9.71 35.56 139.96 + 8.92 34.48 148.30 + 10.93 38.85 153.66 + 12.32 42.02 161.31 + 13.97 48.70 159.82 + 14.04 51.69 154.63 + 14.54 47.45 155.43 + 17.07 52.17 159.09 + 16.77 51.36 157.10 + 15.61 43.70 149.91 + 13.22 35.94 150.74 + 11.40 31.80 153.24 + 11.67 35.20 170.33 + 12.94 45.87 167.38 + 16.41 54.51 167.45 + 15.95 47.40 162.41 + 13.27 34.66 158.13 + 10.39 26.09 169.90 + 9.93 27.79 188.90 + 10.56 30.52 192.60 + 14.59 30.80 188.01 + 19.18 30.89 185.67 + 15.37 28.75 179.49 + 19.82 35.19 181.68 + 20.46 40.70 183.89 + 20.23 38.88 186.06 + 18.18 32.48 190.06 + 17.49 28.22 193.99 + 20.05 24.70 196.21 + 20.55 25.88 195.29 + 20.41 29.02 193.65 + 19.66 27.19 198.38 + 18.54 25.72 202.75 + 17.98 22.59 202.27 + 18.73 21.80 205.39 + 20.64 29.77 207.63 + 20.75 30.79 204.50 + 18.86 28.03 203.70 + 13.36 22.48 215.56 + 12.73 20.74 218.18 + 18.23 22.11 217.48 + 17.78 19.31 225.76 +col_means: | + 13.15 17.96 119.33 + 13.65 21.09 118.22 + 14.02 20.11 117.00 + 12.82 19.46 114.68 + 11.84 21.59 114.28 + 13.71 25.02 117.02 + 14.35 30.20 115.81 + 15.42 33.19 111.50 + 14.94 31.30 110.56 + 16.05 32.42 111.59 + 15.77 31.43 110.83 + 15.09 28.61 109.81 + 15.11 25.82 108.83 + 15.99 29.72 111.68 + 16.15 31.59 110.44 + 14.43 31.50 110.28 + 14.73 35.66 112.38 + 16.51 38.44 114.00 + 13.95 35.63 116.13 + 15.63 37.60 115.47 + 16.52 38.22 115.06 + 16.30 36.39 112.77 + 15.87 34.84 114.86 + 17.75 38.54 115.59 + 20.22 46.67 119.64 + 17.90 49.20 121.30 + 16.59 43.84 116.81 + 15.91 38.73 115.36 + 15.10 37.54 113.00 + 17.01 47.52 120.38 + 19.43 50.83 124.08 + 18.54 51.34 118.16 + 15.27 47.62 107.98 + 15.54 43.17 107.53 + 15.35 35.92 110.50 + 16.01 40.88 107.14 + 18.49 44.40 114.07 + 20.19 53.77 119.15 + 20.25 57.74 116.69 + 17.48 51.10 112.13 + 14.99 41.79 110.42 + 16.09 43.83 112.03 + 18.00 51.18 116.31 + 18.20 53.71 116.18 + 20.20 63.58 116.72 + 20.36 63.62 115.73 + 18.50 52.48 114.10 + 18.59 46.78 112.47 + 18.02 45.09 113.42 + 16.46 44.63 112.39 + 17.19 53.24 117.14 + 17.73 57.58 116.78 + 17.55 54.02 117.81 + 15.71 51.60 119.66 + 15.40 48.14 119.17 + 14.33 40.63 117.05 + 13.67 39.76 114.68 + 14.95 45.37 120.31 + 15.08 47.56 122.05 + 13.51 47.34 112.56 + 14.97 48.13 116.89 + 16.38 56.02 114.33 + 15.64 62.48 118.05 + 14.08 63.18 113.62 + 15.21 67.21 108.87 + 16.52 64.95 107.34 + 16.52 61.28 110.78 + 15.49 59.38 109.30 + 16.30 57.90 111.89 + 16.31 55.44 116.38 + 14.88 55.12 120.59 + 16.49 63.30 118.95 + 19.90 71.26 124.29 + 18.21 69.95 125.98 + 15.99 64.99 124.84 + 14.24 57.16 123.53 + 12.73 45.93 119.92 + 11.77 50.01 112.81 + 14.37 61.62 113.50 + 15.54 69.23 117.06 + 13.54 66.23 113.44 + 13.26 67.78 110.23 + 14.31 67.81 121.56 + 14.88 66.76 120.90 + 12.88 55.73 119.58 + 12.82 48.12 114.92 + 13.66 51.51 116.81 + 14.71 48.74 127.23 + 14.13 46.22 127.22 + 14.01 42.28 122.37 + 11.99 39.64 120.38 + 13.62 44.44 115.09 + 18.77 60.88 117.28 + 25.29 70.01 116.73 + 24.65 68.02 111.65 + 25.91 66.25 120.25 + 24.21 56.07 120.95 + 18.16 47.47 115.86 + 20.39 49.52 114.23 + 17.94 54.65 117.47 + 17.51 65.28 119.16 + 18.29 62.36 112.83 + 21.55 62.22 109.19 + 17.75 58.52 106.30 + 14.27 61.21 102.78 + 18.29 63.50 103.17 + 18.57 63.95 104.47 + 19.59 61.14 102.63 + 26.27 61.18 105.10 + 26.52 63.02 108.66 + 24.02 63.84 108.67 + 19.14 64.77 107.39 + 16.54 63.73 116.24 + 15.87 64.06 110.69 + 16.46 64.50 108.22 + 17.26 64.75 109.21 + 19.32 67.08 111.49 + 16.11 59.89 99.62 + 13.10 56.04 98.12 + 12.13 46.59 96.58 + 13.05 43.06 103.71 + 13.49 45.76 102.36 + 13.26 43.83 102.75 + 13.52 50.53 107.31 + 17.31 59.08 109.33 + 17.18 64.64 116.25 + 95.97 95.66 39.58 + 111.00 111.58 44.87 + 71.95 77.64 35.80 + 14.14 48.38 104.64 + 16.34 51.37 115.88 + 16.32 54.30 119.83 + 16.62 61.27 121.97 + 16.91 68.50 121.91 + 16.61 62.20 112.75 + 16.29 50.27 112.36 + 15.23 51.58 102.14 + 17.89 52.87 100.86 + 19.36 61.21 96.67 + 21.41 70.03 105.42 + 20.43 65.94 105.89 + 15.40 62.61 102.62 + 17.20 62.77 106.72 + 17.66 66.44 113.94 + 18.57 67.97 110.54 + 18.43 67.56 104.96 + 18.39 61.06 110.88 + 18.50 59.68 111.64 + 19.77 56.88 111.33 + 20.77 54.05 114.31 + 19.98 56.95 112.87 + 18.50 57.65 102.47 + 18.27 61.70 107.98 + 17.52 58.85 112.08 + 18.05 56.20 113.64 + 19.20 59.06 113.56 + 20.09 57.37 115.34 + 18.88 53.95 107.83 + 19.10 57.99 111.17 + 19.23 61.02 112.64 + 17.23 56.73 110.83 + 14.94 47.12 109.40 + 13.51 39.50 112.72 + 17.46 41.26 117.28 + 17.86 44.06 113.29 + 20.36 52.17 117.25 + 18.91 48.69 116.11 + 16.78 45.61 110.53 + 15.64 40.60 109.05 + 15.01 38.37 115.09 + 16.69 44.88 121.59 + 16.77 43.22 123.19 + 14.31 36.16 117.67 + 14.46 34.10 118.73 + 15.80 34.84 124.59 + 14.31 30.41 125.85 + 13.93 30.37 124.64 + 12.62 25.02 122.36 + 13.78 28.86 127.20 + 14.72 37.12 127.07 + 14.12 37.45 127.78 + 14.27 36.77 125.38 + 12.81 33.52 122.53 + 12.43 31.55 122.27 + 12.22 28.59 120.83 + 12.45 27.23 121.45 + 13.04 24.89 123.69 + 14.16 26.25 125.53 + 13.79 24.94 121.82 + 13.48 25.52 120.05 + 11.09 24.00 122.15 + 11.61 23.55 124.56 + 11.35 21.40 127.25 + 9.66 17.64 126.73 + 10.69 16.80 123.76 + 11.27 13.93 123.02 + 11.75 14.10 124.19 + 10.68 13.55 125.13 + 9.71 12.03 124.17 + 9.06 9.45 123.59 +sample_blocks: | + 2 2 0.00 0.00 3.33 + 2 18 0.00 0.00 3.33 + 2 34 0.00 0.00 3.33 + 2 50 133.67 113.22 5.67 + 2 66 0.00 0.00 3.33 + 2 82 10.44 57.11 59.11 + 2 98 1.22 10.78 13.67 + 2 114 21.44 21.44 118.00 + 2 130 6.78 5.67 3.33 + 2 146 72.44 68.00 9.44 + 2 162 0.00 0.00 3.33 + 2 178 0.00 0.00 3.33 + 2 194 0.00 0.00 3.33 + 18 2 0.00 0.00 23.67 + 18 18 0.00 0.00 23.67 + 18 34 67.67 57.11 9.00 + 18 50 0.00 0.00 23.67 + 18 66 0.00 0.00 23.67 + 18 82 9.22 10.89 81.11 + 18 98 5.56 51.00 70.00 + 18 114 12.78 12.78 81.22 + 18 130 23.67 86.00 139.89 + 18 146 0.22 9.00 26.22 + 18 162 0.00 0.00 23.67 + 18 178 29.11 118.67 160.56 + 18 194 210.11 197.78 26.44 + 34 2 0.00 0.00 44.00 + 34 18 18.67 108.56 122.89 + 34 34 0.00 0.00 44.00 + 34 50 9.11 60.11 84.00 + 34 66 0.00 0.00 44.00 + 34 82 2.22 36.89 51.78 + 34 98 0.00 0.00 44.00 + 34 114 16.78 45.00 124.56 + 34 130 14.56 101.11 101.11 + 34 146 0.00 0.00 45.67 + 34 162 0.33 11.33 50.44 + 34 178 26.89 156.22 156.22 + 34 194 0.00 0.00 44.00 + 50 2 140.33 131.56 40.67 + 50 18 0.00 0.00 64.67 + 50 34 27.78 27.78 161.11 + 50 50 21.22 135.44 137.78 + 50 66 23.33 95.56 137.56 + 50 82 17.11 44.67 112.44 + 50 98 11.00 38.67 60.11 + 50 114 20.11 25.67 127.78 + 50 130 20.78 82.44 131.22 + 50 146 9.44 52.67 93.78 + 50 162 16.11 123.56 123.56 + 50 178 0.00 0.00 64.67 + 50 194 0.00 0.00 64.67 + 66 2 0.00 0.00 85.00 + 66 18 13.22 102.22 102.22 + 66 34 9.78 9.78 109.56 + 66 50 11.22 89.89 89.89 + 66 66 130.78 139.78 45.89 + 66 82 8.33 49.44 86.78 + 66 98 13.67 56.33 107.67 + 66 114 19.67 47.56 123.89 + 66 130 14.78 104.67 104.67 + 66 146 26.56 44.67 61.89 + 66 162 0.00 0.00 75.67 + 66 178 0.44 16.44 69.44 + 66 194 2.22 23.78 91.33 + 82 2 0.00 0.00 105.33 + 82 18 9.56 9.56 122.44 + 82 34 0.00 10.89 93.00 + 82 50 17.00 82.11 112.89 + 82 66 13.67 90.78 119.00 + 82 82 12.67 96.89 96.89 + 82 98 6.44 58.22 114.11 + 82 114 170.44 171.78 50.67 + 82 130 153.11 133.67 26.78 + 82 146 18.00 100.22 125.22 + 82 162 1.78 23.44 83.00 + 82 178 0.00 0.00 105.33 + 82 194 0.00 0.00 105.33 + 98 2 0.00 0.00 125.67 + 98 18 0.00 0.00 125.67 + 98 34 10.11 62.56 111.11 + 98 50 4.22 8.56 105.44 + 98 66 24.11 120.67 135.44 + 98 82 16.33 55.11 109.78 + 98 98 12.11 105.33 105.33 + 98 114 26.89 147.22 153.00 + 98 130 17.00 47.67 119.67 + 98 146 24.11 143.67 143.67 + 98 162 15.44 120.33 138.11 + 98 178 3.22 3.22 122.89 + 98 194 0.00 0.00 125.67 + 114 2 0.00 0.00 146.00 + 114 18 4.67 45.89 76.56 + 114 34 0.33 8.78 120.22 + 114 50 26.67 143.89 143.89 + 114 66 4.56 62.67 86.33 + 114 82 26.11 144.67 146.78 + 114 98 13.67 58.56 137.22 + 114 114 17.78 57.22 147.67 + 114 130 8.00 72.67 92.44 + 114 146 16.44 42.67 125.89 + 114 162 8.56 53.56 95.22 + 114 178 0.44 16.33 130.00 + 114 194 0.00 0.00 146.00 + 130 2 0.00 0.00 166.67 + 130 18 1.78 33.56 118.33 + 130 34 2.56 30.56 147.00 + 130 50 12.22 62.22 94.89 + 130 66 15.11 108.78 139.78 + 130 82 0.00 1.33 157.33 + 130 98 25.89 142.67 149.78 + 130 114 11.56 88.44 96.33 + 130 130 40.11 57.00 87.44 + 130 146 3.56 29.78 117.44 + 130 162 9.33 27.44 136.67 + 130 178 0.00 0.00 166.67 + 130 194 0.00 0.00 166.67 + 146 2 0.00 0.00 187.00 + 146 18 10.78 24.11 97.33 + 146 34 5.78 68.67 69.33 + 146 50 8.00 17.56 125.89 + 146 66 21.44 97.33 140.44 + 146 82 0.67 13.00 179.11 + 146 98 17.11 110.00 129.22 + 146 114 1.00 3.33 91.11 + 146 130 4.22 33.67 56.67 + 146 146 3.67 43.33 118.44 + 146 162 21.56 21.56 137.56 + 146 178 3.67 3.67 153.00 + 146 194 45.67 43.67 155.00 + 162 2 0.00 0.00 207.33 + 162 18 31.11 86.56 132.44 + 162 34 3.22 22.33 176.56 + 162 50 0.00 0.00 207.33 + 162 66 7.78 13.33 106.00 + 162 82 3.11 40.67 162.67 + 162 98 0.00 2.89 195.22 + 162 114 2.00 36.33 132.44 + 162 130 0.00 11.33 172.44 + 162 146 2.78 46.56 119.00 + 162 162 10.22 72.56 119.44 + 162 178 0.00 0.00 207.33 + 162 194 0.00 0.00 207.33 + 178 2 153.78 147.89 109.56 + 178 18 0.00 0.00 227.67 + 178 34 4.33 44.00 155.56 + 178 50 0.00 0.00 227.67 + 178 66 17.33 17.33 122.78 + 178 82 0.22 16.22 173.00 + 178 98 0.00 0.00 227.67 + 178 114 16.22 64.89 121.33 + 178 130 1.44 1.44 158.44 + 178 146 11.67 100.78 100.78 + 178 162 0.00 0.00 227.67 + 178 178 0.00 0.00 227.67 + 178 194 0.00 0.00 227.67 + 194 2 0.00 0.00 248.00 + 194 18 0.00 0.00 248.00 + 194 34 0.00 0.00 248.00 + 194 50 118.44 109.56 98.11 + 194 66 3.56 41.33 178.89 + 194 82 0.00 0.00 248.00 + 194 98 0.00 0.00 248.00 + 194 114 13.22 93.89 121.56 + 194 130 11.67 71.56 98.78 + 194 146 0.00 0.00 248.00 + 194 162 0.00 0.00 248.00 + 194 178 0.00 0.00 248.00 + 194 194 0.00 0.00 248.00 +... diff --git a/unittest/graphics/tests/dump-image-depthcue.yaml b/unittest/graphics/tests/dump-image-depthcue.yaml index 2416f385938..08d7c905c0a 100644 --- a/unittest/graphics/tests/dump-image-depthcue.yaml +++ b/unittest/graphics/tests/dump-image-depthcue.yaml @@ -22,7 +22,7 @@ setup_commands: | improper_style harmonic read_data ${input_dir}/data.peptide neighbor 2.0 bin - dump viz all image 1 ${imagefile} type type size 200 200 zoom 1.5 view 60 30 shiny 0.2 box yes 0.02 bond atom 0.3 depthcue yes 0.8 auto + dump viz all image 1 ${imagefile} type type size 200 200 zoom 1.5 view 60 30 shiny 0.2 box yes 0.02 bond atom 0.3 depthcue yes 0.8 auto auto dump_modify viz backcolor blue backcolor2 black run_commands: | run 0 From 996e62f272dd643ede8db07af8414c26be521d70 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 24 Jul 2026 14:38:53 -0400 Subject: [PATCH 051/100] simplify dump_modify specular to width presets and drop lightdir Replace the numeric intensity/exponent pair with three presets for the width of the specular highlights: wide (exponent 10, close to the default), narrow (50), and tight (200, small sharp highlights with a plastic-like appearance). The brightness of the highlights follows the shiny factor in all cases. The lightdir keyword is removed again; the light directions stay at the fixed key/fill/back rig positions. --- doc/src/dump_image.rst | 43 +- doc/utils/sphinx-config/false_positives.txt | 2 - src/GRAPHICS/dump_image.cpp | 43 +- src/GRAPHICS/image.cpp | 10 +- src/GRAPHICS/image.h | 21 +- .../graphics/tests/dump-modify-lightdir.yaml | 603 ------------ .../graphics/tests/dump-modify-specular.yaml | 888 +++++++++--------- 7 files changed, 477 insertions(+), 1133 deletions(-) delete mode 100644 unittest/graphics/tests/dump-modify-lightdir.yaml diff --git a/doc/src/dump_image.rst b/doc/src/dump_image.rst index 61945f354b5..2b799728654 100644 --- a/doc/src/dump_image.rst +++ b/doc/src/dump_image.rst @@ -134,7 +134,7 @@ Syntax dump_modify dump-ID keyword values ... * these keywords apply only to the *image* and *movie* styles and are documented on this page -* keyword = *acolor* or *adiam* or *amap* or *gmap* or *bmap* or *atrans* or *backcolor* or *backcolor2* or *bcolor* or *bdiam* or *btrans* or *bitrate* or *boxcolor* or *color* or *gamma* or *gtrans* or *lights* or *lightdir* or *specular* or *loadcolors* or *savecolors* or *framerate* or *axestrans* or *boxtrans* or *subboxtrans* or *ccolor* or *ctrans* or *fcolor* or *ftrans* +* keyword = *acolor* or *adiam* or *amap* or *gmap* or *bmap* or *atrans* or *backcolor* or *backcolor2* or *bcolor* or *bdiam* or *btrans* or *bitrate* or *boxcolor* or *color* or *gamma* or *gtrans* or *lights* or *specular* or *loadcolors* or *savecolors* or *framerate* or *axestrans* or *boxtrans* or *subboxtrans* or *ccolor* or *ctrans* or *fcolor* or *ftrans* * see the :doc:`dump modify ` doc page for more general keywords .. parsed-literal:: @@ -199,13 +199,8 @@ Syntax transparency = transparency for visualized grid (value between 0 (invisible) and 1 (fully opaque)) *lights* args = ambient key fill back ambient key fill back = set light intensity value from 0.0 to 1.0 - *lightdir* args = light theta phi - light = *key* or *fill* or *back* = which light source to reposition - theta = angle above (positive) or below (negative) the view direction in degrees (-90 to 90) - phi = angle to the right (positive) or left (negative) of the view direction in degrees (-180 to 180) - *specular* args = intensity exponent - intensity = strength of the specular highlights from 0.0 to 1.0 - exponent = sharpness of the specular highlights (larger is sharper) + *specular* arg = style + style = *wide* or *narrow* or *tight* = width of the specular highlights *loadcolors* arg = filename filename = load color definitions, per-type colors, and lights from JSON format file *savecolors* arg = filename @@ -1344,27 +1339,14 @@ used exactly as specified. .. versionadded:: TBD -The *lightdir* keyword repositions one of the directional light -sources: *key*, *fill*, or *back*. The two angles are set in degrees -relative to the viewing direction, so the lights stay fixed relative to -the camera when the view changes. A *theta* of 90 places the light -directly above the view direction, -90 directly below. A *phi* of 0 -places the light behind the camera, 90 to the right of the viewer, -90 -to the left, and 180 behind the scene facing the camera. The default -positions are theta/phi = 30/-45 for the *key* light, 0/30 for the -*fill* light, and 15/180 for the *back* light. - -.. versionadded:: TBD - -The *specular* keyword sets the strength and the sharpness of the -specular highlights independently from the *shiny* keyword of the dump -image command. The *intensity* value must be between 0.0 and 1.0; the -*exponent* value must be positive and determines the size of the -highlights: the larger it is, the smaller and sharper they become. -Values between 4 (dull) and a few hundred (polished) are typical. An -*sfactor* value of S set with the *shiny* keyword corresponds to -*specular* with intensity S and exponent 16*S. When the *specular* -keyword is used, the *shiny* setting is ignored. +The *specular* keyword selects the width of the specular highlights +independently from the *shiny* keyword of the dump image command. +Three settings are available: *wide* highlights are close to the +default appearance, *narrow* highlights are visibly smaller, and +*tight* produces small sharp highlights with a plastic-like +appearance. The *sfactor* value of the *shiny* keyword scales the +brightness of the highlights in all cases; without the *specular* +keyword it also sets their width. ---------- @@ -1515,8 +1497,7 @@ The defaults for the dump_modify keywords specific to dump image and dump movie * color = 140 color names are pre-defined as listed below * gamma = 1.0 * lights = 0.0 0.9 0.45 0.9 -* lightdir = key 30 -45, fill 0 30, back 15 180 -* specular = derived from the *shiny* keyword of the dump image command +* specular = width derived from the *shiny* keyword of the dump image command * bitrate = 2000 * framerate = 24 * gmap = min max cf 0.0 2 min blue max red diff --git a/doc/utils/sphinx-config/false_positives.txt b/doc/utils/sphinx-config/false_positives.txt index 56020b6fad0..9d259ebaf65 100644 --- a/doc/utils/sphinx-config/false_positives.txt +++ b/doc/utils/sphinx-config/false_positives.txt @@ -1601,8 +1601,6 @@ hbond hcp hdnnp HDNNP -lightdir -repositions runner RUNNER Hearn diff --git a/src/GRAPHICS/dump_image.cpp b/src/GRAPHICS/dump_image.cpp index 27e3680c6be..ec6fc2b6140 100644 --- a/src/GRAPHICS/dump_image.cpp +++ b/src/GRAPHICS/dump_image.cpp @@ -3036,33 +3036,6 @@ int DumpImage::modify_param(int narg, char **arg) return 5; } - if (strcmp(arg[0], "lightdir") == 0) { - if (narg < 4) utils::missing_cmd_args(FLERR, "dump_modify lightdir", error); - double theta = utils::numeric(FLERR, arg[2], false, lmp); - if ((theta < -90.0) || (theta > 90.0)) - error->all(FLERR, argoff + 2, "Illegal lightdir theta value {}", theta); - double phi = utils::numeric(FLERR, arg[3], false, lmp); - if ((phi < -180.0) || (phi > 180.0)) - error->all(FLERR, argoff + 3, "Illegal lightdir phi value {}", phi); - if (strcmp(arg[1], "key") == 0) { - image->keyLightTheta = DEG2RAD * theta; - image->keyLightPhi = DEG2RAD * phi; - } else if (strcmp(arg[1], "fill") == 0) { - image->fillLightTheta = DEG2RAD * theta; - image->fillLightPhi = DEG2RAD * phi; - } else if (strcmp(arg[1], "back") == 0) { - image->backLightTheta = DEG2RAD * theta; - image->backLightPhi = DEG2RAD * phi; - } else { - error->all(FLERR, argoff + 1, "Unknown lightdir light name {}", arg[1]); - } - - // recompute light directions since view parameters may not be recomputed again - - image->setup_lights(); - return 4; - } - if (strcmp(arg[0], "gamma") == 0) { if (narg < 2) utils::missing_cmd_args(FLERR, "dump_modify gamma", error); double gval = utils::numeric(FLERR, arg[1], false, lmp); @@ -3073,17 +3046,13 @@ int DumpImage::modify_param(int narg, char **arg) } if (strcmp(arg[0], "specular") == 0) { - if (narg < 3) utils::missing_cmd_args(FLERR, "dump_modify specular", error); - double intensity = utils::numeric(FLERR, arg[1], false, lmp); - if ((intensity < 0.0) || (intensity > 1.0)) - error->all(FLERR, argoff + 1, "Illegal specular intensity value {}", intensity); - double hardness = utils::numeric(FLERR, arg[2], false, lmp); - if (hardness <= 0.0) - error->all(FLERR, argoff + 2, "Illegal specular exponent value {}", hardness); - image->specularIntensity = intensity; - image->specularHardness = hardness; + if (narg < 2) utils::missing_cmd_args(FLERR, "dump_modify specular", error); + if (strcmp(arg[1], "wide") == 0) image->specularHardness = 10.0; + else if (strcmp(arg[1], "narrow") == 0) image->specularHardness = 50.0; + else if (strcmp(arg[1], "tight") == 0) image->specularHardness = 200.0; + else error->all(FLERR, argoff + 1, "Unknown specular setting {}", arg[1]); image->specularflag = 1; - return 3; + return 2; } if (strcmp(arg[0], "savecolors") == 0) { diff --git a/src/GRAPHICS/image.cpp b/src/GRAPHICS/image.cpp index a81356399ec..f5d36f58f4a 100644 --- a/src/GRAPHICS/image.cpp +++ b/src/GRAPHICS/image.cpp @@ -742,12 +742,11 @@ void Image::view_params(double boxxlo, double boxxhi, double boxylo, setup_lights(); - // adjust shinyness of the reflection unless overridden with dump_modify specular + // the brightness of the specular highlights follows shiny; their width + // also follows shiny unless set with a dump_modify specular preset - if (!specularflag) { - specularHardness = 16.0 * shiny; - specularIntensity = shiny; - } + specularIntensity = shiny; + if (!specularflag) specularHardness = 16.0 * shiny; // adjust strength of the SSAO @@ -769,7 +768,6 @@ void Image::view_params(double boxxlo, double boxxhi, double boxylo, compute light directions from their theta/phi angles the angles are relative to the viewer with z pointing at the camera: theta > 0 moves a light above the view direction, phi > 0 to the right - called from view_params() and after changing angles with dump_modify ------------------------------------------------------------------------- */ void Image::setup_lights() diff --git a/src/GRAPHICS/image.h b/src/GRAPHICS/image.h index a23743894f3..b2735c9e18b 100644 --- a/src/GRAPHICS/image.h +++ b/src/GRAPHICS/image.h @@ -53,16 +53,8 @@ class Image : protected Pointers { double fillLightColor[3]; double backLightColor[3]; - double keyLightTheta; // light directions relative to the viewer (adjustable by caller) - double keyLightPhi; - double fillLightTheta; - double fillLightPhi; - double backLightTheta; - double backLightPhi; - - int specularflag; // 1 if specular settings override those derived from shiny + int specularflag; // 1 if the specular exponent is set explicitly double specularHardness; // exponent of the specular highlight - double specularIntensity; // strength of the specular highlight Image(class LAMMPS *, int); ~Image() override; @@ -74,7 +66,6 @@ class Image : protected Pointers { void write_TGA(FILE *, bool compressed = true); void write_PPM(FILE *); void view_params(double, double, double, double, double, double); - void setup_lights(); void draw_sphere(const double *, const double *, double, double opacity = 1.0); void draw_cube(const double *, const double *, double, double opacity = 1.0); @@ -131,6 +122,15 @@ class Image : protected Pointers { double FOV; + double keyLightTheta; + double keyLightPhi; + double fillLightTheta; + double fillLightPhi; + double backLightTheta; + double backLightPhi; + + double specularIntensity; // strength of the specular highlight + double SSAORadius; int SSAOSamples; double SSAOJitter; @@ -147,6 +147,7 @@ class Image : protected Pointers { // internal methods void draw_pixel(int, int, double, const double *, const double *); + void setup_lights(); void compute_SSAO(); void compute_depthcue(); diff --git a/unittest/graphics/tests/dump-modify-lightdir.yaml b/unittest/graphics/tests/dump-modify-lightdir.yaml deleted file mode 100644 index 5bcb593ac11..00000000000 --- a/unittest/graphics/tests/dump-modify-lightdir.yaml +++ /dev/null @@ -1,603 +0,0 @@ ---- -lammps_version: 4 Jul 2026 -tags: graphics -date_generated: Fri Jul 24 13:07:12 2026 -epsilon_projection: 0.5 -epsilon_blocks: 2 -nprocs: 1 -prerequisites: | - atom full - pair lj/charmm/coul/charmm - bond harmonic - angle charmm - dihedral charmm - improper harmonic -setup_commands: | - units real - atom_style full - pair_style lj/charmm/coul/charmm 8.0 10.0 - bond_style harmonic - angle_style charmm - dihedral_style charmm - improper_style harmonic - read_data ${input_dir}/data.peptide - neighbor 2.0 bin - dump viz all image 1 ${imagefile} type type size 200 200 zoom 1.5 view 60 30 shiny 0.2 box yes 0.02 bond atom 0.3 - dump_modify viz backcolor gray lightdir key -60 45 lightdir fill 30 -120 -run_commands: | - run 0 -image_size: 200 200 -sampling: 3 16 -row_means: | - 108.26 113.86 109.97 - 107.00 114.14 112.53 - 103.53 107.63 108.41 - 108.43 109.81 109.56 - 108.00 109.76 111.15 - 109.56 112.23 112.19 - 112.47 115.02 113.95 - 115.89 118.61 115.19 - 115.06 118.09 115.64 - 113.01 114.88 113.10 - 110.55 110.94 108.53 - 111.69 114.49 110.86 - 102.33 107.77 104.68 - 89.36 94.08 92.17 - 80.98 87.95 85.59 - 84.86 96.56 94.85 - 86.10 104.73 103.89 - 81.50 97.91 97.78 - 84.26 94.14 93.20 - 83.53 90.67 94.00 - 75.66 82.18 89.77 - 70.98 81.04 85.69 - 67.64 81.32 87.22 - 70.78 89.50 96.12 - 73.12 93.88 100.44 - 73.81 91.44 93.39 - 78.38 92.31 93.25 - 75.68 88.72 91.53 - 64.72 82.28 86.70 - 64.61 78.67 83.20 - 62.52 78.42 85.62 - 60.21 75.50 84.58 - 63.77 77.27 83.33 - 66.50 81.32 84.21 - 64.27 84.13 88.56 - 67.50 92.34 94.62 - 74.58 93.99 95.95 - 68.17 83.38 89.53 - 60.47 76.05 81.79 - 58.26 77.53 81.16 - 55.93 74.86 78.66 - 53.60 73.14 78.29 - 47.58 67.66 74.14 - 55.65 72.70 79.37 - 57.07 79.02 82.56 - 54.24 72.12 75.93 - 48.67 63.22 67.83 - 43.06 62.07 67.91 - 43.41 64.53 72.19 - 39.73 60.72 72.73 - 49.06 65.53 72.77 - 54.02 69.58 74.84 - 44.31 66.30 71.63 - 45.96 67.72 75.11 - 48.54 71.61 80.89 - 51.88 68.29 73.95 - 58.38 75.35 71.61 - 63.76 80.41 76.24 - 65.00 83.83 83.27 - 55.77 72.50 79.10 - 46.88 60.59 67.95 - 45.56 59.25 67.88 - 43.03 57.51 64.19 - 45.60 56.53 63.23 - 46.20 64.93 70.57 - 54.04 81.08 84.04 - 53.94 82.37 83.08 - 51.29 69.47 70.03 - 49.58 67.77 70.58 - 56.33 74.33 78.15 - 54.54 73.25 80.64 - 50.67 62.06 69.17 - 47.89 60.66 68.52 - 41.34 54.91 69.72 - 41.84 61.72 71.76 - 41.15 62.56 67.87 - 41.86 65.17 69.04 - 42.52 66.03 73.20 - 49.37 69.38 78.50 - 53.51 69.79 82.64 - 51.34 68.31 70.39 - 49.64 68.73 69.97 - 46.27 70.09 74.16 - 47.33 71.62 77.43 - 51.70 70.88 81.12 - 55.20 71.42 79.30 - 52.84 74.55 79.02 - 51.84 75.64 80.03 - 36.41 63.52 69.92 - 33.77 59.77 69.89 - 35.41 61.95 73.24 - 37.34 57.66 71.34 - 36.05 59.23 74.61 - 42.61 69.92 80.39 - 45.15 75.11 83.77 - 43.37 70.84 81.72 - 41.53 63.90 72.04 - 47.48 67.89 73.47 - 53.77 75.01 84.20 - 55.18 80.25 93.37 - 57.02 81.94 89.60 - 53.24 70.95 79.68 - 47.59 62.70 72.12 - 37.22 53.52 63.85 - 36.76 54.35 63.65 - 33.28 64.84 72.78 - 36.29 71.00 80.00 - 37.67 63.83 75.50 - 36.77 65.92 76.55 - 41.05 66.88 79.36 - 46.37 66.23 84.22 - 46.55 58.34 81.75 - 41.98 53.87 68.64 - 41.20 64.94 71.41 - 38.19 70.74 74.28 - 40.63 73.67 77.31 - 42.66 69.97 78.39 - 42.71 66.72 74.03 - 47.63 69.86 76.02 - 52.63 76.11 78.65 - 55.66 79.44 87.81 - 53.22 71.42 84.27 - 40.70 60.95 72.48 - 35.46 56.62 66.39 - 34.13 58.16 67.87 - 40.24 68.30 80.32 - 38.49 66.37 78.91 - 37.07 65.25 75.03 - 38.13 65.08 74.45 - 41.15 64.39 72.15 - 48.13 74.89 80.70 - 48.30 73.30 81.22 - 48.40 71.95 78.97 - 52.88 78.16 87.74 - 61.95 85.06 95.04 - 52.30 73.06 85.86 - 45.72 61.81 69.02 - 48.65 70.20 73.74 - 49.07 75.68 79.95 - 40.76 66.90 71.30 - 44.68 61.10 70.97 - 42.36 61.56 75.22 - 44.57 71.22 87.12 - 42.26 71.67 84.33 - 47.66 73.45 83.42 - 49.99 74.94 83.77 - 55.52 79.50 84.34 - 53.22 72.09 77.47 - 52.48 70.17 75.86 - 57.05 75.75 80.89 - 59.66 76.94 82.25 - 59.92 82.90 89.77 - 56.95 77.33 80.69 - 50.65 72.54 74.33 - 44.25 65.59 69.81 - 44.55 66.31 73.59 - 46.81 71.04 79.64 - 54.25 82.47 90.36 - 64.83 88.98 95.80 - 69.22 85.61 96.78 - 71.55 86.33 94.56 - 73.87 90.33 92.86 - 73.33 89.36 88.96 - 67.88 85.21 87.41 - 65.91 80.72 81.41 - 63.73 76.62 75.91 - 65.88 80.11 83.06 - 69.27 86.00 92.06 - 76.58 96.24 99.88 - 77.90 95.27 100.49 - 79.31 85.36 92.65 - 71.03 79.51 83.71 - 68.66 83.32 83.05 - 73.89 91.78 93.58 - 81.47 102.14 105.92 - 92.00 107.23 110.19 - 98.26 105.44 104.11 - 97.75 105.08 103.26 - 94.89 103.27 102.19 - 95.47 103.58 102.29 - 96.18 105.47 104.69 - 97.03 103.74 103.35 - 95.80 103.44 101.78 - 97.80 108.89 103.97 - 100.75 111.26 106.78 - 102.64 109.91 105.98 - 104.94 108.49 105.74 - 103.95 106.64 106.53 - 101.62 104.09 103.90 - 104.81 108.80 108.19 - 109.10 114.52 112.02 - 109.96 116.30 113.09 - 110.45 113.95 110.38 - 106.02 108.47 103.75 - 103.59 107.43 103.49 - 103.64 109.39 106.88 - 110.31 114.98 112.73 - 110.92 116.03 115.03 - 113.51 117.78 114.83 - 118.87 121.63 116.50 -col_means: | - 115.64 117.54 115.14 - 114.62 117.39 113.80 - 115.00 118.38 115.28 - 111.64 115.25 112.83 - 105.61 108.86 107.06 - 102.25 106.14 106.98 - 98.68 105.39 105.41 - 95.17 104.04 102.79 - 94.51 101.66 101.10 - 92.62 99.45 100.77 - 88.05 96.73 98.92 - 90.66 98.86 100.03 - 92.28 99.95 103.28 - 91.51 98.64 100.96 - 89.17 97.67 99.83 - 91.77 102.83 103.58 - 90.61 103.02 102.72 - 84.64 95.26 97.47 - 84.64 96.36 98.09 - 81.31 93.42 96.75 - 79.53 91.00 96.59 - 80.28 91.31 95.48 - 80.47 89.37 94.13 - 73.35 83.97 89.68 - 63.98 78.38 85.72 - 64.02 79.89 86.25 - 68.08 83.81 88.84 - 72.06 86.12 91.47 - 76.57 90.47 91.40 - 71.61 85.90 87.94 - 69.69 84.77 88.35 - 69.84 86.11 90.24 - 68.67 88.22 90.67 - 71.27 88.24 90.86 - 78.08 92.86 97.61 - 67.06 83.27 85.97 - 68.08 80.84 85.48 - 66.94 81.33 87.22 - 63.23 81.61 87.09 - 63.25 82.69 89.01 - 68.47 86.56 91.94 - 68.19 83.17 86.19 - 65.06 79.72 82.12 - 60.80 78.56 82.06 - 54.08 76.36 79.93 - 54.06 76.44 80.16 - 56.30 76.57 83.60 - 55.66 72.55 82.56 - 55.06 71.29 81.73 - 56.39 71.55 82.67 - 60.93 79.98 84.67 - 59.47 82.09 84.53 - 57.21 78.56 81.70 - 59.74 80.83 84.39 - 60.63 82.73 88.34 - 61.85 77.36 85.81 - 61.28 76.47 85.22 - 59.17 76.33 85.02 - 62.73 79.64 87.93 - 52.27 74.47 82.11 - 54.92 75.28 82.01 - 50.23 71.53 80.34 - 46.44 68.01 79.08 - 39.27 61.03 73.17 - 36.84 60.97 70.55 - 38.56 65.42 74.89 - 39.82 63.62 74.46 - 43.20 66.95 76.41 - 50.54 72.38 80.56 - 47.45 67.63 78.36 - 50.69 71.05 82.35 - 43.87 72.06 80.59 - 37.93 66.20 69.70 - 41.73 69.69 73.75 - 43.08 70.14 75.08 - 46.95 72.39 82.05 - 47.48 67.89 80.69 - 42.30 64.54 75.22 - 38.27 63.58 70.14 - 38.98 64.60 74.09 - 41.09 68.03 76.81 - 37.93 67.94 76.17 - 41.70 69.59 75.08 - 42.13 71.44 77.69 - 45.05 68.56 76.94 - 46.77 67.09 78.84 - 42.93 64.03 75.66 - 47.77 66.91 80.33 - 51.47 68.67 85.28 - 48.98 67.45 82.22 - 54.09 71.99 84.88 - 58.08 76.17 86.58 - 56.29 78.23 82.97 - 55.85 80.88 78.89 - 53.20 77.98 74.25 - 50.77 72.58 74.82 - 53.95 70.80 77.92 - 55.26 70.84 78.87 - 53.16 71.12 82.48 - 50.09 68.26 79.20 - 39.85 63.81 73.44 - 36.98 62.24 71.68 - 39.78 63.56 75.47 - 41.93 66.73 79.11 - 37.59 63.05 73.98 - 46.74 75.88 80.90 - 46.12 71.92 78.00 - 46.99 70.78 73.48 - 48.17 67.11 72.22 - 46.98 63.06 71.67 - 42.12 62.37 70.99 - 40.62 66.81 75.41 - 37.34 63.12 73.17 - 38.03 64.53 74.17 - 31.91 57.14 69.00 - 33.69 57.13 71.70 - 39.28 63.50 76.78 - 40.90 69.69 79.91 - 40.24 63.78 77.30 - 46.25 69.11 80.98 - 54.64 75.06 86.56 - 55.47 75.00 87.19 - 56.10 71.77 83.28 - 53.04 69.71 81.43 - 43.99 64.31 73.98 - 43.45 66.75 73.91 - 57.47 59.76 34.77 - 116.57 112.05 50.48 - 154.97 146.60 59.03 - 47.17 68.12 80.03 - 51.14 69.32 80.18 - 43.94 61.58 73.33 - 42.35 61.52 72.08 - 38.70 60.60 70.59 - 44.05 69.96 77.78 - 51.77 72.61 82.69 - 52.10 74.28 84.50 - 52.33 68.46 80.56 - 49.84 66.19 74.25 - 46.92 70.71 76.41 - 46.27 69.63 77.11 - 44.53 69.89 76.69 - 42.60 66.25 73.26 - 44.59 69.06 78.00 - 42.67 67.18 75.19 - 42.20 70.38 76.29 - 43.83 70.61 79.62 - 44.02 69.61 77.72 - 42.13 65.53 72.48 - 42.80 62.60 73.32 - 47.62 68.14 77.35 - 48.91 69.67 74.90 - 51.86 75.22 80.25 - 55.66 78.22 81.14 - 55.95 78.81 83.44 - 51.33 73.03 78.60 - 48.67 66.58 76.36 - 50.01 68.56 80.30 - 54.19 74.78 79.44 - 58.73 79.66 81.70 - 58.57 81.04 83.28 - 64.97 84.44 87.86 - 62.69 79.61 85.69 - 63.83 74.76 82.27 - 55.94 69.50 77.34 - 57.40 73.55 77.41 - 61.77 75.91 82.86 - 64.23 80.85 87.89 - 67.06 83.81 88.91 - 74.33 90.42 94.10 - 71.10 88.22 91.37 - 70.79 87.86 91.53 - 73.93 89.89 93.26 - 75.47 88.28 92.81 - 82.23 93.01 96.02 - 83.26 93.00 97.56 - 82.64 92.80 96.55 - 88.59 97.74 102.03 - 94.07 100.39 101.05 - 87.80 97.17 97.11 - 89.14 99.40 99.35 - 84.21 97.16 97.61 - 82.19 95.83 97.39 - 83.51 96.20 97.27 - 86.94 98.78 101.66 - 89.78 99.42 99.49 - 93.44 101.65 99.75 - 91.52 97.67 99.69 - 91.93 97.31 102.06 - 93.44 100.33 103.21 - 95.73 102.94 102.85 - 99.31 106.44 105.25 - 104.41 109.42 109.50 - 110.45 115.67 113.52 - 110.14 115.18 112.61 - 112.28 115.11 113.12 - 112.91 114.58 112.39 - 113.44 115.33 112.70 - 113.89 116.08 114.16 - 117.86 118.41 116.67 -sample_blocks: | - 2 2 128.00 128.00 128.00 - 2 18 128.00 128.00 128.00 - 2 34 128.00 128.00 128.00 - 2 50 53.44 47.89 17.33 - 2 66 128.00 128.00 128.00 - 2 82 71.78 81.78 81.78 - 2 98 100.56 111.22 111.22 - 2 114 19.78 19.78 60.78 - 2 130 131.89 129.33 115.33 - 2 146 91.67 90.67 85.44 - 2 162 128.00 128.00 128.00 - 2 178 128.00 128.00 128.00 - 2 194 128.00 128.00 128.00 - 18 2 128.00 128.00 128.00 - 18 18 128.00 128.00 128.00 - 18 34 130.11 117.22 48.44 - 18 50 128.00 128.00 128.00 - 18 66 128.00 128.00 128.00 - 18 82 14.22 25.89 55.44 - 18 98 24.33 84.11 103.11 - 18 114 51.44 51.44 78.78 - 18 130 15.56 20.67 30.33 - 18 146 92.56 125.22 125.22 - 18 162 128.00 128.00 128.00 - 18 178 9.22 26.22 38.33 - 18 194 67.00 57.67 8.22 - 34 2 128.00 128.00 128.00 - 34 18 44.33 51.33 51.33 - 34 34 128.00 128.00 128.00 - 34 50 25.89 58.78 101.44 - 34 66 128.00 128.00 128.00 - 34 82 60.33 125.00 125.00 - 34 98 128.00 128.00 128.00 - 34 114 4.33 10.44 23.67 - 34 130 21.78 79.00 79.00 - 34 146 102.11 102.11 118.89 - 34 162 113.78 118.00 118.00 - 34 178 9.44 29.22 29.22 - 34 194 128.00 128.00 128.00 - 50 2 94.22 87.44 50.44 - 50 18 128.00 128.00 128.00 - 50 34 5.56 5.56 25.56 - 50 50 1.78 14.89 14.89 - 50 66 15.00 28.44 60.78 - 50 82 16.89 60.67 72.00 - 50 98 49.78 107.11 107.11 - 50 114 12.11 22.89 54.67 - 50 130 43.78 52.22 56.11 - 50 146 22.33 84.56 88.78 - 50 162 10.44 35.11 35.11 - 50 178 128.00 128.00 128.00 - 50 194 128.00 128.00 128.00 - 66 2 128.00 128.00 128.00 - 66 18 26.89 95.33 95.33 - 66 34 59.33 59.33 75.11 - 66 50 21.89 86.33 86.33 - 66 66 16.56 45.33 36.11 - 66 82 17.78 20.78 69.11 - 66 98 14.67 45.00 50.89 - 66 114 9.00 43.11 53.89 - 66 130 21.44 89.00 89.00 - 66 146 67.89 102.22 99.67 - 66 162 114.11 123.00 123.00 - 66 178 83.11 120.56 125.56 - 66 194 99.56 99.56 99.56 - 82 2 128.00 128.00 128.00 - 82 18 85.89 85.89 93.33 - 82 34 101.56 118.00 118.00 - 82 50 7.11 31.22 50.89 - 82 66 12.44 43.00 53.67 - 82 82 30.00 107.78 107.78 - 82 98 43.89 50.00 50.00 - 82 114 56.22 49.11 16.11 - 82 130 38.89 35.33 15.44 - 82 146 8.78 34.78 41.78 - 82 162 71.22 124.56 124.56 - 82 178 128.00 128.00 128.00 - 82 194 128.00 128.00 128.00 - 98 2 128.00 128.00 128.00 - 98 18 128.00 128.00 128.00 - 98 34 32.00 45.89 62.44 - 98 50 63.22 64.44 87.11 - 98 66 12.22 55.33 57.89 - 98 82 6.67 23.00 46.56 - 98 98 21.89 76.33 76.33 - 98 114 5.44 29.67 29.67 - 98 130 10.78 19.56 49.44 - 98 146 16.67 50.67 50.67 - 98 162 16.56 39.44 39.44 - 98 178 85.33 85.33 86.22 - 98 194 128.00 128.00 128.00 - 114 2 128.00 128.00 128.00 - 114 18 46.00 112.44 135.56 - 114 34 86.89 92.67 98.67 - 114 50 16.67 57.67 57.67 - 114 66 23.33 105.33 105.33 - 114 82 10.89 43.89 43.89 - 114 98 1.67 14.67 20.22 - 114 114 29.78 39.33 45.33 - 114 130 11.33 64.00 64.67 - 114 146 4.33 17.33 22.89 - 114 162 6.22 41.67 42.11 - 114 178 101.44 108.78 108.78 - 114 194 128.00 128.00 128.00 - 130 2 128.00 128.00 128.00 - 130 18 59.56 82.22 82.22 - 130 34 86.22 94.56 94.56 - 130 50 34.67 97.67 95.67 - 130 66 15.67 55.11 55.11 - 130 82 104.89 129.56 129.56 - 130 98 2.00 21.00 21.00 - 130 114 25.78 92.78 97.44 - 130 130 48.56 52.78 70.67 - 130 146 25.89 60.22 102.89 - 130 162 6.89 12.89 26.78 - 130 178 128.00 128.00 128.00 - 130 194 128.00 128.00 128.00 - 146 2 128.00 128.00 128.00 - 146 18 12.67 21.22 63.89 - 146 34 26.56 108.22 108.22 - 146 50 16.33 20.78 62.44 - 146 66 0.78 19.89 29.67 - 146 82 113.78 119.56 119.56 - 146 98 8.44 27.11 31.00 - 146 114 44.89 58.33 106.78 - 146 130 21.78 86.11 115.22 - 146 146 32.67 91.89 105.67 - 146 162 13.56 13.56 43.00 - 146 178 78.00 78.00 105.78 - 146 194 79.22 77.89 71.33 - 162 2 128.00 128.00 128.00 - 162 18 22.89 35.22 38.11 - 162 34 85.44 92.33 98.56 - 162 50 128.00 128.00 128.00 - 162 66 40.44 43.00 110.78 - 162 82 71.22 76.78 76.78 - 162 98 114.00 120.56 120.56 - 162 114 63.22 93.89 93.89 - 162 130 100.56 107.44 107.44 - 162 146 45.56 101.33 101.33 - 162 162 5.67 24.89 30.33 - 162 178 128.00 128.00 128.00 - 162 194 128.00 128.00 128.00 - 178 2 59.44 57.44 45.56 - 178 18 128.00 128.00 128.00 - 178 34 61.89 83.89 83.89 - 178 50 128.00 128.00 128.00 - 178 66 11.89 11.89 39.22 - 178 82 92.11 123.00 123.00 - 178 98 128.00 128.00 128.00 - 178 114 17.78 59.00 68.89 - 178 130 77.78 77.78 102.22 - 178 146 15.89 59.22 59.22 - 178 162 128.00 128.00 128.00 - 178 178 128.00 128.00 128.00 - 178 194 128.00 128.00 128.00 - 194 2 128.00 128.00 128.00 - 194 18 128.00 128.00 128.00 - 194 34 128.00 128.00 128.00 - 194 50 107.78 99.00 50.78 - 194 66 73.67 81.56 81.56 - 194 82 128.00 128.00 128.00 - 194 98 128.00 128.00 128.00 - 194 114 22.89 56.33 56.33 - 194 130 19.22 71.56 77.89 - 194 146 128.00 128.00 128.00 - 194 162 128.00 128.00 128.00 - 194 178 128.00 128.00 128.00 - 194 194 128.00 128.00 128.00 -... diff --git a/unittest/graphics/tests/dump-modify-specular.yaml b/unittest/graphics/tests/dump-modify-specular.yaml index fce4dec3866..f216a728a76 100644 --- a/unittest/graphics/tests/dump-modify-specular.yaml +++ b/unittest/graphics/tests/dump-modify-specular.yaml @@ -1,7 +1,7 @@ --- lammps_version: 4 Jul 2026 tags: graphics -date_generated: Fri Jul 24 13:07:11 2026 +date_generated: Fri Jul 24 14:37:33 2026 epsilon_projection: 0.5 epsilon_blocks: 2 nprocs: 1 @@ -23,422 +23,422 @@ setup_commands: | read_data ${input_dir}/data.peptide neighbor 2.0 bin dump viz all image 1 ${imagefile} type type size 200 200 zoom 1.5 view 60 30 shiny 0.2 box yes 0.02 bond atom 0.3 - dump_modify viz backcolor gray specular 1.0 150 + dump_modify viz backcolor gray specular tight run_commands: | run 0 image_size: 200 200 sampling: 3 16 row_means: | - 115.03 123.65 114.73 - 111.16 118.49 116.19 - 111.78 117.81 117.66 - 117.19 121.39 117.17 - 115.44 119.86 113.70 - 116.92 121.94 113.60 - 120.45 124.65 113.83 - 124.19 127.97 116.96 - 123.92 126.56 115.99 - 120.81 125.67 115.84 - 120.66 126.95 117.49 - 121.26 127.14 117.78 - 109.54 120.46 113.21 - 97.91 116.58 113.17 - 90.33 119.38 115.39 - 88.78 116.69 109.70 - 87.61 108.11 100.28 - 86.03 100.72 102.30 - 91.78 106.06 111.65 - 85.45 105.50 113.61 - 72.64 97.01 112.44 - 71.15 103.17 116.76 - 65.84 100.16 112.78 - 67.51 99.93 107.69 - 69.04 99.93 101.73 - 72.08 102.53 104.37 - 80.13 106.58 111.68 - 73.75 101.66 110.44 - 64.55 92.73 107.66 - 62.75 89.80 108.56 - 59.47 87.66 103.78 - 57.82 88.81 101.53 - 62.67 98.69 104.94 - 65.03 103.10 107.75 - 61.27 99.34 105.85 - 63.33 95.58 100.02 - 70.67 97.89 101.12 - 66.54 97.20 104.42 - 58.91 96.65 104.78 - 55.99 96.45 105.94 - 54.47 93.20 104.00 - 56.35 91.89 100.80 - 48.47 87.91 100.17 - 57.44 88.69 95.62 - 55.71 88.30 88.75 - 50.38 90.77 95.84 - 48.70 90.05 107.69 - 38.35 82.69 105.01 - 39.05 79.44 102.22 - 43.98 83.89 101.41 - 52.00 91.51 101.49 - 58.91 93.64 103.03 - 47.54 85.39 92.43 - 50.55 87.68 91.22 - 54.87 85.99 88.11 - 61.55 97.04 95.23 - 66.03 104.59 99.74 - 66.00 104.83 102.83 - 66.93 99.62 100.39 - 64.88 91.75 98.14 - 58.13 86.00 98.94 - 57.72 84.47 92.80 - 57.80 91.84 96.76 - 56.06 99.17 100.24 - 51.14 96.94 94.14 - 49.59 92.12 90.94 - 56.34 93.06 92.23 - 56.75 95.82 104.97 - 54.11 95.69 102.75 - 61.69 90.74 99.75 - 53.93 78.94 90.36 - 54.35 76.59 91.05 - 50.16 76.47 95.96 - 44.60 78.98 95.38 - 40.70 88.44 95.16 - 43.22 93.45 99.02 - 42.76 83.15 96.81 - 44.12 80.67 96.84 - 50.07 82.77 94.39 - 56.65 92.86 96.12 - 56.60 101.39 100.50 - 54.92 100.06 104.56 - 45.88 84.64 98.45 - 49.34 86.12 97.39 - 51.47 85.38 96.75 - 50.25 91.22 102.39 - 45.41 94.53 106.25 - 45.20 91.93 106.02 - 27.61 81.72 100.78 - 24.79 76.34 99.39 - 25.14 76.47 99.61 - 28.50 75.52 102.44 - 25.46 75.02 98.03 - 32.66 82.31 98.77 - 34.18 83.19 98.55 - 33.30 80.25 98.99 - 34.78 81.86 103.68 - 42.41 89.91 109.67 - 44.48 87.56 107.58 - 43.70 77.92 97.89 - 49.26 86.06 104.31 - 47.27 80.42 106.27 - 41.41 81.96 108.45 - 31.66 84.05 107.67 - 31.23 88.29 111.93 - 21.01 79.27 99.80 - 23.09 70.79 91.45 - 27.07 69.64 97.23 - 26.75 65.14 97.25 - 33.58 65.28 100.90 - 41.57 68.97 96.06 - 40.55 70.66 98.74 - 36.23 90.13 105.09 - 36.20 97.32 107.40 - 29.60 85.34 97.03 - 28.42 79.35 95.81 - 35.94 78.18 94.33 - 39.12 89.55 98.40 - 40.37 83.37 95.66 - 42.17 81.58 100.27 - 44.57 77.97 99.67 - 45.15 80.69 102.65 - 32.50 78.20 102.28 - 27.35 78.34 105.66 - 24.85 76.29 100.50 - 29.16 73.87 96.52 - 30.48 75.95 94.17 - 29.13 77.06 95.13 - 28.06 81.08 94.59 - 32.54 86.69 104.34 - 41.66 89.03 101.84 - 40.09 89.31 101.59 - 40.48 86.34 102.84 - 44.97 83.73 101.70 - 51.37 83.97 101.50 - 43.85 86.64 99.05 - 44.74 95.56 106.43 - 45.08 97.70 108.67 - 40.91 86.02 100.47 - 38.76 77.18 97.44 - 43.45 79.61 106.62 - 32.10 77.39 103.08 - 33.84 76.52 95.04 - 30.20 78.03 93.22 - 42.05 85.94 99.53 - 44.36 88.56 96.84 - 53.83 89.45 97.91 - 53.20 89.03 97.69 - 52.35 92.70 104.02 - 52.60 90.25 103.77 - 51.44 93.17 107.12 - 53.21 93.94 103.10 - 51.69 94.97 106.92 - 46.33 89.07 104.12 - 41.16 88.93 106.70 - 37.83 85.75 99.16 - 38.24 83.42 99.81 - 44.20 82.84 98.11 - 55.90 82.90 98.78 - 60.36 88.80 102.28 - 67.62 98.14 104.58 - 72.89 104.94 109.89 - 72.11 108.67 107.89 - 67.29 105.91 105.83 - 66.72 100.95 106.89 - 63.88 100.44 109.92 - 64.44 100.14 108.67 - 64.72 93.52 101.06 - 72.62 95.86 100.18 - 74.11 94.95 99.03 - 77.91 101.80 111.96 - 71.41 105.11 113.42 - 68.06 106.83 113.35 - 70.80 102.81 107.03 - 78.05 99.73 99.92 - 88.78 104.66 103.99 - 99.62 117.27 115.06 - 99.03 119.08 117.13 - 100.09 116.18 114.67 - 103.22 114.65 112.37 - 98.06 111.16 107.28 - 102.73 117.56 107.56 - 102.45 121.91 109.50 - 105.12 122.61 110.53 - 106.23 119.93 110.98 - 107.11 117.42 111.89 - 111.82 115.95 111.92 - 110.81 115.73 111.31 - 107.76 115.87 110.71 - 112.50 119.56 111.10 - 115.43 122.10 111.47 - 117.00 121.13 109.90 - 118.16 120.78 110.67 - 115.11 123.71 114.46 - 110.95 120.49 113.83 - 110.08 118.41 112.89 - 111.63 120.54 115.28 - 114.34 122.03 115.50 - 122.25 125.72 113.03 - 127.48 128.49 115.01 + 115.01 123.50 113.70 + 111.04 118.34 115.64 + 111.44 117.31 116.31 + 116.63 120.78 115.66 + 115.44 119.69 112.69 + 116.44 121.42 112.19 + 120.42 124.48 112.80 + 124.19 127.88 115.97 + 123.84 126.36 114.94 + 120.81 125.56 114.84 + 120.18 126.38 116.04 + 119.98 125.72 116.09 + 109.53 120.39 112.25 + 97.31 115.83 111.55 + 87.67 117.44 112.56 + 87.81 115.64 107.78 + 87.61 108.04 99.32 + 85.59 100.12 100.86 + 89.80 104.17 109.42 + 84.61 104.59 111.83 + 72.27 96.61 112.03 + 68.95 101.29 115.53 + 64.02 98.94 111.55 + 66.31 99.20 106.95 + 68.83 99.71 101.52 + 71.65 102.09 103.94 + 77.95 104.44 110.17 + 73.45 101.35 110.14 + 62.48 91.37 106.28 + 62.27 89.31 108.08 + 58.82 87.00 103.11 + 57.05 88.05 100.76 + 61.40 97.41 103.66 + 64.64 102.70 107.36 + 60.40 98.61 105.11 + 62.85 95.08 99.53 + 70.30 97.50 100.74 + 65.56 96.37 103.58 + 57.70 95.53 103.66 + 54.69 95.48 104.96 + 53.62 92.36 103.14 + 55.10 90.63 99.53 + 47.24 87.11 98.84 + 56.34 87.66 94.56 + 54.63 87.22 88.11 + 49.83 90.20 95.28 + 45.09 87.60 105.23 + 36.27 81.00 103.79 + 37.37 78.18 100.81 + 40.12 80.19 96.96 + 50.45 90.16 99.25 + 56.81 91.90 100.42 + 46.32 84.47 90.63 + 49.64 86.97 89.64 + 54.45 85.42 86.64 + 59.16 95.17 92.42 + 63.02 102.08 96.33 + 64.27 103.17 100.30 + 65.85 98.75 98.66 + 63.15 90.44 95.91 + 56.98 84.61 96.69 + 56.01 82.66 90.56 + 56.30 90.05 94.53 + 53.00 96.25 97.00 + 50.19 95.75 91.97 + 48.79 91.20 89.14 + 55.80 92.43 90.72 + 55.52 94.43 102.70 + 53.05 94.56 100.72 + 59.48 88.74 97.47 + 52.71 77.70 88.22 + 53.20 75.33 88.89 + 49.60 75.86 94.45 + 42.94 77.72 93.27 + 40.14 87.80 93.61 + 42.03 92.12 96.84 + 41.78 82.56 95.33 + 42.20 78.67 94.31 + 48.25 81.31 92.41 + 56.19 92.17 94.56 + 55.71 100.36 98.58 + 52.09 97.64 101.72 + 45.68 84.30 97.23 + 46.97 83.68 95.17 + 50.12 83.89 94.39 + 49.98 90.86 101.70 + 43.55 92.80 104.50 + 43.43 90.56 104.65 + 26.59 80.69 99.75 + 23.27 74.81 97.84 + 23.51 74.84 98.17 + 26.27 73.97 100.89 + 24.14 73.69 97.03 + 31.20 81.31 97.76 + 33.05 82.26 97.61 + 31.82 78.86 97.61 + 33.12 80.19 102.36 + 39.70 87.28 107.35 + 43.27 86.35 106.37 + 43.17 77.39 97.36 + 47.78 84.58 102.83 + 46.45 79.89 105.75 + 40.11 80.65 107.38 + 29.84 82.31 105.92 + 27.78 85.56 109.67 + 19.61 77.86 98.37 + 22.67 70.37 91.03 + 25.96 68.56 96.14 + 24.84 63.30 95.47 + 32.35 64.06 99.78 + 41.04 68.34 95.51 + 38.73 69.25 97.33 + 34.55 88.94 103.91 + 33.23 95.11 105.18 + 28.41 84.16 95.84 + 27.75 78.67 95.13 + 33.94 76.98 93.12 + 37.66 87.84 96.69 + 40.01 83.02 95.31 + 40.52 79.93 98.61 + 43.68 77.08 98.81 + 43.73 79.39 101.35 + 31.68 77.38 101.44 + 25.44 76.41 103.69 + 23.52 75.30 99.50 + 28.32 73.02 95.66 + 29.08 74.55 92.94 + 26.48 74.97 93.64 + 27.00 80.03 93.55 + 31.70 85.82 103.61 + 39.05 86.42 99.83 + 39.45 88.67 100.95 + 38.77 85.28 101.78 + 42.31 81.08 99.68 + 51.33 83.92 101.45 + 43.20 85.97 98.38 + 42.00 93.73 104.60 + 43.26 96.33 106.97 + 40.16 85.27 99.70 + 38.45 76.81 96.17 + 40.23 76.78 103.53 + 31.41 76.92 102.59 + 31.92 75.39 93.91 + 29.71 77.54 92.73 + 38.58 83.62 97.22 + 44.09 88.22 96.33 + 53.19 88.66 96.25 + 52.71 88.44 96.20 + 51.12 91.43 101.88 + 51.30 88.91 101.81 + 50.83 92.56 106.50 + 51.90 92.62 101.78 + 50.63 93.91 105.85 + 44.78 87.53 102.58 + 37.95 86.91 104.95 + 35.95 84.31 97.72 + 36.66 82.16 98.53 + 43.34 81.99 97.23 + 54.56 82.02 97.90 + 60.17 88.61 102.09 + 66.44 97.43 103.86 + 70.03 102.10 107.92 + 71.41 107.94 107.16 + 65.92 104.87 104.80 + 65.08 99.31 105.67 + 63.07 99.62 109.09 + 62.98 98.91 107.44 + 64.25 93.06 100.59 + 71.25 94.48 99.30 + 73.94 94.77 98.83 + 76.58 100.89 111.06 + 69.64 103.33 111.99 + 66.91 105.66 112.17 + 70.44 102.44 106.64 + 77.33 99.13 99.31 + 88.75 104.61 103.94 + 98.40 116.61 114.42 + 98.08 118.47 116.52 + 98.91 115.14 113.20 + 102.26 113.55 110.39 + 98.06 111.09 106.33 + 102.68 117.36 106.48 + 101.72 121.31 108.02 + 103.80 121.75 108.79 + 105.89 119.53 109.67 + 107.08 117.21 110.83 + 111.55 115.60 110.67 + 110.58 115.35 110.07 + 107.58 115.59 109.55 + 112.08 119.02 109.69 + 115.43 121.99 110.47 + 117.00 121.03 108.92 + 118.16 120.64 109.66 + 114.67 123.22 113.08 + 110.40 119.80 112.27 + 108.95 117.50 111.10 + 111.59 120.41 115.14 + 114.29 121.94 115.08 + 122.24 125.55 112.00 + 127.48 128.42 114.05 col_means: | - 124.34 129.10 119.53 - 121.42 128.28 117.69 - 122.81 128.41 117.23 - 118.72 125.58 118.16 - 110.42 120.00 117.72 - 107.33 118.42 119.01 - 102.77 118.86 118.50 - 100.45 118.34 113.88 - 99.19 114.57 112.42 - 98.38 114.06 113.79 - 94.56 109.98 113.97 - 92.52 105.66 109.25 - 95.74 105.78 107.70 - 96.06 110.69 111.03 - 94.38 110.37 108.78 - 93.97 110.75 107.25 - 94.94 115.52 109.97 - 89.23 111.57 110.00 - 83.98 105.67 110.53 - 82.73 104.44 110.95 - 82.54 104.05 111.71 - 79.72 100.39 108.66 - 82.04 100.71 110.08 - 75.65 96.77 108.82 - 65.92 92.94 107.22 - 62.63 94.16 108.57 - 66.56 93.50 103.78 - 70.97 93.94 103.73 - 76.80 99.03 101.91 - 74.25 105.00 108.74 - 71.89 104.89 112.58 - 69.92 104.87 110.62 - 67.89 101.48 102.39 - 72.09 101.12 104.81 - 78.53 100.20 108.45 - 66.61 93.04 103.44 - 70.78 97.41 106.81 - 70.16 104.56 113.22 - 64.08 101.56 108.83 - 59.93 93.68 102.38 - 68.43 95.18 102.36 - 70.12 100.21 107.58 - 64.86 100.18 109.23 - 60.59 98.52 106.83 - 54.76 101.08 105.54 - 53.05 98.39 104.86 - 53.03 87.87 101.84 - 55.02 83.81 101.97 - 53.74 82.84 102.94 - 52.89 83.41 99.00 - 61.35 98.83 103.31 - 59.78 101.44 103.64 - 57.02 96.87 104.32 - 57.23 95.80 105.42 - 57.29 92.96 105.39 - 59.49 88.08 105.00 - 58.87 86.59 103.17 - 59.27 91.55 103.46 - 59.23 96.75 107.97 - 48.10 86.23 98.14 - 53.80 88.16 104.03 - 47.98 90.53 106.93 - 40.66 91.25 110.64 - 33.17 84.55 103.22 - 31.83 85.34 103.53 - 32.21 82.19 102.30 - 34.35 81.14 98.31 - 37.96 83.33 96.52 - 47.73 91.30 103.30 - 44.03 85.94 101.38 - 47.29 89.75 103.09 - 40.16 90.44 100.84 - 34.67 88.78 98.36 - 33.51 88.99 99.51 - 34.12 84.96 95.33 - 39.67 85.50 101.81 - 41.40 77.78 99.82 - 36.41 78.51 99.73 - 36.35 89.21 104.53 - 33.55 90.39 106.75 - 34.00 89.08 102.89 - 30.98 89.55 99.44 - 37.18 96.55 105.61 - 35.66 92.81 104.07 - 36.82 83.75 103.24 - 41.37 78.92 102.78 - 39.81 79.93 102.28 - 41.76 76.88 102.31 - 44.94 78.50 102.44 - 43.92 74.44 98.04 - 49.59 79.02 97.07 - 56.12 88.36 100.56 - 55.01 99.23 103.33 - 55.97 103.72 101.78 - 50.94 97.99 94.09 - 52.31 98.42 101.23 - 55.76 91.30 105.25 - 50.20 82.11 100.36 - 54.63 83.80 100.56 - 48.43 88.47 102.44 - 36.27 88.97 103.48 - 34.72 82.04 100.91 - 33.94 78.20 98.08 - 34.51 79.39 96.20 - 30.38 80.31 91.66 - 43.37 91.01 95.99 - 42.60 88.03 97.06 - 45.46 86.86 97.57 - 47.99 83.73 94.60 - 47.22 83.94 97.17 - 41.97 82.40 96.25 - 33.69 81.23 95.17 - 29.33 79.70 102.26 - 31.14 82.81 101.75 - 25.30 76.42 101.42 - 25.76 74.65 101.99 - 33.12 81.16 104.23 - 33.82 77.82 97.56 - 31.91 74.89 97.19 - 40.54 74.18 95.25 - 49.66 79.25 101.20 - 50.60 83.09 101.73 - 51.05 80.55 98.56 - 47.77 86.06 103.86 - 42.56 86.35 101.14 - 38.98 88.92 102.31 - 104.92 105.33 44.33 - 115.20 117.43 45.02 - 83.76 90.53 43.41 - 41.07 76.13 99.00 - 46.12 81.74 103.68 - 40.54 79.04 105.75 - 38.76 84.54 105.61 - 33.10 86.74 104.72 - 40.72 87.06 98.28 - 49.85 82.80 100.96 - 49.26 84.73 100.17 - 51.69 85.19 102.55 - 50.44 90.52 101.92 - 47.09 94.72 104.38 - 42.95 88.97 99.94 - 40.87 88.81 97.89 - 41.20 87.19 99.62 - 40.84 90.71 103.58 - 37.79 88.33 99.34 - 38.35 88.00 94.30 - 38.85 84.12 97.72 - 41.26 86.53 99.17 - 39.54 80.74 98.70 - 40.50 76.28 99.73 - 45.41 84.99 101.34 - 48.41 89.47 97.21 - 51.27 96.33 102.66 - 52.64 95.11 100.36 - 54.47 93.33 101.14 - 47.77 87.64 98.92 - 46.64 84.11 99.81 - 50.23 85.94 96.12 - 53.45 94.50 101.25 - 60.62 104.48 106.06 - 57.34 99.03 103.17 - 61.59 96.47 103.95 - 58.52 87.75 102.31 - 66.03 94.09 105.28 - 59.90 91.67 103.68 - 61.90 98.95 106.88 - 62.92 96.01 105.05 - 64.49 95.79 101.06 - 68.14 94.41 99.83 - 73.73 97.69 103.92 - 70.69 100.30 106.52 - 70.51 98.58 107.64 - 72.71 96.07 102.55 - 78.10 98.70 104.77 - 86.86 106.92 112.19 - 83.44 101.22 112.16 - 82.31 99.95 110.48 - 89.91 102.83 108.02 - 98.50 114.61 114.52 - 91.56 116.00 113.53 - 91.46 116.62 114.16 - 86.23 110.75 110.38 - 84.39 107.68 109.41 - 82.55 105.52 108.01 - 86.81 106.49 107.72 - 93.53 111.41 111.81 - 98.06 111.48 113.30 - 96.83 109.92 111.98 - 97.22 110.06 110.67 - 98.17 112.26 109.52 - 99.18 113.83 110.50 - 103.40 116.19 111.83 - 108.24 118.88 116.05 - 112.44 120.67 114.38 - 116.31 122.75 113.05 - 121.08 124.55 116.34 - 121.14 124.63 118.19 - 119.23 122.71 117.43 - 119.67 122.31 116.88 - 124.88 125.17 119.30 + 124.06 128.73 118.42 + 121.19 128.06 117.47 + 122.73 128.16 116.86 + 118.72 125.58 116.54 + 109.51 119.41 117.13 + 106.11 117.17 117.75 + 102.64 118.67 117.11 + 100.12 117.91 112.87 + 98.35 114.24 112.09 + 97.27 113.16 112.67 + 92.97 108.49 111.53 + 91.64 104.71 108.72 + 94.86 104.86 106.98 + 95.96 110.56 109.55 + 93.03 109.27 107.26 + 93.91 110.68 107.19 + 93.92 114.61 108.75 + 88.84 111.16 108.14 + 83.69 105.33 110.17 + 81.75 103.39 109.90 + 81.06 103.16 109.31 + 79.42 99.95 107.91 + 80.97 99.63 109.45 + 75.13 96.05 107.69 + 65.08 92.08 105.04 + 60.60 92.53 106.94 + 64.94 92.27 102.94 + 70.73 93.70 101.92 + 76.65 98.77 101.42 + 72.88 104.02 107.77 + 70.31 103.15 110.24 + 69.47 104.37 108.97 + 66.84 100.96 101.86 + 70.89 99.86 103.56 + 78.14 99.81 106.42 + 66.42 92.74 103.02 + 69.06 95.67 105.07 + 67.94 102.39 110.58 + 61.61 99.59 106.42 + 59.57 93.31 102.03 + 67.42 94.01 101.77 + 69.75 99.83 105.55 + 63.45 99.03 108.02 + 59.37 97.27 105.57 + 53.58 99.81 103.31 + 51.62 97.38 103.02 + 52.61 87.44 101.39 + 53.76 82.39 100.65 + 52.55 81.66 100.47 + 52.40 82.81 98.39 + 59.92 97.85 102.33 + 58.72 100.81 101.89 + 55.60 95.56 102.35 + 55.90 94.56 104.19 + 55.96 91.75 104.01 + 59.16 87.75 103.07 + 58.36 86.00 102.57 + 57.81 90.33 102.23 + 58.35 95.83 105.76 + 47.53 85.56 96.98 + 51.73 86.72 102.58 + 46.45 88.81 105.08 + 38.24 89.17 107.94 + 31.32 83.30 101.96 + 29.82 83.41 101.73 + 30.16 80.73 99.98 + 33.24 80.31 97.14 + 36.71 82.06 95.25 + 46.53 90.41 102.03 + 43.78 85.69 99.73 + 45.27 88.02 101.35 + 38.17 89.08 99.50 + 33.15 87.67 95.72 + 31.69 87.08 97.38 + 32.66 83.71 94.08 + 39.23 84.98 100.81 + 40.88 77.25 98.86 + 35.12 77.73 98.95 + 33.26 86.03 101.94 + 31.30 89.09 104.59 + 31.82 87.23 101.58 + 29.15 88.72 98.62 + 35.12 94.44 103.47 + 33.12 90.58 101.53 + 36.29 83.30 102.79 + 40.03 77.81 101.66 + 37.63 78.11 99.60 + 39.74 75.70 101.13 + 43.73 77.28 101.20 + 43.62 74.12 97.03 + 48.34 77.69 95.72 + 55.41 87.65 99.83 + 54.16 98.44 102.48 + 54.49 102.71 99.97 + 49.66 96.56 92.88 + 51.22 97.06 99.86 + 54.70 90.13 103.58 + 49.52 81.37 99.47 + 53.22 82.91 99.69 + 47.54 87.66 101.50 + 34.92 87.64 101.41 + 32.01 79.66 99.00 + 32.25 76.55 96.77 + 32.60 77.47 94.06 + 28.86 78.73 90.01 + 42.55 90.18 95.16 + 40.23 86.17 95.30 + 42.45 84.81 94.86 + 46.73 82.92 93.81 + 46.40 83.05 95.75 + 39.65 80.35 93.33 + 31.96 79.86 94.30 + 27.54 78.44 101.04 + 30.68 82.27 100.91 + 24.41 75.53 99.95 + 24.02 73.16 100.51 + 30.73 78.86 102.19 + 32.15 76.36 95.34 + 30.93 73.86 96.15 + 39.01 72.64 94.20 + 48.04 78.18 99.70 + 48.49 80.97 99.67 + 49.49 79.58 97.59 + 46.37 84.56 102.79 + 41.73 85.50 99.39 + 37.25 87.34 100.73 + 104.42 104.81 43.80 + 114.97 117.12 44.39 + 83.69 90.44 43.33 + 39.81 74.87 97.98 + 45.47 81.08 103.02 + 37.62 76.57 103.39 + 36.67 82.51 103.58 + 31.61 85.23 102.33 + 39.51 85.89 97.11 + 49.20 82.05 100.30 + 48.14 83.61 99.06 + 50.30 83.77 100.73 + 48.13 88.58 99.98 + 44.23 91.79 101.64 + 41.83 87.83 97.95 + 39.31 87.20 96.56 + 39.87 85.83 98.28 + 39.50 89.34 101.63 + 36.87 87.34 98.08 + 36.34 86.28 92.56 + 38.30 83.42 97.00 + 39.35 84.78 97.19 + 37.35 78.66 96.84 + 38.68 74.44 98.51 + 44.09 83.78 99.76 + 47.19 88.17 95.72 + 48.88 94.27 100.61 + 51.94 94.28 99.74 + 52.91 91.81 98.85 + 46.62 86.95 98.22 + 45.41 82.89 98.58 + 49.06 84.70 94.22 + 52.51 93.48 100.11 + 57.70 101.87 103.92 + 56.10 97.98 101.97 + 61.15 96.02 102.78 + 57.95 87.17 101.72 + 65.19 93.22 104.41 + 58.57 90.28 101.11 + 59.51 96.58 104.11 + 62.20 95.28 104.33 + 63.90 95.02 100.03 + 67.44 93.89 97.80 + 72.81 97.11 103.35 + 69.64 99.23 105.45 + 69.36 97.44 105.62 + 72.47 95.73 102.19 + 77.06 97.95 104.02 + 84.78 105.30 110.31 + 83.41 101.19 111.58 + 81.06 98.77 109.28 + 89.34 102.35 107.53 + 98.47 114.57 113.59 + 89.96 114.55 112.08 + 91.00 116.16 113.70 + 86.20 110.68 109.84 + 82.92 106.81 108.09 + 82.14 105.11 107.61 + 86.61 106.20 107.44 + 92.81 110.88 110.39 + 96.96 110.26 111.89 + 95.99 109.08 111.45 + 96.56 109.27 109.20 + 97.94 111.97 108.14 + 99.18 113.81 110.49 + 102.79 115.43 111.07 + 107.99 118.63 114.17 + 112.40 120.53 114.13 + 116.31 122.73 113.04 + 120.82 124.17 115.12 + 120.83 124.27 116.90 + 118.83 122.30 117.02 + 119.58 122.06 116.57 + 124.88 125.17 117.65 sample_blocks: | 2 2 128.00 128.00 128.00 2 18 128.00 128.00 128.00 2 34 128.00 128.00 128.00 2 50 162.67 139.00 14.22 2 66 128.00 128.00 128.00 - 2 82 82.33 141.89 141.89 + 2 82 72.78 132.33 132.33 2 98 99.56 113.56 113.56 - 2 114 2.78 2.78 123.22 + 2 114 0.22 0.22 120.56 2 130 121.78 120.56 113.78 2 146 166.00 155.22 85.33 2 162 128.00 128.00 128.00 @@ -451,47 +451,47 @@ sample_blocks: | 18 66 128.00 128.00 128.00 18 82 0.00 2.33 93.44 18 98 0.00 58.22 73.89 - 18 114 48.22 48.22 120.33 - 18 130 14.33 76.44 133.00 + 18 114 43.33 43.33 115.44 + 18 130 14.22 76.33 132.89 18 146 85.33 95.22 95.22 18 162 128.00 128.00 128.00 - 18 178 15.11 100.89 142.78 - 18 194 203.00 179.89 18.67 + 18 178 2.56 91.78 133.67 + 18 194 203.00 179.00 3.11 34 2 128.00 128.00 128.00 - 34 18 44.56 134.44 134.44 + 34 18 42.78 132.44 132.44 34 34 128.00 128.00 128.00 34 50 0.00 58.11 78.67 34 66 128.00 128.00 128.00 34 82 42.67 77.22 77.22 34 98 128.00 128.00 128.00 34 114 0.00 28.11 107.56 - 34 130 1.44 87.67 87.67 + 34 130 0.11 86.33 86.33 34 146 99.56 99.56 111.11 34 162 113.78 124.78 124.78 - 34 178 14.67 140.33 140.33 + 34 178 2.33 131.11 131.11 34 194 128.00 128.00 128.00 - 50 2 177.67 165.11 68.78 + 50 2 177.56 162.56 47.00 50 18 128.00 128.00 128.00 - 50 34 0.56 0.56 133.56 - 50 50 1.11 119.22 119.22 - 50 66 8.00 80.11 122.00 - 50 82 11.67 38.89 106.67 + 50 34 0.00 0.00 132.89 + 50 50 0.00 118.11 118.11 + 50 66 1.00 73.11 115.00 + 50 82 1.78 29.00 96.78 50 98 39.67 67.11 67.11 - 50 114 6.33 12.44 116.44 - 50 130 73.78 124.89 154.78 + 50 114 0.78 6.89 110.78 + 50 130 48.11 109.67 139.56 50 146 0.00 46.33 87.67 - 50 162 0.00 106.78 106.78 + 50 162 0.00 106.67 106.67 50 178 128.00 128.00 128.00 50 194 128.00 128.00 128.00 66 2 128.00 128.00 128.00 - 66 18 0.00 88.67 88.67 + 66 18 0.00 88.56 88.56 66 34 56.89 56.89 122.56 66 50 0.00 78.22 78.22 - 66 66 127.67 143.00 51.33 + 66 66 127.67 140.89 29.89 66 82 0.00 40.78 77.78 66 98 0.00 42.44 93.67 - 66 114 1.22 28.89 104.89 - 66 130 0.11 89.67 89.67 + 66 114 0.00 27.67 103.67 + 66 130 0.00 89.56 89.56 66 146 81.22 99.11 78.67 66 162 113.78 113.78 113.78 66 178 71.11 87.44 92.44 @@ -499,13 +499,13 @@ sample_blocks: | 82 2 128.00 128.00 128.00 82 18 85.33 85.33 128.00 82 34 99.56 110.44 110.44 - 82 50 1.44 71.11 96.33 + 82 50 0.00 69.67 94.89 82 66 0.00 78.00 104.89 - 82 82 0.00 83.89 83.89 + 82 82 0.00 83.78 83.78 82 98 42.67 120.11 120.11 - 82 114 160.89 157.33 49.33 + 82 114 160.89 155.56 28.11 82 130 160.33 143.33 20.44 - 82 146 10.78 96.56 118.22 + 82 146 1.56 87.33 109.00 82 162 56.89 84.22 84.22 82 178 128.00 128.00 128.00 82 194 128.00 128.00 128.00 @@ -513,25 +513,25 @@ sample_blocks: | 98 18 128.00 128.00 128.00 98 34 28.44 80.78 100.00 98 50 56.89 62.22 101.11 - 98 66 7.78 103.89 118.67 + 98 66 1.00 97.00 111.78 98 82 0.00 40.33 93.33 98 98 0.00 92.33 92.33 - 98 114 2.89 126.56 126.56 + 98 114 0.11 123.89 123.89 98 130 0.00 34.67 102.00 - 98 146 2.78 121.78 121.78 + 98 146 0.22 119.11 119.11 98 162 14.22 121.67 121.67 98 178 85.33 85.33 119.56 98 194 128.00 128.00 128.00 114 2 128.00 128.00 128.00 114 18 14.22 55.22 68.89 114 34 85.33 96.33 102.56 - 114 50 22.33 128.33 128.33 + 114 50 4.22 120.89 120.89 114 66 0.00 67.33 67.33 - 114 82 0.56 119.89 119.89 - 114 98 3.33 57.89 120.22 - 114 114 28.44 67.89 124.78 + 114 82 0.00 119.22 119.22 + 114 98 0.33 54.89 117.11 + 114 114 28.44 67.89 124.67 114 130 0.00 65.67 78.33 - 114 146 0.11 32.56 107.89 + 114 146 0.00 32.44 107.67 114 162 0.00 48.44 78.00 114 178 99.56 115.44 115.44 114 194 128.00 128.00 128.00 @@ -539,12 +539,12 @@ sample_blocks: | 130 18 56.89 93.44 93.44 130 34 85.33 116.67 116.67 130 50 38.56 86.33 65.89 - 130 66 1.11 114.78 114.78 + 130 66 0.00 113.67 113.67 130 82 99.56 104.44 104.44 - 130 98 2.33 120.56 120.56 + 130 98 0.11 118.11 118.11 130 114 0.00 76.44 84.33 130 130 77.11 91.00 48.00 - 130 146 3.11 52.78 84.33 + 130 146 0.22 49.89 81.44 130 162 0.00 26.78 106.22 130 178 128.00 128.00 128.00 130 194 128.00 128.00 128.00 @@ -552,15 +552,15 @@ sample_blocks: | 146 18 0.00 14.11 77.78 146 34 0.00 62.67 62.67 146 50 0.00 13.22 90.11 - 146 66 0.22 75.67 118.56 + 146 66 0.00 75.44 118.33 146 82 113.78 126.00 126.00 146 98 0.00 94.44 109.33 146 114 28.44 33.11 68.78 146 130 0.00 29.44 52.33 146 146 14.22 64.56 68.22 - 146 162 1.56 1.56 117.22 + 146 162 0.11 0.11 115.67 146 178 71.11 71.11 103.56 - 146 194 173.22 163.22 75.56 + 146 194 173.22 161.44 71.56 162 2 128.00 128.00 128.00 162 18 28.44 94.22 89.44 162 34 85.33 105.33 118.00 @@ -574,7 +574,7 @@ sample_blocks: | 162 162 0.00 67.67 93.56 162 178 128.00 128.00 128.00 162 194 128.00 128.00 128.00 - 178 2 208.00 190.89 68.00 + 178 2 208.00 189.67 47.33 178 18 128.00 128.00 128.00 178 34 56.89 99.89 99.89 178 50 128.00 128.00 128.00 @@ -590,11 +590,11 @@ sample_blocks: | 194 2 128.00 128.00 128.00 194 18 128.00 128.00 128.00 194 34 128.00 128.00 128.00 - 194 50 155.44 142.11 53.33 + 194 50 155.33 140.67 44.22 194 66 71.11 108.56 108.56 194 82 128.00 128.00 128.00 194 98 128.00 128.00 128.00 - 194 114 15.00 95.56 95.56 + 194 114 14.22 94.78 94.78 194 130 0.00 59.56 86.56 194 146 128.00 128.00 128.00 194 162 128.00 128.00 128.00 From 99e928eadc9da7519465aad9909e3510c750a1de Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 24 Jul 2026 14:39:53 -0400 Subject: [PATCH 052/100] reword depthcue docs to fix spell check --- doc/src/dump_image.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/src/dump_image.rst b/doc/src/dump_image.rst index 2b799728654..9d94b249ebb 100644 --- a/doc/src/dump_image.rst +++ b/doc/src/dump_image.rst @@ -893,13 +893,13 @@ following the background gradient when one is set with the *backcolor2* option; any color name known to LAMMPS selects that color instead, e.g. white or gray fog over a dark background. The *start* setting determines where the fading begins. With *auto* it begins at the -nearest rendered object, so the front of the scene is always unfaded. +nearest rendered object, so the front of the scene never fades. A numeric value instead positions the start as a fraction of the simulation box projected onto the view direction, similar to the fractions of the *center* keyword but reduced to a single number: 0.0 starts the fading at the side of the box nearest to the camera, 0.5 at its middle, and 1.0 at its far side; values outside this range are -allowed. Objects in front of the start position remain unfaded, which +allowed. Objects in front of the start position are not faded, which avoids darkening most of the scene when the rendered objects span a large depth range. The fading always ends at the most distant rendered object. Unlike the *ssao* keyword, depth cueing adds no significant From 78545bcfb48f22cf5843e9aea1ff13f1c6a3a525 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 24 Jul 2026 15:06:18 -0400 Subject: [PATCH 053/100] reword gamma keyword as tonal adjustment instead of display correction The default rendering is already tuned to look right on typical displays and the image files carry no gamma information, so describe the gamma keyword as a fine-tuning adjustment: values above 1.0 lighten the image, values below 1.0 darken it. --- doc/src/dump_image.rst | 24 ++++++++++++++---------- src/GRAPHICS/image.cpp | 2 +- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/doc/src/dump_image.rst b/doc/src/dump_image.rst index 9d94b249ebb..1c76c947260 100644 --- a/doc/src/dump_image.rst +++ b/doc/src/dump_image.rst @@ -194,7 +194,7 @@ Syntax R,G,B = red/green/blue numeric values from 0.0 to 1.0 hex = 24-bit RGB color in hexadecimal *gamma* arg = gvalue - gvalue = gamma correction applied to rendered objects (from 0.1 to 10.0, 1.0 = no correction) + gvalue = gamma adjustment applied to rendered objects (from 0.1 to 10.0, 1.0 = no change) *gtrans* arg = transparency transparency = transparency for visualized grid (value between 0 (invisible) and 1 (fully opaque)) *lights* args = ambient key fill back @@ -1327,15 +1327,19 @@ the scene from behind the camera to provide depth. .. versionadded:: TBD -The *gamma* keyword applies a gamma correction to the rendered objects: -the light contributions to each pixel are summed up linearly and then -raised to the power of 1/*gvalue* before conversion to the 8-bit color -values of the image file. Values larger than 1.0 (the typical display -gamma is 2.2) brighten the image, most strongly in the darker regions, -and thus recover shading detail on the dimly lit side of objects; -values below 1.0 darken the image and increase contrast. The -correction applies only to rendered objects; the background colors are -used exactly as specified. +The *gamma* keyword adjusts the gamma value of the rendered objects: +the summed up light contributions of each pixel are raised to the power +of 1/*gvalue* before they are converted to the 8-bit color values of +the image file, similar to the gamma adjustment of image manipulation +programs. A value larger than 1.0 lightens the image, most strongly in +the darker regions, and thus can bring out shading detail on the dimly +lit side of objects; a value smaller than 1.0 darkens the image and +increases the contrast. The default rendering is already tuned to look +right on typical displays, and no gamma information is stored in the +image files, so this setting fine-tunes the tonal balance rather than +applying a required display correction. The adjustment applies only to +rendered objects; the background colors are used exactly as +specified. .. versionadded:: TBD diff --git a/src/GRAPHICS/image.cpp b/src/GRAPHICS/image.cpp index f5d36f58f4a..82c62c55c1c 100644 --- a/src/GRAPHICS/image.cpp +++ b/src/GRAPHICS/image.cpp @@ -1790,7 +1790,7 @@ void Image::draw_pixel(int ix, int iy, double depth, const double *surface, c[1] = saturate(c[1]); c[2] = saturate(c[2]); - // apply gamma correction to the summed up linear light contributions + // apply gamma adjustment to the summed up light contributions if (gamma != 1.0) { c[0] = pow(c[0], 1.0 / gamma); From a06d162d03817b94e7e316108339f349e3f15bfc Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 24 Jul 2026 15:16:47 -0400 Subject: [PATCH 054/100] add fast depth-darkening style to the dump image ssao keyword Setting 'ssao fast ' selects depth shading by unsharp-masking the depth buffer (Luft, Colditz, Deussen, ACM Trans. Graph. 25, 1206 (2006)): blur the depth buffer with a separable gaussian kernel and darken pixels that lie behind the local average depth. The visual impression is similar to the classic SSAO algorithm but smooth instead of grainy, at about 5x lower cost (measured at 3200x2400 internal resolution). The pass runs on the composited image on the output rank, so the broadcast/gather communication and the surface buffer exchange of the classic algorithm are skipped; images are identical for any number of MPI ranks. The seed value is unused in this mode. --- doc/src/dump_image.rst | 22 +- src/GRAPHICS/dump_image.cpp | 8 +- src/GRAPHICS/image.cpp | 126 +++- src/GRAPHICS/image.h | 2 + .../graphics/tests/dump-image-ssao-fast.yaml | 603 ++++++++++++++++++ 5 files changed, 753 insertions(+), 8 deletions(-) create mode 100644 unittest/graphics/tests/dump-image-ssao-fast.yaml diff --git a/doc/src/dump_image.rst b/doc/src/dump_image.rst index 1c76c947260..aa76dcd9f0d 100644 --- a/doc/src/dump_image.rst +++ b/doc/src/dump_image.rst @@ -112,8 +112,8 @@ Syntax *fsaa* arg = yes/no yes/no = do or do not apply anti-aliasing *ssao* value = shading seed dfactor = SSAO depth shading - shading = *yes* or *no* = turn depth shading on/off - seed = random # seed (positive integer) + shading = *yes* or *no* or *fast* = depth shading off, on, or on with the fast algorithm + seed = random # seed (positive integer, unused by the fast algorithm) dfactor = strength of shading from 0.0 to 1.0 *depthcue* values = cueing cfactor color start = depth cueing cueing = *yes* or *no* = turn depth cueing on/off @@ -881,6 +881,18 @@ reproducible, which avoids flickering shading in movies. Different .. versionadded:: TBD +Setting *fast* instead of *yes* selects an alternative depth shading +algorithm that blurs the depth buffer and darkens pixels that lie +behind the average depth of their surroundings :ref:`(Luft) `. +It produces a similar visual impression of depth in crevices and +contact regions at a small fraction of the computational cost of the +classic SSAO algorithm, and the resulting shading is smooth instead of +slightly grainy. The *seed* value is ignored in this case, but must +still be provided. The *dfactor* value scales the strength of the +shading as before. + +.. versionadded:: TBD + The *depthcue* keyword turns on/off depth cueing. If *yes* is set, rendered objects fade toward the fog color the more distant from the viewer they are, similar to looking through fog. This is perceived as @@ -1821,3 +1833,9 @@ the RGB (red/green/blue) values. * - |color_yellow| yellow: 1.000, 1.000, 0.000 - |color_yellowgreen| yellowgreen: 0.604, 0.804, 0.196 - + +---------- + +.. _Luft: + +**(Luft)** Luft, Colditz, Deussen, ACM Trans. Graph. 25, 1206-1213 (2006). diff --git a/src/GRAPHICS/dump_image.cpp b/src/GRAPHICS/dump_image.cpp index ec6fc2b6140..51b1b6b3e15 100644 --- a/src/GRAPHICS/dump_image.cpp +++ b/src/GRAPHICS/dump_image.cpp @@ -612,7 +612,13 @@ DumpImage::DumpImage(LAMMPS *lmp, int narg, char **arg) : } else if (strcmp(arg[iarg],"ssao") == 0) { if (iarg+4 > narg) utils::missing_cmd_args(FLERR,"dump image ssao", error); - image->ssao = utils::logical(FLERR,arg[iarg+1],false,lmp); + if (strcmp(arg[iarg+1],"fast") == 0) { + image->ssao = 1; + image->fastssao = 1; + } else { + image->ssao = utils::logical(FLERR,arg[iarg+1],false,lmp); + image->fastssao = 0; + } int seed = utils::inumeric(FLERR,arg[iarg+2],false,lmp); if (seed <= 0) error->all(FLERR, iarg + 2, "Invalid dump image ssao seed {}", seed); image->seed = seed; diff --git a/src/GRAPHICS/image.cpp b/src/GRAPHICS/image.cpp index 82c62c55c1c..22dd9fa561f 100644 --- a/src/GRAPHICS/image.cpp +++ b/src/GRAPHICS/image.cpp @@ -362,6 +362,7 @@ Image::Image(LAMMPS *lmp, int nmap_caller) : shiny = 1.0; gamma = 1.0; ssao = NO; + fastssao = 0; fsaa = NO; depthcue = NO; depthcueint = 0.0; @@ -838,6 +839,12 @@ void Image::merge() { MPI_Request requests[3]; + // only the classic SSAO algorithm needs the surface buffer and the + // MPI-distributed shading pass; the fast algorithm and depth cueing + // are applied to the composited image on the output rank + + const int classic = ssao && !fastssao; + int nhalf = 1; while (nhalf < nprocs) nhalf *= 2; nhalf /= 2; @@ -846,10 +853,10 @@ void Image::merge() if (me < nhalf && me+nhalf < nprocs) { MPI_Irecv(rgbcopy,npixels*3,MPI_BYTE,me+nhalf,0,world,&requests[0]); MPI_Irecv(depthcopy,npixels,MPI_DOUBLE,me+nhalf,0,world,&requests[1]); - if (ssao) + if (classic) MPI_Irecv(surfacecopy,npixels*2,MPI_DOUBLE, me+nhalf,0,world,&requests[2]); - if (ssao) MPI_Waitall(3,requests,MPI_STATUS_IGNORE); + if (classic) MPI_Waitall(3,requests,MPI_STATUS_IGNORE); else MPI_Waitall(2,requests,MPI_STATUS_IGNORE); for (int i = 0; i < npixels; i++) { @@ -858,7 +865,7 @@ void Image::merge() imageBuffer[i*3+0] = rgbcopy[i*3+0]; imageBuffer[i*3+1] = rgbcopy[i*3+1]; imageBuffer[i*3+2] = rgbcopy[i*3+2]; - if (ssao) { + if (classic) { surfaceBuffer[i*2+0] = surfacecopy[i*2+0]; surfaceBuffer[i*2+1] = surfacecopy[i*2+1]; } @@ -868,7 +875,7 @@ void Image::merge() } else if (me >= nhalf && me < 2*nhalf) { MPI_Send(imageBuffer,npixels*3,MPI_BYTE,me-nhalf,0,world); MPI_Send(depthBuffer,npixels,MPI_DOUBLE,me-nhalf,0,world); - if (ssao) MPI_Send(surfaceBuffer,npixels*2,MPI_DOUBLE,me-nhalf,0,world); + if (classic) MPI_Send(surfaceBuffer,npixels*2,MPI_DOUBLE,me-nhalf,0,world); } nhalf /= 2; @@ -880,7 +887,7 @@ void Image::merge() // MPI_Gather() result back to proc 0 // use Gatherv() if subset of pixels is not the same size on every proc - if (ssao) { + if (classic) { MPI_Bcast(imageBuffer,npixels*3,MPI_BYTE,0,world); MPI_Bcast(surfaceBuffer,npixels*2,MPI_DOUBLE,0,world); MPI_Bcast(depthBuffer,npixels,MPI_DOUBLE,0,world); @@ -913,6 +920,10 @@ void Image::merge() writeBuffer = imageBuffer; } + // apply fast SSAO depth shading to the final composited image + + if (ssao && fastssao && (me == 0)) compute_SSAO_fast(); + // apply depth cueing to the final composited image if (depthcue && (me == 0)) compute_depthcue(); @@ -1940,6 +1951,111 @@ void Image::compute_SSAO() } } +/* ---------------------------------------------------------------------- + fast depth shading on the composited image on the output rank + following Luft, Colditz, Deussen, ACM Trans. Graph. 25, 1206 (2006): + blur the depth buffer with a separable gaussian kernel and darken + pixels that lie behind the local average depth in proportion to the + difference. reads as ambient occlusion in crevices and contact + regions at a fraction of the cost of the classic SSAO algorithm + and with no image noise. +------------------------------------------------------------------------- */ + +void Image::compute_SSAO_fast() +{ + // pixel radius of the blur kernel, same size as the classic SSAO radius + + const double pixelWidth = (tanPerPixel > 0) ? tanPerPixel : -tanPerPixel / zoom; + int pixelRadius = (int) trunc(SSAORadius / pixelWidth + 0.5); + if (pixelRadius < 1) pixelRadius = 1; + + // depth of the most distant drawn pixel substitutes for the background + // in the blur, so silhouettes against the background darken gently + + bool first = true; + double dmax = 0.0; + for (int i = 0; i < npixels; i++) { + const double d = depthBuffer[i]; + if (d < 0.0) continue; + if (first) { + dmax = d; + first = false; + } else { + dmax = MAX(dmax,d); + } + } + if (first) return; // no drawn pixels + + // normalized gaussian blur kernel with sigma = half the radius + + auto *kernel = new double[pixelRadius+1]; + const double sigma = 0.5 * pixelRadius; + double knorm = 0.0; + for (int k = 0; k <= pixelRadius; ++k) { + kernel[k] = exp(-0.5 * (k/sigma) * (k/sigma)); + knorm += (k > 0) ? 2.0*kernel[k] : kernel[k]; + } + for (int k = 0; k <= pixelRadius; ++k) kernel[k] /= knorm; + + auto *rowblur = new double[npixels]; + auto *blur = new double[npixels]; + + // blur along rows, then along columns; clamp indices at the borders + +#if defined(_OPENMP) +#pragma omp parallel for schedule(static) +#endif + for (int iy = 0; iy < height; ++iy) { + for (int ix = 0; ix < width; ++ix) { + double sum = 0.0; + for (int k = -pixelRadius; k <= pixelRadius; ++k) { + int jx = ix + k; + if (jx < 0) jx = 0; + if (jx >= width) jx = width - 1; + const double d = depthBuffer[iy*width + jx]; + sum += kernel[(k < 0) ? -k : k] * ((d < 0.0) ? dmax : d); + } + rowblur[iy*width + ix] = sum; + } + } + +#if defined(_OPENMP) +#pragma omp parallel for schedule(static) +#endif + for (int iy = 0; iy < height; ++iy) { + for (int ix = 0; ix < width; ++ix) { + double sum = 0.0; + for (int k = -pixelRadius; k <= pixelRadius; ++k) { + int jy = iy + k; + if (jy < 0) jy = 0; + if (jy >= height) jy = height - 1; + sum += kernel[(k < 0) ? -k : k] * rowblur[jy*width + ix]; + } + blur[iy*width + ix] = sum; + } + } + + // darken drawn pixels that lie behind the local average depth + +#if defined(_OPENMP) +#pragma omp parallel for schedule(static) +#endif + for (int i = 0; i < npixels; ++i) { + const double d = depthBuffer[i]; + if (d < 0.0) continue; + const double delta = d - blur[i]; + if (delta <= 0.0) continue; + const double ao = ssaoint * saturate(3.0 * delta / SSAORadius); + writeBuffer[i*3+0] = static_cast((1.0 - ao) * writeBuffer[i*3+0]); + writeBuffer[i*3+1] = static_cast((1.0 - ao) * writeBuffer[i*3+1]); + writeBuffer[i*3+2] = static_cast((1.0 - ao) * writeBuffer[i*3+2]); + } + + delete[] kernel; + delete[] rowblur; + delete[] blur; +} + /* ---------------------------------------------------------------------- apply depth cueing to the composited image on the output rank: fade drawn pixels toward the fog color with increasing distance from diff --git a/src/GRAPHICS/image.h b/src/GRAPHICS/image.h index b2735c9e18b..14a50eead2d 100644 --- a/src/GRAPHICS/image.h +++ b/src/GRAPHICS/image.h @@ -37,6 +37,7 @@ class Image : protected Pointers { double gamma; // gamma correction of rendered objects, 1.0 = off int fsaa; // antialiasing on or off int ssao; // SSAO on or off + int fastssao; // 1 = fast depth-darkening algorithm, 0 = classic SSAO int seed; // RN seed for SSAO double ssaoint; // strength of shading from 0 to 1 int depthcue; // depth cueing on or off @@ -149,6 +150,7 @@ class Image : protected Pointers { void draw_pixel(int, int, double, const double *, const double *); void setup_lights(); void compute_SSAO(); + void compute_SSAO_fast(); void compute_depthcue(); // inline functions diff --git a/unittest/graphics/tests/dump-image-ssao-fast.yaml b/unittest/graphics/tests/dump-image-ssao-fast.yaml new file mode 100644 index 00000000000..132c4fd9ea6 --- /dev/null +++ b/unittest/graphics/tests/dump-image-ssao-fast.yaml @@ -0,0 +1,603 @@ +--- +lammps_version: 4 Jul 2026 +tags: graphics +date_generated: Fri Jul 24 15:16:20 2026 +epsilon_projection: 0.5 +epsilon_blocks: 2 +nprocs: 1 +prerequisites: | + atom full + pair lj/charmm/coul/charmm + bond harmonic + angle charmm + dihedral charmm + improper harmonic +setup_commands: | + units real + atom_style full + pair_style lj/charmm/coul/charmm 8.0 10.0 + bond_style harmonic + angle_style charmm + dihedral_style charmm + improper_style harmonic + read_data ${input_dir}/data.peptide + neighbor 2.0 bin + dump viz all image 1 ${imagefile} element type size 200 200 zoom 1.5 view 60 30 shiny 0.2 box yes 0.02 bond atom 0.3 fsaa yes ssao fast 314123 0.7 + dump_modify viz backcolor gray boxcolor yellow element C C O H N C C C O H H S O H acolor 1 silver +run_commands: | + run 0 +image_size: 200 200 +sampling: 3 16 +row_means: | + 151.21 148.10 130.44 + 149.69 143.12 129.22 + 149.97 138.62 126.31 + 150.78 139.71 123.24 + 150.26 139.82 122.56 + 147.75 139.55 122.11 + 144.76 140.38 122.69 + 142.71 141.99 124.81 + 142.68 141.21 124.03 + 145.61 142.01 124.86 + 146.54 142.19 124.70 + 148.00 143.85 126.60 + 154.31 146.87 128.97 + 164.72 154.75 136.53 + 176.01 165.18 146.10 + 175.79 165.56 146.94 + 169.51 159.79 141.31 + 166.51 148.56 130.86 + 163.20 142.74 125.14 + 166.41 143.87 129.44 + 168.92 142.16 133.17 + 176.19 151.28 145.61 + 182.25 156.79 149.96 + 180.41 158.28 149.91 + 171.96 154.91 144.97 + 168.09 154.35 143.66 + 167.08 154.83 143.86 + 172.78 155.75 144.80 + 180.11 155.28 144.57 + 185.45 150.90 139.88 + 189.16 153.37 141.93 + 184.63 149.66 138.66 + 179.28 154.23 143.20 + 182.89 165.12 154.44 + 186.18 167.58 156.43 + 180.29 163.29 152.19 + 174.26 156.90 144.91 + 175.80 153.68 142.16 + 179.40 156.26 145.57 + 173.71 152.51 141.55 + 176.20 151.78 140.84 + 178.59 153.90 143.19 + 181.18 152.75 141.84 + 182.44 149.91 138.94 + 177.50 149.87 139.13 + 178.08 155.61 145.88 + 180.72 153.12 145.19 + 186.03 153.49 146.47 + 192.63 153.61 144.46 + 188.83 150.63 138.08 + 189.84 153.69 136.96 + 193.03 161.56 144.34 + 192.84 163.76 146.56 + 188.78 159.52 142.06 + 179.84 152.75 135.31 + 168.66 146.57 129.04 + 165.75 147.96 128.27 + 172.38 155.09 132.34 + 177.32 155.04 133.88 + 171.00 145.85 127.97 + 176.77 144.85 127.18 + 179.29 143.55 126.11 + 184.60 144.66 127.25 + 186.74 153.82 136.32 + 182.00 159.16 141.96 + 172.41 157.61 140.44 + 168.52 155.90 138.37 + 175.85 155.98 138.71 + 176.91 156.43 139.00 + 179.72 153.31 135.95 + 174.82 137.76 120.56 + 162.33 126.97 109.77 + 164.72 128.00 110.61 + 171.51 135.99 118.94 + 171.75 145.50 128.25 + 173.69 153.99 136.16 + 171.70 147.60 129.51 + 172.43 140.50 123.33 + 169.90 140.17 123.03 + 165.24 142.89 125.39 + 169.21 153.33 136.09 + 177.62 160.51 143.28 + 180.94 152.72 135.06 + 181.89 151.01 133.85 + 170.74 138.49 122.24 + 163.72 135.71 124.47 + 164.66 143.85 138.03 + 173.63 153.53 149.93 + 183.22 157.12 153.50 + 184.97 151.97 148.37 + 180.16 144.65 141.04 + 176.35 139.44 135.83 + 178.69 144.90 141.28 + 173.31 146.50 142.90 + 170.92 146.91 143.31 + 163.54 139.40 135.79 + 168.84 142.56 138.94 + 172.47 145.87 142.26 + 176.12 149.94 146.32 + 170.44 142.28 138.67 + 158.31 136.17 132.56 + 155.56 127.48 123.87 + 166.15 133.78 130.18 + 176.06 145.34 141.81 + 187.67 153.03 149.42 + 190.25 158.99 155.38 + 188.31 155.43 151.82 + 185.76 147.81 144.20 + 180.64 140.90 137.29 + 165.02 125.28 121.67 + 149.94 110.20 106.59 + 146.55 107.29 103.59 + 155.72 126.84 123.23 + 165.16 149.46 145.84 + 174.79 158.25 154.64 + 176.37 155.88 152.19 + 169.24 145.41 141.47 + 171.78 151.15 147.16 + 178.34 154.41 150.15 + 174.68 146.41 141.86 + 168.66 136.09 132.07 + 171.38 133.91 130.29 + 174.76 138.34 134.72 + 178.59 142.28 138.67 + 182.62 145.89 142.28 + 177.12 138.87 134.90 + 168.66 134.04 129.43 + 165.91 134.35 130.23 + 162.59 134.31 130.70 + 165.54 142.84 139.24 + 170.88 149.60 145.74 + 169.18 143.61 139.68 + 166.78 139.12 135.33 + 158.85 132.08 128.31 + 153.74 129.79 125.78 + 157.01 135.30 131.53 + 166.00 147.12 143.16 + 179.69 160.15 155.49 + 185.19 159.76 154.69 + 186.95 150.85 145.47 + 186.75 144.62 139.72 + 187.34 143.57 139.54 + 176.12 138.66 134.13 + 170.40 141.53 137.82 + 169.22 145.31 140.82 + 169.71 147.25 139.59 + 174.21 151.29 140.59 + 178.55 152.06 137.19 + 183.05 154.19 139.06 + 180.99 152.46 140.50 + 180.10 153.27 144.94 + 175.18 153.04 147.84 + 174.52 153.26 147.59 + 184.69 157.11 149.93 + 197.85 167.71 159.15 + 201.03 169.91 157.81 + 200.47 166.71 155.81 + 191.15 163.76 154.31 + 178.47 150.51 142.05 + 170.53 140.84 134.98 + 166.60 144.83 137.75 + 170.40 154.69 145.09 + 175.31 164.63 151.47 + 181.17 170.91 156.28 + 181.56 166.23 151.94 + 187.17 168.50 153.92 + 188.66 166.59 152.35 + 185.21 157.58 143.25 + 177.31 152.84 138.31 + 167.37 147.62 134.25 + 170.79 146.35 135.40 + 175.43 152.34 143.13 + 180.26 163.54 153.71 + 180.62 163.39 150.78 + 170.03 154.04 140.53 + 160.39 145.81 132.81 + 154.74 147.56 135.71 + 158.60 153.24 142.81 + 160.34 151.01 138.03 + 161.78 148.56 131.90 + 159.24 147.37 130.17 + 158.71 149.82 130.71 + 161.25 156.87 135.88 + 161.43 160.23 139.70 + 158.93 155.21 135.90 + 155.82 149.40 131.04 + 154.09 141.83 122.38 + 156.47 141.07 120.01 + 157.18 142.37 121.65 + 154.10 143.99 122.92 + 150.58 144.72 123.91 + 148.21 145.23 124.42 + 146.56 140.62 119.56 + 152.78 146.62 125.58 + 157.47 148.44 127.70 + 155.89 145.87 125.78 + 151.10 143.21 127.22 + 148.32 143.52 127.94 + 145.13 142.41 123.78 + 142.94 142.34 121.24 +col_means: | + 142.75 142.75 127.53 + 144.49 144.49 128.27 + 144.56 144.56 128.54 + 146.72 143.42 128.56 + 152.30 142.94 131.37 + 155.57 144.82 133.18 + 159.41 150.40 138.40 + 159.99 151.55 137.60 + 160.84 147.93 133.13 + 164.47 150.10 135.22 + 166.06 147.50 132.43 + 163.37 143.20 127.56 + 162.47 143.62 127.09 + 164.10 148.19 131.94 + 163.52 147.59 131.90 + 161.41 153.01 137.90 + 164.49 155.47 141.01 + 166.24 153.86 140.92 + 170.41 152.81 141.53 + 172.03 151.15 139.34 + 173.35 147.46 135.96 + 172.94 147.62 135.57 + 174.42 147.72 135.00 + 180.10 150.26 137.37 + 188.38 156.41 141.81 + 187.96 156.06 143.57 + 181.43 150.68 137.97 + 173.99 148.59 136.08 + 171.62 152.89 140.67 + 180.34 159.96 148.31 + 183.13 161.76 150.19 + 181.12 162.85 151.21 + 174.20 158.96 147.79 + 168.97 151.04 139.22 + 168.84 149.19 137.55 + 169.42 146.84 134.68 + 172.28 148.35 136.00 + 180.84 159.34 148.07 + 185.76 160.93 149.12 + 182.82 157.75 146.25 + 173.55 151.88 140.61 + 168.00 148.53 136.88 + 166.65 144.56 133.03 + 171.22 150.92 138.94 + 173.99 157.69 146.41 + 173.69 152.40 140.58 + 173.53 142.84 131.34 + 174.78 139.09 127.56 + 171.12 134.59 122.94 + 167.75 137.31 125.57 + 168.78 152.76 140.62 + 170.04 156.92 145.53 + 173.48 156.49 145.59 + 175.76 157.51 148.16 + 173.16 149.27 141.12 + 168.04 137.47 129.59 + 163.00 135.03 127.72 + 160.16 134.03 126.23 + 160.30 137.06 130.06 + 165.87 140.32 133.50 + 175.69 148.69 141.76 + 180.26 153.01 148.46 + 180.11 151.04 147.16 + 178.38 148.08 144.75 + 178.99 153.94 150.00 + 176.56 148.76 143.47 + 178.85 144.89 137.09 + 173.20 146.43 138.83 + 173.62 149.93 143.45 + 175.62 146.37 139.94 + 177.94 153.72 148.16 + 177.71 153.00 145.09 + 180.31 156.54 148.28 + 178.59 157.21 149.25 + 176.24 153.53 146.45 + 167.78 140.32 136.13 + 158.78 126.14 122.22 + 156.04 124.39 121.03 + 160.39 138.43 134.62 + 164.68 143.58 140.18 + 165.99 145.59 142.34 + 171.93 156.14 152.55 + 180.51 164.23 160.91 + 180.54 161.09 157.62 + 181.41 150.92 147.54 + 181.98 146.21 142.69 + 179.46 141.69 138.13 + 176.13 137.37 134.09 + 170.83 132.24 128.63 + 163.52 127.91 124.58 + 157.54 128.27 124.61 + 159.69 135.48 131.88 + 165.94 149.06 145.49 + 164.70 153.47 149.90 + 168.12 152.37 149.09 + 172.84 147.75 144.13 + 172.05 141.47 138.12 + 169.31 137.91 134.41 + 162.56 131.21 127.81 + 168.44 139.29 135.74 + 176.81 149.32 145.74 + 183.02 151.57 148.26 + 179.82 144.34 141.03 + 174.10 145.09 141.73 + 168.02 149.44 144.84 + 162.41 150.43 145.39 + 161.12 143.59 138.72 + 163.48 138.91 133.56 + 166.69 134.25 129.01 + 176.43 141.46 135.69 + 180.85 148.51 142.99 + 179.30 152.06 148.59 + 172.69 145.84 142.70 + 177.16 147.47 144.29 + 188.42 151.14 147.54 + 195.76 155.81 152.47 + 200.19 159.82 156.34 + 194.69 156.69 153.31 + 188.73 145.58 142.04 + 173.99 135.22 131.65 + 158.09 126.60 123.31 + 150.79 122.89 119.28 + 149.98 126.75 123.40 + 152.39 130.44 126.94 + 163.99 143.47 140.07 + 172.28 149.94 146.32 + 223.97 206.12 63.13 + 226.44 211.22 69.74 + 214.01 200.12 62.59 + 172.32 132.15 125.73 + 174.79 138.18 131.63 + 172.44 137.00 130.06 + 176.87 145.51 138.80 + 184.82 154.98 148.88 + 185.03 159.08 153.25 + 177.56 152.31 146.12 + 169.42 147.44 141.25 + 168.69 141.84 134.96 + 170.40 149.54 141.47 + 176.56 155.90 147.63 + 179.48 155.72 147.51 + 181.01 158.81 150.88 + 173.53 152.24 143.92 + 170.07 149.75 141.65 + 176.04 155.94 146.60 + 175.25 152.16 142.00 + 173.38 146.85 135.67 + 170.79 142.65 130.34 + 174.95 141.01 128.19 + 180.30 143.88 130.91 + 180.10 149.85 137.06 + 175.65 152.52 139.47 + 175.04 154.29 141.96 + 181.31 160.78 147.84 + 181.97 159.72 146.41 + 182.29 153.34 139.82 + 181.00 146.68 132.89 + 174.65 148.94 135.75 + 177.15 160.12 147.02 + 178.39 164.47 151.85 + 175.71 159.64 148.16 + 167.48 147.01 136.12 + 162.81 135.66 125.55 + 169.44 138.26 125.03 + 173.50 143.75 130.43 + 180.22 153.99 140.16 + 182.47 157.02 143.22 + 179.09 153.75 140.46 + 176.99 152.91 139.22 + 176.93 154.63 141.81 + 180.57 159.23 146.47 + 176.24 155.25 142.46 + 171.25 150.22 137.26 + 171.25 148.98 135.89 + 170.58 149.32 136.50 + 173.50 146.68 133.93 + 169.25 145.03 132.24 + 161.51 143.18 129.59 + 163.74 150.68 137.74 + 166.16 156.63 143.70 + 168.84 158.53 145.47 + 169.41 158.35 145.47 + 167.83 155.91 143.74 + 168.80 150.85 138.07 + 164.95 150.25 137.25 + 161.99 150.81 137.82 + 163.19 147.90 132.27 + 164.97 145.99 129.59 + 162.81 143.29 126.91 + 160.27 146.81 130.52 + 158.60 148.31 133.40 + 155.25 145.38 131.25 + 149.91 142.21 129.10 + 147.54 143.99 129.19 + 145.09 142.35 125.97 + 143.77 140.46 124.39 + 145.75 140.26 123.61 + 145.64 139.54 123.95 + 142.81 137.37 121.97 + 139.76 136.59 121.47 +sample_blocks: | + 2 2 128.00 128.00 128.00 + 2 18 128.00 128.00 128.00 + 2 34 128.00 128.00 128.00 + 2 50 237.67 237.67 16.56 + 2 66 128.00 128.00 128.00 + 2 82 187.78 187.78 187.78 + 2 98 155.33 155.33 155.33 + 2 114 251.78 96.33 96.33 + 2 130 151.67 151.67 98.00 + 2 146 159.67 159.67 100.44 + 2 162 128.00 128.00 128.00 + 2 178 128.00 128.00 128.00 + 2 194 128.00 128.00 128.00 + 18 2 128.00 128.00 128.00 + 18 18 128.00 128.00 128.00 + 18 34 186.89 186.89 54.11 + 18 50 128.00 128.00 128.00 + 18 66 128.22 128.22 128.22 + 18 82 211.22 98.00 98.00 + 18 98 197.44 159.56 159.56 + 18 114 219.56 100.78 100.78 + 18 130 243.56 167.89 167.89 + 18 146 144.78 144.78 144.78 + 18 162 128.00 128.00 128.00 + 18 178 253.00 204.22 204.22 + 18 194 244.22 244.22 33.00 + 34 2 128.00 128.00 128.00 + 34 18 206.89 206.89 200.89 + 34 34 128.00 128.00 128.00 + 34 50 204.78 148.67 148.67 + 34 66 120.89 120.89 120.89 + 34 82 164.89 164.89 164.89 + 34 98 128.00 128.00 128.00 + 34 114 229.78 112.00 112.00 + 34 130 234.67 234.67 234.67 + 34 146 137.56 119.56 119.56 + 34 162 134.33 126.44 126.44 + 34 178 247.22 247.22 247.22 + 34 194 128.00 128.00 128.00 + 50 2 221.33 221.33 47.00 + 50 18 130.56 130.56 130.56 + 50 34 240.56 100.89 100.89 + 50 50 195.44 195.44 195.44 + 50 66 247.11 171.33 171.33 + 50 82 221.89 142.78 142.78 + 50 98 101.22 101.22 101.22 + 50 114 248.33 102.44 102.44 + 50 130 174.22 158.44 158.44 + 50 146 72.44 56.11 56.11 + 50 162 229.33 226.22 226.22 + 50 178 128.00 128.00 128.00 + 50 194 128.00 128.00 128.00 + 66 2 128.44 128.44 128.44 + 66 18 221.44 221.44 221.44 + 66 34 95.44 67.00 67.00 + 66 50 202.78 202.78 186.33 + 66 66 148.22 145.33 50.11 + 66 82 212.67 124.89 124.89 + 66 98 230.89 168.11 168.11 + 66 114 224.11 155.56 155.56 + 66 130 221.78 221.78 221.78 + 66 146 164.33 160.78 120.11 + 66 162 130.33 130.33 130.33 + 66 178 147.11 140.33 140.33 + 66 194 144.78 144.78 144.78 + 82 2 128.00 128.00 128.00 + 82 18 180.78 117.11 117.11 + 82 34 133.22 133.22 133.22 + 82 50 178.11 127.33 127.33 + 82 66 161.67 147.00 147.00 + 82 82 222.56 217.67 217.67 + 82 98 101.22 101.22 101.22 + 82 114 239.44 238.11 38.11 + 82 130 213.56 213.56 30.78 + 82 146 112.78 105.89 105.89 + 82 162 132.00 132.00 132.00 + 82 178 131.44 131.44 131.44 + 82 194 128.00 128.00 128.00 + 98 2 128.00 128.00 128.00 + 98 18 127.44 119.78 119.78 + 98 34 208.44 151.89 151.89 + 98 50 137.00 80.00 80.00 + 98 66 240.89 210.11 210.11 + 98 82 225.78 129.78 129.78 + 98 98 165.56 165.56 165.56 + 98 114 213.78 211.00 211.00 + 98 130 129.33 53.00 53.00 + 98 146 244.33 244.33 244.33 + 98 162 232.78 223.00 223.00 + 98 178 153.22 116.11 116.11 + 98 194 131.67 131.67 131.67 + 114 2 128.00 128.00 128.00 + 114 18 184.44 165.89 165.89 + 114 34 136.44 120.89 120.89 + 114 50 251.78 251.78 251.78 + 114 66 95.78 95.78 95.78 + 114 82 237.78 235.56 235.56 + 114 98 74.33 54.89 54.89 + 114 114 175.56 155.78 155.78 + 114 130 96.33 88.56 88.56 + 114 146 180.56 88.22 88.22 + 114 162 174.44 137.56 137.56 + 114 178 140.56 140.56 140.56 + 114 194 128.00 128.00 128.00 + 130 2 128.00 128.00 128.00 + 130 18 169.89 169.89 169.89 + 130 34 155.56 155.56 155.56 + 130 50 191.56 191.56 185.44 + 130 66 107.89 102.33 102.33 + 130 82 102.78 102.78 102.78 + 130 98 242.89 242.89 242.89 + 130 114 230.33 194.22 194.22 + 130 130 101.67 63.89 57.00 + 130 146 94.89 71.78 71.78 + 130 162 95.67 42.56 42.56 + 130 178 128.00 128.00 128.00 + 130 194 128.00 128.00 128.00 + 146 2 137.00 137.00 137.00 + 146 18 222.00 100.56 100.56 + 146 34 186.00 186.00 178.44 + 146 50 119.22 54.89 54.89 + 146 66 249.22 218.11 218.11 + 146 82 135.00 135.00 135.00 + 146 98 213.22 209.56 209.56 + 146 114 119.89 72.33 72.33 + 146 130 175.78 117.11 117.11 + 146 146 94.33 91.22 91.22 + 146 162 238.56 86.67 86.67 + 146 178 179.22 90.11 90.11 + 146 194 166.67 166.67 96.22 + 162 2 128.00 128.00 128.00 + 162 18 237.11 167.56 135.67 + 162 34 163.33 158.33 158.33 + 162 50 128.00 128.00 128.00 + 162 66 203.00 72.89 72.89 + 162 82 156.56 156.56 156.56 + 162 98 129.00 129.00 129.00 + 162 114 125.78 125.78 125.78 + 162 130 132.11 132.11 132.11 + 162 146 107.56 99.22 99.22 + 162 162 233.11 179.78 179.78 + 162 178 128.00 128.00 128.00 + 162 194 128.00 128.00 128.00 + 178 2 204.00 204.00 68.78 + 178 18 128.00 128.00 128.00 + 178 34 158.78 158.78 158.78 + 178 50 128.00 128.00 128.00 + 178 66 225.11 81.11 81.11 + 178 82 143.33 143.33 143.33 + 178 98 128.00 128.00 128.00 + 178 114 233.89 170.78 170.78 + 178 130 155.22 95.22 95.22 + 178 146 234.00 224.56 224.56 + 178 162 128.00 128.00 128.00 + 178 178 128.00 128.00 128.00 + 178 194 128.00 128.00 128.00 + 194 2 128.00 128.00 128.00 + 194 18 128.00 128.00 128.00 + 194 34 128.00 128.00 128.00 + 194 50 210.78 210.78 51.22 + 194 66 159.78 159.78 159.78 + 194 82 127.44 127.44 127.44 + 194 98 128.00 128.00 128.00 + 194 114 222.56 222.56 222.56 + 194 130 224.44 174.89 174.89 + 194 146 128.00 128.00 128.00 + 194 162 128.00 128.00 128.00 + 194 178 128.00 128.00 128.00 + 194 194 128.00 128.00 128.00 +... From 76835e3b59f7a913b8c2783b836e6a7b2b2c4363 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 24 Jul 2026 15:22:08 -0400 Subject: [PATCH 055/100] add outline keyword to dump image for edges at depth jumps Draw outlines where the distance from the viewer jumps between adjacent pixels, i.e. along the visible edges of objects in front of the background or in front of more distant objects. The outline hugs the nearer object and its width in final image pixels is selectable together with its color. Combined with reduced shininess and increased ambient light this produces a flat, illustration-like appearance similar to hand-drawn molecular graphics. Applied to the composited image on the output rank; images are independent of the number of MPI ranks. --- doc/src/dump_image.rst | 18 +- src/GRAPHICS/dump_image.cpp | 12 + src/GRAPHICS/image.cpp | 107 ++++ src/GRAPHICS/image.h | 4 + .../graphics/tests/dump-image-outline.yaml | 603 ++++++++++++++++++ 5 files changed, 743 insertions(+), 1 deletion(-) create mode 100644 unittest/graphics/tests/dump-image-outline.yaml diff --git a/doc/src/dump_image.rst b/doc/src/dump_image.rst index aa76dcd9f0d..37ee03ffe1a 100644 --- a/doc/src/dump_image.rst +++ b/doc/src/dump_image.rst @@ -24,7 +24,7 @@ Syntax * color = atom attribute that determines color of each atom * diameter = atom attribute that determines size of each atom * zero or more keyword/value pairs may be appended -* keyword = *atom* or *adiam* or *autobond* or *bond* or *grid* or *line* or *tri* or *ellipsoid* or *body* or *compute* or *fix* or *size* or *view* or *center* or *up* or *zoom* or *box* or *axes* or *region* or *subbox* or *shiny* or *fsaa* or *ssao* or *depthcue* +* keyword = *atom* or *adiam* or *autobond* or *bond* or *grid* or *line* or *tri* or *ellipsoid* or *body* or *compute* or *fix* or *size* or *view* or *center* or *up* or *zoom* or *box* or *axes* or *region* or *subbox* or *shiny* or *fsaa* or *ssao* or *depthcue* or *outline* .. parsed-literal:: @@ -120,6 +120,10 @@ Syntax cfactor = strength of fading from 0.0 to 1.0 color = fog color name or *auto* = fade toward the background color start = box fraction along the view direction where fading starts, or *auto* = nearest rendered object + *outline* values = flag width color = outlines at depth jumps + flag = *yes* or *no* = turn outline drawing on/off + width = width of the outlines in pixels (from 1 to 16) + color = color name of the outlines .. _dump_modify_image: @@ -917,6 +921,17 @@ large depth range. The fading always ends at the most distant rendered object. Unlike the *ssao* keyword, depth cueing adds no significant computational cost, and both can be combined. +.. versionadded:: TBD + +The *outline* keyword turns on/off drawing outlines where the distance +from the viewer jumps, i.e. along the visible edges of atoms and other +objects in front of the background or in front of more distant objects. +This produces a flat, illustration-like appearance similar to +hand-drawn molecular graphics, especially when combined with reduced +shininess or increased ambient lighting. The *width* value sets the +width of the outlines in pixels of the final image; the *color* value +sets their color, e.g. black. + ---------- Dump_modify keywords for dump image and dump movie @@ -1492,6 +1507,7 @@ The defaults for the dump image and dump movie keywords are as follows: * ssao = no * fsaa = no * depthcue = no +* outline = no ---------- diff --git a/src/GRAPHICS/dump_image.cpp b/src/GRAPHICS/dump_image.cpp index 51b1b6b3e15..5b293cc4cd5 100644 --- a/src/GRAPHICS/dump_image.cpp +++ b/src/GRAPHICS/dump_image.cpp @@ -650,6 +650,18 @@ DumpImage::DumpImage(LAMMPS *lmp, int narg, char **arg) : } iarg += 5; + } else if (strcmp(arg[iarg],"outline") == 0) { + if (iarg+4 > narg) utils::missing_cmd_args(FLERR,"dump image outline", error); + image->outline = utils::logical(FLERR,arg[iarg+1],false,lmp); + int owidth = utils::inumeric(FLERR,arg[iarg+2],false,lmp); + if (owidth < 1 || owidth > 16) + error->all(FLERR, iarg+2, "Invalid dump image outline width {}", owidth); + image->outlinewidth = owidth; + image->outlinecolor = image->color2rgb(arg[iarg+3]); + if (image->outlinecolor == nullptr) + error->all(FLERR, iarg+3, "Invalid dump image outline color {}", arg[iarg+3]); + iarg += 4; + } else error->all(FLERR, iarg, "Unknown dump image keyword {}", arg[iarg]); } diff --git a/src/GRAPHICS/image.cpp b/src/GRAPHICS/image.cpp index 22dd9fa561f..6d09589efb4 100644 --- a/src/GRAPHICS/image.cpp +++ b/src/GRAPHICS/image.cpp @@ -369,6 +369,9 @@ Image::Image(LAMMPS *lmp, int nmap_caller) : depthcuecolor = nullptr; depthcuestartflag = 0; depthcuestart = 0.0; + outline = NO; + outlinewidth = 0; + outlinecolor = nullptr; for (auto &b : boxbounds) b = 0.0; up[0] = 0.0; @@ -924,6 +927,10 @@ void Image::merge() if (ssao && fastssao && (me == 0)) compute_SSAO_fast(); + // draw outlines at depth discontinuities + + if (outline && (me == 0)) compute_outline(); + // apply depth cueing to the final composited image if (depthcue && (me == 0)) compute_depthcue(); @@ -2056,6 +2063,106 @@ void Image::compute_SSAO_fast() delete[] blur; } +/* ---------------------------------------------------------------------- + draw outlines on the composited image on the output rank: color + drawn pixels that have a significantly more distant pixel or the + background within the outline width. the outline hugs the nearer + object at depth discontinuities, which gives the flat illustration + look known from hand-drawn molecular graphics. +------------------------------------------------------------------------- */ + +void Image::compute_outline() +{ + // only depth jumps between immediately adjacent pixels that are larger + // than a small fraction of the box size count as edges. the smooth but + // steep depth changes where a curved surface turns away from the viewer + // must not be outlined, so the threshold is of the order of typical + // particle sizes and the comparison spans only one pixel + + const double delx = 2.0 * (boxbounds[1] - boxbounds[0]); + const double dely = 2.0 * (boxbounds[3] - boxbounds[2]); + const double delz = 2.0 * (boxbounds[5] - boxbounds[4]); + double maxdel = MAX(delx,dely); + maxdel = MAX(maxdel,delz); + const double threshold = 0.02 * maxdel; + + // the outline width follows the internal image size with FSAA + + int w = outlinewidth; + if (fsaa) w *= 2; + + const unsigned char red = static_cast(outlinecolor[0] * 255.0); + const unsigned char green = static_cast(outlinecolor[1] * 255.0); + const unsigned char blue = static_cast(outlinecolor[2] * 255.0); + + // mark drawn pixels that have a much more distant immediate neighbor + // or border on the background + + auto *edges = new unsigned char[npixels]; + memset(edges,0,npixels); + +#if defined(_OPENMP) +#pragma omp parallel for schedule(static) +#endif + for (int iy = 0; iy < height; ++iy) { + for (int ix = 0; ix < width; ++ix) { + const double d = depthBuffer[iy*width + ix]; + if (d < 0.0) continue; + + constexpr int xoff[4] = {-1, 1, 0, 0}; + constexpr int yoff[4] = {0, 0, -1, 1}; + for (int k = 0; k < 4; ++k) { + const int jx = ix + xoff[k]; + const int jy = iy + yoff[k]; + if (jx < 0 || jx >= width || jy < 0 || jy >= height) continue; + const double dj = depthBuffer[jy*width + jx]; + if (dj < 0.0 || (dj - d) > threshold) { + edges[iy*width + ix] = 1; + break; + } + } + } + } + + // widen the outline: color drawn pixels near an edge pixel, but only + // on the near side of the depth jump so the outline hugs the nearer + // object and does not bleed onto more distant objects + +#if defined(_OPENMP) +#pragma omp parallel for schedule(static) +#endif + for (int iy = 0; iy < height; ++iy) { + for (int ix = 0; ix < width; ++ix) { + const double d = depthBuffer[iy*width + ix]; + if (d < 0.0) continue; + + bool paint = false; + for (int dy = -w+1; dy < w && !paint; ++dy) { + const int jy = iy + dy; + if (jy < 0 || jy >= height) continue; + for (int dx = -w+1; dx < w; ++dx) { + const int jx = ix + dx; + if (jx < 0 || jx >= width) continue; + if (!edges[jy*width + jx]) continue; + if ((d - depthBuffer[jy*width + jx]) < threshold) { + paint = true; + break; + } + } + } + + if (paint) { + const int i = iy*width + ix; + writeBuffer[i*3+0] = red; + writeBuffer[i*3+1] = green; + writeBuffer[i*3+2] = blue; + } + } + } + + delete[] edges; +} + /* ---------------------------------------------------------------------- apply depth cueing to the composited image on the output rank: fade drawn pixels toward the fog color with increasing distance from diff --git a/src/GRAPHICS/image.h b/src/GRAPHICS/image.h index 14a50eead2d..42a88d8b7d0 100644 --- a/src/GRAPHICS/image.h +++ b/src/GRAPHICS/image.h @@ -45,6 +45,9 @@ class Image : protected Pointers { double *depthcuecolor; // fog color; fade toward background color if null int depthcuestartflag; // 1 if fading starts at a box fraction, 0 at nearest object double depthcuestart; // start of fading as box fraction along the view direction + int outline; // outline drawing on or off + int outlinewidth; // width of outlines in pixels + double *outlinecolor; // color of the outlines double *boxcolor; // color to draw box outline with int background[3]; // RGB values of background int background2[3]; // RGB values of second background color for gradient (off if < 0.0) @@ -151,6 +154,7 @@ class Image : protected Pointers { void setup_lights(); void compute_SSAO(); void compute_SSAO_fast(); + void compute_outline(); void compute_depthcue(); // inline functions diff --git a/unittest/graphics/tests/dump-image-outline.yaml b/unittest/graphics/tests/dump-image-outline.yaml new file mode 100644 index 00000000000..eb2b5eb5fbb --- /dev/null +++ b/unittest/graphics/tests/dump-image-outline.yaml @@ -0,0 +1,603 @@ +--- +lammps_version: 4 Jul 2026 +tags: graphics +date_generated: Fri Jul 24 15:21:42 2026 +epsilon_projection: 0.5 +epsilon_blocks: 2 +nprocs: 1 +prerequisites: | + atom full + pair lj/charmm/coul/charmm + bond harmonic + angle charmm + dihedral charmm + improper harmonic +setup_commands: | + units real + atom_style full + pair_style lj/charmm/coul/charmm 8.0 10.0 + bond_style harmonic + angle_style charmm + dihedral_style charmm + improper_style harmonic + read_data ${input_dir}/data.peptide + neighbor 2.0 bin + dump viz all image 1 ${imagefile} type type size 200 200 zoom 1.5 view 60 30 shiny 0.2 box yes 0.02 bond atom 0.3 outline yes 1 black + dump_modify viz backcolor gray +run_commands: | + run 0 +image_size: 200 200 +sampling: 3 16 +row_means: | + 111.91 118.92 113.09 + 107.23 111.59 113.43 + 107.72 111.36 114.68 + 110.61 114.82 115.25 + 109.44 112.34 110.31 + 110.48 114.46 110.12 + 113.48 116.92 111.58 + 117.64 121.09 115.47 + 116.69 118.83 113.67 + 113.82 114.58 110.11 + 112.90 118.83 113.53 + 114.28 119.31 115.09 + 102.11 105.70 101.81 + 93.56 102.25 99.94 + 85.43 104.72 105.60 + 83.02 103.89 104.11 + 80.72 92.53 89.59 + 79.45 85.44 84.37 + 86.61 93.90 97.81 + 86.18 95.77 101.05 + 75.97 90.86 101.19 + 73.74 95.01 105.87 + 69.09 92.98 100.76 + 69.79 90.34 97.36 + 69.75 88.58 90.96 + 73.72 94.55 95.67 + 80.49 97.45 102.79 + 75.08 91.78 97.35 + 64.24 80.57 87.42 + 65.49 84.70 99.20 + 60.44 75.75 87.92 + 60.94 78.41 86.58 + 65.69 89.93 92.57 + 68.12 93.57 97.21 + 63.29 86.57 90.94 + 64.29 83.22 88.55 + 69.52 86.90 90.96 + 66.88 84.43 90.86 + 60.70 86.29 88.82 + 58.02 81.39 86.56 + 55.34 78.72 86.16 + 56.19 78.03 84.78 + 48.98 72.75 80.39 + 54.92 78.56 85.91 + 50.88 67.64 72.25 + 53.05 75.45 75.47 + 51.23 77.22 86.20 + 43.72 71.08 86.77 + 39.55 66.05 81.52 + 43.20 70.46 84.31 + 50.04 74.76 83.19 + 56.85 82.97 92.36 + 45.98 71.79 78.22 + 42.92 69.77 76.25 + 51.67 69.97 73.13 + 56.66 83.30 80.79 + 59.41 84.67 85.27 + 63.73 92.11 93.31 + 62.63 81.66 86.04 + 59.40 74.94 77.00 + 52.59 70.00 79.36 + 48.03 64.84 75.77 + 51.27 71.39 78.23 + 52.78 83.53 87.48 + 51.48 86.89 83.22 + 46.72 78.72 79.97 + 53.94 73.54 73.04 + 57.51 81.70 86.91 + 53.35 80.06 87.94 + 56.88 79.05 85.17 + 51.76 67.79 75.50 + 49.66 63.85 75.65 + 48.49 60.72 76.52 + 43.27 64.28 77.12 + 41.14 69.98 77.36 + 42.95 77.12 83.05 + 43.21 74.30 88.08 + 43.27 65.75 81.55 + 47.48 65.45 78.91 + 54.20 75.74 77.88 + 55.94 85.28 85.88 + 52.04 84.56 90.94 + 45.51 71.49 81.06 + 47.87 71.36 83.69 + 50.32 70.25 80.52 + 54.13 79.01 84.69 + 49.74 76.05 83.47 + 50.43 83.72 92.17 + 33.42 64.53 75.62 + 33.27 68.56 86.87 + 31.52 61.83 79.11 + 34.44 63.56 83.74 + 32.40 63.34 81.94 + 38.29 71.08 82.19 + 40.01 70.22 82.60 + 37.80 65.31 77.66 + 40.16 66.08 81.72 + 48.70 79.30 96.46 + 50.20 77.72 91.30 + 47.73 67.80 79.14 + 53.73 76.36 91.53 + 51.77 70.05 85.87 + 46.17 65.65 85.10 + 38.23 70.84 84.31 + 37.66 80.68 96.94 + 28.43 67.19 81.56 + 29.88 60.22 75.88 + 32.92 58.83 78.89 + 33.34 59.02 82.16 + 40.02 60.93 89.34 + 42.35 56.77 76.50 + 43.01 56.13 75.01 + 39.66 72.83 80.04 + 41.17 84.70 90.44 + 36.41 73.94 78.28 + 34.09 62.63 72.67 + 40.34 68.69 82.13 + 44.18 70.61 78.22 + 46.31 74.92 78.57 + 44.38 68.09 84.19 + 49.05 67.66 85.41 + 48.27 70.55 86.42 + 38.46 65.14 79.22 + 35.76 72.36 92.97 + 31.16 65.53 82.06 + 36.12 69.41 87.39 + 33.92 62.44 76.61 + 32.85 61.49 73.02 + 33.44 66.22 75.06 + 40.03 77.45 88.45 + 44.25 74.92 88.14 + 43.66 74.28 81.86 + 45.52 78.17 89.36 + 49.16 75.92 90.64 + 56.66 75.39 89.72 + 46.62 65.94 73.73 + 47.81 81.39 86.73 + 51.12 85.91 91.56 + 43.91 74.92 86.30 + 40.16 61.55 73.63 + 48.45 72.66 92.26 + 38.16 66.12 84.12 + 37.16 68.42 82.97 + 35.45 63.95 73.06 + 43.60 72.86 83.11 + 46.08 71.39 78.27 + 53.17 76.67 83.74 + 51.10 66.08 74.34 + 53.15 81.03 91.38 + 55.33 80.72 88.42 + 54.91 80.04 92.32 + 57.40 84.98 90.63 + 55.81 84.63 93.90 + 48.23 73.56 84.07 + 43.83 70.40 84.66 + 42.56 74.53 83.04 + 43.23 77.30 88.11 + 48.97 73.28 82.39 + 58.73 76.28 87.90 + 63.16 78.00 87.72 + 68.91 87.33 92.59 + 72.95 91.78 97.06 + 72.72 93.81 95.24 + 66.72 89.45 89.39 + 66.03 84.01 88.90 + 65.31 86.19 97.03 + 66.63 92.11 99.53 + 67.84 90.19 94.30 + 72.00 85.81 89.36 + 73.85 84.55 88.36 + 77.23 90.46 96.80 + 72.05 91.37 95.34 + 71.56 100.15 106.10 + 72.50 95.69 102.04 + 76.96 91.12 92.47 + 86.89 92.64 91.19 + 97.25 106.00 105.22 + 97.34 111.78 110.13 + 94.54 106.77 106.19 + 98.45 107.12 107.62 + 95.47 101.67 98.94 + 96.44 105.40 100.61 + 95.94 109.47 103.48 + 96.04 108.20 102.92 + 100.57 109.27 104.47 + 101.30 108.41 106.80 + 106.48 109.72 108.69 + 105.00 107.47 107.08 + 102.04 107.38 104.67 + 105.21 111.49 108.88 + 108.30 113.22 108.80 + 108.66 111.09 106.28 + 109.30 110.56 106.55 + 107.67 112.78 108.53 + 104.39 112.02 109.44 + 103.78 109.50 108.52 + 108.53 116.40 115.38 + 109.06 115.36 114.06 + 112.66 116.00 110.89 + 121.54 122.64 114.22 +col_means: | + 120.29 123.38 117.48 + 116.28 121.14 116.08 + 116.83 121.22 115.97 + 113.31 115.78 111.44 + 107.38 111.50 109.74 + 104.32 111.83 115.28 + 100.36 110.96 112.73 + 99.03 112.43 109.42 + 96.57 107.21 107.34 + 94.78 103.38 105.11 + 90.78 103.41 106.22 + 91.06 100.94 104.09 + 91.28 98.12 102.73 + 90.93 96.43 98.67 + 90.54 99.99 101.30 + 91.42 101.50 100.83 + 90.26 102.11 100.42 + 86.94 100.28 98.52 + 83.55 95.62 100.30 + 81.03 91.44 99.75 + 80.22 95.29 100.86 + 82.01 97.13 102.83 + 80.00 91.08 99.09 + 74.52 87.75 96.61 + 65.59 79.17 91.26 + 63.24 88.59 99.89 + 65.01 86.67 94.54 + 69.14 84.83 91.31 + 76.11 86.88 87.52 + 72.36 87.48 89.81 + 72.06 94.97 101.60 + 70.73 94.30 100.84 + 67.08 90.18 91.92 + 70.14 89.58 90.84 + 76.46 89.38 94.83 + 66.97 76.48 81.70 + 70.01 85.12 93.94 + 69.12 89.48 96.72 + 64.98 93.44 99.60 + 62.24 88.53 95.94 + 66.28 83.86 90.17 + 68.86 84.41 90.62 + 66.90 89.57 95.74 + 61.06 87.22 91.06 + 55.33 84.61 87.17 + 56.20 89.64 95.11 + 55.65 81.97 91.53 + 54.64 70.53 85.56 + 55.01 69.56 85.70 + 56.45 78.50 90.11 + 60.80 86.43 91.59 + 60.11 86.47 88.50 + 59.37 83.86 89.64 + 59.30 80.91 91.73 + 58.83 83.34 95.79 + 59.16 74.72 87.23 + 61.23 75.51 88.58 + 59.35 77.91 88.30 + 61.72 87.86 94.08 + 49.37 69.39 74.27 + 55.38 74.22 85.67 + 51.62 74.22 87.68 + 46.09 79.48 96.08 + 37.96 71.02 80.62 + 36.46 69.48 81.56 + 37.59 71.17 87.77 + 38.40 68.71 80.40 + 40.17 69.28 76.89 + 51.21 80.58 89.14 + 47.44 71.66 80.95 + 49.86 75.48 85.94 + 42.89 73.33 82.15 + 33.34 70.92 79.42 + 40.31 81.73 87.94 + 35.97 73.81 82.92 + 44.45 77.52 89.57 + 44.08 64.84 79.00 + 40.23 62.77 77.40 + 40.05 72.25 84.95 + 38.87 76.18 87.02 + 39.34 77.01 85.43 + 34.99 71.12 75.83 + 41.51 77.06 85.66 + 41.86 78.22 87.56 + 43.23 75.43 88.95 + 44.62 64.92 80.42 + 42.85 65.23 78.79 + 46.61 69.64 89.92 + 49.58 72.36 90.80 + 47.88 66.03 80.67 + 51.62 66.14 79.28 + 55.92 74.69 84.69 + 56.77 83.69 85.20 + 54.59 87.14 88.23 + 51.53 76.83 74.70 + 53.91 85.48 87.05 + 56.54 80.09 89.24 + 48.88 67.22 82.30 + 54.40 66.94 80.14 + 51.11 73.61 80.31 + 39.77 73.33 79.73 + 37.14 68.30 82.22 + 36.81 66.78 82.66 + 35.94 62.63 75.44 + 35.47 66.11 70.35 + 46.37 77.17 82.86 + 43.73 70.33 79.75 + 44.95 69.24 80.07 + 47.98 71.10 80.95 + 49.45 69.82 79.11 + 42.09 67.69 79.04 + 37.38 67.34 79.28 + 34.03 68.72 86.69 + 36.27 67.00 79.73 + 31.64 61.68 77.42 + 33.12 64.36 82.41 + 39.13 72.32 89.94 + 38.25 66.32 81.67 + 37.25 62.33 75.81 + 43.85 61.44 74.95 + 52.80 72.22 87.08 + 52.79 68.08 83.12 + 53.50 71.86 82.70 + 51.26 74.97 88.19 + 45.16 68.27 79.45 + 44.76 73.98 81.85 + 23.82 32.66 37.27 + 125.53 119.67 45.52 + 22.89 31.31 35.23 + 44.34 68.34 83.30 + 48.88 68.80 87.23 + 44.43 64.98 85.67 + 43.79 70.61 84.52 + 40.44 77.42 88.12 + 45.25 77.29 84.21 + 52.97 75.89 86.92 + 52.52 72.15 80.23 + 55.15 75.45 86.98 + 50.43 74.89 79.87 + 49.52 82.95 91.04 + 44.45 76.05 83.75 + 41.77 69.27 76.81 + 44.69 76.78 83.53 + 45.05 76.08 87.34 + 41.73 72.81 81.05 + 39.90 75.55 80.51 + 42.62 75.19 85.69 + 42.90 74.02 85.19 + 42.25 73.85 86.25 + 43.63 68.68 89.41 + 47.21 73.19 87.50 + 50.39 76.41 81.18 + 52.28 88.03 92.31 + 53.06 78.26 81.50 + 54.81 77.68 85.90 + 51.38 77.73 85.42 + 50.53 78.56 90.64 + 51.92 74.39 81.38 + 55.51 79.47 82.52 + 60.84 89.38 90.83 + 59.51 90.14 92.59 + 63.41 87.39 93.83 + 59.97 76.73 86.27 + 65.46 83.12 94.20 + 58.52 79.84 86.79 + 63.15 87.81 95.03 + 63.60 85.14 93.61 + 62.93 82.00 86.63 + 64.75 80.05 81.92 + 73.39 88.51 93.39 + 70.72 90.94 96.33 + 70.60 91.11 98.67 + 73.18 87.66 93.61 + 76.58 88.75 91.09 + 85.88 99.17 104.19 + 82.45 94.58 100.98 + 81.41 92.62 102.23 + 87.31 92.56 97.38 + 94.47 101.25 101.89 + 90.50 106.17 104.83 + 91.82 108.07 107.64 + 86.12 102.06 102.27 + 83.19 97.45 100.39 + 82.00 97.53 99.55 + 85.12 99.23 100.23 + 90.38 101.14 100.78 + 94.89 103.33 104.71 + 93.86 100.06 104.36 + 93.96 103.14 105.56 + 95.55 105.67 103.66 + 96.09 103.95 101.33 + 99.22 105.98 105.45 + 104.21 111.53 110.69 + 109.97 116.39 113.36 + 110.86 114.34 109.21 + 114.70 117.70 113.78 + 116.22 117.77 114.13 + 114.92 118.23 116.69 + 115.89 117.59 116.08 + 120.28 120.59 116.89 +sample_blocks: | + 2 2 128.00 128.00 128.00 + 2 18 128.00 128.00 128.00 + 2 34 128.00 128.00 128.00 + 2 50 107.22 93.11 17.56 + 2 66 128.00 128.00 128.00 + 2 82 76.11 92.44 92.44 + 2 98 99.56 99.56 99.56 + 2 114 27.44 27.44 148.44 + 2 130 113.78 113.78 113.78 + 2 146 85.33 85.33 85.33 + 2 162 128.00 128.00 128.00 + 2 178 128.00 128.00 128.00 + 2 194 128.00 128.00 128.00 + 18 2 128.00 128.00 128.00 + 18 18 128.00 128.00 128.00 + 18 34 86.00 79.22 43.44 + 18 50 128.00 128.00 128.00 + 18 66 128.00 128.00 128.00 + 18 82 10.78 13.22 77.00 + 18 98 7.67 56.11 56.11 + 18 114 52.00 52.00 90.33 + 18 130 21.89 38.56 54.00 + 18 146 85.33 85.33 85.33 + 18 162 128.00 128.00 128.00 + 18 178 18.22 50.33 92.22 + 18 194 99.33 94.33 14.00 + 34 2 128.00 128.00 128.00 + 34 18 54.56 101.78 101.78 + 34 34 128.00 128.00 128.00 + 34 50 10.78 69.33 79.33 + 34 66 128.00 128.00 128.00 + 34 82 44.89 68.44 68.44 + 34 98 128.00 128.00 128.00 + 34 114 10.56 10.56 64.44 + 34 130 13.67 75.56 75.56 + 34 146 99.56 99.56 99.56 + 34 162 113.78 113.78 113.78 + 34 178 20.33 107.56 107.56 + 34 194 128.00 128.00 128.00 + 50 2 127.67 126.89 56.78 + 50 18 128.00 128.00 128.00 + 50 34 19.56 19.56 96.56 + 50 50 14.56 76.67 76.67 + 50 66 23.11 95.33 132.78 + 50 82 17.11 38.89 101.00 + 50 98 31.33 43.89 43.89 + 50 114 21.33 21.33 114.33 + 50 130 52.56 69.33 85.78 + 50 146 11.11 47.56 78.78 + 50 162 13.89 83.89 83.89 + 50 178 128.00 128.00 128.00 + 50 194 128.00 128.00 128.00 + 66 2 128.00 128.00 128.00 + 66 18 12.67 81.22 81.22 + 66 34 60.56 60.56 74.67 + 66 50 10.67 69.89 69.89 + 66 66 57.22 67.00 20.11 + 66 82 7.00 38.78 63.67 + 66 98 11.44 42.56 89.78 + 66 114 8.56 26.78 57.00 + 66 130 10.78 72.89 72.89 + 66 146 56.89 56.89 56.89 + 66 162 113.78 113.78 113.78 + 66 178 71.67 79.11 79.11 + 66 194 99.56 99.56 99.56 + 82 2 128.00 128.00 128.00 + 82 18 89.67 89.67 105.11 + 82 34 99.56 99.56 99.56 + 82 50 9.33 42.33 45.78 + 82 66 14.11 58.56 85.56 + 82 82 11.89 79.44 79.44 + 82 98 45.11 59.00 59.00 + 82 114 87.56 85.78 29.89 + 82 130 92.11 80.33 17.22 + 82 146 19.33 93.89 115.78 + 82 162 58.56 74.56 74.56 + 82 178 128.00 128.00 128.00 + 82 194 128.00 128.00 128.00 + 98 2 128.00 128.00 128.00 + 98 18 128.00 128.00 128.00 + 98 34 32.22 46.78 46.78 + 98 50 56.89 56.89 56.89 + 98 66 14.22 56.00 70.78 + 98 82 13.11 28.44 76.44 + 98 98 11.44 81.89 81.89 + 98 114 17.67 88.67 88.67 + 98 130 19.00 53.89 113.78 + 98 146 24.11 143.67 143.67 + 98 162 18.67 42.67 42.67 + 98 178 85.33 85.33 85.33 + 98 194 128.00 128.00 128.00 + 114 2 128.00 128.00 128.00 + 114 18 18.56 46.11 54.00 + 114 34 85.33 85.33 85.33 + 114 50 25.67 134.22 134.22 + 114 66 3.67 28.89 28.89 + 114 82 20.78 112.56 112.56 + 114 98 12.11 40.67 61.33 + 114 114 31.22 31.22 45.89 + 114 130 0.78 22.44 22.44 + 114 146 14.56 29.89 76.11 + 114 162 2.11 15.22 28.78 + 114 178 99.56 99.56 99.56 + 114 194 128.00 128.00 128.00 + 130 2 128.00 128.00 128.00 + 130 18 56.89 56.89 56.89 + 130 34 85.33 85.33 85.33 + 130 50 18.33 51.11 51.11 + 130 66 14.44 88.56 88.56 + 130 82 99.56 99.56 99.56 + 130 98 9.44 42.11 42.11 + 130 114 11.44 82.89 90.78 + 130 130 14.22 14.22 14.22 + 130 146 13.00 46.00 77.89 + 130 162 7.78 34.67 72.22 + 130 178 128.00 128.00 128.00 + 130 194 128.00 128.00 128.00 + 146 2 128.00 128.00 128.00 + 146 18 11.56 25.67 75.56 + 146 34 5.78 45.44 45.44 + 146 50 11.67 25.00 102.22 + 146 66 13.78 54.00 82.00 + 146 82 113.78 113.78 113.78 + 146 98 12.56 54.44 69.33 + 146 114 29.44 29.44 45.56 + 146 130 3.89 8.33 27.33 + 146 146 16.78 38.11 41.78 + 146 162 21.11 21.11 127.56 + 146 178 73.78 73.78 86.00 + 146 194 99.44 99.44 76.00 + 162 2 128.00 128.00 128.00 + 162 18 36.22 61.11 47.00 + 162 34 85.33 85.33 85.33 + 162 50 128.00 128.00 128.00 + 162 66 22.89 28.78 80.78 + 162 82 71.11 71.11 71.11 + 162 98 113.78 113.78 113.78 + 162 114 56.89 56.89 56.89 + 162 130 99.56 99.56 99.56 + 162 146 31.11 57.56 57.56 + 162 162 7.33 48.33 60.44 + 162 178 128.00 128.00 128.00 + 162 194 128.00 128.00 128.00 + 178 2 127.67 125.78 56.44 + 178 18 128.00 128.00 128.00 + 178 34 58.11 76.00 76.00 + 178 50 128.00 128.00 128.00 + 178 66 11.89 11.89 67.44 + 178 82 85.33 85.33 85.33 + 178 98 128.00 128.00 128.00 + 178 114 15.33 57.44 102.56 + 178 130 71.78 71.78 80.67 + 178 146 11.67 84.33 84.33 + 178 162 128.00 128.00 128.00 + 178 178 128.00 128.00 128.00 + 178 194 128.00 128.00 128.00 + 194 2 128.00 128.00 128.00 + 194 18 128.00 128.00 128.00 + 194 34 128.00 128.00 128.00 + 194 50 127.67 123.67 55.56 + 194 66 73.00 85.78 85.78 + 194 82 128.00 128.00 128.00 + 194 98 128.00 128.00 128.00 + 194 114 22.22 59.33 59.33 + 194 130 11.67 61.22 88.44 + 194 146 128.00 128.00 128.00 + 194 162 128.00 128.00 128.00 + 194 178 128.00 128.00 128.00 + 194 194 128.00 128.00 128.00 +... From 1e74259fbc539c5cf934958744148e5cf62c45d3 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 24 Jul 2026 15:25:20 -0400 Subject: [PATCH 056/100] add shading keyword to dump image with four shading styles The shading keyword selects the shading model: phong (the previous and default behavior, unchanged), diffuse (no specular highlight, matte appearance), toon (lighting quantized into three bands for a comic look), and gooch (cool-to-warm blend for technical illustrations, following Gooch, Gooch, Shirley, Cohen, SIGGRAPH 1998). The toon and gooch styles pair well with the outline keyword. All styles are implemented in Image::draw_pixel(); the phong path is bit-identical to before. --- doc/src/dump_image.rst | 26 +- src/GRAPHICS/dump_image.cpp | 9 + src/GRAPHICS/image.cpp | 83 ++- src/GRAPHICS/image.h | 4 + .../tests/dump-image-shading-diffuse.yaml | 603 ++++++++++++++++++ .../tests/dump-image-shading-gooch.yaml | 603 ++++++++++++++++++ .../tests/dump-image-shading-toon.yaml | 603 ++++++++++++++++++ 7 files changed, 1909 insertions(+), 22 deletions(-) create mode 100644 unittest/graphics/tests/dump-image-shading-diffuse.yaml create mode 100644 unittest/graphics/tests/dump-image-shading-gooch.yaml create mode 100644 unittest/graphics/tests/dump-image-shading-toon.yaml diff --git a/doc/src/dump_image.rst b/doc/src/dump_image.rst index 37ee03ffe1a..9bad6646be6 100644 --- a/doc/src/dump_image.rst +++ b/doc/src/dump_image.rst @@ -24,7 +24,7 @@ Syntax * color = atom attribute that determines color of each atom * diameter = atom attribute that determines size of each atom * zero or more keyword/value pairs may be appended -* keyword = *atom* or *adiam* or *autobond* or *bond* or *grid* or *line* or *tri* or *ellipsoid* or *body* or *compute* or *fix* or *size* or *view* or *center* or *up* or *zoom* or *box* or *axes* or *region* or *subbox* or *shiny* or *fsaa* or *ssao* or *depthcue* or *outline* +* keyword = *atom* or *adiam* or *autobond* or *bond* or *grid* or *line* or *tri* or *ellipsoid* or *body* or *compute* or *fix* or *size* or *view* or *center* or *up* or *zoom* or *box* or *axes* or *region* or *subbox* or *shading* or *shiny* or *fsaa* or *ssao* or *depthcue* or *outline* .. parsed-literal:: @@ -107,6 +107,8 @@ Syntax *subbox* values = lines diam = draw outline of processor subdomains lines = *yes* or *no* = do or do not draw subdomain lines diam = diameter of subdomain lines as fraction of shortest box length + *shading* value = style = shading model for rendered objects + style = *phong* or *diffuse* or *toon* or *gooch* *shiny* value = sfactor = shinyness of spheres and cylinders sfactor = shinyness of spheres and cylinders from 0.0 to 1.0 *fsaa* arg = yes/no @@ -847,6 +849,23 @@ boxcolor" command. ---------- +.. versionadded:: TBD + +The *shading* keyword selects the shading model used for the rendered +objects. The default *phong* style illuminates the objects with an +ambient light, three directional lights, and a specular highlight. +The *diffuse* style is identical but omits the specular highlight, +which gives a rough, matte surface appearance. The *toon* style +mimics comic drawings by quantizing the lighting into three discrete +bands from the main light only. The *gooch* style blends the object +color between a cool blue tone facing away from the light and a warm +yellow tone facing the light, a scheme common for technical +illustrations :ref:`(Gooch) `. The *toon* and *gooch* styles +pair well with the *outline* keyword. The relative light intensities +set with the :ref:`dump_modify lights ` option +apply to the *phong* and *diffuse* styles; the ambient light also +affects the *toon* style. + The *shiny* keyword determines how shiny the objects rendered in the image will appear. The *sfactor* value must be a value 0.0 <= *sfactor* <= 1.0, where *sfactor* = 1 is a highly reflective surface @@ -1503,6 +1522,7 @@ The defaults for the dump image and dump movie keywords are as follows: * box = yes 0.02 * axes = no 0.0 0.0 * subbox = no 0.0 +* shading = phong * shiny = 1.0 * ssao = no * fsaa = no @@ -1855,3 +1875,7 @@ the RGB (red/green/blue) values. .. _Luft: **(Luft)** Luft, Colditz, Deussen, ACM Trans. Graph. 25, 1206-1213 (2006). + +.. _Gooch: + +**(Gooch)** Gooch, Gooch, Shirley, Cohen, Proc. SIGGRAPH 1998, 447-452 (1998). diff --git a/src/GRAPHICS/dump_image.cpp b/src/GRAPHICS/dump_image.cpp index 5b293cc4cd5..b919ebe84ce 100644 --- a/src/GRAPHICS/dump_image.cpp +++ b/src/GRAPHICS/dump_image.cpp @@ -585,6 +585,15 @@ DumpImage::DumpImage(LAMMPS *lmp, int narg, char **arg) : error->all(FLERR,"Invalid dump image subbox diameter {}", subboxdiam); iarg += 3; + } else if (strcmp(arg[iarg],"shading") == 0) { + if (iarg+2 > narg) utils::missing_cmd_args(FLERR,"dump image shading", error); + if (strcmp(arg[iarg+1],"phong") == 0) image->shading = Image::SHADE_PHONG; + else if (strcmp(arg[iarg+1],"diffuse") == 0) image->shading = Image::SHADE_DIFFUSE; + else if (strcmp(arg[iarg+1],"toon") == 0) image->shading = Image::SHADE_TOON; + else if (strcmp(arg[iarg+1],"gooch") == 0) image->shading = Image::SHADE_GOOCH; + else error->all(FLERR, iarg+1, "Unknown dump image shading style {}", arg[iarg+1]); + iarg += 2; + } else if (strcmp(arg[iarg],"shiny") == 0) { if (iarg+2 > narg) utils::missing_cmd_args(FLERR,"dump image shiny", error); double shiny = utils::numeric(FLERR,arg[iarg+1],false,lmp); diff --git a/src/GRAPHICS/image.cpp b/src/GRAPHICS/image.cpp index 6d09589efb4..77f96846712 100644 --- a/src/GRAPHICS/image.cpp +++ b/src/GRAPHICS/image.cpp @@ -361,6 +361,7 @@ Image::Image(LAMMPS *lmp, int nmap_caller) : zoom = 1.0; shiny = 1.0; gamma = 1.0; + shading = SHADE_PHONG; ssao = NO; fastssao = 0; fsaa = NO; @@ -1777,32 +1778,72 @@ void Image::draw_pixel(int ix, int iy, double depth, const double *surface, surfaceBuffer[0 + ix * 2 + iy*width * 2] = surface[1]; surfaceBuffer[1 + ix * 2 + iy*width * 2] = -surface[0]; - diffuseKey = saturate(MathExtra::dot3(surface, keyLightDir)); - diffuseFill = saturate(MathExtra::dot3(surface, fillLightDir)); - diffuseBack = saturate(MathExtra::dot3(surface, backLightDir)); - specularKey = pow(saturate(MathExtra::dot3(surface, keyHalfDir)), - specularHardness) * specularIntensity; - double c[3]; - c[0] = surfaceColor[0] * ambientColor[0]; - c[1] = surfaceColor[1] * ambientColor[1]; - c[2] = surfaceColor[2] * ambientColor[2]; - c[0] += surfaceColor[0] * keyLightColor[0] * diffuseKey; - c[1] += surfaceColor[1] * keyLightColor[1] * diffuseKey; - c[2] += surfaceColor[2] * keyLightColor[2] * diffuseKey; + if ((shading == SHADE_PHONG) || (shading == SHADE_DIFFUSE)) { + + // three-light rig with lambertian diffuse shading and a specular + // highlight from the key light; the diffuse style skips the highlight + + diffuseKey = saturate(MathExtra::dot3(surface, keyLightDir)); + diffuseFill = saturate(MathExtra::dot3(surface, fillLightDir)); + diffuseBack = saturate(MathExtra::dot3(surface, backLightDir)); + + c[0] = surfaceColor[0] * ambientColor[0]; + c[1] = surfaceColor[1] * ambientColor[1]; + c[2] = surfaceColor[2] * ambientColor[2]; + + c[0] += surfaceColor[0] * keyLightColor[0] * diffuseKey; + c[1] += surfaceColor[1] * keyLightColor[1] * diffuseKey; + c[2] += surfaceColor[2] * keyLightColor[2] * diffuseKey; + + if (shading == SHADE_PHONG) { + specularKey = pow(saturate(MathExtra::dot3(surface, keyHalfDir)), + specularHardness) * specularIntensity; + + c[0] += keyLightColor[0] * specularKey; + c[1] += keyLightColor[1] * specularKey; + c[2] += keyLightColor[2] * specularKey; + } - c[0] += keyLightColor[0] * specularKey; - c[1] += keyLightColor[1] * specularKey; - c[2] += keyLightColor[2] * specularKey; + c[0] += surfaceColor[0] * fillLightColor[0] * diffuseFill; + c[1] += surfaceColor[1] * fillLightColor[1] * diffuseFill; + c[2] += surfaceColor[2] * fillLightColor[2] * diffuseFill; - c[0] += surfaceColor[0] * fillLightColor[0] * diffuseFill; - c[1] += surfaceColor[1] * fillLightColor[1] * diffuseFill; - c[2] += surfaceColor[2] * fillLightColor[2] * diffuseFill; + c[0] += surfaceColor[0] * backLightColor[0] * diffuseBack; + c[1] += surfaceColor[1] * backLightColor[1] * diffuseBack; + c[2] += surfaceColor[2] * backLightColor[2] * diffuseBack; - c[0] += surfaceColor[0] * backLightColor[0] * diffuseBack; - c[1] += surfaceColor[1] * backLightColor[1] * diffuseBack; - c[2] += surfaceColor[2] * backLightColor[2] * diffuseBack; + } else if (shading == SHADE_TOON) { + + // cartoon-style shading: quantize the diffuse term of the key light + // into three bands; no other lights except the ambient light + + diffuseKey = saturate(MathExtra::dot3(surface, keyLightDir)); + const double band = (diffuseKey < 0.3) ? 0.4 : (diffuseKey < 0.7) ? 0.7 : 1.0; + + c[0] = surfaceColor[0] * (ambientColor[0] + keyLightColor[0] * band); + c[1] = surfaceColor[1] * (ambientColor[1] + keyLightColor[1] * band); + c[2] = surfaceColor[2] * (ambientColor[2] + keyLightColor[2] * band); + + } else { + + // cool-to-warm shading for technical illustrations following + // Gooch, Gooch, Shirley, Cohen, SIGGRAPH 1998: blend from a cool + // (blue) tone away from the light to a warm (yellow) tone toward + // the light, plus the specular highlight from the key light + + const double t = 0.5 * (1.0 + MathExtra::dot3(surface, keyLightDir)); + specularKey = pow(saturate(MathExtra::dot3(surface, keyHalfDir)), + specularHardness) * specularIntensity; + + c[0] = (1.0 - t) * (0.25 * surfaceColor[0]) + + t * (0.3 + 0.5 * surfaceColor[0]) + keyLightColor[0] * specularKey; + c[1] = (1.0 - t) * (0.25 * surfaceColor[1]) + + t * (0.3 + 0.5 * surfaceColor[1]) + keyLightColor[1] * specularKey; + c[2] = (1.0 - t) * (0.55 + 0.25 * surfaceColor[2]) + + t * (0.5 * surfaceColor[2]) + keyLightColor[2] * specularKey; + } c[0] = saturate(c[0]); c[1] = saturate(c[1]); diff --git a/src/GRAPHICS/image.h b/src/GRAPHICS/image.h index 42a88d8b7d0..a896ae5e32e 100644 --- a/src/GRAPHICS/image.h +++ b/src/GRAPHICS/image.h @@ -28,6 +28,9 @@ class Image : protected Pointers { // how DumpImage allocates and addresses them (amap/gmap/bmap). enum { ATOM_MAP = 0, GRID_MAP = 1, BOND_MAP = 2 }; + // shading styles + enum { SHADE_PHONG = 0, SHADE_DIFFUSE = 1, SHADE_TOON = 2, SHADE_GOOCH = 3 }; + int width, height; // size of image double theta, phi; // view image from theta,phi double xctr, yctr, zctr; // center of image in user coords @@ -35,6 +38,7 @@ class Image : protected Pointers { double zoom; // zoom factor double shiny; // shininess of objects double gamma; // gamma correction of rendered objects, 1.0 = off + int shading; // shading style for rendered objects int fsaa; // antialiasing on or off int ssao; // SSAO on or off int fastssao; // 1 = fast depth-darkening algorithm, 0 = classic SSAO diff --git a/unittest/graphics/tests/dump-image-shading-diffuse.yaml b/unittest/graphics/tests/dump-image-shading-diffuse.yaml new file mode 100644 index 00000000000..c4991d192de --- /dev/null +++ b/unittest/graphics/tests/dump-image-shading-diffuse.yaml @@ -0,0 +1,603 @@ +--- +lammps_version: 4 Jul 2026 +tags: graphics +date_generated: Fri Jul 24 15:24:54 2026 +epsilon_projection: 0.5 +epsilon_blocks: 2 +nprocs: 1 +prerequisites: | + atom full + pair lj/charmm/coul/charmm + bond harmonic + angle charmm + dihedral charmm + improper harmonic +setup_commands: | + units real + atom_style full + pair_style lj/charmm/coul/charmm 8.0 10.0 + bond_style harmonic + angle_style charmm + dihedral_style charmm + improper_style harmonic + read_data ${input_dir}/data.peptide + neighbor 2.0 bin + dump viz all image 1 ${imagefile} type type size 200 200 zoom 1.5 view 60 30 shiny 0.2 box yes 0.02 bond atom 0.3 shading diffuse + dump_modify viz backcolor gray +run_commands: | + run 0 +image_size: 200 200 +sampling: 3 16 +row_means: | + 115.01 123.37 113.48 + 111.03 118.25 115.56 + 111.41 117.16 116.05 + 116.55 120.50 115.39 + 115.44 119.57 112.47 + 116.34 121.17 111.91 + 120.42 124.33 112.59 + 124.19 127.72 115.77 + 123.83 126.21 114.73 + 120.81 125.41 114.64 + 120.12 126.16 115.80 + 119.70 125.30 115.58 + 109.53 120.21 112.08 + 97.22 115.62 111.23 + 87.18 116.75 111.88 + 87.66 115.35 107.39 + 87.61 107.86 99.14 + 85.55 99.94 100.58 + 89.44 103.62 108.84 + 84.47 104.31 111.47 + 72.22 96.56 111.98 + 68.47 100.81 115.06 + 63.69 98.60 111.21 + 66.08 98.97 106.72 + 68.81 99.69 101.49 + 71.60 102.03 103.88 + 77.53 104.02 109.74 + 73.43 101.33 110.11 + 62.09 90.97 105.88 + 62.23 89.27 108.01 + 58.76 86.93 103.03 + 56.97 87.94 100.66 + 61.24 97.23 103.47 + 64.61 102.67 107.33 + 60.27 98.47 104.97 + 62.80 95.03 99.48 + 70.25 97.45 100.69 + 65.40 96.21 103.42 + 57.51 95.34 103.47 + 54.47 95.25 104.72 + 53.52 92.24 103.03 + 54.94 90.47 99.36 + 47.01 86.77 98.50 + 56.16 87.47 94.38 + 54.42 87.00 87.89 + 49.76 90.13 95.20 + 44.43 86.92 104.55 + 35.88 80.59 103.37 + 37.05 77.83 100.45 + 39.52 79.42 96.11 + 50.19 89.74 98.77 + 56.44 91.36 99.84 + 46.09 84.10 90.17 + 49.48 86.64 89.29 + 54.41 85.25 86.38 + 58.73 94.52 91.78 + 62.45 101.38 95.53 + 63.99 102.71 99.83 + 65.65 98.41 98.22 + 62.84 89.93 95.41 + 56.83 84.30 96.30 + 55.70 82.19 90.07 + 56.01 89.61 94.03 + 52.46 95.53 96.22 + 50.06 95.44 91.61 + 48.68 90.93 88.80 + 55.73 92.20 90.48 + 55.39 94.15 102.34 + 52.95 94.25 100.41 + 59.05 88.19 96.92 + 52.53 77.33 87.86 + 53.06 75.06 88.51 + 49.58 75.64 94.21 + 42.63 77.27 92.72 + 40.10 87.58 93.38 + 41.93 91.85 96.49 + 41.59 82.19 94.92 + 41.89 78.20 93.77 + 47.87 80.78 91.81 + 56.13 91.94 94.30 + 55.62 100.11 98.25 + 51.54 96.92 100.97 + 45.67 84.16 96.99 + 46.47 83.00 94.48 + 49.94 83.56 93.97 + 49.97 90.77 101.61 + 43.30 92.53 104.23 + 43.10 90.22 104.31 + 26.46 80.56 99.61 + 23.09 74.61 97.64 + 23.27 74.59 97.92 + 25.84 73.55 100.47 + 23.91 73.44 96.78 + 30.95 81.05 97.50 + 32.87 82.06 97.41 + 31.59 78.62 97.36 + 32.87 79.92 102.08 + 39.27 86.83 106.89 + 43.10 86.17 106.19 + 43.10 77.32 97.28 + 47.59 84.37 102.62 + 46.30 79.73 105.59 + 39.91 80.44 107.17 + 29.59 82.03 105.65 + 27.11 84.86 108.97 + 19.43 77.66 98.17 + 22.62 70.31 90.97 + 25.82 68.42 95.98 + 24.55 63.00 95.16 + 32.16 63.87 99.59 + 40.97 68.27 95.44 + 38.43 68.94 97.01 + 34.24 88.62 103.58 + 32.70 94.48 104.56 + 28.27 84.00 95.67 + 27.69 78.61 95.06 + 33.55 76.59 92.72 + 37.44 87.53 96.37 + 39.98 82.98 95.27 + 40.32 79.72 98.39 + 43.55 76.94 98.67 + 43.50 79.15 101.11 + 31.59 77.27 101.34 + 25.18 76.14 103.41 + 23.28 75.05 99.25 + 28.23 72.92 95.55 + 28.84 74.31 92.70 + 25.96 74.44 93.11 + 26.88 79.89 93.39 + 31.59 85.69 103.48 + 38.59 85.94 99.35 + 39.38 88.61 100.88 + 38.45 84.94 101.44 + 41.83 80.59 99.18 + 51.33 83.92 101.45 + 43.10 85.88 98.28 + 41.49 93.20 104.06 + 42.92 95.91 106.56 + 40.08 85.17 99.61 + 38.42 76.60 95.97 + 39.61 76.04 102.67 + 31.27 76.78 102.45 + 31.50 74.97 93.49 + 29.66 77.48 92.67 + 37.86 82.89 96.48 + 44.07 88.16 96.28 + 53.12 88.44 95.97 + 52.65 88.23 95.93 + 50.98 91.10 101.51 + 51.10 88.58 101.39 + 50.77 92.49 106.43 + 51.72 92.42 101.58 + 50.49 93.77 105.70 + 44.52 87.27 102.31 + 37.31 86.25 104.28 + 35.63 83.97 97.39 + 36.41 81.89 98.27 + 43.24 81.89 97.12 + 54.31 81.75 97.62 + 60.16 88.59 102.08 + 66.21 97.20 103.62 + 69.48 101.54 107.36 + 71.30 107.83 107.05 + 65.67 104.61 104.53 + 64.81 99.02 105.38 + 62.98 99.53 109.00 + 62.76 98.67 107.19 + 64.19 92.99 100.53 + 70.98 94.20 99.02 + 73.92 94.75 98.81 + 76.33 100.64 110.80 + 69.34 103.02 111.67 + 66.79 105.52 112.03 + 70.40 102.40 106.61 + 77.21 99.00 99.19 + 88.75 104.61 103.94 + 98.15 116.36 114.16 + 97.91 118.30 116.34 + 98.69 114.80 112.84 + 102.11 113.27 110.02 + 98.06 110.91 106.14 + 102.68 117.23 106.27 + 101.58 120.98 107.70 + 103.51 121.33 108.27 + 105.83 119.28 109.44 + 107.08 117.08 110.62 + 111.51 115.40 110.44 + 110.56 115.19 109.84 + 107.57 115.42 109.33 + 112.03 118.81 109.44 + 115.43 121.84 110.27 + 117.00 120.88 108.75 + 118.16 120.50 109.44 + 114.61 122.97 112.83 + 110.31 119.58 111.94 + 108.75 117.11 110.72 + 111.59 120.39 115.13 + 114.29 121.88 115.02 + 122.24 125.42 111.78 + 127.48 128.25 113.86 +col_means: | + 124.01 128.55 118.22 + 121.17 128.03 117.44 + 122.73 128.12 116.82 + 118.72 125.36 116.17 + 109.33 119.21 116.94 + 105.93 116.98 117.56 + 102.64 118.46 116.83 + 100.09 117.75 112.72 + 98.16 114.04 111.89 + 97.06 112.89 112.41 + 92.64 107.93 110.83 + 91.45 104.52 108.53 + 94.70 104.70 106.82 + 95.95 110.33 109.23 + 92.78 108.92 106.92 + 93.91 110.67 107.18 + 93.72 114.33 108.47 + 88.81 110.89 107.78 + 83.66 105.30 110.14 + 81.61 103.25 109.75 + 80.78 102.61 108.67 + 79.39 99.86 107.83 + 80.75 99.41 109.23 + 75.08 95.89 107.52 + 64.98 91.77 104.64 + 60.27 92.18 106.59 + 64.57 91.89 102.56 + 70.71 93.43 101.52 + 76.64 98.71 101.38 + 72.64 103.76 107.51 + 70.11 102.80 109.89 + 69.44 104.15 108.69 + 66.61 100.72 101.64 + 70.69 99.63 103.33 + 78.10 99.53 105.99 + 66.41 92.69 102.97 + 68.86 95.46 104.85 + 67.53 101.82 110.00 + 61.08 98.89 105.67 + 59.56 93.30 102.00 + 67.20 93.76 101.52 + 69.71 99.56 105.11 + 63.20 98.75 107.74 + 59.22 97.09 105.39 + 53.42 99.46 102.93 + 51.41 96.98 102.61 + 52.58 87.40 101.34 + 53.53 82.14 100.40 + 52.36 81.22 99.89 + 52.34 82.73 98.31 + 59.67 97.59 102.08 + 58.51 100.39 101.42 + 55.39 95.19 102.00 + 55.71 94.37 103.98 + 55.74 91.47 103.72 + 59.13 87.50 102.67 + 58.28 85.92 102.48 + 57.60 90.08 102.00 + 58.24 95.49 105.34 + 47.45 85.37 96.80 + 51.34 86.31 102.17 + 46.22 88.50 104.78 + 37.88 88.66 107.41 + 30.95 82.92 101.59 + 29.48 83.05 101.38 + 29.84 80.26 99.40 + 33.02 80.02 96.86 + 36.54 81.89 95.06 + 46.33 90.08 101.72 + 43.77 85.45 99.41 + 44.95 87.67 101.00 + 37.81 88.69 99.11 + 32.91 87.17 95.11 + 31.45 86.78 97.06 + 32.42 83.46 93.83 + 39.19 84.83 100.66 + 40.83 77.10 98.72 + 34.87 77.47 98.68 + 32.73 85.47 101.36 + 30.88 88.53 103.93 + 31.36 86.77 101.11 + 28.74 88.28 98.19 + 34.72 93.92 102.94 + 32.70 90.08 101.03 + 36.20 83.20 102.69 + 39.78 77.54 101.39 + 37.27 77.61 99.01 + 39.34 75.28 100.72 + 43.59 77.12 101.05 + 43.58 73.94 96.84 + 48.16 77.45 95.49 + 55.33 87.56 99.75 + 54.03 98.28 102.32 + 54.24 102.33 99.52 + 49.45 96.31 92.64 + 51.12 96.90 99.71 + 54.52 89.78 103.19 + 49.45 81.26 99.36 + 52.95 82.64 99.42 + 47.40 87.48 101.32 + 34.77 87.33 101.05 + 31.51 79.15 98.48 + 31.96 76.23 96.46 + 32.24 76.99 93.50 + 28.63 78.48 89.76 + 42.46 90.08 95.06 + 39.75 85.64 94.75 + 41.88 84.11 94.12 + 46.50 82.69 93.56 + 46.31 82.84 95.55 + 39.28 79.83 92.73 + 31.64 79.52 94.06 + 27.20 78.10 100.69 + 30.64 82.16 100.79 + 24.32 75.32 99.72 + 23.80 72.92 100.25 + 30.30 78.42 101.73 + 31.84 75.92 94.81 + 30.76 73.67 95.97 + 38.74 72.38 93.92 + 47.73 77.77 99.30 + 48.09 80.47 99.16 + 49.21 79.28 97.30 + 46.12 84.28 102.53 + 41.63 85.28 99.07 + 36.96 86.94 100.34 + 104.36 104.75 43.74 + 114.95 117.05 44.30 + 83.68 90.44 43.32 + 39.59 74.64 97.75 + 45.39 81.00 102.94 + 37.11 76.06 102.86 + 36.37 82.19 103.25 + 31.43 84.92 101.91 + 39.31 85.67 96.90 + 49.11 81.94 100.20 + 47.98 83.44 98.89 + 50.09 83.48 100.44 + 47.72 88.11 99.51 + 43.79 91.31 101.16 + 41.71 87.57 97.59 + 39.05 86.94 96.30 + 39.69 85.64 98.08 + 39.30 89.00 101.28 + 36.77 87.18 97.92 + 36.01 85.92 92.22 + 38.26 83.36 96.92 + 38.99 84.31 96.61 + 36.99 78.29 96.47 + 38.38 74.14 98.17 + 43.83 83.40 99.34 + 47.00 87.94 95.49 + 48.48 93.86 100.19 + 51.78 94.10 99.56 + 52.70 91.48 98.44 + 46.41 86.73 98.01 + 45.23 82.67 98.38 + 48.85 84.30 93.76 + 52.38 93.31 99.94 + 57.13 101.28 103.32 + 55.90 97.73 101.72 + 61.10 95.85 102.57 + 57.90 87.11 101.65 + 65.10 93.12 104.31 + 58.37 89.86 100.61 + 59.13 96.08 103.61 + 62.12 95.17 104.22 + 63.83 94.88 99.89 + 67.31 93.54 97.33 + 72.64 96.93 103.17 + 69.51 99.08 105.31 + 69.22 97.17 105.25 + 72.44 95.69 102.16 + 76.88 97.77 103.83 + 84.40 104.83 109.84 + 83.41 101.08 111.47 + 80.90 98.59 109.11 + 89.24 102.23 107.42 + 98.47 114.45 113.38 + 89.70 114.27 111.80 + 90.96 116.11 113.65 + 86.20 110.58 109.75 + 82.62 106.42 107.70 + 82.09 105.06 107.56 + 86.59 106.17 107.41 + 92.69 110.64 110.06 + 96.79 110.05 111.69 + 95.83 108.92 111.29 + 96.49 109.03 108.97 + 97.92 111.78 107.89 + 99.18 113.81 110.49 + 102.69 115.32 110.96 + 107.97 118.37 113.75 + 112.40 120.50 114.11 + 116.31 122.73 113.04 + 120.78 123.96 114.90 + 120.79 124.07 116.67 + 118.76 122.23 116.94 + 119.58 122.03 116.55 + 124.88 124.94 117.26 +sample_blocks: | + 2 2 128.00 128.00 128.00 + 2 18 128.00 128.00 128.00 + 2 34 128.00 128.00 128.00 + 2 50 162.67 139.00 14.22 + 2 66 128.00 128.00 128.00 + 2 82 71.11 130.67 130.67 + 2 98 99.56 113.56 113.56 + 2 114 0.00 0.00 120.33 + 2 130 121.78 120.56 113.78 + 2 146 166.00 155.22 85.33 + 2 162 128.00 128.00 128.00 + 2 178 128.00 128.00 128.00 + 2 194 128.00 128.00 128.00 + 18 2 128.00 128.00 128.00 + 18 18 128.00 128.00 128.00 + 18 34 109.33 98.89 42.67 + 18 50 128.00 128.00 128.00 + 18 66 128.00 128.00 128.00 + 18 82 0.00 2.33 93.44 + 18 98 0.00 58.22 73.89 + 18 114 42.67 42.67 114.78 + 18 130 14.22 76.33 132.89 + 18 146 85.33 95.22 95.22 + 18 162 128.00 128.00 128.00 + 18 178 0.00 89.22 131.11 + 18 194 203.00 176.11 0.00 + 34 2 128.00 128.00 128.00 + 34 18 42.67 132.33 132.33 + 34 34 128.00 128.00 128.00 + 34 50 0.00 58.11 78.67 + 34 66 128.00 128.00 128.00 + 34 82 42.67 77.22 77.22 + 34 98 128.00 128.00 128.00 + 34 114 0.00 28.11 107.56 + 34 130 0.00 86.22 86.22 + 34 146 99.56 99.56 111.11 + 34 162 113.78 124.78 124.78 + 34 178 0.00 128.67 128.67 + 34 194 128.00 128.00 128.00 + 50 2 177.56 159.33 42.67 + 50 18 128.00 128.00 128.00 + 50 34 0.00 0.00 132.78 + 50 50 0.00 118.11 118.11 + 50 66 0.00 72.00 113.89 + 50 82 0.00 27.22 95.00 + 50 98 39.67 67.11 67.11 + 50 114 0.00 6.11 109.89 + 50 130 42.67 104.22 134.00 + 50 146 0.00 46.33 87.67 + 50 162 0.00 106.67 106.67 + 50 178 128.00 128.00 128.00 + 50 194 128.00 128.00 128.00 + 66 2 128.00 128.00 128.00 + 66 18 0.00 88.56 88.56 + 66 34 56.89 56.89 122.56 + 66 50 0.00 78.22 78.22 + 66 66 127.67 138.00 25.11 + 66 82 0.00 40.78 77.78 + 66 98 0.00 42.44 93.67 + 66 114 0.00 27.67 103.67 + 66 130 0.00 89.56 89.56 + 66 146 81.22 99.11 78.67 + 66 162 113.78 113.78 113.78 + 66 178 71.11 87.44 92.44 + 66 194 99.56 123.11 123.11 + 82 2 128.00 128.00 128.00 + 82 18 85.33 85.33 128.00 + 82 34 99.56 110.44 110.44 + 82 50 0.00 69.67 94.89 + 82 66 0.00 78.00 104.89 + 82 82 0.00 83.78 83.78 + 82 98 42.67 120.11 120.11 + 82 114 160.89 151.78 24.11 + 82 130 160.33 143.33 20.44 + 82 146 0.00 85.67 107.33 + 82 162 56.89 84.22 84.22 + 82 178 128.00 128.00 128.00 + 82 194 128.00 128.00 128.00 + 98 2 128.00 128.00 128.00 + 98 18 128.00 128.00 128.00 + 98 34 28.44 80.78 100.00 + 98 50 56.89 62.22 101.11 + 98 66 0.00 96.00 110.78 + 98 82 0.00 40.33 93.33 + 98 98 0.00 92.33 92.33 + 98 114 0.00 123.67 123.67 + 98 130 0.00 34.67 102.00 + 98 146 0.00 118.89 118.89 + 98 162 14.22 121.67 121.67 + 98 178 85.33 85.33 119.56 + 98 194 128.00 128.00 128.00 + 114 2 128.00 128.00 128.00 + 114 18 14.22 55.22 68.89 + 114 34 85.33 96.33 102.56 + 114 50 0.00 116.67 116.67 + 114 66 0.00 67.33 67.33 + 114 82 0.00 119.22 119.22 + 114 98 0.00 54.56 116.78 + 114 114 28.44 67.89 124.67 + 114 130 0.00 65.67 78.33 + 114 146 0.00 32.44 107.67 + 114 162 0.00 48.44 78.00 + 114 178 99.56 115.44 115.44 + 114 194 128.00 128.00 128.00 + 130 2 128.00 128.00 128.00 + 130 18 56.89 93.44 93.44 + 130 34 85.33 116.67 116.67 + 130 50 38.56 86.33 65.89 + 130 66 0.00 113.67 113.67 + 130 82 99.56 104.44 104.44 + 130 98 0.00 118.00 118.00 + 130 114 0.00 76.44 84.33 + 130 130 77.11 91.00 48.00 + 130 146 0.00 49.67 81.22 + 130 162 0.00 26.78 106.22 + 130 178 128.00 128.00 128.00 + 130 194 128.00 128.00 128.00 + 146 2 128.00 128.00 128.00 + 146 18 0.00 14.11 77.78 + 146 34 0.00 62.67 62.67 + 146 50 0.00 13.22 90.11 + 146 66 0.00 75.44 118.33 + 146 82 113.78 126.00 126.00 + 146 98 0.00 94.44 109.33 + 146 114 28.44 33.11 68.78 + 146 130 0.00 29.44 52.33 + 146 146 14.22 64.56 68.22 + 146 162 0.00 0.00 115.56 + 146 178 71.11 71.11 103.56 + 146 194 173.22 160.89 71.11 + 162 2 128.00 128.00 128.00 + 162 18 28.44 94.22 89.44 + 162 34 85.33 105.33 118.00 + 162 50 128.00 128.00 128.00 + 162 66 14.22 20.00 80.67 + 162 82 71.11 111.11 111.11 + 162 98 113.78 118.22 118.22 + 162 114 56.89 92.00 92.00 + 162 130 99.56 110.89 110.89 + 162 146 28.44 78.78 78.78 + 162 162 0.00 67.67 93.56 + 162 178 128.00 128.00 128.00 + 162 194 128.00 128.00 128.00 + 178 2 208.00 187.00 42.67 + 178 18 128.00 128.00 128.00 + 178 34 56.89 99.89 99.89 + 178 50 128.00 128.00 128.00 + 178 66 0.00 0.00 104.78 + 178 82 85.33 102.44 102.44 + 178 98 128.00 128.00 128.00 + 178 114 0.00 48.33 104.44 + 178 130 71.11 71.11 101.56 + 178 146 0.00 88.56 88.56 + 178 162 128.00 128.00 128.00 + 178 178 128.00 128.00 128.00 + 178 194 128.00 128.00 128.00 + 194 2 128.00 128.00 128.00 + 194 18 128.00 128.00 128.00 + 194 34 128.00 128.00 128.00 + 194 50 155.33 139.00 42.67 + 194 66 71.11 108.56 108.56 + 194 82 128.00 128.00 128.00 + 194 98 128.00 128.00 128.00 + 194 114 14.22 94.78 94.78 + 194 130 0.00 59.56 86.56 + 194 146 128.00 128.00 128.00 + 194 162 128.00 128.00 128.00 + 194 178 128.00 128.00 128.00 + 194 194 128.00 128.00 128.00 +... diff --git a/unittest/graphics/tests/dump-image-shading-gooch.yaml b/unittest/graphics/tests/dump-image-shading-gooch.yaml new file mode 100644 index 00000000000..88017aee01a --- /dev/null +++ b/unittest/graphics/tests/dump-image-shading-gooch.yaml @@ -0,0 +1,603 @@ +--- +lammps_version: 4 Jul 2026 +tags: graphics +date_generated: Fri Jul 24 15:24:55 2026 +epsilon_projection: 0.5 +epsilon_blocks: 2 +nprocs: 1 +prerequisites: | + atom full + pair lj/charmm/coul/charmm + bond harmonic + angle charmm + dihedral charmm + improper harmonic +setup_commands: | + units real + atom_style full + pair_style lj/charmm/coul/charmm 8.0 10.0 + bond_style harmonic + angle_style charmm + dihedral_style charmm + improper_style harmonic + read_data ${input_dir}/data.peptide + neighbor 2.0 bin + dump viz all image 1 ${imagefile} type type size 200 200 zoom 1.5 view 60 30 shiny 0.2 box yes 0.02 bond atom 0.3 shading gooch + dump_modify viz backcolor gray +run_commands: | + run 0 +image_size: 200 200 +sampling: 3 16 +row_means: | + 125.29 130.38 120.44 + 121.51 126.94 121.86 + 123.00 127.03 121.45 + 126.38 128.46 120.51 + 124.73 127.00 120.24 + 124.65 127.72 120.56 + 126.45 128.91 121.27 + 128.75 130.94 121.59 + 128.21 130.07 121.39 + 126.90 129.75 120.94 + 128.25 131.19 120.39 + 127.83 130.82 121.15 + 122.47 129.00 119.05 + 118.16 128.66 117.53 + 115.90 132.18 117.02 + 114.17 129.82 118.09 + 108.86 123.54 117.67 + 109.28 120.92 117.19 + 115.52 125.14 117.91 + 112.28 123.81 118.37 + 105.33 119.40 118.86 + 104.81 123.52 119.62 + 101.19 121.81 120.17 + 99.92 120.25 120.34 + 98.56 119.10 119.58 + 101.78 121.66 119.23 + 106.89 123.62 120.15 + 104.95 122.10 119.00 + 98.42 117.36 117.99 + 100.98 117.67 118.52 + 97.67 115.69 117.48 + 95.09 114.79 117.52 + 98.43 120.20 118.47 + 100.77 123.49 118.45 + 97.22 121.00 119.09 + 95.25 117.77 120.42 + 99.42 118.30 119.06 + 99.38 118.76 118.69 + 97.16 120.15 117.67 + 96.34 121.66 116.50 + 96.75 120.86 116.59 + 95.64 118.49 116.31 + 93.56 118.17 114.94 + 96.80 116.77 114.21 + 92.45 114.75 113.39 + 92.82 117.57 114.50 + 94.31 118.72 116.41 + 90.06 116.38 115.55 + 90.04 115.16 113.90 + 91.30 116.81 114.24 + 98.65 121.70 112.84 + 101.01 121.53 113.11 + 92.87 117.84 112.09 + 94.09 118.19 111.96 + 94.63 116.14 113.34 + 98.85 121.06 112.27 + 103.44 127.08 112.51 + 105.98 128.15 111.98 + 103.28 124.08 113.89 + 100.69 118.67 113.19 + 101.97 119.03 110.44 + 99.70 116.38 109.69 + 102.75 122.90 109.33 + 101.77 125.61 110.47 + 97.22 123.77 112.62 + 93.15 120.31 113.34 + 95.04 121.33 113.36 + 101.22 124.90 113.44 + 99.50 124.53 114.06 + 101.08 119.72 112.84 + 94.66 111.40 113.64 + 97.45 110.72 110.86 + 97.50 114.02 111.59 + 91.58 112.73 112.60 + 90.51 119.09 113.11 + 93.61 123.69 112.53 + 93.01 118.94 112.83 + 91.34 115.14 113.48 + 91.44 113.38 115.42 + 95.52 117.75 115.23 + 99.66 125.80 113.88 + 100.06 126.48 114.28 + 94.19 118.84 113.45 + 92.55 117.08 114.58 + 92.80 114.58 115.81 + 93.83 118.54 117.58 + 91.01 121.57 117.12 + 90.33 119.97 119.44 + 82.22 116.34 115.47 + 81.80 114.17 117.17 + 80.96 113.62 117.19 + 83.38 112.16 116.09 + 80.06 111.30 117.55 + 82.30 114.20 117.94 + 83.16 115.47 118.44 + 82.44 112.98 117.67 + 86.78 116.61 116.08 + 91.69 121.06 118.47 + 91.58 117.65 118.65 + 85.68 109.16 119.86 + 90.00 114.73 120.87 + 91.84 113.55 118.78 + 90.64 115.06 115.92 + 87.43 118.19 116.09 + 87.69 119.84 116.33 + 78.28 114.45 117.55 + 75.27 108.56 119.20 + 79.31 107.64 117.26 + 78.59 105.35 119.45 + 83.24 105.44 120.00 + 86.47 105.66 117.82 + 85.54 104.94 118.70 + 89.78 119.94 115.36 + 88.91 124.69 117.87 + 82.64 118.05 116.59 + 81.49 114.97 115.56 + 84.75 112.80 116.67 + 88.68 120.06 114.52 + 87.53 114.81 115.30 + 89.39 114.39 116.45 + 87.30 110.23 120.00 + 88.13 110.83 118.19 + 84.26 112.48 117.53 + 84.59 115.59 115.96 + 81.12 113.33 116.28 + 80.69 109.81 118.39 + 81.64 110.81 116.56 + 80.11 112.00 116.55 + 80.92 114.23 116.76 + 86.71 119.52 117.14 + 87.77 118.50 118.33 + 88.22 119.05 117.44 + 87.47 116.77 117.69 + 87.12 113.28 120.77 + 91.22 113.45 119.36 + 85.64 113.14 118.22 + 90.94 121.19 118.17 + 93.44 124.30 117.43 + 89.21 117.73 116.22 + 87.73 114.10 114.25 + 90.73 113.36 117.41 + 85.83 113.23 117.13 + 79.65 107.84 119.15 + 78.65 110.28 118.97 + 84.33 113.66 118.69 + 88.12 116.44 118.03 + 92.59 116.43 117.11 + 95.06 118.28 114.38 + 97.74 122.08 114.84 + 95.31 118.61 116.93 + 95.46 120.83 117.30 + 91.81 118.39 120.11 + 94.63 121.42 118.22 + 91.58 118.70 116.47 + 91.28 121.01 115.64 + 87.91 117.19 116.28 + 87.58 115.54 117.08 + 87.92 113.80 118.38 + 91.02 111.70 120.52 + 94.70 113.39 120.94 + 99.25 118.32 119.86 + 103.23 123.29 119.46 + 104.89 127.42 117.25 + 101.17 125.11 117.12 + 101.51 122.70 117.02 + 103.94 125.39 116.30 + 102.67 123.80 117.25 + 99.06 117.16 118.45 + 99.47 115.84 119.30 + 100.08 115.79 120.28 + 106.33 119.86 119.33 + 104.88 123.81 118.39 + 105.62 128.00 118.33 + 104.40 124.36 118.14 + 102.59 119.08 119.80 + 107.35 119.27 120.95 + 115.59 126.67 121.64 + 116.41 128.41 122.06 + 116.92 126.80 120.22 + 119.39 126.89 118.84 + 114.64 124.20 119.30 + 118.49 127.24 118.36 + 118.92 130.04 118.76 + 119.92 131.25 118.31 + 119.89 129.10 119.64 + 120.94 127.58 119.59 + 123.78 126.37 119.06 + 123.02 125.70 119.10 + 121.67 125.97 119.14 + 123.01 127.23 119.69 + 124.53 128.75 119.92 + 123.91 127.81 119.95 + 125.56 127.77 119.42 + 126.16 130.81 118.55 + 124.33 129.58 118.47 + 121.79 127.20 120.25 + 122.63 127.72 121.71 + 123.12 127.98 122.00 + 127.06 129.74 120.74 + 130.28 131.18 120.64 +col_means: | + 129.40 132.06 121.56 + 128.09 131.88 121.39 + 127.69 130.85 121.70 + 125.14 129.28 121.84 + 123.23 129.10 121.03 + 122.62 128.97 121.43 + 120.23 129.59 120.57 + 117.84 128.38 119.48 + 117.31 126.97 119.66 + 117.72 127.31 118.48 + 114.56 124.33 119.17 + 113.28 121.56 120.11 + 112.44 119.58 120.97 + 114.56 123.70 119.54 + 112.97 122.94 119.49 + 112.72 123.94 120.07 + 112.81 126.39 119.89 + 111.81 125.65 119.55 + 110.66 124.36 119.01 + 109.49 123.63 119.28 + 108.77 122.50 119.55 + 108.53 120.66 118.94 + 109.03 120.34 118.67 + 107.41 120.69 117.42 + 103.70 120.78 116.34 + 101.22 120.31 117.53 + 98.06 115.28 119.76 + 99.33 114.25 119.58 + 103.38 118.28 119.12 + 107.19 126.89 116.67 + 107.61 126.93 117.38 + 104.84 125.38 118.05 + 98.98 121.36 118.75 + 101.51 120.36 119.88 + 105.44 119.95 119.15 + 101.81 120.17 117.33 + 106.02 122.91 116.21 + 107.75 127.92 116.41 + 102.62 125.09 116.74 + 96.95 117.80 118.98 + 97.49 115.89 119.97 + 102.06 121.73 117.58 + 103.78 125.08 116.67 + 101.11 124.09 116.14 + 98.45 126.87 115.69 + 97.25 125.08 116.01 + 95.45 117.54 117.33 + 95.30 114.31 116.39 + 93.91 113.11 117.35 + 93.29 112.25 117.69 + 98.48 121.89 116.94 + 97.48 124.24 116.78 + 97.47 122.69 117.35 + 97.47 122.06 118.24 + 95.61 118.53 119.25 + 96.28 114.38 117.73 + 96.59 114.78 118.44 + 97.34 118.39 118.22 + 97.78 119.51 118.53 + 88.70 114.14 117.32 + 94.11 117.21 118.94 + 95.05 122.11 116.25 + 92.00 122.03 116.96 + 85.72 117.03 116.31 + 85.18 118.14 116.31 + 84.31 116.92 117.99 + 85.78 114.50 115.25 + 85.17 113.66 116.81 + 91.66 119.31 117.52 + 89.86 116.24 116.66 + 91.22 117.65 117.92 + 88.28 120.84 117.96 + 88.44 122.36 112.91 + 87.11 120.86 115.39 + 83.75 115.86 117.92 + 86.23 115.08 119.07 + 84.86 108.40 118.89 + 83.84 111.63 117.28 + 87.06 120.61 117.00 + 87.59 122.00 116.52 + 85.39 119.65 116.77 + 82.06 119.40 117.22 + 88.56 125.58 115.82 + 86.13 121.83 118.52 + 86.67 116.30 117.86 + 87.37 112.03 117.95 + 86.34 113.16 117.88 + 90.22 112.81 117.14 + 89.70 109.77 118.08 + 87.12 107.31 117.25 + 88.16 107.89 118.71 + 94.91 116.09 118.16 + 97.68 124.56 116.13 + 99.33 129.00 113.75 + 95.92 125.88 112.08 + 98.67 126.11 113.84 + 98.44 119.76 116.22 + 92.23 112.70 117.64 + 91.64 111.81 119.27 + 92.70 116.91 116.82 + 88.34 119.58 115.17 + 86.64 117.14 115.60 + 85.88 113.70 116.19 + 82.33 110.75 116.66 + 78.67 110.13 118.45 + 88.44 119.42 116.64 + 88.78 117.41 115.06 + 90.47 118.00 113.56 + 94.69 117.77 112.77 + 94.89 116.81 112.17 + 89.80 115.66 113.11 + 84.48 114.70 116.32 + 83.94 115.12 117.84 + 85.34 117.95 116.52 + 84.08 116.14 114.41 + 84.39 114.54 116.42 + 87.58 117.00 115.72 + 81.02 110.77 118.75 + 79.80 107.18 118.93 + 82.18 105.84 119.75 + 89.87 110.08 119.56 + 90.59 111.64 118.44 + 91.44 110.83 117.07 + 91.86 114.99 118.06 + 92.37 120.03 114.17 + 91.51 122.03 115.67 + 144.31 141.97 66.81 + 142.74 143.66 79.84 + 120.12 122.34 90.02 + 85.78 108.81 118.42 + 93.27 115.61 116.78 + 89.87 114.01 117.28 + 90.13 117.92 115.30 + 86.66 118.40 116.81 + 86.43 115.95 117.19 + 89.53 111.94 119.64 + 88.76 112.88 119.95 + 93.50 114.10 118.17 + 94.84 119.23 115.64 + 94.10 123.61 115.78 + 90.94 118.97 115.47 + 85.36 115.88 116.77 + 88.34 117.78 116.89 + 90.00 120.83 116.80 + 88.38 119.64 115.25 + 84.83 116.87 115.98 + 87.76 116.61 116.51 + 87.52 116.44 116.28 + 88.33 115.02 116.28 + 90.23 113.11 115.25 + 90.92 115.28 116.21 + 90.66 117.24 115.56 + 92.90 120.71 116.39 + 93.39 119.92 116.83 + 93.27 118.91 117.83 + 92.52 118.06 116.33 + 92.03 114.81 115.58 + 89.34 111.76 117.50 + 95.78 121.11 115.25 + 98.39 125.20 117.30 + 95.38 121.51 118.51 + 96.73 118.97 118.78 + 95.22 114.71 119.15 + 101.97 118.94 116.72 + 97.59 116.73 115.67 + 102.78 124.85 114.83 + 101.81 121.11 115.70 + 98.30 118.07 116.92 + 97.84 115.85 118.17 + 102.77 119.19 120.09 + 102.72 121.70 119.22 + 102.34 120.44 119.20 + 100.09 115.85 119.77 + 103.84 118.04 119.34 + 110.50 123.19 119.55 + 110.56 121.07 119.20 + 107.69 118.92 120.17 + 108.65 117.58 121.92 + 117.67 127.30 118.92 + 114.55 128.90 119.32 + 114.99 129.45 118.92 + 110.53 126.14 118.73 + 107.35 123.08 120.53 + 107.05 121.50 120.59 + 107.39 119.73 121.69 + 111.58 123.25 121.28 + 116.82 125.33 119.91 + 116.86 124.75 118.84 + 114.66 122.08 119.75 + 114.49 122.86 120.19 + 115.42 124.66 120.19 + 117.12 125.60 121.44 + 119.92 126.04 122.33 + 121.69 126.63 122.58 + 122.73 127.33 121.94 + 126.00 128.40 121.80 + 128.21 129.99 120.52 + 126.70 128.79 121.61 + 125.33 127.00 122.77 + 127.23 127.25 122.99 +sample_blocks: | + 2 2 128.00 128.00 128.00 + 2 18 128.00 128.00 128.00 + 2 34 128.00 128.00 128.00 + 2 50 158.89 144.11 63.33 + 2 66 128.00 128.00 128.00 + 2 82 117.67 148.00 117.11 + 2 98 113.78 127.11 123.33 + 2 114 88.78 88.78 117.67 + 2 130 130.56 128.78 120.11 + 2 146 158.11 151.78 98.00 + 2 162 128.00 128.00 128.00 + 2 178 128.00 128.00 128.00 + 2 194 128.00 128.00 128.00 + 18 2 128.00 128.00 128.00 + 18 18 128.00 128.00 128.00 + 18 34 120.33 111.44 102.11 + 18 50 128.00 128.00 128.00 + 18 66 128.00 128.00 128.00 + 18 82 64.89 70.67 118.56 + 18 98 51.89 94.33 121.67 + 18 114 101.33 101.33 117.56 + 18 130 102.89 132.56 107.22 + 18 146 99.22 117.11 125.22 + 18 162 128.00 128.00 128.00 + 18 178 97.11 142.11 110.00 + 18 194 208.56 190.00 48.67 + 34 2 128.00 128.00 128.00 + 34 18 106.78 150.78 115.00 + 34 34 128.00 128.00 128.00 + 34 50 56.89 89.78 122.33 + 34 66 128.00 128.00 128.00 + 34 82 65.33 98.00 132.78 + 34 98 128.00 128.00 128.00 + 34 114 74.22 89.22 112.67 + 34 130 62.56 118.78 123.33 + 34 146 105.33 105.33 130.11 + 34 162 121.44 128.56 123.78 + 34 178 91.22 155.00 113.67 + 34 194 128.00 128.00 128.00 + 50 2 182.11 170.00 76.44 + 50 18 128.00 128.00 128.00 + 50 34 96.00 96.00 108.67 + 50 50 85.89 149.89 108.33 + 50 66 87.00 124.67 110.22 + 50 82 71.00 94.33 117.56 + 50 98 78.78 108.89 110.22 + 50 114 84.56 90.00 110.89 + 50 130 114.44 145.00 113.56 + 50 146 60.44 95.78 119.22 + 50 162 71.11 130.44 115.78 + 50 178 128.00 128.00 128.00 + 50 194 128.00 128.00 128.00 + 66 2 128.00 128.00 128.00 + 66 18 60.44 116.56 123.00 + 66 34 107.22 107.22 114.67 + 66 50 59.56 116.56 119.33 + 66 66 143.67 157.56 76.00 + 66 82 58.33 84.33 114.67 + 66 98 66.00 92.67 116.56 + 66 114 77.11 100.00 115.67 + 66 130 69.11 128.44 114.78 + 66 146 95.44 115.78 117.22 + 66 162 117.44 123.11 128.00 + 66 178 85.33 101.89 130.44 + 66 194 114.89 128.33 123.56 + 82 2 128.00 128.00 128.00 + 82 18 119.33 119.33 119.78 + 82 34 104.78 115.00 131.00 + 82 50 80.56 123.33 107.89 + 82 66 70.89 117.00 115.56 + 82 82 59.00 114.67 123.44 + 82 98 95.00 136.78 113.44 + 82 114 181.11 173.33 64.22 + 82 130 157.22 149.89 60.56 + 82 146 76.44 122.67 115.33 + 82 162 82.56 112.11 124.89 + 82 178 128.00 128.00 128.00 + 82 194 128.00 128.00 128.00 + 98 2 128.00 128.00 128.00 + 98 18 128.00 128.00 128.00 + 98 34 86.56 116.44 109.22 + 98 50 87.56 93.22 123.33 + 98 66 88.33 144.67 110.67 + 98 82 78.78 106.89 105.56 + 98 98 60.33 116.89 120.89 + 98 114 96.22 162.00 107.78 + 98 130 76.33 96.11 115.33 + 98 146 83.22 144.89 117.89 + 98 162 89.11 146.56 105.11 + 98 178 109.22 109.22 121.22 + 98 194 128.00 128.00 128.00 + 114 2 128.00 128.00 128.00 + 114 18 54.00 89.33 126.11 + 114 34 99.44 110.67 125.11 + 114 50 89.78 153.44 114.56 + 114 66 48.67 102.89 120.89 + 114 82 92.22 156.67 110.56 + 114 98 91.33 121.11 106.56 + 114 114 101.33 123.67 108.22 + 114 130 57.11 107.00 116.11 + 114 146 75.78 96.11 112.56 + 114 162 59.33 102.67 113.22 + 114 178 109.67 121.67 126.00 + 114 194 128.00 128.00 128.00 + 130 2 128.00 128.00 128.00 + 130 18 84.22 114.78 121.89 + 130 34 108.44 129.22 118.78 + 130 50 81.44 124.00 108.56 + 130 66 78.89 140.67 112.78 + 130 82 107.00 118.11 128.00 + 130 98 94.11 159.56 106.67 + 130 114 59.56 109.22 120.44 + 130 130 111.33 120.22 91.22 + 130 146 58.22 88.89 126.00 + 130 162 69.89 88.44 114.44 + 130 178 128.00 128.00 128.00 + 130 194 128.00 128.00 128.00 + 146 2 128.00 128.00 128.00 + 146 18 65.44 77.22 113.78 + 146 34 43.11 94.78 128.67 + 146 50 60.67 68.22 118.78 + 146 66 92.44 137.22 98.78 + 146 82 122.22 129.56 123.22 + 146 98 76.44 130.67 113.67 + 146 114 52.22 57.33 133.67 + 146 130 36.00 66.78 134.56 + 146 146 59.44 103.67 119.00 + 146 162 79.44 79.44 116.78 + 146 178 100.44 100.44 120.44 + 146 194 167.67 159.33 89.33 + 162 2 128.00 128.00 128.00 + 162 18 98.22 132.56 94.78 + 162 34 111.33 125.67 116.56 + 162 50 128.00 128.00 128.00 + 162 66 62.22 68.00 123.67 + 162 82 99.00 125.44 118.89 + 162 98 115.78 120.56 130.33 + 162 114 81.33 110.89 125.00 + 162 130 107.22 118.44 127.78 + 162 146 62.78 104.00 125.00 + 162 162 65.67 109.67 113.11 + 162 178 128.00 128.00 128.00 + 162 194 128.00 128.00 128.00 + 178 2 195.00 182.11 72.89 + 178 18 128.00 128.00 128.00 + 178 34 84.00 113.44 127.89 + 178 50 128.00 128.00 128.00 + 178 66 71.78 71.78 117.00 + 178 82 95.00 110.89 131.00 + 178 98 128.00 128.00 128.00 + 178 114 73.78 105.00 111.67 + 178 130 89.44 89.44 127.11 + 178 146 58.00 113.78 122.67 + 178 162 128.00 128.00 128.00 + 178 178 128.00 128.00 128.00 + 178 194 128.00 128.00 128.00 + 194 2 128.00 128.00 128.00 + 194 18 128.00 128.00 128.00 + 194 34 128.00 128.00 128.00 + 194 50 172.67 160.67 78.56 + 194 66 96.11 121.11 123.00 + 194 82 128.00 128.00 128.00 + 194 98 128.00 128.00 128.00 + 194 114 77.22 130.67 114.22 + 194 130 60.33 102.22 119.22 + 194 146 128.00 128.00 128.00 + 194 162 128.00 128.00 128.00 + 194 178 128.00 128.00 128.00 + 194 194 128.00 128.00 128.00 +... diff --git a/unittest/graphics/tests/dump-image-shading-toon.yaml b/unittest/graphics/tests/dump-image-shading-toon.yaml new file mode 100644 index 00000000000..ff73edd5468 --- /dev/null +++ b/unittest/graphics/tests/dump-image-shading-toon.yaml @@ -0,0 +1,603 @@ +--- +lammps_version: 4 Jul 2026 +tags: graphics +date_generated: Fri Jul 24 15:24:55 2026 +epsilon_projection: 0.5 +epsilon_blocks: 2 +nprocs: 1 +prerequisites: | + atom full + pair lj/charmm/coul/charmm + bond harmonic + angle charmm + dihedral charmm + improper harmonic +setup_commands: | + units real + atom_style full + pair_style lj/charmm/coul/charmm 8.0 10.0 + bond_style harmonic + angle_style charmm + dihedral_style charmm + improper_style harmonic + read_data ${input_dir}/data.peptide + neighbor 2.0 bin + dump viz all image 1 ${imagefile} type type size 200 200 zoom 1.5 view 60 30 shiny 0.2 box yes 0.02 bond atom 0.3 shading toon + dump_modify viz backcolor gray +run_commands: | + run 0 +image_size: 200 200 +sampling: 3 16 +row_means: | + 114.31 121.38 112.08 + 110.45 117.56 114.73 + 110.36 115.77 114.26 + 115.48 118.51 113.30 + 115.00 118.34 111.52 + 115.59 119.80 111.36 + 119.78 123.24 112.78 + 123.11 126.31 115.57 + 123.17 125.25 114.81 + 119.57 123.70 114.18 + 119.48 124.08 114.64 + 119.14 123.28 113.88 + 108.72 117.64 109.61 + 96.39 112.39 108.27 + 86.16 111.52 106.33 + 86.77 110.23 102.43 + 86.47 105.00 96.97 + 84.74 98.81 98.92 + 88.72 102.03 105.28 + 84.19 102.03 108.12 + 72.25 94.25 108.91 + 68.14 96.44 108.56 + 63.17 92.80 103.88 + 65.76 94.58 100.95 + 68.30 96.67 98.62 + 70.97 99.52 101.43 + 76.56 101.00 106.16 + 72.72 97.58 104.92 + 61.39 87.33 101.17 + 61.55 85.74 101.83 + 58.03 84.34 97.83 + 56.24 85.31 96.58 + 60.38 93.61 99.69 + 63.77 97.80 102.08 + 59.47 92.57 97.91 + 61.84 92.02 95.86 + 69.66 95.32 97.86 + 64.56 93.19 99.59 + 56.88 91.23 99.21 + 53.52 90.36 98.83 + 52.91 88.52 97.71 + 53.92 85.86 94.00 + 45.41 80.79 91.64 + 54.24 83.17 90.13 + 53.07 84.21 84.99 + 48.74 85.29 91.17 + 43.32 80.52 96.56 + 34.98 74.17 94.30 + 36.69 72.68 91.34 + 38.66 75.28 90.88 + 49.20 84.50 94.01 + 56.05 86.06 92.92 + 44.95 79.64 84.39 + 48.47 82.00 83.50 + 52.66 81.59 82.67 + 56.59 89.63 88.17 + 60.69 95.33 89.39 + 63.63 96.44 92.28 + 65.00 94.47 92.81 + 61.21 86.34 92.38 + 55.80 80.39 90.01 + 54.26 77.98 86.08 + 53.30 83.07 86.80 + 50.52 87.75 87.45 + 48.60 87.94 84.71 + 47.81 85.08 83.60 + 55.01 90.70 88.58 + 54.50 89.11 95.23 + 51.76 90.13 94.87 + 57.91 83.27 91.02 + 51.73 74.30 83.53 + 52.63 71.75 83.14 + 48.47 72.74 88.21 + 41.22 72.17 87.34 + 39.44 81.56 86.23 + 41.06 85.45 90.54 + 41.06 77.21 88.90 + 41.41 74.62 87.02 + 46.77 76.98 85.68 + 54.71 86.45 89.35 + 54.18 93.52 92.79 + 50.93 89.78 92.58 + 44.90 79.28 89.72 + 45.73 78.87 87.94 + 49.01 79.92 89.47 + 49.66 85.85 95.55 + 43.70 88.86 99.34 + 43.02 85.55 98.86 + 26.38 75.96 93.19 + 23.04 69.45 89.65 + 23.18 70.22 90.88 + 25.71 68.80 92.06 + 23.82 68.86 89.75 + 30.86 76.44 91.98 + 32.77 78.32 92.06 + 31.50 75.28 92.75 + 32.77 77.07 97.31 + 39.17 82.66 99.51 + 43.02 80.92 98.26 + 43.02 74.38 93.05 + 47.49 82.48 99.48 + 46.08 77.03 100.11 + 39.81 76.73 100.27 + 29.34 76.14 97.93 + 27.02 74.84 96.38 + 19.34 69.22 87.56 + 22.54 66.44 85.04 + 25.73 64.33 89.62 + 24.45 59.70 88.29 + 31.20 60.83 91.64 + 39.82 66.86 90.70 + 36.84 66.84 93.04 + 33.50 80.51 95.56 + 32.45 84.45 94.39 + 27.36 77.31 89.14 + 26.96 74.43 88.97 + 33.45 73.40 88.34 + 36.82 82.39 90.31 + 39.06 77.99 89.44 + 40.67 75.71 91.45 + 43.92 74.25 92.92 + 43.52 75.81 95.57 + 31.50 73.67 95.58 + 25.09 69.62 93.72 + 22.97 67.88 89.84 + 27.95 67.49 87.06 + 28.08 68.25 85.64 + 25.45 70.06 85.88 + 26.89 75.26 88.45 + 31.50 80.71 97.64 + 38.56 81.58 92.74 + 39.55 84.16 94.65 + 38.70 80.41 94.53 + 41.73 77.22 94.14 + 51.20 80.82 96.12 + 43.02 83.31 96.04 + 41.12 86.36 97.33 + 42.61 88.67 98.00 + 40.32 79.73 91.80 + 37.73 74.39 90.69 + 38.93 71.88 94.64 + 31.02 71.85 94.33 + 31.36 69.53 86.83 + 29.57 74.43 89.35 + 37.58 78.73 90.67 + 43.57 83.08 90.58 + 52.42 84.81 91.83 + 51.91 84.75 91.60 + 50.52 85.94 94.25 + 51.23 84.23 94.91 + 50.83 88.11 99.17 + 51.49 88.98 98.06 + 50.38 89.92 100.37 + 44.11 82.78 95.48 + 37.07 81.03 95.49 + 34.89 78.53 90.55 + 35.90 76.03 91.07 + 42.62 78.32 92.36 + 53.98 81.14 95.34 + 59.92 86.55 99.69 + 65.87 93.42 100.70 + 68.89 97.93 102.95 + 70.30 103.64 102.94 + 64.72 100.52 101.38 + 64.08 94.81 101.00 + 62.33 94.81 103.13 + 61.98 93.51 100.47 + 63.42 88.89 95.38 + 70.11 92.58 96.86 + 73.00 94.42 98.81 + 75.77 96.89 106.95 + 68.91 98.67 107.27 + 66.03 100.28 105.52 + 69.55 97.71 101.09 + 76.41 97.95 98.39 + 87.72 103.46 103.84 + 97.34 114.21 112.67 + 97.23 115.25 113.11 + 97.97 112.52 110.33 + 100.58 110.39 107.61 + 97.47 110.25 105.77 + 101.65 114.27 104.60 + 100.56 117.23 105.97 + 102.47 118.52 106.56 + 104.72 116.83 107.72 + 106.64 115.57 109.27 + 110.95 114.03 108.19 + 109.67 112.94 107.22 + 106.42 112.73 107.36 + 111.14 117.22 108.64 + 114.29 120.28 109.86 + 116.26 120.46 109.14 + 117.36 119.43 109.30 + 113.86 120.62 110.69 + 109.33 116.69 108.91 + 107.73 114.67 108.29 + 111.17 118.59 113.22 + 113.62 120.43 114.09 + 120.58 123.66 111.78 + 126.50 126.83 113.53 +col_means: | + 123.09 127.53 118.18 + 120.00 125.80 116.34 + 121.33 125.45 115.42 + 117.28 123.14 115.42 + 109.62 118.94 116.90 + 105.67 115.81 116.30 + 101.83 116.33 114.50 + 99.41 114.70 109.52 + 97.44 111.92 110.44 + 95.86 110.78 110.94 + 90.53 104.31 108.67 + 91.15 102.23 105.72 + 94.45 103.25 104.27 + 95.09 107.77 106.16 + 92.00 106.72 105.08 + 92.96 108.92 106.39 + 92.50 112.04 107.39 + 87.04 107.39 106.34 + 83.52 102.72 107.70 + 81.36 100.92 105.95 + 80.08 100.25 105.73 + 79.70 96.98 103.31 + 80.19 96.47 106.05 + 74.13 93.42 104.94 + 63.36 88.64 100.13 + 59.84 87.59 99.25 + 64.19 87.45 94.95 + 70.11 89.62 95.75 + 76.78 96.92 98.62 + 72.05 102.58 106.28 + 69.19 98.30 104.71 + 68.21 98.41 101.87 + 65.94 97.14 97.70 + 70.13 95.35 99.69 + 77.52 96.11 102.66 + 66.75 92.53 101.59 + 68.00 93.65 102.59 + 66.64 99.17 106.33 + 60.34 94.03 99.92 + 58.91 87.15 95.08 + 66.47 88.39 95.36 + 68.85 97.50 102.65 + 63.55 95.68 102.25 + 58.95 93.47 100.70 + 52.55 95.00 99.24 + 50.74 90.73 96.30 + 51.87 81.92 95.47 + 52.55 77.15 93.98 + 51.57 78.11 93.22 + 52.66 80.62 92.61 + 59.46 93.78 97.06 + 57.67 95.39 96.38 + 54.72 91.22 98.58 + 55.04 90.09 98.92 + 55.27 85.73 96.72 + 58.63 83.23 98.23 + 58.29 83.31 97.86 + 57.41 88.20 97.63 + 57.65 89.02 97.07 + 47.25 81.64 92.44 + 51.27 83.55 98.05 + 45.70 86.10 100.59 + 37.30 83.11 98.86 + 30.91 77.58 94.98 + 29.33 76.73 94.35 + 29.49 75.25 92.06 + 32.85 74.64 89.42 + 36.19 76.50 89.09 + 45.86 84.38 95.08 + 42.95 80.85 94.45 + 44.72 84.11 96.08 + 37.38 85.20 94.58 + 32.10 82.22 89.92 + 30.99 80.31 89.55 + 32.84 77.77 86.47 + 38.80 78.30 92.25 + 40.37 71.89 90.63 + 34.74 73.76 93.41 + 32.53 82.34 96.53 + 30.61 82.72 97.03 + 31.55 81.33 94.42 + 28.69 82.85 91.53 + 34.45 88.69 97.69 + 32.64 83.92 93.65 + 36.02 77.31 94.71 + 39.57 73.03 94.62 + 37.01 75.41 95.14 + 39.65 73.25 95.70 + 44.06 72.78 93.53 + 43.01 70.27 90.20 + 48.34 75.98 91.62 + 55.14 85.52 96.27 + 53.54 94.03 97.94 + 53.22 96.61 94.07 + 48.94 92.19 88.98 + 49.73 88.89 91.75 + 52.93 82.63 94.60 + 50.53 77.75 91.59 + 51.70 78.01 92.97 + 46.09 81.92 94.65 + 34.41 81.11 94.20 + 31.14 74.39 93.20 + 30.75 69.35 87.44 + 31.11 71.71 86.02 + 29.02 73.55 84.05 + 41.38 85.47 90.19 + 38.85 79.83 88.46 + 42.17 80.30 89.68 + 46.05 78.83 88.44 + 45.12 78.03 89.56 + 37.44 74.98 87.50 + 31.10 74.86 88.14 + 27.31 71.58 92.35 + 30.48 78.61 95.59 + 23.62 69.72 92.87 + 23.62 67.87 93.62 + 29.59 72.19 93.22 + 30.93 70.69 86.56 + 31.07 69.24 88.31 + 38.71 70.10 88.27 + 47.28 74.48 94.59 + 47.16 76.38 93.70 + 48.16 76.56 92.52 + 45.92 81.14 97.68 + 41.56 83.75 95.47 + 36.93 81.75 93.35 + 108.85 107.09 41.20 + 110.58 111.61 41.33 + 73.33 80.78 40.57 + 39.02 70.58 91.95 + 45.44 78.58 97.58 + 37.09 73.17 96.61 + 36.16 78.77 96.74 + 30.98 78.22 93.18 + 38.33 79.99 90.16 + 47.89 76.83 93.36 + 46.98 79.54 93.89 + 48.84 79.62 94.45 + 46.16 83.62 94.08 + 41.59 85.47 93.36 + 40.83 81.75 90.29 + 38.74 82.28 90.81 + 39.09 81.22 93.38 + 38.59 85.20 96.14 + 36.80 82.08 90.44 + 35.09 80.08 85.94 + 37.62 78.48 91.28 + 38.42 78.09 89.72 + 36.62 73.05 89.61 + 37.60 70.47 91.87 + 42.72 77.53 90.67 + 46.38 84.42 90.14 + 47.34 87.11 93.31 + 50.99 89.02 94.47 + 52.32 87.94 93.92 + 46.53 83.78 92.69 + 44.66 77.72 90.73 + 47.57 79.08 86.69 + 51.66 88.33 93.75 + 55.81 95.29 97.95 + 54.67 91.64 96.33 + 60.43 90.47 96.64 + 57.71 84.16 96.31 + 64.21 89.61 98.91 + 57.17 86.39 95.76 + 58.08 92.08 98.80 + 61.01 89.83 97.87 + 62.59 89.84 94.19 + 66.24 90.19 93.66 + 72.45 95.28 100.62 + 68.96 95.59 100.33 + 68.32 92.57 99.56 + 71.97 92.23 97.14 + 76.00 95.90 102.20 + 83.04 101.77 106.50 + 82.19 97.27 107.69 + 80.43 95.45 103.83 + 88.80 101.03 104.97 + 97.62 112.97 111.44 + 89.25 111.84 109.03 + 90.08 112.41 110.59 + 84.96 106.34 105.78 + 81.20 103.52 105.25 + 81.71 101.90 104.03 + 86.24 102.89 103.39 + 92.00 107.59 107.47 + 96.61 108.66 109.42 + 94.75 107.17 109.16 + 95.09 106.08 105.78 + 96.48 108.07 104.62 + 98.38 111.71 109.16 + 102.27 114.07 109.25 + 107.22 116.15 111.69 + 112.45 118.92 112.31 + 115.57 121.38 112.10 + 119.41 122.30 114.83 + 119.52 122.39 116.06 + 117.73 120.66 115.74 + 118.91 120.84 115.45 + 124.37 124.00 116.52 +sample_blocks: | + 2 2 128.00 128.00 128.00 + 2 18 128.00 128.00 128.00 + 2 34 128.00 128.00 128.00 + 2 50 148.78 127.78 14.22 + 2 66 128.00 128.00 128.00 + 2 82 71.11 126.67 126.67 + 2 98 99.56 114.78 114.78 + 2 114 0.00 0.00 95.56 + 2 130 123.89 122.33 113.78 + 2 146 161.67 149.67 85.33 + 2 162 128.00 128.00 128.00 + 2 178 128.00 128.00 128.00 + 2 194 128.00 128.00 128.00 + 18 2 128.00 128.00 128.00 + 18 18 128.00 128.00 128.00 + 18 34 111.00 100.44 42.67 + 18 50 128.00 128.00 128.00 + 18 66 128.00 128.00 128.00 + 18 82 0.00 5.56 74.78 + 18 98 0.00 51.22 66.44 + 18 114 42.67 42.67 113.33 + 18 130 14.22 65.56 121.11 + 18 146 85.33 102.00 102.00 + 18 162 128.00 128.00 128.00 + 18 178 0.00 83.33 116.56 + 18 194 198.33 167.22 0.00 + 34 2 128.00 128.00 128.00 + 34 18 42.67 117.56 117.56 + 34 34 128.00 128.00 128.00 + 34 50 0.00 40.11 62.33 + 34 66 128.00 128.00 128.00 + 34 82 42.67 80.11 80.11 + 34 98 128.00 128.00 128.00 + 34 114 0.00 27.78 91.56 + 34 130 0.00 74.78 74.78 + 34 146 99.56 99.56 110.67 + 34 162 113.78 123.44 123.44 + 34 178 0.00 108.11 108.11 + 34 194 128.00 128.00 128.00 + 50 2 164.67 145.56 42.67 + 50 18 128.00 128.00 128.00 + 50 34 0.00 0.00 112.33 + 50 50 0.00 99.78 99.78 + 50 66 0.00 69.44 104.00 + 50 82 0.00 26.33 87.44 + 50 98 42.33 70.00 70.00 + 50 114 0.00 5.56 104.00 + 50 130 42.67 98.22 126.00 + 50 146 0.00 37.44 74.89 + 50 162 0.00 87.22 87.22 + 50 178 128.00 128.00 128.00 + 50 194 128.00 128.00 128.00 + 66 2 128.00 128.00 128.00 + 66 18 0.00 70.67 70.67 + 66 34 56.89 56.89 122.11 + 66 50 0.00 70.67 70.67 + 66 66 119.56 131.22 30.44 + 66 82 0.00 30.44 66.44 + 66 98 0.00 34.56 70.56 + 66 114 0.00 26.33 95.78 + 66 130 0.00 83.22 83.22 + 66 146 82.33 100.56 79.11 + 66 162 113.78 119.33 119.33 + 66 178 71.11 87.78 93.33 + 66 194 99.56 118.89 118.89 + 82 2 128.00 128.00 128.00 + 82 18 85.33 85.33 127.00 + 82 34 99.56 110.67 110.67 + 82 50 0.00 70.78 99.89 + 82 66 0.00 72.11 91.44 + 82 82 0.00 66.56 66.56 + 82 98 42.67 105.00 105.00 + 82 114 147.44 134.00 19.33 + 82 130 146.33 131.22 19.78 + 82 146 0.00 72.11 95.67 + 82 162 56.89 92.89 92.89 + 82 178 128.00 128.00 128.00 + 82 194 128.00 128.00 128.00 + 98 2 128.00 128.00 128.00 + 98 18 128.00 128.00 128.00 + 98 34 28.44 79.78 104.67 + 98 50 56.89 62.44 93.00 + 98 66 0.00 94.33 108.22 + 98 82 0.00 43.00 95.67 + 98 98 0.00 66.44 66.44 + 98 114 0.00 112.33 112.33 + 98 130 0.00 24.89 87.33 + 98 146 0.00 95.56 95.56 + 98 162 14.22 112.67 112.67 + 98 178 85.33 85.33 114.44 + 98 194 128.00 128.00 128.00 + 114 2 128.00 128.00 128.00 + 114 18 14.22 51.67 62.78 + 114 34 85.33 96.44 106.11 + 114 50 0.00 99.78 99.78 + 114 66 0.00 66.56 66.56 + 114 82 0.00 108.22 108.22 + 114 98 0.00 55.56 112.44 + 114 114 28.44 70.11 117.22 + 114 130 0.00 61.11 70.78 + 114 146 0.00 33.33 91.56 + 114 162 0.00 51.33 74.89 + 114 178 99.56 110.67 110.67 + 114 194 128.00 128.00 128.00 + 130 2 128.00 128.00 128.00 + 130 18 56.89 97.11 97.11 + 130 34 85.33 118.56 118.56 + 130 50 39.67 91.11 69.67 + 130 66 0.00 91.44 91.44 + 130 82 99.56 110.67 110.67 + 130 98 0.00 112.44 112.44 + 130 114 0.00 61.00 70.67 + 130 130 82.89 99.89 58.67 + 130 146 0.00 44.44 70.78 + 130 162 0.00 24.89 87.22 + 130 178 128.00 128.00 128.00 + 130 194 128.00 128.00 128.00 + 146 2 128.00 128.00 128.00 + 146 18 0.00 11.11 83.22 + 146 34 0.00 54.11 54.11 + 146 50 0.00 13.89 70.67 + 146 66 0.00 79.11 120.78 + 146 82 113.78 127.67 127.67 + 146 98 0.00 73.44 83.11 + 146 114 28.44 34.00 67.33 + 146 130 0.00 33.33 58.33 + 146 146 14.22 73.89 79.44 + 146 162 0.00 0.00 87.22 + 146 178 71.11 71.11 101.56 + 146 194 165.22 150.44 71.11 + 162 2 128.00 128.00 128.00 + 162 18 20.22 86.56 88.78 + 162 34 85.33 108.89 122.78 + 162 50 128.00 128.00 128.00 + 162 66 14.22 19.78 71.00 + 162 82 71.11 114.11 114.11 + 162 98 113.78 119.33 119.33 + 162 114 56.89 93.00 93.00 + 162 130 99.56 110.67 110.67 + 162 146 28.44 75.56 75.56 + 162 162 0.00 59.56 87.33 + 162 178 128.00 128.00 128.00 + 162 194 128.00 128.00 128.00 + 178 2 195.33 171.33 42.67 + 178 18 128.00 128.00 128.00 + 178 34 56.89 93.00 93.00 + 178 50 128.00 128.00 128.00 + 178 66 0.00 0.00 83.11 + 178 82 85.33 102.00 102.00 + 178 98 128.00 128.00 128.00 + 178 114 0.00 36.00 87.33 + 178 130 71.11 71.11 93.33 + 178 146 0.00 74.78 74.78 + 178 162 128.00 128.00 128.00 + 178 178 128.00 128.00 128.00 + 178 194 128.00 128.00 128.00 + 194 2 128.00 128.00 128.00 + 194 18 128.00 128.00 128.00 + 194 34 128.00 128.00 128.00 + 194 50 164.67 145.56 42.67 + 194 66 71.11 101.56 101.56 + 194 82 128.00 128.00 128.00 + 194 98 128.00 128.00 128.00 + 194 114 14.22 87.67 87.67 + 194 130 0.00 47.11 74.89 + 194 146 128.00 128.00 128.00 + 194 162 128.00 128.00 128.00 + 194 178 128.00 128.00 128.00 + 194 194 128.00 128.00 128.00 +... From 5934be843d564ca6283833217789866d19a9f027 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 24 Jul 2026 15:27:17 -0400 Subject: [PATCH 057/100] add author names and rendering terms to spelling exceptions --- doc/utils/sphinx-config/false_positives.txt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/doc/utils/sphinx-config/false_positives.txt b/doc/utils/sphinx-config/false_positives.txt index 9d259ebaf65..171cb28d143 100644 --- a/doc/utils/sphinx-config/false_positives.txt +++ b/doc/utils/sphinx-config/false_positives.txt @@ -609,6 +609,7 @@ COH cohesionless Coker Colberg +Colditz coleman Colliex collinear @@ -859,6 +860,7 @@ Destree destructor destructors detils +Deussen Devanathan devel Devemy @@ -1494,6 +1496,7 @@ Goga Goldfarb Gompper Gonzalez-Melchor +Gooch Goodsell googlemail googletest @@ -1601,6 +1604,9 @@ hbond hcp hdnnp HDNNP +Luft +phong +quantizing runner RUNNER Hearn From 020d418dd729229808dc2b5d3467989befac1a0b Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 24 Jul 2026 16:45:53 -0400 Subject: [PATCH 058/100] replace dump image shading keyword with dump_modify specular none Reviewer feedback: of the four shading styles only the matte appearance without specular highlights is needed, and it fits better as an additional setting of the existing dump_modify specular presets than as a separate keyword with more choices. Remove the shading keyword with the toon and gooch styles and add 'specular none', which disables the specular highlight term. The highlight test in Image::draw_pixel() checks the flag directly because view parameters of static views are not recomputed after dump_modify. The converted test passes against the unchanged reference data of the removed 'shading diffuse' style, confirming identical rendering. --- doc/src/dump_image.rst | 44 +- doc/utils/sphinx-config/false_positives.txt | 3 - src/GRAPHICS/dump_image.cpp | 14 +- src/GRAPHICS/image.cpp | 90 +-- src/GRAPHICS/image.h | 5 +- .../tests/dump-image-shading-gooch.yaml | 603 ------------------ .../tests/dump-image-shading-toon.yaml | 603 ------------------ ...se.yaml => dump-modify-specular-none.yaml} | 4 +- 8 files changed, 48 insertions(+), 1318 deletions(-) delete mode 100644 unittest/graphics/tests/dump-image-shading-gooch.yaml delete mode 100644 unittest/graphics/tests/dump-image-shading-toon.yaml rename unittest/graphics/tests/{dump-image-shading-diffuse.yaml => dump-modify-specular-none.yaml} (99%) diff --git a/doc/src/dump_image.rst b/doc/src/dump_image.rst index 9bad6646be6..861919d90a8 100644 --- a/doc/src/dump_image.rst +++ b/doc/src/dump_image.rst @@ -24,7 +24,7 @@ Syntax * color = atom attribute that determines color of each atom * diameter = atom attribute that determines size of each atom * zero or more keyword/value pairs may be appended -* keyword = *atom* or *adiam* or *autobond* or *bond* or *grid* or *line* or *tri* or *ellipsoid* or *body* or *compute* or *fix* or *size* or *view* or *center* or *up* or *zoom* or *box* or *axes* or *region* or *subbox* or *shading* or *shiny* or *fsaa* or *ssao* or *depthcue* or *outline* +* keyword = *atom* or *adiam* or *autobond* or *bond* or *grid* or *line* or *tri* or *ellipsoid* or *body* or *compute* or *fix* or *size* or *view* or *center* or *up* or *zoom* or *box* or *axes* or *region* or *subbox* or *shiny* or *fsaa* or *ssao* or *depthcue* or *outline* .. parsed-literal:: @@ -107,8 +107,6 @@ Syntax *subbox* values = lines diam = draw outline of processor subdomains lines = *yes* or *no* = do or do not draw subdomain lines diam = diameter of subdomain lines as fraction of shortest box length - *shading* value = style = shading model for rendered objects - style = *phong* or *diffuse* or *toon* or *gooch* *shiny* value = sfactor = shinyness of spheres and cylinders sfactor = shinyness of spheres and cylinders from 0.0 to 1.0 *fsaa* arg = yes/no @@ -206,7 +204,7 @@ Syntax *lights* args = ambient key fill back ambient key fill back = set light intensity value from 0.0 to 1.0 *specular* arg = style - style = *wide* or *narrow* or *tight* = width of the specular highlights + style = *none* or *wide* or *narrow* or *tight* = specular highlights off or their width *loadcolors* arg = filename filename = load color definitions, per-type colors, and lights from JSON format file *savecolors* arg = filename @@ -849,23 +847,6 @@ boxcolor" command. ---------- -.. versionadded:: TBD - -The *shading* keyword selects the shading model used for the rendered -objects. The default *phong* style illuminates the objects with an -ambient light, three directional lights, and a specular highlight. -The *diffuse* style is identical but omits the specular highlight, -which gives a rough, matte surface appearance. The *toon* style -mimics comic drawings by quantizing the lighting into three discrete -bands from the main light only. The *gooch* style blends the object -color between a cool blue tone facing away from the light and a warm -yellow tone facing the light, a scheme common for technical -illustrations :ref:`(Gooch) `. The *toon* and *gooch* styles -pair well with the *outline* keyword. The relative light intensities -set with the :ref:`dump_modify lights ` option -apply to the *phong* and *diffuse* styles; the ambient light also -affects the *toon* style. - The *shiny* keyword determines how shiny the objects rendered in the image will appear. The *sfactor* value must be a value 0.0 <= *sfactor* <= 1.0, where *sfactor* = 1 is a highly reflective surface @@ -1389,13 +1370,15 @@ specified. .. versionadded:: TBD -The *specular* keyword selects the width of the specular highlights -independently from the *shiny* keyword of the dump image command. -Three settings are available: *wide* highlights are close to the -default appearance, *narrow* highlights are visibly smaller, and -*tight* produces small sharp highlights with a plastic-like -appearance. The *sfactor* value of the *shiny* keyword scales the -brightness of the highlights in all cases; without the *specular* +The *specular* keyword adjusts the specular highlights independently +from the *shiny* keyword of the dump image command. The *none* +setting turns the highlights off entirely, which results in a rough, +matte surface appearance from the remaining diffuse lighting. The +other settings select the width of the highlights: *wide* highlights +are close to the default appearance, *narrow* highlights are visibly +smaller, and *tight* produces small sharp highlights with a +plastic-like appearance. The *sfactor* value of the *shiny* keyword +scales the brightness of the highlights; without the *specular* keyword it also sets their width. ---------- @@ -1522,7 +1505,6 @@ The defaults for the dump image and dump movie keywords are as follows: * box = yes 0.02 * axes = no 0.0 0.0 * subbox = no 0.0 -* shading = phong * shiny = 1.0 * ssao = no * fsaa = no @@ -1875,7 +1857,3 @@ the RGB (red/green/blue) values. .. _Luft: **(Luft)** Luft, Colditz, Deussen, ACM Trans. Graph. 25, 1206-1213 (2006). - -.. _Gooch: - -**(Gooch)** Gooch, Gooch, Shirley, Cohen, Proc. SIGGRAPH 1998, 447-452 (1998). diff --git a/doc/utils/sphinx-config/false_positives.txt b/doc/utils/sphinx-config/false_positives.txt index 171cb28d143..aa0ebb0de12 100644 --- a/doc/utils/sphinx-config/false_positives.txt +++ b/doc/utils/sphinx-config/false_positives.txt @@ -1496,7 +1496,6 @@ Goga Goldfarb Gompper Gonzalez-Melchor -Gooch Goodsell googlemail googletest @@ -1605,8 +1604,6 @@ hcp hdnnp HDNNP Luft -phong -quantizing runner RUNNER Hearn diff --git a/src/GRAPHICS/dump_image.cpp b/src/GRAPHICS/dump_image.cpp index b919ebe84ce..8f1d860d944 100644 --- a/src/GRAPHICS/dump_image.cpp +++ b/src/GRAPHICS/dump_image.cpp @@ -585,15 +585,6 @@ DumpImage::DumpImage(LAMMPS *lmp, int narg, char **arg) : error->all(FLERR,"Invalid dump image subbox diameter {}", subboxdiam); iarg += 3; - } else if (strcmp(arg[iarg],"shading") == 0) { - if (iarg+2 > narg) utils::missing_cmd_args(FLERR,"dump image shading", error); - if (strcmp(arg[iarg+1],"phong") == 0) image->shading = Image::SHADE_PHONG; - else if (strcmp(arg[iarg+1],"diffuse") == 0) image->shading = Image::SHADE_DIFFUSE; - else if (strcmp(arg[iarg+1],"toon") == 0) image->shading = Image::SHADE_TOON; - else if (strcmp(arg[iarg+1],"gooch") == 0) image->shading = Image::SHADE_GOOCH; - else error->all(FLERR, iarg+1, "Unknown dump image shading style {}", arg[iarg+1]); - iarg += 2; - } else if (strcmp(arg[iarg],"shiny") == 0) { if (iarg+2 > narg) utils::missing_cmd_args(FLERR,"dump image shiny", error); double shiny = utils::numeric(FLERR,arg[iarg+1],false,lmp); @@ -3074,11 +3065,16 @@ int DumpImage::modify_param(int narg, char **arg) if (strcmp(arg[0], "specular") == 0) { if (narg < 2) utils::missing_cmd_args(FLERR, "dump_modify specular", error); + if (strcmp(arg[1], "none") == 0) { + image->nospecular = 1; + return 2; + } if (strcmp(arg[1], "wide") == 0) image->specularHardness = 10.0; else if (strcmp(arg[1], "narrow") == 0) image->specularHardness = 50.0; else if (strcmp(arg[1], "tight") == 0) image->specularHardness = 200.0; else error->all(FLERR, argoff + 1, "Unknown specular setting {}", arg[1]); image->specularflag = 1; + image->nospecular = 0; return 2; } diff --git a/src/GRAPHICS/image.cpp b/src/GRAPHICS/image.cpp index 77f96846712..f56ac335ab2 100644 --- a/src/GRAPHICS/image.cpp +++ b/src/GRAPHICS/image.cpp @@ -361,7 +361,6 @@ Image::Image(LAMMPS *lmp, int nmap_caller) : zoom = 1.0; shiny = 1.0; gamma = 1.0; - shading = SHADE_PHONG; ssao = NO; fastssao = 0; fsaa = NO; @@ -410,6 +409,7 @@ Image::Image(LAMMPS *lmp, int nmap_caller) : backLightColor[2] = 0.9; specularflag = 0; + nospecular = 0; specularHardness = 16.0; specularIntensity = 1.0; @@ -748,9 +748,10 @@ void Image::view_params(double boxxlo, double boxxhi, double boxylo, setup_lights(); // the brightness of the specular highlights follows shiny; their width - // also follows shiny unless set with a dump_modify specular preset + // also follows shiny unless set with a dump_modify specular preset; + // dump_modify specular none disables the highlights entirely - specularIntensity = shiny; + specularIntensity = nospecular ? 0.0 : shiny; if (!specularflag) specularHardness = 16.0 * shiny; // adjust strength of the SSAO @@ -1778,73 +1779,40 @@ void Image::draw_pixel(int ix, int iy, double depth, const double *surface, surfaceBuffer[0 + ix * 2 + iy*width * 2] = surface[1]; surfaceBuffer[1 + ix * 2 + iy*width * 2] = -surface[0]; - double c[3]; - - if ((shading == SHADE_PHONG) || (shading == SHADE_DIFFUSE)) { - - // three-light rig with lambertian diffuse shading and a specular - // highlight from the key light; the diffuse style skips the highlight - - diffuseKey = saturate(MathExtra::dot3(surface, keyLightDir)); - diffuseFill = saturate(MathExtra::dot3(surface, fillLightDir)); - diffuseBack = saturate(MathExtra::dot3(surface, backLightDir)); - - c[0] = surfaceColor[0] * ambientColor[0]; - c[1] = surfaceColor[1] * ambientColor[1]; - c[2] = surfaceColor[2] * ambientColor[2]; - - c[0] += surfaceColor[0] * keyLightColor[0] * diffuseKey; - c[1] += surfaceColor[1] * keyLightColor[1] * diffuseKey; - c[2] += surfaceColor[2] * keyLightColor[2] * diffuseKey; - - if (shading == SHADE_PHONG) { - specularKey = pow(saturate(MathExtra::dot3(surface, keyHalfDir)), - specularHardness) * specularIntensity; - - c[0] += keyLightColor[0] * specularKey; - c[1] += keyLightColor[1] * specularKey; - c[2] += keyLightColor[2] * specularKey; - } + diffuseKey = saturate(MathExtra::dot3(surface, keyLightDir)); + diffuseFill = saturate(MathExtra::dot3(surface, fillLightDir)); + diffuseBack = saturate(MathExtra::dot3(surface, backLightDir)); - c[0] += surfaceColor[0] * fillLightColor[0] * diffuseFill; - c[1] += surfaceColor[1] * fillLightColor[1] * diffuseFill; - c[2] += surfaceColor[2] * fillLightColor[2] * diffuseFill; - - c[0] += surfaceColor[0] * backLightColor[0] * diffuseBack; - c[1] += surfaceColor[1] * backLightColor[1] * diffuseBack; - c[2] += surfaceColor[2] * backLightColor[2] * diffuseBack; - - } else if (shading == SHADE_TOON) { - - // cartoon-style shading: quantize the diffuse term of the key light - // into three bands; no other lights except the ambient light - - diffuseKey = saturate(MathExtra::dot3(surface, keyLightDir)); - const double band = (diffuseKey < 0.3) ? 0.4 : (diffuseKey < 0.7) ? 0.7 : 1.0; - - c[0] = surfaceColor[0] * (ambientColor[0] + keyLightColor[0] * band); - c[1] = surfaceColor[1] * (ambientColor[1] + keyLightColor[1] * band); - c[2] = surfaceColor[2] * (ambientColor[2] + keyLightColor[2] * band); + double c[3]; + c[0] = surfaceColor[0] * ambientColor[0]; + c[1] = surfaceColor[1] * ambientColor[1]; + c[2] = surfaceColor[2] * ambientColor[2]; - } else { + c[0] += surfaceColor[0] * keyLightColor[0] * diffuseKey; + c[1] += surfaceColor[1] * keyLightColor[1] * diffuseKey; + c[2] += surfaceColor[2] * keyLightColor[2] * diffuseKey; - // cool-to-warm shading for technical illustrations following - // Gooch, Gooch, Shirley, Cohen, SIGGRAPH 1998: blend from a cool - // (blue) tone away from the light to a warm (yellow) tone toward - // the light, plus the specular highlight from the key light + // specular highlights are disabled with dump_modify specular none. + // check the flag here since view_params() may not run again after + // dump_modify for static views - const double t = 0.5 * (1.0 + MathExtra::dot3(surface, keyLightDir)); + if (!nospecular && (specularIntensity > 0.0)) { specularKey = pow(saturate(MathExtra::dot3(surface, keyHalfDir)), specularHardness) * specularIntensity; - c[0] = (1.0 - t) * (0.25 * surfaceColor[0]) + - t * (0.3 + 0.5 * surfaceColor[0]) + keyLightColor[0] * specularKey; - c[1] = (1.0 - t) * (0.25 * surfaceColor[1]) + - t * (0.3 + 0.5 * surfaceColor[1]) + keyLightColor[1] * specularKey; - c[2] = (1.0 - t) * (0.55 + 0.25 * surfaceColor[2]) + - t * (0.5 * surfaceColor[2]) + keyLightColor[2] * specularKey; + c[0] += keyLightColor[0] * specularKey; + c[1] += keyLightColor[1] * specularKey; + c[2] += keyLightColor[2] * specularKey; } + c[0] += surfaceColor[0] * fillLightColor[0] * diffuseFill; + c[1] += surfaceColor[1] * fillLightColor[1] * diffuseFill; + c[2] += surfaceColor[2] * fillLightColor[2] * diffuseFill; + + c[0] += surfaceColor[0] * backLightColor[0] * diffuseBack; + c[1] += surfaceColor[1] * backLightColor[1] * diffuseBack; + c[2] += surfaceColor[2] * backLightColor[2] * diffuseBack; + c[0] = saturate(c[0]); c[1] = saturate(c[1]); c[2] = saturate(c[2]); diff --git a/src/GRAPHICS/image.h b/src/GRAPHICS/image.h index a896ae5e32e..41bbb5ebac0 100644 --- a/src/GRAPHICS/image.h +++ b/src/GRAPHICS/image.h @@ -28,9 +28,6 @@ class Image : protected Pointers { // how DumpImage allocates and addresses them (amap/gmap/bmap). enum { ATOM_MAP = 0, GRID_MAP = 1, BOND_MAP = 2 }; - // shading styles - enum { SHADE_PHONG = 0, SHADE_DIFFUSE = 1, SHADE_TOON = 2, SHADE_GOOCH = 3 }; - int width, height; // size of image double theta, phi; // view image from theta,phi double xctr, yctr, zctr; // center of image in user coords @@ -38,7 +35,6 @@ class Image : protected Pointers { double zoom; // zoom factor double shiny; // shininess of objects double gamma; // gamma correction of rendered objects, 1.0 = off - int shading; // shading style for rendered objects int fsaa; // antialiasing on or off int ssao; // SSAO on or off int fastssao; // 1 = fast depth-darkening algorithm, 0 = classic SSAO @@ -62,6 +58,7 @@ class Image : protected Pointers { double backLightColor[3]; int specularflag; // 1 if the specular exponent is set explicitly + int nospecular; // 1 = disable the specular highlight entirely double specularHardness; // exponent of the specular highlight Image(class LAMMPS *, int); diff --git a/unittest/graphics/tests/dump-image-shading-gooch.yaml b/unittest/graphics/tests/dump-image-shading-gooch.yaml deleted file mode 100644 index 88017aee01a..00000000000 --- a/unittest/graphics/tests/dump-image-shading-gooch.yaml +++ /dev/null @@ -1,603 +0,0 @@ ---- -lammps_version: 4 Jul 2026 -tags: graphics -date_generated: Fri Jul 24 15:24:55 2026 -epsilon_projection: 0.5 -epsilon_blocks: 2 -nprocs: 1 -prerequisites: | - atom full - pair lj/charmm/coul/charmm - bond harmonic - angle charmm - dihedral charmm - improper harmonic -setup_commands: | - units real - atom_style full - pair_style lj/charmm/coul/charmm 8.0 10.0 - bond_style harmonic - angle_style charmm - dihedral_style charmm - improper_style harmonic - read_data ${input_dir}/data.peptide - neighbor 2.0 bin - dump viz all image 1 ${imagefile} type type size 200 200 zoom 1.5 view 60 30 shiny 0.2 box yes 0.02 bond atom 0.3 shading gooch - dump_modify viz backcolor gray -run_commands: | - run 0 -image_size: 200 200 -sampling: 3 16 -row_means: | - 125.29 130.38 120.44 - 121.51 126.94 121.86 - 123.00 127.03 121.45 - 126.38 128.46 120.51 - 124.73 127.00 120.24 - 124.65 127.72 120.56 - 126.45 128.91 121.27 - 128.75 130.94 121.59 - 128.21 130.07 121.39 - 126.90 129.75 120.94 - 128.25 131.19 120.39 - 127.83 130.82 121.15 - 122.47 129.00 119.05 - 118.16 128.66 117.53 - 115.90 132.18 117.02 - 114.17 129.82 118.09 - 108.86 123.54 117.67 - 109.28 120.92 117.19 - 115.52 125.14 117.91 - 112.28 123.81 118.37 - 105.33 119.40 118.86 - 104.81 123.52 119.62 - 101.19 121.81 120.17 - 99.92 120.25 120.34 - 98.56 119.10 119.58 - 101.78 121.66 119.23 - 106.89 123.62 120.15 - 104.95 122.10 119.00 - 98.42 117.36 117.99 - 100.98 117.67 118.52 - 97.67 115.69 117.48 - 95.09 114.79 117.52 - 98.43 120.20 118.47 - 100.77 123.49 118.45 - 97.22 121.00 119.09 - 95.25 117.77 120.42 - 99.42 118.30 119.06 - 99.38 118.76 118.69 - 97.16 120.15 117.67 - 96.34 121.66 116.50 - 96.75 120.86 116.59 - 95.64 118.49 116.31 - 93.56 118.17 114.94 - 96.80 116.77 114.21 - 92.45 114.75 113.39 - 92.82 117.57 114.50 - 94.31 118.72 116.41 - 90.06 116.38 115.55 - 90.04 115.16 113.90 - 91.30 116.81 114.24 - 98.65 121.70 112.84 - 101.01 121.53 113.11 - 92.87 117.84 112.09 - 94.09 118.19 111.96 - 94.63 116.14 113.34 - 98.85 121.06 112.27 - 103.44 127.08 112.51 - 105.98 128.15 111.98 - 103.28 124.08 113.89 - 100.69 118.67 113.19 - 101.97 119.03 110.44 - 99.70 116.38 109.69 - 102.75 122.90 109.33 - 101.77 125.61 110.47 - 97.22 123.77 112.62 - 93.15 120.31 113.34 - 95.04 121.33 113.36 - 101.22 124.90 113.44 - 99.50 124.53 114.06 - 101.08 119.72 112.84 - 94.66 111.40 113.64 - 97.45 110.72 110.86 - 97.50 114.02 111.59 - 91.58 112.73 112.60 - 90.51 119.09 113.11 - 93.61 123.69 112.53 - 93.01 118.94 112.83 - 91.34 115.14 113.48 - 91.44 113.38 115.42 - 95.52 117.75 115.23 - 99.66 125.80 113.88 - 100.06 126.48 114.28 - 94.19 118.84 113.45 - 92.55 117.08 114.58 - 92.80 114.58 115.81 - 93.83 118.54 117.58 - 91.01 121.57 117.12 - 90.33 119.97 119.44 - 82.22 116.34 115.47 - 81.80 114.17 117.17 - 80.96 113.62 117.19 - 83.38 112.16 116.09 - 80.06 111.30 117.55 - 82.30 114.20 117.94 - 83.16 115.47 118.44 - 82.44 112.98 117.67 - 86.78 116.61 116.08 - 91.69 121.06 118.47 - 91.58 117.65 118.65 - 85.68 109.16 119.86 - 90.00 114.73 120.87 - 91.84 113.55 118.78 - 90.64 115.06 115.92 - 87.43 118.19 116.09 - 87.69 119.84 116.33 - 78.28 114.45 117.55 - 75.27 108.56 119.20 - 79.31 107.64 117.26 - 78.59 105.35 119.45 - 83.24 105.44 120.00 - 86.47 105.66 117.82 - 85.54 104.94 118.70 - 89.78 119.94 115.36 - 88.91 124.69 117.87 - 82.64 118.05 116.59 - 81.49 114.97 115.56 - 84.75 112.80 116.67 - 88.68 120.06 114.52 - 87.53 114.81 115.30 - 89.39 114.39 116.45 - 87.30 110.23 120.00 - 88.13 110.83 118.19 - 84.26 112.48 117.53 - 84.59 115.59 115.96 - 81.12 113.33 116.28 - 80.69 109.81 118.39 - 81.64 110.81 116.56 - 80.11 112.00 116.55 - 80.92 114.23 116.76 - 86.71 119.52 117.14 - 87.77 118.50 118.33 - 88.22 119.05 117.44 - 87.47 116.77 117.69 - 87.12 113.28 120.77 - 91.22 113.45 119.36 - 85.64 113.14 118.22 - 90.94 121.19 118.17 - 93.44 124.30 117.43 - 89.21 117.73 116.22 - 87.73 114.10 114.25 - 90.73 113.36 117.41 - 85.83 113.23 117.13 - 79.65 107.84 119.15 - 78.65 110.28 118.97 - 84.33 113.66 118.69 - 88.12 116.44 118.03 - 92.59 116.43 117.11 - 95.06 118.28 114.38 - 97.74 122.08 114.84 - 95.31 118.61 116.93 - 95.46 120.83 117.30 - 91.81 118.39 120.11 - 94.63 121.42 118.22 - 91.58 118.70 116.47 - 91.28 121.01 115.64 - 87.91 117.19 116.28 - 87.58 115.54 117.08 - 87.92 113.80 118.38 - 91.02 111.70 120.52 - 94.70 113.39 120.94 - 99.25 118.32 119.86 - 103.23 123.29 119.46 - 104.89 127.42 117.25 - 101.17 125.11 117.12 - 101.51 122.70 117.02 - 103.94 125.39 116.30 - 102.67 123.80 117.25 - 99.06 117.16 118.45 - 99.47 115.84 119.30 - 100.08 115.79 120.28 - 106.33 119.86 119.33 - 104.88 123.81 118.39 - 105.62 128.00 118.33 - 104.40 124.36 118.14 - 102.59 119.08 119.80 - 107.35 119.27 120.95 - 115.59 126.67 121.64 - 116.41 128.41 122.06 - 116.92 126.80 120.22 - 119.39 126.89 118.84 - 114.64 124.20 119.30 - 118.49 127.24 118.36 - 118.92 130.04 118.76 - 119.92 131.25 118.31 - 119.89 129.10 119.64 - 120.94 127.58 119.59 - 123.78 126.37 119.06 - 123.02 125.70 119.10 - 121.67 125.97 119.14 - 123.01 127.23 119.69 - 124.53 128.75 119.92 - 123.91 127.81 119.95 - 125.56 127.77 119.42 - 126.16 130.81 118.55 - 124.33 129.58 118.47 - 121.79 127.20 120.25 - 122.63 127.72 121.71 - 123.12 127.98 122.00 - 127.06 129.74 120.74 - 130.28 131.18 120.64 -col_means: | - 129.40 132.06 121.56 - 128.09 131.88 121.39 - 127.69 130.85 121.70 - 125.14 129.28 121.84 - 123.23 129.10 121.03 - 122.62 128.97 121.43 - 120.23 129.59 120.57 - 117.84 128.38 119.48 - 117.31 126.97 119.66 - 117.72 127.31 118.48 - 114.56 124.33 119.17 - 113.28 121.56 120.11 - 112.44 119.58 120.97 - 114.56 123.70 119.54 - 112.97 122.94 119.49 - 112.72 123.94 120.07 - 112.81 126.39 119.89 - 111.81 125.65 119.55 - 110.66 124.36 119.01 - 109.49 123.63 119.28 - 108.77 122.50 119.55 - 108.53 120.66 118.94 - 109.03 120.34 118.67 - 107.41 120.69 117.42 - 103.70 120.78 116.34 - 101.22 120.31 117.53 - 98.06 115.28 119.76 - 99.33 114.25 119.58 - 103.38 118.28 119.12 - 107.19 126.89 116.67 - 107.61 126.93 117.38 - 104.84 125.38 118.05 - 98.98 121.36 118.75 - 101.51 120.36 119.88 - 105.44 119.95 119.15 - 101.81 120.17 117.33 - 106.02 122.91 116.21 - 107.75 127.92 116.41 - 102.62 125.09 116.74 - 96.95 117.80 118.98 - 97.49 115.89 119.97 - 102.06 121.73 117.58 - 103.78 125.08 116.67 - 101.11 124.09 116.14 - 98.45 126.87 115.69 - 97.25 125.08 116.01 - 95.45 117.54 117.33 - 95.30 114.31 116.39 - 93.91 113.11 117.35 - 93.29 112.25 117.69 - 98.48 121.89 116.94 - 97.48 124.24 116.78 - 97.47 122.69 117.35 - 97.47 122.06 118.24 - 95.61 118.53 119.25 - 96.28 114.38 117.73 - 96.59 114.78 118.44 - 97.34 118.39 118.22 - 97.78 119.51 118.53 - 88.70 114.14 117.32 - 94.11 117.21 118.94 - 95.05 122.11 116.25 - 92.00 122.03 116.96 - 85.72 117.03 116.31 - 85.18 118.14 116.31 - 84.31 116.92 117.99 - 85.78 114.50 115.25 - 85.17 113.66 116.81 - 91.66 119.31 117.52 - 89.86 116.24 116.66 - 91.22 117.65 117.92 - 88.28 120.84 117.96 - 88.44 122.36 112.91 - 87.11 120.86 115.39 - 83.75 115.86 117.92 - 86.23 115.08 119.07 - 84.86 108.40 118.89 - 83.84 111.63 117.28 - 87.06 120.61 117.00 - 87.59 122.00 116.52 - 85.39 119.65 116.77 - 82.06 119.40 117.22 - 88.56 125.58 115.82 - 86.13 121.83 118.52 - 86.67 116.30 117.86 - 87.37 112.03 117.95 - 86.34 113.16 117.88 - 90.22 112.81 117.14 - 89.70 109.77 118.08 - 87.12 107.31 117.25 - 88.16 107.89 118.71 - 94.91 116.09 118.16 - 97.68 124.56 116.13 - 99.33 129.00 113.75 - 95.92 125.88 112.08 - 98.67 126.11 113.84 - 98.44 119.76 116.22 - 92.23 112.70 117.64 - 91.64 111.81 119.27 - 92.70 116.91 116.82 - 88.34 119.58 115.17 - 86.64 117.14 115.60 - 85.88 113.70 116.19 - 82.33 110.75 116.66 - 78.67 110.13 118.45 - 88.44 119.42 116.64 - 88.78 117.41 115.06 - 90.47 118.00 113.56 - 94.69 117.77 112.77 - 94.89 116.81 112.17 - 89.80 115.66 113.11 - 84.48 114.70 116.32 - 83.94 115.12 117.84 - 85.34 117.95 116.52 - 84.08 116.14 114.41 - 84.39 114.54 116.42 - 87.58 117.00 115.72 - 81.02 110.77 118.75 - 79.80 107.18 118.93 - 82.18 105.84 119.75 - 89.87 110.08 119.56 - 90.59 111.64 118.44 - 91.44 110.83 117.07 - 91.86 114.99 118.06 - 92.37 120.03 114.17 - 91.51 122.03 115.67 - 144.31 141.97 66.81 - 142.74 143.66 79.84 - 120.12 122.34 90.02 - 85.78 108.81 118.42 - 93.27 115.61 116.78 - 89.87 114.01 117.28 - 90.13 117.92 115.30 - 86.66 118.40 116.81 - 86.43 115.95 117.19 - 89.53 111.94 119.64 - 88.76 112.88 119.95 - 93.50 114.10 118.17 - 94.84 119.23 115.64 - 94.10 123.61 115.78 - 90.94 118.97 115.47 - 85.36 115.88 116.77 - 88.34 117.78 116.89 - 90.00 120.83 116.80 - 88.38 119.64 115.25 - 84.83 116.87 115.98 - 87.76 116.61 116.51 - 87.52 116.44 116.28 - 88.33 115.02 116.28 - 90.23 113.11 115.25 - 90.92 115.28 116.21 - 90.66 117.24 115.56 - 92.90 120.71 116.39 - 93.39 119.92 116.83 - 93.27 118.91 117.83 - 92.52 118.06 116.33 - 92.03 114.81 115.58 - 89.34 111.76 117.50 - 95.78 121.11 115.25 - 98.39 125.20 117.30 - 95.38 121.51 118.51 - 96.73 118.97 118.78 - 95.22 114.71 119.15 - 101.97 118.94 116.72 - 97.59 116.73 115.67 - 102.78 124.85 114.83 - 101.81 121.11 115.70 - 98.30 118.07 116.92 - 97.84 115.85 118.17 - 102.77 119.19 120.09 - 102.72 121.70 119.22 - 102.34 120.44 119.20 - 100.09 115.85 119.77 - 103.84 118.04 119.34 - 110.50 123.19 119.55 - 110.56 121.07 119.20 - 107.69 118.92 120.17 - 108.65 117.58 121.92 - 117.67 127.30 118.92 - 114.55 128.90 119.32 - 114.99 129.45 118.92 - 110.53 126.14 118.73 - 107.35 123.08 120.53 - 107.05 121.50 120.59 - 107.39 119.73 121.69 - 111.58 123.25 121.28 - 116.82 125.33 119.91 - 116.86 124.75 118.84 - 114.66 122.08 119.75 - 114.49 122.86 120.19 - 115.42 124.66 120.19 - 117.12 125.60 121.44 - 119.92 126.04 122.33 - 121.69 126.63 122.58 - 122.73 127.33 121.94 - 126.00 128.40 121.80 - 128.21 129.99 120.52 - 126.70 128.79 121.61 - 125.33 127.00 122.77 - 127.23 127.25 122.99 -sample_blocks: | - 2 2 128.00 128.00 128.00 - 2 18 128.00 128.00 128.00 - 2 34 128.00 128.00 128.00 - 2 50 158.89 144.11 63.33 - 2 66 128.00 128.00 128.00 - 2 82 117.67 148.00 117.11 - 2 98 113.78 127.11 123.33 - 2 114 88.78 88.78 117.67 - 2 130 130.56 128.78 120.11 - 2 146 158.11 151.78 98.00 - 2 162 128.00 128.00 128.00 - 2 178 128.00 128.00 128.00 - 2 194 128.00 128.00 128.00 - 18 2 128.00 128.00 128.00 - 18 18 128.00 128.00 128.00 - 18 34 120.33 111.44 102.11 - 18 50 128.00 128.00 128.00 - 18 66 128.00 128.00 128.00 - 18 82 64.89 70.67 118.56 - 18 98 51.89 94.33 121.67 - 18 114 101.33 101.33 117.56 - 18 130 102.89 132.56 107.22 - 18 146 99.22 117.11 125.22 - 18 162 128.00 128.00 128.00 - 18 178 97.11 142.11 110.00 - 18 194 208.56 190.00 48.67 - 34 2 128.00 128.00 128.00 - 34 18 106.78 150.78 115.00 - 34 34 128.00 128.00 128.00 - 34 50 56.89 89.78 122.33 - 34 66 128.00 128.00 128.00 - 34 82 65.33 98.00 132.78 - 34 98 128.00 128.00 128.00 - 34 114 74.22 89.22 112.67 - 34 130 62.56 118.78 123.33 - 34 146 105.33 105.33 130.11 - 34 162 121.44 128.56 123.78 - 34 178 91.22 155.00 113.67 - 34 194 128.00 128.00 128.00 - 50 2 182.11 170.00 76.44 - 50 18 128.00 128.00 128.00 - 50 34 96.00 96.00 108.67 - 50 50 85.89 149.89 108.33 - 50 66 87.00 124.67 110.22 - 50 82 71.00 94.33 117.56 - 50 98 78.78 108.89 110.22 - 50 114 84.56 90.00 110.89 - 50 130 114.44 145.00 113.56 - 50 146 60.44 95.78 119.22 - 50 162 71.11 130.44 115.78 - 50 178 128.00 128.00 128.00 - 50 194 128.00 128.00 128.00 - 66 2 128.00 128.00 128.00 - 66 18 60.44 116.56 123.00 - 66 34 107.22 107.22 114.67 - 66 50 59.56 116.56 119.33 - 66 66 143.67 157.56 76.00 - 66 82 58.33 84.33 114.67 - 66 98 66.00 92.67 116.56 - 66 114 77.11 100.00 115.67 - 66 130 69.11 128.44 114.78 - 66 146 95.44 115.78 117.22 - 66 162 117.44 123.11 128.00 - 66 178 85.33 101.89 130.44 - 66 194 114.89 128.33 123.56 - 82 2 128.00 128.00 128.00 - 82 18 119.33 119.33 119.78 - 82 34 104.78 115.00 131.00 - 82 50 80.56 123.33 107.89 - 82 66 70.89 117.00 115.56 - 82 82 59.00 114.67 123.44 - 82 98 95.00 136.78 113.44 - 82 114 181.11 173.33 64.22 - 82 130 157.22 149.89 60.56 - 82 146 76.44 122.67 115.33 - 82 162 82.56 112.11 124.89 - 82 178 128.00 128.00 128.00 - 82 194 128.00 128.00 128.00 - 98 2 128.00 128.00 128.00 - 98 18 128.00 128.00 128.00 - 98 34 86.56 116.44 109.22 - 98 50 87.56 93.22 123.33 - 98 66 88.33 144.67 110.67 - 98 82 78.78 106.89 105.56 - 98 98 60.33 116.89 120.89 - 98 114 96.22 162.00 107.78 - 98 130 76.33 96.11 115.33 - 98 146 83.22 144.89 117.89 - 98 162 89.11 146.56 105.11 - 98 178 109.22 109.22 121.22 - 98 194 128.00 128.00 128.00 - 114 2 128.00 128.00 128.00 - 114 18 54.00 89.33 126.11 - 114 34 99.44 110.67 125.11 - 114 50 89.78 153.44 114.56 - 114 66 48.67 102.89 120.89 - 114 82 92.22 156.67 110.56 - 114 98 91.33 121.11 106.56 - 114 114 101.33 123.67 108.22 - 114 130 57.11 107.00 116.11 - 114 146 75.78 96.11 112.56 - 114 162 59.33 102.67 113.22 - 114 178 109.67 121.67 126.00 - 114 194 128.00 128.00 128.00 - 130 2 128.00 128.00 128.00 - 130 18 84.22 114.78 121.89 - 130 34 108.44 129.22 118.78 - 130 50 81.44 124.00 108.56 - 130 66 78.89 140.67 112.78 - 130 82 107.00 118.11 128.00 - 130 98 94.11 159.56 106.67 - 130 114 59.56 109.22 120.44 - 130 130 111.33 120.22 91.22 - 130 146 58.22 88.89 126.00 - 130 162 69.89 88.44 114.44 - 130 178 128.00 128.00 128.00 - 130 194 128.00 128.00 128.00 - 146 2 128.00 128.00 128.00 - 146 18 65.44 77.22 113.78 - 146 34 43.11 94.78 128.67 - 146 50 60.67 68.22 118.78 - 146 66 92.44 137.22 98.78 - 146 82 122.22 129.56 123.22 - 146 98 76.44 130.67 113.67 - 146 114 52.22 57.33 133.67 - 146 130 36.00 66.78 134.56 - 146 146 59.44 103.67 119.00 - 146 162 79.44 79.44 116.78 - 146 178 100.44 100.44 120.44 - 146 194 167.67 159.33 89.33 - 162 2 128.00 128.00 128.00 - 162 18 98.22 132.56 94.78 - 162 34 111.33 125.67 116.56 - 162 50 128.00 128.00 128.00 - 162 66 62.22 68.00 123.67 - 162 82 99.00 125.44 118.89 - 162 98 115.78 120.56 130.33 - 162 114 81.33 110.89 125.00 - 162 130 107.22 118.44 127.78 - 162 146 62.78 104.00 125.00 - 162 162 65.67 109.67 113.11 - 162 178 128.00 128.00 128.00 - 162 194 128.00 128.00 128.00 - 178 2 195.00 182.11 72.89 - 178 18 128.00 128.00 128.00 - 178 34 84.00 113.44 127.89 - 178 50 128.00 128.00 128.00 - 178 66 71.78 71.78 117.00 - 178 82 95.00 110.89 131.00 - 178 98 128.00 128.00 128.00 - 178 114 73.78 105.00 111.67 - 178 130 89.44 89.44 127.11 - 178 146 58.00 113.78 122.67 - 178 162 128.00 128.00 128.00 - 178 178 128.00 128.00 128.00 - 178 194 128.00 128.00 128.00 - 194 2 128.00 128.00 128.00 - 194 18 128.00 128.00 128.00 - 194 34 128.00 128.00 128.00 - 194 50 172.67 160.67 78.56 - 194 66 96.11 121.11 123.00 - 194 82 128.00 128.00 128.00 - 194 98 128.00 128.00 128.00 - 194 114 77.22 130.67 114.22 - 194 130 60.33 102.22 119.22 - 194 146 128.00 128.00 128.00 - 194 162 128.00 128.00 128.00 - 194 178 128.00 128.00 128.00 - 194 194 128.00 128.00 128.00 -... diff --git a/unittest/graphics/tests/dump-image-shading-toon.yaml b/unittest/graphics/tests/dump-image-shading-toon.yaml deleted file mode 100644 index ff73edd5468..00000000000 --- a/unittest/graphics/tests/dump-image-shading-toon.yaml +++ /dev/null @@ -1,603 +0,0 @@ ---- -lammps_version: 4 Jul 2026 -tags: graphics -date_generated: Fri Jul 24 15:24:55 2026 -epsilon_projection: 0.5 -epsilon_blocks: 2 -nprocs: 1 -prerequisites: | - atom full - pair lj/charmm/coul/charmm - bond harmonic - angle charmm - dihedral charmm - improper harmonic -setup_commands: | - units real - atom_style full - pair_style lj/charmm/coul/charmm 8.0 10.0 - bond_style harmonic - angle_style charmm - dihedral_style charmm - improper_style harmonic - read_data ${input_dir}/data.peptide - neighbor 2.0 bin - dump viz all image 1 ${imagefile} type type size 200 200 zoom 1.5 view 60 30 shiny 0.2 box yes 0.02 bond atom 0.3 shading toon - dump_modify viz backcolor gray -run_commands: | - run 0 -image_size: 200 200 -sampling: 3 16 -row_means: | - 114.31 121.38 112.08 - 110.45 117.56 114.73 - 110.36 115.77 114.26 - 115.48 118.51 113.30 - 115.00 118.34 111.52 - 115.59 119.80 111.36 - 119.78 123.24 112.78 - 123.11 126.31 115.57 - 123.17 125.25 114.81 - 119.57 123.70 114.18 - 119.48 124.08 114.64 - 119.14 123.28 113.88 - 108.72 117.64 109.61 - 96.39 112.39 108.27 - 86.16 111.52 106.33 - 86.77 110.23 102.43 - 86.47 105.00 96.97 - 84.74 98.81 98.92 - 88.72 102.03 105.28 - 84.19 102.03 108.12 - 72.25 94.25 108.91 - 68.14 96.44 108.56 - 63.17 92.80 103.88 - 65.76 94.58 100.95 - 68.30 96.67 98.62 - 70.97 99.52 101.43 - 76.56 101.00 106.16 - 72.72 97.58 104.92 - 61.39 87.33 101.17 - 61.55 85.74 101.83 - 58.03 84.34 97.83 - 56.24 85.31 96.58 - 60.38 93.61 99.69 - 63.77 97.80 102.08 - 59.47 92.57 97.91 - 61.84 92.02 95.86 - 69.66 95.32 97.86 - 64.56 93.19 99.59 - 56.88 91.23 99.21 - 53.52 90.36 98.83 - 52.91 88.52 97.71 - 53.92 85.86 94.00 - 45.41 80.79 91.64 - 54.24 83.17 90.13 - 53.07 84.21 84.99 - 48.74 85.29 91.17 - 43.32 80.52 96.56 - 34.98 74.17 94.30 - 36.69 72.68 91.34 - 38.66 75.28 90.88 - 49.20 84.50 94.01 - 56.05 86.06 92.92 - 44.95 79.64 84.39 - 48.47 82.00 83.50 - 52.66 81.59 82.67 - 56.59 89.63 88.17 - 60.69 95.33 89.39 - 63.63 96.44 92.28 - 65.00 94.47 92.81 - 61.21 86.34 92.38 - 55.80 80.39 90.01 - 54.26 77.98 86.08 - 53.30 83.07 86.80 - 50.52 87.75 87.45 - 48.60 87.94 84.71 - 47.81 85.08 83.60 - 55.01 90.70 88.58 - 54.50 89.11 95.23 - 51.76 90.13 94.87 - 57.91 83.27 91.02 - 51.73 74.30 83.53 - 52.63 71.75 83.14 - 48.47 72.74 88.21 - 41.22 72.17 87.34 - 39.44 81.56 86.23 - 41.06 85.45 90.54 - 41.06 77.21 88.90 - 41.41 74.62 87.02 - 46.77 76.98 85.68 - 54.71 86.45 89.35 - 54.18 93.52 92.79 - 50.93 89.78 92.58 - 44.90 79.28 89.72 - 45.73 78.87 87.94 - 49.01 79.92 89.47 - 49.66 85.85 95.55 - 43.70 88.86 99.34 - 43.02 85.55 98.86 - 26.38 75.96 93.19 - 23.04 69.45 89.65 - 23.18 70.22 90.88 - 25.71 68.80 92.06 - 23.82 68.86 89.75 - 30.86 76.44 91.98 - 32.77 78.32 92.06 - 31.50 75.28 92.75 - 32.77 77.07 97.31 - 39.17 82.66 99.51 - 43.02 80.92 98.26 - 43.02 74.38 93.05 - 47.49 82.48 99.48 - 46.08 77.03 100.11 - 39.81 76.73 100.27 - 29.34 76.14 97.93 - 27.02 74.84 96.38 - 19.34 69.22 87.56 - 22.54 66.44 85.04 - 25.73 64.33 89.62 - 24.45 59.70 88.29 - 31.20 60.83 91.64 - 39.82 66.86 90.70 - 36.84 66.84 93.04 - 33.50 80.51 95.56 - 32.45 84.45 94.39 - 27.36 77.31 89.14 - 26.96 74.43 88.97 - 33.45 73.40 88.34 - 36.82 82.39 90.31 - 39.06 77.99 89.44 - 40.67 75.71 91.45 - 43.92 74.25 92.92 - 43.52 75.81 95.57 - 31.50 73.67 95.58 - 25.09 69.62 93.72 - 22.97 67.88 89.84 - 27.95 67.49 87.06 - 28.08 68.25 85.64 - 25.45 70.06 85.88 - 26.89 75.26 88.45 - 31.50 80.71 97.64 - 38.56 81.58 92.74 - 39.55 84.16 94.65 - 38.70 80.41 94.53 - 41.73 77.22 94.14 - 51.20 80.82 96.12 - 43.02 83.31 96.04 - 41.12 86.36 97.33 - 42.61 88.67 98.00 - 40.32 79.73 91.80 - 37.73 74.39 90.69 - 38.93 71.88 94.64 - 31.02 71.85 94.33 - 31.36 69.53 86.83 - 29.57 74.43 89.35 - 37.58 78.73 90.67 - 43.57 83.08 90.58 - 52.42 84.81 91.83 - 51.91 84.75 91.60 - 50.52 85.94 94.25 - 51.23 84.23 94.91 - 50.83 88.11 99.17 - 51.49 88.98 98.06 - 50.38 89.92 100.37 - 44.11 82.78 95.48 - 37.07 81.03 95.49 - 34.89 78.53 90.55 - 35.90 76.03 91.07 - 42.62 78.32 92.36 - 53.98 81.14 95.34 - 59.92 86.55 99.69 - 65.87 93.42 100.70 - 68.89 97.93 102.95 - 70.30 103.64 102.94 - 64.72 100.52 101.38 - 64.08 94.81 101.00 - 62.33 94.81 103.13 - 61.98 93.51 100.47 - 63.42 88.89 95.38 - 70.11 92.58 96.86 - 73.00 94.42 98.81 - 75.77 96.89 106.95 - 68.91 98.67 107.27 - 66.03 100.28 105.52 - 69.55 97.71 101.09 - 76.41 97.95 98.39 - 87.72 103.46 103.84 - 97.34 114.21 112.67 - 97.23 115.25 113.11 - 97.97 112.52 110.33 - 100.58 110.39 107.61 - 97.47 110.25 105.77 - 101.65 114.27 104.60 - 100.56 117.23 105.97 - 102.47 118.52 106.56 - 104.72 116.83 107.72 - 106.64 115.57 109.27 - 110.95 114.03 108.19 - 109.67 112.94 107.22 - 106.42 112.73 107.36 - 111.14 117.22 108.64 - 114.29 120.28 109.86 - 116.26 120.46 109.14 - 117.36 119.43 109.30 - 113.86 120.62 110.69 - 109.33 116.69 108.91 - 107.73 114.67 108.29 - 111.17 118.59 113.22 - 113.62 120.43 114.09 - 120.58 123.66 111.78 - 126.50 126.83 113.53 -col_means: | - 123.09 127.53 118.18 - 120.00 125.80 116.34 - 121.33 125.45 115.42 - 117.28 123.14 115.42 - 109.62 118.94 116.90 - 105.67 115.81 116.30 - 101.83 116.33 114.50 - 99.41 114.70 109.52 - 97.44 111.92 110.44 - 95.86 110.78 110.94 - 90.53 104.31 108.67 - 91.15 102.23 105.72 - 94.45 103.25 104.27 - 95.09 107.77 106.16 - 92.00 106.72 105.08 - 92.96 108.92 106.39 - 92.50 112.04 107.39 - 87.04 107.39 106.34 - 83.52 102.72 107.70 - 81.36 100.92 105.95 - 80.08 100.25 105.73 - 79.70 96.98 103.31 - 80.19 96.47 106.05 - 74.13 93.42 104.94 - 63.36 88.64 100.13 - 59.84 87.59 99.25 - 64.19 87.45 94.95 - 70.11 89.62 95.75 - 76.78 96.92 98.62 - 72.05 102.58 106.28 - 69.19 98.30 104.71 - 68.21 98.41 101.87 - 65.94 97.14 97.70 - 70.13 95.35 99.69 - 77.52 96.11 102.66 - 66.75 92.53 101.59 - 68.00 93.65 102.59 - 66.64 99.17 106.33 - 60.34 94.03 99.92 - 58.91 87.15 95.08 - 66.47 88.39 95.36 - 68.85 97.50 102.65 - 63.55 95.68 102.25 - 58.95 93.47 100.70 - 52.55 95.00 99.24 - 50.74 90.73 96.30 - 51.87 81.92 95.47 - 52.55 77.15 93.98 - 51.57 78.11 93.22 - 52.66 80.62 92.61 - 59.46 93.78 97.06 - 57.67 95.39 96.38 - 54.72 91.22 98.58 - 55.04 90.09 98.92 - 55.27 85.73 96.72 - 58.63 83.23 98.23 - 58.29 83.31 97.86 - 57.41 88.20 97.63 - 57.65 89.02 97.07 - 47.25 81.64 92.44 - 51.27 83.55 98.05 - 45.70 86.10 100.59 - 37.30 83.11 98.86 - 30.91 77.58 94.98 - 29.33 76.73 94.35 - 29.49 75.25 92.06 - 32.85 74.64 89.42 - 36.19 76.50 89.09 - 45.86 84.38 95.08 - 42.95 80.85 94.45 - 44.72 84.11 96.08 - 37.38 85.20 94.58 - 32.10 82.22 89.92 - 30.99 80.31 89.55 - 32.84 77.77 86.47 - 38.80 78.30 92.25 - 40.37 71.89 90.63 - 34.74 73.76 93.41 - 32.53 82.34 96.53 - 30.61 82.72 97.03 - 31.55 81.33 94.42 - 28.69 82.85 91.53 - 34.45 88.69 97.69 - 32.64 83.92 93.65 - 36.02 77.31 94.71 - 39.57 73.03 94.62 - 37.01 75.41 95.14 - 39.65 73.25 95.70 - 44.06 72.78 93.53 - 43.01 70.27 90.20 - 48.34 75.98 91.62 - 55.14 85.52 96.27 - 53.54 94.03 97.94 - 53.22 96.61 94.07 - 48.94 92.19 88.98 - 49.73 88.89 91.75 - 52.93 82.63 94.60 - 50.53 77.75 91.59 - 51.70 78.01 92.97 - 46.09 81.92 94.65 - 34.41 81.11 94.20 - 31.14 74.39 93.20 - 30.75 69.35 87.44 - 31.11 71.71 86.02 - 29.02 73.55 84.05 - 41.38 85.47 90.19 - 38.85 79.83 88.46 - 42.17 80.30 89.68 - 46.05 78.83 88.44 - 45.12 78.03 89.56 - 37.44 74.98 87.50 - 31.10 74.86 88.14 - 27.31 71.58 92.35 - 30.48 78.61 95.59 - 23.62 69.72 92.87 - 23.62 67.87 93.62 - 29.59 72.19 93.22 - 30.93 70.69 86.56 - 31.07 69.24 88.31 - 38.71 70.10 88.27 - 47.28 74.48 94.59 - 47.16 76.38 93.70 - 48.16 76.56 92.52 - 45.92 81.14 97.68 - 41.56 83.75 95.47 - 36.93 81.75 93.35 - 108.85 107.09 41.20 - 110.58 111.61 41.33 - 73.33 80.78 40.57 - 39.02 70.58 91.95 - 45.44 78.58 97.58 - 37.09 73.17 96.61 - 36.16 78.77 96.74 - 30.98 78.22 93.18 - 38.33 79.99 90.16 - 47.89 76.83 93.36 - 46.98 79.54 93.89 - 48.84 79.62 94.45 - 46.16 83.62 94.08 - 41.59 85.47 93.36 - 40.83 81.75 90.29 - 38.74 82.28 90.81 - 39.09 81.22 93.38 - 38.59 85.20 96.14 - 36.80 82.08 90.44 - 35.09 80.08 85.94 - 37.62 78.48 91.28 - 38.42 78.09 89.72 - 36.62 73.05 89.61 - 37.60 70.47 91.87 - 42.72 77.53 90.67 - 46.38 84.42 90.14 - 47.34 87.11 93.31 - 50.99 89.02 94.47 - 52.32 87.94 93.92 - 46.53 83.78 92.69 - 44.66 77.72 90.73 - 47.57 79.08 86.69 - 51.66 88.33 93.75 - 55.81 95.29 97.95 - 54.67 91.64 96.33 - 60.43 90.47 96.64 - 57.71 84.16 96.31 - 64.21 89.61 98.91 - 57.17 86.39 95.76 - 58.08 92.08 98.80 - 61.01 89.83 97.87 - 62.59 89.84 94.19 - 66.24 90.19 93.66 - 72.45 95.28 100.62 - 68.96 95.59 100.33 - 68.32 92.57 99.56 - 71.97 92.23 97.14 - 76.00 95.90 102.20 - 83.04 101.77 106.50 - 82.19 97.27 107.69 - 80.43 95.45 103.83 - 88.80 101.03 104.97 - 97.62 112.97 111.44 - 89.25 111.84 109.03 - 90.08 112.41 110.59 - 84.96 106.34 105.78 - 81.20 103.52 105.25 - 81.71 101.90 104.03 - 86.24 102.89 103.39 - 92.00 107.59 107.47 - 96.61 108.66 109.42 - 94.75 107.17 109.16 - 95.09 106.08 105.78 - 96.48 108.07 104.62 - 98.38 111.71 109.16 - 102.27 114.07 109.25 - 107.22 116.15 111.69 - 112.45 118.92 112.31 - 115.57 121.38 112.10 - 119.41 122.30 114.83 - 119.52 122.39 116.06 - 117.73 120.66 115.74 - 118.91 120.84 115.45 - 124.37 124.00 116.52 -sample_blocks: | - 2 2 128.00 128.00 128.00 - 2 18 128.00 128.00 128.00 - 2 34 128.00 128.00 128.00 - 2 50 148.78 127.78 14.22 - 2 66 128.00 128.00 128.00 - 2 82 71.11 126.67 126.67 - 2 98 99.56 114.78 114.78 - 2 114 0.00 0.00 95.56 - 2 130 123.89 122.33 113.78 - 2 146 161.67 149.67 85.33 - 2 162 128.00 128.00 128.00 - 2 178 128.00 128.00 128.00 - 2 194 128.00 128.00 128.00 - 18 2 128.00 128.00 128.00 - 18 18 128.00 128.00 128.00 - 18 34 111.00 100.44 42.67 - 18 50 128.00 128.00 128.00 - 18 66 128.00 128.00 128.00 - 18 82 0.00 5.56 74.78 - 18 98 0.00 51.22 66.44 - 18 114 42.67 42.67 113.33 - 18 130 14.22 65.56 121.11 - 18 146 85.33 102.00 102.00 - 18 162 128.00 128.00 128.00 - 18 178 0.00 83.33 116.56 - 18 194 198.33 167.22 0.00 - 34 2 128.00 128.00 128.00 - 34 18 42.67 117.56 117.56 - 34 34 128.00 128.00 128.00 - 34 50 0.00 40.11 62.33 - 34 66 128.00 128.00 128.00 - 34 82 42.67 80.11 80.11 - 34 98 128.00 128.00 128.00 - 34 114 0.00 27.78 91.56 - 34 130 0.00 74.78 74.78 - 34 146 99.56 99.56 110.67 - 34 162 113.78 123.44 123.44 - 34 178 0.00 108.11 108.11 - 34 194 128.00 128.00 128.00 - 50 2 164.67 145.56 42.67 - 50 18 128.00 128.00 128.00 - 50 34 0.00 0.00 112.33 - 50 50 0.00 99.78 99.78 - 50 66 0.00 69.44 104.00 - 50 82 0.00 26.33 87.44 - 50 98 42.33 70.00 70.00 - 50 114 0.00 5.56 104.00 - 50 130 42.67 98.22 126.00 - 50 146 0.00 37.44 74.89 - 50 162 0.00 87.22 87.22 - 50 178 128.00 128.00 128.00 - 50 194 128.00 128.00 128.00 - 66 2 128.00 128.00 128.00 - 66 18 0.00 70.67 70.67 - 66 34 56.89 56.89 122.11 - 66 50 0.00 70.67 70.67 - 66 66 119.56 131.22 30.44 - 66 82 0.00 30.44 66.44 - 66 98 0.00 34.56 70.56 - 66 114 0.00 26.33 95.78 - 66 130 0.00 83.22 83.22 - 66 146 82.33 100.56 79.11 - 66 162 113.78 119.33 119.33 - 66 178 71.11 87.78 93.33 - 66 194 99.56 118.89 118.89 - 82 2 128.00 128.00 128.00 - 82 18 85.33 85.33 127.00 - 82 34 99.56 110.67 110.67 - 82 50 0.00 70.78 99.89 - 82 66 0.00 72.11 91.44 - 82 82 0.00 66.56 66.56 - 82 98 42.67 105.00 105.00 - 82 114 147.44 134.00 19.33 - 82 130 146.33 131.22 19.78 - 82 146 0.00 72.11 95.67 - 82 162 56.89 92.89 92.89 - 82 178 128.00 128.00 128.00 - 82 194 128.00 128.00 128.00 - 98 2 128.00 128.00 128.00 - 98 18 128.00 128.00 128.00 - 98 34 28.44 79.78 104.67 - 98 50 56.89 62.44 93.00 - 98 66 0.00 94.33 108.22 - 98 82 0.00 43.00 95.67 - 98 98 0.00 66.44 66.44 - 98 114 0.00 112.33 112.33 - 98 130 0.00 24.89 87.33 - 98 146 0.00 95.56 95.56 - 98 162 14.22 112.67 112.67 - 98 178 85.33 85.33 114.44 - 98 194 128.00 128.00 128.00 - 114 2 128.00 128.00 128.00 - 114 18 14.22 51.67 62.78 - 114 34 85.33 96.44 106.11 - 114 50 0.00 99.78 99.78 - 114 66 0.00 66.56 66.56 - 114 82 0.00 108.22 108.22 - 114 98 0.00 55.56 112.44 - 114 114 28.44 70.11 117.22 - 114 130 0.00 61.11 70.78 - 114 146 0.00 33.33 91.56 - 114 162 0.00 51.33 74.89 - 114 178 99.56 110.67 110.67 - 114 194 128.00 128.00 128.00 - 130 2 128.00 128.00 128.00 - 130 18 56.89 97.11 97.11 - 130 34 85.33 118.56 118.56 - 130 50 39.67 91.11 69.67 - 130 66 0.00 91.44 91.44 - 130 82 99.56 110.67 110.67 - 130 98 0.00 112.44 112.44 - 130 114 0.00 61.00 70.67 - 130 130 82.89 99.89 58.67 - 130 146 0.00 44.44 70.78 - 130 162 0.00 24.89 87.22 - 130 178 128.00 128.00 128.00 - 130 194 128.00 128.00 128.00 - 146 2 128.00 128.00 128.00 - 146 18 0.00 11.11 83.22 - 146 34 0.00 54.11 54.11 - 146 50 0.00 13.89 70.67 - 146 66 0.00 79.11 120.78 - 146 82 113.78 127.67 127.67 - 146 98 0.00 73.44 83.11 - 146 114 28.44 34.00 67.33 - 146 130 0.00 33.33 58.33 - 146 146 14.22 73.89 79.44 - 146 162 0.00 0.00 87.22 - 146 178 71.11 71.11 101.56 - 146 194 165.22 150.44 71.11 - 162 2 128.00 128.00 128.00 - 162 18 20.22 86.56 88.78 - 162 34 85.33 108.89 122.78 - 162 50 128.00 128.00 128.00 - 162 66 14.22 19.78 71.00 - 162 82 71.11 114.11 114.11 - 162 98 113.78 119.33 119.33 - 162 114 56.89 93.00 93.00 - 162 130 99.56 110.67 110.67 - 162 146 28.44 75.56 75.56 - 162 162 0.00 59.56 87.33 - 162 178 128.00 128.00 128.00 - 162 194 128.00 128.00 128.00 - 178 2 195.33 171.33 42.67 - 178 18 128.00 128.00 128.00 - 178 34 56.89 93.00 93.00 - 178 50 128.00 128.00 128.00 - 178 66 0.00 0.00 83.11 - 178 82 85.33 102.00 102.00 - 178 98 128.00 128.00 128.00 - 178 114 0.00 36.00 87.33 - 178 130 71.11 71.11 93.33 - 178 146 0.00 74.78 74.78 - 178 162 128.00 128.00 128.00 - 178 178 128.00 128.00 128.00 - 178 194 128.00 128.00 128.00 - 194 2 128.00 128.00 128.00 - 194 18 128.00 128.00 128.00 - 194 34 128.00 128.00 128.00 - 194 50 164.67 145.56 42.67 - 194 66 71.11 101.56 101.56 - 194 82 128.00 128.00 128.00 - 194 98 128.00 128.00 128.00 - 194 114 14.22 87.67 87.67 - 194 130 0.00 47.11 74.89 - 194 146 128.00 128.00 128.00 - 194 162 128.00 128.00 128.00 - 194 178 128.00 128.00 128.00 - 194 194 128.00 128.00 128.00 -... diff --git a/unittest/graphics/tests/dump-image-shading-diffuse.yaml b/unittest/graphics/tests/dump-modify-specular-none.yaml similarity index 99% rename from unittest/graphics/tests/dump-image-shading-diffuse.yaml rename to unittest/graphics/tests/dump-modify-specular-none.yaml index c4991d192de..e81471da9a4 100644 --- a/unittest/graphics/tests/dump-image-shading-diffuse.yaml +++ b/unittest/graphics/tests/dump-modify-specular-none.yaml @@ -22,8 +22,8 @@ setup_commands: | improper_style harmonic read_data ${input_dir}/data.peptide neighbor 2.0 bin - dump viz all image 1 ${imagefile} type type size 200 200 zoom 1.5 view 60 30 shiny 0.2 box yes 0.02 bond atom 0.3 shading diffuse - dump_modify viz backcolor gray + dump viz all image 1 ${imagefile} type type size 200 200 zoom 1.5 view 60 30 shiny 0.2 box yes 0.02 bond atom 0.3 + dump_modify viz backcolor gray specular none run_commands: | run 0 image_size: 200 200 From 62760322d4f405b5b67f909177ac141323ab8c0e Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 24 Jul 2026 19:42:30 -0400 Subject: [PATCH 059/100] Revert "add fast depth-darkening style to the dump image ssao keyword" This reverts commit a06d162d03817b94e7e316108339f349e3f15bfc. Careful visual evaluation showed that the depth-darkening pass is not an approximation of the classic SSAO algorithm: unsharp-masking the depth buffer responds to large-scale depth contrast and silhouettes, but barely darkens the crevices between touching atoms that make the classic algorithm effective for molecular systems. The effect adds little over what the depthcue keyword already provides, so the 'ssao fast' mode is removed and the classic algorithm remains the only SSAO style. Also remove the spelling exceptions for the no longer cited reference. --- doc/src/dump_image.rst | 22 +- doc/utils/sphinx-config/false_positives.txt | 3 - src/GRAPHICS/dump_image.cpp | 8 +- src/GRAPHICS/image.cpp | 126 +--- src/GRAPHICS/image.h | 2 - .../graphics/tests/dump-image-ssao-fast.yaml | 603 ------------------ 6 files changed, 8 insertions(+), 756 deletions(-) delete mode 100644 unittest/graphics/tests/dump-image-ssao-fast.yaml diff --git a/doc/src/dump_image.rst b/doc/src/dump_image.rst index 861919d90a8..5c96c203b1a 100644 --- a/doc/src/dump_image.rst +++ b/doc/src/dump_image.rst @@ -112,8 +112,8 @@ Syntax *fsaa* arg = yes/no yes/no = do or do not apply anti-aliasing *ssao* value = shading seed dfactor = SSAO depth shading - shading = *yes* or *no* or *fast* = depth shading off, on, or on with the fast algorithm - seed = random # seed (positive integer, unused by the fast algorithm) + shading = *yes* or *no* = turn depth shading on/off + seed = random # seed (positive integer) dfactor = strength of shading from 0.0 to 1.0 *depthcue* values = cueing cfactor color start = depth cueing cueing = *yes* or *no* = turn depth cueing on/off @@ -885,18 +885,6 @@ reproducible, which avoids flickering shading in movies. Different .. versionadded:: TBD -Setting *fast* instead of *yes* selects an alternative depth shading -algorithm that blurs the depth buffer and darkens pixels that lie -behind the average depth of their surroundings :ref:`(Luft) `. -It produces a similar visual impression of depth in crevices and -contact regions at a small fraction of the computational cost of the -classic SSAO algorithm, and the resulting shading is smooth instead of -slightly grainy. The *seed* value is ignored in this case, but must -still be provided. The *dfactor* value scales the strength of the -shading as before. - -.. versionadded:: TBD - The *depthcue* keyword turns on/off depth cueing. If *yes* is set, rendered objects fade toward the fog color the more distant from the viewer they are, similar to looking through fog. This is perceived as @@ -1851,9 +1839,3 @@ the RGB (red/green/blue) values. * - |color_yellow| yellow: 1.000, 1.000, 0.000 - |color_yellowgreen| yellowgreen: 0.604, 0.804, 0.196 - - ----------- - -.. _Luft: - -**(Luft)** Luft, Colditz, Deussen, ACM Trans. Graph. 25, 1206-1213 (2006). diff --git a/doc/utils/sphinx-config/false_positives.txt b/doc/utils/sphinx-config/false_positives.txt index aa0ebb0de12..9d259ebaf65 100644 --- a/doc/utils/sphinx-config/false_positives.txt +++ b/doc/utils/sphinx-config/false_positives.txt @@ -609,7 +609,6 @@ COH cohesionless Coker Colberg -Colditz coleman Colliex collinear @@ -860,7 +859,6 @@ Destree destructor destructors detils -Deussen Devanathan devel Devemy @@ -1603,7 +1601,6 @@ hbond hcp hdnnp HDNNP -Luft runner RUNNER Hearn diff --git a/src/GRAPHICS/dump_image.cpp b/src/GRAPHICS/dump_image.cpp index 8f1d860d944..e50321449cc 100644 --- a/src/GRAPHICS/dump_image.cpp +++ b/src/GRAPHICS/dump_image.cpp @@ -612,13 +612,7 @@ DumpImage::DumpImage(LAMMPS *lmp, int narg, char **arg) : } else if (strcmp(arg[iarg],"ssao") == 0) { if (iarg+4 > narg) utils::missing_cmd_args(FLERR,"dump image ssao", error); - if (strcmp(arg[iarg+1],"fast") == 0) { - image->ssao = 1; - image->fastssao = 1; - } else { - image->ssao = utils::logical(FLERR,arg[iarg+1],false,lmp); - image->fastssao = 0; - } + image->ssao = utils::logical(FLERR,arg[iarg+1],false,lmp); int seed = utils::inumeric(FLERR,arg[iarg+2],false,lmp); if (seed <= 0) error->all(FLERR, iarg + 2, "Invalid dump image ssao seed {}", seed); image->seed = seed; diff --git a/src/GRAPHICS/image.cpp b/src/GRAPHICS/image.cpp index f56ac335ab2..f7bb61f7a77 100644 --- a/src/GRAPHICS/image.cpp +++ b/src/GRAPHICS/image.cpp @@ -362,7 +362,6 @@ Image::Image(LAMMPS *lmp, int nmap_caller) : shiny = 1.0; gamma = 1.0; ssao = NO; - fastssao = 0; fsaa = NO; depthcue = NO; depthcueint = 0.0; @@ -844,12 +843,6 @@ void Image::merge() { MPI_Request requests[3]; - // only the classic SSAO algorithm needs the surface buffer and the - // MPI-distributed shading pass; the fast algorithm and depth cueing - // are applied to the composited image on the output rank - - const int classic = ssao && !fastssao; - int nhalf = 1; while (nhalf < nprocs) nhalf *= 2; nhalf /= 2; @@ -858,10 +851,10 @@ void Image::merge() if (me < nhalf && me+nhalf < nprocs) { MPI_Irecv(rgbcopy,npixels*3,MPI_BYTE,me+nhalf,0,world,&requests[0]); MPI_Irecv(depthcopy,npixels,MPI_DOUBLE,me+nhalf,0,world,&requests[1]); - if (classic) + if (ssao) MPI_Irecv(surfacecopy,npixels*2,MPI_DOUBLE, me+nhalf,0,world,&requests[2]); - if (classic) MPI_Waitall(3,requests,MPI_STATUS_IGNORE); + if (ssao) MPI_Waitall(3,requests,MPI_STATUS_IGNORE); else MPI_Waitall(2,requests,MPI_STATUS_IGNORE); for (int i = 0; i < npixels; i++) { @@ -870,7 +863,7 @@ void Image::merge() imageBuffer[i*3+0] = rgbcopy[i*3+0]; imageBuffer[i*3+1] = rgbcopy[i*3+1]; imageBuffer[i*3+2] = rgbcopy[i*3+2]; - if (classic) { + if (ssao) { surfaceBuffer[i*2+0] = surfacecopy[i*2+0]; surfaceBuffer[i*2+1] = surfacecopy[i*2+1]; } @@ -880,7 +873,7 @@ void Image::merge() } else if (me >= nhalf && me < 2*nhalf) { MPI_Send(imageBuffer,npixels*3,MPI_BYTE,me-nhalf,0,world); MPI_Send(depthBuffer,npixels,MPI_DOUBLE,me-nhalf,0,world); - if (classic) MPI_Send(surfaceBuffer,npixels*2,MPI_DOUBLE,me-nhalf,0,world); + if (ssao) MPI_Send(surfaceBuffer,npixels*2,MPI_DOUBLE,me-nhalf,0,world); } nhalf /= 2; @@ -892,7 +885,7 @@ void Image::merge() // MPI_Gather() result back to proc 0 // use Gatherv() if subset of pixels is not the same size on every proc - if (classic) { + if (ssao) { MPI_Bcast(imageBuffer,npixels*3,MPI_BYTE,0,world); MPI_Bcast(surfaceBuffer,npixels*2,MPI_DOUBLE,0,world); MPI_Bcast(depthBuffer,npixels,MPI_DOUBLE,0,world); @@ -925,10 +918,6 @@ void Image::merge() writeBuffer = imageBuffer; } - // apply fast SSAO depth shading to the final composited image - - if (ssao && fastssao && (me == 0)) compute_SSAO_fast(); - // draw outlines at depth discontinuities if (outline && (me == 0)) compute_outline(); @@ -1967,111 +1956,6 @@ void Image::compute_SSAO() } } -/* ---------------------------------------------------------------------- - fast depth shading on the composited image on the output rank - following Luft, Colditz, Deussen, ACM Trans. Graph. 25, 1206 (2006): - blur the depth buffer with a separable gaussian kernel and darken - pixels that lie behind the local average depth in proportion to the - difference. reads as ambient occlusion in crevices and contact - regions at a fraction of the cost of the classic SSAO algorithm - and with no image noise. -------------------------------------------------------------------------- */ - -void Image::compute_SSAO_fast() -{ - // pixel radius of the blur kernel, same size as the classic SSAO radius - - const double pixelWidth = (tanPerPixel > 0) ? tanPerPixel : -tanPerPixel / zoom; - int pixelRadius = (int) trunc(SSAORadius / pixelWidth + 0.5); - if (pixelRadius < 1) pixelRadius = 1; - - // depth of the most distant drawn pixel substitutes for the background - // in the blur, so silhouettes against the background darken gently - - bool first = true; - double dmax = 0.0; - for (int i = 0; i < npixels; i++) { - const double d = depthBuffer[i]; - if (d < 0.0) continue; - if (first) { - dmax = d; - first = false; - } else { - dmax = MAX(dmax,d); - } - } - if (first) return; // no drawn pixels - - // normalized gaussian blur kernel with sigma = half the radius - - auto *kernel = new double[pixelRadius+1]; - const double sigma = 0.5 * pixelRadius; - double knorm = 0.0; - for (int k = 0; k <= pixelRadius; ++k) { - kernel[k] = exp(-0.5 * (k/sigma) * (k/sigma)); - knorm += (k > 0) ? 2.0*kernel[k] : kernel[k]; - } - for (int k = 0; k <= pixelRadius; ++k) kernel[k] /= knorm; - - auto *rowblur = new double[npixels]; - auto *blur = new double[npixels]; - - // blur along rows, then along columns; clamp indices at the borders - -#if defined(_OPENMP) -#pragma omp parallel for schedule(static) -#endif - for (int iy = 0; iy < height; ++iy) { - for (int ix = 0; ix < width; ++ix) { - double sum = 0.0; - for (int k = -pixelRadius; k <= pixelRadius; ++k) { - int jx = ix + k; - if (jx < 0) jx = 0; - if (jx >= width) jx = width - 1; - const double d = depthBuffer[iy*width + jx]; - sum += kernel[(k < 0) ? -k : k] * ((d < 0.0) ? dmax : d); - } - rowblur[iy*width + ix] = sum; - } - } - -#if defined(_OPENMP) -#pragma omp parallel for schedule(static) -#endif - for (int iy = 0; iy < height; ++iy) { - for (int ix = 0; ix < width; ++ix) { - double sum = 0.0; - for (int k = -pixelRadius; k <= pixelRadius; ++k) { - int jy = iy + k; - if (jy < 0) jy = 0; - if (jy >= height) jy = height - 1; - sum += kernel[(k < 0) ? -k : k] * rowblur[jy*width + ix]; - } - blur[iy*width + ix] = sum; - } - } - - // darken drawn pixels that lie behind the local average depth - -#if defined(_OPENMP) -#pragma omp parallel for schedule(static) -#endif - for (int i = 0; i < npixels; ++i) { - const double d = depthBuffer[i]; - if (d < 0.0) continue; - const double delta = d - blur[i]; - if (delta <= 0.0) continue; - const double ao = ssaoint * saturate(3.0 * delta / SSAORadius); - writeBuffer[i*3+0] = static_cast((1.0 - ao) * writeBuffer[i*3+0]); - writeBuffer[i*3+1] = static_cast((1.0 - ao) * writeBuffer[i*3+1]); - writeBuffer[i*3+2] = static_cast((1.0 - ao) * writeBuffer[i*3+2]); - } - - delete[] kernel; - delete[] rowblur; - delete[] blur; -} - /* ---------------------------------------------------------------------- draw outlines on the composited image on the output rank: color drawn pixels that have a significantly more distant pixel or the diff --git a/src/GRAPHICS/image.h b/src/GRAPHICS/image.h index 41bbb5ebac0..ea7193df7fd 100644 --- a/src/GRAPHICS/image.h +++ b/src/GRAPHICS/image.h @@ -37,7 +37,6 @@ class Image : protected Pointers { double gamma; // gamma correction of rendered objects, 1.0 = off int fsaa; // antialiasing on or off int ssao; // SSAO on or off - int fastssao; // 1 = fast depth-darkening algorithm, 0 = classic SSAO int seed; // RN seed for SSAO double ssaoint; // strength of shading from 0 to 1 int depthcue; // depth cueing on or off @@ -154,7 +153,6 @@ class Image : protected Pointers { void draw_pixel(int, int, double, const double *, const double *); void setup_lights(); void compute_SSAO(); - void compute_SSAO_fast(); void compute_outline(); void compute_depthcue(); diff --git a/unittest/graphics/tests/dump-image-ssao-fast.yaml b/unittest/graphics/tests/dump-image-ssao-fast.yaml deleted file mode 100644 index 132c4fd9ea6..00000000000 --- a/unittest/graphics/tests/dump-image-ssao-fast.yaml +++ /dev/null @@ -1,603 +0,0 @@ ---- -lammps_version: 4 Jul 2026 -tags: graphics -date_generated: Fri Jul 24 15:16:20 2026 -epsilon_projection: 0.5 -epsilon_blocks: 2 -nprocs: 1 -prerequisites: | - atom full - pair lj/charmm/coul/charmm - bond harmonic - angle charmm - dihedral charmm - improper harmonic -setup_commands: | - units real - atom_style full - pair_style lj/charmm/coul/charmm 8.0 10.0 - bond_style harmonic - angle_style charmm - dihedral_style charmm - improper_style harmonic - read_data ${input_dir}/data.peptide - neighbor 2.0 bin - dump viz all image 1 ${imagefile} element type size 200 200 zoom 1.5 view 60 30 shiny 0.2 box yes 0.02 bond atom 0.3 fsaa yes ssao fast 314123 0.7 - dump_modify viz backcolor gray boxcolor yellow element C C O H N C C C O H H S O H acolor 1 silver -run_commands: | - run 0 -image_size: 200 200 -sampling: 3 16 -row_means: | - 151.21 148.10 130.44 - 149.69 143.12 129.22 - 149.97 138.62 126.31 - 150.78 139.71 123.24 - 150.26 139.82 122.56 - 147.75 139.55 122.11 - 144.76 140.38 122.69 - 142.71 141.99 124.81 - 142.68 141.21 124.03 - 145.61 142.01 124.86 - 146.54 142.19 124.70 - 148.00 143.85 126.60 - 154.31 146.87 128.97 - 164.72 154.75 136.53 - 176.01 165.18 146.10 - 175.79 165.56 146.94 - 169.51 159.79 141.31 - 166.51 148.56 130.86 - 163.20 142.74 125.14 - 166.41 143.87 129.44 - 168.92 142.16 133.17 - 176.19 151.28 145.61 - 182.25 156.79 149.96 - 180.41 158.28 149.91 - 171.96 154.91 144.97 - 168.09 154.35 143.66 - 167.08 154.83 143.86 - 172.78 155.75 144.80 - 180.11 155.28 144.57 - 185.45 150.90 139.88 - 189.16 153.37 141.93 - 184.63 149.66 138.66 - 179.28 154.23 143.20 - 182.89 165.12 154.44 - 186.18 167.58 156.43 - 180.29 163.29 152.19 - 174.26 156.90 144.91 - 175.80 153.68 142.16 - 179.40 156.26 145.57 - 173.71 152.51 141.55 - 176.20 151.78 140.84 - 178.59 153.90 143.19 - 181.18 152.75 141.84 - 182.44 149.91 138.94 - 177.50 149.87 139.13 - 178.08 155.61 145.88 - 180.72 153.12 145.19 - 186.03 153.49 146.47 - 192.63 153.61 144.46 - 188.83 150.63 138.08 - 189.84 153.69 136.96 - 193.03 161.56 144.34 - 192.84 163.76 146.56 - 188.78 159.52 142.06 - 179.84 152.75 135.31 - 168.66 146.57 129.04 - 165.75 147.96 128.27 - 172.38 155.09 132.34 - 177.32 155.04 133.88 - 171.00 145.85 127.97 - 176.77 144.85 127.18 - 179.29 143.55 126.11 - 184.60 144.66 127.25 - 186.74 153.82 136.32 - 182.00 159.16 141.96 - 172.41 157.61 140.44 - 168.52 155.90 138.37 - 175.85 155.98 138.71 - 176.91 156.43 139.00 - 179.72 153.31 135.95 - 174.82 137.76 120.56 - 162.33 126.97 109.77 - 164.72 128.00 110.61 - 171.51 135.99 118.94 - 171.75 145.50 128.25 - 173.69 153.99 136.16 - 171.70 147.60 129.51 - 172.43 140.50 123.33 - 169.90 140.17 123.03 - 165.24 142.89 125.39 - 169.21 153.33 136.09 - 177.62 160.51 143.28 - 180.94 152.72 135.06 - 181.89 151.01 133.85 - 170.74 138.49 122.24 - 163.72 135.71 124.47 - 164.66 143.85 138.03 - 173.63 153.53 149.93 - 183.22 157.12 153.50 - 184.97 151.97 148.37 - 180.16 144.65 141.04 - 176.35 139.44 135.83 - 178.69 144.90 141.28 - 173.31 146.50 142.90 - 170.92 146.91 143.31 - 163.54 139.40 135.79 - 168.84 142.56 138.94 - 172.47 145.87 142.26 - 176.12 149.94 146.32 - 170.44 142.28 138.67 - 158.31 136.17 132.56 - 155.56 127.48 123.87 - 166.15 133.78 130.18 - 176.06 145.34 141.81 - 187.67 153.03 149.42 - 190.25 158.99 155.38 - 188.31 155.43 151.82 - 185.76 147.81 144.20 - 180.64 140.90 137.29 - 165.02 125.28 121.67 - 149.94 110.20 106.59 - 146.55 107.29 103.59 - 155.72 126.84 123.23 - 165.16 149.46 145.84 - 174.79 158.25 154.64 - 176.37 155.88 152.19 - 169.24 145.41 141.47 - 171.78 151.15 147.16 - 178.34 154.41 150.15 - 174.68 146.41 141.86 - 168.66 136.09 132.07 - 171.38 133.91 130.29 - 174.76 138.34 134.72 - 178.59 142.28 138.67 - 182.62 145.89 142.28 - 177.12 138.87 134.90 - 168.66 134.04 129.43 - 165.91 134.35 130.23 - 162.59 134.31 130.70 - 165.54 142.84 139.24 - 170.88 149.60 145.74 - 169.18 143.61 139.68 - 166.78 139.12 135.33 - 158.85 132.08 128.31 - 153.74 129.79 125.78 - 157.01 135.30 131.53 - 166.00 147.12 143.16 - 179.69 160.15 155.49 - 185.19 159.76 154.69 - 186.95 150.85 145.47 - 186.75 144.62 139.72 - 187.34 143.57 139.54 - 176.12 138.66 134.13 - 170.40 141.53 137.82 - 169.22 145.31 140.82 - 169.71 147.25 139.59 - 174.21 151.29 140.59 - 178.55 152.06 137.19 - 183.05 154.19 139.06 - 180.99 152.46 140.50 - 180.10 153.27 144.94 - 175.18 153.04 147.84 - 174.52 153.26 147.59 - 184.69 157.11 149.93 - 197.85 167.71 159.15 - 201.03 169.91 157.81 - 200.47 166.71 155.81 - 191.15 163.76 154.31 - 178.47 150.51 142.05 - 170.53 140.84 134.98 - 166.60 144.83 137.75 - 170.40 154.69 145.09 - 175.31 164.63 151.47 - 181.17 170.91 156.28 - 181.56 166.23 151.94 - 187.17 168.50 153.92 - 188.66 166.59 152.35 - 185.21 157.58 143.25 - 177.31 152.84 138.31 - 167.37 147.62 134.25 - 170.79 146.35 135.40 - 175.43 152.34 143.13 - 180.26 163.54 153.71 - 180.62 163.39 150.78 - 170.03 154.04 140.53 - 160.39 145.81 132.81 - 154.74 147.56 135.71 - 158.60 153.24 142.81 - 160.34 151.01 138.03 - 161.78 148.56 131.90 - 159.24 147.37 130.17 - 158.71 149.82 130.71 - 161.25 156.87 135.88 - 161.43 160.23 139.70 - 158.93 155.21 135.90 - 155.82 149.40 131.04 - 154.09 141.83 122.38 - 156.47 141.07 120.01 - 157.18 142.37 121.65 - 154.10 143.99 122.92 - 150.58 144.72 123.91 - 148.21 145.23 124.42 - 146.56 140.62 119.56 - 152.78 146.62 125.58 - 157.47 148.44 127.70 - 155.89 145.87 125.78 - 151.10 143.21 127.22 - 148.32 143.52 127.94 - 145.13 142.41 123.78 - 142.94 142.34 121.24 -col_means: | - 142.75 142.75 127.53 - 144.49 144.49 128.27 - 144.56 144.56 128.54 - 146.72 143.42 128.56 - 152.30 142.94 131.37 - 155.57 144.82 133.18 - 159.41 150.40 138.40 - 159.99 151.55 137.60 - 160.84 147.93 133.13 - 164.47 150.10 135.22 - 166.06 147.50 132.43 - 163.37 143.20 127.56 - 162.47 143.62 127.09 - 164.10 148.19 131.94 - 163.52 147.59 131.90 - 161.41 153.01 137.90 - 164.49 155.47 141.01 - 166.24 153.86 140.92 - 170.41 152.81 141.53 - 172.03 151.15 139.34 - 173.35 147.46 135.96 - 172.94 147.62 135.57 - 174.42 147.72 135.00 - 180.10 150.26 137.37 - 188.38 156.41 141.81 - 187.96 156.06 143.57 - 181.43 150.68 137.97 - 173.99 148.59 136.08 - 171.62 152.89 140.67 - 180.34 159.96 148.31 - 183.13 161.76 150.19 - 181.12 162.85 151.21 - 174.20 158.96 147.79 - 168.97 151.04 139.22 - 168.84 149.19 137.55 - 169.42 146.84 134.68 - 172.28 148.35 136.00 - 180.84 159.34 148.07 - 185.76 160.93 149.12 - 182.82 157.75 146.25 - 173.55 151.88 140.61 - 168.00 148.53 136.88 - 166.65 144.56 133.03 - 171.22 150.92 138.94 - 173.99 157.69 146.41 - 173.69 152.40 140.58 - 173.53 142.84 131.34 - 174.78 139.09 127.56 - 171.12 134.59 122.94 - 167.75 137.31 125.57 - 168.78 152.76 140.62 - 170.04 156.92 145.53 - 173.48 156.49 145.59 - 175.76 157.51 148.16 - 173.16 149.27 141.12 - 168.04 137.47 129.59 - 163.00 135.03 127.72 - 160.16 134.03 126.23 - 160.30 137.06 130.06 - 165.87 140.32 133.50 - 175.69 148.69 141.76 - 180.26 153.01 148.46 - 180.11 151.04 147.16 - 178.38 148.08 144.75 - 178.99 153.94 150.00 - 176.56 148.76 143.47 - 178.85 144.89 137.09 - 173.20 146.43 138.83 - 173.62 149.93 143.45 - 175.62 146.37 139.94 - 177.94 153.72 148.16 - 177.71 153.00 145.09 - 180.31 156.54 148.28 - 178.59 157.21 149.25 - 176.24 153.53 146.45 - 167.78 140.32 136.13 - 158.78 126.14 122.22 - 156.04 124.39 121.03 - 160.39 138.43 134.62 - 164.68 143.58 140.18 - 165.99 145.59 142.34 - 171.93 156.14 152.55 - 180.51 164.23 160.91 - 180.54 161.09 157.62 - 181.41 150.92 147.54 - 181.98 146.21 142.69 - 179.46 141.69 138.13 - 176.13 137.37 134.09 - 170.83 132.24 128.63 - 163.52 127.91 124.58 - 157.54 128.27 124.61 - 159.69 135.48 131.88 - 165.94 149.06 145.49 - 164.70 153.47 149.90 - 168.12 152.37 149.09 - 172.84 147.75 144.13 - 172.05 141.47 138.12 - 169.31 137.91 134.41 - 162.56 131.21 127.81 - 168.44 139.29 135.74 - 176.81 149.32 145.74 - 183.02 151.57 148.26 - 179.82 144.34 141.03 - 174.10 145.09 141.73 - 168.02 149.44 144.84 - 162.41 150.43 145.39 - 161.12 143.59 138.72 - 163.48 138.91 133.56 - 166.69 134.25 129.01 - 176.43 141.46 135.69 - 180.85 148.51 142.99 - 179.30 152.06 148.59 - 172.69 145.84 142.70 - 177.16 147.47 144.29 - 188.42 151.14 147.54 - 195.76 155.81 152.47 - 200.19 159.82 156.34 - 194.69 156.69 153.31 - 188.73 145.58 142.04 - 173.99 135.22 131.65 - 158.09 126.60 123.31 - 150.79 122.89 119.28 - 149.98 126.75 123.40 - 152.39 130.44 126.94 - 163.99 143.47 140.07 - 172.28 149.94 146.32 - 223.97 206.12 63.13 - 226.44 211.22 69.74 - 214.01 200.12 62.59 - 172.32 132.15 125.73 - 174.79 138.18 131.63 - 172.44 137.00 130.06 - 176.87 145.51 138.80 - 184.82 154.98 148.88 - 185.03 159.08 153.25 - 177.56 152.31 146.12 - 169.42 147.44 141.25 - 168.69 141.84 134.96 - 170.40 149.54 141.47 - 176.56 155.90 147.63 - 179.48 155.72 147.51 - 181.01 158.81 150.88 - 173.53 152.24 143.92 - 170.07 149.75 141.65 - 176.04 155.94 146.60 - 175.25 152.16 142.00 - 173.38 146.85 135.67 - 170.79 142.65 130.34 - 174.95 141.01 128.19 - 180.30 143.88 130.91 - 180.10 149.85 137.06 - 175.65 152.52 139.47 - 175.04 154.29 141.96 - 181.31 160.78 147.84 - 181.97 159.72 146.41 - 182.29 153.34 139.82 - 181.00 146.68 132.89 - 174.65 148.94 135.75 - 177.15 160.12 147.02 - 178.39 164.47 151.85 - 175.71 159.64 148.16 - 167.48 147.01 136.12 - 162.81 135.66 125.55 - 169.44 138.26 125.03 - 173.50 143.75 130.43 - 180.22 153.99 140.16 - 182.47 157.02 143.22 - 179.09 153.75 140.46 - 176.99 152.91 139.22 - 176.93 154.63 141.81 - 180.57 159.23 146.47 - 176.24 155.25 142.46 - 171.25 150.22 137.26 - 171.25 148.98 135.89 - 170.58 149.32 136.50 - 173.50 146.68 133.93 - 169.25 145.03 132.24 - 161.51 143.18 129.59 - 163.74 150.68 137.74 - 166.16 156.63 143.70 - 168.84 158.53 145.47 - 169.41 158.35 145.47 - 167.83 155.91 143.74 - 168.80 150.85 138.07 - 164.95 150.25 137.25 - 161.99 150.81 137.82 - 163.19 147.90 132.27 - 164.97 145.99 129.59 - 162.81 143.29 126.91 - 160.27 146.81 130.52 - 158.60 148.31 133.40 - 155.25 145.38 131.25 - 149.91 142.21 129.10 - 147.54 143.99 129.19 - 145.09 142.35 125.97 - 143.77 140.46 124.39 - 145.75 140.26 123.61 - 145.64 139.54 123.95 - 142.81 137.37 121.97 - 139.76 136.59 121.47 -sample_blocks: | - 2 2 128.00 128.00 128.00 - 2 18 128.00 128.00 128.00 - 2 34 128.00 128.00 128.00 - 2 50 237.67 237.67 16.56 - 2 66 128.00 128.00 128.00 - 2 82 187.78 187.78 187.78 - 2 98 155.33 155.33 155.33 - 2 114 251.78 96.33 96.33 - 2 130 151.67 151.67 98.00 - 2 146 159.67 159.67 100.44 - 2 162 128.00 128.00 128.00 - 2 178 128.00 128.00 128.00 - 2 194 128.00 128.00 128.00 - 18 2 128.00 128.00 128.00 - 18 18 128.00 128.00 128.00 - 18 34 186.89 186.89 54.11 - 18 50 128.00 128.00 128.00 - 18 66 128.22 128.22 128.22 - 18 82 211.22 98.00 98.00 - 18 98 197.44 159.56 159.56 - 18 114 219.56 100.78 100.78 - 18 130 243.56 167.89 167.89 - 18 146 144.78 144.78 144.78 - 18 162 128.00 128.00 128.00 - 18 178 253.00 204.22 204.22 - 18 194 244.22 244.22 33.00 - 34 2 128.00 128.00 128.00 - 34 18 206.89 206.89 200.89 - 34 34 128.00 128.00 128.00 - 34 50 204.78 148.67 148.67 - 34 66 120.89 120.89 120.89 - 34 82 164.89 164.89 164.89 - 34 98 128.00 128.00 128.00 - 34 114 229.78 112.00 112.00 - 34 130 234.67 234.67 234.67 - 34 146 137.56 119.56 119.56 - 34 162 134.33 126.44 126.44 - 34 178 247.22 247.22 247.22 - 34 194 128.00 128.00 128.00 - 50 2 221.33 221.33 47.00 - 50 18 130.56 130.56 130.56 - 50 34 240.56 100.89 100.89 - 50 50 195.44 195.44 195.44 - 50 66 247.11 171.33 171.33 - 50 82 221.89 142.78 142.78 - 50 98 101.22 101.22 101.22 - 50 114 248.33 102.44 102.44 - 50 130 174.22 158.44 158.44 - 50 146 72.44 56.11 56.11 - 50 162 229.33 226.22 226.22 - 50 178 128.00 128.00 128.00 - 50 194 128.00 128.00 128.00 - 66 2 128.44 128.44 128.44 - 66 18 221.44 221.44 221.44 - 66 34 95.44 67.00 67.00 - 66 50 202.78 202.78 186.33 - 66 66 148.22 145.33 50.11 - 66 82 212.67 124.89 124.89 - 66 98 230.89 168.11 168.11 - 66 114 224.11 155.56 155.56 - 66 130 221.78 221.78 221.78 - 66 146 164.33 160.78 120.11 - 66 162 130.33 130.33 130.33 - 66 178 147.11 140.33 140.33 - 66 194 144.78 144.78 144.78 - 82 2 128.00 128.00 128.00 - 82 18 180.78 117.11 117.11 - 82 34 133.22 133.22 133.22 - 82 50 178.11 127.33 127.33 - 82 66 161.67 147.00 147.00 - 82 82 222.56 217.67 217.67 - 82 98 101.22 101.22 101.22 - 82 114 239.44 238.11 38.11 - 82 130 213.56 213.56 30.78 - 82 146 112.78 105.89 105.89 - 82 162 132.00 132.00 132.00 - 82 178 131.44 131.44 131.44 - 82 194 128.00 128.00 128.00 - 98 2 128.00 128.00 128.00 - 98 18 127.44 119.78 119.78 - 98 34 208.44 151.89 151.89 - 98 50 137.00 80.00 80.00 - 98 66 240.89 210.11 210.11 - 98 82 225.78 129.78 129.78 - 98 98 165.56 165.56 165.56 - 98 114 213.78 211.00 211.00 - 98 130 129.33 53.00 53.00 - 98 146 244.33 244.33 244.33 - 98 162 232.78 223.00 223.00 - 98 178 153.22 116.11 116.11 - 98 194 131.67 131.67 131.67 - 114 2 128.00 128.00 128.00 - 114 18 184.44 165.89 165.89 - 114 34 136.44 120.89 120.89 - 114 50 251.78 251.78 251.78 - 114 66 95.78 95.78 95.78 - 114 82 237.78 235.56 235.56 - 114 98 74.33 54.89 54.89 - 114 114 175.56 155.78 155.78 - 114 130 96.33 88.56 88.56 - 114 146 180.56 88.22 88.22 - 114 162 174.44 137.56 137.56 - 114 178 140.56 140.56 140.56 - 114 194 128.00 128.00 128.00 - 130 2 128.00 128.00 128.00 - 130 18 169.89 169.89 169.89 - 130 34 155.56 155.56 155.56 - 130 50 191.56 191.56 185.44 - 130 66 107.89 102.33 102.33 - 130 82 102.78 102.78 102.78 - 130 98 242.89 242.89 242.89 - 130 114 230.33 194.22 194.22 - 130 130 101.67 63.89 57.00 - 130 146 94.89 71.78 71.78 - 130 162 95.67 42.56 42.56 - 130 178 128.00 128.00 128.00 - 130 194 128.00 128.00 128.00 - 146 2 137.00 137.00 137.00 - 146 18 222.00 100.56 100.56 - 146 34 186.00 186.00 178.44 - 146 50 119.22 54.89 54.89 - 146 66 249.22 218.11 218.11 - 146 82 135.00 135.00 135.00 - 146 98 213.22 209.56 209.56 - 146 114 119.89 72.33 72.33 - 146 130 175.78 117.11 117.11 - 146 146 94.33 91.22 91.22 - 146 162 238.56 86.67 86.67 - 146 178 179.22 90.11 90.11 - 146 194 166.67 166.67 96.22 - 162 2 128.00 128.00 128.00 - 162 18 237.11 167.56 135.67 - 162 34 163.33 158.33 158.33 - 162 50 128.00 128.00 128.00 - 162 66 203.00 72.89 72.89 - 162 82 156.56 156.56 156.56 - 162 98 129.00 129.00 129.00 - 162 114 125.78 125.78 125.78 - 162 130 132.11 132.11 132.11 - 162 146 107.56 99.22 99.22 - 162 162 233.11 179.78 179.78 - 162 178 128.00 128.00 128.00 - 162 194 128.00 128.00 128.00 - 178 2 204.00 204.00 68.78 - 178 18 128.00 128.00 128.00 - 178 34 158.78 158.78 158.78 - 178 50 128.00 128.00 128.00 - 178 66 225.11 81.11 81.11 - 178 82 143.33 143.33 143.33 - 178 98 128.00 128.00 128.00 - 178 114 233.89 170.78 170.78 - 178 130 155.22 95.22 95.22 - 178 146 234.00 224.56 224.56 - 178 162 128.00 128.00 128.00 - 178 178 128.00 128.00 128.00 - 178 194 128.00 128.00 128.00 - 194 2 128.00 128.00 128.00 - 194 18 128.00 128.00 128.00 - 194 34 128.00 128.00 128.00 - 194 50 210.78 210.78 51.22 - 194 66 159.78 159.78 159.78 - 194 82 127.44 127.44 127.44 - 194 98 128.00 128.00 128.00 - 194 114 222.56 222.56 222.56 - 194 130 224.44 174.89 174.89 - 194 146 128.00 128.00 128.00 - 194 162 128.00 128.00 128.00 - 194 178 128.00 128.00 128.00 - 194 194 128.00 128.00 128.00 -... From f6c61a880a82e7bb023a0f7db5b47961558a8305 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 24 Jul 2026 21:10:41 -0400 Subject: [PATCH 060/100] update visualization howto with recent additions and include example images --- doc/src/Howto_viz.rst | 78 +++++++++++++++++++++++++++++----- doc/src/JPG/image.default.png | Bin 21978 -> 75955 bytes doc/src/JPG/image.depth.png | Bin 0 -> 75356 bytes doc/src/JPG/image.fsaa.png | Bin 23151 -> 73632 bytes doc/src/JPG/image.ssao.png | Bin 23091 -> 78881 bytes doc/src/JPG/shade.narrow.png | Bin 0 -> 66653 bytes doc/src/JPG/shade.none.png | Bin 0 -> 64374 bytes doc/src/JPG/shade.outline.png | Bin 0 -> 55596 bytes doc/src/JPG/shade.tight.png | Bin 0 -> 65676 bytes doc/src/JPG/shade.wide.png | Bin 0 -> 67785 bytes 10 files changed, 67 insertions(+), 11 deletions(-) create mode 100644 doc/src/JPG/image.depth.png create mode 100644 doc/src/JPG/shade.narrow.png create mode 100644 doc/src/JPG/shade.none.png create mode 100644 doc/src/JPG/shade.outline.png create mode 100644 doc/src/JPG/shade.tight.png create mode 100644 doc/src/JPG/shade.wide.png diff --git a/doc/src/Howto_viz.rst b/doc/src/Howto_viz.rst index d3770abf933..e9d64d34d11 100644 --- a/doc/src/Howto_viz.rst +++ b/doc/src/Howto_viz.rst @@ -157,9 +157,9 @@ or 6x6 times larger to utilize the full resolution of the printer and show as much details and be as clean as possible. Otherwise images have to be scaled up which can make them look blurry and with ragged edges. -The keywords *fsaa* and *ssao* can be used to further improve the image -quality at the expense of significant additional computational cost to -render the images: +The keywords *fsaa*, *ssao*, and *depthcue* can be used to further +improve the image quality and realism at the expense of additional +computational cost to render the images: - FSAA stands for `Full Scene Anti-Aliasing `_ @@ -177,11 +177,18 @@ render the images: selected pixels in its neighborhood based on that information. This enhances the depth perception of objects in an image. -Both methods are complementary and thus can be combined for additional -improvement of the image quality. The images below show from left to -right the same excerpt of a dump image output with the default settings, -with *fsaa* enabled, with *ssao* enabled, and with both features -enabled. +- Depth cueing adds a `distance fog gradient + `_ so objects further from + the camera are progressively more obscured by haze. This technique + simulates the effect of light scattering, which causes more distant + objects to appear lower in contrast, especially in outdoor + environments, and thus enhances depth perception. + +The three methods are complementary and thus can be combined for +additional improvement of the image quality. The images below show from +left to right the same excerpt of a dump image output with the default +settings, with *fsaa* enabled, with *ssao* enabled in addition, and +with *depthcue* added on top. .. |imagequality1| image:: JPG/image.default.png :width: 24% @@ -189,7 +196,7 @@ enabled. :width: 24% .. |imagequality3| image:: JPG/image.ssao.png :width: 24% -.. |imagequality4| image:: JPG/image.both.png +.. |imagequality4| image:: JPG/image.depth.png :width: 24% |imagequality1| |imagequality2| |imagequality3| |imagequality4| @@ -197,8 +204,8 @@ enabled. The computational cost to create the images with :doc:`dump image ` depends on the image size, the number of objects to be rendered (this number can grow quickly when using fine triangle meshes), -and the choice of the *fsaa* and *ssao* settings. For high resolution -images, a correspondingly large image size has to be chosen. +and the choice of the *fsaa*, *ssao*, and *depthcue* settings. For high +resolution images, a correspondingly large image size has to be chosen. Since the simulation has to wait for the dump image command to complete its image rendering, creating high resolution, high quality images can @@ -214,6 +221,55 @@ parallelization available (e.g. for SSAO post-processing of image data). -------------------- +Shading style and outline +------------------------- + +The rasterizer in LAMMPS implements a `Phong shading model +`_ that adds a specular +highlight to objects which determines how the material of the objects is +perceived. The intensity of this effect is controlled by the *shiny* +keyword of :doc:`dump image ` and the material perception +by the *specular* :doc:`dump_modify ` setting. Using +specular setting of `none` turns the shading off and thus results in a +matted material. Using the settings `wide`, `narrow`, and `tight` +reduces the highlight and makes the material appear more polished. +In addition, there is also an *outline* image post-processing step that +can add a colored outline to the graphics object and can make images +more "schematic". It works best when features to enhance image quality +- except FSAA - are turned off. The images below show from left to +right the different specular settings (*none*, *wide*, *narrow*, +*tight*) and the *outline* drawing style with a pixel width of 2 pixels +(in gray). + +.. |shading1| image:: JPG/shade.none.png + :width: 19% +.. |shading2| image:: JPG/shade.wide.png + :width: 19% +.. |shading3| image:: JPG/shade.narrow.png + :width: 19% +.. |shading4| image:: JPG/shade.tight.png + :width: 19% +.. |shading5| image:: JPG/shade.outline.png + :width: 19% + +|shading1| |shading2| |shading3| |shading4| |shading5| + +.. admonition:: Transparent backgrounds + :class: Hint + + The rasterizer in LAMMPS does not support a so-called "alpha channel" + in its rendering processing and thus has no native transparency. + This has practical benefits because it makes parallel rendering in + parallel convenient even when the objects are distributed across + parallel processes. But another consequence is that it is not + possible to create images with a transparent background. However, + adding a thin outline with a suitable color simplifies the process of + creating a transparent background in a image processing program. It + creates a clean separation between the foreground objects and the + background, so the background can be selected and removed. + +------- + Color selection and color management ------------------------------------ diff --git a/doc/src/JPG/image.default.png b/doc/src/JPG/image.default.png index 7acf8378508dcb760d03aae0016388cf3b08be2b..bb61b1a87f73427a56d1a8da64e008d74153aca9 100644 GIT binary patch literal 75955 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%0Ab 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�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

MDs~eo|l^?oc`%|`1%0x31uzKW@Avj+3 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