Merge pull request #4515 from akohlmey/collected-small-fixes

Collected small fixes and updates
This commit is contained in:
Axel Kohlmeyer
2025-04-01 21:16:16 -04:00
committed by GitHub
42 changed files with 397 additions and 210 deletions

View File

@ -112,6 +112,8 @@ html: xmlgen globbed-tocs $(VENV) $(SPHINXCONFIG)/conf.py $(ANCHORCHECK) $(MATHJ
env LC_ALL=C grep -n ':\(ref\|doc\):[^`]' $(RSTDIR)/*.rst ;\ env LC_ALL=C grep -n ':\(ref\|doc\):[^`]' $(RSTDIR)/*.rst ;\
env LC_ALL=C grep -n '\(ref\|doc\)`[^`]' $(RSTDIR)/*.rst ;\ env LC_ALL=C grep -n '\(ref\|doc\)`[^`]' $(RSTDIR)/*.rst ;\
$(PYTHON) $(BUILDDIR)/utils/check-styles.py -s ../src -d src ;\ $(PYTHON) $(BUILDDIR)/utils/check-styles.py -s ../src -d src ;\
env LC_ALL=C grep -n -E '^ *\.\. [a-z0-9]+:(\s+.*|)$$' \
$(RSTDIR)/*.rst ../src/*.{cpp,h} ../src/*/*.{cpp,h} ;\
echo "############################################" ;\ echo "############################################" ;\
deactivate ;\ deactivate ;\
) )
@ -193,6 +195,8 @@ pdf: xmlgen globbed-tocs $(VENV) $(SPHINXCONFIG)/conf.py $(ANCHORCHECK)
env LC_ALL=C grep -n ':\(ref\|doc\):[^`]' $(RSTDIR)/*.rst ;\ env LC_ALL=C grep -n ':\(ref\|doc\):[^`]' $(RSTDIR)/*.rst ;\
env LC_ALL=C grep -n '\(ref\|doc\)`[^`]' $(RSTDIR)/*.rst ;\ env LC_ALL=C grep -n '\(ref\|doc\)`[^`]' $(RSTDIR)/*.rst ;\
$(PYTHON) utils/check-styles.py -s ../src -d src ;\ $(PYTHON) utils/check-styles.py -s ../src -d src ;\
env LC_ALL=C grep -n -E '^ *\.\. [a-z0-9]+:(\s+.*|)$$' \
$(RSTDIR)/*.rst ../src/*.{cpp,h} ../src/*/*.{cpp,h} ;\
echo "############################################" ;\ echo "############################################" ;\
deactivate ;\ deactivate ;\
) )
@ -242,6 +246,8 @@ role_check :
@( env LC_ALL=C grep -n ' `[^`]\+<[a-z][^`]\+`[^_]' $(RSTDIR)/*.rst && exit 1 || : ) @( env LC_ALL=C grep -n ' `[^`]\+<[a-z][^`]\+`[^_]' $(RSTDIR)/*.rst && exit 1 || : )
@( env LC_ALL=C grep -n ':\(ref\|doc\):[^`]' $(RSTDIR)/*.rst && exit 1 || : ) @( env LC_ALL=C grep -n ':\(ref\|doc\):[^`]' $(RSTDIR)/*.rst && exit 1 || : )
@( env LC_ALL=C grep -n '\(ref\|doc\)`[^`]' $(RSTDIR)/*.rst && exit 1 || : ) @( env LC_ALL=C grep -n '\(ref\|doc\)`[^`]' $(RSTDIR)/*.rst && exit 1 || : )
@( env LC_ALL=C grep -n -E '^ *\.\. [a-z0-9]+:(\s+.*|)$$' \
$(RSTDIR)/*.rst ../src/*.{cpp,h} ../src/*/*.{cpp,h} && exit 1 || : )
link_check : $(VENV) html link_check : $(VENV) html
@(\ @(\

View File

@ -1,7 +1,7 @@
Removed commands and packages Removed commands and packages
============================= =============================
.. contents:: .. contents:: \
------ ------
@ -171,7 +171,7 @@ and the :ref:`GPU package <PKG-GPU>` are maintained
and allow running LAMMPS with GPU acceleration. and allow running LAMMPS with GPU acceleration.
Compute atom/molecule Compute atom/molecule
_____________________ ---------------------
.. deprecated:: 11 Dec2015 .. deprecated:: 11 Dec2015

View File

@ -1,4 +1,3 @@
Internal Styles Internal Styles
--------------- ---------------
@ -44,6 +43,14 @@ and packages <Commands_removed>` with additional explanations.
Internal fix styles Internal fix styles
^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^
These provide an implementation of features that would otherwise have
been replicated across multiple styles. The used fix ID is generally
derived from the compute or fix ID creating the fix with some string
appended. When needed, the fix can be looked up with
``Modify::get_fix_by_id()``, which returns a pointer to the fix
instance. The data managed by the fix can be accessed just as for other
fixes that can be used in input files.
fix DUMMY fix DUMMY
""""""""" """""""""
@ -52,7 +59,7 @@ been created since they access data that is only available then.
However, in some cases it is required that a fix must be at or close to However, in some cases it is required that a fix must be at or close to
the top of the list of all fixes. In those cases an instance of the the top of the list of all fixes. In those cases an instance of the
DUMMY fix style may be created by calling ``Modify::add_fix()`` and then DUMMY fix style may be created by calling ``Modify::add_fix()`` and then
later replaced by calling ``Modify::replace_fix()``. later replaced by the intended fix through calling ``Modify::replace_fix()``.
fix STORE/ATOM fix STORE/ATOM
"""""""""""""" """"""""""""""

View File

@ -7,7 +7,7 @@ typically document what a variable stores, what a small section of
code does, or what a function does and its input/outputs. The topics code does, or what a function does and its input/outputs. The topics
on this page are intended to document code functionality at a higher level. on this page are intended to document code functionality at a higher level.
.. contents:: .. contents:: Available notes
---- ----

View File

@ -10,7 +10,9 @@ then for specific errors. In the latter cases, LAMMPS will output a
short message and then provide a URL that links to a specific section on short message and then provide a URL that links to a specific section on
this page. this page.
.. contents:: -------
.. contents:: Individual paragraphs
------ ------
@ -951,3 +953,32 @@ created (for instance defining the :doc:`atom style <atom_style>`,
simulation box has been created. See the paragraph on :ref:`errors simulation box has been created. See the paragraph on :ref:`errors
before or after the simulation box is created <hint12>` for additional before or after the simulation box is created <hint12>` for additional
information. information.
.. _err0035:
Error messages ending in 'Please contact the LAMMPS developers'
---------------------------------------------------------------
Such error messages indicate that something unexpected has happened and
that it will require a good understanding of the details of the design
of LAMMPS to resolve this. This can be due to some bug in contributed
code, and oversight when updating functionality, a feature that is
scheduled to be removed or reaching a combination of flags and settings
that should not be possible or similar.
Even if you find a way to work around this error or warning, you should
contact the LAMMPS developers and prepare a minimal set of inputs that
can be used to reproduce this error or warning. By providing the input,
the LAMMPS developers can then assess whether additional action is
needed and who else to contact about this, if needed.
There are multiple ways to get into contact and report your issue. In
order of preference there are:
- Submit a bug report `issue in the LAMMPS GitHub
<https://github.com/lammps/lammps/issues>` repository
- Post a message in the "LAMMPS Development" forum in the
`MatSci Community Discourse <https://matsci.org/c/lammps/lammps-development/42>`_
- Send an email to ``developers@lammps.org``
- Send an email to an :doc:`individual LAMMPS developer <Intro_authors>`
that you know and trust

View File

@ -277,7 +277,7 @@ This ``Butane`` object is a molecule which can be used anywhere other molecules
can be used. (You can arrange ``Butane`` molecules on a lattice, as we did previously. can be used. (You can arrange ``Butane`` molecules on a lattice, as we did previously.
You can also modify individual butane molecules by adding or deleting atoms or bonds. You can also modify individual butane molecules by adding or deleting atoms or bonds.
You can add bonds between specific butane molecules or use ``Butane`` as a You can add bonds between specific butane molecules or use ``Butane`` as a
subunit to define even larger molecules. See the moltemplate manual for details.) sub-unit to define even larger molecules. See the moltemplate manual for details.)

View File

@ -20,13 +20,21 @@ acceleration.
.. _lws: https://www.lammps.org .. _lws: https://www.lammps.org
.. _omp: https://www.openmp.org .. _omp: https://www.openmp.org
LAMMPS is written in C++ and requires a compiler that is at least LAMMPS is written in C++ and currently requires a compiler that is at
compatible with the C++-11 standard. Earlier versions were written in least compatible with the C++-11 standard. Earlier versions were
F77, F90, and C++-98. See the `History page written in F77, F90, and C++-98. See the `History page
<https://www.lammps.org/history.html>`_ of the website for details. All <https://www.lammps.org/history.html>`_ of the website for details. All
versions can be downloaded as source code from the `LAMMPS website versions can be downloaded as source code from the `LAMMPS website
<lws_>`_. <lws_>`_.
Through a :ref:`C language API <lammps_c_api>` LAMMPS functionality can
be accessed and managed from other programming languages rather than
running the LAMMPS executable. Ready to use modules for :ref:`Python
<lammps_python_api>` and :ref:`Fortran <lammps_fortran_api>` exist, and
an example :ref:`SWIG interface file <swig>` as well as example C files
for dynamically loading LAMMPS as a shared library into other
executables are provided.
LAMMPS is designed to be easy to modify or extend with new capabilities, LAMMPS is designed to be easy to modify or extend with new capabilities,
such as new force fields, atom types, boundary conditions, or such as new force fields, atom types, boundary conditions, or
diagnostics. See the :doc:`Modify` section of for more details. diagnostics. See the :doc:`Modify` section of for more details.

View File

@ -2,9 +2,15 @@ What does a LAMMPS version mean
------------------------------- -------------------------------
The LAMMPS "version" is the date when it was released, such as 1 May The LAMMPS "version" is the date when it was released, such as 1 May
2014. LAMMPS is updated continuously, and we aim to keep it working 2014. LAMMPS is updated continuously, and with the help of extensive
correctly and reliably at all times. Also, several variants of static automated testing (mostly applied *before* changes are included) we aim
code analysis are run regularly to maintain or improve the overall code to keep it working correctly and reliably at all times, but there also
are regular *feature releases* with new and expanded functionality, and
there are designated *stable releases* that receive updates with bug
fixes back-ported from the development branch.
In addition to automated testing, several variants of static code
analysis are run regularly to maintain or improve the overall code
quality, consistency, and compliance with programming standards, best quality, consistency, and compliance with programming standards, best
practices and style conventions. You can follow its development in a practices and style conventions. You can follow its development in a
public `git repository on GitHub <https://github.com/lammps/lammps>`_. public `git repository on GitHub <https://github.com/lammps/lammps>`_.
@ -19,17 +25,18 @@ Identifying the Version
The version date is printed to the screen and log file every time you The version date is printed to the screen and log file every time you
run LAMMPS. There also is an indication, if a LAMMPS binary was run LAMMPS. There also is an indication, if a LAMMPS binary was
compiled from version with modifications **after** a release. compiled from version with modifications **after** a release, either
It is also visible in the file src/version.h and in the LAMMPS directory from the development version or the maintenance version of the last
name created when you unpack a downloaded tarball. And it is on the stable release. It is also visible in the file src/version.h and in the
first page of the :doc:`manual <Manual>`. LAMMPS directory name created when you unpack a downloaded tarball. And
it is on the first page of the :doc:`manual <Manual>`.
* If you browse the HTML pages of the online version of the LAMMPS * If you browse the HTML pages of the online version of the LAMMPS
manual, they will by default describe the most current feature release manual, they will by default describe the most current feature release
version of LAMMPS. In the navigation bar on the bottom left, there is version of LAMMPS. In the navigation bar on the bottom left, there is
the option to view instead the documentation for the most recent the option to view instead the documentation for the most recent
*stable* version or the documentation corresponding to the state of *stable* version or the documentation corresponding to the state of
the development branch. the development branch *develop*.
* If you browse the HTML pages included in your downloaded tarball, they * If you browse the HTML pages included in your downloaded tarball, they
describe the version you have, which may be older than the online describe the version you have, which may be older than the online
version. version.
@ -48,8 +55,9 @@ Development
Modifications of the LAMMPS source code (like bug fixes, code Modifications of the LAMMPS source code (like bug fixes, code
refactoring, updates to existing features, or addition of new features) refactoring, updates to existing features, or addition of new features)
are organized into pull requests. Pull requests will be merged into the are organized into pull requests. Pull requests will be merged into the
*develop* branch of the git repository after they pass automated testing *develop* branch of the LAMMPS git repository on GitHub after they pass
and code review by the LAMMPS developers. automated testing and code review by :doc:`core LAMMPS developers
<Intro_authors>`.
Feature Releases Feature Releases
"""""""""""""""" """"""""""""""""
@ -62,8 +70,7 @@ repository is updated with every such *feature release* and a tag in the
format ``patch_1May2014`` is added. A summary of the most important format ``patch_1May2014`` is added. A summary of the most important
changes of these releases for the current year are posted on `this changes of these releases for the current year are posted on `this
website page <https://www.lammps.org/bug.html>`_. More detailed release website page <https://www.lammps.org/bug.html>`_. More detailed release
notes are `available on GitHub notes are `available on GitHub <https://github.com/lammps/lammps/releases/>`_.
<https://github.com/lammps/lammps/releases/>`_.
Stable Releases Stable Releases
""""""""""""""" """""""""""""""
@ -71,18 +78,18 @@ Stable Releases
About once a year, we release a *stable release* version of LAMMPS. About once a year, we release a *stable release* version of LAMMPS.
This is done after a "stabilization period" where we apply only bug This is done after a "stabilization period" where we apply only bug
fixes and small, non-intrusive changes to the *develop* branch but no fixes and small, non-intrusive changes to the *develop* branch but no
new features. At the same time, the code is subjected to more detailed new features to the core code. At the same time, the code is subjected
and thorough manual testing than the default automated testing. to more detailed and thorough manual testing than the default automated
After such a *stable release*, both the *release* and the *stable* testing. After such a *stable release*, both the *release* and the
branches are updated and two tags are applied, a ``patch_1May2014`` format *stable* branches are updated and two tags are applied, a
and a ``stable_1May2014`` format tag. ``patch_1May2014`` format and a ``stable_1May2014`` format tag.
Stable Release Updates Stable Release Updates
"""""""""""""""""""""" """"""""""""""""""""""
Between *stable releases*, we collect bug fixes and updates back-ported Between *stable releases*, we collect bug fixes and updates that are
from the *develop* branch in a branch called *maintenance*. From the back-ported from the *develop* branch in a branch called *maintenance*.
*maintenance* branch we make occasional *stable update releases* and From the *maintenance* branch we make occasional *stable update
update the *stable* branch accordingly. The first update to the releases* and update the *stable* branch accordingly. The first update
``stable_1May2014`` release would be tagged as to the ``stable_1May2014`` release would be tagged as
``stable_1May2014_update1``. These updates contain no new features. ``stable_1May2014_update1``. These updates contain no new features.

View File

@ -19,7 +19,7 @@ Syntax
* lr_decision_file = file name of file containing the scaling matrix for logistic regression classification * lr_decision_file = file name of file containing the scaling matrix for logistic regression classification
* lr_bias_file = file name of file containing the bias vector for logistic regression classification * lr_bias_file = file name of file containing the bias vector for logistic regression classification
* maha_file = file name of file containing for each crystal structure: the Mahalanobis distance threshold for sanity check purposes, the average reduced descriptor and the inverse of the corresponding covariance matrix * maha_file = file name of file containing for each crystal structure: the Mahalanobis distance threshold for sanity check purposes, the average reduced descriptor and the inverse of the corresponding covariance matrix
* c_ID[*] = compute ID of previously required *compute sna/atom* command * c_ID[1] = compute ID and output data column of previously defined *compute sna/atom* command
Examples Examples
"""""""" """"""""
@ -27,7 +27,7 @@ Examples
.. code-block:: LAMMPS .. code-block:: LAMMPS
compute b1 all sna/atom 9.0 0.99363 8 0.5 1.0 rmin0 0.0 nnn 24 wmode 1 delta 0.3 compute b1 all sna/atom 9.0 0.99363 8 0.5 1.0 rmin0 0.0 nnn 24 wmode 1 delta 0.3
compute b2 all slcsa/atom 8 4 mean_descriptors.dat lda_scalings.dat lr_decision.dat lr_bias.dat maha_thresholds.dat c_b1[*] compute b2 all slcsa/atom 8 4 mean_descriptors.dat lda_scalings.dat lr_decision.dat lr_bias.dat maha_thresholds.dat c_b1[1]
Description Description
""""""""""" """""""""""

View File

@ -222,6 +222,8 @@ formulas for the meaning of these parameters:
+------------------------------------------------------------------------------+--------------------------------------------------+-------------+ +------------------------------------------------------------------------------+--------------------------------------------------+-------------+
| :doc:`pace, pace/extrapolation <pair_pace>` | scale | type pairs | | :doc:`pace, pace/extrapolation <pair_pace>` | scale | type pairs |
+------------------------------------------------------------------------------+--------------------------------------------------+-------------+ +------------------------------------------------------------------------------+--------------------------------------------------+-------------+
| :doc:`pedone <pair_pedone>` | c0,d0,r0,alpha | type pairs |
+------------------------------------------------------------------------------+--------------------------------------------------+-------------+
| :doc:`quip <pair_quip>` | scale | type global | | :doc:`quip <pair_quip>` | scale | type global |
+------------------------------------------------------------------------------+--------------------------------------------------+-------------+ +------------------------------------------------------------------------------+--------------------------------------------------+-------------+
| :doc:`snap <pair_snap>` | scale | type pairs | | :doc:`snap <pair_snap>` | scale | type pairs |

View File

@ -12,7 +12,7 @@ Syntax
* fix-ID = ID of the fix to modify * fix-ID = ID of the fix to modify
* one or more keyword/value pairs may be appended * one or more keyword/value pairs may be appended
* keyword = *bodyforces* or *colname* or *dynamic/dof* or *energy* or *press* or *respa* or *temp* or *virial* * keyword = *bodyforces* or *colname* or *dynamic/dof* or *energy* or *pad* or *press* or *respa* or *temp* or *virial*
.. parsed-literal:: .. parsed-literal::
@ -25,6 +25,7 @@ Syntax
*dynamic/dof* value = *yes* or *no* *dynamic/dof* value = *yes* or *no*
yes/no = do or do not re-compute the number of degrees of freedom (DOF) contributing to the temperature yes/no = do or do not re-compute the number of degrees of freedom (DOF) contributing to the temperature
*energy* value = *yes* or *no* *energy* value = *yes* or *no*
*pad* arg = Nchar = # of characters to convert timestep to
*press* value = compute ID that calculates a pressure *press* value = compute ID that calculates a pressure
*respa* value = *1* to *max respa level* or *0* (for outermost level) *respa* value = *1* to *max respa level* or *0* (for outermost level)
*temp* value = compute ID that calculates a temperature *temp* value = compute ID that calculates a temperature
@ -184,6 +185,18 @@ replaces the string for that specific keyword. The *colname* keyword can
be used multiple times. If multiple *colname* settings refer to the same be used multiple times. If multiple *colname* settings refer to the same
keyword, the last setting has precedence. keyword, the last setting has precedence.
.. versionadded:: TBD
The *pad* keyword only applies when a fix produces a file and the output
filename is specified with a wildcard "\*" character which becomes the
timestep. If *pad* is 0, which is the default, the timestep is
converted into a string of unpadded length (e.g., 100 or 12000 or
2000000). When *pad* is specified with *Nchar* :math:`>` 0, the string
is padded with leading zeroes so they are all the same length = *Nchar*\
. For example, pad 7 would yield 0000100, 0012000, 2000000. This can
be useful so that post-processing programs can easily read the files in
ascending timestep order. Please see the documentation of the individual
fix styles if this keyword is supported.
Restrictions Restrictions
"""""""""""" """"""""""""

View File

@ -56,16 +56,28 @@ If the filename ends with ".gz", the output file is written in gzipped
format. A gzipped dump file will be about 3x smaller than the text format. A gzipped dump file will be about 3x smaller than the text
version, but will also take longer to write. version, but will also take longer to write.
.. versionadded:: TBD
If the filename contains the wildcard character "\*", a new file is
created on every timestep there bond information is written. The "\*"
character is replaced with the timestep value. Note that the
:doc:`fix_modify pad <fix_modify>` command can be used so that all
timestep numbers have the same length by adding leading zeroes
(e.g. 00010 for a pad value of 5). The default pad value is 0, i.e. no
leading zeroes.
---------- ----------
Restart, fix_modify, output, run start/stop, minimize info Restart, fix_modify, output, run start/stop, minimize info
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" """""""""""""""""""""""""""""""""""""""""""""""""""""""""""
No information about this fix is written to :doc:`binary restart files <restart>`. None of the :doc:`fix_modify <fix_modify>` options No information about this fix is written to :doc:`binary restart files
are relevant to this fix. No global or per-atom quantities are stored <restart>`. This fix supports the :doc:`fix_modify pad <fix_modify>`
by this fix for access by various :doc:`output commands <Howto_output>`. option. No global or per-atom quantities are stored by this fix for
No parameter of this fix can be used with the *start/stop* keywords of access by various :doc:`output commands <Howto_output>`. No parameter
the :doc:`run <run>` command. This fix is not invoked during :doc:`energy minimization <minimize>`. of this fix can be used with the *start/stop* keywords of the :doc:`run
<run>` command. This fix is not invoked during :doc:`energy
minimization <minimize>`.
---------- ----------
@ -76,10 +88,10 @@ the :doc:`run <run>` command. This fix is not invoked during :doc:`energy minim
Restrictions Restrictions
"""""""""""" """"""""""""
The fix reaxff/bonds command requires that the :doc:`pair_style reaxff <pair_reaxff>` is invoked. This fix is part of the The fix reaxff/bonds command requires that the :doc:`pair_style reaxff
REAXFF package. It is only enabled if LAMMPS was built with that <pair_reaxff>` is invoked. This fix is part of the REAXFF package. It
package. See the :doc:`Build package <Build_package>` page for more is only enabled if LAMMPS was built with that package. See the
info. :doc:`Build package <Build_package>` page for more info.
To write gzipped bond files, you must compile LAMMPS with the To write gzipped bond files, you must compile LAMMPS with the
-DLAMMPS_GZIP option. -DLAMMPS_GZIP option.
@ -92,4 +104,4 @@ Related commands
Default Default
""""""" """""""
none pad = 0

View File

@ -129,7 +129,7 @@
<div class="wy-grid-for-nav"> <div class="wy-grid-for-nav">
{#- SIDE NAV, TOGGLES ON MOBILE #} {#- SIDE NAV, TOGGLES ON MOBILE #}
<nav data-toggle="wy-nav-shift" class="wy-nav-side"> <nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll"> <div class="wy-side-scroll" id="lammps-navbar">
<div class="wy-side-nav-search" {% if theme_style_nav_header_background %} style="background: {{theme_style_nav_header_background}}" {% endif %}> <div class="wy-side-nav-search" {% if theme_style_nav_header_background %} style="background: {{theme_style_nav_header_background}}" {% endif %}>
{%- block sidebartitle %} {%- block sidebartitle %}
@ -173,15 +173,15 @@
</div> </div>
{%- endblock %} {%- endblock %}
</div> </div>
<!-- <div style="padding: 4px;">
<center>
<a href="#sidebar-top-target"><img src="_static/up.png" alt="(Up)"/> Go to top</a>
</center>
</div>
-->
<div style="position: fixed; bottom: 0px; width: 300px; height: 64px; padding: 4px; background-color: #272525; text-align: center"> <div style="position: fixed; bottom: 0px; width: 300px; height: 64px; padding: 4px; background-color: #272525; text-align: center">
<a href="#sidebar-top-target" class="fa fa-caret-up" style="color: white"> Go to top</a> <button onclick="JumpToTop()" class="fa fa-caret-up" style="color:white; background-color: #272525; border-style: none;" title="Go to top">&nbsp;Go to top</button>
</div> </div>
<script>
let navbar = document.getElementById("lammps-navbar");
function JumpToTop() {
navbar.scrollTop = 0;
}
</script>
</nav> </nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"> <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">

View File

@ -103,13 +103,7 @@ ComputeSLCSAAtom::ComputeSLCSAAtom(LAMMPS *lmp, int narg, char **arg) :
utils::logmesg(lmp, mesg); utils::logmesg(lmp, mesg);
} }
int expand = 0; ArgInfo argi(arg[10]);
char **earg;
int nvalues = utils::expand_args(FLERR, narg - 10, &arg[10], 1, earg, lmp);
if (earg != &arg[10]) expand = 1;
arg = earg;
ArgInfo argi(arg[0]);
value_t val; value_t val;
val.id = ""; val.id = "";
val.val.c = nullptr; val.val.c = nullptr;
@ -121,13 +115,6 @@ ComputeSLCSAAtom::ComputeSLCSAAtom(LAMMPS *lmp, int narg, char **arg) :
(val.which == ArgInfo::UNKNOWN) || (val.which == ArgInfo::NONE) || (argi.get_dim() > 1)) (val.which == ArgInfo::UNKNOWN) || (val.which == ArgInfo::NONE) || (argi.get_dim() > 1))
error->all(FLERR, 10, "Invalid compute slcsa/atom argument: {}", arg[0]); error->all(FLERR, 10, "Invalid compute slcsa/atom argument: {}", arg[0]);
// if wildcard expansion occurred, free earg memory from expand_args()
if (expand) {
for (int i = 0; i < nvalues; i++) delete[] earg[i];
memory->sfree(earg);
}
val.val.c = modify->get_compute_by_id(val.id); val.val.c = modify->get_compute_by_id(val.id);
if (!val.val.c) error->all(FLERR, 10, "Compute ID {} for fix slcsa/atom does not exist", val.id); if (!val.val.c) error->all(FLERR, 10, "Compute ID {} for fix slcsa/atom does not exist", val.id);
if (val.val.c->peratom_flag == 0) if (val.val.c->peratom_flag == 0)

View File

@ -321,6 +321,7 @@ FixAveCorrelateLong::FixAveCorrelateLong(LAMMPS *lmp, int narg, char **arg) :
if (expand) { if (expand) {
for (int i = 0; i < nargnew; i++) delete[] earg[i]; for (int i = 0; i < nargnew; i++) delete[] earg[i];
memory->sfree(earg); memory->sfree(earg);
memory->sfree(amap);
} }
// allocate and initialize memory for calculated values and correlators // allocate and initialize memory for calculated values and correlators

View File

@ -188,10 +188,8 @@ void ComputeMLIAP::init()
// allocate memory for global array // allocate memory for global array
memory->create(mliaparray,size_array_rows,size_array_cols, memory->create(mliaparray,size_array_rows,size_array_cols, "compute_mliap:mliaparray");
"compute_mliap:mliaparray"); memory->create(mliaparrayall,size_array_rows,size_array_cols, "compute_mliap:mliaparrayall");
memory->create(mliaparrayall,size_array_rows,size_array_cols,
"compute_mliap:mliaparrayall");
array = mliaparrayall; array = mliaparrayall;
// find compute for reference energy // find compute for reference energy

View File

@ -1,13 +1,7 @@
# LAMMPS multiple-machine -*- Makefile -*- # LAMMPS multiple-machine -*- Makefile -*-
SHELL = /bin/bash SHELL = /bin/bash
PYTHON = python PYTHON = $(word 3,$(shell type python3))
PYTHON_VERSION=$(word 2,$(shell $(PYTHON) -V 2>&1 | tr '.' ' '))
ifeq ($(PYTHON_VERSION),2)
PYTHON_CHECK=@echo LAMMPS requires Python 3. Try: 'make PYTHON=python3 ...' ; exit 1
else
PYTHON_CHECK=@echo
endif
DYN_LIB = -ldl DYN_LIB = -ldl
#.IGNORE: #.IGNORE:
@ -282,7 +276,6 @@ LIBDIR = $(@:lib-%=%)
# List of all targets # List of all targets
help: help:
$(PYTHON_CHECK)
@echo 'make clean-all delete all object files' @echo 'make clean-all delete all object files'
@echo 'make clean-machine delete object files for one machine' @echo 'make clean-machine delete object files for one machine'
@echo 'make mpi-stubs build dummy MPI library in STUBS' @echo 'make mpi-stubs build dummy MPI library in STUBS'
@ -384,7 +377,6 @@ gitversion:
# shared = shared compile in Obj_shared_machine # shared = shared compile in Obj_shared_machine
.DEFAULT: .DEFAULT:
$(PYTHON_CHECK)
@if [ $@ = "serial" ]; \ @if [ $@ = "serial" ]; \
then cd STUBS; $(MAKE); cd ..; fi then cd STUBS; $(MAKE); cd ..; fi
@test -f MAKE/Makefile.$@ -o -f MAKE/OPTIONS/Makefile.$@ -o \ @test -f MAKE/Makefile.$@ -o -f MAKE/OPTIONS/Makefile.$@ -o \
@ -472,7 +464,6 @@ mpi-stubs:
sinclude ../lib/python/Makefile.lammps sinclude ../lib/python/Makefile.lammps
install-python: install-python:
$(PYTHON_CHECK)
@rm -rf ../python/build @rm -rf ../python/build
@$(PYTHON) ../python/install.py -p ../python/lammps -l ../src/liblammps.so -w $(PWD) -v $(PWD)/version.h @$(PYTHON) ../python/install.py -p ../python/lammps -l ../src/liblammps.so -w $(PWD) -v $(PWD)/version.h
@ -491,51 +482,39 @@ tar:
check: check-whitespace check-permissions check-homepage check-errordocs check-fmtlib check-docs check-version check: check-whitespace check-permissions check-homepage check-errordocs check-fmtlib check-docs check-version
check-whitespace: check-whitespace:
$(PYTHON_CHECK)
$(PYTHON) ../tools/coding_standard/whitespace.py .. $(PYTHON) ../tools/coding_standard/whitespace.py ..
fix-whitespace: fix-whitespace:
$(PYTHON_CHECK)
$(PYTHON) ../tools/coding_standard/whitespace.py .. -f $(PYTHON) ../tools/coding_standard/whitespace.py .. -f
check-permissions: check-permissions:
$(PYTHON_CHECK)
$(PYTHON) ../tools/coding_standard/permissions.py .. $(PYTHON) ../tools/coding_standard/permissions.py ..
fix-permissions: fix-permissions:
$(PYTHON_CHECK)
$(PYTHON) ../tools/coding_standard/permissions.py .. -f $(PYTHON) ../tools/coding_standard/permissions.py .. -f
check-homepage: check-homepage:
$(PYTHON_CHECK)
$(PYTHON) ../tools/coding_standard/homepage.py .. $(PYTHON) ../tools/coding_standard/homepage.py ..
fix-homepage: fix-homepage:
$(PYTHON_CHECK)
$(PYTHON) ../tools/coding_standard/homepage.py .. -f $(PYTHON) ../tools/coding_standard/homepage.py .. -f
check-errordocs: check-errordocs:
$(PYTHON_CHECK)
$(PYTHON) ../tools/coding_standard/errordocs.py .. $(PYTHON) ../tools/coding_standard/errordocs.py ..
fix-errordocs: fix-errordocs:
$(PYTHON_CHECK)
$(PYTHON) ../tools/coding_standard/errordocs.py .. -f $(PYTHON) ../tools/coding_standard/errordocs.py .. -f
check-fmtlib: check-fmtlib:
$(PYTHON_CHECK)
$(PYTHON) ../tools/coding_standard/fmtlib.py .. $(PYTHON) ../tools/coding_standard/fmtlib.py ..
fix-fmtlib: fix-fmtlib:
$(PYTHON_CHECK)
$(PYTHON) ../tools/coding_standard/fmtlib.py .. -f $(PYTHON) ../tools/coding_standard/fmtlib.py .. -f
check-docs: check-docs:
$(PYTHON_CHECK)
$(MAKE) $(MFLAGS) -C ../doc anchor_check style_check package_check role_check $(MAKE) $(MFLAGS) -C ../doc anchor_check style_check package_check role_check
check-version: check-version:
$(PYTHON_CHECK)
$(PYTHON) ../tools/coding_standard/versiontags.py .. || echo $(PYTHON) ../tools/coding_standard/versiontags.py .. || echo
format-src: format-src:

View File

@ -19,6 +19,7 @@
#include "fix_reaxff_bonds.h" #include "fix_reaxff_bonds.h"
#include "atom.h" #include "atom.h"
#include "comm.h"
#include "error.h" #include "error.h"
#include "force.h" #include "force.h"
#include "memory.h" #include "memory.h"
@ -35,38 +36,27 @@ using namespace ReaxFF;
/* ---------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- */
FixReaxFFBonds::FixReaxFFBonds(LAMMPS *lmp, int narg, char **arg) : FixReaxFFBonds::FixReaxFFBonds(LAMMPS *lmp, int narg, char **arg) :
Fix(lmp, narg, arg) Fix(lmp, narg, arg), neighid(nullptr), abo(nullptr), fp(nullptr), lists(nullptr),
reaxff(nullptr), list(nullptr)
{ {
if (narg != 5) error->all(FLERR,"Illegal fix reaxff/bonds command"); if (narg != 5)
error->all(FLERR, Error::NOPOINTER, "Fix reaxff/bonds expected 5 arguments but got {}", narg);
MPI_Comm_rank(world,&me);
MPI_Comm_size(world,&nprocs);
ntypes = atom->ntypes;
nmax = atom->nmax; nmax = atom->nmax;
compressed = 0; compressed = 0;
multifile = 0;
padflag = 0;
first_flag = true; first_flag = true;
nevery = utils::inumeric(FLERR,arg[3],false,lmp); nevery = utils::inumeric(FLERR,arg[3],false,lmp);
if (nevery <= 0) error->all(FLERR, 3, "Illegal fix reaxff/bonds nevery value {}", nevery);
if (nevery <= 0) error->all(FLERR,"Illegal fix reaxff/bonds command"); filename = arg[4];
if (filename.rfind('*') != std::string::npos) multifile = 1;
if (me == 0) { if (platform::has_compress_extension(filename)) compressed = 1;
if (platform::has_compress_extension(arg[4])) {
compressed = 1;
fp = platform::compressed_write(arg[4]);
if (!fp) error->one(FLERR,"Cannot open compressed file");
} else fp = fopen(arg[4],"w");
if (!fp) error->one(FLERR,"Cannot open fix reaxff/bonds file {}: {}",
arg[4],utils::getsyserror());
}
if (atom->tag_consecutive() == 0) if (atom->tag_consecutive() == 0)
error->all(FLERR,"Atom IDs must be consecutive for fix reaxff bonds"); error->all(FLERR, Error::NOLASTLINE, "Fix reaxff/bonds requires consecutive atom-IDs");
abo = nullptr;
neighid = nullptr;
numneigh = nullptr;
allocate(); allocate();
} }
@ -75,11 +65,9 @@ FixReaxFFBonds::FixReaxFFBonds(LAMMPS *lmp, int narg, char **arg) :
FixReaxFFBonds::~FixReaxFFBonds() FixReaxFFBonds::~FixReaxFFBonds()
{ {
MPI_Comm_rank(world,&me);
destroy(); destroy();
if (me == 0) fclose(fp); if (fp) fclose(fp);
} }
/* ---------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- */
@ -115,7 +103,6 @@ void FixReaxFFBonds::init()
void FixReaxFFBonds::end_of_step() void FixReaxFFBonds::end_of_step()
{ {
Output_ReaxFF_Bonds(); Output_ReaxFF_Bonds();
if (me == 0) fflush(fp);
} }
/* ---------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- */
@ -252,7 +239,24 @@ void FixReaxFFBonds::RecvBuffer(double *buf, int nbuf, int nbuf_local,
double cutof3 = reaxff->api->control->bg_cut; double cutof3 = reaxff->api->control->bg_cut;
MPI_Request irequest, irequest2; MPI_Request irequest, irequest2;
if (me == 0) { if (comm->me == 0) {
std::string myfile = filename;
if (multifile) myfile = utils::star_subst(myfile, update->ntimestep, padflag);
if (multifile && fp) {
fclose(fp);
fp = nullptr;
}
if (!fp) {
if (compressed) {
fp = platform::compressed_write(myfile);
} else {
fp = fopen(myfile.c_str(), "w");
}
if (!fp)
error->one(FLERR, Error::NOLASTLINE,
"Cannot open fix reaxff/bonds file {}: {}", myfile, utils::getsyserror());
}
utils::print(fp,"# Timestep {}\n#\n",ntimestep); utils::print(fp,"# Timestep {}\n#\n",ntimestep);
utils::print(fp,"# Number of particles {}\n#\n",natoms); utils::print(fp,"# Number of particles {}\n#\n",natoms);
utils::print(fp,"# Max number of bonds per atom {} with coarse bond order cutoff {:5.3f}\n", utils::print(fp,"# Max number of bonds per atom {} with coarse bond order cutoff {:5.3f}\n",
@ -262,8 +266,8 @@ void FixReaxFFBonds::RecvBuffer(double *buf, int nbuf, int nbuf_local,
} }
j = 2; j = 2;
if (me == 0) { if (comm->me == 0) {
for (inode = 0; inode < nprocs; inode ++) { for (inode = 0; inode < comm->nprocs; inode ++) {
if (inode == 0) { if (inode == 0) {
nlocal_tmp = nlocal; nlocal_tmp = nlocal;
} else { } else {
@ -299,8 +303,10 @@ void FixReaxFFBonds::RecvBuffer(double *buf, int nbuf, int nbuf_local,
MPI_Isend(&buf[0],nbuf_local,MPI_DOUBLE,0,0,world,&irequest2); MPI_Isend(&buf[0],nbuf_local,MPI_DOUBLE,0,0,world,&irequest2);
MPI_Wait(&irequest2,MPI_STATUS_IGNORE); MPI_Wait(&irequest2,MPI_STATUS_IGNORE);
} }
if (me == 0) fputs("# \n",fp); if (fp) {
fputs("# \n",fp);
fflush(fp);
}
} }
/* ---------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- */
@ -333,6 +339,18 @@ void FixReaxFFBonds::allocate()
/* ---------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- */
int FixReaxFFBonds::modify_param(int narg, char **arg)
{
if (strcmp(arg[0], "pad") == 0) {
if (narg < 2) utils::missing_cmd_args(FLERR, "fix_modify pad", error);
padflag = utils::inumeric(FLERR, arg[1], false, lmp);
return 2;
}
return 0;
}
/* ---------------------------------------------------------------------- */
double FixReaxFFBonds::memory_usage() double FixReaxFFBonds::memory_usage()
{ {
double bytes; double bytes;

View File

@ -1,4 +1,3 @@
// clang-format off
/* -*- c++ -*- ---------------------------------------------------------- /* -*- c++ -*- ----------------------------------------------------------
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
https://www.lammps.org/, Sandia National Laboratories https://www.lammps.org/, Sandia National Laboratories
@ -35,11 +34,12 @@ class FixReaxFFBonds : public Fix {
void end_of_step() override; void end_of_step() override;
protected: protected:
int me, nprocs, nmax, ntypes, maxsize, compressed; int nmax, compressed, multifile, padflag;
int *numneigh; int *numneigh;
tagint **neighid; tagint **neighid;
double **abo; double **abo;
FILE *fp; FILE *fp;
std::string filename;
bool first_flag; bool first_flag;
void allocate(); void allocate();
@ -49,6 +49,7 @@ class FixReaxFFBonds : public Fix {
void PassBuffer(double *, int &); void PassBuffer(double *, int &);
void RecvBuffer(double *, int, int, int, int); void RecvBuffer(double *, int, int, int, int);
int nint(const double &); int nint(const double &);
int modify_param(int, char **) override;
double memory_usage() override; double memory_usage() override;
struct _reax_list *lists; struct _reax_list *lists;

View File

@ -308,7 +308,8 @@ void Comm::modify_params(int narg, char **arg)
} else if (strcmp(arg[iarg+1],"multi/old") == 0) { } else if (strcmp(arg[iarg+1],"multi/old") == 0) {
if (me == 0) if (me == 0)
error->warning(FLERR, "Comm mode 'multi/old' is deprecated and will be removed soon.\n" error->warning(FLERR, "Comm mode 'multi/old' is deprecated and will be removed soon.\n"
"Contact the LAMMPS developers if that creates problems for you."); "Please contact the LAMMPS developers if you cannot use mode 'multi'."
+ utils::errorurl(35));
if (neighbor->style == Neighbor::MULTI) if (neighbor->style == Neighbor::MULTI)
error->all(FLERR, iarg+1, error->all(FLERR, iarg+1,
"Cannot use comm mode 'multi/old' with 'multi' style neighbor lists"); "Cannot use comm mode 'multi/old' with 'multi' style neighbor lists");
@ -372,7 +373,8 @@ void Comm::modify_params(int narg, char **arg)
double cut; double cut;
if (me == 0) if (me == 0)
error->warning(FLERR, "Comm mode 'multi/old' is deprecated and will be removed soon.\n" error->warning(FLERR, "Comm mode 'multi/old' is deprecated and will be removed soon.\n"
"Contact the LAMMPS developers if that creates problems for you."); "Please contact the LAMMPS developers if you cannot use mode 'multi'."
+ utils::errorurl(35));
if (mode == Comm::SINGLE) if (mode == Comm::SINGLE)
error->all(FLERR, iarg, "Use cutoff keyword to set cutoff in single mode"); error->all(FLERR, iarg, "Use cutoff keyword to set cutoff in single mode");
if (mode == Comm::MULTI) if (mode == Comm::MULTI)

View File

@ -48,11 +48,12 @@ Compute::Compute(LAMMPS *lmp, int narg, char **arg) :
id = utils::strdup(arg[0]); id = utils::strdup(arg[0]);
if (!utils::is_id(id)) if (!utils::is_id(id))
error->all(FLERR,"Compute ID {} must only have alphanumeric or underscore characters", id); error->all(FLERR, Error::ARGZERO,
"Compute ID {} must only have alphanumeric or underscore characters", id);
groupbit = group->get_bitmask_by_id(FLERR, arg[1], fmt::format("compute {}", arg[2])); groupbit = group->get_bitmask_by_id(FLERR, arg[1], fmt::format("compute {}", arg[2]));
igroup = group->find(arg[1]); igroup = group->find(arg[1]);
if (igroup == -1) error->all(FLERR,"Could not find compute group ID {}", arg[1]); if (igroup == -1) error->all(FLERR, 1, "Could not find compute group ID {}", arg[1]);
style = utils::strdup(arg[2]); style = utils::strdup(arg[2]);
@ -119,21 +120,24 @@ void Compute::init_flags()
invoked_peratom = invoked_local = -1; invoked_peratom = invoked_local = -1;
if (scalar_flag && (extscalar < 0)) if (scalar_flag && (extscalar < 0))
error->all(FLERR, "Must set 'extscalar' when setting 'scalar_flag' for compute {}. " error->all(FLERR, Error::NOLASTLINE,
"Contact the developer.", style); "Must set 'extscalar' when setting 'scalar_flag' for compute {}. "
"Please contact the LAMMPS developers.{}", style, utils::errorurl(35));
if (vector_flag && (extvector < 0) && !extlist) if (vector_flag && (extvector < 0) && !extlist)
error->all(FLERR, "Must set 'extvector' or 'extlist' when setting 'vector_flag' for compute {}. " error->all(FLERR, Error::NOLASTLINE,
"Contact the developer.", style); "Must set 'extvector' or 'extlist' when setting 'vector_flag' for compute {}. "
"Please contact the LAMMPS developers.{}", style, utils::errorurl(35));
if (array_flag && (extarray < 0)) if (array_flag && (extarray < 0))
error->all(FLERR, "Must set 'extarray' when setting 'array_flag' for compute {}. " error->all(FLERR, Error::NOLASTLINE,
"Contact the developer.", style); "Must set 'extarray' when setting 'array_flag' for compute {}. "
"Please contact the LAMMPS developers.{}", style, utils::errorurl(35));
} }
/* ---------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- */
void Compute::modify_params(int narg, char **arg) void Compute::modify_params(int narg, char **arg)
{ {
if (narg == 0) error->all(FLERR,"Illegal compute_modify command"); if (narg == 0) error->all(FLERR, Error::NOLASTLINE, "Illegal compute_modify command");
int iarg = 0; int iarg = 0;
while (iarg < narg) { while (iarg < narg) {
@ -179,7 +183,7 @@ void Compute::reset_extra_dof()
void Compute::reset_extra_compute_fix(const char *) void Compute::reset_extra_compute_fix(const char *)
{ {
error->all(FLERR, error->all(FLERR, Error::NOLASTLINE,
"Compute does not allow an extra compute or fix to be reset"); "Compute does not allow an extra compute or fix to be reset");
} }

View File

@ -115,6 +115,7 @@ class Compute : protected Pointers {
void modify_params(int, char **); void modify_params(int, char **);
virtual int modify_param(int, char **) { return 0; } virtual int modify_param(int, char **) { return 0; }
virtual void reset_extra_dof(); virtual void reset_extra_dof();
virtual void post_constructor() {}
void init_flags(); void init_flags();
virtual void init() = 0; virtual void init() = 0;

View File

@ -78,6 +78,7 @@ ComputeChunkSpreadAtom(LAMMPS *lmp, int narg, char **arg) :
if (expand) { if (expand) {
for (int i = 0; i < nargnew; i++) delete[] earg[i]; for (int i = 0; i < nargnew; i++) delete[] earg[i];
memory->sfree(earg); memory->sfree(earg);
memory->sfree(amap);
} }
// setup and error check // setup and error check

View File

@ -89,6 +89,7 @@ ComputeGlobalAtom::ComputeGlobalAtom(LAMMPS *lmp, int narg, char **arg) :
if (expand) { if (expand) {
for (int i = 0; i < nargnew; i++) delete [] earg[i]; for (int i = 0; i < nargnew; i++) delete [] earg[i];
memory->sfree(earg); memory->sfree(earg);
memory->sfree(amap);
} }
// setup and error check for both, index arg and values // setup and error check for both, index arg and values

View File

@ -257,6 +257,7 @@ ComputeReduce::ComputeReduce(LAMMPS *lmp, int narg, char **arg) :
if (expand) { if (expand) {
for (int i = 0; i < nargnew; i++) delete[] earg[i]; for (int i = 0; i < nargnew; i++) delete[] earg[i];
memory->sfree(earg); memory->sfree(earg);
memory->sfree(amap);
} }
// setup and error check // setup and error check

View File

@ -92,6 +92,7 @@ ComputeReduceChunk::ComputeReduceChunk(LAMMPS *lmp, int narg, char **arg) :
if (expand) { if (expand) {
for (int i = 0; i < nargnew; i++) delete[] earg[i]; for (int i = 0; i < nargnew; i++) delete[] earg[i];
memory->sfree(earg); memory->sfree(earg);
memory->sfree(amap);
} }
// error check // error check

View File

@ -66,25 +66,27 @@ void DisplaceAtoms::command(int narg, char **arg)
error->all(FLERR,"Displace_atoms command before simulation box is defined" + utils::errorurl(33)); error->all(FLERR,"Displace_atoms command before simulation box is defined" + utils::errorurl(33));
if (narg < 2) error->all(FLERR,"Illegal displace_atoms command"); if (narg < 2) error->all(FLERR,"Illegal displace_atoms command");
if (modify->nfix_restart_peratom) if (modify->nfix_restart_peratom)
error->all(FLERR,"Cannot displace_atoms after " error->all(FLERR,"Cannot displace_atoms after reading restart file with per-atom info");
"reading restart file with per-atom info");
if (comm->me == 0) utils::logmesg(lmp,"Displacing atoms ...\n"); if (comm->me == 0) utils::logmesg(lmp,"Displacing atoms ...\n");
// group and style // group and style
igroup = group->find(arg[0]); igroup = group->find(arg[0]);
if (igroup < 0)
error->all(FLERR, Error::ARGZERO, "Could not find display_atoms group {}", arg[0]);
groupbit = group->get_bitmask_by_id(FLERR, arg[0], "displace_atoms"); groupbit = group->get_bitmask_by_id(FLERR, arg[0], "displace_atoms");
if (modify->check_rigid_group_overlap(groupbit)) if (modify->check_rigid_group_overlap(groupbit))
error->warning(FLERR,"Attempting to displace atoms in rigid bodies"); error->warning(FLERR, "Attempting to displace atoms in rigid bodies");
int style = -1; int style = -1;
if (strcmp(arg[1],"move") == 0) style = MOVE; if (strcmp(arg[1], "move") == 0) style = MOVE;
else if (strcmp(arg[1],"ramp") == 0) style = RAMP; else if (strcmp(arg[1], "ramp") == 0) style = RAMP;
else if (strcmp(arg[1],"random") == 0) style = RANDOM; else if (strcmp(arg[1], "random") == 0) style = RANDOM;
else if (strcmp(arg[1],"rotate") == 0) style = ROTATE; else if (strcmp(arg[1], "rotate") == 0) style = ROTATE;
else error->all(FLERR,"Illegal displace_atoms command"); else error->all(FLERR, 1, "Unknown displace_atoms keyword {}", arg[1]);
// set option defaults // set option defaults
@ -92,10 +94,10 @@ void DisplaceAtoms::command(int narg, char **arg)
// read options from end of input line // read options from end of input line
if (style == MOVE) options(narg-5,&arg[5]); if (style == MOVE) options(narg-5, &arg[5]);
else if (style == RAMP) options(narg-8,&arg[8]); else if (style == RAMP) options(narg-8, &arg[8]);
else if (style == RANDOM) options(narg-6,&arg[6]); else if (style == RANDOM) options(narg-6, &arg[6]);
else if (style == ROTATE) options(narg-9,&arg[9]); else if (style == ROTATE) options(narg-9, &arg[9]);
// setup scaling // setup scaling
@ -104,15 +106,14 @@ void DisplaceAtoms::command(int narg, char **arg)
xscale = domain->lattice->xlattice; xscale = domain->lattice->xlattice;
yscale = domain->lattice->ylattice; yscale = domain->lattice->ylattice;
zscale = domain->lattice->zlattice; zscale = domain->lattice->zlattice;
} } else xscale = yscale = zscale = 1.0;
else xscale = yscale = zscale = 1.0;
// move atoms by 3-vector or specified variable(s) // move atoms by 3-vector or specified variable(s)
if (style == MOVE) { if (style == MOVE) {
move(0,arg[2],xscale); move(0,arg[2],xscale);
move(1,arg[3],yscale); move(1,arg[3],yscale);
move(2,arg[4],zscale); if (domain->dimension == 3) move(2,arg[4],zscale);
} }
// move atoms in ramped fashion // move atoms in ramped fashion
@ -123,7 +124,9 @@ void DisplaceAtoms::command(int narg, char **arg)
if (strcmp(arg[2],"x") == 0) d_dim = 0; if (strcmp(arg[2],"x") == 0) d_dim = 0;
else if (strcmp(arg[2],"y") == 0) d_dim = 1; else if (strcmp(arg[2],"y") == 0) d_dim = 1;
else if (strcmp(arg[2],"z") == 0) d_dim = 2; else if (strcmp(arg[2],"z") == 0) d_dim = 2;
else error->all(FLERR,"Illegal displace_atoms ramp command"); else error->all(FLERR, 2, "Unknown displace_atoms ramp dimension {}", arg[2]);
if ((domain->dimension == 2) && (d_dim = 2))
error->all(FLERR, 2, "Must not displace atoms in z-direction with 2d system");
double d_lo,d_hi; double d_lo,d_hi;
if (d_dim == 0) { if (d_dim == 0) {
@ -141,7 +144,7 @@ void DisplaceAtoms::command(int narg, char **arg)
if (strcmp(arg[5],"x") == 0) coord_dim = 0; if (strcmp(arg[5],"x") == 0) coord_dim = 0;
else if (strcmp(arg[5],"y") == 0) coord_dim = 1; else if (strcmp(arg[5],"y") == 0) coord_dim = 1;
else if (strcmp(arg[5],"z") == 0) coord_dim = 2; else if (strcmp(arg[5],"z") == 0) coord_dim = 2;
else error->all(FLERR,"Illegal displace_atoms ramp command"); else error->all(FLERR, 5, "Unknown displace_atoms ramp dimension {}", arg[5]);
double coord_lo,coord_hi; double coord_lo,coord_hi;
if (coord_dim == 0) { if (coord_dim == 0) {
@ -182,18 +185,21 @@ void DisplaceAtoms::command(int narg, char **arg)
double dy = yscale*utils::numeric(FLERR,arg[3],false,lmp); double dy = yscale*utils::numeric(FLERR,arg[3],false,lmp);
double dz = zscale*utils::numeric(FLERR,arg[4],false,lmp); double dz = zscale*utils::numeric(FLERR,arg[4],false,lmp);
int seed = utils::inumeric(FLERR,arg[5],false,lmp); int seed = utils::inumeric(FLERR,arg[5],false,lmp);
if (seed <= 0) error->all(FLERR,"Illegal displace_atoms random command"); if (seed <= 0) error->all(FLERR, 5, "Illegal displace_atoms random seed {}", arg[5]);
if ((domain->dimension == 2) && (dz != 0.0))
error->all(FLERR, 4, "Must not displace atoms in z-direction with 2d system");
double **x = atom->x; double **x = atom->x;
int *mask = atom->mask; int *mask = atom->mask;
int nlocal = atom->nlocal; int nlocal = atom->nlocal;
int dim = domain->dimension;
for (i = 0; i < nlocal; i++) { for (i = 0; i < nlocal; i++) {
if (mask[i] & groupbit) { if (mask[i] & groupbit) {
random->reset(seed,x[i]); random->reset(seed,x[i]);
x[i][0] += dx * 2.0*(random->uniform()-0.5); x[i][0] += dx * 2.0*(random->uniform()-0.5);
x[i][1] += dy * 2.0*(random->uniform()-0.5); x[i][1] += dy * 2.0*(random->uniform()-0.5);
x[i][2] += dz * 2.0*(random->uniform()-0.5); if (dim == 3) x[i][2] += dz * 2.0*(random->uniform()-0.5);
} }
} }
@ -226,11 +232,11 @@ void DisplaceAtoms::command(int narg, char **arg)
axis[2] = utils::numeric(FLERR,arg[7],false,lmp); axis[2] = utils::numeric(FLERR,arg[7],false,lmp);
double theta = utils::numeric(FLERR,arg[8],false,lmp); double theta = utils::numeric(FLERR,arg[8],false,lmp);
if (dim == 2 && (axis[0] != 0.0 || axis[1] != 0.0)) if (dim == 2 && (axis[0] != 0.0 || axis[1] != 0.0))
error->all(FLERR,"Invalid displace_atoms rotate axis for 2d"); error->all(FLERR, Error::NOLASTLINE, "Invalid displace_atoms rotate axis for 2d system");
double len = sqrt(axis[0]*axis[0] + axis[1]*axis[1] + axis[2]*axis[2]); double len = sqrt(axis[0]*axis[0] + axis[1]*axis[1] + axis[2]*axis[2]);
if (len == 0.0) if (len == 0.0)
error->all(FLERR,"Zero length rotation vector with displace_atoms"); error->all(FLERR, Error::NOLASTLINE, "Zero length rotation vector with displace_atoms");
runit[0] = axis[0]/len; runit[0] = axis[0]/len;
runit[1] = axis[1]/len; runit[1] = axis[1]/len;
runit[2] = axis[2]/len; runit[2] = axis[2]/len;
@ -384,7 +390,8 @@ void DisplaceAtoms::move(int idim, char *arg, double scale)
} else { } else {
int ivar = input->variable->find(arg+2); int ivar = input->variable->find(arg+2);
if (ivar < 0) if (ivar < 0)
error->all(FLERR,"Variable name for displace_atoms does not exist"); error->all(FLERR, Error::NOLASTLINE,
"Variable {} for displace_atoms move does not exist", arg+2);
if (input->variable->equalstyle(ivar)) { if (input->variable->equalstyle(ivar)) {
double delta = scale * input->variable->compute_equal(ivar); double delta = scale * input->variable->compute_equal(ivar);
@ -395,7 +402,8 @@ void DisplaceAtoms::move(int idim, char *arg, double scale)
input->variable->compute_atom(ivar,igroup,mvec,1,0); input->variable->compute_atom(ivar,igroup,mvec,1,0);
for (int i = 0; i < nlocal; i++) for (int i = 0; i < nlocal; i++)
if (mask[i] & groupbit) x[i][idim] += scale*mvec[i]; if (mask[i] & groupbit) x[i][idim] += scale*mvec[i];
} else error->all(FLERR,"Variable for displace_atoms is invalid style"); } else error->all(FLERR, Error::NOLASTLINE,
"Variable {} for displace_atoms is invalid style", arg+2);
} }
} }
@ -405,16 +413,23 @@ void DisplaceAtoms::move(int idim, char *arg, double scale)
void DisplaceAtoms::options(int narg, char **arg) void DisplaceAtoms::options(int narg, char **arg)
{ {
if (narg < 0) error->all(FLERR,"Illegal displace_atoms command"); if (narg < 0) utils::missing_cmd_args(FLERR, "displace_atoms", error);
// determine argument offset, if possible
int ioffset = 0;
if (lmp->input->arg) {
for (int i = 0; i < lmp->input->narg; ++i)
if (lmp->input->arg[i] == arg[0]) ioffset = i;
}
int iarg = 0; int iarg = 0;
while (iarg < narg) { while (iarg < narg) {
if (strcmp(arg[iarg],"units") == 0) { if (strcmp(arg[iarg],"units") == 0) {
if (iarg+2 > narg) error->all(FLERR,"Illegal displace_atoms command"); if (iarg+2 > narg) utils::missing_cmd_args(FLERR, "displace_atoms units", error);
if (strcmp(arg[iarg+1],"box") == 0) scaleflag = 0; if (strcmp(arg[iarg+1],"box") == 0) scaleflag = 0;
else if (strcmp(arg[iarg+1],"lattice") == 0) scaleflag = 1; else if (strcmp(arg[iarg+1],"lattice") == 0) scaleflag = 1;
else error->all(FLERR,"Illegal displace_atoms command"); else error->all(FLERR, ioffset + iarg + 1, "Unknown displace_atoms units argument {}", arg[iarg+1]);
iarg += 2; iarg += 2;
} else error->all(FLERR,"Illegal displace_atoms command"); } else error->all(FLERR, ioffset + iarg, "Unknown displace_atoms keyword {}", arg[iarg]);
} }
} }

View File

@ -133,13 +133,13 @@ void Fix::init_flags()
{ {
if (scalar_flag && (extscalar < 0)) if (scalar_flag && (extscalar < 0))
error->all(FLERR, "Must set 'extscalar' when setting 'scalar_flag' for fix {}. " error->all(FLERR, "Must set 'extscalar' when setting 'scalar_flag' for fix {}. "
"Contact the developer.", style); "Please contact the LAMMPS developers.{}", style, utils::errorurl(35));
if (vector_flag && (extvector < 0) && !extlist) if (vector_flag && (extvector < 0) && !extlist)
error->all(FLERR, "Must set 'extvector' or 'extlist' when setting 'vector_flag' for fix {}. " error->all(FLERR, "Must set 'extvector' or 'extlist' when setting 'vector_flag' for fix {}. "
"Contact the developer.", style); "Please contact the LAMMPS developers.{}", style, utils::errorurl(35));
if (array_flag && (extarray < 0)) if (array_flag && (extarray < 0))
error->all(FLERR, "Must set 'extarray' when setting 'array_flag' for fix {}. " error->all(FLERR, "Must set 'extarray' when setting 'array_flag' for fix {}. "
"Contact the developer.", style); "Please contact the LAMMPS developers.{}", style, utils::errorurl(35));
} }
/* ---------------------------------------------------------------------- /* ----------------------------------------------------------------------

View File

@ -355,6 +355,7 @@ FixAveChunk::FixAveChunk(LAMMPS *lmp, int narg, char **arg) :
if (expand) { if (expand) {
for (int i = 0; i < nargnew; i++) delete[] earg[i]; for (int i = 0; i < nargnew; i++) delete[] earg[i];
memory->sfree(earg); memory->sfree(earg);
memory->sfree(amap);
} }
// this fix produces a global array // this fix produces a global array

View File

@ -277,6 +277,7 @@ FixAveCorrelate::FixAveCorrelate(LAMMPS *lmp, int narg, char **arg) :
if (expand) { if (expand) {
for (int i = 0; i < nargnew; i++) delete[] earg[i]; for (int i = 0; i < nargnew; i++) delete[] earg[i];
memory->sfree(earg); memory->sfree(earg);
memory->sfree(amap);
} }
// allocate and initialize memory for averaging // allocate and initialize memory for averaging

View File

@ -40,7 +40,7 @@ FixSpring::FixSpring(LAMMPS *lmp, int narg, char **arg) :
Fix(lmp, narg, arg), Fix(lmp, narg, arg),
group2(nullptr) group2(nullptr)
{ {
if (narg < 9) error->all(FLERR,"Illegal fix spring command"); if (narg < 9) utils::missing_cmd_args(FLERR, "fix spring", error);
scalar_flag = 1; scalar_flag = 1;
vector_flag = 1; vector_flag = 1;
@ -53,8 +53,9 @@ FixSpring::FixSpring(LAMMPS *lmp, int narg, char **arg) :
respa_level_support = 1; respa_level_support = 1;
ilevel_respa = 0; ilevel_respa = 0;
if (strcmp(arg[3],"tether") == 0) { if (strcmp(arg[3], "tether") == 0) {
if (narg != 9) error->all(FLERR,"Illegal fix spring command"); if (narg != 9)
error->all(FLERR, Error::NOPOINTER, "Incorrect number of arguments for tether mode");
styleflag = TETHER; styleflag = TETHER;
k_spring = utils::numeric(FLERR,arg[4],false,lmp); k_spring = utils::numeric(FLERR,arg[4],false,lmp);
xflag = yflag = zflag = 1; xflag = yflag = zflag = 1;
@ -65,17 +66,20 @@ FixSpring::FixSpring(LAMMPS *lmp, int narg, char **arg) :
if (strcmp(arg[7],"NULL") == 0) zflag = 0; if (strcmp(arg[7],"NULL") == 0) zflag = 0;
else zc = utils::numeric(FLERR,arg[7],false,lmp); else zc = utils::numeric(FLERR,arg[7],false,lmp);
r0 = utils::numeric(FLERR,arg[8],false,lmp); r0 = utils::numeric(FLERR,arg[8],false,lmp);
if (r0 < 0) error->all(FLERR,"R0 < 0 for fix spring command"); if (r0 < 0) error->all(FLERR, 8, "R0 < 0 for fix spring command");
} else if (strcmp(arg[3],"couple") == 0) { } else if (strcmp(arg[3],"couple") == 0) {
if (narg != 10) error->all(FLERR,"Illegal fix spring command"); if (narg != 10)
error->all(FLERR, Error::NOPOINTER, "Incorrect number of arguments for couple mode");
styleflag = COUPLE; styleflag = COUPLE;
group2 = utils::strdup(arg[4]); group2 = utils::strdup(arg[4]);
igroup2 = group->find(arg[4]); igroup2 = group->find(group2);
if (igroup2 < 0)
error->all(FLERR, 4, "Could not find fix spring couple second group ID {}", group2);
if (igroup2 == igroup) if (igroup2 == igroup)
error->all(FLERR,"The two groups cannot be the same in fix spring couple"); error->all(FLERR,"The two groups cannot be the same in fix spring couple");
group2bit = group->get_bitmask_by_id(FLERR, arg[4], "fix spring"); group2bit = group->get_bitmask_by_id(FLERR, group2, "fix spring");
k_spring = utils::numeric(FLERR,arg[5],false,lmp); k_spring = utils::numeric(FLERR,arg[5],false,lmp);
xflag = yflag = zflag = 1; xflag = yflag = zflag = 1;
@ -88,7 +92,7 @@ FixSpring::FixSpring(LAMMPS *lmp, int narg, char **arg) :
r0 = utils::numeric(FLERR,arg[9],false,lmp); r0 = utils::numeric(FLERR,arg[9],false,lmp);
if (r0 < 0) error->all(FLERR,"R0 < 0 for fix spring command"); if (r0 < 0) error->all(FLERR,"R0 < 0 for fix spring command");
} else error->all(FLERR,"Illegal fix spring command"); } else error->all(FLERR, 3, "Unknown fix spring keyword {}", arg[3]);
ftotal[0] = ftotal[1] = ftotal[2] = ftotal[3] = 0.0; ftotal[0] = ftotal[1] = ftotal[2] = ftotal[3] = 0.0;
} }
@ -119,6 +123,9 @@ void FixSpring::init()
if (group2) { if (group2) {
igroup2 = group->find(group2); igroup2 = group->find(group2);
if (igroup2 < 0)
error->all(FLERR, Error::NOLASTLINE, "Could not find fix spring couple second group ID {}",
group2);
group2bit = group->get_bitmask_by_id(FLERR, group2, "fix spring"); group2bit = group->get_bitmask_by_id(FLERR, group2, "fix spring");
} }

View File

@ -7472,7 +7472,7 @@ has thrown a :ref:`C++ exception <exceptions>`.
.. note:: .. note::
.. versionchanged: 2Aug2023 .. versionchanged:: 2Aug2023
The *handle* pointer may be ``NULL`` for this function, as would be The *handle* pointer may be ``NULL`` for this function, as would be
the case when a call to create a LAMMPS instance has failed. Then the case when a call to create a LAMMPS instance has failed. Then
@ -7545,7 +7545,7 @@ the failing MPI ranks to send messages.
.. note:: .. note::
.. versionchanged: 2Aug2023 .. versionchanged:: 2Aug2023
The *handle* pointer may be ``NULL`` for this function, as would be The *handle* pointer may be ``NULL`` for this function, as would be
the case when a call to create a LAMMPS instance has failed. Then the case when a call to create a LAMMPS instance has failed. Then
@ -7553,7 +7553,7 @@ the failing MPI ranks to send messages.
instance, but instead would check the global error buffer of the instance, but instead would check the global error buffer of the
library interface. library interface.
.. versionchanged: 21Nov2023 .. versionchanged:: 21Nov2023
The *buffer* pointer may be ``NULL``. This will clear any error The *buffer* pointer may be ``NULL``. This will clear any error
status without copying the error message. status without copying the error message.

View File

@ -1006,19 +1006,22 @@ Fix *Modify::add_fix(const std::string &fixcmd, int trysuffix)
Fix *Modify::replace_fix(const char *replaceID, int narg, char **arg, int trysuffix) Fix *Modify::replace_fix(const char *replaceID, int narg, char **arg, int trysuffix)
{ {
auto oldfix = get_fix_by_id(replaceID); auto oldfix = get_fix_by_id(replaceID);
if (!oldfix) error->all(FLERR, "Modify replace_fix ID {} could not be found", replaceID); if (!oldfix) error->all(FLERR, Error::NOLASTLINE,
"Modify replace_fix ID {} could not be found", replaceID);
// change ID, igroup, style of fix being replaced to match new fix // change ID, igroup, style of fix being replaced to match new fix
// requires some error checking on arguments for new fix // requires some error checking on arguments for new fix
if (narg < 3) error->all(FLERR, "Not enough arguments for replace_fix invocation"); if (narg < 3)
error->all(FLERR, Error::NOLASTLINE, "Not enough arguments for replace_fix invocation");
if (get_fix_by_id(arg[0])) error->all(FLERR, "Replace_fix ID {} is already in use", arg[0]); if (get_fix_by_id(arg[0])) error->all(FLERR, "Replace_fix ID {} is already in use", arg[0]);
delete[] oldfix->id; delete[] oldfix->id;
oldfix->id = utils::strdup(arg[0]); oldfix->id = utils::strdup(arg[0]);
int jgroup = group->find(arg[1]); int jgroup = group->find(arg[1]);
if (jgroup == -1) error->all(FLERR, "Could not find replace_fix group ID {}", arg[1]); if (jgroup == -1) error->all(FLERR, Error::NOLASTLINE,
"Could not find replace_fix group ID {}", arg[1]);
oldfix->igroup = jgroup; oldfix->igroup = jgroup;
delete[] oldfix->style; delete[] oldfix->style;
@ -1052,7 +1055,7 @@ void Modify::modify_fix(int narg, char **arg)
if (narg < 2) utils::missing_cmd_args(FLERR, "fix_modify", error); if (narg < 2) utils::missing_cmd_args(FLERR, "fix_modify", error);
auto ifix = get_fix_by_id(arg[0]); auto ifix = get_fix_by_id(arg[0]);
if (!ifix) error->all(FLERR, "Could not find fix_modify ID {}", arg[0]); if (!ifix) error->all(FLERR, Error::NOLASTLINE, "Could not find fix_modify ID {}", arg[0]);
ifix->modify_params(narg - 1, &arg[1]); ifix->modify_params(narg - 1, &arg[1]);
} }
@ -1064,7 +1067,7 @@ void Modify::modify_fix(int narg, char **arg)
void Modify::delete_fix(const std::string &id) void Modify::delete_fix(const std::string &id)
{ {
int ifix = find_fix(id); int ifix = find_fix(id);
if (ifix < 0) error->all(FLERR, "Could not find fix ID {} to delete", id); if (ifix < 0) error->all(FLERR, Error::NOLASTLINE, "Could not find fix ID {} to delete", id);
delete_fix(ifix); delete_fix(ifix);
} }
@ -1291,10 +1294,21 @@ Compute *Modify::add_compute(int narg, char **arg, int trysuffix)
} }
if (compute[ncompute] == nullptr) if (compute[ncompute] == nullptr)
error->all(FLERR, utils::check_packages_for_style("compute", arg[2], lmp)); error->all(FLERR, Error::NOLASTLINE, utils::check_packages_for_style("compute", arg[2], lmp));
compute_list = std::vector<Compute *>(compute, compute + ncompute + 1); compute_list = std::vector<Compute *>(compute, compute + ncompute + 1);
return compute[ncompute++];
// post_constructor() can call virtual methods in parent or child
// which would otherwise not yet be visible in child class
// post_constructor() allows new compute to create other computes
// ncompute increment must come first so recursive call to add_compute within
// post_constructor() will see updated ncompute
auto *newcompute = compute[ncompute];
++ncompute;
newcompute->post_constructor();
return newcompute;
} }
/* ---------------------------------------------------------------------- /* ----------------------------------------------------------------------
@ -1321,7 +1335,8 @@ void Modify::modify_compute(int narg, char **arg)
// lookup Compute ID // lookup Compute ID
auto icompute = get_compute_by_id(arg[0]); auto icompute = get_compute_by_id(arg[0]);
if (!icompute) error->all(FLERR, "Could not find compute_modify ID {}", arg[0]); if (!icompute)
error->all(FLERR, Error::NOLASTLINE, "Could not find compute_modify ID {}", arg[0]);
icompute->modify_params(narg - 1, &arg[1]); icompute->modify_params(narg - 1, &arg[1]);
} }
@ -1332,7 +1347,8 @@ void Modify::modify_compute(int narg, char **arg)
void Modify::delete_compute(const std::string &id) void Modify::delete_compute(const std::string &id)
{ {
int icompute = find_compute(id); int icompute = find_compute(id);
if (icompute < 0) error->all(FLERR, "Could not find compute ID {} to delete", id); if (icompute < 0)
error->all(FLERR, Error::NOLASTLINE, "Could not find compute ID {} to delete", id);
delete_compute(icompute); delete_compute(icompute);
} }
@ -1431,7 +1447,7 @@ void Modify::addstep_compute(bigint newstep)
} }
for (int icompute = 0; icompute < n_timeflag; icompute++) for (int icompute = 0; icompute < n_timeflag; icompute++)
if (compute[list_timeflag[icompute]]->invoked_flag) if (compute[list_timeflag[icompute]]->invoked_flag >=0)
compute[list_timeflag[icompute]]->addstep(newstep); compute[list_timeflag[icompute]]->addstep(newstep);
} }

View File

@ -1144,7 +1144,7 @@ int Neighbor::init_pair()
} }
if (count == 100) if (count == 100)
error->all(FLERR, Error::NOLASTLINE, "Failed to reorder neighbor lists to satisfy " error->all(FLERR, Error::NOLASTLINE, "Failed to reorder neighbor lists to satisfy "
"constraints - Contact the LAMMPS developers for assistance"); "constraints - Please contact the LAMMPS developers." + utils::errorurl(35));
// debug output // debug output
@ -2646,7 +2646,8 @@ void Neighbor::set(int narg, char **arg)
style = Neighbor::MULTI_OLD; style = Neighbor::MULTI_OLD;
if (me == 0) if (me == 0)
error->warning(FLERR, "Neighbor list style 'multi/old' is deprecated and will be removed " error->warning(FLERR, "Neighbor list style 'multi/old' is deprecated and will be removed "
"soon.\nContact the LAMMPS developers if that creates problems for you."); "soon.\nPlease contact the LAMMPS developers if you cannot use style 'multi'."
+ utils::errorurl(35));
} else error->all(FLERR, 1, "Unknown neighbor {} argument: {}", arg[0], arg[1]); } else error->all(FLERR, 1, "Unknown neighbor {} argument: {}", arg[0], arg[1]);
if (style == Neighbor::MULTI_OLD && lmp->citeme) lmp->citeme->add(cite_neigh_multi_old); if (style == Neighbor::MULTI_OLD && lmp->citeme) lmp->citeme->add(cite_neigh_multi_old);

View File

@ -154,8 +154,8 @@ void Output::init()
any_time_dumps = 0; any_time_dumps = 0;
for (int i = 0; i < ndump; i++) { for (int i = 0; i < ndump; i++) {
if (mode_dump[i]) any_time_dumps = 1; if (mode_dump[i]) any_time_dumps = 1;
if ((mode_dump[i] == 0 && every_dump[i] == 0) || if (((mode_dump[i] == 0) && (every_dump[i] == 0)) ||
(mode_dump[i] == 1 && every_time_dump[i] == 0.0)) { ((mode_dump[i] == 1) && (every_time_dump[i] == 0.0))) {
ivar_dump[i] = input->variable->find(var_dump[i]); ivar_dump[i] = input->variable->find(var_dump[i]);
if (ivar_dump[i] < 0) if (ivar_dump[i] < 0)
error->all(FLERR,"Variable name for dump every or delta does not exist"); error->all(FLERR,"Variable name for dump every or delta does not exist");
@ -222,13 +222,13 @@ void Output::setup(int memflag)
if (ndump && update->restrict_output == 0) { if (ndump && update->restrict_output == 0) {
next_dump_any = next_time_dump_any = MAXBIGINT; next_dump_any = next_time_dump_any = MAXBIGINT;
int mode_dump_any = 0;
for (int idump = 0; idump < ndump; idump++) { for (int idump = 0; idump < ndump; idump++) {
// wrap step dumps that invoke computes or do variable eval with clear/add // wrap step dumps that invoke computes or do variable eval with clear/add
// see NOTE in write() about also wrapping time dumps // see NOTE in write() about also wrapping time dumps
if (mode_dump[idump] == 0 && (dump[idump]->clearstep || var_dump[idump])) if ((mode_dump[idump] == 0) && (dump[idump]->clearstep || var_dump[idump]))
modify->clearstep_compute(); modify->clearstep_compute();
// write a snapshot at setup only if any of these 3 conditions hold // write a snapshot at setup only if any of these 3 conditions hold
@ -274,15 +274,18 @@ void Output::setup(int memflag)
// if dump not written now, use addstep_compute_all() // if dump not written now, use addstep_compute_all()
// since don't know what computes the dump will invoke // since don't know what computes the dump will invoke
if (mode_dump[idump] == 0 && (dump[idump]->clearstep || var_dump[idump])) { if ((mode_dump[idump] == 0) && (dump[idump]->clearstep || var_dump[idump])) {
if (writeflag) modify->addstep_compute(next_dump[idump]); if (writeflag) modify->addstep_compute(next_dump[idump]);
else modify->addstep_compute_all(next_dump[idump]); else modify->addstep_compute_all(next_dump[idump]);
} }
if (mode_dump[idump] && (dump[idump]->clearstep || var_dump[idump])) if (mode_dump[idump] && (dump[idump]->clearstep || var_dump[idump])) {
next_time_dump_any = MIN(next_time_dump_any,next_dump[idump]); next_time_dump_any = MIN(next_time_dump_any,next_dump[idump]);
mode_dump_any = 1;
}
next_dump_any = MIN(next_dump_any,next_dump[idump]); next_dump_any = MIN(next_dump_any,next_dump[idump]);
} }
if (mode_dump_any) modify->addstep_compute(next_time_dump_any);
// if no dumps, set next_dump_any to last+1 so will not influence next // if no dumps, set next_dump_any to last+1 so will not influence next
@ -350,7 +353,8 @@ void Output::write(bigint ntimestep)
next_thermo = static_cast<bigint> next_thermo = static_cast<bigint>
(input->variable->compute_equal(ivar_thermo)); (input->variable->compute_equal(ivar_thermo));
if (next_thermo <= ntimestep) if (next_thermo <= ntimestep)
error->all(FLERR,"Thermo every variable returned a bad timestep"); error->all(FLERR, Error::NOLASTLINE, "Thermo every variable returned a bad timestep: {} "
"vs {}", next_thermo, ntimestep);
} else if (thermo_every) next_thermo += thermo_every; } else if (thermo_every) next_thermo += thermo_every;
else next_thermo = update->laststep; else next_thermo = update->laststep;
next_thermo = MIN(next_thermo,update->laststep); next_thermo = MIN(next_thermo,update->laststep);
@ -373,16 +377,15 @@ void Output::write(bigint ntimestep)
// can't remove an uneeded addstep from a compute, b/c don't know // can't remove an uneeded addstep from a compute, b/c don't know
// what other command may have added it // what other command may have added it
int mode_dump_any = 0; // any variable time or clearstep dump
if (next_dump_any == ntimestep) { if (next_dump_any == ntimestep) {
next_dump_any = next_time_dump_any = MAXBIGINT; next_dump_any = next_time_dump_any = MAXBIGINT;
for (int idump = 0; idump < ndump; idump++) { for (int idump = 0; idump < ndump; idump++) {
if (next_dump[idump] == ntimestep) { if (next_dump[idump] == ntimestep) {
if (last_dump[idump] == ntimestep) continue; if (last_dump[idump] == ntimestep) continue;
if (mode_dump[idump] == 0 && if ((mode_dump[idump] == 0) && (dump[idump]->clearstep || var_dump[idump]))
(dump[idump]->clearstep || var_dump[idump]))
modify->clearstep_compute(); modify->clearstep_compute();
// perform dump // perform dump
@ -392,16 +395,20 @@ void Output::write(bigint ntimestep)
last_dump[idump] = ntimestep; last_dump[idump] = ntimestep;
calculate_next_dump(WRITE,idump,ntimestep); calculate_next_dump(WRITE,idump,ntimestep);
if (mode_dump[idump] == 0 &&
(dump[idump]->clearstep || var_dump[idump])) if ((mode_dump[idump] == 0) && (dump[idump]->clearstep || var_dump[idump]))
modify->addstep_compute(next_dump[idump]); modify->addstep_compute(next_dump[idump]);
} }
if (mode_dump[idump] && (dump[idump]->clearstep || var_dump[idump])) if (mode_dump[idump] && (dump[idump]->clearstep || var_dump[idump])) {
mode_dump_any = 1;
next_time_dump_any = MIN(next_time_dump_any,next_dump[idump]); next_time_dump_any = MIN(next_time_dump_any,next_dump[idump]);
}
next_dump_any = MIN(next_dump_any,next_dump[idump]); next_dump_any = MIN(next_dump_any,next_dump[idump]);
} }
} }
// trigger computes for any time based or variable step dumps
if (mode_dump_any) modify->addstep_compute(next_time_dump_any);
// next_restart does not force output on last step of run // next_restart does not force output on last step of run
// for toggle = 0, replace "*" with current timestep in restart filename // for toggle = 0, replace "*" with current timestep in restart filename

View File

@ -1053,6 +1053,32 @@ bool platform::file_is_readable(const std::string &path)
} }
return false; return false;
} }
/* ----------------------------------------------------------------------
try to open file for writing to prove if it can be written to
------------------------------------------------------------------------- */
bool platform::file_is_writable(const std::string &path)
{
// if the file exists, try to append and don't delete
if (file_is_readable(path)) {
FILE *fp = fopen(path.c_str(), "a");
if (fp) {
fclose(fp);
return true;
}
} else {
FILE *fp = fopen(path.c_str(), "w");
if (fp) {
fclose(fp);
unlink(path);
return true;
}
}
return false;
}
/* ---------------------------------------------------------------------- /* ----------------------------------------------------------------------
determine available disk space, if supported. Return -1 if not. determine available disk space, if supported. Return -1 if not.
------------------------------------------------------------------------- */ ------------------------------------------------------------------------- */
@ -1123,6 +1149,7 @@ FILE *platform::compressed_write(const std::string &file)
#if defined(LAMMPS_GZIP) #if defined(LAMMPS_GZIP)
const auto &compress = find_compress_type(file); const auto &compress = find_compress_type(file);
if (compress.style == ::compress_info::NONE) return nullptr; if (compress.style == ::compress_info::NONE) return nullptr;
if (!file_is_writable(file)) return nullptr;
if (find_exe_path(compress.command).size()) if (find_exe_path(compress.command).size())
// put quotes around file name so that they may contain blanks // put quotes around file name so that they may contain blanks

View File

@ -377,6 +377,13 @@ namespace platform {
bool file_is_readable(const std::string &path); bool file_is_readable(const std::string &path);
/*! Check if file can be opened for writing
*
* \param path file path
* \return true if file can be opened for writing */
bool file_is_writable(const std::string &path);
/*! Return free disk space in bytes of file system pointed to by path /*! Return free disk space in bytes of file system pointed to by path
* *
* Returns -1.0 if the path is invalid or free space reporting not supported. * Returns -1.0 if the path is invalid or free space reporting not supported.

View File

@ -532,7 +532,6 @@ void Set::command(int narg, char **arg)
atom->get_style()); atom->get_style());
if (ivalue <= 0 || ivalue > atom->ndihedraltypes) if (ivalue <= 0 || ivalue > atom->ndihedraltypes)
error->all(FLERR, iarg + 1, "Invalid value {} in set dihedral command", ivalue); error->all(FLERR, iarg + 1, "Invalid value {} in set dihedral command", ivalue);
error->all(FLERR,"Invalid value in set command");
topology(DIHEDRAL); topology(DIHEDRAL);
iarg += 2; iarg += 2;

View File

@ -855,7 +855,7 @@ int Variable::next(int narg, char **arg)
if (nextindex < 0) if (nextindex < 0)
error->one(FLERR,"Unexpected error while incrementing uloop style variable. " error->one(FLERR,"Unexpected error while incrementing uloop style variable. "
"Please contact the LAMMPS developers."); "Please contact the LAMMPS developers." + utils::errorurl(35));
fp = fopen("tmp.lammps.variable.lock","w"); fp = fopen("tmp.lammps.variable.lock","w");
fprintf(fp,"%d\n",nextindex+1); fprintf(fp,"%d\n",nextindex+1);

View File

@ -49,22 +49,42 @@ def check_pending_tag(f):
return errors, last_line return errors, last_line
def check_bad_tag(f):
pattern = re.compile(r'^ *\.\. +(version(changed|added)|deprecated):\s+\w*')
last_line = "\n"
lineno = 1
errors = set()
for line in f:
if pattern.match(line):
errors.add(lineno)
last_line = line
lineno += 1
return errors, last_line
def check_file(path): def check_file(path):
encoding = 'UTF-8' encoding = 'UTF-8'
pending_tags = set() pending_tags = set()
bad_tags = set()
try: try:
with open(path, 'r') as f: with open(path, 'r') as f:
pending_tags, last_line = check_pending_tag(f) pending_tags, last_line = check_pending_tag(f)
f.seek(0)
bad_tags, last_line = check_bad_tag(f)
except UnicodeDecodeError: except UnicodeDecodeError:
encoding = 'ISO-8859-1' encoding = 'ISO-8859-1'
try: try:
with open(path, 'r', encoding=encoding) as f: with open(path, 'r', encoding=encoding) as f:
pending_tags, last_line = check_pending_tag(f) pending_tags, last_line = check_pending_tag(f)
f.seek(0)
bad_tags, last_line = check_bad_tag(f)
except Exception: except Exception:
encoding = 'unknown' encoding = 'unknown'
return { return {
'pending_tags': pending_tags, 'pending_tags': pending_tags,
'bad_tags': bad_tags,
'encoding': encoding 'encoding': encoding
} }
@ -90,6 +110,9 @@ def check_folder(directory, config, verbose=False):
for lineno in result['pending_tags']: for lineno in result['pending_tags']:
print("[Error] Pending version tag @ {}:{}".format(path, lineno)) print("[Error] Pending version tag @ {}:{}".format(path, lineno))
success = False success = False
for lineno in result['bad_tags']:
print("[Error] Bad version tag @ {}:{}".format(path, lineno))
success = False
if result['encoding'] == 'unknown': if result['encoding'] == 'unknown':
print("[Error] Unknown text encoding @ {}".format(path)) print("[Error] Unknown text encoding @ {}".format(path))

View File

@ -83,8 +83,10 @@ LammpsGui::LammpsGui(QWidget *parent, const QString &filename) :
capturer = new StdCapture; capturer = new StdCapture;
current_file.clear(); current_file.clear();
current_dir = QDir(".").absolutePath(); current_dir = QDir(".").absolutePath();
// use $HOME if we get dropped to "/" like on macOS // use $HOME if we get dropped to "/" like on macOS or the installation folder like on Windows
if (current_dir == "/") current_dir = QDir::homePath(); if ((current_dir == "/") || (current_dir.contains("AppData"))) current_dir = QDir::homePath();
QDir::setCurrent(current_dir);
inspectList.clear(); inspectList.clear();
setAutoFillBackground(true); setAutoFillBackground(true);

View File

@ -2,7 +2,7 @@
lammps_version: 17 Feb 2022 lammps_version: 17 Feb 2022
tags: unstable tags: unstable
date_generated: Fri Mar 18 22:17:32 2022 date_generated: Fri Mar 18 22:17:32 2022
epsilon: 5e-13 epsilon: 5e-12
skip_tests: gpu skip_tests: gpu
prerequisites: ! | prerequisites: ! |
atom full atom full