implemented scatter, gather, and friends; wrote and updated documentation
This commit is contained in:
@ -298,6 +298,16 @@ of the contents of the :f:mod:`LIBLAMMPS` Fortran interface to LAMMPS.
|
|||||||
:ftype scatter_atoms_subset: subroutine
|
:ftype scatter_atoms_subset: subroutine
|
||||||
:f gather_bonds: :f:subr:`gather_bonds`
|
:f gather_bonds: :f:subr:`gather_bonds`
|
||||||
:ftype gather_bonds: subroutine
|
:ftype gather_bonds: subroutine
|
||||||
|
:f gather: :f:subr:`gather`
|
||||||
|
:ftype gather: subroutine
|
||||||
|
:f gather_concat: :f:subr:`gather_concat`
|
||||||
|
:ftype gather_concat: subroutine
|
||||||
|
:f gather_subset: :f:subr:`gather_subset`
|
||||||
|
:ftype gather_subset: subroutine
|
||||||
|
:f scatter: :f:subr:`scatter`
|
||||||
|
:ftype scatter: subroutine
|
||||||
|
:f scatter_subset: :f:subr:`scatter_subset`
|
||||||
|
:ftype scatter_subset: subroutine
|
||||||
:f create_atoms: :f:subr:`create_atoms`
|
:f create_atoms: :f:subr:`create_atoms`
|
||||||
:ftype create_atoms: subroutine
|
:ftype create_atoms: subroutine
|
||||||
:f find_pair_neighlist: :f:func:`find_pair_neighlist`
|
:f find_pair_neighlist: :f:func:`find_pair_neighlist`
|
||||||
@ -1194,8 +1204,8 @@ Procedures Bound to the :f:type:`lammps` Derived Type
|
|||||||
|
|
||||||
.. f:function:: extract_variable(name[,group])
|
.. f:function:: extract_variable(name[,group])
|
||||||
|
|
||||||
This function calls :cpp:func:`lammps_extract_variable` and returns a scalar,
|
This function calls :cpp:func:`lammps_extract_variable` and returns a
|
||||||
vector, or string containing the value of the variable identified by
|
scalar, vector, or string containing the value of the variable identified by
|
||||||
*name*. When the variable is an *equal*-style variable (or one compatible
|
*name*. When the variable is an *equal*-style variable (or one compatible
|
||||||
with that style such as *internal*), the variable is evaluated and the
|
with that style such as *internal*), the variable is evaluated and the
|
||||||
corresponding value returned. When the variable is an *atom*-style variable,
|
corresponding value returned. When the variable is an *atom*-style variable,
|
||||||
@ -1276,15 +1286,19 @@ Procedures Bound to the :f:type:`lammps` Derived Type
|
|||||||
length (*count* :math:`\times` *natoms*), as queried by
|
length (*count* :math:`\times` *natoms*), as queried by
|
||||||
:f:func:`extract_setting`.
|
:f:func:`extract_setting`.
|
||||||
|
|
||||||
|
This function is not compatible with ``-DLAMMPS_BIGBIG``.
|
||||||
|
|
||||||
:p character(len=\*) name: desired quantity (e.g., *x* or *mask*)
|
:p character(len=\*) name: desired quantity (e.g., *x* or *mask*)
|
||||||
:p integer(c_int) count: number of per-atom values you expect per atom
|
:p integer(c_int) count: number of per-atom values you expect per atom
|
||||||
(e.g., 1 for *type*, *mask*, or *charge*; 3 for *x*, *v*, or *f*). Use
|
(e.g., 1 for *type*, *mask*, or *charge*; 3 for *x*, *v*, or *f*). Use
|
||||||
*count* = 3 with *image* if you want a single image flag unpacked into
|
*count* = 3 with *image* if you want a single image flag unpacked into
|
||||||
*x*/*y*/*z* components.
|
*x*/*y*/*z* components.
|
||||||
:p real(c_double) data [dimension(:),allocatable]: array into which to store
|
:p polymorphic data [dimension(:),allocatable]: array into which to store
|
||||||
the data. Array *must* have the ``ALLOCATABLE`` attribute and be of rank 1
|
the data. Array *must* have the ``ALLOCATABLE`` attribute and be of rank 1
|
||||||
(i.e., ``DIMENSION(:)``). If this array is already allocated, it will be
|
(i.e., ``DIMENSION(:)``). If this array is already allocated, it will be
|
||||||
reallocated to fit the length of the incoming data.
|
reallocated to fit the length of the incoming data. It should have type
|
||||||
|
``INTEGER(c_int)`` if expecting integer data and ``REAL(c_double)`` if
|
||||||
|
expecting floating-point data.
|
||||||
:to: :cpp:func:`lammps_gather_atoms`
|
:to: :cpp:func:`lammps_gather_atoms`
|
||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
@ -1324,15 +1338,19 @@ Procedures Bound to the :f:type:`lammps` Derived Type
|
|||||||
:f:func:`gather_atoms`; for a similar array but for a subset of atoms, see
|
:f:func:`gather_atoms`; for a similar array but for a subset of atoms, see
|
||||||
:f:func:`gather_atoms_subset`.
|
:f:func:`gather_atoms_subset`.
|
||||||
|
|
||||||
|
This function is not compatible with ``-DLAMMPS_BIGBIG``.
|
||||||
|
|
||||||
:p character(len=\*) name: desired quantity (e.g., *x* or *mask*)
|
:p character(len=\*) name: desired quantity (e.g., *x* or *mask*)
|
||||||
:p integer(c_int) count: number of per-atom values you expect per atom
|
:p integer(c_int) count: number of per-atom values you expect per atom
|
||||||
(e.g., 1 for *type*, *mask*, or *charge*; 3 for *x*, *v*, or *f*). Use
|
(e.g., 1 for *type*, *mask*, or *charge*; 3 for *x*, *v*, or *f*). Use
|
||||||
*count* = 3 with *image* if you want a single image flag unpacked into
|
*count* = 3 with *image* if you want a single image flag unpacked into
|
||||||
*x*/*y*/*z* components.
|
*x*/*y*/*z* components.
|
||||||
:p real(c_double) data [dimension(:),allocatable]: array into which to store
|
:p polymorphic data [dimension(:),allocatable]: array into which to store
|
||||||
the data. Array *must* have the ``ALLOCATABLE`` attribute and be of rank 1
|
the data. Array *must* have the ``ALLOCATABLE`` attribute and be of rank 1
|
||||||
(i.e., ``DIMENSION(:)``). If this array is already allocated, it will be
|
(i.e., ``DIMENSION(:)``). If this array is already allocated, it will be
|
||||||
reallocated to fit the length of the incoming data.
|
reallocated to fit the length of the incoming data. It should have type
|
||||||
|
``INTEGER(c_int)`` if expecting integer data and ``REAL(c_double)`` if
|
||||||
|
expecting floating-point data.
|
||||||
:to: :cpp:func:`lammps_gather_atoms_concat`
|
:to: :cpp:func:`lammps_gather_atoms_concat`
|
||||||
|
|
||||||
--------
|
--------
|
||||||
@ -1346,7 +1364,7 @@ Procedures Bound to the :f:type:`lammps` Derived Type
|
|||||||
.. versionadded:: 3Nov2022
|
.. versionadded:: 3Nov2022
|
||||||
|
|
||||||
This subroutine gathers data for the requested atom IDs and stores them in a
|
This subroutine gathers data for the requested atom IDs and stores them in a
|
||||||
one-dimensional array allocated by the user. The data will be ordered by
|
one-dimensional allocatable array. The data will be ordered by
|
||||||
atom ID, but there is no requirement that the IDs be consecutive. If you
|
atom ID, but there is no requirement that the IDs be consecutive. If you
|
||||||
wish to return a similar array for *all* the atoms, use
|
wish to return a similar array for *all* the atoms, use
|
||||||
:f:func:`gather_atoms` or :f:func:`gather_atoms_concat`.
|
:f:func:`gather_atoms` or :f:func:`gather_atoms_concat`.
|
||||||
@ -1359,6 +1377,8 @@ Procedures Bound to the :f:type:`lammps` Derived Type
|
|||||||
user, and *data* must be of rank 1 (i.e., ``DIMENSION(:)``) and have the
|
user, and *data* must be of rank 1 (i.e., ``DIMENSION(:)``) and have the
|
||||||
``ALLOCATABLE`` attribute.
|
``ALLOCATABLE`` attribute.
|
||||||
|
|
||||||
|
This function is not compatible with ``-DLAMMPS_BIGBIG``.
|
||||||
|
|
||||||
:p character(len=\*) name: desired quantity (e.g., *x* or *mask*)
|
:p character(len=\*) name: desired quantity (e.g., *x* or *mask*)
|
||||||
:p integer(c_int) count: number of per-atom values you expect per atom
|
:p integer(c_int) count: number of per-atom values you expect per atom
|
||||||
(e.g., 1 for *type*, *mask*, or *charge*; 3 for *x*, *v*, or *f*). Use
|
(e.g., 1 for *type*, *mask*, or *charge*; 3 for *x*, *v*, or *f*). Use
|
||||||
@ -1366,10 +1386,12 @@ Procedures Bound to the :f:type:`lammps` Derived Type
|
|||||||
*x*/*y*/*z* components.
|
*x*/*y*/*z* components.
|
||||||
:p integer(c_int) ids [dimension(:)]: atom IDs corresponding to the atoms
|
:p integer(c_int) ids [dimension(:)]: atom IDs corresponding to the atoms
|
||||||
to be gathered
|
to be gathered
|
||||||
:p real(c_double) data [dimension(:),allocatable]: array into which to store
|
:p polymorphic data [dimension(:),allocatable]: array into which to store
|
||||||
the data. Array *must* have the ``ALLOCATABLE`` attribute and be of rank 1
|
the data. Array *must* have the ``ALLOCATABLE`` attribute and be of rank 1
|
||||||
(i.e., ``DIMENSION(:)``). If this array is already allocated, it will be
|
(i.e., ``DIMENSION(:)``). If this array is already allocated, it will be
|
||||||
reallocated to fit the length of the incoming data.
|
reallocated to fit the length of the incoming data. It should have type
|
||||||
|
``INTEGER(c_int)`` if expecting integer data and ``REAL(c_double)`` if
|
||||||
|
expecting floating-point data.
|
||||||
:to: :cpp:func:`lammps_gather_atoms_subset`
|
:to: :cpp:func:`lammps_gather_atoms_subset`
|
||||||
|
|
||||||
--------
|
--------
|
||||||
@ -1443,7 +1465,7 @@ Procedures Bound to the :f:type:`lammps` Derived Type
|
|||||||
|
|
||||||
.. versionadded:: 3Nov2022
|
.. versionadded:: 3Nov2022
|
||||||
|
|
||||||
This function copies the list of all bonds into an allocated array.
|
This function copies the list of all bonds into an allocatable array.
|
||||||
The array will be filled with (bond type, bond atom 1, bond atom 2) for each
|
The array will be filled with (bond type, bond atom 1, bond atom 2) for each
|
||||||
bond. The array is allocated to the right length (i.e., three times the
|
bond. The array is allocated to the right length (i.e., three times the
|
||||||
number of bonds). The array *data* must be of the same type as the LAMMPS
|
number of bonds). The array *data* must be of the same type as the LAMMPS
|
||||||
@ -1482,6 +1504,173 @@ Procedures Bound to the :f:type:`lammps` Derived Type
|
|||||||
|
|
||||||
--------
|
--------
|
||||||
|
|
||||||
|
.. f:subroutine:: gather(self, name, count, data)
|
||||||
|
|
||||||
|
Gather the named per-atom, per-atom fix, per-atom compute, or fix
|
||||||
|
property/atom-based entities from all processes, in order by atom ID.
|
||||||
|
|
||||||
|
.. versionadded:: TBD
|
||||||
|
|
||||||
|
This subroutine gathers data from all processes and stores them in a
|
||||||
|
one-dimensional allocatable array. The array *data* will be
|
||||||
|
ordered by atom ID, which requires consecutive IDs (1 to *natoms*\ ). If you
|
||||||
|
need a similar array but for non-consecutive atom IDs, see
|
||||||
|
:cpp:func:`lammps_gather_concat`; for a similar array but for a subset of
|
||||||
|
atoms, see :cpp:func:`lammps_gather_subset`.
|
||||||
|
|
||||||
|
The *data* array will be ordered in groups of *count* values, sorted by atom
|
||||||
|
ID (e.g., if *name* is *x*, then *data* is [x(1,1), x(2,1), x(3,1), x(1,2),
|
||||||
|
x(2,2), x(3,2), x(1,3), :math:`\dots`]); *data* must be ``ALLOCATABLE`` and
|
||||||
|
will be allocated to length (*count*\ :math:`{}\times{}`\ *natoms*), as
|
||||||
|
queried by :f:func:`extract_setting`.
|
||||||
|
|
||||||
|
This function will return an error if fix or compute data are requested and
|
||||||
|
the fix or compute ID given does not have per-atom data. See the note about
|
||||||
|
re-interpreting the vector as a matrix at :f:subr:`gather_atoms`.
|
||||||
|
|
||||||
|
This function is not compatible with ``-DLAMMPS_BIGBIG``.
|
||||||
|
|
||||||
|
:p character(len=\*) name: desired quantity (e.g., "x" or "mask" for atom
|
||||||
|
properties, "f_id" for per-atom fix data, "c_id" for per-atom compute data,
|
||||||
|
"d_name" or "i_name" for fix property/atom vectors with *count* = 1,
|
||||||
|
"d2_name" or "i2_name" for fix propert/atom vectors with
|
||||||
|
*count*\ :math:`{}> 1`)
|
||||||
|
:p integer(c_int) count: number of per-atom values (e.g., 1 for *type* or
|
||||||
|
*charge*, 3 for *x* or *f*); use *count* = 3 with *image* if you want the
|
||||||
|
image flags unpacked into (*x*,\ *y*,\ *z*) components.
|
||||||
|
:p real(c_double) data [dimension(:),allocatable]: array into which to store
|
||||||
|
the data. Array *must* have the ``ALLOCATABLE`` attribute and be of rank 1
|
||||||
|
(i.e., ``DIMENSION(:)``). If this array is already allocated, it will be
|
||||||
|
reallocated to fit the length of the incoming data.
|
||||||
|
:to: :cpp:func:`lammps_gather`
|
||||||
|
|
||||||
|
--------
|
||||||
|
|
||||||
|
.. f:subroutine:: gather_concat(self, name, count, data)
|
||||||
|
|
||||||
|
Gather the named per-atom, per-atom fix, per-atom compute, or fix
|
||||||
|
property/atom-based entities from all processes, unordered.
|
||||||
|
|
||||||
|
This subroutine gathers data for all atoms and stores them in a
|
||||||
|
one-dimensional allocatable array. The data will be a
|
||||||
|
concatenation of chunks from each processor's owned atoms, in whatever order
|
||||||
|
the atoms are in on each processor. This process has no requirement that the
|
||||||
|
atom IDs be consecutive. If you need the ID of each atom, you can do another
|
||||||
|
call to either :f:subr:`gather_atoms_concat` or :f:subr:`gather_concat` with
|
||||||
|
*name* set to ``id``. If you have consecutive IDs and want the data to be in
|
||||||
|
order, use :f:subr:`gather`; for a similar array but for a subset of
|
||||||
|
atoms, use :f:subr:`gather_subset`.
|
||||||
|
|
||||||
|
The *data* array will be in groups of *count* values, with *natoms* groups
|
||||||
|
total, but not in order by atom ID (e.g., if *name* is *x* and *count* is 3,
|
||||||
|
then *data* might be something like [x(1,11), x(2,11), x(3,11), x(1,3),
|
||||||
|
x(2,3), x(3,3), x(1,5), :math:`\dots`]); *data* must be ``ALLOCATABLE`` and
|
||||||
|
will be allocated to length (*count* :math:`\times` *natoms*), as queried by
|
||||||
|
:f:func:`extract_setting`.
|
||||||
|
|
||||||
|
This function is not compatible with ``-DLAMMPS_BIGBIG``.
|
||||||
|
|
||||||
|
:p character(len=\*) name: desired quantity (e.g., "x" or "mask" for atom
|
||||||
|
properties, "f_id" for per-atom fix data, "c_id" for per-atom compute data,
|
||||||
|
"d_name" or "i_name" for fix property/atom vectors with *count* = 1,
|
||||||
|
"d2_name" or "i2_name" for fix propert/atom vectors with
|
||||||
|
*count*\ :math:`{}> 1`)
|
||||||
|
:p integer(c_int) count: number of per-atom values you expect per atom
|
||||||
|
(e.g., 1 for *type*, *mask*, or *charge*; 3 for *x*, *v*, or *f*). Use
|
||||||
|
*count* = 3 with *image* if you want a single image flag unpacked into
|
||||||
|
*x*/*y*/*z* components.
|
||||||
|
:p polymorphic data [dimension(:),allocatable]: array into which to store
|
||||||
|
the data. Array *must* have the ``ALLOCATABLE`` attribute and be of rank 1
|
||||||
|
(i.e., ``DIMENSION(:)``). If this array is already allocated, it will be
|
||||||
|
reallocated to fit the length of the incoming data. It should have type
|
||||||
|
``INTEGER(c_int)`` if expecting integer data and ``REAL(c_double)`` if
|
||||||
|
expecting floating-point data.
|
||||||
|
:to: :cpp:func:`lammps_gather_concat`
|
||||||
|
|
||||||
|
--------
|
||||||
|
|
||||||
|
.. f:subroutine:: gather_subset(name, count, ids, data)
|
||||||
|
|
||||||
|
Gather the named per-atom, per-atom fix, per-atom compute, or fix
|
||||||
|
property/atom-based entities from all processes for a subset of atoms.
|
||||||
|
|
||||||
|
This subroutine gathers data for the requested atom IDs and stores them in a
|
||||||
|
one-dimensional allocatable array. The data will be ordered by atom ID, but
|
||||||
|
there is no requirement that the IDs be consecutive. If you wish to return a
|
||||||
|
similar array for *all* the atoms, use :f:subr:`gather` or
|
||||||
|
:f:subr:`gather_concat`.
|
||||||
|
|
||||||
|
The *data* array will be in groups of *count* values, sorted by atom ID in
|
||||||
|
the same order as the array *ids* (e.g., if *name* is *x*, *count* = 3, and
|
||||||
|
*ids* is [100, 57, 210], then *data* might look like [x(1,100), x(2,100),
|
||||||
|
x(3,100), x(1,57), x(2,57), x(3,57), x(1,210), :math:`\dots`]); *ids* must
|
||||||
|
be provided by the user, and *data* must have the ``ALLOCATABLE`` attribute
|
||||||
|
and be of rank 1 (i.e., ``DIMENSION(:)``). If *data* is already allocated,
|
||||||
|
it will be reallocated to fit the length of the incoming data.
|
||||||
|
|
||||||
|
This function is not compatible with ``-DLAMMPS_BIGBIG``.
|
||||||
|
|
||||||
|
:p character(len=\*) name: quantity to be scattered
|
||||||
|
|
||||||
|
:p integer(c_int) ids [dimension(:)]: atom IDs corresponding to the atoms
|
||||||
|
being scattered (e.g., "x" or "f" for atom properties, "f_id" for per-atom
|
||||||
|
fix data, "c_id" for per-atom compute data, "d_name" or "i_name" for fix
|
||||||
|
property/atom vectors with *count* = 1, "d2_name" or "i2_name" for fix
|
||||||
|
property/atom vectors with *count*\ :math:`{} > 1`)
|
||||||
|
:p data: per-atom values packed into a one-dimensional array containing the
|
||||||
|
data to be scattered. This array must have either the same length as *ids*
|
||||||
|
(for *mask*, *type*, etc.) or three times its length (for *x*, *f*, etc.);
|
||||||
|
the array must be rank 1 and be of type ``INTEGER(c_int)`` (e.g., for
|
||||||
|
*mask* or *type*) or of type ``REAL(c_double)`` (e.g., for *charge*, *x*,
|
||||||
|
or *f*).
|
||||||
|
:ptype data: polymorphic,dimension(:)
|
||||||
|
:to: :cpp:func:`lammps_scatter_subset`
|
||||||
|
|
||||||
|
--------
|
||||||
|
|
||||||
|
.. f:subroutine:: scatter(name, data)
|
||||||
|
|
||||||
|
This function calls :cpp:func:`lammps_scatter` to scatter the named
|
||||||
|
atom-based entities in *data* to all processes.
|
||||||
|
|
||||||
|
*This function is not yet documented, as the underlying C routine has not
|
||||||
|
been thoroughly tested yet.*
|
||||||
|
|
||||||
|
--------
|
||||||
|
|
||||||
|
.. f:subroutine:: scatter_subset(name, ids, data)
|
||||||
|
|
||||||
|
This function calls :cpp:func:`lammps_scatter_subset` to scatter the named
|
||||||
|
per-atom, per-atom fix, per-atom compute, or fix property/atom-based
|
||||||
|
entities in *data* from a subset of atoms to all processes.
|
||||||
|
|
||||||
|
.. versionadded:: TBD
|
||||||
|
|
||||||
|
This subroutine takes data stored in a one-dimensional array supplied by the
|
||||||
|
user and scatters them to a subset of atoms on all processes. The array
|
||||||
|
*data* contains data associated with atom IDs, but there is no requirement
|
||||||
|
that the IDs be consecutive, as they are provided in a separate array.
|
||||||
|
Use :f:subr:`scatter` to scatter data for all atoms, in order.
|
||||||
|
|
||||||
|
The *data* array needs to be organized in groups of *count* values, with the
|
||||||
|
groups in the same order as the array *ids*. For example, if you want *data*
|
||||||
|
to be the array [x(1,1), x(2,1), x(3,1), x(1,100), x(2,100), x(3,100),
|
||||||
|
x(1,57), x(2,57), x(3,57)], then *count* = 3 and *ids* = [1, 100, 57].
|
||||||
|
|
||||||
|
This function is not compatible with ``-DLAMMPS_BIGBIG``.
|
||||||
|
|
||||||
|
:p character(len=\*) name: desired quantity (e.g., "x" or "mask" for atom
|
||||||
|
properties, "f_id" for per-atom fix data, "c_id" for per-atom compute data,
|
||||||
|
"d_name" or "i_name" for fix property/atom vectors with *count* = 1,
|
||||||
|
"d2_name" or "i2_name" for fix propert/atom vectors with
|
||||||
|
*count*\ :math:`{}> 1`)
|
||||||
|
:p integer(c_int) ids: list of atom IDs to scatter data for
|
||||||
|
:p polymorphic data [dimension(:)]: per-atom values packed in a
|
||||||
|
one-dimensional array of length *size(ids)* \* *count*.
|
||||||
|
:to: :cpp:func:`lammps_scatter_subset`
|
||||||
|
|
||||||
|
--------
|
||||||
|
|
||||||
.. f:subroutine:: create_atoms([id,] type, x, [v,] [image,] [bexpand])
|
.. f:subroutine:: create_atoms([id,] type, x, [v,] [image,] [bexpand])
|
||||||
|
|
||||||
This method calls :cpp:func:`lammps_create_atoms` to create additional atoms
|
This method calls :cpp:func:`lammps_create_atoms` to create additional atoms
|
||||||
|
|||||||
@ -135,7 +135,24 @@ MODULE LIBLAMMPS
|
|||||||
PROCEDURE, PRIVATE :: lmp_gather_bonds_big
|
PROCEDURE, PRIVATE :: lmp_gather_bonds_big
|
||||||
GENERIC :: gather_bonds => lmp_gather_bonds_small, &
|
GENERIC :: gather_bonds => lmp_gather_bonds_small, &
|
||||||
lmp_gather_bonds_big
|
lmp_gather_bonds_big
|
||||||
!
|
PROCEDURE, PRIVATE :: lmp_gather_int
|
||||||
|
PROCEDURE, PRIVATE :: lmp_gather_double
|
||||||
|
GENERIC :: gather => lmp_gather_int, lmp_gather_double
|
||||||
|
PROCEDURE, PRIVATE :: lmp_gather_concat_int
|
||||||
|
PROCEDURE, PRIVATE :: lmp_gather_concat_double
|
||||||
|
GENERIC :: gather_concat => lmp_gather_concat_int, &
|
||||||
|
lmp_gather_concat_double
|
||||||
|
PROCEDURE, PRIVATE :: lmp_gather_subset_int
|
||||||
|
PROCEDURE, PRIVATE :: lmp_gather_subset_double
|
||||||
|
GENERIC :: gather_subset => lmp_gather_subset_int, &
|
||||||
|
lmp_gather_subset_double
|
||||||
|
PROCEDURE, PRIVATE :: lmp_scatter_int
|
||||||
|
PROCEDURE, PRIVATE :: lmp_scatter_double
|
||||||
|
GENERIC :: scatter => lmp_scatter_int, lmp_scatter_double
|
||||||
|
PROCEDURE, PRIVATE :: lmp_scatter_subset_int
|
||||||
|
PROCEDURE, PRIVATE :: lmp_scatter_subset_double
|
||||||
|
GENERIC :: scatter_subset => lmp_scatter_subset_int, &
|
||||||
|
lmp_scatter_subset_double
|
||||||
PROCEDURE, PRIVATE :: lmp_create_atoms_int
|
PROCEDURE, PRIVATE :: lmp_create_atoms_int
|
||||||
PROCEDURE, PRIVATE :: lmp_create_atoms_bigbig
|
PROCEDURE, PRIVATE :: lmp_create_atoms_bigbig
|
||||||
GENERIC :: create_atoms => lmp_create_atoms_int, &
|
GENERIC :: create_atoms => lmp_create_atoms_int, &
|
||||||
@ -552,13 +569,42 @@ MODULE LIBLAMMPS
|
|||||||
TYPE(c_ptr), VALUE :: handle, data
|
TYPE(c_ptr), VALUE :: handle, data
|
||||||
END SUBROUTINE lammps_gather_bonds
|
END SUBROUTINE lammps_gather_bonds
|
||||||
|
|
||||||
!SUBROUTINE lammps_gather
|
SUBROUTINE lammps_gather(handle, name, type, count, data) BIND(C)
|
||||||
|
IMPORT :: c_ptr, c_int
|
||||||
|
IMPLICIT NONE
|
||||||
|
TYPE(c_ptr), VALUE :: handle, name, data
|
||||||
|
INTEGER(c_int), VALUE :: type, count
|
||||||
|
END SUBROUTINE lammps_gather
|
||||||
|
|
||||||
!SUBROUTINE lammps_gather_concat
|
SUBROUTINE lammps_gather_concat(handle, name, type, count, data) BIND(C)
|
||||||
|
IMPORT :: c_ptr, c_int
|
||||||
|
IMPLICIT NONE
|
||||||
|
TYPE(c_ptr), VALUE :: handle, name, data
|
||||||
|
INTEGER(c_int), VALUE :: type, count
|
||||||
|
END SUBROUTINE lammps_gather_concat
|
||||||
|
|
||||||
!SUBROUTINE lammps_gather_subset
|
SUBROUTINE lammps_gather_subset(handle, name, type, count, ndata, ids, &
|
||||||
|
data) BIND(C)
|
||||||
|
IMPORT :: c_ptr, c_int
|
||||||
|
IMPLICIT NONE
|
||||||
|
TYPE(c_ptr), VALUE :: handle, name, ids, data
|
||||||
|
INTEGER(c_int), VALUE :: type, count, ndata
|
||||||
|
END SUBROUTINE lammps_gather_subset
|
||||||
|
|
||||||
!SUBROUTINE lammps_scatter_subset
|
SUBROUTINE lammps_scatter(handle, name, type, count, data) BIND(C)
|
||||||
|
IMPORT :: c_ptr, c_int
|
||||||
|
IMPLICIT NONE
|
||||||
|
TYPE(c_ptr), VALUE :: handle, name, data
|
||||||
|
INTEGER(c_int), VALUE :: type, count
|
||||||
|
END SUBROUTINE lammps_scatter
|
||||||
|
|
||||||
|
SUBROUTINE lammps_scatter_subset(handle, name, type, count, ndata, ids, &
|
||||||
|
data) BIND(C)
|
||||||
|
IMPORT :: c_ptr, c_int
|
||||||
|
IMPLICIT NONE
|
||||||
|
TYPE(c_ptr), VALUE :: handle, name, ids, data
|
||||||
|
INTEGER(c_int), VALUE :: count, ndata, type
|
||||||
|
END SUBROUTINE lammps_scatter_subset
|
||||||
|
|
||||||
FUNCTION lammps_create_atoms(handle, n, id, type, x, v, image, bexpand) &
|
FUNCTION lammps_create_atoms(handle, n, id, type, x, v, image, bexpand) &
|
||||||
BIND(C)
|
BIND(C)
|
||||||
@ -1622,7 +1668,7 @@ CONTAINS
|
|||||||
IF (count /= 1 .AND. count /= 3) THEN
|
IF (count /= 1 .AND. count /= 3) THEN
|
||||||
CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, &
|
CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, &
|
||||||
'gather_atoms_subset requires "count" to be 1 or 3 &
|
'gather_atoms_subset requires "count" to be 1 or 3 &
|
||||||
&[Fortran/gather_atoms]')
|
&[Fortran/gather_atoms_subset]')
|
||||||
END IF
|
END IF
|
||||||
|
|
||||||
ndata = SIZE(ids, KIND=c_int)
|
ndata = SIZE(ids, KIND=c_int)
|
||||||
@ -1652,7 +1698,7 @@ CONTAINS
|
|||||||
IF (count /= 1 .AND. count /= 3) THEN
|
IF (count /= 1 .AND. count /= 3) THEN
|
||||||
CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, &
|
CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, &
|
||||||
'gather_atoms_subset requires "count" to be 1 or 3 &
|
'gather_atoms_subset requires "count" to be 1 or 3 &
|
||||||
&[Fortran/gather_atoms]')
|
&[Fortran/gather_atoms_subset]')
|
||||||
END IF
|
END IF
|
||||||
|
|
||||||
ndata = SIZE(ids, KIND=c_int)
|
ndata = SIZE(ids, KIND=c_int)
|
||||||
@ -1746,7 +1792,8 @@ CONTAINS
|
|||||||
Ccount = SIZE(data, KIND=c_int) / Cndata
|
Ccount = SIZE(data, KIND=c_int) / Cndata
|
||||||
IF (Ccount /= 1 .AND. Ccount /= 3) THEN
|
IF (Ccount /= 1 .AND. Ccount /= 3) THEN
|
||||||
CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, &
|
CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, &
|
||||||
'scatter_atoms_subset requires either 1 or 3 data per atom')
|
'scatter_atoms_subset requires either 1 or 3 data per atom &
|
||||||
|
&[Fortran/scatter_atoms_subset]')
|
||||||
END IF
|
END IF
|
||||||
|
|
||||||
Cname = f2c_string(name)
|
Cname = f2c_string(name)
|
||||||
@ -1771,7 +1818,8 @@ CONTAINS
|
|||||||
Ccount = SIZE(data, KIND=c_int) / Cndata
|
Ccount = SIZE(data, KIND=c_int) / Cndata
|
||||||
IF (Ccount /= 1 .AND. Ccount /= 3) THEN
|
IF (Ccount /= 1 .AND. Ccount /= 3) THEN
|
||||||
CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, &
|
CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, &
|
||||||
'scatter_atoms_subset requires either 1 or 3 data per atom')
|
'scatter_atoms_subset requires either 1 or 3 data per atom &
|
||||||
|
&[Fortran/scatter_atoms_subset]')
|
||||||
END IF
|
END IF
|
||||||
|
|
||||||
Cname = f2c_string(name)
|
Cname = f2c_string(name)
|
||||||
@ -1792,7 +1840,7 @@ CONTAINS
|
|||||||
|
|
||||||
IF (SIZE_TAGINT /= 4_c_int) THEN
|
IF (SIZE_TAGINT /= 4_c_int) THEN
|
||||||
CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, &
|
CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, &
|
||||||
'Incompatible integer kind in gather_bonds [Fortran API]')
|
'Incompatible integer kind in gather_bonds [Fortran/gather_bonds]')
|
||||||
END IF
|
END IF
|
||||||
IF (ALLOCATED(data)) DEALLOCATE(data)
|
IF (ALLOCATED(data)) DEALLOCATE(data)
|
||||||
IF (SIZE_BIGINT == 4_c_int) THEN
|
IF (SIZE_BIGINT == 4_c_int) THEN
|
||||||
@ -1815,7 +1863,7 @@ CONTAINS
|
|||||||
|
|
||||||
IF (SIZE_TAGINT /= 8_c_int) THEN
|
IF (SIZE_TAGINT /= 8_c_int) THEN
|
||||||
CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, &
|
CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, &
|
||||||
'Incompatible integer kind in gather_bonds [Fortran API]')
|
'Incompatible integer kind in gather_bonds [Fortran/gather_bonds]')
|
||||||
END IF
|
END IF
|
||||||
nbonds = lmp_extract_global(self, 'nbonds')
|
nbonds = lmp_extract_global(self, 'nbonds')
|
||||||
IF (ALLOCATED(data)) DEALLOCATE(data)
|
IF (ALLOCATED(data)) DEALLOCATE(data)
|
||||||
@ -1824,6 +1872,314 @@ CONTAINS
|
|||||||
CALL lammps_gather_bonds(self%handle, Cdata)
|
CALL lammps_gather_bonds(self%handle, Cdata)
|
||||||
END SUBROUTINE lmp_gather_bonds_big
|
END SUBROUTINE lmp_gather_bonds_big
|
||||||
|
|
||||||
|
! equivalent function to lammps_gather (for int data)
|
||||||
|
SUBROUTINE lmp_gather_int(self, name, count, data)
|
||||||
|
CLASS(lammps), INTENT(IN) :: self
|
||||||
|
CHARACTER(LEN=*), INTENT(IN) :: name
|
||||||
|
INTEGER(c_int), INTENT(IN) :: count
|
||||||
|
INTEGER(c_int), DIMENSION(:), ALLOCATABLE, TARGET, INTENT(OUT) :: data
|
||||||
|
TYPE(c_ptr) :: Cdata, Cname
|
||||||
|
INTEGER(c_int) :: natoms
|
||||||
|
INTEGER(c_int), PARAMETER :: Ctype = 0_c_int
|
||||||
|
REAL(c_double) :: dnatoms
|
||||||
|
CHARACTER(LEN=100) :: error_msg
|
||||||
|
|
||||||
|
IF (count /= 1 .AND. count /= 3) THEN
|
||||||
|
CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, &
|
||||||
|
'gather requires "count" to be 1 or 3 [Fortran/gather]')
|
||||||
|
END IF
|
||||||
|
|
||||||
|
dnatoms = lmp_get_natoms(self)
|
||||||
|
IF (dnatoms > HUGE(1_c_int)) THEN
|
||||||
|
WRITE(error_msg,'(A,1X,I0,1X,A)') &
|
||||||
|
'Cannot use library function gather with more than', &
|
||||||
|
HUGE(0_c_int), 'atoms [Fortran/gather]'
|
||||||
|
CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, error_msg)
|
||||||
|
END IF
|
||||||
|
natoms = NINT(dnatoms, c_int)
|
||||||
|
|
||||||
|
Cname = f2c_string(name)
|
||||||
|
IF (ALLOCATED(data)) DEALLOCATE(data)
|
||||||
|
ALLOCATE(data(natoms*count))
|
||||||
|
Cdata = C_LOC(data(1))
|
||||||
|
CALL lammps_gather(self%handle, Cname, Ctype, count, Cdata)
|
||||||
|
CALL lammps_free(Cname)
|
||||||
|
END SUBROUTINE lmp_gather_int
|
||||||
|
|
||||||
|
! equivalent function to lammps_gather_atoms (for doubles)
|
||||||
|
SUBROUTINE lmp_gather_double(self, name, count, data)
|
||||||
|
CLASS(lammps), INTENT(IN) :: self
|
||||||
|
CHARACTER(LEN=*), INTENT(IN) :: name
|
||||||
|
INTEGER(c_int), INTENT(IN) :: count
|
||||||
|
REAL(c_double), DIMENSION(:), ALLOCATABLE, TARGET, INTENT(OUT) :: data
|
||||||
|
TYPE(c_ptr) :: Cdata, Cname
|
||||||
|
INTEGER(c_int) :: natoms
|
||||||
|
INTEGER(c_int), PARAMETER :: Ctype = 1_c_int
|
||||||
|
REAL(c_double) :: dnatoms
|
||||||
|
CHARACTER(LEN=100) :: error_msg
|
||||||
|
|
||||||
|
IF (count /= 1 .AND. count /= 3) THEN
|
||||||
|
CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, &
|
||||||
|
'gather requires "count" to be 1 or 3 [Fortran/gather]')
|
||||||
|
END IF
|
||||||
|
|
||||||
|
dnatoms = lmp_get_natoms(self)
|
||||||
|
IF (dnatoms > HUGE(1_c_int)) THEN
|
||||||
|
WRITE(error_msg,'(A,1X,I0,1X,A)') &
|
||||||
|
'Cannot use library function gather with more than', &
|
||||||
|
HUGE(0_c_int), 'atoms [Fortran/gather]'
|
||||||
|
CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, error_msg)
|
||||||
|
END IF
|
||||||
|
natoms = NINT(dnatoms, c_int)
|
||||||
|
|
||||||
|
Cname = f2c_string(name)
|
||||||
|
IF (ALLOCATED(data)) DEALLOCATE(data)
|
||||||
|
ALLOCATE(data(natoms*count))
|
||||||
|
Cdata = C_LOC(data(1))
|
||||||
|
CALL lammps_gather(self%handle, Cname, Ctype, count, Cdata)
|
||||||
|
CALL lammps_free(Cname)
|
||||||
|
END SUBROUTINE lmp_gather_double
|
||||||
|
|
||||||
|
! equivalent function to lammps_gather_concat (for ints)
|
||||||
|
SUBROUTINE lmp_gather_concat_int(self, name, count, data)
|
||||||
|
CLASS(lammps), INTENT(IN) :: self
|
||||||
|
CHARACTER(LEN=*), INTENT(IN) :: name
|
||||||
|
INTEGER(c_int), INTENT(IN) :: count
|
||||||
|
INTEGER(c_int), DIMENSION(:), ALLOCATABLE, TARGET, INTENT(OUT) :: data
|
||||||
|
TYPE(c_ptr) :: Cdata, Cname
|
||||||
|
INTEGER(c_int) :: natoms
|
||||||
|
INTEGER(c_int), PARAMETER :: Ctype = 0_c_int
|
||||||
|
REAL(c_double) :: dnatoms
|
||||||
|
CHARACTER(LEN=100) :: error_msg
|
||||||
|
|
||||||
|
IF (count /= 1 .AND. count /= 3) THEN
|
||||||
|
CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, &
|
||||||
|
'gather_concat requires "count" to be 1 or 3 [Fortran/gather_concat]')
|
||||||
|
END IF
|
||||||
|
|
||||||
|
dnatoms = lmp_get_natoms(self)
|
||||||
|
IF (dnatoms > HUGE(1_c_int)) THEN
|
||||||
|
WRITE(error_msg,'(A,1X,I0,1X,A)') &
|
||||||
|
'Cannot use library function gather_concat with more than', &
|
||||||
|
HUGE(0_c_int), 'atoms [Fortran/gather_concat]'
|
||||||
|
CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, error_msg)
|
||||||
|
END IF
|
||||||
|
natoms = NINT(dnatoms, c_int)
|
||||||
|
|
||||||
|
Cname = f2c_string(name)
|
||||||
|
IF (ALLOCATED(data)) DEALLOCATE(data)
|
||||||
|
ALLOCATE(data(natoms*count))
|
||||||
|
Cdata = C_LOC(data(1))
|
||||||
|
CALL lammps_gather_concat(self%handle, Cname, Ctype, count, Cdata)
|
||||||
|
CALL lammps_free(Cname)
|
||||||
|
END SUBROUTINE lmp_gather_concat_int
|
||||||
|
|
||||||
|
! equivalent function to lammps_gather_concat (for doubles)
|
||||||
|
SUBROUTINE lmp_gather_concat_double(self, name, count, data)
|
||||||
|
CLASS(lammps), INTENT(IN) :: self
|
||||||
|
CHARACTER(LEN=*), INTENT(IN) :: name
|
||||||
|
INTEGER(c_int), INTENT(IN) :: count
|
||||||
|
REAL(c_double), DIMENSION(:), ALLOCATABLE, TARGET, INTENT(OUT) :: data
|
||||||
|
TYPE(c_ptr) :: Cdata, Cname
|
||||||
|
INTEGER(c_int) :: natoms
|
||||||
|
INTEGER(c_int), PARAMETER :: Ctype = 1_c_int
|
||||||
|
REAL(c_double) :: dnatoms
|
||||||
|
CHARACTER(LEN=100) :: error_msg
|
||||||
|
|
||||||
|
IF (count /= 1 .AND. count /= 3) THEN
|
||||||
|
CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, &
|
||||||
|
'gather_concat requires "count" to be 1 or 3 [Fortran/gather_concat]')
|
||||||
|
END IF
|
||||||
|
|
||||||
|
dnatoms = lmp_get_natoms(self)
|
||||||
|
IF (dnatoms > HUGE(1_c_int)) THEN
|
||||||
|
WRITE(error_msg,'(A,1X,I0,1X,A)') &
|
||||||
|
'Cannot use library function gather_concat with more than', &
|
||||||
|
HUGE(0_c_int), 'atoms [Fortran/gather_concat]'
|
||||||
|
CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, error_msg)
|
||||||
|
END IF
|
||||||
|
natoms = NINT(dnatoms, c_int)
|
||||||
|
|
||||||
|
Cname = f2c_string(name)
|
||||||
|
IF (ALLOCATED(data)) DEALLOCATE(data)
|
||||||
|
ALLOCATE(data(natoms*count))
|
||||||
|
Cdata = C_LOC(data(1))
|
||||||
|
CALL lammps_gather_concat(self%handle, Cname, Ctype, count, Cdata)
|
||||||
|
CALL lammps_free(Cname)
|
||||||
|
END SUBROUTINE lmp_gather_concat_double
|
||||||
|
|
||||||
|
! equivalent function to lammps_gather_subset (for integers)
|
||||||
|
SUBROUTINE lmp_gather_subset_int(self, name, count, ids, data)
|
||||||
|
CLASS(lammps), INTENT(IN) :: self
|
||||||
|
CHARACTER(LEN=*), INTENT(IN) :: name
|
||||||
|
INTEGER(c_int), INTENT(IN) :: count
|
||||||
|
INTEGER(c_int), DIMENSION(:), TARGET, INTENT(IN) :: ids
|
||||||
|
INTEGER(c_int), DIMENSION(:), ALLOCATABLE, TARGET, INTENT(OUT) :: data
|
||||||
|
INTEGER(c_int) :: ndata
|
||||||
|
TYPE(c_ptr) :: Cdata, Cname, Cids
|
||||||
|
INTEGER(c_int), PARAMETER :: Ctype = 0_c_int
|
||||||
|
|
||||||
|
IF (count /= 1 .AND. count /= 3) THEN
|
||||||
|
CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, &
|
||||||
|
'gather_subset requires "count" to be 1 or 3 [Fortran/gather_subset]')
|
||||||
|
END IF
|
||||||
|
|
||||||
|
ndata = SIZE(ids, KIND=c_int)
|
||||||
|
|
||||||
|
Cname = f2c_string(name)
|
||||||
|
IF (ALLOCATED(data)) DEALLOCATE(data)
|
||||||
|
ALLOCATE(data(ndata*count))
|
||||||
|
data = -1_c_int
|
||||||
|
Cdata = C_LOC(data(1))
|
||||||
|
Cids = C_LOC(ids(1))
|
||||||
|
CALL lammps_gather_subset(self%handle, Cname, Ctype, count, &
|
||||||
|
ndata, Cids, Cdata)
|
||||||
|
CALL lammps_free(Cname)
|
||||||
|
END SUBROUTINE lmp_gather_subset_int
|
||||||
|
|
||||||
|
! equivalent function to lammps_gather_subset (for doubles)
|
||||||
|
SUBROUTINE lmp_gather_subset_double(self, name, count, ids, data)
|
||||||
|
CLASS(lammps), INTENT(IN) :: self
|
||||||
|
CHARACTER(LEN=*), INTENT(IN) :: name
|
||||||
|
INTEGER(c_int), INTENT(IN) :: count
|
||||||
|
INTEGER(c_int), DIMENSION(:), TARGET, INTENT(IN) :: ids
|
||||||
|
REAL(c_double), DIMENSION(:), ALLOCATABLE, TARGET, INTENT(OUT) :: data
|
||||||
|
INTEGER(c_int) :: ndata
|
||||||
|
TYPE(c_ptr) :: Cdata, Cname, Cids
|
||||||
|
INTEGER(c_int), PARAMETER :: Ctype = 1_c_int
|
||||||
|
|
||||||
|
IF (count /= 1 .AND. count /= 3) THEN
|
||||||
|
CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, &
|
||||||
|
'gather_subset requires "count" to be 1 or 3 [Fortran/gather_subset]')
|
||||||
|
END IF
|
||||||
|
|
||||||
|
ndata = SIZE(ids, KIND=c_int)
|
||||||
|
|
||||||
|
Cname = f2c_string(name)
|
||||||
|
IF (ALLOCATED(data)) DEALLOCATE(data)
|
||||||
|
ALLOCATE(data(ndata*count))
|
||||||
|
Cdata = C_LOC(data(1))
|
||||||
|
Cids = C_LOC(ids(1))
|
||||||
|
CALL lammps_gather_subset(self%handle, Cname, Ctype, count, &
|
||||||
|
ndata, Cids, Cdata)
|
||||||
|
CALL lammps_free(Cname)
|
||||||
|
END SUBROUTINE lmp_gather_subset_double
|
||||||
|
|
||||||
|
! equivalent function to lammps_scatter (for integers)
|
||||||
|
SUBROUTINE lmp_scatter_int(self, name, data)
|
||||||
|
CLASS(lammps), INTENT(IN) :: self
|
||||||
|
CHARACTER(LEN=*), INTENT(IN) :: name
|
||||||
|
INTEGER(c_int), DIMENSION(:), TARGET :: data
|
||||||
|
INTEGER(c_int) :: natoms, Ccount
|
||||||
|
INTEGER(c_int), PARAMETER :: Ctype = 0_c_int
|
||||||
|
TYPE(c_ptr) :: Cname, Cdata
|
||||||
|
REAL(c_double) :: dnatoms
|
||||||
|
CHARACTER(LEN=100) :: error_msg
|
||||||
|
|
||||||
|
dnatoms = lmp_get_natoms(self)
|
||||||
|
IF (dnatoms > HUGE(1_c_int)) THEN
|
||||||
|
WRITE(error_msg,'(A,1X,I0,1X,A)') &
|
||||||
|
'Cannot use library function scatter with more than', &
|
||||||
|
HUGE(0_c_int), 'atoms [Fortran/scatter]'
|
||||||
|
CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, error_msg)
|
||||||
|
END IF
|
||||||
|
natoms = NINT(dnatoms, c_int)
|
||||||
|
|
||||||
|
Cname = f2c_string(name)
|
||||||
|
Cdata = C_LOC(data(1))
|
||||||
|
Ccount = SIZE(data) / natoms
|
||||||
|
|
||||||
|
IF (Ccount /= 1 .AND. Ccount /= 3) THEN
|
||||||
|
CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, &
|
||||||
|
'lammps_scatter requires either 1 or 3 data per atom')
|
||||||
|
END IF
|
||||||
|
CALL lammps_scatter(self%handle, Cname, Ctype, Ccount, Cdata)
|
||||||
|
CALL lammps_free(Cname)
|
||||||
|
END SUBROUTINE lmp_scatter_int
|
||||||
|
|
||||||
|
! equivalent function to lammps_scatter (for doubles)
|
||||||
|
SUBROUTINE lmp_scatter_atoms_double(self, name, data)
|
||||||
|
CLASS(lammps), INTENT(IN) :: self
|
||||||
|
CHARACTER(LEN=*), INTENT(IN) :: name
|
||||||
|
REAL(c_double), DIMENSION(:), TARGET :: data
|
||||||
|
INTEGER(c_int) :: natoms, Ccount
|
||||||
|
INTEGER(c_int), PARAMETER :: Ctype = 1_c_int
|
||||||
|
TYPE(c_ptr) :: Cname, Cdata
|
||||||
|
REAL(c_double) :: dnatoms
|
||||||
|
CHARACTER(LEN=100) :: error_msg
|
||||||
|
|
||||||
|
dnatoms = lmp_get_natoms(self)
|
||||||
|
IF (dnatoms > HUGE(1_c_int)) THEN
|
||||||
|
WRITE(error_msg,'(A,1X,I0,1X,A)') &
|
||||||
|
'Cannot use library function scatter with more than', &
|
||||||
|
HUGE(0_c_int), 'atoms [Fortran/scatter]'
|
||||||
|
CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, error_msg)
|
||||||
|
END IF
|
||||||
|
natoms = NINT(dnatoms, c_int)
|
||||||
|
|
||||||
|
Cname = f2c_string(name)
|
||||||
|
Cdata = C_LOC(data(1))
|
||||||
|
Ccount = SIZE(data) / natoms
|
||||||
|
|
||||||
|
IF (Ccount /= 1 .AND. Ccount /= 3) THEN
|
||||||
|
CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, &
|
||||||
|
'scatter requires either 1 or 3 data per atom [Fortran/scatter]')
|
||||||
|
END IF
|
||||||
|
CALL lammps_scatter(self%handle, Cname, Ctype, Ccount, Cdata)
|
||||||
|
CALL lammps_free(Cname)
|
||||||
|
END SUBROUTINE lmp_scatter_double
|
||||||
|
|
||||||
|
! equivalent function to lammps_scatter_subset (for integers)
|
||||||
|
SUBROUTINE lmp_scatter_subset_int(self, name, ids, data)
|
||||||
|
CLASS(lammps), INTENT(IN) :: self
|
||||||
|
CHARACTER(LEN=*), INTENT(IN) :: name
|
||||||
|
INTEGER(c_int), DIMENSION(:), TARGET :: ids
|
||||||
|
INTEGER(c_int), DIMENSION(:), TARGET :: data
|
||||||
|
INTEGER(c_int), PARAMETER :: Ctype = 0_c_int
|
||||||
|
INTEGER(c_int) :: Cndata, Ccount
|
||||||
|
TYPE(c_ptr) :: Cdata, Cname, Cids
|
||||||
|
|
||||||
|
Cndata = SIZE(ids, KIND=c_int)
|
||||||
|
Ccount = SIZE(data, KIND=c_int) / Cndata
|
||||||
|
IF (Ccount /= 1 .AND. Ccount /= 3) THEN
|
||||||
|
CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, &
|
||||||
|
'scatter_subset requires either 1 or 3 data per atom &
|
||||||
|
&[Fortran/scatter_subset]')
|
||||||
|
END IF
|
||||||
|
|
||||||
|
Cname = f2c_string(name)
|
||||||
|
Cdata = C_LOC(data(1))
|
||||||
|
Cids = C_LOC(ids(1))
|
||||||
|
CALL lammps_scatter_subset(self%handle, Cname, Ctype, Ccount, &
|
||||||
|
Cndata, Cids, Cdata)
|
||||||
|
CALL lammps_free(Cname)
|
||||||
|
END SUBROUTINE lmp_scatter_subset_int
|
||||||
|
|
||||||
|
! equivalent function to lammps_scatter_subset (for doubles)
|
||||||
|
SUBROUTINE lmp_scatter_subset_double(self, name, ids, data)
|
||||||
|
CLASS(lammps), INTENT(IN) :: self
|
||||||
|
CHARACTER(LEN=*), INTENT(IN) :: name
|
||||||
|
INTEGER(c_int), DIMENSION(:), TARGET :: ids
|
||||||
|
REAL(c_double), DIMENSION(:), TARGET :: data
|
||||||
|
INTEGER(c_int), PARAMETER :: Ctype = 1_c_int
|
||||||
|
INTEGER(c_int) :: Cndata, Ccount
|
||||||
|
TYPE(c_ptr) :: Cdata, Cname, Cids
|
||||||
|
|
||||||
|
Cndata = SIZE(ids, KIND=c_int)
|
||||||
|
Ccount = SIZE(data, KIND=c_int) / Cndata
|
||||||
|
IF (Ccount /= 1 .AND. Ccount /= 3) THEN
|
||||||
|
CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, &
|
||||||
|
'scatter_subset requires either 1 or 3 data per atom')
|
||||||
|
END IF
|
||||||
|
|
||||||
|
Cname = f2c_string(name)
|
||||||
|
Cdata = C_LOC(data(1))
|
||||||
|
Cids = C_LOC(ids(1))
|
||||||
|
CALL lammps_scatter_subset(self%handle, Cname, Ctype, Ccount, &
|
||||||
|
Cndata, Cids, Cdata)
|
||||||
|
CALL lammps_free(Cname)
|
||||||
|
END SUBROUTINE lmp_scatter_subset_double
|
||||||
|
|
||||||
! equivalent function to lammps_create_atoms (int ids or id absent)
|
! equivalent function to lammps_create_atoms (int ids or id absent)
|
||||||
SUBROUTINE lmp_create_atoms_int(self, id, type, x, v, image, bexpand)
|
SUBROUTINE lmp_create_atoms_int(self, id, type, x, v, image, bexpand)
|
||||||
CLASS(lammps), INTENT(IN) :: self
|
CLASS(lammps), INTENT(IN) :: self
|
||||||
|
|||||||
209
src/library.cpp
209
src/library.cpp
@ -685,7 +685,7 @@ void lammps_commands_string(void *handle, const char *str)
|
|||||||
\verbatim embed:rst
|
\verbatim embed:rst
|
||||||
|
|
||||||
This number may be very large when running large simulations across
|
This number may be very large when running large simulations across
|
||||||
multiple processors. Depending on compile time choices, LAMMPS may be
|
multiple processes. Depending on compile time choices, LAMMPS may be
|
||||||
using either 32-bit or a 64-bit integer to store this number. For
|
using either 32-bit or a 64-bit integer to store this number. For
|
||||||
portability this function returns thus a double precision
|
portability this function returns thus a double precision
|
||||||
floating point number, which can represent up to a 53-bit signed
|
floating point number, which can represent up to a 53-bit signed
|
||||||
@ -2263,7 +2263,7 @@ int lammps_set_variable(void *handle, char *name, char *str)
|
|||||||
// Library functions for scatter/gather operations of data
|
// Library functions for scatter/gather operations of data
|
||||||
// ----------------------------------------------------------------------
|
// ----------------------------------------------------------------------
|
||||||
|
|
||||||
/** Gather the named atom-based entity for all atoms across all processors,
|
/** Gather the named atom-based entity for all atoms across all processes,
|
||||||
* in order.
|
* in order.
|
||||||
*
|
*
|
||||||
\verbatim embed:rst
|
\verbatim embed:rst
|
||||||
@ -2282,6 +2282,8 @@ x[0][2], x[1][0], x[1][1], x[1][2], x[2][0], :math:`\dots`);
|
|||||||
*natoms*), as queried by :cpp:func:`lammps_get_natoms`,
|
*natoms*), as queried by :cpp:func:`lammps_get_natoms`,
|
||||||
:cpp:func:`lammps_extract_global`, or :cpp:func:`lammps_extract_setting`.
|
:cpp:func:`lammps_extract_global`, or :cpp:func:`lammps_extract_setting`.
|
||||||
|
|
||||||
|
This function is not compatible with ``-DLAMMPS_BIGBIG``.
|
||||||
|
|
||||||
\endverbatim
|
\endverbatim
|
||||||
*
|
*
|
||||||
* \param handle pointer to a previously created LAMMPS instance
|
* \param handle pointer to a previously created LAMMPS instance
|
||||||
@ -2415,7 +2417,7 @@ void lammps_gather_atoms(void *handle, char *name, int type, int count, void *da
|
|||||||
END_CAPTURE
|
END_CAPTURE
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Gather the named atom-based entity for all atoms across all processors,
|
/** Gather the named atom-based entity for all atoms across all processes,
|
||||||
* unordered.
|
* unordered.
|
||||||
*
|
*
|
||||||
\verbatim embed:rst
|
\verbatim embed:rst
|
||||||
@ -2432,12 +2434,14 @@ of atoms, use :cpp:func:`lammps_gather_atoms_subset`.
|
|||||||
|
|
||||||
The *data* array will be in groups of *count* values, with *natoms*
|
The *data* array will be in groups of *count* values, with *natoms*
|
||||||
groups total, but not in order by atom ID (e.g., if *name* is *x* and *count*
|
groups total, but not in order by atom ID (e.g., if *name* is *x* and *count*
|
||||||
is 3, then *data* might be something like = x[10][0], x[10][1], x[10][2],
|
is 3, then *data* might be something like x[10][0], x[10][1], x[10][2],
|
||||||
x[2][0], x[2][1], x[2][2], x[4][0], :math:`\dots`); *data* must be
|
x[2][0], x[2][1], x[2][2], x[4][0], :math:`\dots`); *data* must be
|
||||||
pre-allocated by the caller to length (*count* :math:`\times` *natoms*), as
|
pre-allocated by the caller to length (*count* :math:`\times` *natoms*), as
|
||||||
queried by :cpp:func:`lammps_get_natoms`,
|
queried by :cpp:func:`lammps_get_natoms`,
|
||||||
:cpp:func:`lammps_extract_global`, or :cpp:func:`lammps_extract_setting`.
|
:cpp:func:`lammps_extract_global`, or :cpp:func:`lammps_extract_setting`.
|
||||||
|
|
||||||
|
This function is not compatible with ``-DLAMMPS_BIGBIG``.
|
||||||
|
|
||||||
\endverbatim
|
\endverbatim
|
||||||
*
|
*
|
||||||
* \param handle: pointer to a previously created LAMMPS instance
|
* \param handle: pointer to a previously created LAMMPS instance
|
||||||
@ -2599,6 +2603,8 @@ x[100][2], x[57][0], x[57][1], x[57][2], x[210][0], :math:`\dots`);
|
|||||||
*data* must be pre-allocated by the caller to length
|
*data* must be pre-allocated by the caller to length
|
||||||
(*count* :math:`\times` *ndata*).
|
(*count* :math:`\times` *ndata*).
|
||||||
|
|
||||||
|
This function is not compatible with ``-DLAMMPS_BIGBIG``.
|
||||||
|
|
||||||
\endverbatim
|
\endverbatim
|
||||||
*
|
*
|
||||||
* \param handle: pointer to a previously created LAMMPS instance
|
* \param handle: pointer to a previously created LAMMPS instance
|
||||||
@ -2745,20 +2751,22 @@ void lammps_gather_atoms_subset(void *handle, char *name, int type, int count,
|
|||||||
END_CAPTURE
|
END_CAPTURE
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Scatter the named atom-based entities in *data* to all processors.
|
/** Scatter the named atom-based entities in *data* to all processes.
|
||||||
*
|
*
|
||||||
\verbatim embed:rst
|
\verbatim embed:rst
|
||||||
|
|
||||||
This subroutine takes data stored in a one-dimensional array supplied by the
|
This subroutine takes data stored in a one-dimensional array supplied by the
|
||||||
user and scatters them to all atoms on all processors. The data must be
|
user and scatters them to all atoms on all processes. The data must be
|
||||||
ordered by atom ID, with the requirement that the IDs be consecutive.
|
ordered by atom ID, with the requirement that the IDs be consecutive.
|
||||||
Use :cpp:func:`lammps_scatter_atoms_subset` to scatter data for some (or all)
|
Use :cpp:func:`lammps_scatter_atoms_subset` to scatter data for some (or all)
|
||||||
atoms, unordered.
|
atoms, unordered.
|
||||||
|
|
||||||
The *data* array needs to be ordered in groups of *count* values, sorted by
|
The *data* array needs to be ordered in groups of *count* values, sorted by
|
||||||
atom ID (e.g., if *name* is *x* and *count* = 3, then
|
atom ID (e.g., if *name* is *x* and *count* = 3, then
|
||||||
*data* = x[0][0], x[0][1], x[0][2], x[1][0], x[1][1], x[1][2], x[2][0],
|
*data* = {x[0][0], x[0][1], x[0][2], x[1][0], x[1][1], x[1][2], x[2][0],
|
||||||
:math:`\dots`); *data* must be of length (*count* :math:`\times` *natoms*).
|
:math:`\dots`}); *data* must be of length (*count* :math:`\times` *natoms*).
|
||||||
|
|
||||||
|
This function is not compatible with ``-DLAMMPS_BIGBIG``.
|
||||||
|
|
||||||
\endverbatim
|
\endverbatim
|
||||||
*
|
*
|
||||||
@ -2768,7 +2776,7 @@ atom ID (e.g., if *name* is *x* and *count* = 3, then
|
|||||||
* \param count number of per-atom values (e.g., 1 for *type* or *charge*,
|
* \param count number of per-atom values (e.g., 1 for *type* or *charge*,
|
||||||
* 3 for *x* or *f*); use *count* = 3 with *image* if you have
|
* 3 for *x* or *f*); use *count* = 3 with *image* if you have
|
||||||
* a single image flag packed into (*x*,*y*,*z*) components.
|
* a single image flag packed into (*x*,*y*,*z*) components.
|
||||||
* \param data per-atom values packed in a 1-dimensional array of length
|
* \param data per-atom values packed in a one-dimensional array of length
|
||||||
* *natoms* \* *count*.
|
* *natoms* \* *count*.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
@ -2879,12 +2887,12 @@ void lammps_scatter_atoms(void *handle, char *name, int type, int count, void *d
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** Scatter the named atom-based entities in *data* from a subset of atoms
|
/** Scatter the named atom-based entities in *data* from a subset of atoms
|
||||||
* to all processors.
|
* to all processes.
|
||||||
*
|
*
|
||||||
\verbatim embed:rst
|
\verbatim embed:rst
|
||||||
|
|
||||||
This subroutine takes data stored in a one-dimensional array supplied by the
|
This subroutine takes data stored in a one-dimensional array supplied by the
|
||||||
user and scatters them to a subset of atoms on all processors. The array
|
user and scatters them to a subset of atoms on all processes. The array
|
||||||
*data* contains data associated with atom IDs, but there is no requirement that
|
*data* contains data associated with atom IDs, but there is no requirement that
|
||||||
the IDs be consecutive, as they are provided in a separate array.
|
the IDs be consecutive, as they are provided in a separate array.
|
||||||
Use :cpp:func:`lammps_scatter_atoms` to scatter data for all atoms, in order.
|
Use :cpp:func:`lammps_scatter_atoms` to scatter data for all atoms, in order.
|
||||||
@ -2895,6 +2903,8 @@ to be the array {x[1][0], x[1][1], x[1][2], x[100][0], x[100][1], x[100][2],
|
|||||||
x[57][0], x[57][1], x[57][2]}, then *count* = 3, *ndata* = 3, and *ids* would
|
x[57][0], x[57][1], x[57][2]}, then *count* = 3, *ndata* = 3, and *ids* would
|
||||||
be {1, 100, 57}.
|
be {1, 100, 57}.
|
||||||
|
|
||||||
|
This function is not compatible with ``-DLAMMPS_BIGBIG``.
|
||||||
|
|
||||||
\endverbatim
|
\endverbatim
|
||||||
*
|
*
|
||||||
* \param handle: pointer to a previously created LAMMPS instance
|
* \param handle: pointer to a previously created LAMMPS instance
|
||||||
@ -3146,6 +3156,43 @@ void lammps_gather_bonds(void *handle, void *data)
|
|||||||
END_CAPTURE
|
END_CAPTURE
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Gather the named per-atom, per-atom fix, per-atom compute, or fix property/atom-based entities
|
||||||
|
* from all processes, in order by atom ID.
|
||||||
|
*
|
||||||
|
\verbatim embed:rst
|
||||||
|
|
||||||
|
This subroutine gathers data from all processes and stores them in a one-dimensional array
|
||||||
|
allocated by the user. The array *data* will be ordered by atom ID, which requires consecutive IDs
|
||||||
|
(1 to *natoms*\ ). If you need a similar array but for non-consecutive atom IDs, see
|
||||||
|
:cpp:func:`lammps_gather_concat`; for a similar array but for a subset of atoms, see
|
||||||
|
:cpp:func:`lammps_gather_subset`.
|
||||||
|
|
||||||
|
The *data* array will be ordered in groups of *count* values, sorted by atom ID (e.g., if *name* is
|
||||||
|
*x*, then *data* is {x[0][0], x[0][1], x[0][2], x[1][0], x[1][1], x[1][2], x[2][0],
|
||||||
|
:math:`\dots`}); *data* must be pre-allocated by the caller to the correct length
|
||||||
|
(*count*\ :math:`{}\times{}`\ *natoms*), as queried by :cpp:func:`lammps_get_natoms`,
|
||||||
|
:cpp:func:`lammps_extract_global`, or :cpp:func:`lammps_extract_setting`.
|
||||||
|
|
||||||
|
This function will return an error if fix or compute data are requested and the fix or compute ID
|
||||||
|
given does not have per-atom data.
|
||||||
|
|
||||||
|
This function is not compatible with ``-DLAMMPS_BIGBIG``.
|
||||||
|
|
||||||
|
\endverbatim
|
||||||
|
*
|
||||||
|
* \param handle pointer to a previously created LAMMPS instance
|
||||||
|
* \param name desired quantity (e.g., "x" or "f" for atom properties, "f_id" for per-atom fix
|
||||||
|
* data, "c_id" for per-atom compute data, "d_name" or "i_name" for fix
|
||||||
|
* property/atom vectors with *count* = 1, "d2_name" or "i2_name" for fix
|
||||||
|
* property/atom vectors with *count* > 1)
|
||||||
|
* \param type 0 for ``int`` values, 1 for ``double`` values
|
||||||
|
* \param count number of per-atom values (e.g., 1 for *type* or *charge*, 3 for *x* or *f*);
|
||||||
|
* use *count* = 3 with *image* if you want the image flags unpacked into
|
||||||
|
* (*x*,*y*,*z*) components.
|
||||||
|
* \param data per-atom values packed into a one-dimensional array of length
|
||||||
|
* *natoms* \* *count*.
|
||||||
|
*
|
||||||
|
*/
|
||||||
/* ----------------------------------------------------------------------
|
/* ----------------------------------------------------------------------
|
||||||
Contributing author: Thomas Swinburne (CNRS & CINaM, Marseille, France)
|
Contributing author: Thomas Swinburne (CNRS & CINaM, Marseille, France)
|
||||||
gather the named atom-based entity for all atoms
|
gather the named atom-based entity for all atoms
|
||||||
@ -3381,6 +3428,44 @@ void lammps_gather(void *handle, char *name, int type, int count, void *data)
|
|||||||
END_CAPTURE
|
END_CAPTURE
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Gather the named per-atom, per-atom fix, per-atom compute, or fix property/atom-based entities
|
||||||
|
* from all processes, unordered.
|
||||||
|
*
|
||||||
|
\verbatim embed:rst
|
||||||
|
|
||||||
|
This subroutine gathers data for all atoms and stores them in a one-dimensional array allocated by
|
||||||
|
the user. The data will be a concatenation of chunks from each processor's owned atoms, in
|
||||||
|
whatever order the atoms are in on each processor. This process has no requirement that the atom
|
||||||
|
IDs be consecutive. If you need the ID of each atom, you can do another call to either
|
||||||
|
:cpp:func:`lammps_gather_atoms_concat` or :cpp:func:`lammps_gather_concat` with *name* set to
|
||||||
|
``id``. If you have consecutive IDs and want the data to be in order, use
|
||||||
|
:cpp:func:`lammps_gather`; for a similar array but for a subset of atoms, use
|
||||||
|
:cpp:func:`lammps_gather_subset`.
|
||||||
|
|
||||||
|
The *data* array will be in groups of *count* values, with *natoms* groups total, but not in order
|
||||||
|
by atom ID (e.g., if *name* is *x* and *count* is 3, then *data* might be something like
|
||||||
|
{x[10][0], x[10][1], x[10][2], x[2][0], x[2][1], x[2][2], x[4][0], :math:`\dots`}); *data* must be
|
||||||
|
pre-allocated by the caller to length (*count* :math:`\times` *natoms*), as queried by
|
||||||
|
:cpp:func:`lammps_get_natoms`, :cpp:func:`lammps_extract_global`, or
|
||||||
|
:cpp:func:`lammps_extract_setting`.
|
||||||
|
|
||||||
|
This function is not compatible with ``-DLAMMPS_BIGBIG``.
|
||||||
|
|
||||||
|
\endverbatim
|
||||||
|
*
|
||||||
|
* \param handle: pointer to a previously created LAMMPS instance
|
||||||
|
* \param name: desired quantity (e.g., "x" or "f" for atom properties, "f_id" for per-atom fix
|
||||||
|
* data, "c_id" for per-atom compute data, "d_name" or "i_name" for fix
|
||||||
|
* property/atom vectors with count = 1, "d2_name" or "i2_name" for fix
|
||||||
|
* property/atom vectors with count > 1)
|
||||||
|
* \param type: 0 for ``int`` values, 1 for ``double`` values
|
||||||
|
* \param count: number of per-atom values (e.g., 1 for *type* or *charge*, 3 for *x* or *f*);
|
||||||
|
* use *count* = 3 with *image* if you want the image flags unpacked into
|
||||||
|
* (*x*,*y*,*z*) components.
|
||||||
|
* \param data: per-atom values packed into a one-dimensional array of length
|
||||||
|
* *natoms* \* *count*.
|
||||||
|
*
|
||||||
|
*/
|
||||||
/* ----------------------------------------------------------------------
|
/* ----------------------------------------------------------------------
|
||||||
Contributing author: Thomas Swinburne (CNRS & CINaM, Marseille, France)
|
Contributing author: Thomas Swinburne (CNRS & CINaM, Marseille, France)
|
||||||
gather the named atom-based entity for all atoms
|
gather the named atom-based entity for all atoms
|
||||||
@ -3633,6 +3718,41 @@ void lammps_gather_concat(void *handle, char *name, int type, int count, void *d
|
|||||||
END_CAPTURE
|
END_CAPTURE
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Gather the named per-atom, per-atom fix, per-atom compute, or fix property/atom-based entities
|
||||||
|
* from all processes for a subset of atoms.
|
||||||
|
*
|
||||||
|
\verbatim embed:rst
|
||||||
|
|
||||||
|
This subroutine gathers data for the requested atom IDs and stores them in a one-dimensional array
|
||||||
|
allocated by the user. The data will be ordered by atom ID, but there is no requirement that the
|
||||||
|
IDs be consecutive. If you wish to return a similar array for *all* the atoms, use
|
||||||
|
:cpp:func:`lammps_gather` or :cpp:func:`lammps_gather_concat`.
|
||||||
|
|
||||||
|
The *data* array will be in groups of *count* values, sorted by atom ID in the same order as the
|
||||||
|
array *ids* (e.g., if *name* is *x*, *count* = 3, and *ids* is {100, 57, 210}, then *data* might
|
||||||
|
look like {x[100][0], x[100][1], x[100][2], x[57][0], x[57][1], x[57][2], x[210][0],
|
||||||
|
:math:`\dots`}); *ids* must be provided by the user with length *ndata*, and *data* must be
|
||||||
|
pre-allocated by the caller to length (*count*\ :math:`{}\times{}`\ *ndata*).
|
||||||
|
|
||||||
|
This function is not compatible with ``-DLAMMPS_BIGBIG``.
|
||||||
|
|
||||||
|
\endverbatim
|
||||||
|
*
|
||||||
|
* \param handle: pointer to a previously created LAMMPS instance
|
||||||
|
* \param name desired quantity (e.g., "x" or "f" for atom properties, "f_id" for per-atom fix
|
||||||
|
* data, "c_id" for per-atom compute data, "d_name" or "i_name" for fix
|
||||||
|
* property/atom vectors with *count* = 1, "d2_name" or "i2_name" for fix
|
||||||
|
* property/atom vectors with *count* > 1)
|
||||||
|
* \param type 0 for ``int`` values, 1 for ``double`` values
|
||||||
|
* \param count number of per-atom values (e.g., 1 for *type* or *charge*, 3 for *x* or *f*);
|
||||||
|
* use *count* = 3 with *image* if you want the image flags unpacked into
|
||||||
|
* (*x*,*y*,*z*) components.
|
||||||
|
* \param ndata: number of atoms for which to return data (can be all of them)
|
||||||
|
* \param ids: list of *ndata* atom IDs for which to return data
|
||||||
|
* \param data per-atom values packed into a one-dimensional array of length
|
||||||
|
* *ndata* \* *count*.
|
||||||
|
*
|
||||||
|
*/
|
||||||
/* ----------------------------------------------------------------------
|
/* ----------------------------------------------------------------------
|
||||||
Contributing author: Thomas Swinburne (CNRS & CINaM, Marseille, France)
|
Contributing author: Thomas Swinburne (CNRS & CINaM, Marseille, France)
|
||||||
gather the named atom-based entity for all atoms
|
gather the named atom-based entity for all atoms
|
||||||
@ -3884,6 +4004,37 @@ void lammps_gather_subset(void *handle, char *name,
|
|||||||
END_CAPTURE
|
END_CAPTURE
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Scatter the named per-atom, per-atom fix, per-atom compute, or fix property/atom-based
|
||||||
|
* entity in *data* to all processes.
|
||||||
|
*
|
||||||
|
\verbatim embed:rst
|
||||||
|
|
||||||
|
This subroutine takes data stored in a one-dimensional array supplied by the user and scatters
|
||||||
|
them to all atoms on all processes. The data must be ordered by atom ID, with the requirement that
|
||||||
|
the IDs be consecutive. Use :cpp:func:`lammps_scatter_subset` to scatter data for some (or all)
|
||||||
|
atoms, unordered.
|
||||||
|
|
||||||
|
The *data* array needs to be ordered in groups of *count* values, sorted by atom ID (e.g., if
|
||||||
|
*name* is *x* and *count* = 3, then *data* = {x[0][0], x[0][1], x[0][2], x[1][0], x[1][1],
|
||||||
|
x[1][2], x[2][0], :math:`\dots`}); *data* must be of length (*count* :math:`\times` *natoms*).
|
||||||
|
|
||||||
|
This function is not compatible with ``-DLAMMPS_BIGBIG``.
|
||||||
|
|
||||||
|
\endverbatim
|
||||||
|
*
|
||||||
|
* \param handle pointer to a previously created LAMMPS instance
|
||||||
|
* \param name desired quantity (e.g., "x" or "f" for atom properties, "f_id" for per-atom fix
|
||||||
|
* data, "c_id" for per-atom compute data, "d_name" or "i_name" for fix
|
||||||
|
* property/atom vectors with *count* = 1, "d2_name" or "i2_name" for fix
|
||||||
|
* property/atom vectors with *count* > 1)
|
||||||
|
* \param type 0 for ``int`` values, 1 for ``double`` values
|
||||||
|
* \param count number of per-atom values (e.g., 1 for *type* or *charge*,
|
||||||
|
* 3 for *x* or *f*); use *count* = 3 with *image* if you have
|
||||||
|
* a single image flag packed into (*x*,*y*,*z*) components.
|
||||||
|
* \param data per-atom values packed in a one-dimensional array of length
|
||||||
|
* *natoms* \* *count*.
|
||||||
|
*
|
||||||
|
*/
|
||||||
/* ----------------------------------------------------------------------
|
/* ----------------------------------------------------------------------
|
||||||
Contributing author: Thomas Swinburne (CNRS & CINaM, Marseille, France)
|
Contributing author: Thomas Swinburne (CNRS & CINaM, Marseille, France)
|
||||||
scatter the named atom-based entity in data to all atoms
|
scatter the named atom-based entity in data to all atoms
|
||||||
@ -4103,6 +4254,42 @@ void lammps_scatter(void *handle, char *name, int type, int count, void *data)
|
|||||||
END_CAPTURE
|
END_CAPTURE
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Scatter the named per-atom, per-atom fix, per-atom compute, or fix property/atom-based
|
||||||
|
* entities in *data* from a subset of atoms to all processes.
|
||||||
|
*
|
||||||
|
\verbatim embed:rst
|
||||||
|
|
||||||
|
This subroutine takes data stored in a one-dimensional array supplied by the
|
||||||
|
user and scatters them to a subset of atoms on all processes. The array
|
||||||
|
*data* contains data associated with atom IDs, but there is no requirement that
|
||||||
|
the IDs be consecutive, as they are provided in a separate array.
|
||||||
|
Use :cpp:func:`lammps_scatter` to scatter data for all atoms, in order.
|
||||||
|
|
||||||
|
The *data* array needs to be organized in groups of *count* values, with the
|
||||||
|
groups in the same order as the array *ids*. For example, if you want *data*
|
||||||
|
to be the array {x[1][0], x[1][1], x[1][2], x[100][0], x[100][1], x[100][2],
|
||||||
|
x[57][0], x[57][1], x[57][2]}, then *count* = 3, *ndata* = 3, and *ids* would
|
||||||
|
be {1, 100, 57}.
|
||||||
|
|
||||||
|
This function is not compatible with ``-DLAMMPS_BIGBIG``.
|
||||||
|
|
||||||
|
\endverbatim
|
||||||
|
*
|
||||||
|
* \param handle: pointer to a previously created LAMMPS instance
|
||||||
|
* \param name desired quantity (e.g., "x" or "f" for atom properties, "f_id" for per-atom fix
|
||||||
|
* data, "c_id" for per-atom compute data, "d_name" or "i_name" for fix
|
||||||
|
* property/atom vectors with *count* = 1, "d2_name" or "i2_name" for fix
|
||||||
|
* property/atom vectors with *count* > 1)
|
||||||
|
* \param type: 0 for ``int`` values, 1 for ``double`` values
|
||||||
|
* \param count: number of per-atom values (e.g., 1 for *type* or *charge*,
|
||||||
|
* 3 for *x* or *f*); use *count* = 3 with "image" if you want
|
||||||
|
* single image flags unpacked into (*x*,*y*,*z*)
|
||||||
|
* \param ndata: number of atoms listed in *ids* and *data* arrays
|
||||||
|
* \param ids: list of *ndata* atom IDs to scatter data to
|
||||||
|
* \param data per-atom values packed in a 1-dimensional array of length
|
||||||
|
* *ndata* \* *count*.
|
||||||
|
*
|
||||||
|
*/
|
||||||
/* ----------------------------------------------------------------------
|
/* ----------------------------------------------------------------------
|
||||||
Contributing author: Thomas Swinburne (CNRS & CINaM, Marseille, France)
|
Contributing author: Thomas Swinburne (CNRS & CINaM, Marseille, France)
|
||||||
scatter the named atom-based entity in data to a subset of atoms
|
scatter the named atom-based entity in data to a subset of atoms
|
||||||
|
|||||||
Reference in New Issue
Block a user