Manual Matching of a WEST ICRH Antenna on Vacuum

This notebook calculates the charts used in the internal documentation for the IC Operators for the manual matching on vacuum.

[1]:
import matplotlib.pyplot as plt
import numpy as np
from tqdm.notebook import tqdm
import skrf as rf

# WEST ICRH Antenna package
import sys; sys.path.append('..')
from west_ic_antenna import WestIcrhAntenna
#rf.stylely()

Matching each side separately

For a given RF frequency \(f_0\), an antenna can be matched on the left side only, then on the right side only, before using both sides together and shifting the frequency depending on the phase excitation (see Tutorial on Manual Matching. A further step can consist of slightly adjusting the four capacitors, to decrease the reflected powers seen by the generators.

This section calculates the frequency shift to apply depending on the phase excitation and the theoretical capacitance shifts to further apply for additional improvement.

[2]:
f0_MHzs = np.arange(46, 66, 5)  # decrease the step size to get more precise plots
[3]:
# frequency scan for dipole and monopole
freq_shift_MHzs_dipo, freq_shift_MHzs_mono = [], []
C_vacuums, C_opt_dipoles, C_opt_monopoles = [], [], []
for f0_MHz in tqdm(f0_MHzs):
    freq = rf.Frequency(f0_MHz, f0_MHz, npoints=1, unit='MHz')
    ant_vacuum = WestIcrhAntenna(frequency=freq)  # default is vacuum coupling
    Cs_left = ant_vacuum.match_one_side(f_match=f0_MHz*1e6, side='left', decimals=2, verbose=False)
    Cs_right = ant_vacuum.match_one_side(f_match=f0_MHz*1e6, side='right', decimals=2, verbose=False)
    Cs = [Cs_left[0], Cs_left[1], Cs_right[2], Cs_right[3]]
    del ant_vacuum  # cleanup mem

    # searching for the frequency shift to apply
    freqs = rf.Frequency(f0_MHz - 1, f0_MHz + 1, npoints=201, unit='MHz')
    ant = WestIcrhAntenna(frequency=freqs)

    # dipole
    s_act = np.abs(ant.s_act(Cs=Cs, power=[1,1], phase=[0,np.pi]))
    f_opt_dipole = freqs.f_scaled[np.argmin(s_act[:,0])] # assume same at right
    freq_shift_MHzs_dipo.append(f_opt_dipole - f0_MHz)

    # monopole
    s_act = np.abs(ant.s_act(Cs=Cs, power=[1,1], phase=[0,0]))
    f_opt_monopole = freqs.f_scaled[np.argmin(s_act[:,0])]
    freq_shift_MHzs_mono.append(f_opt_monopole - f0_MHz)

    # Finally determining the optimum set of capacitance
    # for the dipole or monopole case
    C_opt_dipole = ant.match_both_sides(f_match=f_opt_dipole*1e6, decimals=2, power=[1,1], phase=[0,np.pi], verbose=False)
    C_opt_monopole = ant.match_both_sides(f_match=f_opt_monopole*1e6, decimals=2, power=[1,1], phase=[0,0], verbose=False)
    del ant  # memory cleanup

    C_vacuums.append(Cs)
    C_opt_dipoles.append(C_opt_dipole)
    C_opt_monopoles.append(C_opt_monopole)

freq_shift_MHzs_dipo = np.array(freq_shift_MHzs_dipo)
freq_shift_MHzs_mono = np.array(freq_shift_MHzs_mono)
C_vacuums = np.array(C_vacuums)
C_opt_dipoles = np.array(C_opt_dipoles)
C_opt_monopoles = np.array(C_opt_monopoles)

The frequency shift to apply for dipole and monopole configurations are:

[4]:
fig, ax = plt.subplots()
ax.plot(f0_MHzs[freq_shift_MHzs_dipo>0.1], freq_shift_MHzs_dipo[freq_shift_MHzs_dipo>0.1], marker='^', ls='')
ax.set_xlabel('Initial match frequency (side by side) [MHz]')
ax.set_ylabel('Frequency shift to apply [MHz]')
ax.set_title('Dipole')
ax.set_xlim(46, 65)
ax.grid(True)
_images/chart_manual_matching_vacuum_7_0.png
[5]:
fig, ax = plt.subplots()
ax.plot(f0_MHzs[freq_shift_MHzs_mono<-0.1], freq_shift_MHzs_mono[freq_shift_MHzs_mono<-0.1], marker='o', ls='', color='C1')
ax.set_xlabel('Initial match frequency (side by side) [MHz]')
ax.set_ylabel('Frequency shift to apply [MHz]')
ax.set_title('Monopole')
ax.set_xlim(46, 65)
ax.grid(True)
_images/chart_manual_matching_vacuum_8_0.png

The capacitor shift

[6]:
diff_dipole = C_opt_dipoles - C_vacuums

fig, ax = plt.subplots()
ax.plot(f0_MHzs, diff_dipole[:,0], marker='o', ls='', color='C0', label='C1')
ax.plot(f0_MHzs, diff_dipole[:,1], marker='o', ls='', color='C1', label='C2')
ax.plot(f0_MHzs, diff_dipole[:,2], marker='o', ls='', color='C2', label='C3')
ax.plot(f0_MHzs, diff_dipole[:,3], marker='o', ls='', color='C3', label='C4')

ax.set_xlabel('Initial match frequency (side by side) [MHz]')
ax.set_ylabel('Capacitance shift to apply [pF]')
ax.set_title('Dipole')
ax.set_xlim(46, 65)
ax.set_ylim(-0.2, +0.2)
ax.legend()
ax.grid(True)
_images/chart_manual_matching_vacuum_10_0.png
[7]:
diff_dipole = C_opt_monopoles - C_vacuums

fig, ax = plt.subplots()
ax.plot(f0_MHzs, diff_dipole[:,0], marker='o', ls='', color='C0', label='C1')
ax.plot(f0_MHzs, diff_dipole[:,1], marker='o', ls='', color='C1', label='C2')
ax.plot(f0_MHzs, diff_dipole[:,2], marker='o', ls='', color='C2', label='C3')
ax.plot(f0_MHzs, diff_dipole[:,3], marker='o', ls='', color='C3', label='C4')

ax.set_xlabel('Initial match frequency (side by side) [MHz]')
ax.set_ylabel('Capacitance shift to apply [pF]')
ax.set_title('Monopole')
ax.set_xlim(46, 65)
ax.set_ylim(-0.2, +0.2)
ax.legend()
ax.grid(True)
_images/chart_manual_matching_vacuum_11_0.png