add atom_modify map yes, also timers to create_atoms and replicate
This commit is contained in:
@ -727,7 +727,7 @@ make lib-latte # print help message
|
|||||||
make lib-latte args="-b" # download and build in lib/latte/LATTE-master
|
make lib-latte args="-b" # download and build in lib/latte/LATTE-master
|
||||||
make lib-latte args="-p $HOME/latte" # use existing LATTE installation in $HOME/latte
|
make lib-latte args="-p $HOME/latte" # use existing LATTE installation in $HOME/latte
|
||||||
make lib-latte args="-b -m gfortran" # download and build in lib/latte and
|
make lib-latte args="-b -m gfortran" # download and build in lib/latte and
|
||||||
# copy Makefile.lammps.gfortran to Makefile.lammps
|
# copy Makefile.lammps.gfortran to Makefile.lammps :pre
|
||||||
|
|
||||||
Note that 3 symbolic (soft) links, "includelink" and "liblink" and
|
Note that 3 symbolic (soft) links, "includelink" and "liblink" and
|
||||||
"filelink", are created in lib/latte to point into the LATTE home dir.
|
"filelink", are created in lib/latte to point into the LATTE home dir.
|
||||||
|
|||||||
@ -16,7 +16,7 @@ atom_modify keyword values ... :pre
|
|||||||
one or more keyword/value pairs may be appended :ulb,l
|
one or more keyword/value pairs may be appended :ulb,l
|
||||||
keyword = {id} or {map} or {first} or {sort} :l
|
keyword = {id} or {map} or {first} or {sort} :l
|
||||||
{id} value = {yes} or {no}
|
{id} value = {yes} or {no}
|
||||||
{map} value = {array} or {hash}
|
{map} value = {yes} or {array} or {hash}
|
||||||
{first} value = group-ID = group whose atoms will appear first in internal atom lists
|
{first} value = group-ID = group whose atoms will appear first in internal atom lists
|
||||||
{sort} values = Nfreq binsize
|
{sort} values = Nfreq binsize
|
||||||
Nfreq = sort atoms spatially every this many time steps
|
Nfreq = sort atoms spatially every this many time steps
|
||||||
@ -25,8 +25,8 @@ keyword = {id} or {map} or {first} or {sort} :l
|
|||||||
|
|
||||||
[Examples:]
|
[Examples:]
|
||||||
|
|
||||||
atom_modify map hash
|
atom_modify map yes
|
||||||
atom_modify map array sort 10000 2.0
|
atom_modify map hash sort 10000 2.0
|
||||||
atom_modify first colloid :pre
|
atom_modify first colloid :pre
|
||||||
|
|
||||||
[Description:]
|
[Description:]
|
||||||
@ -62,29 +62,33 @@ switch. This is described in "Section 2.2"_Section_start.html#start_2
|
|||||||
of the manual. If atom IDs are not used, they must be specified as 0
|
of the manual. If atom IDs are not used, they must be specified as 0
|
||||||
for all atoms, e.g. in a data or restart file.
|
for all atoms, e.g. in a data or restart file.
|
||||||
|
|
||||||
The {map} keyword determines how atom ID lookup is done for molecular
|
The {map} keyword determines how atoms with specific IDs are found
|
||||||
atom styles. Lookups are performed by bond (angle, etc) routines in
|
when required. An example are the bond (angle, etc) methods which
|
||||||
LAMMPS to find the local atom index associated with a global atom ID.
|
need to find the local index of an atom with a specific global ID
|
||||||
|
which is a bond (angle, etc) partner. LAMMPS performs this operation
|
||||||
|
efficiently by creating a "map", which is either an {array} or {hash}
|
||||||
|
table, as descibed below.
|
||||||
|
|
||||||
When the {array} value is used, each processor stores a lookup table
|
When the {map} keyword is not specified in your input script, LAMMPS
|
||||||
of length N, where N is the largest atom ID in the system. This is a
|
only creates a map for "atom_styles"_atom_style.html for molecular
|
||||||
|
systems which have permanent bonds (angles, etc). No map is created
|
||||||
|
for atomic systems, since it is normally not needed. However some
|
||||||
|
LAMMPS commands require a map, even for atomic systems, and will
|
||||||
|
generate an error if one does not exist. The {map} keyword thus
|
||||||
|
allows you to force the creation of a map. The {yes} value will
|
||||||
|
create either an {array} or {hash} style map, as explained in the next
|
||||||
|
paragraph. The {array} and {hash} values create an atom-style or
|
||||||
|
hash-style map respectively.
|
||||||
|
|
||||||
|
For an {array}-style map, each processor stores a lookup table of
|
||||||
|
length N, where N is the largest atom ID in the system. This is a
|
||||||
fast, simple method for many simulations, but requires too much memory
|
fast, simple method for many simulations, but requires too much memory
|
||||||
for large simulations. The {hash} value uses a hash table to perform
|
for large simulations. For a {hash}-style map, a hash table is
|
||||||
the lookups. This can be slightly slower than the {array} method, but
|
created on each processor, which finds an atom ID in constant time
|
||||||
its memory cost is proportional to the number of atoms owned by a
|
(independent of the global number of atom IDs). It can be slightly
|
||||||
processor, i.e. N/P when N is the total number of atoms in the system
|
slower than the {array} map, but its memory cost is proportional to
|
||||||
and P is the number of processors.
|
the number of atoms owned by a processor, i.e. N/P when N is the total
|
||||||
|
number of atoms in the system and P is the number of processors.
|
||||||
When this setting is not specified in your input script, LAMMPS
|
|
||||||
creates a map, if one is needed, as an array or hash. See the
|
|
||||||
discussion of default values below for how LAMMPS chooses which kind
|
|
||||||
of map to build. Note that atomic systems do not normally need to
|
|
||||||
create a map. However, even in this case some LAMMPS commands will
|
|
||||||
create a map to find atoms (and then destroy it), or require a
|
|
||||||
permanent map. An example of the former is the "velocity loop
|
|
||||||
all"_velocity.html command, which uses a map when looping over all
|
|
||||||
atoms and insuring the same velocity values are assigned to an atom
|
|
||||||
ID, no matter which processor owns it.
|
|
||||||
|
|
||||||
The {first} keyword allows a "group"_group.html to be specified whose
|
The {first} keyword allows a "group"_group.html to be specified whose
|
||||||
atoms will be maintained as the first atoms in each processor's list
|
atoms will be maintained as the first atoms in each processor's list
|
||||||
|
|||||||
@ -393,32 +393,36 @@ thermostatting and barostatting.
|
|||||||
:line
|
:line
|
||||||
|
|
||||||
These fixes compute a temperature and pressure each timestep. To do
|
These fixes compute a temperature and pressure each timestep. To do
|
||||||
this, the fix creates its own computes of style "temp" and "pressure",
|
this, the thermostat and barostat fixes create their own computes of
|
||||||
as if one of these two sets of commands had been issued:
|
style "temp" and "pressure", as if one of these sets of commands had
|
||||||
|
been issued:
|
||||||
|
|
||||||
|
For fix nvt:
|
||||||
compute fix-ID_temp group-ID temp
|
compute fix-ID_temp group-ID temp
|
||||||
compute fix-ID_press group-ID pressure fix-ID_temp :pre
|
|
||||||
|
|
||||||
|
For fix npt and fix nph:
|
||||||
compute fix-ID_temp all temp
|
compute fix-ID_temp all temp
|
||||||
compute fix-ID_press all pressure fix-ID_temp :pre
|
compute fix-ID_press all pressure fix-ID_temp :pre
|
||||||
|
|
||||||
See the "compute temp"_compute_temp.html and "compute
|
For fix nvt, the group for the new temperature compute is the same as
|
||||||
pressure"_compute_pressure.html commands for details. Note that the
|
the fix group. For fix npt and fix nph, the group for both the new
|
||||||
IDs of the new computes are the fix-ID + underscore + "temp" or fix_ID
|
temperature and pressure compute is "all" since pressure is computed
|
||||||
+ underscore + "press". For fix nvt, the group for the new computes
|
for the entire system. In the case of fix nph, the temperature
|
||||||
is the same as the fix group. For fix nph and fix npt, the group for
|
compute is not used for thermostatting, but just for a kinetic-energy
|
||||||
the new computes is "all" since pressure is computed for the entire
|
contribution to the pressure. See the "compute
|
||||||
system.
|
temp"_compute_temp.html and "compute pressure"_compute_pressure.html
|
||||||
|
commands for details. Note that the IDs of the new computes are the
|
||||||
|
fix-ID + underscore + "temp" or fix_ID + underscore + "press".
|
||||||
|
|
||||||
Note that these are NOT the computes used by thermodynamic output (see
|
Note that these are NOT the computes used by thermodynamic output (see
|
||||||
the "thermo_style"_thermo_style.html command) with ID = {thermo_temp}
|
the "thermo_style"_thermo_style.html command) with ID = {thermo_temp}
|
||||||
and {thermo_press}. This means you can change the attributes of this
|
and {thermo_press}. This means you can change the attributes of these
|
||||||
fix's temperature or pressure via the
|
fix's temperature or pressure via the
|
||||||
"compute_modify"_compute_modify.html command or print this temperature
|
"compute_modify"_compute_modify.html command. Or you can print this
|
||||||
or pressure during thermodynamic output via the "thermo_style
|
temperature or pressure during thermodynamic output via the
|
||||||
custom"_thermo_style.html command using the appropriate compute-ID.
|
"thermo_style custom"_thermo_style.html command using the appropriate
|
||||||
It also means that changing attributes of {thermo_temp} or
|
compute-ID. It also means that changing attributes of {thermo_temp}
|
||||||
{thermo_press} will have no effect on this fix.
|
or {thermo_press} will have no effect on this fix.
|
||||||
|
|
||||||
Like other fixes that perform thermostatting, fix nvt and fix npt can
|
Like other fixes that perform thermostatting, fix nvt and fix npt can
|
||||||
be used with "compute commands"_compute.html that calculate a
|
be used with "compute commands"_compute.html that calculate a
|
||||||
|
|||||||
@ -453,12 +453,12 @@ void Atom::create_avec(const char *style, int narg, char **arg, int trysuffix)
|
|||||||
// if molecular system:
|
// if molecular system:
|
||||||
// atom IDs must be defined
|
// atom IDs must be defined
|
||||||
// force atom map to be created
|
// force atom map to be created
|
||||||
// map style may be reset by map_init() and its call to map_style_set()
|
// map style will be reset to array vs hash to by map_init()
|
||||||
|
|
||||||
molecular = avec->molecular;
|
molecular = avec->molecular;
|
||||||
if (molecular && tag_enable == 0)
|
if (molecular && tag_enable == 0)
|
||||||
error->all(FLERR,"Atom IDs must be used for molecular systems");
|
error->all(FLERR,"Atom IDs must be used for molecular systems");
|
||||||
if (molecular) map_style = 1;
|
if (molecular) map_style = 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ----------------------------------------------------------------------
|
/* ----------------------------------------------------------------------
|
||||||
@ -593,6 +593,7 @@ void Atom::modify_params(int narg, char **arg)
|
|||||||
"Atom_modify map command after simulation box is defined");
|
"Atom_modify map command after simulation box is defined");
|
||||||
if (strcmp(arg[iarg+1],"array") == 0) map_user = 1;
|
if (strcmp(arg[iarg+1],"array") == 0) map_user = 1;
|
||||||
else if (strcmp(arg[iarg+1],"hash") == 0) map_user = 2;
|
else if (strcmp(arg[iarg+1],"hash") == 0) map_user = 2;
|
||||||
|
else if (strcmp(arg[iarg+1],"yes") == 0) map_user = 3;
|
||||||
else error->all(FLERR,"Illegal atom_modify command");
|
else error->all(FLERR,"Illegal atom_modify command");
|
||||||
map_style = map_user;
|
map_style = map_user;
|
||||||
iarg += 2;
|
iarg += 2;
|
||||||
|
|||||||
@ -298,12 +298,12 @@ int Atom::map_style_set()
|
|||||||
MPI_Allreduce(&max,&map_tag_max,1,MPI_LMP_TAGINT,MPI_MAX,world);
|
MPI_Allreduce(&max,&map_tag_max,1,MPI_LMP_TAGINT,MPI_MAX,world);
|
||||||
|
|
||||||
// set map_style for new map
|
// set map_style for new map
|
||||||
// if user-selected, use that setting
|
// if user-selected to array/hash, use that setting
|
||||||
// else if map_tag_max > 1M, use hash
|
// else if map_tag_max > 1M, use hash
|
||||||
// else use array
|
// else use array
|
||||||
|
|
||||||
int map_style_old = map_style;
|
int map_style_old = map_style;
|
||||||
if (map_user) map_style = map_user;
|
if (map_user == 1 || map_user == 2) map_style = map_user;
|
||||||
else if (map_tag_max > 1000000) map_style = 2;
|
else if (map_tag_max > 1000000) map_style = 2;
|
||||||
else map_style = 1;
|
else map_style = 1;
|
||||||
|
|
||||||
|
|||||||
@ -343,6 +343,11 @@ void CreateAtoms::command(int narg, char **arg)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// CPU time
|
||||||
|
|
||||||
|
MPI_Barrier(world);
|
||||||
|
double time1 = MPI_Wtime();
|
||||||
|
|
||||||
// clear ghost count and any ghost bonus data internal to AtomVec
|
// clear ghost count and any ghost bonus data internal to AtomVec
|
||||||
// same logic as beginning of Comm::exchange()
|
// same logic as beginning of Comm::exchange()
|
||||||
// do it now b/c creating atoms will overwrite ghost atoms
|
// do it now b/c creating atoms will overwrite ghost atoms
|
||||||
@ -509,6 +514,9 @@ void CreateAtoms::command(int narg, char **arg)
|
|||||||
if (domain->triclinic) domain->lamda2x(atom->nlocal);
|
if (domain->triclinic) domain->lamda2x(atom->nlocal);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MPI_Barrier(world);
|
||||||
|
double time2 = MPI_Wtime();
|
||||||
|
|
||||||
// clean up
|
// clean up
|
||||||
|
|
||||||
delete ranmol;
|
delete ranmol;
|
||||||
@ -521,12 +529,16 @@ void CreateAtoms::command(int narg, char **arg)
|
|||||||
// print status
|
// print status
|
||||||
|
|
||||||
if (comm->me == 0) {
|
if (comm->me == 0) {
|
||||||
if (screen)
|
if (screen) {
|
||||||
fprintf(screen,"Created " BIGINT_FORMAT " atoms\n",
|
fprintf(screen,"Created " BIGINT_FORMAT " atoms\n",
|
||||||
atom->natoms-natoms_previous);
|
atom->natoms-natoms_previous);
|
||||||
if (logfile)
|
fprintf(screen," CPU time = %g secs\n",time2-time1);
|
||||||
|
}
|
||||||
|
if (logfile) {
|
||||||
fprintf(logfile,"Created " BIGINT_FORMAT " atoms\n",
|
fprintf(logfile,"Created " BIGINT_FORMAT " atoms\n",
|
||||||
atom->natoms-natoms_previous);
|
atom->natoms-natoms_previous);
|
||||||
|
fprintf(logfile," CPU time = %g secs\n",time2-time1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// for MOLECULE mode:
|
// for MOLECULE mode:
|
||||||
|
|||||||
@ -827,9 +827,9 @@ void Output::create_restart(int narg, char **arg)
|
|||||||
sum and print memory usage
|
sum and print memory usage
|
||||||
result is only memory on proc 0, not averaged across procs
|
result is only memory on proc 0, not averaged across procs
|
||||||
------------------------------------------------------------------------- */
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
void Output::memory_usage()
|
void Output::memory_usage()
|
||||||
{
|
{
|
||||||
|
|
||||||
bigint bytes = 0;
|
bigint bytes = 0;
|
||||||
bytes += atom->memory_usage();
|
bytes += atom->memory_usage();
|
||||||
bytes += neighbor->memory_usage();
|
bytes += neighbor->memory_usage();
|
||||||
|
|||||||
@ -74,6 +74,11 @@ void Replicate::command(int narg, char **arg)
|
|||||||
if (atom->nextra_grow || atom->nextra_restart || atom->nextra_store)
|
if (atom->nextra_grow || atom->nextra_restart || atom->nextra_store)
|
||||||
error->all(FLERR,"Cannot replicate with fixes that store atom quantities");
|
error->all(FLERR,"Cannot replicate with fixes that store atom quantities");
|
||||||
|
|
||||||
|
// CPU time
|
||||||
|
|
||||||
|
MPI_Barrier(world);
|
||||||
|
double time1 = MPI_Wtime();
|
||||||
|
|
||||||
// maxtag = largest atom tag across all existing atoms
|
// maxtag = largest atom tag across all existing atoms
|
||||||
|
|
||||||
tagint maxtag = 0;
|
tagint maxtag = 0;
|
||||||
@ -424,4 +429,16 @@ void Replicate::command(int narg, char **arg)
|
|||||||
Special special(lmp);
|
Special special(lmp);
|
||||||
special.build();
|
special.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// CPU time
|
||||||
|
|
||||||
|
MPI_Barrier(world);
|
||||||
|
double time2 = MPI_Wtime();
|
||||||
|
|
||||||
|
if (me == 0) {
|
||||||
|
if (screen)
|
||||||
|
fprintf(screen," CPU time = %g secs\n",time2-time1);
|
||||||
|
if (logfile)
|
||||||
|
fprintf(logfile," CPU time = %g secs\n",time2-time1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user