WOW !! MUCH LOVE ! SO WORLD PEACE !
Fond bitcoin pour l'amélioration du site: 1memzGeKS7CB3ECNkzSn2qHwxU6NZoJ8o
  Dogecoin (tips/pourboires): DCLoo9Dd4qECqpMLurdgGnaoqbftj16Nvp


Home | Publier un mémoire | Une page au hasard

 > 

Etude neutronique d'une configuration d'un cœur à  base du combustible uranium-thorium


par Hakim BOUZOURDAZ et Houssem MAKHLOUFI
Université Ferhat Abbas Sétif-1 - Master 2020
  

précédent sommaire suivant

Bitcoin is a swarm of cyber hornets serving the goddess of wisdom, feeding on the fire of truth, exponentially growing ever smarter, faster, and stronger behind a wall of encrypted energy

Titre (1 ligne)

Les Cellules : des volumes construits à partir des surfaces et plans Une ligne vide de séparation obligatoire

Les surfaces : ça permet de délimiter les volumes constituants du problème à simuler

Une ligne vide de séparation obligatoire

Données physiques : Matériaux, Sources, Tallies, Mode, ...

Chapitre 2 Modélisation et simulation du réacteur

3.2.1. La carte des Cellule :

La cellule est identifiée par un nombre qui lui est attribuée et sera utilisé par la suite pour la reconnaître et la différencier des autres cellules. Elle est constituée d'un volume rempli de matériau ou de vide. Dans le premier cas, la masse volumique du matériau en question doit être fournie. Cette densité peut être indiquée soit par une valeur positive (densité ou fraction atomique), soit par une valeur négative (masse volumique en g/cc). Une cellule est construite à partir d'une ou plusieurs surfaces et doit présenter un volume fermé. Cette construction est possible avec les opérateurs algébriques d'intersection « : » ou d'union « ». Il est également possible de construite une cellule comme la soustraction d'un petit volume à partir d'un plus grand volume (volume complémentaire « # »). Ce dernier est utilisé dans des systèmes à volumes emboîtés.

La cellule est déclarée sous cette forme : [19]

j m d geom params

avec

j : numéro de la cellule donné par l'utilisateur;

m : numéro du matériau qui occupe le volume de la cellule si elle n'est pas vide;

d : densité du matériau (+ : atomes/cm3) ou (- : en g/cm3) ;

geom : c'est l'ensemble des surfaces qui délimite le volume de la cellule incluant les opérateurs booléens;

params : optionnel, utilise des mots clé comme IMP (importance de la particule), Vol(définit le volume de la cellule si le MCNP ne peut pas le calculer).

Dans notre cas, on présente un exemple de carte cellules introduite dans l'input MCNP :

1

3

-1.0 -3000 -2000 1000

(60:50:-40) IMP:N=1

 

2

2

-7.76 40 -50 -60

(30:20:-10) IMP:N=1

 

3

3

-1.0 -30 -20

10 (5:-6:7) IMP:N=1

 

4

2

-7.76 -6000 -5000

4000 (3000:2000:-1000)

IMP:N=1

5

0

6000:-4000:5000

IMP:N=0

 

27

Chapitre 2 Modélisation et simulation du réacteur

28

3.2.2. Les Univers et le réseau (Universe & Lattice) :

Comme dans les réacteurs nucléaires sont construits à partir d'une répétition d'assemblage identiques d'une manière complète ou partielle, il est souvent pratique d'utiliser la carte Universe et Lattice (Univers et Réseau) dans la construction géométrique des cellules constituant le coeur du réacteur. Un univers est constitué d'un ensemble de cellules emboîtées dans un même volume global, donc il est relativement plus complexe géométriquement par rapport à un simple volume sphérique, cylindrique ou même cubique [19]. C'est le cas d'un élément combustible qui baigne dans son volume de modérateur. Dans ce cas, on modélise le crayon combustible par un long cylindre, inclus une gaine de protection et le tout est présent dans un volume parallélépipède de section carré et qui est rempli d'eau (Fig. 2.3). Une fois la cellule UNIVERSE est définie, il est possible désormais de la répéter n fois et autant qu'on le veut pour construire notre assemblage de combustible, lui-même défini comme un univers contenant plusieurs d'autres univers identiques, et ce avec l'option FILL (remplir). Par la suite, l'ensemble du coeur est construit à partir d'un arrangement judicieux des assemblages de combustibles dans leur espace et géométrie qui leur est dédiée.

7 0 -5 6 -7 IMP:N=1 FILL=6 $reactor core universe 6 0 1 -2 3 -4 IMP:N=1 U=6 LAT=1 FILL=-4:3 -4:3 0:0 &

C universe 6

is

geometrical arrangement of

fuel

assemblies

5

5 5

5 5 5 5

5

&

 
 
 
 
 
 

5

5 5

1 1 5 5

5

&

 
 
 
 
 
 

5

5 1

1 1 1 5

5

&

 
 
 
 
 
 

5

1 1

1 1 1 1

5

&

 
 
 
 
 
 

5

1 1

1 1 1 1

5

&

 
 
 
 
 
 

5

5 1

1 1 1 5

5

&

 
 
 
 
 
 

5

5 5

1 1 5 5

5

&

 
 
 
 
 
 

5

5 5

5 5 5 5

5

 
 
 
 
 
 
 

C

les

univers

1

et

4

sont

définis

ici comme

des

réseaux

C univers

1 (zone 1)

10

0

100

-200

300 -400 IMP:N=1 U=1 LAT=1 FILL=11 $fuel box

11

3

-1.0

700

IMP:N=1 U=11 $out of cladding filled with water

12

4

-6.5

800

-700 IMP:N=1 U=11 $Zircaloy cladding

13

0

900

-800

IMP:N=1 U=11 $void gap

14

1 -{Rho_Fuel:.7f} -900 IMP:N=1 U=11 $fuel pin

Les univers 7, 6, 5 et 1 sont introduits dans l'input MCNP comme suit :

Chapitre 2 Modélisation et simulation du réacteur

C univers 5 (rempli d'eau)

50 -1.0 1 -2 3 -4 IMP :N=1 U=5

3.2.3. La carte des Surfaces :

La définition des surfaces nécessaires pour la construction des cellules, intervient bien après la définition de celles-ci. Même si cet ordre semble parfois non conforme, il est basé sur l'importance de l'intuition humaine dans conception de la géométrie (disposition des volumes) qu'on veut utiliser, pour faire ressortir par la suite le besoin en surfaces utilisables.

Les surfaces sont définies comme suit : [19]

j geom a liste

j : est un nombre compris entre 1 et 99999 désignant le numéro de la surface, geom : représentent l'abréviation d'une surface comme mot clé reconnue par le programme MCNP pour définir une surface ou un plan. Ces dernières sont données dans le tableau 2.2 a : sont les coefficients de l'équation de la surface qui nous permettent de définir, l'emplacement de la surface, ses dimensions caractéristiques (Rayon d'une sphère ou cylindre) et son orientation.

29

30

Chapitre 2 Modélisation et simulation du réacteur

Tableau 2.2 : Bibliothèque des cartes des surfaces reconnues par MCNP [19].

Ainsi, on donne dans l'exemple suivant, les surfaces utilisées dans notre géométrie :

Chapitre 2 Modélisation et simulation du réacteur

C The Surface Block

1 PX -21.42 $ half of 21.42 cm = 17*1.26 cm

2 PX 0

3 PY -21.42

4 PY 0

5 CZ 70

6 PZ -{H_core/2:.2f}

7 PZ {H_core/2:.2f}

10 PZ -{H_core/2+28.00:.2f}

20 PZ {H_core/2+28.00:.2f}

30 CZ 75 $ ~ external radius of zone4

40 PZ -{H_core/2+38.00:.2f}

50 PZ {H_core/2+38.00:.2f}

60 CZ 85 $ for 20-cm radial reflector

C another cylinder

1000 PZ -{H_core/2+122.40:.2f}

2000 PZ {H_core/2+122.40:.2f}

3000 CZ 122

4000 PZ -{H_core/2+137.40:.2f}

5000 PZ {H_core/2+137.40:.2f}

6000 CZ 137

C for 7 cells per assembly side of 21.42 cm (factor of 17/7 on standard dimensions)

the box pitch the box pitch the box pitch the box pitch

100

PX

0

$

1st

surface

of

200

PX

1.2626

$

2nd

surface

of

300

PY

0

$

3rd surface

of

400

PY

1.2626

$

4th

surface

of

31

32

Chapitre 2

 
 
 
 

Modélisation et simulation du réacteur

700

C/Z

0.6313

0.6313

0.47610

$

Zircalloy cladding

800

C/Z

0.6313

0.6313

0.41895

$

void gap

900

C/Z

0.6313

0.6313

0.41295

$

fuel pin

On notera que dans notre cas, la hauteur du coeur a été prise comme un paramètre ou variable, qui sera gérée par un code Python qu'on écrit dans ce sens.

3.2.4. Définition des données dans MCNP :

a. Définition de la source :

MCNP comprend plusieurs types de source, à titre d'exemple on citera : la source générale définie par la carte SDEF, la source de surface définie par la carte SSR et la source de criticité généralement utilisée conjointement avec la carte de criticité KCODE.

Nous allons nous intéresser à la dernière source étant donné que nous traitons un problème de criticité.

i. La carte KCODE : apparaît sous le format : [19]

KCODE nsrck rkk ikz kct

nsrck: donne le nombre de neutrons par cycle.

rkk : donne la valeur initiale de keff.

ikz : donne nombre de cycles à ne pas prendre en considération dans le calcul final,

kct : donne le nombre total de cycles.

La carte KCODE est introduite dans l'input MCNP de notre modèle comme suit :

************* Criticality card ***************************** KCODE 4000 1 50 150

ii. La carte source KSRC :

Dans tous les problèmes de calcul neutronique avec MCNP, il est nécessaire d'utiliser une source de neutrons, notamment dans le calcul de criticité. Il donc impératif de la source initiale de neutrons qui provoqueront par la suite de la fission et vont générer à leur tour des sources de neutrons induits. Dans notre cas, une source du type ksrc [19] est utilisée et elle est définie par les positions X, Y et Z des sites sources de neutrons de fissions dans le problème. Il est important de choisir des positions appartenant à des volumes contenant de la matière fissile. Elle prend le format suivant :

ksrc x1 y1 z1 x2 y2 z2 ... xn yn zn

Chapitre 2 Modélisation et simulation du réacteur

33

ksrc : nom de la carte définissant la position de la source de fission initiale, xk yk zk : position de la source de fission initiale. Dans notre problème, on a défini quelques points sources se trouvant dans les crayons combustibles (centre des cylindres combustibles) :

KSRC -33.4 33.4 0 33.4 33.4 0 -33.4 -33.4 0 33.4 -33.4 0

& -22 22 0 22 22 0 -22 -22 0 22 -22 0

b. Définition des matériaux :

Les matériaux constituants la cellule sont définis par la carte :

Mm zaid1 fraction1 zaid2 fraction2...

m: est le numéro du matériau qui rempli une ou plusieurs cellules, le 0 est réservé pour le vide
zaid : Cette entrée se décompose en identifiant atomique et isotopique ZZZAAA.nnx, où Z est

le numéro atomique de l'élément considéré, A sa masse atomique, ainsi qu'un identifiant nn désignant la bibliothèque de section efficace utilisée dans le calcul et la classe de la bibliothèque donnée par x : c pour continue (spectre continu) et d pour discontinue (en groupes d'énergie). Fraction : est la fraction atomique ou massique du constituant i (élément/isotope) du matériau en question. Une fraction négative désigne une fraction/densité massique et une fraction positive désigne une fraction/densité atomique. [19]

La carte des matériaux est introduite dans l'input MCNP comme suit :

C Material Card

C Fuel composition

m1 92238.60c {-d_U8:.7f} &Uranium 238 92235.60c {-d_U5:.7f} &Uranium 235 90232.60c {-d_Th:.7f} &Thorium 232 8016.60c {-d_O16_Fuel:.7f} $ Oxygen 16

C Stainless steel composition

m2 6000.60c 0.08 14000.60c 2.00 24000.42c 19.50 25055.60c 1.50 &

26000.42c 67.34 28000.42c 9.50

C Water composition

m3 1002.60c 2 8016.60c 1

mt3 hwtr.01t

C Cladding made from Ziraloy

m4 40000.60c 0.988548 8016.60c 0.00773128 26056.60c 0.00372108

Chapitre 2 Modélisation et simulation du réacteur

34

c. Tallies :

Le code MCNP dispose de plusieurs enregistreurs, appelés Tallies qui permettent d'enregistrer la réponse du système ou la grandeur d'intérêt. Souvent cette grandeur est normalisée au volume ou au nombre de particules sources, ce qui nécessite un traitement numérique pour retrouver les grandeurs physiques souhaitées. L'essentiel de ces tallies est résumé dans le tableau 2.3 ci-dessous. Dans notre étude et selon l'usage dans les problèmes de neutroniques, le tally de flux de volume F4 est souvent le plus utilisé [19], moyennant une carte de multiplication FM qui permet de passer d'une grandeur brute (flux neutronique) à des grandeurs qui lui sont dépendantes (taux d'interaction, énergie déposée, ...).

Dans ce cas de figure il est nécessaire d'indiquer au code de calcul ou veut-on calculer le flux de volume, c-à-d les cellules d'intérêts, généralement il s'agit des cellules contenant de la matière fissile pour étudier le comportement du combustible ou des cellules contenant des matériaux ou échantillons à irradier. D'une manière générale, un tally est défini comme suit :

Fkn: X S1 S2 ... Sn tally de surface

Fkn: X C1 ... Cn . tally de volume

Avec :

k : un nombre entre 0 et 99 destiné à différentier les tallies de même type,

n : un chiffre entre 1 et 8 destiné à indiquer le type de tally calculé,

X: le type de particule,

Si : une surface sur laquelle on veut calculer le tally,

Ci : une cellule dans laquelle on veut calculer le tally.

Tableau 2.3 : Différents tallies utilisés par MCNP.[19]

Chapitre 2 Modélisation et simulation du réacteur

35

En plus des tallies géométriques qui permettent d'obtenir des valeurs moyennées sur une surface ou un volume, il est possible d'utiliser des tallies avec un certain maillage (carétsien ou cylindrique) et obtenir la distribution spatiale des grandeurs en question dans une zone donnée. Cette fonction est assurée par les tallies FMESH qui sont associés à la carte de multiplication FM de la même manière que pour les tallies de valeurs moyennes (Fn). IL est possible ainsi de visualiser les grandeurs annexes telles que le taux de réaction (fission, capture), la densité de puissance moyennant dans la zone d' intérêt. la carte FMESH se présente comme suit : [19]

FMESH14:n GEOM=xyz ORIGIN= -75 -75 -5 & $ cartesian geom. & origin of mesh

IMESH=

75 IINTS=

150

&

$

initial

X

and number

of

x-meshs

JMESH=

75 JINTS=

150

&

$

initial

Y

and number

of

y-meshes

KMESH=

5 KINTS=

1

 

$

initial

Z

and number

of

z-meshes

FM14 6.022E23 $ Avogadro constant used as multiplicator

II. Automatisation du calcul et interprétation des données par le langage PYTHON

II.1. Le Langage Python :

Python est un langage de programmation orientée objet (au même titre que les autres langages de programmation C, C++, fortran, java . . .), développé en 1989 par Guido VAN ROSSUM. On pourra citer ses principales caractéristiques :[20]

y' C'est un langage « open-source » : son utilisation est gratuite et les fichiers sources sont disponibles pour d'éventuels développement par la communauté des utilisateurs et experts.

y' Simple et très lisible.

y' Doté d'une bibliothèque libre de modules et utilitaires bien fournie, pour différentes utilisations : Calcul scientifique, Statistiques, Bases de données, Visualisation graphique ...

y' grande portabilité : indépendant vis à vis du système d'exploitation (linux, Windows, MacOs).

y' Orienté Objet : création d'objets définis par leur propres attributs et fonctions, pouvant même interagir avec d'autres objets de même nature ou même classe selon les méthodes prédéfinies et établies au préalable dans ce sens.

ü

Chapitre 2 Modélisation et simulation du réacteur

36

Typage dynamique : le typage (association une variable avec son type et allocation zone mémoire en conséquence) est fait automatiquement lors de l'exécution du programme, ce qui permet une grande flexibilité et rapidité de programmation, mais qui se paye par une surconsommation de mémoire et une perte de performance. [20]

ü Présente un support pour l'intégration d'autres langages ainsi que la gestion des fichiers et commandes dans n'importe quel système d'exploitation

II.2. Intégration du Python dans la modélisation et simulation du réacteur :

Dans ce qui suit, on présentera le code développé par Python dans le cadre de ce mémoire afin de gérer les simulations MCNP depuis la création du fichier INPUT (configuration donnée), l'exécution d'une simulation MCNP, lecture du fichier de sorite OUTPUT et l'interprétation graphique des résultats obtenus. On veillera à expliquer chaque partie du code, dans une logique d'apprentissage par l'exemple qui nous semble plus judicieuse dans le contexte de ce travail.

II.3. Description détaillés du Code [Criticité_Crt.py] :

3.1 Les Bibliothèques :

Avant de commencer à écrire le code, il est nécessaire d'inclure ou d'importer des bibliothèques qui facilitent la mise en oeuvre de certaines opérations et commandes pour une application donnée, afin de doter cette dernière des fonctions et modules supplémentaires sans être obligé de les coder par soi-même. Cette large bibliothèque de module et fonctions permet un gain de temps et d'effort assez important, qui seront orientés vers le développement de l'application elle-même et de la rendre de plus en plus efficace et portable.

Il faut donc au départ importer les packages avec l'instruction suivante :

import [nom de module]

· Le module math :

import math

C'est un module qui permet d'avoir accès aux fonctions mathématiques comme le cosinus (cos), le sinus (sin), la racine carrée (sqrt), le nombre (pi) et bien d'autres ...

· Le module os :

import os

Ce module fournit une façon portable pour l'utilisation des fonctionnalités dépendantes du système d'exploitation. Si on veut simplement lire ou écrire un fichier, on fait appel à la fonction « open() ». Par contre, si on veut manipuler les chemins de fichiers, on utilise le module

Chapitre 2 Modélisation et simulation du réacteur

37

« os.path », et si on veut lire toutes les lignes de tous les fichiers de la ligne de commande, on utilise le module fileinput. [21]

· Le module numpy :

Import numpy

La bibliothèque numpy quant à elle, permet d'effectuer des calculs numériques avec Python. Elle introduit une gestion facilitée des tableaux de nombres ainsi que des solveurs numériques des systèmes d'équations. [21]

· Le module decimal :

from decimal import *

Le module decimal fournit une arithmétique en virgule flottante rapide et produisant des arrondis mathématiquement corrects.

· Le module re :

import re

Le module re fournit une prise en charge complète des expressions régulières de type Perl en Python. En effet, il permet la recherche ciblée d'un mot ou une expression pour la récupération des données ou des valeurs recherchées dans les fichiers output. [21]

Une fois l'importation des bibliothèques nécessaires est terminée, on adopte une précision arithmétique pour définir le degrés de précision pour les nombres obtenus lors des calculs arithmétiques. La valeur par défaut du module Decimal est jusqu'à 28 chiffres significatifs. Cependant, il peut être modifié à l'aide de la méthode getcontext().prec . [21]

getcontext().prec = 12

3.2. Les paramètres initiaux :

a. Les variables :

Dans la suite de notre code Criticité_Crt.py, il y'a certaines paramètres qui sont obtenus par des entrées demandées par le programme PYTHON. Une fois ces paramètres introduits par l'utilisateur, une configuration est construite, correspondant à un jeu donné de paramètres d'entrée. Il s'agit notamment de l'enrichissement de l'uranium, la fraction du dioxyde d'uranium ainsi que la hauteur active de l'élément combustible.

i. enr_U5 : la valeur initiale d'enrichissement d'U5, introduite par l'instruction suivante :

enr_U5 = float(input('Give the value of U5 enrichment in [%]: '))

38

Chapitre 2 Modélisation et simulation du réacteur

ii. f_UO2 : la valeur initiale de la fraction d'UO2, introduite par l'instruction suivante :

f_UO2 = float(input('Give the value of UO2 volume fraction [%] in fuel .'))

iii. H_core : la valeur initiale de la hauteur du coeur du réacteur:

H_core = float(input(Give the active hight of the core [cm]: '))

b. Les constants :

À partir de là, nous avons inclus toutes les données nécessaires dont nous avons besoin pour calculer la composition physique du coeur en termes de fractions et densités massiques. Ainsi on définira toutes constantes, les unités et les coefficients de multiplication nécessaires comme la constante d'Avogadro, l'eV, le Barn , les masses molaires des isotopes et des matériaux qui entrent dans la composition des différentes parties du réacteur.

i. La constante d'Avogadro, l'eV et le Barn :

# Constants

NA = 6.022140E23 eV = 1.602176E-19 barn = 1.0E-24

 

ii. Les masses molaires des isotopes du combustible :

# Fuel composition Molar masses

M_U5 = 235.04000

M_U8 = 238.05000

M_Pu9 = 239.05216

M_U = 0.01 * (M_U5 * enr_U5 + M_U8 * (100-enr_U5))

M_Th = 232.03806

iii. les masses molaires des éléments légers :

# Water and Organic Matter Molar masses

M_H1 = 1.00790

M_O16 = 15.99900

M_C12 = 12.01074

M_N14 = 14.00670

iv. les masses molaires d'uraninite et de thorite :

# Uraninite and Thorite Molar Masses:

M_UO2 = (M_O16*2)+0.01*(M_U5*enr_U5+M_U8*(100-enr_U5)) M_ThO2 = (M_O16*2)+M_Th

v. Chapitre 2 Modélisation et simulation du réacteur

39

les densités des matériaux de base :

# basical Compound densities [g/cc]

Rho_UO2 = 10.60000 # Uraninite [g/cc]

Rho_ThO2 = 9.86 # Thorite [g/cc]

Rho_Wtr0 = 1.00 # Water at normal P,T conditions [g/cc]

Rho_SiO2 = 2.65000 # Silica or Quartz [g/cc]

vi. la puissance constante de conversion de 1 mégawatt pour passr du flux MCNP au flux physique :

# 1MW power conversion constant : Physical Flux to MCNP Flux

C = 7.62E16

3.3. Les fonctions:

a. La fonction Fuel (enr_U5, f_UO2) :

Nous avons définit toute une fonction pour les calculs propre au combustible, nommée « Fuel Definition », elle dépend de deux paramètres : l'enrichissement d'U-235 et la fraction volumique d'UO2 dans le combustible. Ces deux variables sont déclarées comme des variables globales(on utilise ainsi l'étiquette « global » pour ces variables) , ce qui signifie qu'elles seront reconnues dans tout le code. Ainsi, certains paramètres sont définis :

1. La masse molaire d'UO2 en fonction d'enrichissement d'U-235, cette masse est généralement proche de la masse d'U-238, mais comme nous travaillons dans les réacteurs l'enrichissement varié en fonction de la valeur d'U-235, et pour être plus prisé il faudrait recalculer la masse molaire d'URANIUM.

2. On calcule la fraction massique de l'UO2 : elle correspond de la masse présente de l'UO2 dans un volume unitaire de 1 cm3. Cette fraction est prise égale à 100% dans le cas d'un combustible à base d'UO2 pur. Elle variera ensuite en fonction de la fraction du Thorite ajoutée dans le combustible.

3. De même manière la fraction massique du ThO2 est définie et calculé.

4. Pour vérification, on demande au programme d'afficher les résultats pour un contrôle visuel avec la fonction « print () », qui affiche le résultat des calculs :

· {Rho_Fuel:.7f} # la densité de combustible

· {d_UO2:.7f} # la densité d'oxyde d'URANIUM

· {enr_U5:.3f} # l'enrichissement d'U-235

·

Chapitre 2 Modélisation et simulation du réacteur

40

{d_ThO2:.7f} # la densité d'oxyde de THORIUM

# The Fuel definition

def Fuel(enr_U5, f_UO2):

global d_UO2, d_ThO2, Rho_Fuel, M_UO2

M_UO2 = (M_O16*2)+0.01*(M_U5*enr_U5+M_U8*(100-enr_U5))#1

d_UO2 = f_UO2 * Rho_UO2 * 0.01 # 2

d_ThO2 = (100-f_UO2) * Rho_ThO2 * 0.01 # 3

Rho_Fuel = d_UO2 + d_ThO2 print(f"""

The Fuel mass density is {Rho_Fuel:.7f} [g/cc]") with:

Uraninite density fraction of {d_UO2:.7f} [g/CC] U5 enriched with {enr_U5:.3f} [%]

Thorite density fraction of {d_ThO2:.7f} [g/cc]

""") # 4

return Rho_Fuel

b. La fonction ZAID_Fuel(enr_U5, f_UO2) :

Une seconde fonction, appelée ZAID_Fuel est définie également pour calculer les fractions isotopiques et chimiques pour chaque matériau utilisé dans le fichier MCNP :

Ø d_U : la fraction massique de l'Uranium naturel

Ø d_U5 : la fraction massique de l'Uranium-235

Ø d_U8 : la fraction massique de l'Uranium -238

Ø d_Th : la fraction massique du Thorium

Ø d_O16_UO2 : la fraction massique d'Oxygène provenant de l'uraninite

Ø O16_ThO2 : la fraction massique d'Oxygène provenant de la Thorite

Ø d_O16_Fuel : la fraction massique totale d'Oxygène provenant de tout le combustible.

# The isotopes fraction definition

def ZAID_Fuel(enr_U5, f_UO2):

global d_UO2, d_ThO2, Rho_Fuel, M_UO2

global d_U5, d_U8, d_Th, d_O16_Fuel

# Matrix with ZAID generation

Chapitre 2 Modélisation et simulation du réacteur

41

d_U = d_UO2 * (M_U / M_UO2) d_U5 = 0.01 * (d_U * enr_U5) d_U8 = 0.01 * (d_U * (100 - enr_U5)) d_Th = d_ThO2 * (M_Th / M_ThO2)

# Oxygen fraction calculation

d_O16_UO2 = (d_UO2 * M_O16 * 2) / (M_UO2) d_O16_ThO2 = (d_ThO2 * M_O16 * 2) / (M_ThO2) d_O16_Fuel = (d_O16_UO2 + d_O16_ThO2) return d_U8, d_U5, d_Th, d_O16_Fuel

c. La fonction header(enr_U5, f_UO2, H_core):

Avec la fonction « header() » qui dépend des deux paramètres l'enrichissement d'U5 et la fraction d'UO2, il est possible ainsi de générer un fichier INPUT de type MCNP. Cette fonction permettra donc de créer un fichier texte (INPUT) avec toute la géométrie et la physique nécessaire pour le calcul MCNP. Elle permettra également d'exécuter le calcul une fois que le fichier input est généré correctement.

ON définit également la règle de nomination des fichiers afin de respecter la limitation en nombre de caractère pour les noms de fichiers, qui est imposée par MCNP, tout en incluant les informations nécessaires pour reconnaître les caractéristiques de la configuration générée. Ainsi, on définit les variables de nom de fichiers, à savoir « filename » pour (INPUT) et « output » pour (OUTPUT) comme indiqué dans la ligne 6 et 7, par exemple lorsque nous saisissons des valeurs d'enrichissement enr_U5 = 5% et la fraction volumique f_UO2 = 99%, un fichier input sera généré sous l'appellation U99e5.

Une fois que ce dernier est généré, la commande de calcul sera exécutée via la ligne :

« os.system(f'mcnp5 in={filename} out={Output}') »

Ceci permettra de faire appel au code MCNP à travers notre programme Python et l'exécuter dans son environnement. Une fois le calcul terminé, un fichier output est générée selon la règle de nomination déjà prédéfinie :

· INPUT : U99e5

· OUTPUT : U99e5O

En plus pour renormaliser les résultats des tallies obtenues par MCNP, on introduit les densités atomiques de chaque isotope/élément majeur dans le combustible, qui sont introduit dans les lignes 10-13.

Chapitre 2 Modélisation et simulation du réacteur

42

# Header Definition

def header(enr_U5, f_UO2, H_core): global filename, Output

Rho_Fuel=Fuel(enr_U5, f_UO2) # Files naming protocol

filename = f"U{int(f_UO2)}e{int(enr_U5)}" # la ligne 6

Output = f"U{int(f_UO2)}e{int(enr_U5)}O" # la ligne 7

d_U8, d_U5, d_Th, d_O16_Fuel=ZAID_Fuel(enr_U5, f_UO2) # Normalization coefficient for tally volume flux

N_U5 = (d_U5 * NA * 1E-24 * C)/M_U5 # la ligne 10

N_U8 = (d_U8 * NA * 1E-24 * C)/M_U8 # la ligne 11

N_Th = (d_Th * NA * 1E-24 * C)/M_Th # la ligne 12

N_Fuel = N_U5 + N_U8 + N_Th # la ligne 13

# Writing the MCNP input file

with open(f"{filename}", "w+") as header_card: header_card.write(

f""" c Head of the input file

c MCNP Simulations input

---c

----

c U5 Enrichment = {enr_U5:.3f} %

c UO2 volume fraction = {f_UO2:.2f} %

c Giving a Fuel density = {Rho_Fuel:.6f} [g/cc]

c

----

c Cell definition

----

c start file for MCNP project 2021

C NuScale SMR model

C

43

Chapitre 2 Modélisation et simulation du réacteur

 

1

2

3

4

3

2

3

2

-1.0 -3000 -2000 1000 (60:50:-40) IMP:N=1 -7.76 40 -50 -60 (30:20:-10) IMP:N=1

-1.0 -30 -20 10 (5:-6:7) IMP:N=1

-7.76 -6000 -5000 4000 (3000:2000:-1000)

IMP:N=1

5

0

6000:-4000:5000 IMP:N=0

 
 

7

0

-5 6 -7 IMP:N=1 FILL=6

 
 

6

0

1 -2 3 -4 IMP:N=1 U=6 LAT=1 FILL=-4:3 -4:3

0:0

&

5

5

5 5 5 5 5 5 &

 
 

5

5

5 1 1 5 5 5 &

 
 

5

5

1 1 1 1 5 5 &

 
 

5

1

1 1 1 1 1 5 &

 
 

5

1

1 1 1 1 1 5 &

 
 

5

5

1 1 1 1 5 5 &

 
 

5

5

5 1 1 5 5 5 &

 
 

5

5

5 5 5 5 5 5

 
 

C univers 1 (zone 1)

10 0 100 -200 300 -400 IMP:N=1 U=1 LAT=1 FILL=11

11 3 -1.0 700 IMP:N=1 U=11

12 4 -6.5 800 -700 IMP:N=1 U=11

13 0 900 -800 IMP:N=1 U=11

14 1 -{Rho_Fuel:.7f} -900 IMP:N=1 U=11

C univers 5 (rempli d'eau)

50 3 -1.0 1 -2 3 -4 IMP:N=1 U=5 $LAT=1 FILL=51

C The Surface Block

1 PX -21.42 $ half of 21.42 cm = 17*1.26 cm

2 PX 0

3 PY -21.42

4 PY 0

5 CZ 70 $ the closest radial dimension to the fuel assembly

6 PZ -{H_core/2:.2f}

7 PZ {H_core/2:.2f}

10 PZ -{H_core/2+28.00:.2f}

20 PZ {H_core/2+28.00:.2f}

30 CZ 75 $ ~ external radius of zone4

40 PZ -{H_core/2+38.00:.2f}

Chapitre 2 Modélisation et simulation du réacteur

44

50 PZ {H_core/2+38.00:.2f}

60 CZ 85 $ for 10-cm of Core's baril made with stainless steel

C primary vessel of the reactor

1000 PZ -{H_core/2+122.40:.2f}

2000 PZ {H_core/2+122.40:.2f}

3000 CZ 122 $ inner radius of the primary vessel

4000 PZ -{H_core/2+137.40:.2f}

5000 PZ {H_core/2+137.40:.2f}

6000 CZ 137 $ outer radis of the primary vessel

C for 7 cells per assembly side of 21.42 cm

100 PX 0

200 PX 1.2626

300 PY 0

400 PY 1.2626

700 C/Z 0.6313 0.6313 0.4761 $ outer radius of cladding

800 C/Z 0.6313 0.6313 0.41895 $ inner radius of cladding

900 C/Z 0.6313 0.6313 0.41295 $ fuel pin cell radius

C

C General cards

C

C PRDMP 2J 1

C

C The Materials (fuel at 900 K except Pu-

240 not available, D2O and Zircalloy at 300 K)

C

C Real fuel made from a mixture of UO2 and ThO2

m1 92238.60c {-d_U8:.7f} & 92235.60c {-d_U5:.7f} & 90232.60c {-d_Th:.7f} &

 
 

8016.60c

{-d_O16_Fuel:.7f}

 
 

m2 6000.60c

0.08 14000.60c 2.00 24000.42c

19.50 25055.60c 1.50

&

26000.42c

67.34 28000.42c 9.50

 
 

m3 1002.60c

2 8016.60c 1

 
 

mt3 hwtr.01t

 
 
 

m4 40000.60c

0.988548 8016.60c 0.00773128

26056.60c 0.00372108

 

Chapitre 2 Modélisation et simulation du réacteur

45

C Virtual materials used to calculate reaction rates

m235 92235.60c 1 8016.60c 2

 
 
 
 
 
 
 
 

m238 92238.60c 1 8016.60c 2

 
 
 
 
 
 
 
 

m232 90232.60c 1 8016.60c 2

 
 
 
 
 
 
 
 

C The Source

 
 
 
 
 
 
 
 

C

 
 
 
 
 
 
 
 

KSRC -33.4 33.4 0 33.4 33.4

0

-33.4

-33.4

0

33.4

-33.4

0

&

-22 22 0 22 22 0 -22

-22

0 22

-22 0

 
 
 
 
 

C KCODE 4000 1 100 200

 
 
 
 
 
 
 
 

KCODE 20000 1 50 800

 
 
 
 
 
 
 
 

C Flux volume tally calculation for real material : mixture of UO2 and ThO2

C Fission rate reaction for fuel material

F104:N (14 < (U=11) < (U=1))

SD104 5.35729E+01

FM104:N ({N_Fuel:.3e} 1 -6)

C Capture rate reaction for fuel material

F114:N (14 < (U=11) < (U=1))

SD114 5.35729E+01

FM114:N ({N_Fuel:.3e} 1 -2)

C

C Flux volume tally calculation for virtual material : pure UO2 with 100% o

f U5

C Fission rate reaction for fuel material

F504:N (14 < (U=11) < (U=1))

SD504 5.35729E+01

FM504:N ({N_U5:.3e} 235 -6)

C Capture rate reaction for fuel material

F514:N (14 < (U=11) < (U=1))

SD514 5.35729E+01

FM514:N ({N_U5:.3e} 235 -2)

C

C Flux volume tally calculation for virtual material : pure UO2 with 100% o

f U8

C Fission rate reaction for fuel material

F804:N (14 < (U=11) < (U=1))

SD804 5.35729E+01

Chapitre 2 Modélisation et simulation du réacteur

46

FM804:N ({N_U8:.3e} 238 -6)

C Capture rate reaction for fuel material

F814:N (14 < (U=11) < (U=1))

SD814 5.35729E+01

FM814:N ({N_U8:.3e} 238 -2)

C

C Flux volume tally calculation for virtual material : pure ThO2

C Fission rate reaction for fuel material

F204:N (14 < (U=11) < (U=1))

SD204 5.35729E+01

FM204:N ({N_Th:.3e} 232 -6)

C Capture rate reaction for fuel material

F214:N (14 < (U=11) < (U=1))

SD214 5.35729E+01

FM214:N ({N_Th:.3e} 232 -2)

C Fmesh card of fission distribution central CS of the core (10cm thick)

FMESH34:n GEOM=xyz ORIGIN= -140 -140 -5

IMESH= 140 IINTS= 280 &

JMESH= 140 JINTS= 280 &

KMESH= 5 KINTS= 1

FM34:N -7.62E16 0 -

2 $ Spatial distrib. of capture cst for 1MW power equivalent !!!!

""")

os.system(f'mcnp5 in={filename} out={Output}')

Après avoir exécuté la séquence de calcul MCNP, un fichier de sortie est généré et qui contient les informations sur la criticité de la configuration, à savoir : le facteur de multiplicateur effectif « k_eff », sa déviation standard « le Sigma », la fraction des neutrons thermiques, intermédiaires et rapides.

Cette étape est réalisée en effectuant une lecture du fichier de sortie avec la fonction « scan_k ».

scan_k = open(f"{Output}", "r")

for line in scan_k:

global k_eff, sigma, Thermal, Epithermal, Fast line = line.strip() # strip end-on-line

if re.search(r'keff = w', line): # and len(line)==7:
target_line = line.split(' ')

#print(f'{R}',target_line[8],f'\u00B1{target_line[15]}')

k_eff = float(target_line[8])

sigma = float(target_line[15])

#print(f'{R:.2f}',target_line[8],f'\u00B1{target_line[15]}')

# Modification of 28/11/2020: adding the fissionning neutrons

if re.search(r'(<0.625 ev)', line):

target_neutrons = line.split(' ')

Thermal = f'{(target_neutrons[12])}'

Thermal = float(Thermal.replace('%', ''))

Epithermal = f'{target_neutrons[27]+target_neutrons[28]}'

Epithermal = float(Epithermal.replace('%', ''))

Fast =

f'{target_neutrons[40]+target_neutrons[41]+target_neutrons[42]}'

Fast = float(Fast.replace('%', ''))

#print(f'{k_eff:.5f} {sigma:.5f}', Thermal, Epithermal, Fast)

scan_k.close()

return k_eff, sigma, Thermal, Epithermal, Fast

Chapitre 2 Modélisation et simulation du réacteur

47

e. La fonction Crt_info() :

Cette fonction Crt_info() permet d'enregistrer et d'archiver les différents résultats obtenus par la fonction « scan_k », en les transcrivant dans un fichier à part pour chaque configuration simulée :

file = 'Results'

def Crt_info():

global Rslt

Rslt = f"{file}"

with open(f"{Rslt}", "a+") as Crt_info_file:

Crt_info_file.write(f"""{H_core:.2f} {f_UO2:.5f}

{enr_U5:.3f} {k_eff:.5f} {sigma:.5f} {Thermal:.3f} {Epithermal:.3f}

{Fast:.3f}

""")

Chapitre 2 Modélisation et simulation du réacteur

48

f. La fonction Crt() :

La fonction Crt() a un rôle principale dans notre code PYTHON, elle repose sur un test arithmétique du résultat de calcul principal, c-à-d la valeur de keff, en la comparant au trois situations possibles, à savoir : keff < 1 (sous-critique), keff = (critique) et keff > 1 (sur-critique). Pour des raisons pratiques, on chercher un keff compris entre 1 et 1 + epsilon, où « epsilon » est la tolérance en pcm de la déviation du keff critique. Cette tolérance, est également définie comme paramètre ajustable dans le code. Un pas de variation de l'enrichissement « delta » est introduit et qui nous permet de modifier la configuration (composition isotopique et chimique du combustible) comme une fonction de l'enrichissement.

Ainsi, en démarrant d'une configuration test, une fois le calcul MCNP terminé et le keff obtenu, la fonction Crt() décidera d'augmenter ou de réduire l'enrichissement avec le pas « delta » pris comme constant et égal à 0.1% Avec epsilon = 0.005 (500pcm).

Cette opération est répétée N fois jusqu'à l'obtention d'un keff compris dans l'intervalle :

1 < k_eff < 1 + epsilon

Le code va s'arrêter en affichant un message, signifiant qu'une configuration critique est obtenue dans l'intervalle de valeurs souhaité.

def Crt():

global k_eff, epsilon, delta, enr_U5, f_UO2, filename, Output, H_core

epsilon = 0.00500

delta = 0.10

if (k_eff > 1 + epsilon):

enr_U5 = enr_U5 - delta

f_UO2 = f_UO2

H_core = 100

os.system(f'del runt* srct* meshta* "U{int(f_UO2)}e{int(enr_U5)}"')

os.system(f'del "U{int(f_UO2)}e{int(enr_U5)}O" ')

header(enr_U5, f_UO2, H_core)

Crt_info()

Crt()

elif (k_eff < 1):

enr_U5 = enr_U5 + delta

f_UO2 = f_UO2

H_core = 100

os.system(f'del runt* srct* meshta* "U{int(f_UO2)}e{int(enr_U5)}"')

os.system(f'del "U{int(f_UO2)}e{int(enr_U5)}O" ')

header(enr_U5, f_UO2, H_core)

Crt_info()

Crt()

else:

os.system(f'del runt* srct*')

# Crt_info()

print(f'keff = {k_eff:.5f} ,On parle d'un réacteur critique.')

exit()

return k_eff

Chapitre 2 Modélisation et simulation du réacteur

II.4. Intégration du Python dans la production des figures :

4.1. Description du Code [ plot.py] :

Le Python offre la possibilité de faire des interprétations graphiques des fonctions et des données, en faisant appel à des modules dédiés (gratuits et open-source) avec une qualité égale ou meilleure que certains logiciels commerciaux. Un des modules les plus utilisés est « Matplotlib » [23]. Ainsi, comme premier exercice d'apprentissage et maîtrise de ce module, on a construit un code « plot.py », qui permet de tracer les données des sections efficaces des diverses isotopes, tel que l'URANIUM et du THORIUM, en utilisons les données récupérées sous forme de fichiers textes du site américain du BROOKHEAVEN National Laboratory: https://nndc.bnl/sigma.

Ces fichiers des sections efficaces d'intérêt (fission, capture) sont répertoriés dans un dossier comme c'est montré ci-dessous dans la figure 2.4.

Figure 2.4 : Les données des sections efficaces [22].

49

Chapitre 2 Modélisation et simulation du réacteur

50

En exploitant les fonctionnalités du Python en termes de gestion et manipulation des fichiers et dossiers, il est possible de lire le contenu du dossier « data » qui contient les fichiers des différentes sections efficaces des isotopes d'intérêt neutronique et de proposer à l'utilisateur de choisir l'un des fichiers à interpréter graphiquement.

import matplotlib.pyplot as plt import csv import os import numpy as np

fig, ax = plt.subplots()

# Manage and edit files in directory

path = './data'

Files = []

dir_list = os.listdir(path)

N = len(dir_list)

# print(dir_list, N)

for i in range(N):

Files.append(dir_list[i]) print(f'{i+1}.{Files[i]}')

Choice = input('Give the number of file to plot : ... ')

n = int(Choice)

# Reading the data file

file = f'./data/{Files[n-1]}'

# read the lines from the file

with open(f'{file}', "r") as f:

lines = f.readlines()

f.close()

En = []

Le courbes sont traces en utilisant les axes logarithmiques comme il est d'usage dans ce genre de représentations à cause des intervalles de valeurs des sections efficaces ainsi que des énergies des neutrons incidents.

Chapitre 2 Modélisation et simulation du réacteur

51

Sigma = []

with open(f'{file}', 'r') as csvfile:

plots = csv.reader(csvfile, delimiter=',')

next(plots, None) # skip the header

for row in plots:

En.append(float(row[0]))

Sigma.append(float(row[1]))

En = np.array(En)

Sigma = np.array(Sigma)

# showing and saving the plot

ax.loglog(En, Sigma)

# Creating the plot

# Tuning the canevas

ax.set(xlabel='Incident Neutron Energy [eV]', ylabel='Cross-

Section [barn]',

title=f'Neutron Cross-Section:{Files[n-1]} ')

ax.grid()

fig.savefig(f"./img/{Files[n-1]}.png")

plt.show() #affichage de la figure

« plot.py »

4.2. Code d'interprétation graphique de contour [Plotting_FMESH.py ] :

Avec le code « Plotting_FMESH.py », il nous est possible de tracer la distribution spatiale du flux neutroniques au niveau de la section centarle du coeur du réacteur avec un maillage adéquat qui permet de distinguer les crayons combustibles des parties modérateurs. Ce code permet en effet, de lire les fichiers « Meshtal » générés par l'exécution du code MCNP, via la carte du tally FMESH, ensuite il procède à la triangulation des deux coordonnées XY pour construire une figure de contour (2D) de la valeur physique désirée : flux neutronique ou taux de réaction.

# Implementation of matplotlib function

import matplotlib.pyplot as plt

import matplotlib.tri as tri

import matplotlib.path as mpath

import matplotlib.patches as mpatches

Chapitre 2 Modélisation et simulation du réacteur

52

from matplotlib import ticker, cm

from matplotlib.gridspec import GridSpec

from mpl_toolkits.axes_grid1 import make_axes_locatable

import numpy as np

import csv

import re

from itertools import islice

x = [] #X meshgrid

y = [] #Y meshgrid

z = [] #Z meshgrid cell level

# Reading the XY mesh values

file = 'meshtal'

filename = f'{file}'

with open(f'{filename}', 'r') as csvfile:

for line in islice(csvfile, 13, None):

plots = csv.reader(csvfile, skipinitialspace=True, delimiter=' ')

for row in plots:

x.append(float(row[0]))

y.append(float(row[1]))

x = np.array(x)

y = np.array(y)

print(x, y)

triang = tri.Triangulation(x, y)

fig, axs = plt.subplots(nrows=1, ncols=1) #, sharex=True, sharey=True) #, figsize = ())

# Getting the Z-value results from the data file

with open(f'{filename}', 'r') as results:

for line in islice(results, 13, None):

results = csv.reader(results, skipinitialspace=True, delimiter=' ')

Res = []

for row in results:

Res.append(float(row[3]))

Z = np.array(Res)

Rmax = max(Z)

Rmin = min(Z) #min(Z)

print(Z)

Chapitre 2 Modélisation et simulation du réacteur

53

tcf = axs.tricontourf(triang, Z, levels=np.linspace(Rmin, Rmax, 50), cm ap=cm.jet)

axs.set_xlabel(r'X (cm) ')

axs.set_title(f'{filename}')

circle1 = plt.Circle((0,

0),

75,

linewidth=1.5,

linestyle='--', color='r', fill=False)

circle2 = plt.Circle((0,

0),

85,

linewidth=1.5,

linestyle='--', color='r', fill=False)

circle3 = plt.Circle((0,

0),

122,

linewidth=1.5,

linestyle='--', color='r', fill=False)

circle4 = plt.Circle((0,

0),

137,

linewidth=1.5,

linestyle='--', color='r', fill=False)

axs.add_artist(circle1)

axs.add_artist(circle2)

axs.add_artist(circle3)

axs.add_artist(circle4)

#shared Y axis

axs.set_ylabel(r'Y (cm) ')

axs.set_aspect('equal')

divider = make_axes_locatable(plt.gca())

cax = divider.append_axes("right", "05%", pad="3%")

plt.colorbar(tcf, cax=cax)

plt.show() #affichage de la figure

« Plotting_FMESH.py »

4.3. Description du Code [Plot_Spectrum.py ] :

import numpy as np

import matplotlib.pyplot as plt import csv

import os

# Preparing the canevas (figure)

Pour déterminer le flux neutronique sur le volume du coeur, nous avons utilisé un code écrire par le langage PYTHON qui nous a permis de tracer le spectre du flux neutronique via la lecture de fichier « Spectrum » générés par l'exécution du code MCNP inclus dans le fichier «Criticité_Spectrum.py», via la carte du tally F4 (1/ ????2) flux volumique normaliser par neutron source obtenu par le code MCNP pour la cellule d'intérêt avec un découpage d'énergie de 413 groupes d'énergie neutronique en utilisant la carte E0.

Chapitre 2 Modélisation et simulation du réacteur

54

fig, ax = plt.subplots()

File = 'spectrum' #[]

Counter = 0

title = {'U99':1, 'U75':2, 'U67':3, 'U50':4, 'U33':5, 'U25':6}

# read the lines from the file

with open(f'{File}', "r") as f:

lines = f.readlines()

f.close()

En = []

Flux99 =

[]

Flux75 =

[]

Flux67 =

[]

Flux50 =

[]

Flux33 =

[]

Flux25 =

[]

with open(f'{File}', 'r') as csvfile:

plots = csv.reader(csvfile, delimiter=' ') next(plots, None) # skip the header for row in plots:

En.append(float(row[0])) Flux99.append(1.802e+15*float(row[1])) Flux75.append(1.782e+15*float(row[2])) Flux67.append(1.775e+15*float(row[3])) Flux50.append(1.760e+15*float(row[4])) Flux33.append(1.745e+15*float(row[5])) Flux25.append(1.738e+15*float(row[6]))

En = np.array(En)

Flux99 = np.array(Flux99)

Flux75 = np.array(Flux75)

Flux67 = np.array(Flux67)

Flux50 = np.array(Flux50)

Flux33 = np.array(Flux33)

Chapitre 2 Modélisation et simulation du réacteur

Flux25 = np.array(Flux25)

# Creating the plot

# Tuning the canevas

ax.set(xlabel='Incident Neutron Energy [eV]', ylabel='Flux [n/cm2]', title='Neutron Spectrum')

ax.grid()

ax.loglog(En, Flux99, drawstyle='steps', label='UO2 = 99%') ax.loglog(En, Flux75, drawstyle='steps', label='UO2 = 75%') ax.loglog(En, Flux67, drawstyle='steps', label='UO2 = 67%') ax.loglog(En, Flux50, drawstyle='steps', label='UO2 = 50%') ax.loglog(En, Flux33, drawstyle='steps', label='UO2 = 33%') ax.loglog(En, Flux25, drawstyle='steps', label='UO2 = 25%') ax.legend(loc='lower center', handlelength=3, handleheight=3.5)

# showing and saving the plot fig.savefig("test.png", DPI=600) plt.show()

« Plot_Spectrum.py »

55

précédent sommaire suivant






Bitcoin is a swarm of cyber hornets serving the goddess of wisdom, feeding on the fire of truth, exponentially growing ever smarter, faster, and stronger behind a wall of encrypted energy








"Piètre disciple, qui ne surpasse pas son maitre !"   Léonard de Vinci