Clean working conditions

This commit is contained in:
Benoît Sierro
2021-07-01 17:48:33 +02:00
parent ee5dcf3937
commit 21e70e2000
7 changed files with 101 additions and 28 deletions

8
.gitignore vendored
View File

@@ -17,3 +17,11 @@ scgenerator_log*
sc-*.log sc-*.log
.vscode .vscode
# latex
*.aux
*.fdb_latexmk
*.fls
*.log
*.synctex.gz

34
formulas/main.tex Normal file
View File

@@ -0,0 +1,34 @@
\documentclass[preview]{standalone}
\usepackage{siunitx}
\usepackage{tikz}
\usepackage[siunitx]{circuitikz}
\usepackage{babel}
\usepackage{acronym}
\newcommand{\At}{A(z, t)}
\newcommand{\Et}{E(z, t)}
\newcommand{\Ew}{\tilde{E}(z, \omega)}
\newcommand{\PNL}{\tilde{\mathrm{P}}^\mathrm{NL}}
\begin{document}
Complex envelope such that $|A|^2$ is in W with E in V/m~:
\begin{equation}
\At = \sqrt{\frac12 \epsilon_0 c n A_\mathrm{eff}} \Et
\end{equation}
Equations with E in V/m
\begin{equation}
\frac{\partial \Ew}{\partial z} = i\left(\beta(\omega) - \frac{\omega}{\nu} \right)\Ew + i \frac{\omega^2}{2c\epsilon_0 \beta(\omega)}\PNL(z, \omega)
\end{equation}
\begin{equation}
\tau = t - \frac{z}{\nu}
\,, \quad \xi = z
\,, \quad \frac{\partial}{\partial z} = -\frac1{\nu}\frac{\partial}{\partial \tau} + \frac{\partial}{\partial \xi} = -\frac{i \omega}{\nu} + \frac{\partial}{\partial \xi}
\,, \quad \frac{\partial}{\partial t} = \frac{\partial}{\partial \tau}
\end{equation}
$\Rightarrow$
\begin{equation}
\frac{\partial \Ew}{\partial z} = i\beta(\omega)\Ew + i \frac{\omega^2}{2c\epsilon_0 \beta(\omega)}\PNL(z, \omega)
\end{equation}
\end{document}

View File

@@ -2,6 +2,7 @@ import argparse
import os import os
from collections import ChainMap from collections import ChainMap
from pathlib import Path from pathlib import Path
import re
import numpy as np import numpy as np
@@ -72,6 +73,7 @@ def create_parser():
help="comma-separated list of left limit, right limit and unit. " help="comma-separated list of left limit, right limit and unit. "
"One plot is made for each limit set provided. Example : 600,1200,nm or -2,2,ps", "One plot is made for each limit set provided. Example : 600,1200,nm or -2,2,ps",
) )
plot_parser.add_argument("--options", "-o", default=None)
plot_parser.set_defaults(func=plot_all) plot_parser.set_defaults(func=plot_all)
dispersion_parser = subparsers.add_parser( dispersion_parser = subparsers.add_parser(
@@ -180,8 +182,11 @@ def resume_sim(args):
def plot_all(args): def plot_all(args):
opts = {}
if args.options is not None:
opts |= dict([o.split("=")[:2] for o in re.split("[, ]", args.options)])
root = Path(args.sim_dir).resolve() root = Path(args.sim_dir).resolve()
scripts.plot_all(root, args.spectrum_limits) scripts.plot_all(root, args.spectrum_limits, **opts)
def plot_init_field_spec(args): def plot_init_field_spec(args):

View File

@@ -196,11 +196,11 @@ def ionization_rate_ADK(
nstar = Z * np.sqrt(2.1787e-18 / ionization_energy) nstar = Z * np.sqrt(2.1787e-18 / ionization_energy)
omega_t = lambda field: e * np.abs(field) / np.sqrt(2 * me * ionization_energy) omega_t = lambda field: e * np.abs(field) / np.sqrt(2 * me * ionization_energy)
Cnstar = 2 ** (2 * nstar) / (scipy.special.gamma(nstar + 1) ** 2) Cnstar = 2 ** (2 * nstar) / (scipy.special.gamma(nstar + 1) ** 2)
omega_C = omega_p / 4 * math.abs2(Cnstar) omega_pC = omega_p * Cnstar
def rate(field: np.ndarray) -> np.ndarray: def rate(field: np.ndarray) -> np.ndarray:
opt4 = 4 * omega_t(field) / om opt4 = 4 * omega_p / omega_t(field)
return omega_C * (4 * omega_p / ot) ** (2 * nstar - 1) * np.exp(-4 * omega_p / (3 * ot)) return omega_pC * opt4 ** (2 * nstar - 1) * np.exp(-opt4 / 3)
return rate return rate
@@ -229,7 +229,8 @@ class Plasma:
""" """
Ne = free_electron_density(self.t, field, N0, self.rate) Ne = free_electron_density(self.t, field, N0, self.rate)
return cumulative_trapezoid( return cumulative_trapezoid(
np.gradient(Ne, self.t) * self.Ip / field, self.t, initial=0 np.gradient(Ne, self.t) * self.Ip / field
) + e ** 2 / me * cumulative_trapezoid( + e ** 2 / me * cumulative_trapezoid(Ne * field, self.t, initial=0),
cumulative_trapezoid(Ne * field, self.t, initial=0), self.t, initial=0 self.t,
initial=0,
) )

View File

@@ -125,6 +125,26 @@ def modify_field_ratio(
return ratio return ratio
def convert_field_units(envelope: np.ndarray, n: np.ndarray, A_eff: float) -> np.ndarray:
"""[summary]
Parameters
----------
envelope : np.ndarray, shape (n,)
complex envelope in units such that |envelope|^2 is in W
n : np.ndarray, shape (n,)
refractive index
A_eff : float
effective mode field area in m^2
Returns
-------
np.ndarray, shape (n,)
real field in V/m
"""
return 2 * envelope.real / np.sqrt(2 * units.epsilon0 * units.c * n * A_eff)
def conform_pulse_params( def conform_pulse_params(
shape: Literal["gaussian", "sech"], shape: Literal["gaussian", "sech"],
width: float = None, width: float = None,

View File

@@ -8,6 +8,8 @@ import numpy as np
from matplotlib.colors import ListedColormap from matplotlib.colors import ListedColormap
from scipy.interpolate import UnivariateSpline from scipy.interpolate import UnivariateSpline
from .logger import get_logger
from . import io, math from . import io, math
from .defaults import default_plotting as defaults from .defaults import default_plotting as defaults
from .math import abs2, make_uniform_1D, span from .math import abs2, make_uniform_1D, span
@@ -250,7 +252,7 @@ def _finish_plot_2D(
file_name, file_name,
file_type, file_type,
): ):
logger = get_logger(__name__)
# apply log transform if required # apply log transform if required
if log is not False: if log is not False:
vmax = defaults["vmax"] if vmax is None else vmax vmax = defaults["vmax"] if vmax is None else vmax
@@ -272,7 +274,7 @@ def _finish_plot_2D(
elif log == "unique 1D": elif log == "unique 1D":
try: try:
ref = _finish_plot_2D.ref ref = _finish_plot_2D.ref
print(f"recovered reference value {ref} for log plot") logger.info(f"recovered reference value {ref} for log plot")
except AttributeError: except AttributeError:
ref = np.max(values, axis=1) ref = np.max(values, axis=1)
ind = np.argmax((ref[:-1] - ref[1:]) < 0) ind = np.argmax((ref[:-1] - ref[1:]) < 0)
@@ -335,7 +337,7 @@ def _finish_plot_2D(
if is_new_plot: if is_new_plot:
fig.savefig(out_path, bbox_inches="tight", dpi=200) fig.savefig(out_path, bbox_inches="tight", dpi=200)
print(f"plot saved in {out_path}") logger.info(f"plot saved in {out_path}")
if cbar_label is not None: if cbar_label is not None:
return fig, (ax, cbar.ax) return fig, (ax, cbar.ax)
else: else:

View File

@@ -6,6 +6,7 @@ from cycler import cycler
import matplotlib.pyplot as plt import matplotlib.pyplot as plt
import numpy as np import numpy as np
from tqdm import tqdm
from ..utils.parameter import BareParams from ..utils.parameter import BareParams
@@ -22,24 +23,26 @@ def fingerprint(params: BareParams):
return h1, h2 return h1, h2
def plot_all(sim_dir: Path, limits: list[str]): def plot_all(sim_dir: Path, limits: list[str], **opts):
for p in sim_dir.glob("*"): dir_list = list(p for p in sim_dir.glob("*") if p.is_dir())
if not p.is_dir(): limits = [
continue tuple(func(el) for func, el in zip([float, float, str], lim.split(","))) for lim in limits
]
pulse = Pulse(p) print(limits)
for lim in limits: with tqdm(total=len(dir_list) * len(limits)) as bar:
left, right, unit = lim.split(",") for p in dir_list:
left = float(left) pulse = Pulse(p)
right = float(right) for left, right, unit in limits:
pulse.plot_2D( pulse.plot_2D(
left, left,
right, right,
unit, unit,
file_name=p.parent file_name=p.parent
/ f"{pretty_format_from_file_name(p.name)} {left} {right} {unit}", / f"{pretty_format_from_file_name(p.name)} {left} {right} {unit}",
) **opts,
plt.close("all") )
bar.update()
plt.close("all")
def plot_init_field_spec( def plot_init_field_spec(