Question #685596 on Yade changed:
https://answers.launchpad.net/yade/+question/685596

    Status: Answered => Open

Justin is still having a problem:
Klaus,

Thanks for the help. Unfortunately I get another "Segmentation fault
(core dumped)" when "grass" is added. Minimum error causing code is
below.

What I believe is causing the error. The "grass" is just vertical
standing gridConnections. The nodes DOFs are fixed until the spheres
fall around them, then all nodes except the bottom nodes are release to
move freely. I believe the problem is, the spheres do not interact with
the "grass" and are actually going straight through the "grass". Then
once the nodes are release, the spheres interact and cause Segmentation
fault (core dumped).


Thus do you believe this is the problem, if so, is there anyway I can get the 
spheres to interact with the grass while the grass' DOFs are fixed? I.e., so 
there are not spheres going through/in the "grass".


Thanks,
Justin


Minimum error causing code:


from yade.gridpfacet import *
import numpy as np
from yade import utils
from yade import ymport
import sys,time,math,random

from yade import qt
qt.View()

boxCenter = (0,0,.025)
## double check that /2 would create correct length, I.e., import based_70 to 
see if they match... they should
#boxDem = (.2123/2,.212/2,.064/2)  ### based_70 is 212.3x212.21x63.65

boxDem = (.07,.07,.025)  ### 
# probably need to add O.material that would be the boxes material? 
#O.bodies.append(geom.facetBox(boxCenter,boxDem,wallMask=31,color=(1,1,1),wire=True,fixed=True))

O.materials.append(FrictMat(young=200e9,density=8050,poisson=.3,
label='steel')) # used steel properties to make rigid

blen = boxDem[0]*2  ## Length of Ball pit
bhei = .025       ## Height of Ball pit

# Spheres information
sphereRadius = .004 # [m]
nu = .48 
#G = 300000 # [Pa]
den_rub = 89724 # [kg/m^3]
yng_rub = 3000000 # [Pa] 
fric_rub = radians(38)  # [degrees] 
O.materials.append(FrictMat(frictionAngle=fric_rub,young=yng_rub,density=den_rub,poisson=nu,label='rubber'))

## Stud informtion
#studStartZ = (.01+.022+.01905)
studStartZ = (.01+bhei+.01905)
transVel = 0.000222*2
rotVel = 0.00872665*2

### pack auto fills, i.e., I no longer pick the amount of spheres
pred = 
pack.inAlignedBox((-(boxDem[0]-.001),-(boxDem[0]-.001),.1+bhei+sphereRadius/2+.001),((boxDem[0]-.001),(boxDem[0]-.001),.1+bhei+.045))
sp = pack.randomDensePack(pred, radius=sphereRadius, 
memoizeDb='tmp/single_grass.sqlite', returnSpherePack=True)
sp.toSimulation(wire=False,material='rubber')

## Time step set to 20% of Rayleigh Wave
O.dt=.2*utils.RayleighWaveTimeStep() # 0.0011302534626965682
#O.dt=0.00011302534626965682/2
print(O.dt)

### Steps needed to run sim
sphereFalls = 4000                                                              
                                                ### Steps spheres need to fall 
and level out and turn on studs
startRot = sphereFalls+math.floor((studStartZ-bhei-.01)/transVel/O.dt)          
### Step needed for transVel to get studs level with spheres

## Rotation steps
deg_to_rad_length = (60*pi/180); # [rad]
num_sec_roto = deg_to_rad_length/rotVel; # [s]
num_of_steps_roto = num_sec_roto/O.dt;

endSim   = startRot     + math.floor(num_of_steps_roto)
### total steps in sim

O.engines=[
                ###Reset all forces stored in Scene::forces (O.forces in 
python). Typically, this is the first engine to be run at every step.          
In addition, reset those energies that should be reset, if energy tracing is 
enabled.
                ## Resets forces and moments that act on bodies
                ForceResetter(),

                ## Using bounding boxes find possible body collisions.
                InsertionSortCollider([
                Bo1_Facet_Aabb(), 
                Bo1_Sphere_Aabb(),
                Bo1_GridConnection_Aabb(),
                Bo1_PFacet_Aabb(),
                ]),
                InteractionLoop([
                        Ig2_Facet_Sphere_ScGeom(),
                        Ig2_Wall_PFacet_ScGeom(),
                        Ig2_Wall_Sphere_ScGeom(),
                        Ig2_Sphere_Sphere_ScGeom(),
                        Ig2_Sphere_GridConnection_ScGridCoGeom(),
                        Ig2_Sphere_PFacet_ScGridCoGeom(),
                        Ig2_GridNode_GridNode_GridNodeGeom6D(),
                        Ig2_GridConnection_GridConnection_GridCoGridCoGeom(),
                        Ig2_GridConnection_PFacet_ScGeom(),
                        Ig2_PFacet_PFacet_ScGeom(),
                        ],
                        [
                        
Ip2_CohFrictMat_CohFrictMat_CohFrictPhys(setCohesionNow=True,setCohesionOnNewContacts=True),
    # internal cylinder physics
#                       
Ip2_CohFrictMat_CohFrictMat_CohFrictPhys(setCohesionNow=True),  # internal 
cylinder physics
                        ## Currently grass does not interact with facet, 
probably should not matter, since the spheres will be holding them up.          
       
                        Ip2_FrictMat_FrictMat_FrictPhys() # physics for 
external interactions, i.e., cylinder-cylinder, sphere-sphere, cylinder-sphere
                        ],
                        [
                        Law2_ScGeom_FrictPhys_CundallStrack(),           # 
contact law for sphere-sphere
                        Law2_ScGridCoGeom_FrictPhys_CundallStrack(),     # 
contact law for cylinder-sphere
                        Law2_ScGeom6D_CohFrictPhys_CohesionMoment(),     # 
contact law for "internal" cylinder forces
                        Law2_GridCoGridCoGeom_FrictPhys_CundallStrack(), # 
contact law for cylinder-cylinder interaction
                ]),
        NewtonIntegrator(damping=.2,gravity=[0,0,-9.81], label='newtonInt'),
        PyRunner(command='turnongrass()',firstIterRun=sphereFalls, nDo=6, 
dead=False, label='freeGrass'),
]


## Grass Information
O.materials.append(CohFrictMat(young=100,poisson=0.3,density=40,frictionAngle=np.radians(30),normalCohesion=1e5,shearCohesion=1e5,momentRotationLaw=True,label='grass'))
#rCyl = 0.0006  ## Radius, Grass was about 1.2 [mm] wide
rCyl = 0.0026  ## Grass was about 1.2 [mm] wide
nL = 4         ## No exact Number here, just trial and error
L = bhei      ## Height of spheres


### Grass Creation
### Create all nodes first :
nodesIds=[]
idxc = -1
x_gap = 0.009 ## Between lumps is roughly 9 [mm]
y_gap = 0.01905 ## Between lines of backing is .75 inch apart
range_x = int(math.floor(blen/x_gap))-1 ## finding the range for x
range_y = int(math.floor(blen/y_gap))-1 ## finding the range for z
cen_y = -(range_y/2)*y_gap  ## Allows the "box" of grass to be center in Z

for ii in range(0,range_y):
  cen_x = -(range_x/2)*x_gap  # Allows the "box" of grass to be center in X
  for jj in range(0,range_x):
    for z in np.linspace(0,L,nL):
      
nodesIds.append(O.bodies.append(gridNode([cen_x,cen_y,z+sphereRadius],rCyl,wire=False,fixed=False,material='grass')))
    idxc += 1
    d = idxc*nL ## Start of grass fiber
    cen_x += x_gap
#### Now create connection between the nodes
    for k,j in zip(nodesIds[d:d+nL-1],nodesIds[d+1:nodesIds[-1]+1]):
      O.bodies.append(gridConnection(k,j,rCyl))
  cen_y += y_gap 

for kk in range(0,len(nodesIds)):   ## First Blocking all DOF's until balls 
fall around.
  O.bodies[nodesIds[kk]].state.blockedDOFs='xyzXYZ'  

def turnongrass():
        print("Turning on Grass")
        for kk in range(0,len(nodesIds)):
                O.bodies[nodesIds[kk]].state.blockedDOFs=''       ## Unblocking 
all DOF's
        for kk in range(0,len(nodesIds),nL):
                O.bodies[nodesIds[kk]].state.blockedDOFs='xyzXYZ' ## Blocking 
DOF's for Bottom nodes
                O.bodies[nodesIds[kk+nL-1]].state.blockedDOFs=''  ## Top of 
Grass
        freeGrass.dead = True


colorTG=[40./255.,102./255.,50./255.]
color=[255./255.,102./255.,0./255.]
steel_r = (1/4*0.00635)/2                               ### Converting 1/4 
steel to m, to a sphere radius
box = []
box.append(O.bodies.append( 
gridNode([-boxDem[0],-boxDem[1],0],steel_r,wire=False,fixed=True,material='steel',color=color)
 ))
box.append(O.bodies.append( 
gridNode([boxDem[0],-boxDem[1],0],steel_r,wire=False,fixed=True,material='steel',color=color)
 ))
box.append(O.bodies.append( 
gridNode([boxDem[0],boxDem[1],0],steel_r,wire=False,fixed=True,material='steel',color=color)
 ))
box.append(O.bodies.append( 
gridNode([-boxDem[0],boxDem[1],0],steel_r,wire=False,fixed=True,material='steel',color=color)
 ))
O.bodies.append( gridConnection(box[0],box[1],steel_r,color=color) )
O.bodies.append( gridConnection(box[1],box[2],steel_r,color=color) )
O.bodies.append( gridConnection(box[2],box[0],steel_r,color=color) )
O.bodies.append( gridConnection(box[2],box[3],steel_r,color=color) )
O.bodies.append( gridConnection(box[3],box[0],steel_r,color=color) )
O.bodies.append( 
pfacet(box[0],box[1],box[2],wire=False,color=color,material='steel') )
O.bodies.append( 
pfacet(box[0],box[2],box[3],wire=False,color=color,material='steel') )

O.stopAtIter=endSim   ### Stop sim at endSim steps

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