new fix wall/gran/region command, REBO bug fix, new example log files

This commit is contained in:
Steve Plimpton
2016-10-06 15:47:41 -06:00
parent c213457550
commit b3d2fb91bb
63 changed files with 6354 additions and 490 deletions

BIN
doc/src/JPG/gran_funnel.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 117 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

BIN
doc/src/JPG/gran_mixer.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 224 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

@ -1,7 +1,7 @@
<!-- HTML_ONLY -->
<HEAD>
<TITLE>LAMMPS Users Manual</TITLE>
<META NAME="docnumber" CONTENT="5 Oct 2016 version">
<META NAME="docnumber" CONTENT="6 Oct 2016 version">
<META NAME="author" CONTENT="http://lammps.sandia.gov - Sandia National Laboratories">
<META NAME="copyright" CONTENT="Copyright (2003) Sandia Corporation. This software and manual is distributed under the GNU General Public License.">
</HEAD>
@ -21,7 +21,7 @@
<H1></H1>
LAMMPS Documentation :c,h3
5 Oct 2016 version :c,h4
6 Oct 2016 version :c,h4
Version info: :h4

View File

@ -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,

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -12,7 +12,8 @@
------------------------------------------------------------------------- */
/* ----------------------------------------------------------------------
Contributing authors: Leo Silbert (SNL), Gary Grest (SNL)
Contributing authors: Leo Silbert (SNL), Gary Grest (SNL),
Dan Bolintineanu (SNL)
------------------------------------------------------------------------- */
#include <math.h>
@ -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<int> (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;
}
/* ---------------------------------------------------------------------- */

View File

@ -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
};
}

View File

@ -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<int> (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(&region->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;
}

View File

@ -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.
*/

View File

@ -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)

View File

@ -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;

View File

@ -44,6 +44,7 @@ template<class DeviceType>
FixLangevinKokkos<DeviceType>::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;

View File

@ -55,6 +55,7 @@ enum{ISO,ANISO,TRICLINIC};
template<class DeviceType>
FixNHKokkos<DeviceType>::FixNHKokkos(LAMMPS *lmp, int narg, char **arg) : FixNH(lmp, narg, arg)
{
kokkosable = 1;
domainKK = (DomainKokkos *) domain;
execution_space = ExecutionSpaceFromDevice<DeviceType>::space;

View File

@ -25,6 +25,7 @@ template<class DeviceType>
FixNPHKokkos<DeviceType>::FixNPHKokkos(LAMMPS *lmp, int narg, char **arg) :
FixNHKokkos<DeviceType>(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)

View File

@ -25,6 +25,7 @@ template<class DeviceType>
FixNPTKokkos<DeviceType>::FixNPTKokkos(LAMMPS *lmp, int narg, char **arg) :
FixNHKokkos<DeviceType>(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)

View File

@ -30,6 +30,7 @@ template<class DeviceType>
FixNVEKokkos<DeviceType>::FixNVEKokkos(LAMMPS *lmp, int narg, char **arg) :
FixNVE(lmp, narg, arg)
{
kokkosable = 1;
atomKK = (AtomKokkos *) atom;
execution_space = ExecutionSpaceFromDevice<DeviceType>::space;

View File

@ -26,6 +26,7 @@ template<class DeviceType>
FixNVTKokkos<DeviceType>::FixNVTKokkos(LAMMPS *lmp, int narg, char **arg) :
FixNHKokkos<DeviceType>(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)

View File

@ -53,6 +53,7 @@ template<class DeviceType>
FixQEqReaxKokkos<DeviceType>::FixQEqReaxKokkos(LAMMPS *lmp, int narg, char **arg) :
FixQEqReax(lmp, narg, arg)
{
kokkosable = 1;
atomKK = (AtomKokkos *) atom;
execution_space = ExecutionSpaceFromDevice<DeviceType>::space;

View File

@ -38,6 +38,7 @@ template<class DeviceType>
FixSetForceKokkos<DeviceType>::FixSetForceKokkos(LAMMPS *lmp, int narg, char **arg) :
FixSetForce(lmp, narg, arg)
{
kokkosable = 1;
atomKK = (AtomKokkos *) atom;
execution_space = ExecutionSpaceFromDevice<DeviceType>::space;
datamask_read = EMPTY_MASK;

View File

@ -40,6 +40,7 @@ template<class DeviceType>
FixWallReflectKokkos<DeviceType>::FixWallReflectKokkos(LAMMPS *lmp, int narg, char **arg) :
FixWallReflect(lmp, narg, arg)
{
kokkosable = 1;
atomKK = (AtomKokkos *) atom;
execution_space = ExecutionSpaceFromDevice<DeviceType>::space;
datamask_read = X_MASK | V_MASK | MASK_MASK;

View File

@ -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");

View File

@ -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();

View File

@ -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);

View File

@ -589,6 +589,11 @@ void NeighborKokkos::build_topology_kokkos() {
k_dihedrallist = neighbond_device.k_dihedrallist;
k_improperlist = neighbond_device.k_improperlist;
k_bondlist.sync<LMPDeviceType>();
k_anglelist.sync<LMPDeviceType>();
k_dihedrallist.sync<LMPDeviceType>();
k_improperlist.sync<LMPDeviceType>();
k_bondlist.modify<LMPDeviceType>();
k_anglelist.modify<LMPDeviceType>();
k_dihedrallist.modify<LMPDeviceType>();
@ -601,6 +606,11 @@ void NeighborKokkos::build_topology_kokkos() {
k_dihedrallist = neighbond_host.k_dihedrallist;
k_improperlist = neighbond_host.k_improperlist;
k_bondlist.sync<LMPHostType>();
k_anglelist.sync<LMPHostType>();
k_dihedrallist.sync<LMPHostType>();
k_improperlist.sync<LMPHostType>();
k_bondlist.modify<LMPHostType>();
k_anglelist.modify<LMPHostType>();
k_dihedrallist.modify<LMPHostType>();

View File

@ -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<DAT::t_f_array,DAT::t_f_array>(atomKK->k_f.d_view,f_merge_copy));
atomKK->k_f.modified_host() = 0; // special case
atomKK->k_f.modify<LMPDeviceType>();
}
@ -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<LMPHostType>());
atomKK->modified(Host,F_MASK);
memset_kokkos(atomKK->k_f.view<LMPHostType>());
atomKK->modified(Host,F_MASK);
atomKK->sync(Device,F_MASK);
} else {
memset_kokkos(atomKK->k_f.view<LMPDeviceType>());
atomKK->modified(Device,F_MASK);

View File

@ -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;

View File

@ -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];

View File

@ -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;
}

View File

@ -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 {

View File

@ -101,6 +101,7 @@ id(NULL), style(NULL), eatom(NULL), vatom(NULL)
datamask_read = ALL_MASK;
datamask_modify = ALL_MASK;
kokkosable = 0;
copymode = 0;
}

View File

@ -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;

View File

@ -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;
}

View File

@ -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

View File

@ -14,9 +14,10 @@
#include <stdlib.h>
#include <string.h>
#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;
}

View File

@ -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);
};
}

View File

@ -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]);
}

View File

@ -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 *);
};
}

View File

@ -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]);
}

View File

@ -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;

View File

@ -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();
}

View File

@ -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;
};

View File

@ -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;

View File

@ -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;
}

View File

@ -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 *);
};
}

View File

@ -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;
}

View File

@ -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;

View File

@ -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();
}

View File

@ -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;
};

View File

@ -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");

View File

@ -1 +1 @@
#define LAMMPS_VERSION "5 Oct 2016"
#define LAMMPS_VERSION "6 Oct 2016"