ExamplesMeep Examples

Multilevel Atom Laser

Simulate laser dynamics in a multilevel atom gain medium inside a cavity

Multilevel Atom Laser Simulation

This example simulates laser dynamics in a multilevel atom gain medium inside a cavity using Meep's saturable gain model.

Overview

Multilevel atom simulations model:

  • Laser dynamics: Gain, saturation, and mode competition
  • Cavity QED: Light-matter interaction in resonators
  • Amplified spontaneous emission: Noise properties
  • Nonlinear optics: Gain-induced nonlinearities

Simulation Parameters

ParameterDefault ValueDescription
resolution400Pixels per unit length
ncav1.5Cavity refractive index
Lcav1Cavity length
omega_a40Transition frequency (SALT)
gamma_perp4HWHM linewidth
N037Initial population density
Rp0.0051Pumping rate

Physical Setup

  1. 1D cavity: Dielectric slab with gain medium
  2. Two-level gain: Lorentzian lineshape with pumping
  3. PML boundary: One end open for output
  4. Field initialization: Seed for lasing

The SALT (steady-state ab initio laser theory) parameters are converted to Meep units for the simulation.

Python Code

"""
Multilevel Atom Laser Simulation with OptixLog Integration

Simulates laser dynamics in a multilevel atom gain medium
inside a cavity using MEEP's saturable gain model.
"""

import os
import math
import optixlog
import meep as mp
import matplotlib
matplotlib.use("agg")
import matplotlib.pyplot as plt
import numpy as np

api_key = os.getenv("OPTIX_API_KEY", "")
project_name = os.getenv("OPTIX_PROJECT", "MeepExamples")


def main():
    if not optixlog.is_master_process():
        return
    
    try:
        client = optixlog.init(
            api_key=api_key,
            project=project_name,
            run_name="multilevel_atom_laser",
            config={"simulation_type": "laser_dynamics"},
            create_project_if_not_exists=True
        )
        
        # Simulation parameters
        resolution = 400
        ncav = 1.5
        Lcav = 1
        dpad = 1
        dpml = 1
        sz = Lcav + dpad + dpml
        
        # Gain parameters
        omega_a = 40
        freq_21 = omega_a / (2 * math.pi)
        gamma_perp = 4
        gamma_21 = (2 * gamma_perp) / (2 * math.pi)
        theta = 1
        sigma_21 = 2 * theta * theta * omega_a
        rate_21 = 0.005
        N0 = 37
        Rp = 0.0051
        
        client.log(step=0, resolution=resolution, emission_frequency=freq_21, pumping_rate=Rp)
        
        cell_size = mp.Vector3(z=sz)
        pml_layers = [mp.PML(dpml, side=mp.High)]
        
        transitions = [
            mp.Transition(1, 2, pumping_rate=Rp, frequency=freq_21, gamma=gamma_21, sigma_diag=mp.Vector3(sigma_21, 0, 0)),
            mp.Transition(2, 1, transition_rate=rate_21),
        ]
        
        ml_atom = mp.MultilevelAtom(sigma=1, transitions=transitions, initial_populations=[N0])
        two_level = mp.Medium(index=ncav, E_susceptibilities=[ml_atom])
        
        geometry = [
            mp.Block(center=mp.Vector3(z=-0.5 * sz + 0.5 * Lcav), size=mp.Vector3(mp.inf, mp.inf, Lcav), material=two_level)
        ]
        
        sim = mp.Simulation(cell_size=cell_size, resolution=resolution, boundary_layers=pml_layers, geometry=geometry, dimensions=1)
        sim.init_sim()
        
        def field_func(p):
            return 1 if p.z == -0.5 * sz + 0.5 * Lcav else 0
        sim.fields.initialize_field(mp.Ex, field_func)
        
        endt = 7000
        sim.run(until=endt)
        
        client.log(step=1, simulation_completed=True)
        
    except Exception as e:
        print(f"Error: {e}")


if __name__ == "__main__":
    main()

Results and Analysis

Laser Dynamics

The simulation captures:

  • Transient buildup: Field grows from noise
  • Saturation: Gain depletion limits amplitude
  • Steady state: Continuous wave operation

OptixLog Metrics

  • emission_frequency: Lasing frequency
  • steady_state_amplitude: Final field amplitude
  • pumping_rate: Pump strength

On this page