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

Commençons avec l'exemple 1.
Cet exemple simple permet de sortir un tableau ressemblant à ça :

Results_Example1 Iteration 1 Iteration 2 Iteration 3
Nb de Fissions 36 0 85
Nb de Collisions 29 84 21

Nous avons ici deux lignes et trois colonnes. Les nombres présents sont générés aléatoirement.

Point d'entrée initial

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

SimpleTableOutputExample1Module.cc

void SimpleTableOutputExample1Module::
initModule()
{
// On utilise des valeurs (pseudo-)aléatoires.
srand(1234);
// Initialisation du service.
// On récupère un pointeur vers le singleton créé par Arcane.
ISimpleTableOutput* table = ServiceBuilder<ISimpleTableOutput>(subDomain()).getSingleton();
// On initialise le tableau grâce à un des initialisateurs.
// Le nom du tableau sera "Results" et le nom du fichier sortant sera
// "Results_Example1.X".
//
// On enregistrera le résultat dans le dossier "example1".
// Au final, on aura un fichier ayant comme chemin :
// ./output/csv/example1/Results_Example1.X
//
// X étant selon le format choisi (.csv par exemple).
table->init("Results_Example1", "example1");
// On print le tableau dans son état actuel (vide, avec un titre).
table->print();
}

Dans cet exemple, on est en mode singleton. Le fichier .axl de cette exemple ne contient donc pas d'options.

En revanche, le fichier de configuration .config réference le singleton.

csv.config <time-loop name="example1">

<singleton-services>
<service name="SimpleCsvOutput" need="required" />
</singleton-services>
Note
Pour pouvoir séparer plusieurs cas d'exécutions dans le même code, j'ai créé plusieurs time-loop dans le fichier .config.

Revenons dans le fichier .cc. On ne fait que récupérer le pointeur vers le singleton et l'initialiser avec un nom de tableau (Results_Example1) et un nom de sous-dossier (example1) (et on print le tableau vide).

Point d'entrée loop

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

SimpleTableOutputExample1Module.cc

void SimpleTableOutputExample1Module::
loopModule()
{
// On récupère un pointeur vers le singleton créé par Arcane.
// (on pourrait aussi créer un attribut pour éviter de le récupérer
// à chaque fois).
ISimpleTableOutput* table = ServiceBuilder<ISimpleTableOutput>(subDomain()).getSingleton();
// On crée une colonne nommé "Iteration X" (avec X = itération actuelle).
table->addColumn("Iteration " + String::fromNumber(m_global_iteration()));
// On génère deux valeurs (c'est pour l'exemple, sinon oui, ça sert à rien).
Integer nb_fissions = rand()%99;
Integer nb_collisions = rand()%99;
// On ajoute deux valeurs à deux lignes (par défaut,
// si les lignes n'existe pas encore, elles sont créées).
table->addElementInRow("Nb de Fissions", nb_fissions);
table->addElementInRow("Nb de Collisions", nb_collisions);
// On print le tableau dans son état actuel.
table->print();
// On effectue trois itérations.
if (m_global_iteration() == 3)
subDomain()->timeLoopMng()->stopComputeLoop(true);
}

Ici, on a un exemple simple de l'utilisation typique imaginé au départ pour ce service.

On crée une colonne nommé Iteration X (donc une nouvelle colonne à chaque itération), puis on ajoute les valeurs que l'on souhaite sur des lignes.

Les lignes n'existent pas car elles n'ont pas été créées lors de l'init ? Le service s'occupe de les créer avant d'ajouter la valeur.

Dans cet exemple, les lignes seront donc créées lors de la première itération et après, le service se contentera de les remplir.

Note
On peut interchanger row et column, le fonctionnement est identique pour les lignes et les colonnes (mais le résultat sera évidemment différent).

Exporter des valeurs d'un code, par exemple lors d'une session de débuggage est donc quelque chose qui est très simple avec ce service.

Point d'entrée exit

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

SimpleTableOutputExample1Module.cc

void SimpleTableOutputExample1Module::
endModule()
{
// On récupère un pointeur vers le singleton créé par Arcane.
ISimpleTableOutput* table = ServiceBuilder<ISimpleTableOutput>(subDomain()).getSingleton();
// On print le tableau dans son état actuel.
table->print();
// On demande l'écriture du fichier.
table->writeFile();
}

Dans cette partie, on demande simplement l'écriture du fichier csv dont on a défini l'emplacement et le nom lors de l'init. Dans l'hypothèse où ce n'aurait pas été fait, il existe les méthodes ISimpleTableOutput::setOutputDirectory() et ISimpleTableOutput::setTableName() pour rectifier (et sinon, le service définit des valeurs par défaut).