From 5e6dff36e4e12ff93228009abba034607a6d4734 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 1 Sep 2016 02:01:47 -0400 Subject: [PATCH 01/52] add new commands to lammps.book --- doc/lammps.book | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/lammps.book b/doc/lammps.book index f768cdc7d3..f28bb48b56 100644 --- a/doc/lammps.book +++ b/doc/lammps.book @@ -148,6 +148,7 @@ fix_bond_create.html fix_bond_swap.html fix_box_relax.html fix_colvars.html +fix_controller.html fix_deform.html fix_deposit.html fix_drag.html @@ -162,6 +163,7 @@ fix_eos_table.html fix_eos_table_rx.html fix_evaporate.html fix_external.html +fix_flow_gauss.html fix_freeze.html fix_gcmc.html fix_gld.html -- GitLab From fc093a0aab1760e1edf30c968516f9b95f6720d6 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 1 Sep 2016 02:07:16 -0400 Subject: [PATCH 02/52] replace :ule,l and :ole,l with :l
:ule and :l
:ole --- doc/src/Manual.txt | 3 ++- doc/src/Section_accelerate.txt | 5 +++-- doc/src/Section_intro.txt | 3 ++- doc/src/Section_perf.txt | 3 ++- doc/src/dihedral_harmonic.txt | 3 ++- doc/src/dump_image.txt | 3 ++- doc/src/suffix.txt | 3 ++- doc/src/tutorial_drude.txt | 6 ++++-- 8 files changed, 19 insertions(+), 10 deletions(-) diff --git a/doc/src/Manual.txt b/doc/src/Manual.txt index adf6b5c47e..f4ff4542aa 100644 --- a/doc/src/Manual.txt +++ b/doc/src/Manual.txt @@ -47,7 +47,8 @@ it to be part of every patch. :l There is also a "Developer.pdf"_Developer.pdf file in the doc directory, which describes the internal structure and algorithms of -LAMMPS. :ule,l +LAMMPS. :l +:ule LAMMPS stands for Large-scale Atomic/Molecular Massively Parallel Simulator. diff --git a/doc/src/Section_accelerate.txt b/doc/src/Section_accelerate.txt index 9977853b43..e002cbb5f9 100644 --- a/doc/src/Section_accelerate.txt +++ b/doc/src/Section_accelerate.txt @@ -28,8 +28,9 @@ multi-core CPUs, GPUs, and Intel Xeon Phi coprocessors. 5.3.2 "USER-INTEL package"_accelerate_intel.html :l 5.3.3 "KOKKOS package"_accelerate_kokkos.html :l 5.3.4 "USER-OMP package"_accelerate_omp.html :l - 5.3.5 "OPT package"_accelerate_opt.html :l,ule -5.4 "Comparison of various accelerator packages"_#acc_4 :l,ule + 5.3.5 "OPT package"_accelerate_opt.html :l +5.4 "Comparison of various accelerator packages"_#acc_4 :l +:ule The "Benchmark page"_http://lammps.sandia.gov/bench.html of the LAMMPS web site gives performance results for the various accelerator diff --git a/doc/src/Section_intro.txt b/doc/src/Section_intro.txt index 99751a13ff..089921d45d 100644 --- a/doc/src/Section_intro.txt +++ b/doc/src/Section_intro.txt @@ -460,7 +460,8 @@ Site"_lws. It might be added to the page. No promises. :l Cash. Small denominations, unmarked bills preferred. Paper sack OK. Leave on desk. VISA also accepted. Chocolate chip cookies -encouraged. :ule,l +encouraged. :l +:ule :line diff --git a/doc/src/Section_perf.txt b/doc/src/Section_perf.txt index d1cafa0bda..fc59dbe1dc 100644 --- a/doc/src/Section_perf.txt +++ b/doc/src/Section_perf.txt @@ -36,7 +36,8 @@ sigma cutoff (7 neighbors per atom), NVE integration :l Rhodo = rhodopsin protein in solvated lipid bilayer, CHARMM force field with a 10 Angstrom LJ cutoff (440 neighbors per atom), particle-particle particle-mesh (PPPM) for long-range Coulombics, NPT -integration :ole,l +integration :l +:ole Input files for these 5 problems are provided in the bench directory of the LAMMPS distribution. Each has 32,000 atoms and runs for 100 diff --git a/doc/src/dihedral_harmonic.txt b/doc/src/dihedral_harmonic.txt index ac124ffd48..1de4370a46 100644 --- a/doc/src/dihedral_harmonic.txt +++ b/doc/src/dihedral_harmonic.txt @@ -45,7 +45,8 @@ in some force fields trans = 0 degrees. :ulb,l Some force fields reverse the sign convention on {d}. :l Some force fields let {n} be positive or negative which corresponds to -{d} = 1 or -1 for the harmonic style. :ule,l +{d} = 1 or -1 for the harmonic style. :l +:ule :line diff --git a/doc/src/dump_image.txt b/doc/src/dump_image.txt index 826c3f992b..2f2ca4809b 100644 --- a/doc/src/dump_image.txt +++ b/doc/src/dump_image.txt @@ -598,7 +598,8 @@ obviously play movie files directly. Similarly for corresponding tools bundled with Linux desktop environments. However, due to licensing issues with some file formats, the formats may require installing additional libraries, purchasing a license, or may not be -supported. :ule,l +supported. :l +:ule :line diff --git a/doc/src/suffix.txt b/doc/src/suffix.txt index 51aead3f37..7450d27baf 100644 --- a/doc/src/suffix.txt +++ b/doc/src/suffix.txt @@ -59,7 +59,8 @@ multi-threading :l OPT = a handful of pair styles, cache-optimized for faster CPU performance :l -HYBRID = a combination of two packages can be specified (see below) :ule,l +HYBRID = a combination of two packages can be specified (see below) :l +:ule As an example, all of the packages provide a "pair_style lj/cut"_pair_lj.html variant, with style names lj/cut/opt, lj/cut/omp, diff --git a/doc/src/tutorial_drude.txt b/doc/src/tutorial_drude.txt index 3ab8afcae3..a6080fef27 100644 --- a/doc/src/tutorial_drude.txt +++ b/doc/src/tutorial_drude.txt @@ -67,7 +67,8 @@ for all Drude particles, and to calculate the force constant for each \ type of core-Drude bond from equation (1). The timesteps used by these \ authors are between 0.5 and 2 fs, with the degrees of freedom of the \ Drude oscillators kept cold at 1 K. :l -In both these force fields hydrogen atoms are treated as non-polarizable. :ule,l +In both these force fields hydrogen atoms are treated as non-polarizable. :l +:ule The motion of of the Drude particles can be calculated by minimizing @@ -104,7 +105,8 @@ due to the short distances, so an atom may capture the Drude particle \ (shell) of a neighbor, or the induced dipoles within the same molecule \ may align too much. To avoid this, damping at short of the \ interactions between the point charges composing the induced dipole \ -can be done by "Thole"_#Thole functions. :ole,l +can be done by "Thole"_#Thole functions. :l +:ole :line -- GitLab From ab84acc2cdfc77a9018014d22eb7a632d1afa7f2 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 1 Sep 2016 02:26:49 -0400 Subject: [PATCH 03/52] synchronize LAMMPS developer list with webpage and move ray to "past" --- doc/html/Manual.html | 15 ++++++++++----- doc/src/Manual.txt | 17 ++++++++++++----- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/doc/html/Manual.html b/doc/html/Manual.html index 5c7ec2f31d..7c9ef3678f 100644 --- a/doc/html/Manual.html +++ b/doc/html/Manual.html @@ -166,11 +166,16 @@ run efficiently on parallel computers. It was developed at Sandia National Laboratories, a US Department of Energy facility, with funding from the DOE. It is an open-source code, distributed freely under the terms of the GNU Public License (GPL).

-

The primary developers of LAMMPS are Steve Plimpton, Aidan -Thompson, and Paul Crozier who can be contacted at -sjplimp,athomps,pscrozi at sandia.gov. The LAMMPS WWW Site at -http://lammps.sandia.gov has more information about the code and its -uses.

+

The core group of LAMMPS developers is at Sandia National Labs and Temple University:

+
    +
  • Steve Plimpton, sjplimp at sandia.gov
  • +
  • Aidan Thompson, athomps at sandia.gov
  • +
  • Stan Moore, stamoore at sandia.gov
  • +
  • Axel Kohlmeyer, akohlmey at gmail.com
  • +
+

Past core developers include Paul Crozier, Ray Shan and Mark Stevens, all at Sandia. +The LAMMPS WWW Site at “http://lammps.sandia.gov:_http://lammps.sandia.gov +has more information about the code and its uses.


The LAMMPS documentation is organized into the following sections. If you find errors or omissions in this manual or have suggestions for diff --git a/doc/src/Manual.txt b/doc/src/Manual.txt index f4ff4542aa..6b6760c3dc 100644 --- a/doc/src/Manual.txt +++ b/doc/src/Manual.txt @@ -59,14 +59,21 @@ National Laboratories, a US Department of Energy facility, with funding from the DOE. It is an open-source code, distributed freely under the terms of the GNU Public License (GPL). -The primary developers of LAMMPS are "Steve Plimpton"_sjp, Aidan -Thompson, and Paul Crozier who can be contacted at -sjplimp,athomps,pscrozi at sandia.gov. The "LAMMPS WWW Site"_lws at -http://lammps.sandia.gov has more information about the code and its -uses. +The core group of LAMMPS developers is at Sandia National Labs and Temple University: + +"Steve Plimpton"_sjp, sjplimp at sandia.gov :ulb,l +Aidan Thompson, athomps at sandia.gov :l +Stan Moore, stamoore at sandia.gov :l +"Axel Kohlmeyer"_ako, akohlmey at gmail.com :l +:ulb + +Past core developers include Paul Crozier, Ray Shan and Mark Stevens, all at Sandia. +The "LAMMPS WWW Site"_lws at "http://lammps.sandia.gov:_http://lammps.sandia.gov +has more information about the code and its uses. :link(bug,http://lammps.sandia.gov/bug.html) :link(sjp,http://www.sandia.gov/~sjplimp) +:link(ako,http://goo.gl/1wk0) :line -- GitLab From 431d1a6dae03584491ae2194717492400d57f185 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 1 Sep 2016 02:37:55 -0400 Subject: [PATCH 04/52] mention stable releases --- doc/html/Manual.html | 6 ++++-- doc/src/Manual.txt | 7 +++++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/doc/html/Manual.html b/doc/html/Manual.html index 7c9ef3678f..bcee2c07fd 100644 --- a/doc/html/Manual.html +++ b/doc/html/Manual.html @@ -141,7 +141,9 @@

Version info:

The LAMMPS “version” is the date when it was released, such as 1 May 2010. LAMMPS is updated continuously. Whenever we fix a bug or add a -feature, we release it immediately, and post a notice on this page of the WWW site. Each dated copy of LAMMPS contains all the +feature, we release it immediately, and post a notice on this page of the WWW site. Every 2-4 months one of the incremental releases +is subjected to more thorough testing and labeled as a stable version.

+

Each dated copy of LAMMPS contains all the features and bug-fixes up to and including that version date. The version date is printed to the screen and logfile every time you run LAMMPS. It is also in the file src/version.h and in the LAMMPS @@ -174,7 +176,7 @@ under the terms of the GNU Public License (GPL).

  • Axel Kohlmeyer, akohlmey at gmail.com
  • Past core developers include Paul Crozier, Ray Shan and Mark Stevens, all at Sandia. -The LAMMPS WWW Site at “http://lammps.sandia.gov:_http://lammps.sandia.gov +The LAMMPS home page at http://lammps.sandia.gov has more information about the code and its uses.


    The LAMMPS documentation is organized into the following sections. If diff --git a/doc/src/Manual.txt b/doc/src/Manual.txt index 6b6760c3dc..e53fddef7d 100644 --- a/doc/src/Manual.txt +++ b/doc/src/Manual.txt @@ -28,7 +28,10 @@ Version info: :h4 The LAMMPS "version" is the date when it was released, such as 1 May 2010. LAMMPS is updated continuously. Whenever we fix a bug or add a feature, we release it immediately, and post a notice on "this page of -the WWW site"_bug. Each dated copy of LAMMPS contains all the +the WWW site"_bug. Every 2-4 months one of the incremental releases +is subjected to more thorough testing and labeled as a {stable} version. + +Each dated copy of LAMMPS contains all the features and bug-fixes up to and including that version date. The version date is printed to the screen and logfile every time you run LAMMPS. It is also in the file src/version.h and in the LAMMPS @@ -68,7 +71,7 @@ Stan Moore, stamoore at sandia.gov :l :ulb Past core developers include Paul Crozier, Ray Shan and Mark Stevens, all at Sandia. -The "LAMMPS WWW Site"_lws at "http://lammps.sandia.gov:_http://lammps.sandia.gov +The [LAMMPS home page] at "http://lammps.sandia.gov"_http://lammps.sandia.gov has more information about the code and its uses. :link(bug,http://lammps.sandia.gov/bug.html) -- GitLab From 4314299be91001cdce758d041476c9507d7b56b3 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 6 Sep 2016 14:50:04 -0400 Subject: [PATCH 05/52] harden fix shear/history against use-after-delete and from incorrect use of reverse communication --- src/fix_shear_history.cpp | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/fix_shear_history.cpp b/src/fix_shear_history.cpp index 2577c16be8..8e8c1bb53b 100644 --- a/src/fix_shear_history.cpp +++ b/src/fix_shear_history.cpp @@ -29,13 +29,13 @@ using namespace LAMMPS_NS; using namespace FixConst; -enum{NPARTNER,PERPARTNER}; +enum{DEFAULT,NPARTNER,PERPARTNER}; /* ---------------------------------------------------------------------- */ FixShearHistory::FixShearHistory(LAMMPS *lmp, int narg, char **arg) : Fix(lmp, narg, arg), - npartner(NULL), partner(NULL), shearpartner(NULL), ipage(NULL), dpage(NULL) + npartner(NULL), partner(NULL), shearpartner(NULL), pair(NULL), ipage(NULL), dpage(NULL) { if (narg != 4) error->all(FLERR,"Illegal fix SHEAR_HISTORY commmand"); @@ -71,6 +71,7 @@ FixShearHistory::FixShearHistory(LAMMPS *lmp, int narg, char **arg) : maxtouch = 0; nlocal_neigh = nall_neigh = 0; + commflag = DEFAULT; } /* ---------------------------------------------------------------------- */ @@ -87,6 +88,14 @@ FixShearHistory::~FixShearHistory() memory->destroy(npartner); memory->sfree(partner); memory->sfree(shearpartner); + + // to better detect use-after-delete errors + + pair = NULL; + npartner = NULL; + partner = NULL; + shearpartner = NULL; + delete [] ipage; delete [] dpage; } @@ -609,7 +618,7 @@ int FixShearHistory::pack_reverse_comm(int n, int first, double *buf) m += dnum; } } - } + } else error->all(FLERR,"Unsupported comm mode in shear history"); return m; } @@ -640,7 +649,7 @@ void FixShearHistory::unpack_reverse_comm(int n, int *list, double *buf) m += dnum; } } - } + } else error->all(FLERR,"Unsupported comm mode in shear history"); } /* ---------------------------------------------------------------------- -- GitLab From fc2d878305382c1760c71422f093cc7f49fdb6d6 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 6 Sep 2016 21:20:47 -0400 Subject: [PATCH 06/52] update manual introduction to represent current status. correct some markup to better pass through sphinx --- doc/html/Manual.html | 12 ++++--- doc/html/Section_accelerate.html | 54 +++++++++++--------------------- doc/html/Section_howto.html | 2 +- doc/src/Manual.txt | 12 ++++--- doc/src/Section_accelerate.txt | 31 +++++++++--------- doc/src/Section_howto.txt | 8 +++-- 6 files changed, 55 insertions(+), 64 deletions(-) diff --git a/doc/html/Manual.html b/doc/html/Manual.html index 84440161a1..2281f57fbd 100644 --- a/doc/html/Manual.html +++ b/doc/html/Manual.html @@ -168,16 +168,20 @@ run efficiently on parallel computers. It was developed at Sandia National Laboratories, a US Department of Energy facility, with funding from the DOE. It is an open-source code, distributed freely under the terms of the GNU Public License (GPL).

    -

    The core group of LAMMPS developers is at Sandia National Labs and Temple University:

    +

    The current core group of LAMMPS developers is at Sandia National +Labs and Temple University:

    • Steve Plimpton, sjplimp at sandia.gov
    • Aidan Thompson, athomps at sandia.gov
    • Stan Moore, stamoore at sandia.gov
    • Axel Kohlmeyer, akohlmey at gmail.com
    -

    Past core developers include Paul Crozier, Ray Shan and Mark Stevens, all at Sandia. -The LAMMPS home page at http://lammps.sandia.gov -has more information about the code and its uses.

    +

    Past core developers include Paul Crozier, Ray Shan and Mark Stevens, +all at Sandia. The LAMMPS home page at +http://lammps.sandia.gov has more information +about the code and its uses. Interaction with external LAMMPS developers, +bug reports and feature requests are mainly coordinated through the +LAMMPS project on GitHub.


    The LAMMPS documentation is organized into the following sections. If you find errors or omissions in this manual or have suggestions for diff --git a/doc/html/Section_accelerate.html b/doc/html/Section_accelerate.html index 9fcd094369..331ea71448 100644 --- a/doc/html/Section_accelerate.html +++ b/doc/html/Section_accelerate.html @@ -346,8 +346,8 @@ package and are explained in the individual accelerator doc pages, listed above:

    --++ @@ -356,40 +356,24 @@ listed above:

    - -
    build the accelerator library
    install the accelerator package make yes-opt, make yes-user-intel, etc
    -
    -
    install the accelerator package | make yes-opt, make yes-user-intel, etc |
    -
    -
    -
    only for USER-INTEL, KOKKOS, USER-OMP, OPT packages |
    - ---- - - + + + + - -
    re-build LAMMPS
    add compile/link flags to Makefile.machine in src/MAKEonly for USER-INTEL, KOKKOS, USER-OMP, OPT packages
    re-build LAMMPS make machine
    -
    -
    re-build LAMMPS | make machine |
    -
    -
    -
    mpirun -np 32 lmp_machine -in in.script |
    -
    -
    only for KOKKOS package |
    -
    -
    package command, <br> -only if defaults need to be changed |
    -
    -
    suffix command |
    - -- - + + + + + + + + + + + +
    prepare and test a regular LAMMPS simulationlmp_machine -in in.script; mpirun -np 32 lmp_machine -in in.script
    enable specific accelerator support via ‘-k on’ command-line switch,only needed for KOKKOS package
    set any needed options for the package via “-pk” command-line switch or package command,only if defaults need to be changed
    use accelerated styles in your input via “-sf” command-line switch or suffix commandlmp_machine -in in.script -sf gpu

    Note that the first 4 steps can be done as a single command, using the @@ -528,7 +512,7 @@ full 16 lanes to each of the PCIe 2.0 16x slots.

  • The GPU package accelerates only pair force, neighbor list, and PPPM calculations.
  • The GPU package requires neighbor lists to be built on the CPU when using -exclusion lists or a triclinic simulation box.
  • +exclusion lists, hybrid pair styles, or a triclinic simulation box. diff --git a/doc/html/Section_howto.html b/doc/html/Section_howto.html index d29a4556f4..9ea709012e 100644 --- a/doc/html/Section_howto.html +++ b/doc/html/Section_howto.html @@ -933,7 +933,7 @@ vectors of a general parallelepiped, where there is no restriction on A x B . C > 0. The equivalent LAMMPS a,b,c are a linear rotation of A, B, and C and can be computed as follows:

    _images/transform.jpg -

    where A = |A| indicates the scalar length of A. The ^ hat symbol +

    where A = |A| indicates the scalar length of A. The hat symbol indicates the corresponding unit vector. beta and gamma are angles between the vectors described below. Note that by construction, a, b, and c have strictly positive x, y, and z components, respectively. diff --git a/doc/src/Manual.txt b/doc/src/Manual.txt index afbb824fd7..ab82bb0716 100644 --- a/doc/src/Manual.txt +++ b/doc/src/Manual.txt @@ -62,7 +62,8 @@ National Laboratories, a US Department of Energy facility, with funding from the DOE. It is an open-source code, distributed freely under the terms of the GNU Public License (GPL). -The core group of LAMMPS developers is at Sandia National Labs and Temple University: +The current core group of LAMMPS developers is at Sandia National +Labs and Temple University: "Steve Plimpton"_sjp, sjplimp at sandia.gov :ulb,l Aidan Thompson, athomps at sandia.gov :l @@ -70,9 +71,12 @@ Stan Moore, stamoore at sandia.gov :l "Axel Kohlmeyer"_ako, akohlmey at gmail.com :l :ulb -Past core developers include Paul Crozier, Ray Shan and Mark Stevens, all at Sandia. -The [LAMMPS home page] at "http://lammps.sandia.gov"_http://lammps.sandia.gov -has more information about the code and its uses. +Past core developers include Paul Crozier, Ray Shan and Mark Stevens, +all at Sandia. The [LAMMPS home page] at +"http://lammps.sandia.gov"_http://lammps.sandia.gov has more information +about the code and its uses. Interaction with external LAMMPS developers, +bug reports and feature requests are mainly coordinated through the +"LAMMPS project on GitHub."_https://github.com/lammps/lammps :link(bug,http://lammps.sandia.gov/bug.html) :link(sjp,http://www.sandia.gov/~sjplimp) diff --git a/doc/src/Section_accelerate.txt b/doc/src/Section_accelerate.txt index e002cbb5f9..9489dee160 100644 --- a/doc/src/Section_accelerate.txt +++ b/doc/src/Section_accelerate.txt @@ -206,24 +206,18 @@ build the accelerator library | only for GPU package | install the accelerator package | make yes-opt, make yes-user-intel, etc | -add compile/link flags to Makefile.machine | - in src/MAKE,
    +add compile/link flags to Makefile.machine in src/MAKE | only for USER-INTEL, KOKKOS, USER-OMP, OPT packages | re-build LAMMPS | make machine | -run a LAMMPS simulation | - lmp_machine < in.script
    - mpirun -np 32 lmp_machine -in in.script | -enable the accelerator package | - via "-c on" and "-k on" "command-line switches"_Section_start.html#start_7,
    - only for KOKKOS package | -set any needed options for the package | - via "-pk" "command-line switch"_Section_start.html#start_7 or - "package"_package.html command,
    +prepare and test a regular LAMMPS simulation | + lmp_machine -in in.script; mpirun -np 32 lmp_machine -in in.script | +enable specific accelerator support via '-k on' "command-line switch"_Section_start.html#start_7, | + only needed for KOKKOS package | +set any needed options for the package via "-pk" "command-line switch"_Section_start.html#start_7 or "package"_package.html command, | only if defaults need to be changed | -use accelerated styles in your input script | - via "-sf" "command-line switch"_Section_start.html#start_7 or - "suffix"_suffix.html command :tb(c=2,s=|) +use accelerated styles in your input via "-sf" "command-line switch"_Section_start.html#start_7 or "suffix"_suffix.html command | lmp_machine -in in.script -sf gpu +:tb(c=2,s=|) Note that the first 4 steps can be done as a single command, using the src/Make.py tool. This tool is discussed in "Section @@ -303,7 +297,8 @@ overload the available bandwidth for communication. :l Styles with an "opt" suffix are part of the OPT package and typically speed-up the pairwise calculations of your simulation by 5-25% on a -CPU. :l,ule +CPU. :l +:ule The individual accelerator package doc pages explain: @@ -369,7 +364,8 @@ and the GPU. Hence its performance is affected if full 16 PCIe lanes are not available for each GPU. In HPC environments this can be the case if S2050/70 servers are used, where two devices generally share one PCIe 2.0 16x slot. Also many multi-GPU mainboards do not provide -full 16 lanes to each of the PCIe 2.0 16x slots. :l,ule +full 16 lanes to each of the PCIe 2.0 16x slots. :l +:ule [Differences between the two packages:] @@ -377,4 +373,5 @@ The GPU package accelerates only pair force, neighbor list, and PPPM calculations. :ulb,l The GPU package requires neighbor lists to be built on the CPU when using -exclusion lists or a triclinic simulation box. :l,ule +exclusion lists, hybrid pair styles, or a triclinic simulation box. :l +:ule diff --git a/doc/src/Section_howto.txt b/doc/src/Section_howto.txt index 13798f8f88..f3283c8360 100644 --- a/doc/src/Section_howto.txt +++ b/doc/src/Section_howto.txt @@ -695,7 +695,8 @@ MD with quantum forces calculated by a density functional code :l lammps_spparks: coupling of LAMMPS and "SPPARKS"_spparks, to couple a kinetic Monte Carlo model for grain growth using MD to calculate -strain induced across grain boundaries :l,ule +strain induced across grain boundaries :l +:ule :link(quest,http://dft.sandia.gov/Quest) :link(spparks,http://www.sandia.gov/~sjplimp/spparks.html) @@ -829,7 +830,7 @@ rotation of [A], [B], and [C] and can be computed as follows: :c,image(Eqs/transform.jpg) -where A = |[A]| indicates the scalar length of [A]. The ^ hat symbol +where A = |[A]| indicates the scalar length of [A]. The hat symbol indicates the corresponding unit vector. {beta} and {gamma} are angles between the vectors described below. Note that by construction, [a], [b], and [c] have strictly positive x, y, and z components, respectively. @@ -1286,7 +1287,8 @@ print"_fix_print.html for single-line output of "variables"_variable.html. Fix print can also output to the screen. :l -"Restart files"_restart.html. :l,ule +"Restart files"_restart.html. :l +:ule A simulation prints one set of thermodynamic output and (optionally) restart files. It can generate any number of dump files and fix -- GitLab From f56c41eec047868f3f3ddfb20d995ce4f654384a Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 6 Sep 2016 21:21:28 -0400 Subject: [PATCH 07/52] update with correct error description. sync with manual. --- src/SHOCK/fix_append_atoms.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/SHOCK/fix_append_atoms.h b/src/SHOCK/fix_append_atoms.h index 1368d164b6..d9885998be 100644 --- a/src/SHOCK/fix_append_atoms.h +++ b/src/SHOCK/fix_append_atoms.h @@ -79,8 +79,7 @@ must be of type m (shrink/minimum). E: Bad fix ID in fix append/atoms command -The value of the fix_id for keyword spatial must start with the suffix -f_. +The value of the fix_id for keyword spatial must start with 'f_'. E: Invalid basis setting in fix append/atoms command -- GitLab From 77620106a43edce0b41849b0edcb0225b4bfa683 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 6 Sep 2016 21:26:50 -0400 Subject: [PATCH 08/52] update colvars library to version 2016-08-05 (cherry picked from commit 459db2eb6b7b5cb93a6479452ca5959a9a73b112) # Conflicts: # doc/src/PDF/colvars-refman-lammps.pdf --- lib/colvars/colvar.cpp | 65 +++++++++++------------ lib/colvars/colvarbias_abf.cpp | 78 ++++++++++++++++++++++++---- lib/colvars/colvarbias_abf.h | 2 + lib/colvars/colvarbias_histogram.cpp | 7 ++- lib/colvars/colvargrid.cpp | 4 +- lib/colvars/colvargrid.h | 44 ++++++++++++++++ lib/colvars/colvarmodule.h | 2 +- 7 files changed, 152 insertions(+), 50 deletions(-) diff --git a/lib/colvars/colvar.cpp b/lib/colvars/colvar.cpp index eec49d1fad..344a9a1301 100644 --- a/lib/colvars/colvar.cpp +++ b/lib/colvars/colvar.cpp @@ -1187,40 +1187,6 @@ cvm::real colvar::update_forces_energy() f -= fj; } - if (is_enabled(f_cv_extended_Lagrangian)) { - - cvm::real dt = cvm::dt(); - cvm::real f_ext; - - // the total force is applied to the fictitious mass, while the - // atoms only feel the harmonic force - // fr: bias force on extended coordinate (without harmonic spring), for output in trajectory - // f_ext: total force on extended coordinate (including harmonic spring) - // f: - initially, external biasing force - // - after this code block, colvar force to be applied to atomic coordinates, ie. spring force - // (note: wall potential is added to f after this block) - fr = f; - f_ext = f + (-0.5 * ext_force_k) * this->dist2_lgrad(xr, x); - f = (-0.5 * ext_force_k) * this->dist2_rgrad(xr, x); - - // leapfrog: starting from x_i, f_i, v_(i-1/2) - vr += (0.5 * dt) * f_ext / ext_mass; - // Because of leapfrog, kinetic energy at time i is approximate - kinetic_energy = 0.5 * ext_mass * vr * vr; - potential_energy = 0.5 * ext_force_k * this->dist2(xr, x); - // leap to v_(i+1/2) - if (is_enabled(f_cv_Langevin)) { - vr -= dt * ext_gamma * vr.real_value; - vr += dt * ext_sigma * cvm::rand_gaussian() / ext_mass; - } - vr += (0.5 * dt) * f_ext / ext_mass; - xr += dt * vr; - xr.apply_constraints(); - if (this->b_periodic) this->wrap(xr); - } - - - // Adding wall potential to "true" colvar force, whether or not an extended coordinate is in use if (is_enabled(f_cv_lower_wall) || is_enabled(f_cv_upper_wall)) { // Wall force @@ -1257,6 +1223,37 @@ cvm::real colvar::update_forces_energy() } } + if (is_enabled(f_cv_extended_Lagrangian)) { + + cvm::real dt = cvm::dt(); + cvm::real f_ext; + + // the total force is applied to the fictitious mass, while the + // atoms only feel the harmonic force + // fr: bias force on extended coordinate (without harmonic spring), for output in trajectory + // f_ext: total force on extended coordinate (including harmonic spring) + // f: - initially, external biasing force + // - after this code block, colvar force to be applied to atomic coordinates, ie. spring force + fr = f; + f_ext = f + (-0.5 * ext_force_k) * this->dist2_lgrad(xr, x); + f = (-0.5 * ext_force_k) * this->dist2_rgrad(xr, x); + + // leapfrog: starting from x_i, f_i, v_(i-1/2) + vr += (0.5 * dt) * f_ext / ext_mass; + // Because of leapfrog, kinetic energy at time i is approximate + kinetic_energy = 0.5 * ext_mass * vr * vr; + potential_energy = 0.5 * ext_force_k * this->dist2(xr, x); + // leap to v_(i+1/2) + if (is_enabled(f_cv_Langevin)) { + vr -= dt * ext_gamma * vr.real_value; + vr += dt * ext_sigma * cvm::rand_gaussian() / ext_mass; + } + vr += (0.5 * dt) * f_ext / ext_mass; + xr += dt * vr; + xr.apply_constraints(); + if (this->b_periodic) this->wrap(xr); + } + f_accumulated += f; if (is_enabled(f_cv_fdiff_velocity)) { diff --git a/lib/colvars/colvarbias_abf.cpp b/lib/colvars/colvarbias_abf.cpp index 648ef9e721..475e4ecef0 100644 --- a/lib/colvars/colvarbias_abf.cpp +++ b/lib/colvars/colvarbias_abf.cpp @@ -12,6 +12,7 @@ colvarbias_abf::colvarbias_abf(char const *key) samples(NULL), z_gradients(NULL), z_samples(NULL), + czar_gradients(NULL), last_gradients(NULL), last_samples(NULL) { @@ -144,6 +145,7 @@ int colvarbias_abf::init(std::string const &conf) z_gradients->request_actual_value(); z_gradients->samples = z_samples; z_samples->has_parent_data = true; + czar_gradients = new colvar_grid_gradient(colvars); } // For shared ABF, we store a second set of grids. @@ -178,6 +180,21 @@ colvarbias_abf::~colvarbias_abf() gradients = NULL; } + if (z_samples) { + delete z_samples; + z_samples = NULL; + } + + if (z_gradients) { + delete z_gradients; + z_gradients = NULL; + } + + if (czar_gradients) { + delete czar_gradients; + czar_gradients = NULL; + } + // shared ABF // We used to only do this if "shared" was defined, // but now we can call shared externally @@ -237,7 +254,11 @@ int colvarbias_abf::update() z_bin[i] = z_samples->current_bin_scalar(i); } if ( z_samples->index_ok(z_bin) ) { - // Set increment flag to 0 to only increment + for (size_t i=0; isystem_force(); + } z_gradients->acc_force(z_bin, force); } } @@ -404,14 +425,10 @@ void colvarbias_abf::write_gradients_samples(const std::string &prefix, bool app { std::string samples_out_name = prefix + ".count"; std::string gradients_out_name = prefix + ".grad"; - std::string z_gradients_out_name = prefix + ".zgrad"; - std::string z_samples_out_name = prefix + ".zcount"; std::ios::openmode mode = (append ? std::ios::app : std::ios::out); cvm::ofstream samples_os; cvm::ofstream gradients_os; - cvm::ofstream z_samples_os; - cvm::ofstream z_gradients_os; if (!append) cvm::backup_file(samples_out_name.c_str()); samples_os.open(samples_out_name.c_str(), mode); @@ -442,6 +459,14 @@ void colvarbias_abf::write_gradients_samples(const std::string &prefix, bool app } if (z_gradients) { + // Write eABF-related quantities + std::string z_samples_out_name = prefix + ".zcount"; + std::string z_gradients_out_name = prefix + ".zgrad"; + std::string czar_gradients_out_name = prefix + ".czar"; + cvm::ofstream z_samples_os; + cvm::ofstream z_gradients_os; + cvm::ofstream czar_gradients_os; + if (!append) cvm::backup_file(z_samples_out_name.c_str()); z_samples_os.open(z_samples_out_name.c_str(), mode); if (!z_samples_os.is_open()) { @@ -458,6 +483,24 @@ void colvarbias_abf::write_gradients_samples(const std::string &prefix, bool app z_gradients->write_multicol(z_gradients_os); z_gradients_os.close(); + // Calculate CZAR estimator of gradients + for (std::vector ix = czar_gradients->new_index(); + czar_gradients->index_ok(ix); czar_gradients->incr(ix)) { + for (size_t n = 0; n < czar_gradients->multiplicity(); n++) { + czar_gradients->set_value(ix, z_gradients->value_output(ix, n) + - cvm::temperature() * cvm::boltzmann() * z_samples->log_gradient_finite_diff(ix, n), + n); + } + } + + if (!append) cvm::backup_file(czar_gradients_out_name.c_str()); + czar_gradients_os.open(czar_gradients_out_name.c_str(), mode); + if (!czar_gradients_os.is_open()) { + cvm::error("Error opening CZAR gradient file " + czar_gradients_out_name + " for writing"); + } + czar_gradients->write_multicol(czar_gradients_os); + czar_gradients_os.close(); + if (colvars.size() == 1) { std::string z_pmf_out_name = prefix + ".zpmf"; if (!append) cvm::backup_file(z_pmf_out_name.c_str()); @@ -468,6 +511,16 @@ void colvarbias_abf::write_gradients_samples(const std::string &prefix, bool app z_gradients->write_1D_integral(z_pmf_os); z_pmf_os << std::endl; z_pmf_os.close(); + + std::string czar_pmf_out_name = prefix + ".czarpmf"; + if (!append) cvm::backup_file(czar_pmf_out_name.c_str()); + cvm::ofstream czar_pmf_os; + // Do numerical integration and output a PMF + czar_pmf_os.open(czar_pmf_out_name.c_str(), mode); + if (!czar_pmf_os.is_open()) cvm::error("Error opening CZAR pmf file " + czar_pmf_out_name + " for writing"); + czar_gradients->write_1D_integral(czar_pmf_os); + czar_pmf_os << std::endl; + czar_pmf_os.close(); } } @@ -545,24 +598,27 @@ std::ostream & colvarbias_abf::write_restart(std::ostream& os) { std::ios::fmtflags flags(os.flags()); - os.setf(std::ios::fmtflags(0), std::ios::floatfield); // default floating-point format os << "abf {\n" << " configuration {\n" << " name " << this->name << "\n"; os << " }\n"; - os << "samples\n"; + os.setf(std::ios::fmtflags(0), std::ios::floatfield); // default floating-point format + os << "\nsamples\n"; samples->write_raw(os, 8); + os.flags(flags); os << "\ngradient\n"; - gradients->write_raw(os); + gradients->write_raw(os, 8); if (z_gradients) { - os << "z_samples\n"; + os.setf(std::ios::fmtflags(0), std::ios::floatfield); // default floating-point format + os << "\nz_samples\n"; z_samples->write_raw(os, 8); + os.flags(flags); os << "\nz_gradient\n"; - z_gradients->write_raw(os); + z_gradients->write_raw(os, 8); } os << "}\n\n"; @@ -638,7 +694,7 @@ std::istream & colvarbias_abf::read_restart(std::istream& is) } if (z_gradients) { - if ( !(is >> key) || !(key == "z_samples")) { + if ( !(is >> key) || !(key == "z_samples")) { cvm::log("Error: in reading restart configuration for ABF bias \""+ this->name+"\" at position "+ cvm::to_str(is.tellg())+" in stream.\n"); diff --git a/lib/colvars/colvarbias_abf.h b/lib/colvars/colvarbias_abf.h index 3527eeb63a..18b9a463b5 100644 --- a/lib/colvars/colvarbias_abf.h +++ b/lib/colvars/colvarbias_abf.h @@ -60,6 +60,8 @@ private: colvar_grid_gradient *z_gradients; /// n-dim grid of number of samples on "real" coordinate for eABF z-based estimator colvar_grid_count *z_samples; + /// n-dim grid contining CZAR estimator of "real" free energy gradients + colvar_grid_gradient *czar_gradients; // shared ABF bool shared_on; diff --git a/lib/colvars/colvarbias_histogram.cpp b/lib/colvars/colvarbias_histogram.cpp index 0d52c18361..542dde2017 100644 --- a/lib/colvars/colvarbias_histogram.cpp +++ b/lib/colvars/colvarbias_histogram.cpp @@ -75,13 +75,12 @@ int colvarbias_histogram::init(std::string const &conf) } grid = new colvar_grid_scalar(); + grid->init_from_colvars(colvars); { std::string grid_conf; if (key_lookup(conf, "grid", grid_conf)) { grid->parse_params(grid_conf); - } else { - grid->init_from_colvars(colvars); } } @@ -256,6 +255,9 @@ std::istream & colvarbias_histogram::read_restart(std::istream& is) std::ostream & colvarbias_histogram::write_restart(std::ostream& os) { + std::ios::fmtflags flags(os.flags()); + os.setf(std::ios::fmtflags(0), std::ios::floatfield); + os << "histogram {\n" << " configuration {\n" << " name " << this->name << "\n"; @@ -266,5 +268,6 @@ std::ostream & colvarbias_histogram::write_restart(std::ostream& os) os << "}\n\n"; + os.flags(flags); return os; } diff --git a/lib/colvars/colvargrid.cpp b/lib/colvars/colvargrid.cpp index 3b07a0b3d5..ca2d935e1c 100644 --- a/lib/colvars/colvargrid.cpp +++ b/lib/colvars/colvargrid.cpp @@ -35,13 +35,13 @@ colvar_grid_scalar::colvar_grid_scalar(colvar_grid_scalar const &g) } colvar_grid_scalar::colvar_grid_scalar(std::vector const &nx_i) - : colvar_grid(nx_i, 0.0, 1), samples(NULL) + : colvar_grid(nx_i, 0.0, 1), samples(NULL), grad(NULL) { grad = new cvm::real[nd]; } colvar_grid_scalar::colvar_grid_scalar(std::vector &colvars, bool margin) - : colvar_grid(colvars, 0.0, 1, margin), samples(NULL) + : colvar_grid(colvars, 0.0, 1, margin), samples(NULL), grad(NULL) { grad = new cvm::real[nd]; } diff --git a/lib/colvars/colvargrid.h b/lib/colvars/colvargrid.h index e00405d278..473348d3e7 100644 --- a/lib/colvars/colvargrid.h +++ b/lib/colvars/colvargrid.h @@ -1160,6 +1160,50 @@ public: } has_data = true; } + + /// \brief Return the log-gradient from finite differences + /// on the *same* grid for dimension n + inline const cvm::real log_gradient_finite_diff( const std::vector &ix0, + int n = 0) + { + cvm::real A0, A1; + std::vector ix; + + // factor for mesh width, 2.0 for central finite difference + // but only 1.0 on edges for non-PBC coordinates + cvm::real factor; + + if (periodic[n]) { + factor = 2.; + ix = ix0; + ix[n]--; wrap(ix); + A0 = data[address(ix)]; + ix = ix0; + ix[n]++; wrap(ix); + A1 = data[address(ix)]; + } else { + factor = 0.; + ix = ix0; + if (ix[n] > 0) { // not left edge + ix[n]--; + factor += 1.; + } + A0 = data[address(ix)]; + ix = ix0; + if (ix[n]+1 < nx[n]) { // not right edge + ix[n]++; + factor += 1.; + } + A1 = data[address(ix)]; + } + if (A0 == 0 || A1 == 0) { + // can't handle empty bins + return 0.; + } else { + return (std::log((cvm::real)A1) - std::log((cvm::real)A0)) + / (widths[n] * factor); + } + } }; diff --git a/lib/colvars/colvarmodule.h b/lib/colvars/colvarmodule.h index e6d21af85b..b8fc01be9e 100644 --- a/lib/colvars/colvarmodule.h +++ b/lib/colvars/colvarmodule.h @@ -4,7 +4,7 @@ #define COLVARMODULE_H #ifndef COLVARS_VERSION -#define COLVARS_VERSION "2016-08-01" +#define COLVARS_VERSION "2016-08-05" #endif #ifndef COLVARS_DEBUG -- GitLab From ec2a6b9f0de31700481738b7de1af93d8f97d992 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 6 Sep 2016 21:27:41 -0400 Subject: [PATCH 09/52] update colvars to version 2016-08-10 (cherry picked from commit f2ddf828e4855f7626f129a00f30be2191a28f16) --- doc/src/PDF/colvars-refman-lammps.pdf | Bin 533229 -> 533480 bytes lib/colvars/colvar.cpp | 178 +++++++++----------------- lib/colvars/colvaratoms.cpp | 12 +- lib/colvars/colvarbias.cpp | 2 +- lib/colvars/colvarbias_histogram.cpp | 4 +- lib/colvars/colvarcomp.cpp | 6 +- lib/colvars/colvardeps.cpp | 8 +- lib/colvars/colvardeps.h | 19 ++- lib/colvars/colvarmodule.cpp | 65 ++++------ lib/colvars/colvarmodule.h | 27 ++-- lib/colvars/colvarparse.cpp | 99 ++++++++++---- lib/colvars/colvarparse.h | 6 + lib/colvars/colvarproxy.h | 10 +- lib/colvars/colvarscript.cpp | 27 ++-- 14 files changed, 222 insertions(+), 241 deletions(-) diff --git a/doc/src/PDF/colvars-refman-lammps.pdf b/doc/src/PDF/colvars-refman-lammps.pdf index d1349fd42439be910d3177c5453da5a6e45ca655..0dd82d47947628d5c55c0481499dcc8b79a4598d 100644 GIT binary patch delta 41952 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

    <6yY$8S%=A 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 yY@}mLz3sVy=RaIAiH!c84{Oh~` delta 41639 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

    C@@;7pDePAN|)mMVypuUHrU48s11{2iI_|v0 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 XXGz-h{mLBjTxJFqT&k+B{%%|VXg?-q diff --git a/lib/colvars/colvar.cpp b/lib/colvars/colvar.cpp index 344a9a1301..49f0285091 100644 --- a/lib/colvars/colvar.cpp +++ b/lib/colvars/colvar.cpp @@ -43,7 +43,8 @@ colvar::colvar(std::string const &conf) kinetic_energy = 0.0; potential_energy = 0.0; - cvm::combine_errors(error_code, init_components(conf)); + error_code |= init_components(conf); + if (error_code != COLVARS_OK) return; size_t i; @@ -492,110 +493,44 @@ int colvar::init_components(std::string const &conf) { int error_code = COLVARS_OK; - cvm::combine_errors(error_code, - init_components_type(conf, - "distance", "distance")); - cvm::combine_errors(error_code, - init_components_type(conf, - "distance vector", "distanceVec")); - cvm::combine_errors(error_code, - init_components_type(conf, - "Cartesian coordinates", "cartesian")); - cvm::combine_errors(error_code, - init_components_type(conf, - "distance vector " - "direction", "distanceDir")); - cvm::combine_errors(error_code, - init_components_type(conf, - "distance projection " - "on an axis", "distanceZ")); - cvm::combine_errors(error_code, - init_components_type(conf, - "distance projection " - "on a plane", "distanceXY")); - cvm::combine_errors(error_code, - init_components_type(conf, - "average distance " - "weighted by inverse power", - "distanceInv")); - cvm::combine_errors(error_code, - init_components_type(conf, - "N1xN2-long vector " - "of pairwise distances", - "distancePairs")); - - cvm::combine_errors(error_code, - init_components_type(conf, - "coordination " - "number", "coordNum")); - cvm::combine_errors(error_code, - init_components_type(conf, - "self-coordination " - "number", "selfCoordNum")); - - cvm::combine_errors(error_code, - init_components_type(conf, - "angle", "angle")); - cvm::combine_errors(error_code, - init_components_type(conf, - "dipole angle", "dipoleAngle")); - cvm::combine_errors(error_code, - init_components_type(conf, - "dihedral", "dihedral")); - - cvm::combine_errors(error_code, - init_components_type(conf, - "hydrogen bond", "hBond")); - - // cvm::combine_errors(error_code, init_components_type(conf, "alpha helix", "alphaDihedrals")); - cvm::combine_errors(error_code, - init_components_type(conf, - "alpha helix", "alpha")); - - cvm::combine_errors(error_code, - init_components_type(conf, - "dihedral " - "principal component", "dihedralPC")); - - cvm::combine_errors(error_code, - init_components_type(conf, - "orientation", "orientation")); - cvm::combine_errors(error_code, - init_components_type(conf, - "orientation " - "angle", "orientationAngle")); - cvm::combine_errors(error_code, - init_components_type(conf, - "orientation " - "projection", "orientationProj")); - cvm::combine_errors(error_code, - init_components_type(conf, - "tilt", "tilt")); - cvm::combine_errors(error_code, - init_components_type(conf, - "spin angle", "spinAngle")); - - cvm::combine_errors(error_code, - init_components_type(conf, - "RMSD", "rmsd")); - - // cvm::combine_errors(error_code, init_components_type (conf,"logarithm of MSD", "logmsd")); - - cvm::combine_errors(error_code, - init_components_type(conf, - "radius of " - "gyration", "gyration")); - cvm::combine_errors(error_code, - init_components_type(conf, - "moment of " - "inertia", "inertia")); - cvm::combine_errors(error_code, - init_components_type(conf, - "moment of inertia around an axis", - "inertiaZ")); - cvm::combine_errors(error_code, - init_components_type(conf, - "eigenvector", "eigenvector")); + error_code |= init_components_type(conf, "distance", "distance"); + error_code |= init_components_type(conf, "distance vector", "distanceVec"); + error_code |= init_components_type(conf, "Cartesian coordinates", "cartesian"); + error_code |= init_components_type(conf, "distance vector " + "direction", "distanceDir"); + error_code |= init_components_type(conf, "distance projection " + "on an axis", "distanceZ"); + error_code |= init_components_type(conf, "distance projection " + "on a plane", "distanceXY"); + error_code |= init_components_type(conf, "average distance " + "weighted by inverse power", "distanceInv"); + error_code |= init_components_type(conf, "N1xN2-long vector " + "of pairwise distances", "distancePairs"); + error_code |= init_components_type(conf, "coordination " + "number", "coordNum"); + error_code |= init_components_type(conf, "self-coordination " + "number", "selfCoordNum"); + error_code |= init_components_type(conf, "angle", "angle"); + error_code |= init_components_type(conf, "dipole angle", "dipoleAngle"); + error_code |= init_components_type(conf, "dihedral", "dihedral"); + error_code |= init_components_type(conf, "hydrogen bond", "hBond"); + error_code |= init_components_type(conf, "alpha helix", "alpha"); + error_code |= init_components_type(conf, "dihedral " + "principal component", "dihedralPC"); + error_code |= init_components_type(conf, "orientation", "orientation"); + error_code |= init_components_type(conf, "orientation " + "angle", "orientationAngle"); + error_code |= init_components_type(conf, "orientation " + "projection", "orientationProj"); + error_code |= init_components_type(conf, "tilt", "tilt"); + error_code |= init_components_type(conf, "spin angle", "spinAngle"); + error_code |= init_components_type(conf, "RMSD", "rmsd"); + error_code |= init_components_type(conf, "radius of " + "gyration", "gyration"); + error_code |= init_components_type(conf, "moment of " + "inertia", "inertia"); + error_code |= init_components_type(conf, "moment of inertia around an axis", "inertiaZ"); + error_code |= init_components_type(conf, "eigenvector", "eigenvector"); if (!cvcs.size() || (error_code != COLVARS_OK)) { cvm::error("Error: no valid components were provided " @@ -732,7 +667,7 @@ int colvar::parse_analysis(std::string const &conf) } else { cvm::log("Unknown type of correlation function, \""+ acf_type_str+"\".\n"); - cvm::set_error_bit(INPUT_ERROR); + cvm::set_error_bits(INPUT_ERROR); } get_keyval(conf, "corrFuncOffset", acf_offset, 0); @@ -803,9 +738,11 @@ int colvar::calc() // Note: if anything is added here, it should be added also in the SMP block of calc_colvars() int error_code = COLVARS_OK; if (is_enabled(f_cv_active)) { - cvm::combine_errors(error_code, update_cvc_flags()); - cvm::combine_errors(error_code, calc_cvcs()); - cvm::combine_errors(error_code, collect_cvc_data()); + error_code |= update_cvc_flags(); + if (error_code != COLVARS_OK) return error_code; + error_code |= calc_cvcs(); + if (error_code != COLVARS_OK) return error_code; + error_code |= collect_cvc_data(); } return error_code; } @@ -818,15 +755,15 @@ int colvar::calc_cvcs(int first_cvc, size_t num_cvcs) cvm::log("Calculating colvar \""+this->name+"\", components "+ cvm::to_str(first_cvc)+" through "+cvm::to_str(first_cvc+num_cvcs)+".\n"); - cvm::combine_errors(error_code, check_cvc_range(first_cvc, num_cvcs)); + error_code |= check_cvc_range(first_cvc, num_cvcs); if (error_code != COLVARS_OK) { return error_code; } - cvm::combine_errors(error_code, calc_cvc_values(first_cvc, num_cvcs)); - cvm::combine_errors(error_code, calc_cvc_gradients(first_cvc, num_cvcs)); - cvm::combine_errors(error_code, calc_cvc_sys_forces(first_cvc, num_cvcs)); - cvm::combine_errors(error_code, calc_cvc_Jacobians(first_cvc, num_cvcs)); + error_code |= calc_cvc_values(first_cvc, num_cvcs); + error_code |= calc_cvc_gradients(first_cvc, num_cvcs); + error_code |= calc_cvc_sys_forces(first_cvc, num_cvcs); + error_code |= calc_cvc_Jacobians(first_cvc, num_cvcs); if (cvm::debug()) cvm::log("Done calculating colvar \""+this->name+"\".\n"); @@ -842,12 +779,11 @@ int colvar::collect_cvc_data() int error_code = COLVARS_OK; - cvm::combine_errors(error_code, collect_cvc_values()); - cvm::combine_errors(error_code, collect_cvc_gradients()); - cvm::combine_errors(error_code, collect_cvc_sys_forces()); - cvm::combine_errors(error_code, collect_cvc_Jacobians()); - - cvm::combine_errors(error_code, calc_colvar_properties()); + error_code |= collect_cvc_values(); + error_code |= collect_cvc_gradients(); + error_code |= collect_cvc_sys_forces(); + error_code |= collect_cvc_Jacobians(); + error_code |= calc_colvar_properties(); if (cvm::debug()) cvm::log("Done calculating colvar \""+this->name+"\"'s properties.\n"); @@ -1374,7 +1310,7 @@ bool colvar::periodic_boundaries(colvarvalue const &lb, colvarvalue const &ub) c if ( (!is_enabled(f_cv_lower_boundary)) || (!is_enabled(f_cv_upper_boundary)) ) { cvm::log("Error: checking periodicity for collective variable \""+this->name+"\" " "requires lower and upper boundaries to be defined.\n"); - cvm::set_error_bit(INPUT_ERROR); + cvm::set_error_bits(INPUT_ERROR); } if (period > 0.0) { diff --git a/lib/colvars/colvaratoms.cpp b/lib/colvars/colvaratoms.cpp index b77576e896..786a72821f 100644 --- a/lib/colvars/colvaratoms.cpp +++ b/lib/colvars/colvaratoms.cpp @@ -297,7 +297,7 @@ int cvm::atom_group::parse(std::string const &conf) std::string numbers_conf = ""; size_t pos = 0; while (key_lookup(group_conf, "atomNumbers", numbers_conf, pos)) { - cvm::combine_errors(parse_error, add_atom_numbers(numbers_conf)); + parse_error |= add_atom_numbers(numbers_conf); numbers_conf = ""; } } @@ -306,7 +306,7 @@ int cvm::atom_group::parse(std::string const &conf) std::string index_group_name; if (get_keyval(group_conf, "indexGroup", index_group_name)) { // use an index group from the index file read globally - cvm::combine_errors(parse_error, add_index_group(index_group_name)); + parse_error |= add_index_group(index_group_name); } } @@ -315,7 +315,7 @@ int cvm::atom_group::parse(std::string const &conf) size_t pos = 0; while (key_lookup(group_conf, "atomNumbersRange", range_conf, pos)) { - cvm::combine_errors(parse_error, add_atom_numbers_range(range_conf)); + parse_error |= add_atom_numbers_range(range_conf); range_conf = ""; } } @@ -342,8 +342,8 @@ int cvm::atom_group::parse(std::string const &conf) cvm::error("Error: more instances of \"atomNameResidueRange\" than " "values of \"psfSegID\".\n", INPUT_ERROR); } else { - cvm::combine_errors(parse_error, add_atom_name_residue_range(psf_segids.size() ? - *psii : std::string(""), range_conf)); + parse_error |= add_atom_name_residue_range(psf_segids.size() ? + *psii : std::string(""), range_conf); if (psf_segids.size()) psii++; } range_conf = ""; @@ -407,7 +407,7 @@ int cvm::atom_group::parse(std::string const &conf) index = (cvm::proxy)->init_atom_group(atoms_ids); } - cvm::combine_errors(parse_error, parse_fitting_options(group_conf)); + parse_error |= parse_fitting_options(group_conf); // TODO move this to colvarparse object check_keywords(group_conf, key.c_str()); diff --git a/lib/colvars/colvarbias.cpp b/lib/colvars/colvarbias.cpp index 90c552ac0b..073cfc3965 100644 --- a/lib/colvars/colvarbias.cpp +++ b/lib/colvars/colvarbias.cpp @@ -203,7 +203,7 @@ cvm::real colvarbias::energy_difference(std::string const &conf) } -// So far, these are only implemented in colvarsbias_abf +// So far, these are only implemented in colvarbias_abf int colvarbias::bin_num() { cvm::error("Error: bin_num() not implemented.\n"); diff --git a/lib/colvars/colvarbias_histogram.cpp b/lib/colvars/colvarbias_histogram.cpp index 542dde2017..15ad5936aa 100644 --- a/lib/colvars/colvarbias_histogram.cpp +++ b/lib/colvars/colvarbias_histogram.cpp @@ -104,7 +104,7 @@ int colvarbias_histogram::update() { int error_code = COLVARS_OK; // update base class - cvm::combine_errors(error_code, colvarbias::update()); + error_code |= colvarbias::update(); if (cvm::debug()) { cvm::log("Updating histogram bias " + this->name); @@ -157,7 +157,7 @@ int colvarbias_histogram::update() write_output_files(); } - cvm::combine_errors(error_code, cvm::get_error()); + error_code |= cvm::get_error(); return error_code; } diff --git a/lib/colvars/colvarcomp.cpp b/lib/colvars/colvarcomp.cpp index eec43d0963..89973516be 100644 --- a/lib/colvars/colvarcomp.cpp +++ b/lib/colvars/colvarcomp.cpp @@ -43,11 +43,7 @@ colvar::cvc::cvc(std::string const &conf) // All cvcs implement this provide(f_cvc_debug_gradient); - { - bool b_debug_gradient; - get_keyval(conf, "debugGradients", b_debug_gradient, false, parse_silent); - if (b_debug_gradient) enable(f_cvc_debug_gradient); - } + get_keyval(conf, "debugGradients", set_feature(f_cvc_debug_gradient), false, parse_silent); // Attempt scalable calculations when in parallel? (By default yes, if available) get_keyval(conf, "scalable", b_try_scalable, true); diff --git a/lib/colvars/colvardeps.cpp b/lib/colvars/colvardeps.cpp index eabb67de4c..2801abb191 100644 --- a/lib/colvars/colvardeps.cpp +++ b/lib/colvars/colvardeps.cpp @@ -215,7 +215,7 @@ void cvm::deps::init_cvb_requires() { // Initialize feature_states for each instance feature_states.reserve(f_cvb_ntot); for (i = 0; i < f_cvb_ntot; i++) { - feature_states.push_back(new feature_state(true, false)); + feature_states.push_back(new feature_state(this, feature_states.size(), true, false)); // Most features are available, so we set them so // and list exceptions below } @@ -319,7 +319,7 @@ void cvm::deps::init_cv_requires() { // Initialize feature_states for each instance feature_states.reserve(f_cv_ntot); for (i = 0; i < f_cv_ntot; i++) { - feature_states.push_back(new feature_state(true, false)); + feature_states.push_back(new feature_state(this, feature_states.size(), true, false)); // Most features are available, so we set them so // and list exceptions below } @@ -385,7 +385,7 @@ void cvm::deps::init_cvc_requires() { // default as unavailable, not enabled feature_states.reserve(f_cvc_ntot); for (i = 0; i < cvm::deps::f_cvc_ntot; i++) { - feature_states.push_back(new feature_state(false, false)); + feature_states.push_back(new feature_state(this, feature_states.size(), false, false)); } // Features that are implemented by all cvcs by default @@ -429,7 +429,7 @@ void cvm::deps::init_ag_requires() { // default as unavailable, not enabled feature_states.reserve(f_ag_ntot); for (i = 0; i < cvm::deps::f_ag_ntot; i++) { - feature_states.push_back(new feature_state(false, false)); + feature_states.push_back(new feature_state(this, feature_states.size(), false, false)); } // Features that are implemented (or not) by all atom groups diff --git a/lib/colvars/colvardeps.h b/lib/colvars/colvardeps.h index 8787819b45..2aed77be50 100644 --- a/lib/colvars/colvardeps.h +++ b/lib/colvars/colvardeps.h @@ -27,9 +27,16 @@ public: std::string description; // reference to object name (cv, cvc etc.) /// This contains the current state of each feature for each object - struct feature_state { - feature_state(bool a, bool e) - : available(a), enabled(e) {} + class feature_state { + private: + cvm::deps *const deps_object; + int const id; + operator int() {} // never cast as int + public: + inline cvm::deps *object() const { return deps_object; } + inline int feature_id() const { return id; } + feature_state(cvm::deps *o, int i, bool a, bool e) + : deps_object(o), id(i), available(a), enabled(e) {} /// Available means: supported, subject to dependencies as listed, /// MAY BE ENABLED AS A RESULT OF DEPENDENCY SOLVING @@ -48,6 +55,12 @@ public: /// List of the state of all features std::vector feature_states; + /// Allow setting a feature state while parsing its kewyord + inline feature_state * set_feature(int id) + { + return feature_states[id]; + } + /// Describes a feature and its dependecies /// used in a static array within each subclass class feature { diff --git a/lib/colvars/colvarmodule.cpp b/lib/colvars/colvarmodule.cpp index 9317c421ed..4537c09509 100644 --- a/lib/colvars/colvarmodule.cpp +++ b/lib/colvars/colvarmodule.cpp @@ -340,8 +340,8 @@ int colvarmodule::parse_biases(std::string const &conf) int colvarmodule::catch_input_errors(int result) { if (result != COLVARS_OK || get_error()) { - set_error_bit(result); - set_error_bit(INPUT_ERROR); + set_error_bits(result); + set_error_bits(INPUT_ERROR); parse->init(); return get_error(); } @@ -493,27 +493,27 @@ int colvarmodule::calc() cvm::to_str(cvm::step_absolute())+"\n"); } - combine_errors(error_code, calc_colvars()); + error_code |= calc_colvars(); // set biasing forces to zero before biases are calculated and summed over for (std::vector::iterator cvi = colvars.begin(); cvi != colvars.end(); cvi++) { (*cvi)->reset_bias_force(); } - combine_errors(error_code, calc_biases()); - combine_errors(error_code, update_colvar_forces()); + error_code |= calc_biases(); + error_code |= update_colvar_forces(); if (cvm::b_analysis) { - combine_errors(error_code, analyze()); + error_code |= analyze(); } // write trajectory files, if needed if (cv_traj_freq && cv_traj_name.size()) { - combine_errors(error_code, write_traj_files()); + error_code |= write_traj_files(); } // write restart files, if needed if (restart_out_freq && restart_out_name.size()) { - combine_errors(error_code, write_restart_files()); + error_code |= write_restart_files(); } return error_code; @@ -551,7 +551,7 @@ int colvarmodule::calc_colvars() for (cvi = colvars.begin(); cvi != colvars.end(); cvi++) { if (!(*cvi)->is_enabled()) continue; - combine_errors(error_code, (*cvi)->update_cvc_flags()); + error_code |= (*cvi)->update_cvc_flags(); size_t num_items = (*cvi)->num_active_cvcs(); colvars_smp.reserve(colvars_smp.size() + num_items); @@ -566,12 +566,12 @@ int colvarmodule::calc_colvars() cvm::decrease_depth(); // calculate colvar components in parallel - combine_errors(error_code, proxy->smp_colvars_loop()); + error_code |= proxy->smp_colvars_loop(); cvm::increase_depth(); for (cvi = colvars.begin(); cvi != colvars.end(); cvi++) { if (!(*cvi)->is_enabled()) continue; - combine_errors(error_code, (*cvi)->collect_cvc_data()); + error_code |= (*cvi)->collect_cvc_data(); } cvm::decrease_depth(); @@ -581,7 +581,7 @@ int colvarmodule::calc_colvars() cvm::increase_depth(); for (cvi = colvars.begin(); cvi != colvars.end(); cvi++) { if (!(*cvi)->is_enabled()) continue; - combine_errors(error_code, (*cvi)->calc()); + error_code |= (*cvi)->calc(); if (cvm::get_error()) { return COLVARS_ERROR; } @@ -589,7 +589,7 @@ int colvarmodule::calc_colvars() cvm::decrease_depth(); } - combine_errors(error_code, cvm::get_error()); + error_code |= cvm::get_error(); return error_code; } @@ -609,21 +609,21 @@ int colvarmodule::calc_biases() if (use_scripted_forces && !scripting_after_biases) { // calculate biases and scripted forces in parallel - combine_errors(error_code, proxy->smp_biases_script_loop()); + error_code |= proxy->smp_biases_script_loop(); } else { // calculate biases in parallel - combine_errors(error_code, proxy->smp_biases_loop()); + error_code |= proxy->smp_biases_loop(); } } else { if (use_scripted_forces && !scripting_after_biases) { - combine_errors(error_code, calc_scripted_forces()); + error_code |= calc_scripted_forces(); } cvm::increase_depth(); for (bi = biases.begin(); bi != biases.end(); bi++) { - combine_errors(error_code, (*bi)->update()); + error_code |= (*bi)->update(); if (cvm::get_error()) { return COLVARS_ERROR; } @@ -661,7 +661,7 @@ int colvarmodule::update_colvar_forces() cvm::decrease_depth(); if (use_scripted_forces && scripting_after_biases) { - combine_errors(error_code, calc_scripted_forces()); + error_code |= calc_scripted_forces(); } cvm::real total_colvar_energy = 0.0; @@ -913,17 +913,17 @@ int colvarmodule::setup_output() std::string("")); if (cv_traj_freq && cv_traj_name.size()) { - combine_errors(error_code, open_traj_file(cv_traj_name)); + error_code |= open_traj_file(cv_traj_name); } for (std::vector::iterator bi = biases.begin(); bi != biases.end(); bi++) { - combine_errors(error_code, (*bi)->setup_output()); + error_code |= (*bi)->setup_output(); } if (error_code != COLVARS_OK || cvm::get_error()) { - set_error_bit(FILE_ERROR); + set_error_bits(FILE_ERROR); } return (cvm::get_error() ? COLVARS_ERROR : COLVARS_OK); @@ -1259,29 +1259,20 @@ size_t & cvm::depth() } -void colvarmodule::set_error_bit(int code) +void colvarmodule::set_error_bits(int code) { - if (code > 0) { - cvm::fatal_error("Error: set_error_bit() received positive error code.\n"); + if (code < 0) { + cvm::fatal_error("Error: set_error_bits() received negative error code.\n"); return; } proxy->smp_lock(); - errorCode = -1 * ((-1 * errorCode) | (-1 * code) | (-1 * COLVARS_ERROR)); + errorCode |= code | COLVARS_ERROR; proxy->smp_unlock(); } bool colvarmodule::get_error_bit(int code) { - return bool((-1 * errorCode) & (-1 * code)); -} - -void colvarmodule::combine_errors(int &target, int const code) -{ - if (code > 0 || target > 0) { - cvm::fatal_error("Error: combine_errors() received positive error code.\n"); - return; - } - target = -1 * ((-1 * target) | (-1 * code)); + return bool(errorCode & code); } void colvarmodule::clear_error() @@ -1294,7 +1285,7 @@ void colvarmodule::clear_error() void cvm::error(std::string const &message, int code) { - set_error_bit(code); + set_error_bits(code); proxy->error(message); } @@ -1303,7 +1294,7 @@ void cvm::fatal_error(std::string const &message) { // TODO once all non-fatal errors have been set to be handled by error(), // set DELETE_COLVARS here for VMD to handle it - set_error_bit(FATAL_ERROR); + set_error_bits(FATAL_ERROR); proxy->fatal_error(message); } diff --git a/lib/colvars/colvarmodule.h b/lib/colvars/colvarmodule.h index b8fc01be9e..516f968769 100644 --- a/lib/colvars/colvarmodule.h +++ b/lib/colvars/colvarmodule.h @@ -4,7 +4,7 @@ #define COLVARMODULE_H #ifndef COLVARS_VERSION -#define COLVARS_VERSION "2016-08-05" +#define COLVARS_VERSION "2016-08-10" #endif #ifndef COLVARS_DEBUG @@ -23,19 +23,16 @@ /// shared between all object instances) to be accessed from other /// objects. -// Error codes are the negative of powers-of-two -// as a result, error codes should NOT be bitwise-ORed but only -// accessed through set_error_bit() and get_error_bit() #define COLVARS_OK 0 -#define COLVARS_ERROR -1 -#define COLVARS_NOT_IMPLEMENTED (-1*(1<<1)) -#define INPUT_ERROR (-1*(1<<2)) // out of bounds or inconsistent input -#define BUG_ERROR (-1*(1<<3)) // Inconsistent state indicating bug -#define FILE_ERROR (-1*(1<<4)) -#define MEMORY_ERROR (-1*(1<<5)) -#define FATAL_ERROR (-1*(1<<6)) // Should be set, or not, together with other bits -#define DELETE_COLVARS (-1*(1<<7)) // Instruct the caller to delete cvm -#define COLVARS_NO_SUCH_FRAME (-1*(1<<8)) // Cannot load the requested frame +#define COLVARS_ERROR 1 +#define COLVARS_NOT_IMPLEMENTED (1<<1) +#define INPUT_ERROR (1<<2) // out of bounds or inconsistent input +#define BUG_ERROR (1<<3) // Inconsistent state indicating bug +#define FILE_ERROR (1<<4) +#define MEMORY_ERROR (1<<5) +#define FATAL_ERROR (1<<6) // Should be set, or not, together with other bits +#define DELETE_COLVARS (1<<7) // Instruct the caller to delete cvm +#define COLVARS_NO_SUCH_FRAME (1<<8) // Cannot load the requested frame #include #include @@ -118,12 +115,10 @@ protected: public: - static void set_error_bit(int code); + static void set_error_bits(int code); static bool get_error_bit(int code); - static void combine_errors(int &target, int const code); - static inline int get_error() { return errorCode; diff --git a/lib/colvars/colvarparse.cpp b/lib/colvars/colvarparse.cpp index f6e904c83a..da39f78356 100644 --- a/lib/colvars/colvarparse.cpp +++ b/lib/colvars/colvarparse.cpp @@ -354,6 +354,21 @@ bool colvarparse::get_keyval(std::string const &conf, } +bool colvarparse::get_keyval(std::string const &conf, + char const *key, + cvm::deps::feature_state *value, + bool const &def_value, + Parse_Mode const parse_mode) +{ + bool feature_flag = def_value; + bool const b_found = get_keyval(conf, key, feature_flag, def_value, parse_mode); + if (feature_flag) { + value->object()->enable(value->feature_id()); + } + return b_found; +} + + // multiple-value keyword parsers bool colvarparse::get_keyval(std::string const &conf, @@ -548,6 +563,10 @@ bool colvarparse::key_lookup(std::string const &conf, std::string &data, size_t &save_pos) { + if (cvm::debug()) { + cvm::log("Looking for the keyword \""+std::string(key_in)+"\" and its value.\n"); + } + // add this keyword to the register (in its camelCase version) add_keyword(key_in); @@ -568,11 +587,14 @@ bool colvarparse::key_lookup(std::string const &conf, // start from the first occurrence of key size_t pos = conf_lower.find(key, save_pos); - // iterate over all instances until it finds the isolated keyword + // iterate over all instances of the substring until it finds it as isolated keyword while (true) { if (pos == std::string::npos) { // no valid instance of the keyword has been found + if (cvm::debug()) { + cvm::log("Keyword \""+std::string(key_in)+"\" not found.\n"); + } return false; } @@ -625,25 +647,46 @@ bool colvarparse::key_lookup(std::string const &conf, size_t data_begin = (to_lower_cppstr(line)).find(key) + key.size(); data_begin = line.find_first_not_of(white_space, data_begin+1); - // size_t data_begin_absolute = data_begin + line_begin; - // size_t data_end_absolute = data_begin; - if (data_begin != std::string::npos) { size_t data_end = line.find_last_not_of(white_space) + 1; data_end = (data_end == std::string::npos) ? line.size() : data_end; - // data_end_absolute = data_end + line_begin; - if (line.find('{', data_begin) != std::string::npos) { + size_t brace = line.find('{', data_begin); // look for an opening brace + size_t brace_last = brace; + + if (brace != std::string::npos) { + + // find the matching closing brace - size_t brace_count = 1; - size_t brace = line.find('{', data_begin); // start from the first opening brace + if (cvm::debug()) { + cvm::log("Multi-line value, config is now \""+line+"\".\n"); + } + + int brace_count = 1; while (brace_count > 0) { - // find the matching closing brace - brace = line.find_first_of("{}", brace+1); - while (brace == std::string::npos) { + brace = line.find_first_of("{}", brace_last+1); + // find all braces within this line + while (brace < std::string::npos) { + brace_last = brace; + if (line[brace] == '{') brace_count++; + if (line[brace] == '}') brace_count--; + if (brace_count == 0) { + data_end = brace+1; + break; + } + brace = line.find_first_of("{}", brace+1); + } + + if (brace_count == 0) { + data_end = brace+1; + break; + } + + if (brace == std::string::npos) { + // add a new line if (line_end >= conf.size()) { cvm::error("Parse error: reached the end while " @@ -653,7 +696,6 @@ bool colvarparse::key_lookup(std::string const &conf, return false; } size_t const old_end = line.size(); - // data_end_absolute += old_end+1; line_begin = line_end; nl = conf.find('\n', line_begin+1); @@ -663,36 +705,37 @@ bool colvarparse::key_lookup(std::string const &conf, line_end = nl; line.append(conf, line_begin, (line_end-line_begin)); - brace = line.find_first_of("{}", old_end); + if (cvm::debug()) { + cvm::log("Added a new line, config is now \""+line+"\".\n"); + } } - if (line[brace] == '{') brace_count++; - if (line[brace] == '}') brace_count--; + if (brace_count < 0) { + cvm::error("Error: found closing brace without opening brace.\n", INPUT_ERROR); + } } - // set data_begin after the opening brace - data_begin = line.find_first_of('{', data_begin) + 1; + cvm::log("Value so far = "+line.substr(data_begin, (data_end-data_begin))+".\n"); + + // strip the leading and trailing braces + data_begin = line.find_first_of('{') + 1; data_begin = line.find_first_not_of(white_space, data_begin); - // set data_end before the closing brace - data_end = brace; - data_end = line.find_last_not_of(white_space+"}", - data_end) + 1; - // data_end_absolute = line_end; - if (data_end > line.size()) - data_end = line.size(); + data_end = line.find_last_of('}', line.size()) - 1; + data_end = line.find_last_not_of(white_space, + data_end) + 1; } data.append(line, data_begin, (data_end-data_begin)); + if (cvm::debug()) { + cvm::log("Keyword value = \""+data+"\".\n"); + } + if (data.size() && save_delimiters) { data_begin_pos.push_back(conf.find(data, pos+key.size())); data_end_pos.push_back(data_begin_pos.back()+data.size()); - // std::cerr << "key = " << key << ", data = \"" - // << data << "\", data_begin, data_end = " - // << data_begin_pos.back() << ", " << data_end_pos.back() - // << "\n"; } } diff --git a/lib/colvars/colvarparse.h b/lib/colvars/colvarparse.h index 9bce5412ed..c091cbc15d 100644 --- a/lib/colvars/colvarparse.h +++ b/lib/colvars/colvarparse.h @@ -8,6 +8,7 @@ #include "colvarmodule.h" #include "colvarvalue.h" +#include "colvardeps.h" /// \file colvarparse.h Parsing functions for collective variables @@ -180,6 +181,11 @@ public: bool &value, bool const &def_value = false, Parse_Mode const parse_mode = parse_normal); + bool get_keyval(std::string const &conf, + char const *key, + cvm::deps::feature_state *value, + bool const &def_value = false, + Parse_Mode const parse_mode = parse_normal); bool get_keyval(std::string const &conf, char const *key, diff --git a/lib/colvars/colvarproxy.h b/lib/colvars/colvarproxy.h index 0d29a7297d..4bba189bb7 100644 --- a/lib/colvars/colvarproxy.h +++ b/lib/colvars/colvarproxy.h @@ -69,12 +69,12 @@ public: virtual cvm::real rand_gaussian(void) = 0; /// \brief Get the current frame number - // Negative return values indicate error - virtual int frame() { return COLVARS_NOT_IMPLEMENTED; } + // Returns error code + virtual int get_frame(long int&) { return COLVARS_NOT_IMPLEMENTED; } - /// \brief Set the current frame number - // return frame number on success, COLVARS_NO_SUCH_FRAME otherwise - virtual int frame(int) { return COLVARS_NOT_IMPLEMENTED; } + /// \brief Set the current frame number (as well as colvarmodule::it) + // Returns error code + virtual int set_frame(long int) { return COLVARS_NOT_IMPLEMENTED; } /// \brief Prefix to be used for input files (restarts, not /// configuration) diff --git a/lib/colvars/colvarscript.cpp b/lib/colvars/colvarscript.cpp index 091162fc18..374359ccef 100644 --- a/lib/colvars/colvarscript.cpp +++ b/lib/colvars/colvarscript.cpp @@ -55,14 +55,14 @@ int colvarscript::run(int argc, char const *argv[]) { if (cmd == "delete") { // Note: the delete bit may be ignored by some backends // it is mostly useful in VMD - colvars->set_error_bit(DELETE_COLVARS); + colvars->set_error_bits(DELETE_COLVARS); return COLVARS_OK; } if (cmd == "update") { - cvm::combine_errors(error_code, proxy->update_input()); - cvm::combine_errors(error_code, colvars->calc()); - cvm::combine_errors(error_code, proxy->update_output()); + error_code |= proxy->update_input(); + error_code |= colvars->calc(); + error_code |= proxy->update_output(); if (error_code) { result += "Error updating the colvars module.\n"; } @@ -142,8 +142,8 @@ int colvarscript::run(int argc, char const *argv[]) { } proxy->output_prefix_str = argv[2]; int error = 0; - cvm::combine_errors(error, colvars->setup_output()); - cvm::combine_errors(error, colvars->write_output_files()); + error |= colvars->setup_output(); + error |= colvars->write_output_files(); return error ? COLVARSCRIPT_ERROR : COLVARS_OK; } @@ -163,8 +163,9 @@ int colvarscript::run(int argc, char const *argv[]) { if (cmd == "frame") { if (argc == 2) { - int f = proxy->frame(); - if (f >= 0) { + long int f; + int error = proxy->get_frame(f); + if (error == COLVARS_OK) { result = cvm::to_str(f); return COLVARS_OK; } else { @@ -173,10 +174,9 @@ int colvarscript::run(int argc, char const *argv[]) { } } else if (argc == 3) { // Failure of this function does not trigger an error, but - // returns the plain result to let scripts detect available frames - long int f = proxy->frame(strtol(argv[2], NULL, 10)); - colvars->it = proxy->frame(); - result = cvm::to_str(f); + // returns nonzero, to let scripts detect available frames + int error = proxy->set_frame(strtol(argv[2], NULL, 10)); + result = cvm::to_str(error == COLVARS_OK ? 0 : -1); return COLVARS_OK; } else { result = "Wrong arguments to command \"frame\"\n" + help_string(); @@ -414,7 +414,8 @@ Input and output:\n\ printframe -- return a summary of the current frame\n\ printframelabels -- return labels to annotate printframe's output\n"; - if (proxy->frame() != COLVARS_NOT_IMPLEMENTED) { + long int tmp; + if (proxy->get_frame(tmp) != COLVARS_NOT_IMPLEMENTED) { buf += "\ frame -- return current frame number\n\ frame -- set frame number\n"; -- GitLab From 3d2e5d0a5031a2e1033c3b0d899fe6f8ef5be3c2 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 10 Aug 2016 09:12:51 -0400 Subject: [PATCH 10/52] suppress compiler warning (cherry picked from commit 6f227e194e1f3a13e906b67b6c0a1fa7599a23c7) --- lib/colvars/colvardeps.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/colvars/colvardeps.h b/lib/colvars/colvardeps.h index 2aed77be50..9c86f6028b 100644 --- a/lib/colvars/colvardeps.h +++ b/lib/colvars/colvardeps.h @@ -31,7 +31,7 @@ public: private: cvm::deps *const deps_object; int const id; - operator int() {} // never cast as int + operator int() { return 0; } // never cast as int public: inline cvm::deps *object() const { return deps_object; } inline int feature_id() const { return id; } -- GitLab From 1b33d00785b9d9b857cef4954bfc98ab08f9475a Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 10 Aug 2016 09:13:08 -0400 Subject: [PATCH 11/52] update colvars makefile dependencies (cherry picked from commit df99a85930a8e77f6e7741b334c2e61b557c1b28) --- lib/colvars/Makefile.fermi | 66 ++++++++++++++++-------------- lib/colvars/Makefile.g++ | 62 +++++++++++++++------------- lib/colvars/Makefile.mingw32-cross | 66 ++++++++++++++++-------------- lib/colvars/Makefile.mingw64-cross | 66 ++++++++++++++++-------------- 4 files changed, 138 insertions(+), 122 deletions(-) diff --git a/lib/colvars/Makefile.fermi b/lib/colvars/Makefile.fermi index fe8d3ac16c..e17798bbc3 100644 --- a/lib/colvars/Makefile.fermi +++ b/lib/colvars/Makefile.fermi @@ -54,58 +54,62 @@ colvars_standalone: colvars_main.o colvarproxy_standalone.o $(LIB) # ------ DEPENDENCIES ------ # colvaratoms.o: colvaratoms.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarparse.h colvarvalue.h colvaratoms.h + colvarvalue.h colvarparse.h colvardeps.h colvaratoms.h colvarbias_abf.o: colvarbias_abf.cpp colvarmodule.h colvartypes.h \ - colvarproxy.h colvar.h colvarvalue.h colvarparse.h colvarbias_abf.h \ - colvarbias.h colvargrid.h + colvarproxy.h colvarvalue.h colvar.h colvarparse.h colvardeps.h \ + colvarbias_abf.h colvarbias.h colvargrid.h colvarbias_alb.o: colvarbias_alb.cpp colvarmodule.h colvartypes.h \ - colvarproxy.h colvarbias_alb.h colvar.h colvarvalue.h colvarparse.h \ - colvarbias_restraint.h colvarbias.h + colvarproxy.h colvarvalue.h colvarbias_alb.h colvar.h colvarparse.h \ + colvardeps.h colvarbias_restraint.h colvarbias.h colvarbias.o: colvarbias.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarbias.h colvar.h colvarparse.h + colvarvalue.h colvarbias.h colvar.h colvarparse.h colvardeps.h colvarbias_histogram.o: colvarbias_histogram.cpp colvarmodule.h \ colvartypes.h colvarproxy.h colvarvalue.h colvar.h colvarparse.h \ - colvarbias_histogram.h colvarbias.h colvargrid.h + colvardeps.h colvarbias_histogram.h colvarbias.h colvargrid.h colvarbias_meta.o: colvarbias_meta.cpp colvar.h colvarmodule.h \ - colvartypes.h colvarproxy.h colvarvalue.h colvarparse.h \ + colvartypes.h colvarproxy.h colvarvalue.h colvarparse.h colvardeps.h \ colvarbias_meta.h colvarbias.h colvargrid.h colvarbias_restraint.o: colvarbias_restraint.cpp colvarmodule.h \ colvartypes.h colvarproxy.h colvarvalue.h colvarbias_restraint.h \ - colvarbias.h colvar.h colvarparse.h + colvarbias.h colvar.h colvarparse.h colvardeps.h colvarcomp_angles.o: colvarcomp_angles.cpp colvarmodule.h colvartypes.h \ - colvarproxy.h colvar.h colvarvalue.h colvarparse.h colvarcomp.h \ - colvaratoms.h + colvarproxy.h colvarvalue.h colvar.h colvarparse.h colvardeps.h \ + colvarcomp.h colvaratoms.h colvarcomp_coordnums.o: colvarcomp_coordnums.cpp colvarmodule.h \ - colvartypes.h colvarproxy.h colvarparse.h colvarvalue.h colvaratoms.h \ - colvar.h colvarcomp.h + colvartypes.h colvarproxy.h colvarvalue.h colvarparse.h colvardeps.h \ + colvaratoms.h colvar.h colvarcomp.h colvarcomp.o: colvarcomp.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvar.h colvarparse.h colvarcomp.h colvaratoms.h + colvarvalue.h colvar.h colvarparse.h colvardeps.h colvarcomp.h \ + colvaratoms.h colvarcomp_distances.o: colvarcomp_distances.cpp colvarmodule.h \ - colvartypes.h colvarproxy.h colvarvalue.h colvarparse.h colvar.h \ - colvarcomp.h colvaratoms.h + colvartypes.h colvarproxy.h colvarvalue.h colvarparse.h colvardeps.h \ + colvar.h colvarcomp.h colvaratoms.h colvarcomp_protein.o: colvarcomp_protein.cpp colvarmodule.h colvartypes.h \ - colvarproxy.h colvarvalue.h colvarparse.h colvar.h colvarcomp.h \ - colvaratoms.h -colvarcomp_rotations.o: colvarcomp_rotations.cpp colvarmodule.h \ - colvartypes.h colvarproxy.h colvarvalue.h colvarparse.h colvar.h \ + colvarproxy.h colvarvalue.h colvarparse.h colvardeps.h colvar.h \ colvarcomp.h colvaratoms.h +colvarcomp_rotations.o: colvarcomp_rotations.cpp colvarmodule.h \ + colvartypes.h colvarproxy.h colvarvalue.h colvarparse.h colvardeps.h \ + colvar.h colvarcomp.h colvaratoms.h colvar.o: colvar.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarparse.h colvar.h colvarcomp.h colvaratoms.h \ - colvarscript.h colvarbias.h + colvarvalue.h colvarparse.h colvardeps.h colvar.h colvarcomp.h \ + colvaratoms.h colvarscript.h colvarbias.h +colvardeps.o: colvardeps.cpp colvarmodule.h colvartypes.h colvarproxy.h \ + colvarvalue.h colvardeps.h colvargrid.o: colvargrid.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarparse.h colvar.h colvarcomp.h colvaratoms.h \ - colvargrid.h + colvarvalue.h colvarparse.h colvardeps.h colvar.h colvarcomp.h \ + colvaratoms.h colvargrid.h colvarmodule.o: colvarmodule.cpp colvarmodule.h colvartypes.h \ - colvarproxy.h colvarvalue.h colvarparse.h colvar.h colvarbias.h \ - colvarbias_abf.h colvargrid.h colvarbias_alb.h colvarbias_restraint.h \ - colvarbias_histogram.h colvarbias_meta.h colvarscript.h + colvarproxy.h colvarvalue.h colvarparse.h colvardeps.h colvar.h \ + colvarbias.h colvarbias_abf.h colvargrid.h colvarbias_alb.h \ + colvarbias_restraint.h colvarbias_histogram.h colvarbias_meta.h \ + colvarscript.h colvarparse.o: colvarparse.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarparse.h + colvarvalue.h colvarparse.h colvardeps.h colvarscript.o: colvarscript.cpp colvarscript.h colvarmodule.h \ - colvartypes.h colvarproxy.h colvarvalue.h colvar.h colvarparse.h \ - colvarbias.h + colvartypes.h colvarproxy.h colvarvalue.h colvarbias.h colvar.h \ + colvarparse.h colvardeps.h colvartypes.o: colvartypes.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarparse.h colvarvalue.h + colvarvalue.h colvarparse.h colvardeps.h colvarvalue.o: colvarvalue.cpp colvarmodule.h colvartypes.h colvarproxy.h \ colvarvalue.h diff --git a/lib/colvars/Makefile.g++ b/lib/colvars/Makefile.g++ index d0fdd1c325..f1fa1734b9 100644 --- a/lib/colvars/Makefile.g++ +++ b/lib/colvars/Makefile.g++ @@ -53,58 +53,62 @@ colvars_standalone: colvars_main.o colvarproxy_standalone.o $(LIB) # ------ DEPENDENCIES ------ # colvaratoms.o: colvaratoms.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarparse.h colvaratoms.h + colvarvalue.h colvarparse.h colvardeps.h colvaratoms.h colvarbias_abf.o: colvarbias_abf.cpp colvarmodule.h colvartypes.h \ - colvarproxy.h colvarvalue.h colvar.h colvarparse.h colvarbias_abf.h \ - colvarbias.h colvargrid.h + colvarproxy.h colvarvalue.h colvar.h colvarparse.h colvardeps.h \ + colvarbias_abf.h colvarbias.h colvargrid.h colvarbias_alb.o: colvarbias_alb.cpp colvarmodule.h colvartypes.h \ colvarproxy.h colvarvalue.h colvarbias_alb.h colvar.h colvarparse.h \ - colvarbias_restraint.h colvarbias.h + colvardeps.h colvarbias_restraint.h colvarbias.h colvarbias.o: colvarbias.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarbias.h colvar.h colvarparse.h + colvarvalue.h colvarbias.h colvar.h colvarparse.h colvardeps.h colvarbias_histogram.o: colvarbias_histogram.cpp colvarmodule.h \ colvartypes.h colvarproxy.h colvarvalue.h colvar.h colvarparse.h \ - colvarbias_histogram.h colvarbias.h colvargrid.h + colvardeps.h colvarbias_histogram.h colvarbias.h colvargrid.h colvarbias_meta.o: colvarbias_meta.cpp colvar.h colvarmodule.h \ - colvartypes.h colvarproxy.h colvarvalue.h colvarparse.h \ + colvartypes.h colvarproxy.h colvarvalue.h colvarparse.h colvardeps.h \ colvarbias_meta.h colvarbias.h colvargrid.h colvarbias_restraint.o: colvarbias_restraint.cpp colvarmodule.h \ colvartypes.h colvarproxy.h colvarvalue.h colvarbias_restraint.h \ - colvarbias.h colvar.h colvarparse.h + colvarbias.h colvar.h colvarparse.h colvardeps.h colvarcomp_angles.o: colvarcomp_angles.cpp colvarmodule.h colvartypes.h \ - colvarproxy.h colvarvalue.h colvar.h colvarparse.h colvarcomp.h \ - colvaratoms.h + colvarproxy.h colvarvalue.h colvar.h colvarparse.h colvardeps.h \ + colvarcomp.h colvaratoms.h colvarcomp_coordnums.o: colvarcomp_coordnums.cpp colvarmodule.h \ - colvartypes.h colvarproxy.h colvarvalue.h colvarparse.h colvaratoms.h \ - colvar.h colvarcomp.h + colvartypes.h colvarproxy.h colvarvalue.h colvarparse.h colvardeps.h \ + colvaratoms.h colvar.h colvarcomp.h colvarcomp.o: colvarcomp.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvar.h colvarparse.h colvarcomp.h colvaratoms.h + colvarvalue.h colvar.h colvarparse.h colvardeps.h colvarcomp.h \ + colvaratoms.h colvarcomp_distances.o: colvarcomp_distances.cpp colvarmodule.h \ - colvartypes.h colvarproxy.h colvarvalue.h colvarparse.h colvar.h \ - colvarcomp.h colvaratoms.h + colvartypes.h colvarproxy.h colvarvalue.h colvarparse.h colvardeps.h \ + colvar.h colvarcomp.h colvaratoms.h colvarcomp_protein.o: colvarcomp_protein.cpp colvarmodule.h colvartypes.h \ - colvarproxy.h colvarvalue.h colvarparse.h colvar.h colvarcomp.h \ - colvaratoms.h -colvarcomp_rotations.o: colvarcomp_rotations.cpp colvarmodule.h \ - colvartypes.h colvarproxy.h colvarvalue.h colvarparse.h colvar.h \ + colvarproxy.h colvarvalue.h colvarparse.h colvardeps.h colvar.h \ colvarcomp.h colvaratoms.h +colvarcomp_rotations.o: colvarcomp_rotations.cpp colvarmodule.h \ + colvartypes.h colvarproxy.h colvarvalue.h colvarparse.h colvardeps.h \ + colvar.h colvarcomp.h colvaratoms.h colvar.o: colvar.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarparse.h colvar.h colvarcomp.h colvaratoms.h \ - colvarscript.h colvarbias.h + colvarvalue.h colvarparse.h colvardeps.h colvar.h colvarcomp.h \ + colvaratoms.h colvarscript.h colvarbias.h +colvardeps.o: colvardeps.cpp colvarmodule.h colvartypes.h colvarproxy.h \ + colvarvalue.h colvardeps.h colvargrid.o: colvargrid.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarparse.h colvar.h colvarcomp.h colvaratoms.h \ - colvargrid.h + colvarvalue.h colvarparse.h colvardeps.h colvar.h colvarcomp.h \ + colvaratoms.h colvargrid.h colvarmodule.o: colvarmodule.cpp colvarmodule.h colvartypes.h \ - colvarproxy.h colvarvalue.h colvarparse.h colvar.h colvarbias.h \ - colvarbias_abf.h colvargrid.h colvarbias_alb.h colvarbias_restraint.h \ - colvarbias_histogram.h colvarbias_meta.h colvarscript.h + colvarproxy.h colvarvalue.h colvarparse.h colvardeps.h colvar.h \ + colvarbias.h colvarbias_abf.h colvargrid.h colvarbias_alb.h \ + colvarbias_restraint.h colvarbias_histogram.h colvarbias_meta.h \ + colvarscript.h colvarparse.o: colvarparse.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarparse.h + colvarvalue.h colvarparse.h colvardeps.h colvarscript.o: colvarscript.cpp colvarscript.h colvarmodule.h \ colvartypes.h colvarproxy.h colvarvalue.h colvarbias.h colvar.h \ - colvarparse.h + colvarparse.h colvardeps.h colvartypes.o: colvartypes.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarparse.h + colvarvalue.h colvarparse.h colvardeps.h colvarvalue.o: colvarvalue.cpp colvarmodule.h colvartypes.h colvarproxy.h \ colvarvalue.h diff --git a/lib/colvars/Makefile.mingw32-cross b/lib/colvars/Makefile.mingw32-cross index 289b006a45..cea3a53c25 100644 --- a/lib/colvars/Makefile.mingw32-cross +++ b/lib/colvars/Makefile.mingw32-cross @@ -61,58 +61,62 @@ $(DIR)%.o: %.cpp # ------ DEPENDENCIES ------ # $(DIR)colvaratoms.o: colvaratoms.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarparse.h colvarvalue.h colvaratoms.h + colvarvalue.h colvarparse.h colvardeps.h colvaratoms.h $(DIR)colvarbias_abf.o: colvarbias_abf.cpp colvarmodule.h colvartypes.h \ - colvarproxy.h colvar.h colvarvalue.h colvarparse.h colvarbias_abf.h \ - colvarbias.h colvargrid.h + colvarproxy.h colvarvalue.h colvar.h colvarparse.h colvardeps.h \ + colvarbias_abf.h colvarbias.h colvargrid.h $(DIR)colvarbias_alb.o: colvarbias_alb.cpp colvarmodule.h colvartypes.h \ - colvarproxy.h colvarbias_alb.h colvar.h colvarvalue.h colvarparse.h \ - colvarbias_restraint.h colvarbias.h + colvarproxy.h colvarvalue.h colvarbias_alb.h colvar.h colvarparse.h \ + colvardeps.h colvarbias_restraint.h colvarbias.h $(DIR)colvarbias.o: colvarbias.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarbias.h colvar.h colvarparse.h + colvarvalue.h colvarbias.h colvar.h colvarparse.h colvardeps.h $(DIR)colvarbias_histogram.o: colvarbias_histogram.cpp colvarmodule.h \ colvartypes.h colvarproxy.h colvarvalue.h colvar.h colvarparse.h \ - colvarbias_histogram.h colvarbias.h colvargrid.h + colvardeps.h colvarbias_histogram.h colvarbias.h colvargrid.h $(DIR)colvarbias_meta.o: colvarbias_meta.cpp colvar.h colvarmodule.h \ - colvartypes.h colvarproxy.h colvarvalue.h colvarparse.h \ + colvartypes.h colvarproxy.h colvarvalue.h colvarparse.h colvardeps.h \ colvarbias_meta.h colvarbias.h colvargrid.h $(DIR)colvarbias_restraint.o: colvarbias_restraint.cpp colvarmodule.h \ colvartypes.h colvarproxy.h colvarvalue.h colvarbias_restraint.h \ - colvarbias.h colvar.h colvarparse.h + colvarbias.h colvar.h colvarparse.h colvardeps.h $(DIR)colvarcomp_angles.o: colvarcomp_angles.cpp colvarmodule.h colvartypes.h \ - colvarproxy.h colvar.h colvarvalue.h colvarparse.h colvarcomp.h \ - colvaratoms.h + colvarproxy.h colvarvalue.h colvar.h colvarparse.h colvardeps.h \ + colvarcomp.h colvaratoms.h $(DIR)colvarcomp_coordnums.o: colvarcomp_coordnums.cpp colvarmodule.h \ - colvartypes.h colvarproxy.h colvarparse.h colvarvalue.h colvaratoms.h \ - colvar.h colvarcomp.h + colvartypes.h colvarproxy.h colvarvalue.h colvarparse.h colvardeps.h \ + colvaratoms.h colvar.h colvarcomp.h $(DIR)colvarcomp.o: colvarcomp.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvar.h colvarparse.h colvarcomp.h colvaratoms.h + colvarvalue.h colvar.h colvarparse.h colvardeps.h colvarcomp.h \ + colvaratoms.h $(DIR)colvarcomp_distances.o: colvarcomp_distances.cpp colvarmodule.h \ - colvartypes.h colvarproxy.h colvarvalue.h colvarparse.h colvar.h \ - colvarcomp.h colvaratoms.h + colvartypes.h colvarproxy.h colvarvalue.h colvarparse.h colvardeps.h \ + colvar.h colvarcomp.h colvaratoms.h $(DIR)colvarcomp_protein.o: colvarcomp_protein.cpp colvarmodule.h colvartypes.h \ - colvarproxy.h colvarvalue.h colvarparse.h colvar.h colvarcomp.h \ - colvaratoms.h -$(DIR)colvarcomp_rotations.o: colvarcomp_rotations.cpp colvarmodule.h \ - colvartypes.h colvarproxy.h colvarvalue.h colvarparse.h colvar.h \ + colvarproxy.h colvarvalue.h colvarparse.h colvardeps.h colvar.h \ colvarcomp.h colvaratoms.h +$(DIR)colvarcomp_rotations.o: colvarcomp_rotations.cpp colvarmodule.h \ + colvartypes.h colvarproxy.h colvarvalue.h colvarparse.h colvardeps.h \ + colvar.h colvarcomp.h colvaratoms.h $(DIR)colvar.o: colvar.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarparse.h colvar.h colvarcomp.h colvaratoms.h \ - colvarscript.h colvarbias.h + colvarvalue.h colvarparse.h colvardeps.h colvar.h colvarcomp.h \ + colvaratoms.h colvarscript.h colvarbias.h +$(DIR)colvardeps.o: colvardeps.cpp colvarmodule.h colvartypes.h colvarproxy.h \ + colvarvalue.h colvardeps.h $(DIR)colvargrid.o: colvargrid.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarparse.h colvar.h colvarcomp.h colvaratoms.h \ - colvargrid.h + colvarvalue.h colvarparse.h colvardeps.h colvar.h colvarcomp.h \ + colvaratoms.h colvargrid.h $(DIR)colvarmodule.o: colvarmodule.cpp colvarmodule.h colvartypes.h \ - colvarproxy.h colvarvalue.h colvarparse.h colvar.h colvarbias.h \ - colvarbias_abf.h colvargrid.h colvarbias_alb.h colvarbias_restraint.h \ - colvarbias_histogram.h colvarbias_meta.h colvarscript.h + colvarproxy.h colvarvalue.h colvarparse.h colvardeps.h colvar.h \ + colvarbias.h colvarbias_abf.h colvargrid.h colvarbias_alb.h \ + colvarbias_restraint.h colvarbias_histogram.h colvarbias_meta.h \ + colvarscript.h $(DIR)colvarparse.o: colvarparse.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarparse.h + colvarvalue.h colvarparse.h colvardeps.h $(DIR)colvarscript.o: colvarscript.cpp colvarscript.h colvarmodule.h \ - colvartypes.h colvarproxy.h colvarvalue.h colvar.h colvarparse.h \ - colvarbias.h + colvartypes.h colvarproxy.h colvarvalue.h colvarbias.h colvar.h \ + colvarparse.h colvardeps.h $(DIR)colvartypes.o: colvartypes.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarparse.h colvarvalue.h + colvarvalue.h colvarparse.h colvardeps.h $(DIR)colvarvalue.o: colvarvalue.cpp colvarmodule.h colvartypes.h colvarproxy.h \ colvarvalue.h diff --git a/lib/colvars/Makefile.mingw64-cross b/lib/colvars/Makefile.mingw64-cross index a6081273f8..7dd85b48f8 100644 --- a/lib/colvars/Makefile.mingw64-cross +++ b/lib/colvars/Makefile.mingw64-cross @@ -61,58 +61,62 @@ $(DIR)%.o: %.cpp # ------ DEPENDENCIES ------ # $(DIR)colvaratoms.o: colvaratoms.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarparse.h colvarvalue.h colvaratoms.h + colvarvalue.h colvarparse.h colvardeps.h colvaratoms.h $(DIR)colvarbias_abf.o: colvarbias_abf.cpp colvarmodule.h colvartypes.h \ - colvarproxy.h colvar.h colvarvalue.h colvarparse.h colvarbias_abf.h \ - colvarbias.h colvargrid.h + colvarproxy.h colvarvalue.h colvar.h colvarparse.h colvardeps.h \ + colvarbias_abf.h colvarbias.h colvargrid.h $(DIR)colvarbias_alb.o: colvarbias_alb.cpp colvarmodule.h colvartypes.h \ - colvarproxy.h colvarbias_alb.h colvar.h colvarvalue.h colvarparse.h \ - colvarbias_restraint.h colvarbias.h + colvarproxy.h colvarvalue.h colvarbias_alb.h colvar.h colvarparse.h \ + colvardeps.h colvarbias_restraint.h colvarbias.h $(DIR)colvarbias.o: colvarbias.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarbias.h colvar.h colvarparse.h + colvarvalue.h colvarbias.h colvar.h colvarparse.h colvardeps.h $(DIR)colvarbias_histogram.o: colvarbias_histogram.cpp colvarmodule.h \ colvartypes.h colvarproxy.h colvarvalue.h colvar.h colvarparse.h \ - colvarbias_histogram.h colvarbias.h colvargrid.h + colvardeps.h colvarbias_histogram.h colvarbias.h colvargrid.h $(DIR)colvarbias_meta.o: colvarbias_meta.cpp colvar.h colvarmodule.h \ - colvartypes.h colvarproxy.h colvarvalue.h colvarparse.h \ + colvartypes.h colvarproxy.h colvarvalue.h colvarparse.h colvardeps.h \ colvarbias_meta.h colvarbias.h colvargrid.h $(DIR)colvarbias_restraint.o: colvarbias_restraint.cpp colvarmodule.h \ colvartypes.h colvarproxy.h colvarvalue.h colvarbias_restraint.h \ - colvarbias.h colvar.h colvarparse.h + colvarbias.h colvar.h colvarparse.h colvardeps.h $(DIR)colvarcomp_angles.o: colvarcomp_angles.cpp colvarmodule.h colvartypes.h \ - colvarproxy.h colvar.h colvarvalue.h colvarparse.h colvarcomp.h \ - colvaratoms.h + colvarproxy.h colvarvalue.h colvar.h colvarparse.h colvardeps.h \ + colvarcomp.h colvaratoms.h $(DIR)colvarcomp_coordnums.o: colvarcomp_coordnums.cpp colvarmodule.h \ - colvartypes.h colvarproxy.h colvarparse.h colvarvalue.h colvaratoms.h \ - colvar.h colvarcomp.h + colvartypes.h colvarproxy.h colvarvalue.h colvarparse.h colvardeps.h \ + colvaratoms.h colvar.h colvarcomp.h $(DIR)colvarcomp.o: colvarcomp.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvar.h colvarparse.h colvarcomp.h colvaratoms.h + colvarvalue.h colvar.h colvarparse.h colvardeps.h colvarcomp.h \ + colvaratoms.h $(DIR)colvarcomp_distances.o: colvarcomp_distances.cpp colvarmodule.h \ - colvartypes.h colvarproxy.h colvarvalue.h colvarparse.h colvar.h \ - colvarcomp.h colvaratoms.h + colvartypes.h colvarproxy.h colvarvalue.h colvarparse.h colvardeps.h \ + colvar.h colvarcomp.h colvaratoms.h $(DIR)colvarcomp_protein.o: colvarcomp_protein.cpp colvarmodule.h colvartypes.h \ - colvarproxy.h colvarvalue.h colvarparse.h colvar.h colvarcomp.h \ - colvaratoms.h -$(DIR)colvarcomp_rotations.o: colvarcomp_rotations.cpp colvarmodule.h \ - colvartypes.h colvarproxy.h colvarvalue.h colvarparse.h colvar.h \ + colvarproxy.h colvarvalue.h colvarparse.h colvardeps.h colvar.h \ colvarcomp.h colvaratoms.h +$(DIR)colvarcomp_rotations.o: colvarcomp_rotations.cpp colvarmodule.h \ + colvartypes.h colvarproxy.h colvarvalue.h colvarparse.h colvardeps.h \ + colvar.h colvarcomp.h colvaratoms.h $(DIR)colvar.o: colvar.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarparse.h colvar.h colvarcomp.h colvaratoms.h \ - colvarscript.h colvarbias.h + colvarvalue.h colvarparse.h colvardeps.h colvar.h colvarcomp.h \ + colvaratoms.h colvarscript.h colvarbias.h +$(DIR)colvardeps.o: colvardeps.cpp colvarmodule.h colvartypes.h colvarproxy.h \ + colvarvalue.h colvardeps.h $(DIR)colvargrid.o: colvargrid.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarparse.h colvar.h colvarcomp.h colvaratoms.h \ - colvargrid.h + colvarvalue.h colvarparse.h colvardeps.h colvar.h colvarcomp.h \ + colvaratoms.h colvargrid.h $(DIR)colvarmodule.o: colvarmodule.cpp colvarmodule.h colvartypes.h \ - colvarproxy.h colvarvalue.h colvarparse.h colvar.h colvarbias.h \ - colvarbias_abf.h colvargrid.h colvarbias_alb.h colvarbias_restraint.h \ - colvarbias_histogram.h colvarbias_meta.h colvarscript.h + colvarproxy.h colvarvalue.h colvarparse.h colvardeps.h colvar.h \ + colvarbias.h colvarbias_abf.h colvargrid.h colvarbias_alb.h \ + colvarbias_restraint.h colvarbias_histogram.h colvarbias_meta.h \ + colvarscript.h $(DIR)colvarparse.o: colvarparse.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarparse.h + colvarvalue.h colvarparse.h colvardeps.h $(DIR)colvarscript.o: colvarscript.cpp colvarscript.h colvarmodule.h \ - colvartypes.h colvarproxy.h colvarvalue.h colvar.h colvarparse.h \ - colvarbias.h + colvartypes.h colvarproxy.h colvarvalue.h colvarbias.h colvar.h \ + colvarparse.h colvardeps.h $(DIR)colvartypes.o: colvartypes.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarparse.h colvarvalue.h + colvarvalue.h colvarparse.h colvardeps.h $(DIR)colvarvalue.o: colvarvalue.cpp colvarmodule.h colvartypes.h colvarproxy.h \ colvarvalue.h -- GitLab From 977b9e542f5d34f09891f6cce20fd9641475f1e3 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 10 Aug 2016 09:35:21 -0400 Subject: [PATCH 12/52] update colvars to another set of changes from the upstream repo (cherry picked from commit cb816f8cba630e27df773b54a584b72741fa20db) --- lib/colvars/colvar.cpp | 2 +- lib/colvars/colvar.h | 2 +- lib/colvars/colvaratoms.cpp | 2 +- lib/colvars/colvaratoms.h | 2 +- lib/colvars/colvarbias.cpp | 2 +- lib/colvars/colvarbias.h | 2 +- lib/colvars/colvarcomp.cpp | 4 ++-- lib/colvars/colvarcomp.h | 2 +- lib/colvars/colvardeps.cpp | 34 +++++++++++++++++----------------- lib/colvars/colvardeps.h | 22 +++++++++++----------- lib/colvars/colvarmodule.cpp | 10 +++++----- lib/colvars/colvarmodule.h | 3 --- lib/colvars/colvarparse.cpp | 5 +---- lib/colvars/colvarparse.h | 2 +- 14 files changed, 44 insertions(+), 50 deletions(-) diff --git a/lib/colvars/colvar.cpp b/lib/colvars/colvar.cpp index 49f0285091..c630154aa3 100644 --- a/lib/colvars/colvar.cpp +++ b/lib/colvars/colvar.cpp @@ -1952,4 +1952,4 @@ void colvar::calc_runave() // Static members -std::vector colvar::cv_features; +std::vector colvar::cv_features; diff --git a/lib/colvars/colvar.h b/lib/colvars/colvar.h index 5f2fce35e0..05314b78e8 100644 --- a/lib/colvars/colvar.h +++ b/lib/colvars/colvar.h @@ -38,7 +38,7 @@ /// \link colvarvalue \endlink type, you should also add its /// initialization line in the \link colvar \endlink constructor. -class colvar : public colvarparse, public cvm::deps { +class colvar : public colvarparse, public colvardeps { public: diff --git a/lib/colvars/colvaratoms.cpp b/lib/colvars/colvaratoms.cpp index 786a72821f..5eba67f0f1 100644 --- a/lib/colvars/colvaratoms.cpp +++ b/lib/colvars/colvaratoms.cpp @@ -1192,6 +1192,6 @@ void cvm::atom_group::apply_force(cvm::rvector const &force) // Static members -std::vector cvm::atom_group::ag_features; +std::vector cvm::atom_group::ag_features; diff --git a/lib/colvars/colvaratoms.h b/lib/colvars/colvaratoms.h index 440afd57cb..4ba70b2855 100644 --- a/lib/colvars/colvaratoms.h +++ b/lib/colvars/colvaratoms.h @@ -139,7 +139,7 @@ public: /// \brief Group of \link atom \endlink objects, mostly used by a /// \link cvc \endlink object to gather all atomic data class colvarmodule::atom_group - : public colvarparse, public cvm::deps + : public colvarparse, public colvardeps { public: diff --git a/lib/colvars/colvarbias.cpp b/lib/colvars/colvarbias.cpp index 073cfc3965..76d8489de9 100644 --- a/lib/colvars/colvarbias.cpp +++ b/lib/colvars/colvarbias.cpp @@ -246,4 +246,4 @@ std::ostream & colvarbias::write_traj(std::ostream &os) // Static members -std::vector colvarbias::cvb_features; +std::vector colvarbias::cvb_features; diff --git a/lib/colvars/colvarbias.h b/lib/colvars/colvarbias.h index 712dc44ff0..8238f58f40 100644 --- a/lib/colvars/colvarbias.h +++ b/lib/colvars/colvarbias.h @@ -9,7 +9,7 @@ /// \brief Collective variable bias, base class -class colvarbias : public colvarparse, public cvm::deps { +class colvarbias : public colvarparse, public colvardeps { public: /// Name of this bias diff --git a/lib/colvars/colvarcomp.cpp b/lib/colvars/colvarcomp.cpp index 89973516be..632e7fabda 100644 --- a/lib/colvars/colvarcomp.cpp +++ b/lib/colvars/colvarcomp.cpp @@ -103,7 +103,7 @@ int colvar::cvc::setup() description = "cvc " + name; for (i = 0; i < atom_groups.size(); i++) { - add_child((cvm::deps *) atom_groups[i]); + add_child((colvardeps *) atom_groups[i]); } return COLVARS_OK; @@ -272,4 +272,4 @@ void colvar::cvc::debug_gradients(cvm::atom_group *group) // Static members -std::vector colvar::cvc::cvc_features; +std::vector colvar::cvc::cvc_features; diff --git a/lib/colvars/colvarcomp.h b/lib/colvars/colvarcomp.h index 1ed3c38924..deed1a4721 100644 --- a/lib/colvars/colvarcomp.h +++ b/lib/colvars/colvarcomp.h @@ -61,7 +61,7 @@ /// call to e.g. apply_force(). class colvar::cvc - : public colvarparse, public cvm::deps + : public colvarparse, public colvardeps { public: diff --git a/lib/colvars/colvardeps.cpp b/lib/colvars/colvardeps.cpp index 2801abb191..c4915569e2 100644 --- a/lib/colvars/colvardeps.cpp +++ b/lib/colvars/colvardeps.cpp @@ -2,7 +2,7 @@ #include "colvardeps.h" -cvm::deps::~deps() { +colvardeps::~colvardeps() { size_t i; for (i=0; iavailable = true; } -int cvm::deps::enable(int feature_id, +int colvardeps::enable(int feature_id, bool dry_run /* default: false */, // dry_run: fail silently, do not enable if available // flag is passed recursively to deps of this feature @@ -193,7 +193,7 @@ int cvm::deps::enable(int feature_id, features()[f]->requires_alt.back()[1] = h; \ features()[f]->requires_alt.back()[2] = i -void cvm::deps::init_cvb_requires() { +void colvardeps::init_cvb_requires() { int i; if (features().size() == 0) { for (i = 0; i < f_cvb_ntot; i++) { @@ -225,7 +225,7 @@ void cvm::deps::init_cvb_requires() { } -void cvm::deps::init_cv_requires() { +void colvardeps::init_cv_requires() { size_t i; if (features().size() == 0) { for (i = 0; i < f_cv_ntot; i++) { @@ -342,11 +342,11 @@ void cvm::deps::init_cv_requires() { } -void cvm::deps::init_cvc_requires() { +void colvardeps::init_cvc_requires() { size_t i; // Initialize static array once and for all if (features().size() == 0) { - for (i = 0; i < cvm::deps::f_cvc_ntot; i++) { + for (i = 0; i < colvardeps::f_cvc_ntot; i++) { features().push_back(new feature); } @@ -384,7 +384,7 @@ void cvm::deps::init_cvc_requires() { // Initialize feature_states for each instance // default as unavailable, not enabled feature_states.reserve(f_cvc_ntot); - for (i = 0; i < cvm::deps::f_cvc_ntot; i++) { + for (i = 0; i < colvardeps::f_cvc_ntot; i++) { feature_states.push_back(new feature_state(this, feature_states.size(), false, false)); } @@ -392,12 +392,12 @@ void cvm::deps::init_cvc_requires() { // Each cvc specifies what other features are available feature_states[f_cvc_active]->available = true; feature_states[f_cvc_gradient]->available = true; - feature_states[f_cvc_scalable_com]->available = (proxy->scalable_group_coms() == COLVARS_OK); + feature_states[f_cvc_scalable_com]->available = (cvm::proxy->scalable_group_coms() == COLVARS_OK); feature_states[f_cvc_scalable]->available = feature_states[f_cvc_scalable_com]->available; } -void cvm::deps::init_ag_requires() { +void colvardeps::init_ag_requires() { size_t i; // Initialize static array once and for all if (features().size() == 0) { @@ -428,18 +428,18 @@ void cvm::deps::init_ag_requires() { // Initialize feature_states for each instance // default as unavailable, not enabled feature_states.reserve(f_ag_ntot); - for (i = 0; i < cvm::deps::f_ag_ntot; i++) { + for (i = 0; i < colvardeps::f_ag_ntot; i++) { feature_states.push_back(new feature_state(this, feature_states.size(), false, false)); } // Features that are implemented (or not) by all atom groups feature_states[f_ag_active]->available = true; - feature_states[f_ag_scalable_com]->available = (proxy->scalable_group_coms() == COLVARS_OK); + feature_states[f_ag_scalable_com]->available = (cvm::proxy->scalable_group_coms() == COLVARS_OK); feature_states[f_ag_scalable]->available = feature_states[f_ag_scalable_com]->available; } -void cvm::deps::print_state() { +void colvardeps::print_state() { size_t i; cvm::log("Enabled features of " + description); for (i = 0; i < feature_states.size(); i++) { @@ -456,13 +456,13 @@ void cvm::deps::print_state() { -void cvm::deps::add_child(deps *child) { +void colvardeps::add_child(colvardeps *child) { children.push_back(child); - child->parents.push_back((deps *)this); + child->parents.push_back((colvardeps *)this); } -void cvm::deps::remove_child(deps *child) { +void colvardeps::remove_child(colvardeps *child) { int i; bool found = false; @@ -490,7 +490,7 @@ void cvm::deps::remove_child(deps *child) { } -void cvm::deps::remove_all_children() { +void colvardeps::remove_all_children() { size_t i; int j; bool found; diff --git a/lib/colvars/colvardeps.h b/lib/colvars/colvardeps.h index 9c86f6028b..7e69865a56 100644 --- a/lib/colvars/colvardeps.h +++ b/lib/colvars/colvardeps.h @@ -16,11 +16,11 @@ // It seems important to have available default to false (for safety) and enabled to false (for efficiency) -class cvm::deps { +class colvardeps { public: - deps() {} - virtual ~deps(); + colvardeps() {} + virtual ~colvardeps(); // Subclasses should initialize the following members: @@ -29,13 +29,13 @@ public: /// This contains the current state of each feature for each object class feature_state { private: - cvm::deps *const deps_object; + colvardeps *const deps_object; int const id; operator int() { return 0; } // never cast as int public: - inline cvm::deps *object() const { return deps_object; } + inline colvardeps *object() const { return deps_object; } inline int feature_id() const { return id; } - feature_state(cvm::deps *o, int i, bool a, bool e) + feature_state(colvardeps *o, int i, bool a, bool e) : deps_object(o), id(i), available(a), enabled(e) {} /// Available means: supported, subject to dependencies as listed, @@ -97,9 +97,9 @@ public: // implement this as virtual to allow overriding virtual std::vector&features() = 0; - void add_child(deps *child); + void add_child(colvardeps *child); - void remove_child(deps *child); + void remove_child(colvardeps *child); /// Used before deleting an object, if not handled by that object's destructor /// (useful for cvcs because their children are member objects) @@ -111,11 +111,11 @@ private: // pointers to objects this object depends on // list should be maintained by any code that modifies the object // this could be secured by making lists of colvars / cvcs / atom groups private and modified through accessor functions - std::vector children; + std::vector children; // pointers to objects that depend on this object // the size of this array is in effect a reference counter - std::vector parents; + std::vector parents; public: // disabling a feature f: @@ -128,7 +128,7 @@ public: // // } - // std::vector parents; // Needed to trigger a refresh if capabilities of this object change + // std::vector parents; // Needed to trigger a refresh if capabilities of this object change // End of members to be initialized by subclasses diff --git a/lib/colvars/colvarmodule.cpp b/lib/colvars/colvarmodule.cpp index 4537c09509..6d174be7a2 100644 --- a/lib/colvars/colvarmodule.cpp +++ b/lib/colvars/colvarmodule.cpp @@ -302,7 +302,7 @@ int colvarmodule::parse_biases(std::string const &conf) size_t i; for (i = 0; i < biases.size(); i++) { - biases[i]->enable(cvm::deps::f_cvb_active); + biases[i]->enable(colvardeps::f_cvb_active); if (cvm::debug()) biases[i]->print_state(); } @@ -310,8 +310,8 @@ int colvarmodule::parse_biases(std::string const &conf) size_t n_hist_dep_biases = 0; std::vector hist_dep_biases_names; for (i = 0; i < biases.size(); i++) { - if (biases[i]->is_enabled(cvm::deps::f_cvb_apply_force) && - biases[i]->is_enabled(cvm::deps::f_cvb_history_dependent)) { + if (biases[i]->is_enabled(colvardeps::f_cvb_apply_force) && + biases[i]->is_enabled(colvardeps::f_cvb_history_dependent)) { n_hist_dep_biases++; hist_dep_biases_names.push_back(biases[i]->name); } @@ -531,7 +531,7 @@ int colvarmodule::calc_colvars() // Determine which colvars are active at this time step for (cvi = colvars.begin(); cvi != colvars.end(); cvi++) { - (*cvi)->feature_states[cvm::deps::f_cv_active]->enabled = (step_absolute() % (*cvi)->get_time_step_factor() == 0); + (*cvi)->feature_states[colvardeps::f_cv_active]->enabled = (step_absolute() % (*cvi)->get_time_step_factor() == 0); } // if SMP support is available, split up the work @@ -689,7 +689,7 @@ int colvarmodule::update_colvar_forces() cvm::log("Communicating forces from the colvars to the atoms.\n"); cvm::increase_depth(); for (cvi = colvars.begin(); cvi != colvars.end(); cvi++) { - if ((*cvi)->is_enabled(cvm::deps::f_cv_gradient)) { + if ((*cvi)->is_enabled(colvardeps::f_cv_gradient)) { if (!(*cvi)->is_enabled()) continue; (*cvi)->communicate_forces(); if (cvm::get_error()) { diff --git a/lib/colvars/colvarmodule.h b/lib/colvars/colvarmodule.h index 516f968769..f461728de8 100644 --- a/lib/colvars/colvarmodule.h +++ b/lib/colvars/colvarmodule.h @@ -74,9 +74,6 @@ private: public: - /// Base class to handle mutual dependencies of most objects - class deps; - friend class colvarproxy; // TODO colvarscript should be unaware of colvarmodule's internals friend class colvarscript; diff --git a/lib/colvars/colvarparse.cpp b/lib/colvars/colvarparse.cpp index da39f78356..47b1970220 100644 --- a/lib/colvars/colvarparse.cpp +++ b/lib/colvars/colvarparse.cpp @@ -356,7 +356,7 @@ bool colvarparse::get_keyval(std::string const &conf, bool colvarparse::get_keyval(std::string const &conf, char const *key, - cvm::deps::feature_state *value, + colvardeps::feature_state *value, bool const &def_value, Parse_Mode const parse_mode) { @@ -695,7 +695,6 @@ bool colvarparse::key_lookup(std::string const &conf, line+"\".\n", INPUT_ERROR); return false; } - size_t const old_end = line.size(); line_begin = line_end; nl = conf.find('\n', line_begin+1); @@ -715,8 +714,6 @@ bool colvarparse::key_lookup(std::string const &conf, } } - cvm::log("Value so far = "+line.substr(data_begin, (data_end-data_begin))+".\n"); - // strip the leading and trailing braces data_begin = line.find_first_of('{') + 1; data_begin = line.find_first_not_of(white_space, diff --git a/lib/colvars/colvarparse.h b/lib/colvars/colvarparse.h index c091cbc15d..7685b4eeb4 100644 --- a/lib/colvars/colvarparse.h +++ b/lib/colvars/colvarparse.h @@ -183,7 +183,7 @@ public: Parse_Mode const parse_mode = parse_normal); bool get_keyval(std::string const &conf, char const *key, - cvm::deps::feature_state *value, + colvardeps::feature_state *value, bool const &def_value = false, Parse_Mode const parse_mode = parse_normal); -- GitLab From 3b476d914f5ea387bb074f4f3f2d3d36c7bb92d2 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 13 Aug 2016 07:24:26 -0400 Subject: [PATCH 13/52] update colvars to version 2016-08-10 (cherry picked from commit eba3ad9abb37b53fc2f79449bb8eada8f0ec526a) --- lib/colvars/colvar.cpp | 51 +++++++++++++++---------- lib/colvars/colvar.h | 14 +++---- lib/colvars/colvaratoms.cpp | 24 ++++++------ lib/colvars/colvaratoms.h | 20 +++++----- lib/colvars/colvarbias_abf.cpp | 44 +++++++++++---------- lib/colvars/colvarbias_abf.h | 4 +- lib/colvars/colvarcomp.h | 18 ++++----- lib/colvars/colvarcomp_angles.cpp | 28 +++++++------- lib/colvars/colvarcomp_distances.cpp | 40 +++++++++---------- lib/colvars/colvardeps.cpp | 24 ++++++------ lib/colvars/colvardeps.h | 16 ++++---- lib/colvars/colvarmodule.h | 8 ++-- lib/colvars/colvarproxy.h | 25 +++++------- lib/colvars/colvarscript.cpp | 2 +- src/USER-COLVARS/colvarproxy_lammps.cpp | 10 +---- src/USER-COLVARS/colvarproxy_lammps.h | 6 +-- src/USER-COLVARS/fix_colvars.cpp | 2 +- 17 files changed, 168 insertions(+), 168 deletions(-) diff --git a/lib/colvars/colvar.cpp b/lib/colvars/colvar.cpp index c630154aa3..1dd46524ac 100644 --- a/lib/colvars/colvar.cpp +++ b/lib/colvars/colvar.cpp @@ -374,10 +374,19 @@ colvar::colvar(std::string const &conf) } { - bool b_output_system_force; - get_keyval(conf, "outputSystemForce", b_output_system_force, false); - if (b_output_system_force) { - enable(f_cv_output_system_force); + bool temp; + if (get_keyval(conf, "outputSystemForce", temp, false)) { + cvm::error("Colvar option outputSystemForce is deprecated.\n" + "Please use outputTotalForce, or outputSystemForce within an ABF bias."); + return; + } + } + + { + bool b_output_total_force; + get_keyval(conf, "outputTotalForce", b_output_total_force, false); + if (b_output_total_force) { + enable(f_cv_output_total_force); } } @@ -555,8 +564,8 @@ int colvar::init_components(std::string const &conf) int colvar::refresh_deps() { // If enabled features are changed upstream, the features below should be refreshed - if (is_enabled(f_cv_system_force_calc)) { - cvm::request_system_force(); + if (is_enabled(f_cv_total_force_calc)) { + cvm::request_total_force(); } if (is_enabled(f_cv_collect_gradient) && atom_ids.size() == 0) { build_atom_list(); @@ -972,17 +981,17 @@ int colvar::calc_cvc_sys_forces(int first_cvc, size_t num_cvcs) size_t const cvc_max_count = num_cvcs ? num_cvcs : num_active_cvcs(); size_t i, cvc_count; - if (is_enabled(f_cv_system_force_calc)) { + if (is_enabled(f_cv_total_force_calc)) { if (cvm::debug()) - cvm::log("Calculating system force of colvar \""+this->name+"\".\n"); + cvm::log("Calculating total force of colvar \""+this->name+"\".\n"); // if (!tasks[task_extended_lagrangian] && (cvm::step_relative() > 0)) { - // Disabled check to allow for explicit system force calculation + // Disabled check to allow for explicit total force calculation // even with extended Lagrangian if (cvm::step_relative() > 0) { cvm::increase_depth(); - // get from the cvcs the system forces from the PREVIOUS step + // get from the cvcs the total forces from the PREVIOUS step for (i = first_cvc, cvc_count = 0; (i < cvcs.size()) && (cvc_count < cvc_max_count); i++) { @@ -994,7 +1003,7 @@ int colvar::calc_cvc_sys_forces(int first_cvc, size_t num_cvcs) } if (cvm::debug()) - cvm::log("Done calculating system force of colvar \""+this->name+"\".\n"); + cvm::log("Done calculating total force of colvar \""+this->name+"\".\n"); } return COLVARS_OK; @@ -1003,20 +1012,20 @@ int colvar::calc_cvc_sys_forces(int first_cvc, size_t num_cvcs) int colvar::collect_cvc_sys_forces() { - if (is_enabled(f_cv_system_force_calc)) { + if (is_enabled(f_cv_total_force_calc)) { ft.reset(); if (cvm::step_relative() > 0) { - // get from the cvcs the system forces from the PREVIOUS step + // get from the cvcs the total forces from the PREVIOUS step for (size_t i = 0; i < cvcs.size(); i++) { if (!cvcs[i]->is_enabled()) continue; // linear combination is assumed - ft += (cvcs[i])->system_force() * (cvcs[i])->sup_coeff / active_cvc_square_norm; + ft += (cvcs[i])->total_force() * (cvcs[i])->sup_coeff / active_cvc_square_norm; } } if (!is_enabled(f_cv_hide_Jacobian)) { - // add the Jacobian force to the system force, and don't apply any silent + // add the Jacobian force to the total force, and don't apply any silent // correction internally: biases such as colvarbias_abf will handle it ft += fj; } @@ -1088,7 +1097,7 @@ int colvar::calc_colvar_properties() // report the restraint center as "value" x_reported = xr; v_reported = vr; - // the "system force" with the extended Lagrangian is just the + // the "total force" with the extended Lagrangian is just the // harmonic term acting on the extended coordinate // Note: this is the force for current timestep ft_reported = (-0.5 * ext_force_k) * this->dist2_lgrad(xr, x); @@ -1117,7 +1126,7 @@ cvm::real colvar::update_forces_energy() f += fb; if (is_enabled(f_cv_Jacobian)) { - // the instantaneous Jacobian force was not included in the reported system force; + // the instantaneous Jacobian force was not included in the reported total force; // instead, it is subtracted from the applied force (silent Jacobian correction) if (is_enabled(f_cv_hide_Jacobian)) f -= fj; @@ -1482,7 +1491,7 @@ std::istream & colvar::read_traj(std::istream &is) } } - if (is_enabled(f_cv_output_system_force)) { + if (is_enabled(f_cv_output_total_force)) { is >> ft; ft_reported = ft; } @@ -1567,8 +1576,8 @@ std::ostream & colvar::write_traj_label(std::ostream & os) << cvm::wrap_string(this->name, this_cv_width-3); } - if (is_enabled(f_cv_output_system_force)) { - os << " fs_" + if (is_enabled(f_cv_output_total_force)) { + os << " ft_" << cvm::wrap_string(this->name, this_cv_width-3); } @@ -1620,7 +1629,7 @@ std::ostream & colvar::write_traj(std::ostream &os) } - if (is_enabled(f_cv_output_system_force)) { + if (is_enabled(f_cv_output_total_force)) { os << " " << std::setprecision(cvm::cv_prec) << std::setw(cvm::cv_width) << ft_reported; diff --git a/lib/colvars/colvar.h b/lib/colvars/colvar.h index 05314b78e8..665b3d6427 100644 --- a/lib/colvars/colvar.h +++ b/lib/colvars/colvar.h @@ -54,7 +54,7 @@ public: /// \brief Current velocity (previously set by calc() or by read_traj()) colvarvalue const & velocity() const; - /// \brief Current system force (previously obtained from calc() or + /// \brief Current total force (previously obtained from calc() or /// read_traj()). Note: this is calculated using the atomic forces /// from the last simulation step. /// @@ -62,7 +62,7 @@ public: /// acting on the collective variable is calculated summing those /// from all colvar components, the bias and walls forces are /// subtracted. - colvarvalue const & system_force() const; + colvarvalue const & total_force() const; /// \brief Typical fluctuation amplitude for this collective /// variable (e.g. local width of a free energy basin) @@ -160,7 +160,7 @@ protected: /// \brief Jacobian force, when Jacobian_force is enabled colvarvalue fj; - /// Cached reported system force + /// Cached reported total force colvarvalue ft_reported; public: @@ -176,7 +176,7 @@ public: colvarvalue f; /// \brief Total force, as derived from the atomic trajectory; - /// should equal the total system force plus \link f \endlink + /// should equal the system force plus \link f \endlink colvarvalue ft; @@ -253,7 +253,7 @@ public: int calc_cvc_values(int first, size_t num_cvcs); /// \brief Same as \link colvar::calc_cvc_values \endlink but for gradients int calc_cvc_gradients(int first, size_t num_cvcs); - /// \brief Same as \link colvar::calc_cvc_values \endlink but for system forces + /// \brief Same as \link colvar::calc_cvc_values \endlink but for total forces int calc_cvc_sys_forces(int first, size_t num_cvcs); /// \brief Same as \link colvar::calc_cvc_values \endlink but for Jacobian derivatives/forces int calc_cvc_Jacobians(int first, size_t num_cvcs); @@ -265,7 +265,7 @@ public: int collect_cvc_values(); /// \brief Same as \link colvar::collect_cvc_values \endlink but for gradients int collect_cvc_gradients(); - /// \brief Same as \link colvar::collect_cvc_values \endlink but for system forces + /// \brief Same as \link colvar::collect_cvc_values \endlink but for total forces int collect_cvc_sys_forces(); /// \brief Same as \link colvar::collect_cvc_values \endlink but for Jacobian derivatives/forces int collect_cvc_Jacobians(); @@ -555,7 +555,7 @@ inline colvarvalue const & colvar::velocity() const } -inline colvarvalue const & colvar::system_force() const +inline colvarvalue const & colvar::total_force() const { return ft_reported; } diff --git a/lib/colvars/colvaratoms.cpp b/lib/colvars/colvaratoms.cpp index 5eba67f0f1..0d0a339a69 100644 --- a/lib/colvars/colvaratoms.cpp +++ b/lib/colvars/colvaratoms.cpp @@ -870,21 +870,21 @@ void cvm::atom_group::read_velocities() // TODO make this a calc function -void cvm::atom_group::read_system_forces() +void cvm::atom_group::read_total_forces() { if (b_dummy) return; if (b_rotate) { for (cvm::atom_iter ai = this->begin(); ai != this->end(); ai++) { - ai->read_system_force(); - ai->system_force = rot.rotate(ai->system_force); + ai->read_total_force(); + ai->total_force = rot.rotate(ai->total_force); } } else { for (cvm::atom_iter ai = this->begin(); ai != this->end(); ai++) { - ai->read_system_force(); + ai->read_total_force(); } } } @@ -1070,15 +1070,15 @@ std::vector cvm::atom_group::velocities() const return v; } -std::vector cvm::atom_group::system_forces() const +std::vector cvm::atom_group::total_forces() const { if (b_dummy) { - cvm::error("Error: system forces are not available " + cvm::error("Error: total forces are not available " "from a dummy atom group.\n", INPUT_ERROR); } if (is_enabled(f_ag_scalable)) { - cvm::error("Error: atomic system forces are not available " + cvm::error("Error: atomic total forces are not available " "from a scalable atom group.\n", INPUT_ERROR); } @@ -1086,27 +1086,27 @@ std::vector cvm::atom_group::system_forces() const cvm::atom_const_iter ai = this->begin(); std::vector::iterator fi = f.begin(); for ( ; ai != this->end(); ++fi, ++ai) { - *fi = ai->system_force; + *fi = ai->total_force; } return f; } // TODO make this an accessor -cvm::rvector cvm::atom_group::system_force() const +cvm::rvector cvm::atom_group::total_force() const { if (b_dummy) { - cvm::error("Error: total system forces are not available " + cvm::error("Error: total total forces are not available " "from a dummy atom group.\n", INPUT_ERROR); } if (is_enabled(f_ag_scalable)) { - return (cvm::proxy)->get_atom_group_system_force(index); + return (cvm::proxy)->get_atom_group_total_force(index); } cvm::rvector f(0.0); for (cvm::atom_const_iter ai = this->begin(); ai != this->end(); ai++) { - f += ai->system_force; + f += ai->total_force; } return f; } diff --git a/lib/colvars/colvaratoms.h b/lib/colvars/colvaratoms.h index 4ba70b2855..7a4d031daa 100644 --- a/lib/colvars/colvaratoms.h +++ b/lib/colvars/colvaratoms.h @@ -45,7 +45,7 @@ public: /// \brief System force at the previous step (copied from the /// program, can be modified if necessary) - cvm::rvector system_force; + cvm::rvector total_force; /// \brief Gradient of a scalar collective variable with respect /// to this atom @@ -86,7 +86,7 @@ public: inline void reset_data() { pos = cvm::atom_pos(0.0); - vel = grad = system_force = cvm::rvector(0.0); + vel = grad = total_force = cvm::rvector(0.0); } /// Get the latest value of the mass @@ -113,10 +113,10 @@ public: vel = (cvm::proxy)->get_atom_velocity(index); } - /// Get the system force - inline void read_system_force() + /// Get the total force + inline void read_total_force() { - system_force = (cvm::proxy)->get_atom_system_force(index); + total_force = (cvm::proxy)->get_atom_total_force(index); } /// \brief Apply a force to the atom @@ -336,10 +336,10 @@ public: /// rotation applied to the coordinates will be used void read_velocities(); - /// \brief Get the current system_forces; this must be called always + /// \brief Get the current total_forces; this must be called always /// *after* read_positions(); if b_rotate is defined, the same /// rotation applied to the coordinates will be used - void read_system_forces(); + void read_total_forces(); /// Call reset_data() for each atom inline void reset_atoms_data() @@ -410,11 +410,11 @@ public: return dip; } - /// \brief Return a copy of the system forces - std::vector system_forces() const; + /// \brief Return a copy of the total forces + std::vector total_forces() const; /// \brief Return a copy of the aggregated total force on the group - cvm::rvector system_force() const; + cvm::rvector total_force() const; /// \brief Shorthand: save the specified gradient on each atom, diff --git a/lib/colvars/colvarbias_abf.cpp b/lib/colvars/colvarbias_abf.cpp index 475e4ecef0..f2659951d4 100644 --- a/lib/colvars/colvarbias_abf.cpp +++ b/lib/colvars/colvarbias_abf.cpp @@ -7,7 +7,7 @@ colvarbias_abf::colvarbias_abf(char const *key) : colvarbias(key), - force(NULL), + system_force(NULL), gradients(NULL), samples(NULL), z_gradients(NULL), @@ -81,8 +81,8 @@ int colvarbias_abf::init(std::string const &conf) } if (update_bias) { - // Request calculation of system force (which also checks for availability) - if(enable(f_cvb_get_system_force)) return cvm::get_error(); + // Request calculation of total force (which also checks for availability) + if(enable(f_cvb_get_total_force)) return cvm::get_error(); } if (apply_bias) { if(enable(f_cvb_apply_force)) return cvm::get_error(); @@ -112,7 +112,7 @@ int colvarbias_abf::init(std::string const &conf) if (max_force.size() != colvars.size()) { cvm::error("Error: Number of parameters to maxForce does not match number of colvars."); } - for (size_t i=0; i 0) @@ -231,35 +231,39 @@ int colvarbias_abf::update() // initialization stuff (file operations relying on n_abf_biases // compute current value of colvars - for (size_t i=0; icurrent_bin_scalar(i); } } else { - for (size_t i=0; icurrent_bin_scalar(i); } if ( update_bias && samples->index_ok(force_bin) ) { // Only if requested and within bounds of the grid... - for (size_t i=0; isystem_force(); + for (size_t i = 0; i < colvars.size(); i++) { + // get total forces (lagging by 1 timestep) from colvars + // and subtract previous ABF force + system_force[i] = colvars[i]->total_force().real_value + - colvar_forces[i].real_value; } - gradients->acc_force(force_bin, force); + gradients->acc_force(force_bin, system_force); } if ( z_gradients && update_bias ) { - for (size_t i=0; icurrent_bin_scalar(i); } if ( z_samples->index_ok(z_bin) ) { - for (size_t i=0; isystem_force(); + system_force[i] = colvars[i]->total_force().real_value + - colvar_forces[i].real_value; } - z_gradients->acc_force(z_bin, force); + z_gradients->acc_force(z_bin, system_force); } } } @@ -268,7 +272,7 @@ int colvarbias_abf::update() force_bin = bin; // Reset biasing forces from previous timestep - for (size_t i=0; iaverage()); } else { - for (size_t i=0; i max_force[i] * max_force[i] ) { colvar_forces[i].real_value = (colvar_forces[i].real_value > 0 ? max_force[i] : -1.0 * max_force[i]); } diff --git a/lib/colvars/colvarbias_abf.h b/lib/colvars/colvarbias_abf.h index 18b9a463b5..8db0b75632 100644 --- a/lib/colvars/colvarbias_abf.h +++ b/lib/colvars/colvarbias_abf.h @@ -27,7 +27,7 @@ public: private: /// Filename prefix for human-readable gradient/sample count output - std::string output_prefix; + std::string output_prefix; /// Base filename(s) for reading previous gradient data (replaces data from restart file) std::vector input_prefix; @@ -50,7 +50,7 @@ private: // Internal data and methods std::vector bin, force_bin, z_bin; - gradient_t force; + gradient_t system_force, applied_force; /// n-dim grid of free energy gradients colvar_grid_gradient *gradients; diff --git a/lib/colvars/colvarcomp.h b/lib/colvars/colvarcomp.h index deed1a4721..f632754ab6 100644 --- a/lib/colvars/colvarcomp.h +++ b/lib/colvars/colvarcomp.h @@ -153,8 +153,8 @@ public: // /// \brief Return const pointer to the previously calculated value // virtual const colvarvalue *p_value() const; - /// \brief Return the previously calculated system force - virtual colvarvalue const & system_force() const; + /// \brief Return the previously calculated total force + virtual colvarvalue const & total_force() const; /// \brief Return the previously calculated divergence of the /// inverse atomic gradients @@ -232,7 +232,7 @@ protected: /// \brief Value at the previous step colvarvalue x_old; - /// \brief Calculated system force (\b Note: this is calculated from + /// \brief Calculated total force (\b Note: this is calculated from /// the total atomic forces read from the program, subtracting fromt /// the "internal" forces of the system the "external" forces from /// the colvar biases) @@ -256,7 +256,7 @@ inline colvarvalue const & colvar::cvc::value() const // return &x; // } -inline colvarvalue const & colvar::cvc::system_force() const +inline colvarvalue const & colvar::cvc::total_force() const { return ft; } @@ -306,7 +306,7 @@ protected: cvm::rvector dist_v; /// Use absolute positions, ignoring PBCs when present bool b_no_PBC; - /// Compute system force on first site only to avoid unwanted + /// Compute total force on first site only to avoid unwanted /// coupling to other colvars (see e.g. Ciccotti et al., 2005) bool b_1site_force; public: @@ -388,7 +388,7 @@ protected: cvm::atom_group *ref2; /// Use absolute positions, ignoring PBCs when present bool b_no_PBC; - /// Compute system force on one site only to avoid unwanted + /// Compute total force on one site only to avoid unwanted /// coupling to other colvars (see e.g. Ciccotti et al., 2005) bool b_1site_force; /// Vector on which the distance vector is projected @@ -637,7 +637,7 @@ protected: /// Derivatives wrt group centers of mass cvm::rvector dxdr1, dxdr3; - /// Compute system force on first site only to avoid unwanted + /// Compute total force on first site only to avoid unwanted /// coupling to other colvars (see e.g. Ciccotti et al., 2005) /// (or to allow dummy atoms) bool b_1site_force; @@ -683,7 +683,7 @@ protected: /// Derivatives wrt group centers of mass cvm::rvector dxdr1, dxdr3; - /// Compute system force on first site only to avoid unwanted + /// Compute total force on first site only to avoid unwanted /// coupling to other colvars (see e.g. Ciccotti et al., 2005) /// (or to allow dummy atoms) bool b_1site_force; @@ -724,7 +724,7 @@ protected: /// Inter site vectors cvm::rvector r12, r23, r34; - /// \brief Compute system force on first site only to avoid unwanted + /// \brief Compute total force on first site only to avoid unwanted /// coupling to other colvars (see e.g. Ciccotti et al., 2005) bool b_1site_force; diff --git a/lib/colvars/colvarcomp_angles.cpp b/lib/colvars/colvarcomp_angles.cpp index a4bf53feb7..b1acb201ae 100644 --- a/lib/colvars/colvarcomp_angles.cpp +++ b/lib/colvars/colvarcomp_angles.cpp @@ -19,7 +19,7 @@ colvar::angle::angle(std::string const &conf) group2 = parse_group(conf, "group2"); group3 = parse_group(conf, "group3"); if (get_keyval(conf, "oneSiteSystemForce", b_1site_force, false)) { - cvm::log("Computing system force on group 1 only"); + cvm::log("Computing total force on group 1 only"); } x.type(colvarvalue::type_scalar); } @@ -95,15 +95,15 @@ void colvar::angle::calc_force_invgrads() // when propagating changes in the angle) if (b_1site_force) { - group1->read_system_forces(); + group1->read_total_forces(); cvm::real norm_fact = 1.0 / dxdr1.norm2(); - ft.real_value = norm_fact * dxdr1 * group1->system_force(); + ft.real_value = norm_fact * dxdr1 * group1->total_force(); } else { - group1->read_system_forces(); - group3->read_system_forces(); + group1->read_total_forces(); + group3->read_total_forces(); cvm::real norm_fact = 1.0 / (dxdr1.norm2() + dxdr3.norm2()); - ft.real_value = norm_fact * ( dxdr1 * group1->system_force() - + dxdr3 * group3->system_force()); + ft.real_value = norm_fact * ( dxdr1 * group1->total_force() + + dxdr3 * group3->total_force()); } return; } @@ -141,7 +141,7 @@ colvar::dipole_angle::dipole_angle(std::string const &conf) group3 = parse_group(conf, "group3"); if (get_keyval(conf, "oneSiteSystemForce", b_1site_force, false)) { - cvm::log("Computing system force on group 1 only"); + cvm::log("Computing total force on group 1 only"); } x.type(colvarvalue::type_scalar); } @@ -251,7 +251,7 @@ colvar::dihedral::dihedral(std::string const &conf) provide(f_cvc_com_based); if (get_keyval(conf, "oneSiteSystemForce", b_1site_force, false)) { - cvm::log("Computing system force on group 1 only"); + cvm::log("Computing total force on group 1 only"); } group1 = parse_group(conf, "group1"); group2 = parse_group(conf, "group2"); @@ -421,15 +421,15 @@ void colvar::dihedral::calc_force_invgrads() cvm::real const fact1 = d12 * std::sqrt(1.0 - dot1 * dot1); cvm::real const fact4 = d34 * std::sqrt(1.0 - dot4 * dot4); - group1->read_system_forces(); + group1->read_total_forces(); if ( b_1site_force ) { // This is only measuring the force on group 1 - ft.real_value = PI/180.0 * fact1 * (cross1 * group1->system_force()); + ft.real_value = PI/180.0 * fact1 * (cross1 * group1->total_force()); } else { // Default case: use groups 1 and 4 - group4->read_system_forces(); - ft.real_value = PI/180.0 * 0.5 * (fact1 * (cross1 * group1->system_force()) - + fact4 * (cross4 * group4->system_force())); + group4->read_total_forces(); + ft.real_value = PI/180.0 * 0.5 * (fact1 * (cross1 * group1->total_force()) + + fact4 * (cross4 * group4->total_force())); } } diff --git a/lib/colvars/colvarcomp_distances.cpp b/lib/colvars/colvarcomp_distances.cpp index ff6b03e2c5..f7bf2b87f0 100644 --- a/lib/colvars/colvarcomp_distances.cpp +++ b/lib/colvars/colvarcomp_distances.cpp @@ -22,7 +22,7 @@ colvar::distance::distance(std::string const &conf) cvm::log("Computing distance using absolute positions (not minimal-image)"); } if (get_keyval(conf, "oneSiteSystemForce", b_1site_force, false)) { - cvm::log("Computing system force on group 1 only"); + cvm::log("Computing total force on group 1 only"); } group1 = parse_group(conf, "group1"); group2 = parse_group(conf, "group2"); @@ -66,12 +66,12 @@ void colvar::distance::calc_gradients() void colvar::distance::calc_force_invgrads() { - group1->read_system_forces(); + group1->read_total_forces(); if ( b_1site_force ) { - ft.real_value = -1.0 * (group1->system_force() * dist_v.unit()); + ft.real_value = -1.0 * (group1->total_force() * dist_v.unit()); } else { - group2->read_system_forces(); - ft.real_value = 0.5 * ((group2->system_force() - group1->system_force()) * dist_v.unit()); + group2->read_total_forces(); + ft.real_value = 0.5 * ((group2->total_force() - group1->total_force()) * dist_v.unit()); } } @@ -186,7 +186,7 @@ colvar::distance_z::distance_z(std::string const &conf) cvm::log("Computing distance using absolute positions (not minimal-image)"); } if (get_keyval(conf, "oneSiteSystemForce", b_1site_force, false)) { - cvm::log("Computing system force on group \"main\" only"); + cvm::log("Computing total force on group \"main\" only"); } } @@ -249,13 +249,13 @@ void colvar::distance_z::calc_gradients() void colvar::distance_z::calc_force_invgrads() { - main->read_system_forces(); + main->read_total_forces(); if (fixed_axis && !b_1site_force) { - ref1->read_system_forces(); - ft.real_value = 0.5 * ((main->system_force() - ref1->system_force()) * axis); + ref1->read_total_forces(); + ft.real_value = 0.5 * ((main->total_force() - ref1->total_force()) * axis); } else { - ft.real_value = main->system_force() * axis; + ft.real_value = main->total_force() * axis; } } @@ -349,13 +349,13 @@ void colvar::distance_xy::calc_gradients() void colvar::distance_xy::calc_force_invgrads() { - main->read_system_forces(); + main->read_total_forces(); if (fixed_axis && !b_1site_force) { - ref1->read_system_forces(); - ft.real_value = 0.5 / x.real_value * ((main->system_force() - ref1->system_force()) * dist_v_ortho); + ref1->read_total_forces(); + ft.real_value = 0.5 / x.real_value * ((main->total_force() - ref1->total_force()) * dist_v_ortho); } else { - ft.real_value = 1.0 / x.real_value * main->system_force() * dist_v_ortho; + ft.real_value = 1.0 / x.real_value * main->total_force() * dist_v_ortho; } } @@ -655,13 +655,13 @@ void colvar::gyration::calc_gradients() void colvar::gyration::calc_force_invgrads() { - atoms->read_system_forces(); + atoms->read_total_forces(); cvm::real const dxdr = 1.0/x.real_value; ft.real_value = 0.0; for (cvm::atom_iter ai = atoms->begin(); ai != atoms->end(); ai++) { - ft.real_value += dxdr * ai->pos * ai->system_force; + ft.real_value += dxdr * ai->pos * ai->total_force; } } @@ -903,13 +903,13 @@ void colvar::rmsd::apply_force(colvarvalue const &force) void colvar::rmsd::calc_force_invgrads() { - atoms->read_system_forces(); + atoms->read_total_forces(); ft.real_value = 0.0; // Note: gradient square norm is 1/N_atoms for (size_t ia = 0; ia < atoms->size(); ia++) { - ft.real_value += (*atoms)[ia].grad * (*atoms)[ia].system_force; + ft.real_value += (*atoms)[ia].grad * (*atoms)[ia].total_force; } ft.real_value *= atoms->size(); } @@ -1191,12 +1191,12 @@ void colvar::eigenvector::apply_force(colvarvalue const &force) void colvar::eigenvector::calc_force_invgrads() { - atoms->read_system_forces(); + atoms->read_total_forces(); ft.real_value = 0.0; for (size_t ia = 0; ia < atoms->size(); ia++) { ft.real_value += eigenvec_invnorm2 * (*atoms)[ia].grad * - (*atoms)[ia].system_force; + (*atoms)[ia].total_force; } } diff --git a/lib/colvars/colvardeps.cpp b/lib/colvars/colvardeps.cpp index c4915569e2..7d8d05a2be 100644 --- a/lib/colvars/colvardeps.cpp +++ b/lib/colvars/colvardeps.cpp @@ -207,8 +207,8 @@ void colvardeps::init_cvb_requires() { f_description(f_cvb_apply_force, "apply force"); f_req_children(f_cvb_apply_force, f_cv_gradient); - f_description(f_cvb_get_system_force, "obtain system force"); - f_req_children(f_cvb_get_system_force, f_cv_system_force); + f_description(f_cvb_get_total_force, "obtain total force"); + f_req_children(f_cvb_get_total_force, f_cv_total_force); f_description(f_cvb_history_dependent, "history-dependent"); @@ -247,15 +247,15 @@ void colvardeps::init_cv_requires() { f_description(f_cv_fdiff_velocity, "fdiff_velocity"); // System force: either trivial (spring force); through extended Lagrangian, or calculated explicitly - f_description(f_cv_system_force, "system force"); - f_req_alt2(f_cv_system_force, f_cv_extended_Lagrangian, f_cv_system_force_calc); + f_description(f_cv_total_force, "total force"); + f_req_alt2(f_cv_total_force, f_cv_extended_Lagrangian, f_cv_total_force_calc); - // Deps for explicit system force calculation - f_description(f_cv_system_force_calc, "system force calculation"); - f_req_self(f_cv_system_force_calc, f_cv_scalar); - f_req_self(f_cv_system_force_calc, f_cv_linear); - f_req_children(f_cv_system_force_calc, f_cvc_inv_gradient); - f_req_self(f_cv_system_force_calc, f_cv_Jacobian); + // Deps for explicit total force calculation + f_description(f_cv_total_force_calc, "total force calculation"); + f_req_self(f_cv_total_force_calc, f_cv_scalar); + f_req_self(f_cv_total_force_calc, f_cv_linear); + f_req_children(f_cv_total_force_calc, f_cvc_inv_gradient); + f_req_self(f_cv_total_force_calc, f_cv_Jacobian); f_description(f_cv_Jacobian, "Jacobian derivative"); f_req_self(f_cv_Jacobian, f_cv_scalar); @@ -283,8 +283,8 @@ void colvardeps::init_cv_requires() { f_description(f_cv_output_applied_force, "output applied force"); - f_description(f_cv_output_system_force, "output system force"); - f_req_self(f_cv_output_system_force, f_cv_system_force); + f_description(f_cv_output_total_force, "output total force"); + f_req_self(f_cv_output_total_force, f_cv_total_force); f_description(f_cv_lower_boundary, "lower boundary"); f_req_self(f_cv_lower_boundary, f_cv_scalar); diff --git a/lib/colvars/colvardeps.h b/lib/colvars/colvardeps.h index 7e69865a56..a2f6f2d5f9 100644 --- a/lib/colvars/colvardeps.h +++ b/lib/colvars/colvardeps.h @@ -161,7 +161,7 @@ public: /// \brief Bias is active f_cvb_active, f_cvb_apply_force, // will apply forces - f_cvb_get_system_force, // requires system forces + f_cvb_get_total_force, // requires total forces f_cvb_history_dependent, // depends on simulation history f_cvb_ntot }; @@ -177,14 +177,14 @@ public: f_cv_collect_gradient, /// \brief Calculate the velocity with finite differences f_cv_fdiff_velocity, - /// \brief The system force is calculated, projecting the atomic + /// \brief The total force is calculated, projecting the atomic /// forces on the inverse gradient - f_cv_system_force, - /// \brief Calculate system force from atomic forces - f_cv_system_force_calc, + f_cv_total_force, + /// \brief Calculate total force from atomic forces + f_cv_total_force_calc, /// \brief Estimate Jacobian derivative f_cv_Jacobian, - /// \brief Do not report the Jacobian force as part of the system force + /// \brief Do not report the Jacobian force as part of the total force /// instead, apply a correction internally to cancel it f_cv_hide_Jacobian, /// \brief The variable has a harmonic restraint around a moving @@ -202,8 +202,8 @@ public: f_cv_output_velocity, /// \brief Output the applied force to the trajectory file f_cv_output_applied_force, - /// \brief Output the system force to the trajectory file - f_cv_output_system_force, + /// \brief Output the total force to the trajectory file + f_cv_output_total_force, /// \brief A lower boundary is defined f_cv_lower_boundary, /// \brief An upper boundary is defined diff --git a/lib/colvars/colvarmodule.h b/lib/colvars/colvarmodule.h index f461728de8..cb4272f0bd 100644 --- a/lib/colvars/colvarmodule.h +++ b/lib/colvars/colvarmodule.h @@ -384,8 +384,8 @@ public: /// \brief Time step of MD integrator (fs) static real dt(); - /// Request calculation of system force from MD engine - static void request_system_force(); + /// Request calculation of total force from MD engine + static void request_total_force(); /// Print a message to the main log static void log(std::string const &message); @@ -634,9 +634,9 @@ inline int cvm::replica_comm_send(char* msg_data, int msg_len, int dest_rep) { } -inline void cvm::request_system_force() +inline void cvm::request_total_force() { - proxy->request_system_force(true); + proxy->request_total_force(true); } inline void cvm::select_closest_image(atom_pos &pos, diff --git a/lib/colvars/colvarproxy.h b/lib/colvars/colvarproxy.h index 4bba189bb7..bd5ee3da47 100644 --- a/lib/colvars/colvarproxy.h +++ b/lib/colvars/colvarproxy.h @@ -295,11 +295,11 @@ public: /// Pass restraint energy value for current timestep to MD engine virtual void add_energy(cvm::real energy) = 0; - /// Tell the proxy whether system forces are needed (may not always be available) - virtual void request_system_force(bool yesno) + /// Tell the proxy whether total forces are needed (may not always be available) + virtual void request_total_force(bool yesno) { if (yesno == true) - cvm::error("Error: system forces are currently not implemented.\n", + cvm::error("Error: total forces are currently not implemented.\n", COLVARS_NOT_IMPLEMENTED); } @@ -354,8 +354,6 @@ protected: std::vector atoms_positions; /// \brief Most recent total forces on each atom std::vector atoms_total_forces; - /// \brief Most recent forces applied by external potentials onto each atom - std::vector atoms_applied_forces; /// \brief Forces applied from colvars, to be communicated to the MD integrator std::vector atoms_new_colvar_forces; @@ -368,7 +366,6 @@ protected: atoms_charges.push_back(0.0); atoms_positions.push_back(cvm::rvector(0.0, 0.0, 0.0)); atoms_total_forces.push_back(cvm::rvector(0.0, 0.0, 0.0)); - atoms_applied_forces.push_back(cvm::rvector(0.0, 0.0, 0.0)); atoms_new_colvar_forces.push_back(cvm::rvector(0.0, 0.0, 0.0)); return (atoms_ids.size() - 1); } @@ -439,10 +436,10 @@ public: return atoms_positions[index]; } - /// Read the current total system force of the given atom - inline cvm::rvector get_atom_system_force(int index) const + /// Read the current total force of the given atom + inline cvm::rvector get_atom_total_force(int index) const { - return atoms_total_forces[index] - atoms_applied_forces[index]; + return atoms_total_forces[index]; } /// Request that this force is applied to the given atom @@ -465,7 +462,6 @@ public: inline std::vector *modify_atom_charges() { return &atoms_charges; } inline std::vector *modify_atom_positions() { return &atoms_positions; } inline std::vector *modify_atom_total_forces() { return &atoms_total_forces; } - inline std::vector *modify_atom_applied_forces() { return &atoms_applied_forces; } inline std::vector *modify_atom_new_colvar_forces() { return &atoms_new_colvar_forces; } /// \brief Read atom identifiers from a file \param filename name of @@ -513,8 +509,6 @@ protected: std::vector atom_groups_coms; /// \brief Most recently updated total forces on the com of each group std::vector atom_groups_total_forces; - /// \brief Most recent forces applied by external potentials onto each group - std::vector atom_groups_applied_forces; /// \brief Forces applied from colvars, to be communicated to the MD integrator std::vector atom_groups_new_colvar_forces; @@ -538,7 +532,6 @@ public: atom_groups_charges.push_back(0.0); atom_groups_coms.push_back(cvm::rvector(0.0, 0.0, 0.0)); atom_groups_total_forces.push_back(cvm::rvector(0.0, 0.0, 0.0)); - atom_groups_applied_forces.push_back(cvm::rvector(0.0, 0.0, 0.0)); atom_groups_new_colvar_forces.push_back(cvm::rvector(0.0, 0.0, 0.0)); return (atom_groups_ids.size() - 1); } @@ -592,10 +585,10 @@ public: return atom_groups_coms[index]; } - /// Read the current total system force of the given atom group - inline cvm::rvector get_atom_group_system_force(int index) const + /// Read the current total force of the given atom group + inline cvm::rvector get_atom_group_total_force(int index) const { - return atom_groups_total_forces[index] - atom_groups_applied_forces[index]; + return atom_groups_total_forces[index]; } /// Request that this force is applied to the given atom group diff --git a/lib/colvars/colvarscript.cpp b/lib/colvars/colvarscript.cpp index 374359ccef..069a995135 100644 --- a/lib/colvars/colvarscript.cpp +++ b/lib/colvars/colvarscript.cpp @@ -248,7 +248,7 @@ int colvarscript::proc_colvar(int argc, char const *argv[]) { } if (subcmd == "getsystemforce") { - result = (cv->system_force()).to_simple_string(); + result = (cv->total_force()).to_simple_string(); return COLVARS_OK; } diff --git a/src/USER-COLVARS/colvarproxy_lammps.cpp b/src/USER-COLVARS/colvarproxy_lammps.cpp index 71786f060e..f02fd23951 100644 --- a/src/USER-COLVARS/colvarproxy_lammps.cpp +++ b/src/USER-COLVARS/colvarproxy_lammps.cpp @@ -73,7 +73,7 @@ colvarproxy_lammps::colvarproxy_lammps(LAMMPS_NS::LAMMPS *lmp, _random = new LAMMPS_NS::RanPark(lmp,seed); first_timestep=true; - system_force_requested=false; + total_force_requested=false; previous_step=-1; t_target=temp; do_exit=false; @@ -154,7 +154,6 @@ void colvarproxy_lammps::init(const char *conf_file) log("atoms_ids = "+cvm::to_str(atoms_ids)+"\n"); log("atoms_ncopies = "+cvm::to_str(atoms_ncopies)+"\n"); log("atoms_positions = "+cvm::to_str(atoms_positions)+"\n"); - log("atoms_applied_forces = "+cvm::to_str(atoms_applied_forces)+"\n"); log(cvm::line_marker); log("Info: done initializing the colvars proxy object.\n"); } @@ -199,13 +198,8 @@ double colvarproxy_lammps::compute() "Updating internal data.\n"); } - // backup applied forces if necessary to calculate system forces - if (system_force_requested) { - atoms_applied_forces = atoms_new_colvar_forces; - } - // zero the forces on the atoms, so that they can be accumulated by the colvars - for (size_t i = 0; i < atoms_applied_forces.size(); i++) { + for (size_t i = 0; i < atoms_new_colvar_forces.size(); i++) { atoms_new_colvar_forces[i].reset(); } diff --git a/src/USER-COLVARS/colvarproxy_lammps.h b/src/USER-COLVARS/colvarproxy_lammps.h index 0ce7e29a0c..925fefac04 100644 --- a/src/USER-COLVARS/colvarproxy_lammps.h +++ b/src/USER-COLVARS/colvarproxy_lammps.h @@ -55,7 +55,7 @@ class colvarproxy_lammps : public colvarproxy { int previous_step; bool first_timestep; - bool system_force_requested; + bool total_force_requested; bool do_exit; // std::vector colvars_atoms; @@ -86,7 +86,7 @@ class colvarproxy_lammps : public colvarproxy { // methods for lammps to move data or trigger actions in the proxy public: void set_temperature(double t) { t_target = t; }; - bool need_system_forces() const { return system_force_requested; }; + bool need_total_forces() const { return total_force_requested; }; bool want_exit() const { return do_exit; }; // perform colvars computation. returns biasing energy @@ -109,7 +109,7 @@ class colvarproxy_lammps : public colvarproxy { inline size_t restart_frequency() { return restart_every; }; void add_energy(cvm::real energy) { bias_energy += energy; }; - void request_system_force(bool yesno) { system_force_requested = yesno; }; + void request_total_force(bool yesno) { total_force_requested = yesno; }; void log(std::string const &message); void error(std::string const &message); diff --git a/src/USER-COLVARS/fix_colvars.cpp b/src/USER-COLVARS/fix_colvars.cpp index 3e86cd13a4..4f85c882d4 100644 --- a/src/USER-COLVARS/fix_colvars.cpp +++ b/src/USER-COLVARS/fix_colvars.cpp @@ -766,7 +766,7 @@ void FixColvars::post_force(int vflag) // call our workhorse and retrieve additional information. if (me == 0) { energy = proxy->compute(); - store_forces = proxy->need_system_forces(); + store_forces = proxy->need_total_forces(); } //////////////////////////////////////////////////////////////////////// -- GitLab From 16607a0132d518968f1def738c08041b2be8edb2 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 23 Aug 2016 05:53:05 -0400 Subject: [PATCH 14/52] update colvars library to version 2016-08-19 (cherry picked from commit c67326be6d9346d64bf4a0a58acaa132f0c004c8) --- doc/src/PDF/colvars-refman-lammps.pdf | Bin 533480 -> 533636 bytes lib/colvars/Makefile.fermi | 8 ++--- lib/colvars/Makefile.g++ | 8 ++--- lib/colvars/Makefile.mingw32-cross | 8 ++--- lib/colvars/Makefile.mingw64-cross | 8 ++--- lib/colvars/colvar.cpp | 44 ++++++++++++++------------ lib/colvars/colvar.h | 4 +-- lib/colvars/colvarbias_abf.cpp | 16 +++++----- lib/colvars/colvarbias_abf.h | 1 - lib/colvars/colvarcomp.cpp | 3 +- lib/colvars/colvardeps.cpp | 29 ++++++++++------- lib/colvars/colvardeps.h | 30 +++++++----------- lib/colvars/colvarmodule.h | 2 +- lib/colvars/colvarparse.cpp | 15 --------- lib/colvars/colvarparse.h | 7 ---- lib/colvars/colvarscript.cpp | 5 +++ 16 files changed, 88 insertions(+), 100 deletions(-) diff --git a/doc/src/PDF/colvars-refman-lammps.pdf b/doc/src/PDF/colvars-refman-lammps.pdf index 0dd82d47947628d5c55c0481499dcc8b79a4598d..071bdb25b89d87e6b9a7ea20053680408dcf72ee 100644 GIT binary patch delta 16450 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 UT7^T7+rYxqgiBS`)!&T^0Krm+<^TWy diff --git a/lib/colvars/Makefile.fermi b/lib/colvars/Makefile.fermi index e17798bbc3..906675ae12 100644 --- a/lib/colvars/Makefile.fermi +++ b/lib/colvars/Makefile.fermi @@ -93,8 +93,8 @@ colvarcomp_rotations.o: colvarcomp_rotations.cpp colvarmodule.h \ colvar.o: colvar.cpp colvarmodule.h colvartypes.h colvarproxy.h \ colvarvalue.h colvarparse.h colvardeps.h colvar.h colvarcomp.h \ colvaratoms.h colvarscript.h colvarbias.h -colvardeps.o: colvardeps.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvardeps.h +colvardeps.o: colvardeps.cpp colvardeps.h colvarmodule.h colvartypes.h \ + colvarproxy.h colvarvalue.h colvarparse.h colvargrid.o: colvargrid.cpp colvarmodule.h colvartypes.h colvarproxy.h \ colvarvalue.h colvarparse.h colvardeps.h colvar.h colvarcomp.h \ colvaratoms.h colvargrid.h @@ -104,12 +104,12 @@ colvarmodule.o: colvarmodule.cpp colvarmodule.h colvartypes.h \ colvarbias_restraint.h colvarbias_histogram.h colvarbias_meta.h \ colvarscript.h colvarparse.o: colvarparse.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarparse.h colvardeps.h + colvarvalue.h colvarparse.h colvarscript.o: colvarscript.cpp colvarscript.h colvarmodule.h \ colvartypes.h colvarproxy.h colvarvalue.h colvarbias.h colvar.h \ colvarparse.h colvardeps.h colvartypes.o: colvartypes.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarparse.h colvardeps.h + colvarvalue.h colvarparse.h colvarvalue.o: colvarvalue.cpp colvarmodule.h colvartypes.h colvarproxy.h \ colvarvalue.h diff --git a/lib/colvars/Makefile.g++ b/lib/colvars/Makefile.g++ index f1fa1734b9..c80fa1065e 100644 --- a/lib/colvars/Makefile.g++ +++ b/lib/colvars/Makefile.g++ @@ -92,8 +92,8 @@ colvarcomp_rotations.o: colvarcomp_rotations.cpp colvarmodule.h \ colvar.o: colvar.cpp colvarmodule.h colvartypes.h colvarproxy.h \ colvarvalue.h colvarparse.h colvardeps.h colvar.h colvarcomp.h \ colvaratoms.h colvarscript.h colvarbias.h -colvardeps.o: colvardeps.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvardeps.h +colvardeps.o: colvardeps.cpp colvardeps.h colvarmodule.h colvartypes.h \ + colvarproxy.h colvarvalue.h colvarparse.h colvargrid.o: colvargrid.cpp colvarmodule.h colvartypes.h colvarproxy.h \ colvarvalue.h colvarparse.h colvardeps.h colvar.h colvarcomp.h \ colvaratoms.h colvargrid.h @@ -103,12 +103,12 @@ colvarmodule.o: colvarmodule.cpp colvarmodule.h colvartypes.h \ colvarbias_restraint.h colvarbias_histogram.h colvarbias_meta.h \ colvarscript.h colvarparse.o: colvarparse.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarparse.h colvardeps.h + colvarvalue.h colvarparse.h colvarscript.o: colvarscript.cpp colvarscript.h colvarmodule.h \ colvartypes.h colvarproxy.h colvarvalue.h colvarbias.h colvar.h \ colvarparse.h colvardeps.h colvartypes.o: colvartypes.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarparse.h colvardeps.h + colvarvalue.h colvarparse.h colvarvalue.o: colvarvalue.cpp colvarmodule.h colvartypes.h colvarproxy.h \ colvarvalue.h diff --git a/lib/colvars/Makefile.mingw32-cross b/lib/colvars/Makefile.mingw32-cross index cea3a53c25..eba83c555f 100644 --- a/lib/colvars/Makefile.mingw32-cross +++ b/lib/colvars/Makefile.mingw32-cross @@ -100,8 +100,8 @@ $(DIR)colvarcomp_rotations.o: colvarcomp_rotations.cpp colvarmodule.h \ $(DIR)colvar.o: colvar.cpp colvarmodule.h colvartypes.h colvarproxy.h \ colvarvalue.h colvarparse.h colvardeps.h colvar.h colvarcomp.h \ colvaratoms.h colvarscript.h colvarbias.h -$(DIR)colvardeps.o: colvardeps.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvardeps.h +$(DIR)colvardeps.o: colvardeps.cpp colvardeps.h colvarmodule.h colvartypes.h \ + colvarproxy.h colvarvalue.h colvarparse.h $(DIR)colvargrid.o: colvargrid.cpp colvarmodule.h colvartypes.h colvarproxy.h \ colvarvalue.h colvarparse.h colvardeps.h colvar.h colvarcomp.h \ colvaratoms.h colvargrid.h @@ -111,12 +111,12 @@ $(DIR)colvarmodule.o: colvarmodule.cpp colvarmodule.h colvartypes.h \ colvarbias_restraint.h colvarbias_histogram.h colvarbias_meta.h \ colvarscript.h $(DIR)colvarparse.o: colvarparse.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarparse.h colvardeps.h + colvarvalue.h colvarparse.h $(DIR)colvarscript.o: colvarscript.cpp colvarscript.h colvarmodule.h \ colvartypes.h colvarproxy.h colvarvalue.h colvarbias.h colvar.h \ colvarparse.h colvardeps.h $(DIR)colvartypes.o: colvartypes.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarparse.h colvardeps.h + colvarvalue.h colvarparse.h $(DIR)colvarvalue.o: colvarvalue.cpp colvarmodule.h colvartypes.h colvarproxy.h \ colvarvalue.h diff --git a/lib/colvars/Makefile.mingw64-cross b/lib/colvars/Makefile.mingw64-cross index 7dd85b48f8..1d83b6a0a8 100644 --- a/lib/colvars/Makefile.mingw64-cross +++ b/lib/colvars/Makefile.mingw64-cross @@ -100,8 +100,8 @@ $(DIR)colvarcomp_rotations.o: colvarcomp_rotations.cpp colvarmodule.h \ $(DIR)colvar.o: colvar.cpp colvarmodule.h colvartypes.h colvarproxy.h \ colvarvalue.h colvarparse.h colvardeps.h colvar.h colvarcomp.h \ colvaratoms.h colvarscript.h colvarbias.h -$(DIR)colvardeps.o: colvardeps.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvardeps.h +$(DIR)colvardeps.o: colvardeps.cpp colvardeps.h colvarmodule.h colvartypes.h \ + colvarproxy.h colvarvalue.h colvarparse.h $(DIR)colvargrid.o: colvargrid.cpp colvarmodule.h colvartypes.h colvarproxy.h \ colvarvalue.h colvarparse.h colvardeps.h colvar.h colvarcomp.h \ colvaratoms.h colvargrid.h @@ -111,12 +111,12 @@ $(DIR)colvarmodule.o: colvarmodule.cpp colvarmodule.h colvartypes.h \ colvarbias_restraint.h colvarbias_histogram.h colvarbias_meta.h \ colvarscript.h $(DIR)colvarparse.o: colvarparse.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarparse.h colvardeps.h + colvarvalue.h colvarparse.h $(DIR)colvarscript.o: colvarscript.cpp colvarscript.h colvarmodule.h \ colvartypes.h colvarproxy.h colvarvalue.h colvarbias.h colvar.h \ colvarparse.h colvardeps.h $(DIR)colvartypes.o: colvartypes.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarparse.h colvardeps.h + colvarvalue.h colvarparse.h $(DIR)colvarvalue.o: colvarvalue.cpp colvarmodule.h colvartypes.h colvarproxy.h \ colvarvalue.h diff --git a/lib/colvars/colvar.cpp b/lib/colvars/colvar.cpp index 1dd46524ac..84880808af 100644 --- a/lib/colvars/colvar.cpp +++ b/lib/colvars/colvar.cpp @@ -771,7 +771,7 @@ int colvar::calc_cvcs(int first_cvc, size_t num_cvcs) error_code |= calc_cvc_values(first_cvc, num_cvcs); error_code |= calc_cvc_gradients(first_cvc, num_cvcs); - error_code |= calc_cvc_sys_forces(first_cvc, num_cvcs); + error_code |= calc_cvc_total_force(first_cvc, num_cvcs); error_code |= calc_cvc_Jacobians(first_cvc, num_cvcs); if (cvm::debug()) @@ -790,7 +790,7 @@ int colvar::collect_cvc_data() error_code |= collect_cvc_values(); error_code |= collect_cvc_gradients(); - error_code |= collect_cvc_sys_forces(); + error_code |= collect_cvc_total_forces(); error_code |= collect_cvc_Jacobians(); error_code |= calc_colvar_properties(); @@ -889,21 +889,22 @@ int colvar::calc_cvc_gradients(int first_cvc, size_t num_cvcs) size_t const cvc_max_count = num_cvcs ? num_cvcs : num_active_cvcs(); size_t i, cvc_count; - if (is_enabled(f_cv_gradient)) { + if (cvm::debug()) + cvm::log("Calculating gradients of colvar \""+this->name+"\".\n"); - if (cvm::debug()) - cvm::log("Calculating gradients of colvar \""+this->name+"\".\n"); + // calculate the gradients of each component + cvm::increase_depth(); + for (i = first_cvc, cvc_count = 0; + (i < cvcs.size()) && (cvc_count < cvc_max_count); + i++) { + if (!cvcs[i]->is_enabled()) continue; + cvc_count++; - // calculate the gradients of each component - cvm::increase_depth(); - for (i = first_cvc, cvc_count = 0; - (i < cvcs.size()) && (cvc_count < cvc_max_count); - i++) { - if (!cvcs[i]->is_enabled()) continue; - cvc_count++; + if ((cvcs[i])->is_enabled(f_cvc_gradient)) { (cvcs[i])->calc_gradients(); // if requested, propagate (via chain rule) the gradients above // to the atoms used to define the roto-translation + // This could be integrated in the CVC base class for (size_t ig = 0; ig < cvcs[i]->atom_groups.size(); ig++) { if (cvcs[i]->atom_groups[ig]->b_fit_gradients) cvcs[i]->atom_groups[ig]->calc_fit_gradients(); @@ -914,6 +915,7 @@ int colvar::calc_cvc_gradients(int first_cvc, size_t num_cvcs) } } } + cvm::decrease_depth(); if (cvm::debug()) @@ -976,7 +978,7 @@ int colvar::collect_cvc_gradients() } -int colvar::calc_cvc_sys_forces(int first_cvc, size_t num_cvcs) +int colvar::calc_cvc_total_force(int first_cvc, size_t num_cvcs) { size_t const cvc_max_count = num_cvcs ? num_cvcs : num_active_cvcs(); size_t i, cvc_count; @@ -1010,7 +1012,7 @@ int colvar::calc_cvc_sys_forces(int first_cvc, size_t num_cvcs) } -int colvar::collect_cvc_sys_forces() +int colvar::collect_cvc_total_forces() { if (is_enabled(f_cv_total_force_calc)) { ft.reset(); @@ -1097,10 +1099,8 @@ int colvar::calc_colvar_properties() // report the restraint center as "value" x_reported = xr; v_reported = vr; - // the "total force" with the extended Lagrangian is just the - // harmonic term acting on the extended coordinate - // Note: this is the force for current timestep - ft_reported = (-0.5 * ext_force_k) * this->dist2_lgrad(xr, x); + // the "total force" with the extended Lagrangian is + // calculated in update_forces_energy() below } else { @@ -1175,14 +1175,18 @@ cvm::real colvar::update_forces_energy() // the total force is applied to the fictitious mass, while the // atoms only feel the harmonic force - // fr: bias force on extended coordinate (without harmonic spring), for output in trajectory - // f_ext: total force on extended coordinate (including harmonic spring) + // fr: bias force on extended variable (without harmonic spring), for output in trajectory + // f_ext: total force on extended variable (including harmonic spring) // f: - initially, external biasing force // - after this code block, colvar force to be applied to atomic coordinates, ie. spring force fr = f; f_ext = f + (-0.5 * ext_force_k) * this->dist2_lgrad(xr, x); f = (-0.5 * ext_force_k) * this->dist2_rgrad(xr, x); + // The total force acting on the extended variable is f_ext + // This will be used in the next timestep + ft_reported = f_ext; + // leapfrog: starting from x_i, f_i, v_(i-1/2) vr += (0.5 * dt) * f_ext / ext_mass; // Because of leapfrog, kinetic energy at time i is approximate diff --git a/lib/colvars/colvar.h b/lib/colvars/colvar.h index 665b3d6427..0058b56a26 100644 --- a/lib/colvars/colvar.h +++ b/lib/colvars/colvar.h @@ -254,7 +254,7 @@ public: /// \brief Same as \link colvar::calc_cvc_values \endlink but for gradients int calc_cvc_gradients(int first, size_t num_cvcs); /// \brief Same as \link colvar::calc_cvc_values \endlink but for total forces - int calc_cvc_sys_forces(int first, size_t num_cvcs); + int calc_cvc_total_force(int first, size_t num_cvcs); /// \brief Same as \link colvar::calc_cvc_values \endlink but for Jacobian derivatives/forces int calc_cvc_Jacobians(int first, size_t num_cvcs); @@ -266,7 +266,7 @@ public: /// \brief Same as \link colvar::collect_cvc_values \endlink but for gradients int collect_cvc_gradients(); /// \brief Same as \link colvar::collect_cvc_values \endlink but for total forces - int collect_cvc_sys_forces(); + int collect_cvc_total_forces(); /// \brief Same as \link colvar::collect_cvc_values \endlink but for Jacobian derivatives/forces int collect_cvc_Jacobians(); /// \brief Calculate the quantities associated to the colvar (but not to the CVCs) diff --git a/lib/colvars/colvarbias_abf.cpp b/lib/colvars/colvarbias_abf.cpp index f2659951d4..870079a619 100644 --- a/lib/colvars/colvarbias_abf.cpp +++ b/lib/colvars/colvarbias_abf.cpp @@ -31,10 +31,8 @@ int colvarbias_abf::init(std::string const &conf) // ************* parsing general ABF options *********************** - get_keyval(conf, "applyBias", apply_bias, true); - if (apply_bias) { - enable(f_cvb_apply_force); - } else { + get_keyval_feature((colvarparse *)this, conf, "applyBias", f_cvb_apply_force, true); + if (!is_enabled(f_cvb_apply_force)){ cvm::log("WARNING: ABF biases will *not* be applied!\n"); } @@ -84,9 +82,6 @@ int colvarbias_abf::init(std::string const &conf) // Request calculation of total force (which also checks for availability) if(enable(f_cvb_get_total_force)) return cvm::get_error(); } - if (apply_bias) { - if(enable(f_cvb_apply_force)) return cvm::get_error(); - } bool b_extended = false; for (size_t i = 0; i < colvars.size(); i++) { @@ -249,6 +244,11 @@ int colvarbias_abf::update() // and subtract previous ABF force system_force[i] = colvars[i]->total_force().real_value - colvar_forces[i].real_value; +// if (cvm::debug()) +// cvm::log("ABF System force calc: cv " + cvm::to_str(i) + +// " fs " + cvm::to_str(system_force[i]) + +// " = ft " + cvm::to_str(colvars[i]->total_force().real_value) + +// " - fa " + cvm::to_str(colvar_forces[i].real_value)); } gradients->acc_force(force_bin, system_force); } @@ -277,7 +277,7 @@ int colvarbias_abf::update() } // Compute and apply the new bias, if applicable - if ( apply_bias && samples->index_ok(bin) ) { + if (is_enabled(f_cvb_apply_force) && samples->index_ok(bin)) { size_t count = samples->value(bin); cvm::real fact = 1.0; diff --git a/lib/colvars/colvarbias_abf.h b/lib/colvars/colvarbias_abf.h index 8db0b75632..93079220ba 100644 --- a/lib/colvars/colvarbias_abf.h +++ b/lib/colvars/colvarbias_abf.h @@ -32,7 +32,6 @@ private: /// Base filename(s) for reading previous gradient data (replaces data from restart file) std::vector input_prefix; - bool apply_bias; bool update_bias; bool hide_Jacobian; size_t full_samples; diff --git a/lib/colvars/colvarcomp.cpp b/lib/colvars/colvarcomp.cpp index 632e7fabda..534a927fda 100644 --- a/lib/colvars/colvarcomp.cpp +++ b/lib/colvars/colvarcomp.cpp @@ -43,7 +43,8 @@ colvar::cvc::cvc(std::string const &conf) // All cvcs implement this provide(f_cvc_debug_gradient); - get_keyval(conf, "debugGradients", set_feature(f_cvc_debug_gradient), false, parse_silent); + get_keyval_feature((colvarparse *)this, conf, "debugGradients", + f_cvc_debug_gradient, false, parse_silent); // Attempt scalable calculations when in parallel? (By default yes, if available) get_keyval(conf, "scalable", b_try_scalable, true); diff --git a/lib/colvars/colvardeps.cpp b/lib/colvars/colvardeps.cpp index 7d8d05a2be..7dce7e31f6 100644 --- a/lib/colvars/colvardeps.cpp +++ b/lib/colvars/colvardeps.cpp @@ -1,4 +1,3 @@ -#include "colvarmodule.h" #include "colvardeps.h" @@ -30,6 +29,18 @@ void colvardeps::provide(int feature_id) { } +bool colvardeps::get_keyval_feature(colvarparse *cvp, + std::string const &conf, char const *key, + int feature_id, bool const &def_value, + colvarparse::Parse_Mode const parse_mode) +{ + bool value; + bool const found = cvp->get_keyval(conf, key, value, def_value, parse_mode); + if (value) enable(feature_id); + return found; +} + + int colvardeps::enable(int feature_id, bool dry_run /* default: false */, // dry_run: fail silently, do not enable if available @@ -48,7 +59,7 @@ int colvardeps::enable(int feature_id, if (cvm::debug()) { cvm::log("DEPS: " + description + (dry_run ? " testing " : " requiring ") + - "\"" + f->description); + "\"" + f->description +"\""); } if (fs->enabled) { @@ -140,11 +151,7 @@ int colvardeps::enable(int feature_id, // 4) solve deps in children for (i=0; irequires_children.size(); i++) { int g = f->requires_children[i]; - if (cvm::debug()) - cvm::log("requires children " + features()[g]->description); -// cvm::log("children " + cvm::to_str(g)); for (j=0; jdescription); cvm::increase_depth(); res = children[j]->enable(g, dry_run, false); cvm::decrease_depth(); @@ -215,7 +222,7 @@ void colvardeps::init_cvb_requires() { // Initialize feature_states for each instance feature_states.reserve(f_cvb_ntot); for (i = 0; i < f_cvb_ntot; i++) { - feature_states.push_back(new feature_state(this, feature_states.size(), true, false)); + feature_states.push_back(new feature_state(true, false)); // Most features are available, so we set them so // and list exceptions below } @@ -319,7 +326,7 @@ void colvardeps::init_cv_requires() { // Initialize feature_states for each instance feature_states.reserve(f_cv_ntot); for (i = 0; i < f_cv_ntot; i++) { - feature_states.push_back(new feature_state(this, feature_states.size(), true, false)); + feature_states.push_back(new feature_state(true, false)); // Most features are available, so we set them so // and list exceptions below } @@ -364,7 +371,7 @@ void colvardeps::init_cvc_requires() { f_description(f_cvc_debug_gradient, "debug gradient"); f_req_self(f_cvc_debug_gradient, f_cvc_gradient); - f_description(f_cvc_Jacobian, "Jacobian"); + f_description(f_cvc_Jacobian, "Jacobian derivative"); f_req_self(f_cvc_Jacobian, f_cvc_inv_gradient); f_description(f_cvc_com_based, "depends on group centers of mass"); @@ -385,7 +392,7 @@ void colvardeps::init_cvc_requires() { // default as unavailable, not enabled feature_states.reserve(f_cvc_ntot); for (i = 0; i < colvardeps::f_cvc_ntot; i++) { - feature_states.push_back(new feature_state(this, feature_states.size(), false, false)); + feature_states.push_back(new feature_state(false, false)); } // Features that are implemented by all cvcs by default @@ -429,7 +436,7 @@ void colvardeps::init_ag_requires() { // default as unavailable, not enabled feature_states.reserve(f_ag_ntot); for (i = 0; i < colvardeps::f_ag_ntot; i++) { - feature_states.push_back(new feature_state(this, feature_states.size(), false, false)); + feature_states.push_back(new feature_state(false, false)); } // Features that are implemented (or not) by all atom groups diff --git a/lib/colvars/colvardeps.h b/lib/colvars/colvardeps.h index a2f6f2d5f9..089461c532 100644 --- a/lib/colvars/colvardeps.h +++ b/lib/colvars/colvardeps.h @@ -1,10 +1,11 @@ // -*- c++ -*- -#include "colvarmodule.h" - #ifndef COLVARDEPS_H #define COLVARDEPS_H +#include "colvarmodule.h" +#include "colvarparse.h" + /// Parent class for a member object of a bias, cv or cvc etc. containing dependencies /// (features) and handling dependency resolution @@ -27,16 +28,9 @@ public: std::string description; // reference to object name (cv, cvc etc.) /// This contains the current state of each feature for each object - class feature_state { - private: - colvardeps *const deps_object; - int const id; - operator int() { return 0; } // never cast as int - public: - inline colvardeps *object() const { return deps_object; } - inline int feature_id() const { return id; } - feature_state(colvardeps *o, int i, bool a, bool e) - : deps_object(o), id(i), available(a), enabled(e) {} + struct feature_state { + feature_state(bool a, bool e) + : available(a), enabled(e) {} /// Available means: supported, subject to dependencies as listed, /// MAY BE ENABLED AS A RESULT OF DEPENDENCY SOLVING @@ -55,12 +49,6 @@ public: /// List of the state of all features std::vector feature_states; - /// Allow setting a feature state while parsing its kewyord - inline feature_state * set_feature(int id) - { - return feature_states[id]; - } - /// Describes a feature and its dependecies /// used in a static array within each subclass class feature { @@ -146,6 +134,12 @@ public: void provide(int feature_id); // set the feature's flag to available in local object + /// Parse a keyword and enable a feature accordingly + bool get_keyval_feature(colvarparse *cvp, + std::string const &conf, char const *key, + int feature_id, bool const &def_value, + colvarparse::Parse_Mode const parse_mode = colvarparse::parse_normal); + int enable(int f, bool dry_run = false, bool toplevel = true); // enable a feature and recursively solve its dependencies // dry_run is set to true to recursively test if a feature is available, without enabling it // int disable(int f); diff --git a/lib/colvars/colvarmodule.h b/lib/colvars/colvarmodule.h index cb4272f0bd..8c61dcac2d 100644 --- a/lib/colvars/colvarmodule.h +++ b/lib/colvars/colvarmodule.h @@ -4,7 +4,7 @@ #define COLVARMODULE_H #ifndef COLVARS_VERSION -#define COLVARS_VERSION "2016-08-10" +#define COLVARS_VERSION "2016-08-19" #endif #ifndef COLVARS_DEBUG diff --git a/lib/colvars/colvarparse.cpp b/lib/colvars/colvarparse.cpp index 47b1970220..8699391107 100644 --- a/lib/colvars/colvarparse.cpp +++ b/lib/colvars/colvarparse.cpp @@ -354,21 +354,6 @@ bool colvarparse::get_keyval(std::string const &conf, } -bool colvarparse::get_keyval(std::string const &conf, - char const *key, - colvardeps::feature_state *value, - bool const &def_value, - Parse_Mode const parse_mode) -{ - bool feature_flag = def_value; - bool const b_found = get_keyval(conf, key, feature_flag, def_value, parse_mode); - if (feature_flag) { - value->object()->enable(value->feature_id()); - } - return b_found; -} - - // multiple-value keyword parsers bool colvarparse::get_keyval(std::string const &conf, diff --git a/lib/colvars/colvarparse.h b/lib/colvars/colvarparse.h index 7685b4eeb4..892f1632e1 100644 --- a/lib/colvars/colvarparse.h +++ b/lib/colvars/colvarparse.h @@ -8,7 +8,6 @@ #include "colvarmodule.h" #include "colvarvalue.h" -#include "colvardeps.h" /// \file colvarparse.h Parsing functions for collective variables @@ -181,12 +180,6 @@ public: bool &value, bool const &def_value = false, Parse_Mode const parse_mode = parse_normal); - bool get_keyval(std::string const &conf, - char const *key, - colvardeps::feature_state *value, - bool const &def_value = false, - Parse_Mode const parse_mode = parse_normal); - bool get_keyval(std::string const &conf, char const *key, std::vector &values, diff --git a/lib/colvars/colvarscript.cpp b/lib/colvars/colvarscript.cpp index 069a995135..dc3619fe5e 100644 --- a/lib/colvars/colvarscript.cpp +++ b/lib/colvars/colvarscript.cpp @@ -336,6 +336,11 @@ int colvarscript::proc_bias(int argc, char const *argv[]) { return COLVARS_OK; } + if (subcmd == "state") { + b->print_state(); + return COLVARS_OK; + } + // Subcommands for MW ABF if (subcmd == "bin") { int r = b->current_bin(); -- GitLab From c8cfd53c1b867d8936c56e56e1bcaa1a16305b2d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 6 Sep 2016 21:28:55 -0400 Subject: [PATCH 15/52] adjust makefiles in lib tree, so they don't return an error exit code on "make clean" targets. (cherry picked from commit 4117218ca3f5d0e726cae55b5d7a38e26c717845) --- lib/atc/Makefile.icc | 2 +- lib/atc/Makefile.mingw32-cross | 2 +- lib/atc/Makefile.mingw32-cross-mpi | 2 +- lib/atc/Makefile.mingw64-cross | 2 +- lib/atc/Makefile.mingw64-cross-mpi | 2 +- lib/atc/Makefile.mpic++ | 2 +- lib/atc/Makefile.serial | 2 +- lib/awpmd/Makefile.mingw32-cross | 2 +- lib/awpmd/Makefile.mingw64-cross | 2 +- lib/awpmd/Makefile.mpicc | 2 +- lib/colvars/Makefile.mingw32-cross-mpi | 4 ++-- lib/colvars/Makefile.mingw64-cross-mpi | 4 ++-- lib/gpu/Nvidia.makefile | 6 +++--- lib/gpu/Opencl.makefile | 4 ++-- lib/kokkos/Makefile.kokkos | 2 +- lib/linalg/Makefile.mingw32-cross-mpi | 4 ++-- lib/linalg/Makefile.mingw64-cross-mpi | 4 ++-- lib/meam/Makefile.mingw32-cross-mpi | 4 ++-- lib/meam/Makefile.mingw64-cross-mpi | 4 ++-- lib/poems/Makefile.mingw32-cross-mpi | 4 ++-- lib/poems/Makefile.mingw64-cross-mpi | 4 ++-- lib/qmmm/Makefile.gfortran | 2 +- lib/qmmm/Makefile.ifort | 2 +- 23 files changed, 34 insertions(+), 34 deletions(-) diff --git a/lib/atc/Makefile.icc b/lib/atc/Makefile.icc index 502f103ba4..59be520b4b 100644 --- a/lib/atc/Makefile.icc +++ b/lib/atc/Makefile.icc @@ -48,4 +48,4 @@ DEPENDS = $(OBJ:.o=.d) # ------ CLEAN ------ clean: - rm *.o *.d *~ $(LIB) + -rm *.o *.d *~ $(LIB) diff --git a/lib/atc/Makefile.mingw32-cross b/lib/atc/Makefile.mingw32-cross index 49795f1fd2..8b33540981 100644 --- a/lib/atc/Makefile.mingw32-cross +++ b/lib/atc/Makefile.mingw32-cross @@ -61,7 +61,7 @@ DEPENDS = $(OBJ:.o=.d) # ------ CLEAN ------ clean: - rm $(DIR)*.o $(DIR)*.d *~ $(LIB) + -rm $(DIR)*.o $(DIR)*.d *~ $(LIB) $(DEPENDS) : $(DIR) sinclude $(DEPENDS) diff --git a/lib/atc/Makefile.mingw32-cross-mpi b/lib/atc/Makefile.mingw32-cross-mpi index 522a394dc0..c5feeca81a 100644 --- a/lib/atc/Makefile.mingw32-cross-mpi +++ b/lib/atc/Makefile.mingw32-cross-mpi @@ -62,7 +62,7 @@ DEPENDS = $(OBJ:.o=.d) # ------ CLEAN ------ clean: - rm $(DIR)*.o $(DIR)*.d *~ $(LIB) + -rm $(DIR)*.o $(DIR)*.d *~ $(LIB) $(DEPENDS) : $(DIR) sinclude $(DEPENDS) diff --git a/lib/atc/Makefile.mingw64-cross b/lib/atc/Makefile.mingw64-cross index 2dfdf6fe80..fbd3a02610 100644 --- a/lib/atc/Makefile.mingw64-cross +++ b/lib/atc/Makefile.mingw64-cross @@ -61,7 +61,7 @@ DEPENDS = $(OBJ:.o=.d) # ------ CLEAN ------ clean: - rm $(DIR)*.o $(DIR)*.d *~ $(LIB) + -rm $(DIR)*.o $(DIR)*.d *~ $(LIB) $(DEPENDS) : $(DIR) sinclude $(DEPENDS) diff --git a/lib/atc/Makefile.mingw64-cross-mpi b/lib/atc/Makefile.mingw64-cross-mpi index 935d86ba25..f8dd64eae3 100644 --- a/lib/atc/Makefile.mingw64-cross-mpi +++ b/lib/atc/Makefile.mingw64-cross-mpi @@ -62,7 +62,7 @@ DEPENDS = $(OBJ:.o=.d) # ------ CLEAN ------ clean: - rm $(DIR)*.o $(DIR)*.d *~ $(LIB) + -rm $(DIR)*.o $(DIR)*.d *~ $(LIB) $(DEPENDS) : $(DIR) sinclude $(DEPENDS) diff --git a/lib/atc/Makefile.mpic++ b/lib/atc/Makefile.mpic++ index 982deac5d3..c9dfdb79c9 100644 --- a/lib/atc/Makefile.mpic++ +++ b/lib/atc/Makefile.mpic++ @@ -34,6 +34,6 @@ lib: $(OBJ) DEPENDS = $(OBJ:.o=.d) # ------ CLEAN ------ clean: - @rm *.o *.d *~ $(LIB) + -rm *.o *.d *~ $(LIB) sinclude $(DEPENDS) diff --git a/lib/atc/Makefile.serial b/lib/atc/Makefile.serial index 8204430c81..44ce5fd341 100644 --- a/lib/atc/Makefile.serial +++ b/lib/atc/Makefile.serial @@ -46,6 +46,6 @@ DEPENDS = $(OBJ:.o=.d) # ------ CLEAN ------ clean: - @rm *.o *.d *~ $(LIB) + -rm *.o *.d *~ $(LIB) sinclude $(DEPENDS) diff --git a/lib/awpmd/Makefile.mingw32-cross b/lib/awpmd/Makefile.mingw32-cross index af66187b89..6a93987173 100644 --- a/lib/awpmd/Makefile.mingw32-cross +++ b/lib/awpmd/Makefile.mingw32-cross @@ -77,4 +77,4 @@ DEPENDS = $(OBJ:.o=.d) # ------ CLEAN ------ clean: - rm *.d *~ $(OBJ) $(LIB) + -rm *.d *~ $(OBJ) $(LIB) diff --git a/lib/awpmd/Makefile.mingw64-cross b/lib/awpmd/Makefile.mingw64-cross index f1df999bab..1f3e608129 100644 --- a/lib/awpmd/Makefile.mingw64-cross +++ b/lib/awpmd/Makefile.mingw64-cross @@ -76,4 +76,4 @@ DEPENDS = $(OBJ:.o=.d) # ------ CLEAN ------ clean: - rm *.d *~ $(OBJ) $(LIB) + -rm *.d *~ $(OBJ) $(LIB) diff --git a/lib/awpmd/Makefile.mpicc b/lib/awpmd/Makefile.mpicc index c1a6f3c01d..4c289ad88a 100644 --- a/lib/awpmd/Makefile.mpicc +++ b/lib/awpmd/Makefile.mpicc @@ -66,4 +66,4 @@ DEPENDS = $(OBJ:.o=.d) # ------ CLEAN ------ clean: - rm *.d *~ $(OBJ) $(LIB) + -rm *.d *~ $(OBJ) $(LIB) diff --git a/lib/colvars/Makefile.mingw32-cross-mpi b/lib/colvars/Makefile.mingw32-cross-mpi index cc2a76111a..1e35c5b461 100644 --- a/lib/colvars/Makefile.mingw32-cross-mpi +++ b/lib/colvars/Makefile.mingw32-cross-mpi @@ -4,10 +4,10 @@ SHELL=/bin/sh all: $(MAKE) $(MFLAGS) mingw32-cross - rm -f Obj_mingw32-mpi + -rm -f Obj_mingw32-mpi ln -s Obj_mingw32 Obj_mingw32-mpi clean: $(MAKE) $(MFLAGS) clean-mingw32-cross - rm -f Obj_mingw32-mpi + -rm -f Obj_mingw32-mpi diff --git a/lib/colvars/Makefile.mingw64-cross-mpi b/lib/colvars/Makefile.mingw64-cross-mpi index 1ec1a0995b..ca6f4a6d43 100644 --- a/lib/colvars/Makefile.mingw64-cross-mpi +++ b/lib/colvars/Makefile.mingw64-cross-mpi @@ -4,10 +4,10 @@ SHELL=/bin/sh all: $(MAKE) $(MFLAGS) mingw64-cross - rm -f Obj_mingw64-mpi + -rm -f Obj_mingw64-mpi ln -s Obj_mingw64 Obj_mingw64-mpi clean: $(MAKE) $(MFLAGS) clean-mingw64-cross - rm -f Obj_mingw64-mpi + -rm -f Obj_mingw64-mpi diff --git a/lib/gpu/Nvidia.makefile b/lib/gpu/Nvidia.makefile index 18efbda55a..e02849cfed 100644 --- a/lib/gpu/Nvidia.makefile +++ b/lib/gpu/Nvidia.makefile @@ -789,10 +789,10 @@ $(GPU_LIB): $(OBJS) $(CUDPP) @cp $(EXTRAMAKE) Makefile.lammps clean: - rm -f $(EXECS) $(GPU_LIB) $(OBJS) $(CUDPP) $(CBNS) *.linkinfo + -rm -f $(EXECS) $(GPU_LIB) $(OBJS) $(CUDPP) $(CBNS) *.linkinfo veryclean: clean - rm -rf *~ *.linkinfo + -rm -rf *~ *.linkinfo cleanlib: - rm -f $(EXECS) $(GPU_LIB) $(OBJS) $(CBNS) *.linkinfo + -rm -f $(EXECS) $(GPU_LIB) $(OBJS) $(CBNS) *.linkinfo diff --git a/lib/gpu/Opencl.makefile b/lib/gpu/Opencl.makefile index b33a392242..7ef1dfba0c 100644 --- a/lib/gpu/Opencl.makefile +++ b/lib/gpu/Opencl.makefile @@ -577,8 +577,8 @@ $(OCL_LIB): $(OBJS) $(PTXS) opencl: $(OCL_EXECS) clean: - rm -rf $(EXECS) $(OCL_EXECS) $(OCL_LIB) $(OBJS) $(KERS) *.linkinfo + -rm -rf $(EXECS) $(OCL_EXECS) $(OCL_LIB) $(OBJS) $(KERS) *.linkinfo veryclean: clean - rm -rf *~ *.linkinfo + -rm -rf *~ *.linkinfo diff --git a/lib/kokkos/Makefile.kokkos b/lib/kokkos/Makefile.kokkos index c01ceaf64d..300a455367 100644 --- a/lib/kokkos/Makefile.kokkos +++ b/lib/kokkos/Makefile.kokkos @@ -462,7 +462,7 @@ KOKKOS_OBJ_LINK = $(notdir $(KOKKOS_OBJ)) include $(KOKKOS_PATH)/Makefile.targets kokkos-clean: - rm -f $(KOKKOS_OBJ_LINK) KokkosCore_config.h KokkosCore_config.tmp libkokkos.a + -rm -f $(KOKKOS_OBJ_LINK) KokkosCore_config.h KokkosCore_config.tmp libkokkos.a libkokkos.a: $(KOKKOS_OBJ_LINK) $(KOKKOS_SRC) $(KOKKOS_HEADERS) ar cr libkokkos.a $(KOKKOS_OBJ_LINK) diff --git a/lib/linalg/Makefile.mingw32-cross-mpi b/lib/linalg/Makefile.mingw32-cross-mpi index cc2a76111a..1e35c5b461 100644 --- a/lib/linalg/Makefile.mingw32-cross-mpi +++ b/lib/linalg/Makefile.mingw32-cross-mpi @@ -4,10 +4,10 @@ SHELL=/bin/sh all: $(MAKE) $(MFLAGS) mingw32-cross - rm -f Obj_mingw32-mpi + -rm -f Obj_mingw32-mpi ln -s Obj_mingw32 Obj_mingw32-mpi clean: $(MAKE) $(MFLAGS) clean-mingw32-cross - rm -f Obj_mingw32-mpi + -rm -f Obj_mingw32-mpi diff --git a/lib/linalg/Makefile.mingw64-cross-mpi b/lib/linalg/Makefile.mingw64-cross-mpi index 1ec1a0995b..ca6f4a6d43 100644 --- a/lib/linalg/Makefile.mingw64-cross-mpi +++ b/lib/linalg/Makefile.mingw64-cross-mpi @@ -4,10 +4,10 @@ SHELL=/bin/sh all: $(MAKE) $(MFLAGS) mingw64-cross - rm -f Obj_mingw64-mpi + -rm -f Obj_mingw64-mpi ln -s Obj_mingw64 Obj_mingw64-mpi clean: $(MAKE) $(MFLAGS) clean-mingw64-cross - rm -f Obj_mingw64-mpi + -rm -f Obj_mingw64-mpi diff --git a/lib/meam/Makefile.mingw32-cross-mpi b/lib/meam/Makefile.mingw32-cross-mpi index cc2a76111a..1e35c5b461 100644 --- a/lib/meam/Makefile.mingw32-cross-mpi +++ b/lib/meam/Makefile.mingw32-cross-mpi @@ -4,10 +4,10 @@ SHELL=/bin/sh all: $(MAKE) $(MFLAGS) mingw32-cross - rm -f Obj_mingw32-mpi + -rm -f Obj_mingw32-mpi ln -s Obj_mingw32 Obj_mingw32-mpi clean: $(MAKE) $(MFLAGS) clean-mingw32-cross - rm -f Obj_mingw32-mpi + -rm -f Obj_mingw32-mpi diff --git a/lib/meam/Makefile.mingw64-cross-mpi b/lib/meam/Makefile.mingw64-cross-mpi index 1ec1a0995b..ca6f4a6d43 100644 --- a/lib/meam/Makefile.mingw64-cross-mpi +++ b/lib/meam/Makefile.mingw64-cross-mpi @@ -4,10 +4,10 @@ SHELL=/bin/sh all: $(MAKE) $(MFLAGS) mingw64-cross - rm -f Obj_mingw64-mpi + -rm -f Obj_mingw64-mpi ln -s Obj_mingw64 Obj_mingw64-mpi clean: $(MAKE) $(MFLAGS) clean-mingw64-cross - rm -f Obj_mingw64-mpi + -rm -f Obj_mingw64-mpi diff --git a/lib/poems/Makefile.mingw32-cross-mpi b/lib/poems/Makefile.mingw32-cross-mpi index cc2a76111a..1e35c5b461 100644 --- a/lib/poems/Makefile.mingw32-cross-mpi +++ b/lib/poems/Makefile.mingw32-cross-mpi @@ -4,10 +4,10 @@ SHELL=/bin/sh all: $(MAKE) $(MFLAGS) mingw32-cross - rm -f Obj_mingw32-mpi + -rm -f Obj_mingw32-mpi ln -s Obj_mingw32 Obj_mingw32-mpi clean: $(MAKE) $(MFLAGS) clean-mingw32-cross - rm -f Obj_mingw32-mpi + -rm -f Obj_mingw32-mpi diff --git a/lib/poems/Makefile.mingw64-cross-mpi b/lib/poems/Makefile.mingw64-cross-mpi index 1ec1a0995b..ca6f4a6d43 100644 --- a/lib/poems/Makefile.mingw64-cross-mpi +++ b/lib/poems/Makefile.mingw64-cross-mpi @@ -4,10 +4,10 @@ SHELL=/bin/sh all: $(MAKE) $(MFLAGS) mingw64-cross - rm -f Obj_mingw64-mpi + -rm -f Obj_mingw64-mpi ln -s Obj_mingw64 Obj_mingw64-mpi clean: $(MAKE) $(MFLAGS) clean-mingw64-cross - rm -f Obj_mingw64-mpi + -rm -f Obj_mingw64-mpi diff --git a/lib/qmmm/Makefile.gfortran b/lib/qmmm/Makefile.gfortran index 73fb35cbfd..717922b4b6 100644 --- a/lib/qmmm/Makefile.gfortran +++ b/lib/qmmm/Makefile.gfortran @@ -58,7 +58,7 @@ tldeps: $(MAKE) -C ../../src $(MFLAGS) mode=lib $(LAMMPSCFG) clean : - - /bin/rm -f *.x *.o *.a *~ *.F90 *.d *.mod *.i *.L + -rm -f *.x *.o *.a *~ *.F90 *.d *.mod *.i *.L # explicit dependencies diff --git a/lib/qmmm/Makefile.ifort b/lib/qmmm/Makefile.ifort index fef9653a80..d03e67b8a0 100644 --- a/lib/qmmm/Makefile.ifort +++ b/lib/qmmm/Makefile.ifort @@ -58,7 +58,7 @@ tldeps: $(MAKE) -C ../../src $(MFLAGS) mode=lib $(LAMMPSCFG) clean : - - /bin/rm -f *.x *.o *.a *~ *.F90 *.d *.mod *.i *.L + -rm -f *.x *.o *.a *~ *.F90 *.d *.mod *.i *.L # explicit dependencies -- GitLab From 3a74ccffa2ed6bf85625d3ea0b9cf775d4499702 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 5 Sep 2016 20:37:19 -0400 Subject: [PATCH 16/52] update colvars library to version 2016-09-03 (cherry picked from commit 4181f5ac9d7291544e6848f8e8423025857936bc) --- lib/colvars/colvarmodule.cpp | 8 ++++++-- lib/colvars/colvarmodule.h | 2 +- lib/colvars/colvarparse.cpp | 2 +- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/lib/colvars/colvarmodule.cpp b/lib/colvars/colvarmodule.cpp index 6d174be7a2..d7071df0b8 100644 --- a/lib/colvars/colvarmodule.cpp +++ b/lib/colvars/colvarmodule.cpp @@ -83,7 +83,9 @@ int colvarmodule::read_config_file(char const *config_filename) std::string conf = ""; std::string line; while (colvarparse::getline_nocomments(config_s, line)) { - conf.append(line+"\n"); + // Delete lines that contain only white space after removing comments + if (line.find_first_not_of(colvarparse::white_space) != std::string::npos) + conf.append(line+"\n"); } config_s.close(); @@ -101,7 +103,9 @@ int colvarmodule::read_config_string(std::string const &config_str) std::string conf = ""; std::string line; while (colvarparse::getline_nocomments(config_s, line)) { - conf.append(line+"\n"); + // Delete lines that contain only white space after removing comments + if (line.find_first_not_of(colvarparse::white_space) != std::string::npos) + conf.append(line+"\n"); } return parse_config(conf); } diff --git a/lib/colvars/colvarmodule.h b/lib/colvars/colvarmodule.h index 8c61dcac2d..deb20c9670 100644 --- a/lib/colvars/colvarmodule.h +++ b/lib/colvars/colvarmodule.h @@ -4,7 +4,7 @@ #define COLVARMODULE_H #ifndef COLVARS_VERSION -#define COLVARS_VERSION "2016-08-19" +#define COLVARS_VERSION "2016-09-03" #endif #ifndef COLVARS_DEBUG diff --git a/lib/colvars/colvarparse.cpp b/lib/colvars/colvarparse.cpp index 8699391107..e222fa9ecf 100644 --- a/lib/colvars/colvarparse.cpp +++ b/lib/colvars/colvarparse.cpp @@ -524,7 +524,7 @@ int colvarparse::check_keywords(std::string &conf, char const *key) } } - init(); + clear_keyword_registry(); return COLVARS_OK; } -- GitLab From a31c5073706c868ecb67ed9df686f81319468d95 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 6 Sep 2016 22:15:49 -0400 Subject: [PATCH 17/52] correct error message text, sync with source --- doc/html/Section_errors.html | 3 +-- doc/src/Section_errors.txt | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/doc/html/Section_errors.html b/doc/html/Section_errors.html index 658dfb8c2d..a8fd33e6b7 100644 --- a/doc/html/Section_errors.html +++ b/doc/html/Section_errors.html @@ -486,8 +486,7 @@ be computed.

    Bad TIP4P bond type for PPPMDisp/TIP4P
    Specified bond type is not valid.
    Bad fix ID in fix append/atoms command
    -
    The value of the fix_id for keyword spatial must start with the suffix -f_.
    +
    The value of the fix_id for keyword spatial must start with ‘f_‘.
    Bad grid of processors
    The 3d grid of processors defined by the processors command does not match the number of processors LAMMPS is being run on.
    diff --git a/doc/src/Section_errors.txt b/doc/src/Section_errors.txt index 52405f684b..7f5f7857a5 100644 --- a/doc/src/Section_errors.txt +++ b/doc/src/Section_errors.txt @@ -535,8 +535,7 @@ Specified bond type is not valid. :dd {Bad fix ID in fix append/atoms command} :dt -The value of the fix_id for keyword spatial must start with the suffix -f_. :dd +The value of the fix_id for keyword spatial must start with 'f_'. :dd {Bad grid of processors} :dt -- GitLab From 0d491d483c232312a4dfc6449e06cc441751fdfc Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 7 Sep 2016 02:10:49 -0400 Subject: [PATCH 18/52] avoid Inline substitution_reference start-string without end-string --- doc/src/Section_howto.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/src/Section_howto.txt b/doc/src/Section_howto.txt index f3283c8360..62550dc0dc 100644 --- a/doc/src/Section_howto.txt +++ b/doc/src/Section_howto.txt @@ -830,7 +830,7 @@ rotation of [A], [B], and [C] and can be computed as follows: :c,image(Eqs/transform.jpg) -where A = |[A]| indicates the scalar length of [A]. The hat symbol +where A = | [A] | indicates the scalar length of [A]. The hat symbol (^) indicates the corresponding unit vector. {beta} and {gamma} are angles between the vectors described below. Note that by construction, [a], [b], and [c] have strictly positive x, y, and z components, respectively. -- GitLab From 55022d126306b49c22e0ea0ec2d06e9762ce43c5 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 7 Sep 2016 02:11:59 -0400 Subject: [PATCH 19/52] replace :l,ule and :l,ole with :l :ule or :l :ole --- doc/src/Section_howto.txt | 9 +++++--- doc/src/Section_intro.txt | 3 ++- doc/src/Section_modify.txt | 3 ++- doc/src/Section_python.txt | 3 ++- doc/src/Section_start.txt | 6 ++++-- doc/src/accelerate_gpu.txt | 6 ++++-- doc/src/accelerate_intel.txt | 18 ++++++++++------ doc/src/accelerate_kokkos.txt | 3 ++- doc/src/accelerate_omp.txt | 6 ++++-- doc/src/compute.txt | 3 ++- doc/src/fix.txt | 3 ++- doc/src/fix_adapt_fep.txt | 3 ++- doc/src/fix_addtorque.txt | 3 ++- doc/src/fix_atc.txt | 3 ++- doc/src/fix_ave_correlate.txt | 6 ++++-- doc/src/fix_langevin_drude.txt | 3 ++- doc/src/fix_rigid.txt | 3 ++- doc/src/fix_temp_berendsen.txt | 3 ++- doc/src/fix_temp_csvr.txt | 3 ++- doc/src/fix_temp_rescale.txt | 3 ++- doc/src/neigh_modify.txt | 3 ++- doc/src/pair_bop.txt | 39 ++++++++++++++++++++++------------ doc/src/pair_buck_long.txt | 3 ++- doc/src/pair_gran.txt | 3 ++- doc/src/pair_modify.txt | 3 ++- doc/src/pair_table.txt | 3 ++- doc/src/pair_table_rx.txt | 3 ++- doc/src/read_data.txt | 3 ++- doc/src/region.txt | 3 ++- doc/src/rerun.txt | 3 ++- doc/src/tutorial_drude.txt | 4 ++-- doc/src/write_dump.txt | 3 ++- 32 files changed, 110 insertions(+), 56 deletions(-) diff --git a/doc/src/Section_howto.txt b/doc/src/Section_howto.txt index 62550dc0dc..576c80f11f 100644 --- a/doc/src/Section_howto.txt +++ b/doc/src/Section_howto.txt @@ -2276,7 +2276,8 @@ molecule diffusion rates. :l As input to special functions of "equal-style variables"_variable.html, like sum() and max(). E.g. to find the -largest cluster or fastest diffusing molecule. :l,ule +largest cluster or fastest diffusing molecule. :l +:ule Example calculations with chunks :h5 @@ -2432,7 +2433,8 @@ package, :ulb,l the adiabatic core-shell method, implemented in the "CORESHELL"_#howto_26 package, :l the thermalized Drude dipole method, implemented in the -"USER-DRUDE"_#howto_27 package. :l,ule +"USER-DRUDE"_#howto_27 package. :l +:ule The fluctuating charge method calculates instantaneous charges on interacting atoms based on the electronegativity equalization @@ -2739,7 +2741,8 @@ too much. To avoid this, damping at short range can be done by Thole functions (for which there are physical grounds). This Thole damping is applied to the point charges composing the induced dipole (the charge of the Drude particle and the opposite charge on the core, not -to the total charge of the core atom). :l,ule +to the total charge of the core atom). :l +:ule A detailed tutorial covering the usage of Drude induced dipoles in LAMMPS is "available here"_tutorial_drude.html. diff --git a/doc/src/Section_intro.txt b/doc/src/Section_intro.txt index 089921d45d..1a015a4edf 100644 --- a/doc/src/Section_intro.txt +++ b/doc/src/Section_intro.txt @@ -241,7 +241,8 @@ Our group has also written and released a separate toolkit called "Pizza.py"_pizza which provides tools for doing setup, analysis, plotting, and visualization for LAMMPS simulations. Pizza.py is written in "Python"_python and is available for download from "the -Pizza.py WWW site"_pizza. :l,ule +Pizza.py WWW site"_pizza. :l +:ule :link(pizza,http://www.sandia.gov/~sjplimp/pizza.html) :link(python,http://www.python.org) diff --git a/doc/src/Section_modify.txt b/doc/src/Section_modify.txt index e3447e5df8..a3ac505946 100644 --- a/doc/src/Section_modify.txt +++ b/doc/src/Section_modify.txt @@ -130,7 +130,8 @@ If you add something you think is truly useful and doesn't impact LAMMPS performance when it isn't used, send an email to the "developers"_http://lammps.sandia.gov/authors.html. We might be interested in adding it to the LAMMPS distribution. See further -details on this at the bottom of this page. :l,ule +details on this at the bottom of this page. :l +:ule :line :line diff --git a/doc/src/Section_python.txt b/doc/src/Section_python.txt index 231a9054fb..ce38053023 100644 --- a/doc/src/Section_python.txt +++ b/doc/src/Section_python.txt @@ -761,7 +761,8 @@ Add a wrapper method to python/lammps.py for this interface function. :l You should now be able to invoke the new interface function from a -Python script. Isn't ctypes amazing? :l,ule +Python script. Isn't ctypes amazing? :l +:ule :line :line diff --git a/doc/src/Section_start.txt b/doc/src/Section_start.txt index 0231fb3357..2705e6fd83 100644 --- a/doc/src/Section_start.txt +++ b/doc/src/Section_start.txt @@ -1208,7 +1208,8 @@ Move to the directory where you have saved lmp_win_no-mpi.exe (e.g. by typing: cd "Documents"). :l At the command prompt, type "lmp_win_no-mpi -in in.lj", replacing in.lj -with the name of your LAMMPS input script. :l,ule +with the name of your LAMMPS input script. :l +:ule For the MPI version, which allows you to run LAMMPS under Windows on multiple processors, follow these steps: @@ -1237,7 +1238,8 @@ In this mode, output may not immediately show up on the screen, so if your input script takes a long time to execute, you may need to be patient before the output shows up. :l Alternatively, you can still use this executable to run on a single processor by typing something -like: "lmp_win_mpi -in in.lj". :l,ule +like: "lmp_win_mpi -in in.lj". :l +:ule :line diff --git a/doc/src/accelerate_gpu.txt b/doc/src/accelerate_gpu.txt index 8e76b85aa2..6b4cddf8be 100644 --- a/doc/src/accelerate_gpu.txt +++ b/doc/src/accelerate_gpu.txt @@ -42,7 +42,8 @@ LAMMPS-specific code is in the GPU package. It makes calls to a generic GPU library in the lib/gpu directory. This library provides NVIDIA support as well as more general OpenCL support, so that the same functionality can eventually be supported on a variety of GPU -hardware. :l,ule +hardware. :l +:ule Here is a quick overview of how to enable and use the GPU package: @@ -245,7 +246,8 @@ regardless of asynchronous CPU calculations. :l The output section "GPU Time Info (average)" reports "Max Mem / Proc". This is the maximum memory used at one time on the GPU for data -storage by a single MPI process. :l,ule +storage by a single MPI process. :l +:ule [Restrictions:] diff --git a/doc/src/accelerate_intel.txt b/doc/src/accelerate_intel.txt index c97b19b67d..e1b715e587 100644 --- a/doc/src/accelerate_intel.txt +++ b/doc/src/accelerate_intel.txt @@ -31,7 +31,8 @@ Fixes: nve, npt, nvt, nvt/sllod :l Improper Styles: cvff, harmonic :l Pair Styles: buck/coul/cut, buck/coul/long, buck, gayberne, charmm/coul/long, lj/cut, lj/cut/coul/long, sw, tersoff :l -K-Space Styles: pppm :l,ule +K-Space Styles: pppm :l +:ule [Speed-ups to expect:] @@ -70,7 +71,8 @@ For Intel Xeon CPUs: Edit src/MAKE/OPTIONS/Makefile.intel_cpu_intelmpi as necessary. :ulb,l If using {kspace_style pppm} in the input script, add "neigh_modify binsize 3" and "kspace_modify diff ad" to the input script for better performance. :l -"-pk intel 0 omp 2 -sf intel" added to LAMMPS command-line :l,ule +"-pk intel 0 omp 2 -sf intel" added to LAMMPS command-line :l +:ule For Intel Xeon Phi CPUs for simulations without {kspace_style pppm} in the input script : @@ -79,7 +81,8 @@ Edit src/MAKE/OPTIONS/Makefile.knl as necessary. :ulb,l Runs should be performed using MCDRAM. :l "-pk intel 0 omp 2 -sf intel" {or} "-pk intel 0 omp 4 -sf intel" should be added to the LAMMPS command-line. Choice for best -performance will depend on the simulation. :l,ule +performance will depend on the simulation. :l +:ule For Intel Xeon Phi CPUs for simulations with {kspace_style pppm} in the input script: @@ -93,13 +96,15 @@ performance. :l export KMP_AFFINITY=none :l "-pk intel 0 omp 3 lrt yes -sf intel" or "-pk intel 0 omp 1 lrt yes -sf intel" added to LAMMPS command-line. Choice for best performance -will depend on the simulation. :l,ule +will depend on the simulation. :l +:ule For Intel Xeon Phi coprocessors (Offload): Edit src/MAKE/OPTIONS/Makefile.intel_coprocessor as necessary :ulb,l "-pk intel N omp 1" added to command-line where N is the number of -coprocessors per node. :l,ule +coprocessors per node. :l +:ule :line @@ -463,7 +468,8 @@ Brown, W.M., Carrillo, J.-M.Y., Mishra, B., Gavhane, N., Thakker, F.M., De Krake Brown, W. M., Semin, A., Hebenstreit, M., Khvostov, S., Raman, K., Plimpton, S.J. Increasing Molecular Dynamics Simulation Rates with an 8-Fold Increase in Electrical Power Efficiency. 2016 International Conference for High Performance Computing. In press. :l -Brown, W.M., Carrillo, J.-M.Y., Gavhane, N., Thakkar, F.M., Plimpton, S.J. Optimizing Legacy Molecular Dynamics Software with Directive-Based Offload. Computer Physics Communications. 2015. 195: p. 95-101. :l,ule +Brown, W.M., Carrillo, J.-M.Y., Gavhane, N., Thakkar, F.M., Plimpton, S.J. Optimizing Legacy Molecular Dynamics Software with Directive-Based Offload. Computer Physics Communications. 2015. 195: p. 95-101. :l +:ule diff --git a/doc/src/accelerate_kokkos.txt b/doc/src/accelerate_kokkos.txt index a3d1c9efbd..c33e591712 100644 --- a/doc/src/accelerate_kokkos.txt +++ b/doc/src/accelerate_kokkos.txt @@ -381,7 +381,8 @@ When running large number of atoms per GPU, KOKKOS is typically faster than the GPU package. :l When running on Intel Xeon Phi, KOKKOS is not as fast as -the USER-INTEL package, which is optimized for that hardware. :l,ule +the USER-INTEL package, which is optimized for that hardware. :l +:ule See the "Benchmark page"_http://lammps.sandia.gov/bench.html of the LAMMPS web site for performance of the KOKKOS package on different diff --git a/doc/src/accelerate_omp.txt b/doc/src/accelerate_omp.txt index 0f969d6de1..f31bbc42a3 100644 --- a/doc/src/accelerate_omp.txt +++ b/doc/src/accelerate_omp.txt @@ -163,7 +163,8 @@ sometimes be achived by increasing the length of the Coulombic cutoff and thus reducing the work done by the long-range solver. Using the "run_style verlet/split"_run_style.html command, which is compatible with the USER-OMP package, is an alternative way to reduce the number -of MPI tasks assigned to the KSpace calculation. :l,ule +of MPI tasks assigned to the KSpace calculation. :l +:ule Additional performance tips are as follows: @@ -178,7 +179,8 @@ NOTE: By default, several current MPI implementations use a processor affinity setting that restricts each MPI task to a single CPU core. Using multi-threading in this mode will force all threads to share the one core and thus is likely to be counterproductive. Instead, binding -MPI tasks to a (multi-core) socket, should solve this issue. :l,ule +MPI tasks to a (multi-core) socket, should solve this issue. :l +:ule [Restrictions:] diff --git a/doc/src/compute.txt b/doc/src/compute.txt index e680abaa33..8ecfd81af1 100644 --- a/doc/src/compute.txt +++ b/doc/src/compute.txt @@ -108,7 +108,8 @@ variable"_variable.html. :l Local values can be reduced by the "compute reduce"_compute_reduce.html command, or histogrammed by the "fix ave/histo"_fix_ave_histo.html command, or output by the "dump -local"_dump.html command. :l,ule +local"_dump.html command. :l +:ule The results of computes that calculate global quantities can be either "intensive" or "extensive" values. Intensive means the value is diff --git a/doc/src/fix.txt b/doc/src/fix.txt index 3fbeb013eb..d84ec2aad9 100644 --- a/doc/src/fix.txt +++ b/doc/src/fix.txt @@ -130,7 +130,8 @@ variable"_variable.html. :l Local values can be reduced by the "compute reduce"_compute_reduce.html command, or histogrammed by the "fix -ave/histo"_fix_ave_histo.html command. :l,ule +ave/histo"_fix_ave_histo.html command. :l +:ule See this "howto section"_Section_howto.html#howto_15 for a summary of various LAMMPS output options, many of which involve fixes. diff --git a/doc/src/fix_adapt_fep.txt b/doc/src/fix_adapt_fep.txt index 3037bc9317..5dd58bc39a 100644 --- a/doc/src/fix_adapt_fep.txt +++ b/doc/src/fix_adapt_fep.txt @@ -61,7 +61,8 @@ It is possible to modify the charges of chosen atom types only, instead of scaling all the charges in the system. :ulb,l There is a new option {after} for better compatibility with "fix -ave/time". :l,ule +ave/time". :l +:ule This version is suited for free energy calculations using "compute ti"_compute_ti.html or "compute fep"_compute_fep.html. diff --git a/doc/src/fix_addtorque.txt b/doc/src/fix_addtorque.txt index 25c7855c7d..793ec0e015 100644 --- a/doc/src/fix_addtorque.txt +++ b/doc/src/fix_addtorque.txt @@ -32,7 +32,8 @@ the components of the total torque applied on the group (around its center of mass) are Tx,Ty,Tz :ulb,l the group would move as a rigid body in the absence of other -forces. :l,ule +forces. :l +:ule This command can be used to drive a group of atoms into rotation. diff --git a/doc/src/fix_atc.txt b/doc/src/fix_atc.txt index eddfa52921..0df4e29c0b 100644 --- a/doc/src/fix_atc.txt +++ b/doc/src/fix_atc.txt @@ -19,7 +19,8 @@ type = {thermal} or {two_temperature} or {hardy} or {field} :l {two_temperature} = electron-phonon coupling with field: temperature and electron_temperature {hardy} = on-the-fly post-processing using kernel localization functions (see "related" section for possible fields) {field} = on-the-fly post-processing using mesh-based localization functions (see "related" section for possible fields) :pre -parameter_file = name of the file with material parameters. Note: Neither hardy nor field requires a parameter file :l,ule +parameter_file = name of the file with material parameters. Note: Neither hardy nor field requires a parameter file :l +:ule [Examples:] diff --git a/doc/src/fix_ave_correlate.txt b/doc/src/fix_ave_correlate.txt index c4df7671aa..6f97d78219 100644 --- a/doc/src/fix_ave_correlate.txt +++ b/doc/src/fix_ave_correlate.txt @@ -232,7 +232,8 @@ so Npair = N*(N+1)/2. :l If {type} is set to {full} then each input value is correlated with itself and every other value. I.e. Cij = Vi*Vj, for i,j = 1,N so -Npair = N^2. :l,ule +Npair = N^2. :l +:ule The {ave} keyword determines what happens to the accumulation of correlation samples every {Nfreq} timesteps. If the {ave} setting is @@ -342,7 +343,8 @@ CNN. :l For {type} = {full}, the Npair = N^2 columns are ordered: C11, C12, ..., C1N, C21, C22, ..., C2N, C31, ..., C3N, ..., CN1, ..., CNN-1, -CNN. :l,ule +CNN. :l +:ule The array values calculated by this fix are treated as intensive. If you need to divide them by the number of atoms, you must do this in a diff --git a/doc/src/fix_langevin_drude.txt b/doc/src/fix_langevin_drude.txt index 47864e3e2c..4fee37fd31 100644 --- a/doc/src/fix_langevin_drude.txt +++ b/doc/src/fix_langevin_drude.txt @@ -229,7 +229,8 @@ computes the global pressure even if its group is {ATOMS}. This is what we want. If we thermostated {ATOMS} using {npt}, the pressure should be the global one, but the temperature should be only that of the cores. That's why the command {fix_modify} should be called in -that case. :l,ule +that case. :l +:ule :line diff --git a/doc/src/fix_rigid.txt b/doc/src/fix_rigid.txt index f42c18d387..fb6f0e29cb 100644 --- a/doc/src/fix_rigid.txt +++ b/doc/src/fix_rigid.txt @@ -621,7 +621,8 @@ rigid styles for the rigid bodies. :l Use "fix press/berendsen"_fix_press_berendsen.html to compute the pressure and change the box dimensions. Use one of the 4 NVE or 2 NVT rigid styles for the rigid bodies. Use "fix nvt"_fix_nh.thml (or any -other thermostat) for the non-rigid particles. :l,ule +other thermostat) for the non-rigid particles. :l +:ule In all case, the rigid bodies and non-rigid particles both contribute to the global pressure and the box is scaled the same by any of the diff --git a/doc/src/fix_temp_berendsen.txt b/doc/src/fix_temp_berendsen.txt index 202be8921f..dd516d7f08 100644 --- a/doc/src/fix_temp_berendsen.txt +++ b/doc/src/fix_temp_berendsen.txt @@ -16,7 +16,8 @@ ID, group-ID are documented in "fix"_fix.html command :ulb,l temp/berendsen = style name of this fix command :l Tstart,Tstop = desired temperature at start/end of run :l Tstart can be a variable (see below) :pre -Tdamp = temperature damping parameter (time units) :l,ule +Tdamp = temperature damping parameter (time units) :l +:ule [Examples:] diff --git a/doc/src/fix_temp_csvr.txt b/doc/src/fix_temp_csvr.txt index 137654d1ec..7e53926516 100644 --- a/doc/src/fix_temp_csvr.txt +++ b/doc/src/fix_temp_csvr.txt @@ -19,7 +19,8 @@ temp/csvr or temp/csld = style name of this fix command :l Tstart,Tstop = desired temperature at start/end of run :l Tstart can be a variable (see below) :pre Tdamp = temperature damping parameter (time units) :l -seed = random number seed to use for white noise (positive integer) :l,ule +seed = random number seed to use for white noise (positive integer) :l +:ule [Examples:] diff --git a/doc/src/fix_temp_rescale.txt b/doc/src/fix_temp_rescale.txt index 4f8f216ce4..b5c1ec1b6c 100644 --- a/doc/src/fix_temp_rescale.txt +++ b/doc/src/fix_temp_rescale.txt @@ -18,7 +18,8 @@ N = perform rescaling every N steps :l Tstart,Tstop = desired temperature at start/end of run (temperature units) :l Tstart can be a variable (see below) :pre window = only rescale if temperature is outside this window (temperature units) :l -fraction = rescale to target temperature by this fraction :l,ule +fraction = rescale to target temperature by this fraction :l +:ule [Examples:] diff --git a/doc/src/neigh_modify.txt b/doc/src/neigh_modify.txt index b05fcf4d3e..c16b667f7d 100644 --- a/doc/src/neigh_modify.txt +++ b/doc/src/neigh_modify.txt @@ -123,7 +123,8 @@ to freeze a wall or portion of a bio-molecule. :l When one or more rigid bodies are specified, interactions within each body can be turned off to save needless computation. See the "fix -rigid"_fix_rigid.html command for more details. :l,ule +rigid"_fix_rigid.html command for more details. :l +:ule The {exclude type} option turns off the pairwise interaction if one atom is of type M and the other of type N. M can equal N. The diff --git a/doc/src/pair_bop.txt b/doc/src/pair_bop.txt index f08bc5413b..b569750c9c 100644 --- a/doc/src/pair_bop.txt +++ b/doc/src/pair_bop.txt @@ -162,7 +162,8 @@ Line 1: nr, nBOt (nr is the number of divisions the radius is broken into for function tables and MUST be a factor of 5; nBOt is the number of divisions for the tabulated values of THETA_(S,ij) :ulb,l Line 2: delta_1-delta_7 (if all are not used in the particular :l -formulation, set unused values to 0.0) :l,ule +formulation, set unused values to 0.0) :l +:ule Following this N lines for e_1-e_N containing p_pi. @@ -176,7 +177,8 @@ Line 1: r_cut (for e_1-e_1 interactions) :ulb,l Line 2: c_sigma, a_sigma, c_pi, a_pi :l Line 3: delta_sigma, delta_pi :l Line 4: f_sigma, k_sigma, delta_3 (This delta_3 is similar to that of -the previous section but is interaction type dependent) :l,ule +the previous section but is interaction type dependent) :l +:ule The next section contains a line for each three body interaction type e_j-e_i-e_k with i=0->N, j=0->N, k=j->N @@ -185,7 +187,8 @@ Line 1: g_(sigma0), g_(sigma1), g_(sigma2) (These are coefficients for g_(sigma,jik)(THETA_ijk) for e_1-e_1-e_1 interaction. "Ward"_#Ward contains the full expressions for the constants as functions of b_(sigma,ijk), p_(sigma,ijk), u_(sigma,ijk)) :ulb,l -Line 2: g_(sigma0), g_(sigma1), g_(sigma2) (for e_1-e_1-e_2) :l,ule +Line 2: g_(sigma0), g_(sigma1), g_(sigma2) (for e_1-e_1-e_2) :l +:ule The next section contains a block for each interaction type for the phi_ij(r_ij). Each block has nr entries with 5 entries per line. @@ -196,7 +199,8 @@ Line 2: phi(r6), phi(r7), phi(r8), phi(r9), phi(r10) (this continues until nr) :l ... :l Line nr/5_1: phi(r1), phi(r2), phi(r3), phi(r4), phi(r5), (for the -e_1-e_1 interaction type) :l,ule +e_1-e_1 interaction type) :l +:ule The next section contains a block for each interaction type for the beta_(sigma,ij)(r_ij). Each block has nr entries with 5 entries per @@ -208,7 +212,8 @@ Line 2: beta_sigma(r6), beta_sigma(r7), beta_sigma(r8), beta_sigma(r9), beta_sigma(r10) (this continues until nr) :l ... :l Line nr/5+1: beta_sigma(r1), beta_sigma(r2), beta_sigma(r3), -beta_sigma(r4), beta_sigma(r5) (for the e_1-e_2 interaction type) :l,ule +beta_sigma(r4), beta_sigma(r5) (for the e_1-e_2 interaction type) :l +:ule The next section contains a block for each interaction type for beta_(pi,ij)(r_ij). Each block has nr entries with 5 entries per line. @@ -219,7 +224,8 @@ Line 2: beta_pi(r6), beta_pi(r7), beta_pi(r8), beta_pi(r9), beta_pi(r10) (this continues until nr) :l ... :l Line nr/5+1: beta_pi(r1), beta_pi(r2), beta_pi(r3), beta_pi(r4), -beta_pi(r5) (for the e_1-e_2 interaction type) :l,ule +beta_pi(r5) (for the e_1-e_2 interaction type) :l +:ule The next section contains a block for each interaction type for the THETA_(S,ij)((THETA_(sigma,ij))^(1/2), f_(sigma,ij)). Each block has @@ -231,7 +237,8 @@ Line 2: THETA_(S,ij)(r6), THETA_(S,ij)(r7), THETA_(S,ij)(r8), THETA_(S,ij)(r9), THETA_(S,ij)(r10) (this continues until nBOt) :l ... :l Line nBOt/5+1: THETA_(S,ij)(r1), THETA_(S,ij)(r2), THETA_(S,ij)(r3), -THETA_(S,ij)(r4), THETA_(S,ij)(r5) (for the e_1-e_2 interaction type) :l,ule +THETA_(S,ij)(r4), THETA_(S,ij)(r5) (for the e_1-e_2 interaction type) :l +:ule The next section contains a block of N lines for e_1-e_N @@ -266,7 +273,8 @@ into for function tables and MUST be a factor of 5; ntheta is the power of the power of the spline used to fit the angular function; nBOt is the number of divisions for the tabulated values of THETA_(S,ij) :ulb,l Line 2: delta_1-delta_7 (if all are not used in the particular :l -formulation, set unused values to 0.0) :l,ule +formulation, set unused values to 0.0) :l +:ule Following this N lines for e_1-e_N containing p_pi. @@ -280,7 +288,8 @@ Line 1: r_cut (for e_1-e_1 interactions) :ulb,l Line 2: c_sigma, a_sigma, c_pi, a_pi :l Line 3: delta_sigma, delta_pi :l Line 4: f_sigma, k_sigma, delta_3 (This delta_3 is similar to that of -the previous section but is interaction type dependent) :l,ule +the previous section but is interaction type dependent) :l +:ule The next section contains a line for each three body interaction type e_j-e_i-e_k with i=0->N, j=0->N, k=j->N @@ -292,7 +301,8 @@ can contain up to five constants. If the spline has more than five terms the second line will contain the remaining constants The following lines will then contain the constants for the remainaing g0, g1, g2... (for e_1-e_1-e_2) and the other three body -interactions :l,ule +interactions :l +:ule The rest of the table has the same structure as the previous section (see above). @@ -319,7 +329,8 @@ into for function tables and MUST be a factor of 5; ntheta is the number of divisions for the tabulated values of the g angular function; nBOt is the number of divisions for the tabulated values of THETA_(S,ij) :ulb,l Line 2: delta_1-delta_7 (if all are not used in the particular :l -formulation, set unused values to 0.0) :l,ule +formulation, set unused values to 0.0) :l +:ule Following this N lines for e_1-e_N containing p_pi. @@ -333,7 +344,8 @@ Line 1: r_cut (for e_1-e_1 interactions) :ulb,l Line 2: c_sigma, a_sigma, c_pi, a_pi :l Line 3: delta_sigma, delta_pi :l Line 4: f_sigma, k_sigma, delta_3 (This delta_3 is similar to that of -the previous section but is interaction type dependent) :l,ule +the previous section but is interaction type dependent) :l +:ule The next section contains a line for each three body interaction type e_j-e_i-e_k with i=0->N, j=0->N, k=j->N @@ -344,7 +356,8 @@ Line 2: g(theta6), g(theta7), g(theta8), g(theta9), g(theta10) (this continues until ntheta) :l ... :l Line ntheta/5+1: g(theta1), g(theta2), g(theta3), g(theta4), g(theta5), (for the -e_1-e_1-e_2 interaction type) :l,ule +e_1-e_1-e_2 interaction type) :l +:ule The rest of the table has the same structure as the previous section (see above). diff --git a/doc/src/pair_buck_long.txt b/doc/src/pair_buck_long.txt index aad5bdb0fe..50aee51dd3 100644 --- a/doc/src/pair_buck_long.txt +++ b/doc/src/pair_buck_long.txt @@ -20,7 +20,8 @@ flag_coul = {long} or {off} :l {long} = use Kspace long-range summation for the Coulombic term 1/r {off} = omit the Coulombic term :pre cutoff = global cutoff for Buckingham (and Coulombic if only 1 cutoff) (distance units) :l -cutoff2 = global cutoff for Coulombic (optional) (distance units) :l,ule +cutoff2 = global cutoff for Coulombic (optional) (distance units) :l +:ule [Examples:] diff --git a/doc/src/pair_gran.txt b/doc/src/pair_gran.txt index 497d1d553f..baa1154fa5 100644 --- a/doc/src/pair_gran.txt +++ b/doc/src/pair_gran.txt @@ -23,7 +23,8 @@ Kt = elastic constant for tangential contact (force/distance units or pressure u gamma_n = damping coefficient for collisions in normal direction (1/time units or 1/time-distance units - see discussion below) :l gamma_t = damping coefficient for collisions in tangential direction (1/time units or 1/time-distance units - see discussion below) :l xmu = static yield criterion (unitless value between 0.0 and 1.0e4) :l -dampflag = 0 or 1 if tangential damping force is excluded or included :l,ule +dampflag = 0 or 1 if tangential damping force is excluded or included :l +:ule NOTE: Versions of LAMMPS before 9Jan09 had different style names for granular force fields. This is to emphasize the fact that the diff --git a/doc/src/pair_modify.txt b/doc/src/pair_modify.txt index eb60c6b006..8a4f291583 100644 --- a/doc/src/pair_modify.txt +++ b/doc/src/pair_modify.txt @@ -187,7 +187,8 @@ enabled will not be thermodynamically consistent with the truncated force-field that was used. In other words, atoms do not feel any LJ pair interactions beyond the cutoff, but the energy and pressure reported by the simulation include an estimated contribution from -those interactions. :l,ule +those interactions. :l +:ule The {compute} keyword allows pairwise computations to be turned off, even though a "pair_style"_pair_style.html is defined. This is not diff --git a/doc/src/pair_table.txt b/doc/src/pair_table.txt index 8a667e40f4..560ff43590 100644 --- a/doc/src/pair_table.txt +++ b/doc/src/pair_table.txt @@ -118,7 +118,8 @@ consistent (dE/dr = -F) over the entire range of r values. LAMMPS will warn if this is not the case. :l Use as large an inner cutoff as possible. This avoids fitting splines -to very steep parts of the potential. :l,ule +to very steep parts of the potential. :l +:ule :line diff --git a/doc/src/pair_table_rx.txt b/doc/src/pair_table_rx.txt index 6c765d2093..6db0a3fa5c 100644 --- a/doc/src/pair_table_rx.txt +++ b/doc/src/pair_table_rx.txt @@ -111,7 +111,8 @@ Make sure that your tabulated forces and tabulated energies are consistent (dE/dr = -F) along the entire range of r values. :l Use as large an inner cutoff as possible. This avoids fitting splines -to very steep parts of the potential. :l,ule +to very steep parts of the potential. :l +:ule :line diff --git a/doc/src/read_data.txt b/doc/src/read_data.txt index d040872e73..bcdc7ac434 100644 --- a/doc/src/read_data.txt +++ b/doc/src/read_data.txt @@ -698,7 +698,8 @@ atoms in such a bond. :l If you plan to "dump"_dump.html image flags and perform post-analysis that will unwrap atom coordinates, it may be important that a continued run (restarted from a data file) begins with image flags -that are consistent with the previous run. :l,ule +that are consistent with the previous run. :l +:ule NOTE: If your system is an infinite periodic crystal with bonds then it is impossible to have fully consistent image flags. This is because diff --git a/doc/src/region.txt b/doc/src/region.txt index 0dc415a8a8..0bc578c07e 100644 --- a/doc/src/region.txt +++ b/doc/src/region.txt @@ -243,7 +243,8 @@ to yz. :l For style {sphere}, the lattice spacing in dimensions x,y,z are applied to the sphere center x,y,z. The spacing in dimension x is -applied to the sphere radius. :l,ule +applied to the sphere radius. :l +:ule :line diff --git a/doc/src/rerun.txt b/doc/src/rerun.txt index c623d4bebc..da8c8d6895 100644 --- a/doc/src/rerun.txt +++ b/doc/src/rerun.txt @@ -60,7 +60,8 @@ Calculate the portion of per-atom forces resulting from a subset of the potential. E.g. compute only Coulombic forces. This can be done by only defining only a Coulombic pair style in the rerun script. Doing this in the original script would result in different (bad) -dynamics. :l,ule +dynamics. :l +:ule Conceptually, using the rerun command is like running an input script that has a loop in it (see the "next"_next.html and "jump"_jump.html diff --git a/doc/src/tutorial_drude.txt b/doc/src/tutorial_drude.txt index a6080fef27..10de99a80c 100644 --- a/doc/src/tutorial_drude.txt +++ b/doc/src/tutorial_drude.txt @@ -332,8 +332,8 @@ For the {thole} pair style the coefficients are the atom polarizability in units of cubic length :olb,l the screening factor of the Thole function (optional, default value specified by the pair_style command) :l -the cutoff (optional, default value defined by the pair_style command) -:l,ole +the cutoff (optional, default value defined by the pair_style command) :l +:ole The special neighbors have charge-charge and charge-dipole interactions screened by the {coul} factors of the {special_bonds} diff --git a/doc/src/write_dump.txt b/doc/src/write_dump.txt index 8f6e860a48..a4ed7b1664 100644 --- a/doc/src/write_dump.txt +++ b/doc/src/write_dump.txt @@ -17,7 +17,8 @@ style = any of the supported "dump styles"_dump.html :l file = name of file to write dump info to :l dump-args = any additional args needed for a particular "dump style"_dump.html :l modify = all args after this keyword are passed to "dump_modify"_dump_modify.html (optional) :l -dump-modify-args = args for "dump_modify"_dump_modify.html (optional) :l,ule +dump-modify-args = args for "dump_modify"_dump_modify.html (optional) :l +:ule [Examples:] -- GitLab From 3f312244a01d07495bfb18c727da5507684a4339 Mon Sep 17 00:00:00 2001 From: Richard Berger Date: Tue, 6 Sep 2016 23:31:58 -0400 Subject: [PATCH 20/52] Escape RST special character '*' in final output (cherry picked from commit 7cb39811d47b1f364286597acea21c3afd010733) --- doc/utils/converters/lammpsdoc/txt2rst.py | 5 +++++ doc/utils/converters/tests/test_txt2rst.py | 4 ++++ 2 files changed, 9 insertions(+) diff --git a/doc/utils/converters/lammpsdoc/txt2rst.py b/doc/utils/converters/lammpsdoc/txt2rst.py index f9ceb9b7ae..aec1b0d02d 100755 --- a/doc/utils/converters/lammpsdoc/txt2rst.py +++ b/doc/utils/converters/lammpsdoc/txt2rst.py @@ -57,10 +57,15 @@ class RSTMarkup(Markup): return text def convert(self, text): + text = self.escape_rst_chars(text) text = super().convert(text) text = self.inline_math(text) return text + def escape_rst_chars(self, text): + text = text.replace('*', '\\*') + return text + def inline_math(self, text): start_pos = text.find("\\(") end_pos = text.find("\\)") diff --git a/doc/utils/converters/tests/test_txt2rst.py b/doc/utils/converters/tests/test_txt2rst.py index e2c20434be..9403d419a8 100644 --- a/doc/utils/converters/tests/test_txt2rst.py +++ b/doc/utils/converters/tests/test_txt2rst.py @@ -77,6 +77,10 @@ class TestMarkup(unittest.TestCase): self.assertEqual("**bold** = [bold]\n" "*italic* = {italic}\n", s) + def test_escape_rst_characters(self): + s = self.markup.convert("[*bold] and {italic*}") + self.assertEqual("**\*bold** and *italic\**", s) + def test_paragraph_with_italic(self): self.assertEqual("A sentence with a *italic* word", self.markup.convert("A sentence with a {italic} word")) -- GitLab From 925f1bfb6fc997c61f42656109208a5336be2c11 Mon Sep 17 00:00:00 2001 From: Richard Berger Date: Tue, 6 Sep 2016 23:46:14 -0400 Subject: [PATCH 21/52] Escape RST special character '^' and take care of special math cases (cherry picked from commit 453521c8e682c6563226dfcc57c689052dacd21f) --- doc/utils/converters/lammpsdoc/txt2rst.py | 6 ++++++ doc/utils/converters/tests/test_txt2rst.py | 17 +++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/doc/utils/converters/lammpsdoc/txt2rst.py b/doc/utils/converters/lammpsdoc/txt2rst.py index aec1b0d02d..73c5ff91dc 100755 --- a/doc/utils/converters/lammpsdoc/txt2rst.py +++ b/doc/utils/converters/lammpsdoc/txt2rst.py @@ -64,6 +64,7 @@ class RSTMarkup(Markup): def escape_rst_chars(self, text): text = text.replace('*', '\\*') + text = text.replace('^', '\\^') return text def inline_math(self, text): @@ -73,6 +74,8 @@ class RSTMarkup(Markup): while start_pos >= 0 and end_pos >= 0: original = text[start_pos:end_pos+2] formula = original[2:-2] + formula = formula.replace('\\*', '*') + formula = formula.replace('\\^', '^') replacement = ":math:`" + formula.replace('\n', ' ').strip() + "`" text = text.replace(original, replacement) @@ -300,6 +303,9 @@ class RSTFormatting(Formatting): start = "" body = parts[0] + body = body.replace('\\*', '*') + body = body.replace('\\^', '^') + if len(start) > 0: text += start + "\n" text += "\n.. math::\n\n" diff --git a/doc/utils/converters/tests/test_txt2rst.py b/doc/utils/converters/tests/test_txt2rst.py index 9403d419a8..a4b059fbf3 100644 --- a/doc/utils/converters/tests/test_txt2rst.py +++ b/doc/utils/converters/tests/test_txt2rst.py @@ -81,6 +81,10 @@ class TestMarkup(unittest.TestCase): s = self.markup.convert("[*bold] and {italic*}") self.assertEqual("**\*bold** and *italic\**", s) + def test_escape_hat_character(self): + s = self.markup.convert("x^2") + self.assertEqual("x\^2", s) + def test_paragraph_with_italic(self): self.assertEqual("A sentence with a *italic* word", self.markup.convert("A sentence with a {italic} word")) @@ -411,6 +415,16 @@ class TestMathMarkup(unittest.TestCase): " \\frac{s_{ij} r_{ij} }{2} \\right)\n" " \\exp \\left( - s_{ij} r_{ij} \\right) \\end{equation}\n\n", s) + def test_detect_latex_equation_with_mult(self): + s = self.txt2rst.convert("\\begin\\{equation\\} a = b * c \\end\\{equation\\}\n") + self.assertEqual("\n.. math::\n\n" + " \\begin{equation} a = b * c \\end{equation}\n\n", s) + + def test_detect_latex_equation_with_pow(self): + s = self.txt2rst.convert("\\begin\\{equation\\} a = b^c \\end\\{equation\\}\n") + self.assertEqual("\n.. math::\n\n" + " \\begin{equation} a = b^c \\end{equation}\n\n", s) + def test_detect_inline_latex_equation(self): s = self.txt2rst.convert("Masses: \\begin\\{equation\\} M' = M + m \\end\\{equation\\}\n" "\\begin\\{equation\\} m' = \\frac \\{M\\, m \\} \\{M'\\} \\end\\{equation\\}\n") @@ -426,6 +440,9 @@ class TestMathMarkup(unittest.TestCase): def test_detect_inline_math(self): self.assertEqual(":math:`x^2`", self.markup.convert("\\( x^2 \\)")) + def test_detect_inline_math_mult(self): + self.assertEqual(":math:`x * 2`", self.markup.convert("\\( x * 2 \\)")) + def test_detect_multiline_inline_math(self): line = "\\(\\sqrt \\{ \\frac \\{2\, k_B \\mathtt\\{Tcom\\}\, m'\\}\n" \ "\\{\\mathrm dt\\, \\mathtt\\{damp\\_com\\} \\}\n" \ -- GitLab From 9e8256aeb0b7e4f8ffadb97e6a04256018b17138 Mon Sep 17 00:00:00 2001 From: Richard Berger Date: Wed, 7 Sep 2016 00:52:43 -0400 Subject: [PATCH 22/52] Refactored code and escape RST special character '_' (cherry picked from commit 4629a464f701f919633fd220860b6610d097c291) --- doc/utils/converters/lammpsdoc/txt2rst.py | 21 ++++++++++++++------- doc/utils/converters/tests/test_txt2rst.py | 4 ++++ 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/doc/utils/converters/lammpsdoc/txt2rst.py b/doc/utils/converters/lammpsdoc/txt2rst.py index 73c5ff91dc..a4196e501b 100755 --- a/doc/utils/converters/lammpsdoc/txt2rst.py +++ b/doc/utils/converters/lammpsdoc/txt2rst.py @@ -65,6 +65,13 @@ class RSTMarkup(Markup): def escape_rst_chars(self, text): text = text.replace('*', '\\*') text = text.replace('^', '\\^') + text = re.sub(r'([^"])_', r'\1\\_', text) + return text + + def unescape_rst_chars(self, text): + text = text.replace('\\*', '*') + text = text.replace('\\^', '^') + text = text.replace('\\_', '_') return text def inline_math(self, text): @@ -74,8 +81,7 @@ class RSTMarkup(Markup): while start_pos >= 0 and end_pos >= 0: original = text[start_pos:end_pos+2] formula = original[2:-2] - formula = formula.replace('\\*', '*') - formula = formula.replace('\\^', '^') + formula = self.unescape_rst_chars(formula) replacement = ":math:`" + formula.replace('\n', ' ').strip() + "`" text = text.replace(original, replacement) @@ -88,6 +94,8 @@ class RSTMarkup(Markup): content = content.strip() content = content.replace('\n', ' ') + href = self.unescape_rst_chars(href) + anchor_pos = href.find('#') if anchor_pos >= 0: @@ -130,11 +138,11 @@ class RSTFormatting(Formatting): link.lower().endswith('.jpeg') or link.lower().endswith('.png') or link.lower().endswith('.gif')): - converted = ".. thumbnail:: " + link + "\n" + converted = ".. thumbnail:: " + self.markup.unescape_rst_chars(link) + "\n" else: - converted = ".. image:: " + file + "\n" + converted = ".. image:: " + self.markup.unescape_rst_chars(file) + "\n" if link: - converted += " :target: " + link + "\n" + converted += " :target: " + self.markup.unescape_rst_chars(link) + "\n" if "c" in self.current_command_list: converted += " :align: center\n" @@ -303,8 +311,7 @@ class RSTFormatting(Formatting): start = "" body = parts[0] - body = body.replace('\\*', '*') - body = body.replace('\\^', '^') + body = self.markup.unescape_rst_chars(body) if len(start) > 0: text += start + "\n" diff --git a/doc/utils/converters/tests/test_txt2rst.py b/doc/utils/converters/tests/test_txt2rst.py index a4b059fbf3..1602fb61f9 100644 --- a/doc/utils/converters/tests/test_txt2rst.py +++ b/doc/utils/converters/tests/test_txt2rst.py @@ -85,6 +85,10 @@ class TestMarkup(unittest.TestCase): s = self.markup.convert("x^2") self.assertEqual("x\^2", s) + def test_escape_underscore(self): + s = self.markup.convert("x_") + self.assertEqual("x\_", s) + def test_paragraph_with_italic(self): self.assertEqual("A sentence with a *italic* word", self.markup.convert("A sentence with a {italic} word")) -- GitLab From 4c783ea3b7262ad49f70f010ece79cbc4f43e610 Mon Sep 17 00:00:00 2001 From: Richard Berger Date: Wed, 7 Sep 2016 01:31:56 -0400 Subject: [PATCH 23/52] Enforce l,ule or l,ole command order for RST (cherry picked from commit 79e867c213ee022685e5bb8a5089a112099e4f06) --- doc/utils/converters/lammpsdoc/txt2html.py | 5 ++++- doc/utils/converters/lammpsdoc/txt2rst.py | 8 ++++++++ doc/utils/converters/tests/test_txt2rst.py | 8 ++++++++ 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/doc/utils/converters/lammpsdoc/txt2html.py b/doc/utils/converters/lammpsdoc/txt2html.py index ab132a380d..6e559723b4 100755 --- a/doc/utils/converters/lammpsdoc/txt2html.py +++ b/doc/utils/converters/lammpsdoc/txt2html.py @@ -518,6 +518,9 @@ class TxtParser(object): def last_word(self, text): return text.split()[-1] + def order_commands(self, commands): + return list(reversed(commands)) + def do_formatting(self, paragraph): last_word = self.last_word(paragraph) format_str = paragraph[paragraph.rfind(last_word):] @@ -529,7 +532,7 @@ class TxtParser(object): commands = [x[0] for x in command_pattern.findall(commands)] - for command in reversed(commands): + for command in self.order_commands(commands): paragraph = self.format.convert(command, paragraph, commands) return paragraph + '\n' diff --git a/doc/utils/converters/lammpsdoc/txt2rst.py b/doc/utils/converters/lammpsdoc/txt2rst.py index a4196e501b..1bc279c0f3 100755 --- a/doc/utils/converters/lammpsdoc/txt2rst.py +++ b/doc/utils/converters/lammpsdoc/txt2rst.py @@ -347,6 +347,14 @@ class Txt2Rst(TxtParser): def is_raw_textblock_end(self, line): return line.startswith('END_RST -->') + def order_commands(self, commands): + if 'ule' in commands and 'l' in commands and commands.index('ule') > commands.index('l'): + return commands + elif 'ole' in commands and 'l' in commands and commands.index('ole') > commands.index('l'): + return commands + return super().order_commands(commands) + + class Txt2RstConverter(TxtConverter): def get_argument_parser(self): parser = argparse.ArgumentParser(description='converts a text file with simple formatting & markup into ' diff --git a/doc/utils/converters/tests/test_txt2rst.py b/doc/utils/converters/tests/test_txt2rst.py index 1602fb61f9..2fa2bd699e 100644 --- a/doc/utils/converters/tests/test_txt2rst.py +++ b/doc/utils/converters/tests/test_txt2rst.py @@ -236,6 +236,14 @@ class TestListFormatting(unittest.TestCase): "* two\n" "* three\n\n", s) + def test_elementwise_unordered_list_reverse(self): + s = self.txt2rst.convert("one :ulb,l\n" + "two :l\n" + "three :l,ule\n") + self.assertEqual("* one\n" + "* two\n" + "* three\n\n", s) + def test_multi_line_unordered_list_elements(self): s = self.txt2rst.convert("one :ulb,l\n" "two\n" -- GitLab From 348b677148cea0d57eaab992d233f7ab4eca9d19 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 7 Sep 2016 07:41:17 -0400 Subject: [PATCH 24/52] Make formatting and links more consistent and unique --- doc/src/Section_packages.txt | 6 +++--- doc/src/Section_tools.txt | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/doc/src/Section_packages.txt b/doc/src/Section_packages.txt index 5282eaa4bb..38afb98de1 100644 --- a/doc/src/Section_packages.txt +++ b/doc/src/Section_packages.txt @@ -1160,9 +1160,9 @@ Package, Description, Author(s), Doc page, Example, Pic/movie, Library "USER-QTB"_#USER-QTB, quantum nuclear effects, Yuan Shen (Stanford), "fix qtb"_fix_qtb.html "fix qbmsst"_fix_qbmsst.html, qtb, -, - "USER-QUIP"_#USER-QUIP, QUIP/libatoms interface, Albert Bartok-Partay (U Cambridge), "pair_style quip"_pair_quip.html, USER/quip, -, lib/quip "USER-REAXC"_#USER-REAXC, C version of ReaxFF, Metin Aktulga (LBNL), "pair_style reaxc"_pair_reax_c.html, reax, -, - -"USER-SMD"_#USER-SMD, smoothed Mach dynamics, Georg Ganzenmuller (EMI), "userguide.pdf"_PDF/SMD_LAMMPS_userguide.pdf, USER/smd, -, - +"USER-SMD"_#USER-SMD, smoothed Mach dynamics, Georg Ganzenmuller (EMI), "SMD User Guide"_PDF/SMD_LAMMPS_userguide.pdf, USER/smd, -, - "USER-SMTBQ"_#USER-SMTBQ, Second Moment Tight Binding - QEq potential, Salles & Maras & Politano & Tetot (4), "pair_style smtbq"_pair_smtbq.html, USER/smtbq, -, - -"USER-SPH"_#USER-SPH, smoothed particle hydrodynamics, Georg Ganzenmuller (EMI), "userguide.pdf"_PDF/SPH_LAMMPS_userguide.pdf, USER/sph, "sph"_sph, - +"USER-SPH"_#USER-SPH, smoothed particle hydrodynamics, Georg Ganzenmuller (EMI), "SPH User Guide"_PDF/SPH_LAMMPS_userguide.pdf, USER/sph, "sph"_sph, - "USER-TALLY"_#USER-TALLY, Pairwise tallied computes, Axel Kohlmeyer (Temple U), "compute XXX/tally"_compute_tally.html, USER/tally, -, - "USER-VTK"_#USER-VTK, VTK-style dumps, Berger and Queteschiner (6), "compute custom/vtk"_dump_custom_vtk.html, -, -, lib/vtk :tb(ea=c) @@ -1336,7 +1336,7 @@ splitting algorithm. See src/USER-DPD/README for more details. Supporting info: /src/USER-DPD/README, "compute dpd"_compute_dpd.html "compute dpd/atom"_compute_dpd_atom.html "fix eos/cv"_fix_eos_table.html "fix eos/table"_fix_eos_table.html - "fix eos/table/rx"_fix_eos_table_rx.html "fix shardlow"_fix_shardlow.html +"fix eos/table/rx"_fix_eos_table_rx.html "fix shardlow"_fix_shardlow.html "fix rx"_fix_rx.html "pair table/rx"_pair_table_rx.html "pair dpd/fdt"_pair_dpd_fdt.html "pair dpd/fdt/energy"_pair_dpd_fdt.html "pair exp6/rx"_pair_exp6_rx.html "pair multi/lucy"_pair_multi_lucy.html diff --git a/doc/src/Section_tools.txt b/doc/src/Section_tools.txt index 6da0690f34..189bc1e35c 100644 --- a/doc/src/Section_tools.txt +++ b/doc/src/Section_tools.txt @@ -65,7 +65,7 @@ own sub-directories with their own Makefiles. "polymer bonding"_#polybond "pymol_asphere"_#pymol "python"_#pythontools -"reax"_#reax +"reax"_#reax_tool "restart2data"_#restart "vim"_#vim "xmgrace"_#xmgrace @@ -455,7 +455,7 @@ README for more info on Pizza.py and how to use these scripts. :line -reax tool :h4,link(reax) +reax tool :h4,link(reax_tool) The reax sub-directory contains stand-alond codes that can post-process the output of the "fix reax/bonds"_fix_reax_bonds.html -- GitLab From 70d6718aa31290689f0e7f52af48438e0de43366 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 7 Sep 2016 07:42:06 -0400 Subject: [PATCH 25/52] Update discussion on parallel python packages. There seem to be only two left. --- doc/src/Section_python.txt | 69 +++++++++++++------------------------- 1 file changed, 24 insertions(+), 45 deletions(-) diff --git a/doc/src/Section_python.txt b/doc/src/Section_python.txt index ce38053023..b9049d87f7 100644 --- a/doc/src/Section_python.txt +++ b/doc/src/Section_python.txt @@ -277,35 +277,14 @@ your Python with an interface to MPI. This also allows you to make MPI calls directly from Python in your script, if you desire. There are several Python packages available that purport to wrap MPI -as a library and allow MPI functions to be called from Python. - -These include - -"pyMPI"_http://pympi.sourceforge.net/ -"maroonmpi"_http://code.google.com/p/maroonmpi/ -"mpi4py"_http://code.google.com/p/mpi4py/ -"myMPI"_http://nbcr.sdsc.edu/forum/viewtopic.php?t=89&sid=c997fefc3933bd66204875b436940f16 -"Pypar"_http://code.google.com/p/pypar :ul - -All of these except pyMPI work by wrapping the MPI library and -exposing (some portion of) its interface to your Python script. This -means Python cannot be used interactively in parallel, since they do -not address the issue of interactive input to multiple instances of -Python running on different processors. The one exception is pyMPI, -which alters the Python interpreter to address this issue, and (I -believe) creates a new alternate executable (in place of "python" -itself) as a result. - -In principle any of these Python/MPI packages should work to invoke -LAMMPS in parallel and to make MPI calls themselves from a Python -script which is itself running in parallel. However, when I -downloaded and looked at a few of them, their documentation was -incomplete and I had trouble with their installation. It's not clear -if some of the packages are still being actively developed and -supported. - -The packages Pypar and mpi4py have both been successfully tested with -LAMMPS. Pypar is simpler and easy to set up and use, but supports +as a library and allow MPI functions to be called from Python. However, +development on most of them seems to be halted except on: + +"mpi4py"_https://bitbucket.org/mpi4py/mpi4py +"PyPar"_https://github.com/daleroberts/pypar :ul + +Both packages, PyPar and mpi4py have been successfully tested with +LAMMPS. PyPar is simpler and easy to set up and use, but supports only a subset of MPI. Mpi4py is more MPI-feature complete, but also a bit more complex to use. As of version 2.0.0, mpi4py is the only python MPI wrapper that allows passing a custom MPI communicator to @@ -314,7 +293,7 @@ LAMMPS instances on subsets of the total MPI ranks. :line -Pypar requires the ubiquitous "Numpy package"_http://numpy.scipy.org +PyPar requires the ubiquitous "Numpy package"_http://numpy.scipy.org be installed in your Python. After launching Python, type import numpy :pre @@ -329,16 +308,16 @@ sudo python setup.py install :pre The "sudo" is only needed if required to copy Numpy files into your Python distribution's site-packages directory. -To install Pypar (version pypar-2.1.4_94 as of Aug 2012), unpack it +To install PyPar (version pypar-2.1.4_94 as of Aug 2012), unpack it and from its "source" directory, type python setup.py build sudo python setup.py install :pre -Again, the "sudo" is only needed if required to copy Pypar files into +Again, the "sudo" is only needed if required to copy PyPar files into your Python distribution's site-packages directory. -If you have successully installed Pypar, you should be able to run +If you have successully installed PyPar, you should be able to run Python and type import pypar :pre @@ -355,17 +334,17 @@ print "Proc %d out of %d procs" % (pypar.rank(),pypar.size()) :pre and see one line of output for each processor you run on. -NOTE: To use Pypar and LAMMPS in parallel from Python, you must insure +NOTE: To use PyPar and LAMMPS in parallel from Python, you must insure both are using the same version of MPI. If you only have one MPI installed on your system, this is not an issue, but it can be if you have multiple MPIs. Your LAMMPS build is explicit about which MPI it is using, since you specify the details in your lo-level -src/MAKE/Makefile.foo file. Pypar uses the "mpicc" command to find +src/MAKE/Makefile.foo file. PyPar uses the "mpicc" command to find information about the MPI it uses to build against. And it tries to load "libmpi.so" from the LD_LIBRARY_PATH. This may or may not find the MPI library that LAMMPS is using. If you have problems running -both Pypar and LAMMPS together, this is an issue you may need to -address, e.g. by moving other MPI installations so that Pypar finds +both PyPar and LAMMPS together, this is an issue you may need to +address, e.g. by moving other MPI installations so that PyPar finds the right one. :line @@ -467,8 +446,8 @@ lmp_g++ -in in.lj :pre [Test LAMMPS and Python in parallel:] :h5 To run LAMMPS in parallel, assuming you have installed the -"Pypar"_Pypar package as discussed above, create a test.py file -containing these lines: +"PyPar"_https://github.com/daleroberts/pypar package as discussed +above, create a test.py file containing these lines: import pypar from lammps import lammps @@ -478,8 +457,8 @@ print "Proc %d out of %d procs has" % (pypar.rank(),pypar.size()),lmp pypar.finalize() :pre To run LAMMPS in parallel, assuming you have installed the -"mpi4py"_mpi4py package as discussed above, create a test.py file -containing these lines: +"mpi4py"_https://bitbucket.org/mpi4py/mpi4py package as discussed +above, create a test.py file containing these lines: from mpi4py import MPI from lammps import lammps @@ -498,17 +477,17 @@ and you should see the same output as if you had typed % mpirun -np 4 lmp_g++ -in in.lj :pre -Note that if you leave out the 3 lines from test.py that specify Pypar +Note that if you leave out the 3 lines from test.py that specify PyPar commands you will instantiate and run LAMMPS independently on each of the P processors specified in the mpirun command. In this case you should get 4 sets of output, each showing that a LAMMPS run was made on a single processor, instead of one set of output showing that LAMMPS ran on 4 processors. If the 1-processor outputs occur, it -means that Pypar is not working correctly. +means that PyPar is not working correctly. -Also note that once you import the PyPar module, Pypar initializes MPI +Also note that once you import the PyPar module, PyPar initializes MPI for you, and you can use MPI calls directly in your Python script, as -described in the Pypar documentation. The last line of your Python +described in the PyPar documentation. The last line of your Python script should be pypar.finalize(), to insure MPI is shut down correctly. -- GitLab From 44ce6fac4b911c93bf14eea2b3ac1cd0111f8ab5 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 7 Sep 2016 08:29:16 -0400 Subject: [PATCH 26/52] replace backquote with regular quote and `` + '' with double quote. --- doc/src/Section_errors.txt | 8 ++++---- doc/src/Section_start.txt | 4 ++-- doc/src/tutorial_github.txt | 10 +++++----- src/KIM/pair_kim.h | 8 ++++---- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/doc/src/Section_errors.txt b/doc/src/Section_errors.txt index 7f5f7857a5..6a18b1bbdb 100644 --- a/doc/src/Section_errors.txt +++ b/doc/src/Section_errors.txt @@ -11351,19 +11351,19 @@ have fully consistent image flags, since some bonds will cross periodic boundaries and connect two atoms with the same image flag. :dd -{KIM Model does not provide `energy'; Potential energy will be zero} :dt +{KIM Model does not provide 'energy'; Potential energy will be zero} :dt Self-explanatory. :dd -{KIM Model does not provide `forces'; Forces will be zero} :dt +{KIM Model does not provide 'forces'; Forces will be zero} :dt Self-explanatory. :dd -{KIM Model does not provide `particleEnergy'; energy per atom will be zero} :dt +{KIM Model does not provide 'particleEnergy'; energy per atom will be zero} :dt Self-explanatory. :dd -{KIM Model does not provide `particleVirial'; virial per atom will be zero} :dt +{KIM Model does not provide 'particleVirial'; virial per atom will be zero} :dt Self-explanatory. :dd diff --git a/doc/src/Section_start.txt b/doc/src/Section_start.txt index 2705e6fd83..32bd5dae3c 100644 --- a/doc/src/Section_start.txt +++ b/doc/src/Section_start.txt @@ -1080,12 +1080,12 @@ Here is an example of such errors when the system FFTW or provided lib/colvars library have not been built as shared libraries: /usr/bin/ld: /usr/local/lib/libfftw3.a(mapflags.o): relocation -R_X86_64_32 against `.rodata' can not be used when making a shared +R_X86_64_32 against '.rodata' can not be used when making a shared object; recompile with -fPIC /usr/local/lib/libfftw3.a: could not read symbols: Bad value :pre /usr/bin/ld: ../../lib/colvars/libcolvars.a(colvarmodule.o): -relocation R_X86_64_32 against `__pthread_key_create' can not be used +relocation R_X86_64_32 against '__pthread_key_create' can not be used when making a shared object; recompile with -fPIC ../../lib/colvars/libcolvars.a: error adding symbols: Bad value :pre diff --git a/doc/src/tutorial_github.txt b/doc/src/tutorial_github.txt index 06f15df874..f31de522cc 100644 --- a/doc/src/tutorial_github.txt +++ b/doc/src/tutorial_github.txt @@ -22,7 +22,7 @@ book"_http://git-scm.com/book/ to reacquaint yourself. First of all, you need a GitHub account. This is fairly simple, just go to "GitHub"_https://github.com and create an account by clicking -the ``Sign up for GitHub'' button. Once your account is created, you +the "Sign up for GitHub" button. Once your account is created, you can sign in by clicking the button in the top left and filling in your username or e-mail address and password. @@ -33,7 +33,7 @@ username or e-mail address and password. To get changes into LAMMPS, you need to first fork the repository. At the time of writing, LAMMPS-ICMS is the preferred fork. Go to "LAMMPS on GitHub"_https://github.com/lammps/lammps and make sure branch is -set to ``lammps-icms'', see the figure below. +set to "lammps-icms", see the figure below. :c,image(JPG/tutorial_branch.png) @@ -58,7 +58,7 @@ will contain these changes, a so-called feature branch. Since LAMMPS is such a big project and most user contributions come in small portions, the most ideal workflow for LAMMPS is the so-called -``Feature branch'' workflow. It is explained in great detail here: +"Feature branch" workflow. It is explained in great detail here: "feature branch workflow"_https://www.atlassian.com/git/tutorials/comparing-workflows/feature-branch-workflow. @@ -78,7 +78,7 @@ You can find the proper url to the right of the "HTTPS" block, see figure. :c,image(JPG/tutorial_https_block.png) -The above command copies (``clones'') the git repository to your local +The above command copies ("clones") the git repository to your local machine. You can use this local clone to make changes and test them without interfering with the repository on github. First, however, it is recommended to make a new branch for a particular feature you would @@ -101,7 +101,7 @@ you should switch branches! After everything is done, add the files to the branch and commit them: $ git add src/USER-MANIFOLD examples/USER/manifold/ - $ git add doc/fix_nv{t,e}_manifold_rattle.txt + $ git add doc/fix_nv\{t,e\}_manifold_rattle.txt $ git add doc/fix_manifoldforce.txt doc/user_manifolds.txt :pre After the files are added, the change should be comitted: diff --git a/src/KIM/pair_kim.h b/src/KIM/pair_kim.h index 6e2fd2e342..843fb6db2a 100644 --- a/src/KIM/pair_kim.h +++ b/src/KIM/pair_kim.h @@ -197,19 +197,19 @@ E: Unknown unit_style Self-explanatory. Check the input script or data file. -W: KIM Model does not provide `energy'; Potential energy will be zero +W: KIM Model does not provide 'energy'; Potential energy will be zero Self-explanatory. -W: KIM Model does not provide `forces'; Forces will be zero +W: KIM Model does not provide 'forces'; Forces will be zero Self-explanatory. -W: KIM Model does not provide `particleEnergy'; energy per atom will be zero +W: KIM Model does not provide 'particleEnergy'; energy per atom will be zero Self-explanatory. -W: KIM Model does not provide `particleVirial'; virial per atom will be zero +W: KIM Model does not provide 'particleVirial'; virial per atom will be zero Self-explanatory. -- GitLab From 5feedbd8291d2175fd7ee96332a32465a43c0dd0 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 7 Sep 2016 10:09:53 -0400 Subject: [PATCH 27/52] regenerate html pages with new txt2rst tool --- doc/html/Section_accelerate.html | 4 +- doc/html/Section_commands.html | 12 +- doc/html/Section_errors.html | 10 +- doc/html/Section_example.html | 20 +- doc/html/Section_howto.html | 316 +++++++------- doc/html/Section_modify.html | 102 ++--- doc/html/Section_packages.html | 257 ++++++------ doc/html/Section_python.html | 250 ++++++----- doc/html/Section_start.html | 130 +++--- doc/html/Section_tools.html | 12 +- doc/html/accelerate_gpu.html | 26 +- doc/html/accelerate_intel.html | 46 +- doc/html/accelerate_kokkos.html | 144 +++---- doc/html/accelerate_omp.html | 16 +- doc/html/angle_charmm.html | 14 +- doc/html/angle_class2.html | 18 +- doc/html/angle_cosine.html | 14 +- doc/html/angle_cosine_delta.html | 14 +- doc/html/angle_cosine_periodic.html | 14 +- doc/html/angle_cosine_shift.html | 14 +- doc/html/angle_cosine_shift_exp.html | 14 +- doc/html/angle_cosine_squared.html | 14 +- doc/html/angle_dipole.html | 14 +- doc/html/angle_fourier.html | 6 +- doc/html/angle_fourier_simple.html | 6 +- doc/html/angle_harmonic.html | 14 +- doc/html/angle_quartic.html | 14 +- doc/html/angle_sdk.html | 20 +- doc/html/atom_modify.html | 16 +- doc/html/atom_style.html | 24 +- doc/html/body.html | 20 +- doc/html/bond_class2.html | 14 +- doc/html/bond_fene.html | 14 +- doc/html/bond_fene_expand.html | 14 +- doc/html/bond_harmonic.html | 14 +- doc/html/bond_harmonic_shift.html | 14 +- doc/html/bond_harmonic_shift_cut.html | 14 +- doc/html/bond_morse.html | 14 +- doc/html/bond_nonlinear.html | 14 +- doc/html/bond_quartic.html | 22 +- doc/html/change_box.html | 56 +-- doc/html/compute.html | 14 +- doc/html/compute_bond_local.html | 10 +- doc/html/compute_centro_atom.html | 2 +- doc/html/compute_dipole_chunk.html | 10 +- doc/html/compute_fep.html | 10 +- doc/html/compute_gyration_chunk.html | 10 +- doc/html/compute_heat_flux.html | 26 +- doc/html/compute_inertia_chunk.html | 10 +- doc/html/compute_ke_atom_eff.html | 10 +- doc/html/compute_ke_eff.html | 10 +- doc/html/compute_modify.html | 14 +- doc/html/compute_pe_atom.html | 10 +- doc/html/compute_pressure.html | 14 +- doc/html/compute_property_atom.html | 38 +- doc/html/compute_property_chunk.html | 12 +- doc/html/compute_reduce.html | 62 +-- doc/html/compute_rigid_local.html | 8 +- doc/html/compute_saed.html | 18 +- doc/html/compute_sna_atom.html | 42 +- doc/html/compute_stress_atom.html | 12 +- doc/html/compute_temp_cs.html | 8 +- doc/html/compute_temp_eff.html | 10 +- doc/html/compute_ti.html | 10 +- doc/html/compute_voronoi_atom.html | 34 +- doc/html/compute_xrd.html | 10 +- doc/html/create_atoms.html | 38 +- doc/html/delete_bonds.html | 20 +- doc/html/dihedral_charmm.html | 18 +- doc/html/dihedral_class2.html | 24 +- doc/html/dihedral_cosine_shift_exp.html | 14 +- doc/html/dihedral_fourier.html | 14 +- doc/html/dihedral_harmonic.html | 14 +- doc/html/dihedral_helix.html | 14 +- doc/html/dihedral_multi_harmonic.html | 14 +- doc/html/dihedral_nharmonic.html | 14 +- doc/html/dihedral_opls.html | 18 +- doc/html/dihedral_quadratic.html | 14 +- doc/html/dihedral_spherical.html | 18 +- doc/html/dihedral_style.html | 16 +- doc/html/dihedral_table.html | 46 +- doc/html/dump.html | 62 +-- doc/html/dump_custom_vtk.html | 12 +- doc/html/dump_image.html | 48 +-- doc/html/dump_modify.html | 70 ++-- doc/html/fix.html | 4 +- doc/html/fix_adapt_fep.html | 34 +- doc/html/fix_addtorque.html | 12 +- doc/html/fix_atc.html | 120 +++--- doc/html/fix_atom_swap.html | 14 +- doc/html/fix_ave_atom.html | 52 ++- doc/html/fix_ave_chunk.html | 54 ++- doc/html/fix_ave_correlate.html | 82 ++-- doc/html/fix_ave_correlate_long.html | 30 +- doc/html/fix_ave_histo.html | 54 ++- doc/html/fix_ave_time.html | 52 ++- doc/html/fix_balance.html | 4 +- doc/html/fix_bond_break.html | 4 +- doc/html/fix_bond_create.html | 6 +- doc/html/fix_bond_swap.html | 6 +- doc/html/fix_box_relax.html | 24 +- doc/html/fix_colvars.html | 4 +- doc/html/fix_controller.html | 36 +- doc/html/fix_deform.html | 68 ++- doc/html/fix_deposit.html | 4 +- doc/html/fix_drag.html | 4 +- doc/html/fix_drude_transform.html | 36 +- doc/html/fix_efield.html | 12 +- doc/html/fix_ehex.html | 4 +- doc/html/fix_external.html | 22 +- doc/html/fix_gcmc.html | 32 +- doc/html/fix_gld.html | 6 +- doc/html/fix_gle.html | 6 +- doc/html/fix_gravity.html | 18 +- doc/html/fix_heat.html | 14 +- doc/html/fix_imd.html | 4 +- doc/html/fix_ipi.html | 4 +- doc/html/fix_langevin.html | 4 +- doc/html/fix_langevin_drude.html | 32 +- doc/html/fix_langevin_eff.html | 4 +- doc/html/fix_lb_fluid.html | 4 +- doc/html/fix_lb_momentum.html | 4 +- doc/html/fix_lb_pc.html | 6 +- doc/html/fix_lb_rigid_pc_sphere.html | 4 +- doc/html/fix_lb_viscous.html | 4 +- doc/html/fix_lineforce.html | 4 +- doc/html/fix_move.html | 38 +- doc/html/fix_msst.html | 30 +- doc/html/fix_neb.html | 4 +- doc/html/fix_nh.html | 26 +- doc/html/fix_nh_eff.html | 10 +- doc/html/fix_nph_asphere.html | 12 +- doc/html/fix_nph_sphere.html | 12 +- doc/html/fix_nphug.html | 22 +- doc/html/fix_npt_asphere.html | 12 +- doc/html/fix_npt_body.html | 12 +- doc/html/fix_npt_sphere.html | 12 +- doc/html/fix_nve_asphere.html | 4 +- doc/html/fix_nve_asphere_noforce.html | 4 +- doc/html/fix_nve_body.html | 4 +- doc/html/fix_nve_line.html | 4 +- doc/html/fix_nve_manifold_rattle.html | 14 +- doc/html/fix_nve_sphere.html | 4 +- doc/html/fix_nve_tri.html | 4 +- doc/html/fix_nvt_asphere.html | 10 +- doc/html/fix_nvt_body.html | 10 +- doc/html/fix_nvt_sllod.html | 10 +- doc/html/fix_nvt_sllod_eff.html | 4 +- doc/html/fix_nvt_sphere.html | 10 +- doc/html/fix_orient.html | 4 +- doc/html/fix_phonon.html | 10 +- doc/html/fix_pimd.html | 12 +- doc/html/fix_pour.html | 4 +- doc/html/fix_qbmsst.html | 32 +- doc/html/fix_qeq.html | 18 +- doc/html/fix_qeq_comb.html | 4 +- doc/html/fix_qeq_reax.html | 4 +- doc/html/fix_qmmm.html | 4 +- doc/html/fix_qtb.html | 14 +- doc/html/fix_reax_bonds.html | 4 +- doc/html/fix_reaxc_species.html | 4 +- doc/html/fix_restrain.html | 22 +- doc/html/fix_rigid.html | 34 +- doc/html/fix_rx.html | 16 +- doc/html/fix_saed_vtk.html | 60 ++- doc/html/fix_shake.html | 4 +- doc/html/fix_smd.html | 4 +- doc/html/fix_smd_adjust_dt.html | 16 +- doc/html/fix_smd_integrate_tlsph.html | 18 +- doc/html/fix_smd_integrate_ulsph.html | 24 +- .../fix_smd_move_triangulated_surface.html | 50 ++- doc/html/fix_smd_setvel.html | 10 +- doc/html/fix_smd_wall_surface.html | 16 +- doc/html/fix_spring.html | 4 +- doc/html/fix_spring_chunk.html | 4 +- doc/html/fix_spring_rg.html | 4 +- doc/html/fix_spring_self.html | 4 +- doc/html/fix_store_state.html | 78 ++-- doc/html/fix_temp_berendsen.html | 10 +- doc/html/fix_temp_csvr.html | 10 +- doc/html/fix_temp_rescale.html | 10 +- doc/html/fix_temp_rescale_eff.html | 4 +- doc/html/fix_tfmc.html | 4 +- doc/html/fix_thermal_conductivity.html | 16 +- doc/html/fix_ti_rs.html | 10 +- doc/html/fix_ti_spring.html | 10 +- doc/html/fix_ttm.html | 116 +++--- doc/html/fix_viscosity.html | 4 +- doc/html/fix_viscous.html | 4 +- doc/html/fix_wall.html | 60 ++- doc/html/fix_wall_gran.html | 16 +- doc/html/fix_wall_piston.html | 4 +- doc/html/fix_wall_reflect.html | 58 ++- doc/html/fix_wall_region.html | 4 +- doc/html/genindex.html | 394 +++++++++--------- doc/html/group.html | 36 +- doc/html/if.html | 16 +- doc/html/improper_class2.html | 16 +- doc/html/improper_cossq.html | 14 +- doc/html/improper_cvff.html | 14 +- doc/html/improper_distance.html | 8 +- doc/html/improper_fourier.html | 14 +- doc/html/improper_harmonic.html | 14 +- doc/html/improper_ring.html | 18 +- doc/html/improper_umbrella.html | 14 +- doc/html/jump.html | 24 +- doc/html/kspace_modify.html | 14 +- doc/html/kspace_style.html | 24 +- doc/html/lattice.html | 54 +-- doc/html/min_modify.html | 12 +- doc/html/min_style.html | 20 +- doc/html/neigh_modify.html | 20 +- doc/html/next.html | 12 +- doc/html/package.html | 10 +- doc/html/pair_adp.html | 22 +- doc/html/pair_airebo.html | 52 +-- doc/html/pair_beck.html | 16 +- doc/html/pair_body.html | 16 +- doc/html/pair_bop.html | 26 +- doc/html/pair_born.html | 56 +-- doc/html/pair_brownian.html | 16 +- doc/html/pair_buck.html | 58 +-- doc/html/pair_buck_long.html | 20 +- doc/html/pair_charmm.html | 54 +-- doc/html/pair_class2.html | 42 +- doc/html/pair_colloid.html | 20 +- doc/html/pair_comb.html | 32 +- doc/html/pair_coul.html | 124 +++--- doc/html/pair_coul_diel.html | 14 +- doc/html/pair_cs.html | 26 +- doc/html/pair_dipole.html | 52 +-- doc/html/pair_dpd.html | 28 +- doc/html/pair_dpd_fdt.html | 22 +- doc/html/pair_dsmc.html | 28 +- doc/html/pair_eam.html | 64 +-- doc/html/pair_edip.html | 12 +- doc/html/pair_eff.html | 26 +- doc/html/pair_eim.html | 24 +- doc/html/pair_exp6_rx.html | 18 +- doc/html/pair_gauss.html | 36 +- doc/html/pair_gayberne.html | 14 +- doc/html/pair_gran.html | 20 +- doc/html/pair_gromacs.html | 26 +- doc/html/pair_hbond_dreiding.html | 36 +- doc/html/pair_hybrid.html | 146 +++---- doc/html/pair_line_lj.html | 18 +- doc/html/pair_list.html | 24 +- doc/html/pair_lj.html | 106 ++--- doc/html/pair_lj96.html | 16 +- doc/html/pair_lj_cubic.html | 14 +- doc/html/pair_lj_expand.html | 16 +- doc/html/pair_lj_long.html | 32 +- doc/html/pair_lj_sf.html | 16 +- doc/html/pair_lj_smooth.html | 16 +- doc/html/pair_lj_smooth_linear.html | 16 +- doc/html/pair_lj_soft.html | 88 ++-- doc/html/pair_lubricate.html | 28 +- doc/html/pair_lubricateU.html | 16 +- doc/html/pair_mdf.html | 42 +- doc/html/pair_meam.html | 38 +- doc/html/pair_meam_spline.html | 22 +- doc/html/pair_meam_sw_spline.html | 16 +- doc/html/pair_mgpt.html | 22 +- doc/html/pair_mie.html | 18 +- doc/html/pair_modify.html | 46 +- doc/html/pair_morse.html | 16 +- doc/html/pair_multi_lucy.html | 32 +- doc/html/pair_multi_lucy_rx.html | 34 +- doc/html/pair_nb3b_harmonic.html | 20 +- doc/html/pair_nm.html | 36 +- doc/html/pair_peri.html | 38 +- doc/html/pair_polymorphic.html | 50 +-- doc/html/pair_quip.html | 16 +- doc/html/pair_reax.html | 40 +- doc/html/pair_reax_c.html | 48 +-- doc/html/pair_resquared.html | 14 +- doc/html/pair_sdk.html | 24 +- doc/html/pair_smd_hertz.html | 8 +- doc/html/pair_smd_triangulated_surface.html | 8 +- doc/html/pair_smtbq.html | 22 +- doc/html/pair_snap.html | 26 +- doc/html/pair_soft.html | 36 +- doc/html/pair_sph_idealgas.html | 14 +- doc/html/pair_sph_taitwater.html | 14 +- doc/html/pair_sph_taitwater_morris.html | 14 +- doc/html/pair_srp.html | 36 +- doc/html/pair_style.html | 26 +- doc/html/pair_sw.html | 22 +- doc/html/pair_table.html | 38 +- doc/html/pair_table_rx.html | 38 +- doc/html/pair_tersoff.html | 30 +- doc/html/pair_tersoff_mod.html | 20 +- doc/html/pair_tersoff_zbl.html | 20 +- doc/html/pair_thole.html | 28 +- doc/html/pair_tri_lj.html | 16 +- doc/html/pair_vashishta.html | 20 +- doc/html/pair_yukawa.html | 16 +- doc/html/pair_yukawa_colloid.html | 22 +- doc/html/pair_zbl.html | 16 +- doc/html/prd.html | 32 +- doc/html/processors.html | 20 +- doc/html/python.html | 106 ++--- doc/html/read_data.html | 32 +- doc/html/read_dump.html | 30 +- doc/html/region.html | 34 +- doc/html/restart.html | 24 +- doc/html/run_style.html | 60 +-- doc/html/set.html | 24 +- doc/html/special_bonds.html | 38 +- doc/html/tad.html | 52 +-- doc/html/thermo.html | 8 +- doc/html/thermo_style.html | 58 +-- doc/html/tutorial_drude.html | 192 +++++---- doc/html/tutorial_github.html | 16 +- doc/html/units.html | 2 +- doc/html/variable.html | 120 +++--- doc/html/velocity.html | 22 +- doc/html/write_coeff.html | 12 +- doc/html/write_dump.html | 28 +- 319 files changed, 4360 insertions(+), 4585 deletions(-) diff --git a/doc/html/Section_accelerate.html b/doc/html/Section_accelerate.html index 331ea71448..db8d8af4bd 100644 --- a/doc/html/Section_accelerate.html +++ b/doc/html/Section_accelerate.html @@ -346,8 +346,8 @@ package and are explained in the individual accelerator doc pages, listed above:

    --++ diff --git a/doc/html/Section_commands.html b/doc/html/Section_commands.html index 88bc54ce5a..69c6609b6c 100644 --- a/doc/html/Section_commands.html +++ b/doc/html/Section_commands.html @@ -247,15 +247,15 @@ inside the parenthesis is treated as an “immediate” variable and evaluated as an equal-style variable. This is a way to use numeric formulas in an input script without having to assign them to variable names. For example, these 3 input script lines:

    -
    variable X equal (xlo+xhi)/2+sqrt(v_area)
    +
    +variable X equal (xlo+xhi)/2+sqrt(v_area)
     region 1 block $X 2 INF INF EDGE EDGE
     variable X delete
    -
    -
    +

    can be replaced by

    -
    region 1 block $((xlo+xhi)/2+sqrt(v_area)) 2 INF INF EDGE EDGE
    -
    -
    +
    +region 1 block $((xlo+xhi)/2+sqrt(v_area)) 2 INF INF EDGE EDGE
    +

    so that you do not have to define (or discard) a temporary variable X.

    Note that neither the curly-bracket or immediate form of variables can contain nested $ characters for other variables to substitute for. diff --git a/doc/html/Section_errors.html b/doc/html/Section_errors.html index a8fd33e6b7..680f6140be 100644 --- a/doc/html/Section_errors.html +++ b/doc/html/Section_errors.html @@ -486,7 +486,7 @@ be computed.

    Bad TIP4P bond type for PPPMDisp/TIP4P
    Specified bond type is not valid.
    Bad fix ID in fix append/atoms command
    -
    The value of the fix_id for keyword spatial must start with ‘f_‘.
    +
    The value of the fix_id for keyword spatial must start with ‘f_’.
    Bad grid of processors
    The 3d grid of processors defined by the processors command does not match the number of processors LAMMPS is being run on.
    @@ -6358,13 +6358,13 @@ have an infinite periodic crystal with bonds then it is impossible to have fully consistent image flags, since some bonds will cross periodic boundaries and connect two atoms with the same image flag. -
    KIM Model does not provide `energy’; Potential energy will be zero
    +
    KIM Model does not provide ‘energy’; Potential energy will be zero
    Self-explanatory.
    -
    KIM Model does not provide `forces’; Forces will be zero
    +
    KIM Model does not provide ‘forces’; Forces will be zero
    Self-explanatory.
    -
    KIM Model does not provide `particleEnergy’; energy per atom will be zero
    +
    KIM Model does not provide ‘particleEnergy’; energy per atom will be zero
    Self-explanatory.
    -
    KIM Model does not provide `particleVirial’; virial per atom will be zero
    +
    KIM Model does not provide ‘particleVirial’; virial per atom will be zero
    Self-explanatory.
    Kspace_modify slab param < 2.0 may cause unphysical behavior
    The kspace_modify slab parameter should be larger to insure periodic diff --git a/doc/html/Section_example.html b/doc/html/Section_example.html index 95a590b02f..9c2e1a0c72 100644 --- a/doc/html/Section_example.html +++ b/doc/html/Section_example.html @@ -303,11 +303,11 @@ longer times, e.g. to measure a particular quantity.

    build the accelerator library

    Here is how you can run and visualize one of the sample problems:

    -
    cd indent
    -cp ../../src/lmp_linux .           # copy LAMMPS executable to this dir
    -lmp_linux -in in.indent            # run the problem
    -
    -
    +
    +cd indent
    +cp ../../src/lmp_linux .           # copy LAMMPS executable to this dir
    +lmp_linux -in in.indent            # run the problem
    +

    Running the simulation produces the files dump.indent and log.lammps. You can visualize the dump file of snapshots with a variety of 3rd-party tools highlighted on the @@ -321,17 +321,17 @@ ImageMagick or QuickTime or various Windows-based tools. See the dump image doc page for more details. E.g. this Imagemagick command would create a GIF file suitable for viewing in a browser.

    -
    % convert -loop 1 *.jpg foo.gif
    -
    -
    +
    +% convert -loop 1 *.jpg foo.gif
    +

    7.2. Uppercase directories

    --++ diff --git a/doc/html/Section_howto.html b/doc/html/Section_howto.html index 9ea709012e..feb6e5e5c9 100644 --- a/doc/html/Section_howto.html +++ b/doc/html/Section_howto.html @@ -252,13 +252,13 @@ scripts are based on. If that script had the line

    and tmp.restart.100) as it ran.

    This script could be used to read the 1st restart file and re-run the last 50 timesteps:

    -
    read_restart tmp.restart.50
    -
    -
    -
    neighbor     0.4 bin
    -neigh_modify every 1 delay 1
    -
    -
    +
    +read_restart        tmp.restart.50
    +
    +
    +neighbor     0.4 bin
    +neigh_modify        every 1 delay 1
    +
    fix          1 all nve
     fix          2 all langevin 1.0 1.0 10.0 904297
     
    @@ -281,25 +281,25 @@ notice that the thermodynamic data match at step 50 (if you also put a uses random numbers in a way that does not allow for perfect restarts.

    As an alternate approach, the restart file could be converted to a data file as follows:

    -
    lmp_g++ -r tmp.restart.50 tmp.restart.data
    -
    -
    +
    +lmp_g++ -r tmp.restart.50 tmp.restart.data
    +

    Then, this script could be used to re-run the last 50 steps:

    -
    units                lj
    -atom_style   bond
    -pair_style   lj/cut 1.12
    -pair_modify  shift yes
    -bond_style   fene
    -special_bonds   0.0 1.0 1.0
    -
    -
    -
    read_data    tmp.restart.data
    -
    -
    -
    neighbor     0.4 bin
    -neigh_modify every 1 delay 1
    -
    -
    +
    +units                lj
    +atom_style  bond
    +pair_style  lj/cut 1.12
    +pair_modify shift yes
    +bond_style  fene
    +special_bonds   0.0 1.0 1.0
    +
    +
    +read_data   tmp.restart.data
    +
    +
    +neighbor     0.4 bin
    +neigh_modify        every 1 delay 1
    +
    fix          1 all nve
     fix          2 all langevin 1.0 1.0 10.0 904297
     
    @@ -307,10 +307,10 @@ file as follows:

    timestep     0.012
     
    -
    reset_timestep       50
    -run          50
    -
    -
    +
    +reset_timestep      50
    +run          50
    +

    Note that nearly all the settings specified in the original in.chain script must be repeated, except the pair_coeff and bond_coeff commands since the new data file lists the force field coefficients. @@ -420,39 +420,40 @@ individual commands for more details on how these examples work.

    If “multiple simulations” means continue a previous simulation for more timesteps, then you simply use the run command multiple times. For example, this script

    -
    units lj
    -atom_style atomic
    -read_data data.lj
    -run 10000
    -run 10000
    -run 10000
    -run 10000
    -run 10000
    -
    -
    +
    +units lj
    +atom_style atomic
    +read_data data.lj
    +run 10000
    +run 10000
    +run 10000
    +run 10000
    +run 10000
    +

    would run 5 successive simulations of the same system for a total of 50,000 timesteps.

    If you wish to run totally different simulations, one after the other, the clear command can be used in between them to re-initialize LAMMPS. For example, this script

    -
    units lj
    -atom_style atomic
    -read_data data.lj
    -run 10000
    -clear
    -units lj
    -atom_style atomic
    -read_data data.lj.new
    -run 10000
    -
    -
    +
    +units lj
    +atom_style atomic
    +read_data data.lj
    +run 10000
    +clear
    +units lj
    +atom_style atomic
    +read_data data.lj.new
    +run 10000
    +

    would run 2 independent simulations, one after the other.

    For large numbers of independent simulations, you can use variables and the next and jump commands to loop over the same input script multiple times with different settings. For example, this script, named in.polymer

    -
    variable d index run1 run2 run3 run4 run5 run6 run7 run8
    +
    +variable d index run1 run2 run3 run4 run5 run6 run7 run8
     shell cd $d
     read_data data.polymer
     run 10000
    @@ -460,8 +461,7 @@ shell cd ..
     clear
     next d
     jump in.polymer
    -
    -
    +

    would run 8 simulations in different directories, using a data.polymer file in each directory. The same concept could be used to run the same system at 8 different temperatures, using a temperature variable @@ -528,10 +528,10 @@ replica. The processors assigned to each replica are determined at run-time by using the -partition command-line switch to launch LAMMPS on multiple partitions, which in this context are the same as replicas. E.g. these commands:

    -
    mpirun -np 16 lmp_linux -partition 8x2 -in in.temper
    -mpirun -np 8 lmp_linux -partition 8x1 -in in.neb
    -
    -
    +
    +mpirun -np 16 lmp_linux -partition 8x2 -in in.temper
    +mpirun -np 8 lmp_linux -partition 8x1 -in in.neb
    +

    would each run 8 replicas, on either 16 or 8 processors. Note the use of the -in command-line switch to specify the input script which is required when running in multi-replica mode.

    @@ -933,7 +933,7 @@ vectors of a general parallelepiped, where there is no restriction on A x B . C > 0. The equivalent LAMMPS a,b,c are a linear rotation of A, B, and C and can be computed as follows:

    _images/transform.jpg -

    where A = |A| indicates the scalar length of A. The hat symbol +

    where A = | A | indicates the scalar length of A. The hat symbol (^) indicates the corresponding unit vector. beta and gamma are angles between the vectors described below. Note that by construction, a, b, and c have strictly positive x, y, and z components, respectively. @@ -1037,23 +1037,23 @@ BOUNDS for a snapshot is written to a dump file for a triclinic box, an orthogonal bounding box which encloses the triclinic simulation box is output, along with the 3 tilt factors (xy, xz, yz) of the triclinic box, formatted as follows:

    -
    ITEM: BOX BOUNDS xy xz yz
    -xlo_bound xhi_bound xy
    -ylo_bound yhi_bound xz
    -zlo_bound zhi_bound yz
    -
    -
    +
    +ITEM: BOX BOUNDS xy xz yz
    +xlo_bound xhi_bound xy
    +ylo_bound yhi_bound xz
    +zlo_bound zhi_bound yz
    +

    This bounding box is convenient for many visualization programs and is calculated from the 9 triclinic box parameters (xlo,xhi,ylo,yhi,zlo,zhi,xy,xz,yz) as follows:

    -
    xlo_bound = xlo + MIN(0.0,xy,xz,xy+xz)
    -xhi_bound = xhi + MAX(0.0,xy,xz,xy+xz)
    -ylo_bound = ylo + MIN(0.0,yz)
    -yhi_bound = yhi + MAX(0.0,yz)
    -zlo_bound = zlo
    -zhi_bound = zhi
    -
    -
    +
    +xlo_bound = xlo + MIN(0.0,xy,xz,xy+xz)
    +xhi_bound = xhi + MAX(0.0,xy,xz,xy+xz)
    +ylo_bound = ylo + MIN(0.0,yz)
    +yhi_bound = yhi + MAX(0.0,yz)
    +zlo_bound = zlo
    +zhi_bound = zhi
    +

    These formulas can be inverted if you need to convert the bounding box back into the triclinic box parameters, e.g. xlo = xlo_bound - MIN(0.0,xy,xz,xy+xz).

    @@ -1136,9 +1136,9 @@ of individual particles, after then are created.

    The dipole style does not actually define finite-size particles, but is often used in conjunction with spherical particles, via a command like

    -
    atom_style hybrid sphere dipole
    -
    -
    +
    +atom_style hybrid sphere dipole
    +

    This is because when dipoles interact with each other, they induce torques, and a particle must be finite-size (i.e. have a moment of inertia) in order to respond and rotate. See the atom_style dipole command for details. The “set” command can be @@ -1372,11 +1372,11 @@ per-atom vector.

    When a quantity is accessed, as in many of the output commands discussed below, it can be referenced via the following bracket notation, where ID in this case is the ID of a compute. The leading -“c_” would be replaced by “f_” for a fix, or “v_” for a variable:

    +“c_” would be replaced by “f_” for a fix, or “v_” for a variable:

    ASPHERE
    --++ @@ -1911,13 +1911,13 @@ internal LAMMPS operations. Note that LAMMPS classes are defined within a LAMMPS namespace (LAMMPS_NS) if you use them from another C++ application.

    Library.cpp contains these 5 basic functions:

    -
    void lammps_open(int, char **, MPI_Comm, void **)
    -void lammps_close(void *)
    -int lammps_version(void *)
    -void lammps_file(void *, char *)
    -char *lammps_command(void *, char *)
    -
    -
    +
    +void lammps_open(int, char **, MPI_Comm, void **)
    +void lammps_close(void *)
    +int lammps_version(void *)
    +void lammps_file(void *, char *)
    +char *lammps_command(void *, char *)
    +

    The lammps_open() function is used to initialize LAMMPS, passing in a list of strings as if they were command-line arguments when LAMMPS is run in stand-alone mode from the command line, and a MPI communicator for @@ -1951,17 +1951,17 @@ interleaving the lammps_command() calls with other calls to extract information from LAMMPS, perform its own operations, or call another code’s library.

    Other useful functions are also included in library.cpp. For example:

    -
    void *lammps_extract_global(void *, char *)
    -void *lammps_extract_atom(void *, char *)
    -void *lammps_extract_compute(void *, char *, int, int)
    -void *lammps_extract_fix(void *, char *, int, int, int, int)
    -void *lammps_extract_variable(void *, char *, char *)
    -int lammps_set_variable(void *, char *, char *)
    -int lammps_get_natoms(void *)
    -void lammps_get_coords(void *, double *)
    -void lammps_put_coords(void *, double *)
    -
    -
    +
    +void *lammps_extract_global(void *, char *)
    +void *lammps_extract_atom(void *, char *)
    +void *lammps_extract_compute(void *, char *, int, int)
    +void *lammps_extract_fix(void *, char *, int, int, int, int)
    +void *lammps_extract_variable(void *, char *, char *)
    +int lammps_set_variable(void *, char *, char *)
    +int lammps_get_natoms(void *)
    +void lammps_get_coords(void *, double *)
    +void lammps_put_coords(void *, double *)
    +

    These can extract various global or per-atom quantities from LAMMPS as well as values calculated by a compute, fix, or variable. The “set_variable” function can set an existing string-style variable to a @@ -2087,29 +2087,30 @@ liquid Ar via the GK formalism:

    # Sample LAMMPS input script for viscosity of liquid Ar
     
    -
    units       real
    +
    +units       real
     variable    T equal 86.4956
     variable    V equal vol
     variable    dt equal 4.0
     variable    p equal 400     # correlation length
     variable    s equal 5       # sample interval
     variable    d equal $p*$s   # dump interval
    -
    -
    +
    # convert from LAMMPS real units to SI
     
    -
    variable    kB equal 1.3806504e-23    # [J/K/** Boltzmann
    +
    +variable    kB equal 1.3806504e-23    # [J/K/** Boltzmann
     variable    atm2Pa equal 101325.0
     variable    A2m equal 1.0e-10
     variable    fs2s equal 1.0e-15
     variable    convert equal ${atm2Pa}*${atm2Pa}*${fs2s}*${A2m}*${A2m}*${A2m}
    -
    -
    +
    # setup problem
     
    -
    dimension    3
    +
    +dimension    3
     boundary     p p p
     lattice      fcc 5.376 orient x 1 0 0 orient y 0 1 0 orient z 0 0 1
     region       box block 0 4 0 4 0 4
    @@ -2120,8 +2121,7 @@ pair_style   lj/cut 13.0
     pair_coeff   * * 0.2381 3.405
     timestep     ${dt}
     thermo            $d
    -
    -
    +
    # equilibration and thermalization
     
    @@ -2137,7 +2137,8 @@ run 8000 #fix NVE all nve -
    reset_timestep 0
    +
    +reset_timestep 0
     variable     pxy equal pxy
     variable     pxz equal pxz
     variable     pyz equal pyz
    @@ -2151,9 +2152,8 @@ thermo_style custom step temp press v_pxy v_pxz v_pyz v_v11 v_v22 v_v33
     run          100000
     variable     v equal (v_v11+v_v22+v_v33)/3.0
     variable     ndens equal count(all)/vol
    -print        "average viscosity: $v [Pa.s/** @ $T K, ${ndens} /A^3"
    -
    -
    +print "average viscosity: $v [Pa.s/** @ $T K, ${ndens} /A^3" +

    The fifth method is related to the above Green-Kubo method, but uses the Einstein formulation, analogous to the Einstein mean-square-displacement formulation for self-diffusivity. The @@ -2274,7 +2274,7 @@ fix produces a global array as output with one row of values per chunk.

    -

    6.23.3. Compute */chunk commands:

    +

    6.23.3. Compute */chunk commands:

    Currently the following computes operate on chunks of atoms to produce per-chunk values.

      @@ -2331,31 +2331,31 @@ velocity:

      1. Center of mass of each molecule:
      -
      compute cc1 all chunk/atom molecule
      -compute myChunk all com/chunk cc1
      -fix 1 all ave/time 100 1 100 c_myChunk[*] file tmp.out mode vector
      -
      -
      +
      +compute cc1 all chunk/atom molecule
      +compute myChunk all com/chunk cc1
      +fix 1 all ave/time 100 1 100 c_myChunk[*] file tmp.out mode vector
      +
      1. Total force on each molecule and ave/max across all molecules:
      -
      compute cc1 all chunk/atom molecule
      -fix 1 all ave/chunk 1000 1 1000 cc1 fx fy fz file tmp.out
      -variable xave equal ave(f_1[2])
      -variable xmax equal max(f_1[2])
      -thermo 1000
      -thermo_style custom step temp v_xave v_xmax
      -
      -
      +
      +compute cc1 all chunk/atom molecule
      +fix 1 all ave/chunk 1000 1 1000 cc1 fx fy fz file tmp.out
      +variable xave equal ave(f_1[2])
      +variable xmax equal max(f_1[2])
      +thermo 1000
      +thermo_style custom step temp v_xave v_xmax
      +
      1. Histogram of cluster sizes:
      -
      compute cluster all cluster/atom 1.0
      -compute cc1 all chunk/atom c_cluster compress yes
      -compute size all property/chunk cc1 count
      -fix 1 all ave/histo 100 1 100 0 20 20 c_size mode vector ave running beyond ignore file tmp.histo
      -
      -
      +
      +compute cluster all cluster/atom 1.0
      +compute cc1 all chunk/atom c_cluster compress yes
      +compute size all property/chunk cc1 count
      +fix 1 all ave/histo 100 1 100 0 20 20 c_size mode vector ave running beyond ignore file tmp.histo
      +

    @@ -2607,18 +2607,18 @@ by the Ewald solvers can be used.

    For the NaCL example problem, these pair style and bond style settings are used:

    -
    pair_style      born/coul/long/cs 20.0 20.0
    -pair_coeff      * *      0.0 1.000   0.00  0.00   0.00
    -pair_coeff      3 3    487.0 0.23768 0.00  1.05   0.50 #Na-Na
    -pair_coeff      3 4 145134.0 0.23768 0.00  6.99   8.70 #Na-Cl
    -pair_coeff      4 4 405774.0 0.23768 0.00 72.40 145.40 #Cl-Cl
    -
    -
    -
    bond_style      harmonic
    -bond_coeff      1 63.014 0.0
    -bond_coeff      2 25.724 0.0
    -
    -
    +
    +pair_style      born/coul/long/cs 20.0 20.0
    +pair_coeff      * *      0.0 1.000   0.00  0.00   0.00
    +pair_coeff      3 3    487.0 0.23768 0.00  1.05   0.50 #Na-Na
    +pair_coeff      3 4 145134.0 0.23768 0.00  6.99   8.70 #Na-Cl
    +pair_coeff      4 4 405774.0 0.23768 0.00 72.40 145.40 #Cl-Cl
    +
    +
    +bond_style      harmonic
    +bond_coeff      1 63.014 0.0
    +bond_coeff      2 25.724 0.0
    +

    When running dynamics with the adiabatic core/shell model, the following issues should be considered. Since the relative motion of the core and shell particles corresponds to the polarization, typical @@ -2645,15 +2645,15 @@ used to assign the compute to the thermostat fix. Likewise the thermo_modify temp command can be used to make this temperature be output for the overall system.

    For the NaCl example, this can be done as follows:

    -
    group cores type 1 2
    -group shells type 3 4
    -compute CSequ all temp/cs cores shells
    -fix thermoberendsen all temp/berendsen 1427 1427 0.4    # thermostat for the true physical system
    -fix thermostatequ all nve                               # integrator as needed for the berendsen thermostat
    -fix_modify thermoberendsen temp CSequ
    -thermo_modify temp CSequ                                # output of center-of-mass derived temperature
    -
    -
    +
    +group cores type 1 2
    +group shells type 3 4
    +compute CSequ all temp/cs cores shells
    +fix thermoberendsen all temp/berendsen 1427 1427 0.4    # thermostat for the true physical system
    +fix thermostatequ all nve                               # integrator as needed for the berendsen thermostat
    +fix_modify thermoberendsen temp CSequ
    +thermo_modify temp CSequ                                # output of center-of-mass derived temperature
    +

    If compute temp/cs is used, the decoupled relative motion of the core and the shell should in theory be stable. However numerical fluctuation can introduce a small @@ -2702,14 +2702,14 @@ accessed by the command, to use as input to the compute chunk/atom command to define the core/shell pairs as chunks.

    For example,

    -
    fix csinfo all property/atom i_CSID                       # property/atom command
    -read_data NaCl_CS_x0.1_prop.data fix csinfo NULL CS-Info  # atom property added in the data-file
    -compute prop all property/atom i_CSID
    -compute cs_chunk all chunk/atom c_prop
    -compute cstherm all temp/chunk cs_chunk temp internal com yes cdof 3.0     # note the chosen degrees of freedom for the core/shell pairs
    -fix ave_chunk all ave/time 10 1 10 c_cstherm file chunk.dump mode vector
    -
    -
    +
    +fix csinfo all property/atom i_CSID                       # property/atom command
    +read_data NaCl_CS_x0.1_prop.data fix csinfo NULL CS-Info  # atom property added in the data-file
    +compute prop all property/atom i_CSID
    +compute cs_chunk all chunk/atom c_prop
    +compute cstherm all temp/chunk cs_chunk temp internal com yes cdof 3.0     # note the chosen degrees of freedom for the core/shell pairs
    +fix ave_chunk all ave/time 10 1 10 c_cstherm file chunk.dump mode vector
    +

    The additional section in the date file would be formatted like this:

    CS-Info         # header of additional section
     
    diff --git a/doc/html/Section_modify.html b/doc/html/Section_modify.html index 1ddbd8f04a..41c466042e 100644 --- a/doc/html/Section_modify.html +++ b/doc/html/Section_modify.html @@ -193,8 +193,8 @@ C-style data structures (vectors and arrays).

    Most of the new features described in this section require you to write a new C++ derived class (except for exceptions described below, where you can make small edits to existing files). Creating a new -class requires 2 files, a source code file (.cpp) and a header file -(.h). The derived class must provide certain methods to work as a +class requires 2 files, a source code file (*.cpp) and a header file +(*.h). The derived class must provide certain methods to work as a new option. Depending on how different your new feature is compared to existing features, you can either derive from the base class itself, or from a derived class that already exists. Enabling LAMMPS @@ -209,19 +209,19 @@ and pair_foo.h that define a new class PairFoo that computes pairwise potentials described in the classic 1997 paper by Foo, et al. If you wish to invoke those potentials in a LAMMPS input script with a command like

    -
    pair_style foo 0.1 3.5
    -
    -
    +
    +pair_style foo 0.1 3.5
    +

    then your pair_foo.h file should be structured as follows:

    -
    #ifdef PAIR_CLASS
    -PairStyle(foo,PairFoo)
    -#else
    -...
    -(class definition for PairFoo)
    -...
    -#endif
    -
    -
    +
    +#ifdef PAIR_CLASS
    +PairStyle(foo,PairFoo)
    +#else
    +...
    +(class definition for PairFoo)
    +...
    +#endif
    +

    where “foo” is the style keyword in the pair_style command, and PairFoo is the class name defined in your pair_foo.cpp and pair_foo.h files.

    @@ -275,8 +275,8 @@ atoms.

    class. See atom_vec.h for details.

    c_ID
    --++ @@ -393,18 +393,18 @@ output the custom values.

    The code for these classes can use the per-atom properties defined by fix property/atom. The Atom class has a find_custom() method that is useful in this context:

    -
    int index = atom->find_custom(char *name, int &flag);
    -
    -
    +
    +int index = atom->find_custom(char *name, int &flag);
    +

    The “name” of a custom attribute, as specified in the fix property/atom command, is checked to verify that it exists and its index is returned. The method also sets flag = 0/1 depending on whether it is an integer or floating-point attribute. The vector of values associated with the attribute can then be accessed using the returned index as

    -
    int *ivector = atom->ivector[index];
    -double *dvector = atom->dvector[index];
    -
    -
    +
    +int *ivector = atom->ivector[index];
    +double *dvector = atom->dvector[index];
    +

    Ivector or dvector are vectors of length Nlocal = # of owned atoms, which store the attributes of individual atoms.


    @@ -474,8 +474,8 @@ per-atom kinetic energy.

    class. See compute.h for details.

    init
    --++ @@ -551,8 +551,8 @@ DumpCustom class contained in the dump_custom.cpp file.

    class. See dump.h for details.

    init
    --++ @@ -597,8 +597,8 @@ implement.

    derived class. See fix.h for details.

    write_header
    --++ @@ -823,8 +823,8 @@ styles can be created to add new K-space options to LAMMPS.

    class. See kspace.h for details.

    setmask
    --++ @@ -853,8 +853,8 @@ LAMMPS.

    class. See min.h for details.

    init
    --++ @@ -882,8 +882,8 @@ includes some optional methods to enable its use with rRESPA.

    Here is a brief description of the class methods in pair.h:

    init
    --++ @@ -929,8 +929,8 @@ styles can be created to add new region shapes to LAMMPS.

    class. See region.h for details.

    compute
    --++ @@ -965,8 +965,8 @@ a rigid body containing N sub-particles.

    class. See body.h for details.

    inside
    --++ @@ -1030,14 +1030,14 @@ via the print< thermo_style custom commands. Variables of style “equal” can compute complex equations that involve the following types of arguments:

    -
    thermo keywords = ke, vol, atoms, ...
    -other variables = v_a, v_myvar, ...
    -math functions = div(x,y), mult(x,y), add(x,y), ...
    -group functions = mass(group), xcm(group,x), ...
    -atom values = x[123], y[3], vx[34], ...
    -compute values = c_mytemp[0], c_thermo_press[3], ...
    -
    -
    +
    +thermo keywords = ke, vol, atoms, ...
    +other variables = v_a, v_myvar, ...
    +math functions = div(x,y), mult(x,y), add(x,y), ...
    +group functions = mass(group), xcm(group,x), ...
    +atom values = x[123], y[3], vx[34], ...
    +compute values = c_mytemp[0], c_thermo_press[3], ...
    +

    Adding keywords for the thermo_style custom command (which can then be accessed by variables) was discussed here on this page.

    @@ -1157,7 +1157,7 @@ structures, performs its operations, and is formatted similar to other LAMMPS source files, including the use of the error class for error and warning messages.
  • If you want your contribution to be added as a user-contributed -feature, and it’s a single file (actually a *.cpp and *.h file) it can +feature, and it’s a single file (actually a *.cpp and *.h file) it can rapidly be added to the USER-MISC directory. Send us the one-line entry to add to the USER-MISC/README file in that dir, along with the 2 source files. You can do this multiple times if you wish to @@ -1192,12 +1192,12 @@ to HTML and PDF. The tools for this conversion are included in the source distribution, and the translation can be as simple as doing “make html pdf” in the doc folder. Thus the documentation source files must be in the same format and -style as other .txt files in the lammps/doc/src directory for similar +style as other *.txt files in the lammps/doc/src directory for similar commands and styles; use one or more of them as a starting point. A description of the markup can also be found in lammps/doc/utils/txt2html/README.html As appropriate, the text files can include links to equations -(see doc/Eqs/.tex for examples, we auto-create the associated JPG +(see doc/Eqs/*.tex for examples, we auto-create the associated JPG files), or figures (see doc/JPG for examples), or even additional PDF files with further details (see doc/PDF for examples). The doc page should also include literature citations as appropriate; see the @@ -1220,7 +1220,7 @@ These example inputs are also required for validating memory accesses and testing for memory leaks with valgrind
  • If there is a paper of yours describing your feature (either the algorithm/science behind the feature itself, or its initial usage, or -its implementation in LAMMPS), you can add the citation to the *.cpp +its implementation in LAMMPS), you can add the citation to the *.cpp source file. See src/USER-EFF/atom_vec_electron.cpp for an example. A LaTeX citation is stored in a variable at the top of the file and a single line of code that references the variable is added to the diff --git a/doc/html/Section_packages.html b/doc/html/Section_packages.html index fedd3cc1ae..2565c51206 100644 --- a/doc/html/Section_packages.html +++ b/doc/html/Section_packages.html @@ -630,9 +630,9 @@ for aspherical particle models: ellipsoids, 2d lines, 3d triangles.

    make machine -
    Make.py -p ^asphere -a machine
    -
    -
    +
    +Make.py -p ^asphere -a machine
    +

    Supporting info: Section howto 6.14, pair_style gayberne, pair_style resquared, doc/PDF/pair_gayberne_extra.pdf, @@ -658,9 +658,9 @@ themselves. See the make machine -

    +
    +Make.py -p ^body -a machine
    +

    Supporting info: atom_style body, body, pair_style body, examples/body


    @@ -682,9 +682,9 @@ COMPASS CLASS2 molecular force field.

    make machine -
    Make.py -p ^class2 -a machine
    -
    -
    +
    +Make.py -p ^class2 -a machine
    +

    Supporting info: bond_style class2, angle_style class2, dihedral_style class2, improper_style class2, pair_style lj/class2


    @@ -708,9 +708,9 @@ approximation to Stokesian dynamics.

    make machine -
    Make.py -p ^colloid -a machine
    -
    -
    +
    +Make.py -p ^colloid -a machine
    +

    Supporting info: fix wall/colloid, pair_style colloid, pair_style yukawa/colloid, pair_style brownian, pair_style lubricate, pair_style lubricateU, examples/colloid, examples/srd


    @@ -737,9 +737,9 @@ zlib info it specifies.

    make machine -
    Make.py -p ^compress -a machine
    -
    -
    +
    +Make.py -p ^compress -a machine
    +

    Supporting info: src/COMPRESS/README, lib/compress/README, dump atom/gz, dump cfg/gz, dump custom/gz, dump xyz/gz


    @@ -764,9 +764,9 @@ package.

    make machine -
    Make.py -p ^coreshell -a machine
    -
    -
    +
    +Make.py -p ^coreshell -a machine
    +

    Supporting info: Section howto 6.26, compute temp/cs, pair_style born/coul/long/cs, pair_style buck/coul/long/cs, pair_style lj/cut/coul/long/cs”_pair_lj.html, examples/coreshell

    @@ -789,9 +789,9 @@ dipole models with short-range or long-range interactions.

    make machine -
    Make.py -p ^dipole -a machine
    -
    -
    +
    +Make.py -p ^dipole -a machine
    +

    Supporting info: atom_style dipole, pair_style lj/cut/dipole/cut, pair_style lj/cut/dipole/long, pair_style lj/long/dipole/long, examples/dipole


    @@ -841,9 +841,9 @@ one step, with Type “python src/Make.py -h -gpu” to see the details. make machine -
    Make.py -p ^gpu -a machine
    -
    -
    +
    +Make.py -p ^gpu -a machine
    +

    Supporting info: src/GPU/README, lib/gpu/README, Section acclerate, Section accelerate gpu, Pair Styles section of Section commands 3.5 for any pair style listed with a (g), kspace_style, package gpu, examples/accelerate, bench/FERMI, bench/KEPLER

    @@ -867,9 +867,9 @@ frictional and dissipative potentials.

    make machine -
    Make.py -p ^granular -a machine
    -
    -
    +
    +Make.py -p ^granular -a machine
    +

    Supporting info: Section howto 6.6, fix pour, fix wall/gran, pair_style gran/hooke, pair_style gran/hertz/history, examples/pour, bench/in.chute


    @@ -896,9 +896,9 @@ process. You should not need to edit this file.

    make machine -
    Make.py -p ^kim -a machine
    -
    -
    +
    +Make.py -p ^kim -a machine
    +

    Supporting info: src/KIM/README, lib/kim/README, pair_style kim, examples/kim


    @@ -928,12 +928,12 @@ choose which hardware to build for. Type “python src/Make.py -h system, you will need to read the Section accelerate kokkos doc page for details of what Makefile.machine settings are needed.

    To install via make or Make.py for each of 3 hardware options:

    -
    make yes-kokkos
    -make kokkos_omp    # for CPUs with OpenMP
    -make kokkos_cuda   # for GPUs, check the KOKKOS_ARCH setting in Makefile.kokkos_cuda
    -make kokkos_phi    # for Xeon Phis
    -
    -
    +
    +make yes-kokkos
    +make kokkos_omp    # for CPUs with OpenMP
    +make kokkos_cuda   # for GPUs, check the KOKKOS_ARCH setting in Makefile.kokkos_cuda
    +make kokkos_phi    # for Xeon Phis
    +

    Make.py -p kokkos -kokkos omp -a machine # for CPUs with OpenMP Make.py -p kokkos -kokkos cuda arch=35 -a machine # for GPUs of style arch Make.py -p kokkos -kokkos phi -a machine # for Xeon Phis

    @@ -942,9 +942,9 @@ Make.py -p kokkos -kokkos phi -a machine # for Xeon Phis

    make machine -
    Make.py -p ^kokkos -a machine
    -
    -
    +
    +Make.py -p ^kokkos -a machine
    +

    Supporting info: src/KOKKOS/README, lib/kokkos/README, Section acclerate, Section accelerate kokkos, Pair Styles section of Section commands 3.5 for any pair style listed with a (k), package kokkos, examples/accelerate, bench/FERMI, bench/KEPLER

    @@ -977,9 +977,9 @@ see the details.

    make machine -
    Make.py -p ^kspace -a machine
    -
    -
    +
    +Make.py -p ^kspace -a machine
    +

    Supporting info: kspace_style, doc/PDF/kspace.pdf, Section howto 6.7, Section howto 6.8, Section howto 6.9, pair_style coul, other pair style command doc pages which have “long” or “msm” in their @@ -1005,9 +1005,9 @@ the full list.

    make machine -
    Make.py -p ^manybody -a machine
    -
    -
    +
    +Make.py -p ^manybody -a machine
    +

    Supporting info:

    Examples: Pair Styles section of Section commands 3.5, examples/comb, examples/eim, examples/nb3d, examples/vashishta

    @@ -1032,9 +1032,9 @@ in conjuction with dynamics.

    make machine -
    Make.py -p ^mc -a machine
    -
    -
    +
    +Make.py -p ^mc -a machine
    +

    Supporting info: fix atom/swap, fix bond/break, fix bond/create, fix bond/swap, fix gcmc, pair_style dsmc


    @@ -1079,9 +1079,9 @@ Intel Fortran compiler, rather than the GNU Fortran compiler.

    make machine -
    Make.py -p ^meam -a machine
    -
    -
    +
    +Make.py -p ^meam -a machine
    +

    Supporting info: lib/meam/README, pair_style meam, examples/meam


    @@ -1104,9 +1104,9 @@ listing, “ls src/MISC”, to see the list of commands.

    make machine -
    Make.py -p ^misc -a machine
    -
    -
    +
    +Make.py -p ^misc -a machine
    +

    Supporting info: compute ti, fix evaporate, fix tmm, fix viscosity, examples/misc


    @@ -1129,9 +1129,9 @@ covalent bonds. The pair styles include terms for the Dreiding make machine -
    Make.py -p ^molecule -a machine
    -
    -
    +
    +Make.py -p ^molecule -a machine
    +

    Supporting info:atom_style, bond_style, angle_style, dihedral_style, @@ -1159,9 +1159,9 @@ are also written and read in parallel.

    make machine -
    Make.py -p ^mpiio -a machine
    -
    -
    +
    +Make.py -p ^mpiio -a machine
    +

    Supporting info: dump, restart, write_restart, read_restart


    @@ -1192,9 +1192,9 @@ creates and uses.

    make machine -
    Make.py -p ^opt -a machine
    -
    -
    +
    +Make.py -p ^opt -a machine
    +

    Supporting info: Section acclerate, Section accelerate opt, Pair Styles section of Section commands 3.5 for any pair style listed with an (o), examples/accelerate, bench/KEPLER


    @@ -1218,9 +1218,9 @@ styles which implement different materials models.

    make machine -
    Make.py -p ^peri -a machine
    -
    -
    +
    +Make.py -p ^peri -a machine
    +

    Supporting info: doc/PDF/PDLammps_overview.pdf, doc/PDF/PDLammps_EPS.pdf, @@ -1261,9 +1261,9 @@ one step. Type “python src/Make.py -h -poems” to see the details.make machine -

    Make.py -p ^meam -a machine
    -
    -
    +
    +Make.py -p ^meam -a machine
    +

    Supporting info: src/POEMS/README, lib/poems/README, fix poems, examples/rigid


    @@ -1296,9 +1296,9 @@ in one step. Type “python src/Make.py -h -python” to see the detail make machine -
    Make.py -p ^python -a machine
    -
    -
    +
    +Make.py -p ^python -a machine
    +

    Supporting info: examples/python


    @@ -1320,9 +1320,9 @@ that use QEq as part of their formulation.

    make machine -
    Make.py -p ^qeq -a machine
    -
    -
    +
    +Make.py -p ^qeq -a machine
    +

    Supporting info: fix qeq/*, examples/qeq


    @@ -1362,9 +1362,9 @@ one step. Type “python src/Make.py -h -reax” to see the details.

    make machine -
    Make.py -p ^reax -a machine
    -
    -
    +
    +Make.py -p ^reax -a machine
    +

    Supporting info: lib/reax/README, pair_style reax, fix reax/bonds, examples/reax


    @@ -1394,9 +1394,9 @@ field calcalation on another set.

    make machine -
    Make.py -p ^replica -a machine
    -
    -
    +
    +Make.py -p ^replica -a machine
    +

    Supporting info: Section howto 6.5, neb, prd, tad, temper, run_style verlet/split, examples/neb, examples/prd, @@ -1422,9 +1422,9 @@ few large bodies or many small bodies.

    make machine -
    Make.py -p ^rigid -a machine
    -
    -
    +
    +Make.py -p ^rigid -a machine
    +

    Supporting info: compute erotate/rigid, fix shake, fix rattle, fix rigid/*, examples/ASPHERE, examples/rigid


    @@ -1446,9 +1446,9 @@ simulations where a shock-wave passes through a material.

    make machine -
    Make.py -p ^shock -a machine
    -
    -
    +
    +Make.py -p ^shock -a machine
    +

    Supporting info: fix append/atoms, fix msst, fix nphug, fix wall/piston, examples/hugoniostat, examples/msst


    @@ -1471,9 +1471,9 @@ properties of the potential are also included.

    make machine -
    Make.py -p ^snap -a machine
    -
    -
    +
    +Make.py -p ^snap -a machine
    +

    Supporting info: pair snap, compute sna/atom, compute snad/atom, compute snav/atom, examples/snap


    @@ -1496,9 +1496,9 @@ colloidal-scale particles.

    make machine -
    Make.py -p ^srd -a machine
    -
    -
    +
    +Make.py -p ^srd -a machine
    +

    Supporting info: fix srd, fix wall/srd, examples/srd, examples/ASPHERE


    @@ -1541,9 +1541,9 @@ src/Make.py -h -voronoi” to see the details.

    make machine -
    Make.py -p ^voronoi -a machine
    -
    -
    +
    +Make.py -p ^voronoi -a machine
    +

    Supporting info: src/VORONOI/README, lib/voronoi/README, compute voronoi/atom, examples/voronoi


    @@ -1860,7 +1860,7 @@ src/Make.py -h -voronoi” to see the details.

  • - + - +
    data_body
    USER-SMD smoothed Mach dynamics Georg Ganzenmuller (EMI)userguide.pdfSMD User Guide USER/smd
    • @@ -1888,7 +1888,7 @@ src/Make.py -h -voronoi” to see the details.

    USER-SPH smoothed particle hydrodynamics Georg Ganzenmuller (EMI)userguide.pdfSPH User Guide USER/sph sph