Add FEM Equation Tutorial/fr: Difference between revisions

From FreeCAD Documentation
(Created page with "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...")
(Created page with "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 Pr...")
Line 88: Line 88:
L'équation de l'écoulement dans elmer est une équation potentiellement non linéaire. Cela signifie que nous allons baser notre travail sur Heat.py.
L'équation de l'écoulement dans elmer est une équation potentiellement non linéaire. Cela signifie que nous allons baser notre travail sur Heat.py.


After copying Heat.py to Flow.py adjust - the name argument of the create module function, - the Type attribute of the Proxy class, - the base classes of the Proxy and the ViewProxy classes, - and the properties added via the obj.addProperty(..) function to those needed by the equation.
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.
<pre>def create(doc, name=&quot;Flow&quot;):
<pre>def create(doc, name=&quot;Flow&quot;):
return FemMisc.createObject(
return FemMisc.createObject(

Revision as of 14:20, 22 March 2019

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 concret représentant l’équation spécifique d’Elmer.
  • La troisième étape consiste à ajouter un support pour la nouvelle équation à l’objet solveur d’elmer.
  • Après cela, l'exportation d'analyse d'elmer doit être étendue pour prendre en charge le nouveau type d'équation.

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é entre 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 qui est utilisée pour tous les solveurs supportés.

Ajoutez d’abord la nouvelle équation au module EquationBase. Chaque équation nécessite deux classes. Un proxy de document et un proxy de 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 de 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 à l'objet solveur sélectionné. En outre, le nouveau fichier .svg doit être enregistré auprès de <file>icons/fem-equation-flow.svg</file> in 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 l'extrait 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 du plan de travail 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";

L'équation 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 baser 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

At the moment of writing this tutorial elmers flow equation doesn't have any special properties. See elmers elasticity equation for an example with properties.

Last but not least register the new module file (Flow.py) in both CMakeLists.txt files the way descripted in Extend FEM Module. The suitable lists can be easily found by searching for existing equation modules files of elmer.

Extend Solver Object

In this step we are going to modify the following file:

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

Right now we made FreeCAD aware that there is a new type of equation and even added a command that adds this equation to the selected solver object. We also implemented a concrete equation object for elmer. Whats left to do now it to make the connection beween elmer and the flow equation. This must be done directely in elmers solver object.

Register the module in which we just implemented our new equation object (Flow.py) with the equation specifier from step 1 ("Flow") in the Proxy._EQUATIONS list in Elmer/Object.py.

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

Extend Analysis Export

In this step we are going to modify the following file:

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

This is the most demaning part of implementing a new equation. This file contains a Writer class which exports the analysis into elmers sif format.

For every supported equation there are a series of methods handling the export of the respective equation. Just copy all of them from an existing equation and adjust them to your needs. Our Flow equation uses the following methods:

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