Pulsed Breakdown Model#

This example demonstrates the RepetitivePulseBreakdownModel which calculates breakdown voltage with memory effects from repetitive pulsing.

Breakdown Voltage vs Number of Pulses (Memory Effect)
============================================================
Pulsed Breakdown Model - Memory Effects
============================================================
N =   1 pulses: V_breakdown = 1388 V
N =  10 pulses: V_breakdown = 1388 V
N = 100 pulses: V_breakdown = 1388 V
============================================================
Note: Breakdown voltage decreases with more pulses
      (memory effect from repetitive pulsing)
============================================================

Generating plot: Breakdown Voltage vs Number of Pulses...

import matplotlib.pyplot as plt
import numpy as np
import openmdao.api as om

from paroto.models.breakdown_voltage import RepetitivePulseBreakdownModel

# Create OpenMDAO problem
prob = om.Problem()
prob.model.add_subsystem(
    "breakdown",
    RepetitivePulseBreakdownModel(
        model_parameters={
            "A_paschen": 24.4,
            "B_paschen": 6.73,
            "field_enhancement_factor": 1.0,
            "ionization_time": 1e-7,
            "pulse_amplitude_factor": 4.0,
            "decay_constant": 1.0,
        }
    ),
)
prob.setup()

# Set common parameters
prob.set_val("breakdown.gas_properties_pressure", 101325.0)  # 1 atm
prob.set_val("breakdown.preheat_temperature", 300.0)  # K
prob.set_val("breakdown.gap_distance", 0.01)  # 10 mm
prob.set_val("breakdown.pulse_frequency", 50e3)  # 50 kHz
prob.set_val("breakdown.pulse_duration", 1e-6)  # 1 μs

print("=" * 60)
print("Pulsed Breakdown Model - Memory Effects")
print("=" * 60)

# Test for different number of pulses
n_pulses_list = [1, 10, 100]

for n_pulses in n_pulses_list:
    # Residence time determines number of pulses
    t_res = n_pulses / 50e3  # seconds

    prob.set_val("breakdown.residence_time", t_res)
    prob.run_model()

    V_bd = prob.get_val("breakdown.breakdown_voltage")[0]
    print(f"N = {n_pulses:3d} pulses: V_breakdown = {V_bd:.0f} V")

print("=" * 60)
print("Note: Breakdown voltage decreases with more pulses")
print("      (memory effect from repetitive pulsing)")
print("=" * 60)

# Plot breakdown voltage vs number of pulses
print("\nGenerating plot: Breakdown Voltage vs Number of Pulses...")
n_pulses_range = np.logspace(0, 3, 50)  # 1 to 1000 pulses
V_bd_values = []

for n_pulses in n_pulses_range:
    t_res = n_pulses / 50e3  # seconds
    prob.set_val("breakdown.residence_time", t_res)
    prob.run_model()
    V_bd_values.append(prob.get_val("breakdown.breakdown_voltage")[0])

plt.figure(figsize=(8, 5))
plt.semilogx(n_pulses_range, V_bd_values, "b-", linewidth=2)
plt.xlabel("Number of Pulses")
plt.ylabel("Breakdown Voltage (V)")
plt.title("Breakdown Voltage vs Number of Pulses (Memory Effect)")
plt.grid(True, alpha=0.3, which="both")
plt.tight_layout()
plt.show()

Total running time of the script: (0 minutes 0.224 seconds)