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

    Status: Answered => Open

Justin is still having a problem:
Klaus,

I updated the code to be a MWE.

Items to note:
I increased the thickness for the pFacets
I could not recreate the problem with one or even two grass strands. I used 4, 
and had the once sphere far in the center-ish of the four. This recreates the 
problem every time.

My thoughts, since half the sphere is in the grass strand when the grass
is release, it is simply causing too much force? Thoughts? Or would that
not be an issue.


Thanks,
Justin

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)
boxDem = (.07,.07,.025)  ### 
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 
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'))

#### SPHERES
phi=20.
E=3.*1e8
O.materials.append( FrictMat( 
young=E,poisson=0.5,density=260050,frictionAngle=radians(phi),label='frictMat' 
) )
O.bodies.append( 
sphere(center=(Vector3(-0.0015,-0.0015-.04,0.05)),radius=sphereRadius,material='frictMat',fixed=False)
 )

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

### Steps needed to run sim
sphereFalls = 20000                                     ### Steps spheres need 
to fall and level out and turn on studs

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 physic
                        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.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.006
y_gap = 0.006
range_x = 2 ## finding the range for x
range_y = 2 ## 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-.04,z+sphereRadius+.004],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


color=[255./255.,102./255.,0./255.]
steel_r = .005
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)
 ))
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( 
pfacet(box[0],box[1],box[2],wire=False,color=color,material='steel') )

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