4. Script ou modèles mathématiques

La partie qui suit dans le fichier XML de la simulation est soit composée d'un script Scilab (balise script), soit de la définition des modèles mathématiques régissant la simulation (balise compute), ce dernier cas étant celui qui colle le mieux à la philosophie de XMLlab.

4.1. Script

Il s'agit d'un script Scilab, qui est en charge de l'exécution de la simulation, les paramètres définis étant accessibles comme des variables matrices Scilab (1x1 pour les scalaires) :

  une et une seule fois :
  <script href="chemin d'un fichier de script à exécuter">
    code Scilab à exécuter
      -> pouvant faire intervenir tout paramètre de la simulation ;
         ignoré si l'attribut href est présent
  </script>

4.2. Modèles mathématiques

Cette section - qui suit la balise </parameters> - permet de définir les équations à résoudre, les courbes à calculer, ainsi que les domaines de valeurs (1D ou 2D) que certaines variables doivent prendre. Voici la structure de la définition des paramètres :

  une et une seule fois :
  <compute>

    aucune ou plusieurs fois :
    <defdomain1d | 
     defdomain2d | 
     ode | 
     implicitfunction |
     stationary-pde |
     nonparametriccurve2d | 
     parametriccurve2d | 
     parametriccurve3d | 
     nonparametricsurface |
     parametricsurface |
     polyline>... balises détaillées dans les paragraphes qui suivent

  </compute>

4.2.1. Balises defdomain1d et refdomain1d

  • Balise defdomain1d : il s'agit de la définition d'un domaine de valeurs en une dimension, donc un intervalle, qui indique l'ensemble des valeurs discrètes prises par une variable (par exemple une variable d'intégration). L'intervalle est découpé au choix linéairement ou logarithmiquement en un nombre de pas donné :

        <defdomain1d label="id_domaine1d" unit="unité de la variable">
    
          aucune ou plusieurs fois :
          <name lang="french|english|german|spanish">
            nom de la variable tel qu'il apparaît dans
            le fichier de sauvegarde de la simulation
          </name>
    
          une et une seule fois :
          <interval discretization="linear|log"
                    steps="nombre de pas de découpe (100 par défaut)">
    
            <initialvalue>
              valeur initiale
            </initialvalue>
    
            <finalvalue>
              valeur finale
            </finalvalue>
    
          </interval>
    
        </defdomain1d>
  • Balise refdomain1d : il s'agit de la référence à un domaine de valeurs en une dimension définie par une balise defdomain1d, qui permet par exemple dans la définition d'un calcul d'intégration, de définir les valeurs prises par la variable d'intégration :

          <refdomain1d ref="ref_id_domaine1d">
          </refdomain1d>

4.2.2. Balises defdomain2d et refdomain2d

  • Balise defdomain2d : il s'agit de la définition d'un domaine de valeurs en deux dimensions qui indique l'ensemble des valeurs discrètes prises par une variable 2D. Il peut au choix être défini de deux manières différentes :

    • par une balise rectangle comprenant deux intervalles, chacun d'entre eux étant défini sur place ou par référence,

    • par une balise border, comprend la définition de une ou plusieurs courbes paramétriques 2D spécifiant la frontière du domaine 2D.

        <defdomain2d label="id_domaine2d"
                     dependencies="liste_label_param">
                       -> le séparateur de la liste est l'espace ;
                          on indique ainsi que cet élément de calcul ne dépend
                          que des paramètres listés, ce qui permet de ne pas
                          effectuer de recalculs inutiles, à savoir
                          la triangulation du domaine si celui-ci est défini
                          via une balise <border>
    
          aucune ou plusieurs fois :
          <name lang="french|english|german|spanish">
            nom du domaine 2D tel qu'il apparaît dans
            le fichier de sauvegarde de la simulation
          </name>
    
          une et une seule fois :
          <rectangle>
            Définition du premier intervalle de valeurs (cf. § Section 4.2.1, « Balises defdomain1d et
              refdomain1d ») :
            <defdomain1d>...
              OU
            <refdomain1d>...
            Définition du deuxième intervalle de valeurs :
            <defdomain1d>...
              OU
            <refdomain1d>...     
          </rectangle>
            OU
          <border>
            une ou plusieurs fois :
            <parametriccurve2d>... cf Section 4.2.7, « Balise parametriccurve2d »
          </border>
    
        </defdomain2d>
  • Balise refdomain2d : il s'agit de la référence à un domaine de valeurs en deux dimensions définie par une balise defdomain2d :

          <refdomain2d ref="ref_id_domaine2d">
          </refdomain2d>

4.2.3. Balise ode

Elle permet de définir un système d'équations différentielles (ordinary differential equation) :

    <ode label="id_ode"
         dependencies="liste_label_param">
           -> le séparateur de la liste est l'espace ;
              on indique ainsi que cet élément de calcul ne dépend
              que des paramètres listés, ce qui permet de ne pas
              effectuer de recalculs inutiles
      ...
    </ode>

Elle regroupe les éléments suivants :

  • le domaine de variation de la variable d'intégration :

          une et une seule fois :
          (cf. § Section 4.2.1, « Balises defdomain1d et
              refdomain1d »)
          <defdomain1d>...
            OU
          <refdomain1d>...
  • la définition des états, qui sont les fonctions intervenant dans les différentes équations, avec pour chacune d'elles sa dérivée et sa valeur à l'instant initial ; des variables intermédiaires de calcul peuvent être définies pour simplifier l'écriture des formules des états :

          une et une seule fois :
          <states>
    
            aucune ou plusieurs fois :
            <variable label="id_variable_etat">
              formule de calcul de la variable intermédiaire
            </variable>
    
            une ou plusieurs fois :
            <state label="id_etat"
                   size="1|2"
                     -> 1 : scalaire, 2 : vecteur à 2 composantes
                   unit="unité_etat">
    
              une ou plusieurs fois :
              <name lang="french|english|german|spanish">
                nom de l'état tel qu'il apparaît dans
                le fichier de sauvegarde de la simulation
              </name>
    
              une et une seule fois :
              <derivative>
                dérivée de l'état
              </derivative>
    
              une et une seule fois :
              <initialcondition>
                valeur de l'état à l'instant initial
              </initialcondition>
    
            </state>
    
          </states>
  • éventuellement une liste de sorties dépendant potentiellement des états, des variables intermédiaires de calcul pouvant là-aussi être définies pour simplifier l'écriture des formules des sorties :

          une fois au plus :
          <outputs>
    
            une ou plusieurs fois :
            <output label="id_sortie"
                    unit="unité_sortie">
    
              une ou plusieurs fois :
              <name lang="french|english|german|spanish">
                nom de la sortie tel qu'il apparaît dans
                le fichier de sauvegarde de la simulation
              </name>
    
              aucune ou plusieurs fois :
              <variable label="id_variable_intermediaire">
                formule de calcul de la variable intermédiaire
              </variable>
    
              une et une seule fois :
              <value>
                formule de calcul de la sortie
              </value>
    
            </output>
    
          </outputs>

Pour des exemples d'utilisation de la balise ode, se référer aux simulations suivantes :

4.2.4. Balise implicitfunction

On suppose qu'on a une équation f(x, y) = 0. Si pour chaque valeur de x, cette équation admet une unique solution en y, l'application qui à x associe y s'appelle fonction implicite (de y en fonction de x). Exemple : Soit l'équation f(x, y) = x2 + y2 - 1 = 0. Pour chaque valeur de x de l'intervalle [0,1], l'équation admet une unique solution y = 1 x 2 . Cependant, il n'est pas possible en général d'exprimer y en fonction de x.

Le rôle de la balise implicitfunction est en réalité de définir système de fonctions implicites :

    <implicitfunction label="id_fonction_implicite"
                      method="newton|dichotomic"
                        -> méthode utilisée pour la résolution des équations
                           en chaque valeur de la variable en dépendance
    >
      ...
    </implicitfunction>

Elle regroupe les éléments suivants :

  • le domaine de variation de la variable dont dépend la fonction implicite :

          une et une seule fois :
          (cf. § Section 4.2.1, « Balises defdomain1d et
              refdomain1d »)
          <defdomain1d>...
            OU
          <refdomain1d>...     
  • la définition des variables dont on recherche les valeurs pour chaque valeur de la variable précédente, en précisant pour chacune d'elle une valeur de départ pour sa recherche et éventuellement une borne inférieure et/ou une borne inférieure qu'elle doit respecter :

          une et une seule fois :
          <unknowns>
            une ou plusieurs fois :
            <unknown label="id_inconnue">
    
              une ou plusieurs fois :
              <name lang="french|english|german|spanish">
                nom de l'inconnue tel qu'il apparaît dans
                le fichier de sauvegarde de la simulation
              </name>
    
              une et une seule fois :
              <guess>
                valeur de départ pour la recherche
              </guess>
    
              une fois au plus :
              <lowerbound>
                éventuelle borne inférieure à respecter
              </lowerbound>
    
              une fois au plus :
              <upperbound>
                éventuelle borne supérieure à respecter
              </upperbound>
    
            </unknown>
          </unknowns>
  • les équations définissant le système de fonctions implicites, ainsi qu'éventuellement des variables intermédiaires facilitant leur écriture :

          une et une seule fois :
          <equations>
    
            aucune ou plusieurs fois :
            <variable label="id_variable_intermediaire">
              formule de calcul de la variable intermédiaire
            </variable>
    
            une ou plusieurs fois :
            <equation>
              formule devant valoir 0
            </equation>
    
          </equations>
  • éventuellement une liste de variables de sorties dépendant potentiellement de variables intermédiaires et de la variable dont dépendent les fonctions implicites :

          une fois au plus :
          <outputs>
    
            une ou plusieurs fois :
            <output label="id_sortie"
                    unit="unité_sortie">
    
              une ou plusieurs fois :
              <name lang="french|english|german|spanish">
                nom de la sortie tel qu'il apparaît dans
                le fichier de sauvegarde de la simulation
              </name>
    
              aucune ou plusieurs fois :
              <variable label="id_variable_intermediaire">
                formule de calcul de la variable intermédiaire
              </variable>
    
              une et une seule fois :
              <value>
                formule de calcul de la sortie
              </value>
    
            </output>
    
          </outputs>

Pour un exemple d'utilisation de la balise implicitfunction, se référer à la simulation de titrage acido-basique en milieu aqueux, § Section 2.3.2, « Calcul du pH par dichotomie ».

4.2.5. Balise stationary-pde

Elle a pour but de décrire l'équation de Laplace, qui est la suivante :

div ( D u ) + c u = f , ( x , y ) Ω

avec deux types de conditions aux limites :

  • robin : ( D u ) . n + σ i u = ξ i , ( x , y ) Γ i ,

  • dirichlet : u = g i , ( x , y ) Γ i .

sachant que le domaine Ω a pour frontière Γ = Γ0 ∪ Γ1 ∪ ... Γi ∪ ... Γn.

Cette balise a l'allure suivante, sachant que la définition du domaine 2D correspondant à Ω auquel il est fait référence doit inclure les définitions de Γ0, Γ1, ... Γi, ... Γn via une balise border contenant une balise parametriccurve2d pour chaque Γi. La convention étant que l’intérieur du domaine se trouve toujours à gauche d'une courbe quand son paramètre augmente, ce qui permet de construire des domaines comportant des trous :

    <stationary-pde label="id_pde_stationnaire">

      une et une seule fois :
      <refdomain2d ref="ref_id_domaine2d">...(cf. § Section 4.2.2, « Balises defdomain2d et
          refdomain2d »)

      une et une seule fois :
      <pdestate label="id_variable_u">

        une ou plusieurs fois :
        <name lang="french|english|german|spanish">
          nom de la variable tel qu'il apparaît dans
          le fichier de sauvegarde de la simulation
        </name>

        <inside>...définition de l'équation

        <boundary>...définition des conditions aux limites

      </pdestate>

    </stationary-pde>

Voici le détail des éléments concernant l'équation et les conditions aux limites :

  • définition de l'équation aux dérivées partielles stationnaire en u, avec les correspondances suivantes :

    • la matrice D (qui doit être une constante) correspond au contenu de la balise diffusion,

    • la fonction c(x, y) à celui de la balise proportional,

    • f(x, y) à celui de la balise source.

            une et une seule fois :
            <inside dependencies="liste_label_param">
                      -> le séparateur de la liste est l'espace ;
                         on indique ainsi que cet élément de calcul ne dépend
                         que des paramètres listés, ce qui permet de ne pas
                         effectuer de recalculs inutiles, ici
                         l'assemblage du problème dans le domaine
    
              <diffusion>
                matrice D  -> doit être une constante
              </diffusion>
    
              <proportional>
                fonction c(x,y)
              </proportional>
    
              <source>
                fonction f(x,y)
              </source>
    
            </inside>
  • la définition des conditions aux limites avec les correspondances suivantes, sachant qu'il est possible qu'il y ait moins de conditions définies que de Γi : une absence de condition sur un morceau du bord de Ω correspond à une condition de Neuman homogène (la dérivée normale de l'état est nulle) :

    • σi(x, y) et ξi(x, y) correspondent aux balises sigma et xi,

    • gi(x, y) à la balise dirichlet.

            une fois au plus :
            <boundary dependencies="liste_label_param">
                        -> le séparateur de la liste est l'espace ;
                           on indique ainsi que cet élément de calcul ne dépend
                           que des paramètres listés, ce qui permet de ne pas
                           effectuer de recalculs inutiles, ici
                           l'assemblage des conditions aux limites
    
              une ou plusieurs fois :
              <condition bdy="label_element_domaine_2D">
                           -> il s'agit d'un des labels identifiant une des
                              courbes paramétriques définies dans la balise
                              defdomain2d référencée par ref_id_domaine2d ;
                              on indique ainsi sur quelle élément de
                              frontière <i> porte la condition
    
                une et une seule fois :
                <robin>
                  <xi>
                    fonction ξ(x,y)
                  </xi>
                  <sigma>
                    fonction σ(x,y)
                  </sigma>
                </robin>
                  OU
                <dirichlet>
                  fonction g(x,y)
                </dirichlet>
    
              </condition>
    
            </boundary>

Attention : lorsque les coefficients sont des fonctions, on doit utiliser absolument x et y pour manipuler l’abscisse et l’ordonnée (quels que soient les labels utilisés dans les parametriccurve2d dans le border).

Pour un exemple d'utilisation de la balise stationary-pde, se référer à la simulation via éléments finis de l'équation de Poisson, § Section 2.3.4, « Définition de l'équation aux dérivées partielles stationnaire ».

4.2.6. Balise nonparametriccurve2d

il s'agit d'une courbe définie par une fonction y = f(x). Elle comprend le domaine de variation de x et la définition de f :

    <nonparametriccurve2d label="id_courbe">

      aucune ou plusieurs fois :
      <name lang="french|english|german|spanish">
        éventuel nom de la courbe tel qu'il apparaît dans
        le tracé de celle-ci (cf. § Section 5.2.1, « Balise drawcurve2d »)
      </name>

Définition de x :
      une et une seule fois :
      (cf. § Section 4.2.1, « Balises defdomain1d et
          refdomain1d »)
      <defdomain1d>...
        OU
      <refdomain1d>...

Définition de y = f(x) :
      une et une seule fois :
      <x2 label="id_ordonnée" unit="unité des ordonnées">
        aucune ou plusieurs fois :
        <name lang="french|english|german|spanish">
          nom de l'ordonnée (pas utilisé actuellement)
        </name>
        une et une seule fois :
        <value>
          f(x)
        </value>
      </x2>

    </nonparametriccurve2d>

Pour un exemple d'utilisation de la balise nonparametriccurve2d, se référer notamment au fichier Math/tangente.xml fourni dans le sous-répertoire examples du répertoire d'installation de XMLlab.

4.2.7. Balise parametriccurve2d

Il s'agit d'une courbe paramétrique x = f(t), y = g(t). Elle comprend le domaine de variation de t et les définitions de f et g :

    <parametriccurve2d label="id_courbe">

      aucune ou plusieurs fois :
      <name lang="french|english|german|spanish">
        éventuel nom de la courbe tel qu'il apparaît dans
        le tracé de celle-ci (cf. § Section 5.2.1, « Balise drawcurve2d »)
      </name>

Définition de t :
      une et une seule fois :
      (cf. § Section 4.2.1, « Balises defdomain1d et
          refdomain1d »)
      <defdomain1d>...
        OU
      <refdomain1d>...

Définition de x = f(t) :
      une et une seule fois :
      <x1 label="id_abscisse" unit="unité des abscisses">
        aucune ou plusieurs fois :
        <name lang="french|english|german|spanish">
          nom de l'abscisse (pas utilisé actuellement)
        </name>
        une et une seule fois :
        <value>
          f(t)
        </value>
      </x1>

Définition de y = g(t) :
      une et une seule fois :
      <x2 label="id_ordonnée" unit="unité des ordonnées">
        aucune ou plusieurs fois :
        <name lang="french|english|german|spanish">
          nom de l'ordonnée (pas utilisé actuellement)
        </name>
        une et une seule fois :
        <value>
          g(t)
        </value>
      </x2>

    </parametriccurve2d>

Pour des exemples d'utilisation de la balise parametriccurve2d, se référer aux simulations suivantes :

4.2.8. Balise parametriccurve3d

Il s'agit d'une courbe paramétrique x = f(t), y = g(t), z = h(t). Elle comprend le domaine de variation de t et les définitions de f, g et h :

    <parametriccurve3d label="id_courbe">

      aucune ou plusieurs fois :
      <name lang="french|english|german|spanish">
        éventuel nom de la courbe tel qu'il apparaît dans
        le tracé de celle-ci (cf. § Section 5.2.3, « Balise drawsurface »)
      </name>

      aucune ou plusieurs fois :
      (cf. § Section 4.2.1, « Balises defdomain1d et
          refdomain1d »)
      <defdomain1d>...
        OU
      <refdomain1d>...

      une et une seule fois :
      <x1 label="id_abscisse" unit="unité des abscisses">
        aucune ou plusieurs fois :
        <name lang="french|english|german|spanish">
          nom de l'abscisse (pas utilisé actuellement)
        </name>
        une et une seule fois :
        <value>
          f(t)
        </value>
      </x1>

      une et une seule fois :
      <x2 label="id_ordonnée" unit="unité des ordonnées">
        aucune ou plusieurs fois :
        <name lang="french|english|german|spanish">
          nom de l'ordonnée (pas utilisé actuellement)
        </name>
        une et une seule fois :
        <value>
          g(t)
        </value>
      </x2>

      une et une seule fois :
      <x3 label="id_z" unit="unité des z">
        aucune ou plusieurs fois :
        <name lang="french|english|german|spanish">
          nom du z (pas utilisé actuellement)
        </name>
        une et une seule fois :
        <value>
          h(t)
        </value>
      </x3>

    </parametriccurve3d>

Pour un exemple d'utilisation de la balise parametriccurve3d, se référer au fichier Math/helice.xml fourni dans le sous-répertoire examples du répertoire d'installation de XMLlab.

4.2.9. Balise nonparametricsurface

Il s'agit d'une surface non paramétrique z = h(x, y). Elle comprend le domaine 2D de variation de (x, y) et la définition de h :

    <nonparametricsurface label="id_surface">

      aucune ou plusieurs fois :
      <name lang="french|english|german|spanish">
        éventuel nom de la surface tel qu'il apparaît dans
        le tracé de celle-ci (cf. § Section 5.2.3, « Balise drawsurface »)
      </name>

      une et une seule fois :
      (cf. § Section 4.2.2, « Balises defdomain2d et
          refdomain2d »)
      <defdomain2d>...
        OU
      <refdomain2d>...

      une et une seule fois :
      <x3 label="id_z" unit="unité des z">
        aucune ou plusieurs fois :
        <name lang="french|english|german|spanish">
          nom du z (pas utilisé actuellement)
        </name>
        une et une seule fois :
        <value>
          h(x,y)
            -> x et y étant les labels identifiant l'abscisse et l'ordonnée des
               points du domaine 2D, à savoir selon que celui-ci contient un :
               - <rectangle> : x et y sont les labels des 2 domaines 1D
                               définis ou en référence,
               - <border>    : x et y sont les labels des balises <x1> et <x2>
                               des <parametriccurve2d> définissant le domaine 2D.
        </value>
      </x3>

    </nonparametricsurface>

Pour un exemple d'utilisation de la balise nonparametricsurface, se référer notamment au fichier Math/gauss.xml fourni dans le sous-répertoire examples du répertoire d'installation de XMLlab.

4.2.10. Balise parametricsurface

Il s'agit d'une surface paramétrique x = f(θ, φ), y = g(θ, φ), z = h(θ, φ). Elle comprend le domaine 2D de variation de (θ, φ) et la définition de f, g et h :

    <nonparametricsurface label="id_surface">

      aucune ou plusieurs fois :
      <name lang="french|english|german|spanish">
        éventuel nom de la surface tel qu'il apparaît dans
        le tracé de celle-ci (cf. § Section 5.2.3, « Balise drawsurface »)
      </name>

      une et une seule fois :
      (cf. § Section 4.2.2, « Balises defdomain2d et
          refdomain2d »)
      <defdomain2d>...
        OU
      <refdomain2d>...

      une et une seule fois :
      <x1 label="id_abscisse" unit="unité des abscisses">
        aucune ou plusieurs fois :
        <name lang="french|english|german|spanish">
          nom de l'abscisse (pas utilisé actuellement)
        </name>
        une et une seule fois :
        <value>
          f(θ,φ)
        </value>
      </x1>

      une et une seule fois :
      <x2 label="id_ordonnée" unit="unité des ordonnées">
        aucune ou plusieurs fois :
        <name lang="french|english|german|spanish">
          nom de l'ordonnée (pas utilisé actuellement)
        </name>
        une et une seule fois :
        <value>
          g(θ,φ)
        </value>
      </x2>

      une et une seule fois :
      <x3 label="id_z" unit="unité des z">
        aucune ou plusieurs fois :
        <name lang="french|english|german|spanish">
          nom du z (pas utilisé actuellement)
        </name>
        une et une seule fois :
        <value>
          h(θ,φ)
        </value>
      </x3>

    </nonparametricsurface>

Pour un exemple d'utilisation de la balise parametricsurface, se référer notamment au fichier Math/sphere.xml fourni dans le sous-répertoire examples du répertoire d'installation de XMLlab.

4.2.11. Balise polyline

Il s'agit d'une courbe multi-lignes en 2D ou 3D définie par l'ensemble des points (balises vertex) des segments la composant :

    <polyline label="id_courbe">

      aucune ou plusieurs fois :
      <name lang="french|english|german|spanish">
        éventuel nom de la courbe tel qu'il apparaît dans
        le tracé de celle-ci (cf. § Section 5.2.1, « Balise drawcurve2d »)
      </name>

      une ou plusieurs fois :
      <vertex x1="x" x2="y" x3="z">

        aucune ou plusieurs fois :
        <name lang="french|english|german|spanish">
          éventuel nom du point tel qu'il apparaît dans
          le tracé de la courbe
        </name>

      </vertex>

    </polyline>

Pour un exemple d'utilisation de la balise polyline, se référer notamment au fichier Math/gauss.xml fourni dans le sous-répertoire examples du répertoire d'installation de XMLlab.