Ejemplo n.º 1
0
def main():
    # -- DEFINE SIMULATION PARAMETERS
    # ... COMPUTATIONAL DOMAIN
    t_max = 3500.  # (fs)
    t_num = 2**14  # (-)
    z_max = 0.10 * 1e6  # (micron)
    z_num = 8000  # (-)
    z_skip = 10  # (-)
    # ... INITIAL CONDITION
    P0 = 1e4  # (W)
    t0 = 28.4  # (fs)
    w0 = 2.2559  # (rad/fs)
    E_0t_fun = lambda t: np.real(
        np.sqrt(P0) / np.cosh(t / t0) * np.exp(-1j * w0 * t))

    # -- INITIALIZATION STAGE
    # ... COMPUTATIONAL DOMAIN
    grid = Grid(t_max=t_max, t_num=t_num, z_max=z_max, z_num=z_num)
    # ... CUSTOM PROPAGATION MODEL
    model = CustomModelPCF(w=grid.w)
    # ... PROPAGATION ALGORITHM
    solver = IFM_RK4IP(model.Lw, model.Nw, user_action=model.claw)
    solver.set_initial_condition(grid.w, AS(E_0t_fun(grid.t)).w_rep)

    # -- RUN SIMULATION
    solver.propagate(z_range=z_max, n_steps=z_num, n_skip=z_skip)

    # -- SHOW RESULTS
    plot_evolution(solver.z,
                   grid.t,
                   solver.utz,
                   t_lim=(-500, 2200),
                   w_lim=(1., 4.))
Ejemplo n.º 2
0
def main():

    # -- INITIALIZATION STAGE
    # ... DEFINE SIMULATION PARAMETERS
    t_max = 3000.       # (fs)
    t_num = 2**14       # (-)
    z_max = 8.0e3       # (micron)
    z_num = 10000       # (-)
    z_skip = 10         # (-)
    n2 = 3.0e-8         # (micron^2/W)
    wS = 1.884          # (rad/fs)
    tS = 10.0           # (fs)
    NS = 10.            # (-)
    # ... PROPAGGATION CONSTANT
    beta_fun = define_beta_fun_NLPM750()
    pc = PropConst(beta_fun)
    # ... COMPUTATIONAL DOMAIN, MODEL, AND SOLVER 
    grid = Grid( t_max = t_max, t_num = t_num, z_max = z_max, z_num = z_num)
    model = FMAS_S_R(w=grid.w, beta_w=pc.beta(grid.w), n2 = n2)
    solver = IFM_RK4IP( model.Lw, model.Nw)

    # -- SET UP INITIAL CONDITION
    A0 = NS*np.sqrt(np.abs(pc.beta2(wS))*model.c0/wS/n2)/tS
    Eps_0w = AS(np.real(A0/np.cosh(grid.t/tS)*np.exp(1j*wS*grid.t))).w_rep
    solver.set_initial_condition( grid.w, Eps_0w)

    # -- PERFORM Z-PROPAGATION
    solver.propagate( z_range = z_max, n_steps = z_num, n_skip = z_skip)

    # -- SHOW RESULTS
    utz = change_reference_frame(solver.w, solver.z, solver.uwz, pc.vg(wS))
    plot_evolution( solver.z, grid.t, utz,
        t_lim = (-100,100), w_lim = (0.5,8.), DO_T_LOG = True)
Ejemplo n.º 3
0
def main():

    t_max = 2000.  # (fs)
    t_num = 2**14  # (-)
    z_max = 0.06e6  # (micron)
    z_num = 25000  # (-)
    z_skip = 50  # (-)
    chi = 1.0  # (micron^2/W)
    c0 = 0.29979  # (micron/fs)

    # -- PROPAGATION CONSTANT
    beta_fun = define_beta_fun()
    pc = PropConst(beta_fun)

    # -- INITIALIZE DATA-STRUCTURES AND ALGORITHMS
    grid = Grid(t_max=t_max, t_num=t_num, z_max=z_max, z_num=z_num)
    model = FMAS(w=grid.w, beta_w=beta_fun(grid.w), chi=chi)
    solver = IFM_RK4IP(model.Lw, model.Nw, user_action=model.claw)

    # -- PREPARE INITIAL CONDITION AND RUN SIMULATION
    w01, t01, A01 = 1.178, 30.0, 0.0248892  # (rad/fs), (fs), (sqrt(W))
    w02, t02, A02 = 2.909, 30.0, 0.0136676  # (rad/fs), (fs), (sqrt(W))
    A_0t_fun = lambda t, A0, t0, w0: np.real(A0 / np.cosh(t / t0) * np.exp(
        1j * w0 * t))
    E_0t = A_0t_fun(grid.t, A01, t01, w01) + A_0t_fun(grid.t, A02, t02, w02)
    solver.set_initial_condition(grid.w, AS(E_0t).w_rep)
    solver.propagate(z_range=z_max, n_steps=z_num, n_skip=z_skip)

    # -- SHOW RESULTS IN MOVING FRAME OF REFERENCE
    v0 = 0.0749641870819  # (micron/fs)
    utz = change_reference_frame(solver.w, solver.z, solver.uwz, v0)
    plot_evolution(solver.z, grid.t, utz, t_lim=(-100, 150), w_lim=(0.3, 3.8))
Ejemplo n.º 4
0
def main():

    t_max = 2000.           # (fs)
    t_num = 2**14           # (-)
    chi = 1.0               # (micron^2/W)  
    c0 = 0.29979            # (micron/fs)

    # -- PROPAGATION CONSTANT
    beta_fun = define_beta_fun()
    pc = PropConst(beta_fun)

    grid = Grid( t_max = t_max, t_num = t_num)
    model = FMAS(w=grid.w, beta_w = beta_fun(grid.w), chi = chi )
    solver = IFM_RK4IP( model.Lw, model.Nw, user_action = model.claw)

    # -- FUNDAMENTAL SOLITON INTITIAL CONDITION
    A_0t_fun = lambda t, A0, t0, w0: np.real(A0/np.cosh(t/t0)*np.exp(1j*w0*t))
    # ... FIRST SOLITON: PROPAGATE AND CLEAN-UP PRIOR TO COLLISION
    w01, t01, A01 = 1.2, 20.0,  0.0351187       # (rad/fs), (fs), (sqrt(W))
    z_max, z_num, z_skip = 0.06e6, 6000, 200    # (micron), (-), (-)
    A_0t_1 = A_0t_fun(grid.t, A01, t01, w01)
    solver.set_initial_condition( grid.w, AS(A_0t_1).w_rep)
    solver.propagate( z_range = z_max, n_steps = z_num, n_skip = z_skip)
    A_0t_1_f = np.real(
                 np.where(
                    np.logical_and(grid.t>-15., grid.t<273.0),
                    solver.utz[-1],
                    0j
                 )
               )
    solver.clear()

    # ... SECOND SOLITON: PROPAGATE AND CLEAN-UP PRIOR TO COLLISION
    w02, t02, A02 = 2.96750, 15.0, 0.0289073    # (rad/fs), (fs), (sqrt(W))
    z_max, z_num, z_skip = 0.06e6, 6000, 200    # (micron), (-), (-)
    A_0t_2 = A_0t_fun(grid.t-800., A02, t02, w02)
    solver.set_initial_condition( grid.w, AS(A_0t_2).w_rep)
    solver.propagate( z_range = z_max, n_steps = z_num, n_skip = z_skip)
    A_0t_2_f = np.real(
                 np.where(
                    np.logical_and(grid.t>435.0, grid.t<727.0),
                    solver.utz[-1],
                    0j
                 )
               )
    solver.clear()

    # -- LET CLEANED-UP SOLITONS COLLIDE
    z_max, z_num, z_skip = 0.22e6, 50000, 100   # (micron), (-), (-)
    solver.set_initial_condition( grid.w, AS( A_0t_1_f + A_0t_2 ).w_rep)
    solver.propagate( z_range = z_max, n_steps = z_num, n_skip = z_skip)

    # -- SHOW RESULTS IN MOVING FRAME OF REFERENCE
    v0 = 0.0749879876745 # (micron/fs)
    utz = change_reference_frame(solver.w, solver.z, solver.uwz, v0)
    plot_evolution( solver.z, grid.t, utz,
        t_lim = (-1400,1400), w_lim = (0.3,3.8), DO_T_LOG=False)
Ejemplo n.º 5
0
def main():

    # -- DEFINE SIMULATION PARAMETERS
    # ... COMPUTATIONAL DOMAIN
    t_max = 4000.  # (fs)
    t_num = 2**14  # (-)
    z_max = 4.0e6  # (micron)
    z_num = 50000  # (-)
    z_skip = 100  # (-)
    n2 = 3.0e-8  # (micron^2/W)

    beta_fun = define_beta_fun_ESM()
    pc = PropConst(beta_fun)

    # -- INITIALIZATION STAGE
    grid = Grid(t_max=t_max, t_num=t_num, z_max=z_max, z_num=z_num)
    model = FMAS_S(w=grid.w, beta_w=pc.beta(grid.w), n2=n2)
    solver = IFM_RK4IP(model.Lw, model.Nw, user_action=model.claw)

    # -- SET UP INITIAL CONDITION
    t = grid.t
    # ... FUNDAMENTAL NSE SOLITON
    w0_S, t0_S = 1.5, 20.  # (rad/fs), (fs)
    A0 = np.sqrt(abs(pc.beta2(w0_S)) * model.c0 / w0_S / n2) / t0_S
    A0_S = A0 / np.cosh(t / t0_S) * np.exp(1j * w0_S * t)
    # ... 1ST DISPERSIVE WAVE; UNITS (rad/fs), (fs), (fs), (-)
    w0_DW1, t0_DW1, t_off1, s1 = 2.06, 60., -600., 0.35
    A0_DW1 = s1 * A0 / np.cosh((t - t_off1) / t0_DW1) * np.exp(1j * w0_DW1 * t)
    # ... 2ND DISPERSIVE WAVE; UNITS (rad/fs), (fs), (fs), (-)
    w0_DW2, t0_DW2, t_off2, s2 = 2.05, 60., -1200., 0.35
    A0_DW2 = s2 * A0 / np.cosh((t - t_off2) / t0_DW2) * np.exp(1j * w0_DW2 * t)
    # ... 3RD DISPERSIVE WAVE; UNITS (rad/fs), (fs), (fs), (-)
    w0_DW3, t0_DW3, t_off3, s3 = 2.04, 60., -1800., 0.35
    A0_DW3 = s3 * A0 / np.cosh((t - t_off3) / t0_DW3) * np.exp(1j * w0_DW3 * t)
    # ... ANALYTIC SIGNAL OF FULL ININITIAL CONDITION
    Eps_0w = AS(np.real(A0_S + A0_DW1 + A0_DW2 + A0_DW3)).w_rep

    solver.set_initial_condition(grid.w, Eps_0w)
    solver.propagate(z_range=z_max, n_steps=z_num, n_skip=z_skip)

    # -- SHOW RESULTS
    v0 = pc.vg(w0_S)
    utz = change_reference_frame(solver.w, solver.z, solver.uwz, v0)
    plot_evolution(solver.z,
                   grid.t,
                   utz,
                   t_lim=(-4000, 1000),
                   w_lim=(1.1, 2.4))
Ejemplo n.º 6
0
def main():
    # -- DEFINE SIMULATION PARAMETERS
    # ... COMPUTATIONAL DOMAIN
    t_max = 3500.  # (fs)
    t_num = 2**14  # (-)
    z_max = 0.16 * 1e6  # (micron)
    z_num = 4000  # (-)
    z_skip = 10  # (-)
    # ... INITIAL CONDITION
    P0 = 1e4  # (W)
    t0 = 28.4  # (fs)
    w0 = 2.2559  # (rad/fs)
    E_0t_fun = lambda t: np.real(
        np.sqrt(P0) / np.cosh(t / t0) * np.exp(-1j * w0 * t))

    # -- INITIALIZATION STAGE
    # ... COMPUTATIONAL DOMAIN
    grid = Grid(t_max=t_max, t_num=t_num, z_max=z_max, z_num=z_num)
    z = grid.z
    print(z[1] - z[0])
    exit()
    # ... CUSTOM PROPAGATION MODEL
    model = CustomModelPCF(w=grid.w)
    # ... PROPAGATION ALGORITHM
    solver = IFM_RK4IP(model.Lw, model.Nw, user_action=model.claw)
    solver.set_initial_condition(grid.w, AS(E_0t_fun(grid.t)).w_rep)

    # -- RUN SIMULATION
    solver.propagate(z_range=z_max, n_steps=z_num, n_skip=z_skip)

    res = {
        "dz_integration": solver.dz_,
        "t": grid.t,
        "z": solver.z,
        "w": solver.w,
        "utz": solver.utz,
        "Cp": solver.ua_vals
    }

    save_h5('res_IFM_SC_Nz%d.h5' % (z_num), **res)

    # -- SHOW RESULTS
    plot_evolution(solver.z,
                   grid.t,
                   solver.utz,
                   t_lim=(-500, 2200),
                   w_lim=(1., 4.),
                   DO_T_LOG=False)
Ejemplo n.º 7
0
def main():

    # -- INITIALIZATION STAGE
    # ... DEFINE SIMULATION PARAMETERS
    t_max = 3500. / 2  # (fs)
    t_num = 2**14  # (-)
    z_max = 50.0e3  # (micron)
    z_num = 100000  # (-)
    z_skip = 100  # (-)
    c0 = 0.29979  # (micron/fs)
    n2 = 1.  # (micron^2/W) FICTITIOUS VALUE ONLY
    wS = 2.32548  # (rad/fs)
    tS = 50.0  # (fs)
    NS = 3.54  # (-)
    # ... PROPAGGATION CONSTANT
    beta_fun = define_beta_fun_fluoride_glass_AD2010()
    pc = PropConst(beta_fun)
    chi = (8. / 3) * pc.beta(wS) * c0 / wS * n2

    # ... COMPUTATIONAL DOMAIN, MODEL, AND SOLVER
    grid = Grid(t_max=t_max, t_num=t_num, z_max=z_max, z_num=z_num)
    model = BMCF(w=grid.w, beta_w=pc.beta(grid.w), chi=chi)
    solver = IFM_RK4IP(model.Lw, model.Nw)

    # -- SET UP INITIAL CONDITION
    LD = tS * tS / np.abs(pc.beta2(wS))
    A0 = NS * np.sqrt(8 * c0 / wS / n2 / LD)
    Eps_0w = AS(np.real(A0 / np.cosh(grid.t / tS) *
                        np.exp(1j * wS * grid.t))).w_rep
    solver.set_initial_condition(grid.w, Eps_0w)

    # -- PERFORM Z-PROPAGATION
    solver.propagate(z_range=z_max, n_steps=z_num, n_skip=z_skip)

    # -- SHOW RESULTS
    utz = change_reference_frame(solver.w, solver.z, solver.uwz, pc.vg(wS))
    plot_evolution(solver.z,
                   grid.t,
                   utz,
                   t_lim=(-500, 500),
                   w_lim=(-10., 10.),
                   DO_T_LOG=True,
                   ratio_Iw=1e-15)
Ejemplo n.º 8
0
def main():

    # -- DEFINE SIMULATION PARAMETERS
    # ... COMPUTATIONAL DOMAIN
    t_max = 2000.  # (fs)
    t_num = 2**13  # (-)
    z_max = 1.0e6  # (micron)
    z_num = 10000  # (-)
    z_skip = 10  # (-)
    n2 = 3.0e-8  # (micron^2/W)
    c0 = 0.29979  # (fs/micron)
    lam0 = 0.860  # (micron)
    w0_S = 2 * np.pi * c0 / lam0  # (rad/fs)
    t0_S = 20.0  # (fs)
    w0_DW = 2.95  # (rad/fs)
    t0_DW = 70.0  # (fs)
    t_off = -250.0  # (fs)
    sFac = 0.75  # (-)

    beta_fun = define_beta_fun_poly_NLPM750()
    pc = PropConst(beta_fun)

    # -- INITIALIZATION STAGE
    grid = Grid(t_max=t_max, t_num=t_num, z_max=z_max, z_num=z_num)
    model = FMAS_S_R(w=grid.w, beta_w=pc.beta(grid.w), n2=n2)
    solver = IFM_RK4IP(model.Lw, model.Nw, user_action=model.claw)

    # -- SET UP INITIAL CONDITION
    t = grid.t
    A0 = np.sqrt(abs(pc.beta2(w0_S)) * c0 / w0_S / n2) / t0_S
    A0_S = A0 / np.cosh(t / t0_S) * np.exp(1j * w0_S * t)
    A0_DW = sFac * A0 / np.cosh((t - t_off) / t0_DW) * np.exp(1j * w0_DW * t)
    Eps_0w = AS(np.real(A0_S + A0_DW)).w_rep
    solver.set_initial_condition(grid.w, Eps_0w)
    solver.propagate(z_range=z_max, n_steps=z_num, n_skip=z_skip)

    # -- SHOW RESULTS
    utz = change_reference_frame(solver.w, solver.z, solver.uwz, pc.vg(w0_S))
    plot_evolution(solver.z,
                   grid.t,
                   utz,
                   t_lim=(-1200, 1200),
                   w_lim=(1.8, 3.2))
Ejemplo n.º 9
0
def main():
    # -- DEFINE SIMULATION PARAMETERS
    # ... WAVEGUIDE PROPERTIES
    b2 = -1.0
    gamma = 1.
    # ... TEST PULSE PROPERTIES
    t0 = 1.  # soliton duration
    P0 = np.abs(b2) / t0 / t0 / gamma  # peak-intensity
    LD = t0 * t0 / np.abs(b2)  # dispersion length
    N_sol = 3  # soliton order
    # ... COMPUTATIONAL DOMAIN
    t_max = 30.
    t_num = 2**12
    z_max = 0.5 * np.pi * LD
    z_num = 1000
    z_skip = 2

    # -- INITIALIZATION STAGE
    # ... COMPUTATIONAL DOMAIN
    grid = Grid(t_max=t_max, t_num=t_num, z_max=z_max, z_num=z_num)
    # ... NSE MODEL
    model = NSE(grid.w, b2, gamma)
    # ... Z-PROPAGATION USING SYMMETRIC SPLIT-STEP FOURIER METHOD
    solver = SySSM(model.Lw, model.Nw)
    # ... INITIAL CONDITION
    u_0t = N_sol * np.sqrt(P0) / np.cosh(grid.t / t0)
    solver.set_initial_condition(grid.w, FT(u_0t))

    # -- RUN SIMULATION
    solver.propagate(z_range=z_max, n_steps=z_num, n_skip=z_skip)

    plot_evolution(solver.z,
                   grid.t,
                   solver.utz,
                   t_lim=(-4, 4),
                   w_lim=(-50, 50),
                   DO_T_LOG=False)
Ejemplo n.º 10
0
solver = IFM_RK4IP(model.Lw, model.Nw)
solver.set_initial_condition(grid.w, Eps_0w)

solver.propagate(
    z_range=0.35e6,  # (micron)
    n_steps=4000,  # (-)
    n_skip=10  # (-)
)

###############################################################################
# Finally, the :math:`z`-propagation characteristics of the interaction process
# can be obtained by

utz = change_reference_frame(solver.w, solver.z, solver.uwz, pc.vg(wS))
plot_evolution(solver.z, grid.t, utz, t_lim=(-3000, 2000), w_lim=(0.2, 3.3))

# sphinx_gallery_thumbnail_number = 2

###############################################################################
#
# References:
#    [1]  C. Agger, C. Petersen, S. Dupont, H. Steffensen, J. K. Lyngso, C. L.
#    Thomsen, J. Thogersen, S. R. Keiding, O. Bang, Supercontinuum generation
#    in ZBLAN fibers—detailed comparison between measurement and simulation, J.
#    Opt. Soc. Am. B 29 (2012) 635, https://doi.org/10.1364/JOSAB.29.000635.
#
#    [2] L. Liu, G. Qin, Q. Tian, D. Zhao, W. Qin, Numerical investigation of
#    mid-infrared supercontinuum generation up to 5 μm in single mode fluoride
#    fiber, Opt. Exp. 19 (2011) 10041, https://doi.org/10.1364/OE.19.010041.
#
Ejemplo n.º 11
0
# of sample points is chosen large enough to allow for a zero padding
# anti-aliasing technique without cropping important parts of the spectrum.

grid = Grid(t_max=34., t_num=2**12)
t, w = grid.t, grid.w
model = NSE(w, b2=-1., gamma=1.)
u_0t = 4. / np.cosh(t)

solver = SySSM(model.Lw, model.Nw)
solver.set_initial_condition(w, FT(u_0t))
solver.propagate(z_range=3 * np.pi / 2, n_steps=10000, n_skip=50)
z, utz = solver.z_, solver.utz

plot_evolution(solver.z,
               grid.t,
               solver.utz,
               t_lim=(-5, 5),
               w_lim=(-60, 60),
               DO_T_LOG=False)

###############################################################################
# **References:**
#
# .. [B2001] J.P. Boyd, Chebychev and Fourier Spectral Methods, Dover, New York (2001)
#
# .. [HCL2008] H. Holmas, D. Clamond, H.P. Langtangen, A pseudospectral Fourier
#            method for a 1D incompressible two-fluid model, Int. J. Numer.
#            Meth. Fluids 58 (2008) 639, https://doi.org/10.1002/fld.1772
#
# .. [FCGK2005] D. Fuctus, D. Clamond, J. Grue, O. Kristiansen, An efficient
#            model for three-dimensional surface wave simulations Part I: Free
#            space problems, J. Comp. Phys. 205 (2005) 665,
Ejemplo n.º 12
0
u0_t += u_exact(0.0, t - t_off) * np.exp(-1j * w0 * t)
solver.set_initial_condition(w, FT(u0_t))

# -- RUN SOLVER
solver.propagate(
    z_range=0.5 * np.pi * LD,  # propagation range
    n_steps=512,
    n_skip=2)

###############################################################################
# The figure below shows the propagation dynamics of the above initial
# condition:

plot_evolution(solver.z,
               grid.t,
               solver.utz,
               t_lim=(-30, 30),
               w_lim=(-50., 50.))

###############################################################################
# Below we prepare a figure showing the variation of the local relative error
# upon propagation (top figure), and the  decrease of the local stepsize in the
# vicinity of the soliton-soliton collision (bottom subfigure).
# In the top figure, the shaded region indicates the local goal error range.
# Aim of the LEM method is to keep the conservation quantity error within that
# range.

# sphinx_gallery_thumbnail_number = 2

import matplotlib as mpl
import matplotlib.pyplot as plt
Ejemplo n.º 13
0
solver.set_initial_condition(grid.w, Eps_0w)
solver.propagate(
    z_range=0.12e6,  # (micron)
    n_steps=2000,  # (-)
    n_skip=10  # (-)
)

###############################################################################
# Once the :math:`z`-propagation algorithm terminates we can perform a shift to
# a frame of reference in which the initial pulse is stationary, i.e. to a
# moving frame of reference with velocity :math:`v_0=v_g(\omega_0)`.  The
# evolution of the analytic signal can then be visualized using the function
# `plot_evolution` defined in module `tools`:

utz = change_reference_frame(solver.w, solver.z, solver.uwz, pc.vg(w0))
plot_evolution(solver.z, grid.t, utz, t_lim=(-200, 2500), w_lim=(0.6, 3.4))

###############################################################################
# This reproduces Fig. 1 of Ref. [1].
#
# Analytic signal spectrograms that show the time-frequency characteristics of
# the field can be constructed using the function `spectrogram` defined in
# module `tools`.  These spectrograms are computed by using a Gaussian function
# for localizing the analytic signal along the time-axis.  The root-mean-square
# (rms) width of this window-function needs to be chosen carefully, as
# demonstrated below. Consider, e.g., the propagation distance
# :math:`z=0.12~\mathrm{m}`, for which the analytic signal can be obtained as

z0_idx = np.argmin(np.abs(solver.z - 0.12e6))
Et = utz[z0_idx]
Ejemplo n.º 14
0
###############################################################################
# An example that shows how an adequate input file can be generated via python
# is shown under the link below:
#
# :ref:`sphx_glr_auto_tutorials_basics_ng_generate_infile.py`
#
# After the proapgation algorithm (specified in `input_file.h5`) terminates,
# a simple dictionary data structure with the following keys is available

print(res.keys())

###############################################################################
# A simple plot that shows the result of the simulation run can be produced
# using function `plot_evolution` implemented in module `tools`

from fmas.tools import plot_evolution
plot_evolution(res['z'],
               res['t'],
               res['u'],
               t_lim=(-500, 2200),
               w_lim=(1., 4.))

###############################################################################
# The results can be stored for later postprocessing using the function
# `save_h5` implemented in module `data_io`. It will generate a file
# `out_file.h5` with HDF5 format in the current working directory

from fmas.data_io import save_h5
save_h5('out_file.h5', **res)