Sodium 330 nm LGS

A polychromatic sodium LGS excited by 330 nm light
from pylgs.all import *

Define a LGS system pumped by 330 nm light:

lgs = LGSSystem(
    'Na330', 
    {
        'IntensitySI1': 5000.,
        'BFieldG': 0.5,
        'EllipticityDegrees1': 45.,
        'PolarizationAngleDegrees1': 0,
        'DetuningHz1': 1.0832e9,
        'LaserWidthHz1': 10.0e6,
        'MagneticZenithDegrees': 45.,
        'MagneticAzimuthDegrees': 45.,
        'SDampingCollisionRatePerS': 4081.63,
        'BeamTransitRatePerS': 131.944,
        'VccRatePerS': 28571.,
        'TemperatureK': 185.,
        'RecoilParameter': 1.
    }
)

The system is made up of 774 density-matrix elements describing 7 atomic levels:

lgs.level_population.range
Level(7)
<xarray.DataArray 'XarrayVectorSpace' (Level: 7)> Size: 56B
array([0., 0., 0., 0., 0., 0., 0.])
Coordinates:
  * Level    (Level) <U16 448B '3P<sub>3/2</sub>' ... '3D<sub>3/2</sub>'
HTML(', '.join(lgs.level_population.range.coords['Level'].data))
3P3/2, 3S1/2, 3D5/2, 4S1/2, 4P3/2, 3P1/2, 3D3/2

Steady-state model

Adaptively refine velocity groups

Build a steady-state model with adaptively refined velocity groups:

model, sol = lgs.adaptive_stationary_model({}, rtol=1e-2)

Solve for the density matrix. There are 77 velocity groups in the model:

sol = model.solve()
sol
∅ ⛒ Atomic velocity(106) ⛒ Density matrix(774)
<xarray.DataArray (Atomic velocity: 106, Density matrix: 774)> Size: 656kB
array([[ 1.16073479e-05,  1.29066164e-06, -1.29057180e-06, ...,
        -1.61010818e-09, -2.94902464e-12,  9.76750757e-12],
       [ 5.73120609e-05,  6.37263788e-06, -6.37218417e-06, ...,
        -8.88427925e-09, -1.81878127e-11,  5.56622776e-11],
       [ 2.36938318e-04,  2.63453439e-05, -2.63434049e-05, ...,
        -4.16189579e-08, -9.65707159e-11,  2.73939403e-10],
       ...,
       [ 7.97090203e-05,  8.93037052e-06, -8.92552198e-06, ...,
         1.37548468e-08, -3.08409859e-11,  8.88953999e-11],
       [ 5.71475479e-05,  6.38820606e-06, -6.38582196e-06, ...,
         8.93664238e-09, -1.82708056e-11,  5.58317771e-11],
       [ 1.15860032e-05,  1.29318916e-06, -1.29284466e-06, ...,
         1.61518494e-09, -2.95482171e-12,  9.77938575e-12]],
      shape=(106, 774))
Coordinates:
  * Atomic velocity  (Atomic velocity) float64 848B -2.85 -2.55 ... 2.55 2.85
  * Density matrix   (Density matrix) <U68 211kB 'ρ<sub>Re, (3S<sub>1/2</sub>...

Plot the total return flux for each transition as a bar chart:

model.total_flux(sol).array
<xarray.DataArray (Sum: 1, Transition: 11)> Size: 88B
array([[ 52.76085958, 106.35513199,  64.56494505,  49.78030685,
          3.06319183,  99.56061371,   0.58224987,   3.38556015,
        155.89499459,   3.4505648 ,   3.24447093]])
Coordinates:
  * Sum         (Sum) <U3 12B 'Sum'
  * Transition  (Transition) <U33 1kB '3P<sub>1/2</sub>→3S<sub>1/2</sub>' ......
Attributes:
    long_name:  Flux
    units:      photon/atom/s/sr
model.total_flux(sol).visualize()

Plot the flux as a function of velocity:

model.flux_distribution(sol).visualize(xaxis_range=(-1, 2))

Transient dynamics model

Build a model for the transient dynamics:

model = lgs.instationary_model(
    vg=model.data['velocity_groups'], 
    T=1e-6, 
    num_values=101
)

Set tolerances for the BDF solver:

pymor.basic.set_defaults({
    'pylgs.pymor.timestepping.cvode_solver_options.cvode_bdf_atol': 1e-6,
    'pylgs.pymor.timestepping.cvode_solver_options.cvode_bdf_rtol': 1e-5,
})

Solve for the density matrix as a function of time:

sol = model.solve()

Plot the return flux for each transition:

model.total_flux(sol).visualize()

Animate the level population distribution as a function of time:

model.level_population_distribution(sol).visualize(xaxis_range=(-.25, 2), yaxis_range=(0, .045))