Initialization
HallThruster.jl provides sensible defaults for simulation initialization, or allows you to specify your own initial condition.
Default
The default is DefaultInitialization(), which initializes the solution domain as described in the following sections. Below, $z_0$ and $z_N$ are domain[1] and domain[2], as passed into the Config object (see Configuration), $L_{ch}$ and $A_{ch}$ are config.thruster.geometry.channel_length and config.thruster.geometry.channel_area, respectively, and $\dot{m}$ is config.anode_mass_flow_rate.
The DefaultInitialization has parameters max_electron_temperature, min_ion_density, and max_ion_density, which can be used to scale the default initialized. These default to config.discharge_voltage/10, 2e17, and 1e18, respectively.
Ion densities
The ion densities are Gaussian with a constant offset and a scaling factor proportional to the mass flow rate and discharge voltage. For ions with charge 1, the density is
\[\rho_{i} = m_i \sqrt{\frac{V_d}{300}}\frac{\dot{m}}{5\times10^{-6}}\left(\rho_{min} + (\rho_{max}-\rho_{min}) \exp\left[-\left(\frac{z - z_0 - L_{ch}/2}{L_{ch}/3}\right)^2\right]\right)\]
For ions with charge Z, the density is assumed to scale as
\[\rho_i|_Z = \frac{\rho_i |_{Z=1}}{Z^2}\]
Ion velocities
Ions are initialized with the Bohm velocity at the anode. For an ion of charge $Z$, this is
\[u_i[1] = -u_{bohm} =- \sqrt{\frac{Z \;e\;T_{eV, anode}}{m_i}}\]
The maximum ion velocity is determined by the discharge voltage $V_d$:
\[u_i[\mathrm{end}] = u_{max} = \sqrt{\frac{2 \;Z \;e \; V_d}{m_i}}\]
The initial ion velocity profile between the cathode and the anode is then prescribed as:
\[u_i(z) = \begin{cases} u_{bohm} + \frac{2}{3}(u_{max} - u_{bohm})\left(\frac{z - z_0}{L_{ch}}\right)^2 & z-z_0 < L_{ch} \\ \frac{1}{3}\left(u_{bohm} + u_{max}\right)\left(1 - \frac{z - z_0 - L_{ch}}{z_N - L_{ch}}\right) + u_{max}\left(\frac{z - z_0 - L_{ch}}{z_N - L_{ch}}\right) & z - z_0 \ge L_{ch} \end{cases}\]
Neutral density
The neutral density at the anode is computed in the same way as during a simulation, namely:
\[\rho_{n, anode} = \frac{\dot{m}}{u_n A_{ch}} - \sum_s \frac{[\rho_{is} u_{is}]_{anode}}{u_n}\]
The density at the cathode is assumed to be 1/100 that at the anode. In the domain, the neutral density has a sigmoid shape:
\[\rho_n(z) = \frac{1}{2}\left(\rho_{n,anode} + \rho_{n, cathode} + (\rho_{n, cathode} - \rho_{n, anode})\tanh\left(\frac{z - z_0 - L_{ch}/2}{L_{ch} / 24}\right)\right)\]
Electron energy
The number density is computed from the ion densities. The electron temperature is a Gaussian with height $V_d / 10$ eV plus a linear baseline to make sure the boundary conditions are satisfied:
\[T_e(z) = \left(1 - \frac{z - z_0}{z_N - z_0}\right) T_{e, anode} + \left(\frac{z - z_0}{z_N - z_0}\right) T_{e, cathode} + (T_{e,max} - T_{e,min})\exp\left[-\left(\frac{z - z_0 - L_{ch}}{L_{ch}/3}\right)^2\right]\]
Example
For a simulation of the SPT-100 with $V_d$= 500V, three ion charge states, a a mass flow rate of 3 mg/s, an anode electron temperature of 3 eV and a cathode electron temperature of 5 eV, the initial condition looks like:

Custom initial conditions
You may define your own initial condition by creating subtypes of HallThruster.InitialCondition. Let's say for some reason we wanted to initialize every fluid's density and momentum in every cell to the z-location of its cell center. We might define our initialization as follows:
using HallThruster
struct MyInitialCondition <: HallThruster.InitialCondition end;We would then add a method to the initialize!(U, params, model) function as follows:
import HallThruster.initialize!
function HallThruster.initialize!(params, config, model::MyInitialCondition)
(;grid, fluid_containers) = params # Pull cell centers locations out of params
for fluid in fluid_containers.continuity
fluid.density .= grid.cell_centers
end
for fluid in fluid_containers.isothermal
fluid.density .= grid.cell_centers
fluid.momentum .= grid.cell_centers
end
return nothing
end;We can then test out our initialization function
config = HallThruster.Config(
ncharge = 1,
thruster = HallThruster.SPT_100,
domain = (0, 0.08),
anode_mass_flow_rate = 5e-6,
discharge_voltage = 300.0,
initial_condition = MyInitialCondition(),
)
simparams = HallThruster.SimParams(
duration = 1e-3,
grid = HallThruster.EvenGrid(100)
)
params = HallThruster.setup_simulation(config, simparams)
# the boundary nodes will differ from what we specified due to the enforcement of boundary conditions
params.fluid_containers.continuity[1].density[2:end-1] == params.grid.cell_centers[2:end-1] &&
params.fluid_containers.isothermal[1].density[2:end-1] == params.grid.cell_centers[2:end-1] &&
params.fluid_containers.isothermal[1].momentum[2:end-1] == params.grid.cell_centers[2:end-1]
# output
true