# no softening behavior of cpm in tension test

hello everyone,

I am trying to calibrate the concrete by using cpm. But I find that no matter how I adjust the parameters (eg, epsCrackOnset, relductility), the uniaxial tension test in model always have a linear elastic state and then followed by a sharp drop in stress-strain diagram, the tangent of the stress decrease is almost 90 degree. But in experiment data, there should be a softening part after the peak stress. The model seems so too 'brittle'. Is it because of the interaction enlarge factor? I took 1.5 as recommended.

I try to reduce the factor to 1.1, 1.05,etc and the model start to have softening behavior but the elastic modulus has a huge decrease from 180 to 50 MPa. and I have to increase the young's to a very large value in order to match the elastic modulus, but then I found excessive long hardening curve before the peak, which should be there. Any advice or thoughts is welcomed! (the code attach below may take 2-3hr to finish at current strainrate). Thanks!!!

#######

###############get dense pack of particles#

from yade import pack,plot

# The following 5 lines will be used later for batch execution

nRead=readParam

num_spheres=

compFricDegree = 30, # contact friction during the confining phase

key='_

unknownOk=True

)

from yade.params import table

num_spheres=

key=table.key

targetPorosity = 0.55 #the porosity we want for the packing

compFricDegree = table.compFricD

finalFricDegree = 30 # contact friction during the deviatoric loading

rate=-0.02 # loading rate (strain rate)

damp=0.2 # damping coefficient

stabilityThresh

young=5e6 # contact stiffness

mn,mx=Vector3(

O.switchScene(

## create materials for spheres and plates

O.materials.

O.materials.

## create walls around the packing

walls=aabbWalls

wallIds=

## use a SpherePack object to generate a random loose particles packing

sp=pack.

sp.makeCloud(

spp=O.bodies.

for s in spp:

O.bodies[

triax=TriaxialS

## TriaxialStressC

## this control of boundary conditions was used for instance in http://

maxMultiplier=

finalMaxMultip

thickness = 0,

## switch stress/strain control using a bitmask. What is a bitmask, huh?!

## Say x=1 if stess is controlled on x, else x=0. Same for for y and z, which are 1 or 0.

## Then an integer uniquely defining the combination of all these tests is: mask = x*1 + y*2 + z*4

## to put it differently, the mask is the integer whose binary representation is xyz, i.e.

## "100" (1) means "x", "110" (3) means "x and y", "111" (7) means "x and y and z", etc.

stressMask = 7,

internalCompac

)

newton=

O.engines=[

ForceResetter(),

InsertionSortC

InteractionLoop(

[Ig2_

[Ip2_

[Law2_

),

## We will use the global stiffness of each body to determine an optimal timestep (see https:/

GlobalStiffnes

triax,

TriaxialStateR

newton

]

#the value of (isotropic) confining stress defines the target stress to be applied in all three directions

triax.goal1=

triax.goal2=0

while 1:

O.run(1000, True)

##the global unbalanced force on dynamic bodies, thus excluding boundaries, which are not at equilibrium

unb=unbalance

print ('unbalanced force:',unb,' mean stress: ',triax.meanStress)

if unb<stabilityTh

break

sp=SpherePack(); sp.fromSimulation()

print ("### Isotropic state saved ###")

O.switchScene()

##define parameters

readParamsFromT

from yade.params.table import *

import numpy as np

from yade import pack,plot

isoPrestress=0

poisson= 0.1

pred=pack.

idConcrete=

cement=

#######

###obtain the information of the model

volume = 0

NumOfParticle = 0

for i in cement:

volume += pi * (O.bodies[

NumOfParticle += 1

print(f'density = {volume/(.05*.3)}')

print(f'number of particle = {NumOfParticle}')

bb=uniaxialTest

negIds,

O.engines=[

ForceResetter(),

InsertionSort

Bo1_

##

InteractionLoop(

[Ig2_

Ig2_

[Ip2_

[Law2_

),

GlobalStiffne

NewtonIntegra

CpmStateUpdat

UniaxialStrai

#PyRunner(

PyRunner(

PyRunner(

#qt.SnapshotE

#PyRunner(

]

#sigma=

O.step() ## go one step to creat interactions

bo1s.aabbEnlarg

ig2ss.interacti

### reinforcing the boundary

dim=utils.

if strainRateTensi

layerSize=1/6

height=

for b in O.bodies:

if isinstance(

if (b.state.

for i in O.interactions:

if isinstance(

if O.bodies[

def stopIfDamaged():

if O.iter<2 or 'sigma' not in plot.data : return

epsilon = plot.data['eps']

sigma=

extremum=

##Gf calculator

global Gf

if abs(sigma[

Gf += 0.5*(sigma[

##elastic modulus calculator

up=round(

down=

elasticModulus = (sigma[

if abs(sigma[

O.pause()

def addPlotData():

plot.

plot.plots=

plot.plot()

O.saveTmp()

O.run()

waitIfBatch()

## Question information

- Language:
- English Edit question

- Status:
- Answered

- For:
- Yade Edit question

- Assignee:
- No assignee Edit question

- Last query:

- Last reply:

## Can you help with this problem?

Provide an answer of your own, or ask Zhoufeng Shi for more information if necessary.