Skip to content

ToDo in laser refactoring #5269

Open
@steindev

Description

@steindev

Since the implementation of the lasers is in parts at the least confusing and sometimes inconsistent, it is going to be refactored. The following action items are foreseen:

  • check if all separable lasers have a correct phase calculation
  • refactor BaseFunctorE:
    • move getCurrentTime() into struct BaseSeparableFunctorE 👈 don't do it, according to the variables used, this is a base class functionality
    • rename this 👆 function to getTminusXoverC() in order to reflect its purpose
  • remove the laser cutoff, as it is wrong. Laser phases and envelopes should be computed for all times at all positions on the incident field plane.
// Cut off when the laser has not entered at this point yet to avoid confusion.
if(time < 0.0_X)
    return float3_X::create(0.0_X);
  • Remove Wavepacket laser, as it is almost identical to PlaneWave? Except for the transverse Gaussian Envelope. Is it possible to at least reuse the plane wave laser implementation? Similar to the pulse-front tilt for the Gaussian? But why not use the gaussian instead of wavepacket for lasers with transverse envelope?
  • Remove the pulse-front tilt feature in the standard Gaussian laser? It is not physical anyways, since we do not know how pulse-front tilts propagate for Laguerre-Gaussian modes, and for standard Gaussian pulses there is the DispersivePulse implementing the feature correctly.
  • check if lasers define variables in their Params struct again although these are already defined in their BaseParam struct (happens at least with LASER_PHASE in wavepacket laser)
  • since all lasers have define a focus (via BaseParam), the laser internal coordinate system should be relative to the focus position and not the origin (the former being the typical way of describing laser fields analytically).
    getInternalCoordinates() is only used in DispersivePulse and GaussianPulse anyways.
  • reimplement Gaussian laser in order to have correct phases and envelope computation
    • allow for different width along the transverse axis (cf. polynom laser)
  • refactor DispersivePulse:
    • check the time delay computation in the DispersivePulse for correctness wrt to BaseFunctorE internal coordinates and time
    • check correctness of the sign of the phase computation. Is fine, but focusPos has the wrong sign, which is properly accounted for in the DispersivePulse implementation
    • move computation of internal coordinates from amp() and phi() to getValueE()
      • when doing so, change focusPos to focusDis and take the proper sign (i.e. switch)
    • make dispersion axis parallel to polarization
    • Update comments according to other branch
    • shorten computation of magnitude in amp()
      // Normalization to Amplitude
      mag *= math::sqrt(pmacc::math::Pi<float_X>::doubleValue * 0.5_X) * 2.0_X
          * Unitless::PULSE_DURATION * Unitless::AMPLITUDE;
      
      // Dividing amplitude by 2 to compensate doubled spectral field strength
      // resulting from E(-Omega) = E*(Omega), which has to be fulfilled for E(t) to be real
      mag *= 0.5_X;
  • rename Unitless::w -> Unitless::OMEGA0 (since there is confusion in the Gaussian profile with the width)
  • does accessing Unitless::LASER_PHASE really work if it is defined in a mother::mother::mother::mother class?
  • fix grammar errors:
    • PlaneWave.def:
      • l. 59: fulfulled
      • l. 42: PULSE_INIT -> RAMP_INIT in documentation OR rename parameter. PULSE_INIT is used in all other profiles.
    • PlaneWave.hpp:
      • l. 124: Unitless::RAMP_INIT does not exist (but Unitless::INIT_TIME)
      • l. 146: altough announced, there is no description of formula -> ask @PrometheusPi
    • BaseParam.hpp:
      • l.150 coordinate
    • Functors.hpp
      • l.142 coordinate
      • l. 308 comma missing after 'However'
    • Wavepacket.def:
      • l.70: LASER_PHASE is defined here and in BaseParam, too!
    • Traits.hpp:
      • l. 27 non-zero
      • l. 24: Huyhens -> Huygens
      • l.39: short-hand

Metadata

Metadata

Assignees

Labels

refactoringcode change to improve performance or to unify a concept but does not change public API

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions