Description
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👈 don't do it, according to the variables used, this is a base class functionalitygetCurrentTime()
intostruct BaseSeparableFunctorE
- 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 theirBaseParam
struct (happens at least withLASER_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 theorigin
(the former being the typical way of describing laser fields analytically).
getInternalCoordinates()
is only used inDispersivePulse
andGaussianPulse
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 toBaseFunctorE
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()
andphi()
togetValueE()
- when doing so, change
focusPos
tofocusDis
and take the proper sign (i.e. switch)
- when doing so, change
- 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;
- check the time delay computation in the
- 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 (butUnitless::INIT_TIME
) - l. 146: altough announced, there is no description of formula -> ask @PrometheusPi
- l. 124:
- 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 inBaseParam
, too!
- l.70:
- Traits.hpp:
- l. 27 non-zero
- l. 24: Huyhens -> Huygens
- l.39: short-hand
- PlaneWave.def: