Rien

Rien
Amélioration du lissage de mailles surfaciques: j'ai modifié les méthodes de lissage 2D pour qu'elles fonctionnent également pour des surfaces 3D. Ca permet, par exemple, d'utiliser le lissage isoparametrique itératif pour des surfaces maillées de manière non uniformes et récupérer un maillage lissé non uniforme bien foutu.
- Ajout de la méthode usePlane() pour les méthodes de lissage 2D: en utilisant cette option, l'algorithme travaille dans le plan tangent à la surface (c'est ce qui à l'air d'être fait dans le code "Ls-Dyna"). L'option usePlane() est indépendante de l'option keepShape() qui reprojette la solution obtenue dans le plan tangent sur une surface reconstruite à partir du maillage déformé. Inutile de dire que j'ai pas économisé la RAM (ni le CPU) dans cette première version.
- Suppression de OldSplineSurface : comme son nom l'indique, elle est vieille.
- Nouvelle méthode (LastStepReZoner) : permet de repositionner les noeuds à la position qu'ils occupaient au pas précédent. Utilisée seule, cette méthode ne sert pas à grand chose. Par contre elle peut être utilisée comme une première étape lors d'un lissage itératif pour la simulation de cas-tests stationnaires (quasi-eulériens). Dans ce cas, la solution au pas de temps précédent est souvent plus proche du lissage final que la solution lagrangienne.
- Ajout de BoundaryReZoner::simpleProjection() : effectue une simple projection sur la surface au lieu d'une intersection.
Amélioration des mailleurs 1D:
- L'ancien mailleur 1D a été renommé SimpleMesher1D et dérive de Mesher1D. Pour rappel, ce mailleur prend un nombre d'éléments et, éventuellement un facteur de distribution.
- Nouveau mailleur 1D (DensityMesher1D) : maille une ligne en fct d'une densité de maille (j'ai adapté le code de Laurent Stainer - ZMesh). En fait, c'est pas la densité mais plutôt la longueur locale - mais bon j'aimais bien le nom. Un example ci-dessous:
ellength = PieceWiseLinearFunction()
ellength.setdata(0,0.1)
ellength.setdata(0.29,0.1)
ellength.setdata(0.3,0.01)
ellength.setdata(0.5,0.01)
ellength.setdata(0.51,0.1)
ellength.setdata(1,0.2)
mesher = DensityMesher1D(curset(1), ellength)
mesher.execute()
mesher = DensityMesher1D(curset(3), ellength); mesher.reverseOn()
mesher.execute() |
 |
Prise en charge des fonctions interprétées python comme "OneParameterFunction" :
L'idée est simple : pouvoir faire passer une fonction python (ou tout objet appelable - voir plus loin) comme OneParameterFunction.
Ceci permet de :
- configurer mon nouveau mailleur.
- piloter la plupart des objets metafor de manière plus évoluée
- définir une fonction d'écrouissage par python (faudra essayer) - bientôt le matériau "utilisateur" tant attendu par JPP!
Ce que j'ai fait:
- Création du nouvel objet PythonOneParameterFunction qui
interface une fonction python avec l'objet d'Oofelie gérant les fonctions
à un paramètre.
- A FAIRE: définir les fonctions de dérivation et d'intégration
(j'ai pas fait vu que j'utilise pas). En fait, il faudrait s'arranger pour
faire une dérivation/intégration numérique par défaut
et, éventuellement, l'utilisateur pourrait définir lui-même
sous python les dérivées et primitives de manière analytique,
...
Pour quelques exemples simples, voir doc
Autre application: mon nouveau mailleur: on utilise une densité sinusoïdale:
def ellengthfct(s):
return 0.02*math.sin(5*s*math.pi)+0.03;
ellength = PythonOneParameterFunction(ellengthfct)
mesher = DensityMesher1D(curset(1), ellength)
mesher.execute()
mesher = DensityMesher1D(curset(3), ellength); mesher.reverseOn()
mesher.execute() |
 |
Allez, un petit dernier, rien que pour vous dégouter
de la puissance de python: je crée un "objet fonction" python
(si, si ça existe) que je vais paramétrer entre les deux opérations
de maillage pour supprimer l'appel à DensityMesher1D::reverseOn().
J'ai changé la fonction de densité en une fonction non symmétrique
pour montrer que c'est pas du pipeau! A côté, les deux résultats
avec et sans object.reverse=True
class SinLengthCalculator:
def __init__(self):
self.reverse = False
def compute(self, s):
s2=s;
if(self.reverse): s2=1-s
return 0.1*s2+0.01;
object = SinLengthCalculator()
ellength = PythonOneParameterFunction(object.compute)
mesher = DensityMesher1D(curset(1), ellength)
mesher.execute()
mesher = DensityMesher1D(curset(3), ellength); object.reverse = True
mesher.execute() |


|
J'ai modifié cont2 pour qu'il utilise la fct rampe interprétée
et un DensityMesher1D (densité constante).
Fichiers supprimés:
mtAle/OldSplineSurface.*
mtAle/TmReZoner.*
Fichiers ajoutés:
mtAle/LastStepReZoner.*
mtAle/Tm2DReZoner.*
mtAle/Tm3DReZoner.*
mtMeshers/SimpleMesher1D.*
mtMeshers/DensityMesher2D.*
mtPython/PythonOneParameterFunction.*