doc:user:ale:ale
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revision | |||
doc:user:ale:ale [2013/07/12 19:38] – joris | doc:user:ale:ale [2016/03/30 15:23] (current) – external edit 127.0.0.1 | ||
---|---|---|---|
Line 1: | Line 1: | ||
+ | ====== Formalisme A.L.E. ====== | ||
+ | ===== Introduction ===== | ||
+ | |||
+ | ==== Intérêts de l'ALE ==== | ||
+ | |||
+ | Le [[doc: | ||
+ | |||
+ | Les buts recherchés peuvent être: | ||
+ | * minimiser la distorsion du maillage: on sait que la solution est d' | ||
+ | * minimiser la taille du maillage en raffinant les zones qui nécessitent de nombreuses mailles sans se soucier du déplacement de la matière (par exemple garder un grand nombre de mailles près des contacts). | ||
+ | * résoudre des problèmes eulériens ou quasi-eulériens (problèmes stationnaires). | ||
+ | |||
+ | {{ doc: | ||
+ | |||
+ | ==== Operator split ==== | ||
+ | |||
+ | Dans Metafor, on se limite à une résolution découplée du problème (on parle d' " | ||
+ | |||
+ | * repositionnement des noeuds (rezoning) : metafor dispose d'une série de méthodes pour définir le plus simplement possible le mouvement des noeuds par rapport à celui de la matière. | ||
+ | * convection de grandeurs utiles d'un maillage vers l' | ||
+ | * post-traitement: | ||
+ | |||
+ | Utiliser le formalisme ALE revient donc à définir des opérateurs de repositionnement de noeuds qui seront appelés à chaque activation de l' | ||
+ | |||
+ | |||
+ | ==== Algorithme ALE ==== | ||
+ | |||
+ | |||
+ | L' | ||
+ | |||
+ | ale = AleMethod(metafor) | ||
+ | |||
+ | Le passé nous a montré que l' | ||
+ | |||
+ | Activer l'ALE se fait donc en 1 commande: | ||
+ | |||
+ | ale.enable(n) | ||
+ | |||
+ | où n est le nombre de pas entre 2 activations de l' | ||
+ | |||
+ | L' | ||
+ | |||
+ | rez = ale.getReZoningStep() | ||
+ | conv = ale.getTransferStep() | ||
+ | |||
+ | |||
+ | ===== Commandes de Rezoning ===== | ||
+ | |||
+ | ==== Généralités ==== | ||
+ | |||
+ | J' | ||
+ | |||
+ | Les commandes de rezoning permettent de définir le déplacement du maillage au cours du temps (éventuellement en fonction de celui de la matière). Chaque méthode est gérée par un objet. Par exemple '' | ||
+ | |||
+ | Chaque méthode s' | ||
+ | |||
+ | Ajouter une méthode revient à ajouter un objet de type '' | ||
+ | |||
+ | rez.add(EulerianReZoner(curveset(3))) | ||
+ | |||
+ | Une autre possibilité pour piloter le déplacement du maillage est d' | ||
+ | ==== Objets ReZoner ==== | ||
+ | |||
+ | |||
+ | Je liste ici les différentes méthodes de rezoning disponible dans Metafor. Vu la large gamme de problèmes pouvant être traités par Metafor, nous avons besoin d'une large gamme de méthodes de rezoning. Chaque méthode possède des qualités et des défauts: il n' | ||
+ | |||
+ | __Remarques: | ||
+ | * Les '' | ||
+ | * Il est très important que l' | ||
+ | * Les méthodes surfaciques peuvent être appliquées à des surfaces courbes. Dans ce cas, il faut spécifier si la courbure doit être préservée ou pas (fct membre '' | ||
+ | |||
+ | __Exemple: | ||
+ | |||
+ | rezoner = Tm2DReZoniner(sidset(2)) | ||
+ | rezoner.keepShape() | ||
+ | rez.add(rezoner) | ||
+ | |||
+ | Pour l' | ||
+ | * Pour les méthodes itératives, | ||
+ | * Les méthodes itératives prennent un deuxième argument lors de leur construction: | ||
+ | |||
+ | === Méthode basée sur les angles : AngleReZoner === | ||
+ | |||
+ | Cette méthode (développée par Tian Zhou) essaye d' | ||
+ | |||
+ | D' | ||
+ | |||
+ | On peut observer des retournements de mailles. Pour un maillage structuré, je conseille d' | ||
+ | |||
+ | === Fixation du maillage: EulerianReZoner === | ||
+ | |||
+ | Les noeuds de l' | ||
+ | |||
+ | === Méthode du " | ||
+ | |||
+ | Cette méthode est le lissage laplacien (appelée parfois aussi " | ||
+ | |||
+ | Malgré sa simplicité, | ||
+ | |||
+ | Plusieurs choix sont possibles: | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | === Plan/Courbe frontière: BoundaryReZoner === | ||
+ | |||
+ | Permet de définir une frontière " | ||
+ | |||
+ | Le contructeur de ce '' | ||
+ | |||
+ | Expl: | ||
+ | rezo = BoundaryReZoner(curset(1), | ||
+ | |||
+ | === Courbe frontière: BPointReZoner === | ||
+ | |||
+ | (Vieille) méthode équivalente à la précédente utilisable uniquement dans des tests bidimensionnels pur piloter les points extrêmes d'une ligne frontière. Je conseille d' | ||
+ | |||
+ | === Méthode de Giuliani: Giuliani2DReZoner & Giuliani3DReZoner === | ||
+ | |||
+ | Optimisation itérative des éléments adjacents à chaque noeud par la méthode de Giuliani. Cette méthode fonctionne mieux que le lissage laplacien mais est plus coûteuse. Elle tend à homogénéiser les volumes des mailles et peut parfois provoquer des retournements de mailles. | ||
+ | |||
+ | === Méthode des arcs: ArcReZoner === | ||
+ | |||
+ | Méthode de JPP, utilisable pour remailler des courbes dans le cas de problèmes bi-dimensionnels. Le principe est simple: on fait passer un arc de cercle par le point considéré et les 2 points les plus proches de celui-ci. On replace ensuite le point sur cet arc en respectant l' | ||
+ | |||
+ | === Méthode splines cubiques : SplineCurveReZoner === | ||
+ | |||
+ | Utilise une spline cubique pour remailler les lignes. Fonctionne aussi bien en 2D qu'en 3D. Permet également de remailler des contours ('' | ||
+ | |||
+ | === Méthode d' | ||
+ | |||
+ | Remaille une face ou un volume en utilisant le [[doc: | ||
+ | |||
+ | Appliqué à une surface 3D courbe, il faut spécifier si la courbure doit être préservée ou pas (fct membre '' | ||
+ | |||
+ | === Eulérien modifié: UpdEulerCurveReZoner === | ||
+ | |||
+ | Bidouille de JPP utile pour remailler une ligne droite uniformément entre ses deux points extrêmes. | ||
+ | |||
+ | === Lissage équipotentiel: | ||
+ | |||
+ | Cette méthode est une extension du lissage laplacien. On l' | ||
+ | |||
+ | Ces méthodes sont efficaces sur des maillages structurés lorsque les tailles de mailles varient (elles conservent leur aspect). | ||
+ | |||
+ | === Lissage iso-paramétrique: | ||
+ | |||
+ | Extension du cas précédent ('' | ||
+ | |||
+ | === Combinaison de méthodes: BlendedReZoner === | ||
+ | |||
+ | Cette méthode combine linéairement deux '' | ||
+ | |||
+ | __Expl:__ | ||
+ | rez1 = LaplacianReZoner(sideset(1), | ||
+ | rez2 = AreaPullReZoner(sideset(1), | ||
+ | rezo = BlendedReZoner(sideset(1), | ||
+ | ale.getReZoningStep().add(rezo) | ||
+ | |||
+ | combine un " | ||
+ | |||
+ | |||
+ | |||
+ | ==== Résumé : champ d' | ||
+ | |||
+ | | ^ Point ^ Courbe | ||
+ | | | | ||
+ | ^AngleReZoner | ||
+ | ^EulerianReZoner | ||
+ | ^Laplacian2DReZoner | ||
+ | ^Laplacian3DReZoner | ||
+ | ^BoundaryReZoner | ||
+ | ^BPointReZoner | ||
+ | ^Giuliani2DReZoner | ||
+ | ^Giuliani3DReZoner | ||
+ | ^ArcReZoner | ||
+ | ^SplineCurveReZoner | ||
+ | ^TmReZoner | ||
+ | ^UpdEulerCurveReZoner | | ||
+ | ^EquipotentialReZoner | | ||
+ | ^IsoParametric | | ||
+ | ^BlendedReZoner | ||
+ | |||
+ | (1) Quads/Hexa only! \\ | ||
+ | (2) Structuré | ||
+ | |||
+ | ==== Pilotage " | ||
+ | |||
+ | Il est possible de piloter le maillage à l'aide de fonction définies par un ensemble de points exactement comme c'est le cas pour les fixations " | ||
+ | |||
+ | Les fixations du maillage sont une manière simple de piloter la position le maillage en ALE en fonction du temps. Il est conseillé d' | ||
+ | |||
+ | Voir [[doc: | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ==== Note sur les déplacements/ | ||
+ | |||
+ | Les [[doc: | ||
+ | |||
+ | domain.getLoadingSet().define(curset(1), | ||
+ | |||
+ | applique un déplacement incrémental suivant la fontion fct selon '' | ||
+ | |||
+ | __Note:__ depuis 2008, '' | ||
+ | \\ | ||
+ | \\ | ||
+ | \\ | ||
+ | \\ | ||
+ | \\ | ||
+ | |||
+ | ===== Commandes de Convection ===== | ||
+ | |||
+ | ==== Introduction ==== | ||
+ | |||
+ | La deuxième étape de la deuxième phase de l' | ||
+ | |||
+ | De quelles données s' | ||
+ | |||
+ | * __du matériau__ : il faut par exemple transférer les contraintes si le matériau est mécanique, les défos plastiques si le matériau est élastoplastique, | ||
+ | * __du type d' | ||
+ | * __du schéma d' | ||
+ | |||
+ | Elles sont donc de deux types: des données "aux points d' | ||
+ | |||
+ | Tous ces choix sont automatiques et l' | ||
+ | |||
+ | Pour rappel, l' | ||
+ | |||
+ | conv = ale.getTransferStep() | ||
+ | |||
+ | |||
+ | ==== Régions ALE ==== | ||
+ | |||
+ | Pour pouvoir faire des problèmes mixtes où seule une partie du problème est ALE, on définit des " | ||
+ | |||
+ | Pour simplifier les choses, chaque interaction de Metafor peut engendrer une région ALE. Il n'est donc pas possible de faire 2 régions hors d'une interaction. Ceci n'est pas restrictif puisqu' | ||
+ | |||
+ | Pour définir une région ALE à partir d'une interaction noméée '' | ||
+ | |||
+ | region = conv.get(app) | ||
+ | |||
+ | La région va générer les convecteurs nécessaires en fonction des éléments, du matériau et du schéma d' | ||
+ | |||
+ | region.ignore(IF_FTOTAL) | ||
+ | |||
+ | Dans ce cas, on veut ignorer la convection du tenseur F. ceci aura pour conséquence que toutes les mesures de défos seront fausses en sortie. Si on n'a pas besoin de ces grandeurs, on économise 9 convections! Cette commande est dangereuse puisqu' | ||
+ | |||
+ | |||
+ | |||
+ | ==== Configuration des convecteurs ==== | ||
+ | |||
+ | |||
+ | Il existe actuellement deux types de convecteurs. Tout deux utilisent la méthode des volumes finis et créent des maillages auxiliaires pour gérer le transfert des données. Ces maillages sont générés automatiquement en fonction des grandeurs à convecter. A chaque maillage est associé un convecteur et une liste de variables. | ||
+ | |||
+ | Le type de convection est géré par le type de l' | ||
+ | |||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | Le choix de la méthode est fait par ajout d'un '' | ||
+ | |||
+ | cPrp = ElementProperties(GodunovConvCell) | ||
+ | cPrp.put (UPWIND_COEFF, | ||
+ | region.add(cPrp) | ||
+ | |||
+ | De cette manière, tous les convecteurs générés sur cette région utiliseront ces propriétés. Il est également possible de configurer chaque convecteur séparement. pour les désigner, il suffit de spécifier une variable: | ||
+ | |||
+ | region.add(IF_DEV_SIG_XX, | ||
+ | |||
+ | Le convecteur qui transfère les contraintes et toutes les autres grandeurs définies sur les mêmes points d' | ||
+ | |||
+ | |||
+ | === Méthode de Godunov === | ||
+ | |||
+ | L' | ||
+ | |||
+ | === Méthode de reconstruction linéaire === | ||
+ | |||
+ | Cette méthode plus précise mais plus coûteuse permet de capter de manière plus correcte d' | ||
+ | |||
+ | L' | ||
+ | |||
+ | * Le type de stencil: | ||
+ | * '' | ||
+ | * '' | ||
+ | * Le type de limiteur: | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | Exemple: | ||
+ | |||
+ | cPrp = ElementProperties(LinearRecConvCell) | ||
+ | cPrp.put (STENCILTYPE, | ||
+ | cPrp.put (LIMITERTYPE, | ||
+ | region.add(cPrp) | ||
+ | |||
+ | |||
+ | === Sub-stepping === | ||
+ | |||
+ | Les méthodes de convection étant explicites, elles sont conditionnellement stables. | ||
+ | Pour ne pas être limité par le pas de temps de la convection, il est possible de faire la convection en plusieurs pas (sous pas de convection). L' | ||
+ | |||
+ | __Méthode #1:__ | ||
+ | |||
+ | ale.getTransferStep().setSubStepping(n) | ||
+ | |||
+ | divise chaque pas de convection en '' | ||
+ | |||
+ | __Méthode #2:__ | ||
+ | |||
+ | ale.getTransferStep().setAutoSubStepping(cflMax) | ||
+ | ale.getTransferStep().setCriticalCfl(cflCrit) | ||
+ | |||
+ | divise automatiquement le pas de convection pour que le '' | ||
+ | |||
+ | |||
+ | ==== Définition des conditions aux limites ==== | ||
+ | |||
+ | Lorsque la matière est susceptible d' | ||
+ | |||
+ | Si on veut appliquer d' | ||
+ | |||
+ | Cette interaction est de type '' | ||
+ | '' | ||
+ | |||
+ | prp = ElementProperties(BoundaryCell) | ||
+ | prp.put(MATERIAL, | ||
+ | |||
+ | bci = BcInteraction(1) | ||
+ | bci.push(curveset(5)) | ||
+ | bci.addProperty(prp) | ||
+ | |||
+ | region.getInteractionSet().add(bci) | ||
+ | |||
+ | Ces lignes vont définir des éléments de condition aux limites sur la ligne #5. Ceux-ci se comporteront par défaut exactement comme s'ils n' | ||
+ | |||
+ | |||
+ | |||
+ | <note important> | ||
+ | |||
+ | |||
+ | Pour profiter de ces éléments, il faut ensuite spécifier des valeurs. Ceci se fait à l'aide d'un '' | ||
+ | |||
+ | region.getLoadingSet().define(bci, | ||
+ | region.getLoadingSet().define(bci, | ||
+ | |||
+ | Ces commandes imposent une valeur 0.0 en entrée aux composantes de cisaillement du tenseur gradient de défos. | ||
+ | |||
+ | ===== Commandes de post ALE ===== | ||
+ | |||
+ | Après convection, certaines opérations doivent être effectuées. Il s'agit par exemple de recalculer le glissement des contacts avec frottement ou recalculer une matrice des masses sur le nouveau maillage. | ||
+ | |||
+ | Chaque region execute une commande de post-processing. Pour ce qui est des contacts, il faut explicitement spécifier que l'on veut les rééquilibrer. Cela se fait par la commande: | ||
+ | |||
+ | ale.getPostStep().add(ci1) | ||
+ | |||
+ | où '' | ||
+ |