New question #688652 on Yade:
https://answers.launchpad.net/yade/+question/688652

I am currently trying to make the elastic calibration of the CpmMat model but 
the values of the computed poisson, based on the uniax.py code, are not 
changing even though I change in the CpmMat the values of 'young' and 
'poisson'. Below is my simulation code on yade 2019.1a:

###################################################

#!/usr/bin/python
# -*- coding: utf-8 -*-
from __future__ import division
from __future__ import print_function

from future import standard_library
standard_library.install_aliases()
from yade import plot,pack,timing
import time, sys, os, copy, numpy as np

savedir = './elastmat/'

# default parameters or from table
readParamsFromTable(
        young = 24e9,
        poisson = 0.8,

        #sigmaT=18e6,
        #frictionAngle=atan(0.8),
        epsCrackOnset=1e-5,
        relDuctility=0.1,

        intRadius=1.5,
        dtSafety=.4,
        damping=0.4,
        strainRateTension=.05,
        strainRateCompression=.5,
        setSpeeds=True,
        # 1=tension, 2=compression (ANDed; 3=both)
        doModes=1,

        specimenLength=.039850,
        specimenRadius=.019875,
        sphereRadius=0.75e-3,

        # isotropic confinement (should be negative)
        isoPrestress=0,
        noTableOk=True,
        
        # Number of elements to fetch in order to compute Poisson
        n=500
)

from yade.params.table import *
if 'description' in list(O.tags.keys()): 
O.tags['id']=O.tags['id']+O.tags['description']

print(young, poisson)

concreteId=O.materials.append(
                CpmMat(
                        young=young,
                        #frictionAngle=frictionAngle,
                        poisson=poisson,
                        density=6420,
                        #sigmaT=sigmaT,
                        relDuctility=relDuctility,
                        epsCrackOnset=epsCrackOnset,
                        #isoPrestress=isoPrestress
                        )
                )

sps=SpherePack()

#sp=pack.randomDensePack(pack.inAlignedBox((0,0,0),(specimenLength,specimenLength,specimenLength)),
sp=pack.randomDensePack(pack.inCylinder((0,0,-.5*specimenLength),(0,0,.5*specimenLength),specimenRadius),
                                                spheresInCell=5000,
                                                radius=sphereRadius,
                                                
memoizeDb='/tmp/calibCylinder3.sqlite',
                                                returnSpherePack=True)

sp.toSimulation(material=concreteId)

def getElementsCurrentPosition():
        return np.array(list(map(lambda x: [x.state.pos[0], x.state.pos[1], 
x.state.pos[2], x.id], O.bodies)))

ibpos = getElementsCurrentPosition()

def fetchElements(pos=(0,0,0), n=1):
        pos = np.array(pos)
        distances = np.sum(ibpos[:,:3]-pos, axis=1)**2
        return ibpos[distances.argsort()][:n,3].tolist()

def computePosition(n=1):
        elements = np.array(fetchElements(n=n)).astype(int)
        current_position = getElementsCurrentPosition()
        return current_position[elements]
        
allpos = computePosition(n)

bb=uniaxialTestFeatures()
negIds,posIds,axis,crossSectionArea=bb['negIds'],bb['posIds'],bb['axis'],bb['area']
O.dt=dtSafety*PWaveTimeStep()
print('Timestep',O.dt)

mm,mx=[pt[axis] for pt in aabbExtrema()]
imm, imx = mm, mx
coord_25,coord_50,coord_75=mm+.25*(mx-mm),mm+.5*(mx-mm),mm+.75*(mx-mm)
area_25,area_50,area_75=approxSectionArea(coord_25,axis),approxSectionArea(coord_50,axis),approxSectionArea(coord_75,axis)

O.engines=[
        ForceResetter(),
        
InsertionSortCollider([Bo1_Sphere_Aabb(aabbEnlargeFactor=intRadius,label='is2aabb'),],verletDist=.05*sphereRadius),
        InteractionLoop(
                
[Ig2_Sphere_Sphere_ScGeom(interactionDetectionFactor=intRadius,label='ss2sc')],
                [Ip2_CpmMat_CpmMat_CpmPhys()],
                [Law2_ScGeom_CpmPhys_Cpm()],
        ),
        NewtonIntegrator(damping=damping,label='damper'),
        CpmStateUpdater(realPeriod=.5),
        
UniaxialStrainer(strainRate=strainRateTension,axis=axis,asymmetry=0,posIds=posIds,negIds=negIds,crossSectionArea=crossSectionArea,blockDisplacements=False,blockRotations=False,setSpeeds=setSpeeds,label='strainer'),
        
PyRunner(virtPeriod=1e-6/strainRateTension,realPeriod=1,command='addPlotData()',label='plotDataCollector',initRun=True),
        PyRunner(realPeriod=1,command='stopIfDamaged()',label='damageChecker'),
]

# plot stresses in ¼, ½ and ¾ if desired as well; too crowded in the graph that 
includes confinement, though
plot.plots={'eps':('sigma')} #,'sigma.50')},'t':('eps')} 
#'sigma.25','sigma.50','sigma.75')}

O.saveTmp('initial');

O.timingEnabled=False

global mode
mode='tension' if doModes & 1 else 'compression'

def initTest():
        global mode
        print("init")
        if O.iter>0:
                O.wait();
                O.loadTmp('initial')
                print("Reversing plot data"); plot.reverseData()
        else: plot.plot(subPlots=False)
        strainer.strainRate=abs(strainRateTension) if mode=='tension' else 
-abs(strainRateCompression)
        try:
                from yade import qt
                renderer=qt.Renderer()
                renderer.dispScale=(1000,1000,1000) if mode=='tension' else 
(100,100,100)
        except ImportError: pass
        print("init done, will now run.")
        O.step(); # to create initial contacts
        # now reset the interaction radius and go ahead
        ss2sc.interactionDetectionFactor=1.
        is2aabb.aabbEnlargeFactor=1.

        O.run()

def stopIfDamaged():
        global mode, allpos
        if O.iter<2 or 'sigma' not in plot.data: return # do nothing at the 
very beginning
        sigma,eps=plot.data['sigma'],plot.data['eps']
        allpos = np.append(allpos, computePosition(n), 1)
        print(allpos.shape)
        extremum=max(sigma) if (strainer.strainRate>0) else min(sigma)
        minMaxRatio=0.8 if mode=='tension' else 0.8
        if extremum==0: return
        import sys;     sys.stdout.flush()
        if abs(sigma[-1]/extremum)<minMaxRatio or abs(strainer.strain)>(5e-3 if 
isoPrestress==0 else 5e-2):
                if mode=='tension' and doModes & 2: # only if compression is 
enabled
                        numpy.savetxt(savedir+str(young)+' '+str(poisson)+' 
1.txt', numpy.array([sigma, eps]).T, header='sigma\teps', delimiter='\t')
                        numpy.savetxt(savedir+str(young)+' '+str(poisson)+' 
3.txt', allpos, delimiter='\t')
                        mode='compression'
                        O.save('/tmp/uniax-tension.yade.gz')
                        print("Saved /tmp/uniax-tension.yade.gz (for use with 
interaction-histogram.py and uniax-post.py)")
                        print("Damaged, switching to compression... "); 
O.pause()
                        # important! initTest must be launched in a separate 
thread;
                        # otherwise O.load would wait for the iteration to 
finish,
                        # but it would wait for initTest to return and deadlock 
would result
                        import _thread; _thread.start_new_thread(initTest,())
                        return
                else:
                        numpy.savetxt(savedir+str(young)+' '+str(poisson)+' 
2.txt', numpy.array([sigma, eps]).T, header='sigma\teps', delimiter='\t')
                        numpy.savetxt(savedir+str(young)+' '+str(poisson)+' 
4.txt', allpos, delimiter='\t')
                        print("Damaged, stopping.")
                        ft,fc=max(sigma),min(sigma)
                        if doModes==3:
                                print('Strengths fc=%g, ft=%g, 
|fc/ft|=%g'%(fc,ft,abs(fc/ft)))
                        if doModes==2:
                                print('Compressive strength fc=%g'%(abs(fc)))
                        if doModes==1:
                                print('Tensile strength ft=%g'%(abs(ft)))
                        title=O.tags['description'] if 'description' in 
list(O.tags.keys()) else O.tags['params']
                        print('Bye.')
                        O.pause()
                
def addPlotData():
        
yade.plot.addData({'t':O.time,'i':O.iter,'eps':strainer.strain,'sigma':strainer.avgStress+isoPrestress,})
initTest()
waitIfBatch()

###################################################

If I run this code, I'll have as result two files, one for computing the Young 
modulus (which is trivial) and another for computing the Poisson modulus (file 
contains the 500 most central elements positions in which I compute the eps on 
the three axis to then compute the poisson modulus, whose algorythm is based in 
the process described on Šmilauer's thesis, page 53 
(https://dspace.cvut.cz/bitstream/handle/10467/79056/F1-D-2018-Smilauer-Vaclav-thesis.pdf?sequence=-1&isAllowed=y).

The code for Poisson calculus can be found below, in which cutoff is a 
parameter I manually change in order to get only the linear part of the curve:

###################################################

def computePoisson(PATH, cutoff=20):
    from scipy.stats import linregress
    import numpy as np
    pos = np.loadtxt(PATH)
    x = pos[:,::4]
    y = pos[:,1::4]
    z = pos[:,2::4]
    dx = x-x[:,0,None]
    dy = y-y[:,0,None]
    dz = z-z[:,0,None]
    poissons = []
    for x_, dx_, y_, dy_, z_, dz_ in zip(x.T, dx.T, y.T, dy.T, z.T, dz.T):
        ex = linregress(x_, dx_)[0]
        ey = linregress(y_, dy_)[0]
        ez = linregress(z_, dz_)[0]
        v = (-0.5 * (ex + ey)) / ez
        poissons.append(v)
    return(np.mean(poissons[cutoff:-cutoff]))

###################################################

By doing so, I can evaluate the variation of Macro Young based on Micro Young 
and Micro Poisson, but on this case my Micro Poisson will be 0.187 regardless 
of the variation of these parameters.

If anyone could help on this aspect, thank you, I have no idea on what is 
causing this non-variability.
I tried searching other topics like 
https://answers.launchpad.net/yade/+question/685847 and 
https://answers.launchpad.net/yade/+question/315620
Is there any key point I'm obviously missing in my analysis?

Thank you beforehand and best regards!

-- 
You received this question notification because your team yade-users is
an answer contact for Yade.

_______________________________________________
Mailing list: https://launchpad.net/~yade-users
Post to     : [email protected]
Unsubscribe : https://launchpad.net/~yade-users
More help   : https://help.launchpad.net/ListHelp

Reply via email to