diff --git a/doc/src/JPG/gran_funnel.png b/doc/src/JPG/gran_funnel.png
new file mode 100644
index 0000000000..8e26005f78
Binary files /dev/null and b/doc/src/JPG/gran_funnel.png differ
diff --git a/doc/src/JPG/gran_funnel_small.jpg b/doc/src/JPG/gran_funnel_small.jpg
new file mode 100644
index 0000000000..6e29803388
Binary files /dev/null and b/doc/src/JPG/gran_funnel_small.jpg differ
diff --git a/doc/src/JPG/gran_mixer.png b/doc/src/JPG/gran_mixer.png
new file mode 100644
index 0000000000..6ea7221241
Binary files /dev/null and b/doc/src/JPG/gran_mixer.png differ
diff --git a/doc/src/JPG/gran_mixer_small.jpg b/doc/src/JPG/gran_mixer_small.jpg
new file mode 100644
index 0000000000..7cc85d92bf
Binary files /dev/null and b/doc/src/JPG/gran_mixer_small.jpg differ
diff --git a/doc/src/Manual.txt b/doc/src/Manual.txt
index 10487375f9..21cc9bcccc 100644
--- a/doc/src/Manual.txt
+++ b/doc/src/Manual.txt
@@ -1,7 +1,7 @@
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"