DESS

Introduction
DESS est une extension de DEVS dont l'objectif est l'intégration numérique d'équations différentielles ordinaires (EDO). La méthode repose sur le principe de la discrétisation de l'espace du temps. Deux méthodes classiques d'intégration sont disponible (Euler, Runge-Kutta)

Il existe une façon de manipuler les EDO dans VLE :
 * De manière individuelle : un modèle par équation ;

Si vous ne voulez pas utiliser DESS, et donc son schéma numérique, vous pouvez utiliser l'extension QSS dont la méthode repose sur le principe de la discrétisation de l'espace des valeurs au lieu de l'espace du temps.

DESS
La classe DifferentialEquation::DESS prend en charge la modélisation d'une EDO par modèle.

La structure
Il faut définir deux types de ports :
 * les ports d'entrée et sortie pour la synchronisation lorsque l'on couple plusieurs DESS : update ;
 * les ports d'entrée pour la perturbation du DESS : perturb ;

Les ports update sont définis en entrée et en sortie si le DESS intègre des variables gérées par d'autres DESS ou tout autre modèle gérant l'évolution d'une variable numérique. Pour ces autres modèles, il faut qu'il respecte un certain protocole.

Tous les ports sont optionnels :
 * si vous ne voulez pas autoriser les perturbations, pas de ports perturb;
 * si votre DESS n'est pas intégré dans un graphe de modèles numériques et donc ne dépend pas d'autres modèles ou ne rendre pas en jeu dans d'autres modèles numériques, pas de port update.

Si plusieurs DESS (dans notre exemple m1 et m2) sont mutuellement dépendants, il faut connecter les ports update ensemble.

Naturellement, si seulement m2 a besoin de la variable gérée par m1 alors seule ma première connexion est nécessaire.

Les initialisations
Les initialisations se divisent en deux groupes :
 * les inits pour le modèle lui-même : les paramètres de l'équation, par exemple ;
 * les inits pour DESS

DESS nécessite la valeur du pas de temps (timeStep), le nom de la méthode d'intégration utilisée ('method') et la valeur initiale de la variable à intégrer ("value"). Cette liste se termine par le nom de la valeur à intégrer (name). Ce nom servira à l'initialisation du graphe de DESS dans le cas de DESS couplés.

Comment écrire un modèle à base de DESS ?
L'écriture d'un modèle passe par la construction d'une sous-classe de vle::extension::DifferentialEquation::DESS. Une méthode est à définir ainsi que le constructeur et le destructeur :
 * le constructeur pour la gestion de l'initialisation des paramètres définis dans le vpz sous forme suivante :


 * compute pour le calcul du gradient.

Voici un exemple d'header :

Voici maintenant un exemple d'initialisation de l'extrait précédent de vpz.

La deuxième étape consiste à définir la variable gérée par l'équation et les variables externes. Pour cela, il faut déclarer, comme attribut de la classe, un attribut du type Var pour la variable gérée par l'équation et Ext pour les autres.

Par exemple, si l'équation M gère la variable X et dépend de deux variables Y et Z, voici la déclaration à réaliser :

Ensuite, il faut faire le lien entre la variable C++ de manipulation de la variable et l'identifiant utilisé. Cela se déroule dans le constructeur.

La méthode de calcul du gradient fait intervenir la valeur de la variable à intégrer, les paramètres s'ils existent et les valeurs des variables numériques gérées par d'autres DESS ou par des modèles numériques. L'opérateur est utilisé pour l'accès aux valeurs.

Dans l'exemple, a et b sont les paramètres de l'équation, X, la valeur de la variable à intégrer et Y permet d'obtenir la valeur de la variable "externe" nommée Y.

Comment perturber un DESS ?
Pour perturber un DESS, il suffit de se connecter sur le port d'entrée perturb et d'envoyer un événement transportant deux valeurs :
 * name avec le nom de la variable à perturber ;
 * value avec la nouvelle valeur de la variable.

Si pour déterminer cette nouvelle valeur, vous avez besoin de la valeur courante, :
 * se connecter sur le port "update" et vous recevrez les valeurs de la variable à chaque modification ;

Utilisation de l'option de seuils de détection
L'extension DESS (comme QSS simple) offre une option pour déclencher un événement instantané sur un port de sortie out lorsque la variable d'état franchit un seuil montant (S1) et/ou descendant (S2).

Pour activer cette option il faut d'une part rajouter un port de sortie out sur lequel l’événement sera produit

Et d'autre part ajouter les initialisations (thresholds) avec les valeurs voulues pour les front S1 et S2

Couplage avec un modèle non DESS
DESS propose d'être couplé avec tout modèle qui est capable de délivrer une valeur numérique. Par exemple, si vous avez un modèle de type équation aux différences ($$u(t+\Delta) = f(u(t), v(t), w(t), a, b, c)$$), ce modèle calcule à chaque pas de temps $$\Delta$$ sa nouvelle valeur. Si ce modèle pose sur un port de sortie cette valeur et que ce port est connecté au port update d'un DESS alors DESS prendra en charge cette valeur comme une variable externe qui peut être utilisée dans l'expression du gradient.

Voici la structure minimale d'un modèle non DESS doit posséder pour être couplé avec un DESS (note : nécessaire mais pas suffisant) :
 * port d'entrée : si le modèle non DESS dépend d'un ou de modèles DESS ;
 * port de sortie : Les événements à générer doivent posséder deux attributs, name et value ;
 * à t=0, le modèle doit poser sa valeur initiale sur le port de sortie comme indiqué ci-dessus ;
 * à chaque modification, le modèle doit poser sa nouvelle valeur sur le port de sortie.

Références

 * Euler ??
 * Runge Kutta ??