From b3d2fb91bb6c959c4c6e045ac95afc3013b7ca76 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Thu, 6 Oct 2016 15:47:41 -0600 Subject: [PATCH] new fix wall/gran/region command, REBO bug fix, new example log files --- doc/src/JPG/gran_funnel.png | Bin 0 -> 119645 bytes doc/src/JPG/gran_funnel_small.jpg | Bin 0 -> 2266 bytes doc/src/JPG/gran_mixer.png | Bin 0 -> 229532 bytes doc/src/JPG/gran_mixer_small.jpg | Bin 0 -> 3053 bytes doc/src/Manual.txt | 4 +- doc/src/Section_commands.txt | 1 + doc/src/fix_wall_gran.txt | 4 +- doc/src/fix_wall_gran_region.txt | 199 ++++++ examples/README | 1 + examples/granregion/in.granregion.box | 66 ++ examples/granregion/in.granregion.funnel | 157 +++++ examples/granregion/in.granregion.mixer | 96 +++ .../log.6Oct16.granregion.box.g++.1 | 468 ++++++++++++++ .../log.6Oct16.granregion.box.g++.4 | 468 ++++++++++++++ .../log.6Oct16.granregion.funnel.g++.1 | 608 +++++++++++++++++ .../log.6Oct16.granregion.funnel.g++.4 | 608 +++++++++++++++++ .../log.6Oct16.granregion.mixer.g++.1 | 609 ++++++++++++++++++ .../log.6Oct16.granregion.mixer.g++.4 | 609 ++++++++++++++++++ src/GRANULAR/fix_wall_gran.cpp | 601 ++++++++++++----- src/GRANULAR/fix_wall_gran.h | 72 ++- src/GRANULAR/fix_wall_gran_region.cpp | 548 ++++++++++++++++ src/GRANULAR/fix_wall_gran_region.h | 106 +++ src/KOKKOS/atom_kokkos.cpp | 7 + src/KOKKOS/fix_deform_kokkos.cpp | 1 + src/KOKKOS/fix_langevin_kokkos.cpp | 1 + src/KOKKOS/fix_nh_kokkos.cpp | 1 + src/KOKKOS/fix_nph_kokkos.cpp | 1 + src/KOKKOS/fix_npt_kokkos.cpp | 1 + src/KOKKOS/fix_nve_kokkos.cpp | 1 + src/KOKKOS/fix_nvt_kokkos.cpp | 1 + src/KOKKOS/fix_qeq_reax_kokkos.cpp | 1 + src/KOKKOS/fix_setforce_kokkos.cpp | 1 + src/KOKKOS/fix_wall_reflect_kokkos.cpp | 1 + src/KOKKOS/kokkos.cpp | 2 + src/KOKKOS/kokkos.h | 1 + src/KOKKOS/modify_kokkos.cpp | 75 +++ src/KOKKOS/neighbor_kokkos.cpp | 10 + src/KOKKOS/verlet_kokkos.cpp | 58 +- src/MANYBODY/pair_airebo.cpp | 12 +- src/MANYBODY/pair_airebo.h | 2 + src/MANYBODY/pair_rebo.cpp | 5 + src/accelerator_kokkos.h | 2 + src/fix.cpp | 1 + src/fix.h | 1 + src/region.cpp | 180 +++++- src/region.h | 50 +- src/region_block.cpp | 242 ++++++- src/region_block.h | 5 + src/region_cone.cpp | 207 +++--- src/region_cone.h | 4 - src/region_cylinder.cpp | 375 +++++++++-- src/region_cylinder.h | 2 + src/region_intersect.cpp | 71 +- src/region_intersect.h | 6 +- src/region_plane.cpp | 6 +- src/region_prism.cpp | 143 ++-- src/region_prism.h | 6 - src/region_sphere.cpp | 46 ++ src/region_sphere.h | 3 + src/region_union.cpp | 74 ++- src/region_union.h | 6 +- src/special.cpp | 5 + src/version.h | 2 +- 63 files changed, 6354 insertions(+), 490 deletions(-) create mode 100644 doc/src/JPG/gran_funnel.png create mode 100644 doc/src/JPG/gran_funnel_small.jpg create mode 100644 doc/src/JPG/gran_mixer.png create mode 100644 doc/src/JPG/gran_mixer_small.jpg create mode 100644 doc/src/fix_wall_gran_region.txt create mode 100644 examples/granregion/in.granregion.box create mode 100644 examples/granregion/in.granregion.funnel create mode 100644 examples/granregion/in.granregion.mixer create mode 100644 examples/granregion/log.6Oct16.granregion.box.g++.1 create mode 100644 examples/granregion/log.6Oct16.granregion.box.g++.4 create mode 100644 examples/granregion/log.6Oct16.granregion.funnel.g++.1 create mode 100644 examples/granregion/log.6Oct16.granregion.funnel.g++.4 create mode 100644 examples/granregion/log.6Oct16.granregion.mixer.g++.1 create mode 100644 examples/granregion/log.6Oct16.granregion.mixer.g++.4 create mode 100644 src/GRANULAR/fix_wall_gran_region.cpp create mode 100644 src/GRANULAR/fix_wall_gran_region.h diff --git a/doc/src/JPG/gran_funnel.png b/doc/src/JPG/gran_funnel.png new file mode 100644 index 0000000000000000000000000000000000000000..8e26005f7838825773e7e352f4a844d31a578cc3 GIT binary patch literal 119645 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 DhBU~+ literal 0 HcmV?d00001 diff --git a/doc/src/JPG/gran_funnel_small.jpg b/doc/src/JPG/gran_funnel_small.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6e298033884409151f12b8439e8dd49539391294 GIT binary patch literal 2266 zcmcIjdoSu= zeg#UwAWc9_0R&b62|EB700P9sz#!m1fJllqUb4kKnw&H69+>?KKS1$AThAG zg2V}kqM4JV(s|9(p5gy&fGU@0nIo_l?*D5*JL1mIQ=&>$(Ez}r{TGM|K@y^nmco}S zMRXvEuTc@Hg1DLD2`8w8lIQsnAs3JlNfJ{4D*%o_`^&Fs{|76l?&-$L@*iW2-bhvp zYCnWDEc=B)+jWW+0(7nD%JE6mv()v1_>bYre;9NX81NsNYBp`WtH|D<*^EzL_lVeb z<|dRR;!+Hm3AuyfwnJAmq?U0KzX(eoTUb%!?eCxGcYjX22brB~7l7lSsdpU+? z#C^IthJh3e%vuD{wNwR|Axc*d;v=bwTgu1H3g}y%II+3Z1X+EiZ)BwLGVaJ{Ia9|Z zjZX?SXku%pfTL72dUrW!u1ksQB4_brmP3kN-SElXK`cMbMYWQV0{I79p%sT(Nqxl2 zd+v8%aGHCm)#PF!K!63Sa?py{wE4mA-~sosg;BP@`%TxoxXByQX*;z^xv$voqQ|Y) zV5!RI;pqGRN{cP!s&p0)Z~C5hTUz()10=0w=G)*CEEBI3c7zH6Owhi6%DA=elY9!k z;=oV^y3}jRVn)BY5!2umE|)?2apRb;dqPs>Ix=Cm9lweA@T&c4PoZS))9bH&Y-KG> z7j@c=Uxd8LEdRXV%Gc7VA4~qtRJO*Ue3mnt;pnpe_a;kUaycI}Kk$gs;XQPmVPjdm z!_!zw4{VAIz_2soJWGag>Yi)_C?h}}- zHg&J?n)=-@{SxzLkr`<2@nsJq7n&ijUsW?moNVY8;E{+J`M_$w0Z7CkF%% zYFMsm7f{v4{QD-7VxtYbD;cVogFU!gjkNnlYv$foyyhk}O0ShYVP#oI1e-u(i z6at84jk*M99EIY$FUT%yvaZJG8WVQn)0p8QT>Me>vt_|9@%a4y=kIq}cpvg(M3!eN zN;{`Z>nG{*uXFigm4!eG%$CUYTi}Kzgz~%acX-^_(EYLf54Xehncu%gS&XRNdR>(F zjy&x^W@q%nBW|(;yp_#EW~scE&W}D5@KxwGg|Ij2Rw@LH+j6w&g zb3qS-x zB(HM`kPrD**MYg$wg=NDR2W8~glt1>wVpC1wAvvU!l3QY8&`~{W`1o*-QuM6p6*8t zj%QZ*4iKJ38Dj5vW_Zoy%;Dap2ddh$_sd_%iGJ=2dm#|QD<$2Ix)ta=)25qKa@jW3 zO3kloAbT+Wa`9O4Vf&(PtXp(UPYnFYPpjT@Ud$@Ob;J+_E3o^~unB>dPu9U~W|B}l zS({fkFHQvP)(QbF@4Wn!?GHA9WI^7y+6faTK5YR`4R7^5(pOC3Lm~Ja$DpC0cP$TZ zhV3rX*oUPV)9z}lX&dkQy7zUuRnf3{B!i~1heowcmuB^lmI63kN7lX9*LsjsWmCTJ zhhY|M$|~!c7sJpn@u8k?)D9EB&Pb22rov`U^@kZWh)oqM4L!b*lRd#e7BB*-zS%V) qeyx3Urf)>YCJ_xkwe5J1%!m7pL|oCk7z;px|Msoq|ME42V}Al}482|e literal 0 HcmV?d00001 diff --git a/doc/src/JPG/gran_mixer.png b/doc/src/JPG/gran_mixer.png new file mode 100644 index 0000000000000000000000000000000000000000..6ea7221241b4b66c870fd065d97ed8e282c9f2c6 GIT binary patch literal 229532 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�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%0DLvT#4_D%MyZ)MmOf07fBm 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
G2BsP{Sybf{DG1w3*_?V@SNXfiMM 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 LAMMPS Users Manual - + @@ -21,7 +21,7 @@

LAMMPS Documentation :c,h3 -5 Oct 2016 version :c,h4 +6 Oct 2016 version :c,h4 Version info: :h4 diff --git a/doc/src/Section_commands.txt b/doc/src/Section_commands.txt index 3a6de833fe..2eef5d1d29 100644 --- a/doc/src/Section_commands.txt +++ b/doc/src/Section_commands.txt @@ -599,6 +599,7 @@ USER-INTEL, k = KOKKOS, o = USER-OMP, t = OPT. "viscous"_fix_viscous.html, "wall/colloid"_fix_wall.html, "wall/gran"_fix_wall_gran.html, +"wall/gran/region"_fix_wall_gran_region.html, "wall/harmonic"_fix_wall.html, "wall/lj1043"_fix_wall.html, "wall/lj126"_fix_wall.html, diff --git a/doc/src/fix_wall_gran.txt b/doc/src/fix_wall_gran.txt index d19f243ad8..f30872186d 100644 --- a/doc/src/fix_wall_gran.txt +++ b/doc/src/fix_wall_gran.txt @@ -163,6 +163,8 @@ Any dimension (xyz) that has a granular wall must be non-periodic. [Related commands:] -"fix move"_fix_move.html, "pair_style granular"_pair_gran.html +"fix move"_fix_move.html, +"fix wall/gran/region"_fix_wall_gran_region.html, +"pair_style granular"_pair_gran.html [Default:] none diff --git a/doc/src/fix_wall_gran_region.txt b/doc/src/fix_wall_gran_region.txt new file mode 100644 index 0000000000..7a5597765e --- /dev/null +++ b/doc/src/fix_wall_gran_region.txt @@ -0,0 +1,199 @@ +"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 wall/gran/region command :h3 + +[Syntax:] + +fix ID group-ID wall/gran/region fstyle Kn Kt gamma_n gamma_t xmu dampflag wallstyle regionID :pre + +ID, group-ID are documented in "fix"_fix.html command :ulb,l +wall/region = style name of this fix command :l +fstyle = style of force interactions between particles and wall :l + possible choices: hooke, hooke/history, hertz/history :pre +Kn = elastic constant for normal particle repulsion (force/distance units or pressure units - see discussion below) :l +Kt = elastic constant for tangential contact (force/distance units or pressure units - see discussion below) :l +gamma_n = damping coefficient for collisions in normal direction (1/time units or 1/time-distance units - see discussion below) :l +gamma_t = damping coefficient for collisions in tangential direction (1/time units or 1/time-distance units - see discussion below) :l +xmu = static yield criterion (unitless value between 0.0 and 1.0e4) :l +dampflag = 0 or 1 if tangential damping force is excluded or included :l +wallstyle = region (see "fix wall/gran"_fix_wall_gran.html for options for other kinds of walls) :l +region-ID = region whose boundary will act as wall :l,ule + +[Examples:] + +fix wall all wall/gran/region hooke/history 1000.0 200.0 200.0 100.0 0.5 1 region myCone :pre + +[Description:] + +Treat the surface of the geometric region defined by the {region-ID} +as a bounding frictional wall which interacts with nearby finite-size +granular particles when they are close enough to touch the wall. See +the "fix wall/region"_fix_wall_region.html and "fix +wall/gran"_fix_wall_gran.html commands for related kinds of walls for +non-granular particles and simpler wall geometries, respectively. + +Here are snapshots of example models using this command. +Corresponding input scripts can be found in examples/granregion. +Click on the images to see a bigger picture. Movies of these +simulations are "here on the Movies +page"_http://lammps.sandia.gov/movies.html#granregion.html of the +LAMMPS web site. + +:image(JPG/gran_funnel_small.jpg,JPG/gran_funnel.png) +:image(JPG/gran_mixer_small.jpg,JPG/gran_mixer.png) + +:line + +The distance between a particle and the region boundary is the +distance to the nearest point on the region surface. The force the +wall exerts on the particle is along the direction between that point +and the particle center, which is the direction normal to the surface +at that point. Note that if the region surface is comprised of +multiple "faces", then each face can exert a force on the particle if +it is close enough. E.g. for "region_style block"_region.html, a +particle in the interior, near a corner of the block, could feel wall +forces from 1, 2, or 3 faces of the block. + +Regions are defined using the "region"_region.html command. Note that +the region volume can be interior or exterior to the bounding surface, +which will determine in which direction the surface interacts with +particles, i.e. the direction of the surface normal. The exception to +this is if one or more {open} options are specified for the region +command, in which case particles interact with both the interior and +exterior surfaces of regions. + +Regions can either be primitive shapes (block, sphere, cylinder, etc) +or combinations of primitive shapes specified via the {union} or +{intersect} region styles. These latter styles can be used to +construct particle containers with complex shapes. Regions can also +move dynamically via the "region"_region.html command keywords (move) +and {rotate}, or change their shape by use of variables as inputs to +the "region"_region.html command. If such a region is used with this +fix, then the region surface will move in time in the corresponding +manner. + +NOTE: As discussed on the "region"_region.html command doc page, +regions in LAMMPS do not get wrapped across periodic boundaries. It +is up to you to ensure that the region location with respect to +periodic or non-periodic boundaries is specified appropriately via the +"region"_region.html and "boundary"_boundary.html commands when using +a region as a wall that bounds particle motion. + +NOTE: For primitive regions with sharp corners and/or edges (e.g. a +block or cylinder), wall/particle forces are computed accurately for +both interior and exterior regions. For {union} and {intersect} +regions, additional sharp corners and edges may be present due to the +intersection of the surfaces of 2 or more primitive volumes. These +corners and edges can be of two types: concave or convex. Concave +points/edges are like the corners of a cube as seen by particles in +the interior of a cube. Wall/particle forces around these features +are computed correctly. Convex points/edges are like the corners of a +cube as seen by particles exterior to the cube, i.e. the points jut +into the volume where particles are present. LAMMPS does NOT compute +the location of these convex points directly, and hence wall/particle +forces in the cutoff volume around these points suffer from +inaccuracies. The basic problem is that the outward normal of the +surface is not continuous at these points. This can cause particles +to feel no force (they don't "see" the wall) when in one location, +then move a distance epsilon, and suddenly feel a large force because +they now "see" the wall. In a worst-case scenario, this can blow +particles out of the simulation box. Thus, as a general rule you +should not use the fix wall/gran/region command with {union} or +{interesect} regions that have convex points or edges resulting from +the union/intersection (convex points/edges in the union/intersection +due to a single sub-region are still OK). + +NOTE: Similarly, you should not define {union} or {intersert} regions +for use with this command that share an overlapping common face that +is part of the overall outer boundary (interior boundary is OK), even +if the face is smooth. E.g. two regions of style block in a {union} +region, where the two blocks overlap on one or more of their faces. +This is because LAMMPS discards points that are part of multiple +sub-regions when calculating wall/particle interactions, to avoid +double-counting the interaction. Having two coincident faces could +cause the face to become invisible to the particles. The solution is +to make the two faces differ by epsilon in their position. + +The nature of the wall/particle interactions are determined by the +{fstyle} setting. It can be any of the styles defined by the +"pair_style granular"_pair_gran.html commands. Currently this is +{hooke}, {hooke/history}, or {hertz/history}. The equation for the +force between the wall and particles touching it is the same as the +corresponding equation on the "pair_style granular"_pair_gran.html doc +page, but the effective radius is calculated using the radius of the +particle and the radius of curvature of the wall at the contact point. + +Specifically, delta = radius - r = overlap of particle with wall, +m_eff = mass of particle, and RiRj/Ri+Rj is the effective radius, with +Rj replaced by the radius of curvature of the wall at the contact +point. The radius of curvature can be negative for a concave wall +section, e.g. the interior of cylinder. For a flat wall, delta = +radius - r = overlap of particle with wall, m_eff = mass of particle, +and the effective radius of contact is just the radius of the +particle. + +The parameters {Kn}, {Kt}, {gamma_n}, {gamma_t}, {xmu} and {dampflag} +have the same meaning and units as those specified with the +"pair_style granular"_pair_gran.html commands. This means a NULL can +be used for either {Kt} or {gamma_t} as described on that page. If a +NULL is used for {Kt}, then a default value is used where {Kt} = 2/7 +{Kn}. If a NULL is used for {gamma_t}, then a default value is used +where {gamma_t} = 1/2 {gamma_n}. + +Note that you can choose a different force styles and/or different +values for the 6 wall/particle coefficients than for particle/particle +interactions. E.g. if you wish to model the wall as a different +material. + +[Restart, fix_modify, output, run start/stop, minimize info:] + +Similiar to "fix wall/gran"_fix_wall_gran.html command, this fix +writes the shear friction state of atoms interacting with the wall to +"binary restart files"_restart.html, so that a simulation can continue +correctly if granular potentials with shear "history" effects are +being used. This fix also includes info about a moving region in the +restart file. See the "read_restart"_read_restart.html command for +info on how to re-specify a fix in an input script that reads a +restart file, so that the operation of the fix continues in an +uninterrupted fashion. + +Note that info about region definitions is NOT included in restart +files. So you must re-define your region and if it is a moving +region, define its motion attributes in a way that is consistent with +the simulation that wrote the restart file. In particular, if you +want to change its motion attributes (e.g. its velocity), then you +should insure the postition/orientation of the region at the initial +restart timestep is the same as it was on the timestep the restart +file was written. If this is not possible, then you may need to +ignore info in the restart file by defining a new fix wall/gran/region +command in your restart script (e.g. with a different fix ID). + +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 GRANULAR 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:] + +"fix_move"_fix_move.html, +"fix wall/gran"_fix_wall_gran.html, +"fix wall/region"_fix_wall_region.html, +"pair_style granular"_pair_gran.html, +"region"_region.html + +[Default:] none + diff --git a/examples/README b/examples/README index 462fa93e12..a6925878e0 100644 --- a/examples/README +++ b/examples/README @@ -74,6 +74,7 @@ eim: NaCl using the EIM potential ellipse: ellipsoidal particles in spherical solvent, 2d system flow: Couette and Poiseuille flow in a 2d channel friction: frictional contact of spherical asperities between 2d surfaces +granregion: use of fix wall/region/gran as boundary on granular particles hugoniostat: Hugoniostat shock dynamics indent: spherical indenter into a 2d solid kim: use of potentials in Knowledge Base for Interatomic Models (KIM) diff --git a/examples/granregion/in.granregion.box b/examples/granregion/in.granregion.box new file mode 100644 index 0000000000..91f06744d3 --- /dev/null +++ b/examples/granregion/in.granregion.box @@ -0,0 +1,66 @@ +# pouring spheres into container box + +units lj +atom_style sphere +boundary f f f +dimension 3 +comm_modify vel yes + +region box block -10 10 -10 10 -10 10 units box +create_box 2 box + +pair_style hybrid gran/hooke 4000.0 NULL 100.0 NULL 0.5 1 +pair_coeff * * gran/hooke + +region container block -6 6 -6 6 -6 6 units box +fix container all wall/gran/region hooke/history & + 4000.0 NULL 100.0 NULL 0.5 1 region container + +neighbor 0.3 bin +neigh_modify delay 0 every 1 check yes + +fix 2 all nve/sphere +fix 3 all gravity 1.0 vector 0 0 -1 + +region slab block -2 2 -2 2 -2 2 units box +fix ins all pour 100 2 4767548 vol 0.4 10 & + diam one 1.0 region slab ignore + +timestep 0.005 + +compute 1 all temp +compute_modify 1 dynamic yes + +compute 2 all temp/sphere +compute_modify 2 dynamic yes + +thermo 100 +thermo_style custom step atoms temp c_1 c_2 press +thermo_modify lost ignore +compute_modify thermo_temp dynamic yes + +#dump 2 all image 100 image.*.jpg type type & +# zoom 1.4 adiam 1.0 box no 0.0 axes yes 0.9 0.03 +#dump_modify 2 pad 5 + +run 5000 + +region container delete +variable theta equal (step-5000)*(4.0*PI/5000) +region container block -6 6 -6 6 -6 6 units box & + rotate v_theta 0 0 0 0 0 1 +run 5000 + +region container delete +region container block -6 6 -6 6 -6 6 units box +run 5000 + +region container delete +variable theta equal (step-15000)*(4.0*PI/5000) +region container block -6 6 -6 6 -6 6 units box & + rotate v_theta 0 0 0 1 1 1 +run 5000 + +region container delete +region container block -6 6 -6 6 -6 6 units box +run 5000 diff --git a/examples/granregion/in.granregion.funnel b/examples/granregion/in.granregion.funnel new file mode 100644 index 0000000000..63e79a7114 --- /dev/null +++ b/examples/granregion/in.granregion.funnel @@ -0,0 +1,157 @@ +# pour particles into cone-shaped funnel, settle them, let them run out bottom + +variable name string funnel_pour + +thermo_modify flush yes +units si +variable PI equal 3.141592653589 +variable seed equal 14314 + +############################################### +# Geometry-related parameters +############################################### + +variable xlo equal 10 +variable xhi equal 40 +variable ylo equal 10 +variable yhi equal 40 +variable zlo equal -20 +variable zhi equal 50 + +variable xc equal 25 +variable yc equal 25 + +variable zconehi equal 50 +variable zconelo equal 10 +variable zcyllo equal 0 +variable radconelo equal 2 +variable radconehi equal 20 + +################################################ +# Particle sizes +################################################ + +variable rlo equal 0.25 +variable rhi equal 0.5 +variable dlo equal 2.0*${rlo} +variable dhi equal 2.0*${rhi} + +variable skin equal ${rhi} + +############################################### +# Granular contact parameters +############################################### + +variable coeffRes equal 0.1 +variable coeffFric equal 0.5 + +variable density equal 1.0 +variable EYoung equal 10^5 +variable Poisson equal 2.0/7.0 +variable GShear equal ${EYoung}/(2*(1+${Poisson})) + +variable gravity equal 1.0 + +variable reff equal 0.5*(${rhi}+${rlo}) +variable meff equal ${density}*4.0/3.0*${PI}*${reff}^3 +variable min_mass equal ${density}*4.0/3.0*${PI}*${rlo}*${rlo}*${rlo} +variable max_mass equal ${density}*4.0/3.0*${PI}*${rhi}*${rhi}*${rhi} + +## Typical way to set kn, kt, etc.: +variable kn equal 4.0*${GShear}/(3*(1-${Poisson})) +variable kt equal 4.0*${GShear}/(2-${Poisson}) + +variable a equal (-2.0*log(${coeffRes})/${PI})^2 +variable gamma_n equal sqrt($a*2*${kn}/${min_mass}/(1+0.25*$a)) +variable gamma_t equal ${gamma_n}*0.5 + +variable tcol equal ${PI}/sqrt(2*${kn}/${min_mass}-${gamma_n}/4.0) + +variable dt equal ${tcol}*0.05 +timestep ${dt} + +############################################### +variable dumpfreq equal 1000 +variable logfreq equal 1000 + +newton off +atom_style sphere + +boundary p p f + +region boxreg block ${xlo} ${xhi} ${ylo} ${yhi} ${zlo} ${zhi} +create_box 1 boxreg + +pair_style gran/hertz/history & + ${kn} ${kt} ${gamma_n} ${gamma_t} ${coeffFric} 1 +pair_coeff * * + +neighbor ${skin} bin +thermo ${logfreq} + +comm_style brick +comm_modify mode multi group all vel yes +balance 1.1 shift xyz 20 1.1 +fix bal all balance 10000 1.1 shift xyz 20 1.01 + +####################### Options specific to pouring ######################### + +# insertion region for fix/pour + +region insreg cylinder z ${xc} ${yc} 10 30 50 side in units box + +# define cone and cylinder regions - see lammps doc on region command +# note new open options + +region cylreg cylinder z ${xc} ${yc} ${radconelo} & + ${zcyllo} ${zconelo} side in units box & + open 2 #Top is open + +region conereg cone z ${xc} ${yc} ${radconelo} ${radconehi} & + ${zconelo} ${zconehi} side in units box & + open 1 open 2 #Bottom and top are open + +region hopreg union 2 conereg cylreg + +fix grav all gravity ${gravity} vector 0 0 -1 +fix 1 all nve/sphere + + +fix hopper3 all wall/gran/region hertz/history & + ${kn} ${kt} ${gamma_n} ${gamma_t} ${coeffFric} 1 region hopreg + +fix ins all pour 2000 1 42424 region insreg & + diam range ${dlo} ${dhi} dens ${density} ${density} + +#dump 1 all custom ${dumpfreq} ${name}.dump & +# id type mass diameter x y z + +#dump 2 all image 4000 image.*.jpg type type & +# axes yes 0.8 0.02 view 60 -30 zoom 3.0 & +# box no 0.0 axes no 0.0 0.0 +#dump_modify 2 pad 6 + +thermo_style custom step cpu atoms ke +thermo_modify flush yes lost warn + +# Initial run to fill up the cone + +run 20000 +unfix ins +run 150000 + +# remove "plug" - need to redefine cylinder region & union + +region cylreg delete +region hopreg delete +region cylreg cylinder z ${xc} ${yc} ${radconelo} & + ${zcyllo} ${zconelo} side in units box & + open 1 open 2 #Bottom & top are open + +region hopreg union 2 cylreg conereg + +unfix hopper3 +fix hopper3 all wall/gran/region hertz/history & + ${kn} ${kt} ${gamma_n} ${gamma_t} ${coeffFric} 1 region hopreg + +run 100000 diff --git a/examples/granregion/in.granregion.mixer b/examples/granregion/in.granregion.mixer new file mode 100644 index 0000000000..f9a9d04cbe --- /dev/null +++ b/examples/granregion/in.granregion.mixer @@ -0,0 +1,96 @@ +variable name string mixer + +thermo_modify flush yes +variable seed equal 14314 + +############################################### +# Particle parameters +################################################ + +variable rlo equal 0.3 +variable rhi equal 0.6 +variable dlo equal 2.0*${rlo} +variable dhi equal 2.0*${rhi} +variable skin equal ${rhi} + +variable coeffRes equal 0.1 +variable coeffFric equal 0.5 + +variable kn equal 10^5 +variable kt equal 0.2*${kn} + +variable gravity equal 1.0 +variable density equal 1.0 + +variable min_mass equal ${density}*4.0/3.0*PI*${rlo}*${rlo}*${rlo} +variable a equal (-2.0*log(${coeffRes})/PI)^2 +variable gamma_n equal sqrt($a*2*${kn}/${min_mass}/(1+0.25*$a)) +variable gamma_t equal ${gamma_n}*0.5 + +variable tcol equal PI/sqrt(2*${kn}/${min_mass}-${gamma_n}/4.0) + +variable dt equal ${tcol}*0.02 +timestep ${dt} + +############################################### + +variable dumpfreq equal 1000 +variable logfreq equal 1000 + +newton on +atom_style sphere + +boundary p p f + +region boxreg block 0 20 0 20 0 20 +create_box 1 boxreg + +pair_style gran/hertz/history & + ${kn} ${kt} ${gamma_n} ${gamma_t} ${coeffFric} 1 +pair_coeff * * + +neighbor ${skin} bin +thermo ${logfreq} + +comm_style brick +comm_modify mode multi group all vel yes +balance 1.1 shift xyz 20 1.1 +fix bal all balance 10000 1.1 shift xyz 20 1.01 + +####################### Options specific to pouring ######################### + +region insreg cylinder z 10 10 8 10 18 side in units box +region cylreg cylinder z 10 10 10 0 20 side in units box + +variable theta equal (step/400000)*2*PI + +region b1 block 2 18 9 11 0 4 side out & + rotate v_theta 10 10 0 0 0 1 units box +region b2 block 9 11 2 18 0 3.99999 side out & + rotate v_theta 10 10 0 0 0 1 units box + +region mixer intersect 3 cylreg b1 b2 side in + +fix grav all gravity ${gravity} vector 0 0 -1 +fix 1 all nve/sphere + +fix mixwall all wall/gran/region hertz/history & + ${kn} ${kt} ${gamma_n} ${gamma_t} ${coeffFric} 1 region mixer + +fix ins all pour 1000 1 42424 region insreg & + diam range ${dlo} ${dhi} dens ${density} ${density} + +#dump 1 all custom ${dumpfreq} ${name}_pour.dump & +# id type mass diameter x y z + +#dump 2 all image 4000 image.*.jpg type type & +# axes yes 0.8 0.02 view 60 -30 zoom 1.5 & +# box no 0.0 axes no 0.0 0.0 +#dump_modify 2 pad 6 + +thermo_style custom step cpu atoms ke v_theta +thermo_modify flush yes lost warn + +run 200000 +unfix ins +run 200000 diff --git a/examples/granregion/log.6Oct16.granregion.box.g++.1 b/examples/granregion/log.6Oct16.granregion.box.g++.1 new file mode 100644 index 0000000000..ae2ec694e9 --- /dev/null +++ b/examples/granregion/log.6Oct16.granregion.box.g++.1 @@ -0,0 +1,468 @@ +LAMMPS (5 Oct 2016) +# pouring spheres into container box + +units lj +atom_style sphere +boundary f f f +dimension 3 +comm_modify vel yes + +region box block -10 10 -10 10 -10 10 units box +create_box 2 box +Created orthogonal box = (-10 -10 -10) to (10 10 10) + 1 by 1 by 1 MPI processor grid + +pair_style hybrid gran/hooke 4000.0 NULL 100.0 NULL 0.5 1 +pair_coeff * * gran/hooke + +region container block -6 6 -6 6 -6 6 units box +fix container all wall/gran/region hooke/history 4000.0 NULL 100.0 NULL 0.5 1 region container + +neighbor 0.3 bin +neigh_modify delay 0 every 1 check yes + +fix 2 all nve/sphere +fix 3 all gravity 1.0 vector 0 0 -1 + +region slab block -2 2 -2 2 -2 2 units box +fix ins all pour 100 2 4767548 vol 0.4 10 diam one 1.0 region slab ignore +Particle insertion: 48 every 566 steps, 100 by step 1133 + +timestep 0.005 + +compute 1 all temp +compute_modify 1 dynamic yes + +compute 2 all temp/sphere +compute_modify 2 dynamic yes + +thermo 100 +thermo_style custom step atoms temp c_1 c_2 press +thermo_modify lost ignore +compute_modify thermo_temp dynamic yes + +#dump 2 all image 100 image.*.jpg type type # zoom 1.4 adiam 1.0 box no 0.0 axes yes 0.9 0.03 +#dump_modify 2 pad 5 + +run 5000 +Neighbor list info ... + 1 neighbor list requests + 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 = 31 31 31 +Memory usage per processor = 0.201172 Mbytes +Step Atoms Temp c_1 c_2 Press + 0 0 0 0 0 0 + 100 21 0.54270729 0.54270729 0.26473526 0.0013567682 + 200 21 0.87606961 0.87606961 0.42735103 0.002190174 + 300 21 1.1428374 1.1428374 0.55748167 0.0028570936 + 400 21 1.3543103 1.3543103 0.66829516 0.0033857758 + 500 21 1.0677786 1.0677786 0.53582407 0.0045048164 + 600 56 0.6744286 0.6744286 0.3502938 0.0047464584 + 700 56 0.75569283 0.75569283 0.39779462 0.0051953882 + 800 56 0.61597505 0.61597505 0.32943642 0.0086022783 + 900 56 0.65260802 0.65260802 0.34474044 0.0059298996 + 1000 56 0.51624952 0.51624952 0.28326898 0.0067827337 + 1100 56 0.46050076 0.46050076 0.25656319 0.0061891094 + 1200 81 0.39112377 0.39112377 0.21690744 0.0086559347 + 1300 81 0.33302801 0.33302801 0.19110222 0.0033381288 + 1400 81 0.39333146 0.39333146 0.21220965 0.0041348597 + 1500 81 0.35493951 0.35493951 0.19924958 0.00373736 + 1600 81 0.34154491 0.34154491 0.19031147 0.005349672 + 1700 100 0.25598828 0.25598828 0.14171498 0.0092236643 + 1800 100 0.2114074 0.2114074 0.12162965 0.0027213483 + 1900 100 0.21810423 0.21810423 0.12176698 0.0036436034 + 2000 100 0.2553198 0.2553198 0.13900087 0.0032844504 + 2100 100 0.24809937 0.24809937 0.13753654 0.0088764373 + 2200 100 0.22455642 0.22455642 0.12500977 0.0043517009 + 2300 100 0.19586874 0.19586874 0.11064996 0.0055178814 + 2400 100 0.059619074 0.059619074 0.045535036 0.00079051539 + 2500 100 0.052222462 0.052222462 0.038563852 0.00098981299 + 2600 100 0.036930777 0.036930777 0.027579114 0.0012285499 + 2700 100 0.027937818 0.027937818 0.020587353 0.00063085447 + 2800 100 0.02103783 0.02103783 0.015469157 0.00050316582 + 2900 100 0.010408128 0.010408128 0.0084894275 0.00035440391 + 3000 100 0.0077664382 0.0077664382 0.0068149074 0.0011153614 + 3100 100 0.0088789208 0.0088789208 0.0070143391 0.00032679783 + 3200 100 0.0077683432 0.0077683432 0.0059711038 0.00044762363 + 3300 100 0.00411 0.00411 0.00372409 0.00015328221 + 3400 100 0.0039192171 0.0039192171 0.0032409072 9.3603399e-05 + 3500 100 0.0023532199 0.0023532199 0.0020924799 0.00049044152 + 3600 100 0.0022544513 0.0022544513 0.0019545724 8.1086108e-05 + 3700 100 0.0012696379 0.0012696379 0.0013134108 5.0058058e-05 + 3800 100 0.0012035225 0.0012035225 0.0012490584 6.0331967e-05 + 3900 100 0.00080361803 0.00080361803 0.00094424552 6.7229227e-05 + 4000 100 0.00060715659 0.00060715659 0.00076521759 6.7029916e-05 + 4100 100 0.00058510487 0.00058510487 0.00073844578 5.5867098e-05 + 4200 100 0.00046832309 0.00046832309 0.00060848748 5.3853715e-05 + 4300 100 0.00045207186 0.00045207186 0.00057825336 4.8367831e-05 + 4400 100 0.00041874845 0.00041874845 0.00053103589 8.666037e-05 + 4500 100 0.00041136295 0.00041136295 0.00052246056 6.0456585e-05 + 4600 100 0.00041021147 0.00041021147 0.0005190668 4.8701604e-05 + 4700 100 0.00037176253 0.00037176253 0.00049156279 5.8874891e-05 + 4800 100 0.0003262417 0.0003262417 0.00045551846 5.0610728e-05 + 4900 100 0.00028093583 0.00028093583 0.00042099654 4.6558605e-05 + 5000 100 0.00027730599 0.00027730599 0.00041664922 4.7053044e-05 +Loop time of 0.081454 on 1 procs for 5000 steps with 100 atoms + +Performance: 26518022.146 tau/day, 61384.311 timesteps/s +99.4% CPU use with 1 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.0085223 | 0.0085223 | 0.0085223 | 0.0 | 10.46 +Neigh | 0.01466 | 0.01466 | 0.01466 | 0.0 | 18.00 +Comm | 0.00076532 | 0.00076532 | 0.00076532 | 0.0 | 0.94 +Output | 0.00052285 | 0.00052285 | 0.00052285 | 0.0 | 0.64 +Modify | 0.05317 | 0.05317 | 0.05317 | 0.0 | 65.28 +Other | | 0.003814 | | | 4.68 + +Nlocal: 100 ave 100 max 100 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 0 ave 0 max 0 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 158 ave 158 max 158 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 158 +Ave neighs/atom = 1.58 +Neighbor list builds = 306 +Dangerous builds = 0 + +region container delete +variable theta equal (step-5000)*(4.0*PI/5000) +region container block -6 6 -6 6 -6 6 units box rotate v_theta 0 0 0 0 0 1 +run 5000 +Memory usage per processor = 5.26337 Mbytes +Step Atoms Temp c_1 c_2 Press + 5000 100 0.00027730599 0.00027730599 0.00041664922 4.705763e-05 + 5100 100 0.60717077 0.60717077 0.33118944 0.010686501 + 5200 100 0.64991179 0.64991179 0.35498767 0.011370453 + 5300 100 0.72038713 0.72038713 0.38745069 0.010507667 + 5400 100 0.81357499 0.81357499 0.42946808 0.012920419 + 5500 100 0.90488411 0.90488411 0.46803321 0.015077428 + 5600 100 0.99065617 0.99065617 0.50811954 0.015556572 + 5700 100 1.0701203 1.0701203 0.54641187 0.016464366 + 5800 100 1.1351242 1.1351242 0.57607707 0.017832476 + 5900 100 1.1883602 1.1883602 0.60022389 0.019571838 + 6000 100 1.2153421 1.2153421 0.61245652 0.020549414 + 6100 100 1.2369293 1.2369293 0.62229634 0.01827529 + 6200 100 1.2556883 1.2556883 0.63207905 0.020286322 + 6300 100 1.2618555 1.2618555 0.63610311 0.019844583 + 6400 100 1.2671678 1.2671678 0.63873131 0.019817249 + 6500 100 1.2875312 1.2875312 0.64728693 0.020097362 + 6600 100 1.3014055 1.3014055 0.65413071 0.020000886 + 6700 100 1.2904021 1.2904021 0.6485358 0.020009625 + 6800 100 1.2962767 1.2962767 0.65088367 0.021340143 + 6900 100 1.3056081 1.3056081 0.65490644 0.020455771 + 7000 100 1.3116731 1.3116731 0.65766216 0.020475061 + 7100 100 1.319457 1.319457 0.66105016 0.020937651 + 7200 100 1.3213585 1.3213585 0.66207982 0.02120792 + 7300 100 1.3232411 1.3232411 0.66392391 0.021040683 + 7400 100 1.3300163 1.3300163 0.66599805 0.021202273 + 7500 100 1.3350122 1.3350122 0.66894534 0.021161833 + 7600 100 1.3344633 1.3344633 0.6688403 0.020871936 + 7700 100 1.3492825 1.3492825 0.6751371 0.021415859 + 7800 100 1.3539647 1.3539647 0.67757279 0.021306442 + 7900 100 1.3527157 1.3527157 0.67722774 0.021793531 + 8000 100 1.3526931 1.3526931 0.67713399 0.022973395 + 8100 100 1.3568279 1.3568279 0.67936578 0.021422428 + 8200 100 1.3599258 1.3599258 0.68113142 0.021397012 + 8300 100 1.3601893 1.3601893 0.68165656 0.021643375 + 8400 100 1.3752164 1.3752164 0.68788213 0.022208765 + 8500 100 1.3821458 1.3821458 0.69165274 0.022015877 + 8600 100 1.3784691 1.3784691 0.68964478 0.022144188 + 8700 100 1.3801422 1.3801422 0.6904093 0.0220402 + 8800 100 1.3900051 1.3900051 0.6947875 0.02216362 + 8900 100 1.3897902 1.3897902 0.69427134 0.023078569 + 9000 100 1.3909918 1.3909918 0.69456955 0.022043699 + 9100 100 1.3925028 1.3925028 0.69519141 0.022180156 + 9200 100 1.3923277 1.3923277 0.69512657 0.022113729 + 9300 100 1.3945193 1.3945193 0.69625374 0.022344694 + 9400 100 1.3960782 1.3960782 0.69705144 0.022181158 + 9500 100 1.3932407 1.3932407 0.69560365 0.022129998 + 9600 100 1.3925489 1.3925489 0.69532399 0.022124653 + 9700 100 1.3935299 1.3935299 0.69581607 0.022258368 + 9800 100 1.3933949 1.3933949 0.69579137 0.022209028 + 9900 100 1.3934712 1.3934712 0.69587898 0.022214942 + 10000 100 1.3935828 1.3935828 0.69598655 0.022231414 +Loop time of 0.261407 on 1 procs for 5000 steps with 100 atoms + +Performance: 8262972.563 tau/day, 19127.251 timesteps/s +99.8% CPU use with 1 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.042233 | 0.042233 | 0.042233 | 0.0 | 16.16 +Neigh | 0.035131 | 0.035131 | 0.035131 | 0.0 | 13.44 +Comm | 0.0010462 | 0.0010462 | 0.0010462 | 0.0 | 0.40 +Output | 0.00051785 | 0.00051785 | 0.00051785 | 0.0 | 0.20 +Modify | 0.17687 | 0.17687 | 0.17687 | 0.0 | 67.66 +Other | | 0.00561 | | | 2.15 + +Nlocal: 100 ave 100 max 100 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 0 ave 0 max 0 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 187 ave 187 max 187 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 187 +Ave neighs/atom = 1.87 +Neighbor list builds = 634 +Dangerous builds = 0 + +region container delete +region container block -6 6 -6 6 -6 6 units box +run 5000 +Memory usage per processor = 5.26337 Mbytes +Step Atoms Temp c_1 c_2 Press + 10000 100 1.3935828 1.3935828 0.69598655 0.02230659 + 10100 100 0.3402861 0.3402861 0.19584226 0.014767914 + 10200 100 0.19064555 0.19064555 0.12536788 0.0025413789 + 10300 100 0.13281358 0.13281358 0.10275768 0.002843208 + 10400 100 0.10124671 0.10124671 0.077914135 0.0017745353 + 10500 100 0.082636734 0.082636734 0.063857622 0.001419336 + 10600 100 0.066744462 0.066744462 0.051927437 0.0010830674 + 10700 100 0.060778462 0.060778462 0.047461784 0.0011418844 + 10800 100 0.043437178 0.043437178 0.032805669 0.0017050393 + 10900 100 0.036483219 0.036483219 0.027387805 0.00086936813 + 11000 100 0.027639076 0.027639076 0.021221241 0.00054920607 + 11100 100 0.023614696 0.023614696 0.018445634 0.00058724552 + 11200 100 0.020103248 0.020103248 0.015933089 0.00072830275 + 11300 100 0.018645345 0.018645345 0.014559759 0.0002319388 + 11400 100 0.015499672 0.015499672 0.01248828 0.00036020862 + 11500 100 0.013421296 0.013421296 0.010743248 0.00043093929 + 11600 100 0.011214892 0.011214892 0.0089653924 0.00059789544 + 11700 100 0.0086660806 0.0086660806 0.0070563902 0.00029684573 + 11800 100 0.0064777244 0.0064777244 0.0052946156 0.00046466386 + 11900 100 0.0059360881 0.0059360881 0.0048568813 8.361561e-05 + 12000 100 0.0045341025 0.0045341025 0.003883229 0.00016408047 + 12100 100 0.0042504415 0.0042504415 0.0036944958 6.5005147e-05 + 12200 100 0.0041367637 0.0041367637 0.0035928232 7.3025698e-05 + 12300 100 0.0037700129 0.0037700129 0.003283398 6.381318e-05 + 12400 100 0.0033494476 0.0033494476 0.0029274495 4.7731105e-05 + 12500 100 0.0030903175 0.0030903175 0.0027068073 6.797313e-05 + 12600 100 0.0026406999 0.0026406999 0.0023315387 0.0002371331 + 12700 100 0.0025020713 0.0025020713 0.0022367855 4.2787276e-05 + 12800 100 0.0022977381 0.0022977381 0.0020778307 3.9744567e-05 + 12900 100 0.002039634 0.002039634 0.0018862012 0.00011669223 + 13000 100 0.0018044702 0.0018044702 0.00171399 0.00013835538 + 13100 100 0.0016600965 0.0016600965 0.0015553191 3.2320019e-05 + 13200 100 0.0015596204 0.0015596204 0.001486374 1.9246911e-05 + 13300 100 0.001316505 0.001316505 0.0012105249 9.1469679e-05 + 13400 100 0.0012517536 0.0012517536 0.0011525753 4.815292e-05 + 13500 100 0.0010827608 0.0010827608 0.001038339 2.0913017e-05 + 13600 100 0.0009863908 0.0009863908 0.00095924929 9.7716736e-05 + 13700 100 0.00094543599 0.00094543599 0.00092425645 1.378887e-05 + 13800 100 0.00087893271 0.00087893271 0.00086801608 1.8981177e-05 + 13900 100 0.00080241572 0.00080241572 0.0007930026 5.0987122e-05 + 14000 100 0.00070705631 0.00070705631 0.00069238137 1.2900066e-05 + 14100 100 0.0006525032 0.0006525032 0.000637991 0.00010838464 + 14200 100 0.00059338444 0.00059338444 0.00057560454 7.3431324e-06 + 14300 100 0.00058641228 0.00058641228 0.00056944735 7.256852e-06 + 14400 100 0.00056221112 0.00056221112 0.00054625666 8.1343426e-06 + 14500 100 0.00055493127 0.00055493127 0.00053957583 1.1713058e-05 + 14600 100 0.00052854921 0.00052854921 0.00051816618 8.6527225e-06 + 14700 100 0.00052630581 0.00052630581 0.00051584277 6.4890475e-06 + 14800 100 0.00052563819 0.00052563819 0.00051493123 1.2687153e-05 + 14900 100 0.00052131364 0.00052131364 0.00050917244 7.4589995e-08 + 15000 100 0.00051902191 0.00051902191 0.00050725364 6.4228962e-06 +Loop time of 0.0895741 on 1 procs for 5000 steps with 100 atoms + +Performance: 24114113.723 tau/day, 55819.708 timesteps/s +99.3% CPU use with 1 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.0098987 | 0.0098987 | 0.0098987 | 0.0 | 11.05 +Neigh | 0.0061045 | 0.0061045 | 0.0061045 | 0.0 | 6.81 +Comm | 0.00069976 | 0.00069976 | 0.00069976 | 0.0 | 0.78 +Output | 0.00049758 | 0.00049758 | 0.00049758 | 0.0 | 0.56 +Modify | 0.068435 | 0.068435 | 0.068435 | 0.0 | 76.40 +Other | | 0.003939 | | | 4.40 + +Nlocal: 100 ave 100 max 100 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 0 ave 0 max 0 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 160 ave 160 max 160 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 160 +Ave neighs/atom = 1.6 +Neighbor list builds = 111 +Dangerous builds = 0 + +region container delete +variable theta equal (step-15000)*(4.0*PI/5000) +region container block -6 6 -6 6 -6 6 units box rotate v_theta 0 0 0 1 1 1 +run 5000 +Memory usage per processor = 5.26337 Mbytes +Step Atoms Temp c_1 c_2 Press + 15000 100 0.00051902191 0.00051902191 0.00050725364 6.4228962e-06 + 15100 100 1.1235353 1.1235353 0.72003773 0.013686681 + 15200 100 1.0778556 1.0778556 0.69137925 0.013478363 + 15300 100 1.069015 1.069015 0.69798184 0.014165255 + 15400 100 1.2249943 1.2249943 0.79096059 0.020933395 + 15500 100 1.5225664 1.5225664 0.94822282 0.023932611 + 15600 100 1.5867194 1.5867194 0.98143504 0.024565132 + 15700 100 1.6595267 1.6595267 1.0203985 0.025152432 + 15800 100 1.8188027 1.8188027 1.0857586 0.031597641 + 15900 100 1.9234102 1.9234102 1.1099361 0.032381895 + 16000 100 2.039435 2.039435 1.1656948 0.032501981 + 16100 100 2.17315 2.17315 1.2265552 0.032675825 + 16200 100 2.2017279 2.2017279 1.23995 0.028634878 + 16300 100 2.3510902 2.3510902 1.3055642 0.03248003 + 16400 100 2.373932 2.373932 1.3059254 0.031292969 + 16500 100 2.5010862 2.5010862 1.3607219 0.032322054 + 16600 100 2.4815092 2.4815092 1.3524159 0.031223889 + 16700 100 2.6549226 2.6549226 1.4383508 0.033713507 + 16800 100 2.8087564 2.8087564 1.5261538 0.036598837 + 16900 100 2.8653588 2.8653588 1.5649123 0.035890231 + 17000 100 2.903748 2.903748 1.5907716 0.038038745 + 17100 100 2.9679376 2.9679376 1.6195577 0.051771432 + 17200 100 2.9632377 2.9632377 1.6233074 0.039825751 + 17300 100 3.0436883 3.0436883 1.6591248 0.042862982 + 17400 100 3.0969015 3.0969015 1.6811582 0.042104811 + 17500 100 3.0827135 3.0827135 1.691414 0.045839327 + 17600 100 3.0854805 3.0854805 1.689399 0.041770144 + 17700 100 3.07523 3.07523 1.6685518 0.045104715 + 17800 100 2.9610899 2.9610899 1.6349099 0.039060791 + 17900 100 2.8002989 2.8002989 1.5665223 0.037917927 + 18000 100 2.9139644 2.9139644 1.6206891 0.050841302 + 18100 100 3.0134757 3.0134757 1.6673916 0.040967255 + 18200 100 3.0731184 3.0731184 1.6777507 0.043503474 + 18300 100 3.0915242 3.0915242 1.6843452 0.040157898 + 18400 100 3.098896 3.098896 1.6904524 0.039629218 + 18500 100 3.1651814 3.1651814 1.7290259 0.042604953 + 18600 100 3.353247 3.353247 1.8236992 0.045132486 + 18700 100 3.540156 3.540156 1.9078363 0.046602063 + 18800 100 3.6395129 3.6395129 1.9578976 0.045659959 + 18900 100 3.7638134 3.7638134 2.0179445 0.051061068 + 19000 100 3.7603453 3.7603453 2.003355 0.057123184 + 19100 100 3.9218495 3.9218495 2.0968869 0.057671742 + 19200 100 3.9924222 3.9924222 2.1321955 0.051824898 + 19300 100 3.9690887 3.9690887 2.1270643 0.054832867 + 19400 100 3.9408481 3.9408481 2.1146593 0.057020024 + 19500 100 3.8313782 3.8313782 2.0610797 0.055164704 + 19600 100 3.8317496 3.8317496 2.0668123 0.049840804 + 19700 100 3.6068628 3.6068628 1.964227 0.05142407 + 19800 100 3.5477437 3.5477437 1.9314948 0.051076014 + 19900 100 3.6526881 3.6526881 1.9855353 0.047130029 + 20000 100 3.7243709 3.7243709 2.0380212 0.048446835 +Loop time of 0.206397 on 1 procs for 5000 steps with 100 atoms + +Performance: 10465265.522 tau/day, 24225.152 timesteps/s +100.3% CPU use with 1 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.014297 | 0.014297 | 0.014297 | 0.0 | 6.93 +Neigh | 0.050213 | 0.050213 | 0.050213 | 0.0 | 24.33 +Comm | 0.0011115 | 0.0011115 | 0.0011115 | 0.0 | 0.54 +Output | 0.00051141 | 0.00051141 | 0.00051141 | 0.0 | 0.25 +Modify | 0.13415 | 0.13415 | 0.13415 | 0.0 | 65.00 +Other | | 0.006114 | | | 2.96 + +Nlocal: 100 ave 100 max 100 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 0 ave 0 max 0 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 142 ave 142 max 142 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 142 +Ave neighs/atom = 1.42 +Neighbor list builds = 899 +Dangerous builds = 0 + +region container delete +region container block -6 6 -6 6 -6 6 units box +run 5000 +Memory usage per processor = 5.26337 Mbytes +Step Atoms Temp c_1 c_2 Press + 20000 100 3.7243709 3.7243709 2.0380212 0.048156434 + 20100 100 1.1186527 1.1186527 0.69104385 0.014964891 + 20200 100 0.91445605 0.91445605 0.57005236 0.011324474 + 20300 100 0.8936601 0.8936601 0.55534411 0.011071843 + 20400 100 0.90773143 0.90773143 0.55999953 0.011254101 + 20500 100 0.91995508 0.91995508 0.55837916 0.011548541 + 20600 100 0.91682167 0.91682167 0.54095261 0.012563797 + 20700 100 0.97806337 0.97806337 0.56016442 0.012396925 + 20800 100 0.97778738 0.97778738 0.55606194 0.015441479 + 20900 100 0.77253213 0.77253213 0.44636799 0.011428992 + 21000 100 0.63053468 0.63053468 0.35995394 0.01005502 + 21100 100 0.25437539 0.25437539 0.16544433 0.004628738 + 21200 100 0.11828032 0.11828032 0.087911985 0.0037076362 + 21300 100 0.11219312 0.11219312 0.080957112 0.0015847347 + 21400 100 0.10765357 0.10765357 0.074676159 0.0022823419 + 21500 100 0.060787093 0.060787093 0.046135213 0.00091422949 + 21600 100 0.040447932 0.040447932 0.033050575 0.0013404194 + 21700 100 0.035227782 0.035227782 0.02916621 0.00138779 + 21800 100 0.03309101 0.03309101 0.026613861 0.00058184323 + 21900 100 0.031461843 0.031461843 0.024751985 0.0013090333 + 22000 100 0.021624144 0.021624144 0.017872639 0.0010893822 + 22100 100 0.016728267 0.016728267 0.01403934 0.00049128736 + 22200 100 0.016256915 0.016256915 0.013763903 0.00047288638 + 22300 100 0.01349256 0.01349256 0.011498343 0.0013508309 + 22400 100 0.010027007 0.010027007 0.0087924966 0.00030117996 + 22500 100 0.0107355 0.0107355 0.0088715062 0.001043188 + 22600 100 0.0095852245 0.0095852245 0.007965421 0.00028464236 + 22700 100 0.0072956464 0.0072956464 0.0062403843 0.00061636772 + 22800 100 0.0060874415 0.0060874415 0.0054788049 0.00021135824 + 22900 100 0.0059688159 0.0059688159 0.0049530273 0.00022094116 + 23000 100 0.0050218996 0.0050218996 0.0043518404 0.00022527705 + 23100 100 0.005022208 0.005022208 0.0043118432 0.00052482006 + 23200 100 0.0047096056 0.0047096056 0.0039698638 0.00026423471 + 23300 100 0.0039510068 0.0039510068 0.0034773285 0.0001891104 + 23400 100 0.0037308781 0.0037308781 0.0031763304 0.00027163016 + 23500 100 0.0036278619 0.0036278619 0.0030371899 0.00017961072 + 23600 100 0.0033598677 0.0033598677 0.0027586323 0.00015034494 + 23700 100 0.0028530843 0.0028530843 0.0024809444 0.00012294415 + 23800 100 0.0025388819 0.0025388819 0.0022812799 0.00018946676 + 23900 100 0.0021129272 0.0021129272 0.0019905358 0.00015816903 + 24000 100 0.0021010978 0.0021010978 0.0019864539 0.00017086049 + 24100 100 0.0022189886 0.0022189886 0.0020466911 0.00030932562 + 24200 100 0.0019226314 0.0019226314 0.0017933042 9.3246067e-05 + 24300 100 0.0016875781 0.0016875781 0.0015999656 9.9935458e-05 + 24400 100 0.0015929611 0.0015929611 0.001531011 9.7429139e-05 + 24500 100 0.0015143044 0.0015143044 0.0014044175 9.807117e-05 + 24600 100 0.0018595492 0.0018595492 0.0014740944 7.4734729e-05 + 24700 100 0.0011646988 0.0011646988 0.0010881356 6.1197025e-05 + 24800 100 0.0014641612 0.0014641612 0.0012316664 8.81462e-05 + 24900 100 0.001024996 0.001024996 0.00094311114 5.8776472e-05 + 25000 100 0.00097890442 0.00097890442 0.00090302317 3.3980657e-05 +Loop time of 0.0954661 on 1 procs for 5000 steps with 100 atoms + +Performance: 22625823.872 tau/day, 52374.592 timesteps/s +99.5% CPU use with 1 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.01234 | 0.01234 | 0.01234 | 0.0 | 12.93 +Neigh | 0.015404 | 0.015404 | 0.015404 | 0.0 | 16.14 +Comm | 0.00077391 | 0.00077391 | 0.00077391 | 0.0 | 0.81 +Output | 0.000494 | 0.000494 | 0.000494 | 0.0 | 0.52 +Modify | 0.062222 | 0.062222 | 0.062222 | 0.0 | 65.18 +Other | | 0.004233 | | | 4.43 + +Nlocal: 100 ave 100 max 100 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 0 ave 0 max 0 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 150 ave 150 max 150 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 150 +Ave neighs/atom = 1.5 +Neighbor list builds = 283 +Dangerous builds = 0 +Total wall time: 0:00:00 diff --git a/examples/granregion/log.6Oct16.granregion.box.g++.4 b/examples/granregion/log.6Oct16.granregion.box.g++.4 new file mode 100644 index 0000000000..daaae2019e --- /dev/null +++ b/examples/granregion/log.6Oct16.granregion.box.g++.4 @@ -0,0 +1,468 @@ +LAMMPS (5 Oct 2016) +# pouring spheres into container box + +units lj +atom_style sphere +boundary f f f +dimension 3 +comm_modify vel yes + +region box block -10 10 -10 10 -10 10 units box +create_box 2 box +Created orthogonal box = (-10 -10 -10) to (10 10 10) + 1 by 2 by 2 MPI processor grid + +pair_style hybrid gran/hooke 4000.0 NULL 100.0 NULL 0.5 1 +pair_coeff * * gran/hooke + +region container block -6 6 -6 6 -6 6 units box +fix container all wall/gran/region hooke/history 4000.0 NULL 100.0 NULL 0.5 1 region container + +neighbor 0.3 bin +neigh_modify delay 0 every 1 check yes + +fix 2 all nve/sphere +fix 3 all gravity 1.0 vector 0 0 -1 + +region slab block -2 2 -2 2 -2 2 units box +fix ins all pour 100 2 4767548 vol 0.4 10 diam one 1.0 region slab ignore +Particle insertion: 48 every 566 steps, 100 by step 1133 + +timestep 0.005 + +compute 1 all temp +compute_modify 1 dynamic yes + +compute 2 all temp/sphere +compute_modify 2 dynamic yes + +thermo 100 +thermo_style custom step atoms temp c_1 c_2 press +thermo_modify lost ignore +compute_modify thermo_temp dynamic yes + +#dump 2 all image 100 image.*.jpg type type # zoom 1.4 adiam 1.0 box no 0.0 axes yes 0.9 0.03 +#dump_modify 2 pad 5 + +run 5000 +Neighbor list info ... + 1 neighbor list requests + 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 = 31 31 31 +Memory usage per processor = 0.0990257 Mbytes +Step Atoms Temp c_1 c_2 Press + 0 0 0 0 0 0 + 100 21 0.54270729 0.54270729 0.26473526 0.0013567682 + 200 21 0.87606961 0.87606961 0.42735103 0.002190174 + 300 21 1.1428374 1.1428374 0.55748167 0.0028570936 + 400 21 1.3543103 1.3543103 0.66829516 0.0033857758 + 500 21 1.0677786 1.0677786 0.53582407 0.0045048164 + 600 56 0.6744286 0.6744286 0.3502938 0.0047464584 + 700 56 0.75569283 0.75569283 0.39779462 0.0051953882 + 800 56 0.61597505 0.61597505 0.32943642 0.0086022783 + 900 56 0.65260802 0.65260802 0.34474044 0.0059298996 + 1000 56 0.51624952 0.51624952 0.28326898 0.0067827337 + 1100 56 0.46050076 0.46050076 0.25656319 0.0061891094 + 1200 81 0.39112377 0.39112377 0.21690744 0.0086559347 + 1300 81 0.33302801 0.33302801 0.19110222 0.0033381288 + 1400 81 0.39333146 0.39333146 0.21220965 0.0041348597 + 1500 81 0.35493951 0.35493951 0.19924958 0.00373736 + 1600 81 0.34154491 0.34154491 0.19031147 0.005349672 + 1700 100 0.25598828 0.25598828 0.14171498 0.0092236643 + 1800 100 0.2114074 0.2114074 0.12162965 0.0027213483 + 1900 100 0.21810423 0.21810423 0.12176698 0.0036436054 + 2000 100 0.2553198 0.2553198 0.13900087 0.0032844518 + 2100 100 0.24809936 0.24809936 0.13753654 0.0088764777 + 2200 100 0.22455625 0.22455625 0.12500973 0.0043515755 + 2300 100 0.19586871 0.19586871 0.11064996 0.0055176298 + 2400 100 0.059621411 0.059621411 0.045535517 0.00079910861 + 2500 100 0.052217518 0.052217518 0.038542594 0.0009759424 + 2600 100 0.036907358 0.036907358 0.027550263 0.0014047668 + 2700 100 0.027926944 0.027926944 0.020599405 0.00063362027 + 2800 100 0.020876282 0.020876282 0.015385856 0.00066161626 + 2900 100 0.010390963 0.010390963 0.0085038611 0.00026222195 + 3000 100 0.0080105974 0.0080105974 0.006995365 0.00059521652 + 3100 100 0.0087388005 0.0087388005 0.0069051613 0.00028045343 + 3200 100 0.0078828927 0.0078828927 0.0060159861 0.00014819289 + 3300 100 0.0039336821 0.0039336821 0.0036525886 0.0001439482 + 3400 100 0.0037684472 0.0037684472 0.0031531439 0.00010653386 + 3500 100 0.0023527874 0.0023527874 0.0020983632 6.3797052e-05 + 3600 100 0.0018768162 0.0018768162 0.0017248798 0.00014904114 + 3700 100 0.00135595 0.00135595 0.0013962044 6.2461444e-05 + 3800 100 0.0012673777 0.0012673777 0.0013074364 0.00028034063 + 3900 100 0.00081311806 0.00081311806 0.00095642595 7.9543605e-05 + 4000 100 0.00059774673 0.00059774673 0.00074849615 6.8190201e-05 + 4100 100 0.00052811986 0.00052811986 0.00067263919 5.012633e-05 + 4200 100 0.00049555855 0.00049555855 0.00061736675 4.9888372e-05 + 4300 100 0.00048274473 0.00048274473 0.00059050389 5.1381757e-05 + 4400 100 0.00047341333 0.00047341333 0.00058083446 5.02623e-05 + 4500 100 0.00046792237 0.00046792237 0.00057416894 4.9019652e-05 + 4600 100 0.00046035378 0.00046035378 0.00056694823 6.0353699e-05 + 4700 100 0.00038114933 0.00038114933 0.0004980117 6.5173515e-05 + 4800 100 0.0003783967 0.0003783967 0.00049488428 4.8463898e-05 + 4900 100 0.00027940611 0.00027940611 0.00041517649 5.0979155e-05 + 5000 100 0.00026071989 0.00026071989 0.00040045214 5.151673e-05 +Loop time of 0.0799825 on 4 procs for 5000 steps with 100 atoms + +Performance: 27005901.076 tau/day, 62513.660 timesteps/s +96.6% CPU use with 4 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.00093961 | 0.0032012 | 0.0054553 | 3.8 | 4.00 +Neigh | 0.0032456 | 0.0046872 | 0.0061908 | 2.0 | 5.86 +Comm | 0.014328 | 0.02121 | 0.029619 | 4.7 | 26.52 +Output | 0.0011828 | 0.0014142 | 0.0015574 | 0.4 | 1.77 +Modify | 0.002455 | 0.013876 | 0.026567 | 9.6 | 17.35 +Other | | 0.03559 | | | 44.50 + +Nlocal: 25 ave 51 max 0 min +Histogram: 2 0 0 0 0 0 0 0 0 2 +Nghost: 4.75 ave 11 max 0 min +Histogram: 2 0 0 0 0 0 0 1 0 1 +Neighs: 39.5 ave 85 max 0 min +Histogram: 2 0 0 0 0 0 0 0 1 1 + +Total # of neighbors = 158 +Ave neighs/atom = 1.58 +Neighbor list builds = 305 +Dangerous builds = 0 + +region container delete +variable theta equal (step-5000)*(4.0*PI/5000) +region container block -6 6 -6 6 -6 6 units box rotate v_theta 0 0 0 0 0 1 +run 5000 +Memory usage per processor = 5.16122 Mbytes +Step Atoms Temp c_1 c_2 Press + 5000 100 0.00026071989 0.00026071989 0.00040045214 5.1497323e-05 + 5100 100 0.66352492 0.66352492 0.35750241 0.015948709 + 5200 100 0.6922229 0.6922229 0.37176131 0.011025479 + 5300 100 0.76307067 0.76307067 0.40325027 0.010979511 + 5400 100 0.83871418 0.83871418 0.43756084 0.012600965 + 5500 100 0.93090048 0.93090048 0.4817574 0.012306942 + 5600 100 0.98338567 0.98338567 0.50374148 0.015434412 + 5700 100 1.0455442 1.0455442 0.53265847 0.017959409 + 5800 100 1.1081511 1.1081511 0.56112842 0.018832417 + 5900 100 1.1724309 1.1724309 0.59276447 0.019257973 + 6000 100 1.1914813 1.1914813 0.60201665 0.019694573 + 6100 100 1.2417733 1.2417733 0.62578893 0.019616524 + 6200 100 1.2612898 1.2612898 0.63503847 0.020442394 + 6300 100 1.2657345 1.2657345 0.63714395 0.020498843 + 6400 100 1.2678009 1.2678009 0.63828941 0.019900919 + 6500 100 1.284156 1.284156 0.64724666 0.020147256 + 6600 100 1.3090278 1.3090278 0.65925035 0.02136883 + 6700 100 1.3122075 1.3122075 0.66136807 0.020782325 + 6800 100 1.3147107 1.3147107 0.66026206 0.022887611 + 6900 100 1.3185295 1.3185295 0.66157265 0.021249838 + 7000 100 1.3232771 1.3232771 0.66334852 0.021738995 + 7100 100 1.3375003 1.3375003 0.67017176 0.021997185 + 7200 100 1.3349835 1.3349835 0.66895884 0.022149977 + 7300 100 1.3388711 1.3388711 0.67061163 0.021662545 + 7400 100 1.338676 1.338676 0.67074642 0.021076102 + 7500 100 1.3409052 1.3409052 0.67205098 0.021664853 + 7600 100 1.3499236 1.3499236 0.67612412 0.021653422 + 7700 100 1.3479719 1.3479719 0.67510646 0.021873569 + 7800 100 1.3489138 1.3489138 0.67563223 0.021419315 + 7900 100 1.357018 1.357018 0.6795804 0.022201202 + 8000 100 1.3540513 1.3540513 0.67843711 0.02275761 + 8100 100 1.3560429 1.3560429 0.67947065 0.022421723 + 8200 100 1.3590694 1.3590694 0.6806094 0.022004213 + 8300 100 1.3592154 1.3592154 0.68083948 0.021923269 + 8400 100 1.3601392 1.3601392 0.68121418 0.022155184 + 8500 100 1.3622149 1.3622149 0.6824182 0.022126924 + 8600 100 1.3651697 1.3651697 0.68397342 0.022195287 + 8700 100 1.3679254 1.3679254 0.68540978 0.023609651 + 8800 100 1.3686254 1.3686254 0.68559712 0.02242291 + 8900 100 1.3761277 1.3761277 0.68897201 0.023594162 + 9000 100 1.379968 1.379968 0.69045216 0.022516846 + 9100 100 1.3784732 1.3784732 0.68955121 0.022836115 + 9200 100 1.376848 1.376848 0.6885551 0.02279321 + 9300 100 1.3799231 1.3799231 0.68964009 0.023105818 + 9400 100 1.3817992 1.3817992 0.69057466 0.023062265 + 9500 100 1.3836544 1.3836544 0.69156755 0.024363244 + 9600 100 1.388032 1.388032 0.69348762 0.024930983 + 9700 100 1.3943738 1.3943738 0.6965703 0.024448451 + 9800 100 1.3963094 1.3963094 0.6971039 0.02341203 + 9900 100 1.3995489 1.3995489 0.69881652 0.023502542 + 10000 100 1.3974742 1.3974742 0.69765474 0.02340004 +Loop time of 0.18267 on 4 procs for 5000 steps with 100 atoms + +Performance: 11824571.055 tau/day, 27371.692 timesteps/s +99.1% CPU use with 4 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.0010765 | 0.012038 | 0.023519 | 9.9 | 6.59 +Neigh | 0.0057316 | 0.010541 | 0.015351 | 4.6 | 5.77 +Comm | 0.0067229 | 0.017007 | 0.028509 | 7.8 | 9.31 +Output | 0.0011928 | 0.002021 | 0.0027668 | 1.6 | 1.11 +Modify | 0.009697 | 0.053707 | 0.098413 | 19.0 | 29.40 +Other | | 0.08736 | | | 47.82 + +Nlocal: 25 ave 51 max 0 min +Histogram: 2 0 0 0 0 0 0 0 0 2 +Nghost: 3.25 ave 8 max 0 min +Histogram: 2 0 0 0 0 0 1 0 0 1 +Neighs: 46.75 ave 104 max 0 min +Histogram: 2 0 0 0 0 0 0 1 0 1 + +Total # of neighbors = 187 +Ave neighs/atom = 1.87 +Neighbor list builds = 633 +Dangerous builds = 0 + +region container delete +region container block -6 6 -6 6 -6 6 units box +run 5000 +Memory usage per processor = 5.16122 Mbytes +Step Atoms Temp c_1 c_2 Press + 10000 100 1.3974742 1.3974742 0.69765474 0.023347613 + 10100 100 0.34944285 0.34944285 0.20251378 0.019176827 + 10200 100 0.22524385 0.22524385 0.14368424 0.0033260831 + 10300 100 0.15243438 0.15243438 0.11070165 0.0064816535 + 10400 100 0.1143586 0.1143586 0.087867032 0.0024091961 + 10500 100 0.092025102 0.092025102 0.071291506 0.0030683413 + 10600 100 0.071051442 0.071051442 0.05700858 0.00100243 + 10700 100 0.058346771 0.058346771 0.04843626 0.0006073275 + 10800 100 0.048700232 0.048700232 0.039550383 0.00091511006 + 10900 100 0.036880936 0.036880936 0.029482183 0.0011698854 + 11000 100 0.028768807 0.028768807 0.023865852 0.0011980794 + 11100 100 0.022823005 0.022823005 0.018819891 0.0004639259 + 11200 100 0.016954703 0.016954703 0.014075803 0.00085142865 + 11300 100 0.015359685 0.015359685 0.01295219 0.00026241662 + 11400 100 0.012748378 0.012748378 0.011085291 0.00045626939 + 11500 100 0.010464459 0.010464459 0.0087024732 0.00029325411 + 11600 100 0.0099186727 0.0099186727 0.0080127406 0.00031388584 + 11700 100 0.0088308874 0.0088308874 0.0072317369 0.00017850972 + 11800 100 0.0081740195 0.0081740195 0.0066522963 0.00012282618 + 11900 100 0.0079005289 0.0079005289 0.0063346391 0.00010630403 + 12000 100 0.0066277573 0.0066277573 0.0054122601 5.4791661e-05 + 12100 100 0.00567928 0.00567928 0.0047331385 9.2668647e-05 + 12200 100 0.005282803 0.005282803 0.0043827202 8.7820361e-05 + 12300 100 0.0051590302 0.0051590302 0.0042806737 6.5433983e-05 + 12400 100 0.0049013329 0.0049013329 0.0040882737 6.2007733e-05 + 12500 100 0.0044725745 0.0044725745 0.0037535523 6.1132729e-05 + 12600 100 0.0043131884 0.0043131884 0.0035845765 5.3375706e-05 + 12700 100 0.0042020236 0.0042020236 0.0034902096 0.0001192142 + 12800 100 0.0041367453 0.0041367453 0.003433341 0.00011052418 + 12900 100 0.0039862367 0.0039862367 0.0033026224 5.2674711e-05 + 13000 100 0.0033163769 0.0033163769 0.0028118123 5.9042575e-05 + 13100 100 0.0030645983 0.0030645983 0.002571872 4.9521551e-05 + 13200 100 0.002808301 0.002808301 0.0023652684 3.4748246e-05 + 13300 100 0.002556475 0.002556475 0.0021699595 0.00042840611 + 13400 100 0.0023430405 0.0023430405 0.0019913198 2.2687303e-05 + 13500 100 0.0021422817 0.0021422817 0.0018017112 -6.7761855e-06 + 13600 100 0.0020993702 0.0020993702 0.001749657 2.5979707e-05 + 13700 100 0.0019871396 0.0019871396 0.0016647634 5.754995e-05 + 13800 100 0.0017311886 0.0017311886 0.0014696399 2.1585018e-05 + 13900 100 0.0016249641 0.0016249641 0.0013982224 2.0108931e-05 + 14000 100 0.0015874763 0.0015874763 0.0013613318 0.00018348921 + 14100 100 0.0013772541 0.0013772541 0.0012193388 1.9336869e-05 + 14200 100 0.0013587865 0.0013587865 0.0012054213 1.807845e-05 + 14300 100 0.0011824329 0.0011824329 0.0010348168 0.00017307518 + 14400 100 0.0011387278 0.0011387278 0.0010010725 1.4091757e-05 + 14500 100 0.0010441599 0.0010441599 0.00092205881 1.3630652e-05 + 14600 100 0.00096839518 0.00096839518 0.00086828535 1.2437299e-05 + 14700 100 0.00094215882 0.00094215882 0.00084418599 5.3989122e-05 + 14800 100 0.00077297853 0.00077297853 0.00070382005 8.5049867e-06 + 14900 100 0.00072181281 0.00072181281 0.00066110432 8.9324335e-06 + 15000 100 0.00070122327 0.00070122327 0.00063826734 3.4876262e-05 +Loop time of 0.0815294 on 4 procs for 5000 steps with 100 atoms + +Performance: 26493517.176 tau/day, 61327.586 timesteps/s +97.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 | 0.00076294 | 0.0033154 | 0.0062585 | 4.3 | 4.07 +Neigh | 0.0010953 | 0.0020078 | 0.002914 | 2.0 | 2.46 +Comm | 0.0021389 | 0.012184 | 0.023433 | 9.1 | 14.94 +Output | 0.0011332 | 0.0014591 | 0.0017147 | 0.7 | 1.79 +Modify | 0.00083971 | 0.017889 | 0.035367 | 12.7 | 21.94 +Other | | 0.04467 | | | 54.79 + +Nlocal: 25 ave 54 max 0 min +Histogram: 2 0 0 0 0 0 0 0 1 1 +Nghost: 3.75 ave 8 max 0 min +Histogram: 2 0 0 0 0 0 0 0 1 1 +Neighs: 37.5 ave 97 max 0 min +Histogram: 2 0 0 0 0 1 0 0 0 1 + +Total # of neighbors = 150 +Ave neighs/atom = 1.5 +Neighbor list builds = 120 +Dangerous builds = 0 + +region container delete +variable theta equal (step-15000)*(4.0*PI/5000) +region container block -6 6 -6 6 -6 6 units box rotate v_theta 0 0 0 1 1 1 +run 5000 +Memory usage per processor = 5.16122 Mbytes +Step Atoms Temp c_1 c_2 Press + 15000 100 0.00070122327 0.00070122327 0.00063826734 3.4742207e-05 + 15100 100 1.1981004 1.1981004 0.74046013 0.017300203 + 15200 100 1.2197457 1.2197457 0.75847511 0.016724637 + 15300 100 1.1794198 1.1794198 0.77076582 0.017228755 + 15400 100 1.4027714 1.4027714 0.87950036 0.021028602 + 15500 100 1.5514702 1.5514702 0.95040716 0.019935207 + 15600 100 1.8360404 1.8360404 1.0987247 0.02494663 + 15700 100 2.0317625 2.0317625 1.2004001 0.029286087 + 15800 100 2.0478625 2.0478625 1.189893 0.031660426 + 15900 100 2.1289888 2.1289888 1.2083316 0.028754408 + 16000 100 2.2261493 2.2261493 1.2550891 0.030665647 + 16100 100 2.3005184 2.3005184 1.29238 0.036511242 + 16200 100 2.4515818 2.4515818 1.3563253 0.033787104 + 16300 100 2.4524614 2.4524614 1.3571527 0.031905963 + 16400 100 2.5592541 2.5592541 1.405001 0.035688651 + 16500 100 2.5311864 2.5311864 1.3918694 0.032451265 + 16600 100 2.6471904 2.6471904 1.4481739 0.034763978 + 16700 100 2.7024085 2.7024085 1.4785065 0.037514299 + 16800 100 2.8116979 2.8116979 1.5403269 0.03585152 + 16900 100 2.9095374 2.9095374 1.5962283 0.038244982 + 17000 100 2.9228985 2.9228985 1.5978628 0.037971615 + 17100 100 2.983589 2.983589 1.6205713 0.038332341 + 17200 100 3.1245984 3.1245984 1.6925827 0.042532223 + 17300 100 3.1060575 3.1060575 1.6713928 0.052589575 + 17400 100 3.2494904 3.2494904 1.7567188 0.044783721 + 17500 100 3.2313349 3.2313349 1.7549177 0.044959213 + 17600 100 3.3928412 3.3928412 1.822978 0.052512199 + 17700 100 3.3064729 3.3064729 1.7924768 0.046624738 + 17800 100 3.1907518 3.1907518 1.7406131 0.042864325 + 17900 100 3.0224556 3.0224556 1.6641648 0.040151025 + 18000 100 3.105271 3.105271 1.7045599 0.047137803 + 18100 100 3.0293425 3.0293425 1.6626024 0.04198758 + 18200 100 3.139773 3.139773 1.7310307 0.040137164 + 18300 100 2.9732894 2.9732894 1.6555933 0.03777758 + 18400 100 3.1250324 3.1250324 1.739812 0.038542298 + 18500 100 3.1687407 3.1687407 1.7593494 0.041591022 + 18600 100 3.2880821 3.2880821 1.8169373 0.042503015 + 18700 100 3.4877047 3.4877047 1.9049979 0.048156272 + 18800 100 3.7982973 3.7982973 2.055323 0.049805341 + 18900 100 3.9922267 3.9922267 2.1260665 0.062688073 + 19000 100 3.8620284 3.8620284 2.0652184 0.064418518 + 19100 100 3.8757665 3.8757665 2.0615465 0.058600317 + 19200 100 3.9425495 3.9425495 2.1030375 0.053714175 + 19300 100 3.8589133 3.8589133 2.0485568 0.05531747 + 19400 100 3.9202395 3.9202395 2.0904529 0.056324297 + 19500 100 3.9748628 3.9748628 2.1114492 0.055590699 + 19600 100 3.8876771 3.8876771 2.0918436 0.052415532 + 19700 100 3.8975921 3.8975921 2.0755799 0.050647718 + 19800 100 3.7488333 3.7488333 2.0024562 0.056966734 + 19900 100 3.7818574 3.7818574 2.00915 0.050079148 + 20000 100 3.4510736 3.4510736 1.8525818 0.053548452 +Loop time of 0.156607 on 4 procs for 5000 steps with 100 atoms + +Performance: 13792452.627 tau/day, 31926.974 timesteps/s +98.5% CPU use with 4 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.0030923 | 0.0049732 | 0.0071678 | 2.1 | 3.18 +Neigh | 0.012225 | 0.015592 | 0.017859 | 1.7 | 9.96 +Comm | 0.034876 | 0.037526 | 0.040807 | 1.1 | 23.96 +Output | 0.0013812 | 0.0015668 | 0.0017419 | 0.3 | 1.00 +Modify | 0.026932 | 0.044011 | 0.054787 | 5.0 | 28.10 +Other | | 0.05294 | | | 33.80 + +Nlocal: 25 ave 41 max 12 min +Histogram: 1 0 0 1 1 0 0 0 0 1 +Nghost: 3.25 ave 6 max 1 min +Histogram: 1 0 1 0 0 0 1 0 0 1 +Neighs: 35.75 ave 59 max 9 min +Histogram: 1 0 0 0 0 1 1 0 0 1 + +Total # of neighbors = 143 +Ave neighs/atom = 1.43 +Neighbor list builds = 917 +Dangerous builds = 0 + +region container delete +region container block -6 6 -6 6 -6 6 units box +run 5000 +Memory usage per processor = 5.16122 Mbytes +Step Atoms Temp c_1 c_2 Press + 20000 100 3.4510736 3.4510736 1.8525818 0.053182767 + 20100 100 0.99241675 0.99241675 0.61590164 0.015233656 + 20200 100 0.92799489 0.92799489 0.55540992 0.011885237 + 20300 100 0.9171573 0.9171573 0.54477252 0.012926388 + 20400 100 0.86718407 0.86718407 0.5145422 0.011384414 + 20500 100 0.84470122 0.84470122 0.50181203 0.010482207 + 20600 100 0.93025469 0.93025469 0.53939952 0.011377044 + 20700 100 0.96631348 0.96631348 0.55772027 0.015287231 + 20800 100 0.90708015 0.90708015 0.52037018 0.014854537 + 20900 100 0.73319001 0.73319001 0.42824847 0.0092980012 + 21000 100 0.3371096 0.3371096 0.21272171 0.0061783554 + 21100 100 0.21771022 0.21771022 0.14128887 0.0082147558 + 21200 100 0.18133275 0.18133275 0.11945636 0.0055722731 + 21300 100 0.17117199 0.17117199 0.11048263 0.0027980106 + 21400 100 0.15741047 0.15741047 0.10346676 0.0023057723 + 21500 100 0.10045855 0.10045855 0.069905343 0.0023941181 + 21600 100 0.066094864 0.066094864 0.051285108 0.0022519002 + 21700 100 0.048622069 0.048622069 0.040662255 0.00073951939 + 21800 100 0.046829799 0.046829799 0.037431722 0.0015913976 + 21900 100 0.025308514 0.025308514 0.02092076 0.00064225773 + 22000 100 0.016326886 0.016326886 0.013588504 0.00087416572 + 22100 100 0.011892981 0.011892981 0.010417133 0.00080132313 + 22200 100 0.011974602 0.011974602 0.010342276 0.00044437732 + 22300 100 0.012567486 0.012567486 0.010294969 0.00048413872 + 22400 100 0.011676022 0.011676022 0.0091714238 0.00066567365 + 22500 100 0.0098737136 0.0098737136 0.0079252142 0.00024081335 + 22600 100 0.0052495523 0.0052495523 0.0047802341 0.00029167814 + 22700 100 0.0049396543 0.0049396543 0.0043570686 0.00019793167 + 22800 100 0.004469254 0.004469254 0.0038657445 0.00052965165 + 22900 100 0.0043837877 0.0043837877 0.0034611363 0.00045595698 + 23000 100 0.003439309 0.003439309 0.0028031344 0.00025784869 + 23100 100 0.0034805091 0.0034805091 0.0027537344 0.00012746906 + 23200 100 0.0045502061 0.0045502061 0.0032298328 0.00024006432 + 23300 100 0.0028553043 0.0028553043 0.0023107483 0.00012803066 + 23400 100 0.0022736412 0.0022736412 0.0018560302 0.0002706771 + 23500 100 0.0020966521 0.0020966521 0.0017106541 0.00014239612 + 23600 100 0.0018760993 0.0018760993 0.0015415318 0.00010892634 + 23700 100 0.0022362451 0.0022362451 0.0017014519 0.00012547256 + 23800 100 0.0017603403 0.0017603403 0.0014681398 0.00023372731 + 23900 100 0.0023396747 0.0023396747 0.0016700312 0.00017014305 + 24000 100 0.0012059144 0.0012059144 0.0009982224 3.6215959e-05 + 24100 100 0.0011739433 0.0011739433 0.00097155852 3.6169918e-05 + 24200 100 0.0011071139 0.0011071139 0.00092095478 8.8000847e-05 + 24300 100 0.0011078659 0.0011078659 0.00092073833 4.8706222e-05 + 24400 100 0.0011037562 0.0011037562 0.00091673546 3.7548502e-05 + 24500 100 0.00098422752 0.00098422752 0.00083054499 9.1151844e-05 + 24600 100 0.00097403646 0.00097403646 0.00082364881 5.0914687e-05 + 24700 100 0.00093082012 0.00093082012 0.00079047801 3.2230016e-05 + 24800 100 0.0009138973 0.0009138973 0.00075880177 2.8780789e-05 + 24900 100 0.0012881027 0.0012881027 0.00093025416 1.6385252e-05 + 25000 100 0.00076099168 0.00076099168 0.00065175575 9.417272e-06 +Loop time of 0.0846543 on 4 procs for 5000 steps with 100 atoms + +Performance: 25515528.493 tau/day, 59063.723 timesteps/s +98.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 | 0.0010469 | 0.0037468 | 0.0067947 | 4.3 | 4.43 +Neigh | 0.0032442 | 0.0047541 | 0.0065064 | 2.0 | 5.62 +Comm | 0.0085762 | 0.016923 | 0.024509 | 5.8 | 19.99 +Output | 0.0011523 | 0.0014572 | 0.0016789 | 0.6 | 1.72 +Modify | 0.0017715 | 0.016296 | 0.031399 | 11.1 | 19.25 +Other | | 0.04148 | | | 49.00 + +Nlocal: 25 ave 50 max 0 min +Histogram: 2 0 0 0 0 0 0 0 0 2 +Nghost: 6 ave 13 max 0 min +Histogram: 2 0 0 0 0 0 0 0 1 1 +Neighs: 39 ave 80 max 0 min +Histogram: 2 0 0 0 0 0 0 0 0 2 + +Total # of neighbors = 156 +Ave neighs/atom = 1.56 +Neighbor list builds = 284 +Dangerous builds = 0 +Total wall time: 0:00:00 diff --git a/examples/granregion/log.6Oct16.granregion.funnel.g++.1 b/examples/granregion/log.6Oct16.granregion.funnel.g++.1 new file mode 100644 index 0000000000..86faeb3401 --- /dev/null +++ b/examples/granregion/log.6Oct16.granregion.funnel.g++.1 @@ -0,0 +1,608 @@ +LAMMPS (5 Oct 2016) +# pour particles into cone-shaped funnel, settle them, let them run out bottom + +variable name string funnel_pour + +thermo_modify flush yes +units si +variable PI equal 3.141592653589 +variable seed equal 14314 + +############################################### +# Geometry-related parameters +############################################### + +variable xlo equal 10 +variable xhi equal 40 +variable ylo equal 10 +variable yhi equal 40 +variable zlo equal -20 +variable zhi equal 50 + +variable xc equal 25 +variable yc equal 25 + +variable zconehi equal 50 +variable zconelo equal 10 +variable zcyllo equal 0 +variable radconelo equal 2 +variable radconehi equal 20 + +################################################ +# Particle sizes +################################################ + +variable rlo equal 0.25 +variable rhi equal 0.5 +variable dlo equal 2.0*${rlo} +variable dlo equal 2.0*0.25 +variable dhi equal 2.0*${rhi} +variable dhi equal 2.0*0.5 + +variable skin equal ${rhi} +variable skin equal 0.5 + +############################################### +# Granular contact parameters +############################################### + +variable coeffRes equal 0.1 +variable coeffFric equal 0.5 + +variable density equal 1.0 +variable EYoung equal 10^5 +variable Poisson equal 2.0/7.0 +variable GShear equal ${EYoung}/(2*(1+${Poisson})) +variable GShear equal 100000/(2*(1+${Poisson})) +variable GShear equal 100000/(2*(1+0.285714285714286)) + +variable gravity equal 1.0 + +variable reff equal 0.5*(${rhi}+${rlo}) +variable reff equal 0.5*(0.5+${rlo}) +variable reff equal 0.5*(0.5+0.25) +variable meff equal ${density}*4.0/3.0*${PI}*${reff}^3 +variable meff equal 1*4.0/3.0*${PI}*${reff}^3 +variable meff equal 1*4.0/3.0*3.141592653589*${reff}^3 +variable meff equal 1*4.0/3.0*3.141592653589*0.375^3 +variable min_mass equal ${density}*4.0/3.0*${PI}*${rlo}*${rlo}*${rlo} +variable min_mass equal 1*4.0/3.0*${PI}*${rlo}*${rlo}*${rlo} +variable min_mass equal 1*4.0/3.0*3.141592653589*${rlo}*${rlo}*${rlo} +variable min_mass equal 1*4.0/3.0*3.141592653589*0.25*${rlo}*${rlo} +variable min_mass equal 1*4.0/3.0*3.141592653589*0.25*0.25*${rlo} +variable min_mass equal 1*4.0/3.0*3.141592653589*0.25*0.25*0.25 +variable max_mass equal ${density}*4.0/3.0*${PI}*${rhi}*${rhi}*${rhi} +variable max_mass equal 1*4.0/3.0*${PI}*${rhi}*${rhi}*${rhi} +variable max_mass equal 1*4.0/3.0*3.141592653589*${rhi}*${rhi}*${rhi} +variable max_mass equal 1*4.0/3.0*3.141592653589*0.5*${rhi}*${rhi} +variable max_mass equal 1*4.0/3.0*3.141592653589*0.5*0.5*${rhi} +variable max_mass equal 1*4.0/3.0*3.141592653589*0.5*0.5*0.5 + +## Typical way to set kn, kt, etc.: +variable kn equal 4.0*${GShear}/(3*(1-${Poisson})) +variable kn equal 4.0*38888.8888888889/(3*(1-${Poisson})) +variable kn equal 4.0*38888.8888888889/(3*(1-0.285714285714286)) +variable kt equal 4.0*${GShear}/(2-${Poisson}) +variable kt equal 4.0*38888.8888888889/(2-${Poisson}) +variable kt equal 4.0*38888.8888888889/(2-0.285714285714286) + +variable a equal (-2.0*log(${coeffRes})/${PI})^2 +variable a equal (-2.0*log(0.1)/${PI})^2 +variable a equal (-2.0*log(0.1)/3.141592653589)^2 +variable gamma_n equal sqrt($a*2*${kn}/${min_mass}/(1+0.25*$a)) +variable gamma_n equal sqrt(0.405284734569556*2*${kn}/${min_mass}/(1+0.25*$a)) +variable gamma_n equal sqrt(0.405284734569556*2*72592.5925925926/${min_mass}/(1+0.25*$a)) +variable gamma_n equal sqrt(0.405284734569556*2*72592.5925925926/0.0654498469497708/(1+0.25*$a)) +variable gamma_n equal sqrt(0.405284734569556*2*72592.5925925926/0.0654498469497708/(1+0.25*0.405284734569556)) +variable gamma_t equal ${gamma_n}*0.5 +variable gamma_t equal 903.503751814138*0.5 + +variable tcol equal ${PI}/sqrt(2*${kn}/${min_mass}-${gamma_n}/4.0) +variable tcol equal 3.141592653589/sqrt(2*${kn}/${min_mass}-${gamma_n}/4.0) +variable tcol equal 3.141592653589/sqrt(2*72592.5925925926/${min_mass}-${gamma_n}/4.0) +variable tcol equal 3.141592653589/sqrt(2*72592.5925925926/0.0654498469497708-${gamma_n}/4.0) +variable tcol equal 3.141592653589/sqrt(2*72592.5925925926/0.0654498469497708-903.503751814138/4.0) + +variable dt equal ${tcol}*0.05 +variable dt equal 0.00210943016014969*0.05 +timestep ${dt} +timestep 0.000105471508007485 + +############################################### +variable dumpfreq equal 1000 +variable logfreq equal 1000 + +newton off +atom_style sphere + +boundary p p f + +region boxreg block ${xlo} ${xhi} ${ylo} ${yhi} ${zlo} ${zhi} +region boxreg block 10 ${xhi} ${ylo} ${yhi} ${zlo} ${zhi} +region boxreg block 10 40 ${ylo} ${yhi} ${zlo} ${zhi} +region boxreg block 10 40 10 ${yhi} ${zlo} ${zhi} +region boxreg block 10 40 10 40 ${zlo} ${zhi} +region boxreg block 10 40 10 40 -20 ${zhi} +region boxreg block 10 40 10 40 -20 50 +create_box 1 boxreg +Created orthogonal box = (10 10 -20) to (40 40 50) + 1 by 1 by 1 MPI processor grid + +pair_style gran/hertz/history ${kn} ${kt} ${gamma_n} ${gamma_t} ${coeffFric} 1 +pair_style gran/hertz/history 72592.5925925926 ${kt} ${gamma_n} ${gamma_t} ${coeffFric} 1 +pair_style gran/hertz/history 72592.5925925926 90740.7407407408 ${gamma_n} ${gamma_t} ${coeffFric} 1 +pair_style gran/hertz/history 72592.5925925926 90740.7407407408 903.503751814138 ${gamma_t} ${coeffFric} 1 +pair_style gran/hertz/history 72592.5925925926 90740.7407407408 903.503751814138 451.751875907069 ${coeffFric} 1 +pair_style gran/hertz/history 72592.5925925926 90740.7407407408 903.503751814138 451.751875907069 0.5 1 +pair_coeff * * + +neighbor ${skin} bin +neighbor 0.5 bin +thermo ${logfreq} +thermo 1000 + +comm_style brick +comm_modify mode multi group all vel yes +balance 1.1 shift xyz 20 1.1 +Neighbor list info ... + 2 neighbor list requests + update every 1 steps, delay 10 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 0 + ghost atom cutoff = 0 + binsize = 30 -> bins = 1 1 3 +fix bal all balance 10000 1.1 shift xyz 20 1.01 + +####################### Options specific to pouring ######################### + +# insertion region for fix/pour + +region insreg cylinder z ${xc} ${yc} 10 30 50 side in units box +region insreg cylinder z 25 ${yc} 10 30 50 side in units box +region insreg cylinder z 25 25 10 30 50 side in units box + +# define cone and cylinder regions - see lammps doc on region command +# note new open options + +region cylreg cylinder z ${xc} ${yc} ${radconelo} ${zcyllo} ${zconelo} side in units box open 2 #Top is open +region cylreg cylinder z 25 ${yc} ${radconelo} ${zcyllo} ${zconelo} side in units box open 2 +region cylreg cylinder z 25 25 ${radconelo} ${zcyllo} ${zconelo} side in units box open 2 +region cylreg cylinder z 25 25 2 ${zcyllo} ${zconelo} side in units box open 2 +region cylreg cylinder z 25 25 2 0 ${zconelo} side in units box open 2 +region cylreg cylinder z 25 25 2 0 10 side in units box open 2 + +region conereg cone z ${xc} ${yc} ${radconelo} ${radconehi} ${zconelo} ${zconehi} side in units box open 1 open 2 #Bottom and top are open +region conereg cone z 25 ${yc} ${radconelo} ${radconehi} ${zconelo} ${zconehi} side in units box open 1 open 2 +region conereg cone z 25 25 ${radconelo} ${radconehi} ${zconelo} ${zconehi} side in units box open 1 open 2 +region conereg cone z 25 25 2 ${radconehi} ${zconelo} ${zconehi} side in units box open 1 open 2 +region conereg cone z 25 25 2 20 ${zconelo} ${zconehi} side in units box open 1 open 2 +region conereg cone z 25 25 2 20 10 ${zconehi} side in units box open 1 open 2 +region conereg cone z 25 25 2 20 10 50 side in units box open 1 open 2 + +region hopreg union 2 conereg cylreg + +fix grav all gravity ${gravity} vector 0 0 -1 +fix grav all gravity 1 vector 0 0 -1 +fix 1 all nve/sphere + + +fix hopper3 all wall/gran/region hertz/history ${kn} ${kt} ${gamma_n} ${gamma_t} ${coeffFric} 1 region hopreg +fix hopper3 all wall/gran/region hertz/history 72592.5925925926 ${kt} ${gamma_n} ${gamma_t} ${coeffFric} 1 region hopreg +fix hopper3 all wall/gran/region hertz/history 72592.5925925926 90740.7407407408 ${gamma_n} ${gamma_t} ${coeffFric} 1 region hopreg +fix hopper3 all wall/gran/region hertz/history 72592.5925925926 90740.7407407408 903.503751814138 ${gamma_t} ${coeffFric} 1 region hopreg +fix hopper3 all wall/gran/region hertz/history 72592.5925925926 90740.7407407408 903.503751814138 451.751875907069 ${coeffFric} 1 region hopreg +fix hopper3 all wall/gran/region hertz/history 72592.5925925926 90740.7407407408 903.503751814138 451.751875907069 0.5 1 region hopreg + +fix ins all pour 2000 1 42424 region insreg diam range ${dlo} ${dhi} dens ${density} ${density} +fix ins all pour 2000 1 42424 region insreg diam range 0.5 ${dhi} dens ${density} ${density} +fix ins all pour 2000 1 42424 region insreg diam range 0.5 1 dens ${density} ${density} +fix ins all pour 2000 1 42424 region insreg diam range 0.5 1 dens 1 ${density} +fix ins all pour 2000 1 42424 region insreg diam range 0.5 1 dens 1 1 +Particle insertion: 3000 every 59965 steps, 2000 by step 1 + +#dump 1 all custom ${dumpfreq} ${name}.dump # id type mass diameter x y z + +#dump 2 all image 4000 image.*.jpg type type # axes yes 0.8 0.02 view 60 -30 zoom 3.0 # box no 0.0 axes no 0.0 0.0 +#dump_modify 2 pad 6 + +thermo_style custom step cpu atoms ke +WARNING: New thermo_style command, previous thermo_modify settings will be lost (../output.cpp:690) +thermo_modify flush yes lost warn + +# Initial run to fill up the cone + +run 20000 +Neighbor list info ... + 2 neighbor list requests + update every 1 steps, delay 10 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 1.5 + ghost atom cutoff = 1.5 + binsize = 0.75 -> bins = 40 40 94 +Memory usage per processor = 3.59417 Mbytes +Step CPU Atoms KinEng + 0 0 0 -0 + 1000 0.54582715 2000 -0 + 2000 0.93155909 2000 -0 + 3000 1.3159981 2000 -0 + 4000 1.697911 2000 -0 + 5000 2.080133 2000 -0 + 6000 2.461525 2000 -0 + 7000 2.842278 2000 -0 + 8000 3.222302 2000 -0 + 9000 3.6018171 2000 -0 + 10000 3.9843922 2000 -0 + 11000 4.363066 2000 -0 + 12000 4.743022 2000 -0 + 13000 5.121953 2000 -0 + 14000 5.5021431 2000 -0 + 15000 5.8807089 2000 -0 + 16000 6.2604752 2000 -0 + 17000 6.640244 2000 -0 + 18000 7.0199981 2000 -0 + 19000 7.40029 2000 -0 + 20000 7.7834539 2000 -0 +Loop time of 7.78348 on 1 procs for 20000 steps with 2000 atoms + +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 | 0.64588 | 0.64588 | 0.64588 | 0.0 | 8.30 +Neigh | 0.097229 | 0.097229 | 0.097229 | 0.0 | 1.25 +Comm | 0.011505 | 0.011505 | 0.011505 | 0.0 | 0.15 +Output | 0.00041127 | 0.00041127 | 0.00041127 | 0.0 | 0.01 +Modify | 6.8117 | 6.8117 | 6.8117 | 0.0 | 87.51 +Other | | 0.2168 | | | 2.79 + +Nlocal: 2000 ave 2000 max 2000 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 0 ave 0 max 0 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 1537 ave 1537 max 1537 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 1537 +Ave neighs/atom = 0.7685 +Neighbor list builds = 69 +Dangerous builds = 0 +unfix ins +run 150000 +Neighbor list info ... + 2 neighbor list requests + update every 1 steps, delay 10 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 1.49993 + ghost atom cutoff = 1.49993 + binsize = 0.749963 -> bins = 41 41 94 +Memory usage per processor = 9.40639 Mbytes +Step CPU Atoms KinEng + 20000 0 2000 6443.7665 + 21000 0.37979388 2000 6572.3531 + 22000 0.76149178 2000 6723.8376 + 23000 1.1449339 2000 6853.1812 + 24000 1.529017 2000 6976.0209 + 25000 1.9145579 2000 7096.9955 + 26000 2.30124 2000 7215.5795 + 27000 2.6893978 2000 7349.2382 + 28000 3.0777299 2000 7471.8719 + 29000 3.4699018 2000 7574.7988 + 30000 3.8656738 2000 7660.2353 + 31000 4.2606828 2000 7703.5736 + 32000 4.6632309 2000 7643.5299 + 33000 5.0728998 2000 7520.14 + 34000 5.4878559 2000 7372.2247 + 35000 5.910604 2000 7192.1639 + 36000 6.340683 2000 6985.7075 + 37000 6.8159268 2000 6858.944 + 38000 7.2553098 2000 6717.0485 + 39000 7.699847 2000 6541.6874 + 40000 8.1524599 2000 6382.1661 + 41000 8.6083429 2000 6235.6681 + 42000 9.0669999 2000 6103.095 + 43000 9.5359929 2000 5951.0523 + 44000 10.012767 2000 5811.0158 + 45000 10.497891 2000 5627.7273 + 46000 10.988827 2000 5471.7262 + 47000 11.48741 2000 5299.1205 + 48000 11.990619 2000 5164.1642 + 49000 12.497663 2000 5006.5014 + 50000 13.020399 2000 4872.2336 + 51000 13.548012 2000 4694.5332 + 52000 14.082238 2000 4515.5164 + 53000 14.622731 2000 4384.7531 + 54000 15.170292 2000 4215.1354 + 55000 15.721908 2000 4063.0658 + 56000 16.285099 2000 3895.7872 + 57000 16.858606 2000 3693.0537 + 58000 17.440427 2000 3514.887 + 59000 18.03239 2000 3268.5625 + 60000 18.640969 2000 3049.7365 + 61000 19.245721 2000 2885.6786 + 62000 19.85574 2000 2652.9108 + 63000 20.47405 2000 2408.6484 + 64000 21.10165 2000 2126.9549 + 65000 21.743939 2000 1879.2829 + 66000 22.39462 2000 1645.0406 + 67000 23.059044 2000 1425.8023 + 68000 23.730976 2000 1160.2206 + 69000 24.410132 2000 961.78467 + 70000 25.096468 2000 785.64232 + 71000 25.778622 2000 626.09642 + 72000 26.474474 2000 468.40645 + 73000 27.171065 2000 358.58331 + 74000 27.860177 2000 299.43443 + 75000 28.544588 2000 246.40717 + 76000 29.226358 2000 206.30408 + 77000 29.902697 2000 176.97739 + 78000 30.577693 2000 144.25328 + 79000 31.269697 2000 115.11502 + 80000 31.977588 2000 97.780887 + 81000 32.685445 2000 82.593472 + 82000 33.397946 2000 72.226521 + 83000 34.114464 2000 62.978026 + 84000 34.831341 2000 55.350711 + 85000 35.545558 2000 51.162661 + 86000 36.266238 2000 46.100957 + 87000 36.99804 2000 41.19148 + 88000 37.743379 2000 36.31567 + 89000 38.499655 2000 32.456379 + 90000 39.270287 2000 30.16589 + 91000 40.035401 2000 27.36473 + 92000 40.799095 2000 25.488138 + 93000 41.564371 2000 23.674866 + 94000 42.335499 2000 22.219066 + 95000 43.114508 2000 20.982603 + 96000 43.897793 2000 19.840979 + 97000 44.685675 2000 19.092279 + 98000 45.483452 2000 18.20277 + 99000 46.282718 2000 17.512786 + 100000 47.085373 2000 16.921053 + 101000 47.888376 2000 16.228234 + 102000 48.698546 2000 15.958752 + 103000 49.51312 2000 15.640913 + 104000 50.330832 2000 14.016542 + 105000 51.146589 2000 13.484725 + 106000 51.96128 2000 13.369222 + 107000 52.781047 2000 12.965898 + 108000 53.604374 2000 12.268212 + 109000 54.424389 2000 11.492904 + 110000 55.253544 2000 11.110936 + 111000 56.077677 2000 10.05383 + 112000 56.904333 2000 10.159311 + 113000 57.729366 2000 10.071694 + 114000 58.559509 2000 9.820289 + 115000 59.391732 2000 9.4736012 + 116000 60.221045 2000 9.5616457 + 117000 61.052557 2000 8.6478552 + 118000 61.890195 2000 8.7425719 + 119000 62.726358 2000 8.4741204 + 120000 63.565646 2000 7.772287 + 121000 64.397804 2000 6.9466866 + 122000 65.231394 2000 6.7645153 + 123000 66.064887 2000 6.6568629 + 124000 66.901915 2000 6.7578346 + 125000 67.741833 2000 6.7845523 + 126000 68.582414 2000 6.8385357 + 127000 69.421944 2000 6.8984218 + 128000 70.262972 2000 7.031649 + 129000 71.108668 2000 6.5894805 + 130000 71.954121 2000 6.6452991 + 131000 72.795366 2000 6.7278453 + 132000 73.639866 2000 6.679577 + 133000 74.484945 2000 6.8049542 + 134000 75.326506 2000 6.9015567 + 135000 76.171268 2000 7.2052436 + 136000 77.015739 2000 7.5532841 + 137000 77.861613 2000 7.2577958 + 138000 78.706479 2000 7.5218509 + 139000 79.549466 2000 7.5221639 + 140000 80.398284 2000 7.6657717 + 141000 81.240794 2000 7.9761942 + 142000 82.087164 2000 8.2314258 + 143000 82.931215 2000 8.3019975 + 144000 83.777896 2000 8.0179905 + 145000 84.622383 2000 8.2517491 + 146000 85.469753 2000 6.9481522 + 147000 86.315756 2000 6.6131212 + 148000 87.164711 2000 6.7706881 + 149000 88.012004 2000 6.8104528 + 150000 88.861557 2000 6.7339102 + 151000 89.708494 2000 6.4777998 + 152000 90.558437 2000 6.3011889 + 153000 91.40365 2000 6.3101502 + 154000 92.249997 2000 6.5542552 + 155000 93.099774 2000 6.7687268 + 156000 93.945557 2000 6.7974687 + 157000 94.795065 2000 6.4615869 + 158000 95.645761 2000 6.5566144 + 159000 96.495711 2000 6.4371 + 160000 97.349979 2000 6.4540668 + 161000 98.19875 2000 6.6987231 + 162000 99.049934 2000 6.2464506 + 163000 99.902813 2000 4.7573102 + 164000 100.75416 2000 4.7782706 + 165000 101.60479 2000 4.9414064 + 166000 102.45183 2000 4.970526 + 167000 103.30172 2000 5.1492473 + 168000 104.15283 2000 5.3633229 + 169000 105.00583 2000 4.3464936 + 170000 105.85919 2000 3.6784016 +Loop time of 105.859 on 1 procs for 150000 steps with 2000 atoms + +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 | 46.786 | 46.786 | 46.786 | -nan | 44.20 +Neigh | 0.88556 | 0.88556 | 0.88556 | 0.0 | 0.84 +Comm | 0.080127 | 0.080127 | 0.080127 | 0.0 | 0.08 +Output | 0.0033967 | 0.0033967 | 0.0033967 | 0.0 | 0.00 +Modify | 56.418 | 56.418 | 56.418 | 0.0 | 53.29 +Other | | 1.687 | | | 1.59 + +Nlocal: 2000 ave 2000 max 2000 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 0 ave 0 max 0 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 15507 ave 15507 max 15507 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 15507 +Ave neighs/atom = 7.7535 +Neighbor list builds = 401 +Dangerous builds = 0 + +# remove "plug" - need to redefine cylinder region & union + +region cylreg delete +region hopreg delete +region cylreg cylinder z ${xc} ${yc} ${radconelo} ${zcyllo} ${zconelo} side in units box open 1 open 2 #Bottom & top are open +region cylreg cylinder z 25 ${yc} ${radconelo} ${zcyllo} ${zconelo} side in units box open 1 open 2 +region cylreg cylinder z 25 25 ${radconelo} ${zcyllo} ${zconelo} side in units box open 1 open 2 +region cylreg cylinder z 25 25 2 ${zcyllo} ${zconelo} side in units box open 1 open 2 +region cylreg cylinder z 25 25 2 0 ${zconelo} side in units box open 1 open 2 +region cylreg cylinder z 25 25 2 0 10 side in units box open 1 open 2 + +region hopreg union 2 cylreg conereg + +unfix hopper3 +fix hopper3 all wall/gran/region hertz/history ${kn} ${kt} ${gamma_n} ${gamma_t} ${coeffFric} 1 region hopreg +fix hopper3 all wall/gran/region hertz/history 72592.5925925926 ${kt} ${gamma_n} ${gamma_t} ${coeffFric} 1 region hopreg +fix hopper3 all wall/gran/region hertz/history 72592.5925925926 90740.7407407408 ${gamma_n} ${gamma_t} ${coeffFric} 1 region hopreg +fix hopper3 all wall/gran/region hertz/history 72592.5925925926 90740.7407407408 903.503751814138 ${gamma_t} ${coeffFric} 1 region hopreg +fix hopper3 all wall/gran/region hertz/history 72592.5925925926 90740.7407407408 903.503751814138 451.751875907069 ${coeffFric} 1 region hopreg +fix hopper3 all wall/gran/region hertz/history 72592.5925925926 90740.7407407408 903.503751814138 451.751875907069 0.5 1 region hopreg + +run 100000 +Memory usage per processor = 9.40667 Mbytes +Step CPU Atoms KinEng + 170000 0 2000 3.6784016 + 171000 0.84847808 2000 4.3936331 + 172000 1.6901879 2000 5.5750342 + 173000 2.523411 2000 6.8205762 + 174000 3.3501492 2000 8.9700613 + 175000 4.1766891 2000 11.336633 + 176000 4.9954321 2000 14.225242 + 177000 5.814229 2000 17.653262 + 178000 6.630548 2000 21.796078 + 179000 7.4493361 2000 26.660801 + 180000 8.2656369 2000 32.428193 + 181000 9.069953 2000 39.229088 + 182000 9.8759181 2000 46.242732 + 183000 10.674972 2000 54.604245 + 184000 11.47082 2000 63.96931 + 185000 12.259916 2000 74.132316 + 186000 13.046788 2000 84.690798 + 187000 13.832446 2000 95.486707 + 188000 14.612976 2000 106.68052 + 189000 15.391779 2000 118.91376 + 190000 16.160107 2000 131.90023 + 191000 16.919573 2000 146.30664 + 192000 17.677855 2000 161.10142 + 193000 18.4352 2000 174.91947 + 194000 19.188156 2000 191.47629 + 195000 19.937255 2000 208.19912 + 196000 20.687716 2000 224.80045 + 197000 21.43754 2000 243.29637 + 198000 22.18579 2000 262.88685 + 199000 22.932473 2000 282.34797 + 200000 23.680828 2000 302.78689 + 201000 24.428559 2000 323.48767 + 202000 25.167341 2000 345.99414 + 203000 25.904465 2000 368.54389 + 204000 26.635727 2000 393.49643 + 205000 27.366891 2000 417.82722 + 206000 28.094282 2000 443.67976 + 207000 28.821021 2000 470.35934 + 208000 29.545596 2000 499.01368 + 209000 30.267439 2000 528.99746 + 210000 30.993287 2000 561.03931 + 211000 31.713729 2000 594.0482 + 212000 32.42933 2000 628.20118 + 213000 33.14608 2000 662.585 + 214000 33.863882 2000 697.41408 + 215000 34.580495 2000 733.36799 + 216000 35.302571 2000 770.46796 + 217000 36.023821 2000 806.72007 + 218000 36.74189 2000 844.06965 + 219000 37.460105 2000 884.31774 + 220000 38.177705 2000 926.23771 + 221000 38.886587 2000 970.02095 + 222000 39.594003 2000 1015.3938 + 223000 40.29579 2000 1061.1281 + 224000 41.001112 2000 1107.9962 + 225000 41.706489 2000 1155.3656 + 226000 42.417622 1998 1196.6939 + 227000 43.133238 1996 1240.8434 + 228000 43.844991 1990 1260.0436 + 229000 44.545565 1986 1280.0431 + 230000 45.246651 1974 1285.222 + 231000 45.934355 1970 1311.8189 + 232000 46.624066 1960 1300.7922 + 233000 47.310339 1943 1282.113 + 234000 47.993433 1932 1261.0871 + 235000 48.66937 1918 1211.0667 + 236000 49.332954 1911 1232.6411 + 237000 49.99742 1898 1209.112 + 238000 50.664096 1888 1189.4002 + 239000 51.336205 1875 1151.415 + 240000 52.010198 1863 1108.0821 + 241000 52.680788 1856 1090.2279 + 242000 53.343069 1843 1062.9726 + 243000 53.996768 1830 1016.0933 + 244000 54.635882 1825 1023.5568 + 245000 55.271259 1817 1012.2897 + 246000 55.902793 1811 1019.8355 + 247000 56.541437 1802 996.81934 + 248000 57.182244 1793 971.29353 + 249000 57.827453 1785 947.98166 + 250000 58.473311 1771 898.58408 + 251000 59.1075 1762 851.46342 + 252000 59.73473 1754 826.46301 + 253000 60.362094 1747 808.08292 + 254000 60.989489 1737 778.86892 + 255000 61.616293 1720 702.90046 + 256000 62.243096 1709 665.14293 + 257000 62.866596 1703 628.63036 + 258000 63.48969 1702 645.42118 + 259000 64.119075 1696 617.03362 + 260000 64.752187 1692 607.96874 + 261000 65.374973 1690 619.83155 + 262000 65.991365 1688 622.09585 + 263000 66.608686 1682 612.86762 + 264000 67.220696 1681 636.53769 + 265000 67.830797 1678 638.33305 + 266000 68.439964 1675 635.97419 + 267000 69.043459 1672 634.91103 + 268000 69.643043 1669 638.50196 + 269000 70.250146 1667 646.16045 + 270000 70.86361 1664 659.62209 +Loop time of 70.8636 on 1 procs for 100000 steps with 1664 atoms + +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 | 33.501 | 33.501 | 33.501 | 0.0 | 47.27 +Neigh | 0.63279 | 0.63279 | 0.63279 | 0.0 | 0.89 +Comm | 0.055495 | 0.055495 | 0.055495 | 0.0 | 0.08 +Output | 0.0021648 | 0.0021648 | 0.0021648 | 0.0 | 0.00 +Modify | 35.602 | 35.602 | 35.602 | 0.0 | 50.24 +Other | | 1.07 | | | 1.51 + +Nlocal: 1664 ave 1664 max 1664 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 0 ave 0 max 0 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 11687 ave 11687 max 11687 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 11687 +Ave neighs/atom = 7.02344 +Neighbor list builds = 261 +Dangerous builds = 0 +Total wall time: 0:03:04 diff --git a/examples/granregion/log.6Oct16.granregion.funnel.g++.4 b/examples/granregion/log.6Oct16.granregion.funnel.g++.4 new file mode 100644 index 0000000000..fcbd050b76 --- /dev/null +++ b/examples/granregion/log.6Oct16.granregion.funnel.g++.4 @@ -0,0 +1,608 @@ +LAMMPS (5 Oct 2016) +# pour particles into cone-shaped funnel, settle them, let them run out bottom + +variable name string funnel_pour + +thermo_modify flush yes +units si +variable PI equal 3.141592653589 +variable seed equal 14314 + +############################################### +# Geometry-related parameters +############################################### + +variable xlo equal 10 +variable xhi equal 40 +variable ylo equal 10 +variable yhi equal 40 +variable zlo equal -20 +variable zhi equal 50 + +variable xc equal 25 +variable yc equal 25 + +variable zconehi equal 50 +variable zconelo equal 10 +variable zcyllo equal 0 +variable radconelo equal 2 +variable radconehi equal 20 + +################################################ +# Particle sizes +################################################ + +variable rlo equal 0.25 +variable rhi equal 0.5 +variable dlo equal 2.0*${rlo} +variable dlo equal 2.0*0.25 +variable dhi equal 2.0*${rhi} +variable dhi equal 2.0*0.5 + +variable skin equal ${rhi} +variable skin equal 0.5 + +############################################### +# Granular contact parameters +############################################### + +variable coeffRes equal 0.1 +variable coeffFric equal 0.5 + +variable density equal 1.0 +variable EYoung equal 10^5 +variable Poisson equal 2.0/7.0 +variable GShear equal ${EYoung}/(2*(1+${Poisson})) +variable GShear equal 100000/(2*(1+${Poisson})) +variable GShear equal 100000/(2*(1+0.285714285714286)) + +variable gravity equal 1.0 + +variable reff equal 0.5*(${rhi}+${rlo}) +variable reff equal 0.5*(0.5+${rlo}) +variable reff equal 0.5*(0.5+0.25) +variable meff equal ${density}*4.0/3.0*${PI}*${reff}^3 +variable meff equal 1*4.0/3.0*${PI}*${reff}^3 +variable meff equal 1*4.0/3.0*3.141592653589*${reff}^3 +variable meff equal 1*4.0/3.0*3.141592653589*0.375^3 +variable min_mass equal ${density}*4.0/3.0*${PI}*${rlo}*${rlo}*${rlo} +variable min_mass equal 1*4.0/3.0*${PI}*${rlo}*${rlo}*${rlo} +variable min_mass equal 1*4.0/3.0*3.141592653589*${rlo}*${rlo}*${rlo} +variable min_mass equal 1*4.0/3.0*3.141592653589*0.25*${rlo}*${rlo} +variable min_mass equal 1*4.0/3.0*3.141592653589*0.25*0.25*${rlo} +variable min_mass equal 1*4.0/3.0*3.141592653589*0.25*0.25*0.25 +variable max_mass equal ${density}*4.0/3.0*${PI}*${rhi}*${rhi}*${rhi} +variable max_mass equal 1*4.0/3.0*${PI}*${rhi}*${rhi}*${rhi} +variable max_mass equal 1*4.0/3.0*3.141592653589*${rhi}*${rhi}*${rhi} +variable max_mass equal 1*4.0/3.0*3.141592653589*0.5*${rhi}*${rhi} +variable max_mass equal 1*4.0/3.0*3.141592653589*0.5*0.5*${rhi} +variable max_mass equal 1*4.0/3.0*3.141592653589*0.5*0.5*0.5 + +## Typical way to set kn, kt, etc.: +variable kn equal 4.0*${GShear}/(3*(1-${Poisson})) +variable kn equal 4.0*38888.8888888889/(3*(1-${Poisson})) +variable kn equal 4.0*38888.8888888889/(3*(1-0.285714285714286)) +variable kt equal 4.0*${GShear}/(2-${Poisson}) +variable kt equal 4.0*38888.8888888889/(2-${Poisson}) +variable kt equal 4.0*38888.8888888889/(2-0.285714285714286) + +variable a equal (-2.0*log(${coeffRes})/${PI})^2 +variable a equal (-2.0*log(0.1)/${PI})^2 +variable a equal (-2.0*log(0.1)/3.141592653589)^2 +variable gamma_n equal sqrt($a*2*${kn}/${min_mass}/(1+0.25*$a)) +variable gamma_n equal sqrt(0.405284734569556*2*${kn}/${min_mass}/(1+0.25*$a)) +variable gamma_n equal sqrt(0.405284734569556*2*72592.5925925926/${min_mass}/(1+0.25*$a)) +variable gamma_n equal sqrt(0.405284734569556*2*72592.5925925926/0.0654498469497708/(1+0.25*$a)) +variable gamma_n equal sqrt(0.405284734569556*2*72592.5925925926/0.0654498469497708/(1+0.25*0.405284734569556)) +variable gamma_t equal ${gamma_n}*0.5 +variable gamma_t equal 903.503751814138*0.5 + +variable tcol equal ${PI}/sqrt(2*${kn}/${min_mass}-${gamma_n}/4.0) +variable tcol equal 3.141592653589/sqrt(2*${kn}/${min_mass}-${gamma_n}/4.0) +variable tcol equal 3.141592653589/sqrt(2*72592.5925925926/${min_mass}-${gamma_n}/4.0) +variable tcol equal 3.141592653589/sqrt(2*72592.5925925926/0.0654498469497708-${gamma_n}/4.0) +variable tcol equal 3.141592653589/sqrt(2*72592.5925925926/0.0654498469497708-903.503751814138/4.0) + +variable dt equal ${tcol}*0.05 +variable dt equal 0.00210943016014969*0.05 +timestep ${dt} +timestep 0.000105471508007485 + +############################################### +variable dumpfreq equal 1000 +variable logfreq equal 1000 + +newton off +atom_style sphere + +boundary p p f + +region boxreg block ${xlo} ${xhi} ${ylo} ${yhi} ${zlo} ${zhi} +region boxreg block 10 ${xhi} ${ylo} ${yhi} ${zlo} ${zhi} +region boxreg block 10 40 ${ylo} ${yhi} ${zlo} ${zhi} +region boxreg block 10 40 10 ${yhi} ${zlo} ${zhi} +region boxreg block 10 40 10 40 ${zlo} ${zhi} +region boxreg block 10 40 10 40 -20 ${zhi} +region boxreg block 10 40 10 40 -20 50 +create_box 1 boxreg +Created orthogonal box = (10 10 -20) to (40 40 50) + 1 by 1 by 4 MPI processor grid + +pair_style gran/hertz/history ${kn} ${kt} ${gamma_n} ${gamma_t} ${coeffFric} 1 +pair_style gran/hertz/history 72592.5925925926 ${kt} ${gamma_n} ${gamma_t} ${coeffFric} 1 +pair_style gran/hertz/history 72592.5925925926 90740.7407407408 ${gamma_n} ${gamma_t} ${coeffFric} 1 +pair_style gran/hertz/history 72592.5925925926 90740.7407407408 903.503751814138 ${gamma_t} ${coeffFric} 1 +pair_style gran/hertz/history 72592.5925925926 90740.7407407408 903.503751814138 451.751875907069 ${coeffFric} 1 +pair_style gran/hertz/history 72592.5925925926 90740.7407407408 903.503751814138 451.751875907069 0.5 1 +pair_coeff * * + +neighbor ${skin} bin +neighbor 0.5 bin +thermo ${logfreq} +thermo 1000 + +comm_style brick +comm_modify mode multi group all vel yes +balance 1.1 shift xyz 20 1.1 +Neighbor list info ... + 2 neighbor list requests + update every 1 steps, delay 10 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 0 + ghost atom cutoff = 0 + binsize = 30 -> bins = 1 1 3 +fix bal all balance 10000 1.1 shift xyz 20 1.01 + +####################### Options specific to pouring ######################### + +# insertion region for fix/pour + +region insreg cylinder z ${xc} ${yc} 10 30 50 side in units box +region insreg cylinder z 25 ${yc} 10 30 50 side in units box +region insreg cylinder z 25 25 10 30 50 side in units box + +# define cone and cylinder regions - see lammps doc on region command +# note new open options + +region cylreg cylinder z ${xc} ${yc} ${radconelo} ${zcyllo} ${zconelo} side in units box open 2 #Top is open +region cylreg cylinder z 25 ${yc} ${radconelo} ${zcyllo} ${zconelo} side in units box open 2 +region cylreg cylinder z 25 25 ${radconelo} ${zcyllo} ${zconelo} side in units box open 2 +region cylreg cylinder z 25 25 2 ${zcyllo} ${zconelo} side in units box open 2 +region cylreg cylinder z 25 25 2 0 ${zconelo} side in units box open 2 +region cylreg cylinder z 25 25 2 0 10 side in units box open 2 + +region conereg cone z ${xc} ${yc} ${radconelo} ${radconehi} ${zconelo} ${zconehi} side in units box open 1 open 2 #Bottom and top are open +region conereg cone z 25 ${yc} ${radconelo} ${radconehi} ${zconelo} ${zconehi} side in units box open 1 open 2 +region conereg cone z 25 25 ${radconelo} ${radconehi} ${zconelo} ${zconehi} side in units box open 1 open 2 +region conereg cone z 25 25 2 ${radconehi} ${zconelo} ${zconehi} side in units box open 1 open 2 +region conereg cone z 25 25 2 20 ${zconelo} ${zconehi} side in units box open 1 open 2 +region conereg cone z 25 25 2 20 10 ${zconehi} side in units box open 1 open 2 +region conereg cone z 25 25 2 20 10 50 side in units box open 1 open 2 + +region hopreg union 2 conereg cylreg + +fix grav all gravity ${gravity} vector 0 0 -1 +fix grav all gravity 1 vector 0 0 -1 +fix 1 all nve/sphere + + +fix hopper3 all wall/gran/region hertz/history ${kn} ${kt} ${gamma_n} ${gamma_t} ${coeffFric} 1 region hopreg +fix hopper3 all wall/gran/region hertz/history 72592.5925925926 ${kt} ${gamma_n} ${gamma_t} ${coeffFric} 1 region hopreg +fix hopper3 all wall/gran/region hertz/history 72592.5925925926 90740.7407407408 ${gamma_n} ${gamma_t} ${coeffFric} 1 region hopreg +fix hopper3 all wall/gran/region hertz/history 72592.5925925926 90740.7407407408 903.503751814138 ${gamma_t} ${coeffFric} 1 region hopreg +fix hopper3 all wall/gran/region hertz/history 72592.5925925926 90740.7407407408 903.503751814138 451.751875907069 ${coeffFric} 1 region hopreg +fix hopper3 all wall/gran/region hertz/history 72592.5925925926 90740.7407407408 903.503751814138 451.751875907069 0.5 1 region hopreg + +fix ins all pour 2000 1 42424 region insreg diam range ${dlo} ${dhi} dens ${density} ${density} +fix ins all pour 2000 1 42424 region insreg diam range 0.5 ${dhi} dens ${density} ${density} +fix ins all pour 2000 1 42424 region insreg diam range 0.5 1 dens ${density} ${density} +fix ins all pour 2000 1 42424 region insreg diam range 0.5 1 dens 1 ${density} +fix ins all pour 2000 1 42424 region insreg diam range 0.5 1 dens 1 1 +Particle insertion: 3000 every 59965 steps, 2000 by step 1 + +#dump 1 all custom ${dumpfreq} ${name}.dump # id type mass diameter x y z + +#dump 2 all image 4000 image.*.jpg type type # axes yes 0.8 0.02 view 60 -30 zoom 3.0 # box no 0.0 axes no 0.0 0.0 +#dump_modify 2 pad 6 + +thermo_style custom step cpu atoms ke +WARNING: New thermo_style command, previous thermo_modify settings will be lost (../output.cpp:690) +thermo_modify flush yes lost warn + +# Initial run to fill up the cone + +run 20000 +Neighbor list info ... + 2 neighbor list requests + update every 1 steps, delay 10 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 1.5 + ghost atom cutoff = 1.5 + binsize = 0.75 -> bins = 40 40 94 +Memory usage per processor = 2.99539 Mbytes +Step CPU Atoms KinEng + 0 0 0 -0 + 1000 0.53632808 2000 -0 + 2000 0.90599012 2000 -0 + 3000 1.2640941 2000 -0 + 4000 1.6225331 2000 -0 + 5000 1.9735272 2000 -0 + 6000 2.3156731 2000 -0 + 7000 2.6499262 2000 -0 + 8000 2.9751072 2000 -0 + 9000 3.2918322 2000 -0 + 10000 3.597712 2000 -0 + 11000 3.7157061 2000 -0 + 12000 3.833451 2000 -0 + 13000 3.9541111 2000 -0 + 14000 4.081727 2000 -0 + 15000 4.2142782 2000 -0 + 16000 4.3530872 2000 -0 + 17000 4.4987361 2000 -0 + 18000 4.6507492 2000 -0 + 19000 4.807373 2000 -0 + 20000 4.9710512 2000 -0 +Loop time of 4.97109 on 4 procs for 20000 steps with 2000 atoms + +98.5% CPU use with 4 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.067799 | 0.17326 | 0.37341 | 28.4 | 3.49 +Neigh | 0.013881 | 0.025808 | 0.045841 | 7.5 | 0.52 +Comm | 0.078163 | 0.1808 | 0.2915 | 21.0 | 3.64 +Output | 0.0011413 | 0.0027029 | 0.0036721 | 1.8 | 0.05 +Modify | 1.0146 | 1.8605 | 3.562 | 73.8 | 37.43 +Other | | 2.728 | | | 54.88 + +Nlocal: 500 ave 505 max 493 min +Histogram: 1 0 0 0 0 1 0 1 0 1 +Nghost: 159.25 ave 254 max 71 min +Histogram: 1 0 0 1 0 1 0 0 0 1 +Neighs: 397.5 ave 616 max 214 min +Histogram: 1 0 1 0 0 0 1 0 0 1 + +Total # of neighbors = 1590 +Ave neighs/atom = 0.795 +Neighbor list builds = 69 +Dangerous builds = 0 +unfix ins +run 150000 +Neighbor list info ... + 2 neighbor list requests + update every 1 steps, delay 10 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 1.49993 + ghost atom cutoff = 1.49993 + binsize = 0.749963 -> bins = 41 41 94 +Memory usage per processor = 9.39737 Mbytes +Step CPU Atoms KinEng + 20000 0 2000 6443.7665 + 21000 0.11240888 2000 6572.3531 + 22000 0.23014092 2000 6723.8376 + 23000 0.35371184 2000 6853.1812 + 24000 0.4838469 2000 6976.0209 + 25000 0.62193394 2000 7096.9955 + 26000 0.76781893 2000 7215.5795 + 27000 0.92212081 2000 7349.2382 + 28000 1.0841098 2000 7471.8719 + 29000 1.2593179 2000 7574.7988 + 30000 1.4459748 2000 7660.2353 + 31000 1.5759299 2000 7703.5736 + 32000 1.7189329 2000 7643.5299 + 33000 1.876133 2000 7520.14 + 34000 2.0453629 2000 7372.2247 + 35000 2.2281299 2000 7192.1638 + 36000 2.4208269 2000 6985.7056 + 37000 2.6258228 2000 6858.9422 + 38000 2.839473 2000 6717.0655 + 39000 3.065336 2000 6541.5809 + 40000 3.3090389 2000 6381.8513 + 41000 3.4969938 2000 6236.4297 + 42000 3.6888108 2000 6104.2528 + 43000 3.8874888 2000 5951.0314 + 44000 4.0956569 2000 5819.0972 + 45000 4.312974 2000 5620.6457 + 46000 4.5343778 2000 5479.332 + 47000 4.757262 2000 5295.328 + 48000 4.9850328 2000 5179.9559 + 49000 5.2210319 2000 5022.5562 + 50000 5.4699879 2000 4899.1332 + 51000 5.6774018 2000 4699.4456 + 52000 5.8900218 2000 4522.5719 + 53000 6.110677 2000 4402.8664 + 54000 6.3361218 2000 4256.1664 + 55000 6.5778289 2000 4093.6265 + 56000 6.8319149 2000 3933.0179 + 57000 7.0925779 2000 3738.4628 + 58000 7.3578169 2000 3535.7866 + 59000 7.6344049 2000 3298.4079 + 60000 7.9258108 2000 3058.9356 + 61000 8.1758959 2000 2888.0074 + 62000 8.4278228 2000 2652.4613 + 63000 8.6815088 2000 2435.0991 + 64000 8.9371588 2000 2147.9441 + 65000 9.208025 2000 1898.0657 + 66000 9.4795358 2000 1650.5794 + 67000 9.7519388 2000 1425.7284 + 68000 10.025867 2000 1193.3786 + 69000 10.313816 2000 940.55767 + 70000 10.610488 2000 761.5312 + 71000 10.879718 2000 599.1989 + 72000 11.154029 2000 453.25929 + 73000 11.424376 2000 345.73222 + 74000 11.697359 2000 273.72167 + 75000 11.966099 2000 222.44251 + 76000 12.230213 2000 190.79993 + 77000 12.481982 2000 157.71153 + 78000 12.73433 2000 131.99208 + 79000 12.986017 2000 111.10589 + 80000 13.243904 2000 96.736337 + 81000 13.500538 2000 81.24169 + 82000 13.765755 2000 66.640863 + 83000 14.032985 2000 53.07725 + 84000 14.308284 2000 45.942738 + 85000 14.586721 2000 38.811918 + 86000 14.861759 2000 34.59113 + 87000 15.135665 2000 31.04487 + 88000 15.417487 2000 27.659144 + 89000 15.698281 2000 24.596119 + 90000 15.97969 2000 22.004865 + 91000 16.266118 2000 20.541665 + 92000 16.557007 2000 18.938077 + 93000 16.846745 2000 17.293956 + 94000 17.133408 2000 16.443596 + 95000 17.42023 2000 15.518083 + 96000 17.709025 2000 14.264343 + 97000 18.001337 2000 13.410217 + 98000 18.292414 2000 13.036621 + 99000 18.583887 2000 12.523214 + 100000 18.880312 2000 12.371509 + 101000 19.176964 2000 11.828077 + 102000 19.474371 2000 11.510333 + 103000 19.770957 2000 11.289304 + 104000 20.070744 2000 10.370661 + 105000 20.372617 2000 10.217921 + 106000 20.673949 2000 9.3275222 + 107000 20.9765 2000 8.9156372 + 108000 21.276062 2000 8.5850821 + 109000 21.585305 2000 8.5326934 + 110000 21.89079 2000 8.0579504 + 111000 22.194207 2000 8.1084595 + 112000 22.501593 2000 7.9190174 + 113000 22.81251 2000 8.0127499 + 114000 23.118514 2000 8.1791911 + 115000 23.432862 2000 8.3333032 + 116000 23.735549 2000 8.4833817 + 117000 24.038329 2000 8.315498 + 118000 24.343247 2000 7.9460007 + 119000 24.643288 2000 7.5922134 + 120000 24.94731 2000 7.4089143 + 121000 25.253605 2000 7.5790659 + 122000 25.56672 2000 7.3778204 + 123000 25.870958 2000 7.1384456 + 124000 26.180729 2000 6.9151887 + 125000 26.493089 2000 6.4671685 + 126000 26.806734 2000 5.6773128 + 127000 27.10969 2000 5.5603057 + 128000 27.410973 2000 5.6376136 + 129000 27.712398 2000 5.5578044 + 130000 28.015943 2000 5.4632646 + 131000 28.319002 2000 4.9669466 + 132000 28.620558 2000 5.0191026 + 133000 28.923233 2000 4.7146653 + 134000 29.235178 2000 4.4835803 + 135000 29.542816 2000 4.5469703 + 136000 29.8518 2000 4.3349926 + 137000 30.159096 2000 4.423031 + 138000 30.464283 2000 4.3680646 + 139000 30.769279 2000 4.2461787 + 140000 31.074457 2000 4.4140001 + 141000 31.380334 2000 4.3991236 + 142000 31.683855 2000 4.572989 + 143000 31.987308 2000 4.7601702 + 144000 32.28998 2000 4.7790587 + 145000 32.594971 2000 4.8127728 + 146000 32.89855 2000 4.8750003 + 147000 33.205142 2000 4.9830109 + 148000 33.509096 2000 4.9960037 + 149000 33.812951 2000 5.2151503 + 150000 34.117585 2000 5.2745187 + 151000 34.420995 2000 4.8959892 + 152000 34.725788 2000 4.7600627 + 153000 35.032001 2000 4.6944719 + 154000 35.337093 2000 4.7647384 + 155000 35.645299 2000 4.312228 + 156000 35.953225 2000 3.8513036 + 157000 36.258107 2000 3.8798947 + 158000 36.570122 2000 3.7116749 + 159000 36.880424 2000 3.7246469 + 160000 37.187331 2000 3.8165318 + 161000 37.491939 2000 3.8954595 + 162000 37.806365 2000 4.0109691 + 163000 38.122006 2000 3.3864369 + 164000 38.437246 2000 3.4533589 + 165000 38.753073 2000 3.4967205 + 166000 39.068713 2000 3.5758702 + 167000 39.376388 2000 2.8913997 + 168000 39.685628 2000 2.507523 + 169000 39.99294 2000 2.4910068 + 170000 40.302393 2000 2.4992886 +Loop time of 40.3024 on 4 procs for 150000 steps with 2000 atoms + +99.2% CPU use with 4 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 7.9352 | 13.451 | 15.947 | 88.7 | 33.37 +Neigh | 0.15394 | 0.23292 | 0.28243 | 10.0 | 0.58 +Comm | 2.1471 | 3.534 | 4.4671 | 47.3 | 8.77 +Output | 0.0070386 | 0.011774 | 0.021483 | 5.4 | 0.03 +Modify | 10.816 | 14.404 | 16.047 | 55.2 | 35.74 +Other | | 8.669 | | | 21.51 + +Nlocal: 500 ave 542 max 430 min +Histogram: 1 0 0 0 0 0 1 0 1 1 +Nghost: 449.5 ave 679 max 208 min +Histogram: 1 0 0 0 1 0 1 0 0 1 +Neighs: 4506.75 ave 5611 max 3508 min +Histogram: 1 0 1 0 0 0 1 0 0 1 + +Total # of neighbors = 18027 +Ave neighs/atom = 9.0135 +Neighbor list builds = 386 +Dangerous builds = 0 + +# remove "plug" - need to redefine cylinder region & union + +region cylreg delete +region hopreg delete +region cylreg cylinder z ${xc} ${yc} ${radconelo} ${zcyllo} ${zconelo} side in units box open 1 open 2 #Bottom & top are open +region cylreg cylinder z 25 ${yc} ${radconelo} ${zcyllo} ${zconelo} side in units box open 1 open 2 +region cylreg cylinder z 25 25 ${radconelo} ${zcyllo} ${zconelo} side in units box open 1 open 2 +region cylreg cylinder z 25 25 2 ${zcyllo} ${zconelo} side in units box open 1 open 2 +region cylreg cylinder z 25 25 2 0 ${zconelo} side in units box open 1 open 2 +region cylreg cylinder z 25 25 2 0 10 side in units box open 1 open 2 + +region hopreg union 2 cylreg conereg + +unfix hopper3 +fix hopper3 all wall/gran/region hertz/history ${kn} ${kt} ${gamma_n} ${gamma_t} ${coeffFric} 1 region hopreg +fix hopper3 all wall/gran/region hertz/history 72592.5925925926 ${kt} ${gamma_n} ${gamma_t} ${coeffFric} 1 region hopreg +fix hopper3 all wall/gran/region hertz/history 72592.5925925926 90740.7407407408 ${gamma_n} ${gamma_t} ${coeffFric} 1 region hopreg +fix hopper3 all wall/gran/region hertz/history 72592.5925925926 90740.7407407408 903.503751814138 ${gamma_t} ${coeffFric} 1 region hopreg +fix hopper3 all wall/gran/region hertz/history 72592.5925925926 90740.7407407408 903.503751814138 451.751875907069 ${coeffFric} 1 region hopreg +fix hopper3 all wall/gran/region hertz/history 72592.5925925926 90740.7407407408 903.503751814138 451.751875907069 0.5 1 region hopreg + +run 100000 +Memory usage per processor = 9.41929 Mbytes +Step CPU Atoms KinEng + 170000 0 2000 2.4992886 + 171000 0.30864286 2000 3.6052039 + 172000 0.62273479 2000 4.8584577 + 173000 0.94411087 2000 6.5620833 + 174000 1.2588799 2000 8.8636423 + 175000 1.574302 2000 11.743197 + 176000 1.888201 2000 15.60405 + 177000 2.1948938 2000 20.29426 + 178000 2.508261 2000 25.069266 + 179000 2.8257489 2000 31.340924 + 180000 3.1444538 2000 38.454779 + 181000 3.4541628 2000 46.488676 + 182000 3.7632799 2000 55.279578 + 183000 4.0711808 2000 65.192327 + 184000 4.386853 2000 75.466011 + 185000 4.7000408 2000 86.06934 + 186000 5.00436 2000 97.157035 + 187000 5.3041189 2000 108.92242 + 188000 5.601872 2000 120.88599 + 189000 5.9027078 2000 134.09884 + 190000 6.2037618 2000 148.60143 + 191000 6.4879329 2000 163.96898 + 192000 6.7703898 2000 180.32931 + 193000 7.0603459 2000 198.83575 + 194000 7.3395619 2000 217.46631 + 195000 7.6245389 2000 235.34916 + 196000 7.911685 2000 253.61893 + 197000 8.1976559 2000 271.3908 + 198000 8.483418 2000 289.60064 + 199000 8.7664149 2000 309.44306 + 200000 9.0593698 2000 331.9367 + 201000 9.3373818 2000 354.86646 + 202000 9.612149 2000 380.56766 + 203000 9.8876739 2000 406.97399 + 204000 10.152671 2000 435.69917 + 205000 10.415859 2000 465.1954 + 206000 10.67967 2000 494.6045 + 207000 10.941435 2000 522.71704 + 208000 11.205367 2000 550.56072 + 209000 11.471415 2000 580.10547 + 210000 11.738137 2000 610.36222 + 211000 12.006432 2000 641.99128 + 212000 12.270102 2000 676.0736 + 213000 12.531937 2000 711.70118 + 214000 12.797442 2000 747.84561 + 215000 13.062646 2000 785.59575 + 216000 13.33019 2000 826.36549 + 217000 13.598467 2000 868.35085 + 218000 13.863022 2000 911.07041 + 219000 14.127777 2000 953.70251 + 220000 14.391496 2000 997.5717 + 221000 14.655347 2000 1043.5565 + 222000 14.923357 2000 1090.7944 + 223000 15.193349 2000 1140.1324 + 224000 15.462326 2000 1190.6956 + 225000 15.729748 1999 1238.1536 + 226000 15.996867 1998 1286.8076 + 227000 16.261762 1995 1326.9895 + 228000 16.527382 1989 1349.5997 + 229000 16.788356 1984 1370.593 + 230000 17.05426 1968 1344.3763 + 231000 17.320126 1962 1363.7958 + 232000 17.58387 1949 1340.1482 + 233000 17.850221 1940 1348.409 + 234000 18.116595 1929 1335.9703 + 235000 18.383276 1918 1328.201 + 236000 18.650066 1905 1309.6469 + 237000 18.916963 1896 1292.9758 + 238000 19.185209 1884 1266.3598 + 239000 19.453402 1872 1221.0069 + 240000 19.722178 1855 1166.1488 + 241000 19.98987 1842 1126.9482 + 242000 20.257783 1828 1107.128 + 243000 20.523743 1815 1060.6573 + 244000 20.793404 1805 1026.0259 + 245000 21.061462 1797 1009.4924 + 246000 21.325574 1790 995.26136 + 247000 21.587046 1782 976.04886 + 248000 21.840234 1778 989.11589 + 249000 22.09455 1762 903.62508 + 250000 22.356228 1748 852.03257 + 251000 22.602243 1738 807.41049 + 252000 22.852106 1722 738.82529 + 253000 23.097209 1712 706.05657 + 254000 23.341263 1696 626.53135 + 255000 23.58614 1692 613.89548 + 256000 23.83122 1686 598.9367 + 257000 24.076937 1683 589.27487 + 258000 24.321166 1681 591.42793 + 259000 24.566143 1678 595.25383 + 260000 24.820743 1677 617.50379 + 261000 25.057835 1675 623.39319 + 262000 25.294068 1673 627.08829 + 263000 25.526724 1669 623.52963 + 264000 25.766729 1667 626.44957 + 265000 26.005453 1664 631.58936 + 266000 26.244549 1660 605.22452 + 267000 26.478879 1657 611.76935 + 268000 26.71252 1655 611.73538 + 269000 26.951368 1652 624.58227 + 270000 27.186447 1648 625.97446 +Loop time of 27.1865 on 4 procs for 100000 steps with 1648 atoms + +99.2% 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.6257 | 9.631 | 13.049 | 100.0 | 35.43 +Neigh | 0.1522 | 0.17549 | 0.19588 | 4.3 | 0.65 +Comm | 1.5797 | 2.7289 | 3.602 | 48.7 | 10.04 +Output | 0.0014181 | 0.007208 | 0.016675 | 6.8 | 0.03 +Modify | 7.7129 | 9.0949 | 10.256 | 31.9 | 33.45 +Other | | 5.549 | | | 20.41 + +Nlocal: 412 ave 436 max 388 min +Histogram: 1 1 0 0 0 0 0 0 1 1 +Nghost: 391 ave 629 max 158 min +Histogram: 1 0 0 1 0 1 0 0 0 1 +Neighs: 3406 ave 4479 max 2040 min +Histogram: 1 0 0 0 1 0 0 1 0 1 + +Total # of neighbors = 13624 +Ave neighs/atom = 8.26699 +Neighbor list builds = 260 +Dangerous builds = 0 +Total wall time: 0:01:12 diff --git a/examples/granregion/log.6Oct16.granregion.mixer.g++.1 b/examples/granregion/log.6Oct16.granregion.mixer.g++.1 new file mode 100644 index 0000000000..3cfa3eb0fc --- /dev/null +++ b/examples/granregion/log.6Oct16.granregion.mixer.g++.1 @@ -0,0 +1,609 @@ +LAMMPS (5 Oct 2016) +variable name string mixer + +thermo_modify flush yes +variable seed equal 14314 + +############################################### +# Particle parameters +################################################ + +variable rlo equal 0.3 +variable rhi equal 0.6 +variable dlo equal 2.0*${rlo} +variable dlo equal 2.0*0.3 +variable dhi equal 2.0*${rhi} +variable dhi equal 2.0*0.6 +variable skin equal ${rhi} +variable skin equal 0.6 + +variable coeffRes equal 0.1 +variable coeffFric equal 0.5 + +variable kn equal 10^5 +variable kt equal 0.2*${kn} +variable kt equal 0.2*100000 + +variable gravity equal 1.0 +variable density equal 1.0 + +variable min_mass equal ${density}*4.0/3.0*PI*${rlo}*${rlo}*${rlo} +variable min_mass equal 1*4.0/3.0*PI*${rlo}*${rlo}*${rlo} +variable min_mass equal 1*4.0/3.0*PI*0.3*${rlo}*${rlo} +variable min_mass equal 1*4.0/3.0*PI*0.3*0.3*${rlo} +variable min_mass equal 1*4.0/3.0*PI*0.3*0.3*0.3 +variable a equal (-2.0*log(${coeffRes})/PI)^2 +variable a equal (-2.0*log(0.1)/PI)^2 +variable gamma_n equal sqrt($a*2*${kn}/${min_mass}/(1+0.25*$a)) +variable gamma_n equal sqrt(0.405284734569351*2*${kn}/${min_mass}/(1+0.25*$a)) +variable gamma_n equal sqrt(0.405284734569351*2*100000/${min_mass}/(1+0.25*$a)) +variable gamma_n equal sqrt(0.405284734569351*2*100000/0.113097335529233/(1+0.25*$a)) +variable gamma_n equal sqrt(0.405284734569351*2*100000/0.113097335529233/(1+0.25*0.405284734569351)) +variable gamma_t equal ${gamma_n}*0.5 +variable gamma_t equal 806.699778405191*0.5 + +variable tcol equal PI/sqrt(2*${kn}/${min_mass}-${gamma_n}/4.0) +variable tcol equal PI/sqrt(2*100000/${min_mass}-${gamma_n}/4.0) +variable tcol equal PI/sqrt(2*100000/0.113097335529233-${gamma_n}/4.0) +variable tcol equal PI/sqrt(2*100000/0.113097335529233-806.699778405191/4.0) + +variable dt equal ${tcol}*0.02 +variable dt equal 0.00236257621510454*0.02 +timestep ${dt} +timestep 4.72515243020908e-05 + +############################################### + +variable dumpfreq equal 1000 +variable logfreq equal 1000 + +newton on +atom_style sphere + +boundary p p f + +region boxreg block 0 20 0 20 0 20 +create_box 1 boxreg +Created orthogonal box = (0 0 0) to (20 20 20) + 1 by 1 by 1 MPI processor grid + +pair_style gran/hertz/history ${kn} ${kt} ${gamma_n} ${gamma_t} ${coeffFric} 1 +pair_style gran/hertz/history 100000 ${kt} ${gamma_n} ${gamma_t} ${coeffFric} 1 +pair_style gran/hertz/history 100000 20000 ${gamma_n} ${gamma_t} ${coeffFric} 1 +pair_style gran/hertz/history 100000 20000 806.699778405191 ${gamma_t} ${coeffFric} 1 +pair_style gran/hertz/history 100000 20000 806.699778405191 403.349889202595 ${coeffFric} 1 +pair_style gran/hertz/history 100000 20000 806.699778405191 403.349889202595 0.5 1 +pair_coeff * * + +neighbor ${skin} bin +neighbor 0.6 bin +thermo ${logfreq} +thermo 1000 + +comm_style brick +comm_modify mode multi group all vel yes +balance 1.1 shift xyz 20 1.1 +Neighbor list info ... + 2 neighbor list requests + update every 1 steps, delay 10 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 0 + ghost atom cutoff = 0 + binsize = 20 -> bins = 1 1 1 +fix bal all balance 10000 1.1 shift xyz 20 1.01 + +####################### Options specific to pouring ######################### + +region insreg cylinder z 10 10 8 10 18 side in units box +region cylreg cylinder z 10 10 10 0 20 side in units box + +variable theta equal (step/400000)*2*PI + +region b1 block 2 18 9 11 0 4 side out rotate v_theta 10 10 0 0 0 1 units box +region b2 block 9 11 2 18 0 3.99999 side out rotate v_theta 10 10 0 0 0 1 units box + +region mixer intersect 3 cylreg b1 b2 side in + +fix grav all gravity ${gravity} vector 0 0 -1 +fix grav all gravity 1 vector 0 0 -1 +fix 1 all nve/sphere + +fix mixwall all wall/gran/region hertz/history ${kn} ${kt} ${gamma_n} ${gamma_t} ${coeffFric} 1 region mixer +fix mixwall all wall/gran/region hertz/history 100000 ${kt} ${gamma_n} ${gamma_t} ${coeffFric} 1 region mixer +fix mixwall all wall/gran/region hertz/history 100000 20000 ${gamma_n} ${gamma_t} ${coeffFric} 1 region mixer +fix mixwall all wall/gran/region hertz/history 100000 20000 806.699778405191 ${gamma_t} ${coeffFric} 1 region mixer +fix mixwall all wall/gran/region hertz/history 100000 20000 806.699778405191 403.349889202595 ${coeffFric} 1 region mixer +fix mixwall all wall/gran/region hertz/history 100000 20000 806.699778405191 403.349889202595 0.5 1 region mixer + +fix ins all pour 1000 1 42424 region insreg diam range ${dlo} ${dhi} dens ${density} ${density} +fix ins all pour 1000 1 42424 region insreg diam range 0.6 ${dhi} dens ${density} ${density} +fix ins all pour 1000 1 42424 region insreg diam range 0.6 1.2 dens ${density} ${density} +fix ins all pour 1000 1 42424 region insreg diam range 0.6 1.2 dens 1 ${density} +fix ins all pour 1000 1 42424 region insreg diam range 0.6 1.2 dens 1 1 +Particle insertion: 444 every 84653 steps, 1000 by step 169307 + +#dump 1 all custom ${dumpfreq} ${name}_pour.dump # id type mass diameter x y z + +#dump 2 all image 4000 image.*.jpg type type # axes yes 0.8 0.02 view 60 -30 zoom 1.5 # box no 0.0 axes no 0.0 0.0 +#dump_modify 2 pad 6 + +thermo_style custom step cpu atoms ke v_theta +WARNING: New thermo_style command, previous thermo_modify settings will be lost (../output.cpp:690) +thermo_modify flush yes lost warn + +run 200000 +Neighbor list info ... + 2 neighbor list requests + update every 1 steps, delay 10 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 1.8 + ghost atom cutoff = 1.8 + binsize = 0.9 -> bins = 23 23 23 +Memory usage per processor = 2.80779 Mbytes +Step CPU Atoms KinEng v_theta + 0 0 0 -0 0 + 1000 0.16771817 444 -0 0.015707963 + 2000 0.33019304 444 -0 0.031415927 + 3000 0.4894321 444 -0 0.04712389 + 4000 0.64879322 444 -0 0.062831853 + 5000 0.80816507 444 -0 0.078539816 + 6000 0.96711302 444 -0 0.09424778 + 7000 1.1265812 444 -0 0.10995574 + 8000 1.286129 444 -0 0.12566371 + 9000 1.445487 444 -0 0.14137167 + 10000 1.6056392 444 -0 0.15707963 + 11000 1.7650061 444 -0 0.1727876 + 12000 1.9249642 444 -0 0.18849556 + 13000 2.0851831 444 -0 0.20420352 + 14000 2.244523 444 -0 0.21991149 + 15000 2.4043641 444 -0 0.23561945 + 16000 2.5638251 444 -0 0.25132741 + 17000 2.7155962 444 -0 0.26703538 + 18000 2.866904 444 -0 0.28274334 + 19000 3.0188181 444 -0 0.2984513 + 20000 3.17047 444 -0 0.31415927 + 21000 3.3214712 444 -0 0.32986723 + 22000 3.472692 444 -0 0.34557519 + 23000 3.6240032 444 -0 0.36128316 + 24000 3.7753551 444 -0 0.37699112 + 25000 3.926239 444 -0 0.39269908 + 26000 4.0782132 444 -0 0.40840704 + 27000 4.2301712 444 -0 0.42411501 + 28000 4.382267 444 -0 0.43982297 + 29000 4.5339992 444 -0 0.45553093 + 30000 4.6860211 444 -0 0.4712389 + 31000 4.8376751 444 -0 0.48694686 + 32000 4.989748 444 -0 0.50265482 + 33000 5.1418142 444 -0 0.51836279 + 34000 5.294476 444 -0 0.53407075 + 35000 5.4472861 444 -0 0.54977871 + 36000 5.5999811 444 -0 0.56548668 + 37000 5.7526181 444 -0 0.58119464 + 38000 5.9061031 444 -0 0.5969026 + 39000 6.0593271 444 -0 0.61261057 + 40000 6.2123802 444 -0 0.62831853 + 41000 6.3652351 444 -0 0.64402649 + 42000 6.5186551 444 -0 0.65973446 + 43000 6.672132 444 -0 0.67544242 + 44000 6.8245611 444 -0 0.69115038 + 45000 6.9778051 444 -0 0.70685835 + 46000 7.131258 444 -0 0.72256631 + 47000 7.2841291 444 -0 0.73827427 + 48000 7.4379101 444 -0 0.75398224 + 49000 7.5915 444 -0 0.7696902 + 50000 7.7461231 444 -0 0.78539816 + 51000 7.9047191 444 -0 0.80110613 + 52000 8.0634432 444 -0 0.81681409 + 53000 8.2226322 444 -0 0.83252205 + 54000 8.3817451 444 -0 0.84823002 + 55000 8.5419021 444 -0 0.86393798 + 56000 8.701194 444 -0 0.87964594 + 57000 8.8613491 444 -0 0.89535391 + 58000 9.0211501 444 -0 0.91106187 + 59000 9.180917 444 -0 0.92676983 + 60000 9.341964 444 -0 0.9424778 + 61000 9.5026722 444 -0 0.95818576 + 62000 9.6630561 444 -0 0.97389372 + 63000 9.8236201 444 -0 0.98960169 + 64000 9.9854801 444 -0 1.0053096 + 65000 10.148318 444 -0 1.0210176 + 66000 10.311267 444 -0 1.0367256 + 67000 10.476498 444 -0 1.0524335 + 68000 10.640768 444 -0 1.0681415 + 69000 10.804709 444 -0 1.0838495 + 70000 10.969271 444 -0 1.0995574 + 71000 11.133451 444 -0 1.1152654 + 72000 11.299253 444 -0 1.1309734 + 73000 11.463999 444 -0 1.1466813 + 74000 11.62903 444 -0 1.1623893 + 75000 11.795109 444 -0 1.1780972 + 76000 11.962154 444 -0 1.1938052 + 77000 12.1292 444 -0 1.2095132 + 78000 12.298106 444 -0 1.2252211 + 79000 12.46744 444 -0 1.2409291 + 80000 12.637916 444 -0 1.2566371 + 81000 12.808494 444 -0 1.272345 + 82000 12.97813 444 -0 1.288053 + 83000 13.149135 444 -0 1.303761 + 84000 13.32082 444 -0 1.3194689 + 85000 13.56205 888 -0 1.3351769 + 86000 13.908699 888 -0 1.3508848 + 87000 14.254615 888 -0 1.3665928 + 88000 14.600851 888 -0 1.3823008 + 89000 14.946295 888 -0 1.3980087 + 90000 15.291315 888 -0 1.4137167 + 91000 15.637396 888 -0 1.4294247 + 92000 15.981426 888 -0 1.4451326 + 93000 16.327519 888 -0 1.4608406 + 94000 16.675434 888 -0 1.4765485 + 95000 17.023515 888 -0 1.4922565 + 96000 17.372152 888 -0 1.5079645 + 97000 17.719346 888 -0 1.5236724 + 98000 18.067159 888 -0 1.5393804 + 99000 18.414599 888 -0 1.5550884 + 100000 18.764775 888 -0 1.5707963 + 101000 19.114239 888 -0 1.5865043 + 102000 19.464285 888 -0 1.6022123 + 103000 19.813956 888 -0 1.6179202 + 104000 20.163276 888 -0 1.6336282 + 105000 20.553808 888 -0 1.6493361 + 106000 20.904093 888 -0 1.6650441 + 107000 21.25918 888 -0 1.6807521 + 108000 21.615056 888 -0 1.69646 + 109000 21.971067 888 -0 1.712168 + 110000 22.326407 888 -0 1.727876 + 111000 22.68062 888 -0 1.7435839 + 112000 23.03653 888 -0 1.7592919 + 113000 23.39161 888 -0 1.7749998 + 114000 23.751273 888 -0 1.7907078 + 115000 24.106946 888 -0 1.8064158 + 116000 24.461182 888 -0 1.8221237 + 117000 24.797533 888 -0 1.8378317 + 118000 25.133924 888 -0 1.8535397 + 119000 25.472617 888 -0 1.8692476 + 120000 25.810786 888 -0 1.8849556 + 121000 26.147399 888 -0 1.9006636 + 122000 26.485868 888 -0 1.9163715 + 123000 26.82395 888 -0 1.9320795 + 124000 27.162345 888 -0 1.9477874 + 125000 27.501503 888 -0 1.9634954 + 126000 27.843318 888 -0 1.9792034 + 127000 28.183379 888 -0 1.9949113 + 128000 28.525406 888 -0 2.0106193 + 129000 28.869601 888 -0 2.0263273 + 130000 29.216232 888 -0 2.0420352 + 131000 29.562432 888 -0 2.0577432 + 132000 29.95624 888 -0 2.0734512 + 133000 30.308919 888 -0 2.0891591 + 134000 30.662184 888 -0 2.1048671 + 135000 31.015509 888 -0 2.120575 + 136000 31.366132 888 -0 2.136283 + 137000 31.71887 888 -0 2.151991 + 138000 32.0723 888 -0 2.1676989 + 139000 32.428657 888 -0 2.1834069 + 140000 32.781484 888 -0 2.1991149 + 141000 33.133593 888 -0 2.2148228 + 142000 33.487376 888 -0 2.2305308 + 143000 33.838656 888 -0 2.2462387 + 144000 34.188723 888 -0 2.2619467 + 145000 34.540083 888 -0 2.2776547 + 146000 34.895624 888 -0 2.2933626 + 147000 35.25153 888 -0 2.3090706 + 148000 35.607482 888 -0 2.3247786 + 149000 35.9642 888 -0 2.3404865 + 150000 36.321759 888 -0 2.3561945 + 151000 36.667172 888 -0 2.3719025 + 152000 37.013822 888 -0 2.3876104 + 153000 37.362735 888 -0 2.4033184 + 154000 37.712576 888 -0 2.4190263 + 155000 38.063528 888 -0 2.4347343 + 156000 38.414666 888 -0 2.4504423 + 157000 38.766119 888 -0 2.4661502 + 158000 39.115828 888 -0 2.4818582 + 159000 39.470874 888 -0 2.4975662 + 160000 39.827871 888 -0 2.5132741 + 161000 40.184885 888 -0 2.5289821 + 162000 40.543838 888 -0 2.54469 + 163000 40.901814 888 -0 2.560398 + 164000 41.258631 888 -0 2.576106 + 165000 41.619086 888 -0 2.5918139 + 166000 41.977332 888 -0 2.6075219 + 167000 42.33775 888 -0 2.6232299 + 168000 42.701344 888 -0 2.6389378 + 169000 43.067663 888 -0 2.6546458 + 170000 43.461687 1000 -0 2.6703538 + 171000 43.866086 1000 -0 2.6860617 + 172000 44.271406 1000 -0 2.7017697 + 173000 44.677085 1000 -0 2.7174776 + 174000 45.082441 1000 -0 2.7331856 + 175000 45.491593 1000 -0 2.7488936 + 176000 45.903002 1000 -0 2.7646015 + 177000 46.315031 1000 -0 2.7803095 + 178000 46.726531 1000 -0 2.7960175 + 179000 47.140818 1000 -0 2.8117254 + 180000 47.553784 1000 -0 2.8274334 + 181000 47.964021 1000 -0 2.8431414 + 182000 48.376739 1000 -0 2.8588493 + 183000 48.789612 1000 -0 2.8745573 + 184000 49.204073 1000 -0 2.8902652 + 185000 49.642401 1000 -0 2.9059732 + 186000 50.083479 1000 -0 2.9216812 + 187000 50.523357 1000 -0 2.9373891 + 188000 50.963685 1000 -0 2.9530971 + 189000 51.404166 1000 -0 2.9688051 + 190000 51.849094 1000 -0 2.984513 + 191000 52.291805 1000 -0 3.000221 + 192000 52.731855 1000 -0 3.0159289 + 193000 53.174104 1000 -0 3.0316369 + 194000 53.619739 1000 -0 3.0473449 + 195000 54.061019 1000 -0 3.0630528 + 196000 54.501149 1000 -0 3.0787608 + 197000 54.940486 1000 -0 3.0944688 + 198000 55.381843 1000 -0 3.1101767 + 199000 55.822243 1000 -0 3.1258847 + 200000 56.264319 1000 -0 3.1415927 +Loop time of 56.2643 on 1 procs for 200000 steps with 1000 atoms + +Performance: 14511.970 tau/day, 3554.650 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 | 4.6309 | 4.6309 | 4.6309 | 0.0 | 8.23 +Neigh | 0.071456 | 0.071456 | 0.071456 | 0.0 | 0.13 +Comm | 0.50064 | 0.50064 | 0.50064 | 0.0 | 0.89 +Output | 0.0039163 | 0.0039163 | 0.0039163 | 0.0 | 0.01 +Modify | 50.189 | 50.189 | 50.189 | 0.0 | 89.20 +Other | | 0.8688 | | | 1.54 + +Nlocal: 1000 ave 1000 max 1000 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 183 ave 183 max 183 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 3926 ave 3926 max 3926 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 3926 +Ave neighs/atom = 3.926 +Neighbor list builds = 217 +Dangerous builds = 0 +unfix ins +run 200000 +Neighbor list info ... + 2 neighbor list requests + update every 1 steps, delay 10 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 1.79826 + ghost atom cutoff = 1.79826 + binsize = 0.899132 -> bins = 23 23 23 +Memory usage per processor = 8.62017 Mbytes +Step CPU Atoms KinEng v_theta + 200000 0 1000 0.90078559 3.1415927 + 201000 0.44072509 1000 0.90377135 3.1573006 + 202000 0.8800211 1000 0.89194106 3.1730086 + 203000 1.3210881 1000 0.8940532 3.1887165 + 204000 1.762887 1000 0.8967696 3.2044245 + 205000 2.2080901 1000 0.89758718 3.2201325 + 206000 2.6548181 1000 0.89434418 3.2358404 + 207000 3.1002531 1000 0.87633906 3.2515484 + 208000 3.547334 1000 0.86721615 3.2672564 + 209000 3.993988 1000 0.86214817 3.2829643 + 210000 4.4423161 1000 0.85463743 3.2986723 + 211000 4.889446 1000 0.85744914 3.3143802 + 212000 5.3357229 1000 0.84702799 3.3300882 + 213000 5.780273 1000 0.84375104 3.3457962 + 214000 6.2249129 1000 0.83820701 3.3615041 + 215000 6.670651 1000 0.83566708 3.3772121 + 216000 7.113143 1000 0.83620798 3.3929201 + 217000 7.5359521 1000 0.83581605 3.408628 + 218000 7.9623129 1000 0.84045719 3.424336 + 219000 8.3878851 1000 0.85410521 3.440044 + 220000 8.8153811 1000 0.84336839 3.4557519 + 221000 9.244349 1000 0.85145747 3.4714599 + 222000 9.6728511 1000 0.8476916 3.4871678 + 223000 10.104052 1000 0.8412701 3.5028758 + 224000 10.532736 1000 0.8390277 3.5185838 + 225000 10.959564 1000 0.8359107 3.5342917 + 226000 11.38617 1000 0.83920631 3.5499997 + 227000 11.814104 1000 0.83930526 3.5657077 + 228000 12.241758 1000 0.83152308 3.5814156 + 229000 12.67198 1000 0.81211079 3.5971236 + 230000 13.101597 1000 0.80395018 3.6128316 + 231000 13.532943 1000 0.79991397 3.6285395 + 232000 13.969412 1000 0.80828959 3.6442475 + 233000 14.403885 1000 0.80892923 3.6599554 + 234000 14.833452 1000 0.82048914 3.6756634 + 235000 15.266211 1000 0.8174713 3.6913714 + 236000 15.697822 1000 0.81898551 3.7070793 + 237000 16.133023 1000 0.82034714 3.7227873 + 238000 16.569559 1000 0.81950728 3.7384953 + 239000 17.006308 1000 0.82152915 3.7542032 + 240000 17.445493 1000 0.83217597 3.7699112 + 241000 17.885585 1000 0.83464253 3.7856191 + 242000 18.324268 1000 0.84326166 3.8013271 + 243000 18.763748 1000 0.84235055 3.8170351 + 244000 19.203869 1000 0.83325408 3.832743 + 245000 19.645 1000 0.82577315 3.848451 + 246000 20.08666 1000 0.83923456 3.864159 + 247000 20.530596 1000 0.84153419 3.8798669 + 248000 20.971984 1000 0.85768309 3.8955749 + 249000 21.413571 1000 0.86910799 3.9112829 + 250000 21.854153 1000 0.8775521 3.9269908 + 251000 22.302884 1000 0.87299296 3.9426988 + 252000 22.753789 1000 0.86613861 3.9584067 + 253000 23.202458 1000 0.85513456 3.9741147 + 254000 23.655372 1000 0.84629733 3.9898227 + 255000 24.108225 1000 0.84154885 4.0055306 + 256000 24.561535 1000 0.84162715 4.0212386 + 257000 25.012338 1000 0.83959672 4.0369466 + 258000 25.466506 1000 0.83577695 4.0526545 + 259000 25.919168 1000 0.83021368 4.0683625 + 260000 26.37215 1000 0.81106893 4.0840704 + 261000 26.823834 1000 0.79884608 4.0997784 + 262000 27.276505 1000 0.78360303 4.1154864 + 263000 27.728503 1000 0.77030843 4.1311943 + 264000 28.181969 1000 0.76127974 4.1469023 + 265000 28.636329 1000 0.75553065 4.1626103 + 266000 29.090593 1000 0.75332019 4.1783182 + 267000 29.549547 1000 0.74670528 4.1940262 + 268000 30.008774 1000 0.74216141 4.2097342 + 269000 30.463826 1000 0.74564756 4.2254421 + 270000 30.920159 1000 0.7416035 4.2411501 + 271000 31.377192 1000 0.73061389 4.256858 + 272000 31.836268 1000 0.71620113 4.272566 + 273000 32.291662 1000 0.70840181 4.288274 + 274000 32.743646 1000 0.70946906 4.3039819 + 275000 33.197723 1000 0.70418049 4.3196899 + 276000 33.651405 1000 0.69591327 4.3353979 + 277000 34.106289 1000 0.69499716 4.3511058 + 278000 34.564324 1000 0.69242545 4.3668138 + 279000 35.020887 1000 0.69690811 4.3825218 + 280000 35.478222 1000 0.70402124 4.3982297 + 281000 35.938226 1000 0.71936578 4.4139377 + 282000 36.39808 1000 0.72439386 4.4296456 + 283000 36.855587 1000 0.72221632 4.4453536 + 284000 37.309629 1000 0.70387029 4.4610616 + 285000 37.791869 1000 0.70505716 4.4767695 + 286000 38.277853 1000 0.70731734 4.4924775 + 287000 38.764774 1000 0.71149743 4.5081855 + 288000 39.24815 1000 0.70994023 4.5238934 + 289000 39.728005 1000 0.69794225 4.5396014 + 290000 40.206798 1000 0.6905751 4.5553093 + 291000 40.678802 1000 0.68652972 4.5710173 + 292000 41.147991 1000 0.6743341 4.5867253 + 293000 41.618836 1000 0.67357205 4.6024332 + 294000 42.08982 1000 0.66465346 4.6181412 + 295000 42.561323 1000 0.65587678 4.6338492 + 296000 43.034196 1000 0.65455827 4.6495571 + 297000 43.505748 1000 0.65135145 4.6652651 + 298000 43.975299 1000 0.65400349 4.6809731 + 299000 44.447556 1000 0.66186899 4.696681 + 300000 44.926073 1000 0.66844193 4.712389 + 301000 45.402658 1000 0.67720506 4.7280969 + 302000 45.880643 1000 0.68554918 4.7438049 + 303000 46.359444 1000 0.69321489 4.7595129 + 304000 46.841542 1000 0.70345329 4.7752208 + 305000 47.323539 1000 0.70172137 4.7909288 + 306000 47.809358 1000 0.70989191 4.8066368 + 307000 48.291664 1000 0.70546377 4.8223447 + 308000 48.770327 1000 0.70820389 4.8380527 + 309000 49.248974 1000 0.69637815 4.8537606 + 310000 49.72965 1000 0.68679532 4.8694686 + 311000 50.204503 1000 0.68824984 4.8851766 + 312000 50.683502 1000 0.68647935 4.9008845 + 313000 51.161407 1000 0.68289956 4.9165925 + 314000 51.638365 1000 0.68356788 4.9323005 + 315000 52.114341 1000 0.68269829 4.9480084 + 316000 52.590791 1000 0.67961769 4.9637164 + 317000 53.043198 1000 0.67437047 4.9794244 + 318000 53.499062 1000 0.66534726 4.9951323 + 319000 53.954004 1000 0.66052125 5.0108403 + 320000 54.409776 1000 0.65351962 5.0265482 + 321000 54.867935 1000 0.64155441 5.0422562 + 322000 55.324528 1000 0.63463177 5.0579642 + 323000 55.780399 1000 0.62945691 5.0736721 + 324000 56.239189 1000 0.63156746 5.0893801 + 325000 56.697767 1000 0.63883759 5.1050881 + 326000 57.155746 1000 0.64703516 5.120796 + 327000 57.618744 1000 0.65532057 5.136504 + 328000 58.083021 1000 0.66697061 5.152212 + 329000 58.547646 1000 0.66896271 5.1679199 + 330000 59.011518 1000 0.66551963 5.1836279 + 331000 59.478689 1000 0.65083894 5.1993358 + 332000 59.94887 1000 0.65171641 5.2150438 + 333000 60.416096 1000 0.65122777 5.2307518 + 334000 60.889826 1000 0.65844334 5.2464597 + 335000 61.363105 1000 0.66931264 5.2621677 + 336000 61.832482 1000 0.66847415 5.2778757 + 337000 62.300731 1000 0.65863495 5.2935836 + 338000 62.769011 1000 0.64977739 5.3092916 + 339000 63.232862 1000 0.6454395 5.3249995 + 340000 63.699228 1000 0.63484999 5.3407075 + 341000 64.165101 1000 0.62753448 5.3564155 + 342000 64.631118 1000 0.62781442 5.3721234 + 343000 65.099469 1000 0.63813963 5.3878314 + 344000 65.576568 1000 0.6485183 5.4035394 + 345000 66.054068 1000 0.67111606 5.4192473 + 346000 66.531747 1000 0.68435581 5.4349553 + 347000 67.007296 1000 0.69526046 5.4506633 + 348000 67.478242 1000 0.6876531 5.4663712 + 349000 67.944422 1000 0.67962108 5.4820792 + 350000 68.410281 1000 0.6800934 5.4977871 + 351000 68.862112 1000 0.67658657 5.5134951 + 352000 69.316476 1000 0.67043355 5.5292031 + 353000 69.76356 1000 0.66863154 5.544911 + 354000 70.212144 1000 0.65806572 5.560619 + 355000 70.658375 1000 0.6498301 5.576327 + 356000 71.103688 1000 0.64384284 5.5920349 + 357000 71.551545 1000 0.64228421 5.6077429 + 358000 72.001238 1000 0.6408188 5.6234508 + 359000 72.45158 1000 0.64388002 5.6391588 + 360000 72.906369 1000 0.64347896 5.6548668 + 361000 73.358316 1000 0.65055455 5.6705747 + 362000 73.814119 1000 0.65545061 5.6862827 + 363000 74.277034 1000 0.6667431 5.7019907 + 364000 74.737593 1000 0.6869856 5.7176986 + 365000 75.20209 1000 0.69651407 5.7334066 + 366000 75.667448 1000 0.70824091 5.7491146 + 367000 76.132389 1000 0.7144853 5.7648225 + 368000 76.596067 1000 0.71780876 5.7805305 + 369000 77.059749 1000 0.7159398 5.7962384 + 370000 77.519236 1000 0.70648968 5.8119464 + 371000 77.977404 1000 0.69796557 5.8276544 + 372000 78.434017 1000 0.69876891 5.8433623 + 373000 78.887217 1000 0.70908957 5.8590703 + 374000 79.341658 1000 0.70831124 5.8747783 + 375000 79.802381 1000 0.70631178 5.8904862 + 376000 80.265165 1000 0.70533876 5.9061942 + 377000 80.727821 1000 0.70097225 5.9219022 + 378000 81.187538 1000 0.70139806 5.9376101 + 379000 81.645627 1000 0.69691027 5.9533181 + 380000 82.105692 1000 0.69163881 5.969026 + 381000 82.56483 1000 0.68973183 5.984734 + 382000 83.025126 1000 0.68059207 6.000442 + 383000 83.482786 1000 0.68096466 6.0161499 + 384000 83.939808 1000 0.6698933 6.0318579 + 385000 84.418408 1000 0.66795846 6.0475659 + 386000 84.898757 1000 0.66153854 6.0632738 + 387000 85.376756 1000 0.66560025 6.0789818 + 388000 85.853575 1000 0.66671699 6.0946897 + 389000 86.32865 1000 0.66013733 6.1103977 + 390000 86.807772 1000 0.66181942 6.1261057 + 391000 87.290335 1000 0.66281334 6.1418136 + 392000 87.773899 1000 0.66657879 6.1575216 + 393000 88.248567 1000 0.66608992 6.1732296 + 394000 88.723817 1000 0.66128929 6.1889375 + 395000 89.200089 1000 0.65764538 6.2046455 + 396000 89.671826 1000 0.65073015 6.2203535 + 397000 90.142595 1000 0.64967355 6.2360614 + 398000 90.616654 1000 0.65193957 6.2517694 + 399000 91.093856 1000 0.64936977 6.2674773 + 400000 91.571678 1000 0.65849743 6.2831853 +Loop time of 91.5717 on 1 procs for 200000 steps with 1000 atoms + +Performance: 8916.580 tau/day, 2184.081 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 | 13.827 | 13.827 | 13.827 | 0.0 | 15.10 +Neigh | 0.097679 | 0.097679 | 0.097679 | 0.0 | 0.11 +Comm | 1.5668 | 1.5668 | 1.5668 | 0.0 | 1.71 +Output | 0.0042615 | 0.0042615 | 0.0042615 | 0.0 | 0.00 +Modify | 74.804 | 74.804 | 74.804 | 0.0 | 81.69 +Other | | 1.273 | | | 1.39 + +Nlocal: 1000 ave 1000 max 1000 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 289 ave 289 max 289 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 5091 ave 5091 max 5091 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 5091 +Ave neighs/atom = 5.091 +Neighbor list builds = 160 +Dangerous builds = 0 +Total wall time: 0:02:27 diff --git a/examples/granregion/log.6Oct16.granregion.mixer.g++.4 b/examples/granregion/log.6Oct16.granregion.mixer.g++.4 new file mode 100644 index 0000000000..726b31f8fe --- /dev/null +++ b/examples/granregion/log.6Oct16.granregion.mixer.g++.4 @@ -0,0 +1,609 @@ +LAMMPS (5 Oct 2016) +variable name string mixer + +thermo_modify flush yes +variable seed equal 14314 + +############################################### +# Particle parameters +################################################ + +variable rlo equal 0.3 +variable rhi equal 0.6 +variable dlo equal 2.0*${rlo} +variable dlo equal 2.0*0.3 +variable dhi equal 2.0*${rhi} +variable dhi equal 2.0*0.6 +variable skin equal ${rhi} +variable skin equal 0.6 + +variable coeffRes equal 0.1 +variable coeffFric equal 0.5 + +variable kn equal 10^5 +variable kt equal 0.2*${kn} +variable kt equal 0.2*100000 + +variable gravity equal 1.0 +variable density equal 1.0 + +variable min_mass equal ${density}*4.0/3.0*PI*${rlo}*${rlo}*${rlo} +variable min_mass equal 1*4.0/3.0*PI*${rlo}*${rlo}*${rlo} +variable min_mass equal 1*4.0/3.0*PI*0.3*${rlo}*${rlo} +variable min_mass equal 1*4.0/3.0*PI*0.3*0.3*${rlo} +variable min_mass equal 1*4.0/3.0*PI*0.3*0.3*0.3 +variable a equal (-2.0*log(${coeffRes})/PI)^2 +variable a equal (-2.0*log(0.1)/PI)^2 +variable gamma_n equal sqrt($a*2*${kn}/${min_mass}/(1+0.25*$a)) +variable gamma_n equal sqrt(0.405284734569351*2*${kn}/${min_mass}/(1+0.25*$a)) +variable gamma_n equal sqrt(0.405284734569351*2*100000/${min_mass}/(1+0.25*$a)) +variable gamma_n equal sqrt(0.405284734569351*2*100000/0.113097335529233/(1+0.25*$a)) +variable gamma_n equal sqrt(0.405284734569351*2*100000/0.113097335529233/(1+0.25*0.405284734569351)) +variable gamma_t equal ${gamma_n}*0.5 +variable gamma_t equal 806.699778405191*0.5 + +variable tcol equal PI/sqrt(2*${kn}/${min_mass}-${gamma_n}/4.0) +variable tcol equal PI/sqrt(2*100000/${min_mass}-${gamma_n}/4.0) +variable tcol equal PI/sqrt(2*100000/0.113097335529233-${gamma_n}/4.0) +variable tcol equal PI/sqrt(2*100000/0.113097335529233-806.699778405191/4.0) + +variable dt equal ${tcol}*0.02 +variable dt equal 0.00236257621510454*0.02 +timestep ${dt} +timestep 4.72515243020908e-05 + +############################################### + +variable dumpfreq equal 1000 +variable logfreq equal 1000 + +newton on +atom_style sphere + +boundary p p f + +region boxreg block 0 20 0 20 0 20 +create_box 1 boxreg +Created orthogonal box = (0 0 0) to (20 20 20) + 1 by 2 by 2 MPI processor grid + +pair_style gran/hertz/history ${kn} ${kt} ${gamma_n} ${gamma_t} ${coeffFric} 1 +pair_style gran/hertz/history 100000 ${kt} ${gamma_n} ${gamma_t} ${coeffFric} 1 +pair_style gran/hertz/history 100000 20000 ${gamma_n} ${gamma_t} ${coeffFric} 1 +pair_style gran/hertz/history 100000 20000 806.699778405191 ${gamma_t} ${coeffFric} 1 +pair_style gran/hertz/history 100000 20000 806.699778405191 403.349889202595 ${coeffFric} 1 +pair_style gran/hertz/history 100000 20000 806.699778405191 403.349889202595 0.5 1 +pair_coeff * * + +neighbor ${skin} bin +neighbor 0.6 bin +thermo ${logfreq} +thermo 1000 + +comm_style brick +comm_modify mode multi group all vel yes +balance 1.1 shift xyz 20 1.1 +Neighbor list info ... + 2 neighbor list requests + update every 1 steps, delay 10 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 0 + ghost atom cutoff = 0 + binsize = 20 -> bins = 1 1 1 +fix bal all balance 10000 1.1 shift xyz 20 1.01 + +####################### Options specific to pouring ######################### + +region insreg cylinder z 10 10 8 10 18 side in units box +region cylreg cylinder z 10 10 10 0 20 side in units box + +variable theta equal (step/400000)*2*PI + +region b1 block 2 18 9 11 0 4 side out rotate v_theta 10 10 0 0 0 1 units box +region b2 block 9 11 2 18 0 3.99999 side out rotate v_theta 10 10 0 0 0 1 units box + +region mixer intersect 3 cylreg b1 b2 side in + +fix grav all gravity ${gravity} vector 0 0 -1 +fix grav all gravity 1 vector 0 0 -1 +fix 1 all nve/sphere + +fix mixwall all wall/gran/region hertz/history ${kn} ${kt} ${gamma_n} ${gamma_t} ${coeffFric} 1 region mixer +fix mixwall all wall/gran/region hertz/history 100000 ${kt} ${gamma_n} ${gamma_t} ${coeffFric} 1 region mixer +fix mixwall all wall/gran/region hertz/history 100000 20000 ${gamma_n} ${gamma_t} ${coeffFric} 1 region mixer +fix mixwall all wall/gran/region hertz/history 100000 20000 806.699778405191 ${gamma_t} ${coeffFric} 1 region mixer +fix mixwall all wall/gran/region hertz/history 100000 20000 806.699778405191 403.349889202595 ${coeffFric} 1 region mixer +fix mixwall all wall/gran/region hertz/history 100000 20000 806.699778405191 403.349889202595 0.5 1 region mixer + +fix ins all pour 1000 1 42424 region insreg diam range ${dlo} ${dhi} dens ${density} ${density} +fix ins all pour 1000 1 42424 region insreg diam range 0.6 ${dhi} dens ${density} ${density} +fix ins all pour 1000 1 42424 region insreg diam range 0.6 1.2 dens ${density} ${density} +fix ins all pour 1000 1 42424 region insreg diam range 0.6 1.2 dens 1 ${density} +fix ins all pour 1000 1 42424 region insreg diam range 0.6 1.2 dens 1 1 +Particle insertion: 444 every 84653 steps, 1000 by step 169307 + +#dump 1 all custom ${dumpfreq} ${name}_pour.dump # id type mass diameter x y z + +#dump 2 all image 4000 image.*.jpg type type # axes yes 0.8 0.02 view 60 -30 zoom 1.5 # box no 0.0 axes no 0.0 0.0 +#dump_modify 2 pad 6 + +thermo_style custom step cpu atoms ke v_theta +WARNING: New thermo_style command, previous thermo_modify settings will be lost (../output.cpp:690) +thermo_modify flush yes lost warn + +run 200000 +Neighbor list info ... + 2 neighbor list requests + update every 1 steps, delay 10 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 1.8 + ghost atom cutoff = 1.8 + binsize = 0.9 -> bins = 23 23 23 +Memory usage per processor = 2.76258 Mbytes +Step CPU Atoms KinEng v_theta + 0 0 0 -0 0 + 1000 0.10398197 444 -0 0.015707963 + 2000 0.20485091 444 -0 0.031415927 + 3000 0.3069241 444 -0 0.04712389 + 4000 0.40875912 444 -0 0.062831853 + 5000 0.50989199 444 -0 0.078539816 + 6000 0.60949397 444 -0 0.09424778 + 7000 0.708915 444 -0 0.10995574 + 8000 0.80870605 444 -0 0.12566371 + 9000 0.90752602 444 -0 0.14137167 + 10000 1.0054469 444 -0 0.15707963 + 11000 1.072515 444 -0 0.1727876 + 12000 1.139096 444 -0 0.18849556 + 13000 1.2049479 444 -0 0.20420352 + 14000 1.2707851 444 -0 0.21991149 + 15000 1.3377919 444 -0 0.23561945 + 16000 1.405757 444 -0 0.25132741 + 17000 1.471797 444 -0 0.26703538 + 18000 1.538343 444 -0 0.28274334 + 19000 1.6035659 444 -0 0.2984513 + 20000 1.6690421 444 -0 0.31415927 + 21000 1.729399 444 -0 0.32986723 + 22000 1.7885301 444 -0 0.34557519 + 23000 1.8496239 444 -0 0.36128316 + 24000 1.913486 444 -0 0.37699112 + 25000 1.977428 444 -0 0.39269908 + 26000 2.04282 444 -0 0.40840704 + 27000 2.1089439 444 -0 0.42411501 + 28000 2.1759491 444 -0 0.43982297 + 29000 2.243813 444 -0 0.45553093 + 30000 2.312156 444 -0 0.4712389 + 31000 2.3742449 444 -0 0.48694686 + 32000 2.435447 444 -0 0.50265482 + 33000 2.495765 444 -0 0.51836279 + 34000 2.556865 444 -0 0.53407075 + 35000 2.6201291 444 -0 0.54977871 + 36000 2.6843281 444 -0 0.56548668 + 37000 2.7505059 444 -0 0.58119464 + 38000 2.817348 444 -0 0.5969026 + 39000 2.8837919 444 -0 0.61261057 + 40000 2.951216 444 -0 0.62831853 + 41000 3.012845 444 -0 0.64402649 + 42000 3.074688 444 -0 0.65973446 + 43000 3.13556 444 -0 0.67544242 + 44000 3.1965449 444 -0 0.69115038 + 45000 3.2582009 444 -0 0.70685835 + 46000 3.3201971 444 -0 0.72256631 + 47000 3.3819821 444 -0 0.73827427 + 48000 3.4455171 444 -0 0.75398224 + 49000 3.508738 444 -0 0.7696902 + 50000 3.5734961 444 -0 0.78539816 + 51000 3.6333289 444 -0 0.80110613 + 52000 3.694531 444 -0 0.81681409 + 53000 3.757041 444 -0 0.83252205 + 54000 3.820612 444 -0 0.84823002 + 55000 3.8852711 444 -0 0.86393798 + 56000 3.950211 444 -0 0.87964594 + 57000 4.015795 444 -0 0.89535391 + 58000 4.0818441 444 -0 0.91106187 + 59000 4.1476641 444 -0 0.92676983 + 60000 4.2141221 444 -0 0.9424778 + 61000 4.276612 444 -0 0.95818576 + 62000 4.339952 444 -0 0.97389372 + 63000 4.404351 444 -0 0.98960169 + 64000 4.4700999 444 -0 1.0053096 + 65000 4.5364759 444 -0 1.0210176 + 66000 4.605715 444 -0 1.0367256 + 67000 4.677629 444 -0 1.0524335 + 68000 4.7494669 444 -0 1.0681415 + 69000 4.8212609 444 -0 1.0838495 + 70000 4.894326 444 -0 1.0995574 + 71000 4.9639831 444 -0 1.1152654 + 72000 5.0345671 444 -0 1.1309734 + 73000 5.1048689 444 -0 1.1466813 + 74000 5.175498 444 -0 1.1623893 + 75000 5.2477591 444 -0 1.1780972 + 76000 5.3205409 444 -0 1.1938052 + 77000 5.394573 444 -0 1.2095132 + 78000 5.4685309 444 -0 1.2252211 + 79000 5.5431759 444 -0 1.2409291 + 80000 5.6212411 444 -0 1.2566371 + 81000 5.6890731 444 -0 1.272345 + 82000 5.7582159 444 -0 1.288053 + 83000 5.8298571 444 -0 1.303761 + 84000 5.9029069 444 -0 1.3194689 + 85000 6.0061591 888 -0 1.3351769 + 86000 6.1541281 888 -0 1.3508848 + 87000 6.3004079 888 -0 1.3665928 + 88000 6.4460659 888 -0 1.3823008 + 89000 6.591886 888 -0 1.3980087 + 90000 6.7376239 888 -0 1.4137167 + 91000 6.850734 888 -0 1.4294247 + 92000 6.9631939 888 -0 1.4451326 + 93000 7.0786369 888 -0 1.4608406 + 94000 7.1958089 888 -0 1.4765485 + 95000 7.3130219 888 -0 1.4922565 + 96000 7.430867 888 -0 1.5079645 + 97000 7.5498819 888 -0 1.5236724 + 98000 7.673686 888 -0 1.5393804 + 99000 7.7966969 888 -0 1.5550884 + 100000 7.921546 888 -0 1.5707963 + 101000 8.0396931 888 -0 1.5865043 + 102000 8.1583791 888 -0 1.6022123 + 103000 8.276613 888 -0 1.6179202 + 104000 8.3952639 888 -0 1.6336282 + 105000 8.514308 888 -0 1.6493361 + 106000 8.6361439 888 -0 1.6650441 + 107000 8.762326 888 -0 1.6807521 + 108000 8.8900061 888 -0 1.69646 + 109000 9.0179789 888 -0 1.712168 + 110000 9.1496761 888 -0 1.727876 + 111000 9.2728269 888 -0 1.7435839 + 112000 9.398078 888 -0 1.7592919 + 113000 9.519841 888 -0 1.7749998 + 114000 9.642343 888 -0 1.7907078 + 115000 9.7643859 888 -0 1.8064158 + 116000 9.8893411 888 -0 1.8221237 + 117000 10.01295 888 -0 1.8378317 + 118000 10.137574 888 -0 1.8535397 + 119000 10.263738 888 -0 1.8692476 + 120000 10.388673 888 -0 1.8849556 + 121000 10.507599 888 -0 1.9006636 + 122000 10.623901 888 -0 1.9163715 + 123000 10.740251 888 -0 1.9320795 + 124000 10.857467 888 -0 1.9477874 + 125000 10.975856 888 -0 1.9634954 + 126000 11.096002 888 -0 1.9792034 + 127000 11.217218 888 -0 1.9949113 + 128000 11.341925 888 -0 2.0106193 + 129000 11.467607 888 -0 2.0263273 + 130000 11.59517 888 -0 2.0420352 + 131000 11.71358 888 -0 2.0577432 + 132000 11.833024 888 -0 2.0734512 + 133000 11.954967 888 -0 2.0891591 + 134000 12.078482 888 -0 2.1048671 + 135000 12.202435 888 -0 2.120575 + 136000 12.327202 888 -0 2.136283 + 137000 12.453334 888 -0 2.151991 + 138000 12.583142 888 -0 2.1676989 + 139000 12.718396 888 -0 2.1834069 + 140000 12.854459 888 -0 2.1991149 + 141000 12.981024 888 -0 2.2148228 + 142000 13.108875 888 -0 2.2305308 + 143000 13.236802 888 -0 2.2462387 + 144000 13.36691 888 -0 2.2619467 + 145000 13.500126 888 -0 2.2776547 + 146000 13.633748 888 -0 2.2933626 + 147000 13.769077 888 -0 2.3090706 + 148000 13.90522 888 -0 2.3247786 + 149000 14.040417 888 -0 2.3404865 + 150000 14.176483 888 -0 2.3561945 + 151000 14.303389 888 -0 2.3719025 + 152000 14.432187 888 -0 2.3876104 + 153000 14.559857 888 -0 2.4033184 + 154000 14.691256 888 -0 2.4190263 + 155000 14.823413 888 -0 2.4347343 + 156000 14.956581 888 -0 2.4504423 + 157000 15.090666 888 -0 2.4661502 + 158000 15.228012 888 -0 2.4818582 + 159000 15.364569 888 -0 2.4975662 + 160000 15.501847 888 -0 2.5132741 + 161000 15.642772 888 -0 2.5289821 + 162000 15.783889 888 -0 2.54469 + 163000 15.926508 888 -0 2.560398 + 164000 16.07293 888 -0 2.576106 + 165000 16.221293 888 -0 2.5918139 + 166000 16.371738 888 -0 2.6075219 + 167000 16.523027 888 -0 2.6232299 + 168000 16.675525 888 -0 2.6389378 + 169000 16.830527 888 -0 2.6546458 + 170000 16.989955 1000 -0 2.6703538 + 171000 17.14772 1000 -0 2.6860617 + 172000 17.305565 1000 -0 2.7017697 + 173000 17.463517 1000 -0 2.7174776 + 174000 17.623862 1000 -0 2.7331856 + 175000 17.788165 1000 -0 2.7488936 + 176000 17.952028 1000 -0 2.7646015 + 177000 18.119269 1000 -0 2.7803095 + 178000 18.285714 1000 -0 2.7960175 + 179000 18.452439 1000 -0 2.8117254 + 180000 18.621119 1000 -0 2.8274334 + 181000 18.777982 1000 -0 2.8431414 + 182000 18.940248 1000 -0 2.8588493 + 183000 19.105385 1000 -0 2.8745573 + 184000 19.273934 1000 -0 2.8902652 + 185000 19.450922 1000 -0 2.9059732 + 186000 19.625563 1000 -0 2.9216812 + 187000 19.801329 1000 -0 2.9373891 + 188000 19.976869 1000 -0 2.9530971 + 189000 20.151134 1000 -0 2.9688051 + 190000 20.319214 1000 -0 2.984513 + 191000 20.485033 1000 -0 3.000221 + 192000 20.652254 1000 -0 3.0159289 + 193000 20.820876 1000 -0 3.0316369 + 194000 20.988597 1000 -0 3.0473449 + 195000 21.154705 1000 -0 3.0630528 + 196000 21.322634 1000 -0 3.0787608 + 197000 21.489394 1000 -0 3.0944688 + 198000 21.659512 1000 -0 3.1101767 + 199000 21.833228 1000 -0 3.1258847 + 200000 22.006487 1000 -0 3.1415927 +Loop time of 22.0065 on 4 procs for 200000 steps with 1000 atoms + +Performance: 37102.953 tau/day, 9088.222 timesteps/s +99.1% CPU use with 4 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.67692 | 1.166 | 1.6704 | 44.4 | 5.30 +Neigh | 0.01562 | 0.018723 | 0.0222 | 2.3 | 0.09 +Comm | 3.845 | 4.4454 | 5.0282 | 26.1 | 20.20 +Output | 0.0043464 | 0.0052906 | 0.0056455 | 0.8 | 0.02 +Modify | 12.239 | 13.152 | 14.347 | 25.1 | 59.76 +Other | | 3.22 | | | 14.63 + +Nlocal: 250 ave 257 max 244 min +Histogram: 1 1 0 0 0 0 1 0 0 1 +Nghost: 305.75 ave 372 max 242 min +Histogram: 1 0 0 1 0 1 0 0 0 1 +Neighs: 982.5 ave 1380 max 572 min +Histogram: 2 0 0 0 0 0 0 0 0 2 + +Total # of neighbors = 3930 +Ave neighs/atom = 3.93 +Neighbor list builds = 216 +Dangerous builds = 0 +unfix ins +run 200000 +Neighbor list info ... + 2 neighbor list requests + update every 1 steps, delay 10 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 1.79826 + ghost atom cutoff = 1.79826 + binsize = 0.899132 -> bins = 23 23 23 +Memory usage per processor = 8.63577 Mbytes +Step CPU Atoms KinEng v_theta + 200000 0 1000 0.90316284 3.1415927 + 201000 0.16518497 1000 0.8867387 3.1573006 + 202000 0.33065486 1000 0.88745316 3.1730086 + 203000 0.4991529 1000 0.87793424 3.1887165 + 204000 0.6695168 1000 0.87009551 3.2044245 + 205000 0.83599901 1000 0.86431259 3.2201325 + 206000 1.001833 1000 0.85039776 3.2358404 + 207000 1.166487 1000 0.82897867 3.2515484 + 208000 1.3331649 1000 0.82069182 3.2672564 + 209000 1.5031869 1000 0.82349024 3.2829643 + 210000 1.6751509 1000 0.81859611 3.2986723 + 211000 1.846776 1000 0.82053992 3.3143802 + 212000 2.0198569 1000 0.82832647 3.3300882 + 213000 2.1932938 1000 0.82676865 3.3457962 + 214000 2.3676898 1000 0.82425781 3.3615041 + 215000 2.5424879 1000 0.83127148 3.3772121 + 216000 2.715348 1000 0.83925992 3.3929201 + 217000 2.8844988 1000 0.84390181 3.408628 + 218000 3.0485029 1000 0.85705713 3.424336 + 219000 3.211767 1000 0.85325946 3.440044 + 220000 3.3767338 1000 0.85641557 3.4557519 + 221000 3.5419538 1000 0.86922287 3.4714599 + 222000 3.710084 1000 0.89591143 3.4871678 + 223000 3.880873 1000 0.90395821 3.5028758 + 224000 4.054816 1000 0.91161431 3.5185838 + 225000 4.2260928 1000 0.92716425 3.5342917 + 226000 4.3996999 1000 0.91664886 3.5499997 + 227000 4.5679309 1000 0.9128853 3.5657077 + 228000 4.7353978 1000 0.91063998 3.5814156 + 229000 4.9045198 1000 0.90616712 3.5971236 + 230000 5.079206 1000 0.9042797 3.6128316 + 231000 5.252316 1000 0.91588137 3.6285395 + 232000 5.4218178 1000 0.92322871 3.6442475 + 233000 5.592988 1000 0.92370885 3.6599554 + 234000 5.753634 1000 0.91531408 3.6756634 + 235000 5.9159088 1000 0.91016621 3.6913714 + 236000 6.0817358 1000 0.89501073 3.7070793 + 237000 6.249059 1000 0.88504426 3.7227873 + 238000 6.4182718 1000 0.88268268 3.7384953 + 239000 6.5897119 1000 0.87811868 3.7542032 + 240000 6.758353 1000 0.88272663 3.7699112 + 241000 6.928581 1000 0.87751512 3.7856191 + 242000 7.0978079 1000 0.87017281 3.8013271 + 243000 7.268832 1000 0.86587613 3.8170351 + 244000 7.439904 1000 0.85157794 3.832743 + 245000 7.6105168 1000 0.8291738 3.848451 + 246000 7.7830069 1000 0.82315948 3.864159 + 247000 7.9578128 1000 0.81231703 3.8798669 + 248000 8.134944 1000 0.79931415 3.8955749 + 249000 8.3061719 1000 0.78877578 3.9112829 + 250000 8.476692 1000 0.78519942 3.9269908 + 251000 8.6525538 1000 0.78837716 3.9426988 + 252000 8.8288019 1000 0.79621044 3.9584067 + 253000 9.006846 1000 0.78744385 3.9741147 + 254000 9.1839809 1000 0.78810047 3.9898227 + 255000 9.3600328 1000 0.79053484 4.0055306 + 256000 9.538172 1000 0.79976932 4.0212386 + 257000 9.7188668 1000 0.81724577 4.0369466 + 258000 9.9032769 1000 0.81135963 4.0526545 + 259000 10.084928 1000 0.82017101 4.0683625 + 260000 10.266693 1000 0.82352898 4.0840704 + 261000 10.449515 1000 0.81662689 4.0997784 + 262000 10.630166 1000 0.82707216 4.1154864 + 263000 10.812056 1000 0.82001278 4.1311943 + 264000 10.991668 1000 0.81136264 4.1469023 + 265000 11.172162 1000 0.80507755 4.1626103 + 266000 11.353101 1000 0.80247583 4.1783182 + 267000 11.533476 1000 0.78870449 4.1940262 + 268000 11.716022 1000 0.77775428 4.2097342 + 269000 11.900351 1000 0.78170639 4.2254421 + 270000 12.083609 1000 0.78023258 4.2411501 + 271000 12.266298 1000 0.76257507 4.256858 + 272000 12.449454 1000 0.75871195 4.272566 + 273000 12.633748 1000 0.75909277 4.288274 + 274000 12.820916 1000 0.76329234 4.3039819 + 275000 13.004197 1000 0.76188557 4.3196899 + 276000 13.188507 1000 0.75974847 4.3353979 + 277000 13.372202 1000 0.75392834 4.3511058 + 278000 13.557712 1000 0.74837333 4.3668138 + 279000 13.747933 1000 0.74268307 4.3825218 + 280000 13.934871 1000 0.73840427 4.3982297 + 281000 14.11717 1000 0.73817851 4.4139377 + 282000 14.30208 1000 0.73666069 4.4296456 + 283000 14.485039 1000 0.74064713 4.4453536 + 284000 14.671087 1000 0.73916222 4.4610616 + 285000 14.863267 1000 0.73225442 4.4767695 + 286000 15.050005 1000 0.7312283 4.4924775 + 287000 15.234556 1000 0.72947519 4.5081855 + 288000 15.422593 1000 0.72469992 4.5238934 + 289000 15.609153 1000 0.70843645 4.5396014 + 290000 15.797906 1000 0.69731415 4.5553093 + 291000 15.983677 1000 0.69099822 4.5710173 + 292000 16.168935 1000 0.68855366 4.5867253 + 293000 16.355853 1000 0.69826256 4.6024332 + 294000 16.544831 1000 0.70211589 4.6181412 + 295000 16.733875 1000 0.7055847 4.6338492 + 296000 16.918698 1000 0.69692413 4.6495571 + 297000 17.100869 1000 0.68027227 4.6652651 + 298000 17.280404 1000 0.67254493 4.6809731 + 299000 17.46406 1000 0.67767946 4.696681 + 300000 17.652748 1000 0.68480172 4.712389 + 301000 17.84199 1000 0.67864643 4.7280969 + 302000 18.025759 1000 0.67656342 4.7438049 + 303000 18.208747 1000 0.67719641 4.7595129 + 304000 18.391225 1000 0.68049491 4.7752208 + 305000 18.576276 1000 0.68230722 4.7909288 + 306000 18.764125 1000 0.67985 4.8066368 + 307000 18.956063 1000 0.67790944 4.8223447 + 308000 19.147159 1000 0.6836647 4.8380527 + 309000 19.339173 1000 0.69705355 4.8537606 + 310000 19.530591 1000 0.69858847 4.8694686 + 311000 19.720214 1000 0.69448554 4.8851766 + 312000 19.907717 1000 0.68878539 4.9008845 + 313000 20.088793 1000 0.68810484 4.9165925 + 314000 20.268118 1000 0.68483484 4.9323005 + 315000 20.445564 1000 0.67732034 4.9480084 + 316000 20.627415 1000 0.67943319 4.9637164 + 317000 20.807826 1000 0.67326868 4.9794244 + 318000 20.983587 1000 0.67762092 4.9951323 + 319000 21.156655 1000 0.68914624 5.0108403 + 320000 21.331391 1000 0.69872806 5.0265482 + 321000 21.506313 1000 0.71510434 5.0422562 + 322000 21.679505 1000 0.71452122 5.0579642 + 323000 21.85396 1000 0.71765429 5.0736721 + 324000 22.02904 1000 0.72748838 5.0893801 + 325000 22.205191 1000 0.72974854 5.1050881 + 326000 22.38063 1000 0.73324928 5.120796 + 327000 22.555817 1000 0.72479525 5.136504 + 328000 22.729859 1000 0.71942855 5.152212 + 329000 22.903234 1000 0.71890587 5.1679199 + 330000 23.078575 1000 0.73495891 5.1836279 + 331000 23.252865 1000 0.74306733 5.1993358 + 332000 23.427175 1000 0.75274051 5.2150438 + 333000 23.604881 1000 0.75981346 5.2307518 + 334000 23.789045 1000 0.75410165 5.2464597 + 335000 23.971105 1000 0.74802374 5.2621677 + 336000 24.150954 1000 0.73111266 5.2778757 + 337000 24.331991 1000 0.72226021 5.2935836 + 338000 24.515157 1000 0.70866271 5.3092916 + 339000 24.69639 1000 0.70253496 5.3249995 + 340000 24.879524 1000 0.69381505 5.3407075 + 341000 25.061928 1000 0.68285569 5.3564155 + 342000 25.2437 1000 0.67262303 5.3721234 + 343000 25.423809 1000 0.67160137 5.3878314 + 344000 25.605531 1000 0.67658439 5.4035394 + 345000 25.78848 1000 0.67113748 5.4192473 + 346000 25.969866 1000 0.67506296 5.4349553 + 347000 26.152485 1000 0.67686518 5.4506633 + 348000 26.335445 1000 0.68878941 5.4663712 + 349000 26.522271 1000 0.70728493 5.4820792 + 350000 26.709942 1000 0.70870657 5.4977871 + 351000 26.889998 1000 0.71541489 5.5134951 + 352000 27.069872 1000 0.71827633 5.5292031 + 353000 27.249259 1000 0.7099127 5.544911 + 354000 27.428386 1000 0.70507946 5.560619 + 355000 27.607797 1000 0.70709703 5.576327 + 356000 27.788887 1000 0.70637714 5.5920349 + 357000 27.975344 1000 0.7088694 5.6077429 + 358000 28.164236 1000 0.70907948 5.6234508 + 359000 28.352999 1000 0.71504714 5.6391588 + 360000 28.539172 1000 0.71417205 5.6548668 + 361000 28.722691 1000 0.70716852 5.6705747 + 362000 28.906856 1000 0.70193967 5.6862827 + 363000 29.087598 1000 0.69786793 5.7019907 + 364000 29.268141 1000 0.68714789 5.7176986 + 365000 29.450765 1000 0.68170443 5.7334066 + 366000 29.633131 1000 0.67832571 5.7491146 + 367000 29.816219 1000 0.67809457 5.7648225 + 368000 29.999479 1000 0.66886004 5.7805305 + 369000 30.182675 1000 0.67233336 5.7962384 + 370000 30.36698 1000 0.67433369 5.8119464 + 371000 30.550787 1000 0.67478226 5.8276544 + 372000 30.736018 1000 0.67882814 5.8433623 + 373000 30.922576 1000 0.68494254 5.8590703 + 374000 31.107558 1000 0.69046765 5.8747783 + 375000 31.291329 1000 0.69398953 5.8904862 + 376000 31.474582 1000 0.68692367 5.9061942 + 377000 31.656979 1000 0.674184 5.9219022 + 378000 31.83851 1000 0.65899449 5.9376101 + 379000 32.019869 1000 0.65198402 5.9533181 + 380000 32.200375 1000 0.64366122 5.969026 + 381000 32.381651 1000 0.64443345 5.984734 + 382000 32.561897 1000 0.64655912 6.000442 + 383000 32.743947 1000 0.64894161 6.0161499 + 384000 32.927231 1000 0.65259561 6.0318579 + 385000 33.11882 1000 0.65230446 6.0475659 + 386000 33.311072 1000 0.64177598 6.0632738 + 387000 33.50435 1000 0.63900349 6.0789818 + 388000 33.695734 1000 0.64611067 6.0946897 + 389000 33.885915 1000 0.64943993 6.1103977 + 390000 34.076093 1000 0.66303716 6.1261057 + 391000 34.264909 1000 0.68916583 6.1418136 + 392000 34.45411 1000 0.71501556 6.1575216 + 393000 34.644116 1000 0.73685375 6.1732296 + 394000 34.834608 1000 0.74461041 6.1889375 + 395000 35.025693 1000 0.75251204 6.2046455 + 396000 35.217372 1000 0.75493054 6.2203535 + 397000 35.407008 1000 0.77028775 6.2360614 + 398000 35.594868 1000 0.7686439 6.2517694 + 399000 35.778411 1000 0.75167376 6.2674773 + 400000 35.962646 1000 0.73505917 6.2831853 +Loop time of 35.9627 on 4 procs for 200000 steps with 1000 atoms + +Performance: 22704.278 tau/day, 5561.323 timesteps/s +99.0% CPU use with 4 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 2.0549 | 3.4094 | 4.9773 | 72.1 | 9.48 +Neigh | 0.022087 | 0.026923 | 0.032716 | 2.9 | 0.07 +Comm | 7.3555 | 9.2143 | 10.854 | 53.0 | 25.62 +Output | 0.0046289 | 0.0058927 | 0.0071292 | 1.4 | 0.02 +Modify | 17.504 | 19.601 | 22.342 | 44.9 | 54.50 +Other | | 3.705 | | | 10.30 + +Nlocal: 250 ave 269 max 225 min +Histogram: 1 0 0 0 0 1 0 1 0 1 +Nghost: 408.5 ave 500 max 320 min +Histogram: 2 0 0 0 0 0 0 0 0 2 +Neighs: 1262.25 ave 1665 max 880 min +Histogram: 1 0 1 0 0 0 0 1 0 1 + +Total # of neighbors = 5049 +Ave neighs/atom = 5.049 +Neighbor list builds = 166 +Dangerous builds = 0 +Total wall time: 0:00:57 diff --git a/src/GRANULAR/fix_wall_gran.cpp b/src/GRANULAR/fix_wall_gran.cpp index 4e927b2579..781ec91447 100644 --- a/src/GRANULAR/fix_wall_gran.cpp +++ b/src/GRANULAR/fix_wall_gran.cpp @@ -12,7 +12,8 @@ ------------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- - Contributing authors: Leo Silbert (SNL), Gary Grest (SNL) + Contributing authors: Leo Silbert (SNL), Gary Grest (SNL), + Dan Bolintineanu (SNL) ------------------------------------------------------------------------- */ #include @@ -34,8 +35,11 @@ using namespace LAMMPS_NS; using namespace FixConst; using namespace MathConst; -enum{XPLANE=0,YPLANE=1,ZPLANE=2,ZCYLINDER}; // XYZ PLANE need to be 0,1,2 -enum{HOOKE,HOOKE_HISTORY,HERTZ_HISTORY}; +// XYZ PLANE need to be 0,1,2 + +enum{XPLANE=0,YPLANE=1,ZPLANE=2,ZCYLINDER,REGION}; +enum{HOOKE,HOOKE_HISTORY,HERTZ_HISTORY,BONDED_HISTORY}; +enum{NONE,CONSTANT,EQUAL}; #define BIG 1.0e20 @@ -44,7 +48,7 @@ enum{HOOKE,HOOKE_HISTORY,HERTZ_HISTORY}; FixWallGran::FixWallGran(LAMMPS *lmp, int narg, char **arg) : Fix(lmp, narg, arg) { - if (narg < 11) error->all(FLERR,"Illegal fix wall/gran command"); + if (narg < 4) error->all(FLERR,"Illegal fix wall/gran command"); if (!atom->sphere_flag) error->all(FLERR,"Fix wall/gran requires atom style sphere"); @@ -53,43 +57,71 @@ FixWallGran::FixWallGran(LAMMPS *lmp, int narg, char **arg) : create_attribute = 1; // set interaction style + // disable bonded/history option for now if (strcmp(arg[3],"hooke") == 0) pairstyle = HOOKE; else if (strcmp(arg[3],"hooke/history") == 0) pairstyle = HOOKE_HISTORY; else if (strcmp(arg[3],"hertz/history") == 0) pairstyle = HERTZ_HISTORY; + //else if (strcmp(arg[3],"bonded/history") == 0) pairstyle = BONDED_HISTORY; else error->all(FLERR,"Invalid fix wall/gran interaction style"); history = 1; if (pairstyle == HOOKE) history = 0; - // particle/wall coefficients + // wall/particle coefficients - kn = force->numeric(FLERR,arg[4]); - if (strcmp(arg[5],"NULL") == 0) kt = kn * 2.0/7.0; - else kt = force->numeric(FLERR,arg[5]); + int iarg; - gamman = force->numeric(FLERR,arg[6]); - if (strcmp(arg[7],"NULL") == 0) gammat = 0.5 * gamman; - else gammat = force->numeric(FLERR,arg[7]); + if (pairstyle != BONDED_HISTORY) { + if (narg < 11) error->all(FLERR,"Illegal fix wall/gran command"); - xmu = force->numeric(FLERR,arg[8]); - int dampflag = force->inumeric(FLERR,arg[9]); - if (dampflag == 0) gammat = 0.0; + kn = force->numeric(FLERR,arg[4]); + if (strcmp(arg[5],"NULL") == 0) kt = kn * 2.0/7.0; + else kt = force->numeric(FLERR,arg[5]); + + gamman = force->numeric(FLERR,arg[6]); + if (strcmp(arg[7],"NULL") == 0) gammat = 0.5 * gamman; + else gammat = force->numeric(FLERR,arg[7]); + + xmu = force->numeric(FLERR,arg[8]); + int dampflag = force->inumeric(FLERR,arg[9]); + if (dampflag == 0) gammat = 0.0; + + if (kn < 0.0 || kt < 0.0 || gamman < 0.0 || gammat < 0.0 || + xmu < 0.0 || xmu > 10000.0 || dampflag < 0 || dampflag > 1) + error->all(FLERR,"Illegal fix wall/gran command"); + + // convert Kn and Kt from pressure units to force/distance^2 if Hertzian + + if (pairstyle == HERTZ_HISTORY) { + kn /= force->nktv2p; + kt /= force->nktv2p; + } - if (kn < 0.0 || kt < 0.0 || gamman < 0.0 || gammat < 0.0 || - xmu < 0.0 || xmu > 10000.0 || dampflag < 0 || dampflag > 1) - error->all(FLERR,"Illegal fix wall/gran command"); + iarg = 10; + } - // convert Kn and Kt from pressure units to force/distance^2 if Hertzian + else { + if (narg < 10) error->all(FLERR,"Illegal fix wall/gran command"); - if (pairstyle == HERTZ_HISTORY) { - kn /= force->nktv2p; - kt /= force->nktv2p; + E = force->numeric(FLERR,arg[4]); + G = force->numeric(FLERR,arg[5]); + SurfEnergy = force->numeric(FLERR,arg[6]); + // Note: this doesn't get used, check w/ Jeremy? + gamman = force->numeric(FLERR,arg[7]); + + xmu = force->numeric(FLERR,arg[8]); + // pois = E/(2.0*G) - 1.0; + // kn = 2.0*E/(3.0*(1.0+pois)*(1.0-pois)); + // gammat=0.5*gamman; + + iarg = 9; } // wallstyle args + + idregion = NULL; - int iarg = 10; if (strcmp(arg[iarg],"xplane") == 0) { if (narg < iarg+3) error->all(FLERR,"Illegal fix wall/gran command"); wallstyle = XPLANE; @@ -118,15 +150,22 @@ FixWallGran::FixWallGran(LAMMPS *lmp, int narg, char **arg) : if (narg < iarg+2) error->all(FLERR,"Illegal fix wall/gran command"); wallstyle = ZCYLINDER; lo = hi = 0.0; - cylradius = force->numeric(FLERR,arg[iarg+1]); + cylradius = force->numeric(FLERR,arg[iarg+3]); + iarg += 2; + } else if (strcmp(arg[iarg],"region") == 0) { + if (narg < iarg+2) error->all(FLERR,"Illegal fix wall/gran command"); + wallstyle = REGION; + int n = strlen(arg[iarg+1]) + 1; + idregion = new char[n]; + strcpy(idregion,arg[iarg+1]); iarg += 2; } - - // check for trailing keyword/values + + // optional args wiggle = 0; wshear = 0; - + while (iarg < narg) { if (strcmp(arg[iarg],"wiggle") == 0) { if (iarg+4 > narg) error->all(FLERR,"Illegal fix wall/gran command"); @@ -149,7 +188,7 @@ FixWallGran::FixWallGran(LAMMPS *lmp, int narg, char **arg) : iarg += 3; } else error->all(FLERR,"Illegal fix wall/gran command"); } - + if (wallstyle == XPLANE && domain->xperiodic) error->all(FLERR,"Cannot use wall in periodic dimension"); if (wallstyle == YPLANE && domain->yperiodic) @@ -158,7 +197,7 @@ FixWallGran::FixWallGran(LAMMPS *lmp, int narg, char **arg) : error->all(FLERR,"Cannot use wall in periodic dimension"); if (wallstyle == ZCYLINDER && (domain->xperiodic || domain->yperiodic)) error->all(FLERR,"Cannot use wall in periodic dimension"); - + if (wiggle && wshear) error->all(FLERR,"Cannot wiggle and shear fix wall/gran"); if (wiggle && wallstyle == ZCYLINDER && axis != 2) @@ -169,15 +208,20 @@ FixWallGran::FixWallGran(LAMMPS *lmp, int narg, char **arg) : error->all(FLERR,"Invalid shear direction for fix wall/gran"); if (wshear && wallstyle == ZPLANE && axis == 2) error->all(FLERR,"Invalid shear direction for fix wall/gran"); + if ((wiggle || wshear) && wallstyle == REGION) + error->all(FLERR,"Cannot wiggle or shear with fix wall/gran/region"); // setup oscillations - + if (wiggle) omega = 2.0*MY_PI / period; - + // perform initial allocation of atom-based arrays // register with Atom class - shear = NULL; + if (pairstyle == BONDED_HISTORY) sheardim = 7; + else sheardim = 3; + + shearone = NULL; grow_arrays(atom->nmax); atom->add_callback(0); atom->add_callback(1); @@ -185,12 +229,14 @@ FixWallGran::FixWallGran(LAMMPS *lmp, int narg, char **arg) : nmax = 0; mass_rigid = NULL; - // initialize as if particle is not touching wall + // initialize shear history as if particle is not touching region + // shearone will be NULL for wallstyle = REGION - if (history) { + if (history && shearone) { int nlocal = atom->nlocal; for (int i = 0; i < nlocal; i++) - shear[i][0] = shear[i][1] = shear[i][2] = 0.0; + for (int j = 0; j < sheardim; j++) + shearone[i][j] = 0.0; } time_origin = update->ntimestep; @@ -205,9 +251,10 @@ FixWallGran::~FixWallGran() atom->delete_callback(id,0); atom->delete_callback(id,1); - // delete locally stored arrays + // delete local storage - memory->destroy(shear); + delete [] idregion; + memory->destroy(shearone); memory->destroy(mass_rigid); } @@ -257,8 +304,8 @@ void FixWallGran::setup(int vflag) void FixWallGran::post_force(int vflag) { - int i; - double dx,dy,dz,del1,del2,delxy,delr,rsq,meff; + int i,j; + double dx,dy,dz,del1,del2,delxy,delr,rsq,rwall,meff; double vwall[3]; // do not update shear history during setup @@ -301,7 +348,7 @@ void FixWallGran::post_force(int vflag) } vwall[axis] = amplitude*omega*sin(arg); } else if (wshear) vwall[axis] = vshear; - + // loop over all my atoms // rsq = distance from wall // dx,dy,dz = signed distance from wall @@ -311,7 +358,7 @@ void FixWallGran::post_force(int vflag) // compute force and torque on atom if close enough to wall // via wall potential matched to pair potential // set shear if pair potential stores history - + double **x = atom->x; double **v = atom->v; double **f = atom->f; @@ -321,12 +368,14 @@ void FixWallGran::post_force(int vflag) double *rmass = atom->rmass; int *mask = atom->mask; int nlocal = atom->nlocal; + + rwall = 0.0; for (int i = 0; i < nlocal; i++) { if (mask[i] & groupbit) { - + dx = dy = dz = 0.0; - + if (wallstyle == XPLANE) { del1 = x[i][0] - wlo; del2 = whi - x[i][0]; @@ -345,26 +394,29 @@ void FixWallGran::post_force(int vflag) } else if (wallstyle == ZCYLINDER) { delxy = sqrt(x[i][0]*x[i][0] + x[i][1]*x[i][1]); delr = cylradius - delxy; - if (delr > radius[i]) dz = cylradius; - else { + if (delr > radius[i]) { + dz = cylradius; + rwall = 0.0; + } else { dx = -delr/delxy * x[i][0]; dy = -delr/delxy * x[i][1]; + // rwall = -2r_c if inside cylinder, 2r_c outside + rwall = 2*(1-2*(delxy < cylradius))*cylradius; if (wshear && axis != 2) { - vwall[0] = vshear * x[i][1]/delxy; - vwall[1] = -vshear * x[i][0]/delxy; + vwall[0] += vshear * x[i][1]/delxy; + vwall[1] += -vshear * x[i][0]/delxy; vwall[2] = 0.0; } } } - + rsq = dx*dx + dy*dy + dz*dz; - + if (rsq > radius[i]*radius[i]) { - if (pairstyle != HOOKE) { - shear[i][0] = 0.0; - shear[i][1] = 0.0; - shear[i][2] = 0.0; - } + if (history) + for (j = 0; j < sheardim; j++) + shearone[i][j] = 0.0; + } else { // meff = effective mass of sphere @@ -373,17 +425,20 @@ void FixWallGran::post_force(int vflag) meff = rmass[i]; if (fix_rigid && mass_rigid[i] > 0.0) meff = mass_rigid[i]; - // inovke sphere/wall interaction + // invoke sphere/wall interaction if (pairstyle == HOOKE) - hooke(rsq,dx,dy,dz,vwall,v[i],f[i],omega[i],torque[i], - radius[i],meff); + hooke(rsq,dx,dy,dz,vwall,v[i],f[i], + omega[i],torque[i],radius[i],meff); else if (pairstyle == HOOKE_HISTORY) - hooke_history(rsq,dx,dy,dz,vwall,v[i],f[i],omega[i],torque[i], - radius[i],meff,shear[i]); + hooke_history(rsq,dx,dy,dz,vwall,v[i],f[i], + omega[i],torque[i],radius[i],meff,shearone[i]); else if (pairstyle == HERTZ_HISTORY) - hertz_history(rsq,dx,dy,dz,vwall,v[i],f[i],omega[i],torque[i], - radius[i],meff,shear[i]); + hertz_history(rsq,dx,dy,dz,vwall,rwall,v[i],f[i], + omega[i],torque[i],radius[i],meff,shearone[i]); + else if (pairstyle == BONDED_HISTORY) + bonded_history(rsq,dx,dy,dz,vwall,rwall,v[i],f[i], + omega[i],torque[i],radius[i],meff,shearone[i]); } } } @@ -412,66 +467,66 @@ void FixWallGran::hooke(double rsq, double dx, double dy, double dz, rsqinv = 1.0/rsq; // relative translational velocity - + vr1 = v[0] - vwall[0]; vr2 = v[1] - vwall[1]; vr3 = v[2] - vwall[2]; - + // normal component - + vnnr = vr1*dx + vr2*dy + vr3*dz; vn1 = dx*vnnr * rsqinv; vn2 = dy*vnnr * rsqinv; vn3 = dz*vnnr * rsqinv; - + // tangential component - + vt1 = vr1 - vn1; vt2 = vr2 - vn2; vt3 = vr3 - vn3; - + // relative rotational velocity - + wr1 = radius*omega[0] * rinv; wr2 = radius*omega[1] * rinv; wr3 = radius*omega[2] * rinv; - + // normal forces = Hookian contact + normal velocity damping - + damp = meff*gamman*vnnr*rsqinv; ccel = kn*(radius-r)*rinv - damp; - + // relative velocities - + vtr1 = vt1 - (dz*wr2-dy*wr3); vtr2 = vt2 - (dx*wr3-dz*wr1); vtr3 = vt3 - (dy*wr1-dx*wr2); vrel = vtr1*vtr1 + vtr2*vtr2 + vtr3*vtr3; vrel = sqrt(vrel); - + // force normalization - + fn = xmu * fabs(ccel*r); fs = meff*gammat*vrel; if (vrel != 0.0) ft = MIN(fn,fs) / vrel; else ft = 0.0; - + // tangential force due to tangential velocity damping - + fs1 = -ft*vtr1; fs2 = -ft*vtr2; fs3 = -ft*vtr3; - + // forces & torques - + fx = dx*ccel + fs1; fy = dy*ccel + fs2; fz = dz*ccel + fs3; - + f[0] += fx; f[1] += fy; f[2] += fz; - + tor1 = rinv * (dy*fs3 - dz*fs2); tor2 = rinv * (dz*fs1 - dx*fs3); tor3 = rinv * (dx*fs2 - dy*fs1); @@ -491,49 +546,172 @@ void FixWallGran::hooke_history(double rsq, double dx, double dy, double dz, double wr1,wr2,wr3,damp,ccel,vtr1,vtr2,vtr3,vrel; double fn,fs,fs1,fs2,fs3,fx,fy,fz,tor1,tor2,tor3; double shrmag,rsht,rinv,rsqinv; - + r = sqrt(rsq); rinv = 1.0/r; rsqinv = 1.0/rsq; - + // relative translational velocity - + vr1 = v[0] - vwall[0]; vr2 = v[1] - vwall[1]; vr3 = v[2] - vwall[2]; - + // normal component - + vnnr = vr1*dx + vr2*dy + vr3*dz; vn1 = dx*vnnr * rsqinv; vn2 = dy*vnnr * rsqinv; vn3 = dz*vnnr * rsqinv; - + // tangential component - + vt1 = vr1 - vn1; vt2 = vr2 - vn2; vt3 = vr3 - vn3; - + // relative rotational velocity - + wr1 = radius*omega[0] * rinv; wr2 = radius*omega[1] * rinv; wr3 = radius*omega[2] * rinv; - + // normal forces = Hookian contact + normal velocity damping - + damp = meff*gamman*vnnr*rsqinv; ccel = kn*(radius-r)*rinv - damp; - + // relative velocities - + vtr1 = vt1 - (dz*wr2-dy*wr3); vtr2 = vt2 - (dx*wr3-dz*wr1); vtr3 = vt3 - (dy*wr1-dx*wr2); vrel = vtr1*vtr1 + vtr2*vtr2 + vtr3*vtr3; vrel = sqrt(vrel); + + // shear history effects + + if (shearupdate) { + shear[0] += vtr1*dt; + shear[1] += vtr2*dt; + shear[2] += vtr3*dt; + } + shrmag = sqrt(shear[0]*shear[0] + shear[1]*shear[1] + shear[2]*shear[2]); + + // rotate shear displacements + + rsht = shear[0]*dx + shear[1]*dy + shear[2]*dz; + rsht = rsht*rsqinv; + if (shearupdate) { + shear[0] -= rsht*dx; + shear[1] -= rsht*dy; + shear[2] -= rsht*dz; + } + + // tangential forces = shear + tangential velocity damping + + fs1 = - (kt*shear[0] + meff*gammat*vtr1); + fs2 = - (kt*shear[1] + meff*gammat*vtr2); + fs3 = - (kt*shear[2] + meff*gammat*vtr3); + + // rescale frictional displacements and forces if needed + + fs = sqrt(fs1*fs1 + fs2*fs2 + fs3*fs3); + fn = xmu * fabs(ccel*r); + + if (fs > fn) { + if (shrmag != 0.0) { + shear[0] = (fn/fs) * (shear[0] + meff*gammat*vtr1/kt) - + meff*gammat*vtr1/kt; + shear[1] = (fn/fs) * (shear[1] + meff*gammat*vtr2/kt) - + meff*gammat*vtr2/kt; + shear[2] = (fn/fs) * (shear[2] + meff*gammat*vtr3/kt) - + meff*gammat*vtr3/kt; + fs1 *= fn/fs ; + fs2 *= fn/fs; + fs3 *= fn/fs; + } else fs1 = fs2 = fs3 = 0.0; + } + + // forces & torques + + fx = dx*ccel + fs1; + fy = dy*ccel + fs2; + fz = dz*ccel + fs3; + + f[0] += fx; + f[1] += fy; + f[2] += fz; + + tor1 = rinv * (dy*fs3 - dz*fs2); + tor2 = rinv * (dz*fs1 - dx*fs3); + tor3 = rinv * (dx*fs2 - dy*fs1); + torque[0] -= radius*tor1; + torque[1] -= radius*tor2; + torque[2] -= radius*tor3; +} +/* ---------------------------------------------------------------------- */ + +void FixWallGran::hertz_history(double rsq, double dx, double dy, double dz, + double *vwall, double rwall, double *v, + double *f, double *omega, double *torque, + double radius, double meff, double *shear) +{ + double r,vr1,vr2,vr3,vnnr,vn1,vn2,vn3,vt1,vt2,vt3; + double wr1,wr2,wr3,damp,ccel,vtr1,vtr2,vtr3,vrel; + double fn,fs,fs1,fs2,fs3,fx,fy,fz,tor1,tor2,tor3; + double shrmag,rsht,polyhertz,rinv,rsqinv; + + r = sqrt(rsq); + rinv = 1.0/r; + rsqinv = 1.0/rsq; + + // relative translational velocity + + vr1 = v[0] - vwall[0]; + vr2 = v[1] - vwall[1]; + vr3 = v[2] - vwall[2]; + + // normal component + + vnnr = vr1*dx + vr2*dy + vr3*dz; + vn1 = dx*vnnr / rsq; + vn2 = dy*vnnr / rsq; + vn3 = dz*vnnr / rsq; + + // tangential component + + vt1 = vr1 - vn1; + vt2 = vr2 - vn2; + vt3 = vr3 - vn3; + + // relative rotational velocity + + wr1 = radius*omega[0] * rinv; + wr2 = radius*omega[1] * rinv; + wr3 = radius*omega[2] * rinv; + + // normal forces = Hertzian contact + normal velocity damping + // rwall = 0 is flat wall case + // rwall positive or negative is curved wall + // will break (as it should) if rwall is negative and + // its absolute value < radius of particle + + damp = meff*gamman*vnnr*rsqinv; + ccel = kn*(radius-r)*rinv - damp; + if (rwall == 0.0) polyhertz = sqrt((radius-r)*radius); + else polyhertz = sqrt((radius-r)*radius*rwall/(rwall+radius)); + ccel *= polyhertz; + + // relative velocities + + vtr1 = vt1 - (dz*wr2-dy*wr3); + vtr2 = vt2 - (dx*wr3-dz*wr1); + vtr3 = vt3 - (dy*wr1-dx*wr2); + vrel = vtr1*vtr1 + vtr2*vtr2 + vtr3*vtr3; + vrel = sqrt(vrel); + // shear history effects if (shearupdate) { @@ -542,9 +720,9 @@ void FixWallGran::hooke_history(double rsq, double dx, double dy, double dz, shear[2] += vtr3*dt; } shrmag = sqrt(shear[0]*shear[0] + shear[1]*shear[1] + shear[2]*shear[2]); - + // rotate shear displacements - + rsht = shear[0]*dx + shear[1]*dy + shear[2]*dz; rsht = rsht*rsqinv; if (shearupdate) { @@ -552,18 +730,18 @@ void FixWallGran::hooke_history(double rsq, double dx, double dy, double dz, shear[1] -= rsht*dy; shear[2] -= rsht*dz; } - + // tangential forces = shear + tangential velocity damping - - fs1 = - (kt*shear[0] + meff*gammat*vtr1); - fs2 = - (kt*shear[1] + meff*gammat*vtr2); - fs3 = - (kt*shear[2] + meff*gammat*vtr3); - + + fs1 = -polyhertz * (kt*shear[0] + meff*gammat*vtr1); + fs2 = -polyhertz * (kt*shear[1] + meff*gammat*vtr2); + fs3 = -polyhertz * (kt*shear[2] + meff*gammat*vtr3); + // rescale frictional displacements and forces if needed - + fs = sqrt(fs1*fs1 + fs2*fs2 + fs3*fs3); fn = xmu * fabs(ccel*r); - + if (fs > fn) { if (shrmag != 0.0) { shear[0] = (fn/fs) * (shear[0] + meff*gammat*vtr1/kt) - @@ -579,7 +757,7 @@ void FixWallGran::hooke_history(double rsq, double dx, double dy, double dz, } // forces & torques - + fx = dx*ccel + fs1; fy = dy*ccel + fs2; fz = dz*ccel + fs3; @@ -587,7 +765,7 @@ void FixWallGran::hooke_history(double rsq, double dx, double dy, double dz, f[0] += fx; f[1] += fy; f[2] += fz; - + tor1 = rinv * (dy*fs3 - dz*fs2); tor2 = rinv * (dz*fs1 - dx*fs3); tor3 = rinv * (dx*fs2 - dy*fs1); @@ -596,18 +774,30 @@ void FixWallGran::hooke_history(double rsq, double dx, double dy, double dz, torque[2] -= radius*tor3; } + /* ---------------------------------------------------------------------- */ -void FixWallGran::hertz_history(double rsq, double dx, double dy, double dz, - double *vwall, double *v, - double *f, double *omega, double *torque, - double radius, double meff, double *shear) +void FixWallGran::bonded_history(double rsq, double dx, double dy, double dz, + double *vwall, double rwall, double *v, + double *f, double *omega, double *torque, + double radius, double meff, double *shear) { double r,vr1,vr2,vr3,vnnr,vn1,vn2,vn3,vt1,vt2,vt3; double wr1,wr2,wr3,damp,ccel,vtr1,vtr2,vtr3,vrel; double fn,fs,fs1,fs2,fs3,fx,fy,fz,tor1,tor2,tor3; double shrmag,rsht,polyhertz,rinv,rsqinv; + double pois,E_eff,G_eff,rad_eff; + double a0,Fcrit,delcrit,delcritinv; + double overlap,olapsq,olapcubed,sqrtterm,tmp,keyterm,keyterm2,keyterm3; + double aovera0,foverFc; + double gammatsuji; + + double ktwist,kroll,twistcrit,rollcrit; + double relrot1,relrot2,relrot3,vrl1,vrl2,vrl3,vrlmag,vrlmaginv; + double magtwist,magtortwist; + double magrollsq,magroll,magrollinv,magtorroll; + r = sqrt(rsq); rinv = 1.0/r; rsqinv = 1.0/rsq; @@ -638,11 +828,49 @@ void FixWallGran::hertz_history(double rsq, double dx, double dy, double dz, wr3 = radius*omega[2] * rinv; // normal forces = Hertzian contact + normal velocity damping + // material properties: currently assumes identical materials - damp = meff*gamman*vnnr*rsqinv; - ccel = kn*(radius-r)*rinv - damp; - polyhertz = sqrt((radius-r)*radius); - ccel *= polyhertz; + pois = E/(2.0*G) - 1.0; + E_eff=0.5*E/(1.0-pois*pois); + G_eff=G/(4.0-2.0*pois); + + // rwall = 0 is infinite wall radius of curvature (flat wall) + + if (rwall == 0) rad_eff = radius; + else rad_eff = radius*rwall/(radius+rwall); + + Fcrit = rad_eff * (3.0 * M_PI * SurfEnergy); + a0=pow(9.0*M_PI*SurfEnergy*rad_eff*rad_eff/E_eff,1.0/3.0); + delcrit = 1.0/rad_eff*(0.5 * a0*a0/pow(6.0,1.0/3.0)); + delcritinv = 1.0/delcrit; + + overlap = (radius-r) * delcritinv; + olapsq = overlap*overlap; + olapcubed = olapsq*overlap; + sqrtterm = sqrt(1.0 + olapcubed); + tmp = 2.0 + olapcubed + 2.0*sqrtterm; + keyterm = pow(tmp,THIRD); + keyterm2 = olapsq/keyterm; + keyterm3 = sqrt(overlap + keyterm2 + keyterm); + aovera0 = pow(6.0,-TWOTHIRDS) * (keyterm3 + + sqrt(2.0*overlap - keyterm2 - keyterm + 4.0/keyterm3)); + foverFc = 4.0*((aovera0*aovera0*aovera0) - pow(aovera0,1.5)); + ccel = Fcrit*foverFc*rinv; + + // damp = meff*gamman*vnnr*rsqinv; + // ccel = kn*(radius-r)*rinv - damp; + // polyhertz = sqrt((radius-r)*radius); + // ccel *= polyhertz; + + // use Tsuji et al form + + polyhertz = 1.2728- 4.2783*0.9 + 11.087*0.9*0.9 - 22.348*0.9*0.9*0.9 + + 27.467*0.9*0.9*0.9*0.9 - 18.022*0.9*0.9*0.9*0.9*0.9 + + 4.8218*0.9*0.9*0.9*0.9*0.9*0.9; + + gammatsuji = 0.2*sqrt(meff*kn); + damp = gammatsuji*vnnr/rsq; + ccel = ccel - polyhertz * damp; // relative velocities @@ -677,25 +905,90 @@ void FixWallGran::hertz_history(double rsq, double dx, double dy, double dz, fs2 = -polyhertz * (kt*shear[1] + meff*gammat*vtr2); fs3 = -polyhertz * (kt*shear[2] + meff*gammat*vtr3); + kt=8.0*G_eff*a0*aovera0; + + // shear damping uses Tsuji et al form also + + fs1 = -kt*shear[0] - polyhertz*gammatsuji*vtr1; + fs2 = -kt*shear[1] - polyhertz*gammatsuji*vtr2; + fs3 = -kt*shear[2] - polyhertz*gammatsuji*vtr3; + // rescale frictional displacements and forces if needed fs = sqrt(fs1*fs1 + fs2*fs2 + fs3*fs3); - fn = xmu * fabs(ccel*r); + fn = xmu * fabs(ccel*r + 2.0*Fcrit); if (fs > fn) { if (shrmag != 0.0) { - shear[0] = (fn/fs) * (shear[0] + meff*gammat*vtr1/kt) - - meff*gammat*vtr1/kt; - shear[1] = (fn/fs) * (shear[1] + meff*gammat*vtr2/kt) - - meff*gammat*vtr2/kt; - shear[2] = (fn/fs) * (shear[2] + meff*gammat*vtr3/kt) - - meff*gammat*vtr3/kt; + shear[0] = (fn/fs) * (shear[0] + polyhertz*gammatsuji*vtr1/kt) - + polyhertz*gammatsuji*vtr1/kt; + shear[1] = (fn/fs) * (shear[1] + polyhertz*gammatsuji*vtr2/kt) - + polyhertz*gammatsuji*vtr2/kt; + shear[2] = (fn/fs) * (shear[2] + polyhertz*gammatsuji*vtr3/kt) - + polyhertz*gammatsuji*vtr3/kt; fs1 *= fn/fs ; fs2 *= fn/fs; fs3 *= fn/fs; } else fs1 = fs2 = fs3 = 0.0; } + // calculate twisting and rolling components of torque + // NOTE: this assumes spheres! + + relrot1 = omega[0]; + relrot2 = omega[1]; + relrot3 = omega[2]; + + // rolling velocity + // NOTE: this assumes mondisperse spheres! + + vrl1 = -rad_eff*rinv * (relrot2*dz - relrot3*dy); + vrl2 = -rad_eff*rinv * (relrot3*dx - relrot1*dz); + vrl3 = -rad_eff*rinv * (relrot1*dy - relrot2*dx); + vrlmag = sqrt(vrl1*vrl1+vrl2*vrl2+vrl3*vrl3); + if (vrlmag != 0.0) vrlmaginv = 1.0/vrlmag; + else vrlmaginv = 0.0; + + // bond history effects + + shear[3] += vrl1*dt; + shear[4] += vrl2*dt; + shear[5] += vrl3*dt; + + // rotate bonded displacements correctly + + double rlt = shear[3]*dx + shear[4]*dy + shear[5]*dz; + rlt /= rsq; + shear[3] -= rlt*dx; + shear[4] -= rlt*dy; + shear[5] -= rlt*dz; + + // twisting torque + + magtwist = rinv*(relrot1*dx + relrot2*dy + relrot3*dz); + shear[6] += magtwist*dt; + + ktwist = 0.5*kt*(a0*aovera0)*(a0*aovera0); + magtortwist = -ktwist*shear[6] - + 0.5*polyhertz*gammatsuji*(a0*aovera0)*(a0*aovera0)*magtwist; + + twistcrit=TWOTHIRDS*a0*aovera0*Fcrit; + if (fabs(magtortwist) > twistcrit) + magtortwist = -twistcrit * magtwist/fabs(magtwist); + + // rolling torque + + magrollsq = shear[3]*shear[3] + shear[4]*shear[4] + shear[5]*shear[5]; + magroll = sqrt(magrollsq); + if (magroll != 0.0) magrollinv = 1.0/magroll; + else magrollinv = 0.0; + + kroll = 1.0*4.0*Fcrit*pow(aovera0,1.5); + magtorroll = -kroll*magroll - 0.1*gammat*vrlmag; + + rollcrit = 0.01; + if (magroll > rollcrit) magtorroll = -kroll*rollcrit; + // forces & torques fx = dx*ccel + fs1; @@ -712,6 +1005,14 @@ void FixWallGran::hertz_history(double rsq, double dx, double dy, double dz, torque[0] -= radius*tor1; torque[1] -= radius*tor2; torque[2] -= radius*tor3; + + torque[0] += magtortwist * dx*rinv; + torque[1] += magtortwist * dy*rinv; + torque[2] += magtortwist * dz*rinv; + + torque[0] += magtorroll * (shear[4]*dz - shear[5]*dy)*rinv*magrollinv; + torque[1] += magtorroll * (shear[5]*dx - shear[3]*dz)*rinv*magrollinv; + torque[2] += magtorroll * (shear[3]*dy - shear[4]*dx)*rinv*magrollinv; } /* ---------------------------------------------------------------------- @@ -722,8 +1023,8 @@ double FixWallGran::memory_usage() { int nmax = atom->nmax; double bytes = 0.0; - if (history) bytes += 3*nmax * sizeof(double); // shear history - if (fix_rigid) bytes += nmax * sizeof(int); // mass_rigid + if (history) bytes += nmax*sheardim * sizeof(double); // shear history + if (fix_rigid) bytes += nmax * sizeof(int); // mass_rigid return bytes; } @@ -733,7 +1034,7 @@ double FixWallGran::memory_usage() void FixWallGran::grow_arrays(int nmax) { - if (history) memory->grow(shear,nmax,3,"fix_wall_gran:shear"); + if (history) memory->grow(shearone,nmax,sheardim,"fix_wall_gran:shearone"); } /* ---------------------------------------------------------------------- @@ -742,11 +1043,9 @@ void FixWallGran::grow_arrays(int nmax) void FixWallGran::copy_arrays(int i, int j, int delflag) { - if (history) { - shear[j][0] = shear[i][0]; - shear[j][1] = shear[i][1]; - shear[j][2] = shear[i][2]; - } + if (history) + for (int m = 0; m < sheardim; m++) + shearone[j][m] = shearone[i][m]; } /* ---------------------------------------------------------------------- @@ -755,7 +1054,9 @@ void FixWallGran::copy_arrays(int i, int j, int delflag) void FixWallGran::set_arrays(int i) { - if (history) shear[i][0] = shear[i][1] = shear[i][2] = 0.0; + if (history) + for (int m = 0; m < sheardim; m++) + shearone[i][m] = 0; } /* ---------------------------------------------------------------------- @@ -766,10 +1067,10 @@ int FixWallGran::pack_exchange(int i, double *buf) { if (!history) return 0; - buf[0] = shear[i][0]; - buf[1] = shear[i][1]; - buf[2] = shear[i][2]; - return 3; + int n = 0; + for (int m = 0; m < sheardim; m++) + buf[n++] = shearone[i][m]; + return n; } /* ---------------------------------------------------------------------- @@ -780,10 +1081,10 @@ int FixWallGran::unpack_exchange(int nlocal, double *buf) { if (!history) return 0; - shear[nlocal][0] = buf[0]; - shear[nlocal][1] = buf[1]; - shear[nlocal][2] = buf[2]; - return 3; + int n = 0; + for (int m = 0; m < sheardim; m++) + shearone[nlocal][m] = buf[n++]; + return n; } /* ---------------------------------------------------------------------- @@ -794,12 +1095,11 @@ int FixWallGran::pack_restart(int i, double *buf) { if (!history) return 0; - int m = 0; - buf[m++] = 4; - buf[m++] = shear[i][0]; - buf[m++] = shear[i][1]; - buf[m++] = shear[i][2]; - return m; + int n = 0; + buf[n++] = sheardim + 1; + for (int m = 0; m < sheardim; m++) + buf[n++] = shearone[i][m]; + return n; } /* ---------------------------------------------------------------------- @@ -808,19 +1108,18 @@ int FixWallGran::pack_restart(int i, double *buf) void FixWallGran::unpack_restart(int nlocal, int nth) { - double **extra = atom->extra; - if (!history) return; - // skip to Nth set of extra values + double **extra = atom->extra; + // skip to Nth set of extra values + int m = 0; for (int i = 0; i < nth; i++) m += static_cast (extra[nlocal][m]); m++; - - shear[nlocal][0] = extra[nlocal][m++]; - shear[nlocal][1] = extra[nlocal][m++]; - shear[nlocal][2] = extra[nlocal][m++]; + + for (int i = 0; i < sheardim; i++) + shearone[nlocal][i] = extra[nlocal][m++]; } /* ---------------------------------------------------------------------- @@ -830,7 +1129,7 @@ void FixWallGran::unpack_restart(int nlocal, int nth) int FixWallGran::maxsize_restart() { if (!history) return 0; - return 4; + return 1 + sheardim; } /* ---------------------------------------------------------------------- @@ -840,7 +1139,7 @@ int FixWallGran::maxsize_restart() int FixWallGran::size_restart(int nlocal) { if (!history) return 0; - return 4; + return 1 + sheardim; } /* ---------------------------------------------------------------------- */ diff --git a/src/GRANULAR/fix_wall_gran.h b/src/GRANULAR/fix_wall_gran.h index df15cd739c..e9b6a73b9d 100644 --- a/src/GRANULAR/fix_wall_gran.h +++ b/src/GRANULAR/fix_wall_gran.h @@ -29,51 +29,59 @@ class FixWallGran : public Fix { FixWallGran(class LAMMPS *, int, char **); virtual ~FixWallGran(); int setmask(); - void init(); + virtual void init(); void setup(int); virtual void post_force(int); virtual void post_force_respa(int, int, int); - double memory_usage(); - void grow_arrays(int); - void copy_arrays(int, int, int); - void set_arrays(int); - int pack_exchange(int, double *); - int unpack_exchange(int, double *); - int pack_restart(int, double *); - void unpack_restart(int, int); - int size_restart(int); - int maxsize_restart(); + virtual double memory_usage(); + virtual void grow_arrays(int); + virtual void copy_arrays(int, int, int); + virtual void set_arrays(int); + virtual int pack_exchange(int, double *); + virtual int unpack_exchange(int, double *); + virtual int pack_restart(int, double *); + virtual void unpack_restart(int, int); + virtual int size_restart(int); + virtual int maxsize_restart(); void reset_dt(); - protected: - int wallstyle,pairstyle,history,wiggle,wshear,axis; - double kn,kt,gamman,gammat,xmu; - double lo,hi,cylradius; - double amplitude,period,omega,vshear; - double dt; - int nlevels_respa; - int time_origin; - - // shear history values - - double **shear; - int shearupdate; - - // rigid body masses for use in granular interactions - - class Fix *fix_rigid; // ptr to rigid body fix, NULL if none - double *mass_rigid; // rigid mass for owned+ghost atoms - int nmax; // allocated size of mass_rigid - void hooke(double, double, double, double, double *, double *, double *, double *, double *, double, double); void hooke_history(double, double, double, double, double *, double *, double *, double *, double *, double, double, double *); - void hertz_history(double, double, double, double, double *, + void hertz_history(double, double, double, double, double *, double, double *, double *, double *, double *, double, double, double *); + void bonded_history(double, double, double, double, double *, double, + double *, double *, double *, double *, double, double, + double *); + + protected: + int wallstyle,wiggle,wshear,axis; + int pairstyle,nlevels_respa; + bigint time_origin; + double kn,kt,gamman,gammat,xmu; + double E,G,SurfEnergy; + double lo,hi,cylradius; + double amplitude,period,omega,vshear; + double dt; + char *idregion; + + int history; // if particle/wall interaction stores history + int shearupdate; // flag for whether shear history is updated + int sheardim; // # of shear history values per contact + + // shear history for single contact per particle + + double **shearone; + + // rigid body masses for use in granular interactions + + class Fix *fix_rigid; // ptr to rigid body fix, NULL if none + double *mass_rigid; // rigid mass for owned+ghost atoms + int nmax; // allocated size of mass_rigid }; } diff --git a/src/GRANULAR/fix_wall_gran_region.cpp b/src/GRANULAR/fix_wall_gran_region.cpp new file mode 100644 index 0000000000..3ed7cf3d90 --- /dev/null +++ b/src/GRANULAR/fix_wall_gran_region.cpp @@ -0,0 +1,548 @@ +/* ---------------------------------------------------------------------- + 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 authors: Dan Bolintineanu (SNL) +------------------------------------------------------------------------- */ + +#include "math.h" +#include "stdlib.h" +#include "string.h" +#include "fix_wall_gran_region.h" +#include "region.h" +#include "atom.h" +#include "domain.h" +#include "update.h" +#include "force.h" +#include "pair.h" +#include "modify.h" +#include "respa.h" +#include "math_const.h" +#include "memory.h" +#include "error.h" + +using namespace LAMMPS_NS; +using namespace FixConst; +using namespace MathConst; + +// same as FixWallGran + +enum{HOOKE,HOOKE_HISTORY,HERTZ_HISTORY,BONDED_HISTORY}; + +#define BIG 1.0e20 + +/* ---------------------------------------------------------------------- */ + +FixWallGranRegion::FixWallGranRegion(LAMMPS *lmp, int narg, char **arg) : + FixWallGran(lmp, narg, arg) +{ + restart_global = 1; + motion_resetflag = 0; + + int iregion = domain->find_region(idregion); + if (iregion == -1) + error->all(FLERR,"Region ID for fix wall/gran/region does not exist"); + region = domain->regions[iregion]; + region_style = new char[strlen(region->style)+1]; + strcpy(region_style,region->style); + nregion = region->nregion; + + tmax = domain->regions[iregion]->tmax; + c2r = new int[tmax]; + + // re-allocate atom-based arrays with nshear + // do not register with Atom class, since parent class did that + + memory->destroy(shearone); + shearone = NULL; + + ncontact = NULL; + walls = NULL; + shearmany = NULL; + grow_arrays(atom->nmax); + + // initialize shear history as if particle is not touching region + + if (history) { + int nlocal = atom->nlocal; + for (int i = 0; i < nlocal; i++) + ncontact[i] = 0; + } +} + +/* ---------------------------------------------------------------------- */ + +FixWallGranRegion::~FixWallGranRegion() +{ + delete [] c2r; + memory->destroy(ncontact); + memory->destroy(walls); + memory->destroy(shearmany); +} + +/* ---------------------------------------------------------------------- */ + +void FixWallGranRegion::init() +{ + FixWallGran::init(); + + int iregion = domain->find_region(idregion); + if (iregion == -1) + error->all(FLERR,"Region ID for fix wall/gran/region does not exist"); + region = domain->regions[iregion]; + + // region displacement and orientation theta at previous step + // check if region properties changed between runs + + if (motion_resetflag) { + if (comm->me == 0) { + char str[128]; + sprintf(str,"Properties for region %s do not match restart file, " + "resetting its motion",idregion); + error->warning(FLERR,str); + } + region->reset_vel(); + } +} + + +/* ---------------------------------------------------------------------- */ + +void FixWallGranRegion::post_force(int vflag) +{ + int i,m,nc,iwall; + double rinv,fx,fy,fz,tooclose; + double dx,dy,dz,rsq,meff; + double xc[3],vwall[3]; + + // do not update shear history during setup + + shearupdate = 1; + if (update->setupflag) shearupdate = 0; + + // if just reneighbored: + // update rigid body masses for owned atoms if using FixRigid + // body[i] = which body atom I is in, -1 if none + // mass_body = mass of each rigid body + + if (neighbor->ago == 0 && fix_rigid) { + int tmp; + int *body = (int *) fix_rigid->extract("body",tmp); + double *mass_body = (double *) fix_rigid->extract("masstotal",tmp); + if (atom->nmax > nmax) { + memory->destroy(mass_rigid); + nmax = atom->nmax; + memory->create(mass_rigid,nmax,"wall/gran:mass_rigid"); + } + int nlocal = atom->nlocal; + for (i = 0; i < nlocal; i++) { + if (body[i] >= 0) mass_rigid[i] = mass_body[body[i]]; + else mass_rigid[i] = 0.0; + } + } + + int regiondynamic = region->dynamic_check(); + if (!regiondynamic) vwall[0] = vwall[1] = vwall[2] = 0.0; + + double **x = atom->x; + double **v = atom->v; + double **f = atom->f; + double **omega = atom->omega; + double **torque = atom->torque; + double *radius = atom->radius; + double *rmass = atom->rmass; + + int *mask = atom->mask; + int nlocal = atom->nlocal; + + // set current motion attributes of region + // set_velocity() also updates prev to current step + + if (regiondynamic) { + region->prematch(); + region->set_velocity(); + } + + for (i = 0; i < nlocal; i++) { + if (mask[i] & groupbit) { + if (!region->match(x[i][0],x[i][1],x[i][2])) continue; + + nc = region->surface(x[i][0],x[i][1],x[i][2],radius[i]); + if (nc > tmax) + error->one(FLERR,"Too many wall/gran/region contacts for one particle"); + + // shear history maintenance + // update ncontact,walls,shear2many for particle I + // to reflect new and persistent shear history values + // also set c2r[] = indices into region->contact[] for each of N contacts + // process zero or one contact here, otherwise invoke update_contacts() + + if (history) { + if (nc == 0) { + ncontact[i] = 0; + continue; + } + if (nc == 1) { + c2r[0] = 0; + iwall = region->contact[0].iwall; + if (ncontact[i] == 0) { + ncontact[i] = 1; + walls[i][0] = iwall; + for (m = 0; m < sheardim; m++) + shearmany[i][0][m] = 0.0; + } else if (ncontact[i] > 1 || iwall != walls[i][0]) + update_contacts(i,nc); + } else update_contacts(i,nc); + } + + // process current contacts + + for (int ic = 0; ic < nc; ic++) { + + // rsq = squared contact distance + // xc = contact point + + rsq = region->contact[ic].r*region->contact[ic].r; + + dx = region->contact[ic].delx; + dy = region->contact[ic].dely; + dz = region->contact[ic].delz; + + if (regiondynamic) region->velocity_contact(vwall, x[i], ic); + + + // meff = effective mass of sphere + // if I is part of rigid body, use body mass + + meff = rmass[i]; + if (fix_rigid && mass_rigid[i] > 0.0) meff = mass_rigid[i]; + + // invoke sphere/wall interaction + + if (pairstyle == HOOKE) + hooke(rsq,dx,dy,dz,vwall,v[i],f[i], + omega[i],torque[i],radius[i],meff); + else if (pairstyle == HOOKE_HISTORY) + hooke_history(rsq,dx,dy,dz,vwall,v[i],f[i], + omega[i],torque[i],radius[i],meff, + shearmany[i][c2r[ic]]); + else if (pairstyle == HERTZ_HISTORY) + hertz_history(rsq,dx,dy,dz,vwall,region->contact[ic].radius, + v[i],f[i],omega[i],torque[i], + radius[i],meff,shearmany[i][c2r[ic]]); + else if (pairstyle == BONDED_HISTORY) + bonded_history(rsq,dx,dy,dz,vwall,region->contact[ic].radius, + v[i],f[i],omega[i],torque[i], + radius[i],meff,shearmany[i][c2r[ic]]); + } + } + } +} + +/* ---------------------------------------------------------------------- + update contact info in ncontact, walls, shear2many for particle I + based on ncontacts[i] old contacts and N new contacts + matched via their associated walls + delete/zero shear history for broken/new contacts + also set c2r[i] = index of Ith contact in region list of contacts +------------------------------------------------------------------------- */ + +void FixWallGranRegion::update_contacts(int i, int nc) +{ + int j,m,iold,nold,ilast,inew,iadd,iwall; + + // loop over old contacts + // if not in new contact list: + // delete old contact by copying last contact over it + + iold = 0; + while (iold < ncontact[i]) { + for (m = 0; m < nc; m++) + if (region->contact[m].iwall = walls[i][iold]) break; + if (m < nc) { + ilast = ncontact[i]-1; + for (j = 0; j < sheardim; j++) + shearmany[i][iold][j] = shearmany[i][ilast][j]; + walls[i][iold] = walls[i][ilast]; + ncontact[i]--; + } else iold++; + } + + // loop over new contacts + // if not in newly compressed contact list of length nold: + // add it with zeroed shear history + // set all values in c2r + + nold = ncontact[i]; + + for (inew = 0; inew < nc; inew++) { + iwall = region->contact[inew].iwall; + for (m = 0; m < nold; m++) + if (walls[i][m] == iwall) break; + if (m < nold) c2r[m] = inew; + else { + iadd = ncontact[i]; + + c2r[iadd] = inew; + for (j = 0; j < sheardim; j++) + shearmany[i][iadd][j] = 0.0; + walls[i][iadd] = iwall; + ncontact[i]++; + } + } +} + +/* ---------------------------------------------------------------------- + memory usage of local atom-based arrays +------------------------------------------------------------------------- */ + +double FixWallGranRegion::memory_usage() +{ + int nmax = atom->nmax; + double bytes = 0.0; + if (history) { // shear history + bytes += nmax * sizeof(int); // ncontact + bytes += nmax*tmax * sizeof(int); // walls + bytes += nmax*tmax*sheardim * sizeof(double); // shearmany + } + if (fix_rigid) bytes += nmax * sizeof(int); // mass_rigid + return bytes; +} + +/* ---------------------------------------------------------------------- + allocate local atom-based arrays +------------------------------------------------------------------------- */ + +void FixWallGranRegion::grow_arrays(int nmax) +{ + if (history) { + memory->grow(ncontact,nmax,"fix_wall_gran:ncontact"); + memory->grow(walls,nmax,tmax,"fix_wall_gran:walls"); + memory->grow(shearmany,nmax,tmax,sheardim,"fix_wall_gran:shearmany"); + } +} + +/* ---------------------------------------------------------------------- + copy values within local atom-based arrays +------------------------------------------------------------------------- */ + +void FixWallGranRegion::copy_arrays(int i, int j, int delflag) +{ + int m,n,iwall; + + if (!history) return; + + n = ncontact[i]; + + for (iwall = 0; iwall < n; iwall++) { + walls[j][iwall] = walls[i][iwall]; + for (m = 0; m < sheardim; m++) + shearmany[j][iwall][m] = shearmany[i][iwall][m]; + } + ncontact[j] = ncontact[i]; +} + +/* ---------------------------------------------------------------------- + initialize one atom's array values, called when atom is created +------------------------------------------------------------------------- */ + +void FixWallGranRegion::set_arrays(int i) +{ + if (!history) return; + ncontact[i] = 0; +} + +/* ---------------------------------------------------------------------- + pack values in local atom-based arrays for exchange with another proc +------------------------------------------------------------------------- */ + +int FixWallGranRegion::pack_exchange(int i, double *buf) +{ + int m; + + if (!history) return 0; + + int n = 0; + int count = ncontact[i]; + + buf[n++] = ubuf(count).d; + for (int iwall = 0; iwall < count; iwall++) { + buf[n++] = ubuf(walls[i][iwall]).d; + for (m = 0; m < sheardim; m++) + buf[n++] = shearmany[i][iwall][m]; + } + + return n; +} + +/* ---------------------------------------------------------------------- + unpack values into local atom-based arrays after exchange +------------------------------------------------------------------------- */ + +int FixWallGranRegion::unpack_exchange(int nlocal, double *buf) +{ + int m; + + if (!history) return 0; + + int n = 0; + int count = ncontact[nlocal] = (int) ubuf(buf[n++]).i; + + for (int iwall = 0; iwall < count; iwall++) { + walls[nlocal][iwall] = (int) ubuf(buf[n++]).i; + for (m = 0; m < sheardim; m++) + shearmany[nlocal][iwall][m] = buf[n++]; + } + + return n; +} + +/* ---------------------------------------------------------------------- + pack values in local atom-based arrays for restart file +------------------------------------------------------------------------- */ + +int FixWallGranRegion::pack_restart(int i, double *buf) +{ + int m; + + if (!history) return 0; + + int n = 1; + int count = ncontact[i]; + + buf[n++] = ubuf(count).d; + for (int iwall = 0; iwall < count; iwall++) { + buf[n++] = ubuf(walls[i][iwall]).d; + for (m = 0; m < sheardim; m++) + buf[n++] = shearmany[i][iwall][m]; + } + buf[0] = n; + return n; +} + +/* ---------------------------------------------------------------------- + unpack values from atom->extra array to restart the fix +------------------------------------------------------------------------- */ + +void FixWallGranRegion::unpack_restart(int nlocal, int nth) +{ + int k; + + if (!history) return; + + double **extra = atom->extra; + + // skip to Nth set of extra values + + int m = 0; + for (int i = 0; i < nth; i++) m += static_cast (extra[nlocal][m]); + m++; + + int count = ncontact[nlocal] = (int) ubuf(extra[nlocal][m++]).i; + for (int iwall = 0; iwall < count; iwall++) { + walls[nlocal][iwall] = (int) ubuf(extra[nlocal][m++]).i; + for (k = 0; k < sheardim; k++) + shearmany[nlocal][iwall][k] = extra[nlocal][m++]; + } +} + +/* ---------------------------------------------------------------------- + maxsize of any atom's restart data +------------------------------------------------------------------------- */ + +int FixWallGranRegion::maxsize_restart() +{ + if (!history) return 0; + return 2 + tmax*(sheardim+1); +} + +/* ---------------------------------------------------------------------- + size of atom nlocal's restart data +------------------------------------------------------------------------- */ + +int FixWallGranRegion::size_restart(int nlocal) +{ + if (!history) return 0; + return 2 + ncontact[nlocal]*(sheardim+1); +} + +/* ---------------------------------------------------------------------- + pack entire state of Fix into one write +------------------------------------------------------------------------- */ + +void FixWallGranRegion::write_restart(FILE *fp) +{ + if (comm->me) return; + int size_id_str = (strlen(region->id) + 1) * sizeof(char); + int size_style_str = (strlen(region->style) + 1) * sizeof(char); + int size_tot = sizeof(int) + size_id_str + + sizeof(int) + size_style_str + sizeof(int) + + region->size_restart*sizeof(double); + + fwrite(&size_tot,sizeof(int),1,fp); + fwrite(&size_id_str,sizeof(int),1,fp); + fwrite(region->id,sizeof(char),size_id_str,fp); + fwrite(&size_style_str,sizeof(int),1,fp); + fwrite(region->style,sizeof(char),size_style_str,fp); + fwrite(®ion->nregion,sizeof(int),1,fp); + + region->write_restart(fp); +} + +/* ---------------------------------------------------------------------- + use state info from restart file to restart the Fix +------------------------------------------------------------------------- */ + +void FixWallGranRegion::restart(char *buf) +{ + int n = 0; + int size_id_str = buf[n]; + n += sizeof(int); + char *region_id_restart = new char[size_id_str]; + for (int i = 0; i < size_id_str; i++){ + region_id_restart[i] = buf[n++]; + } + + int size_style_str = buf[n]; + n += sizeof(int); + char *region_style_restart = new char[size_style_str]; + for (int i = 0; i < size_style_str; i++) + region_style_restart[i] = buf[n++]; + + int nregion_restart = buf[n]; + n += sizeof(int); + + if (check_consistent_region(region,region_id_restart, + region_style_restart,nregion_restart)) + region->restart(buf,n); + else motion_resetflag = 1; + + delete [] region_id_restart; + delete [] region_style_restart; +} + + +/* ---------------------------------------------------------------------- + check that region id/style/number of sub-regions are consistent +------------------------------------------------------------------------- */ + +int FixWallGranRegion::check_consistent_region(Region *region, + char* region_id, + char* region_style, int nregion) +{ + if (strcmp(region_id, region->id) != 0 || + strcmp(region_style, region->style) != 0 || + nregion != region->nregion) + return 0; + return 1; +} diff --git a/src/GRANULAR/fix_wall_gran_region.h b/src/GRANULAR/fix_wall_gran_region.h new file mode 100644 index 0000000000..d7bc8be53e --- /dev/null +++ b/src/GRANULAR/fix_wall_gran_region.h @@ -0,0 +1,106 @@ +/* -*- 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(wall/gran/region,FixWallGranRegion) + +#else + +#ifndef LMP_FIX_WALL_GRAN_REGION_H +#define LMP_FIX_WALL_GRAN_REGION_H + +#include "fix_wall_gran.h" + +namespace LAMMPS_NS { + +class FixWallGranRegion : public FixWallGran { + public: + FixWallGranRegion(class LAMMPS *, int, char **); + ~FixWallGranRegion(); + void post_force(int); + void write_restart(FILE *); + void restart(char* ); + void init(); + + double memory_usage(); + void grow_arrays(int); + void copy_arrays(int, int, int); + void set_arrays(int); + int pack_exchange(int, double *); + int unpack_exchange(int, double *); + int pack_restart(int, double *); + void unpack_restart(int, int); + int size_restart(int); + int maxsize_restart(); + + private: + class Region *region; + char *region_style; + int nregion; + + // shear history for multiple contacts per particle + + int tmax; // max # of region walls one particle can touch + int *ncontact; // # of shear contacts per particle + int **walls; // which wall each contact is with + double ***shearmany; // shear history per particle per contact + int *c2r; // contact to region mapping + // c2r[i] = index of Ith contact in + // region-contact[] list of contacts + int motion_resetflag; // used by restart to indicate that region + // vel info is to be reset + + void update_contacts(int, int); + int check_consistent_region(Region *, char*, char*, int); +}; + +} + +#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: Fix wall/gran requires atom style sphere + +Self-explanatory. + +E: Cannot use wall in periodic dimension + +Self-explanatory. + +E: Cannot wiggle and shear fix wall/gran + +Cannot specify both options at the same time. + +E: Invalid wiggle direction for fix wall/gran + +Self-explanatory. + +E: Invalid shear direction for fix wall/gran + +Self-explanatory. + +E: Fix wall/gran is incompatible with Pair style + +Must use a granular pair style to define the parameters needed for +this fix. + +*/ diff --git a/src/KOKKOS/atom_kokkos.cpp b/src/KOKKOS/atom_kokkos.cpp index 4d343367f1..577eff2364 100644 --- a/src/KOKKOS/atom_kokkos.cpp +++ b/src/KOKKOS/atom_kokkos.cpp @@ -21,6 +21,7 @@ #include "atom_masks.h" #include "memory.h" #include "error.h" +#include "kokkos.h" using namespace LAMMPS_NS; @@ -78,6 +79,9 @@ AtomKokkos::~AtomKokkos() void AtomKokkos::sync(const ExecutionSpace space, unsigned int mask) { + if (space == Device && lmp->kokkos->auto_sync) + ((AtomVecKokkos *) avec)->modified(Host,mask); + ((AtomVecKokkos *) avec)->sync(space,mask); } @@ -86,6 +90,9 @@ void AtomKokkos::sync(const ExecutionSpace space, unsigned int mask) void AtomKokkos::modified(const ExecutionSpace space, unsigned int mask) { ((AtomVecKokkos *) avec)->modified(space,mask); + + if (space == Device && lmp->kokkos->auto_sync) + ((AtomVecKokkos *) avec)->sync(Host,mask); } void AtomKokkos::sync_overlapping_device(const ExecutionSpace space, unsigned int mask) diff --git a/src/KOKKOS/fix_deform_kokkos.cpp b/src/KOKKOS/fix_deform_kokkos.cpp index b3316022f1..5295320734 100644 --- a/src/KOKKOS/fix_deform_kokkos.cpp +++ b/src/KOKKOS/fix_deform_kokkos.cpp @@ -49,6 +49,7 @@ enum{NO_REMAP,X_REMAP,V_REMAP}; FixDeformKokkos::FixDeformKokkos(LAMMPS *lmp, int narg, char **arg) : FixDeform(lmp, narg, arg) { + kokkosable = 1; domainKK = (DomainKokkos *) domain; datamask_read = EMPTY_MASK; diff --git a/src/KOKKOS/fix_langevin_kokkos.cpp b/src/KOKKOS/fix_langevin_kokkos.cpp index 43af4168f3..b51c934c3e 100644 --- a/src/KOKKOS/fix_langevin_kokkos.cpp +++ b/src/KOKKOS/fix_langevin_kokkos.cpp @@ -44,6 +44,7 @@ template FixLangevinKokkos::FixLangevinKokkos(LAMMPS *lmp, int narg, char **arg) : FixLangevin(lmp, narg, arg),rand_pool(seed + comm->me) { + kokkosable = 1; atomKK = (AtomKokkos *) atom; int ntypes = atomKK->ntypes; diff --git a/src/KOKKOS/fix_nh_kokkos.cpp b/src/KOKKOS/fix_nh_kokkos.cpp index 8cc06fc52c..2b55259365 100644 --- a/src/KOKKOS/fix_nh_kokkos.cpp +++ b/src/KOKKOS/fix_nh_kokkos.cpp @@ -55,6 +55,7 @@ enum{ISO,ANISO,TRICLINIC}; template FixNHKokkos::FixNHKokkos(LAMMPS *lmp, int narg, char **arg) : FixNH(lmp, narg, arg) { + kokkosable = 1; domainKK = (DomainKokkos *) domain; execution_space = ExecutionSpaceFromDevice::space; diff --git a/src/KOKKOS/fix_nph_kokkos.cpp b/src/KOKKOS/fix_nph_kokkos.cpp index f3f7c271d6..34fc212c0f 100644 --- a/src/KOKKOS/fix_nph_kokkos.cpp +++ b/src/KOKKOS/fix_nph_kokkos.cpp @@ -25,6 +25,7 @@ template FixNPHKokkos::FixNPHKokkos(LAMMPS *lmp, int narg, char **arg) : FixNHKokkos(lmp, narg, arg) { + this->kokkosable = 1; if (this->tstat_flag) this->error->all(FLERR,"Temperature control can not be used with fix nph"); if (!this->pstat_flag) diff --git a/src/KOKKOS/fix_npt_kokkos.cpp b/src/KOKKOS/fix_npt_kokkos.cpp index bbc26b8e88..c99a322a01 100644 --- a/src/KOKKOS/fix_npt_kokkos.cpp +++ b/src/KOKKOS/fix_npt_kokkos.cpp @@ -25,6 +25,7 @@ template FixNPTKokkos::FixNPTKokkos(LAMMPS *lmp, int narg, char **arg) : FixNHKokkos(lmp, narg, arg) { + this->kokkosable = 1; if (!this->tstat_flag) this->error->all(FLERR,"Temperature control must be used with fix npt"); if (!this->pstat_flag) diff --git a/src/KOKKOS/fix_nve_kokkos.cpp b/src/KOKKOS/fix_nve_kokkos.cpp index 5e7e9b5298..4c041f85b0 100644 --- a/src/KOKKOS/fix_nve_kokkos.cpp +++ b/src/KOKKOS/fix_nve_kokkos.cpp @@ -30,6 +30,7 @@ template FixNVEKokkos::FixNVEKokkos(LAMMPS *lmp, int narg, char **arg) : FixNVE(lmp, narg, arg) { + kokkosable = 1; atomKK = (AtomKokkos *) atom; execution_space = ExecutionSpaceFromDevice::space; diff --git a/src/KOKKOS/fix_nvt_kokkos.cpp b/src/KOKKOS/fix_nvt_kokkos.cpp index c479251c33..9628ff0231 100644 --- a/src/KOKKOS/fix_nvt_kokkos.cpp +++ b/src/KOKKOS/fix_nvt_kokkos.cpp @@ -26,6 +26,7 @@ template FixNVTKokkos::FixNVTKokkos(LAMMPS *lmp, int narg, char **arg) : FixNHKokkos(lmp, narg, arg) { + this->kokkosable = 1; if (!this->tstat_flag) this->error->all(FLERR,"Temperature control must be used with fix nvt"); if (this->pstat_flag) diff --git a/src/KOKKOS/fix_qeq_reax_kokkos.cpp b/src/KOKKOS/fix_qeq_reax_kokkos.cpp index 8ae132e575..e54be74124 100644 --- a/src/KOKKOS/fix_qeq_reax_kokkos.cpp +++ b/src/KOKKOS/fix_qeq_reax_kokkos.cpp @@ -53,6 +53,7 @@ template FixQEqReaxKokkos::FixQEqReaxKokkos(LAMMPS *lmp, int narg, char **arg) : FixQEqReax(lmp, narg, arg) { + kokkosable = 1; atomKK = (AtomKokkos *) atom; execution_space = ExecutionSpaceFromDevice::space; diff --git a/src/KOKKOS/fix_setforce_kokkos.cpp b/src/KOKKOS/fix_setforce_kokkos.cpp index 93e5e19377..27f7d100fa 100644 --- a/src/KOKKOS/fix_setforce_kokkos.cpp +++ b/src/KOKKOS/fix_setforce_kokkos.cpp @@ -38,6 +38,7 @@ template FixSetForceKokkos::FixSetForceKokkos(LAMMPS *lmp, int narg, char **arg) : FixSetForce(lmp, narg, arg) { + kokkosable = 1; atomKK = (AtomKokkos *) atom; execution_space = ExecutionSpaceFromDevice::space; datamask_read = EMPTY_MASK; diff --git a/src/KOKKOS/fix_wall_reflect_kokkos.cpp b/src/KOKKOS/fix_wall_reflect_kokkos.cpp index 27c0080234..55be7e5cd7 100644 --- a/src/KOKKOS/fix_wall_reflect_kokkos.cpp +++ b/src/KOKKOS/fix_wall_reflect_kokkos.cpp @@ -40,6 +40,7 @@ template FixWallReflectKokkos::FixWallReflectKokkos(LAMMPS *lmp, int narg, char **arg) : FixWallReflect(lmp, narg, arg) { + kokkosable = 1; atomKK = (AtomKokkos *) atom; execution_space = ExecutionSpaceFromDevice::space; datamask_read = X_MASK | V_MASK | MASK_MASK; diff --git a/src/KOKKOS/kokkos.cpp b/src/KOKKOS/kokkos.cpp index 180e3d8499..72bf094e4b 100644 --- a/src/KOKKOS/kokkos.cpp +++ b/src/KOKKOS/kokkos.cpp @@ -33,6 +33,8 @@ KokkosLMP::KokkosLMP(LAMMPS *lmp, int narg, char **arg) : Pointers(lmp) kokkos_exists = 1; lmp->kokkos = this; + auto_sync = 1; + int me = 0; MPI_Comm_rank(world,&me); if (me == 0) error->message(FLERR,"KOKKOS mode is enabled"); diff --git a/src/KOKKOS/kokkos.h b/src/KOKKOS/kokkos.h index f6d3404283..1058affcfc 100644 --- a/src/KOKKOS/kokkos.h +++ b/src/KOKKOS/kokkos.h @@ -29,6 +29,7 @@ class KokkosLMP : protected Pointers { int forward_comm_on_host; int num_threads,ngpu; int numa; + int auto_sync; KokkosLMP(class LAMMPS *, int, char **); ~KokkosLMP(); diff --git a/src/KOKKOS/modify_kokkos.cpp b/src/KOKKOS/modify_kokkos.cpp index b1b98144a6..9a035ac20c 100644 --- a/src/KOKKOS/modify_kokkos.cpp +++ b/src/KOKKOS/modify_kokkos.cpp @@ -16,6 +16,7 @@ #include "update.h" #include "fix.h" #include "compute.h" +#include "kokkos.h" using namespace LAMMPS_NS; @@ -43,13 +44,17 @@ void ModifyKokkos::setup(int vflag) if (update->whichflag == 1) for (int i = 0; i < nfix; i++) { atomKK->sync(fix[i]->execution_space,fix[i]->datamask_read); + if (!fix[i]->kokkosable) lmp->kokkos->auto_sync = 1; fix[i]->setup(vflag); + lmp->kokkos->auto_sync = 0; atomKK->modified(fix[i]->execution_space,fix[i]->datamask_modify); } else if (update->whichflag == 2) for (int i = 0; i < nfix; i++) { atomKK->sync(fix[i]->execution_space,fix[i]->datamask_read); + if (!fix[i]->kokkosable) lmp->kokkos->auto_sync = 1; fix[i]->min_setup(vflag); + lmp->kokkos->auto_sync = 0; atomKK->modified(fix[i]->execution_space,fix[i]->datamask_modify); } } @@ -65,7 +70,9 @@ void ModifyKokkos::setup_pre_exchange() for (int i = 0; i < n_pre_exchange; i++) { atomKK->sync(fix[list_pre_exchange[i]]->execution_space, fix[list_pre_exchange[i]]->datamask_read); + if (!fix[list_pre_exchange[i]]->kokkosable) lmp->kokkos->auto_sync = 1; fix[list_pre_exchange[i]]->setup_pre_exchange(); + lmp->kokkos->auto_sync = 0; atomKK->modified(fix[list_pre_exchange[i]]->execution_space, fix[list_pre_exchange[i]]->datamask_modify); } @@ -73,7 +80,9 @@ void ModifyKokkos::setup_pre_exchange() for (int i = 0; i < n_min_pre_exchange; i++) { atomKK->sync(fix[list_min_pre_exchange[i]]->execution_space, fix[list_min_pre_exchange[i]]->datamask_read); + if (!fix[list_min_pre_exchange[i]]->kokkosable) lmp->kokkos->auto_sync = 1; fix[list_min_pre_exchange[i]]->min_setup_pre_exchange(); + lmp->kokkos->auto_sync = 0; atomKK->modified(fix[list_min_pre_exchange[i]]->execution_space, fix[list_min_pre_exchange[i]]->datamask_modify); } @@ -90,7 +99,9 @@ void ModifyKokkos::setup_pre_neighbor() for (int i = 0; i < n_pre_neighbor; i++) { atomKK->sync(fix[list_pre_neighbor[i]]->execution_space, fix[list_pre_neighbor[i]]->datamask_read); + if (!fix[list_pre_neighbor[i]]->kokkosable) lmp->kokkos->auto_sync = 1; fix[list_pre_neighbor[i]]->setup_pre_neighbor(); + lmp->kokkos->auto_sync = 0; atomKK->modified(fix[list_pre_neighbor[i]]->execution_space, fix[list_pre_neighbor[i]]->datamask_modify); } @@ -98,7 +109,9 @@ void ModifyKokkos::setup_pre_neighbor() for (int i = 0; i < n_min_pre_neighbor; i++) { atomKK->sync(fix[list_min_pre_neighbor[i]]->execution_space, fix[list_min_pre_neighbor[i]]->datamask_read); + if (!fix[list_min_pre_neighbor[i]]->kokkosable) lmp->kokkos->auto_sync = 1; fix[list_min_pre_neighbor[i]]->min_setup_pre_neighbor(); + lmp->kokkos->auto_sync = 0; atomKK->modified(fix[list_min_pre_neighbor[i]]->execution_space, fix[list_min_pre_neighbor[i]]->datamask_modify); } @@ -115,7 +128,9 @@ void ModifyKokkos::setup_pre_force(int vflag) for (int i = 0; i < n_pre_force; i++) { atomKK->sync(fix[list_pre_force[i]]->execution_space, fix[list_pre_force[i]]->datamask_read); + if (!fix[list_pre_force[i]]->kokkosable) lmp->kokkos->auto_sync = 1; fix[list_pre_force[i]]->setup_pre_force(vflag); + lmp->kokkos->auto_sync = 0; atomKK->modified(fix[list_pre_force[i]]->execution_space, fix[list_pre_force[i]]->datamask_modify); } @@ -123,7 +138,9 @@ void ModifyKokkos::setup_pre_force(int vflag) for (int i = 0; i < n_min_pre_force; i++) { atomKK->sync(fix[list_min_pre_force[i]]->execution_space, fix[list_min_pre_force[i]]->datamask_read); + if (!fix[list_min_pre_force[i]]->kokkosable) lmp->kokkos->auto_sync = 1; fix[list_min_pre_force[i]]->min_setup_pre_force(vflag); + lmp->kokkos->auto_sync = 0; atomKK->modified(fix[list_min_pre_force[i]]->execution_space, fix[list_min_pre_force[i]]->datamask_modify); } @@ -138,7 +155,9 @@ void ModifyKokkos::initial_integrate(int vflag) for (int i = 0; i < n_initial_integrate; i++) { atomKK->sync(fix[list_initial_integrate[i]]->execution_space, fix[list_initial_integrate[i]]->datamask_read); + if (!fix[list_initial_integrate[i]]->kokkosable) lmp->kokkos->auto_sync = 1; fix[list_initial_integrate[i]]->initial_integrate(vflag); + lmp->kokkos->auto_sync = 0; atomKK->modified(fix[list_initial_integrate[i]]->execution_space, fix[list_initial_integrate[i]]->datamask_modify); } @@ -153,7 +172,9 @@ void ModifyKokkos::post_integrate() for (int i = 0; i < n_post_integrate; i++) { atomKK->sync(fix[list_post_integrate[i]]->execution_space, fix[list_post_integrate[i]]->datamask_read); + if (!fix[list_post_integrate[i]]->kokkosable) lmp->kokkos->auto_sync = 1; fix[list_post_integrate[i]]->post_integrate(); + lmp->kokkos->auto_sync = 0; atomKK->modified(fix[list_post_integrate[i]]->execution_space, fix[list_post_integrate[i]]->datamask_modify); } @@ -168,7 +189,9 @@ void ModifyKokkos::pre_exchange() for (int i = 0; i < n_pre_exchange; i++) { atomKK->sync(fix[list_pre_exchange[i]]->execution_space, fix[list_pre_exchange[i]]->datamask_read); + if (!fix[list_pre_exchange[i]]->kokkosable) lmp->kokkos->auto_sync = 1; fix[list_pre_exchange[i]]->pre_exchange(); + lmp->kokkos->auto_sync = 0; atomKK->modified(fix[list_pre_exchange[i]]->execution_space, fix[list_pre_exchange[i]]->datamask_modify); } @@ -183,7 +206,9 @@ void ModifyKokkos::pre_neighbor() for (int i = 0; i < n_pre_neighbor; i++) { atomKK->sync(fix[list_pre_neighbor[i]]->execution_space, fix[list_pre_neighbor[i]]->datamask_read); + if (!fix[list_pre_neighbor[i]]->kokkosable) lmp->kokkos->auto_sync = 1; fix[list_pre_neighbor[i]]->pre_neighbor(); + lmp->kokkos->auto_sync = 0; atomKK->modified(fix[list_pre_neighbor[i]]->execution_space, fix[list_pre_neighbor[i]]->datamask_modify); } @@ -198,7 +223,9 @@ void ModifyKokkos::pre_force(int vflag) for (int i = 0; i < n_pre_force; i++) { atomKK->sync(fix[list_pre_force[i]]->execution_space, fix[list_pre_force[i]]->datamask_read); + if (!fix[list_pre_force[i]]->kokkosable) lmp->kokkos->auto_sync = 1; fix[list_pre_force[i]]->pre_force(vflag); + lmp->kokkos->auto_sync = 0; atomKK->modified(fix[list_pre_force[i]]->execution_space, fix[list_pre_force[i]]->datamask_modify); } @@ -213,7 +240,9 @@ void ModifyKokkos::post_force(int vflag) for (int i = 0; i < n_post_force; i++) { atomKK->sync(fix[list_post_force[i]]->execution_space, fix[list_post_force[i]]->datamask_read); + if (!fix[list_post_force[i]]->kokkosable) lmp->kokkos->auto_sync = 1; fix[list_post_force[i]]->post_force(vflag); + lmp->kokkos->auto_sync = 0; atomKK->modified(fix[list_post_force[i]]->execution_space, fix[list_post_force[i]]->datamask_modify); } @@ -228,7 +257,9 @@ void ModifyKokkos::final_integrate() for (int i = 0; i < n_final_integrate; i++) { atomKK->sync(fix[list_final_integrate[i]]->execution_space, fix[list_final_integrate[i]]->datamask_read); + if (!fix[list_final_integrate[i]]->kokkosable) lmp->kokkos->auto_sync = 1; fix[list_final_integrate[i]]->final_integrate(); + lmp->kokkos->auto_sync = 0; atomKK->modified(fix[list_final_integrate[i]]->execution_space, fix[list_final_integrate[i]]->datamask_modify); } @@ -245,7 +276,9 @@ void ModifyKokkos::end_of_step() if (update->ntimestep % end_of_step_every[i] == 0) { atomKK->sync(fix[list_end_of_step[i]]->execution_space, fix[list_end_of_step[i]]->datamask_read); + if (!fix[list_end_of_step[i]]->kokkosable) lmp->kokkos->auto_sync = 1; fix[list_end_of_step[i]]->end_of_step(); + lmp->kokkos->auto_sync = 0; atomKK->modified(fix[list_end_of_step[i]]->execution_space, fix[list_end_of_step[i]]->datamask_modify); } @@ -263,7 +296,9 @@ double ModifyKokkos::thermo_energy() for (int i = 0; i < n_thermo_energy; i++) { atomKK->sync(fix[list_thermo_energy[i]]->execution_space, fix[list_thermo_energy[i]]->datamask_read); + if (!fix[list_thermo_energy[i]]->kokkosable) lmp->kokkos->auto_sync = 1; energy += fix[list_thermo_energy[i]]->compute_scalar(); + lmp->kokkos->auto_sync = 0; atomKK->modified(fix[list_thermo_energy[i]]->execution_space, fix[list_thermo_energy[i]]->datamask_modify); } @@ -279,7 +314,9 @@ void ModifyKokkos::post_run() for (int i = 0; i < nfix; i++) { atomKK->sync(fix[i]->execution_space, fix[i]->datamask_read); + if (!fix[i]->kokkosable) lmp->kokkos->auto_sync = 1; fix[i]->post_run(); + lmp->kokkos->auto_sync = 0; atomKK->modified(fix[i]->execution_space, fix[i]->datamask_modify); } @@ -294,7 +331,9 @@ void ModifyKokkos::setup_pre_force_respa(int vflag, int ilevel) for (int i = 0; i < n_pre_force; i++) { atomKK->sync(fix[list_pre_force[i]]->execution_space, fix[list_pre_force[i]]->datamask_read); + if (!fix[list_pre_force[i]]->kokkosable) lmp->kokkos->auto_sync = 1; fix[list_pre_force[i]]->setup_pre_force_respa(vflag,ilevel); + lmp->kokkos->auto_sync = 0; atomKK->modified(fix[list_pre_force[i]]->execution_space, fix[list_pre_force[i]]->datamask_modify); } @@ -309,8 +348,10 @@ void ModifyKokkos::initial_integrate_respa(int vflag, int ilevel, int iloop) for (int i = 0; i < n_initial_integrate_respa; i++) { atomKK->sync(fix[list_initial_integrate_respa[i]]->execution_space, fix[list_initial_integrate_respa[i]]->datamask_read); + if (!fix[list_initial_integrate_respa[i]]->kokkosable) lmp->kokkos->auto_sync = 1; fix[list_initial_integrate_respa[i]]-> initial_integrate_respa(vflag,ilevel,iloop); + lmp->kokkos->auto_sync = 0; atomKK->modified(fix[list_initial_integrate_respa[i]]->execution_space, fix[list_initial_integrate_respa[i]]->datamask_modify); } @@ -325,7 +366,9 @@ void ModifyKokkos::post_integrate_respa(int ilevel, int iloop) for (int i = 0; i < n_post_integrate_respa; i++) { atomKK->sync(fix[list_post_integrate_respa[i]]->execution_space, fix[list_post_integrate_respa[i]]->datamask_read); + if (!fix[list_post_integrate_respa[i]]->kokkosable) lmp->kokkos->auto_sync = 1; fix[list_post_integrate_respa[i]]->post_integrate_respa(ilevel,iloop); + lmp->kokkos->auto_sync = 0; atomKK->modified(fix[list_post_integrate_respa[i]]->execution_space, fix[list_post_integrate_respa[i]]->datamask_modify); } @@ -340,7 +383,9 @@ void ModifyKokkos::pre_force_respa(int vflag, int ilevel, int iloop) for (int i = 0; i < n_pre_force_respa; i++) { atomKK->sync(fix[list_pre_force_respa[i]]->execution_space, fix[list_pre_force_respa[i]]->datamask_read); + if (!fix[list_pre_force_respa[i]]->kokkosable) lmp->kokkos->auto_sync = 1; fix[list_pre_force_respa[i]]->pre_force_respa(vflag,ilevel,iloop); + lmp->kokkos->auto_sync = 0; atomKK->modified(fix[list_pre_force_respa[i]]->execution_space, fix[list_pre_force_respa[i]]->datamask_modify); } @@ -355,7 +400,9 @@ void ModifyKokkos::post_force_respa(int vflag, int ilevel, int iloop) for (int i = 0; i < n_post_force_respa; i++) { atomKK->sync(fix[list_post_force_respa[i]]->execution_space, fix[list_post_force_respa[i]]->datamask_read); + if (!fix[list_post_force_respa[i]]->kokkosable) lmp->kokkos->auto_sync = 1; fix[list_post_force_respa[i]]->post_force_respa(vflag,ilevel,iloop); + lmp->kokkos->auto_sync = 0; atomKK->modified(fix[list_post_force_respa[i]]->execution_space, fix[list_post_force_respa[i]]->datamask_modify); } @@ -370,7 +417,9 @@ void ModifyKokkos::final_integrate_respa(int ilevel, int iloop) for (int i = 0; i < n_final_integrate_respa; i++) { atomKK->sync(fix[list_final_integrate_respa[i]]->execution_space, fix[list_final_integrate_respa[i]]->datamask_read); + if (!fix[list_final_integrate_respa[i]]->kokkosable) lmp->kokkos->auto_sync = 1; fix[list_final_integrate_respa[i]]->final_integrate_respa(ilevel,iloop); + lmp->kokkos->auto_sync = 0; atomKK->modified(fix[list_final_integrate_respa[i]]->execution_space, fix[list_final_integrate_respa[i]]->datamask_modify); } @@ -385,7 +434,9 @@ void ModifyKokkos::min_pre_exchange() for (int i = 0; i < n_min_pre_exchange; i++) { atomKK->sync(fix[list_min_pre_exchange[i]]->execution_space, fix[list_min_pre_exchange[i]]->datamask_read); + if (!fix[list_min_pre_exchange[i]]->kokkosable) lmp->kokkos->auto_sync = 1; fix[list_min_pre_exchange[i]]->min_pre_exchange(); + lmp->kokkos->auto_sync = 0; atomKK->modified(fix[list_min_pre_exchange[i]]->execution_space, fix[list_min_pre_exchange[i]]->datamask_modify); } @@ -400,7 +451,9 @@ void ModifyKokkos::min_pre_neighbor() for (int i = 0; i < n_min_pre_neighbor; i++) { atomKK->sync(fix[list_min_pre_neighbor[i]]->execution_space, fix[list_min_pre_neighbor[i]]->datamask_read); + if (!fix[list_min_pre_neighbor[i]]->kokkosable) lmp->kokkos->auto_sync = 1; fix[list_min_pre_neighbor[i]]->min_pre_neighbor(); + lmp->kokkos->auto_sync = 0; atomKK->modified(fix[list_min_pre_neighbor[i]]->execution_space, fix[list_min_pre_neighbor[i]]->datamask_modify); } @@ -415,7 +468,9 @@ void ModifyKokkos::min_pre_force(int vflag) for (int i = 0; i < n_min_pre_force; i++) { atomKK->sync(fix[list_min_pre_force[i]]->execution_space, fix[list_min_pre_force[i]]->datamask_read); + if (!fix[list_min_pre_force[i]]->kokkosable) lmp->kokkos->auto_sync = 1; fix[list_min_pre_force[i]]->min_pre_force(vflag); + lmp->kokkos->auto_sync = 0; atomKK->modified(fix[list_min_pre_force[i]]->execution_space, fix[list_min_pre_force[i]]->datamask_modify); } @@ -430,7 +485,9 @@ void ModifyKokkos::min_post_force(int vflag) for (int i = 0; i < n_min_post_force; i++) { atomKK->sync(fix[list_min_post_force[i]]->execution_space, fix[list_min_post_force[i]]->datamask_read); + if (!fix[list_min_post_force[i]]->kokkosable) lmp->kokkos->auto_sync = 1; fix[list_min_post_force[i]]->min_post_force(vflag); + lmp->kokkos->auto_sync = 0; atomKK->modified(fix[list_min_post_force[i]]->execution_space, fix[list_min_post_force[i]]->datamask_modify); } @@ -450,8 +507,10 @@ double ModifyKokkos::min_energy(double *fextra) for (int i = 0; i < n_min_energy; i++) { ifix = list_min_energy[i]; atomKK->sync(fix[ifix]->execution_space,fix[ifix]->datamask_read); + if (!fix[ifix]->kokkosable) lmp->kokkos->auto_sync = 1; eng += fix[ifix]->min_energy(&fextra[index]); index += fix[ifix]->min_dof(); + lmp->kokkos->auto_sync = 0; atomKK->modified(fix[ifix]->execution_space,fix[ifix]->datamask_modify); } return eng; @@ -466,7 +525,9 @@ void ModifyKokkos::min_store() for (int i = 0; i < n_min_energy; i++) { atomKK->sync(fix[list_min_energy[i]]->execution_space, fix[list_min_energy[i]]->datamask_read); + if (!fix[list_min_energy[i]]->kokkosable) lmp->kokkos->auto_sync = 1; fix[list_min_energy[i]]->min_store(); + lmp->kokkos->auto_sync = 0; atomKK->modified(fix[list_min_energy[i]]->execution_space, fix[list_min_energy[i]]->datamask_modify); } @@ -481,7 +542,9 @@ void ModifyKokkos::min_clearstore() for (int i = 0; i < n_min_energy; i++) { atomKK->sync(fix[list_min_energy[i]]->execution_space, fix[list_min_energy[i]]->datamask_read); + if (!fix[list_min_energy[i]]->kokkosable) lmp->kokkos->auto_sync = 1; fix[list_min_energy[i]]->min_clearstore(); + lmp->kokkos->auto_sync = 0; atomKK->modified(fix[list_min_energy[i]]->execution_space, fix[list_min_energy[i]]->datamask_modify); } @@ -492,7 +555,9 @@ void ModifyKokkos::min_pushstore() for (int i = 0; i < n_min_energy; i++) { atomKK->sync(fix[list_min_energy[i]]->execution_space, fix[list_min_energy[i]]->datamask_read); + if (!fix[list_min_energy[i]]->kokkosable) lmp->kokkos->auto_sync = 1; fix[list_min_energy[i]]->min_pushstore(); + lmp->kokkos->auto_sync = 0; atomKK->modified(fix[list_min_energy[i]]->execution_space, fix[list_min_energy[i]]->datamask_modify); } @@ -503,7 +568,9 @@ void ModifyKokkos::min_popstore() for (int i = 0; i < n_min_energy; i++) { atomKK->sync(fix[list_min_energy[i]]->execution_space, fix[list_min_energy[i]]->datamask_read); + if (!fix[list_min_energy[i]]->kokkosable) lmp->kokkos->auto_sync = 1; fix[list_min_energy[i]]->min_popstore(); + lmp->kokkos->auto_sync = 0; atomKK->modified(fix[list_min_energy[i]]->execution_space, fix[list_min_energy[i]]->datamask_modify); } @@ -521,8 +588,10 @@ void ModifyKokkos::min_step(double alpha, double *hextra) for (int i = 0; i < n_min_energy; i++) { ifix = list_min_energy[i]; atomKK->sync(fix[ifix]->execution_space,fix[ifix]->datamask_read); + if (!fix[ifix]->kokkosable) lmp->kokkos->auto_sync = 1; fix[ifix]->min_step(alpha,&hextra[index]); index += fix[ifix]->min_dof(); + lmp->kokkos->auto_sync = 0; atomKK->modified(fix[ifix]->execution_space,fix[ifix]->datamask_modify); } } @@ -540,9 +609,11 @@ double ModifyKokkos::max_alpha(double *hextra) for (int i = 0; i < n_min_energy; i++) { ifix = list_min_energy[i]; atomKK->sync(fix[ifix]->execution_space,fix[ifix]->datamask_read); + if (!fix[ifix]->kokkosable) lmp->kokkos->auto_sync = 1; double alpha_one = fix[ifix]->max_alpha(&hextra[index]); alpha = MIN(alpha,alpha_one); index += fix[ifix]->min_dof(); + lmp->kokkos->auto_sync = 0; atomKK->modified(fix[ifix]->execution_space,fix[ifix]->datamask_modify); } return alpha; @@ -558,7 +629,9 @@ int ModifyKokkos::min_dof() for (int i = 0; i < n_min_energy; i++) { atomKK->sync(fix[list_min_energy[i]]->execution_space, fix[list_min_energy[i]]->datamask_read); + if (!fix[list_min_energy[i]]->kokkosable) lmp->kokkos->auto_sync = 1; ndof += fix[list_min_energy[i]]->min_dof(); + lmp->kokkos->auto_sync = 0; atomKK->modified(fix[list_min_energy[i]]->execution_space, fix[list_min_energy[i]]->datamask_modify); } @@ -576,7 +649,9 @@ int ModifyKokkos::min_reset_ref() for (int i = 0; i < n_min_energy; i++) { atomKK->sync(fix[list_min_energy[i]]->execution_space, fix[list_min_energy[i]]->datamask_read); + if (!fix[list_min_energy[i]]->kokkosable) lmp->kokkos->auto_sync = 1; itmp = fix[list_min_energy[i]]->min_reset_ref(); + lmp->kokkos->auto_sync = 0; if (itmp) itmpall = 1; atomKK->modified(fix[list_min_energy[i]]->execution_space, fix[list_min_energy[i]]->datamask_modify); diff --git a/src/KOKKOS/neighbor_kokkos.cpp b/src/KOKKOS/neighbor_kokkos.cpp index c420f34e8e..3bb8b0dce4 100644 --- a/src/KOKKOS/neighbor_kokkos.cpp +++ b/src/KOKKOS/neighbor_kokkos.cpp @@ -589,6 +589,11 @@ void NeighborKokkos::build_topology_kokkos() { k_dihedrallist = neighbond_device.k_dihedrallist; k_improperlist = neighbond_device.k_improperlist; + k_bondlist.sync(); + k_anglelist.sync(); + k_dihedrallist.sync(); + k_improperlist.sync(); + k_bondlist.modify(); k_anglelist.modify(); k_dihedrallist.modify(); @@ -601,6 +606,11 @@ void NeighborKokkos::build_topology_kokkos() { k_dihedrallist = neighbond_host.k_dihedrallist; k_improperlist = neighbond_host.k_improperlist; + k_bondlist.sync(); + k_anglelist.sync(); + k_dihedrallist.sync(); + k_improperlist.sync(); + k_bondlist.modify(); k_anglelist.modify(); k_dihedrallist.modify(); diff --git a/src/KOKKOS/verlet_kokkos.cpp b/src/KOKKOS/verlet_kokkos.cpp index f225249d53..20c4035276 100644 --- a/src/KOKKOS/verlet_kokkos.cpp +++ b/src/KOKKOS/verlet_kokkos.cpp @@ -75,11 +75,13 @@ void VerletKokkos::setup() } update->setupflag = 1; + lmp->kokkos->auto_sync = 0; // setup domain, communication and neighboring // acquire ghosts // build neighbor lists + atomKK->sync(Host,ALL_MASK); atomKK->modified(Host,ALL_MASK); atomKK->setup(); @@ -124,8 +126,8 @@ void VerletKokkos::setup() if (pair_compute_flag) { atomKK->sync(force->pair->execution_space,force->pair->datamask_read); - atomKK->modified(force->pair->execution_space,force->pair->datamask_modify); force->pair->compute(eflag,vflag); + atomKK->modified(force->pair->execution_space,force->pair->datamask_modify); timer->stamp(Timer::PAIR); } else if (force->pair) force->pair->compute_dummy(eflag,vflag); @@ -134,23 +136,23 @@ void VerletKokkos::setup() if (atomKK->molecular) { if (force->bond) { atomKK->sync(force->bond->execution_space,force->bond->datamask_read); - atomKK->modified(force->bond->execution_space,force->bond->datamask_modify); force->bond->compute(eflag,vflag); + atomKK->modified(force->bond->execution_space,force->bond->datamask_modify); } if (force->angle) { atomKK->sync(force->angle->execution_space,force->angle->datamask_read); - atomKK->modified(force->angle->execution_space,force->angle->datamask_modify); force->angle->compute(eflag,vflag); + atomKK->modified(force->angle->execution_space,force->angle->datamask_modify); } if (force->dihedral) { atomKK->sync(force->dihedral->execution_space,force->dihedral->datamask_read); - atomKK->modified(force->dihedral->execution_space,force->dihedral->datamask_modify); force->dihedral->compute(eflag,vflag); + atomKK->modified(force->dihedral->execution_space,force->dihedral->datamask_modify); } if (force->improper) { atomKK->sync(force->improper->execution_space,force->improper->datamask_read); - atomKK->modified(force->improper->execution_space,force->improper->datamask_modify); force->improper->compute(eflag,vflag); + atomKK->modified(force->improper->execution_space,force->improper->datamask_modify); } timer->stamp(Timer::BOND); } @@ -159,17 +161,17 @@ void VerletKokkos::setup() force->kspace->setup(); if (kspace_compute_flag) { atomKK->sync(force->kspace->execution_space,force->kspace->datamask_read); - atomKK->modified(force->kspace->execution_space,force->kspace->datamask_modify); force->kspace->compute(eflag,vflag); + atomKK->modified(force->kspace->execution_space,force->kspace->datamask_modify); timer->stamp(Timer::KSPACE); } else force->kspace->compute_dummy(eflag,vflag); } - if (force->newton) comm->reverse_comm(); modify->setup(vflag); output->setup(); - update->setupflag = 0; + lmp->kokkos->auto_sync = 0; + update->setupflag = 1; } /* ---------------------------------------------------------------------- @@ -181,12 +183,14 @@ void VerletKokkos::setup() void VerletKokkos::setup_minimal(int flag) { update->setupflag = 1; + lmp->kokkos->auto_sync = 0; // setup domain, communication and neighboring // acquire ghosts // build neighbor lists if (flag) { + atomKK->sync(Host,ALL_MASK); atomKK->modified(Host,ALL_MASK); modify->setup_pre_exchange(); @@ -226,8 +230,8 @@ void VerletKokkos::setup_minimal(int flag) if (pair_compute_flag) { atomKK->sync(force->pair->execution_space,force->pair->datamask_read); - atomKK->modified(force->pair->execution_space,force->pair->datamask_modify); force->pair->compute(eflag,vflag); + atomKK->modified(force->pair->execution_space,force->pair->datamask_modify); timer->stamp(Timer::PAIR); } else if (force->pair) force->pair->compute_dummy(eflag,vflag); @@ -236,23 +240,23 @@ void VerletKokkos::setup_minimal(int flag) if (atomKK->molecular) { if (force->bond) { atomKK->sync(force->bond->execution_space,force->bond->datamask_read); - atomKK->modified(force->bond->execution_space,force->bond->datamask_modify); force->bond->compute(eflag,vflag); + atomKK->modified(force->bond->execution_space,force->bond->datamask_modify); } if (force->angle) { atomKK->sync(force->angle->execution_space,force->angle->datamask_read); - atomKK->modified(force->angle->execution_space,force->angle->datamask_modify); force->angle->compute(eflag,vflag); + atomKK->modified(force->angle->execution_space,force->angle->datamask_modify); } if (force->dihedral) { atomKK->sync(force->dihedral->execution_space,force->dihedral->datamask_read); - atomKK->modified(force->dihedral->execution_space,force->dihedral->datamask_modify); force->dihedral->compute(eflag,vflag); + atomKK->modified(force->dihedral->execution_space,force->dihedral->datamask_modify); } if (force->improper) { atomKK->sync(force->improper->execution_space,force->improper->datamask_read); - atomKK->modified(force->improper->execution_space,force->improper->datamask_modify); force->improper->compute(eflag,vflag); + atomKK->modified(force->improper->execution_space,force->improper->datamask_modify); } timer->stamp(Timer::BOND); } @@ -261,8 +265,8 @@ void VerletKokkos::setup_minimal(int flag) force->kspace->setup(); if (kspace_compute_flag) { atomKK->sync(force->kspace->execution_space,force->kspace->datamask_read); - atomKK->modified(force->kspace->execution_space,force->kspace->datamask_modify); force->kspace->compute(eflag,vflag); + atomKK->modified(force->kspace->execution_space,force->kspace->datamask_modify); timer->stamp(Timer::KSPACE); } else force->kspace->compute_dummy(eflag,vflag); } @@ -270,6 +274,7 @@ void VerletKokkos::setup_minimal(int flag) if (force->newton) comm->reverse_comm(); modify->setup(vflag); + lmp->kokkos->auto_sync = 1; update->setupflag = 0; } @@ -289,6 +294,8 @@ void VerletKokkos::run(int n) int n_post_force = modify->n_post_force; int n_end_of_step = modify->n_end_of_step; + lmp->kokkos->auto_sync = 0; + if (atomKK->sortfreq > 0) sortflag = 1; else sortflag = 0; @@ -453,11 +460,11 @@ void VerletKokkos::run(int n) if (pair_compute_flag) { atomKK->sync(force->pair->execution_space,force->pair->datamask_read); - atomKK->modified(force->pair->execution_space,force->pair->datamask_modify); atomKK->sync(force->pair->execution_space,~(~force->pair->datamask_read|(F_MASK | ENERGY_MASK | VIRIAL_MASK))); - atomKK->modified(force->pair->execution_space,~(~force->pair->datamask_modify|(F_MASK | ENERGY_MASK | VIRIAL_MASK))); Kokkos::Impl::Timer ktimer; force->pair->compute(eflag,vflag); + atomKK->modified(force->pair->execution_space,force->pair->datamask_modify); + atomKK->modified(force->pair->execution_space,~(~force->pair->datamask_modify|(F_MASK | ENERGY_MASK | VIRIAL_MASK))); timer->stamp(Timer::PAIR); } @@ -473,31 +480,31 @@ void VerletKokkos::run(int n) if (atomKK->molecular) { if (force->bond) { atomKK->sync(force->bond->execution_space,~(~force->bond->datamask_read|(F_MASK | ENERGY_MASK | VIRIAL_MASK))); - atomKK->modified(force->bond->execution_space,~(~force->bond->datamask_modify|(F_MASK | ENERGY_MASK | VIRIAL_MASK))); force->bond->compute(eflag,vflag); + atomKK->modified(force->bond->execution_space,~(~force->bond->datamask_modify|(F_MASK | ENERGY_MASK | VIRIAL_MASK))); } if (force->angle) { atomKK->sync(force->angle->execution_space,~(~force->angle->datamask_read|(F_MASK | ENERGY_MASK | VIRIAL_MASK))); - atomKK->modified(force->angle->execution_space,~(~force->angle->datamask_modify|(F_MASK | ENERGY_MASK | VIRIAL_MASK))); force->angle->compute(eflag,vflag); + atomKK->modified(force->angle->execution_space,~(~force->angle->datamask_modify|(F_MASK | ENERGY_MASK | VIRIAL_MASK))); } if (force->dihedral) { atomKK->sync(force->dihedral->execution_space,~(~force->dihedral->datamask_read|(F_MASK | ENERGY_MASK | VIRIAL_MASK))); - atomKK->modified(force->dihedral->execution_space,~(~force->dihedral->datamask_modify|(F_MASK | ENERGY_MASK | VIRIAL_MASK))); force->dihedral->compute(eflag,vflag); + atomKK->modified(force->dihedral->execution_space,~(~force->dihedral->datamask_modify|(F_MASK | ENERGY_MASK | VIRIAL_MASK))); } if (force->improper) { atomKK->sync(force->improper->execution_space,~(~force->improper->datamask_read|(F_MASK | ENERGY_MASK | VIRIAL_MASK))); - atomKK->modified(force->improper->execution_space,~(~force->improper->datamask_modify|(F_MASK | ENERGY_MASK | VIRIAL_MASK))); force->improper->compute(eflag,vflag); + atomKK->modified(force->improper->execution_space,~(~force->improper->datamask_modify|(F_MASK | ENERGY_MASK | VIRIAL_MASK))); } timer->stamp(Timer::BOND); } if (kspace_compute_flag) { atomKK->sync(force->kspace->execution_space,~(~force->kspace->datamask_read|(F_MASK | ENERGY_MASK | VIRIAL_MASK))); - atomKK->modified(force->kspace->execution_space,~(~force->kspace->datamask_modify|(F_MASK | ENERGY_MASK | VIRIAL_MASK))); force->kspace->compute(eflag,vflag); + atomKK->modified(force->kspace->execution_space,~(~force->kspace->datamask_modify|(F_MASK | ENERGY_MASK | VIRIAL_MASK))); timer->stamp(Timer::KSPACE); } @@ -509,6 +516,7 @@ void VerletKokkos::run(int n) Kokkos::deep_copy(LMPHostType(),f_merge_copy,atomKK->k_f.h_view); Kokkos::parallel_for(atomKK->k_f.dimension_0(), ForceAdder(atomKK->k_f.d_view,f_merge_copy)); + atomKK->k_f.modified_host() = 0; // special case atomKK->k_f.modify(); } @@ -535,6 +543,9 @@ void VerletKokkos::run(int n) timer->stamp(Timer::OUTPUT); } } + + atomKK->sync(Host,ALL_MASK); + lmp->kokkos->auto_sync = 1; } /* ---------------------------------------------------------------------- @@ -561,8 +572,9 @@ void VerletKokkos::force_clear() if (nbytes) { if (atomKK->k_f.modified_host() > atomKK->k_f.modified_device()) { - memset_kokkos(atomKK->k_f.view()); - atomKK->modified(Host,F_MASK); + memset_kokkos(atomKK->k_f.view()); + atomKK->modified(Host,F_MASK); + atomKK->sync(Device,F_MASK); } else { memset_kokkos(atomKK->k_f.view()); atomKK->modified(Device,F_MASK); diff --git a/src/MANYBODY/pair_airebo.cpp b/src/MANYBODY/pair_airebo.cpp index 2bb1c1da22..51cf221668 100644 --- a/src/MANYBODY/pair_airebo.cpp +++ b/src/MANYBODY/pair_airebo.cpp @@ -155,6 +155,11 @@ void PairAIREBO::settings(int narg, char **arg) ljflag = force->inumeric(FLERR,arg[1]); torflag = force->inumeric(FLERR,arg[2]); } + + // this one parameter for C-C interactions is different in AIREBO vs REBO + // see Favata, Micheletti, Ryu, Pugno, Comp Phys Comm (2016) + + PCCf_2_0 = -0.0276030; } /* ---------------------------------------------------------------------- @@ -4090,7 +4095,12 @@ void PairAIREBO::spline_init() PCCf[0][3] = 0.0161253646; PCCf[1][1] = -0.010960; PCCf[1][2] = 0.00632624824; - PCCf[2][0] = -0.0276030; + + // this one parameter for C-C interactions is different in REBO vs AIREBO + // see Favata, Micheletti, Ryu, Pugno, Comp Phys Comm (2016) + + PCCf[2][0] = PCCf_2_0; + PCCf[2][1] = 0.00317953083; PCHf[0][1] = 0.209336733; diff --git a/src/MANYBODY/pair_airebo.h b/src/MANYBODY/pair_airebo.h index 06bf6da554..e927794ec0 100644 --- a/src/MANYBODY/pair_airebo.h +++ b/src/MANYBODY/pair_airebo.h @@ -70,6 +70,7 @@ class PairAIREBO : public Pair { double epsilon[2][2],sigma[2][2],epsilonT[2][2]; // parameters for Morse variant + double epsilonM[2][2],alphaM[2][2],reqM[2][2]; // spline coefficients @@ -82,6 +83,7 @@ class PairAIREBO : public Pair { // spline knot values + double PCCf_2_0; double PCCf[5][5],PCCdfdx[5][5],PCCdfdy[5][5],PCHf[5][5]; double PCHdfdx[5][5],PCHdfdy[5][5]; double piCCf[5][5][11],piCCdfdx[5][5][11]; diff --git a/src/MANYBODY/pair_rebo.cpp b/src/MANYBODY/pair_rebo.cpp index 5b28eae4dd..1cec1aef40 100644 --- a/src/MANYBODY/pair_rebo.cpp +++ b/src/MANYBODY/pair_rebo.cpp @@ -30,4 +30,9 @@ void PairREBO::settings(int narg, char **arg) cutlj = 0.0; ljflag = torflag = 0; + + // this one parameter for C-C interactions is different in REBO vs AIREBO + // see Favata, Micheletti, Ryu, Pugno, Comp Phys Comm (2016) + + PCCf_2_0 = 0.0; } diff --git a/src/accelerator_kokkos.h b/src/accelerator_kokkos.h index 2a787ef116..a98263fad0 100644 --- a/src/accelerator_kokkos.h +++ b/src/accelerator_kokkos.h @@ -58,6 +58,8 @@ class AtomKokkos : public Atom { tagint **k_special; AtomKokkos(class LAMMPS *lmp) : Atom(lmp) {} ~AtomKokkos() {} + void sync(const ExecutionSpace space, unsigned int mask) {} + void modified(const ExecutionSpace space, unsigned int mask) {} }; class CommKokkos : public CommBrick { diff --git a/src/fix.cpp b/src/fix.cpp index 9918e40e0f..fbb7450225 100644 --- a/src/fix.cpp +++ b/src/fix.cpp @@ -101,6 +101,7 @@ id(NULL), style(NULL), eatom(NULL), vatom(NULL) datamask_read = ALL_MASK; datamask_modify = ALL_MASK; + kokkosable = 0; copymode = 0; } diff --git a/src/fix.h b/src/fix.h index 62cb565b15..65ababf287 100644 --- a/src/fix.h +++ b/src/fix.h @@ -96,6 +96,7 @@ class Fix : protected Pointers { // KOKKOS host/device flag and data masks + int kokkosable; // 1 if Kokkos fix ExecutionSpace execution_space; unsigned int datamask_read,datamask_modify; diff --git a/src/region.cpp b/src/region.cpp index ea0b6f1bc5..08505d1ba5 100644 --- a/src/region.cpp +++ b/src/region.cpp @@ -20,6 +20,7 @@ #include "lattice.h" #include "input.h" #include "variable.h" +#include "math_extra.h" #include "error.h" #include "force.h" @@ -41,7 +42,15 @@ Region::Region(LAMMPS *lmp, int narg, char **arg) : Pointers(lmp) xstr = ystr = zstr = tstr = NULL; dx = dy = dz = 0.0; + // used by set_velocity() even if no rotation specified + + point[0] = point[1] = point[2] = 0.0; + + size_restart = 5; + reset_vel(); copymode = 0; + list = NULL; + nregion = 1; } /* ---------------------------------------------------------------------- */ @@ -87,6 +96,7 @@ void Region::init() if (!input->variable->equalstyle(tvar)) error->all(FLERR,"Variable for region is not equal style"); } + vel_timestep = -1; } /* ---------------------------------------------------------------------- @@ -103,9 +113,9 @@ int Region::dynamic_check() /* ---------------------------------------------------------------------- called before looping over atoms with match() or surface() this insures any variables used by region are invoked once per timestep - also insures variables are invoked by all procs even those w/out atoms + also insures variables are invoked by all procs even those w/out atoms necessary if equal-style variable invokes global operation - with MPI_Allreduce, e.g. xcm() or count() + with MPI_Allreduce, e.g. xcm() or count() ------------------------------------------------------------------------- */ void Region::prematch() @@ -129,6 +139,7 @@ void Region::prematch() int Region::match(double x, double y, double z) { if (dynamic) inverse_transform(x,y,z); + if (openflag) return 1; return !(inside(x,y,z) ^ interior); } @@ -170,8 +181,15 @@ int Region::surface(double x, double y, double z, double cutoff) xnear[1] = y; xnear[2] = z; - if (interior) ncontact = surface_interior(xnear,cutoff); - else ncontact = surface_exterior(xnear,cutoff); + if (!openflag) { + if (interior) ncontact = surface_interior(xnear,cutoff); + else ncontact = surface_exterior(xnear,cutoff); + } + else{ + // one of surface_int/ext() will return 0 + // so no need to worry about offset of contact indices + ncontact = surface_exterior(xnear,cutoff) + surface_interior(xnear,cutoff); + } if (rotateflag && ncontact) { for (int i = 0; i < ncontact; i++) { @@ -200,6 +218,7 @@ void Region::add_contact(int n, double *x, double xp, double yp, double zp) double dely = x[1] - yp; double delz = x[2] - zp; contact[n].r = sqrt(delx*delx + dely*dely + delz*delz); + contact[n].radius = 0; contact[n].delx = delx; contact[n].dely = dely; contact[n].delz = delz; @@ -307,6 +326,9 @@ void Region::options(int narg, char **arg) scaleflag = 1; moveflag = rotateflag = 0; + openflag = 0; + for (int i = 0; i < 6; i++) open_faces[i] = 0; + int iarg = 0; while (iarg < narg) { if (strcmp(arg[iarg],"units") == 0) { @@ -363,9 +385,20 @@ void Region::options(int narg, char **arg) axis[2] = force->numeric(FLERR,arg[iarg+7]); rotateflag = 1; iarg += 8; - } else error->all(FLERR,"Illegal region command"); + + } else if (strcmp(arg[iarg],"open") == 0) { + if (iarg+2 > narg) error->all(FLERR,"Illegal region command"); + int iface = force->inumeric(FLERR,arg[iarg+1]); + if (iface < 1 || iface > 6) error->all(FLERR,"Illegal region command"); + // additional checks on valid face index are done by region classes + open_faces[iface-1] = 1; + openflag = 1; + iarg += 2; + } + else error->all(FLERR,"Illegal region command"); } + // error check if ((moveflag || rotateflag) && @@ -401,3 +434,140 @@ void Region::options(int narg, char **arg) if (moveflag || rotateflag) dynamic = 1; else dynamic = 0; } + +/* ---------------------------------------------------------------------- + find nearest point to C on line segment A,B and return it as D + project (C-A) onto (B-A) + t = length of that projection, normalized by length of (B-A) + t <= 0, C is closest to A + t >= 1, C is closest to B + else closest point is between A and B +------------------------------------------------------------------------- */ + +void Region::point_on_line_segment(double *a, double *b, + double *c, double *d) +{ + double ba[3],ca[3]; + + MathExtra::sub3(b,a,ba); + MathExtra::sub3(c,a,ca); + double t = MathExtra::dot3(ca,ba) / MathExtra::dot3(ba,ba); + if (t <= 0.0) { + d[0] = a[0]; + d[1] = a[1]; + d[2] = a[2]; + } else if (t >= 1.0) { + d[0] = b[0]; + d[1] = b[1]; + d[2] = b[2]; + } else { + d[0] = a[0] + t*ba[0]; + d[1] = a[1] + t*ba[1]; + d[2] = a[2] + t*ba[2]; + } +} + +/* ---------------------------------------------------------------------- + infer translational and angular velocity of region + necessary b/c motion variables are for displacement & theta + there is no analytic formula for v & omega + prev[4] contains values of dx,dy,dz,theta at previous step + used for difference, then updated to current step values + dt is time elapsed since previous step + rpoint = point updated by current displacement + called by fix wall/gran/region every timestep +------------------------------------------------------------------------- */ + +void Region::set_velocity() +{ + if (vel_timestep == update->ntimestep) return; + vel_timestep = update->ntimestep; + if (moveflag) { + if (update->ntimestep > 0) { + v[0] = (dx - prev[0])/update->dt; + v[1] = (dy - prev[1])/update->dt; + v[2] = (dz - prev[2])/update->dt; + } + else v[0] = v[1] = v[2] = 0.0; + prev[0] = dx; + prev[1] = dy; + prev[2] = dz; + } + + if (rotateflag) { + rpoint[0] = point[0] + dx; + rpoint[1] = point[1] + dy; + rpoint[2] = point[2] + dz; + if (update->ntimestep > 0) { + double angvel = (theta-prev[3]) / update->dt; + omega[0] = angvel*axis[0]; + omega[1] = angvel*axis[1]; + omega[2] = angvel*axis[2]; + } + else omega[0] = omega[1] = omega[2] = 0.0; + prev[3] = theta; + } + + if (varshape){ + set_velocity_shape(); + } +} + +/* ---------------------------------------------------------------------- + compute velocity of wall for given contact + since contacts only store delx/y/z, need to pass particle coords + to compute contact point + called by fix/wall/gran/region every contact every timestep +------------------------------------------------------------------------- */ + +void Region::velocity_contact(double *vwall, double *x, int ic) +{ + Contact c = contact[ic]; + double xc[3]; + xc[0] = x[0] - contact[ic].delx; + xc[1] = x[1] - contact[ic].dely; + xc[2] = x[2] - contact[ic].delz; + + vwall[0] = v[0] + omega[1]*(xc[2] - rpoint[2]) - omega[2]*(xc[1] - rpoint[1]); + vwall[1] = v[1] + omega[2]*(xc[0] - rpoint[0]) - omega[0]*(xc[2] - rpoint[2]); + vwall[2] = v[2] + omega[0]*(xc[1] - rpoint[1]) - omega[1]*(xc[0] - rpoint[0]); + + if (varshape && contact[ic].varflag) velocity_contact_shape(vwall,xc); +} + +/* ---------------------------------------------------------------------- + region writes its current position/angle + needed by fix/wall/gran/region to compute velocity by differencing scheme +------------------------------------------------------------------------- */ + +void Region::write_restart(FILE *fp) +{ + fwrite(prev, sizeof(double), size_restart, fp); +} + +/* ---------------------------------------------------------------------- + region reads its previous position/angle + needed by fix/wall/gran/region to compute velocity by differencing scheme +------------------------------------------------------------------------- */ + +int Region::restart(char *buf, int n) +{ + char *rlist = new char[size_restart*sizeof(double)]; + for (int i = 0; i < size_restart*sizeof(double); i++) + rlist[i] = buf[n++]; + for (int i = 0; i < size_restart; i++) { + prev[i] = ((double *)rlist)[i]; + } + delete [] rlist; + return n; +} + +/* ---------------------------------------------------------------------- + set prev vector to zero +------------------------------------------------------------------------- */ + +void Region::reset_vel() +{ + for (int i = 0; i < size_restart; i++) + prev[i] = 0; +} diff --git a/src/region.h b/src/region.h index d330a9bf3e..4b53c4e23b 100644 --- a/src/region.h +++ b/src/region.h @@ -31,17 +31,44 @@ class Region : protected Pointers { int bboxflag; // 1 if bounding box is computable int varshape; // 1 if region shape changes over time int dynamic; // 1 if position/orient changes over time + int moveflag,rotateflag; // 1 if position/orientation changes + int openflag; // 1 if any face is open + int open_faces[6]; // flags for which faces are open int copymode; // 1 if copy of original class - // contact = particle near region surface + // contact = particle near region surface (for soft interactions) + // touch = particle touching region surface (for granular interactions) struct Contact { double r; // distance between particle & surf, r > 0.0 double delx,dely,delz; // vector from surface pt to particle + double radius; // curvature of region at contact point + int iwall; // unique id of wall for storing shear history + int varflag; // 1 if wall can be variable-controlled }; Contact *contact; // list of contacts int cmax; // max # of contacts possible with region + int tmax; // max # of touching contacts possible + + // motion attributes of region + // public so can be accessed by other classes + + double dx,dy,dz,theta; // current displacement and orientation + double v[3]; // translational velocity + double rpoint[3]; // current origin of rotation axis + double omega[3]; // angular velocity + double rprev; // speed of time-dependent radius, if applicable + double xcenter[3]; // translated/rotated center of cylinder/sphere + // only used with varshape + double prev[5]; // stores displacement (X3), angle and if + // necessary, region variable size (e.g. radius) + // at previous time step + int vel_timestep; // store timestep at which set_velocity was called + // prevents multiple fix/wall/gran/region calls + int nregion; // For union and intersect + int size_restart; + int *list; Region(class LAMMPS *, int, char **); virtual ~Region(); @@ -54,6 +81,12 @@ class Region : protected Pointers { int match(double, double, double); int surface(double, double, double, double); + virtual void set_velocity(); + void velocity_contact(double *, double *, int); + virtual void write_restart(FILE *); + virtual int restart(char *, int); + virtual void reset_vel(); + // implemented by each region, not called by other classes virtual int inside(double, double, double) = 0; @@ -61,6 +94,8 @@ class Region : protected Pointers { virtual int surface_exterior(double *, double) = 0; virtual void shape_update() {} virtual void pretransform(); + virtual void set_velocity_shape() {} + virtual void velocity_contact_shape(double*, double*) {} // Kokkos function, implemented by each Kokkos region @@ -69,15 +104,14 @@ class Region : protected Pointers { protected: void add_contact(int, double *, double, double, double); void options(int, char **); + void point_on_line_segment(double *, double *, double *, double *); + void forward_transform(double &, double &, double &); - int moveflag,rotateflag; // 1 if position/orientation changes - - double point[3],axis[3],runit[3]; + private: char *xstr,*ystr,*zstr,*tstr; int xvar,yvar,zvar,tvar; - double dx,dy,dz,theta; + double axis[3],point[3],runit[3]; - void forward_transform(double &, double &, double &); void inverse_transform(double &, double &, double &); void rotate(double &, double &, double &, double); }; @@ -100,10 +134,6 @@ E: Variable for region is not equal style Self-explanatory. -E: Can only use Kokkos supported regions with Kokkos package - -Self-explanatory. - E: Illegal ... command Self-explanatory. Check the input script syntax and compare to the diff --git a/src/region_block.cpp b/src/region_block.cpp index f866903f3d..f48aa5af89 100644 --- a/src/region_block.cpp +++ b/src/region_block.cpp @@ -14,9 +14,10 @@ #include #include #include "region_block.h" -#include "domain.h" -#include "error.h" #include "force.h" +#include "domain.h" +#include "math_extra.h" +#include "error.h" using namespace LAMMPS_NS; @@ -94,9 +95,91 @@ RegBlock::RegBlock(LAMMPS *lmp, int narg, char **arg) : Region(lmp, narg, arg) } else bboxflag = 0; // particle could be close to all 6 planes + // particle can only touch 3 planes cmax = 6; contact = new Contact[cmax]; + if (interior) tmax = 3; + else tmax = 1; + + // open face data structs + + face[0][0] = -1.0; + face[0][1] = 0.0; + face[0][2] = 0.0; + face[1][0] = 1.0; + face[1][1] = 0.0; + face[1][2] = 0.0; + face[2][0] = 0.0; + face[2][1] = -1.0; + face[2][2] = 0.0; + face[3][0] = 0.0; + face[3][1] = 1.0; + face[3][2] = 0.0; + face[4][0] = 0.0; + face[4][1] = 0.0; + face[4][2] = -1.0; + face[5][0] = 0.0; + face[5][1] = 0.0; + face[5][2] = 1.0; + + // face[0] + + corners[0][0][0] = xlo; + corners[0][0][1] = ylo; + corners[0][0][2] = zlo; + corners[0][1][0] = xlo; + corners[0][1][1] = ylo; + corners[0][1][2] = zhi; + corners[0][2][0] = xlo; + corners[0][2][1] = yhi; + corners[0][2][2] = zhi; + corners[0][3][0] = xlo; + corners[0][3][1] = yhi; + corners[0][3][2] = zlo; + + // face[1] + + corners[1][0][0] = xhi; + corners[1][0][1] = ylo; + corners[1][0][2] = zlo; + corners[1][1][0] = xhi; + corners[1][1][1] = ylo; + corners[1][1][2] = zhi; + corners[1][2][0] = xhi; + corners[1][2][1] = yhi; + corners[1][2][2] = zhi; + corners[1][3][0] = xhi; + corners[1][3][1] = yhi; + corners[1][3][2] = zlo; + + // face[2] + + MathExtra::copy3(corners[2][0],corners[0][0]); + MathExtra::copy3(corners[2][1],corners[1][0]); + MathExtra::copy3(corners[2][2],corners[1][1]); + MathExtra::copy3(corners[2][3],corners[0][1]); + + // face[3] + + MathExtra::copy3(corners[3][0],corners[0][3]); + MathExtra::copy3(corners[3][1],corners[0][2]); + MathExtra::copy3(corners[3][2],corners[1][2]); + MathExtra::copy3(corners[3][3],corners[1][3]); + + // face[4] + + MathExtra::copy3(corners[4][0],corners[0][0]); + MathExtra::copy3(corners[4][1],corners[0][3]); + MathExtra::copy3(corners[4][2],corners[1][3]); + MathExtra::copy3(corners[4][3],corners[1][0]); + + // face[5] + + MathExtra::copy3(corners[5][0],corners[0][1]); + MathExtra::copy3(corners[5][1],corners[1][1]); + MathExtra::copy3(corners[5][2],corners[1][2]); + MathExtra::copy3(corners[5][3],corners[0][2]); } /* ---------------------------------------------------------------------- */ @@ -141,47 +224,59 @@ int RegBlock::surface_interior(double *x, double cutoff) int n = 0; delta = x[0] - xlo; - if (delta < cutoff) { + if (delta < cutoff && !open_faces[0]) { contact[n].r = delta; contact[n].delx = delta; contact[n].dely = contact[n].delz = 0.0; + contact[n].radius = 0; + contact[n].iwall = 0; n++; } delta = xhi - x[0]; - if (delta < cutoff) { + if (delta < cutoff && !open_faces[1]) { contact[n].r = delta; contact[n].delx = -delta; contact[n].dely = contact[n].delz = 0.0; + contact[n].radius = 0; + contact[n].iwall = 1; n++; } delta = x[1] - ylo; - if (delta < cutoff) { + if (delta < cutoff && !open_faces[2]) { contact[n].r = delta; contact[n].dely = delta; contact[n].delx = contact[n].delz = 0.0; + contact[n].radius = 0; + contact[n].iwall = 2; n++; } delta = yhi - x[1]; - if (delta < cutoff) { + if (delta < cutoff && !open_faces[3]) { contact[n].r = delta; contact[n].dely = -delta; contact[n].delx = contact[n].delz = 0.0; + contact[n].radius = 0; + contact[n].iwall = 3; n++; } delta = x[2] - zlo; - if (delta < cutoff) { + if (delta < cutoff && !open_faces[4]) { contact[n].r = delta; contact[n].delz = delta; contact[n].delx = contact[n].dely = 0.0; + contact[n].radius = 0; + contact[n].iwall = 4; n++; } delta = zhi - x[2]; - if (delta < cutoff) { + if (delta < cutoff && !open_faces[5]) { contact[n].r = delta; contact[n].delz = -delta; contact[n].delx = contact[n].dely = 0.0; + contact[n].radius = 0; + contact[n].iwall = 5; n++; } @@ -197,6 +292,7 @@ int RegBlock::surface_interior(double *x, double cutoff) int RegBlock::surface_exterior(double *x, double cutoff) { double xp,yp,zp; + double xc,yc,zc,dist,mindist; // x is far enough from block that there is no contact // x is interior to block @@ -212,17 +308,129 @@ int RegBlock::surface_exterior(double *x, double cutoff) // could be edge or corner pt of block // do not add contact point if r >= cutoff - if (x[0] < xlo) xp = xlo; - else if (x[0] > xhi) xp = xhi; - else xp = x[0]; - if (x[1] < ylo) yp = ylo; - else if (x[1] > yhi) yp = yhi; - else yp = x[1]; - if (x[2] < zlo) zp = zlo; - else if (x[2] > zhi) zp = zhi; - else zp = x[2]; + if (!openflag){ + if (x[0] < xlo) xp = xlo; + else if (x[0] > xhi) xp = xhi; + else xp = x[0]; + if (x[1] < ylo) yp = ylo; + else if (x[1] > yhi) yp = yhi; + else yp = x[1]; + if (x[2] < zlo) zp = zlo; + else if (x[2] > zhi) zp = zhi; + else zp = x[2]; + } + else{ + mindist = BIG; + for (int i = 0; i < 6; i++){ + if (open_faces[i]) continue; + dist = find_closest_point(i,x,xc,yc,zc); + if (dist < mindist){ + xp = xc; + yp = yc; + zp = zc; + mindist = dist; + } + } + } add_contact(0,x,xp,yp,zp); + contact[0].iwall = 0; if (contact[0].r < cutoff) return 1; return 0; } + +/*------------------------------------------------------------------------ + return distance to closest point on surface I of block region + store closest point in xc,yc,zc +--------------------------------------------------------------------------*/ + +double RegBlock::find_closest_point(int i, double *x, + double &xc, double &yc, double &zc) +{ + double dot,d2,d2min; + double xr[3],xproj[3],p[3]; + + xr[0] = x[0] - corners[i][0][0]; + xr[1] = x[1] - corners[i][0][1]; + xr[2] = x[2] - corners[i][0][2]; + dot = face[i][0]*xr[0] + face[i][1]*xr[1] + face[i][2]*xr[2]; + xproj[0] = xr[0] - dot*face[i][0]; + xproj[1] = xr[1] - dot*face[i][1]; + xproj[2] = xr[2] - dot*face[i][2]; + + d2min = BIG; + + // check if point projects inside of face + + if (inside_face(xproj, i)){ + d2 = d2min = dot*dot; + xc = xproj[0] + corners[i][0][0]; + yc = xproj[1] + corners[i][0][1]; + zc = xproj[2] + corners[i][0][2]; + + // check each edge + + } else { + point_on_line_segment(corners[i][0],corners[i][1],x,p); + d2 = (p[0]-x[0])*(p[0]-x[0]) + (p[1]-x[1])*(p[1]-x[1]) + + (p[2]-x[2])*(p[2]-x[2]); + if (d2 < d2min) { + d2min = d2; + xc = p[0]; + yc = p[1]; + zc = p[2]; + } + + point_on_line_segment(corners[i][1],corners[i][2],x,p); + d2 = (p[0]-x[0])*(p[0]-x[0]) + (p[1]-x[1])*(p[1]-x[1]) + + (p[2]-x[2])*(p[2]-x[2]); + if (d2 < d2min) { + d2min = d2; + xc = p[0]; + yc = p[1]; + zc = p[2]; + } + + point_on_line_segment(corners[i][2],corners[i][3],x,p); + d2 = (p[0]-x[0])*(p[0]-x[0]) + (p[1]-x[1])*(p[1]-x[1]) + + (p[2]-x[2])*(p[2]-x[2]); + if (d2 < d2min) { + d2min = d2; + xc = p[0]; + yc = p[1]; + zc = p[2]; + } + + point_on_line_segment(corners[i][3],corners[i][4],x,p); + d2 = (p[0]-x[0])*(p[0]-x[0]) + (p[1]-x[1])*(p[1]-x[1]) + + (p[2]-x[2])*(p[2]-x[2]); + if (d2 < d2min) { + d2min = d2; + xc = p[0]; + yc = p[1]; + zc = p[2]; + } + } + + return d2min; +} + +/*------------------------------------------------------------------------ + determine if projected point is inside given face of the block +--------------------------------------------------------------------------*/ + +int RegBlock::inside_face(double *xproj, int iface) +{ + if (iface < 2) { + if (xproj[1] > 0 && (xproj[1] < yhi-ylo) && + xproj[2] > 0 && (xproj[2] < zhi-zlo)) return 1; + } else if (iface < 4) { + if (xproj[0] > 0 && (xproj[0] < (xhi-xlo)) && + xproj[2] > 0 && (xproj[2] < (zhi-zlo))) return 1; + } else { + if (xproj[0] > 0 && xproj[0] < (xhi-xlo) && + xproj[1] > 0 && xproj[1] < (yhi-ylo)) return 1; + } + + return 0; +} diff --git a/src/region_block.h b/src/region_block.h index fb9dcb3f5e..7989ddb8af 100644 --- a/src/region_block.h +++ b/src/region_block.h @@ -36,6 +36,11 @@ class RegBlock : public Region { protected: double xlo,xhi,ylo,yhi,zlo,zhi; + double corners[6][4][3]; + double face[6][3]; + + double find_closest_point(int, double *, double &, double &, double &); + int inside_face(double *, int); }; } diff --git a/src/region_cone.cpp b/src/region_cone.cpp index bc3197a02d..786b92d3b7 100644 --- a/src/region_cone.cpp +++ b/src/region_cone.cpp @@ -34,6 +34,11 @@ RegCone::RegCone(LAMMPS *lmp, int narg, char **arg) : { options(narg-9,&arg[9]); + // check open face settings + + if (openflag && (open_faces[3] || open_faces[4] || open_faces[5])) + error->all(FLERR,"Invalid region cone open setting"); + if (strcmp(arg[2],"x") && strcmp(arg[2],"y") && strcmp(arg[2],"z")) error->all(FLERR,"Illegal region cylinder command"); axis = arg[2][0]; @@ -118,7 +123,6 @@ RegCone::RegCone(LAMMPS *lmp, int narg, char **arg) : if (interior) { bboxflag = 1; - if (axis == 'x') { extent_xlo = lo; extent_xhi = hi; @@ -145,10 +149,13 @@ RegCone::RegCone(LAMMPS *lmp, int narg, char **arg) : } } else bboxflag = 0; - // particle could be contact cone surface and 2 ends + // particle could be close to cone surface and 2 ends + // particle can only touch surface and 1 end cmax = 3; contact = new Contact[cmax]; + if (interior) tmax = 2; + else tmax = 1; } /* ---------------------------------------------------------------------- */ @@ -167,7 +174,7 @@ int RegCone::inside(double x, double y, double z) { double del1,del2,dist; double currentradius; - int inside = 0; + int inside; if (axis == 'x') { del1 = y - c1; @@ -226,7 +233,7 @@ int RegCone::surface_interior(double *x, double cutoff) // surflo = pt on outer circle of bottom end plane, same dir as x vs axis // surfhi = pt on outer circle of top end plane, same dir as x vs axis - if (r > 0.0) { + if (r > 0.0 && !open_faces[2]) { surflo[0] = lo; surflo[1] = c1 + del1*radiuslo/r; surflo[2] = c2 + del2*radiuslo/r; @@ -243,22 +250,29 @@ int RegCone::surface_interior(double *x, double cutoff) contact[n].delx = delx; contact[n].dely = dely; contact[n].delz = delz; + contact[n].radius = -2.0*(radiuslo + (xs[0]-lo)* + (radiushi-radiuslo)/(hi-lo)); + contact[n].iwall = 2; n++; } } delta = x[0] - lo; - if (delta < cutoff) { + if (delta < cutoff && !open_faces[0]) { contact[n].r = delta; contact[n].delx = delta; contact[n].dely = contact[n].delz = 0.0; + contact[n].radius = 0; + contact[n].iwall = 0; n++; } delta = hi - x[0]; - if (delta < cutoff) { + if (delta < cutoff && !open_faces[1]) { contact[n].r = delta; contact[n].delx = -delta; contact[n].dely = contact[n].delz = 0.0; + contact[n].radius = 0; + contact[n].iwall = 1; n++; } @@ -266,7 +280,8 @@ int RegCone::surface_interior(double *x, double cutoff) del1 = x[0] - c1; del2 = x[2] - c2; r = sqrt(del1*del1 + del2*del2); - currentradius = radiuslo + (x[1]-lo)*(radiushi-radiuslo)/(hi-lo); + currentradius = radiuslo + (x[1]-lo)* + (radiushi-radiuslo)/(hi-lo); // y is exterior to cone @@ -276,7 +291,7 @@ int RegCone::surface_interior(double *x, double cutoff) // surflo = pt on outer circle of bottom end plane, same dir as y vs axis // surfhi = pt on outer circle of top end plane, same dir as y vs axis - if (r > 0.0) { + if (r > 0.0 && !open_faces[2]) { surflo[0] = c1 + del1*radiuslo/r; surflo[1] = lo; surflo[2] = c2 + del2*radiuslo/r; @@ -293,22 +308,29 @@ int RegCone::surface_interior(double *x, double cutoff) contact[n].delx = delx; contact[n].dely = dely; contact[n].delz = delz; + contact[n].iwall = 2; + contact[n].radius = -2.0*(radiuslo + (xs[1]-lo)* + (radiushi-radiuslo)/(hi-lo)); n++; } } delta = x[1] - lo; - if (delta < cutoff) { + if (delta < cutoff && !open_faces[0]) { contact[n].r = delta; contact[n].delz = delta; contact[n].delx = contact[n].dely = 0.0; + contact[n].iwall = 0; + contact[n].radius = 0; n++; } delta = hi - x[1]; - if (delta < cutoff) { + if (delta < cutoff && !open_faces[1]) { contact[n].r = delta; contact[n].delz = -delta; contact[n].delx = contact[n].dely = 0.0; + contact[n].iwall = 1; + contact[n].radius = 0; n++; } @@ -326,7 +348,7 @@ int RegCone::surface_interior(double *x, double cutoff) // surflo = pt on outer circle of bottom end plane, same dir as z vs axis // surfhi = pt on outer circle of top end plane, same dir as z vs axis - if (r > 0.0) { + if (r > 0.0 && !open_faces[2]) { surflo[0] = c1 + del1*radiuslo/r; surflo[1] = c2 + del2*radiuslo/r; surflo[2] = lo; @@ -343,22 +365,29 @@ int RegCone::surface_interior(double *x, double cutoff) contact[n].delx = delx; contact[n].dely = dely; contact[n].delz = delz; + contact[n].iwall = 2; + contact[n].radius = -2.0*(radiuslo + (xs[2]-lo)* + (radiushi-radiuslo)/(hi-lo)); n++; } } delta = x[2] - lo; - if (delta < cutoff) { + if (delta < cutoff && !open_faces[0]) { contact[n].r = delta; contact[n].delz = delta; contact[n].delx = contact[n].dely = 0.0; + contact[n].iwall = 0; + contact[n].radius = 0; n++; } delta = hi - x[2]; - if (delta < cutoff) { + if (delta < cutoff && !open_faces[1]) { contact[n].r = delta; contact[n].delz = -delta; contact[n].delx = contact[n].dely = 0.0; + contact[n].iwall = 1; + contact[n].radius = 0; n++; } } @@ -374,7 +403,7 @@ int RegCone::surface_interior(double *x, double cutoff) int RegCone::surface_exterior(double *x, double cutoff) { - double del1,del2,r,currentradius,distsq; + double del1,del2,r,currentradius,distsq,distsqprev,crad; double corner1[3],corner2[3],corner3[3],corner4[3],xp[3],nearest[3]; if (axis == 'x') { @@ -383,11 +412,15 @@ int RegCone::surface_exterior(double *x, double cutoff) r = sqrt(del1*del1 + del2*del2); currentradius = radiuslo + (x[0]-lo)*(radiushi-radiuslo)/(hi-lo); + // radius of curvature, only used for granular walls + + double crad = 0.0; + // x is far enough from cone that there is no contact // x is interior to cone - if (r >= maxradius+cutoff || - x[0] <= lo-cutoff || x[0] >= hi+cutoff) return 0; + if (r >= maxradius+cutoff || x[0] <= lo-cutoff || x[0] >= hi+cutoff) + return 0; if (r < currentradius && x[0] > lo && x[0] < hi) return 0; // x is exterior to cone or on its surface @@ -411,14 +444,31 @@ int RegCone::surface_exterior(double *x, double cutoff) corner4[2] = c2; distsq = BIG; - point_on_line_segment(corner1,corner2,x,xp); - distsq = closest(x,xp,nearest,distsq); - point_on_line_segment(corner1,corner3,x,xp); - distsq = closest(x,xp,nearest,distsq); - point_on_line_segment(corner2,corner4,x,xp); - distsq = closest(x,xp,nearest,distsq); + if (!open_faces[2]) { + point_on_line_segment(corner1,corner2,x,xp); + distsq = closest(x,xp,nearest,distsq); + crad = -2.0*(radiuslo + (nearest[0]-lo)*(radiushi-radiuslo)/(hi-lo)); + } + + if (!open_faces[0]) { + point_on_line_segment(corner1,corner3,x,xp); + distsqprev = distsq; + distsq = closest(x,xp,nearest,distsq); + if (distsq < distsqprev) crad = 0.0; + } + + if (!open_faces[1]) { + point_on_line_segment(corner2,corner4,x,xp); + distsqprev = distsq; + distsq = closest(x,xp,nearest,distsq); + if (distsq < distsqprev) crad = 0.0; + } + + if (distsq == BIG) return 0; add_contact(0,x,nearest[0],nearest[1],nearest[2]); + contact[0].radius = crad; + contact[0].iwall = 0; if (contact[0].r < cutoff) return 1; return 0; @@ -456,14 +506,30 @@ int RegCone::surface_exterior(double *x, double cutoff) corner4[2] = c2; distsq = BIG; - point_on_line_segment(corner1,corner2,x,xp); - distsq = closest(x,xp,nearest,distsq); - point_on_line_segment(corner1,corner3,x,xp); - distsq = closest(x,xp,nearest,distsq); - point_on_line_segment(corner2,corner4,x,xp); - distsq = closest(x,xp,nearest,distsq); + + if (!open_faces[2]){ + point_on_line_segment(corner1,corner2,x,xp); + distsq = closest(x,xp,nearest,distsq); + crad = -2.0*(radiuslo + (nearest[1]-lo)*(radiushi-radiuslo)/(hi-lo)); + } + + if (!open_faces[0]) { + point_on_line_segment(corner1,corner3,x,xp); + distsqprev = distsq; + distsq = closest(x,xp,nearest,distsq); + if (distsq < distsqprev) crad = 0; + } + + if (!open_faces[1]) { + point_on_line_segment(corner2,corner4,x,xp); + distsqprev = distsq; + distsq = closest(x,xp,nearest,distsq); + if (distsq < distsqprev) crad = 0; + } add_contact(0,x,nearest[0],nearest[1],nearest[2]); + contact[0].radius = crad; + contact[0].iwall = 0; if (contact[0].r < cutoff) return 1; return 0; @@ -476,8 +542,8 @@ int RegCone::surface_exterior(double *x, double cutoff) // z is far enough from cone that there is no contact // z is interior to cone - if (r >= maxradius+cutoff || - x[2] <= lo-cutoff || x[2] >= hi+cutoff) return 0; + if (r >= maxradius+cutoff || x[2] <= lo-cutoff || x[2] >= hi+cutoff) + return 0; if (r < currentradius && x[2] > lo && x[2] < hi) return 0; // z is exterior to cone or on its surface @@ -501,52 +567,35 @@ int RegCone::surface_exterior(double *x, double cutoff) corner4[2] = hi; distsq = BIG; - point_on_line_segment(corner1,corner2,x,xp); - distsq = closest(x,xp,nearest,distsq); - point_on_line_segment(corner1,corner3,x,xp); - distsq = closest(x,xp,nearest,distsq); - point_on_line_segment(corner2,corner4,x,xp); - distsq = closest(x,xp,nearest,distsq); + + if (!open_faces[2]){ + point_on_line_segment(corner1,corner2,x,xp); + distsq = closest(x,xp,nearest,distsq); + crad = -2.0*(radiuslo + (nearest[2]-lo)*(radiushi-radiuslo)/(hi-lo)); + } + + if (!open_faces[0]) { + point_on_line_segment(corner1,corner3,x,xp); + distsqprev = distsq; + distsq = closest(x,xp,nearest,distsq); + if (distsq < distsqprev) crad = 0; + } + + if (!open_faces[1]) { + point_on_line_segment(corner2,corner4,x,xp); + distsqprev = distsq; + distsq = closest(x,xp,nearest,distsq); + if (distsq < distsqprev) crad = 0; + } add_contact(0,x,nearest[0],nearest[1],nearest[2]); + contact[0].radius = crad; + contact[0].iwall = 0; if (contact[0].r < cutoff) return 1; return 0; } } -/* ---------------------------------------------------------------------- - find nearest point to C on line segment A,B and return it as D - project (C-A) onto (B-A) - t = length of that projection, normalized by length of (B-A) - t <= 0, C is closest to A - t >= 1, C is closest to B - else closest point is between A and B -------------------------------------------------------------------------- */ - -void RegCone::point_on_line_segment(double *a, double *b, - double *c, double *d) -{ - double ba[3],ca[3]; - - subtract(a,b,ba); - subtract(a,c,ca); - double t = dotproduct(ca,ba) / dotproduct(ba,ba); - - if (t <= 0.0) { - d[0] = a[0]; - d[1] = a[1]; - d[2] = a[2]; - } else if (t >= 1.0) { - d[0] = b[0]; - d[1] = b[1]; - d[2] = b[2]; - } else { - d[0] = a[0] + t*ba[0]; - d[1] = a[1] + t*ba[1]; - d[2] = a[2] + t*ba[2]; - } -} - /* ---------------------------------------------------------------------- */ double RegCone::closest(double *x, double *near, double *nearest, double dsq) @@ -562,23 +611,3 @@ double RegCone::closest(double *x, double *near, double *nearest, double dsq) nearest[2] = near[2]; return rsq; } - -/* ---------------------------------------------------------------------- - v3 = v2 - v1 -------------------------------------------------------------------------- */ - -void RegCone::subtract(double *v1, double *v2, double *v3) -{ - v3[0] = v2[0] - v1[0]; - v3[1] = v2[1] - v1[1]; - v3[2] = v2[2] - v1[2]; -} - -/* ---------------------------------------------------------------------- - return dotproduct = v1 dot v2 -------------------------------------------------------------------------- */ - -double RegCone::dotproduct(double *v1, double *v2) -{ - return (v1[0]*v2[0] + v1[1]*v2[1] + v1[2]*v2[2]); -} diff --git a/src/region_cone.h b/src/region_cone.h index 0f6ac71deb..62b2d05a8d 100644 --- a/src/region_cone.h +++ b/src/region_cone.h @@ -39,11 +39,7 @@ class RegCone : public Region { double lo,hi; double maxradius; - void point_on_line_segment(double *, double *, double *, double *); double closest(double *, double *, double *, double); - - void subtract(double *, double *, double *); - double dotproduct(double *, double *); }; } diff --git a/src/region_cylinder.cpp b/src/region_cylinder.cpp index b77ff2a881..b2935f22cb 100644 --- a/src/region_cylinder.cpp +++ b/src/region_cylinder.cpp @@ -34,6 +34,12 @@ RegCylinder::RegCylinder(LAMMPS *lmp, int narg, char **arg) : { options(narg-8,&arg[8]); + // check open face settings + + if (openflag && (open_faces[2] || open_faces[3] || + open_faces[4] || open_faces[5])) + error->all(FLERR,"Invalid region cylinder open setting"); + if (strcmp(arg[2],"x") && strcmp(arg[2],"y") && strcmp(arg[2],"z")) error->all(FLERR,"Illegal region cylinder command"); axis = arg[2][0]; @@ -61,7 +67,7 @@ RegCylinder::RegCylinder(LAMMPS *lmp, int narg, char **arg) : shape_update(); } else { radius = force->numeric(FLERR,arg[5]); - if (axis == 'x') radius *= yscale; + if (axis == 'x') radius *= xscale; else radius *= xscale; rstyle = CONSTANT; } @@ -149,10 +155,13 @@ RegCylinder::RegCylinder(LAMMPS *lmp, int narg, char **arg) : } } else bboxflag = 0; - // particle could be contact cylinder surface and 2 ends + // particle could be close to cylinder surface and 2 ends + // particle can only touch surface and 1 end cmax = 3; contact = new Contact[cmax]; + if (interior) tmax = 2; + else tmax = 1; } /* ---------------------------------------------------------------------- */ @@ -230,25 +239,34 @@ int RegCylinder::surface_interior(double *x, double cutoff) // x is interior to cylinder or on its surface delta = radius - r; - if (delta < cutoff && r > 0.0) { + if (delta < cutoff && r > 0.0 && !open_faces[2]) { contact[n].r = delta; contact[n].delx = 0.0; contact[n].dely = del1*(1.0-radius/r); contact[n].delz = del2*(1.0-radius/r); + contact[n].radius = -2.0*radius; + contact[n].iwall = 2; + contact[n].varflag = 1; n++; } delta = x[0] - lo; - if (delta < cutoff) { + if (delta < cutoff && !open_faces[0]) { contact[n].r = delta; contact[n].delx = delta; contact[n].dely = contact[n].delz = 0.0; + contact[n].radius = 0; + contact[n].iwall = 0; + contact[n].varflag = 0; n++; } delta = hi - x[0]; - if (delta < cutoff) { + if (delta < cutoff && !open_faces[1]) { contact[n].r = delta; contact[n].delx = -delta; contact[n].dely = contact[n].delz = 0.0; + contact[n].radius = 0; + contact[n].iwall = 1; + contact[n].varflag = 0; n++; } @@ -264,25 +282,34 @@ int RegCylinder::surface_interior(double *x, double cutoff) // y is interior to cylinder or on its surface delta = radius - r; - if (delta < cutoff && r > 0.0) { + if (delta < cutoff && r > 0.0 && !open_faces[2]) { contact[n].r = delta; contact[n].delx = del1*(1.0-radius/r); contact[n].dely = 0.0; contact[n].delz = del2*(1.0-radius/r); + contact[n].radius = -2.0*radius; + contact[n].iwall = 2; + contact[n].varflag = 1; n++; } delta = x[1] - lo; - if (delta < cutoff) { + if (delta < cutoff && !open_faces[0]) { contact[n].r = delta; contact[n].dely = delta; contact[n].delx = contact[n].delz = 0.0; + contact[n].radius = 0; + contact[n].iwall = 0; + contact[n].varflag = 0; n++; } delta = hi - x[1]; - if (delta < cutoff) { + if (delta < cutoff && !open_faces[1]) { contact[n].r = delta; contact[n].dely = -delta; contact[n].delx = contact[n].delz = 0.0; + contact[n].radius = 0; + contact[n].iwall = 1; + contact[n].varflag = 0; n++; } @@ -298,25 +325,34 @@ int RegCylinder::surface_interior(double *x, double cutoff) // z is interior to cylinder or on its surface delta = radius - r; - if (delta < cutoff && r > 0.0) { + if (delta < cutoff && r > 0.0 && !open_faces[2]) { contact[n].r = delta; contact[n].delx = del1*(1.0-radius/r); contact[n].dely = del2*(1.0-radius/r); contact[n].delz = 0.0; + contact[n].radius = -2.0*radius; + contact[n].iwall = 2; + contact[n].varflag = 1; n++; } delta = x[2] - lo; - if (delta < cutoff) { + if (delta < cutoff && !open_faces[0]) { contact[n].r = delta; contact[n].delz = delta; contact[n].delx = contact[n].dely = 0.0; + contact[n].radius = 0; + contact[n].iwall = 0; + contact[n].varflag = 0; n++; } delta = hi - x[2]; - if (delta < cutoff) { + if (delta < cutoff && !open_faces[1]) { contact[n].r = delta; contact[n].delz = -delta; contact[n].delx = contact[n].dely = 0.0; + contact[n].radius = 0; + contact[n].iwall = 1; + contact[n].varflag = 0; n++; } } @@ -334,6 +370,13 @@ int RegCylinder::surface_exterior(double *x, double cutoff) { double del1,del2,r; double xp,yp,zp; + double dx, dr, dr2, d2, d2prev; + + // radius of curvature for granular + // 0 for flat surfaces (infinite case), 2*radius for curved portion + + double crad = 0.0; + int varflag = 0; if (axis == 'x') { del1 = x[1] - c1; @@ -351,18 +394,81 @@ int RegCylinder::surface_exterior(double *x, double cutoff) // could be edge of cylinder // do not add contact point if r >= cutoff - if (r > radius) { - yp = c1 + del1*radius/r; - zp = c2 + del2*radius/r; - } else { - yp = x[1]; - zp = x[2]; + d2prev = BIG; + if (!openflag) { + if (r > radius) { + yp = c1 + del1*radius/r; + zp = c2 + del2*radius/r; + crad = 2.0*radius; + varflag = 1; + } else { + yp = x[1]; + zp = x[2]; + } + if (x[0] < lo) xp = lo; + else if (x[0] > hi) xp = hi; + else xp = x[0]; + } + + // closest point on curved surface + + else { + dr = r - radius; + dr2 = dr*dr; + if (!open_faces[2]){ + yp = c1 + del1*radius/r; + zp = c2 + del2*radius/r; + if (x[0] < lo) { + dx = lo-x[0]; + xp = lo; + } + else if (x[0] > hi) { + dx = x[0]-hi; + xp = hi; + } + else { + dx = 0; + xp = x[0]; + } + d2 = d2prev = dr2 + dx*dx; + } + + // closest point on bottom cap + + if (!open_faces[0]) { + dx = lo - x[0]; + if (r < radius) d2 = dx*dx; + else d2 = dr2 + dx*dx; + if (d2 < d2prev) { + xp = lo; + if (r < radius){ + yp = x[1]; + zp = x[2]; + } + d2prev = d2; + } + } + + // closest point on top cap + + if (!open_faces[1]) { + dx = hi - x[0]; + if (r < radius) d2 = dx*dx; + else d2 = dr2 + dx*dx; + if (d2 < d2prev) { + xp = hi; + if (r < radius){ + yp = x[1]; + zp = x[2]; + } + } + } } - if (x[0] < lo) xp = lo; - else if (x[0] > hi) xp = hi; - else xp = x[0]; add_contact(0,x,xp,yp,zp); + contact[0].radius = crad; + contact[0].varflag = varflag; + contact[0].iwall = 0; if (contact[0].r < cutoff) return 1; return 0; @@ -382,18 +488,81 @@ int RegCylinder::surface_exterior(double *x, double cutoff) // could be edge of cylinder // do not add contact point if r >= cutoff - if (r > radius) { - xp = c1 + del1*radius/r; - zp = c2 + del2*radius/r; - } else { - xp = x[0]; - zp = x[2]; + d2prev = BIG; + if (!openflag) { + if (r > radius) { + xp = c1 + del1*radius/r; + zp = c2 + del2*radius/r; + crad = 2.0*radius; + varflag = 1; + } else { + xp = x[0]; + zp = x[2]; + } + if (x[1] < lo) yp = lo; + else if (x[1] > hi) yp = hi; + else yp = x[1]; + } + + // closest point on curved surface + + else { + dr = r - radius; + dr2 = dr*dr; + if (!open_faces[2]){ + xp = c1 + del1*radius/r; + zp = c2 + del2*radius/r; + if (x[1] < lo) { + dx = lo-x[1]; + yp = lo; + } + else if (x[1] > hi) { + dx = x[1]-hi; + yp = hi; + } + else { + dx = 0; + yp = x[1]; + } + d2 = d2prev = dr2 + dx*dx; + } + + // closest point on bottom cap + + if (!open_faces[0]) { + dx = lo - x[1]; + if (r < radius) d2 = dx*dx; + else d2 = dr2 + dx*dx; + if (d2 < d2prev) { + yp = lo; + if (r < radius) { + xp = x[0]; + zp = x[2]; + } + d2prev = d2; + } + } + + // closest point on top cap + + if (!open_faces[1]) { + dx = hi - x[1]; + if (r < radius) d2 = dx*dx; + else d2 = dr2 + dx*dx; + if (d2 < d2prev) { + yp = hi; + if (r < radius) { + xp = x[0]; + zp = x[2]; + } + } + } } - if (x[1] < lo) yp = lo; - else if (x[1] > hi) yp = hi; - else yp = x[1]; add_contact(0,x,xp,yp,zp); + contact[0].radius = crad; + contact[0].varflag = varflag; + contact[0].iwall = 0; if (contact[0].r < cutoff) return 1; return 0; @@ -413,18 +582,81 @@ int RegCylinder::surface_exterior(double *x, double cutoff) // could be edge of cylinder // do not add contact point if r >= cutoff - if (r > radius) { - xp = c1 + del1*radius/r; - yp = c2 + del2*radius/r; - } else { - xp = x[0]; - yp = x[1]; + d2prev = BIG; + if (!openflag) { + if (r > radius) { + xp = c1 + del1*radius/r; + yp = c2 + del2*radius/r; + crad = 2.0*radius; + varflag = 1; + } else { + xp = x[0]; + yp = x[1]; + } + if (x[2] < lo) zp = lo; + else if (x[2] > hi) zp = hi; + else zp = x[2]; + } + + // closest point on curved surface + + else { + dr = r - radius; + dr2 = dr*dr; + if (!open_faces[2]){ + xp = c1 + del1*radius/r; + yp = c2 + del2*radius/r; + if (x[2] < lo) { + dx = lo-x[2]; + zp = lo; + } + else if (x[2] > hi) { + dx = x[2]-hi; + zp = hi; + } + else { + dx = 0; + zp = x[2]; + } + d2 = d2prev = dr2 + dx*dx; + } + + // closest point on bottom cap + + if (!open_faces[0]) { + dx = lo - x[2]; + if (r < radius) d2 = dx*dx; + else d2 = dr2 + dx*dx; + if (d2 < d2prev) { + zp = lo; + if (r < radius) { + xp = x[0]; + yp = x[1]; + } + d2prev = d2; + } + } + + // closest point on top cap + + if (!open_faces[1]) { + dx = hi - x[2]; + if (r < radius) d2 = dx*dx; + else d2 = dr2 + dx*dx; + if (d2 < d2prev) { + zp = hi; + if (r < radius) { + xp = x[0]; + yp = x[1]; + } + } + } } - if (x[2] < lo) zp = lo; - else if (x[2] > hi) zp = hi; - else zp = x[2]; add_contact(0,x,xp,yp,zp); + contact[0].radius = crad; + contact[0].varflag = varflag; + contact[0].iwall = 0; if (contact[0].r < cutoff) return 1; return 0; } @@ -439,8 +671,9 @@ void RegCylinder::shape_update() radius = input->variable->compute_equal(rvar); if (radius < 0.0) error->one(FLERR,"Variable evaluation in region gave bad value"); - if (axis == 'x') radius *= yscale; - else radius *= xscale; + if (axis == 'x') radius *= xscale; + else if (axis == 'y') radius*= yscale; + else radius *= zscale; } /* ---------------------------------------------------------------------- @@ -455,3 +688,65 @@ void RegCylinder::variable_check() if (!input->variable->equalstyle(rvar)) error->all(FLERR,"Variable for region cylinder is invalid style"); } + + +/* ---------------------------------------------------------------------- + Set values needed to calculate velocity due to shape changes. + These values do not depend on the contact, so this function is + called once per timestep by fix/wall/gran/region. + +------------------------------------------------------------------------- */ + +void RegCylinder::set_velocity_shape() +{ + if (axis == 'x'){ + xcenter[0] = 0; + xcenter[1] = c1; + xcenter[2] = c2; + } + else if (axis == 'y'){ + xcenter[0] = c1; + xcenter[1] = 0; + xcenter[2] = c2; + } + else{ + xcenter[0] = c1; + xcenter[1] = c2; + xcenter[2] = 0; + } + forward_transform(xcenter[0], xcenter[1], xcenter[2]); + if (update->ntimestep > 0) rprev = prev[4]; + else rprev = radius; + prev[4] = radius; +} + + + +/* ---------------------------------------------------------------------- + add velocity due to shape change to wall velocity +------------------------------------------------------------------------- */ + +void RegCylinder::velocity_contact_shape(double *vwall, double *xc) +{ + double delx, dely, delz; // Displacement of contact point in x,y,z + if (axis == 'x'){ + delx = 0; + dely = (xc[1] - xcenter[1])*(1 - rprev/radius); + delz = (xc[2] - xcenter[2])*(1 - rprev/radius); + } + else if (axis == 'y'){ + delx = (xc[0] - xcenter[0])*(1 - rprev/radius); + dely = 0; + delz = (xc[2] - xcenter[2])*(1 - rprev/radius); + } + else{ + delx = (xc[0] - xcenter[0])*(1 - rprev/radius); + dely = (xc[1] - xcenter[1])*(1 - rprev/radius); + delz = 0; + } + vwall[0] += delx/update->dt; + vwall[1] += dely/update->dt; + vwall[2] += delz/update->dt; + //printf ("R is %g, prev %g, velocity of wall at %g %g %g is %g %g %g\n",radius,rprev,xc[0],xc[1],xc[2],vwall[0],vwall[1],vwall[2]); +} + diff --git a/src/region_cylinder.h b/src/region_cylinder.h index 247d939c4f..bc5255b343 100644 --- a/src/region_cylinder.h +++ b/src/region_cylinder.h @@ -35,6 +35,8 @@ class RegCylinder : public Region { int surface_interior(double *, double); int surface_exterior(double *, double); void shape_update(); + void set_velocity_shape(); + void velocity_contact_shape(double *, double *); private: char axis; diff --git a/src/region_intersect.cpp b/src/region_intersect.cpp index bfbe579367..39e8d90d59 100644 --- a/src/region_intersect.cpp +++ b/src/region_intersect.cpp @@ -43,7 +43,7 @@ RegIntersect::RegIntersect(LAMMPS *lmp, int narg, char **arg) : idsub[nregion] = new char[m]; strcpy(idsub[nregion],arg[iarg+3]); iregion = domain->find_region(idsub[nregion]); - if (iregion == -1) + if (iregion == -1) error->all(FLERR,"Region intersect region ID does not exist"); list[nregion++] = iregion; } @@ -88,11 +88,21 @@ RegIntersect::RegIntersect(LAMMPS *lmp, int narg, char **arg) : } // possible contacts = sum of possible contacts in all sub-regions + // for near contacts and touching contacts cmax = 0; - for (int ilist = 0; ilist < nregion; ilist++) + size_restart = 0; + for (int ilist = 0; ilist < nregion; ilist++){ cmax += regions[list[ilist]]->cmax; + size_restart += regions[list[ilist]]->size_restart; + } contact = new Contact[cmax]; + + tmax = 0; + for (int ilist = 0; ilist < nregion; ilist++) { + if (interior) tmax += regions[list[ilist]]->tmax; + else tmax++; + } } /* ---------------------------------------------------------------------- */ @@ -117,7 +127,7 @@ void RegIntersect::init() int iregion; for (int ilist = 0; ilist < nregion; ilist++) { iregion = domain->find_region(idsub[ilist]); - if (iregion == -1) + if (iregion == -1) error->all(FLERR,"Region union region ID does not exist"); list[ilist] = iregion; } @@ -159,6 +169,7 @@ int RegIntersect::surface_interior(double *x, double cutoff) Region **regions = domain->regions; int n = 0; + int walloffset = 0; for (ilist = 0; ilist < nregion; ilist++) { iregion = list[ilist]; ncontacts = regions[iregion]->surface(x[0],x[1],x[2],cutoff); @@ -173,12 +184,18 @@ int RegIntersect::surface_interior(double *x, double cutoff) } if (jlist == nregion) { contact[n].r = regions[iregion]->contact[m].r; + contact[n].radius = regions[iregion]->contact[m].radius; contact[n].delx = regions[iregion]->contact[m].delx; contact[n].dely = regions[iregion]->contact[m].dely; contact[n].delz = regions[iregion]->contact[m].delz; + contact[n].iwall = regions[iregion]->contact[m].iwall + walloffset; + contact[n].varflag = regions[iregion]->contact[m].varflag; n++; } } + // increment by cmax instead of tmax to insure + // possible wall IDs for sub-regions are non overlapping + walloffset += regions[iregion]->cmax; } return n; @@ -218,9 +235,12 @@ int RegIntersect::surface_exterior(double *x, double cutoff) } if (jlist == nregion) { contact[n].r = regions[iregion]->contact[m].r; + contact[n].radius = regions[iregion]->contact[m].radius; contact[n].delx = regions[iregion]->contact[m].delx; contact[n].dely = regions[iregion]->contact[m].dely; contact[n].delz = regions[iregion]->contact[m].delz; + contact[n].iwall = ilist; + contact[n].varflag = regions[iregion]->contact[m].varflag; n++; } } @@ -253,3 +273,48 @@ void RegIntersect::pretransform() for (int ilist = 0; ilist < nregion; ilist++) regions[list[ilist]]->pretransform(); } + +/* ---------------------------------------------------------------------- + get translational/angular velocities of all subregions +------------------------------------------------------------------------- */ + +void RegIntersect::set_velocity() +{ + Region **regions = domain->regions; + for (int ilist = 0; ilist < nregion; ilist++) + regions[list[ilist]]->set_velocity(); +} + +/* ---------------------------------------------------------------------- + region writes its current position/angle + needed by fix/wall/gran/region to compute velocity by differencing scheme +------------------------------------------------------------------------- */ + +void RegIntersect::write_restart(FILE *fp) +{ + for (int ilist = 0; ilist < nregion; ilist++) + domain->regions[list[ilist]]->write_restart(fp); +} + +/* ---------------------------------------------------------------------- + region reads its previous position/angle + needed by fix/wall/gran/region to compute velocity by differencing scheme +------------------------------------------------------------------------- */ + +int RegIntersect::restart(char *buf, int n) +{ + for (int ilist = 0; ilist < nregion; ilist++) + n = domain->regions[list[ilist]]->restart(buf, n); + return n; +} + +/* ---------------------------------------------------------------------- + set prev vector to zero +------------------------------------------------------------------------- */ + +void RegIntersect::reset_vel() +{ + for (int ilist = 0; ilist < nregion; ilist++) + domain->regions[list[ilist]]->reset_vel(); +} + diff --git a/src/region_intersect.h b/src/region_intersect.h index 71399fb251..546baac265 100644 --- a/src/region_intersect.h +++ b/src/region_intersect.h @@ -34,10 +34,12 @@ class RegIntersect : public Region { int surface_exterior(double *, double); void shape_update(); void pretransform(); + void set_velocity(); + void write_restart(FILE *); + int restart(char *, int); + void reset_vel(); private: - int nregion; - int *list; char **idsub; }; diff --git a/src/region_plane.cpp b/src/region_plane.cpp index 38d5b92bcb..3c945eb553 100644 --- a/src/region_plane.cpp +++ b/src/region_plane.cpp @@ -45,9 +45,9 @@ RegPlane::RegPlane(LAMMPS *lmp, int narg, char **arg) : // plane has no bounding box bboxflag = 0; - cmax = 1; contact = new Contact[cmax]; + tmax = 1; } /* ---------------------------------------------------------------------- */ @@ -85,6 +85,8 @@ int RegPlane::surface_interior(double *x, double cutoff) contact[0].delx = dot*normal[0]; contact[0].dely = dot*normal[1]; contact[0].delz = dot*normal[2]; + contact[0].radius = 0; + contact[0].iwall = 0; return 1; } return 0; @@ -105,6 +107,8 @@ int RegPlane::surface_exterior(double *x, double cutoff) contact[0].delx = -dot*normal[0]; contact[0].dely = -dot*normal[1]; contact[0].delz = -dot*normal[2]; + contact[0].radius = 0; + contact[0].iwall = 0; return 1; } return 0; diff --git a/src/region_prism.cpp b/src/region_prism.cpp index 1efd3d964b..b8b7b30368 100644 --- a/src/region_prism.cpp +++ b/src/region_prism.cpp @@ -21,6 +21,7 @@ #include "region_prism.h" #include "domain.h" #include "force.h" +#include "math_extra.h" #include "error.h" using namespace LAMMPS_NS; @@ -116,10 +117,13 @@ RegPrism::RegPrism(LAMMPS *lmp, int narg, char **arg) : Region(lmp, narg, arg) extent_zhi = zhi; } else bboxflag = 0; - // particle could contact all 6 planes + // particle could be close to all 6 planes + // particle can only touch 3 planes cmax = 6; contact = new Contact[cmax]; + if (interior) tmax = 3; + else tmax = 1; // h = transformation matrix from tilt coords (0-1) to box coords (xyz) // columns of h are edge vectors of tilted box @@ -191,14 +195,28 @@ RegPrism::RegPrism(LAMMPS *lmp, int narg, char **arg) : Region(lmp, narg, arg) // face = 6 inward-facing unit normals to prism faces // order = xy plane, xz plane, yz plane - cross(a,b,face[0]); - cross(b,a,face[1]); - cross(c,a,face[2]); - cross(a,c,face[3]); - cross(b,c,face[4]); - cross(c,b,face[5]); + MathExtra::cross3(a,b,face[0]); + MathExtra::cross3(b,a,face[1]); + MathExtra::cross3(c,a,face[2]); + MathExtra::cross3(a,c,face[3]); + MathExtra::cross3(b,c,face[4]); + MathExtra::cross3(c,b,face[5]); - for (int i = 0; i < 6; i++) normalize(face[i]); + // remap open face indices to be consistent + + if (openflag) { + int temp[6]; + for (int i = 0; i < 6; i++) + temp[i] = open_faces[i]; + open_faces[0] = temp[4]; + open_faces[1] = temp[5]; + open_faces[2] = temp[2]; + open_faces[3] = temp[3]; + open_faces[4] = temp[0]; + open_faces[5] = temp[1]; + } + + for (int i = 0; i < 6; i++) MathExtra::norm3(face[i]); // tri = 3 vertices (0-7) in each of 12 triangles on 6 faces // verts in each tri are ordered so that right-hand rule gives inward norm @@ -275,7 +293,8 @@ int RegPrism::surface_interior(double *x, double cutoff) int n = 0; - for (int i = 0; i < 6; i++) { + for (i = 0; i < 6; i++) { + if (open_faces[i]) continue; if (i % 2) corner = chi; else corner = clo; dot = (x[0]-corner[0])*face[i][0] + (x[1]-corner[1])*face[i][1] + @@ -285,6 +304,8 @@ int RegPrism::surface_interior(double *x, double cutoff) contact[n].delx = dot*face[i][0]; contact[n].dely = dot*face[i][1]; contact[n].delz = dot*face[i][2]; + contact[n].radius = 0; + contact[n].iwall = i; n++; } } @@ -334,6 +355,8 @@ int RegPrism::surface_exterior(double *x, double cutoff) find_nearest(x,xp,yp,zp); add_contact(0,x,xp,yp,zp); + contact[0].radius = 0; + contact[0].iwall = 0; if (contact[0].r < cutoff) return 1; return 0; } @@ -361,6 +384,7 @@ void RegPrism::find_nearest(double *x, double &xp, double &yp, double &zp) for (int itri = 0; itri < 12; itri++) { iface = itri/2; + if (open_faces[iface]) continue; i = tri[itri][0]; j = tri[itri][1]; k = tri[itri][2]; @@ -370,8 +394,9 @@ void RegPrism::find_nearest(double *x, double &xp, double &yp, double &zp) xproj[0] = x[0] - dot*face[iface][0]; xproj[1] = x[1] - dot*face[iface][1]; xproj[2] = x[2] - dot*face[iface][2]; - if (inside_tri(xproj,corners[i],corners[j],corners[k],face[iface])) + if (inside_tri(xproj,corners[i],corners[j],corners[k],face[iface])){ distsq = closest(x,xproj,nearest,distsq); + } else { point_on_line_segment(corners[i],corners[j],xproj,xline); distsq = closest(x,xline,nearest,distsq); @@ -401,57 +426,24 @@ int RegPrism::inside_tri(double *x, double *v1, double *v2, double *v3, { double edge[3],pvec[3],xproduct[3]; - subtract(v1,v2,edge); - subtract(v1,x,pvec); - cross(edge,pvec,xproduct); - if (dotproduct(xproduct,norm) < 0.0) return 0; + MathExtra::sub3(v2,v1,edge); + MathExtra::sub3(x,v1,pvec); + MathExtra::cross3(edge,pvec,xproduct); + if (MathExtra::dot3(xproduct,norm) < 0.0) return 0; - subtract(v2,v3,edge); - subtract(v2,x,pvec); - cross(edge,pvec,xproduct); - if (dotproduct(xproduct,norm) < 0.0) return 0; + MathExtra::sub3(v3,v2,edge); + MathExtra::sub3(x,v2,pvec); + MathExtra::cross3(edge,pvec,xproduct); + if (MathExtra::dot3(xproduct,norm) < 0.0) return 0; - subtract(v3,v1,edge); - subtract(v3,x,pvec); - cross(edge,pvec,xproduct); - if (dotproduct(xproduct,norm) < 0.0) return 0; + MathExtra::sub3(v1,v3,edge); + MathExtra::sub3(x,v3,pvec); + MathExtra::cross3(edge,pvec,xproduct); + if (MathExtra::dot3(xproduct,norm) < 0.0) return 0; return 1; } -/* ---------------------------------------------------------------------- - find nearest point to C on line segment A,B and return it as D - project (C-A) onto (B-A) - t = length of that projection, normalized by length of (B-A) - t <= 0, C is closest to A - t >= 1, C is closest to B - else closest point is between A and B -------------------------------------------------------------------------- */ - -void RegPrism::point_on_line_segment(double *a, double *b, - double *c, double *d) -{ - double ba[3],ca[3]; - - subtract(a,b,ba); - subtract(a,c,ca); - double t = dotproduct(ca,ba) / dotproduct(ba,ba); - - if (t <= 0.0) { - d[0] = a[0]; - d[1] = a[1]; - d[2] = a[2]; - } else if (t >= 1.0) { - d[0] = b[0]; - d[1] = b[1]; - d[2] = b[2]; - } else { - d[0] = a[0] + t*ba[0]; - d[1] = a[1] + t*ba[1]; - d[2] = a[2] + t*ba[2]; - } -} - /* ---------------------------------------------------------------------- */ double RegPrism::closest(double *x, double *near, double *nearest, double dsq) @@ -467,44 +459,3 @@ double RegPrism::closest(double *x, double *near, double *nearest, double dsq) nearest[2] = near[2]; return rsq; } - -/* ---------------------------------------------------------------------- - v3 = v2 - v1 -------------------------------------------------------------------------- */ - -void RegPrism::subtract(double *v1, double *v2, double *v3) -{ - v3[0] = v2[0] - v1[0]; - v3[1] = v2[1] - v1[1]; - v3[2] = v2[2] - v1[2]; -} - -/* ---------------------------------------------------------------------- - v3 = v1 x v2 -------------------------------------------------------------------------- */ - -void RegPrism::cross(double *v1, double *v2, double *v3) -{ - v3[0] = v1[1]*v2[2] - v1[2]*v2[1]; - v3[1] = v1[2]*v2[0] - v1[0]*v2[2]; - v3[2] = v1[0]*v2[1] - v1[1]*v2[0]; -} - -/* ---------------------------------------------------------------------- - return dotproduct = v1 dot v2 -------------------------------------------------------------------------- */ - -double RegPrism::dotproduct(double *v1, double *v2) -{ - return (v1[0]*v2[0] + v1[1]*v2[1] + v1[2]*v2[2]); -} - -/* ---------------------------------------------------------------------- */ - -void RegPrism::normalize(double *x) -{ - double invlen = 1.0/sqrt(x[0]*x[0] + x[1]*x[1] + x[2]*x[2]); - x[0] *= invlen; - x[1] *= invlen; - x[2] *= invlen; -} diff --git a/src/region_prism.h b/src/region_prism.h index fefe20ce80..4b518def74 100644 --- a/src/region_prism.h +++ b/src/region_prism.h @@ -47,13 +47,7 @@ class RegPrism : public Region { void find_nearest(double *, double &, double &, double &); int inside_tri(double *, double *, double *, double *, double *); - void point_on_line_segment(double *, double *, double *, double *); double closest(double *, double *, double *, double); - - void subtract(double *, double *, double *); - void cross(double *, double *, double *); - double dotproduct(double *, double *); - void normalize(double *); }; } diff --git a/src/region_sphere.cpp b/src/region_sphere.cpp index 409a497f11..2f51baacc4 100644 --- a/src/region_sphere.cpp +++ b/src/region_sphere.cpp @@ -70,6 +70,7 @@ RegSphere::RegSphere(LAMMPS *lmp, int narg, char **arg) : cmax = 1; contact = new Contact[cmax]; + tmax = 1; } /* ---------------------------------------------------------------------- */ @@ -125,6 +126,9 @@ int RegSphere::surface_interior(double *x, double cutoff) contact[0].delx = delx*(1.0-radius/r); contact[0].dely = dely*(1.0-radius/r); contact[0].delz = delz*(1.0-radius/r); + contact[0].radius = -radius; + contact[0].iwall = 0; + contact[0].varflag = 1; return 1; } return 0; @@ -150,6 +154,9 @@ int RegSphere::surface_exterior(double *x, double cutoff) contact[0].delx = delx*(1.0-radius/r); contact[0].dely = dely*(1.0-radius/r); contact[0].delz = delz*(1.0-radius/r); + contact[0].radius = radius; + contact[0].iwall = 0; + contact[0].varflag = 1; return 1; } return 0; @@ -178,3 +185,42 @@ void RegSphere::variable_check() if (!input->variable->equalstyle(rvar)) error->all(FLERR,"Variable for region sphere is invalid style"); } + + +/* ---------------------------------------------------------------------- + Set values needed to calculate velocity due to shape changes. + These values do not depend on the contact, so this function is + called once per timestep by fix/wall/gran/region. + +------------------------------------------------------------------------- */ + +void RegSphere::set_velocity_shape() +{ + xcenter[0] = xc; + xcenter[1] = yc; + xcenter[2] = zc; + forward_transform(xcenter[0], xcenter[1], xcenter[2]); + if (update->ntimestep > 0) rprev = prev[4]; + else rprev = radius; + prev[4] = radius; +} + + + +/* ---------------------------------------------------------------------- + add velocity due to shape change to wall velocity +------------------------------------------------------------------------- */ + +void RegSphere::velocity_contact_shape(double *vwall, double *xc) +{ + double delx, dely, delz; // Displacement of contact point in x,y,z + + delx = (xc[0] - xcenter[0])*(1 - rprev/radius); + dely = (xc[1] - xcenter[1])*(1 - rprev/radius); + delz = (xc[2] - xcenter[2])*(1 - rprev/radius); + + vwall[0] += delx/update->dt; + vwall[1] += dely/update->dt; + vwall[2] += delz/update->dt; +} + diff --git a/src/region_sphere.h b/src/region_sphere.h index 283493fb33..9e1fb4e739 100644 --- a/src/region_sphere.h +++ b/src/region_sphere.h @@ -33,6 +33,9 @@ class RegSphere : public Region { int surface_interior(double *, double); int surface_exterior(double *, double); void shape_update(); + void set_velocity_shape(); + void velocity_contact_shape(double *, double *); + private: double xc,yc,zc; diff --git a/src/region_union.cpp b/src/region_union.cpp index 2772d7b4d5..b516af98d0 100644 --- a/src/region_union.cpp +++ b/src/region_union.cpp @@ -44,7 +44,7 @@ RegUnion::RegUnion(LAMMPS *lmp, int narg, char **arg) : Region(lmp, narg, arg) idsub[nregion] = new char[m]; strcpy(idsub[nregion],arg[iarg+3]); iregion = domain->find_region(idsub[nregion]); - if (iregion == -1) + if (iregion == -1) error->all(FLERR,"Region union region ID does not exist"); list[nregion++] = iregion; } @@ -55,6 +55,8 @@ RegUnion::RegUnion(LAMMPS *lmp, int narg, char **arg) : Region(lmp, narg, arg) for (int ilist = 0; ilist < nregion; ilist++) { if (regions[list[ilist]]->varshape) varshape = 1; if (regions[list[ilist]]->dynamic) dynamic = 1; + if (regions[list[ilist]]->moveflag) moveflag = 1; + if (regions[list[ilist]]->rotateflag) rotateflag = 1; } // extent of union of regions @@ -80,11 +82,21 @@ RegUnion::RegUnion(LAMMPS *lmp, int narg, char **arg) : Region(lmp, narg, arg) } // possible contacts = sum of possible contacts in all sub-regions + // for near contacts and touching contacts cmax = 0; - for (int ilist = 0; ilist < nregion; ilist++) + size_restart = 0; + for (int ilist = 0; ilist < nregion; ilist++){ cmax += regions[list[ilist]]->cmax; + size_restart += regions[list[ilist]]->size_restart; + } contact = new Contact[cmax]; + + tmax = 0; + for (int ilist = 0; ilist < nregion; ilist++) { + if (interior) tmax += regions[list[ilist]]->tmax; + else tmax++; + } } /* ---------------------------------------------------------------------- */ @@ -109,7 +121,7 @@ void RegUnion::init() int iregion; for (int ilist = 0; ilist < nregion; ilist++) { iregion = domain->find_region(idsub[ilist]); - if (iregion == -1) + if (iregion == -1) error->all(FLERR,"Region union region ID does not exist"); list[ilist] = iregion; } @@ -151,6 +163,7 @@ int RegUnion::surface_interior(double *x, double cutoff) Region **regions = domain->regions; int n = 0; + int walloffset = 0 ; for (ilist = 0; ilist < nregion; ilist++) { iregion = list[ilist]; ncontacts = regions[iregion]->surface(x[0],x[1],x[2],cutoff); @@ -161,16 +174,23 @@ int RegUnion::surface_interior(double *x, double cutoff) for (jlist = 0; jlist < nregion; jlist++) { if (jlist == ilist) continue; jregion = list[jlist]; - if (regions[jregion]->match(xs,ys,zs)) break; + if (regions[jregion]->match(xs,ys,zs) && + !regions[jregion]->openflag) break; } if (jlist == nregion) { contact[n].r = regions[iregion]->contact[m].r; + contact[n].radius = regions[iregion]->contact[m].radius; contact[n].delx = regions[iregion]->contact[m].delx; contact[n].dely = regions[iregion]->contact[m].dely; contact[n].delz = regions[iregion]->contact[m].delz; + contact[n].iwall = regions[iregion]->contact[m].iwall + walloffset; + contact[n].varflag = regions[iregion]->contact[m].varflag; n++; } } + // increment by cmax instead of tmax to insure + // possible wall IDs for sub-regions are non overlapping + walloffset += regions[iregion]->cmax; } return n; @@ -210,9 +230,12 @@ int RegUnion::surface_exterior(double *x, double cutoff) } if (jlist == nregion) { contact[n].r = regions[iregion]->contact[m].r; + contact[n].radius = regions[iregion]->contact[m].radius; contact[n].delx = regions[iregion]->contact[m].delx; contact[n].dely = regions[iregion]->contact[m].dely; contact[n].delz = regions[iregion]->contact[m].delz; + contact[n].iwall = ilist; + contact[n].r = regions[iregion]->contact[m].varflag; n++; } } @@ -245,3 +268,46 @@ void RegUnion::pretransform() for (int ilist = 0; ilist < nregion; ilist++) regions[list[ilist]]->pretransform(); } + +/* ---------------------------------------------------------------------- + get translational/angular velocities of all subregions +------------------------------------------------------------------------- */ + +void RegUnion::set_velocity() +{ + Region **regions = domain->regions; + for (int ilist = 0; ilist < nregion; ilist++) + regions[list[ilist]]->set_velocity(); +} +/* ---------------------------------------------------------------------- + region writes its current position/angle + needed by fix/wall/gran/region to compute velocity by differencing scheme +------------------------------------------------------------------------- */ + +void RegUnion::write_restart(FILE *fp) +{ + for (int ilist = 0; ilist < nregion; ilist++) + domain->regions[list[ilist]]->write_restart(fp); +} + +/* ---------------------------------------------------------------------- + region reads its previous position/angle + needed by fix/wall/gran/region to compute velocity by differencing scheme +------------------------------------------------------------------------- */ + +int RegUnion::restart(char *buf, int n) +{ + for (int ilist = 0; ilist < nregion; ilist++) + n = domain->regions[list[ilist]]->restart(buf, n); + return n; +} + +/* ---------------------------------------------------------------------- + set prev vector to zero +------------------------------------------------------------------------- */ + +void RegUnion::reset_vel() +{ + for (int ilist = 0; ilist < nregion; ilist++) + domain->regions[list[ilist]]->reset_vel(); +} diff --git a/src/region_union.h b/src/region_union.h index 7cc32b3ed8..091688d66e 100644 --- a/src/region_union.h +++ b/src/region_union.h @@ -34,10 +34,12 @@ class RegUnion : public Region { int surface_exterior(double *, double); void shape_update(); void pretransform(); + void set_velocity(); + void write_restart(FILE *); + int restart(char *, int); + void reset_vel(); private: - int nregion; - int *list; char **idsub; }; diff --git a/src/special.cpp b/src/special.cpp index ae566ec4f5..c4de11e09c 100644 --- a/src/special.cpp +++ b/src/special.cpp @@ -23,6 +23,7 @@ #include "accelerator_kokkos.h" #include "memory.h" #include "error.h" +#include "atom_masks.h" using namespace LAMMPS_NS; @@ -588,8 +589,12 @@ void Special::combine() if (lmp->kokkos) { AtomKokkos* atomKK = (AtomKokkos*) atom; + atomKK->modified(Host,SPECIAL_MASK); + atomKK->sync(Device,SPECIAL_MASK); memory->grow_kokkos(atomKK->k_special,atom->special, atom->nmax,atom->maxspecial,"atom:special"); + atomKK->modified(Device,SPECIAL_MASK); + atomKK->sync(Host,SPECIAL_MASK); } else { memory->destroy(atom->special); memory->create(atom->special,atom->nmax,atom->maxspecial,"atom:special"); diff --git a/src/version.h b/src/version.h index 7f68648837..e24bd29bf3 100644 --- a/src/version.h +++ b/src/version.h @@ -1 +1 @@ -#define LAMMPS_VERSION "5 Oct 2016" +#define LAMMPS_VERSION "6 Oct 2016"