Add FEM Equation Tutorial/it: Difference between revisions

From FreeCAD Documentation
(Updating to match new version of source page)
(Created page with "In questo passaggio modificheremo il seguente file:")
 
(22 intermediate revisions by 3 users not shown)
Line 1: Line 1:
<languages/>
<languages/>

{{TutorialInfo/it
{{TutorialInfo/it
|Topic=
|Topic=Aggiungere equazioni FEM
|Level=
|Level=
|Time=
|Time=
Line 8: Line 9:
|Files=
|Files=
}}
}}

<span id="Introduction"></span>
== Introduzione ==


In questo tutorial aggiungeremo a FreeCAD l'equazione di flusso e implementeremo il supporto per il risolutore elmer. Prima di leggere questo tutorial è necessario aver letto e compreso il tutorial [[Extend_FEM_Module/it| Estendere il modulo FEM]].
In questo tutorial aggiungeremo a FreeCAD l'equazione di flusso e implementeremo il supporto per il risolutore elmer. Prima di leggere questo tutorial è necessario aver letto e compreso il tutorial [[Extend_FEM_Module/it| Estendere il modulo FEM]].


The task can be split into five parts:
The task can be split into four parts. The first step is to make the FEM workbench aware of a new type of equation. This step must only be done if the equation doesn't exist in FreeCAD jet (as opposed to a equation that is already in FreeCAD but not supported by the target solver). The secound step is to add a concrete document object representing the elmer specific equation. The third step is to add support for the new equation to the solver object of elmer. After that the analysis export of elmer must be extended to support the new equation type.
* '''New equation type'''. This step must only be done if the equation doesn't exist in FreeCAD yet (as opposed to an equation that is already in FreeCAD but not supported by the target solver).
* '''New equation object'''. Adding a concrete document object representing the Elmer-specific equation.
* '''Extend solver object'''. Adding support for the new equation to the solver object of Elmer.
* '''Extend writer object'''. Extending the analysis export of Elmer to support the new equation type.
* '''Gui tool to create an equation'''. Access the new equation function through workbench Gui.


<span id="New_equation_type"></span>
== New Equation Type ==
== Nuovo tipo di equazione ==


In questo passaggio modificheremo il seguente file:
In this step we are going to modify the following files:
* src/Mod/Fem/femsolver/equationbase.py
* src/Mod/Fem/femcommands/commands.py
* src/Mod/Fem/Gui/Workbench.cpp
* src/Mod/Fem/Gui/Resources/Fem.qrc
The equation type is shared among all equation objects of the different solver. Each type has a string specifier (e.g. &quot;Heat&quot;) and a dedicated command that adds the equation to the selected solver. This allows for a simpler GUI where we have only one button for the heat equation which is used for all supported solver.


* {{FileName|src/Mod/Fem/femsolver/equationbase.py}}
First add the new equation to the {{incode|equationbase.py}} module. Each equation requires two classes. A document proxy and a view proxy. Just copy-paste them from an existing equation type and adjust the icon path inside getIcon(self) of the view proxy.

<pre>class FlowProxy(BaseProxy):
The equation type is shared among all equation objects of the different solvers. Each type has a string specifier (e.g. "Heat") and a dedicated command that adds the equation to the selected solver. This allows for a simpler GUI where we have only one button for the heat equation which is used for all supported solver.

First, add the new equation to the {{Incode|equationbase.py}} module. Each equation requires two classes. A document proxy and a view proxy. Those two classes will later be used as base classes for the Elmer-specific equation classes. Just copy-paste them from an existing equation type and adjust the icon path inside {{Incode|getIcon(self)}} of the view proxy.

{{Code|code=
class FlowProxy(BaseProxy):
pass
pass


class FlowViewProxy(BaseViewProxy):
class FlowViewProxy(BaseViewProxy):
def getIcon(self):
def getIcon(self):
return &quot;:/icons/FEM_EquationFlow.svg&quot;</pre>
return ":/icons/FEM_EquationFlow.svg"
}}


<span id="New_Elmer&#039;s_equation_object"></span>
Those two classes will later be used as base classes for the Elmer specific equation classes. In addition to those base classes we have to create a new command class that adds a flow equation to the selected solver object. Additionally, the new .svg image has to be registered for the GUI-button with {{incode|<file>icons/FEM_EquationFlow.svg</file>}} in {{incode|Fem.qrc} (in {{incode|/Gui/Resources/}}). The related .svg has to be put into {{incode|/Gui/Resources/icons/}}.
== Nuovo oggetto equazione di Elmer ==


In questo passaggio implementeremo l'oggetto documento. Dobbiamo aggiungere un nuovo file {{Incode|flow.py}} in:
The command should be added to the {{incode|femcommands/commands.py}} module. Just copy an existing command and adjust the icon, menu text and tool-tip in __init__(self). Don't forget to register the command at the bottom of the module file by using the addCommand(...) method. Please see the discussion in the forum at https://forum.freecadweb.org/viewtopic.php?f=18&t=46693&start=10#p402004 if icons are involed.
<pre>
class _EquationFlow(CommandManager):
"The FEM_EquationFlow command definition"


* {{FileName|src/Mod/Fem/femsolver/elmer/equations/flow.py}}
def __init__(self):
super(_EquationFlow, self).__init__()
self.menuetext = "Flow equation"
self.tooltip = "Creates a FEM equation for flow"
self.is_active = "with_solver_elmer"
self.do_activated = "add_obj_on_gui_selobj_noset_edit"
...
FreeCADGui.addCommand(
"FEM_EquationFlow",
_EquationFlow()
)
</pre>


e modificare i seguenti file:
Our newly created command still needs to be made accessible via the GUI of the FEM workbench. To add it to the toolbar search for the following code snippet in {{incode|Workbench.cpp}} and add the new command to the rest of the equation commands.
<pre>
Gui::ToolBarItem* solve = new Gui::ToolBarItem(root);
solve->setCommand("Solve");
*solve << "FEM_SolverCalculixCxxtools"
<< "FEM_SolverCalculiX"
<< "FEM_SolverElmer"
<< "Separator"
<< "FEM_EquationElasticity"
<< "FEM_EquationElectrostatic"
+ << "FEM_EquationFlow"
<< "FEM_EquationFluxsolver"
<< "FEM_EquationElectricforce"
<< "FEM_EquationHeat"
<< "Separator"
<< "FEM_SolverControl"
<< "FEM_SolverRun";
</pre>
We are also going to add the flow equation command to the solve menu of the FEM workbench. To do this insert our equation into the following code snippet in {{incode|Workbench.cpp}}.
<pre>
Gui::MenuItem* solve = new Gui::MenuItem;
root->insertItem(item, solve);
solve->setCommand("&Solve");
*solve << "FEM_SolverCalculixCxxtools"
<< "FEM_SolverCalculiX"
<< "FEM_SolverElmer"
<< "FEM_SolverZ88"
<< "Separator"
<< "FEM_EquationElasticity"
<< "FEM_EquationElectrostatic"
+ << "FEM_EquationFlow"
<< "FEM_EquationFluxsolver"
<< "FEM_EquationElectricforce"
<< "FEM_EquationHeat"
<< "Separator"
<< "FEM_SolverControl"
<< "FEM_SolverRun";
</pre>


* {{FileName|src/Mod/Fem/ObjectsFem.py}}
* {{FileName|src/Mod/Fem/CMakeLists.txt}}


Let's start with adding the new {{Incode|flow.py}} file. This file can be copied from an existing equation.
== Elmer's Equation Object ==


=== Keywords ===
In this step we are going to modify the following file:
* src/Mod/Fem/CMakeLists.txt
and add the following new file:
* src/Mod/Fem/femsolver/elmer/equations/flow.py
Lets start with the module that implements the document object. In can be copied from an existing equation. If the new equation only supports keywords for '''linear''' systems copy the {{incode|femsolver/elmer/equations/elasticity.py}} module. If it supports '''non-linear''' keywords too copy {{incode|femsolver/elmer/equations/heat.py}}. The flow equation in Elmer is a potentially non-linear equation. This means that we are going to base our work on {{incode|heat.py}}.


* If the new equation only supports keywords for '''linear''' systems copy the {{Incode|femsolver/elmer/equations/elasticity.py}} module.
After copying {{incode|heat.py}} to {{incode|flow.py}} adjust - the name argument of the create module function, - the Type attribute of the Proxy class, - the base classes of the {{incode|Proxy}} and the {{incode|ViewProxy}} classes, - and the properties added via the {{incode|obj.addProperty(..)}} function to those needed by the equation.
* If the new equation supports keywords for both '''linear''' and '''non-linear''' systems, copy {{Incode|femsolver/elmer/equations/heat.py}}.
<pre>

def create(doc, name=&quot;Flow&quot;):
The flow equation in Elmer is a potentially non-linear equation. This means that we are going to base our work on {{Incode|heat.py}}.

<span id="Editing_files"></span>
=== Modifica dei file ===

After copying {{Incode|heat.py}} to {{Incode|flow.py}}, adjust {{Incode|flow.py}} in these locations:
* the name argument of the {{Incode|create}} module function,
* the base classes of the {{Incode|Proxy}} class,
* the {{Incode|Type}} attribute of the {{Incode|Proxy}} class,
* the {{Incode|ViewProxy}} classes.

{{Code|code=
def create(doc, name="'''Flow'''"):
return femutils.createObject(
return femutils.createObject(
doc, name, Proxy, ViewProxy)
doc, name, Proxy, ViewProxy)


class Proxy(nonlinear.Proxy, equationbase.'''Flow'''Proxy):


Type = "Fem::EquationElmer'''Flow'''"
class Proxy(nonlinear.Proxy, equationbase.FlowProxy):

Type = &quot;Fem::EquationElmerFlow&quot;


def __init__(self, obj):
def __init__(self, obj):
Line 114: Line 85:
obj.Priority = 10
obj.Priority = 10


class ViewProxy(nonlinear.ViewProxy, equationbase.'''Flow'''ViewProxy):

class ViewProxy(nonlinear.ViewProxy, equationbase.FlowViewProxy):
pass
pass
}}
</pre>
At the moment of writing this tutorial Elmer flow equation doesn't have any special properties. See Elmer elasticity equation for an example with properties.


Then you need to change the properties added via the {{Incode|obj.addProperty(..)}} function to those needed by the equation.
Last but not least register the new module file ({{incode|flow.py}}) in CMakeLists.txt the way described in [https://www.freecadweb.org/wiki/Extend_FEM_Module Extend FEM Module]. The suitable lists can be easily found by searching for existing equation modules files of Elmer.


At the moment of writing this tutorial Elmer flow equation doesn't have any special properties. See the Elmer elasticity equation for an example with properties.
== Extend Solver Object ==


Finally one has to register a '''makeEquationFlow''' definition in {{Incode|src/Mod/Fem/ObjectsFem.py}} by duplicating an available entry.
In this step we are going to modify the following file:

* src/Mod/Fem/femsolver/elmer/solver.py
FreeCAD uses '''make''' to build the program. So we need to register the new module file ({{Incode|flow.py}}) in {{Incode|src/Mod/Fem/CMakeLists.txt}} the way described in [https://www.freecadweb.org/wiki/Extend_FEM_Module Extend FEM Module]. The suitable lists can be easily found by searching for existing equation module files of Elmer.
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 between Elmer and the flow equation. This must be done directly in Elmer solver object.

<span id="Extend_Solver_Object"></span>
== Estendere l'oggetto risolutore ==

In questo passaggio modificheremo il seguente file:

* {{FileName|src/Mod/Fem/femsolver/elmer/solver.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. What's left to do now is to make the connection between Elmer and the flow equation. This must be done directly in the Elmer solver object.

Register the module in which we just implemented our new equation object ({{Incode|flow.py}}) with the equation specifier from step 1 ("Flow") in the {{Incode|_EQUATIONS}} list in {{Incode|elmer/solver.py}}.

{{Code|code=
from .equations import electrostatic
+from .equations import flow

...


Register the module in which we just implemented our new equation object ({{incode|flow.py}}) with the equation specifier from step 1 (&quot;Flow&quot;) in the {{incode|_EQUATIONS}} list in {{incode|elmer/solver.py}}.
<pre>
_EQUATIONS = {
_EQUATIONS = {
&quot;Heat&quot;: heat,
"Heat": heat,
&quot;Elasticity&quot;: elasticity,
"Elasticity": elasticity,
+ &quot;Flow&quot;: flow,
+ "Flow": flow,
}
}
}}
</pre>

<span id="Extend_writer_object"></span>
== Estendere l'oggetto writer ==

In questo passaggio modificheremo il seguente file:

* {{FileName|src/Mod/Fem/femsolver/elmer/writer.py}}

This file contains the {{Incode|Writer}} class which exports the analysis into Elmer SIF format.

For every supported equation, there are two main methods handling the export of the respective equation. Just copy all of them from an existing equation and adjust them to your needs.

* {{Incode|_getFlowSolver}}
* {{Incode|_handleFlow}}

You need to register the {{Incode|_handleFlow}} method inside the {{Incode|Writer}} class:

{{Code|code=
class Writer(object):
...
def write(self):
...
self._handleFlow()

...

}}

{{Incode|_handleFlow}} can control a series of other detailed methods. Our flow equation uses the following detailed methods:

* {{Incode|_handleFlowConstants}}
* {{Incode|_handleFlowMaterial}}
* {{Incode|_handleFlowInitialVelocity}}
* {{Incode|_handleFlowBndConditions}}
* {{Incode|_handleFlowEquation}}


We now finished the function part of the new equation. Next, we'll connect the new equation through the GUI.
== Extend Analysis Export ==


<span id="Gui_tool_to_create_an_equation"></span>
In this step we are going to modify the following file:
== Strumento Gui per creare un'equazione ==
* src/Mod/Fem/femsolver/elmer/writer.py
This is the most demanding part of implementing a new equation. This file contains the {{incode|Writer}} class which exports the analysis into Elmer sif format.


We have just created a new equation class. To access it from the FEM GUI, we need to create a button and link it to the new equation class. Here is a tutorial: [[Add_Button_to_FEM_Toolbar_Tutorial|Add Button to FEM Toolbar Tutorial]].
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
* _handleFlowMaterial
* _handleFlowInitialVelocity
* _handleFlowBndConditions
* _handleFlowEquation


{{clear}}
[[Category:FEM{{#translation:}}]]
[[Category:FEM{{#translation:}}]]
[[Category:Developer Documentation{{#translation:}}]]

Latest revision as of 14:00, 28 April 2024

Tutorial
Argomento
Aggiungere equazioni FEM
Livello di difficoltà
Tempo di esecuzione
Autori
M42kus
Versione di FreeCAD
Files di esempio
Vedere anche
Nessuno

Introduzione

In questo tutorial aggiungeremo a FreeCAD l'equazione di flusso e implementeremo il supporto per il risolutore elmer. Prima di leggere questo tutorial è necessario aver letto e compreso il tutorial Estendere il modulo FEM.

The task can be split into five parts:

  • New equation type. This step must only be done if the equation doesn't exist in FreeCAD yet (as opposed to an equation that is already in FreeCAD but not supported by the target solver).
  • New equation object. Adding a concrete document object representing the Elmer-specific equation.
  • Extend solver object. Adding support for the new equation to the solver object of Elmer.
  • Extend writer object. Extending the analysis export of Elmer to support the new equation type.
  • Gui tool to create an equation. Access the new equation function through workbench Gui.

Nuovo tipo di equazione

In questo passaggio modificheremo il seguente file:

  • src/Mod/Fem/femsolver/equationbase.py

The equation type is shared among all equation objects of the different solvers. Each type has a string specifier (e.g. "Heat") and a dedicated command that adds the equation to the selected solver. This allows for a simpler GUI where we have only one button for the heat equation which is used for all supported solver.

First, add the new equation to the equationbase.py module. Each equation requires two classes. A document proxy and a view proxy. Those two classes will later be used as base classes for the Elmer-specific equation classes. Just copy-paste them from an existing equation type and adjust the icon path inside getIcon(self) of the view proxy.

class FlowProxy(BaseProxy):
    pass

class FlowViewProxy(BaseViewProxy):
    def getIcon(self):
        return ":/icons/FEM_EquationFlow.svg"

Nuovo oggetto equazione di Elmer

In questo passaggio implementeremo l'oggetto documento. Dobbiamo aggiungere un nuovo file flow.py in:

  • src/Mod/Fem/femsolver/elmer/equations/flow.py

e modificare i seguenti file:

  • src/Mod/Fem/ObjectsFem.py
  • src/Mod/Fem/CMakeLists.txt

Let's start with adding the new flow.py file. This file can be copied from an existing equation.

Keywords

  • If the new equation only supports keywords for linear systems copy the femsolver/elmer/equations/elasticity.py module.
  • If the new equation supports keywords for both linear and non-linear systems, copy femsolver/elmer/equations/heat.py.

The flow equation in Elmer is a potentially non-linear equation. This means that we are going to base our work on heat.py.

Modifica dei file

After copying heat.py to flow.py, adjust flow.py in these locations:

  • the name argument of the create module function,
  • the base classes of the Proxy class,
  • the Type attribute of the Proxy class,
  • the ViewProxy classes.
def create(doc, name="'''Flow'''"):
    return femutils.createObject(
        doc, name, Proxy, ViewProxy)

class Proxy(nonlinear.Proxy, equationbase.'''Flow'''Proxy):

    Type = "Fem::EquationElmer'''Flow'''"

    def __init__(self, obj):
        super(Proxy, self).__init__(obj)
        obj.Priority = 10

class ViewProxy(nonlinear.ViewProxy, equationbase.'''Flow'''ViewProxy):
    pass

Then you need to change the properties added via the obj.addProperty(..) function to those needed by the equation.

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

Finally one has to register a makeEquationFlow definition in src/Mod/Fem/ObjectsFem.py by duplicating an available entry.

FreeCAD uses make to build the program. So we need to register the new module file (flow.py) in src/Mod/Fem/CMakeLists.txt the way described in Extend FEM Module. The suitable lists can be easily found by searching for existing equation module files of Elmer.

Estendere l'oggetto risolutore

In questo passaggio modificheremo il seguente file:

  • src/Mod/Fem/femsolver/elmer/solver.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. What's left to do now is to make the connection between Elmer and the flow equation. This must be done directly in the Elmer 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 _EQUATIONS list in elmer/solver.py.

from .equations import electrostatic
+from .equations import flow

...

_EQUATIONS = {
    "Heat": heat,
    "Elasticity": elasticity,
+    "Flow": flow,
}

Estendere l'oggetto writer

In questo passaggio modificheremo il seguente file:

  • src/Mod/Fem/femsolver/elmer/writer.py

This file contains the Writer class which exports the analysis into Elmer SIF format.

For every supported equation, there are two main methods handling the export of the respective equation. Just copy all of them from an existing equation and adjust them to your needs.

  • _getFlowSolver
  • _handleFlow

You need to register the _handleFlow method inside the Writer class:

class Writer(object):
...
    def write(self):
...
        self._handleFlow()

...

_handleFlow can control a series of other detailed methods. Our flow equation uses the following detailed methods:

  • _handleFlowConstants
  • _handleFlowMaterial
  • _handleFlowInitialVelocity
  • _handleFlowBndConditions
  • _handleFlowEquation

We now finished the function part of the new equation. Next, we'll connect the new equation through the GUI.

Strumento Gui per creare un'equazione

We have just created a new equation class. To access it from the FEM GUI, we need to create a button and link it to the new equation class. Here is a tutorial: Add Button to FEM Toolbar Tutorial.