new USER-MESO package

This commit is contained in:
Steve Plimpton
2017-08-18 17:33:42 -06:00
parent b11fe2eddb
commit f945d4567d
81 changed files with 8358 additions and 66 deletions

BIN
doc/src/Eqs/fix_mvv_dpd.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

View File

@ -0,0 +1,21 @@
\documentclass[12pt]{article}
\begin{document}
$$
v(t+\frac{\Delta t}{2}) = v(t) + \frac{\Delta t}{2}\cdot a(t),
$$
$$
r(t+\Delta t) = r(t) + \Delta t\cdot v(t+\frac{\Delta t}{2}),
$$
$$
a(t+\Delta t) = \frac{1}{m}\cdot F\left[ r(t+\Delta t), v(t) +\lambda \cdot \Delta t\cdot a(t)\right],
$$
$$
v(t+\Delta t) = v(t+\frac{\Delta t}{2}) + \frac{\Delta t}{2}\cdot a(t++\Delta t),
$$
\end{document}

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

View File

@ -0,0 +1,33 @@
\documentclass[12pt]{article}
\begin{document}
$$
\mathbf{F}_{ij}^{C} = \alpha_{ij}{\omega_{C}}(r_{ij})\mathbf{e}_{ij},
$$
$$
\mathbf{F}_{ij}^{D} = -\gamma {\omega_{D}}(r_{ij})(\mathbf{e}_{ij} \cdot \mathbf{v}_{ij})\mathbf{e}_{ij},
$$
$$
\mathbf{F}_{ij}^{R} = \sigma {\omega_{R}}(r_{ij}){\xi_{ij}}\Delta t^{-1/2} \mathbf{e}_{ij},
$$
$$
\omega_{C}(r) = 1 - r/r_c,
$$
$$
\alpha_{ij} = A\cdot k_B(T_i + T_j)/2,
$$
$$
\omega_{D}(r) = \omega^2_{R}(r) = (1-r/r_c)^s,
$$
$$
\sigma_{ij}^2 = 4\gamma k_B T_i T_j/(T_i + T_j),
$$
\end{document}

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

View File

@ -0,0 +1,15 @@
\documentclass[12pt]{article}
\begin{document}
$$
\frac{\mathrm{d}^2 \mathbf{r}_i}{\mathrm{d} t^2}=
\frac{\mathrm{d} \mathbf{v}_i}{\mathrm{d} t}
=\mathbf{F}_{i}=\sum_{i\neq j}(\mathbf{F}_{ij}^{C}+\mathbf{F}_{ij}^{D}+\mathbf{F}_{ij}^{R}),
$$
$$
C_v\frac{\mathrm{d} T_i}{\mathrm{d} t}= q_{i} = \sum_{i\neq j}(q_{ij}^{C}+q_{ij}^{V}+q_{ij}^{R}),
$$
\end{document}

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

View File

@ -0,0 +1,29 @@
\documentclass[12pt]{article}
\begin{document}
$$
q_i^C = \sum_{j \ne i} k_{ij} \omega_{CT}(r_{ij}) \left( \frac{1}{T_i} - \frac{1}{T_j} \right),
$$
$$
q_i^V = \frac{1}{2 C_v}\sum_{j \ne i}{ \left\{ \omega_D(r_{ij})\left[\gamma_{ij} \left( \mathbf{e}_{ij} \cdot \mathbf{v}_{ij} \right)^2 - \frac{\left( \sigma _{ij} \right)^2}{m}\right] - \sigma _{ij} \omega_R(r_{ij})\left( \mathbf{e}_{ij} \cdot \mathbf{v}_{ij} \right){\xi_{ij}} \right\} },
$$
$$
q_i^R = \sum_{j \ne i} \beta _{ij} \omega_{RT}(r_{ij}) d {t^{ - 1/2}} \xi_{ij}^e,
$$
$$
\omega_{CT}(r)=\omega_{RT}^2(r)=\left(1-r/r_{ct}\right)^{s_T},
$$
$$
k_{ij}=C_v^2\kappa(T_i + T_j)^2/4k_B,
$$
$$
\beta_{ij}^2=2k_Bk_{ij},
$$
\end{document}

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

View File

@ -0,0 +1,9 @@
\documentclass[12pt]{article}
\begin{document}
$$
\kappa = \frac{315k_B\upsilon }{2\pi \rho C_v r_{ct}^5}\frac{1}{Pr},
$$
\end{document}

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

View File

@ -0,0 +1,17 @@
\documentclass[12pt]{article}
\begin{document}
$$
\mathbf{F}_{ij}^C = Aw_c(r_{ij})\mathbf{e}_{ij} + B(\rho_i+\rho_j)w_d(r_{ij})\mathbf{e}_{ij},
$$
$$
\mathbf{F}_{ij}^{D} = -\gamma {\omega_{D}}(r_{ij})(\mathbf{e}_{ij} \cdot \mathbf{v}_{ij})\mathbf{e}_{ij},
$$
$$
\mathbf{F}_{ij}^{R} = \sigma {\omega_{R}}(r_{ij}){\xi_{ij}}\Delta t^{-1/2} \mathbf{e}_{ij},
$$
\end{document}

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

View File

@ -0,0 +1,21 @@
\documentclass[12pt]{article}
\begin{document}
$$
Q_{ij}^D = -\kappa_{ij} w_{DC}(r_{ij}) \left( C_i - C_j \right),
$$
$$
Q_{ij}^R = \epsilon_{ij}\left( C_i + C_j \right) w_{RC}(r_{ij}) \xi_{ij},
$$
$$
w_{DC}(r_{ij})=w^2_{RC}(r_{ij}) = (1 - r/r_{cc})^{\rm power\_{cc}},
$$
$$
\epsilon_{ij}^2 = m_s^2\kappa_{ij}\rho,
$$
\end{document}

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

View File

@ -0,0 +1,29 @@
\documentclass[12pt]{article}
\begin{document}
$$
\mathbf{F}_{ij}^{C} = A{\omega_{C}}(r_{ij})\mathbf{e}_{ij},
$$
$$
\mathbf{F}_{ij}^{D} = -\gamma {\omega_{D}}(r_{ij})(\mathbf{e}_{ij} \cdot \mathbf{v}_{ij})\mathbf{e}_{ij},
$$
$$
\mathbf{F}_{ij}^{R} = \sigma {\omega_{R}}(r_{ij}){\xi_{ij}}\Delta t^{-1/2} \mathbf{e}_{ij},
$$
$$
\omega_{C}(r) = 1 - r/r_c,
$$
$$
\omega_{D}(r) = \omega^2_{R}(r) = (1-r/r_c)^{\rm power\_f},
$$
$$
\sigma^2 = 2\gamma k_B T,
$$
\end{document}

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

View File

@ -0,0 +1,13 @@
\documentclass[12pt]{article}
\begin{document}
$$
\frac{\mathrm{d}^2 \mathbf{r}_i}{\mathrm{d} t^2} = \frac{\mathrm{d} \mathbf{v}_i}{\mathrm{d} t}=\mathbf{F}_{i}=\sum_{i\neq j}(\mathbf{F}_{ij}^{C}+\mathbf{F}_{ij}^{D}+\mathbf{F}_{ij}^{R}),
$$
$$
\frac{\mathrm{d} C_{i}}{\mathrm{d} t}= Q_{i} = \sum_{i\neq j}(Q_{ij}^{D}+Q_{ij}^{R}) + Q_{i}^{S},
$$
\end{document}

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 895 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 113 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

View File

@ -685,6 +685,7 @@ package"_Section_start.html#start_3.
"drude"_fix_drude.html, "drude"_fix_drude.html,
"drude/transform/direct"_fix_drude_transform.html, "drude/transform/direct"_fix_drude_transform.html,
"drude/transform/reverse"_fix_drude_transform.html, "drude/transform/reverse"_fix_drude_transform.html,
"edpd/source"_fix_dpd_source.html,
"eos/cv"_fix_eos_cv.html, "eos/cv"_fix_eos_cv.html,
"eos/table"_fix_eos_table.html, "eos/table"_fix_eos_table.html,
"eos/table/rx"_fix_eos_table_rx.html, "eos/table/rx"_fix_eos_table_rx.html,
@ -704,6 +705,9 @@ package"_Section_start.html#start_3.
"meso"_fix_meso.html, "meso"_fix_meso.html,
"manifoldforce"_fix_manifoldforce.html, "manifoldforce"_fix_manifoldforce.html,
"meso/stationary"_fix_meso_stationary.html, "meso/stationary"_fix_meso_stationary.html,
"mvv/dpd"_fix_mvv_dpd.html,
"mvv/edpd"_fix_mvv_dpd.html,
"mvv/tdpd"_fix_mvv_dpd.html,
"nve/dot"_fix_nve_dot.html, "nve/dot"_fix_nve_dot.html,
"nve/dotc/langevin"_fix_nve_dotc_langevin.html, "nve/dotc/langevin"_fix_nve_dotc_langevin.html,
"nve/manifold/rattle"_fix_nve_manifold_rattle.html, "nve/manifold/rattle"_fix_nve_manifold_rattle.html,
@ -732,6 +736,7 @@ package"_Section_start.html#start_3.
"smd/move/triangulated/surface"_fix_smd_move_triangulated_surface.html, "smd/move/triangulated/surface"_fix_smd_move_triangulated_surface.html,
"smd/setvel"_fix_smd_setvel.html, "smd/setvel"_fix_smd_setvel.html,
"smd/wall/surface"_fix_smd_wall_surface.html, "smd/wall/surface"_fix_smd_wall_surface.html,
"tdpd/source"_fix_dpd_source.html,
"temp/rescale/eff"_fix_temp_rescale_eff.html, "temp/rescale/eff"_fix_temp_rescale_eff.html,
"ti/spring"_fix_ti_spring.html, "ti/spring"_fix_ti_spring.html,
"ttm/mod"_fix_ttm.html, "ttm/mod"_fix_ttm.html,
@ -836,6 +841,7 @@ package"_Section_start.html#start_3.
"cnp/atom"_compute_cnp_atom.html, "cnp/atom"_compute_cnp_atom.html,
"dpd"_compute_dpd.html, "dpd"_compute_dpd.html,
"dpd/atom"_compute_dpd_atom.html, "dpd/atom"_compute_dpd_atom.html,
"edpd/temp/atom"_compute_edpd_temp_atom.html,
"fep"_compute_fep.html, "fep"_compute_fep.html,
"force/tally"_compute_tally.html, "force/tally"_compute_tally.html,
"heat/flux/tally"_compute_tally.html, "heat/flux/tally"_compute_tally.html,
@ -868,6 +874,7 @@ package"_Section_start.html#start_3.
"smd/ulsph/stress"_compute_smd_ulsph_stress.html, "smd/ulsph/stress"_compute_smd_ulsph_stress.html,
"smd/vol"_compute_smd_vol.html, "smd/vol"_compute_smd_vol.html,
"stress/tally"_compute_tally.html, "stress/tally"_compute_tally.html,
"tdpd/cc/atom"_compute_tdpd_cc_atom.html,
"temp/drude"_compute_temp_drude.html, "temp/drude"_compute_temp_drude.html,
"temp/eff"_compute_temp_eff.html, "temp/eff"_compute_temp_eff.html,
"temp/deform/eff"_compute_temp_deform_eff.html, "temp/deform/eff"_compute_temp_deform_eff.html,
@ -1024,6 +1031,7 @@ package"_Section_start.html#start_3.
"eam/cd (o)"_pair_eam.html, "eam/cd (o)"_pair_eam.html,
"edip (o)"_pair_edip.html, "edip (o)"_pair_edip.html,
"edip/multi"_pair_edip.html, "edip/multi"_pair_edip.html,
"edpd"_pair_meso.html,
"eff/cut"_pair_eff.html, "eff/cut"_pair_eff.html,
"exp6/rx"_pair_exp6_rx.html, "exp6/rx"_pair_exp6_rx.html,
"gauss/cut"_pair_gauss.html, "gauss/cut"_pair_gauss.html,
@ -1041,6 +1049,8 @@ package"_Section_start.html#start_3.
"lj/sdk (gko)"_pair_sdk.html, "lj/sdk (gko)"_pair_sdk.html,
"lj/sdk/coul/long (go)"_pair_sdk.html, "lj/sdk/coul/long (go)"_pair_sdk.html,
"lj/sdk/coul/msm (o)"_pair_sdk.html, "lj/sdk/coul/msm (o)"_pair_sdk.html,
"mdpd"_pair_meso.html,
"mdpd/rhosum"_pair_meso.html,
"meam/c"_pair_meam.html, "meam/c"_pair_meam.html,
"meam/spline (o)"_pair_meam_spline.html, "meam/spline (o)"_pair_meam_spline.html,
"meam/sw/spline"_pair_meam_sw_spline.html, "meam/sw/spline"_pair_meam_sw_spline.html,
@ -1074,6 +1084,7 @@ package"_Section_start.html#start_3.
"sph/taitwater/morris"_pair_sph_taitwater_morris.html, "sph/taitwater/morris"_pair_sph_taitwater_morris.html,
"srp"_pair_srp.html, "srp"_pair_srp.html,
"table/rx"_pair_table_rx.html, "table/rx"_pair_table_rx.html,
"tdpd"_pair_meso.html,
"tersoff/table (o)"_pair_tersoff.html, "tersoff/table (o)"_pair_tersoff.html,
"thole"_pair_thole.html, "thole"_pair_thole.html,
"tip4p/long/soft (o)"_pair_lj_soft.html :tb(c=4,ea=c) "tip4p/long/soft (o)"_pair_lj_soft.html :tb(c=4,ea=c)

View File

@ -112,7 +112,7 @@ Package, Description, Doc page, Example, Library
"REPLICA"_#REPLICA, multi-replica methods, "Section 6.6.5"_Section_howto.html#howto_5, tad, - "REPLICA"_#REPLICA, multi-replica methods, "Section 6.6.5"_Section_howto.html#howto_5, tad, -
"RIGID"_#RIGID, rigid bodies and constraints, "fix rigid"_fix_rigid.html, rigid, - "RIGID"_#RIGID, rigid bodies and constraints, "fix rigid"_fix_rigid.html, rigid, -
"SHOCK"_#SHOCK, shock loading methods, "fix msst"_fix_msst.html, -, - "SHOCK"_#SHOCK, shock loading methods, "fix msst"_fix_msst.html, -, -
"SNAP"_#SNAP, quantum-fitted potential, "pair snap"_pair_snap.html, snap, - "SNAP"_#SNAP, quantum-fitted potential, "pair_style snap"_pair_snap.html, snap, -
"SRD"_#SRD, stochastic rotation dynamics, "fix srd"_fix_srd.html, srd, - "SRD"_#SRD, stochastic rotation dynamics, "fix srd"_fix_srd.html, srd, -
"VORONOI"_#VORONOI, Voronoi tesselation, "compute voronoi/atom"_compute_voronoi_atom.html, -, ext :tb(ea=c,ca1=l) "VORONOI"_#VORONOI, Voronoi tesselation, "compute voronoi/atom"_compute_voronoi_atom.html, -, ext :tb(ea=c,ca1=l)
@ -134,6 +134,7 @@ Package, Description, Doc page, Example, Library
"USER-LB"_#USER-LB, Lattice Boltzmann fluid,"fix lb/fluid"_fix_lb_fluid.html, USER/lb, - "USER-LB"_#USER-LB, Lattice Boltzmann fluid,"fix lb/fluid"_fix_lb_fluid.html, USER/lb, -
"USER-MANIFOLD"_#USER-MANIFOLD, motion on 2d surfaces,"fix manifoldforce"_fix_manifoldforce.html, USER/manifold, - "USER-MANIFOLD"_#USER-MANIFOLD, motion on 2d surfaces,"fix manifoldforce"_fix_manifoldforce.html, USER/manifold, -
"USER-MEAMC"_#USER-MEAMC, modified EAM potential (C++), "pair_style meam/c"_pair_meam.html, meam, - "USER-MEAMC"_#USER-MEAMC, modified EAM potential (C++), "pair_style meam/c"_pair_meam.html, meam, -
"USER-MESO"_#USER-MESO, mesoscale DPD models, "pair_style edpd"_pair_meso.html, USER/meso, -
"USER-MGPT"_#USER-MGPT, fast MGPT multi-ion potentials, "pair_style mgpt"_pair_mgpt.html, USER/mgpt, - "USER-MGPT"_#USER-MGPT, fast MGPT multi-ion potentials, "pair_style mgpt"_pair_mgpt.html, USER/mgpt, -
"USER-MISC"_#USER-MISC, single-file contributions, USER-MISC/README, USER/misc, - "USER-MISC"_#USER-MISC, single-file contributions, USER-MISC/README, USER/misc, -
"USER-MOLFILE"_#USER-MOLFILE, "VMD"_vmd_home molfile plug-ins,"dump molfile"_dump_molfile.html, -, ext "USER-MOLFILE"_#USER-MOLFILE, "VMD"_vmd_home molfile plug-ins,"dump molfile"_dump_molfile.html, -, ext
@ -1342,7 +1343,7 @@ make machine :pre
[Supporting info:] [Supporting info:]
src/SNAP: filenames -> commands src/SNAP: filenames -> commands
"pair snap"_pair_snap.html "pair_style snap"_pair_snap.html
"compute sna/atom"_compute_sna_atom.html "compute sna/atom"_compute_sna_atom.html
"compute snad/atom"_compute_sna_atom.html "compute snad/atom"_compute_sna_atom.html
"compute snav/atom"_compute_sna_atom.html "compute snav/atom"_compute_sna_atom.html
@ -1556,7 +1557,7 @@ make machine :pre
src/USER-AWPMD: filenames -> commands src/USER-AWPMD: filenames -> commands
src/USER-AWPMD/README src/USER-AWPMD/README
"pair awpmd/cut"_pair_awpmd.html "pair_style awpmd/cut"_pair_awpmd.html
examples/USER/awpmd :ul examples/USER/awpmd :ul
:line :line
@ -1745,12 +1746,12 @@ src/USER-DPD: filenames -> commands
"fix eos/table/rx"_fix_eos_table_rx.html "fix eos/table/rx"_fix_eos_table_rx.html
"fix shardlow"_fix_shardlow.html "fix shardlow"_fix_shardlow.html
"fix rx"_fix_rx.html "fix rx"_fix_rx.html
"pair table/rx"_pair_table_rx.html "pair_style table/rx"_pair_table_rx.html
"pair dpd/fdt"_pair_dpd_fdt.html "pair_style dpd/fdt"_pair_dpd_fdt.html
"pair dpd/fdt/energy"_pair_dpd_fdt.html "pair_style dpd/fdt/energy"_pair_dpd_fdt.html
"pair exp6/rx"_pair_exp6_rx.html "pair_style exp6/rx"_pair_exp6_rx.html
"pair multi/lucy"_pair_multi_lucy.html "pair_style multi/lucy"_pair_multi_lucy.html
"pair multi/lucy/rx"_pair_multi_lucy_rx.html "pair_style multi/lucy/rx"_pair_multi_lucy_rx.html
examples/USER/dpd :ul examples/USER/dpd :ul
:line :line
@ -1785,8 +1786,8 @@ src/USER-DRUDE/README
"fix drude"_fix_drude.html "fix drude"_fix_drude.html
"fix drude/transform/*"_fix_drude_transform.html "fix drude/transform/*"_fix_drude_transform.html
"compute temp/drude"_compute_temp_drude.html "compute temp/drude"_compute_temp_drude.html
"pair thole"_pair_thole.html "pair_style thole"_pair_thole.html
"pair lj/cut/thole/long"_pair_thole.html "pair_style lj/cut/thole/long"_pair_thole.html
examples/USER/drude examples/USER/drude
tools/drude :ul tools/drude :ul
@ -1824,8 +1825,8 @@ src/USER-EFF/README
"fix npt/eff"_fix_nh_eff.html "fix npt/eff"_fix_nh_eff.html
"fix langevin/eff"_fix_langevin_eff.html "fix langevin/eff"_fix_langevin_eff.html
"compute temp/eff"_compute_temp_eff.html "compute temp/eff"_compute_temp_eff.html
"pair eff/cut"_pair_eff.html "pair_style eff/cut"_pair_eff.html
"pair eff/inline"_pair_eff.html "pair_style eff/inline"_pair_eff.html
examples/USER/eff examples/USER/eff
tools/eff/README tools/eff/README
tools/eff tools/eff
@ -2155,11 +2156,47 @@ make machine :pre
src/USER-MEAMC: filenames -> commands src/USER-MEAMC: filenames -> commands
src/USER-MEAMC/README src/USER-MEAMC/README
"pair meam/c"_pair_meam.html "pair_style meam/c"_pair_meam.html
examples/meam :ul examples/meam :ul
:line :line
USER-MESO package :link(USER-MESO),h4
[Contents:]
Several extensions of the the dissipative particle dynamics (DPD)
method. Specifically, energy-conserving DPD (eDPD) that can model
non-isothermal processes, many-body DPD (mDPD) for simulating
vapor-liquid coexistence, and transport DPD (tDPD) for modeling
advection-diffuion-reaction systems. The equations of motion of these
DPD extensions are integrated through a modified velocity-Verlet (MVV)
algorithm.
[Author:] Zhen Li (Division of Applied Mathematics, Brown University)
[Install or un-install:]
make yes-user-meso
make machine :pre
make no-user-meso
make machine :pre
[Supporting info:]
src/USER-MESO: filenames -> commands
src/USER-MESO/README
"atom_style edpd"_atom_style.html
"pair_style edpd"_pair_meso.html
"pair_style mdpd"_pair_meso.html
"pair_style tdpd"_pair_meso.html
"fix mvv/dpd"_fix_mvv.html
examples/USER/meso
http://lammps.sandia.gov/movies.html#mesodpd :ul
:line
USER-MOLFILE package :link(USER-MOLFILE),h4 USER-MOLFILE package :link(USER-MOLFILE),h4
[Contents:] [Contents:]

View File

@ -13,17 +13,19 @@ atom_style command :h3
atom_style style args :pre atom_style style args :pre
style = {angle} or {atomic} or {body} or {bond} or {charge} or {dipole} or \ style = {angle} or {atomic} or {body} or {bond} or {charge} or {dipole} or \
{dpd} or {electron} or {ellipsoid} or {full} or {line} or {meso} or \ {dpd} or {edpd} or {mdpd} or {tdpd} or {electron} or {ellipsoid} or \
{molecular} or {peri} or {smd} or {sphere} or {tri} or \ {full} or {line} or {meso} or {molecular} or {peri} or {smd} or \
{template} or {hybrid} :ulb,l {sphere} or {tri} or {template} or {hybrid} :ulb,l
args = none for any style except the following args = none for any style except the following
{body} args = bstyle bstyle-args {body} args = bstyle bstyle-args
bstyle = style of body particles bstyle = style of body particles
bstyle-args = additional arguments specific to the bstyle bstyle-args = additional arguments specific to the bstyle
see the "body"_body.html doc page for details see the "body"_body.html doc page for details
{template} args = template-ID {tdpd} arg = Nspecies
template-ID = ID of molecule template specified in a separate "molecule"_molecule.html command Nspecies = # of chemical species
{hybrid} args = list of one or more sub-styles, each with their args :pre {template} arg = template-ID
template-ID = ID of molecule template specified in a separate "molecule"_molecule.html command
{hybrid} args = list of one or more sub-styles, each with their args :pre
accelerated styles (with same args) = {angle/kk} or {atomic/kk} or {bond/kk} or {charge/kk} or {full/kk} or {molecular/kk} :l accelerated styles (with same args) = {angle/kk} or {atomic/kk} or {bond/kk} or {charge/kk} or {full/kk} or {molecular/kk} :l
:ule :ule
@ -36,7 +38,8 @@ atom_style full
atom_style body nparticle 2 10 atom_style body nparticle 2 10
atom_style hybrid charge bond atom_style hybrid charge bond
atom_style hybrid charge body nparticle 2 5 atom_style hybrid charge body nparticle 2 5
atom_style template myMols :pre atom_style template myMols
atom_style tdpd 2 :pre
[Description:] [Description:]
@ -74,6 +77,9 @@ quantities.
{charge} | charge | atomic system with charges | {charge} | charge | atomic system with charges |
{dipole} | charge and dipole moment | system with dipolar particles | {dipole} | charge and dipole moment | system with dipolar particles |
{dpd} | internal temperature and internal energies | DPD particles | {dpd} | internal temperature and internal energies | DPD particles |
{edpd} | temperature and heat capacity | eDPD particles |
{mdpd} | density | mDPD particles |
{tdpd} | chemical concentration | tDPD particles |
{electron} | charge and spin and eradius | electronic force field | {electron} | charge and spin and eradius | electronic force field |
{ellipsoid} | shape, quaternion, angular momentum | aspherical particles | {ellipsoid} | shape, quaternion, angular momentum | aspherical particles |
{full} | molecular + charge | bio-molecules | {full} | molecular + charge | bio-molecules |
@ -145,6 +151,19 @@ properties with internal temperature (dpdTheta), internal conductive
energy (uCond), internal mechanical energy (uMech), and internal energy (uCond), internal mechanical energy (uMech), and internal
chemical energy (uChem). chemical energy (uChem).
The {edpd} style is for energy-conserving dissipative particle
dynamics (eDPD) particles which store a temperature (edpd_temp), and
heat capacity(edpd_cv).
The {mdpd} style is for many-body dissipative particle dynamics (mDPD)
particles which store a density (rho) for considering
density-dependent many-body interactions.
The {tdpd} style is for transport dissipative particle dynamics (tDPD)
particles which store a set of chemical concentration. An integer
"cc_species" is required to specify the number of chemical species
involved in a tDPD system.
The {meso} style is for smoothed particle hydrodynamics (SPH) The {meso} style is for smoothed particle hydrodynamics (SPH)
particles which store a density (rho), energy (e), and heat capacity particles which store a density (rho), energy (e), and heat capacity
(cv). (cv).
@ -284,6 +303,11 @@ force fields"_pair_eff.html.
The {dpd} style is part of the USER-DPD package for dissipative The {dpd} style is part of the USER-DPD package for dissipative
particle dynamics (DPD). particle dynamics (DPD).
The {edpd}, {mdpd}, and {tdpd} styles are part of the USER-MESO package
for energy-conserving dissipative particle dynamics (eDPD), many-body
dissipative particle dynamics (mDPD), and transport dissipative particle
dynamics (tDPD), respectively.
The {meso} style is part of the USER-SPH package for smoothed particle The {meso} style is part of the USER-SPH package for smoothed particle
hydrodynamics (SPH). See "this PDF hydrodynamics (SPH). See "this PDF
guide"_USER/sph/SPH_LAMMPS_userguide.pdf to using SPH in LAMMPS. guide"_USER/sph/SPH_LAMMPS_userguide.pdf to using SPH in LAMMPS.

View File

@ -0,0 +1,61 @@
"LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc :c
:link(lws,http://lammps.sandia.gov)
:link(ld,Manual.html)
:link(lc,Section_commands.html#comm)
:line
compute edpd/temp/atom command :h3
[Syntax:]
compute ID group-ID edpd/temp/atom :pre
ID, group-ID are documented in "compute"_compute.html command
edpd/temp/atom = style name of this compute command :ul
[Examples:]
compute 1 all edpd/temp/atom :pre
[Description:]
Define a computation that calculates the per-atom temperature
for each eDPD particle in a group.
The temperature is a local temperature derived from the internal energy
of each eDPD particle based on the local equilibrium hypothesis.
For more details please see "(Espanol1997)"_#Espanol1997 and "(Li2014)"_#Li2014.
[Output info:]
This compute calculates a per-atom vector, which can be accessed by
any command that uses per-atom values from a compute as input. See
"Section 6.15"_Section_howto.html#howto_15 for an overview of
LAMMPS output options.
The per-atom vector values will be in temperature "units"_units.html.
[Restrictions:]
This compute is part of the USER-MESO package. It is only enabled if
LAMMPS was built with that package. See the "Making
LAMMPS"_Section_start.html#start_3 section for more info.
[Related commands:]
"pair_style edpd"_pair_meso.html
[Default:] none
:line
:link(Espanol1997)
[(Espanol1997)] Espanol, Europhys Lett, 40(6): 631-636 (1997). DOI:
10.1209/epl/i1997-00515-8
:link(Li2014)
[(Li2014)] Li, Tang, Lei, Caswell, Karniadakis, J Comput Phys, 265:
113-127 (2014). DOI: 10.1016/j.jcp.2014.02.003.

View File

@ -0,0 +1,60 @@
"LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc :c
:link(lws,http://lammps.sandia.gov)
:link(ld,Manual.html)
:link(lc,Section_commands.html#comm)
:line
compute tdpd/cc/atom command :h3
[Syntax:]
compute ID group-ID tdpd/cc/atom index :pre
ID, group-ID are documented in "compute"_compute.html command
tdpd/cc/atom = style name of this compute command
index = index of chemical species (1 to Nspecies) :ul
[Examples:]
compute 1 all tdpd/cc/atom 2 :pre
[Description:]
Define a computation that calculates the per-atom chemical
concentration of a specified species for each tDPD particle in a
group.
The chemical concentration of each species is defined as the number of
molecules carried by a tDPD particle for dilute solution. For more
details see "(Li2015)"_#Li2015.
[Output info:]
This compute calculates a per-atom vector, which can be accessed by
any command that uses per-atom values from a compute as input. See
"Section 6.15"_Section_howto.html#howto_15 for an overview of
LAMMPS output options.
The per-atom vector values will be in the units of chemical species
per unit mass.
[Restrictions:]
This compute is part of the USER-MESO package. It is only enabled if
LAMMPS was built with that package. See the "Making
LAMMPS"_Section_start.html#start_3 section for more info.
[Related commands:]
"pair_style tdpd"_pair_meso.html
[Default:] none
:line
:link(Li2015)
[(Li2015)] Li, Yazdani, Tartakovsky, Karniadakis, J Chem Phys, 143:
014101 (2015). DOI: 10.1063/1.4923254

101
doc/src/fix_dpd_source.txt Normal file
View File

@ -0,0 +1,101 @@
"LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc :c
:link(lws,http://lammps.sandia.gov)
:link(ld,Manual.html)
:link(lc,Section_commands.html#comm)
:line
fix edpd/source command :h3
fix tdpd/source command :h3
[Syntax:]
fix ID group-ID edpd/source keyword values ...
fix ID group-ID tdpd/source cc_index keyword values ... :pre
ID, group-ID are documented in "fix"_fix.html command :ulb,l
edpd/source or tdpd/source = style name of this fix command :l
index (only specified for tdpd/source) = index of chemical species (1 to Nspecies) :l
keyword = {sphere} or {cuboid} :l
{sphere} values = cx,cy,cz,radius,source
cx,cy,cz = x,y,z center of spherical domain (distance units)
radius = radius of a spherical domain (distance units)
source = heat source or concentration source (flux units, see below)
{cuboid} values = cx,cy,cz,dLx,dLy,dLz,source
cx,cy,cz = x,y,z lower left corner of a cuboid domain (distance units)
dLx,dLy,dLz = x,y,z side length of a cuboid domain (distance units)
source = heat source or concentration source (flux units, see below) :pre
:ule
[Examples:]
fix 1 all edpd/source sphere 0.0 0.0 0.0 5.0 0.01
fix 1 all edpd/source cuboid 0.0 0.0 0.0 20.0 10.0 10.0 -0.01
fix 1 all tdpd/source 1 sphere 5.0 0.0 0.0 5.0 0.01
fix 1 all tdpd/source 2 cuboid 0.0 0.0 0.0 20.0 10.0 10.0 0.01 :pre
[Description:]
Fix {edpd/source} adds a heat source as an external heat flux to each
atom in a spherical or cuboid domain, where the {source} is in units
of energy/time. Fix {tdpd/source} adds an external concentration
source of the chemical species specified by {index} as an external
concentration flux for each atom in a spherical or cuboid domain,
where the {source} is in units of mole/volume/time.
This command can be used to give an additional heat/concentration
source term to atoms in a simulation, such as for a simulation of a
heat conduction with a source term (see Fig.12 in "(Li2014)"_#Li2014)
or diffusion with a source term (see Fig.1 in "(Li2015)"_#Li2015), as
an analog of a periodic Poiseuille flow problem.
If the {sphere} keyword is used, the {cx,cy,cz,radius} defines a
spherical domain to apply the source flux to.
If the {cuboid} keyword is used, the {cx,cy,cz,dLx,dLy,dLz} defines a
cuboid domain to apply the source flux to.
:line
[Restart, fix_modify, output, run start/stop, minimize info:]
No information about this fix is written to "binary restart
files"_restart.html. None of the "fix_modify"_fix_modify.html options
are relevant to this fix. No global or per-atom quantities are stored
by this fix for access by various "output
commands"_Section_howto.html#howto_15. No parameter of this fix can
be used with the {start/stop} keywords of the "run"_run.html command.
This fix is not invoked during "energy minimization"_minimize.html.
[Restrictions:]
This fix is part of the USER-MESO package. It is only enabled if
LAMMPS was built with that package. See the "Making
LAMMPS"_Section_start.html#start_3 section for more info.
Fix {edpd/source} must be used with the "pair_style
edpd"_pair_meso.html command. Fix {tdpd/source} must be used with the
"pair_style tdpd"_pair_meso.html command.
[Related commands:]
"pair_style edpd"_pair_meso.html, "pair_style tdpd"_pair_meso.html,
"compute edpd/temp/atom"_compute_edpd_temp_atom.html, "compute
tdpd/cc/atom"_compute_tdpd_cc_atom.html
[Default:] none
:line
:link(Li2014)
[(Li2014)] Z. Li, Y.-H. Tang, H. Lei, B. Caswell and G.E. Karniadakis,
"Energy-conserving dissipative particle dynamics with
temperature-dependent properties", J. Comput. Phys., 265: 113-127
(2014). DOI: 10.1016/j.jcp.2014.02.003
:link(Li2015)
[(Li2015)] Z. Li, A. Yazdani, A. Tartakovsky and G.E. Karniadakis,
"Transport dissipative particle dynamics model for mesoscopic
advection-diffusion-reaction problems", J. Chem. Phys., 143: 014101
(2015). DOI: 10.1063/1.4923254

97
doc/src/fix_mvv_dpd.txt Normal file
View File

@ -0,0 +1,97 @@
"LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc :c
:link(lws,http://lammps.sandia.gov)
:link(ld,Manual.html)
:link(lc,Section_commands.html#comm)
:line
fix mvv/dpd command :h3
fix mvv/edpd command :h3
fix mvv/tdpd command :h3
[Syntax:]
fix ID group-ID mvv/dpd lambda :pre
fix ID group-ID mvv/edpd lambda :pre
fix ID group-ID mvv/tdpd lambda :pre
ID, group-ID are documented in "fix"_fix.html command
mvv/dpd, mvv/edpd, mvv/tdpd = style name of this fix command
lambda = (optional) relaxation parameter (unitless) :ul
[Examples:]
fix 1 all mvv/dpd
fix 1 all mvv/dpd 0.5
fix 1 all mvv/edpd
fix 1 all mvv/edpd 0.5
fix 1 all mvv/tdpd
fix 1 all mvv/tdpd 0.5 :pre
[Description:]
Perform time integration using the modified velocity-Verlet (MVV)
algorithm to update position and velocity (fix mvv/dpd), or position,
velocity and temperature (fix mvv/edpd), or position, velocity and
concentration (fix mvv/tdpd) for particles in the group each timestep.
The modified velocity-Verlet (MVV) algorithm aims to improve the
stability of the time integrator by using an extrapolated version of
the velocity for the force evaluation:
:c,image(Eqs/fix_mvv_dpd.jpg)
where the parameter <font size="4">&lambda;</font> depends on the
specific choice of DPD parameters, and needs to be tuned on a
case-by-case basis. Specification of a {lambda} value is opttional.
If specified, the setting must be from 0.0 to 1.0. If not specified,
a default value of 0.5 is used, which effectively reproduces the
standard velocity-Verlet (VV) scheme. For more details, see
"Groot"_#Groot.
Fix {mvv/dpd} updates the position and velocity of each atom. It can
be used with the "pair_style mdpd"_pair_meso.html command or other
pair styles such as "pair dpd"_pair_dpd.html.
Fix {mvv/edpd} updates the per-atom temperature, in addition to
position and velocity, and must be used with the "pair_style
edpd"_pair_meso.html command.
Fix {mvv/tdpd} updates the per-atom chemical concentration, in
addition to position and velocity, and must be used with the
"pair_style tdpd"_pair_meso.html command.
:line
[Restart, fix_modify, output, run start/stop, minimize info:]
No information about this fix is written to "binary restart
files"_restart.html. None of the "fix_modify"_fix_modify.html options
are relevant to this fix. No global or per-atom quantities are stored
by this fix for access by various "output
commands"_Section_howto.html#howto_15. No parameter of this fix can
be used with the {start/stop} keywords of the "run"_run.html command.
This fix is not invoked during "energy minimization"_minimize.html.
[Restrictions:]
This fix is part of the USER-MESO package. It is only enabled if
LAMMPS was built with that package. See the "Making
LAMMPS"_Section_start.html#start_3 section for more info.
[Related commands:]
"pair_style mdpd"_pair_meso.html, "pair_style edpd"_pair_meso.html,
"pair_style tdpd"_pair_meso.html
[Default:]
The default value for the optional {lambda} parameter is 0.5.
:line
:link(Groot)
[(Groot)] Groot and Warren, J Chem Phys, 107: 4423-4435 (1997). DOI:
10.1063/1.474784

277
doc/src/pair_meso.txt Normal file
View File

@ -0,0 +1,277 @@
"LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc :c
:link(lws,http://lammps.sandia.gov)
:link(ld,Manual.html)
:link(lc,Section_commands.html#comm)
:line
pair_style edpd command :h3
pair_style mdpd command :h3
pair_style mdpd/rhosum command :h3
pair_style tdpd command :h3
[Syntax:]
pair_style style args :pre
style = {edpd} or {mdpd} or {mdpd/rhosum} or {tdpd} :ulb,l
args = list of arguments for a particular style :l
{edpd} args = cutoff seed
cutoff = global cutoff for eDPD interactions (distance units)
seed = random # seed (integer) (if <= 0, eDPD will use current time as the seed)
{mdpd} args = T cutoff seed
T = temperature (temperature units)
cutoff = global cutoff for mDPD interactions (distance units)
seed = random # seed (integer) (if <= 0, mDPD will use current time as the seed)
{mdpd/rhosum} args =
{tdpd} args = T cutoff seed
T = temperature (temperature units)
cutoff = global cutoff for tDPD interactions (distance units)
seed = random # seed (integer) (if <= 0, tDPD will use current time as the seed) :pre
:ule
[Examples:]
pair_style edpd 1.58 9872598
pair_coeff * * 18.75 4.5 0.41 1.58 1.42E-5 2.0 1.58
pair_coeff 1 1 18.75 4.5 0.41 1.58 1.42E-5 2.0 1.58 power 10.54 -3.66 3.44 -4.10
pair_coeff 1 1 18.75 4.5 0.41 1.58 1.42E-5 2.0 1.58 power 10.54 -3.66 3.44 -4.10 kappa -0.44 -3.21 5.04 0.00 :pre
pair_style hybrid/overlay mdpd/rhosum mdpd 1.0 1.0 65689
pair_coeff 1 1 mdpd/rhosum 0.75
pair_coeff 1 1 mdpd -40.0 25.0 18.0 1.0 0.75 :pre
pair_style tdpd 1.0 1.58 935662
pair_coeff * * 18.75 4.5 0.41 1.58 1.58 1.0 1.0E-5 2.0
pair_coeff 1 1 18.75 4.5 0.41 1.58 1.58 1.0 1.0E-5 2.0 3.0 1.0E-5 2.0 :pre
[Description:]
The {edpd} style computes the pairwise interactions and heat fluxes
for eDPD particles following the formulations in
"(Li2014_JCP)"_#Li2014_JCP and "Li2015_CC"_#Li2015_CC. The time
evolution of an eDPD particle is governed by the conservation of
momentum and energy given by
:c,image(Eqs/pair_edpd_gov.jpg)
where the three components of <font size="4">F<sub>i</sub></font>
including the conservative force <font
size="4">F<sub>ij</sub><sup>C</sup></font>, dissipative force <font
size="4">F<sub>ij</sub><sup>D</sup></font> and random force <font
size="4">F<sub>ij</sub><sup>R</sup></font> are expressed as
:c,image(Eqs/pair_edpd_force.jpg)
in which the exponent of the weighting function <font
size="4"><i>s</i></font> can be defined as a temperature-dependent
variable. The heat flux between particles accounting for the
collisional heat flux <font size="4">q<sup>C</sup></font>, viscous
heat flux <font size="4">q<sup>V</sup></font>, and random heat flux
<font size="4">q<sup>R</sup></font> are given by
:c,image(Eqs/pair_edpd_heat.jpg)
where the mesoscopic heat friction <font size="4">&kappa;</font> is given by
:c,image(Eqs/pair_edpd_kappa.jpg)
with <font size="4">&upsilon;</font> being the kinematic
viscosity. For more details, see Eq.(15) in "(Li2014_JCP)"_#Li2014_JCP.
The following coefficients must be defined in eDPD system for each
pair of atom types via the "pair_coeff"_pair_coeff.html command as in
the examples above.
A (force units)
gamma (force/velocity units)
power_f (positive real)
cutoff (distance units)
kappa (thermal conductivity units)
power_T (positive real)
cutoff_T (distance units)
optional keyword = power or kappa :ul
The keyword {power} or {kappa} is optional. Both "power" and "kappa"
require 4 parameters <font size="4">c<sub>1</sub>, c<sub>2</sub>,
c<sub>4</sub>, c<sub>4</sub></font> showing the temperature dependence
of the exponent <center><font size="4"> <i>s</i>(<i>T</i>) =
power_f*(1+c<sub>1</sub>*(T-1)+c<sub>2</sub>*(T-1)<sup>2</sup>
+c<sub>3</sub>*(T-1)<sup>3</sup>+c<sub>4</sub>*(T-1)<sup>4</sup>)</font></center>
and of the mesoscopic heat friction <center><font size="4">
<i>s<sub>T</sub>(T)</i> =
kappa*(1+c<sub>1</sub>*(T-1)+c<sub>2</sub>*(T-1)<sup>2</sup>
+c<sub>3</sub>*(T-1)<sup>3</sup>+c<sub>4</sub>*(T-1)<sup>4</sup>)</font></center>
If the keyword {power} or {kappa} is not specified, the eDPD system
will use constant power_f and kappa, which is independent to
temperature changes.
:line
The {mdpd/rhosum} style computes the local particle mass density rho
for mDPD particles by kernel function interpolation.
The following coefficients must be defined for each pair of atom types
via the "pair_coeff"_pair_coeff.html command as in the examples above.
cutoff (distance units) :ul
:line
The {mdpd} style computes the many-body interactions between mDPD
particles following the formulations in
"(Li2013_POF)"_#Li2013_POF. The dissipative and random forces are in
the form same as the classical DPD, but the conservative force is
local density dependent, which are given by
:c,image(Eqs/pair_mdpd_force.jpg)
where the first term in <font size="4">F<sup>C</sup></font> with a
negative coefficient A < 0 stands for an attractive force within an
interaction range <font size="4">r<sub>c</sub></font>, and the second
term with B > 0 is the density-dependent repulsive force within an
interaction range <font size="4">r<sub>d</sub></font>.
The following coefficients must be defined for each pair of atom types via the
"pair_coeff"_pair_coeff.html command as in the examples above.
A (force units)
B (force units)
gamma (force/velocity units)
cutoff_c (distance units)
cutoff_d (distance units) :ul
:line
The {tdpd} style computes the pairwise interactions and chemical
concentration fluxes for tDPD particles following the formulations in
"(Li2015_JCP)"_#Li2015_JCP. The time evolution of a tDPD particle is
governed by the conservation of momentum and concentration given by
:c,image(Eqs/pair_tdpd_gov.jpg)
where the three components of <font size="4">F<sub>i</sub></font>
including the conservative force <font
size="4">F<sub>ij</sub><sup>C</sup></font>, dissipative force <font
size="4">F<sub>ij</sub><sup>D</sup></font> and random force <font
size="4">F<sub>ij</sub><sup>R</sup></font> are expressed as
:c,image(Eqs/pair_tdpd_force.jpg)
The concentration flux between two tDPD particles includes the Fickian
flux <font size="4">Q<sub>ij</sub><sup>D</sup></font> and random flux
<font size="4">Q<sub>ij</sub><sup>R</sup></font>, which are given by
:c,image(Eqs/pair_tdpd_flux.jpg)
where the parameters kappa and epsilon determine the strength of the
Fickian and random fluxes. <font size="4"><i>m</i><sub>s</sub></font>
is the mass of a single solute molecule. In general, <font
size="4"><i>m</i><sub>s</sub></font> is much smaller than the mass of
a tDPD particle <font size="4"><i>m</i></font>. For more details, see
"(Li2015_JCP)"_#Li2015_JCP.
The following coefficients must be defined for each pair of atom types via the
"pair_coeff"_pair_coeff.html command as in the examples above.
A (force units)
gamma (force/velocity units)
power_f (positive real)
cutoff (distance units)
cutoff_CC (distance units)
kappa_i (diffusivity units)
epsilon_i (diffusivity units)
power_cc_i (positive real) :ul
The last 3 values must be repeated Nspecies times, so that values for
each of the Nspecies chemical species are specified, as indicated by
the "I" suffix. In the first pair_coeff example above for pair_style
tdpd, Nspecies = 1. In the second example, Nspecies = 2, so 3
additional coeffs are specified (for species 2).
:line
[Example scripts]
There are example scripts for using all these pair styles in
examples/USER/meso. The example for an eDPD simulation models heat
conduction with source terms analog of periodic Poiseuille flow
problem. The setup follows Fig.12 in "(Li2014_JCP)"_#Li2014_JCP. The
output of the short eDPD simulation (about 2 minutes on a single core)
gives a temperature and density profiles as
:c,image(JPG/examples_edpd.jpg)
The example for a mDPD simulation models the oscillations of a liquid
droplet started from a liquid film. The mDPD parameters are adopted
from "(Li2013_POF)"_#Li2013_POF. The short mDPD run (about 2 minutes
on a single core) generates a particle trajectory which can
be visualized as follows.
:c,image(JPG/examples_mdpd_first.jpg,JPG/examples_mdpd.gif)
:c,image(JPG/examples_mdpd_last.jpg)
The first image is the initial state of the simulation. If you
click it a GIF movie should play in your browser. The second image
is the final state of the simulation.
The example for a tDPD simulation computes the effective diffusion
coefficient of a tDPD system using a method analogous to the periodic
Poiseuille flow. The tDPD system is specified with two chemical
species, and the setup follows Fig.1 in
"(Li2015_JCP)"_#Li2015_JCP. The output of the short tDPD simulation
(about one and a half minutes on a single core) gives the
concentration profiles of the two chemical species as
:c,image(JPG/examples_tdpd.jpg)
:line
[Mixing, shift, table, tail correction, restart, rRESPA info]:
The styles {edpd}, {mdpd}, {mdpd/rhosum} and {tdpd} do not support
mixing. Thus, coefficients for all I,J pairs must be specified explicitly.
The styles {edpd}, {mdpd}, {mdpd/rhosum} and {tdpd} do not support
the "pair_modify"_pair_modify.html shift, table, and tail options.
The styles {edpd}, {mdpd}, {mdpd/rhosum} and {tdpd} do not write
information to "binary restart files"_restart.html. Thus, you need
to re-specify the pair_style and pair_coeff commands in an input script
that reads a restart file.
[Restrictions:]
The pair styles {edpd}, {mdpd}, {mdpd/rhosum} and {tdpd} are part of
the USER-MESO package. It is only enabled if LAMMPS was built with
that package. See the "Making LAMMPS"_Section_start.html#start_3
section for more info.
[Related commands:]
"pair_coeff"_pair_coeff.html, "fix mvv/dpd"_fix_mvv_dpd.html,
"fix mvv/edpd"_fix_mvv_dpd.html, "fix mvv/tdpd"_fix_mvv_dpd.html,
"fix edpd/source"_fix_dpd_source.html, "fix tdpd/source"_fix_dpd_source.html,
"compute edpd/temp/atom"_compute_edpd_temp_atom.html,
"compute tdpd/cc/atom"_compute_tdpd_cc_atom.html
[Default:] none
:line
:link(Li2014_JCP)
[(Li2014_JCP)] Li, Tang, Lei, Caswell, Karniadakis, J Comput Phys,
265: 113-127 (2014). DOI: 10.1016/j.jcp.2014.02.003.
:link(Li2015_CC)
[(Li2015_CC)] Li, Tang, Li, Karniadakis, Chem Commun, 51: 11038-11040
(2015). DOI: 10.1039/C5CC01684C.
:link(Li2013_POF)
[(Li2013_POF)] Li, Hu, Wang, Ma, Zhou, Phys Fluids, 25: 072103 (2013).
DOI: 10.1063/1.4812366.
:link(Li2015_JCP)
[(Li2015_JCP)] Li, Yazdani, Tartakovsky, Karniadakis, J Chem Phys,
143: 014101 (2015). DOI: 10.1063/1.4923254.

View File

@ -14,7 +14,7 @@ read_data file keyword args ... :pre
file = name of data file to read in :ulb,l file = name of data file to read in :ulb,l
zero or more keyword/arg pairs may be appended :l zero or more keyword/arg pairs may be appended :l
keyword = {add} or {offset} or {shift} or {extra/atom/types} or {extra/bond/types} or {extra/angle/types} or {extra/dihedral/types} or {extra/improper/types} or {extra/bond/per/atom} or {extra/angle/per/atom} or {extra/dihedral/per/atom} or {extra/improper/per/atom} or {group} or {nocoeff} or {fix} :l keyword = {add} or {offset} or {shift} or {extra/atom/types} or {extra/bond/types} or {extra/angle/types} or {extra/dihedral/types} or {extra/improper/types} or {group} or {nocoeff} or {fix} :l
{add} arg = {append} or {Nstart} or {merge} {add} arg = {append} or {Nstart} or {merge}
append = add new atoms with IDs appended to current IDs append = add new atoms with IDs appended to current IDs
Nstart = add new atoms with IDs starting with Nstart Nstart = add new atoms with IDs starting with Nstart
@ -32,11 +32,6 @@ keyword = {add} or {offset} or {shift} or {extra/atom/types} or {extra/bond/type
{extra/angle/types} arg = # of extra angle types {extra/angle/types} arg = # of extra angle types
{extra/dihedral/types} arg = # of extra dihedral types {extra/dihedral/types} arg = # of extra dihedral types
{extra/improper/types} arg = # of extra improper types {extra/improper/types} arg = # of extra improper types
{extra/bond/per/atom} arg = leave space for this many new bonds per atom
{extra/angle/per/atom} arg = leave space for this many new angles per atom
{extra/dihedral/per/atom} arg = leave space for this many new dihedrals per atom
{extra/improper/per/atom} arg = leave space for this many new impropers per atom
{extra/special/per/atom} arg = leave space for extra 1-2,1-3,1-4 interactions per atom
{group} args = groupID {group} args = groupID
groupID = add atoms in data file to this group groupID = add atoms in data file to this group
{nocoeff} = ignore force field parameters {nocoeff} = ignore force field parameters
@ -62,7 +57,7 @@ simulation. The file can be ASCII text or a gzipped text file
atom coordinates; see the "read_restart"_read_restart.html and atom coordinates; see the "read_restart"_read_restart.html and
"create_atoms"_create_atoms.html commands for alternative methods. "create_atoms"_create_atoms.html commands for alternative methods.
Also see the explanation of the "-restart command-line Also see the explanation of the "-restart command-line
switch"_Section_start.html#start_6 which can convert a restart file to switch"_Section_start.html#start_7 which can convert a restart file to
a data file. a data file.
This command can be used multiple times to add new atoms and their This command can be used multiple times to add new atoms and their
@ -269,11 +264,11 @@ is different than the default.
{angle types} = # of angle types in system {angle types} = # of angle types in system
{dihedral types} = # of dihedral types in system {dihedral types} = # of dihedral types in system
{improper types} = # of improper types in system {improper types} = # of improper types in system
{extra bond per atom} = leave space for this many new bonds per atom (deprecated, use extra/bond/per/atom keyword) {extra bond per atom} = leave space for this many new bonds per atom
{extra angle per atom} = leave space for this many new angles per atom (deprecated, use extra/angle/per/atom keyword) {extra angle per atom} = leave space for this many new angles per atom
{extra dihedral per atom} = leave space for this many new dihedrals per atom (deprecated, use extra/dihedral/per/atom keyword) {extra dihedral per atom} = leave space for this many new dihedrals per atom
{extra improper per atom} = leave space for this many new impropers per atom (deprecated, use extra/improper/per/atom keyword) {extra improper per atom} = leave space for this many new impropers per atom
{extra special per atom} = leave space for this many new special bonds per atom (deprecated, use extra/special/per/atom keyword) {extra special per atom} = leave space for this many new special bonds per atom
{ellipsoids} = # of ellipsoids in system {ellipsoids} = # of ellipsoids in system
{lines} = # of line segments in system {lines} = # of line segments in system
{triangles} = # of triangles in system {triangles} = # of triangles in system
@ -372,32 +367,25 @@ read_data command will generate an error in this case.
The "extra bond per atom" setting (angle, dihedral, improper) is only The "extra bond per atom" setting (angle, dihedral, improper) is only
needed if new bonds (angles, dihedrals, impropers) will be added to needed if new bonds (angles, dihedrals, impropers) will be added to
the system when a simulation runs, e.g. by using the "fix the system when a simulation runs, e.g. by using the "fix
bond/create"_fix_bond_create.html command. Using this header flag bond/create"_fix_bond_create.html command. This will pre-allocate
is deprecated; please use the {extra/bond/per/atom} keyword (and space in LAMMPS data structures for storing the new bonds (angles,
correspondingly for angles, dihedrals and impropers) in the
read_data command instead. Either will pre-allocate space in LAMMPS
data structures for storing the new bonds (angles,
dihedrals, impropers). dihedrals, impropers).
The "extra special per atom" setting is typically only needed if new The "extra special per atom" setting is typically only needed if new
bonds/angles/etc will be added to the system, e.g. by using the "fix bonds/angles/etc will be added to the system, e.g. by using the "fix
bond/create"_fix_bond_create.html command. Or if entire new molecules bond/create"_fix_bond_create.html command. Or if entire new molecules
will be added to the system, e.g. by using the will be added to the system, e.g. by using the "fix
"fix deposit"_fix_deposit.html or "fix pour"_fix_pour.html commands, deposit"_fix_deposit.html or "fix pour"_fix_pour.html commands, which
which will have more special 1-2,1-3,1-4 neighbors than any other will have more special 1-2,1-3,1-4 neighbors than any other molecules
molecules defined in the data file. Using this header flag is defined in the data file. Using this setting will pre-allocate space
deprecated; please use the {extra/special/per/atom} keyword instead. in the LAMMPS data structures for storing these neighbors. See the
Using this setting will pre-allocate space in the LAMMPS data
structures for storing these neighbors. See the
"special_bonds"_special_bonds.html and "molecule"_molecule.html doc "special_bonds"_special_bonds.html and "molecule"_molecule.html doc
pages for more discussion of 1-2,1-3,1-4 neighbors. pages for more discussion of 1-2,1-3,1-4 neighbors.
NOTE: All of the "extra" settings are only applied in the first data NOTE: All of the "extra" settings are only used if they appear in the
file read and when no simulation box has yet been created; as soon as first data file read; see the description of the {add} keyword above
the simulation box is created (and read_data implies that), these for reading multiple data files. If they appear in later data files,
settings are {locked} and cannot be changed anymore. Please see the they are ignored.
description of the {add} keyword above for reading multiple data files.
If they appear in later data files, they are ignored.
The "ellipsoids" and "lines" and "triangles" and "bodies" settings are The "ellipsoids" and "lines" and "triangles" and "bodies" settings are
only used with "atom_style ellipsoid or line or tri or only used with "atom_style ellipsoid or line or tri or
@ -547,6 +535,9 @@ bond: atom-ID molecule-ID atom-type x y z
charge: atom-ID atom-type q x y z charge: atom-ID atom-type q x y z
dipole: atom-ID atom-type q x y z mux muy muz dipole: atom-ID atom-type q x y z mux muy muz
dpd: atom-ID atom-type theta x y z dpd: atom-ID atom-type theta x y z
edpd: atom-ID atom-type edpd_temp edpd_cv x y z
mdpd: atom-ID atom-type x y z
tdpd: atom-ID atom-type x y z cc1 cc2 ... ccNspecies
electron: atom-ID atom-type q spin eradius x y z electron: atom-ID atom-type q spin eradius x y z
ellipsoid: atom-ID atom-type ellipsoidflag density x y z ellipsoid: atom-ID atom-type ellipsoidflag density x y z
full: atom-ID molecule-ID atom-type q x y z full: atom-ID molecule-ID atom-type q x y z
@ -566,12 +557,15 @@ The per-atom values have these meanings and units, listed alphabetically:
atom-ID = integer ID of atom atom-ID = integer ID of atom
atom-type = type of atom (1-Ntype) atom-type = type of atom (1-Ntype)
bodyflag = 1 for body particles, 0 for point particles bodyflag = 1 for body particles, 0 for point particles
cc = chemical concentration for tDPD particles for each species (mole/volume units)
contact-radius = ??? (distance units) contact-radius = ??? (distance units)
cs_re,cs_im = real/imaginary parts of wavepacket coefficients cs_re,cs_im = real/imaginary parts of wavepacket coefficients
cv = heat capacity (need units) for SPH particles cv = heat capacity (need units) for SPH particles
density = density of particle (mass/distance^3 or mass/distance^2 or mass/distance units, depending on dimensionality of particle) density = density of particle (mass/distance^3 or mass/distance^2 or mass/distance units, depending on dimensionality of particle)
diameter = diameter of spherical atom (distance units) diameter = diameter of spherical atom (distance units)
e = energy (need units) for SPH particles e = energy (need units) for SPH particles
edpd_temp = temperature for eDPD particles (temperature units)
edpd_cv = volumetric heat capacity for eDPD particles (energy/temperature/volume units)
ellipsoidflag = 1 for ellipsoidal particles, 0 for point particles ellipsoidflag = 1 for ellipsoidal particles, 0 for point particles
eradius = electron radius (or fixed-core radius) eradius = electron radius (or fixed-core radius)
etag = integer ID of electron that each wavepacket belongs to etag = integer ID of electron that each wavepacket belongs to

View File

@ -24,7 +24,7 @@ keyword = {type} or {type/fraction} or {mol} or {x} or {y} or {z} or \
{bond} or {angle} or {dihedral} or {improper} or \ {bond} or {angle} or {dihedral} or {improper} or \
{meso/e} or {meso/cv} or {meso/rho} or \ {meso/e} or {meso/cv} or {meso/rho} or \
{smd/contact/radius} or {smd/mass/density} or {dpd/theta} or \ {smd/contact/radius} or {smd/mass/density} or {dpd/theta} or \
{i_name} or {d_name} :l {edpd/temp} or {edpd/cv} or {cc} or {i_name} or {d_name} :l
{type} value = atom type {type} value = atom type
value can be an atom-style variable (see below) value can be an atom-style variable (see below)
{type/fraction} values = type fraction seed {type/fraction} values = type fraction seed
@ -98,6 +98,13 @@ keyword = {type} or {type/fraction} or {mol} or {x} or {y} or {z} or \
{dpd/theta} value = internal temperature of DPD particles (temperature units) {dpd/theta} value = internal temperature of DPD particles (temperature units)
value can be an atom-style variable (see below) value can be an atom-style variable (see below)
value can be NULL which sets internal temp of each particle to KE temp value can be NULL which sets internal temp of each particle to KE temp
{edpd/temp} value = temperature of eDPD particles (temperature units)
value can be an atom-style variable (see below)
{edpd/cv} value = volumetric heat capacity of eDPD particles (energy/temperature/volume units)
value can be an atom-style variable (see below)
{cc} values = index cc
index = index of a chemical species (1 to Nspecies)
cc = chemical concentration of tDPD particles for a species (mole/volume units)
{i_name} value = value for custom integer vector with name {i_name} value = value for custom integer vector with name
{d_name} value = value for custom floating-point vector with name :pre {d_name} value = value for custom floating-point vector with name :pre
:ule :ule
@ -418,6 +425,19 @@ value >= 0.0, the internal temperature is set to that value. If it is
< 0.0, the computation of Tkin is performed and the internal < 0.0, the computation of Tkin is performed and the internal
temperature is set to that value. temperature is set to that value.
Keywords {edpd/temp} and {edpd/cv} set the temperature and volumetric
heat capacity of an eDPD particle as defined by the USER-MESO package.
Currently, only "atom_style edpd"_atom_style.html defines particles
with these attributes. The values for the temperature and heat
capacity must be positive.
Keyword {cc} sets the chemical concentration of a tDPD particle for a
specified species as defined by the USER-MESO package. Currently, only
"atom_style tdpd"_atom_style.html defines particles with this
attribute. An integer for "index" selects a chemical species (1 to
Nspecies) where Nspecies is set by the atom_style command. The value
for the chemical concentration must be >= 0.0.
Keywords {i_name} and {d_name} refer to custom integer and Keywords {i_name} and {d_name} refer to custom integer and
floating-point properties that have been added to each atom via the floating-point properties that have been added to each atom via the
"fix property/atom"_fix_property_atom.html command. When that command "fix property/atom"_fix_property_atom.html command. When that command

40
examples/USER/meso/README Normal file
View File

@ -0,0 +1,40 @@
This directory contains input scripts for performing
simulations with these models:
eDPD - energy-conserving dissipative particle dynamics
mDPD - many-body dissipative particle dynamics
tDPD - transport dissipative particle dynamics
1) eDPD: The input script in.mdpd is an example simulation of
measuring the thermal conductivity by heat conduction analog of
periodic Poiseuille flow. The initial eDPD system is randomly filled
by many eDPD particles, and a set command "edpd/temp" gives the
initial temperature and a set command "edpd/cv" gives the heat
capacity of eDPD particles. A non-contact heat source/sink term is
applied by a fix command "edpd/source". A compute command
"edpd/temp/atom" obtain the temperature on each eDPD particle. The
simulation will generate a file named "temp.profile" showing the
temperature profile. For details please see online LAMMPS
documentation and Fig.12 in the paper Z. Li, et al. J Comput Phys,
2014, 265: 113-127. DOI: 10.1016/j.jcp.2014.02.003
2) mDPD: The input script "in.mdpd" is an example simulation of
oscillations of a free liquid droplet. The initial configuration is a
liquid film whose particles are in a fcc lattice created by the
command "create atoms". Then the liquid film has a tendency to form a
spherical droplet under the effect of surface tension. For details
please see online LAMMPS documentation and the paper Z. Li, et
al. Phys Fluids, 2013, 25: 072103. DOI: 10.1063/1.4812366
3) tDPD: The input script in.tdpd is an example simulation of
computing the effective diffusion coefficient of a tDPD system using a
method analogous to the periodic Poiseuille flow. Command "atom_style
tdpd 2" specifies the tDPD system with two chemical species. The
initial tDPD system is randomly filled by many tDPD particles, and a
set "cc" command gives initial concentration for each chemical
species. Fix commands "tdpd/source" add source terms and compute
commands "tdpd/cc/atom" obtain the chemical concentration on each tDPD
particle. The simulation will generate a file named "cc.profile"
showing the concentration profiles of the two chemical species. For
details please see online LAMMPS documentation and Fig.1 in the paper
Z. Li, et al. J Chem Phys, 2015, 143: 014101. DOI: 10.1063/1.4923254

View File

@ -0,0 +1,54 @@
########################################################################
### Heat conduction analog of periodic Poiseuille flow problem ###
### using energy-conserving DPD (eDPD) simulation ###
### ###
### Created : Zhen Li (zhen_li@brown.edu) ###
### Division of Applied Mathematics, Brown University. ###
### ###
### mDPD system setup follows Fig.12 in the publication: ###
### Z. Li, Y.-H. Tang, H. Lei, B. Caswell and G.E. Karniadakis. ###
### "Energy-conserving dissipative particle dynamics with ###
### temperature-dependent properties". J. Comput. Phys., ###
### 2014, 265: 113-127. DOI: 10.1016/j.jcp.2014.02.003 ###
########################################################################
units lj
dimension 3
boundary p p p
neighbor 0.2 bin
neigh_modify every 1 delay 0 check yes
atom_style edpd
region edpd block -10 10 -10 10 -5 5 units box
create_box 1 edpd
create_atoms 1 random 16000 276438 NULL
mass 1 1.0
set atom * edpd/temp 1.0
set atom * edpd/cv 1.0E5
pair_style edpd 1.58 9872598
#pair_coeff 1 1 18.75 4.5 0.41 1.58 1.45E-5 2.0 1.58
pair_coeff 1 1 18.75 4.5 0.41 1.58 1.41E-5 2.0 1.58 &
power 10.54 -3.66 3.44 -4.10 &
kappa -0.44 -3.21 5.04 0.00
compute mythermo all temp
thermo 100
thermo_modify temp mythermo
thermo_modify flush yes
velocity all create 1.0 432982 loop local dist gaussian
fix mvv all mvv/edpd 0.5
fix upper all edpd/source cuboid 0.0 5.0 0.0 20.0 10.0 10.0 0.01
fix lower all edpd/source cuboid 0.0 -5.0 0.0 20.0 10.0 10.0 -0.01
timestep 0.01
run 500
reset_timestep 0
compute temp all edpd/temp/atom
compute ccT all chunk/atom bin/1d y 0.0 1.0
fix stat all ave/chunk 1 500 500 ccT c_temp density/number norm sample file temp.profile
run 500

View File

@ -0,0 +1,142 @@
LAMMPS (11 Aug 2017)
########################################################################
### Heat conduction analog of periodic Poiseuille flow problem ###
### using energy-conserving DPD (eDPD) simulation ###
### ###
### Created : Zhen Li (zhen_li@brown.edu) ###
### Division of Applied Mathematics, Brown University. ###
### ###
### mDPD system setup follows Fig.12 in the publication: ###
### Z. Li, Y.-H. Tang, H. Lei, B. Caswell and G.E. Karniadakis. ###
### "Energy-conserving dissipative particle dynamics with ###
### temperature-dependent properties". J. Comput. Phys., ###
### 2014, 265: 113-127. DOI: 10.1016/j.jcp.2014.02.003 ###
########################################################################
units lj
dimension 3
boundary p p p
neighbor 0.2 bin
neigh_modify every 1 delay 0 check yes
atom_style edpd
region edpd block -10 10 -10 10 -5 5 units box
create_box 1 edpd
Created orthogonal box = (-10 -10 -5) to (10 10 5)
1 by 1 by 1 MPI processor grid
create_atoms 1 random 16000 276438 NULL
Created 16000 atoms
mass 1 1.0
set atom * edpd/temp 1.0
16000 settings made for edpd/temp
set atom * edpd/cv 1.0E5
16000 settings made for edpd/cv
pair_style edpd 1.58 9872598
#pair_coeff 1 1 18.75 4.5 0.41 1.58 1.45E-5 2.0 1.58
pair_coeff 1 1 18.75 4.5 0.41 1.58 1.41E-5 2.0 1.58 power 10.54 -3.66 3.44 -4.10 kappa -0.44 -3.21 5.04 0.00
compute mythermo all temp
thermo 100
thermo_modify temp mythermo
thermo_modify flush yes
velocity all create 1.0 432982 loop local dist gaussian
fix mvv all mvv/edpd 0.5
fix upper all edpd/source cuboid 0.0 5.0 0.0 20.0 10.0 10.0 0.01
fix lower all edpd/source cuboid 0.0 -5.0 0.0 20.0 10.0 10.0 -0.01
timestep 0.01
run 500
Neighbor list info ...
update every 1 steps, delay 0 steps, check yes
max neighbors/atom: 2000, page size: 100000
master list distance cutoff = 1.78
ghost atom cutoff = 1.78
binsize = 0.89, bins = 23 23 12
1 neighbor lists, perpetual/occasional/extra = 1 0 0
(1) pair edpd, perpetual
attributes: half, newton on
pair build: half/bin/atomonly/newton
stencil: half/bin/3d/newton
bin: standard
Per MPI rank memory allocation (min/avg/max) = 11.64 | 11.64 | 11.64 Mbytes
Step Temp E_pair E_mol TotEng Press
0 1 48.948932 0 50.448838 201.73366
100 1.0069712 43.754293 0 45.264656 199.5369
200 0.98667561 43.716052 0 45.195973 196.72854
300 1.0036944 43.706299 0 45.211746 195.35714
400 1.0024228 43.697014 0 45.200554 197.0062
500 0.99968161 43.687445 0 45.186873 193.80596
Loop time of 80.7995 on 1 procs for 500 steps with 16000 atoms
Performance: 5346.567 tau/day, 6.188 timesteps/s
99.9% CPU use with 1 MPI tasks x no OpenMP threads
MPI task timing breakdown:
Section | min time | avg time | max time |%varavg| %total
---------------------------------------------------------------
Pair | 75.106 | 75.106 | 75.106 | 0.0 | 92.95
Neigh | 4.9836 | 4.9836 | 4.9836 | 0.0 | 6.17
Comm | 0.31199 | 0.31199 | 0.31199 | 0.0 | 0.39
Output | 0.00048232 | 0.00048232 | 0.00048232 | 0.0 | 0.00
Modify | 0.29985 | 0.29985 | 0.29985 | 0.0 | 0.37
Other | | 0.09751 | | | 0.12
Nlocal: 16000 ave 16000 max 16000 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Nghost: 14091 ave 14091 max 14091 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Neighs: 749111 ave 749111 max 749111 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Total # of neighbors = 749111
Ave neighs/atom = 46.8194
Neighbor list builds = 181
Dangerous builds = 0
reset_timestep 0
compute temp all edpd/temp/atom
compute ccT all chunk/atom bin/1d y 0.0 1.0
fix stat all ave/chunk 1 500 500 ccT c_temp density/number norm sample file temp.profile
run 500
Per MPI rank memory allocation (min/avg/max) = 12.14 | 12.14 | 12.14 Mbytes
Step Temp E_pair E_mol TotEng Press
0 0.99968161 43.687397 0 45.186825 196.38426
100 1.0041443 43.668196 0 45.174318 195.38066
200 0.99628392 43.666173 0 45.160505 197.84675
300 1.0029116 43.66224 0 45.166513 199.67414
400 0.99922193 43.64406 0 45.142799 196.94404
500 0.99355431 43.623266 0 45.113505 195.94136
Loop time of 80.7742 on 1 procs for 500 steps with 16000 atoms
Performance: 5348.242 tau/day, 6.190 timesteps/s
99.9% CPU use with 1 MPI tasks x no OpenMP threads
MPI task timing breakdown:
Section | min time | avg time | max time |%varavg| %total
---------------------------------------------------------------
Pair | 75.073 | 75.073 | 75.073 | 0.0 | 92.94
Neigh | 4.8786 | 4.8786 | 4.8786 | 0.0 | 6.04
Comm | 0.31086 | 0.31086 | 0.31086 | 0.0 | 0.38
Output | 0.00045919 | 0.00045919 | 0.00045919 | 0.0 | 0.00
Modify | 0.4139 | 0.4139 | 0.4139 | 0.0 | 0.51
Other | | 0.09731 | | | 0.12
Nlocal: 16000 ave 16000 max 16000 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Nghost: 14091 ave 14091 max 14091 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Neighs: 749667 ave 749667 max 749667 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Total # of neighbors = 749667
Ave neighs/atom = 46.8542
Neighbor list builds = 178
Dangerous builds = 0
Please see the log.cite file for references relevant to this simulation
Total wall time: 0:02:41

View File

@ -0,0 +1,142 @@
LAMMPS (11 Aug 2017)
########################################################################
### Heat conduction analog of periodic Poiseuille flow problem ###
### using energy-conserving DPD (eDPD) simulation ###
### ###
### Created : Zhen Li (zhen_li@brown.edu) ###
### Division of Applied Mathematics, Brown University. ###
### ###
### mDPD system setup follows Fig.12 in the publication: ###
### Z. Li, Y.-H. Tang, H. Lei, B. Caswell and G.E. Karniadakis. ###
### "Energy-conserving dissipative particle dynamics with ###
### temperature-dependent properties". J. Comput. Phys., ###
### 2014, 265: 113-127. DOI: 10.1016/j.jcp.2014.02.003 ###
########################################################################
units lj
dimension 3
boundary p p p
neighbor 0.2 bin
neigh_modify every 1 delay 0 check yes
atom_style edpd
region edpd block -10 10 -10 10 -5 5 units box
create_box 1 edpd
Created orthogonal box = (-10 -10 -5) to (10 10 5)
2 by 2 by 1 MPI processor grid
create_atoms 1 random 16000 276438 NULL
Created 16000 atoms
mass 1 1.0
set atom * edpd/temp 1.0
16000 settings made for edpd/temp
set atom * edpd/cv 1.0E5
16000 settings made for edpd/cv
pair_style edpd 1.58 9872598
#pair_coeff 1 1 18.75 4.5 0.41 1.58 1.45E-5 2.0 1.58
pair_coeff 1 1 18.75 4.5 0.41 1.58 1.41E-5 2.0 1.58 power 10.54 -3.66 3.44 -4.10 kappa -0.44 -3.21 5.04 0.00
compute mythermo all temp
thermo 100
thermo_modify temp mythermo
thermo_modify flush yes
velocity all create 1.0 432982 loop local dist gaussian
fix mvv all mvv/edpd 0.5
fix upper all edpd/source cuboid 0.0 5.0 0.0 20.0 10.0 10.0 0.01
fix lower all edpd/source cuboid 0.0 -5.0 0.0 20.0 10.0 10.0 -0.01
timestep 0.01
run 500
Neighbor list info ...
update every 1 steps, delay 0 steps, check yes
max neighbors/atom: 2000, page size: 100000
master list distance cutoff = 1.78
ghost atom cutoff = 1.78
binsize = 0.89, bins = 23 23 12
1 neighbor lists, perpetual/occasional/extra = 1 0 0
(1) pair edpd, perpetual
attributes: half, newton on
pair build: half/bin/atomonly/newton
stencil: half/bin/3d/newton
bin: standard
Per MPI rank memory allocation (min/avg/max) = 4.969 | 4.979 | 4.985 Mbytes
Step Temp E_pair E_mol TotEng Press
0 1 48.948932 0 50.448838 199.51547
100 1.0106415 43.744371 0 45.260239 196.39598
200 1.0053215 43.714413 0 45.222301 195.35298
300 0.99886399 43.713356 0 45.211559 196.74821
400 1.0035264 43.699086 0 45.204282 195.47446
500 1.0025285 43.698051 0 45.20175 197.27042
Loop time of 21.165 on 4 procs for 500 steps with 16000 atoms
Performance: 20411.046 tau/day, 23.624 timesteps/s
99.9% CPU use with 4 MPI tasks x no OpenMP threads
MPI task timing breakdown:
Section | min time | avg time | max time |%varavg| %total
---------------------------------------------------------------
Pair | 18.713 | 19.101 | 19.41 | 6.0 | 90.25
Neigh | 1.2687 | 1.2925 | 1.3177 | 1.5 | 6.11
Comm | 0.33013 | 0.66337 | 1.0747 | 34.3 | 3.13
Output | 0.00023484 | 0.00028092 | 0.00036526 | 0.0 | 0.00
Modify | 0.073931 | 0.075277 | 0.076306 | 0.3 | 0.36
Other | | 0.03227 | | | 0.15
Nlocal: 4000 ave 4067 max 3930 min
Histogram: 1 1 0 0 0 0 0 0 0 2
Nghost: 5997.5 ave 6052 max 5943 min
Histogram: 1 0 1 0 0 0 0 1 0 1
Neighs: 187388 ave 193157 max 181221 min
Histogram: 1 1 0 0 0 0 0 0 0 2
Total # of neighbors = 749552
Ave neighs/atom = 46.847
Neighbor list builds = 181
Dangerous builds = 0
reset_timestep 0
compute temp all edpd/temp/atom
compute ccT all chunk/atom bin/1d y 0.0 1.0
fix stat all ave/chunk 1 500 500 ccT c_temp density/number norm sample file temp.profile
run 500
Per MPI rank memory allocation (min/avg/max) = 5.221 | 5.23 | 5.236 Mbytes
Step Temp E_pair E_mol TotEng Press
0 1.0025285 43.69801 0 45.201708 194.00452
100 0.9885969 43.679927 0 45.16273 196.28442
200 1.0028463 43.663067 0 45.167242 198.25592
300 1.0027516 43.648817 0 45.152851 198.82226
400 0.99695312 43.641469 0 45.136805 197.97499
500 0.98202292 43.627163 0 45.100105 199.16319
Loop time of 21.576 on 4 procs for 500 steps with 16000 atoms
Performance: 20022.203 tau/day, 23.174 timesteps/s
99.8% CPU use with 4 MPI tasks x no OpenMP threads
MPI task timing breakdown:
Section | min time | avg time | max time |%varavg| %total
---------------------------------------------------------------
Pair | 18.438 | 19.121 | 19.812 | 14.1 | 88.62
Neigh | 1.2568 | 1.2885 | 1.325 | 2.5 | 5.97
Comm | 0.29482 | 1.0219 | 1.7352 | 63.9 | 4.74
Output | 0.00027728 | 0.00029719 | 0.0003531 | 0.0 | 0.00
Modify | 0.11153 | 0.11265 | 0.1135 | 0.2 | 0.52
Other | | 0.03194 | | | 0.15
Nlocal: 4000 ave 4092 max 3899 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Nghost: 5974 ave 6019 max 5915 min
Histogram: 1 0 0 1 0 0 0 0 0 2
Neighs: 187414 ave 196149 max 178418 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Total # of neighbors = 749658
Ave neighs/atom = 46.8536
Neighbor list builds = 181
Dangerous builds = 0
Please see the log.cite file for references relevant to this simulation
Total wall time: 0:00:42

View File

@ -0,0 +1,24 @@
# Chunk-averaged data for fix stat and group density/number
# Timestep Number-of-chunks Total-count
# Chunk Coord1 Ncount c_temp density/number
500 20 16000
1 -9.5 801.636 0.986368 4.00818
2 -8.5 809.788 0.966281 4.04894
3 -7.5 819.754 0.952764 4.09877
4 -6.5 820.364 0.944592 4.10182
5 -5.5 826.146 0.940968 4.13073
6 -4.5 819.52 0.941415 4.0976
7 -3.5 815.182 0.945887 4.07591
8 -2.5 817.168 0.95487 4.08584
9 -1.5 817.282 0.969225 4.08641
10 -0.5 804.204 0.989552 4.02102
11 0.5 793.266 1.01015 3.96633
12 1.5 789.056 1.0308 3.94528
13 2.5 784.344 1.04568 3.92172
14 3.5 780.592 1.05508 3.90296
15 4.5 772.218 1.05968 3.86109
16 5.5 776.968 1.06003 3.88484
17 6.5 780.858 1.05612 3.90429
18 7.5 786.174 1.04752 3.93087
19 8.5 788.922 1.03347 3.94461
20 9.5 796.558 1.01278 3.98279

View File

@ -0,0 +1,24 @@
# Chunk-averaged data for fix stat and group density/number
# Timestep Number-of-chunks Total-count
# Chunk Coord1 Ncount c_temp density/number
500 20 16000
1 -9.5 801.642 0.986089 4.00821
2 -8.5 819.168 0.966072 4.09584
3 -7.5 817.382 0.952718 4.08691
4 -6.5 818 0.944633 4.09
5 -5.5 817.806 0.941105 4.08903
6 -4.5 826.11 0.941499 4.13055
7 -3.5 821.946 0.945922 4.10973
8 -2.5 816.202 0.954889 4.08101
9 -1.5 813.202 0.969281 4.06601
10 -0.5 798.904 0.989463 3.99452
11 0.5 798.056 1.01005 3.99028
12 1.5 793.114 1.03073 3.96557
13 2.5 782.812 1.04569 3.91406
14 3.5 775.69 1.05498 3.87845
15 4.5 778.094 1.05965 3.89047
16 5.5 778.856 1.06002 3.89428
17 6.5 780.51 1.05621 3.90255
18 7.5 780.518 1.04782 3.90259
19 8.5 789.698 1.03348 3.94849
20 9.5 792.29 1.01261 3.96145

View File

@ -0,0 +1,52 @@
########################################################################
#### 3D droplet oscilation using many-body DPD simulation ###
#### ###
#### Created : Zhen Li (zhen_li@brown.edu) ###
#### Division of Applied Mathematics, Brown University. ###
#### ###
#### mDPD parameters follow the choice of the publication: ###
#### Z. Li et al. "Three dimensional flow structures in a moving ###
#### droplet on substrate: a dissipative particle dynamics study" ###
#### Physics of Fluids, 2013, 25: 072103. DOI: 10.1063/1.4812366 ###
########################################################################
units lj
dimension 3
boundary p p p
neighbor 0.3 bin
neigh_modify every 1 delay 0 check yes
atom_style mdpd
region mdpd block -25 25 -10 10 -10 10 units box
create_box 1 mdpd
lattice fcc 6
region film block -20 20 -7.5 7.5 -2.0 2.0 units box
create_atoms 1 region film
pair_style hybrid/overlay mdpd/rhosum mdpd 1.0 1.0 9872598
pair_coeff 1 1 mdpd/rhosum 0.75
pair_coeff 1 1 mdpd -40 25 18.0 1.0 0.75
mass 1 1.0
compute mythermo all temp
thermo 100
thermo_modify temp mythermo
thermo_modify flush yes
velocity all create 1.0 38497 loop local dist gaussian
fix mvv all mvv/dpd
#dump mydump all atom 100 atom.lammpstrj
#dump jpg all image 200 image.*.jpg type type zoom 5 adiam 0.5 &
# view 90 90 box no 0 size 600 200
#dump_modify jpg pad 4
#dump avi all movie 200 movie.avi type type zoom 5 adiam 0.5 &
# view 90 90 box no 0 size 600 200
#dump_modify avi pad 4
timestep 0.01
run 4000

View File

@ -0,0 +1,147 @@
LAMMPS (11 Aug 2017)
########################################################################
#### 3D droplet oscilation using many-body DPD simulation ###
#### ###
#### Created : Zhen Li (zhen_li@brown.edu) ###
#### Division of Applied Mathematics, Brown University. ###
#### ###
#### mDPD parameters follow the choice of the publication: ###
#### Z. Li et al. "Three dimensional flow structures in a moving ###
#### droplet on substrate: a dissipative particle dynamics study" ###
#### Physics of Fluids, 2013, 25: 072103. DOI: 10.1063/1.4812366 ###
########################################################################
units lj
dimension 3
boundary p p p
neighbor 0.3 bin
neigh_modify every 1 delay 0 check yes
atom_style mdpd
region mdpd block -25 25 -10 10 -10 10 units box
create_box 1 mdpd
Created orthogonal box = (-25 -10 -10) to (25 10 10)
1 by 1 by 1 MPI processor grid
lattice fcc 6
Lattice spacing in x,y,z = 0.87358 0.87358 0.87358
region film block -20 20 -7.5 7.5 -2.0 2.0 units box
create_atoms 1 region film
Created 14333 atoms
pair_style hybrid/overlay mdpd/rhosum mdpd 1.0 1.0 9872598
pair_coeff 1 1 mdpd/rhosum 0.75
pair_coeff 1 1 mdpd -40 25 18.0 1.0 0.75
mass 1 1.0
compute mythermo all temp
thermo 100
thermo_modify temp mythermo
thermo_modify flush yes
velocity all create 1.0 38497 loop local dist gaussian
fix mvv all mvv/dpd
dump mydump all atom 100 atom.lammpstrj
#dump jpg all image 200 image.*.jpg type type zoom 5 adiam 0.5 # view 90 90 box no 0 size 600 200
#dump_modify jpg pad 4
#dump avi all movie 200 movie.avi type type zoom 5 adiam 0.5 # view 90 90 box no 0 size 600 200
#dump_modify avi pad 4
timestep 0.01
run 4000
Neighbor list info ...
update every 1 steps, delay 0 steps, check yes
max neighbors/atom: 2000, page size: 100000
master list distance cutoff = 1.3
ghost atom cutoff = 1.3
binsize = 0.65, bins = 77 31 31
2 neighbor lists, perpetual/occasional/extra = 2 0 0
(1) pair mdpd/rhosum, perpetual
attributes: full, newton on
pair build: full/bin/atomonly
stencil: full/bin/3d
bin: standard
(2) pair mdpd, perpetual, half/full from (1)
attributes: half, newton on
pair build: halffull/newton
stencil: none
bin: none
Per MPI rank memory allocation (min/avg/max) = 9.931 | 9.931 | 9.931 Mbytes
Step Temp E_pair E_mol TotEng Press
0 1 -13.346542 0 -11.846647 -6.8495478
100 1.0321029 -7.2846779 0 -5.7366316 -0.77640205
200 1.042287 -6.9534532 0 -5.3901317 -0.27750815
300 1.0583027 -6.8483105 0 -5.2609672 -0.30347708
400 1.0493719 -6.8648608 0 -5.2909127 -0.15312495
500 1.0723786 -6.8341085 0 -5.2256528 0.017227511
600 1.0545695 -6.8152957 0 -5.2335517 -0.024362439
700 1.0507193 -6.8076033 0 -5.2316344 -0.07101536
800 1.0531856 -6.9378568 0 -5.3581886 -0.053943939
900 1.0442995 -6.8501126 0 -5.2837726 -0.13347942
1000 1.0335049 -6.8883554 0 -5.3382062 -0.18420426
1100 1.0287276 -6.8298226 0 -5.2868389 -0.12081558
1200 1.0322527 -6.9462828 0 -5.3980117 -0.18047625
1300 1.0599443 -6.9449975 0 -5.355192 -0.011763589
1400 1.0560932 -6.845479 0 -5.2614498 0.032130055
1500 1.0432786 -6.9035877 0 -5.338779 -0.10268662
1600 1.064183 -6.9116836 0 -5.3155205 -0.060722129
1700 1.0586249 -6.8768278 0 -5.2890013 0.037005566
1800 1.0576064 -7.0060193 0 -5.4197204 -0.036211254
1900 1.0595141 -6.838741 0 -5.2495807 -0.12395681
2000 1.0650509 -6.897976 0 -5.3005111 0.003594807
2100 1.0768273 -6.8874245 0 -5.2722962 0.033283489
2200 1.0511606 -6.9823162 0 -5.4056854 0.015008427
2300 1.0461138 -6.8820601 0 -5.3129988 0.064646933
2400 1.0485369 -6.9437148 0 -5.3710191 -0.16534939
2500 1.0507221 -6.9394786 0 -5.3635054 -0.098289859
2600 1.0518352 -6.8947578 0 -5.3171152 -0.011666785
2700 1.0402369 -6.9273377 0 -5.3670913 0.035267073
2800 1.0426109 -6.912024 0 -5.3482168 0.049597305
2900 1.0358928 -6.9574778 0 -5.4037471 -0.063216561
3000 1.0351023 -6.9844192 0 -5.4318742 -0.10323465
3100 1.0255005 -6.9382486 0 -5.4001052 -0.073954735
3200 1.0150616 -6.9843183 0 -5.4618321 -0.095136405
3300 1.0118112 -6.9522082 0 -5.4345973 -0.12686179
3400 1.0071522 -6.970158 0 -5.4595351 -0.012487475
3500 1.0041758 -6.9773019 0 -5.4711433 -0.098027653
3600 1.0189298 -6.9393039 0 -5.4110158 0.061631719
3700 1.012442 -6.9341423 0 -5.4155852 0.10442772
3800 1.0021246 -6.9594374 0 -5.4563553 -0.081535223
3900 1.0165002 -6.9045321 0 -5.3798882 -0.0088283303
4000 1.0077099 -6.9145511 0 -5.4030918 0.048349691
Loop time of 135.409 on 1 procs for 4000 steps with 14333 atoms
Performance: 25522.736 tau/day, 29.540 timesteps/s
99.9% CPU use with 1 MPI tasks x no OpenMP threads
MPI task timing breakdown:
Section | min time | avg time | max time |%varavg| %total
---------------------------------------------------------------
Pair | 93.074 | 93.074 | 93.074 | 0.0 | 68.74
Neigh | 40.192 | 40.192 | 40.192 | 0.0 | 29.68
Comm | 0.19625 | 0.19625 | 0.19625 | 0.0 | 0.14
Output | 0.41756 | 0.41756 | 0.41756 | 0.0 | 0.31
Modify | 1.0706 | 1.0706 | 1.0706 | 0.0 | 0.79
Other | | 0.4581 | | | 0.34
Nlocal: 14333 ave 14333 max 14333 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Nghost: 11 ave 11 max 11 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Neighs: 401803 ave 401803 max 401803 min
Histogram: 1 0 0 0 0 0 0 0 0 0
FullNghs: 803606 ave 803606 max 803606 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Total # of neighbors = 803606
Ave neighs/atom = 56.0668
Neighbor list builds = 1050
Dangerous builds = 0
Please see the log.cite file for references relevant to this simulation
Total wall time: 0:02:15

View File

@ -0,0 +1,147 @@
LAMMPS (11 Aug 2017)
########################################################################
#### 3D droplet oscilation using many-body DPD simulation ###
#### ###
#### Created : Zhen Li (zhen_li@brown.edu) ###
#### Division of Applied Mathematics, Brown University. ###
#### ###
#### mDPD parameters follow the choice of the publication: ###
#### Z. Li et al. "Three dimensional flow structures in a moving ###
#### droplet on substrate: a dissipative particle dynamics study" ###
#### Physics of Fluids, 2013, 25: 072103. DOI: 10.1063/1.4812366 ###
########################################################################
units lj
dimension 3
boundary p p p
neighbor 0.3 bin
neigh_modify every 1 delay 0 check yes
atom_style mdpd
region mdpd block -25 25 -10 10 -10 10 units box
create_box 1 mdpd
Created orthogonal box = (-25 -10 -10) to (25 10 10)
4 by 1 by 1 MPI processor grid
lattice fcc 6
Lattice spacing in x,y,z = 0.87358 0.87358 0.87358
region film block -20 20 -7.5 7.5 -2.0 2.0 units box
create_atoms 1 region film
Created 14333 atoms
pair_style hybrid/overlay mdpd/rhosum mdpd 1.0 1.0 9872598
pair_coeff 1 1 mdpd/rhosum 0.75
pair_coeff 1 1 mdpd -40 25 18.0 1.0 0.75
mass 1 1.0
compute mythermo all temp
thermo 100
thermo_modify temp mythermo
thermo_modify flush yes
velocity all create 1.0 38497 loop local dist gaussian
fix mvv all mvv/dpd
dump mydump all atom 100 atom.lammpstrj
#dump jpg all image 200 image.*.jpg type type zoom 5 adiam 0.5 # view 90 90 box no 0 size 600 200
#dump_modify jpg pad 4
#dump avi all movie 200 movie.avi type type zoom 5 adiam 0.5 # view 90 90 box no 0 size 600 200
#dump_modify avi pad 4
timestep 0.01
run 4000
Neighbor list info ...
update every 1 steps, delay 0 steps, check yes
max neighbors/atom: 2000, page size: 100000
master list distance cutoff = 1.3
ghost atom cutoff = 1.3
binsize = 0.65, bins = 77 31 31
2 neighbor lists, perpetual/occasional/extra = 2 0 0
(1) pair mdpd/rhosum, perpetual
attributes: full, newton on
pair build: full/bin/atomonly
stencil: full/bin/3d
bin: standard
(2) pair mdpd, perpetual, half/full from (1)
attributes: half, newton on
pair build: halffull/newton
stencil: none
bin: none
Per MPI rank memory allocation (min/avg/max) = 6.265 | 6.655 | 7.045 Mbytes
Step Temp E_pair E_mol TotEng Press
0 1 -13.346542 0 -11.846647 -6.9757225
100 1.0406108 -7.2500697 0 -5.6892624 -0.80306477
200 1.0535506 -6.9452928 0 -5.3650772 -0.39911584
300 1.0644295 -6.8599907 0 -5.2634577 -0.2997968
400 1.0780123 -6.9471342 0 -5.3302286 -0.06274869
500 1.0672153 -6.8269984 0 -5.2262872 0.021251762
600 1.0634304 -6.8366569 0 -5.2416226 -0.021863333
700 1.0544807 -6.8272074 0 -5.2455967 -0.0064688066
800 1.0556172 -6.8859788 0 -5.3026634 0.023983333
900 1.0436201 -6.9246523 0 -5.3593313 -0.12409618
1000 1.0617016 -6.8632331 0 -5.2707919 -0.1145505
1100 1.0323831 -6.951554 0 -5.4030874 -0.030031884
1200 1.0407785 -6.931048 0 -5.3699892 -0.018362136
1300 1.0380953 -6.8785296 0 -5.3214953 -0.099308737
1400 1.0418898 -6.8998 0 -5.3370743 -0.14199421
1500 1.0487254 -6.9671212 0 -5.3941429 -0.12132644
1600 1.0561042 -6.8948881 0 -5.3108424 -0.09627292
1700 1.0524479 -6.9531441 0 -5.3745823 -0.11959782
1800 1.0541197 -6.9219819 0 -5.3409126 0.032964029
1900 1.0531221 -6.8805815 0 -5.3010085 0.030124685
2000 1.0531819 -6.8612868 0 -5.2816242 -0.076876781
2100 1.0757791 -6.919875 0 -5.3063189 -0.04060439
2200 1.069423 -6.9005754 0 -5.2965527 0.015347467
2300 1.0403109 -6.9015402 0 -5.3411827 0.0034687897
2400 1.0547448 -6.9325539 0 -5.3505471 -0.021202325
2500 1.0404195 -6.8494675 0 -5.2889472 0.086947847
2600 1.0499828 -6.9861392 0 -5.4112749 -0.018079308
2700 1.0294278 -6.8525151 0 -5.3084811 0.16911472
2800 1.0220652 -6.8993978 0 -5.366407 0.064820531
2900 1.0347904 -6.9322703 0 -5.3801929 -0.11384964
3000 1.0391372 -6.9519088 0 -5.3933117 0.003050577
3100 1.0335828 -7.0090074 0 -5.4587413 -0.17366664
3200 1.0211896 -6.9421289 0 -5.4104513 0.025299853
3300 1.0019232 -6.9426488 0 -5.4398688 -0.098334724
3400 1.0203541 -6.9310981 0 -5.4006737 -0.0015544982
3500 1.0076794 -6.9519932 0 -5.4405796 -0.056956902
3600 1.0086525 -6.9620979 0 -5.4492247 0.020014884
3700 1.0046112 -7.0011625 0 -5.4943508 -0.083936527
3800 1.0096867 -6.9470382 0 -5.4326138 -0.089521759
3900 1.0074482 -6.9959414 0 -5.4848745 -0.11873698
4000 1.01222 -6.9535694 0 -5.4353454 0.042191466
Loop time of 63.0327 on 4 procs for 4000 steps with 14333 atoms
Performance: 54828.695 tau/day, 63.459 timesteps/s
98.8% CPU use with 4 MPI tasks x no OpenMP threads
MPI task timing breakdown:
Section | min time | avg time | max time |%varavg| %total
---------------------------------------------------------------
Pair | 16.591 | 29.795 | 42.814 | 236.6 | 47.27
Neigh | 2.0347 | 10.239 | 18.555 | 255.6 | 16.24
Comm | 0.70099 | 6.0601 | 11.386 | 207.4 | 9.61
Output | 0.20713 | 0.40902 | 0.61087 | 31.5 | 0.65
Modify | 0.058089 | 0.27033 | 0.4851 | 40.7 | 0.43
Other | | 16.26 | | | 25.79
Nlocal: 3583.25 ave 7207 max 0 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Nghost: 1055.75 ave 2131 max 0 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Neighs: 100549 ave 202192 max 0 min
Histogram: 2 0 0 0 0 0 0 0 0 2
FullNghs: 201098 ave 404372 max 0 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Total # of neighbors = 804390
Ave neighs/atom = 56.1215
Neighbor list builds = 1049
Dangerous builds = 0
Please see the log.cite file for references relevant to this simulation
Total wall time: 0:01:03

View File

@ -0,0 +1,24 @@
# Chunk-averaged data for fix stat and group c_cc2
# Timestep Number-of-chunks Total-count
# Chunk Coord1 Ncount c_cc1 c_cc2
100 20 16000
1 -9.5 797.17 0.986661 1.0077
2 -8.5 802.61 0.967974 1.02003
3 -7.5 795.46 0.957045 1.02873
4 -6.5 806.46 0.951271 1.03428
5 -5.5 802.34 0.94898 1.03692
6 -4.5 799.84 0.949378 1.03673
7 -3.5 798.4 0.952505 1.03374
8 -2.5 800.36 0.959322 1.02778
9 -1.5 797.65 0.971516 1.01867
10 -0.5 808.88 0.990644 1.00626
11 0.5 786.29 1.00924 0.993828
12 1.5 807.16 1.02831 0.981436
13 2.5 797.54 1.04071 0.972184
14 3.5 799.67 1.04749 0.966258
15 4.5 799.61 1.05063 0.963256
16 5.5 806.11 1.05105 0.963052
17 6.5 803.67 1.04877 0.965688
18 7.5 797.39 1.04305 0.971187
19 8.5 801.85 1.03208 0.97993
20 9.5 791.54 1.01351 0.992209

View File

@ -0,0 +1,24 @@
# Chunk-averaged data for fix stat and group c_cc2
# Timestep Number-of-chunks Total-count
# Chunk Coord1 Ncount c_cc1 c_cc2
100 20 16000
1 -9.5 806.92 0.986675 1.00766
2 -8.5 798.01 0.96792 1.02003
3 -7.5 805.43 0.956909 1.02883
4 -6.5 800.54 0.951207 1.03432
5 -5.5 794.14 0.948967 1.03691
6 -4.5 799.75 0.949379 1.03672
7 -3.5 799.65 0.952492 1.03374
8 -2.5 799.94 0.959331 1.02778
9 -1.5 800.96 0.971664 1.01861
10 -0.5 803.97 0.99074 1.00622
11 0.5 800.66 1.00949 0.993673
12 1.5 779.22 1.02824 0.981461
13 2.5 809.13 1.04056 0.972274
14 3.5 805.23 1.04747 0.966272
15 4.5 795.95 1.05061 0.96327
16 5.5 796.4 1.05105 0.963035
17 6.5 806.1 1.04883 0.965621
18 7.5 806.41 1.04305 0.971224
19 8.5 792.2 1.03211 0.979955
20 9.5 799.39 1.01362 0.992156

View File

@ -0,0 +1,54 @@
########################################################################
### Pure diffusion with a reaction source term analog of a periodic ###
### Poiseuille flow problem using transport DPD (tDPD) simulation ###
### ###
### Created : Zhen Li (zhen_li@brown.edu) ###
### Division of Applied Mathematics, Brown University. ###
### ###
### tDPD system setup follows Fig.1 in the publication: ###
### Z. Li, A. Yazdani, A. Tartakovsky and G.E. Karniadakis. ###
### "Transport dissipative particle dynamics model for mesoscopic ###
### advection-diffusion-reaction problems. J. Chem. Phys., ###
### 2015, 143: 014101. DOI: 10.1063/1.4923254 ###
########################################################################
units lj
dimension 3
boundary p p p
neighbor 0.2 bin
neigh_modify every 1 delay 0 check yes
atom_style tdpd 2
region tdpd block -10 10 -10 10 -5 5 units box
create_box 1 tdpd
create_atoms 1 random 16000 276438 NULL
mass 1 1.0
set atom * cc 1 1.0
set atom * cc 2 1.0
pair_style tdpd 1.0 1.58 9872598
pair_coeff 1 1 18.75 4.5 0.41 1.58 1.58 1.0 1.0E-5 2.0 3.0 1.0E-5 2.0
compute mythermo all temp
thermo 50
thermo_modify temp mythermo
thermo_modify flush yes
velocity all create 1.0 432982 loop local dist gaussian
fix mvv all mvv/tdpd 0.5
fix upper1 all tdpd/source 1 cuboid 0.0 5.0 0.0 20.0 10.0 10.0 0.01
fix lower1 all tdpd/source 1 cuboid 0.0 -5.0 0.0 20.0 10.0 10.0 -0.01
fix upper2 all tdpd/source 2 cuboid 0.0 5.0 0.0 20.0 10.0 10.0 -0.01
fix lower2 all tdpd/source 2 cuboid 0.0 -5.0 0.0 20.0 10.0 10.0 0.01
timestep 0.01
run 500
reset_timestep 0
compute cc1 all tdpd/cc/atom 1
compute cc2 all tdpd/cc/atom 2
compute bin all chunk/atom bin/1d y 0.0 1.0
fix stat all ave/chunk 1 100 100 bin c_cc1 c_cc2 norm sample file cc.profile
run 100

View File

@ -0,0 +1,146 @@
LAMMPS (11 Aug 2017)
########################################################################
### Pure diffusion with a reaction source term analog of a periodic ###
### Poiseuille flow problem using transport DPD (tDPD) simulation ###
### ###
### Created : Zhen Li (zhen_li@brown.edu) ###
### Division of Applied Mathematics, Brown University. ###
### ###
### tDPD system setup follows Fig.1 in the publication: ###
### Z. Li, A. Yazdani, A. Tartakovsky and G.E. Karniadakis. ###
### "Transport dissipative particle dynamics model for mesoscopic ###
### advection-diffusion-reaction problems. J. Chem. Phys., ###
### 2015, 143: 014101. DOI: 10.1063/1.4923254 ###
########################################################################
units lj
dimension 3
boundary p p p
neighbor 0.2 bin
neigh_modify every 1 delay 0 check yes
atom_style tdpd 2
region tdpd block -10 10 -10 10 -5 5 units box
create_box 1 tdpd
Created orthogonal box = (-10 -10 -5) to (10 10 5)
1 by 1 by 1 MPI processor grid
create_atoms 1 random 16000 276438 NULL
Created 16000 atoms
mass 1 1.0
set atom * cc 1 1.0
16000 settings made for cc index 1
set atom * cc 2 1.0
16000 settings made for cc index 2
pair_style tdpd 1.0 1.58 9872598
pair_coeff 1 1 18.75 4.5 0.41 1.58 1.58 1.0 1.0E-5 2.0 3.0 1.0E-5 2.0
compute mythermo all temp
thermo 50
thermo_modify temp mythermo
thermo_modify flush yes
velocity all create 1.0 432982 loop local dist gaussian
fix mvv all mvv/tdpd 0.5
fix upper1 all tdpd/source 1 cuboid 0.0 5.0 0.0 20.0 10.0 10.0 0.01
fix lower1 all tdpd/source 1 cuboid 0.0 -5.0 0.0 20.0 10.0 10.0 -0.01
fix upper2 all tdpd/source 2 cuboid 0.0 5.0 0.0 20.0 10.0 10.0 -0.01
fix lower2 all tdpd/source 2 cuboid 0.0 -5.0 0.0 20.0 10.0 10.0 0.01
timestep 0.01
run 500
Neighbor list info ...
update every 1 steps, delay 0 steps, check yes
max neighbors/atom: 2000, page size: 100000
master list distance cutoff = 1.78
ghost atom cutoff = 1.78
binsize = 0.89, bins = 23 23 12
1 neighbor lists, perpetual/occasional/extra = 1 0 0
(1) pair tdpd, perpetual
attributes: half, newton on
pair build: half/bin/atomonly/newton
stencil: half/bin/3d/newton
bin: standard
Per MPI rank memory allocation (min/avg/max) = 11.3 | 11.3 | 11.3 Mbytes
Step Temp E_pair E_mol TotEng Press
0 1 48.948932 0 50.448838 202.19166
50 0.99837766 43.949877 0 45.447349 195.80936
100 0.99846831 43.756995 0 45.254604 198.22348
150 1.0026903 43.72408 0 45.228021 196.61676
200 1.0063144 43.722388 0 45.231765 194.17954
250 1.0032304 43.721864 0 45.226615 197.85829
300 0.9932656 43.703526 0 45.193331 196.57406
350 1.0002916 43.720498 0 45.220841 193.55346
400 0.99475486 43.722965 0 45.215004 196.81546
450 1.0011803 43.712447 0 45.214124 200.46118
500 1.0009006 43.708984 0 45.210241 197.38953
Loop time of 96.0326 on 1 procs for 500 steps with 16000 atoms
Performance: 4498.474 tau/day, 5.207 timesteps/s
99.9% CPU use with 1 MPI tasks x no OpenMP threads
MPI task timing breakdown:
Section | min time | avg time | max time |%varavg| %total
---------------------------------------------------------------
Pair | 90.083 | 90.083 | 90.083 | 0.0 | 93.80
Neigh | 5.049 | 5.049 | 5.049 | 0.0 | 5.26
Comm | 0.34141 | 0.34141 | 0.34141 | 0.0 | 0.36
Output | 0.00092816 | 0.00092816 | 0.00092816 | 0.0 | 0.00
Modify | 0.45991 | 0.45991 | 0.45991 | 0.0 | 0.48
Other | | 0.09865 | | | 0.10
Nlocal: 16000 ave 16000 max 16000 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Nghost: 14091 ave 14091 max 14091 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Neighs: 749379 ave 749379 max 749379 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Total # of neighbors = 749379
Ave neighs/atom = 46.8362
Neighbor list builds = 183
Dangerous builds = 0
reset_timestep 0
compute cc1 all tdpd/cc/atom 1
compute cc2 all tdpd/cc/atom 2
compute bin all chunk/atom bin/1d y 0.0 1.0
fix stat all ave/chunk 1 100 100 bin c_cc1 c_cc2 norm sample file cc.profile
run 100
Per MPI rank memory allocation (min/avg/max) = 11.8 | 11.8 | 11.8 Mbytes
Step Temp E_pair E_mol TotEng Press
0 1.0009006 43.708984 0 45.210241 199.3205
50 1.0007276 43.704844 0 45.205842 197.77053
100 1.0039032 43.714201 0 45.219961 197.31118
Loop time of 19.0326 on 1 procs for 100 steps with 16000 atoms
Performance: 4539.577 tau/day, 5.254 timesteps/s
99.9% CPU use with 1 MPI tasks x no OpenMP threads
MPI task timing breakdown:
Section | min time | avg time | max time |%varavg| %total
---------------------------------------------------------------
Pair | 17.842 | 17.842 | 17.842 | 0.0 | 93.74
Neigh | 0.98674 | 0.98674 | 0.98674 | 0.0 | 5.18
Comm | 0.066013 | 0.066013 | 0.066013 | 0.0 | 0.35
Output | 0.00016284 | 0.00016284 | 0.00016284 | 0.0 | 0.00
Modify | 0.11795 | 0.11795 | 0.11795 | 0.0 | 0.62
Other | | 0.02012 | | | 0.11
Nlocal: 16000 ave 16000 max 16000 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Nghost: 14126 ave 14126 max 14126 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Neighs: 748927 ave 748927 max 748927 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Total # of neighbors = 748927
Ave neighs/atom = 46.8079
Neighbor list builds = 37
Dangerous builds = 0
Please see the log.cite file for references relevant to this simulation
Total wall time: 0:01:55

View File

@ -0,0 +1,146 @@
LAMMPS (11 Aug 2017)
########################################################################
### Pure diffusion with a reaction source term analog of a periodic ###
### Poiseuille flow problem using transport DPD (tDPD) simulation ###
### ###
### Created : Zhen Li (zhen_li@brown.edu) ###
### Division of Applied Mathematics, Brown University. ###
### ###
### tDPD system setup follows Fig.1 in the publication: ###
### Z. Li, A. Yazdani, A. Tartakovsky and G.E. Karniadakis. ###
### "Transport dissipative particle dynamics model for mesoscopic ###
### advection-diffusion-reaction problems. J. Chem. Phys., ###
### 2015, 143: 014101. DOI: 10.1063/1.4923254 ###
########################################################################
units lj
dimension 3
boundary p p p
neighbor 0.2 bin
neigh_modify every 1 delay 0 check yes
atom_style tdpd 2
region tdpd block -10 10 -10 10 -5 5 units box
create_box 1 tdpd
Created orthogonal box = (-10 -10 -5) to (10 10 5)
2 by 2 by 1 MPI processor grid
create_atoms 1 random 16000 276438 NULL
Created 16000 atoms
mass 1 1.0
set atom * cc 1 1.0
16000 settings made for cc index 1
set atom * cc 2 1.0
16000 settings made for cc index 2
pair_style tdpd 1.0 1.58 9872598
pair_coeff 1 1 18.75 4.5 0.41 1.58 1.58 1.0 1.0E-5 2.0 3.0 1.0E-5 2.0
compute mythermo all temp
thermo 50
thermo_modify temp mythermo
thermo_modify flush yes
velocity all create 1.0 432982 loop local dist gaussian
fix mvv all mvv/tdpd 0.5
fix upper1 all tdpd/source 1 cuboid 0.0 5.0 0.0 20.0 10.0 10.0 0.01
fix lower1 all tdpd/source 1 cuboid 0.0 -5.0 0.0 20.0 10.0 10.0 -0.01
fix upper2 all tdpd/source 2 cuboid 0.0 5.0 0.0 20.0 10.0 10.0 -0.01
fix lower2 all tdpd/source 2 cuboid 0.0 -5.0 0.0 20.0 10.0 10.0 0.01
timestep 0.01
run 500
Neighbor list info ...
update every 1 steps, delay 0 steps, check yes
max neighbors/atom: 2000, page size: 100000
master list distance cutoff = 1.78
ghost atom cutoff = 1.78
binsize = 0.89, bins = 23 23 12
1 neighbor lists, perpetual/occasional/extra = 1 0 0
(1) pair tdpd, perpetual
attributes: half, newton on
pair build: half/bin/atomonly/newton
stencil: half/bin/3d/newton
bin: standard
Per MPI rank memory allocation (min/avg/max) = 4.814 | 4.823 | 4.829 Mbytes
Step Temp E_pair E_mol TotEng Press
0 1 48.948932 0 50.448838 199.65978
50 1.0153476 43.948796 0 45.471722 198.3346
100 1.0064284 43.754875 0 45.264424 197.5308
150 0.99609985 43.726751 0 45.220807 197.50623
200 1.0016604 43.720283 0 45.22268 197.81129
250 1.0054979 43.718568 0 45.22672 195.79405
300 0.9997618 43.716617 0 45.216166 197.84788
350 0.99170101 43.72093 0 45.208389 196.07711
400 1.0043692 43.71648 0 45.22294 199.55247
450 1.0086263 43.709988 0 45.222833 198.20516
500 1.0029076 43.717879 0 45.222146 197.26281
Loop time of 24.5533 on 4 procs for 500 steps with 16000 atoms
Performance: 17594.412 tau/day, 20.364 timesteps/s
99.9% CPU use with 4 MPI tasks x no OpenMP threads
MPI task timing breakdown:
Section | min time | avg time | max time |%varavg| %total
---------------------------------------------------------------
Pair | 22.236 | 22.418 | 22.736 | 4.0 | 91.30
Neigh | 1.2759 | 1.2883 | 1.3077 | 1.1 | 5.25
Comm | 0.35749 | 0.69526 | 0.88462 | 24.1 | 2.83
Output | 0.00043321 | 0.00050318 | 0.00070691 | 0.0 | 0.00
Modify | 0.11555 | 0.11648 | 0.11888 | 0.4 | 0.47
Other | | 0.03473 | | | 0.14
Nlocal: 4000 ave 4012 max 3982 min
Histogram: 1 0 0 0 0 1 0 0 0 2
Nghost: 5986.25 ave 6016 max 5956 min
Histogram: 1 0 0 0 1 0 1 0 0 1
Neighs: 187309 ave 188264 max 186087 min
Histogram: 1 0 0 0 1 0 0 1 0 1
Total # of neighbors = 749235
Ave neighs/atom = 46.8272
Neighbor list builds = 180
Dangerous builds = 0
reset_timestep 0
compute cc1 all tdpd/cc/atom 1
compute cc2 all tdpd/cc/atom 2
compute bin all chunk/atom bin/1d y 0.0 1.0
fix stat all ave/chunk 1 100 100 bin c_cc1 c_cc2 norm sample file cc.profile
run 100
Per MPI rank memory allocation (min/avg/max) = 5.065 | 5.074 | 5.082 Mbytes
Step Temp E_pair E_mol TotEng Press
0 1.0029076 43.717879 0 45.222146 198.45789
50 1.0077982 43.713264 0 45.224867 196.56183
100 1.0036823 43.708022 0 45.213451 196.00815
Loop time of 4.79577 on 4 procs for 100 steps with 16000 atoms
Performance: 18015.870 tau/day, 20.852 timesteps/s
99.9% CPU use with 4 MPI tasks x no OpenMP threads
MPI task timing breakdown:
Section | min time | avg time | max time |%varavg| %total
---------------------------------------------------------------
Pair | 4.3481 | 4.39 | 4.4398 | 1.7 | 91.54
Neigh | 0.25477 | 0.25675 | 0.25963 | 0.4 | 5.35
Comm | 0.059327 | 0.11194 | 0.15608 | 11.0 | 2.33
Output | 0.00011206 | 0.00011748 | 0.00011992 | 0.0 | 0.00
Modify | 0.030417 | 0.030622 | 0.030739 | 0.1 | 0.64
Other | | 0.006301 | | | 0.13
Nlocal: 4000 ave 4010 max 3987 min
Histogram: 1 0 0 0 0 1 1 0 0 1
Nghost: 5985.25 ave 6025 max 5959 min
Histogram: 2 0 0 0 0 1 0 0 0 1
Neighs: 187304 ave 188092 max 186449 min
Histogram: 1 0 0 0 0 2 0 0 0 1
Total # of neighbors = 749216
Ave neighs/atom = 46.826
Neighbor list builds = 38
Dangerous builds = 0
Please see the log.cite file for references relevant to this simulation
Total wall time: 0:00:29

View File

@ -59,7 +59,8 @@ PACKAGE = asphere body class2 colloid compress coreshell dipole gpu \
PACKUSER = user-atc user-awpmd user-cgdna user-cgsdk user-colvars \ PACKUSER = user-atc user-awpmd user-cgdna user-cgsdk user-colvars \
user-diffraction user-dpd user-drude user-eff user-fep user-h5md \ user-diffraction user-dpd user-drude user-eff user-fep user-h5md \
user-intel user-lb user-manifold user-meamc user-mgpt user-misc user-molfile \ user-intel user-lb user-manifold user-meamc user-meso \
user-mgpt user-misc user-molfile \
user-netcdf user-omp user-phonon user-qmmm user-qtb \ user-netcdf user-omp user-phonon user-qmmm user-qtb \
user-quip user-reaxc user-smd user-smtbq user-sph user-tally \ user-quip user-reaxc user-smd user-smtbq user-sph user-tally \
user-vtk user-vtk

50
src/USER-MESO/README Normal file
View File

@ -0,0 +1,50 @@
This package implements three extensions of the dissipative particle
dynamics (DPD) method, i.e., energy-conserving DPD (eDPD) that can
model non-isothermal processes, many-body DPD (mDPD) for simulating
vapor-liquid coexistence, and transport DPD (tDPD) for modeling
advection-diffuion-reaction systems. The equations of motion of these
DPD extensions are integrated through the modified velocity-Verlet
(MVV) algorithm.
Currently, the package has the following features:
* Three new atom styles (eDPD, mDPD, tDPD) for tracking the particles
with internal temperature, local mass density, and chemical
concentration.
* Three set commands (edpd/temp, edpd/cv, cc) for setting internal
temperature (edpd/temp) and heat capacity (edpd/cv) for eDPD
particles and for setting chemical concentration (cc) for tDPD
particles.
* Two compute commands (edpd/temp/atom, tdpd/cc/atom) for accessing
the internal temperature of eDPD particles and the chemical
concentration of tDPD particles.
* Three fix commands (mvv/dpd, mvv/edpd, mvv/tdpd) for integrating the
shochastic ODEs using the modified velocity-Verlet (MVV) algorithm.
* Two fix commands (edpd/source, tdpd/source) for adding additional
heat source/sink or chemical concentration source/sink to eDPD and
tDPD particles.
* One pair style (edpd) for modeling a eDPD fluid.
* Two pair styles (mdpd/rhosum, mdpd) for modeling a mDPD fluid.
* One pair style (tdpd) for modeling a tDPD fluid.
See the doc pages for "atom style edpd", "atom style mdpd", "atom
style tdpd", "set edpd/temp", "set edpd/cv", "set tdpd/cc", "compute
edpd/temp/atom", "compute tdpd/cc/atom", "fix mvv/dpd", "fix
mvv/edpd", "fix mvv/tdpd", "fix edpd/source", "fix tdpd/source", "pair
edpd", "pair mdpd/rhosum", "pair mdpd", "pair tdpd" commands to get
started. At the bottom of the doc pages are many links to additional
documentation contained in the doc/USER/meso directory.
There are example scripts for using this package in
examples/USER/meso.
The person who created this package is Zhen Li (zhen_li at brown.edu)
at Division of Applied Mathematics, Brown University, USA. Contact him
directly if you have questions.

View File

@ -0,0 +1,844 @@
/* ----------------------------------------------------------------------
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.
------------------------------------------------------------------------- */
#include <string.h>
#include <stdlib.h>
#include "atom_vec_edpd.h"
#include "atom.h"
#include "comm.h"
#include "domain.h"
#include "modify.h"
#include "fix.h"
#include "update.h"
#include "memory.h"
#include "error.h"
using namespace LAMMPS_NS;
/* ---------------------------------------------------------------------- */
AtomVecEDPD::AtomVecEDPD(LAMMPS *lmp) : AtomVec(lmp)
{
if(strcmp(update->unit_style,"lj") != 0)
error->all(FLERR,"Atom style edpd requires lj units");
molecular = 0;
mass_type = 1;
forceclearflag = 1;
comm_x_only = comm_f_only = 0;
comm->ghost_velocity = 1;
size_forward = 3 + 5; // edpd_temp + vest[4]
size_reverse = 3 + 1; // edpd_flux
size_border = 6 + 6; // edpd_temp + edpd_cv + vest[4]
size_velocity = 3;
size_data_atom = 5 + 2; // we read id + type + edpd_temp + edpd_cv + xyz[3]
size_data_vel = 4;
xcol_data = 5;
atom->edpd_flag = 1;
atom->vest_flag = 1;
}
/* ----------------------------------------------------------------------
grow atom arrays
n = 0 grows arrays by a chunk
n > 0 allocates arrays to size n
------------------------------------------------------------------------- */
void AtomVecEDPD::grow(int n)
{
if (n == 0) grow_nmax();
else nmax = n;
atom->nmax = nmax;
if (nmax < 0 || nmax > MAXSMALLINT)
error->one(FLERR,"Per-processor system is too big");
tag = memory->grow(atom->tag,nmax,"atom:tag");
type = memory->grow(atom->type,nmax,"atom:type");
mask = memory->grow(atom->mask,nmax,"atom:mask");
image = memory->grow(atom->image,nmax,"atom:image");
x = memory->grow(atom->x,nmax,3,"atom:x");
v = memory->grow(atom->v,nmax,3,"atom:v");
f = memory->grow(atom->f,nmax*comm->nthreads,3,"atom:f");
edpd_cv= memory->grow(atom->edpd_cv, nmax, "atom:edpd_cv");
edpd_temp = memory->grow(atom->edpd_temp, nmax, "atom:edpd_temp");
edpd_flux = memory->grow(atom->edpd_flux, nmax*comm->nthreads,"atom:edpd_flux");
vest = memory->grow(atom->vest, nmax, 4, "atom:vest");
if (atom->nextra_grow)
for (int iextra = 0; iextra < atom->nextra_grow; iextra++)
modify->fix[atom->extra_grow[iextra]]->grow_arrays(nmax);
}
/* ----------------------------------------------------------------------
reset local array ptrs
------------------------------------------------------------------------- */
void AtomVecEDPD::grow_reset()
{
tag = atom->tag; type = atom->type;
mask = atom->mask; image = atom->image;
x = atom->x; v = atom->v; f = atom->f;
edpd_cv = atom->cv; edpd_temp = atom->edpd_temp; edpd_flux = atom->edpd_flux;
vest = atom->vest;
}
/* ----------------------------------------------------------------------
copy atom I info to atom J
------------------------------------------------------------------------- */
void AtomVecEDPD::copy(int i, int j, int delflag)
{
tag[j] = tag[i];
type[j] = type[i];
mask[j] = mask[i];
image[j] = image[i];
x[j][0] = x[i][0];
x[j][1] = x[i][1];
x[j][2] = x[i][2];
v[j][0] = v[i][0];
v[j][1] = v[i][1];
v[j][2] = v[i][2];
edpd_temp[j] = edpd_temp[i];
edpd_flux[j] = edpd_flux[i];
edpd_cv[j] = edpd_cv[i];
vest[j][0] = vest[i][0];
vest[j][1] = vest[i][1];
vest[j][2] = vest[i][2];
vest[j][3] = vest[i][3];
if (atom->nextra_grow)
for (int iextra = 0; iextra < atom->nextra_grow; iextra++)
modify->fix[atom->extra_grow[iextra]]->copy_arrays(i,j,delflag);
}
void AtomVecEDPD::force_clear(int n, size_t nbytes)
{
memset(&edpd_flux[n],0,nbytes);
}
/* ---------------------------------------------------------------------- */
int AtomVecEDPD::pack_comm(int n, int *list, double *buf,
int pbc_flag, int *pbc)
{
int i,j,k,m;
double dx,dy,dz;
m = 0;
if (pbc_flag == 0) {
for (i = 0; i < n; i++) {
j = list[i];
buf[m++] = x[j][0];
buf[m++] = x[j][1];
buf[m++] = x[j][2];
buf[m++] = edpd_temp[j];
buf[m++] = vest[j][0];
buf[m++] = vest[j][1];
buf[m++] = vest[j][2];
buf[m++] = vest[j][3];
}
} else {
if (domain->triclinic == 0) {
dx = pbc[0]*domain->xprd;
dy = pbc[1]*domain->yprd;
dz = pbc[2]*domain->zprd;
} else {
dx = pbc[0]*domain->xprd + pbc[5]*domain->xy + pbc[4]*domain->xz;
dy = pbc[1]*domain->yprd + pbc[3]*domain->yz;
dz = pbc[2]*domain->zprd;
}
for (i = 0; i < n; i++) {
j = list[i];
buf[m++] = x[j][0] + dx;
buf[m++] = x[j][1] + dy;
buf[m++] = x[j][2] + dz;
buf[m++] = edpd_temp[j];
buf[m++] = vest[j][0];
buf[m++] = vest[j][1];
buf[m++] = vest[j][2];
buf[m++] = vest[j][3];
}
}
return m;
}
/* ---------------------------------------------------------------------- */
int AtomVecEDPD::pack_comm_vel(int n, int *list, double *buf,
int pbc_flag, int *pbc)
{
int i,j,k,m;
double dx,dy,dz,dvx,dvy,dvz;
m = 0;
if (pbc_flag == 0) {
for (i = 0; i < n; i++) {
j = list[i];
buf[m++] = x[j][0];
buf[m++] = x[j][1];
buf[m++] = x[j][2];
buf[m++] = v[j][0];
buf[m++] = v[j][1];
buf[m++] = v[j][2];
buf[m++] = edpd_temp[j];
buf[m++] = vest[j][0];
buf[m++] = vest[j][1];
buf[m++] = vest[j][2];
buf[m++] = vest[j][3];
}
} else {
if (domain->triclinic == 0) {
dx = pbc[0]*domain->xprd;
dy = pbc[1]*domain->yprd;
dz = pbc[2]*domain->zprd;
} else {
dx = pbc[0]*domain->xprd + pbc[5]*domain->xy + pbc[4]*domain->xz;
dy = pbc[1]*domain->yprd + pbc[3]*domain->yz;
dz = pbc[2]*domain->zprd;
}
if (!deform_vremap) {
for (i = 0; i < n; i++) {
j = list[i];
buf[m++] = x[j][0] + dx;
buf[m++] = x[j][1] + dy;
buf[m++] = x[j][2] + dz;
buf[m++] = v[j][0];
buf[m++] = v[j][1];
buf[m++] = v[j][2];
buf[m++] = edpd_temp[j];
buf[m++] = vest[j][0];
buf[m++] = vest[j][1];
buf[m++] = vest[j][2];
buf[m++] = vest[j][3];
}
} else {
dvx = pbc[0]*h_rate[0] + pbc[5]*h_rate[5] + pbc[4]*h_rate[4];
dvy = pbc[1]*h_rate[1] + pbc[3]*h_rate[3];
dvz = pbc[2]*h_rate[2];
for (i = 0; i < n; i++) {
j = list[i];
buf[m++] = x[j][0] + dx;
buf[m++] = x[j][1] + dy;
buf[m++] = x[j][2] + dz;
if (mask[i] & deform_groupbit) {
buf[m++] = v[j][0] + dvx;
buf[m++] = v[j][1] + dvy;
buf[m++] = v[j][2] + dvz;
} else {
buf[m++] = v[j][0];
buf[m++] = v[j][1];
buf[m++] = v[j][2];
}
buf[m++] = edpd_temp[j];
buf[m++] = vest[j][0];
buf[m++] = vest[j][1];
buf[m++] = vest[j][2];
buf[m++] = vest[j][3];
}
}
}
return m;
}
/* ---------------------------------------------------------------------- */
void AtomVecEDPD::unpack_comm(int n, int first, double *buf)
{
int i,m,last;
m = 0;
last = first + n;
for (i = first; i < last; i++) {
x[i][0] = buf[m++];
x[i][1] = buf[m++];
x[i][2] = buf[m++];
edpd_temp[i] = buf[m++];
vest[i][0] = buf[m++];
vest[i][1] = buf[m++];
vest[i][2] = buf[m++];
vest[i][3] = buf[m++];
}
}
/* ---------------------------------------------------------------------- */
void AtomVecEDPD::unpack_comm_vel(int n, int first, double *buf)
{
int i,m,last;
m = 0;
last = first + n;
for (i = first; i < last; i++) {
x[i][0] = buf[m++];
x[i][1] = buf[m++];
x[i][2] = buf[m++];
v[i][0] = buf[m++];
v[i][1] = buf[m++];
v[i][2] = buf[m++];
edpd_temp[i] = buf[m++];
vest[i][0] = buf[m++];
vest[i][1] = buf[m++];
vest[i][2] = buf[m++];
vest[i][3] = buf[m++];
}
}
/* ---------------------------------------------------------------------- */
int AtomVecEDPD::pack_reverse(int n, int first, double *buf)
{
int i,m,last;
m = 0;
last = first + n;
for (i = first; i < last; i++) {
buf[m++] = f[i][0];
buf[m++] = f[i][1];
buf[m++] = f[i][2];
buf[m++] = edpd_flux[i];
}
return m;
}
/* ---------------------------------------------------------------------- */
void AtomVecEDPD::unpack_reverse(int n, int *list, double *buf)
{
int i,j,m;
m = 0;
for (i = 0; i < n; i++) {
j = list[i];
f[j][0] += buf[m++];
f[j][1] += buf[m++];
f[j][2] += buf[m++];
edpd_flux[j] += buf[m++];
}
}
/* ---------------------------------------------------------------------- */
int AtomVecEDPD::pack_border(int n, int *list, double *buf,
int pbc_flag, int *pbc)
{
int i,j,m;
double dx,dy,dz;
m = 0;
if (pbc_flag == 0) {
for (i = 0; i < n; i++) {
j = list[i];
buf[m++] = x[j][0];
buf[m++] = x[j][1];
buf[m++] = x[j][2];
buf[m++] = ubuf(tag[j]).d;
buf[m++] = ubuf(type[j]).d;
buf[m++] = ubuf(mask[j]).d;
buf[m++] = edpd_temp[j];
buf[m++] = edpd_cv[j];
buf[m++] = vest[j][0];
buf[m++] = vest[j][1];
buf[m++] = vest[j][2];
buf[m++] = vest[j][3];
}
} else {
if (domain->triclinic == 0) {
dx = pbc[0]*domain->xprd;
dy = pbc[1]*domain->yprd;
dz = pbc[2]*domain->zprd;
} else {
dx = pbc[0];
dy = pbc[1];
dz = pbc[2];
}
for (i = 0; i < n; i++) {
j = list[i];
buf[m++] = x[j][0] + dx;
buf[m++] = x[j][1] + dy;
buf[m++] = x[j][2] + dz;
buf[m++] = ubuf(tag[j]).d;
buf[m++] = ubuf(type[j]).d;
buf[m++] = ubuf(mask[j]).d;
buf[m++] = edpd_temp[j];
buf[m++] = edpd_cv[j];
buf[m++] = vest[j][0];
buf[m++] = vest[j][1];
buf[m++] = vest[j][2];
buf[m++] = vest[j][3];
}
}
if (atom->nextra_border)
for (int iextra = 0; iextra < atom->nextra_border; iextra++)
m += modify->fix[atom->extra_border[iextra]]->pack_border(n,list,&buf[m]);
return m;
}
/* ---------------------------------------------------------------------- */
int AtomVecEDPD::pack_border_vel(int n, int *list, double *buf,
int pbc_flag, int *pbc)
{
int i,j,m;
double dx,dy,dz,dvx,dvy,dvz;
m = 0;
if (pbc_flag == 0) {
for (i = 0; i < n; i++) {
j = list[i];
buf[m++] = x[j][0];
buf[m++] = x[j][1];
buf[m++] = x[j][2];
buf[m++] = ubuf(tag[j]).d;
buf[m++] = ubuf(type[j]).d;
buf[m++] = ubuf(mask[j]).d;
buf[m++] = edpd_temp[j];
buf[m++] = edpd_cv[j];
buf[m++] = v[j][0];
buf[m++] = v[j][1];
buf[m++] = v[j][2];
buf[m++] = vest[j][0];
buf[m++] = vest[j][1];
buf[m++] = vest[j][2];
buf[m++] = vest[j][3];
}
} else {
if (domain->triclinic == 0) {
dx = pbc[0]*domain->xprd;
dy = pbc[1]*domain->yprd;
dz = pbc[2]*domain->zprd;
} else {
dx = pbc[0];
dy = pbc[1];
dz = pbc[2];
}
if (!deform_vremap) {
for (i = 0; i < n; i++) {
j = list[i];
buf[m++] = x[j][0] + dx;
buf[m++] = x[j][1] + dy;
buf[m++] = x[j][2] + dz;
buf[m++] = ubuf(tag[j]).d;
buf[m++] = ubuf(type[j]).d;
buf[m++] = ubuf(mask[j]).d;
buf[m++] = edpd_temp[j];
buf[m++] = edpd_cv[j];
buf[m++] = v[j][0];
buf[m++] = v[j][1];
buf[m++] = v[j][2];
buf[m++] = vest[j][0];
buf[m++] = vest[j][1];
buf[m++] = vest[j][2];
buf[m++] = vest[j][3];
}
} else {
dvx = pbc[0]*h_rate[0] + pbc[5]*h_rate[5] + pbc[4]*h_rate[4];
dvy = pbc[1]*h_rate[1] + pbc[3]*h_rate[3];
dvz = pbc[2]*h_rate[2];
for (i = 0; i < n; i++) {
j = list[i];
buf[m++] = x[j][0] + dx;
buf[m++] = x[j][1] + dy;
buf[m++] = x[j][2] + dz;
buf[m++] = ubuf(tag[j]).d;
buf[m++] = ubuf(type[j]).d;
buf[m++] = ubuf(mask[j]).d;
buf[m++] = edpd_temp[j];
buf[m++] = edpd_cv[j];
if (mask[i] & deform_groupbit) {
buf[m++] = v[j][0] + dvx;
buf[m++] = v[j][1] + dvy;
buf[m++] = v[j][2] + dvz;
buf[m++] = vest[j][0] + dvx;
buf[m++] = vest[j][1] + dvy;
buf[m++] = vest[j][2] + dvz;
buf[m++] = vest[j][3];
} else {
buf[m++] = v[j][0];
buf[m++] = v[j][1];
buf[m++] = v[j][2];
buf[m++] = vest[j][0];
buf[m++] = vest[j][1];
buf[m++] = vest[j][2];
buf[m++] = vest[j][3];
}
}
}
}
if (atom->nextra_border)
for (int iextra = 0; iextra < atom->nextra_border; iextra++)
m += modify->fix[atom->extra_border[iextra]]->pack_border(n,list,&buf[m]);
return m;
}
/* ---------------------------------------------------------------------- */
void AtomVecEDPD::unpack_border(int n, int first, double *buf)
{
int i,m,last;
m = 0;
last = first + n;
for (i = first; i < last; i++) {
if (i == nmax) grow(0);
x[i][0] = buf[m++];
x[i][1] = buf[m++];
x[i][2] = buf[m++];
tag[i] = (tagint) ubuf(buf[m++]).i;
type[i] = (int) ubuf(buf[m++]).i;
mask[i] = (int) ubuf(buf[m++]).i;
edpd_temp[i] = buf[m++];
edpd_cv[i] = buf[m++];
vest[i][0] = buf[m++];
vest[i][1] = buf[m++];
vest[i][2] = buf[m++];
vest[i][3] = buf[m++];
}
if (atom->nextra_border)
for (int iextra = 0; iextra < atom->nextra_border; iextra++)
m += modify->fix[atom->extra_border[iextra]]->
unpack_border(n,first,&buf[m]);
}
/* ---------------------------------------------------------------------- */
void AtomVecEDPD::unpack_border_vel(int n, int first, double *buf)
{
int i,m,last;
m = 0;
last = first + n;
for (i = first; i < last; i++) {
if (i == nmax) grow(0);
x[i][0] = buf[m++];
x[i][1] = buf[m++];
x[i][2] = buf[m++];
tag[i] = (tagint) ubuf(buf[m++]).i;
type[i] = (int) ubuf(buf[m++]).i;
mask[i] = (int) ubuf(buf[m++]).i;
edpd_temp[i] = buf[m++];
edpd_cv[i] = buf[m++];
v[i][0] = buf[m++];
v[i][1] = buf[m++];
v[i][2] = buf[m++];
vest[i][0] = buf[m++];
vest[i][1] = buf[m++];
vest[i][2] = buf[m++];
vest[i][3] = buf[m++];
}
if (atom->nextra_border)
for (int iextra = 0; iextra < atom->nextra_border; iextra++)
m += modify->fix[atom->extra_border[iextra]]->
unpack_border(n,first,&buf[m]);
}
/* ----------------------------------------------------------------------
pack data for atom I for sending to another proc
xyz must be 1st 3 values, so comm::exchange() can test on them
------------------------------------------------------------------------- */
int AtomVecEDPD::pack_exchange(int i, double *buf)
{
int m = 1;
buf[m++] = x[i][0];
buf[m++] = x[i][1];
buf[m++] = x[i][2];
buf[m++] = v[i][0];
buf[m++] = v[i][1];
buf[m++] = v[i][2];
buf[m++] = ubuf(tag[i]).d;
buf[m++] = ubuf(type[i]).d;
buf[m++] = ubuf(mask[i]).d;
buf[m++] = ubuf(image[i]).d;
buf[m++] = edpd_temp[i];
buf[m++] = edpd_cv[i];
buf[m++] = vest[i][0];
buf[m++] = vest[i][1];
buf[m++] = vest[i][2];
buf[m++] = vest[i][3];
if (atom->nextra_grow)
for (int iextra = 0; iextra < atom->nextra_grow; iextra++)
m += modify->fix[atom->extra_grow[iextra]]->pack_exchange(i,&buf[m]);
buf[0] = m;
return m;
}
/* ---------------------------------------------------------------------- */
int AtomVecEDPD::unpack_exchange(double *buf)
{
int nlocal = atom->nlocal;
if (nlocal == nmax) grow(0);
int m = 1;
x[nlocal][0] = buf[m++];
x[nlocal][1] = buf[m++];
x[nlocal][2] = buf[m++];
v[nlocal][0] = buf[m++];
v[nlocal][1] = buf[m++];
v[nlocal][2] = buf[m++];
tag[nlocal] = (tagint) ubuf(buf[m++]).i;
type[nlocal] = (int) ubuf(buf[m++]).i;
mask[nlocal] = (int) ubuf(buf[m++]).i;
image[nlocal] = (imageint) ubuf(buf[m++]).i;
edpd_temp[nlocal] = buf[m++];
edpd_cv[nlocal] = buf[m++];
vest[nlocal][0] = buf[m++];
vest[nlocal][1] = buf[m++];
vest[nlocal][2] = buf[m++];
vest[nlocal][3] = buf[m++];
if (atom->nextra_grow)
for (int iextra = 0; iextra < atom->nextra_grow; iextra++)
m += modify->fix[atom->extra_grow[iextra]]->
unpack_exchange(nlocal,&buf[m]);
atom->nlocal++;
return m;
}
/* ----------------------------------------------------------------------
size of restart data for all atoms owned by this proc
include extra data stored by fixes
------------------------------------------------------------------------- */
int AtomVecEDPD::size_restart()
{
int i;
int nlocal = atom->nlocal;
int n = (11 + 6) * nlocal; // 11 + edpd_temp + edpd_cv + vest[4]
if (atom->nextra_restart)
for (int iextra = 0; iextra < atom->nextra_restart; iextra++)
for (i = 0; i < nlocal; i++)
n += modify->fix[atom->extra_restart[iextra]]->size_restart(i);
return n;
}
/* ----------------------------------------------------------------------
pack atom I's data for restart file including extra quantities
xyz must be 1st 3 values, so that read_restart can test on them
molecular types may be negative, but write as positive
------------------------------------------------------------------------- */
int AtomVecEDPD::pack_restart(int i, double *buf)
{
int m = 1;
buf[m++] = x[i][0];
buf[m++] = x[i][1];
buf[m++] = x[i][2];
buf[m++] = ubuf(tag[i]).d;
buf[m++] = ubuf(type[i]).d;
buf[m++] = ubuf(mask[i]).d;
buf[m++] = ubuf(image[i]).d;
buf[m++] = v[i][0];
buf[m++] = v[i][1];
buf[m++] = v[i][2];
buf[m++] = edpd_temp[i];
buf[m++] = edpd_cv[i];
buf[m++] = vest[i][0];
buf[m++] = vest[i][1];
buf[m++] = vest[i][2];
buf[m++] = vest[i][3];
if (atom->nextra_restart)
for (int iextra = 0; iextra < atom->nextra_restart; iextra++)
m += modify->fix[atom->extra_restart[iextra]]->pack_restart(i,&buf[m]);
buf[0] = m;
return m;
}
/* ----------------------------------------------------------------------
unpack data for one atom from restart file including extra quantities
------------------------------------------------------------------------- */
int AtomVecEDPD::unpack_restart(double *buf)
{
int nlocal = atom->nlocal;
if (nlocal == nmax) {
grow(0);
if (atom->nextra_store)
memory->grow(atom->extra,nmax,atom->nextra_store,"atom:extra");
}
int m = 1;
x[nlocal][0] = buf[m++];
x[nlocal][1] = buf[m++];
x[nlocal][2] = buf[m++];
tag[nlocal] = (tagint) ubuf(buf[m++]).i;
type[nlocal] = (int) ubuf(buf[m++]).i;
mask[nlocal] = (int) ubuf(buf[m++]).i;
image[nlocal] = (imageint) ubuf(buf[m++]).i;
v[nlocal][0] = buf[m++];
v[nlocal][1] = buf[m++];
v[nlocal][2] = buf[m++];
edpd_temp[nlocal] = buf[m++];
edpd_cv[nlocal]= buf[m++];
vest[nlocal][0] = buf[m++];
vest[nlocal][1] = buf[m++];
vest[nlocal][2] = buf[m++];
vest[nlocal][3] = buf[m++];
double **extra = atom->extra;
if (atom->nextra_store) {
int size = static_cast<int> (buf[0]) - m;
for (int i = 0; i < size; i++) extra[nlocal][i] = buf[m++];
}
atom->nlocal++;
return m;
}
/* ----------------------------------------------------------------------
create one atom of itype at coord
set other values to defaults
------------------------------------------------------------------------- */
void AtomVecEDPD::create_atom(int itype, double *coord)
{
int nlocal = atom->nlocal;
if (nlocal == nmax) grow(0);
tag[nlocal] = 0;
type[nlocal] = itype;
x[nlocal][0] = coord[0];
x[nlocal][1] = coord[1];
x[nlocal][2] = coord[2];
mask[nlocal] = 1;
image[nlocal] = ((imageint) IMGMAX << IMG2BITS) |
((imageint) IMGMAX << IMGBITS) | IMGMAX;
v[nlocal][0] = 0.0;
v[nlocal][1] = 0.0;
v[nlocal][2] = 0.0;
edpd_temp[nlocal] = 1.0;
edpd_flux[nlocal] = 0.0;
edpd_cv[nlocal]= 1.0E5;
vest[nlocal][0] = 0.0;
vest[nlocal][1] = 0.0;
vest[nlocal][2] = 0.0;
vest[nlocal][3] = edpd_temp[nlocal];
atom->nlocal++;
}
/* ----------------------------------------------------------------------
unpack one line from Atoms section of data file
initialize other atom quantities
------------------------------------------------------------------------- */
void AtomVecEDPD::data_atom(double *coord, imageint imagetmp, char **values)
{
int nlocal = atom->nlocal;
if (nlocal == nmax) grow(0);
tag[nlocal] = ATOTAGINT(values[0]);
type[nlocal] = atoi(values[1]);
if (type[nlocal] <= 0 || type[nlocal] > atom->ntypes)
error->one(FLERR,"Invalid atom type in Atoms section of data file");
edpd_temp[nlocal] = atof(values[2]);
edpd_cv[nlocal] = atof(values[3]);
x[nlocal][0] = coord[0];
x[nlocal][1] = coord[1];
x[nlocal][2] = coord[2];
image[nlocal] = imagetmp;
mask[nlocal] = 1;
v[nlocal][0] = 0.0;
v[nlocal][1] = 0.0;
v[nlocal][2] = 0.0;
vest[nlocal][0] = 0.0;
vest[nlocal][1] = 0.0;
vest[nlocal][2] = 0.0;
vest[nlocal][3] = edpd_temp[nlocal];
edpd_flux[nlocal] = 0.0;
atom->nlocal++;
}
/* ----------------------------------------------------------------------
pack atom info for data file including 3 image flags
------------------------------------------------------------------------- */
void AtomVecEDPD::pack_data(double **buf)
{
int nlocal = atom->nlocal;
for (int i = 0; i < nlocal; i++) {
buf[i][0] = ubuf(tag[i]).d;
buf[i][1] = ubuf(type[i]).d;
buf[i][2] = edpd_temp[i];
buf[i][3] = edpd_cv[i];
buf[i][4] = x[i][0];
buf[i][5] = x[i][1];
buf[i][6] = x[i][2];
buf[i][7] = ubuf((image[i] & IMGMASK) - IMGMAX).d;
buf[i][8] = ubuf((image[i] >> IMGBITS & IMGMASK) - IMGMAX).d;
buf[i][9] = ubuf((image[i] >> IMG2BITS) - IMGMAX).d;
}
}
/* ----------------------------------------------------------------------
write atom info to data file including 3 image flags
------------------------------------------------------------------------- */
void AtomVecEDPD::write_data(FILE *fp, int n, double **buf)
{
for (int i = 0; i < n; i++)
fprintf(fp,TAGINT_FORMAT " %d %-1.16e %-1.16e %-1.16e %-1.16e %-1.16e %d %d %d\n",
(tagint) ubuf(buf[i][0]).i,(int) ubuf(buf[i][1]).i,
buf[i][2],buf[i][3],buf[i][4],buf[i][5],buf[i][6],
(int) ubuf(buf[i][7]).i,(int) ubuf(buf[i][8]).i,(int) ubuf(buf[i][9]).i);
}
/* ----------------------------------------------------------------------
return # of bytes of allocated memory
------------------------------------------------------------------------- */
bigint AtomVecEDPD::memory_usage()
{
bigint bytes = 0;
if (atom->memcheck("tag")) bytes += memory->usage(tag,nmax);
if (atom->memcheck("type")) bytes += memory->usage(type,nmax);
if (atom->memcheck("mask")) bytes += memory->usage(mask,nmax);
if (atom->memcheck("image")) bytes += memory->usage(image,nmax);
if (atom->memcheck("x")) bytes += memory->usage(x,nmax,3);
if (atom->memcheck("v")) bytes += memory->usage(v,nmax,3);
if (atom->memcheck("f")) bytes += memory->usage(f,nmax*comm->nthreads,3);
if (atom->memcheck("edpd_temp")) bytes += memory->usage(edpd_temp,nmax);
if (atom->memcheck("edpd_flux")) bytes += memory->usage(edpd_flux,nmax*comm->nthreads);
if (atom->memcheck("edpd_cv")) bytes += memory->usage(edpd_cv,nmax);
if (atom->memcheck("vest")) bytes += memory->usage(vest,nmax,4);
return bytes;
}

View File

@ -0,0 +1,68 @@
/* -*- 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 ATOM_CLASS
AtomStyle(edpd,AtomVecEDPD)
#else
#ifndef LMP_ATOM_VEC_EDPD_H
#define LMP_ATOM_VEC_EDPD_H
#include "atom_vec.h"
namespace LAMMPS_NS {
class AtomVecEDPD : public AtomVec {
public:
AtomVecEDPD(class LAMMPS *);
virtual ~AtomVecEDPD() {}
void grow(int);
void grow_reset();
void copy(int, int, int);
void force_clear(int, size_t);
virtual int pack_comm(int, int *, double *, int, int *);
virtual int pack_comm_vel(int, int *, double *, int, int *);
virtual void unpack_comm(int, int, double *);
virtual void unpack_comm_vel(int, int, double *);
int pack_reverse(int, int, double *);
void unpack_reverse(int, int *, double *);
virtual int pack_border(int, int *, double *, int, int *);
virtual int pack_border_vel(int, int *, double *, int, int *);
virtual void unpack_border(int, int, double *);
virtual void unpack_border_vel(int, int, double *);
virtual int pack_exchange(int, double *);
virtual int unpack_exchange(double *);
int size_restart();
int pack_restart(int, double *);
int unpack_restart(double *);
void create_atom(int, double *);
void data_atom(double *, imageint, char **);
void pack_data(double **);
void write_data(FILE *, int, double **);
bigint memory_usage();
protected:
tagint *tag;
int *type,*mask;
imageint *image;
double **x,**v,**f;
double **vest; // store intermediate velocity for using mvv integrator
double *edpd_temp,*edpd_flux,*edpd_cv; // temperature, heat flux, and heat capacity
};
}
#endif
#endif

View File

@ -0,0 +1,951 @@
/* ----------------------------------------------------------------------
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.
------------------------------------------------------------------------- */
#include <string.h>
#include <stdlib.h>
#include "atom_vec_mdpd.h"
#include "atom.h"
#include "comm.h"
#include "domain.h"
#include "modify.h"
#include "fix.h"
#include "update.h"
#include "memory.h"
#include "error.h"
using namespace LAMMPS_NS;
/* ---------------------------------------------------------------------- */
AtomVecMDPD::AtomVecMDPD(LAMMPS *lmp) : AtomVec(lmp)
{
if(strcmp(update->unit_style,"lj") != 0)
error->all(FLERR,"Atom style mdpd requires lj units");
molecular = 0;
mass_type = 1;
forceclearflag = 1;
comm_x_only = comm_f_only = 0;
comm->ghost_velocity = 1;
size_forward = 3 + 4; // 3 + rho + vest[3], that means we may only communicate 4 in hybrid
size_reverse = 3 + 1; // 3 + drho
size_border = 6 + 4; // 6 + rho + vest[3]
size_velocity = 3;
size_data_atom = 5;
size_data_vel = 4;
xcol_data = 3;
atom->rho_flag = 1;
atom->vest_flag = 1;
}
/* ----------------------------------------------------------------------
grow atom arrays
n = 0 grows arrays by a chunk
n > 0 allocates arrays to size n
------------------------------------------------------------------------- */
void AtomVecMDPD::grow(int n)
{
if (n == 0) grow_nmax();
else nmax = n;
atom->nmax = nmax;
if (nmax < 0 || nmax > MAXSMALLINT)
error->one(FLERR,"Per-processor system is too big");
tag = memory->grow(atom->tag, nmax, "atom:tag");
type = memory->grow(atom->type, nmax, "atom:type");
mask = memory->grow(atom->mask, nmax, "atom:mask");
image = memory->grow(atom->image, nmax, "atom:image");
x = memory->grow(atom->x, nmax, 3, "atom:x");
v = memory->grow(atom->v, nmax, 3, "atom:v");
f = memory->grow(atom->f, nmax*comm->nthreads, 3, "atom:f");
rho = memory->grow(atom->rho, nmax, "atom:rho");
drho = memory->grow(atom->drho, nmax*comm->nthreads, "atom:drho");
vest = memory->grow(atom->vest, nmax, 3, "atom:vest");
if (atom->nextra_grow)
for (int iextra = 0; iextra < atom->nextra_grow; iextra++)
modify->fix[atom->extra_grow[iextra]]->grow_arrays(nmax);
}
/* ----------------------------------------------------------------------
reset local array ptrs
------------------------------------------------------------------------- */
void AtomVecMDPD::grow_reset() {
tag = atom->tag;
type = atom->type;
mask = atom->mask;
image = atom->image;
x = atom->x;
v = atom->v;
f = atom->f;
rho = atom->rho;
drho = atom->drho;
vest = atom->vest;
}
/* ---------------------------------------------------------------------- */
void AtomVecMDPD::copy(int i, int j, int delflag) {
//printf("in AtomVecMDPD::copy\n");
tag[j] = tag[i];
type[j] = type[i];
mask[j] = mask[i];
image[j] = image[i];
x[j][0] = x[i][0];
x[j][1] = x[i][1];
x[j][2] = x[i][2];
v[j][0] = v[i][0];
v[j][1] = v[i][1];
v[j][2] = v[i][2];
rho[j] = rho[i];
drho[j] = drho[i];
vest[j][0] = vest[i][0];
vest[j][1] = vest[i][1];
vest[j][2] = vest[i][2];
if (atom->nextra_grow)
for (int iextra = 0; iextra < atom->nextra_grow; iextra++)
modify->fix[atom->extra_grow[iextra]]->copy_arrays(i, j,delflag);
}
/* ---------------------------------------------------------------------- */
void AtomVecMDPD::force_clear(int n, size_t nbytes)
{
memset(&drho[n],0,nbytes);
}
/* ---------------------------------------------------------------------- */
int AtomVecMDPD::pack_comm_hybrid(int n, int *list, double *buf) {
//printf("in AtomVecMDPD::pack_comm_hybrid\n");
int i, j, m;
m = 0;
for (i = 0; i < n; i++) {
j = list[i];
buf[m++] = rho[j];
buf[m++] = vest[j][0];
buf[m++] = vest[j][1];
buf[m++] = vest[j][2];
}
return m;
}
/* ---------------------------------------------------------------------- */
int AtomVecMDPD::unpack_comm_hybrid(int n, int first, double *buf) {
//printf("in AtomVecMDPD::unpack_comm_hybrid\n");
int i, m, last;
m = 0;
last = first + n;
for (i = first; i < last; i++) {
rho[i] = buf[m++];
vest[i][0] = buf[m++];
vest[i][1] = buf[m++];
vest[i][2] = buf[m++];
}
return m;
}
/* ---------------------------------------------------------------------- */
int AtomVecMDPD::pack_border_hybrid(int n, int *list, double *buf) {
//printf("in AtomVecMDPD::pack_border_hybrid\n");
int i, j, m;
m = 0;
for (i = 0; i < n; i++) {
j = list[i];
buf[m++] = rho[j];
buf[m++] = vest[j][0];
buf[m++] = vest[j][1];
buf[m++] = vest[j][2];
}
return m;
}
/* ---------------------------------------------------------------------- */
int AtomVecMDPD::unpack_border_hybrid(int n, int first, double *buf) {
//printf("in AtomVecMDPD::unpack_border_hybrid\n");
int i, m, last;
m = 0;
last = first + n;
for (i = first; i < last; i++) {
rho[i] = buf[m++];
vest[i][0] = buf[m++];
vest[i][1] = buf[m++];
vest[i][2] = buf[m++];
}
return m;
}
/* ---------------------------------------------------------------------- */
int AtomVecMDPD::pack_reverse_hybrid(int n, int first, double *buf) {
//printf("in AtomVecMDPD::pack_reverse_hybrid\n");
int i, m, last;
m = 0;
last = first + n;
for (i = first; i < last; i++) {
buf[m++] = drho[i];
}
return m;
}
/* ---------------------------------------------------------------------- */
int AtomVecMDPD::unpack_reverse_hybrid(int n, int *list, double *buf) {
//printf("in AtomVecMDPD::unpack_reverse_hybrid\n");
int i, j, m;
m = 0;
for (i = 0; i < n; i++) {
j = list[i];
drho[j] += buf[m++];
}
return m;
}
/* ---------------------------------------------------------------------- */
int AtomVecMDPD::pack_comm(int n, int *list, double *buf, int pbc_flag,
int *pbc) {
//printf("in AtomVecMDPD::pack_comm\n");
int i, j, m;
double dx, dy, dz;
m = 0;
if (pbc_flag == 0) {
for (i = 0; i < n; i++) {
j = list[i];
buf[m++] = x[j][0];
buf[m++] = x[j][1];
buf[m++] = x[j][2];
buf[m++] = rho[j];
buf[m++] = vest[j][0];
buf[m++] = vest[j][1];
buf[m++] = vest[j][2];
}
} else {
if (domain->triclinic == 0) {
dx = pbc[0] * domain->xprd;
dy = pbc[1] * domain->yprd;
dz = pbc[2] * domain->zprd;
} else {
dx = pbc[0] * domain->xprd + pbc[5] * domain->xy + pbc[4] * domain->xz;
dy = pbc[1] * domain->yprd + pbc[3] * domain->yz;
dz = pbc[2] * domain->zprd;
}
for (i = 0; i < n; i++) {
j = list[i];
buf[m++] = x[j][0] + dx;
buf[m++] = x[j][1] + dy;
buf[m++] = x[j][2] + dz;
buf[m++] = rho[j];
buf[m++] = vest[j][0];
buf[m++] = vest[j][1];
buf[m++] = vest[j][2];
}
}
return m;
}
/* ---------------------------------------------------------------------- */
int AtomVecMDPD::pack_comm_vel(int n, int *list, double *buf, int pbc_flag,
int *pbc) {
//printf("in AtomVecMDPD::pack_comm_vel\n");
int i, j, m;
double dx, dy, dz;
m = 0;
if (pbc_flag == 0) {
for (i = 0; i < n; i++) {
j = list[i];
buf[m++] = x[j][0];
buf[m++] = x[j][1];
buf[m++] = x[j][2];
buf[m++] = v[j][0];
buf[m++] = v[j][1];
buf[m++] = v[j][2];
buf[m++] = rho[j];
buf[m++] = vest[j][0];
buf[m++] = vest[j][1];
buf[m++] = vest[j][2];
}
} else {
if (domain->triclinic == 0) {
dx = pbc[0] * domain->xprd;
dy = pbc[1] * domain->yprd;
dz = pbc[2] * domain->zprd;
} else {
dx = pbc[0] * domain->xprd + pbc[5] * domain->xy + pbc[4] * domain->xz;
dy = pbc[1] * domain->yprd + pbc[3] * domain->yz;
dz = pbc[2] * domain->zprd;
}
for (i = 0; i < n; i++) {
j = list[i];
buf[m++] = x[j][0] + dx;
buf[m++] = x[j][1] + dy;
buf[m++] = x[j][2] + dz;
buf[m++] = v[j][0];
buf[m++] = v[j][1];
buf[m++] = v[j][2];
buf[m++] = rho[j];
buf[m++] = vest[j][0];
buf[m++] = vest[j][1];
buf[m++] = vest[j][2];
}
}
return m;
}
/* ---------------------------------------------------------------------- */
void AtomVecMDPD::unpack_comm(int n, int first, double *buf) {
//printf("in AtomVecMDPD::unpack_comm\n");
int i, m, last;
m = 0;
last = first + n;
for (i = first; i < last; i++) {
x[i][0] = buf[m++];
x[i][1] = buf[m++];
x[i][2] = buf[m++];
rho[i] = buf[m++];
vest[i][0] = buf[m++];
vest[i][1] = buf[m++];
vest[i][2] = buf[m++];
}
}
/* ---------------------------------------------------------------------- */
void AtomVecMDPD::unpack_comm_vel(int n, int first, double *buf) {
//printf("in AtomVecMDPD::unpack_comm_vel\n");
int i, m, last;
m = 0;
last = first + n;
for (i = first; i < last; i++) {
x[i][0] = buf[m++];
x[i][1] = buf[m++];
x[i][2] = buf[m++];
v[i][0] = buf[m++];
v[i][1] = buf[m++];
v[i][2] = buf[m++];
rho[i] = buf[m++];
vest[i][0] = buf[m++];
vest[i][1] = buf[m++];
vest[i][2] = buf[m++];
}
}
/* ---------------------------------------------------------------------- */
int AtomVecMDPD::pack_reverse(int n, int first, double *buf) {
//printf("in AtomVecMDPD::pack_reverse\n");
int i, m, last;
m = 0;
last = first + n;
for (i = first; i < last; i++) {
buf[m++] = f[i][0];
buf[m++] = f[i][1];
buf[m++] = f[i][2];
buf[m++] = drho[i];
}
return m;
}
/* ---------------------------------------------------------------------- */
void AtomVecMDPD::unpack_reverse(int n, int *list, double *buf) {
//printf("in AtomVecMDPD::unpack_reverse\n");
int i, j, m;
m = 0;
for (i = 0; i < n; i++) {
j = list[i];
f[j][0] += buf[m++];
f[j][1] += buf[m++];
f[j][2] += buf[m++];
drho[j] += buf[m++];
}
}
/* ---------------------------------------------------------------------- */
int AtomVecMDPD::pack_border(int n, int *list, double *buf, int pbc_flag,
int *pbc) {
//printf("in AtomVecMDPD::pack_border\n");
int i, j, m;
double dx, dy, dz;
m = 0;
if (pbc_flag == 0) {
for (i = 0; i < n; i++) {
j = list[i];
buf[m++] = x[j][0];
buf[m++] = x[j][1];
buf[m++] = x[j][2];
buf[m++] = ubuf(tag[j]).d;
buf[m++] = ubuf(type[j]).d;
buf[m++] = ubuf(mask[j]).d;
buf[m++] = rho[j];
buf[m++] = vest[j][0];
buf[m++] = vest[j][1];
buf[m++] = vest[j][2];
}
} else {
if (domain->triclinic == 0) {
dx = pbc[0] * domain->xprd;
dy = pbc[1] * domain->yprd;
dz = pbc[2] * domain->zprd;
} else {
dx = pbc[0];
dy = pbc[1];
dz = pbc[2];
}
for (i = 0; i < n; i++) {
j = list[i];
buf[m++] = x[j][0] + dx;
buf[m++] = x[j][1] + dy;
buf[m++] = x[j][2] + dz;
buf[m++] = ubuf(tag[j]).d;
buf[m++] = ubuf(type[j]).d;
buf[m++] = ubuf(mask[j]).d;
buf[m++] = rho[j];
buf[m++] = vest[j][0];
buf[m++] = vest[j][1];
buf[m++] = vest[j][2];
}
}
if (atom->nextra_border)
for (int iextra = 0; iextra < atom->nextra_border; iextra++)
m += modify->fix[atom->extra_border[iextra]]->pack_border(n,list,&buf[m]);
return m;
}
/* ---------------------------------------------------------------------- */
int AtomVecMDPD::pack_border_vel(int n, int *list, double *buf, int pbc_flag,
int *pbc)
{
int i,j,m;
double dx,dy,dz,dvx,dvy,dvz;
m = 0;
if (pbc_flag == 0) {
for (i = 0; i < n; i++) {
j = list[i];
buf[m++] = x[j][0];
buf[m++] = x[j][1];
buf[m++] = x[j][2];
buf[m++] = ubuf(tag[j]).d;
buf[m++] = ubuf(type[j]).d;
buf[m++] = ubuf(mask[j]).d;
buf[m++] = v[j][0];
buf[m++] = v[j][1];
buf[m++] = v[j][2];
buf[m++] = rho[j];
buf[m++] = vest[j][0];
buf[m++] = vest[j][1];
buf[m++] = vest[j][2];
}
} else {
if (domain->triclinic == 0) {
dx = pbc[0] * domain->xprd;
dy = pbc[1] * domain->yprd;
dz = pbc[2] * domain->zprd;
} else {
dx = pbc[0];
dy = pbc[1];
dz = pbc[2];
}
if (!deform_vremap) {
for (i = 0; i < n; i++) {
j = list[i];
buf[m++] = x[j][0] + dx;
buf[m++] = x[j][1] + dy;
buf[m++] = x[j][2] + dz;
buf[m++] = ubuf(tag[j]).d;
buf[m++] = ubuf(type[j]).d;
buf[m++] = ubuf(mask[j]).d;
buf[m++] = v[j][0];
buf[m++] = v[j][1];
buf[m++] = v[j][2];
buf[m++] = rho[j];
buf[m++] = vest[j][0];
buf[m++] = vest[j][1];
buf[m++] = vest[j][2];
}
} else {
dvx = pbc[0] * h_rate[0] + pbc[5] * h_rate[5] + pbc[4] * h_rate[4];
dvy = pbc[1] * h_rate[1] + pbc[3] * h_rate[3];
dvz = pbc[2] * h_rate[2];
for (i = 0; i < n; i++) {
j = list[i];
buf[m++] = x[j][0] + dx;
buf[m++] = x[j][1] + dy;
buf[m++] = x[j][2] + dz;
buf[m++] = ubuf(tag[j]).d;
buf[m++] = ubuf(type[j]).d;
buf[m++] = ubuf(mask[j]).d;
if (mask[i] & deform_groupbit) {
buf[m++] = v[j][0] + dvx;
buf[m++] = v[j][1] + dvy;
buf[m++] = v[j][2] + dvz;
buf[m++] = rho[j];
buf[m++] = vest[j][0] + dvx;
buf[m++] = vest[j][1] + dvy;
buf[m++] = vest[j][2] + dvz;
} else {
buf[m++] = v[j][0];
buf[m++] = v[j][1];
buf[m++] = v[j][2];
buf[m++] = rho[j];
buf[m++] = vest[j][0];
buf[m++] = vest[j][1];
buf[m++] = vest[j][2];
}
}
}
}
if (atom->nextra_border)
for (int iextra = 0; iextra < atom->nextra_border; iextra++)
m += modify->fix[atom->extra_border[iextra]]->pack_border(n,list,&buf[m]);
return m;
}
/* ---------------------------------------------------------------------- */
void AtomVecMDPD::unpack_border(int n, int first, double *buf) {
//printf("in AtomVecMDPD::unpack_border\n");
int i, m, last;
m = 0;
last = first + n;
for (i = first; i < last; i++) {
if (i == nmax)
grow(0);
x[i][0] = buf[m++];
x[i][1] = buf[m++];
x[i][2] = buf[m++];
tag[i] = (tagint) ubuf(buf[m++]).i;
type[i] = (int) ubuf(buf[m++]).i;
mask[i] = (int) ubuf(buf[m++]).i;
rho[i] = buf[m++];
vest[i][0] = buf[m++];
vest[i][1] = buf[m++];
vest[i][2] = buf[m++];
}
if (atom->nextra_border)
for (int iextra = 0; iextra < atom->nextra_border; iextra++)
m += modify->fix[atom->extra_border[iextra]]->
unpack_border(n,first,&buf[m]);
}
/* ---------------------------------------------------------------------- */
void AtomVecMDPD::unpack_border_vel(int n, int first, double *buf) {
//printf("in AtomVecMDPD::unpack_border_vel\n");
int i, m, last;
m = 0;
last = first + n;
for (i = first; i < last; i++) {
if (i == nmax)
grow(0);
x[i][0] = buf[m++];
x[i][1] = buf[m++];
x[i][2] = buf[m++];
tag[i] = (tagint) ubuf(buf[m++]).i;
type[i] = (int) ubuf(buf[m++]).i;
mask[i] = (int) ubuf(buf[m++]).i;
v[i][0] = buf[m++];
v[i][1] = buf[m++];
v[i][2] = buf[m++];
rho[i] = buf[m++];
vest[i][0] = buf[m++];
vest[i][1] = buf[m++];
vest[i][2] = buf[m++];
}
if (atom->nextra_border)
for (int iextra = 0; iextra < atom->nextra_border; iextra++)
m += modify->fix[atom->extra_border[iextra]]->
unpack_border(n,first,&buf[m]);
}
/* ----------------------------------------------------------------------
pack data for atom I for sending to another proc
xyz must be 1st 3 values, so comm::exchange() can test on them
------------------------------------------------------------------------- */
int AtomVecMDPD::pack_exchange(int i, double *buf) {
//printf("in AtomVecMDPD::pack_exchange\n");
int m = 1;
buf[m++] = x[i][0];
buf[m++] = x[i][1];
buf[m++] = x[i][2];
buf[m++] = v[i][0];
buf[m++] = v[i][1];
buf[m++] = v[i][2];
buf[m++] = ubuf(tag[i]).d;
buf[m++] = ubuf(type[i]).d;
buf[m++] = ubuf(mask[i]).d;
buf[m++] = ubuf(image[i]).d;
buf[m++] = rho[i];
buf[m++] = vest[i][0];
buf[m++] = vest[i][1];
buf[m++] = vest[i][2];
if (atom->nextra_grow)
for (int iextra = 0; iextra < atom->nextra_grow; iextra++)
m += modify->fix[atom->extra_grow[iextra]]->pack_exchange(i, &buf[m]);
buf[0] = m;
return m;
}
/* ---------------------------------------------------------------------- */
int AtomVecMDPD::unpack_exchange(double *buf) {
//printf("in AtomVecMDPD::unpack_exchange\n");
int nlocal = atom->nlocal;
if (nlocal == nmax)
grow(0);
int m = 1;
x[nlocal][0] = buf[m++];
x[nlocal][1] = buf[m++];
x[nlocal][2] = buf[m++];
v[nlocal][0] = buf[m++];
v[nlocal][1] = buf[m++];
v[nlocal][2] = buf[m++];
tag[nlocal] = (tagint) ubuf(buf[m++]).i;
type[nlocal] = (int) ubuf(buf[m++]).i;
mask[nlocal] = (int) ubuf(buf[m++]).i;
image[nlocal] = (imageint) ubuf(buf[m++]).i;
rho[nlocal] = buf[m++];
vest[nlocal][0] = buf[m++];
vest[nlocal][1] = buf[m++];
vest[nlocal][2] = buf[m++];
if (atom->nextra_grow)
for (int iextra = 0; iextra < atom->nextra_grow; iextra++)
m += modify->fix[atom->extra_grow[iextra]]-> unpack_exchange(nlocal,
&buf[m]);
atom->nlocal++;
return m;
}
/* ----------------------------------------------------------------------
size of restart data for all atoms owned by this proc
include extra data stored by fixes
------------------------------------------------------------------------- */
int AtomVecMDPD::size_restart() {
int i;
int nlocal = atom->nlocal;
int n = 15 * nlocal; // 11 + rho + vest[3]
if (atom->nextra_restart)
for (int iextra = 0; iextra < atom->nextra_restart; iextra++)
for (i = 0; i < nlocal; i++)
n += modify->fix[atom->extra_restart[iextra]]->size_restart(i);
return n;
}
/* ----------------------------------------------------------------------
pack atom I's data for restart file including extra quantities
xyz must be 1st 3 values, so that read_restart can test on them
molecular types may be negative, but write as positive
------------------------------------------------------------------------- */
int AtomVecMDPD::pack_restart(int i, double *buf) {
int m = 1;
buf[m++] = x[i][0];
buf[m++] = x[i][1];
buf[m++] = x[i][2];
buf[m++] = ubuf(tag[i]).d;
buf[m++] = ubuf(type[i]).d;
buf[m++] = ubuf(mask[i]).d;
buf[m++] = ubuf(image[i]).d;
buf[m++] = v[i][0];
buf[m++] = v[i][1];
buf[m++] = v[i][2];
buf[m++] = rho[i];
buf[m++] = vest[i][0];
buf[m++] = vest[i][1];
buf[m++] = vest[i][2];
if (atom->nextra_restart)
for (int iextra = 0; iextra < atom->nextra_restart; iextra++)
m += modify->fix[atom->extra_restart[iextra]]->pack_restart(i, &buf[m]);
buf[0] = m;
return m;
}
/* ----------------------------------------------------------------------
unpack data for one atom from restart file including extra quantities
------------------------------------------------------------------------- */
int AtomVecMDPD::unpack_restart(double *buf) {
int nlocal = atom->nlocal;
if (nlocal == nmax) {
grow(0);
if (atom->nextra_store)
memory->grow(atom->extra, nmax, atom->nextra_store, "atom:extra");
}
int m = 1;
x[nlocal][0] = buf[m++];
x[nlocal][1] = buf[m++];
x[nlocal][2] = buf[m++];
tag[nlocal] = (tagint) ubuf(buf[m++]).i;
type[nlocal] = (int) ubuf(buf[m++]).i;
mask[nlocal] = (int) ubuf(buf[m++]).i;
image[nlocal] = (imageint) ubuf(buf[m++]).i;
v[nlocal][0] = buf[m++];
v[nlocal][1] = buf[m++];
v[nlocal][2] = buf[m++];
rho[nlocal] = buf[m++];
vest[nlocal][0] = buf[m++];
vest[nlocal][1] = buf[m++];
vest[nlocal][2] = buf[m++];
double **extra = atom->extra;
if (atom->nextra_store) {
int size = static_cast<int> (buf[0]) - m;
for (int i = 0; i < size; i++)
extra[nlocal][i] = buf[m++];
}
atom->nlocal++;
return m;
}
/* ----------------------------------------------------------------------
create one atom of itype at coord
set other values to defaults
------------------------------------------------------------------------- */
void AtomVecMDPD::create_atom(int itype, double *coord) {
int nlocal = atom->nlocal;
if (nlocal == nmax)
grow(0);
tag[nlocal] = 0;
type[nlocal] = itype;
x[nlocal][0] = coord[0];
x[nlocal][1] = coord[1];
x[nlocal][2] = coord[2];
mask[nlocal] = 1;
image[nlocal] = ((imageint) IMGMAX << IMG2BITS) |
((imageint) IMGMAX << IMGBITS) | IMGMAX;
v[nlocal][0] = 0.0;
v[nlocal][1] = 0.0;
v[nlocal][2] = 0.0;
rho[nlocal] = 0.0;
vest[nlocal][0] = 0.0;
vest[nlocal][1] = 0.0;
vest[nlocal][2] = 0.0;
drho[nlocal] = 0.0;
atom->nlocal++;
}
/* ----------------------------------------------------------------------
unpack one line from Atoms section of data file
initialize other atom quantities
------------------------------------------------------------------------- */
void AtomVecMDPD::data_atom(double *coord, imageint imagetmp, char **values) {
int nlocal = atom->nlocal;
if (nlocal == nmax) grow(0);
tag[nlocal] = ATOTAGINT(values[0]);
type[nlocal] = atoi(values[1]);
if (type[nlocal] <= 0 || type[nlocal] > atom->ntypes)
error->one(FLERR,"Invalid atom type in Atoms section of data file");
x[nlocal][0] = coord[0];
x[nlocal][1] = coord[1];
x[nlocal][2] = coord[2];
image[nlocal] = imagetmp;
mask[nlocal] = 1;
v[nlocal][0] = 0.0;
v[nlocal][1] = 0.0;
v[nlocal][2] = 0.0;
vest[nlocal][0] = 0.0;
vest[nlocal][1] = 0.0;
vest[nlocal][2] = 0.0;
rho[nlocal] = 0.0;
drho[nlocal] = 0.0;
atom->nlocal++;
}
/* ----------------------------------------------------------------------
unpack hybrid quantities from one line in Atoms section of data file
initialize other atom quantities for this sub-style
------------------------------------------------------------------------- */
int AtomVecMDPD::data_atom_hybrid(int nlocal, char **values)
{
rho[nlocal] = atof(values[0]);
return 3;
}
/* ----------------------------------------------------------------------
pack atom info for data file including 3 image flags
------------------------------------------------------------------------- */
void AtomVecMDPD::pack_data(double **buf)
{
int nlocal = atom->nlocal;
for (int i = 0; i < nlocal; i++) {
buf[i][0] = ubuf(tag[i]).d;
buf[i][1] = ubuf(type[i]).d;
buf[i][2] = rho[i];
buf[i][3] = x[i][0];
buf[i][4] = x[i][1];
buf[i][5] = x[i][2];
buf[i][6] = ubuf((image[i] & IMGMASK) - IMGMAX).d;
buf[i][7] = ubuf((image[i] >> IMGBITS & IMGMASK) - IMGMAX).d;
buf[i][8] = ubuf((image[i] >> IMG2BITS) - IMGMAX).d;
}
}
/* ----------------------------------------------------------------------
pack hybrid atom info for data file
------------------------------------------------------------------------- */
int AtomVecMDPD::pack_data_hybrid(int i, double *buf)
{
buf[0] = rho[i];
return 3;
}
/* ----------------------------------------------------------------------
write atom info to data file including 3 image flags
------------------------------------------------------------------------- */
void AtomVecMDPD::write_data(FILE *fp, int n, double **buf)
{
for (int i = 0; i < n; i++)
fprintf(fp,TAGINT_FORMAT
" %d %-1.16e %-1.16e %-1.16e %-1.16e "
"%d %d %d\n",
(tagint) ubuf(buf[i][0]).i,(int) ubuf(buf[i][1]).i,
buf[i][2],buf[i][3],buf[i][4],buf[i][5],
(int) ubuf(buf[i][6]).i,(int) ubuf(buf[i][7]).i,
(int) ubuf(buf[i][8]).i);
}
/* ----------------------------------------------------------------------
write hybrid atom info to data file
------------------------------------------------------------------------- */
int AtomVecMDPD::write_data_hybrid(FILE *fp, double *buf)
{
fprintf(fp," %-1.16e",buf[0]);
return 3;
}
/* ----------------------------------------------------------------------
assign an index to named atom property and return index
return -1 if name is unknown to this atom style
------------------------------------------------------------------------- */
int AtomVecMDPD::property_atom(char *name)
{
if (strcmp(name,"rho") == 0) return 0;
if (strcmp(name,"drho") == 0) return 1;
return -1;
}
/* ----------------------------------------------------------------------
pack per-atom data into buf for ComputePropertyAtom
index maps to data specific to this atom style
------------------------------------------------------------------------- */
void AtomVecMDPD::pack_property_atom(int index, double *buf,
int nvalues, int groupbit)
{
int *mask = atom->mask;
int nlocal = atom->nlocal;
int n = 0;
if (index == 0) {
for (int i = 0; i < nlocal; i++) {
if (mask[i] & groupbit) buf[n] = rho[i];
else buf[n] = 0.0;
n += nvalues;
}
} else if (index == 1) {
for (int i = 0; i < nlocal; i++) {
if (mask[i] & groupbit) buf[n] = drho[i];
else buf[n] = 0.0;
n += nvalues;
}
}
}
/* ----------------------------------------------------------------------
return # of bytes of allocated memory
------------------------------------------------------------------------- */
bigint AtomVecMDPD::memory_usage() {
bigint bytes = 0;
if (atom->memcheck("tag")) bytes += memory->usage(tag, nmax);
if (atom->memcheck("type")) bytes += memory->usage(type, nmax);
if (atom->memcheck("mask")) bytes += memory->usage(mask, nmax);
if (atom->memcheck("image")) bytes += memory->usage(image, nmax);
if (atom->memcheck("x")) bytes += memory->usage(x, nmax, 3);
if (atom->memcheck("v")) bytes += memory->usage(v, nmax, 3);
if (atom->memcheck("f")) bytes += memory->usage(f, nmax*comm->nthreads, 3);
if (atom->memcheck("rho")) bytes += memory->usage(rho, nmax);
if (atom->memcheck("drho")) bytes += memory->usage(drho, nmax*comm->nthreads);
if (atom->memcheck("vest")) bytes += memory->usage(vest, nmax, 3);
return bytes;
}

View File

@ -0,0 +1,79 @@
/* -*- 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 ATOM_CLASS
AtomStyle(mdpd,AtomVecMDPD)
#else
#ifndef LMP_ATOM_VEC_MDPD_H
#define LMP_ATOM_VEC_MDPD_H
#include "atom_vec.h"
namespace LAMMPS_NS {
class AtomVecMDPD : public AtomVec {
public:
AtomVecMDPD(class LAMMPS *);
~AtomVecMDPD() {}
void grow(int);
void grow_reset();
void copy(int, int, int);
void force_clear(int, size_t);
int pack_comm(int, int *, double *, int, int *);
int pack_comm_vel(int, int *, double *, int, int *);
void unpack_comm(int, int, double *);
void unpack_comm_vel(int, int, double *);
int pack_reverse(int, int, double *);
void unpack_reverse(int, int *, double *);
int pack_comm_hybrid(int, int *, double *);
int unpack_comm_hybrid(int, int, double *);
int pack_border_hybrid(int, int *, double *);
int unpack_border_hybrid(int, int, double *);
int pack_reverse_hybrid(int, int, double *);
int unpack_reverse_hybrid(int, int *, double *);
int pack_border(int, int *, double *, int, int *);
int pack_border_vel(int, int *, double *, int, int *);
void unpack_border(int, int, double *);
void unpack_border_vel(int, int, double *);
int pack_exchange(int, double *);
int unpack_exchange(double *);
int size_restart();
int pack_restart(int, double *);
int unpack_restart(double *);
void create_atom(int, double *);
void data_atom(double *, imageint, char **);
int data_atom_hybrid(int, char **);
void pack_data(double **);
int pack_data_hybrid(int, double *);
void write_data(FILE *, int, double **);
int write_data_hybrid(FILE *, double *);
int property_atom(char *);
void pack_property_atom(int, double *, int, int);
bigint memory_usage();
private:
tagint *tag;
int *type,*mask;
imageint *image;
double **x,**v,**f;
double *rho, *drho;
double **vest; // estimated velocity during force computation
};
}
#endif
#endif

View File

@ -0,0 +1,879 @@
/* ----------------------------------------------------------------------
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.
------------------------------------------------------------------------- */
#include <string.h>
#include <stdlib.h>
#include "atom_vec_tdpd.h"
#include "atom.h"
#include "comm.h"
#include "force.h"
#include "domain.h"
#include "modify.h"
#include "fix.h"
#include "update.h"
#include "memory.h"
#include "error.h"
#include "input.h"
using namespace LAMMPS_NS;
/* ---------------------------------------------------------------------- */
AtomVecTDPD::AtomVecTDPD(LAMMPS *lmp) : AtomVec(lmp)
{
if(strcmp(update->unit_style,"lj") != 0)
error->all(FLERR,"Atom style edpd requires lj units");
molecular = 0;
mass_type = 1;
forceclearflag = 1;
comm_x_only = comm_f_only = 0;
comm->ghost_velocity = 1;
cc_species = 0; // for now, reset in process_args()
size_forward = 3 + cc_species + 3; //vest[3]
size_reverse = 3 + cc_species;
size_border = 6 + cc_species + 3; //vest[3]
size_velocity = 3;
// for data_atom, we read id + type + xyz[3] + cc[i] where i=1,cc_species
size_data_atom = 5 + cc_species;
size_data_vel = 4;
xcol_data = 3;
atom->tdpd_flag = 1;
atom->vest_flag = 1;
}
/* ----------------------------------------------------------------------
process additional args
single arg = number of cc_species
------------------------------------------------------------------------- */
void AtomVecTDPD::process_args(int narg, char **arg)
{
if (narg < 1) error->all(FLERR,"Invalid atom_style tdpd command");
atom->cc_species = force->inumeric(FLERR,arg[0]);
cc_species = atom->cc_species;
// reset sizes that depend on cc_species
size_forward = 3 + cc_species + 3;
size_reverse = 3 + cc_species;
size_border = 6 + cc_species + 3;
size_data_atom = 5 + cc_species;
}
/* ----------------------------------------------------------------------
grow atom arrays
n = 0 grows arrays by a chunk
n > 0 allocates arrays to size n
------------------------------------------------------------------------- */
void AtomVecTDPD::grow(int n)
{
if (n == 0) grow_nmax();
else nmax = n;
atom->nmax = nmax;
if (nmax < 0 || nmax > MAXSMALLINT)
error->one(FLERR,"Per-processor system is too big");
tag = memory->grow(atom->tag,nmax,"atom:tag");
type = memory->grow(atom->type,nmax,"atom:type");
mask = memory->grow(atom->mask,nmax,"atom:mask");
image = memory->grow(atom->image,nmax,"atom:image");
x = memory->grow(atom->x,nmax,3,"atom:x");
v = memory->grow(atom->v,nmax,3,"atom:v");
f = memory->grow(atom->f,nmax*comm->nthreads,3,"atom:f");
cc = memory->grow(atom->cc,nmax*comm->nthreads,cc_species,"atom:cc");
cc_flux = memory->grow(atom->cc_flux,nmax*comm->nthreads,cc_species,
"atom:cc_flux");
vest = memory->grow(atom->vest, nmax, 3, "atom:vest");
if (atom->nextra_grow)
for (int iextra = 0; iextra < atom->nextra_grow; iextra++)
modify->fix[atom->extra_grow[iextra]]->grow_arrays(nmax);
}
/* ----------------------------------------------------------------------
reset local array ptrs
------------------------------------------------------------------------- */
void AtomVecTDPD::grow_reset()
{
tag = atom->tag; type = atom->type;
mask = atom->mask; image = atom->image;
x = atom->x; v = atom->v; f = atom->f;
cc = atom->cc; cc_flux = atom->cc_flux;
vest = atom->vest;
}
/* ----------------------------------------------------------------------
copy atom I info to atom J
------------------------------------------------------------------------- */
void AtomVecTDPD::copy(int i, int j, int delflag)
{
tag[j] = tag[i];
type[j] = type[i];
mask[j] = mask[i];
image[j] = image[i];
x[j][0] = x[i][0];
x[j][1] = x[i][1];
x[j][2] = x[i][2];
v[j][0] = v[i][0];
v[j][1] = v[i][1];
v[j][2] = v[i][2];
for(int k = 0; k < cc_species; k++)
cc[j][k] = cc[i][k];
vest[j][0] = vest[i][0];
vest[j][1] = vest[i][1];
vest[j][2] = vest[i][2];
if (atom->nextra_grow)
for (int iextra = 0; iextra < atom->nextra_grow; iextra++)
modify->fix[atom->extra_grow[iextra]]->copy_arrays(i,j,delflag);
}
void AtomVecTDPD::force_clear(int n, size_t nbytes)
{
memset(&cc_flux[n][0],0,cc_species*nbytes);
}
/* ---------------------------------------------------------------------- */
int AtomVecTDPD::pack_comm(int n, int *list, double *buf,
int pbc_flag, int *pbc)
{
int i,j,k,m;
double dx,dy,dz;
m = 0;
if (pbc_flag == 0) {
for (i = 0; i < n; i++) {
j = list[i];
buf[m++] = x[j][0];
buf[m++] = x[j][1];
buf[m++] = x[j][2];
for(k = 0; k < cc_species; k++)
buf[m++] = cc[j][k];
buf[m++] = vest[j][0];
buf[m++] = vest[j][1];
buf[m++] = vest[j][2];
}
} else {
if (domain->triclinic == 0) {
dx = pbc[0]*domain->xprd;
dy = pbc[1]*domain->yprd;
dz = pbc[2]*domain->zprd;
} else {
dx = pbc[0]*domain->xprd + pbc[5]*domain->xy + pbc[4]*domain->xz;
dy = pbc[1]*domain->yprd + pbc[3]*domain->yz;
dz = pbc[2]*domain->zprd;
}
for (i = 0; i < n; i++) {
j = list[i];
buf[m++] = x[j][0] + dx;
buf[m++] = x[j][1] + dy;
buf[m++] = x[j][2] + dz;
for(k = 0; k < cc_species; k++)
buf[m++] = cc[j][k];
buf[m++] = vest[j][0];
buf[m++] = vest[j][1];
buf[m++] = vest[j][2];
}
}
return m;
}
/* ---------------------------------------------------------------------- */
int AtomVecTDPD::pack_comm_vel(int n, int *list, double *buf,
int pbc_flag, int *pbc)
{
int i,j,k,m;
double dx,dy,dz,dvx,dvy,dvz;
m = 0;
if (pbc_flag == 0) {
for (i = 0; i < n; i++) {
j = list[i];
buf[m++] = x[j][0];
buf[m++] = x[j][1];
buf[m++] = x[j][2];
buf[m++] = v[j][0];
buf[m++] = v[j][1];
buf[m++] = v[j][2];
for(k = 0; k < cc_species; k++)
buf[m++] = cc[j][k];
buf[m++] = vest[j][0];
buf[m++] = vest[j][1];
buf[m++] = vest[j][2];
}
} else {
if (domain->triclinic == 0) {
dx = pbc[0]*domain->xprd;
dy = pbc[1]*domain->yprd;
dz = pbc[2]*domain->zprd;
} else {
dx = pbc[0]*domain->xprd + pbc[5]*domain->xy + pbc[4]*domain->xz;
dy = pbc[1]*domain->yprd + pbc[3]*domain->yz;
dz = pbc[2]*domain->zprd;
}
if (!deform_vremap) {
for (i = 0; i < n; i++) {
j = list[i];
buf[m++] = x[j][0] + dx;
buf[m++] = x[j][1] + dy;
buf[m++] = x[j][2] + dz;
buf[m++] = v[j][0];
buf[m++] = v[j][1];
buf[m++] = v[j][2];
for(k = 0; k < cc_species; k++)
buf[m++] = cc[j][k];
buf[m++] = vest[j][0];
buf[m++] = vest[j][1];
buf[m++] = vest[j][2];
}
} else {
dvx = pbc[0]*h_rate[0] + pbc[5]*h_rate[5] + pbc[4]*h_rate[4];
dvy = pbc[1]*h_rate[1] + pbc[3]*h_rate[3];
dvz = pbc[2]*h_rate[2];
for (i = 0; i < n; i++) {
j = list[i];
buf[m++] = x[j][0] + dx;
buf[m++] = x[j][1] + dy;
buf[m++] = x[j][2] + dz;
if (mask[i] & deform_groupbit) {
buf[m++] = v[j][0] + dvx;
buf[m++] = v[j][1] + dvy;
buf[m++] = v[j][2] + dvz;
} else {
buf[m++] = v[j][0];
buf[m++] = v[j][1];
buf[m++] = v[j][2];
}
for(k = 0; k < cc_species; k++)
buf[m++] = cc[j][k];
buf[m++] = vest[j][0];
buf[m++] = vest[j][1];
buf[m++] = vest[j][2];
}
}
}
return m;
}
/* ---------------------------------------------------------------------- */
void AtomVecTDPD::unpack_comm(int n, int first, double *buf)
{
int i,m,last;
m = 0;
last = first + n;
for (i = first; i < last; i++) {
x[i][0] = buf[m++];
x[i][1] = buf[m++];
x[i][2] = buf[m++];
for(int k = 0; k < cc_species; k++)
cc[i][k] = buf[m++];
vest[i][0] = buf[m++];
vest[i][1] = buf[m++];
vest[i][2] = buf[m++];
}
}
/* ---------------------------------------------------------------------- */
void AtomVecTDPD::unpack_comm_vel(int n, int first, double *buf)
{
int i,m,last;
m = 0;
last = first + n;
for (i = first; i < last; i++) {
x[i][0] = buf[m++];
x[i][1] = buf[m++];
x[i][2] = buf[m++];
v[i][0] = buf[m++];
v[i][1] = buf[m++];
v[i][2] = buf[m++];
for(int k = 0; k < cc_species; k++)
cc[i][k] = buf[m++];
vest[i][0] = buf[m++];
vest[i][1] = buf[m++];
vest[i][2] = buf[m++];
}
}
/* ---------------------------------------------------------------------- */
int AtomVecTDPD::pack_reverse(int n, int first, double *buf)
{
int i,m,last;
m = 0;
last = first + n;
for (i = first; i < last; i++) {
buf[m++] = f[i][0];
buf[m++] = f[i][1];
buf[m++] = f[i][2];
for(int k = 0; k < cc_species; k++)
buf[m++] = cc_flux[i][k];
}
return m;
}
/* ---------------------------------------------------------------------- */
void AtomVecTDPD::unpack_reverse(int n, int *list, double *buf)
{
int i,j,m;
m = 0;
for (i = 0; i < n; i++) {
j = list[i];
f[j][0] += buf[m++];
f[j][1] += buf[m++];
f[j][2] += buf[m++];
for(int k = 0; k < cc_species; k++)
cc_flux[j][k] += buf[m++];
}
}
/* ---------------------------------------------------------------------- */
int AtomVecTDPD::pack_border(int n, int *list, double *buf,
int pbc_flag, int *pbc)
{
int i,j,m;
double dx,dy,dz;
m = 0;
if (pbc_flag == 0) {
for (i = 0; i < n; i++) {
j = list[i];
buf[m++] = x[j][0];
buf[m++] = x[j][1];
buf[m++] = x[j][2];
buf[m++] = ubuf(tag[j]).d;
buf[m++] = ubuf(type[j]).d;
buf[m++] = ubuf(mask[j]).d;
for(int k = 0; k < cc_species; k++)
buf[m++] = cc[j][k];
buf[m++] = vest[j][0];
buf[m++] = vest[j][1];
buf[m++] = vest[j][2];
}
} else {
if (domain->triclinic == 0) {
dx = pbc[0]*domain->xprd;
dy = pbc[1]*domain->yprd;
dz = pbc[2]*domain->zprd;
} else {
dx = pbc[0];
dy = pbc[1];
dz = pbc[2];
}
for (i = 0; i < n; i++) {
j = list[i];
buf[m++] = x[j][0] + dx;
buf[m++] = x[j][1] + dy;
buf[m++] = x[j][2] + dz;
buf[m++] = ubuf(tag[j]).d;
buf[m++] = ubuf(type[j]).d;
buf[m++] = ubuf(mask[j]).d;
for(int k = 0; k < cc_species; k++)
buf[m++] = cc[j][k];
buf[m++] = vest[j][0];
buf[m++] = vest[j][1];
buf[m++] = vest[j][2];
}
}
if (atom->nextra_border)
for (int iextra = 0; iextra < atom->nextra_border; iextra++)
m += modify->fix[atom->extra_border[iextra]]->pack_border(n,list,&buf[m]);
return m;
}
/* ---------------------------------------------------------------------- */
int AtomVecTDPD::pack_border_vel(int n, int *list, double *buf,
int pbc_flag, int *pbc)
{
int i,j,m;
double dx,dy,dz,dvx,dvy,dvz;
m = 0;
if (pbc_flag == 0) {
for (i = 0; i < n; i++) {
j = list[i];
buf[m++] = x[j][0];
buf[m++] = x[j][1];
buf[m++] = x[j][2];
buf[m++] = ubuf(tag[j]).d;
buf[m++] = ubuf(type[j]).d;
buf[m++] = ubuf(mask[j]).d;
buf[m++] = v[j][0];
buf[m++] = v[j][1];
buf[m++] = v[j][2];
for(int k = 0; k < cc_species; k++)
buf[m++] = cc[j][k];
buf[m++] = vest[j][0];
buf[m++] = vest[j][1];
buf[m++] = vest[j][2];
}
} else {
if (domain->triclinic == 0) {
dx = pbc[0]*domain->xprd;
dy = pbc[1]*domain->yprd;
dz = pbc[2]*domain->zprd;
} else {
dx = pbc[0];
dy = pbc[1];
dz = pbc[2];
}
if (!deform_vremap) {
for (i = 0; i < n; i++) {
j = list[i];
buf[m++] = x[j][0] + dx;
buf[m++] = x[j][1] + dy;
buf[m++] = x[j][2] + dz;
buf[m++] = ubuf(tag[j]).d;
buf[m++] = ubuf(type[j]).d;
buf[m++] = ubuf(mask[j]).d;
buf[m++] = v[j][0];
buf[m++] = v[j][1];
buf[m++] = v[j][2];
for(int k = 0; k < cc_species; k++)
buf[m++] = cc[j][k];
buf[m++] = vest[j][0];
buf[m++] = vest[j][1];
buf[m++] = vest[j][2];
}
} else {
dvx = pbc[0]*h_rate[0] + pbc[5]*h_rate[5] + pbc[4]*h_rate[4];
dvy = pbc[1]*h_rate[1] + pbc[3]*h_rate[3];
dvz = pbc[2]*h_rate[2];
for (i = 0; i < n; i++) {
j = list[i];
buf[m++] = x[j][0] + dx;
buf[m++] = x[j][1] + dy;
buf[m++] = x[j][2] + dz;
buf[m++] = ubuf(tag[j]).d;
buf[m++] = ubuf(type[j]).d;
buf[m++] = ubuf(mask[j]).d;
if (mask[i] & deform_groupbit) {
buf[m++] = v[j][0] + dvx;
buf[m++] = v[j][1] + dvy;
buf[m++] = v[j][2] + dvz;
} else {
buf[m++] = v[j][0];
buf[m++] = v[j][1];
buf[m++] = v[j][2];
}
for(int k = 0; k < cc_species; k++)
buf[m++] = cc[j][k];
buf[m++] = vest[j][0];
buf[m++] = vest[j][1];
buf[m++] = vest[j][2];
}
}
}
if (atom->nextra_border)
for (int iextra = 0; iextra < atom->nextra_border; iextra++)
m += modify->fix[atom->extra_border[iextra]]->pack_border(n,list,&buf[m]);
return m;
}
/* ---------------------------------------------------------------------- */
void AtomVecTDPD::unpack_border(int n, int first, double *buf)
{
int i,m,last;
m = 0;
last = first + n;
for (i = first; i < last; i++) {
if (i == nmax) grow(0);
x[i][0] = buf[m++];
x[i][1] = buf[m++];
x[i][2] = buf[m++];
tag[i] = (tagint) ubuf(buf[m++]).i;
type[i] = (int) ubuf(buf[m++]).i;
mask[i] = (int) ubuf(buf[m++]).i;
for(int k = 0; k < cc_species; k++)
cc[i][k] = buf[m++];
vest[i][0] = buf[m++];
vest[i][1] = buf[m++];
vest[i][2] = buf[m++];
}
if (atom->nextra_border)
for (int iextra = 0; iextra < atom->nextra_border; iextra++)
m += modify->fix[atom->extra_border[iextra]]->
unpack_border(n,first,&buf[m]);
}
/* ---------------------------------------------------------------------- */
void AtomVecTDPD::unpack_border_vel(int n, int first, double *buf)
{
int i,m,last;
m = 0;
last = first + n;
for (i = first; i < last; i++) {
if (i == nmax) grow(0);
x[i][0] = buf[m++];
x[i][1] = buf[m++];
x[i][2] = buf[m++];
tag[i] = (tagint) ubuf(buf[m++]).i;
type[i] = (int) ubuf(buf[m++]).i;
mask[i] = (int) ubuf(buf[m++]).i;
v[i][0] = buf[m++];
v[i][1] = buf[m++];
v[i][2] = buf[m++];
for(int k = 0; k < cc_species; k++)
cc[i][k] = buf[m++];
vest[i][0] = buf[m++];
vest[i][1] = buf[m++];
vest[i][2] = buf[m++];
}
if (atom->nextra_border)
for (int iextra = 0; iextra < atom->nextra_border; iextra++)
m += modify->fix[atom->extra_border[iextra]]->
unpack_border(n,first,&buf[m]);
}
/* ----------------------------------------------------------------------
pack data for atom I for sending to another proc
xyz must be 1st 3 values, so comm::exchange() can test on them
------------------------------------------------------------------------- */
int AtomVecTDPD::pack_exchange(int i, double *buf)
{
int m = 1;
buf[m++] = x[i][0];
buf[m++] = x[i][1];
buf[m++] = x[i][2];
buf[m++] = v[i][0];
buf[m++] = v[i][1];
buf[m++] = v[i][2];
buf[m++] = ubuf(tag[i]).d;
buf[m++] = ubuf(type[i]).d;
buf[m++] = ubuf(mask[i]).d;
buf[m++] = ubuf(image[i]).d;
for(int k = 0; k < cc_species; k++)
buf[m++] = cc[i][k];
buf[m++] = vest[i][0];
buf[m++] = vest[i][1];
buf[m++] = vest[i][2];
if (atom->nextra_grow)
for (int iextra = 0; iextra < atom->nextra_grow; iextra++)
m += modify->fix[atom->extra_grow[iextra]]->pack_exchange(i,&buf[m]);
buf[0] = m;
return m;
}
/* ---------------------------------------------------------------------- */
int AtomVecTDPD::unpack_exchange(double *buf)
{
int nlocal = atom->nlocal;
if (nlocal == nmax) grow(0);
int m = 1;
x[nlocal][0] = buf[m++];
x[nlocal][1] = buf[m++];
x[nlocal][2] = buf[m++];
v[nlocal][0] = buf[m++];
v[nlocal][1] = buf[m++];
v[nlocal][2] = buf[m++];
tag[nlocal] = (tagint) ubuf(buf[m++]).i;
type[nlocal] = (int) ubuf(buf[m++]).i;
mask[nlocal] = (int) ubuf(buf[m++]).i;
image[nlocal] = (imageint) ubuf(buf[m++]).i;
for(int k = 0; k < cc_species; k++)
cc[nlocal][k] = buf[m++];
vest[nlocal][0] = buf[m++];
vest[nlocal][1] = buf[m++];
vest[nlocal][2] = buf[m++];
if (atom->nextra_grow)
for (int iextra = 0; iextra < atom->nextra_grow; iextra++)
m += modify->fix[atom->extra_grow[iextra]]->
unpack_exchange(nlocal,&buf[m]);
atom->nlocal++;
return m;
}
/* ----------------------------------------------------------------------
size of restart data for all atoms owned by this proc
include extra data stored by fixes
------------------------------------------------------------------------- */
int AtomVecTDPD::size_restart()
{
int i;
int nlocal = atom->nlocal;
int n = (11 + cc_species + 3) * nlocal; // 11 + cc[i] + vest[3]
if (atom->nextra_restart)
for (int iextra = 0; iextra < atom->nextra_restart; iextra++)
for (i = 0; i < nlocal; i++)
n += modify->fix[atom->extra_restart[iextra]]->size_restart(i);
return n;
}
/* ----------------------------------------------------------------------
pack atom I's data for restart file including extra quantities
xyz must be 1st 3 values, so that read_restart can test on them
molecular types may be negative, but write as positive
------------------------------------------------------------------------- */
int AtomVecTDPD::pack_restart(int i, double *buf)
{
int m = 1;
buf[m++] = x[i][0];
buf[m++] = x[i][1];
buf[m++] = x[i][2];
buf[m++] = ubuf(tag[i]).d;
buf[m++] = ubuf(type[i]).d;
buf[m++] = ubuf(mask[i]).d;
buf[m++] = ubuf(image[i]).d;
buf[m++] = v[i][0];
buf[m++] = v[i][1];
buf[m++] = v[i][2];
for(int k = 0; k < cc_species; k++)
buf[m++] = cc[i][k];
buf[m++] = vest[i][0];
buf[m++] = vest[i][1];
buf[m++] = vest[i][2];
if (atom->nextra_restart)
for (int iextra = 0; iextra < atom->nextra_restart; iextra++)
m += modify->fix[atom->extra_restart[iextra]]->pack_restart(i,&buf[m]);
buf[0] = m;
return m;
}
/* ----------------------------------------------------------------------
unpack data for one atom from restart file including extra quantities
------------------------------------------------------------------------- */
int AtomVecTDPD::unpack_restart(double *buf)
{
int nlocal = atom->nlocal;
if (nlocal == nmax) {
grow(0);
if (atom->nextra_store)
memory->grow(atom->extra,nmax,atom->nextra_store,"atom:extra");
}
int m = 1;
x[nlocal][0] = buf[m++];
x[nlocal][1] = buf[m++];
x[nlocal][2] = buf[m++];
tag[nlocal] = (tagint) ubuf(buf[m++]).i;
type[nlocal] = (int) ubuf(buf[m++]).i;
mask[nlocal] = (int) ubuf(buf[m++]).i;
image[nlocal] = (imageint) ubuf(buf[m++]).i;
v[nlocal][0] = buf[m++];
v[nlocal][1] = buf[m++];
v[nlocal][2] = buf[m++];
for(int k = 0; k < cc_species; k++)
cc[nlocal][k] = buf[m++];
vest[nlocal][0] = buf[m++];
vest[nlocal][1] = buf[m++];
vest[nlocal][2] = buf[m++];
double **extra = atom->extra;
if (atom->nextra_store) {
int size = static_cast<int> (buf[0]) - m;
for (int i = 0; i < size; i++) extra[nlocal][i] = buf[m++];
}
atom->nlocal++;
return m;
}
/* ----------------------------------------------------------------------
create one atom of itype at coord
set other values to defaults
------------------------------------------------------------------------- */
void AtomVecTDPD::create_atom(int itype, double *coord)
{
int nlocal = atom->nlocal;
if (nlocal == nmax) grow(0);
tag[nlocal] = 0;
type[nlocal] = itype;
x[nlocal][0] = coord[0];
x[nlocal][1] = coord[1];
x[nlocal][2] = coord[2];
mask[nlocal] = 1;
image[nlocal] = ((imageint) IMGMAX << IMG2BITS) |
((imageint) IMGMAX << IMGBITS) | IMGMAX;
v[nlocal][0] = 0.0;
v[nlocal][1] = 0.0;
v[nlocal][2] = 0.0;
for(int k = 0; k < cc_species; k++)
cc[nlocal][k] = 0.0;
vest[nlocal][0] = 0.0;
vest[nlocal][1] = 0.0;
vest[nlocal][2] = 0.0;
atom->nlocal++;
}
/* ----------------------------------------------------------------------
unpack one line from Atoms section of data file
initialize other atom quantities
------------------------------------------------------------------------- */
void AtomVecTDPD::data_atom(double *coord, imageint imagetmp, char **values)
{
int nlocal = atom->nlocal;
if (nlocal == nmax) grow(0);
tag[nlocal] = ATOTAGINT(values[0]);
type[nlocal] = atoi(values[1]);
if (type[nlocal] <= 0 || type[nlocal] > atom->ntypes)
error->one(FLERR,"Invalid atom type in Atoms section of data file");
x[nlocal][0] = coord[0];
x[nlocal][1] = coord[1];
x[nlocal][2] = coord[2];
for(int k = 0; k < cc_species; k++)
cc[nlocal][k] = atof( values[5+k] );
image[nlocal] = imagetmp;
mask[nlocal] = 1;
v[nlocal][0] = 0.0;
v[nlocal][1] = 0.0;
v[nlocal][2] = 0.0;
vest[nlocal][0] = 0.0;
vest[nlocal][1] = 0.0;
vest[nlocal][2] = 0.0;
atom->nlocal++;
}
/* ----------------------------------------------------------------------
pack atom info for data file including 3 image flags
------------------------------------------------------------------------- */
void AtomVecTDPD::pack_data(double **buf)
{
int nlocal = atom->nlocal;
for (int i = 0; i < nlocal; i++) {
buf[i][0] = ubuf(tag[i]).d;
buf[i][1] = ubuf(type[i]).d;
buf[i][2] = x[i][0];
buf[i][3] = x[i][1];
buf[i][4] = x[i][2];
buf[i][5] = ubuf((image[i] & IMGMASK) - IMGMAX).d;
buf[i][6] = ubuf((image[i] >> IMGBITS & IMGMASK) - IMGMAX).d;
buf[i][7] = ubuf((image[i] >> IMG2BITS) - IMGMAX).d;
for(int k = 0; k < cc_species; k++)
buf[i][8+k] = cc[i][k];
}
}
/* ----------------------------------------------------------------------
write atom info to data file including 3 image flags
------------------------------------------------------------------------- */
void AtomVecTDPD::write_data(FILE *fp, int n, double **buf)
{
for (int i = 0; i < n; i++){
fprintf(fp,TAGINT_FORMAT " %d %-1.16e %-1.16e %-1.16e %d %d %d",
(tagint) ubuf(buf[i][0]).i,(int) ubuf(buf[i][1]).i,
buf[i][2],buf[i][3],buf[i][4],
(int) ubuf(buf[i][5]).i,(int) ubuf(buf[i][6]).i,
(int) ubuf(buf[i][7]).i);
for(int k = 0; k < cc_species; k++)
fprintf(fp,TAGINT_FORMAT " %-1.16e",buf[i][8+k]);
fprintf(fp,TAGINT_FORMAT "\n");
}
}
/* ----------------------------------------------------------------------
return # of bytes of allocated memory
------------------------------------------------------------------------- */
bigint AtomVecTDPD::memory_usage()
{
bigint bytes = 0;
if (atom->memcheck("tag")) bytes += memory->usage(tag,nmax);
if (atom->memcheck("type")) bytes += memory->usage(type,nmax);
if (atom->memcheck("mask")) bytes += memory->usage(mask,nmax);
if (atom->memcheck("image")) bytes += memory->usage(image,nmax);
if (atom->memcheck("x")) bytes += memory->usage(x,nmax,3);
if (atom->memcheck("v")) bytes += memory->usage(v,nmax,3);
if (atom->memcheck("f")) bytes += memory->usage(f,nmax*comm->nthreads,3);
if (atom->memcheck("cc")) bytes += memory->usage(cc,nmax*comm->nthreads,cc_species);
if (atom->memcheck("cc_flux")) bytes += memory->usage(cc_flux,nmax*comm->nthreads,cc_species);
if (atom->memcheck("vest")) bytes += memory->usage(vest, nmax);
return bytes;
}

View File

@ -0,0 +1,83 @@
/* -*- 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 ATOM_CLASS
AtomStyle(tdpd,AtomVecTDPD)
#else
#ifndef LMP_ATOM_VEC_TDPD_H
#define LMP_ATOM_VEC_TDPD_H
#include "atom_vec.h"
namespace LAMMPS_NS {
class AtomVecTDPD : public AtomVec {
public:
AtomVecTDPD(class LAMMPS *);
virtual ~AtomVecTDPD() {}
void process_args(int, char **);
void grow(int);
void grow_reset();
void copy(int, int, int);
void force_clear(int, size_t);
virtual int pack_comm(int, int *, double *, int, int *);
virtual int pack_comm_vel(int, int *, double *, int, int *);
virtual void unpack_comm(int, int, double *);
virtual void unpack_comm_vel(int, int, double *);
int pack_reverse(int, int, double *);
void unpack_reverse(int, int *, double *);
virtual int pack_border(int, int *, double *, int, int *);
virtual int pack_border_vel(int, int *, double *, int, int *);
virtual void unpack_border(int, int, double *);
virtual void unpack_border_vel(int, int, double *);
virtual int pack_exchange(int, double *);
virtual int unpack_exchange(double *);
int size_restart();
int pack_restart(int, double *);
int unpack_restart(double *);
void create_atom(int, double *);
void data_atom(double *, imageint, char **);
void pack_data(double **);
void write_data(FILE *, int, double **);
bigint memory_usage();
protected:
tagint *tag;
int *type,*mask;
imageint *image;
double **x,**v,**f;
double **vest; // store intermediate velocity for using mvv integrator
double **cc,**cc_flux;
int cc_species;
};
}
#endif
#endif
/* ERROR/WARNING messages:
E: Per-processor system is too big
The number of owned atoms plus ghost atoms on a single
processor must fit in 32-bit integer.
E: Invalid atom type in Atoms section of data file
Atom types must range from 1 to specified # of types.
*/

View File

@ -0,0 +1,97 @@
/* ----------------------------------------------------------------------
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.
------------------------------------------------------------------------- */
#include <string.h>
#include "compute_edpd_temp_atom.h"
#include "atom.h"
#include "update.h"
#include "modify.h"
#include "comm.h"
#include "force.h"
#include "memory.h"
#include "error.h"
using namespace LAMMPS_NS;
/* ---------------------------------------------------------------------- */
ComputeEDPDTempAtom::ComputeEDPDTempAtom(LAMMPS *lmp, int narg, char **arg) :
Compute(lmp, narg, arg)
{
if (narg != 3) error->all(FLERR,"Number of arguments for compute edpd/temp/atom command != 3");
if (atom->edpd_flag != 1) error->all(FLERR,"compute edpd/temp/atom command requires atom_style with temperature (e.g. edpd)");
peratom_flag = 1;
size_peratom_cols = 0;
nmax = 0;
temp_vector = NULL;
}
/* ---------------------------------------------------------------------- */
ComputeEDPDTempAtom::~ComputeEDPDTempAtom()
{
memory->sfree(temp_vector);
}
/* ---------------------------------------------------------------------- */
void ComputeEDPDTempAtom::init()
{
int count = 0;
for (int i = 0; i < modify->ncompute; i++)
if (strcmp(modify->compute[i]->style,"temp_vector/atom") == 0) count++;
if (count > 1 && comm->me == 0)
error->warning(FLERR,"More than one compute temp_vector/atom");
}
/* ---------------------------------------------------------------------- */
void ComputeEDPDTempAtom::compute_peratom()
{
invoked_peratom = update->ntimestep;
// grow temp_vector array if necessary
if (atom->nmax > nmax) {
memory->sfree(temp_vector);
nmax = atom->nmax;
temp_vector = (double *) memory->smalloc(nmax*sizeof(double),"temp_vector/atom:temp_vector");
vector_atom = temp_vector;
}
double *edpd_temp = atom->edpd_temp;
int *mask = atom->mask;
int nlocal = atom->nlocal;
for (int i = 0; i < nlocal; i++) {
if (mask[i] & groupbit) {
temp_vector[i] = edpd_temp[i];
}
else {
temp_vector[i] = 0.0;
}
}
}
/* ----------------------------------------------------------------------
memory usage of local atom-based array
------------------------------------------------------------------------- */
double ComputeEDPDTempAtom::memory_usage()
{
double bytes = nmax * sizeof(double);
return bytes;
}

View File

@ -0,0 +1,43 @@
/* -*- 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 COMPUTE_CLASS
ComputeStyle(edpd/temp/atom,ComputeEDPDTempAtom)
#else
#ifndef LMP_COMPUTE_EDPD_TEMP_ATOM_H
#define LMP_COMPUTE_EDPD_TEMP_ATOM_H
#include "compute.h"
namespace LAMMPS_NS {
class ComputeEDPDTempAtom : public Compute {
public:
ComputeEDPDTempAtom(class LAMMPS *, int, char **);
~ComputeEDPDTempAtom();
void init();
void compute_peratom();
double memory_usage();
private:
int nmax;
double *temp_vector;
};
}
#endif
#endif

View File

@ -0,0 +1,98 @@
/* ----------------------------------------------------------------------
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.
------------------------------------------------------------------------- */
#include <string.h>
#include "compute_tdpd_cc_atom.h"
#include "atom.h"
#include "update.h"
#include "modify.h"
#include "comm.h"
#include "force.h"
#include "memory.h"
#include "error.h"
using namespace LAMMPS_NS;
/* ---------------------------------------------------------------------- */
ComputeTDPDCCAtom::ComputeTDPDCCAtom(LAMMPS *lmp, int narg, char **arg) :
Compute(lmp, narg, arg)
{
if (narg != 4) error->all(FLERR,"Number of arguments for compute tdpd/cc/atom command != 4");
if (atom->tdpd_flag != 1) error->all(FLERR,"compute tdpd/cc/atom command requires atom_style with concentration (e.g. tdpd)");
index = force->inumeric(FLERR,arg[3]);
peratom_flag = 1;
size_peratom_cols = 0;
nmax = 0;
cc_vector = NULL;
}
/* ---------------------------------------------------------------------- */
ComputeTDPDCCAtom::~ComputeTDPDCCAtom()
{
memory->sfree(cc_vector);
}
/* ---------------------------------------------------------------------- */
void ComputeTDPDCCAtom::init()
{
int count = 0;
for (int i = 0; i < modify->ncompute; i++)
if (strcmp(modify->compute[i]->style,"cc_vector/atom") == 0) count++;
if (count > 1 && comm->me == 0)
error->warning(FLERR,"More than one compute cc_vector/atom");
}
/* ---------------------------------------------------------------------- */
void ComputeTDPDCCAtom::compute_peratom()
{
invoked_peratom = update->ntimestep;
// grow cc_vector array if necessary
if (atom->nmax > nmax) {
memory->sfree(cc_vector);
nmax = atom->nmax;
cc_vector = (double *) memory->smalloc(nmax*sizeof(double),"cc_vector/atom:cc_vector");
vector_atom = cc_vector;
}
double **cc = atom->cc;
int *mask = atom->mask;
int nlocal = atom->nlocal;
for (int i = 0; i < nlocal; i++) {
if (mask[i] & groupbit) {
cc_vector[i] = cc[i][index-1];
}
else
cc_vector[i] = 0.0;
}
}
/* ----------------------------------------------------------------------
memory usage of local atom-based array
------------------------------------------------------------------------- */
double ComputeTDPDCCAtom::memory_usage()
{
double bytes = nmax * sizeof(double);
return bytes;
}

View File

@ -0,0 +1,44 @@
/* -*- 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 COMPUTE_CLASS
ComputeStyle(tdpd/cc/atom,ComputeTDPDCCAtom)
#else
#ifndef LMP_COMPUTE_TDPD_CC_ATOM_H
#define LMP_COMPUTE_TDPD_CC_ATOM_H
#include "compute.h"
namespace LAMMPS_NS {
class ComputeTDPDCCAtom : public Compute {
public:
ComputeTDPDCCAtom(class LAMMPS *, int, char **);
~ComputeTDPDCCAtom();
void init();
void compute_peratom();
double memory_usage();
private:
int nmax;
int index;
double *cc_vector;
};
}
#endif
#endif

View File

@ -0,0 +1,120 @@
/* ----------------------------------------------------------------------
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.
------------------------------------------------------------------------- */
#include <stdlib.h>
#include <string.h>
#include "fix_edpd_source.h"
#include "atom.h"
#include "comm.h"
#include "update.h"
#include "modify.h"
#include "domain.h"
#include "lattice.h"
#include "input.h"
#include "variable.h"
#include "error.h"
#include "force.h"
using namespace LAMMPS_NS;
using namespace FixConst;
/* ---------------------------------------------------------------------- */
FixEDPDSource::FixEDPDSource(LAMMPS *lmp, int narg, char **arg) :
Fix(lmp, narg, arg)
{
if (strcmp(style,"edpd/source") != 0 && narg < 4)
error->all(FLERR,"Illegal fix edpd/source command");
int iarg = 3;
if (strcmp(arg[iarg],"sphere") == 0) option = 0;
else if (strcmp(arg[iarg],"cuboid") == 0) option = 1;
else error->all(FLERR,"Illegal fix edpd/source command");
iarg++;
if(option == 0){
if (narg != 9 ) error->all(FLERR,"Illegal fix edpd/source command (5 args for sphere)");
center[0] = force->numeric(FLERR,arg[iarg++]);
center[1] = force->numeric(FLERR,arg[iarg++]);
center[2] = force->numeric(FLERR,arg[iarg++]);
radius = force->numeric(FLERR,arg[iarg++]);
value = force->numeric(FLERR,arg[iarg++]);
}
else if(option == 1){
if (narg != 11 ) error->all(FLERR,"Illegal fix edpd/edpd command (7 args for cuboid)");
center[0] = force->numeric(FLERR,arg[iarg++]);
center[1] = force->numeric(FLERR,arg[iarg++]);
center[2] = force->numeric(FLERR,arg[iarg++]);
dLx = force->numeric(FLERR,arg[iarg++]);
dLy = force->numeric(FLERR,arg[iarg++]);
dLz = force->numeric(FLERR,arg[iarg++]);
value = force->numeric(FLERR,arg[iarg++]);
}
else error->all(FLERR,"Illegal fix edpd/source command");
}
/* ---------------------------------------------------------------------- */
FixEDPDSource::~FixEDPDSource()
{
}
/* ---------------------------------------------------------------------- */
int FixEDPDSource::setmask()
{
int mask = 0;
mask |= POST_FORCE;
return mask;
}
/* ---------------------------------------------------------------------- */
void FixEDPDSource::init()
{
}
/* ---------------------------------------------------------------------- */
void FixEDPDSource::post_force(int vflag)
{
double **x = atom->x;
double *edpd_flux = atom->edpd_flux;
double *edpd_cv = atom->edpd_cv;
int *mask = atom->mask;
int nlocal = atom->nlocal;
double drx, dry, drz, rsq;
double radius_sq = radius*radius*radius;
for (int i = 0; i < nlocal; i++) {
if (mask[i] & groupbit) {
if(option == 0){
drx = x[i][0] - center[0];
dry = x[i][1] - center[1];
drz = x[i][2] - center[2];
rsq = drx*drx + dry*dry + drz*drz;
if(rsq < radius_sq)
edpd_flux[i] += value*edpd_cv[i];
}
else if(option == 1){
drx = x[i][0] - center[0];
dry = x[i][1] - center[1];
drz = x[i][2] - center[2];
if(abs(drx) <= 0.5*dLx && abs(dry) <= 0.5*dLy && abs(drz) <= 0.5*dLz)
edpd_flux[i] += value*edpd_cv[i];
}
}
}
}

View File

@ -0,0 +1,44 @@
/* -*- 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 FIX_CLASS
FixStyle(edpd/source,FixEDPDSource)
#else
#ifndef LMP_FIX_EDPDSOURCE_H
#define LMP_FIX_EDPDSOURCE_H
#include "fix.h"
namespace LAMMPS_NS {
class FixEDPDSource : public Fix {
public:
FixEDPDSource(class LAMMPS *, int, char **);
~FixEDPDSource();
int setmask();
void init();
void post_force(int);
protected:
int option;
double center[3], radius, dLx, dLy, dLz;
double value;
};
}
#endif
#endif

View File

@ -0,0 +1,136 @@
/* ----------------------------------------------------------------------
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.
------------------------------------------------------------------------- */
/* ----------------------------------------------------------------------
This is a time integrator for position and velocity (x and v) using the
modified velocity-Verlet (MVV) algorithm.
Setting verlet = 0.5 recovers the standard velocity-Verlet algorithm.
Contributing author: Zhen Li (Brown University)
Email: zhen_li@brown.edu
------------------------------------------------------------------------- */
#include <stdio.h>
#include <string.h>
#include "fix_mvv_dpd.h"
#include "atom.h"
#include "force.h"
#include "update.h"
#include "respa.h"
#include "error.h"
using namespace LAMMPS_NS;
using namespace FixConst;
/* ---------------------------------------------------------------------- */
FixMvvDPD::FixMvvDPD(LAMMPS *lmp, int narg, char **arg) :
Fix(lmp, narg, arg)
{
if (strcmp(style,"mvv/dpd") != 0 && narg < 3)
error->all(FLERR,"Illegal fix mvv/dpd command");
verlet = 0.5;
if(narg > 3) verlet = force->numeric(FLERR,arg[3]);
dynamic_group_allow = 1;
time_integrate = 1;
}
/* ---------------------------------------------------------------------- */
int FixMvvDPD::setmask()
{
int mask = 0;
mask |= INITIAL_INTEGRATE;
mask |= FINAL_INTEGRATE;
return mask;
}
/* ---------------------------------------------------------------------- */
void FixMvvDPD::init()
{
dtv = update->dt;
dtf = 0.5 * update->dt * force->ftm2v;
}
/* ----------------------------------------------------------------------
allow for both per-type and per-atom mass
------------------------------------------------------------------------- */
void FixMvvDPD::initial_integrate(int vflag)
{
double dtfm;
double **x = atom->x;
double **v = atom->v;
double **f = atom->f;
double **vest = atom->vest;
double *rmass = atom->rmass;
double *mass = atom->mass;
int *type = atom->type;
int *mask = atom->mask;
int nlocal = atom->nlocal;
if (igroup == atom->firstgroup) nlocal = atom->nfirst;
for (int i = 0; i < nlocal; i++)
if (mask[i] & groupbit) {
if (rmass) dtfm = dtf / rmass[i];
else dtfm = dtf / mass[type[i]];
vest[i][0] = v[i][0] + dtfm * f[i][0];
vest[i][1] = v[i][1] + dtfm * f[i][1];
vest[i][2] = v[i][2] + dtfm * f[i][2];
x[i][0] += dtv * vest[i][0];
x[i][1] += dtv * vest[i][1];
x[i][2] += dtv * vest[i][2];
v[i][0] += 2.0 * verlet * dtfm * f[i][0];
v[i][1] += 2.0 * verlet * dtfm * f[i][1];
v[i][2] += 2.0 * verlet * dtfm * f[i][2];
}
}
/* ---------------------------------------------------------------------- */
void FixMvvDPD::final_integrate()
{
double dtfm;
double **v = atom->v;
double **f = atom->f;
double **vest = atom->vest;
double *rmass = atom->rmass;
double *mass = atom->mass;
int *type = atom->type;
int *mask = atom->mask;
int nlocal = atom->nlocal;
if (igroup == atom->firstgroup) nlocal = atom->nfirst;
for (int i = 0; i < nlocal; i++)
if (mask[i] & groupbit) {
if (rmass) dtfm = dtf / rmass[i];
else dtfm = dtf / mass[type[i]];
v[i][0] = vest[i][0] + dtfm * f[i][0];
v[i][1] = vest[i][1] + dtfm * f[i][1];
v[i][2] = vest[i][2] + dtfm * f[i][2];
}
}
/* ---------------------------------------------------------------------- */
void FixMvvDPD::reset_dt()
{
dtv = update->dt;
dtf = 0.5 * update->dt * force->ftm2v;
}

View File

@ -0,0 +1,45 @@
/* -*- 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 FIX_CLASS
FixStyle(mvv/dpd,FixMvvDPD)
#else
#ifndef LMP_FIX_MVV_DPD_H
#define LMP_FIX_MVV_DPD_H
#include "fix.h"
namespace LAMMPS_NS {
class FixMvvDPD : public Fix {
public:
FixMvvDPD(class LAMMPS *, int, char **);
virtual ~FixMvvDPD() {}
int setmask();
virtual void init();
virtual void initial_integrate(int);
virtual void final_integrate();
virtual void reset_dt();
protected:
double dtv, dtf;
double verlet;
};
}
#endif
#endif

View File

@ -0,0 +1,163 @@
/* ----------------------------------------------------------------------
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.
------------------------------------------------------------------------- */
/* ----------------------------------------------------------------------
This is a time integrator for position, velocity and temperature (x,
v and edpd_T) using the modified velocity-Verlet (MVV) algorithm.
Setting verlet = 0.5 recovers the standard velocity-Verlet algorithm.
Contributing author: Zhen Li (Brown University)
Email: zhen_li@brown.edu
Please cite the related publication:
Z. Li, Y.-H. Tang, H. Lei, B. Caswell and G.E. Karniadakis. "Energy-
conserving dissipative particle dynamics with temperature-dependent
properties". Journal of Computational Physics, 2014, 265: 113-127.
Z. Li, Y.-H. Tang , X. Li and G.E. Karniadakis. "Mesoscale modeling of
phase transition dynamics of thermoresponsive polymers". Chemical
Communications, 2015, 51: 11038-11040.
------------------------------------------------------------------------- */
#include <stdio.h>
#include <string.h>
#include "fix_mvv_edpd.h"
#include "atom.h"
#include "force.h"
#include "update.h"
#include "respa.h"
#include "error.h"
using namespace LAMMPS_NS;
using namespace FixConst;
/* ---------------------------------------------------------------------- */
FixMvvEDPD::FixMvvEDPD(LAMMPS *lmp, int narg, char **arg) :
Fix(lmp, narg, arg)
{
if (strcmp(style,"mvv/edpd") != 0 && narg < 3)
error->all(FLERR,"Illegal fix mvv/edpd command");
verlet = 0.5;
if(narg > 3) verlet = force->numeric(FLERR,arg[3]);
dynamic_group_allow = 1;
time_integrate = 1;
}
/* ---------------------------------------------------------------------- */
int FixMvvEDPD::setmask()
{
int mask = 0;
mask |= INITIAL_INTEGRATE;
mask |= FINAL_INTEGRATE;
return mask;
}
/* ---------------------------------------------------------------------- */
void FixMvvEDPD::init()
{
dtv = update->dt;
dtf = 0.5 * update->dt * force->ftm2v;
}
/* ----------------------------------------------------------------------
allow for both per-type and per-atom mass
------------------------------------------------------------------------- */
void FixMvvEDPD::initial_integrate(int vflag)
{
double dtfm,dtT;
// update v and x and cc of atoms in group
double **x = atom->x;
double **v = atom->v;
double **f = atom->f;
double *edpd_temp = atom->edpd_temp;
double *edpd_flux = atom->edpd_flux;
double *edpd_cv = atom->edpd_cv;
double **vest = atom->vest;
double *rmass = atom->rmass;
double *mass = atom->mass;
int *type = atom->type;
int *mask = atom->mask;
int nlocal = atom->nlocal;
if (igroup == atom->firstgroup) nlocal = atom->nfirst;
for (int i = 0; i < nlocal; i++)
if (mask[i] & groupbit) {
if (rmass) dtfm = dtf / rmass[i];
else dtfm = dtf / mass[type[i]];
dtT = 0.5 * dtv / edpd_cv[i];
vest[i][0] = v[i][0] + dtfm * f[i][0];
vest[i][1] = v[i][1] + dtfm * f[i][1];
vest[i][2] = v[i][2] + dtfm * f[i][2];
vest[i][3] = edpd_temp[i] + dtT * edpd_flux[i];
x[i][0] += dtv * vest[i][0];
x[i][1] += dtv * vest[i][1];
x[i][2] += dtv * vest[i][2];
v[i][0] += 2.0 * verlet * dtfm * f[i][0];
v[i][1] += 2.0 * verlet * dtfm * f[i][1];
v[i][2] += 2.0 * verlet * dtfm * f[i][2];
edpd_temp[i] += 2.0 * verlet * dtT * edpd_flux[i];
}
}
/* ---------------------------------------------------------------------- */
void FixMvvEDPD::final_integrate()
{
double dtfm, dtT;
// update v and edpd_temp of atoms in group
double **v = atom->v;
double **f = atom->f;
double *edpd_temp = atom->edpd_temp;
double *edpd_flux = atom->edpd_flux;
double *edpd_cv = atom->edpd_cv;
double **vest = atom->vest;
double *rmass = atom->rmass;
double *mass = atom->mass;
int *type = atom->type;
int *mask = atom->mask;
int nlocal = atom->nlocal;
if (igroup == atom->firstgroup) nlocal = atom->nfirst;
for (int i = 0; i < nlocal; i++)
if (mask[i] & groupbit) {
if (rmass) dtfm = dtf / rmass[i];
else dtfm = dtf / mass[type[i]];
dtT = 0.5 * dtv / edpd_cv[i];
v[i][0] = vest[i][0] + dtfm * f[i][0];
v[i][1] = vest[i][1] + dtfm * f[i][1];
v[i][2] = vest[i][2] + dtfm * f[i][2];
edpd_temp[i] = vest[i][3] + dtT * edpd_flux[i];
}
}
/* ---------------------------------------------------------------------- */
void FixMvvEDPD::reset_dt()
{
dtv = update->dt;
dtf = 0.5 * update->dt * force->ftm2v;
}

View File

@ -0,0 +1,45 @@
/* -*- 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 FIX_CLASS
FixStyle(mvv/edpd,FixMvvEDPD)
#else
#ifndef LMP_FIX_MVV_EDPD_H
#define LMP_FIX_MVV_EDPD_H
#include "fix.h"
namespace LAMMPS_NS {
class FixMvvEDPD : public Fix {
public:
FixMvvEDPD(class LAMMPS *, int, char **);
virtual ~FixMvvEDPD() {}
int setmask();
virtual void init();
virtual void initial_integrate(int);
virtual void final_integrate();
virtual void reset_dt();
protected:
double dtv, dtf;
double verlet;
};
}
#endif
#endif

View File

@ -0,0 +1,156 @@
/* ----------------------------------------------------------------------
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.
------------------------------------------------------------------------- */
/* ----------------------------------------------------------------------
This is a time integrator for position, velocity and concentration (x,
v and cc) using the modified velocity-Verlet (MVV) algorithm.
Setting verlet = 0.5 recovers the standard velocity-Verlet algorithm.
Contributing author: Zhen Li (Brown University)
Email: zhen_li@brown.edu
Please cite the related publication:
Z. Li, A. Yazdani, A. Tartakovsky and G.E. Karniadakis. "Transport
dissipative particle dynamics model for mesoscopic advection-diffusion
-reaction problems". The Journal of Chemical Physics, 2015, 143: 014101.
------------------------------------------------------------------------- */
#include <stdio.h>
#include <string.h>
#include "fix_mvv_tdpd.h"
#include "atom.h"
#include "force.h"
#include "update.h"
#include "respa.h"
#include "error.h"
using namespace LAMMPS_NS;
using namespace FixConst;
/* ---------------------------------------------------------------------- */
FixMvvTDPD::FixMvvTDPD(LAMMPS *lmp, int narg, char **arg) :
Fix(lmp, narg, arg)
{
if (strcmp(style,"tdpd/verlet") != 0 && narg < 3)
error->all(FLERR,"Illegal fix mvv/tdpd command");
verlet = 0.5;
if(narg > 3) verlet = force->numeric(FLERR,arg[3]);
cc_species = atom->cc_species;
dynamic_group_allow = 1;
time_integrate = 1;
}
/* ---------------------------------------------------------------------- */
int FixMvvTDPD::setmask()
{
int mask = 0;
mask |= INITIAL_INTEGRATE;
mask |= FINAL_INTEGRATE;
return mask;
}
/* ---------------------------------------------------------------------- */
void FixMvvTDPD::init()
{
dtv = update->dt;
dtf = 0.5 * update->dt * force->ftm2v;
}
/* ----------------------------------------------------------------------
allow for both per-type and per-atom mass
------------------------------------------------------------------------- */
void FixMvvTDPD::initial_integrate(int vflag)
{
double dtfm;
// update v and x and cc of atoms in group
double **x = atom->x;
double **v = atom->v;
double **f = atom->f;
double **cc = atom->cc;
double **cc_flux = atom->cc_flux;
double **vest = atom->vest;
double *rmass = atom->rmass;
double *mass = atom->mass;
int *type = atom->type;
int *mask = atom->mask;
int nlocal = atom->nlocal;
if (igroup == atom->firstgroup) nlocal = atom->nfirst;
for (int i = 0; i < nlocal; i++)
if (mask[i] & groupbit) {
if (rmass) dtfm = dtf / rmass[i];
else dtfm = dtf / mass[type[i]];
vest[i][0] = v[i][0] + dtfm * f[i][0];
vest[i][1] = v[i][1] + dtfm * f[i][1];
vest[i][2] = v[i][2] + dtfm * f[i][2];
x[i][0] += dtv * vest[i][0];
x[i][1] += dtv * vest[i][1];
x[i][2] += dtv * vest[i][2];
v[i][0] += 2.0 * verlet * dtfm * f[i][0];
v[i][1] += 2.0 * verlet * dtfm * f[i][1];
v[i][2] += 2.0 * verlet * dtfm * f[i][2];
for(int k = 0; k < cc_species; k++)
cc[i][k] += 0.5 * dtv * cc_flux[i][k];
}
}
/* ---------------------------------------------------------------------- */
void FixMvvTDPD::final_integrate()
{
double dtfm;
// update v of atoms in group
double **v = atom->v;
double **f = atom->f;
double **cc = atom->cc;
double **cc_flux = atom->cc_flux;
double **vest = atom->vest;
double *rmass = atom->rmass;
double *mass = atom->mass;
int *type = atom->type;
int *mask = atom->mask;
int nlocal = atom->nlocal;
if (igroup == atom->firstgroup) nlocal = atom->nfirst;
for (int i = 0; i < nlocal; i++)
if (mask[i] & groupbit) {
if (rmass) dtfm = dtf / rmass[i];
else dtfm = dtf / mass[type[i]];
v[i][0] = vest[i][0] + dtfm * f[i][0];
v[i][1] = vest[i][1] + dtfm * f[i][1];
v[i][2] = vest[i][2] + dtfm * f[i][2];
for(int k = 0; k < cc_species; k++)
cc[i][k] += 0.5 * dtv * cc_flux[i][k];
}
}
/* ---------------------------------------------------------------------- */
void FixMvvTDPD::reset_dt()
{
dtv = update->dt;
dtf = 0.5 * update->dt * force->ftm2v;
}

View File

@ -0,0 +1,46 @@
/* -*- 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 FIX_CLASS
FixStyle(mvv/tdpd,FixMvvTDPD)
#else
#ifndef LMP_FIX_MVV_TDPD_H
#define LMP_FIX_MVV_TDPD_H
#include "fix.h"
namespace LAMMPS_NS {
class FixMvvTDPD : public Fix {
public:
FixMvvTDPD(class LAMMPS *, int, char **);
virtual ~FixMvvTDPD() {}
int setmask();
virtual void init();
virtual void initial_integrate(int);
virtual void final_integrate();
virtual void reset_dt();
protected:
double dtv, dtf;
double verlet;
int cc_species;
};
}
#endif
#endif

View File

@ -0,0 +1,120 @@
/* ----------------------------------------------------------------------
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.
------------------------------------------------------------------------- */
#include <stdlib.h>
#include <string.h>
#include "fix_tdpd_source.h"
#include "atom.h"
#include "comm.h"
#include "update.h"
#include "modify.h"
#include "domain.h"
#include "lattice.h"
#include "input.h"
#include "variable.h"
#include "error.h"
#include "force.h"
using namespace LAMMPS_NS;
using namespace FixConst;
/* ---------------------------------------------------------------------- */
FixTDPDSource::FixTDPDSource(LAMMPS *lmp, int narg, char **arg) :
Fix(lmp, narg, arg)
{
if (strcmp(style,"tdpd/source") != 0 && narg < 4)
error->all(FLERR,"Illegal fix tdpd/source command");
int iarg = 3;
cc_index = force->inumeric(FLERR,arg[iarg++]);
if (strcmp(arg[iarg],"sphere") == 0) option = 0;
else if (strcmp(arg[iarg],"cuboid") == 0) option = 1;
else error->all(FLERR,"Illegal fix tdpd/source command");
iarg++;
if(option == 0){
if (narg != 10 ) error->all(FLERR,"Illegal fix tdpd/source command (5 args for sphere)");
center[0] = force->numeric(FLERR,arg[iarg++]);
center[1] = force->numeric(FLERR,arg[iarg++]);
center[2] = force->numeric(FLERR,arg[iarg++]);
radius = force->numeric(FLERR,arg[iarg++]);
value = force->numeric(FLERR,arg[iarg++]);
}
else if(option == 1){
if (narg != 12 ) error->all(FLERR,"Illegal fix tdpd/edpd command (7 args for cuboid)");
center[0] = force->numeric(FLERR,arg[iarg++]);
center[1] = force->numeric(FLERR,arg[iarg++]);
center[2] = force->numeric(FLERR,arg[iarg++]);
dLx = force->numeric(FLERR,arg[iarg++]);
dLy = force->numeric(FLERR,arg[iarg++]);
dLz = force->numeric(FLERR,arg[iarg++]);
value = force->numeric(FLERR,arg[iarg++]);
}
else error->all(FLERR,"Illegal fix tdpd/source command");
}
/* ---------------------------------------------------------------------- */
FixTDPDSource::~FixTDPDSource()
{
}
/* ---------------------------------------------------------------------- */
int FixTDPDSource::setmask()
{
int mask = 0;
mask |= POST_FORCE;
return mask;
}
/* ---------------------------------------------------------------------- */
void FixTDPDSource::init()
{
}
/* ---------------------------------------------------------------------- */
void FixTDPDSource::post_force(int vflag)
{
double **x = atom->x;
double **cc_flux = atom->cc_flux;
int *mask = atom->mask;
int nlocal = atom->nlocal;
double drx, dry, drz, rsq;
double radius_sq = radius*radius*radius;
for (int i = 0; i < nlocal; i++) {
if (mask[i] & groupbit) {
if(option == 0){
drx = x[i][0] - center[0];
dry = x[i][1] - center[1];
drz = x[i][2] - center[2];
rsq = drx*drx + dry*dry + drz*drz;
if(rsq < radius_sq)
cc_flux[i][cc_index-1] += value;
}
else if(option == 1){
drx = x[i][0] - center[0];
dry = x[i][1] - center[1];
drz = x[i][2] - center[2];
if(abs(drx) <= 0.5*dLx && abs(dry) <= 0.5*dLy && abs(drz) <= 0.5*dLz)
cc_flux[i][cc_index-1] += value;
}
}
}
}

View File

@ -0,0 +1,45 @@
/* -*- 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 FIX_CLASS
FixStyle(tdpd/source,FixTDPDSource)
#else
#ifndef LMP_FIX_TDPDSOURCE_H
#define LMP_FIX_TDPDSOURCE_H
#include "fix.h"
namespace LAMMPS_NS {
class FixTDPDSource : public Fix {
public:
FixTDPDSource(class LAMMPS *, int, char **);
~FixTDPDSource();
int setmask();
void init();
void post_force(int);
protected:
int option;
int cc_index;
double center[3], radius, dLx, dLy, dLz;
double value;
};
}
#endif
#endif

551
src/USER-MESO/pair_edpd.cpp Normal file
View File

@ -0,0 +1,551 @@
/* ----------------------------------------------------------------------
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: Zhen Li (Brown University)
Email: zhen_li@brown.edu
------------------------------------------------------------------------- */
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include "pair_edpd.h"
#include "atom.h"
#include "atom_vec.h"
#include "comm.h"
#include "update.h"
#include "force.h"
#include "neighbor.h"
#include "neigh_list.h"
#include "random_mars.h"
#include "citeme.h"
#include "memory.h"
#include "error.h"
#include <time.h>
#include <string.h>
using namespace LAMMPS_NS;
#define MIN(A,B) ((A) < (B) ? (A) : (B))
#define MAX(A,B) ((A) > (B) ? (A) : (B))
#define EPSILON 1.0e-10
static const char cite_pair_edpd[] =
"pair edpd command:\n\n"
"@Article{ZLi2014_JCP,\n"
" author = {Li, Z. and Tang, Y.-H. and Lei, H. and Caswell, B. and Karniadakis, G.E.},\n"
" title = {Energy-conserving dissipative particle dynamics with temperature-dependent properties},\n"
" journal = {Journal of Computational Physics},\n"
" year = {2014},\n"
" volume = {265},\n"
" pages = {113--127}\n"
"}\n\n"
"@Article{ZLi2015_CC,\n"
" author = {Li, Z. and Tang, Y.-H. and Li, X. and Karniadakis, G.E.},\n"
" title = {Mesoscale modeling of phase transition dynamics of thermoresponsive polymers},\n"
" journal = {Chemical Communications},\n"
" year = {2015},\n"
" volume = {51},\n"
" pages = {11038--11040}\n"
"}\n\n";
;
/* ---------------------------------------------------------------------- */
PairEDPD::PairEDPD(LAMMPS *lmp) : Pair(lmp)
{
if (lmp->citeme) lmp->citeme->add(cite_pair_edpd);
writedata = 1;
random = NULL;
randomT = NULL;
}
/* ---------------------------------------------------------------------- */
PairEDPD::~PairEDPD()
{
if (allocated) {
memory->destroy(setflag);
memory->destroy(cutsq);
memory->destroy(cut);
memory->destroy(cutT);
memory->destroy(a0);
memory->destroy(gamma);
memory->destroy(power);
memory->destroy(kappa);
memory->destroy(powerT);
}
if (power_flag) memory->destroy(sc);
if (kappa_flag) memory->destroy(kc);
if (random) delete random;
if (randomT) delete randomT;
}
/* ---------------------------------------------------------------------- */
void PairEDPD::compute(int eflag, int vflag)
{
double evdwl = 0.0;
if (eflag || vflag) ev_setup(eflag,vflag);
else evflag = vflag_fdotr = 0;
double **x = atom->x;
double **v = atom->v;
double **f = atom->f;
double *T = atom->edpd_temp;
double *Q = atom->edpd_flux;
double *cv = atom->edpd_cv;
int *type = atom->type;
double *mass = atom->mass;
int nlocal = atom->nlocal;
double *special_lj = force->special_lj;
int newton_pair = force->newton_pair;
double dtinvsqrt = 1.0/sqrt(update->dt);
double kboltz = 1.0;
int inum = list->inum;
int *ilist = list->ilist;
int *numneigh = list->numneigh;
int **firstneigh = list->firstneigh;
// loop over neighbors of my atoms
for (int ii = 0; ii < inum; ii++) {
int i = ilist[ii];
double xtmp = x[i][0];
double ytmp = x[i][1];
double ztmp = x[i][2];
double vxtmp = v[i][0];
double vytmp = v[i][1];
double vztmp = v[i][2];
int itype = type[i];
int *jlist = firstneigh[i];
int jnum = numneigh[i];
for (int jj = 0; jj < jnum; jj++) {
int j = jlist[jj];
double factor_dpd = special_lj[sbmask(j)];
j &= NEIGHMASK;
double delx = xtmp - x[j][0];
double dely = ytmp - x[j][1];
double delz = ztmp - x[j][2];
double rsq = delx*delx + dely*dely + delz*delz;
int jtype = type[j];
if (rsq < cutsq[itype][jtype]) {
double r = sqrt(rsq);
if (r < EPSILON) continue;
double rinv = 1.0/r;
double delvx = vxtmp - v[j][0];
double delvy = vytmp - v[j][1];
double delvz = vztmp - v[j][2];
double dot = delx*delvx + dely*delvy + delz*delvz;
double vijeij = dot*rinv;
double randnum = random->gaussian();
double T_ij=0.5*(T[i]+T[j]);
double T_pow[4];
T_pow[0] = T_ij - 1.0;
T_pow[1] = T_pow[0]*T_pow[0];
T_pow[2] = T_pow[0]*T_pow[1];
T_pow[3] = T_pow[0]*T_pow[2];
double power_d = power[itype][jtype];
if(power_flag){
double factor = 1.0;
for(int k = 0; k < 4; k++)
factor += sc[itype][jtype][k]*T_pow[k];
power_d *= factor;
}
power_d = MAX(0.01,power_d);
double wc = 1.0 - r/cut[itype][jtype];
wc = MAX(0.0,MIN(1.0,wc));
double wr = pow(wc, 0.5*power_d);
double GammaIJ = gamma[itype][jtype];
double SigmaIJ = 4.0*GammaIJ*kboltz*T[i]*T[j]/(T[i]+T[j]);
SigmaIJ = sqrt(SigmaIJ);
double fpair = a0[itype][jtype]*T_ij*wc;
fpair -= GammaIJ *wr*wr *dot*rinv;
fpair += SigmaIJ * wr *randnum * dtinvsqrt;
fpair *= factor_dpd*rinv;
f[i][0] += delx*fpair;
f[i][1] += dely*fpair;
f[i][2] += delz*fpair;
// heat transfer
double dQc,dQd,dQr;
if( r < cutT[itype][jtype]) {
double wrT = 1.0 - r/cutT[itype][jtype];
wrT = MAX(0.0,MIN(1.0,wrT));
wrT = pow(wrT, 0.5*powerT[itype][jtype]);
double randnumT = randomT->gaussian();
randnumT = MAX(-5.0,MIN(randnum,5.0));
double kappaT = kappa[itype][jtype];
if(kappa_flag) {
double factor = 1.0;
for(int k = 0; k < 4; k++)
factor += kc[itype][jtype][k]*T_pow[k];
kappaT *= factor;
}
double kij = cv[i]*cv[j]*kappaT * T_ij*T_ij;
double alphaij = sqrt(2.0*kboltz*kij);
dQc = kij * wrT*wrT * ( T[j] - T[i] )/(T[i]*T[j]);
dQd = wr*wr*( GammaIJ * vijeij*vijeij - SigmaIJ*SigmaIJ/mass[itype] ) - SigmaIJ * wr *vijeij *randnum;
dQd /= (cv[i]+cv[j]);
dQr = alphaij * wrT * dtinvsqrt * randnumT;
Q[i] += (dQc + dQd + dQr );
}
//-----------------------------------------------------------
if (newton_pair || j < nlocal) {
f[j][0] -= delx*fpair;
f[j][1] -= dely*fpair;
f[j][2] -= delz*fpair;
Q[j] -= ( dQc - dQd + dQr );
}
if (eflag) {
evdwl = 0.5*a0[itype][jtype]*T_ij*cut[itype][jtype] * wc*wc;
evdwl *= factor_dpd;
}
if (evflag) ev_tally(i,j,nlocal,newton_pair,evdwl,0.0,fpair,delx,dely,delz);
}
}
}
if (vflag_fdotr) virial_fdotr_compute();
}
/* ----------------------------------------------------------------------
allocate all arrays
------------------------------------------------------------------------- */
void PairEDPD::allocate()
{
int i,j;
allocated = 1;
int n = atom->ntypes;
memory->create(setflag,n+1,n+1,"pair:setflag");
for (i = 1; i <= n; i++)
for (j = i; j <= n; j++)
setflag[i][j] = 0;
memory->create(cutsq,n+1,n+1,"pair:cutsq");
memory->create(cut,n+1,n+1,"pair:cut");
memory->create(cutT,n+1,n+1,"pair:cutT");
memory->create(a0,n+1,n+1,"pair:a0");
memory->create(gamma,n+1,n+1,"pair:gamma");
memory->create(power,n+1,n+1,"pair:power");
memory->create(kappa,n+1,n+1,"pair:kappa");
memory->create(powerT,n+1,n+1,"pair:powerT");
}
/* ----------------------------------------------------------------------
global settings
------------------------------------------------------------------------- */
void PairEDPD::settings(int narg, char **arg)
{
if (narg != 2) error->all(FLERR,"Illegal pair_style command");
cut_global = force->numeric(FLERR,arg[0]);
seed = force->inumeric(FLERR,arg[1]);
// initialize Marsaglia RNG with processor-unique seed
if (seed <= 0 ) {
struct timespec time;
clock_gettime( CLOCK_REALTIME, &time );
seed = time.tv_nsec; // if seed is non-positive, get the current time as the seed
}
delete random;
random = new RanMars(lmp,(seed + comm->me) % 900000000);
randomT = new RanMars(lmp,(2*seed + comm->me) % 900000000);
// reset cutoffs that have been explicitly set
if (allocated) {
int i,j;
for (i = 1; i <= atom->ntypes; i++)
for (j = i+1; j <= atom->ntypes; j++)
if (setflag[i][j])
cut[i][j] = cut_global;
}
}
/* ----------------------------------------------------------------------
set coeffs for one or more type pairs
------------------------------------------------------------------------- */
void PairEDPD::coeff(int narg, char **arg)
{
if (narg < 9)
error->all(FLERR,"Incorrect args for pair edpd coefficients");
if (!allocated) allocate();
int ilo,ihi,jlo,jhi;
force->bounds(FLERR,arg[0],atom->ntypes,ilo,ihi);
force->bounds(FLERR,arg[1],atom->ntypes,jlo,jhi);
double a0_one = force->numeric(FLERR,arg[2]);
double gamma_one = force->numeric(FLERR,arg[3]);
double power_one = force->numeric(FLERR,arg[4]);
double cut_one = force->numeric(FLERR,arg[5]);
double kappa_one = force->numeric(FLERR,arg[6]);
double powerT_one= force->numeric(FLERR,arg[7]);
double cutT_one = force->numeric(FLERR,arg[8]);
int iarg = 9;
power_flag = kappa_flag = 0;
double sc_one[4], kc_one[4];
int n = atom->ntypes;
while (iarg < narg) {
if (strcmp(arg[iarg],"power") == 0) {
if (iarg+5 > narg) error->all(FLERR,"Illegal pair edpd coefficients");
for (int i = 0; i < 4; i++)
sc_one[i] = force->numeric(FLERR,arg[iarg+i+1]);
iarg += 5;
power_flag = 1;
memory->create(sc,n+1,n+1,4,"pair:sc");
} else if (strcmp(arg[iarg],"kappa") == 0) {
if (iarg+5 > narg) error->all(FLERR,"Illegal pair edpd coefficients");
for (int i = 0; i < 4; i++)
kc_one[i] = force->numeric(FLERR,arg[iarg+i+1]);
iarg += 5;
kappa_flag = 1;
memory->create(kc,n+1,n+1,4,"pair:kc");
} else error->all(FLERR,"Illegal pair edpd coefficients");
}
int count = 0;
for (int i = ilo; i <= ihi; i++)
for (int j = MAX(jlo,i); j <= jhi; j++) {
a0[i][j] = a0_one;
gamma[i][j] = gamma_one;
power[i][j] = power_one;
cut[i][j] = cut_one;
kappa[i][j] = kappa_one;
powerT[i][j]= powerT_one;
cutT[i][j] = cutT_one;
if(power_flag)
for (int k = 0; k < 4; k++)
sc[i][j][k] = sc_one[k];
if(kappa_flag)
for (int k = 0; k < 4; k++)
kc[i][j][k] = kc_one[k];
setflag[i][j] = 1;
count++;
}
if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients");
}
/* ----------------------------------------------------------------------
init specific to this pair style
------------------------------------------------------------------------- */
void PairEDPD::init_style()
{
if (comm->ghost_velocity == 0)
error->all(FLERR,"Pair edpd requires ghost atoms store velocity");
// if newton off, forces between atoms ij will be double computed
// using different random numbers
if (force->newton_pair == 0 && comm->me == 0) error->warning(FLERR,
"Pair tdpd needs newton pair on for momentum conservation");
neighbor->request(this,instance_me);
}
/* ----------------------------------------------------------------------
init for one type pair i,j and corresponding j,i
------------------------------------------------------------------------- */
double PairEDPD::init_one(int i, int j)
{
if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set");
cut[j][i] = cut[i][j];
cutT[j][i] = cutT[i][j];
a0[j][i] = a0[i][j];
gamma[j][i] = gamma[i][j];
power[j][i] = power[i][j];
kappa[j][i] = kappa[i][j];
powerT[j][i]= powerT[i][j];
if(power_flag)
for (int k = 0; k < 4; k++)
sc[j][i][k] = sc[i][j][k];
if(kappa_flag)
for (int k = 0; k < 4; k++)
kc[j][i][k] = kc[i][j][k];
return cut[i][j];
}
/* ----------------------------------------------------------------------
proc 0 writes to restart file
------------------------------------------------------------------------- */
void PairEDPD::write_restart(FILE *fp)
{
write_restart_settings(fp);
for (int i = 1; i <= atom->ntypes; i++)
for (int j = i; j <= atom->ntypes; j++) {
fwrite(&setflag[i][j],sizeof(int),1,fp);
if (setflag[i][j]) {
fwrite(&a0[i][j],sizeof(double),1,fp);
fwrite(&gamma[i][j],sizeof(double),1,fp);
fwrite(&power[i][j],sizeof(double),1,fp);
fwrite(&cut[i][j],sizeof(double),1,fp);
fwrite(&kappa[i][j],sizeof(double),1,fp);
fwrite(&powerT[i][j],sizeof(double),1,fp);
fwrite(&cutT[i][j],sizeof(double),1,fp);
if(power_flag)
for (int k = 0; k < 4; k++)
fwrite(&sc[i][j][k],sizeof(double),1,fp);
if(kappa_flag)
for (int k = 0; k < 4; k++)
fwrite(&kc[i][j][k],sizeof(double),1,fp);
}
}
}
/* ----------------------------------------------------------------------
proc 0 reads from restart file, bcasts
------------------------------------------------------------------------- */
void PairEDPD::read_restart(FILE *fp)
{
read_restart_settings(fp);
allocate();
int me = comm->me;
for (int i = 1; i <= atom->ntypes; i++)
for (int j = i; j <= atom->ntypes; j++) {
if (me == 0) fread(&setflag[i][j],sizeof(int),1,fp);
MPI_Bcast(&setflag[i][j],1,MPI_INT,0,world);
if (setflag[i][j]) {
if (me == 0) {
fread(&a0[i][j],sizeof(double),1,fp);
fread(&gamma[i][j],sizeof(double),1,fp);
fread(&power[i][j],sizeof(double),1,fp);
fread(&cut[i][j],sizeof(double),1,fp);
fread(&kappa[i][j],sizeof(double),1,fp);
fread(&powerT[i][j],sizeof(double),1,fp);
fread(&cutT[i][j],sizeof(double),1,fp);
if(power_flag)
for (int k = 0; k < 4; k++)
fread(&sc[i][j][k],sizeof(double),1,fp);
if(kappa_flag)
for (int k = 0; k < 4; k++)
fread(&kc[i][j][k],sizeof(double),1,fp);
}
MPI_Bcast(&a0[i][j],1,MPI_DOUBLE,0,world);
MPI_Bcast(&gamma[i][j],1,MPI_DOUBLE,0,world);
MPI_Bcast(&power[i][j],1,MPI_DOUBLE,0,world);
MPI_Bcast(&cut[i][j],1,MPI_DOUBLE,0,world);
MPI_Bcast(&kappa[i][j],1,MPI_DOUBLE,0,world);
MPI_Bcast(&powerT[i][j],1,MPI_DOUBLE,0,world);
MPI_Bcast(&cutT[i][j],1,MPI_DOUBLE,0,world);
if(power_flag)
for (int k = 0; k < 4; k++)
MPI_Bcast(&sc[i][j][k],1,MPI_DOUBLE,0,world);
if(kappa_flag)
for (int k = 0; k < 4; k++)
MPI_Bcast(&kc[i][j][k],1,MPI_DOUBLE,0,world);
}
}
}
/* ----------------------------------------------------------------------
proc 0 writes to restart file
------------------------------------------------------------------------- */
void PairEDPD::write_restart_settings(FILE *fp)
{
fwrite(&cut_global,sizeof(double),1,fp);
fwrite(&seed,sizeof(int),1,fp);
fwrite(&mix_flag,sizeof(int),1,fp);
}
/* ----------------------------------------------------------------------
proc 0 reads from restart file, bcasts
------------------------------------------------------------------------- */
void PairEDPD::read_restart_settings(FILE *fp)
{
if (comm->me == 0) {
fread(&cut_global,sizeof(double),1,fp);
fread(&seed,sizeof(int),1,fp);
fread(&mix_flag,sizeof(int),1,fp);
}
MPI_Bcast(&cut_global,1,MPI_DOUBLE,0,world);
MPI_Bcast(&seed,1,MPI_INT,0,world);
MPI_Bcast(&mix_flag,1,MPI_INT,0,world);
// initialize Marsaglia RNG with processor-unique seed
// same seed that pair_style command initially specified
if (random) delete random;
random = new RanMars(lmp,seed + comm->me);
if (randomT) delete randomT;
randomT = new RanMars(lmp,seed + comm->me);
}
/* ---------------------------------------------------------------------- */
double PairEDPD::single(int i, int j, int itype, int jtype, double rsq,
double factor_coul, double factor_dpd, double &fforce)
{
double r,rinv,wc,phi;
double *T = atom->edpd_temp;
r = sqrt(rsq);
if (r < EPSILON) {
fforce = 0.0;
return 0.0;
}
double T_ij = 0.5*(T[i]+T[j]);
rinv = 1.0/r;
wc = 1.0 - r/cut[itype][jtype];
fforce = a0[itype][jtype]*T_ij*wc*factor_dpd*rinv;
phi = 0.5*a0[itype][jtype]*T_ij*cut[itype][jtype]*wc*wc;
return factor_dpd*phi;
}

85
src/USER-MESO/pair_edpd.h Normal file
View File

@ -0,0 +1,85 @@
/* -*- 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 PAIR_CLASS
PairStyle(edpd,PairEDPD)
#else
#ifndef LMP_PAIR_EDPD_H
#define LMP_PAIR_EDPD_H
#include "pair.h"
namespace LAMMPS_NS {
class PairEDPD : public Pair {
public:
PairEDPD(class LAMMPS *);
virtual ~PairEDPD();
virtual void compute(int, int);
virtual void settings(int, char **);
virtual void coeff(int, char **);
void init_style();
double init_one(int, int);
virtual void write_restart(FILE *);
virtual void read_restart(FILE *);
virtual void write_restart_settings(FILE *);
virtual void read_restart_settings(FILE *);
double single(int, int, int, int, double, double, double, double &);
protected:
double cut_global;
int seed;
double **cut,**cutT;
double **a0,**gamma;
double **power;
double **slope;
double **kappa;
double **powerT;
int power_flag, kappa_flag;
double ***sc,***kc;
class RanMars *random;
class RanMars *randomT;
void allocate();
};
}
#endif
#endif
/* ERROR/WARNING messages:
E: Illegal ... command
Self-explanatory. Check the input script syntax and compare to the
documentation for the command. You can use -echo screen as a
command-line option when running LAMMPS to see the offending line.
E: Incorrect args for pair coefficients
Self-explanatory. Check the input script or data file.
W: Pair tdpd needs newton pair on for momentum conservation
Self-explanatory.
E: All pair coeffs are not set
All pair coefficients must be set in the data file or by the
pair_coeff command before running a simulation.
*/

425
src/USER-MESO/pair_mdpd.cpp Normal file
View File

@ -0,0 +1,425 @@
/* ----------------------------------------------------------------------
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: Zhen Li (Brown University)
Email: zhen_li@brown.edu
------------------------------------------------------------------------- */
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include "pair_mdpd.h"
#include "atom.h"
#include "atom_vec.h"
#include "comm.h"
#include "update.h"
#include "force.h"
#include "neighbor.h"
#include "neigh_list.h"
#include "random_mars.h"
#include "citeme.h"
#include "memory.h"
#include "error.h"
#include <time.h>
using namespace LAMMPS_NS;
#define EPSILON 1.0e-10
static const char cite_pair_mdpd[] =
"pair mdpd command:\n\n"
"@Article{ZLi2013_POF,\n"
" author = {Li, Z. and Hu, G.H. and Wang, Z.L. and Ma Y.B. and Zhou, Z.W.},\n"
" title = {Three dimensional flow structures in a moving droplet on substrate: a dissipative particle dynamics study},\n"
" journal = {Physics of Fluids},\n"
" year = {2013},\n"
" volume = {25},\n"
" pages = {072103}\n"
"}\n\n";
/* ---------------------------------------------------------------------- */
PairMDPD::PairMDPD(LAMMPS *lmp) : Pair(lmp)
{
if (lmp->citeme) lmp->citeme->add(cite_pair_mdpd);
writedata = 1;
random = NULL;
}
/* ---------------------------------------------------------------------- */
PairMDPD::~PairMDPD()
{
if (allocated) {
memory->destroy(setflag);
memory->destroy(cutsq);
memory->destroy(cut);
memory->destroy(cut_r);
memory->destroy(A_att);
memory->destroy(B_rep);
memory->destroy(gamma);
memory->destroy(sigma);
}
if (random) delete random;
}
/* ---------------------------------------------------------------------- */
void PairMDPD::compute(int eflag, int vflag)
{
int i,j,ii,jj,inum,jnum,itype,jtype;
double xtmp,ytmp,ztmp,delx,dely,delz,evdwl,fpair;
double vxtmp,vytmp,vztmp,delvx,delvy,delvz;
double rsq,r,rinv,dot,wc,wc_r, wr,randnum,factor_dpd;
int *ilist,*jlist,*numneigh,**firstneigh;
double rhoi, rhoj;
evdwl = 0.0;
if (eflag || vflag) ev_setup(eflag,vflag);
else evflag = vflag_fdotr = 0;
double **x = atom->x;
double **v = atom->v;
double **f = atom->f;
double *rho= atom->rho;
int *type = atom->type;
int nlocal = atom->nlocal;
double *special_lj = force->special_lj;
int newton_pair = force->newton_pair;
double dtinvsqrt = 1.0/sqrt(update->dt);
inum = list->inum;
ilist = list->ilist;
numneigh = list->numneigh;
firstneigh = list->firstneigh;
// loop over neighbors of my atoms
for (ii = 0; ii < inum; ii++) {
i = ilist[ii];
xtmp = x[i][0];
ytmp = x[i][1];
ztmp = x[i][2];
vxtmp = v[i][0];
vytmp = v[i][1];
vztmp = v[i][2];
itype = type[i];
jlist = firstneigh[i];
jnum = numneigh[i];
rhoi = rho[i];
for (jj = 0; jj < jnum; jj++) {
j = jlist[jj];
factor_dpd = special_lj[sbmask(j)];
j &= NEIGHMASK;
delx = xtmp - x[j][0];
dely = ytmp - x[j][1];
delz = ztmp - x[j][2];
rsq = delx*delx + dely*dely + delz*delz;
jtype = type[j];
if (rsq < cutsq[itype][jtype]) {
r = sqrt(rsq);
if (r < EPSILON) continue; // r can be 0.0 in MDPD systems
rinv = 1.0/r;
delvx = vxtmp - v[j][0];
delvy = vytmp - v[j][1];
delvz = vztmp - v[j][2];
dot = delx*delvx + dely*delvy + delz*delvz;
wc = 1.0 - r/cut[itype][jtype];
wc_r = 1.0 - r/cut_r[itype][jtype];
wc_r = MAX(wc_r,0.0);
wr = wc;
rhoj = rho[j];
randnum = random->gaussian();
// conservative force = A_att * wc + B_rep*(rhoi+rhoj)*wc_r
// drag force = -gamma * wr^2 * (delx dot delv) / r
// random force = sigma * wr * rnd * dtinvsqrt;
fpair = A_att[itype][jtype]*wc + B_rep[itype][jtype]*(rhoi+rhoj)*wc_r;
fpair -= gamma[itype][jtype]*wr*wr*dot*rinv;
fpair += sigma[itype][jtype]*wr*randnum*dtinvsqrt;
fpair *= factor_dpd*rinv;
f[i][0] += delx*fpair;
f[i][1] += dely*fpair;
f[i][2] += delz*fpair;
if (newton_pair || j < nlocal) {
f[j][0] -= delx*fpair;
f[j][1] -= dely*fpair;
f[j][2] -= delz*fpair;
}
if (eflag) {
// unshifted eng of conservative term:
// eng shifted to 0.0 at cutoff
evdwl = 0.5*A_att[itype][jtype]*cut[itype][jtype] * wr*wr + 0.5*B_rep[itype][jtype]*cut_r[itype][jtype]*(rhoi+rhoj)*wc_r*wc_r;
evdwl *= factor_dpd;
}
if (evflag) ev_tally(i,j,nlocal,newton_pair,evdwl,0.0,fpair,delx,dely,delz);
}
}
}
if (vflag_fdotr) virial_fdotr_compute();
}
/* ----------------------------------------------------------------------
allocate all arrays
------------------------------------------------------------------------- */
void PairMDPD::allocate()
{
int i,j;
allocated = 1;
int n = atom->ntypes;
memory->create(setflag,n+1,n+1,"pair:setflag");
for (i = 1; i <= n; i++)
for (j = i; j <= n; j++)
setflag[i][j] = 0;
memory->create(cutsq,n+1,n+1,"pair:cutsq");
memory->create(cut,n+1,n+1,"pair:cut");
memory->create(cut_r,n+1,n+1,"pair:cut_r");
memory->create(A_att,n+1,n+1,"pair:A_att");
memory->create(B_rep,n+1,n+1,"pair:B_rep");
memory->create(gamma,n+1,n+1,"pair:gamma");
memory->create(sigma,n+1,n+1,"pair:sigma");
}
/* ----------------------------------------------------------------------
global settings
------------------------------------------------------------------------- */
void PairMDPD::settings(int narg, char **arg)
{
if (narg != 3) error->all(FLERR,"Illegal pair_style command");
temperature = force->numeric(FLERR,arg[0]);
cut_global = force->numeric(FLERR,arg[1]);
seed = force->inumeric(FLERR,arg[2]);
// initialize Marsaglia RNG with processor-unique seed
if (seed <= 0 ) {
struct timespec time;
clock_gettime( CLOCK_REALTIME, &time );
seed = time.tv_nsec; // if seed is non-positive, get the current time as the seed
}
delete random;
random = new RanMars(lmp,(seed + comm->me) % 900000000);
// reset cutoffs that have been explicitly set
if (allocated) {
int i,j;
for (i = 1; i <= atom->ntypes; i++)
for (j = i+1; j <= atom->ntypes; j++)
if (setflag[i][j]) cut[i][j] = cut_global;
}
}
/* ----------------------------------------------------------------------
set coeffs for one or more type pairs
------------------------------------------------------------------------- */
void PairMDPD::coeff(int narg, char **arg)
{
if(narg != 7 ) error->all(FLERR,"Incorrect args for pair coefficients\n itype jtype A B gamma cutA cutB");
if (!allocated) allocate();
int ilo,ihi,jlo,jhi;
force->bounds(FLERR,arg[0],atom->ntypes,ilo,ihi);
force->bounds(FLERR,arg[1],atom->ntypes,jlo,jhi);
double A_one = force->numeric(FLERR,arg[2]);
double B_one = force->numeric(FLERR,arg[3]);
double gamma_one = force->numeric(FLERR,arg[4]);
double cut_one = force->numeric(FLERR,arg[5]);
double cut_two = force->numeric(FLERR,arg[6]);
if(cut_one < cut_two) error->all(FLERR,"Incorrect args for pair coefficients\n cutA should be larger than cutB.");
int count = 0;
for (int i = ilo; i <= ihi; i++) {
for (int j = MAX(jlo,i); j <= jhi; j++) {
A_att[i][j] = A_one;
B_rep[i][j] = B_one;
gamma[i][j] = gamma_one;
cut[i][j] = cut_one;
cut_r[i][j] = cut_two;
setflag[i][j] = 1;
count++;
}
}
if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients");
}
/* ----------------------------------------------------------------------
init specific to this pair style
------------------------------------------------------------------------- */
void PairMDPD::init_style()
{
if (comm->ghost_velocity == 0)
error->all(FLERR,"Pair mdpd requires ghost atoms store velocity");
// if newton off, forces between atoms ij will be double computed
// using different random numbers
if (force->newton_pair == 0 && comm->me == 0) error->warning(FLERR,
"Pair mdpd needs newton pair on for momentum conservation");
neighbor->request(this,instance_me);
}
/* ----------------------------------------------------------------------
init for one type pair i,j and corresponding j,i
------------------------------------------------------------------------- */
double PairMDPD::init_one(int i, int j)
{
if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set");
sigma[i][j] = sqrt(2.0*force->boltz*temperature*gamma[i][j]);
cut[j][i] = cut[i][j];
cut_r[j][i] = cut_r[i][j];
A_att[j][i] = A_att[i][j];
B_rep[j][i] = B_rep[i][j];
gamma[j][i] = gamma[i][j];
sigma[j][i] = sigma[i][j];
return cut[i][j];
}
/* ----------------------------------------------------------------------
proc 0 writes to restart file
------------------------------------------------------------------------- */
void PairMDPD::write_restart(FILE *fp)
{
write_restart_settings(fp);
int i,j;
for (i = 1; i <= atom->ntypes; i++)
for (j = i; j <= atom->ntypes; j++) {
fwrite(&setflag[i][j],sizeof(int),1,fp);
if (setflag[i][j]) {
fwrite(&A_att[i][j],sizeof(double),1,fp);
fwrite(&B_rep[i][j],sizeof(double),1,fp);
fwrite(&gamma[i][j],sizeof(double),1,fp);
fwrite(&cut[i][j],sizeof(double),1,fp);
fwrite(&cut_r[i][j],sizeof(double),1,fp);
}
}
}
/* ----------------------------------------------------------------------
proc 0 reads from restart file, bcasts
------------------------------------------------------------------------- */
void PairMDPD::read_restart(FILE *fp)
{
read_restart_settings(fp);
allocate();
int i,j;
int me = comm->me;
for (i = 1; i <= atom->ntypes; i++)
for (j = i; j <= atom->ntypes; j++) {
if (me == 0) fread(&setflag[i][j],sizeof(int),1,fp);
MPI_Bcast(&setflag[i][j],1,MPI_INT,0,world);
if (setflag[i][j]) {
if (me == 0) {
fread(&A_att[i][j],sizeof(double),1,fp);
fread(&B_rep[i][j],sizeof(double),1,fp);
fread(&gamma[i][j],sizeof(double),1,fp);
fread(&cut[i][j],sizeof(double),1,fp);
fread(&cut_r[i][j],sizeof(double),1,fp);
}
MPI_Bcast(&A_att[i][j],1,MPI_DOUBLE,0,world);
MPI_Bcast(&B_rep[i][j],1,MPI_DOUBLE,0,world);
MPI_Bcast(&gamma[i][j],1,MPI_DOUBLE,0,world);
MPI_Bcast(&cut[i][j],1,MPI_DOUBLE,0,world);
MPI_Bcast(&cut_r[i][j],1,MPI_DOUBLE,0,world);
}
}
}
/* ----------------------------------------------------------------------
proc 0 writes to restart file
------------------------------------------------------------------------- */
void PairMDPD::write_restart_settings(FILE *fp)
{
fwrite(&temperature,sizeof(double),1,fp);
fwrite(&cut_global,sizeof(double),1,fp);
fwrite(&seed,sizeof(int),1,fp);
fwrite(&mix_flag,sizeof(int),1,fp);
}
/* ----------------------------------------------------------------------
proc 0 reads from restart file, bcasts
------------------------------------------------------------------------- */
void PairMDPD::read_restart_settings(FILE *fp)
{
if (comm->me == 0) {
fread(&temperature,sizeof(double),1,fp);
fread(&cut_global,sizeof(double),1,fp);
fread(&seed,sizeof(int),1,fp);
fread(&mix_flag,sizeof(int),1,fp);
}
MPI_Bcast(&temperature,1,MPI_DOUBLE,0,world);
MPI_Bcast(&cut_global,1,MPI_DOUBLE,0,world);
MPI_Bcast(&seed,1,MPI_INT,0,world);
MPI_Bcast(&mix_flag,1,MPI_INT,0,world);
// initialize Marsaglia RNG with processor-unique seed
// same seed that pair_style command initially specified
if (random) delete random;
random = new RanMars(lmp,seed + comm->me);
}
/* ----------------------------------------------------------------------
proc 0 writes to data file
------------------------------------------------------------------------- */
void PairMDPD::write_data(FILE *fp)
{
for (int i = 1; i <= atom->ntypes; i++)
fprintf(fp,"%d %g %g %g\n",i,A_att[i][i],B_rep[i][i],gamma[i][i]);
}
/* ----------------------------------------------------------------------
proc 0 writes all pairs to data file
------------------------------------------------------------------------- */
void PairMDPD::write_data_all(FILE *fp)
{
for (int i = 1; i <= atom->ntypes; i++)
for (int j = i; j <= atom->ntypes; j++)
fprintf(fp,"%d %d %g %g %g %g %g\n",i,j,A_att[i][j],B_rep[i][j],gamma[i][j],cut[i][j],cut_r[i][j]);
}

84
src/USER-MESO/pair_mdpd.h Normal file
View File

@ -0,0 +1,84 @@
/* -*- 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 PAIR_CLASS
PairStyle(mdpd,PairMDPD)
#else
#ifndef LMP_PAIR_MDPD_H
#define LMP_PAIR_MDPD_H
#include "pair.h"
namespace LAMMPS_NS {
class PairMDPD : public Pair {
public:
PairMDPD(class LAMMPS *);
virtual ~PairMDPD();
virtual void compute(int, int);
virtual void settings(int, char **);
virtual void coeff(int, char **);
void init_style();
double init_one(int, int);
virtual void write_restart(FILE *);
virtual void read_restart(FILE *);
virtual void write_restart_settings(FILE *);
virtual void read_restart_settings(FILE *);
virtual void write_data(FILE *);
virtual void write_data_all(FILE *);
protected:
double cut_global,temperature;
int seed;
double **cut, **cut_r;
double **A_att,**B_rep;
double **gamma,**sigma;
class RanMars *random;
void allocate();
};
}
#endif
#endif
/* ERROR/WARNING messages:
E: Illegal ... command
Self-explanatory. Check the input script syntax and compare to the
documentation for the command. You can use -echo screen as a
command-line option when running LAMMPS to see the offending line.
E: Incorrect args for pair coefficients
Self-explanatory. Check the input script or data file.
E: Pair dpd requires ghost atoms store velocity
Use the comm_modify vel yes command to enable this.
W: Pair dpd needs newton pair on for momentum conservation
Self-explanatory.
E: All pair coeffs are not set
All pair coefficients must be set in the data file or by the
pair_coeff command before running a simulation.
*/

View File

@ -0,0 +1,267 @@
/* ----------------------------------------------------------------------
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.
------------------------------------------------------------------------- */
/*-----------------------------------------------------------------------
This is a Child Class PairMDPD for taking care of density summation
before the force calculation.
The code uses 3D Lucy kernel, it can be modified for other kernels.
Contributing author: Zhen Li (Brown University)
------------------------------------------------------------------------- */
#include <math.h>
#include <stdlib.h>
#include "pair_mdpd_rhosum.h"
#include "atom.h"
#include "force.h"
#include "comm.h"
#include "neigh_list.h"
#include "neigh_request.h"
#include "memory.h"
#include "error.h"
#include "neighbor.h"
#include "update.h"
#include "domain.h"
using namespace LAMMPS_NS;
/* ---------------------------------------------------------------------- */
PairMDPDRhoSum::PairMDPDRhoSum(LAMMPS *lmp) : Pair(lmp)
{
restartinfo = 0;
// set comm size needed by this Pair
comm_forward = 1;
first = 1;
}
/* ---------------------------------------------------------------------- */
PairMDPDRhoSum::~PairMDPDRhoSum() {
if (allocated) {
memory->destroy(setflag);
memory->destroy(cutsq);
memory->destroy(cut);
}
}
/* ----------------------------------------------------------------------
init specific to this pair style
------------------------------------------------------------------------- */
void PairMDPDRhoSum::init_style() {
// need a full neighbor list
int irequest = neighbor->request(this,instance_me);
neighbor->requests[irequest]->half = 0;
neighbor->requests[irequest]->full = 1;
}
/* ---------------------------------------------------------------------- */
void PairMDPDRhoSum::compute(int eflag, int vflag) {
int i, j, ii, jj, jnum, itype, jtype;
double xtmp, ytmp, ztmp, delx, dely, delz;
double r, rsq, h, ih, ihsq;
int *jlist;
double wf;
// neighbor list variables
int inum, *ilist, *numneigh, **firstneigh;
if (eflag || vflag)
ev_setup(eflag, vflag);
else
evflag = vflag_fdotr = 0;
double **x = atom->x;
double *rho = atom->rho;
int *type = atom->type;
double *mass = atom->mass;
// check consistency of pair coefficients
if (first) {
for (i = 1; i <= atom->ntypes; i++)
for (j = 1; i <= atom->ntypes; i++)
if (cutsq[i][j] > 0.0)
if (!setflag[i][i] || !setflag[j][j])
if (comm->me == 0)
printf("mDPD particle types %d and %d interact, but not all of their single particle properties are set.\n", i, j);
first = 0;
}
inum = list->inum;
ilist = list->ilist;
numneigh = list->numneigh;
firstneigh = list->firstneigh;
// recompute density
// we use a full neighborlist here
// initialize density with zero self-contribution,
for (ii = 0; ii < inum; ii++) {
i = ilist[ii];
itype = type[i];
h = cut[itype][itype];
// Lucy kernel, 3d
wf = 2.0889086280811262819e0 / (h * h * h);
rho[i] = 0;
}
// add density at each atom via kernel function overlap
for (ii = 0; ii < inum; ii++) {
i = ilist[ii];
xtmp = x[i][0];
ytmp = x[i][1];
ztmp = x[i][2];
itype = type[i];
jlist = firstneigh[i];
jnum = numneigh[i];
for (jj = 0; jj < jnum; jj++) {
j = jlist[jj];
j &= NEIGHMASK;
jtype = type[j];
delx = xtmp - x[j][0];
dely = ytmp - x[j][1];
delz = ztmp - x[j][2];
rsq = delx * delx + dely * dely + delz * delz;
if (rsq < cutsq[itype][jtype]) {
h = cut[itype][jtype];
ih = 1.0 / h;
ihsq = ih * ih;
// Lucy kernel, 3d
r = sqrt(rsq);
wf = (h - r) * ihsq;
wf = 2.0889086280811262819e0 * (h + 3. * r) * wf * wf * wf * ih;
rho[i] += mass[jtype]*wf;
}
}
}
// communicate densities
comm->forward_comm_pair(this);
}
/* ----------------------------------------------------------------------
allocate all arrays
------------------------------------------------------------------------- */
void PairMDPDRhoSum::allocate() {
allocated = 1;
int n = atom->ntypes;
memory->create(setflag, n + 1, n + 1, "pair:setflag");
for (int i = 1; i <= n; i++)
for (int j = i; j <= n; j++)
setflag[i][j] = 0;
memory->create(cutsq, n + 1, n + 1, "pair:cutsq");
memory->create(cut, n + 1, n + 1, "pair:cut");
}
/* ----------------------------------------------------------------------
global settings
------------------------------------------------------------------------- */
void PairMDPDRhoSum::settings(int narg, char **arg) {
if (narg != 0)
error->all(FLERR,"Illegal number of setting arguments for pair_style mdpd/rhosum");
}
/* ----------------------------------------------------------------------
set coeffs for one or more type pairs
------------------------------------------------------------------------- */
void PairMDPDRhoSum::coeff(int narg, char **arg) {
if (narg != 3)
error->all(FLERR,"Incorrect number of args for mdpd/rhosum coefficients");
if (!allocated)
allocate();
int ilo, ihi, jlo, jhi;
force->bounds(FLERR,arg[0], atom->ntypes, ilo, ihi);
force->bounds(FLERR,arg[1], atom->ntypes, jlo, jhi);
double cut_one = force->numeric(FLERR,arg[2]);
int count = 0;
for (int i = ilo; i <= ihi; i++) {
for (int j = MAX(jlo,i); j <= jhi; j++) {
cut[i][j] = cut_one;
setflag[i][j] = 1;
count++;
}
}
if (count == 0)
error->all(FLERR,"Incorrect args for pair coefficients");
}
/* ----------------------------------------------------------------------
init for one type pair i,j and corresponding j,i
------------------------------------------------------------------------- */
double PairMDPDRhoSum::init_one(int i, int j) {
if (setflag[i][j] == 0) {
error->all(FLERR,"All pair mdpd/rhosum coeffs are not set");
}
cut[j][i] = cut[i][j];
return cut[i][j];
}
/* ---------------------------------------------------------------------- */
double PairMDPDRhoSum::single(int i, int j, int itype, int jtype, double rsq,
double factor_coul, double factor_lj, double &fforce) {
fforce = 0.0;
return 0.0;
}
/* ---------------------------------------------------------------------- */
int PairMDPDRhoSum::pack_forward_comm(int n, int *list, double *buf,
int pbc_flag, int *pbc) {
int i, j, m;
double *rho = atom->rho;
m = 0;
for (i = 0; i < n; i++) {
j = list[i];
buf[m++] = rho[j];
}
return m;
}
/* ---------------------------------------------------------------------- */
void PairMDPDRhoSum::unpack_forward_comm(int n, int first, double *buf) {
int i, m, last;
double *rho = atom->rho;
m = 0;
last = first + n;
for (i = first; i < last; i++)
rho[i] = buf[m++];
}

View File

@ -0,0 +1,50 @@
/* -*- 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 PAIR_CLASS
PairStyle(mdpd/rhosum,PairMDPDRhoSum)
#else
#ifndef LMP_PAIR_MDPD_RHOSUM_H
#define LMP_PAIR_MDPD_RHOSUM_H
#include "pair.h"
namespace LAMMPS_NS {
class PairMDPDRhoSum : public Pair {
public:
PairMDPDRhoSum(class LAMMPS *);
virtual ~PairMDPDRhoSum();
void init_style();
virtual void compute(int, int);
void settings(int, char **);
void coeff(int, char **);
virtual double init_one(int, int);
virtual double single(int, int, int, int, double, double, double, double &);
int pack_forward_comm(int, int *, double *, int, int *);
void unpack_forward_comm(int, int, double *);
protected:
double **cut;
int first;
void allocate();
};
}
#endif
#endif

477
src/USER-MESO/pair_tdpd.cpp Normal file
View File

@ -0,0 +1,477 @@
/* ----------------------------------------------------------------------
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: Zhen Li (Brown University)
Email: zhen_li@brown.edu
------------------------------------------------------------------------- */
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include "pair_tdpd.h"
#include "atom.h"
#include "atom_vec.h"
#include "comm.h"
#include "update.h"
#include "force.h"
#include "neighbor.h"
#include "neigh_list.h"
#include "random_mars.h"
#include "citeme.h"
#include "memory.h"
#include "error.h"
#include <time.h>
using namespace LAMMPS_NS;
#define MIN(A,B) ((A) < (B) ? (A) : (B))
#define MAX(A,B) ((A) > (B) ? (A) : (B))
#define EPSILON 1.0e-10
static const char cite_pair_tdpd[] =
"pair tdpd command:\n\n"
"@Article{ZLi2015_JCP,\n"
" author = {Li, Z. and Yazdani, A. and Tartakovsky, A. and Karniadakis, G.E.},\n"
" title = {Transport dissipative particle dynamics model for mesoscopic advection-diffusion-reaction problems},\n"
" journal = {The Journal of Chemical Physics},\n"
" year = {2015},\n"
" volume = {143},\n"
" pages = {014101}\n"
"}\n\n";
/* ---------------------------------------------------------------------- */
PairTDPD::PairTDPD(LAMMPS *lmp) : Pair(lmp)
{
if (lmp->citeme) lmp->citeme->add(cite_pair_tdpd);
cc_species = atom->cc_species;
writedata = 1;
random = NULL;
}
/* ---------------------------------------------------------------------- */
PairTDPD::~PairTDPD()
{
if (allocated) {
memory->destroy(setflag);
memory->destroy(cutsq);
memory->destroy(cut);
memory->destroy(cutcc);
memory->destroy(a0);
memory->destroy(gamma);
memory->destroy(sigma);
memory->destroy(power);
memory->destroy(kappa);
memory->destroy(epsilon);
memory->destroy(powercc);
}
if (random) delete random;
}
/* ---------------------------------------------------------------------- */
void PairTDPD::compute(int eflag, int vflag)
{
double evdwl = 0.0;
double fpair;
if (eflag || vflag) ev_setup(eflag,vflag);
else evflag = vflag_fdotr = 0;
double **x = atom->x;
double **v = atom->v;
double **f = atom->f;
double **cc = atom->cc;
double **cc_flux = atom->cc_flux;
int *type = atom->type;
int nlocal = atom->nlocal;
double *special_lj = force->special_lj;
int newton_pair = force->newton_pair;
double dtinvsqrt = 1.0/sqrt(update->dt);
int inum = list->inum;
int *ilist = list->ilist;
int *numneigh = list->numneigh;
int **firstneigh = list->firstneigh;
// loop over neighbors of my atoms
for (int ii = 0; ii < inum; ii++) {
int i = ilist[ii];
double xtmp = x[i][0];
double ytmp = x[i][1];
double ztmp = x[i][2];
double vxtmp = v[i][0];
double vytmp = v[i][1];
double vztmp = v[i][2];
int itype = type[i];
int *jlist = firstneigh[i];
int jnum = numneigh[i];
for (int jj = 0; jj < jnum; jj++) {
int j = jlist[jj];
double factor_dpd = special_lj[sbmask(j)];
j &= NEIGHMASK;
double delx = xtmp - x[j][0];
double dely = ytmp - x[j][1];
double delz = ztmp - x[j][2];
double rsq = delx*delx + dely*dely + delz*delz;
int jtype = type[j];
if (rsq < cutsq[itype][jtype]) {
double r = sqrt(rsq);
if (r < EPSILON) continue; // r can be 0.0 in DPD systems
double rinv = 1.0/r;
double delvx = vxtmp - v[j][0];
double delvy = vytmp - v[j][1];
double delvz = vztmp - v[j][2];
double dot = delx*delvx + dely*delvy + delz*delvz;
double wc = 1.0 - r/cut[itype][jtype];
wc = MAX(0,MIN(1.0,wc));
double wr = pow(wc, 0.5*power[itype][jtype]);
double randnum = random->gaussian();
// conservative force = a0 * wc
// drag force = -gamma * wr^2 * (delx dot delv) / r
// random force = sigma * wr^(power/2) * rnd * dtinvsqrt;
double fpair = a0[itype][jtype]*wc;
fpair -= gamma[itype][jtype]*wr*wr*dot*rinv;
fpair += sigma[itype][jtype]*wr*randnum*dtinvsqrt;
fpair *= factor_dpd*rinv;
f[i][0] += delx*fpair;
f[i][1] += dely*fpair;
f[i][2] += delz*fpair;
// chemical concentration transport
if( r < cutcc[itype][jtype]) {
for(int k=0; k<cc_species; k++) {
double wcr = 1.0 - r/cutcc[itype][jtype];
wcr = MAX(0,wcr);
wcr = pow(wcr, 0.5*powercc[itype][jtype][k]);
double randnum = random->gaussian();
randnum = MAX(-5.0,MIN(randnum,5.0));
double dQc = -kappa[itype][jtype][k] * wcr*wcr *(cc[i][k]-cc[j][k]);
double dQr = epsilon[itype][jtype][k] *wcr* (cc[i][k]+cc[j][k]) *randnum*dtinvsqrt;
cc_flux[i][k] += (dQc + dQr);
if (newton_pair || j < nlocal)
cc_flux[j][k] -= ( dQc + dQr );
}
}
//-----------------------------------------------------------
if (newton_pair || j < nlocal) {
f[j][0] -= delx*fpair;
f[j][1] -= dely*fpair;
f[j][2] -= delz*fpair;
}
if (eflag) {
evdwl = 0.5*a0[itype][jtype]*cut[itype][jtype] * wc*wc;
evdwl *= factor_dpd;
}
if (evflag) ev_tally(i,j,nlocal,newton_pair,evdwl,0.0,fpair,delx,dely,delz);
}
}
}
if (vflag_fdotr) virial_fdotr_compute();
}
/* ----------------------------------------------------------------------
allocate all arrays
------------------------------------------------------------------------- */
void PairTDPD::allocate()
{
int i,j;
allocated = 1;
int n = atom->ntypes;
memory->create(setflag,n+1,n+1,"pair:setflag");
for (i = 1; i <= n; i++)
for (j = i; j <= n; j++)
setflag[i][j] = 0;
memory->create(cutsq,n+1,n+1,"pair:cutsq");
memory->create(cut,n+1,n+1,"pair:cut");
memory->create(cutcc,n+1,n+1,"pair:cutcc");
memory->create(a0,n+1,n+1,"pair:a0");
memory->create(gamma,n+1,n+1,"pair:gamma");
memory->create(sigma,n+1,n+1,"pair:sigma");
memory->create(power,n+1,n+1,"pair:power");
memory->create(kappa,n+1,n+1,cc_species,"pair:kappa");
memory->create(epsilon,n+1,n+1,cc_species,"pair:epsilon");
memory->create(powercc,n+1,n+1,cc_species,"pair:powercc");
for (i = 0; i <= atom->ntypes; i++)
for (j = 0; j <= atom->ntypes; j++)
sigma[i][j] = gamma[i][j] = 0.0;
}
/* ----------------------------------------------------------------------
global settings
------------------------------------------------------------------------- */
void PairTDPD::settings(int narg, char **arg)
{
if (narg != 3) error->all(FLERR,"Illegal pair_style command");
temperature = force->numeric(FLERR,arg[0]);
cut_global = force->numeric(FLERR,arg[1]);
seed = force->inumeric(FLERR,arg[2]);
// initialize Marsaglia RNG with processor-unique seed
if (seed <= 0 ) {
struct timespec time;
clock_gettime( CLOCK_REALTIME, &time );
seed = time.tv_nsec; // if seed is non-positive, get the current time as the seed
}
delete random;
random = new RanMars(lmp,(seed + comm->me) % 900000000);
// reset cutoffs that have been explicitly set
if (allocated) {
int i,j;
for (i = 1; i <= atom->ntypes; i++)
for (j = i+1; j <= atom->ntypes; j++)
if (setflag[i][j])
cut[i][j] = cut_global;
}
}
/* ----------------------------------------------------------------------
set coeffs for one or more type pairs
------------------------------------------------------------------------- */
void PairTDPD::coeff(int narg, char **arg)
{
if (narg != 7 + 3*cc_species)
error->all(FLERR,"Incorrect args for pair tdpd coefficients");
if (!allocated) allocate();
int ilo,ihi,jlo,jhi;
force->bounds(FLERR,arg[0],atom->ntypes,ilo,ihi);
force->bounds(FLERR,arg[1],atom->ntypes,jlo,jhi);
double a0_one = force->numeric(FLERR,arg[2]);
double gamma_one = force->numeric(FLERR,arg[3]);
double power_one = force->numeric(FLERR,arg[4]);
double cut_one = force->numeric(FLERR,arg[5]);
double cutcc_one = force->numeric(FLERR,arg[6]);
double kappa_one[cc_species],epsilon_one[cc_species],powercc_one[cc_species];
for(int k=0; k<cc_species; k++) {
kappa_one[k] = force->numeric(FLERR,arg[7+3*k]);
epsilon_one[k] = force->numeric(FLERR,arg[8+3*k]);
powercc_one[k] = force->numeric(FLERR,arg[9+3*k]);
}
int count = 0;
for (int i = ilo; i <= ihi; i++)
for (int j = MAX(jlo,i); j <= jhi; j++) {
a0[i][j] = a0_one;
gamma[i][j] = gamma_one;
power[i][j] = power_one;
cut[i][j] = cut_one;
cutcc[i][j] = cutcc_one;
for(int k=0; k<cc_species; k++)
{
kappa [i][j][k] = kappa_one[k];
epsilon[i][j][k]= epsilon_one[k];
powercc[i][j][k]= powercc_one[k];
}
setflag[i][j] = 1;
count++;
}
if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients");
}
/* ----------------------------------------------------------------------
init specific to this pair style
------------------------------------------------------------------------- */
void PairTDPD::init_style()
{
if (comm->ghost_velocity == 0)
error->all(FLERR,"Pair tdpd requires ghost atoms store velocity");
// if newton off, forces between atoms ij will be double computed
// using different random numbers
if (force->newton_pair == 0 && comm->me == 0) error->warning(FLERR,
"Pair tdpd needs newton pair on for momentum conservation");
neighbor->request(this,instance_me);
}
/* ----------------------------------------------------------------------
init for one type pair i,j and corresponding j,i
------------------------------------------------------------------------- */
double PairTDPD::init_one(int i, int j)
{
if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set");
sigma[i][j] = sqrt(2.0*force->boltz*temperature*gamma[i][j]);
cut[j][i] = cut[i][j];
cutcc[j][i] = cutcc[i][j];
a0[j][i] = a0[i][j];
gamma[j][i] = gamma[i][j];
sigma[j][i] = sigma[i][j];
power[j][i] = power[i][j];
for(int k=0; k<cc_species; k++) {
kappa[j][i][k] = kappa[i][j][k];
epsilon[j][i][k] = epsilon[i][j][k];
powercc[j][i][k] = powercc[i][j][k];
}
return cut[i][j];
}
/* ----------------------------------------------------------------------
proc 0 writes to restart file
------------------------------------------------------------------------- */
void PairTDPD::write_restart(FILE *fp)
{
write_restart_settings(fp);
for (int i = 1; i <= atom->ntypes; i++)
for (int j = i; j <= atom->ntypes; j++) {
fwrite(&setflag[i][j],sizeof(int),1,fp);
if (setflag[i][j]) {
fwrite(&a0[i][j],sizeof(double),1,fp);
fwrite(&gamma[i][j],sizeof(double),1,fp);
fwrite(&power[i][j],sizeof(double),1,fp);
fwrite(&cut[i][j],sizeof(double),1,fp);
fwrite(&cutcc[i][j],sizeof(double),1,fp);
for(int k=0; k<cc_species; k++) {
fwrite(&kappa[i][j][k],sizeof(double),1,fp);
fwrite(&epsilon[i][j][k],sizeof(double),1,fp);
fwrite(&powercc[i][j][k],sizeof(double),1,fp);
}
}
}
}
/* ----------------------------------------------------------------------
proc 0 reads from restart file, bcasts
------------------------------------------------------------------------- */
void PairTDPD::read_restart(FILE *fp)
{
read_restart_settings(fp);
allocate();
int me = comm->me;
for (int i = 1; i <= atom->ntypes; i++)
for (int j = i; j <= atom->ntypes; j++) {
if (me == 0) fread(&setflag[i][j],sizeof(int),1,fp);
MPI_Bcast(&setflag[i][j],1,MPI_INT,0,world);
if (setflag[i][j]) {
if (me == 0) {
fread(&a0[i][j],sizeof(double),1,fp);
fread(&gamma[i][j],sizeof(double),1,fp);
fread(&power[i][j],sizeof(double),1,fp);
fread(&cut[i][j],sizeof(double),1,fp);
fread(&cutcc[i][j],sizeof(double),1,fp);
for(int k=0; k<cc_species; k++) {
fread(&kappa[i][j][k],sizeof(double),1,fp);
fread(&epsilon[i][j][k],sizeof(double),1,fp);
fread(&powercc[i][j][k],sizeof(double),1,fp);
}
}
MPI_Bcast(&a0[i][j],1,MPI_DOUBLE,0,world);
MPI_Bcast(&gamma[i][j],1,MPI_DOUBLE,0,world);
MPI_Bcast(&power[i][j],1,MPI_DOUBLE,0,world);
MPI_Bcast(&cut[i][j],1,MPI_DOUBLE,0,world);
MPI_Bcast(&cutcc[i][j],1,MPI_DOUBLE,0,world);
for(int k=0; k<cc_species; k++) {
MPI_Bcast(&kappa[i][j][k],1,MPI_DOUBLE,0,world);
MPI_Bcast(&epsilon[i][j][k],1,MPI_DOUBLE,0,world);
MPI_Bcast(&powercc[i][j][k],1,MPI_DOUBLE,0,world);
}
}
}
}
/* ----------------------------------------------------------------------
proc 0 writes to restart file
------------------------------------------------------------------------- */
void PairTDPD::write_restart_settings(FILE *fp)
{
fwrite(&temperature,sizeof(double),1,fp);
fwrite(&cut_global,sizeof(double),1,fp);
fwrite(&seed,sizeof(int),1,fp);
fwrite(&mix_flag,sizeof(int),1,fp);
}
/* ----------------------------------------------------------------------
proc 0 reads from restart file, bcasts
------------------------------------------------------------------------- */
void PairTDPD::read_restart_settings(FILE *fp)
{
if (comm->me == 0) {
fread(&temperature,sizeof(double),1,fp);
fread(&cut_global,sizeof(double),1,fp);
fread(&seed,sizeof(int),1,fp);
fread(&mix_flag,sizeof(int),1,fp);
}
MPI_Bcast(&temperature,1,MPI_DOUBLE,0,world);
MPI_Bcast(&cut_global,1,MPI_DOUBLE,0,world);
MPI_Bcast(&seed,1,MPI_INT,0,world);
MPI_Bcast(&mix_flag,1,MPI_INT,0,world);
// initialize Marsaglia RNG with processor-unique seed
// same seed that pair_style command initially specified
if (random) delete random;
random = new RanMars(lmp,seed + comm->me);
}
/* ---------------------------------------------------------------------- */
double PairTDPD::single(int i, int j, int itype, int jtype, double rsq,
double factor_coul, double factor_dpd, double &fforce)
{
double r,rinv,wc,phi;
r = sqrt(rsq);
if (r < EPSILON) {
fforce = 0.0;
return 0.0;
}
rinv = 1.0/r;
wc = 1.0 - r/cut[itype][jtype];
fforce = a0[itype][jtype]*wc*factor_dpd*rinv;
phi = 0.5*a0[itype][jtype]*cut[itype][jtype]*wc*wc;
return factor_dpd*phi;
}

81
src/USER-MESO/pair_tdpd.h Normal file
View File

@ -0,0 +1,81 @@
/* -*- 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 PAIR_CLASS
PairStyle(tdpd,PairTDPD)
#else
#ifndef LMP_PAIR_TDPD_H
#define LMP_PAIR_TDPD_H
#include "pair.h"
namespace LAMMPS_NS {
class PairTDPD : public Pair {
public:
PairTDPD(class LAMMPS *);
virtual ~PairTDPD();
virtual void compute(int, int);
virtual void settings(int, char **);
virtual void coeff(int, char **);
void init_style();
double init_one(int, int);
virtual void write_restart(FILE *);
virtual void read_restart(FILE *);
virtual void write_restart_settings(FILE *);
virtual void read_restart_settings(FILE *);
double single(int, int, int, int, double, double, double, double &);
protected:
double cut_global,temperature;
int seed,cc_species;
double **cut,**cutcc;
double **a0,**gamma,**sigma;
double **power;
double ***kappa,***epsilon;
double ***powercc;
class RanMars *random;
void allocate();
};
}
#endif
#endif
/* ERROR/WARNING messages:
E: Illegal ... command
Self-explanatory. Check the input script syntax and compare to the
documentation for the command. You can use -echo screen as a
command-line option when running LAMMPS to see the offending line.
E: Incorrect args for pair coefficients
Self-explanatory. Check the input script or data file.
W: Pair tdpd needs newton pair on for momentum conservation
Self-explanatory.
E: All pair coeffs are not set
All pair coefficients must be set in the data file or by the
pair_coeff command before running a simulation.
*/

View File

@ -105,6 +105,11 @@ Atom::Atom(LAMMPS *lmp) : Pointers(lmp)
dpdTheta = NULL; dpdTheta = NULL;
ssaAIR = NULL; ssaAIR = NULL;
// USER-MESO
cc = cc_flux = NULL;
edpd_temp = edpd_flux = edpd_cv = NULL;
// USER-SMD // USER-SMD
contact_radius = NULL; contact_radius = NULL;
@ -169,7 +174,7 @@ Atom::Atom(LAMMPS *lmp) : Pointers(lmp)
cs_flag = csforce_flag = vforce_flag = etag_flag = 0; cs_flag = csforce_flag = vforce_flag = etag_flag = 0;
rho_flag = e_flag = cv_flag = vest_flag = 0; rho_flag = e_flag = cv_flag = vest_flag = 0;
dpd_flag = 0; dpd_flag = edpd_flag = tdpd_flag = 0;
// USER-SMD // USER-SMD
@ -302,6 +307,12 @@ Atom::~Atom()
memory->destroy(duChem); memory->destroy(duChem);
memory->destroy(ssaAIR); memory->destroy(ssaAIR);
memory->destroy(cc);
memory->destroy(cc_flux);
memory->destroy(edpd_temp);
memory->destroy(edpd_flux);
memory->destroy(edpd_cv);
memory->destroy(nspecial); memory->destroy(nspecial);
memory->destroy(special); memory->destroy(special);
@ -2194,6 +2205,7 @@ void *Atom::extract(char *name)
if (strcmp(name, "damage") == 0) return (void *) damage; if (strcmp(name, "damage") == 0) return (void *) damage;
if (strcmp(name,"dpdTheta") == 0) return (void *) dpdTheta; if (strcmp(name,"dpdTheta") == 0) return (void *) dpdTheta;
if (strcmp(name,"edpd_temp") == 0) return (void *) edpd_temp;
return NULL; return NULL;
} }

View File

@ -95,6 +95,13 @@ class Atom : protected Pointers {
int nspecies_dpd; int nspecies_dpd;
int *ssaAIR; // Shardlow Splitting Algorithm Active Interaction Region number int *ssaAIR; // Shardlow Splitting Algorithm Active Interaction Region number
// USER-MESO package
double **cc, **cc_flux; // cc = chemical concentration
double *edpd_temp,*edpd_flux; // temperature and heat flux
double *edpd_cv; // heat capacity
int cc_species;
// molecular info // molecular info
int **nspecial; // 0,1,2 = cumulative # of 1-2,1-3,1-4 neighs int **nspecial; // 0,1,2 = cumulative # of 1-2,1-3,1-4 neighs
@ -138,7 +145,7 @@ class Atom : protected Pointers {
int vfrac_flag,spin_flag,eradius_flag,ervel_flag,erforce_flag; int vfrac_flag,spin_flag,eradius_flag,ervel_flag,erforce_flag;
int cs_flag,csforce_flag,vforce_flag,ervelforce_flag,etag_flag; int cs_flag,csforce_flag,vforce_flag,ervelforce_flag,etag_flag;
int rho_flag,e_flag,cv_flag,vest_flag; int rho_flag,e_flag,cv_flag,vest_flag;
int dpd_flag; int dpd_flag,edpd_flag,tdpd_flag;
// USER-SMD package // USER-SMD package

View File

@ -41,11 +41,12 @@ using namespace LAMMPS_NS;
using namespace MathConst; using namespace MathConst;
enum{ATOM_SELECT,MOL_SELECT,TYPE_SELECT,GROUP_SELECT,REGION_SELECT}; enum{ATOM_SELECT,MOL_SELECT,TYPE_SELECT,GROUP_SELECT,REGION_SELECT};
enum{TYPE,TYPE_FRACTION,MOLECULE,X,Y,Z,CHARGE,MASS,SHAPE,LENGTH,TRI, enum{TYPE,TYPE_FRACTION,MOLECULE,X,Y,Z,CHARGE,MASS,SHAPE,LENGTH,TRI,
DIPOLE,DIPOLE_RANDOM,QUAT,QUAT_RANDOM,THETA,THETA_RANDOM,ANGMOM,OMEGA, DIPOLE,DIPOLE_RANDOM,QUAT,QUAT_RANDOM,THETA,THETA_RANDOM,ANGMOM,OMEGA,
DIAMETER,DENSITY,VOLUME,IMAGE,BOND,ANGLE,DIHEDRAL,IMPROPER, DIAMETER,DENSITY,VOLUME,IMAGE,BOND,ANGLE,DIHEDRAL,IMPROPER,
MESO_E,MESO_CV,MESO_RHO,SMD_MASS_DENSITY,SMD_CONTACT_RADIUS,DPDTHETA, MESO_E,MESO_CV,MESO_RHO,EDPD_TEMP,EDPD_CV,CC,SMD_MASS_DENSITY,
INAME,DNAME}; SMD_CONTACT_RADIUS,DPDTHETA,INAME,DNAME};
#define BIG INT_MAX #define BIG INT_MAX
@ -419,6 +420,46 @@ void Set::command(int narg, char **arg)
set(MESO_RHO); set(MESO_RHO);
iarg += 2; iarg += 2;
} else if (strcmp(arg[iarg],"edpd/temp") == 0) {
if (iarg+2 > narg) error->all(FLERR,"Illegal set command");
if (strcmp(arg[iarg+1],"NULL") == 0) dvalue = -1.0;
else if (strstr(arg[iarg+1],"v_") == arg[iarg+1]) varparse(arg[iarg+1],1);
else {
dvalue = force->numeric(FLERR,arg[iarg+1]);
if (dvalue < 0.0) error->all(FLERR,"Illegal set command");
}
if (!atom->edpd_flag)
error->all(FLERR,"Cannot set edpd/temp for this atom style");
set(EDPD_TEMP);
iarg += 2;
} else if (strcmp(arg[iarg],"edpd/cv") == 0) {
if (iarg+2 > narg) error->all(FLERR,"Illegal set command");
if (strcmp(arg[iarg+1],"NULL") == 0) dvalue = -1.0;
else if (strstr(arg[iarg+1],"v_") == arg[iarg+1]) varparse(arg[iarg+1],1);
else {
dvalue = force->numeric(FLERR,arg[iarg+1]);
if (dvalue < 0.0) error->all(FLERR,"Illegal set command");
}
if (!atom->edpd_flag)
error->all(FLERR,"Cannot set edpd/cv for this atom style");
set(EDPD_CV);
iarg += 2;
} else if (strcmp(arg[iarg],"cc") == 0) {
if (iarg+3 > narg) error->all(FLERR,"Illegal set command");
if (strcmp(arg[iarg+1],"NULL") == 0) dvalue = -1.0;
else if (strstr(arg[iarg+1],"v_") == arg[iarg+1]) varparse(arg[iarg+1],1);
else {
cc_index = force->inumeric(FLERR,arg[iarg+1]);
dvalue = force->numeric(FLERR,arg[iarg+2]);
if (cc_index < 1) error->all(FLERR,"Illegal set command");
}
if (!atom->tdpd_flag)
error->all(FLERR,"Cannot set cc for this atom style");
set(CC);
iarg += 3;
} else if (strcmp(arg[iarg],"smd/mass/density") == 0) { } else if (strcmp(arg[iarg],"smd/mass/density") == 0) {
if (iarg+2 > narg) error->all(FLERR,"Illegal set command"); if (iarg+2 > narg) error->all(FLERR,"Illegal set command");
if (strstr(arg[iarg+1],"v_") == arg[iarg+1]) varparse(arg[iarg+1],1); if (strstr(arg[iarg+1],"v_") == arg[iarg+1]) varparse(arg[iarg+1],1);
@ -476,14 +517,28 @@ void Set::command(int narg, char **arg)
} else error->all(FLERR,"Illegal set command"); } else error->all(FLERR,"Illegal set command");
// statistics // statistics
// for CC option, include species index
MPI_Allreduce(&count,&allcount,1,MPI_INT,MPI_SUM,world); MPI_Allreduce(&count,&allcount,1,MPI_INT,MPI_SUM,world);
if (comm->me == 0) { if (comm->me == 0) {
if (screen) fprintf(screen," %d settings made for %s\n",
allcount,arg[origarg]); if (screen) {
if (logfile) fprintf(logfile," %d settings made for %s\n", if (strcmp(arg[origarg],"cc") == 0)
allcount,arg[origarg]); fprintf(screen," %d settings made for %s index %s\n",
allcount,arg[origarg],arg[origarg+1]);
else
fprintf(screen," %d settings made for %s\n",
allcount,arg[origarg]);
}
if (logfile) {
if (strcmp(arg[origarg],"cc") == 0)
fprintf(logfile," %d settings made for %s index %s\n",
allcount,arg[origarg],arg[origarg+1]);
else
fprintf(logfile," %d settings made for %s\n",
allcount,arg[origarg]);
}
} }
} }
@ -663,6 +718,11 @@ void Set::set(int keyword)
else if (keyword == MESO_E) atom->e[i] = dvalue; else if (keyword == MESO_E) atom->e[i] = dvalue;
else if (keyword == MESO_CV) atom->cv[i] = dvalue; else if (keyword == MESO_CV) atom->cv[i] = dvalue;
else if (keyword == MESO_RHO) atom->rho[i] = dvalue; else if (keyword == MESO_RHO) atom->rho[i] = dvalue;
else if (keyword == EDPD_TEMP) atom->edpd_temp[i] = dvalue;
else if (keyword == EDPD_CV) atom->edpd_cv[i] = dvalue;
else if (keyword == CC) atom->cc[i][cc_index-1] = dvalue;
else if (keyword == SMD_MASS_DENSITY) { else if (keyword == SMD_MASS_DENSITY) {
// set mass from volume and supplied mass density // set mass from volume and supplied mass density
atom->rmass[i] = atom->vfrac[i] * dvalue; atom->rmass[i] = atom->vfrac[i] * dvalue;

View File

@ -35,6 +35,7 @@ class Set : protected Pointers {
int style,ivalue,newtype,count,index_custom; int style,ivalue,newtype,count,index_custom;
int ximage,yimage,zimage,ximageflag,yimageflag,zimageflag; int ximage,yimage,zimage,ximageflag,yimageflag,zimageflag;
double dvalue,xvalue,yvalue,zvalue,wvalue,fraction; double dvalue,xvalue,yvalue,zvalue,wvalue,fraction;
int cc_index;
int varflag,varflag1,varflag2,varflag3,varflag4; int varflag,varflag1,varflag2,varflag3,varflag4;
int ivar1,ivar2,ivar3,ivar4; int ivar1,ivar2,ivar3,ivar4;