Etude neutronique d'une configuration d'un cœur à base du combustible uranium-thoriumpar Hakim BOUZOURDAZ et Houssem MAKHLOUFI Université Ferhat Abbas Sétif-1 - Master 2020 |
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 :
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 &
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
31
32 Chapitre 2
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é.
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 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 :
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
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
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]
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
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.
# 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 :
Chapitre 2 Modélisation et simulation du réacteur 40
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 :
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 :
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
43 Chapitre 2 Modélisation et simulation du réacteur
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
Chapitre 2 Modélisation et simulation du réacteur 45 C Virtual materials used to calculate reaction rates
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 ».
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 :
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é.
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}')
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 = []
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 |
|