Tutoriel: Ajouter des équations FEM

From FreeCAD Documentation
Revision as of 11:20, 23 March 2019 by David69 (talk | contribs)
Tutorial
Topic
Level
Time to complete
Authors
M42kus
FreeCAD version
Example files
See also
None

Dans ce tutoriel, nous allons ajouter l'équation de flux à FreeCAD et implémenter le support pour le solveur Elmer. Assurez-vous d'avoir lu et compris Module d'extension FEM avant de lire ce tutoriel.

La tâche peut être divisée en quatre parties:

  • La première étape consiste à informer l'atelier de travail FEM d'un nouveau type d'équation. Cette étape ne doit être effectuée que si l'équation n'existe pas encore dans FreeCAD (par opposition à une équation qui est déjà dans FreeCAD mais qui n'est pas prise en charge par le solveur cible).
  • La deuxième étape consiste à ajouter un objet document représentant l’équation spécifique d’Elmer.
  • La troisième étape consiste à ajouter la prise en compte de la nouvelle équation dans le solveur d'Elmer.
  • Après cela, l'exportation d'analyse sous Elmer doit être étendue pour prendre en charge le nouveau type d'équation.

Ajout d'un nouveau type d'équation

Dans cette étape, nous allons modifier les fichiers suivants:

  • src/Mod/Fem/FemSolver/EquationBase.py
  • src/Mod/Fem/PyGui/_CommandFemEquation.py
  • src/Mod/Fem/Workbench.cpp
  • src/Mod/Fem/Gui/Resources/Fem.qrc

Le type d'équation est partagé par tous les objets d'équation des différents solveurs. Chaque type a un spécificateur de chaîne (par exemple "Heat") et une commande dédiée qui ajoute l'équation au solveur sélectionné. Cela permet une interface graphique plus simple dans laquelle nous n’avons qu’un bouton pour l’équation de la chaleur utilisée par tous les solveurs supportés.

Ajoutez d’abord la nouvelle équation au module EquationBase. Chaque équation nécessite deux classes. Un proxy document et un proxy vue. Copiez-les simplement à partir d'un type d'équation existant et ajustez le chemin de l'icône à l'intérieur de getIcon(self) du proxy vue.

class FlowProxy(BaseProxy):
    pass

class FlowViewProxy(BaseViewProxy):
    def getIcon(self):
        return ":/icons/fem-equation-flow.svg"

Ces deux classes seront ensuite utilisées comme classes de base pour les classes d’équations spécifiques d’Elmer. En plus de ces classes de base, nous devons créer une nouvelle classe de commandes qui ajoute une équation de flux au solveur sélectionné. En outre, le nouveau fichier .svg doit être enregistré ainsi <file>icons/fem-equation-flow.svg</file> dans Fem.qrc.

La commande doit être ajoutée au module _CommandFemEquation. Copiez simplement une commande existante et ajustez l'icône, le texte du menu et l'info-bulle dans GetResources(self) ainsi que le spécificateur dans getSpecifier(self). Nous aurons besoin du spécificateur à nouveau plus tard dans le tutoriel. N'oubliez pas d'enregistrer la commande au bas du fichier de module en utilisant la méthode addCommand(...).

class Flow(_Base):

    def getSpecifier(self):
        return "Flow"

    def GetResources(self):
        return {
            'Pixmap': 'fem-equation-flow',
            'MenuText': "Flow Equation",
            'ToolTip': "Add flow equation to selected solver."
        }

Gui.addCommand('FEM_AddEquationFlow', Flow())

Notre commande nouvellement créée doit toujours être accessible via l'interface graphique de l'atelier de travail FEM. Pour l'ajouter à la barre d'outils, recherchez le bout de code suivant dans Workbench.cpp et ajoutez la nouvelle commande au reste des commandes d'équation.

 Gui::ToolBarItem* solve = new Gui::ToolBarItem(root);
 solve->setCommand("Solve");
 *solve << "FEM_SolverCalculix"
       << "FEM_AddSolverElmer"
       << "Separator"
       << "FEM_AddEquationHeat"
       << "FEM_AddEquationElasticity"
 +      << "FEM_AddEquationFlow"
       << "Separator"
       << "FEM_SolverControl"
       << "FEM_SolverRun";

Nous allons également ajouter la commande d’équation de flux au menu de résolution de l'atelier FEM. Pour ce faire, insérez notre équation dans l'extrait de code suivant dans Workbench.cpp.

 Gui::MenuItem* solve = new Gui::MenuItem;
 root->insertItem(item, solve);
 solve->setCommand("&Solve");
 *solve << "FEM_SolverCalculix"
        << "FEM_SolverZ88"
        << "FEM_AddSolverElmer"
        << "Separator"
        << "FEM_AddEquationHeat"
        << "FEM_AddEquationElasticity"
 +       << "FEM_AddEquationFlow"
        << "Separator"
        << "FEM_SolverControl"
        << "FEM_SolverRun";

Ajout de l'équation dans Elmers

Dans cette étape, nous allons modifier les fichiers suivants:

  • src/Mod/Fem/CMakeLists.txt
  • src/Mod/Fem/App/CMakeLists.txt

et ajoutez le nouveau fichier suivant:

  • src/Mod/Fem/FemSolver/Elmer/Equations/Flow.py

Commençons par le module qui implémente l'objet document. Il peut être copié à partir d'une équation existante.

  • Si la nouvelle équation ne prend en charge que les mots-clés des systèmes linéaires, copiez le module FemSolver/Elmer/Equations/Elasticity.py.
  • S'il prend également en charge les mots-clés non linéaires, copiez FemSolver/Elmer/Equations/Heat.py.

L'équation de l'écoulement dans Elmer est une équation potentiellement non linéaire. Cela signifie que nous allons focaliser notre travail sur Heat.py.

Après avoir copié Heat.py dans Flow.py, ajustez

  • l’argument name de la fonction create module,
  • l’attribut Type de la classe Proxy
  • les classes de base des classes Proxy et ViewProxy
  • ainsi que les propriétés ajoutées via obj.addProperty(..) à ceux requis par l'équation.
def create(doc, name="Flow"):
    return FemMisc.createObject(
        doc, name, Proxy, ViewProxy)

class Proxy(Nonlinear.Proxy, FemEquation.FlowProxy):
    Type = "Fem::FemEquationElmerFlow"
    def __init__(self, obj):
        super(Proxy, self).__init__(obj)
        obj.Priority = 10

class ViewProxy(Nonlinear.ViewProxy, FemEquation.FlowViewProxy):
    pass

Au moment de la rédaction de ce tutoriel, l'équation de flux Elmer n'a aucunes propriétés particulières. Voir l'équation d'élasticité d'Elmer pour un exemple avec des propriétés.

Enfin et surtout, enregistrez le nouveau fichier de module (Flow.py) dans les deux fichiers CMakeLists.txt comme décrit dans Module d'extension FEM. Les listes appropriées peuvent être facilement trouvées en recherchant les fichiers de modules d’équations existants d’Elmer.

Extension de l'objet du solveur

Dans cette étape, nous allons modifier le fichier suivant:

  • src/Mod/Fem/FemSolver/Elmer/Object.py

A cette étape, FreeCAD est informé de l'existence d'un nouveau type d'équation et nous avons même ajouté une commande qui ajoute cette équation à l'objet solveur sélectionné. Nous avons également implémenté un objet d'équation concret pour elmer. Que reste-t-il à faire maintenant pour établir le lien entre elmer et l’équation du flux. Cela doit être fait directement dans l'objet solveur elmers.

Enregistrez le module dans lequel nous venons d'implémenter notre nouvel objet équation (Flow.py) avec le spécificateur d'équation de l'étape 1 ("Flow") dans la liste Proxy._EQUATIONS dans Elmer/Object.py.

_EQUATIONS = {
    "Heat": Equations.Heat,
    "Elasticity": Equations.Elasticity,
+    "Flow": Equations.Flow,
}

Extension de l'analyse à l'export

Dans cette étape, nous allons modifier le fichier suivant:

  • src/Mod/Fem/FemSolver/Elmer/Writer.py

C'est la partie la plus exigeante de la mise en œuvre d'une nouvelle équation. Ce fichier contient une classe Writer qui exporte l'analyse au format elmers sif.

Pour chaque équation prise en charge, il existe une série de méthodes gérant l'exportation de l'équation respective. Copiez-les simplement à partir d'une équation existante et ajustez-les à vos besoins. Notre équation de flux utilise les méthodes suivantes:

  • _handleFlow
  • _getFlowSolver
  • _handleFlowConstants
  • _handleFlowBndConditions
  • _handleFlowInitial
  • _handleFlowBodyForces
  • _handleFlowMaterial
  • _handleFlowEquation