commit:2013:06_14
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revision | |||
commit:2013:06_14 [2013/06/17 12:39] – [Modifications de cas test monosMaterials2] wautelet | commit:2013:06_14 [2016/03/30 15:23] (current) – external edit 127.0.0.1 | ||
---|---|---|---|
Line 1: | Line 1: | ||
+ | ====== Commit 2013-06-14 ====== | ||
+ | ===== Modifications ===== | ||
+ | |||
+ | ==== Méthode Area In Contact ==== | ||
+ | |||
+ | La méthode Area In Contact associe une aire à chaque noeud esclave (élément de contact). Ainsi, on peut tenir compte de la densité du maillage sur la frontière de contact (petite maille à côté de grosse maille). Dès lors, la force de contact agissant sur le noeud esclave, dans le cas d'un contact sans frottement (pour faire simple), est donnée par | ||
+ | |||
+ | $\vec{F}^{(s)} = - t_n A_s \vec{n}^{(m)}$ | ||
+ | |||
+ | |||
+ | où | ||
+ | |||
+ | |||
+ | - (s) indique l' | ||
+ | - (m) indique le maître.\\ | ||
+ | - $A_s$ est l'aire de contact nodale.\\ | ||
+ | - $\vec{n}$ est la normale extérieure unitaire.\\ | ||
+ | - $t_n$ est la pression de contact.\\ | ||
+ | |||
+ | Dans le cadre de la méthode de la pénalité classique, la pression de contact est donnée par | ||
+ | |||
+ | $t_n = C_n g_n $ | ||
+ | |||
+ | où | ||
+ | |||
+ | - $C_n$ est le coefficient de pénalité.\\ | ||
+ | - $g_n$ est la distance signée du noeud esclave par rapport à la surface maître.\\ | ||
+ | |||
+ | |||
+ | === Méthode de calcul de l'aire de contact nodale | ||
+ | |||
+ | J'ai raccourci le nom des paramètres disponibles pour la méthode AREAINCONTACTMETHOD : | ||
+ | |||
+ | * AIC_METHOD_GEOMETRIC devient AICM_GEOPHYS. | ||
+ | * AIC_METHOD_CONSISTENT devient AICM_CONS. | ||
+ | |||
+ | et j'ai ajouté une dernière méthode de calcul de l'aire de contact nodale dénommée AICM_GEOREF. | ||
+ | |||
+ | Dans le cas de quadrangles bilinéaires en 3D, l'aire de contact nodale d'un nœud esclave est égale à la somme des aires " | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | L'aire de contact nodale est un facteur de pondération, | ||
+ | |||
+ | * En état plan déformation, | ||
+ | |||
+ | * En modélisation axisymétrique, | ||
+ | |||
+ | * En 3D, les trois méthodes donnent la même valeur de l'aire de contact nodale dans le cas de triangle linéaire (Face de tétraèdre linéaire ou de pentaèdre " | ||
+ | |||
+ | * En 3D, les trois méthodes donnent en général des valeurs différentes de l'aire de contact nodale dans le cas de quadrangle bilinéaire (Face d' | ||
+ | |||
+ | <note important> | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ==== Correction de l' | ||
+ | |||
+ | Lors de la définition d'une interaction de contact rigide déformable pilotée en force, les éléments de contact possèdent deux nœuds au niveau élémentaire : | ||
+ | |||
+ | * Nœud 1 : Nœud esclave associé à un nœud de l' | ||
+ | * Nœud 2 : L' | ||
+ | |||
+ | Par le principe de l' | ||
+ | |||
+ | Dès lors, il est normal d' | ||
+ | < | ||
+ | valueExtractor = InteractionValueExtractor (interaction, | ||
+ | </ | ||
+ | |||
+ | avec '' | ||
+ | |||
+ | Désormais, il est possible de l' | ||
+ | |||
+ | ==== Divers ==== | ||
+ | |||
+ | Lors que l'on ouvre l' | ||
+ | |||
+ | On peut modifier le contenu des informations à l'aide le fonction suivante disponible dans la majorité des objets : | ||
+ | < | ||
+ | void write(std:: | ||
+ | </ | ||
+ | |||
+ | J'ai indiqué des informations sur des objets géométriques et sur les interactions (surtout celles de contact) : | ||
+ | |||
+ | - Interactions : | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | |||
+ | - Surface NURBS : | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | C'est vraiment très utile et ça permet de vérifier le valeur des paramètres réellement contenus dans les objets instanciés. | ||
+ | |||
+ | |||
+ | |||
+ | ==== BugFix ==== | ||
+ | |||
+ | === Maillage d'une side avec une surface === | ||
+ | |||
+ | La génération du maillage sur une side avec une surface avec le mailleur transfini 2D procède de la manière suivante : | ||
+ | |||
+ | * Détermination de la position du nœud sur une surface bilinéaire de Coons construite à partir du wire de la side, pour les paramètres (u,v) donnés | ||
+ | * Projection de ce nœud sur la surface | ||
+ | |||
+ | Cependant, l' | ||
+ | |||
+ | Sans cette correction, on observait des zig-zags dans la position des nœuds projetés sur la surface de la side ou le maillage était totalement distordu. | ||
+ | |||
+ | === Critères de convergence pour l' | ||
+ | |||
+ | J'ai constaté que les critères de convergence n' | ||
+ | |||
+ | Je me suis basé sur les recommandations aux pages 233 et 234 du bouquin de référence suivant The NURBS Book (second edition, 1997), Les Piegl and Wayne Tiller. | ||
+ | |||
+ | ===== Sélection dans un secteur sphérique ===== | ||
+ | |||
+ | Il est désormais possible de sélectionner des nœuds sur une partie d'une sphère au moyen d'une sélection dans un secteur sphérique. | ||
+ | |||
+ | |||
+ | Si on désire récupérer tous les nœuds dans le secteur sphérique de centre (Cx,Cy,Cz), de rayon minimum rMin et maximum rMax, d' | ||
+ | |||
+ | < | ||
+ | group.addMeshPoints(SectorSphericalSelector(Cx, | ||
+ | </ | ||
+ | |||
+ | |||
+ | Remarque : les angles sont calculés par rapport au système d'axes structuraux translatés au centre de la sphère. L' | ||
+ | ===== Mailleur ===== | ||
+ | |||
+ | === Mailleur HybridDensityMesher1D === | ||
+ | |||
+ | La méthodologie de construire une grille de $nbel$ intervalles sur une courbe commence par la spécification de la distribution des points sur cette dernière. Ceci revient à spécifier la distribution du paramètre de la courbe ${u(\xi) \; 0 \leq \xi \leq nbel+1}$ dans l' | ||
+ | |||
+ | La recherche de la fonction $u(\xi)$ revient à trouver la fonction $\xi(u)$. Avec la définition $\rho(u) = \frac{d\xi}{du}$, | ||
+ | |||
+ | $$ \xi(u) = \int_0^u \rho(w) dw. $$ | ||
+ | |||
+ | Dans le cas hybride, un ensemble plus complexe de considérations physiques est pris en compte dans la construction d'une fonction de densité des points de la grille, $\rho(u)$. Les approches possibles incluent les suivantes : | ||
+ | |||
+ | * Distribution uniforme de la longueur d'arc où les points de la grille sont séparés par des distances égales dans l' | ||
+ | * Distribution uniforme de la longueur d'arc pondérée par la courbure, où les points de la grille sont concentrés dans les régions de forte courbure. Pour ce cas-là, la fonction de densité des points de la grille prend la forme suivante | ||
+ | $$\rho(u) \propto \kappa(u) \left\| \frac{d\boldsymbol{x}}{du} \right\| $$ | ||
+ | où $\kappa(u)$ est la courbure de la courbe $\boldsymbol{x}$ en $u$. | ||
+ | * Attraction de la grille vers un point d' | ||
+ | |||
+ | $$ \rho_{u^{*}} (u) \propto \frac{1}{\sqrt{(k (u-u^{*}))^2 +1} } $$ | ||
+ | |||
+ | où $k$ est un facteur d' | ||
+ | |||
+ | En pratique, il est plus que probable que l' | ||
+ | $\int_0^1 \rho_i(u) \, du = \xi(1)-\xi(0) = m$. Etant donné les constantes positives $\lambda_i$ telles que $\sum_i \lambda_i=1$, | ||
+ | |||
+ | Finalement, si on donne les poids $\lambda_s$, | ||
+ | |||
+ | Sous Metafor, le mailleur HybridDensityMesher1D est interfacée sous la forme suivante : | ||
+ | < | ||
+ | Mesher = HybridDensityMesher1D(curveset(numero), | ||
+ | Mesher.execute(nbel, | ||
+ | </ | ||
+ | |||
+ | |'' | ||
+ | |'' | ||
+ | |'' | ||
+ | |'' | ||
+ | |'' | ||
+ | |'' | ||
+ | |||
+ | |||
+ | Si on désire concentrer les mailles autour d'un point d' | ||
+ | < | ||
+ | Mesher.pushAttractorPt(uJ) | ||
+ | Mesher.pushWeight(lambdaJ) | ||
+ | Mesher.pushStrength(kJ) | ||
+ | </ | ||
+ | |||
+ | |'' | ||
+ | |'' | ||
+ | |'' | ||
+ | |||
+ | |||
+ | Finalement, il existe une commande interfacée pour pouvoir débugger le mailleur : | ||
+ | < | ||
+ | Mesher.setVerbose() | ||
+ | </ | ||
+ | |||
+ | Exemples | ||
+ | |||
+ | Soit le demi cercle de rayon unitaire décrit par une courbe NURBS. On décide de la discrétiser avec 10 mailles et de concentrer les mailles tout près de l' | ||
+ | |||
+ | |||
+ | SimpleMesher1D | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | Rapport de 10 entre la dernière et la première maille | ||
+ | |||
+ | |||
+ | HybridDensityMesher1D | ||
+ | |||
+ | |||
+ | {{ : | ||
+ | |||
+ | Paramètres du point d' | ||
+ | |||
+ | Paramètres du mailleur : lambdaS = 0.0, lambdaK = 0.0 | ||
+ | |||
+ | HybridDensityMesher1D | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | Paramètres du point d' | ||
+ | |||
+ | Paramètres du mailleur : lambdaS = 0.5, lambdaK = 0.0 | ||
+ | |||
+ | HybridDensityMesher1D | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | Paramètres du point d' | ||
+ | |||
+ | Paramètres du mailleur : lambdaS = 1.0/3.0, lambdaK = 1.0/3.0 | ||
+ | |||
+ | |||
+ | Soit le demi cercle de rayon unitaire | ||
+ | |||
+ | |||
+ | HybridDensityMesher1D | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | Paramètres du point d' | ||
+ | |||
+ | Paramètres du mailleur : lambdaS = 1.0/3.0, lambdaK = 1.0/3.0 | ||
+ | |||
+ | Soit la spline cubique suivante. On décide de la discrétiser avec 20 mailles et de concentrer les mailles tout près de l' | ||
+ | |||
+ | SimpleMesher1D | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | Rapport de 10 entre la dernière et la première maille | ||
+ | |||
+ | HybridDensityMesher1D | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | Paramètres du point d' | ||
+ | |||
+ | Paramètres du mailleur : lambdaS = 0.25, lambdaK = 0.25 | ||
+ | |||
+ | |||
+ | Ce mailleur est indépendant du paramétrage de la courbe contrairement au SimpleMesher1D. Voici le maillage d'un octant de sphère avec une répartition des mailles uniformes selon le SimpleMesher1D et l' | ||
+ | |||
+ | SimpleMesher1D avec deux divisions sur chaque côté : | ||
+ | {{ : | ||
+ | HybridDensityMesher1D avec deux divisions sur chaque côté : | ||
+ | {{ : | ||
+ | Remarque : les trois sous-domaines sont égaux. | ||
+ | |||
+ | Article de référence : Hybrid Curve Point Distribution Algorithms, Khamayseh A. & Kuprat A., 2002. | ||
+ | |||
+ | === TransfiniMesher 2D et 3D === | ||
+ | |||
+ | Jusqu' | ||
+ | |||
+ | |||
+ | Désormais, il suffit de procéder de la manière suivante pour mailler une side ou un volume, | ||
+ | < | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | </ | ||
+ | lorsqu' | ||
+ | |||
+ | Remarque : Par défaut, le paramètre de la fonction setEnableDistribution est True. | ||
+ | |||
+ | Si on veut mailler la side suivante avec une distribution de maille, il est nécessaire d' | ||
+ | |||
+ | TFIMesher2D avec setEnableDistribution : | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | TFIMesher2D sans setEnableDistribution : | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | Bouquin de référence : Handbook of Grid Generation, Thompson J.F. , Soni K.S., Weatherill N.P. , 1999 | ||
+ | |||
+ | |||
+ | |||
+ | ===== Boîte à outils ===== | ||
+ | |||
+ | Ajout des boîtes à outil pour générer un arc de cercle NURBS, une surface de révolution NURBS (oo_meta.toolbox.nurbsRevolutionSurface.py) et un patch sphérique NURBS (oo_meta.toolbox.nurbsSpheriquePatch.py). | ||
+ | |||
+ | |||
+ | Les fichiers python sont commentés pour chaque utilisation d'une fonction et/ou d'une classe, ainsi que des paramètres d' | ||
+ | |||
+ | Puisque les NURBS peuvent représenter de manière exacte les coniques (parabole, ellipse, cercle, ...) pour les courbes et les quadriques pour les surfaces (sphère, cylindre, ...), cette boîte à outils pourrait être utiliser pour vérifier/ | ||
+ | |||
+ | Bouquin de référence : The NURBS Book (second edition, 1997), Les Piegl and Wayne Tiller. | ||
+ | ===== Modifications de cas test monosMaterials2 ===== | ||
+ | |||
+ | Dans le fichier apps.toolbox.materialTesting, | ||
+ | |||
+ | Grâce à ce paramètre-là, | ||
+ | |||
+ | * GursonDamageNl8IH (dtimeFactor= 0.5) | ||
+ | * GursonDamageMoriTanakaLinearIH (dtimeFactor= 0.5) | ||
+ | |||
+ | |||
+ | Les matériaux qui posent encore des problèmes, sont les suivants : | ||
+ | * EvpIsoDamageLemaitre | ||
+ | * GursonViscoDamageMoriTanakaPowerIH | ||
+ | * GursonViscoDamagePowerIH | ||
+ | * NortonHoff2 | ||
+ | |||
+ | Remarque : | ||
+ | |||
+ | Lorsque l'on impose dtimeFactor = 0.01 pour le matériau EvpIsoDamageLemaitre, | ||
+ | |||
+ | Pour chacun des matériaux problématiques, | ||
+ | |||
+ | Exemple NortonHoff2 : | ||
+ | < | ||
+ | def main() : | ||
+ | |||
+ | testModule = pyutils.fileToModule(__file__, | ||
+ | if 1: | ||
+ | testMat.execAll(NortonHoff2, | ||
+ | else: | ||
+ | testMat.execOneAtChoice(NortonHoff2({' | ||
+ | print testModule, ' finished' | ||
+ | </ | ||
+ | |||
+ | ===== Perspectives ===== | ||
+ | |||
+ | Méthode du lagrangien augmenté : | ||
+ | |||
+ | * Débugger la méthode | ||
+ | * Nettoyage du code | ||
+ | * Ajout de nouveaux critères d' | ||
+ | * Implémentation des cas test de référence de l' | ||
+ | * Mettre à jour l'aire de contact nodale au cours des augmentations | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ===== Fichiers ajoutés/ | ||
+ | |||
+ | < | ||
+ | [r]: | ||
+ | [a]: | ||
+ | [a]: | ||
+ | [a]: | ||
+ | [a]: | ||
+ | </ | ||
+ | |||
+ | |||
+ | ===== Tests ajoutés/ | ||
+ | |||
+ | < | ||
+ | [r]: | ||
+ | [a]: | ||
+ | </ | ||
+ | |||
+ | |||
+ | --- // |