From 77ab630080753efbf866042809486e0f87a06a65 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 24 Dec 2024 15:36:40 -0500 Subject: [PATCH 01/34] update LAMMPS-GUI TODO list --- tools/lammps-gui/TODO.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tools/lammps-gui/TODO.md b/tools/lammps-gui/TODO.md index b36f0a4ce87..0e79bfd5685 100644 --- a/tools/lammps-gui/TODO.md +++ b/tools/lammps-gui/TODO.md @@ -2,6 +2,8 @@ LAMMPS-GUI TODO list: # Short term goals (v1.x) +- add wizards for all tutorials. try to reduce redundant code in wizards. +- add a highlighting to the log window that highlights warnings - implement a timed "Auto-Save" feature that saves after some idle time. set timeout in Editor preferences. - add a "Filter data" checkbox to the "Charts" window to select whether data should be dropped. - add a "Charts tab" to the preferences with the following (default) settings: @@ -9,7 +11,7 @@ LAMMPS-GUI TODO list: - default smooth parameters - default plot colors - enable "raw" or "smooth" or "both" -- add QLineEdit field to enter plot title +- add QLineEdit fields to enter plot title, axis labels and units - add a "Colors" menu to the image viewer to adjust color settings for the current image (unlike the defaults in the perferences) including assigning colors to individual atom types. From c78c53b36f9322526ec49999d58f5b7a9a8b7a33 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 24 Dec 2024 15:44:59 -0500 Subject: [PATCH 02/34] more checking on temperature and pressure computes plus bugfixes --- src/RIGID/fix_rigid_nh.cpp | 21 ++++++++++++++------- src/RIGID/fix_rigid_nh_small.cpp | 15 +++++++++++---- src/SHOCK/fix_msst.cpp | 28 +++++++++++++++++++--------- src/SHOCK/fix_nphug.cpp | 7 ++++++- src/fix_langevin.cpp | 9 +++++---- src/fix_press_berendsen.cpp | 2 ++ src/fix_temp_berendsen.cpp | 1 + 7 files changed, 58 insertions(+), 25 deletions(-) diff --git a/src/RIGID/fix_rigid_nh.cpp b/src/RIGID/fix_rigid_nh.cpp index 9c51c0e3d21..c40cb54d86b 100644 --- a/src/RIGID/fix_rigid_nh.cpp +++ b/src/RIGID/fix_rigid_nh.cpp @@ -246,8 +246,12 @@ void FixRigidNH::init() if (tcomputeflag) { temperature = modify->get_compute_by_id(id_temp); - if (!temperature) + if (!temperature) { error->all(FLERR,"Temperature compute ID {} for fix {} does not exist", id_temp, style); + } else { + if (temperature->tempflag == 0) + error->all(FLERR, "Compute ID {} for fix {} does not compute a temperature", id_temp, style); + } } if (pstat_flag) { @@ -260,9 +264,9 @@ void FixRigidNH::init() auto deform = dynamic_cast(ifix); if (deform) { int *dimflag = deform->dimflag; - if ((p_flag[0] && dimflag[0]) || (p_flag[1] && dimflag[1]) || - (p_flag[2] && dimflag[2])) - error->all(FLERR,"Cannot use fix {} and fix deform on same component of stress tensor", style); + if ((p_flag[0] && dimflag[0]) || (p_flag[1] && dimflag[1]) || (p_flag[2] && dimflag[2])) + error->all(FLERR,"Cannot use fix {} and fix deform on same component of stress tensor", + style); } } @@ -284,9 +288,12 @@ void FixRigidNH::init() // set pressure compute ptr pressure = modify->get_compute_by_id(id_press); - if (!pressure) error->all(FLERR,"Pressure ID {} for fix {} does not exist", id_press, style); - if (pressure->pressflag == 0) - error->all(FLERR,"Compute ID {} does not compute pressure", id_press); + if (!pressure) { + error->all(FLERR,"Pressure ID {} for fix {} does not exist", id_press, style); + } else { + if (pressure->pressflag == 0) + error->all(FLERR,"Compute ID {} does not compute pressure", id_press); + } // detect if any rigid fixes exist so rigid bodies move on remap // this will include self diff --git a/src/RIGID/fix_rigid_nh_small.cpp b/src/RIGID/fix_rigid_nh_small.cpp index 984f60e1f61..92f0668cfb9 100644 --- a/src/RIGID/fix_rigid_nh_small.cpp +++ b/src/RIGID/fix_rigid_nh_small.cpp @@ -221,8 +221,12 @@ void FixRigidNHSmall::init() if (tcomputeflag) { temperature = modify->get_compute_by_id(id_temp); - if (!temperature) + if (!temperature) { error->all(FLERR,"Temperature compute ID {} for fix {} does not exist", id_temp, style); + } else { + if (temperature->tempflag == 0) + error->all(FLERR, "Compute ID {} for fix {} does not compute a temperature", id_temp, style); + } } if (pstat_flag) { @@ -260,9 +264,12 @@ void FixRigidNHSmall::init() // set pressure compute ptr pressure = modify->get_compute_by_id(id_press); - if (!pressure) error->all(FLERR,"Pressure ID {} for fix {} does not exist", id_press, style); - if (pressure->pressflag == 0) - error->all(FLERR,"Compute ID {} does not compute pressure", id_press); + if (!pressure) { + error->all(FLERR,"Pressure ID {} for fix {} does not exist", id_press, style); + } else { + if (pressure->pressflag == 0) + error->all(FLERR,"Compute ID {} does not compute pressure", id_press); + } // detect if any rigid fixes exist so rigid bodies move on remap // this will include self diff --git a/src/SHOCK/fix_msst.cpp b/src/SHOCK/fix_msst.cpp index b3a55ff6632..ffdead90eb2 100644 --- a/src/SHOCK/fix_msst.cpp +++ b/src/SHOCK/fix_msst.cpp @@ -248,18 +248,28 @@ void FixMSST::init() // set compute ptrs temperature = modify->get_compute_by_id(id_temp); - if (!temperature) + if (!temperature) { error->all(FLERR, "Could not find fix msst temperature compute ID {}", id_temp); - if (temperature->tempflag == 0) - error->all(FLERR, "Fix msst compute ID {} does not compute temperature", id_temp); + } else { + if (temperature->tempflag == 0) + error->all(FLERR, "Fix msst compute ID {} does not compute temperature", id_temp); + } + pressure = modify->get_compute_by_id(id_press); - if (!pressure) error->all(FLERR, "Could not find fix msst pressure compute ID {}", id_press); - if (pressure->pressflag == 0) - error->all(FLERR, "Fix msst compute ID {} does not compute pressure", id_press); + if (!pressure) { + error->all(FLERR, "Could not find fix msst pressure compute ID {}", id_press); + } else { + if (pressure->pressflag == 0) + error->all(FLERR, "Fix msst compute ID {} does not compute pressure", id_press); + } + pe = modify->get_compute_by_id(id_pe); - if (!pe) error->all(FLERR, "Could not find fix msst pe compute ID {}", id_pe); - if (pe->peflag == 0) - error->all(FLERR, "Fix msst compute ID {} does not compute potential energy", id_pe); + if (!pe) { + error->all(FLERR, "Could not find fix msst pe compute ID {}", id_pe); + } else { + if (pe->peflag == 0) + error->all(FLERR, "Fix msst compute ID {} does not compute potential energy", id_pe); + } dtv = update->dt; dtf = 0.5 * update->dt * force->ftm2v; diff --git a/src/SHOCK/fix_nphug.cpp b/src/SHOCK/fix_nphug.cpp index b4b4a866b6c..d40ed9c3441 100644 --- a/src/SHOCK/fix_nphug.cpp +++ b/src/SHOCK/fix_nphug.cpp @@ -162,8 +162,13 @@ void FixNPHug::init() // set pe ptr pe = modify->get_compute_by_id(id_pe); - if (!pe) + if (!pe) { error->all(FLERR, "Potential energy compute ID {} for fix {} does not exist", id_pe, style); + } else { + if (pe->peflag == 0) + error->all(FLERR, "Compute ID {} for fix {} does not compute potential energy", + id_temp, style); + } } diff --git a/src/fix_langevin.cpp b/src/fix_langevin.cpp index c032e73b84d..4258e3359f7 100644 --- a/src/fix_langevin.cpp +++ b/src/fix_langevin.cpp @@ -225,11 +225,12 @@ void FixLangevin::init() { if (id_temp) { temperature = modify->get_compute_by_id(id_temp); - if (!temperature) + if (!temperature) { error->all(FLERR, "Temperature compute ID {} for fix {} does not exist", id_temp, style); - - if (temperature->tempflag == 0) - error->all(FLERR, "Compute ID {} for fix {} does not compute temperature", id_temp, style); + } else { + if (temperature->tempflag == 0) + error->all(FLERR, "Compute ID {} for fix {} does not compute temperature", id_temp, style); + } } if (gjfflag) { diff --git a/src/fix_press_berendsen.cpp b/src/fix_press_berendsen.cpp index c6fc0ad6026..44c7f579b46 100644 --- a/src/fix_press_berendsen.cpp +++ b/src/fix_press_berendsen.cpp @@ -268,6 +268,7 @@ void FixPressBerendsen::init() temperature = modify->get_compute_by_id(id_temp); if (!temperature) { error->all(FLERR, "Temperature compute ID {} for fix {} does not exist", id_temp, style); + } else { if (temperature->tempflag == 0) error->all(FLERR, "Compute ID {} for fix {} does not compute a temperature", id_temp, style); if (temperature->tempbias) @@ -279,6 +280,7 @@ void FixPressBerendsen::init() pressure = modify->get_compute_by_id(id_press); if (!pressure) { error->all(FLERR, "Pressure compute ID {} for fix {} does not exist", id_press, style); + } else { if (pressure->pressflag == 0) error->all(FLERR, "Compute ID {} for fix {} does not compute pressure", id_press, style); } diff --git a/src/fix_temp_berendsen.cpp b/src/fix_temp_berendsen.cpp index 47091259c08..eb9d4fd5452 100644 --- a/src/fix_temp_berendsen.cpp +++ b/src/fix_temp_berendsen.cpp @@ -119,6 +119,7 @@ void FixTempBerendsen::init() temperature = modify->get_compute_by_id(id_temp); if (!temperature) { error->all(FLERR,"Temperature compute ID {} for fix {} does not exist", id_temp, style); + } else { if (temperature->tempflag == 0) error->all(FLERR, "Compute ID {} for fix {} does not compute a temperature", id_temp, style); if (temperature->tempbias) which = BIAS; From f3cbf55d3c56c2646a4f99afd40ce0a078aec338 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 26 Dec 2024 16:26:51 -0500 Subject: [PATCH 03/34] update LAMMPS-GUI todo list --- tools/lammps-gui/TODO.md | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/lammps-gui/TODO.md b/tools/lammps-gui/TODO.md index 0e79bfd5685..3bb8c8d3dd8 100644 --- a/tools/lammps-gui/TODO.md +++ b/tools/lammps-gui/TODO.md @@ -4,6 +4,7 @@ LAMMPS-GUI TODO list: - add wizards for all tutorials. try to reduce redundant code in wizards. - add a highlighting to the log window that highlights warnings +- add a preferences option to override light/dark theme setting and add choice for theme - implement a timed "Auto-Save" feature that saves after some idle time. set timeout in Editor preferences. - add a "Filter data" checkbox to the "Charts" window to select whether data should be dropped. - add a "Charts tab" to the preferences with the following (default) settings: From 5947e3e82cf085319412ada9d2ce7cda104259e4 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 26 Dec 2024 16:27:20 -0500 Subject: [PATCH 04/34] use LAMMPS' warning function from Error class --- src/COLVARS/fix_colvars.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/COLVARS/fix_colvars.cpp b/src/COLVARS/fix_colvars.cpp index ecfec3e46ca..d5a8806eedf 100644 --- a/src/COLVARS/fix_colvars.cpp +++ b/src/COLVARS/fix_colvars.cpp @@ -129,7 +129,7 @@ FixColvars::FixColvars(LAMMPS *lmp, int narg, char **arg) : if (comm->me == 0) { #ifdef LAMMPS_BIGBIG - utils::logmesg(lmp, "colvars: Warning: cannot handle atom ids > 2147483647\n"); + error->warning(FLERR, "colvars: cannot handle atom ids > 2147483647\n"); #endif proxy = new colvarproxy_lammps(lmp); proxy->init(); From 48178ccc5019a86569cdc7a26f611a82dc1768dc Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 26 Dec 2024 17:19:12 -0500 Subject: [PATCH 05/34] highlight error and warning messages in output window --- tools/lammps-gui/CMakeLists.txt | 2 ++ tools/lammps-gui/TODO.md | 1 - tools/lammps-gui/flagwarnings.cpp | 44 +++++++++++++++++++++++++++++++ tools/lammps-gui/flagwarnings.h | 37 ++++++++++++++++++++++++++ tools/lammps-gui/logwindow.cpp | 10 ++++++- tools/lammps-gui/logwindow.h | 4 +++ 6 files changed, 96 insertions(+), 2 deletions(-) create mode 100644 tools/lammps-gui/flagwarnings.cpp create mode 100644 tools/lammps-gui/flagwarnings.h diff --git a/tools/lammps-gui/CMakeLists.txt b/tools/lammps-gui/CMakeLists.txt index 5ac23daac79..057d686b127 100644 --- a/tools/lammps-gui/CMakeLists.txt +++ b/tools/lammps-gui/CMakeLists.txt @@ -130,6 +130,8 @@ set(PROJECT_SOURCES codeeditor.h findandreplace.cpp findandreplace.h + flagwarnings.cpp + flagwarnings.h helpers.cpp highlighter.cpp highlighter.h diff --git a/tools/lammps-gui/TODO.md b/tools/lammps-gui/TODO.md index 3bb8c8d3dd8..c9c8d265685 100644 --- a/tools/lammps-gui/TODO.md +++ b/tools/lammps-gui/TODO.md @@ -3,7 +3,6 @@ LAMMPS-GUI TODO list: # Short term goals (v1.x) - add wizards for all tutorials. try to reduce redundant code in wizards. -- add a highlighting to the log window that highlights warnings - add a preferences option to override light/dark theme setting and add choice for theme - implement a timed "Auto-Save" feature that saves after some idle time. set timeout in Editor preferences. - add a "Filter data" checkbox to the "Charts" window to select whether data should be dropped. diff --git a/tools/lammps-gui/flagwarnings.cpp b/tools/lammps-gui/flagwarnings.cpp new file mode 100644 index 00000000000..8c0a4c4cde6 --- /dev/null +++ b/tools/lammps-gui/flagwarnings.cpp @@ -0,0 +1,44 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#include "flagwarnings.h" + +#include "helpers.h" + +#include +#include + +// workaround for Qt-5.12 +#if QT_VERSION < QT_VERSION_CHECK(5, 14, 0) +namespace QColorConstants { +const QColor Red = QColor::fromRgb(0xff, 0x00, 0x00); +} // namespace QColorConstants +#endif + +FlagWarnings::FlagWarnings(QTextDocument *parent) : + QSyntaxHighlighter(parent), isWarning(QStringLiteral("^(ERROR|WARNING).*$")) +{ + formatWarning.setForeground(QColorConstants::Red); + formatWarning.setFontWeight(QFont::Bold); +} + +void FlagWarnings::highlightBlock(const QString &text) +{ + // nothing to do for empty lines + if (text.isEmpty()) return; + + auto match = isWarning.match(text); + if (match.hasMatch()) { + setFormat(match.capturedStart(0), match.capturedLength(0), formatWarning); + } +} diff --git a/tools/lammps-gui/flagwarnings.h b/tools/lammps-gui/flagwarnings.h new file mode 100644 index 00000000000..b34f1eba6a7 --- /dev/null +++ b/tools/lammps-gui/flagwarnings.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. +------------------------------------------------------------------------- */ + +#ifndef FLAGWARNINGS_H +#define FLAGWARNINGS_H + +#include +#include +#include + +class FlagWarnings : public QSyntaxHighlighter { + Q_OBJECT + +public: + FlagWarnings(QTextDocument *parent = 0); + +protected: + void highlightBlock(const QString &text) override; + +private: + QRegularExpression isWarning; + QTextCharFormat formatWarning; +}; +#endif +// Local Variables: +// c-basic-offset: 4 +// End: diff --git a/tools/lammps-gui/logwindow.cpp b/tools/lammps-gui/logwindow.cpp index 4527bcb0ddb..85ed1d8744e 100644 --- a/tools/lammps-gui/logwindow.cpp +++ b/tools/lammps-gui/logwindow.cpp @@ -13,6 +13,7 @@ #include "logwindow.h" +#include "flagwarnings.h" #include "lammpsgui.h" #include @@ -33,11 +34,13 @@ const QString LogWindow::yaml_regex = QStringLiteral("^(keywords:.*$|data:$|---$|\\.\\.\\.$| - \\[.*\\]$)"); LogWindow::LogWindow(const QString &_filename, QWidget *parent) : - QPlainTextEdit(parent), filename(_filename) + QPlainTextEdit(parent), filename(_filename), warnings(nullptr) { QSettings settings; resize(settings.value("logx", 500).toInt(), settings.value("logy", 320).toInt()); + warnings = new FlagWarnings(document()); + auto *action = new QShortcut(QKeySequence(Qt::CTRL | Qt::Key_S), this); connect(action, &QShortcut::activated, this, &LogWindow::save_as); action = new QShortcut(QKeySequence(Qt::CTRL | Qt::Key_Y), this); @@ -50,6 +53,11 @@ LogWindow::LogWindow(const QString &_filename, QWidget *parent) : installEventFilter(this); } +LogWindow::~LogWindow() +{ + delete warnings; +} + void LogWindow::closeEvent(QCloseEvent *event) { QSettings settings; diff --git a/tools/lammps-gui/logwindow.h b/tools/lammps-gui/logwindow.h index b6cf78c48f2..84240b6e70d 100644 --- a/tools/lammps-gui/logwindow.h +++ b/tools/lammps-gui/logwindow.h @@ -16,11 +16,14 @@ #include +class FlagWarnings; + class LogWindow : public QPlainTextEdit { Q_OBJECT public: LogWindow(const QString &filename, QWidget *parent = nullptr); + ~LogWindow() override; private slots: void extract_yaml(); @@ -37,6 +40,7 @@ private slots: private: QString filename; static const QString yaml_regex; + FlagWarnings *warnings; }; #endif From 5ece81323ef1179c71345f69deb64d69357e4566 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 26 Dec 2024 22:53:44 -0500 Subject: [PATCH 06/34] suppress bogus compiler warnings about overflowing buffer size in memcpy() --- src/MACHDYN/atom_vec_smd.cpp | 4 ++-- src/REPLICA/prd.cpp | 6 +++--- src/atom_vec.cpp | 16 ++++++++-------- src/dump.cpp | 6 +++--- src/lmptype.h | 7 +++++++ src/variable.cpp | 2 +- 6 files changed, 24 insertions(+), 17 deletions(-) diff --git a/src/MACHDYN/atom_vec_smd.cpp b/src/MACHDYN/atom_vec_smd.cpp index 820527503c0..2bb667467c0 100644 --- a/src/MACHDYN/atom_vec_smd.cpp +++ b/src/MACHDYN/atom_vec_smd.cpp @@ -201,7 +201,7 @@ void AtomVecSMD::write_data_restricted_to_general() int nlocal = atom->nlocal; memory->create(x0_hold,nlocal,3,"atomvec:x0_hold"); - if (nlocal) memcpy(&x0_hold[0][0],&x0[0][0],3*nlocal*sizeof(double)); + if (nlocal) memcpy(&x0_hold[0][0],&x0[0][0],(3*nlocal*sizeof(double))&memcpymask); for (int i = 0; i < nlocal; i++) domain->restricted_to_general_coords(x0[i]); @@ -221,7 +221,7 @@ void AtomVecSMD::write_data_restore_restricted() if (!x0_hold) return; int nlocal = atom->nlocal; - memcpy(&x0[0][0],&x0_hold[0][0],3*nlocal*sizeof(double)); + memcpy(&x0[0][0],&x0_hold[0][0],(3*nlocal*sizeof(double))&memcpymask); memory->destroy(x0_hold); x0_hold = nullptr; } diff --git a/src/REPLICA/prd.cpp b/src/REPLICA/prd.cpp index 7a662c17146..1b844adb2a6 100644 --- a/src/REPLICA/prd.cpp +++ b/src/REPLICA/prd.cpp @@ -770,9 +770,9 @@ void PRD::replicate(int ireplica) int nlocal = atom->nlocal; if (universe->iworld == ireplica) { - memcpy(tagall,tag,nlocal*sizeof(tagint)); - memcpy(xall[0],x[0],3*nlocal*sizeof(double)); - memcpy(imageall,image,nlocal*sizeof(imageint)); + memcpy(tagall,tag,(nlocal*sizeof(tagint))&memcpymask); + memcpy(xall[0],x[0],(3*nlocal*sizeof(double))&memcpymask); + memcpy(imageall,image,(nlocal*sizeof(imageint))&memcpymask); } MPI_Bcast(tagall,natoms,MPI_LMP_TAGINT,ireplica,comm_replica); diff --git a/src/atom_vec.cpp b/src/atom_vec.cpp index b9d94b1dd2b..c6053bd7e02 100644 --- a/src/atom_vec.cpp +++ b/src/atom_vec.cpp @@ -2269,7 +2269,7 @@ void AtomVec::write_data_restricted_to_general() int nlocal = atom->nlocal; memory->create(x_hold,nlocal,3,"atomvec:x_hold"); - if (nlocal) memcpy(&x_hold[0][0],&x[0][0],3*nlocal*sizeof(double)); + if (nlocal) memcpy(&x_hold[0][0],&x[0][0],(3*nlocal*sizeof(double))&memcpymask); for (int i = 0; i < nlocal; i++) domain->restricted_to_general_coords(x[i]); @@ -2290,17 +2290,17 @@ void AtomVec::write_data_restricted_to_general() if (array == v) { memory->create(v_hold,nlocal,3,"atomvec:v_hold"); - if (nlocal) memcpy(&v_hold[0][0],&v[0][0],3*nlocal*sizeof(double)); + if (nlocal) memcpy(&v_hold[0][0],&v[0][0],(3*nlocal*sizeof(double))&memcpymask); for (int i = 0; i < nlocal; i++) domain->restricted_to_general_vector(v[i]); } else if (array == omega) { memory->create(omega_hold,nlocal,3,"atomvec:omega_hold"); - if (nlocal) memcpy(&omega_hold[0][0],&omega[0][0],3*nlocal*sizeof(double)); + if (nlocal) memcpy(&omega_hold[0][0],&omega[0][0],(3*nlocal*sizeof(double))&memcpymask); for (int i = 0; i < nlocal; i++) domain->restricted_to_general_vector(omega[i]); } else if (array == angmom) { memory->create(angmom_hold,nlocal,3,"atomvec:angmom_hold"); - if (nlocal) memcpy(&angmom_hold[0][0],&angmom[0][0],3*nlocal*sizeof(double)); + if (nlocal) memcpy(&angmom_hold[0][0],&angmom[0][0],(3*nlocal*sizeof(double))&memcpymask); for (int i = 0; i < nlocal; i++) domain->restricted_to_general_vector(angmom[i]); } @@ -2321,7 +2321,7 @@ void AtomVec::write_data_restore_restricted() int nlocal = atom->nlocal; if (x_hold) { - memcpy(&x[0][0],&x_hold[0][0],3*nlocal*sizeof(double)); + memcpy(&x[0][0],&x_hold[0][0],(3*nlocal*sizeof(double))&memcpymask); memory->destroy(x_hold); x_hold = nullptr; } @@ -2330,19 +2330,19 @@ void AtomVec::write_data_restore_restricted() // no other write_data Velocities fields are Nx3 double arrays if (v_hold) { - memcpy(&v[0][0],&v_hold[0][0],3*nlocal*sizeof(double)); + memcpy(&v[0][0],&v_hold[0][0],(3*nlocal*sizeof(double))&memcpymask); memory->destroy(v_hold); v_hold = nullptr; } if (omega_hold) { - memcpy(&atom->omega[0][0],&omega_hold[0][0],3*nlocal*sizeof(double)); + memcpy(&atom->omega[0][0],&omega_hold[0][0],(3*nlocal*sizeof(double))&memcpymask); memory->destroy(omega_hold); omega_hold = nullptr; } if (angmom_hold) { - memcpy(&atom->angmom[0][0],&angmom_hold[0][0],3*nlocal*sizeof(double)); + memcpy(&atom->angmom[0][0],&angmom_hold[0][0],(3*nlocal*sizeof(double))&memcpymask); memory->destroy(angmom_hold); angmom_hold = nullptr; } diff --git a/src/dump.cpp b/src/dump.cpp index 7773be5ef2a..84bde5ad499 100644 --- a/src/dump.cpp +++ b/src/dump.cpp @@ -409,9 +409,9 @@ void Dump::write() int nlocal = atom->nlocal; if (nlocal > maxpbc) pbc_allocate(); if (nlocal) { - memcpy(&xpbc[0][0],&atom->x[0][0],3*nlocal*sizeof(double)); - memcpy(&vpbc[0][0],&atom->v[0][0],3*nlocal*sizeof(double)); - memcpy(imagepbc,atom->image,nlocal*sizeof(imageint)); + memcpy(&xpbc[0][0],&atom->x[0][0],(3*nlocal*sizeof(double))&memcpymask); + memcpy(&vpbc[0][0],&atom->v[0][0],(3*nlocal*sizeof(double))&memcpymask); + memcpy(imagepbc,atom->image,(nlocal*sizeof(imageint))&memcpymask); } xhold = atom->x; vhold = atom->v; diff --git a/src/lmptype.h b/src/lmptype.h index ab3c97d5ada..2b2a7498245 100644 --- a/src/lmptype.h +++ b/src/lmptype.h @@ -64,6 +64,13 @@ namespace LAMMPS_NS { #define HISTMASK 0xDFFFFFFF #define SPECIALMASK 0x3FFFFFFF +// mask to curb data sizes when calling memcpy() to avoid bogus compiler warnings +#if UINTPTR_MAX > (1UL<<63) +static constexpr uint64_t memcpymask = (static_cast(1) << 63) - 1U; +#else +static constexpr uint32_t memcpymask = (static_cast(1) << 31) - 1U; +#endif + // default to 32-bit smallint and other ints, 64-bit bigint #if !defined(LAMMPS_SMALLSMALL) && !defined(LAMMPS_BIGBIG) && !defined(LAMMPS_SMALLBIG) diff --git a/src/variable.cpp b/src/variable.cpp index b0667b9941d..326d01c759e 100644 --- a/src/variable.cpp +++ b/src/variable.cpp @@ -4739,7 +4739,7 @@ int Variable::special_function(const std::string &word, char *contents, Tree **t double *result; memory->create(result,atom->nlocal,"variable:result"); - memcpy(result,reader[ivar]->fixstore->vstore,atom->nlocal*sizeof(double)); + memcpy(result,reader[ivar]->fixstore->vstore,(atom->nlocal*sizeof(double))&memcpymask); int done = reader[ivar]->read_peratom(); if (done) remove(ivar); From 53c3fa2afd50dd2e21907093e7ae148a404b303b Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 27 Dec 2024 01:54:44 -0500 Subject: [PATCH 07/34] memcpymask is a constant and thus should be uppercase --- src/MACHDYN/atom_vec_smd.cpp | 4 ++-- src/REPLICA/prd.cpp | 6 +++--- src/atom_vec.cpp | 16 ++++++++-------- src/dump.cpp | 6 +++--- src/lmptype.h | 4 ++-- src/variable.cpp | 2 +- 6 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/MACHDYN/atom_vec_smd.cpp b/src/MACHDYN/atom_vec_smd.cpp index 2bb667467c0..e959e8dfe2c 100644 --- a/src/MACHDYN/atom_vec_smd.cpp +++ b/src/MACHDYN/atom_vec_smd.cpp @@ -201,7 +201,7 @@ void AtomVecSMD::write_data_restricted_to_general() int nlocal = atom->nlocal; memory->create(x0_hold,nlocal,3,"atomvec:x0_hold"); - if (nlocal) memcpy(&x0_hold[0][0],&x0[0][0],(3*nlocal*sizeof(double))&memcpymask); + if (nlocal) memcpy(&x0_hold[0][0],&x0[0][0],(3*nlocal*sizeof(double))&MEMCPYMASK); for (int i = 0; i < nlocal; i++) domain->restricted_to_general_coords(x0[i]); @@ -221,7 +221,7 @@ void AtomVecSMD::write_data_restore_restricted() if (!x0_hold) return; int nlocal = atom->nlocal; - memcpy(&x0[0][0],&x0_hold[0][0],(3*nlocal*sizeof(double))&memcpymask); + memcpy(&x0[0][0],&x0_hold[0][0],(3*nlocal*sizeof(double))&MEMCPYMASK); memory->destroy(x0_hold); x0_hold = nullptr; } diff --git a/src/REPLICA/prd.cpp b/src/REPLICA/prd.cpp index 1b844adb2a6..241fa3db27d 100644 --- a/src/REPLICA/prd.cpp +++ b/src/REPLICA/prd.cpp @@ -770,9 +770,9 @@ void PRD::replicate(int ireplica) int nlocal = atom->nlocal; if (universe->iworld == ireplica) { - memcpy(tagall,tag,(nlocal*sizeof(tagint))&memcpymask); - memcpy(xall[0],x[0],(3*nlocal*sizeof(double))&memcpymask); - memcpy(imageall,image,(nlocal*sizeof(imageint))&memcpymask); + memcpy(tagall,tag,(nlocal*sizeof(tagint))&MEMCPYMASK); + memcpy(xall[0],x[0],(3*nlocal*sizeof(double))&MEMCPYMASK); + memcpy(imageall,image,(nlocal*sizeof(imageint))&MEMCPYMASK); } MPI_Bcast(tagall,natoms,MPI_LMP_TAGINT,ireplica,comm_replica); diff --git a/src/atom_vec.cpp b/src/atom_vec.cpp index c6053bd7e02..4e59db5b75f 100644 --- a/src/atom_vec.cpp +++ b/src/atom_vec.cpp @@ -2269,7 +2269,7 @@ void AtomVec::write_data_restricted_to_general() int nlocal = atom->nlocal; memory->create(x_hold,nlocal,3,"atomvec:x_hold"); - if (nlocal) memcpy(&x_hold[0][0],&x[0][0],(3*nlocal*sizeof(double))&memcpymask); + if (nlocal) memcpy(&x_hold[0][0],&x[0][0],(3*nlocal*sizeof(double))&MEMCPYMASK); for (int i = 0; i < nlocal; i++) domain->restricted_to_general_coords(x[i]); @@ -2290,17 +2290,17 @@ void AtomVec::write_data_restricted_to_general() if (array == v) { memory->create(v_hold,nlocal,3,"atomvec:v_hold"); - if (nlocal) memcpy(&v_hold[0][0],&v[0][0],(3*nlocal*sizeof(double))&memcpymask); + if (nlocal) memcpy(&v_hold[0][0],&v[0][0],(3*nlocal*sizeof(double))&MEMCPYMASK); for (int i = 0; i < nlocal; i++) domain->restricted_to_general_vector(v[i]); } else if (array == omega) { memory->create(omega_hold,nlocal,3,"atomvec:omega_hold"); - if (nlocal) memcpy(&omega_hold[0][0],&omega[0][0],(3*nlocal*sizeof(double))&memcpymask); + if (nlocal) memcpy(&omega_hold[0][0],&omega[0][0],(3*nlocal*sizeof(double))&MEMCPYMASK); for (int i = 0; i < nlocal; i++) domain->restricted_to_general_vector(omega[i]); } else if (array == angmom) { memory->create(angmom_hold,nlocal,3,"atomvec:angmom_hold"); - if (nlocal) memcpy(&angmom_hold[0][0],&angmom[0][0],(3*nlocal*sizeof(double))&memcpymask); + if (nlocal) memcpy(&angmom_hold[0][0],&angmom[0][0],(3*nlocal*sizeof(double))&MEMCPYMASK); for (int i = 0; i < nlocal; i++) domain->restricted_to_general_vector(angmom[i]); } @@ -2321,7 +2321,7 @@ void AtomVec::write_data_restore_restricted() int nlocal = atom->nlocal; if (x_hold) { - memcpy(&x[0][0],&x_hold[0][0],(3*nlocal*sizeof(double))&memcpymask); + memcpy(&x[0][0],&x_hold[0][0],(3*nlocal*sizeof(double))&MEMCPYMASK); memory->destroy(x_hold); x_hold = nullptr; } @@ -2330,19 +2330,19 @@ void AtomVec::write_data_restore_restricted() // no other write_data Velocities fields are Nx3 double arrays if (v_hold) { - memcpy(&v[0][0],&v_hold[0][0],(3*nlocal*sizeof(double))&memcpymask); + memcpy(&v[0][0],&v_hold[0][0],(3*nlocal*sizeof(double))&MEMCPYMASK); memory->destroy(v_hold); v_hold = nullptr; } if (omega_hold) { - memcpy(&atom->omega[0][0],&omega_hold[0][0],(3*nlocal*sizeof(double))&memcpymask); + memcpy(&atom->omega[0][0],&omega_hold[0][0],(3*nlocal*sizeof(double))&MEMCPYMASK); memory->destroy(omega_hold); omega_hold = nullptr; } if (angmom_hold) { - memcpy(&atom->angmom[0][0],&angmom_hold[0][0],(3*nlocal*sizeof(double))&memcpymask); + memcpy(&atom->angmom[0][0],&angmom_hold[0][0],(3*nlocal*sizeof(double))&MEMCPYMASK); memory->destroy(angmom_hold); angmom_hold = nullptr; } diff --git a/src/dump.cpp b/src/dump.cpp index 84bde5ad499..259bd49f79a 100644 --- a/src/dump.cpp +++ b/src/dump.cpp @@ -409,9 +409,9 @@ void Dump::write() int nlocal = atom->nlocal; if (nlocal > maxpbc) pbc_allocate(); if (nlocal) { - memcpy(&xpbc[0][0],&atom->x[0][0],(3*nlocal*sizeof(double))&memcpymask); - memcpy(&vpbc[0][0],&atom->v[0][0],(3*nlocal*sizeof(double))&memcpymask); - memcpy(imagepbc,atom->image,(nlocal*sizeof(imageint))&memcpymask); + memcpy(&xpbc[0][0],&atom->x[0][0],(3*nlocal*sizeof(double))&MEMCPYMASK); + memcpy(&vpbc[0][0],&atom->v[0][0],(3*nlocal*sizeof(double))&MEMCPYMASK); + memcpy(imagepbc,atom->image,(nlocal*sizeof(imageint))&MEMCPYMASK); } xhold = atom->x; vhold = atom->v; diff --git a/src/lmptype.h b/src/lmptype.h index 2b2a7498245..26796c6ded3 100644 --- a/src/lmptype.h +++ b/src/lmptype.h @@ -66,9 +66,9 @@ namespace LAMMPS_NS { // mask to curb data sizes when calling memcpy() to avoid bogus compiler warnings #if UINTPTR_MAX > (1UL<<63) -static constexpr uint64_t memcpymask = (static_cast(1) << 63) - 1U; +static constexpr uint64_t MEMCPYMASK = (static_cast(1) << 63) - 1U; #else -static constexpr uint32_t memcpymask = (static_cast(1) << 31) - 1U; +static constexpr uint32_t MEMCPYMASK = (static_cast(1) << 31) - 1U; #endif // default to 32-bit smallint and other ints, 64-bit bigint diff --git a/src/variable.cpp b/src/variable.cpp index 326d01c759e..135882fde97 100644 --- a/src/variable.cpp +++ b/src/variable.cpp @@ -4739,7 +4739,7 @@ int Variable::special_function(const std::string &word, char *contents, Tree **t double *result; memory->create(result,atom->nlocal,"variable:result"); - memcpy(result,reader[ivar]->fixstore->vstore,(atom->nlocal*sizeof(double))&memcpymask); + memcpy(result,reader[ivar]->fixstore->vstore,(atom->nlocal*sizeof(double))&MEMCPYMASK); int done = reader[ivar]->read_peratom(); if (done) remove(ivar); From de0baba124751709afea927b97e2976c1dbd24f1 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 27 Dec 2024 03:50:51 -0500 Subject: [PATCH 08/34] add updates/corrections, improve formatting --- doc/src/Speed_gpu.rst | 41 ++++++++++++++++++++++++-------------- doc/src/Speed_intel.rst | 44 ++++++++++++++++++++--------------------- 2 files changed, 48 insertions(+), 37 deletions(-) diff --git a/doc/src/Speed_gpu.rst b/doc/src/Speed_gpu.rst index 42bd8bf0591..c456042452f 100644 --- a/doc/src/Speed_gpu.rst +++ b/doc/src/Speed_gpu.rst @@ -31,7 +31,8 @@ Coulombics. It has the following general features: (for Nvidia GPUs, AMD GPUs, Intel GPUs, and multicore CPUs). so that the same functionality is supported on a variety of hardware. -**Required hardware/software:** +Required hardware/software +"""""""""""""""""""""""""" To compile and use this package in CUDA mode, you currently need to have an NVIDIA GPU and install the corresponding NVIDIA CUDA @@ -69,12 +70,14 @@ To compile and use this package in HIP mode, you have to have the AMD ROCm software installed. Versions of ROCm older than 3.5 are currently deprecated by AMD. -**Building LAMMPS with the GPU package:** +Building LAMMPS with the GPU package +"""""""""""""""""""""""""""""""""""" See the :ref:`Build extras ` page for instructions. -**Run with the GPU package from the command line:** +Run with the GPU package from the command-line +"""""""""""""""""""""""""""""""""""""""""""""" The ``mpirun`` or ``mpiexec`` command sets the total number of MPI tasks used by LAMMPS (one or multiple per compute node) and the number of MPI @@ -133,7 +136,8 @@ affect the setting for bonded interactions (LAMMPS default is "on"). The "off" setting for pairwise interaction is currently required for GPU package pair styles. -**Or run with the GPU package by editing an input script:** +Run with the GPU package by editing an input script +""""""""""""""""""""""""""""""""""""""""""""""""""" The discussion above for the ``mpirun`` or ``mpiexec`` command, MPI tasks/node, and use of multiple MPI tasks/GPU is the same. @@ -149,7 +153,8 @@ You must also use the :doc:`package gpu ` command to enable the GPU package, unless the ``-sf gpu`` or ``-pk gpu`` :doc:`command-line switches ` were used. It specifies the number of GPUs/node to use, as well as other options. -**Speed-ups to expect:** +Speed-up to expect +"""""""""""""""""" The performance of a GPU versus a multicore CPU is a function of your hardware, which pair style is used, the number of atoms/GPU, and the @@ -176,10 +181,13 @@ better with multiple OMP threads because the inter-process communication is higher for these styles with the GPU package in order to allow deterministic results. -**Guidelines for best performance:** +Guidelines for best performance +""""""""""""""""""""""""""""""" -* Using multiple MPI tasks per GPU will often give the best performance, - as allowed my most multicore CPU/GPU configurations. +* Using multiple MPI tasks (2-10) per GPU will often give the best + performance, as allowed my most multicore CPU/GPU configurations. + Using too many MPI tasks will result in wors performance due to + growing overhead. * If the number of particles per MPI task is small (e.g. 100s of particles), it can be more efficient to run with fewer MPI tasks per GPU, even if you do not use all the cores on the compute node. @@ -199,12 +207,13 @@ deterministic results. :doc:`angle `, :doc:`dihedral `, :doc:`improper `, and :doc:`long-range ` calculations will not be included in the "Pair" time. -* Since only part of the pppm kspace style is GPU accelerated, it - may be faster to only use GPU acceleration for Pair styles with - long-range electrostatics. See the "pair/only" keyword of the - package command for a shortcut to do that. The work between kspace - on the CPU and non-bonded interactions on the GPU can be balanced - through adjusting the coulomb cutoff without loss of accuracy. +* Since only part of the pppm kspace style is GPU accelerated, it may be + faster to only use GPU acceleration for Pair styles with long-range + electrostatics. See the "pair/only" keyword of the :doc:`package + command ` for a shortcut to do that. The distribution of + work between kspace on the CPU and non-bonded interactions on the GPU + can be balanced through adjusting the coulomb cutoff without loss of + accuracy. * When the *mode* setting for the package gpu command is force/neigh, the time for neighbor list calculations on the GPU will be added into the "Pair" time, not the "Neigh" time. An additional breakdown of the @@ -220,4 +229,6 @@ deterministic results. Restrictions """""""""""" -None. +When using :doc:`hybrid pair styles `, the neighbor list +must be generated on the host instead of the GPU and thus the potential +GPU acceleration is reduced. diff --git a/doc/src/Speed_intel.rst b/doc/src/Speed_intel.rst index dd6c27b4e7a..78a88f44070 100644 --- a/doc/src/Speed_intel.rst +++ b/doc/src/Speed_intel.rst @@ -1,5 +1,5 @@ INTEL package -================== +============= The INTEL package is maintained by Mike Brown at Intel Corporation. It provides two methods for accelerating simulations, @@ -13,18 +13,18 @@ twice, once on the CPU and once with an offload flag. This allows LAMMPS to run on the CPU cores and co-processor cores simultaneously. Currently Available INTEL Styles -""""""""""""""""""""""""""""""""""""" +"""""""""""""""""""""""""""""""" * Angle Styles: charmm, harmonic -* Bond Styles: fene, fourier, harmonic +* Bond Styles: fene, harmonic * Dihedral Styles: charmm, fourier, harmonic, opls -* Fixes: nve, npt, nvt, nvt/sllod, nve/asphere +* Fixes: nve, npt, nvt, nvt/sllod, nve/asphere, electrode/conp, electrode/conq, electrode/thermo * Improper Styles: cvff, harmonic * Pair Styles: airebo, airebo/morse, buck/coul/cut, buck/coul/long, buck, dpd, eam, eam/alloy, eam/fs, gayberne, lj/charmm/coul/charmm, lj/charmm/coul/long, lj/cut, lj/cut/coul/long, lj/long/coul/long, - rebo, sw, tersoff -* K-Space Styles: pppm, pppm/disp + rebo, snap, sw, tersoff +* K-Space Styles: pppm, pppm/disp, pppm/electrode .. warning:: @@ -33,7 +33,7 @@ Currently Available INTEL Styles input requires it, LAMMPS will abort with an error message. Speed-up to expect -""""""""""""""""""" +"""""""""""""""""" The speedup will depend on your simulation, the hardware, which styles are used, the number of atoms, and the floating-point @@ -312,21 +312,21 @@ almost all cases. recommended, especially when running on a machine with Intel Hyper-Threading technology disabled. -Run with the INTEL package from the command line -""""""""""""""""""""""""""""""""""""""""""""""""""""" - -To enable INTEL optimizations for all available styles used in -the input script, the ``-sf intel`` :doc:`command-line switch ` can be used without any requirement for -editing the input script. This switch will automatically append -"intel" to styles that support it. It also invokes a default command: -:doc:`package intel 1 `. This package command is used to set -options for the INTEL package. The default package command will -specify that INTEL calculations are performed in mixed precision, -that the number of OpenMP threads is specified by the OMP_NUM_THREADS -environment variable, and that if co-processors are present and the -binary was built with offload support, that 1 co-processor per node -will be used with automatic balancing of work between the CPU and the -co-processor. +Run with the INTEL package from the command-line +"""""""""""""""""""""""""""""""""""""""""""""""" + +To enable INTEL optimizations for all available styles used in the input +script, the ``-sf intel`` :doc:`command-line switch ` can +be used without any requirement for editing the input script. This +switch will automatically append "intel" to styles that support it. It +also invokes a default command: :doc:`package intel 1 `. This +package command is used to set options for the INTEL package. The +default package command will specify that INTEL calculations are +performed in mixed precision, that the number of OpenMP threads is +specified by the OMP_NUM_THREADS environment variable, and that if +co-processors are present and the binary was built with offload support, +that 1 co-processor per node will be used with automatic balancing of +work between the CPU and the co-processor. You can specify different options for the INTEL package by using the ``-pk intel Nphi`` :doc:`command-line switch ` with From fb3354196106e0df47879f62ddd24c94725ee701 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 27 Dec 2024 04:01:23 -0500 Subject: [PATCH 09/34] use command-line consistently where applicable and drop "line" where not --- doc/src/Build_basics.rst | 2 +- doc/src/Build_cmake.rst | 14 +++++++------- doc/src/Build_development.rst | 10 +++++----- doc/src/Build_extras.rst | 8 ++++---- doc/src/Build_windows.rst | 6 +++--- doc/src/Classes_lammps.rst | 2 +- doc/src/Commands_input.rst | 2 +- doc/src/Commands_removed.rst | 2 +- doc/src/Developer_org.rst | 4 ++-- doc/src/Developer_unittest.rst | 4 ++-- doc/src/Developer_write_pair.rst | 10 +++++----- doc/src/Errors_debug.rst | 4 ++-- doc/src/Errors_messages.rst | 2 +- doc/src/Fortran.rst | 12 ++++++------ doc/src/Howto_cmake.rst | 8 ++++---- doc/src/Howto_github.rst | 2 +- doc/src/Howto_lammps_gui.rst | 22 +++++++++++----------- doc/src/Howto_peri.rst | 4 ++-- doc/src/Howto_wsl.rst | 2 +- doc/src/Install_git.rst | 2 +- doc/src/Modify_style.rst | 2 +- doc/src/Packages_details.rst | 4 ++-- doc/src/Run_basics.rst | 6 +++--- doc/src/Run_options.rst | 2 +- doc/src/Run_windows.rst | 2 +- doc/src/Speed_gpu.rst | 4 ++-- doc/src/Speed_kokkos.rst | 8 ++++---- doc/src/Speed_omp.rst | 2 +- doc/src/Speed_opt.rst | 2 +- doc/src/Tools.rst | 14 +++++++------- doc/src/dump_image.rst | 2 +- doc/src/fix_imd.rst | 2 +- doc/src/fix_precession_spin.rst | 2 +- doc/src/kim_commands.rst | 9 +++++---- doc/src/label.rst | 12 ++++++------ doc/src/package.rst | 4 ++-- doc/src/pair_mgpt.rst | 4 ++-- doc/src/pair_thole.rst | 2 +- doc/src/read_restart.rst | 10 +++++----- doc/src/suffix.rst | 2 +- src/PHONON/fix_phonon.cpp | 6 +++--- src/PTM/ptm_voronoi_config.h | 4 ++-- src/error.cpp | 8 ++++---- src/input.cpp | 8 ++++---- src/lammps.cpp | 10 +++++----- src/lammps.h | 2 +- src/library.cpp | 16 ++++++++-------- src/utils.h | 4 ++-- src/write_dump.cpp | 2 +- 49 files changed, 139 insertions(+), 138 deletions(-) diff --git a/doc/src/Build_basics.rst b/doc/src/Build_basics.rst index e82832cf572..bafeacc416a 100644 --- a/doc/src/Build_basics.rst +++ b/doc/src/Build_basics.rst @@ -160,7 +160,7 @@ with the OpenMP 3.1 semantics used in LAMMPS for maximal compatibility with compiler versions in use. If compilation with OpenMP enabled fails because of your compiler requiring strict OpenMP 4.0 semantics, you can change the behavior by adding ``-D LAMMPS_OMP_COMPAT=4`` to the -``LMP_INC`` variable in your makefile, or add it to the command line +``LMP_INC`` variable in your makefile, or add it to the command-line flags while configuring with CMake. LAMMPS will auto-detect a suitable setting for most GNU, Clang, and Intel compilers. diff --git a/doc/src/Build_cmake.rst b/doc/src/Build_cmake.rst index 1b2bef936ed..c8c74c5182c 100644 --- a/doc/src/Build_cmake.rst +++ b/doc/src/Build_cmake.rst @@ -8,7 +8,7 @@ packages. Links to those pages on the :doc:`Build overview ` page. The following text assumes some familiarity with CMake and focuses on -using the command line tool ``cmake`` and what settings are supported +using the command-line tool ``cmake`` and what settings are supported for building LAMMPS. A more detailed tutorial on how to use CMake itself, the text mode or graphical user interface, to change the generated output files for different build tools and development @@ -42,9 +42,9 @@ that want to modify or extend LAMMPS. and adapt the LAMMPS default build configuration accordingly. - CMake can generate files for different build tools and integrated development environments (IDE). -- CMake supports customization of settings with a command line, text +- CMake supports customization of settings with a command-line, text mode, or graphical user interface. No manual editing of files, - knowledge of file formats or complex command line syntax is required. + knowledge of file formats or complex command-line syntax is required. - All enabled components are compiled in a single build operation. - Automated dependency tracking for all files and configuration options. - Support for true out-of-source compilation. Multiple configurations @@ -68,7 +68,7 @@ that purpose you can use either the command-line utility ``cmake`` (or graphical utility ``cmake-gui``, or use them interchangeably. The second step is then the compilation and linking of all objects, libraries, and executables using the selected build tool. Here is a -minimal example using the command line version of CMake to build LAMMPS +minimal example using the command-line version of CMake to build LAMMPS with no add-on packages enabled and no customization: .. code-block:: bash @@ -131,7 +131,7 @@ file called ``CMakeLists.txt`` (for LAMMPS it is located in the configuration step. The cache file contains all current CMake settings. To modify settings, enable or disable features, you need to set -*variables* with either the ``-D`` command line flag (``-D +*variables* with either the ``-D`` command-line flag (``-D VARIABLE1_NAME=value``) or change them in the text mode of the graphical user interface. The ``-D`` flag can be used several times in one command. @@ -141,11 +141,11 @@ a different compiler tool chain. Those are loaded with the ``-C`` flag (``-C ../cmake/presets/basic.cmake``). This step would only be needed once, as the settings from the preset files are stored in the ``CMakeCache.txt`` file. It is also possible to customize the build -by adding one or more ``-D`` flags to the CMake command line. +by adding one or more ``-D`` flags to the CMake command. Generating files for alternate build tools (e.g. Ninja) and project files for IDEs like Eclipse, CodeBlocks, or Kate can be selected using the ``-G`` -command line flag. A list of available generator settings for your +command-line flag. A list of available generator settings for your specific CMake version is given when running ``cmake --help``. .. _cmake_multiconfig: diff --git a/doc/src/Build_development.rst b/doc/src/Build_development.rst index 3adec76abb5..5c6475c7fa1 100644 --- a/doc/src/Build_development.rst +++ b/doc/src/Build_development.rst @@ -263,9 +263,9 @@ will be skipped if prerequisite features are not available in LAMMPS. time. Preference is given to parts of the code base that are easy to test or commonly used. -Tests as shown by the ``ctest`` program are command lines defined in the +Tests as shown by the ``ctest`` program are commands defined in the ``CMakeLists.txt`` files in the ``unittest`` directory tree. A few -tests simply execute LAMMPS with specific command line flags and check +tests simply execute LAMMPS with specific command-line flags and check the output to the screen for expected content. A large number of unit tests are special tests programs using the `GoogleTest framework `_ and linked to the LAMMPS @@ -420,7 +420,7 @@ during MD timestepping and manipulate per-atom properties like positions, velocities, and forces. For those fix styles, testing can be done in a very similar fashion as for force fields and thus there is a test program `test_fix_timestep` that shares a lot of code, properties, -and command line flags with the force field style testers described in +and command-line flags with the force field style testers described in the previous section. This tester will set up a small molecular system run with verlet run @@ -642,10 +642,10 @@ The following target are available for both, GNU make and CMake: .. _gh-cli: -GitHub command line interface +GitHub command-line interface ----------------------------- -GitHub has developed a `command line tool `_ +GitHub has developed a `command-line tool `_ to interact with the GitHub website via a command called ``gh``. This is extremely convenient when working with a Git repository hosted on GitHub (like LAMMPS). It is thus highly recommended to install it diff --git a/doc/src/Build_extras.rst b/doc/src/Build_extras.rst index a278b393c54..5882da9e7b8 100644 --- a/doc/src/Build_extras.rst +++ b/doc/src/Build_extras.rst @@ -209,7 +209,7 @@ necessary for ``hipcc`` and the linker to work correctly. Using the CHIP-SPV implementation of HIP is supported. It allows one to run HIP code on Intel GPUs via the OpenCL or Level Zero back ends. To use CHIP-SPV, you must set ``-DHIP_USE_DEVICE_SORT=OFF`` in your CMake -command line as CHIP-SPV does not yet support hipCUB. As of Summer 2022, +command-line as CHIP-SPV does not yet support hipCUB. As of Summer 2022, the use of HIP for Intel GPUs is experimental. You should only use this option in preparations to run on Aurora system at Argonne. @@ -421,9 +421,9 @@ minutes to hours) to build. Of course you only need to do that once.) cmake build system. The ``lib/kim/Install.py`` script supports a ``CMAKE`` environment variable if the cmake executable is named other than ``cmake`` on your system. Additional environment variables may be - provided on the command line for use by cmake. For example, to use the + provided on the command-line for use by cmake. For example, to use the ``cmake3`` executable and tell it to use the gnu version 11 compilers - to build KIM, one could use the following command line. + to build KIM, one could use the following command. .. code-block:: bash @@ -2191,7 +2191,7 @@ verified to work in February 2020 with Quantum Espresso versions 6.3 to from the sources in the *lib* folder (including the essential libqmmm.a) are not included in the static LAMMPS library and (currently) not installed, while their code is included in the - shared LAMMPS library. Thus a typical command line to configure + shared LAMMPS library. Thus a typical command to configure building LAMMPS for QMMM would be: .. code-block:: bash diff --git a/doc/src/Build_windows.rst b/doc/src/Build_windows.rst index d1748825ebb..27562db4801 100644 --- a/doc/src/Build_windows.rst +++ b/doc/src/Build_windows.rst @@ -100,9 +100,9 @@ procedure. It is possible to use both the integrated CMake support of the Visual Studio IDE or use an external CMake installation (e.g. downloaded from -cmake.org) to create build files and compile LAMMPS from the command line. +cmake.org) to create build files and compile LAMMPS from the command-line. -Compilation via command line and unit tests are checked automatically +Compilation via command-line and unit tests are checked automatically for the LAMMPS development branch through `GitHub Actions `_. @@ -115,7 +115,7 @@ for the LAMMPS development branch through Please note, that for either approach CMake will create a so-called :ref:`"multi-configuration" build environment `, and -the command lines for building and testing LAMMPS must be adjusted +the commands for building and testing LAMMPS must be adjusted accordingly. The LAMMPS cmake folder contains a ``CMakeSettings.json`` file with diff --git a/doc/src/Classes_lammps.rst b/doc/src/Classes_lammps.rst index dd6798d9a15..167a619fae0 100644 --- a/doc/src/Classes_lammps.rst +++ b/doc/src/Classes_lammps.rst @@ -4,7 +4,7 @@ LAMMPS Class The LAMMPS class is encapsulating an MD simulation state and thus it is the class that needs to be created when starting a new simulation system state. The LAMMPS executable essentially creates one instance of this -class and passes the command line flags and tells it to process the +class and passes the command-line flags and tells it to process the provided input (a file or ``stdin``). It shuts the class down when control is returned to it and then exits. When using LAMMPS as a library from another code it is required to create an instance of this diff --git a/doc/src/Commands_input.rst b/doc/src/Commands_input.rst index dc0fb72dd97..0f6e8f94a29 100644 --- a/doc/src/Commands_input.rst +++ b/doc/src/Commands_input.rst @@ -69,7 +69,7 @@ WARNING message is printed. The :doc:`Errors ` page gives more information on what errors mean. The documentation for each command lists restrictions on how the command can be used. -You can use the :ref:`-skiprun ` command line flag +You can use the :ref:`-skiprun ` command-line flag to have LAMMPS skip the execution of any ``run``, ``minimize``, or similar commands to check the entire input for correct syntax to avoid crashes on typos or syntax errors in long runs. diff --git a/doc/src/Commands_removed.rst b/doc/src/Commands_removed.rst index ea8b3d4b037..777be3bf16c 100644 --- a/doc/src/Commands_removed.rst +++ b/doc/src/Commands_removed.rst @@ -18,7 +18,7 @@ LAMMPS executable directly instead of having a separate tool. A combination of the commands :doc:`read_restart ` and :doc:`write_data ` can be used to the same effect. For added convenience this conversion can also be triggered by -:doc:`command line flags ` +:doc:`command-line flags ` Fix ave/spatial and fix ave/spatial/sphere ------------------------------------------ diff --git a/doc/src/Developer_org.rst b/doc/src/Developer_org.rst index f1804655aeb..93632ae03fc 100644 --- a/doc/src/Developer_org.rst +++ b/doc/src/Developer_org.rst @@ -94,12 +94,12 @@ represents what is generally referred to as an "instance of LAMMPS". It is a composite holding pointers to instances of other core classes providing the core functionality of the MD engine in LAMMPS and through them abstractions of the required operations. The constructor of the -LAMMPS class will instantiate those instances, process the command line +LAMMPS class will instantiate those instances, process the command-line flags, initialize MPI (if not already done) and set up file pointers for input and output. The destructor will shut everything down and free all associated memory. Thus code for the standalone LAMMPS executable in ``main.cpp`` simply initializes MPI, instantiates a single instance of -LAMMPS while passing it the command line flags and input script. It +LAMMPS while passing it the command-line flags and input script. It deletes the LAMMPS instance after the method reading the input returns and shuts down the MPI environment before it exits the executable. diff --git a/doc/src/Developer_unittest.rst b/doc/src/Developer_unittest.rst index 07ffb0e2d85..86526b19dec 100644 --- a/doc/src/Developer_unittest.rst +++ b/doc/src/Developer_unittest.rst @@ -476,7 +476,7 @@ the tabulated coulomb, to test both code paths. The reference results in the YA files then should be compared manually, if they agree well enough within the limits of those two approximations. -The ``test_pair_style`` and equivalent programs have special command line options +The ``test_pair_style`` and equivalent programs have special command-line options to update the YAML files. Running a command like .. code-block:: bash @@ -609,7 +609,7 @@ and run the test with verbose output. For example, env TEST_ARGS=-v ctest -R ^MolPairStyle:lj_cut_coul_long -V -``ctest`` with the ``-V`` flag also shows the exact command line +``ctest`` with the ``-V`` flag also shows the exact command of the test. One can then use ``gdb --args`` to further debug and catch exceptions with the test command, for example, diff --git a/doc/src/Developer_write_pair.rst b/doc/src/Developer_write_pair.rst index 5d5e0810420..90b716d9c45 100644 --- a/doc/src/Developer_write_pair.rst +++ b/doc/src/Developer_write_pair.rst @@ -310,7 +310,7 @@ the constructor and the destructor. Pair styles are different from most classes in LAMMPS that define a "style", as their constructor only uses the LAMMPS class instance -pointer as an argument, but **not** the command line arguments of the +pointer as an argument, but **not** the arguments of the :doc:`pair_style command `. Instead, those arguments are processed in the ``Pair::settings()`` function (or rather the version in the derived class). The constructor is the place where global defaults @@ -891,7 +891,7 @@ originally created from mixing or not). These data file output functions are only useful for true pair-wise additive potentials, where the potential parameters can be entered through *multiple* :doc:`pair_coeff commands `. Pair styles -that require a single "pair_coeff \* \*" command line are not compatible +that require a single "pair_coeff \* \*" command are not compatible with reading their parameters from data files. For pair styles like *born/gauss* that do support writing to data files, the potential parameters will be read from the data file, if present, and @@ -1122,7 +1122,7 @@ once. Thus, the ``coeff()`` function has to do three tasks, each of which is delegated to a function in the ``PairTersoff`` class: #. map elements to atom types. Those follow the potential file name in the - command line arguments and are processed by the ``map_element2type()`` function. + command arguments and are processed by the ``map_element2type()`` function. #. read and parse the potential parameter file in the ``read_file()`` function. #. Build data structures where the original and derived parameters are indexed by all possible triples of atom types and thus can be looked @@ -1356,8 +1356,8 @@ either 0 or 1. The ``morseflag`` variable defaults to 0 and is set to 1 in the ``PairAIREBOMorse::settings()`` function which is called by the -:doc:`pair_style ` command. This function delegates -all command line processing and setting of other parameters to the +:doc:`pair_style ` command. This function delegates all +command argument processing and setting of other parameters to the ``PairAIREBO::settings()`` function of the base class. .. code-block:: c++ diff --git a/doc/src/Errors_debug.rst b/doc/src/Errors_debug.rst index b3f618dbf73..cc28273aa38 100644 --- a/doc/src/Errors_debug.rst +++ b/doc/src/Errors_debug.rst @@ -83,7 +83,7 @@ Run LAMMPS from within the debugger Running LAMMPS under the control of the debugger as shown below only works for a single MPI rank (for debugging a program running in parallel you usually need a parallel debugger program). A simple way to launch -GDB is to prefix the LAMMPS command line with ``gdb --args`` and then +GDB is to prefix the LAMMPS command-line with ``gdb --args`` and then type the command "run" at the GDB prompt. This will launch the debugger, load the LAMMPS executable and its debug info, and then run it. When it reaches the code causing the segmentation fault, it will @@ -180,7 +180,7 @@ inspect the behavior of a compiled program by essentially emulating a CPU and instrumenting the program while running. This slows down execution quite significantly, but can also report issues that are not resulting in a crash. The default valgrind tool is a memory checker and -you can use it by prefixing the normal command line with ``valgrind``. +you can use it by prefixing the normal command-line with ``valgrind``. Unlike GDB, this will also work for parallel execution, but it is recommended to redirect the valgrind output to a file (e.g. with ``--log-file=crash-%p.txt``, the %p will be substituted with the diff --git a/doc/src/Errors_messages.rst b/doc/src/Errors_messages.rst index 2468b3c6281..bfc395067a3 100644 --- a/doc/src/Errors_messages.rst +++ b/doc/src/Errors_messages.rst @@ -7774,7 +7774,7 @@ Doc page with :doc:`WARNING messages ` *Too few values in body section of molecule file* Self-explanatory. -*Too many -pk arguments in command line* +*Too many -pk arguments in command-line* The string formed by concatenating the arguments is too long. Use a package command in the input script instead. diff --git a/doc/src/Fortran.rst b/doc/src/Fortran.rst index a1ea9a72df7..d50c7bdcf3b 100644 --- a/doc/src/Fortran.rst +++ b/doc/src/Fortran.rst @@ -16,7 +16,7 @@ compiled alongside the code using it from the source code in ``fortran/lammps.f90`` *and* with the same compiler used to build the rest of the Fortran code that interfaces to LAMMPS. When linking, you also need to :doc:`link to the LAMMPS library `. A typical -command line for a simple program using the Fortran interface would be: +command for a simple program using the Fortran interface would be: .. code-block:: bash @@ -91,12 +91,12 @@ function and triggered with the optional logical argument set to CALL lmp%close(.TRUE.) END PROGRAM testlib -It is also possible to pass command line flags from Fortran to C/C++ and +It is also possible to pass command-line flags from Fortran to C/C++ and thus make the resulting executable behave similarly to the standalone executable (it will ignore the `-in/-i` flag, though). This allows -using the command line to configure accelerator and suffix settings, +using the command-line to configure accelerator and suffix settings, configure screen and logfile output, or to set index style variables -from the command line and more. Here is a correspondingly adapted +from the command-line and more. Here is a correspondingly adapted version of the previous example: .. code-block:: fortran @@ -108,7 +108,7 @@ version of the previous example: CHARACTER(LEN=128), ALLOCATABLE :: command_args(:) INTEGER :: i, argc - ! copy command line flags to `command_args()` + ! copy command-line flags to `command_args()` argc = COMMAND_ARGUMENT_COUNT() ALLOCATE(command_args(0:argc)) DO i=0, argc @@ -448,7 +448,7 @@ of the contents of the :f:mod:`LIBLAMMPS` Fortran interface to LAMMPS. compiled with MPI support, it will also initialize MPI, if it has not already been initialized before. - The *args* argument with the list of command line parameters is + The *args* argument with the list of command-line parameters is optional and so it the *comm* argument with the MPI communicator. If *comm* is not provided, ``MPI_COMM_WORLD`` is assumed. For more details please see the documentation of :cpp:func:`lammps_open`. diff --git a/doc/src/Howto_cmake.rst b/doc/src/Howto_cmake.rst index 43aa5192931..6b8fc82bad1 100644 --- a/doc/src/Howto_cmake.rst +++ b/doc/src/Howto_cmake.rst @@ -56,7 +56,7 @@ using a shell like Bash or Zsh. Visual Studio IDE with the bundled CMake or from the Windows command prompt using a separately installed CMake package, both using the native Microsoft Visual C++ compilers and (optionally) the Microsoft MPI SDK. This tutorial, however, only - covers unix-like command line interfaces. + covers unix-like command-line interfaces. We also assume that you have downloaded and unpacked a recent LAMMPS source code package or used Git to create a clone of the LAMMPS sources on your compilation machine. @@ -277,7 +277,7 @@ Setting options --------------- Options that enable, disable or modify settings are modified by setting -the value of CMake variables. This is done on the command line with the +the value of CMake variables. This is done on the command-line with the *-D* flag in the format ``-D VARIABLE=value``, e.g. ``-D CMAKE_BUILD_TYPE=Release`` or ``-D BUILD_MPI=on``. There is one quirk: when used before the CMake directory, there may be a space between the @@ -376,7 +376,7 @@ Using presets ------------- Since LAMMPS has a lot of optional features and packages, specifying -them all on the command line can be tedious. Or when selecting a +them all on the command-line can be tedious. Or when selecting a different compiler toolchain, multiple options have to be changed consistently and that is rather error prone. Or when enabling certain packages, they require consistent settings to be operated in a @@ -384,7 +384,7 @@ particular mode. For this purpose, we are providing a selection of "preset files" for CMake in the folder ``cmake/presets``. They represent a way to pre-load or override the CMake configuration cache by setting or changing CMake variables. Preset files are loaded using the -*-C* command line flag. You can combine loading multiple preset files or +*-C* command-line flag. You can combine loading multiple preset files or change some variables later with additional *-D* flags. A few examples: .. code-block:: bash diff --git a/doc/src/Howto_github.rst b/doc/src/Howto_github.rst index b81716c09d8..78a05f113c0 100644 --- a/doc/src/Howto_github.rst +++ b/doc/src/Howto_github.rst @@ -163,7 +163,7 @@ After everything is done, add the files to the branch and commit them: *git rm*, *git mv* for adding, removing, renaming individual files, respectively, and then *git commit* to finalize the commit. Carefully check all pending changes with *git status* before - committing them. If you find doing this on the command line too + committing them. If you find doing this on the command-line too tedious, consider using a GUI, for example the one included in git distributions written in Tk, i.e. use *git gui* (on some Linux distributions it may be required to install an additional package to diff --git a/doc/src/Howto_lammps_gui.rst b/doc/src/Howto_lammps_gui.rst index 21e6a31cccb..58d42c0bde6 100644 --- a/doc/src/Howto_lammps_gui.rst +++ b/doc/src/Howto_lammps_gui.rst @@ -20,7 +20,7 @@ to the online LAMMPS documentation for known LAMMPS commands and styles. (Ubuntu 20.04LTS or later and compatible), macOS (version 11 aka Big Sur or later), and Windows (version 10 or later) :ref:`are available ` for download. Non-MPI LAMMPS executables (as - ``lmp``) for running LAMMPS from the command line and :doc:`some + ``lmp``) for running LAMMPS from the command-line and :doc:`some LAMMPS tools ` compiled executables are also included. The source code for LAMMPS-GUI is included in the LAMMPS source code @@ -29,16 +29,16 @@ to the online LAMMPS documentation for known LAMMPS commands and styles. `. LAMMPS-GUI tries to provide an experience similar to what people -traditionally would have running LAMMPS using a command line window and +traditionally would have running LAMMPS using a command-line window and the console LAMMPS executable but just rolled into a single executable: - writing & editing LAMMPS input files with a text editor -- run LAMMPS on those input file with selected command line flags +- run LAMMPS on those input file with selected command-line flags - extract data from the created files and visualize it with and external software That procedure is quite effective for people proficient in using the -command line, as that allows them to use tools for the individual steps +command-line, as that allows them to use tools for the individual steps that they are most comfortable with. In fact, it is often *required* to adopt this workflow when running LAMMPS simulations on high-performance computing facilities. @@ -165,9 +165,9 @@ window is stored when exiting and restored when starting again. Opening Files ^^^^^^^^^^^^^ -The LAMMPS-GUI application can be launched without command line arguments +The LAMMPS-GUI application can be launched without command-line arguments and then starts with an empty buffer in the *Editor* window. If arguments -are given LAMMPS will use first command line argument as the file name for +are given LAMMPS will use first command-line argument as the file name for the *Editor* buffer and reads its contents into the buffer, if the file exists. All further arguments are ignored. Files can also be opened via the *File* menu, the `Ctrl-O` (`Command-O` on macOS) keyboard shortcut @@ -261,7 +261,7 @@ Output Window By default, when starting a run, an *Output* window opens that displays the screen output of the running LAMMPS calculation, as shown below. -This text would normally be seen in the command line window. +This text would normally be seen in the command-line window. .. image:: JPG/lammps-gui-log.png :align: center @@ -398,7 +398,7 @@ below. Like for the *Output* and *Charts* windows, its content is continuously updated during a run. It will show "(none)" if there are no variables defined. Note that it is also possible to *set* :doc:`index style -variables `, that would normally be set via command line +variables `, that would normally be set via command-line flags, via the "Set Variables..." dialog from the *Run* menu. LAMMPS-GUI automatically defines the variable "gui_run" to the current value of the run counter. That way it is possible to automatically @@ -775,11 +775,11 @@ General Settings: - *Echo input to log:* when checked, all input commands, including variable expansions, are echoed to the *Output* window. This is - equivalent to using `-echo screen` at the command line. There is no + equivalent to using `-echo screen` at the command-line. There is no log *file* produced by default, since LAMMPS-GUI uses `-log none`. - *Include citation details:* when checked full citation info will be included to the log window. This is equivalent to using `-cite - screen` on the command line. + screen` on the command-line. - *Show log window by default:* when checked, the screen output of a LAMMPS run will be collected in a log window during the run - *Show chart window by default:* when checked, the thermodynamic @@ -828,7 +828,7 @@ Accelerators: This tab enables selection of an accelerator package for LAMMPS to use and is equivalent to using the `-suffix` and `-package` flags on the -command line. Only settings supported by the LAMMPS library and local +command-line. Only settings supported by the LAMMPS library and local hardware are available. The `Number of threads` field allows setting the maximum number of threads for the accelerator packages that use threads. diff --git a/doc/src/Howto_peri.rst b/doc/src/Howto_peri.rst index 8a2aa4cab6d..29eb685c81a 100644 --- a/doc/src/Howto_peri.rst +++ b/doc/src/Howto_peri.rst @@ -738,8 +738,8 @@ command. This can be done, for example, by using the built-in visualizer of the :doc:`dump image or dump movie ` command to create snapshot -images or a movie. Below are example command lines for using dump image -with the :ref:`example listed below ` and a set of images +images or a movie. Below are example command for using dump image with +the :ref:`example listed below ` and a set of images created for steps 300, 600, and 2000 this way. .. code-block:: LAMMPS diff --git a/doc/src/Howto_wsl.rst b/doc/src/Howto_wsl.rst index fbb75d9cfd2..30e4835e4c7 100644 --- a/doc/src/Howto_wsl.rst +++ b/doc/src/Howto_wsl.rst @@ -260,7 +260,7 @@ Switch into the :code:`examples/melt` folder: cd ../examples/melt -To run this example in serial, use the following command line: +To run this example in serial, use the following command: .. code-block:: diff --git a/doc/src/Install_git.rst b/doc/src/Install_git.rst index 35b6429f0c4..5108009a736 100644 --- a/doc/src/Install_git.rst +++ b/doc/src/Install_git.rst @@ -60,7 +60,7 @@ between them at any time using "git checkout ".) files (mostly by accident). If you do not need access to the entire commit history (most people don't), you can speed up the "cloning" process and reduce local disk space requirements by using the - ``--depth`` git command line flag. That will create a "shallow clone" + ``--depth`` git command-line flag. That will create a "shallow clone" of the repository, which contains only a subset of the git history. Using a depth of 1000 is usually sufficient to include the head commits of the *develop*, the *release*, and the *maintenance* diff --git a/doc/src/Modify_style.rst b/doc/src/Modify_style.rst index 496415237c5..69b7cc93504 100644 --- a/doc/src/Modify_style.rst +++ b/doc/src/Modify_style.rst @@ -46,7 +46,7 @@ Include files (varied) but instead should be initialized either in the initializer list of the constructor or explicitly assigned in the body of the constructor. If the member variable is relevant to the functionality of a class - (for example when it stores a value from a command line argument), the + (for example when it stores a value from a command-line argument), the member variable declaration is followed by a brief comment explaining its purpose and what its values can be. Class members that are pointers should always be initialized to ``nullptr`` in the diff --git a/doc/src/Packages_details.rst b/doc/src/Packages_details.rst index 9afd0d1b983..894c299299d 100644 --- a/doc/src/Packages_details.rst +++ b/doc/src/Packages_details.rst @@ -2171,8 +2171,8 @@ the :doc:`Build extras ` page. * ``src/OPENMP/README`` * :doc:`Accelerator packages ` * :doc:`OPENMP package ` -* :doc:`Command line option -suffix/-sf omp ` -* :doc:`Command line option -package/-pk omp ` +* :doc:`Command-line option -suffix/-sf omp ` +* :doc:`Command-line option -package/-pk omp ` * :doc:`package omp ` * Search the :doc:`commands ` pages (:doc:`fix `, :doc:`compute `, :doc:`pair `, :doc:`bond, angle, dihedral, improper `, diff --git a/doc/src/Run_basics.rst b/doc/src/Run_basics.rst index 22cec5858b4..f18eaff75a8 100644 --- a/doc/src/Run_basics.rst +++ b/doc/src/Run_basics.rst @@ -1,8 +1,8 @@ Basics of running LAMMPS ======================== -LAMMPS is run from the command line, reading commands from a file via -the ``-in`` command line flag, or from standard input. Using the ``-in +LAMMPS is run from the command-line, reading commands from a file via +the ``-in`` command-line flag, or from standard input. Using the ``-in in.file`` variant is recommended (see note below). The name of the LAMMPS executable is either ``lmp`` or ``lmp_`` with `` being the machine string used when compiling LAMMPS. This @@ -25,7 +25,7 @@ build LAMMPS: You normally run the LAMMPS command in the directory where your input script is located. That is also where output files are produced by default, unless you provide specific other paths in your input script or -on the command line. As in some of the examples above, the LAMMPS +on the command-line. As in some of the examples above, the LAMMPS executable itself can be placed elsewhere. .. note:: diff --git a/doc/src/Run_options.rst b/doc/src/Run_options.rst index 4f7021cd53a..546658a6448 100644 --- a/doc/src/Run_options.rst +++ b/doc/src/Run_options.rst @@ -632,7 +632,7 @@ the ``-package omp`` command-line switch or the :doc:`package omp ` com The :doc:`suffix ` command can also be used within an input script to set a suffix, or to turn off or back on any suffix setting -made via the command line. +made via the command-line. ---------- diff --git a/doc/src/Run_windows.rst b/doc/src/Run_windows.rst index 8c2eac2bc6a..a03f27c013f 100644 --- a/doc/src/Run_windows.rst +++ b/doc/src/Run_windows.rst @@ -20,7 +20,7 @@ To run with 4 threads, you can type this: lmp -in in.lj.lmp -k on t 4 -sf kk Alternately, you can also install a package with LAMMPS-GUI included and -open the LAMMPS-GUI app (the package includes the command line version +open the LAMMPS-GUI app (the package includes the command-line version of LAMMPS as well) and open the input file in the GUI and run it from there. For details on LAMMPS-GUI, see :doc:`Howto_lammps_gui`. diff --git a/doc/src/Speed_gpu.rst b/doc/src/Speed_gpu.rst index c456042452f..c90e3fcc5e5 100644 --- a/doc/src/Speed_gpu.rst +++ b/doc/src/Speed_gpu.rst @@ -186,8 +186,8 @@ Guidelines for best performance * Using multiple MPI tasks (2-10) per GPU will often give the best performance, as allowed my most multicore CPU/GPU configurations. - Using too many MPI tasks will result in wors performance due to - growing overhead. + Using too many MPI tasks will result in worse performance due to + growing overhead with the growing number of MPI tasks. * If the number of particles per MPI task is small (e.g. 100s of particles), it can be more efficient to run with fewer MPI tasks per GPU, even if you do not use all the cores on the compute node. diff --git a/doc/src/Speed_kokkos.rst b/doc/src/Speed_kokkos.rst index 40e748c9fe3..9f8dcf83409 100644 --- a/doc/src/Speed_kokkos.rst +++ b/doc/src/Speed_kokkos.rst @@ -77,7 +77,7 @@ version 23 November 2023 and Kokkos version 4.2. rank. When running with multiple MPI ranks, you may see segmentation faults without GPU-aware MPI support. These can be avoided by adding the flags :doc:`-pk kokkos gpu/aware off ` to the - LAMMPS command line or by using the command :doc:`package kokkos + LAMMPS command-line or by using the command :doc:`package kokkos gpu/aware off ` in the input file. .. admonition:: Intel Data Center GPU support @@ -423,7 +423,7 @@ in the ``kokkos-cuda.cmake`` CMake preset file. cmake -DKokkos_ENABLE_CUDA=yes -DKokkos_ENABLE_OPENMP=yes ../cmake The suffix "/kk" is equivalent to "/kk/device", and for Kokkos CUDA, -using the ``-sf kk`` in the command line gives the default CUDA version +using the ``-sf kk`` in the command-line gives the default CUDA version everywhere. However, if the "/kk/host" suffix is added to a specific style in the input script, the Kokkos OpenMP (CPU) version of that specific style will be used instead. Set the number of OpenMP threads @@ -439,7 +439,7 @@ For example, the command to run with 1 GPU and 8 OpenMP threads is then: mpiexec -np 1 lmp_kokkos_cuda_openmpi -in in.lj -k on g 1 t 8 -sf kk -Conversely, if the ``-sf kk/host`` is used in the command line and then +Conversely, if the ``-sf kk/host`` is used in the command-line and then the "/kk" or "/kk/device" suffix is added to a specific style in your input script, then only that specific style will run on the GPU while everything else will run on the CPU in OpenMP mode. Note that the @@ -451,7 +451,7 @@ on the host CPU can overlap with a pair style running on the GPU. First compile with ``--default-stream per-thread`` added to ``CCFLAGS`` in the Kokkos CUDA Makefile. Then explicitly use the "/kk/host" suffix for kspace and bonds, angles, etc. in the input file and the -"kk" suffix (equal to "kk/device") on the command line. Also make +"kk" suffix (equal to "kk/device") on the command-line. Also make sure the environment variable ``CUDA_LAUNCH_BLOCKING`` is not set to "1" so CPU/GPU overlap can occur. diff --git a/doc/src/Speed_omp.rst b/doc/src/Speed_omp.rst index bf0744f0f45..906acf3ce8d 100644 --- a/doc/src/Speed_omp.rst +++ b/doc/src/Speed_omp.rst @@ -21,7 +21,7 @@ Building LAMMPS with the OPENMP package See the :ref:`Build extras ` page for instructions. -Run with the OPENMP package from the command line +Run with the OPENMP package from the command-line """"""""""""""""""""""""""""""""""""""""""""""""""" These examples assume one or more 16-core nodes. diff --git a/doc/src/Speed_opt.rst b/doc/src/Speed_opt.rst index e1153930174..15e18dad8e3 100644 --- a/doc/src/Speed_opt.rst +++ b/doc/src/Speed_opt.rst @@ -17,7 +17,7 @@ Building LAMMPS with the OPT package See the :ref:`Build extras ` page for instructions. -Run with the OPT package from the command line +Run with the OPT package from the command-line """""""""""""""""""""""""""""""""""""""""""""" .. code-block:: bash diff --git a/doc/src/Tools.rst b/doc/src/Tools.rst index ba7cb2035a7..d13a6d384f8 100644 --- a/doc/src/Tools.rst +++ b/doc/src/Tools.rst @@ -501,7 +501,7 @@ Here are a few highlights of LAMMPS-GUI - Indicator for line that caused an error - Visualization of current state in Image Viewer (via calling :doc:`write_dump image `) - Capture of images created via :doc:`dump image ` in Slide show window -- Dialog to set variables, similar to the LAMMPS command line flag '-v' / '-var' +- Dialog to set variables, similar to the LAMMPS command-line flag '-v' / '-var' - Support for GPU, INTEL, KOKKOS/OpenMP, OPENMAP, and OPT and accelerator packages Parallelization @@ -550,7 +550,7 @@ will be found automatically. 2) you can download the `Flatpak file *flatpak* command: ``flatpak install --user LAMMPS-Linux-x86_64-GUI-.flatpak`` and run it with ``flatpak run org.lammps.lammps-gui``. The flatpak bundle also includes the -command line version of LAMMPS and some LAMMPS tools like msi2lmp. The +command-line version of LAMMPS and some LAMMPS tools like msi2lmp. The can be launched by using the ``--command`` flag. For example to run LAMMPS directly on the ``in.lj`` benchmark input you would type in the ``bench`` folder: ``flatpak run --command=lmp -in in.lj`` The flatpak @@ -608,10 +608,10 @@ would be the ``examples/COUPLE/plugin`` folder of the LAMMPS distribution. When compiling LAMMPS-GUI with plugin support, there is an additional -command line flag (``-p `` or ``--pluginpath ``) which +command-line flag (``-p `` or ``--pluginpath ``) which allows to override the path to LAMMPS shared library used by the GUI. This is usually auto-detected on the first run and can be changed in the -LAMMPS-GUI *Preferences* dialog. The command line flag allows to reset +LAMMPS-GUI *Preferences* dialog. The command-line flag allows to reset this path to a valid value in case the original setting has become invalid. An empty path ("") as argument restores the default setting. @@ -656,7 +656,7 @@ it will create a compressed ``LAMMPS-Win10-amd64.zip`` zip file with the executables and required dependent .dll files. This zip file can be uncompressed and ``lammps-gui.exe`` run directly from there. The uncompressed folder can be added to the ``PATH`` environment and LAMMPS -and LAMMPS-GUI can be launched from anywhere from the command line. +and LAMMPS-GUI can be launched from anywhere from the command-line. **MinGW64 Cross-compiler** @@ -876,7 +876,7 @@ the same ``LAMMPS_CACHING_DIR``. This script does the following: #. Start a simple local HTTP server using Python to host files for CMake Afterwards, it will print out instruction on how to modify the CMake -command line to make sure it uses the local HTTP server. +commands to make sure it uses the local HTTP server. To undo the environment changes and shutdown the local HTTP server, run the ``deactivate_caches`` command. @@ -1025,7 +1025,7 @@ with those in the provided log file with the same number of processors in the same subdirectory. If the differences between the actual and reference values are within specified tolerances, the test is considered passed. For each test batch, that is, a set of example input scripts, -the mpirun command, the LAMMPS command line arguments, and the +the mpirun command, the LAMMPS command-line arguments, and the tolerances for individual thermo quantities can be specified in a configuration file in YAML format. diff --git a/doc/src/dump_image.rst b/doc/src/dump_image.rst index 2336a5889a1..8313d3cccb2 100644 --- a/doc/src/dump_image.rst +++ b/doc/src/dump_image.rst @@ -681,7 +681,7 @@ MPEG or other movie file you can use: * c) Use FFmpeg - FFmpeg is a command line tool that is available on many platforms and + FFmpeg is a command-line tool that is available on many platforms and allows extremely flexible encoding and decoding of movies. .. code-block:: bash diff --git a/doc/src/fix_imd.rst b/doc/src/fix_imd.rst index 520af505a1a..2974262c81b 100644 --- a/doc/src/fix_imd.rst +++ b/doc/src/fix_imd.rst @@ -97,7 +97,7 @@ adjustments. To connect VMD to a listening LAMMPS simulation on the same machine with fix imd enabled, one needs to start VMD and load a coordinate or topology file that matches the fix group. When the VMD command -prompts appears, one types the command line: +prompts appears, one types the command: .. parsed-literal:: diff --git a/doc/src/fix_precession_spin.rst b/doc/src/fix_precession_spin.rst index 7440989d7a6..88325ba4916 100644 --- a/doc/src/fix_precession_spin.rst +++ b/doc/src/fix_precession_spin.rst @@ -135,7 +135,7 @@ directions for the forces. Only the direction of the vector is important; its length is ignored (the entered vectors are normalized). -Those styles can be combined within one single command line. +Those styles can be combined within one single command. .. note:: diff --git a/doc/src/kim_commands.rst b/doc/src/kim_commands.rst index ab9b4486a2a..20728dee064 100644 --- a/doc/src/kim_commands.rst +++ b/doc/src/kim_commands.rst @@ -1084,10 +1084,11 @@ the form of *key_name_key*-*key_name_value* pairs). For example, kim property modify 1 key mass source-value 26.98154 kim property modify 1 key mass source-unit amu -where the special keyword "key" is followed by a *key_name* ("species" or -"mass" in the above) and one or more key-value pairs. These key-value pairs -may continue until either another "key" keyword is given or the end of the -command line is reached. Thus, the above could equivalently be written as +where the special keyword "key" is followed by a *key_name* ("species" +or "mass" in the above) and one or more key-value pairs. These +key-value pairs may continue until either another "key" keyword is given +or the end of the line is reached. Thus, the above could equivalently +be written as .. code-block:: LAMMPS diff --git a/doc/src/label.rst b/doc/src/label.rst index bf232431d76..cae1386e907 100644 --- a/doc/src/label.rst +++ b/doc/src/label.rst @@ -24,12 +24,12 @@ Description """"""""""" Label this line of the input script with the chosen ID. Unless a jump -command was used previously, this does nothing. But if a -:doc:`jump ` command was used with a label argument to begin -invoking this script file, then all command lines in the script prior -to this line will be ignored. I.e. execution of the script will begin -at this line. This is useful for looping over a section of the input -script as discussed in the :doc:`jump ` command. +command was used previously, this does nothing. But if a :doc:`jump +` command was used with a label argument to begin invoking this +script file, then all commands in the script prior to this line will be +ignored. I.e. execution of the script will begin at this line. This is +useful for looping over a section of the input script as discussed in +the :doc:`jump ` command. Restrictions """""""""""" diff --git a/doc/src/package.rst b/doc/src/package.rst index 8be6639e72b..ddb36560279 100644 --- a/doc/src/package.rst +++ b/doc/src/package.rst @@ -504,7 +504,7 @@ as it is for non-accelerated pair styles The *binsize* keyword sets the size of bins used to bin atoms during neighbor list builds. The same value can be set by the :doc:`neigh_modify binsize ` command. Making it an option -in the package kokkos command allows it to be set from the command line. +in the package kokkos command allows it to be set from the command-line. The default value for CPUs is 0.0, which means the LAMMPS default will be used, which is bins = 1/2 the size of the pairwise cutoff + neighbor skin distance. This is fine when neighbor lists are built on the CPU. For GPU @@ -664,7 +664,7 @@ too. Also note that if the :doc:`-sf hybrid intel omp command-line switch ` is used, it invokes a "package intel" command, followed by a "package omp" command, both with a setting of *Nthreads* = 0. Likewise for a hybrid suffix for gpu and omp. Note that KOKKOS also supports - setting the number of OpenMP threads from the command line using the + setting the number of OpenMP threads from the command-line using the "-k on" :doc:`command-line switch `. The default for KOKKOS is 1 thread per MPI task, so any other number of threads should be explicitly set using the "-k on" command-line switch (and this diff --git a/doc/src/pair_mgpt.rst b/doc/src/pair_mgpt.rst index 6ef9f52facf..92bf9cd7384 100644 --- a/doc/src/pair_mgpt.rst +++ b/doc/src/pair_mgpt.rst @@ -111,8 +111,8 @@ routines. For x-86 machines, there is a provided Makefile.mgptfast which enables the fast algebra routines, i.e. build LAMMPS with "make mgptfast". The user will be informed in the output files of the matrix kernels in use. To further improve speed, on x86 the option -precision single can be added to the :doc:`pair_coeff ` -command line, which improves speed (up to a factor of two) at the cost +*precision single* can be added to the :doc:`pair_coeff ` +command, which improves speed (up to a factor of two) at the cost of doing matrix calculations with 7 digit precision instead of the default 16. For consistency the default option can be specified explicitly by the option precision double. diff --git a/doc/src/pair_thole.rst b/doc/src/pair_thole.rst index a4e8bbb96e3..5b0d5653ff8 100644 --- a/doc/src/pair_thole.rst +++ b/doc/src/pair_thole.rst @@ -131,7 +131,7 @@ command. * LJ cutoff (distance units) The last two coefficients are optional and default to the global values from -the *pair_style* command line. +the *pair_style* command. ---------- diff --git a/doc/src/read_restart.rst b/doc/src/read_restart.rst index 6a875550a49..eb7f577e4d3 100644 --- a/doc/src/read_restart.rst +++ b/doc/src/read_restart.rst @@ -48,9 +48,9 @@ meaning that the trajectories of a restarted run will precisely match those produced by the original run had it continued on. Some information about a restart file can be gathered directly from the -command line when using LAMMPS with the :ref:`-restart2info -` command line flag. On Unix-like operating systems (like -Linux or macOS), one can also :ref:`configure the "file" command line +command-line when using LAMMPS with the :ref:`-restart2info +` command-line flag. On Unix-like operating systems (like +Linux or macOS), one can also :ref:`configure the "file" command-line program ` to display basic information about a restart file The binary restart file format was not designed with backward, forward, @@ -60,9 +60,9 @@ Changes to the architecture, compilation settings, or LAMMPS version can render a restart file unreadable or it may read the data incorrectly. If you want a more portable format, you can use the data file format as created by the :doc:`write_data ` command. Binary restart -files can also be converted into a data file from the command line by +files can also be converted into a data file from the command-line by the LAMMPS executable that wrote them using the :ref:`-restart2data -` command line flag. +` command-line flag. Several things can prevent exact restarts due to round-off effects, in which case the trajectories in the 2 runs will slowly diverge. These diff --git a/doc/src/suffix.rst b/doc/src/suffix.rst index 6c723657a55..98bb43a02d1 100644 --- a/doc/src/suffix.rst +++ b/doc/src/suffix.rst @@ -30,7 +30,7 @@ Description This command allows you to use variants of various styles if they exist. In that respect it operates the same as the :doc:`-suffix command-line switch `. It also has options to turn -off or back on any suffix setting made via the command line. +off or back on any suffix setting made via the command-line. The specified style can be *gpu*, *intel*, *kk*, *omp*, *opt* or *hybrid*\ . These refer to optional packages that LAMMPS can be built diff --git a/src/PHONON/fix_phonon.cpp b/src/PHONON/fix_phonon.cpp index 477898a305d..74670ebde5d 100644 --- a/src/PHONON/fix_phonon.cpp +++ b/src/PHONON/fix_phonon.cpp @@ -88,15 +88,15 @@ FixPhonon::FixPhonon(LAMMPS *lmp, int narg, char **arg) : Fix(lmp, narg, arg) int iarg = 8; nasr = 20; - // other command line options + // other command-line options while (iarg < narg) { if (strcmp(arg[iarg],"sysdim") == 0) { - if (++iarg >= narg) error->all(FLERR,"Illegal fix phonon command: incomplete command line options."); + if (++iarg >= narg) error->all(FLERR,"Illegal fix phonon command: incomplete command-line options."); sdim = utils::inumeric(FLERR, arg[iarg],false,lmp); if (sdim < 1) error->all(FLERR,"Illegal fix phonon command: sysdim should not be less than 1."); } else if (strcmp(arg[iarg],"nasr") == 0) { - if (++iarg >= narg) error->all(FLERR,"Illegal fix phonon command: incomplete command line options."); + if (++iarg >= narg) error->all(FLERR,"Illegal fix phonon command: incomplete command-line options."); nasr = utils::inumeric(FLERR, arg[iarg],false,lmp); } else { diff --git a/src/PTM/ptm_voronoi_config.h b/src/PTM/ptm_voronoi_config.h index a57697c4f09..32ff0c360ff 100644 --- a/src/PTM/ptm_voronoi_config.h +++ b/src/PTM/ptm_voronoi_config.h @@ -162,8 +162,8 @@ constexpr double optimal_particles = 5.6; * contacted. */ #define VOROPP_INTERNAL_ERROR 3 -/** Voro++ returns this status code if it could not interpret the command line - * arguments passed to the command line utility. */ +/** Voro++ returns this status code if it could not interpret the command-line + * arguments passed to the command-line utility. */ #define VOROPP_CMD_LINE_ERROR 4 } // namespace ptm_voro diff --git a/src/error.cpp b/src/error.cpp index 4aaa93aa31c..e591091b351 100644 --- a/src/error.cpp +++ b/src/error.cpp @@ -69,7 +69,7 @@ void Error::universe_all(const std::string &file, int line, const std::string &s if (universe->ulogfile) fclose(universe->ulogfile); // allow commands if an exception was caught in a run - // update may be a null pointer when catching command line errors + // update may be a null pointer when catching command-line errors if (update) update->whichflag = 0; throw LAMMPSException(mesg); @@ -87,7 +87,7 @@ void Error::universe_one(const std::string &file, int line, const std::string &s if (universe->uscreen) fputs(mesg.c_str(),universe->uscreen); // allow commands if an exception was caught in a run - // update may be a null pointer when catching command line errors + // update may be a null pointer when catching command-line errors if (update) update->whichflag = 0; throw LAMMPSAbortException(mesg, universe->uworld); @@ -135,7 +135,7 @@ void Error::all(const std::string &file, int line, const std::string &str) } // allow commands if an exception was caught in a run - // update may be a null pointer when catching command line errors + // update may be a null pointer when catching command-line errors if (update) update->whichflag = 0; @@ -170,7 +170,7 @@ void Error::one(const std::string &file, int line, const std::string &str) fputs(mesg.c_str(),universe->uscreen); // allow commands if an exception was caught in a run - // update may be a null pointer when catching command line errors + // update may be a null pointer when catching command-line errors if (update) update->whichflag = 0; throw LAMMPSAbortException(mesg, world); diff --git a/src/input.cpp b/src/input.cpp index 25211ba8481..814f900fbdb 100644 --- a/src/input.cpp +++ b/src/input.cpp @@ -89,7 +89,7 @@ Variable class which performs computations and text substitutions. \verbatim embed:rst This sets up the input processing, processes the *-var* and *-echo* -command line flags, holds the factory of commands and creates and +command-line flags, holds the factory of commands and creates and initializes an instance of the Variable class. To execute a command, a specific class instance, derived from @@ -188,7 +188,7 @@ Input::~Input() This will read lines from *infile*, parse and execute them until the end of the file is reached. The *infile* pointer will usually point to -``stdin`` or the input file given with the ``-in`` command line flag. +``stdin`` or the input file given with the ``-in`` command-line flag. \endverbatim */ @@ -423,7 +423,7 @@ void Input::write_echo(const std::string &txt) } /* ---------------------------------------------------------------------- - parse copy of command line by inserting string terminators + parse copy of command-line by inserting string terminators strip comment = all chars from # on replace all $ via variable substitution except within quotes command = first word @@ -1151,7 +1151,7 @@ void Input::partition() char *cmd = strstr(line,arg[2]); - // execute the remaining command line on requested partitions + // execute the remaining command-line on requested partitions if (yesflag) { if (universe->iworld+1 >= ilo && universe->iworld+1 <= ihi) one(cmd); diff --git a/src/lammps.cpp b/src/lammps.cpp index 47540cc66c1..1f6a13d8cd5 100644 --- a/src/lammps.cpp +++ b/src/lammps.cpp @@ -105,7 +105,7 @@ using namespace LAMMPS_NS; * * The LAMMPS class manages the components of an MD simulation by creating, * deleting, and initializing instances of the classes it is composed of, - * processing command line flags, and providing access to some global properties. + * processing command-line flags, and providing access to some global properties. * The specifics of setting up and running a simulation are handled by the * individual component class instances. */ @@ -1222,7 +1222,7 @@ const char *LAMMPS::non_pair_suffix() const } /* ---------------------------------------------------------------------- - help message for command line options and styles present in executable + help message for command-line options and styles present in executable ------------------------------------------------------------------------- */ void _noopt LAMMPS::help() @@ -1233,7 +1233,7 @@ void _noopt LAMMPS::help() // if output is a console, use a pipe to a pager for paged output. // this will avoid the most important help text to rush past the // user. scrollback buffers are often not large enough. this is most - // beneficial to windows users, who are not used to command line. + // beneficial to windows users, who are not used to command-line. int use_pager = platform::is_console(fp); @@ -1255,7 +1255,7 @@ void _noopt LAMMPS::help() } } - // general help message about command line and flags + // general help message about command-line and flags if (has_git_info()) { fprintf(fp,"\nLarge-scale Atomic/Molecular Massively Parallel Simulator - " @@ -1266,7 +1266,7 @@ void _noopt LAMMPS::help() } fprintf(fp, "Usage example: %s -var t 300 -echo screen -in in.alloy\n\n" - "List of command line options supported by this LAMMPS executable:\n\n" + "List of command-line options supported by this LAMMPS executable:\n\n" "-echo none/screen/log/both : echoing of input script (-e)\n" "-help : print this help message (-h)\n" "-in none/filename : read input from file or stdin (default) (-i)\n" diff --git a/src/lammps.h b/src/lammps.h index 989adb2849e..f155099ac27 100644 --- a/src/lammps.h +++ b/src/lammps.h @@ -73,7 +73,7 @@ class LAMMPS { MPI_Comm external_comm; // MPI comm encompassing external programs // when multiple programs launched by mpirun - // set by -mpicolor command line arg + // set by -mpicolor command-line arg void *mdicomm; // for use with MDI code coupling library diff --git a/src/library.cpp b/src/library.cpp index 2f915f1baf3..cee1304db66 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -129,7 +129,7 @@ The :cpp:func:`lammps_open` function creates a new :cpp:class:`LAMMPS as if they were :doc:`command-line arguments ` for the LAMMPS executable, and an MPI communicator for LAMMPS to run under. Since the list of arguments is **exactly** as when called from the -command line, the first argument would be the name of the executable and +command-line, the first argument would be the name of the executable and thus is otherwise ignored. However ``argc`` may be set to 0 and then ``argv`` may be ``NULL``. If MPI is not yet initialized, ``MPI_Init()`` will be called during creation of the LAMMPS class instance. @@ -163,8 +163,8 @@ fails a null pointer is returned. \endverbatim * - * \param argc number of command line arguments - * \param argv list of command line argument strings + * \param argc number of command-line arguments + * \param argv list of command-line argument strings * \param comm MPI communicator for this LAMMPS instance * \param ptr pointer to a void pointer variable which serves * as a handle; may be ``NULL`` @@ -230,8 +230,8 @@ fails a null pointer is returned. \endverbatim * - * \param argc number of command line arguments - * \param argv list of command line argument strings + * \param argc number of command-line arguments + * \param argv list of command-line argument strings * \param ptr pointer to a void pointer variable * which serves as a handle; may be ``NULL`` * \return pointer to new LAMMPS instance cast to ``void *`` */ @@ -264,8 +264,8 @@ fails a null pointer is returned. \endverbatim * - * \param argc number of command line arguments - * \param argv list of command line argument strings + * \param argc number of command-line arguments + * \param argv list of command-line argument strings * \param f_comm Fortran style MPI communicator for this LAMMPS instance * \return pointer to new LAMMPS instance cast to ``void *`` */ @@ -592,7 +592,7 @@ This function tells LAMMPS to execute the single command in the string (final) newline character. Newline characters in the body of the string, however, will be treated as part of the command and will **not** start a second command. The function :cpp:func:`lammps_commands_string` -processes a string with multiple command lines. +processes a string with multiple command-lines. The function returns the name of the command on success or ``NULL`` when passing a string without a command. diff --git a/src/utils.h b/src/utils.h index 200963ff283..1ed514cca48 100644 --- a/src/utils.h +++ b/src/utils.h @@ -509,7 +509,7 @@ This functions adds the following case to :cpp:func:`utils::bounds() ` -or the *-suffix/-sf* command line flag and return correspondingly modified string. +or the *-suffix/-sf* command-line flag and return correspondingly modified string. \endverbatim * @@ -609,7 +609,7 @@ or the *-suffix/-sf* command line flag and return correspondingly modified strin * This can handle strings with single and double quotes, escaped quotes, * and escaped codes within quotes, but due to using an STL container and * STL strings is rather slow because of making copies. Designed for - * parsing command lines and similar text and not for time critical + * parsing command-lines and similar text and not for time critical * processing. Use a tokenizer class if performance matters. * \verbatim embed:rst diff --git a/src/write_dump.cpp b/src/write_dump.cpp index 1932f08186e..71d955dc1fb 100644 --- a/src/write_dump.cpp +++ b/src/write_dump.cpp @@ -43,7 +43,7 @@ void WriteDump::command(int narg, char **arg) if (strcmp(arg[modindex], "modify") == 0) break; // create the Dump instance - // create dump command line with extra required args + // create dump command-line with extra required args // work around "fix not computed at compatible times" errors. From 1d4e2d78677b672573e4a947ef0dee445ab86ad8 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 27 Dec 2024 04:18:01 -0500 Subject: [PATCH 10/34] another chunk of added/updated/modernized internal compute checks at Fix::init() --- src/REPLICA/fix_grem.cpp | 104 +++++++++++++++++------------- src/REPLICA/fix_neb.cpp | 10 ++- src/REPLICA/fix_pimd_langevin.cpp | 19 +++++- src/RIGID/fix_rigid_nh.cpp | 4 +- src/RIGID/fix_rigid_nh_small.cpp | 4 +- src/SHOCK/fix_msst.cpp | 2 +- src/SHOCK/fix_nphug.cpp | 3 +- src/SPIN/fix_neb_spin.cpp | 11 ++-- src/UEF/fix_nh_uef.cpp | 12 ++-- 9 files changed, 104 insertions(+), 65 deletions(-) diff --git a/src/REPLICA/fix_grem.cpp b/src/REPLICA/fix_grem.cpp index 859c5f1bb31..4ec5b37cadd 100644 --- a/src/REPLICA/fix_grem.cpp +++ b/src/REPLICA/fix_grem.cpp @@ -29,6 +29,7 @@ #include "compute.h" #include "domain.h" #include "error.h" +#include "fix_nh.h" #include "force.h" #include "modify.h" #include "update.h" @@ -141,55 +142,70 @@ void FixGrem::init() if (domain->triclinic) error->all(FLERR,"Triclinic cells are not supported"); - // set temperature and pressure ptrs + // set temperature and other pointers to compute instances - int icompute = modify->find_compute(id_temp); - if (icompute < 0) - error->all(FLERR,"Temperature compute ID for fix grem does not exist"); - temperature = modify->compute[icompute]; + temperature = modify->get_compute_by_id(id_temp); + if (!temperature) { + error->all(FLERR,"Temperature compute ID {} for fix {} does not exist", id_temp, style); + } else { + if (temperature->tempflag == 0) + error->all(FLERR, "Compute ID {} for fix {} does not compute a temperature", id_temp, style); + } - icompute = modify->find_compute(id_ke); - if (icompute < 0) - error->all(FLERR,"KE compute ID for fix grem does not exist"); - ke = modify->compute[icompute]; + ke = modify->get_compute_by_id(id_ke); + if (!ke) { + error->all(FLERR,"Kinetic energy compute ID {} for fix {} does not exist", id_ke, style); + } else { + if (strcmp(ke->style, "ke") != 0) + error->all(FLERR, "Compute ID {} for fix {} does not compute kinetic energy", id_ke, style); + } - icompute = modify->find_compute(id_pe); - if (icompute < 0) - error->all(FLERR,"PE compute ID for fix grem does not exist"); - pe = modify->compute[icompute]; + pe = modify->get_compute_by_id(id_pe); + if (!pe) { + error->all(FLERR,"Potential energy compute ID {} for fix {} does not exist", id_pe, style); + } else { + if (pe->peflag == 0) + error->all(FLERR,"Compute ID {} for fix {} does not compute potential energy", id_pe, style); + } - int ifix = modify->find_fix(id_nh); - if (ifix < 0) + auto *ifix = modify->get_fix_by_id(id_nh); + if (!ifix) { error->all(FLERR,"Fix id for nvt or npt fix does not exist"); - Fix *nh = modify->fix[ifix]; - - auto t_start = (double *)nh->extract("t_start",ifix); - auto t_stop = (double *)nh->extract("t_stop",ifix); - if ((t_start != nullptr) && (t_stop != nullptr) && (ifix == 0)) { - tbath = *t_start; - if (*t_start != *t_stop) - error->all(FLERR,"Thermostat temperature ramp not allowed"); - } else - error->all(FLERR,"Problem extracting target temperature from fix nvt or npt"); - - pressref = 0.0; - if (pressflag) { - int *p_flag = (int *)nh->extract("p_flag",ifix); - auto p_start = (double *) nh->extract("p_start",ifix); - auto p_stop = (double *) nh->extract("p_stop",ifix); - if ((p_flag != nullptr) && (p_start != nullptr) && (p_stop != nullptr) - && (ifix == 1)) { - ifix = 0; - pressref = p_start[0]; - if ((p_start[0] != p_stop[0]) || (p_flag[0] != 1)) ++ ifix; - if ((p_start[1] != p_stop[1]) || (p_flag[0] != 1)) ++ ifix; - if ((p_start[2] != p_stop[2]) || (p_flag[0] != 1)) ++ ifix; - if ((p_start[0] != p_start[1]) || (p_start[1] != p_start[2])) ++ifix; - if ((p_flag[3] != 0) || (p_flag[4] != 0) || (p_flag[5] != 0)) ++ifix; - if (ifix > 0) - error->all(FLERR,"Unsupported pressure settings in fix npt"); - } else - error->all(FLERR,"Problem extracting target pressure from fix npt"); + } else { // check for correct fix style + FixNH *nh = dynamic_cast(ifix); + if (!nh) { + error->all(FLERR, "Fix ID {} is not a compatible Nose-Hoover fix for fix {}", id_nh, style); + } else { + int dummy; + auto t_start = (double *)nh->extract("t_start",dummy); + auto t_stop = (double *)nh->extract("t_stop",dummy); + if ((t_start != nullptr) && (t_stop != nullptr)) { + tbath = *t_start; + if (*t_start != *t_stop) + error->all(FLERR,"Temperature ramp in fix {} ID {} not allowed", nh->style, id_nh); + } else { + error->all(FLERR,"Problem extracting target temperature from fix {}", nh->style); + } + pressref = 0.0; + if (pressflag) { + int *p_flag = (int *)nh->extract("p_flag",dummy); + auto p_start = (double *) nh->extract("p_start",dummy); + auto p_stop = (double *) nh->extract("p_stop",dummy); + if ((p_flag != nullptr) && (p_start != nullptr) && (p_stop != nullptr)) { + int ifix = 0; + pressref = p_start[0]; + if ((p_start[0] != p_stop[0]) || (p_flag[0] != 1)) ++ ifix; + if ((p_start[1] != p_stop[1]) || (p_flag[0] != 1)) ++ ifix; + if ((p_start[2] != p_stop[2]) || (p_flag[0] != 1)) ++ ifix; + if ((p_start[0] != p_start[1]) || (p_start[1] != p_start[2])) ++ifix; + if ((p_flag[3] != 0) || (p_flag[4] != 0) || (p_flag[5] != 0)) ++ifix; + if (ifix > 0) + error->all(FLERR,"Unsupported pressure settings in fix {} ID {}", nh->style, id_nh); + } else { + error->all(FLERR,"Problem extracting target pressure from fix {}", nh->style); + } + } + } } } diff --git a/src/REPLICA/fix_neb.cpp b/src/REPLICA/fix_neb.cpp index 9c920f26dc9..409c1086289 100644 --- a/src/REPLICA/fix_neb.cpp +++ b/src/REPLICA/fix_neb.cpp @@ -223,9 +223,13 @@ int FixNEB::setmask() void FixNEB::init() { - int icompute = modify->find_compute(id_pe); - if (icompute < 0) error->all(FLERR, "Potential energy ID for fix neb does not exist"); - pe = modify->compute[icompute]; + pe = modify->get_compute_by_id(id_pe); + if (!pe) { + error->all(FLERR,"Potential energy compute ID {} for fix {} does not exist", id_pe, style); + } else { + if (pe->peflag == 0) + error->all(FLERR,"Compute ID {} for fix {} does not compute potential energy", id_pe, style); + } // turn off climbing mode, NEB command turns it on after init() diff --git a/src/REPLICA/fix_pimd_langevin.cpp b/src/REPLICA/fix_pimd_langevin.cpp index 04dbcb8a904..4e530bd97ed 100644 --- a/src/REPLICA/fix_pimd_langevin.cpp +++ b/src/REPLICA/fix_pimd_langevin.cpp @@ -479,14 +479,27 @@ void FixPIMDLangevin::init() langevin_init(); c_pe = modify->get_compute_by_id(id_pe); - if (!c_pe) + if (!c_pe) { error->universe_all( - FLERR, fmt::format("Could not find fix {} potential energy compute ID {}", style, id_pe)); + FLERR, + fmt::format("Potential energy compute ID {} for fix {} does not exist", id_pe, style)); + } else { + if (c_pe->peflag == 0) + error->universe_all( + FLERR, + fmt::format("Compute ID {} for fix {} does not compute potential energy", id_pe, style)); + } c_press = modify->get_compute_by_id(id_press); - if (!c_press) + if (!c_press) { error->universe_all( FLERR, fmt::format("Could not find fix {} pressure compute ID {}", style, id_press)); + } else { + if (c_press->pressflag == 0) + error->universe_all( + FLERR, + fmt::format("Compute ID {} for fix {} does not compute pressure", id_press, style)); + } t_prim = t_vir = t_cv = p_prim = p_vir = p_cv = p_md = 0.0; } diff --git a/src/RIGID/fix_rigid_nh.cpp b/src/RIGID/fix_rigid_nh.cpp index c40cb54d86b..a7d8e967f67 100644 --- a/src/RIGID/fix_rigid_nh.cpp +++ b/src/RIGID/fix_rigid_nh.cpp @@ -289,10 +289,10 @@ void FixRigidNH::init() pressure = modify->get_compute_by_id(id_press); if (!pressure) { - error->all(FLERR,"Pressure ID {} for fix {} does not exist", id_press, style); + error->all(FLERR,"Pressure compute ID {} for fix {} does not exist", id_press, style); } else { if (pressure->pressflag == 0) - error->all(FLERR,"Compute ID {} does not compute pressure", id_press); + error->all(FLERR,"Compute ID {} for fix {} does not compute pressure", id_press, style); } // detect if any rigid fixes exist so rigid bodies move on remap diff --git a/src/RIGID/fix_rigid_nh_small.cpp b/src/RIGID/fix_rigid_nh_small.cpp index 92f0668cfb9..560c068a18d 100644 --- a/src/RIGID/fix_rigid_nh_small.cpp +++ b/src/RIGID/fix_rigid_nh_small.cpp @@ -265,10 +265,10 @@ void FixRigidNHSmall::init() pressure = modify->get_compute_by_id(id_press); if (!pressure) { - error->all(FLERR,"Pressure ID {} for fix {} does not exist", id_press, style); + error->all(FLERR,"Pressure compute ID {} for fix {} does not exist", id_press, style); } else { if (pressure->pressflag == 0) - error->all(FLERR,"Compute ID {} does not compute pressure", id_press); + error->all(FLERR,"Compute ID {} for fix {} does not compute pressure", id_press, style); } // detect if any rigid fixes exist so rigid bodies move on remap diff --git a/src/SHOCK/fix_msst.cpp b/src/SHOCK/fix_msst.cpp index ffdead90eb2..5483fbb67bd 100644 --- a/src/SHOCK/fix_msst.cpp +++ b/src/SHOCK/fix_msst.cpp @@ -252,7 +252,7 @@ void FixMSST::init() error->all(FLERR, "Could not find fix msst temperature compute ID {}", id_temp); } else { if (temperature->tempflag == 0) - error->all(FLERR, "Fix msst compute ID {} does not compute temperature", id_temp); + error->all(FLERR, "Fix msst compute ID {} does not compute a temperature", id_temp); } pressure = modify->get_compute_by_id(id_press); diff --git a/src/SHOCK/fix_nphug.cpp b/src/SHOCK/fix_nphug.cpp index d40ed9c3441..dcf014afb5b 100644 --- a/src/SHOCK/fix_nphug.cpp +++ b/src/SHOCK/fix_nphug.cpp @@ -166,8 +166,7 @@ void FixNPHug::init() error->all(FLERR, "Potential energy compute ID {} for fix {} does not exist", id_pe, style); } else { if (pe->peflag == 0) - error->all(FLERR, "Compute ID {} for fix {} does not compute potential energy", - id_temp, style); + error->all(FLERR, "Compute ID {} for fix {} does not compute potential energy", id_pe, style); } } diff --git a/src/SPIN/fix_neb_spin.cpp b/src/SPIN/fix_neb_spin.cpp index f3fd347242d..2517938b9f6 100644 --- a/src/SPIN/fix_neb_spin.cpp +++ b/src/SPIN/fix_neb_spin.cpp @@ -193,10 +193,13 @@ int FixNEBSpin::setmask() void FixNEBSpin::init() { - int icompute = modify->find_compute(id_pe); - if (icompute < 0) - error->all(FLERR,"Potential energy ID for fix neb does not exist"); - pe = modify->compute[icompute]; + pe = modify->get_compute_by_id(id_pe); + if (!pe) { + error->all(FLERR,"Potential energy compute ID {} for fix {} does not exist", id_pe, style); + } else { + if (pe->peflag == 0) + error->all(FLERR,"Compute ID {} for fix {} does not compute potential energy", id_pe, style); + } // turn off climbing mode, NEB command turns it on after init() diff --git a/src/UEF/fix_nh_uef.cpp b/src/UEF/fix_nh_uef.cpp index a824966d343..3173ebfc6ec 100644 --- a/src/UEF/fix_nh_uef.cpp +++ b/src/UEF/fix_nh_uef.cpp @@ -239,13 +239,17 @@ void FixNHUef::init() if (!pstat_flag) if (pcomputeflag) { pressure = modify->get_compute_by_id(id_press); - if (!pressure) error->all(FLERR,"Pressure ID {} for {} doesn't exist", id_press, style); - if (strcmp(pressure->style,"pressure/uef") != 0) - error->all(FLERR,"Using fix {} without a compute pressure/uef", style); + if (!pressure) { + error->all(FLERR,"Pressure ID {} for {} doesn't exist", id_press, style); + } else { + if (strcmp(pressure->style,"pressure/uef") != 0) + error->all(FLERR,"Compute ID {} for fix {} must be compute pressure/uef", + id_press, style); + } } if (strcmp(temperature->style,"temp/uef") != 0) - error->all(FLERR,"Using fix {} without a compute temp/uef", style); + error->all(FLERR,"Compute ID {} for fix {} must be compute temp/uef", id_temp, style); } /* ---------------------------------------------------------------------- From 916e5a81fb87ce151ee7047d065c2e1b6fb589c7 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 27 Dec 2024 08:44:02 -0500 Subject: [PATCH 11/34] more fix::init() checks and some clang-formatting for NH style classes --- src/ASPHERE/fix_nh_asphere.cpp | 11 ++----- src/ASPHERE/fix_nph_asphere.cpp | 14 ++++----- src/ASPHERE/fix_npt_asphere.cpp | 14 ++++----- src/ASPHERE/fix_nvt_asphere.cpp | 13 +++------ src/BODY/fix_nh_body.cpp | 3 +- src/BODY/fix_nph_body.cpp | 14 ++++----- src/BODY/fix_npt_body.cpp | 14 ++++----- src/BODY/fix_nvt_body.cpp | 13 +++------ src/DRUDE/fix_tgnh_drude.cpp | 9 ++++-- src/DRUDE/fix_tgnpt_drude.cpp | 14 ++++----- src/DRUDE/fix_tgnvt_drude.cpp | 12 +++----- src/EFF/fix_nph_eff.cpp | 14 ++++----- src/EFF/fix_npt_eff.cpp | 14 ++++----- src/EFF/fix_nvt_eff.cpp | 13 +++------ src/EFF/fix_nvt_sllod_eff.cpp | 18 ++++++------ src/EXTRA-FIX/fix_deform_pressure.cpp | 13 +++++---- src/EXTRA-FIX/fix_npt_cauchy.cpp | 21 ++++++++------ src/EXTRA-FIX/fix_numdiff.cpp | 7 ++++- src/EXTRA-FIX/fix_numdiff_virial.cpp | 7 ++++- src/GPU/fix_npt_gpu.cpp | 18 +++++------- src/GPU/fix_nvt_gpu.cpp | 12 +++----- src/INTEL/fix_npt_intel.cpp | 14 ++++----- src/INTEL/fix_nvt_intel.cpp | 13 +++------ src/MISC/fix_ipi.cpp | 41 ++++++++++++++++----------- src/OPENMP/fix_nph_asphere_omp.cpp | 13 ++++----- src/OPENMP/fix_nph_omp.cpp | 14 ++++----- src/OPENMP/fix_nph_sphere_omp.cpp | 14 ++++----- src/OPENMP/fix_npt_asphere_omp.cpp | 13 ++++----- src/OPENMP/fix_npt_omp.cpp | 14 ++++----- src/OPENMP/fix_npt_sphere_omp.cpp | 14 ++++----- src/OPENMP/fix_nvt_asphere_omp.cpp | 12 +++----- src/OPENMP/fix_nvt_omp.cpp | 14 ++++----- src/OPENMP/fix_nvt_sphere_omp.cpp | 13 +++------ src/PLUMED/fix_plumed.cpp | 32 ++++++++++++++------- src/QTB/fix_qbmsst.cpp | 28 ++++++++++++------ src/REPLICA/fix_alchemy.cpp | 40 ++++++++++++++++++++++++-- src/fix_nh_sphere.cpp | 2 +- src/fix_press_berendsen.cpp | 3 +- src/fix_press_langevin.cpp | 5 ++-- 39 files changed, 274 insertions(+), 293 deletions(-) diff --git a/src/ASPHERE/fix_nh_asphere.cpp b/src/ASPHERE/fix_nh_asphere.cpp index 45bf011e045..35d0e404be5 100644 --- a/src/ASPHERE/fix_nh_asphere.cpp +++ b/src/ASPHERE/fix_nh_asphere.cpp @@ -27,19 +27,14 @@ using namespace FixConst; /* ---------------------------------------------------------------------- */ -FixNHAsphere::FixNHAsphere(LAMMPS *lmp, int narg, char **arg) : - FixNH(lmp, narg, arg) -{ -} +FixNHAsphere::FixNHAsphere(LAMMPS *lmp, int narg, char **arg) : FixNH(lmp, narg, arg) {} /* ---------------------------------------------------------------------- */ void FixNHAsphere::init() { avec = dynamic_cast(atom->style_match("ellipsoid")); - if (!avec) - error->all(FLERR, - "Compute nvt/nph/npt asphere requires atom style ellipsoid"); + if (!avec) error->all(FLERR, "Fix {} requires atom style ellipsoid", style); // check that all particles are finite-size // no point particles allowed, spherical is OK @@ -51,7 +46,7 @@ void FixNHAsphere::init() for (int i = 0; i < nlocal; i++) if (mask[i] & groupbit) if (ellipsoid[i] < 0) - error->one(FLERR,"Fix nvt/nph/npt asphere requires extended particles"); + error->one(FLERR,"Fix {} requires all extended particles", style); FixNH::init(); } diff --git a/src/ASPHERE/fix_nph_asphere.cpp b/src/ASPHERE/fix_nph_asphere.cpp index 6c25277d6a5..6240e824074 100644 --- a/src/ASPHERE/fix_nph_asphere.cpp +++ b/src/ASPHERE/fix_nph_asphere.cpp @@ -1,4 +1,3 @@ -// clang-format off /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories @@ -22,14 +21,13 @@ using namespace FixConst; /* ---------------------------------------------------------------------- */ -FixNPHAsphere::FixNPHAsphere(LAMMPS *lmp, int narg, char **arg) : - FixNHAsphere(lmp, narg, arg) +FixNPHAsphere::FixNPHAsphere(LAMMPS *lmp, int narg, char **arg) : FixNHAsphere(lmp, narg, arg) { if (tstat_flag) - error->all(FLERR,"Temperature control can not be used " + error->all(FLERR, + "Temperature control can not be used " "with fix nph/asphere"); - if (!pstat_flag) - error->all(FLERR,"Pressure control must be used with fix nph/asphere"); + if (!pstat_flag) error->all(FLERR, "Pressure control must be used with fix nph/asphere"); // create a new compute temp style // id = fix-ID + temp @@ -37,7 +35,7 @@ FixNPHAsphere::FixNPHAsphere(LAMMPS *lmp, int narg, char **arg) : // and thus its KE/temperature contribution should use group all id_temp = utils::strdup(std::string(id) + "_temp"); - modify->add_compute(fmt::format("{} all temp/asphere",id_temp)); + modify->add_compute(fmt::format("{} all temp/asphere", id_temp)); tcomputeflag = 1; // create a new compute pressure style @@ -45,6 +43,6 @@ FixNPHAsphere::FixNPHAsphere(LAMMPS *lmp, int narg, char **arg) : // pass id_temp as 4th arg to pressure constructor id_press = utils::strdup(std::string(id) + "_press"); - modify->add_compute(fmt::format("{} all pressure {}",id_press, id_temp)); + modify->add_compute(fmt::format("{} all pressure {}", id_press, id_temp)); pcomputeflag = 1; } diff --git a/src/ASPHERE/fix_npt_asphere.cpp b/src/ASPHERE/fix_npt_asphere.cpp index 9d240a1b9af..72d8f4bd91e 100644 --- a/src/ASPHERE/fix_npt_asphere.cpp +++ b/src/ASPHERE/fix_npt_asphere.cpp @@ -1,4 +1,3 @@ -// clang-format off /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories @@ -22,13 +21,10 @@ using namespace FixConst; /* ---------------------------------------------------------------------- */ -FixNPTAsphere::FixNPTAsphere(LAMMPS *lmp, int narg, char **arg) : - FixNHAsphere(lmp, narg, arg) +FixNPTAsphere::FixNPTAsphere(LAMMPS *lmp, int narg, char **arg) : FixNHAsphere(lmp, narg, arg) { - if (!tstat_flag) - error->all(FLERR,"Temperature control must be used with fix npt/asphere"); - if (!pstat_flag) - error->all(FLERR,"Pressure control must be used with fix npt/asphere"); + if (!tstat_flag) error->all(FLERR, "Temperature control must be used with fix npt/asphere"); + if (!pstat_flag) error->all(FLERR, "Pressure control must be used with fix npt/asphere"); // create a new compute temp style // id = fix-ID + temp @@ -36,7 +32,7 @@ FixNPTAsphere::FixNPTAsphere(LAMMPS *lmp, int narg, char **arg) : // and thus its KE/temperature contribution should use group all id_temp = utils::strdup(std::string(id) + "_temp"); - modify->add_compute(fmt::format("{} all temp/asphere",id_temp)); + modify->add_compute(fmt::format("{} all temp/asphere", id_temp)); tcomputeflag = 1; // create a new compute pressure style @@ -44,6 +40,6 @@ FixNPTAsphere::FixNPTAsphere(LAMMPS *lmp, int narg, char **arg) : // pass id_temp as 4th arg to pressure constructor id_press = utils::strdup(std::string(id) + "_press"); - modify->add_compute(fmt::format("{} all pressure {}",id_press, id_temp)); + modify->add_compute(fmt::format("{} all pressure {}", id_press, id_temp)); pcomputeflag = 1; } diff --git a/src/ASPHERE/fix_nvt_asphere.cpp b/src/ASPHERE/fix_nvt_asphere.cpp index 16b7c65b384..26cb75c9c81 100644 --- a/src/ASPHERE/fix_nvt_asphere.cpp +++ b/src/ASPHERE/fix_nvt_asphere.cpp @@ -1,4 +1,3 @@ -// clang-format off /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories @@ -23,19 +22,15 @@ using namespace FixConst; /* ---------------------------------------------------------------------- */ -FixNVTAsphere::FixNVTAsphere(LAMMPS *lmp, int narg, char **arg) : - FixNHAsphere(lmp, narg, arg) +FixNVTAsphere::FixNVTAsphere(LAMMPS *lmp, int narg, char **arg) : FixNHAsphere(lmp, narg, arg) { - if (!tstat_flag) - error->all(FLERR,"Temperature control must be used with fix nvt/asphere"); - if (pstat_flag) - error->all(FLERR,"Pressure control can not be used with fix nvt/asphere"); + if (!tstat_flag) error->all(FLERR, "Temperature control must be used with fix nvt/asphere"); + if (pstat_flag) error->all(FLERR, "Pressure control can not be used with fix nvt/asphere"); // create a new compute temp style // id = fix-ID + temp id_temp = utils::strdup(std::string(id) + "_temp"); - modify->add_compute(fmt::format("{} {} temp/asphere", - id_temp,group->names[igroup])); + modify->add_compute(fmt::format("{} {} temp/asphere", id_temp, group->names[igroup])); tcomputeflag = 1; } diff --git a/src/BODY/fix_nh_body.cpp b/src/BODY/fix_nh_body.cpp index 5e56c293129..49c25f63d67 100644 --- a/src/BODY/fix_nh_body.cpp +++ b/src/BODY/fix_nh_body.cpp @@ -39,8 +39,7 @@ void FixNHBody::init() { avec = dynamic_cast(atom->style_match("body")); if (!avec) - error->all(FLERR, - "Compute nvt/nph/npt body requires atom style body"); + error->all(FLERR, "Compute nvt/nph/npt body requires atom style body"); // check that all particles are finite-size // no point particles allowed, spherical is OK diff --git a/src/BODY/fix_nph_body.cpp b/src/BODY/fix_nph_body.cpp index 14dea9d36b1..93f0f31e8a5 100644 --- a/src/BODY/fix_nph_body.cpp +++ b/src/BODY/fix_nph_body.cpp @@ -1,4 +1,3 @@ -// clang-format off /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories @@ -26,13 +25,10 @@ using namespace FixConst; /* ---------------------------------------------------------------------- */ -FixNPHBody::FixNPHBody(LAMMPS *lmp, int narg, char **arg) : - FixNHBody(lmp, narg, arg) +FixNPHBody::FixNPHBody(LAMMPS *lmp, int narg, char **arg) : FixNHBody(lmp, narg, arg) { - if (tstat_flag) - error->all(FLERR,"Temperature control can not be used with fix nph/body"); - if (!pstat_flag) - error->all(FLERR,"Pressure control must be used with fix nph/body"); + if (tstat_flag) error->all(FLERR, "Temperature control can not be used with fix nph/body"); + if (!pstat_flag) error->all(FLERR, "Pressure control must be used with fix nph/body"); // create a new compute temp style // id = fix-ID + temp @@ -40,7 +36,7 @@ FixNPHBody::FixNPHBody(LAMMPS *lmp, int narg, char **arg) : // and thus its KE/temperature contribution should use group all id_temp = utils::strdup(std::string(id) + "_temp"); - modify->add_compute(fmt::format("{} all temp/body",id_temp)); + modify->add_compute(fmt::format("{} all temp/body", id_temp)); tcomputeflag = 1; // create a new compute pressure style @@ -48,6 +44,6 @@ FixNPHBody::FixNPHBody(LAMMPS *lmp, int narg, char **arg) : // pass id_temp as 4th arg to pressure constructor id_press = utils::strdup(std::string(id) + "_press"); - modify->add_compute(fmt::format("{} all pressure {}",id_press, id_temp)); + modify->add_compute(fmt::format("{} all pressure {}", id_press, id_temp)); pcomputeflag = 1; } diff --git a/src/BODY/fix_npt_body.cpp b/src/BODY/fix_npt_body.cpp index b6c774223fa..ffcf1867f4b 100644 --- a/src/BODY/fix_npt_body.cpp +++ b/src/BODY/fix_npt_body.cpp @@ -1,4 +1,3 @@ -// clang-format off /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories @@ -26,13 +25,10 @@ using namespace FixConst; /* ---------------------------------------------------------------------- */ -FixNPTBody::FixNPTBody(LAMMPS *lmp, int narg, char **arg) : - FixNHBody(lmp, narg, arg) +FixNPTBody::FixNPTBody(LAMMPS *lmp, int narg, char **arg) : FixNHBody(lmp, narg, arg) { - if (!tstat_flag) - error->all(FLERR,"Temperature control must be used with fix npt/body"); - if (!pstat_flag) - error->all(FLERR,"Pressure control must be used with fix npt/body"); + if (!tstat_flag) error->all(FLERR, "Temperature control must be used with fix npt/body"); + if (!pstat_flag) error->all(FLERR, "Pressure control must be used with fix npt/body"); // create a new compute temp style // id = fix-ID + temp @@ -40,7 +36,7 @@ FixNPTBody::FixNPTBody(LAMMPS *lmp, int narg, char **arg) : // and thus its KE/temperature contribution should use group all id_temp = utils::strdup(std::string(id) + "_temp"); - modify->add_compute(fmt::format("{} all temp/body",id_temp)); + modify->add_compute(fmt::format("{} all temp/body", id_temp)); tcomputeflag = 1; // create a new compute pressure style @@ -48,6 +44,6 @@ FixNPTBody::FixNPTBody(LAMMPS *lmp, int narg, char **arg) : // pass id_temp as 4th arg to pressure constructor id_press = utils::strdup(std::string(id) + "_press"); - modify->add_compute(fmt::format("{} all pressure {}",id_press, id_temp)); + modify->add_compute(fmt::format("{} all pressure {}", id_press, id_temp)); pcomputeflag = 1; } diff --git a/src/BODY/fix_nvt_body.cpp b/src/BODY/fix_nvt_body.cpp index aec808d1ea7..7417ab7a5ed 100644 --- a/src/BODY/fix_nvt_body.cpp +++ b/src/BODY/fix_nvt_body.cpp @@ -1,4 +1,3 @@ -// clang-format off /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories @@ -27,19 +26,15 @@ using namespace FixConst; /* ---------------------------------------------------------------------- */ -FixNVTBody::FixNVTBody(LAMMPS *lmp, int narg, char **arg) : - FixNHBody(lmp, narg, arg) +FixNVTBody::FixNVTBody(LAMMPS *lmp, int narg, char **arg) : FixNHBody(lmp, narg, arg) { - if (!tstat_flag) - error->all(FLERR,"Temperature control must be used with fix nvt/body"); - if (pstat_flag) - error->all(FLERR,"Pressure control can not be used with fix nvt/body"); + if (!tstat_flag) error->all(FLERR, "Temperature control must be used with fix nvt/body"); + if (pstat_flag) error->all(FLERR, "Pressure control can not be used with fix nvt/body"); // create a new compute temp style // id = fix-ID + temp id_temp = utils::strdup(std::string(id) + "_temp"); - modify->add_compute(fmt::format("{} {} temp/body", - id_temp,group->names[igroup])); + modify->add_compute(fmt::format("{} {} temp/body", id_temp, group->names[igroup])); tcomputeflag = 1; } diff --git a/src/DRUDE/fix_tgnh_drude.cpp b/src/DRUDE/fix_tgnh_drude.cpp index bb0640fa45e..503cac604a2 100644 --- a/src/DRUDE/fix_tgnh_drude.cpp +++ b/src/DRUDE/fix_tgnh_drude.cpp @@ -611,9 +611,12 @@ void FixTGNHDrude::init() if (pstat_flag) { pressure = modify->get_compute_by_id(id_press); - if (!pressure) error->all(FLERR,"Pressure ID for fix {} does not exist", id_press); - if (pressure->pressflag == 0) - error->all(FLERR,"Compute ID {} does not compute pressure", id_press); + if (!pressure) { + error->all(FLERR,"Pressure compute ID {} for fix {} does not exist", id_press, style); + } else { + if (pressure->pressflag == 0) + error->all(FLERR,"Compute ID {} for fix {} does not compute pressure", id_press, style); + } } // set timesteps and frequencies diff --git a/src/DRUDE/fix_tgnpt_drude.cpp b/src/DRUDE/fix_tgnpt_drude.cpp index 52da72708c8..f62975b64e7 100644 --- a/src/DRUDE/fix_tgnpt_drude.cpp +++ b/src/DRUDE/fix_tgnpt_drude.cpp @@ -1,4 +1,3 @@ -// clang-format off /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories @@ -22,13 +21,10 @@ using namespace FixConst; /* ---------------------------------------------------------------------- */ -FixTGNPTDrude::FixTGNPTDrude(LAMMPS *lmp, int narg, char **arg) : - FixTGNHDrude(lmp, narg, arg) +FixTGNPTDrude::FixTGNPTDrude(LAMMPS *lmp, int narg, char **arg) : FixTGNHDrude(lmp, narg, arg) { - if (!tstat_flag) - error->all(FLERR,"Temperature control must be used with fix npt"); - if (!pstat_flag) - error->all(FLERR,"Pressure control must be used with fix npt"); + if (!tstat_flag) error->all(FLERR, "Temperature control must be used with fix npt"); + if (!pstat_flag) error->all(FLERR, "Pressure control must be used with fix npt"); // create a new compute temp style // id = fix-ID + temp @@ -36,7 +32,7 @@ FixTGNPTDrude::FixTGNPTDrude(LAMMPS *lmp, int narg, char **arg) : // and thus its KE/temperature contribution should use group all id_temp = utils::strdup(std::string(id) + "_temp"); - modify->add_compute(fmt::format("{} all temp",id_temp)); + modify->add_compute(fmt::format("{} all temp", id_temp)); tcomputeflag = 1; // create a new compute pressure style @@ -44,6 +40,6 @@ FixTGNPTDrude::FixTGNPTDrude(LAMMPS *lmp, int narg, char **arg) : // pass id_temp as 4th arg to pressure constructor id_press = utils::strdup(std::string(id) + "_press"); - modify->add_compute(fmt::format("{} all pressure {}",id_press, id_temp)); + modify->add_compute(fmt::format("{} all pressure {}", id_press, id_temp)); pcomputeflag = 1; } diff --git a/src/DRUDE/fix_tgnvt_drude.cpp b/src/DRUDE/fix_tgnvt_drude.cpp index 8c7354a7b8b..91956eb6580 100644 --- a/src/DRUDE/fix_tgnvt_drude.cpp +++ b/src/DRUDE/fix_tgnvt_drude.cpp @@ -1,4 +1,3 @@ -// clang-format off /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories @@ -23,18 +22,15 @@ using namespace FixConst; /* ---------------------------------------------------------------------- */ -FixTGNVTDrude::FixTGNVTDrude(LAMMPS *lmp, int narg, char **arg) : - FixTGNHDrude(lmp, narg, arg) +FixTGNVTDrude::FixTGNVTDrude(LAMMPS *lmp, int narg, char **arg) : FixTGNHDrude(lmp, narg, arg) { - if (!tstat_flag) - error->all(FLERR,"Temperature control must be used with fix nvt"); - if (pstat_flag) - error->all(FLERR,"Pressure control can not be used with fix nvt"); + if (!tstat_flag) error->all(FLERR, "Temperature control must be used with fix {}", style); + if (pstat_flag) error->all(FLERR, "Pressure control can not be used with fix {}", style); // create a new compute temp style // id = fix-ID + temp id_temp = utils::strdup(std::string(id) + "_temp"); - modify->add_compute(fmt::format("{} {} temp",id_temp,group->names[igroup])); + modify->add_compute(fmt::format("{} {} temp", id_temp, group->names[igroup])); tcomputeflag = 1; } diff --git a/src/EFF/fix_nph_eff.cpp b/src/EFF/fix_nph_eff.cpp index e5a3807d304..b34c7117866 100644 --- a/src/EFF/fix_nph_eff.cpp +++ b/src/EFF/fix_nph_eff.cpp @@ -1,4 +1,3 @@ -// clang-format off /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories @@ -22,13 +21,10 @@ using namespace FixConst; /* ---------------------------------------------------------------------- */ -FixNPHEff::FixNPHEff(LAMMPS *lmp, int narg, char **arg) : - FixNHEff(lmp, narg, arg) +FixNPHEff::FixNPHEff(LAMMPS *lmp, int narg, char **arg) : FixNHEff(lmp, narg, arg) { - if (tstat_flag) - error->all(FLERR,"Temperature control can not be used with fix nph/eff"); - if (!pstat_flag) - error->all(FLERR,"Pressure control must be used with fix nph/eff"); + if (tstat_flag) error->all(FLERR, "Temperature control can not be used with fix nph/eff"); + if (!pstat_flag) error->all(FLERR, "Pressure control must be used with fix nph/eff"); // create a new compute temp style // id = fix-ID + temp @@ -36,7 +32,7 @@ FixNPHEff::FixNPHEff(LAMMPS *lmp, int narg, char **arg) : // and thus its KE/temperature contribution should use group all id_temp = utils::strdup(std::string(id) + "_temp"); - modify->add_compute(fmt::format("{} all temp/eff",id_temp)); + modify->add_compute(fmt::format("{} all temp/eff", id_temp)); tcomputeflag = 1; // create a new compute pressure style @@ -44,6 +40,6 @@ FixNPHEff::FixNPHEff(LAMMPS *lmp, int narg, char **arg) : // pass id_temp as 4th arg to pressure constructor id_press = utils::strdup(std::string(id) + "_press"); - modify->add_compute(fmt::format("{} all pressure {}",id_press, id_temp)); + modify->add_compute(fmt::format("{} all pressure {}", id_press, id_temp)); pcomputeflag = 1; } diff --git a/src/EFF/fix_npt_eff.cpp b/src/EFF/fix_npt_eff.cpp index 0d97166abf1..45cc00b4966 100644 --- a/src/EFF/fix_npt_eff.cpp +++ b/src/EFF/fix_npt_eff.cpp @@ -1,4 +1,3 @@ -// clang-format off /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories @@ -22,13 +21,10 @@ using namespace FixConst; /* ---------------------------------------------------------------------- */ -FixNPTEff::FixNPTEff(LAMMPS *lmp, int narg, char **arg) : - FixNHEff(lmp, narg, arg) +FixNPTEff::FixNPTEff(LAMMPS *lmp, int narg, char **arg) : FixNHEff(lmp, narg, arg) { - if (!tstat_flag) - error->all(FLERR,"Temperature control must be used with fix npt/eff"); - if (!pstat_flag) - error->all(FLERR,"Pressure control must be used with fix npt/eff"); + if (!tstat_flag) error->all(FLERR, "Temperature control must be used with fix npt/eff"); + if (!pstat_flag) error->all(FLERR, "Pressure control must be used with fix npt/eff"); // create a new compute temp style // id = fix-ID + temp @@ -36,7 +32,7 @@ FixNPTEff::FixNPTEff(LAMMPS *lmp, int narg, char **arg) : // and thus its KE/temperature contribution should use group all id_temp = utils::strdup(std::string(id) + "_temp"); - modify->add_compute(fmt::format("{} all temp/eff",id_temp)); + modify->add_compute(fmt::format("{} all temp/eff", id_temp)); tcomputeflag = 1; // create a new compute pressure style @@ -44,6 +40,6 @@ FixNPTEff::FixNPTEff(LAMMPS *lmp, int narg, char **arg) : // pass id_temp as 4th arg to pressure constructor id_press = utils::strdup(std::string(id) + "_press"); - modify->add_compute(fmt::format("{} all pressure {}",id_press, id_temp)); + modify->add_compute(fmt::format("{} all pressure {}", id_press, id_temp)); pcomputeflag = 1; } diff --git a/src/EFF/fix_nvt_eff.cpp b/src/EFF/fix_nvt_eff.cpp index 02be397c521..db4f4a2ab81 100644 --- a/src/EFF/fix_nvt_eff.cpp +++ b/src/EFF/fix_nvt_eff.cpp @@ -1,4 +1,3 @@ -// clang-format off /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories @@ -23,19 +22,15 @@ using namespace FixConst; /* ---------------------------------------------------------------------- */ -FixNVTEff::FixNVTEff(LAMMPS *lmp, int narg, char **arg) : - FixNHEff(lmp, narg, arg) +FixNVTEff::FixNVTEff(LAMMPS *lmp, int narg, char **arg) : FixNHEff(lmp, narg, arg) { - if (!tstat_flag) - error->all(FLERR,"Temperature control must be used with fix nvt/eff"); - if (pstat_flag) - error->all(FLERR,"Pressure control can not be used with fix nvt/eff"); + if (!tstat_flag) error->all(FLERR, "Temperature control must be used with fix nvt/eff"); + if (pstat_flag) error->all(FLERR, "Pressure control can not be used with fix nvt/eff"); // create a new compute temp style // id = fix-ID + temp id_temp = utils::strdup(std::string(id) + "_temp"); - modify->add_compute(fmt::format("{} {} temp/eff", - id_temp,group->names[igroup])); + modify->add_compute(fmt::format("{} {} temp/eff", id_temp, group->names[igroup])); tcomputeflag = 1; } diff --git a/src/EFF/fix_nvt_sllod_eff.cpp b/src/EFF/fix_nvt_sllod_eff.cpp index f67684b5285..de284f8f507 100644 --- a/src/EFF/fix_nvt_sllod_eff.cpp +++ b/src/EFF/fix_nvt_sllod_eff.cpp @@ -81,16 +81,14 @@ void FixNVTSllodEff::init() // check fix deform remap settings - int i; - for (i = 0; i < modify->nfix; i++) - if (strncmp(modify->fix[i]->style,"deform",6) == 0) { - if ((dynamic_cast(modify->fix[i]))->remapflag != Domain::V_REMAP) - error->all(FLERR,"Using fix nvt/sllod/eff with inconsistent fix deform " - "remap option"); - break; - } - if (i == modify->nfix) - error->all(FLERR,"Using fix nvt/sllod/eff with no fix deform defined"); + auto deform = modify->get_fix_by_style("^deform"); + if (deform.size() < 1) error->all(FLERR,"Using fix {} with no fix deform defined", style); + + for (auto &ifix : deform) { + auto f = dynamic_cast(ifix); + if (f && (f->remapflag != Domain::V_REMAP)) + error->all(FLERR,"Using fix {} with inconsistent fix deform remap option", style); + } } diff --git a/src/EXTRA-FIX/fix_deform_pressure.cpp b/src/EXTRA-FIX/fix_deform_pressure.cpp index 6d8bfbbe934..bb15611f97d 100644 --- a/src/EXTRA-FIX/fix_deform_pressure.cpp +++ b/src/EXTRA-FIX/fix_deform_pressure.cpp @@ -432,15 +432,18 @@ void FixDeformPressure::init() if (pressure_flag) { temperature = modify->get_compute_by_id(id_temp); - if (!temperature) - error->all(FLERR, "Temperature compute ID {} for fix deform/pressure does not exist", - id_temp); + if (!temperature) { + error->all(FLERR, "Temperature compute ID {} for fix {} does not exist", id_temp, style); + } else { + if (temperature->tempflag == 0) + error->all(FLERR, "Compute ID {} for fix {} does not compute a temperature", id_temp, style); + } pressure = modify->get_compute_by_id(id_press); if (!pressure) - error->all(FLERR, "Pressure compute ID {} for fix deform/pressure does not exist", id_press); + error->all(FLERR,"Pressure compute ID {} for fix {} does not exist", id_press, style); if (pressure->pressflag == 0) - error->all(FLERR,"Compute ID {} does not compute pressure", id_press); + error->all(FLERR,"Compute ID {} for fix {} does not compute pressure", id_press, style); } // if yz [3] changes and will cause box flip, then xy [5] cannot be changing diff --git a/src/EXTRA-FIX/fix_npt_cauchy.cpp b/src/EXTRA-FIX/fix_npt_cauchy.cpp index 123cd6ca0a6..e94177233ff 100644 --- a/src/EXTRA-FIX/fix_npt_cauchy.cpp +++ b/src/EXTRA-FIX/fix_npt_cauchy.cpp @@ -640,15 +640,17 @@ void FixNPTCauchy::init() // ensure no conflict with fix deform if (pstat_flag) - for (int i = 0; i < modify->nfix; i++) - if (strcmp(modify->fix[i]->style,"deform") == 0) { - int *dimflag = (dynamic_cast(modify->fix[i]))->dimflag; + for (auto &ifix : modify->get_fix_by_style("^deform")) { + auto deform = dynamic_cast(ifix); + if (deform) { + int *dimflag = deform->dimflag; if ((p_flag[0] && dimflag[0]) || (p_flag[1] && dimflag[1]) || (p_flag[2] && dimflag[2]) || (p_flag[3] && dimflag[3]) || (p_flag[4] && dimflag[4]) || (p_flag[5] && dimflag[5])) - error->all(FLERR,"Cannot use fix npt/cauchy and fix deform " - "on same component of stress tensor"); + error->all(FLERR,"Cannot use fix {} and fix deform on " + "same component of stress tensor", style); } + } // set temperature and pressure ptrs @@ -664,9 +666,12 @@ void FixNPTCauchy::init() if (pstat_flag) { pressure = modify->get_compute_by_id(id_press); - if (!pressure) error->all(FLERR,"Pressure ID {} for fix npt/cauchy does not exist", id_press); - if (pressure->pressflag == 0) - error->all(FLERR,"Compute ID {} does not compute pressure", id_press); + if (!pressure) { + error->all(FLERR,"Pressure ID {} for fix {} does not exist", id_press, style); + } else { + if (pressure->pressflag == 0) + error->all(FLERR,"Compute ID {} for fix {} does not compute pressure", id_press, style); + } } // set timesteps and frequencies diff --git a/src/EXTRA-FIX/fix_numdiff.cpp b/src/EXTRA-FIX/fix_numdiff.cpp index dd9361f0aeb..87bd456181a 100644 --- a/src/EXTRA-FIX/fix_numdiff.cpp +++ b/src/EXTRA-FIX/fix_numdiff.cpp @@ -111,7 +111,12 @@ void FixNumDiff::init() // check for PE compute pe = modify->get_compute_by_id(id_pe); - if (!pe) error->all(FLERR, "PE compute ID for fix numdiff does not exist"); + if (!pe) { + error->all(FLERR, "Potential energy compute ID {} for fix {} does not exist", id_pe, style); + } else { + if (pe->peflag == 0) + error->all(FLERR, "Compute ID {} for fix {} does not compute potential energy", id_pe, style); + } if (force->pair && force->pair->compute_flag) pair_compute_flag = 1; diff --git a/src/EXTRA-FIX/fix_numdiff_virial.cpp b/src/EXTRA-FIX/fix_numdiff_virial.cpp index 7336be81dc1..895c10b5813 100644 --- a/src/EXTRA-FIX/fix_numdiff_virial.cpp +++ b/src/EXTRA-FIX/fix_numdiff_virial.cpp @@ -120,7 +120,12 @@ void FixNumDiffVirial::init() // check for PE compute pe = modify->get_compute_by_id(id_pe); - if (!pe) error->all(FLERR, "PE compute ID for fix numdiff/virial does not exist"); + if (!pe) { + error->all(FLERR, "Potential energy compute ID {} for fix {} does not exist", id_pe, style); + } else { + if (pe->peflag == 0) + error->all(FLERR, "Compute ID {} for fix {} does not compute potential energy", id_pe, style); + } if (force->pair && force->pair->compute_flag) pair_compute_flag = 1; diff --git a/src/GPU/fix_npt_gpu.cpp b/src/GPU/fix_npt_gpu.cpp index 8f2d04d5edc..45876500646 100644 --- a/src/GPU/fix_npt_gpu.cpp +++ b/src/GPU/fix_npt_gpu.cpp @@ -1,4 +1,3 @@ -// clang-format off /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories @@ -22,28 +21,25 @@ using namespace FixConst; /* ---------------------------------------------------------------------- */ -FixNPTGPU::FixNPTGPU(LAMMPS *lmp, int narg, char **arg) : - FixNHGPU(lmp, narg, arg) +FixNPTGPU::FixNPTGPU(LAMMPS *lmp, int narg, char **arg) : FixNHGPU(lmp, narg, arg) { - if (!tstat_flag) - error->all(FLERR,"Temperature control must be used with fix npt/gpu"); - if (!pstat_flag) - error->all(FLERR,"Pressure control must be used with fix npt/gpu"); + if (!tstat_flag) error->all(FLERR, "Temperature control must be used with fix npt/gpu"); + if (!pstat_flag) error->all(FLERR, "Pressure control must be used with fix npt/gpu"); // create a new compute temp style // id = fix-ID + temp // compute group = all since pressure is always global (group all) // and thus its KE/temperature contribution should use group all - id_temp = utils::strdup(std::string(id)+"_temp"); - modify->add_compute(fmt::format("{} all temp",id_temp)); + id_temp = utils::strdup(std::string(id) + "_temp"); + modify->add_compute(fmt::format("{} all temp", id_temp)); tcomputeflag = 1; // create a new compute pressure style // id = fix-ID + press, compute group = all // pass id_temp as 4th arg to pressure constructor - id_press = utils::strdup(std::string(id)+"_press"); - modify->add_compute(std::string(id_press)+" all pressure "+id_temp); + id_press = utils::strdup(std::string(id) + "_press"); + modify->add_compute(std::string(id_press) + " all pressure " + id_temp); pcomputeflag = 1; } diff --git a/src/GPU/fix_nvt_gpu.cpp b/src/GPU/fix_nvt_gpu.cpp index 6b1254e8da0..5f4e6b99e65 100644 --- a/src/GPU/fix_nvt_gpu.cpp +++ b/src/GPU/fix_nvt_gpu.cpp @@ -1,4 +1,3 @@ -// clang-format off /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories @@ -23,18 +22,15 @@ using namespace FixConst; /* ---------------------------------------------------------------------- */ -FixNVTGPU::FixNVTGPU(LAMMPS *lmp, int narg, char **arg) : - FixNHGPU(lmp, narg, arg) +FixNVTGPU::FixNVTGPU(LAMMPS *lmp, int narg, char **arg) : FixNHGPU(lmp, narg, arg) { - if (!tstat_flag) - error->all(FLERR,"Temperature control must be used with fix nvt/gpu"); - if (pstat_flag) - error->all(FLERR,"Pressure control can not be used with fix nvt/gpu"); + if (!tstat_flag) error->all(FLERR, "Temperature control must be used with fix nvt/gpu"); + if (pstat_flag) error->all(FLERR, "Pressure control can not be used with fix nvt/gpu"); // create a new compute temp style // id = fix-ID + temp id_temp = utils::strdup(std::string(id) + "_temp"); - modify->add_compute(fmt::format("{} {} temp",id_temp,group->names[igroup])); + modify->add_compute(fmt::format("{} {} temp", id_temp, group->names[igroup])); tcomputeflag = 1; } diff --git a/src/INTEL/fix_npt_intel.cpp b/src/INTEL/fix_npt_intel.cpp index d1cf5a1fd8b..bfdd2f3de14 100644 --- a/src/INTEL/fix_npt_intel.cpp +++ b/src/INTEL/fix_npt_intel.cpp @@ -1,4 +1,3 @@ -// clang-format off /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories @@ -22,13 +21,10 @@ using namespace FixConst; /* ---------------------------------------------------------------------- */ -FixNPTIntel::FixNPTIntel(LAMMPS *lmp, int narg, char **arg) : - FixNHIntel(lmp, narg, arg) +FixNPTIntel::FixNPTIntel(LAMMPS *lmp, int narg, char **arg) : FixNHIntel(lmp, narg, arg) { - if (!tstat_flag) - error->all(FLERR,"Temperature control must be used with fix npt/intel"); - if (!pstat_flag) - error->all(FLERR,"Pressure control must be used with fix npt/intl"); + if (!tstat_flag) error->all(FLERR, "Temperature control must be used with fix npt/intel"); + if (!pstat_flag) error->all(FLERR, "Pressure control must be used with fix npt/intl"); // create a new compute temp style // id = fix-ID + temp @@ -36,7 +32,7 @@ FixNPTIntel::FixNPTIntel(LAMMPS *lmp, int narg, char **arg) : // and thus its KE/temperature contribution should use group all id_temp = utils::strdup(std::string(id) + "_temp"); - modify->add_compute(fmt::format("{} all temp",id_temp)); + modify->add_compute(fmt::format("{} all temp", id_temp)); tcomputeflag = 1; // create a new compute pressure style @@ -44,6 +40,6 @@ FixNPTIntel::FixNPTIntel(LAMMPS *lmp, int narg, char **arg) : // pass id_temp as 4th arg to pressure constructor id_press = utils::strdup(std::string(id) + "_press"); - modify->add_compute(fmt::format("{} all pressure {}",id_press, id_temp)); + modify->add_compute(fmt::format("{} all pressure {}", id_press, id_temp)); pcomputeflag = 1; } diff --git a/src/INTEL/fix_nvt_intel.cpp b/src/INTEL/fix_nvt_intel.cpp index c9e87499de6..d2fb36dbc20 100644 --- a/src/INTEL/fix_nvt_intel.cpp +++ b/src/INTEL/fix_nvt_intel.cpp @@ -1,4 +1,3 @@ -// clang-format off /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories @@ -23,19 +22,15 @@ using namespace FixConst; /* ---------------------------------------------------------------------- */ -FixNVTIntel::FixNVTIntel(LAMMPS *lmp, int narg, char **arg) : - FixNHIntel(lmp, narg, arg) +FixNVTIntel::FixNVTIntel(LAMMPS *lmp, int narg, char **arg) : FixNHIntel(lmp, narg, arg) { - if (!tstat_flag) - error->all(FLERR,"Temperature control must be used with fix nvt/intel"); - if (pstat_flag) - error->all(FLERR,"Pressure control can not be used with fix nvt/intel"); + if (!tstat_flag) error->all(FLERR, "Temperature control must be used with fix nvt/intel"); + if (pstat_flag) error->all(FLERR, "Pressure control can not be used with fix nvt/intel"); // create a new compute temp style // id = fix-ID + temp id_temp = utils::strdup(std::string(id) + "_temp"); - modify->add_compute(fmt::format("{} {} temp",id_temp,group->names[igroup])); + modify->add_compute(fmt::format("{} {} temp", id_temp, group->names[igroup])); tcomputeflag = 1; } - diff --git a/src/MISC/fix_ipi.cpp b/src/MISC/fix_ipi.cpp index 68b552e9c14..fc1adc2e528 100644 --- a/src/MISC/fix_ipi.cpp +++ b/src/MISC/fix_ipi.cpp @@ -259,8 +259,12 @@ void FixIPI::init() socketflag = 1; // asks for evaluation of PE at first step - modify->compute[modify->find_compute("thermo_pe")]->invoked_scalar = -1; - modify->addstep_compute_all(update->ntimestep + 1); + auto c_pe = modify->get_compute_by_id("thermo_pe"); + if (c_pe) { + c_pe->invoked_scalar = -1; + modify->addstep_compute_all(update->ntimestep + 1); + } + kspace_flag = (force->kspace) ? 1 : 0; @@ -444,8 +448,12 @@ void FixIPI::final_integrate() pressconv=1/force->nktv2p*potconv*posconv3; // compute for potential energy - pot=modify->compute[modify->find_compute("thermo_pe")]->compute_scalar(); - pot*=potconv; + + auto *c_pe = modify->get_compute_by_id("thermo_pe"); + if (c_pe) { + pot = c_pe->compute_scalar(); + pot*=potconv; + } // probably useless check if (!hasdata) @@ -469,18 +477,19 @@ void FixIPI::final_integrate() for (int i = 0; i < 9; ++i) vir[i]=0.0; - int press_id = modify->find_compute("IPI_PRESS"); - Compute* comp_p = modify->compute[press_id]; - comp_p->compute_vector(); - double myvol = domain->xprd*domain->yprd*domain->zprd/posconv3; - - vir[0] = comp_p->vector[0]*pressconv*myvol; - vir[4] = comp_p->vector[1]*pressconv*myvol; - vir[8] = comp_p->vector[2]*pressconv*myvol; - vir[1] = comp_p->vector[3]*pressconv*myvol; - vir[2] = comp_p->vector[4]*pressconv*myvol; - vir[5] = comp_p->vector[5]*pressconv*myvol; - retstr[0]=0; + const double myvol = domain->xprd*domain->yprd*domain->zprd/posconv3; + Compute* comp_p = modify->get_compute_by_id("IPI_PRESS"); + if (comp_p) { + comp_p->compute_vector(); + + vir[0] = comp_p->vector[0]*pressconv*myvol; + vir[4] = comp_p->vector[1]*pressconv*myvol; + vir[8] = comp_p->vector[2]*pressconv*myvol; + vir[1] = comp_p->vector[3]*pressconv*myvol; + vir[2] = comp_p->vector[4]*pressconv*myvol; + vir[5] = comp_p->vector[5]*pressconv*myvol; + retstr[0]=0; + } if (master) { // check for new messages diff --git a/src/OPENMP/fix_nph_asphere_omp.cpp b/src/OPENMP/fix_nph_asphere_omp.cpp index 8785f16416b..f66083ddb84 100644 --- a/src/OPENMP/fix_nph_asphere_omp.cpp +++ b/src/OPENMP/fix_nph_asphere_omp.cpp @@ -1,4 +1,3 @@ -// clang-format off /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories @@ -23,12 +22,10 @@ using namespace FixConst; /* ---------------------------------------------------------------------- */ FixNPHAsphereOMP::FixNPHAsphereOMP(LAMMPS *lmp, int narg, char **arg) : - FixNHAsphereOMP(lmp, narg, arg) + FixNHAsphereOMP(lmp, narg, arg) { - if (tstat_flag) - error->all(FLERR,"Temperature control can not be used with fix nph/asphere/tmp"); - if (!pstat_flag) - error->all(FLERR,"Pressure control must be used with fix nph/asphere/omp"); + if (tstat_flag) error->all(FLERR, "Temperature control can not be used with fix nph/asphere/tmp"); + if (!pstat_flag) error->all(FLERR, "Pressure control must be used with fix nph/asphere/omp"); // create a new compute temp style // id = fix-ID + temp @@ -36,7 +33,7 @@ FixNPHAsphereOMP::FixNPHAsphereOMP(LAMMPS *lmp, int narg, char **arg) : // and thus its KE/temperature contribution should use group all id_temp = utils::strdup(std::string(id) + "_temp"); - modify->add_compute(fmt::format("{} all temp/asphere",id_temp)); + modify->add_compute(fmt::format("{} all temp/asphere", id_temp)); tcomputeflag = 1; // create a new compute pressure style @@ -44,6 +41,6 @@ FixNPHAsphereOMP::FixNPHAsphereOMP(LAMMPS *lmp, int narg, char **arg) : // pass id_temp as 4th arg to pressure constructor id_press = utils::strdup(std::string(id) + "_press"); - modify->add_compute(fmt::format("{} all pressure {}",id_press, id_temp)); + modify->add_compute(fmt::format("{} all pressure {}", id_press, id_temp)); pcomputeflag = 1; } diff --git a/src/OPENMP/fix_nph_omp.cpp b/src/OPENMP/fix_nph_omp.cpp index 8fea8341d4e..5d739f59487 100644 --- a/src/OPENMP/fix_nph_omp.cpp +++ b/src/OPENMP/fix_nph_omp.cpp @@ -1,4 +1,3 @@ -// clang-format off /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories @@ -22,13 +21,10 @@ using namespace FixConst; /* ---------------------------------------------------------------------- */ -FixNPHOMP::FixNPHOMP(LAMMPS *lmp, int narg, char **arg) : - FixNHOMP(lmp, narg, arg) +FixNPHOMP::FixNPHOMP(LAMMPS *lmp, int narg, char **arg) : FixNHOMP(lmp, narg, arg) { - if (tstat_flag) - error->all(FLERR,"Temperature control can not be used with fix nph/omp"); - if (!pstat_flag) - error->all(FLERR,"Pressure control must be used with fix nph/omp"); + if (tstat_flag) error->all(FLERR, "Temperature control can not be used with fix nph/omp"); + if (!pstat_flag) error->all(FLERR, "Pressure control must be used with fix nph/omp"); // create a new compute temp style // id = fix-ID + temp @@ -36,7 +32,7 @@ FixNPHOMP::FixNPHOMP(LAMMPS *lmp, int narg, char **arg) : // and thus its KE/temperature contribution should use group all id_temp = utils::strdup(std::string(id) + "_temp"); - modify->add_compute(fmt::format("{} all temp",id_temp)); + modify->add_compute(fmt::format("{} all temp", id_temp)); tcomputeflag = 1; // create a new compute pressure style @@ -44,6 +40,6 @@ FixNPHOMP::FixNPHOMP(LAMMPS *lmp, int narg, char **arg) : // pass id_temp as 4th arg to pressure constructor id_press = utils::strdup(std::string(id) + "_press"); - modify->add_compute(fmt::format("{} all pressure {}",id_press, id_temp)); + modify->add_compute(fmt::format("{} all pressure {}", id_press, id_temp)); pcomputeflag = 1; } diff --git a/src/OPENMP/fix_nph_sphere_omp.cpp b/src/OPENMP/fix_nph_sphere_omp.cpp index dd0d7555aaf..26deab256b1 100644 --- a/src/OPENMP/fix_nph_sphere_omp.cpp +++ b/src/OPENMP/fix_nph_sphere_omp.cpp @@ -1,4 +1,3 @@ -// clang-format off /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories @@ -22,13 +21,10 @@ using namespace FixConst; /* ---------------------------------------------------------------------- */ -FixNPHSphereOMP::FixNPHSphereOMP(LAMMPS *lmp, int narg, char **arg) : - FixNHSphereOMP(lmp, narg, arg) +FixNPHSphereOMP::FixNPHSphereOMP(LAMMPS *lmp, int narg, char **arg) : FixNHSphereOMP(lmp, narg, arg) { - if (tstat_flag) - error->all(FLERR,"Temperature control can not be used with fix nph/sphere/omp"); - if (!pstat_flag) - error->all(FLERR,"Pressure control must be used with fix nph/sphere/omp"); + if (tstat_flag) error->all(FLERR, "Temperature control can not be used with fix nph/sphere/omp"); + if (!pstat_flag) error->all(FLERR, "Pressure control must be used with fix nph/sphere/omp"); // create a new compute temp style // id = fix-ID + temp @@ -36,7 +32,7 @@ FixNPHSphereOMP::FixNPHSphereOMP(LAMMPS *lmp, int narg, char **arg) : // and thus its KE/temperature contribution should use group all id_temp = utils::strdup(std::string(id) + "_temp"); - modify->add_compute(fmt::format("{} all temp/sphere",id_temp)); + modify->add_compute(fmt::format("{} all temp/sphere", id_temp)); tcomputeflag = 1; // create a new compute pressure style @@ -44,6 +40,6 @@ FixNPHSphereOMP::FixNPHSphereOMP(LAMMPS *lmp, int narg, char **arg) : // pass id_temp as 4th arg to pressure constructor id_press = utils::strdup(std::string(id) + "_press"); - modify->add_compute(fmt::format("{} all pressure {}",id_press, id_temp)); + modify->add_compute(fmt::format("{} all pressure {}", id_press, id_temp)); pcomputeflag = 1; } diff --git a/src/OPENMP/fix_npt_asphere_omp.cpp b/src/OPENMP/fix_npt_asphere_omp.cpp index 319738daf93..ed7f92b2e8b 100644 --- a/src/OPENMP/fix_npt_asphere_omp.cpp +++ b/src/OPENMP/fix_npt_asphere_omp.cpp @@ -1,4 +1,3 @@ -// clang-format off /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories @@ -23,12 +22,10 @@ using namespace FixConst; /* ---------------------------------------------------------------------- */ FixNPTAsphereOMP::FixNPTAsphereOMP(LAMMPS *lmp, int narg, char **arg) : - FixNHAsphereOMP(lmp, narg, arg) + FixNHAsphereOMP(lmp, narg, arg) { - if (!tstat_flag) - error->all(FLERR,"Temperature control must be used with fix npt/asphere/omp"); - if (!pstat_flag) - error->all(FLERR,"Pressure control must be used with fix npt/asphere/omp"); + if (!tstat_flag) error->all(FLERR, "Temperature control must be used with fix npt/asphere/omp"); + if (!pstat_flag) error->all(FLERR, "Pressure control must be used with fix npt/asphere/omp"); // create a new compute temp style // id = fix-ID + temp @@ -36,7 +33,7 @@ FixNPTAsphereOMP::FixNPTAsphereOMP(LAMMPS *lmp, int narg, char **arg) : // and thus its KE/temperature contribution should use group all id_temp = utils::strdup(std::string(id) + "_temp"); - modify->add_compute(fmt::format("{} all temp/asphere",id_temp)); + modify->add_compute(fmt::format("{} all temp/asphere", id_temp)); tcomputeflag = 1; // create a new compute pressure style @@ -44,6 +41,6 @@ FixNPTAsphereOMP::FixNPTAsphereOMP(LAMMPS *lmp, int narg, char **arg) : // pass id_temp as 4th arg to pressure constructor id_press = utils::strdup(std::string(id) + "_press"); - modify->add_compute(fmt::format("{} all pressure {}",id_press, id_temp)); + modify->add_compute(fmt::format("{} all pressure {}", id_press, id_temp)); pcomputeflag = 1; } diff --git a/src/OPENMP/fix_npt_omp.cpp b/src/OPENMP/fix_npt_omp.cpp index ab9b8b01391..055a68f928a 100644 --- a/src/OPENMP/fix_npt_omp.cpp +++ b/src/OPENMP/fix_npt_omp.cpp @@ -1,4 +1,3 @@ -// clang-format off /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories @@ -22,13 +21,10 @@ using namespace FixConst; /* ---------------------------------------------------------------------- */ -FixNPTOMP::FixNPTOMP(LAMMPS *lmp, int narg, char **arg) : - FixNHOMP(lmp, narg, arg) +FixNPTOMP::FixNPTOMP(LAMMPS *lmp, int narg, char **arg) : FixNHOMP(lmp, narg, arg) { - if (!tstat_flag) - error->all(FLERR,"Temperature control must be used with fix npt/omp"); - if (!pstat_flag) - error->all(FLERR,"Pressure control must be used with fix npt/omp"); + if (!tstat_flag) error->all(FLERR, "Temperature control must be used with fix npt/omp"); + if (!pstat_flag) error->all(FLERR, "Pressure control must be used with fix npt/omp"); // create a new compute temp style // id = fix-ID + temp @@ -36,7 +32,7 @@ FixNPTOMP::FixNPTOMP(LAMMPS *lmp, int narg, char **arg) : // and thus its KE/temperature contribution should use group all id_temp = utils::strdup(std::string(id) + "_temp"); - modify->add_compute(fmt::format("{} all temp",id_temp)); + modify->add_compute(fmt::format("{} all temp", id_temp)); tcomputeflag = 1; // create a new compute pressure style @@ -44,6 +40,6 @@ FixNPTOMP::FixNPTOMP(LAMMPS *lmp, int narg, char **arg) : // pass id_temp as 4th arg to pressure constructor id_press = utils::strdup(std::string(id) + "_press"); - modify->add_compute(fmt::format("{} all pressure {}",id_press, id_temp)); + modify->add_compute(fmt::format("{} all pressure {}", id_press, id_temp)); pcomputeflag = 1; } diff --git a/src/OPENMP/fix_npt_sphere_omp.cpp b/src/OPENMP/fix_npt_sphere_omp.cpp index f6770a71749..b83bcc84b60 100644 --- a/src/OPENMP/fix_npt_sphere_omp.cpp +++ b/src/OPENMP/fix_npt_sphere_omp.cpp @@ -1,4 +1,3 @@ -// clang-format off /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories @@ -22,13 +21,10 @@ using namespace FixConst; /* ---------------------------------------------------------------------- */ -FixNPTSphereOMP::FixNPTSphereOMP(LAMMPS *lmp, int narg, char **arg) : - FixNHSphereOMP(lmp, narg, arg) +FixNPTSphereOMP::FixNPTSphereOMP(LAMMPS *lmp, int narg, char **arg) : FixNHSphereOMP(lmp, narg, arg) { - if (!tstat_flag) - error->all(FLERR,"Temperature control must be used with fix npt/sphere/omp"); - if (!pstat_flag) - error->all(FLERR,"Pressure control must be used with fix npt/sphere/omp"); + if (!tstat_flag) error->all(FLERR, "Temperature control must be used with fix npt/sphere/omp"); + if (!pstat_flag) error->all(FLERR, "Pressure control must be used with fix npt/sphere/omp"); // create a new compute temp style // id = fix-ID + temp @@ -36,7 +32,7 @@ FixNPTSphereOMP::FixNPTSphereOMP(LAMMPS *lmp, int narg, char **arg) : // and thus its KE/temperature contribution should use group all id_temp = utils::strdup(std::string(id) + "_temp"); - modify->add_compute(fmt::format("{} all temp/sphere",id_temp)); + modify->add_compute(fmt::format("{} all temp/sphere", id_temp)); tcomputeflag = 1; // create a new compute pressure style @@ -44,6 +40,6 @@ FixNPTSphereOMP::FixNPTSphereOMP(LAMMPS *lmp, int narg, char **arg) : // pass id_temp as 4th arg to pressure constructor id_press = utils::strdup(std::string(id) + "_press"); - modify->add_compute(fmt::format("{} all pressure {}",id_press, id_temp)); + modify->add_compute(fmt::format("{} all pressure {}", id_press, id_temp)); pcomputeflag = 1; } diff --git a/src/OPENMP/fix_nvt_asphere_omp.cpp b/src/OPENMP/fix_nvt_asphere_omp.cpp index 35c73840ec3..42f9249d57d 100644 --- a/src/OPENMP/fix_nvt_asphere_omp.cpp +++ b/src/OPENMP/fix_nvt_asphere_omp.cpp @@ -1,4 +1,3 @@ -// clang-format off /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories @@ -24,18 +23,15 @@ using namespace FixConst; /* ---------------------------------------------------------------------- */ FixNVTAsphereOMP::FixNVTAsphereOMP(LAMMPS *lmp, int narg, char **arg) : - FixNHAsphereOMP(lmp, narg, arg) + FixNHAsphereOMP(lmp, narg, arg) { - if (!tstat_flag) - error->all(FLERR,"Temperature control must be used with fix nvt/asphere/omp"); - if (pstat_flag) - error->all(FLERR,"Pressure control can not be used with fix nvt/asphere/omp"); + if (!tstat_flag) error->all(FLERR, "Temperature control must be used with fix nvt/asphere/omp"); + if (pstat_flag) error->all(FLERR, "Pressure control can not be used with fix nvt/asphere/omp"); // create a new compute temp style // id = fix-ID + temp id_temp = utils::strdup(std::string(id) + "_temp"); - modify->add_compute(fmt::format("{} {} temp/asphere", - id_temp,group->names[igroup])); + modify->add_compute(fmt::format("{} {} temp/asphere", id_temp, group->names[igroup])); tcomputeflag = 1; } diff --git a/src/OPENMP/fix_nvt_omp.cpp b/src/OPENMP/fix_nvt_omp.cpp index 2ad5bf0183e..11e43cad58f 100644 --- a/src/OPENMP/fix_nvt_omp.cpp +++ b/src/OPENMP/fix_nvt_omp.cpp @@ -1,4 +1,3 @@ -// clang-format off /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories @@ -23,18 +22,15 @@ using namespace FixConst; /* ---------------------------------------------------------------------- */ -FixNVTOMP::FixNVTOMP(LAMMPS *lmp, int narg, char **arg) : - FixNHOMP(lmp, narg, arg) +FixNVTOMP::FixNVTOMP(LAMMPS *lmp, int narg, char **arg) : FixNHOMP(lmp, narg, arg) { - if (!tstat_flag) - error->all(FLERR,"Temperature control must be used with fix nvt/omp"); - if (pstat_flag) - error->all(FLERR,"Pressure control can not be used with fix nvt/omp"); + if (!tstat_flag) error->all(FLERR, "Temperature control must be used with fix nvt/omp"); + if (pstat_flag) error->all(FLERR, "Pressure control can not be used with fix nvt/omp"); // create a new compute temp style // id = fix-ID + temp - id_temp = utils::strdup(std::string(id)+"_temp"); - modify->add_compute(fmt::format("{} {} temp",id_temp,group->names[igroup])); + id_temp = utils::strdup(std::string(id) + "_temp"); + modify->add_compute(fmt::format("{} {} temp", id_temp, group->names[igroup])); tcomputeflag = 1; } diff --git a/src/OPENMP/fix_nvt_sphere_omp.cpp b/src/OPENMP/fix_nvt_sphere_omp.cpp index 20d729a972f..46a149c5b87 100644 --- a/src/OPENMP/fix_nvt_sphere_omp.cpp +++ b/src/OPENMP/fix_nvt_sphere_omp.cpp @@ -1,4 +1,3 @@ -// clang-format off /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories @@ -23,19 +22,15 @@ using namespace FixConst; /* ---------------------------------------------------------------------- */ -FixNVTSphereOMP::FixNVTSphereOMP(LAMMPS *lmp, int narg, char **arg) : - FixNHSphereOMP(lmp, narg, arg) +FixNVTSphereOMP::FixNVTSphereOMP(LAMMPS *lmp, int narg, char **arg) : FixNHSphereOMP(lmp, narg, arg) { - if (!tstat_flag) - error->all(FLERR,"Temperature control must be used with fix nvt/sphere/omp"); - if (pstat_flag) - error->all(FLERR,"Pressure control can not be used with fix nvt/sphere/omp"); + if (!tstat_flag) error->all(FLERR, "Temperature control must be used with fix nvt/sphere/omp"); + if (pstat_flag) error->all(FLERR, "Pressure control can not be used with fix nvt/sphere/omp"); // create a new compute temp style // id = fix-ID + temp id_temp = utils::strdup(std::string(id) + "_temp"); - modify->add_compute(fmt::format("{} {} temp/sphere", - id_temp,group->names[igroup])); + modify->add_compute(fmt::format("{} {} temp/sphere", id_temp, group->names[igroup])); tcomputeflag = 1; } diff --git a/src/PLUMED/fix_plumed.cpp b/src/PLUMED/fix_plumed.cpp index f88c0dce18f..3459c212791 100644 --- a/src/PLUMED/fix_plumed.cpp +++ b/src/PLUMED/fix_plumed.cpp @@ -227,17 +227,24 @@ FixPlumed::FixPlumed(LAMMPS *lmp, int narg, char **arg) : if (strcmp(check_style, "plumed") == 0) error->all(FLERR, "There must be only one instance of fix plumed"); + // PLUMED knows nothing about path integrals + + if (utils::strmatch(check_style, "^pimd") || utils::strmatch(check_style, "^ipi")) + error->all(FLERR, "Fix plumed is incompatible with path-integrals"); + // Avoid conflict with fixes that define internal pressure computes. // See comment in the setup method - if (utils::strmatch(check_style, "^nph") || utils::strmatch(check_style, "^npt") || - utils::strmatch(check_style, "^rigid/nph") || utils::strmatch(check_style, "^rigid/npt") || - utils::strmatch(check_style, "^msst") || utils::strmatch(check_style, "^nphug") || - utils::strmatch(check_style, "^ipi") || utils::strmatch(check_style, "^press/berendsen") || - utils::strmatch(check_style, "^qbmsst")) + if (utils::strmatch(check_style, "^nph") || utils::strmatch(check_style, "^press/berendsen") || + utils::strmatch(check_style, "^npt") || utils::strmatch(check_style, "^deform/pressure") || + utils::strmatch(check_style, "^msst") || utils::strmatch(check_style, "^press/langevin") || + utils::strmatch(check_style, "^nphug") || utils::strmatch(check_style, "^tgnpt/drude") || + utils::strmatch(check_style, "^qbmsst") || utils::strmatch(check_style, "^rigid/nph") || + utils::strmatch(check_style, "^rigid/npt") || utils::strmatch(check_style, "^box/relax")) error->all(FLERR, - "Fix plumed must be defined before any other fixes, " - "that compute pressure internally"); + "Fix plumed must be defined before any other fixes like fix {} that compute " + "pressure internally", + check_style); } } @@ -275,15 +282,18 @@ void FixPlumed::init() c_pe = modify->get_compute_by_id(id_pe); if (!c_pe) { - error->all(FLERR,"Potential energy compute ID {} for fix plumed does not exist", id_pe); + error->all(FLERR, "Potential energy compute ID {} for fix plumed does not exist", id_pe); + } else { if (c_pe->peflag == 0) - error->all(FLERR,"Compute ID {} does not compute potential energy", id_pe); + error->all(FLERR, "Compute ID {} does not compute potential energy", id_pe); } + c_press = modify->get_compute_by_id(id_press); if (!c_press) { - error->all(FLERR,"Pressure compute ID {} for fix plumed does not exist", id_press); + error->all(FLERR, "Pressure compute ID {} for fix plumed does not exist", id_press); + } else { if (c_press->pressflag == 0) - error->all(FLERR,"Compute ID {} does not compute pressure", id_press); + error->all(FLERR, "Compute ID {} does not compute pressure", id_press); } } diff --git a/src/QTB/fix_qbmsst.cpp b/src/QTB/fix_qbmsst.cpp index 56d67093fe2..7dd7547efde 100644 --- a/src/QTB/fix_qbmsst.cpp +++ b/src/QTB/fix_qbmsst.cpp @@ -316,18 +316,28 @@ void FixQBMSST::init() // set compute ptrs temperature = modify->get_compute_by_id(id_temp); - if (!temperature) + if (!temperature) { error->all(FLERR, "Could not find fix qbmsst temperature compute ID {}", id_temp); - if (temperature->tempflag == 0) - error->all(FLERR, "Fix qbmsst compute ID {} does not compute temperature", id_temp); + } else { + if (temperature->tempflag == 0) + error->all(FLERR, "Fix qbmsst compute ID {} does not compute a temperature", id_temp); + } + pressure = modify->get_compute_by_id(id_press); - if (!pressure) error->all(FLERR, "Could not find fix qbmsst pressure compute ID {}", id_press); - if (pressure->pressflag == 0) - error->all(FLERR, "Fix qbmsst compute ID {} does not compute pressure", id_press); + if (!pressure) { + error->all(FLERR, "Could not find fix qbmsst pressure compute ID {}", id_press); + } else { + if (pressure->pressflag == 0) + error->all(FLERR, "Fix qbmsst compute ID {} does not compute pressure", id_press); + } + pe = modify->get_compute_by_id(id_pe); - if (!pe) error->all(FLERR, "Could not find fix qbmsst pe compute ID {}", id_pe); - if (pe->peflag == 0) - error->all(FLERR, "Fix qbmsst compute ID {} does not compute potential energy", id_pe); + if (!pe) { + error->all(FLERR, "Could not find fix qbmsst pe compute ID {}", id_pe); + } else { + if (pe->peflag == 0) + error->all(FLERR, "Fix qbmsst compute ID {} does not compute potential energy", id_pe); + } // initiate the counter l and \mu counter_l=0; diff --git a/src/REPLICA/fix_alchemy.cpp b/src/REPLICA/fix_alchemy.cpp index b14c6bc22d6..f3b79d0956d 100644 --- a/src/REPLICA/fix_alchemy.cpp +++ b/src/REPLICA/fix_alchemy.cpp @@ -178,10 +178,10 @@ void FixAlchemy::init() error->universe_all(FLERR, "Fix alchemy is not compatible with load balancing"); if (modify->get_fix_by_style("^alchemy").size() > 1) - error->universe_all(FLERR, "There may only one fix alchemy at a time"); + error->universe_all(FLERR, "There may only be one fix alchemy at a time"); if (utils::strmatch(update->integrate_style, "^respa")) - error->universe_all(FLERR, "Must not use run style respa with fix alchemy"); + error->universe_all(FLERR, "Must not use run_style respa with fix alchemy"); ivar = input->variable->find(id_lambda.c_str()); if (ivar < 0) @@ -190,6 +190,42 @@ void FixAlchemy::init() error->universe_one(FLERR, fmt::format("Fix alchemy variable {} is invalid style", id_lambda)); lambda = input->variable->compute_equal(ivar); + // update and check pointers to internal compute styles + + pe = modify->get_compute_by_id(id_pe); + if (!pe) { + error->universe_all( + FLERR, + fmt::format("Potential energy compute ID {} for fix {} does not exist", id_pe, style)); + } else { + if (pe->peflag == 0) + error->universe_all( + FLERR, + fmt::format("Compute ID {} for fix {} does not compute potential energy", id_pe, style)); + } + + temp = modify->get_compute_by_id(id_temp); + if (!temp) { + error->universe_all( + FLERR, fmt::format("Temperature compute ID {} for fix {} does not exist", id_temp, style)); + } else { + if (temp->tempflag == 0) + error->universe_all( + FLERR, + fmt::format("Compute ID {} for fix {} does not compute a temperature", id_temp, style)); + } + + press = modify->get_compute_by_id(id_press); + if (!press) { + error->universe_all( + FLERR, fmt::format("Pressure compute ID {} for fix {} does not exist", id_press, style)); + } else { + if (press->pressflag == 0) + error->universe_all( + FLERR, + fmt::format("Compute ID {} for fix {} does not compute pressure", id_press, style)); + } + // synchronize box dimensions, determine if resync during run will be needed. synchronize_box(domain, samerank); diff --git a/src/fix_nh_sphere.cpp b/src/fix_nh_sphere.cpp index 1835181606b..e46d11efccd 100644 --- a/src/fix_nh_sphere.cpp +++ b/src/fix_nh_sphere.cpp @@ -70,7 +70,7 @@ void FixNHSphere::init() for (int i = 0; i < nlocal; i++) if (mask[i] & groupbit) if (radius[i] == 0.0) - error->one(FLERR,"Fix nvt/npt/nph/sphere require extended particles"); + error->one(FLERR,"Fix {} requires extended particles", style); FixNH::init(); } diff --git a/src/fix_press_berendsen.cpp b/src/fix_press_berendsen.cpp index 44c7f579b46..99f7ac84758 100644 --- a/src/fix_press_berendsen.cpp +++ b/src/fix_press_berendsen.cpp @@ -259,8 +259,7 @@ void FixPressBerendsen::init() if (!dimflag) continue; if ((p_flag[0] && dimflag[0]) || (p_flag[1] && dimflag[1]) || (p_flag[2] && dimflag[2])) error->all(FLERR, - "Cannot use fix press/berendsen and " - "fix deform on same component of stress tensor"); + "Cannot use fix press/berendsen and fix deform on same component of stress tensor"); } // set temperature and pressure ptrs diff --git a/src/fix_press_langevin.cpp b/src/fix_press_langevin.cpp index f3c3412fbd1..47a6d71f439 100644 --- a/src/fix_press_langevin.cpp +++ b/src/fix_press_langevin.cpp @@ -422,9 +422,10 @@ void FixPressLangevin::init() pressure = modify->get_compute_by_id(id_press); if (!pressure) { - error->all(FLERR, "Pressure compute ID {} for fix press/langevin does not exist", id_press); + error->all(FLERR, "Pressure compute ID {} for fix {} does not exist", id_press, style); + } else { if (pressure->pressflag == 0) - error->all(FLERR,"Compute ID {} does not compute pressure", id_press); + error->all(FLERR,"Compute ID {} for fix {} does not compute pressure", id_press, style); } // Kspace setting From f71fa8e94e840841a317db51185bda843a3c7cae Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 27 Dec 2024 10:19:51 -0500 Subject: [PATCH 12/34] logo images for all 8 currently supported tutorials --- tools/lammps-gui/icons/tutorial1-logo.png | Bin 83287 -> 73922 bytes tools/lammps-gui/icons/tutorial2-logo.png | Bin 72878 -> 99307 bytes tools/lammps-gui/icons/tutorial3-logo.png | Bin 0 -> 60244 bytes tools/lammps-gui/icons/tutorial4-logo.png | Bin 0 -> 114918 bytes tools/lammps-gui/icons/tutorial5-logo.png | Bin 0 -> 85330 bytes tools/lammps-gui/icons/tutorial6-logo.png | Bin 0 -> 92952 bytes tools/lammps-gui/icons/tutorial7-logo.png | Bin 0 -> 80755 bytes tools/lammps-gui/icons/tutorial8-logo.png | Bin 0 -> 138005 bytes tools/lammps-gui/lammpsgui.qrc | 6 ++++++ 9 files changed, 6 insertions(+) create mode 100644 tools/lammps-gui/icons/tutorial3-logo.png create mode 100644 tools/lammps-gui/icons/tutorial4-logo.png create mode 100644 tools/lammps-gui/icons/tutorial5-logo.png create mode 100644 tools/lammps-gui/icons/tutorial6-logo.png create mode 100644 tools/lammps-gui/icons/tutorial7-logo.png create mode 100644 tools/lammps-gui/icons/tutorial8-logo.png diff --git a/tools/lammps-gui/icons/tutorial1-logo.png b/tools/lammps-gui/icons/tutorial1-logo.png index d54cda91134082a2846cfe89bb18802286b5a726..912c1189af80a74db4f0880002b2cdc3ee18c933 100644 GIT binary patch delta 71122 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