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

    Status: Open => Answered

Vasileios Angelidakis proposed the following answer:
Hi Jie,

Please find below some corrections to your script.
You have actually revealed a different bug in the code; many thanks for that! I 
see that if size=(0.06,0.06,0.06), we do not get correct volume/centroid, due 
to undetected duplicate vertices in the PBs. I will go through the source code 
again to find a permanent fix for this. In the meanwhile, if you scale the 
particle e.g. with size=(0.6,0.6,0.6), like below, you get the correct 
volume/centroid/inertia/orientation/vertices.

All the best,
Vasileios


#####################
from yade import polyhedra_utils,pack,plot,utils,export,qt,ymport
import numpy as np
import math
import random
#########################################################################Define 
physical parameters
powderDensity = 2500
O.materials.append(FrictMat(young=-1,poisson=-1,frictionAngle=radians(0.0),density=powderDensity,label='frictionless'))
young = 1e9
FricDegree1= atan(.6)
m = PolyhedraMat()
m.density = powderDensity
m.young = young
m.poisson = 0.25
m.frictionAngle = FricDegree1
#########################################################################Forming
 polyhedra with polyhedra function
t = polyhedra_utils.polyhedra(m,size=(0.6,0.6,0.6),seed =3) 
#size=(0.06,0.06,0.06)
#t.state.ori=Quaternion((1,0,0),0)
#t.state.pos = (0.,0.,0.5)
O.bodies.append(t)
########################################################################Polyhedron
 transformation
def dvalue(vecn1,pp1):
        dd1=1*(vecn1[0]*pp1[0]+vecn1[1]*pp1[1]+vecn1[2]*pp1[2])
        return dd1

chosenR=0.001
for b in O.bodies:
        aa=[]
        bb=[]
        cc=[]
        dd=[]
        if not isinstance(b.shape,Polyhedra): # skip non-polyhedra bodies
                continue
        vs = [b.state.ori*v for v in b.shape.v] # vertices in global coords
        face2=b.shape.GetSurfaces()

        id1=0
        while id1<len(face2):
                face11=face2[id1]
                if len(face11)>2:
                        vec1=vs[face11[2]]-vs[face11[1]]; vec1.normalize()
                        vec2=vs[face11[0]]-vs[face11[1]]; vec2.normalize() 
#Normalize this object in-place.
                        vects=vec1.cross(vec2); vects.normalize()

                        dvalue2=dvalue(vects,vs[face11[0]]) # Some dvalue2 
values return equal to 0. Check this part of your script once more.
                        dv=dvalue2-chosenR

#                       if dv<0:
#                               vects=[-1*vects[0],-1*vects[1],-1*vects[2]]
#                               dv=-1*dv

                        aa.append(vects[0])
                        bb.append(vects[1])
                        cc.append(vects[2])
                        dd.append(dv)

                id1=id1+1

#######################################################################################
O.engines=[
        ForceResetter(),
        InsertionSortCollider([PotentialBlock2AABB()],verletDist=0.01, 
avoidSelfInteractionMask=2),
        InteractionLoop(
                [Ig2_PB_PB_ScGeom(twoDimension=False, unitWidth2D=1.0, 
calContactArea=True)],
                [Ip2_FrictMat_FrictMat_KnKsPBPhys(kn_i=1e8, ks_i=1e7, 
Knormal=1e8, Kshear=1e7, useFaceProperties=False, viscousDamping=0.2)],
                [Law2_SCG_KnKsPBPhys_KnKsPBLaw(label='law',neverErase=False, 
allowViscousAttraction=True, traceEnergy=False)]
        ),
        #GlobalStiffnessTimeStepper(),
        
NewtonIntegrator(damping=0.0,exactAsphericalRot=True,gravity=[0,-9.81,0]),
        
#PotentialBlockVTKRecorder(fileName='./vtk/cubePBscaled',iterPeriod=10000,twoDimension=False,sampleX=50,sampleY=50,sampleZ=50,maxDimension=0.2,label='vtkRecorder')
]
#print(aa,bb,cc,dd)
bbb=Body()
bbb.aspherical=True
wire=False
color=[125,2,1]
highlight=True
bbb.shape=PotentialBlock(k=0.0, r=chosenR, R=0.0, a=aa, b=bb, c=cc, d=dd)
utils._commonBodySetup(bbb, bbb.shape.volume, 
bbb.shape.inertia,material='frictionless', pos=bbb.shape.position, fixed=False)
bbb.state.ori=bbb.shape.orientation
#bbb.state.pos = [0,0.1,0]
#bbb.shape.position+t.shape.GetCentroid()
#bbb.state.ori=Quaternion((1,0,0),0)
O.bodies.append(bbb)
###################

from yade import qt
v=qt.View()
v.sceneRadius=2.0

print("Volume")
print(t.shape.GetVolume())
print(bbb.shape.volume)

print("Centroid")
print(t.shape.GetCentroid())
print(bbb.shape.position)

print("Principal inertia tensor")
print(t.shape.GetInertia())
print(bbb.shape.inertia)

print("Principal orientations")
print(t.shape.GetOri())
print(bbb.shape.orientation)

-- 
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     : yade-users@lists.launchpad.net
Unsubscribe : https://launchpad.net/~yade-users
More help   : https://help.launchpad.net/ListHelp

Reply via email to