no view about qt.View() and yade.qt.Controller()

Asked by yang yi on 2019-12-31

My yade is come from GitLib source, and cmake, make, make-install to my computer. I build a symbol link named "yadeImport".
The system can run very nice, if I use the command in terminal
"~/myYade/install/bin/yade my.py". I can controll the simulation by controller, and see the 3D simuliation process.

But, today, I want run the code by script. the yade.qt.View(), yade.qt.Controller(), just get two black windows. I hope to find the answer from there. And somebody says that the example of "triax-tutorial" could be help me. So I use the code as script-session2.py
The problem is the same. The yade.qt.View() and yade.qt.controller() just the black windows. I have two problems:

(1) How to get 3D view() by runing the script?
(2) If I cannot get the 3D process during simulation, how to save the date of each step of process, and replay after simulation?

Beacause my code is complex, I put the script-session2.py as below, the problem is the same.

# -*- coding: utf-8 -*-
from __future__ import print_function
from yade import pack

num_spheres=500
## corners of the initial packing
mn,mx=Vector3(0,0,0),Vector3(1,1,1)
thick = 0.01
compFricDegree = 2
rate=0.2
damp=0.1
stabilityThreshold=0.001
key='_define_a_name_'

## create material #0, which will be used as default
O.materials.append(FrictMat(young=5e6,poisson=0.5,frictionAngle=radians(compFricDegree),density=2600,label='spheres'))
O.materials.append(FrictMat(young=5e6,poisson=0.5,frictionAngle=0,density=0,label='walls'))

## create walls around the packing
walls=aabbWalls([mn,mx],thickness=thick,material='walls')
wallIds=O.bodies.append(walls)

sp=pack.SpherePack()
sp.makeCloud(mn,mx,-1,0.3333,num_spheres,False, 0.95)

volume = (mx[0]-mn[0])*(mx[1]-mn[1])*(mx[2]-mn[2])
mean_rad = pow(0.09*volume/num_spheres,0.3333)

clumps=False
if clumps:
 c1=pack.SpherePack([((-0.2*mean_rad,0,0),0.5*mean_rad),((0.2*mean_rad,0,0),0.5*mean_rad)])
 sp.makeClumpCloud((0,0,0),(1,1,1),[c1],periodic=False)
 O.bodies.append([sphere(center,rad,material='spheres') for center,rad in sp])
 standalone,clumps=sp.getClumps()
 for clump in clumps:
  O.bodies.clump(clump)
  for i in clump[1:]: O.bodies[i].shape.color=O.bodies[clump[0]].shape.color
 #sp.toSimulation()
else:
 O.bodies.append([sphere(center,rad,material='spheres') for center,rad in sp])

O.dt=.5*PWaveTimeStep() # initial timestep, to not explode right away
O.usesTimeStepper=True

triax=ThreeDTriaxialEngine(
 maxMultiplier=1.005,
 finalMaxMultiplier=1.002,
 thickness = thick,
 stressControl_1 = False,
 stressControl_2 = False,
 stressControl_3 = False,
 ## Independant stress values for anisotropic loadings
 goal1=-10000,
 goal2=-10000,
 goal3=-10000,
 internalCompaction=True,
 Key=key,
)

newton=NewtonIntegrator(damping=damp)

O.engines=[
 ForceResetter(),
 InsertionSortCollider([Bo1_Sphere_Aabb(),Bo1_Box_Aabb()],verletDist=-mean_rad*0.06),
 InteractionLoop(
  [Ig2_Sphere_Sphere_ScGeom(),Ig2_Box_Sphere_ScGeom()],
  [Ip2_FrictMat_FrictMat_FrictPhys()],
  [Law2_ScGeom_FrictPhys_CundallStrack()]
 ),
 GlobalStiffnessTimeStepper(active=1,timeStepUpdateInterval=100,timestepSafetyCoefficient=0.8, defaultDt=4*PWaveTimeStep()),
 triax,
 TriaxialStateRecorder(iterPeriod=100,file='WallStresses'+key),
 newton
]

#Display spheres with 2 colors for seeing rotations better
Gl1_Sphere.stripes=0
yade.qt.Controller(), yade.qt.View()

while 1:
  O.run(1000, True)
  #the global unbalanced force on dynamic bodies, thus excluding boundaries, which are not at equilibrium
  unb=unbalancedForce()
  #average stress
  #note: triax.stress(k) returns a stress vector, so we need to keep only the normal component
  meanS=(triax.stress(triax.wall_right_id)[0]+triax.stress(triax.wall_top_id)[1]+triax.stress(triax.wall_front_id)[2])/3
  print('unbalanced force:',unb,' mean stress: ',meanS)
  if unb<stabilityThreshold and abs(meanS+10000)/10000<0.001:
    break

O.save('compressedState'+key+'.xml')
print("### Isotropic state saved ###")

#let us turn internal compaction off...
triax.internalCompaction=False

#
triax.setContactProperties(30)

#... and make stress control independant on each axis
triax.stressControl_1=triax.stressControl_2=triax.stressControl_3=True
# We have to turn all these flags true, else boundaries will be fixed
triax.wall_bottom_activated=True
triax.wall_top_activated=True
triax.wall_left_activated=True
triax.wall_right_activated=True
triax.wall_back_activated=True
triax.wall_front_activated=True

#If we want a triaxial loading at imposed strain rate, let's assign srain rate instead of stress
triax.stressControl_2=0 #we are tired of typing "True" and "False", we use implicit conversion from integer to boolean
triax.strainRate2=0.01
triax.strainRate1=triax.strainRate3=1000.0

Question information

Language:
English Edit question
Status:
Solved
For:
Yade Edit question
Assignee:
No assignee Edit question
Solved by:
yang yi
Solved:
2020-01-01
Last query:
2020-01-01
Last reply:
yang yi (yangyizaixian) said : #3

I know the answer of the frist question

I run my script in the Pycharm, not in the terminal. If I run the code in the terminal like : 'yade my.py', I can get the controller and View

Jan Stránský (honzik) said : #4

Hi,

> (2) If I cannot get the 3D process during simulation, how to save the date of each step of process, and replay after simulation?

depend on what "the date" mean, you can e.g. use O.save(...) periodically and then you can O.load the saved state.

cheers
Jan

yang yi (yangyizaixian) said : #5

Jan Stránský (honzik), Thank you very much! I will try