[docs]classWholeDeviceModel:""" SCPN WDM: Coupled Multi-Physics Simulation. Loops: Equilibrium <-> Transport <-> Wall <-> Radiation """def__init__(self,config_path):self.transport=TransportSolver(config_path)self.pwi=SputteringPhysics("Tungsten")self.transport.solve_equilibrium()@staticmethoddef_require_finite_non_negative(name:str,value:float)->float:out=float(value)ifnotnp.isfinite(out)orout<0.0:raiseValueError(f"{name} must be finite and >= 0.")returnout@staticmethoddef_require_finite_positive(name:str,value:float)->float:out=float(value)ifnotnp.isfinite(out)orout<=0.0:raiseValueError(f"{name} must be finite and > 0.")returnout
[docs]defthomas_fermi_pressure(self,n_e_m3,T_eV):""" Hardened Thomas-Fermi Equation of State (EOS) heuristic. Accounts for electron degeneracy pressure in the WDM regime. P_total = P_ideal + P_deg """n_e=self._require_finite_positive("n_e_m3",n_e_m3)t_ev=self._require_finite_non_negative("T_eV",T_eV)p_ideal=n_e*(t_ev*1.602e-19)# Boltzmannh_bar=1.054e-34m_e=9.109e-31p_deg=(h_bar**2/m_e)*(n_e**(5.0/3.0))# Fermi degeneracyreturnfloat(p_ideal+p_deg)
[docs]defcalculate_redeposition_fraction(self,T_edge_eV,B_field_T):""" Estimates the fraction of sputtered atoms that are promptly redeposited. Redeposition fraction f_redep ~ 1 - (lambda_ion / rho_L) For heavy impurities (W) in high B-field, redeposition can exceed 90%. """# Ionization mean free path lambda_ion ~ v_thermal / (n_e * <sigma_v>_ion)# Larmor radius rho_L = m*v / qB# Heuristic for W: f_redep increases with density and B-fieldself._require_finite_non_negative("T_edge_eV",T_edge_eV)b_field=self._require_finite_positive("B_field_T",B_field_T)n_e_edge=self._require_finite_positive("edge_density",self.transport.ne[-1]*1e19)# Scaling based on impurity transport benchmarksf_redep=0.95*(1.0-np.exp(-(b_field/5.0)*(n_e_edge/1e19)))returnfloat(np.clip(f_redep,0.0,0.99))
[docs]defplot_results(self,history):"""Plot discharge evolution and export WDM summary figure."""iflen(history)==0:raiseValueError("history must not be empty.")df=pd.DataFrame(history)fig,(ax1,ax2)=plt.subplots(2,1,figsize=(10,8))ax1.plot(df["time"],df["Te_core"],"r-",label="Core Temp (keV)")ax1.set_ylabel("Temperature")ax1.set_title("Thermal Quench due to Impurity Accumulation")ax1.grid(True)ax1.legend()ax2.plot(df["time"],df["W_impurity"],"k-",label="Total Impurities")ax2.set_xlabel("Time (s)")ax2.set_ylabel("Accumulation (a.u.)")ax2.legend()plt.tight_layout()plt.savefig("WDM_Simulation_Result.png")print("Analysis Saved: WDM_Simulation_Result.png")
if__name__=="__main__":cfg="03_CODE/SCPN-Fusion-Core/validation/iter_validated_config.json"wdm=WholeDeviceModel(cfg)wdm.run_discharge(duration_sec=2.0)# Short run to see collapse