import os,sys import numpy import math from pylmgc90.pre_lmgc import * if not os.path.isdir('./DATBOX'): os.mkdir('./DATBOX') # 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