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

Pour ce dernier exemple, on va voir le potentiel des déplacements par direction.

Voici le résultat :

Ex6 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Somme
0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2
2 1 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4
3 1 3 3 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8
4 1 4 6 4 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 16
5 1 5 10 10 5 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 32
6 1 6 15 20 15 6 1 0 0 0 0 0 0 0 0 0 0 0 0 0 64
7 1 7 21 35 35 21 7 1 0 0 0 0 0 0 0 0 0 0 0 0 128
8 1 8 28 56 70 56 28 8 1 0 0 0 0 0 0 0 0 0 0 0 256
9 1 9 36 84 126 126 84 36 9 1 0 0 0 0 0 0 0 0 0 0 512
10 1 10 45 120 210 252 210 120 45 10 1 0 0 0 0 0 0 0 0 0 1024
11 1 11 55 165 330 462 462 330 165 55 11 1 0 0 0 0 0 0 0 0 2048
12 1 12 66 220 495 792 924 792 495 220 66 12 1 0 0 0 0 0 0 0 4096
13 1 13 78 286 715 1287 1716 1716 1287 715 286 78 13 1 0 0 0 0 0 0 8192
14 1 14 91 364 1001 2002 3003 3432 3003 2002 1001 364 91 14 1 0 0 0 0 0 16384
15 1 15 105 455 1365 3003 5005 6435 6435 5005 3003 1365 455 105 15 1 0 0 0 0 32768
16 1 16 120 560 1820 4368 8008 11440 12870 11440 8008 4368 1820 560 120 16 1 0 0 0 65536
17 1 17 136 680 2380 6188 12376 19448 24310 24310 19448 12376 6188 2380 680 136 17 1 0 0 131072
18 1 18 153 816 3060 8568 18564 31824 43758 48620 43758 31824 18564 8568 3060 816 153 18 1 0 262144
19 1 19 171 969 3876 11628 27132 50388 75582 92378 92378 75582 50388 27132 11628 3876 969 171 19 1 524288

Point d'entrée initial

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

SimpleTableOutputExample6Module.cc

void SimpleTableOutputExample6Module::
initModule()
{
options()->stOutput()->init();
StringUniqueArray names(NB_ITER);
for(Integer i = 0; i < NB_ITER; i++){
names[i] = String::fromNumber(i);
}
options()->stOutput()->addColumns(names);
options()->stOutput()->addRows(names);
options()->stOutput()->editElement(0, 0, 1);
options()->stOutput()->print();
}

Dans ce point d'entrée, on ajoute des lignes et des colonnes ayant comme nom un nombre de 0 à nombre d'itérations.
On pense aussi à mettre la valeur "1" dans la case [0,0].

Point d'entrée loop

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

SimpleTableOutputExample6Module.cc

void SimpleTableOutputExample6Module::
loopModule()
{
Real elem1 = 0;
// On récupère la valeur au début de la ligne et on met à jour le pointeur.
Real elem2 = options()->stOutput()->element(0, m_global_iteration()-1, true);
for(Integer i = 0; i < m_global_iteration()+1; i++){
// La case sous le pointeur prend la valeur "elem1+elem2".
// On demande à ce que le pointeur ne se mette pas à jour.
options()->stOutput()->editElementDown(elem1 + elem2, false);
elem1 = elem2;
// On récupère l'élement à droite du pointeur et on force la mise à jour du pointeur.
elem2 = options()->stOutput()->elementRight(true);
}
if (m_global_iteration() == NB_ITER)
subDomain()->timeLoopMng()->stopComputeLoop(true);
}

Ici, on joue avec le déplacement du pointeur. Normalement, la mise à jour du pointeur s'effectue uniquement lors d'une écriture, pas lors d'une lecture.
Dans cet exemple, on inverse les choses.

Point d'entrée exit

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

SimpleTableOutputExample6Module.cc

void SimpleTableOutputExample6Module::
endModule()
{
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();
}

Même point d'entrée que précédemment.