gen_sample.py 3 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
import os,sys

import numpy
import math

from pylmgc90.pre_lmgc import *

# on se place en 2D
dim = 2

# creration des conteneurs
#   * pour les corps
bodies = avatars()
#   * pour les materiaux
mat = materials()
#   * pour les tables de visibilite
svs = see_tables()
#   * pour les lois de contact
tacts = tact_behavs()

# creations de deux materiaux
tdur = material(name='TDURx',type='RIGID',density=1000.)
plex = material(name='PLEXx',type='RIGID',density=100.)
mat.addMaterial(tdur,plex)

# on cree un modele de rigide
mod = model(name='rigid', type='MECAx', element='Rxx2D', dimension=dim)

# on genere 2000 particules
nb_particles=2000

# distribtion aleatoire dans [0.5, 2.[ 
radii=granulo_Random(nb_particles, 0.5, 2.)

# on recupere le plus petit et le plus grand rayon
radius_min=min(radii)
radius_max=max(radii)

# depot dans un disque
r = 50. 
[nb_remaining_particles, coor]=depositInDisk2D(radii, r)

# si toutes les particules deposees n'ont pas ete conservees
if (nb_remaining_particles < nb_particles):
   # on affiche un avertissement
   print "Warning: granulometry changed, since some particles were removed!"

# boucle d'ajout des disques :
for i in xrange(0,nb_remaining_particles,1):
   # creation un nouveau disque rigide, constitue du materiau plex
   body=rigidDisk(r=radii[i], center=coor[2*i : 2*(i + 1)], 
                  model=mod, material=plex, color='BLEUx') 
   # on donne une vitesse initiale au disque
   body.imposeInitValue(component=1,value=3.0)
   # ajout du disque dans le conteneur de corps
   bodies += body

# ajout d'un mur :

# on declare un corps pour le mur
wall=rigidJonc(2.*r, radius_max, [2.*r+radius_max,r], mod, tdur, 'WALLx')

# on ajoute le mur a la liste des corps
bodies += wall

# on tourne le mur pour le rendre vertical (par rapport a son propre
# cente d'inertie) 
wall.rotate(psi=math.pi/2., center=wall.nodes[1].coor)

# on fixe le mur
wall.imposeDrivenDof(component=[1, 2, 3], dofty='vlocy')

# gestion des interactions :
#   * declaration des lois
#       - entre particules
ldkdk=tact_behav(name='iqsc0',type='IQS_CLB',fric=0.3)
tacts+=ldkdk
#       - avec le mur
ldkjc=tact_behav(name='iqsc1',type='IQS_CLB',fric=0.5)
tacts+=ldkjc
#   * declaration des tables de visibilite
#       - entre particules
svdkdk = see_table(CorpsCandidat='RBDY2',candidat='DISKx',
   colorCandidat='BLEUx',behav=ldkdk, CorpsAntagoniste='RBDY2', 
   antagoniste='DISKx',colorAntagoniste='BLEUx',alert=0.1*radius_min)
svs+=svdkdk
#       - avec le mur
svdkjc = see_table(CorpsCandidat='RBDY2',candidat='DISKx',
   colorCandidat='BLEUx',behav=ldkjc, CorpsAntagoniste='RBDY2', 
   antagoniste='JONCx',colorAntagoniste='WALLx',alert=0.1*radius_min)
svs+=svdkjc

# ecriture des fichiers
writeBodies(bodies,chemin='DATBOX/')
writeBulkBehav(mat,chemin='DATBOX/',gravy=[0., 0., 0.])
# N.B.: on fait l'essai sans gravite... just for fun!
writeTactBehav(tacts,svs,chemin='DATBOX/')
writeDrvDof(bodies,chemin='DATBOX/')
writeDofIni(bodies,chemin='DATBOX/')
writeVlocRlocIni(chemin='DATBOX/')

try:
  visuAvatars(bodies)
except:
  pass