Pseudo-Random Number Generation (PRNG)

  • Most MOOSE objects include an interface for generating pseudo-random numbers consistently during serial, parallel, and threaded r
  • This consistency enables more robust development and debugging without sacrificing PRNG quality.
  • Users have control over the reset frequency of the PRNG.
  • Helps avoid convergence issues due to excessive PRNG noise during linear or non-linear iterations.
  • The PRNG system avoids the repetition of "patterns" in subsequent executions of an application.

Using Random Numbers

  • Make a call to setRandomResetFrequency() in your object's constructor.
        // Options include EXEC_RESIDUAL, EXEC_JACOBIAN, EXEC_TIMESTEP, EXEC_INITIAL
        // Note: EXEC_TIMESTEP == EXEC_TIMESTEP_BEGIN for the purpose of reset

        setRandomResetFrequency(EXEC_RESIDUAL);
  • Obtain Random Numbers (Real or Long)
        // anywhere inside your object (except the constructor)

        unsigned long random_long = getRandomLong();
        Real random_real = getRandomReal();

More Details

  • Each MooseObject has its own "seed" value.
  • The seed is used to generate different random sequences from run to run.
  • The "reset frequency" specifies how often the random number generators should be reset.
  • If you reset on EXEC_RESIDUAL, you will get the same random number sequence each residual evaluation for a given timestep.
  • You can also reset less often, e.g. Jacobian, timestep, or simulation initialization only.
  • Generators are advanced every time step unless you explicitly set the reset frequency to EXEC_INITIAL.
  • A multi-level random seeding scheme is used to avoid patterning from mesh entity to mesh entity, timestep to timestep, and run to run