import numpy as np import matplotlib.pyplot as plt import pandas as pd from datetime import datetime class CorrectedEnergyShuttleSimulator: """ Corrected Energy Shuttle Simulator with Realistic Electron Penetration High vacuum: Better electron penetration due to lower N2 density High pressure: Poor electron penetration due to electron blocking """ def __init__(self): # Physical constants self.KB = 1.380649e-23 # Boltzmann constant [J/K] self.EV_TO_J = 1.602176e-19 # eV to J conversion self.ELEMENTARY_CHARGE = 1.602e-19 # C # Molecular properties self.IE_N2 = 15.58 # N2 ionization energy [eV] self.IE_C2H4 = 10.51 # C2H4 ionization energy [eV] self.DELTA_E = self.IE_N2 - self.IE_C2H4 # 5.07 eV energy release # WIDE PRESSURE RANGE CONDITIONS self.BULK_PRESSURE_MIN = 1e-4 # Pa - minimum bulk pressure self.BULK_PRESSURE_MAX = 300 # Pa - maximum bulk pressure # Ion lifetimes self.TAU_N2_GROUND = 1e-9 # N2+ ground state lifetime [s] self.TAU_C2H4_GROUND = 1e-6 # C2H4+ ground state lifetime [s] # Local pressure enhancement self.LOCAL_ENHANCEMENT_MIN = 10 # Minimum enhancement factor self.LOCAL_ENHANCEMENT_MAX = 5000 # Maximum enhancement factor self.LOCAL_ENHANCEMENT_TYPICAL = 100 # Typical/expected value # Rydberg state parameters self.RYDBERG_LIFETIME_MIN = 5 # Minimum lifetime enhancement self.RYDBERG_LIFETIME_MAX = 100 # Maximum lifetime enhancement self.RYDBERG_LIFETIME_TYPICAL = 15 # Typical enhancement # Electron penetration parameters - CORRECTED self.ELECTRON_CROSS_SECTION_N2 = 5e-20 # m² (electron scattering) self.ELECTRON_MEAN_FREE_PATH_FACTOR = 1.5 # Path length factor # Molecular properties self.MASS_N2 = 28.014 * 1.66054e-27 # kg self.MASS_C2H4 = 28.054 * 1.66054e-27 # kg # Cross sections self.SIGMA_IONIZATION_N2 = 2.8e-20 # m² self.SIGMA_IONIZATION_C2H4 = 2.0e-20 # m² self.SIGMA_CHARGE_TRANSFER = 1e-16 # m² # Experimental setup self.temperature = 553.15 # Temperature [K] (280°C) self.electron_current = 34.6e-6 # A self.c2h4_fraction = 0.091 # 9.1% ethylene self.ionization_path_length = 6e-3 # 6 mm path length # Calculate fundamental parameters self._calculate_physics_parameters() print("="*80) print("CORRECTED Energy Shuttle Simulator") print("="*80) print("Model: Pressure-Dependent Electron Penetration + Physical Limitations") print(f"\nCORRECTED ELECTRON PENETRATION:") print(f" ⚡ High vacuum → Better penetration (less N₂ blocking)") print(f" ⚡ High pressure → Poor penetration (more N₂ blocking)") print(f" ⚡ Exponential decay with N₂ density") print(f" ⚡ Path length: {self.ionization_path_length*1e3:.0f} mm") print(f"\nPRESSURE RANGE:") print(f" 🌀 Bulk pressure: {self.BULK_PRESSURE_MIN:.0e} - {self.BULK_PRESSURE_MAX:.0f} Pa") print(f" 🌀 Local enhancement: {self.LOCAL_ENHANCEMENT_MIN}-{self.LOCAL_ENHANCEMENT_MAX}× (typical: {self.LOCAL_ENHANCEMENT_TYPICAL}×)") print(f" ⚛️ Rydberg lifetime: {self.RYDBERG_LIFETIME_MIN}-{self.RYDBERG_LIFETIME_MAX}× (typical: {self.RYDBERG_LIFETIME_TYPICAL}×)") print("="*80) def _calculate_physics_parameters(self): """Calculate fundamental parameters""" mu = (self.MASS_N2 * self.MASS_C2H4) / (self.MASS_N2 + self.MASS_C2H4) self.v_thermal_N2 = np.sqrt(8 * self.KB * self.temperature / (np.pi * mu)) self.v_thermal_C2H4 = np.sqrt(8 * self.KB * self.temperature / (np.pi * self.MASS_C2H4)) print(f"\nCalculated Parameters:") print(f" N₂ thermal velocity: {self.v_thermal_N2:.0f} m/s") print(f" C₂H₄ thermal velocity: {self.v_thermal_C2H4:.0f} m/s") print(f" Temperature: {self.temperature:.0f} K") print(f" Electron scattering cross-section: {self.ELECTRON_CROSS_SECTION_N2:.1e} m²") def calculate_local_pressure_enhancement(self, bulk_pressure, scenario='typical'): """Calculate local pressure enhancement with scenario-dependent values""" log_pressure = np.log10(bulk_pressure + 1e-10) # Base enhancement factor (sigmoid function) base_factor = 1.0 / (1.0 + np.exp(-1.5 * (log_pressure + 2.0))) if scenario == 'minimum': enhancement = self.LOCAL_ENHANCEMENT_MIN * (1.0 + 2.0 * base_factor) elif scenario == 'maximum': enhancement = self.LOCAL_ENHANCEMENT_MAX * (0.2 + 0.8 * base_factor) else: # typical enhancement = self.LOCAL_ENHANCEMENT_TYPICAL * (0.5 + 1.0 * base_factor) return enhancement def calculate_electron_penetration_corrected(self, bulk_pressure, local_enhancement): """ CORRECTED: Calculate electron penetration based on N2 density High vacuum: Better penetration (exponential law) High pressure: Poor penetration due to electron blocking """ local_pressure = bulk_pressure * local_enhancement # Calculate N2 density from local pressure n2_density = local_pressure * (1.0 - self.c2h4_fraction) / (self.KB * self.temperature) # Mean free path for electrons in N2 mean_free_path = 1.0 / (n2_density * self.ELECTRON_CROSS_SECTION_N2) # Electron penetration follows exponential attenuation (Beer-Lambert law) # P = exp(-path_length / mean_free_path) penetration = np.exp(-self.ionization_path_length / mean_free_path) # Additional factor for very high vacuum (quantum effects) if local_pressure < 1e-3: quantum_enhancement = 1.0 + 0.1 * np.log10(1e-3 / (local_pressure + 1e-10)) penetration = np.minimum(penetration * quantum_enhancement, 0.95) # Minimum penetration (even at very high pressure, some electrons get through) penetration = np.maximum(penetration, 0.01) return penetration def calculate_rydberg_formation(self, bulk_pressure, local_enhancement, scenario='typical'): """Calculate Rydberg formation efficiency with scenario variations""" local_pressure = bulk_pressure * local_enhancement # Threshold behavior around 10^-3 Pa local pressure threshold = 1e-3 log_ratio = np.log10(local_pressure / threshold) # Base formation efficiency base_efficiency = 0.4 / (1.0 + np.exp(-6.0 * log_ratio)) # Scenario-dependent lifetime enhancement if scenario == 'minimum': lifetime_factor = self.RYDBERG_LIFETIME_MIN elif scenario == 'maximum': lifetime_factor = self.RYDBERG_LIFETIME_MAX else: # typical lifetime_factor = self.RYDBERG_LIFETIME_TYPICAL return base_efficiency, lifetime_factor def calculate_shuttle_efficiency(self, bulk_pressure, local_enhancement): """Calculate energy shuttle efficiency - natural physics only""" local_pressure = bulk_pressure * local_enhancement local_density = local_pressure / (self.KB * self.temperature) c2h4_density = local_density * self.c2h4_fraction # Collision-limited kinetics (fundamental physics) charge_transfer_rate = c2h4_density * self.SIGMA_CHARGE_TRANSFER * self.v_thermal_N2 decay_rate = 1.0 / self.TAU_N2_GROUND # Natural shuttle efficiency from reaction kinetics shuttle_eff = charge_transfer_rate / (charge_transfer_rate + decay_rate) return np.clip(shuttle_eff, 0.0, 1.0) def calculate_total_enhancement(self, bulk_pressure, scenario='typical'): """Calculate total enhancement for given scenario""" # Get local pressure enhancement local_enhancement = self.calculate_local_pressure_enhancement(bulk_pressure, scenario) # Calculate individual effects electron_pen = self.calculate_electron_penetration_corrected(bulk_pressure, local_enhancement) shuttle_eff = self.calculate_shuttle_efficiency(bulk_pressure, local_enhancement) rydberg_eff, rydberg_lifetime = self.calculate_rydberg_formation(bulk_pressure, local_enhancement, scenario) # Calculate effective lifetimes n2_lifetime_enh = 1.0 + rydberg_eff * (rydberg_lifetime - 1.0) c2h4_lifetime_enh = n2_lifetime_enh tau_n2_eff = self.TAU_N2_GROUND * n2_lifetime_enh tau_c2h4_eff = self.TAU_C2H4_GROUND * c2h4_lifetime_enh lifetime_ratio = tau_c2h4_eff / tau_n2_eff # Enhanced model combining effects # 1. Baseline nitrogen performance (pressure-dependent) baseline_enhancement = electron_pen # High vacuum helps, high pressure hurts # 2. Energy shuttle contribution shuttle_contribution = shuttle_eff * lifetime_ratio * 0.01 # Scaled by lifetime ratio # 3. Rydberg contribution rydberg_contribution = rydberg_eff * rydberg_lifetime * 0.3 # Direct Rydberg bonus # Total enhancement total_enhancement = baseline_enhancement + shuttle_contribution + rydberg_contribution # Interaction effects (synergy between mechanisms) interaction_factor = 1.0 + 0.3 * electron_pen * shuttle_eff * rydberg_eff final_enhancement = total_enhancement * interaction_factor return final_enhancement, local_enhancement, electron_pen, shuttle_eff, rydberg_eff, rydberg_lifetime def generate_analysis(self): """Generate analysis with corrected electron penetration""" print(f"\nGenerating corrected wide-range analysis...") # Extended pressure range: 10^-4 to 300 Pa pressure_log = np.linspace(np.log10(self.BULK_PRESSURE_MIN), np.log10(self.BULK_PRESSURE_MAX), 150) bulk_pressures = np.power(10, pressure_log) data = [] for bulk_p in bulk_pressures: # Calculate for all three scenarios scenarios = ['minimum', 'typical', 'maximum'] results = {} for scenario in scenarios: total_enh, local_enh, electron_pen, shuttle_eff, rydberg_eff, rydberg_life = self.calculate_total_enhancement(bulk_p, scenario) results[scenario] = { 'total_enhancement': total_enh, 'local_enhancement': local_enh, 'electron_penetration': electron_pen, 'shuttle_efficiency': shuttle_eff, 'rydberg_efficiency': rydberg_eff, 'rydberg_lifetime': rydberg_life } data.append({ 'Bulk_Pressure_Pa': bulk_p, 'Bulk_Pressure_log10': np.log10(bulk_p), # Minimum scenario 'Total_Enhancement_Min': results['minimum']['total_enhancement'], 'Local_Enhancement_Min': results['minimum']['local_enhancement'], 'Electron_Penetration_Min': results['minimum']['electron_penetration'], 'Shuttle_Efficiency_Min': results['minimum']['shuttle_efficiency'], 'Rydberg_Formation_Min': results['minimum']['rydberg_efficiency'], 'Rydberg_Lifetime_Min': results['minimum']['rydberg_lifetime'], # Typical scenario 'Total_Enhancement_Typ': results['typical']['total_enhancement'], 'Local_Enhancement_Typ': results['typical']['local_enhancement'], 'Electron_Penetration_Typ': results['typical']['electron_penetration'], 'Shuttle_Efficiency_Typ': results['typical']['shuttle_efficiency'], 'Rydberg_Formation_Typ': results['typical']['rydberg_efficiency'], 'Rydberg_Lifetime_Typ': results['typical']['rydberg_lifetime'], # Maximum scenario 'Total_Enhancement_Max': results['maximum']['total_enhancement'], 'Local_Enhancement_Max': results['maximum']['local_enhancement'], 'Electron_Penetration_Max': results['maximum']['electron_penetration'], 'Shuttle_Efficiency_Max': results['maximum']['shuttle_efficiency'], 'Rydberg_Formation_Max': results['maximum']['rydberg_efficiency'], 'Rydberg_Lifetime_Max': results['maximum']['rydberg_lifetime'], }) return pd.DataFrame(data) def create_visualization(self, data): """Create corrected visualization with realistic electron penetration""" print("Creating corrected physics visualization...") fig, axes = plt.subplots(2, 2, figsize=(18, 14)) fig.suptitle(f'CORRECTED Energy Shuttle: Realistic Electron Penetration ({self.BULK_PRESSURE_MIN:.0e} - {self.BULK_PRESSURE_MAX:.0f} Pa)', fontsize=16, fontweight='bold') # Plot 1: Total Enhancement with Corrected Electron Penetration ax1 = axes[0, 0] # Fill between min and max for uncertainty band ax1.fill_between(data['Bulk_Pressure_Pa'], data['Total_Enhancement_Min'], data['Total_Enhancement_Max'], alpha=0.3, color='blue', label='Uncertainty range') # Plot typical line ax1.loglog(data['Bulk_Pressure_Pa'], data['Total_Enhancement_Typ'], 'blue', linewidth=4, label='Typical enhancement', marker='o', markersize=3) # Plot min/max boundaries ax1.loglog(data['Bulk_Pressure_Pa'], data['Total_Enhancement_Min'], 'blue', linestyle='--', linewidth=2, alpha=0.7, label='Minimum') ax1.loglog(data['Bulk_Pressure_Pa'], data['Total_Enhancement_Max'], 'blue', linestyle='--', linewidth=2, alpha=0.7, label='Maximum') # Reference lines ax1.axhline(1.0, color='red', linestyle=':', linewidth=2, alpha=0.8, label='No enhancement') ax1.axhline(20.0, color='orange', linestyle=':', linewidth=2, alpha=0.8, label='Experimental target (20×)') # Mark pressure regimes ax1.axvspan(1e-4, 1e-2, alpha=0.1, color='cyan', label='High vacuum') ax1.axvspan(1e-2, 1e0, alpha=0.1, color='green', label='Low vacuum') ax1.axvspan(1e0, 300, alpha=0.1, color='orange', label='Near atmospheric') ax1.set_xlabel('Bulk Pressure [Pa]', fontweight='bold') ax1.set_ylabel('Total Analytical Enhancement', fontweight='bold') ax1.set_title('Total Enhancement (CORRECTED Model)\n(Pressure-Dependent Electron Penetration)', fontweight='bold') ax1.grid(True, which="both", alpha=0.3) ax1.legend() ax1.set_xlim(1e-4, 300) ax1.set_ylim(0.01, 1000) # Plot 2: CORRECTED Electron Penetration vs Pressure ax2 = axes[0, 1] # Show electron penetration for all scenarios ax2.fill_between(data['Bulk_Pressure_Pa'], data['Electron_Penetration_Min'], data['Electron_Penetration_Max'], alpha=0.3, color='red', label='Penetration uncertainty') ax2.semilogx(data['Bulk_Pressure_Pa'], data['Electron_Penetration_Typ'], 'red', linewidth=4, label='Typical penetration', marker='o', markersize=3) ax2.semilogx(data['Bulk_Pressure_Pa'], data['Electron_Penetration_Min'], 'red', linestyle='--', linewidth=2, alpha=0.7, label='Minimum') ax2.semilogx(data['Bulk_Pressure_Pa'], data['Electron_Penetration_Max'], 'red', linestyle='--', linewidth=2, alpha=0.7, label='Maximum') # Add explanatory text ax2.text(1e-3, 0.8, 'High vacuum:\nBetter penetration', fontsize=10, bbox=dict(boxstyle="round,pad=0.3", facecolor="cyan", alpha=0.7)) ax2.text(10, 0.1, 'High pressure:\nElectron blocking', fontsize=10, bbox=dict(boxstyle="round,pad=0.3", facecolor="orange", alpha=0.7)) ax2.set_xlabel('Bulk Pressure [Pa]', fontweight='bold') ax2.set_ylabel('Electron Penetration Efficiency', fontweight='bold') ax2.set_title('CORRECTED Electron Penetration\n(Exponential Attenuation by N₂)', fontweight='bold') ax2.grid(True, which="both", alpha=0.3) ax2.legend() ax2.set_xlim(1e-4, 300) ax2.set_ylim(0, 1) # Plot 3: Individual Mechanism Efficiencies ax3 = axes[1, 0] # Plot typical values for each mechanism ax3.semilogx(data['Bulk_Pressure_Pa'], data['Electron_Penetration_Typ'], 'red', linewidth=3, label='Electron penetration (CORRECTED)', marker='o', markersize=3) ax3.semilogx(data['Bulk_Pressure_Pa'], data['Shuttle_Efficiency_Typ'], 'blue', linewidth=3, label='Shuttle efficiency', marker='s', markersize=3) ax3.semilogx(data['Bulk_Pressure_Pa'], data['Rydberg_Formation_Typ'], 'green', linewidth=3, label='Rydberg formation', marker='^', markersize=3) # Add uncertainty bands for electron penetration ax3.fill_between(data['Bulk_Pressure_Pa'], data['Electron_Penetration_Min'], data['Electron_Penetration_Max'], alpha=0.2, color='red') ax3.set_xlabel('Bulk Pressure [Pa]', fontweight='bold') ax3.set_ylabel('Mechanism Efficiency', fontweight='bold') ax3.set_title('Individual Mechanism Efficiencies\n(CORRECTED Electron Penetration)', fontweight='bold') ax3.grid(True, which="both", alpha=0.3) ax3.legend() ax3.set_xlim(1e-4, 300) ax3.set_ylim(0, 1) # Plot 4: Comprehensive Parameter Summary ax4 = axes[1, 1] summary_text = f""" CORRECTED ENERGY SHUTTLE ANALYSIS 【CORRECTED ELECTRON PENETRATION】 ⚡ High vacuum: Better penetration (exponential law) ⚡ High pressure: Electron blocking by N₂ density ⚡ Beer-Lambert attenuation: exp(-L/λ) ⚡ Path length: {self.ionization_path_length*1e3:.0f} mm ⚡ Cross-section: {self.ELECTRON_CROSS_SECTION_N2:.1e} m² 【PRESSURE RANGE】 🌀 Bulk pressure: {self.BULK_PRESSURE_MIN:.0e} - {self.BULK_PRESSURE_MAX:.0f} Pa 🌀 Coverage: High vacuum → Near atmospheric 🌀 Span: ~6 orders of magnitude 【UNCERTAINTY RANGES】 🎯 Local enhancement: {self.LOCAL_ENHANCEMENT_MIN}-{self.LOCAL_ENHANCEMENT_MAX}× (typical: {self.LOCAL_ENHANCEMENT_TYPICAL}×) ⚛️ Rydberg lifetime: {self.RYDBERG_LIFETIME_MIN}-{self.RYDBERG_LIFETIME_MAX}× (typical: {self.RYDBERG_LIFETIME_TYPICAL}×) 【PRESSURE REGIMES】 • High vacuum (10⁻⁴-10⁻² Pa): - EXCELLENT electron penetration (↑) - Limited shuttle efficiency - Minimal Rydberg formation • Low vacuum (10⁻²-1 Pa): - Balanced mechanisms - Optimal shuttle conditions - Emerging Rydberg effects • Near atmospheric (1-300 Pa): - POOR electron penetration (↓) - Maximum local enhancement - Strong Rydberg formation 【CORRECTED PHYSICS】 • Exponential electron attenuation • Pressure-dependent N₂ density blocking • Quantum effects at very high vacuum • Natural shuttle efficiency progression • No artificial limitations applied 【KEY CORRECTION】 • High vacuum: Enhancement increases (better e⁻ penetration) • High pressure: Enhancement decreases (N₂ blocking) • Realistic pressure-dependent behavior """ ax4.text(0.05, 0.95, summary_text, transform=ax4.transAxes, fontsize=9, verticalalignment='top', fontfamily='monospace', bbox=dict(boxstyle="round,pad=0.5", facecolor="lightgreen", alpha=0.9)) ax4.set_xlim(0, 1) ax4.set_ylim(0, 1) ax4.axis('off') ax4.set_title('CORRECTED Physics Model Summary', fontweight='bold') plt.tight_layout() return fig def run_simulation(self): """Run complete corrected simulation""" print(f"\nRunning CORRECTED Energy Shuttle Simulation...") print("="*80) # Generate analysis data = self.generate_analysis() # Create visualization fig = self.create_visualization(data) # Save results timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") # Save figure fig_file = f"corrected_energy_shuttle_{timestamp}.png" plt.savefig(fig_file, dpi=300, bbox_inches='tight') print(f"Figure saved: {fig_file}") # CSV file generation main_csv_file = f"corrected_energy_shuttle_results_{timestamp}.csv" data.to_csv(main_csv_file, index=False) print(f"Results CSV saved: {main_csv_file}") # Analysis results print("\n" + "="*80) print("CORRECTED ENERGY SHUTTLE RESULTS") print("="*80) print(f"PRESSURE RANGE: {self.BULK_PRESSURE_MIN:.0e} - {self.BULK_PRESSURE_MAX:.0f} Pa") print(f"ELECTRON PENETRATION: Exponential attenuation by N₂ density") # Find maximum enhancements max_typ_idx = data['Total_Enhancement_Typ'].idxmax() min_typ_idx = data['Total_Enhancement_Typ'].idxmin() max_typ_data = data.loc[max_typ_idx] min_typ_data = data.loc[min_typ_idx] print(f"\nMaximum typical enhancement:") print(f" Pressure: {max_typ_data['Bulk_Pressure_Pa']:.2e} Pa") print(f" Enhancement: {max_typ_data['Total_Enhancement_Typ']:.1f}×") print(f" Electron penetration: {max_typ_data['Electron_Penetration_Typ']:.1%}") print(f"\nMinimum typical enhancement:") print(f" Pressure: {min_typ_data['Bulk_Pressure_Pa']:.2e} Pa") print(f" Enhancement: {min_typ_data['Total_Enhancement_Typ']:.1f}×") print(f" Electron penetration: {min_typ_data['Electron_Penetration_Typ']:.1%}") # Pressure regime analysis high_vacuum_data = data[data['Bulk_Pressure_Pa'] <= 1e-2] low_vacuum_data = data[(data['Bulk_Pressure_Pa'] > 1e-2) & (data['Bulk_Pressure_Pa'] <= 1)] high_pressure_data = data[data['Bulk_Pressure_Pa'] > 1] print(f"\nTypical enhancement by regime:") print(f" High vacuum (≤10⁻² Pa): {high_vacuum_data['Total_Enhancement_Typ'].mean():.1f}×") print(f" Electron penetration: {high_vacuum_data['Electron_Penetration_Typ'].mean():.1%}") print(f" Low vacuum (10⁻²-1 Pa): {low_vacuum_data['Total_Enhancement_Typ'].mean():.1f}×") print(f" Electron penetration: {low_vacuum_data['Electron_Penetration_Typ'].mean():.1%}") print(f" Near atmospheric (>1 Pa): {high_pressure_data['Total_Enhancement_Typ'].mean():.1f}×") print(f" Electron penetration: {high_pressure_data['Electron_Penetration_Typ'].mean():.1%}") print(f"\nCORRECTED model features:") print(f" ✓ Exponential electron attenuation by N₂ density") print(f" ✓ High vacuum: Better electron penetration") print(f" ✓ High pressure: N₂ electron blocking") print(f" ✓ Path length: {self.ionization_path_length*1e3:.0f} mm") print(f" ✓ Cross-section: {self.ELECTRON_CROSS_SECTION_N2:.1e} m²") print(f"\nGenerated Files:") print(f" 📊 Figure: {fig_file}") print(f" 📈 CSV: {main_csv_file}") print("="*80) print("CORRECTED energy shuttle simulation completed!") plt.show() return data # Main execution if __name__ == "__main__": # Create corrected simulator simulator = CorrectedEnergyShuttleSimulator() # Run simulation data = simulator.run_simulation() print("\nCORRECTED simulation complete!") print("Model now includes realistic pressure-dependent electron penetration.")