Merge pull request #1317 from ornladios/adios2-master
USER-ADIOS package with ADIOS 2.x
This commit is contained in:
@ -178,7 +178,7 @@ set(DEFAULT_PACKAGES ASPHERE BODY CLASS2 COLLOID COMPRESS DIPOLE GRANULAR
|
||||
USER-MEAMC USER-MGPT USER-MISC USER-MOFFF USER-MOLFILE USER-NETCDF
|
||||
USER-PHONON USER-PLUMED USER-PTM USER-QTB USER-REAXC USER-SCAFACOS
|
||||
USER-SDPD USER-SMD USER-SMTBQ USER-SPH USER-TALLY USER-UEF USER-VTK
|
||||
USER-QUIP USER-QMMM USER-YAFF)
|
||||
USER-QUIP USER-QMMM USER-YAFF USER-ADIOS)
|
||||
set(ACCEL_PACKAGES USER-OMP KOKKOS OPT USER-INTEL GPU)
|
||||
set(OTHER_PACKAGES CORESHELL QEQ)
|
||||
foreach(PKG ${DEFAULT_PACKAGES})
|
||||
@ -201,6 +201,17 @@ endif()
|
||||
|
||||
include_directories(${LAMMPS_SOURCE_DIR})
|
||||
|
||||
|
||||
if(PKG_USER-ADIOS)
|
||||
# The search for ADIOS2 must come before MPI because
|
||||
# it includes its own MPI search with the latest FindMPI.cmake
|
||||
# script that defines the MPI::MPI_C target
|
||||
enable_language(C)
|
||||
find_package(ADIOS2 REQUIRED)
|
||||
list(APPEND LAMMPS_LINK_LIBS adios2::adios2)
|
||||
endif()
|
||||
|
||||
|
||||
# do MPI detection after language activation, if MPI for these language is required
|
||||
find_package(MPI QUIET)
|
||||
option(BUILD_MPI "Build MPI version" ${MPI_FOUND})
|
||||
@ -613,6 +624,7 @@ if(PKG_USER-NETCDF)
|
||||
add_definitions(-DLMP_HAS_NETCDF -DNC_64BIT_DATA=0x0020)
|
||||
endif()
|
||||
|
||||
|
||||
if(PKG_USER-SMD)
|
||||
option(DOWNLOAD_EIGEN3 "Download Eigen3 instead of using an already installed one)" OFF)
|
||||
if(DOWNLOAD_EIGEN3)
|
||||
@ -1360,6 +1372,7 @@ if(BUILD_EXE)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
|
||||
###############################################################################
|
||||
# Build documentation
|
||||
###############################################################################
|
||||
|
||||
@ -37,6 +37,7 @@ This is the list of packages that may require additional steps.
|
||||
"POEMS"_#poems,
|
||||
"PYTHON"_#python,
|
||||
"VORONOI"_#voronoi,
|
||||
"USER-ADIOS"_#user-adios,
|
||||
"USER-ATC"_#user-atc,
|
||||
"USER-AWPMD"_#user-awpmd,
|
||||
"USER-COLVARS"_#user-colvars,
|
||||
@ -572,6 +573,32 @@ the lib/voronoi/Makefile.lammps file.
|
||||
|
||||
:line
|
||||
|
||||
USER-ADIOS package :h4,link(user-adios)
|
||||
|
||||
The USER-ADIOS package requires the "ADIOS I/O library"_https://github.com/ornladios/ADIOS2,
|
||||
version 2.3.1 or newer. Make sure that you have ADIOS built either with or
|
||||
without MPI to match if you build LAMMPS with or without MPI.
|
||||
ADIOS compilation settings for LAMMPS are automatically detected, if the PATH
|
||||
and LD_LIBRARY_PATH environment variables have been updated for the local ADIOS
|
||||
installation and the instructions below are followed for the respective build systems.
|
||||
|
||||
[CMake build]:
|
||||
|
||||
-D ADIOS2_DIR=path # path is where ADIOS 2.x is installed
|
||||
-D PKG_USER-ADIOS=yes :pre
|
||||
|
||||
[Traditional make]:
|
||||
|
||||
Turn on the USER-ADIOS package before building LAMMPS. If the ADIOS 2.x software is installed in PATH, there is nothing else to do:
|
||||
|
||||
make yes-user-adios :pre
|
||||
|
||||
otherwise, set ADIOS2_DIR environment variable when turning on the package:
|
||||
|
||||
ADIOS2_DIR=path make yes-user-adios # path is where ADIOS 2.x is installed :pre
|
||||
|
||||
:line
|
||||
|
||||
USER-ATC package :h4,link(user-atc)
|
||||
|
||||
The USER-ATC package requires the MANYBODY package also be installed.
|
||||
|
||||
@ -48,6 +48,7 @@ packages:
|
||||
"POEMS"_Build_extras.html#poems,
|
||||
"PYTHON"_Build_extras.html#python,
|
||||
"VORONOI"_Build_extras.html#voronoi,
|
||||
"USER-ADIOS"_Build_extras.html#user-adios,
|
||||
"USER-ATC"_Build_extras.html#user-atc,
|
||||
"USER-AWPMD"_Build_extras.html#user-awpmd,
|
||||
"USER-COLVARS"_Build_extras.html#user-colvars,
|
||||
|
||||
@ -48,6 +48,7 @@ An alphabetic list of all general LAMMPS commands.
|
||||
"dimension"_dimension.html,
|
||||
"displace_atoms"_displace_atoms.html,
|
||||
"dump"_dump.html,
|
||||
"dump adios"_dump_adios.html,
|
||||
"dump image"_dump_image.html,
|
||||
"dump_modify"_dump_modify.html,
|
||||
"dump movie"_dump_image.html,
|
||||
|
||||
@ -63,6 +63,7 @@ as contained in the file name.
|
||||
"SRD"_#PKG-SRD,
|
||||
"VORONOI"_#PKG-VORONOI :tb(c=6,ea=c)
|
||||
|
||||
"USER-ADIOS"_#PKG-USER-ADIOS,
|
||||
"USER-ATC"_#PKG-USER-ATC,
|
||||
"USER-AWPMD"_#PKG-USER-AWPMD,
|
||||
"USER-BOCS"_#PKG-USER-BOCS,
|
||||
@ -974,6 +975,31 @@ examples/voronoi :ul
|
||||
|
||||
:line
|
||||
|
||||
USER-ADIOS package :link(PKG-USER-ADIOS),h4
|
||||
|
||||
[Contents:]
|
||||
|
||||
ADIOS is a high-performance I/O library. This package implements the
|
||||
dump "atom/adios" and dump "custom/adios" commands to write data using
|
||||
the ADIOS library.
|
||||
|
||||
[Authors:] Norbert Podhorszki (ORNL) from the ADIOS developer team.
|
||||
|
||||
[Install:]
|
||||
|
||||
This package has "specific installation
|
||||
instructions"_Build_extras.html#user-adios on the "Build
|
||||
extras"_Build_extras.html doc page.
|
||||
|
||||
[Supporting info:]
|
||||
|
||||
src/USER-ADIOS: filenames -> commands
|
||||
src/USER-ADIOS/README
|
||||
examples/USER/adios
|
||||
https://github.com/ornladios/ADIOS2 :ul
|
||||
|
||||
:line
|
||||
|
||||
USER-ATC package :link(PKG-USER-ATC),h4
|
||||
|
||||
[Contents:]
|
||||
|
||||
@ -38,6 +38,7 @@ int = internal library: provided with LAMMPS, but you may need to build it
|
||||
ext = external library: you will need to download and install it on your machine :ul
|
||||
|
||||
Package, Description, Doc page, Example, Library
|
||||
"USER-ADIOS"_Packages_details.html#PKG-USER-ADIOS, dump output via ADIOS, "dump adios"_dump_adios.html, USER/adios, ext
|
||||
"USER-ATC"_Packages_details.html#PKG-USER-ATC, Atom-to-Continuum coupling, "fix atc"_fix_atc.html, USER/atc, int
|
||||
"USER-AWPMD"_Packages_details.html#PKG-USER-AWPMD, wave packet MD, "pair_style awpmd/cut"_pair_awpmd.html, USER/awpmd, int
|
||||
"USER-BOCS"_Packages_details.html#PKG-USER-BOCS, BOCS bottom up coarse graining, "fix bocs"_fix_bocs.html, USER/bocs, no
|
||||
|
||||
@ -32,6 +32,7 @@ Commands :h1
|
||||
dimension
|
||||
displace_atoms
|
||||
dump
|
||||
dump_adios
|
||||
dump_cfg_uef
|
||||
dump_h5md
|
||||
dump_image
|
||||
|
||||
@ -13,6 +13,7 @@ dump command :h3
|
||||
"dump netcdf"_dump_netcdf.html command :h3
|
||||
"dump image"_dump_image.html command :h3
|
||||
"dump movie"_dump_image.html command :h3
|
||||
"dump adios"_dump_adios.html command :h3
|
||||
|
||||
[Syntax:]
|
||||
|
||||
@ -27,10 +28,12 @@ args = list of arguments for a particular style :l
|
||||
{atom} args = none
|
||||
{atom/gz} args = none
|
||||
{atom/mpiio} args = none
|
||||
{atom/adios} args = none, discussed on "dump adios"_dump_adios.html doc page
|
||||
{cfg} args = same as {custom} args, see below
|
||||
{cfg/gz} args = same as {custom} args, see below
|
||||
{cfg/mpiio} args = same as {custom} args, see below
|
||||
{custom}, {custom/gz}, {custom/mpiio} args = see below
|
||||
{custom/adios} args = same as {custom} args, discussed on "dump adios"_dump_adios.html doc page
|
||||
{dcd} args = none
|
||||
{h5md} args = discussed on "dump h5md"_dump_h5md.html doc page
|
||||
{image} args = discussed on "dump image"_dump_image.html doc page
|
||||
@ -653,7 +656,7 @@ package"_Build_package.html doc page for more info.
|
||||
|
||||
[Related commands:]
|
||||
|
||||
"dump h5md"_dump_h5md.html, "dump image"_dump_image.html,
|
||||
"dump adios"_dump_adios.html "dump h5md"_dump_h5md.html, "dump image"_dump_image.html,
|
||||
"dump molfile"_dump_molfile.html, "dump_modify"_dump_modify.html,
|
||||
"undump"_undump.html
|
||||
|
||||
|
||||
73
doc/src/dump_adios.txt
Normal file
73
doc/src/dump_adios.txt
Normal file
@ -0,0 +1,73 @@
|
||||
"LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc :c
|
||||
|
||||
:link(lws,http://lammps.sandia.gov)
|
||||
:link(ld,Manual.html)
|
||||
:link(lc,Commands_all.html)
|
||||
|
||||
:line
|
||||
|
||||
dump atoms/adios command :h3
|
||||
dump custom/adios command :h3
|
||||
|
||||
[Syntax:]
|
||||
|
||||
dump ID group-ID atoms/adios N file.bp :pre
|
||||
dump ID group-ID custom/adios N file.bp args :pre
|
||||
|
||||
ID = user-assigned name for the dump :ulb,l
|
||||
group-ID = ID of the group of atoms to be imaged :l
|
||||
adios = style of dump command (other styles {atom} or {cfg} or {dcd} or {xtc} or {xyz} or {local} or {custom} are discussed on the "dump"_dump.html doc page) :l
|
||||
N = dump every this many timesteps :l
|
||||
file.bp = name of file/stream to write to :l
|
||||
args = same options as in "{dump custom}"_dump.html command :l
|
||||
:ule
|
||||
|
||||
|
||||
[Examples:]
|
||||
|
||||
dump adios1 all atom/adios 100 atoms.bp
|
||||
dump 4a all custom/adios 100 dump_adios.bp id v_p x y z
|
||||
dump 2 subgroup custom/adios 100 dump_adios.bp mass type xs ys zs vx vy vz :pre
|
||||
|
||||
[Description:]
|
||||
|
||||
Dump a snapshot of atom coordinates every N timesteps in the
|
||||
"ADIOS"_adios based "BP" file format, or using different I/O solutions in ADIOS,
|
||||
to a stream that can be read on-line by another program.
|
||||
ADIOS-BP files are binary, portable and self-describing.
|
||||
|
||||
:link(adios,https://github.com/ornladios/ADIOS2)
|
||||
|
||||
|
||||
[Use from write_dump:]
|
||||
|
||||
It is possible to use these dump styles with the
|
||||
"write_dump"_write_dump.html command. In this case, the sub-intervals
|
||||
must not be set at all. The write_dump command can be used to
|
||||
create a new file at each individual dump.
|
||||
|
||||
dump 4 all atom/adios 100 dump.bp
|
||||
write_dump all atom/adios singledump.bp :pre
|
||||
|
||||
:line
|
||||
|
||||
[Restrictions:]
|
||||
|
||||
The number of atoms per snapshot CAN change with the adios style.
|
||||
When using the ADIOS tool 'bpls' to list the content of a .bp file,
|
||||
bpls will print {__} for the size of the output table indicating that
|
||||
its size is changing every step.
|
||||
|
||||
The {atom/adios} and {custom/adios} dump styles are part of the USER-ADIOS
|
||||
package. They are only enabled if LAMMPS was built with that package.
|
||||
See the "Build package"_Build_package.html doc page for more info.
|
||||
|
||||
|
||||
:line
|
||||
|
||||
[Related commands:]
|
||||
|
||||
"dump"_dump.html, "dump_modify"_dump_modify.html, "undump"_undump.html
|
||||
|
||||
:line
|
||||
|
||||
@ -150,6 +150,7 @@ dielectric.html
|
||||
dimension.html
|
||||
displace_atoms.html
|
||||
dump.html
|
||||
dump_adios.html
|
||||
dump_h5md.html
|
||||
dump_image.html
|
||||
dump_modify.html
|
||||
|
||||
@ -251,6 +251,8 @@ Botero
|
||||
Botu
|
||||
Bouguet
|
||||
boxcolor
|
||||
bp
|
||||
bpls
|
||||
bpclermont
|
||||
br
|
||||
Branduardi
|
||||
@ -2084,6 +2086,7 @@ Pmolrotate
|
||||
Pmoltrans
|
||||
pN
|
||||
png
|
||||
Podhorszki
|
||||
Poiseuille
|
||||
Polak
|
||||
polarizabilities
|
||||
|
||||
41
examples/USER/adios/adios2_config.xml
Normal file
41
examples/USER/adios/adios2_config.xml
Normal file
@ -0,0 +1,41 @@
|
||||
<?xml version="1.0"?>
|
||||
<adios-config>
|
||||
|
||||
<!-- example engines
|
||||
|
||||
<engine type="BPFile">
|
||||
<parameter key="substreams" value="10"/>
|
||||
</engine>
|
||||
|
||||
<engine type="HDF5">
|
||||
|
||||
|
||||
The 'substreams' parameter in BPFile controls how many
|
||||
files on disk are created. This number should be proportional
|
||||
to the number of servers in the parallel file system,
|
||||
NOT to the number of processes.
|
||||
substreams=1 is generally a very inefficient setting for large parallel runs.
|
||||
-->
|
||||
|
||||
<!--====================================================
|
||||
Configuration for the dump atom/adios command
|
||||
====================================================-->
|
||||
|
||||
<io name="atom">
|
||||
<engine type="BPFile">
|
||||
<parameter key="substreams" value="1"/>
|
||||
</engine>
|
||||
</io>
|
||||
|
||||
<!--====================================================
|
||||
Configuration for the dump custom/adios command
|
||||
====================================================-->
|
||||
|
||||
<io name="custom">
|
||||
<engine type="BPFile">
|
||||
<parameter key="substreams" value="1"/>
|
||||
</engine>
|
||||
</io>
|
||||
|
||||
|
||||
</adios-config>
|
||||
57
examples/USER/adios/in.adios_balance
Normal file
57
examples/USER/adios/in.adios_balance
Normal file
@ -0,0 +1,57 @@
|
||||
# 2d circle of particles inside a box with LJ walls
|
||||
|
||||
variable b index 0
|
||||
|
||||
variable x index 50
|
||||
variable y index 20
|
||||
variable d index 20
|
||||
variable v index 5
|
||||
variable w index 2
|
||||
|
||||
units lj
|
||||
dimension 2
|
||||
atom_style atomic
|
||||
boundary f f p
|
||||
|
||||
lattice hex 0.85
|
||||
region box block 0 $x 0 $y -0.5 0.5
|
||||
create_box 1 box
|
||||
region circle sphere $(v_d/2+1) $(v_d/2/sqrt(3.0)+1) 0.0 $(v_d/2)
|
||||
create_atoms 1 region circle
|
||||
mass 1 1.0
|
||||
|
||||
velocity all create 0.5 87287 loop geom
|
||||
velocity all set $v $w 0 sum yes
|
||||
|
||||
pair_style lj/cut 2.5
|
||||
pair_coeff 1 1 10.0 1.0 2.5
|
||||
|
||||
neighbor 0.3 bin
|
||||
neigh_modify delay 0 every 1 check yes
|
||||
|
||||
fix 1 all nve
|
||||
|
||||
fix 2 all wall/lj93 xlo 0.0 1 1 2.5 xhi $x 1 1 2.5
|
||||
fix 3 all wall/lj93 ylo 0.0 1 1 2.5 yhi $y 1 1 2.5
|
||||
|
||||
comm_style tiled
|
||||
fix 10 all balance 50 0.9 rcb
|
||||
|
||||
compute 1 all property/atom proc
|
||||
variable p atom c_1%10
|
||||
dump 2 all custom 50 balance.dump id v_p x y z
|
||||
dump 3 all custom/adios 50 balance_custom.bp id v_p x y z
|
||||
dump 4 all atom/adios 50 balance_atom.bp
|
||||
|
||||
#dump 3 all image 50 image.*.jpg v_p type &
|
||||
# adiam 1.0 view 0 0 zoom 1.8 subbox yes 0.02
|
||||
#variable colors string &
|
||||
# "red green blue yellow white &
|
||||
# purple pink orange lime gray"
|
||||
#dump_modify 3 pad 5 amap 0 10 sa 1 10 ${colors}
|
||||
|
||||
thermo_style custom step temp epair press f_10[3] f_10
|
||||
thermo 100
|
||||
|
||||
run 200
|
||||
write_dump all atom/adios balance_atom_final.bp
|
||||
114
examples/USER/adios/log.balance
Normal file
114
examples/USER/adios/log.balance
Normal file
@ -0,0 +1,114 @@
|
||||
LAMMPS (4 Jan 2019)
|
||||
OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:87)
|
||||
using 1 OpenMP thread(s) per MPI task
|
||||
# 2d circle of particles inside a box with LJ walls
|
||||
|
||||
variable b index 0
|
||||
|
||||
variable x index 50
|
||||
variable y index 20
|
||||
variable d index 20
|
||||
variable v index 5
|
||||
variable w index 2
|
||||
|
||||
units lj
|
||||
dimension 2
|
||||
atom_style atomic
|
||||
boundary f f p
|
||||
|
||||
lattice hex 0.85
|
||||
Lattice spacing in x,y,z = 1.16553 2.01877 1.16553
|
||||
region box block 0 $x 0 $y -0.5 0.5
|
||||
region box block 0 50 0 $y -0.5 0.5
|
||||
region box block 0 50 0 20 -0.5 0.5
|
||||
create_box 1 box
|
||||
Created orthogonal box = (0 0 -0.582767) to (58.2767 40.3753 0.582767)
|
||||
2 by 2 by 1 MPI processor grid
|
||||
region circle sphere $(v_d/2+1) $(v_d/2/sqrt(3.0)+1) 0.0 $(v_d/2)
|
||||
region circle sphere 11 $(v_d/2/sqrt(3.0)+1) 0.0 $(v_d/2)
|
||||
region circle sphere 11 6.7735026918962581988 0.0 $(v_d/2)
|
||||
region circle sphere 11 6.7735026918962581988 0.0 10
|
||||
create_atoms 1 region circle
|
||||
Created 361 atoms
|
||||
Time spent = 0.00171804 secs
|
||||
mass 1 1.0
|
||||
|
||||
velocity all create 0.5 87287 loop geom
|
||||
velocity all set $v $w 0 sum yes
|
||||
velocity all set 5 $w 0 sum yes
|
||||
velocity all set 5 2 0 sum yes
|
||||
|
||||
pair_style lj/cut 2.5
|
||||
pair_coeff 1 1 10.0 1.0 2.5
|
||||
|
||||
neighbor 0.3 bin
|
||||
neigh_modify delay 0 every 1 check yes
|
||||
|
||||
fix 1 all nve
|
||||
|
||||
fix 2 all wall/lj93 xlo 0.0 1 1 2.5 xhi $x 1 1 2.5
|
||||
fix 2 all wall/lj93 xlo 0.0 1 1 2.5 xhi 50 1 1 2.5
|
||||
fix 3 all wall/lj93 ylo 0.0 1 1 2.5 yhi $y 1 1 2.5
|
||||
fix 3 all wall/lj93 ylo 0.0 1 1 2.5 yhi 20 1 1 2.5
|
||||
|
||||
comm_style tiled
|
||||
fix 10 all balance 50 0.9 rcb
|
||||
|
||||
compute 1 all property/atom proc
|
||||
variable p atom c_1%10
|
||||
dump 2 all custom 50 balance.dump id v_p x y z
|
||||
dump 3 all custom/adios 50 balance_custom.bp id v_p x y z
|
||||
dump 4 all atom/adios 50 balance_atom.bp
|
||||
|
||||
#dump 3 all image 50 image.*.jpg v_p type # adiam 1.0 view 0 0 zoom 1.8 subbox yes 0.02
|
||||
#variable colors string # "red green blue yellow white # purple pink orange lime gray"
|
||||
#dump_modify 3 pad 5 amap 0 10 sa 1 10 ${colors}
|
||||
|
||||
thermo_style custom step temp epair press f_10[3] f_10
|
||||
thermo 100
|
||||
|
||||
run 200
|
||||
Neighbor list info ...
|
||||
update every 1 steps, delay 0 steps, check yes
|
||||
max neighbors/atom: 2000, page size: 100000
|
||||
master list distance cutoff = 2.8
|
||||
ghost atom cutoff = 2.8
|
||||
binsize = 1.4, bins = 42 29 1
|
||||
1 neighbor lists, perpetual/occasional/extra = 1 0 0
|
||||
(1) pair lj/cut, perpetual
|
||||
attributes: half, newton on
|
||||
pair build: half/bin/atomonly/newton
|
||||
stencil: half/bin/2d/newton
|
||||
bin: standard
|
||||
Per MPI rank memory allocation (min/avg/max) = 4.926 | 4.933 | 4.944 Mbytes
|
||||
Step Temp E_pair Press f_10[3] f_10
|
||||
0 25.701528 -29.143179 -1.2407285 3.2354571 1.0526316
|
||||
100 26.269576 -29.713313 7.9052334 1.2742382 1.0304709
|
||||
200 26.368336 -29.809962 1.6412462 1.2520776 1.0083102
|
||||
Loop time of 0.0992351 on 4 procs for 200 steps with 361 atoms
|
||||
|
||||
Performance: 870660.046 tau/day, 2015.417 timesteps/s
|
||||
32.2% CPU use with 4 MPI tasks x 1 OpenMP threads
|
||||
|
||||
MPI task timing breakdown:
|
||||
Section | min time | avg time | max time |%varavg| %total
|
||||
---------------------------------------------------------------
|
||||
Pair | 0.0078368 | 0.0081607 | 0.0085468 | 0.3 | 8.22
|
||||
Neigh | 0.002804 | 0.0045915 | 0.0092173 | 3.9 | 4.63
|
||||
Comm | 0.044407 | 0.05352 | 0.062051 | 3.0 | 53.93
|
||||
Output | 0.011406 | 0.012025 | 0.01342 | 0.7 | 12.12
|
||||
Modify | 0.006305 | 0.0064294 | 0.0066617 | 0.2 | 6.48
|
||||
Other | | 0.01451 | | | 14.62
|
||||
|
||||
Nlocal: 90.25 ave 91 max 90 min
|
||||
Histogram: 3 0 0 0 0 0 0 0 0 1
|
||||
Nghost: 58.25 ave 64 max 51 min
|
||||
Histogram: 1 0 0 0 0 0 2 0 0 1
|
||||
Neighs: 730.75 ave 801 max 671 min
|
||||
Histogram: 1 0 1 0 0 1 0 0 0 1
|
||||
|
||||
Total # of neighbors = 2923
|
||||
Ave neighs/atom = 8.09695
|
||||
Neighbor list builds = 60
|
||||
Dangerous builds = 0
|
||||
Total wall time: 0:00:00
|
||||
@ -58,7 +58,7 @@ PACKAGE = asphere body class2 colloid compress coreshell dipole gpu \
|
||||
molecule mpiio mscg opt peri poems \
|
||||
python qeq replica rigid shock snap spin srd voronoi
|
||||
|
||||
PACKUSER = user-atc user-awpmd user-bocs user-cgdna user-cgsdk user-colvars \
|
||||
PACKUSER = user-adios user-atc user-awpmd user-bocs user-cgdna user-cgsdk user-colvars \
|
||||
user-diffraction user-dpd user-drude user-eff user-fep user-h5md \
|
||||
user-intel user-lb user-manifold user-meamc user-meso \
|
||||
user-mgpt user-misc user-mofff user-molfile \
|
||||
@ -68,7 +68,7 @@ PACKUSER = user-atc user-awpmd user-bocs user-cgdna user-cgsdk user-colvars \
|
||||
|
||||
PACKLIB = compress gpu kim kokkos latte message mpiio mscg poems \
|
||||
python voronoi \
|
||||
user-atc user-awpmd user-colvars user-h5md user-lb user-molfile \
|
||||
user-adios user-atc user-awpmd user-colvars user-h5md user-lb user-molfile \
|
||||
user-netcdf user-plumed user-qmmm user-quip user-scafacos \
|
||||
user-smd user-vtk
|
||||
|
||||
@ -77,7 +77,7 @@ PACKSYS = compress mpiio python user-lb
|
||||
PACKINT = gpu kokkos message poems user-atc user-awpmd user-colvars
|
||||
|
||||
PACKEXT = kim latte mscg voronoi \
|
||||
user-h5md user-molfile user-netcdf user-plumed user-qmmm user-quip \
|
||||
user-adios user-h5md user-molfile user-netcdf user-plumed user-qmmm user-quip \
|
||||
user-smd user-vtk
|
||||
|
||||
PACKALL = $(PACKAGE) $(PACKUSER)
|
||||
|
||||
93
src/USER-ADIOS/Install.sh
Normal file
93
src/USER-ADIOS/Install.sh
Normal file
@ -0,0 +1,93 @@
|
||||
# Install/unInstall package files in LAMMPS
|
||||
# mode = 0/1/2 for uninstall/install/update
|
||||
|
||||
mode=$1
|
||||
|
||||
# arg1 = file, arg2 = file it depends on
|
||||
|
||||
action () {
|
||||
if (test $mode = 0) then
|
||||
rm -f ../$1
|
||||
elif (! cmp -s $1 ../$1) then
|
||||
if (test -z "$2" || test -e ../$2) then
|
||||
cp $1 ..
|
||||
if (test $mode = 2) then
|
||||
echo " updating src/$1"
|
||||
fi
|
||||
fi
|
||||
elif (test -n "$2") then
|
||||
if (test ! -e ../$2) then
|
||||
rm -f ../$1
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
for file in *.cpp *.h; do
|
||||
action $file
|
||||
done
|
||||
|
||||
# edit 2 Makefile.package files to include/exclude package info
|
||||
|
||||
if (test $1 = 1) then
|
||||
|
||||
CONFIGSCRIPT=none
|
||||
if ( test `which adios2-config 2>> /dev/null` ) then
|
||||
CONFIGSCRIPT=adios2-config
|
||||
elif ( ! test -z "$ADIOS2_DIR" ) then
|
||||
if ( test `which $ADIOS2_DIR/bin/adios2-config` ) then
|
||||
CONFIGSCRIPT=$ADIOS2_DIR/bin/adios2-config
|
||||
else
|
||||
echo "ERROR: ADIOS2_DIR environment variable is set but" \
|
||||
"\$ADIOS2_DIR/bin/adios2-config does not exist"
|
||||
fi
|
||||
elif ( ! test -z "$ADIOS_DIR" ) then
|
||||
if ( test `which $ADIOS_DIR/bin/adios2-config` ) then
|
||||
CONFIGSCRIPT=$ADIOS_DIR/bin/adios2-config
|
||||
else
|
||||
echo "ERROR: ADIOS_DIR environment variable is set but" \
|
||||
"\$ADIOS_DIR/bin/adios2-config does not exist"
|
||||
fi
|
||||
else
|
||||
echo "ERROR: ADIOS2_DIR environment variable must point to ADIOS 2.x" \
|
||||
"installation directory or adios2-config should be in PATH"
|
||||
fi
|
||||
|
||||
if [ "$CONFIGSCRIPT" != "none" ]; then
|
||||
ADIOS2_INC=`$CONFIGSCRIPT --cxx-flags`
|
||||
ADIOS2_LIB=`$CONFIGSCRIPT --cxx-libs`
|
||||
|
||||
echo "adios_SYSINC=${ADIOS2_INC}
|
||||
adios_SYSLIB=${ADIOS2_LIB}
|
||||
" > Makefile.lammps
|
||||
|
||||
|
||||
if (test -e ../Makefile.package) then
|
||||
sed -i -e 's/[^ \t]*adios[^ \t]* //g' ../Makefile.package
|
||||
sed -i -e '/^adios_SYS.*$/d' ../Makefile.package
|
||||
sed -i -e 's|^PKG_SYSINC =[ \t]*|&$(adios_SYSINC) |' ../Makefile.package
|
||||
sed -i -e 's|^PKG_SYSLIB =[ \t]*|&$(adios_SYSLIB) |' ../Makefile.package
|
||||
fi
|
||||
|
||||
if (test -e ../Makefile.package.settings) then
|
||||
sed -i -e '/^include.*ADIOS.*$/d' ../Makefile.package.settings
|
||||
# multiline form needed for BSD sed on Macs
|
||||
sed -i -e '4 i \
|
||||
include ../USER-ADIOS/Makefile.lammps
|
||||
' ../Makefile.package.settings
|
||||
fi
|
||||
fi
|
||||
|
||||
elif (test $1 = 0) then
|
||||
|
||||
if (test -e ../Makefile.package) then
|
||||
sed -i -e 's/[^ \t]*adios[^ \t]* //g' ../Makefile.package
|
||||
sed -i -e '/^adios_SYS.*$/d' ../Makefile.package
|
||||
fi
|
||||
|
||||
if (test -e ../Makefile.package.settings) then
|
||||
sed -i -e '/^include.*ADIOS.*$/d' ../Makefile.package.settings
|
||||
fi
|
||||
|
||||
rm -f Makefile.lammps
|
||||
|
||||
fi
|
||||
16
src/USER-ADIOS/README
Normal file
16
src/USER-ADIOS/README
Normal file
@ -0,0 +1,16 @@
|
||||
This package provides the adios dump and restart styles.
|
||||
|
||||
See the doc page for the "dump adios" and "restart adios" commands.
|
||||
These styles require having ADIOS 2.x itself installed on your system.
|
||||
|
||||
Configure LAMMPS with CMake
|
||||
a. set the environment variable
|
||||
ADIOS2_DIR
|
||||
to the ADIOS 2.x installation path
|
||||
b. use the cmake option
|
||||
-D PKG_USER-ADIOS=yes
|
||||
|
||||
The person who created this package is Norbert Podhorszki (Oak Ridge National Laboratory);
|
||||
If you need help, please submit a ticket at the OLCF ticket user support mentioning his name in the ticket.
|
||||
https://www.olcf.ornl.gov/support/submit-ticket
|
||||
|
||||
339
src/USER-ADIOS/dump_atom_adios.cpp
Normal file
339
src/USER-ADIOS/dump_atom_adios.cpp
Normal file
@ -0,0 +1,339 @@
|
||||
/* ----------------------------------------------------------------------
|
||||
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
|
||||
http://lammps.sandia.gov, Sandia National Laboratories
|
||||
Steve Plimpton, sjplimp@sandia.gov
|
||||
|
||||
Copyright (2003) Sandia Corporation. Under the terms of Contract
|
||||
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
|
||||
certain rights in this software. This software is distributed under
|
||||
the GNU General Public License.
|
||||
|
||||
See the README file in the top-level LAMMPS directory.
|
||||
------------------------------------------------------------------------- */
|
||||
|
||||
/* ----------------------------------------------------------------------
|
||||
Contributing author: Norbert Podhorszki (ORNL)
|
||||
------------------------------------------------------------------------- */
|
||||
|
||||
#include "dump_atom_adios.h"
|
||||
#include "atom.h"
|
||||
#include "domain.h"
|
||||
#include "error.h"
|
||||
#include "group.h"
|
||||
#include "memory.h"
|
||||
#include "universe.h"
|
||||
#include "update.h"
|
||||
#include <cstring>
|
||||
|
||||
#include "adios2.h"
|
||||
|
||||
using namespace LAMMPS_NS;
|
||||
|
||||
#define MAX_TEXT_HEADER_SIZE 4096
|
||||
#define DUMP_BUF_CHUNK_SIZE 16384
|
||||
#define DUMP_BUF_INCREMENT_SIZE 4096
|
||||
|
||||
namespace LAMMPS_NS
|
||||
{
|
||||
class DumpAtomADIOSInternal
|
||||
{
|
||||
|
||||
public:
|
||||
DumpAtomADIOSInternal(){};
|
||||
~DumpAtomADIOSInternal() = default;
|
||||
|
||||
// name of adios group, referrable in adios2_config.xml
|
||||
const std::string ioName = "atom";
|
||||
adios2::ADIOS *ad = nullptr; // adios object
|
||||
adios2::IO io; // adios group of variables and attributes in this dump
|
||||
adios2::Engine fh; // adios file/stream handle object
|
||||
// one ADIOS output variable we need to change every step
|
||||
adios2::Variable<double> varAtoms;
|
||||
};
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------------- */
|
||||
|
||||
DumpAtomADIOS::DumpAtomADIOS(LAMMPS *lmp, int narg, char **arg)
|
||||
: DumpAtom(lmp, narg, arg)
|
||||
{
|
||||
internal = new DumpAtomADIOSInternal();
|
||||
internal->ad =
|
||||
new adios2::ADIOS("adios2_config.xml", world, adios2::DebugON);
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------------- */
|
||||
|
||||
DumpAtomADIOS::~DumpAtomADIOS()
|
||||
{
|
||||
if (internal->fh) {
|
||||
internal->fh.Close();
|
||||
}
|
||||
delete internal->ad;
|
||||
delete internal;
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------------- */
|
||||
|
||||
void DumpAtomADIOS::openfile()
|
||||
{
|
||||
if (multifile) {
|
||||
// if one file per timestep, replace '*' with current timestep
|
||||
char *filestar = strdup(filename);
|
||||
char *filecurrent = new char[strlen(filestar) + 16];
|
||||
char *ptr = strchr(filestar, '*');
|
||||
*ptr = '\0';
|
||||
if (padflag == 0)
|
||||
snprintf(filecurrent, sizeof(filecurrent), "%s" BIGINT_FORMAT "%s",
|
||||
filestar, update->ntimestep, ptr + 1);
|
||||
else {
|
||||
char bif[8], pad[16];
|
||||
strcpy(bif, BIGINT_FORMAT);
|
||||
snprintf(pad, sizeof(pad), "%%s%%0%d%s%%s", padflag, &bif[1]);
|
||||
snprintf(filecurrent, sizeof(filecurrent), pad, filestar,
|
||||
update->ntimestep, ptr + 1);
|
||||
}
|
||||
internal->fh =
|
||||
internal->io.Open(filecurrent, adios2::Mode::Write, world);
|
||||
if (!internal->fh) {
|
||||
char str[128];
|
||||
snprintf(str, sizeof(str), "Cannot open dump file %s", filecurrent);
|
||||
error->one(FLERR, str);
|
||||
}
|
||||
free(filestar);
|
||||
delete[] filecurrent;
|
||||
} else {
|
||||
if (!singlefile_opened) {
|
||||
internal->fh =
|
||||
internal->io.Open(filename, adios2::Mode::Write, world);
|
||||
if (!internal->fh) {
|
||||
char str[128];
|
||||
snprintf(str, sizeof(str), "Cannot open dump file %s",
|
||||
filename);
|
||||
error->one(FLERR, str);
|
||||
}
|
||||
singlefile_opened = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------------- */
|
||||
|
||||
void DumpAtomADIOS::write()
|
||||
{
|
||||
if (domain->triclinic == 0) {
|
||||
boxxlo = domain->boxlo[0];
|
||||
boxxhi = domain->boxhi[0];
|
||||
boxylo = domain->boxlo[1];
|
||||
boxyhi = domain->boxhi[1];
|
||||
boxzlo = domain->boxlo[2];
|
||||
boxzhi = domain->boxhi[2];
|
||||
} else {
|
||||
boxxlo = domain->boxlo_bound[0];
|
||||
boxxhi = domain->boxhi_bound[0];
|
||||
boxylo = domain->boxlo_bound[1];
|
||||
boxyhi = domain->boxhi_bound[1];
|
||||
boxzlo = domain->boxlo_bound[2];
|
||||
boxzhi = domain->boxhi_bound[2];
|
||||
boxxy = domain->xy;
|
||||
boxxz = domain->xz;
|
||||
boxyz = domain->yz;
|
||||
}
|
||||
|
||||
// nme = # of dump lines this proc contributes to dump
|
||||
|
||||
nme = count();
|
||||
|
||||
// ntotal = total # of atoms in snapshot
|
||||
// atomOffset = sum of # of atoms up to this proc (exclusive prefix sum)
|
||||
|
||||
bigint bnme = nme;
|
||||
MPI_Allreduce(&bnme, &ntotal, 1, MPI_LMP_BIGINT, MPI_SUM, world);
|
||||
|
||||
bigint atomOffset; // sum of all atoms on processes 0..me-1
|
||||
MPI_Scan(&bnme, &atomOffset, 1, MPI_LMP_BIGINT, MPI_SUM, world);
|
||||
atomOffset -= nme; // exclusive prefix sum needed
|
||||
|
||||
// Now we know the global size and the local subset size and offset
|
||||
// of the atoms table
|
||||
size_t nAtomsGlobal = static_cast<size_t>(ntotal);
|
||||
size_t startRow = static_cast<size_t>(atomOffset);
|
||||
size_t nAtomsLocal = static_cast<size_t>(nme);
|
||||
size_t nColumns = static_cast<size_t>(size_one);
|
||||
internal->varAtoms.SetShape({nAtomsGlobal, nColumns});
|
||||
internal->varAtoms.SetSelection({{startRow, 0}, {nAtomsLocal, nColumns}});
|
||||
|
||||
// insure buf is sized for packing
|
||||
// adios does not limit per-process data size so nme*size_one is not
|
||||
// constrained to int
|
||||
// if sorting on IDs also request ID list from pack()
|
||||
// sort buf as needed
|
||||
|
||||
if (nme > maxbuf) {
|
||||
maxbuf = nme;
|
||||
memory->destroy(buf);
|
||||
memory->create(buf, (maxbuf * size_one), "dump:buf");
|
||||
}
|
||||
if (sort_flag && sortcol == 0 && nme > maxids) {
|
||||
maxids = nme;
|
||||
memory->destroy(ids);
|
||||
memory->create(ids, maxids, "dump:ids");
|
||||
}
|
||||
|
||||
if (sort_flag && sortcol == 0)
|
||||
pack(ids);
|
||||
else
|
||||
pack(NULL);
|
||||
if (sort_flag)
|
||||
sort();
|
||||
|
||||
openfile();
|
||||
internal->fh.BeginStep();
|
||||
// write info on data as scalars (by me==0)
|
||||
if (me == 0) {
|
||||
internal->fh.Put<uint64_t>("ntimestep", update->ntimestep);
|
||||
internal->fh.Put<int>("nprocs", nprocs);
|
||||
|
||||
internal->fh.Put<double>("boxxlo", boxxlo);
|
||||
internal->fh.Put<double>("boxxhi", boxxhi);
|
||||
internal->fh.Put<double>("boxylo", boxylo);
|
||||
internal->fh.Put<double>("boxyhi", boxyhi);
|
||||
internal->fh.Put<double>("boxzlo", boxzlo);
|
||||
internal->fh.Put<double>("boxzhi", boxzhi);
|
||||
|
||||
if (domain->triclinic) {
|
||||
internal->fh.Put<double>("boxxy", boxxy);
|
||||
internal->fh.Put<double>("boxxz", boxxz);
|
||||
internal->fh.Put<double>("boxyz", boxyz);
|
||||
}
|
||||
}
|
||||
// Everyone needs to write scalar variables that are used as dimensions and
|
||||
// offsets of arrays
|
||||
internal->fh.Put<uint64_t>("natoms", ntotal);
|
||||
internal->fh.Put<int>("ncolumns", size_one);
|
||||
internal->fh.Put<uint64_t>("nme", bnme);
|
||||
internal->fh.Put<uint64_t>("offset", atomOffset);
|
||||
// now write the atoms
|
||||
internal->fh.Put<double>(internal->varAtoms, buf);
|
||||
internal->fh.EndStep(); // I/O will happen now...
|
||||
|
||||
if (multifile) {
|
||||
internal->fh.Close();
|
||||
}
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------------- */
|
||||
|
||||
void DumpAtomADIOS::init_style()
|
||||
{
|
||||
if (image_flag == 0)
|
||||
size_one = 5;
|
||||
else
|
||||
size_one = 8;
|
||||
|
||||
// setup boundary string
|
||||
|
||||
domain->boundary_string(boundstr);
|
||||
|
||||
// remove % from filename since ADIOS always writes a global file with
|
||||
// data/metadata
|
||||
int len = strlen(filename);
|
||||
char *ptr = strchr(filename, '%');
|
||||
if (ptr) {
|
||||
*ptr = '\0';
|
||||
char *s = new char[len - 1];
|
||||
snprintf(s, sizeof(s), "%s%s", filename, ptr + 1);
|
||||
strncpy(filename, s, len);
|
||||
}
|
||||
|
||||
// setup column string
|
||||
|
||||
if (scale_flag == 0 && image_flag == 0)
|
||||
columns = (char *)"id type x y z";
|
||||
else if (scale_flag == 0 && image_flag == 1)
|
||||
columns = (char *)"id type x y z ix iy iz";
|
||||
else if (scale_flag == 1 && image_flag == 0)
|
||||
columns = (char *)"id type xs ys zs";
|
||||
else if (scale_flag == 1 && image_flag == 1)
|
||||
columns = (char *)"id type xs ys zs ix iy iz";
|
||||
|
||||
// setup function ptrs
|
||||
|
||||
if (scale_flag == 1 && image_flag == 0 && domain->triclinic == 0)
|
||||
pack_choice = &DumpAtomADIOS::pack_scale_noimage;
|
||||
else if (scale_flag == 1 && image_flag == 1 && domain->triclinic == 0)
|
||||
pack_choice = &DumpAtomADIOS::pack_scale_image;
|
||||
else if (scale_flag == 1 && image_flag == 0 && domain->triclinic == 1)
|
||||
pack_choice = &DumpAtomADIOS::pack_scale_noimage_triclinic;
|
||||
else if (scale_flag == 1 && image_flag == 1 && domain->triclinic == 1)
|
||||
pack_choice = &DumpAtomADIOS::pack_scale_image_triclinic;
|
||||
else if (scale_flag == 0 && image_flag == 0)
|
||||
pack_choice = &DumpAtomADIOS::pack_noscale_noimage;
|
||||
else if (scale_flag == 0 && image_flag == 1)
|
||||
pack_choice = &DumpAtomADIOS::pack_noscale_image;
|
||||
|
||||
/* Define the group of variables for the atom style here since it's a fixed
|
||||
* set */
|
||||
internal->io = internal->ad->DeclareIO(internal->ioName);
|
||||
if (!internal->io.InConfigFile()) {
|
||||
// if not defined by user, we can change the default settings
|
||||
// BPFile is the default writer
|
||||
internal->io.SetEngine("BPFile");
|
||||
int num_aggregators = multiproc;
|
||||
if (num_aggregators == 0)
|
||||
num_aggregators = 1;
|
||||
char nstreams[128];
|
||||
snprintf(nstreams, sizeof(nstreams), "%d", num_aggregators);
|
||||
internal->io.SetParameters({{"substreams", nstreams}});
|
||||
if (me == 0 && screen)
|
||||
fprintf(
|
||||
screen,
|
||||
"ADIOS method for %s is n-to-m (aggregation with %s writers)\n",
|
||||
filename, nstreams);
|
||||
}
|
||||
|
||||
internal->io.DefineVariable<uint64_t>("ntimestep");
|
||||
internal->io.DefineVariable<uint64_t>("natoms");
|
||||
|
||||
internal->io.DefineVariable<int>("nprocs");
|
||||
internal->io.DefineVariable<int>("ncolumns");
|
||||
|
||||
internal->io.DefineVariable<double>("boxxlo");
|
||||
internal->io.DefineVariable<double>("boxxhi");
|
||||
internal->io.DefineVariable<double>("boxylo");
|
||||
internal->io.DefineVariable<double>("boxyhi");
|
||||
internal->io.DefineVariable<double>("boxzlo");
|
||||
internal->io.DefineVariable<double>("boxzhi");
|
||||
|
||||
internal->io.DefineVariable<double>("boxxy");
|
||||
internal->io.DefineVariable<double>("boxxz");
|
||||
internal->io.DefineVariable<double>("boxyz");
|
||||
|
||||
internal->io.DefineAttribute<int>("triclinic", domain->triclinic);
|
||||
internal->io.DefineAttribute<int>("scaled", scale_flag);
|
||||
internal->io.DefineAttribute<int>("image", image_flag);
|
||||
|
||||
int *boundaryptr = reinterpret_cast<int *>(domain->boundary);
|
||||
internal->io.DefineAttribute<int>("boundary", boundaryptr, 6);
|
||||
|
||||
internal->io.DefineAttribute<std::string>("columns", columns);
|
||||
internal->io.DefineAttribute<std::string>("boundarystr", boundstr);
|
||||
internal->io.DefineAttribute<std::string>("LAMMPS/dump_style", "atom");
|
||||
internal->io.DefineAttribute<std::string>("LAMMPS/version",
|
||||
universe->version);
|
||||
internal->io.DefineAttribute<std::string>("LAMMPS/num_ver",
|
||||
universe->num_ver);
|
||||
|
||||
internal->io.DefineVariable<uint64_t>(
|
||||
"nme", {adios2::LocalValueDim}); // local dimension variable
|
||||
internal->io.DefineVariable<uint64_t>(
|
||||
"offset", {adios2::LocalValueDim}); // local dimension variable
|
||||
|
||||
// atom table size is not known at the moment
|
||||
// it will be correctly defined at the moment of write
|
||||
size_t UnknownSizeYet = 1;
|
||||
size_t nColumns = static_cast<size_t>(size_one);
|
||||
internal->varAtoms = internal->io.DefineVariable<double>(
|
||||
"atoms", {UnknownSizeYet, nColumns}, {UnknownSizeYet, 0},
|
||||
{UnknownSizeYet, nColumns});
|
||||
}
|
||||
62
src/USER-ADIOS/dump_atom_adios.h
Normal file
62
src/USER-ADIOS/dump_atom_adios.h
Normal file
@ -0,0 +1,62 @@
|
||||
/* -*- c++ -*- ----------------------------------------------------------
|
||||
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
|
||||
http://lammps.sandia.gov, Sandia National Laboratories
|
||||
Steve Plimpton, sjplimp@sandia.gov
|
||||
|
||||
Copyright (2003) Sandia Corporation. Under the terms of Contract
|
||||
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
|
||||
certain rights in this software. This software is distributed under
|
||||
the GNU General Public License.
|
||||
|
||||
See the README file in the top-level LAMMPS directory.
|
||||
------------------------------------------------------------------------- */
|
||||
|
||||
#ifdef DUMP_CLASS
|
||||
// clang-format off
|
||||
DumpStyle(atom/adios, DumpAtomADIOS)
|
||||
// clang-format on
|
||||
#else
|
||||
|
||||
#ifndef LMP_DUMP_ATOM_ADIOS_H
|
||||
#define LMP_DUMP_ATOM_ADIOS_H
|
||||
|
||||
#include "dump_atom.h"
|
||||
|
||||
namespace LAMMPS_NS
|
||||
{
|
||||
|
||||
class DumpAtomADIOSInternal;
|
||||
|
||||
class DumpAtomADIOS : public DumpAtom
|
||||
{
|
||||
|
||||
public:
|
||||
DumpAtomADIOS(class LAMMPS *, int, char **);
|
||||
virtual ~DumpAtomADIOS();
|
||||
|
||||
protected:
|
||||
virtual void openfile();
|
||||
virtual void write();
|
||||
virtual void init_style();
|
||||
|
||||
private:
|
||||
DumpAtomADIOSInternal *internal;
|
||||
};
|
||||
}
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* ERROR/WARNING messages:
|
||||
|
||||
E: Cannot open dump file %s
|
||||
|
||||
The output file for the dump command cannot be opened. Check that the
|
||||
path and name are correct.
|
||||
|
||||
E: Too much per-proc info for dump
|
||||
|
||||
Number of local atoms times number of columns must fit in a 32-bit
|
||||
integer for dump.
|
||||
|
||||
*/
|
||||
434
src/USER-ADIOS/dump_custom_adios.cpp
Normal file
434
src/USER-ADIOS/dump_custom_adios.cpp
Normal file
@ -0,0 +1,434 @@
|
||||
/* ----------------------------------------------------------------------
|
||||
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
|
||||
http://lammps.sandia.gov, Sandia National Laboratories
|
||||
Steve Plimpton, sjplimp@sandia.gov
|
||||
|
||||
Copyright (2003) Sandia Corporation. Under the terms of Contract
|
||||
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
|
||||
certain rights in this software. This software is distributed under
|
||||
the GNU General Public License.
|
||||
|
||||
See the README file in the top-level LAMMPS directory.
|
||||
------------------------------------------------------------------------- */
|
||||
|
||||
/* ----------------------------------------------------------------------
|
||||
Contributing author: Norbert Podhorszki (ORNL)
|
||||
------------------------------------------------------------------------- */
|
||||
|
||||
#include "dump_custom_adios.h"
|
||||
#include "atom.h"
|
||||
#include "compute.h"
|
||||
#include "domain.h"
|
||||
#include "error.h"
|
||||
#include "fix.h"
|
||||
#include "force.h"
|
||||
#include "group.h"
|
||||
#include "input.h"
|
||||
#include "memory.h"
|
||||
#include "modify.h"
|
||||
#include "region.h"
|
||||
#include "universe.h"
|
||||
#include "update.h"
|
||||
#include "variable.h"
|
||||
#include <cmath>
|
||||
#include <cstring>
|
||||
|
||||
#include "adios2.h"
|
||||
|
||||
using namespace LAMMPS_NS;
|
||||
|
||||
#define MAX_TEXT_HEADER_SIZE 4096
|
||||
#define DUMP_BUF_CHUNK_SIZE 16384
|
||||
#define DUMP_BUF_INCREMENT_SIZE 4096
|
||||
|
||||
enum {
|
||||
ID,
|
||||
MOL,
|
||||
TYPE,
|
||||
ELEMENT,
|
||||
MASS,
|
||||
X,
|
||||
Y,
|
||||
Z,
|
||||
XS,
|
||||
YS,
|
||||
ZS,
|
||||
XSTRI,
|
||||
YSTRI,
|
||||
ZSTRI,
|
||||
XU,
|
||||
YU,
|
||||
ZU,
|
||||
XUTRI,
|
||||
YUTRI,
|
||||
ZUTRI,
|
||||
XSU,
|
||||
YSU,
|
||||
ZSU,
|
||||
XSUTRI,
|
||||
YSUTRI,
|
||||
ZSUTRI,
|
||||
IX,
|
||||
IY,
|
||||
IZ,
|
||||
VX,
|
||||
VY,
|
||||
VZ,
|
||||
FX,
|
||||
FY,
|
||||
FZ,
|
||||
Q,
|
||||
MUX,
|
||||
MUY,
|
||||
MUZ,
|
||||
MU,
|
||||
RADIUS,
|
||||
DIAMETER,
|
||||
OMEGAX,
|
||||
OMEGAY,
|
||||
OMEGAZ,
|
||||
ANGMOMX,
|
||||
ANGMOMY,
|
||||
ANGMOMZ,
|
||||
TQX,
|
||||
TQY,
|
||||
TQZ,
|
||||
SPIN,
|
||||
ERADIUS,
|
||||
ERVEL,
|
||||
ERFORCE,
|
||||
COMPUTE,
|
||||
FIX,
|
||||
VARIABLE
|
||||
};
|
||||
enum { LT, LE, GT, GE, EQ, NEQ };
|
||||
enum { INT, DOUBLE, STRING, BIGINT }; // same as in DumpCustom
|
||||
|
||||
namespace LAMMPS_NS
|
||||
{
|
||||
class DumpCustomADIOSInternal
|
||||
{
|
||||
|
||||
public:
|
||||
DumpCustomADIOSInternal(){};
|
||||
~DumpCustomADIOSInternal() = default;
|
||||
|
||||
// name of adios group, referrable in adios2_config.xml
|
||||
const std::string ioName = "custom";
|
||||
adios2::ADIOS *ad = nullptr; // adios object
|
||||
adios2::IO io; // adios group of variables and attributes in this dump
|
||||
adios2::Engine fh; // adios file/stream handle object
|
||||
// one ADIOS output variable we need to change every step
|
||||
adios2::Variable<double> varAtoms;
|
||||
// list of column names for the atom table
|
||||
// (individual list of 'columns' string)
|
||||
std::vector<std::string> columnNames;
|
||||
};
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------------- */
|
||||
|
||||
DumpCustomADIOS::DumpCustomADIOS(LAMMPS *lmp, int narg, char **arg)
|
||||
: DumpCustom(lmp, narg, arg)
|
||||
{
|
||||
internal = new DumpCustomADIOSInternal();
|
||||
internal->ad =
|
||||
new adios2::ADIOS("adios2_config.xml", world, adios2::DebugON);
|
||||
|
||||
// if (screen) fprintf(screen, "DumpCustomADIOS constructor: nvariable=%d
|
||||
// id_variable=%p, variables=%p, nfield=%d, earg=%p\n", nvariable,
|
||||
// id_variable, variable, nfield, earg);
|
||||
internal->columnNames.reserve(nfield);
|
||||
for (int i = 0; i < nfield; ++i) {
|
||||
internal->columnNames.push_back(earg[i]);
|
||||
// if (screen) fprintf(screen, "earg[%d] = '%s'\n", i, earg[i]);
|
||||
}
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------------- */
|
||||
|
||||
DumpCustomADIOS::~DumpCustomADIOS()
|
||||
{
|
||||
internal->columnNames.clear();
|
||||
if (internal->fh) {
|
||||
internal->fh.Close();
|
||||
}
|
||||
delete internal->ad;
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------------- */
|
||||
|
||||
void DumpCustomADIOS::openfile()
|
||||
{
|
||||
if (multifile) {
|
||||
// if one file per timestep, replace '*' with current timestep
|
||||
char *filestar = strdup(filename);
|
||||
char *filecurrent = new char[strlen(filestar) + 16];
|
||||
char *ptr = strchr(filestar, '*');
|
||||
*ptr = '\0';
|
||||
if (padflag == 0)
|
||||
sprintf(filecurrent, "%s" BIGINT_FORMAT "%s", filestar,
|
||||
update->ntimestep, ptr + 1);
|
||||
else {
|
||||
char bif[8], pad[16];
|
||||
strcpy(bif, BIGINT_FORMAT);
|
||||
sprintf(pad, "%%s%%0%d%s%%s", padflag, &bif[1]);
|
||||
sprintf(filecurrent, pad, filestar, update->ntimestep, ptr + 1);
|
||||
}
|
||||
internal->fh =
|
||||
internal->io.Open(filecurrent, adios2::Mode::Write, world);
|
||||
if (!internal->fh) {
|
||||
char str[128];
|
||||
sprintf(str, "Cannot open dump file %s", filecurrent);
|
||||
error->one(FLERR, str);
|
||||
}
|
||||
free(filestar);
|
||||
delete[] filecurrent;
|
||||
} else {
|
||||
if (!singlefile_opened) {
|
||||
internal->fh =
|
||||
internal->io.Open(filename, adios2::Mode::Write, world);
|
||||
if (!internal->fh) {
|
||||
char str[128];
|
||||
sprintf(str, "Cannot open dump file %s", filename);
|
||||
error->one(FLERR, str);
|
||||
}
|
||||
singlefile_opened = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------------- */
|
||||
|
||||
void DumpCustomADIOS::write()
|
||||
{
|
||||
if (domain->triclinic == 0) {
|
||||
boxxlo = domain->boxlo[0];
|
||||
boxxhi = domain->boxhi[0];
|
||||
boxylo = domain->boxlo[1];
|
||||
boxyhi = domain->boxhi[1];
|
||||
boxzlo = domain->boxlo[2];
|
||||
boxzhi = domain->boxhi[2];
|
||||
} else {
|
||||
boxxlo = domain->boxlo_bound[0];
|
||||
boxxhi = domain->boxhi_bound[0];
|
||||
boxylo = domain->boxlo_bound[1];
|
||||
boxyhi = domain->boxhi_bound[1];
|
||||
boxzlo = domain->boxlo_bound[2];
|
||||
boxzhi = domain->boxhi_bound[2];
|
||||
boxxy = domain->xy;
|
||||
boxxz = domain->xz;
|
||||
boxyz = domain->yz;
|
||||
}
|
||||
|
||||
// nme = # of dump lines this proc contributes to dump
|
||||
|
||||
nme = count();
|
||||
|
||||
// ntotal = total # of atoms in snapshot
|
||||
// atomOffset = sum of # of atoms up to this proc (exclusive prefix sum)
|
||||
|
||||
bigint bnme = nme;
|
||||
MPI_Allreduce(&bnme, &ntotal, 1, MPI_LMP_BIGINT, MPI_SUM, world);
|
||||
|
||||
bigint atomOffset; // sum of all atoms on processes 0..me-1
|
||||
MPI_Scan(&bnme, &atomOffset, 1, MPI_LMP_BIGINT, MPI_SUM, world);
|
||||
atomOffset -= nme; // exclusive prefix sum needed
|
||||
|
||||
// Now we know the global size and the local subset size and offset
|
||||
// of the atoms table
|
||||
size_t nAtomsGlobal = static_cast<size_t>(ntotal);
|
||||
size_t startRow = static_cast<size_t>(atomOffset);
|
||||
size_t nAtomsLocal = static_cast<size_t>(nme);
|
||||
size_t nColumns = static_cast<size_t>(size_one);
|
||||
internal->varAtoms.SetShape({nAtomsGlobal, nColumns});
|
||||
internal->varAtoms.SetSelection({{startRow, 0}, {nAtomsLocal, nColumns}});
|
||||
|
||||
// insure filewriter proc can receive everyone's info
|
||||
// limit nmax*size_one to int since used as arg in MPI_Rsend() below
|
||||
// pack my data into buf
|
||||
// if sorting on IDs also request ID list from pack()
|
||||
// sort buf as needed
|
||||
|
||||
if (nme > maxbuf) {
|
||||
if ((bigint)nme * size_one > MAXSMALLINT)
|
||||
error->all(FLERR, "Too much per-proc info for dump");
|
||||
maxbuf = nme;
|
||||
memory->destroy(buf);
|
||||
memory->create(buf, (maxbuf * size_one), "dump:buf");
|
||||
}
|
||||
if (sort_flag && sortcol == 0 && nme > maxids) {
|
||||
maxids = nme;
|
||||
memory->destroy(ids);
|
||||
memory->create(ids, maxids, "dump:ids");
|
||||
}
|
||||
|
||||
if (sort_flag && sortcol == 0)
|
||||
pack(ids);
|
||||
else
|
||||
pack(NULL);
|
||||
if (sort_flag)
|
||||
sort();
|
||||
|
||||
openfile();
|
||||
internal->fh.BeginStep();
|
||||
// write info on data as scalars (by me==0)
|
||||
if (me == 0) {
|
||||
internal->fh.Put<uint64_t>("ntimestep", update->ntimestep);
|
||||
internal->fh.Put<int>("nprocs", nprocs);
|
||||
|
||||
internal->fh.Put<double>("boxxlo", boxxlo);
|
||||
internal->fh.Put<double>("boxxhi", boxxhi);
|
||||
internal->fh.Put<double>("boxylo", boxylo);
|
||||
internal->fh.Put<double>("boxyhi", boxyhi);
|
||||
internal->fh.Put<double>("boxzlo", boxzlo);
|
||||
internal->fh.Put<double>("boxzhi", boxzhi);
|
||||
|
||||
if (domain->triclinic) {
|
||||
internal->fh.Put<double>("boxxy", boxxy);
|
||||
internal->fh.Put<double>("boxxz", boxxz);
|
||||
internal->fh.Put<double>("boxyz", boxyz);
|
||||
}
|
||||
}
|
||||
// Everyone needs to write scalar variables that are used as dimensions and
|
||||
// offsets of arrays
|
||||
internal->fh.Put<uint64_t>("natoms", ntotal);
|
||||
internal->fh.Put<int>("ncolumns", size_one);
|
||||
internal->fh.Put<uint64_t>("nme", bnme);
|
||||
internal->fh.Put<uint64_t>("offset", atomOffset);
|
||||
// now write the atoms
|
||||
internal->fh.Put<double>("atoms", buf);
|
||||
internal->fh.EndStep(); // I/O will happen now...
|
||||
|
||||
if (multifile) {
|
||||
internal->fh.Close();
|
||||
}
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------------- */
|
||||
|
||||
void DumpCustomADIOS::init_style()
|
||||
{
|
||||
|
||||
// setup boundary string
|
||||
|
||||
domain->boundary_string(boundstr);
|
||||
|
||||
// remove % from filename since ADIOS always writes a global file with
|
||||
// data/metadata
|
||||
int len = strlen(filename);
|
||||
char *ptr = strchr(filename, '%');
|
||||
if (ptr) {
|
||||
*ptr = '\0';
|
||||
char *s = new char[len - 1];
|
||||
sprintf(s, "%s%s", filename, ptr + 1);
|
||||
strncpy(filename, s, len);
|
||||
}
|
||||
|
||||
/* The next four loops are copied from dump_custom_mpiio, but nothing is
|
||||
* done with them.
|
||||
* It is unclear why we need them here.
|
||||
* For metadata, variable[] will be written out as an ADIOS attribute if
|
||||
* nvariable>0
|
||||
*/
|
||||
// find current ptr for each compute,fix,variable
|
||||
// check that fix frequency is acceptable
|
||||
int icompute;
|
||||
for (int i = 0; i < ncompute; i++) {
|
||||
icompute = modify->find_compute(id_compute[i]);
|
||||
if (icompute < 0)
|
||||
error->all(FLERR, "Could not find dump custom compute ID");
|
||||
compute[i] = modify->compute[icompute];
|
||||
}
|
||||
|
||||
int ifix;
|
||||
for (int i = 0; i < nfix; i++) {
|
||||
ifix = modify->find_fix(id_fix[i]);
|
||||
if (ifix < 0)
|
||||
error->all(FLERR, "Could not find dump custom fix ID");
|
||||
fix[i] = modify->fix[ifix];
|
||||
if (nevery % modify->fix[ifix]->peratom_freq)
|
||||
error->all(FLERR,
|
||||
"Dump custom and fix not computed at compatible times");
|
||||
}
|
||||
|
||||
int ivariable;
|
||||
for (int i = 0; i < nvariable; i++) {
|
||||
ivariable = input->variable->find(id_variable[i]);
|
||||
if (ivariable < 0)
|
||||
error->all(FLERR, "Could not find dump custom variable name");
|
||||
variable[i] = ivariable;
|
||||
}
|
||||
|
||||
// set index and check validity of region
|
||||
if (iregion >= 0) {
|
||||
iregion = domain->find_region(idregion);
|
||||
if (iregion == -1)
|
||||
error->all(FLERR, "Region ID for dump custom does not exist");
|
||||
}
|
||||
|
||||
/* Define the group of variables for the atom style here since it's a fixed
|
||||
* set */
|
||||
internal->io = internal->ad->DeclareIO(internal->ioName);
|
||||
if (!internal->io.InConfigFile()) {
|
||||
// if not defined by user, we can change the default settings
|
||||
// BPFile is the default writer
|
||||
internal->io.SetEngine("BPFile");
|
||||
int num_aggregators = multiproc;
|
||||
if (num_aggregators == 0)
|
||||
num_aggregators = 1;
|
||||
char nstreams[128];
|
||||
sprintf(nstreams, "%d", num_aggregators);
|
||||
internal->io.SetParameters({{"substreams", nstreams}});
|
||||
if (me == 0 && screen)
|
||||
fprintf(
|
||||
screen,
|
||||
"ADIOS method for %s is n-to-m (aggregation with %s writers)\n",
|
||||
filename, nstreams);
|
||||
}
|
||||
|
||||
internal->io.DefineVariable<uint64_t>("ntimestep");
|
||||
internal->io.DefineVariable<uint64_t>("natoms");
|
||||
|
||||
internal->io.DefineVariable<int>("nprocs");
|
||||
internal->io.DefineVariable<int>("ncolumns");
|
||||
|
||||
internal->io.DefineVariable<double>("boxxlo");
|
||||
internal->io.DefineVariable<double>("boxxhi");
|
||||
internal->io.DefineVariable<double>("boxylo");
|
||||
internal->io.DefineVariable<double>("boxyhi");
|
||||
internal->io.DefineVariable<double>("boxzlo");
|
||||
internal->io.DefineVariable<double>("boxzhi");
|
||||
|
||||
internal->io.DefineVariable<double>("boxxy");
|
||||
internal->io.DefineVariable<double>("boxxz");
|
||||
internal->io.DefineVariable<double>("boxyz");
|
||||
|
||||
internal->io.DefineAttribute<int>("triclinic", domain->triclinic);
|
||||
|
||||
int *boundaryptr = reinterpret_cast<int *>(domain->boundary);
|
||||
internal->io.DefineAttribute<int>("boundary", boundaryptr, 6);
|
||||
|
||||
size_t nColumns = static_cast<size_t>(size_one);
|
||||
internal->io.DefineAttribute<std::string>(
|
||||
"columns", internal->columnNames.data(), nColumns);
|
||||
internal->io.DefineAttribute<std::string>("columnstr", columns);
|
||||
internal->io.DefineAttribute<std::string>("boundarystr", boundstr);
|
||||
internal->io.DefineAttribute<std::string>("LAMMPS/dump_style", "atom");
|
||||
internal->io.DefineAttribute<std::string>("LAMMPS/version",
|
||||
universe->version);
|
||||
internal->io.DefineAttribute<std::string>("LAMMPS/num_ver",
|
||||
universe->num_ver);
|
||||
|
||||
internal->io.DefineVariable<uint64_t>(
|
||||
"nme", {adios2::LocalValueDim}); // local dimension variable
|
||||
internal->io.DefineVariable<uint64_t>(
|
||||
"offset", {adios2::LocalValueDim}); // local dimension variable
|
||||
|
||||
// atom table size is not known at the moment
|
||||
// it will be correctly defined at the moment of write
|
||||
size_t UnknownSizeYet = 1;
|
||||
internal->varAtoms = internal->io.DefineVariable<double>(
|
||||
"atoms", {UnknownSizeYet, nColumns}, {UnknownSizeYet, 0},
|
||||
{UnknownSizeYet, nColumns});
|
||||
}
|
||||
87
src/USER-ADIOS/dump_custom_adios.h
Normal file
87
src/USER-ADIOS/dump_custom_adios.h
Normal file
@ -0,0 +1,87 @@
|
||||
/* -*- c++ -*- ----------------------------------------------------------
|
||||
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
|
||||
http://lammps.sandia.gov, Sandia National Laboratories
|
||||
Steve Plimpton, sjplimp@sandia.gov
|
||||
|
||||
Copyright (2003) Sandia Corporation. Under the terms of Contract
|
||||
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
|
||||
certain rights in this software. This software is distributed under
|
||||
the GNU General Public License.
|
||||
|
||||
See the README file in the top-level LAMMPS directory.
|
||||
------------------------------------------------------------------------- */
|
||||
|
||||
#ifdef DUMP_CLASS
|
||||
// clang-format off
|
||||
DumpStyle(custom/adios, DumpCustomADIOS)
|
||||
// clang-format on
|
||||
#else
|
||||
|
||||
#ifndef LMP_DUMP_CUSTOM_ADIOS_H
|
||||
#define LMP_DUMP_CUSTOM_ADIOS_H
|
||||
|
||||
#include "dump_custom.h"
|
||||
|
||||
namespace LAMMPS_NS
|
||||
{
|
||||
|
||||
class DumpCustomADIOSInternal;
|
||||
|
||||
class DumpCustomADIOS : public DumpCustom
|
||||
{
|
||||
public:
|
||||
DumpCustomADIOS(class LAMMPS *, int, char **);
|
||||
virtual ~DumpCustomADIOS();
|
||||
|
||||
protected:
|
||||
virtual void openfile();
|
||||
virtual void write();
|
||||
virtual void init_style();
|
||||
|
||||
private:
|
||||
DumpCustomADIOSInternal *internal;
|
||||
};
|
||||
}
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* ERROR/WARNING messages:
|
||||
|
||||
E: Cannot open dump file %s
|
||||
|
||||
The output file for the dump command cannot be opened. Check that the
|
||||
path and name are correct.
|
||||
|
||||
E: Too much per-proc info for dump
|
||||
|
||||
Number of local atoms times number of columns must fit in a 32-bit
|
||||
integer for dump.
|
||||
|
||||
E: Dump_modify format string is too short
|
||||
|
||||
There are more fields to be dumped in a line of output than your
|
||||
format string specifies.
|
||||
|
||||
E: Could not find dump custom compute ID
|
||||
|
||||
Self-explanatory.
|
||||
|
||||
E: Could not find dump custom fix ID
|
||||
|
||||
Self-explanatory.
|
||||
|
||||
E: Dump custom and fix not computed at compatible times
|
||||
|
||||
The fix must produce per-atom quantities on timesteps that dump custom
|
||||
needs them.
|
||||
|
||||
E: Could not find dump custom variable name
|
||||
|
||||
Self-explanatory.
|
||||
|
||||
E: Region ID for dump custom does not exist
|
||||
|
||||
Self-explanatory.
|
||||
|
||||
*/
|
||||
Reference in New Issue
Block a user