On étudie une boule de rayon constituée d’uranium 235.
L’uranium 235 n’a pas un noyau stable, celui-ci peut se fissionner en “captant” un neutron selon la réaction nucléaire
+ 1 neutron + + neutrons
où et sont deux noyaux plus légers. La valeur moyenne de est . Le nombre de réactions par unité de temps et de volume vaut .
On se place en coordonnées sphériques, note le nombre de neutrons par unité de volume et le vecteur densité de courant de neutrons.
On prend pour condition aux limites .
1/ En faisant un bilan de neutrons sur un volume mésoscopique, démontrer l’équation aux dérivées partielles vérifiée par :
On fait un bilan de neutrons sur une coquille sphérique de rayon intérieur et d’épaisseur .
À chaque fois que la réaction se produit, neutrons sont émis et un neutron est capté, donc neutrons supplémentaires apparaissent. Le nombre de réactions dans le volume élémentaire durant est . Donc
Or , donc en divisant par on trouve l’équation
La loi de Fick donne , avec la diffusivité des neutrons dans l’uranium 235. En remplaçant dans l’équation, on trouve
2/ On pose . Montrer que vérifie l’équation de diffusion
On remplace par dans l’équation précédente :
En multipliant par , on trouve l’équation
3/ Quelles sont les conditions aux limites vérifiées par en et ?
En , la densité particulaire doit rester finie, donc .
En , on a la condition aux limites , donc .
Pour résoudre numériquement l’équation de diffusion, on discrétise l’espace avec un pas et le temps avec un pas . On note .
4/ Établir le schéma d’Euler explicite pour résoudre numériquement l’équation de diffusion vérifiée par :
En additionnant, on trouve
De plus, , d’où .
L’équation de diffusion s’écrit donc
On peut isoler :
5/ Compléter le code Python ci-dessous pour simuler la désintégration de l’uranium 235 dans la boule. On prendra comme condition initiale une densité de neutrons uniforme dans la boule égale à (sauf aux conditions aux limites où elle est nulle).
import numpy as np
R = 0.2 # rayon de la boule en m
nu = 2.5 # nombre moyen de neutrons émis par fission
tau = 5.4e-9 # temps moyen entre deux fissions en s
D = 2e5 # diffusivité des neutrons dans l'uranium 235 en m2/s
Nx = 50 # nombre d'échantillons spatiaux
Nt = 1000 # nombre d'échantillons temporels
dx = ... # pas spatial
dt = 0.5 * dx**2 / (2*D) # pas temporel (condition de stabilité)
t = ... # array contenant tous les instants
r = ... # array contenant toutes les positions
y = ... # initialisation de la matrice avec des zéros
y[0,1:-1] = ... # condition initiale : densité uniforme
for i in range(0, Nt-1):
y[i+1, ...] = 0 # condition aux limites en r=0
y[i+1, ...] = 0 # condition aux limites en r=R
for j in range(1, Nx-1):
# schéma d'Euler explicite
y[i+1,j] = ...dx = R / (Nx - 1) # pas spatial
t = np.arange(Nt) * dt # array contenant tous les instants
r = np.linspace(0, R, Nx) # array contenant toutes les positions
y = np.zeros( (Nt,Nx) ) # initialisation de la matrice avec des zéros
y[0,1:-1] = 1e12 * r[1:-1] # condition initiale : densité uniforme
for i in range(0, Nt-1):
y[i+1, 0] = 0 # condition aux limites en r=0
y[i+1, -1] = 0 # condition aux limites en r=R
for j in range(1, Nx-1):
# schéma d'Euler explicite
y[i+1,j] = y[i,j] + D*dt/dx**2 * (y[i,j+1] - 2*y[i,j] + y[i,j-1]) + (nu-1)/tau * y[i,j] * dt6/ Tracer la densité de neutrons en fonction du rayon aux instants , , , et où est le temps final de la simulation.
On peut utiliser le code suivant pour tracer la densité de neutrons en fonction du rayon à différents instants :
n = np.zeros_like(y)
n[:, 1:] = y[:, 1:] / r[1:] # calcul de la densité de neutrons (r[0] = 0)
n[:, 0] = n[:, 1] # en r=0, n est finie : on prolonge par continuité
import matplotlib.pyplot as plt
plt.figure()
plt.plot(r, n[0,:], label=f't={t[0]:.2e} s')
plt.plot(r, n[Nt//4,:], label=f't={t[Nt//4]:.2e} s')
plt.plot(r, n[Nt//2,:], label=f't={t[Nt//2]:.2e} s')
plt.plot(r, n[3*Nt//4,:], label=f't={t[3*Nt//4]:.2e} s')
plt.plot(r, n[-1,:], label=f't={t[-1]:.2e} s')
plt.xlabel('Rayon r (m)')
plt.ylabel('Densité de neutrons (m$^{-3}$)')
plt.title("Évolution de la densité de neutrons dans la boule d'uranium 235")
plt.legend()
plt.show()7/ Tracer l’évolution temporelle de la densité de neutrons en .
plt.figure()
plt.plot(t, n[:, Nx//2])
plt.xlabel('Temps t (s)')
plt.ylabel('Densité de neutrons (m$^{-3}$)')
plt.title("Évolution temporelle de la densité de neutrons en r=R/2")
plt.show()8/ Pour de petites valeurs de , la densité de neutrons tend vers avec le temps. Pour de grandes valeurs de , la densité de neutrons croît exponentiellement avec le temps. Déterminer la valeur critique de séparant ces deux comportements. On pourra procéder par essais successifs et on la déterminera à près.
Avec , la simulation ne dure que quelques nanosecondes : le profil initial n’est pas le mode fondamental , il se déforme d’abord, et cette relaxation masque complètement la tendance exponentielle près du rayon critique. Il faut allonger la simulation, par exemple Nt = 20000.
Pour , la densité de neutrons tend vers avec le temps.
Pour , la densité de neutrons croît exponentiellement avec le temps.
Le rayon critique est situé entre ces deux valeurs : , en accord avec la valeur analytique .