Multi-physics Coupling in OpenMC

Introduction to Multi-physics

Real nuclear systems involve multiple interacting physical phenomena. OpenMC can be coupled with other physics solvers to capture these interactions.

Key Physics Interactions

  • Neutronics → Heat Generation
  • Temperature → Cross Sections
  • Density → Moderation
  • Deformation → Geometry

Common Applications

  • Fuel temperature feedback
  • Coolant density effects
  • Material deformation
  • Fuel performance

Temperature Feedback

The most common coupling is temperature feedback on cross sections:

Basic Temperature Treatment

python
# Create material (from Materials section)
fuel = openmc.Material(name='UO2')
fuel.set_density('g/cm3', 10.4)
fuel.add_nuclide('U235', 0.04)
fuel.add_nuclide('U238', 0.96)
fuel.add_element('O', 2.0)

# Create geometry and assign temperature per cell
fuel_surf = openmc.ZCylinder(r=0.4096)
fuel_cell = openmc.Cell(fill=fuel, region=-fuel_surf)
fuel_cell.temperature = 900.0  # K — temperature is a Cell property

# Configure temperature treatment
settings = openmc.Settings()
settings.temperature = {
    'method': 'interpolation',
    'range': (294.0, 1500.0),
    'multipole': True  # Use multipole method when available
}

Tutorial snippet — no separate file in examples repo

Per-Region Temperatures

python
# Assign different temperatures by cell (after building geometry)
temperature_map = {
    fuel_cell.id: 1200.0,
    clad_cell.id: 700.0,
    water_cell.id: 580.0,
}

all_cells = geometry.get_all_cells()
for cell_id, temp in temperature_map.items():
    all_cells[cell_id].temperature = temp

Tutorial snippet — no separate file in examples repo

Coupling Patterns

Two primary coupling strategies exist:

Operator Splitting

  1. Run neutronics (OpenMC)
  2. Extract power distribution
  3. Run coupled physics
  4. Update temperatures
  5. Repeat until converged

Tight Coupling

  • Direct API integration
  • Shared memory access
  • Common time stepping
  • Consistent convergence

Basic Coupling Example

python
# Coupling iteration loop
for i in range(max_iterations):
    # 1. Run OpenMC
    openmc.run()
    
    # 2. Get power distribution
    sp = openmc.StatePoint('statepoint.100.h5')
    power_tally = sp.get_tally(name='power')
    power_density = power_tally.mean
    
    # 3. Run thermal model
    temperatures = calculate_temperatures(power_density)
    
    # 4. Update OpenMC cell temperatures
    update_temperatures(geometry, temperatures)
    
    # 5. Check convergence
    if check_convergence():
        break

Tutorial snippet — no separate file in examples repo

Available Frameworks

MOOSE Framework

  • Full multi-physics support
  • Finite element based
  • Parallel execution
  • Advanced solvers

ENRICO

  • OpenMC + Nek5000/NekRS
  • High-fidelity CFD
  • MPI parallelization
  • Automated coupling

Note: The choice of coupling framework depends on your specific needs:

  • Computational requirements
  • Physics fidelity needs
  • Available computing resources
  • Development time constraints

Additional Resources