← Back to team overview

yslopeusers team mailing list archive

Re: ymport.py

 

Salut Luc,

Je vais essayer d'être un peu plus clair.

- Sur export / ymport. Je me suis dit (on en avait parlé un peu à Paris) que c'était dommage d'avoir à utiliser deux fichier : un Bloc.spheres, et un Bloc_JCFpm.spheres. J'ai donc essayé de faire en sorte de n'avoir à en utiliser qu'un.

Premièrement j'ai donc modifié la fonction export, exactement comme tu le dis toi même :
en modifiant legerement la fonction export, on peut arriver a creer un fichier texte avec toutes les infos necessaires (x,y,z,r,onJ,nj,j11,etc...).

Deuxièmement, il fallait modifier la fonction ymport. Ce que j'ai fait (cf code sur launchpad : http://bazaar.launchpad.net/~yslopeusers/yslope/trunk/annotate/head%3A/py/ymport.py#L44). Avec cette nouvelle fonction ymport.textExt, en une importation (via ymport.textExt, on n'utilise plus ymport.text), on a les positions des billes, leurs rayons, et toutes les variables onJ,nj,j11..... Car en fait, tu pourras remarquer que l'instance matériau est définie directement dans cette ymport.textExt. Le problème est que dans le matériau, il n'y a pas que onJ,nj, j11... mais aussi "density", "young".... Et que, tel que c'est écrit actuellement dans ymport.textExt, ce sont les valeurs par défaut de ces autres paramètres qui sont utilisées lors de la création des sphères. Hormis "density", c'est assez facile de changer à la main ces valeurs, une fois que les bodies existent (une fois qu'on a fait l'importation avec ymport.textExt). Pour density c'est un peu plus pénible, puisque il faudrait changer en plus "mass" et "inertia" (variables des bodies, découlant de la variable "density" du matériau). Et que donc j'ai décidé d'écrire dans ymport.textExt, que density = 2400 (afin que ce soit bien 2400 qui soit utilisé, et pas la valeur par défaut = 1000). Pour une autre valeur de density, il faudrait modifier à cet endroit.

En résumé, je te conseillerais de jeter un coup d'oeil au script ci - joint. Tu ne pourras pas l'exécuter, mais les commentaires devraient t'aider à voir la démarche (si les nouvelles explications plus haut sont toujours aussi peu claires). Et donc en particulier, maintenant j'écris plus (comme toi avant) :

def sphereMat(): return JCFpmMat(type=1,young=10e9,frictionAngle=radians(30),density=2400)
et
O.bodies.append(ymport.text(O.tags['id']+'.spheres',scale=1.,shift=[0,0,0],material=sphereMat))



- Passons ensuite à cette "comparaison". Une fois que j'ai fait tout ça, j'ai voulu vérifier que je trouvais bien la même chose que toi. Effectivement l'identification en elle même n'a rien à voir avec l'export et "l'ymport"; mais on peut très bien bien identifier, si après lors des étapes d'export et "d'ymport" il y a des erreurs, l'échantillon final sera quand même "pas bon"...
    J'ai donc pris l'exemple du bloc avec fissure à 30 degrés.

Premièrement, avec l'ancienne méthode (ce que tu faisais), j'ai identifié, j'ai exporté (dans deux fichiers : .spheres, et _JCFpm.spheres), puis j'ai utilisé ces deux fichiers comme toi : avec ymport.text, et la boucle python pour lire (et affecter aux sphères) onJ, nj, j11.... => Ca donne BlocAvecOldImport.xml. La remarque sur le booleen onJ, c'est que, en faisant ça directement avec les scripts que tu m'avais envoyés (où il y avait marqué onJ = _*bool*_(line.split()[1]) ), je n'ai eu finalement pour les sphères que des onJ = 0. Alors que dans le fichier _JCFpm.spheres, il y avait bien des "1" aussi. Et que j'ai donc dû changer onJ = _*bool*_(line.split()[1]) par onJ = _*int*_(line.split()[1]) dans le script pour que ça marche.

Deuxièmement, j'ai cherché à utiliser les nouvelles versions d'export/ymport. A la fin de l'identification (la même), j'exporte donc un seul fichier, avec export.textExt (version modifiée, cf launchpad). Puis (cf d'ailleurs TestPrNewExportSuite.py), j'importe uniquement ce fichier, avec ymport.textExt, la version modifiée toujours. Reste encore alors à affecter les mêmes prop mécaniques, que je fais à la main, plutôt qu'en affectant une instance précise de "Material".
    J'obtiens donc un 2d échantillon => BlocAvecNewImport.xml

Je compare donc finalement les 2 échantillons, et c'est là où j'ai 4% d'erreur, sans que je ne puisse trop l'expliquer (à part une différence dans les 2 méthodes, due à une erreur, est-ce qu'il y aurait un caractère légèrement aléatoire de l'identification ? je n'ai pas regardé ça)



Bon je reconnais que tout ça est un peu inutile, puisque tu avais un truc qui t'allait apparemment. Mais je trouvais cette histoire de "deux fichiers" pas à mon goût, c'est pour ça que j'ai fait ça. Maintenant on a plus qu'un fichier, mais c'est vrai que c'est peut être moins pratique pour définir young, frictionAngle, density...

    J'espère dans tous les cas avoir été plus clair !


Jérôme

# -*- coding: utf-8 -*-
# encoding: utf-8

# Une fois que TestPrNewExport a ete execute on a dans un fichier texte : bloc30DegTest_JCFpm.spheres les coord des spheres
# avec des infos sur leur "material" vis a vis du joint.

# Ce script permet alors d'utiliser tout ceci, et de changer deux trois trucs, et de sauvegarder un .xml qu'on pourra ensuite
# comparer directement a BlocAvecOldImport.xml

from yade import pack, utils, ymport, export

O.bodies.append(ymport.textExt('bloc30DegTest_JCFpm.spheres',format='JCFpm',scale=1.,shift=[0,0,0],))
# On a alors des spheres avec les bonnes informations (dans leur material) pour ce qui est des joints. Mais pour tout le reste (density, young, poisson...) ce sont les valeurs par defaut de JCFpmMat vu qu'on a rien specifié. C'est surtout embetant pour mat.density qui est utilisee lors de ce bodies.append pour calculer les "mass" (si on veut corriger apres coup, il faut changer a la main mat.density, ET b.mass (et d'autres choses). Du coup j'utilise finalement une version de ymport.textExt dans laquelle il est écrit que desnity = 2400
# Pour le reste : mat.young/poisson... tant qu'il n'y a pas d'interaction, on peut changer facilement à la main

# On change les couleurs :
for b in O.bodies:
  if (b.mat.onJoint==0):
    b.shape.color=(0,0,1) # en bleu
  if (b.mat.onJoint==1):
    b.shape.color=(1,0,0) # en rouge
#Il faut aussi changer type :
  b.mat.type=1
  # Et frictionAngle:
  b.mat.frictionAngle=radians(30)
  # Et young
  b.mat.young=10e9

# On peut alors sauvegarder
O.save('BlocAvecNewImport.xml')


O.wait()

Follow ups

References