Skip to content

Commit ebb77a2

Browse files
author
Stefan Tietze
committed
Fix: Wavepacket from potential
Correction to laser pulse formular for few-cycle wavepackets (same as for ComputationalRadiationPhysics#851)
1 parent 7f19215 commit ebb77a2

File tree

1 file changed

+13
-5
lines changed

1 file changed

+13
-5
lines changed

src/picongpu/include/fields/laserProfiles/laserWavepacket.hpp

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/**
2-
* Copyright 2013-2015 Axel Huebl, Heiko Burau, Rene Widera, Richard Pausch
2+
* Copyright 2013-2015 Axel Huebl, Heiko Burau, Rene Widera, Richard Pausch, Stefan Tietze
33
*
44
* This file is part of PIConGPU.
55
*
@@ -30,6 +30,9 @@ namespace picongpu
3030
/** not focusing wavepaket with spacial gaussian envelope
3131
*
3232
* no phase shifts, just spacial envelope
33+
* including correction to laser formular derived from vector potential, so the integration
34+
* along propagation direction gives 0
35+
* this is important for few-cycle laser pulses
3336
*/
3437
namespace laserWavepacket
3538
{
@@ -56,6 +59,9 @@ HINLINE float3_X laserLongitudinal(uint32_t currentStep, float_X& phase)
5659
const double endUpramp = -0.5 * LASER_NOFOCUS_CONSTANT;
5760
const double startDownramp = 0.5 * LASER_NOFOCUS_CONSTANT;
5861

62+
const double tau = PULSE_LENGTH / sqrt(2.0);
63+
64+
double correctionFactor = 0.0;
5965

6066
if (runTime > startDownramp)
6167
{
@@ -64,28 +70,30 @@ HINLINE float3_X laserLongitudinal(uint32_t currentStep, float_X& phase)
6470
((runTime - startDownramp)
6571
/ PULSE_LENGTH / sqrt(2.0));
6672
envelope *= math::exp(-0.5 * exponent * exponent);
73+
correctionFactor = (runTime - startDownramp)/(tau*tau*w);
6774
}
6875
else if(runTime < endUpramp)
6976
{
7077
// upramp = start
7178
const double exponent = ((runTime - endUpramp) / PULSE_LENGTH / sqrt(2.0));
7279
envelope *= math::exp(-0.5 * exponent * exponent);
80+
correctionFactor = (runTime - endUpramp)/(tau*tau*w);
7381
}
7482

7583
phase += float_X(w * runTime) + LASER_PHASE;
7684

7785
if( Polarisation == LINEAR_X )
7886
{
79-
elong.x() = envelope * math::sin(phase);
87+
elong.x() = float_X(envelope * (math::sin(phase) + correctionFactor * math::cos(phase)));
8088
}
8189
else if( Polarisation == LINEAR_Z )
8290
{
83-
elong.z() = envelope * math::sin(phase);
91+
elong.z() = float_X(envelope * (math::sin(phase) + correctionFactor * math::cos(phase)));
8492
}
8593
else if( Polarisation == CIRCULAR )
8694
{
87-
elong.x() = envelope / sqrt(2.0) * math::sin(phase);
88-
elong.z() = envelope / sqrt(2.0) * math::cos(phase);
95+
elong.x() = float_X(envelope / sqrt(2.0) * (math::sin(phase) + correctionFactor * math::cos(phase)));
96+
elong.z() = float_X(envelope / sqrt(2.0) * (math::cos(phase) + correctionFactor * math::sin(phase)));
8997
}
9098

9199
return elong;

0 commit comments

Comments
 (0)