Skip to content

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>, α<β).

text
@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)                 : RANDOM

The $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

cpp
#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

Released under the GNU GPLv3 License.