Difficulty using esys-particle for large-scale thrust fault model

Asked by Rubio Vaughan

Hi All,

I'm trying to use ESyS-Particle to model a large-scale thrust fault on the planet Mercury. I've set up a 2D simulation, with particles generated by gengeo. The model is 80 km wide and 10 km high. The fault is simulated as an inclined plane (or line in 2D) of broken bonds in the subsurface and is blind (i.e. it doesn't extend all the way to the surface of the model).

I'm using 3 scripts in total. The first one simply generates the particle assembly and writes it to a .geo file. The second script generates bonds between the particles, breaks the bonds along a line segment (the fault), tags the particles (for visualization) and writes it to another .geo file. The final script, which is shown below, loads the particle assembly with bonds, adds walls to the model, and moves the left wall incrementally to the right, in order to simulate compression.

I can make the model work using unit density and RotBondPrms with unrealistic bogus parameters and I can get it to display 'realistic' bulk rock behavior. However, when using the correct density and BrittleBeamPrms with realistic parameters for young's modulus, cohesion etc., the model has a tendency to become very unstable. Even when I decrease the time step to very small values (10e-9), I can't reproduce realistic bulk rock behavior.

I'm using the following base units:

1 length unit = 400 m
1 mass unig = 1 kg
1 time unit = 1 s

Could someone advise if I'm using ESys-Particle in the correct way? Can it be used for something large-scale like this in the first place? The third script, which executes the deformation, is pasted below. I would really appreciate any help you might be able to offer, I've been struggling with this for a long time.

Many thanks!
Rubio Vaughan

begin script:
--------------------------------------------------------------------------------
#thrust.py: Fault propagation fold simulation using ESyS-Particle
# Author: R. Vaughan
# Date: 11 January 2014
# Organisation: VU University Amsterdam
# (C) All rights reserved, 2014.
#
#
#import the appropriate ESyS-Particle modules:
from esys.lsm import *
from esys.lsm.util import *
from esys.lsm.geometry import *
from WallLoader import WallLoaderRunnable

scale = 400 # 1 model unit is 400 meters
maxRadius = 400 / scale
minRadius = 100 / scale
width = 80000 / scale # 80 km
height = 10000 / scale # 10 km
timeSteps = 100000
timeStepIncr = 1000
timeStepSize = 1.0000e-06

particleTag1 = 1
particleTag2 = 2
particleTagFault = 4

#instantiate a simulation object:
sim = LsmMpi (numWorkerProcesses = 1, mpiDimList = [1,1,1])

#initialise the neighbour search algorithm:
sim.initNeighbourSearch (
 particleType = "RotSphere",
 gridSpacing = 2.5 * maxRadius,
 verletDist = 0.2 * minRadius
)
sim.force2dComputations(True)

#set the number of timesteps and timestep increment:
sim.setNumTimeSteps (timeSteps)
sim.setTimeStepSize (timeStepSize)

#specify the spatial domain for the simulation
margin = height / 2
domain = BoundingBox(
 Vec3(-margin,-margin,0),
 Vec3(width+margin,height*3,0)
)
sim.setSpatialDomain (domain)

sim.readGeometry("geometry2.geo")

sim.setParticleDensity (
 tag = 1,
 mask = 0,
 Density = (scale^3) * 2800 / 0.83 # based on 2800 kg/m3, adjusted for scale and porosity
)

#create a wall at the bottom of the model:
sim.createWall (
 name = "bottom_wall",
 posn = Vec3(0.0, 0.0, 0.0),
 normal = Vec3(0.0, 1.0, 0.0)
)

#create a wall at the left side of the model:
sim.createWall (
 name = "left_wall",
 posn = Vec3(0.0, 0.0, 0.0),
 normal = Vec3(1.0, 0.0, 0.0)
)

#create a wall at the right side of the model:
sim.createWall (
 name = "right_wall",
 posn = Vec3(width, 0.0, 0.0),
 normal = Vec3(-1.0, 0.0, 0.0)
)

bond_param_brittle = BrittleBeamPrms(
 name="pp_bonds",
 youngsModulus=20.0e9 * scale, # 20 GPa, adjusted for scale
 poissonsRatio=0.25,
 cohesion=4.0e7 * scale, # 4 MPa, adjusted for scale
 tanAngle=0.577, # 30 degrees
 tag=1
)

pp_bonds = sim.createInteractionGroup (
 bond_param_brittle
)

# frictional interactions for regular particles
sim.createInteractionGroup (
 prms = FrictionPrms(
  name="friction",
  youngsModulus=20.0e9 * scale, # 20 GPa, adjusted for scale
  poissonsRatio=0.25,
  dynamicMu=0.4,
  staticMu=0.6
 )
)

#create an exclusion between bonded and frictional interactions:
sim.createExclusion (
 interactionName1 = "pp_bonds",
 interactionName2 = "friction"
)

# add gravity
sim.createInteractionGroup(
 GravityPrms(name="mercury-gravity", acceleration=Vec3(0,-3.7 / scale,0)) # Mercury's gravity acceleration, adjusted for scale
)

#add translational viscous damping:
sim.createInteractionGroup (
 LinDampingPrms(
  name="damping1",
  viscosity=0.1,
  maxIterations=50
 )
)

#add rotational viscous damping:
sim.createInteractionGroup (
 RotDampingPrms(
  name="damping2",
  viscosity=0.1,
  maxIterations=50
 )
)

#specify elastic repulsion from the bottom wall:
sim.createInteractionGroup (
 NRotElasticWallPrms (
  name = "bottom_wall_repel",
  wallName = "bottom_wall",
  normalK = 1.0e14 * scale
 )
)

sim.createInteractionGroup (
 NRotBondedWallPrms (
  name = "left_wall_bond",
  wallName = "left_wall",
  normalK = 1.0e14 * scale,
  particleTag = 1,
  tagMask = 0
 )
)

sim.createInteractionGroup (
 NRotElasticWallPrms (
  name = "left_wall_repel",
  wallName = "left_wall",
  normalK = 1.0e14 * scale
 )
)

sim.createInteractionGroup (
 NRotBondedWallPrms (
  name = "right_wall_bond",
  wallName = "right_wall",
  normalK = 1.0e14 * scale,
  particleTag = 1,
  tagMask = 0
 )
)

sim.createInteractionGroup (
 NRotElasticWallPrms (
  name = "right_wall_repel",
  wallName = "right_wall",
  normalK = 1.0e14 * scale
 )
)

#add a wall loader to move the left wall:
wall_loader_left = WallLoaderRunnable(
 LsmMpi = sim,
 wallName = "left_wall",
 vPlate = Vec3 (80000 / scale / timeStepSize, 0.0, 0.0),
 startTime = 0,
 rampTime = 1000
)
sim.addPreTimeStepRunnable (wall_loader_left)

#add a CheckPointer to save simulation data at regular intervals:
sim.createCheckPointer (
 CheckPointPrms (
  fileNamePrefix = "/home/rubio/esys-particle/thrust2D/checkpoints/checkpoint",
  beginTimeStep = 0,
  endTimeStep = timeSteps,
  timeStepIncr = timeStepIncr
 )
)

#execute the simulation:
sim.run()

--------------------------------------------------------------------------------

Question information

Language:
English Edit question
Status:
Answered
For:
ESyS-Particle Edit question
Assignee:
No assignee Edit question
Last query:
Last reply:
Revision history for this message
SteffenAbe (s-abe) said :
#1

Hi Rubio,

from a quick look over your scripts I've spotted one issue which might cause trouble: In your NRotElasticWallPrms you're using an extremely high stiffness, equivalent to 10000 GPa if I'm reading your script correctly.
Try if reducing this to a value similar to your bond stiffness (i.e. 20GPa) helps. If the problem persists, I'll have a closer look at the issue.

Steffen

Revision history for this message
Rubio Vaughan (rubio) said :
#2

Dear Steffen,

Thank you for your answer. You are right, the wall stiffness was very high, I had incorrectly assumed that walls can basically have 'infinite' stiffness. But of course this leads to problems with the force calculations.

I changed the wall stiffness to 20GPa and this does increase stability of the model, but only slightly. I still need to set the time step very small (1.0e-9, otherwise the model becomes very unstable and all bonds break in the beginning of the run. According to my calculations the time step shouldn't have to be that small. According to "dt < 0.1 sqrt(mass_min/k_max)", my dt should be around 7e-3. Any idea what might be causing this instability?

Regards
Rubio

Revision history for this message
SteffenAbe (s-abe) said :
#3

Hi Rubio

> According to "dt < 0.1 sqrt(mass_min/k_max)", my dt should be around 7e-3.
 I haven't done a stability calculation in 2D in a while but:
- The usual equation (Courant-Criterion) is dt < f*r_min/v_p where f is the "security factor", usually 0.2, r_min is the minimum particle radius and v_p is the p-wave velocity, i.e. v_p~sqrt(E/rho), where rho is the density and E the Young's modulus.
In your case I get (all values in model units, assuming scale=400): rho~2.15e11, E=8e12 -> v_p ~6 . With r_min=0.25 -> dt <8e-3
which is basically the same as your result.
So I'm not sure what the problem is in your model. Can you dump out the kinetic energy and send the result to me?
Alternatively, if your model isn't too large you could sent the script+geometry to me so I can re-run your simulation and try
 to figure out what is going wrong.

Steffen

Revision history for this message
Rubio Vaughan (rubio) said :
#4

Steffen,

Thanks again for your help. I had already created a spreadsheet to do the unit and stability calculation. I adjusted it slightly according to your input but I get the same magnitude of dt, now around 4e-3. However, when I run the model with dt = 3.0e-3 all bonds break right in the beginning and the particles vanish. Only the particles which were unbonded (the fault zone) remain. I have bundled everything in a tar.gz file.

https://dl.dropboxusercontent.com/u/38088776/esys-instability.tar.gz (about 13M)

Contents of the file:
geometry.py - Generates the particle geometry and writes it to geometry.geo
geometry.geo - generated by above script
thrust.py - reads geometry and performs deformation by using wall mover
calculate_units.ods - spreadsheet for unit and timestep calculation
checkpoints/* - checkpoint files for the first 30 timesteps

For testing purposes I have disabled the wall mover, ran the model for only 30 time steps and set it to write a checkpoint every single timestep. After only a few timesteps the particles start flying out of the model. A short animation is here:
https://dl.dropboxusercontent.com/u/38088776/thrust-instability.avi

One final note: I am running the latest daily version of esys-particle.

I really hope you can find what is causing the instability, I've tried so many things and don't really know what else I can try.

Many thanks
Rubio

Revision history for this message
SteffenAbe (s-abe) said :
#5

Hi Rubio,

looks like you may have triggered a bug in esys-particle. Looking at the checkpoint files it appears that the particle masses are much smaller than they should be at the given density - which would explain the instability.
I'll have to look though the code to see what's going on. I'll get back to you once I've found the problem.

Steffen

Revision history for this message
SteffenAbe (s-abe) said :
#6

Hi Rubio,

I'll have to take back my last comment - the issue with the too low particle masses doesn't originate from any bug in esys-particle,
it comes from the fact that the power operator in python isn't scale^3 - it is scale**3. However, even with this fixed an the correct density / particle mass set it still doesn't work.

Steffen

Revision history for this message
SteffenAbe (s-abe) said :
#7

Hi Rubio,

I think I nailed the problem. Turns out it was a bug in esys-particle after all - but in a slightly different part of the code then initially expected. The bug was that setDensity did only update particle mass, but not the rotational inertia of the particles.
The bug is fixed in the new trunk version (rev. 1124).

Steffen

Revision history for this message
Rubio Vaughan (rubio) said :
#8

Hi Steffen,

Thank you so much for all your efforts in figuring out this problem. And thanks also for catching the silly mistake with the power operator. I'm not that used to python...

I'll give the new version a try and will let you know how it turns out.

Cheers
Rubio

Revision history for this message
Rubio Vaughan (rubio) said :
#9

Steffen,

To try the new model I had to install from source, I had previously used the daily Ubuntu packages. After make install I had some libraries missing which I manually copied to /usr/lib:

libFoundation-2.3.so
libModel-2.3.so
libParallel.so.0
libGgGeometry-2.3.so
libppa-2.3.so

Perhaps others are missing too.

I tried the new version and it seems the problems with the bond instability are solved. However, I have now run into a new problem. I noticed that unbonded particles started falling through the floor of the model. To test this, I removed all bonds from the model and ran the simulation like that. The entire assembly (excluding the particles which are bonded to the left and right wall) falls through the floor. I even increased the floor stiffness up to 20e12 (or 20000 GPa) and they still fall through.

According to my calculations, this shouldn't be happening. The maximum pressure at the bottom of the rock column should be:

density * height * acceleration = 2800 * 10000 * 3.7 = 103.6 MPa

So the bottom wall stiffness of 20GPa should be enough to counter the column pressure right?

The test script + geometry is available here:
https://dl.dropboxusercontent.com/u/38088776/esys-floor-drop.tar.gz

Any ideas are very much appreciated.

Best regards
Rubio

Can you help with this problem?

Provide an answer of your own, or ask Rubio Vaughan for more information if necessary.

To post a message you must log in.