diff --git a/doc/fix_external.html b/doc/fix_external.html
index d08bffc4e6..4fcadc1275 100644
--- a/doc/fix_external.html
+++ b/doc/fix_external.html
@@ -13,25 +13,49 @@
Syntax:
-fix ID group-ID external
+fix ID group-ID external mode args
-
- ID, group-ID are documented in fix command
+
Examples:
-fix 1 all external
+fix 1 all external pf/callback 1 1
+fix 1 all external pf/callback 100 1
+fix 1 all external pf/array 10
Description:
-This fix makes a callback each timestep or minimization iteration to
-an external driver program that is using LAMMPS as a library. This is
-a way to let another program compute forces on atoms which LAMMPS will
-include in its dynamics performed by the run command or its
-iterations performed by the minimize command
+
This fix allows external programs that are running LAMMPS through its
+library interface to modify certain
+LAMMPS properties on specific timesteps, similar to the way other
+fixes do. The external driver can be a C/C++ or Fortran
+program or a Python
+script.
-The callback function "foo" will be invoked every timestep or
-iteration as:
+
+
+If mode is pf/callback then the fix will make a callback every
+Ncall timesteps or minimization iteration to the external program.
+The external program computes forces on atoms by setting values in an
+array owned by the fix. The fix then adds these forces to each atom
+in the group, once every Napply steps, similar to the way the fix
+addforce command works. Note that if Ncall >
+Napply, the force values produced by one callback will persist, and
+be used multiple times to update atom forces.
+
+The callback function "foo" will be invoked by the fix as:
foo(ptr,timestep,nlocal,ids,x,fexternal);
@@ -46,19 +70,31 @@ iteration as:
- nlocal = # of atoms on this processor
- ids = list of atom IDs on this processor
- x = coordinates of atoms on this processor
-
- fexternal = forces on atoms on this processor
+
- fexternal = forces to add to atoms on this processor
-Fexternal are the forces returned by the driver program,
-which LAMMPS adds to the current force on each atom.
+
Fexternal are the forces returned by the driver program.
-See the couple/lammps_quest/lmpqst.cpp file in the LAMMPS distribution
-for an example of a coupling application that uses this fix, and how
-it makes a call to the fix to specify what function the fix should
-callback to. The sample application performs classical MD using
-quantum forces computed by a density functional code Quest.
+
The fix has a set_callback() method which the external driver can call
+to pass a pointer to its foo() function. See the
+couple/lammps_quest/lmpqst.cpp file in the LAMMPS distribution for an
+example of how this is done. This sample application performs
+classical MD using quantum forces computed by a density functional
+code Quest.
+
+
+If mode is pf/array then the fix simply stores force values in an
+array. The fix adds these forces to each atom in the group, once
+every Napply steps, similar to the way the fix
+addforce command works. It is up to the external
+program to set the values in this array to the desired quantities, as
+often as desired. For example, the driver program might perform an MD
+run in stages of 1000 timesteps each. In between calls to the LAMMPS
+run command, it could retrieve atom coordinates from
+LAMMPS, compute forces, set values in the fix external array, etc.
+
Restart, fix_modify, output, run start/stop, minimize info:
No information about this fix is written to binary restart
diff --git a/doc/fix_external.txt b/doc/fix_external.txt
index f8e12ded3a..4b7a2a5ea3 100644
--- a/doc/fix_external.txt
+++ b/doc/fix_external.txt
@@ -10,25 +10,45 @@ fix external command :h3
[Syntax:]
-fix ID group-ID external :pre
+fix ID group-ID external mode args :pre
-ID, group-ID are documented in "fix"_fix.html command
-external = style name of this fix command :ul
+ID, group-ID are documented in "fix"_fix.html command :ulb,l
+external = style name of this fix command :l
+mode = {pf/callback} or {pf/array} :l
+ {pf/callback} args = Ncall Napply
+ Ncall = make callback every Ncall steps
+ Napply = apply callback forces every Napply steps
+ {pf/array} args = Napply
+ Napply = apply array forces every Napply steps :pre
+:ule
[Examples:]
-fix 1 all external :pre
+fix 1 all external pf/callback 1 1
+fix 1 all external pf/callback 100 1
+fix 1 all external pf/array 10 :pre
[Description:]
-This fix makes a callback each timestep or minimization iteration to
-an external driver program that is using LAMMPS as a library. This is
-a way to let another program compute forces on atoms which LAMMPS will
-include in its dynamics performed by the "run"_run.html command or its
-iterations performed by the "minimize"_minimize.html command
+This fix allows external programs that are running LAMMPS through its
+"library interface"_Section_howto.html#howto_19 to modify certain
+LAMMPS properties on specific timesteps, similar to the way other
+fixes do. The external driver can be a "C/C++ or Fortran
+program"_Section_howto.html#howto_19 or a "Python
+script"_Section_python.html.
-The callback function "foo" will be invoked every timestep or
-iteration as:
+:line
+
+If mode is {pf/callback} then the fix will make a callback every
+{Ncall} timesteps or minimization iteration to the external program.
+The external program computes forces on atoms by setting values in an
+array owned by the fix. The fix then adds these forces to each atom
+in the group, once every {Napply} steps, similar to the way the "fix
+addforce"_fix_addforce.html command works. Note that if {Ncall} >
+{Napply}, the force values produced by one callback will persist, and
+be used multiple times to update atom forces.
+
+The callback function "foo" will be invoked by the fix as:
foo(ptr,timestep,nlocal,ids,x,fexternal); :pre
@@ -43,19 +63,31 @@ timestep = current LAMMPS timestep
nlocal = # of atoms on this processor
ids = list of atom IDs on this processor
x = coordinates of atoms on this processor
-fexternal = forces on atoms on this processor :ul
+fexternal = forces to add to atoms on this processor :ul
-Fexternal are the forces returned by the driver program,
-which LAMMPS adds to the current force on each atom.
+Fexternal are the forces returned by the driver program.
-See the couple/lammps_quest/lmpqst.cpp file in the LAMMPS distribution
-for an example of a coupling application that uses this fix, and how
-it makes a call to the fix to specify what function the fix should
-callback to. The sample application performs classical MD using
-quantum forces computed by a density functional code "Quest"_quest.
+The fix has a set_callback() method which the external driver can call
+to pass a pointer to its foo() function. See the
+couple/lammps_quest/lmpqst.cpp file in the LAMMPS distribution for an
+example of how this is done. This sample application performs
+classical MD using quantum forces computed by a density functional
+code "Quest"_quest.
:link(quest,http://dft.sandia.gov/Quest)
+:line
+
+If mode is {pf/array} then the fix simply stores force values in an
+array. The fix adds these forces to each atom in the group, once
+every {Napply} steps, similar to the way the "fix
+addforce"_fix_addforce.html command works. It is up to the external
+program to set the values in this array to the desired quantities, as
+often as desired. For example, the driver program might perform an MD
+run in stages of 1000 timesteps each. In between calls to the LAMMPS
+"run"_run.html command, it could retrieve atom coordinates from
+LAMMPS, compute forces, set values in the fix external array, etc.
+
[Restart, fix_modify, output, run start/stop, minimize info:]
No information about this fix is written to "binary restart