# Liquid Discharge This guide describes the FX-EML 0.7.0 calculation chain: source inputs → liquid choke flow → atmospheric expansion and flash → atomization → GDM (Generalized Dispersion Model) Contract B → rainout pool and final dispersion march → final airborne mass. Equations describe the local implementation. Thermodynamic functions come from the selected thermodynamics backend. The cloud discussion summarizes the coupled balances rather than reproducing every internal GDM closure. ## 1. Inputs, Units, and Classification Subscripts $0$, $o$, $e$, $a$, $l$, and $v$ denote storage, orifice, expanded jet, ambient, liquid, and vapor. Vapor mass quality is $X$ and vapor volume fraction is $\alpha$. Unless stated otherwise, units are kg, m, s, Pa absolute, K, J/kg for enthalpy, and J/(kg K) for entropy and heat capacity. $ P_a=6894.757293P_{a,\mathrm{psi}},\quad P_0=6894.757293P_{0,\mathrm{psig}}+P_a,\quad T_0=(T_{0,\mathrm{F}}-32)\frac59+273.15 \tag{1} $ $ d=0.0254d_{\mathrm{in}},\quad A_o=\pi d^2/4,\quad z_0=0.3048z_{0,\mathrm{ft}},\quad V_0=0.003785411784V_{0,\mathrm{gal}},\quad M_0=\rho(T_0,P_0)V_0. \tag{2} $ `PhaseClassifier` routes two-phase storage to flashing liquid. For liquid or supercritical-liquid storage, flashing is selected when both $T_0>T_b$ and $P_s>P_a$, where $T_b=T_{\mathrm{sat}}(P_a)$ and $P_s=P_{\mathrm{sat}}(T_0)$. Otherwise non-flashing liquid is selected. Both labels use the same configurable builder below. Classification does not guarantee every required saturation/property call will succeed. Solid and unsupported states are rejected; gas storage uses [Gas Discharge](Gas%20Discharge.md). The initial discharge rate is held constant. Inventory limits duration; vessel pressure, temperature, hydrostatic level, and composition are not integrated during depletion. ## 2. Choke Flow | Selection | Engine | Method | |---|---|---| | Orifice | `ChokeFlow`, non-equilibrium | Bernoulli; flashing deferred beyond the orifice | | ShortPipe, Omega | `ChokeFlow`, equilibrium | Omega flashing or Bernoulli non-flashing | | ShortPipe, HDI | `ChokeFlowDirectIntegration` | Homogeneous direct integration | The Short Pipe Equil. Model is an application setting. FX-EML supplies no discharge-coefficient override. The inlet must be thermodynamically admissible and its pressure above ambient. ### Bernoulli branch `ChokeFlow` uses this branch for Orifice, or when $P_s<P_a$ or $T_0<T_b$. With saturated-liquid density $\rho_{l0}$ at $T_0$: $ G_o=\sqrt{2\rho_{l0}(P_0-P_a)},\quad P_o=\max(P_s,P_a),\quad T_o=T_0,\quad X_o=0,\quad C_d=0.61. \tag{3} $ The flux uses the full storage-to-ambient pressure drop even when the returned orifice pressure is saturation pressure. Replacing $P_0-P_a$ with $P_0-P_o$ would change the implemented non-equilibrium approximation. ### Equilibrium Omega branch Evaluate saturated densities, liquid heat capacity $c_{pl0}$, and latent heat $h_{lv0}$ at $T_0$: $ v_{lv}=1/\rho_{v0}-1/\rho_{l0},\quad \Omega_s=\frac{c_{pl0}T_0P_s\rho_{l0}v_{lv}^2}{h_{lv0}^2},\quad \eta_s=P_s/P_0,\quad\eta_{st}=\frac{2\Omega_s}{1+2\Omega_s}. \tag{4} $ For high subcooling, $\eta_s\le\eta_{st}$: $ P_c=P_s,\quad T_c=T_0,\quad G_c=\sqrt{2\rho_{l0}(P_0-P_s)}. \tag{5} $ For low subcooling: $ \eta_c=\eta_s\frac{2\Omega_s}{2\Omega_s-1} \left[1-\sqrt{1-\frac{2\Omega_s-1}{2\Omega_s\eta_s}}\right],\quad P_c=\eta_cP_0,\quad T_c=T_{\mathrm{sat}}(P_c),\quad G_c=\frac{\eta_c}{\eta_s}\sqrt{\frac{P_s\rho_{l0}}{\Omega_s}}. \tag{6} $ If $P_c\le P_a$ or $G_c\ge G_{\mathrm{liq}}=\sqrt{2\rho_{l0}(P_0-P_a)}$, substitute $(P_c,T_c,G_c)=(P_a,T_0,G_{\mathrm{liq}})$. Then: $ (P_o,T_o,G_o)=(P_c,T_c,G_c),\quad X_o=\operatorname{clamp}\left(\frac{c_{pl0}(T_0-T_o)}{h_{lv0}},0,1\right). \tag{7} $ The flashing coefficient uses $\Omega_0=c_{pl0}T_0P_0\rho_{l0}v_{lv}^2/h_{lv0}^2$ and $L=\log_{10}\Omega_0$: $ \begin{aligned} C_d={}&0.877858487572788+0.12990725261896L-0.0284889118604271L^2\\ &-0.0137577828471063L^3+0.00307957505311823L^4+0.00102753979869397L^5. \end{aligned} \tag{8} $ This is Infer's Leung flashing-flow curve fit for an all-liquid inlet. The Omega branch retains this coefficient calculation even if its choke state is clamped to the Bernoulli limit. ### Homogeneous direct integration (HDI) HDI uses saturated-liquid entropy at $T_0$ when $P_0\le1.01P_s$, otherwise $s_0=s(T_0,P_0)$. It requests 200 pressure steps and finds: $ I(P)=\int_P^{P_0}\frac{dP'}{\rho(P',s_0)},\quad G(P)=\rho(P,s_0)\sqrt{2I(P)},\quad P_o=\underset{P\in[P_a,P_0]}{\arg\max}G(P). \tag{9} $ The integral uses trapezoidal pressure increments and an interior maximum is refined by golden-section search; see the [gas HDI equations](Gas%20Discharge.md#eq-gas-integral-increment). Temperature and density are evaluated at $(P_o,s_0)$. The inlet is classified as flashing when $T_0>T_b$ and $P_s>P_a$. For a flashing inlet with $P_o<P_c$, the equilibrium quality $X_o=\operatorname{clamp}(Q(P_o,s_0),0,1)$ supplies the two-phase exit split; otherwise $X_o=0$ regardless of the isentropic exit state. Equation 8 supplies $C_d$ for a flashing inlet, including a maximum-flux point at saturation. Otherwise $C_d=0.61$. ### Common orifice outputs $ \dot m=C_dA_oG_o,\quad\dot m_{lo}=(1-X_o)\dot m,\quad\dot m_{vo}=X_o\dot m, \tag{10} $ $ \rho_o=\left(\frac{1-X_o}{\rho_{lo}}+\frac{X_o}{\rho_{vo}}\right)^{-1},\quad U_o=G_o/\rho_o. \tag{11} $ Equation 11 is the homogeneous two-phase form. HDI uses its pressure–entropy density for a single-phase exit; its volumetric-flow velocity reconstruction is equivalent for a consistent homogeneous state. Two-phase enthalpy and entropy use phase-weighted saturated properties. Single-phase values use the property package. ## 3. Atmospheric Expansion and Flash `LiquidExpansion` receives the choke state and conserves mass. The default slip ratio is one, preserving choke density and vena-contracta velocity as the expansion inlet. If $P_o\le P_a+1$ Pa it retains the unexpanded state; otherwise expansion proceeds to $P_a$. **Isentropic:** $ s_e=s_o,\quad(T_e,X_e,h_e)=\operatorname{flash}(P_a,s_o),\quad U_e=\sqrt{\max(0,U_o^2+2(h_o-h_e))}. \tag{12} $ **Momentum:** $ U_e=U_o+\frac{P_o-P_a}{\rho_oU_o},\quad h_e=h_o-\tfrac12(U_e^2-U_o^2),\quad(T_e,X_e)=\operatorname{flash}(P_a,h_e). \tag{13} $ For a two-phase enthalpy flash: $ X_e=\frac{h_e-h_l^{\mathrm{sat}}(P_a)}{h_v^{\mathrm{sat}}(P_a)-h_l^{\mathrm{sat}}(P_a)},\quad T_e=T_b\quad(0<X_e<1). \tag{14} $ For single-phase states the solver finds $T_e$ from $h(T_e,P_a)=h_e$. Qualities are bounded to $[0,1]$. **Closest to Initial (default):** evaluate both options and select the higher final temperature. Within a 0.001 K temperature tie, minimize $|(1-X_e)-(1-X_o)|$. If only one succeeds, use it; if both fail, fail the calculation. FX-EML does not select Infer's older heat-capacity-only flash approximation. For unit slip: $ \dot m_{le}=(1-X_e)\dot m,\quad\dot m_{ve}=X_e\dot m,\quad \alpha_e=\left[1+\frac{1-X_e}{X_e}\frac{\rho_{ve}}{\rho_{le}}\right]^{-1}, \tag{15} $ with $\alpha_e=0$ at $X_e=0$ and $\alpha_e=1$ at $X_e=1$. $ \rho_e=(1-\alpha_e)\rho_{le}+\alpha_e\rho_{ve},\quad A_e=\frac{\dot m}{\rho_eU_e},\quad R_e=\sqrt{A_e/\pi},\quad L_e=0.67d\sqrt{\frac{\max(P_o,P_a)}{P_a}}. \tag{16} $ $L_e$ is the selected Ashkenas–Sherman length. Phase velocities follow continuity, $U_{le}=\dot m_{le}/[\rho_{le}A_e(1-\alpha_e)]$ and $U_{ve}=\dot m_{ve}/(\rho_{ve}A_e\alpha_e)$, with zero for an absent phase. Present phases share the bulk velocity for unit slip. The gas velocity-capping options do not apply to liquid expansion. ## 4. Atomization Atomization supplies one representative Sauter mean diameter $d_d$ to GDM without removing mass. The final diameter is clamped to $10^{-8}\le d_d\le10^{-2}$ m. Legacy Simple Rainout uses Modified CCPS atomization; every selection now defers rainout to GDM. ### CCPS candidates The mechanical candidate uses expanded liquid velocity and ambient air density: $ d_{\mathrm{mech}}=\frac{12.5\sigma(T_e)}{\rho_{\mathrm{air}}(T_a,P_a)U_{le}^2}. \tag{17} $ With $v_0=1/\rho(T_0,P_0)$ and $\Delta h=h_e-h_o$ (the current default orifice-exit enthalpy reference): $ E_p=\begin{cases} -\Delta h-(P_0-P_a)v_0,&P_s\ge P_0-1\ \mathrm{Pa},\\ -\Delta h-(P_s-P_a)v_0+(P_0-P_s)v_0,&P_s>P_a+1\ \mathrm{Pa},\\ (P_0-P_a)v_0,&\text{otherwise}. \end{cases} \tag{18} $ $ d_{\mathrm{flash}}=0.833\times10^{-3}-0.0734\times10^{-3}\ln(\max(E_p,10^{-12})). \tag{19} $ Equation 19 is an empirical SI correlation: insert the numerical energy in J/kg to obtain metres. Unavailable storage density falls back to saturated-liquid density. `LiquidDischarge` supplies orifice pressure and quality to atomization; the current `AtomizationOptions.EnergyReference` default is OrificeExit. Infer also offers a Stagnation alternative using $\Delta h=h_e-h_0$, but FX-EML does not select it. The pressure-work terms in Equation 18 still use storage conditions for either reference. Original CCPS selects $\min(d_{\mathrm{mech}},d_{\mathrm{flash}})$. Modified CCPS selects flashing size if $T_o-T_b>0.01$ K and mechanical size otherwise. ### DNV droplet JIP Phase III Using liquid properties at the orifice temperature: $ We_l=\rho_lU_o^2d/\sigma_l,\quad Re_l=\rho_lU_od/\mu_l,\quad We_v=\rho_vU_o^2d/\sigma_l, \tag{20} $ $ d_A=74dWe_l^{-0.85}Re_l^{0.44}(L/d)^{0.114} (\mu_l/\mu_w)^{0.97}(\sigma_l/\sigma_w)^{-0.37}(\rho_l/\rho_w)^{-0.11}. \tag{21} $ The correlation fixes $L/d=1$, $\mu_w=1.7921\times10^{-3}$ Pa s, $\sigma_w=0.07565$ N/m, and $\rho_w=999.84$ kg/m³. Define: $ B=\frac{h_{lv}}{c_{pl}}\frac{\rho_v/\rho_l}{1-\exp(-2300\rho_v/\rho_l)}We_v^{-1/7},\quad \Delta T_A=48B,\quad\Delta T_B=108B,\quad\Delta T=T_o-T_b. \tag{22} $ With $d_B'=\min(d_A,80\times10^{-6})$ m: $ d_d=\begin{cases} d_A,&\Delta T\le\Delta T_A,\\ d_A-(d_A-d_B')\dfrac{\Delta T-\Delta T_A}{\Delta T_B-\Delta T_A},&\Delta T_A<\Delta T\le\Delta T_B,\\ \max(10^{-5},d_B'-10^{-7}(\Delta T-\Delta T_B)),&\Delta T>\Delta T_B. \end{cases} \tag{23} $ Nonpositive superheat or invalid transition thresholds selects the mechanical anchor. Missing required liquid properties can fail JIP. FX-EML supplies the single resulting diameter, not a droplet-size distribution. ## 5. Contract B Source Preparation `LiquidDischarge.Builder(...).DeferRainoutToDownstream()` skips discharge-layer rainout. Its rainout fields are zero and all expanded liquid remains available to GDM. They are not final rainout results. Before dispersion, calculate: $ t_r=\min\left(60t_{\max,\mathrm{min}},M_0/\dot m\right). \tag{24} $ GDM runs only for $t_r>0$ and $\dot m_{le}>0$. Fully flashed liquid bypasses it with zero rainout and pickup. Otherwise `GdmSource.FromLiquidDischarge` supplies: $ \dot m_{\mathrm{GDM}}=\dot m,\quad f_{l,0}=\dot m_{le}/\dot m,\quad D_{\mathrm{jet}}=2R_e,\quad \rho_{\mathrm{jet}}=\dot m/(\pi R_e^2U_e),\quad U_{\mathrm{jet}}=U_e. \tag{25} $ It also supplies $T_e,z_0,d_d$, molecular weight in kg/mol, $T_b$, latent heat, liquid heat capacity and density at $T_b$, and vapor heat capacity at $T_b+10$ K and $P_a$. Vapor-pressure and latent-heat functions are passed to the cloud property model. The helper rejects discharge results that already calculated rainout, preventing double removal. | Control | FX-EML mapping | |---|---| | Wind | mph × 0.44704 → m/s, measured at 10 m | | Ambient/ground temperature | Weather/Surface Temperature, °F → K | | Pressure/humidity/solar | Pa, humidity fraction, W/m² | | Roughness | cm ÷ 100 → m | | Stability | Weather class A–F | | Substrate | Concrete or Dry Dirt | | Direction/averaging | Horizontal without impingement; 18.75 s | | Downwind limit | Max Downwind Distance, ft × 0.3048 | | Minimum concentration | ppm × $10^{-6}$; report endpoint, not an early rainout stop | | Finite duration | Along-Wind Diffusion or Front Taper, for concentration evaluation | | HF | Pure hydrogen fluoride enables association chemistry | Source Max Pool Area maps to: $ A_{\max}=\begin{cases}0.09290304A_{\max,\mathrm{ft^2}},&A_{\max,\mathrm{ft^2}}>0,\\10^9\ \mathrm{m^2},&A_{\max,\mathrm{ft^2}}=0.\end{cases} \tag{26} $ Negative/nonfinite areas are rejected. Internally the pool uses $r_{\max}=\sqrt{\max(A_{\max},1\ \mathrm{m^2})/\pi}$: limits below 1 m² (about 10.764 ft²) encounter that numerical floor. ## 6. Cloud and Droplet March GDM advances an adaptive integral cloud solution through jet entrainment, gravity spreading, and passive dispersion as applicable. Air entrainment changes cloud mass, momentum, energy, density, and equilibrium; it does not count as released-chemical mass. In balance form: $ \frac{d\dot m_{\mathrm{cloud}}}{ds}=\mathcal E+\mathcal P-\mathcal R,\qquad \frac{d\dot m_{\mathrm{chemical}}}{ds}=\mathcal P-\mathcal R. \tag{27} $ $s$ is cloud-path distance, $\mathcal E$ entrainment, $\mathcal P$ pool injection, and $\mathcal R$ rainout removal, each per unit distance. These are balance summaries, not standalone closures. GDM's momentum and energy equations include buoyancy, entrained-air momentum, ground impact/drag, mixing, and surface heat transfer. They supply the cloud temperature $T_c$, density $\rho_c$, vertical velocity $u_{cz}$, and composition surrounding the droplets. For droplet mass $m_d=4\pi\rho_lr_d^3/3$, let $\Delta u=u_{cz}-u_{dz}$: $ Re_d=2r_d|\Delta u|\rho_c/\mu_a,\quad C_D=\min\left(100,\begin{cases}100,&Re_d<0.1,\\24(1+0.15Re_d^{0.687})/Re_d,&0.1\le Re_d<985,\\0.44,&Re_d\ge985.\end{cases}\right), \tag{28} $ $ \frac{dz_d}{dt}=u_{dz},\quad \frac{d(m_du_{dz})}{dt}=(\rho_c-\rho_l)g\frac{m_d}{\rho_l} +\tfrac12 C_D\rho_c\pi r_d^2|\Delta u|\Delta u. \tag{29} $ The code integrates vertical momentum, not velocity at fixed mass. Transfer equations are: $ B_m=\max\left(\frac{c_{pv}(T_c-T_d)}{h_{lv}(T_d)},0\right),\quad Sh=\frac{1+0.32\sqrt{Re_d}Sc^{1/3}}{1+B_m},\quad Nu=\frac{1+0.32\sqrt{Re_d}Pr^{1/3}}{1+B_m}, \tag{30} $ $ k_g=ShD/(2r_d),\quad h_d=Nu k_a/(2r_d),\quad \rho_v^*=P_aMW/(RT_c),\quad \frac{dm_d}{dt}=-4\pi r_d^2k_g\rho_v^*\ln\frac{1-y_g}{1-y_s}, \tag{31} $ $ m_dc_{pl}\frac{dT_d}{dt}=4\pi r_d^2h_d(T_c-T_d)+h_{lv}(T_d)\frac{dm_d}{dt}. \tag{32} $ $y_s$ is surface saturation vapor mole fraction, $y_g$ cloud vapor mole fraction, $Sc=\mu_a/(\rho_cD)$, and $Pr$ air Prandtl number. The implemented diffusivity is $D=10^{-5}$ m²/s, with diameter-based coefficients. Droplet radiation is omitted. Numerical guards bound temperature, fractions, small masses, and denominators. **Pure HF:** when HF association chemistry is enabled, GDM does not activate the droplet march. The liquid is treated as equilibrium fog within the cloud, so Equations 28–32 are not evaluated, no rainout occurs, no pool is formed, and pool pickup is zero. The final airborne rate in Section 9 then equals the discharge rate. The path integrator uses $d/ds=(1/U_c)d/dt$. Grounded droplets contribute remaining liquid flux: $ \dot m_r=\sum_{k\ \mathrm{grounded}}\dot N_km_{d,k,g}, \tag{33} $ where $\dot N_k$ is droplet number flux and $m_{d,k,g}$ ground-contact mass. Evaporated material stays airborne. The first march supplies **GrossRainoutRate** to the pool. A pickup-enabled rainout prepass may stop once rainout is resolved, but a complete final dispersion march is still produced. The downwind limit must cover the behavior of interest; a truncated domain is not an infinite-distance rainout result. ## 7. Rainout Pool and Evaporation The pool is centered at the gross-rainout location and fed at its rate and temperature. With $V_p=M_p/\rho_l$, $A_p=\pi r_p^2$, and $h_p=V_p/A_p$: $ \frac{dM_p}{dt}=\dot m_{\mathrm{feed}}-\dot m_{\mathrm{evap}}(t),\qquad \dot m_{\mathrm{feed}}=\begin{cases}\dot m_{r,\mathrm{gross}},&0<t<t_r,\\0,&t>t_r.\end{cases} \tag{34} $ When $h_p>h_{\min}$ and $r_p<r_{\max}$, gravity spreading follows $dr_p/dt=\sqrt{2g(h_p-h_{\min})}$. Substrate selects minimum depth and thermal properties. Radius is capped at the bund and contracts when evaporation would thin the pool below $h_{\min}$. The bund does not overflow: retained liquid deepens the pool. $ M_pc_{pl}\frac{dT_p}{dt}=H_{\mathrm{in}}-\dot m_{\mathrm{evap}}h_{lv}(T_p), \tag{35} $ $ \begin{aligned} H_{\mathrm{in}}={}&Q_{\mathrm{ground}}+h_aA_p(T_a-T_p)+q_{\mathrm{solar}}A_p\\ &+\epsilon\sigma_{SB}A_p(T_a^4-T_p^4)+\dot m_{\mathrm{feed}}c_{pl}(T_{\mathrm{rain}}-T_p). \end{aligned} \tag{36} $ Ground conduction sums wetted annuli with transfer proportional to $A_j(T_g-T_p)/\sqrt{t-t_{\mathrm{wet},j}}$. Convection uses a laminar/turbulent flat-plate correlation over pool diameter. Emissivity is 0.95. Below boiling, the SI MacKay–Matsugu rate is: $ \dot m_{\mathrm{MM}}=0.004786\pi2^{-0.11}u^{0.78}Sc^{-0.67}r_p^{1.89} \frac{MW\min(P_{\mathrm{sat}}(T_p),P_a)}{RT_p}. \tag{37} $ Here $u$ is wind at 10 m with a 0.1 m/s floor; $Sc$ uses pool vapor diffusivity, default $10^{-5}$ m²/s. At boiling with nonnegative heat input, $T_p=T_b$ and $\dot m_{\mathrm{evap}}=H_{\mathrm{in}}/h_{lv}(T_b)$. Both regimes cap evaporation at available mass per step. Pool simulation continues after shutoff, up to an additional 3600 s or dryout. ## 8. Pool Pickup and Final March GDM selects an equivalent vapor rate: $ \dot m_{p,\mathrm{pickup}}=\begin{cases} 0,&\text{Off},\\ \max_{t\ \mathrm{in\ simulated\ history}}\dot m_{\mathrm{evap}}(t),&\text{Max Rate},\\ \dfrac1{t_r}\displaystyle\int_0^{t_r}\dot m_{\mathrm{evap}}(t)dt,&\text{Mean Rate}. \end{cases} \tag{38} $ Mean Rate integrates the sampled history by trapezoids, clipped at shutoff. **The current Max Rate implementation includes the post-release segment**, despite some option descriptions referring only to release duration. Positive pickup triggers another march of the original discharge with this constant vapor source over the pool footprint, at the temperature associated with maximum evaporation and with zero added momentum. The pool remains based on gross rainout; there is no iteration rebuilding it from the second march. **FinalMarchRainoutRate** is grounded-droplet rate from the last march and may differ from gross rainout because pickup changes cloud and droplet behavior. With no pickup, it is the no-pickup result. **PoolPickupRate** is the equivalent rate actually returned to the final cloud; FX-EML adds that field, not a separate instantaneous evaporation sample. ## 9. Final Airborne Mass $ \boxed{\dot m_{\mathrm{air}}=\dot m-\dot m_{r,\mathrm{final}}+\dot m_{p,\mathrm{pickup}}},\qquad \boxed{M_{\mathrm{air}}=\dot m_{\mathrm{air}}t_r}. \tag{39} $ Inventory limits duration using original discharge, not net airborne rate. Gross rainout is reported as pool feed but is not subtracted here. Source-basis summary components are: $ \dot m_{\mathrm{flash}}=\dot m_{ve},\qquad \dot m_{\mathrm{aerosol,contribution}}=\max(0,\dot m-\dot m_{ve}-\dot m_{r,\mathrm{final}}). \tag{40} $ Aerosol contribution includes original droplet material evaporated in flight; it is not the remaining liquid at a downwind station. Pickup is reported separately. The direct final-mass calculation is Equation 39. For example, discharge 10 kg/s, final-march rainout 3 kg/s, pickup 1 kg/s, and duration 60 s give $(10-3+1)60=480$ kg airborne. A different gross-rainout rate does not replace the 3 kg/s subtraction. This is an equivalent-rate estimate, not a fully coupled transient inventory balance. Max Rate × duration is not integrated evaporation, and gross rainout feeds the pool while final-march rainout is subtracted. FX-EML therefore does not cap final airborne mass at tank inventory. Finite-duration concentration corrections are not additional multipliers on Equation 39. ## 10. Results and Implementation Trace FX-EML retains `LiquidDischargeResults` and `GdmResults` in memory, distinguishing gross rainout, final-march rainout, pickup, and final mass in reports. Zero duration or fully flashed liquid creates no GDM result. Invalid inputs, property/license failures, or GDM errors fail the source run without replacing its previous successful result. Reviewed against `FX-EML/Services/DischargeSolver.cs`, `Models/SourceResults.cs`, and `Services/ReportService.cs`; adjacent Infer sources `Infer.Discharge/Choke.cs`, `ChokeDirectIntegration.cs`, `OmegaMethod.cs`, `LiquidExpansion.cs`, `Atomization.cs`, `AtomizationCCPS.cs`, `AtomizationJIP3.cs`, `DropletBreakupRegimeJIP3.cs`, and `LiquidDischarge.cs`; and `Infer.Dispersion/Gdm/GdmSource.cs`, `GdmModel.cs`, and `GdmPool.cs`. Numerical guards and defaults matter when reproducing results. This guide does not establish numerical validation against PHAST or another external program.