Nucleation
Nucleus Representation
Each nucleus is represented explicitly as a data object containing:
- phase and parent phase identifiers,
- spatial position and orientation,
- effective radius,
- symmetry variant,
- timestamp of creation,
- local driving force measures.
This information is retained for:
- statistical analysis,
- restart capability,
- post-processing,
- debugging and method development.
Spatial Control of Nucleation
The nucleation module offers fine-grained spatial filtering.
Nuclei can be restricted to:
- bulk regions,
- grain boundaries,
- phase boundaries,
- triple or higher-order junctions,
- simulation domain boundaries.
This allows physically motivated studies such as:
- heterogeneous nucleation at interfaces,
- boundary-dominated transformations,
- surface-driven phase changes.
Size, Orientation, and Variants
Seed Size
Initial nucleus size can be assigned using:
- fixed radius,
- normal (Gaussian),
- Cauchy,
- uniform distributions,
- or derived implicitly from the interface width.
This enables controlled sensitivity studies of curvature effects.
Orientation
Orientation assignment supports:
- inheritance from the parent grain,
- random orientations,
- fixed reference orientations.
The orientation logic is independent of crystallographic symmetry handling.
Variants
For transformations with multiple symmetry-related variants, the nucleation module can:
- randomly select variants,
- or choose the variant with the highest local driving force.
This makes the framework suitable for martensitic and symmetry-breaking transformations.
Shielding and Numerical Stability
To avoid numerical artifacts such as:
- overlapping nuclei,
- excessive curvature,
- unstable early growth,
the module enforces a shielding radius between nucleation sites.
Additionally, newly planted nuclei may temporarily experience reduced interface mobility, improving robustness without altering long-term kinetics.
Time Control
Nucleation attempts are performed at a configurable interval (NucleateEvery).
This allows:
- quasi-instantaneous nucleation,
- continuous nucleation over time,
- or sparse, event-driven nucleation scenarios.
Data Persistence and Restart
The nucleation state can be:
- written to ASCII or HDF5,
- restored during restarts,
- shifted or remeshed consistently with the simulation grid.
This makes nucleation fully compatible with:
- long-running simulations,
- checkpoint/restart workflows,
- adaptive domain modifications.
Extending the Nucleation Framework
The nucleation module is designed to be extensible.
Typical customization paths include:
- implementing new location filters,
- adding alternative size or orientation distributions,
- introducing custom variant selection logic,
- coupling nucleation probability to additional field variables.
All core logic is separated from numerical solvers, making it suitable for method development and experimentation.
Summary
The OpenPhase nucleation module provides:
- stochastic but reproducible nucleation,
- strong separation between nucleation and growth,
- flexible spatial and statistical control,
- full compatibility with restart and parallel workflows.
It is intended as a research-grade framework rather than a fixed physical model, enabling users to explore and implement nucleation concepts tailored to their specific scientific questions.
Usage
Input
Configuration lives in the @Nucleation block. Three global controls govern the attempt schedule; everything else is per phase-pair (_<a>_<b>,
@Nucleation
# Global {#global}
$RandomNumberSeed Seed for the stochastic site selector : 1
$NucleateEvery Attempt nucleation every N steps : 100
$NumberOfAttempts Attempts per trigger : 100
# Per phase-pair: enable nucleation and pick where it can happen {#per-phase-pair-enable-nucleation-and-pick-where-it-can-happen}
$Allowed_0_1 Enable 0→1 nucleation : Yes
$Location_0_1 Where (BULK / interfaces / junctions …) : BULK
# Intensity: SITES (count) or density-driven {#intensity-sites-count-or-density-driven}
$IMode_0_1 Intensity mode (SITES / density-driven) : SITES
$Nsites_0_1 Number of sites per attempt : 10
# — or, for density mode: {#-or-for-density-mode}
# $Density_0_1 Density of sites per unit volume : 1.0e12 {#density_0_1-density-of-sites-per-unit-volume-10e12}
# $RelativeDensity_0_1 / $RelDensity_0_1 : Yes {#relativedensity_0_1-reldensity_0_1-yes}
# Temperature window the nucleation is active in {#temperature-window-the-nucleation-is-active-in}
$Tmin_0_1 Minimum temperature (K) : 1000
$Tmax_0_1 Maximum temperature (K) : 1500
$ShieldingRadius_0_1 Minimum separation between nuclei (r) : 5.0
# Seed size: pick one of NONE / NORMAL / CAUCHY / UNIFORM {#seed-size-pick-one-of-none-normal-cauchy-uniform}
$Distribution_0_1 Seed size distribution : NONE
$SeedRadius_0_1 Fixed radius (NONE mode) : 1.5
# $Center_0_1 Mean (NORMAL / CAUCHY mode) : 1.5 {#center_0_1-mean-normal-cauchy-mode-15}
# $Deviation_0_1 Std. dev (NORMAL) : 0.2 {#deviation_0_1-std-dev-normal-02}
# $HalfWidth_0_1 Half-width (CAUCHY) : 0.2 {#halfwidth_0_1-half-width-cauchy-02}
# $SeedRadiusMIN_0_1 Minimum radius (UNIFORM) : 1.0 {#seedradiusmin_0_1-minimum-radius-uniform-10}
# $SeedRadiusMAX_0_1 Maximum radius (UNIFORM) : 2.0 {#seedradiusmax_0_1-maximum-radius-uniform-20}
$TrueRadius_0_1 Radius is the physical nucleus radius : No
# Orientation assignment of the planted grain {#orientation-assignment-of-the-planted-grain}
$OrientationMode_0_1 Mode (e.g. RANDOM) : RANDOM
# Symmetry variants selection {#symmetry-variants-selection}
$Variants_0_1 Number of symmetry variants : 1
$VariantsMode_0_1 Selection (e.g. RANDOM) : RANDOMThe $Location_<a>_<b>, $IMode_<a>_<b>, $Distribution_<a>_<b>, $OrientationMode_<a>_<b>, and $VariantsMode_<a>_<b> keywords each accept an enum-valued string; see src/Nucleation.cpp for the full set of accepted values for the release you are running.
Output
Nucleus records — phase / parent identity, position, orientation, radius, creation time — can be written to ASCII or HDF5 and reloaded during a restart, as described above.
Example
#include "Nucleation.h"
#include "Initializations.h"
Nucleation Nuc(OPSettings, InputFile);
for(RTC.tStep = RTC.tStart; RTC.tStep <= RTC.nSteps; RTC.IncrementTimeStep())
{
if (RTC.tStep % Nuc.NucleateEvery == 0)
{
Nuc.GenerateNucleationSites(Phi, Tx);
Nuc.PlantSites(Phi, BC);
}
// ... usual phase-field update ...
}See also: examples
In OpenPhase-main/examples/:
SolidificationFeC,SolidificationNiAl,SolidificationMgAl— solidification examples that activate nucleation in the undercooled liquid.Pearlite— nucleation of pearlite in Fe-C.Plagioclase— mineral-phase nucleation.
Dependencies
- PhaseField — target of planted seeds.
- Temperature —
$Tmin/$Tmaxgating. - InterfaceProperties — consumed when assigning a reduced mobility to young nuclei.
- SymmetryVariants — variant rotation matrices.
- Orientations — stores the assigned orientation of each new grain.
- Tools — ProbabilityDistributions — sampling helpers for seed size.