Lecture des fichiers rates d’Apollo3 grâce au Picker

La lecture des fichiers rates d’Apollo3 (réseau) est possible dans valjean, ainsi que les différents autres formats HDF5.

Deux modes de lecture sont possibles :

  • lecture de tout le fichier HDF5 et stockage des résultats dans un Browser, récupération des résultats sous forme de Dataset grâce au Browser -> utilisation du Reader

  • lecture d’un résultat ou de plusieurs résultats donnés à partir du HDF5 pour une utilisation directe sous forme de Dataset -> Picker

La seconde méthode est bien plus rapide car elle ne nécessite pas de charger l’intégralité du fichier et bénéficie des accès de lecture du HDF5. Cet exemple se concentre sur cette seconde méthode.

Le Picker : résumé

À utiliser notamment si vous connaissez les métadonnées du résultat qui vous intéresse : 'zone', 'output', 'result_name', etc.

[1]:
from valjean.eponine.apollo3.hdf5_picker import Picker
[2]:
ap3p = Picker("Mosteller.hdf")
     INFO  hdf5_picker: Reading Mosteller.hdf
     INFO  hdf5_picker: HDF5 loading done in 0.000678 s

La méthode à utiliser pour récupérer les résultats est pick_standard_value :

[3]:
keff = ap3p.pick_standard_value(output='output_1', zone='totaloutput', result_name='KEFF')

Attention : les strings correspondant aux différents arguments (``’output’``, ``’result_name’``, etc) sont celles stockées dans le fichier, en capitales pour les résultats la plupart du temps.

Les résultats correspondants à des taux microscopiques (par isotopes) sont souvent en minuscules avec la première lettre en majuscules.

Inspection du fichier HDF5

Il est tout de même possible d’inspecter le fichier (mais cela peut prendre un peu de temps).

[4]:
print(ap3p.zones(output='output_0'))
print(ap3p.zones(output='output_2'))
['1', '2', '3', 'totaloutput']
['1', '2', '3', 'totaloutput']

Illustration pour l’output 'output_0'.

[5]:
print(f"isotopes dans la zone 3: {ap3p.isotopes(output='output_0', zone='3')}")
print(f"isotopes dans la zone 1: {ap3p.isotopes(output='output_0', zone='1')}")
isotopes dans la zone 3: ['H2O', 'B10', 'B11', 'macro']
isotopes dans la zone 1: ['U234', 'U235', 'U238', 'Pu239', 'Pu241', 'Pu240', 'Pu242', 'O16', 'macro']

Recherche des résultats macroscopiques (pas d’isotope de mentionné) :

[6]:
print(f"résultats dans la zone 1: {ap3p.results(output='output_0', zone='1')}")
print(f"résultats pour totaloutput: {ap3p.results(output='output_0', zone='totaloutput')}")
résultats dans la zone 1: ['FLUX']
résultats pour totaloutput: ['ABSORPTION', 'FLUX', 'KEFF', 'PRODUCTION']

Recherche des résultats macroscopiques et microscopiques (isotope requis) :

[7]:
print(f'resultats sans isotopes: {ap3p.results(output="output_0", zone="3")}')
print(f'resultats pour B10: {ap3p.results(output="output_0", zone="3", isotope="B10")}')
resultats sans isotopes: ['FLUX']
resultats pour B10: ['Absorption', 'concentration']

Sélection des résultats

Récupération d’un résultat sous forme de Dataset : utilisation de la méthode pick_standard_value pour les fichiers rates standards

Exemple sur les k_{eff}

[8]:
keff_o0 = ap3p.pick_standard_value(output='output_0', zone='totaloutput', result_name='KEFF')
print(keff_o0)
value: 1.235028e+00, error:    nan, bins: OrderedDict(), type: <class 'numpy.float32'>,name: , what: keff
[9]:
keff_o1 = ap3p.pick_standard_value(output='output_1', zone='totaloutput', result_name='KEFF')
print(keff_o1)
value: 1.247908e+00, error:    nan, bins: OrderedDict(), type: <class 'numpy.float32'>,name: , what: keff
[10]:
print(f"Difference between keffs (output_0, output1) = "
      f"{(1/keff_o0.value - 1/keff_o1.value)*1e5:.0f} pcm")
Difference between keffs (output_0, output1) = 836 pcm

Exemple sur les flux (arrays)

[11]:
flux = ap3p.pick_standard_value(output='output_0', zone='1', result_name='FLUX')
print(flux)
print(flux.value)
flux.name = 'output 0'
shape: (10,), dim: 1, type: <class 'numpy.ndarray'>, bins: ['groups: [0 1 2 3 4 5 6 7 8 9]'], name: , what: flux
[  5.168701    45.47962    174.16776      3.8427184    0.37652907
   0.4066852    0.73074013   1.4990817    3.1569755    1.5008503 ]
[12]:
absB10 = ap3p.pick_standard_value(output='output_0', zone='3', result_name='Absorption', isotope='B10')
print(absB10)
print(absB10.value)
shape: (10,), dim: 1, type: <class 'numpy.ndarray'>, bins: ['groups: [0 1 2 3 4 5 6 7 8 9]'], name: , what: absorption
[3.4434328e-05 3.5456420e-04 1.6647208e-01 6.4293027e-02 9.4167180e-03
 1.5479327e-02 4.2232495e-02 6.3232511e-02 1.6776539e-01 1.6186915e-01]

Comparaison de résultats

Les tests disponibles dans valjean peuvent tout à fait être appliqués aux résultats issus du Reader ou du Picker.

Ici TestApproxEqual : les résultats sont des float sans erreur associée (mise à nan par défaut).

[13]:
flux_1 = ap3p.pick_standard_value(output='output_1', zone='1', result_name='FLUX')
flux_1.name = 'output 1'
[14]:
flux_2 = ap3p.pick_standard_value(output='output_2', zone='1', result_name='FLUX')
flux_2.name = 'output 2'

Import du test et des représentations (voir les autres notebooks)

[15]:
from valjean.gavroche.test import TestApproxEqual
from valjean.javert.representation import FullRepresenter
from valjean.javert.rst import RstFormatter
from valjean.javert.mpl import MplPlot
from valjean.javert.verbosity import Verbosity

frepr = FullRepresenter()
rstformat = RstFormatter()
[16]:
taeq_res = TestApproxEqual(flux, flux_1, flux_2, name='TestApproxEqual',
                           description='Test le TestApproxEqual sur les flux', rtol=1e-2).evaluate()
print(bool(taeq_res))  # expected: False
False
[17]:
aeqrepr = frepr(taeq_res, verbosity=Verbosity.FULL_DETAILS)  # il s'agit d'une liste de templates
aeqrst = rstformat.template(aeqrepr[1])
print(aeqrst)
.. role:: hl

.. table::
    :widths: auto

    ======  ===========  ===========  =======================  ===========  =======================
    groups   output 0     output 1    approx equal(output 1)?   output 2    approx equal(output 2)?
    ======  ===========  ===========  =======================  ===========  =======================
         0       5.1687       5.1609                     True      4.78112              :hl:`False`
         1      45.4796      45.4164                     True      46.6316              :hl:`False`
         2      174.168      174.516                     True      188.355              :hl:`False`
         3      3.84272      3.89218              :hl:`False`      5.57925              :hl:`False`
         4     0.376529     0.383804              :hl:`False`      0.87789              :hl:`False`
         5     0.406685     0.413455              :hl:`False`      1.69239              :hl:`False`
         6      0.73074     0.733685                     True      5.25886              :hl:`False`
         7      1.49908      1.51683              :hl:`False`      6.91474              :hl:`False`
         8      3.15698      3.20994              :hl:`False`      13.5553              :hl:`False`
         9      1.50085      1.53149              :hl:`False`      6.58862              :hl:`False`
    ======  ===========  ===========  =======================  ===========  =======================


[18]:
mpl = MplPlot(aeqrepr[0]).draw()
../../../_images/examples_notebooks_ap3_reader_ap3_picker_29_0.png