yslopeusers team mailing list archive
-
yslopeusers team
-
Mailing list archive
-
Message #00004
Re: ymport.py
-
To:
yslopeusers@xxxxxxxxxxxxxxxxxxx
-
From:
Jerome Duriez <duriez@xxxxxxxxxxxxxxx>
-
Date:
Wed, 01 Dec 2010 11:32:40 +0100
-
In-reply-to:
<AANLkTikEBEQpYAAVasn89JC=6T1BS+o98u_LoJp03fF8@mail.gmail.com>
-
User-agent:
Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.15) Gecko/20101027 Thunderbird/3.0.10
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