Untitled
unknown
python
18 days ago
3.0 kB
3
Indexable
import numpy as np from scipy.linalg import lu_factor, lu_solve def create_grid(R, I): dr = R / I edges = np.linspace(0, R, I + 1) centers = (edges[:-1] + edges[1:]) / 2 return dr, centers, edges def diffusion_setup(R, I, D, Sig_a, S, BC, geometry): dr, centers, edges = create_grid(R, I) A = np.zeros((I + 1, I + 1)) b = np.zeros(I + 1) if geometry == 0: S_area = np.ones_like(edges) S_area[0] = 0 V = np.ones_like(edges) * dr elif geometry == 1: S_area = 2 * np.pi * edges V = np.pi * (edges[1:I + 1]**2 - edges[0:I]**2) elif geometry == 2: S_area = 4 * np.pi * edges**2 V = (4/3) * np.pi * (edges[1:I + 1]**3 - edges[0:I]**3) A[I, I] = (BC[0] / 2 + BC[1] / dr) A[I, I - 1] = (BC[0] / 2 - BC[1] / dr) Dplus = 0 for i in range(I): r = centers[i] Dminus = Dplus Dplus = 2 * (D(r) * D(r + dr)) / (D(r) + D(r + dr)) A[i, i] = (Dplus * S_area[i + 1]) / (dr * V[i]) + Sig_a(r) b[i] = S(r) * V[i] if i > 0: A[i, i - 1] = (-Dminus * S_area[i]) / (dr * V[i]) A[i, i] += (Dminus * S_area[i]) / (dr * V[i]) A[i, i + 1] = (-Dplus * S_area[i + 1]) / (dr * V[i]) return centers, A, b def solve_diffusion(R, I, D, Sig_a, S, BC, geometry): centers, A, b = diffusion_setup(R, I, D, Sig_a, S, BC, geometry) A_factored = lu_factor(A) phi = lu_solve(A_factored, b) return phi, centers # Constants radius_source = 2.3 S_source = 1e6 Pu_density = 19.74 Fe_density = 7.84 Pu_sigma_a = 2.11 Fe_sigma_a = 0.006 Pu_sigma_tr = 6.8 Fe_sigma_tr = 0.3703701 N_A = 6.022e23 M_Pu = 244 M_Fe = 56 # Number densities N_Pu = (Pu_density * N_A) / M_Pu N_Fe = (Fe_density * N_A) / M_Fe # Macroscopic cross-sections Sigma_a_Pu = N_Pu * Pu_sigma_a * 1e-24 Sigma_a_Fe = N_Fe * Fe_sigma_a * 1e-24 Sigma_tr_Pu = N_Pu * Pu_sigma_tr * 1e-24 Sigma_tr_Fe = N_Fe * Fe_sigma_tr * 1e-24 # Diffusion coefficients D_Pu = 1 / (3 * Sigma_tr_Pu) D_Fe = 1 / (3 * Sigma_tr_Fe) # Functions for D, Sigma_a, and S def D_func(r): return D_Pu if r < radius_source else D_Fe def Sigma_a_func(r): return Sigma_a_Pu if r < radius_source else Sigma_a_Fe def S_func(r): return S_source if r < radius_source else 0 # Boundary conditions BC = [1, 0, 0] # Geometry geometry = 2 # Initial radius and cells R = 10 I = 100 # Solve for flux phi, centers = solve_diffusion(R, I, D_func, Sigma_a_func, S_func, BC, geometry) # Calculate leakage leakage = -D_func(R) * (phi[-1] - phi[-2]) / (centers[-1] - centers[-2]) print(f"Leakage: {leakage:.4e} neutrons/cm^2/s") # Adjust shield thickness while leakage > 1e4: R += 0.1 phi, centers = solve_diffusion(R, I, D_func, Sigma_a_func, S_func, BC, geometry) leakage = -D_func(R) * (phi[-1] - phi[-2]) / (centers[-1] - centers[-2]) print(f"Shield: {R:.2f} cm, Leakage: {leakage:.4e} neutrons/cm^2/s") print(f"Shield thickness needed: {R - radius_source:.2f} cm")
Editor is loading...
Leave a Comment