Arcane  v3.14.11.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
Exemple n°4

À partir de cet exemple, il ne sera plus question d'options ou de singleton. Ici, il sera question d'optimisation, dans le cas où ce service est utilisé de manière plus sérieuse que du simple debuggage.

Le résultat va donc changer un peu :

Results_Example4 Iteration 1 Iteration 2 Iteration 3 Somme
Nb de Fissions 36 0 85 121
Nb de Collisions 29 84 21 134

Point d'entrée initial

Voyons le point d'entrée start-init :

SimpleTableOutputExample4Module.cc

void SimpleTableOutputExample4Module::
initModule()
{
srand(1234);
options()->stOutput()->init();
// Pour cet exemple, on va définir le nom des colonnes dès l'init.
// En effet, ajouter des colonnes au fur et à mesure prend du temps
// puisque le tableau est réalloué à chaque fois (dans l'implem actuelle).
// (après, si les perfs de cette partie ne sont pas une priorité, c'est
// pas impératif de faire ça, tout dépend de l'utilisation faite du service).
StringUniqueArray columns_name(NB_ITER);
for(Integer i = 0; i < NB_ITER; i++){
columns_name[i] = "Iteration " + String::fromNumber(i+1);
}
options()->stOutput()->addColumns(columns_name);
// On ajoute aussi les deux lignes.
// Toujours dans un soucis d'optimisation, on peut créer les lignes et récupérer
// leur position pour la suite, ainsi, on évite deux recherches de String dans un
// tableau de String à chaque itération.
options()->stOutput()->addRows(StringUniqueArray{"Nb de Fissions", "Nb de Collisions"});
m_pos_fis = options()->stOutput()->rowPosition("Nb de Fissions");
m_pos_col = options()->stOutput()->rowPosition("Nb de Collisions");
options()->stOutput()->print();
}

Dans cet exemple, on va créer les lignes et les colonnes dans l'init au lieu de le faire au fur et à mesure.

De plus, on va récupérer les positions des lignes.

En effet, au niveau interne, le tableau de valeur est représenté simplement par un objet de la classe RealUniqueArray2, un tableau 2D.
Niveau algorithmique, ce tableau est représenté par un tableau 1D, chaque ligne est mise côte à côte dans la mémoire.
Créer une ligne est donc facile (s'il y a de la place) car il suffit d'agrandir le tableau 1D.
Mais ajouter une colonne est sensiblement plus complexe et long car on est obligé de décaler les valeurs de N-1 lignes. Et plus il y a de valeurs dans le tableau, plus ce sera long.

Pour éviter tout cela, on peut créer les lignes et les colonnes dès le début. Après, il suffira d'ajouter les valeurs où il faut.

Pour aller encore plus loin, on sauvegarde les positions des deux lignes dans des attributs de la classe.
Ça permet d'éviter d'effectuer une recherche de String dans le tableau interne de nom des lignes StringUniqueArray.
Mais c'est quelque chose de dispensable étant donné que moins il y a de lignes moins cette recherche est couteuse et plus il y a de lignes, plus la gestion des positions est compliqué.
Pour cette partie, à vous de voir.

Point d'entrée loop

Voyons le point d'entrée compute-loop :

SimpleTableOutputExample4Module.cc

void SimpleTableOutputExample4Module::
loopModule()
{
Integer nb_fissions = rand()%99;
Integer nb_collisions = rand()%99;
// On ajoute deux valeurs à nos deux lignes.
options()->stOutput()->addElementInRow(m_pos_fis, nb_fissions);
options()->stOutput()->addElementInRow(m_pos_col, nb_collisions);
options()->stOutput()->print();
if (m_global_iteration() == NB_ITER)
subDomain()->timeLoopMng()->stopComputeLoop(true);
}

Ici, on peut voir que l'on utilise la méthode ISimpleTableOutput::addElementInRow() différemment.
En effet, cette méthode est surchargée pour permettre l'utilisation de la position de la ligne au lieu de son nom, ce qui permet d'éviter une recherche de String.
De plus, cette méthode retourne un booleen qui permet de savoir si la valeur a pu être ajouté ou non, dans le cas où la position est fausse.
(Pour simplifier l'exemple, je ne vérifie pas la valeur retournée).

Point d'entrée exit

Enfin, voyons le point d'entrée exit :

SimpleTableOutputExample4Module.cc

void SimpleTableOutputExample4Module::
endModule()
{
// On peut faire la somme des valeurs des lignes si on souhaite.
// Dans le cas où il y a des cases vides, elle sont initialisé à 0.
for(Integer pos = 0; pos < options()->stOutput()->numberOfRows(); pos++) {
RealUniqueArray row = options()->stOutput()->row(pos);
Real sum = 0.;
for(Real elem : row) {
sum += elem;
}
options()->stOutput()->addElementInColumn("Somme", sum);
}
options()->stOutput()->print();
options()->stOutput()->writeFile();
}

Pour varier un peu et montrer comment utiliser les valeurs entrées dans le tableau, on a fait la somme des deux lignes et on met ces résultats dans une nouvelle colonne Somme.

Note
On n'utilise pas de ArrayView dans le service car c'est impossible de faire une vue sur une colonne étant donné que les valeurs des colonnes sont discontinues.

Cet exemple de somme permet de voir que ce service n'est pas juste un service d'écriture de fichier mais peut aussi stocker des valeurs pour les exploiter après.