diff --git a/demo/ChannelFlow.py b/demo/ChannelFlow.py index 1b01d9e3..46400ad4 100644 --- a/demo/ChannelFlow.py +++ b/demo/ChannelFlow.py @@ -62,7 +62,7 @@ def __init__(self, modsave=1e8, moderror=100, checkpoint=1000, - timestepper='PDEIRK3'): + timestepper='IMEXRK3'): self.nu = nu self.dt = dt self.conv = conv @@ -292,8 +292,9 @@ def prepare_step(self, rk): def assemble(self): for pde in self.pdes.values(): pde.assemble() - for pde in self.pdes1d.values(): - pde.assemble() + if comm.Get_rank() == 0: + for pde in self.pdes1d.values(): + pde.assemble() def solve(self, t=0, tstep=0, end_time=1000): self.assemble() diff --git a/demo/ChannelFlow2D.py b/demo/ChannelFlow2D.py index 4821e8bb..3b7a0e76 100644 --- a/demo/ChannelFlow2D.py +++ b/demo/ChannelFlow2D.py @@ -87,7 +87,7 @@ def __init__(self, self.TD = TensorProductSpace(comm, (self.D0, self.F1), collapse_fourier=False, modify_spaces_inplace=True) # Streamwise velocity self.TC = TensorProductSpace(comm, (self.C0, self.F1), collapse_fourier=False, modify_spaces_inplace=True) # No bc self.BD = VectorSpace([self.TB, self.TD]) # Velocity vector space - self.CD = VectorSpace(self.TD) # Convection vector space + self.CD = VectorSpace(self.TD) # Convection vector space self.CC = VectorSpace([self.TD, self.TC]) # Curl vector space # Padded space for dealiasing @@ -124,12 +124,12 @@ def __init__(self, data={'0': {'U': [self.u_]}}) # set up equations + #v = TestFunction(self.TB.get_testspace(kind='PG')) v = TestFunction(self.TB) - h = TestFunction(self.TD) # Chebyshev matrices are not sparse, so need a tailored solver. Legendre has simply 5 nonzero diagonals and can use generic solvers. sol1 = chebyshev.la.Biharmonic if self.B0.family() == 'chebyshev' else la.SolverGeneric1ND - sol2 = chebyshev.la.Helmholtz if self.B0.family() == 'chebyshev' else la.SolverGeneric1ND + #sol1 = la.SolverGeneric1ND self.pdes = { @@ -238,8 +238,9 @@ def prepare_step(self, rk): def assemble(self): for pde in self.pdes.values(): pde.assemble() - for pde in self.pdes1d.values(): - pde.assemble() + if comm.Get_rank() == 0: + for pde in self.pdes1d.values(): + pde.assemble() def solve(self, t=0, tstep=0, end_time=1000): self.assemble() @@ -250,7 +251,7 @@ def solve(self, t=0, tstep=0, end_time=1000): eq.compute_rhs(rk) for eq in self.pdes.values(): eq.solve_step(rk) - self.compute_vw(rk) + self.compute_v(rk) t += self.dt tstep += 1 self.update(t, tstep) diff --git a/demo/MKM_MicroPolar.py b/demo/MKM_MicroPolar.py index 7522a199..8b708bd0 100644 --- a/demo/MKM_MicroPolar.py +++ b/demo/MKM_MicroPolar.py @@ -23,7 +23,7 @@ def __init__(self, family='C', padding_factor=(1, 1.5, 1.5), checkpoint=1000, - timestepper='PDEIRK3', + timestepper='IMEXRK3', rand=1e-7): MicroPolar.__init__(self, N=N, domain=domain, Re=Re, J=J, m=m, NP=NP, dt=dt, conv=conv, modplot=modplot, modsave=modsave, moderror=moderror, filename=filename, family=family, @@ -282,7 +282,7 @@ def fromfile(self, filename="stats"): 'checkpoint': 1, 'sample_stats': 10, 'padding_factor': (1.5, 1.5, 1.5), - 'timestepper': 'PDEIRK3', # IMEXRK222, IMEXRK443 + 'timestepper': 'IMEXRK222', # IMEXRK222, IMEXRK443 } c = MKM(**d) t, tstep = c.initialize(from_checkpoint=False) diff --git a/demo/OrrSommerfeld.py b/demo/OrrSommerfeld.py index 5afcac39..78ee5310 100644 --- a/demo/OrrSommerfeld.py +++ b/demo/OrrSommerfeld.py @@ -29,11 +29,6 @@ def initialize(self, from_checkpoint=False): # This is the convection at t=0 self.e0 = 0.5*dx(ub[0]**2+(ub[1]-(1-self.X[0]**2))**2) self.acc = np.zeros(1) - self.convection() - for pde in self.pdes.values(): - pde.initialize() - for pde in self.pdes1d.values(): - pde.initialize() return 0, 0 def initOS(self, OS, eigvals, eigvectors, U, t=0.): @@ -63,7 +58,7 @@ def compute_error(self, t): def init_plots(self): self.ub = ub = self.u_.backward() self.im1 = 1 - if comm.Get_rank() == 0: + if comm.Get_rank() == 0 and comm.Get_size() == 1: plt.figure(1, figsize=(6, 3)) self.im1 = plt.contourf(self.X[1][:, :, 0], self.X[0][:, :, 0], ub[0, :, :, 0], 100) plt.colorbar(self.im1) @@ -84,7 +79,7 @@ def plot(self, t, tstep): self.init_plots() if tstep % self.modplot == 0 and self.modplot > 0: - if comm.Get_rank() == 0: + if comm.Get_rank() == 0 and comm.Get_size() == 1: ub = self.u_.backward(self.ub) X = self.X self.im1.axes.clear() diff --git a/demo/RayleighBenard2D.py b/demo/RayleighBenard2D.py index 11438667..d25e4511 100644 --- a/demo/RayleighBenard2D.py +++ b/demo/RayleighBenard2D.py @@ -2,6 +2,7 @@ from ChannelFlow2D import KMM import matplotlib.pyplot as plt import sympy + np.warnings.filterwarnings('ignore') # pylint: disable=attribute-defined-outside-init @@ -153,7 +154,7 @@ def plot(self, t, tstep): if tstep % self.modplot == 0 and self.modplot > 0: ub = self.u_.backward(self.ub) - Tb = self.T_.backward(self.Tb) + self.Tb = self.T_.backward(self.Tb) if comm.Get_rank() == 0: plt.figure(1) #self.im1.set_UVC(ub[1, ::4, ::4], ub[0, ::4, ::4]) @@ -162,7 +163,7 @@ def plot(self, t, tstep): plt.pause(1e-6) plt.figure(2) self.im2.axes.clear() - self.im2.axes.contourf(self.X[1][:, :], self.X[0][:, :], Tb[:, :], 100) + self.im2.axes.contourf(self.X[1][:, :], self.X[0][:, :], self.Tb[:, :], 100) self.im2.autoscale() plt.pause(1e-6) @@ -188,16 +189,16 @@ def solve(self, t=0, tstep=0, end_time=1000): if __name__ == '__main__': from time import time - N = (256, 512) + N = (64, 128) d = { 'N': N, 'Ra': 1000000., 'Pr': 0.7, - 'dt': 0.0025, + 'dt': 0.025, 'filename': f'RB_{N[0]}_{N[1]}', 'conv': 1, - 'modplot': 100, - 'moderror': 100, + 'modplot': 10, + 'moderror': 10, 'modsave': 100, #'bcT': (0.9+0.1*sp.sin(2*(y-tt)), 0), #'bcT': (0.9+0.1*sympy.sin(2*y), 0), @@ -205,11 +206,11 @@ def solve(self, t=0, tstep=0, end_time=1000): 'family': 'C', 'checkpoint': 100, #'padding_factor': 1, - 'timestepper': 'IMEXRK222' + 'timestepper': 'IMEXRK3' } c = RayleighBenard(**d) t, tstep = c.initialize(rand=0.001, from_checkpoint=False) t0 = time() - c.solve(t=t, tstep=tstep, end_time=100) + c.solve(t=t, tstep=tstep, end_time=15) print('Computing time %2.4f'%(time()-t0)) diff --git a/docs/demos/Functions/functions.do.txt b/docs/demos/Functions/functions.do.txt index 1f3c875b..480f35cb 100644 --- a/docs/demos/Functions/functions.do.txt +++ b/docs/demos/Functions/functions.do.txt @@ -337,8 +337,8 @@ for xj in X[0]: We may alternatively plot on a uniform mesh !bc pycod -X = T.local_mesh(broadcast=True, uniform=True) -plt.contourf(X[0], X[1], u.backward(kind='uniform')) +X = T.local_mesh(bcast=True, kind='uniform') +plt.contourf(X[0], X[1], u.backward(mesh='uniform')) !ec ===== Curvilinear coordinates ===== diff --git a/docs/demos/Integration/surfaceintegration.do.txt b/docs/demos/Integration/surfaceintegration.do.txt index 25df6ff6..98aa7d0f 100644 --- a/docs/demos/Integration/surfaceintegration.do.txt +++ b/docs/demos/Integration/surfaceintegration.do.txt @@ -138,7 +138,7 @@ spiral below, the result looks reasonable. !bc pycod import matplotlib.pyplot as plt fig = plt.figure(figsize=(4, 3)) -X = C.cartesian_mesh(uniform=True) +X = C.cartesian_mesh(kind='uniform') ax = fig.add_subplot(111, projection='3d') p = ax.plot(X[0], X[1], X[2], 'r') hx = ax.set_xticks(np.linspace(-1, 1, 5)) diff --git a/docs/demos/RayleighBenard/Makefile b/docs/demos/RayleighBenard/Makefile index 410e4695..4dfc22d5 100644 --- a/docs/demos/RayleighBenard/Makefile +++ b/docs/demos/RayleighBenard/Makefile @@ -22,6 +22,11 @@ ${name}.rst: ${name}.do.txt doconce format sphinx ${name} --sphinx_preserve_bib_keys doconce subst 'XXX' ' ' $(basename $@).rst +${name}.ipynb: ${name}.do.txt + doconce format ipynb $(basename $@).do.txt + #python add_metadata.py $(basename $@).ipynb + #jupyter nbconvert --inplace --execute ${basename $@}.ipynb + view: open ${name}.pdf & diff --git a/docs/demos/RayleighBenard/rayleighbenard.do.txt b/docs/demos/RayleighBenard/rayleighbenard.do.txt index 94152390..b10fef10 100644 --- a/docs/demos/RayleighBenard/rayleighbenard.do.txt +++ b/docs/demos/RayleighBenard/rayleighbenard.do.txt @@ -15,16 +15,13 @@ these Rayleigh-Benard cells in a 2D channel with two walls of different temperature in one direction, and periodicity in the other direction. The solver described runs with MPI without any further considerations required from the user. -Note that there is a more physically realistic 3D solver implemented within -"the spectralDNS project": "https://github.com/spectralDNS/spectralDNS/blob/master/spectralDNS/solvers/KMMRK3_RB.py". -To allow for some simple optimizations, the solver described in this demo has been implemented in a class in the -"RayleighBenardRk3.py": "https://github.com/spectralDNS/shenfun/blob/master/demo/RayleighBenardRK3.py" -module in the demo folder of shenfun. Below are two example solutions, where the first (movie) -has been run at a very high Rayleigh number (*Ra*), and the lower image with a low *Ra* (laminar). +Note that there is also a more physically realistic "3D solver": "https://github.com/spectralDNS/shenfun/blob/master/demo/RayleighBenard.py". +The solver described in this demo has been implemented in a class in the +"RayleighBenard2D.py": "https://github.com/spectralDNS/shenfun/blob/master/demo/RayleighBenard2D.py" +module in the demo folder of shenfun. Below is an example solution, which has been run at a very high +Rayleigh number (*Ra*). -FIGURE: [https://raw.githack.com/spectralDNS/spectralutilities/master/movies/RB_100x256_100k_fire.png, width=800] Temperature fluctuations in the Rayleigh Benard flow. The top and bottom walls are kept at different temperatures and this sets up the Rayleigh-Benard convection. The simulation is run at *Ra* =100,000, *Pr* =0.7 with 100 and 256 quadrature points in *x* and *y*-directions, respectively. label{fig:RB} - -FIGURE: [https://raw.githack.com/spectralDNS/spectralutilities/master/figures/RB_40x128_100_fire.png, width=800] Convection cells for a laminar flow. The simulation is run at *Ra* =100, *Pr* =0.7 with 40 and 128 quadrature points in *x* and *y*-directions, respectively. label{fig:RB_lam} +FIGURE: [https://raw.githack.com/spectralDNS/spectralutilities/master/movies/RB_256_512_movie_jet.png, width=800] Temperature fluctuations in the Rayleigh Benard flow. The top and bottom walls are kept at different temperatures and this sets up the Rayleigh-Benard convection. The simulation is run at *Ra* =1,000,000, *Pr* =0.7 with 256 and 512 quadrature points in *x* and *y*-directions, respectively. label{fig:RB} TOC: off @@ -45,7 +42,7 @@ The governing equations solved in domain $\Omega=[-1, 1]\times [0, 2\pi]$ are where $\bs{u}(x, y, t) (= u\bs{i} + v\bs{j})$ is the velocity vector, $p(x, y, t)$ is pressure, $T(x, y, t)$ is the temperature, and $\bs{i}$ and $\bs{j}$ are the unity vectors for the $x$ and $y$-directions, respectively. -The equations are complemented with boundary conditions $\bs{u}(\pm 1, y, t) = (0, 0), \bs{u}(x, 2 \pi, t) = \bs{u}(x, 0, t), T(1, y, t) = 1, T(-1, y, t) = 0, T(x, 2 \pi, t) = T(x, 0, t)$. +The equations are complemented with boundary conditions $\bs{u}(\pm 1, y, t) = (0, 0), \bs{u}(x, 2 \pi, t) = \bs{u}(x, 0, t), T(-1, y, t) = 1, T(1, y, t) = 0, T(x, 2 \pi, t) = T(x, 0, t)$. Note that these equations have been non-dimensionalized according to cite{pandey18}, using dimensionless Rayleigh number $Ra=g \alpha \Delta T h^3/(\nu \kappa)$ and Prandtl number $Pr=\nu/\kappa$. Here $g \bs{i}$ is the vector accelleration of gravity, $\Delta T$ is the temperature difference between @@ -224,7 +221,7 @@ Fourier coefficient 0, Eq. (ref{eq:v}) becomes !bt \begin{equation} -\frac{\partial v}{\partial t} + N_y = \sqrt{\frac{Pr}{Ra}} \nabla^2 v. label{eq:vx} +\frac{\partial v}{\partial t} + N_y = \sqrt{\frac{Pr}{Ra}} \frac{\partial^2 v}{\partial x^2}. label{eq:vx} \end{equation} !et @@ -276,8 +273,9 @@ To sum up, with the solution known at $t = t - \Delta t$, we solve ===== Temporal discretization ===== -The governing equations are integrated in time using a semi-implicit third order Runge Kutta method. -This method applies to any generic equation +The governing equations are integrated in time using any one of the time steppers available in +shenfun. There are several possible IMEX Runge Kutta methods, see "integrators.py" : "https://github.com/spectralDNS/shenfun/blob/master/shenfun/utilities/integrators.py". +The time steppers are used for any generic equation !bt \begin{equation} @@ -285,76 +283,12 @@ This method applies to any generic equation \end{equation} !et where $\mathcal{N}$ and $\mathcal{L}$ represents the nonlinear and linear contributions, respectively. -With time discretized as $t_n = n \Delta t, \, n = 0, 1, 2, ...$, the -Runge Kutta method also subdivides each timestep into stages -$t_n^k = t_n + c_k \Delta t, \, k = (0, 1, .., N_s-1)$, where $N_s$ is -the number of stages. The third order Runge Kutta method implemented here uses three stages. -On one timestep the generic equation (ref{eq:genericpsi}) -is then integrated from stage $k$ to $k+1$ according to - -!bt -\begin{equation} - \psi^{k+1} = \psi^k + a_k \mathcal{N}^k + b_k \mathcal{N}^{k-1} + \frac{a_k+b_k}{2}\mathcal{L}(\psi^{k+1}+\psi^{k}), -\end{equation} -!et - -which should be rearranged with the unknowns on the left hand side and the -knowns on the right hand side - -!bt -\begin{equation} - \big(1-\frac{a_k+b_k}{2}\mathcal{L}\big)\psi^{k+1} = \big(1 + \frac{a_k+b_k}{2}\mathcal{L}\big)\psi^{k} + a_k \mathcal{N}^k + b_k \mathcal{N}^{k-1}. label{eq:rk3stages} -\end{equation} -!et - -For the three-stage third order Runge Kutta method the constants are given as - -% if FORMAT in ("ipynb",): - - ----- - - - - - - - - -
$a_n/\Delta t$ $b_n/\Delta t$ $c_n / \Delta t$
8/15 0 0
5/12 −17/60 8/15
3/4 −5/12 2/3
- -% else: - -|------------------------------------------------------------| -| $a_n/\Delta t$ | $b_n/\Delta t$ | $c_n / \Delta t$ | -|---------c----------|---------c---------|-------c-----------| -| 8/15 | 0 | 0 | -| 5/12 | −17/60 | 8/15 | -| 3/4 | −5/12 | 2/3 | -|------------------------------------------------------------| - -% endif - - -For the spectral Galerkin method used by `shenfun` the governing equation -is first put in a weak variational form. This will change the appearence of -Eq. (ref{eq:rk3stages}) slightly. If $\phi$ is a test function, $\psi^{k+1}$ -the trial function, and $\psi^{k}$ a known function, then the variational form -of (ref{eq:rk3stages}) is obtained by multiplying (ref{eq:rk3stages}) by $\phi$ and -integrating (with weights) over the domain - -!bt -\begin{equation} - \Big < (1-\frac{a_k+b_k}{2}\mathcal{L})\psi^{k+1}, \phi \Big > _w = \Big < (1 + \frac{a_k+b_k}{2}\mathcal{L})\psi^{k}, \phi\Big > _w + \Big < a_k \mathcal{N}^k + b_k \mathcal{N}^{k-1}, \phi \Big > _w. label{eq:rk3stagesvar} -\end{equation} -!et +The timesteppers are provided with $\psi, \mathcal{L}$ and $\mathcal{N}$, and possibly some tailored +linear algebra solvers, and solvers are then further assembled under the hood. -Equation (ref{eq:rk3stagesvar}) is the variational form implemented by `shenfun` for the -time dependent equations. +All the timesteppers split one time step into one or several stages. +The classes $cls{('IMEXRK222')}, $cls{('IMEXRK3')} and $cls{('IMEXRK443')} +have 2, 3 and 4 steps, respectively, and the cost is proportional. ===== Implementation ===== @@ -368,12 +302,12 @@ but the former is known to be faster due to the existence of fast transforms. !bc pycod from shenfun import * -N, M = 100, 256 +N, M = 64, 128 family = 'Chebyshev' VB = FunctionSpace(N, family, bc=(0, 0, 0, 0)) VD = FunctionSpace(N, family, bc=(0, 0)) VW = FunctionSpace(N, family) -VT = FunctionSpace(N, family, bc=(0, 1)) +VT = FunctionSpace(N, family, bc=(1, 0)) VF = FunctionSpace(M, 'F', dtype='d') !ec @@ -386,9 +320,11 @@ W_WF = TensorProductSpace(comm, (VW, VF)) # No bc W_TF = TensorProductSpace(comm, (VT, VF)) # Temperature BD = VectorSpace([W_BF, W_DF]) # Velocity vector DD = VectorSpace([W_DF, W_DF]) # Convection vector +W_DFp = W_DF.get_dealiased(padding_factor=1.5) +BDp = BD.get_dealiased(padding_factor=1.5) !ec -Here the last two lines create mixed tensor product spaces by the +Here the `VectorSpae` create mixed tensor product spaces by the Cartesian products `BD = W_BF` $\times$ `W_DF` and `DD = W_DF` $\times$ `W_DF`. These mixed space will be used to hold the velocity and convection vectors, but we will not solve the equations in a coupled manner and continue in the @@ -398,162 +334,132 @@ We also need containers for the computed solutions. These are created as !bc pycod u_ = Function(BD) # Velocity vector, two components -u_1 = Function(BD) # Velocity vector, previous step T_ = Function(W_TF) # Temperature -T_1 = Function(W_TF) # Temperature, previous step H_ = Function(DD) # Convection vector -H_1 = Function(DD) # Convection vector previous stage - -# Need a container for the computed right hand side vector -rhs_u = Function(DD).v -rhs_T = Function(DD).v +uT_ = Function(BD) # u times T !ec -In the final solver we will also use bases for dealiasing the nonlinear term, -but we do not add that level of complexity here. - === Wall-normal velocity equation === -We implement Eq. (ref{eq:rb:u2}) using the three-stage Runge Kutta equation (ref{eq:rk3stagesvar}). +We implement Eq. (ref{eq:rb:u2}) using a generic time stepper. To this end we first need to declare some test- and trial functions, as well as -some model constants +some model constants and the length of the time step. We store the +PDE time stepper in a dictionary called `pdes` just for convenience: !bc pycod -u = TrialFunction(W_BF) -v = TestFunction(W_BF) -a = (8./15., 5./12., 3./4.) -b = (0.0, -17./60., -5./12.) -c = (0., 8./15., 2./3., 1) # Specify viscosity and time step size using dimensionless Ra and Pr -Ra = 10000 +Ra = 1000000 Pr = 0.7 nu = np.sqrt(Pr/Ra) kappa = 1./np.sqrt(Pr*Ra) -dt = 0.1 +dt = 0.025 -# Get one solver for each stage of the RK3 -solver = [] -for rk in range(3): - mats = inner(div(grad(u)) - ((a[rk]+b[rk])*nu*dt/2.)*div(grad(div(grad(u)))), v) - solver.append(chebyshev.la.Biharmonic(mats)) -!ec +# Choose timestepper and create instance of class -Notice the one-to-one resemblance with the left hand side of (ref{eq:rk3stagesvar}), where $\psi^{k+1}$ -now has been replaced by $\nabla^2 u$ (or `div(grad(u))`) from Eq. (ref{eq:rb:u2}). -For each stage we assemble a list of tensor product matrices `mats`, and in `chebyshev.la` -there is available a very fast direct solver for exactly this type of (biharmonic) -matrices. The solver is created with `chebyshev.la.Biharmonic(mats)`, and here -the necessary LU-decomposition is carried out for later use and reuse on each time step. +PDE = IMEXRK3 # IMEX222, IMEXRK443 -The right hand side depends on the solution on the previous stage, and the -convection on two previous stages. The linear part (first term on right hand side of (ref{eq:rk3stages})) -can be assembled as +v = TestFunction(W_BF) # The space we're solving for u in + +pdes = { + 'u': PDE(v, # test function + div(grad(u_[0])), # u + lambda f: nu*div(grad(f)), # linear operator on u + [Dx(Dx(H_[1], 0, 1), 1, 1)-Dx(H_[0], 1, 2), Dx(T_, 1, 2)], + dt=dt, + solver=chebyshev.la.Biharmonic if family == 'Chebyshev' else la.SolverGeneric1ND, + latex=r"\frac{\partial \nabla^2 u}{\partial t} = \nu \nabla^4 u + \frac{\partial^2 N_y}{\partial x \partial y} - \frac{\partial^2 N_x}{\partial y^2}") +} +pdes['u'].assemble() -!bc pycod-t -inner(div(grad(u_[0])) + ((a[rk]+b[rk])*nu*dt/2.)*div(grad(div(grad(u_[0])))), v) !ec -The remaining parts $\frac{\partial^2 H_y}{\partial x \partial y} - \frac{\partial^2 H_x}{\partial y\partial y} + \frac{\partial^2 T}{\partial y^2}$ -end up in the nonlinear $\mathcal{N}$. The nonlinear convection term $\bm{H}$ can be computed in many different ways. +Notice the one-to-one resemblance with (ref{eq:rb:u2}). + +The right hand side depends on the convection vector $\bm{H}$, which can be computed in many different ways. Here we will make use of the identity $(\bm{u} \cdot \nabla) \bm{u} = -\bm{u} \times (\nabla \times \bm{u}) + 0.5 \nabla\bm{u} \cdot \bm{u}$, where $0.5 \nabla \bm{u} \cdot \bm{u}$ can be added to the eliminated pressure and as such be neglected. Compute $\bm{H} = -\bm{u} \times (\nabla \times \bm{u})$ by first evaluating the velocity and the curl in real space. The curl is obtained by projection of $\nabla \times \bm{u}$ to the no-boundary-condition space `W_TF`, followed by a backward transform to real space. -The velocity is simply transformed backwards. - -!bnotice -If dealiasing is required, it should be used here to create padded backwards transforms of the curl and the velocity, -before computing the nonlinear term in real space. The nonlinear product should then be forward transformed with -truncation. To get a space for dealiasing, simply use, e.g., `W_BF.get_dealiased()`. -!enotice +The velocity is simply transformed backwards with padding. !bc pycod # Get a mask for setting Nyquist frequency to zero mask = W_DF.get_mask_nyquist() +Curl = Project(curl(u_), W_WF) # Instance used to compute curl def compute_convection(u, H): - curl = project(Dx(u[1], 0, 1) - Dx(u[0], 1, 1), W_TF).backward() - ub = u.backward() - H[0] = W_DF.forward(-curl*ub[1]) - H[1] = W_DF.forward(curl*ub[0]) + up = u.backward(padding_factor=1.5).v + curl = Curl().backward(padding_factor=1.5) + H[0] = W_DFp.forward(-curl*up[1]) + H[1] = W_DFp.forward(curl*up[0]) H.mask_nyquist(mask) return H !ec Note that the convection has a homogeneous Dirichlet boundary condition in the -non-periodic direction. With convection computed we can assemble $\mathcal{N}$ -and all of the right hand side, using the function `compute_rhs_u` +non-periodic direction. + +=== Streamwise velocity === + +The streamwise velocity is computed using Eq. (ref{eq:div3}) and (ref{eq:vx}). +The first part is done fastest by projecting $f=\frac{\partial u}{\partial x}$ +to the same Dirichlet space `W_DF` used by $v$. This is most efficiently +done by creating a class to do it !bc pycod +f = dudx = Project(Dx(u_[0], 0, 1), W_DF) +!ec -def compute_rhs_u(u, T, H, rhs, rk): - v = TestFunction(W_BF) - H = compute_convection(u, H) - rhs[1] = 0 - rhs[1] += inner(v, div(grad(u[0])) + ((a[rk]+b[rk])*nu*dt/2.)*div(grad(div(grad(u[0]))))) - w0 = inner(v, Dx(Dx(H[1], 0, 1), 1, 1) - Dx(H[0], 1, 2)) - w1 = inner(v, Dx(T, 1, 2)) - rhs[1] += a[rk]*dt*(w0+w1) - rhs[1] += b[rk]*dt*rhs[0] - rhs[0] = w0+w1 - rhs.mask_nyquist(mask) - return rhs +Since $f$ now is in the same space as the streamwise velocity, Eq. (ref{eq:div3}) +simplifies to +!bt +\begin{align} + \imath l \left(\phi_k^D, \phi_m^D \right)_w \hat{v}_{kl} + &= -\left( \phi_k^D, \phi_m^D \right)_w \hat{f}_{kl}, label{eq:fdiv} \\ + \hat{v}_{kl} &= \frac{\imath \hat{f}_{kl}}{ l}. +\end{align} +!et + +We thus compute $\hat{v}_{kl}$ for all $k$ and $l>0$ as + +!bc pycod +K = W_BF.local_wavenumbers(scaled=True) +K[1][0, 0] = 1 # to avoid division by zero. This component is computed later anyway. +u_[1] = 1j*dudx()/K[1] !ec -Note that we will only use `rhs` as a container, so it does not actually matter -which space it has here. We're using `.v` to only access the Numpy array view of the Function. -Also note that `rhs[1]` contains the right hand side computed at stage `k`, -whereas `rhs[0]` is used to remember the old value of the nonlinear part. -=== Streamwise velocity === +which leaves only $\hat{v}_{k0}$. For this we use (ref{eq:vx}) and get -The streamwise velocity is computed using Eq. (ref{eq:div3}) and (ref{eq:vx}). For efficiency we -can here preassemble both matrices seen in (ref{eq:div3}) and reuse them every -time the streamwise velocity is being computed. We will also need the -wavenumber $\bm{l}$, here retrived using `W_BF.local_wavenumbers(scaled=True)`. -For (ref{eq:vx}) we preassemble the required Helmholtz solvers, one for -each RK stage. +!bc pycod +v00 = Function(VD) +v0 = TestFunction(VD) +h1 = Function(VD) # convection equal to H_[1, :, 0] +pdes1d = { + 'v0': PDE(v0, + v00, + lambda f: nu*div(grad(f)), + -Expr(h1), + dt=dt, + solver=chebyshev.la.Helmholtz if family == 'Chebyshev' else la.Solver, + latex=r"\frac{\partial v}{\partial t} = \nu \frac{\partial^2 v}{\partial x^2} - N_y "), +} +pdes1d['v0'].assemble() +!ec + +A function that computes `v` for an integration stage `rk` is !bc pycod -# Assemble matrices and solvers for all stages -B_DD = inner(TestFunction(W_DF), TrialFunction(W_DF)) -C_DB = inner(TestFunction(W_DF), Dx(TrialFunction(W_BF), 0, 1)) -VD0 = FunctionSpace(N, family, bc=(0, 0)) -v0 = TestFunction(VD0) -u0 = TrialFunction(VD0) -solver0 = [] -for rk in range(3): - mats0 = inner(v0, 2./(nu*(a[rk]+b[rk])*dt)*u0 - div(grad(u0))) - solver0.append(chebyshev.la.Helmholtz(mats0)) - -# Allocate work arrays and variables -u00 = Function(VD0) -b0 = np.zeros((2,)+u00.shape) -w00 = np.zeros_like(u00) -dudx_hat = Function(W_DF) -K = W_BF.local_wavenumbers(scaled=True)[1] - -def compute_v(u, rk): - if comm.Get_rank() == 0: - u00[:] = u_[1, :, 0].real - dudx_hat = C_DB.matvec(u[0], dudx_hat) - with np.errstate(divide='ignore'): - dudx_hat = 1j * dudx_hat / K - u[1] = B_DD.solve(dudx_hat, u=u[1]) - - # Still have to compute for wavenumber = 0 - if comm.Get_rank() == 0: - b0[1] = inner(v0, 2./(nu*(a[rk]+b[rj])*dt)*Expr(u00) + div(grad(u00))) - w00 = inner(v0, H_[1, :, 0]) - b0[1] -= (2.*a/nu/(a[rk]+b[rk]))*w00 - b0[1] -= (2.*b/nu/(a[rk]+b[rk]))*b0[0] - u00 = solver0[rk](b0[1], u00) - u[1, :, 0] = u00 - b0[0] = w00 - return u +def compute_v(rk): + v00[:] = u_[1, :, 0].real + h1[:] = H_[1, :, 0].real + u_[1] = 1j*dudx()/K[1] + pdes1d['v0'].compute_rhs(rk) + u_[1, :, 0] = pdes1d['v0'].solve_step(rk) + !ec === Temperature === @@ -610,116 +516,68 @@ We find $\hat{T}_{N-2, l}$ and $\hat{T}_{N-1, l}$ using orthogonality. Multiply Using this approach it is easy to see that any inhomogeneous function $T_N(\pm 1, y, t)$ of $y$ and $t$ can be used for the boundary condition, and not just a constant. -To implement a non-constant Dirichlet boundary condition, the `FunctionSpace` function -can take any `sympy` function of `(y, t)`, for exampel by replacing the -creation of `VT` by - -!bc pycod -import sympy as sp -y, t = sp.symbols('y,t') -f = 0.9+0.1*sp.sin(2*(y))*sp.exp(-t) -VT = FunctionSpace(N, family, bc=(0, f)) -!ec - -For merely a constant `f` or a `y`-dependency, no further action is required. -However, a time-dependent approach requires the boundary values to be -updated each time step. To this end there is the function -`BoundaryValues.update_bcs_time`, used to update the boundary values to the new time. -Here we will assume a time-independent boundary condition, but the -final implementation will contain the time-dependent option. - -Due to the non-zero boundary conditions there are also a few additional -things to be aware of. Assembling the coefficient matrices will also -assemble the matrices for the two boundary test functions. That is, -for the 1D mass matrix with $u=\sum_{k=0}^{N-1}\hat{T}_k \phi^D_k $ and $v=\phi^D_m$, -we will have +However, we will not get into this here. +And luckily for us all this complexity with boundary conditions will be +taken care of under the hood by shenfun. -!bt -\begin{align} - \left(u, v \right)_w &= \left( \sum_{k=0}^{N-1} \hat{T}_k \phi^D_k(x), \phi^D_m \right)_w, \\ - &= \sum_{k=0}^{N-3} \left(\phi^D_k(x), \phi^D_m \right)_w \hat{T}_k + \sum_{k=N-2}^{N-1} \left( \phi^D_k(x), \phi^D_m \right)_w \hat{T}_k, -\end{align} -!et -where the first term on the right hand side is the regular mass matrix for a -homogeneous boundary condition, whereas the second term is due to the non-homogeneous. -Since $\hat{T}_{N-2}$ and $\hat{T}_{N-1}$ are known, the second term contributes to -the right hand side of a system of equations. All boundary matrices can be extracted -from the lists of tensor product matrices returned by `inner`. For -the temperature equation these boundary matrices are extracted using -`extract_bc_matrices` below. The regular solver is placed in the -`solverT` list, one for each stage of the RK3 solver. +A time stepper for the temperature equation is implemented as !bc pycod +uT_ = Function(BD) q = TestFunction(W_TF) -p = TrialFunction(W_TF) -solverT = [] -lhs_mat = [] -for rk in range(3): - matsT = inner(q, 2./(kappa*(a[rk]+b[rk])*dt)*p - div(grad(p))) - lhs_mat.append(extract_bc_matrices([matsT])) - solverT.append(chebyshev.la.Helmholtz(matsT)) +pdes['T'] = PDE(q, + T_, + lambda f: kappa*div(grad(f)), + -div(uT_), + dt=dt, + solver=chebyshev.la.Helmholtz if family == 'Chebyshev' else la.SolverGeneric1ND, + latex=r"\frac{\partial T}{\partial t} = \kappa \nabla^2 T - \nabla \cdot \vec{u}T") +pdes['T'].assemble() !ec -The boundary contribution to the right hand side is computed for each -stage as +The `uT_` term is computed with dealiasing as !bc pycod -w0 = Function(W_WF) -w0 = lhs_mat[rk][0].matvec(T_, w0) +def compute_uT(u_, T_, uT_): + up = u_.backward(padding_factor=1.5) + Tp = T_.backward(padding_factor=1.5) + uT_ = BDp.forward(up*Tp, uT_) + return uT_ !ec -The complete right hand side of the temperature equations can be computed as +Finally all that is left is to initialize the solution and +integrate it forward in time. !bc pycod -def compute_rhs_T(u, T, rhs, rk): - q = TestFunction(W_TF) - rhs[1] = inner(q, 2./(kappa*(a[rk]+b[rk])*dt)*Expr(T)+div(grad(T))) - rhs[1] -= lhs_mat[rk][0].matvec(T, w0) - ub = u.backward() - Tb = T.backward() - uT_ = BD.forward(ub*Tb) - w0[:] = 0 - w0 = inner(q, div(uT_), output_array=w0) - rhs[1] -= (2.*a/kappa/(a[rk]+b[rk]))*w0 - rhs[1] -= (2.*b/kappa/(a[rk]+b[rk]))*rhs[0] - rhs[0] = w0 - rhs.mask_nyquist(mask) - return rhs -!ec - -We now have all the pieces required to solve the Rayleigh Benard problem. -It only remains to perform an initialization and then create a solver -loop that integrates the solution forward in time. - -!bc pycod - +import matplotlib.pyplot as plt # initialization T_b = Array(W_TF) X = W_TF.local_mesh(True) -T_b[:] = 0.5*(1-X[0]) + 0.001*np.random.randn(*T_b.shape)*(1-X[0])*(1+X[0]) +#T_b[:] = 0.5*(1-X[0]) + 0.001*np.random.randn(*T_b.shape)*(1-X[0])*(1+X[0]) +T_b[:] = 0.5*(1-X[0]+0.25*np.sin(np.pi*X[0]))+0.001*np.random.randn(*T_b.shape)*(1-X[0])*(1+X[0]) T_ = T_b.forward(T_) T_.mask_nyquist(mask) -def solve(t=0, tstep=0, end_time=100): - while t < end_time-1e-8: - for rk in range(3): - rhs_u = compute_rhs_u(u_, T_, H_, rhs_u, rk) - u_[0] = solver[rk](rhs_u[1], u_[0]) - if comm.Get_rank() == 0: - u_[0, :, 0] = 0 - u_ = compute_v(u_, rk) - u_.mask_nyquist(mask) - rhs_T = compute_rhs_T(u_, T_, rhs_T, rk) - T_ = solverT[rk](rhs_T[1], T_) - T_.mask_nyquist(mask) - - t += dt - tstep += 1 +t = 0 +tstep = 0 +end_time = 15 +while t < end_time-1e-8: + for rk in range(PDE.steps()): + compute_convection(u_, H_) + compute_uT(u_, T_, uT_) + pdes['u'].compute_rhs(rk) + pdes['T'].compute_rhs(rk) + pdes['u'].solve_step(rk) + compute_v(rk) + pdes['T'].solve_step(rk) + t += dt + tstep += 1 +plt.contourf(X[1], X[0], T_.backward(), 100) +plt.show() !ec A complete solver implemented in a solver class can be found in -"RayleighBenardRk3.py":"https://github.com/spectralDNS/shenfun/blob/master/demo/RayleighBenardRK3.py", -where some of the terms discussed in this demo have been optimized some more for speed. +"RayleighBenard2D.py":"https://github.com/spectralDNS/shenfun/blob/master/demo/RayleighBenard2D.py". Note that in the final solver it is also possible to use a $(y, t)$-dependent boundary condition for the hot wall. And the solver can also be configured to store intermediate results to an `HDF5` format that later can be visualized in, e.g., Paraview. The movie in the diff --git a/docs/source/functions.ipynb b/docs/source/functions.ipynb index 983efa38..19219abb 100644 --- a/docs/source/functions.ipynb +++ b/docs/source/functions.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "afd59e16", + "id": "99e3a936", "metadata": { "editable": true }, @@ -21,7 +21,7 @@ }, { "cell_type": "markdown", - "id": "85a4311a", + "id": "96b89321", "metadata": { "editable": true }, @@ -34,7 +34,7 @@ }, { "cell_type": "markdown", - "id": "c2fe823a", + "id": "70653815", "metadata": { "editable": true }, @@ -46,7 +46,7 @@ }, { "cell_type": "markdown", - "id": "25dd5aba", + "id": "a5bf179c", "metadata": { "editable": true }, @@ -67,15 +67,15 @@ { "cell_type": "code", "execution_count": 1, - "id": "6b830a4a", + "id": "a7a1ca3d", "metadata": { "collapsed": false, "editable": true, "execution": { - "iopub.execute_input": "2022-05-24T10:31:35.190390Z", - "iopub.status.busy": "2022-05-24T10:31:35.189725Z", - "iopub.status.idle": "2022-05-24T10:31:36.214706Z", - "shell.execute_reply": "2022-05-24T10:31:36.215201Z" + "iopub.execute_input": "2022-06-23T10:35:44.424118Z", + "iopub.status.busy": "2022-06-23T10:35:44.423497Z", + "iopub.status.idle": "2022-06-23T10:35:45.468048Z", + "shell.execute_reply": "2022-06-23T10:35:45.468384Z" } }, "outputs": [], @@ -87,7 +87,7 @@ }, { "cell_type": "markdown", - "id": "39390ce4", + "id": "82811d65", "metadata": { "editable": true }, @@ -99,15 +99,15 @@ { "cell_type": "code", "execution_count": 2, - "id": "145fab57", + "id": "bb620d39", "metadata": { "collapsed": false, "editable": true, "execution": { - "iopub.execute_input": "2022-05-24T10:31:36.218656Z", - "iopub.status.busy": "2022-05-24T10:31:36.218139Z", - "iopub.status.idle": "2022-05-24T10:31:36.219840Z", - "shell.execute_reply": "2022-05-24T10:31:36.220219Z" + "iopub.execute_input": "2022-06-23T10:35:45.472102Z", + "iopub.status.busy": "2022-06-23T10:35:45.471580Z", + "iopub.status.idle": "2022-06-23T10:35:45.473353Z", + "shell.execute_reply": "2022-06-23T10:35:45.473881Z" } }, "outputs": [], @@ -117,7 +117,7 @@ }, { "cell_type": "markdown", - "id": "b7d0563c", + "id": "c79e140d", "metadata": { "editable": true }, @@ -130,15 +130,15 @@ { "cell_type": "code", "execution_count": 3, - "id": "49a60650", + "id": "ddd7c826", "metadata": { "collapsed": false, "editable": true, "execution": { - "iopub.execute_input": "2022-05-24T10:31:36.223787Z", - "iopub.status.busy": "2022-05-24T10:31:36.223235Z", - "iopub.status.idle": "2022-05-24T10:31:36.224886Z", - "shell.execute_reply": "2022-05-24T10:31:36.225313Z" + "iopub.execute_input": "2022-06-23T10:35:45.477608Z", + "iopub.status.busy": "2022-06-23T10:35:45.477075Z", + "iopub.status.idle": "2022-06-23T10:35:45.478739Z", + "shell.execute_reply": "2022-06-23T10:35:45.479056Z" } }, "outputs": [], @@ -148,7 +148,7 @@ }, { "cell_type": "markdown", - "id": "f6560266", + "id": "15f438a5", "metadata": { "editable": true }, @@ -159,7 +159,7 @@ }, { "cell_type": "markdown", - "id": "cd1c23f7", + "id": "075cee7e", "metadata": { "editable": true }, @@ -171,7 +171,7 @@ }, { "cell_type": "markdown", - "id": "0eee6f73", + "id": "322e152d", "metadata": { "editable": true }, @@ -187,15 +187,15 @@ { "cell_type": "code", "execution_count": 4, - "id": "3b31f1b6", + "id": "a0ea6d99", "metadata": { "collapsed": false, "editable": true, "execution": { - "iopub.execute_input": "2022-05-24T10:31:36.229381Z", - "iopub.status.busy": "2022-05-24T10:31:36.228839Z", - "iopub.status.idle": "2022-05-24T10:31:36.230650Z", - "shell.execute_reply": "2022-05-24T10:31:36.231021Z" + "iopub.execute_input": "2022-06-23T10:35:45.483145Z", + "iopub.status.busy": "2022-06-23T10:35:45.482521Z", + "iopub.status.idle": "2022-06-23T10:35:45.484243Z", + "shell.execute_reply": "2022-06-23T10:35:45.484559Z" } }, "outputs": [], @@ -206,7 +206,7 @@ }, { "cell_type": "markdown", - "id": "779a474f", + "id": "7b250c8e", "metadata": { "editable": true }, @@ -219,15 +219,15 @@ { "cell_type": "code", "execution_count": 5, - "id": "06f2e82a", + "id": "06647e12", "metadata": { "collapsed": false, "editable": true, "execution": { - "iopub.execute_input": "2022-05-24T10:31:36.236114Z", - "iopub.status.busy": "2022-05-24T10:31:36.235658Z", - "iopub.status.idle": "2022-05-24T10:31:36.244647Z", - "shell.execute_reply": "2022-05-24T10:31:36.244954Z" + "iopub.execute_input": "2022-06-23T10:35:45.490297Z", + "iopub.status.busy": "2022-06-23T10:35:45.489534Z", + "iopub.status.idle": "2022-06-23T10:35:45.498854Z", + "shell.execute_reply": "2022-06-23T10:35:45.499166Z" } }, "outputs": [ @@ -249,7 +249,7 @@ }, { "cell_type": "markdown", - "id": "a3aff91f", + "id": "0f6cb2cd", "metadata": { "editable": true }, @@ -264,7 +264,7 @@ }, { "cell_type": "markdown", - "id": "1eb0bec3", + "id": "47a1a703", "metadata": { "editable": true }, @@ -276,7 +276,7 @@ }, { "cell_type": "markdown", - "id": "4d18bee5", + "id": "797aee93", "metadata": { "editable": true }, @@ -291,7 +291,7 @@ }, { "cell_type": "markdown", - "id": "10afac3d", + "id": "ce27dadf", "metadata": { "editable": true }, @@ -303,7 +303,7 @@ }, { "cell_type": "markdown", - "id": "555ee597", + "id": "83543998", "metadata": { "editable": true }, @@ -314,7 +314,7 @@ }, { "cell_type": "markdown", - "id": "cab5ff7a", + "id": "f9fd4c6e", "metadata": { "editable": true }, @@ -326,7 +326,7 @@ }, { "cell_type": "markdown", - "id": "808ed32d", + "id": "e5aab228", "metadata": { "editable": true }, @@ -337,7 +337,7 @@ }, { "cell_type": "markdown", - "id": "d7fda289", + "id": "addcca47", "metadata": { "editable": true }, @@ -349,7 +349,7 @@ }, { "cell_type": "markdown", - "id": "adadb27e", + "id": "bf752662", "metadata": { "editable": true }, @@ -359,7 +359,7 @@ }, { "cell_type": "markdown", - "id": "8b21ff28", + "id": "0dbc6971", "metadata": { "editable": true }, @@ -374,7 +374,7 @@ }, { "cell_type": "markdown", - "id": "29b69bfa", + "id": "15309a80", "metadata": { "editable": true }, @@ -384,7 +384,7 @@ }, { "cell_type": "markdown", - "id": "bf370beb", + "id": "20c931fb", "metadata": { "editable": true }, @@ -396,7 +396,7 @@ }, { "cell_type": "markdown", - "id": "a9a637b6", + "id": "7c780e8f", "metadata": { "editable": true }, @@ -407,7 +407,7 @@ }, { "cell_type": "markdown", - "id": "1fa6c1cb", + "id": "5be6add4", "metadata": { "editable": true }, @@ -419,7 +419,7 @@ }, { "cell_type": "markdown", - "id": "5e3d4f93", + "id": "7456d76f", "metadata": { "editable": true }, @@ -431,7 +431,7 @@ }, { "cell_type": "markdown", - "id": "4bf3d872", + "id": "c70f1707", "metadata": { "editable": true }, @@ -445,15 +445,15 @@ { "cell_type": "code", "execution_count": 6, - "id": "78c73830", + "id": "32e82ba8", "metadata": { "collapsed": false, "editable": true, "execution": { - "iopub.execute_input": "2022-05-24T10:31:36.249403Z", - "iopub.status.busy": "2022-05-24T10:31:36.248916Z", - "iopub.status.idle": "2022-05-24T10:31:36.250724Z", - "shell.execute_reply": "2022-05-24T10:31:36.251030Z" + "iopub.execute_input": "2022-06-23T10:35:45.504737Z", + "iopub.status.busy": "2022-06-23T10:35:45.504244Z", + "iopub.status.idle": "2022-06-23T10:35:45.505694Z", + "shell.execute_reply": "2022-06-23T10:35:45.506118Z" } }, "outputs": [], @@ -463,7 +463,7 @@ }, { "cell_type": "markdown", - "id": "b731f179", + "id": "9b1f67cf", "metadata": { "editable": true }, @@ -477,15 +477,15 @@ { "cell_type": "code", "execution_count": 7, - "id": "c855b959", + "id": "939aee1c", "metadata": { "collapsed": false, "editable": true, "execution": { - "iopub.execute_input": "2022-05-24T10:31:36.278375Z", - "iopub.status.busy": "2022-05-24T10:31:36.277871Z", - "iopub.status.idle": "2022-05-24T10:31:36.279829Z", - "shell.execute_reply": "2022-05-24T10:31:36.280137Z" + "iopub.execute_input": "2022-06-23T10:35:45.517668Z", + "iopub.status.busy": "2022-06-23T10:35:45.514706Z", + "iopub.status.idle": "2022-06-23T10:35:45.537248Z", + "shell.execute_reply": "2022-06-23T10:35:45.537770Z" } }, "outputs": [ @@ -504,7 +504,7 @@ }, { "cell_type": "markdown", - "id": "5c805e52", + "id": "d3e7da5a", "metadata": { "editable": true }, @@ -519,15 +519,15 @@ { "cell_type": "code", "execution_count": 8, - "id": "75f95c69", + "id": "495a46fa", "metadata": { "collapsed": false, "editable": true, "execution": { - "iopub.execute_input": "2022-05-24T10:31:36.283643Z", - "iopub.status.busy": "2022-05-24T10:31:36.282968Z", - "iopub.status.idle": "2022-05-24T10:31:36.284881Z", - "shell.execute_reply": "2022-05-24T10:31:36.285195Z" + "iopub.execute_input": "2022-06-23T10:35:45.541081Z", + "iopub.status.busy": "2022-06-23T10:35:45.540523Z", + "iopub.status.idle": "2022-06-23T10:35:45.542390Z", + "shell.execute_reply": "2022-06-23T10:35:45.542701Z" } }, "outputs": [ @@ -546,7 +546,7 @@ }, { "cell_type": "markdown", - "id": "18406533", + "id": "b4f9a1c3", "metadata": { "editable": true }, @@ -558,15 +558,15 @@ { "cell_type": "code", "execution_count": 9, - "id": "4c5979c9", + "id": "3dcce54b", "metadata": { "collapsed": false, "editable": true, "execution": { - "iopub.execute_input": "2022-05-24T10:31:36.292274Z", - "iopub.status.busy": "2022-05-24T10:31:36.291817Z", - "iopub.status.idle": "2022-05-24T10:31:36.323157Z", - "shell.execute_reply": "2022-05-24T10:31:36.323524Z" + "iopub.execute_input": "2022-06-23T10:35:45.553844Z", + "iopub.status.busy": "2022-06-23T10:35:45.548547Z", + "iopub.status.idle": "2022-06-23T10:35:45.579248Z", + "shell.execute_reply": "2022-06-23T10:35:45.579915Z" } }, "outputs": [ @@ -586,7 +586,7 @@ }, { "cell_type": "markdown", - "id": "90e80198", + "id": "14391a4a", "metadata": { "editable": true }, @@ -600,15 +600,15 @@ { "cell_type": "code", "execution_count": 10, - "id": "3c7a1dcd", + "id": "82dcbcf0", "metadata": { "collapsed": false, "editable": true, "execution": { - "iopub.execute_input": "2022-05-24T10:31:36.339169Z", - "iopub.status.busy": "2022-05-24T10:31:36.329630Z", - "iopub.status.idle": "2022-05-24T10:31:36.341343Z", - "shell.execute_reply": "2022-05-24T10:31:36.341665Z" + "iopub.execute_input": "2022-06-23T10:35:45.587694Z", + "iopub.status.busy": "2022-06-23T10:35:45.585647Z", + "iopub.status.idle": "2022-06-23T10:35:45.598898Z", + "shell.execute_reply": "2022-06-23T10:35:45.598565Z" } }, "outputs": [ @@ -627,7 +627,7 @@ }, { "cell_type": "markdown", - "id": "ae21505a", + "id": "ce5de2b2", "metadata": { "editable": true }, @@ -639,22 +639,22 @@ { "cell_type": "code", "execution_count": 11, - "id": "fb4d043f", + "id": "64f6e669", "metadata": { "collapsed": false, "editable": true, "execution": { - "iopub.execute_input": "2022-05-24T10:31:36.345457Z", - "iopub.status.busy": "2022-05-24T10:31:36.344951Z", - "iopub.status.idle": "2022-05-24T10:31:37.140504Z", - "shell.execute_reply": "2022-05-24T10:31:37.140889Z" + "iopub.execute_input": "2022-06-23T10:35:45.602883Z", + "iopub.status.busy": "2022-06-23T10:35:45.602429Z", + "iopub.status.idle": "2022-06-23T10:35:46.320558Z", + "shell.execute_reply": "2022-06-23T10:35:46.320943Z" } }, "outputs": [ { "data": { "text/plain": [ - "[]" + "[]" ] }, "execution_count": 11, @@ -684,7 +684,7 @@ }, { "cell_type": "markdown", - "id": "b652293f", + "id": "52875e71", "metadata": { "editable": true }, @@ -696,22 +696,22 @@ { "cell_type": "code", "execution_count": 12, - "id": "ca1e32a7", + "id": "f8c41f92", "metadata": { "collapsed": false, "editable": true, "execution": { - "iopub.execute_input": "2022-05-24T10:31:37.148013Z", - "iopub.status.busy": "2022-05-24T10:31:37.146292Z", - "iopub.status.idle": "2022-05-24T10:31:37.235196Z", - "shell.execute_reply": "2022-05-24T10:31:37.235601Z" + "iopub.execute_input": "2022-06-23T10:35:46.332737Z", + "iopub.status.busy": "2022-06-23T10:35:46.328087Z", + "iopub.status.idle": "2022-06-23T10:35:46.424304Z", + "shell.execute_reply": "2022-06-23T10:35:46.424619Z" } }, "outputs": [ { "data": { "text/plain": [ - "[]" + "[]" ] }, "execution_count": 12, @@ -738,7 +738,7 @@ }, { "cell_type": "markdown", - "id": "b218052a", + "id": "8c6a22d2", "metadata": { "editable": true }, @@ -750,22 +750,22 @@ { "cell_type": "code", "execution_count": 13, - "id": "9002d463", + "id": "8bcb2eb3", "metadata": { "collapsed": false, "editable": true, "execution": { - "iopub.execute_input": "2022-05-24T10:31:37.326344Z", - "iopub.status.busy": "2022-05-24T10:31:37.320415Z", - "iopub.status.idle": "2022-05-24T10:31:37.409087Z", - "shell.execute_reply": "2022-05-24T10:31:37.409414Z" + "iopub.execute_input": "2022-06-23T10:35:46.527548Z", + "iopub.status.busy": "2022-06-23T10:35:46.517808Z", + "iopub.status.idle": "2022-06-23T10:35:46.611921Z", + "shell.execute_reply": "2022-06-23T10:35:46.612258Z" } }, "outputs": [ { "data": { "text/plain": [ - "[]" + "[]" ] }, "execution_count": 13, @@ -793,7 +793,7 @@ }, { "cell_type": "markdown", - "id": "dfe7d1ee", + "id": "c822c690", "metadata": { "editable": true }, @@ -804,15 +804,15 @@ { "cell_type": "code", "execution_count": 14, - "id": "b17ad72e", + "id": "9ae901a7", "metadata": { "collapsed": false, "editable": true, "execution": { - "iopub.execute_input": "2022-05-24T10:31:37.415316Z", - "iopub.status.busy": "2022-05-24T10:31:37.414483Z", - "iopub.status.idle": "2022-05-24T10:31:37.417316Z", - "shell.execute_reply": "2022-05-24T10:31:37.417703Z" + "iopub.execute_input": "2022-06-23T10:35:46.617412Z", + "iopub.status.busy": "2022-06-23T10:35:46.616726Z", + "iopub.status.idle": "2022-06-23T10:35:46.619312Z", + "shell.execute_reply": "2022-06-23T10:35:46.620127Z" } }, "outputs": [ @@ -879,7 +879,7 @@ }, { "cell_type": "markdown", - "id": "9869836a", + "id": "f3227827", "metadata": { "editable": true }, @@ -895,15 +895,15 @@ { "cell_type": "code", "execution_count": 15, - "id": "7cd75596", + "id": "e0d8b2f4", "metadata": { "collapsed": false, "editable": true, "execution": { - "iopub.execute_input": "2022-05-24T10:31:37.421050Z", - "iopub.status.busy": "2022-05-24T10:31:37.420472Z", - "iopub.status.idle": "2022-05-24T10:31:37.422078Z", - "shell.execute_reply": "2022-05-24T10:31:37.422554Z" + "iopub.execute_input": "2022-06-23T10:35:46.623953Z", + "iopub.status.busy": "2022-06-23T10:35:46.623429Z", + "iopub.status.idle": "2022-06-23T10:35:46.624869Z", + "shell.execute_reply": "2022-06-23T10:35:46.625356Z" } }, "outputs": [], @@ -914,7 +914,7 @@ }, { "cell_type": "markdown", - "id": "8d0895dd", + "id": "d916d322", "metadata": { "editable": true }, @@ -930,15 +930,15 @@ { "cell_type": "code", "execution_count": 16, - "id": "feac0b6a", + "id": "f3f75df9", "metadata": { "collapsed": false, "editable": true, "execution": { - "iopub.execute_input": "2022-05-24T10:31:37.428036Z", - "iopub.status.busy": "2022-05-24T10:31:37.427576Z", - "iopub.status.idle": "2022-05-24T10:31:37.429340Z", - "shell.execute_reply": "2022-05-24T10:31:37.429661Z" + "iopub.execute_input": "2022-06-23T10:35:46.630659Z", + "iopub.status.busy": "2022-06-23T10:35:46.628188Z", + "iopub.status.idle": "2022-06-23T10:35:46.632229Z", + "shell.execute_reply": "2022-06-23T10:35:46.632554Z" } }, "outputs": [], @@ -948,7 +948,7 @@ }, { "cell_type": "markdown", - "id": "76879b78", + "id": "3340cfc6", "metadata": { "editable": true }, @@ -962,15 +962,15 @@ { "cell_type": "code", "execution_count": 17, - "id": "546ce4bd", + "id": "ea6ca467", "metadata": { "collapsed": false, "editable": true, "execution": { - "iopub.execute_input": "2022-05-24T10:31:37.433547Z", - "iopub.status.busy": "2022-05-24T10:31:37.433016Z", - "iopub.status.idle": "2022-05-24T10:31:37.434897Z", - "shell.execute_reply": "2022-05-24T10:31:37.435214Z" + "iopub.execute_input": "2022-06-23T10:35:46.636307Z", + "iopub.status.busy": "2022-06-23T10:35:46.635680Z", + "iopub.status.idle": "2022-06-23T10:35:46.638672Z", + "shell.execute_reply": "2022-06-23T10:35:46.638998Z" } }, "outputs": [ @@ -989,7 +989,7 @@ }, { "cell_type": "markdown", - "id": "70a6382c", + "id": "2c8742c0", "metadata": { "editable": true }, @@ -1011,15 +1011,15 @@ { "cell_type": "code", "execution_count": 18, - "id": "42296e52", + "id": "17d0499d", "metadata": { "collapsed": false, "editable": true, "execution": { - "iopub.execute_input": "2022-05-24T10:31:37.468726Z", - "iopub.status.busy": "2022-05-24T10:31:37.449212Z", - "iopub.status.idle": "2022-05-24T10:31:38.179689Z", - "shell.execute_reply": "2022-05-24T10:31:38.180169Z" + "iopub.execute_input": "2022-06-23T10:35:46.654569Z", + "iopub.status.busy": "2022-06-23T10:35:46.653554Z", + "iopub.status.idle": "2022-06-23T10:35:47.419318Z", + "shell.execute_reply": "2022-06-23T10:35:47.419635Z" } }, "outputs": [ @@ -1039,7 +1039,7 @@ }, { "cell_type": "markdown", - "id": "74762348", + "id": "4afedbec", "metadata": { "editable": true }, @@ -1056,7 +1056,7 @@ }, { "cell_type": "markdown", - "id": "59a662e6", + "id": "e479ab2f", "metadata": { "editable": true }, @@ -1071,15 +1071,15 @@ { "cell_type": "code", "execution_count": 19, - "id": "1147cffb", + "id": "c15fd8f1", "metadata": { "collapsed": false, "editable": true, "execution": { - "iopub.execute_input": "2022-05-24T10:31:38.197362Z", - "iopub.status.busy": "2022-05-24T10:31:38.196870Z", - "iopub.status.idle": "2022-05-24T10:31:38.198650Z", - "shell.execute_reply": "2022-05-24T10:31:38.198958Z" + "iopub.execute_input": "2022-06-23T10:35:47.439562Z", + "iopub.status.busy": "2022-06-23T10:35:47.438891Z", + "iopub.status.idle": "2022-06-23T10:35:47.440658Z", + "shell.execute_reply": "2022-06-23T10:35:47.441169Z" } }, "outputs": [], @@ -1092,7 +1092,7 @@ }, { "cell_type": "markdown", - "id": "6af64566", + "id": "b7f47048", "metadata": { "editable": true }, @@ -1103,7 +1103,7 @@ }, { "cell_type": "markdown", - "id": "364e64e6", + "id": "d5ba2576", "metadata": { "editable": true }, @@ -1115,7 +1115,7 @@ }, { "cell_type": "markdown", - "id": "767d3362", + "id": "0e7bb037", "metadata": { "editable": true }, @@ -1127,22 +1127,22 @@ { "cell_type": "code", "execution_count": 20, - "id": "a630a13d", + "id": "32f3a2c5", "metadata": { "collapsed": false, "editable": true, "execution": { - "iopub.execute_input": "2022-05-24T10:31:38.207457Z", - "iopub.status.busy": "2022-05-24T10:31:38.206456Z", - "iopub.status.idle": "2022-05-24T10:31:38.382043Z", - "shell.execute_reply": "2022-05-24T10:31:38.382357Z" + "iopub.execute_input": "2022-06-23T10:35:47.450716Z", + "iopub.status.busy": "2022-06-23T10:35:47.450204Z", + "iopub.status.idle": "2022-06-23T10:35:47.634539Z", + "shell.execute_reply": "2022-06-23T10:35:47.634943Z" } }, "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 20, @@ -1171,7 +1171,7 @@ }, { "cell_type": "markdown", - "id": "81ed1992", + "id": "710db17f", "metadata": { "editable": true }, @@ -1187,15 +1187,15 @@ { "cell_type": "code", "execution_count": 21, - "id": "8582ce6c", + "id": "b4dd2ce7", "metadata": { "collapsed": false, "editable": true, "execution": { - "iopub.execute_input": "2022-05-24T10:31:38.387596Z", - "iopub.status.busy": "2022-05-24T10:31:38.386339Z", - "iopub.status.idle": "2022-05-24T10:31:38.741580Z", - "shell.execute_reply": "2022-05-24T10:31:38.741910Z" + "iopub.execute_input": "2022-06-23T10:35:47.648566Z", + "iopub.status.busy": "2022-06-23T10:35:47.643912Z", + "iopub.status.idle": "2022-06-23T10:35:48.080827Z", + "shell.execute_reply": "2022-06-23T10:35:48.081179Z" } }, "outputs": [ @@ -1222,7 +1222,7 @@ }, { "cell_type": "markdown", - "id": "5d6fec18", + "id": "f4df7ac5", "metadata": { "editable": true }, @@ -1233,22 +1233,22 @@ { "cell_type": "code", "execution_count": 22, - "id": "b4994301", + "id": "2351fe5d", "metadata": { "collapsed": false, "editable": true, "execution": { - "iopub.execute_input": "2022-05-24T10:31:38.745718Z", - "iopub.status.busy": "2022-05-24T10:31:38.745223Z", - "iopub.status.idle": "2022-05-24T10:31:38.854026Z", - "shell.execute_reply": "2022-05-24T10:31:38.854341Z" + "iopub.execute_input": "2022-06-23T10:35:48.085491Z", + "iopub.status.busy": "2022-06-23T10:35:48.084645Z", + "iopub.status.idle": "2022-06-23T10:35:48.222866Z", + "shell.execute_reply": "2022-06-23T10:35:48.223210Z" } }, "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 22, @@ -1269,13 +1269,13 @@ } ], "source": [ - "X = T.local_mesh(broadcast=True, uniform=True)\n", - "plt.contourf(X[0], X[1], u.backward(kind={'chebyshev': 'uniform'}))" + "X = T.local_mesh(bcast=True, kind='uniform')\n", + "plt.contourf(X[0], X[1], u.backward(mesh='uniform'))" ] }, { "cell_type": "markdown", - "id": "ce29a9b4", + "id": "31815755", "metadata": { "editable": true }, @@ -1294,7 +1294,7 @@ }, { "cell_type": "markdown", - "id": "38e9bdb5", + "id": "8f006f8f", "metadata": { "editable": true }, @@ -1306,7 +1306,7 @@ }, { "cell_type": "markdown", - "id": "0fe75147", + "id": "4f933a7c", "metadata": { "editable": true }, @@ -1321,15 +1321,15 @@ { "cell_type": "code", "execution_count": 23, - "id": "ac06a0e9", + "id": "03e8746a", "metadata": { "collapsed": false, "editable": true, "execution": { - "iopub.execute_input": "2022-05-24T10:31:38.884596Z", - "iopub.status.busy": "2022-05-24T10:31:38.883904Z", - "iopub.status.idle": "2022-05-24T10:31:39.174451Z", - "shell.execute_reply": "2022-05-24T10:31:39.174823Z" + "iopub.execute_input": "2022-06-23T10:35:48.256631Z", + "iopub.status.busy": "2022-06-23T10:35:48.256073Z", + "iopub.status.idle": "2022-06-23T10:35:48.534069Z", + "shell.execute_reply": "2022-06-23T10:35:48.534356Z" } }, "outputs": [], @@ -1343,7 +1343,7 @@ }, { "cell_type": "markdown", - "id": "903b09fa", + "id": "2df3472e", "metadata": { "editable": true }, @@ -1357,15 +1357,15 @@ { "cell_type": "code", "execution_count": 24, - "id": "aa21e79c", + "id": "d1a9419f", "metadata": { "collapsed": false, "editable": true, "execution": { - "iopub.execute_input": "2022-05-24T10:31:39.189843Z", - "iopub.status.busy": "2022-05-24T10:31:39.184209Z", - "iopub.status.idle": "2022-05-24T10:31:39.194030Z", - "shell.execute_reply": "2022-05-24T10:31:39.194459Z" + "iopub.execute_input": "2022-06-23T10:35:48.549009Z", + "iopub.status.busy": "2022-06-23T10:35:48.547416Z", + "iopub.status.idle": "2022-06-23T10:35:48.550777Z", + "shell.execute_reply": "2022-06-23T10:35:48.551129Z" } }, "outputs": [], @@ -1375,7 +1375,7 @@ }, { "cell_type": "markdown", - "id": "f333723b", + "id": "edd9b137", "metadata": { "editable": true }, @@ -1386,22 +1386,22 @@ { "cell_type": "code", "execution_count": 25, - "id": "4d975997", + "id": "b6030f50", "metadata": { "collapsed": false, "editable": true, "execution": { - "iopub.execute_input": "2022-05-24T10:31:39.198338Z", - "iopub.status.busy": "2022-05-24T10:31:39.197809Z", - "iopub.status.idle": "2022-05-24T10:31:39.413421Z", - "shell.execute_reply": "2022-05-24T10:31:39.413729Z" + "iopub.execute_input": "2022-06-23T10:35:48.554924Z", + "iopub.status.busy": "2022-06-23T10:35:48.554471Z", + "iopub.status.idle": "2022-06-23T10:35:48.776839Z", + "shell.execute_reply": "2022-06-23T10:35:48.777194Z" } }, "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 25, @@ -1428,7 +1428,7 @@ }, { "cell_type": "markdown", - "id": "138a5be7", + "id": "07e9efaf", "metadata": { "editable": true }, @@ -1441,22 +1441,22 @@ { "cell_type": "code", "execution_count": 26, - "id": "8f2ad65a", + "id": "00f452c6", "metadata": { "collapsed": false, "editable": true, "execution": { - "iopub.execute_input": "2022-05-24T10:31:39.424079Z", - "iopub.status.busy": "2022-05-24T10:31:39.423492Z", - "iopub.status.idle": "2022-05-24T10:31:39.582176Z", - "shell.execute_reply": "2022-05-24T10:31:39.582502Z" + "iopub.execute_input": "2022-06-23T10:35:48.782787Z", + "iopub.status.busy": "2022-06-23T10:35:48.782200Z", + "iopub.status.idle": "2022-06-23T10:35:48.965678Z", + "shell.execute_reply": "2022-06-23T10:35:48.966164Z" } }, "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 26, @@ -1483,7 +1483,7 @@ }, { "cell_type": "markdown", - "id": "c565c8bb", + "id": "922883bc", "metadata": { "editable": true }, @@ -1499,22 +1499,22 @@ { "cell_type": "code", "execution_count": 27, - "id": "edd40500", + "id": "136208c6", "metadata": { "collapsed": false, "editable": true, "execution": { - "iopub.execute_input": "2022-05-24T10:31:39.586672Z", - "iopub.status.busy": "2022-05-24T10:31:39.586068Z", - "iopub.status.idle": "2022-05-24T10:31:39.751873Z", - "shell.execute_reply": "2022-05-24T10:31:39.752248Z" + "iopub.execute_input": "2022-06-23T10:35:48.976752Z", + "iopub.status.busy": "2022-06-23T10:35:48.972687Z", + "iopub.status.idle": "2022-06-23T10:35:49.144827Z", + "shell.execute_reply": "2022-06-23T10:35:49.145207Z" } }, "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 27, @@ -1542,7 +1542,7 @@ }, { "cell_type": "markdown", - "id": "c01f806d", + "id": "3c4694fd", "metadata": { "editable": true }, @@ -1557,15 +1557,15 @@ { "cell_type": "code", "execution_count": 28, - "id": "79d5bd73", + "id": "37b3f065", "metadata": { "collapsed": false, "editable": true, "execution": { - "iopub.execute_input": "2022-05-24T10:31:39.883061Z", - "iopub.status.busy": "2022-05-24T10:31:39.827166Z", - "iopub.status.idle": "2022-05-24T10:31:39.931128Z", - "shell.execute_reply": "2022-05-24T10:31:39.931494Z" + "iopub.execute_input": "2022-06-23T10:35:49.221142Z", + "iopub.status.busy": "2022-06-23T10:35:49.160282Z", + "iopub.status.idle": "2022-06-23T10:35:49.317550Z", + "shell.execute_reply": "2022-06-23T10:35:49.317870Z" } }, "outputs": [ @@ -1587,7 +1587,7 @@ }, { "cell_type": "markdown", - "id": "e4e5a1b2", + "id": "8f7e2f63", "metadata": { "editable": true }, diff --git a/docs/source/mixingbases.ipynb b/docs/source/mixingbases.ipynb index 5369601f..0f228bb9 100644 --- a/docs/source/mixingbases.ipynb +++ b/docs/source/mixingbases.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "015b8ebc", + "id": "7a32d1f2", "metadata": { "editable": true }, @@ -23,7 +23,7 @@ }, { "cell_type": "markdown", - "id": "a5d1ae4a", + "id": "fe704baf", "metadata": { "editable": true }, @@ -35,7 +35,7 @@ }, { "cell_type": "markdown", - "id": "0fac23ea", + "id": "8e00344e", "metadata": { "editable": true }, @@ -53,7 +53,7 @@ }, { "cell_type": "markdown", - "id": "cfcd86e2", + "id": "a640888f", "metadata": { "editable": true }, @@ -63,7 +63,7 @@ }, { "cell_type": "markdown", - "id": "fa709158", + "id": "6ff01d67", "metadata": { "editable": true }, @@ -81,7 +81,7 @@ }, { "cell_type": "markdown", - "id": "c69118b6", + "id": "ef85c04e", "metadata": { "editable": true }, @@ -91,7 +91,7 @@ }, { "cell_type": "markdown", - "id": "636dc537", + "id": "9b1e3fc7", "metadata": { "editable": true }, @@ -109,7 +109,7 @@ }, { "cell_type": "markdown", - "id": "f5a921b0", + "id": "22b6ae99", "metadata": { "editable": true }, @@ -122,7 +122,7 @@ }, { "cell_type": "markdown", - "id": "067d76af", + "id": "a71f07a9", "metadata": { "editable": true }, @@ -138,7 +138,7 @@ }, { "cell_type": "markdown", - "id": "238f72ec", + "id": "361016a1", "metadata": { "editable": true }, @@ -154,7 +154,7 @@ }, { "cell_type": "markdown", - "id": "c8e8a35c", + "id": "3830db68", "metadata": { "editable": true }, @@ -170,7 +170,7 @@ }, { "cell_type": "markdown", - "id": "954d083b", + "id": "55f69923", "metadata": { "editable": true }, @@ -181,7 +181,7 @@ }, { "cell_type": "markdown", - "id": "1491ccf2", + "id": "cad661f9", "metadata": { "editable": true }, @@ -194,15 +194,15 @@ { "cell_type": "code", "execution_count": 1, - "id": "22b23230", + "id": "5eec2ff4", "metadata": { "collapsed": false, "editable": true, "execution": { - "iopub.execute_input": "2022-04-22T11:54:18.556171Z", - "iopub.status.busy": "2022-04-22T11:54:18.555532Z", - "iopub.status.idle": "2022-04-22T11:54:19.598112Z", - "shell.execute_reply": "2022-04-22T11:54:19.598425Z" + "iopub.execute_input": "2022-06-23T10:36:30.529995Z", + "iopub.status.busy": "2022-06-23T10:36:30.529207Z", + "iopub.status.idle": "2022-06-23T10:36:31.569850Z", + "shell.execute_reply": "2022-06-23T10:36:31.570217Z" } }, "outputs": [], @@ -216,7 +216,7 @@ }, { "cell_type": "markdown", - "id": "dc0b7f04", + "id": "3dd177b5", "metadata": { "editable": true }, @@ -232,15 +232,15 @@ { "cell_type": "code", "execution_count": 2, - "id": "fb2b1d80", + "id": "1915a7ec", "metadata": { "collapsed": false, "editable": true, "execution": { - "iopub.execute_input": "2022-04-22T11:54:19.603485Z", - "iopub.status.busy": "2022-04-22T11:54:19.602841Z", - "iopub.status.idle": "2022-04-22T11:54:19.604503Z", - "shell.execute_reply": "2022-04-22T11:54:19.604823Z" + "iopub.execute_input": "2022-06-23T10:36:31.575386Z", + "iopub.status.busy": "2022-06-23T10:36:31.574788Z", + "iopub.status.idle": "2022-06-23T10:36:31.576279Z", + "shell.execute_reply": "2022-06-23T10:36:31.576594Z" } }, "outputs": [], @@ -253,7 +253,7 @@ }, { "cell_type": "markdown", - "id": "e4a3ce4a", + "id": "aa40103f", "metadata": { "editable": true }, @@ -264,7 +264,7 @@ }, { "cell_type": "markdown", - "id": "a108023b", + "id": "41539778", "metadata": { "editable": true }, @@ -282,7 +282,7 @@ }, { "cell_type": "markdown", - "id": "89a794be", + "id": "507165a0", "metadata": { "editable": true }, @@ -293,15 +293,15 @@ { "cell_type": "code", "execution_count": 3, - "id": "871293ed", + "id": "47c20313", "metadata": { "collapsed": false, "editable": true, "execution": { - "iopub.execute_input": "2022-04-22T11:54:19.612167Z", - "iopub.status.busy": "2022-04-22T11:54:19.611707Z", - "iopub.status.idle": "2022-04-22T11:54:19.613465Z", - "shell.execute_reply": "2022-04-22T11:54:19.613904Z" + "iopub.execute_input": "2022-06-23T10:36:31.583237Z", + "iopub.status.busy": "2022-06-23T10:36:31.582746Z", + "iopub.status.idle": "2022-06-23T10:36:31.584133Z", + "shell.execute_reply": "2022-06-23T10:36:31.584450Z" } }, "outputs": [], @@ -313,7 +313,7 @@ }, { "cell_type": "markdown", - "id": "f5c467c3", + "id": "fddda7cb", "metadata": { "editable": true }, @@ -324,15 +324,15 @@ { "cell_type": "code", "execution_count": 4, - "id": "02bc54f6", + "id": "254bd130", "metadata": { "collapsed": false, "editable": true, "execution": { - "iopub.execute_input": "2022-04-22T11:54:19.636094Z", - "iopub.status.busy": "2022-04-22T11:54:19.635185Z", - "iopub.status.idle": "2022-04-22T11:54:20.215920Z", - "shell.execute_reply": "2022-04-22T11:54:20.216261Z" + "iopub.execute_input": "2022-06-23T10:36:31.604862Z", + "iopub.status.busy": "2022-06-23T10:36:31.604384Z", + "iopub.status.idle": "2022-06-23T10:36:32.169622Z", + "shell.execute_reply": "2022-06-23T10:36:32.170019Z" } }, "outputs": [], @@ -343,7 +343,7 @@ }, { "cell_type": "markdown", - "id": "b366e500", + "id": "16950fdd", "metadata": { "editable": true }, @@ -354,15 +354,15 @@ { "cell_type": "code", "execution_count": 5, - "id": "f389c6a3", + "id": "56e30361", "metadata": { "collapsed": false, "editable": true, "execution": { - "iopub.execute_input": "2022-04-22T11:54:20.222164Z", - "iopub.status.busy": "2022-04-22T11:54:20.221566Z", - "iopub.status.idle": "2022-04-22T11:54:20.232279Z", - "shell.execute_reply": "2022-04-22T11:54:20.232596Z" + "iopub.execute_input": "2022-06-23T10:36:32.175261Z", + "iopub.status.busy": "2022-06-23T10:36:32.174617Z", + "iopub.status.idle": "2022-06-23T10:36:32.186783Z", + "shell.execute_reply": "2022-06-23T10:36:32.187105Z" } }, "outputs": [], @@ -377,7 +377,7 @@ }, { "cell_type": "markdown", - "id": "614bc841", + "id": "7e57e031", "metadata": { "editable": true }, @@ -388,15 +388,15 @@ { "cell_type": "code", "execution_count": 6, - "id": "eb7d6b10", + "id": "3636ab69", "metadata": { "collapsed": false, "editable": true, "execution": { - "iopub.execute_input": "2022-04-22T11:54:20.271526Z", - "iopub.status.busy": "2022-04-22T11:54:20.270952Z", - "iopub.status.idle": "2022-04-22T11:54:20.273382Z", - "shell.execute_reply": "2022-04-22T11:54:20.273688Z" + "iopub.execute_input": "2022-06-23T10:36:32.223730Z", + "iopub.status.busy": "2022-06-23T10:36:32.222627Z", + "iopub.status.idle": "2022-06-23T10:36:32.225627Z", + "shell.execute_reply": "2022-06-23T10:36:32.225940Z" } }, "outputs": [ @@ -404,7 +404,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Error = 0.4189038168769313\n" + "Error = 0.41890381687693135\n" ] } ], @@ -416,7 +416,7 @@ }, { "cell_type": "markdown", - "id": "1421c6a1", + "id": "c3d3dd7a", "metadata": { "editable": true }, @@ -432,15 +432,15 @@ { "cell_type": "code", "execution_count": 7, - "id": "221043ee", + "id": "ec3b0f6e", "metadata": { "collapsed": false, "editable": true, "execution": { - "iopub.execute_input": "2022-04-22T11:54:20.280404Z", - "iopub.status.busy": "2022-04-22T11:54:20.279948Z", - "iopub.status.idle": "2022-04-22T11:54:20.282585Z", - "shell.execute_reply": "2022-04-22T11:54:20.282906Z" + "iopub.execute_input": "2022-06-23T10:36:32.232948Z", + "iopub.status.busy": "2022-06-23T10:36:32.232482Z", + "iopub.status.idle": "2022-06-23T10:36:32.234022Z", + "shell.execute_reply": "2022-06-23T10:36:32.234333Z" } }, "outputs": [], @@ -499,7 +499,7 @@ }, { "cell_type": "markdown", - "id": "7a123076", + "id": "cd34256f", "metadata": { "editable": true }, @@ -512,15 +512,15 @@ { "cell_type": "code", "execution_count": 8, - "id": "ec1a8ef3", + "id": "808ab78a", "metadata": { "collapsed": false, "editable": true, "execution": { - "iopub.execute_input": "2022-04-22T11:54:20.405967Z", - "iopub.status.busy": "2022-04-22T11:54:20.364603Z", - "iopub.status.idle": "2022-04-22T11:54:20.738588Z", - "shell.execute_reply": "2022-04-22T11:54:20.738905Z" + "iopub.execute_input": "2022-06-23T10:36:32.364972Z", + "iopub.status.busy": "2022-06-23T10:36:32.322469Z", + "iopub.status.idle": "2022-06-23T10:36:32.657236Z", + "shell.execute_reply": "2022-06-23T10:36:32.657546Z" } }, "outputs": [ @@ -539,7 +539,7 @@ }, { "cell_type": "markdown", - "id": "bd4ae757", + "id": "f6f90737", "metadata": { "editable": true }, @@ -551,15 +551,15 @@ { "cell_type": "code", "execution_count": 9, - "id": "44cb43f8", + "id": "ad178f30", "metadata": { "collapsed": false, "editable": true, "execution": { - "iopub.execute_input": "2022-04-22T11:54:20.754124Z", - "iopub.status.busy": "2022-04-22T11:54:20.753546Z", - "iopub.status.idle": "2022-04-22T11:54:21.726772Z", - "shell.execute_reply": "2022-04-22T11:54:21.726417Z" + "iopub.execute_input": "2022-06-23T10:36:32.755554Z", + "iopub.status.busy": "2022-06-23T10:36:32.714860Z", + "iopub.status.idle": "2022-06-23T10:36:33.608028Z", + "shell.execute_reply": "2022-06-23T10:36:33.607638Z" } }, "outputs": [ @@ -1503,9 +1503,9 @@ } }, "text/html": [ - "