Skip to content

Commit

Permalink
Merge branch 'develop'
Browse files Browse the repository at this point in the history
  • Loading branch information
mccoys committed Feb 9, 2024
2 parents d8e1d85 + 52dd7c5 commit 08f6bd2
Show file tree
Hide file tree
Showing 43 changed files with 526 additions and 440 deletions.
14 changes: 7 additions & 7 deletions doc/Sphinx/Overview/highlights.rst
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ Following is a comparison of the accelerated electron spectra at the end of thes
In the green line it is shown the result of the previously known averaged ionization model. Without the longitudinal
momentum initialization, few electrons obtained through ionization are trapped and accelerated in the plasma wave.
The red line shows the result with the new averaged ionization model implemented in :program:`Smilei`, which accurately reproduces
the spectrum obtained with the simulation without an envelope model (blue line).
the spectrum obtained with the *standard laser* simulation without an envelope model.


The envelope simulation required an amount of computing resources orders of magnitude smaller than those required by the simulation without a
Expand Down Expand Up @@ -145,7 +145,7 @@ an amount of resources greater by at least an order of magnitude.

The laser (in red) propagates through a low density plasma and drives a nonlinear Langmuir wave (in blue) that
propagates at a velocity close to that of light in its wake. In this simulation, a moving window is used
so we can follow the laser as it propagates through the plasma. We see electrons (in white) being self-injected
so we can follow the laser as it propagates through the plasma. We see electrons being self-injected
in this wakefield where they see a strong electric field that accelerates them up to ultra-relativistic (GeV) energy level.

An animation generated from the simulation data can be found `here <https://www.youtube.com/watch?v=-LX_yT29nAU>`_
Expand Down Expand Up @@ -230,7 +230,7 @@ shows how this balancing reduces the time of the simulation.
:align: center

The red curve is the best situation obtained in the previous section, while
the black curve corresponds to the DLB algorithm enabled.
the curves with dynamic load balancing are indicated as *DLB*.

The portion of the box belonging to each MPI process varies when the load balancing
occurs. The following figure shows how each of these portions evolve with time.
Expand All @@ -239,7 +239,7 @@ occurs. The following figure shows how each of these portions evolve with time.

The four panels correspond to four timesteps during the simulation.
The colorscale represents the log-scaled load of each patch.
The black lines show the borders of each MPI process' portion of the box.
The lines show the borders of each MPI process' portion of the box.
The MPI processes that are close to the hotspot tend to handle a smaller portion
of the box.

Expand All @@ -266,7 +266,7 @@ with a total of :math:`\sim 1.4` billion quasi-particles in the box.
The following figure (top panel) shows half of the simulation box in the
y-direction, and the laser field is reported at three different times.
The reflected laser pulse (at time :math:`t_2`) shows a different spectral content than
the incident pulse (at time :math:`t_0`). The plasma electron density is shown in black.
the incident pulse (at time :math:`t_0`).
A close-up view of the interaction region is given in the bottom panel, illustrating
the electron bunches being pulled out from the plasma surface.

Expand Down Expand Up @@ -317,8 +317,8 @@ A 2-dimensional simulation, in conditions close to actual experiments, ran
on a box size of 1024 µm x 512 µm for 10 ps
with 25 billion quasi-particles. The following figure shows the evolution
of the pump and seed intensities in the head-on collision at three different times.
The blue-yellow maps correspond to the plasma density while the white-red maps
correspond to the lasers intensity.
Surfaces corresponding to the laser intensity are overlaid on top of surfaces
corresponding to the plasma density.

.. image:: /_static/pump_seed.jpg
:align: center
Expand Down
11 changes: 11 additions & 0 deletions doc/Sphinx/Overview/material.rst
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,18 @@ As of November 2021, 90 papers have been published covering a broad range of top
Use the python script doc/doi2publications.py to generate entries from a DOI number, and paste them here
.. [Gorlova2024]
D. A. Gorlova, I. N. Tsymbalov, I. P. Tsygvintsev and A. B. Savelev,
`THz transition radiation of electron bunches laser-accelerated in long-scale near-critical-density plasmas`,
`Laser Physics Letters 21, 035001 (2024) <https://doi.org/10.1088/1612-202X/ad21ed>`_
.. [Seidel2024]
A. Seidel, B. Lei, C. Zepter, M. C. Kaluza, A. Sävert, M. Zepf, and D. Seipt,
`Polarization and CEP dependence of the transverse phase space in laser driven accelerators`,
`Physical Review Research 6, 013056 (2024) <https://doi.org/10.1103/PhysRevResearch.6.013056>`_
.. [Gao2023b]
X. Gao,
Expand Down
1 change: 0 additions & 1 deletion doc/Sphinx/Overview/partners.rst
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,6 @@ Partners
| | * `Julien Dérouillat <[email protected]>`_ |
| | * `Haithem Kallala <[email protected]>`_ |
| | * `Mathieu Lobet <[email protected]>`_ |
| | * `Francesco Massimo <[email protected]>`_ |
| | * `Charles Prouveur <[email protected]>`_ |
| | |
+------------+---------------------------------------------------------------------------------------------------------+
Expand Down
8 changes: 8 additions & 0 deletions doc/Sphinx/Overview/releases.rst
Original file line number Diff line number Diff line change
Expand Up @@ -25,13 +25,21 @@ Changes made in the repository (not released)

* Happi:

* In ``Scalar``, it is now possible to make an operation on scalars such as ``"Uelm+Ukin"``.
The list of available scalars can be obtained from ``getScalars()``.
* New arguments ``xoffset`` and ``yoffset`` to shift plot coordinates.
* New argument ``timestep_indices`` as an alternative to ``timesteps``.
* Changed coordinate reference for 2D probe in 3D or AM geometry
(zero is the box origin projected orthogonally on the probe plane).

* Documentation:

* Dark theme (click the switch on the bottom left, or set browser preferences).

* Bug fixes:

* ``dump_minutes`` often failed to write some checkpoint files.
* ``"auto"`` limits in ``ParticleBinning`` could fail with only one side on ``"auto"``.

----

Expand Down
37 changes: 27 additions & 10 deletions doc/Sphinx/Understand/azimuthal_modes_decomposition.rst
Original file line number Diff line number Diff line change
Expand Up @@ -320,7 +320,7 @@ Cancellation on axis
"""""""""""""""""""""""

The first basic principle is that a mode 0 field defined on axis can only be longitudinal otherwise it would be ill defined.
On the opposite, longitudinal fields on axis can only be of mode 0 since they do not depend on :math:`theta`.
On the opposite, longitudinal fields on axis can only be of mode 0 since they do not depend on :math:`\theta`.
From this we can already state that :math:`E_r^{m=0},\ E_t^{m=0},\ B_r^{m=0},\ B_t^{m=0},\ E_l^{m>0},\ B_l^{m>0}` are zero on axis.


Expand Down Expand Up @@ -415,7 +415,12 @@ To ensure this derivative cancels on axis we simply pick:
And equation :eq:`transverse_on_axis` then gives

.. math::
\tilde{E_{\theta}}^{m=1}[2] = -i\tilde{E_r}^{m=1}[3]
\tilde{E_{\theta}}^{m=1}(r=0) = -i\tilde{E_r}^{m=1}(r=0)
With a finite difference scheme, this is implemented as

.. math::
\tilde{E_{\theta}}^{m=1}[2] = -\frac{i}{8}(9\tilde{E_r}^{m=1}[3]-\tilde{E_r}^{m=1}[4])
All the equation derived here are also valid for the magnetic field.
But because of a different duality, it is more convenient to use a different approach.
Expand Down Expand Up @@ -450,7 +455,7 @@ With a similar interpolation we obtain the boundary condition on axis for :math:
.. math::
B_{\theta}^{m=1}[2]=-2iB_{r}^{m=1}[2]-B_{\theta}^{m=1}[3]
Longitudinal fields on axis
Longitudinal field on axis
"""""""""""""""""""""""""""""

We have alreayd established that only modes :math:`m=0` of longitudinal fields are non zero on axis.
Expand All @@ -468,11 +473,6 @@ Introducing this result in the standard FDTD expression of :math:`E_l` we get:
Again, the :math:`n` indice indicates the time step here.

:math:`B_l^{m=0}` is independant of :math:`\theta`. If we assume it is differentiable at :math:`r=0` then its derivative along :math:`r` is zero
on axis (derivative of a pair function is zero at :math:`x=0` ). From this we get:

.. math::
B_{l}^{m=0}[2]=B_{l}^{m=0}[3]

Below axis
""""""""""""""""""""""""""""
Expand All @@ -481,27 +481,44 @@ Fields "below" axis are primal fields data with indice :math:`j<2` and dual fiel
These fields are not physical in the sense that they do not contribute to the reconstruction of any physical field in real space and are not obtained by solving Maxwell's equations.
Nevertheless, it is numerically convenient to give them a value in order to facilitate field interpolation for macro-particles near axis.
This is already what is done for dual fields in :math:`r` which cancel on axis for instance.
We extend this logic to primal fields in :math:`r`:
We extend this logic to primal fields in :math:`r` as well.
For any given field :math:`F`, the symetric of :math:`F` with respect to the axis is :math:`F` if :math:`F` is non zero on axis and :math:`-F` if :math:`F` is zero on axis:

.. math::
E_{l}^{m=0}[1] = E_{l}^{m=0}[3]
E_{l}^{m>0}[1] = -E_{l}^{m>0}[3]
E_{r}^{m\neq1}[2] = -E_{r}^{m\neq1}[3]
E_{r}^{m=1}[2] = E_{r}^{m=1}[3]
E_{\theta}^{m\neq1}[1] = -E_{\theta}^{m\neq1}[3]
E_{\theta}^{m=1}[1] = E_{\theta}^{m=1}[3]
B_{l}^{m=0}[2]=B_{l}^{m=0}[3]
B_{l}^{m>0}[2]=-B_{l}^{m>0}[3]
B_{r}^{m\neq1}[1] = -B_{r}^{m\neq1}[3]
B_{r}^{m=1}[1] = B_{r}^{m=1}[3]
B_{t}^{m\neq1}[2] = -B_{t}^{m\neq1}[3]
B_{t}^{m=1}[2] = B_{t}^{m=1}[3]
Currents near axis
"""""""""""""""""""""

A specific treatment must be applied to charge and current densities near axis because the projector deposits charge and current "below" axis.
Quantities below axis must be brought back in the "physical" terms on and above axis.
Quantities below axis must be folded back onto their symetric "above" axis.
Mode 0 contributions below axis are added to their "above axis" counterparts.
On the opposite, strictly positive modes contributions are deduced.
This ensures that a particle sitting on axis will have a net contribution to the domain only in mode 0 as expected because in that case :math:`\theta` is not defined and therefore
the deposition can not be a function of :math:`\theta`.

Using the continuity equation instead of Gauss law for transverse current of mode :math:`m=1` on axis, we can derive the exact same boundary conditions
on axis for current density as for the electric field.
Expand Down
3 changes: 0 additions & 3 deletions doc/Sphinx/Use/installation.rst
Original file line number Diff line number Diff line change
Expand Up @@ -105,9 +105,6 @@ Advanced compilation options
make config=vtune # For Intel Vtune
make config=inspector # For Intel Inspector
make config=detailed_timers # More detailed timers, but somewhat slower execution
make config=omptasks # use OpenMP task parallelization, not supported by old compilers
make config=part_event_tracing_tasks_off # trace the use particle operators, without task parallelization
make config=part_event_tracing_tasks_on # trace the use particle operators, with OpenMP task parallelization
make config="gpu_nvidia noopenmp" # For Nvidia GPU acceleration
make config="gpu_amd" # For AMD GPU acceleration
Expand Down
36 changes: 22 additions & 14 deletions doc/Sphinx/Use/post-processing.rst
Original file line number Diff line number Diff line change
Expand Up @@ -101,12 +101,16 @@ about the corresponding diagnostics in the simulation.
Returns a list of available diagnostics of the given type

* ``diagType``: The diagnostic type (``"Field"``, ``"Probe"``, etc.)

.. rubric:: Information on specific diagnostics

.. py:method:: getScalars()
Returns a list of available scalars.

.. py:method:: getTrackSpecies()
Returns a list of available tracked species.

.. rubric:: Information on specific diagnostics

.. py:method:: fieldInfo(diag)
Expand Down Expand Up @@ -145,12 +149,16 @@ Open a Scalar diagnostic

.. py:method:: Scalar(scalar=None, timesteps=None, units=[""], data_log=False, data_transform=None, **kwargs)
* ``scalar``: The name of the scalar.
| If not given, then a list of available scalars is printed.
* ``timesteps``: The requested timestep(s).
| If omitted, all timesteps are used.
| If one number given, the nearest timestep available is used.
| If two numbers given, all the timesteps in between are used.
* ``scalar``: The name of the scalar, or an operation on scalars, such as ``"Uelm+Ukin"``.
* ``timesteps`` or ``timestep_indices``: The requested range of timesteps.

* If omitted, all timesteps are used.
* If one number given, the nearest timestep available is used.
* If two numbers given, all the timesteps in between are used.

When using ``timesteps``, provide the timesteps themselves, but
when using ``timestep_indices``, provide their indices in the list
of the available timesteps.
* ``units``: A unit specification (see :ref:`units`)
* ``data_log``:
| If ``True``, then :math:`\log_{10}` is applied to the output.
Expand All @@ -170,7 +178,7 @@ Open a Field diagnostic

.. py:method:: Field(diagNumber=None, field=None, timesteps=None, subset=None, average=None, units=[""], data_log=False, data_transform=None, moving=False, export_dir=None, **kwargs)
* ``timesteps``, ``units``, ``data_log``, ``data_transform``: same as before.
* ``timesteps`` (or ``timestep_indices``), ``units``, ``data_log``, ``data_transform``: same as before.
* ``diagNumber``: number or ``name`` of the fields diagnostic
| If not given, then a list of available diagnostic numbers is printed.
* ``field``: The name of a field (``"Ex"``, ``"Ey"``, etc.)
Expand Down Expand Up @@ -228,7 +236,7 @@ Open a Probe diagnostic

.. py:method:: Probe(probeNumber=None, field=None, timesteps=None, subset=None, average=None, units=[""], data_log=False, data_transform=None, **kwargs)
* ``timesteps``, ``units``, ``data_log``, ``data_transform``, ``export_dir``: same as before.
* ``timesteps`` (or ``timestep_indices``), ``units``, ``data_log``, ``data_transform``, ``export_dir``: same as before.
* ``probeNumber``: number or ``name`` of the probe (the first one has number 0).
| If not given, a list of available probes is printed.
* ``field``: name of the field (``"Bx"``, ``"By"``, ``"Bz"``, ``"Ex"``, ``"Ey"``, ``"Ez"``, ``"Jx"``, ``"Jy"``, ``"Jz"`` or ``"Rho"``).
Expand Down Expand Up @@ -256,7 +264,7 @@ Open a ParticleBinning diagnostic

.. py:method:: ParticleBinning(diagNumber=None, timesteps=None, subset=None, average=None, units=[""], data_log=False, data_transform=None, **kwargs)
* ``timesteps``, ``units``, ``data_log``, ``data_transform``, ``export_dir``: same as before.
* ``timesteps`` (or ``timestep_indices``), ``units``, ``data_log``, ``data_transform``, ``export_dir``: same as before.
* ``diagNumber``: number or ``name`` of the particle binning diagnostic (starts at 0).
| If not given, a list of available diagnostics is printed.
| It can also be an operation between several diagnostics.
Expand Down Expand Up @@ -306,7 +314,7 @@ Open a Screen diagnostic

.. py:method:: Screen(diagNumber=None, timesteps=None, subset=None, average=None, units=[""], data_log=False, data_transform=None, **kwargs)
* ``timesteps``, ``units``, ``data_log``, ``data_transform``, ``export_dir``: same as before.
* ``timesteps`` (or ``timestep_indices``), ``units``, ``data_log``, ``data_transform``, ``export_dir``: same as before.
* ``diagNumber``, ``subset`` and ``average``: identical to that of ParticleBinning diagnostics.
* See also :ref:`otherkwargs`

Expand All @@ -323,7 +331,7 @@ Open a RadiationSpectrum diagnostic

.. py:method:: ParticleBinning(diagNumber=None, timesteps=None, subset=None, average=None, units=[""], data_log=False, data_transform=None, **kwargs)
* ``timesteps``, ``units``, ``data_log``, ``data_transform``, ``export_dir``: same as before.
* ``timesteps`` (or ``timestep_indices``), ``units``, ``data_log``, ``data_transform``, ``export_dir``: same as before.
* ``diagNumber``, ``subset`` and ``average``: identical to that of ParticleBinning diagnostics.
* See also :ref:`otherkwargs`

Expand All @@ -344,7 +352,7 @@ Open a TrackParticles diagnostic

.. py:method:: TrackParticles(species=None, select="", axes=[], timesteps=None, sort=True, length=None, units=[""], **kwargs)
* ``timesteps``, ``units``, ``export_dir``: same as before.
* ``timesteps`` (or ``timestep_indices``), ``units``, ``export_dir``: same as before.
* ``species``: the name of a tracked-particle species.
If omitted, a list of available tracked-particle species is printed.
* ``select``: Instructions for selecting particles among those available.
Expand Down
Binary file modified doc/Sphinx/_static/[email protected]
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified doc/Sphinx/_static/PWFA.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
9 changes: 1 addition & 8 deletions doc/Sphinx/_static/smileiLogo.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion doc/Sphinx/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,7 @@

# The name of an image file (relative to this directory) to place at the top
# of the sidebar.
html_logo = "../logo/smileiLogo.svg"
html_logo = "_static/smileiLogo.svg"

# The name of an image file (within the static path) to use as favicon of the
# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
Expand Down
Loading

0 comments on commit 08f6bd2

Please sign in to comment.