diff --git a/doc/Sphinx/Overview/highlights.rst b/doc/Sphinx/Overview/highlights.rst index 1e755f6e2..c49c46004 100755 --- a/doc/Sphinx/Overview/highlights.rst +++ b/doc/Sphinx/Overview/highlights.rst @@ -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 @@ -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 `_ @@ -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. @@ -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. @@ -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. @@ -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 diff --git a/doc/Sphinx/Overview/material.rst b/doc/Sphinx/Overview/material.rst index c05384fc8..45d06b92b 100644 --- a/doc/Sphinx/Overview/material.rst +++ b/doc/Sphinx/Overview/material.rst @@ -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) `_ + +.. [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) `_ + .. [Gao2023b] X. Gao, diff --git a/doc/Sphinx/Overview/partners.rst b/doc/Sphinx/Overview/partners.rst index 2170321ba..69b87e746 100755 --- a/doc/Sphinx/Overview/partners.rst +++ b/doc/Sphinx/Overview/partners.rst @@ -56,7 +56,6 @@ Partners | | * `Julien Dérouillat `_ | | | * `Haithem Kallala `_ | | | * `Mathieu Lobet `_ | -| | * `Francesco Massimo `_ | | | * `Charles Prouveur `_ | | | | +------------+---------------------------------------------------------------------------------------------------------+ diff --git a/doc/Sphinx/Overview/releases.rst b/doc/Sphinx/Overview/releases.rst index 98e30cde6..1b0bd9ba7 100755 --- a/doc/Sphinx/Overview/releases.rst +++ b/doc/Sphinx/Overview/releases.rst @@ -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"``. ---- diff --git a/doc/Sphinx/Understand/azimuthal_modes_decomposition.rst b/doc/Sphinx/Understand/azimuthal_modes_decomposition.rst index 8cfdab1e6..deb171eca 100644 --- a/doc/Sphinx/Understand/azimuthal_modes_decomposition.rst +++ b/doc/Sphinx/Understand/azimuthal_modes_decomposition.rst @@ -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. @@ -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. @@ -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. @@ -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 """""""""""""""""""""""""""" @@ -481,7 +481,8 @@ 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:: @@ -489,19 +490,35 @@ We extend this logic to primal fields in :math:`r`: 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. diff --git a/doc/Sphinx/Use/installation.rst b/doc/Sphinx/Use/installation.rst index bf83d58a0..a2f872e36 100755 --- a/doc/Sphinx/Use/installation.rst +++ b/doc/Sphinx/Use/installation.rst @@ -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 diff --git a/doc/Sphinx/Use/post-processing.rst b/doc/Sphinx/Use/post-processing.rst index 78f5083c7..8f90f56f6 100755 --- a/doc/Sphinx/Use/post-processing.rst +++ b/doc/Sphinx/Use/post-processing.rst @@ -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) @@ -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. @@ -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.) @@ -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"``). @@ -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. @@ -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` @@ -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` @@ -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. diff --git a/doc/Sphinx/_static/LWFA_Plas@Par.jpg b/doc/Sphinx/_static/LWFA_Plas@Par.jpg index 002204fcd..3360fbdf1 100644 Binary files a/doc/Sphinx/_static/LWFA_Plas@Par.jpg and b/doc/Sphinx/_static/LWFA_Plas@Par.jpg differ diff --git a/doc/Sphinx/_static/PWFA.jpg b/doc/Sphinx/_static/PWFA.jpg index 88f0c5130..58de8a641 100644 Binary files a/doc/Sphinx/_static/PWFA.jpg and b/doc/Sphinx/_static/PWFA.jpg differ diff --git a/doc/Sphinx/_static/smileiLogo.svg b/doc/Sphinx/_static/smileiLogo.svg index 1b70b4a5c..2da3028e4 100755 --- a/doc/Sphinx/_static/smileiLogo.svg +++ b/doc/Sphinx/_static/smileiLogo.svg @@ -1,14 +1,7 @@ - + viewBox="50 380 700 240"> {{ toc }} -
    +
      {%- else %}
    • {{ entry }} @@ -162,16 +162,15 @@ + style="opacity:1;fill:none;stroke:#ffffff;stroke:var(--header_text);stroke-width:10;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + style="opacity:1;fill:#ffffff;fill:var(--header_text);fill-opacity:1;stroke:none;" /> + style="opacity:1;fill:none;stroke:#ffffff;stroke:var(--header_text);stroke-width:3;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> @@ -180,21 +179,18 @@ xmlns="http://www.w3.org/2000/svg" viewBox="0 0 80 120"> - - + transform="translate(0,-932.36216)" + style="fill:none;stroke:#ffffff;stroke:var(--header_text);stroke-width:10;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"> + + -
      +
      - + @@ -226,6 +222,9 @@ {%- block footer %}