Status: internal measurement and analysis, not peer reviewed. See §9. Tier: a mechanism nobody appears to have written down, plus two supporting negative results.
1. Summary
The control-volume timestep rule for mold-filling simulation,
dt = min over partially-filled control volumes of (1 - f_n) · V_n / Σ Q_n
is presented across the filling literature as the timestep rule, without qualification. It carries an unstated precondition: it assumes the classic fill-factor scheme, in which a control volume that reaches full is snapped to exactly 1.0 and its surplus inflow redistributed to its neighbours.
Applied to a front scheme that does not snap — donor-cell upwind advection of
a fill fraction, which approaches full asymptotically — the rule degenerates.
Cells accumulate just below full, 1 − f acquires mass arbitrarily close to
zero, and the minimum is set by cells that are already effectively full rather
than by the advancing front. The timestep collapses toward zero.
We measured this three ways. Substituting the CV rule into a non-snapping solver made it 8× slower, then — after correcting the "full" threshold — left it 2.5× better on an idealized disk and 3.9× worse on a realistic shelled part, unable to complete a fill at finer resolution. That split is itself one of the note's findings (§5, §6): the idealized benchmark endorses a change the real geometry rejects.
We also record two supporting findings: a diagnostic trap that made the change look 267–808× more promising than it was, and a coverage defect produced by having two different thresholds for "full" in the same solver.
2. The gap
The rule is stated plainly and without precondition in the sources we could reach. From Samir, Echaabi & Hattabi (IntechOpen, DOI 10.5772/46167), §4.3:
"The optimal time step would be where the fluid just fills one control volume. If a larger step were chosen, the flow front would over-run the control volume and a loss of mass from the system would result." … "Once Δt_n has been calculated for all the partially filled control volumes, the smallest Δt is chosen as the time step for the next iteration."
Jiang, Wang, Zhou & Yang (Comput. Chem. Eng. 31(11):1407, 2007) generalize it to a whole element layer per step, and attribute the one-CV form back through the Wang/Hieber/Wang lineage:
"As a general rule, mold filling algorithms are subject to a Courant criterion, which requires filling one control-volume (CV)/node at each time step or Courant number to be less than unity."
The snapping behaviour the rule depends on is real and universal in these codes — it is simply treated as part of the scheme rather than as a condition on the timestep rule. We found no source that states the rule's applicability limit, and none that discusses what happens when the front representation advects a fill fraction without snapping.
That combination — a fixed Cartesian voxel grid with donor-cell advection of a fill fraction — is not unusual in adjacent fields (free-surface LBM, casting solvers), so the gap is not obviously academic.
3. Two front schemes, and why the difference matters
Fill-factor / control-volume (the assumed scheme). Each CV carries a scalar
f ∈ [0,1]. Per step, dt is chosen so that exactly one CV reaches f = 1;
that CV is then set to 1 and any surplus is passed on. The set of partially
filled CVs is therefore always a thin, well-conditioned band at the front, and
1 − f over that band is bounded away from zero except for the single cell the
timestep was chosen to fill.
Donor-cell advection of a fill fraction (our scheme). Fluxes are computed
from the velocity field across faces whose donor cell is above a gate
(f ≥ 0.999), and f is updated by f ← f + dt·(∂f/∂t) and clipped to [0,1].
Nothing snaps. A cell receiving flux approaches 1 asymptotically, and keeps
receiving flux, because the donor-cell flux follows the velocity field and never
asks whether the receiver has room.
The consequence is structural: the distribution of 1 − f acquires mass
arbitrarily close to zero, and min (1 − f)/rate is dominated by cells that are
already full for every practical purpose. The rule stops measuring "time for the
front to advance" and starts measuring "time for an already-full cell to become
imperceptibly fuller".
4. Motivation: why we went looking (a second undocumented trap)
Our solver used a global-maximum-velocity CFL condition,
dt = CFL · h / max|u|, with CFL = 0.5 and a comment asserting the front
advances at most half a cell per step. Measured against real fills, it does not:
| h (mm) | steps | flow path (cells) | cells advanced per step |
|---|---|---|---|
| 6.32 | 201 | 33 | 0.165 |
| 3.98 | 312 | 53 | 0.169 |
| 2.51 | 880 | 84 | 0.095 |
| 1.58 | 1850 | 133 | 0.072 |
Two things are wrong, and both follow from taking the global maximum.
max|u|lives at the gate, not at the front. In a diverging flow the front is the slowest part of the domain, so a bound built from the fastest velocity in the domain has little to do with front motion. The front advances at 1/3 to 1/7 of the nominal budget.- It degrades under refinement. A finer mesh resolves the gate velocity
singularity more sharply, so
max|u|grows, anddtshrinks superlinearly inh. The measured step count grows likeh^-1.6, noth^-1.
We found no statement of this trap in the filling literature. It is the kind of defect that reads as a standard CFL condition and is invisible without measuring front displacement per step directly.
5. Three formulations, measured
Baseline is the global-vmax CFL above. Test geometries: the analytic
centre-gated disk (arrival field validated against (r/R)²) and a shelled
210 × 50 × 24 mm tray with a 3.5 mm wall, at two voxel budgets.
Provenance of the tray: it is a synthetic fixture authored for this engine's own test corpus, generated parametrically (tapered extrude, shelled on the bottom face), not a customer part. Its dimensions are derived from the pipeline's own constraints — the footprint from a standard mold-base frame's tie-bar coverage check and a 50-ton clamp envelope, the wall thickness from an ejector-pin threshold. We state this because "a real part" is ambiguous: the geometry is realistic in character (a genuine shelled, drafted, straight-pull tray) while being free of any third-party origin.
| formulation | disk steps | tray 4k | tray 16k | outcome |
|---|---|---|---|---|
baseline: dt = CFL·h/max|u| | 825 | 312 / 186 s | 880 / 1811 s, coverage 1.000 | reference |
A. CV rule, "full" = 1 − f < 1e-9 | — | — | — | stalled at step 2, coverage 0.003 |
| B. CV rule, "full" = donor gate (0.999) | 333 | 1205 / 379 s | step cap hit, coverage 0.540 | 2.5× better on the disk, 3.9× worse on the tray |
C. Courant in fill-fraction space, dt ≤ min 1/rate | 210 | 246 / 211 s | 436 / 960 s, coverage 0.963 | best; still defective (§7) |
Formulation A fails immediately and instructively. A cell at exactly f = 1
that is still receiving flux contributes (1 − 1)/rate = 0, so the minimum is
identically zero and the solver cannot take any step at all. This is the
degeneracy of §3 in its sharpest form.
Formulation B — using the solver's own donor gate as the definition of "full", so that "full" means one thing throughout the module — runs, and its two geometries disagree. On the disk it is a 2.5× improvement (333 steps against 825). On the real tray it is 3.9× worse (1205 against 312), and at the finer budget cannot complete a fill within the step cap, stopping at 54% coverage. The band of cells between 0.999 and 1.0 is wide enough, in population, to dominate the minimum — and a shelled tray, whose entire solid is wall, has vastly more of that band per unit volume than a thick disk.
That disagreement is a finding, not noise, and it is the third instance in this work of the pattern §6 describes. A change validated on the idealized geometry would have shipped: the disk says 2.5× better. The real part says 3.9× worse and cannot finish. An idealized benchmark chosen for its analytic reference is selected for being well-conditioned, which is precisely the property that hides this failure mode.
Formulation C abandons the CV rule for the bound the discretization actually
implies: a Courant condition in fill-fraction space, "no cell may receive more
than its own volume in one step". Unlike (1 − f)/rate, 1/rate has no
degeneracy as cells fill. It is local to where filling happens and independent
of the gate velocity. It is the only formulation that improved on the baseline —
2.0× fewer steps and 1.9× less wall time at the finer budget, with arrival
accuracy equal to baseline (mean |error| 0.0178 vs 0.0176) and a better
worst case (0.0492 vs 0.0636).
6. A diagnostic trap: measuring headroom on the trajectory you are about to destroy
Before implementing, we instrumented a real fill to compare, at every step, the timestep the solver took against the timestep the CV rule would have allowed. The result was emphatic:
| voxel budget | median dt_CV / dt_actual | worst step |
|---|---|---|
| 4,000 | 267× | 224× |
| 16,000 | 808× | 648× |
Every step, not a tail of outliers, appeared over-restricted by two to three
orders of magnitude — and the ratio grew with refinement, consistent with the
h^-1.6 pathology of §4.
None of it survived implementation. The first attempt was 8× slower.
The reason is that the diagnostic was measured along the trajectory the old
timestep produced. With very small steps, no cell sits near full while still
receiving flux, so 1 − f is always comfortably large and the CV bound looks
generous. Take large steps and the state evolves differently: cells pile up
against the ceiling and the bound collapses. The measured headroom existed only
in a world the change itself removes.
Stated generally: a proxy measured under conditions that the proposed change eliminates is not evidence for the change.
We regard this as the most transferable finding in this note, and we record three instances from one investigation, because a single anecdote would be worthless and three suggest a pattern in how numerical work gets validated:
- This section. Headroom measured along the trajectory the change replaces.
- §5, Formulation B. Validated on the analytic disk (2.5× better), a regression on the real part (3.9× worse, cannot finish). An idealized benchmark is selected for being well-conditioned, which is the property that hides the failure.
- A multigrid preconditioner, reported separately, validated on a solid cube — a geometry whose conditioning behaviour is precisely the one that does not occur in the target application. Worth 9× there, a regression everywhere real.
The common structure: each proxy was legitimate as a measurement and misleading as evidence, because the property that made it convenient (a stable trajectory, an analytic reference, a simple domain) was the same property that suppressed the effect under test.
7. A coverage defect from two definitions of "full"
Formulation C is fast and accurate, and still not shippable: at the finer budget its coverage falls from 1.000 to 0.963. The fill silently stops filling 3.7% of the cavity.
The mechanism is the interaction of two thresholds that exist for different reasons:
_FILLED_FRAC = 0.5— a cell counts as melt (part of the Stokes domain) above this._DONOR_FULL_FRAC = 0.999— a cell may donate flux downstream above this.
A cell in the band between them is melt but not a donor. Because it is melt, its neighbours are not classified as front cells. Because it is not a donor, it passes nothing on. When every remaining unfilled region is shielded by such cells, the front set empties and the fill terminates — reporting success, with cells never filled. Larger timesteps put more cells into that band, so the defect is a monotone function of step size and is invisible at the baseline timestep.
This is not a tuning problem. It is the same structural absence as §3 seen from the other side: the scheme has no notion of "this control volume is now full; redistribute the excess." Until it does, the timestep cannot be opened up safely, whichever bound is used.
8. What this implies
For a filling solver built on non-snapping advection, the sequence is:
- The CV timestep rule cannot be adopted as written. Use a Courant bound in fill-fraction space instead, which is the bound the discretization implies.
- Even then, the step size is limited by a coverage defect that originates in the front representation, not in the timestep rule.
- The productive change is therefore to the front representation — adopting snapping and surplus redistribution — after which the CV rule becomes available and the coverage defect disappears, because both have the same root cause.
We did not make that change; this note records why it is the right next one.
9. Threats to validity
- One solver, one implementation. All measurements come from a single codebase. The mechanism in §3 follows from the scheme rather than the implementation, but the magnitudes do not transfer.
- The donor gate value (0.999) is ours. A different gate changes the width of the problematic band and therefore the severity of both §5B and §7.
- Two test geometries. An analytic disk and one real part at two budgets. The coverage defect was observed at the finer budget; we did not map its onset.
- The literature claim is a negative. We assert that the CV rule's precondition is unstated in the sources we reached. Several primary sources were unobtainable — Hieber & Shen (1980) and the Wang/Hieber/Wang papers underpinning the rule's attribution were paywalled and read only via secondary description. Absence in our search is not proof of absence, and the precondition may well be stated in a thesis, a code comment, or a text we could not reach.
- Formulation C was not tuned. The cavity-fraction cap accompanying it was set to 0.5% without a sweep; a different cap changes where the Courant bound versus the cap binds, and we did not establish the knee.
10. What would make this publishable
- A second implementation — ideally converting the same solver to a snapping fill-factor front and demonstrating that the CV rule then behaves as the literature describes. That would turn a claimed precondition into a demonstrated one.
- A characterization of the degeneracy rather than an observation of it: how
the distribution of
1 − fevolves under non-snapping advection, and how the minimum scales with the gate value and the step size. - Onset mapping for the coverage defect across step size and resolution.
- A completed prior-art search including the paywalled primary sources.
- For §6, a cleaner statement and ideally a second independent instance of the trajectory-dependence trap, since a methodological claim supported by two anecdotes from one day's work is suggestive rather than established.
11. Sources
- Samir, Echaabi & Hattabi, "Control Volume Finite Element Methods for Flow in Porous Media: Resin Transfer Molding", IntechOpen, DOI 10.5772/46167 — the min-rule stated verbatim.
- Jiang, Wang, Zhou & Yang, "An implicit control-volume finite element method and its time step strategies for injection molding simulation", Computers & Chemical Engineering 31(11):1407–1418 (2007), DOI 10.1016/j.compchemeng.2006.12.001 — the Courant framing, the one-element-layer relaxation, and the implicit escape.
- Simacek & Advani, Composites Science and Technology, DOI 10.1016/S0266-3538(02)00020-9 — a partial-saturation formulation without Courant restriction.
- Lizzy (github.com/simonebancora/Lizzy) — a readable FE/CV implementation whose timestep is the min-rule in three lines of numpy; the clearest available reference for the assumed scheme.
- Autodesk Moldflow solver parameter "Maximum %volume to fill per time step" (default 4%, ≈25 solver steps per fill) — the mesh-independent alternative used commercially.
Raw measurements and the generating scripts are in the session record; the reverted implementation is preserved as a patch rather than in tree, deliberately, because it encodes the coverage defect of §7.
Colophon — authorship and AI assistance
Author (responsible natural person): Anderson Brunsvold, FutureMold.
AI assistance disclosure. This note was produced with substantial AI assistance, and the extent is material to how it should be read:
- Literature search and synthesis: AI-conducted. The surveys behind the "no published source" claims were run by AI agents. Their search budgets were exhausted and several primary sources were paywalled and read only via abstract or secondary description. The novelty claims rest on those searches and inherit their limits — see the threats-to-validity section.
- Measurements: AI-executed, human-directed. The experiments were designed, scripted and run by an AI agent (Claude) working in the FutureMold repository, under direction from the author. The raw outputs are in the session record and the repository's reference documentation.
- Drafting: AI-written, human-reviewed. The prose is AI-drafted. It was reviewed by the author, and that review caught substantive errors — including, in this series, a claim that contradicted its own data table and a headline figure that conflated two mechanisms. Corrections are marked in place rather than silently applied.
- Not independently reproduced. No result here has been reproduced by a second implementation or a second party.
Standing caveat. Absence of a result in an AI-conducted literature search is weak evidence of absence in the field. Any novelty claim in this note should be re-checked against paywalled and non-indexed sources before it is relied upon.