git-svn-id: svn://svn.icms.temple.edu/lammps-ro/trunk@11150 f3b2605a-c512-4ea7-a41b-209d697bcdaa

This commit is contained in:
sjplimp
2014-01-07 18:06:02 +00:00
parent 4f40cb9dec
commit c4bc0ca8f2
8 changed files with 173 additions and 90 deletions

View File

@ -21,7 +21,7 @@
<LI>N = # of atoms or molecules to insert
<LI>type = atom type to assign to inserted atoms (for atom insertion)
<LI>type = atom type to assign to inserted atoms (offset for moleclue insertion)
<LI>M = insert a single atom or molecule every M steps
@ -35,6 +35,8 @@
region-ID = ID of region to use as insertion volume
<I>mol</I> value = template-ID
template-ID = ID of molecule template specified in a separate <A HREF = "molecule.html">molecule</A> command
<I>rigid</I> value = fix-ID
fix-ID = ID of <A HREF = "fix_rigid.html">fix rigid/small</A> command
<I>id</I> value = <I>max</I> or <I>next</I>
max = atom ID for new atom(s) is max ID of all current atoms plus one
next = atom ID for new atom(s) increments by one for every deposition
@ -78,9 +80,11 @@ this doc page, a single inserted atom or molecule is referred to as a
"particle".
</P>
<P>If inserted particles are individual atoms, they are assigned the
specified atom type. For molecules the specified type is ignored, and
the type of each atom in the inserted molecule is specified in the
file read by the <A HREF = "molecule.html">molecule</A> command.
specified atom type. If they are molecules, the type of each atom in
the inserted molecule is specified in the file read by the
<A HREF = "molecule.html">molecule</A> command, and those values are added to the
specified atom type. E.g. if <I>type</I> = 2, and the file specifies atom
types 1,2,3, then the inserted molecule will have atom types 3,4,5.
</P>
<P>All atoms in the inserted particle are assigned to two groups: the
default group "all" and the group specified in the fix deposit command
@ -121,6 +125,11 @@ molecule file. See the <A HREF = "molecule.html">molecule</A> command for detai
The only settings required to be in this file are the coordinates and
types of atoms in the molecule.
</P>
<P>If you wish to insert molecules via the <I>mol</I> keyword, that will be
treated as rigid bodies, use the <I>rigid</I> keyword, specifying as its
value the ID of a separate <A HREF = "fix_rigid_small.html">fix rigid/small</A>
command which also appears in your input script.
</P>
<P>Each timestep a particle is inserted, the coordinates for its atoms
are chosen as follows. For insertion of individual atoms, the
"position" referred to in the following description is the coordinate

View File

@ -15,7 +15,7 @@ fix ID group-ID deposit N type M seed keyword values ... :pre
ID, group-ID are documented in "fix"_fix.html command :ulb,l
deposit = style name of this fix command :l
N = # of atoms or molecules to insert :l
type = atom type to assign to inserted atoms (for atom insertion) :l
type = atom type to assign to inserted atoms (offset for moleclue insertion) :l
M = insert a single atom or molecule every M steps :l
seed = random # seed (positive integer) :l
one or more keyword/value pairs may be appended to args :l
@ -24,6 +24,8 @@ keyword = {region} or {mol} or {id} or {global} or {local} or {near} or {attempt
region-ID = ID of region to use as insertion volume
{mol} value = template-ID
template-ID = ID of molecule template specified in a separate "molecule"_molecule.html command
{rigid} value = fix-ID
fix-ID = ID of "fix rigid/small"_fix_rigid.html command
{id} value = {max} or {next}
max = atom ID for new atom(s) is max ID of all current atoms plus one
next = atom ID for new atom(s) increments by one for every deposition
@ -66,9 +68,11 @@ this doc page, a single inserted atom or molecule is referred to as a
"particle".
If inserted particles are individual atoms, they are assigned the
specified atom type. For molecules the specified type is ignored, and
the type of each atom in the inserted molecule is specified in the
file read by the "molecule"_molecule.html command.
specified atom type. If they are molecules, the type of each atom in
the inserted molecule is specified in the file read by the
"molecule"_molecule.html command, and those values are added to the
specified atom type. E.g. if {type} = 2, and the file specifies atom
types 1,2,3, then the inserted molecule will have atom types 3,4,5.
All atoms in the inserted particle are assigned to two groups: the
default group "all" and the group specified in the fix deposit command
@ -109,6 +113,11 @@ molecule file. See the "molecule"_molecule.html command for details.
The only settings required to be in this file are the coordinates and
types of atoms in the molecule.
If you wish to insert molecules via the {mol} keyword, that will be
treated as rigid bodies, use the {rigid} keyword, specifying as its
value the ID of a separate "fix rigid/small"_fix_rigid_small.html
command which also appears in your input script.
Each timestep a particle is inserted, the coordinates for its atoms
are chosen as follows. For insertion of individual atoms, the
"position" referred to in the following description is the coordinate

View File

@ -21,20 +21,16 @@
<LI>N = # of atoms to insert
<LI>type = atom type to assign to inserted atoms
<LI>type = atom type to assign to inserted atoms (offset for molecule insertion)
<LI>seed = random # seed (positive integer)
<LI>one or more keyword/value pairs may be appended to args
<LI>keyword = <I>region</I> or <I>mol</I> or <I>rigid</I> or <I>diam</I> or <I>dens</I> or <I>vol</I> or <I>rate</I> or <I>vel</I>
<LI>keyword = <I>region</I> or <I>diam</I> or <I>dens</I> or <I>vol</I> or <I>rate</I> or <I>vel</I> or <I>mol</I> or <I>rigid</I> or <I>shake</I>
<PRE> <I>region</I> value = region-ID
region-ID = ID of region to use as insertion volume
<I>mol</I> value = template-ID
template-ID = ID of molecule template specified in a separate <A HREF = "molecule.html">molecule</A> command
<I>rigid</I> value = fix-ID
fix-ID = ID of <A HREF = "fix_rigid.html">fix rigid/small</A> command
<I>diam</I> values = dstyle args
dstyle = <I>one</I> or <I>range</I> or <I>poly</I>
<I>one</I> args = D
@ -58,6 +54,12 @@
vz = z velocity (3d) assigned to inserted particles (velocity units)
vy = y velocity (2d) assigned to inserted particles (velocity units)
</PRE>
<I>mol</I> value = template-ID
template-ID = ID of molecule template specified in a separate <A HREF = "molecule.html">molecule</A> command
<I>rigid</I> value = fix-ID
fix-ID = ID of <A HREF = "fix_rigid.html">fix rigid/small</A> command
<I>shake</I> value = fix-ID
fix-ID = ID of <A HREF = "fix_shake.html">fix shake</A> command
</UL>
<P><B>Examples:</B>
@ -77,9 +79,11 @@ gravity. For the remainder of this doc page, a single inserted atom
or molecule is referred to as a "particle".
</P>
<P>If inserted particles are individual atoms, they are assigned the
specified atom type. For molecules the specified type is ignored, and
the type of each atom in the inserted molecule is specified in the
file read by the <A HREF = "molecule.html">molecule</A> command.
specified atom type. If they are molecules, the type of each atom in
the inserted molecule is specified in the file read by the
<A HREF = "molecule.html">molecule</A> command, and those values are added to the
specified atom type. E.g. if <I>type</I> = 2, and the file specifies atom
types 1,2,3, then the inserted molecule will have atom types 3,4,5.
</P>
<P>All atoms in the inserted particle are assigned to two groups: the
default group "all" and the group specified in the fix pour command
@ -102,10 +106,14 @@ required to be in this file are the coordinates and types of atoms in
the molecule.
</P>
<P>If you wish to insert molecules via the <I>mol</I> keyword, that will be
treated as rigid bodies, you can first specify a <A HREF = "fix_rigid.html">fix
rigid/small</A> command, and then use the <I>rigid</I> keyword
with this command, specifying the ID of the fix rigid/small command as
its value.
treated as rigid bodies, use the <I>rigid</I> keyword, specifying as its
value the ID of a separate <A HREF = "fix_rigid_small.html">fix rigid/small</A>
command which also appears in your input script.
</P>
<P>If you wish to insert molecules via the <I>mol</I> keyword, that will have
their bonds or angles constrained via SHAKE, use the <I>shake</I> keyword,
specifying as its value the ID of a separate <A HREF = "fix_shake.html">fix
shake</A> command which also appears in your input script.
</P>
<P>Each timestep particles are inserted, they are placed randomly inside
the insertion volume so as to mimic a stream of poured particles. If

View File

@ -15,16 +15,12 @@ fix ID group-ID pour N type seed keyword values ... :pre
ID, group-ID are documented in "fix"_fix.html command :ulb,l
pour = style name of this fix command :l
N = # of atoms to insert :l
type = atom type to assign to inserted atoms :l
type = atom type to assign to inserted atoms (offset for molecule insertion) :l
seed = random # seed (positive integer) :l
one or more keyword/value pairs may be appended to args :l
keyword = {region} or {mol} or {rigid} or {diam} or {dens} or {vol} or {rate} or {vel} :l
keyword = {region} or {diam} or {dens} or {vol} or {rate} or {vel} or {mol} or {rigid} or {shake} :l
{region} value = region-ID
region-ID = ID of region to use as insertion volume
{mol} value = template-ID
template-ID = ID of molecule template specified in a separate "molecule"_molecule.html command
{rigid} value = fix-ID
fix-ID = ID of "fix rigid/small"_fix_rigid.html command
{diam} values = dstyle args
dstyle = {one} or {range} or {poly}
{one} args = D
@ -47,6 +43,12 @@ keyword = {region} or {mol} or {rigid} or {diam} or {dens} or {vol} or {rate} or
vylo,vyhi = range of y velocities for inserted particles (velocity units)
vz = z velocity (3d) assigned to inserted particles (velocity units)
vy = y velocity (2d) assigned to inserted particles (velocity units) :pre
{mol} value = template-ID
template-ID = ID of molecule template specified in a separate "molecule"_molecule.html command
{rigid} value = fix-ID
fix-ID = ID of "fix rigid/small"_fix_rigid.html command
{shake} value = fix-ID
fix-ID = ID of "fix shake"_fix_shake.html command
:ule
[Examples:]
@ -66,9 +68,11 @@ gravity. For the remainder of this doc page, a single inserted atom
or molecule is referred to as a "particle".
If inserted particles are individual atoms, they are assigned the
specified atom type. For molecules the specified type is ignored, and
the type of each atom in the inserted molecule is specified in the
file read by the "molecule"_molecule.html command.
specified atom type. If they are molecules, the type of each atom in
the inserted molecule is specified in the file read by the
"molecule"_molecule.html command, and those values are added to the
specified atom type. E.g. if {type} = 2, and the file specifies atom
types 1,2,3, then the inserted molecule will have atom types 3,4,5.
All atoms in the inserted particle are assigned to two groups: the
default group "all" and the group specified in the fix pour command
@ -91,10 +95,14 @@ required to be in this file are the coordinates and types of atoms in
the molecule.
If you wish to insert molecules via the {mol} keyword, that will be
treated as rigid bodies, you can first specify a "fix
rigid/small"_fix_rigid.html command, and then use the {rigid} keyword
with this command, specifying the ID of the fix rigid/small command as
its value.
treated as rigid bodies, use the {rigid} keyword, specifying as its
value the ID of a separate "fix rigid/small"_fix_rigid_small.html
command which also appears in your input script.
If you wish to insert molecules via the {mol} keyword, that will have
their bonds or angles constrained via SHAKE, use the {shake} keyword,
specifying as its value the ID of a separate "fix
shake"_fix_shake.html command which also appears in your input script.
Each timestep particles are inserted, they are placed randomly inside
the insertion volume so as to mimic a stream of poured particles. If

View File

@ -153,7 +153,7 @@ the distance.
to predict. The best way to decide is to perform a short test run.
Both variants should give identical numerical answers for short runs.
Long runs should give statistically similar results, but round-off
differences will accumulate to produce divergent trajectories.
differences may accumulate to produce divergent trajectories.
</P>
<P>IMPORTANT NOTE: You should not update the atoms in rigid bodies via
other time-integration fixes (e.g. <A HREF = "fix_nve.html">fix nve</A>, <A HREF = "fix_nvt.html">fix
@ -248,10 +248,14 @@ means all types from m to n (inclusive). Note that you can use the
particular rigid body has its component flags set multiple times, the
settings from the final keyword are used.
</P>
<P>For computational efficiency, you may wish to turn off pairwise and
bond interactions within each rigid body, as they no longer contribute
to the motion. The <A HREF = "neigh_modify.html">neigh_modify exclude</A> and
<A HREF = "delete_bonds.html">delete_bonds</A> commands are used to do this.
<P>IMPORTANT NOTE: For computational efficiency, you may wish to turn off
pairwise and bond interactions within each rigid body, as they no
longer contribute to the motion. The <A HREF = "neigh_modify.html">neigh_modify
exclude</A> and <A HREF = "delete_bonds.html">delete_bonds</A>
commands are used to do this. If the rigid bodies have strongly
overalapping atoms, you may need to turn off these interactions to
avoid numerical problems due to large equal/opposite intra-body forces
swamping the contribution of small inter-body forces.
</P>
<P>For computational efficiency, you should typically define one fix
rigid or fix rigid/small command which includes all the desired rigid
@ -448,17 +452,17 @@ associated with the fix rigid commands.
</P>
<HR>
<P>The <I>mol</I> keyword can only be used with fix rigid/small. It should
be used when other commands, such as <A HREF = "fix_deposit.html">fix deposit</A> or
<A HREF = "fix_pour.html">fix pour</A>, which will add rigid bodies on-the-fly
during a simulation. You specify a <I>template-ID</I> previously defined
using the <A HREF = "molecule.html">molecule</A> command, which reads a file that
defines the molecule. You must use the same <I>template-ID</I> that the
command adding rigid bodies uses. The coordinates, atom types, atom
diameters, center-of-mass, and moments of inertia can be specified in
the molecule file. See the <A HREF = "molecule.html">molecule</A> command for
details. The only settings required to be in this file are the
coordinates and types of atoms in the molecule.
<P>The <I>mol</I> keyword can only be used with fix rigid/small. It should be
used when other commands, such as <A HREF = "fix_deposit.html">fix deposit</A> or
<A HREF = "fix_pour.html">fix pour</A>, add rigid bodies on-the-fly during a
simulation. You specify a <I>template-ID</I> previously defined using the
<A HREF = "molecule.html">molecule</A> command, which reads a file that defines the
molecule. You must use the same <I>template-ID</I> that the command adding
rigid bodies uses. The coordinates, atom types, atom diameters,
center-of-mass, and moments of inertia can be specified in the
molecule file. See the <A HREF = "molecule.html">molecule</A> command for details.
The only settings required to be in this file are the coordinates and
types of atoms in the molecule.
</P>
<HR>

View File

@ -139,7 +139,7 @@ Which of the two variants is faster for a particular problem is hard
to predict. The best way to decide is to perform a short test run.
Both variants should give identical numerical answers for short runs.
Long runs should give statistically similar results, but round-off
differences will accumulate to produce divergent trajectories.
differences may accumulate to produce divergent trajectories.
IMPORTANT NOTE: You should not update the atoms in rigid bodies via
other time-integration fixes (e.g. "fix nve"_fix_nve.html, "fix
@ -234,10 +234,14 @@ means all types from m to n (inclusive). Note that you can use the
particular rigid body has its component flags set multiple times, the
settings from the final keyword are used.
For computational efficiency, you may wish to turn off pairwise and
bond interactions within each rigid body, as they no longer contribute
to the motion. The "neigh_modify exclude"_neigh_modify.html and
"delete_bonds"_delete_bonds.html commands are used to do this.
IMPORTANT NOTE: For computational efficiency, you may wish to turn off
pairwise and bond interactions within each rigid body, as they no
longer contribute to the motion. The "neigh_modify
exclude"_neigh_modify.html and "delete_bonds"_delete_bonds.html
commands are used to do this. If the rigid bodies have strongly
overalapping atoms, you may need to turn off these interactions to
avoid numerical problems due to large equal/opposite intra-body forces
swamping the contribution of small inter-body forces.
For computational efficiency, you should typically define one fix
rigid or fix rigid/small command which includes all the desired rigid
@ -434,17 +438,17 @@ associated with the fix rigid commands.
:line
The {mol} keyword can only be used with fix rigid/small. It should
be used when other commands, such as "fix deposit"_fix_deposit.html or
"fix pour"_fix_pour.html, which will add rigid bodies on-the-fly
during a simulation. You specify a {template-ID} previously defined
using the "molecule"_molecule.html command, which reads a file that
defines the molecule. You must use the same {template-ID} that the
command adding rigid bodies uses. The coordinates, atom types, atom
diameters, center-of-mass, and moments of inertia can be specified in
the molecule file. See the "molecule"_molecule.html command for
details. The only settings required to be in this file are the
coordinates and types of atoms in the molecule.
The {mol} keyword can only be used with fix rigid/small. It should be
used when other commands, such as "fix deposit"_fix_deposit.html or
"fix pour"_fix_pour.html, add rigid bodies on-the-fly during a
simulation. You specify a {template-ID} previously defined using the
"molecule"_molecule.html command, which reads a file that defines the
molecule. You must use the same {template-ID} that the command adding
rigid bodies uses. The coordinates, atom types, atom diameters,
center-of-mass, and moments of inertia can be specified in the
molecule file. See the "molecule"_molecule.html command for details.
The only settings required to be in this file are the coordinates and
types of atoms in the molecule.
:line

View File

@ -15,7 +15,7 @@
</H3>
<P><B>Syntax:</B>
</P>
<PRE>fix ID group-ID shake tol iter N keyword values ...
<PRE>fix ID group-ID shake tol iter N constraint values ... keyword value ...
</PRE>
<UL><LI>ID, group-ID are documented in <A HREF = "fix.html">fix</A> command
@ -27,21 +27,29 @@
<LI>N = print SHAKE statistics every this many timesteps (0 = never)
<LI>one or more keyword/value pairs are appended
<LI>one or more constraint/value pairs are appended
<LI>keyword = <I>b</I> or <I>a</I> or <I>t</I> or <I>m</I>
<LI>constraint = <I>b</I> or <I>a</I> or <I>t</I> or <I>m</I>
<PRE> <I>b</I> values = one or more bond types
<I>a</I> values = one or more angle types
<I>t</I> values = one or more atom types
<I>m</I> value = one or more mass values
</PRE>
<LI>zero or more keyword/value pairs may be appended
<LI>keyword = <I>mol</I>
<PRE> <I>mol</I> value = template-ID
template-ID = ID of molecule template specified in a separate <A HREF = "molecule.html">molecule</A> command
</PRE>
</UL>
<P><B>Examples:</B>
</P>
<PRE>fix 1 sub shake 0.0001 20 10 b 4 19 a 3 5 2
fix 1 sub shake 0.0001 20 10 t 5 6 m 1.0 a 31
fix 1 sub shake 0.0001 20 10 t 5 6 m 1.0 a 31
fix 1 sub shake 0.0001 20 10 t 5 6 m 1.0 a 31 mol myMol
</PRE>
<P><B>Description:</B>
</P>
@ -71,17 +79,17 @@ also constrained. This means water molecules or CH2 or CH3 groups may
be constrained, but not all the C-C backbone bonds of a long polymer
chain.
</P>
<P>The <I>b</I> keyword lists bond types that will be constrained. The <I>t</I>
keyword lists atom types. All bonds connected to an atom of the
specified type will be constrained. The <I>m</I> keyword lists atom
<P>The <I>b</I> constraint lists bond types that will be constrained. The <I>t</I>
constraint lists atom types. All bonds connected to an atom of the
specified type will be constrained. The <I>m</I> constraint lists atom
masses. All bonds connected to atoms of the specified masses will be
constrained (within a fudge factor of MASSDELTA specified in
fix_shake.cpp). The <I>a</I> keyword lists angle types. If both bonds in
the angle are constrained then the angle will also be constrained if
its type is in the list.
fix_shake.cpp). The <I>a</I> constraint lists angle types. If both bonds
in the angle are constrained then the angle will also be constrained
if its type is in the list.
</P>
<P>For all keywords, a particular bond is only constrained if both atoms
in the bond are in the group specified with the SHAKE fix.
<P>For all constraints, a particular bond is only constrained if both
atoms in the bond are in the group specified with the SHAKE fix.
</P>
<P>The degrees-of-freedom removed by SHAKE bonds and angles are accounted
for in temperature and pressure computations. Similarly, the SHAKE
@ -101,6 +109,20 @@ which add or change forces (to atoms that fix shake operates on).
</P>
<HR>
<P>The <I>mol</I> keyword should be used when other commands, such as <A HREF = "fix_deposit.html">fix
deposit</A> or <A HREF = "fix_pour.html">fix pour</A>, add molecules
on-the-fly during a simulation, and you wish to contrain the new
molecules via SHAKE. You specify a <I>template-ID</I> previously defined
using the <A HREF = "molecule.html">molecule</A> command, which reads a file that
defines the molecule. You must use the same <I>template-ID</I> that the
command adding molecules uses. The coordinates, atom types, special
bond restrictions, and SHAKE info can be specified in the molecule
file. See the <A HREF = "molecule.html">molecule</A> command for details. The only
settings required to be in this file (by this command) are the SHAKE
info of atoms in the molecule.
</P>
<HR>
<P>Styles with a <I>cuda</I> suffix are functionally the same as the
corresponding style without the suffix. They have been optimized to
run faster, depending on your available hardware, as discussed in

View File

@ -11,25 +11,30 @@ fix shake/cuda command :h3
[Syntax:]
fix ID group-ID shake tol iter N keyword values ... :pre
fix ID group-ID shake tol iter N constraint values ... keyword value ... :pre
ID, group-ID are documented in "fix"_fix.html command :ulb,l
shake = style name of this fix command :l
tol = accuracy tolerance of SHAKE solution :l
iter = max # of iterations in each SHAKE solution :l
N = print SHAKE statistics every this many timesteps (0 = never) :l
one or more keyword/value pairs are appended :l
keyword = {b} or {a} or {t} or {m} :l
one or more constraint/value pairs are appended :l
constraint = {b} or {a} or {t} or {m} :l
{b} values = one or more bond types
{a} values = one or more angle types
{t} values = one or more atom types
{m} value = one or more mass values :pre
zero or more keyword/value pairs may be appended :l
keyword = {mol} :l
{mol} value = template-ID
template-ID = ID of molecule template specified in a separate "molecule"_molecule.html command :pre
:ule
[Examples:]
fix 1 sub shake 0.0001 20 10 b 4 19 a 3 5 2
fix 1 sub shake 0.0001 20 10 t 5 6 m 1.0 a 31 :pre
fix 1 sub shake 0.0001 20 10 t 5 6 m 1.0 a 31
fix 1 sub shake 0.0001 20 10 t 5 6 m 1.0 a 31 mol myMol :pre
[Description:]
@ -59,17 +64,17 @@ also constrained. This means water molecules or CH2 or CH3 groups may
be constrained, but not all the C-C backbone bonds of a long polymer
chain.
The {b} keyword lists bond types that will be constrained. The {t}
keyword lists atom types. All bonds connected to an atom of the
specified type will be constrained. The {m} keyword lists atom
The {b} constraint lists bond types that will be constrained. The {t}
constraint lists atom types. All bonds connected to an atom of the
specified type will be constrained. The {m} constraint lists atom
masses. All bonds connected to atoms of the specified masses will be
constrained (within a fudge factor of MASSDELTA specified in
fix_shake.cpp). The {a} keyword lists angle types. If both bonds in
the angle are constrained then the angle will also be constrained if
its type is in the list.
fix_shake.cpp). The {a} constraint lists angle types. If both bonds
in the angle are constrained then the angle will also be constrained
if its type is in the list.
For all keywords, a particular bond is only constrained if both atoms
in the bond are in the group specified with the SHAKE fix.
For all constraints, a particular bond is only constrained if both
atoms in the bond are in the group specified with the SHAKE fix.
The degrees-of-freedom removed by SHAKE bonds and angles are accounted
for in temperature and pressure computations. Similarly, the SHAKE
@ -89,6 +94,20 @@ which add or change forces (to atoms that fix shake operates on).
:line
The {mol} keyword should be used when other commands, such as "fix
deposit"_fix_deposit.html or "fix pour"_fix_pour.html, add molecules
on-the-fly during a simulation, and you wish to contrain the new
molecules via SHAKE. You specify a {template-ID} previously defined
using the "molecule"_molecule.html command, which reads a file that
defines the molecule. You must use the same {template-ID} that the
command adding molecules uses. The coordinates, atom types, special
bond restrictions, and SHAKE info can be specified in the molecule
file. See the "molecule"_molecule.html command for details. The only
settings required to be in this file (by this command) are the SHAKE
info of atoms in the molecule.
:line
Styles with a {cuda} suffix are functionally the same as the
corresponding style without the suffix. They have been optimized to
run faster, depending on your available hardware, as discussed in