Some fundamental questions about the Brazil Splitting Test example file.
Hello everyone, I have some fundamental questions regarding the Brazil Splitting Test example file[1]. I made some minor modifications on the basis of the source code (without altering the main code). Although the code runs, I have some uncertainties regarding the details. I would greatly appreciate any assistance in addressing these questions.
1. Regarding the cohesive state of particles in the CPM material, is it accurate to say that all contacting particles form cohesive connections? In the engine section, the aabbEnlargeFactor and interactionDete
2. When configuring the material, I specified that once a cohesive connection is broken, it cannot be reestablished. Therefore, I would like to know the time and location of each cohesive bond breakage. How can I obtain this information? Additionally, how can I visualize the positions of these cracks using VTK? I attempted to use parameters like currentinteraction or currentCohesiveBond to determine the number of cracks, but it seems ineffective. Firstly, I assumed their values should be consistent, but in reality, they are not entirely the same. Secondly, as the simulation progresses, they do not seem to decrease and sometimes even increase, which appears illogical.
3. In this model, all initial particles are in blue, and as loading progresses, some particles turn purple-red. What do these purple-red particles represent? Do they indicate the cumulative energy loss of all connecting bonds around them? It's worth noting that in some other simulations, spherical particles are colored and do not show changes in force. Is there a command controlling this variation?
4. When the simulation load reaches a certain point, the stopIfDamaged function halts the loading. However, when I remove this function, the model continues to load, and the specimen quickly explodes, deviating from real experimental conditions. I believe the specimen should fracture into several pieces, each composed of many particles, rather than dispersing almost evenly into particles with minimal connections. Additionally, in the Brazil Splitting Test, the fracture should initially appear at the center of the specimen. In the simulation, however, most initial fractures occur at the loading end. How should I modify the code to make the simulation more realistic?
Thank you in advance!
Below is the code:
-------
# -*- encoding=utf-8 -*-
from __future__ import print_function
from yade import plot, pack
import xlsxwriter
"""
A simple script of a Brazilian splitting test.
A cylinder with x axis form 0 to specimenLength.
Load in z direction by z-perpendicular walls.
Code strongly inspired by uniax.py
"""
# default parameters or from table
readParamsFromT
young=24e9,
poisson=.2,
)
from yade.params.table import *
# material
concreteId = O.materials.append(
CpmMat(
)
)
# spheres
sp = pack.randomDens
)
sp.toSimulation()
# walls
zMin, zMax = [pt[2] for pt in aabbExtrema()]
wallIDs = O.bodies.
walls = wallMin, wallMax = [O.bodies[i] for i in wallIDs]
v = strainRate * 2 * specimenRadius
wallMin.state.vel = (0, 0, +v)
wallMax.state.vel = (0, 0, -v)
timeStr = time.strftime(
outputDir = 'out_' + '_' + timeStr
nestedDir = 'VTK_'
if not os.path.
os.mkdir(
nestedDirPath = os.path.
if not os.path.
os.mkdir(
# engines
O.engines = [
),
]
# stop condition
def stopIfDamaged():
if O.iter < 1000: # do nothing at the beginning
return
fMax = max(plot.data["f"])
f = plot.data["f"][-1]
if f / fMax < .6:
print("Damaged, stopping.")
print("ft = ", max(plot.
O.pause()
# plot stuff
def addPlotData():
global t,i,dspl,stress
# forces of walls. f1 is "down", f2 is "up" (f1 needs to be negated for evlauation)
f1, f2 = [O.forces.f(i)[2] for i in wallIDs]
f1 *= -1
# average force
f = .5 * (f1 + f2)
# displacement (2 times each wall)
wall = O.bodies[
dspl = 2 * wall.state.
# stress (according to standard brazilian test evaluation formula)
stress = f / (pi * specimenRadius * specimenLength)
# store values
yade.plot.addData(
t=O.time,
i=O.iter,
dspl=dspl,
f1=f1,
f2=f2,
f=f,
)
#######
#######
ballnum=0
for b in O.bodies:
if isinstance(
ballnum=ballnum+1
print('
#currentCohesiv
#currentinterac
def cohesivenum():
global currentCohesive
currentCohesiv
currentinterac
for i in O.interactions:
if hasattr(
currentCohes
if isinstance(
currentinter
print(
print(
print(
# save data into *xlsx
t_list = []
dspl_list = []
stress_list = []
currentCohesive
currentinteract
def writeData():
# write data into lists
t_list.
dspl_list.
stress_
currentCohesiv
currentinterac
# write data into *xlsx
workbook = xlsxwriter.
worksheet = workbook.
format = workbook.
format.
worksheet.
headings = ['t','dspl'
worksheet.
worksheet.
worksheet.
worksheet.
worksheet.
worksheet.
workbook.close()
#######
#######
# plot dspl on x axis, stress on y1 axis and f,f1,f2 in y2 axis
plot.plots = {'dspl': ('stress', None, 'f1', 'f2', 'f')}
O.dt = 0.
O.step()
# to create initial contacts
# now reset the interaction radius and go ahead
ss2sc.interacti
is2aabb.
# time step
O.dt = dtSafety * PWaveTimeStep()
# run simulation
plot.plot()
#O.run()
-------
Thank you all,
Antonia
[1]https:/
Question information
- Language:
- English Edit question
- Status:
- Solved
- For:
- Ubuntu yade Edit question
- Assignee:
- No assignee Edit question
- Solved by:
- Antonia
- Solved:
- Last query:
- Last reply: